From dc74cb4a99173a2cacc9fcdafc44ca7c308acd5c Mon Sep 17 00:00:00 2001 From: Ian Keane Date: Mon, 15 Mar 2021 19:33:31 +0000 Subject: [PATCH] Remove fzf folder and sbcl folder Sbcl folder was always a bad idea, and it turns out that git ignores the fzf folder because it is an existing repository --- fzf/.fzf | 1 - sbcl/.quicklisp/asdf.lisp | 4516 ---- sbcl/.quicklisp/client-info.sexp | 28 - .../archives/alexandria-20191227-git.tgz | Bin 53842 -> 0 bytes .../archives/anaphora-20191007-git.tgz | Bin 6114 -> 0 bytes .../quicklisp/archives/babel-20191130-git.tgz | Bin 271183 -> 0 bytes .../archives/bordeaux-threads-v0.8.7.tgz | Bin 21951 -> 0 bytes .../dists/quicklisp/archives/cffi_0.20.1.tgz | Bin 260119 -> 0 bytes .../archives/cl-ansi-text-20150804-git.tgz | Bin 5876 -> 0 bytes .../archives/cl-colors-20180328-git.tgz | Bin 14566 -> 0 bytes .../archives/cl-emb-20190521-git.tgz | Bin 14557 -> 0 bytes .../archives/cl-fad-20190813-git.tgz | Bin 24659 -> 0 bytes .../archives/cl-ppcre-20190521-git.tgz | Bin 155009 -> 0 bytes .../archives/cl-project-20190521-git.tgz | Bin 5426 -> 0 bytes .../archives/croatoan-20191227-git.tgz | Bin 121276 -> 0 bytes .../archives/html-template-20171227-git.tgz | Bin 32376 -> 0 bytes .../archives/let-plus-20191130-git.tgz | Bin 11247 -> 0 bytes .../archives/local-time-20190710-git.tgz | Bin 282522 -> 0 bytes .../quicklisp/archives/prove-20171130-git.tgz | Bin 878875 -> 0 bytes .../quicklisp/archives/quickproject-1.4.1.tgz | Bin 6777 -> 0 bytes .../dists/quicklisp/archives/slime-v2.24.tgz | Bin 813432 -> 0 bytes .../archives/split-sequence-v2.0.0.tgz | Bin 10329 -> 0 bytes .../trivial-features-20190710-git.tgz | Bin 10765 -> 0 bytes .../trivial-gray-streams-20181018-git.tgz | Bin 8024 -> 0 bytes .../quicklisp/archives/usocket-0.8.3.tgz | Bin 85851 -> 0 bytes .../quicklisp/archives/vom-20160825-git.tgz | Bin 4286 -> 0 bytes .../dists/quicklisp/archives/yason-v0.7.8.tgz | Bin 27918 -> 0 bytes sbcl/.quicklisp/dists/quicklisp/distinfo.txt | 7 - sbcl/.quicklisp/dists/quicklisp/enabled.txt | 0 .../installed/releases/alexandria.txt | 1 - .../quicklisp/installed/releases/anaphora.txt | 1 - .../quicklisp/installed/releases/babel.txt | 1 - .../installed/releases/bordeaux-threads.txt | 1 - .../quicklisp/installed/releases/cffi.txt | 1 - .../installed/releases/cl-ansi-text.txt | 1 - .../installed/releases/cl-colors.txt | 1 - .../quicklisp/installed/releases/cl-emb.txt | 1 - .../quicklisp/installed/releases/cl-fad.txt | 1 - .../quicklisp/installed/releases/cl-ppcre.txt | 1 - .../installed/releases/cl-project.txt | 1 - .../quicklisp/installed/releases/croatoan.txt | 1 - .../installed/releases/html-template.txt | 1 - .../quicklisp/installed/releases/let-plus.txt | 1 - .../installed/releases/local-time.txt | 1 - .../quicklisp/installed/releases/prove.txt | 1 - .../installed/releases/quickproject.txt | 1 - .../quicklisp/installed/releases/slime.txt | 1 - .../installed/releases/split-sequence.txt | 1 - .../installed/releases/trivial-features.txt | 1 - .../releases/trivial-gray-streams.txt | 1 - .../quicklisp/installed/releases/usocket.txt | 1 - .../quicklisp/installed/releases/vom.txt | 1 - .../quicklisp/installed/releases/yason.txt | 1 - .../installed/systems/alexandria-tests.txt | 1 - .../installed/systems/alexandria.txt | 1 - .../quicklisp/installed/systems/anaphora.txt | 1 - .../installed/systems/babel-streams.txt | 1 - .../installed/systems/babel-tests.txt | 1 - .../quicklisp/installed/systems/babel.txt | 1 - .../installed/systems/bordeaux-threads.txt | 1 - .../installed/systems/cffi-examples.txt | 1 - .../installed/systems/cffi-grovel.txt | 1 - .../installed/systems/cffi-libffi.txt | 1 - .../installed/systems/cffi-tests.txt | 1 - .../installed/systems/cffi-toolchain.txt | 1 - .../installed/systems/cffi-uffi-compat.txt | 1 - .../quicklisp/installed/systems/cffi.txt | 1 - .../installed/systems/cl-ansi-text-test.txt | 1 - .../installed/systems/cl-ansi-text.txt | 1 - .../quicklisp/installed/systems/cl-colors.txt | 1 - .../quicklisp/installed/systems/cl-emb.txt | 1 - .../quicklisp/installed/systems/cl-fad.txt | 1 - .../systems/cl-postgres+local-time.txt | 1 - .../installed/systems/cl-ppcre-unicode.txt | 1 - .../quicklisp/installed/systems/cl-ppcre.txt | 1 - .../installed/systems/cl-project-test.txt | 1 - .../installed/systems/cl-project.txt | 1 - .../installed/systems/cl-test-more.txt | 1 - .../installed/systems/croatoan-test.txt | 1 - .../quicklisp/installed/systems/croatoan.txt | 1 - .../installed/systems/html-template.txt | 1 - .../quicklisp/installed/systems/let-plus.txt | 1 - .../installed/systems/local-time.txt | 1 - .../installed/systems/prove-asdf.txt | 1 - .../installed/systems/prove-test.txt | 1 - .../quicklisp/installed/systems/prove.txt | 1 - .../installed/systems/quickproject.txt | 1 - .../installed/systems/split-sequence.txt | 1 - .../quicklisp/installed/systems/swank.txt | 1 - .../systems/trivial-features-tests.txt | 1 - .../installed/systems/trivial-features.txt | 1 - .../systems/trivial-gray-streams-test.txt | 1 - .../systems/trivial-gray-streams.txt | 1 - .../installed/systems/usocket-server.txt | 1 - .../installed/systems/usocket-test.txt | 1 - .../quicklisp/installed/systems/usocket.txt | 1 - .../dists/quicklisp/installed/systems/vom.txt | 1 - .../quicklisp/installed/systems/yason.txt | 1 - .../.quicklisp/dists/quicklisp/preference.txt | 1 - sbcl/.quicklisp/dists/quicklisp/releases.cdb | Bin 515221 -> 0 bytes sbcl/.quicklisp/dists/quicklisp/releases.txt | 1831 -- .../software/alexandria-20191227-git/.boring | 13 - .../alexandria-20191227-git/.gitignore | 4 - .../software/alexandria-20191227-git/AUTHORS | 9 - .../software/alexandria-20191227-git/LICENCE | 37 - .../software/alexandria-20191227-git/README | 52 - .../alexandria-tests.asd | 11 - .../alexandria-20191227-git/alexandria.asd | 62 - .../alexandria-20191227-git/arrays.lisp | 18 - .../alexandria-20191227-git/binding.lisp | 90 - .../alexandria-20191227-git/conditions.lisp | 91 - .../alexandria-20191227-git/control-flow.lisp | 106 - .../alexandria-20191227-git/definitions.lisp | 37 - .../alexandria-20191227-git/doc/.gitignore | 3 - .../alexandria-20191227-git/doc/Makefile | 28 - .../doc/alexandria.texinfo | 277 - .../doc/docstrings.lisp | 881 - .../alexandria-20191227-git/features.lisp | 14 - .../alexandria-20191227-git/functions.lisp | 161 - .../alexandria-20191227-git/hash-tables.lisp | 101 - .../software/alexandria-20191227-git/io.lisp | 172 - .../alexandria-20191227-git/lists.lisp | 367 - .../alexandria-20191227-git/macros.lisp | 370 - .../alexandria-20191227-git/numbers.lisp | 295 - .../alexandria-20191227-git/package.lisp | 243 - .../alexandria-20191227-git/sequences.lisp | 555 - .../alexandria-20191227-git/strings.lisp | 6 - .../alexandria-20191227-git/symbols.lisp | 65 - .../alexandria-20191227-git/tests.lisp | 2047 -- .../alexandria-20191227-git/types.lisp | 137 - .../anaphora-20191007-git/.travis.yml | 34 - .../software/anaphora-20191007-git/LICENSE | 3 - .../software/anaphora-20191007-git/README.md | 50 - .../anaphora-20191007-git/anaphora.asd | 31 - .../anaphora-20191007-git/anaphora.lisp | 162 - .../software/anaphora-20191007-git/early.lisp | 20 - .../anaphora-20191007-git/packages.lisp | 90 - .../anaphora-20191007-git/symbolic.lisp | 54 - .../software/anaphora-20191007-git/tests.lisp | 427 - .../software/babel-20191130-git/.travis.yml | 31 - .../software/babel-20191130-git/COPYRIGHT | 20 - .../software/babel-20191130-git/HEADER | 27 - .../software/babel-20191130-git/NOTES | 34 - .../software/babel-20191130-git/README.md | 19 - .../babel-20191130-git/babel-streams.asd | 38 - .../babel-20191130-git/babel-tests.asd | 42 - .../software/babel-20191130-git/babel.asd | 59 - .../software/babel-20191130-git/doc/Makefile | 31 - .../babel-20191130-git/doc/babel.texinfo | 105 - .../babel-20191130-git/doc/license.texinfo | 20 - .../babel-20191130-git/doc/macros.texinfo | 27 - .../babel-20191130-git/scripts/release.lisp | 250 - .../babel-20191130-git/src/enc-ascii.lisp | 43 - .../babel-20191130-git/src/enc-cp1251.lisp | 119 - .../babel-20191130-git/src/enc-cp1252.lisp | 81 - .../src/enc-ebcdic-int.lisp | 49 - .../babel-20191130-git/src/enc-ebcdic.lisp | 71 - .../babel-20191130-git/src/enc-gbk.lisp | 184 - .../babel-20191130-git/src/enc-iso-8859.lisp | 1087 - .../babel-20191130-git/src/enc-jpn.lisp | 767 - .../babel-20191130-git/src/enc-koi8.lisp | 577 - .../babel-20191130-git/src/enc-unicode.lisp | 881 - .../babel-20191130-git/src/encodings.lisp | 503 - .../src/external-format.lisp | 88 - .../babel-20191130-git/src/gbk-map.lisp | 2226 -- .../babel-20191130-git/src/jpn-table.lisp | 17637 ---------------- .../babel-20191130-git/src/packages.lisp | 115 - .../src/sharp-backslash.lisp | 82 - .../babel-20191130-git/src/streams.lisp | 436 - .../babel-20191130-git/src/strings.lisp | 353 - .../babel-20191130-git/tests/ascii.txt | 212 - .../babel-20191130-git/tests/ascii.txt-utf8 | 212 - .../babel-20191130-git/tests/benchmarks.lisp | 43 - .../babel-20191130-git/tests/ebcdic-us.txt | 1 - .../tests/ebcdic-us.txt-utf8 | 212 - .../tests/gen-test-files.sh | 37 - .../babel-20191130-git/tests/streams.lisp | 45 - .../babel-20191130-git/tests/tests.lisp | 912 - .../tests/utf-16-with-le-bom.txt | Bin 15244 -> 0 bytes .../babel-20191130-git/tests/utf-16.txt | Bin 15244 -> 0 bytes .../babel-20191130-git/tests/utf-16.txt-utf8 | 212 - .../tests/utf-32-with-le-bom.txt | Bin 30488 -> 0 bytes .../babel-20191130-git/tests/utf-32.txt | Bin 30488 -> 0 bytes .../babel-20191130-git/tests/utf-32.txt-utf8 | 212 - .../babel-20191130-git/tests/utf-8.txt | 212 - .../babel-20191130-git/tests/utf-8.txt-utf8 | 212 - .../bordeaux-threads-v0.8.7/.travis.yml | 46 - .../bordeaux-threads-v0.8.7/CONTRIBUTORS | 19 - .../software/bordeaux-threads-v0.8.7/LICENSE | 20 - .../software/bordeaux-threads-v0.8.7/README | 2 - .../bordeaux-threads.asd | 76 - .../bordeaux-threads-v0.8.7/site/index.html | 55 - .../bordeaux-threads-v0.8.7/site/style.css | 86 - .../src/bordeaux-threads.lisp | 170 - .../src/condition-variables.lisp | 38 - .../src/default-implementations.lisp | 361 - .../src/impl-abcl.lisp | 150 - .../src/impl-allegro.lisp | 143 - .../src/impl-clasp.lisp | 111 - .../src/impl-clisp.lisp | 105 - .../src/impl-clozure.lisp | 130 - .../src/impl-cmucl.lisp | 161 - .../src/impl-corman.lisp | 26 - .../bordeaux-threads-v0.8.7/src/impl-ecl.lisp | 111 - .../src/impl-genera.lisp | 136 - .../impl-lispworks-condition-variables.lisp | 144 - .../src/impl-lispworks.lisp | 143 - .../bordeaux-threads-v0.8.7/src/impl-mcl.lisp | 68 - .../src/impl-mkcl.lisp | 109 - .../src/impl-null.lisp | 3 - .../src/impl-sbcl.lisp | 130 - .../bordeaux-threads-v0.8.7/src/impl-scl.lisp | 103 - .../bordeaux-threads-v0.8.7/src/pkgdcl.lisp | 66 - .../test/bordeaux-threads-test.lisp | 251 - .../bordeaux-threads-v0.8.7/version.sexp | 2 - .../quicklisp/software/cffi_0.20.1/.gitignore | 28 - .../software/cffi_0.20.1/.travis.yml | 38 - .../quicklisp/software/cffi_0.20.1/COPYRIGHT | 21 - .../quicklisp/software/cffi_0.20.1/HEADER | 28 - .../quicklisp/software/cffi_0.20.1/Makefile | 72 - .../quicklisp/software/cffi_0.20.1/README.md | 19 - .../dists/quicklisp/software/cffi_0.20.1/TODO | 115 - .../software/cffi_0.20.1/cffi-examples.asd | 37 - .../software/cffi_0.20.1/cffi-grovel.asd | 41 - .../software/cffi_0.20.1/cffi-libffi.asd | 48 - .../software/cffi_0.20.1/cffi-tests.asd | 91 - .../software/cffi_0.20.1/cffi-toolchain.asd | 48 - .../software/cffi_0.20.1/cffi-uffi-compat.asd | 41 - .../quicklisp/software/cffi_0.20.1/cffi.asd | 101 - .../software/cffi_0.20.1/doc/Makefile | 46 - .../cffi_0.20.1/doc/allegro-internals.txt | 132 - .../cffi_0.20.1/doc/cffi-manual.texinfo | 7113 ------- .../cffi_0.20.1/doc/cffi-sys-spec.texinfo | 334 - .../doc/colorize-lisp-examples.lisp | 1058 - .../software/cffi_0.20.1/doc/gendocs.sh | 313 - .../software/cffi_0.20.1/doc/gendocs_template | 259 - .../software/cffi_0.20.1/doc/mem-vector.txt | 75 - .../cffi_0.20.1/doc/shareable-vectors.txt | 44 - .../software/cffi_0.20.1/doc/style.css | 48 - .../cffi_0.20.1/examples/examples.lisp | 78 - .../cffi_0.20.1/examples/gethostname.lisp | 51 - .../cffi_0.20.1/examples/gettimeofday.lisp | 93 - .../cffi_0.20.1/examples/grovel-example.lisp | 20 - .../cffi_0.20.1/examples/main-example.lisp | 17 - .../cffi_0.20.1/examples/mapping.lisp | 76 - .../cffi_0.20.1/examples/package.lisp | 30 - .../cffi_0.20.1/examples/run-examples.lisp | 39 - .../cffi_0.20.1/examples/translator-test.lisp | 88 - .../cffi_0.20.1/examples/wrapper-example.lisp | 20 - .../software/cffi_0.20.1/grovel/asdf.lisp | 152 - .../software/cffi_0.20.1/grovel/common.h | 57 - .../software/cffi_0.20.1/grovel/grovel.lisp | 913 - .../software/cffi_0.20.1/grovel/package.lisp | 36 - .../software/cffi_0.20.1/libffi/funcall.lisp | 132 - .../cffi_0.20.1/libffi/libffi-functions.lisp | 43 - .../cffi_0.20.1/libffi/libffi-types.lisp | 110 - .../software/cffi_0.20.1/libffi/libffi.lisp | 38 - .../cffi_0.20.1/libffi/type-descriptors.lisp | 106 - .../software/cffi_0.20.1/scripts/release.lisp | 248 - .../software/cffi_0.20.1/src/c2ffi/asdf.lisp | 211 - .../software/cffi_0.20.1/src/c2ffi/c2ffi.lisp | 194 - .../cffi_0.20.1/src/c2ffi/generator.lisp | 838 - .../cffi_0.20.1/src/c2ffi/package.lisp | 54 - .../software/cffi_0.20.1/src/cffi-abcl.lisp | 664 - .../cffi_0.20.1/src/cffi-allegro.lisp | 446 - .../software/cffi_0.20.1/src/cffi-clasp.lisp | 201 - .../software/cffi_0.20.1/src/cffi-clisp.lisp | 432 - .../software/cffi_0.20.1/src/cffi-cmucl.lisp | 384 - .../software/cffi_0.20.1/src/cffi-corman.lisp | 331 - .../software/cffi_0.20.1/src/cffi-ecl.lisp | 454 - .../software/cffi_0.20.1/src/cffi-gcl.lisp | 313 - .../cffi_0.20.1/src/cffi-lispworks.lisp | 417 - .../software/cffi_0.20.1/src/cffi-mcl.lisp | 396 - .../software/cffi_0.20.1/src/cffi-mkcl.lisp | 342 - .../cffi_0.20.1/src/cffi-openmcl.lisp | 314 - .../software/cffi_0.20.1/src/cffi-sbcl.lisp | 408 - .../software/cffi_0.20.1/src/cffi-scl.lisp | 322 - .../software/cffi_0.20.1/src/early-types.lisp | 713 - .../software/cffi_0.20.1/src/enum.lisp | 369 - .../software/cffi_0.20.1/src/features.lisp | 111 - .../cffi_0.20.1/src/foreign-vars.lisp | 90 - .../software/cffi_0.20.1/src/functions.lisp | 441 - .../software/cffi_0.20.1/src/libraries.lisp | 458 - .../software/cffi_0.20.1/src/package.lisp | 181 - .../software/cffi_0.20.1/src/strings.lisp | 305 - .../software/cffi_0.20.1/src/structures.lisp | 133 - .../software/cffi_0.20.1/src/types.lisp | 1051 - .../software/cffi_0.20.1/src/utils.lisp | 84 - .../software/cffi_0.20.1/tests/GNUmakefile | 98 - .../software/cffi_0.20.1/tests/Makefile | 2 - .../software/cffi_0.20.1/tests/arrays.lisp | 71 - .../software/cffi_0.20.1/tests/bindings.lisp | 148 - .../software/cffi_0.20.1/tests/callbacks.lisp | 526 - .../software/cffi_0.20.1/tests/compile.bat | 9 - .../software/cffi_0.20.1/tests/defcfun.lisp | 536 - .../software/cffi_0.20.1/tests/enum.lisp | 231 - .../cffi_0.20.1/tests/foreign-globals.lisp | 309 - .../software/cffi_0.20.1/tests/fsbv.lisp | 199 - .../software/cffi_0.20.1/tests/funcall.lisp | 245 - .../software/cffi_0.20.1/tests/grovel.lisp | 96 - .../software/cffi_0.20.1/tests/libfsbv.c | 179 - .../software/cffi_0.20.1/tests/libtest.c | 985 - .../software/cffi_0.20.1/tests/libtest2.c | 50 - .../software/cffi_0.20.1/tests/memory.lisp | 657 - .../cffi_0.20.1/tests/misc-types.lisp | 296 - .../software/cffi_0.20.1/tests/misc.lisp | 132 - .../software/cffi_0.20.1/tests/package.lisp | 33 - .../cffi_0.20.1/tests/random-tester.lisp | 246 - .../software/cffi_0.20.1/tests/run-tests.lisp | 44 - .../software/cffi_0.20.1/tests/strings.lisp | 150 - .../software/cffi_0.20.1/tests/struct.lisp | 705 - .../software/cffi_0.20.1/tests/test-asdf.lisp | 42 - .../cffi_0.20.1/tests/test-static-link.sh | 9 - .../software/cffi_0.20.1/tests/union.lisp | 52 - .../cffi_0.20.1/toolchain/bundle.lisp | 565 - .../cffi_0.20.1/toolchain/c-toolchain.lisp | 392 - .../cffi_0.20.1/toolchain/package.lisp | 46 - .../cffi_0.20.1/toolchain/static-link.lisp | 95 - .../cffi_0.20.1/uffi-compat/uffi-compat.lisp | 664 - .../software/cffi_0.20.1/uffi-compat/uffi.asd | 3 - .../cl-ansi-text-20150804-git/.travis.yml | 13 - .../cl-ansi-text-20150804-git/README.md | 140 - .../cl-ansi-text-20150804-git/ci-test-run.sh | 15 - .../cl-ansi-text-test.asd | 11 - .../cl-ansi-text.asd | 11 - .../cl-ansi-text.lisp | 285 - .../cl-ansi-text-20150804-git/run-tests.lisp | 29 - .../test/cl-ansi-text-test.lisp | 123 - .../software/cl-colors-20180328-git/Makefile | 8 - .../cl-colors-20180328-git/README.org | 43 - .../cl-colors-20180328-git/cl-colors.asd | 19 - .../cl-colors-20180328-git/colornames.lisp | 663 - .../cl-colors-20180328-git/colors.lisp | 167 - .../cl-colors-20180328-git/hexcolors.lisp | 69 - .../cl-colors-20180328-git/introduction.txt | 52 - .../package-template.lisp | 17 - .../cl-colors-20180328-git/package.lisp | 674 - .../parse-x11-colors.lisp | 68 - .../software/cl-colors-20180328-git/test.lisp | 82 - .../software/cl-emb-20190521-git/LICENSE.txt | 14 - .../software/cl-emb-20190521-git/README.md | 339 - .../software/cl-emb-20190521-git/TODO | 14 - .../software/cl-emb-20190521-git/cl-emb.asd | 26 - .../software/cl-emb-20190521-git/emb.lisp | 523 - .../software/cl-emb-20190521-git/examples.css | 18 - .../cl-emb-20190521-git/examples.html | 232 - .../cl-emb-20190521-git/lsp-LICENSE.txt | 27 - .../cl-emb-20190521-git/packages.lisp | 31 - .../software/cl-fad-20190813-git/CHANGELOG | 121 - .../software/cl-fad-20190813-git/LICENSE | 26 - .../software/cl-fad-20190813-git/README | 38 - .../software/cl-fad-20190813-git/cl-fad.asd | 50 - .../cl-fad-20190813-git/cl-fad.system | 48 - .../software/cl-fad-20190813-git/corman.lisp | 86 - .../cl-fad-20190813-git/docs/index.html | 700 - .../software/cl-fad-20190813-git/fad.lisp | 570 - .../cl-fad-20190813-git/fad.test.lisp | 157 - .../software/cl-fad-20190813-git/load.lisp | 62 - .../software/cl-fad-20190813-git/openmcl.lisp | 72 - .../cl-fad-20190813-git/packages.lisp | 87 - .../cl-fad-20190813-git/packages.test.lisp | 5 - .../software/cl-fad-20190813-git/path.lisp | 32 - .../cl-fad-20190813-git/temporary-files.lisp | 173 - .../temporary-files.test.lisp | 49 - .../software/cl-ppcre-20190521-git/CHANGELOG | 400 - .../software/cl-ppcre-20190521-git/README.md | 30 - .../software/cl-ppcre-20190521-git/api.lisp | 1278 -- .../cl-ppcre-20190521-git/charmap.lisp | 152 - .../cl-ppcre-20190521-git/charset.lisp | 242 - .../cl-ppcre-20190521-git/chartest.lisp | 98 - .../cl-ppcre-unicode.asd | 64 - .../cl-ppcre-unicode/packages.lisp | 38 - .../cl-ppcre-unicode/resolver.lisp | 61 - .../cl-ppcre-20190521-git/cl-ppcre.asd | 85 - .../cl-ppcre-20190521-git/closures.lisp | 471 - .../cl-ppcre-20190521-git/convert.lisp | 879 - .../cl-ppcre-20190521-git/docs/index.html | 2231 -- .../cl-ppcre-20190521-git/errors.lisp | 84 - .../software/cl-ppcre-20190521-git/lexer.lisp | 738 - .../cl-ppcre-20190521-git/optimize.lisp | 578 - .../cl-ppcre-20190521-git/packages.lisp | 69 - .../cl-ppcre-20190521-git/parser.lisp | 290 - .../regex-class-util.lisp | 555 - .../cl-ppcre-20190521-git/regex-class.lisp | 271 - .../repetition-closures.lisp | 833 - .../cl-ppcre-20190521-git/scanner.lisp | 506 - .../cl-ppcre-20190521-git/specials.lisp | 172 - .../cl-ppcre-20190521-git/test/packages.lisp | 37 - .../test/perl-tests.lisp | 150 - .../cl-ppcre-20190521-git/test/perltest.pl | 160 - .../cl-ppcre-20190521-git/test/perltestdata | 14292 ------------- .../cl-ppcre-20190521-git/test/perltestinput | 3956 ---- .../cl-ppcre-20190521-git/test/simple | 377 - .../cl-ppcre-20190521-git/test/tests.lisp | 159 - .../test/unicode-tests.lisp | 80 - .../test/unicodetestdata | 107 - .../software/cl-ppcre-20190521-git/util.lisp | 201 - .../cl-project-20190521-git/.gitignore | 9 - .../cl-project-20190521-git/.travis.yml | 18 - .../cl-project-20190521-git/README.markdown | 61 - .../cl-project-test.asd | 17 - .../cl-project-20190521-git/cl-project.asd | 33 - .../roswell/make-project.ros | 62 - .../skeleton/.gitignore | 8 - .../skeleton/README.markdown | 21 - .../skeleton/README.org | 21 - .../skeleton/skeleton.asd | 24 - .../skeleton/src/main.lisp | 5 - .../skeleton/tests/main.lisp | 11 - .../src/cl-project.lisp | 40 - .../cl-project-20190521-git/src/file.lisp | 37 - .../cl-project-20190521-git/src/io.lisp | 17 - .../src/middleware.lisp | 21 - .../cl-project-20190521-git/src/skeleton.lisp | 63 - .../cl-project-20190521-git/src/specials.lisp | 15 - .../tests/cl-project.lisp | 46 - .../software/croatoan-20191227-git/LICENSE | 22 - .../software/croatoan-20191227-git/README | 40 - .../croatoan-20191227-git/croatoan-test.asd | 19 - .../croatoan-20191227-git/croatoan.asd | 116 - .../croatoan-20191227-git/doc/slime.md | 137 - .../ncurses/add_wch.lisp | 24 - .../croatoan-20191227-git/ncurses/addch.lisp | 25 - .../croatoan-20191227-git/ncurses/addstr.lisp | 31 - .../croatoan-20191227-git/ncurses/attr.lisp | 72 - .../croatoan-20191227-git/ncurses/beep.lisp | 15 - .../croatoan-20191227-git/ncurses/bkgd.lisp | 21 - .../croatoan-20191227-git/ncurses/bkgrnd.lisp | 23 - .../croatoan-20191227-git/ncurses/border.lisp | 57 - .../ncurses/border_set.lisp | 60 - .../croatoan-20191227-git/ncurses/clear.lisp | 29 - .../croatoan-20191227-git/ncurses/color.lisp | 56 - .../ncurses/default_colors.lisp | 15 - .../ncurses/define_key.lisp | 13 - .../croatoan-20191227-git/ncurses/delch.lisp | 19 - .../ncurses/deleteln.lisp | 23 - .../croatoan-20191227-git/ncurses/extend.lisp | 15 - .../ncurses/get_wch.lisp | 21 - .../ncurses/getcchar.lisp | 26 - .../croatoan-20191227-git/ncurses/getch.lisp | 25 - .../croatoan-20191227-git/ncurses/getstr.lisp | 27 - .../croatoan-20191227-git/ncurses/getyx.lisp | 42 - .../croatoan-20191227-git/ncurses/in_wch.lisp | 19 - .../croatoan-20191227-git/ncurses/inch.lisp | 19 - .../ncurses/inchstr.lisp | 27 - .../ncurses/initscr.lisp | 24 - .../croatoan-20191227-git/ncurses/inopts.lisp | 45 - .../ncurses/ins_wch.lisp | 19 - .../croatoan-20191227-git/ncurses/insch.lisp | 19 - .../croatoan-20191227-git/ncurses/insstr.lisp | 27 - .../croatoan-20191227-git/ncurses/instr.lisp | 27 - .../croatoan-20191227-git/ncurses/inwstr.lisp | 27 - .../croatoan-20191227-git/ncurses/kernel.lisp | 33 - .../ncurses/key_defined.lisp | 13 - .../ncurses/keybound.lisp | 13 - .../croatoan-20191227-git/ncurses/legacy.lisp | 28 - .../ncurses/legacy_coding.lisp | 12 - .../croatoan-20191227-git/ncurses/mouse.lisp | 24 - .../croatoan-20191227-git/ncurses/move.lisp | 16 - .../ncurses/ncurses.lisp | 213 - .../croatoan-20191227-git/ncurses/opaque.lisp | 40 - .../ncurses/outopts.lisp | 35 - .../ncurses/package.lisp | 467 - .../croatoan-20191227-git/ncurses/pad.lisp | 45 - .../ncurses/refresh.lisp | 23 - .../ncurses/resizeterm.lisp | 17 - .../croatoan-20191227-git/ncurses/scroll.lisp | 17 - .../croatoan-20191227-git/ncurses/slk.lisp | 47 - .../ncurses/termattrs.lisp | 31 - .../croatoan-20191227-git/ncurses/touch.lisp | 25 - .../croatoan-20191227-git/ncurses/util.lisp | 33 - .../ncurses/variables.lisp | 27 - .../croatoan-20191227-git/ncurses/window.lisp | 36 - .../ncurses/wresize.lisp | 13 - .../croatoan-20191227-git/src/add_wch.lisp | 239 - .../croatoan-20191227-git/src/addch.lisp | 230 - .../croatoan-20191227-git/src/addstr.lisp | 42 - .../croatoan-20191227-git/src/attr.lisp | 501 - .../croatoan-20191227-git/src/beep.lisp | 11 - .../croatoan-20191227-git/src/bkgd.lisp | 32 - .../croatoan-20191227-git/src/bkgrnd.lisp | 51 - .../croatoan-20191227-git/src/border.lisp | 23 - .../croatoan-20191227-git/src/border_set.lisp | 39 - .../croatoan-20191227-git/src/classes.lisp | 1564 -- .../croatoan-20191227-git/src/clear.lisp | 27 - .../croatoan-20191227-git/src/color.lisp | 160 - .../croatoan-20191227-git/src/croatoan.lisp | 297 - .../src/default_colors.lisp | 30 - .../croatoan-20191227-git/src/define_key.lisp | 24 - .../croatoan-20191227-git/src/delch.lisp | 14 - .../croatoan-20191227-git/src/deleteln.lisp | 18 - .../croatoan-20191227-git/src/extend.lisp | 19 - .../croatoan-20191227-git/src/form.lisp | 484 - .../croatoan-20191227-git/src/get_wch.lisp | 36 - .../croatoan-20191227-git/src/getch.lisp | 520 - .../croatoan-20191227-git/src/getstr.lisp | 19 - .../croatoan-20191227-git/src/getyx.lisp | 54 - .../src/gray_streams.lisp | 162 - .../croatoan-20191227-git/src/in_wch.lisp | 14 - .../croatoan-20191227-git/src/inch.lisp | 14 - .../croatoan-20191227-git/src/inchstr.lisp | 21 - .../croatoan-20191227-git/src/initscr.lisp | 31 - .../croatoan-20191227-git/src/inopts.lisp | 82 - .../croatoan-20191227-git/src/ins_wch.lisp | 56 - .../croatoan-20191227-git/src/insch.lisp | 28 - .../croatoan-20191227-git/src/insstr.lisp | 42 - .../croatoan-20191227-git/src/instr.lisp | 28 - .../croatoan-20191227-git/src/inwstr.lisp | 25 - .../croatoan-20191227-git/src/kernel.lisp | 9 - .../src/key_defined.lisp | 27 - .../croatoan-20191227-git/src/keybound.lisp | 24 - .../croatoan-20191227-git/src/legacy.lisp | 39 - .../src/legacy_coding.lisp | 26 - .../croatoan-20191227-git/src/menu.lisp | 344 - .../croatoan-20191227-git/src/mouse.lisp | 89 - .../croatoan-20191227-git/src/move.lisp | 32 - .../croatoan-20191227-git/src/opaque.lisp | 118 - .../croatoan-20191227-git/src/outopts.lisp | 57 - .../croatoan-20191227-git/src/package.lisp | 321 - .../croatoan-20191227-git/src/panel.lisp | 54 - .../croatoan-20191227-git/src/queue.lisp | 107 - .../croatoan-20191227-git/src/refresh.lisp | 56 - .../croatoan-20191227-git/src/resizeterm.lisp | 41 - .../croatoan-20191227-git/src/scroll.lisp | 30 - .../croatoan-20191227-git/src/shape.lisp | 193 - .../croatoan-20191227-git/src/slk.lisp | 53 - .../croatoan-20191227-git/src/termattrs.lisp | 37 - .../croatoan-20191227-git/src/touch.lisp | 13 - .../croatoan-20191227-git/src/utf8.lisp | 350 - .../croatoan-20191227-git/src/util.lisp | 52 - .../croatoan-20191227-git/src/variables.lisp | 62 - .../croatoan-20191227-git/src/window.lisp | 39 - .../croatoan-20191227-git/src/wresize.lisp | 5 - .../croatoan-20191227-git/test/clos.lisp | 2878 --- .../croatoan-20191227-git/test/evolution.lisp | 311 - .../croatoan-20191227-git/test/ncurses.lisp | 137 - .../croatoan-20191227-git/test/package.lisp | 127 - .../croatoan-20191227-git/test/tetris.lisp | 148 - .../croatoan-20191227-git/test/unicode.lisp | 116 - .../html-template-20171227-git/CHANGELOG | 71 - .../html-template-20171227-git/INSTALLATION | 33 - .../html-template-20171227-git/README.md | 21 - .../html-template-20171227-git/api.lisp | 160 - .../docs/index.html | 1472 -- .../html-template-20171227-git/errors.lisp | 106 - .../html-template.asd | 38 - .../html-template.system | 44 - .../html-template-20171227-git/load.lisp | 54 - .../html-template-20171227-git/packages.lisp | 72 - .../html-template-20171227-git/specials.lisp | 151 - .../html-template-20171227-git/template.lisp | 474 - .../html-template-20171227-git/test.lisp | 291 - .../html-template-20171227-git/util.lisp | 342 - .../software/let-plus-20191130-git/.gitignore | 4 - .../let-plus-20191130-git/LICENSE_1_0.txt | 23 - .../software/let-plus-20191130-git/README.org | 194 - .../let-plus-20191130-git/extensions.lisp | 90 - .../let-plus-20191130-git/let-plus.asd | 25 - .../let-plus-20191130-git/let-plus.lisp | 336 - .../let-plus-20191130-git/package.lisp | 37 - .../software/let-plus-20191130-git/tests.lisp | 290 - .../local-time-20190710-git/.gitignore | 22 - .../software/local-time-20190710-git/COPYING | 20 - .../software/local-time-20190710-git/CREDITS | 17 - .../software/local-time-20190710-git/INSTALL | 40 - .../software/local-time-20190710-git/README | 18 - .../software/local-time-20190710-git/TODO | 104 - .../cl-postgres+local-time.asd | 9 - .../local-time-20190710-git/doc/Makefile | 16 - .../local-time-20190710-git/doc/gendocs.sh | 285 - .../doc/gendocs_template | 260 - .../doc/local-time.texinfo | 774 - .../local-time-20190710-git/doc/style.css | 48 - .../local-time-20190710-git/local-time.asd | 29 - .../src/integration/cl-postgres.lisp | 46 - .../src/local-time.lisp | 1906 -- .../local-time-20190710-git/src/package.lisp | 91 - .../test/comparison.lisp | 128 - .../test/formatting.lisp | 97 - .../local-time-20190710-git/test/package.lisp | 13 - .../local-time-20190710-git/test/parsing.lisp | 79 - .../local-time-20190710-git/test/simple.lisp | 284 - .../test/timezone.lisp | 106 - .../zoneinfo-leaps/UTC | Bin 647 -> 0 bytes .../zoneinfo/Africa/Abidjan | Bin 156 -> 0 bytes .../zoneinfo/Africa/Accra | Bin 378 -> 0 bytes .../zoneinfo/Africa/Addis_Ababa | Bin 180 -> 0 bytes .../zoneinfo/Africa/Algiers | Bin 734 -> 0 bytes .../zoneinfo/Africa/Asmara | Bin 201 -> 0 bytes .../zoneinfo/Africa/Asmera | Bin 201 -> 0 bytes .../zoneinfo/Africa/Bamako | Bin 208 -> 0 bytes .../zoneinfo/Africa/Bangui | Bin 157 -> 0 bytes .../zoneinfo/Africa/Banjul | Bin 232 -> 0 bytes .../zoneinfo/Africa/Bissau | Bin 194 -> 0 bytes .../zoneinfo/Africa/Blantyre | Bin 157 -> 0 bytes .../zoneinfo/Africa/Brazzaville | Bin 157 -> 0 bytes .../zoneinfo/Africa/Bujumbura | Bin 140 -> 0 bytes .../zoneinfo/Africa/Cairo | Bin 9307 -> 0 bytes .../zoneinfo/Africa/Casablanca | Bin 486 -> 0 bytes .../zoneinfo/Africa/Ceuta | Bin 2049 -> 0 bytes .../zoneinfo/Africa/Conakry | Bin 208 -> 0 bytes .../zoneinfo/Africa/Dakar | Bin 194 -> 0 bytes .../zoneinfo/Africa/Dar_es_Salaam | Bin 213 -> 0 bytes .../zoneinfo/Africa/Djibouti | Bin 157 -> 0 bytes .../zoneinfo/Africa/Douala | Bin 157 -> 0 bytes .../zoneinfo/Africa/El_Aaiun | Bin 194 -> 0 bytes .../zoneinfo/Africa/Freetown | Bin 665 -> 0 bytes .../zoneinfo/Africa/Gaborone | Bin 194 -> 0 bytes .../zoneinfo/Africa/Harare | Bin 157 -> 0 bytes .../zoneinfo/Africa/Johannesburg | Bin 245 -> 0 bytes .../zoneinfo/Africa/Kampala | Bin 253 -> 0 bytes .../zoneinfo/Africa/Khartoum | Bin 669 -> 0 bytes .../zoneinfo/Africa/Kigali | Bin 157 -> 0 bytes .../zoneinfo/Africa/Kinshasa | Bin 140 -> 0 bytes .../zoneinfo/Africa/Lagos | Bin 157 -> 0 bytes .../zoneinfo/Africa/Libreville | Bin 157 -> 0 bytes .../zoneinfo/Africa/Lome | Bin 139 -> 0 bytes .../zoneinfo/Africa/Luanda | Bin 178 -> 0 bytes .../zoneinfo/Africa/Lubumbashi | Bin 140 -> 0 bytes .../zoneinfo/Africa/Lusaka | Bin 157 -> 0 bytes .../zoneinfo/Africa/Malabo | Bin 195 -> 0 bytes .../zoneinfo/Africa/Maputo | Bin 157 -> 0 bytes .../zoneinfo/Africa/Maseru | Bin 204 -> 0 bytes .../zoneinfo/Africa/Mbabane | Bin 160 -> 0 bytes .../zoneinfo/Africa/Mogadishu | Bin 194 -> 0 bytes .../zoneinfo/Africa/Monrovia | Bin 215 -> 0 bytes .../zoneinfo/Africa/Nairobi | Bin 253 -> 0 bytes .../zoneinfo/Africa/Ndjamena | Bin 211 -> 0 bytes .../zoneinfo/Africa/Niamey | Bin 225 -> 0 bytes .../zoneinfo/Africa/Nouakchott | Bin 208 -> 0 bytes .../zoneinfo/Africa/Ouagadougou | Bin 156 -> 0 bytes .../zoneinfo/Africa/Porto-Novo | Bin 195 -> 0 bytes .../zoneinfo/Africa/Sao_Tome | Bin 173 -> 0 bytes .../zoneinfo/Africa/Timbuktu | Bin 208 -> 0 bytes .../zoneinfo/Africa/Tripoli | Bin 599 -> 0 bytes .../zoneinfo/Africa/Tunis | Bin 1517 -> 0 bytes .../zoneinfo/Africa/Windhoek | Bin 1556 -> 0 bytes .../zoneinfo/America/Adak | Bin 2353 -> 0 bytes .../zoneinfo/America/Anchorage | Bin 2358 -> 0 bytes .../zoneinfo/America/Anguilla | Bin 156 -> 0 bytes .../zoneinfo/America/Antigua | Bin 194 -> 0 bytes .../zoneinfo/America/Araguaina | Bin 854 -> 0 bytes .../zoneinfo/America/Argentina/Buenos_Aires | Bin 1882 -> 0 bytes .../zoneinfo/America/Argentina/Catamarca | Bin 1936 -> 0 bytes .../zoneinfo/America/Argentina/ComodRivadavia | Bin 1936 -> 0 bytes .../zoneinfo/America/Argentina/Cordoba | Bin 1908 -> 0 bytes .../zoneinfo/America/Argentina/Jujuy | Bin 1936 -> 0 bytes .../zoneinfo/America/Argentina/La_Rioja | Bin 1950 -> 0 bytes .../zoneinfo/America/Argentina/Mendoza | Bin 1964 -> 0 bytes .../zoneinfo/America/Argentina/Rio_Gallegos | Bin 1936 -> 0 bytes .../zoneinfo/America/Argentina/San_Juan | Bin 1950 -> 0 bytes .../zoneinfo/America/Argentina/San_Luis | Bin 1101 -> 0 bytes .../zoneinfo/America/Argentina/Tucuman | Bin 1936 -> 0 bytes .../zoneinfo/America/Argentina/Ushuaia | Bin 1936 -> 0 bytes .../zoneinfo/America/Aruba | Bin 194 -> 0 bytes .../zoneinfo/America/Asuncion | Bin 2020 -> 0 bytes .../zoneinfo/America/Atikokan | Bin 319 -> 0 bytes .../zoneinfo/America/Atka | Bin 2353 -> 0 bytes .../zoneinfo/America/Bahia | Bin 994 -> 0 bytes .../zoneinfo/America/Barbados | Bin 330 -> 0 bytes .../zoneinfo/America/Belem | Bin 574 -> 0 bytes .../zoneinfo/America/Belize | Bin 962 -> 0 bytes .../zoneinfo/America/Blanc-Sablon | Bin 281 -> 0 bytes .../zoneinfo/America/Boa_Vista | Bin 630 -> 0 bytes .../zoneinfo/America/Bogota | Bin 231 -> 0 bytes .../zoneinfo/America/Boise | Bin 2377 -> 0 bytes .../zoneinfo/America/Buenos_Aires | Bin 1882 -> 0 bytes .../zoneinfo/America/Cambridge_Bay | Bin 2052 -> 0 bytes .../zoneinfo/America/Campo_Grande | Bin 1983 -> 0 bytes .../zoneinfo/America/Cancun | Bin 1450 -> 0 bytes .../zoneinfo/America/Caracas | Bin 224 -> 0 bytes .../zoneinfo/America/Catamarca | Bin 1936 -> 0 bytes .../zoneinfo/America/Cayenne | Bin 186 -> 0 bytes .../zoneinfo/America/Cayman | Bin 177 -> 0 bytes .../zoneinfo/America/Chicago | Bin 3543 -> 0 bytes .../zoneinfo/America/Chihuahua | Bin 1492 -> 0 bytes .../zoneinfo/America/Coral_Harbour | Bin 319 -> 0 bytes .../zoneinfo/America/Cordoba | Bin 1908 -> 0 bytes .../zoneinfo/America/Costa_Rica | Bin 315 -> 0 bytes .../zoneinfo/America/Cuiaba | Bin 1955 -> 0 bytes .../zoneinfo/America/Curacao | Bin 194 -> 0 bytes .../zoneinfo/America/Danmarkshavn | Bin 700 -> 0 bytes .../zoneinfo/America/Dawson | Bin 2067 -> 0 bytes .../zoneinfo/America/Dawson_Creek | Bin 1033 -> 0 bytes .../zoneinfo/America/Denver | Bin 2427 -> 0 bytes .../zoneinfo/America/Detroit | Bin 2202 -> 0 bytes .../zoneinfo/America/Dominica | Bin 156 -> 0 bytes .../zoneinfo/America/Edmonton | Bin 2388 -> 0 bytes .../zoneinfo/America/Eirunepe | Bin 602 -> 0 bytes .../zoneinfo/America/El_Salvador | Bin 236 -> 0 bytes .../zoneinfo/America/Ensenada | Bin 2342 -> 0 bytes .../zoneinfo/America/Fort_Wayne | Bin 1649 -> 0 bytes .../zoneinfo/America/Fortaleza | Bin 714 -> 0 bytes .../zoneinfo/America/Glace_Bay | Bin 2192 -> 0 bytes .../zoneinfo/America/Godthab | Bin 8296 -> 0 bytes .../zoneinfo/America/Goose_Bay | Bin 3187 -> 0 bytes .../zoneinfo/America/Grand_Turk | Bin 1871 -> 0 bytes .../zoneinfo/America/Grenada | Bin 156 -> 0 bytes .../zoneinfo/America/Guadeloupe | Bin 156 -> 0 bytes .../zoneinfo/America/Guatemala | Bin 292 -> 0 bytes .../zoneinfo/America/Guayaquil | Bin 177 -> 0 bytes .../zoneinfo/America/Guyana | Bin 256 -> 0 bytes .../zoneinfo/America/Halifax | Bin 3424 -> 0 bytes .../zoneinfo/America/Havana | Bin 2411 -> 0 bytes .../zoneinfo/America/Hermosillo | Bin 424 -> 0 bytes .../zoneinfo/America/Indiana/Indianapolis | Bin 1649 -> 0 bytes .../zoneinfo/America/Indiana/Knox | Bin 2395 -> 0 bytes .../zoneinfo/America/Indiana/Marengo | Bin 1705 -> 0 bytes .../zoneinfo/America/Indiana/Petersburg | Bin 1887 -> 0 bytes .../zoneinfo/America/Indiana/Tell_City | Bin 1677 -> 0 bytes .../zoneinfo/America/Indiana/Vevay | Bin 1397 -> 0 bytes .../zoneinfo/America/Indiana/Vincennes | Bin 1677 -> 0 bytes .../zoneinfo/America/Indiana/Winamac | Bin 1761 -> 0 bytes .../zoneinfo/America/Indianapolis | Bin 1649 -> 0 bytes .../zoneinfo/America/Inuvik | Bin 1914 -> 0 bytes .../zoneinfo/America/Iqaluit | Bin 2000 -> 0 bytes .../zoneinfo/America/Jamaica | Bin 481 -> 0 bytes .../zoneinfo/America/Jujuy | Bin 1936 -> 0 bytes .../zoneinfo/America/Juneau | Bin 2324 -> 0 bytes .../zoneinfo/America/Kentucky/Louisville | Bin 2755 -> 0 bytes .../zoneinfo/America/Kentucky/Monticello | Bin 2335 -> 0 bytes .../zoneinfo/America/Knox_IN | Bin 2395 -> 0 bytes .../zoneinfo/America/La_Paz | Bin 217 -> 0 bytes .../zoneinfo/America/Lima | Bin 395 -> 0 bytes .../zoneinfo/America/Los_Angeles | Bin 2819 -> 0 bytes .../zoneinfo/America/Louisville | Bin 2755 -> 0 bytes .../zoneinfo/America/Maceio | Bin 742 -> 0 bytes .../zoneinfo/America/Managua | Bin 421 -> 0 bytes .../zoneinfo/America/Manaus | Bin 602 -> 0 bytes .../zoneinfo/America/Marigot | Bin 156 -> 0 bytes .../zoneinfo/America/Martinique | Bin 231 -> 0 bytes .../zoneinfo/America/Mazatlan | Bin 1534 -> 0 bytes .../zoneinfo/America/Mendoza | Bin 1964 -> 0 bytes .../zoneinfo/America/Menominee | Bin 2241 -> 0 bytes .../zoneinfo/America/Merida | Bin 1426 -> 0 bytes .../zoneinfo/America/Mexico_City | Bin 1604 -> 0 bytes .../zoneinfo/America/Miquelon | Bin 1670 -> 0 bytes .../zoneinfo/America/Moncton | Bin 3137 -> 0 bytes .../zoneinfo/America/Monterrey | Bin 1402 -> 0 bytes .../zoneinfo/America/Montevideo | Bin 2118 -> 0 bytes .../zoneinfo/America/Montreal | Bin 3477 -> 0 bytes .../zoneinfo/America/Montserrat | Bin 156 -> 0 bytes .../zoneinfo/America/Nassau | Bin 2270 -> 0 bytes .../zoneinfo/America/New_York | Bin 3519 -> 0 bytes .../zoneinfo/America/Nipigon | Bin 2105 -> 0 bytes .../zoneinfo/America/Nome | Bin 2350 -> 0 bytes .../zoneinfo/America/Noronha | Bin 714 -> 0 bytes .../zoneinfo/America/North_Dakota/Center | Bin 2363 -> 0 bytes .../zoneinfo/America/North_Dakota/New_Salem | Bin 2363 -> 0 bytes .../zoneinfo/America/Panama | Bin 177 -> 0 bytes .../zoneinfo/America/Pangnirtung | Bin 2062 -> 0 bytes .../zoneinfo/America/Paramaribo | Bin 294 -> 0 bytes .../zoneinfo/America/Phoenix | Bin 327 -> 0 bytes .../zoneinfo/America/Port-au-Prince | Bin 711 -> 0 bytes .../zoneinfo/America/Port_of_Spain | Bin 156 -> 0 bytes .../zoneinfo/America/Porto_Acre | Bin 574 -> 0 bytes .../zoneinfo/America/Porto_Velho | Bin 574 -> 0 bytes .../zoneinfo/America/Puerto_Rico | Bin 229 -> 0 bytes .../zoneinfo/America/Rainy_River | Bin 2105 -> 0 bytes .../zoneinfo/America/Rankin_Inlet | Bin 1900 -> 0 bytes .../zoneinfo/America/Recife | Bin 714 -> 0 bytes .../zoneinfo/America/Regina | Bin 980 -> 0 bytes .../zoneinfo/America/Resolute | Bin 1014 -> 0 bytes .../zoneinfo/America/Rio_Branco | Bin 574 -> 0 bytes .../zoneinfo/America/Rosario | Bin 1908 -> 0 bytes .../zoneinfo/America/Santiago | Bin 9173 -> 0 bytes .../zoneinfo/America/Santo_Domingo | Bin 463 -> 0 bytes .../zoneinfo/America/Sao_Paulo | Bin 1983 -> 0 bytes .../zoneinfo/America/Scoresbysund | Bin 1911 -> 0 bytes .../zoneinfo/America/Shiprock | Bin 2427 -> 0 bytes .../zoneinfo/America/St_Barthelemy | Bin 156 -> 0 bytes .../zoneinfo/America/St_Johns | Bin 3632 -> 0 bytes .../zoneinfo/America/St_Kitts | Bin 156 -> 0 bytes .../zoneinfo/America/St_Lucia | Bin 177 -> 0 bytes .../zoneinfo/America/St_Thomas | Bin 156 -> 0 bytes .../zoneinfo/America/St_Vincent | Bin 177 -> 0 bytes .../zoneinfo/America/Swift_Current | Bin 560 -> 0 bytes .../zoneinfo/America/Tegucigalpa | Bin 264 -> 0 bytes .../zoneinfo/America/Thule | Bin 1514 -> 0 bytes .../zoneinfo/America/Thunder_Bay | Bin 2185 -> 0 bytes .../zoneinfo/America/Tijuana | Bin 2342 -> 0 bytes .../zoneinfo/America/Toronto | Bin 3477 -> 0 bytes .../zoneinfo/America/Tortola | Bin 156 -> 0 bytes .../zoneinfo/America/Vancouver | Bin 2875 -> 0 bytes .../zoneinfo/America/Virgin | Bin 156 -> 0 bytes .../zoneinfo/America/Whitehorse | Bin 2067 -> 0 bytes .../zoneinfo/America/Winnipeg | Bin 2865 -> 0 bytes .../zoneinfo/America/Yakutat | Bin 2288 -> 0 bytes .../zoneinfo/America/Yellowknife | Bin 1966 -> 0 bytes .../zoneinfo/Antarctica/Casey | Bin 157 -> 0 bytes .../zoneinfo/Antarctica/Davis | Bin 188 -> 0 bytes .../zoneinfo/Antarctica/DumontDUrville | Bin 213 -> 0 bytes .../zoneinfo/Antarctica/Mawson | Bin 160 -> 0 bytes .../zoneinfo/Antarctica/McMurdo | Bin 2001 -> 0 bytes .../zoneinfo/Antarctica/Palmer | Bin 8546 -> 0 bytes .../zoneinfo/Antarctica/Rothera | Bin 159 -> 0 bytes .../zoneinfo/Antarctica/South_Pole | Bin 2001 -> 0 bytes .../zoneinfo/Antarctica/Syowa | Bin 160 -> 0 bytes .../zoneinfo/Antarctica/Vostok | Bin 160 -> 0 bytes .../zoneinfo/Arctic/Longyearbyen | Bin 2225 -> 0 bytes .../zoneinfo/Asia/Aden | Bin 157 -> 0 bytes .../zoneinfo/Asia/Almaty | Bin 922 -> 0 bytes .../zoneinfo/Asia/Amman | Bin 1890 -> 0 bytes .../zoneinfo/Asia/Anadyr | Bin 1931 -> 0 bytes .../zoneinfo/Asia/Aqtau | Bin 1112 -> 0 bytes .../zoneinfo/Asia/Aqtobe | Bin 1038 -> 0 bytes .../zoneinfo/Asia/Ashgabat | Bin 657 -> 0 bytes .../zoneinfo/Asia/Ashkhabad | Bin 657 -> 0 bytes .../zoneinfo/Asia/Baghdad | Bin 962 -> 0 bytes .../zoneinfo/Asia/Bahrain | Bin 195 -> 0 bytes .../zoneinfo/Asia/Baku | Bin 1942 -> 0 bytes .../zoneinfo/Asia/Bangkok | Bin 178 -> 0 bytes .../zoneinfo/Asia/Beirut | Bin 2149 -> 0 bytes .../zoneinfo/Asia/Bishkek | Bin 1047 -> 0 bytes .../zoneinfo/Asia/Brunei | Bin 187 -> 0 bytes .../zoneinfo/Asia/Calcutta | Bin 265 -> 0 bytes .../zoneinfo/Asia/Choibalsan | Bin 890 -> 0 bytes .../zoneinfo/Asia/Chongqing | Bin 389 -> 0 bytes .../zoneinfo/Asia/Chungking | Bin 389 -> 0 bytes .../zoneinfo/Asia/Colombo | Bin 347 -> 0 bytes .../zoneinfo/Asia/Dacca | Bin 310 -> 0 bytes .../zoneinfo/Asia/Damascus | Bin 2303 -> 0 bytes .../zoneinfo/Asia/Dhaka | Bin 310 -> 0 bytes .../zoneinfo/Asia/Dili | Bin 277 -> 0 bytes .../zoneinfo/Asia/Dubai | Bin 157 -> 0 bytes .../zoneinfo/Asia/Dushanbe | Bin 597 -> 0 bytes .../zoneinfo/Asia/Gaza | Bin 2279 -> 0 bytes .../zoneinfo/Asia/Harbin | Bin 447 -> 0 bytes .../zoneinfo/Asia/Ho_Chi_Minh | Bin 239 -> 0 bytes .../zoneinfo/Asia/Hong_Kong | Bin 1135 -> 0 bytes .../zoneinfo/Asia/Hovd | Bin 834 -> 0 bytes .../zoneinfo/Asia/Irkutsk | Bin 1935 -> 0 bytes .../zoneinfo/Asia/Istanbul | Bin 2721 -> 0 bytes .../zoneinfo/Asia/Jakarta | Bin 344 -> 0 bytes .../zoneinfo/Asia/Jayapura | Bin 209 -> 0 bytes .../zoneinfo/Asia/Jerusalem | Bin 2197 -> 0 bytes .../zoneinfo/Asia/Kabul | Bin 173 -> 0 bytes .../zoneinfo/Asia/Kamchatka | Bin 1915 -> 0 bytes .../zoneinfo/Asia/Karachi | Bin 361 -> 0 bytes .../zoneinfo/Asia/Kashgar | Bin 419 -> 0 bytes .../zoneinfo/Asia/Katmandu | Bin 198 -> 0 bytes .../zoneinfo/Asia/Kolkata | Bin 265 -> 0 bytes .../zoneinfo/Asia/Krasnoyarsk | Bin 1914 -> 0 bytes .../zoneinfo/Asia/Kuala_Lumpur | Bin 372 -> 0 bytes .../zoneinfo/Asia/Kuching | Bin 505 -> 0 bytes .../zoneinfo/Asia/Kuwait | Bin 157 -> 0 bytes .../zoneinfo/Asia/Macao | Bin 781 -> 0 bytes .../zoneinfo/Asia/Macau | Bin 781 -> 0 bytes .../zoneinfo/Asia/Magadan | Bin 1915 -> 0 bytes .../zoneinfo/Asia/Makassar | Bin 247 -> 0 bytes .../zoneinfo/Asia/Manila | Bin 319 -> 0 bytes .../zoneinfo/Asia/Muscat | Bin 157 -> 0 bytes .../zoneinfo/Asia/Nicosia | Bin 2002 -> 0 bytes .../zoneinfo/Asia/Novosibirsk | Bin 1944 -> 0 bytes .../zoneinfo/Asia/Omsk | Bin 1914 -> 0 bytes .../zoneinfo/Asia/Oral | Bin 1086 -> 0 bytes .../zoneinfo/Asia/Phnom_Penh | Bin 239 -> 0 bytes .../zoneinfo/Asia/Pontianak | Bin 359 -> 0 bytes .../zoneinfo/Asia/Pyongyang | Bin 242 -> 0 bytes .../zoneinfo/Asia/Qatar | Bin 195 -> 0 bytes .../zoneinfo/Asia/Qyzylorda | Bin 1068 -> 0 bytes .../zoneinfo/Asia/Rangoon | Bin 259 -> 0 bytes .../zoneinfo/Asia/Riyadh | Bin 157 -> 0 bytes .../zoneinfo/Asia/Riyadh87 | Bin 8669 -> 0 bytes .../zoneinfo/Asia/Riyadh88 | Bin 8523 -> 0 bytes .../zoneinfo/Asia/Riyadh89 | Bin 8523 -> 0 bytes .../zoneinfo/Asia/Saigon | Bin 239 -> 0 bytes .../zoneinfo/Asia/Sakhalin | Bin 1961 -> 0 bytes .../zoneinfo/Asia/Samarkand | Bin 677 -> 0 bytes .../zoneinfo/Asia/Seoul | Bin 380 -> 0 bytes .../zoneinfo/Asia/Shanghai | Bin 405 -> 0 bytes .../zoneinfo/Asia/Singapore | Bin 402 -> 0 bytes .../zoneinfo/Asia/Taipei | Bin 724 -> 0 bytes .../zoneinfo/Asia/Tashkent | Bin 667 -> 0 bytes .../zoneinfo/Asia/Tbilisi | Bin 1100 -> 0 bytes .../zoneinfo/Asia/Tehran | Bin 1622 -> 0 bytes .../zoneinfo/Asia/Tel_Aviv | Bin 2197 -> 0 bytes .../zoneinfo/Asia/Thimbu | Bin 195 -> 0 bytes .../zoneinfo/Asia/Thimphu | Bin 195 -> 0 bytes .../zoneinfo/Asia/Tokyo | Bin 331 -> 0 bytes .../zoneinfo/Asia/Ujung_Pandang | Bin 247 -> 0 bytes .../zoneinfo/Asia/Ulaanbaatar | Bin 834 -> 0 bytes .../zoneinfo/Asia/Ulan_Bator | Bin 834 -> 0 bytes .../zoneinfo/Asia/Urumqi | Bin 389 -> 0 bytes .../zoneinfo/Asia/Vientiane | Bin 239 -> 0 bytes .../zoneinfo/Asia/Vladivostok | Bin 1929 -> 0 bytes .../zoneinfo/Asia/Yakutsk | Bin 1914 -> 0 bytes .../zoneinfo/Asia/Yekaterinburg | Bin 2000 -> 0 bytes .../zoneinfo/Asia/Yerevan | Bin 2012 -> 0 bytes .../zoneinfo/Atlantic/Azores | Bin 3462 -> 0 bytes .../zoneinfo/Atlantic/Bermuda | Bin 1990 -> 0 bytes .../zoneinfo/Atlantic/Canary | Bin 1899 -> 0 bytes .../zoneinfo/Atlantic/Cape_Verde | Bin 240 -> 0 bytes .../zoneinfo/Atlantic/Faeroe | Bin 1815 -> 0 bytes .../zoneinfo/Atlantic/Faroe | Bin 1815 -> 0 bytes .../zoneinfo/Atlantic/Jan_Mayen | Bin 2225 -> 0 bytes .../zoneinfo/Atlantic/Madeira | Bin 3452 -> 0 bytes .../zoneinfo/Atlantic/Reykjavik | Bin 1141 -> 0 bytes .../zoneinfo/Atlantic/South_Georgia | Bin 139 -> 0 bytes .../zoneinfo/Atlantic/St_Helena | Bin 177 -> 0 bytes .../zoneinfo/Atlantic/Stanley | Bin 1961 -> 0 bytes .../zoneinfo/Australia/ACT | Bin 2183 -> 0 bytes .../zoneinfo/Australia/Adelaide | Bin 2202 -> 0 bytes .../zoneinfo/Australia/Brisbane | Bin 413 -> 0 bytes .../zoneinfo/Australia/Broken_Hill | Bin 2237 -> 0 bytes .../zoneinfo/Australia/Canberra | Bin 2183 -> 0 bytes .../zoneinfo/Australia/Currie | Bin 2183 -> 0 bytes .../zoneinfo/Australia/Darwin | Bin 288 -> 0 bytes .../zoneinfo/Australia/Eucla | Bin 446 -> 0 bytes .../zoneinfo/Australia/Hobart | Bin 2295 -> 0 bytes .../zoneinfo/Australia/LHI | Bin 1821 -> 0 bytes .../zoneinfo/Australia/Lindeman | Bin 483 -> 0 bytes .../zoneinfo/Australia/Lord_Howe | Bin 1821 -> 0 bytes .../zoneinfo/Australia/Melbourne | Bin 2183 -> 0 bytes .../zoneinfo/Australia/NSW | Bin 2183 -> 0 bytes .../zoneinfo/Australia/North | Bin 288 -> 0 bytes .../zoneinfo/Australia/Perth | Bin 440 -> 0 bytes .../zoneinfo/Australia/Queensland | Bin 413 -> 0 bytes .../zoneinfo/Australia/South | Bin 2202 -> 0 bytes .../zoneinfo/Australia/Sydney | Bin 2183 -> 0 bytes .../zoneinfo/Australia/Tasmania | Bin 2295 -> 0 bytes .../zoneinfo/Australia/Victoria | Bin 2183 -> 0 bytes .../zoneinfo/Australia/West | Bin 440 -> 0 bytes .../zoneinfo/Australia/Yancowinna | Bin 2237 -> 0 bytes .../zoneinfo/Brazil/Acre | Bin 574 -> 0 bytes .../zoneinfo/Brazil/DeNoronha | Bin 714 -> 0 bytes .../zoneinfo/Brazil/East | Bin 1983 -> 0 bytes .../zoneinfo/Brazil/West | Bin 602 -> 0 bytes .../local-time-20190710-git/zoneinfo/CET | Bin 2074 -> 0 bytes .../local-time-20190710-git/zoneinfo/CST6CDT | Bin 2294 -> 0 bytes .../zoneinfo/Canada/Atlantic | Bin 3424 -> 0 bytes .../zoneinfo/Canada/Central | Bin 2865 -> 0 bytes .../zoneinfo/Canada/East-Saskatchewan | Bin 980 -> 0 bytes .../zoneinfo/Canada/Eastern | Bin 3477 -> 0 bytes .../zoneinfo/Canada/Mountain | Bin 2388 -> 0 bytes .../zoneinfo/Canada/Newfoundland | Bin 3632 -> 0 bytes .../zoneinfo/Canada/Pacific | Bin 2875 -> 0 bytes .../zoneinfo/Canada/Saskatchewan | Bin 980 -> 0 bytes .../zoneinfo/Canada/Yukon | Bin 2067 -> 0 bytes .../zoneinfo/Chile/Continental | Bin 9173 -> 0 bytes .../zoneinfo/Chile/EasterIsland | Bin 8935 -> 0 bytes .../local-time-20190710-git/zoneinfo/Cuba | Bin 2411 -> 0 bytes .../local-time-20190710-git/zoneinfo/EET | Bin 1876 -> 0 bytes .../local-time-20190710-git/zoneinfo/EST | Bin 118 -> 0 bytes .../local-time-20190710-git/zoneinfo/EST5EDT | Bin 2294 -> 0 bytes .../local-time-20190710-git/zoneinfo/Egypt | Bin 9307 -> 0 bytes .../local-time-20190710-git/zoneinfo/Etc/GMT | Bin 118 -> 0 bytes .../zoneinfo/Etc/GMT+0 | Bin 118 -> 0 bytes .../zoneinfo/Etc/GMT+1 | Bin 126 -> 0 bytes .../zoneinfo/Etc/GMT+10 | Bin 130 -> 0 bytes .../zoneinfo/Etc/GMT+11 | Bin 130 -> 0 bytes .../zoneinfo/Etc/GMT+12 | Bin 130 -> 0 bytes .../zoneinfo/Etc/GMT+2 | Bin 126 -> 0 bytes .../zoneinfo/Etc/GMT+3 | Bin 126 -> 0 bytes .../zoneinfo/Etc/GMT+4 | Bin 126 -> 0 bytes .../zoneinfo/Etc/GMT+5 | Bin 126 -> 0 bytes .../zoneinfo/Etc/GMT+6 | Bin 126 -> 0 bytes .../zoneinfo/Etc/GMT+7 | Bin 126 -> 0 bytes .../zoneinfo/Etc/GMT+8 | Bin 126 -> 0 bytes .../zoneinfo/Etc/GMT+9 | Bin 126 -> 0 bytes .../zoneinfo/Etc/GMT-0 | Bin 118 -> 0 bytes .../zoneinfo/Etc/GMT-1 | Bin 127 -> 0 bytes .../zoneinfo/Etc/GMT-10 | Bin 131 -> 0 bytes .../zoneinfo/Etc/GMT-11 | Bin 131 -> 0 bytes .../zoneinfo/Etc/GMT-12 | Bin 131 -> 0 bytes .../zoneinfo/Etc/GMT-13 | Bin 131 -> 0 bytes .../zoneinfo/Etc/GMT-14 | Bin 131 -> 0 bytes .../zoneinfo/Etc/GMT-2 | Bin 127 -> 0 bytes .../zoneinfo/Etc/GMT-3 | Bin 127 -> 0 bytes .../zoneinfo/Etc/GMT-4 | Bin 127 -> 0 bytes .../zoneinfo/Etc/GMT-5 | Bin 127 -> 0 bytes .../zoneinfo/Etc/GMT-6 | Bin 127 -> 0 bytes .../zoneinfo/Etc/GMT-7 | Bin 127 -> 0 bytes .../zoneinfo/Etc/GMT-8 | Bin 127 -> 0 bytes .../zoneinfo/Etc/GMT-9 | Bin 127 -> 0 bytes .../local-time-20190710-git/zoneinfo/Etc/GMT0 | Bin 118 -> 0 bytes .../zoneinfo/Etc/Greenwich | Bin 118 -> 0 bytes .../local-time-20190710-git/zoneinfo/Etc/UCT | Bin 118 -> 0 bytes .../local-time-20190710-git/zoneinfo/Etc/UTC | Bin 118 -> 0 bytes .../zoneinfo/Etc/Universal | Bin 118 -> 0 bytes .../local-time-20190710-git/zoneinfo/Etc/Zulu | Bin 118 -> 0 bytes .../zoneinfo/Europe/Amsterdam | Bin 2917 -> 0 bytes .../zoneinfo/Europe/Andorra | Bin 1725 -> 0 bytes .../zoneinfo/Europe/Athens | Bin 2245 -> 0 bytes .../zoneinfo/Europe/Belfast | Bin 3661 -> 0 bytes .../zoneinfo/Europe/Belgrade | Bin 1917 -> 0 bytes .../zoneinfo/Europe/Berlin | Bin 2295 -> 0 bytes .../zoneinfo/Europe/Bratislava | Bin 2246 -> 0 bytes .../zoneinfo/Europe/Brussels | Bin 2944 -> 0 bytes .../zoneinfo/Europe/Bucharest | Bin 2195 -> 0 bytes .../zoneinfo/Europe/Budapest | Bin 2393 -> 0 bytes .../zoneinfo/Europe/Chisinau | Bin 2407 -> 0 bytes .../zoneinfo/Europe/Copenhagen | Bin 2134 -> 0 bytes .../zoneinfo/Europe/Dublin | Bin 3533 -> 0 bytes .../zoneinfo/Europe/Gibraltar | Bin 3035 -> 0 bytes .../zoneinfo/Europe/Guernsey | Bin 3661 -> 0 bytes .../zoneinfo/Europe/Helsinki | Bin 1883 -> 0 bytes .../zoneinfo/Europe/Isle_of_Man | Bin 3661 -> 0 bytes .../zoneinfo/Europe/Istanbul | Bin 2721 -> 0 bytes .../zoneinfo/Europe/Jersey | Bin 3661 -> 0 bytes .../zoneinfo/Europe/Kaliningrad | Bin 2233 -> 0 bytes .../zoneinfo/Europe/Kiev | Bin 2057 -> 0 bytes .../zoneinfo/Europe/Lisbon | Bin 3439 -> 0 bytes .../zoneinfo/Europe/Ljubljana | Bin 1917 -> 0 bytes .../zoneinfo/Europe/London | Bin 3661 -> 0 bytes .../zoneinfo/Europe/Luxembourg | Bin 2960 -> 0 bytes .../zoneinfo/Europe/Madrid | Bin 2593 -> 0 bytes .../zoneinfo/Europe/Malta | Bin 2603 -> 0 bytes .../zoneinfo/Europe/Mariehamn | Bin 1883 -> 0 bytes .../zoneinfo/Europe/Minsk | Bin 2067 -> 0 bytes .../zoneinfo/Europe/Monaco | Bin 2927 -> 0 bytes .../zoneinfo/Europe/Moscow | Bin 2194 -> 0 bytes .../zoneinfo/Europe/Nicosia | Bin 2002 -> 0 bytes .../zoneinfo/Europe/Oslo | Bin 2225 -> 0 bytes .../zoneinfo/Europe/Paris | Bin 2945 -> 0 bytes .../zoneinfo/Europe/Podgorica | Bin 1917 -> 0 bytes .../zoneinfo/Europe/Prague | Bin 2246 -> 0 bytes .../zoneinfo/Europe/Riga | Bin 2209 -> 0 bytes .../zoneinfo/Europe/Rome | Bin 2652 -> 0 bytes .../zoneinfo/Europe/Samara | Bin 2046 -> 0 bytes .../zoneinfo/Europe/San_Marino | Bin 2652 -> 0 bytes .../zoneinfo/Europe/Sarajevo | Bin 1917 -> 0 bytes .../zoneinfo/Europe/Simferopol | Bin 2113 -> 0 bytes .../zoneinfo/Europe/Skopje | Bin 1917 -> 0 bytes .../zoneinfo/Europe/Sofia | Bin 2074 -> 0 bytes .../zoneinfo/Europe/Stockholm | Bin 1892 -> 0 bytes .../zoneinfo/Europe/Tallinn | Bin 2175 -> 0 bytes .../zoneinfo/Europe/Tirane | Bin 2084 -> 0 bytes .../zoneinfo/Europe/Tiraspol | Bin 2407 -> 0 bytes .../zoneinfo/Europe/Uzhgorod | Bin 2077 -> 0 bytes .../zoneinfo/Europe/Vaduz | Bin 1799 -> 0 bytes .../zoneinfo/Europe/Vatican | Bin 2652 -> 0 bytes .../zoneinfo/Europe/Vienna | Bin 2211 -> 0 bytes .../zoneinfo/Europe/Vilnius | Bin 2173 -> 0 bytes .../zoneinfo/Europe/Volgograd | Bin 1982 -> 0 bytes .../zoneinfo/Europe/Warsaw | Bin 2679 -> 0 bytes .../zoneinfo/Europe/Zagreb | Bin 1917 -> 0 bytes .../zoneinfo/Europe/Zaporozhye | Bin 2085 -> 0 bytes .../zoneinfo/Europe/Zurich | Bin 1920 -> 0 bytes .../local-time-20190710-git/zoneinfo/GMT | Bin 118 -> 0 bytes .../zoneinfo/Greenwich | Bin 118 -> 0 bytes .../local-time-20190710-git/zoneinfo/HST | Bin 119 -> 0 bytes .../local-time-20190710-git/zoneinfo/Hongkong | Bin 1135 -> 0 bytes .../local-time-20190710-git/zoneinfo/Iceland | Bin 1141 -> 0 bytes .../zoneinfo/Indian/Antananarivo | Bin 227 -> 0 bytes .../zoneinfo/Indian/Chagos | Bin 187 -> 0 bytes .../zoneinfo/Indian/Christmas | Bin 140 -> 0 bytes .../zoneinfo/Indian/Cocos | Bin 143 -> 0 bytes .../zoneinfo/Indian/Comoro | Bin 157 -> 0 bytes .../zoneinfo/Indian/Kerguelen | Bin 157 -> 0 bytes .../zoneinfo/Indian/Mahe | Bin 157 -> 0 bytes .../zoneinfo/Indian/Maldives | Bin 178 -> 0 bytes .../zoneinfo/Indian/Mauritius | Bin 157 -> 0 bytes .../zoneinfo/Indian/Mayotte | Bin 157 -> 0 bytes .../zoneinfo/Indian/Reunion | Bin 157 -> 0 bytes .../local-time-20190710-git/zoneinfo/Iran | Bin 1622 -> 0 bytes .../local-time-20190710-git/zoneinfo/Israel | Bin 2197 -> 0 bytes .../local-time-20190710-git/zoneinfo/Jamaica | Bin 481 -> 0 bytes .../local-time-20190710-git/zoneinfo/Japan | Bin 331 -> 0 bytes .../zoneinfo/Kwajalein | Bin 211 -> 0 bytes .../local-time-20190710-git/zoneinfo/Libya | Bin 599 -> 0 bytes .../local-time-20190710-git/zoneinfo/MET | Bin 2074 -> 0 bytes .../local-time-20190710-git/zoneinfo/MST | Bin 118 -> 0 bytes .../local-time-20190710-git/zoneinfo/MST7MDT | Bin 2294 -> 0 bytes .../zoneinfo/Mexico/BajaNorte | Bin 2342 -> 0 bytes .../zoneinfo/Mexico/BajaSur | Bin 1534 -> 0 bytes .../zoneinfo/Mexico/General | Bin 1604 -> 0 bytes .../zoneinfo/Mideast/Riyadh87 | Bin 8669 -> 0 bytes .../zoneinfo/Mideast/Riyadh88 | Bin 8523 -> 0 bytes .../zoneinfo/Mideast/Riyadh89 | Bin 8523 -> 0 bytes .../local-time-20190710-git/zoneinfo/Navajo | Bin 2427 -> 0 bytes .../local-time-20190710-git/zoneinfo/PST8PDT | Bin 2294 -> 0 bytes .../zoneinfo/Pacific/Apia | Bin 214 -> 0 bytes .../zoneinfo/Pacific/Auckland | Bin 2434 -> 0 bytes .../zoneinfo/Pacific/Chatham | Bin 2018 -> 0 bytes .../zoneinfo/Pacific/Easter | Bin 8935 -> 0 bytes .../zoneinfo/Pacific/Efate | Bin 464 -> 0 bytes .../zoneinfo/Pacific/Enderbury | Bin 204 -> 0 bytes .../zoneinfo/Pacific/Fakaofo | Bin 140 -> 0 bytes .../zoneinfo/Pacific/Fiji | Bin 240 -> 0 bytes .../zoneinfo/Pacific/Funafuti | Bin 141 -> 0 bytes .../zoneinfo/Pacific/Galapagos | Bin 197 -> 0 bytes .../zoneinfo/Pacific/Gambier | Bin 159 -> 0 bytes .../zoneinfo/Pacific/Guadalcanal | Bin 158 -> 0 bytes .../zoneinfo/Pacific/Guam | Bin 199 -> 0 bytes .../zoneinfo/Pacific/Honolulu | Bin 312 -> 0 bytes .../zoneinfo/Pacific/Johnston | Bin 119 -> 0 bytes .../zoneinfo/Pacific/Kiritimati | Bin 204 -> 0 bytes .../zoneinfo/Pacific/Kosrae | Bin 188 -> 0 bytes .../zoneinfo/Pacific/Kwajalein | Bin 211 -> 0 bytes .../zoneinfo/Pacific/Majuro | Bin 171 -> 0 bytes .../zoneinfo/Pacific/Marquesas | Bin 162 -> 0 bytes .../zoneinfo/Pacific/Midway | Bin 268 -> 0 bytes .../zoneinfo/Pacific/Nauru | Bin 240 -> 0 bytes .../zoneinfo/Pacific/Niue | Bin 200 -> 0 bytes .../zoneinfo/Pacific/Norfolk | Bin 182 -> 0 bytes .../zoneinfo/Pacific/Noumea | Bin 300 -> 0 bytes .../zoneinfo/Pacific/Pago_Pago | Bin 290 -> 0 bytes .../zoneinfo/Pacific/Palau | Bin 140 -> 0 bytes .../zoneinfo/Pacific/Pitcairn | Bin 177 -> 0 bytes .../zoneinfo/Pacific/Ponape | Bin 144 -> 0 bytes .../zoneinfo/Pacific/Port_Moresby | Bin 163 -> 0 bytes .../zoneinfo/Pacific/Rarotonga | Bin 548 -> 0 bytes .../zoneinfo/Pacific/Saipan | Bin 229 -> 0 bytes .../zoneinfo/Pacific/Samoa | Bin 290 -> 0 bytes .../zoneinfo/Pacific/Tahiti | Bin 160 -> 0 bytes .../zoneinfo/Pacific/Tarawa | Bin 144 -> 0 bytes .../zoneinfo/Pacific/Tongatapu | Bin 313 -> 0 bytes .../zoneinfo/Pacific/Truk | Bin 144 -> 0 bytes .../zoneinfo/Pacific/Wake | Bin 144 -> 0 bytes .../zoneinfo/Pacific/Wallis | Bin 141 -> 0 bytes .../zoneinfo/Pacific/Yap | Bin 144 -> 0 bytes .../local-time-20190710-git/zoneinfo/Poland | Bin 2679 -> 0 bytes .../local-time-20190710-git/zoneinfo/Portugal | Bin 3439 -> 0 bytes .../zoneinfo/Singapore | Bin 402 -> 0 bytes .../local-time-20190710-git/zoneinfo/Turkey | Bin 2721 -> 0 bytes .../zoneinfo/US/Alaska | Bin 2358 -> 0 bytes .../zoneinfo/US/Aleutian | Bin 2353 -> 0 bytes .../zoneinfo/US/Arizona | Bin 327 -> 0 bytes .../zoneinfo/US/Central | Bin 3543 -> 0 bytes .../zoneinfo/US/East-Indiana | Bin 1649 -> 0 bytes .../zoneinfo/US/Eastern | Bin 3519 -> 0 bytes .../zoneinfo/US/Hawaii | Bin 312 -> 0 bytes .../zoneinfo/US/Indiana-Starke | Bin 2395 -> 0 bytes .../zoneinfo/US/Michigan | Bin 2202 -> 0 bytes .../zoneinfo/US/Mountain | Bin 2427 -> 0 bytes .../zoneinfo/US/Pacific | Bin 2819 -> 0 bytes .../local-time-20190710-git/zoneinfo/US/Samoa | Bin 290 -> 0 bytes .../local-time-20190710-git/zoneinfo/UTC | Bin 118 -> 0 bytes .../zoneinfo/Universal | Bin 118 -> 0 bytes .../local-time-20190710-git/zoneinfo/WET | Bin 1873 -> 0 bytes .../local-time-20190710-git/zoneinfo/Zulu | Bin 118 -> 0 bytes .../software/prove-20171130-git/.gitignore | 3 - .../software/prove-20171130-git/.travis.yml | 50 - .../prove-20171130-git/README.markdown | 369 - .../prove-20171130-git/cl-test-more.asd | 5 - .../prove-20171130-git/images/dot.png | Bin 141441 -> 0 bytes .../prove-20171130-git/images/failed.png | Bin 159759 -> 0 bytes .../prove-20171130-git/images/fiveam.png | Bin 182975 -> 0 bytes .../prove-20171130-git/images/list.png | Bin 190110 -> 0 bytes .../prove-20171130-git/images/passed.png | Bin 144572 -> 0 bytes .../prove-20171130-git/images/tap.png | Bin 170815 -> 0 bytes .../prove-20171130-git/prove-asdf.asd | 5 - .../prove-20171130-git/prove-test.asd | 15 - .../software/prove-20171130-git/prove.asd | 27 - .../prove-20171130-git/roswell/run-prove.ros | 58 - .../software/prove-20171130-git/src/asdf.lisp | 144 - .../prove-20171130-git/src/color.lisp | 37 - .../prove-20171130-git/src/output.lisp | 13 - .../prove-20171130-git/src/prove.lisp | 87 - .../prove-20171130-git/src/report.lisp | 113 - .../prove-20171130-git/src/reporter.lisp | 175 - .../prove-20171130-git/src/reporter/dot.lisp | 42 - .../src/reporter/fiveam.lisp | 71 - .../prove-20171130-git/src/reporter/list.lisp | 171 - .../prove-20171130-git/src/reporter/tap.lisp | 70 - .../prove-20171130-git/src/suite.lisp | 92 - .../software/prove-20171130-git/src/test.lisp | 366 - .../software/prove-20171130-git/t/prove.lisp | 166 - .../software/prove-20171130-git/t/utils.lisp | 118 - .../software/quickproject-1.4.1/.gitignore | 1 - .../software/quickproject-1.4.1/LICENSE.txt | 19 - .../software/quickproject-1.4.1/README.txt | 8 - .../default-template/README.md | 12 - .../default-template/application.lisp | 5 - .../default-template/package.lisp | 6 - .../default-template/system.asd | 13 - .../quickproject-1.4.1/doc/LICENSE.txt | 19 - .../quickproject-1.4.1/doc/index.html | 265 - .../software/quickproject-1.4.1/doc/style.css | 83 - .../software/quickproject-1.4.1/package.lisp | 23 - .../quickproject-1.4.1/quickproject.asd | 12 - .../quickproject-1.4.1/quickproject.lisp | 144 - .../quicklisp/software/slime-v2.24/.gitref | 1 - .../software/slime-v2.24/.travis.yml | 41 - .../software/slime-v2.24/CONTRIBUTING.md | 153 - .../quicklisp/software/slime-v2.24/Makefile | 113 - .../dists/quicklisp/software/slime-v2.24/NEWS | 609 - .../quicklisp/software/slime-v2.24/PROBLEMS | 94 - .../quicklisp/software/slime-v2.24/README.md | 78 - .../software/slime-v2.24/contrib/Makefile | 92 - .../software/slime-v2.24/contrib/README.md | 14 - .../software/slime-v2.24/contrib/bridge.el | 472 - .../slime-v2.24/contrib/inferior-slime.el | 133 - .../slime-v2.24/contrib/slime-asdf.el | 313 - .../slime-v2.24/contrib/slime-autodoc.el | 216 - .../slime-v2.24/contrib/slime-banner.el | 35 - .../contrib/slime-buffer-streams.el | 36 - .../slime-v2.24/contrib/slime-c-p-c.el | 305 - .../slime-v2.24/contrib/slime-cl-indent.el | 1821 -- .../slime-v2.24/contrib/slime-clipboard.el | 172 - .../contrib/slime-compiler-notes-tree.el | 184 - .../contrib/slime-editing-commands.el | 183 - .../contrib/slime-enclosing-context.el | 226 - .../contrib/slime-fancy-inspector.el | 42 - .../slime-v2.24/contrib/slime-fancy-trace.el | 68 - .../slime-v2.24/contrib/slime-fancy.el | 38 - .../contrib/slime-fontifying-fu.el | 231 - .../slime-v2.24/contrib/slime-fuzzy.el | 604 - .../contrib/slime-highlight-edits.el | 81 - .../slime-v2.24/contrib/slime-hyperdoc.el | 48 - .../slime-v2.24/contrib/slime-indentation.el | 31 - .../contrib/slime-listener-hooks.el | 11 - .../slime-v2.24/contrib/slime-macrostep.el | 129 - .../slime-v2.24/contrib/slime-mdot-fu.el | 31 - .../slime-v2.24/contrib/slime-media.el | 46 - .../slime-v2.24/contrib/slime-mrepl.el | 150 - .../slime-v2.24/contrib/slime-package-fu.el | 320 - .../slime-v2.24/contrib/slime-parse.el | 358 - .../contrib/slime-presentation-streams.el | 18 - .../contrib/slime-presentations.el | 872 - .../slime-v2.24/contrib/slime-quicklisp.el | 51 - .../slime-v2.24/contrib/slime-references.el | 156 - .../slime-v2.24/contrib/slime-repl.el | 1770 -- .../slime-v2.24/contrib/slime-sbcl-exts.el | 34 - .../slime-v2.24/contrib/slime-scheme.el | 40 - .../slime-v2.24/contrib/slime-scratch.el | 48 - .../slime-v2.24/contrib/slime-snapshot.el | 34 - .../slime-v2.24/contrib/slime-sprof.el | 224 - .../slime-v2.24/contrib/slime-trace-dialog.el | 837 - .../slime-v2.24/contrib/slime-tramp.el | 121 - .../contrib/slime-typeout-frame.el | 92 - .../slime-v2.24/contrib/slime-xref-browser.el | 99 - .../slime-v2.24/contrib/swank-arglists.lisp | 1620 -- .../slime-v2.24/contrib/swank-asdf.lisp | 541 - .../contrib/swank-buffer-streams.lisp | 39 - .../slime-v2.24/contrib/swank-c-p-c.lisp | 298 - .../slime-v2.24/contrib/swank-clipboard.lisp | 71 - .../contrib/swank-fancy-inspector.lisp | 1006 - .../slime-v2.24/contrib/swank-fuzzy.lisp | 706 - .../slime-v2.24/contrib/swank-goo.goo | 995 - .../slime-v2.24/contrib/swank-hyperdoc.lisp | 18 - .../slime-v2.24/contrib/swank-ikarus.ss | 86 - .../contrib/swank-indentation.lisp | 140 - .../software/slime-v2.24/contrib/swank-jolt.k | 998 - .../slime-v2.24/contrib/swank-kawa.scm | 2504 --- .../slime-v2.24/contrib/swank-larceny.scm | 176 - .../contrib/swank-listener-hooks.lisp | 91 - .../slime-v2.24/contrib/swank-macrostep.lisp | 227 - .../slime-v2.24/contrib/swank-media.lisp | 25 - .../slime-v2.24/contrib/swank-mit-scheme.scm | 870 - .../slime-v2.24/contrib/swank-mlworks.sml | 348 - .../slime-v2.24/contrib/swank-mrepl.lisp | 162 - .../slime-v2.24/contrib/swank-package-fu.lisp | 65 - .../contrib/swank-presentation-streams.lisp | 334 - .../contrib/swank-presentations.lisp | 246 - .../slime-v2.24/contrib/swank-quicklisp.lisp | 17 - .../slime-v2.24/contrib/swank-r6rs.scm | 416 - .../slime-v2.24/contrib/swank-repl.lisp | 441 - .../slime-v2.24/contrib/swank-sbcl-exts.lisp | 67 - .../slime-v2.24/contrib/swank-snapshot.lisp | 67 - .../slime-v2.24/contrib/swank-sprof.lisp | 154 - .../contrib/swank-trace-dialog.lisp | 264 - .../slime-v2.24/contrib/swank-util.lisp | 63 - .../software/slime-v2.24/contrib/swank.rb | 385 - .../contrib/test/slime-autodoc-tests.el | 199 - .../contrib/test/slime-c-p-c-tests.el | 140 - .../contrib/test/slime-cl-indent-test.txt | 1006 - .../test/slime-enclosing-context-tests.el | 46 - .../contrib/test/slime-fontifying-fu-tests.el | 120 - .../contrib/test/slime-indentation-tests.el | 81 - .../contrib/test/slime-macrostep-tests.el | 287 - .../contrib/test/slime-mdot-fu-tests.el | 43 - .../contrib/test/slime-parse-tests.el | 63 - .../contrib/test/slime-presentations-tests.el | 61 - .../contrib/test/slime-repl-tests.el | 343 - .../software/slime-v2.24/doc/.cvsignore | 21 - .../software/slime-v2.24/doc/Makefile | 116 - .../slime-v2.24/doc/contributors.texi | 67 - .../slime-v2.24/doc/slime-refcard.pdf | Bin 41845 -> 0 bytes .../slime-v2.24/doc/slime-refcard.tex | 123 - .../software/slime-v2.24/doc/slime-small.eps | 995 - .../software/slime-v2.24/doc/slime-small.pdf | Bin 7407 -> 0 bytes .../software/slime-v2.24/doc/slime.css | 22 - .../software/slime-v2.24/doc/slime.texi | 3544 ---- .../slime-v2.24/doc/texinfo-tabulate.awk | 21 - .../software/slime-v2.24/lib/.nosearch | 1 - .../software/slime-v2.24/lib/cl-lib.el | 410 - .../software/slime-v2.24/lib/ert-x.el | 2544 --- .../quicklisp/software/slime-v2.24/lib/ert.el | 2544 --- .../software/slime-v2.24/lib/hyperspec.el | 2511 --- .../software/slime-v2.24/lib/macrostep.el | 1122 - .../software/slime-v2.24/metering.lisp | 1213 -- .../software/slime-v2.24/nregex.lisp | 523 - .../software/slime-v2.24/packages.lisp | 202 - .../slime-v2.24/sbcl-pprint-patch.lisp | 332 - .../software/slime-v2.24/slime-autoloads.el | 51 - .../software/slime-v2.24/slime-tests.el | 1459 -- .../quicklisp/software/slime-v2.24/slime.el | 7659 ------- .../software/slime-v2.24/start-swank.lisp | 20 - .../software/slime-v2.24/swank-loader.lisp | 376 - .../quicklisp/software/slime-v2.24/swank.asd | 37 - .../quicklisp/software/slime-v2.24/swank.lisp | 3795 ---- .../software/slime-v2.24/swank/abcl.lisp | 847 - .../software/slime-v2.24/swank/allegro.lisp | 1070 - .../software/slime-v2.24/swank/backend.lisp | 1579 -- .../software/slime-v2.24/swank/ccl.lisp | 868 - .../software/slime-v2.24/swank/clasp.lisp | 809 - .../software/slime-v2.24/swank/clisp.lisp | 930 - .../software/slime-v2.24/swank/cmucl.lisp | 2470 --- .../software/slime-v2.24/swank/corman.lisp | 583 - .../software/slime-v2.24/swank/ecl.lisp | 1098 - .../software/slime-v2.24/swank/gray.lisp | 207 - .../software/slime-v2.24/swank/lispworks.lisp | 1020 - .../software/slime-v2.24/swank/match.lisp | 242 - .../software/slime-v2.24/swank/mezzano.lisp | 730 - .../software/slime-v2.24/swank/mkcl.lisp | 933 - .../software/slime-v2.24/swank/rpc.lisp | 162 - .../software/slime-v2.24/swank/sbcl.lisp | 2025 -- .../software/slime-v2.24/swank/scl.lisp | 1726 -- .../slime-v2.24/swank/source-file-cache.lisp | 136 - .../slime-v2.24/swank/source-path-parser.lisp | 239 - .../quicklisp/software/slime-v2.24/xref.lisp | 2906 --- .../software/split-sequence-v2.0.0/LICENSE | 21 - .../software/split-sequence-v2.0.0/README.md | 109 - .../software/split-sequence-v2.0.0/api.lisp | 79 - .../split-sequence-v2.0.0/documentation.lisp | 41 - .../extended-sequence.lisp | 100 - .../software/split-sequence-v2.0.0/list.lisp | 116 - .../original-message.txt | 150 - .../split-sequence-v2.0.0/package.lisp | 37 - .../split-sequence-v2.0.0/split-sequence.asd | 28 - .../software/split-sequence-v2.0.0/tests.lisp | 268 - .../split-sequence-v2.0.0/vector.lisp | 94 - .../split-sequence-v2.0.0/version.sexp | 2 - .../trivial-features-20190710-git/.travis.yml | 30 - .../trivial-features-20190710-git/COPYRIGHT | 21 - .../trivial-features-20190710-git/README.md | 32 - .../trivial-features-20190710-git/SPEC.md | 86 - .../release.lisp | 247 - .../src/tf-abcl.lisp | 46 - .../src/tf-allegro.lisp | 49 - .../src/tf-clasp.lisp | 36 - .../src/tf-clisp.lisp | 72 - .../src/tf-cmucl.lisp | 44 - .../src/tf-corman.lisp | 39 - .../src/tf-ecl.lisp | 55 - .../src/tf-lispworks.lisp | 58 - .../src/tf-mcl.lisp | 41 - .../src/tf-mezzano.lisp | 39 - .../src/tf-mkcl.lisp | 49 - .../src/tf-mocl.lisp | 40 - .../src/tf-openmcl.lisp | 47 - .../src/tf-sbcl.lisp | 51 - .../src/tf-scl.lisp | 47 - .../src/tf-xcl.lisp | 39 - .../tests/package.lisp | 34 - .../tests/sysinfo.lisp | 49 - .../tests/tests.lisp | 130 - .../tests/utsname.lisp | 36 - .../trivial-features-tests.asd | 52 - .../trivial-features.asd | 59 - .../trivial-gray-streams-20181018-git/COPYING | 22 - .../Makefile | 3 - .../trivial-gray-streams-20181018-git/README | 40 - .../build.xcvb | 7 - .../package.lisp | 77 - .../streams.lisp | 292 - .../test/package.lisp | 6 - .../test/run-on-many-lisps.lisp | 66 - .../test/test-framework.lisp | 60 - .../test/test.lisp | 213 - .../trivial-gray-streams-test.asd | 10 - .../trivial-gray-streams.asd | 10 - .../software/usocket-0.8.3/.gitignore | 1 - .../quicklisp/software/usocket-0.8.3/CHANGES | 211 - .../software/usocket-0.8.3/CONTRIBUTORS | 47 - .../quicklisp/software/usocket-0.8.3/LICENSE | 25 - .../software/usocket-0.8.3/README.md | 148 - .../quicklisp/software/usocket-0.8.3/TODO | 5 - .../software/usocket-0.8.3/backend/.gitignore | 1 - .../software/usocket-0.8.3/backend/abcl.lisp | 436 - .../usocket-0.8.3/backend/allegro.lisp | 228 - .../software/usocket-0.8.3/backend/clasp.lisp | 158 - .../software/usocket-0.8.3/backend/clisp.lisp | 715 - .../usocket-0.8.3/backend/clozure.lisp | 73 - .../software/usocket-0.8.3/backend/cmucl.lisp | 298 - .../software/usocket-0.8.3/backend/ecl.lisp | 152 - .../usocket-0.8.3/backend/genera.lisp | 264 - .../software/usocket-0.8.3/backend/iolib.lisp | 290 - .../usocket-0.8.3/backend/lispworks.lisp | 1001 - .../software/usocket-0.8.3/backend/mcl.lisp | 271 - .../usocket-0.8.3/backend/mezzano.lisp | 99 - .../software/usocket-0.8.3/backend/mocl.lisp | 155 - .../usocket-0.8.3/backend/openmcl.lisp | 268 - .../software/usocket-0.8.3/backend/sbcl.lisp | 935 - .../software/usocket-0.8.3/backend/scl.lisp | 266 - .../software/usocket-0.8.3/condition.lisp | 237 - .../software/usocket-0.8.3/doc/intro.dita | 10 - .../software/usocket-0.8.3/doc/reference.dita | 11 - .../usocket-0.8.3/doc/usocket.ditamap | 11 - .../usocket-0.8.3/notes/abcl-socket.txt | 18 - .../notes/active-sockets-apis.txt | 75 - .../usocket-0.8.3/notes/address-apis.txt | 73 - .../usocket-0.8.3/notes/allegro-socket.txt | 46 - .../software/usocket-0.8.3/notes/backends.txt | 60 - .../usocket-0.8.3/notes/clisp-sockets.txt | 38 - .../usocket-0.8.3/notes/cmucl-sockets.txt | 69 - .../software/usocket-0.8.3/notes/design.txt | 136 - .../software/usocket-0.8.3/notes/errors.txt | 20 - .../usocket-0.8.3/notes/lw-sockets.txt | 41 - .../usocket-0.8.3/notes/openmcl-sockets.txt | 27 - .../usocket-0.8.3/notes/sb-bsd-sockets.txt | 114 - .../usocket-0.8.3/notes/usock-sockets.txt | 28 - .../software/usocket-0.8.3/option.lisp | 353 - .../software/usocket-0.8.3/package.lisp | 126 - .../software/usocket-0.8.3/server.lisp | 112 - .../software/usocket-0.8.3/test/package.lisp | 11 - .../usocket-0.8.3/test/test-condition.lisp | 28 - .../usocket-0.8.3/test/test-datagram.lisp | 124 - .../usocket-0.8.3/test/test-usocket.lisp | 179 - .../usocket-0.8.3/test/udp-one-shot.lisp | 86 - .../usocket-0.8.3/test/wait-for-input.lisp | 140 - .../software/usocket-0.8.3/usocket-server.asd | 14 - .../software/usocket-0.8.3/usocket-test.asd | 23 - .../software/usocket-0.8.3/usocket.asd | 58 - .../software/usocket-0.8.3/usocket.lisp | 727 - .../vendor/OpenTransportUDP.lisp | 146 - .../software/usocket-0.8.3/vendor/kqueue.lisp | 506 - .../software/usocket-0.8.3/version.sexp | 1 - .../software/vom-20160825-git/LICENSE | 19 - .../software/vom-20160825-git/README.md | 82 - .../software/vom-20160825-git/vom.asd | 6 - .../software/vom-20160825-git/vom.lisp | 204 - .../software/yason-v0.7.8/.gitignore | 1 - .../software/yason-v0.7.8/.pre-release.sh | 1 - .../quicklisp/software/yason-v0.7.8/CHANGELOG | 28 - .../quicklisp/software/yason-v0.7.8/LICENSE | 30 - .../quicklisp/software/yason-v0.7.8/README.md | 13 - .../software/yason-v0.7.8/clixdoc.xsl | 411 - .../quicklisp/software/yason-v0.7.8/doc.xml | 748 - .../software/yason-v0.7.8/encode.lisp | 388 - .../software/yason-v0.7.8/index.html | 764 - .../software/yason-v0.7.8/package.lisp | 50 - .../software/yason-v0.7.8/parse.lisp | 258 - .../software/yason-v0.7.8/render-doc.sh | 5 - .../quicklisp/software/yason-v0.7.8/test.lisp | 116 - .../quicklisp/software/yason-v0.7.8/yason.asd | 33 - sbcl/.quicklisp/dists/quicklisp/systems.cdb | Bin 497817 -> 0 bytes sbcl/.quicklisp/dists/quicklisp/systems.txt | 4335 ---- .../local-projects/system-index.txt | 0 .../.quicklisp/quicklisp/bundle-template.lisp | 161 - sbcl/.quicklisp/quicklisp/bundle.lisp | 362 - sbcl/.quicklisp/quicklisp/cdb.lisp | 356 - sbcl/.quicklisp/quicklisp/client-info.lisp | 262 - sbcl/.quicklisp/quicklisp/client-update.lisp | 106 - sbcl/.quicklisp/quicklisp/client.lisp | 131 - sbcl/.quicklisp/quicklisp/config.lisp | 40 - sbcl/.quicklisp/quicklisp/deflate.lisp | 785 - sbcl/.quicklisp/quicklisp/dist-update.lisp | 164 - sbcl/.quicklisp/quicklisp/dist.lisp | 1168 - sbcl/.quicklisp/quicklisp/fetch-gzipped.lisp | 29 - sbcl/.quicklisp/quicklisp/http.lisp | 859 - sbcl/.quicklisp/quicklisp/impl-util.lisp | 340 - sbcl/.quicklisp/quicklisp/impl.lisp | 301 - sbcl/.quicklisp/quicklisp/local-projects.lisp | 138 - sbcl/.quicklisp/quicklisp/minitar.lisp | 192 - sbcl/.quicklisp/quicklisp/misc.lisp | 19 - sbcl/.quicklisp/quicklisp/network.lisp | 137 - sbcl/.quicklisp/quicklisp/package.lisp | 340 - sbcl/.quicklisp/quicklisp/progress.lisp | 156 - sbcl/.quicklisp/quicklisp/quicklisp.asd | 36 - sbcl/.quicklisp/quicklisp/setup.lisp | 249 - sbcl/.quicklisp/quicklisp/utils.lisp | 124 - sbcl/.quicklisp/quicklisp/version.txt | 1 - sbcl/.quicklisp/setup.lisp | 135 - sbcl/.quicklisp/tmp/install-dist-distinfo.txt | 7 - sbcl/.quicklisp/tmp/quicklisp.tar | Bin 256000 -> 0 bytes sbcl/.quicklisp/tmp/release-install.tar | Bin 40960 -> 0 bytes sbcl/.sbclrc | 16 - sbcl/quicklisp.lisp | 1757 -- 1471 files changed, 243918 deletions(-) delete mode 160000 fzf/.fzf delete mode 100644 sbcl/.quicklisp/asdf.lisp delete mode 100644 sbcl/.quicklisp/client-info.sexp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/alexandria-20191227-git.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/anaphora-20191007-git.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/babel-20191130-git.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/bordeaux-threads-v0.8.7.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/cffi_0.20.1.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/cl-ansi-text-20150804-git.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/cl-colors-20180328-git.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/cl-emb-20190521-git.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/cl-fad-20190813-git.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/cl-ppcre-20190521-git.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/cl-project-20190521-git.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/croatoan-20191227-git.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/html-template-20171227-git.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/let-plus-20191130-git.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/local-time-20190710-git.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/prove-20171130-git.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/quickproject-1.4.1.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/slime-v2.24.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/split-sequence-v2.0.0.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/trivial-features-20190710-git.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/trivial-gray-streams-20181018-git.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/usocket-0.8.3.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/vom-20160825-git.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/yason-v0.7.8.tgz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/distinfo.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/enabled.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/alexandria.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/anaphora.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/babel.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/bordeaux-threads.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/cffi.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-ansi-text.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-colors.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-emb.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-fad.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-ppcre.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-project.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/croatoan.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/html-template.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/let-plus.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/local-time.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/prove.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/quickproject.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/slime.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/split-sequence.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/trivial-features.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/trivial-gray-streams.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/usocket.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/vom.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/yason.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/alexandria-tests.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/alexandria.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/anaphora.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/babel-streams.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/babel-tests.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/babel.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/bordeaux-threads.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-examples.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-grovel.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-libffi.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-tests.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-toolchain.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-uffi-compat.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-ansi-text-test.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-ansi-text.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-colors.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-emb.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-fad.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-postgres+local-time.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-ppcre-unicode.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-ppcre.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-project-test.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-project.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-test-more.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/croatoan-test.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/croatoan.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/html-template.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/let-plus.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/local-time.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/prove-asdf.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/prove-test.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/prove.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/quickproject.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/split-sequence.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/swank.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-features-tests.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-features.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-gray-streams-test.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-gray-streams.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/usocket-server.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/usocket-test.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/usocket.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/vom.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/yason.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/preference.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/releases.cdb delete mode 100644 sbcl/.quicklisp/dists/quicklisp/releases.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/.boring delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/.gitignore delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/AUTHORS delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/LICENCE delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/README delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/alexandria-tests.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/alexandria.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/arrays.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/binding.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/conditions.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/control-flow.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/definitions.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/doc/.gitignore delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/doc/Makefile delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/doc/alexandria.texinfo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/doc/docstrings.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/features.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/functions.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/hash-tables.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/io.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/lists.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/macros.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/numbers.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/sequences.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/strings.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/symbols.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/tests.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/types.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/.travis.yml delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/LICENSE delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/README.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/anaphora.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/anaphora.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/early.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/packages.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/symbolic.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/tests.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/.travis.yml delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/COPYRIGHT delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/HEADER delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/NOTES delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/README.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel-streams.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel-tests.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/Makefile delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/babel.texinfo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/license.texinfo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/macros.texinfo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/scripts/release.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ascii.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-cp1251.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-cp1252.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ebcdic-int.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ebcdic.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-gbk.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-iso-8859.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-jpn.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-koi8.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-unicode.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/encodings.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/external-format.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/gbk-map.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/jpn-table.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/packages.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/sharp-backslash.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/streams.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/strings.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ascii.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ascii.txt-utf8 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/benchmarks.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ebcdic-us.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ebcdic-us.txt-utf8 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/gen-test-files.sh delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/streams.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/tests.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16-with-le-bom.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16.txt-utf8 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32-with-le-bom.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32.txt-utf8 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-8.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-8.txt-utf8 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/.travis.yml delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/CONTRIBUTORS delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/LICENSE delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/README delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/bordeaux-threads.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/site/index.html delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/site/style.css delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/bordeaux-threads.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/condition-variables.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/default-implementations.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-abcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-allegro.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clasp.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clisp.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clozure.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-cmucl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-corman.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-ecl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-genera.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-lispworks-condition-variables.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-lispworks.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-mcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-mkcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-null.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-sbcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-scl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/pkgdcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/test/bordeaux-threads-test.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/version.sexp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/.gitignore delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/.travis.yml delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/COPYRIGHT delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/HEADER delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/Makefile delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/README.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/TODO delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-examples.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-grovel.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-libffi.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-tests.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-toolchain.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-uffi-compat.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/Makefile delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/allegro-internals.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/cffi-manual.texinfo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/cffi-sys-spec.texinfo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/colorize-lisp-examples.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/gendocs.sh delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/gendocs_template delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/mem-vector.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/shareable-vectors.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/style.css delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/examples.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/gethostname.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/gettimeofday.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/grovel-example.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/main-example.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/mapping.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/run-examples.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/translator-test.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/wrapper-example.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/asdf.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/common.h delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/grovel.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/funcall.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-functions.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-types.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/type-descriptors.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/scripts/release.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/asdf.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/c2ffi.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/generator.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-abcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-allegro.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-clasp.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-clisp.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-cmucl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-corman.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-ecl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-gcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-lispworks.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-mcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-mkcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-openmcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-sbcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-scl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/early-types.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/enum.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/features.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/foreign-vars.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/functions.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/libraries.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/strings.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/structures.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/types.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/utils.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/GNUmakefile delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/Makefile delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/arrays.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/bindings.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/callbacks.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/compile.bat delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/defcfun.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/enum.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/foreign-globals.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/fsbv.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/funcall.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/grovel.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libfsbv.c delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libtest.c delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libtest2.c delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/memory.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/misc-types.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/misc.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/random-tester.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/run-tests.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/strings.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/struct.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/test-asdf.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/test-static-link.sh delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/union.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/bundle.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/c-toolchain.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/static-link.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/uffi-compat/uffi-compat.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/uffi-compat/uffi.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/.travis.yml delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/README.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/ci-test-run.sh delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/cl-ansi-text-test.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/cl-ansi-text.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/cl-ansi-text.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/run-tests.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/test/cl-ansi-text-test.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/Makefile delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/README.org delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/cl-colors.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/colornames.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/colors.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/hexcolors.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/introduction.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/package-template.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/parse-x11-colors.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/test.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/LICENSE.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/README.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/TODO delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/cl-emb.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/emb.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/examples.css delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/examples.html delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/lsp-LICENSE.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/packages.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/CHANGELOG delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/LICENSE delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/README delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/cl-fad.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/cl-fad.system delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/corman.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/docs/index.html delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/fad.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/fad.test.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/load.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/openmcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/packages.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/packages.test.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/path.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/temporary-files.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/temporary-files.test.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/CHANGELOG delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/README.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/api.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/charmap.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/charset.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/chartest.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre-unicode.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre-unicode/packages.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre-unicode/resolver.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/closures.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/convert.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/docs/index.html delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/errors.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/lexer.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/optimize.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/packages.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/parser.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/regex-class-util.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/regex-class.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/repetition-closures.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/scanner.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/specials.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/packages.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/perl-tests.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/perltest.pl delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/perltestdata delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/perltestinput delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/simple delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/tests.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/unicode-tests.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/unicodetestdata delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/util.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/.gitignore delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/.travis.yml delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/README.markdown delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/cl-project-test.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/cl-project.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/roswell/make-project.ros delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/.gitignore delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/README.markdown delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/README.org delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/skeleton.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/src/main.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/tests/main.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/cl-project.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/file.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/io.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/middleware.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/skeleton.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/specials.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/tests/cl-project.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/LICENSE delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/README delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/croatoan-test.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/croatoan.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/doc/slime.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/add_wch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/addch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/addstr.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/attr.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/beep.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/bkgd.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/bkgrnd.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/border.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/border_set.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/clear.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/color.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/default_colors.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/define_key.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/delch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/deleteln.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/extend.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/get_wch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getcchar.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getstr.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getyx.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/in_wch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inchstr.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/initscr.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inopts.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/ins_wch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/insch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/insstr.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/instr.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inwstr.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/kernel.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/key_defined.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/keybound.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/legacy.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/legacy_coding.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/mouse.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/move.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/ncurses.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/opaque.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/outopts.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/pad.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/refresh.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/resizeterm.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/scroll.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/slk.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/termattrs.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/touch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/util.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/variables.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/window.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/wresize.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/add_wch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/addch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/addstr.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/attr.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/beep.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/bkgd.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/bkgrnd.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/border.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/border_set.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/classes.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/clear.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/color.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/croatoan.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/default_colors.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/define_key.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/delch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/deleteln.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/extend.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/form.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/get_wch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getstr.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getyx.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/gray_streams.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/in_wch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inchstr.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/initscr.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inopts.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/ins_wch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/insch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/insstr.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/instr.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inwstr.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/kernel.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/key_defined.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/keybound.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/legacy.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/legacy_coding.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/menu.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/mouse.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/move.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/opaque.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/outopts.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/panel.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/queue.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/refresh.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/resizeterm.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/scroll.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/shape.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/slk.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/termattrs.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/touch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/utf8.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/util.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/variables.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/window.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/wresize.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/clos.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/evolution.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/ncurses.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/tetris.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/unicode.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/CHANGELOG delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/INSTALLATION delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/README.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/api.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/docs/index.html delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/errors.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/html-template.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/html-template.system delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/load.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/packages.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/specials.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/template.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/test.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/util.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/.gitignore delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/LICENSE_1_0.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/README.org delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/extensions.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/let-plus.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/let-plus.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/tests.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/.gitignore delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/COPYING delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/CREDITS delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/INSTALL delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/README delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/TODO delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/cl-postgres+local-time.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/Makefile delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/gendocs.sh delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/gendocs_template delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/local-time.texinfo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/style.css delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/local-time.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/src/integration/cl-postgres.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/src/local-time.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/src/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/comparison.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/formatting.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/parsing.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/simple.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/timezone.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo-leaps/UTC delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Abidjan delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Accra delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Addis_Ababa delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Algiers delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Asmara delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Asmera delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Bamako delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Bangui delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Banjul delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Bissau delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Blantyre delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Brazzaville delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Bujumbura delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Cairo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Casablanca delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Ceuta delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Conakry delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Dakar delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Dar_es_Salaam delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Djibouti delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Douala delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/El_Aaiun delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Freetown delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Gaborone delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Harare delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Johannesburg delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Kampala delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Khartoum delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Kigali delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Kinshasa delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Lagos delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Libreville delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Lome delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Luanda delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Lubumbashi delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Lusaka delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Malabo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Maputo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Maseru delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Mbabane delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Mogadishu delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Monrovia delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Nairobi delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Ndjamena delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Niamey delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Nouakchott delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Ouagadougou delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Porto-Novo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Sao_Tome delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Timbuktu delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Tripoli delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Tunis delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Windhoek delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Adak delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Anchorage delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Anguilla delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Antigua delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Araguaina delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Buenos_Aires delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Catamarca delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/ComodRivadavia delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Cordoba delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Jujuy delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/La_Rioja delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Mendoza delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Rio_Gallegos delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/San_Juan delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/San_Luis delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Tucuman delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Ushuaia delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Aruba delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Asuncion delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Atikokan delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Atka delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Bahia delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Barbados delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Belem delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Belize delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Blanc-Sablon delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Boa_Vista delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Bogota delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Boise delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Buenos_Aires delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Cambridge_Bay delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Campo_Grande delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Cancun delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Caracas delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Catamarca delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Cayenne delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Cayman delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Chicago delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Chihuahua delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Coral_Harbour delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Cordoba delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Costa_Rica delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Cuiaba delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Curacao delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Danmarkshavn delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Dawson delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Dawson_Creek delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Denver delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Detroit delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Dominica delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Edmonton delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Eirunepe delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/El_Salvador delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Ensenada delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Fort_Wayne delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Fortaleza delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Glace_Bay delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Godthab delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Goose_Bay delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Grand_Turk delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Grenada delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Guadeloupe delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Guatemala delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Guayaquil delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Guyana delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Halifax delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Havana delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Hermosillo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Indianapolis delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Knox delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Marengo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Petersburg delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Tell_City delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Vevay delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Vincennes delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Winamac delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indianapolis delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Inuvik delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Iqaluit delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Jamaica delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Jujuy delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Juneau delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Kentucky/Louisville delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Kentucky/Monticello delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Knox_IN delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/La_Paz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Lima delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Los_Angeles delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Louisville delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Maceio delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Managua delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Manaus delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Marigot delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Martinique delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Mazatlan delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Mendoza delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Menominee delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Merida delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Mexico_City delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Miquelon delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Moncton delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Monterrey delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Montevideo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Montreal delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Montserrat delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Nassau delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/New_York delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Nipigon delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Nome delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Noronha delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/North_Dakota/Center delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/North_Dakota/New_Salem delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Panama delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Pangnirtung delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Paramaribo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Phoenix delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Port-au-Prince delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Port_of_Spain delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Porto_Acre delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Porto_Velho delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Puerto_Rico delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Rainy_River delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Rankin_Inlet delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Recife delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Regina delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Resolute delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Rio_Branco delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Rosario delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Santiago delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Santo_Domingo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Sao_Paulo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Scoresbysund delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Shiprock delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/St_Barthelemy delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/St_Johns delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/St_Kitts delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/St_Lucia delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/St_Thomas delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/St_Vincent delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Swift_Current delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Tegucigalpa delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Thule delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Thunder_Bay delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Tijuana delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Toronto delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Tortola delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Vancouver delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Virgin delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Whitehorse delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Winnipeg delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Yakutat delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Yellowknife delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Casey delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Davis delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/DumontDUrville delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Mawson delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/McMurdo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Palmer delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Rothera delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/South_Pole delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Syowa delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Vostok delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Arctic/Longyearbyen delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Aden delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Almaty delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Amman delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Anadyr delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Aqtau delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Aqtobe delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Ashgabat delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Ashkhabad delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Baghdad delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Bahrain delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Baku delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Bangkok delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Beirut delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Bishkek delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Brunei delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Calcutta delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Choibalsan delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Chongqing delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Chungking delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Colombo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Dacca delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Damascus delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Dhaka delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Dili delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Dubai delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Dushanbe delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Gaza delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Harbin delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Ho_Chi_Minh delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Hong_Kong delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Hovd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Irkutsk delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Istanbul delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Jakarta delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Jayapura delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Jerusalem delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kabul delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kamchatka delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Karachi delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kashgar delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Katmandu delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kolkata delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Krasnoyarsk delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kuala_Lumpur delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kuching delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kuwait delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Macao delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Macau delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Magadan delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Makassar delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Manila delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Muscat delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Nicosia delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Novosibirsk delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Omsk delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Oral delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Phnom_Penh delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Pontianak delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Pyongyang delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Qatar delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Qyzylorda delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Rangoon delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Riyadh delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Riyadh87 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Riyadh88 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Riyadh89 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Saigon delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Sakhalin delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Samarkand delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Seoul delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Shanghai delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Singapore delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Taipei delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Tashkent delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Tbilisi delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Tehran delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Tel_Aviv delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Thimbu delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Thimphu delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Tokyo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Ujung_Pandang delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Ulaanbaatar delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Ulan_Bator delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Urumqi delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Vientiane delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Vladivostok delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Yakutsk delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Yekaterinburg delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Yerevan delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Azores delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Bermuda delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Canary delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Cape_Verde delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Faeroe delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Faroe delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Jan_Mayen delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Madeira delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Reykjavik delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/South_Georgia delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/St_Helena delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Stanley delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/ACT delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Adelaide delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Brisbane delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Broken_Hill delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Canberra delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Currie delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Darwin delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Eucla delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Hobart delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/LHI delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Lindeman delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Lord_Howe delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Melbourne delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/NSW delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/North delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Perth delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Queensland delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/South delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Sydney delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Tasmania delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Victoria delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/West delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Yancowinna delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Brazil/Acre delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Brazil/DeNoronha delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Brazil/East delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Brazil/West delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/CET delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/CST6CDT delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Canada/Atlantic delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Canada/Central delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Canada/East-Saskatchewan delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Canada/Eastern delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Canada/Mountain delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Canada/Newfoundland delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Canada/Pacific delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Canada/Saskatchewan delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Canada/Yukon delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Chile/Continental delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Chile/EasterIsland delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Cuba delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/EET delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/EST delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/EST5EDT delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Egypt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+0 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+1 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+10 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+11 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+12 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+2 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+3 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+4 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+5 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+6 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+7 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+8 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+9 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-0 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-1 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-10 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-11 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-12 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-13 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-14 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-2 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-3 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-4 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-5 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-6 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-7 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-8 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-9 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT0 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/Greenwich delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/UCT delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/UTC delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/Universal delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/Zulu delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Amsterdam delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Andorra delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Athens delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Belfast delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Belgrade delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Berlin delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Bratislava delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Brussels delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Bucharest delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Budapest delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Chisinau delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Copenhagen delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Dublin delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Gibraltar delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Guernsey delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Helsinki delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Isle_of_Man delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Istanbul delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Jersey delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Kaliningrad delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Kiev delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Lisbon delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Ljubljana delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/London delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Luxembourg delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Madrid delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Malta delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Mariehamn delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Minsk delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Monaco delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Moscow delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Nicosia delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Oslo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Paris delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Podgorica delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Prague delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Riga delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Rome delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Samara delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/San_Marino delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Sarajevo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Simferopol delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Skopje delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Sofia delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Stockholm delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Tallinn delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Tirane delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Tiraspol delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Uzhgorod delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Vaduz delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Vatican delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Vienna delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Vilnius delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Volgograd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Warsaw delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Zagreb delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Zaporozhye delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Zurich delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/GMT delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Greenwich delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/HST delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Hongkong delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Iceland delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Antananarivo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Chagos delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Christmas delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Cocos delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Comoro delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Kerguelen delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Mahe delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Maldives delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Mauritius delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Mayotte delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Reunion delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Iran delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Israel delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Jamaica delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Japan delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Kwajalein delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Libya delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/MET delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/MST delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/MST7MDT delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Mexico/BajaNorte delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Mexico/BajaSur delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Mexico/General delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Mideast/Riyadh87 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Mideast/Riyadh88 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Mideast/Riyadh89 delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Navajo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/PST8PDT delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Apia delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Auckland delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Chatham delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Easter delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Efate delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Enderbury delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Fakaofo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Fiji delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Funafuti delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Galapagos delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Gambier delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Guadalcanal delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Guam delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Honolulu delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Johnston delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Kiritimati delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Kosrae delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Kwajalein delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Majuro delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Marquesas delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Midway delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Nauru delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Niue delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Norfolk delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Noumea delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Pago_Pago delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Palau delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Pitcairn delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Ponape delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Port_Moresby delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Rarotonga delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Saipan delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Samoa delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Tahiti delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Tarawa delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Tongatapu delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Truk delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Wake delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Wallis delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Yap delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Poland delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Portugal delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Singapore delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Turkey delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Alaska delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Aleutian delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Arizona delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Central delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/East-Indiana delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Eastern delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Hawaii delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Indiana-Starke delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Michigan delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Mountain delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Pacific delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Samoa delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/UTC delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Universal delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/WET delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Zulu delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/.gitignore delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/.travis.yml delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/README.markdown delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/cl-test-more.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/images/dot.png delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/images/failed.png delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/images/fiveam.png delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/images/list.png delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/images/passed.png delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/images/tap.png delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/prove-asdf.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/prove-test.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/prove.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/roswell/run-prove.ros delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/asdf.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/color.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/output.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/prove.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/report.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter/dot.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter/fiveam.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter/list.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter/tap.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/suite.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/test.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/t/prove.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/t/utils.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/.gitignore delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/LICENSE.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/README.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/default-template/README.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/default-template/application.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/default-template/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/default-template/system.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/doc/LICENSE.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/doc/index.html delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/doc/style.css delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/quickproject.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/quickproject.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/.gitref delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/.travis.yml delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/CONTRIBUTING.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/Makefile delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/NEWS delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/PROBLEMS delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/README.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/Makefile delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/README.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/bridge.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/inferior-slime.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-asdf.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-autodoc.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-banner.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-buffer-streams.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-c-p-c.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-cl-indent.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-clipboard.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-compiler-notes-tree.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-editing-commands.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-enclosing-context.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fancy-inspector.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fancy-trace.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fancy.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fontifying-fu.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fuzzy.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-highlight-edits.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-hyperdoc.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-indentation.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-listener-hooks.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-macrostep.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-mdot-fu.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-media.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-mrepl.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-package-fu.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-parse.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-presentation-streams.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-presentations.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-quicklisp.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-references.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-repl.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-sbcl-exts.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-scheme.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-scratch.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-snapshot.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-sprof.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-trace-dialog.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-tramp.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-typeout-frame.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-xref-browser.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-arglists.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-asdf.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-buffer-streams.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-c-p-c.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-clipboard.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-fancy-inspector.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-fuzzy.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-goo.goo delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-hyperdoc.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-ikarus.ss delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-indentation.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-jolt.k delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-kawa.scm delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-larceny.scm delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-listener-hooks.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-macrostep.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-media.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-mit-scheme.scm delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-mlworks.sml delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-mrepl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-package-fu.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-presentation-streams.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-presentations.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-quicklisp.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-r6rs.scm delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-repl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-sbcl-exts.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-snapshot.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-sprof.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-trace-dialog.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-util.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank.rb delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-autodoc-tests.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-c-p-c-tests.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-cl-indent-test.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-enclosing-context-tests.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-fontifying-fu-tests.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-indentation-tests.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-macrostep-tests.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-mdot-fu-tests.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-parse-tests.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-presentations-tests.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-repl-tests.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/.cvsignore delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/Makefile delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/contributors.texi delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/slime-refcard.pdf delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/slime-refcard.tex delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/slime-small.eps delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/slime-small.pdf delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/slime.css delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/slime.texi delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/texinfo-tabulate.awk delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/.nosearch delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/cl-lib.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/ert-x.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/ert.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/hyperspec.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/macrostep.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/metering.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/nregex.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/packages.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/sbcl-pprint-patch.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/slime-autoloads.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/slime-tests.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/slime.el delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/start-swank.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank-loader.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/abcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/allegro.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/backend.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/ccl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/clasp.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/clisp.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/cmucl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/corman.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/ecl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/gray.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/lispworks.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/match.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/mezzano.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/mkcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/rpc.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/sbcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/scl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/source-file-cache.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/source-path-parser.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/xref.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/LICENSE delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/README.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/api.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/documentation.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/extended-sequence.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/list.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/original-message.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/split-sequence.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/tests.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/vector.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/version.sexp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/.travis.yml delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/COPYRIGHT delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/README.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/SPEC.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/release.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-abcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-allegro.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-clasp.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-clisp.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-cmucl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-corman.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-ecl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-lispworks.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mezzano.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mkcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mocl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-openmcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-sbcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-scl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-xcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/sysinfo.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/tests.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/utsname.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/trivial-features-tests.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/trivial-features.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/COPYING delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/Makefile delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/README delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/build.xcvb delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/streams.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/test/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/test/run-on-many-lisps.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/test/test-framework.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/test/test.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/trivial-gray-streams-test.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/trivial-gray-streams.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/.gitignore delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/CHANGES delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/CONTRIBUTORS delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/LICENSE delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/README.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/TODO delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/.gitignore delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/abcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/allegro.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/clasp.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/clisp.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/clozure.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/cmucl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/ecl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/genera.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/iolib.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/lispworks.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/mcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/mezzano.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/mocl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/openmcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/sbcl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/scl.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/condition.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/doc/intro.dita delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/doc/reference.dita delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/doc/usocket.ditamap delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/abcl-socket.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/active-sockets-apis.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/address-apis.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/allegro-socket.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/backends.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/clisp-sockets.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/cmucl-sockets.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/design.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/errors.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/lw-sockets.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/openmcl-sockets.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/sb-bsd-sockets.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/usock-sockets.txt delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/option.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/server.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/test-condition.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/test-datagram.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/test-usocket.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/udp-one-shot.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/wait-for-input.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/usocket-server.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/usocket-test.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/usocket.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/usocket.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/vendor/OpenTransportUDP.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/vendor/kqueue.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/version.sexp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/vom-20160825-git/LICENSE delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/vom-20160825-git/README.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/vom-20160825-git/vom.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/vom-20160825-git/vom.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/.gitignore delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/.pre-release.sh delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/CHANGELOG delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/LICENSE delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/README.md delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/clixdoc.xsl delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/doc.xml delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/encode.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/index.html delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/package.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/parse.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/render-doc.sh delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/test.lisp delete mode 100644 sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/yason.asd delete mode 100644 sbcl/.quicklisp/dists/quicklisp/systems.cdb delete mode 100644 sbcl/.quicklisp/dists/quicklisp/systems.txt delete mode 100644 sbcl/.quicklisp/local-projects/system-index.txt delete mode 100644 sbcl/.quicklisp/quicklisp/bundle-template.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/bundle.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/cdb.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/client-info.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/client-update.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/client.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/config.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/deflate.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/dist-update.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/dist.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/fetch-gzipped.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/http.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/impl-util.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/impl.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/local-projects.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/minitar.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/misc.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/network.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/package.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/progress.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/quicklisp.asd delete mode 100644 sbcl/.quicklisp/quicklisp/setup.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/utils.lisp delete mode 100644 sbcl/.quicklisp/quicklisp/version.txt delete mode 100644 sbcl/.quicklisp/setup.lisp delete mode 100644 sbcl/.quicklisp/tmp/install-dist-distinfo.txt delete mode 100644 sbcl/.quicklisp/tmp/quicklisp.tar delete mode 100644 sbcl/.quicklisp/tmp/release-install.tar delete mode 100644 sbcl/.sbclrc delete mode 100644 sbcl/quicklisp.lisp diff --git a/fzf/.fzf b/fzf/.fzf deleted file mode 160000 index 8e027c4..0000000 --- a/fzf/.fzf +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8e027c445f0eb4495e300522843df335c3b54e60 diff --git a/sbcl/.quicklisp/asdf.lisp b/sbcl/.quicklisp/asdf.lisp deleted file mode 100644 index 283ad86..0000000 --- a/sbcl/.quicklisp/asdf.lisp +++ /dev/null @@ -1,4516 +0,0 @@ -;;; -*- mode: Common-Lisp; Base: 10 ; Syntax: ANSI-Common-Lisp ; coding: utf-8 -*- -;;; This is ASDF 2.26: Another System Definition Facility. -;;; -;;; Feedback, bug reports, and patches are all welcome: -;;; please mail to . -;;; Note first that the canonical source for ASDF is presently -;;; . -;;; -;;; If you obtained this copy from anywhere else, and you experience -;;; trouble using it, or find bugs, you may want to check at the -;;; location above for a more recent version (and for documentation -;;; and test files, if your copy came without them) before reporting -;;; bugs. There are usually two "supported" revisions - the git master -;;; branch is the latest development version, whereas the git release -;;; branch may be slightly older but is considered `stable' - -;;; -- LICENSE START -;;; (This is the MIT / X Consortium license as taken from -;;; http://www.opensource.org/licenses/mit-license.html on or about -;;; Monday; July 13, 2009) -;;; -;;; Copyright (c) 2001-2012 Daniel Barlow and contributors -;;; -;;; 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. -;;; -;;; -- LICENSE END - -;;; The problem with writing a defsystem replacement is bootstrapping: -;;; we can't use defsystem to compile it. Hence, all in one file. - -#+xcvb (module ()) - -(cl:in-package :common-lisp-user) -#+genera (in-package :future-common-lisp-user) - -#-(or abcl allegro clisp clozure cmu cormanlisp ecl gcl genera lispworks mcl mkcl sbcl scl xcl) -(error "ASDF is not supported on your implementation. Please help us port it.") - -;;;; Create and setup packages in a way that is compatible with hot-upgrade. -;;;; See https://bugs.launchpad.net/asdf/+bug/485687 -;;;; See these two eval-when forms, and more near the end of the file. - -#+gcl (defpackage :asdf (:use :cl)) ;; GCL treats defpackage magically and needs this - -(eval-when (:load-toplevel :compile-toplevel :execute) - ;;; Before we do anything, some implementation-dependent tweaks - ;; (declaim (optimize (speed 1) (debug 3) (safety 3))) ; NO: trust implementation defaults. - #+allegro - (setf excl::*autoload-package-name-alist* - (remove "asdf" excl::*autoload-package-name-alist* - :test 'equalp :key 'car)) ; need that BEFORE any mention of package ASDF as below - #+gcl ;; Debian's GCL 2.7 has bugs with compiling multiple-value stuff, but can run ASDF 2.011 - (when (or (< system::*gcl-major-version* 2) ;; GCL 2.6 fails to fully compile ASDF at all - (and (= system::*gcl-major-version* 2) - (< system::*gcl-minor-version* 7))) - (pushnew :gcl-pre2.7 *features*)) - #+(or abcl (and allegro ics) (and (or clisp cmu ecl mkcl) unicode) - clozure lispworks (and sbcl sb-unicode) scl) - (pushnew :asdf-unicode *features*) - ;;; make package if it doesn't exist yet. - ;;; DEFPACKAGE may cause errors on discrepancies, so we avoid it. - (unless (find-package :asdf) - (make-package :asdf :use '(:common-lisp)))) - -(in-package :asdf) - -(eval-when (:load-toplevel :compile-toplevel :execute) - ;;; This would belong amongst implementation-dependent tweaks above, - ;;; except that the defun has to be in package asdf. - #+ecl (defun use-ecl-byte-compiler-p () (and (member :ecl-bytecmp *features*) t)) - #+ecl (unless (use-ecl-byte-compiler-p) (require :cmp)) - #+mkcl (require :cmp) - #+mkcl (setq clos::*redefine-class-in-place* t) ;; Make sure we have strict ANSI class redefinition semantics - - ;;; Package setup, step 2. - (defvar *asdf-version* nil) - (defvar *upgraded-p* nil) - (defvar *asdf-verbose* nil) ; was t from 2.000 to 2.014.12. - (defun find-symbol* (s p) - (find-symbol (string s) p)) - ;; Strip out formatting that is not supported on Genera. - ;; Has to be inside the eval-when to make Lispworks happy (!) - (defun strcat (&rest strings) - (apply 'concatenate 'string strings)) - (defmacro compatfmt (format) - #-(or gcl genera) format - #+(or gcl genera) - (loop :for (unsupported . replacement) :in - (append - '(("~3i~_" . "")) - #+genera '(("~@<" . "") ("; ~@;" . "; ") ("~@:>" . "") ("~:>" . ""))) :do - (loop :for found = (search unsupported format) :while found :do - (setf format (strcat (subseq format 0 found) replacement - (subseq format (+ found (length unsupported))))))) - format) - (let* (;; For bug reporting sanity, please always bump this version when you modify this file. - ;; Please also modify asdf.asd to reflect this change. The script bin/bump-version - ;; can help you do these changes in synch (look at the source for documentation). - ;; Relying on its automation, the version is now redundantly present on top of this file. - ;; "2.345" would be an official release - ;; "2.345.6" would be a development version in the official upstream - ;; "2.345.0.7" would be your seventh local modification of official release 2.345 - ;; "2.345.6.7" would be your seventh local modification of development version 2.345.6 - (asdf-version "2.26") - (existing-asdf (find-class 'component nil)) - (existing-version *asdf-version*) - (already-there (equal asdf-version existing-version))) - (unless (and existing-asdf already-there) - (when (and existing-asdf *asdf-verbose*) - (format *trace-output* - (compatfmt "~&~@<; ~@;Upgrading ASDF ~@[from version ~A ~]to version ~A~@:>~%") - existing-version asdf-version)) - (labels - ((present-symbol-p (symbol package) - (member (nth-value 1 (find-symbol* symbol package)) '(:internal :external))) - (present-symbols (package) - ;; #-genera (loop :for s :being :the :present-symbols :in package :collect s) #+genera - (let (l) - (do-symbols (s package) - (when (present-symbol-p s package) (push s l))) - (reverse l))) - (unlink-package (package) - (let ((u (find-package package))) - (when u - (ensure-unintern u (present-symbols u)) - (loop :for p :in (package-used-by-list u) :do - (unuse-package u p)) - (delete-package u)))) - (ensure-exists (name nicknames use) - (let ((previous - (remove-duplicates - (mapcar #'find-package (cons name nicknames)) - :from-end t))) - ;; do away with packages with conflicting (nick)names - (map () #'unlink-package (cdr previous)) - ;; reuse previous package with same name - (let ((p (car previous))) - (cond - (p - (rename-package p name nicknames) - (ensure-use p use) - p) - (t - (make-package name :nicknames nicknames :use use)))))) - (intern* (symbol package) - (intern (string symbol) package)) - (remove-symbol (symbol package) - (let ((sym (find-symbol* symbol package))) - (when sym - #-cormanlisp (unexport sym package) - (unintern sym package) - sym))) - (ensure-unintern (package symbols) - (loop :with packages = (list-all-packages) - :for sym :in symbols - :for removed = (remove-symbol sym package) - :when removed :do - (loop :for p :in packages :do - (when (eq removed (find-symbol* sym p)) - (unintern removed p))))) - (ensure-shadow (package symbols) - (shadow symbols package)) - (ensure-use (package use) - (dolist (used (package-use-list package)) - (unless (member (package-name used) use :test 'string=) - (unuse-package used) - (do-external-symbols (sym used) - (when (eq sym (find-symbol* sym package)) - (remove-symbol sym package))))) - (dolist (used (reverse use)) - (do-external-symbols (sym used) - (unless (eq sym (find-symbol* sym package)) - (remove-symbol sym package))) - (use-package used package))) - (ensure-fmakunbound (package symbols) - (loop :for name :in symbols - :for sym = (find-symbol* name package) - :when sym :do (fmakunbound sym))) - (ensure-export (package export) - (let ((formerly-exported-symbols nil) - (bothly-exported-symbols nil) - (newly-exported-symbols nil)) - (do-external-symbols (sym package) - (if (member sym export :test 'string-equal) - (push sym bothly-exported-symbols) - (push sym formerly-exported-symbols))) - (loop :for sym :in export :do - (unless (member sym bothly-exported-symbols :test 'equal) - (push sym newly-exported-symbols))) - (loop :for user :in (package-used-by-list package) - :for shadowing = (package-shadowing-symbols user) :do - (loop :for new :in newly-exported-symbols - :for old = (find-symbol* new user) - :when (and old (not (member old shadowing))) - :do (unintern old user))) - (loop :for x :in newly-exported-symbols :do - (export (intern* x package))))) - (ensure-package (name &key nicknames use unintern - shadow export redefined-functions) - (let* ((p (ensure-exists name nicknames use))) - (ensure-unintern p (append unintern #+cmu redefined-functions)) - (ensure-shadow p shadow) - (ensure-export p export) - #-cmu (ensure-fmakunbound p redefined-functions) - p))) - (macrolet - ((pkgdcl (name &key nicknames use export - redefined-functions unintern shadow) - `(ensure-package - ',name :nicknames ',nicknames :use ',use :export ',export - :shadow ',shadow - :unintern ',unintern - :redefined-functions ',redefined-functions))) - (pkgdcl - :asdf - :use (:common-lisp) - :redefined-functions - (#:perform #:explain #:output-files #:operation-done-p - #:perform-with-restarts #:component-relative-pathname - #:system-source-file #:operate #:find-component #:find-system - #:apply-output-translations #:translate-pathname* #:resolve-location - #:system-relative-pathname - #:inherit-source-registry #:process-source-registry - #:process-source-registry-directive - #:compile-file* #:source-file-type) - :unintern - (#:*asdf-revision* #:around #:asdf-method-combination - #:split #:make-collector #:do-dep #:do-one-dep - #:resolve-relative-location-component #:resolve-absolute-location-component - #:output-files-for-system-and-operation) ; obsolete ASDF-BINARY-LOCATION function - :export - (#:defsystem #:oos #:operate #:find-system #:locate-system #:run-shell-command - #:system-definition-pathname #:with-system-definitions - #:search-for-system-definition #:find-component #:component-find-path - #:compile-system #:load-system #:load-systems - #:require-system #:test-system #:clear-system - #:operation #:compile-op #:load-op #:load-source-op #:test-op - #:feature #:version #:version-satisfies - #:upgrade-asdf - #:implementation-identifier #:implementation-type #:hostname - #:input-files #:output-files #:output-file #:perform - #:operation-done-p #:explain - - #:component #:source-file - #:c-source-file #:cl-source-file #:java-source-file - #:cl-source-file.cl #:cl-source-file.lsp - #:static-file - #:doc-file - #:html-file - #:text-file - #:source-file-type - #:module ; components - #:system - #:unix-dso - - #:module-components ; component accessors - #:module-components-by-name - #:component-pathname - #:component-relative-pathname - #:component-name - #:component-version - #:component-parent - #:component-property - #:component-system - #:component-depends-on - #:component-encoding - #:component-external-format - - #:system-description - #:system-long-description - #:system-author - #:system-maintainer - #:system-license - #:system-licence - #:system-source-file - #:system-source-directory - #:system-relative-pathname - #:map-systems - - #:operation-description - #:operation-on-warnings - #:operation-on-failure - #:component-visited-p - - #:*system-definition-search-functions* ; variables - #:*central-registry* - #:*compile-file-warnings-behaviour* - #:*compile-file-failure-behaviour* - #:*resolve-symlinks* - #:*load-system-operation* - #:*asdf-verbose* - #:*verbose-out* - - #:asdf-version - - #:operation-error #:compile-failed #:compile-warned #:compile-error - #:error-name - #:error-pathname - #:load-system-definition-error - #:error-component #:error-operation - #:system-definition-error - #:missing-component - #:missing-component-of-version - #:missing-dependency - #:missing-dependency-of-version - #:circular-dependency ; errors - #:duplicate-names - - #:try-recompiling - #:retry - #:accept ; restarts - #:coerce-entry-to-directory - #:remove-entry-from-registry - - #:*encoding-detection-hook* - #:*encoding-external-format-hook* - #:*default-encoding* - #:*utf-8-external-format* - - #:clear-configuration - #:*output-translations-parameter* - #:initialize-output-translations - #:disable-output-translations - #:clear-output-translations - #:ensure-output-translations - #:apply-output-translations - #:compile-file* - #:compile-file-pathname* - #:enable-asdf-binary-locations-compatibility - #:*default-source-registries* - #:*source-registry-parameter* - #:initialize-source-registry - #:compute-source-registry - #:clear-source-registry - #:ensure-source-registry - #:process-source-registry - #:system-registered-p #:registered-systems #:loaded-systems - #:resolve-location - #:asdf-message - #:user-output-translations-pathname - #:system-output-translations-pathname - #:user-output-translations-directory-pathname - #:system-output-translations-directory-pathname - #:user-source-registry - #:system-source-registry - #:user-source-registry-directory - #:system-source-registry-directory - - ;; Utilities: please use asdf-utils instead - #| - ;; #:aif #:it - ;; #:appendf #:orf - #:length=n-p - #:remove-keys #:remove-keyword - #:first-char #:last-char #:string-suffix-p - #:coerce-name - #:directory-pathname-p #:ensure-directory-pathname - #:absolute-pathname-p #:ensure-pathname-absolute #:pathname-root - #:getenv #:getenv-pathname #:getenv-pathnames - #:getenv-absolute-directory #:getenv-absolute-directories - #:probe-file* - #:find-symbol* #:strcat - #:make-pathname-component-logical #:make-pathname-logical - #:merge-pathnames* #:coerce-pathname #:subpathname #:subpathname* - #:pathname-directory-pathname #:pathname-parent-directory-pathname - #:read-file-forms - #:resolve-symlinks #:truenamize - #:split-string - #:component-name-to-pathname-components - #:split-name-type - #:subdirectories #:directory-files - #:while-collecting - #:*wild* #:*wild-file* #:*wild-directory* #:*wild-inferiors* - #:*wild-path* #:wilden - #:directorize-pathname-host-device|# - ))) - #+genera (import 'scl:boolean :asdf) - (setf *asdf-version* asdf-version - *upgraded-p* (if existing-version - (cons existing-version *upgraded-p*) - *upgraded-p*)))))) - -;;;; ------------------------------------------------------------------------- -;;;; User-visible parameters -;;;; -(defvar *resolve-symlinks* t - "Determine whether or not ASDF resolves symlinks when defining systems. - -Defaults to T.") - -(defvar *compile-file-warnings-behaviour* - (or #+clisp :ignore :warn) - "How should ASDF react if it encounters a warning when compiling a file? -Valid values are :error, :warn, and :ignore.") - -(defvar *compile-file-failure-behaviour* - (or #+sbcl :error #+clisp :ignore :warn) - "How should ASDF react if it encounters a failure (per the ANSI spec of COMPILE-FILE) -when compiling a file? Valid values are :error, :warn, and :ignore. -Note that ASDF ALWAYS raises an error if it fails to create an output file when compiling.") - -(defvar *verbose-out* nil) - -(defparameter +asdf-methods+ - '(perform-with-restarts perform explain output-files operation-done-p)) - -(defvar *load-system-operation* 'load-op - "Operation used by ASDF:LOAD-SYSTEM. By default, ASDF:LOAD-OP. -You may override it with e.g. ASDF:LOAD-FASL-OP from asdf-bundle, -or ASDF:LOAD-SOURCE-OP if your fasl loading is somehow broken.") - -(defvar *compile-op-compile-file-function* 'compile-file* - "Function used to compile lisp files.") - - - -#+allegro -(eval-when (:compile-toplevel :execute) - (defparameter *acl-warn-save* - (when (boundp 'excl:*warn-on-nested-reader-conditionals*) - excl:*warn-on-nested-reader-conditionals*)) - (when (boundp 'excl:*warn-on-nested-reader-conditionals*) - (setf excl:*warn-on-nested-reader-conditionals* nil))) - -;;;; ------------------------------------------------------------------------- -;;;; Resolve forward references - -(declaim (ftype (function (t) t) - format-arguments format-control - error-name error-pathname error-condition - duplicate-names-name - error-component error-operation - module-components module-components-by-name - circular-dependency-components - condition-arguments condition-form - condition-format condition-location - coerce-name) - (ftype (function (&optional t) (values)) initialize-source-registry) - #-(or cormanlisp gcl-pre2.7) - (ftype (function (t t) t) (setf module-components-by-name))) - -;;;; ------------------------------------------------------------------------- -;;;; Compatibility various implementations -#+cormanlisp -(progn - (deftype logical-pathname () nil) - (defun make-broadcast-stream () *error-output*) - (defun translate-logical-pathname (x) x) - (defun file-namestring (p) - (setf p (pathname p)) - (format nil "~@[~A~]~@[.~A~]" (pathname-name p) (pathname-type p)))) - -#.(or #+mcl ;; the #$ doesn't work on other lisps, even protected by #+mcl - (read-from-string - "(eval-when (:compile-toplevel :load-toplevel :execute) - (ccl:define-entry-point (_getenv \"getenv\") ((name :string)) :string) - (ccl:define-entry-point (_system \"system\") ((name :string)) :int) - ;; Note: ASDF may expect user-homedir-pathname to provide - ;; the pathname of the current user's home directory, whereas - ;; MCL by default provides the directory from which MCL was started. - ;; See http://code.google.com/p/mcl/wiki/Portability - (defun current-user-homedir-pathname () - (ccl::findfolder #$kuserdomain #$kCurrentUserFolderType)) - (defun probe-posix (posix-namestring) - \"If a file exists for the posix namestring, return the pathname\" - (ccl::with-cstrs ((cpath posix-namestring)) - (ccl::rlet ((is-dir :boolean) - (fsref :fsref)) - (when (eq #$noerr (#_fspathmakeref cpath fsref is-dir)) - (ccl::%path-from-fsref fsref is-dir))))))")) - -;;;; ------------------------------------------------------------------------- -;;;; General Purpose Utilities - -(macrolet - ((defdef (def* def) - `(defmacro ,def* (name formals &rest rest) - `(progn - #+(or ecl (and gcl (not gcl-pre2.7))) (fmakunbound ',name) - #-gcl ; gcl 2.7.0 notinline functions lose secondary return values :-( - ,(when (and #+ecl (symbolp name)) ; fails for setf functions on ecl - `(declaim (notinline ,name))) - (,',def ,name ,formals ,@rest))))) - (defdef defgeneric* defgeneric) - (defdef defun* defun)) - -(defmacro while-collecting ((&rest collectors) &body body) - "COLLECTORS should be a list of names for collections. A collector -defines a function that, when applied to an argument inside BODY, will -add its argument to the corresponding collection. Returns multiple values, -a list for each collection, in order. - E.g., -\(while-collecting \(foo bar\) - \(dolist \(x '\(\(a 1\) \(b 2\) \(c 3\)\)\) - \(foo \(first x\)\) - \(bar \(second x\)\)\)\) -Returns two values: \(A B C\) and \(1 2 3\)." - (let ((vars (mapcar #'(lambda (x) (gensym (symbol-name x))) collectors)) - (initial-values (mapcar (constantly nil) collectors))) - `(let ,(mapcar #'list vars initial-values) - (flet ,(mapcar #'(lambda (c v) `(,c (x) (push x ,v) (values))) collectors vars) - ,@body - (values ,@(mapcar #'(lambda (v) `(reverse ,v)) vars)))))) - -(defmacro aif (test then &optional else) - "Anaphoric version of IF, On Lisp style" - `(let ((it ,test)) (if it ,then ,else))) - -(defun* pathname-directory-pathname (pathname) - "Returns a new pathname with same HOST, DEVICE, DIRECTORY as PATHNAME, -and NIL NAME, TYPE and VERSION components" - (when pathname - (make-pathname :name nil :type nil :version nil :defaults pathname))) - -(defun* normalize-pathname-directory-component (directory) - "Given a pathname directory component, return an equivalent form that is a list" - (cond - #-(or cmu sbcl scl) ;; these implementations already normalize directory components. - ((stringp directory) `(:absolute ,directory) directory) - #+gcl - ((and (consp directory) (stringp (first directory))) - `(:absolute ,@directory)) - ((or (null directory) - (and (consp directory) (member (first directory) '(:absolute :relative)))) - directory) - (t - (error (compatfmt "~@") directory)))) - -(defun* merge-pathname-directory-components (specified defaults) - ;; Helper for merge-pathnames* that handles directory components. - (let ((directory (normalize-pathname-directory-component specified))) - (ecase (first directory) - ((nil) defaults) - (:absolute specified) - (:relative - (let ((defdir (normalize-pathname-directory-component defaults)) - (reldir (cdr directory))) - (cond - ((null defdir) - directory) - ((not (eq :back (first reldir))) - (append defdir reldir)) - (t - (loop :with defabs = (first defdir) - :with defrev = (reverse (rest defdir)) - :while (and (eq :back (car reldir)) - (or (and (eq :absolute defabs) (null defrev)) - (stringp (car defrev)))) - :do (pop reldir) (pop defrev) - :finally (return (cons defabs (append (reverse defrev) reldir))))))))))) - -(defun* make-pathname-component-logical (x) - "Make a pathname component suitable for use in a logical-pathname" - (typecase x - ((eql :unspecific) nil) - #+clisp (string (string-upcase x)) - #+clisp (cons (mapcar 'make-pathname-component-logical x)) - (t x))) - -(defun* make-pathname-logical (pathname host) - "Take a PATHNAME's directory, name, type and version components, -and make a new pathname with corresponding components and specified logical HOST" - (make-pathname - :host host - :directory (make-pathname-component-logical (pathname-directory pathname)) - :name (make-pathname-component-logical (pathname-name pathname)) - :type (make-pathname-component-logical (pathname-type pathname)) - :version (make-pathname-component-logical (pathname-version pathname)))) - -(defun* merge-pathnames* (specified &optional (defaults *default-pathname-defaults*)) - "MERGE-PATHNAMES* is like MERGE-PATHNAMES except that -if the SPECIFIED pathname does not have an absolute directory, -then the HOST and DEVICE both come from the DEFAULTS, whereas -if the SPECIFIED pathname does have an absolute directory, -then the HOST and DEVICE both come from the SPECIFIED. -Also, if either argument is NIL, then the other argument is returned unmodified." - (when (null specified) (return-from merge-pathnames* defaults)) - (when (null defaults) (return-from merge-pathnames* specified)) - #+scl - (ext:resolve-pathname specified defaults) - #-scl - (let* ((specified (pathname specified)) - (defaults (pathname defaults)) - (directory (normalize-pathname-directory-component (pathname-directory specified))) - (name (or (pathname-name specified) (pathname-name defaults))) - (type (or (pathname-type specified) (pathname-type defaults))) - (version (or (pathname-version specified) (pathname-version defaults)))) - (labels ((unspecific-handler (p) - (if (typep p 'logical-pathname) #'make-pathname-component-logical #'identity))) - (multiple-value-bind (host device directory unspecific-handler) - (ecase (first directory) - ((:absolute) - (values (pathname-host specified) - (pathname-device specified) - directory - (unspecific-handler specified))) - ((nil :relative) - (values (pathname-host defaults) - (pathname-device defaults) - (merge-pathname-directory-components directory (pathname-directory defaults)) - (unspecific-handler defaults)))) - (make-pathname :host host :device device :directory directory - :name (funcall unspecific-handler name) - :type (funcall unspecific-handler type) - :version (funcall unspecific-handler version)))))) - -(defun* pathname-parent-directory-pathname (pathname) - "Returns a new pathname with same HOST, DEVICE, DIRECTORY as PATHNAME, -and NIL NAME, TYPE and VERSION components" - (when pathname - (make-pathname :name nil :type nil :version nil - :directory (merge-pathname-directory-components - '(:relative :back) (pathname-directory pathname)) - :defaults pathname))) - -(define-modify-macro appendf (&rest args) - append "Append onto list") ;; only to be used on short lists. - -(define-modify-macro orf (&rest args) - or "or a flag") - -(defun* first-char (s) - (and (stringp s) (plusp (length s)) (char s 0))) - -(defun* last-char (s) - (and (stringp s) (plusp (length s)) (char s (1- (length s))))) - - -(defun* asdf-message (format-string &rest format-args) - (declare (dynamic-extent format-args)) - (apply 'format *verbose-out* format-string format-args)) - -(defun* split-string (string &key max (separator '(#\Space #\Tab))) - "Split STRING into a list of components separated by -any of the characters in the sequence SEPARATOR. -If MAX is specified, then no more than max(1,MAX) components will be returned, -starting the separation from the end, e.g. when called with arguments - \"a.b.c.d.e\" :max 3 :separator \".\" it will return (\"a.b.c\" \"d\" \"e\")." - (catch nil - (let ((list nil) (words 0) (end (length string))) - (flet ((separatorp (char) (find char separator)) - (done () (throw nil (cons (subseq string 0 end) list)))) - (loop - :for start = (if (and max (>= words (1- max))) - (done) - (position-if #'separatorp string :end end :from-end t)) :do - (when (null start) - (done)) - (push (subseq string (1+ start) end) list) - (incf words) - (setf end start)))))) - -(defun* split-name-type (filename) - (let ((unspecific - ;; Giving :unspecific as argument to make-pathname is not portable. - ;; See CLHS make-pathname and 19.2.2.2.3. - ;; We only use it on implementations that support it, - #+(or abcl allegro clozure cmu gcl genera lispworks mkcl sbcl scl xcl) :unspecific - #+(or clisp ecl #|These haven't been tested:|# cormanlisp mcl) nil)) - (destructuring-bind (name &optional (type unspecific)) - (split-string filename :max 2 :separator ".") - (if (equal name "") - (values filename unspecific) - (values name type))))) - -(defun* component-name-to-pathname-components (s &key force-directory force-relative) - "Splits the path string S, returning three values: -A flag that is either :absolute or :relative, indicating - how the rest of the values are to be interpreted. -A directory path --- a list of strings, suitable for - use with MAKE-PATHNAME when prepended with the flag - value. -A filename with type extension, possibly NIL in the - case of a directory pathname. -FORCE-DIRECTORY forces S to be interpreted as a directory -pathname \(third return value will be NIL, final component -of S will be treated as part of the directory path. - -The intention of this function is to support structured component names, -e.g., \(:file \"foo/bar\"\), which will be unpacked to relative -pathnames." - (check-type s string) - (when (find #\: s) - (error (compatfmt "~@") s)) - (let* ((components (split-string s :separator "/")) - (last-comp (car (last components)))) - (multiple-value-bind (relative components) - (if (equal (first components) "") - (if (equal (first-char s) #\/) - (progn - (when force-relative - (error (compatfmt "~@") s)) - (values :absolute (cdr components))) - (values :relative nil)) - (values :relative components)) - (setf components (remove-if #'(lambda (x) (member x '("" ".") :test #'equal)) components)) - (setf components (substitute :back ".." components :test #'equal)) - (cond - ((equal last-comp "") - (values relative components nil)) ; "" already removed - (force-directory - (values relative components nil)) - (t - (values relative (butlast components) last-comp)))))) - -(defun* remove-keys (key-names args) - (loop :for (name val) :on args :by #'cddr - :unless (member (symbol-name name) key-names - :key #'symbol-name :test 'equal) - :append (list name val))) - -(defun* remove-keyword (key args) - (loop :for (k v) :on args :by #'cddr - :unless (eq k key) - :append (list k v))) - -(defun* getenv (x) - (declare (ignorable x)) - #+(or abcl clisp ecl xcl) (ext:getenv x) - #+allegro (sys:getenv x) - #+clozure (ccl:getenv x) - #+(or cmu scl) (cdr (assoc x ext:*environment-list* :test #'string=)) - #+cormanlisp - (let* ((buffer (ct:malloc 1)) - (cname (ct:lisp-string-to-c-string x)) - (needed-size (win:getenvironmentvariable cname buffer 0)) - (buffer1 (ct:malloc (1+ needed-size)))) - (prog1 (if (zerop (win:getenvironmentvariable cname buffer1 needed-size)) - nil - (ct:c-string-to-lisp-string buffer1)) - (ct:free buffer) - (ct:free buffer1))) - #+gcl (system:getenv x) - #+genera nil - #+lispworks (lispworks:environment-variable x) - #+mcl (ccl:with-cstrs ((name x)) - (let ((value (_getenv name))) - (unless (ccl:%null-ptr-p value) - (ccl:%get-cstring value)))) - #+mkcl (#.(or (find-symbol* 'getenv :si) (find-symbol* 'getenv :mk-ext)) x) - #+sbcl (sb-ext:posix-getenv x) - #-(or abcl allegro clisp clozure cmu cormanlisp ecl gcl genera lispworks mcl mkcl sbcl scl xcl) - (error "~S is not supported on your implementation" 'getenv)) - -(defun* directory-pathname-p (pathname) - "Does PATHNAME represent a directory? - -A directory-pathname is a pathname _without_ a filename. The three -ways that the filename components can be missing are for it to be NIL, -:UNSPECIFIC or the empty string. - -Note that this does _not_ check to see that PATHNAME points to an -actually-existing directory." - (when pathname - (let ((pathname (pathname pathname))) - (flet ((check-one (x) - (member x '(nil :unspecific "") :test 'equal))) - (and (not (wild-pathname-p pathname)) - (check-one (pathname-name pathname)) - (check-one (pathname-type pathname)) - t))))) - -(defun* ensure-directory-pathname (pathspec) - "Converts the non-wild pathname designator PATHSPEC to directory form." - (cond - ((stringp pathspec) - (ensure-directory-pathname (pathname pathspec))) - ((not (pathnamep pathspec)) - (error (compatfmt "~@") pathspec)) - ((wild-pathname-p pathspec) - (error (compatfmt "~@") pathspec)) - ((directory-pathname-p pathspec) - pathspec) - (t - (make-pathname :directory (append (or (pathname-directory pathspec) - (list :relative)) - (list (file-namestring pathspec))) - :name nil :type nil :version nil - :defaults pathspec)))) - -#+genera -(unless (fboundp 'ensure-directories-exist) - (defun* ensure-directories-exist (path) - (fs:create-directories-recursively (pathname path)))) - -(defun* absolute-pathname-p (pathspec) - (and (typep pathspec '(or pathname string)) - (eq :absolute (car (pathname-directory (pathname pathspec)))))) - -(defun* coerce-pathname (name &key type defaults) - "coerce NAME into a PATHNAME. -When given a string, portably decompose it into a relative pathname: -#\\/ separates subdirectories. The last #\\/-separated string is as follows: -if TYPE is NIL, its last #\\. if any separates name and type from from type; -if TYPE is a string, it is the type, and the whole string is the name; -if TYPE is :DIRECTORY, the string is a directory component; -if the string is empty, it's a directory. -Any directory named .. is read as :BACK. -Host, device and version components are taken from DEFAULTS." - ;; The defaults are required notably because they provide the default host - ;; to the below make-pathname, which may crucially matter to people using - ;; merge-pathnames with non-default hosts, e.g. for logical-pathnames. - ;; NOTE that the host and device slots will be taken from the defaults, - ;; but that should only matter if you later merge relative pathnames with - ;; CL:MERGE-PATHNAMES instead of ASDF:MERGE-PATHNAMES* - (etypecase name - ((or null pathname) - name) - (symbol - (coerce-pathname (string-downcase name) :type type :defaults defaults)) - (string - (multiple-value-bind (relative path filename) - (component-name-to-pathname-components name :force-directory (eq type :directory) - :force-relative t) - (multiple-value-bind (name type) - (cond - ((or (eq type :directory) (null filename)) - (values nil nil)) - (type - (values filename type)) - (t - (split-name-type filename))) - (apply 'make-pathname :directory (cons relative path) :name name :type type - (when defaults `(:defaults ,defaults)))))))) - -(defun* merge-component-name-type (name &key type defaults) - ;; For backwards compatibility only, for people using internals. - ;; Will be removed in a future release, e.g. 2.016. - (warn "Please don't use ASDF::MERGE-COMPONENT-NAME-TYPE. Use ASDF:COERCE-PATHNAME.") - (coerce-pathname name :type type :defaults defaults)) - -(defun* subpathname (pathname subpath &key type) - (and pathname (merge-pathnames* (coerce-pathname subpath :type type) - (pathname-directory-pathname pathname)))) - -(defun subpathname* (pathname subpath &key type) - (and pathname - (subpathname (ensure-directory-pathname pathname) subpath :type type))) - -(defun* length=n-p (x n) ;is it that (= (length x) n) ? - (check-type n (integer 0 *)) - (loop - :for l = x :then (cdr l) - :for i :downfrom n :do - (cond - ((zerop i) (return (null l))) - ((not (consp l)) (return nil))))) - -(defun* string-suffix-p (s suffix) - (check-type s string) - (check-type suffix string) - (let ((start (- (length s) (length suffix)))) - (and (<= 0 start) - (string-equal s suffix :start1 start)))) - -(defun* read-file-forms (file) - (with-open-file (in file) - (loop :with eof = (list nil) - :for form = (read in nil eof) - :until (eq form eof) - :collect form))) - -(defun* pathname-root (pathname) - (make-pathname :directory '(:absolute) - :name nil :type nil :version nil - :defaults pathname ;; host device, and on scl, *some* - ;; scheme-specific parts: port username password, not others: - . #.(or #+scl '(:parameters nil :query nil :fragment nil)))) - -(defun* probe-file* (p) - "when given a pathname P, probes the filesystem for a file or directory -with given pathname and if it exists return its truename." - (etypecase p - (null nil) - (string (probe-file* (parse-namestring p))) - (pathname (unless (wild-pathname-p p) - #.(or #+(or allegro clozure cmu cormanlisp ecl lispworks mkcl sbcl scl) - '(probe-file p) - #+clisp (aif (find-symbol* '#:probe-pathname :ext) - `(ignore-errors (,it p))) - '(ignore-errors (truename p))))))) - -(defun* truenamize (pathname &optional (defaults *default-pathname-defaults*)) - "Resolve as much of a pathname as possible" - (block nil - (when (typep pathname '(or null logical-pathname)) (return pathname)) - (let ((p (merge-pathnames* pathname defaults))) - (when (typep p 'logical-pathname) (return p)) - (let ((found (probe-file* p))) - (when found (return found))) - (unless (absolute-pathname-p p) - (let ((true-defaults (ignore-errors (truename defaults)))) - (when true-defaults - (setf p (merge-pathnames pathname true-defaults))))) - (unless (absolute-pathname-p p) (return p)) - (let ((sofar (probe-file* (pathname-root p)))) - (unless sofar (return p)) - (flet ((solution (directories) - (merge-pathnames* - (make-pathname :host nil :device nil - :directory `(:relative ,@directories) - :name (pathname-name p) - :type (pathname-type p) - :version (pathname-version p)) - sofar))) - (loop :with directory = (normalize-pathname-directory-component - (pathname-directory p)) - :for component :in (cdr directory) - :for rest :on (cdr directory) - :for more = (probe-file* - (merge-pathnames* - (make-pathname :directory `(:relative ,component)) - sofar)) :do - (if more - (setf sofar more) - (return (solution rest))) - :finally - (return (solution nil)))))))) - -(defun* resolve-symlinks (path) - #-allegro (truenamize path) - #+allegro (if (typep path 'logical-pathname) - path - (excl:pathname-resolve-symbolic-links path))) - -(defun* resolve-symlinks* (path) - (if *resolve-symlinks* - (and path (resolve-symlinks path)) - path)) - -(defun* ensure-pathname-absolute (path) - (cond - ((absolute-pathname-p path) path) - ((stringp path) (ensure-pathname-absolute (pathname path))) - ((not (pathnamep path)) (error "not a valid pathname designator ~S" path)) - (t (let ((resolved (resolve-symlinks path))) - (assert (absolute-pathname-p resolved)) - resolved)))) - -(defun* default-directory () - (truenamize (pathname-directory-pathname *default-pathname-defaults*))) - -(defun* lispize-pathname (input-file) - (make-pathname :type "lisp" :defaults input-file)) - -(defparameter *wild* #-cormanlisp :wild #+cormanlisp "*") -(defparameter *wild-file* - (make-pathname :name *wild* :type *wild* - :version (or #-(or abcl xcl) *wild*) :directory nil)) -(defparameter *wild-directory* - (make-pathname :directory `(:relative ,*wild*) :name nil :type nil :version nil)) -(defparameter *wild-inferiors* - (make-pathname :directory '(:relative :wild-inferiors) :name nil :type nil :version nil)) -(defparameter *wild-path* - (merge-pathnames *wild-file* *wild-inferiors*)) - -(defun* wilden (path) - (merge-pathnames* *wild-path* path)) - -#-scl -(defun* directory-separator-for-host (&optional (pathname *default-pathname-defaults*)) - (let ((foo (make-pathname :directory '(:absolute "FOO") :defaults pathname))) - (last-char (namestring foo)))) - -#-scl -(defun* directorize-pathname-host-device (pathname) - (let* ((root (pathname-root pathname)) - (wild-root (wilden root)) - (absolute-pathname (merge-pathnames* pathname root)) - (separator (directory-separator-for-host root)) - (root-namestring (namestring root)) - (root-string - (substitute-if #\/ - #'(lambda (x) (or (eql x #\:) - (eql x separator))) - root-namestring))) - (multiple-value-bind (relative path filename) - (component-name-to-pathname-components root-string :force-directory t) - (declare (ignore relative filename)) - (let ((new-base - (make-pathname :defaults root - :directory `(:absolute ,@path)))) - (translate-pathname absolute-pathname wild-root (wilden new-base)))))) - -#+scl -(defun* directorize-pathname-host-device (pathname) - (let ((scheme (ext:pathname-scheme pathname)) - (host (pathname-host pathname)) - (port (ext:pathname-port pathname)) - (directory (pathname-directory pathname))) - (flet ((specificp (x) (and x (not (eq x :unspecific))))) - (if (or (specificp port) - (and (specificp host) (plusp (length host))) - (specificp scheme)) - (let ((prefix "")) - (when (specificp port) - (setf prefix (format nil ":~D" port))) - (when (and (specificp host) (plusp (length host))) - (setf prefix (strcat host prefix))) - (setf prefix (strcat ":" prefix)) - (when (specificp scheme) - (setf prefix (strcat scheme prefix))) - (assert (and directory (eq (first directory) :absolute))) - (make-pathname :directory `(:absolute ,prefix ,@(rest directory)) - :defaults pathname))) - pathname))) - -;;;; ------------------------------------------------------------------------- -;;;; ASDF Interface, in terms of generic functions. -(defgeneric* find-system (system &optional error-p)) -(defgeneric* perform-with-restarts (operation component)) -(defgeneric* perform (operation component)) -(defgeneric* operation-done-p (operation component)) -(defgeneric* mark-operation-done (operation component)) -(defgeneric* explain (operation component)) -(defgeneric* output-files (operation component)) -(defgeneric* input-files (operation component)) -(defgeneric* component-operation-time (operation component)) -(defgeneric* operation-description (operation component) - (:documentation "returns a phrase that describes performing this operation -on this component, e.g. \"loading /a/b/c\". -You can put together sentences using this phrase.")) - -(defgeneric* system-source-file (system) - (:documentation "Return the source file in which system is defined.")) - -(defgeneric* component-system (component) - (:documentation "Find the top-level system containing COMPONENT")) - -(defgeneric* component-pathname (component) - (:documentation "Extracts the pathname applicable for a particular component.")) - -(defgeneric* component-relative-pathname (component) - (:documentation "Returns a pathname for the component argument intended to be -interpreted relative to the pathname of that component's parent. -Despite the function's name, the return value may be an absolute -pathname, because an absolute pathname may be interpreted relative to -another pathname in a degenerate way.")) - -(defgeneric* component-property (component property)) - -(defgeneric* (setf component-property) (new-value component property)) - -(defgeneric* component-external-format (component)) - -(defgeneric* component-encoding (component)) - -(eval-when (#-gcl :compile-toplevel :load-toplevel :execute) - (defgeneric* (setf module-components-by-name) (new-value module))) - -(defgeneric* version-satisfies (component version)) - -(defgeneric* find-component (base path) - (:documentation "Finds the component with PATH starting from BASE module; -if BASE is nil, then the component is assumed to be a system.")) - -(defgeneric* source-file-type (component system)) - -(defgeneric* operation-ancestor (operation) - (:documentation - "Recursively chase the operation's parent pointer until we get to -the head of the tree")) - -(defgeneric* component-visited-p (operation component) - (:documentation "Returns the value stored by a call to -VISIT-COMPONENT, if that has been called, otherwise NIL. -This value stored will be a cons cell, the first element -of which is a computed key, so not interesting. The -CDR wil be the DATA value stored by VISIT-COMPONENT; recover -it as (cdr (component-visited-p op c)). - In the current form of ASDF, the DATA value retrieved is -effectively a boolean, indicating whether some operations are -to be performed in order to do OPERATION X COMPONENT. If the -data value is NIL, the combination had been explored, but no -operations needed to be performed.")) - -(defgeneric* visit-component (operation component data) - (:documentation "Record DATA as being associated with OPERATION -and COMPONENT. This is a side-effecting function: the association -will be recorded on the ROOT OPERATION \(OPERATION-ANCESTOR of the -OPERATION\). - No evidence that DATA is ever interesting, beyond just being -non-NIL. Using the data field is probably very risky; if there is -already a record for OPERATION X COMPONENT, DATA will be quietly -discarded instead of recorded. - Starting with 2.006, TRAVERSE will store an integer in data, -so that nodes can be sorted in decreasing order of traversal.")) - - -(defgeneric* (setf visiting-component) (new-value operation component)) - -(defgeneric* component-visiting-p (operation component)) - -(defgeneric* component-depends-on (operation component) - (:documentation - "Returns a list of dependencies needed by the component to perform - the operation. A dependency has one of the following forms: - - ( *), where is a class - designator and each is a component - designator, which means that the component depends on - having been performed on each ; or - - (FEATURE ), which means that the component depends - on 's presence in *FEATURES*. - - Methods specialized on subclasses of existing component types - should usually append the results of CALL-NEXT-METHOD to the - list.")) - -(defgeneric* component-self-dependencies (operation component)) - -(defgeneric* traverse (operation component) - (:documentation -"Generate and return a plan for performing OPERATION on COMPONENT. - -The plan returned is a list of dotted-pairs. Each pair is the CONS -of ASDF operation object and a COMPONENT object. The pairs will be -processed in order by OPERATE.")) - - -;;;; ------------------------------------------------------------------------- -;;; Methods in case of hot-upgrade. See https://bugs.launchpad.net/asdf/+bug/485687 -(when *upgraded-p* - (when (find-class 'module nil) - (eval - '(defmethod update-instance-for-redefined-class :after - ((m module) added deleted plist &key) - (declare (ignorable deleted plist)) - (when *asdf-verbose* - (asdf-message (compatfmt "~&~@<; ~@;Updating ~A for ASDF ~A~@:>~%") - m (asdf-version))) - (when (member 'components-by-name added) - (compute-module-components-by-name m)) - (when (typep m 'system) - (when (member 'source-file added) - (%set-system-source-file - (probe-asd (component-name m) (component-pathname m)) m) - (when (equal (component-name m) "asdf") - (setf (component-version m) *asdf-version*)))))))) - -;;;; ------------------------------------------------------------------------- -;;;; Classes, Conditions - -(define-condition system-definition-error (error) () - ;; [this use of :report should be redundant, but unfortunately it's not. - ;; cmucl's lisp::output-instance prefers the kernel:slot-class-print-function - ;; over print-object; this is always conditions::%print-condition for - ;; condition objects, which in turn does inheritance of :report options at - ;; run-time. fortunately, inheritance means we only need this kludge here in - ;; order to fix all conditions that build on it. -- rgr, 28-Jul-02.] - #+cmu (:report print-object)) - -(define-condition formatted-system-definition-error (system-definition-error) - ((format-control :initarg :format-control :reader format-control) - (format-arguments :initarg :format-arguments :reader format-arguments)) - (:report (lambda (c s) - (apply 'format s (format-control c) (format-arguments c))))) - -(define-condition load-system-definition-error (system-definition-error) - ((name :initarg :name :reader error-name) - (pathname :initarg :pathname :reader error-pathname) - (condition :initarg :condition :reader error-condition)) - (:report (lambda (c s) - (format s (compatfmt "~@") - (error-name c) (error-pathname c) (error-condition c))))) - -(define-condition circular-dependency (system-definition-error) - ((components :initarg :components :reader circular-dependency-components)) - (:report (lambda (c s) - (format s (compatfmt "~@") - (circular-dependency-components c))))) - -(define-condition duplicate-names (system-definition-error) - ((name :initarg :name :reader duplicate-names-name)) - (:report (lambda (c s) - (format s (compatfmt "~@") - (duplicate-names-name c))))) - -(define-condition missing-component (system-definition-error) - ((requires :initform "(unnamed)" :reader missing-requires :initarg :requires) - (parent :initform nil :reader missing-parent :initarg :parent))) - -(define-condition missing-component-of-version (missing-component) - ((version :initform nil :reader missing-version :initarg :version))) - -(define-condition missing-dependency (missing-component) - ((required-by :initarg :required-by :reader missing-required-by))) - -(define-condition missing-dependency-of-version (missing-dependency - missing-component-of-version) - ()) - -(define-condition operation-error (error) - ((component :reader error-component :initarg :component) - (operation :reader error-operation :initarg :operation)) - (:report (lambda (c s) - (format s (compatfmt "~@") - (error-operation c) (error-component c))))) -(define-condition compile-error (operation-error) ()) -(define-condition compile-failed (compile-error) ()) -(define-condition compile-warned (compile-error) ()) - -(define-condition invalid-configuration () - ((form :reader condition-form :initarg :form) - (location :reader condition-location :initarg :location) - (format :reader condition-format :initarg :format) - (arguments :reader condition-arguments :initarg :arguments :initform nil)) - (:report (lambda (c s) - (format s (compatfmt "~@<~? (will be skipped)~@:>") - (condition-format c) - (list* (condition-form c) (condition-location c) - (condition-arguments c)))))) -(define-condition invalid-source-registry (invalid-configuration warning) - ((format :initform (compatfmt "~@")))) -(define-condition invalid-output-translation (invalid-configuration warning) - ((format :initform (compatfmt "~@")))) - -(defclass component () - ((name :accessor component-name :initarg :name :type string :documentation - "Component name: designator for a string composed of portable pathname characters") - ;; We might want to constrain version with - ;; :type (and string (satisfies parse-version)) - ;; but we cannot until we fix all systems that don't use it correctly! - (version :accessor component-version :initarg :version) - (description :accessor component-description :initarg :description) - (long-description :accessor component-long-description :initarg :long-description) - ;; This one below is used by POIU - http://www.cliki.net/poiu - ;; a parallelizing extension of ASDF that compiles in multiple parallel - ;; slave processes (forked on demand) and loads in the master process. - ;; Maybe in the future ASDF may use it internally instead of in-order-to. - (load-dependencies :accessor component-load-dependencies :initform nil) - ;; In the ASDF object model, dependencies exist between *actions* - ;; (an action is a pair of operation and component). They are represented - ;; alists of operations to dependencies (other actions) in each component. - ;; There are two kinds of dependencies, each stored in its own slot: - ;; in-order-to and do-first dependencies. These two kinds are related to - ;; the fact that some actions modify the filesystem, - ;; whereas other actions modify the current image, and - ;; this implies a difference in how to interpret timestamps. - ;; in-order-to dependencies will trigger re-performing the action - ;; when the timestamp of some dependency - ;; makes the timestamp of current action out-of-date; - ;; do-first dependencies do not trigger such re-performing. - ;; Therefore, a FASL must be recompiled if it is obsoleted - ;; by any of its FASL dependencies (in-order-to); but - ;; it needn't be recompiled just because one of these dependencies - ;; hasn't yet been loaded in the current image (do-first). - ;; The names are crap, but they have been the official API since Dan Barlow's ASDF 1.52! - ;; LispWorks's defsystem has caused-by and requires for in-order-to and do-first respectively. - ;; Maybe rename the slots in ASDF? But that's not very backwards compatible. - ;; See our ASDF 2 paper for more complete explanations. - (in-order-to :initform nil :initarg :in-order-to - :accessor component-in-order-to) - (do-first :initform nil :initarg :do-first - :accessor component-do-first) - ;; methods defined using the "inline" style inside a defsystem form: - ;; need to store them somewhere so we can delete them when the system - ;; is re-evaluated - (inline-methods :accessor component-inline-methods :initform nil) - (parent :initarg :parent :initform nil :reader component-parent) - ;; no direct accessor for pathname, we do this as a method to allow - ;; it to default in funky ways if not supplied - (relative-pathname :initarg :pathname) - ;; the absolute-pathname is computed based on relative-pathname... - (absolute-pathname) - (operation-times :initform (make-hash-table) - :accessor component-operation-times) - (around-compile :initarg :around-compile) - (%encoding :accessor %component-encoding :initform nil :initarg :encoding) - ;; XXX we should provide some atomic interface for updating the - ;; component properties - (properties :accessor component-properties :initarg :properties - :initform nil))) - -(defun* component-find-path (component) - (reverse - (loop :for c = component :then (component-parent c) - :while c :collect (component-name c)))) - -(defmethod print-object ((c component) stream) - (print-unreadable-object (c stream :type t :identity nil) - (format stream "~{~S~^ ~}" (component-find-path c)))) - - -;;;; methods: conditions - -(defmethod print-object ((c missing-dependency) s) - (format s (compatfmt "~@<~A, required by ~A~@:>") - (call-next-method c nil) (missing-required-by c))) - -(defun* sysdef-error (format &rest arguments) - (error 'formatted-system-definition-error :format-control - format :format-arguments arguments)) - -;;;; methods: components - -(defmethod print-object ((c missing-component) s) - (format s (compatfmt "~@") - (missing-requires c) - (when (missing-parent c) - (coerce-name (missing-parent c))))) - -(defmethod print-object ((c missing-component-of-version) s) - (format s (compatfmt "~@") - (missing-requires c) - (missing-version c) - (when (missing-parent c) - (coerce-name (missing-parent c))))) - -(defmethod component-system ((component component)) - (aif (component-parent component) - (component-system it) - component)) - -(defvar *default-component-class* 'cl-source-file) - -(defun* compute-module-components-by-name (module) - (let ((hash (make-hash-table :test 'equal))) - (setf (module-components-by-name module) hash) - (loop :for c :in (module-components module) - :for name = (component-name c) - :for previous = (gethash name (module-components-by-name module)) - :do - (when previous - (error 'duplicate-names :name name)) - :do (setf (gethash name (module-components-by-name module)) c)) - hash)) - -(defclass module (component) - ((components - :initform nil - :initarg :components - :accessor module-components) - (components-by-name - :accessor module-components-by-name) - ;; What to do if we can't satisfy a dependency of one of this module's - ;; components. This allows a limited form of conditional processing. - (if-component-dep-fails - :initform :fail - :initarg :if-component-dep-fails - :accessor module-if-component-dep-fails) - (default-component-class - :initform nil - :initarg :default-component-class - :accessor module-default-component-class))) - -(defun* component-parent-pathname (component) - ;; No default anymore (in particular, no *default-pathname-defaults*). - ;; If you force component to have a NULL pathname, you better arrange - ;; for any of its children to explicitly provide a proper absolute pathname - ;; wherever a pathname is actually wanted. - (let ((parent (component-parent component))) - (when parent - (component-pathname parent)))) - -(defmethod component-pathname ((component component)) - (if (slot-boundp component 'absolute-pathname) - (slot-value component 'absolute-pathname) - (let ((pathname - (merge-pathnames* - (component-relative-pathname component) - (pathname-directory-pathname (component-parent-pathname component))))) - (unless (or (null pathname) (absolute-pathname-p pathname)) - (error (compatfmt "~@") - pathname (component-find-path component))) - (setf (slot-value component 'absolute-pathname) pathname) - pathname))) - -(defmethod component-property ((c component) property) - (cdr (assoc property (slot-value c 'properties) :test #'equal))) - -(defmethod (setf component-property) (new-value (c component) property) - (let ((a (assoc property (slot-value c 'properties) :test #'equal))) - (if a - (setf (cdr a) new-value) - (setf (slot-value c 'properties) - (acons property new-value (slot-value c 'properties))))) - new-value) - -(defvar *default-encoding* :default - "Default encoding for source files. -The default value :default preserves the legacy behavior. -A future default might be :utf-8 or :autodetect -reading emacs-style -*- coding: utf-8 -*- specifications, -and falling back to utf-8 or latin1 if nothing is specified.") - -(defparameter *utf-8-external-format* - #+(and asdf-unicode (not clisp)) :utf-8 - #+(and asdf-unicode clisp) charset:utf-8 - #-asdf-unicode :default - "Default :external-format argument to pass to CL:OPEN and also -CL:LOAD or CL:COMPILE-FILE to best process a UTF-8 encoded file. -On modern implementations, this will decode UTF-8 code points as CL characters. -On legacy implementations, it may fall back on some 8-bit encoding, -with non-ASCII code points being read as several CL characters; -hopefully, if done consistently, that won't affect program behavior too much.") - -(defun* always-default-encoding (pathname) - (declare (ignore pathname)) - *default-encoding*) - -(defvar *encoding-detection-hook* #'always-default-encoding - "Hook for an extension to define a function to automatically detect a file's encoding") - -(defun* detect-encoding (pathname) - (funcall *encoding-detection-hook* pathname)) - -(defmethod component-encoding ((c component)) - (or (loop :for x = c :then (component-parent x) - :while x :thereis (%component-encoding x)) - (detect-encoding (component-pathname c)))) - -(defun* default-encoding-external-format (encoding) - (case encoding - (:default :default) ;; for backwards compatibility only. Explicit usage discouraged. - (:utf-8 *utf-8-external-format*) - (otherwise - (cerror "Continue using :external-format :default" (compatfmt "~@") encoding) - :default))) - -(defvar *encoding-external-format-hook* - #'default-encoding-external-format - "Hook for an extension to define a mapping between non-default encodings -and implementation-defined external-format's") - -(defun encoding-external-format (encoding) - (funcall *encoding-external-format-hook* encoding)) - -(defmethod component-external-format ((c component)) - (encoding-external-format (component-encoding c))) - -(defclass proto-system () ; slots to keep when resetting a system - ;; To preserve identity for all objects, we'd need keep the components slots - ;; but also to modify parse-component-form to reset the recycled objects. - ((name) #|(components) (components-by-names)|#)) - -(defclass system (module proto-system) - (;; description and long-description are now available for all component's, - ;; but now also inherited from component, but we add the legacy accessor - (description :accessor system-description :initarg :description) - (long-description :accessor system-long-description :initarg :long-description) - (author :accessor system-author :initarg :author) - (maintainer :accessor system-maintainer :initarg :maintainer) - (licence :accessor system-licence :initarg :licence - :accessor system-license :initarg :license) - (source-file :reader %system-source-file :initarg :source-file ; for CLISP upgrade - :writer %set-system-source-file) - (defsystem-depends-on :reader system-defsystem-depends-on :initarg :defsystem-depends-on))) - -;;;; ------------------------------------------------------------------------- -;;;; version-satisfies - -(defmethod version-satisfies ((c component) version) - (unless (and version (slot-boundp c 'version)) - (when version - (warn "Requested version ~S but component ~S has no version" version c)) - (return-from version-satisfies t)) - (version-satisfies (component-version c) version)) - -(defun* asdf-version () - "Exported interface to the version of ASDF currently installed. A string. -You can compare this string with e.g.: -(ASDF:VERSION-SATISFIES (ASDF:ASDF-VERSION) \"2.345.67\")." - *asdf-version*) - -(defun* parse-version (string &optional on-error) - "Parse a version string as a series of natural integers separated by dots. -Return a (non-null) list of integers if the string is valid, NIL otherwise. -If on-error is error, warn, or designates a function of compatible signature, -the function is called with an explanation of what is wrong with the argument. -NB: ignores leading zeroes, and so doesn't distinguish between 2.003 and 2.3" - (and - (or (stringp string) - (when on-error - (funcall on-error "~S: ~S is not a string" - 'parse-version string)) nil) - (or (loop :for prev = nil :then c :for c :across string - :always (or (digit-char-p c) - (and (eql c #\.) prev (not (eql prev #\.)))) - :finally (return (and c (digit-char-p c)))) - (when on-error - (funcall on-error "~S: ~S doesn't follow asdf version numbering convention" - 'parse-version string)) nil) - (mapcar #'parse-integer (split-string string :separator ".")))) - -(defmethod version-satisfies ((cver string) version) - (let ((x (parse-version cver 'warn)) - (y (parse-version version 'warn))) - (labels ((bigger (x y) - (cond ((not y) t) - ((not x) nil) - ((> (car x) (car y)) t) - ((= (car x) (car y)) - (bigger (cdr x) (cdr y)))))) - (and x y (= (car x) (car y)) - (or (not (cdr y)) (bigger (cdr x) (cdr y))))))) - -;;;; ----------------------------------------------------------------- -;;;; Windows shortcut support. Based on: -;;;; -;;;; Jesse Hager: The Windows Shortcut File Format. -;;;; http://www.wotsit.org/list.asp?fc=13 - -#-(or clisp genera) ; CLISP doesn't need it, and READ-SEQUENCE annoys old Genera. -(progn -(defparameter *link-initial-dword* 76) -(defparameter *link-guid* #(1 20 2 0 0 0 0 0 192 0 0 0 0 0 0 70)) - -(defun* read-null-terminated-string (s) - (with-output-to-string (out) - (loop :for code = (read-byte s) - :until (zerop code) - :do (write-char (code-char code) out)))) - -(defun* read-little-endian (s &optional (bytes 4)) - (loop :for i :from 0 :below bytes - :sum (ash (read-byte s) (* 8 i)))) - -(defun* parse-file-location-info (s) - (let ((start (file-position s)) - (total-length (read-little-endian s)) - (end-of-header (read-little-endian s)) - (fli-flags (read-little-endian s)) - (local-volume-offset (read-little-endian s)) - (local-offset (read-little-endian s)) - (network-volume-offset (read-little-endian s)) - (remaining-offset (read-little-endian s))) - (declare (ignore total-length end-of-header local-volume-offset)) - (unless (zerop fli-flags) - (cond - ((logbitp 0 fli-flags) - (file-position s (+ start local-offset))) - ((logbitp 1 fli-flags) - (file-position s (+ start - network-volume-offset - #x14)))) - (strcat (read-null-terminated-string s) - (progn - (file-position s (+ start remaining-offset)) - (read-null-terminated-string s)))))) - -(defun* parse-windows-shortcut (pathname) - (with-open-file (s pathname :element-type '(unsigned-byte 8)) - (handler-case - (when (and (= (read-little-endian s) *link-initial-dword*) - (let ((header (make-array (length *link-guid*)))) - (read-sequence header s) - (equalp header *link-guid*))) - (let ((flags (read-little-endian s))) - (file-position s 76) ;skip rest of header - (when (logbitp 0 flags) - ;; skip shell item id list - (let ((length (read-little-endian s 2))) - (file-position s (+ length (file-position s))))) - (cond - ((logbitp 1 flags) - (parse-file-location-info s)) - (t - (when (logbitp 2 flags) - ;; skip description string - (let ((length (read-little-endian s 2))) - (file-position s (+ length (file-position s))))) - (when (logbitp 3 flags) - ;; finally, our pathname - (let* ((length (read-little-endian s 2)) - (buffer (make-array length))) - (read-sequence buffer s) - (map 'string #'code-char buffer))))))) - (end-of-file () - nil))))) - -;;;; ------------------------------------------------------------------------- -;;;; Finding systems - -(defun* make-defined-systems-table () - (make-hash-table :test 'equal)) - -(defvar *defined-systems* (make-defined-systems-table) - "This is a hash table whose keys are strings, being the -names of the systems, and whose values are pairs, the first -element of which is a universal-time indicating when the -system definition was last updated, and the second element -of which is a system object.") - -(defun* coerce-name (name) - (typecase name - (component (component-name name)) - (symbol (string-downcase (symbol-name name))) - (string name) - (t (sysdef-error (compatfmt "~@") name)))) - -(defun* system-registered-p (name) - (gethash (coerce-name name) *defined-systems*)) - -(defun* registered-systems () - (loop :for (() . system) :being :the :hash-values :of *defined-systems* - :collect (coerce-name system))) - -(defun* register-system (system) - (check-type system system) - (let ((name (component-name system))) - (check-type name string) - (asdf-message (compatfmt "~&~@<; ~@;Registering ~3i~_~A~@:>~%") system) - (unless (eq system (cdr (gethash name *defined-systems*))) - (setf (gethash name *defined-systems*) - (cons (get-universal-time) system))))) - -(defun* clear-system (name) - "Clear the entry for a system in the database of systems previously loaded. -Note that this does NOT in any way cause the code of the system to be unloaded." - ;; There is no "unload" operation in Common Lisp, and - ;; a general such operation cannot be portably written, - ;; considering how much CL relies on side-effects to global data structures. - (remhash (coerce-name name) *defined-systems*)) - -(defun* map-systems (fn) - "Apply FN to each defined system. - -FN should be a function of one argument. It will be -called with an object of type asdf:system." - (maphash #'(lambda (_ datum) - (declare (ignore _)) - (destructuring-bind (_ . def) datum - (declare (ignore _)) - (funcall fn def))) - *defined-systems*)) - -;;; for the sake of keeping things reasonably neat, we adopt a -;;; convention that functions in this list are prefixed SYSDEF- - -(defvar *system-definition-search-functions* '()) - -(setf *system-definition-search-functions* - (append - ;; Remove known-incompatible sysdef functions from ancient sbcl asdf. - (remove 'contrib-sysdef-search *system-definition-search-functions*) - ;; Tuck our defaults at the end of the list if they were absent. - ;; This is imperfect, in case they were removed on purpose, - ;; but then it will be the responsibility of whoever does that - ;; to upgrade asdf before he does such a thing rather than after. - (remove-if #'(lambda (x) (member x *system-definition-search-functions*)) - '(sysdef-central-registry-search - sysdef-source-registry-search - sysdef-find-asdf)))) - -(defun* search-for-system-definition (system) - (some (let ((name (coerce-name system))) #'(lambda (x) (funcall x name))) - (cons 'find-system-if-being-defined - *system-definition-search-functions*))) - -(defvar *central-registry* nil -"A list of 'system directory designators' ASDF uses to find systems. - -A 'system directory designator' is a pathname or an expression -which evaluates to a pathname. For example: - - (setf asdf:*central-registry* - (list '*default-pathname-defaults* - #p\"/home/me/cl/systems/\" - #p\"/usr/share/common-lisp/systems/\")) - -This is for backward compatibilily. -Going forward, we recommend new users should be using the source-registry. -") - -(defun* featurep (x &optional (features *features*)) - (cond - ((atom x) - (and (member x features) t)) - ((eq :not (car x)) - (assert (null (cddr x))) - (not (featurep (cadr x) features))) - ((eq :or (car x)) - (some #'(lambda (x) (featurep x features)) (cdr x))) - ((eq :and (car x)) - (every #'(lambda (x) (featurep x features)) (cdr x))) - (t - (error "Malformed feature specification ~S" x)))) - -(defun* os-unix-p () - (featurep '(:or :unix :cygwin :darwin))) - -(defun* os-windows-p () - (and (not (os-unix-p)) (featurep '(:or :win32 :windows :mswindows :mingw32)))) - -(defun* probe-asd (name defaults) - (block nil - (when (directory-pathname-p defaults) - (let* ((file (probe-file* (subpathname defaults (strcat name ".asd"))))) - (when file - (return file))) - #-(or clisp genera) ; clisp doesn't need it, plain genera doesn't have read-sequence(!) - (when (os-windows-p) - (let ((shortcut - (make-pathname - :defaults defaults :version :newest :case :local - :name (strcat name ".asd") - :type "lnk"))) - (when (probe-file* shortcut) - (let ((target (parse-windows-shortcut shortcut))) - (when target - (return (pathname target)))))))))) - -(defun* sysdef-central-registry-search (system) - (let ((name (coerce-name system)) - (to-remove nil) - (to-replace nil)) - (block nil - (unwind-protect - (dolist (dir *central-registry*) - (let ((defaults (eval dir))) - (when defaults - (cond ((directory-pathname-p defaults) - (let ((file (probe-asd name defaults))) - (when file - (return file)))) - (t - (restart-case - (let* ((*print-circle* nil) - (message - (format nil - (compatfmt "~@") - system dir defaults))) - (error message)) - (remove-entry-from-registry () - :report "Remove entry from *central-registry* and continue" - (push dir to-remove)) - (coerce-entry-to-directory () - :report (lambda (s) - (format s (compatfmt "~@") - (ensure-directory-pathname defaults) dir)) - (push (cons dir (ensure-directory-pathname defaults)) to-replace)))))))) - ;; cleanup - (dolist (dir to-remove) - (setf *central-registry* (remove dir *central-registry*))) - (dolist (pair to-replace) - (let* ((current (car pair)) - (new (cdr pair)) - (position (position current *central-registry*))) - (setf *central-registry* - (append (subseq *central-registry* 0 position) - (list new) - (subseq *central-registry* (1+ position)))))))))) - -(defun* make-temporary-package () - (flet ((try (counter) - (ignore-errors - (make-package (format nil "~A~D" :asdf counter) - :use '(:cl :asdf))))) - (do* ((counter 0 (+ counter 1)) - (package (try counter) (try counter))) - (package package)))) - -(defun* safe-file-write-date (pathname) - ;; If FILE-WRITE-DATE returns NIL, it's possible that - ;; the user or some other agent has deleted an input file. - ;; Also, generated files will not exist at the time planning is done - ;; and calls operation-done-p which calls safe-file-write-date. - ;; So it is very possible that we can't get a valid file-write-date, - ;; and we can survive and we will continue the planning - ;; as if the file were very old. - ;; (or should we treat the case in a different, special way?) - (or (and pathname (probe-file* pathname) (ignore-errors (file-write-date pathname))) - (progn - (when (and pathname *asdf-verbose*) - (warn (compatfmt "~@") - pathname)) - 0))) - -(defmethod find-system ((name null) &optional (error-p t)) - (declare (ignorable name)) - (when error-p - (sysdef-error (compatfmt "~@")))) - -(defmethod find-system (name &optional (error-p t)) - (find-system (coerce-name name) error-p)) - -(defvar *systems-being-defined* nil - "A hash-table of systems currently being defined keyed by name, or NIL") - -(defun* find-system-if-being-defined (name) - (when *systems-being-defined* - (gethash (coerce-name name) *systems-being-defined*))) - -(defun* call-with-system-definitions (thunk) - (if *systems-being-defined* - (funcall thunk) - (let ((*systems-being-defined* (make-hash-table :test 'equal))) - (funcall thunk)))) - -(defmacro with-system-definitions ((&optional) &body body) - `(call-with-system-definitions #'(lambda () ,@body))) - -(defun* load-sysdef (name pathname) - ;; Tries to load system definition with canonical NAME from PATHNAME. - (with-system-definitions () - (let ((package (make-temporary-package))) - (unwind-protect - (handler-bind - ((error #'(lambda (condition) - (error 'load-system-definition-error - :name name :pathname pathname - :condition condition)))) - (let ((*package* package) - (*default-pathname-defaults* - ;; resolve logical-pathnames so they won't wreak havoc in parsing namestrings. - (pathname-directory-pathname (translate-logical-pathname pathname))) - (external-format (encoding-external-format (detect-encoding pathname)))) - (asdf-message (compatfmt "~&~@<; ~@;Loading system definition from ~A into ~A~@:>~%") - pathname package) - (load pathname :external-format external-format))) - (delete-package package))))) - -(defun* locate-system (name) - "Given a system NAME designator, try to locate where to load the system from. -Returns five values: FOUNDP FOUND-SYSTEM PATHNAME PREVIOUS PREVIOUS-TIME -FOUNDP is true when a system was found, -either a new unregistered one or a previously registered one. -FOUND-SYSTEM when not null is a SYSTEM object that may be REGISTER-SYSTEM'ed as is -PATHNAME when not null is a path from where to load the system, -either associated with FOUND-SYSTEM, or with the PREVIOUS system. -PREVIOUS when not null is a previously loaded SYSTEM object of same name. -PREVIOUS-TIME when not null is the time at which the PREVIOUS system was loaded." - (let* ((name (coerce-name name)) - (in-memory (system-registered-p name)) ; load from disk if absent or newer on disk - (previous (cdr in-memory)) - (previous (and (typep previous 'system) previous)) - (previous-time (car in-memory)) - (found (search-for-system-definition name)) - (found-system (and (typep found 'system) found)) - (pathname (or (and (typep found '(or pathname string)) (pathname found)) - (and found-system (system-source-file found-system)) - (and previous (system-source-file previous)))) - (foundp (and (or found-system pathname previous) t))) - (check-type found (or null pathname system)) - (when foundp - (setf pathname (resolve-symlinks* pathname)) - (when (and pathname (not (absolute-pathname-p pathname))) - (setf pathname (ensure-pathname-absolute pathname)) - (when found-system - (%set-system-source-file pathname found-system))) - (when (and previous (not (#-cormanlisp equal #+cormanlisp equalp - (system-source-file previous) pathname))) - (%set-system-source-file pathname previous) - (setf previous-time nil)) - (values foundp found-system pathname previous previous-time)))) - -(defmethod find-system ((name string) &optional (error-p t)) - (with-system-definitions () - (loop - (restart-case - (multiple-value-bind (foundp found-system pathname previous previous-time) - (locate-system name) - (declare (ignore foundp)) - (when (and found-system (not previous)) - (register-system found-system)) - (when (and pathname - (or (not previous-time) - ;; don't reload if it's already been loaded, - ;; or its filestamp is in the future which means some clock is skewed - ;; and trying to load might cause an infinite loop. - (< previous-time (safe-file-write-date pathname) (get-universal-time)))) - (load-sysdef name pathname)) - (let ((in-memory (system-registered-p name))) ; try again after loading from disk if needed - (return - (cond - (in-memory - (when pathname - (setf (car in-memory) (safe-file-write-date pathname))) - (cdr in-memory)) - (error-p - (error 'missing-component :requires name)))))) - (reinitialize-source-registry-and-retry () - :report (lambda (s) - (format s (compatfmt "~@") name)) - (initialize-source-registry)))))) - -(defun* find-system-fallback (requested fallback &rest keys &key source-file &allow-other-keys) - (setf fallback (coerce-name fallback) - requested (coerce-name requested)) - (when (equal requested fallback) - (let ((registered (cdr (gethash fallback *defined-systems*)))) - (or registered - (apply 'make-instance 'system - :name fallback :source-file source-file keys))))) - -(defun* sysdef-find-asdf (name) - ;; Bug: :version *asdf-version* won't be updated when ASDF is updated. - (find-system-fallback name "asdf" :version *asdf-version*)) - - -;;;; ------------------------------------------------------------------------- -;;;; Finding components - -(defmethod find-component ((base string) path) - (let ((s (find-system base nil))) - (and s (find-component s path)))) - -(defmethod find-component ((base symbol) path) - (cond - (base (find-component (coerce-name base) path)) - (path (find-component path nil)) - (t nil))) - -(defmethod find-component ((base cons) path) - (find-component (car base) (cons (cdr base) path))) - -(defmethod find-component ((module module) (name string)) - (unless (slot-boundp module 'components-by-name) ;; SBCL may miss the u-i-f-r-c method!!! - (compute-module-components-by-name module)) - (values (gethash name (module-components-by-name module)))) - -(defmethod find-component ((component component) (name symbol)) - (if name - (find-component component (coerce-name name)) - component)) - -(defmethod find-component ((module module) (name cons)) - (find-component (find-component module (car name)) (cdr name))) - - -;;; component subclasses - -(defclass source-file (component) - ((type :accessor source-file-explicit-type :initarg :type :initform nil))) - -(defclass cl-source-file (source-file) - ((type :initform "lisp"))) -(defclass cl-source-file.cl (cl-source-file) - ((type :initform "cl"))) -(defclass cl-source-file.lsp (cl-source-file) - ((type :initform "lsp"))) -(defclass c-source-file (source-file) - ((type :initform "c"))) -(defclass java-source-file (source-file) - ((type :initform "java"))) -(defclass static-file (source-file) ()) -(defclass doc-file (static-file) ()) -(defclass html-file (doc-file) - ((type :initform "html"))) - -(defmethod source-file-type ((component module) (s module)) - (declare (ignorable component s)) - :directory) -(defmethod source-file-type ((component source-file) (s module)) - (declare (ignorable s)) - (source-file-explicit-type component)) - -(defmethod component-relative-pathname ((component component)) - (coerce-pathname - (or (slot-value component 'relative-pathname) - (component-name component)) - :type (source-file-type component (component-system component)) - :defaults (component-parent-pathname component))) - -;;;; ------------------------------------------------------------------------- -;;;; Operations - -;;; one of these is instantiated whenever #'operate is called - -(defclass operation () - (;; as of danb's 2003-03-16 commit e0d02781, :force can be: - ;; T to force the inside of the specified system, - ;; but not recurse to other systems we depend on. - ;; :ALL (or any other atom) to force all systems - ;; including other systems we depend on. - ;; (SYSTEM1 SYSTEM2 ... SYSTEMN) - ;; to force systems named in a given list - ;; However, but this feature has only ever worked but starting with ASDF 2.014.5 - (forced :initform nil :initarg :force :accessor operation-forced) - (forced-not :initform nil :initarg :force-not :accessor operation-forced-not) - (original-initargs :initform nil :initarg :original-initargs - :accessor operation-original-initargs) - (visited-nodes :initform (make-hash-table :test 'equal) :accessor operation-visited-nodes) - (visiting-nodes :initform (make-hash-table :test 'equal) :accessor operation-visiting-nodes) - (parent :initform nil :initarg :parent :accessor operation-parent))) - -(defmethod print-object ((o operation) stream) - (print-unreadable-object (o stream :type t :identity t) - (ignore-errors - (prin1 (operation-original-initargs o) stream)))) - -(defmethod shared-initialize :after ((operation operation) slot-names - &key force force-not - &allow-other-keys) - ;; the &allow-other-keys disables initarg validity checking - (declare (ignorable operation slot-names force force-not)) - (macrolet ((frob (x) ;; normalize forced and forced-not slots - `(when (consp (,x operation)) - (setf (,x operation) - (mapcar #'coerce-name (,x operation)))))) - (frob operation-forced) (frob operation-forced-not)) - (values)) - -(defun* node-for (o c) - (cons (class-name (class-of o)) c)) - -(defmethod operation-ancestor ((operation operation)) - (aif (operation-parent operation) - (operation-ancestor it) - operation)) - - -(defun* make-sub-operation (c o dep-c dep-o) - "C is a component, O is an operation, DEP-C is another -component, and DEP-O, confusingly enough, is an operation -class specifier, not an operation." - (let* ((args (copy-list (operation-original-initargs o))) - (force-p (getf args :force))) - ;; note explicit comparison with T: any other non-NIL force value - ;; (e.g. :recursive) will pass through - (cond ((and (null (component-parent c)) - (null (component-parent dep-c)) - (not (eql c dep-c))) - (when (eql force-p t) - (setf (getf args :force) nil)) - (apply 'make-instance dep-o - :parent o - :original-initargs args args)) - ((subtypep (type-of o) dep-o) - o) - (t - (apply 'make-instance dep-o - :parent o :original-initargs args args))))) - - -(defmethod visit-component ((o operation) (c component) data) - (unless (component-visited-p o c) - (setf (gethash (node-for o c) - (operation-visited-nodes (operation-ancestor o))) - (cons t data)))) - -(defmethod component-visited-p ((o operation) (c component)) - (gethash (node-for o c) - (operation-visited-nodes (operation-ancestor o)))) - -(defmethod (setf visiting-component) (new-value operation component) - ;; MCL complains about unused lexical variables - (declare (ignorable operation component)) - new-value) - -(defmethod (setf visiting-component) (new-value (o operation) (c component)) - (let ((node (node-for o c)) - (a (operation-ancestor o))) - (if new-value - (setf (gethash node (operation-visiting-nodes a)) t) - (remhash node (operation-visiting-nodes a))) - new-value)) - -(defmethod component-visiting-p ((o operation) (c component)) - (let ((node (node-for o c))) - (gethash node (operation-visiting-nodes (operation-ancestor o))))) - -(defmethod component-depends-on ((op-spec symbol) (c component)) - ;; Note: we go from op-spec to operation via make-instance - ;; to allow for specialization through defmethod's, even though - ;; it's a detour in the default case below. - (component-depends-on (make-instance op-spec) c)) - -(defmethod component-depends-on ((o operation) (c component)) - (cdr (assoc (type-of o) (component-in-order-to c)))) - -(defmethod component-self-dependencies ((o operation) (c component)) - (remove-if-not - #'(lambda (x) (member (component-name c) (cdr x) :test #'string=)) - (component-depends-on o c))) - -(defmethod input-files ((operation operation) (c component)) - (let ((parent (component-parent c)) - (self-deps (component-self-dependencies operation c))) - (if self-deps - (mapcan #'(lambda (dep) - (destructuring-bind (op name) dep - (output-files (make-instance op) - (find-component parent name)))) - self-deps) - ;; no previous operations needed? I guess we work with the - ;; original source file, then - (list (component-pathname c))))) - -(defmethod input-files ((operation operation) (c module)) - (declare (ignorable operation c)) - nil) - -(defmethod component-operation-time (o c) - (gethash (type-of o) (component-operation-times c))) - -(defmethod operation-done-p ((o operation) (c component)) - (let ((out-files (output-files o c)) - (in-files (input-files o c)) - (op-time (component-operation-time o c))) - (flet ((earliest-out () - (reduce #'min (mapcar #'safe-file-write-date out-files))) - (latest-in () - (reduce #'max (mapcar #'safe-file-write-date in-files)))) - (cond - ((and (not in-files) (not out-files)) - ;; arbitrary decision: an operation that uses nothing to - ;; produce nothing probably isn't doing much. - ;; e.g. operations on systems, modules that have no immediate action, - ;; but are only meaningful through traversed dependencies - t) - ((not out-files) - ;; an operation without output-files is probably meant - ;; for its side-effects in the current image, - ;; assumed to be idem-potent, - ;; e.g. LOAD-OP or LOAD-SOURCE-OP of some CL-SOURCE-FILE. - (and op-time (>= op-time (latest-in)))) - ((not in-files) - ;; an operation with output-files and no input-files - ;; is probably meant for its side-effects on the file-system, - ;; assumed to have to be done everytime. - ;; (I don't think there is any such case in ASDF unless extended) - nil) - (t - ;; an operation with both input and output files is assumed - ;; as computing the latter from the former, - ;; assumed to have been done if the latter are all older - ;; than the former. - ;; e.g. COMPILE-OP of some CL-SOURCE-FILE. - ;; We use >= instead of > to play nice with generated files. - ;; This opens a race condition if an input file is changed - ;; after the output is created but within the same second - ;; of filesystem time; but the same race condition exists - ;; whenever the computation from input to output takes more - ;; than one second of filesystem time (or just crosses the - ;; second). So that's cool. - (and - (every #'probe-file* in-files) - (every #'probe-file* out-files) - (>= (earliest-out) (latest-in)))))))) - - - -;;; For 1.700 I've done my best to refactor TRAVERSE -;;; by splitting it up in a bunch of functions, -;;; so as to improve the collection and use-detection algorithm. --fare -;;; The protocol is as follows: we pass around operation, dependency, -;;; bunch of other stuff, and a force argument. Return a force flag. -;;; The returned flag is T if anything has changed that requires a rebuild. -;;; The force argument is a list of components that will require a rebuild -;;; if the flag is T, at which point whoever returns the flag has to -;;; mark them all as forced, and whoever recurses again can use a NIL list -;;; as a further argument. - -(defvar *forcing* nil - "This dynamically-bound variable is used to force operations in -recursive calls to traverse.") - -(defgeneric* do-traverse (operation component collect)) - -(defun* resolve-dependency-name (component name &optional version) - (loop - (restart-case - (return - (let ((comp (find-component (component-parent component) name))) - (unless comp - (error 'missing-dependency - :required-by component - :requires name)) - (when version - (unless (version-satisfies comp version) - (error 'missing-dependency-of-version - :required-by component - :version version - :requires name))) - comp)) - (retry () - :report (lambda (s) - (format s (compatfmt "~@") name)) - :test - (lambda (c) - (or (null c) - (and (typep c 'missing-dependency) - (eq (missing-required-by c) component) - (equal (missing-requires c) name)))))))) - -(defun* resolve-dependency-spec (component dep-spec) - (cond - ((atom dep-spec) - (resolve-dependency-name component dep-spec)) - ;; Structured dependencies --- this parses keywords. - ;; The keywords could conceivably be broken out and cleanly (extensibly) - ;; processed by EQL methods. But for now, here's what we've got. - ((eq :version (first dep-spec)) - ;; https://bugs.launchpad.net/asdf/+bug/527788 - (resolve-dependency-name component (second dep-spec) (third dep-spec))) - ((eq :feature (first dep-spec)) - ;; This particular subform is not documented and - ;; has always been broken in the past. - ;; Therefore no one uses it, and I'm cerroring it out, - ;; after fixing it - ;; See https://bugs.launchpad.net/asdf/+bug/518467 - (cerror "Continue nonetheless." - "Congratulations, you're the first ever user of FEATURE dependencies! Please contact the asdf-devel mailing-list.") - (when (find (second dep-spec) *features* :test 'string-equal) - (resolve-dependency-name component (third dep-spec)))) - (t - (error (compatfmt "~@ ), (:feature ), or .~@:>") dep-spec)))) - -(defun* do-one-dep (op c collect dep-op dep-c) - ;; Collects a partial plan for performing dep-op on dep-c - ;; as dependencies of a larger plan involving op and c. - ;; Returns t if this should force recompilation of those who depend on us. - ;; dep-op is an operation class name (not an operation object), - ;; whereas dep-c is a component object.n - (do-traverse (make-sub-operation c op dep-c dep-op) dep-c collect)) - -(defun* do-dep (op c collect dep-op-spec dep-c-specs) - ;; Collects a partial plan for performing dep-op-spec on each of dep-c-specs - ;; as dependencies of a larger plan involving op and c. - ;; Returns t if this should force recompilation of those who depend on us. - ;; dep-op-spec is either an operation class name (not an operation object), - ;; or the magic symbol asdf:feature. - ;; If dep-op-spec is asdf:feature, then the first dep-c-specs is a keyword, - ;; and the plan will succeed if that keyword is present in *feature*, - ;; or fail if it isn't - ;; (at which point c's :if-component-dep-fails will kick in). - ;; If dep-op-spec is an operation class name, - ;; then dep-c-specs specifies a list of sibling component of c, - ;; as per resolve-dependency-spec, such that operating op on c - ;; depends on operating dep-op-spec on each of them. - (cond ((eq dep-op-spec 'feature) - (if (member (car dep-c-specs) *features*) - nil - (error 'missing-dependency - :required-by c - :requires (list :feature (car dep-c-specs))))) - (t - (let ((flag nil)) - (dolist (d dep-c-specs) - (when (do-one-dep op c collect dep-op-spec - (resolve-dependency-spec c d)) - (setf flag t))) - flag)))) - -(defvar *visit-count* 0) ; counter that allows to sort nodes from operation-visited-nodes - -(defun* do-collect (collect x) - (funcall collect x)) - -(defmethod do-traverse ((operation operation) (c component) collect) - (let ((*forcing* *forcing*) - (flag nil)) ;; return value: must we rebuild this and its dependencies? - (labels - ((update-flag (x) - (orf flag x)) - (dep (op comp) - (update-flag (do-dep operation c collect op comp)))) - ;; Have we been visited yet? If so, just process the result. - (aif (component-visited-p operation c) - (progn - (update-flag (cdr it)) - (return-from do-traverse flag))) - ;; dependencies - (when (component-visiting-p operation c) - (error 'circular-dependency :components (list c))) - (setf (visiting-component operation c) t) - (unwind-protect - (block nil - (when (typep c 'system) ;; systems can be forced or forced-not - (let ((ancestor (operation-ancestor operation))) - (flet ((match? (f) - (and f (or (not (consp f)) ;; T or :ALL - (member (component-name c) f :test #'equal))))) - (cond - ((match? (operation-forced ancestor)) - (setf *forcing* t)) - ((match? (operation-forced-not ancestor)) - (return)))))) - ;; first we check and do all the dependencies for the module. - ;; Operations planned in this loop will show up - ;; in the results, and are consumed below. - (let ((*forcing* nil)) - ;; upstream dependencies are never forced to happen just because - ;; the things that depend on them are.... - (loop - :for (required-op . deps) :in (component-depends-on operation c) - :do (dep required-op deps))) - ;; constituent bits - (let ((module-ops - (when (typep c 'module) - (let ((at-least-one nil) - ;; This is set based on the results of the - ;; dependencies and whether we are in the - ;; context of a *forcing* call... - ;; inter-system dependencies do NOT trigger - ;; building components - (*forcing* - (or *forcing* - (and flag (not (typep c 'system))))) - (error nil)) - (while-collecting (internal-collect) - (dolist (kid (module-components c)) - (handler-case - (update-flag - (do-traverse operation kid #'internal-collect)) - #-genera - (missing-dependency (condition) - (when (eq (module-if-component-dep-fails c) - :fail) - (error condition)) - (setf error condition)) - (:no-error (c) - (declare (ignore c)) - (setf at-least-one t)))) - (when (and (eq (module-if-component-dep-fails c) - :try-next) - (not at-least-one)) - (error error))))))) - (update-flag (or *forcing* (not (operation-done-p operation c)))) - ;; For sub-operations, check whether - ;; the original ancestor operation was forced, - ;; or names us amongst an explicit list of things to force... - ;; except that this check doesn't distinguish - ;; between all the things with a given name. Sigh. - ;; BROKEN! - (when flag - (let ((do-first (cdr (assoc (class-name (class-of operation)) - (component-do-first c))))) - (loop :for (required-op . deps) :in do-first - :do (do-dep operation c collect required-op deps))) - (do-collect collect (vector module-ops)) - (do-collect collect (cons operation c))))) - (setf (visiting-component operation c) nil))) - (visit-component operation c (when flag (incf *visit-count*))) - flag)) - -(defun* flatten-tree (l) - ;; You collected things into a list. - ;; Most elements are just things to collect again. - ;; A (simple-vector 1) indicate that you should recurse into its contents. - ;; This way, in two passes (rather than N being the depth of the tree), - ;; you can collect things with marginally constant-time append, - ;; achieving linear time collection instead of quadratic time. - (while-collecting (c) - (labels ((r (x) - (if (typep x '(simple-vector 1)) - (r* (svref x 0)) - (c x))) - (r* (l) - (dolist (x l) (r x)))) - (r* l)))) - -(defmethod traverse ((operation operation) (c component)) - (flatten-tree - (while-collecting (collect) - (let ((*visit-count* 0)) - (do-traverse operation c #'collect))))) - -(defmethod perform ((operation operation) (c source-file)) - (sysdef-error - (compatfmt "~@") - (class-of operation) (class-of c))) - -(defmethod perform ((operation operation) (c module)) - (declare (ignorable operation c)) - nil) - -(defmethod mark-operation-done ((operation operation) (c component)) - (setf (gethash (type-of operation) (component-operation-times c)) - (reduce #'max - (cons (get-universal-time) - (mapcar #'safe-file-write-date (input-files operation c)))))) - -(defmethod perform-with-restarts (operation component) - ;; TOO verbose, especially as the default. Add your own :before method - ;; to perform-with-restart or perform if you want that: - #|(when *asdf-verbose* (explain operation component))|# - (perform operation component)) - -(defmethod perform-with-restarts :around (operation component) - (loop - (restart-case - (return (call-next-method)) - (retry () - :report - (lambda (s) - (format s (compatfmt "~@") - (operation-description operation component)))) - (accept () - :report - (lambda (s) - (format s (compatfmt "~@") - (operation-description operation component))) - (mark-operation-done operation component) - (return))))) - -(defmethod explain ((operation operation) (component component)) - (asdf-message (compatfmt "~&~@<; ~@;~A~:>~%") - (operation-description operation component))) - -(defmethod operation-description (operation component) - (format nil (compatfmt "~@<~A on ~A~@:>") - (class-of operation) component)) - -;;;; ------------------------------------------------------------------------- -;;;; compile-op - -(defclass compile-op (operation) - ((proclamations :initarg :proclamations :accessor compile-op-proclamations :initform nil) - (on-warnings :initarg :on-warnings :accessor operation-on-warnings - :initform *compile-file-warnings-behaviour*) - (on-failure :initarg :on-failure :accessor operation-on-failure - :initform *compile-file-failure-behaviour*) - (flags :initarg :flags :accessor compile-op-flags - :initform nil))) - -(defun* output-file (operation component) - "The unique output file of performing OPERATION on COMPONENT" - (let ((files (output-files operation component))) - (assert (length=n-p files 1)) - (first files))) - -(defun* ensure-all-directories-exist (pathnames) - (dolist (pathname pathnames) - (ensure-directories-exist (translate-logical-pathname pathname)))) - -(defmethod perform :before ((operation compile-op) (c source-file)) - (ensure-all-directories-exist (output-files operation c))) - -(defmethod perform :after ((operation operation) (c component)) - (mark-operation-done operation c)) - -(defgeneric* around-compile-hook (component)) -(defgeneric* call-with-around-compile-hook (component thunk)) - -(defmethod around-compile-hook ((c component)) - (cond - ((slot-boundp c 'around-compile) - (slot-value c 'around-compile)) - ((component-parent c) - (around-compile-hook (component-parent c))))) - -(defun ensure-function (fun &key (package :asdf)) - (etypecase fun - ((or symbol function) fun) - (cons (eval `(function ,fun))) - (string (eval `(function ,(with-standard-io-syntax - (let ((*package* (find-package package))) - (read-from-string fun)))))))) - -(defmethod call-with-around-compile-hook ((c component) thunk) - (let ((hook (around-compile-hook c))) - (if hook - (funcall (ensure-function hook) thunk) - (funcall thunk)))) - -;;; perform is required to check output-files to find out where to put -;;; its answers, in case it has been overridden for site policy -(defmethod perform ((operation compile-op) (c cl-source-file)) - (let ((source-file (component-pathname c)) - ;; on some implementations, there are more than one output-file, - ;; but the first one should always be the primary fasl that gets loaded. - (output-file (first (output-files operation c))) - (*compile-file-warnings-behaviour* (operation-on-warnings operation)) - (*compile-file-failure-behaviour* (operation-on-failure operation))) - (multiple-value-bind (output warnings-p failure-p) - (call-with-around-compile-hook - c #'(lambda (&rest flags) - (apply *compile-op-compile-file-function* source-file - :output-file output-file - :external-format (component-external-format c) - (append flags (compile-op-flags operation))))) - (unless output - (error 'compile-error :component c :operation operation)) - (when failure-p - (case (operation-on-failure operation) - (:warn (warn - (compatfmt "~@") - operation c)) - (:error (error 'compile-failed :component c :operation operation)) - (:ignore nil))) - (when warnings-p - (case (operation-on-warnings operation) - (:warn (warn - (compatfmt "~@") - operation c)) - (:error (error 'compile-warned :component c :operation operation)) - (:ignore nil)))))) - -(defmethod output-files ((operation compile-op) (c cl-source-file)) - (declare (ignorable operation)) - (let* ((p (lispize-pathname (component-pathname c))) - (f (compile-file-pathname ;; fasl - p #+mkcl :fasl-p #+mkcl t #+ecl :type #+ecl :fasl)) - #+mkcl (o (compile-file-pathname p :fasl-p nil))) ;; object file - #+ecl (if (use-ecl-byte-compiler-p) - (list f) - (list (compile-file-pathname p :type :object) f)) - #+mkcl (list o f) - #-(or ecl mkcl) (list f))) - -(defmethod perform ((operation compile-op) (c static-file)) - (declare (ignorable operation c)) - nil) - -(defmethod output-files ((operation compile-op) (c static-file)) - (declare (ignorable operation c)) - nil) - -(defmethod input-files ((operation compile-op) (c static-file)) - (declare (ignorable operation c)) - nil) - -(defmethod operation-description ((operation compile-op) component) - (declare (ignorable operation)) - (format nil (compatfmt "~@") component)) - -(defmethod operation-description ((operation compile-op) (component module)) - (declare (ignorable operation)) - (format nil (compatfmt "~@") component)) - - -;;;; ------------------------------------------------------------------------- -;;;; load-op - -(defclass basic-load-op (operation) ()) - -(defclass load-op (basic-load-op) ()) - -(defmethod perform-with-restarts ((o load-op) (c cl-source-file)) - (loop - (restart-case - (return (call-next-method)) - (try-recompiling () - :report (lambda (s) - (format s "Recompile ~a and try loading it again" - (component-name c))) - (perform (make-sub-operation c o c 'compile-op) c))))) - -(defmethod perform ((o load-op) (c cl-source-file)) - (map () #'load - #-(or ecl mkcl) - (input-files o c) - #+(or ecl mkcl) - (loop :for i :in (input-files o c) - :unless (string= (pathname-type i) "fas") - :collect (compile-file-pathname (lispize-pathname i))))) - -(defmethod perform ((operation load-op) (c static-file)) - (declare (ignorable operation c)) - nil) - -(defmethod operation-done-p ((operation load-op) (c static-file)) - (declare (ignorable operation c)) - t) - -(defmethod output-files ((operation operation) (c component)) - (declare (ignorable operation c)) - nil) - -(defmethod component-depends-on ((operation load-op) (c component)) - (declare (ignorable operation)) - (cons (list 'compile-op (component-name c)) - (call-next-method))) - -(defmethod operation-description ((operation load-op) component) - (declare (ignorable operation)) - (format nil (compatfmt "~@") - component)) - -(defmethod operation-description ((operation load-op) (component cl-source-file)) - (declare (ignorable operation)) - (format nil (compatfmt "~@") - component)) - -(defmethod operation-description ((operation load-op) (component module)) - (declare (ignorable operation)) - (format nil (compatfmt "~@") - component)) - -;;;; ------------------------------------------------------------------------- -;;;; load-source-op - -(defclass load-source-op (basic-load-op) ()) - -(defmethod perform ((o load-source-op) (c cl-source-file)) - (declare (ignorable o)) - (let ((source (component-pathname c))) - (setf (component-property c 'last-loaded-as-source) - (and (call-with-around-compile-hook - c #'(lambda () (load source :external-format (component-external-format c)))) - (get-universal-time))))) - -(defmethod perform ((operation load-source-op) (c static-file)) - (declare (ignorable operation c)) - nil) - -(defmethod output-files ((operation load-source-op) (c component)) - (declare (ignorable operation c)) - nil) - -;;; FIXME: We simply copy load-op's dependencies. This is Just Not Right. -(defmethod component-depends-on ((o load-source-op) (c component)) - (declare (ignorable o)) - (loop :with what-would-load-op-do = (component-depends-on 'load-op c) - :for (op . co) :in what-would-load-op-do - :when (eq op 'load-op) :collect (cons 'load-source-op co))) - -(defmethod operation-done-p ((o load-source-op) (c source-file)) - (declare (ignorable o)) - (if (or (not (component-property c 'last-loaded-as-source)) - (> (safe-file-write-date (component-pathname c)) - (component-property c 'last-loaded-as-source))) - nil t)) - -(defmethod operation-description ((operation load-source-op) component) - (declare (ignorable operation)) - (format nil (compatfmt "~@") - component)) - -(defmethod operation-description ((operation load-source-op) (component module)) - (declare (ignorable operation)) - (format nil (compatfmt "~@") component)) - - -;;;; ------------------------------------------------------------------------- -;;;; test-op - -(defclass test-op (operation) ()) - -(defmethod perform ((operation test-op) (c component)) - (declare (ignorable operation c)) - nil) - -(defmethod operation-done-p ((operation test-op) (c system)) - "Testing a system is _never_ done." - (declare (ignorable operation c)) - nil) - -(defmethod component-depends-on :around ((o test-op) (c system)) - (declare (ignorable o)) - (cons `(load-op ,(component-name c)) (call-next-method))) - - -;;;; ------------------------------------------------------------------------- -;;;; Invoking Operations - -(defgeneric* operate (operation-class system &key &allow-other-keys)) -(defgeneric* perform-plan (plan &key)) - -;;;; Separating this into a different function makes it more forward-compatible -(defun* cleanup-upgraded-asdf (old-version) - (let ((new-version (asdf-version))) - (unless (equal old-version new-version) - (cond - ((version-satisfies new-version old-version) - (asdf-message (compatfmt "~&~@<; ~@;Upgraded ASDF from version ~A to version ~A~@:>~%") - old-version new-version)) - ((version-satisfies old-version new-version) - (warn (compatfmt "~&~@<; ~@;Downgraded ASDF from version ~A to version ~A~@:>~%") - old-version new-version)) - (t - (asdf-message (compatfmt "~&~@<; ~@;Changed ASDF from version ~A to incompatible version ~A~@:>~%") - old-version new-version))) - (let ((asdf (funcall (find-symbol* 'find-system :asdf) :asdf))) - ;; Invalidate all systems but ASDF itself. - (setf *defined-systems* (make-defined-systems-table)) - (register-system asdf) - ;; If we're in the middle of something, restart it. - (when *systems-being-defined* - (let ((l (loop :for name :being :the :hash-keys :of *systems-being-defined* :collect name))) - (clrhash *systems-being-defined*) - (dolist (s l) (find-system s nil)))) - t)))) - -;;;; Try to upgrade of ASDF. If a different version was used, return T. -;;;; We need do that before we operate on anything that depends on ASDF. -(defun* upgrade-asdf () - (let ((version (asdf-version))) - (handler-bind (((or style-warning warning) #'muffle-warning)) - (operate 'load-op :asdf :verbose nil)) - (cleanup-upgraded-asdf version))) - -(defmethod perform-plan ((steps list) &key) - (let ((*package* *package*) - (*readtable* *readtable*)) - (with-compilation-unit () - (loop :for (op . component) :in steps :do - (perform-with-restarts op component))))) - -(defmethod operate (operation-class system &rest args - &key ((:verbose *asdf-verbose*) *asdf-verbose*) version force - &allow-other-keys) - (declare (ignore force)) - (with-system-definitions () - (let* ((op (apply 'make-instance operation-class - :original-initargs args - args)) - (*verbose-out* (if *asdf-verbose* *standard-output* (make-broadcast-stream))) - (system (etypecase system - (system system) - ((or string symbol) (find-system system))))) - (unless (version-satisfies system version) - (error 'missing-component-of-version :requires system :version version)) - (let ((steps (traverse op system))) - (when (and (not (equal '("asdf") (component-find-path system))) - (find '("asdf") (mapcar 'cdr steps) - :test 'equal :key 'component-find-path) - (upgrade-asdf)) - ;; If we needed to upgrade ASDF to achieve our goal, - ;; then do it specially as the first thing, then - ;; invalidate all existing system - ;; retry the whole thing with the new OPERATE function, - ;; which on some implementations - ;; has a new symbol shadowing the current one. - (return-from operate - (apply (find-symbol* 'operate :asdf) operation-class system args))) - (perform-plan steps) - (values op steps))))) - -(defun* oos (operation-class system &rest args &key force verbose version - &allow-other-keys) - (declare (ignore force verbose version)) - (apply 'operate operation-class system args)) - -(let ((operate-docstring - "Operate does three things: - -1. It creates an instance of OPERATION-CLASS using any keyword parameters -as initargs. -2. It finds the asdf-system specified by SYSTEM (possibly loading -it from disk). -3. It then calls TRAVERSE with the operation and system as arguments - -The traverse operation is wrapped in WITH-COMPILATION-UNIT and error -handling code. If a VERSION argument is supplied, then operate also -ensures that the system found satisfies it using the VERSION-SATISFIES -method. - -Note that dependencies may cause the operation to invoke other -operations on the system or its components: the new operations will be -created with the same initargs as the original one. -")) - (setf (documentation 'oos 'function) - (format nil - "Short for _operate on system_ and an alias for the OPERATE function.~%~%~a" - operate-docstring)) - (setf (documentation 'operate 'function) - operate-docstring)) - -(defun* load-system (system &rest keys &key force verbose version &allow-other-keys) - "Shorthand for `(operate 'asdf:load-op system)`. -See OPERATE for details." - (declare (ignore force verbose version)) - (apply 'operate *load-system-operation* system keys) - t) - -(defun* load-systems (&rest systems) - (map () 'load-system systems)) - -(defun component-loaded-p (c) - (and (gethash 'load-op (component-operation-times (find-component c nil))) t)) - -(defun loaded-systems () - (remove-if-not 'component-loaded-p (registered-systems))) - -(defun require-system (s &rest keys &key &allow-other-keys) - (apply 'load-system s :force-not (loaded-systems) keys)) - -(defun* compile-system (system &rest args &key force verbose version - &allow-other-keys) - "Shorthand for `(asdf:operate 'asdf:compile-op system)`. See OPERATE -for details." - (declare (ignore force verbose version)) - (apply 'operate 'compile-op system args) - t) - -(defun* test-system (system &rest args &key force verbose version - &allow-other-keys) - "Shorthand for `(asdf:operate 'asdf:test-op system)`. See OPERATE for -details." - (declare (ignore force verbose version)) - (apply 'operate 'test-op system args) - t) - -;;;; ------------------------------------------------------------------------- -;;;; Defsystem - -(defun* load-pathname () - (resolve-symlinks* (or *load-pathname* *compile-file-pathname*))) - -(defun* determine-system-pathname (pathname) - ;; The defsystem macro calls us to determine - ;; the pathname of a system as follows: - ;; 1. the one supplied, - ;; 2. derived from *load-pathname* via load-pathname - ;; 3. taken from the *default-pathname-defaults* via default-directory - (let* ((file-pathname (load-pathname)) - (directory-pathname (and file-pathname (pathname-directory-pathname file-pathname)))) - (or (and pathname (subpathname directory-pathname pathname :type :directory)) - directory-pathname - (default-directory)))) - -(defun* find-class* (x &optional (errorp t) environment) - (etypecase x - ((or standard-class built-in-class) x) - (symbol (find-class x errorp environment)))) - -(defun* class-for-type (parent type) - (or (loop :for symbol :in (list - type - (find-symbol* type *package*) - (find-symbol* type :asdf)) - :for class = (and symbol (find-class symbol nil)) - :when (and class - (#-cormanlisp subtypep #+cormanlisp cl::subclassp - class (find-class 'component))) - :return class) - (and (eq type :file) - (find-class* - (or (loop :for module = parent :then (component-parent module) :while module - :thereis (module-default-component-class module)) - *default-component-class*) nil)) - (sysdef-error "don't recognize component type ~A" type))) - -(defun* maybe-add-tree (tree op1 op2 c) - "Add the node C at /OP1/OP2 in TREE, unless it's there already. -Returns the new tree (which probably shares structure with the old one)" - (let ((first-op-tree (assoc op1 tree))) - (if first-op-tree - (progn - (aif (assoc op2 (cdr first-op-tree)) - (if (find c (cdr it) :test #'equal) - nil - (setf (cdr it) (cons c (cdr it)))) - (setf (cdr first-op-tree) - (acons op2 (list c) (cdr first-op-tree)))) - tree) - (acons op1 (list (list op2 c)) tree)))) - -(defun* union-of-dependencies (&rest deps) - (let ((new-tree nil)) - (dolist (dep deps) - (dolist (op-tree dep) - (dolist (op (cdr op-tree)) - (dolist (c (cdr op)) - (setf new-tree - (maybe-add-tree new-tree (car op-tree) (car op) c)))))) - new-tree)) - - -(defvar *serial-depends-on* nil) - -(defun* sysdef-error-component (msg type name value) - (sysdef-error (strcat msg (compatfmt "~&~@")) - type name value)) - -(defun* check-component-input (type name weakly-depends-on - depends-on components in-order-to) - "A partial test of the values of a component." - (unless (listp depends-on) - (sysdef-error-component ":depends-on must be a list." - type name depends-on)) - (unless (listp weakly-depends-on) - (sysdef-error-component ":weakly-depends-on must be a list." - type name weakly-depends-on)) - (unless (listp components) - (sysdef-error-component ":components must be NIL or a list of components." - type name components)) - (unless (and (listp in-order-to) (listp (car in-order-to))) - (sysdef-error-component ":in-order-to must be NIL or a list of components." - type name in-order-to))) - -(defun* %remove-component-inline-methods (component) - (dolist (name +asdf-methods+) - (map () - ;; this is inefficient as most of the stored - ;; methods will not be for this particular gf - ;; But this is hardly performance-critical - #'(lambda (m) - (remove-method (symbol-function name) m)) - (component-inline-methods component))) - ;; clear methods, then add the new ones - (setf (component-inline-methods component) nil)) - -(defun* %define-component-inline-methods (ret rest) - (dolist (name +asdf-methods+) - (let ((keyword (intern (symbol-name name) :keyword))) - (loop :for data = rest :then (cddr data) - :for key = (first data) - :for value = (second data) - :while data - :when (eq key keyword) :do - (destructuring-bind (op qual (o c) &body body) value - (pushnew - (eval `(defmethod ,name ,qual ((,o ,op) (,c (eql ,ret))) - ,@body)) - (component-inline-methods ret))))))) - -(defun* %refresh-component-inline-methods (component rest) - (%remove-component-inline-methods component) - (%define-component-inline-methods component rest)) - -(defun* parse-component-form (parent options) - (destructuring-bind - (type name &rest rest &key - ;; the following list of keywords is reproduced below in the - ;; remove-keys form. important to keep them in sync - components pathname - perform explain output-files operation-done-p - weakly-depends-on depends-on serial in-order-to - do-first - (version nil versionp) - ;; list ends - &allow-other-keys) options - (declare (ignorable perform explain output-files operation-done-p)) - (check-component-input type name weakly-depends-on depends-on components in-order-to) - - (when (and parent - (find-component parent name) - ;; ignore the same object when rereading the defsystem - (not - (typep (find-component parent name) - (class-for-type parent type)))) - (error 'duplicate-names :name name)) - - (when versionp - (unless (parse-version version nil) - (warn (compatfmt "~@") - version name parent))) - - (let* ((args (list* :name (coerce-name name) - :pathname pathname - :parent parent - (remove-keys - '(components pathname - perform explain output-files operation-done-p - weakly-depends-on depends-on serial in-order-to) - rest))) - (ret (find-component parent name))) - (when weakly-depends-on - (appendf depends-on (remove-if (complement #'(lambda (x) (find-system x nil))) weakly-depends-on))) - (when *serial-depends-on* - (push *serial-depends-on* depends-on)) - (if ret ; preserve identity - (apply 'reinitialize-instance ret args) - (setf ret (apply 'make-instance (class-for-type parent type) args))) - (component-pathname ret) ; eagerly compute the absolute pathname - (when (typep ret 'module) - (let ((*serial-depends-on* nil)) - (setf (module-components ret) - (loop - :for c-form :in components - :for c = (parse-component-form ret c-form) - :for name = (component-name c) - :collect c - :when serial :do (setf *serial-depends-on* name)))) - (compute-module-components-by-name ret)) - - (setf (component-load-dependencies ret) depends-on) ;; Used by POIU - - (setf (component-in-order-to ret) - (union-of-dependencies - in-order-to - `((compile-op (compile-op ,@depends-on)) - (load-op (load-op ,@depends-on))))) - (setf (component-do-first ret) - (union-of-dependencies - do-first - `((compile-op (load-op ,@depends-on))))) - - (%refresh-component-inline-methods ret rest) - ret))) - -(defun* reset-system (system &rest keys &key &allow-other-keys) - (change-class (change-class system 'proto-system) 'system) - (apply 'reinitialize-instance system keys)) - -(defun* do-defsystem (name &rest options - &key pathname (class 'system) - defsystem-depends-on &allow-other-keys) - ;; The system must be registered before we parse the body, - ;; otherwise we recur when trying to find an existing system - ;; of the same name to reuse options (e.g. pathname) from. - ;; To avoid infinite recursion in cases where you defsystem a system - ;; that is registered to a different location to find-system, - ;; we also need to remember it in a special variable *systems-being-defined*. - (with-system-definitions () - (let* ((name (coerce-name name)) - (registered (system-registered-p name)) - (registered! (if registered - (rplaca registered (get-universal-time)) - (register-system (make-instance 'system :name name)))) - (system (reset-system (cdr registered!) - :name name :source-file (load-pathname))) - (component-options (remove-keys '(:class) options))) - (setf (gethash name *systems-being-defined*) system) - (apply 'load-systems defsystem-depends-on) - ;; We change-class (when necessary) AFTER we load the defsystem-dep's - ;; since the class might not be defined as part of those. - (let ((class (class-for-type nil class))) - (unless (eq (type-of system) class) - (change-class system class))) - (parse-component-form - nil (list* - :module name - :pathname (determine-system-pathname pathname) - component-options))))) - -(defmacro defsystem (name &body options) - `(apply 'do-defsystem ',name ',options)) - -;;;; --------------------------------------------------------------------------- -;;;; run-shell-command -;;;; -;;;; run-shell-command functions for other lisp implementations will be -;;;; gratefully accepted, if they do the same thing. -;;;; If the docstring is ambiguous, send a bug report. -;;;; -;;;; WARNING! The function below is mostly dysfunctional. -;;;; For instance, it will probably run fine on most implementations on Unix, -;;;; which will hopefully use the shell /bin/sh (which we force in some cases) -;;;; which is hopefully reasonably compatible with a POSIX *or* Bourne shell. -;;;; But behavior on Windows may vary wildly between implementations, -;;;; either relying on your having installed a POSIX sh, or going through -;;;; the CMD.EXE interpreter, for a totally different meaning, depending on -;;;; what is easily expressible in said implementation. -;;;; -;;;; We probably should move this functionality to its own system and deprecate -;;;; use of it from the asdf package. However, this would break unspecified -;;;; existing software, so until a clear alternative exists, we can't deprecate -;;;; it, and even after it's been deprecated, we will support it for a few -;;;; years so everyone has time to migrate away from it. -- fare 2009-12-01 -;;;; -;;;; As a suggested replacement which is portable to all ASDF-supported -;;;; implementations and operating systems except Genera, I recommend -;;;; xcvb-driver's xcvb-driver:run-program/ and its derivatives. - -(defun* run-shell-command (control-string &rest args) - "Interpolate ARGS into CONTROL-STRING as if by FORMAT, and -synchronously execute the result using a Bourne-compatible shell, with -output to *VERBOSE-OUT*. Returns the shell's exit code." - (let ((command (apply 'format nil control-string args))) - (asdf-message "; $ ~A~%" command) - - #+abcl - (ext:run-shell-command command :output *verbose-out*) - - #+allegro - ;; will this fail if command has embedded quotes - it seems to work - (multiple-value-bind (stdout stderr exit-code) - (excl.osi:command-output - #-mswindows (vector "/bin/sh" "/bin/sh" "-c" command) - #+mswindows command ; BEWARE! - :input nil :whole nil - #+mswindows :show-window #+mswindows :hide) - (asdf-message "~{~&~a~%~}~%" stderr) - (asdf-message "~{~&~a~%~}~%" stdout) - exit-code) - - #+clisp - ;; CLISP returns NIL for exit status zero. - (if *verbose-out* - (let* ((new-command (format nil "( ~A ) ; r=$? ; echo ; echo ASDF-EXIT-STATUS $r" - command)) - (outstream (ext:run-shell-command new-command :output :stream :wait t))) - (multiple-value-bind (retval out-lines) - (unwind-protect - (parse-clisp-shell-output outstream) - (ignore-errors (close outstream))) - (asdf-message "~{~&~a~%~}~%" out-lines) - retval)) - ;; there will be no output, just grab up the exit status - (or (ext:run-shell-command command :output nil :wait t) 0)) - - #+clozure - (nth-value 1 - (ccl:external-process-status - (ccl:run-program - (cond - ((os-unix-p) "/bin/sh") - ((os-windows-p) (strcat "CMD /C " command)) ; BEWARE! - (t (error "Unsupported OS"))) - (if (os-unix-p) (list "-c" command) '()) - :input nil :output *verbose-out* :wait t))) - - #+(or cmu scl) - (ext:process-exit-code - (ext:run-program - "/bin/sh" - (list "-c" command) - :input nil :output *verbose-out*)) - - #+cormanlisp - (win32:system command) - - #+ecl ;; courtesy of Juan Jose Garcia Ripoll - (ext:system command) - - #+gcl - (lisp:system command) - - #+lispworks - (apply 'system:call-system-showing-output command - :show-cmd nil :prefix "" :output-stream *verbose-out* - (when (os-unix-p) '(:shell-type "/bin/sh"))) - - #+mcl - (ccl::with-cstrs ((%command command)) (_system %command)) - - #+mkcl - ;; This has next to no chance of working on basic Windows! - ;; Your best hope is that Cygwin or MSYS is somewhere in the PATH. - (multiple-value-bind (io process exit-code) - (apply #'mkcl:run-program #+windows "sh" #-windows "/bin/sh" - (list "-c" command) - :input nil :output t #|*verbose-out*|# ;; will be *verbose-out* when we support it - #-windows '(:search nil)) - (declare (ignore io process)) - exit-code) - - #+sbcl - (sb-ext:process-exit-code - (apply 'sb-ext:run-program - #+win32 "sh" #-win32 "/bin/sh" - (list "-c" command) - :input nil :output *verbose-out* - #+win32 '(:search t) #-win32 nil)) - - #+xcl - (ext:run-shell-command command) - - #-(or abcl allegro clisp clozure cmu ecl gcl lispworks mcl mkcl sbcl scl xcl) - (error "RUN-SHELL-COMMAND not implemented for this Lisp"))) - -#+clisp -(defun* parse-clisp-shell-output (stream) - "Helper function for running shell commands under clisp. Parses a specially- -crafted output string to recover the exit status of the shell command and a -list of lines of output." - (loop :with status-prefix = "ASDF-EXIT-STATUS " - :with prefix-length = (length status-prefix) - :with exit-status = -1 :with lines = () - :for line = (read-line stream nil nil) - :while line :do (push line lines) :finally - (let* ((last (car lines)) - (status (and last (>= (length last) prefix-length) - (string-equal last status-prefix :end1 prefix-length) - (parse-integer last :start prefix-length :junk-allowed t)))) - (when status - (setf exit-status status) - (pop lines) (when (equal "" (car lines)) (pop lines))) - (return (values exit-status (reverse lines)))))) - -;;;; --------------------------------------------------------------------------- -;;;; system-relative-pathname - -(defun* system-definition-pathname (x) - ;; As of 2.014.8, we mean to make this function obsolete, - ;; but that won't happen until all clients have been updated. - ;;(cerror "Use ASDF:SYSTEM-SOURCE-FILE instead" - "Function ASDF:SYSTEM-DEFINITION-PATHNAME is obsolete. -It used to expose ASDF internals with subtle differences with respect to -user expectations, that have been refactored away since. -We recommend you use ASDF:SYSTEM-SOURCE-FILE instead -for a mostly compatible replacement that we're supporting, -or even ASDF:SYSTEM-SOURCE-DIRECTORY or ASDF:SYSTEM-RELATIVE-PATHNAME -if that's whay you mean." ;;) - (system-source-file x)) - -(defmethod system-source-file ((system system)) - ;; might be missing when upgrading from ASDF 1 and u-i-f-r-c failed - (unless (slot-boundp system 'source-file) - (%set-system-source-file - (probe-asd (component-name system) (component-pathname system)) system)) - (%system-source-file system)) -(defmethod system-source-file ((system-name string)) - (%system-source-file (find-system system-name))) -(defmethod system-source-file ((system-name symbol)) - (%system-source-file (find-system system-name))) - -(defun* system-source-directory (system-designator) - "Return a pathname object corresponding to the -directory in which the system specification (.asd file) is -located." - (pathname-directory-pathname (system-source-file system-designator))) - -(defun* relativize-directory (directory) - (cond - ((stringp directory) - (list :relative directory)) - ((eq (car directory) :absolute) - (cons :relative (cdr directory))) - (t - directory))) - -(defun* relativize-pathname-directory (pathspec) - (let ((p (pathname pathspec))) - (make-pathname - :directory (relativize-directory (pathname-directory p)) - :defaults p))) - -(defun* system-relative-pathname (system name &key type) - (subpathname (system-source-directory system) name :type type)) - - -;;; --------------------------------------------------------------------------- -;;; implementation-identifier -;;; -;;; produce a string to identify current implementation. -;;; Initially stolen from SLIME's SWANK, rewritten since. -;;; We're back to runtime checking, for the sake of e.g. ABCL. - -(defun* first-feature (features) - (dolist (x features) - (multiple-value-bind (val feature) - (if (consp x) (values (first x) (cons :or (rest x))) (values x x)) - (when (featurep feature) (return val))))) - -(defun implementation-type () - (first-feature - '(:abcl (:acl :allegro) (:ccl :clozure) :clisp (:corman :cormanlisp) :cmu - :ecl :gcl (:lw :lispworks) :mcl :mkcl :sbcl :scl :symbolics :xcl))) - -(defun operating-system () - (first-feature - '(:cygwin (:win :windows :mswindows :win32 :mingw32) ;; try cygwin first! - (:linux :linux :linux-target) ;; for GCL at least, must appear before :bsd - (:macosx :macosx :darwin :darwin-target :apple) ; also before :bsd - (:solaris :solaris :sunos) (:bsd :bsd :freebsd :netbsd :openbsd) :unix - :genera))) - -(defun architecture () - (first-feature - '((:x64 :amd64 :x86-64 :x86_64 :x8664-target (:and :word-size=64 :pc386)) - (:x86 :x86 :i386 :i486 :i586 :i686 :pentium3 :pentium4 :pc386 :iapx386 :x8632-target) - (:ppc64 :ppc64 :ppc64-target) (:ppc32 :ppc32 :ppc32-target :ppc :powerpc) - :hppa64 :hppa :sparc64 (:sparc32 :sparc32 :sparc) - :mipsel :mipseb :mips :alpha (:arm :arm :arm-target) :imach - ;; Java comes last: if someone uses C via CFFI or otherwise JNA or JNI, - ;; we may have to segregate the code still by architecture. - (:java :java :java-1.4 :java-1.5 :java-1.6 :java-1.7)))) - -#+clozure -(defun* ccl-fasl-version () - ;; the fasl version is target-dependent from CCL 1.8 on. - (or (let ((s 'ccl::target-fasl-version)) - (and (fboundp s) (funcall s))) - (and (boundp 'ccl::fasl-version) - (symbol-value 'ccl::fasl-version)) - (error "Can't determine fasl version."))) - -(defun lisp-version-string () - (let ((s (lisp-implementation-version))) - (car ; as opposed to OR, this idiom prevents some unreachable code warning - (list - #+allegro - (format nil "~A~@[~A~]~@[~A~]~@[~A~]" - excl::*common-lisp-version-number* - ;; M means "modern", as opposed to ANSI-compatible mode (which I consider default) - (and (eq excl:*current-case-mode* :case-sensitive-lower) "M") - ;; Note if not using International ACL - ;; see http://www.franz.com/support/documentation/8.1/doc/operators/excl/ics-target-case.htm - (excl:ics-target-case (:-ics "8")) - (and (member :smp *features*) "S")) - #+armedbear (format nil "~a-fasl~a" s system::*fasl-version*) - #+clisp - (subseq s 0 (position #\space s)) ; strip build information (date, etc.) - #+clozure - (format nil "~d.~d-f~d" ; shorten for windows - ccl::*openmcl-major-version* - ccl::*openmcl-minor-version* - (logand (ccl-fasl-version) #xFF)) - #+cmu (substitute #\- #\/ s) - #+scl (format nil "~A~A" s - ;; ANSI upper case vs lower case. - (ecase ext:*case-mode* (:upper "") (:lower "l"))) - #+ecl (format nil "~A~@[-~A~]" s - (let ((vcs-id (ext:lisp-implementation-vcs-id))) - (subseq vcs-id 0 (min (length vcs-id) 8)))) - #+gcl (subseq s (1+ (position #\space s))) - #+genera - (multiple-value-bind (major minor) (sct:get-system-version "System") - (format nil "~D.~D" major minor)) - #+mcl (subseq s 8) ; strip the leading "Version " - s)))) - -(defun* implementation-identifier () - (substitute-if - #\_ #'(lambda (x) (find x " /:;&^\\|?<>(){}[]$#`'\"")) - (format nil "~(~a~@{~@[-~a~]~}~)" - (or (implementation-type) (lisp-implementation-type)) - (or (lisp-version-string) (lisp-implementation-version)) - (or (operating-system) (software-type)) - (or (architecture) (machine-type))))) - -(defun* hostname () - ;; Note: untested on RMCL - #+(or abcl clozure cmucl ecl genera lispworks mcl mkcl sbcl scl xcl) (machine-instance) - #+cormanlisp "localhost" ;; is there a better way? Does it matter? - #+allegro (excl.osi:gethostname) - #+clisp (first (split-string (machine-instance) :separator " ")) - #+gcl (system:gethostname)) - - -;;; --------------------------------------------------------------------------- -;;; Generic support for configuration files - -(defun inter-directory-separator () - (if (os-unix-p) #\: #\;)) - -(defun* user-homedir () - (truenamize - (pathname-directory-pathname - #+cormanlisp (ensure-directory-pathname (user-homedir-pathname)) - #+mcl (current-user-homedir-pathname) - #-(or cormanlisp mcl) (user-homedir-pathname)))) - -(defun* ensure-pathname* (x want-absolute want-directory fmt &rest args) - (when (plusp (length x)) - (let ((p (if want-directory (ensure-directory-pathname x) (pathname x)))) - (when want-absolute - (unless (absolute-pathname-p p) - (cerror "ignore relative pathname" - "Invalid relative pathname ~A~@[ ~?~]" x fmt args) - (return-from ensure-pathname* nil))) - p))) -(defun* split-pathnames* (x want-absolute want-directory fmt &rest args) - (loop :for dir :in (split-string - x :separator (string (inter-directory-separator))) - :collect (apply 'ensure-pathname* dir want-absolute want-directory fmt args))) -(defun* getenv-pathname (x &key want-absolute want-directory &aux (s (getenv x))) - (ensure-pathname* s want-absolute want-directory "from (getenv ~S)" x)) -(defun* getenv-pathnames (x &key want-absolute want-directory &aux (s (getenv x))) - (and (plusp (length s)) - (split-pathnames* s want-absolute want-directory "from (getenv ~S) = ~S" x s))) -(defun* getenv-absolute-directory (x) - (getenv-pathname x :want-absolute t :want-directory t)) -(defun* getenv-absolute-directories (x) - (getenv-pathnames x :want-absolute t :want-directory t)) - -(defun* get-folder-path (folder) - (or ;; this semi-portably implements a subset of the functionality of lispworks' sys:get-folder-path - #+(and lispworks mswindows) (sys:get-folder-path folder) - ;; read-windows-registry HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\AppData - (ecase folder - (:local-appdata (getenv-absolute-directory "LOCALAPPDATA")) - (:appdata (getenv-absolute-directory "APPDATA")) - (:common-appdata (or (getenv-absolute-directory "ALLUSERSAPPDATA") - (subpathname* (getenv-absolute-directory "ALLUSERSPROFILE") "Application Data/")))))) - -(defun* user-configuration-directories () - (let ((dirs - `(,@(when (os-unix-p) - (cons - (subpathname* (getenv-absolute-directory "XDG_CONFIG_HOME") "common-lisp/") - (loop :for dir :in (getenv-absolute-directories "XDG_CONFIG_DIRS") - :collect (subpathname* dir "common-lisp/")))) - ,@(when (os-windows-p) - `(,(subpathname* (get-folder-path :local-appdata) "common-lisp/config/") - ,(subpathname* (get-folder-path :appdata) "common-lisp/config/"))) - ,(subpathname (user-homedir) ".config/common-lisp/")))) - (remove-duplicates (remove-if-not #'absolute-pathname-p dirs) - :from-end t :test 'equal))) - -(defun* system-configuration-directories () - (cond - ((os-unix-p) '(#p"/etc/common-lisp/")) - ((os-windows-p) - (aif - ;; read-windows-registry HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Common AppData - (subpathname* (get-folder-path :common-appdata) "common-lisp/config/") - (list it))))) - -(defun* in-first-directory (dirs x &key (direction :input)) - (loop :with fun = (ecase direction - ((nil :input :probe) 'probe-file*) - ((:output :io) 'identity)) - :for dir :in dirs - :thereis (and dir (funcall fun (merge-pathnames* x (ensure-directory-pathname dir)))))) - -(defun* in-user-configuration-directory (x &key (direction :input)) - (in-first-directory (user-configuration-directories) x :direction direction)) -(defun* in-system-configuration-directory (x &key (direction :input)) - (in-first-directory (system-configuration-directories) x :direction direction)) - -(defun* configuration-inheritance-directive-p (x) - (let ((kw '(:inherit-configuration :ignore-inherited-configuration))) - (or (member x kw) - (and (length=n-p x 1) (member (car x) kw))))) - -(defun* report-invalid-form (reporter &rest args) - (etypecase reporter - (null - (apply 'error 'invalid-configuration args)) - (function - (apply reporter args)) - ((or symbol string) - (apply 'error reporter args)) - (cons - (apply 'apply (append reporter args))))) - -(defvar *ignored-configuration-form* nil) - -(defun* validate-configuration-form (form tag directive-validator - &key location invalid-form-reporter) - (unless (and (consp form) (eq (car form) tag)) - (setf *ignored-configuration-form* t) - (report-invalid-form invalid-form-reporter :form form :location location) - (return-from validate-configuration-form nil)) - (loop :with inherit = 0 :with ignore-invalid-p = nil :with x = (list tag) - :for directive :in (cdr form) - :when (cond - ((configuration-inheritance-directive-p directive) - (incf inherit) t) - ((eq directive :ignore-invalid-entries) - (setf ignore-invalid-p t) t) - ((funcall directive-validator directive) - t) - (ignore-invalid-p - nil) - (t - (setf *ignored-configuration-form* t) - (report-invalid-form invalid-form-reporter :form directive :location location) - nil)) - :do (push directive x) - :finally - (unless (= inherit 1) - (report-invalid-form invalid-form-reporter - :arguments (list (compatfmt "~@") - :inherit-configuration :ignore-inherited-configuration))) - (return (nreverse x)))) - -(defun* validate-configuration-file (file validator &key description) - (let ((forms (read-file-forms file))) - (unless (length=n-p forms 1) - (error (compatfmt "~@~%") - description forms)) - (funcall validator (car forms) :location file))) - -(defun* hidden-file-p (pathname) - (equal (first-char (pathname-name pathname)) #\.)) - -(defun* directory* (pathname-spec &rest keys &key &allow-other-keys) - (apply 'directory pathname-spec - (append keys '#.(or #+allegro '(:directories-are-files nil :follow-symbolic-links nil) - #+clozure '(:follow-links nil) - #+clisp '(:circle t :if-does-not-exist :ignore) - #+(or cmu scl) '(:follow-links nil :truenamep nil) - #+sbcl (when (find-symbol* :resolve-symlinks '#:sb-impl) - '(:resolve-symlinks nil)))))) - -(defun* validate-configuration-directory (directory tag validator &key invalid-form-reporter) - "Map the VALIDATOR across the .conf files in DIRECTORY, the TAG will -be applied to the results to yield a configuration form. Current -values of TAG include :source-registry and :output-translations." - (let ((files (sort (ignore-errors - (remove-if - 'hidden-file-p - (directory* (make-pathname :name :wild :type "conf" :defaults directory)))) - #'string< :key #'namestring))) - `(,tag - ,@(loop :for file :in files :append - (loop :with ignore-invalid-p = nil - :for form :in (read-file-forms file) - :when (eq form :ignore-invalid-entries) - :do (setf ignore-invalid-p t) - :else - :when (funcall validator form) - :collect form - :else - :when ignore-invalid-p - :do (setf *ignored-configuration-form* t) - :else - :do (report-invalid-form invalid-form-reporter :form form :location file))) - :inherit-configuration))) - - -;;; --------------------------------------------------------------------------- -;;; asdf-output-translations -;;; -;;; this code is heavily inspired from -;;; asdf-binary-translations, common-lisp-controller and cl-launch. -;;; --------------------------------------------------------------------------- - -(defvar *output-translations* () - "Either NIL (for uninitialized), or a list of one element, -said element itself being a sorted list of mappings. -Each mapping is a pair of a source pathname and destination pathname, -and the order is by decreasing length of namestring of the source pathname.") - -(defvar *user-cache* - (flet ((try (x &rest sub) (and x `(,x ,@sub)))) - (or - (try (getenv-absolute-directory "XDG_CACHE_HOME") "common-lisp" :implementation) - (when (os-windows-p) - (try (or (get-folder-path :local-appdata) - (get-folder-path :appdata)) - "common-lisp" "cache" :implementation)) - '(:home ".cache" "common-lisp" :implementation)))) - -(defun* output-translations () - (car *output-translations*)) - -(defun* (setf output-translations) (new-value) - (setf *output-translations* - (list - (stable-sort (copy-list new-value) #'> - :key #'(lambda (x) - (etypecase (car x) - ((eql t) -1) - (pathname - (let ((directory (pathname-directory (car x)))) - (if (listp directory) (length directory) 0)))))))) - new-value) - -(defun* output-translations-initialized-p () - (and *output-translations* t)) - -(defun* clear-output-translations () - "Undoes any initialization of the output translations. -You might want to call that before you dump an image that would be resumed -with a different configuration, so the configuration would be re-read then." - (setf *output-translations* '()) - (values)) - -(declaim (ftype (function (t &key (:directory boolean) (:wilden boolean)) - (values (or null pathname) &optional)) - resolve-location)) - -(defun* resolve-relative-location-component (x &key directory wilden) - (let ((r (etypecase x - (pathname x) - (string (coerce-pathname x :type (when directory :directory))) - (cons - (if (null (cdr x)) - (resolve-relative-location-component - (car x) :directory directory :wilden wilden) - (let* ((car (resolve-relative-location-component - (car x) :directory t :wilden nil))) - (merge-pathnames* - (resolve-relative-location-component - (cdr x) :directory directory :wilden wilden) - car)))) - ((eql :default-directory) - (relativize-pathname-directory (default-directory))) - ((eql :*/) *wild-directory*) - ((eql :**/) *wild-inferiors*) - ((eql :*.*.*) *wild-file*) - ((eql :implementation) - (coerce-pathname (implementation-identifier) :type :directory)) - ((eql :implementation-type) - (coerce-pathname (string-downcase (implementation-type)) :type :directory)) - ((eql :hostname) - (coerce-pathname (hostname) :type :directory))))) - (when (absolute-pathname-p r) - (error (compatfmt "~@") x)) - (if (or (pathnamep x) (not wilden)) r (wilden r)))) - -(defvar *here-directory* nil - "This special variable is bound to the currect directory during calls to -PROCESS-SOURCE-REGISTRY in order that we be able to interpret the :here -directive.") - -(defun* resolve-absolute-location-component (x &key directory wilden) - (let* ((r - (etypecase x - (pathname x) - (string (let ((p (#+mcl probe-posix #-mcl parse-namestring x))) - #+mcl (unless p (error "POSIX pathname ~S does not exist" x)) - (if directory (ensure-directory-pathname p) p))) - (cons - (return-from resolve-absolute-location-component - (if (null (cdr x)) - (resolve-absolute-location-component - (car x) :directory directory :wilden wilden) - (merge-pathnames* - (resolve-relative-location-component - (cdr x) :directory directory :wilden wilden) - (resolve-absolute-location-component - (car x) :directory t :wilden nil))))) - ((eql :root) - ;; special magic! we encode such paths as relative pathnames, - ;; but it means "relative to the root of the source pathname's host and device". - (return-from resolve-absolute-location-component - (let ((p (make-pathname :directory '(:relative)))) - (if wilden (wilden p) p)))) - ((eql :home) (user-homedir)) - ((eql :here) - (resolve-location (or *here-directory* - ;; give semantics in the case of use interactively - :default-directory) - :directory t :wilden nil)) - ((eql :user-cache) (resolve-location *user-cache* :directory t :wilden nil)) - ((eql :system-cache) - (error "Using the :system-cache is deprecated. ~%~ -Please remove it from your ASDF configuration")) - ((eql :default-directory) (default-directory)))) - (s (if (and wilden (not (pathnamep x))) - (wilden r) - r))) - (unless (absolute-pathname-p s) - (error (compatfmt "~@") x)) - s)) - -(defun* resolve-location (x &key directory wilden) - (if (atom x) - (resolve-absolute-location-component x :directory directory :wilden wilden) - (loop :with path = (resolve-absolute-location-component - (car x) :directory (and (or directory (cdr x)) t) - :wilden (and wilden (null (cdr x)))) - :for (component . morep) :on (cdr x) - :for dir = (and (or morep directory) t) - :for wild = (and wilden (not morep)) - :do (setf path (merge-pathnames* - (resolve-relative-location-component - component :directory dir :wilden wild) - path)) - :finally (return path)))) - -(defun* location-designator-p (x) - (flet ((absolute-component-p (c) - (typep c '(or string pathname - (member :root :home :here :user-cache :system-cache :default-directory)))) - (relative-component-p (c) - (typep c '(or string pathname - (member :default-directory :*/ :**/ :*.*.* - :implementation :implementation-type))))) - (or (typep x 'boolean) - (absolute-component-p x) - (and (consp x) (absolute-component-p (first x)) (every #'relative-component-p (rest x)))))) - -(defun* location-function-p (x) - (and - (length=n-p x 2) - (eq (car x) :function) - (or (symbolp (cadr x)) - (and (consp (cadr x)) - (eq (caadr x) 'lambda) - (length=n-p (cadadr x) 2))))) - -(defun* validate-output-translations-directive (directive) - (or (member directive '(:enable-user-cache :disable-cache nil)) - (and (consp directive) - (or (and (length=n-p directive 2) - (or (and (eq (first directive) :include) - (typep (second directive) '(or string pathname null))) - (and (location-designator-p (first directive)) - (or (location-designator-p (second directive)) - (location-function-p (second directive)))))) - (and (length=n-p directive 1) - (location-designator-p (first directive))))))) - -(defun* validate-output-translations-form (form &key location) - (validate-configuration-form - form - :output-translations - 'validate-output-translations-directive - :location location :invalid-form-reporter 'invalid-output-translation)) - -(defun* validate-output-translations-file (file) - (validate-configuration-file - file 'validate-output-translations-form :description "output translations")) - -(defun* validate-output-translations-directory (directory) - (validate-configuration-directory - directory :output-translations 'validate-output-translations-directive - :invalid-form-reporter 'invalid-output-translation)) - -(defun* parse-output-translations-string (string &key location) - (cond - ((or (null string) (equal string "")) - '(:output-translations :inherit-configuration)) - ((not (stringp string)) - (error (compatfmt "~@") string)) - ((eql (char string 0) #\") - (parse-output-translations-string (read-from-string string) :location location)) - ((eql (char string 0) #\() - (validate-output-translations-form (read-from-string string) :location location)) - (t - (loop - :with inherit = nil - :with directives = () - :with start = 0 - :with end = (length string) - :with source = nil - :with separator = (inter-directory-separator) - :for i = (or (position separator string :start start) end) :do - (let ((s (subseq string start i))) - (cond - (source - (push (list source (if (equal "" s) nil s)) directives) - (setf source nil)) - ((equal "" s) - (when inherit - (error (compatfmt "~@") - string)) - (setf inherit t) - (push :inherit-configuration directives)) - (t - (setf source s))) - (setf start (1+ i)) - (when (> start end) - (when source - (error (compatfmt "~@") - string)) - (unless inherit - (push :ignore-inherited-configuration directives)) - (return `(:output-translations ,@(nreverse directives))))))))) - -(defparameter *default-output-translations* - '(environment-output-translations - user-output-translations-pathname - user-output-translations-directory-pathname - system-output-translations-pathname - system-output-translations-directory-pathname)) - -(defun* wrapping-output-translations () - `(:output-translations - ;; Some implementations have precompiled ASDF systems, - ;; so we must disable translations for implementation paths. - #+sbcl ,(let ((h (getenv-pathname "SBCL_HOME" :want-directory t))) - (when h `((,(truenamize h) ,*wild-inferiors*) ()))) - ;; The below two are not needed: no precompiled ASDF system there - #+(or ecl mkcl) (,(translate-logical-pathname "SYS:**;*.*") ()) - #+mkcl (,(translate-logical-pathname "CONTRIB:") ()) - ;; #+clozure ,(ignore-errors (list (wilden (let ((*default-pathname-defaults* #p"")) (truename #p"ccl:"))) ())) - ;; All-import, here is where we want user stuff to be: - :inherit-configuration - ;; These are for convenience, and can be overridden by the user: - #+abcl (#p"/___jar___file___root___/**/*.*" (:user-cache #p"**/*.*")) - #+abcl (#p"jar:file:/**/*.jar!/**/*.*" (:function translate-jar-pathname)) - ;; We enable the user cache by default, and here is the place we do: - :enable-user-cache)) - -(defparameter *output-translations-file* (coerce-pathname "asdf-output-translations.conf")) -(defparameter *output-translations-directory* (coerce-pathname "asdf-output-translations.conf.d/")) - -(defun* user-output-translations-pathname (&key (direction :input)) - (in-user-configuration-directory *output-translations-file* :direction direction)) -(defun* system-output-translations-pathname (&key (direction :input)) - (in-system-configuration-directory *output-translations-file* :direction direction)) -(defun* user-output-translations-directory-pathname (&key (direction :input)) - (in-user-configuration-directory *output-translations-directory* :direction direction)) -(defun* system-output-translations-directory-pathname (&key (direction :input)) - (in-system-configuration-directory *output-translations-directory* :direction direction)) -(defun* environment-output-translations () - (getenv "ASDF_OUTPUT_TRANSLATIONS")) - -(defgeneric* process-output-translations (spec &key inherit collect)) -(declaim (ftype (function (t &key (:collect (or symbol function))) t) - inherit-output-translations)) -(declaim (ftype (function (t &key (:collect (or symbol function)) (:inherit list)) t) - process-output-translations-directive)) - -(defmethod process-output-translations ((x symbol) &key - (inherit *default-output-translations*) - collect) - (process-output-translations (funcall x) :inherit inherit :collect collect)) -(defmethod process-output-translations ((pathname pathname) &key inherit collect) - (cond - ((directory-pathname-p pathname) - (process-output-translations (validate-output-translations-directory pathname) - :inherit inherit :collect collect)) - ((probe-file* pathname) - (process-output-translations (validate-output-translations-file pathname) - :inherit inherit :collect collect)) - (t - (inherit-output-translations inherit :collect collect)))) -(defmethod process-output-translations ((string string) &key inherit collect) - (process-output-translations (parse-output-translations-string string) - :inherit inherit :collect collect)) -(defmethod process-output-translations ((x null) &key inherit collect) - (declare (ignorable x)) - (inherit-output-translations inherit :collect collect)) -(defmethod process-output-translations ((form cons) &key inherit collect) - (dolist (directive (cdr (validate-output-translations-form form))) - (process-output-translations-directive directive :inherit inherit :collect collect))) - -(defun* inherit-output-translations (inherit &key collect) - (when inherit - (process-output-translations (first inherit) :collect collect :inherit (rest inherit)))) - -(defun* process-output-translations-directive (directive &key inherit collect) - (if (atom directive) - (ecase directive - ((:enable-user-cache) - (process-output-translations-directive '(t :user-cache) :collect collect)) - ((:disable-cache) - (process-output-translations-directive '(t t) :collect collect)) - ((:inherit-configuration) - (inherit-output-translations inherit :collect collect)) - ((:ignore-inherited-configuration :ignore-invalid-entries nil) - nil)) - (let ((src (first directive)) - (dst (second directive))) - (if (eq src :include) - (when dst - (process-output-translations (pathname dst) :inherit nil :collect collect)) - (when src - (let ((trusrc (or (eql src t) - (let ((loc (resolve-location src :directory t :wilden t))) - (if (absolute-pathname-p loc) (truenamize loc) loc))))) - (cond - ((location-function-p dst) - (funcall collect - (list trusrc - (if (symbolp (second dst)) - (fdefinition (second dst)) - (eval (second dst)))))) - ((eq dst t) - (funcall collect (list trusrc t))) - (t - (let* ((trudst (if dst - (resolve-location dst :directory t :wilden t) - trusrc)) - (wilddst (merge-pathnames* *wild-file* trudst))) - (funcall collect (list wilddst t)) - (funcall collect (list trusrc trudst))))))))))) - -(defun* compute-output-translations (&optional parameter) - "read the configuration, return it" - (remove-duplicates - (while-collecting (c) - (inherit-output-translations - `(wrapping-output-translations ,parameter ,@*default-output-translations*) :collect #'c)) - :test 'equal :from-end t)) - -(defvar *output-translations-parameter* nil) - -(defun* initialize-output-translations (&optional (parameter *output-translations-parameter*)) - "read the configuration, initialize the internal configuration variable, -return the configuration" - (setf *output-translations-parameter* parameter - (output-translations) (compute-output-translations parameter))) - -(defun* disable-output-translations () - "Initialize output translations in a way that maps every file to itself, -effectively disabling the output translation facility." - (initialize-output-translations - '(:output-translations :disable-cache :ignore-inherited-configuration))) - -;; checks an initial variable to see whether the state is initialized -;; or cleared. In the former case, return current configuration; in -;; the latter, initialize. ASDF will call this function at the start -;; of (asdf:find-system). -(defun* ensure-output-translations () - (if (output-translations-initialized-p) - (output-translations) - (initialize-output-translations))) - -(defun* translate-pathname* (path absolute-source destination &optional root source) - (declare (ignore source)) - (cond - ((functionp destination) - (funcall destination path absolute-source)) - ((eq destination t) - path) - ((not (pathnamep destination)) - (error "Invalid destination")) - ((not (absolute-pathname-p destination)) - (translate-pathname path absolute-source (merge-pathnames* destination root))) - (root - (translate-pathname (directorize-pathname-host-device path) absolute-source destination)) - (t - (translate-pathname path absolute-source destination)))) - -(defun* apply-output-translations (path) - #+cormanlisp (truenamize path) #-cormanlisp - (etypecase path - (logical-pathname - path) - ((or pathname string) - (ensure-output-translations) - (loop :with p = (truenamize path) - :for (source destination) :in (car *output-translations*) - :for root = (when (or (eq source t) - (and (pathnamep source) - (not (absolute-pathname-p source)))) - (pathname-root p)) - :for absolute-source = (cond - ((eq source t) (wilden root)) - (root (merge-pathnames* source root)) - (t source)) - :when (or (eq source t) (pathname-match-p p absolute-source)) - :return (translate-pathname* p absolute-source destination root source) - :finally (return p))))) - -(defmethod output-files :around (operation component) - "Translate output files, unless asked not to" - operation component ;; hush genera, not convinced by declare ignorable(!) - (values - (multiple-value-bind (files fixedp) (call-next-method) - (if fixedp - files - (mapcar #'apply-output-translations files))) - t)) - -(defun* compile-file-pathname* (input-file &rest keys &key output-file &allow-other-keys) - (if (absolute-pathname-p output-file) - ;; what cfp should be doing, w/ mp* instead of mp - (let* ((type (pathname-type (apply 'compile-file-pathname "x.lisp" keys))) - (defaults (make-pathname - :type type :defaults (merge-pathnames* input-file)))) - (merge-pathnames* output-file defaults)) - (apply-output-translations - (apply 'compile-file-pathname input-file - (if output-file keys (remove-keyword :output-file keys)))))) - -(defun* tmpize-pathname (x) - (make-pathname - :name (strcat "ASDF-TMP-" (pathname-name x)) - :defaults x)) - -(defun* delete-file-if-exists (x) - (when (and x (probe-file* x)) - (delete-file x))) - -(defun* compile-file* (input-file &rest keys &key compile-check output-file &allow-other-keys) - (let* ((keywords (remove-keyword :compile-check keys)) - (output-file (apply 'compile-file-pathname* input-file :output-file output-file keywords)) - (tmp-file (tmpize-pathname output-file)) - (status :error)) - (multiple-value-bind (output-truename warnings-p failure-p) - (apply 'compile-file input-file :output-file tmp-file keywords) - (cond - (failure-p - (setf status *compile-file-failure-behaviour*)) - (warnings-p - (setf status *compile-file-warnings-behaviour*)) - (t - (setf status :success))) - (cond - ((and (ecase status - ((:success :warn :ignore) t) - ((:error nil))) - (or (not compile-check) - (apply compile-check input-file :output-file tmp-file keywords))) - (delete-file-if-exists output-file) - (when output-truename - (rename-file output-truename output-file) - (setf output-truename output-file))) - (t ;; error or failed check - (delete-file-if-exists output-truename) - (setf output-truename nil failure-p t))) - (values output-truename warnings-p failure-p)))) - -#+abcl -(defun* translate-jar-pathname (source wildcard) - (declare (ignore wildcard)) - (let* ((p (pathname (first (pathname-device source)))) - (root (format nil "/___jar___file___root___/~@[~A/~]" - (and (find :windows *features*) - (pathname-device p))))) - (apply-output-translations - (merge-pathnames* - (relativize-pathname-directory source) - (merge-pathnames* - (relativize-pathname-directory (ensure-directory-pathname p)) - root))))) - -;;;; ----------------------------------------------------------------- -;;;; Compatibility mode for ASDF-Binary-Locations - -(defmethod operate :before (operation-class system &rest args &key &allow-other-keys) - (declare (ignorable operation-class system args)) - (when (find-symbol* '#:output-files-for-system-and-operation :asdf) - (error "ASDF 2 is not compatible with ASDF-BINARY-LOCATIONS, which you are using. -ASDF 2 now achieves the same purpose with its builtin ASDF-OUTPUT-TRANSLATIONS, -which should be easier to configure. Please stop using ASDF-BINARY-LOCATIONS, -and instead use ASDF-OUTPUT-TRANSLATIONS. See the ASDF manual for details. -In case you insist on preserving your previous A-B-L configuration, but -do not know how to achieve the same effect with A-O-T, you may use function -ASDF:ENABLE-ASDF-BINARY-LOCATIONS-COMPATIBILITY as documented in the manual; -call that function where you would otherwise have loaded and configured A-B-L."))) - -(defun* enable-asdf-binary-locations-compatibility - (&key - (centralize-lisp-binaries nil) - (default-toplevel-directory - (subpathname (user-homedir) ".fasls/")) ;; Use ".cache/common-lisp/" instead ??? - (include-per-user-information nil) - (map-all-source-files (or #+(or clisp ecl mkcl) t nil)) - (source-to-target-mappings nil)) - #+(or clisp ecl mkcl) - (when (null map-all-source-files) - (error "asdf:enable-asdf-binary-locations-compatibility doesn't support :map-all-source-files nil on CLISP, ECL and MKCL")) - (let* ((fasl-type (pathname-type (compile-file-pathname "foo.lisp"))) - (mapped-files (if map-all-source-files *wild-file* - (make-pathname :type fasl-type :defaults *wild-file*))) - (destination-directory - (if centralize-lisp-binaries - `(,default-toplevel-directory - ,@(when include-per-user-information - (cdr (pathname-directory (user-homedir)))) - :implementation ,*wild-inferiors*) - `(:root ,*wild-inferiors* :implementation)))) - (initialize-output-translations - `(:output-translations - ,@source-to-target-mappings - ((:root ,*wild-inferiors* ,mapped-files) - (,@destination-directory ,mapped-files)) - (t t) - :ignore-inherited-configuration)))) - -;;;; ----------------------------------------------------------------- -;;;; Source Registry Configuration, by Francois-Rene Rideau -;;;; See the Manual and https://bugs.launchpad.net/asdf/+bug/485918 - -;; Using ack 1.2 exclusions -(defvar *default-source-registry-exclusions* - '(".bzr" ".cdv" - ;; "~.dep" "~.dot" "~.nib" "~.plst" ; we don't support ack wildcards - ".git" ".hg" ".pc" ".svn" "CVS" "RCS" "SCCS" "_darcs" - "_sgbak" "autom4te.cache" "cover_db" "_build" - "debian")) ;; debian often builds stuff under the debian directory... BAD. - -(defvar *source-registry-exclusions* *default-source-registry-exclusions*) - -(defvar *source-registry* nil - "Either NIL (for uninitialized), or an equal hash-table, mapping -system names to pathnames of .asd files") - -(defun* source-registry-initialized-p () - (typep *source-registry* 'hash-table)) - -(defun* clear-source-registry () - "Undoes any initialization of the source registry. -You might want to call that before you dump an image that would be resumed -with a different configuration, so the configuration would be re-read then." - (setf *source-registry* nil) - (values)) - -(defparameter *wild-asd* - (make-pathname :directory nil :name *wild* :type "asd" :version :newest)) - -(defun* filter-logical-directory-results (directory entries merger) - (if (typep directory 'logical-pathname) - ;; Try hard to not resolve logical-pathname into physical pathnames; - ;; otherwise logical-pathname users/lovers will be disappointed. - ;; If directory* could use some implementation-dependent magic, - ;; we will have logical pathnames already; otherwise, - ;; we only keep pathnames for which specifying the name and - ;; translating the LPN commute. - (loop :for f :in entries - :for p = (or (and (typep f 'logical-pathname) f) - (let* ((u (ignore-errors (funcall merger f)))) - ;; The first u avoids a cumbersome (truename u) error. - ;; At this point f should already be a truename, - ;; but isn't quite in CLISP, for doesn't have :version :newest - (and u (equal (ignore-errors (truename u)) (truename f)) u))) - :when p :collect p) - entries)) - -(defun* directory-files (directory &optional (pattern *wild-file*)) - (let ((dir (pathname directory))) - (when (typep dir 'logical-pathname) - ;; Because of the filtering we do below, - ;; logical pathnames have restrictions on wild patterns. - ;; Not that the results are very portable when you use these patterns on physical pathnames. - (when (wild-pathname-p dir) - (error "Invalid wild pattern in logical directory ~S" directory)) - (unless (member (pathname-directory pattern) '(() (:relative)) :test 'equal) - (error "Invalid file pattern ~S for logical directory ~S" pattern directory)) - (setf pattern (make-pathname-logical pattern (pathname-host dir)))) - (let ((entries (ignore-errors (directory* (merge-pathnames* pattern dir))))) - (filter-logical-directory-results - directory entries - #'(lambda (f) - (make-pathname :defaults dir - :name (make-pathname-component-logical (pathname-name f)) - :type (make-pathname-component-logical (pathname-type f)) - :version (make-pathname-component-logical (pathname-version f)))))))) - -(defun* directory-asd-files (directory) - (directory-files directory *wild-asd*)) - -(defun* subdirectories (directory) - (let* ((directory (ensure-directory-pathname directory)) - #-(or abcl cormanlisp genera xcl) - (wild (merge-pathnames* - #-(or abcl allegro cmu lispworks sbcl scl xcl) - *wild-directory* - #+(or abcl allegro cmu lispworks sbcl scl xcl) "*.*" - directory)) - (dirs - #-(or abcl cormanlisp genera xcl) - (ignore-errors - (directory* wild . #.(or #+clozure '(:directories t :files nil) - #+mcl '(:directories t)))) - #+(or abcl xcl) (system:list-directory directory) - #+cormanlisp (cl::directory-subdirs directory) - #+genera (fs:directory-list directory)) - #+(or abcl allegro cmu genera lispworks sbcl scl xcl) - (dirs (loop :for x :in dirs - :for d = #+(or abcl xcl) (extensions:probe-directory x) - #+allegro (excl:probe-directory x) - #+(or cmu sbcl scl) (directory-pathname-p x) - #+genera (getf (cdr x) :directory) - #+lispworks (lw:file-directory-p x) - :when d :collect #+(or abcl allegro xcl) d - #+genera (ensure-directory-pathname (first x)) - #+(or cmu lispworks sbcl scl) x))) - (filter-logical-directory-results - directory dirs - (let ((prefix (or (normalize-pathname-directory-component (pathname-directory directory)) - '(:absolute)))) ; because allegro returns NIL for #p"FOO:" - #'(lambda (d) - (let ((dir (normalize-pathname-directory-component (pathname-directory d)))) - (and (consp dir) (consp (cdr dir)) - (make-pathname - :defaults directory :name nil :type nil :version nil - :directory (append prefix (make-pathname-component-logical (last dir))))))))))) - -(defun* collect-asds-in-directory (directory collect) - (map () collect (directory-asd-files directory))) - -(defun* collect-sub*directories (directory collectp recursep collector) - (when (funcall collectp directory) - (funcall collector directory)) - (dolist (subdir (subdirectories directory)) - (when (funcall recursep subdir) - (collect-sub*directories subdir collectp recursep collector)))) - -(defun* collect-sub*directories-asd-files - (directory &key - (exclude *default-source-registry-exclusions*) - collect) - (collect-sub*directories - directory - (constantly t) - #'(lambda (x) (not (member (car (last (pathname-directory x))) exclude :test #'equal))) - #'(lambda (dir) (collect-asds-in-directory dir collect)))) - -(defun* validate-source-registry-directive (directive) - (or (member directive '(:default-registry)) - (and (consp directive) - (let ((rest (rest directive))) - (case (first directive) - ((:include :directory :tree) - (and (length=n-p rest 1) - (location-designator-p (first rest)))) - ((:exclude :also-exclude) - (every #'stringp rest)) - ((:default-registry) - (null rest))))))) - -(defun* validate-source-registry-form (form &key location) - (validate-configuration-form - form :source-registry 'validate-source-registry-directive - :location location :invalid-form-reporter 'invalid-source-registry)) - -(defun* validate-source-registry-file (file) - (validate-configuration-file - file 'validate-source-registry-form :description "a source registry")) - -(defun* validate-source-registry-directory (directory) - (validate-configuration-directory - directory :source-registry 'validate-source-registry-directive - :invalid-form-reporter 'invalid-source-registry)) - -(defun* parse-source-registry-string (string &key location) - (cond - ((or (null string) (equal string "")) - '(:source-registry :inherit-configuration)) - ((not (stringp string)) - (error (compatfmt "~@") string)) - ((find (char string 0) "\"(") - (validate-source-registry-form (read-from-string string) :location location)) - (t - (loop - :with inherit = nil - :with directives = () - :with start = 0 - :with end = (length string) - :with separator = (inter-directory-separator) - :for pos = (position separator string :start start) :do - (let ((s (subseq string start (or pos end)))) - (flet ((check (dir) - (unless (absolute-pathname-p dir) - (error (compatfmt "~@") string)) - dir)) - (cond - ((equal "" s) ; empty element: inherit - (when inherit - (error (compatfmt "~@") - string)) - (setf inherit t) - (push ':inherit-configuration directives)) - ((string-suffix-p s "//") ;; TODO: allow for doubling of separator even outside Unix? - (push `(:tree ,(check (subseq s 0 (- (length s) 2)))) directives)) - (t - (push `(:directory ,(check s)) directives)))) - (cond - (pos - (setf start (1+ pos))) - (t - (unless inherit - (push '(:ignore-inherited-configuration) directives)) - (return `(:source-registry ,@(nreverse directives)))))))))) - -(defun* register-asd-directory (directory &key recurse exclude collect) - (if (not recurse) - (collect-asds-in-directory directory collect) - (collect-sub*directories-asd-files - directory :exclude exclude :collect collect))) - -(defparameter *default-source-registries* - '(environment-source-registry - user-source-registry - user-source-registry-directory - system-source-registry - system-source-registry-directory - default-source-registry)) - -(defparameter *source-registry-file* (coerce-pathname "source-registry.conf")) -(defparameter *source-registry-directory* (coerce-pathname "source-registry.conf.d/")) - -(defun* wrapping-source-registry () - `(:source-registry - #+ecl (:tree ,(translate-logical-pathname "SYS:")) - #+mkcl (:tree ,(translate-logical-pathname "CONTRIB:")) - #+sbcl (:tree ,(truenamize (getenv-pathname "SBCL_HOME" :want-directory t))) - :inherit-configuration - #+cmu (:tree #p"modules:") - #+scl (:tree #p"file://modules/"))) -(defun* default-source-registry () - `(:source-registry - #+sbcl (:directory ,(subpathname (user-homedir) ".sbcl/systems/")) - (:directory ,(default-directory)) - ,@(loop :for dir :in - `(,@(when (os-unix-p) - `(,(or (getenv-absolute-directory "XDG_DATA_HOME") - (subpathname (user-homedir) ".local/share/")) - ,@(or (getenv-absolute-directories "XDG_DATA_DIRS") - '("/usr/local/share" "/usr/share")))) - ,@(when (os-windows-p) - (mapcar 'get-folder-path '(:local-appdata :appdata :common-appdata)))) - :collect `(:directory ,(subpathname* dir "common-lisp/systems/")) - :collect `(:tree ,(subpathname* dir "common-lisp/source/"))) - :inherit-configuration)) -(defun* user-source-registry (&key (direction :input)) - (in-user-configuration-directory *source-registry-file* :direction direction)) -(defun* system-source-registry (&key (direction :input)) - (in-system-configuration-directory *source-registry-file* :direction direction)) -(defun* user-source-registry-directory (&key (direction :input)) - (in-user-configuration-directory *source-registry-directory* :direction direction)) -(defun* system-source-registry-directory (&key (direction :input)) - (in-system-configuration-directory *source-registry-directory* :direction direction)) -(defun* environment-source-registry () - (getenv "CL_SOURCE_REGISTRY")) - -(defgeneric* process-source-registry (spec &key inherit register)) -(declaim (ftype (function (t &key (:register (or symbol function))) t) - inherit-source-registry)) -(declaim (ftype (function (t &key (:register (or symbol function)) (:inherit list)) t) - process-source-registry-directive)) - -(defmethod process-source-registry ((x symbol) &key inherit register) - (process-source-registry (funcall x) :inherit inherit :register register)) -(defmethod process-source-registry ((pathname pathname) &key inherit register) - (cond - ((directory-pathname-p pathname) - (let ((*here-directory* (truenamize pathname))) - (process-source-registry (validate-source-registry-directory pathname) - :inherit inherit :register register))) - ((probe-file* pathname) - (let ((*here-directory* (pathname-directory-pathname pathname))) - (process-source-registry (validate-source-registry-file pathname) - :inherit inherit :register register))) - (t - (inherit-source-registry inherit :register register)))) -(defmethod process-source-registry ((string string) &key inherit register) - (process-source-registry (parse-source-registry-string string) - :inherit inherit :register register)) -(defmethod process-source-registry ((x null) &key inherit register) - (declare (ignorable x)) - (inherit-source-registry inherit :register register)) -(defmethod process-source-registry ((form cons) &key inherit register) - (let ((*source-registry-exclusions* *default-source-registry-exclusions*)) - (dolist (directive (cdr (validate-source-registry-form form))) - (process-source-registry-directive directive :inherit inherit :register register)))) - -(defun* inherit-source-registry (inherit &key register) - (when inherit - (process-source-registry (first inherit) :register register :inherit (rest inherit)))) - -(defun* process-source-registry-directive (directive &key inherit register) - (destructuring-bind (kw &rest rest) (if (consp directive) directive (list directive)) - (ecase kw - ((:include) - (destructuring-bind (pathname) rest - (process-source-registry (resolve-location pathname) :inherit nil :register register))) - ((:directory) - (destructuring-bind (pathname) rest - (when pathname - (funcall register (resolve-location pathname :directory t))))) - ((:tree) - (destructuring-bind (pathname) rest - (when pathname - (funcall register (resolve-location pathname :directory t) - :recurse t :exclude *source-registry-exclusions*)))) - ((:exclude) - (setf *source-registry-exclusions* rest)) - ((:also-exclude) - (appendf *source-registry-exclusions* rest)) - ((:default-registry) - (inherit-source-registry '(default-source-registry) :register register)) - ((:inherit-configuration) - (inherit-source-registry inherit :register register)) - ((:ignore-inherited-configuration) - nil))) - nil) - -(defun* flatten-source-registry (&optional parameter) - (remove-duplicates - (while-collecting (collect) - (let ((*default-pathname-defaults* (default-directory))) - (inherit-source-registry - `(wrapping-source-registry - ,parameter - ,@*default-source-registries*) - :register #'(lambda (directory &key recurse exclude) - (collect (list directory :recurse recurse :exclude exclude)))))) - :test 'equal :from-end t)) - -;; Will read the configuration and initialize all internal variables. -(defun* compute-source-registry (&optional parameter (registry *source-registry*)) - (dolist (entry (flatten-source-registry parameter)) - (destructuring-bind (directory &key recurse exclude) entry - (let* ((h (make-hash-table :test 'equal))) ; table to detect duplicates - (register-asd-directory - directory :recurse recurse :exclude exclude :collect - #'(lambda (asd) - (let* ((name (pathname-name asd)) - (name (if (typep asd 'logical-pathname) - ;; logical pathnames are upper-case, - ;; at least in the CLHS and on SBCL, - ;; yet (coerce-name :foo) is lower-case. - ;; won't work well with (load-system "Foo") - ;; instead of (load-system 'foo) - (string-downcase name) - name))) - (cond - ((gethash name registry) ; already shadowed by something else - nil) - ((gethash name h) ; conflict at current level - (when *asdf-verbose* - (warn (compatfmt "~@") - directory recurse name (gethash name h) asd))) - (t - (setf (gethash name registry) asd) - (setf (gethash name h) asd)))))) - h))) - (values)) - -(defvar *source-registry-parameter* nil) - -(defun* initialize-source-registry (&optional (parameter *source-registry-parameter*)) - (setf *source-registry-parameter* parameter) - (setf *source-registry* (make-hash-table :test 'equal)) - (compute-source-registry parameter)) - -;; Checks an initial variable to see whether the state is initialized -;; or cleared. In the former case, return current configuration; in -;; the latter, initialize. ASDF will call this function at the start -;; of (asdf:find-system) to make sure the source registry is initialized. -;; However, it will do so *without* a parameter, at which point it -;; will be too late to provide a parameter to this function, though -;; you may override the configuration explicitly by calling -;; initialize-source-registry directly with your parameter. -(defun* ensure-source-registry (&optional parameter) - (unless (source-registry-initialized-p) - (initialize-source-registry parameter)) - (values)) - -(defun* sysdef-source-registry-search (system) - (ensure-source-registry) - (values (gethash (coerce-name system) *source-registry*))) - -(defun* clear-configuration () - (clear-source-registry) - (clear-output-translations)) - - -;;; ECL and MKCL support for COMPILE-OP / LOAD-OP -;;; -;;; In ECL and MKCL, these operations produce both -;;; FASL files and the object files that they are built from. -;;; Having both of them allows us to later on reuse the object files -;;; for bundles, libraries, standalone executables, etc. -;;; -;;; This has to be in asdf.lisp and not asdf-ecl.lisp, or else it becomes -;;; a problem for asdf on ECL to compile asdf-ecl.lisp after loading asdf.lisp. -;;; -;;; Also, register-pre-built-system. - -#+(or ecl mkcl) -(progn - (defun register-pre-built-system (name) - (register-system (make-instance 'system :name (coerce-name name) :source-file nil))) - - #+(or (and ecl win32) (and mkcl windows)) - (unless (assoc "asd" #+ecl ext:*load-hooks* #+mkcl si::*load-hooks* :test 'equal) - (appendf #+ecl ext:*load-hooks* #+mkcl si::*load-hooks* '(("asd" . si::load-source)))) - - (setf #+ecl ext:*module-provider-functions* #+mkcl mk-ext::*module-provider-functions* - (loop :for f :in #+ecl ext:*module-provider-functions* - #+mkcl mk-ext::*module-provider-functions* - :unless (eq f 'module-provide-asdf) - :collect #'(lambda (name) - (let ((l (multiple-value-list (funcall f name)))) - (and (first l) (register-pre-built-system (coerce-name name))) - (values-list l))))) - - (setf *compile-op-compile-file-function* 'compile-file-keeping-object) - - (defun compile-file-keeping-object (input-file &rest keys &key &allow-other-keys) - (#+ecl if #+ecl (use-ecl-byte-compiler-p) #+ecl (apply 'compile-file* input-file keys) - #+mkcl progn - (multiple-value-bind (object-file flags1 flags2) - (apply 'compile-file* input-file - #+ecl :system-p #+ecl t #+mkcl :fasl-p #+mkcl nil keys) - (values (and object-file - (compiler::build-fasl - (compile-file-pathname object-file - #+ecl :type #+ecl :fasl #+mkcl :fasl-p #+mkcl t) - #+ecl :lisp-files #+mkcl :lisp-object-files (list object-file)) - object-file) - flags1 - flags2))))) - -;;;; ----------------------------------------------------------------------- -;;;; Hook into REQUIRE for ABCL, CLISP, ClozureCL, CMUCL, ECL, MKCL and SBCL -;;;; -(defun* module-provide-asdf (name) - (handler-bind - ((style-warning #'muffle-warning) - #-genera - (missing-component (constantly nil)) - (error #'(lambda (e) - (format *error-output* (compatfmt "~@~%") - name e)))) - (let ((*verbose-out* (make-broadcast-stream)) - (system (find-system (string-downcase name) nil))) - (when system - (require-system system :verbose nil) - t)))) - -#+(or abcl clisp clozure cmu ecl mkcl sbcl) -(let ((x (and #+clisp (find-symbol* '#:*module-provider-functions* :custom)))) - (when x - (eval `(pushnew 'module-provide-asdf - #+abcl sys::*module-provider-functions* - #+clisp ,x - #+clozure ccl:*module-provider-functions* - #+(or cmu ecl) ext:*module-provider-functions* - #+mkcl mk-ext:*module-provider-functions* - #+sbcl sb-ext:*module-provider-functions*)))) - - -;;;; ------------------------------------------------------------------------- -;;;; Cleanups after hot-upgrade. -;;;; Things to do in case we're upgrading from a previous version of ASDF. -;;;; See https://bugs.launchpad.net/asdf/+bug/485687 -;;;; - -;;; If a previous version of ASDF failed to read some configuration, try again. -(when *ignored-configuration-form* - (clear-configuration) - (setf *ignored-configuration-form* nil)) - -;;;; ----------------------------------------------------------------- -;;;; Done! -(when *load-verbose* - (asdf-message ";; ASDF, version ~a~%" (asdf-version))) - -#+mkcl -(progn - (defvar *loading-asdf-bundle* nil) - (unless *loading-asdf-bundle* - (let ((*central-registry* - (cons (translate-logical-pathname #P"CONTRIB:asdf-bundle;") *central-registry*)) - (*loading-asdf-bundle* t)) - (clear-system :asdf-bundle) ;; we hope to force a reload. - (multiple-value-bind (result bundling-error) - (ignore-errors (asdf:oos 'asdf:load-op :asdf-bundle)) - (unless result - (format *error-output* - "~&;;; ASDF: Failed to load package 'asdf-bundle'!~%;;; ASDF: Reason is: ~A.~%" - bundling-error)))))) - -#+allegro -(eval-when (:compile-toplevel :execute) - (when (boundp 'excl:*warn-on-nested-reader-conditionals*) - (setf excl:*warn-on-nested-reader-conditionals* *acl-warn-save*))) - -(pushnew :asdf *features*) -(pushnew :asdf2 *features*) - -(provide :asdf) - -;;; Local Variables: -;;; mode: lisp -;;; End: diff --git a/sbcl/.quicklisp/client-info.sexp b/sbcl/.quicklisp/client-info.sexp deleted file mode 100644 index 15ea093..0000000 --- a/sbcl/.quicklisp/client-info.sexp +++ /dev/null @@ -1,28 +0,0 @@ -(:version "2020-01-04" - :client-info-format "1" - - :subscription-url - "http://beta.quicklisp.org/client/quicklisp.sexp" - :canonical-client-info-url - "http://beta.quicklisp.org/client/2020-01-04/client-info.sexp" - - :client-tar - (:url "http://beta.quicklisp.org/client/2020-01-04/quicklisp.tar" - :size 256000 - :md5 "1ac647d2f5735d9fa57d88f982e07970" - :sha256 - "3d8d0a8f0aee3a510c343bb3bcf668e5d327e992412ce98634c7d24c9881b9b8") - - :setup - (:url "http://beta.quicklisp.org/client/2015-09-24/setup.lisp" - :size 5054 - :md5 "bc380ac2e8296a67caba954802998bd4" - :sha256 - "2a7fbb8dbda22bb932ad12898f2ad3ebf1e770a4d0992cf4a2debe5739e35801") - - :asdf - (:url "http://beta.quicklisp.org/asdf/2.26/asdf.lisp" - :size 198729 - :md5 "6c2702561f5b8f02acd40d08c5429c96" - :sha256 - "def6bac208961aedf7e9593c3106adb3474241370f84ad1438a5f1d6632d4a7f")) diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/alexandria-20191227-git.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/alexandria-20191227-git.tgz deleted file mode 100644 index ae3278c34d1fb97e633c04e8aa318394076b608d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53842 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/anaphora-20191007-git.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/anaphora-20191007-git.tgz deleted file mode 100644 index d2f4bea795d0989fa40c0bd8220c0d46c44d7096..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6114 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/babel-20191130-git.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/babel-20191130-git.tgz deleted file mode 100644 index 300b888728964d576f83540e9124e46d58a9d3f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271183 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%0A2&f?am`xY&;t@pG3mnL#|W0}>R$+wj?lCM@r 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 fN zuK%Wcv$o<&yzh7acaD4BO?qAX@A1kc={K%h_BB~-IFhnr|E`%;5x19nZ?1cGCI0NU zJx^Bdzm>x?^VjOx{FAmC##cNozrQ1F`Hd6KqEGj=oA25>(cJFD`-uCSYFt5W`^axK z=We>ZWG_tEd;HN|gZHOb?$0Wo|0TFS^jlP5{a4Xvi~eOzDqU9dP4{M{9<@-J(~H`(R?vTEK+Nqr4Z-tc_!iv3clGK>DbDr3BSODWqd$-3^~zWVfiQBSL` z=+3y*|M_1e@2``KHQ&Czl0CVO=aJpF$_L@qqPLUe`}eYc4xRmf{qy>tjc@<+y$ZY; zq4_o3dt3E|75k;+cW>93Z_`#~dv1R8euuwTmw;A!2XD&;b@evP@%Vf7@4uVR9c3cE zEeohG?f)Kj**Jc$YcuER)3y(iB->}Kza_N*H0F{X+5cZBd{1U3AW`)sg#H&)pP}E?)fa)iUAC`wy)y zKE0y3~ z^JlB~E9EB2`t18V`FOw=Wqp@P<;|a0`+ia8`*W*Q@zwfeUnc*q`@AXjdezGPQPb`| zcKv(xtm@TUC#3Vg=gs}Ky8rHG=f77~elK0Ie^>4K4WOC18G>KKKZiakZ=H2&`qqi% z_s@Oy`x_d4f5H4;tIgCw!!vTqdD+SK54Cd_uG<;Yzeix(IZzKlW7_N$`*;0}%u(O} z;{2@@^0VH2PPjkm&D90}UTJ?$d9|J``u?iBi>~r%v+kc~UR@bNxdU_uqOO$@*%2-t?sVrq5O%+$8xm{Bm~ki7WB7%jfb3)qkB^RJ#^+wEpE6l~$0^&6!+)3Lr{C}WqhA@T2O2V*bmPS9q`&N6!;=Mk zKd!#`E_cblESaoi*+b_Ruh>89maf^SP}bF=g%3_2Tfbueto+yFEB4Qty+``NTt-9ILI{`##G`PC=Co)G_X>b=GD(53skcl6ip1I<{+|9O>rUFg*Q&#S-vw)okY zy64dPTUBv$f305l|4F^_^ILCrAN+Y$=lzA7{Bxej70m5D8BqUq>(}5a%hI!pZ+wuS zR=#q-)Uvzx{r+B^@uuA6@70hub)v7rJQ2tnK|f;~M*%U#nkF z`fvN3{b~7;hj0E&|F!!4n@e`jJ_g?Ues=q;Ue>^R(-SrGf323DKYQy$_OtsYUx~k4 zkuXp7Yxv@`mY`9g+`m`BrC;rWEAhOp_3ko9K!xnAoOPG|{$71MId}HV^|x+q2MyQA zY`2>K^{T@4qy)!?l+51W5hJCYE-D$R2 z;+(TQukB0k*HCHqMgOuqu9XMZo7x%iJq(}SqyOV-f@RaM)t0wQ#b2#Yvs8Bcdo?7t zPvh14w%bN&wxwsgxAgzIe9P{e?#c3!b2lUINBG-HOB;iVO;bCNhV05$>;L85o>qEI z@y&0i*w4qGH7)*^Rq@uQ_19{}+nc9diRaz+EpGY0tc3g=X;mO;p3;q6H&AV>7a{sKH zwTu1!UY+7Q@5(*Dx(Ctk9P1KZYy17Zdi$3ysFld<^7rZ=zl{^+f2e<7`tO0N**DMI zH-x^1Z+^p`sjlDB+aFxN^-fux%ipU?mVZ|4-<2-DO@6uGoVmNV1Yf@cN@=y}Tdg+B z|Cs(%?#<=xk1f82J5Q<;VAq@W@YYTKKPSFweKmPn-ji)6F7!40@n4VGC%313ci%F( z{Qj@MW#?|*n4$1BJXy@Qli9oOP}wKu+j}=$i9fsTUIeJcSIPf1y!iLY+MDL-&wD|G z1iu(wt)F)L82_!4$r|r}%v^u3sQ;Lp<<8?PyXUOw{k!JV-mjbYss87_?s?xLJvlq3 z{MGtnDal{o{s^^p3#d0e`7`s?dbP;^OaEnUG!6Z=a(~tBuUCWXx1Qd8dY@_{3ZwFE!Pob6_x@G&eJ6PGX4ZW6!UrkOH(ZIoTX$h!{ql7`r@Y>n@44@4@wsEa z?g!Ujy|(GqmH4~gr{4E1I_(+#qb~Oy%d7R%^1h!5syDs$i+k>`)$7-o2i1R#Evpy) z8h$wW`@ea=R&RfCyvDTCKl1rs;b^t=t+jdc{g?gAny`7=@_(z|*e?H< zHQ~;ZEAhN%>*SaJTlHk&qJLRaYI^>^T7T z@qF3M-fv=>f34QMSvdXIYR94yev-B5->bU#HN5+!-tO~wwSHL!Xw;(e z=I4?t@w$_kr~O(zJM+zEo1fF(fbvMReWv%KV;kPO+y9JwT7E?rJcd|ml3ASmF8%(= z$>sO!nyyCBAm@m$%Z_SM6ax(wNGhV*fdG_wvR6S7+zlKE6-&B(KZgt6yT0 zxaYV|tDf_Db&~g!O7JSP^)<#nuD+i5KehJsu~#eiN2$c?eGQ+y=J3DO`?Y303V*Nq zH}(GXx$c4WrX{=08-A^xExVTOP4ug2>woR9_5L>d*m|!$pa#SBHx;F?W}W_iY~NCa z!;vpMTfQ52!aieM|jo_~s|uZNG*$-;MsZ{@<#* z;SPVV7DUE-|Gj#4_sLr~)N?@%oP{?HXa8EAsFr#E=J{Wn%}P#QGXK$5wkfeIQd zw%tC-thnxik^R^3#~VJ&y;`q!^03q2tGSc^tM;WlR=5&>_eI9Zg+`M| zzyEAe`91f}v|p=#$8LTfYX3WLjousfX)=LV;_tq1tCa(d7x8}$cg`-l?{e1jHvczf z`%iKY!sn}Q^O_gA+W2|SqY2w;-p5Z&Kk{qU8~ughUB(DMut10|H{ZB}Gvy6KGL*-mY`_qd+dgXg3gBH8) zt2~;W9CamLcX}-U(toe4-~Q|>{Ie=nTWa~d-k$6^@l!uf2Svs5>7cIX4b!jTo7aZl zT)BT%cWk-k*YJF4cDt|P@w=ya{k?j@HT_T4rfN{vMKukS(r;~beYJks^?l)2;(ZSq zaeNIg-j+S5g(V*eS>38pg^xXLB_-eh{%5tZ_SO32C z&sMg}19jHSFR^4N+pm_ry>h?QaqZgVn9YVFuh!@JzWx6w+*#oE_gF7E_E+ndyw7_reD>V>IlopH-Ftr}{%qNqf8q68PkudDb9&$MIq|(^y05Rq zPc7XQT)#E0$o7@kjnCYlpRo58@qg;(+j)HDZ-wiN{ifHrp9x@2A}lw7*$&15~ucfd;{D>U)7Yc|UAHO~>Z~%m2MHeJXe4p-ymc z{njH||D!wAy`pEV7X!`mnR`W_`?W9Qz<2HU0)-C}pEEB1m$j{$cg6l+e!JJt{I&Z1 zrZqPH`&1>@pZghF{jKfSYR7BuR_vE*`?~r{e6M}w{~P>&ZtOT<^E^lHr|i$BH~&mu ztrt6a-RAs0)m-`a_b2W1eI@DjTkQPdfBJkFC1%IxqsK+iFd^Hwykmhd-ccWbpDn5rSx~(&;GT#@NUt4x4Y6iuG zZf^c*JM&M>-ghScTK#kSQ@Q))KTjBgI@$IM{=NFf{cYdeT7EOVf>-OqPM^9G-|JhF zR=f4~&L1oHSKTZXdbR%8{RyuP<2U5E{k>`gS}7P`CbRtCt8J;-zrVbm9+Mw%{A5z5mYiC_S}2!@BhIizMUOOqK3SKB>ycFVf-3a>?_X^51r& z*h}{GIcGjgT*koef2jTzSZ9D`&F+ihh;spXqKAzp6lDr(sMyJVXM#0QMr+R?`E<165Tat z*>>tzcgAm=Ydb$|`Z>v?IrlxY^w;auDqjnKQhuezb6f56H&t8y+FJTdetWxtv->X_ zyN|@%T1)N?n{tiQ8N&pncfQiQy|1zE@ILAE^NVb@H`aYx$NNRP$o7l$rT8z>m-;uS zU$nd5Sm$iwus`#*`NjNO`SWA4&Cb7B;P&L3`?lIAQJZ(ZI`;mF!PJlMpBU_YDtATZ zS10dZJ?npgr?Yfd+g5AWZNJ)Jy5N59edcQoIl1>fTBl#1ezk7V{VnG^HoxBQ{qEqr zqw{l5TUDpM{o%CcmHK@qpWN?ld|57S^MA}MEjn=P`LTIN?`LmKKmW*o-^=1-el-jm zSH*9U5?H;dl%L&H>9GFk+KcN?*q)fHu&-$|!~V4U%teQ86whjwn)on%Mty*C(d|`R z7k0~TUMaY>^+fNz4qA*-U7NPB z{#|o^v0KWHHT{d+o@~2WKFPQ&eB=9rC%2~6ikK=j+xi>%^`2OL>b)PI-)-}AOfgrt z&5XDjy0-4fs&!fSnX@8eKmF|!&fZw7eEpVc@{y0Lr#%Fzzxl7|*t@K6ziq3vcm3h} zn{p=c{3FvPXO~Z#aA$gyljFMbZ#t*GUhqFQY4YKco3GDK-hDXk{gbH8|6W|_*i-*) z=fm*#^K(CUhMwGBU)22nN!1+I9dFHT&r7w{PWy57_q6{@%f2ShSFO8x?V0SA4xaDX z_n%J|em3>nM)Rjr>jbo?=F9J|V!ti+=aueb#%zb}HJ8=Hramcuq5hb$?yKLn{2y1X zZ`M5sf1fh{eI)a#BJv&pSd`bR}(3`VPJ-*Trlh&IR zploy}P5{9rUy`u={}){W0!PBNQ+Yx~t(D?00L|Jycsvh%v*ab?og3&2`7O^^NU z=qK@dw}0=6=UaC@2%mp_+s`xM`oHBKgy+UyD9m!XWpnNEm5x1acbNaasc`5$@xf)M z+%MOkv5EDaZ>8(5KD#arN{5-ozasbh_n!D5k}3Zy^di^aHS29nmF8z{wc0v;b?)a# z=1p}Uu5{GQih2L$=(h8dOc&%O8(rzpDFjVknyLT%vEOZpEI*s+)8$+E|6XaUyZoxA z=+KGpr==#`eQmTtP%`fH(eEpFe!TJj==y!1{2qnp{#)qSdm`a;4u6)*yVob*cU+C0 z?+z09&>O6L>6xSSaMmH-7a8 zD}S0=UOvzEc$oH|SJ{6BK_T{Ld%?LIsXy;;et!2=Q+%!Oo$3JPqWjMO#Q$#kqyMWE zv}iJVY3+;aZ>n44YoA&lTEFkn=MSs5$=w2n=hqA8e_ah$zBKQz{FRP7|Er^=cSW45 zJ0}$|`&ygcwd+C3Mthv!b?cSw^Xfg3`@4T{eeR^&7N7nW+CN+UV#4G9!kNV>F{>Hg zs*2rZxYje(gVj~`z1y2+I&FWTW6kS3XIXd6__JNE=ftgF+kXWWUuQ3uFWFeVHRMe1!AlJL zqM~O87%FA&4i{D4WVZ9p-Xxc6VgHzwH?4cSk41UYwjC9=5)(hISt?qybz7N$fl_w# z{{`&Io67b`_jqI$f1dq$%~I}~tH*4=B)D8NYul-BD!yRzeU5!m(biTH6EDr*%fBz` zb}gsdk}Z+DG`?-xI#tUptZ-ldE+TetmEkeIl2E&GLLLCx^|ul(+D|Mw_QKb%Hw$X!ZnOW9HTmYw1L2FWS|02W z341+nsoCb}JrxHfy~&%{m4oJO-O|3^?3x{m z+mbua=e5>_@iQm~9V`?AT1jzZU07XU&xvcl7KeNnw)<9)`Fcjc`+N-tdVswRJwiWVwX(v>f<2am(_i^dhL`+f{WMezj7b0ZrhUG zeCxqnYh|~iOq+`v*Wa46Qm*I3uF`btnyp*wB0$OEEbFhGw!HCMC6sL?CSFRrE?={i zw@>fF`A@A;hURPH#d}WNdUpOxf=kz{OSjF=Zj{cEF61x!-y|5hUG3RscI8cZYvtK{ zPVCy6ZYD8t(WD(e9mRLsALy83x%;Q%^m}{tOEy-qN=*E8ZELRd$=hbXJq(qsU*Bg} z-n7l|Y3*85pS6FO+){EkKB_iQYVDetyLu(_%U|4gp8xXx^4iNf{YO@MYUR<6H*chv zl!I>Fi8&FQA1iG*zu0{GJhR_tAFeiwU(Bu?bnDHI4_D9qx__W!ihja%wwkS*pKD4? z+ui4)%{KnB*=kXe z%el3^PKHX)r=8buTXNLqg{X4TzJl{k_N%2e+@9R|)fX-?G3;GP&xxJU(jP**cU}X< zXS#yIjF=ywQs{J!bjikDQW6t4l@;G+i`4<8?ptiP-E3Cd-agnd<+AP# zvlmIJC7|q}zM5S*$j`=H{6*4RRmY#JP6od^*s&(JcOIy$zt;O+RJkbet!kHGW?_5v z(T*(==6jP|^w#w3JJhk|4@Zy3&hxh1f7j?RxTWNNG_5jFdiv#UuJo79f0%nt+tK)H^;AZy~M=YclUA^oZWle; zZJcgP3Iunrd$4-%)c6A(Q_Q^We`Mvq)k<*T+Fn?kSIKYA_GNQ5H>m1(&-nMwzlQbS zrY&y})XW8yqt)5tW3M}?RR5Y;WuTN@zwK~%`-6F{b!K@HhDz+(-kNSt9(-e} zDcw*cEHUxzgKMHSr5$;7U4L^k8RBKvysc^#+*$CR@$Z_sRvEb;?tNwd>!X*uUSeW% z?Bp&%%LrMf9*>>tx946s`l_x=(DKIDH4+oWKJNo%wxZi?v1{_AwyO0!)l6{lx_xMy zX4$gW{JVPI*)HgwdiFralx?TBZCsbrGbzc1@7i~f@Jh2Xo*%1D|7TF%RAwmyDw%5e zf4s{0zCOvNuPol}=$#E#lapMc-t3JtR62gB*PHk9rM=RoKHBDNrq8v@}bc9()20=CD&P{e;xNH+!x%3AKc?HJ)PMtIfsQG^@5C&a|5X;0$)>S=2%Wx| z*=>o()3V;f;jw3wKxOp%8_j~6mv;Z%_u=Zrxq=@;qrJC)njAZI6I`w>zU}_u>czLA zYkA+D6VIBlONQlWhs@gZ+&w2A6a|VX8*MJLJ=(ElM^9~t&gwgN!!OL=t^f2yn%Oe( zo)Z&p?%20t>ouMIEXqa^K2zz(r~LiauRRAkc*Lqf;e2dscJHkRdg81-CnoH) z?Ul9QerNaM`8Ot0ALG-`pz3$wD^X>m%~rA!6AxbNeSffHO5xk>OVoN!-)2+}dbc^d zLu%Q~vs+n|jdskDI@)n&&HorfCFAnE3A^V-R_lQD^u0US!E-a=rPJE2XXXlCF(|dP z0;S}sxy^cE=b4p*ZZ+jL>#4bK1I0PlZMImea`}?XI}#U;eu^?sO3gRj#=Gmrj5q@& z=d{#l1EuEErcBB~-R~6oCZP7^S8b)Q1eN9$_%QF>WZ^wJPQ+J0J&Sd)jU(d2fRfTu$u(<@Tp8AV==Y=l{D%n)%n(cXt=ew~l|X zdgoMgskK|vN^=a9n%6pBZx)m+D!+Cx{PVG`j`rHmHQbh*4i4%$ap%>?F2T&#a$may zXX@XPxN!c}^De=eyKQ;n&#tYzqVcS4t36n!*}?G7JEg^c>E5Z;^aQE>(v7y7`_lUiZ#Sj(FWQeQ)dxCw^tN;LoCvrfQ)8gC zbnS-RgvgsSLJX9g19uiK^nQA*L2qkzv);k4?6Fzj_gzp0RrkU5i`kWpM9kVkKsN2( z(v_O}xCfMucQ0fIMdQk{*1b8;dE#~7{A6-V(O6T@*5e_0-In`rRJr_@&HKELcIf2v za7avCxMACeFhlb-wah&y5?&jC8`pW~63*9jybI>{ zb}}j(?Xb}|P;$O1j&E z`Q1`9a(SdcjfDHW`=X-mF@su)znbf=&Es`T(Qv;m|7G*WM+q*cwwHWY{S~@&xBkWR z*KWT#2r91rtniKB@%zU9YiesjZU6tw%0a(2zpe{;Q?mQm!`0iSW$?SDtZ1se*CKS^*bo)y&{Zku83$)c3p#=WkUU=$P_({pQ>Y zN9&3Wl$=v*+Y(&ZraLc@m^jsT{=p6&z4LB{O0jzVNiJdE_An_Mg)~byOVx$lV^9uy zcREM9L^7uSL+iPV47+aZWpG=vW#;?U5)-#xEfi6{lyvJGsC}La%JYvK1SMnY_$4MT z+-4*$G4bG2fkr{i>^ql243&z_?Xzaw+QDR?^wjpwpJ!Vlr4EGa>cxTl)^IHBU%l;=*@#Y7_LM?bSgJtO8Zq zX)oF1x0c?o0+nUVAj{uGHLt(+?oPw{YkOzQf7xuvlHk&I>uvmxthe9RAJg4w%(PGH z?)QfEY|_TupiZUKf$;3?$$>p5B<|LB)*W11_+!=SpP;06XMx|wHFx&4tY_1{+#o2a zqgS+EV&cJLI$CZi8-5+)(R;z1jgi9@C|lNK8z8cdVg~ z`}(qoI#Ap3Q|Qr-EkC&TCb_U>SFZZA0f;8(L= zm>;M@>Ujui{jJWGF46Z)I<_8HT(30H3(?3nUf=k3GQ z7jH3$C>!0X-Fc`Z=g#H}=ilib?dS>nH(UGLrmfr!f||)UN?GH3dw28yii~HHm}u0t zl(ELNY}&F9S2K#ko<$wL@(C2tTRw?OOe~rYlH&vU^A|hFd{7?0o&Vu#M(xxtLCM@R z&$*N@{Za)L4#g|xXXk!62&yb1ncPx3xIyL5pKwE^#Z${gl{aPU@;+GIdpr8W)njXe ze`E#k*x68-@Hh_?CExdT)`_hKRfX?1KRy&L{oVG#>fWic2RnFrK|StcZ&`n2CFlME z6{@lNA3~>pUm`Kl_wg;MqJ%fQ4~9!;HwX2cSXTPoasRcw>|e6)%n|;(>)b`wUpq?~ z;&a#NGlCkx?<9|QY}r=>N`3d4l#RB$(`j38c5V4eiHW^iziPUrWWTP{a7)=-kZf`% z{kvez)u#!Kf|5FI3H+eUZMt%XbhEVh8JX$hE759)`2GHX%@GXf}H^gE^XIt?L5%I zBeowDSo36aq+e_8FuNA|@)^5WaLHds``7s_%0b6U&pX+_<`3vOaqXC7Bd7(i^FVmC zc6zg*WXwBp&|uA9w-2Gy_p`dCWLTTCeR+NN&w~4R)`|bf+FkHi>)YB`_77Lfph>)v z?_2bt@Y}7`{4dgfK6T1&j*b=p4HM1fuDSZ?&zCO2n~{!3c5?uVb zvz0rK=SBEVL#5)v+zaaqk{#@&w}Tv~V;|mg;@sNmA6e<8Nk=>0Sb@4Rb-V^jsdqAN z3r!0>5i4D?v0AFfFPmG+QEv{(fqD&FbBnX=qO1;wKcD(~{qnPQ=09HTDf-)Z zF}=1CltK3L@5}o5xEhqur-Moxn}_@26Z0aX4u;2`QwBB6jGjsbF z>0cQ@&e^+4V&dm(XIXzm)-92kSSCZB>B=$bO6OvyuljMhpHr?gv@A#)sE! z$p$0u^dGBEuLd=qWxPP9*75&%b?8$qDEpLyvX9yI_(k^@l@(`ZfX4WCZ2qUKkbD*|N_CUCJ*nd_~Gyj!bkH^gJrSdhUiEm$Y31)8m1L|u> z%wu;;*)YS>R$^jeV($M0m$ueuXHZw(o)z4V2UQCSqRK@Vcc(9me||4~l&sR`ZxodLb?EHU$9CV} z%-MEqo94F_v*XX#Zp~#*K6flY(=8?c=Ys_|PKT{yRyO)_&CWz)TIlOr2Q0RH3pP-4 z&VOuuu!CpsQ$|qQUZ>l{oV#DOX6yF!ZAmV>?ywsuJ&i1v{~~=?qO*?gFbAk!D5*A3 za<(u3?r8tInjK`|xAhVe_fFj@qP!`7$L|I6ZIeOfP2G6_)X1s5kPk}Ruen)3qiLWn z^4cC2wLzUHkr5^530*7v4DCT+MIbm0KqwF)?vNS)1d=HC)%jKHPot z=fUdctM($wm!2v&2}-tI`YJAQcwPFBR|#)b!7g5#8uMHC;p*nwzdu|(2Rk`XB&Tc4H~0d8w|4i3aH2M&F;sl)4xM{ zJlZd_x}_9U)-)&SKVQe&<1za|u@nd3w3tRg~R<{%hck}10=f8ovYJV9)zP^~6!egEO<5foG%p{jxH7-XxWZp(a zC%Q!aW|NqhxMdfk#KgomG16aNgS#ijpfyYtUKge&vvT+Rn=&&5-=t2rHve{Eeevh!x_7^W%I!CstpF*Q zCbg3PO;M=(hUuHn?Unvg{CZ1!U6{Ju!MJm4{u%Ot29uK?t-km$x|jKj^xe&!bvt`) zrG(?Bntj)~an-Cm)2GJNs^*;G$E!1L&zLLt=INcef(iQ8YgQP3y!xVG*|El7r?ys? z9o+nG-@HQIze4f7JGY+g?OcDVw(PCiJ}KF>%N9=dv&C)I_DRL+U9oVoUv1uZ#qiAC zO4j(ZYu}moT{wU0z+;ZTV(%hfJU_Qk@Rx2({e|f9@{(U#si#UuNGfHE6FZ z{;u=Ic-w!FzRx*qAHtWOy_CTCS8N&^_lxVd4LjKN*sinvW&7RxVD-_2%&h@$vVO~b zxSF)(y>~3fX=nBi;mI?1{}%e|wRk@N15lvF9t=Ny=aRz5(9F%*GW(*Y_33riiFs!* z)Q8@BQ+*)ZTR7XGVZT)Fyt54dvUIeshh0iL?oqQ{E&buD){XaU@oVoyHLt&A zGaD4Bo42&D591M`p7Me}FNe_0({e?fo8zXkCdJ~ywwcCgO;N0#iH9kbGf zLGhF;2X^Jnp9jNVAKU7<|5z{g-$k?Kzhr~j!LN_)ldie?>^#qd^~ZLBhU>0Y> zcz5{2)n5;NW&iu8lJ#HKmY){PpwPMpGWgb9=MPtJeKPtGzWC?^$pi6I&5G5U_G{&S zvwg5yar1k|__cR$vc#`-2PMZ_bF)8Ot=dxDw!ZDmy22k>1?ikMrYWG2^a;Dadwk(; zjXnS2YQPRl{fy%G*DgPMW^*C!x?auIXWYD?+$PJsPil=F^S>;fsdMFPOhd|I4~92` zMuQH1$^=D*E%)E1TJs;P&i(|YF|&AZV%C}aaJAU%42F7Bw(_`x;kxTCGW^ThQt1kc zvM|ti`gu@9uHBe>;ph#2P!2!pB6T3X*Q`8~q2Bb?ou!}zH2b#Mi=>?O%s*BeZpo{= zu(UMUK|J}g)PeY^+sB@ECm-3GeKp|nme_f zbr(;GJy?HC;?8F7TX%NYp5JBmLi|p(!~Tp+{`lT7H}?9_TRMLqtiA{uOE0PB-X|3e z>J5vjXEM}>zAOIgXum!E!Ro?1km|hp1L2SF?3Mnqd5`p;(9F%hnfFOOe`mYk{-HYM zA6a0{)z$Jfrr$vQgXH|@Oz~SQyuj&159HMJ;`3_1OlM|$f5|S|z5L?@rW~o%?Y0*xb1vt}ZM5uKLR~OpT@9 z^p?zA#y_Du&wmZSoOYe9=4z5GI7<~9f*>%nun*dAfE}Zl_-EvtQmN8+V$6lE<{$X4j^E3Ko^Iym zL(1aZ*0WUsk07_f=Pu_v% z@ywrF=6LV%M2kVcWJM|WnUN0Mf!tCA6 z6n440QO)bi!oIQ9hu*rg`GWqg^o8@MPCXdkYj!^YY=2eb`m(jvV!tAPO8&Weqcl(N zLjJ>ft##AhgVHakkV`-B2g-)?vOioscZ%u3`fc07-Z1=IWs`kheBZ5`nJsnhf>;yG7A;i>+2ji#y1LgY9hrV7foV#HvB|zAG+n)C;p` zuQ!ddSp~{dh83VR8EJ0+BI%J1`-gDXGuuE;0Y~a3vs-2_uJ1@+7@vK-b^W=uf7n6Z z&g6=p8y&CpV|CGdY4KlIL7puw10{EmbEcYkYyWsv^Y9tZUoo&uHArTs#DRFxuZPd^ z@3Y#zkL5%7<3p!nK+*IZR2l2GT?3U}HzJsStS(G^s{JASu~Km^Z!V}D%sqD$Bv&a5 z4w!kdAJ$~QmOOls;aBfFTcN)>dB?y7(!U3*xmWLQ*st~YRz6F7?38ymyVBoUHLTb3 zvbO*6>d@QFAFmb_eQvJX3NC$mO+jg6+P4o^Tdik5Sk0aNpSeEtR!lwf{p-Elf3v)U zf4n+0S05zH|6nzDx!J*R@oDX#tTpch!@sPU641c8YkDSEd~Afh4k*jyg0jc#yWAhH zx~9KmijO@59%kre{QC@)8&dN@d49M4!_{W}sSNd|dTZ*XK+UfRQ06>)j&{xbZzx}`?3rVgNniYpLRc1Ukbai z&1L$%W2p`MrF89XfRg3yo7-Hb?<@Mwdh6LX-HS`je=>q{qyF8Ps9SEguU&k0Y=&`L z^>!EW?vths`=x&0y2~D`Wj=jkI;e8oyY(w5zkZASk(Ga52o!V2!F7&&Izzqbw`=p+ z|E)T6^Ai8QTjqH@FVagnK7^<8fXe+UjUTHoK57Ps189u%n+!V|{@D4IYmk=^{iSj*>MIuDAnyJ8^!n6$3v3$p{& ztu-4M|Abav+n4`n_1PEaIDV`;nkIc9eyZUcyQcMg?_!$Q^IdD>`IjZLhL7>zsx3G7 za>dKux!DOao*iU-o$`-Y7j}GasCzf3Wj){8+44JBmsW3YH2d6pAij6;)8+^3-MU%L zKq+`{?&=KboajZTGoJc^aydK58Z+}e=jhbiQMaUSU%O~_Yn#h-!ySd{NEyftU7xU6g_6wL2ZbrJsZJg0VrWDJ_<3&yZXngjO*N>i0uH?L+RH+ z+2oCR`}$ik^FYmq%_gnu`-;EsyKw&0#s}-&w%_vLTAou2$`Zx9z**w%c8{%QI``S@x1KaI zKjtud_I;1pH=jRPZ#MI3?}PPbX71?>^;3upMVk43 zwXHWLEI))xcPpDU?7x+=wYuLD(u1*o@%&pI|KFz9{J(bYwRf=BP6w6q-)=Jgio7lU zWA&x9`^gP;)A&J6y)u5j3+F${!A#N0&Et7-{l-@t2m8~^pavmm7Ub<;#$Tm*b)3r$ z^6&n3+J6o-xOnY$q5F&Ux6UBP&d&rnw$h*Z$7Ej+Y zkfXT41=-HrX1#0E`Tu1le_X-#A$+#Y4#TKhS-06@n`XZ(Dh^iu1NrFUM=b>K4zha<;KCg~|y!1Q=44)6(&V^%n?6z2kg;t}c6V=g)%qTQ4{4zZG!@ zRFxh}n#co^YzKwy=KJFNqIT4>#Fy?Yez4xGb?atOidqLsePT6ROF*5!GcnR%imL_o zz54X-K>XC7kyeMpy|v#r?Y|YVW-X*0$o}`uO_qOI!BNrNKUVji-pE|PweV*pC=Ipd zuFgCSnpmmk2DKQ^s$M+$C;`+Q-JDm~si$|J|4(SF9k>v{+8x#``N$niUi%pl+TSXid{0aZ|nIK%KSD|zE?P`km-JNQRd=669*oUH)G*(p#*Zq;d9mio|NuXCdp#ZTS& zZ^8VhTS1Nn)fsGxp0*;H%(2dlS&OaK#l-vvMs)qC+m+J5Pp zt>^CUxR77+SM}G`KKFy+*{^pq*Kgfu0crt3Gs(6)+XCfpoH`H68N0zbV@3=pOXYsG z`4B$))~hUVfa+aXT3Xzw2lo13P#JG)4$c>fp!fjAYVNCpy@p2Xem;A!{?umf+iZUq z?OwkicSG)l^S7c7#OG$M1{Dfd!p<|-hrW}}mHsjtG&&4g$$3qW>))y^kx>W3Umv{7 z{tvd5)BamKZ0tUSOHZ%n0Od#4gYi?-n{!v6VBYjvWS>;g z_nbxZPlJ6W;SF;4hJAb=!dHW4GqX1Q;{ugl3r!pL-`erV{6qNcgs+kyla$&1WeKm* zWd_x!TiVyNX}@mVf6GEz1e7B8tJauCMBDyYeQACz|BqEi_kfZtxX<}b=tKDI2iGiW zwrbwl?YRHkS;=4E26!ni$d+bs83{@|2VaGOIvKL!`=r=FbM0HqDn5kIesN8u=IYZq zpjOW`y$@G2Qk_69In4HNRZsSH?i$mmxtt*9WQ*^Ux)ayB-fesM!_^mG1wL4BcJVF$ zk5#9A!Ik2ihpYAeg9?tPmmBwMy-x#m5+kBP{s#9S*Y4y0mnFRRzYxf%*R1=b*5(TT z36(s&_jVI#0xcetsqBpOfy(XdX1!}>O#iYjM?{PMSna!ImlTNH1j-9JcWN&z zE&lE(F1>rzkJWnXdH;m&)Zd(YVQG18?WXEzOP)WWlGl3=?%I^j2}%NgL0K~9oeYS5 z70kXT3t}rsABfLgbhR2(V}piUW}mUWeIe~7Q+)5Vd{9v2)m_LhdB1Ui{db+$tI9un zf60Dx57eiABk|$tu~U;DtUo20{kwU+Sr{8z{nkvc>&Jd+-<2@U1ub}zmUia`)g}Ac zYqoCOY6dF*&Fz0Uy}k8p%g(}u^LrB+>$he$Rg3*%H5Y%8{yGm-DeNWSeJme<@Dqtht)h4XOsjeuG-Dx879p$LFqH!}Blea@e}H59~mN zme_PqZC6;i16=M4f#MW2j`jMRR?XJZYN>s^-p^7WdSlDqybo9NN*+7eZ=d&Y_1xaaY@iV%lZN%@ib0d|n{+|C zK7uNv;>S+*tCPWPJ=+JXi?@qESpE6T*XxG%pc?SBBWwNEnY(Q{;^%^i=XpIY`*(iz z1(i^90zZUDFQ447U+es>!iTFrAG#ZUaXx5=z|)?l{kP8C{nxsFR}Ex@VDg8nl~0c~ z)S2dgzbYsTEM=@I zO*|g~Dz@IU|68>MG@ZI@jxDJ069pBq5o=a3f;8T3+|AFUUgwjNaC?{NS%{?743+AO&- zdGes}Wn=->v9+KY3AE@{oZCG8MS5-IgY{%p{M)rPpwxBS!VwfS zui2nO7jN%cHLU-3?HSv@tmMKu;5N)|z6Y!S9@^@-|6niU-!*@j{;m3w{=9wPt=(I> zeEO$3e+>r{RM5r_Xr)YJpmV`wT(pu8%QZc5Mx~T_SZL+#NJBa~w4E zzowoWl)yKDf?#iMbKTr(v0rE3Rv!p=KOKHBKG#i}8&pE>EN`xBt`_^nn|G&iS0E@& z=7v64zinpp_Ya}d<3Y*6a4Fk|@aS$$aFb!({ucYUMf(rLPX$lQO-+AmwLs4$4KzFz zJ$*f>eUNzH{Nq(K?Yp2M=s#7r?)={LZw)X1pQ~n@cNza!otySk^~dV9M`wbHuUI*$ zAFDsfHRm?#m7Q23f5YrW&~8iT>9=gTW1DvK?_&9$cR_WR;iX+%bF0gq z*!|8cz83oU)`Iz0&mRQ!t=B%gaQ@XBP%l3H_Ja9WLCsdP-*Q(B&)k{w{KER;?~c$e zn(2q|+c^cGCF6NZf2?+WdMq_QY99N)tl81=fho$I$%zI>;hx%rEC z&DOJP=WzVXn!Vd}%8ylBZd$7EyY=jw4Qu_@Qp;FS4FJlGa(6cu-vX^UD$@1_1@*f9 zjo=2@KQ~b1e7o*!|NU(Bi*(SCWAyZVR!~v&{sfYi!N0z}E^HrD{no7#@nAj2eQUPrzM0AUFYC3zK2Uo_ z=dVzFuB@6ksO*zAzm#@g`Qz1X1<#`%t-d6d8@(t#aOb~gTOx0%@4K}tM)^Z{^#1yX zt6g9J^8Ql1BmTkqZG7js|Afw*|96`5m(4~TKUS|je2WP*IcV3kUJR6DB5!N|Se?7E z;B#}G*)&igz4=S?da>r+`WM%qiKz!Qg4KRay|$kFUsm+38to6^w=d1h24$nxT60p$Bt2jX*M-*JFUdaMfyi92%^ z&bK{$AU;?2n%IxkM(e7#yX-$z`}s)t(zAEXFFXUU(%gTpUVA#RY5y&&HM*dPzr?Wb)u&icJ8!qygVj@Q*Mpn}D#NXO^ge{&K6R=O z6g-P_y}uOSum@RtO%61g@wa*Ztz8v$AQRT{{>aMx%LYnkpw9lb%4CqT?F^uD4m3CT z&Zc3#)f{=K(pBAeK}}H|--oODezX6%Y7hl#UBCX&1qz610^r2O{x_$N0aU8Id;|_t;7Um!Gc|1+)I@{kW@9H0`diTqN zONY4+SDUHTv(#_h`omcH$Lh6bbtOQ0@(yzR%aZ0@FAG-0`(U+MKgb#HKr_u!#nyT? zrq9aGeF*JtH3qf)%Jv=zPtM$LSz|hFo&AgOs9y)elV9FbzNjCT7xN-~r=|1$QobSjhw$v#m+e6z6Ejcn&s8(G z-*+FZ7K=`2so&b$8=L*%s>I!DhyBOCvj1HK3gjE0G0$G`6t7g%`eWBXwnT%>d!rNk zVD(1Oa>?ZM>lQUvpYim7QVM8S+78g9QmZs*9^+Bcm3WAS}OLL0~Ba(pmu8S?foA@yI&eN?Z0KVwATDb*5hybHCLap_kcRd-}baa zI~?2DAFl3Q%viH^B`B@+Mt}csRSmRpNJ{yAAE*q@yS<>h(_ISGe7m&GQT+7%1M#`K z=gxy-=<#j$58+Ee`=c`oODL<`DL}4h83W6 za`qhmzFV_wo(cZBx^3%ghCf%Y9n0wlB^tR}mU>X5gXPwna_9K17WN<`p8fLvlI?At z=RO-$Fs;4wTQ6fXXf5S2Hq)m4x3+Bs4Z^<`0gX6-<_fQs#r#;+TM0@+y3;Oj{L8u> zH4~JLk5z+g$OUaVoC|8vCjAGcxVLxCvO&wE@SnIcL{rDJ^jE~BIf*90N zUDf+t4wTBw^PFej{rw@d+t~z^WI-F{Zfus=cWb99A1r**u3P-d+P(qQ$+&lp(`X#eFqJ)K6?jhCh@*ho+ID1KQ->wa2Tpz-h+Joj#T+{B0@7s0a&L5$_VtMh0 z!o_#mf+pU|-429{x4zC_a`qBGRQ+w&)aw>Cr4PT^)s!ZFl>=2p*6BZ9EdtL;R(OE| z7qltkVlU(0MN5srJNXvgPuMSAQ~K~4cg@!F*9`k^?at?nkBzto>e8oQ2MJ~~@4L0T zSbX0t@pt=N?7Np5HtpB?zSB_XZ`JYO2dnp5cRyUc7qtBP-dfKeS@AcwGRANHp$D=G z6f6)kqd}ukx%qDoJXr5_JK^?%?x{;b)f{*a+dC%cdYTAnBT$R4ND@>eWPnPC`=C$^@pxySq~vQp?zXyCy+F$?a4CQ!oqK@AuXFXMgldcH6|(2x|U z&@^kSW2xUN+aq5Ht`y|KY4#zwQUGVxY(sN!TH9<3Dy7f#f-9XoaOpbxev_Gbp8xFG z@r&+X*qQDQIzus>eS6%4)n@mqSwQV232o~QbGd6uBW{#~rnKTgP3)WRx#MN4cAtN^ zx_K(7g<=L?b1iXUeR**kc%FxMTG)rHi3KH%b$Pyr!r51YhHSy3Mo=cGCeED$N^jYZ zFM^6t&?fWJGj}9-bHCXh*vwg6E??;d8tuH*2br{sAvDpe){rWrPH@<^f&L_t{%RB_a2KscR#%;c>m;6P5vs0FIQileA@0W zsXY0=Q>gECn`<-op4xwE(YZtGKW*aM*ijjKBtF%3+SQ}$({9E$F{#$(W&Gr9Y z|9bM_xb?j+`}Y6u{r8>!)BT+H=GB|?&-YJ@Kfg@;Py5Z2H!psAll4C9|AV6UwORJo zmUG`#DV6*Gx8J?hF0Hz{db9Zb{a(7&`)B4^*jrgvSO2{FYv$3P?eq2h?(N$>%Qn_# z_DS=;^Xd0v=Et0in>+7MVP(-q``LdVzufuncRb(u`}^(fZ_obq?^RCa*YmIQ_C?3- zvERAJ#?pTF$<6PliJxwspPsM(?fklF?&s5wi=Te_=1)c0kG%hn-hTS|=2gwM`fs1# z9RBp^(;pq%`nrOx^+jsIv)`WQOZB>ZH~jsQ)u%r{UOoSt{=g9cg+D@0|_g}AWv^H-d|A&7q6NAJ%rpBsNhZ~F4(!TRc_y*mou zq|JIa+wHf3;7_lU(~kXrdG}}a|1kBE!kXGbHD~?H#qQ6Yj+uP=A1N2-t9x1b`19q< zpWFMcudJvmD>2%8_v!W5{J-4Z-LSX#|JZ1+oc5D9f4tJp|Kg_9m_?r3VgYdS|LE!dbI(4#IUSy#c7M;0Z%3tH z{y4kZWJTHcqzTWDT{*k`@av=Rm#&<>|HreVv;SAvNyqQ0wESxAb^Pv|-S5867Vnnd z_cHGMzTXeOmapF@pCVOT_37#A>H2Yf>r=Npy#4U$?Dc6zdrZ!?{a4+ecK`pr-_K^7 zq>**^pEEK z-FDU!7w69O+k55on{Ow@(z-8y{=aXU@1?cpCZ66hBlYiQ+w=NQQffYZd6M(~@V|%s zzw@VWj<4s{kDEW|e90vHdJD@buDY}D&RKt1L@%7ZSEeqQz5diDTftL(>F>YWpLrs2 zWB#%!zjjoW7uNj^>uaBX@8rd${QrOX|Gxb9`0>jt4c=b++ubZ&`RdX0oBVr{tz5tJ zuYV$PA@AGr-OKov9gg%UsXe)Dw@v;2IdkWowwb=^-n=?}`}KbJPAgpg!lyUwx4mD> z-E=eI7n5vCD!1OTpY`pL$;5Q?*&kkB*!Fp#zaE@ltA^BFW^ziAIj|nd;DVx%FOnv%w`DM%=e(z3e zJKr$n4E`#O2@pg$2JY`}sz-&PaP%#9!0SmLhihcwNN_d-@ihclopU>6Po3 zCqKSW$oK~3bx!aI<#}o_p4u){Ck`@f8CE8 z{?qNQ3GcUj_bVrJ{=C!k|CZM|U0yraaPskW)1~FBzdd~Pr(eD3_LsoT1hA zZ@n&GzL!JHi1}y3e(7(Qttt*#-T3&H`|r1-bMM=|)pJfsY!G&y^Eb@=Lfo{ImJ^=( zZYwX{SML1&zFO1&UoXGZO!^=8U!QmCU%~YM8?3y)E!N}snf_SrQg#0|`-&Aa<*efD zOEy?ua(pUv$(jAK2fMkl>>at2wuhZBd$6yb_~K8&rBeRxtNOo#+V@;}XmTa-i~rWu z^)hSz6`K4#Z}iv8-#1zI*2X+5yIEhJEzbIyeW|5i;&q19YmGb`Ro~yM>t+1@7jOAh zdM5aCg!{j}(=J!*hQHss<^9%_HBU{hUD|)W=xf~RtJS*8zenBMbG=9^d*|Q1eapXF z#qGWR@k`wCp3*rp&b)B)ygSLukTD=`f_rml=1$^MeVu<^3n9j+p+drWv+a) zJ#CWq^7`9)D3=v$nV_xAf0`t8iocT)WQ)_u0)nwkH4Bo%wI7*f0N=@fEuL@r(U$_TbwG zclCcs@knm_y>Iy!4||ua)0?e;WPWd(^Va!R%_t+lWQyJ$$)hI`e53{x?2+C2FR|mI-RC^_OQF zIL!T5w%PrXtkvW>)_p%ijbGTsz7lz%B6n-1%&eJDN~LtITe#X;KPRcRTTPyJ%wh3N z&v~+!j>%RY){j$fZ}U7hiQD+(v@$jKGBrz+m0o&=w$qmA?KGHd^;q24a+C4OscIRQ z-GA@de($`_RJF$G)i5e^1D)4Mx+vCNtN) z)b$cJpPcM2Y*%=6f#?_8G_~Vi!fBN}zJ0R3Gn_1*`FjcPm7gV}?duihTlD5m^{KmI zeB6s=)c$^!zbF{mp6IpmX{Wu-w)Y9;HZ%I>{VaZDy-R*v2*Q<&}^?Q%?#05DVSI@u!31o`<~r zl()3F``St=FDseJaufNEEpcBXa(>CKoa;8B)9kd$Ud`JqduzGZw3j?SYo5Ni;5GO7 z>g`{oGKA*84|e?OxxRIk&@{e1OSG0A&a2E2xwvF*?sb>RyCzI&jNSDjr`>E;%kw3D zYKoRG7eBjf7k&1dn{sVSgSF zVblxR`@a>fUIc!=XqE9(LUs#>8~fRBr=?}T{D?^XwCL8#=4pQHXLnAy+RL}=-IF@m zEe@@g0Z%uZSY?zo_(dML%eU>tf~A)oi}jY?d!N23nEfo@=4h)IuQpEQo3(P^)jO9Q zHy=LsV!_Ra`z|_eK79DLRYqCG9%uGg{;DHBeOE)ZX@Xl(!S?qdW zAKF@FY&(47DEBR(E3{HEiD{B&M=Ei<@+HVlizPb^@>SP$=5~6%x8O0~ciO$$CjI*ln^2)OVXF?uR;6EZxt4c6w(5Cpoqs9E zvd_9JLr%~BUcKjeaasTS;L;OZYhUEm8f!*oe}5iUTfFV;|H|9OrHiw3f2@*w^M21# z)3;yB?`7~V6aSig@9q0N_k(xcyst?z#?{O7lII!E`d zrQvEj|8JApV|cecYwEq%mGk{(^7y^#^=4`-Y_{`TyyxR?yO8;N4lD1ue1B(Z$klt> zUr#dM^|<%juEXj3oG0)3*kgC>{?62S*RKEUj9M~h-RvmWuiGELxze0{`1;SCU+=s+ z|NhmTv;Y1V)t$4xc4+?1(~-9KPHR3FKUBIQ?wr%q?ajaU%(2|JzR8|9yPC zXHMysxN}V6p_LW$ryC#FjVRz0Y`?MZYf%`x_1-x*b9saHmR>a2>^$XK%8jXo)A+v@ zwduy4OZp$DuRg1^l`VvAablYLS3O?i;Q6IG?=Bcj&H4Sk(sJ{kZPSgTqx934rM+Ex z>B*0Uap!g%Jsl}?=k?Q+8C_39-4-XN9S7;M4x2TlJY&Wy4%;6lyqkZe@NWKfMk?*^ z_oaz`Un2h06c$xg6p`C*ICHmExTi~(W;?~wah|R-Ilw_d)2~r_LSaLcQ~x}yqz5CY1zptB@&}rx>&2+B6a)A z=TCx~$Mw*IK3r)*29uj+ikw+;?Q(Cu5-(UBDfpqH_}kq{5l->9S{FxTxN6ISKeoa=r_RH9N&BMtm z*Jg*DRF~J>cy7*-Urz*uUgxwQ`L$&C4f`G5ad-Xe|KGWkRWajsa;n|`ZqL<@E=Lt| zYG21}mlDqZ>FYGf%=w$e;&6|mv=iIer{_d0xh|CEA(VDP{$0UN&hOlwhj`>w6Wdf0 z+xjONI8QP-tjGEJT*|BoDrY_ff))PI;51g@G@hX{@5%g#&Kc3k`PYj5gwj0HU$}d8 zKCE}};+gO0#bbWaJTY`p#dDE&H_G^DxSX)Fd#7p>bL?^gQ~k$6{b!pbn>YM@nUK2Y zwtxPqit?{pKNo$!9O+?nZ{7a4lRjQ6S9r{tvZtX(e8NX2qd13So7H;}asFfxv(C;p zQy?Fh1-T8hyB_Dj^Sh=a^Y+U7*W;?ys z^7b#ry)kOf^CipKn=QDXMak*Te(8HUt(`SkK2~x^*tgSHH)o!CmaH=)b@s7bd$)Z$ zw@vb@qxXGz%43#XeQ9&1?9|`#$p>{VCuw~L$zJZ#;DIn8Ufz5% zOP~M!)`YBx!y8Y|*PGnD&!#5F!BOp&*F@3pYhFY%ev+>Hr}NUL$gtY(`$OH^wtpjo zs-Jv%QTbl})PI>bb}M6!#QuHr*yY=gl}f)KGP`_xd;G0>=bNHKYw{+k7M>S*XK`81 zfU~kH-J)5idn;?W-N#x+-tx6a+gnUdd@lES`r+BWzrU9k9sg8yA>94Bv3AKQZaNuJ+<(GqYum<+{4Dt$5G5{siBr+l+rwg9}&gY>8(4 zb7=YwgUM|(Rl?`|vD(A=V0yf_o^|ilL(6wOiQ&>avm{kb*Eo||+Q( z&n;)L@LNCEWk;q4EORbcnlN=q_!O4?Q+}UmS)V);l)ZnIew)b|zx>JTDZg*28sEI1 zxkm4&l`2@^S1CuGrssMM{u!OWtyuO?VL$VvVdjhLmI-RVO8I7-Jm}}TOl9vPl^;t{ z(NQC(p9g&)S~hF8*+!v7j z{&wYW>J*Qd?f)A_Kzr6ZcV^wr~>>%VGuSOu#a zU3ZsXeC|r;g|8QnuP`oED&2c$;ki4RS?h&2zJ9v+YSWsV-d;z;R^65Kp893wRJ+Lw zr={@!zU6-W{I)D7`Gtih^H&whn19cfx$S?{|B^+@#I<>o)|Z_Zc^7eue@2VV-sm&? zKZe?PJl>JK)5hb>f0laJ&l&Ztf3)(RzC5+GZpMuHvPWZ+_Qg!&?_P9I>)CIcyKfZU zoVt9L&*Z<6l%c)#hNQZ(4R?}e+yB{I`ue=cZ5E_P6?gteQxQ4prVyK zuEa1+&zPSFEA5{Y9Z5Zzx_n0bWWyNY^RcKXSF+_#g4&Vd>!<(fhMXvQEn7cp#{HU2 zGw#=<8Sek9^RMghezp3evtM`1`|I6*JMHtyQ)^AN#jR!UXXWdD_qT636P~@({_Vl_ ziSx?ul=W8?lpB1aAHOR3YX_IJe0cPW$E&z()&3XH zo%!=k*r(_29p~QKF8X|N`StBLYg23-qVDK!^V=D-+VYNcd+qUa6&|&-|2$T`RyO^} zE92ACzF*bbX}|f+xm&91UY$|So_=R$E*G{u#ard@aS^Sb z9bT$zI}UJn@@-6*-II~kXR{)#vpep`k0jOk0c%s-cTSpp>DS3~MFBaQ;h#9adcD(* z2)fr-_^JP1;6|01O?<0#MZM)BH>HF&Kk1vLdVHIK*CvBp5s_b87O8#@(cO7aU`OoM zC&65abv1V<#kP8zdEL9C=ev1#k*CYYqOH!`rnUZDaY?m*Wo%Kf;@6vxy%O#<3Qqmo zFY+S7a9_W1vHyy)=i=)BYwOCk)>~QM*neZ@Dh-}jk)O`i&Y3VbT|O}O@b%*gY}K)` zkGI7}Xy>iza>$s-dn#+q>r9!Mzj!OR{@?IQO8ToI2XlP*^^Wat4n-9vhgLau=VV0o z?pU;Z<*X0agJYA+|GEWwZ40@+!<&6l?VlB|q`DL*$lhJf{I_*=_ML^ysmE`=eI-@? z(xEa#J~UQ2TD0Se(UP<7uN*Fa{L_9KOi+^PGp~m{-);?V2`ybn$0LlL?S?&2S;j?VMsQum0|66u2 zihPWyHJ6w$|MrrCXlZj@_K3tXXS+7(>T~Y1M9Pv~?>&AKH2Zo{W^@sc|K{VfL?&I) zX}{V0z%)-h{;Tl4uHQR?%JO?S?^%6NV4orNu5b14iSqAz@?#b!-^mOL*nNMR#SUv9 zF8+i3dxayC&8Iwm!>HE!?AVg;36q;z_3lPZ_&WK4eDIrVYo|<?ACjpas9+i9&%Hc7qefKpSI%jN52z$YC@{coZDgf^LA1CojVhIXGe?c z?p4lvXHesEC&tTbmwMj28^_MB?Vk3oXZGwXKkj}LTwA)!wk;quIBKTeqex?~mYB?wYYuV&-e7#qC|@Nx6~bH{C^| zp4^D=zE;q6&2G`P{+O%nx!(jYt+-;a$*6Ja#i&E44$rlF^uSQ8d1L>YwW`*&N3tXW z-}t${4w-!Ol)DW7+|akltNWkL=PQ_4pV!j;=RMD(q>VmSccq>rwNKv>s9*T`CZp)* zSO1p$x4xh=r|J2fBiUcyZ7VBpZ@ytA`To05e&Limol7dxKmDFB?Ok{{^v{e5hg1Up zzC9{(@1_2|neXa^Lw;mNbh&O$UbuTxs`kqdWhd?}P85-6TCn5wO5Ybpa!U>JRIf%a zeP?*3Gy2Hstn#BfO#X>xM( zbd4Y0!4l`3UcKvC61(WGzP$APT`pVW?Hsn-cia%DpXDw(EW19tIs2wT#^)Q0vny@p zG9Kr*U^WwoH$P^d_UCcG&%M*D{|k1U-Sg{=#BA3Zj$_aG{C;IB%syl%$N069{dCm{ zlSg@3I{9A7{;xmo>%4QaMb2nyYT5CazOylX@8_S6o&C_U*z#XR&Wt~T4-7tCVx4|z zM*200+3bIE>o40F%LZ{Gd#+uxHPd)`+4U~I+b3bF@&d~VZ$JnO)J%6h~E;#15q1l4n zLTvxka~%3t3Vo80zQC4s`nY7{D_x`H+UVej*7lsMtK?+W_bI#B1 ztN8MF`}s++pOsU89Y63q<@ZnB>De30W?eh>_qp>W=REJJZ{Gi(={0ptOw;bzbzF~k zXoVIfXbU~t`s?}@{nB%C|0PqZer5f$5!%PLqTXkcUahIT^85Sp>;7?mva2<%mwOrC zeBEBHar(Yl{TEqHru-EyY4ksS_oTh~2S2%g`$`($pI^Upf9+3`?OPjVm1^d#K!rl@Lt|Czm0A5>5OuS`%CYxOD_5znY;7+^9oSGU#?G(vO+76B zoM+*z=M&j*=m^Jsd8L};&+9xI3ie&K|8di4>fy!CQ~!UmD*w@8Qox($`)`#g7enH? z@2~H)F0*+rKZD_ZsMLux4dz5U$Uk6T*Rr0y>)e*W=8pjG)i zQMc!D?6&`B{>|9QTYPU->hsdH%LiW9dQX0HFDRmBlhXbF5__%AuZi2sSM{%W`k_sU z=b}wt?m3q$RZ*LeIq7~hm-h9mH6J>6eO~@}=2L!lliyeGzky8izg&>}*)y-Ey6Eff z)7^*f>;5;XJmIp^)^2~r{`#-rdH#Mmq zgVoAUJ-fFJGRN=u-{3L-=EIl&o<3P+Bw5_I{yg7$zm~|lt?$wc|2=%(J$d{4b!q*np(&GXacr-@I0p8oRZ z=jPRaCvQF(vsGW{K>PgVyVu|I44?k|c)0!Bc%93Cp8B5S_y4x^{LPC$AAYS~c=6vC zyOrIKCtp5UZzC%dU$fr7_M;AO*%pzi4A;9?=cn1vjoE9xf1lU+xDy}C3MXZJt|@!m zcr7~Zn#$>&U#9+aZk>A4o2Q??l)QSHQpsu9ch~1~?a66of^b2RMsrmide2%YvP3?pyTZMn>$e+`{bYXUW z?Pizzf9ht`{?DrU-2U#XLG{PK&hev1M$N&A1rdGb^UEIE( z{Wn(^UfcVp|K|R^6*oVpw$=ZC_w~cy@0-Kdr|a+g`);f&*ON0+)~G_yTzMr%$Mcula14_)Azmm=cu{G5v-&^yss77}&?|nY~`#xcpreCs< z{x|*4tlIy--_6dyG~+J+C$06DUBuV#``v$C|KHc|`9bXa>%aQipOAmn?6Y}xy|KZv zJx?Faes^^H`SjZFx!>12SAClL<%`wbVxN zhrb`*b@__3eaU@~`S<;0Z?G?85>ZdDmjA|If2Ur%=)(0*(^VTjx<3@$Kk@ayuP?9O z`}C*e{ij#YFF(z9Df#g=KUGkE?*9_Y-@iUQDiNAfw|9G<=l=aO#6Ev|lkxsfMBh5& z$Yqx|Uw&pg>!jhp`m{{l{CV@1>C@_eDeV6GO#Jrm)63sa ze>ZzBvD!1^Ui0?oOxu?s_fwd@{Q0u-qtu*}J4-)?W!ElW*8TLK%8Fc@UEfS9j=pGqrVGF#gR z?fSl~<;+PJ*PUN0{u}6iKfPMm^5*g#Yv$kc{rs!2vh>Hh^qZ=er_J8+$|YIDrnI1B z-yWOapS=Dl@jQHfb8CmCxUjm#uC1K&{r^wcxNN^1m+_1fwY6r|`~N>KdVg(G{QevN zzd!zzzFV(+-JHYarw_}2Hw(M-EB@s)lPg(FoAu4v_U1C|yqWBOUvK?3%a3>7-K?oN zty3~J)<65hr(a2@ySb&8?OuNRWh~!!{pp*pd`r0BblTP2#xpaE@so>N9cNHIf ze*WE`;=;|!+rFom9l5sd%>C}Kf1b{;tF%9Avh4EXFMs|Vf6ZV0zLi11_5OwJ=jU~; zNS%I4e1E-i)776}R~D@H{55Ou?fo_7rn0h|oo{-CcXr!We*E;?eDa1%dnLcM=<3Ju zf9lWQ{eIu%GgCC@P(s+Ezmq$;sAb;9hUA8YF?8c$%Q{sK!*BKw#tsVV~ zE41qC@zd+~Pn#UCQL;5=;Fmp0?-G-Rtj~Aq*528u5We^F-&-uR za^@GktM^x2uf6b(eCrB#a}~=dzqG4=SAXu-_tCFEEjDTY`~PJ(>r;Al`1$(%`1b!Q znSI>$+x!6W+27{ttnQ9~V_$#voBVz|gTH6Q|8^g(y8b`u>CdC5K6g)jF0Ot4e$&+F zZdtq4`6e0XzyDPv%c|L(_cQF;{a%);oqG=LQ11Ppiq{%!~fVUh?JS`)LCA9*bCB@_TnA?Gsni?Rj?!U)oLWcpCqb|G1`= zcB|LY9ZN-AOiCxr^Obvh^6!l$BBx)*pFBAIz}@hG50}io&iQltNwMGDWjYt9ESPEJ z5?rKK@#VMXgw$X2Gs8F=_hp91s&f2N`^)&`@XPv1+C^1Lj%U;xeun(gYCNr;@smY| ze@)HSS6Ygv)NOvYsLkK-UP!I3m*;X3YGh-J*I0r&Tm~>@N{Ey%ck92EQ{-$ zw{o?6FTEPn;o0?W#i`KnlS}7k?OggO^=e76scrPu)hrG{2b%f~eDf{;ma-Zt{P#-s z+3Yp-{Hn~bt0vP$^d>%Hew8%!dwS53Jf?u_uUFZ{BxWvQm{c{(ajw`ylin#iV*Mwt zS)LxOyHmu)D=6;N@#uO-ruyaS!Yq-8?r1HaeflN;(=RSF|5@2id$n(B@cGo;e04GF zwT-@CD?F&nc9y+m%gcr9ZcI0C|Ml|c&vq5gb9(F2{-^N&toES=uH z=_gP8`jS+sTD0iS=QlSOA9{Cf%{7+0zJ)UX*EmKwO@F&Ea`iEjt!qW%_n&#^AY}Z@ zSEBRvMd8V_|9yKSQ~u)r@9FL8>hm4{?)U$%-yKl-*S>$FPW{FI|4)7WKl|&%EC0pc z+ZPC}of|!Q+11+p6(5tjE5C_9KA?ZBF}{a+zXbcgc|FW89YPKt(6Q6A4x0Adw{DSl z#htl|m8a(w)Sg^elOB~6XHwo7yRunUDZJ_n-$d?>ulQDaS$}Wb`G1eo%$@6h?+=xH zogeUTa`Kl)hwnA!w4A>D_jGyvy&w12tTKCC|M}JQANTjC{mj4p%OfbEd{)e;BH4eCK20f3MB^-%t9P!kP9~zv(_4#rwZ`zyABA`sa^oM0K_net4TX<>lq#$mNrd zW?x;PIO+06W9!{@`tAOc%KfGXccj&MHrz{*xo!VwzSN?fU7@pC7K?;WJ7V5+?ppuf zU-s+Gn|?gG%Qvn4cag>k`TxJwte$(Ml}=6jcr`peS0#Gcenq*u8Mc2n#QgJke>rmf zW&fF5{{OsxKCRMV+5VS*?B_T6FPE*^uxFOaHEqEgY3tk9&HuZF>x0$oZBI+&?%&|4 z{JZ+I{PgtI^7}niECd9^cZ7;no8Gm5p1gT=bVlDx z|ChX%4{!gcH`jRP>DT=7Pa^jHIXlfHc;Sg@*OpILpZwL?-Y)3%HkqrT58m*niz^B3 zx3&J6|J-uUqD}ke#s0tlj(hGR;~jo4jV~u|+ju3fzxiuLmz{83soBRhwz4z!`^Y?e z^Y-4!o9(Z)|DL|qax3<~?b7D2RW;w<81~;kqLlx~ytH(8sQGy-jvdMNb(NOC^CbS| z=5x&v)7w^4Z)v^5BipI(PsoaopPsz3GCb$~G)YQrepTcC4I%gS&btKe^4i$Tvg2g@ zdiAtYJ*^oW+`?Cd&;Ne-bjzX3Gve1qT%9@d;;Yj>?XOL{q`2O{Pp*zE_B@bcJfWjM%~!8@dm!>YER||$(UL1`xCk3yZy&$|9`*y)PKob z`(5_g`4d^Sj{lUOzI^lg>Ge@^U0>ErKJt3%4VR)nf6{(kkgvNJZGL0Ftug=G8O=IN zW~Ya54?cOSZZ&(^g8OejG2Tx-%C&9M9F^9qCUqOP|Jg73fA!4w^WQPGjW}*FJZzeZKzcwc^P>uad=ojhCy?NC* zkn7UL(ogDv+RG|-ly82%+In7b_cH%=R+hH))kdl!|LQ#tUa8hMx4yJ{-v86T+HT)f zS$u!*U7zy1H_y(OGns9Fch=d-Dgu8#q}|DWS5_7uFZFz!)`deh$ziCk+)tU-_3;ydo?NQS=b^kk=v(&j{-V@P(?A<3OKGL}Cc5UCq z6f>(zrMV))(^sWk&I-=|RUNo8WqN$pVm)E`1`*hpq>BfC_7WMVcb5^P(b)62& z+3}=5{%O37oApOXl@t-Tb%e^}CiDHF9VL z`#pOZBCa%7{rBs4KQ9@-wHHjXVhyf*GTVu{{7jD36~A)^TWX(t33}M_J1ygQqo_zv_Koggs9e>C1`*KXJaLcQR$tny2>l5lJ;O zeD=9lXUTY)=h|rA`cwb0c3F@>(T=~FscH{AqLT#Y+xq|4Hn*Q`dsX(`{3zQp;jEfz zZo6V+IsTiRUL)##xcO&vm(Vi%hr!S7efQ?wo3riKPea2~=4C%L=ltBc@B0@$_47F! zKK6z`$oYBs&CC3J@vAwT(l`H!GZA9n!6$kFYPF{ zn-kZ)&7`*f=H>c%zVCDP^;W0+@~hr7#bw{UZ_iIZy;{F^|AH@@4WFg`*cw%Q&3{gg zSZ#d$`u?cR(Q^Nb_3mWyzmMAfvTyQi`(@|u@V@s`3%+T8%Gc<~v#dYuol|xA>#r~= z%yHcAH~+Nyz57Zv(?j=I$?)^5Ex&d1-PTY0Bl-VZto=Fp=I71nnMU7r4lJJ>t{)mC zI`7AqpVQ0Y*Z!)UcByjSU9D=Xy*K^EpND&IS+(Vh@Y;Qn_m+66PrmKDWwGbI_@6@J z_xJqxw_9I7|Lf05g zw=Cqh1v~O}*vGz|`(fVd;G{`Kd0f_~vd{k!KQZ6-$%h@5LN)cLqyLJYmn+)x=GFTj zVf9Zpx64>t|IRl1J^8ZdzyFJWTi-8S3*&iwy;W$vax-&YTw-1oelaj5(Dt%F*>0-uCVv`;aU*E{EWckaPOs-(#2aoM;|ss(xC$X;O)~?_42`;Q!&zZ&%Ow_or-ST!7`m$&D$dFT$NJ z<}b_LQ@<^_M)=y+*zzgwT$1Xx|9@Cyt~#yWYGQKQtf!~mwe9~}^h;^wuX9DNYh{;Q zQC8pk>5E{V->cQ0k@0HoSwdICCp~@Zcd1gf#MazE3l6u%F7g%=n|>t=Y}w{Z}p}{7~{gmv?1L?)t5o z95!d`SJ#M~+Z@Wa^On@>2`c;%8(yY9U*jJ(yE;1Ed|sTo)Zfcl4YHRmP7}YxE|62k z;k@bdy?MFwSDdVR>~r&@Q#pUNa==>VReMEBD+_llXY&75tFrvky}667u3EhO(~5~b z%h=Q1Guo_KR?pt3$CvNAyWn)yk1O}r&dxiTyqYopbc(y%lS{k*y}8vQ@MN1=V#~&p zf~$m%{rvcG%Jlhmw_=@Uo(TDsI&XRP!p)m!|0%1w{=8&I>+Rg95k+-R*4_G2cJ%4D zGiR(*qBpPx=$+&1Pxad#zNRP2;MLQ~yT2~oeLPljUC_KA!9Hm(AMV}o_Kv~%XU}e` z*{(jOExX(1-mS)c7uVeQ<@faO`xdwF7q&;`?Fo&md6Vs%UozXN{99;^ROhL+DyzyS zzIe6J#PZwvsYiK*OwZfN_kMb`xbur3i@y1ZS91C7 zMhbcR&t2!qn035%j(YB%>5CHTZ7tXA`~UEE;`^(QdNrxg}2Ster~4uIYO{p4UgzSz0dF*I$1>n4#GIZ|bU}J5&WCTvi?ad-?F|%TEr+ zWvUykuDkL3-PP{t`9JPI-1;kS`MY^{!X#3*P4_%?@7~)Qd+OQMzPiaqI;+pluRbql)O&T(#O38PHOhrg?)@q&=K258QNHyz zWV`cCPo!`^^?nnix#l%f{tm0_y&I;ax& z=HK|UVCDTcKW^&i&$I1QT)Xe1TRp4L4;`E8viLC01%CghoN7s(=~Wyox@B(rf!LP4 z5B;7WQfLic#?jJVvSiD~Ene$`)=lZ$z5m=)VT&@Yyy$BsUq6`cEshNTULpT3`sQ}A z?;9iU;$olU0_wuroVxLSrus<)!;a%j4@b9|*+sgi~Si85l{QCFb zO!6BJ=D+{=EUn-C>}L1*+rGNz6>q=HZ=ZBS_V*{o!*R9=26nL(ZwO*|7Qh>C>k*rG7kkeslY8ar?OVbN}A{x_eXWnq6g{ z|9So8nUkt)pPIjL*nFD*^x?^mPs-}L-}0^bYrk*zu3sO%zOVaU_y5V4)tfJ`zmyR_ zH-69GyJvUo*WRRa`}Cvt_u}_Wtq;8!{(jxP`S(;}YcAT)<_%u+_}`nq|6a0)ZdB3I z=YQR-e>394KA}0~Y45KEyu9glIVAPMp?U z|Ltzh|Dv+3e=dif`a46n-)|YmyXTYt$L_dz`}N-`^+pF5oCwlx zfA7a<%AJ~fQ~KU}`BySC<2FU_T`;@+cleLL{(aMa&)~cNf6uP>wO#5r_V2TrzoKNu zv|m#sEq*`T{@7wth=bD6lUGeuCO&sv9{y{|yEv8hKPiu zZ)GZH|K0vuJw4ub_s@U&%l5|#n3Poh{kFEo_N7Ap?K1uI-!~<-mM#1E{r{)sv;V(H zh`N87$y31I?yZa6^P@liJ>0!MO+T+`&bs9f5^Ik?|1~Mt=)id?**(=ueY+Ejr8C&G z6&<#{U$GY`SpwA_y5?gpXOixW37zD=X9gXhihhib(DJXtT;J7?q6p8rfv78v>6o7 z>*Ja`IiO4`f8y-OGfy|m`d^g#Re9;woC_-=DrGDMDn(`X)hX}V$r(6v+ryV4*^4%~ zY6={Y%UXSY%Dpc=rk?7WyP7Y|&%E(>Cfj`f<0sT)PhOZVZWAM?o4@Z(R@L@)Wos4I zJ8M6bnDt*@UHn$%Y0X^~-NI$QpHFRm^MASe1k0LrQ_QOW?|BvU|LTW|RazU$OA9|K zI0G!jqe<1*PQA{(BwuZHvy~(~~dHKl@>Q(28vv9`Rp4Wb^dHybg6A z-)WO-*64PhnR3$qV&tw@(_i<0s$ZwSJ}my2i+F5&>^z6FH~&p6X#X;oUv2uopBwj` z%JMBtSa+Fm-sh8kdRO@;DDW?zvWr{n%M{JpUF(mVX_q)1nI-o2VTqiup2^%T(@%d7 zHk&zT%jfj->FV((8SNUqH5qQQU$nm#Es?YT_WWO~Z@xcYKTGWGmN&sp7oI$x*t_lB zY`bNQDF-FLxw>|Af1cm+=+j;s5VHQEz%W@8w26^~$KdJmOnoF_2JdCU9r`?!vP_706y{C*pJjqepf^QxBTdBof zAKs~TNWb>mG2Z-LJ0z`2|Gl>V+Fk$uyL#Cp&!E{iPI^hsv-&&Vqt4RWGM3SL->djq zUGEpaCW(GAec#GmDC%#g`|tJk_m^(Y-r@Plsjf8r(9wg~w6dG7qty);Ip`fcLm zwexJOZ0zcuBgFflK8^6%zf;nHsy1t$f&)O)>+u-#&NDtT2|=^nwe8&_T5W)t-H zMTyX=zSQmaysk#-OHOSHI};Sr-(9=6-mLX(%$;pd>dtYzJAN$xe%HN!Z>^ZB^>b|^ zldTW!*e-D^?@=s0;odDrIlXQGnkf0=d8 zW-Zyf@IEuUr=#jCYp<}oTGihKA5ZO<%Ab0u?Dp;{$LiO3-zX2Q3kpAZeEX*z{u54K z?r-05r~KQu-J$vJ=j!)=6O+61`psRxPp<@3>K`1jf8PGnNB(GeaBYeCx7~8L-``5J z_Wd39;BNHX*+oW6=I*ugyxwzMW$T+?^LBp1lZdH%aob2C-^%jP;AZ?m?$`L-!) z@3|_a|C>1t%QY%iUlH4ye1GlzpDnYR`}t?s{ZL){Z2FX0@j+SJ0*mJU-R*qo_R<6Q zKd+k|Y-3mV&12U8NuNG@pE|F;{LdQsusO5#S4=vuZn$>;S(EwgD&PK0UH;`y!L&7w z+RrnMgY}OTe|a|5|Iwcx*CyNXzR1~Wvun@EsPak&v-i)#%vaki*vj~N`O;r+Pd4ul zc)tCZe2(3}vj2|~{=fYsJgK7Wnel?y`5j00luz%NVHL`9uKVx&Zy_Hm>&mYGwfp=; z%{60nMg8v2cPH<2em2*)QsuR2#UkyOIzMkMbLpLIJU^~z{i~vix+*Kt!&`zboZVPf zG9y)!`N>VIUoZCYtv~OlZhdyvtMv17HtqW5#W!MCs#LQ-cel^?{TK1PVoCJ2H4DGq zz9&8Z*(cj~eqVMd9=1I;eR;O*#}9Vgr}{+tR+gNZ?BBnq_@^-ciMbyxzMa49K>akE zp6VhaIkSnkZ*Q(>So(xfvB~<9bsE3XR$GIjOR51jI`xmXslPOqJZU$*^-bRA8;807 z{Ym}gVi$ex#PiegJJTzt_rHDgPiK<)e52XzOATXeZP=gAisstNgZd^Y1B3Cf!}BI)6j{s=I8d+q1XX%)0;ghSiNfpIv7^ zKX@x@c~|=DsMJLcF-%=1tW$g$_q?vUq<*PltIE#5vkKxKB?iwBD4c!d({e~ z(@M_$W#rpF|L5=S7aRHI=I-v0%a088yu^N9WU}@bwSTFzb)Q@`H2B_ru;!V^jIUBN z?RKnr(R}jJCO*@zLC_j?Z6y<*a(X!1P%9QLl*=zix|`<}H}F?e66+#nQ??b46Aq+f|o!XKA-QbJ-Jl z%V}9$v(A~xe>WRnGzoTmlCmMe^WGoTjoUV7TQbhm`~SM++t-7iX8wC!a?*Y4`K63? zG5`Kt{&{pFwe`)b&8O$zKfmwCKmNPr@ewz6-(Kid9h}bhSBv%JyG(_3 z8N2rX`}O}_et#iTRrad`iLY0>Ykb|adcXAgi+z4qoXXSH&BJW2pOjMZ=3`r^^S~!K zLRDqXuUTp<+n>C7rm|!0On+(fTCx9v=4TcD|IRe>)c9LosaaV3@AI3VpEEx^KfiWn z;c73_xnKR~ukX{Ubl}sj_2HYl{`@kt3F zB=i5T?aS4}!-KV=7QKFx)t>R;>E+x1R)4Wv*jeYDURtwhYLEH-{O(FuvzuRdb(bz( z{rtSYn%4Zhvj?lSqD#ITv)`V-bJn~Gs-^#BoqE3V`16xGcCqgkUHIjF=jVr)vQPFt5A^Se{&xE9$MfecTg*~a zlUeVoMXlZMy6gYVw}#tfR(|Juvcx#j&HCKuyGFOxH5_i|%9d`-IX^$&Hg^A144)>COEK5|?!Pe%3_05TeodMCoge-CHUGDySA2b^t5LiD<@0j^i_x{?ARyy~r+4gPUbZ*s-_mh9u2wZl! z9IaJz?pKH#V$T>%W}mLbGr-NWW!29=D&HykOhzGmG@@Jvn)<`DLS_`u1~^r>^>0c}{r! zoquQNsh?i$&fRePStj2yc8)TB-i$#0|5FXVoA%$-{Woz^VgDQT`uf&%vJZ7Go`af3QZLz8qdMf`{R_K%rs^3NXbKhCw=?2uiL7{Ab(_Y*fQU$AiHl3|B>;R ziS~EqZ@nh&bM`^{eDxPe>1ubLSG+v`_22i&kKXl_O=vFhrQdg9ObrT zHHH=KjNSSmY;DuoM@)Jj?OFR`_ujUT-u-f$h<1diS>g%x$vfwLQrW#)EGF-5`mOK5 zK1;$D&a|4PCBCQfc@0O`u{~8rqD>xOclHZyx)d_!!O5#@-M^(vo5cq2fB16!|Ifd+ zJ6x)pps&jx^ze~aVfDYn(4C3@9~7~=x=d7$&U^C4^U|vM>*c+VCNKN+`b*h_SGh8C z_QXauUygb5H!hIt>61?<{l(QcRV=@B%9zz}*Gvo4IGYy9uU`5!%z7y0jR$cp5TSE{dkF_qhL z)_;2aa_QRV$3A}9Q~dr%wD~rHj-2v$i~e4o{8zK~|LNskZ|~3Dq+wTBeRsdcKcC+( zFLqZxe>7#i{ZCc7O)mWZ=0`8$x4nI~c7Af9+@DCX=P7z+r$4`1Usrf4e1=Wl?IbZi zeba=-BHr7F#9Vx%eRa==Wu2M(k>go@$?T9zn)4Q3*wOZ?EadRJjE>8tCPxlxNj+L` z{^;SqdGeya3+l_~n{y>~H$H0&6wu^5)KK*2`=>{LoV(^0e&j1x@wvlSA)u-}JA^On z;$1<0Yi7B5ca}d|&mbGJI=KG?MW!|oMdw@l;M zelB~e@$r}YnhVUA-JNQvUAyORclY1X-a2zkYmkv!{B#t%*+Jwx;7o7n!B6ttx%KYO~FY{r#P`9tL6N>x-@n zB`pm+|4KamXL8Nc{_;lu|Gu+pcQ9{KtgDq(q_t(s8`M$d`Gc2lY z-RG;5xAX2T-}LMF&#T+Nf9+oU?fjD!rGlsAA8)%m?fQng)04NSKNtCDzS!pW(^q@T z)Z1Z%X8Oe_sx^v^wO?*e%|!e@17|CvASpfCHjxE z{6o24)1OD3V33Qi-E&&Y^=iJ~tI0J9x9@GL`L@I7dhYQ@hv)zM6s!==kzr9Oz;&+H zRKTwPdhT5PaIx>wcBe&l{&F?f=3X<;=uXLvcSe<`{-oJA1b#dcq4|D8?xjK_&!mYp zpDfd}L`*Qfv4_w>)HO*8+UKgB!k z-L01#v)9Vsd?++~ZO>Nu*FUWG#Oys-(qfm8|M2^-?zij2%k{5S*91AV-+4Ks>XXLp z|BJ(3wJlztQ)h0Oe`!{T;LuKvHO(`N0z?(EbJ z51D>->oqrDy$(|A^ebZhh4gqf_Do5Y_;W|9#P7eqd%W_gX;@GB)4V@#Rv-MqRG+wK z{*j9A;|BNcUeuc3`0?KP^5rk@rR@%WeR#*a!xe919o6R_iCx}#j?3)bss~U1MrWQ) z|8F$=W&Y&zn+(jSf15vX`Mrlm_kZ1OJ)_zG#W4QggY~aY|G#Q@Rrda$^T!?Jf1l-_ zrXqL0=5u`Qv;TZ*@xS9HKFyss{pP*flULu5jg$HJ?(M<;LkI0@N~?-~KAe1fMw;BJ ztXvpe6es>M{L}SS9Q$Xb?*GO8r`&cXPuk}Azt_K>eAr*U z=Ur|6f9b#aGo8QHZ8rZMCid#OaNVa{(tjp#@n}V z&;Bd@mv8?3lFD?X7>B|WzZPbr!_yP zZ|7Y4?ZcnHyx-oG3)kI!y7bX~--;fk%Duh^O5M+^U%8^9;cNZ&ZOF10;Pbs&j+9sW zu`U8H{Wbnzz@Mt*Q6`*r=I6(&{*z@b4!($un0#)e?C-k`FqW%7IE?lSbg%w zm!sc*T@gQjDZ%~p-^-yEA7A;eR@SnuHavJ?o=n`*tc~jFoS%Z9ZL&IgX(z+3_(PLs zub85Bq>JIR&DrTuKA(8~`s(ZKydU(RPnTcE-}3JLJpT)=m(Y*#@;&-w+H&Cs_u7Sz z9uHkvW*V%(viwtk@Wk~~ax(wSzo!}X;@4V{mLETUC9Qhf{HCfzFU3ds|NNEvR(NeT zKe2jp{!f*INA58Q?T>73l3RDZ^+c_DSJTXWXWM7@udClxvwi-Dsvz+Tfj=+&;#J>r zxFy*7pvI~6p9OV{PH&Gz-`6=~zF$7={(h8To{6im|NZXk>i=IC$yYs`PI!gy z$`uh&HC|sXV!jxbXz=s z$z${NmloW*+wC|{I@tU^-+J-=)0gG_do)`-|KH=EIW-@jJ-zb2#q8?YeXry8S8n|A zaQ3^eZ+6Sa)qj8W+i@AA+56Ms`tf^Y;!kHB-hTMBxv<#-@60*8|Gn$Z?)zW+{j7QB znRo1!Q?F+(>JGpE_xNk^|G$2luWY`*|JO44C;Xosm)#tw6T3LmZ7pyA-cbMJam%{D zuh&1UTz&afkmY-J!SZ|h>ZY&FFTY$CaQL$3cgJ_X&Q2Ej^f~ccYSpjTSLbskM9-X6 zKewi>^Rs7g{-v>{!AJK8^cAgqoTODGernOoy3p>#T~{JcuRrM_?mT>ZM?LvRQ7XSR^ zmEn?O%e?g`?4G_h`R?-Br_|1xid@k9%Vl_0UC*s_EJ8xh3#Ch8F|KBUV6R)L62S5M3?Yq9U|7XozTTBkw z^zQ5kW`FA>Ui#~mVw=lawTb30CTYFCQ+v~>wmB^)Vn=6-@BHQGV@vnMxvlTsqJ2xJ zc1w>@nOsC@21nIaj#bJ&bKrDGtr8>C?k%OCSy{a{6;Vi?p+usTQ>S zs?4!1M-Cel{5pHrXqxQYS+4A!(<_fHo8J-7Thmo`aZ|zNqVsS%bL!Y-6qbrlymo8;D2KtdGqjtFLO?8HhH?`&#ViZ zj$D2|E%sKir@E>4W=*lYaFY)QvR+)~*1h3aYIUx4>axB26OM05e%1GQmFDUrHK(_I zo4@GU3;(}YEVEayzw{|Og!Q(J*tO4%;w96|T!W|0D=YM1$-CqzzRF0j{@(KUdomI; z3cmdmNMxQ&G6e1P%cnC&(0_Ar?Be$&9;+O!oJVB^SMu1!S>R# z&Zv!jFLl|&!lsKYUbF8`{-z@zRx8R19P$?4niQo`Bz3s|(!J@)@!ypw5Bz!LFS$G7CP>Ak(FHuvm8jm$5nEv|J&n`)?S3|yq>(VKJ4M)y^O z>cr(Umm7y#xJNB?eaW|CS-b9;o4+OZ?0vMkb>jNzPpp6bV4iQiw`$&#D?2h4M<4s} zcZbLO(B95YGv=Z%H76Eo?>154`f?&TvRz%bgqbBSYcJ-6D3z_6~YgTQfsFpGBhRIx=t-*`@vRC@P>Xi|j7rsF|<(=yN)lR4Q z3tT#;i6vj2E?BC4G0#VO`B^UgPbsZ(j2!CRW#ZnUDr|nI*vb|?DwbO1cRK#ciG!!h zJ=G^2&S@yKY>%|sdHl-iIn&Q94~sPyH1W4yui0$P!a4^F4xyS?l-e4 z*V{yT$ri1^goe{S&QZ*zt&=8%ZO-7CcmA8KyKZ`^`2yy%g1XU1Hh+m*)F`eY&8_0d z@}p*QxX6jeqCT=hMS3r0-r91)Cv$1{jqXMT&#$F#p8ezSs0q8roi_Q$J|AyU)pLiA znSRzsZjgQ^;nkQa^EK+Q)lj;o*VGC z^<2ivj`dHyW*kj9q#3nr>CLbYpV}T5pSfd{ckzaczVGUydy1-}F_T)NpUcRFMonfs zxUG%Qf;!7>&n#VtsY5=xpQ1^`F>Je{9k0Rmx1jg6DO-v z*2j7ymISY!*`IlYO;U5&;>9mlw@$aq7WvyXSz&Lnt;*-d457^GZJxWjVwDnmI#1=U zUG?gYwB4&E&s`KVrJ~jvo9Zab-(33A+FW+Nb)l%`20`(?RXXt+wnA)Ed4iuO%3KgE zy;%^X7tvZ-)hK3Zx~*8BRYg+uh|9!f?msmz=|5Z;A$aV_zu7Xz9#X5~7Hs2ePhH8|wSo0SPiPv)p)J$b>u;sTS%j`;TS@pVrQ(Y^XFi%MUZy(xd$T%K8d z?1cG>2r1{ImVCRfGB1od@N~nWsWZj5UiAo4VO)}Xak`l8a{r_4p1(?0JfFbo7o~8P zMc?siZhL}hUrpDRkakP<{Fz&p8?CfO+p1zVe7~$V+4R)28JjI9 z1*)uw-O|2Z^rb__!<0`A=1cX8Y+o>4?wTRv&f}9giF?hq49U{jTRbae`MzJ&pJG!u zbBBkBU|sK}Lz+^P8JBiS{xMveCRjcB$3>M&uO+_MW1naUK3wo1L;9i2t`*hKm?ujl z~2PD4BxsfxuL?t zasJCU>(JlP6@JTpak`hBn3|b5_u}Vpe#axvE5oafMJzoSRnjXlsY-6MAQAuql9TwM!ZjY<7(&~>jUjK~RDXx{Y`cnKQe-}%gjrArk z)Hl54+qu{!#>M9GjkV?~<%#+d{*xaFY>e#Um^LkIy2p(tyxkj94<_GTbD`OFYT@SB z1&c#&9M*nee7rMYqh(i5vCYZdzHNLee{}acl&E`2TlTKra?N=%&z4>zr710DTQ)2` zlIQA_@L-8B*Yq#$4u>r-e!pOOe21;lf#pl3HZHt2(RR|(>zuq+iS{`kZcY+z-K^n# zJl%R(oy!9c_X8IWx=%9Do@LQg-nYssM<&3OkFCaJZ`V^#^~wHRwU;{O#dOuS$+@!z zZPEA`x5ACwDtRBQ`MSnN2XnU zusY{*%QnhMqf_AQsR=WG+U|C^^(u6Y=Pj@1mwRQIeoL;DsxR%nAMizR zTKwaEYhEbm6y>bAdP1+R~_u?PN}7ifGFsJOQxar41x zp&uFxO_h#Knc<=JUQ2x4%|zFLsltm~)glu&I2>Fx;YAAb!VjvOQk?fKYzUjv);alM zCFdNeuQPNkeHUDhvQ3uFTdHDr+Vh$Jl%~Tx?isO#$EK}hu2l5l_Nqx`j&L@(Wd8Y{ z{$n%W)z{X}R{ZriNFcEKh{W`BD>o(UstS8HKT!=j(dMbW@qYuaSDeP)s9cQ9<=WqTM1}#n)42EOc&T)mXc`?A*;e>L*RUES|hz7OPeE{IJHJ&fFQM zQRfQ9p5Azpu+Zb;p=71B&BtbcFqAklX=$UQ?DYN`fj^?2C0)9EvgggHm@KGsp^f*w z;YWq!O&pyoX3scsYFR^KsYHQv_7v}39O0K5TG9?n_NJQEMkYR5m9lBY<>|eq>R**M z$v!x7m#Mtw`O@=7x-o&7MrRJlPE@wM_f@bxq^+epV?u;~Yo>D7u~!-49~N#ZsX3J- zHR036#tAPbFg(lPf1K z&z!PyF~hVB?hjo$YdwE%np3x7-i%$@)+#IVCg#srC~h!C#x-niQ)c`*?>l0iTc*Z# z&DFM5cqDnM=u6$EXw`S%An=z0GM z)R-%X>%ZfXSYu8F}s=k(3++NngXQJC@C$UOq?YiB|;#O#OY}PPT5;Sy+iIiFp zrd*%Bp+U~-N8>79Yp!^X?cuHo(>?51A~yzD98W#EYWEs7ukMCf_jXq+H!3VVl-%^c z>dn<8cOK`E=lZ|d+w&qbTjti^oRln3?|8uMVv_Lc3pUQvmdS|k*f~Kz)!La~KKSC9 z!n^HTCO+8_l+H5k5u0_wg$Y|&FYy$y3tDdc7Pp7*>z3rDPhI@eI$C18-L*Y+Hg?~5 za%rdJ=`9Cb`U~2tTNipA;V8ZP`0TX{@ieV|jOPJ3wUUQMJ?UHgys;BKV z=K`074u+Y67EDf+?XM=L#;s83bN)Ng@?xVUdqrc%#TOG@1Y%rP<##yr+$#-9*5s>M zvBTk>PS)0Zw{KC7EIgAW45L{Ww%-iMow4Q8Y?po26C)NHM5O$isIf%uH0Qqn9{ojs zmgq;H-Mb?8)02j-smYwW7d$@9>TFs4tW@J9S7*iaO%Zu551ei~E!Gftb44dOTZjKm zymQZw4A!y}KM$QQpJ=$c@!gf2sWHO3ENj_odUz+A=*FGxP~QK=?_itl<%BIOL+xj} zH}P$l&^zbVj5CL2G^NDL=j2Oh8@9ABODgW!aV;V0>xox0lYNe{ton75>Ac(XzoNaf zIBsp3<&t?}#a*7&!OfQyl;(Wk4LilgbG2Ra3ZpN#{UQO0;E+d+xe7H(MH=Ec$E`9m zd{veyudg|Be8noIt{~5ve3uEY1hciu3fgm*oSd+~Q)>?YJ$vaQQ~zb2t0D^{y<(@u0+J6~hph zd0q2@leam^s+`)8pSWRfl(@0el7~;@)(aH2F*g-wrOLQ;cFo||GL^_y;Aza`ZsMDD z(fgfl@%cbSi!5j7HNg{8nx?IoZQ;+p|AO;dua@(b(G3^))R|uEJ%11@aOy%*_K~&v zpSHKHF1+D0CfIGN zFXw!hqjoD2W<74`pSa?k(8=^S=8u>*1n_ci`7bkb<<*8eY?=z3vn(4YimH9)nW#Pc zcT0z2tCp+8))N}K3x7$~O)(SlTi(?XC)j1V$Kc1wgKtwsB>pvB?YX$`E89JuW`)e{c{0m&`Mmn~w)2FSoXyI66cZ~vaf*NwTepz1 zOZWEf4ap^Uvy^`?KL2s} zIRz8rr}N&aj(M=wcem1^X}7k0?J*P(vk(xAc)ntB=iROjpDE>zGpZVud_&4tO3FTN z+s~B$;Kt#&OPXRkw=0UST+6w3#&Tm7Hy?W`jgYoN=lMsyuLxClw^wZB+Ti$J`NY;Y z6J|$C=uDit^ZdUI?-w|@7I+%EX9{j9c$~cdSv(fZ(FNRa(5Ijr`o%^ zmQJC!p{X&K0)=+@>6R!TjEeh}GLic}KgV^C`K%KKS54hCU(ABlovB*fWq+^TZC{r@ zq1=Uz-;`E0bF`mOE?!}mpqguN@)*URv+PnaYo6}EKRqggjaR~Tq4m=Lh{ z+}7o>Ii|0dUwI)bQ#NNuY2RPx!~I3QyIda4OP;^VY|)mEh*hS+Eg3yG9tnBR-s<{X zAhO;2$`i|;jC;@Y_IGxtzVKts*x}>6$#?3L_hF?Anoc}fp?#M<>sm*Vt{!V-xkoOm zSIDC^Yt#Dmj2;DK+f2{8^vP=q$99SN0R<-inm@eTm3i~v34P{uZjYFp=GC24*&94T zS>f0c4wp0R8!rpjht&3JaJ4+rn!91`uUWfloSP1%?hG(wdb>$g!bJJ@qO~U1doC;x zdaTg)enaB#BU5fYsp;yOV0-DQlfPCh>+B;{Vb2Rr`?Vh5c%Q>lTA;}5jKYpy_8p;} zX;+hz9rg7)f1FnCOO&4>$B~vDwoPcsTE^qa&G(%zpE~8Sg1zmTUZ;GKL*+JGfp(Xu z=^70!OP9QjJg>a&Q-flM&eK^_Y|dUiSySh#P^u%ARp2~(_Tv+p9??!4y0t&MUf}V$ z6!tvs^~vI`#}!n!%2-QQ?P5z2ZJdhd(YHJ%wcO4}yRTM(^eC)ITS_pRFtoRor3Kh)En@1oka?)i@D%ZAFYlGYkCBCPp3UYVqJvVcf9r$(zh)(vs1$0_O;8c@@M8?i6qg zHCeK2%B)Q9Fy2jtad|1b&z|gm-l5YOxBjN`%@uYGbDEaOoZ+0T=ob;z;$Nz0zarP- zj{A|{Tz9wge&AAKS3Y@J!Z=E3$?SXVS=XknYl>QXi&aG7+qC`_Iync9dmIW~)6qKP zHxFB-uurl}sZL2o%=bATKY41u37#e1c#x?qzCySz;JTFLs!z2WWml&6a8#~Y>+4#P z_~zrYguWiTdloFbGDq23S?ySiwi)^TnIX&_sC46@g}%vxns;xHsT}W8iu|Z)GEJzO zx$NNpsmp_uc`L({A3HZoP38F*-lNl|G;_0adwEE6UUrd~kx60Eiqz+>`vbC^mRWl- z^GMiPJl1Y0d6eVA_|(H?##^Z+_jU4CXwK@76a2Q|yHZ&hOTg;8Gd8#TxLU4D;JT-L zVTD0tqI$0BpH1na3vL__tq@CdZ8~CXdNw!3fG4ZwP?nU^DgNgb+b+!TQA*fQn4CK4 zX5zz+LgjlB_gYydCyK5qS*f(DCGIBY=EKalCVvUbQ;|Cq?($T{Rr>z{rMK&*ZMkS5 zGRte?lD+FfyoJnGmd={PKUlb(y|}sOFTC}@U1sCaXEXMHYHiEeEIY|DUV=lKomu?i z!_pbYdzBru0!k#r>C>CY#KRTGx3; zP1!@lO>|-+H}CA^bElPB^s?4-JgKmX>a{z3RCZG1YR4UYp}i~4{)~TI_wsUG9@qQz z6O=X8pU*k5!DPPMSln&Sc>9*a-=$Ihx_ta8+%jiOzh*y~yy@K@ z2eIQ#CfmPgt`h9ry{?1Z<$}v?u}9fGA`{muAGyad`?|n+zVr=3YXjU2lBOwgaeB9E z=vEnBvk);82{?OMVRqMw@5@e@7%^JT+tA&$Wio5oHM}l&&9KZ&t06dD)6ye z=Z@qX?Yl}jm#wzm`sv3lBSHTu1(He!RvuY=Q9|O~tekZxpGxp;bT(^|zbd^`(^Rmb zwe4SMl-YtK@7#7+-%M>?b~90~m$fVKnX_WFlL=SOG?!!+o*TWV{&2^cWgKke628BJ z??t7F+79C>0id zp@k`|lAB_q^HjLA5AbV?t=#x7G{)t{C7+IYHV@i3B<3tx%l};1uf@A3cV4IzOH887 z6@k>VaZPho-re2i5^<(hrP5aZ;*AIm)97_BW_(K)yxex}!K;o9*AirBnM)tM8l~OR z@^;eVc?_>EWQUY8Uo_beo^1KB@~7LoLf;c6Q*XK~Y+I3efz4SupGK;d`4L9c- zS3910Uv)XPm~(65*(EODquAD~vhrSBnd7m}vD{I(Us~=$+m~Y(7Cg_`6S_MT1x3?bfuY)(5gC-&S7{;Jvz+S-nyJ zl;ao2yOYju4LHtV*(PyHDe?HBbWcBxs~&ydZ_M73v^YyIwT`J&v0!Qok7UughZjSS z2&6}xyI3VAJypRgX+2v}ZgTU9=0_H0GxSW$J2;q33%0Ia!nFR;*B!#{rjsV05K!b{ zb#7j^BWst*#FLxWPQ0{ds{6Z_f`0|yDC|r7vDNmNMbamCzl*G%hEiMPYRmG2v-#}w z-bMXQ;SS~FK6A5#{j|iFBgfxvzoD_p`@*6VdykkT6fTok^n!WH>I*@si=UmFEEPIw zYCzStyXjH_4JRC<-tRaNVD>^wWrvHig!S4E*FPci@|Vacq-Dl@U(ovABvs~nz}kaX zrGz#nv_3c@Ato)?Xz3>HwIHyS+j-_5fuLk7n?rMyqEZ+`nAK))y5&*2@Jrl8;e^SV z1_CFuW*y+OwMb)Xy}Rhxda-?7ZoYf`PIU0Jsk1MNc0G06>Dr`xU(=0kn+;YyuUGEW zoD#L5_Xf|QI&Pu(T|Sc&Lk*keCd8eJ_MP;7li{n(GoHmKOs?#@d?$I%+Bc>}rBb3h zBkGFQ{kU10buQy)mDD@GgFQz(8ctY?XH2$;Nm5C#RKBr6kF%tsBSG1{b6MsiktzI# zRW@evORC-Ud;P3e`eDtJV!;hD!EWZ)ojPr&)(hr(Mz7L78>D8iX{Gs^TT9<5OtEr_ zX4>>B&+%49=T#Hk-iUK2{{`GFa=vm-IV;ckltp#Qy^WWY1X*h)Ix4%no!Kh;>9kvh zz(VyxzmD|igV(QcE)UE(5f^fN+R~GrYXg6D_udiFdS=#f!uDmgY$VrBr%FxMr8kyF zS?<2rbv<(H#N#X86*#E`J#bz9?s;6UX^Z5SEWh<%7X-gO@Ozu|+E49S>phozj#+JD z(xQ^BXX4IaDI*oAbLitS!3N!i;>}uHZYc$pe7)!8Deig_Zz**fqnU(J!TWY{HS;3>y zGn;m@StY#gjyl=TF{S4Z*Og^uqFcqbZsPv4u|qo4#NeN@<@3d9%$q`tH5{hZDu~an zI&?_)=6O3V`>dzOJvK=koZ%!P`pf8u6qDe^BeTPDrCd6GoteqDatYs$DkL95gfVy_h4uUMqPdg032wux*q(bA3rDW|hnUTiv7yf$sY>d5RJ6IFdQ%>|v@ zBR;xW>HVAIy7r!kmifkz%{{;5Urh|PR#+;aDWf^P_tG!XrH48U7MEq~WTl8W6;`QS zW{Y+>AJAxMmcw{;LFt!gI~JH+o!zw|#l+pk^5UTd+3O!qo;cy?oO9ZoXSnu zu!v)V&)UfUEg_SPf?qpo7j4#m>@m%0v0hq{I^g=Gti(reAB0lZnV z;s2*?pTOGlEwSb2MENT#Ji5M`h6UO(eJDD#(4$Ih<;C>xdR)Hkt*IriA{CfxL-o5q z%d=f_63a?7nW^6*J2f}E%E``MY|Tjy)iVu$&SW`g=)0G`SoH7bpU8{Mesu4g0$rihWmi4-Ox&}OEBv&IagX%d4y_|~=cfEvd+Kb?-7w+CJ)zY; zZ_KyMJfwSIeX%dcwH17eQrK$>mt-phcD;Ms-!LIt@{-JZ@hlnb`Xfw}^;f8`T)NYw zep_&?UQR{-N0y0ejnk9+xqCOKOwXDs?E7W$t2Z@MTOLhaVOiNCwb7)n#Wo>X?d}TA zl_xurRDSIZ6I6{!y0c=En*s9?@t18)KXuqbgJ*17lX+&=lr6HJ$^wh>S-viwAMkd$ z_Eq85^|8fu9}f3dM0#rpg?Y@M+TWIUVV;z)n{4G?JB=VN)uVw$Q|+?^KQ`1acvb7; zYM5YfY-KOI{WYn7mdD?@Ep@Hw;XV4=b;lx~hdTsy4=c8O)(Y6X*Uh_6tAan!dqx5G z$!U)lusdx{R6H%{Zt{+O=KK{xYZtBweN^0gFtT#tMfN{$wAOIwo(wn}Q`{fEab3%z z$w#jTcNH91DwA<%%{lQ4T$+9t0_p;f1?ULzIi5SjS|+w?_0UM(;PuJ1FotESZcWEAhWNnarS~!?txx-KiGO+6%8Og0 z-bVa2pIu=qa<;F6g`<>jR{9aIY_}p_t|af3^;$tX-gnX?*^EMzGc|nIKlK%pVt4KN z8uR%z2lts0Q+5@W{plO~x>qn=jeM=@)Ov{F$<#2P1z}ksks-cWcAc6+Rkp`9+ga6u z7J4r!?)i4&Y|EM>JyzON+A@#r5Oi?ja0p4!_>`UD9<_!kEhw7b`eTK_Qr|br0(aZpo05xW3UTF>X zzgq3Rx4OC<+jh#kDr5*YGMo^+ko@Uf#q>qXWv^~tq!shS|B33&>}I{tGZkyYdKa5q zKe6sZ=0v67tV!YpdR(8Egq6804_bVzp!i{AM}otVW2=wz9$hcRRlI%bGRfdo3frRM zxVE|6aAxsbsFJ(tUdL6w6UGv&n7$cZd&hcKmQ7?SDp4{ZHt@7xiI?l6Q}#ps zD|@>(?hRkV`-t&oN~q(#)#kceL~Pc)<|+zblHu+;|B}>}j(=BMbVIzrh3EV%c88<x`>Qrmc>yzq27rdySy@QH~}- z#jDq!uwVV5{lw$aBAF64})KE3fFF=!R9|n*)tf zQn?<*&9TvT_gne#ybB|%@1L*`Nds%MM|RvTmzWxP9F|C(X^e87YU02Cf|fx=RM)IG zuk#Kc_fShc_-XM0uh<07M<0Y9$}R4wa(wp2c@A4Mzt8mh1uCJIgnGI-9B+VG<(y`!_R7JlFhnUp?vc_hmEUD#hZ84ZDlHIIIZ$MC{F8gs&mcE zI^8=Hl5enBJ>*yrBzwT*kct6khOecA3Y+VRD_Spfewf|=V7N+fnna1NQRJ$_e7|G8 zQ`3|Jv{rpSseevR-r)KK#>*yA!IkS+H6K2mb#uwWYpT60_j`(UuiD*b*rdEOI`Q2z znFrjuYV13$TTdOZzn$3_-CKA2%$&gQ>=)|J@EuOuti`kYLQ>g}e2oaJ;{_J)yLlUX zs;gbOt`uaML}VqN*|?ZN@#dM%eKUmX&E?IWSO;l5=Q8MAW-7nc#&B+bR?p=L;hVmN zIr(lBROs>S{ISq=*;KX)m%SHM)@1y9*p#rg)y*om;ce6GOAW_wG+5na5Wl2z;#&NJ zggB9?-;){z)5Pr_hSnv|Rr^xa*t1uIah8^8cfd>*ZISc!47wH~a*9d}{!&-?A~a^0 zf1eh0E&TN72jOc2=N4vm#BG`=c~*I%yMY1gs_iUH@0yuh&UQ*Y6IYNf`uNS-WcIY6 zUfly6N+p>qRrj!p{CujBY1n+C^_;kLLlXDYTN`G5tC}n}G1PWS+{%s917~(vi0%9_ z{cOnk3ras4Hl;LhJ#8>~)>8lMgrlXPy439H;&o+}o`R8Q_bpD*y!cruO3P|`+=F{_ zm)QukZjqF7Ia+dvDf`QpT`Fuw*QLZ<)(WPDJ@1g8@;B%C(KZLScao7iHy*ouH(S+l z3Fp;$N(WWBVlEbZGqEdPmbc}N(H*WgnL8)c^dE70w#!6FCN$%s)4MM_Dooi(I+ zuv9Al_Zm?PNq)bz-wIgwX0I^4mLclq6uR=F+?8)pN6M5d`TlUU8s>djv{2n;|H8#$ zM^Z)C-l{qA_SS|8Yfs4~-%nY4nl)csb#_K4mo{TdRfu}<KX}uWZ_S7sqOtG4TXDJ8S%q_3i;98zb3EPr)%b&Qf@G9C^2nWZ02(HsMOX4*Yue#YV5plwVu;oo7Y$ z_Q|YEIA;=)n8RU~^J;}#vn`IAm7EBskF zrgIhAWUwagxyjNz?Z#tot*8(Qh10G#Ui9r3x*ZvKz5lX$K)DTrqU4DKoH86m5B=iz zs)jt7vss_H^f>cuyO0o;@a>btekVU?U8L{y^!5E#FU2z}-#hGF5Fq@bfzdi6=nU3x67hihB+K9|IwMWQo;3lw?TewS|*T*~VC)Tv-|80WgLaZ)SG zVg$dRJgL$9CzqLhO4ZiVtC#pgi$r4fD7CN4x>~sC>AEj|Yu`U>jTA`F_B*`m)s^(~ z5+~MP@msm|mW^pd7N5t?ikF+as@DITTH)DbZQ;7~Gi&{0UDGXnJ!?-@_dngvcJHN2 zN!gdhkt?DOPwr@oa_$k~$~~+T+}rhnrB94youz=sp~-G<+eM=P)NZ|Y@_WDmQw5bG z;pT_G)>zhF>5oh{T5q|0%M-uY>@`2!$^&QbTzSPu+sa{c;QYO8_ScR?UYk+;c89iSzEq--32f9 zIa5SZCvm@=yEM*BL3T>u=4+3l-lyOsmZwe*lv5VA3|a`RJYDx zTc~cT8v4Y^UZ(oV#Vg%Ar|tT7d^uBrp24I5yDiHkcK%Vi*vzn%RrJZpnG;gm_iR|0 zt1l+CJuLW1&zkB}e;Q(gg_DCGGq3Y}u~Jla@BIx~!S{E(i_Dzjw#IYST1|H~>*+sA zG;U_^saae9dA`%e>Z|3e61t@{ms_s1Raufy?>zVRuIE>O^KR~8D(saBP?qiK{ns?z zEb7rj4kj!4t-DgU3o7tzUN~!d3`cM}d+!p?#3Nl9Up8JiHF-*_(9(M50;X`wosCfz zdk>tB(x|f8_l+sX+-ZA~VOGe({@)=j6OAr=i0S@1C!rh>pklD-;HlQ=6W!XId#7BQ zvm{LEX~4S>&mrt&3e5$)8OWz>R=;ZgG1My9Ir3n zWU&1Eq$0Rzjxe z->v*cyBll8f{arhhIcN0zUffsC$Z&&e`lL^!fb}raJ?uG-^7cvdw-QHn@SnFDvCV*vi|Ds^*763J&_mb zl9>E+N28C?H!eoshQ&^-7tgQAQd!8nIP8@|TEdmCmU|I5550Waw0ruV;8S|rH>CY^ zRrV`Ap(LJr=R@x2O_8qaRd^ef?=?wWXR^5$bZ6IDlk6yN_h0(A(@ta-yf?et6kl;~ z>w&OkH?K?Rbd*fu-gMUO&T}Vi#}(f~vTvFjH3g)Ivn0P|e`dKmu>q@zoq@0e4PKu4@@nT57qU(2CtajI1 z^G&BdE+|)sEtB{e_{zD6F;wi#UB)#G54@DVZhT~L z{g%v>pMgg%^v-%xu-ZZ+?1xix=gEM#TW@V#ByKF9^dNCz(ajfpp|dXd>@+aRNo0uV zFKO_Qob4gEJ4VCTAg@KgSzryL%4(CS-lWqfR-F`au0Gc)5}ma(XU2!8=CTWBYUli! z@!7+V{mH4G6|Y++o@x~|FLK~i?iGpXbeZhNx7ovFWz35?5h)hcGM?+@Pxs!Oc--UG zq?ijqix*u;zR>t%>$8oM=Pth5>OEglmQ%h@B)Rj6mYXY&*3Va}srDxgIxY4n@4LMt zP}*uzkJLwN_pX2~To!?GzD-x?k(DxGlLJ@aXiFF>)K^>e$FO*&i zPMp%r@n(U^r-thii>J*z9((neqkgg8l>3KvN(km|T@~!Iwc^G z@qX$EOLd>$JL}7`sorKaJt7gD3m&sM&2w5ZD|vF}(UP-gk~NA{AIIcJ<~-qe5icoa zJJ+d3F)PwIUM?Ev#)} zuMHj)AFUHNILo?d#?!+28NLS(UkLK#Ivg7?<*t}};q4azDclRAgN}w&eO>oyn&~Qz z)gDPjiBT*5>SjrY7BCw{E10|O`W!Y-OqNB_AmfvNyWUl%towo7d?_m~Fvj2L<0^b8 z?sdGp-MM|;HEvP=i?^)*e0Z|gOF4N$`R&S^78!qC0(_W0HJ6;5{A7NKY*{i_PxiTf zC(pCCE{O^U?G|WsMx5WfR;+HBmqFN$oztc(mB%%2a(^$Fu_Z(Msif4}M?JCedb3*E zcR63-J@(H{JEz0!THIud44D}xP^vwMJi1on)=7rZAkE|6C*~UJ(VcCtenb#B- zH^^U`5RiMt{bJT1)9*z=kCyOUDd28&6)_MG_+r7bX4^sOlg-ck+U8Yn{K+DcboTBM zA60QJ5rJ7P(^tJ*-RqLAkn>BlsA1Xri?UT#-!?58z?JkFLv>K9uHL(WdOF zC-Ovb19!^zhyeL%3iBea>}WpZ7At3?rc&Ysn)Be4?4O=Gc!A_4yhS0 zn(#sAwEkI1wTSKuch8*G;4Q1$Ibn+J3)h7&S8}Y|+QHy=PDFZ+z@0VsJr-WKNj+0x znEJrvhoqF#=h;4|I|WL-;{qqASA7)REBW)6&Ndk7;aAZe(T9rv7bwS8A&T#kF(tH*apLm~V?}bep_gr_1O;Yd?JU6|ZOZSA(a<=Pxz6f2B@%|;ltm%3! zTIp}}q!~|wiVlXaT*cn>^v-jatI9#M)g-pQS-vZ@!jP-ufZECfvRQvTTV|bDdS^xb za`VDt&Bbmre3tY?q~yBS#0%z!A88gf=Jykc+&|G(PV`1+s?K*cQ8tY&90E&XH1wJt z&B)K_u{>H?d_~qZ`jlqET=jXvg*mRTp15mO9ozGC`trGdo_U7Mnq#%>=Yp*dG3k#qKLajx^az*JXn)L8#lQ47VR{NiTYsk?7_a=12-qtUVr7A(WATm z-Zh4glb-VZ^S)yBrekl>$1;&UH#c6D;=E!J%CT(Q(?wtZKj+%fvt4X|NLbzu9l_-% zd-x=^T*5TnSm#|?pepv!qA0I;QHRHa(oHfaCrIs7T<%rSw{>2TUvJpP#gjrKHmnej z;>lr_68eUQ5)&Oun>#%s}yfi7isN)A0615*;$ zr1M_eoVLz^We@wdEyvoIxUz}_zeo$%m((oStyLy?;{1(G=@+j*5ifWj7n8Gc>a9nw zGZ~q(HAMstuPC?~Vs*gDts-p6tF9QcQ-2bEbV#g9TKD6Ut@u8xdDA?eaNPV=l(>R7 zK|SHlll5Otbuzsu>EZe!E?P3nP)YpUp&fw@w%d9Zm1bB3Zjg52VJUiPn3?!|(Jtq+ zT`N}eMlcB|W`DE$_;TWd&mLEjLzYDFib$Q*e5sZDWy|5^Vi&8FcKKY9GJT;pk*nD7 z0sEm}7s6(=m@_0tzj4<6rns{tM#IK8hI{MFs536Q2X_@cv|N9FTgz(@nku&8-Ihz@ z{y|JL3vNu)xI3+A%3C+LI&Z}ZVrMQ)lZe|Hz&@#{nI(Mt61^>1YgcK^jQS~+ryIC? z?X+cU#cVuUK&V&LKEI8vq@7G2j|&3RbeAwuuWy7aOSwNKJ^UZ`AuH+RpP zYbz8*Cv$w5wxoO7ga=`YM;h)<%uCmu+o~h7H^_g6LB`Gt zvFkFbOO_ib@B2{CeW8pyB8YoS$m*wj*=7#DmVyCmqFBY(Z)Mn%-m~`BD$bg`*Iw2M z>wXx%_Nu=qYkAmIblz)T7J~+kTT=7WV}*m9>kJvM6eZeKICwT^S{gsubTM}AUB~$c zq90i)g)d`m^4BZz6OegnQuL88bi;<*QHkF=+Ez2#tyx)na;2(x+PRJFI!j{Ak}4lq z=JppjnY!-jDq0vO+~+>!>53OpvVD`zCD)&L&!xlq$}uthRe_T5;R{XA1+5u2dmNg^ zoxafBzx&GB{wt@t-yAt{u6tKbgJ`bkg|=6^x-0mLKECd&m{4{>Ju>q!*QA!FvpR-J z9Z#L?MV#erSW2xKq-{1l;NYIf{g*+~n4!@t_WHD4@wzAY-n!X%S!>LkzC;LWuYR#OC~a6ip|-gRcx{!hFGO1~nn#-#dekyCoBtdU%_Q2sz!=jQ3B*>0zm zCjaYlIqdrAuF}pp!v$Yg`06Nx3C_~5|7^sy%~a592j@=F#ZgBdsEH@I2{GC|!*0Dq?O(JuJrI(XKgR|r9gDq%76}8V?BH3u-if*#*1#{oQ(2qbFxWYIr-WQ?gaOZn`=D%lr|iE zbaTptxBNUOlNT4r9X(g`ar(X2ip<>SkDilOJaqNz)o&(#a%;E6JMU@YFEwgvY2h$f z;}AYqCj8&MOD)33ofbt#L~cLr7xpjgnw3la$=_e6ifup7F=eXWv^5{prktutEl%4$ z_on93hR@SVRj;(@r&vc=Z=IH-T6?!j&6>MWuPZWP&r$8y?KedyN3$#oHkH4yi~k#6 zGUKv|N0+Qy^V@k*yhzCYimiLK{uIdmf3 zcQM3HIWuWfsMnG{rY(YuJ&QB4PMc_HzqtHt&e18Ge;8UVdbQg6-x=q}Q}a(VzuEb- zQ87B^8+ToY`A+MCr+T--Oy*pTU*}UB7ACb{`!(O~OH-unJ{OfpbKH6ONPN<}Y0jFB zG0Vga`|q7gU&!IyXEuA|#JM?^JLFS8bWb~*_Q*oPe-~%+4X2Jr>vOH%22OVTCX*7I zz3XFs)D-#lzq`D@p4xoJ?v>FR>DQ@AoarA^`Vgs)dO9i9+=^O{C;wC;iB zPCOow#&fQ{bzq$?&+c7Q$JkqcdtC@m-ek!&)s11PKmPF;%nsLhY0zoasl1aXI?mx+ zwI5s4spi`=CM+@132CeA3U3bocPZSk>~_J5uaXPRZmVp3GdD?Afn{BM$9&FbrRDr5 zCOq5o`F94#kCRpNRn6Lu-Vu-yG++`q%ET>kDbISTa&~gvzRlYUJ66=Kf3fCxNdilT zePCUV{0Du#&qiw>J-5C(ZLOBmmEe6}pFWwos`Tc)-7~@u?afU67LahlrAGPPQ^~o^ z^W;w?oKxg=xpUIsmSsYWTCHbzJ4Qo>$%#sfn%Ja_aHDuSP#7)_+?4XUp7h zk@HehJcZ`wd@xvRz2{f$wYo)D-}992&)c6VzWVRRg`qP8-=AIoJ?-|k#Fce>xElG& zyg$h`UCx(OyuCE!%Jp60Ki{l9^>*#rx7X+HvUO~W7H68Ax;JP4-(JJG>@&;k>UcOW zrd~a=!|(r`9hY}W-rkdUWVdba+oT|$kB|1&?UxH%rycNP!=vA_H3`!=OKWZ=$#kb1 zKH9swLs|ajL>((7ttl6_tl9gSRsZ&)q^Onm^D^f4Uu<@UrIH9KxH zp2@R28nfpN&ncF@H~dXpEVgd+EI0J#e>p4p`Fhc#o6mOSdJ0YI_;({O{haoO_~5g= zDrJV6Ww9I|Jul3?$g69%mh+=+_v6Y(6Q1?)`z(I-d(}RP*^I3_zB}AaoTzrh$Yj3E zwr6po-l1P3MQ44?IvC}D8mGgxHWGJQ-9kRm5DwL zyJl6k`c7Zf?zu|3X!Y*g*PHCJ(+*lhYWltA3m2=pJS|Lg>yqb}bS^Bayn1db``OTo z*~x9?nLiQ?e{NVe$9%PoySG}I{K|btUfo_jPo4YZ5gkdt{4E~#({e5N*N1v4xmZkI zv9T*l&(tV*=Hgoi_Vh)!Meh-7|6Sp?u4z{Li@Toh11{P84zsP7GctW>lBRn9^2^X| ztIYm#Tnv9^8g=jciK-LdTpX*{e~S6aQu8&Ydg>u3mIIbDwW4x){5SQ&PBki8W!hd0 zuDRM=di8LPVpH^WdEFQNx1&uSZOyA(cj=mJ>6QigPJzBGtK?@o{h6JwZEjzm(tagR zUbKI`(ub>)l`D&4{15Ni_PnjW{lgWR-IJTkq-u-4c(T7W*){uq;->d$wm%!41!XqH z9t!Vo4+%Pv`a&*yg;+pV>B+UTS0qZc<_JGNdC}^oJr1FlaEF?(xwJy@`(bd1^HOJ@Pq}-y@~&UP zZvQDURa=_3-mWOZH4cfHRO^6%#a?nr85T%(&VubVFaT*dFw^{Gqd z)+qcu@QwZI;?g%z#QJ9ObDRE8UklGQElxfkc||wSI4)ataozgr-Kn_^DXW?KUZ0CC z7TdGtcehEi?k$%4+nygR+;{g@R_k@{IMxXByQ}}LHS_tjDs%Spm1=!*r!8--w{WRv zd&qYG{Dw!fW*_8>lH@6iFyD0f*n(b1>BZZ7{^edd_Kp3ja^1m;&*r#Kzj`sXw8U1{ z_PbQll+EALdC#9s+r4>Ndhbnh0cJCoda?O2TXtk*MSfp%@7uY_HtznPS{i2UUNfz9 z`=-^R=lIU>-g^6S-s4U0w>|v!=*{)mb4PD>Z;rQb`uvvZi^KVg+sckVJ9t=mzJ;Fl zqdTQLcPQA-E&fvCcfzZ#z1052lZ6j=%3sU9wEo1dv+c?cw6>lq{!&rUk#}=)ou!%0 z_r+mh5!L#9UHjOL``^`BRDJuAk$rB0XyLt<;*GnQ|766^TpX>`m&anii}}xsdG8ln zAL!4UZeg~)?s#@#OjF)6i(OxTuXtmlW!-=3+~ZAo+oG@SEuNM9+$-jd$L0|B{aueg zm6ZPw40-lK?W6KG9}nqs;e}Drv z%da(%x#-zf*2^W>uCG&*c+;r2@ANKt<@piMzAC?-#%Q`Q~2a{TOxG zOlYg=vx{v;irsHn)^*rA1x^W@bSiXnt$B{u`*}YEqS-3=u5UYPd&Bd6_{_Syt!LTn z6{Bz5pX#2s-lpzV`9gufg~jW>ZIimO{YTvkYY}wxDuc~LCZFwPk@6OcanRojoE}2#vWIWB-pztXC zc&R@JJFn5H{?NVdXRFW8Z#Q}Pt8_VgpsjY^{Tug^U+%S5s_tL<{oUL*;cN#&@8?)d zG}-p<&AWqX--Etw+sSwF*e+gipY8K6{bCChUca^TT>Aa30_`W~+0@l?U!1bM+g4lt zQjKWk-6u}Ta?7?^2EO0<>tEL0$6^wvi@*N8x@&%1=C}0?XLmK7-KBM?l1<)t`S#t# z9eR%!to?mI?&`DE4SqYA_I=)yvHzWC|DyZrcV{hp_Wgpbt)Bmh8!g5P{-<|u-yi?o zll9j7+?8UBTthshueRq{rZ70}wGDA@+1$COdU5rEfA`-0S7c+*uHV{P^u^-e-oI0; z_$9y0(|hsoceV87uVr6eU)OcF)e^WAvw4T#kN>uB0{VZ*FVbvqF3)SX$mnPZk2deS zUe&N7^YtzP-^FQhm3#hi$z49oY5OMdzRkf4)n^uNKke}TV(WyhyomIY<-o0E^)wbW|`d`@o6u8t9Eu$-QVs+_sNrslyu2)>o zD_X9A8D+9MyMtI9A^?R#iNkz{qCncwznT&9{A(T=-RH?@ihK{lQN5FsE(e zH{&*KeDBgBcfzu|^vuTmZ%1$6Ry><8v^QR{>U_YLx>+0_ z^Hc9$_6p%SUz^z{Ykhxn@$bED90!j7jT2Ooxqol{Y_6-%ZWKPYHNRK<*jDvBCPt%_9c3YFBPc zY}$YK!#ve@l@I5Mzmqn2Gf(r~_1yUtkLQ`cGi?4o<6!l)9rLd}u(CAYo7`;nmRC@e zweUR4cb^OI>i5cr{QkRZ>Xl8p;@@)$>UV2)S=gM_-=t`}F?6}omgIog&Bv$3|8{xdX3H!MR==gW^t(@1$BNXuP5Hdbjgt83#{0#8fxsh^{=eI zknQTqOICJQO?O|o-MFBA$J^bd=27cdlWyORQ*-G)y^D2<*z~mR9t(c^@m^o6Qxkg2 zacWzqbkh9OrR#UEE@j@6`^vJwIr>J+jUz#hWek_wFTQ;nE8Mhw{WYr`dH>grrOph$ zXFhU_Y+WY3$o|#J=BifzW#+>RD>bFeDho4-Ls40w_pG289MQAVb$-)U+Us`Gug7^ zY64!%RNPWrzxxp9@vS)-mmhO}XMa|zadsK!nKv8q%J?ql_IJr`U-A8PUVQ+Ati+VP ztxnr!zFDAPWw3&|*{VRznz!}E+*K#G*(xrYx2>)`A;9b_ryv9KpMt3EDOau6l^ST< zDjb%bmENCwLhzA=v9a{OmKQ4goB7>4%&z$!+|JK^Jo|XwUCn9TvS*z6pDo<>{6*m0 zUx&B6yS}VE__DR=l}2OPh)a#CiKbu6UT_LF+?M%qC^2(gG z6q|OR$cYnLwBBp#TVeK{U<AUbp9Q+1b6@18eGS)<$=76hxV`Tx1q)au=!Y*JxX_ zyT!zM@{Tn&OKwzqZ2UeUsl!5V&SLFjmpk?@7ySMBN{eyp2aCk_FP93;Es?#kbme!E z#P@;+1$57y4d1v%x|id@rH@MzI)X#Jw!W@@zw@9#;A~#?s_9eN*_^M<^?cLyQ0cX9 zO+}u;k#|x?nfG;SD&}nXE|b`wez`ht!}mK09c!&)mc9%Kj2hSDlacm4BK%Qk#(N%XjEz4OZ9*1hg5)#oL?$?3g$+jg}&Yu)y@p(l1-JQcc` zx4U57`+HyCay}B6zvpgb9dCln@zU;TZ%to!9=<2szE_>Ex?k#>oar0etQ+fp$5cJq z@I52(zD>oA>JJ;RaJSQOb;NzBi-;xv; zMQz`3Gs0tYYi~_&;Dzclx-QfGvx8qRGmUzpF|U^UW>iD^LnoJ1)xAf1@9jDCFJ-U# z!>aQ~zn)N3jQ;)RtajD5%bR5xCQc~TmI+LKa_`K-=PtFIFWf$T{qL5%W6FH_Q`@oPcj9hE~c5%g{_1ohM z-y0sdSKO?4s8DV8sjuIR_%2>wck|zIo&%Gc_AY0v_UCGQaV_yKkB5xuzO@sbXBA}q zTcWiwx#)f8VFBm#xRWjlA2%F1d}-rN-xKbh1nF{L?KYD-K1FM1m~@zO5gNfu{x42`Yr+dC#-pWENEdCsJ5 z8iy+0{!Ys6+^V{@kNwgi7uN7kD*N}TPW9Ki-RWRt|8Y-o#{(^S{?%VUWb9SHacCB6 zIN#D|>D#yDnH*IT?%vW~+F|AsC3M*5nVu)>)U0Bu&F7a)@QN`hym-XbwncW4>$jJk zyY^K+QHaZ))vc!YDsqp&;m3>QmcF)izFys6lw!U9!-tsnihJ%&u2ghe>GfGBu4CDm zs!JQTZCtxR=(w+pdEuQSg|_d-7is>R?b9lB+xM)QPUnBM)7AxYd#fiqUz@vWOU6|7 znYOCkwkso_dS07vdrLg2;#rXA+z!!8$&XuK%vGIjV!n5C+2m)Y4SA7EKK@C3U-v=a zp-8`+JkQN%H;=5|yy~LwV@0#>XJ_Zx^K4xF_3AIi-wyd3)As&8Q(dt|;9 zRZN@M4{&~D^qb4?`=0N$+QVPP5$2lWeVXaZ=FBWgJ0-V`XXV*vkA594y!%LAiQ)0t z9&>FuTd|wTZ(DNojr_gaUhIxsn6CHxjO*sDnQKl8_!eHgb0a-%{><8{JDb1nNbi4t zS@~B>$0-HdM#)P&(}JCtT04?s)r-B%Grzw($9GZp+>GtJAAgfLrf79i$vFQ^-Ipe# zca5!84o~hmFIK$m^X%dIdy|*i{tD>$w`2c-=7oyCjMx0$oL!%BsBojr8tdJ!`Her9 zIKO{+QEr#Tkr_L~@}?~`{(b6=_U^?B+H%I%PsM0|*7RTTO)i=@^N^;R?TTB~r)*u` z`(!sxb7n~hpBejf=TEI?rRJ4)lfqA2wJj=r|M9w-wg)=$xF~^vcw<%)DP(Hfv+n&Q7>p7q>SuBHHk&?wU1kuIs+D-t;y$F-`8t+ro=g zF_#bRMUZ5h6eBfQ;M&~UjxK9_pKGrJDw52uUR+dy* zS%;YK=58j@8@fv@%Xoz6?{05-t@zN%#q_M+t1C(RXBWljp0!PJcxW3?u|H2O;>ubN zNn5sx_%NGgniYnu`e$uZJW3Va7R}Jj*|8yUL9ak=!Q(@{r@z^Km($qOUdeG$Enn~2 zoyKp~clzYEFFyX3BXb>Ban*y}_bzWyJfxX+P^oG|hrr{68%y)jds>T~JzFH0p6g}Z zI<(=VYSoIp0tfwlElRa-c<>()SF(_2pUWW_GdJqW%BLn~53hysG#(e1i?6Ub72mOJ z%Ic1{if6+Q{_6fDDq-NlFH!&SN9$wpzIcne%)BOzSJ#x76;`)oG(T2e-IC$FGfJX9 z^POUIH0Q--H4Kw(H7{w)@R}Qy!rUL!o^#o(C9A{iY1bq1My1q>U%T|LNq4aXsZ203 z|E4)vWM<0Upi9Z#if)>XBHkjd3%kXIFUeSYi@2WBC~^(_A?7XO`mA9Fr(h_P=Gn4s zp@BWK<&(1IIG3#3{e8{tZzq&@7~9^fJ8`3BbMl0ipsUA1;|{Lp+<18cOVD**^QAqz zT#LVU{8xOWQL~yQD78;3HN-RN?&Vcp%%#6)1ne=>`^gYs>T=m;-=`m^9&3lM_qttm zCr)%~WBBQ%SBo;A-U)5(J|OkzhGA;SwFz%C-$ecsuuVAijf-O=tFSp+=G$D$Tepi$ zmfXB?l4<2$cjqs8cNMzK!|&zTw+O^OJ9buYsjX5@$BLfqt9rE`Z}oNJm%4rXv%(Sf zSxc`(U7NeACdf1=`LaOs)0JhhFAkXS&AlzKD0+gq)-#dP+;!kY42v~Clo~!YwzA85 ziR79?*AL&V4gDXMmKNM8S8wGay=Kj-y4RQHl%L+^JHxCp>S<ryth&hR(VP&gn^-M+Fsw@)x>_NKqzl&m+d7yfNEbKU%1rL&C!&tCR_ z^J>Y3t+H+&!hT1qlhV{h->-~b{K}}^dSyZG&Wp`rZBx>|o6Ozzrs`3-*^?KxrSeLv zlD;jOVJmxm?$vFgS2}s;^}Y7XZd*`eYk2VTDgW>@^F%h6adO^Vmo-1)NvG>P9i}-~ zwy2xFJ*jk{v-Vb+ic4^B?YtY$J8S1%+NC|Gu<)X=_}0Uo9m{sSSh@4$*CTfRZ$3kb zhYHSHCSKqB)a0s;?tz=FYi6J6T$N{A7`S5hJ+^GcLyd5d))<*Kfkqo&F*iU z=g#?i-M+lx-M{U5ztw+ic*nb8tH1xwb_pi=?`Ntz9=!Q; zPP&%-N%7W$kLsasI*-o}S-U(lW1Gg6%xmvCfBZZ0*x%;g5(nFlKQ8Zim!xs$PR@cA zF1BZ1Z|gYp@rQ7+z3%H{?M=qtg^TS?pVcM3TVBfVA@^SLkAVB!tMkKFZ~tdl@aJLH z{hS3E>s>;19)x%B28nL|X8zXp(*4B^tvpNa_7^IdB~CSB(@YMy#b?AW;?Net z3)ye4zxCakV%b*8?as-fwWeL<#m1vfCRf)iX5jlWA=#E8vLo=6QL~P5gx^8q*NW$z zW*zi0dy%GCwINS1yO8yoj!STRX}wo&&iC~l*QF*Gvz^v#zS7(+wupCS`h==C)qc-XlmBhZd1==DJ*r)O$&mZdImJSTbWY*}ib<1>jVx0+Q9J-D2U z%}pGlJ5~rCOejn)SpOiwFnPla!zZQR!yguX4n4u%ysByf2V0nZLFw$s)(Z9eazDOZ z`18i>O6lzc#v2AkG5k#8i|k`c9xP%Om)&+^LS4fA=BLe#`FuRZ2{V`v%UCG;#dPGC z<*efp{@bX@=TjJPi*HZCgVqhjifxBk+S3-6Cv-Kh{Chy!@ud@s`C|DgdztlRbbgy1 z*j1rB=aBe5J(oF^y^GiHDF}GMx2GUOtcrbE2K!=x`yG~h?)Fv%?5TTFpzJPf8MXO( zVE+2W6P(^K=Cocv=dO6@?e*H^*5vTVVy7vVaQZ_FUVBB%`MB1^m z#Yq?T2|WC9`b50jKci3LyR}<8PQ@Q{&e|4e7Qtrt>tbdK$AWCdws(uzVgHg=LI{RTtdD2Dtljjn3j9ec$JbnzdwWHSBC&wfshWp&*BOzCYav2 z#w4(yYWC_c909gv3H*PrINN_+oW=i9)8)5sZTrtF$#!37_$yi+YH?dCb1azu-Ic{w zttRSSQh6z!1%9@3f;$T4WSX$bTMF+8_7L{_$d)9bWU>2@YNh}ZbpKEKkqK_ntkKml|LIyS6)^#{&TYF$q^Ry&|6DvW=}~M)}K@HaLdv5W7%sz z9P@NE`*^HV+;2~T(f;`}9vop=?kwD=dCT0u#lrRa5pMOZ*HdQMYwpa^l`t}UXp)v# z98}`lwXSoypUu^G&3o^%SMTO;%h@0Ko4@UhOM&p;lewY7|L6XApHi29_|Sy6u4Wq( ze@nDUaQ>frB~|$U+$rgkKjl0+7F-;EAZ3yL%oqM@zbxh|vK^TnXzje^;FRUh%r13$ zHaE3(oSL%G)!8NVhOd~nx|pr$*SkknFW<8*GbZi-47lwe2E_^x9l~=)ywQ=zV%;qY^7Oq>O0}$`6B(o{qwI(n0)hp$~XJSnRC~i@jH9! zjf%X_r-NW3<(vJ?zy6yJKe?{A=Gug`4Vw-xNtmnBc~a@XlA5_w)@!U+l$vI_Y@y^D zAEU?@b5%qFE(zFfIAncN>&6nrD4AIYqm*W(NQPXlo0OxL`a$KnPZ8g-%>EFmOFUuc zW!ujRWe2~SxkRqws$86@OZTg1o@}$0%v%|0 zK2Jqj<*J;K=@IuO(>-%-A{Az&^m#s;F{}N#S~tVwDU3&?l=@-}Pm5L*E6xnr6zerN zwLLOw#?*ruC5r4y2kQQs=Nf$9X;@yp^@~8MV%34ixeqQeUu&Jy@h$T2o!tJrXFlgX z7gAbvTl86JcXe35*lp(%Z7*Ig&`fZhE`DUFjbA>J| zb9{eLWxFGef8F)w*IyybDbkl}HouVxUEhBB^}?RtGo_uMd=;p)HH+haEOCiv+T(LF z<*T`Nwx!E~|;p{yF7u zm~%^VfN}GokFOd3IL*2ok;^mT=HcJ15}iVoX>rD%old@4_}^*PXFo<;?FH$4=EW8Y z2jn<5%>OAXm(a0n*4BoZ(uY{S88q(g<*%M`V1jo6%KL0}YCgW_)9A`)1Inc&KoH>-|QSww(PpTkq@s;nOv6VW>-= z-!5lu;1Y85P0@^51-q6mJIeQFBeOG0_!%dTHjZ=L(~~pHj+bi8P@0s`uOjitVZ)JD z)mui}+r@b@_i@#2k8q8+ac@!A)~`wXH|%YFtNSM}aDmxx!*2mCwrq(V3|>Lirr!cu z_MUxFt#L@;?uoM-lXJT_3IE!~F8?Oi;{NRdyCcy$+KYJFa>VT(uvIr4yk|CV?_Un5 zBZ0qlv+OGl3Ot;Z-Y@WwEBF=Vx^=P@PrS!|-tgAdheFe% zOuuN|@obo!H@D~UlJeV<$$P{eEQwZUWRsQrlJMc=K}YE=`RVUgzpZ`8X{oRHT=mJG zmO0ZWd=@H->v*s&p#21Q=DwSO+GZj9rC7JG|8-U4$F8m0Vy`)V6w-+E_#EmJHPdBo z4g2JR&G*heIs<}z2k!8ceVlmIT`WIp%f=sdV!3PdHcA{=boA}nHqMoLidR*a>}m-S zpLDWw&F;qdMM)Q1bNnCwjoY!ep!(rAGlA!3X3_o;C7dmKjTc%?W_N#H^mpksPlFQ9 zd_Bc8sx3QP45lx5>h#8KpKhhlmYAk#-WQ5Eqx2k4t7hzE(FI9;sj1fYM;HGVlbt`k zbivLEYo*^;-kP`kZKae{Y{#;`TNYgB_Bgz7+LddOwkfcnoMfD??b4Tew!!QNXQp3r zST`uRop|~mzgum#%It^koVXKali#jBwkmK_V!>XPb<@A8`x>Us=2Bg;cfwmW!)mqO z1JiRXMU;M=+?agPOvbC)Z?8Oy{H)~T2NHiyI@{^QBG1#&-~6RDBg>#~p=H^dn)Bxr z{|KeTcbK{5_S|~#s#Y!W6)D{Q%$IJUGWqm} z2`s{s5>EV@t~|42*|yp9)T)oDzB$k$JL8R@xYD^)r#U&w(}!`ytFx6j7|UGgVrx8);F4?1i);cCq@gJPYLkqFMOzKvS-5E zJ&zWsu$<&x=@KGt^e>iaA9v(`-)`U9_KN8O?}e_!Htq5bDCc~o=Mr-L^Fh&?8~^NP z=e!q9ipkp1EXDUj&qXHqT=VH)31*cUT$`Gkc>e3TxW_!psNm$)Pw8D8z3%JbZ_i$p z6wH*5xiO(qago}?D{<{AeUn}emQa7Y_m36 zq3mrH*O~nD^@&M+)2n@)T9O?T>Q^@YRo$>(;NhCi#DA?X=9(J5*e~$#itO=qoXZ(3 zqcp6w91@tEOM>n)N=YbbUC+AF_%TZR)I?=*>s8KuXI`J!I)TO6#dNlf-1g-kFJ6*p zNoW%A5omh3!p%{LN6`IfQA+CZeJ^E=on?70TBo%+&N#p>{3D^`f!4Ig-`FNqytOdi zrM%eM$V%f7i|dR99Kvjg9cEJdt+guqa^9c#*1+k!C2?J42!rfY8~1nRck~{re>v0= zH={3Yx{(+%#~RZmE1A@x(QzJ{_U&1}-7@ zILc={;1j-+*zsUl+i_hz%ed?}OAK4DOzf81`C?+Xl1dxL@}?|@PEJKb7lyR12@*;& z#z(z*1dq48w=jDy8*V#`p-D?E;HZGR!`sr7weHudQq~@StIzZ?O8d;$j6>~*B$Q-OK3HIK`l{8ibbEhFmgt<}-hefNuNOioUC+j&VlP*BC0Wy6{q#b4ueyW}Mo zm1|x8cjJrS(p%briK@c$QVvb_vF$(J@AG3Kr@c{1^+ZNbHI|bCdy}6BOjN8ozP)NJ{IfuH!ZbNotE-s`Xy`E+dgkw?(<=a;vvo4YQJ8unE{&4 zv+jM&QaRP)GIN5u@RO87vwUoW*=F*5+_`XPTIim=UE9rfyUz1DFQMmrY zTgm+M71esTiUS!=3ADH7GX=Dn^c^y&Zo6sh<8W$uu4 zw&)YPyfoM1+O#v<6xD^Vr7+F(QJBn`V$|rPHsRzI2Q}dnDIF_h_&@?}KbBaDx)~i= zG3%z;nv_G6c`oYO*FW%Vd%+JHBGmM}EEYH4LG7`y)gq48sXi5x6swM(65{u^(J{TM zJ|Tr^l8?hAPDdjbi!xT3nGMRq1t}h%LpQ8HvTxERVGkph_|W;_SXFduGl^$4ZtnBB zFp*Qs$kA18#R(SCnG2Mhw_N-a$0$2~2H~rO0P!(R2a-vbj(_iRhii+{gWw{Y2 zS-?6cq_x0d!r*OvWoA0Ja$HU^U~92{u+H}?&G<*!AReD+np=r2@@6D z4xBMiLW&oc9fi>oQopf6Lz}6c=OWwnLmfO9-Gc9@#(^WjxuoUx0mn8A0Wodk*(c8? zse+0Wo{J{+j&(jB{hTii6>Zxj+>LF|{b6G_dg!1gbAp9I^3p_R%SkTV)VWS1GgbO5 z=u@=STrx>m@`T4TwL4D@M1!v%ir66Q%#yAn(9ikE(9xzXXFb=1<1C*flBQhK;TCSH z0O@JkynyZTj073sq~xY}ACGRuTN|!LSa3~CIuyinvu^W^F3xDfL~XU4qb+MC7M)I8 z>gpI);pTZZ{GhXdkg!vdlZOunsBm^vR^vI+(kO9>Cu}EM+l&JO&RZ5nXy0LzGCZRA z<#mSU*@UUt7dkkl3>}r#GLEqHN|erB;j`Re?xjDon0jX{5ENER>M#?@2Aid*(zYfy zhj*2M#-1ZAQ)V;>2?r!~JXmGYazx;u|Jlql`wj>Qb0u}`(>f8rFZ?Re$<}8@yJE7i z-~CD{t|YBjMpq8ER7osaFT?xCV98Id3aNLAhb(<8+Bu&axD;#^JC}IKlILdHrX;2A zoEZ~%g*PQSnfaV(4#8UG(%#t}nf!En2wN&td0i(>awj7D|yaz>g zZ189}%u)c-xg=3*wfL-0*WSL{@o|?jdyz_KN|1-Dy3wS!mF=lB9C(~tlIMrUwt;MM zc1c~fb*5bSx~^)8B1uk=8+mLQG`0I$UiG4o&}h@jb#*@vy6{9cTl>U_C>pv* z-`=Yu?3C1TOr-2;h?JS3OF^q_TvEq_vuE2vYuOh|C|LxrOS^J)y~~6y#akbw1Mk|+ z6I*}XjQ51e?pbM%_0;Yh70@;MzDjS+?c=6GTFFkSJ|DU{>kM5iSd&b@x5fK>=vMT# zxYoaWMuE8SgCwRHP~=;!Y&#Omb5n2WBe4F5Gpyew`Luiu<>lNj@u>K0&hAfzKaR5O zpYcFk_)k*DJxw|7`|IjHtvs6}J=O4_ep^S@tlmR20wjdFk~>!L?4CF4v){r<$%@nm z0lkV%v*W`*zdp6SQObE%L5<8}LzfUXzN-?8p7ThrFl01s%i-l(W$0+Cw&IvTu0g?( zV*fz&zKF+g-E(LaRzSB0! z3U5pHc&t$)^V%@cw#_2r^R2eUPs0^Ej<>v(*tC|(K~DHYa);T@s;&DtKT0gp{Hk{( z*~;`;UC@6gyEd5<6ThfT^x;~Wl5wavMJaps^oO9rH1KE5BsKwM=WWkrOHvN?@K{c4 z%;@^4?6z#OmXx7UO7?t?Ns7l*1sOcsGMXPVyQ@7o!6Gx$ul?DLjdd(11rA!;O-Sij zoT}9?Kl6jK^D(tKhgFyvJk=CVvZ%~#PpPPW=u z_2)zjSj(*SO3$GOS^WVwFPl z!=N^aU6$;Srpdm@?h+ZDAravq85nmi|r7$embPP3#) zE=u$^TfTH7!)M`y(=0iXi`a#v=A|Cm>{Bs~^Ssd#%lFq<(uJ6FBsZzcT24@Y>8W)4 zGv5s(NRg^$B+Prd$oX@J=)TlL+kJjawuMq&NJpthXzyB(XPeKHNSon>l_ zXFFC&`(&_1=1q9o_DpcK<1UEp&y0=)PCvw^nKR+g20iC(*WW0#@``O#FmRSBotZP? zB!i)_LK@Q%9!t}QCTgvUiOUWuT~o;9-E>(&P%*Ks;(6KTzLuVu6AYYL43w zGR8d7`wu_ziI~ILZR}ETl5M83V^Q0Soi;`$O z&fA_oI`FGK^Y4@tCC|;tZ+ir{8$a>jTKU9<&1jN$!JKnf7_1&|HQ(sp zaIWRdOa)8lDkZJvBlmogKVK2Nm*$}~^Tpg*^-o%r^<{Lw_3SCg39D4FbpF!tyElh_ zrm*jZRK=NH-IGye~8>lJ9ORWz%0%Prj0jE`JD>!n~2+mmWlX*yUnu3ON%jUcW z8%d>APFxK}F6!H_ysxko47}*fuiAdSEu0#(OTk|4#Br9NGZf^6k0c)|^SRNd$ehXcdJ%gikD%YmrnfUTfJ$zs zVxNpYMc?`dy#!}noUP9=PJWQ6SbaWEhizBPg6Y4#gotU z{&X5U=%@u8ZJ97bKnT=`*f;BLl0sXKZbA~HMh7RW;X;MB4y!eRvi#o|$|W|P6+O|$ zdDB2qx{bqN9it56)}u$n6?mMtd2>gAx~&Jr+Fr&y_j}V;#FdYpO*are&=oXb-0q89DTq(atU4~1Zv{U2;g_# z7Ho6pu)xC*RY>z@`q|BCa%P`5?2L?UvG@7V&iT*4MS2bISA&IeYC8_IluK-yyNp4u zEo1Vdf{$7pFv}o2kz(&OMYFe9~CEGEL25v+bTEEz>0y@z$A}Z?3D+O*5YL8t2cM`Dl$7Q;bhTw_=la-vjaB!?8X)x)m2` z&3zy){4VKGERW#TExhH1OE{Nrn059>njY56>>BIWVT6q^6sEHhFfi``zc64)=8$Q%i zJ8-mR%Zv$Pmk+fuiaWEIo5pO5wmOo%Rzp|(-kuL>KF3;4N+dCGc^e#?@b-(u9K$05 zGmPAlI~E`970=_jB9SE1E3FT51h+I>p3i|^#U^cQakt$CH&oC2TGXcR;eH$|p}!)z z)L42`iyOl8+t~KR){2^1%d786%fqpGr&9c-G0sdU!5wIaL1eN_UmGmQkXMTF;3I z&y<3HIDz_SETWQ04mC9&yU!ll_fgq-R`T)VjVjJO9di$RwPiG~ZiaT4A8$Q&wq++1$JS+M6bnzFb1aeP_p5A2kR3NU%b>FThT@!3?@|eZR!y0a&vfk{Wnvt;W zjn@ZN8(T68*B{+0_C4y39($U`Spna8A+HXzZ?|q_FTU)SK4tE*U60LTmT&Y+p8K%$ z){89{CF9a7=89SC=Ka+87@{BD&O9yxZi>*l?G(R=-tO~&U1XPX1% zOiHg@2@H1kl{GERVXHQ|v3ObkEW4~<85`W2ZL@x?IJ#Ku_v+joakKZDRp)+dyPm!3 zddT{falw0+{Yu-g*Q~nvt?6CqRHIW%jzZv-{KKlg>JYft=h#%&vy0LKi;LfEvWRTZ zak%z$&3e~4N`8XNU)&XwpY_n$xF+KmFR$U3O>M?svR;IK(8|hP*QMomb*)y6=^m|f zo^vK!sL!?GEYD)A{`7XP%%REq=4~k~V)2_L0dlCP2v)d&8$Xu=Oc+1tHt)-x7#>1(ZiT0 z^F(9Esg>V#q-L8WPfp9ZG+`m<^31rs?@iA3Ui2`Q%5+mcYp_JIDZlWfWShz12_RFP zXC-<#_jGG6o|tBG>COd^sy0QCs#(vDWh{~GH33UZ_-iI3&8B*G!4kz|N82`f8k=Pv zQ#*TOiQ?IfkM}QFB00sRc~V^(HPm)|}2M zpFewj)5k~sX%8-fop1ahqhnuD@`8&K-nzC~%o21rew5K+HsjMg&G+5QW*A+_II*qC zN#<mKq~G`*{Q2ystb&UI?VYa4U2PoaW(&F*AIdm!r6oGL zaEpY+m5h#MKP;AIbUbKYygAi5z2G8`o>Y>Gja-z8b9Y+CMS)y{e}BuSswelP^;{Il z^+yCRzypppEq$cw>fSlN=BR1*?`58 zP^%$+*!GOibk;&QV~`}T<)nF_Zt!xoI}UC}6KBS--JU5{vdK$*HN&*F9QNBY)k>Ce z&Yg34rtE@QZF4%>RFw)YPe|L4#yywk%1MWg<%(?D%n#?M{khCjBV}arkjMWVqtn@r z<%)~EY$cXU-Z44CzHPtZvFy8(JguJAsy8ysPkV4#;BVmZav_iHceyMMFG`EJB5*LZ z&+pj*ud@m(75i4lT>N@_HIuCA;YDp7i*=4W^9nkYy_l5e$#wUe=fOLk+!IzR9y-Z4 zcMHSJS&G5NVObpoJ2};v6PBi}xzaOr*2W-^Q1bDQ)?xRrK3o0Zr)>XmFJ8f^SIgJz z3!d_LMVmxbuAhh`L!9a1)zAFa-dlOq`d|M}sYR~;?&ls%{1|mPt5o3{&k?Cd1|R?T zJyzb3#&T`KTIuGsZ9i1{-&fc$Wp@;J9xs3Oqp!RC_U%=Vw*LE2IOCc?pk&4I4c2~l zHE$|LJI^{;^sXJrbi@bb;hCuSdvH$Ii!v0dlbK|AYj zH%-5F{*t;h5!8K|DH3$j;h5ST7d_@f4ZJsnb64y?7-xJV`$VV7-pA$aeB}=cIyOiO znz_h?l|4x0*r0fO5<8b!@_{s-8v?%CGx%lREl6OiKAW&!(bs~nol#mztKGTfY{v#g zx0CPr{=6&5>6^>i!+hJh|7^xaNnJA+X|2>PH+saRH=Rw{uu;;?>`23m2aX480yO1A zPO(qxP?6qb`(7c{xu-i=Zpvkb&5{XbF48=o4k+;Nv@GKhPB3FW)0WYkf9P!5j++9x z1s9$3`sN<(ZGQA?!49_hyoNT{xa?*hOn2TAI4k*hjA5p;OQ@gxs)99N4@5O)8XM$# z+-yr;=de|Bp_%fPw3b^n3Cq~isva!*u|@H0_`*4M1s9pcZ8w}h?D=8xgEyZS1hH-8 zy(x9Y@gz@{w98~Y%v>y5^`_+>+jKT!o1*Xg zEBkM3Q*=A&x-rKXEXdxfw9Ot*d}?&%=uQD$8DZW=}mLLCfsi8 zI91R8NBpIki}W3d=Vp)Zw3#e7Tz_mY?@p82l#A}7?{b>6m4Yr?)rmWXSVmh3Te4BAvd>YqO{VSsjrpg zj~_XkutSo^{0O^Fjm+%Uer5Ug{k($iORKg#YHXSvSYXVR*Re2vzF^1oK1O-_PlZSB z2>5<1+;gXA`s|NI&f8}4SeP?EZ+pR5Y;RQl=Z=7{VUEw832!Ue`=pf^P9HmRcE%3H zs&gy*=SV4s6YCRE8DrV?%Hxcc1qftKYpI} z=Z-*b#D9yZ{}y~_H$Hx~V3*>ow0AdlNk*H?Up*$UTQTa+J=qzG<<2H&U-hq%D==q% zmv-PT&yLxQ<<860=E$vB)j#d%!wO@W{IdyY`)5BaH~y37Q7q-nZLvqP-Td(fm@&o=^4xCmW>%>)C%jI}x!bdL_Qq1EE85B6W`6iZn#5g!LJPZqJhv0P zH{(Ph!TPj~<*_50YJ!hGX*xhJ0PKC<`hj_s1)%^u%t>o~mccd~F_ zs5= zN@IyUw!>!=cI*sKPJWc;b7#WZ`;Cv=GJ4FLAEp`H;c1(F5R_cp4xZ&@H9vem?Z<6_ zz^fNOY?u6J=2GC-+cf)k+R{bOuYLeI#N~a+sU6#Qrf*@`t|(<^di-1x)4SY`Wsxc! zxo+#vzSt_c&Ft_sP~h>&+fteRia*A)hot?2oa$wy?fDlASy2g*qE+;cUfR<0ZLmTh4+Dij?Y!3vae@9H_mJ zZCnKkvJIdhb1|QF(mE%%ZSC0&TNM`-seQTC6F2)JNW}@W+{4$>Zrl>copreRMw-BF zo}}51ImR8i9-q&y5>CuEhU${sX691xu02lL$n4>kMMf_0xJX-Yi^pfSASih52qc&t zsh*jT)YQqzbmrL+7RFTPS=rZ4X>7{r2we4WLaOtYg(b{0crS(|&-dh=E}^z5$88#~ z;M8EH(`_$SS61Gely7t(hi%5$6PqL>&7Qcp83`Azne^-}^FK*&K`zs|g2#CE>40=+ zwne?i>>j2Y-^n>P^Q^^Y$#k>FXWCw@=B#|Sa_7!=o;ouZ3*nLvHw6MKweIAca4C7b z!M4}9xOMi~g3XFQH>+x+&414};+4?n$4sYWXoH{ctZPv`p zv}Fw26>nwa{bJg~D>&6P?OsQ<^rH34&VAUf`0Li1+BC75kt(2q4OAF|GEZAaR@I!@ zFAJab-uxl~F8+M(^mNWPEQA(+dPbsYVToy?Y1=AhMP{4Xo|6$XGj|F0{W?=J|Jjb2 zkDFdSJ5#Z-)ObZ6+f`n{yxpv&d%k(<%{tq1vBa6>!ODzXif!kDi-T(qy+}K9r)P%r zrO7TvnonHVHrbZ7?o4{!)^W=2Vu^82-ifCU51zKYIcfHl;dxrm9Rc6X9$<$YEO543 z^icPhVe{iQpCjs`vs%T)KHoef#I3KhXM@S-n}9=jzo&6VG#ExFsXMS9a# zh9`Fg0(Z(YO+xnTpoBGXuGxyA4o@AM)Q5q$$4MyOvqI`eEuxB(qVqymeHjuHZ3ATsVdK-I8?*r zW3e+!c*eA=+*fC3?2_~~5BeZ_bDjp6x%g$8$=#l1voDqy&&mTWRW^N?w#ZknYm4+H zLEn!dkbu$EQYbfmlGm{;bd|?$#aT&*8+J<;n5WE6pIC1EDbMX5uc6m|bw)_VCB10n zvKg!odRMt!=8*x_Lv0xo^AEpI`*C-|TIuk0aXYJ0pHH0&uH|~RK&qk>WkR7hEkU)> zS#ZUe{JM=}-4@oXXL&=+A3twe{Zm4u)~u$2T<=8yDoU zo#Pdpe=J^HCNfns+$`qm+NsjvPqUsL+iG(B+#C52^Tlw#I+x50 zPJZ2%qq{&WO`CcBsvE1iTyLF4q=pI4W`#a>de@dQ>uPuyKe#g9a^h8X@p&D-{9_N# zTI^Ar6~-2xS}>I@pu$<^!n5VdGWUA+NH5*RU?Z1go(!sI1?HxF-Kv?kI%%6$nq#SR z%j1s=KtaFwWt&8C@nmgKcIjQ&yyA>(wE5zfZ7*c+vz-D(`0CZ4M77La-iK@iH#D3< z?UxD5%5`>c%JBhJk%0xqe{$QvwWj(eUiOOFjQPe7a@qErZP>23Xw$>Vs*H1PPsm-_ zTQYlMo-@ny9Uj{yZ<;CJPD{DnlOw&!HgH0o^Ow1gnLt%CPlfa%O}FZ#Ez8qV#lD-l zT$U04ZpM7CjpOEYY(Di;nAsg%G3+&4e7$WA*DS0K1s_Z|{*mK0m-pti z@(-I8*;XHOn|pS}X30{s#plwl-0ZQM4RZ0O4-DqBAEp`K$!P->=8}14he1vI3D5Q< zUxL;HX>)G&7|$+DGd>5Z9C*{sn9rm&-0abrJu%f7RN@AJ=ISS?uv5wj@>l)1{Y zKx$Df+szH29wVD4ub_jk^@l@^;(U7q+)W>^0L{L~TtD7Yj9x1yV{{-wy}!3YOk{#-(yqAaLjX1Ap1x zwJ(-Z+My-pXPT0AC^m{Q{yvL0yv`tvhUc zrPgmClN_#Tet3?6v~l$maa% zTip7rwMyNOale;Z#QTr?+bl@Gb|vTX%U$pUwvtV|-6{mU(Z+Nol0uf-NyODW_!^VFWcdd_3J;x5%x259M`v?|7M)uQ8S;XOr1 zHFOs|Nc(Y{r(RlVl~CmrHn)HFX4;}VwpUJJe2{PaC%2>ER060EAgvU$naB1N!{S5b zAwT+L-f$5t;}divt#L(-ep_6AlOYvsenUsDv4h4Yk*FK&rxydk~FbtlsfbLQ`DIl2i! z$;?07GNMk+Si)0sUx3$J^2WZ(th}PuuV**xQ@ph$tm)nCi?z;M6jKv^x80tbE+Ta1lF6P{jq2w<98tXO(-thVi2c(kmGwT) z_+}hcl$z$J_A(`F-ueb3zKhJ2tQRd@_?HMLJQm>fRuBGMb5v#h0h#uUTP;j)Ef&kB zZ+R@BdrB*~`0yQ-^$iN?0#5{*O`kV7oD(=9$zMW?c9wElG0Ym&g~fy@8&E!7N`=~@j}4XVEU|-YbX5~cU+V-w|eZ>Zqlc8 z{*dSMlRnv#N)IkI-ci!gmU`FoT5iB)$t){p-}DtP1#BnOG%j~G$uVlPm%S8|GU=m= z&~6H zD!J22IlLXbp=;vIob$UQ+vcTaY}fO7J1g&9SDPbu;)25s#VQ5o z$BEBx-pMoD?tGl@=DhOFHMXa(-?%AhZJnInF0pHi?d%VX8SOs47PcFXw5^_7xYhZK zgV21{!YOZiHpyw>dxk16+*l_PK=H zinFrn{vCL5PU4PavvqPoyTnqEWt(eykIQa~y>#gLxgU2Fs}$l7m!!{lC%}99dd6MF z+ng_S;un{uZ+X{qZSKWg#!=;Nug_)NRg}7y=RM)#Zs#u!w~oC#cjK<)ZtLXo^f&K% z?#gcRy{&Lh@(9>bAc46XcRQQtRG&ZF>pkI~;;d=g(le{4ZDZW$yhS7TaCJM6uZ6Go zZHxOLnZW(Vugcy2o?CH$=fb-5EAM-L$u45QWcH)HL+okxhxa|#<~~o{{lM&W)qy*e z)3npAN9>ui~8P2m@pO;LYYmN4l6sbpRni-t2o%Q1baykWTRv85&*_(SDC#I!$L#Th zr&C60POyxCrLtms&i+WSK++k%FoRAc-Tq3#Vb9v!ECFS&#Cp|qfi+G>E zPs&U#T%>pQZ@I-uNp+Ce1b8KJ50FcHyoF|Z=t_xuj|bA{5cHP4A*F z)H<`g*ixZs@3bp-M>B)?ZSIQ`n=RNG`|K*Oe7MN2m+I_sug%(u&HZ6tHiPYpqc4xX z)?AyLiIGVkd=a@~^dyQ8buU_ab ze%Slknm3)>OQ&NetKoKqXJSY02pm)oRA)@9om-ob=QkyCd3t++V8X@SuG_`_Mqb+< zv#9AtTh6kIkG~xHmZ;AZF`96C;+^+#S`Fm!{P&XOCg(+U9Uk zOykysI_Y;t=QY7n4wuC;ZVBibiD}&0^jzcj;cqt*FNyiwYVwp;lBqwqKv!Z5YxA~- z^V9xLlZ^<-;O5Hhm}s!jR+wqN?uyN;`}?G0gLcgIrq@!7c*|NpMFqq;Z~MmiJ?cRm_nqvHi9S^Z zk_`KAf41ImeZsTVGfZu>XZ>EduPr0%8k=_u$TY>Xp&KQ{@3WNXHmqa4VCr(^D1%t+ zvqg8sGJ-xta@%DeOy{+n*m%Z;;i~ADtP|JX8-#N|%Q_gNJ7YC#vFVdb@*!857DO?G zIBye|oRsAlq&s0HtM=9fi^WQ=2n0&TE?@Ji?{+f#q$r0VZmTRucixNF7q4&+{26=v z{jRrq?5wh;E+MYs9$Ac@yn=JY%e>b0iJPstQnA)>8OKbiMZ9qwAhWp}vO3JRS?@WP z-Mi5v=4#VwsYNSwEWB9)bQxAD-d@e*xm981v~@3J4}(Qm9kw#85PNcELfQr&LG7&x zOU2e)X_^|95a?`j=I;l8kVBcW4qE7*SgLr)P~*TQrids8Z*G^&m&cyXmSvT2ed=>! zDeKBDC3lu3tKQx6Z>ia~?kB9tTMo3hSzM0!ov=vpm+|i;3&-P3yOv76Sro0qP+{T{ zB3`?l%hBVCnotU3%&1 zj{&m|&bri4(AM#47t2E)LBGFD2O||MoVR_I6-)2fw>!;_^BbOa%er0#o7qS@%-+iRNV7lV12l@)r6>o24xNv&HL?4$BZYy^)=0-`S zIVZ0d{tl_!bFDnC#63AB&d+)cu2=%1}mqrOYj;V0plf{%PlNtZG4y_7ITKFBNCxS@oaeFNA};F zWGa=vr84g25p4LqFj}nS^n_*QK7wyI$;^Bd*jtp+1akYPgm|$Drzfb*c{*45w)1YC zjOnazH!X;5<2cT8QP+9aL9LVzy3Sv&=I}k+bRbGB;xtosWP+~qwyhs0YRc&f%btDf zpwImxm2t1mg6WD;TPBsrY}?87Y}12iv6|CO`H>Ae+!InAH|SiL%DQ=z$(d73VUY*4 zxFb>-SL=M3!a8r$fj}{fQ$;Duj=x=dpS5$7LqJ={;oynt+@Df9R;&@NG+MIrM1_t} zs^cOaK|e<}hsX))&esa8Zk{6;z|L08hQ-FY}ztl|`tf8+yAXSGdcrIK;yHyqS--WJd5mFl>XM=(a0BTUjr=%A!o zTIz{!s~J}7BurIoTFq*x?Y!mSIYAv~mizb4iLd8vZ2Zp7-rN7ZM&^r=OYocB=@}$*O6*6CxQ5owp?Z>*$UwFyz)tJ9t#*@3*+OOcNp*jGTL1 z47gq@>cT4Q^M9ON;OO^jFWjzj|?XY03GI2d$mI%z6C1 zF5Te^kL2uvTT?g;Y@N3xK3r#h*6jz6;MD)$FPokJCd7Cl{e;w251p$IYuhrMANKx} z+;n#HUX_d9LVMp_IL#-p5VX2xf}?l-r+el*nGCitw6#ghi)oaODsbk`%jgI^B?{V~ zxRc3li^@)=lcEWW6v6A;H`(?cbanPiQBah_2YLX38 zy3``gN)_2{;*paA4E(r{WgfK9l~~UDcuT^Zwv1C-6in^UDJ&3UxgwD3W$XFspuO&o z<*fg=Jec2R(mZv>q$4b)Q49RIuVi)1e}y^P0xW_{S2RDa{p80{+e{=DH3x zx*f|EZ%eWM+Tt+3%_3@(&!o5oaGMmPfBS6WIhNV+Ajr*#`G6tsN55{Rm22ML@pG6Q z!hKhW)D?33obK(B)I2fHX7>|EMwib<-l~%w57|0Dc?Pn z4yfs7EMe{4vS6Z^#3h0F#Ltg;crrWw^;jMHc+tc8OZ!gs(waw)GH+cg2Prc-BJjgP zBa=~8cL7Axv^KY>3m(obn?0I93~rvxMnzqNC5mmEP1L!Lv&!inSj<{sazx!y=U>Lj zHKxXw_v~G~ouR*tCq>0rupu$cez8K2SjNQ(Z#$Xvq>Ka^cgS~Tboj5DV!W7HnD^#9 zjTMU&4;5PYTx3#i3JTHwmvmEkC;tFcJ&_K^-PDJ8ALXLy7`z7hk4lGLK-XV02TEM`pxMOE6i ze-nSEJ)0ew$!#6=>D$cjP4-bA+?{3AOm%rOJC<4Ggk4@V5gLVCP8N30+GcQX(K1&p zU5}-#D@{_W-za!HYe}B)P%{$t{rK$A?9+ACp(1gyAsbyqyR)QtFVfz0)dux zbFw<-75~|!`c=H*D$~p;g<$6+iO(m18gC6t+AJpde&qx=+CWV+U4@m3yN+J{=+FHq z6SQBgnB~fZuan&lo%`tT{N>yyR-P=6%hp>n6Q6Hbq1d#!c)}H?Nm7e=_2RZ!8y?N> zH7q!BMIbj~wws^siIuEITN9Q}YnvLy6|Vng&x$1O@Z*8H7OPktOkE1PC6^kOt6UZ6 zHT<6RR0`UPYnmgabmvCP<5vx<6c24ImVvZ3xf`+^{dhAEef)Un_{3oDl&nS{-3==g zA8p7mxiUdb=Cqr;?u!+yvZm*R*{5h8UeMNYs@MDRF^3hbj9V2Jw7ogmDB}s*jW%1N zF@T#X%h7>%<_RB@qxB0xCCZ6wfd>B0T!MWc!;W$1MIG?vUX|G~FaP^d?G?*duWnf| zODyDaQ*u;+k2A~j4Lg=9MmIAV=rSy0-MK|!dRxb-DDCXEt1?6`PuR)1-0-OBj!Z^# z-4)9e*$!lAFJ9ZT%`BU7#&X45Az99I#a3Kqf|X)ozn|UM`0!NQ>Zi;KR|ISmPEFMe zUlud7$oKY0+oUAE-s_+@?0?*ri)D0yllm@@4efdSIoP#Z{)| zQk%B=$6OV#eeh9ZwPMwQJFB1O6kOd9?K}0E%SNfdwQdX6h)ucLv`I>7)zdep{u_ol z&k}aEI}ihI%Wq9sCwAs))6OV^aA%V{YqFBpwY_M3!>~7MK{)r9tj0Lq3#(bHwwk=S z$^;kUy~wP|+_+U?gBZ)T2^%?=vm0?TWjiM5a;#x(G<7-ri9;aUcWB(oPhL~Q zSE&k@Tod3utrf9$saf}v(5jV1tRRzlFEZa;xay-|1oxM$6J?RhwB8#+`WU=|p_3Zo zcm@5|ttc*jqtdD68IpaqVhwBmR)&pY3fGv9L^VV>&k{bWWNMJzp{VhEwN2Bxs0)$Y zR@olz+b)Y-xW;r#3e@(7j4y%erKh%&vK@^5I5`30@um-evu1dkT5iUGQf?5+NQ)JES+>FNWv$lu~XMzqvF|wr|Tx) zVHJ)}NOI;0d*{@xo3W8q*KCR8nmes>(HD}Pzc{>O>eXGak=0~d!!fsyySFlYxzPlb zQDcV7w9T1SP^GYN;qkT?jV)!9E^J8VF3UOC$9r>GuFg#X+X)x^gl>7N9iFLcv6(e} z+k-Q0IojVRvy^XgD*a^q_T-soDyJPUwq*ovvi2-n{&w<3*2!irvzJ+ede&wx!Iz{B zay!hjKA-g}P~R-~*qe%I(ZLU zIp`Q1p*tt9yii%c@PU}fou;PffC6r=ypFcn^Q--ZWF+z!59=oEVCC7~@KDU)4pUq7 zfdXf#-%}p=E%TkRgH?EY!Xq)CJ58O@28G;ec^=90!%p}ui%{Rs>HJtM;|^1A^nyZe zlf1@byqRx;(~h3ty~uo7zvWKT1nEVIlMNT#nQ$!7=a`>bvU=oqmDh(}h)LWP;Pu|8 zzTacctoVNaBBO122e0Yg*u@&XJ>hj*MueN)%x!aLv6`Q_%d}H^5xbD-r98)5x*oe( zGtFHNdl%pHyuz?Yu}UFuzDkzGy$Rsu{^zX=?oDuk?lS2-lk!@FW1r%zY3td4R!vyX z{!{Ag_60x1Ozuy()pD8nr___}4S(8RG}hRjxISS&>!o?Gxh1(3j|6zVZ#z%k z7T66MdX!u8*6~)G5#PlPTX<7q+SGEHrQ2ULZt2aB`OwR~p^(u`@4zv|s2sHg9mf=J zO{>ujPLcvwb!#$y5Br)e96On()2EPMLeabKH*p1=u3sc+7gF5C%g?TMK%k=v-q z(T(pS^G_)SOP9lH%MXh+Mlwv|b|~tQJ8{qAWa@;y4<~WQ6g7JDWy-jk$)5>g_mpwo znV=!g^R#K9%%ViknvA;6rZBx`8|xEG7aUKWuvVet^npe0&sdY9k3Ca5+|BzjPFxa} zeWtg$i%VwYoVXTvA(^`hl&5}dV3jv>2@&VB%Q@K2dvn^Y#o8S5+a4SiOSr+r6Wx%= zZII*G!fV*@>{>o_JcgSs=U{`b#0JG%1-%aY+j8zoeBHWWpV*b_O~0bt#My6TGgk9n zY+Id_vySV-bphuB#vVO}57z|_UR^n3J?k6OlE@tw4i#ibJ%yS^q#%%e=7bb2kx*Z!7`6fq|gmm|11dbo&OA zdGv!c=PwSrT~^Tn>CPrLX6jw1Yqp&0_mp15o^>%$*J_ok`&JFRTuEsQrhr_=Rk{va zSy!03@LyT9I7(!%nakm`d%H8XDON2IJGzPYBJ);_O}UQSbWdzkJe#>jqZN{^7l_G* zFAnZzx+B(bd&09l!Bd#-i5ja562ltNA0|sI%T|Hfw1f5>o@ z(Y>&UHEN4Px0u1jCMBs$U-}L&>=3(ip-Ci4!O2-Bd|fL~)CLFVZJE++TNrA^7My4L z61l*ZdrNx9zYUUC&P`am_(54)$6>DmD{hB$#=ANhvsrUDFUW1n@s_)BmT7lnf;sn@ zw8on{2D4csHY;R_xtuk6zx}!Fl(fc6Isvm-oi`_Bi1D0lS|}NGvXjSm$7zoTM%*!= z-t3MUtm2y=B#FhGX=;g-Vo77%3mb3{n{is8Q0Lw`u8@e+6LxYwKQZg2W4PE0Xun-X z_o}*9>WOVLSeNKDOktg{i6N-%MZcsJLn`9}9fm22zVCm?f`XADStC zZuzs>PeJ>SDj%PbPCq@z*n3XoqcbdyYNzjPNKFfUvLsiToQEs8Jh)D%x&XQeHko@QlyIdZ3kws`tAtJT8keAfQG zj)iw-LQZV^F-tM($^Ok&h1=3B&CMsAxl<9Qe(u$g$hj7qU(9qpuTvGKo>bA6Q-6D& z<@Yl?(@P(nIgnoZXpNuCf1ZmQOix$dTX+BLncB2>#>Mlmb{hACh}HA2c5XI3UAfZN z!Ztwt+@(Wn{N|*#N0vpTw7bsT;lbtoS^BY(wa%*}u9G5EI$bA4TQ#O`xZj)M+crx{7-YkLj zUk~{AcF);-!V*SA9E@3$pm%oelkTNwjs`t@wEWmnu4hWRx?u+5H!~;B6}y?4DYq~_ zWwq~=`z&d6cx<-Iwt{KZCATTnA+>rtuGN_%xLNl(ggoWu+A$_6H8 zL|N4xvSY;^@u|NrsT^}nicxXf0cwm$987mM(Xmgu&}Q;{Zt6_ex+62j=5sk`EA&A=}D{_WHSk^%=-H4T}+NMih$}WzUkOd7;uidahRLnF*<+H1vnee8a zCmwD69w(!E#NF!sUI{1AkZsL^&y8;n7mJE*J+vr{<;n!xmmLq-5ArXPYq2(Ys25(+ z@ldwanycW-+S5m)5(Bh(vQBjJ+%9mxYh|UhSMJNBFOR-3ePQ}ycj5K1ZNJtytPthc z%Cs=-$Yrk5sD*ycF20M@*fYB=`mY~KeYmOMrsL^jb3ogIlFv0ge|95vZHn`WV=*qe zR*^h=JEB~44^35z5nOH|lFGaMbm;We`@#;cUJTxnypbIrlMd4*mVuI)?pvF+H(V8vU(t8`+qDH;+oY8IOe5B9UBBzho(19BU$R=` zcrEh|8*cvV`M%=Tyyc1;!dR|#9fGKTTUnlM!c@eI%j>aV^dUMnD(hG*T}URs}&y^cobZn zu#j{4`x@c6t%p{F`tQ0$fdyB&)=6Ee*}QpKy6@*3f7iUc*MHKP5dPp-6FW;WxwEVYQ;XJ_&$+2D72!Z#-{-<(%2yZ&8; z>ALKrrE7Pr6TQCm(XO_h6s2NeKmH2SSJ@qM8(#Femg`9U+Um5wEk~Dud0Wzfwik^` zB7$ZqYEo%8WDmdF_WjJUY}*HqUu;yYI&j?Du1{8aQR26|x$kH8UavZEe77I}jmqWA zT<7v$GzfpsCw1?hvGn?{4Xeww;`ZDUuuXWkVXLB4+Pm1~ce2Iq>({>6s#ta4v15+2 z$(dKyszuvte<{bkZWNMyw9V;G+Y8717e%ZGa#?rqW}dSSHNBMUx{LQB^UTG;$&c@~ zWkjsJYr3>def@#^VLxtj)ki=0$$zUV=l#I8kq zf~Pn?29-#6T4zKH7HcQvbr@=2vVO^Hw*AnvHXmOL-*jK^x&^xwkHu`!c<%TntmE#4 zT*qsktrK=DRt0=<2))1ZmGw`-R&$r`t&(fraGr}kSgCE1-(l!IYwnWH8_|N*&a=9G z^jJUfUS!_6WwQ6~$%gYya>_1vuDH8$=ZTbSera!0uDx5rE|jBwuxuI6UC-`Ix!a%K z4?Xihz?XlPoQdwwvPt>sKg%ZRuPFeXC$%Nzj_0wA!&@geTU$zG??~cpfvx$3AK z-$mxlQ}eEDxpHUbmJ&7HyDN?ccKhCXr{;V5-rP5LPu`pRhBrrMk?T$AXBJBer+D(K z*-kiO?YU<%gkYTLY+_^Hr!>2Kvz*7H6(>bacP>(E&xjCW_XjuG*@O8mGJDE+SsuBd zTIljrfLFhF@rh>+rxmLdIv?wX?|Is_J%)eM4@V*UocB>3*V&6yY(ZQ8v_RW$eRp)8 zap70_*sRj`GRAPOvx!cp{I+u4BiXhF51nd2=KfLWlvgSI^1SO`4FB!)d)hoDt&Qsp zE{L-2I^+;8@j`&t`w_e6p9^aoWm7&kpSv~l}7Mq^zB6g4) z+~@FJ+@Ml-L(lnov+J7XH@r5oi!yIY*IT)CZ!(uE^~gPx8THL=`MMWZMCV!^nUVUw z`AzMFz0yUcd#*9xls>SFDI%QVHCKY{qQslO6{_X8oxbofia!OSYTzmYOgChdUf57TcY9CM`onvPkGz5 zNp{i0J25Gd{3-c7@461kE@Izg{-vz-9^b`+Og*F1g&m;vB-PBt;R)}!&VVfs*go@3 zLg71w>cb`BGv0Asj!oR zQV!~Nv4b3cxHf#pdja10v$}oE>}S}>gJPj>!V$rP;8;-kc=$q0$|lRIiViuCM-h)i zz4yq0RP^b{U5ZKB^z&ekRHls!zt5V&W7_8`I>b~z9xhuvxnk{0&&!i6{#3Ne^Iu$~ zQa52Q|EBMWS!~%td~R}}fSzUJ(!J@sH^pQPHGulo1 zlJxr0;`l+z>`vShcrN;AkJFs+j?cFg&OP2Lcj8{dbI}ibnC7)h?0VB%9anfBG;hmS z1wBU!e24+~%ogK|%r}2)R3BauF7cIXvD~J;Cq7)!o>v93D&v)?udU1BP3GIGPJB~h zj$E(sS~O*E)0*}djc;nF?Csz5J@A{InfFTf;zF5kU5DceZ)o#XA5C0u@kUW<+TQ-# zz8kglszC-7yiu%Ds9wA&Jmi}IulzE#Im=S>r+gFeJ$>)N8__woF5R2Hf83!fe(;ud zL^W&n`h>TN$8@Tbw}kh66X4B1X)d~XZ_>8#GvB&y$}M6CTYBoA`_11w?iQ=Xy>5KN z`#LW1uJad%Z+55dDZCebVw*Dim|kzF+*N_fOo!``VwXJ&Gs(^n9aH z&3vdmBkEgQJO9N+V2|wFdBW#V|0eT@8rJUh2_Hpu>_EOwtFbk!6nndO(cbWm&s@oI z{dazx=oLKmdZMb_Ouzeo;u`y74cBXjm7Z9-e(&dX;gU%{;W;n3m|}mwb@maRz4IHN z)UTq}*mWCDD^BHDaP43c-_1DDy^F6}`$U`(?cSMW*q-4vvH6V5qNAJkYE77>9aQX^ zwa(+L;<1=(V*2bN%XdC9Y0p{Db>JD-jTpw++6l$1Iedm`TlxHoJKAPX<@)iA>we6` z+1fS5t@-OdoE62f$s>sQ)RrlXcF{8y~@MzLSsnPe62^IU*8dc%wMXR||JE7*k} zc`jfZ@S4H4JtJc6<>(DBw%@)P_UC!m|Co>Swf_|#tzWk{YI*qU1@_@zo=+wPlMAS9 znaZC~!rHU0;i9O4)e_71ItgF2q7XFasj|-Fh~hn!a@C#M zo>4CjiN@|Y#MPd|ZB+BHOJ7E5&P~-d1sxAQ3C=5E72>-YmvT}@(AXm7?~*)E{gY1w ztadD7YR}lebGcIC;Um10r%arYFv&QuJBMGaQ1wikFDDK3Obk%FBh8cRipJ$^Tb0g zOPNi&;=;{NN_>Tniqsq)ae2rnS#USWtjoL;m$KlnXs*Q(_ZjYwxI6U|c-u233NKk{ z`QE2ZNWDRUFY>UYoVv#xg+eBWN4FR{wG|3G%pw`|3XiI;^Ee{fY2i|EdG?h*$7c8x zOycx2+U%KTc2b0G>5fGr;Zq)U1<7pstFawSTmg z;hE^oJxa5~Q$BN@dDImdW7w^oR(N7t)2TF}nTHjn+B2FDGfIaiJQnaZ+;-x5pz9?k1<-52j(=lzWzzNfQ^Z9EcPKdJXY*J{?Xx^G6AAaF6S5?f#zU+H>_hr`~ z-6+#u7IU#r`%Gc0eCofs!-D-@kDJI|yN-tdHLLJZ?1ZHFRO4?e-Eyr3m?vaCWoos_~oo^W-> zC{A={d4AU8gea%wlAR}Z7>X4gb>b`BGNUN%)J$n+rErHQpko>o(*AY##7vy1ZB*py z#wR#c`ms{GN&L|bW@#!~&O4rPO^-uKNEMh++>%22bBb?`H z*TNXXDbBMFuHxD3(y$>$aGLg^qK<{$%m+@1Mp!P{$ncXPV<(et_=2aiLfa}%i{@Lp z9Ny%3&n`Z&ahmgyjhm*f&2iKW*8mw4I9WTZ=)|^t&VhV|TU3}nJQ2v%ur{2c-Bxro zfbV7$!?L2IA?s$GQUvW)?&L{P2^P*%t5VqOpxyqW(MTe~(&g~Ab*H{Hc64oz`8ZAc zUQvf!#E~XYVI*3%Q*7mOlacJL`uQLdM?CW&ku;fdl4=M<|FbXU*t6tP@CBVd7jyUFvpG7)Q18=cx;G=^{p$}UPQ?o(o(mgc$I zqm|*3sKYL?*YY#YZJog=V#&T>=OLZ;9An8XMXh0cg6>foT_p>i3f!Hf(j~Ol#9aCj zw3YR7nsbeE5Zjxg)>yuaAHGHI>Dm`_ak}=eBG-66(1Z-6Y~HamTzb(?CzJLUjZ*@b z@H9N*x)8%SOWUFNgxPr~lkkpb0*n@RD#b^W)n&rD~M%S4q0bDh69Ome7L$8jFC z=KpPi;C$^z#jZ7c&{GN1HkoQ1c`lIa#r@;F=zmL>;AL_f&MVHkHGfvYttny-3$-;$ zSX|UH-(_S8{YBpJ7_D_zzH1k-3yxvFm!3g8Txn@Q{~XTCsskolSIj8$7}5 zf+z3?EY)6B;yQKRic6w)yAHXB|9CMWZG#a5$dGjwmlS6u{h9i)*)!bW<%DOmpZ@GP zFM4KYlVy9x;VX-0rG{+gNqIJ5?fp&hU*>CjE$}GN>C%{)~l}mtXQ`XiMv$PeA!&9Dhosrq(YwK}VbmdMZ)AkpQ zX983Ew2DKDS+6|%acTQAK2Uw@{N=!sg{PE50dY}ddt#< z|BR8qJncip9c|N}t(p)g0E);CIS+k@^P(?yGTDYNcs}9Tp2=~3m$*L^v)1uJPD`7a zbKV-c3g(;H+2(7TFduY$9=J*dMf=W2_U$5z5`+0~JO|GdPU3}1DYog|JYW}oqU4J!=FjI^a!8f9f>grfK4kNr zc36I8PWdwhWDT(w7dV^byeiCkSHK*__c6|X;Ucy0lqX$1F&q1}Z3_L4i6i{Q11?#aM;txA7T5U2Vh%QG zM-;Gf^If!F*T)qT*a$k~Dds^JcT8cUGtb<)hZ)0V9&j$Fegv;JJGuwV3vxl2J_&ok*uF`{=Qu5CZ`D=gyv z1n>zFA)9OiKh$W?%Rl;gZN)y({o5aX5BqbE>rQlIwez;R_6N~|HO^a37B*IE7v!_P zTYF%y=tlDt>)UPb)&}eqU1fe`M}&4#zU!N{9bk!^Lz$D0JADmXaj)xQv|*LDTmI1( zYbEw>P5ctp0}=|X)Yi&(eY$qV9?{J0O|QZN?%r}J)t;5tdU5TKouc;JnVz?G9Dewr zNINdi7yIk{<0b7{49ql+b=g+SVL8_2!;aUuua-5cU`cVJ%st4D54lYSG z$dvpu&CtWFdFSZ|+j|^eNzS@r>|rahSFs9wa$W*g^L^<>iJch|vp)N|Nu5b$E1r2! z=~@Dp@r*+c7}_%;)=9NJ+cS9!NH`{KLx<^!lx82Z8Had;q;?f}6yKY9nn&nXf}U~2 z5ve8H9jm05n1kl`{LfaV>lvS@YF=Z0qN-W*OahnjiOS|V<|ir-Uzt-r>Au2G-e*S5 zG8Quq@dQ0o5anBD(9C0D(*Kyx=#hdlpOMmqq7FHao@UK63if=<44gMRnVp#4yz`8L zFW;pn2qJ;Y*hD)8Bwo$8>3KqH&IA*8&*CW{!lYGlw&;~78+S5Iz&t21wnyL>3xPC^Q~CN-P#%DtZ&yX zxGTD4cT?GQhw=gezCYO`h54Jn(#UA1)Qfpc(~8m`r_xIR``<%ZxEMxz_?!kT0Kf9ai!#}(S zm4z?eXVy)5x$uCtNJT5t`hW+bTzi}vLAAaQKX2T^gCITfy03bL{%9OL+ybh9d{4i< z@IbN2`^sV$+g<4le|8_L1}O)5&*Hx5rQJ=r;Zxprt&aV;LHkPSiL$#ApLZq2g`aud zl^k2RMq8@Xbur&Xwqp6&rWy<{yJTdOrp%Ex*u~@)e&7X{L@eWC(87?31@9&nGsA_n zK^+;soBx=)WMU^ScK*_UDtF@B4Mq3xCod-S!B0c=-2pmHSj}ki=?jdDq1xB&R0gRM zuzhd`R2{>tlr=Ja_@$xvuxI;=M#+muHmJAR8oudF^uJqHWmEXBv)F%5^`kqJk1p>_ z^yjHgx*>dc9^Y-tn@4u4pR)x^Kl2toJWt{qSfgoqrY}gj@bh^V-&4MsfDHoax?EU& z4@u^iDMDtW<$DYBY2`;h@m*x@_D3?yzTO96Ru&si9L!~BedC3nvkCHFWIo5M8K-zu zdr3t{o8-4Cvp)9~EB9XSEN1R&f58ZM)YE5s9^aYqM0E0=q)FjEpSnEb3{PsSRUTF0 z&pcX6tV}6TNNYa(MZ( zJ(JgNIIF#_@+d@XPtxr6j2l;Sq-K3Sm-G;9_QQFgmZinaSqm4mXYAOinmb8fJ=nPC zOV`9W!%NOQcdzgm+PWM*tD8A_3fG*t#>>uM4qV}JvvoPVEN#In#j};_lFe(vCw%4F zB)5otS=xlxprMcD&!(9$d;_^ zR-jW5A39e}@=$9H0nG;*Q5j@J*B-efhO@kf zPP`T^+Uv9~{KQwTopOtK{df<=G2U>VwZ19!@rHKLC8f||CD8_3m*BI$@e`2L$8Egk z?6TE_ZKK?#xpI)GSRI#mMZ2f!sQ>yOFGcP5GA(a6c_^W#Rn_XezTk!EzdeuUg)jNs zRT4Mxob#;ip8JlVQ8TW>IK^|?M=Dz_)`N!9Y?i!~&2BbaZ}3d?*q%c(+96qc?cxJ7 z!X-dsK_5?R2UNOhtmk+tI%|*9Cas0f;~)q;Ril)S;#HYyv*J3u}ddT@n|-) z;Ch8eqAq)yI>H4$cFDzEJgi++;mXf{@pIZ#cH2FR+QYwmfC$G`beNstOE}~_YyBY; zM*TgHTEq8z=n{|nc*xl#wTwYHZu+ytM5u^%T*Xmte#3~(%}3uP7+OaJ8An`hIck!) zaouJQmhPJelgc*Ckk#1)qMtl-nJ6oEGZBT@-0T_@@#)*F*p&98H3^AdLFW_xJ@iUE zjK588QTf)Fb9pwLVCd%Apz%Olj(@S-B3=-=X>DM_RqZvu9==LqRID!gcS7{VM^UaD zqG~rpvx@el3hTwqe_Rqiox8eF?8xepiG4A8ulXeQFthQ`)RVt&#~`-;dfwXJP*5uG zWSB0cney@Dm6p>-H1y*{5>KSWh#!8l>-5swiPmK|`eL`Ma+J@QDtj%t{m%`@gt8eu zvJ9#1n%5cK%OWP9x@87^vJ+CDEz1*d5?}XCpca}JYTo-I0mNK)Fs@{Sxa=EO z_Ueo1OvS%uF&CQ`v7aklGl5Tg$ziUS8=S1xOc0oV+b;fMVrxl+;^ublbbfKUnCa|1 zH^7xyPF4AV2HOvv%=0Y@nr?3HQk=d}IlSHC{g;~gvp$~__}11?ba!D)yTyAwTYk%l z4=){ix`gkh#Fa%;qNfy{-W0cMy6JaU&Fvab#iTFlXzg%i6)(y<#G9fbJo9AHL|gS6 z*%j*_?rq!tY@fz&G3!e$FAm1>f2%6kc;5Bx_7#7{w#J{h({j1lkKfAn#g_$_oBLu* zrQVs`$=soRyI`(dN!5jyj?3BS%9XU;%lxt6VRPH|Z#y*v#91FLa)=S>=ieQ8mi(; zpDdaZGi6eDkkO|T?$E@fOnH<%k4O34X z3{zr{?v%+<6-s&$c^Cw5|6agXCc$~Jc@29c|0cN<=kro}QhHMN?y-xm|GMCXBPils z`MVa1^MYXh^i;lWDwa1UJxTDM)U502^ksq6FV&ytcD)SZz&tHC)OF=n0#;^&$lZet~y96VMDVV51VyH z#f1+G9xmK@g3VUqOTvX_M}9V237&kApyT1>;)%Ug2CojTU|%fPQ)M9aYsJIB!;9OF zKU0$ansB8#kl)Q#;%kD@7th0!+thje&$^nuJh+5?vYbzq!OMdwFTjFQ^JaDDTxyQw zPqUrzHDT-Cn-|h~&r8iSwJ{gJxrTkS+?gta*9X_IZ(ev_D$Zn2Mn&ei-LCv%wh>jG%ZnV&m9u`Ao$Ce#uy6??w zPeK^kwj}rcnKK7noq1{vz8t*JZn|S3f191euWw4bnZ$W7ep&G{@bcn?v;Q`C#x-^x zW2kwZn#cC~_4k^YNV~TAhoIuWDy7Z)?@aFNsPg=O@t9V& z^kK6*sj_(+Q{N_?zBOU%b4uq8b4IFevnK$!=8Nakl?xrhU**bFp)D)ZMW&}L%;XnLRl5_!?B@4g%b}}-MJL~ zXzTlg53)S_nh%y6{NQ7|fAE2|L=AiM<@(*a2dBQ>yKc#b)qhnF#+}R#H@mlM(%f}# zR*A0HJAQRr_{XeUZL`t@dhf%N#oE!#u{W2!Iko4&w%{#Z+ypQk9i#Z_$H=e&qn7?^~&$i6l zcIoWD=g7V(F57Va=0PM*?uk|Dzh0Fv zbKiEK`_aeWeXmNmxNrNvJJG@KzDwPEcTiyc*9DOBdxPA)--!%eW-f=PUH<)6j^|?( zxKKY3ReAsA!Gjn0rR*|pd@9|4w^=dnb>q{2_ZHRGUubTYli|6`Ra}2zgXoXC>~|ld z`1`5~t}vf|ypg<5ib> zR+%i;YV}D`>z-dT+|xz zzqWUM-9FX3Alj+)TimNRd#~KQx9oK_`|kVyEH3}{xNrSx@8WwfV*T#&4b|+s?z*hUD&-a@ zWk2P&|GE8jbKcoqrq$0=qi(A%_uam?{A0mZbK!k|PfqyHH>Y}nQQKF2$!{k%95*#I z7rqd<*4RsO@sy2vY9~^{jb`5M<}cH?v$*U$tCfG|nY?4{yCvn{7?f_9=ypOide&6A zGhX~@OWS9(=N+2a+WI4Wwcxh|iyNhhGq1NkznS$qN2c#}-S3uH3!~L7K3APxH#6sN z$HMj9oZYNVSvwu#*H2p+$sJLj_f=4N!O@hG6`(>J?h3%0Y%O*=E zUn(&=_4WCT$fbs>P12?wyWR6o2F$ zb3Iv1HnJq;;zZYzn=|S!{`)q2@2*$t?0!6Gw*LR}?)?A1|JT&L|NQ!R`T24m7s2|{ z@7?bDbrr?`e=bhf&#U{9p8Z(s-;;gzukF5v=f8S8|NjP?CFJiprZ|L{= zWqjEi@Av11_x!v3?$zDz|M&kr|NY--{`h+~{~tc@pZDj(uao&@-_I-W`8@q& zdii(u@^bsiUk`pgzWek2zoPFiPBy<**MGNf$M>IS@2=OY|NrFTYe`2O#>e*U`h`@etud;DYm^Xu_3|KCMc{QuoQ@6O+8{xt>e zzaL*#=a;Yj`03|f@&0*sH}C#6|FiS$gU{9RvHN$_?fZRj^K<|I*T4Q1FQ0!T{!ha9 zdrze*-Zy`X{hlXhv*-7Ri;pW#|K^`>_y5(s?$aIjfB${C_{Z|^vkVMZm>rnzpC9M) zkBgIEi{HJu`xxn;58wOS*L?f*`FQ`k|L67N zYrg*Y_Gr&fzPmrpe*HY#qUCkKz2EOYpRfOTa=HEAH1m5k_vc@lzP6c=6Bc zyFV57NdlYmoPEar-1tLtc>M2X_v_o2 zKf7yjM1P)r?VjK3r>}S&f3N!A(WkF>+t$|?{QdLu^7Hcf`)WSEdHQqKpTGC_Y|pm4 zUuSe~aei5{?783H^*^4w{%x{&|GYhW>hizGeR;X}_QPYEUmra_A)#OPJA83>o_*!d ztEF?a%Jb(P&D;~se|z=hZwD8j*jN6(zViLgyXhC5UR2F`w=Pch`1k!)KYtuuoL<=Y z@7cY_)328w-Y);VDXY+V}{mb9Kr*HF{_1i8!-n6Uklk1#UuO;? z`@8Ea_T0C9H|t&Oo#!%RN`-5LSk+SQeNz81$Hf41+M1#`)0PztFQh3^R&9}r=9<=Ht+x0ceB0w zDElm~PyFfgZ(p37-MQO;eyqKv^ntH?*XvFHue#M``MY~Hm4APHyu0=NbHBHC)9#hY zSO1nytBSU^sr&Mz>ihNG9tXb5-PyaRqvN?=?c*hX-%bx?jk{O>JlFK_Px-w5C-3V2 z^#A|(@tu6UU2Wms?tlAj(ofIszh@D3|6@X|(An)v?u1wVIr#Ot{{9`mUt~V{@KOEp z@!j|TpMC%T5x@MI>-P_T{``O6-w%H?rC={gKS~dz;hy_xF7%v#Y7!5ss|YW&C@Ss>@~})-XM2CeE0XdkEiGVee?XYe%;5D{{L^6|ESBe|9`CE|7rQx z-+#WUz52U-qVv0Z^*{go{Mi%v++g>2{l786g*6}fRZdwyoUU46m(IV;ZjRj%8) zZ(^eU|1V#+Tl{@GduPnQ_pVO&_wM+9^xeD1ck}DMu9n~PJ-6@K?8;9i<+nHgxZun4 z;^|~|`L}gtGY`Mbn-_b({>z8gE1oU3<7ke#|LbCPH1qxaAE#=*i0l2<>-A}M_4#-1 zPk&Uc@!hylm$m+TuU0|wJn_dBb${Pj?Ynt6Z||je$tR2Jcl|rI;=Eq*-ycSXhBxDT zzweFzt99=9_xs;c_dX4{f9uTG$7fZ)JpKAN{(i66yL~mE{`~rP`8oeO`8nGA)#H!+ zdHMJMuP--u?%Gvu8T&3?&EWn1nxb>z)8C&7|MuYG;dVp)z5nj+Oyeo9e19!#zI|2U zS;70ipRRte+w_O~_WbVPXF`9z9{u->-F3ZYdr?pC#+-Rz6;s)}*rBfe|Np&n?{ob*zIt}J_+iUe-4=Zh4Z`K$ zoU#8OF(J(-|Lvvu*XEkOTlSUz-lV0AAD(92^74SC@!qGut528gE8SiF{eAp0#rie% zw`D5cFTQ`jI{*8t&GkPHU%dSG%+q^k*S|mZ=HJh!S+%7>Thni*7H!#g!|(e4k55aV zh-cnwkCS|{c=p}*{_=1Cy*usxegB=m-vXE1Kfk_Qf8U;cF1KxKi)znV_r1fBbnFzWeXH7?wR*3t!$`oxneD-`4j1|KEIH&c7)5xzG2E@5@&2eS3GJ&7a^K zf6q>TJ?V(_`yGECPo5FAfB*j5x4ynU^tL(Q{N3BY+P`z>JYO)e_MKayMEddB?T>wh zf4{jW9zRF+O^wU>_kUg}>wWtt9eQZ>oA0Z?*M0tddHucW_q~q$t(fI(DpFnb=iS@; z^VhSZU&E(wJsO_tuGY!){o<-Zg_38XS6`p)kK6zLF?;`^S^BFP@DZOS`}OWbYrpFXQ!#*Wo{Zt}nlT`~TPK=Z_y} zyt(%~?ZVsn{fCQoS$ye_)8A2(|9>xk+}?=OAJh&>FMs)yVUKuWUjL8x`RCMMW=q!_ z?>_b*evWwE`D10j|9xKldC@y_zsVo}y!%{PRCoNd`~3Yj@(;qFcWr*MI{x^={^BR! zzn@!vLhZ`y%P;PI{vAJWy3zh!<;C-g|Nbv~K0mq6e4c&TuVcsK#AoiW`R4F@zkOtJ z@0D`vb^X_~Kb{r+qxSUggE^b?{(pV;(f)nufwA@bc2}>j z{Tw~5dwzWV*Dpoy=B@v-{QUlZ$MntQ=kGuJm3`*f_qzE!|DJ9>?*I7H{$@4Qt@?I?Saf!Ox&)W*;_uqckyLemm=kN3K_Z$3w{|fKi?JwN6_vhl<*|+chd8=CX`|+LV{nhQYwwLnj9ElNjQ__{*WcUvpND)u?*F_$-~ai0izVjGw*RxfZ}YD&eyYS*_T%~Vi@Rs< z)}O!kDNo(reP8}vFJG)wTl76LX3g{dw{rG-<%5si_P--_^J#GX=X=MZ<4d34*1u@J z_epA_Um`ny>vsv{pJ6>?5dJi z?cVqL+}nN)`-&(~g_VrbHiLY~wo9(R(e>it* z_s{$D?A~Mdk9%Y7%f8JLiSPTi>{+ch?+2};ravFm$9+2b&8~5~%!=^zsOn~h^%aY& zDnC1~uYEN8yXc*I<+DG1=5TE<_p&&8*vc;I{AqKqZQDb0tbSN6-mkkbUMj&Y`-&QW zow00<@!h(D-zW2zP2OJfM>liF-qr`_UQca$`+as4<U{((XO{ontpKVH4R>w~3ep7F!oyX*fyzW3j< z?$_r1|9`6gf17XryZGM!*?q_JcmLnM`_#^z|F@t2{do6p`~SB8=A^Gld=%g2*f0NP z*Xq@O9=Z+8zwWQUa_7{K`a3&6Z+`te-gei{*cpF6 z{rdU!dHnl*6?N}VcE4tqevKF$DJ%Z`<=^5J+HyIYpT3)O{QTvs`s?5C`QH6i z_ex6;$mk(>MPfv`^Yuoel(_!oNVuv5;=j)Yw#MxWcYaRP| zSfg&SQ*BM(2aR8~lCNLii@hhj_D*G)-2(k<&Lx@Ox5wN4&9a_k;ldwpXRj|mKfG@K zyvq;HUiR*OF7!&~>7Q@y{^zp~=M{8VJ+N6cyZ`;2pF00u-h1v}UtBBM{r=y{%im839Tz3~%yx(g$=lSzz`u3aV)E}xT`#1CTo&RYwwlf}pFZDR`?LSE z`E}ne&h@X8s^32QfAyXle;?)h+yDExbme9J#oz7se|bN3^1FZEF3bBD|9NWQe%|kJ zf4cAAFYn*?*xS{9n#^B*`K9{u|7P)aUo%~P{(PF7{r=y({O70RU8|S>*#B{}zun)L zKWFsJ|Mz9{{Ntzj-`9M5dEUPI>&5-QpNM~M-+lSKz2$$V{n2&*GF$BB&;2;Ee7eHN zo%7Evn#2Ef=k@ZqTIG+^K5Nwd?EYCAzwGCi#~ok0Keyli^UJPk`qBULGyeabTHTR% zZu_qP`RD$(*LwN>JO8qvV*3C8w*UTg_E*ix-(y+-Nc#DSpK1T^z7)T_DZ2i4Rl(m6 zMfRsJd%xT-eNO(y-MR;%bMmLitIm0SwA;P^{oA^lzfTV4zq7sd_v+r$ulwby|1Q?w zx9j_hkM4n;f8^IM`Xk*n;q>!(QKjAWzKTVhA9qRI{HuBN#M90B`W|KVPL4&KpLJbN zzS}LX%6IHG_vE|f+CDNp_7QX5?AvRx^RLtYUei;SNA_>^tGqh3K6z(R-^X-~$a9JR zLQ_vaot*n})9u>tx1I_;h<-i&uKfCVJ;r|-yqkX~o1RfUBfmPitbRq`PM06wqMn_T z-hZZkkKqpM-FJ`kud|(3W_SM)*Z)_)YJS?*{5*B}kWl`kobLL)5qH1mmtFUNXTSAN z*}jW!WFFr;y<^e*_xI}atNvZgtNU>Ew8ixQ?|xnEuD|tX&X;@TW(Q6iom+kX+x^|Y zGX7t@x^&@bQ@QXX)rD?*mw$i0dwSlxdDA<4bgMr9_*GtLYFl5D|GiM+NdBX$9n#Bw zeto+_|KQ@8>HhQQynkV<|76eq!Wm~y9~b=b>}T!Ve?Ol6`uWpqliilu|4)UdFTMHw z+Kkty{_NiM+P>hg_{q2J_1Db)eR;nBckQmK?|;7k@4f#&N~Pw@qhICy^K5EIkx^~ZT0#Qy#N{^N7^=g-ZiZ2WIH?bE-9@_E@C-q-)Xn{==K%h5gZckldveqL{X z?_RmHo1gpFe|{nJMgHHzd%k~;e&7H9;p+9;_loTn>ODXH^UKdtA5;51o9!ZM^S)mU zKQCu*H9vp-bH|UobFAO(F6lY9H^SNSPx+(M*8fW+gRgy7e)KWduI9_5la|k(w!Qjn z%x(B-djI2~`fs0pZeDKQcYgBn!gF>u|LZDh?Ii7YeLne9;_bTn;(wy21Fg)L=I#FS z{%hjDPcI*{f80Co{gH}4FYZ0>UvK*L$!qKH^7pI1gr3>`uD0|&xBKTzm&&@z+qZV# zudA&6x%zWq|Nr94XMeu3vi~TgZ@=fW65p@Y{r|pQe0rq%--~B84(GP()K}~@eDd;X zW8>%GC;szoBJ=O=yu(|$Z&F;XIw<>`SJo zT@kMQcmIZey90#s{@J|z-~aS~?exCffBUVzz5n!ozxTiW`*-`K&2LS&y;)oK*S>7} z`hOoU>+jpQWcBm!^WMhIkzdnM|M%+j`SySB+W+@HQz&0wTW9t1Q-{N!+jBXJ%+_@j z6mL7PzrXHV>XK9a@BX~Fc=*S6YkRBz=hx4R`TyV-j5rv%l~{{FSpO; ze(&cWzmBdySN}D4e#PVU`?uGBzG{Em$Mo0N-RA$_l`d)jE_XlX|Ephr?4M89pSOR{ zzpIDc%auM^zIc3p-tK=te%;GoS6>{bDf)Q+{_X##moB+@<>}_>&gK7JxA%v&@0FSP zx!%I#d2>aV{)3`}Z_n``i(gas_1*RO^QyP&x7?mP?@qV=%a^CULpRpF`ECAO!~WOX z_UUsf|Gnvd+;aDB&EKof{pIh^vEMSs&T{?MInMLyPunivS?nk-`Fzf)L;ue+Dou8I zw&(kwA~u(_eJO{@5x&J`*iR0?Yffx-{P?vv2A{H+=IHm zPrh7^pI5i%_mB1Yl2PS#AHVPak@N55?E24}FaM~I4QqS+UdP7jXC1mqzUcqXwz5*+&hp=*PYb^vN`Jq%=Fg+O*3T;s?bQ1BQGNf9oA2`fRh57K`SI^CkWH(FgH!{=a>9SKa^ov>$&~TbJAY0#%il_y51a^So&JbIItf)!!aG ztTKK&*ZQNs{QaNjvv(Hn-2SO3{NdTB#{cJk=Y8G$L*Lo%|MjJ}pa1WuoAYV zbzlFzD-!?kZm)ce2>YA8ckeD=|DUPg&Ds5y@>Aa4zf=8l_uKe8_1kLye(?PLEA6-V z{(n`!t&HA&)1PO$KHg^U{XedkpXATWkGKDEcJa1;^SA1c^y|Jl)+q1ay>EZ@zpHv$ z>*N1Eo%>(rf9dz1hi~8Ce(iDX^K;+J_E&zndVF`g{=Z*En?H2V-f!ooTlV+Sx&5d9 z>(~EH*ZTi|#{cE3-_73tzkSc=|Ml(m`*+#6?~dO8@@}5^*Z7LxYj3ukJ|6$)D1Tjn zo!9iQZTjoq+wQ2Vd+z>Rx=lGe=3H3%>7UHg_t$@XarE))yR*~kR_4{0{M}t0Z(CiX zJNM15)A#SLW8U{`HmB5P4?o6&+E_Y*DcsDzyIUp+wp&np0E4& z^1o&O{JV3X#rN3%e=^DaTK~M?A6`8UT)uDDyL)pK<9~hY)}Q~c?E9nF>FIh84o~;j zJ8fuwjVZaRp=l^~k{5)gb-l``rYBpSpx5%$9c<#RF&$DOO`{%t~H*ar8 zr_Y&)Z-vin>T2GdJNxys_0_Qvvbm$o8@gg7jOFgCR1jSxc~g0 zYWJmHTvb2!x9j`+x}v{NQhkEX{r}y3w}{caC;ncwnDG35`@DJDUFJRh`@3eIuav5; zv-mmr^YstMZeP23!t&a!#l8nJF4ddV*QQt0kTz&LD_SoO7Pi1vi{=U21UOs=m{QZi*d;e`bzkk)Ce?1c)U6^BEZ#eD8{p%C| zn;yK@zWZI9?v&lyxgY11*ZqC;>%Pp#q-?`y^|>2nblcmnH&}CV-T#kIf0lo@SG~0V zXT;x~eHZ3G-0?@d@7PoKwy%%%=i69S%guQFbibbWzx;|fZ%sc!@`4kGJ>htIyvPd)!k~={;e#z2T|L%lFs)eDf~+`#jsdvMa-hVkcf1YIhCH8+2 z()&A&*UH}gd1wD_Kdbvicl7`NTi;Rf`P0p(;p@zu)-meq+?@Sh=KJ}p`+euUUjBUl zk6$0ZetSH9$-iyEpP#)9zy3OT<@Epi)|SVa|Cz>bHTzb7+`qEhkEAufitGJ69e+RW z-|hOJpTB*yuKjRs>BarK@7?__{BZH-UF9r4+v_X5?|%6E{(as#`^bCMp=tI1)4p$? z|M$u9=Mvig)U&qCR=;1r@%N)&C%=BKPM`2-@>ZKYXFi^n|5rEV(8Kl9-9`0Hm&}}R zdOy14&d#D=8M>bLE={$zuljl9@$KvUdH8{=Kpu+ z{(b-MO?`R#|M@S^{VQiZJAcCezgHzIzou9Idf#vV|N7Ez-|yE{eE;*m{>7jBbCmDD zeYtipVe?}R@3SFJjye(%ALx>DJ`j}K~6=j7LRn%nLD^7-B6bon>; z_SfHg_WEPj|J!yiDmY8Jv#s>YV;7XAzxnbx{Kuoa-}jf_vwYmVInRD;=I@uAv#Y<| ztrdv1%TN8f{$-17___G&Z*zImFW>)r@weo?zm?yg-<@AxPZHzb{eRE@^Y1I!x{|>` GfB^s^1Zv3u diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/bordeaux-threads-v0.8.7.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/bordeaux-threads-v0.8.7.tgz deleted file mode 100644 index 4092858f6574c58e30e6f40a363dc73a6e3dbd10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21951 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/cffi_0.20.1.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/cffi_0.20.1.tgz deleted file mode 100644 index 3c2c22d3866bdc06a64cce442366d07bb22eb271..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260119 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Π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%0A8$yZrxy~R{i;(`wE5rZ#j;n^d8@+KURL3?H7?zC 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 >Oy0x9Q_ECMAbzXv^ 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%0AxPPuI2@G#D-vSb6&OhUk->sxh$-)QhWU{Mst^ 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φ&Sd=Ha>2* zW!SsfMRGRzHpxZ)SukgNLfGP&_nG#++IV#0VoM&8X>8KWCS?ZwY$=}`7+X19DxTbW zy{*&m;D(mSW@V1zJ@*+eZ%_EVs8zP)*Mg1ixnH_DA|x6Tj;y@?PC@x#4(sPVr>zwa z=o>6&ySv9#=!^2Ec?YMx{gSX|!@;^1Y1y0u2NJ&hdTS?O_om@(z#X@j+Y&Mkmbg2w z;hvVf-S^QfiPfw*4f`*AW8iF6U!XW|O7q6X1q;qDQtX&*9>^ZC+gxEHmn@@7fzUx| zgMh}#N;dI%%~M&P1qyFBNNBh)Elcc(S!B5Gj4uav>{a`=?y7oVYl>8hf@DEUb%x=g z0DJld`Tyo^{gWotp4Ypp^0UW0 zp2@i?`FkF}ywx>f+xCC2zq#KLJ#(IEokZ@os}6G?$o+qIZQ**xbI;!|muSk1JII_e z)ktrpN1nsuNW;!Y6K;H(x?$a?h<7T}{yWAsSewK@%vx?6oKrsO>IND4zB{tYfA5y{ zMl?rfC{F)=;PQRlKZ{I%-0XWhu{A#BVfyYokt>^Q_T!{19M*Dks;w@K!l?(*(+?dtzGeCN|=HoLdSw(kF@7av*=&;B`G)V!&# z(bfOa&zBX3{m;!y#EW(*OZB!by14vD%cZc^$MO7SAI@K1?zQm1EC2lmyFUJzv&vI*5u@5=L7Vc;zZ`VepI9dG%(e5Z zoP)}Sm)fUaPhxnv{m10T>*~WbTs!X^Tp+vspZfNsdO-=ho!ahK6LbH2oR$eaaj|GY z_Nm{e??i5io%M8k**m@TcZ>h%mufzDTfXaFishZP3_`c$GM}wJsA_WJ2kV-u%)1v1 zf3&bEe*czcx!_K%-`A@NB9c9SltTCZ;h(nrxcT(uFIiGtrkQ+t#N2wl{r!IXitYQ$ zYYKimtL?bDUvP@5`TSd*r{*Rc6xRFMyC7xP&!Y9m>%HRM9Y22ZVaUP7b9Ub=Qjhr1 z;$5e#Vfy}aD2JQ0vP5o6!WP4(i)kF&%-l9?6>M7DE0}YW<5Wpz{(V`Qy6d|nc@;{0-et{1k5}BICGoDL6d@0{;MUL8;!Ih@?w_HoV)bw{T#cu za_T#G&C|U!dGpgPVdC~;i!7c@ywqxb%;)Nc3%|Rk?E61S=zD&zdG&h!zWw)a+iOf{ zbLLG^e1x>9C*IlV?v9mS}9B>Gew?Ic&F-|C&!KwKM#V$y*9o z99ytp&qiw*_2XR2n&XP*wA#q&O>4NsTlQ3IZv7dlM@NeqH%@%S!#wfTlo?u9e607l z7O3CnVP}@rNN+wjO?5>{u+h%F{hLomm2Nwur}k+2+ZC&R*YpK$eeN>n$(LE(f4TOp z6spuRoKs>ZSf=S|UD0%9vSPbkuYUParQgeRC$ZZ7-f0|YUsu=XpZV|mi-$r7)}Q-- zucvCS)4%Uw%YV=K|2MlvPUU~~7Y5D;^2Ph@pVif$`TK9i@4xnz->dH>C5YBfJ*sdm zg6Ayz28mhc!(UV%{VKog#)ihCZwIfTEFhUSrzkt|FP$mH9EWu$7`={ z;$QmFe&NiPYk#kQ;J!AwV%8FGzPMSYB^M8Q-H+XPsXjX5x#*1FYraJMpXY7cwBvPD zf2n-JM)h6y>$j>W-O1mno^+>lZ#Z++c~N=CJLM;@ueeiu(OrUn!z<+(yLEp@e2#l< z$F$@6p?(Irgs1KX-=lvCI{m!WuN=3sclkjbxw@Y7!XHz_!yP{TKle(s=D&-o8?VtV zZvGUDh-ulPCwCv1GyTY><(%g(ZhqRbMwV+o&$9D2^OV(ttmJp%8Vi z&hCu8=_mWE?P|y(X8->I=7KMH&l@mv8Z*pT6y`KZ%dEq&^uwo@TzjtUdv$kW_n#Ar z2|Yi9`xfR!E%r>VaY-&wW)J0TGUq(KdGklhWfqI(?0Tg2?2UVete5JH$lvbm$M3(t z(4j2#v4q1&&r*jJ8TCycS94bs9@R6sFrh~G=<1%b zDNAFRwySZr{#BmwwK0gTpD%vT?dtF8V$&N|3TCypzyDT#r2O~qM@*Adl#49b;+uCY@;h!;u{CJAuhReT{pQ2^dfSyE z?7dN8LSL97QYW2ZwsD!d;q%=Uhs3Q48VZk|nfds1PUop5%>nC#%KfjrO6uMx*!HK_ zkZJLj3m0^}r!5Zo>r&qD`Yy5|EN|}9MHS!c!uNY@NPFyxAwd zpklw(jq3jo?;iZ_cIS`bMD9nTD`GX`Ze%>GG*+3of6i4;o_DqN9of%1MAK%zYiO7t za7ZawuM^kx?JDx;^V$#w0nkH_@k&Z;=6a>KJYX^zwz1Qk1P{TZ8QCx zbJggolR~g=+oBH|MO)@4@u~^ChdxO^b7Ie;gkKE@LJqlTY+Cjr;#05XeD*1#iy6MC z=}9E`dB2z*GULa>nG6!A>N%cmS{x8+ni2fRlUI2`OQMQ_7nfUj=DK&YQchm>wEEMr zDYXCD-d|Pw?@jx5T~G1*vy|ApTlas@uP#sjyL`ug_4E6smw$ZJcq^j#-}M~Vvw!}@ zFTY)R=l^f1`ISXK_iKOXKhgI2W6$IVhU`6-rzZw%nk}nzqUYdQvzf&ijJvKJ|G3D} z;a~aF`fvy5y0R}pHr1ZdukW`!y7_zIB}?hU|6?Uph5s7c{%!xq*HjYwRU_Pf6Qc{y z!{^JM*WX%h@qhBmPoGx5`@enhqd)nk^5_5WKlQxt_y1X*8UN>(s7>@cYPUCH>(Bd~ z*XA(%IQL8bJcAqz?K>yQkeeKQqhdnpNt?4x!3KV*0@WqArnm-N>71n#tkWIlm@8fz z?EGif?j2q)&$D)D{wbQK_dJ9pWZhBU2G-j#ljI#L%l-cBnC=ZG<)jeqsae;P%1@r#Y8kWiXy+o<@?Mpa%=3buQnpHZ z^K&QO&YQX6om{0r`W=;Sg?`U>+pjjyy3NX674p6D(8V3!_G*-E+PZD>#F`!ZR!>yf zyL^Aw{g3QbmooO9T&R3s+wS05tF6J!@0aL5;vyFJL?4+fJz-NwR7R&J*!pzb^H=}QN7^&rdPdDyn({S|C*d? z`qZz@_{0*jY0ANmmP&H*XN9e1sZ5GHRPmtm-jsKN7w)))dYw`G$aL)0q&1C^PHK#E zTl=PQ9-gcvH^Ex^v6qorZ@R?aDaJu&&x0JnhIM>XX!0p zEGb~SH2C__GfTgP<)uya;hF9_^ZJJ+%Xw^Xneu(eQHofSY2f(TsY~S6U)HzN%4c8Y zOJg!(nxN@7Bc`_7zw9ONG4Uoz<#cZe-YYhDOs%h<5Y1S5puS{<_3Y&<3cS;qZMM&B z`nV*5;i{n2l{Sl*oI<9ThO>;6d_G zo6U0`C${;QL^BkBjMaUgb`GxmebmhAp9VMRmCvPZT^VopZ zWBuA$Z%c%?Ufvv_ws7qeiFZ1_tu`#}PLm$&dh}AVjK8CiTRL-HP`vL2kLLY1e^gCW zSu(@nCY!{D$%Y@K`xPbff{ssC&2Rd%BI}8A`K{HP#lAgW@%(wGlz(V!ujT`V*0pOQ z&Udp-$}?EEI-2hAf5drmfXu(kCfdwG=Dx%S*Rm9vFDudE}1;B-n7LJ7iY|_I(Is> zt=jB~dWj_eb4{K6qV=4w{f~90@SWz#l0828W9lNUrg;lboiJW$d7VAYqA&63;_kV; z)xHs?Cb@y9d5@nu6g^|(AF-oXFWg(jyR2rf-n`3gqL(vzCjYGA+9We$_O-wF@3JjP z({)**IeqQ4Km2Z2)%V|8p1tD4pE-rnXG>#CyxO;G-Q5-X^50v7ms;!fQc5iMRoyuw zZER_~glTH^tj4T4TD4Qp%?v%PnP1nW@KkNg10rW` z$UCv9{RFe7{xX|}SEcdSFP?m>S+?&+?B2PlnLA!zy*KCI!HeNsTI(-4-GhSx-cW;UJoCzKGQ}^tcu)F1!-=9RzYvTS7RnDD|6tg{W zW!?v;Erm>_C6mqW<;U;4do{821>ea#9rZmc7r)(>{$jyz9&e5IO+G=s7i&3|^(`uI zzWVOY%Qc%HUD&25wdX^TlJ^1m&41bLpH;o?-CTX8Hhmvo$jbN4A7U2q**{UfFO_G{ z|1ykS&_pNL+zghFvWV#zf_U+WOIcp?Q zQCY&keVr$xYYn^o6|v1RFB_(`=H_xf(Rch(e|X)2`lb*0HG3S)4jS+DT@z+^=cvT# z9%fdJ;yZtiv%187o^keaaKcULJ=h^T`0f!&YMPb2{FX$IZi%5^UBKbUq*ZJF zSX?cAai3Sa{jRU~wQa8V%PZ7ohq1HH>smHj*k(EVHsv_R)1ObqPcId(FIHYJ!k^h- zHg~aWufL>N+0|LqDmw#Xd6jk6zgZoxyuQ$KYI&%AX?>^Am-Bl530GbmE4FM7OWy2l z%>M6o>r3b06RruX*%mRMj6GVv`or>BvmZUn={arbslMRQrikXtj^Qu)r<^$DcxqDK zDn6E|HO=iwp+DH~^_^x6(zG^bXVRXw+%1N^xu(VKVQ${zl(A_U_rAIr=Nz8yy5-*V^gWOM=Z~uvJ=0ys z_9No+k{H#F$fJ{WlL~B4nl4!xw`+q*M?I5?=VeK*mnl7T#U)@{!Y(Cy#iN z3aa?_ry76V^;7M8wehs2T1)0lI=dx&_2;;auO7Op9aytv^6dp8A{!1R*RvbmoRrgk zP3lv}LbG{Y+01V=5A7Db&ayZ{lv#IiH+L`73ez6rrj`4Yk5BK(J9sE6oA1)nYb9oJ zFOKS+%;0__{F-HEP2A1u@39~Loxk54cgAp0V$8veQx-N~B2IkK{eKk9O(QR51RDMxm=plvA(-(bQ*nO`-l#ewr+|T@t#X{EZ%Uk-)uPqD? znZ9w$bWJUbrSn2XDg^|ilTKu>UQ_=|QhaOE=^5`=gc&~j>|d>J|Ci(czb`wp6i+p) zPPa7e`&PYjiq}kK?pf2`2y%b<`$cF<#ghk-X%jabIBVi~>`@M%u=$ruA>2H({O_=? z?Ye$<-EsT3p+|2BMC@%jdbq{yS0?|z_}?$xf5_MUe)-w|f4TdgFFXHTUSD@g`NQI_ zLoK4;UNNoy^QHc1u*Sd3_lh41gx}cl(le;IeZ7a)pI1i0g}PNIZ#La`xFQwR7!^A8 z?b5K#;xDV#M(NCoztpwjd5)lIQ^!vox${po(z0r5er>Zgaj^IiFDSg)LQ+pcuawW~ zpZTc=fxOqQUfSE36GQ(f$0kzfA2Vp_Zu< zSw3M?Wj`y5$mu+{-mq}%rqIh>)51=roHuXT;JsVkf18Tx_0ZMV!as^lUGeN}vv0Z- z!}{=@`*ax%Hyy~d`SW68gNbR*$vM*GD#DN`Bb1=*9B?(fVG>y4@N_=V->9 zKe^D_b7AS%yRD6JzqHp+{8Hn$*RMo`#r@}nU+o2Rmz3OadVV76tV89*%=#74rEBf4 zJ4DaZ6;CL+bnV*Y$k4Yry;6r)Wpw(*7EX-b)RxY5=vM#3&8a-{!WXosXnWRprt>G2 zo6J++!}i`tW}~$o_lu^QW#@w{BQgx{g`KNq6u&RVb8dxlTlDbnn;*JVDs-F7!d)$YLW)C9 ztTa?EdVAv60nyDrC8ipC_dD{r8~mtH*X5!0s? z#z*QZU$)l4m}9fH)Fy6z{tH@Uya_UMk9r~AroVq(wEU`_S9-s*RkujIVBZRFJ1JZoz=|F`zoIqRc1 zil+tW`*`e(pT9aH?_tIFYll~Ce>6k4+^nJXbHl-brrcTe^xCDy(`OTQ zp4;VgQ-AW!4k5SHFvDw8b}+Arb(mS&!fV=lWTE__*u2_p9yW(>=T^K~ll5XhlEOPAmGMCljh?k~^FTx$OO(V4&K|NHWMy9JRA)ja%Hj?MZJ zKR4`(){*~RRsH|=$3Omjr08F*Zu{MnOjkbbWY#|+`NQ*R=eom{3`snEJ$~C2LIZN@ zx}GO{aSEg_UZIS)`d+Ogm zzp4EsP`B6r-OH=LQ(FDsPxgBH*03tPBmang_JL&wl)d>9cC$YbQ~Dpnk}xsk+jrU8 z?C;Wrb~0h#;$`1DDqp+&p#MaPmi7{kw38f>c@dWX{$708EgZ|(9kk-o#G2v{%fCx` zD0^#9{diM^U$3rn+5!E-=knVh^c}nWbnB0+-H)eR?_X1B|LW`9?f-d=*#0$I#klTk zT-f#8;Owh?*WAr7?EY9_WcM}EVAnx$F1g9dyHB=pzqk_;6Jr|mX>pHw@9VnnOK!Jq zbMkfUmirSX#I;Y-DfUpZU$=|rWUdwR`pfhCU)u>e`wGsft>2;FlxTU-QgpI~*M+H( zRVyd`IAHPPai;dCvTCD1kI4VCHXh((%G-3FYv=NYD^D(o#083ZHXIeK4Sm>o=cwxHv{?msaKHJDRyS_VTxM4j{#n02T-X+AcA3S4kbK1}T=6SD+(=W`= z`mmNsC+oqIA2PR3*oIl8i+`}YE&55er~GL1-*uh*Q9swmU;E~$&k^+TbbhGm$s46V z=KgQn(H;NKt+{tk!Q$VH=Y$Kxzy6X-@NPTkUDIyYnDb$i=-T|NN@qMd&%Ee!uwDG_ z!qaIAs)qv>{J49n{;Yl?UuW)wDIfSbwf}GjXY4NAb)@5=#afNUH*Y?g?Hy#jIX`NF zzDl>d_cycoi~cT;Idfk9Wv0zZxd&`7X8oQYxcT&iJr&QnEi@D#rL^CbI(x79jBFMjXD=+L6+^`Amtobr2j_~JY-hiK6|26a2RYVNAC z&*(qzr4Vg;=e5aCsZZDXxufDP6?<#B2QOdJ_34?|RP~d7k&pFeNDErcIp6rS-OlJq zW}+&cRoy>O{J@sto4a&uCCc-C7tPya zW$b@Wszg=)KhtD)$NFMR;g6fwrG#iGzSMZn|9fGA-wB4tb!JWvk0@&$o}nOllEt3c zN+&M%@MIxJ`T6nSZ*4@awI+{KjhDy!hEA zX{@)NJ`3=RPz^TOwgs!7UUS~~^g(Xr z_lqZquRaLPr>*=%%8=Dcn96q@Q<~PDvHYx9<0Faa;TCmgwZH zz-gxx*iYH0@Ny=UUT54b6R)l;uKiq)$;l%7I`gWj$F;ss2uo{led96dR*e6akbsS? zFLPZ*r~F%`+PgiFIW{3-L2gOi?7J+#8ox0<*)a8&u5u8 z{f+ABi<7(`^4&K-V9V|jJQ1YS_o#L9qo9jNS*{n}EBJl*-b4lVB|j@#s;faKyl*qw zIEN``LQcg(x3*ui7Q1%-Yz;rdb&PvC+Zo;;pEsZ7{lCJE-+0xp+>tN zYf1hLJ9#2f)qH8_YLC^|WHYaRy11%TJ!)&$maMxI!*u1>MwzYsA#mEa$dUj2^Mus7 zx*y*a*vP0Eiwe(Idf>5dtBGgO%FNj-H%wi3Z-uyaPvf1wS-aY^7{l*Rsms>f>3>A} zi}_r}ds9zMKA>mZnx9$rY2_MoE8AOt7rKgBv~9m|mw8!@YhjI1VC%eNr%x{GQeS@BbCdH# z+f4Jw6we~h^f}G};s#Gbe-&Du&WN7dxIogzcb!GK&^0lIzR7~~*33%2?W7t*+%-cSghovT;5P(F=!X+i?W9fQ=P9+mxb z*!dU&eyLVh$IN*9;gH{S$(z$ou%6Mm{pD7Nf0SxXk$TwP!)pSITV7B4&UC)GGJC@L zPa@K}{>EEs59eOqHQoC3YPX}S%(U}7wr=w_<<`I3bM}f?&feg5mQ?nsUN2Zbi+s3} z&gIl8bf-XasdMF(tyP^Do(tA-cKhC_E?mTRmC<8CQ`sb==Sd=NYxJTIc_=IVzI@?D z;pRT^wmaUJK5YAN%TZ^u^-fvks=Z4?)XJtU`@XwkMQy>4yR#qsIKMuAk1f}}dTy?} z2d!sLW-hlXwzRCcTr8F@c_xd6Nq<`KzFbowu4Xq&&C*2IQ%1|qB|P)ZV~YJ(p3?l} z#gukG3#}94hP%#ej0?PV?wUy~OW}e(v!^dEhWflKSgR+N_4?)WvgoQmHW!w^_+M`4 zZ?8JJ{S3o?wg1%;X1jm>j=x*>`Qm?2HTvRzx*_Mzzi;GeWgZE4M+b@-WYQ`j*IC1;#)A}x^l5tBy1CL(vQe6Ch3Nwq_qJ>&A zo758lS^x{)Mh8ulfL<$J98!3odt`ovn<;FrM~QJ z)uvKYd3}qf8JyBej728Wuh!)xPMM>3p7DDw*W`ms9tDIh|7>#1c5Uk+zZr+L7ag}| zwwS%#*`S!YyNpkE?T0<5Uy7C%&eJPWEXyzmR1^T{PB>t5Bq zNsYN%>VEINyePJfz3bMKU?C&LWjhxOzde#T@%WR;w^uCcl1uVmvj2M4oTfT;_A`IJ z6+7h~Uv#POVBPf#itI(T7iLD~PG21LZpY!|g5@)O=b0P{`>oZmWN!WigVs4ZBA;&w zY+CliV&}Y-cdyU-8F#*Lbx(2ZB4-z?_E95t7G7hjMzMRijn&zdxi@2@SN zW*u8sP%>qg!HqQvix2h&&v;?0uEzB!lQGs>PGrf9&)bb>?q^i#7CvLX-%Pr|mDlCR zY?*C-r(ZkX3@K^z_xaj>h1_5L*11IgScAF4wAhcA@AduhSFLTi z{-eQ~EB>|p->ldtcPIJZ6tI!-t?WO-yJKFB*RvU+3oR;RPDF2w5}kbbyT4dy;OaVy zn$P>{KUKZ=4=rkJRe#3#PWu&md;SN<{X0aiu40>|DU}c@Z?gKJ!WT#9Cx_M@Sfujvqn849Gr~>PX8lXr!t+k+q`qzDZ^}6Hsc?DOLgCeu-pE$c{A8y{ke0R#d!*6DV;>-ur%7pZ}>gHt4eOSJ2+N0H)=83ASewv;NGLn_O ze14T_=IIWtnN5+87nwXL@Ksu{!F30hW+3b9hj&kQAO8M&_2p~&sn5-(UOT%!Hqvsz zit@Umb=hS$s*)al=0``@^0cgq^}0T3omA|hC%(7ms!tF2a>nWI zZBxswS6<#azqkAAkDafV@A$uZ(QdmtY#(0zy>GULbMBvi`RlJ&-TD7lYQFWm|F?XS z?*6`Z@yg2;U1fhtrc@Y6y({MYQ<(k(j?(W-hAqk$J8yhXb4-e)ovDq`NQs}+qlsx}D*Be4hz63RlUiber;#%y{(Vl+*yA5V+!NtSf12(#d}>HtmBK?y*2Ws zHtJugWteR6(S+6Eh0(c_Zu2geu|5BKWLJg#)h*3yONt0+*&E99Vj4z;Uu8sY^n3vWI3HAuX(=VR)I9{UeHy_brDr22i5pK*q|1 zf~t!-Js-xkY*4z^xBR{8iOiWN_b&MIWrmxGt%R5o)7`KyXLUI~eLZ>Xzt11rqP^26 z$*Ub|J9U4p`zjN|l%tZ5-?aaHv_`A>x~JV^hcY`iW5HPkE-Tk@?B-2+P_}sHY>6Lo z>1_Yju3k~TiC2>8yuD|s#&W4}v9)@~3xu5N4i;@<8IKaTUAhl(f7zMx>M#`((J&CTPvsl4cqske4K-epuJBD<)Z>p=VF z*{i0y2ge^*5np+TyK3^;_DU5Vi=Kjt{DOUUCu=P>>5CkGy=3*wUG8zGTSR(&71zUPkgDc+6hu2)3wy;~F@AhCIdvDW3NK6jZ_W4F~6x@M);Jg!@tQ%HEJ3gx5U;O1$yqeFC!P3p18^>C(N$)&tmE3a?iH!7ur4= zd9&y!8>s7TZu32z*(G`1SxmNh>KCh(?%ZwR1Y9D5H|0|tTq16>- zH0O%#BiYq?LN;gh)^G4kUy}KU`^4FMV*jfqT|edUez8m0tV4X^y85XO7baKKS;Z|- z3KO+jxbBI5S=5(@N{!5ZHGRO9lqhE8|`nriWKFhl+tqcz)wx;RNdg|VO{Ql%a`@bjs z=jcyu&rmy|(!Pq*XOe4ij)(f|kD5Mfy$Z85znOf^Grrihb+6a1SNm5l5ns7!6=!n5 zog&^zYYzl{TD@>fmdp0Tt54oLrRMwOLiHBQRi`$b*5F@xv24qxP;;LLb8olE|Cl$q zCj8^=Q(?u9@84Z{lcK`QpL(d^@|W7w$J4s1zF(7`c&#(^*{7Qk#~6uZMa9D zD{tM`n-QwfG$f2wYwsO3_* zS@)OxpSrR|LuKj1XD7F;_9+tekFvN~;ywAvE2#vF7qV{tlgcAk%vg4Hx>Wc^#uu90 zL3L9aJFJx_$6k2y;e7snM#X)n9al2n`MKYxVN#?6pY5CHdqZ!tT6{4-dSd#%yNp*- z7JN8qVms64j2`PZ`zaxf>jUk2tZcGZp7{7-Z)^uIKfkrrB&)-(vyuhtzSs!-Ud2=+ zFQRnQd&#VQ%MM*|Qu~r9z0GG!8RyE}U*cs&f-gQsUU%U=I)87?geuNu?_Dzz1lMPN z)#j325jaIT=*pyB$~C#O*UQE$2VT!wvfSyBw?*yjTY-&pEE>)xEstKffBIUF$Ct8x z7G!RvYlHc{>Fw)9n{)@cg6V&}#?IlcVpw)pni$) zs@}?I*`8nWzO?qm*Q%-`RYza0JHYF+{kO05)_uBje@#sP@@s9({a?A<5$@aXl`r$( z|D5^i^oiN33mV%+nA!I>_TE!C6`1)z@|)xB%O4gbcfVh!-N$D8d#UL~_Gt@RTI0W) z7c=7Bs#o!w`x9z)xf}LOeQmFiClrxR5{DzD~N@3`wy$6nZJZ|iss8}lT zY~{)Yt!AGV+TK09;kD$U4JEdRSWm8cGx^WL%_^+xB#A zc0c?&^7h4fXTM$EY%F}1&)jJNn|74fZ_e9qGcLT@*6`CRaP!SqB@FKu++|KGouwO* z-6SyYtCX+cmRWxpRk;NMci-f_ZLqg##ntSC-mJX8#J4&u+0JgTyrJ}0v!8fc?*5zE zfkziy=HA_0$Dz%*A#V5mJoD1neLCxMzW8l6XNX>QedXe7SDAdG7F}moN))&HTc+N0 zQfAw(vnv9b6knCI&#lY8u%>&#{UavqN-w@f-L1R9y0Clt54PqomIfE@W5o>qRt;s# zufEi*aJ-St$M%*ZLiLT)P{PgdM+N@Ud8 z&9L9}gR=Oyg;7^tw_ey=r=GHjO{6KP?yaKUS+hD>hNCX4#Y=xnZNA6w>wf0JIqq(J z32s|=2grPx?6;XWd8RU}&z%*fFShM2ZQ8p|9Bg?EO}p;1Zj&u3xWRcbO}-_6`P#HEe>tVn3x8Ew~x7q$;f644)%8(Ff|7x3e1XI9! z*S`}wF63`z6rE7o98i{WA&2>6)CQ%dI~lxDch5CMELi>;8|u? z5Zto)Qh}ups{r#A-3i5S9r^dU?k(GH$zi=gicOHmoQo@hCHlnO1KP3|bCs_iw(IG8 zxLD06f6fQT^*5XB4*9rpJ${pE6#dm&u%}#HrJCVZO3NAM+C}bdb_Uwffy;T%$T(y& zu=B9X^515?muVgy%j4Ig%vG8pHM8#P?zbzX59%;pWcw`FW_F~J@uf)vAL~VhH>FaS zwB8+jlkwf^?1p_aL#6K=+VXdjTW-VezJzmJ!auKA?n=A!F5z)g?rNXAQ_b=|GT5Ax zOg^`M+E$leSMDrgyttL~oY}giYb>><$KNb4ooB$Vx5ebng>Czs``@-|wXAJuwOg!c zQkDDSf%vUw;#%D2lH{HmcH8WVd}1oRc#n`==^e!vw|J{dH?0U!?e1~Amh~(kXQy*) z+WA{5*+1R(K7Dli)a$fm3Hr+~ZU43GX?`2u6!qZKF&$qq%1Gx_WHGl&b*A!N?k5;ywC80wd=JFZ|+WdRr&b( zw(`S&(n6m+-n*{^SB2eng0wshqBaFx7!=4+vxAY*+lpWpiN{p_7;Tg$VT zT;HgZSuV`On|S?2=@GZ{k2?0{%P)!FV&e5Sk@v(+&X>DCufJcqHa7gpx7r2leF}NE zw&l+-j_REt5y8PL)55m2?b(6kbiSS=uG$f|&o%E^lW)fTd#Z1>@X4+1zNYE14&4^{ zH%zVhru>=Z+P1;0>$jYo(&6iCh0S7>uj?NwdbT0%Sxxb(4F1{jte#61zsj7xZvIRA zO=9)SUZ>M{dS#+_K3yAsL*U{Bt97!mT5Knr!sbnW@$8tpgr>+@ZTRJs1>2yPwY}2nh-LEQ}H(Y1lz3QfG_EyoYCoD1>fAK!!izrpS;84gm zx0->CSL1Z;t_A$Nay?ew2t3Fdma47$>ht{#_q(^4GDnqhzxCK4|2uX|&p|f^W)?M1 z{g$VjnJX53?N&3NAt<DPv%MU zmL`~G$mWP_U^x&aXR_FF|NVE1LtDy_*#l#D}&&co43~PyE&g@G2 z)q(fC@)ri)lWpLP5D#3=d8FlIrlJR~yXe5SQqUHE5}t%NQVNVqnmG z>u#Lz^AM45(SI`pT06q`w~8$}wp3K<>cLlz%G?@UYKu%v8haa56kq5ir1K}JSUKEZ zAYHn!nL*rlt>5+Y6D^e9mPs3|?iPFZ_e+(+zlHIC(^j)iQ~sj$>Px|vgI3w!8(uD2 zXO`Z$IpMA4dVxysc)7suT*NBV>6}BJM^R zY`wtNe&0dzmOtZV!8R!e1|frYYbV(ag6x#mVYCzB21tgLx?28R=b%-9XStev-zGtbL4_Q55a*RB@| zvM=PCF8pi|qiZN}Li1h@(?jPC<%v!0s!fZzKb14sbWB>zuadtoq2XoIrscO^-;h1& zKhw@YDuCOfj)93mh1a7k;lle9*PI{qhxz9MHCh(6?@m0Ro2GU!TA+BX*@=mc`>h>zGO#*yx#`L+VyJsm z#?d45pp!!A zhr$lWKVKK?oj9Gg`S2Tt(gdkPXS&%A?3JCuW-zm&oS#MY%x$#^LIvz{t&7ASZ;L8Y zDC}P+-@1ca^kSHhf!`IDg_m*!w@fIjbNJe1$`F+~OLp&qW}f@4GqsiO98tW+KJnhM zg;}5SluvX!F28x~t?z_B4XwiHz;|s5X$|$u`9lTZA`*?} zJ$gH#A-J-0^~WuuAFsJyY>iE<T6+gU1L{Y8Fx)vZl6t4kjWd$vzDuC4dpfBB!( ztx)e>Ia&6-iB*<|J(fpnzdEsr`>ECHyzL3An7w8;Of-oIKgGiK=fNBHq#5Tf=9d*+ z7RX<2!?)RU&jODOYo&)9^pix+H%>U8w)r97^o z*h{QeE#5CSb4Xez|-5#)6U%}No-lTI?!srjE@uhRD*W! z7Yf2wH$=*t*UWqVp)+Qe#Sa%gyNS*IQx2;e{g@K3Hlc6BwADHxlj~+k{}0@B{MVo5 z4F!9>HA}VPio1;^FR~?PPue)?Y2~bWLf)^Xl{V%E+zRu{dwqEaf5dE+BWHf~*6x{I z{CH!J@A9e_GdA~4Ox-Sji=#!4ZDFrd#$$n79xY~K6T4lXTsUw{Y177z933U`Zja=^ zs>{dHqJKI(_<2e9zxJjxvJD?{H>E9(^zfdRJ8!zrI=RbdqV$$Yp88cVS;c+n*2QN( z%Vh5Vw<#xM!wn<1(yzWtRf|7Mr*;d*oxD(2o{;x=mW|hXqqy~RnYklxRbL8NeQNuS z_4$WatV&3JoN#yfW&e{Q_nf9BOtH2wnzWa_Fzdg>tKVAl{&{;W`!4daV&0iaGv?G9 zx`mxR#%!W{ah3HR7VWa0m0z+xF?BBAqavFXzP;mrSkM3RnK8>g&t5&omLK`=D5x0MGx?-y#>+?M{}0^% zZ}B(mUv9&ukrODs#M|AFN33}<=(YI&K0^v%V2u{&u z9-33HJqol@j`vhNr1Q!xarfRy4qVQmCjAK~d(F5Fix<6c?(l!zv6;vbYBbjuZHvut~*f6VP>TEo2@;2#r$q}Tb1R;c#(-zyef<-@6zeJnfJWm{@T^Crd39~hY| zTfGIMjkC79tx0+Cr{m*=iADdvJ-r>fW$}wYjAyte^i2ME+$Cp!&2PpncOHCwI6Hm) z_kUY-*G??qN;@|7l!FTYY>k=L5-UHdPgqo8=VE3&Ls;TRilwu#^5WA6KP_P~@vT1Z zS9#@=T>d}1jf+|~7f%&G&v$#R@Fl%mZ`Q3xTP80H-L*t!`h?c-#get0Ci<6i1kYUJ z(K+eg>3YG}u>O)p`-WZCYxOVA^%T0l-TtY9%IC+5TMvXhO8F^t{#A$3j<=Ta9p>@} z3|PAVo_!ctr*!)A+hZk~?|)DEcE2$F^Vd5T>`Dfud3k;^8K*2iHitV_W%}l$y#WvPOY;AgN{8IKoL~CFKhSZ}B)iAE_Z+-x*6Mv>ZP?1B zz{al)iZjjEm*qd!so(p4EG-u`!$pIDgM&a>a9a~MsKXX*T~&)I5|n4)a3^FiOMN7t-lJ5?wD^1GO{@ADZ3f+A`^ z*R2Z^F5)h%PTf?p>TRg-Zk}VF!rxyhP5k{~^U)td5w$9Q`78EVD_s-$eUc4tGc*?kCSEk?Db+snHhpKj-VynhW9ObXh6CrpBS$@<407lm7e^UI9PJ zPfb(O4(MrE>%809(b#zTbE?|8$*jLliiR??6*_mPs$Qui1qftJ;)syZGqmA`P3 zbPBM3w&iY{-EzaU#S7X+%d!`S9ABEZ^CL_Dvh(^TEFqI#F1YRDe*AL+=OiA^U2Axj zrua_SZT?8hvETn)*f!=Qf34dR1*JQV#3(WNtxR8&+1z8#EOqeD0q3Nj&0?9WkNTLY z>)KSRtZ8^;#Is_K^YU{K#ixHg88%%f)kd&eH=g(Oufqx#w=(STIqE0fJ7JztYWK24 z$puM4Pj@?I?RvSf#&G@itlio>7Vo=ssm*cWS;nW&9d{@3&E#g~=*bD_n^uz1C7P@; zoiUQ@+Od?PV|8~nt#~wH^GBJs^}MHlDLrg?6E1$?)AE$OHxU7XUtFZpOCPaZomBd& z|JK7FLf_wA=z1daX@-2v*DSmKlfEvWZu4z1k&Dw{=g65h>&adrE!idMjcRUbI_xjM zuFPo2hs_^`_ZduCJBQws+Za8)( zrQLkVD+#sdDtm==+Yg`o-^;SFX{PU`R-gZQOJWu_76vlw{L| zYm8-ox)tXhpZWOABT?U<^C#WtIvkjEOols>e`!)#rB|SUYMubkySnI^x7znCovZq$ z#hGDgFZ1O$ZgZBuT%p*+F!ynnubZl`*tfrPlzShAJr>!~`|?(c>Cc+3lT%)(xrg1* zRVn6h42sHPHjzI+X^HTZhin#I7Qc4nKIM`McyiNts`Ltj``k>gnMz`h$vp!eh{N#A5^Q%VIht2k1cROy+T_1UEf$4_C zwaNL-lh#^UdMxe_20dXmG;5q|Dtpcp39X=nReK`{XPHpzNTj7qKiWElcjyiQz9EQf5phk)O}aG zVQp2l`@Y7fBAb~@oK4r?+%qe&AnUnpcH3?(-%umPMHgMJ%SKFm7592^cjY~`3)kB( zJQTWjJ@#VYt7nzq5Q+5od;Y>-ISI zo#;RnYX{IycJH6==pdxtE=qu z{k}bXd3_hcer}9O+Vr*~a-&U9lj(#%4?d)xJG1L-q*Lb1M_2Dz7fo&NT6X?zN_vD! z^uNcmg%<8ks`6M7r}t{zt&e*76L!0pq*qpjOMY?KQ~Ofo<&wP@R-X9!ERr$!!MjAI z0_oEJZLg1)ybRW|6%I&n`}8H-#+NC2tHV}pXo6Y_m0 zH3-c(w|3R3e~#?EB`Hs9H=lFM4my2q>nWQKbFb&z`y@gRm;SJsdA=g*TKBDGr;YEL zZZ1CkDydQ5K)HBURPZK)L!zeprg?3st9!7qhC%Dm>%->N@A>1{=C~@g^<|rezTcT+ zXIsT@YU{xqzo7cxlu5Ib)XrENS-t&u=0vCB#ofQ3bUDv{nPU}fzIC64WV2^}+2>PL z+QDzF!q>{~`NTXo+u_~%>0iDbJQjNXKIh$UiI{4JH}Ho|V{b)V#%c!qa2SfwA}%jtO_s`#Bjd$l>2wfO~wt?9AR4<@E5u9@rh!uO<@ zrC4ksi^KZ4+`NlER2`kl*1Pa|UUP5O#fwkxSwv5l^$PfQujqnAv^Ysj0imTRKpS+id+I~cWQZ@G)fwRfq4 z(z(Yc|NbXqc&kCZX1d3x8C5qPDH?vgYow|E@l>>0NU(m91^21ifSoSq#2q!t6TNCAbN)}; zW878aJum*-#q@na&7lzJH_Ud`Fn7<>*k%ld^N*2JT+*~ zr+cTE?j%|lB<{PsN#XnLGZy*xc?0Y_g1B5*xm+eOi4^;9e>p7^=VkJ)ck@%5Ba*XySlR*5pXszJv5azcXoQbBTA4STvHZ64`e z%Xyyl$zbZ#cTc>`!$sdc;|kvCRA?$+uxZ`yjGdkgY_|^{+}+N5!-hA1Z>{gvyuHP1 zvmPEi8NAgwmWi1^FOPSr$Dym?F54xhou1$tbtJ;Ov{t9na&Jo9|J%=ok?u$EC+pe&nLXK9Tj( zkG^}Jnf_M(@Lt=t>S~_v-z46>)o!U)HlHm&?Xl%OWyP1SkJdh7%ba)gab>7$i)**v z-FXk}8TVahv%T&#yMJ{hx3Y|_r^SSI(eur@t~uP`n0(VlcBb8o9WVc#^1nJQlGE(Z z+5XGH!vB+)Uu=NT(UxlcjcGuAuDntxYahRC#t{teyDL} zyfQ<0y5@>iuePxEZjuNy6+N{5iQnO!rLM;m*BVVq`M_iI;&NJC!AZw}?OAWt6eF2f zY%O|^YFW3P-_pA(vw2eBz4}OBwM@|&jYS%v-4C*F-}w^7JK^OriyeaN6y|F!dGkX` z?ssyu?s18;jy-0LI|?4S@|`|2`C-w#UVBx!smksWTe*|c7z5JGj;}qq%|dkUE{VB* zE>~Xk+(_#BvAUio@8Y`0A32}xu{A3a-yqZf=bb>>XP4wT|6CKIjqgnBdOh|3q^En{ z`xn1|$!l`>!$r$3n*^(CeT#N23YpB~{kd7+>Fp(1rduD@rYh!5{E%GK`|_E}G5gCu zk87nb{?N_Ld?V)fzL}~F4KI%O8L}muJ(2iRbyc*`%~^3SoP_2aveId z;QZs>rAzL13;D;FYE0(2G&yfel#X=G4$;k$0XN)r7bFIl>3q6UEzbFRdWZZI>CNTE zr*|#4YyYn*ck$9qv&_6_H^MH|%?w+;xy|>9>I}Bir&qn-A>JuDeMyS7uBH4r!SHt` zMaqv(mfm17efYGyxjFoUa+c}S_H)_mqIJIpo&EFWQ;E&iXO(F=QZMfvJy^ZPdf!^3 z3$s0qVmH^NOXSOS=WUubd*0U->+ZI#IJW%oD(z3vA3~qsiM&5|rN=S{b^rViJ70C& z;_zj$@wveLHf+ZCmFrs6%f!Q1HWwd{TrgpWkd}2%KWJ07)Ah&xg;MkM&L5q;;cj+$ zbmH8oORiIXT;k_y^mVK$3~9ObPLrKyeujZP*unf5Jr1W6u ziK3#jri-6MF8n!FVzN`fkx0hkg7u;k%InPyt|xewO9e)@-&k(Q{BIF&LPP_@o1z~R zd(2BbjxX`&zHsNmtV22TYNVE*&MBJwc!tcsDcOskEjrH5cOiVHO_FKD1!jdQ3=Qfw zKC{~eDivI$4!vX(h;rrVUBTe&9lmQukJ|qNzE_7!Dww~0c%R_EKY_`RVex(#=npa%DRh=2TcZ_LlEq&}7_n+D>Vrz>9<Wt&#e`Z>07e-*B51WXO2ys_vPPk-K(5=rz2<$Y>DYOR^%ZFx@7}9j-o5NapVh>P&kng7{W(#x(fedI z*QP1$8aDRJHHGGcs;Tm>`m-TQ|ANx_+I_b^RQlB{efLtm=DM8Pv(=Bq>lfr&$JyI% zox9lNSiq_fOOdIk!VVN(c3qsd+S4UanmzE+x^4SK7TJH#d%geu@*V&6la=fq2p*XA z_kY>y>!;rSPc}Mu{O|wuA9p_fxBsllP8Ne}k_~qlkKKq{@Ok|y=FOE{Gm@U(>$7M& zD44IF(BJ>uFl646PrtVZyfvE3){&k(OGj?=2^%?W2&&ne-1^-Ah_Tz4lAytjN$eTBpxdy6`Gnf>nT?i>>f zWJ{O1Dwx$Q+cYzI>76A~&n(wRpKQu3p8DZzn&@vS)|z=XH*7CmcdhArtHU*8&ky52 zH`#9eHDsLG8ot3_vsyP;`s3{7!rZ3HN^!FPUYbT|v~y>Qo`0q(klZ9D>w49(MepS^ z?V0DMbV^jS^=ICk@X0GAGLw1Yq=t#i-n?=0vhx%FYY1HnJ#*0I!Ye!G$%Q@T9?O-v zlFvJ*=;=DW|5}j5!pvpXS!m+uIGyjrL8ZBcN3PuUlpk_>Lb|Wg?S#Sg+oGjKMlDkX^(S}fdVX5<<7oV9|GJ;6}kZ~y0EfBmn| z|KID^|9ySG=IX!qC+|PLtf){`XZY{<@sm$Y=KeJ}FLv5L{JQ!7KOf`g*RRUDyxZb| z-t(2hJSPiW9Dk_h=11Lb*yU-n$6!u_^Yg@)`c5TXt($Z6HBYY)ebawx_V;E!hvbEa zue}WOeg9a2LH&Wh;i4Aj#2Uvi-M!haMt58!zRpQfdn0b?>b>Mx>A_>GnGL7^n{@hG zabuGI;~bkM33q3BN^N(4@+M8!cay}*BIRRmIj)9t9b2;g-l@C1wt{P{5A!TY%-nKi z(epn6W}&BR?yO(=V%jlggP`TcrKJlZMB7eo>+%-(R8^@p<%Lb7Qct&*&)QY*orMt1&=O2z1diEcj1+S(gU`KbY|8w ztyv@aTvqFEn@8pC#wN*yV%uY@vVZ({TsARZ>EzC!$%)%k7C&c+czI@{(x08?%R?1P z|E+i#oM0>_T6E=!&{4;9%UK`gD-FY=I1>LodYgS^g8iO)(U!aN@iK2@WNY#ww#$EZ z-WW5-(eYV`;qnGG)#(afkEGqOymnD|Rz=e?lLaM>T|By(G7eK3E^Mtk`mkX&-<$p) z@xAWTzD>BCYhsw+ZlHA%ns_rX40`JKWTiujXgh9&~+hJZy__nZ37cInO28HP&BNOX&(ni56^aspM+f z+sIceCK7f)iar0^{YPrS&DW)!kLaBZ?;pO8WAg{jd(wNrvh4$hJj3%GQ#i1z^3 zTHi;fF9+&mr81U(ovj4xVUKOURtM-|zGNjqN?cRrM!HC3dYcFl;E+|@3V6Akda@T~r z2Io}6PM?0+lC=KQ>HJe4zF!qJn%(Z^xoL^%Lf*-?_MRkBsnVk|6ALQZPCPQU|1r_%fLMQf;}^|&{}o@#e`6@P`*(iX_PO@|xo_`1 z{&_#B-uihzrN&Eaq1}ILKe5v@Z`6N%6`;YkNYz<1rtq8i8q340YoqIJj#k6a@0ord zKTTwESaJ68Pu^KNDtC|QS?_vS{!;n)!2?;l50r+gGP|39Si7ozyV6e=tK*H4rE^zL zTtC(vNd$et4YTw`<2lMOVYFoIN`hu*h+yZD;f_JG<)qw3~k<8;+_p6eEte=gi} z`u7ILn=>Oe=gFs?bm^#H-&nfv!wtnB*7t?@!mg;_`G3YdL&y4-_N51JA`Z&^o|N!* z3e)E+7px!k#72JDU-Y@meYyJ-*E9K|e4KYpPqGWONNy3;(JKfRKXYiMjOdq#O9B-i z88X~eI9h1%MWT+$SnB)k$4|GmOnG}Lu|005p|n1$Tp7PkhXbFM(apvb{XE^rOI97OoD&=IdwWTW ztxMOumuwY3-b#LZlDTjBDtA?#y{-ktO@(LAT?otl&SU=SMa9xr-*&FbeAn`^Zh3KE zqnYjU;?2^ffAlY3Wn4M!bK;@p+BGTuDUUa+yCzGD&WV-`0B)ktLan$`n5RXkYh}>&bnkg*;0n zA1?cL%dtYhmDj@hw$9IwHkk>Nw&p&aTHv;h^K)v`qnzlR&G}8g)~Z{w?`>*rUvf|H zZ}&45{kva$=f3j&%Ty9RKTA<++m6R-9}hH3GJLI(e*0FY{>44VgSoc~;~uDN-Mv;l z{_OFD17&L##s;l%}?Qs(7w>$<9vJ?@UpAeBj$jC%&kxc)O@=!)%AWxAe4F zcPn4Wc^G@v*_tmcI*M7}>qok5L0kTet^YLHcXMS;NpCp&4-duKkHH1*T& zPsRIg^FQV}%RvZV-(Ywy| z>BVC0mM>xVJm(#(kr3YXTc^?BgeI4fmDQxuP$d`5nG9Q9lRDL`S`2?)d%nT%Ohx;2 z+x#t`7rNGDJ!iSFc2&c=qthR+e6Omkw|W%^%hBs0k$c0MQufVZJN87_G{`r5lCZng zrKw?-p)BVee(7iU>#o_i_E2e`&eDwNThkQE&S?ZTnV4>ui4Hy~x4HNK<@K41Gc32( z7-ZYOeJQqT!G<|6*<3~6Oj{avCTnqs^@rN_My3zu-5!{o6}5 zyR~=t#ww}42<4o`WO?bmmCJU2FE4JrqH7+Cc{kTzK70)#3KmY2l}&e?{Y6M|W9 z35W%qpY&QHpY3LJu8dM!w|2tmqd7YjK4%6uoLiQhYw4H1dquA1j{5a)uPkGD9xSxr zt?Jy+C(&P&*_Rp%t<}=-ytCuR+@9r~b3bg~wS3alcU=L0M7#fsmR{u+a97YfFmG;8 z9V0`*!i#yKZBuS+WZ*sU=$v5rte(Sf)S^|Uul6`rdpb|gKRCcMFrXkYk|$Z>;om>S zQK!|6wDdI>*?)KX+iK_fmw(Bd2{qT{&oHNK{U_dI6S-G!3L3-Bo*EJ5i`t20@Up-iC^e;u#{k|B9vAqBW_L7$Z1kde)e(J@MA|{KZ|D&iRz_ul!}O zZc){=Wue9PO&d>$oBQqGWFe<|;K}Osj;lA?yuB}L`dckF`>pG)sqM8#dG0XOw7Dxc z{F(&`O7}mMYkmK|I6-X{Fm9a;bznNZ#y?# z@3#FuySZrH-l$C=xgHs#GON&LBX z?a@7RI*w$|JXM%8`E1wjABT12exi*z$*_S4Nv<%pIhLgwV zs^0pd7dtj|dsf^H`%x(PtJG?J)x&@V=bVhK_9lDE|ETTEm~!-M&0}lLSw%|@KJyn@ zbDdkX{Kj{!EX(&BRx+3hp5uR9>l(D^g2G<5RSah?g>wbItUUVva67m4x`jQamjBWx z&6}HWH_L9*()xXYtV&_7--?-x`scBU)Z8i1VEzACJKRWT=LODXYaHX2sIPh`!)G&T z-i&9f1g=fp;oXzvUGLy?Kf^raf?aXsn!=eet3H=hioOwE)eyaPWv9+r`AWt!a!mOg z1y>orzw>z)wNOXd?rGOdCVwd-gGUDQmId!&;AtsMHuQ4(c);AX;`YAT0ks=0@g7`J zyUEpu)m6mPR59;ro2<2Ml5xkd?@#v2E#F?H>`M-KH)-i9w&%j%zXgS= zJq>-QeR99`SMwV)W6>yb>*fz{eC~bw5N_c%r$i7hJ!_J>Boy6 zhAoKt9C$!%Q^}F!`HWFrdjk3+-=BRnJ4bxs{NCp`oh$^ME43EPTr;oOBlfcWn}%0P z`xa{L4llMzm_Pg8>hNcqxzAX!Jew-=K}2DjywrNHn=73hv)3i&hl}3m5YlGcaUo{X z+8hgax5!<)+M_koPjh~*z4}mg_BOjkUQ$|eK`h2S4@?ZkzE2S?-19#^?h*Fw`nz49f0gzX-l*f7=j_pWA<=i>-l89mYNxT* z3R#x?5C7L{U!oiFuhssp+5b1&A{VsG;1~FJz3u;3!)IQe+uVy@2E-|aOrHD4{N&G! zt7l#H;^zOnxYk?Qe9i;0StWMcTpEhxJ~PSs+b`YVW3pMa`R8;3j-1gNMZ@qiWQe?S0^x=Ks zg!!v(Ok;S!=+~ah-gR59T0e2CuveEt_NU}EG6#~&OJ(PYmGuRx%gp64Nam&m;J0tI~@%JZAfROztmyY_mxysWFOYC;#Jpy7}kQ9@R)*X0u&( zVnXbF!AW`6Rql-Q_(C6vuJ-@8mgU`wsWriTGbYSjoT=Wl?TgWb*cZ>IW~Yf>@!0*; zvcvP)h775ecPE}*QWaOUK6xs5kI8~9p*~lgcoqlOiR{b>*YXZ3(_bF`B-+AXeBGnD z_GMw*N-J(uE;zbnU2B@QUd!!douD(b8Vc^LIp_Lm%iM=0>Wue!KNRdtUM1GDPu25z zfceh7FZ3NIZ039NTw=qdMhVx)JX4uxG4;-AI3{X#A;ImI$fl#g8$})E&OSX9wQo6- ziIExGu}hkI%|Z9>O_a&|YW>B8{ej}H%J~Le((9al#(9gb$q@_0tI`9tSNoQx zDJp(ST5Kfk>pk;a>~b$H@pcaWSAU#~cOJQ2z3s!iQx5AYiVa%L&V`-5(WiT1&cwjo zQD5%8TPAYxN8vLc*Sm*z3a^@RGOch~)5S-hrG08jUB5F<3y#^qv^n9SLVVu(R}tl# z`&4I_pRtxKJ-q7fy|wBof=AYxhUjxFd_TSLqVBd8Ol!>^$}WETwZiCFw#E*RPdiIb z9enrg{=T1w5AObc@b~tE+8bo}_E&G7s(Jpa4C z+eJ66Az|%X;HUP?Q{E=KetT&9$$R?Ivk0A`Z0^e;N+FIIp>9Yw&d=a*Wdb7I#glz z$p_i*np9ptU!eA|c7^)xS59hTCGU+tF@ImRB;=j`qrj@xsgeEFC$u~6{fXE5{gZj? z#;U*XUC#QM@Bdd`-T(3bzEjWpUhhAuvgOZe5%X7nJgw^1@BCl>`s#gtMIQO}f_7Pg z{ZU62i+#*r&@D}e#etpRq@+rD5U!?o+|WceQxkG zCJx(_th!0+$a(c?hfMTSl~}HTmC_OYUEvw3r*|Gc z>dfPB5f(W+<5kR=%TIr@+DtfEo2x(fwd5LptIiEhH=UP%ld@7=a5kc8)*f#ACtCOV zrJeN6FUZEe%WMm4=bm!!)VeP9==~cFZY*74u9jB6F0HDp?dRtm+}AI4Z?f3;&#?6S z3QfDG{HIG6Cav&vcb3#W;U%)@+_aAs%N)IH_=L6us6@5i<=G&5`f5Y4z^7@Z|Moac z%X(77YPf6S(sH7;+PYkq{Z&>VvvAv`2|u$mgi==s71v44 zbWi&=u{m^MlG`nXjPCs_W>w9x$h{nu`Zs3llQl2WUv3b4ec=4A74PDYTn#<^X1%-Z zlU3g~JTBU^Ts$vs##Fs3p0*w?VVjgyGrD(+{L$XKB+~Wz=fGyR&yLxQk;=!d4}NH} zsj_tM+VeZ{yrNFx(vtT0uT^qwZAMF9Ofu79^K+Q9OQ=k4S8y9sE#ra7Jpau1tXTE^ z=)r4$i}iYPPR3OpJG|Uy=g}#bPn#(S6db;7kka!pOvmtJ!_6SokpEw~+imRBG&4`H z3R@q&Sd@!hscN~n8{20cQMQV&5rKzR#QqAF(5p)CpB{Wl%I)q4-%T80A6T8wFkiY8 zm}3xr>7ig%=vJ?_k3{mLTs1Fpd1QyYPMh%J`?kBcv=lYj75JwnifJYuS$_D`v%~yF zJTEp$h;Eh>;W}-mJ0t7HoFdk&C-PUqH!Wq-j%w{%^!8z7-?QiGQ9m!W{P|p5)YqS) z+TEK{%Kv!Qwd)1zSXL$G8dTeKhy)Z$%(@@?wrF+4t#k{4|B`v1Hg7wkt@puV|BW(% z8!e|zU1oc`aNZ0vu994??Ga{aTekZ7kyD<53;Y{1ulp(c9{;l?K*PQF*@~Cvgzn$D zAiVtXN}cNeth-=JXcnjcd>Mo!-3mw&U{fUDDff z$}Gy6?`>r(J#4wDX;XYg+nut$J89GIl+C-7x@^rX?WZqhaGjf+#CrJLt7MDE50@pW z_IJFPRpzq3#J2m?b^WWZ|5qul77t&)qULAUnscZ6^FMYy*x4ASzc& z>QXz-3#yKHug-Q#D~~jrB+&RYR^hEu_Ci6w{{}XHCx4&1R)Qhy_@6(?tD^oSH&o29 zx?W}(Eq%f4$XUtT-Lv>D+joBC{TqCCYTVHWcW)c+IJlt>@p2etPI?_Vu>ugYWM%}G}q|*r|jajS6{`f zo~6CFYkRe}Pxf~G!kLe*-8#2@`>by7=?vR#`H!$iGk8sF5apU~tZEk0a!tcgPydMJ z+vPc;1yKQu9~quAjJLRJ(k9Q>d{dvN-tuU%kDtkQ?vM<2y|Y^#h0nZs^trI*&Rrij zCUf(X!VMCEs?i5`D{;8WnxEXTEVFyD$T)xwwM_}t?Hd@s_Cj(9&e-{i%7LF8S^p?~uP!qo4CZ1rfWdb)E> z_%adO_=6ifY?e)(?eZml zQRVJLtL00+{dv>a&Od`!ML4{ou$x`#=ThBc!3xY*C9(dW?}c?+ zotjm*_VvwE`z%j2_wh`aHetE=GgY=!%dqQ^qwSGE2-QPHRIGubC_ ziEVsH19z8qGP`@wKeJQweG+*ObX`8KxAn@=5DliSep5@;surAcdAc`HbxvM|t*yc3 zNgc)?*($v0RRZpQ zx&Hmcho@8C&D7dAk+Jzr%7z#JCO=~B(cL#)EBnLQkgpePiYgOMFZ1cM-ed9X)Q^tM z`#O4f0`(T?xgX!Wc~ zdXxKGk+_~O-9>xeZs2k)`KdECc)LV%+au}ZH^%E%OnI?Ztv9DDdXnjrUlyA$KUvFn z_K{?cmUZ%{qzSygPJSr$QL)b2=C7LIBDKnKkNBFF$+H*CWWIjZXLgZWCO+x@#@X`u;ITgCpDCiww%d2)%yyp>SgQ0eX{NBJ3E%gn zN!!j`TR%_Y;;Wa!p;{X_x_2&Nwwb(SgTkKATTfPaBzjzOYdq@U9W7O^7-b|joGWJ-f87Z$l&RwJkR?Y)rN;{miR){*F-BiW8dI3q06g zUj4T-HRhFyOSskI#0b6t14yZle)%Mxzl$!1{j@7gEw^}p_J})-Q?#^vq zv3+&!#77fWR`DPGxrthrsa~lsE?=*jM zyR^t_&Mz;K=PKvDY$b~)Upj8-KXr3=;`HUy?w>xRf7zQOOnR>0mfL6U-pG0y%V2+Y z{wucp!`{2Z_8f~lwusl~%1Z7x&R1Ua%*y`3spWXlXxb^|Qg6FUSHlhZ4=Wf8$gKXc zBI3sBAV0%5^KPwd{D0wYJLl%6xlZkq5B+NE5*3qPcTcMF)qUYgscY}E0s^mIdMN6g zyl=jpo3HrPo-k|Q*&O*xKyCRZOX&perziig`kr5YZQ^UUW9la~ zZvWYGaoUzxzt19D&R#lcWbL`!^P=9?9J6O@F0Cpz%H@1EU9$H00ag`e2cz_tyHbP} z?QRR(akT!?mt9c`6XUOb)iJirzQ#0D+&TMUZE3OC%V>j4)2W(D^{@SUc69xJ^;+S@ z!;`&UJAZzB68~T5{L$ar_3yvq;t|o&n0Gj(rfcE65Br`xQaYKEBh8gD>72dUDUK4e zyEn`VbwBm4Y1`wfYp&0{&EZV36lY4lCb!M@W4bMGJr5N#`R?Pp`eyx_omza3mEkWZ z^n9~7I6Ujd)6@6U828KjzVS`_akF_{OWwW3PUg3!%ETplx7eCBPZUwKdi(!%ynoR> z$;U4(bu?yVo+}FIP8H)`el&Q)&Z{>KROa+PRIF zPMkd__Ve`7sNLexKlkMY&aHBM^&{pO&kx=9RngZ=r%Ig;n>OX1g*JEf2EOUOu{TdS zuD$S{JN82Rr>Zq)H14OaDY7YQ-*~F{=5z^dd&|>NZk!cozouT;6cZtE!2LKw;KXgN zHGE6Y72coFQj^#8YWuV)d(F5lIp2I*`(OIJnR48{Q;bXhP34oB`DBZYms0MI{M_2C zpJKWSKf{++M$c8fa47xmx!qTUKV>zE|1fnFGylpImBf1Jo1Ng+wit!HqLZ#aL=SGi z@IBWkQ)h~C&t`Sq+GLN+y!m6M7!sy}S4QzUuN1cklgfe(>Y(ZvNlzn;$RU{=U9D z@VC#R#>!2uD}^>a?RiwU>6*mk-K!g3^5m;~{^3lMy}-Bl_DLU+h|Lf4(w}QHs!c8f0eYb^$OpfT@n|m~P{WoqYXM5p$O{j!xOYFs_ z{cG4iUb6gF?5J@RCZI9gLiZA>z{#WlltzLZET7J``+=Bf_E#IzljMAC2SLn0THp|C(yQNoXpI|I1 zG3#tUxgzKdZ?4|w?;AQh`UCeon0T-0kU^fLQ0KZAo%Jig7Jo=OXtL=Kd&vlrh0C2X4CfDnvHv!MZQEY z3uIYyNtSQZtoOF@pZ0oj_^JrrpYQ&Hh5tAId;MdFxwVWU`Rw}^UJ==%>M*sm^GUnv znmrPae;%Iw`0)FCGJAOb{eN5gyIgwv#)A62R^R&_URuRz#mwTjeQD9Fbh6Vg^`!fx z$i5hiMlqMR<*oa=z5eroVsY=FZI70$y>UgUyzwA|#2Fs8=9&5RyDUV` zX2o*VPk8s?{_fS;v%2zZTn_VoYY#E{VZ~a@c3@xkCds(n>mRoC{9bdQF^p-(BTuH+ zN>}*p;vN35q;D4r7ra?gby4M&nsdZD!|XjP)@r^zy=vOVKNoMcJGHYViZoj_+P+GR za|$qB7Chsh;k;mvpw}{TlbR=w~0_QL{4|N55}vb^F_ZFTv|cj5Gj zi?;$|&OA{G)+^FIbFiYOBavbKEoTgGC7Tox!>+e3^n3Ye2PgOiS+}$W- zKlu@_tZV#R!Kq6VRat{pZ4kbYw9z)Jmglhb+s(gboSi7K=}*r43$^dQTSs4Tdavau z&b5a*JpNeg+s24vmWKPR{>uNKo<4VuXWXZ=qBm8p3C^9-9+u|M@+e{3mU}q|{?9sl z?0tHq=DYtN?+eU~zSL~jd;iMj)&4om=09)Go}K#p|FN{qGjIRT-zqix`|tnfKURKt ze*A9AAB){Wi8l57x3#UF@@-z^c5@N`0{w3eJ@*cLm-u&IS?PHA79PI;|F(RZzQCNP z{bCJIwwX-VejZm2*NDBomlaQNGl;1P2XZ>h@p)!!w!d7ZH8JW_rU}>O&J87xj(;l4 z-5Rtu!29w<4)#a-?e*+atiGfy4cmB;vupiTX_W`|tFQf2tambhn7&nMUe_tnoO;JQ zd%c$*{x@GcV9ETx$MvC?GYbFOv%B>Nmz3w~Z2WI3^|tBn`kNW|*Z)8N@#MNTPxI!h zEL@)HZ}-P7o*`cU^I81VIq&Va{}H)vzwB*a+u`%m{)?|YFuV27{@ZJRfBkQ1C!hI$ zd*=~5h5*g`A63;Z?=b&=fA;_PXa9eH_P;*<^M9tzcI-2g{7zh3nE(7_ftXzH(S17{ znmZMxlIBm!mXdyKr}l29+vV)Dk;WH&884_z`gw85+6yjcyOnPUm9CuIvi`~Sn@1`g z@_aAHZvz@ z?TMXL26HXe?v%rO77RR7qOYr36}gJpj3!=`U;*QYzL_U-#B_HJ9$+izv7FW$R#lcl$?c=^V; z-Ma5I3$^!nH9b7(Jo)DYxnRC?X&Ov3SbMC+*L2I~2l>SdxcqiukA2GP^Smk|(Pc-> zQT8n?$C{W$^^<-o>zS%GCrX_?^<49Js+BZDT!@d!_E)?==W?vQ_n~piAzAT6r2}2N zj_clv7U{fks?CA_g-}2Px7ur7&A-ta(qAv%x+K=#b!AOiJMZ(EIW;fd20c?bt8HdD zo9}U<>(aZzQ{P`)5puC6qnOd>{?d}tUhPvM>vkw4r>SwC*xNeK(=SWa;p@U1vtz=2 zR_t2Sv9>gLhm42GXJ$h+6K#p96ApYm&C2|6ckYt+qKj1T$uT_HUzGFa_MBB)xn{mA z&$}qBv;Oy@>Pah2y7u*1a2@0qBFpr z>2htm7DmbFZ|-KPOnbC zKll24+4=8c6>d&CQQkR+mrLc%N&Y0wx!fD==leZ;{bANwwq^~t7R41OxcHQl%S zp?so(*Rh8c6E6Qu5a`;g_cm_XCe8m3mszatY`;0baN6fzvls6RS#$4Kh`5(ZO~H>G z`D^iiAAEVb{doIYUH-GDP1K`PSFOM19~CY7pY7?lNnhj+)!Ve}>3VWW`y_|{PNCaT z9&0zbNN)V(S00>S68@`-|FwDJ(QnJ$VkaIjp6712@?xWZmx(~y!zC%3^R`X-weR8A z6|-kOPhnnjNl;Q+#5}4>KEG+({0EiSR9+>nD7(#ID&c0l>!hcC_llR{T(+f(2L7uY zQ|H8L85?>TWm-;KdB5>@`DKy*pRw!j-aeEW*>J+GMK*kHORUz+x~X{$=c*(=Y1Foh zT`5tMIXqh@_Uj9tPgCa!neA8@Xm-L8P&afZmHlBT+zLYFQ}xfsPRy%&x~ZO_)ZDl|U{>Ri>Q)8bN9c2Q8>{kR*a zDz91fWFNH+-ir?&RN;MXaA9H1uDsNR8+3c$_)D#t^ruJI|AM{jH<72$xBXOmky64Y z5cK5FN`61RAL7e1ikzkdUh6V4N%3(zHI3E6k#&WdhUu|cK}~b?j1mv7{&;7N)B1(+ zS2y);*3&3fwww_InQl5V=i`w!3 z&dud7{u|Hj|H<- z$aa=9?fxl|oD=YHcQN~}^2a-2=x6VpinbZDIbFNdUN4nkH>#2L-<>HoIZ5kUsEOkL z;7unyMZX=KzW3rD^C?z&f9kG9*556DmFRr=$Mj03?3F^Pe;FgC9N$VkeCiaq^JmkI zEq^*T|D3U7TFFDn?%B3~KRsKxF_`7E%G{Eo>CD1U-kwyLxXWbQwT15*x0!dlFG{MJ z;ov(Z!e~;=41Eq!Ze^36duG0?TB`e-8hxKVadnvCz@GlyG38&t{6+uT8~rxFyIuAE z+^vX3|8w(m@}Kmv`EJBB`PsNb>ljLLyMaW`_VeYo#iILAf#;~u?z>`Pxo ziTxA#%D<|9(KmJhyRe_ltI8MrW}IRj@V7w0&iC`-#vc(!`_(@QU$txaurg}?k;lTN zb_|8=TJjD*EqeL2>Lwjx|7!1fzxh}Bf_IEl{4alFaM-y?{hIvxwYDB?e=8Us_}yB& zl|9Ezl>PW|gUXJ(PgSEdKi;aiAkX*syYQ(ae-z}>3OAbAuouZG1T1s>7;5%fJ@fCY z?AL;8pP#8!+k2zv{DrftKk)Frd*>X$v;K~H$-l<_YYofo?f)mnAFthi$YXNH6^VP7 zyJjW#G;rKFk|3~nee;QRjcfO+_v!LJu?R5mOO{!2`uX$U)9nvj*i|bNT)gc6w*{a0 zg9G_)|2)dLEAN27>cvdu5odpAs9D~4nkq13GSkgj+o!o5?fm6&@cz;DOGFl5G_G2- zzij@R+KNZodi*O=b@_LkoU-sl(cgCy98ZeORgydJzUkY`lM5@fW|{sf{P=j~pHF{p zK2)r)E&KJ!r`CG+kC&6Qb4=c*2jstHWNKCGa$cDg*{{uWR_a`j zP5;3au8+L`G+&v(UUK@O@_~~MEHOSdwO*IcFK60+s&?l3#F~GM|6DhnV{BL%&#_?Z zJ{cCF+43A$<2dev6!ujg8 zklnuv?x*Gz)fikW@A$&K`lPxyd*;uo*uoQ0uWM(hR$qAGdEGdIZQ z9S$y^X7=}_B;QSO+bOB{H2;Wmf3xaNZrO9;PwZc$m;8FW1f=e_1?!3Q2N3UvzpWCmZu`w&aELE?MRLp(*`fwkW~9j8(oIgSCpA=y7w&K*YX)owNun(YD2gr?pS_XQvO88_jN_vzaw@H z^*(ucGUk7lq#q5Xuba3V)r@o-(2$C z$^7>C9oz4LU$4#Znq#9OcvwL8pYz$v;d#^c-%BmtrMxNj`}TAmot&cc?}T(!?3Ou9 zmA`U|Z&y@1N6X*SmnC^`RBl?rdh6fkR?jB4jZz$3?zs_y_H2*;d`ZY?*xi38EG)(O zXIwre59OT|{=4W#X8iAciqE(;KgDr1PXDehs8qk# zJ8Ej1R&A}Y^pxuhSGfNCD?BUa$Z_uCRTnna&yd_IxLN+r(*}*xt2_;SCn{`F5p3)c z%fDuvBkQv+QsXo$*M(4qPPudIcb)LGnY1?UjEe6Mb{`w=)W?Qy^J`VKBQhp?@4u-n zz3qI{#2wa4@AJkT|KPpwqX*~oB&B%fGs-?HA0O+u$! zXS~zqFX%VW$aLMD#3@x*{Xp|lL|c~JtiMTuv%DWjm+3sbl%#p+vQDPtJk|!i?C6G- zmycx4nKyys&OHyiGi#66WNLV|&Csx^tBgCM#^m4d1&h2 zJ8LSVHqD!U)@hwDe?jTilWc4BOhp@SRZlXqOS!u@yr;vm^ugo%sUoo*3F)8fS3Ypp z>X@*nHZ_Iut;M3e^_!#;^2Iq;-Rml7_j*Kcx^z9U(=RrqL{ z-=wgwu{MGGIAa$st}yPK#q6=V?1JN@b+@wQ)88NWsDJ)$K{4yKJ0})@QG6NE>T<+^ zN6;{)}p#XfUIWu?VuJ>tr8pVIa>@8_7dy%~5wH?~9FN_&QjGawO)s&a`+1i^VI}~2jICgb| zU%8OeQJ0x(45j#HzFT1EdAIU5x9mfk`knPW+=jKnmo?A(=t_N(^mea^l1qIlaky#H zgqOiFGLGT$t182!HukkBCx(>e-C9;#YWzdIv#Rk?ug_^y^O@=4kAKXqNb#6@z(0NN zxn0+s12_-L7`?80G)-H!Ab^YSe}ka%7s1I1h3n7sCcI%dIrr{dUdv_Q*2ak_mi!Dq zyx4g~Vw<{GMS9e;r=AXX+#?*3`(pLf12Gi1CV`o?jVm2|=W)&-^pth&|>b#BfH|6f_||8-7(b)co3 zsIFhd0wW{+zDafR&eI|$F4Ou~_;%LBv-@A&c9zqZ{d7&Yy~ZIqk8NXQe#HK$R7Z<5 z$3^n2L(S*JFTH4E)39TIbm`f9O>xuxGFmn>U!3SQb7|lg_MSVJa&qJQE}vf5^{n%% zw}mw8*C3g5X$40vG#vjZyY8OB-}na-o0uiqDsDL1TmJa`HMrvT!v>~>X}cml*mp4n zEG!9nIc2j~@9(Rtj`uJfb$WAif?!zK&a{g<;#+fM6|=IF6SgF_A36Bz;8F1ZyNd|c_> zC7sK?w70jW-&E)Ql>8edJ2$?4`SF-v-43&|wN|sgJ;^uoEjNo!osqN6cJrp4iJ^D5 zNN+e+QoP%PWwx~$lUY`DZ_{7e=Z8mS(8@=G<+_vD{ z<(a>BT;3!Zy?ct_n+n7Gh2nqud}mtUez)Px8DT2>+-(c3z3x=BJyd4FU8QwD zN)EFH&M2ta5$eXe+pPco*M!~K!CFU;=u56iJN)zqufBM$8CUlyh7T9=H$M~(I@{KM z+DzJR+l8D6mb*C-HEV9hT$s7ce~Z~{vxg?L&789rF=#Kia%YQ5;AQW7z9RA0*3V^9 zHJ|;>DrcKi)kCvrG3D%STyuKnZToylaOrfm2SUZdN2lv<<95!PDW&0O>UN>6H#b=0 zbb!Ry-!mRNxGY%H{7>*eLt@`~-XB|6*01ciytBWG*Gn)%WR$PS>?$*^fw1_KiE4<^-w0O_8$9&4{OjWLP%nB|!1TAiG3tY2MVVy#` z;~Bjig{3KkBkwbIdl{&$eD>=5#+xLM!Xh`)f`;+Y0VE znk>?AS=fGwZ>fxzxo@6@+wIkT7tQ(vJuIf=%-eqB@Y~Sp9lf@9%xv$p$%%QtHTh%G z8svNRj^i4K84Is`a=2lVowhvX zJ==iU(yDh|bzltY>NDejh(^5$!>9bw0>vh-iqn}#a8XU^K1I!StiU+ za=U!DN&3c57S}O)TbCtWbXKssWOMuTR~5_VC3vPr%sBS9QeTW;uGaJG)JEP}6WWW4 zq;qE9`JkJV`1tzeD=9k{p4F9ln8O`YZm`09?G=kHll3jw%3$+ zmMF^TD!!X${UQHoWc73_&#;30D zckfu^vX`Q3WL%;vt=qpbpW*GfUbsB-{jT0!m&(lBzxkcI)%#?M;=wS^_4$5J?(Tf| z%QQZ9gTbiynt_0sSIo%6Qfwy)pJD+zU=ECl<#XKRaXF9J;_2pjG z{q0z=N3naHVgAkP`_uNa7nQhemK3`5Bk@$^u8Q3cU&h|P#k)0nr;MLa(#nsAH8$pU z&%0&Ul=WONE`#l3;>L$J59UiGpLL5fyso_eq1JP!D7T)Q$(NZcR+rS6d!0-_ym{;G z8(Ve6djGt0^|1C#EHT&3x|#FbBXjc(4xNH|_i}D6+5GbM!CW!3KVnDj#{7={R#tUd zX@PF_>up!JZGY)>%kNC~dd{ru)j0**x5ZwbJfUpLqQa|EA9K5Z=S-JWo|<_yGw=4j z@;vJ;aa&f2ywNJUvt4)glWpx57ZwGzJTY7)@+|wfDeKf*;ap;3ya%E-Sg%`Ie*92X z`tl8BWo5O(+g~T^?e^tYzo8qu;_0;Mm-fA_T2Xu5Na$Tu?ai$^*LLq#Texsq$hNPO zbad@5dv&S?|9Go+>PZr##)(zOrp$`#zL-T(vYw6LOrn=;*Zt#;C zDOH6NGoP(>ySBRM+fAL0_}ob!6@rwwXX)nOkE(2*l)5mp(qrNqGdY9Sb=$mj_BhQf z_K8hDcV?zylu6C8mQ|vmaW@NYbWE<^lUn1mC^vIQXGM7HZjmi}GcJ3(SgROqdD5#T z^saNkG`?YkL;FhWd7oD%`iRo-^+HiF7k7G9!rf{+>?O3kx zZuZid%u88Mwb^{y?VDZVsHE`T-ETdQ#EBgf6O|XMo%7+jnLb6~U*>FuPri(o*Mxme z<9Jkaw0+&4{wUI!tF*A*#~kLHg_*SJ2$`oUep7%$6qZL zcx5SP3_{VPH?>)ED_i8yz zIn!Rzn>}k^v+lZ%<(ErdeYM^4$~b(>p=bT+;fn4mIa>YQ6BJU#*hGS}k2!>Vx;E40 zPxX!1$@1qp^ykdZ;j6eQaW{Cz*Xu`%YkH>%G1#1cajRtNrJjw!6N=;y+MH3_E>W!+ zRPR>exJ$Y_?^o5lPP+sfZ_A%Ey<~k}GX{91g)gp{_T`Al-2RudEWe-FH7own^{rj< z)4d)qSu*SC+5{1nXUSpOEn#}s zSeSkJvelxN5nH<=w%#!;+K^=#u~lYGlf*Jahp|aNbVOhL zn!@r?`QV@3k=n&}y;^!Q zW9z2*i&w4xb3p7tMfLl)HXlq)L+#i%n<@+3nKv>2{wJG+`VTy7|3@;!WG(rVbx}jj zKb_}p;NqocB`v}y${MYlWpXTH(%~7rYv1SI);zIQ;rX2OQ+sdqd~bgIVnX|cErkVt z8FF-HnMs{xlJk|GxUARnvfI+k$CtDoTq-(t_}J3a$Cox0W{MUVy4|k+Ibk~gB%abk zzm{HdoL}&?B-36$EM(uKnc+8&8oH-w%y6vJ{kTamLdmhwWy+y`qv^Za8E-;mkC^dg}nR#MyhzR!W%x;v)NS~@xLkD1(~O|n;ya^@^E zI1=P?dk!<7{h7+?jqfsYKbJA@d$V!cQWsVM#m`F(pZVy>Sl{Yx-Menj<^!i|&V0Y1 zBJzKk|JAQS;d#xOTZ6x<6xn=#Vi7ar_J!)NPOT=(&i(i#9CZ3wPU*>~JiD45#o2Ar zkEqEe9d$TsX!U;Ey|af_Z2u-yeCk-nw(q;_h16%c&HdQ7?TFE4@p8xfr>6Yw zCqG2haQjHz_!EA(a{YFvr*EY?K32?dSnb|Wd~J63`hcxR^Y4H8^*7UY?moTsuibP_ z9liJOUsY0j^&kR9`hv0 zyjvEzwnjb=WP^iwSM;7*@N?9M z;Dx}JW&`DIJ7&neJ9?DsuvquGqyGAQUoS37**GVI_g+>(n#zjlChQ*-X7L+75?weW zQFv)aSJ!jj)RQT%CbAYPF3w&wx8YfGndn)KaEW(MKAbQ<CG&q;u)XT8v@8b`DzC6A8FY(744hzN;w=#?*@icH-zy6TXu<(l@%NYFw#LbgbpE5$0hlfAjdqU!9aC zt9RO65NQo6)_8DVdyQnLUGj1@jvZIua4lZHs5XhSW~yB&>yPG?u6m23D_TCDNb=m9 zwa>IU(EixNmZZm5cYi&vz_4mw!wc6JTjN5n?2EK&c zNTZIO-TRgIG5>x1VMf@zv+Ob-r&QJ+MLGs zo*`ZlA9Ii0m2{I|ui5u!?eZ+MSx>Gt@Ac3r2s>Q0W|?8xOl$tB%ib^J-1Wa@hnGWL z#*Ll3RJ*?&-@I2`pYJ@^>Th>NT+e?IJ8jl*R$OrQ>ZGiz9(%8O3D`3zek+{S75UL@ z-Tcgxw-2kuZt3|Z^m5Ji!%M7>?%A;*Q=lc#ZPtWbL!}?{jRmDzH_J-8paR zrCBUd+wXKw{B|xkWsl%FkNkaNCwkO8-}4H5sA*vw2yWS+1g`DaYhzYN8-&rDV`t-W;MYx2}isY^cZo*3CC)Kw)mhl-R8U2(=S8#Zq@v!IjM(11u#*N&IwXPe;ZC(EUgoi<2f#fYW z<#kP~XU(_zB*!~>!!MSlH+`Q(O?_y}enbD7pj_fYKgO)9x=*yCx))k}c{=UX#C!YC zd%k)9`Qx1bC!J^Swq}f}_;)=gXZtqppZ}%4Kd+zv{PV=;^kWp=i1}F-xy*ZPK>>qv1hJ~%=h$-b9UN=XPoA{&A+PIyrXHq&Yo&tsO}SUm9bmji+byC<=~Iu)(OMCUr1|_$KLtM9 zdCW>7ppxhRy3alr`yOeXY7jp3#^rOQ)uB1x48C1Iw{zBOOO~ztK~I)2-8vHSH-ahF z`Qz2cTeo&`J>rplb$n^V1Un%C{opFm^Y;|_ZpbgOSJ6^UzScNVZhqbOPX%)$ep!83 z-TnFR=EdUTuT3SZ=RU4%PPuk`TK|IJ%>TRgO_S%m@tybb_0KboCB1D-`S(bBW#;B* z0sDVd=ogbNbA$S8mpr7v%bJ zYev_8CQ+Y9hW9>I{4V}1Z~Af7r+1-CwX9w&=RUgeU4jwo1m>Og$CdoQY>KMf6!-JR zo6w{44u`Kl#K+Rzdc)RvSk0l1Iclz!23Lz%ojuXvMA&7~gvUl#wcRe!laMy%+)t+(^kTdWoLYAm$x1wRzw zJ7^%ce_kvnt848EUcSlJcCDhl^&1(UEhu=u@kEczM}23#zYOYH2Ts21JheJ}y_Trr zZG9=5xmk~Y$m-m^vCbwgq$uFz(s#1j->0=n#guPHrPeH`S#ze{D_PWK8d%6vccrcL`AI!* z=jW29J#9k!`<82*^?3dy(1m56hx&<&ixyh#R*2qhdi7hfRbqkMj+JRn(vm$5={ua- z^=*APrw4wyw;(98a)$iAReLO~z2?3DySL5EnWflr^}RQN+hvQ6fBg7xiS+B%iW;{x z^N;5rOt0j+pM8#_;&r(8Ex)?Ls)Ab+r;D|OTs4~IKgImS>3go%OAD>~K60N@zO!co zWAKr{_or@!Pd??Wr(5!?MT_}X!F`9&8<{*GznkVIOvqYd+hcC=!ZCEM_SqLwv)?D$ zu58TzL1=N{v~EO#Y?L^LZ*6;hM#G#fjDTjbRBl zdxzOt%?=mt)~b2;ejH;9p7|$_BX^G0)oCZr$R&P{V-sEw)XdDbS~N9*H` zY4Ub+9azjh*Zkwx-6glyui{+O<@H=`$IaaWAU|XKMQOc^)U<}@ zzm`?y=;kj=de-UT{B-deHq`~*J|#{LIVT=Y?)a@7$Lpy7=;if@C)W-w?yAfa6ApQO zy2^~J$W(OpSw>!yfU|0e^L=8yJub`MRCY3-@R37tPQ#hG3m2K4Q|F%D-@fBfh~XLW zr_VWmJlwv_eAQbg|C%1hvWe-M_dU~NU%cG(Q0v$x^OmV|IwvnqHhZ}IeU{Rz??>0S ztM7QcR#s;2GhfOP25U)-JY8K zs;85VJT(>ydewea+Wm%&$fJ)|X>+HtR=St+{pJl{cf-N9pZj#NRDVL)p&Y)X54QIh zRGv<%j}n?D-;y!CZT`YA{nB}nUuSE-+IaNArY+Oo*V z^ZhsZH?6u-aQbDE7UQ}%rf)?j&8wJEUa)YoYpH>5jJ1>dJcns}zRRrJm71b>yeF{I zvX0q1U1$3ahv3JNU-mIyj#{{Php$sy%vC8>p1*ew)*m*{NJ*$W{%3vujb&K}M0i9z zA{OaioTJd^r^k2R??hD3@3WGp>TXQ8v$nG2IA34&@9oQt71J-&=7e0I$gO0b%(3_7 zSC;0#1=HPkoC)MyxK!%ly7pd)+LLl}-gg@-{goPdE<}qSW@N9K9K;>-FBIC&y}=`Xj~JRp&x>$0DVJ`PnIJst(Ng`Xb@p_B)&?&HEBo5uLY|NH&1H6S&|iFWAx40>)5vKGkMQc zw7$|6eY!I_{jb95*txEak|)aT%AYiZb7gLk%w1>UpZTt_e7Sevu8LdDA5Gk*Pl#Bx zhjnhg#KCJepJ%A`WUr3dtm^0D@I3O(h3J*r10A;bY_ktc{Km9|i-#-r^L*L&we40l z^08+OWGnW&>HYrwTXCONc=n#S3-9c>M3dF@zV<$v{Jk_X$9DPbL(!YudAu$<3W%8G z1sMGZGt|yr^t|~D+m}g^K04pOMy%3a`ZV#NZ`GrN%H?b~<@PefZYs9msD636QOj~$ zROO}Ju0q?kGECaYthM2$pqNS{Keyo2MeO}C@4{sEGOX=rJ(Vgt)yVVJN~2KC$Ez>6 z8OBVxlq^@Bmb~J&-jDf7p1L3Z@Mhjl%M4y-KL6STL&hlI%<%ZLpDw;Xx`SiWmZFN9 zb9*OvuduoJ$};@QSC^%Ffvg|qy`A|bXidUl(bHE0m>K^3n=M+o`R_8@+Ua?%6Q;+w zM2iaiU8r+NNOJqT4G|Z)E~wj^vNgLt{+_Y*S_K1quErYEp>UEsPa(>FcPZC^U|^>-)#g5_`h1%kRx`+QMPn^d@=M>qfgv+)3@;JG;L6h6t8z zpZqcUjPAn3*MVWGXPCDhJ^DB}LfAPV{6|OQ^){Qy(|`5Yym4}3DSdkTa`XHd=U(dg zubP?_HpAj6o71zK3-sz5Z8{|;FMRdW;%DkPlL;q38(vAAsw(;Zu*7u&q3qORxuZ>3-LJ!?6d_+n$i$D9(&G_mXY ztJjKrZ{U6NDLt&^+iJ`EyKerLYN%f^UxPwN_%pE6J}@)EmMq2SGY@BW{j|Nodj zE?*V1aEs*5s}I(^&0&)`{=TR1cAo3hy*HcxzxZ-6*mKgmz+-vx4zoRWJeJ7%_CKnL zC2yLE64xZgID`5{tt_ufN}3+eF8;CJt5)xt-dpR}%RfDs_wHko^BYAQfp4bH31*V> z3j5s-q(3>!x5)DQul4Omt{i=If7{HHv#(bK7K zO8Q5+zSy(LQm*KErpd2MUH##PXTt0i<3lp{WYMkhU|r}f|Ym|XIiwLs;^_9Oa-Y993;Xq)xC zIL5V2wfeqNZ^z-yn=fzfbFkDZ)W2;Zu65t0M(JAuv+1leFY=1L{_&iw@H=i)@xbL; z;Q573%Uc&kgue*6x^lxu{sqihK7RdvOizM?7ux>OkvzJ9pNFk5f7;cfl``G$`TY6L zf79bTT)R&#R4e_A+LR^B`=$A;`;@Pol{0WwWfCh;w_Brfw7JD~+Mj$LFO5o`vzJ!p zXr)^$Q(Kwk`eN0l6S zyC)wWeA>;xwp=aG%04;$GULBJl|{t`pZouO%*ZpC^H@Ho`3(Ql)-8^f>BodFHT{rk zyHslbp}+3nivIqmnZ1_&1#Y`*v~r5AwoT*v!npa4!CIDfTXZ>^ZNNB?qnk95;kx5$YvHpa!}bqC2`Vq}U+>sPrM8rz-`?)>2M z>Y!ap$}=6^DjiQ1Dovj#vvi7~z|HM8{DIRZ&AU|-_4kbKSN4+)R|B7v>=j*6uUZt- z$mG>`rzAFw_u9wlQ6H-GCqIuosj%bDtsQ^9y?FGgeedJx?bFZq>7A3E7J9bah@VZq zqQ;oY2L+WHrJP(IzKr(G+S53%i6?neeH^h zs8btct8|oa#XBwap0mQ?kjsAYvZ=3jzUk)JTfl$Icy)!yvnkpiD=#jdq8@D8V)nf3 ziXy+~q^o}>zLj|Ladm3&UFAvND$Qm+{`ptLRA7Qcr=5DJ_iC1xh6Vb+d2Vj5?^3?e zqs{8{Z`1U(DR!@Tb>FyO*jf6s#c!FHWs8oAWDD;- z>cLmz&;0OE_4&ca_0 z2ke^O8oXO{qVw_N&3|1*)*rvdbL@-PD~%6lUM)X%dE?QYRUN^Luk3ePIlst3+~Dt@ zi1T+AF?;eX(cpYibG2*t(N9H=i>t%t+}y2O>@>e8=--xvirVXYikp4y-qSM+mCUtS)nXiuxqC)VdZNAfQ1JAew|44lYI{po zOxj_&;)Gyf*`AcwZx;OSUp&7t$>QBLmgBS3x4Uw-bp>&$e)4&;GEx1NjF8^h!d#VI zo1%H=J9PN~g{C=xqw;hwO++ZWhB`e%J`>FU0vlO&~`1W#R5mT=uSX`PXp0$y=?t!?`kBbi1 z|I9hCZoPBG2S!QVyvlP8={H|&{eNPT=Q*VZ-A;KQS$8YcmV20QsyMH*w_5D|>Mt)> zyk(jqziHKq7VouLT=RI{m3N)E?l7b1r{E;>)nRgrqWdS_XFU}nHg&)3zb}tp-fTR7 zY?~MV3)X;uTgTsSUc||M_NjGzQ^=CHSJPUur9Y+b+Upwodh+CX@|-G%q<1J*PHAT- zXkEMimxWT*$K@MxJ}YmiaLV=g^oy@D?%4i<|EXHnnuInUdOk6E)5PVXo2N{>{nmli z_@(z&FH?E;AjboT_RKe(-%;ey7uDFz*7_|g?$onO-;~6}&PTU=v2UKmxIjPRT28>~ zzA3xSMFt*U{w1!L(ox8<$#jq zuX8~hi(7aSZ3EVEl};1#e=GgkuF3V(>I?4wnhoZ-I-Hxa`oaYMNxFe1PF{!B@T{E9 z*ItqQA~{Utp5cb*y`_t@N>|5S37dNDT6@lUt_6!TB%{-rltq}Pf3ocKQGX#BJ9+vluEj4iQOwST02 z!>?#c&2HW`<^3PmXLX1xHs#R^$bD1z1TeU^bQGt8(AYBj3tsq=pUC~Gt+`Vl zKiy^Lp}f9pa+bB6|E7w2{)gpuGB7)od8z(%pETiJ&yvRvw=OMV)Ox|a{IhMq%pbWX zXYO;H7St70;eS_ZV(+ug`R{@^-$W*IxZb(qdh%^R#D-OioD(-J&;Q%CZO`|n-+raV zC1$27ITohn-n@%sUerrX?K-yN*^MhHb62fcyXoqS7Z;z@?v}f8X!$b^rI$z7&*?gm z^7)FD`ZS9zVsDHi-mHiYT6Jm>*QHvce}kv8W~tVxhf?QNLU_I_@%`7?{paYk?JUikdJLm_ zSG;W7BhF@eHDK4ps0BJn!3=?s>viPjikkI=eO6OkC7v7ge3NP1Z|;t%ALWiJN6g;v z>P?uO=b|kUAKxfH(KNH#CKTEz5+O>n( z`jgL+WWoOD%7VpVPki?HdEZrAnUEl8WoNMZ;&zKO_wL-uG+fB*dDSSo&ieM1BBg`J zv={X_%z0iH%w3+|xbWyq=UJk6JLgoHpO9v#d2oi~jF+0v!$oJ5Y>dAtc)tsjc@g9v zCRcm?SJFgVCv)jpHu0Y%bDwbaSLg3AUY00&?u5wYu-EgpnR@T}x|TwF}$m)TUW8H3A=at-p#Zvce)IO-`b_;&RD_pP~ud?kvpkR z?XNxBI$>A*Veji7l(t^l*)uJA!~T!2_U+ZYx>@f14EHrJPQ813aBg7}Yu~9&E$3rz zHcu{pl)1!k&%+Ie3w2Jt-N*9&THN_=#Wim&r_MipdF}67VV>DW!W^a3wPicN@$&nGQJ$E&q|I>9eyDefQP?l| z;cZXy?|%)_3O_0*C7s)vI{*J<2j|zHmp-5UKK-RTnuY9p0d3D$NweD}l>@<&VF*cu( zx24RyZ2Pw8-Ltp9-*@@6HB;5|&Fh^PxI8ZDanwnviMiBm^-EJ~Yp(Iu;_CS1llu~E zU-;k2F>9fz)T3O#{=*U7i#4i+`6fwhd+hjK>hZi?rBX+;oK{RMJN;~JfBx#a#j;mt zEDd_eyV>)OH(N%IYB^--*@$BBT?0LOrVU(J{ zJc;kYm7$dtrB}@-t|^|9EIKQ?wW6qd!kz}7M6Kk*j;}r>JYh{fl_V(5H8EW9)CKNi zBFl^_Ef#Y3oSMS?=#pq@Z$M<*5yniD7n$rKE>j{Nb6yoww0!?&f;h`@_viYDChvXT zo;3eoh#=QnCqBRL@kvQjZGGH=)^azlKfHHx^M@}-k6P~h+PtJg_{-MTZ%_6qBy}sK znH{u|n3yoPGfH7Y)SvLv?>=dtNwttQv21FZq1_-94(8R25!*H}!hm(({g;>-{&( z`q99ebE0GM=jsOCqwnfY|M|K7%!gO|Q{(2zr!Khn-eS|dGw+URZg}zMK*~PGy0e*; zDJEs51;@0 za)+{Y?)naoxM1^58ZTczasQdnZRMC5C1-X^xB0(bpY+-y!@a%BJgv^Byn9kIi<2v- zswY!|UBt{p_WX~3a^7#t!#&@3F}s~+DXBQrDj4p0;D_)`<_U5uSo0sR?0J%y?y!B) zvCn@$PEpeT&7}XjvQcyY@oG_l*yHSmRz@Vp(zAS>;njsx=Kj>VlNx%nuUqrz^kWgG zpJgbPa3rZGea-MB4&b9c`M zpPIJ*g_q|ToO=4Ts@z`~@yECmdaauE{%R0KQe?2MS@*FnR^?eim^?P3O-11|t z=5&T@nK7rn+-zDscYVUeyJsgv-qWvg`W*G{i%aX3FsAL^UX{T@SNhejty*g!_w4Y+ z4(lTGWkt-o8uO1{+*0nU9d?CDZF9)By(?TgPdLPPPQ5L=%EBP$bEZDu*E<~MubVFM*WLbb$ttu(f8UnLCijHCb%zw( z3((V3>?&OOndzADhN#vj*R)Pgx_#58dX~-fu1=xr+S)fZdV4ndt46I6j6Ad=d$rxU zNnANQ_c-Y6UbD*N*f*|KB8(cxX6z{vtK6>h+Pu*QWN|7P<2J@mq(z z?1COb&zM#P6*URnefVva^TfC(N#UpWPIz@J^wU*||A9q!@8sUey?Xt;K*ep@YxYr3 z-rjN8P^fI+IobHR%&cDt8@rck)nq!~d$ICV^3{udOAcqC2B9N&%gcfK5$8`z!is=OkUr&8dkUX#{1Tzh3<-PbdTS4n!%z{Bhn-Bb%oxMpQ1m%9QsgR zsL#PI@p#sTl|9Y}((A7-UBYSHRy1Qtw%4lmzRUxPb9|btg~hx4*bCQ2rHTA`Id94f zC$FdnGgnmaoP96KD9(1XeCo#ctn!l2`?@Uuc)I>w#&URS&D=jbjs9-UzSw*ztHi43 z9YdMukH{#;c|MmlH-)m+KYu;r^UiYt)2>fv7C&^o_ea#nkZ^N9m#4Y2zFaTXSAD)R zK&{~WT_4%|x7Pi+_GiTf{cmY5OXW{Y>^&!Ku_R^Auh>4fPa!H_bTy=<>U=!!n$17E zX0^2Dwal(P?Mw64O!(38@Nw9t);-Q|J?A*P88P@jmW-cMQ0!D~T3-C&2~X;|&E9=x zpWiuE|73S-kKZ1o7Od$Kb^K~k)S8$i=_Mu4%XAJlY!-a7_{EDY$5Q2&&b+PT>^I9( za_^7Fs>b`$S{1}%ET+tV6e{(q@5-+d36rViK587(pMK0~x_Y6u@z=gtyx$+~SkSxq zuD2&cXrRRJRs1dmpSAz+KfF`3YAfqyPbk#NYK;7qmGEh4*8MxPcBvG; zT$S!M zmA4&iIxiy}!TnLa$7lD7JDa}$UnIZz;n}pmDr@6w_dc_cQoDP|_{PR3^CuqO_nC+5 z<37=OhaNLNn|JMF$h9kJaqJNXH<|X`X-&(&Wy>n_KVh%dJ`N_ow;TK9c09bUbx8d8 zjf{--k0p;@E^HLde#I5mp}M@Ur0DyB)w52OvB>ZKrfrln)mfn5_2=#R(*HNiGBBTe zKm2I(_g_1oYkm2>D!9sbdg)}QjbS?MOQpFmBp#{_p6l|d+ygg ztLy7;Wqj^-=Fya=rirEB_djTUeAWNx`bYb(JQp>ry(j0i()*rsyr14po8K-sj@GEY z650P|CCBVdI^t6$LLT~7u3hi)xO3GfN2?eXUWtG^3!@!(p9oHiwS2wM)TuFe|3C3# zFRq(%bx5oz|HHDOZhC{+fs#e@CU!2pscFF!b|F81c~Gs=uFDoxpO1*-O%=(@`{|WG zWlG-mnx*AlUirCCyiNyC>Z_Q0F6f-?d40PJ96=gxyDw{htE^k?cRv66>z{9T+3v61 zfBo7OwvQ)oN$q{JMzq#ObDGfnTYFZ`S>p5gWkZMi9hocfp+^oc`IQy(u%O_odN#w1 zGmfe^6Mk%$2*3Vh!s5%h{X7MWtmXgQxpn6kd$MJh`++LviU{G}Sq_y1eYmos7ByCuDc8(d*PNKF9m9Y0^A`E?7d(GB zSBZbD5IeUhPpt2SrPT@t&9{cxmpeEP2gsQo5BBj?-0Ra*|F*lr>)frHfF?ozUDqFd z6?x42B|FKWxAVDTe-&>RW32gJu@{$))tys%du~z7pNWQlzC4lgKD|e%`KGnaC0F51 zrHrR|o4w8*R5)fV_+V$*)0k_kLRN09li|I1Qt1B5@RB>d=UzvYd)4`tTnL_g+_AHS zHO+i)pc3i69R;m5sYSBjLixb9{IamJeUS0C!o7TxC%fFQH_r|?`#=8SHb~DY$Wu$Z^mO$b zEu*>tt@`7(E5&6htfm>A;c1T7Z2b5Ze1^|8Ds?diYo zA6~pSzrU|vuWl9Rh57yh?~EDtsK>pT8!Pj6zs)^sVg0yydo673Sxop=JUjXFY7R*`rLi?ffpZtH`b6-TZw&UcPy;`@Q}Tu>&tZ9#q`( zJ?l%4r*_<~&_QflExw-P!j@-L>(X#Kt=FOL%o4yTX+UmzCaK+X##lwRAU5KOL zpTD2}1Tat4%>CBK_{@@NgZ77>^{k&&=Dy$vvJzbLRPcD5>B;J^CDWEUC+Iq)@mmF6 zlRqHe(zw6vW3|HdOrgZcO;s;UxE(k`i#BG1ppI>(Iw#w@G{AFkB++V&_vu<_o5SjPHyZ4!8PSTIP zX&;uE7*B83kbHDk;cD)id3QfZrFKg2eXP}}`mDLa@%W=Gv)L(gkN3wnvl+a<)>vxe z_DQ1j^6|ZiCsx1sXj1ikhWp2jEJ5ej87w;_deDpQQF`Fd)9Y_UsB=VLLS>H6pxUNYPTs+QA+N=A3A^-4_y_;L@C*D5zp6}l?-zy3Ww=wu% zlwS5&B4lfw&CFQa+(*XS*$oWx9iOafnGpHVQTE^+n_~y{_MA3N=DlE`^r36}wc{V( zY)ss9EnIp}w23T|FvtI?wQOy^Tg+nKvK1m$q7x_KgJ26J?KnB5!N^_pa{QHM8xH#~EzdW3PUvsN%Kkj??HosB) zA6UI<-@jbF+r~QfMZGibA8}i~bNBt4i#gKC=JzTi{@GjHh(GtgApX(+ziH|3PyU;vf6&75dkn|3AB4QJz)tzwsvLawFwpo}Mmdb#Uu@)@i~s11GeY@yQlne*V$VWQ*;u<2OvB(~j?`yl7~Z zd${=TlVcLQ_KBYJJ+RsG&y`ba8Fk-0o3H%sD08}}N#Qi!+llArZ`LSeGTX9GPz|`rLTv_l^7i$zC^x8HoyB5gUcKe9}IhJbUYw zy9=zBY}=uoxGG=l*U_(MT`vS3$hmEttN&w4%N>@fdyTu&tv9Fa5H9ME7QBDcw0!oB zlLw?5IS+6t=KopQ^Tl7etbN^|G_e-L-vuT=em*_==GM*wKX=6xz<6(1L{)akiiZ;#=3TsZ>tzwnFPt;$hUVVRuWNdG}RNJ(C|2V(3 z9M9I(pZu_ES#HjTc%|$!jt-HRXC9xqFg7M;Lcu+zmk&!@YaAV~=Uy`}-{b~J%sP8-SW%klugi#Z34 z-(m4U_1Mfb&ofN(V_gh;X2)$X>{l+VGT5Jb+tFjgF~;2juV=iOan5YU z(YyzTtqk6~mcNMnrh1^@Vr$`-{}xZ~EZ=SUeb0kgdF^qBUZ!!q_@3PT?(NQ}@eF%5 z%-4IP_-w$R$09iyx_Pl-}tYt64(1=2N4@n z-(dZ32V@yHDLce{@LB)(ifA*}-XpJ;PSg}UuuSlF%jCdEw;wSG_`EnfGvC*e+pR?3 z;DW$$nIeZ7{%;%XEY7uAJ$$!zg<$)1_wJ0uU+*8)8!pzXo)Wcj{{c6vH*@B3tVq2r zkdZFK*7^R$8tJ3O4^HG=bL-fhIwR)KG{4i|Jkn?9PGC4TdCkqnd}iZDk%uLlW+z2I znsT-6-j48?^~Q4-Ml$Z`6XNIlDYert-84m6HYMZ*-(Jhze9T8gFRR)&i)o&d;&@Ft6LGlJEBS#|9siX1N!x^kmp)U3I(K z-Xe-~u}Dup=d+LR-QR~F>R|e9$XHW-?e*HW2~*A|H~n~h@N95R}> zD8-~GcY281ft(H9$5mbzevk<1)^|JXSLeEtPiSw_^^8)!=Q@Xd9#z|P9WeST{L1}S z%9A2@Zh;Tk=8v`<+#5_km&r{#YOh(p=jC$Q)SH&LOv6+9 z@~z4&ho>j*u_qkL__03Vf$R1+clDn$+Y}VpykV$Ox-OI= zPA<2#xWr!@wpnS(GxM4g2man)ZLH3)%60Mq#-r~eKVNzwY_@S-$GetL`Sa;JO0O-y zaQo%Ye94d$i6o$tNUpG)Nw^!_%x zF_}S);Q?0w!*4Zb^Rr98dCd4egWvV_(V_$Dq8Dxn=fyvoX7cFAzn2%YAD?}B(^_HD z#VN-pH!RcHv0H@g@)qR}&(~ZiPW0Mz<-$tl91j-;CV}$ZzMCiK%DR0$c>A03z0|+| zZu8f^wLVrar+2O_`d|9`%>w@|UzkL{{&D_$$A6pKjPVKV%1@Wo z-xP&*`?J|?S7*H3?=LZdrNG`xXGzdpxl<84I&LKKFPf*pJ+u2}{SQy+ol)Cbx@6N& zhpZ{m5nst+qOYfNedX1<1-swM*D-}NUw>krcgE$hRckH#zw`EvBD2Gu+?oA9{7C)m z-`rp2*WOL5p8Nl|ocN0R^ee1SRjiOap!uWJ#;CQ{ymO8`mWb#~vh{txLi>80j*HA8%B1Szb2QW^9eS_-+D2Ku!ZS&t*lJyi!mn*ikNf`gAG>P)=>Oej<_%v@ z|G95dYD6nj<#l5>XFjDzn9!wkDqDklwJ-^s&w(dEqG{ z2PVnuFdXu;DLD6>*D$89Bjf^qZT%x(``$d4Sz*i@EjPdMKI1a|XxiHDhk_!Vmk*d1 z+%C-$RW;4Hn)77Sv`62s?0WKO`^2X!%?!AuKJNIC5N+e>9PmiJ)&FSj3E4vD#*#v9 zr30(74_#d}WxasCfuTa;;S9+WuV=lMo?5*oyF=^So14bp{*_!vZVu);^QY*Zwe|5Z z-+8RUjC$vm&)_|(a5ao$N4ay)97pE7sJVYj+N_vWDqowU8Zn0Fpr$)tEZ zZCCT+8Ht^tI!4zdZgi_l$S~=Lt`Sx`$RKc;t(yJ9+nM&SEG`C0_)nU!%wk&-4^yz* zz33)b1DZhd5-ylGv-rJfVq4EYAEQr9OvaeiQS z$6t)ewd>k@Iiu_1%c7i~{N!18>fR;M^?R}|8J1wJt^kDsJ9m-o~jnKG^)jK4LeS{LZE^50oHiT$1NMd!P%Zxn^~MeQ=|y z6jj}ucp7}zoery-yjlLZX3O-A=Nq$TC6wJy(Z7;EF}rIxuC<-#f4Dyly`p2bL~(CF z=K{5P+Wb*M4Q%HF7A$*m&%W}jkJ+dGIOczig;S0?1nL(tPf=S?$s%lVvt@;z!%~Hd z$!(0~A1A$%F)GXq(3~o?RrGw@mXlqLN0`0ayOw*iE6>-F_2zH?8ls_Iw@vjy=B3LT zN-I^kvW=Tgs2b`NO|UFHzAI$Xrj0Y_Ip&>{d450j+MWdmA}_cliB`dxCpxS0P<>uP*<;@b85E2?H3Ey;Sd@9HB<3GQjDGF3{L zLe|H!^Z4paKm9!Iq)NjxZ}}dtY>s_5{BJ3JE4B|_!?8d`-sSU40h_~7qQ6p(%S_5_ zZc=~3ca;CuqEi_`jS)t&O&=sZD_zxAzBuJ~-eg0n+Zp~4Zxc?T^NzneY@%K~*ezFf zaN#C?8TUtz;|yJQ8k|cC_Tz4PrN?D+X!YBc8MZx4(Z1ntwrp^nbg`(tBwpWF+3WZx zCR=;|uIca!7Ww^vtoR;@gXF88*&c%XelUGI=xxFW1DH~ z)ah@X940gx9Pzr_wf4~w|M_;RKPTO4&g@>|r1mAsHha2g-OOpCMsZW7Ui(zaC;9jK zR=Kmw<~~k1q$)b)Dp$$=1Dult6Fx@8F->u8O4_%4t4;6JPQME>k6ceRd~fhtb;_kP zd3oseDT<5cGDUteNYh~t+WSLgw%u$qZ6^gMnLtI;wibbd?PuJ#eO+UDN#$#C@~R@2 zNC^Y)vr2s@r#xC7a^i$pVOAk`ZGG$6vo>?uk6&LAa_-)~MOkfor`hn_dA9Jw=Cq7y zE#Y%A^yVrFA9*n?sdv&_)d!93UJI553+hdtxw5V6|I@-p&OKR`U(c9MR8=$mXV~v? zbipd|3pYACAMUuj;==S>uXkEH_FXMvQk=@J{cQ5zZWrZFC*6Y6Jhyj#PP-ZMm1m#G z0o9!Ngh&5>)_nQ7pWpuf`gwiJH4O|V@m$n7GE3;o1|{RCPg@llQ&PVDnRI@l`~0w? zcbC2Ph5Bb*nt0k~SJk_)9l`(guKK7{pHSCo@z;v=J;1*@)XRTkZTZxMFjnJN zslON)6{}O$GkK`CUp#X{z^-g>&$?sx8Mrs^VG2+>zImDR@l%rSKVLhY>SvR5S-8F@ zB+5rKK*{rnmY~+}RjYkY##=^jy%@Mls=I4b#nX5Ojo4pZw;W>?j~xh4FfQI)6#h$D zRPxmtra939n`Gp##zejfHt`Jq_`LRftl{P-PpkcvPb@$2z4djX;KmrHC+(pH)+al( zE^bIX6!_`FGgtlS6O4(bHX&;56MxQ-tQMTPAtdBvZNL??rOua3IQk~M*NBggpS^g( z{W~-G?(bBzi2g0htTEf&y3$^+S2f{>%Q442E*33^CMOtnne|%X+h5$?{_M z#vtiR#;p6g*AlnNmK|mg+Z?&x?tha)=}XzUOet9+HyU=!t~B3vBaZ!UkHMjiM6Uc* z;TaD*n7OT{oPWwc}}bAOQ^Cx6`DF}mv+V{ahqbuI&t;EbS z<78u?;0>jdf^}LUUUJ{Mj&$##SNza7$1r;;$Roq!sXIP1x-h9AWZdvud z&wiT6dFI(o_;aCmd00v0M%h2dSUP$Va#s3o?wx&+qnqK?nHz7fyti6*^GKk2({rG+DEBmggTkn7Rt^c;`{eGD@>t5UM^ZvViVqLfM%uRundV|+qL$!ekvHR<*45P;wqCd`nIy*`v4^8aB>Sj; zPlvjOr`fiRTzl1CbI*|D19wu=j&N-Df`*xT}1_tNp! z^D;TtHXYh?wCL6vzxsclvk$&Gs_!gvUvk;H1|jiy z?TP7nY=S{gXY7e(a`P$Nr*=E^*V-DDkcac%^WYPGMMIA1MHb?tTv&dg{|k-g%rb@W=$TIIY00=pM)S9&?^ znx5E<^az7ePR~k_%=}m8M@}tsnxL^Lgxk)!fBL-U;z>PjQ??dpc22u6{fgPYi`_Yq zU$?Q>?+*F7Y-&^e&-0}v+QO0%8 HxaP0gmv!`;^V%8zea@`a-uB@AhwLyhN8Zr3 z(3m~z{9N6B6>R9Yysd3MZ~5^_#~95&D*G8{zews8n&Zd!VfVZ~gPJ1ODWZJ;R(*Jz z#FZc@*v%OEE2?k9_HKjgTc=(SE!tJiuwH1_Z^q^RF@NO_1hV<<@oQYDJ5{e&EcaWh zziZ-w8J{czZFx7ivbfg@?omC?ThILC@dxpP@jUhCBle{iPt=&EyoG6Q`TYm0{$_eF zzBzHh&-9}6n#~DQ+)mmb6wTaYu`ASX?*yAY`v3DiOSZm0d0E;#|DKGj>FoGv3nJ?xN1s7 z*PJzrU)+`TW<$&5_bOMsV)UQI9Q|H-?)cWtbKLn%MCACnZ{$8&A+&~dM@v?H#EB(4 zKV02#_HzC!TZMw6OY7|dR;kow1T|~!mooTSbb$Hrvb4WhA3o%^vbXgv`;&Fx#obQ! zHlH&;moB)gB+^?GWUDXdzw(5R9>>X&qh71|zv&mRV&XLL(N_If$o%L+&?%uU>u&^i z2}~-mBOxjEi>8dHeM3=mGjJIpNV|A@n@au^~>xSRyN3|F8#vx=fu;U zKf7W~#X^GqZWip3*sr>BZ>5nz{MU2U&t^~l|3-H2>oWGepBq0ud$HvI>B#)A7gB$I zI;8fY>9fas?x)w3?rBe)s+2EV7aRXNyLRpRuUq$ByZ$Q*ne*%0_5X|yG8sA;Di|05 D;f`wg diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/cl-colors-20180328-git.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/cl-colors-20180328-git.tgz deleted file mode 100644 index 88b0888c0d3a7ac3a746f06dbb1d6c487bf3c4b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14566 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/cl-fad-20190813-git.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/cl-fad-20190813-git.tgz deleted file mode 100644 index 20a48b7723c71d791b71450678fe594889e928a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24659 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%0AlpMe2uhs1}0Xz>4vR~JsqzMJIw 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

q*>7J;N4`41 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/croatoan-20191227-git.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/croatoan-20191227-git.tgz deleted file mode 100644 index f77d45f5c79cecb953cf525684a35f2adc4b4042..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121276 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∋ZuJL=PYM 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

@{rOc*B$vYR2TWL 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≪k8^H#zWwNd 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

UenoTn`+||bM_)}=VG?% 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

@&fjEKziE&4w{uU=B~)2V-xYS~ z$8(Lz8IO$rUPylRWoyM!#rxOqp0DrSpQd;E!`AKoGPw`A_heVw9yuV^J7@oO{!_s$ zQ%%&qyqMa4_j~((-+8Y~A|uUSrLTVbiQ!XhNXXU1!k^P0@Atjz**^QXb;;ayHMRw} z?w$ITtdg|dcXGv(lb33Dy}Y@1^8OF+v<@UqTamj?dcumYU95knUNp|;D~gPKlK5(| z?aozs9w8Zi&&=y5KID9)u_y5OB?G0HxZCbQ%tk9eUznd1{`iOfdXd}v1kRtd{XU~+ z8|xXymnOe;_-vW4NqD`OOnVJ?=T;hRbIuox8uj+<589RbT&q^?Wcv*}c$5?nv;O<%hn=&tef8UQr>=DmEvPn*1vQ6?dnu&%ZxbUt-7|W z|30H%H*4qX%>9Ooi`oBtxfZAY|9bjMn|kBz&)wH$?DkJxedR`tb#1IuRpjUFg}#w_ zI)0CCH6|arc6iPf-<7{Tf1lrc&$U-@zp-kDr*pK{>!_PX^5-*C&&o}))eD)syYca! zhhdxlMeUezIPvT6_X0oG8*ndP^>*vUqwa;7S1tF|@h9xQv|ei>-$jqRY){*{wOi*k zwA+4rxJ}IKx~Z3(Q^2l+$&2pq)tb6*+lk}+GkeYT&5KL_U-kPS$t$v>P~=MQ)s}qL zMfKI!)sCHc7zLGQc>y2T(w$1&qwdUJiWA;;>t%puzM6F z_iyv{oNl-3g=o;Dm#n)#N1mO#XWdQi?~x_S`_@{ruKVt?$ByCk3>Jn(Yo-F;7O ze75PGecY;ZM$1jk^?uH_IQ3ENU&YSvy@{*s(-bc81g*<4vHx^JFiDpCLwUjH)3fwq z{kK<_U%4gr{^w7=YkhseTft1097d-FuUXGo-d(JIdm3xJ5TEglg!}}fpm|rr=YC~Q{(o>{wa>le z303b-7{@$1X1uL<#q$}anLn%@xTn51nQR}J-Zyp8toN@7t)W^FwO1?n)o#0tsb{lUHERdhw14n*NNRWvyji=wVSc4%4)-T^Sa&76z06VyUj_kt*Wym;M3!Z z_g2(h9zb1eBq;-Jd3-_6-@{^TJ2mRM4_TP$M@TIVHC+|j${&^*9&uXqUS}$L3 zyveFBb$;xUQ;|QiG(vt<)~N7L*r6=Dn}NHy|M#@OxqDwsj(A)1b;i6!wu;}5@#Xiu z_C9p|_9VA3N$wUI{jWJPVe;V`VnruH+T&+G(N?g_bWHF%=ltMqTlX(Lo!oUI9|aF{ z`mX+&a!z%@-oxAPPQR2it@Xa?h4m8{=UrPa_3((Vbh=u9=%eyoElY2;h?kbG?cBMp zc<&ySQ)S<$En`{0)Zz8%@Q%Arb&LP>vF%;8>X!17z3O>SYg<>B&E>hWHo~xVeM&sz zAG?G5&8};|Sd(rvMdZze3u@8}On6RiT5PyyRnDfzq9?^ZIF;{Be)V)?!urh4sp1b<=9{)L>Zh|)y3J>v zP5H0?u*{>c`^CF0AL<_5J^6D*UfW%Rob^HXwBJ>&XM7Ue9kT8&`)Pxd>THJ+zt6OG zJ-Er~)4#h#s#DmeUG4q$$!9T}WWHqoG4HK>?CaYLv;X~Ee))Y|_HnzTA*=2Q>UW&g z+WhpJ>`#sF^NK%xxE;K5=IwcVoDUz~;~8+*+H9lwvFgW-kN7sey_rAhmtp0(4D0&s zO|!2pJzBl{=Bz~p=XOTwsV!6ayfQ9xZ-1|TZ_Mh`t4nwEq}sl*w=28u^2hLrYj^(s zm>7wZOSrblI$zgPb|p`fSye7tk$QQNouGd9P#_pO<`E~rX7 zb>seRTgsZGvyDV7XXd1uoS$F6N#v5kP5*1FqpwMEO2|CTtKU?tDCO>1vRtak$aC$r zslOQ5-3pIely7maPwa@fmXx^Tk zVP_M|`jWTBoG+?RE}op2x?TU}z8Nm3?)N<7+PSO!>?**{r)8N<1X*)ljrtLIrHbXR$A0z_nk85v{pnYHi|{`7(U5+acQH*k-zgl zFIZ6GY;A-)bcZo{JoS3&lF=_dYyRP@F-zTOx(^WF}-SVryRKN8|%nAK|;O>p0JL`AMlNT3F zELv%kusHC{#(%%g9`#wjYgX$m_2dPaMd1eCPn(u(hTmJ;cb)TktCJzK_P>=|P?boz-kfEzj~BY_FP-JlS(5qWB!kbqT7{)=N@~5W z&W4F>`~Ktd?4_>npI(~0X6EL!OMQpeU)4ICr0iwdJ%ik~+xEKpzK*V8TE10%cjKx$_kDG> ziOl!yBR1Yz_4dlG*}9EOW?D9_Gpz3YAosWKZB|cY$%W;OQT?l2{pY+rXa9-&-zvj} zv5#+*d7r*~iXrj!%2V#=#kGRweY?KzzUG3h<>q-3x;G;i?vlGvsh!$>RQ~i;)<{Vk zySqlcKR8sTzNz~ZQoB#%<+(NLdyZPGT1F`rPM)f9e4fL0l}?ct0xeb2w_Y7`Vb@-* zz2K{Yx#YiNpWLI6uf>k;5ble)%$#w;sy7#k8g2`faoKL4 zak-Dp`+4x~$T<_=Uw&lE_F_)Zlfsl8Z*SC0ioeD3+LyE9Le-~@etDbz9+;DKaQ=tV z;~P)K9r=9StJLWHy^V2x8Z)1-%h@;6>S=ZFn%YI?%DE4AS?VSpb&MCuv|1SX=KaKf zcFff#7s|KWTUndDI&w6{^4Ofm^W|AyOyASEl{xC9SDvYQ)9=4?Uqtiom^4#hvDnG& zV%7gQ2Tcw6wY+?>{kfH&HorKWvhnCW?J%iH2fgo^|K2<|#Oair>TBJ+_^p?wzWF)5 zV)y<_EBC%#@S$qqn>DUQ90waNo{ITY=&cl8zdtzR_rc3o79HL16UMjcgqUsLzp2h< z9{;yZw_oLBR{6O0-kT%eC3@e9rk#+O9h!0Y_uZ>`u6s?M#@C&nSN%t7Uty+jN$cxk zG5y)G7fwC>zP!iV%=ANHeM_CPhkftSnC8o|`Hw96RIGnVgnd+ZzhimynW^@}?~b1T zKe)v=Crhq=G^gj4Ngc}9fuQHDNy5sZhh$T}} zzdZ~)cWArT!KQHQ{-`IlTGh|@xUc*#kZSzKlmG*B~ z9doC>uaL_jQfugNdsW3rt&Zfr@P1u!^np69jmxf>+}!?Uhm3O3{}=u{o`Y^EU-{6Y*Mw2UvMub0yZ9@~ zB-zzx3+tk;Un;P!+hVP1bDK--u|)R_&u+iT_x0_!Zae8K_IJu3wV#>Q@kiI3zdBj# z$B#oR7k)3)-tl?;+ru&ux0jt+9@X`;PgZmC+mDX(Qx~4T_qXcb#5d=9*#3sf{j^*& zadz>F{IK>_NB2#4d{b2UC~oP$BmOlS?=F0}DZk?HN=wn&Z}&K!{X5Oz`0LM?=1G4J zYyI1A=(GO)p39N%e+H+_=(=EN-|;B&?S$`FgYpj;cPo4=e*CQd%Nav&d56bYj@-F@ z7d2Ki3KU$cTTmHOVj8hqIsKN}B$>(oZ&$|rn`pCBx5^~dq|JKyX5LxH_U|q}&-nhP z<`K`XHO+gX7`i)8r%iD7{kdXYwnptmzkWg=?3+BJa6HdY(OWq~o&R^WdF}*7C=CZ+jbduK3Eygz3d; z$Jc$*J)QR`Bm4UGciXRBJP_NW_vYoP;`eLym-8(9EvED(bouVr>?`Zy4&Iik&9W+L z(ck30({10`EGJ%T=B4YVoh}MpUo`dhx2DY-lzx?$y`JJK6YmzTlon<@q2u{+`3oPV zGiR7D+#0#7Xxi5L|4TRv^WSA@+N^o_r%w6#XH zlUR`MD&O|@kiO_F(^tF1t}cIn=zqz9ow<*@lj^VCDDyAnd{=KiZ|>|B*5&s{-EKQ0dDHTJ(r#tHt4^(byiWDh4!!3# zkKDD^Os?PiAolML>s86D8urE0E!p)B#MB%O;%4=|ZY6NE^27aABCN?Ja@7v|tmp5} z>`9z+L7L*6A0@;VeDQ%eYtc z?fpx^#o=l5JZl2K_BZ>tm88yk%)9>iU51x&AD?sY*t!1aA&u*GLLP^zlY?4AQtei$ zZD8e};dt+<&B31Mg0Xe6ie;I*d@478O<5EsHT~7nZm(Lw?I_d*&REiVO9kZ@TB6+Mj&y zncmOp;^z`QN)pFX@6K^GnwqpbzPo0>v1z5mN4J8rf~EN{pLv#P-afJ8=a>2Kv$CSa zE^hm|WY(5-pQ7@Q#WXlD3I(gbdwYrPeO|FFx68X5FMpcePO7v0JNs0y+35>X_F=sJ zpYQCJjNbWp)6zA;vo*NuBMi?^e_8x!q zPHOk`?Jw`IytnUj{rs*|d*a1b?Tg`#cTo27J$WNCtKV#g)Is;N77C}-k9tTOAG~eg zdUvPIgvnMb{LPm{+_hCTudB+otuc|;$>$Uo^0wi1%Q&&tL;5^=WuzBJH!9z2L$ zQLm!)QSi#$4Gw|7rfXe`U12Qn*y;h#8iR+C`<1rex!7Bn-MEhD`S;`Vmz;Zfp?JCP z{&&wE(xi{v$a$D_#Iu+^>-SF|*Sjy6|3@-D_gOjZ$7a=YFD{nyedTxRmrR>_RCeX8 z<1cRP*z|tUX63V)AGcLJDmZZPRj5C|?~jJ3Z^Nzat9VaJGA;EL_xtVKop^ISYiGEX zrq(vGmP>yk{cQteC*}Q6^$$OGXIkZF-tFp@ZU5fv6Z-dQ-_`KlPPM_01$HxTw>lEd z^50V-hT-?;Lz}d>eauYfHQK*5C+z>JHCvv)e$ueyWZ;@x5wjP}(A>G*H2z1vade{5 z-)y_34=eV4_c>8L&2-(eps0KH`i3VT?blkl<7w65o$o(?se78gr8B*3mEo7_NBd{3 z_+7&v)DriuCi`#TPa(D>Ez{>V|6>G#XP*e#E`Du8vDh}-(9f5cgR(Eg<^Jccv-@=J zpeo3FbTSR)!cmj!P8kirvhJGJAG?&zA-<~M4yMdIjwmt@2(Mc@80;ydiS;6 zcXz9;fBvjojaBi!Qf_|r^t*4H-d=s+kbJrF|E0b)f~7xLEsXs`o3TvZ==|+ z$tU7h?LRKyYk%v0Yia$H@9kT3Pq4=uJxLRqC7y8Xeht?@2^*<}#a}PE6%<%**ck4a z9UsWE=hRfG)>TKAh-i8W8v4AOc_eeOZfMi*vY&1>J72Rjm6QiQ{ATAacDlB0X^%&o z&!4sqNr%S{{CiAX{(ljTO4+%S}!me{r9lleh@>FiK; ziR*+1Zw}W7u=d*wVUgbtmCZp&RdSnG!e*> z`BLk&A=<^ie8JSj_;;B`OZ{^XDXk4jxRU?OqD?8?38*4rMRkj*5iHMWqwjs z*7FYRw?DS8KK^xL)28K3pY|O787#cw{iic^64x4RJ?hR$ZP!WMf7^}E?Hf;vTgp3E z{e7=zMr||QQ!v--n%Syfo&V_U6f?tRH}j_j zx-HMV|LT~Kh}Ux#pG#~fcDDa_61U1N&&_R44|LqklvZ-<)91XT-aQFHP9H8hsHgY7 z(Y*YA!M|G*(pgXH+T?9L^|e?@Kd5}i9*a=BrF<)#V$8f9*ISfpS?rGQ**E8gdrOYS zi#h)`rBAI_{>WCBrFNCKq+aCJ#v|X?ybZX~sQuHD&FxL7$jf92&OWQQf7gBY1ZtalJ1BK?33y#}7e4KOt!mh^$XEs&sFmbJ$E@QFOB=qU~)28QQSUmUTN8Qsj zJa^G^=k*6x8qI6UR+Jgql@-YwXutZS%_98CMp{s1>uvL6PhRKn&#Aq;zR_vY#%;T2 zZ3&Ha-h1%p`?WzlI^rhfkK|j;cb>C5`MGtKyM)){$C|>e8=u`RZ1nzjE&rMEbJZ_T z+4^njfBxI_<(Gz=jd{^aK5w1MEvyH6cFH&$`IbC!O--gBxALnAhi)A>*`};EDa~2v z{O`NRW4&H|TPXNH`p1YncigAt5uatoQ;~caEjgnX)nKjHk-6FC(9lb z({N5bd%M~xNMXx{Jda=M$1U#s-m`1(gZFRm2>n{R>CUb|v&0i0Z0w&tzFj#z@zVA{ z$LELH1-*)u?paH^#=aN0digQ`+s~6Ei)^ivtKVMj`nO@mIvG2?pD`^i`O92x&Rz7p zM8v3h+it<5wyz%=#IMl{nEY&W+vkf@`CqfW@Lm!B>_2<&u2ljrv->{TYHlg%mYQ>N z`RQiKv*Egr&KTr<{ml2TDTHP2>@RW&FYVs{6)-5V?FG4& zd%I6)?RxwF{*D*(54$fA4xIMv=I?s`%dd0(c6b$ba;!6ip!SXWV`m+nyKiEO6l4+yh(F(w-p=_{*(Rv>4P{I znZ#4Z;)lOW9j@+9JgxnZnFH_g^}$ zKl$7K+KqQ!_k2J8QY+p(UG-t}8D)iCcTOExtJ80JDz5R&cN z5$X`KL4KjntEugKk4=&O|4y}+C2s$=u$yA`jN5#E%lv%8eSi6npBs6<-MFp3+t}t` zdVKodW9N4NUM2M-X>-32lj_2^jnRD%bUw7?bLHRSmwc%lxW(Xiz17bGy(iY+9ZsDK z&saXQF7><3)R>4bfg8>#b?^Vs)w1}`{l$Xw?My#S*?9C?WX=CI_2IGZQ~WMG-}dj- zhMDSCUsn1#p1khj|4DeV!v>qf^{u5&RkmFcQ`vho{<-aaEVXpX-S>BcKM6&*2fg~f ze(S@KCHwEy{n*d<<8^p=y-xVGQ$-u^2Dr}atGg_=jN#7Z<)5Efe_nI$-pluYqklh> zWxcbViMTzoq50*0kgu>5@=gyGbYGedHI*uL*26 z*Z;J2nDff+^L!zE+~E9!ZDxOqGX><|HLov!eyR3hW$W7}E1uq~=IM3c@07IGRqT5H zxns>0J&AeO6~9I9`_8fJpLy8V>?==$jrSyL5cr%WVFA+OX-zOZReh! z`t2K%rYppMqvN#cw8^4dcQBq(h?>Lp=lfM3U$5MK{uj$4FP@G35MQb6xcJTQ=j;|o(L!gJAA(Rs$3{Md~uiJPid~>($TZag&7m; zb(`nO?)CUH<4VYiUx)Rqj$huiH~8JVq>TUBhJv5U^d~=d{AV{Y?r?*_G^_g+U;P}G zSI?0?uHJp~MO@cvn~P^-byL69UOdcme~aavH%&9Q8_L-(m8v) zUKl=!b_&i4kBv3iv!YIM`Jt!NKc#$YYMm?Ased_X=Hh$r^E2Mu0PhBoME_h4C$XdBrZ2s}Q z`#WdB>vhiebbqHOZ_ZIEDY>U$czx5!4MiXJ^H26@c(}N&n9={fiAdSI2TwU)>aONt z`n>a!!@>x|saZRg?cH2izF)E=$spF=e)_h>ie7%AEfKHYE(m+Qc>AS4vRTm$CV!iD z>u~1zPZdtue%YmXm&ff}+xY*iudS*2y1TSN$hoWfh=0k-U+$vy%~uLn9|?4yazFZ$ zi>>~f7t`m5@x7jVd)1*0@9ck>9oU~M*R{cHT4efdk* zuPIe&|IOO=&%o*s=5Xtf=;tf^v#UX3XdBfAlDz(BbKT1Wioz>;l0nESJe3Z zHCwrQ@7A&%VtprBTVE271eXDG%RFOZiEc<62S~q>dMYGvkcD}wZvr-iO6RuiD_e5f*O#wmT}18@>vy6*Hk%w- zkl2=0=^4C1*I-sxRpr*(Src!^=7@-%2>8FxDKqQ)RsC;f?h|<~hfjF%UcA)#u31gc z`pU9%roZ20m7m_zH=(FEC$GA}Ec=R})s|1Chd%QxHJ>9F61p_wZ$L)eP9~N5>spZ) z?!>f3%_~|qqxQzr(@GET8!!ENu{UX|!1M)I`IkR=mj7>yfbrz8J*IEMKl%9w21TEX zeVFntXdlzm`_h_^nGRlBc=FFaM~N2)BhwQFwu|1#72oyUd7EUAR{3$ul?F?{P4mC@ zj_pLXS^n+TK(XaM$8t8wx@U3*do6NbUh^ehR7QOIFWY6We!sAGx++#Ltr?zpD){Nl zS1EHJO!Yd~-M3&xa%;v3+ebEPcmBDm{%92|oqm#EYHL_<+oLwq152&L?mFp|%ZcqP z`dHcJ@PKuRMZbQ^mp1XVk6t{dzX~kfoXQl#@cpFkJG~_`-e=RM-hNsa@=kO{EALs! z(gm?q4}wmgd3*EX#NQ<<-^EoVTW>OiD!+fbgh43n#hhKf`4Ty`dylUCH6?J{i%++c z|E`O#o2$Dc?p?sOmLla@;d7PrYHM=!I0K~TGA?c6kvn$g+~l7Tn>g3qstYaU3R-+i zR`%MYC6hFhvph2P+P`<(vpHFdOKDcDcZ82%SFSz_*~SoTWA*d?yR0VM|a4EL!L__eP6dmecfVfQ}cYi<$jU18j9a$_by=T zl|7_%QTChd!WpT`rmi=$R-AJ>GIQJefW2?JPV@ioPd&HKU;EVTV-5Vd+{bSBwH;%1 zwmN&V@KYiGU!h2y@Z?v&!6UZ?a%aVO315_c~G}c=^I_Bd+gi zt5-dHuyOj;UBz3bMNa;@amU=uub+Rhy}fQFtaG*Y_<4pqt4MC&k$oQG85iw*1&*ad%0&{D~#J>IYjl>&fM3eZ0O> zkww0$Csii=d5OoHCBOEoEeg&zss8wP+s>@*-y(jSrg46rB>9QGiD~2i)Gc!JKfV7d z-E-76-(1+@Lz#OS|UaPH+{-hgzge88roz=YE?=IVk z3D_Hd51UY3_y6$Cy;rrE(~j)uUs5@dGw%I!^BhabTL%AsewGlt{qf$_1pUMNPx=YV zyPdRsJ@e^_zH%$q&xX$uHwP~dZkcZD66Td~EJo4p>HUg@@8#pJ+;n-iFMijtNrrol zqD0J8gm5gVGB=OV@op@?iDNZJQW& zUyqnvcSvWgWvxQ->&e+_qEhU=9up#;ZSimG63@LXc-vglJ-^T8r^9T)1wR=J`c^G? zQPO$To!KH}+ii3ED@sbsR01X)E6%>JG)3y6g#LW9+o zxs0p+P0ILkuQS-C=+4ybwj4)J#)zG{?HJ8Hqu{s5yOaX2e)mQL*ULetm$&P4Z#GJPe~i)nXJE2p`T6tfZ?mdOFW!85%cI2t zT)w9BT=HLjI-@pGHgMC)S93of)DP0un`HUvy!4UHo7&f8R2-jQ#h%*JmiJ91gR`!E zl5UH;0~5tx)OVUUQ#&)9f>Lx2Jrv_Yj-Eam5#`Syp)OO6`Vn6(7`Mq7ge(1MyPoCzoWeM9CyYlJ6VG$=R%e88rM;|;T z@$*Z&nY`ic)@4HZTs{{g1Y_p)I^1QLGfl_+pW5NS7R$q8WnRsyD6_IOZ~HzRA8zb=lS}Qp=cw&$h}a_50>G%qnWAO=xYaSRrC>Ua6I7YSXz& zp?HpM#{C1ewnvVwnwl*1I)B5nBaN4j*hlNV34d#9+;ueA;B;7Rxax+>^L$@Czdt)d zFX!2hQieQ^h}>my+h?s^v*li(rrMV#-H+vIPfFO2Ev@zV*6iT-mElF zRQ&Y()1UigY*LS1__p=XtaHk93LmfE*k7SNF}=UbDW-j$>07l`-z#+wfA!tV{^o7X z5*9-R-=GOe{Wh^d#n1UQ=cPq1_nm2)#{6l)jDt~rKQnK{{+~I^T=RVHW#jwO%oRlr z%L?ajj=GcEX43Gye&4E10s2?1mBJNG>vr6%%f2_WevXO$na?|wD>py%W%#u-R{hS` zN4Hm=;@#K0xAfbMMuVA(8SlIfvaGqdW3NZ*OC@;^2dB{9=C(G;D<+p)>@}kGpEta^ zwLbKV;;x2%8}>aa`r3ZQj~l*(?EO8Sv!V^d)K-|9!gvyx(8DI1>53ggtt^nAKI^UQ3X zgZlU0s`DAUJe_-G$y~nYmmg}p+PF?uXGKM&`@1Y*OU~3#rP_mnp-T@IC}yab8gPH_ zyDwE0l)vcuGMO#kUsq1Pe(GDV1$$<+?6}IOv*mubzOh+qg4Ox- zc|q%Kzbs9gEn4FC<(^Q8!g_uFzp2l!RdsE-$^uVS^vRxF`mivo?!^JlMM!yL?}D7vHz!n0D;bb_P}Bxl=cujbPsK zZTI};n!9y-4=g=zo4nzWXuJ61`28}oj!*Qz&Byd9#JE{Un#uEP!+K2{>*5+YmFE)2 z84T|%udz&Kko$O!VT<%bzkqzk{n>X>{Ex#D zJ9oK03w^!uD`Rf?gYK`=bqmf#?J$^e%1m$76`lJF1olb45DPPVuPf;$zGW|~k*`6< z4wD(*l&`=0ZL=k?V0ydU4Gu@4`8-!!Ir8SoJQbSb)3!Z2keAspcXM_QyTrZ=`}(gh zeBP&Ty3_iUxuEq9*E1q~w#$RVgF~*?hTc**&oYDQbZYdTm?Mj`MW>qI{*ckx*?xS@ zOudlwZRNM#q;0%s`#SNOaO1CCo4(GS`~60rhs5*E-pkhPGi6lwyZCHgh#PzHPtHwQ zo5MLjFzXx@IGdcuSR|C1w)k+SMC>T=&pz&f90d%Z+Esx~Zaq^3g}EH*uBwJGR=_W%U02 zI7O1B>MidBR;TUHqf=*X)|u@dXAWze~Zg)OF_=Jrw^0@&A!hTp)K>b6ZyD z{BB*r3%fIBx>r6h`8t;|x%0DiNa52t!t?C~udR;c`n+(x{beI%`R|jS2l3C@eJn3- znqx1Unvme$5aEZ7&L6I-*Ofn$R_l|GIC!SiLqx zWn+Qny`6=U6$0-z%18KcoXao%v2C@=?bI3j)Sm5_hf1`~z8^`eS$I+I&yLPhm)9(6k*c}I{NT;5NjyStRL@u6eja1o zYQ8|!B)cy1vz&PF4U5dgcZx-y_MNL#K7CkV{yIzLYUzVN7>_2)hxWN_llbXgQ*$lr z#J$gFXMUVL_xJlbS!qmhrxLlC6(wlIl_RYebzZ1{xb>DsR+sr+Vi&NwSEl;jC z(ieGTvDjwkx;$vuT=UguO8$N_)8T0e*Vk9!QMZ;@NcA1LX~yiB z8vAiyQ&aLoJBNE;%)UI_@n9Wae@HQxY4YZ7-j>Dt_B`2rk7t3VgLkfJ{4T}Ge|dKZ zNEmAi1pVkfvvkX=&<#gA&68rj_}%*c$L!7TKi%PvUjEq5)oP%>_uvseKjSZMrAiC$ zO;o+0`F+RTHr+Uzt8sY>>&41>rrfGZ&1h5E^`9~3(0-@Bi7UTlN1vH_$R<4AmiyO> zZ0iku)8r;>?uxk(Wa6EA<)ECn_VhJ&+^3B~o^$+>e7kk4;$8V8&-9o3osiTq2~pY- zyx_TL&hI>%T~d2iY&i7rP|* zUHQJ!TzsZQ$$x$Y#iwVLCYwrGKR3@wUUS(o;q7!?C4p0S+VZbAO_$W%b4xL9{>jUR zr+auZ_RpSvT>iNA#M$?>%#o`?2Bbo~}L))%1n(mtM)U7k}SB$>#Bt|DSB$yjgehp!@mVJCC&_G)Av} zETVsWLH@*lj+*ag{djZ6bS=|bO{r)A8KP8~FM$a@idllxxoo)j6E{7T{1QF(0h1TVa1v|Giw zxx!rg)A2fSsi|kIQ)kxHZ`0WvZ}p$QCgy{YZ@~-a#P>N0w!b&6w0T!sn04UHg?4l4 zsYNf+gKl#h{yV?Kv}NPQOHxbxPAhXgE6hmZT^+|`_ulka*}YfWercB-{9y5J(l)_) z8+>%`u3FHQ)R1*z(gEgMSqsnXXE0~V&@4EumhSUe{u%Fux+7L)bJ?djJlytVrQEu5 z{l!=9<1gJT2$3>aaC2AIPrW_A0uQJhF1PSFvA?W%OBmaQkERt5FKfSa&$}Z($NT=W z%pKqV&p6lLvWNN5U;FAZwtF-G8~@R_Fy2!uQ9NPkJDJ}+9+&yk^#4yy=?I;vb3K{w zoWyPG#0j5nzgV63qDS!-4!}1WH+TVr9bN!1_bfk0oxx@S2wd1(U_%ijyC02h~8B?_=m07i; z?(fDJNtxaa9)kBeLSL=_p7MG9*@=HwWwzN(Gs=SaQjKMu-d(?hTrO$oogq~jhU>=d2s$-KQ76WnY*(K+&5To zt^V$@;EqS~R;Oz*Q!jmvOHH`;+WUKV==+mj?7d$e(dWOh@yW{BE81jSZ~b9cd3*cv zX=$Z5opbG-E>|wn7Fhh%-STKh=jP|D&o?`5dmVCokMp^G$}^vs%|4&}>%4NtqMCQw z7qXT`*ZX2d3SNV;*)|$&zij`E|xoi{U&Gpf|YHRbZ*j0WN4`O$| z42wAt_tWn8@2x473swKfrFp9U+Z#O5s`z2)jtlh+C-Y9k-kZ%STpIWC)~gahA^DAu z-u8)|pT`&dS#ihe(=$Iu>&onni0KI4qu0xs;@0+S|Ga;J>psqJ*(3ZXFt#n)CXO6SpKYwvE3-6lsDQ`y9x5hnsYeH;a zp6S}QJ=*lFQ69rwj_yJyznZtN3?FEx&VL&8^trtC%(4fKHx?AF)_(16DZQb7|I+aJ z=MLKKkE)qCW%fPWLXMh%_BtK@x#z#-SNRtweB!-1XD!EN8}psNUYQoE>@thIUsL(_ zuUW#hn+ps#R2(Zm;k6@dR`jjnUH2^h|C@dN^h=w}Wo~~8r>|M!E*;}_k7)E?tQO) zW&!n^PsHk2^d4tptav@YAfw~Hcz49v=VhK3Ziu{`IM-Fd>TjPePvtw_>kAiT8Xaqh zQZ9RuH~VT_-L>!6kA9e%e#lJtQSjAksi~V-bGF{CZx@Z55b`TQ`SZhj=d9z7M={>` zen25P+S*{l?sq?aRDWkm4E}!O(U;ejeeNc#8}1st%(UCPWpPcCj&k{hYcn)A=_k#! zF5dBd=7+@%ZvVr-iYkca)K2Gc+iY{5_u%{`a$oySr85XG|BCFx$+iNc@ z^PKw6Ry&<}6c^|JGl{usS;Q6w&ZLkmA=rUdpMI%BYOl7d*!v$ z!&JNa7p*y_9~BnZmo@&=3efztEN8jxkG}!Cudd&Jw97a+v>%U*CME!e})^Ut8bi@otgge|?MjvV~TL{eAFy;nOYmpO%<^*Et`y zT;isQrUTo?*nQ=#htBUiw0Bm*c4vJd>#fF9GCYg-ESsXeLviCpzQELTeE%qi_hf; zo{zfs_~j?ISIjd%Gez*v)V(OkVsWv3ThyM+oT_q*k2jrkpG8l<7WG5Wr>xN1e$8Wh zALESmRX6qa|6W(>wwQU2YV4`|(`wn@;9)Y+ULpKTUJyR~GM6rn>VJoh0fxpKZPx zQ$O+VtY!CJ9b%b#_1}4A^Xd?jtFI>AFMM{o)+KQr}HZ1Jo~8WzGYd^;bJodxybp7aew>vFJI`iFt+YrtoE;e zZr+bPf|5VZz3H|yO>~1#w#VGUZ|kQl`snMzaay$2X943&lRLFK(=Pu_S%2eh^zjXq z+0&E*(-kz8YE`3Jx4r#W6IOij(_WjIUq#usY996AZti<3uOG<2|H_`%#&eo-IE;@f z9E>PC$XF(<)sOS{{|S!O!?^mZz;-+yB0Fj=GI z`KfQ;*Qp&fUEsQCjdfLw_1?_|?-%k{>cUu44G|FfXH;}%3ZG}Kq&|i&XZU5dodw%)J?fsJN3*&T& zs+=UJ*S+UsE$)6VzHRhIaLvjMm*;uinzGC@M(+Gc(SseAqEgRlzh^gExLGmvi2v`> zi%f=b0WZo*?an^^xNrVXnUAWUQ-V#?_8-apyKVWdim#&Yy%t{B-!H8ufBUP?kAP!$ z3nO<=+xAP7y?+~<*c491bk}cQ%&w>M&zyR+@BO(ob1qFew3vUBVrQsUcwI=bn zRb{8o{rdhv{ImPT8P`hpEzOU5J@rk`Qm!NF3*OCGv3zYm@0p$6tHfI4|Gmu+e#^aX z+5AskjyF$s+&i0dIXrR6e0S-B+oz}8dwXVz*7?1colUmI@QWP%w0D~M6u;Ksf5~ot z-ZY=xyyv`$|KCOS8@2Pw$#xn|Ub0^d8Q`32Xr+%6B$5vvcy`j)@b>1-e|#p6}rlwdgcbNwm)=#-<{`60<0Hl{C@W| z+COj3|B}bkEF%AiWV}s&{5bZq&D4h;RvzN=GFv7pujjmKA#>(nlhf9D^A_(Ycdj0rrOZUcz674HLySLWcznims z&w~4x{}ny`7Qe49>s|H3B30iWpPzsE>%ac}W^G;fVBT`=8~i9L;~FBld20{9ox$DfPzYYt)^; zKa2nT?UwwNx#>NB^DqA2{^Ec1m;e4Q`gbntJ*~R>GpX^x3jQm$pI-kcdTDzgCyzOE zCfkLWiKV7Z-!*iX#P2?IWsUWwX>&WclP$ZnIbO+|emx@>8@1~EqBgPpUp)0ozA&## zSMB@9ks2r+T2#5QZYRT`{e7yHQoPgM7i^H9Z}qS8_4~FIketIa$)uhGvcdiGrtP+YU=i-=|$1wD`P6 z_gwZ_QBTu_Z7+C#UE8~Djs8ECe===ee(bH0j6PRd6J~Ya-R`{fVb0}=Yr_sLxBc$C z+Sa~1ddHu8-nZ<(Jt{H1)UC$Mb?e)PsrS8Hc3Qt*WxnQ|gVbD>O36e2&)7V+7YVj} z;g~zi^-A&jRZq%AMe9GL{+7?4t7KLpq5SW()P`>U_xy09Rx6z5eRp%r$V=8z5u5Hr$UDb1PLliGxu)5Leu;v5Ts?VOO z6hCp`y}Z{WojD0k$Cv3j{;FRZ&}I1cDeF=`XTzj_&i}$^zgqNqjzyBxqSUn$S8MU| z&RMaZ^W1Awk9^A?E~;CqcO@pQQWsYiHf}xS_kB0Vu|;i-HLtF=T>R&`yj}O}6vqDl zQQGzPEOnb%Kbd_06o30k>}PHBGvQDF-Fl#@ClS9l@m;B_=Zp2ekGAjq{P5i0vxm56 z$)B65=fDS)0l17bpBqepX&F)c-MWyv)jUEf4#Q&<5jk)7vCED>tEc}t9wCY^OhIq ze`RRye&2a3^Wf%XhF>+GUtl*E{B+jn%Bu3(c=Z^~iD@nCDEoe#6-_t{^VbXZ4nlV_)dq3D{c z$Cp&{2`ui|`u^FJm@WY+Q&VS+wGxTtKVDtQIB3;wSMl%J&be~Wt+zCtd2l%K+1+hR z)*BtqKJsYWk_&%xbBY;d3$A@>sJQofDkICL8q@vjZ?gFu68W&7%`P#o!uj)hnP*YA z-tT!F`>sap^9K*z$?=|F`K#uJIlIUD8HTG}n|(QW>5bWq4_ET?E-jsON>XxG9vf@Z z`XbG~Sr0U<<}40s`Q&pag(sKME~D%5#R;Dn9_M~JH~Z?!t!o{h9_qE}=6LHeZ4#Sc z!EFCoA9OMg7I#cn+sDs+yVLlRrd5gAxqVI9nyN8TA-4be7D+x84BTtOsqet~O596h z#)fQ(LZ?kT-fh^f()!AJZ^pi`t5@f(>iKG<^}*Wa%0{MN{b%)6Z>-)BFLXSxbm!mo z8hf1nTDRM{-dZISy69Yc6v!p6|gr@1c)KQo+lUg$==L|^ZR<;nAR>g{%Zp}(i? zfKTIu7-ijcdoJx#d~wfc8M^uIoBa?AYg9G80b1J`A?vgMENZk+sG>HN`EtuY4<{k?k2JnrE!=|yUpmn~aIq7ti zOui>0oaYXDF_uk^&XYZsxJ8{sz$Di|a)fAImIx^>f@2V?3&25`y^j|F55~>tEjqqD>L2<~@~4cwxH7+LMn_SwE)HR5bIH z_cW<)k*H4!@i(?aT(`P?<48sK&+B;y*Zp4q#Q)Nmh<+?;68Bdv8ZTqtO_w}`Ny_o&> z$+Ou;@`reANQ-GA^t9wkS2 z%x*tE;qdv28KS04vRa-m!#dB&^iBwp~+Qkr^1vA-LGxdwi*=8u*-V3<6OA^*Ns!M z|8mX!_GqzsnP}32Z_DT2v^*j8gw-~+`c!$g@v$RMC8XYNc${hYG+_Vh1CxzkN4n)p zG^(+hBs+cmFk{Lm!;Wkv;TJXcG!8WX+94Xc;iK+XL&@F_6ScJoHxzy(+DzGZQ~rxp zM5Wzl$34rAf3{jNJ#E8>1S{j4*)Jx&I(aL(uKCBI@9h`LSEYS;`7&v~kKm^X+t;l5 zy}EL9^d-Umpq_>2c0S%7&-uR1QQT`;Uu}Qgq4tyK_OtBD`*+&#IM+Wr_q8*g+TD)L zS@>*|{J$fsxH8`DUogLVn({`*A4a$DDJA7vPhIk7;v=EIoRy4fe&y;NCJIVY4IkJR zZM=}qFCBJYe!WZqkK#4ibLBBsAyTCpZ&mEICa${tm2-{s^bIFX1G#wrXU+U}O3|YA z{OjJ#^V7AbzIpfSpz7_c=>n2L-LFgXCS{*fV03=_r@>5EEoW}-wcqKT*)ml>ZOvBC z{#qkc#+~QlfAy2%+&`QZo!0v;SQkxiZx7pd>PNuTyN$;`N^!h>cy*a9=X}qP%~mO1 zygi!@EWY&zT#no_|cmbk4+x&14;tUrbJ zs?9xBAad)}*1M+^uI!yDBotosKv%XUT+_Nk>2l$T1*bUohrhdVc)d@zt(N?pdOoh% zKN`52YRsL#U$FlAQdpjyHD@m*e=`?OUG=Ol;FDZ$=+qG)mB%iuJ?Rte)+pXhMdM}?m?Dl$6%(|vD#eWLR zo^(jH+ogXkx%?)xx+Jzn&-BE5Z~N&_`n>0C{Ca$`&dfRS=4WqCEAX85YVYCQ>~VZO zhR0+a%Z|o~=l$HW#q@p9%42bJLVjKU7||oty*Mz4_x2XuofTKJ)90tGyEXA$o|2|T zq0emgy<9RoGHZ0Ac5^aY_RUt@qyJ&5_w-D@6|wt&yz0qPn;0eDd#l+~b^5z=O!2l^ zEh4K&5)Wmu2`Z&ke<)GT?Nvp%pf6WqR zw^x5qqIzLpQEIpP)OX8VFU`0n{8dP`;C95#BYAJ#Dx+iby$`vv88pS@1*~Gax%K0! zkJ+|!=if>zTfh{m%8P(m8SE{BMQ|r z`DRX#jo+L7Xl|X%H?^sXclXSme?{^5)g$L$+%;VBJiIQQTU=y{Y;2Ls(krX7Y;BhH zgd`RHo+m63AbEGesf?mue(~wLi|%cxGAjOX^3sXzvHus}p2*bpm0!KSt>Es*i1VVW_lc}md-)?d!rHteumsne#)I(Rl#@ZO4*-)3#m#JO)#tCszy827d7)rt`7?O*Pho-Et5)yg=1^Srz>r@Rbff9?}` z6~DOb+liw-#^KR^4aYw(ZsD&{?$cdN~-t$IAKOHYvf zcPWj1ccgX8*{*B)g>h?NbaKoWv-*E?fx4PuO81o5oklmK9&gxkLsr~_wJZFSn^3F7 zYPZF5w{o8CO*;8*YmJ0_5ZAwneDi9)=n0fOy>V|_qvQE|l?#0n`*ampt{Xo3EBJAJ z$dgH*?(S8Yva_#BdwHOB_3M(n+mZd>U2e&K{(JgN?4{DbD!+|v1r9#B$o^Yo#oJqc zl3z{xZkeUAFHWnQtrD}-<7;50*zvX5qW2yxdeO9~uhYx-b-38V!>JF~Z^`oME!Rtq z-?aI<@a5Z=gX633)lUC1XKijvY{srB*Gl%?(OBmL>`t8vN z^f`||eO1bO)IfqVE zv?SI*B;!Je+0xxzk{6w1Vy#s#UYcUN!Sdz&XE%0;R+yW*{*u#t-(?)}kaaDm$PrU^ z>Gi2s0{-2cb8`JI4l^OoLuZYHFF94d7b#m+H^H}~z+=&ef04=Qk6&8_J~CRu7U9F@ z8?)D?TZLy%aC_z3>J_%TRvlZ}>&&6hfB)W(@S|rwy;6A*`{lu%jF-m0yi_;r_kZiw zzl;0Mx@Gr^zswc+_dIo(-ZSHB_t^%)#^0_lu1t!&we+q~(>L`hvCW-V_`av~yjl>> zaO6>}(DgfRmb`91{?sYhC|u3YopB*O`1Q&wG5sE=i<0tH`>q7L?BCfn@7C?g4S(Yd z?<>4BwhNr{w&IY(u6n*;<3HE*Us*JY)M&Clc>g_8(`oI$pT^98zCBy@f0A+hrbNee zrc+JsymJUzX=gfp`AHwv1s7DLOzgsLgy>z?%KiV*!f^8G=A{RsI;IJ2sw|s&HYo4+ z$-3-`o6g2%vQG#*r21-;8Iy6~jLNSCioCC;9~7Qcat+ z_8<$cg>|3j&AXfOx%Bb!e(~sqt)_0Tw(Vx==2;;s9iJeitak{kEV*zNOvw9BX;)vx#?EpWe{t-o99;*R?d`Y|khEcJVjgXE52C(?I+*8BH&-40fzx^FDB5mIh({PJuz-}%*x4}X98)@QF?%&I3-1LFPT<^e z36)apU*97$)#gp#61{sByq~gi76&R!T5`-V){}3GY^;Ij?~MOeN*|l14*m zv1rO%)JbyFOO=D^)XE5mPNO#Hu6MV}K#Up~@|YkN1>bMcZtyeno*%R1eA zdHcrg>8y>_$(&+oDm&+S&*YYvb>NdH@7(KB_pRBQ%O*`}pILr#kAO9I#3Iv%8KO`7 zpH45l`ls=cfOXIDt~;|Na^KDfzsX`WL4!@K=1Iv)=2u#v ztp3gUyi;T6Z9E&IyjItp0SJK-)!-p27MRoXKdv(@}J3&{=DIF z1(W0Y-|}_>UrkTNs@v66WWJ3%qIjLvwZ{4Hvye+`mGm#O2yNuw7I@}t2mdLRL=9h| z=}Z2+G}Dv%quo=tzi_+lS0<pclCA@c1 zna=B{OkRIXX4~9JdFlJyNPB6zux*LujH3ZJjb>hNt63uR<`qlGyc)v;FWcTU{BVh# zr==tol~&SvFz46*Vljpjms~D9+|f8f z>*J!7CCndB9ZW2)meF7NFZQp-iN3JjERod5w#tk2PPi3Hq@UYp&@a;|9cCzc-H+($EGkCwD_p0rpV+G~{VsKx(jUWCD> zJMWK9`EC_ulNkPCPxg-gwe!N)x&SnjJHObOi<^Ze_+ZR_?1NBr~ny?Foja+hn5H$Iqm-N+#8#DsI6 zR!ua{pPFC-H-`H#Ze#gr_x>~I1({`S@#p^2} z9=Ltx)Wey-xAlCR|HORTAs^R*z4zbB`sFC_s4aTsIj`@rA~VCw!*!aO2?sYV`nBqQ zz{`%%^H%bIn#zhl&*1x=I?1=^!HKL%d9!?dxz??A>fPb(Qp>Vfq1EoFb;_?t@BVGM z5tRD;iBReEmy-&lZ&X~DD%|omqj|;gHI_?L(~=H}-Fdf2!q(@`o^4fPR|=-37KNCs zd9+9;D&KeZRXh~ua}A#*zaskiTU2JJ3um%ZmV#8%t4^j7hgm@-7QJ$opk5)_=&C$*k~ zm&M{j{OT?CZ$BQF*~{*M3{&livt6`fvOKbn7!)}y@>wzoD0|9Dh;AYuNWYt8xZuUs~|8ZOhc z*M7gAbNabZACY_8_*XsJxMWU9+o`U-ts0Hb-e{g)WNI?WXNi@*$^-qQA=AHA%dN6M z|5xSmhwfwbzvj7S<}5zYz%tAI$?rt(^qY6LPq5b#bLLVNrT$O6A?K?c{PsK(X&MoMn-yoe?@zOpNIpN|t>XRax6efN70nMqeE27Bc&Qz*ZhCQCb4spdbsWr zPMtI7cmFsxd5e5a>xKVm8;+V}i|li|%{6s7TiJ^#kL;IS$mDwe>gSq0y?dBT3U@K> zFuGk|utPfHNXHkuq*v9)p9Q>YYH(C!@;+MKF?+|={_A@;xNc6f;{JS1Z3lXx5%#(Th*Z)wwI?u@6(6LH;ya|SogTbxxAop|6Pvqb_>QY z?OV26%e>0%U;KSZ%g@3IW`@>E)|Jk3JUf0pDSoJ;B5qePedVe0Uo#XIpWa)({oQrH zNfAD*HIjRrZ8IJl)P9{LSGafKyyK=CV&6l#Tt3|UQ}n^5;leE5fA02-w+0kH4e-$Xf8te)c%_qW^)DsgWO9 z)vW@PCPkh)8x@*xg1C!+a9xB*?A<@{DD=&*?M)U?|%xstGa9Z z7p&0~kj;9uqj}$|SB9saxrOPJ-kV|myRc@z*A~W{kgmTzrbj{?7UrFBKto*J9z#9|8r7Z8mTJ#%gx>eH}B~4n5oFdzH5EExjJTdCvQIyVX)N zHXU|~-pd_O*70)ZuMCl_8<&q=m{e=Kf=4;jpj|G={`IHrewZ(s?m=BWwO=|F^$>?>Bz!xuoT-&5g_6?mNR**k0oH ze(biwK2KnSW<~Jh_}71oQr4YuPS^TbUiI)=%G!JSeEX+{#{{pN({^L7NAZrU5>X!; zu4kL;N!UzTW_V}9w=X)nH8npKPAF`+9TZwq82w;E-Sk}D&6c?N8%cdQFyWrbQy(PC7%-0HW>YoyNxIOi_lD11`@2}tG?%XdHTYQ{(PcG8g z$a2<|nx{hheU6?Ac-m7^r{}YMyXT&y6HEIW!)D0(zMtNCX4eT5jj;2#%x6h|v7elr zysFZ~Us&k#+NE!$&b+J(`TG9y@!#@l|2MCy^td@eE9s3u$g;S&y2-MNy(`#Ho%57e znXS@!=A5hbrVT&<=^ju*i!GqzgrS-Mu>>LI`~Yfc)}Y)|K#i)@8;Y$zAK>1dW-LiUv4R5dQR2y zYgf&u=qJB+O$(L?s+wgXld|gE)LTpAdDQHpJ<=CCs;phQH_I@=Ot;0)hz9swo?nm9dRV6>NIwJUQ*?cZlX<;q(;bQ&7m*3;(ACa?V zkH7ef-@(E%%&pB*KEFS{2;0%M>1hqucI&Kj%ad+;cHT{9e>(AJ{gGEDntxySul&F0 z}A`s;J~b5n!5 z>;CTcYd&HhC2{Wm{+vXCec!*teBex-aVxpv+@}R+eHk*QJOTWjCr>*XT%|%MU2vn4D*RMem_@U|;#6aN9MF z@fY~lPZ8VG^y|By{XToEza2XSTw0c|jdtaHULDB$b!PT`@1rZ6_UiT?H}=nKoc#2? zZQh+#!FSHQ`J>ktMK{U3gNfcOQ$KtUVdlU zCudvcm~$=EY4Igvx8ql)%I215nN48b>G4e@?a@iTFka&;>t(NPSrwza>C&Gfj=O&B z3Mt|h>i*N`7k{u6UajXHM4hHtUUflVAGJ%Tt`V1+#5iMl zUE9ici8EfZD_3uu-RiUIlC%YLA6MD(ySBeWmQA_FCK+_Y^;S`n-P@ye#;^Ndlpf~O z57}Gwy1D-PQLhX67tft)<}^3jduYzzf}JNNgd^uOtyuQd^*pQcq`SqhGoSx1e0l$B)aQ?v`IBOA?))iG(WrGu zSk0h1qUKKPtF!fr^XE+Ro_FW=9&RJXtrMO}^d2=}G;-HE5cPsvr{3b@al0c2_gCaz z-Nhjqp{IW+^HAEPhw=aP&Pcv#GQ4EqdvoHsc|A{VidnzWDlpjd+gbbOnw~7(T>Gn4 zdmc#G@dnPC@BJ?$?j%b_OYGHk_vbzE$-Z%h{nx{AarJwdu{MVywjC*d!^>6aP`dqI zSAgHcw|j#bRE5M|2Jl~B@$&OrAEoQ;3f4)^AC)!}0%6_-(@DQH49Fe)AY>U+V>fSXaS2SSlik=>!?R~#qoH@_avGZg~#jUe7nuqfvPe+<12YYV4 z-c}LI{Qe|k)t_UX_fG9Rd~C6FzePm*_Bc)UsvW1Qu894WI^!t1>Bdx^-zw_*-m!1$ zH16cBnC}mRGX4L9;rwc2&&$i4px!Y^Pzayq5C#O+) z?ziN?{(cVc^N+Qsnp8&C@|x}Vx9(-~g1l`-jzNXCZ?4YBaN_Y^xWMb^kG-bPz61v? zY}*pr+B!E=tjb8WxHBxr`r;9h@Z_~^F|lVI)lAoZ;WrlLT6Oh&Q#Q3EcSIFpBlqX zL$9kn+VeJ4>d)=aSj(N@+u|f_e(!IgrPNWqd%DU&wRco%euQ0UPR*Tquukg+m%ZBF zf2oewT-J3jV~RF1wQ%v+bS-N~&@#1K7t81EvSQ3Du2=cNu}S6X>ar8N?Etqp5&xev4<9_xA8G(wf)GEnZ4#`^xk7zjFuXGD`E*bGhgJM zf;jI2-=p!yr)qRuTR0o$7%nz{xi8CF<6P)}%@XP@t$x44rts*6Q>!`;mC z`Eq~uU9jdnlXAjBYMptxmW)?f*d0@zd7@AKr<%-7oBnLoZI3mN`STPTFM6Kr?qrEn z|08q6Y`RfOQ`?=nZ=dg-C_J^4k?phm#TC})o{5}%ud?W=nJb^mWOv!i^Gn>W#s4my zkTxak`OBpnwzEHwwUu9%K0hMo|Gjk;5&C^|XT^r<&+wJ4&DpJ){3Y;Z&(lREJKr2! zbc(Ohz2)su#%D{_{Wp3tpHnz_rE=4r39faE(kfo1McQtEwZiC6)&t{~gNOCbhVh@i z)gr?hQ^`F0_(bm+R+|=EzuW$|%b_HP-QV_a;faNP+u zl6@w~@ITdRcCppJj)TGWM}xgLvpP!VDZhIXuzCIEedVpWH?yX^5ouRx$qzjEux_Dj zNRCfoYh{LdeJ*2rz%Hnxp=k5!wNYAVeO}m)kX* z2bYWG3Qs>%`u)!O)&H-V{(E^UCFi0qi@nPeGu1D8zh<5&JXAgNRC(KsolXVOtFO;X zVvSqtbM(!{t+zBo3>UXdx_{`$&f@ro&#f)nzHp??E{T_Mt4!2ayVhgS%GWnvMqlya z=AZsW^V@egx;CC`D=q3VwYMpqbkLWtHAmkt*`%Fc&bne6*KT>)_$9Zz`ooy>^82D! zn@?7#Gt0krF{$MI`kkyCcMqSQz4`yAOP{sUJeKV}$u)0XNqY3_4X<-{Y-3VnNievb zykhp9sj5fS7+1-^ns?{C!O!6QpU0Q`>v7zl6!w6_^h}-Twr@pkm#i`b;_QBDE}3|B z-rbPd|GYo+O=gbiKECqH)fN#ka|exSEE$zN4}QC>yL2H;gsmo`A)hz)8f*N){VL(P zrU7*_Y9U$^&fj^o?MBwQyMD57mwD~lD=2vVee1OqmQj97k8E7H^-gy{M#YEq(SKv2 zHG@mGD*GI}uDDQjZ~3)6rSb!3Q?5EJpbqY5W8=%|G|Ok=#yQ!6SsZK zdRBaxX@zce0#ogSdFSq}UjOLbyj_|M&!hIg>Fwo5R_8zbXED?r)#R^d>W| zEo0H5cT=rGnYP5dKVK>Qy-h*8OY)Is(4>@(OIAiwm7f=dWL3rdJJ@v3=FaOQpFU*D zNuR!GexNPnz2}HLPodA3rf!wp8n%iN%TahD!rP0#}~ycv)4W zJ>f@oL10}X@1GdJab)>@!xkzH^aVwM@1D%$7s%%x|T?&`>in zC^^X}HDNQ8r=-$hA)$A_t}JJZZl7hs{MMxY(Ak3j=a%_zJA5kqr$orQlSdadZ4&+y zCUnC!W8n|0iE;nGvF8+eFPo|N=3H1v{-a32V-XqErqSqbvH+i%CM5L8!jKO+?-dBawCnnyV!8$!H_K{%rvE4r5eC<=p zKbx;=(eLr>NIsUZ^7a;yO0AOKz_t9#5+^6|Pgr*Q->kU()AWrsSUGpFz0^rNeC6Z4 zrGAl2pG|A+jV1@a*eRs{-Zru!u>Y0mhnXK91{a(Q@7vJk_^tlF^u#J76%qbwS=}Qq zxn5^}ld4IZY8AQMPTws$dxw^$kvvnJw9Lh7<(eE`ore!D{o5$BG1nxd-7{=WVjb60E*{qpt-@+!$^*T(F#Rgx zsNywD`eX5Wi{FkiS3k8MJ#fM;_41hvwb_x$2foCx#Xi_6^2=st;Wb8? z=sRD&1V~tKd-KP)>UrDeoB0oVOk9PF#{V|ugGdF$85o6h%{r~d6nCx^v*2QvKy?Ev} zz2N$pyVm{ZaTK%E*S{#6YnCdIej;(jRP(=I?r3DKQ*gK}5u&MddBe^qrd7Xt+RYw`RjjTpDQ&8%Gp>|6>iB+bzENA& zkgDb@%TK`IVs@ItXwz~>=zAs#3){*u zlO0_A7M9EIQtOjAzFtSLt4|Xhl-elLt5dYO^^=B=UvsH^GhlUq8YlO>B z(=)C9mU*k~*M0sO8}}$%9GrV2Q@7^O?+3knbDu@zYV9rhKg0cR_?GA1g?4whoV)CD zJx!x9Y}Sj#F(-EU{94g$x$dsfZ0$zv@+0{h&ajm)Nn==a(AsN*?#o>Zw}fwQ$dsP( zziI7VWrq_1uMSO#kUAH3I?Zl{jo#bkb|AJ%!t?*8$~`R6Y9NA=m!-yc3$&c3vE?c#5V`RiYHdMhqndwJ_w z{qnsZ^nU4moXxM;Jl#BA#m#CGuFjh zrl<=C^qZFL4U}TeZnP!s%b3&eE@MMVo8v z)25$UuD5FKgs{~T_9wS{O=G&TVL7)l`}VfBHkY$ku71s_krLSLSHS-7Z`bsT`~UV> zet*>|`QGTycS|YF3t4MT)>>|#_n0So?fTwwSQ1EE+TOuQkgqsj6Mc_y7Ke=~~>o?yyknEP3TYo5xl(#wC=@4T4*{L%U^{NHMY<#gQ5R&Fj72n|$7$o_ja z{EYpNmaO)WFMpFOxv$5cb-n2wpdj+KjYZIX_pzh$vfZ_8HaaP{6uGaf`7kS{Ca~RK z&wKLug)5@_Zn{940E?IW|ujGP~-**p8|C#H1zU--Z zlU?MQ@4}U@xD0A{t?-GFH9N!;x$wM*8tWQcAw!K5cLFc}Ds_xsRvEhWp6NdxgYb_l zZZxgmp>8|tp3GqvjVbHI6Si{x+^%)?PiSp`|Jl3hu2VEmH^-~pI{v`;W(ViKT@9Rv z!oF6Ezi?h!W89%QCvnn&JtK?gMvI*gUBzttpNradua1wam}4 zo4#0nc6E}RqEY$0sxy|=o>H4`FMawfy;LvxwV>L&ztxKxvY)bE7ro?i`2UfEbL~Zz zHa`84*zzmW(eYWMNbRQiZ5~@sutfEIZtDN+qGrV5bNb=w)UEdl=3Jc?zV2Z{2;;@c z($>tX$tgjuIz>DguDAc%-Gjo8@7??IIVV)+yOl7D+rFImagVdm zXFb8oOPU+5F2aCue+XxLsnH_+uls&p z{_LoDXyIf4>q4VQ?puhUIVlH)yW&J;*85Z_7*zi z?EQST@%;~;#s>YPnsSHu&z_iRnXGRs6wull^j9)SsQ;)=+xm|j+keY@R`|-Tzr8eG zb9P@r<;Qoim!-Fgi7s6@r6{UV?Q+B02?_c_!OgYpHn*#0@x4b2ow70ZQkIsz+!sIcSXDglQYzCLU_%ukCzY374utt|Bg3{pYS9pwK*d5 z9}2V2HB>8IoSTzwchn?K{0q~i3tM08+9o8p;b9hk_D1Eo&jTjTiR#@vXCil@%d6GZ zevZ?)r^da$RAxU`Zw3tta%%$^4{v~rfUEG)A!>3>*`P7t|Q@AN5IGkWFCj1pN#=}ntv zZH%`CQATEx&g~v~Q03{LA&KNcZp5nTDmy6Hh3s**|lPF1*KOx%Bdb8$rVC z0z1x@*q0{;PSw7-TRbJqOY@NSwzv@GWsCJ<87jW?u2np!-u2|ZdVS%8kfw!S9;yGzcN*Z_e##QjjgP4bCShA$1@b~vE9nDbK6ga`%_M@k@mfOowMkMEZ^Dq)Tvco zuEz>LaU~ySovj|jU-?1$y5qxDGR3MppIa*PCoeJa+j(o|(fwU7ck8Y_cZSnXq-ev^ z;51?NS^d(NI%Iz+-kLV4`_*UB^UqgmSZAzi`u}8}Melni`-e$opSGS|z2ipdqb-Zg z)T_+wo*esFcRhagvTw7_yno4is_pDq;k);>zKQ>NnDtl1&{;a?m}|VHY~+C(oA2tp zJ+SzLkmt_5QlBq{s64xsTX%Nn-#~WW*$_r0ybLsL|N6UB3*|g63&&{*(e-EF% zUncdoY-t+nGufK-eHpJ+SN^kf(ycpZYH)vl?cKNRhkN3^zGu$%IJ&`)r)rv4@QM4c z^=5ml%kbcxo_aAdEa0fzOb?jD{Eg}YW8dO`EN%Vy0-iXUDvPhT;+;n{JsQP z-5Q64qjoh3uWH1_FSgAzK53P7DI?Z?-EE=eta|RA5BuL={IB`6{z{#s;Oo`JD?{#T zD!1>R6*j%KBjcL=85_=9#S$~S4W<2^=lz{=J)~oAdC=?k=1WYo9j~y5XxgPuXpuR3 z%5>fCt3O-n#Ggsq%s+Bq+HL-)wNa+~%bJbd};$~du8KK}e)_Py0ioFkxq*VAA@?wj)(z6T|r z&wer2wyv_g@X?9e@73=vSh;TYYw_@xXRX;IH>B83j%k#|cCh5jrcz07;HD|@Gy+P&9(eJ$Gs{ibtEEy#ryZvO>q1F34 zKV{F3k$t@QYTeJK30fvwZ=K30nEc^6clKNRch~O!uwP;OW?z@%>5!()Mus1Dws{w& zRP!*TZGYk!C&wF5`t^{+gvaT6{cJyt1!KvugaIvuMIQ4n@JEcU$kQrWw%^q!S(KpW5imE>Tt8Ayb&-@+pY8@vm zaeew$e6p6n*7A(Y_Z_Ad<$1PloTk?s;^Qf8>+(g)BIjJlmR)l^3MPd{UkYSdt>!Ft zDt$+;T-?ug-H?Jw#qOyWo<atiJ0-t>(7{Q{q7tGD-oGnKCV+4EcV_%6o1X(J+nd15_zAfTXIh%E?yS4 zn(Nx+82R36b?}7J$@Wi6tAduV`r>ut&sOi*>^(1C%c@e|atJ-Ns(^<6u;`S`6R{bhffBl@m0?~TfMrOWBrUB6E%Zpe{ovHXfDt@Wru<70z*~7Db{;^cDDzb9}E-Y zdDpCW|IV(&FX=z~V}1BOo-#hYvzPfjfAtHG^{bc9I=;sBMPrW9k+XMnqaxOC;GGi3 z+_kXc{=7MdUj9@*&OA@8lQ}B2c*)DQEdSXmE`L32t`@DY4sKR@d(bH6*H*vcRc&#+ zbEKEEKfU~8S+{D?xA@?(X3Dfl4y0Q0_u zj*@AQLzd_sT)a56@99@Vn|XK57&L4b{hL#M>+rR27t)`mJu(M)Y1H~BxTi!^Xxw)45LMI zBI9P)UyMyK=e!{HB_y=c{rZE?z6)b&^NjCI4>r%)b$R~XeOjqYEN8EhyYH<~_7%vtr-~P`ok{hUYu~+Hl%k@adPeKt8XeLBH;_ZEl! zj@jXQ_1|Lo_?O-PwJUzwVZPsU-OUR!+jmcSmC!f)Oflbn?5)mo+>d6CQM()#M3YD!(y6etwwyFXy7O zU1htR_a}tLrFk*mwVrv$!bMniX-xsM#vdo{szu)(PHvw+Ju+2_DL?mj!~XO`R;Dj5 z{X4~*z+bBGJNsY#>dHOO?B6oZJkWkVYMt1MJ-niOb}xK<`KIyRs%r*&pI^9aJtzIV z+GHWY@l#=e8& z?SX&i_ek~yzP7%_!n7m9@Ra!S?@B4Z@8|7O(r1(A-K!@&+1=!m^%~pqgkp!28+UK` z$s5MA#A3I`)ytpH^4)GQY-C;fz9Fzw&(qYYYd)5iV} z8|OWF|NZhRolBJm4rr}A>!X@F_wQH6>fVRH)9a;Hiu^ucqjmSw&HLy0cYgnJ_=xMX z>HC#0wyxH0`TEoA{}IbMQ&Oj%Dck$eZ1a`**1a4XpKsC2(KcL`xz{9op_uIUX5Y(d zDn6kquQpsb`PyX7y&_J(|C_5?;&iwl|C;@7%YsEe{x4qD&zZ3F|BKH@_e9&*lC+TV3brFP$e{etWyd;&=b=MoevgyInJFg|vd%TXwDg}L%cIvvkF3pTnw1u+r?hML!R)DJ*VWe> z{i(ld7jt>;LKgSAqMnD}Dpjn$7sJ^1b?f85`4gXO2u$0$SMY85i%GTLniZwB8$Yu> z-CW>)YE#2JPqlRlnY+HK{NDF|Q`*7kEW>mA-aXkBek}0+6yA@ok`KI}k{apn^WfvA zlGUQAk!PO&SvBGQrQU3L?NYZr%P#4jI{UO_?lY-o=c^gMoTimiHrYxpXnFDFN|3Pf zUf!Vo%pb=0zi^#cx#U&3>U85Z77kC8pRZ2(UeJ|(Xo};(pFQ7#zoZ40-%-=P^z=Em zl9A@RfFFO(iKNY5)Md);+v9DSyXL3W<ow_nbv2g>`xP)n@GVcjy+T|`ORYHIP5!pX zmj*AESL|k6czfnOHf)j0D;F4^Uf96g zy3Vd_>%RYm2ZKuw21Grb%Jgy$^SMf=GqaB~p0v4md4Ki%A1hU2cD>wq^T?(RetU{1 z%rl7ew{5GG+I{m{gM+xSfm%YZ+zREJTe=g!T&vA6EP8!GTV;w`+Y^R#hK^$2#ggya z;ukyVue-FUdjIJpFGs1!pxJ-(mpdIuW;Rqy4KI2mUh>r@>iLJywsFB*!gsAO5m6Vp zeDU1j)0GO3nI^oMta@zcT+aG^kBT$S-n?8U>>Rzb&o?;crAn*bTrL)8*F|65Us(8c zs65qAtz%`iv;O@L)Kg6({C{R zjEf46m#9(?nsmi2{=0#Q{WJ-A*}Q{&D|$bhulaW&b;6DRor@&zifFDc`T5mWce#s} z{HBX*A6(Tw)aV!D^;o1XG=u3va?0(Lr`7&v_Pfi=v;G$h-y!<%rxHu`f~clzLUw;e zYL*<;;e9PS(K4D#U-FPxSi_PM?c*#*>;!waZl3*W)(*Li>~B7Em6iV~KIc;!9l@n` zI%?O#CvSh{JPzI^Yi}!4-_urh;Nt^EgR6^o?Xdj)vTB*-)@~*s)SX;9>FKAcd zP0@9>?2n8+6hoG;)l@hVvNZdJ-_Ok(>+fZ{Z(Ce2^Qb|xTD!mI*>lStEoe&or_avf zd-TGjj)NOA_@%$hyKH#x%91TVFZH|JGjzPQWz&Q#FD(nf&HHw3>-@H1V?5X1zW364 zyD|>BJ{DEDa3;iR<>d{5x0DNxJZt&0E1hS#th{YZcvs2V^^z|CwkXV2lVo>g{n=mU zAY@u{gx&m0^{n!1>kO3-3R^!cS?v`0_Li1tb;!O=YS}`w>;zkDvbOF0eg4YiS=%`} zqhF_2w1xM}`*E~f|9EcOzlycTR~_tDoVJS7E4xT;eV6p3;4Y4-s~LAcI?$wBxY>Dr z3VXnn_bPvm&3#k6#rI6Pc$b{@>8B= zsr4!5vlTkmyicq)Wfp!Id0qd*i3eu(zn{Hob=7;#lKb*R;}7`@Jb%f`KLwUs}&3{ELQp`{8%*PKw@9#-_+A29<;lzQ2GQaL`aq#urJ#W%)%;?`I=`mX|RdLqq z6`Fr%tUlO#;^r5=TPoi+y?XUQDDj-2fSjfGrxnxI*OnHYU2*N4a=BFNEQ$PwaaVNS z&7EVPTl7doSim6Xz?G2f{67{y-OeBJPZ9kmrlV-3bMDz{~OBkND{)Nh~9eOk!1H_|J`^=l!tyz0tm7hD^WPWPNi${7I?|&|+eZAvP z(>L#Zzj(H3ZI^gfWMR^h7@X<7ttfX!p4jte>4iaVEAG~Q>b?~HN4Ah z?Rn(;mw)<4=>oR(BIVx>N9s%$leCzyW9R%O>AP?F#|P{?b8E?jXFd5=Qj;ZZf}XCn zZY{p5dVP9gsJ~L>~ob0>>>trTsh4=A1IPJ1YwbXu5@s#zwvfmdi4KH(@eO`$D?&;pu z^FHUMtA3E3U;4`SO53z|vcGPZYqDmZt+wp@D*kSdme%P9ns!qxFS1-=owi(Ro}#tl z#XqZ#w=HKsop0A??Ok6MVQ0Df)x|KiSs8y{K1tqvPe1DzZ!o`O!P^@GItklrWM&*W zH_LkW8_W6=}noavwEKbtUnz5|1AZNCBebl4GpQkpr zz5mADlk6+4`g`#gk+x0kt&_Zsv%~(X=>J?AK6PTL6Mu)+L9<`2g_CXmUMb(Rr}})x z3`d{4j@Pb*ExjhCdCjwO=~`bd=2iKvf`?4+s-!QK_$anpLiFPu9*O&3y_Y?`8eDRB z`Gt(W!%->Dv;Mqpui4s`ck{T{xx(e^ckg??Wc&Ab@3S>m*Ic_h`Fiz*D+t%X8w=t+dt{~0%?(2DcRan-xhpnJu&U!+to{#Gcr1cZ8Z7Y z{$%aWE4-`n*IIt|yd-c=!T9?J^*f)J9G0`(vhoIHMN zNw#RpHr+KF`&T3$|HLB;kd~o~A zw?e*R&QOj}xy5R~eswsz>mI+y{%`hEPtT=q?%&MpwZ4%rb9ckrpt1{ZG9>>0iv9oT zuXOPg{kXl0YCgQZ+;jFq+1#@MY7Qz2#!qieJ)n}l#-6bzW}9>hZ*-=^tVLIMzB*jD z3DOWuo%U^Di#)V*GXH9`}Bgi}8VCe?KCTDiA z`GbVE^Q)saKhSy*BDb~piu2xux&8;v?6tdo^4<+Cl_{$Zu(Bnji(Hw%^3=_j`?fsT z`kH6G_ZvR_knUYYbI*5fUG;75t;G2GXA>&6%nR7rp=uHN?ZfdWa;u6pZ>rDTd)0FO zHut2T3o2JeN3LZF|Nc1D@KyLz>s9Zj`p%B`kV@uz_2S9RX)+-X{N_EWo5$)hY2ic1 zUz0DVY-QjxKfd}`&!WA}y@wnb+x1OT=54hSd|j?^B0(`p^8W9eKkODh)&Fp3)x5>m z);ylo)AM4_`G<}w*FrOH=hm4terVcmKjG|$=%-f`EVIsEZs{!j=U(o28ng-FEz+TK5*4 zH1x~5y;+>|s($Zn8w+{2m>P8#y9bQ0_hnyMnS6ZRG_MM&!`ZX?dxLIG`O`MxX{LAR z<=2`D=Y>}Ud~}dr|6fz!s=bYx?4?`Z4mVuf@$h7Uf~ETjVY!X+$Cb_pGMDw$q`oMa zHo>JtS%LF|Zp?#E-*-+3TDOJg;iIS1SbuF3=3O#FvtHWhZ*sr1+RJ@*KbQPUnZM%R zV;MHlnUf2-kG%1T%8e^wwlgtP{9b1-IqflN8X}VTvn8{?{HnSJI-mU4sc=N!4yeS@z zTa38bxsOZFUiHw#Hp8}NrAy_3tEU&AnZRN{b9Qd`oS6LSUu-Ymn7{eKDQ3-zd4ff< zzFF6rYtt{!kUK+1~lLg#G5~)0uG&CvM$){dikiCs%UY&oF-T6TwsNJky;%Z{Ej( zRZUx?UcbCJHz7>18Si6@u=#J{S z+tpMWmUaPv?erHj<&DQYvDW&Rh zyr-w|bgjD|+wPK57uv9Er&FHN)s|~w%R+Y_|5R!0DSYL(eSN9k_KB8eyw&{|FaP9P zUu(lWi|0j~#r!%8ah-`5`!uI&{0JyF+8sXs&ZAFm@_lRE%h__LDK2BJmN?7vd^vB? ziYSJx6=8R8J>GS!VY)@%aSs`pyU{9bp*?wvg|ZUvo$;R z+59m}63-SHiAo;Zm~(BP7Hfn|-p7@*&P4J2J1&MU{rT>#D;FuI=#?@R&vLy#vxdi? zcYbi&_RWTw>3ie9hF{)eGK0f%lk~Cmlk%Uq*$bHz@lFc+uxWDGipfVh&)l=j>U^+9 zz@sWtXS-bUww>zYSCXgMCuMsHh_~4B+?qX8lxfD5Ewaxa>=8|sJkg$!vOR8gbbyfT z)lbLIhjyz*t>`~nd#CkLrwHFqkyCn`J{>MnFi#eo7r9KKyuP6&q36?__WzIduXvwa zRTZl~@676xd15tRcD_$!H$QT6QN+xp$Ns(gKCkPg5ue&z-I&6l2Ms$GDo3(gKX&*t z)k=1q9z&J-GK)q%%>_;N8{&l4_lz+J3hFt5wTQHiqg==ele^uc*HwzL5LF zx<-#r8-=P0SN~sn^SahM8%tR=J>l?#2ak08^5068C9nCIVIB4JZ|?l}k@@Ly?1JaH zf0np&-AH*Q<+F0i4 z6%RJqtLJxhwq?E%n8JU(&$DP_O6J9%cb0Ki?AxyL>}>4&LaW=?xmUZ#sni*$#qHR% zCo7@i@`j?|rOxku8JV%oxthZK!$D%w^yJTi^Rw6|Y@F4oJN>IHo0r(z)(b~hGZbyu zVt1_Y%?VGrSdr+|vb#|~wbGr7`@Rco(p#p~)+JlY9=1$rqwUM)$ttEyI@`((%#K<= z(aGWI5q&NZ;m$N+{rmr`45gx<%1yp6q3ka6i+joTRr%Q)&Z)f8Ri0w39KCR>-I49g z^0S^4J=`1p>v!LT>t23tl03&5y_c&S2W^;Fz&F#qI8J%$j_k=}{pE*R|Vz@iw!`Ceby36ZV z#>&da1!aW4yEpgKHtx#O{C1xQ4W(y~YWjJYh@4hE#bGXV=}ua|ah+d?|Am7e+WMnU zm~kpyYK>K^;koOS(KfH7`D~u<)vSuiaT7jVKYVz7cfho5hTOFlA>mawUoH@+(_t^p zDU-lT-+dq#1a{w@^}jC~Wa z$8MGN*)5V5@3+rOZIe3bEml;qd9KT^lkTth4uq$c*7j<>`L{(WiGOweVW(}e=2~HQ z1$g}S@h{iCR<&&5(M1;yEq^z6rjy+)v2$nrC9-sFmVenJ(tdH-)7>qT=U6f2ugwg; z5W-w_@m|KG#lP0`xIJio=pJAqBKg`(_NC{X@_nriM|N1OUa~iI#%ELGc{>9SIv9Mk zpZ7>I<@cv^7c4SXr1KoeSmosw?OUa&?(gSw=UcSaiZ8c|1e7fo|7PMi&hX>Xwwhnj zi@jFPU3U3MN+I`MkGew^bG9vit8;;?=;2Shv%)W5TxmIT<#EqJ1(!+YVl(-tg@3v& zD${jEYM!g`vU6K6@%-Gu!D7E`K|zAY??jn7YAfD6=6xKVeY)+JpReDx#DnwI*^Cw^ zZ2q;Z<1cMcT(E#cn2`0UfCv1{@rSGmpC zvR7{GF3V=t`KZk_hkxF}{frO#xMu1d=6CMlfBj{3<-+z)3vJVuwKL}3o@{?EfAcq% zxheP8O)-Ap+*#@_UhS&nn=JBVZ*6GW?T(2ZKaD3;-F?3IYvGZ{KK~b_im7qu1Rg70 zoV4sz;PyLDbIzYlkS|;KTkXxw4%73?PN=Xjx2JG7SN(hTYh%^=)S+P z$v1J~>lAtYC)>hHuKZb7{yxS3UE1u&4al#)pBwki ze&+ORD(=0qz3Ho-d2&R**Ir&@OWw>Qe{S5l!@KwSwy95q?kzcP`0A|bTyq5pLG##$ zPxJHNtS$@P|IrBuG$E&BhqtBF69kN?=;U7Jo6 z{Ns_nI3;toxWwF*!q*R^J>}(Jd)$%x@;r{`7cacnA|l%bD~Gr!huuPXnpBU(KvZkOUc z*JbxF&dwB8mVLAS-QtxFC0o+7m$-eIS#)5dRdP`NgEc)Z(rfJ{m%qEX{srHqXuBtSg=RHBVdq~H^sHpNq|HW~Xy5fWH%T72ww#CehlOEyQt8Cd zO_K9@Q+Yo5f7!+6ExC(rv3>mZ2QlaP+WWW4WVo{D--yY-S5Ri3-gCUV=ltVI+lu-; ziWWznkm30Lsnt8{nGWmp^UCp(clU3!{G8g*_%%#o)1nQThBZn14LslE1m1REjjh_UoTbwp-=qRQ+EvtB})` zw|w`yyk*TydlOhADwpm4?Y!akpOVur=h-|zAN=RrMcp`Yttpb4F(-sgqtch8tm)2F zao;SoT2Ha*Mv0CEH13 z9`60K@Q==kc{=Ntam#YtUsc&BI!iUkk!`imqig5eQ|c7#8+d;jJN@;J?w%~~wc__} z(e3L3eyy@q&e}1(CehaCX4=`5M+-NuaycQr*^h5?!|TokUxnKGeQzvWx0PjktW0va zb{=2rRePmH)22uoOIlT5IrQ=8d0DT$jcp}cnwYp=ik@2W_2ByOL!Ywpqzzl$TqBn( zoo%M)ceZ+)THfgkw>%|3I~zY|O4)Mmw#4OwY0Yt~8l1f^t5jWkHML4(ouO~Oak`Zb z>+-U{4;U0y-AUG&qPvUxcHZ%f@R;?^W^sa6=PpO(P4xQJYUorp^F?Q{h;^61o&$ZS z1J4|&5t?e=SI@j}e*7t6eg7cV&1VJXe!O7wexYFOtF%|4i;Emtyl$__w9eBoR(kmA z`P$1~kJg>t$mv&eMwQbm$yQDH^Ys0aY$;!xZYNphUuwC2{kYxKZ#VRL zU;i`hI_ao(Zu>n;mA@I&{ExU5T@p!^c;nx0Cbzt;Y0G)O;_nYz`HluNoxR)Qz36T9 zDI;F<(kYkI@;SG?oOHpJhyT@9=^LlAwyWhdXS99XH_u99{mo$Yh0}_%j%P>~IOrxZ zZGv{`azkuyx z&2P4=k2@|Ca538cag*WkH!3gVeiwY!pC@%|Mof*auKZp3<33XV_Rj41yItbRlsUnd zrs_`$+kMEKiJ>#KZS&l2iDxQ&4Hn`-?+%_hIPKFuIleuA`)2$T`m?%ts&yz^@$BMR zB9@ieb{g+@Ga8aN8uHEGis~&!O)p#gs%Ts;} z&!tX0&w0f2MK$4iM4dLY^LUAe)A^gOXSQ*ryvRHIU+aSQ+nEj1 zS(Q;NyJ4SHqxo;s z7x%x-NGQ&V$xc80>hU$s;@rd1A6%zSIsAWVqV$hrcS}UKYwJFj7qzIyW$9*t&A#z(;|e z| z=lZU$w2Zmaa)rSo{7>4A?;GFU$z(29e4i8a=**QIlg%oBx283`TD?Uh=1X`&%W4V3 zBwp!>H*^IXW3oab%svIYxyh{Y@7Dd09|_ym<%h06_=VqG+*@;oeZfJ)S;mVbH|ze6 zSeIJoys2l!)t5W(Ro>NY_*Rl#%lASmqVubgpWI%7*5(pM3I@>dzfB4gQ|;|Lha7nJ^50; zICAC8z+gtUjP~Of(~7k}~F}CH` zIp0rPeBb0v>*}u^H@{{xs5-yWxs;Y1qFl7`fz`R2yKkQ^JacZ+BENrYmbn?b6ntuih+LW~82Xi>qhH)E9E= z);Y?@ZP2eN-ko0Mf09|utiQS7m``WH%8i$_CwjV`RBvf`cQjP>$D40%yYA3uq7dUN|HSuEEwvEOy4{_xF(j!9jXmu^dMVB-BSFSO)C z0)Lievb^L(n;$F&kF**6zf_1fyfaX7UHs>o@v@t{eOmsU*U9Y(o+D`YOJ=#Y?G4?+ z;zwy;9cxl_?LO|hy-9+nGi)+z(?*?TKZBM={_^NvzCg99{NC2voLAheua}7)knW9IV^>||BpRVI z&u@d07pKxxJy-MdN6u^{ma0i z$)~R-`Lif6tpm4hGMaA&l%?Y z`Z;rNM|Jsr4|L1$ui?G1(`xDc(-L-5_OfkW8{WOTZd#qq%-y#x+_}5;q{W`Ao6a4% z;d}MJ=7$1@ME)PeRXf zr`WU?&ublT6-qrn8LzH2*Pzv^+&5yzyvW$t33;uWik{Lvl|4@~BJ&Tbo=sRkf8l@q zvUh)UPp-*l_%YekKgxHTMbysFKFeh{ANB1FF}8eWmbz2B@0p&IRu_}r<(_HT#!Ghu z?+nm<#HO|KhSD_d85%nnH8r^wc6MY`0brkaA&CwsTfJRCJ&bp4$QpN_?SzZQM?by+>RE%CIr?b+QI zHz=nb(R>_sl((th{`sAk$6l@WJwJC6S8LDQn$jb0j3=K=3SEEH{`AyZR*kR!t~RL~ zHz=i=Za=(cs-NSwh?Ds@)=#K?|IeT2Q)S18w-Xq@|MlwF-74q2>BSbqn{`Ky_OS8p zTeRADr?A+S&VCM-rCwr(o04|P>mB~NT3h?UU5jHoH<-@YT3WK%`NM23!KpIyO+s!* zKiVtfdN0HD<9&Ps(3Ql-4->Li=VkAy{8}RNU(NR1ce6i__X-~BxjWhN z@bvF@E%(1Y!GH6@toPB0!B_fH@(oQZtatF)6ir8ncrqC%6@q6&eCEwsU!TX-`BjEGogOrWiBUY_0x(8 z`~KaGmZ>q5x-oU~TLY`DB5$o1JnT5TC2ebEhvNQYeG+~vO_=rdwzxOm)_?m>BkS$9 zHHRl}IM=2UKWF-%XL_sH;`FudpI%qM(Q@2?U8=-vgPQ10KZ);0<0js2PO91?zw6fS zm%mrWiH4n-dc3HS_V&n4i(mLGp*0KJZv&fKt^}?$&Go>f4Tpt?qspR0=Z{Ep^E>d?@yQResE@?glF5KcCv zc_~xq0)-s~hP79ubDeo#T-X$`cfV1}+Zk$w?@r3;U)x-HU{T55n|toQ(W?;kcT?HN z&Un3&KQ79-?5OrX2Vd=l*L81Y*Jeh~vtIM`K>zw59`i0%`j>|6%sUoy<{_i@q=KfU z{>dy;zeN?E$?;sZ_|?OZ#}D`2F|SCMytVgGhp4`F;q|`HqU$z#=*Lf#zU@Ed{ls@m z>Z>j^_x9}dFx?xm_Vjx`E^}}9H>)|G{McE)eUI7HEuR9EpX%OxpLP8C3w04W$8`Z` z6!^cCxh|byYNuIKCzRMPTf6$L`J!vy#reFuS>s(bl~-?4DmlJIN67X4he>DtEaUL+ zU_ZX{%u^ko^|Kn*t=-okv3W-OK`EJyoOTnAwoUjX-nsNh%Vf?)+b>tt#w_3avhYsU zBoB|x5tTcOLgli%e|RQOf7AHbG(3ejj;ns@asmFO_kT!U*t0F8ZRN-G*A07nUiK~v zu(JHPCd+s!OU>+go~KeD^gfB5`zT=c??3u;Cdx>hY|Z>ABJ5`(zAU%l@S_&FM>-+_ zHIn~Y=KibQ*#2+AjO&|tj0~?_V{U0{I5Jf@*d=#n_!bePYwA}vOfS22Nl_*~)iC_w zk8RO?wYM+dG_zhO@^+jyUDLlug+N4TmAik6VD3X-zP#UZu_#<*jbsm z-Vp!$jM?e5;_WTXbGLCB$yt1xe!=%{UYise~_a{PAPo(kceU4N&FA2W_wY~H8$R9ji`_jLbg`AZj+ zZcCnzyS?FoR7k2o;0Bg0E01hhYtS&METr~rmH&-<{nwTpZGB~8xK%{p*~`!~tOipj zTy5?+wBqOeXQ!@9X0dKg`^@YcGfCM0X6O#<2_a@VHXUi-h4T zrG3jKR6F#{ghj+G=iHs-uzK#s16QYq>0Vv8zP2_$L*R|6dHIi@#-(pWIf5kBc13zu za81jcTDxT4zL@X}f{9b!B!zri+Gw|L344vx!H{#UH#VK;a;blrnGo&f#&Ig<*Shot zoj+v^j0G73njb6cuFI-2V);9D>t)TAZ}#f^v*<7V&Rm(G!zfm4E8_SncTLqf3-LpS zGqp_JPkv2IKGfcqSa?P&W6t&YriQ=iVW$~@QckNJd<$T|*#Jxt4V^4T)t zPL!G*dciWyh4V_mUF*Y}5+2S^fAgYrpPj19#Gr4tm+x-;W4-)v^0a3fOA?nfs#;d= z5GsC2F|q>N|$c8{Zr-$ z5L?I+X`bHE%DH+zUvv7Lb5YlYPkSv$;HWXI+*V)kV0*Za!q;`Ty#6`wUB)eDUjLoD z%s1t0({=Th&u4fGJ6vwA7Wi?;_~FS<*?SaoKO`2tuQ_q(@S^F7#`AN9_;t=Gp1Kur z$9Cb)HO-BYs(-J3r^6^jhCSKiN>uFGqtrw>`Xk`Nrmwqa5!J#8$blw3$}@``C6pJ<(GO z9;Ho-F??EG{dy5^Q{j`DYYsaZ|BVcLYoyM6S>WBsHNp1k{u!SR)jgRd ztydHpkh|vP#*drTb5dU1l;CFenm%Le)Mi(9@B9UKe&uqUX^fMrmQ~H%AkjA6aYC?n z$DTviSx!&W*PQ+M(;2tYH;2DVx=uKw7UeWILeTKao3@KS^Ss-W4+)6KsjplV7r#bV zkMHA&`OAXW{kPEG_V>btYtL3BNVM-Qx*HO`KGSysd$lR&zdtFPKIgF4q#N1HT-_V- z^}@BqybeuWFJdoFNV-&`;%MU5y6N?fi|nP+`W2y;igJ!>(Mp^jvOYzgE1%+-k=xBR ztw*)JY7rw3Tgg7t_7@8EPxGpSUtT>ImHjj4cfjJleb+>S%FWE~uDSHXqvJK(F^#?+ zpA97jYmGWDr2IG|pgpD3@mS-w-ZbR`D|9U?yW7`Sd*9<}J;TAs zStDb6K)^-MsI+-W?z=@{{qMJ@f2fhHIj3Ma@1mQ~43~wbTtP8!Kbo$ZBKWz%=V`P4 z=_hNGa+!YXMjg)YdLf)jlqHogKfE&hqsAKWQ5=7pEb8}Za_#ayh)Kfz<(0p;Xz*Dk|NHCo&*lHS z&DqPZHOJo+-+pw1f^^!GMGvZqmX*DF=6^t)5gQf$Q(W115H@sO}PRQ`;mhCjaiGOdO}e zDwm#}NAybcOAD2v+1X?q{uDS(<-4?FLzMsW&9fhCck%=sw9@z}rpRLcJ1s{~Yp?B} z3ajOY(My+Y$lCKulB^P{(H8|dJ z^w{P}lNA=9S{yGQc&vW9_~ZRz#(l3cv`z9{VvE}Ro!B?uTw1Jl_U_^GsKdLz_bj?C z?NmE`-mIpcz3#KF1@#%+m&h^;Dq~B`3uLY`-fAi&A}&&zo?mxx%4apB4>wkI=os7X zNcIG%){HJmu`+%-6p3Vx}oYv<3_I&kMr2YHwAEU zpV@P)*xG4reZl{|SMHyZU3h)wJ13Uy3=+P&md1=Wt*jFpos14=#p}<@YC1dfA(PR~ z$rruPzNnn^|G}A7ySr zcdE=;t&>^>$NMfgR4!j{Eh+7#wy7MIW>`nzgz z(2gBhAI~b(&;0+dss7E6-=(oDVva@V#HhY<`{P?V!)3##sB#;X=W9>i=MN~@T^8z^ z@M5t%-{04N&a!$o{F%j@qZ3AkVA~JzGASuM|zYwU+(KOoJKfF%f>>o?N$| z{Ij~I)-p1Dn(Vei?~m+n_sBB0df>IAcqPZuZ|DC@ZZXp246nTZC7WOU=DeEPKHG@Y z|M~x4efaJu;ks;wKgw zZ+p4b+3lF*#4Wkb`+9iJo;y;1+k@{)L3!To4}K3Fd=F&j_U10~@bcQVbYEytr5A24`=t zyf{y5*M?Y;O`Fzv-)>W{uI^v6`rnVm&9{9kCws+tsVaR1te z?0>U(|F8T1nI>%V44;8b(=Yx7R^My)9^UZ5g|}~-VuvvMQ;U4twGW@@Z)cpm)Y5xK z)zz~#o7<+G`X1~1Tx2(UZ1U;qR}%9$7tg&X72whvy6=Y|YjVT4oEE9AF}Hl;KgkO| z{pB%_Y3bM5n;bo=)(Pytw{BYJ%~jWnVxOt+o!#LYHO=@h&s_GVr)K{O?y#49aDA9? zt8RPk)`LCZWu!(Hl@%qiB=}T{9Rf!*nFPz{wBg*dI z$0^;bI`@CgoD!M0WmR9KL2R(;D(**iZ*u1r*UjGZ?#e6fomH!6*+pH74dtBA>e-_@ z(b{P(>za!t>t|S{H!SAM7tFt@yWKSR_o+1{pYj>MX3zP!jNd9-LP5@LDVzQ*2eI}& zEoY_g+&*<9Z;3(fYIp915BKYeOg`i?L)rAlzt6D(X>+x#i`Bdi5oCj}G?aSBA?1lgmY)l^&UsRV%S!-rpGi<(ma2xi0_a^G)knWPa~~?Ea?Nhvyr! zor={u?~?3$ukY^h7afY7QJ}jH*0hGJY(H;S9UMsGm&f!o|_|RBE0It zXT2-euYG*Ce%rdADgU+g!n^LZTDrt>EaG(&3@r$>*z}a!Dx5iC@J*L8V2drRL**oA=e{zWeAhxDx{x1+1{mxt?d6tBgVeE zS4)GVqP~AOugr@#Obnafc=g&emPN-6a}V9pS&{c*Q~LQh?x!5{haZ@bI*rSrJ2`%L1ytFvO& zufW*{e&v^VsGKS+3Z5B((C5<|@@+DS{%h^LOp}@uMhW*^h||$7DJ@ zuV+M6C$&~o9#5&bwxs2q`S@cJUXLo(#Va3eYxeGY=RI|)*=nh1qDw>}~V?>)&46U$~mTZqujQ)1g@t=9g@`#xEOb{Wh{lz5LsG&%@hhZk(m~ z-sAm=s=ba(u`j~oQzZgJFXepEonuiyUoejOxBj>N7Z=&so}c8e6+h$G&hlgRd&CVh zBW`l*D?c!qw4~UvnSJ%1cLF|~iI@8RlqK$-pY-I}{)j6A@4s4#^U76(M}~Uy1uFbf zt2(i8*4*FUU)ApW@qF^hw~|j)8+Bbv0^>eBnRRw{|J3{UgSFm1JD|)TyGb~Dne48| zJ-V+=OOF1#&hc|u<$Igg-!`T59llZhs^GGg`|1Zd>z729*{)qwruXNRe{Q!^+t%W{jJ}B{nAQ2yL*`$=aeK zd-Q8$(xlmUUV9bBF&4&sVz2LBch92U&P#skL5XdPb_bkqE4y)A zk#o)+rhA$n9P0OrO=*`;+c-xja zA6=>YrX5j`*tzO7!*maYqpXkj_kLO87i}W{x@iipu*RG#rN7!VrLSlCpYCETj1FS| zP&nsEl2l)-Tl7bTACDb`4Hj+IKI`(#Byf&J;FO774|!QP*`ytK^jmbvE2XLI8~;w3 z^U%-CblX)1IZ<=-eUCNP-wIKeVsJ>9etzkU%o8?U+SAgqH#x`usXi}m9{D%G*X-Wq zT*uVP=Z!uaB{q7;OlN(`xoc^!pk=7HmQq06l8v{oF#LWHCgZzjPr7yNr}CB0PdpOK za9cQU&STBKXQs`IWGer0|2z6sVK(2_zUi4CE(a{|uK!rH&2xg|#CP>?3%_4Jza_a` zdBOc9c`SBsUj9y$OgWdA7qwPyt@fL{srM{I$`;NM=Is$P^!D5kRDb3|&?>KwZ4tjz z^|xqAU3;yRG}CfZWyt&sYMsh!dsUYje7>Gi?ZmC#)uGnk%kyLBqlQzaw!sUR_k=H- zC~SG6@y~3AuG708{NM0h;E${Ey^y(P`P&&djW<2oS~+RTgU!b09U6}PypzUpDlMs#d?qwp~Bvru^TVM|HZUvo4Cd zGIQISva~ZIQ@wpQeN^~S#bonWu`-U6^Vz&jmu3}tt8zS(wlT;SJUDazuV40^C;j8K zkMOT(Q%X7)y|rHTtIFrV4Fz%PTK*x2+9%{KsNd1LPt&@pe1R*gsiR!B!RbbUsGv}j zN`;SGF6*#GhF{*jIOfbJT}Hmi?ADWnFDhKQV&%6#Yxha7Ef>9(mCo9#pU4!%X`$cr|BIaX zmF?d$s&?y&d5bRm>Lv1tV=6z#>??a_bWe8hv);h>j%g0ljn8%0uUu_B!?XRi8S50T zw%pd3$!9Dj59pY9mu1PW=dt}{zvok!)Vk%R$5NS;{#Y6Nc^`jxYHNzHW~Nl?itiRN ztG1gLnH6UhUf~YZ>U2uXsnp!H?#|oKnG+2zEiSUiO}w~F%JZ?nnb#&C7!u|Q+?&2+ zrNE))8(gMKzoxBuxP3qKDIw-9H_K8@I@%6e?PEOkD@Jen!;Aa<<6BSM{r4dLdI*!r zIlE@lWwxJZU2JktUoJh9_2&hng1K$mEBPQ|xI?Q)TicZTJm&tf*3 zO&jBl6Z$S#KI`Gsz9pzHqxin;q3-utdsBpeepeQ}%-Oze!D9Et%fpJUCZA5Zx$;U+ zTwH8=^iK!w;(N0+s{CcklBUmo#h@PZN|U?r)SMktuDqz++!N#R!D@x&p?k?Ot5eQw z++l0kx4S>HXwfUVuis{#l-Pdqpb7Vz8JlxVk8Cn2yD6C*x224A8jps0rtpIq^Hkki z7psWmnM=>!F6pr5PPu3I>W*_Mr53G43M=e3>^R}tc|*j@Y5O7{|jEb znHHo{)ti31liBdk_iL|P{C@TeAL$O>7_N6lzMj2;Z-d3;#fgj7Ea|zo{e?;QY|*3& z%iZ)l^mSydk<*??A#etlsA>s^c>Ox;G@ZxOZb9o@JrRspyilFr+`rGyX?OvPp zDBiHfu%=Ibrs12!2Jbl+7bU74oo8J9kJYmE`~xYr)IF6at2It)nykN*vuB0e#hlF| zzIzy_?0c4H-d65*akbB4^ zX5d(ES3GTEPr?;WiP>rk)4J6QFP55b^C_HnK09VjLwJju(fSSH%s0ZjjM7donO<93 zYj|>|f%uV)y zw+-qZt~<8BQ{{2vh_8+o(6g8tuR2RpkVS&A1~_i&xf_TLXzc!hNKeAsBGYSO>)!s$5|tfeL2O@7SrQq*t8-X-pSmcj?k zvL)q;mrrdt&9Hb`k(&MT{jQ~E>rGiLrlsKlso(->{3fJAb^G|4k-x?QWkL zSyvzCpT1}i(3Vuqxxq&6(i6sm>>fR3Q;MsS7|u(c%)YtzW#sCxBM)Vt{?3^6VdX(p zkH5TM_W4ipWqtc3R9*M~@76Z3e#-fzZ@gl}HSs#dILKk~nQdm!q_ zk+>*b`)|oLMSIvbaTXMuT%vW_Tc&kV0LRh)r$X<)61Kg-n6_r#8h_>^@06nE>aOfg z=H;9*^YF*x+-DPAmu~PWT4H}gXK&_(aGBF>TgX> zmtL40m$YMo zy3*JnUs0U5e1iSaWv}O?&R?+ixRmR8-F~Op9=9X*ehRdIb+UAlWOQZJmu_hmK@Gka zS2mg_8s$EkaGznR&@J;FS5s_zuF2m0!@zH{@xUd$+o{*j*LeoAyTZ`$c2iESpAo1bYuRcx8V117DfHr+3dWN6G?-_66Se{S8O8z02{k~DqFxDNJ5o;>JYH&I9B z%KaZ-@7<`Ba~Bf0Dk^uX`RNP>uDN@rR+PRM-=C>J`^dX!oqY-dOD=sh?);ppe_fl` zg=_WF+Vx&H%I%)+TKDmO(%C@6%X|Vc;?KRAT}##VQ)V7}e^`2kjkEPZhrLtcUp<*3 z`?T-o=`xiZ^WeaFdz!?h?n;a867Y82dPTCFNmtEg{@Wu3N9M=AdbR1}CG~T6RAzGD z|MW>SA@|ztzIO_V(MI$27u@BJ)PL!weZ3#LN)A#W_Ef?IElvEwWWv7_@NVLt2^M(2vHL(jZ*B`EGf4}nn>U{rx z)lE%*_9xaJxvTkTo>IV_>J^h5BjQwk*?tRFoOk!Aw()-3i@~m`7f;>0{?ONT{b{)? zionB*o-&bYYDXzaO{{G)|K_Kf^$3ZExLdOTiv!g?* zrPvp6I9XdL^j|ax3DTbZ;Z#O?+M2R1#tkpi{|ERStG|9Z?aRJ*CNfKHRf~#B(^eX! z`tNTIj}#C*B5xEkbn5*oN_(EeU-Itr0{xS%;fGG1JrT?OB+}!NiBaK4 zQ}ZJBohyB|1RwN160>Vb!IW#;pIlw|t9ozry2~4xG9>km+g;(X`M#A+=0B(0zR><9 z50$)+UiB<(zP5I!$Qgx&JtvJD_A37H*rl^4HMe!`({BRjeEJv|%$qqZ7vJ>rnYH}~ zSE96pVSeZr)6})vGcQNkeYigB@S>Zy!t_4!`~7a1?&9I2$iB0{a9YV0u8r)e??aa{ zUUFeu(v`*f=X2Ml+o#{uu6TTF*H^vM&qTF-0!)=Z%WZEm;`39A$L*HBS-OYA|iM%)}mhxnpu*!|pq>Xo?mP(YR_v$|3o2{(sX6qLBU%I>Q@C$xc zr7H$e4Vzl^=3j5V5S&<+z+60cXL-fuca9UA{FTLno}9XULDccjrxu>ZwVZ4(Gu$8i z)q5X3Gf-3P-&NyE38xoVYI@o(W{RwR9@e095NdUozprEg13U849;NiX?5yXm}} z-#x$BT}v&m+p4W#Jj)p7@!DhJ+ONIaKPsDA|1i5C-*d|2^0R5mE`EpE0tJ$?wgg(L zpTD=8r#*7pMJXs8gQwAo{i@gKorn+u&)6vUdCYc0H1}n|LKw2IpIBx+l_Ci6#VmAen!`>VnyF% z?~Yejj&Zs_{WG<4YSP7J!Q6MFBm7*ne5d|*vGD%;hLP(#r@{HxM~{C~t&mnwdA_jY z$;y43&M;Me41d|ARaV*Kt`+YTeBGN}X)V9d#69NP_Igtb+g@CWIOlm-Q1gREU7YCc zz`%#fI_j<4KddgEXJ3PtM!rhtjK;Z0nh6>pH=-Lo?0Jfz$4H*RQFwERv5FtM8bRnLTT#&Lg8L@6XrL z9?6Bs%)9f*`GH-B-zgKfn1@a(#w*Wx?Xger51Y`^@$~h*36^s=AK9}s>ExGFFP}cF z+iWKM^LhryjIFZ43-`7}nO%*VKDpNQ?);g~jXS6Gct?FZ@pQe_c}Z&?wr_f3>#dqP z!ybLFxU%TL42iBkyIx#j`O4z=!cHtIe6CU(?)H|N6#TZ3lKUJ$tX9^0*`VE*TgcTYc^>+q_|STEb&qe1+o zr1!P^6Q*pHn>+W&uX(rodY{&qr5^GRKb_LMM0IWkPsNMgxwf;JPj5D6HF?Crk0^NP&D#W(-_ zbdBC*zx;+*^G=J^8?_eyng6NqLEy`3@3n@r${!qg9~>)C9c}yFThP7p-cEz)6Cr1| zU;gu&rPt8a?99AZMzc&jS6cfU3r0Ne(mVdmNVc*`X6hrR_pH9h?8m)Pl@dZ45GKx6+Ii>{c|*q^L{r_XGk$hGW2nZUM=7w(n^C+(l*zG=g2A%SoD zmlySJnquj>f7-X>KYYT2k1Q={3>M;h;PHxYJ5#c6%`|KIuVSJF6Hfd(RP;)({<-SG z$2XJnMeZ(paA_A{2OiyZ%bUsROvFN*Wk-t7`gk1y>okJZ$Qcz2~PGv8k1g7rVv zUp#56ROjY+7?#GrGe5cU0qeb_CD#`GVSfB%qk)zxa|7c#=0zKKeK+vB-{i1rSz@Ju zk-S2VcjT-LlcVX&2Sv!N)V}UDtWN`PuPn)$!&nRi8IUD}3Jn>(!wN zUIK64SO~bLttnYF$zl48)*t)#Fdi`p37@6%gr#cl&tp{|_Qq|RbHHSJYEN|LS?(Xo z&C@4{x^7whc>UYT{JAHjJcMnEvX)(KIlp|l1jCt>E%^yQPHq3Q{+nGz_96}WwZVsq zg(tsx@SkGm#*^{lxb=uTNol_R%vYqenW1Y67CGWO_HjBT= zT*Z^GeHGI_x^9}eXG_nWk^^sif3~h^j=*_%RL*G*s+Qj{JtmcF{eD9?F8fMeACoSquYrKK9tOxt8#Sr?F8G& z^L9_q{&s-7XV#7DyK1eQf-C&Py-o&C_;6b-ZF1b(SA9Dg5B&8?-6*_aBj19WZF=&# zNlIXc~1uVy>op+^TAsT)Y0Rd8X&yoG{Su z|MkP+*`iSQ1x%JEw~T9IrV8qCwM6;LT&SI~f-Z@2nc zTsfrg8s?+BBb-rGSYeNK)aN4|8)r=lY%Vgn$kugquJ@}goXr(X=NDgJvhdlreLZ(f zXPHaPT1c;F zmnmluw}|SQGfDrVLW@=eny;xAh+ALTp}HsDu`0ZNqV|KTd z=&b!GGqle$rB|Izb#Iu`(Yo~BhId`xIkr7ey~?Do8Kz{tCj4OJ-lUa28Nqv&tHsX` z*l_7U=dRNcN$2fuvA9|;-n-wxcbaYUf#(y;wpTkm`@C{p(m9P=uFINJz800f+Os?* z_x4R(m+gCsAnIcKaHnSTnM_3+;%f54)w;pUpFhisUt zFDakV3z?ID>YAd+5ia!^ku}rH1PWf=eSGtJTllq;45s!Lr>~!wbU!^KtFWiMUw!MA z`%?;bWi+*JFRUzn=CXQD`bG6W8^3xy44wX{X_`)__rXrXI2Co}sLKxXXI$jH_n7JW z#K0AAEe>VHR0LOd<`wI{+{<0G?!c?>F|Sh9vaLU6+&R>Kq4vXyGm<|}J=$tp`mJnR zz|9-FO8-Td_?-LxS!nvSMZXh2@l5`8Q~Dos=DpWvA0=+ndi0>bYHnuQ$4Bey-goy{ z#l0*q-hA71LZfikn(*ono%p$tx-VnqJmu-kocZAT7QuLlqGeAqVt-tlBzExf$1uqa zsTZd2IwSK&b&ZVHy$S2IRde@yl=K{)eoOMhrc>eP`bBpdS#}GTGhNta)K#?KdFGeo z&4KRvJ1RD@==3yv;kw3Wb4A9lbIvMF0fqgF7h}|xomR`+c|c~G|EZY%Nk`&U@@JbJ zcz^b#u$aEq9hu@iTk5uPG~3)yn%KLS$;U&h%5|GK`j#u=u} zeVXATy{hibz7JF8J)9XVZS%4&&FR#mXz$;ON45kjXV1Cy;O520CpO1#u393wT04`a zl>MmK_N#6B){nC*<9|nII_G}8_v^^b%c@c`{E08>l4=fKT-ge` zg_hYbIAQ2AuC<+@kUst1Z?r&Q0FT=kdoZrHQsMq{=9d`52X72yh7is}PgrIjL$ zG8eP(ho)+t`g8bO=63t%3i^-!WNvR~w5-ou%q6~8bbobixoYgOU0!NdDXWXGFJ@uC z=r8c?w3_CJmmUh!A8nfE-0SL*)$w^nx##PvYV&3bTnzsxFS+qg&~e+lneR+O+}rp9 zL_}|GT+lnKHrbSC&cE18GuEDEE}F+-|Kf+Aq~WuK&-=Gu*}MJW!=Txdi?7?gJa{7g z@r~OrS6r`7H(Y*+uS+)V=HsdtX0yLBJv(L@{r=O;MLvbIOr>a9j_~`_y|F^1;o<7-(%!LeHXLJQdTw+t^4gI( zD+`i@BBX@vQoVUs-ajtus(hX6h>2?P>J44&rp}N2HqN}>{?}P!Z{MG~hTSh-%~PFv zJ%yh|-TA`hu&rC3ZIhPyQKYGyIJ0JL+`il4%ItSHum2oq%kZr&w_E?znwhm~QM(T< z+wy3s>lTp%Z%eQH`2Aszb2s9WUoJ4=Z^geF?SiEWcWeI@FoyhkYm<_GE_LsV*Ee!4 zYbVZ8-yGhw`b7!ttyUjw)*z^3! zrtj8%OgU2d$1`((YiOXZ-qm^Syb&jqb$w^9iOG(CRigOyz;pf27aHAP_k4Vr@lW{U ziI3})E_0oFRC<1<}q z+vstp?Q5yH@AnKoY<8Nwf9?Y-)$pGRVpFUG^AGyQ-f!|MTrH>S$I7~>KSC#J>l{JJ z(%M5(Z|Xb)W(6lH>9Q@}D16uSMx-(G%BnlfAydD-Ewwy%L`FG;t=eO1hTY_&+x410 zug#2_)Kk}ZV9r;DRj-@h*u0+~Q|fp@RIc5If8y=KE+IDSwz6)%7qv)9^;BRX%gQq8 zw4c$>e+Na#tv1s;SEpNjZV8_&qtM!h4!e#?^Y)cUDC`Mak{8F}sB2+*%OEhXB5|Yr z{ngWC&pg!>xbx<~(VW;gkr)AvCQ&=Nb+5AgncIGUkP(gSs%)9@{DINxBgW!-E}EYE zb*IT3{V`z+-?Wc<&#(Mu5LDQFVUFXi8s=$|f2Vc6O8d6PT_wz@Zo-24qgzCeMc--? zJbm(^(2V{S><^c2SY>|uj9iH#7sF3kwuQ%AqIH=SwpeaOcQLsxl`Y%3&!F#XgsuOQsQVtbd}OqH`JZx6yA?czr{dg^ zoNQa+$fWl_UQIapBxiMbL&fzCuIG#k&u6|kW014gvh?M=FF)V@nUpb8JgnBj^#{|f z+itfP`fq+RX$`08H3R1mpT_Mf_PhUge#m8X4&Z)u_OsKMn}NU9-o9?5_Tgdtgy=c% zFW%~9s(sd%Rj*=Pa%G{fN1vtqAM+cvMNv8NFPawDUYfXUnmUj0!ik6UwC8NO9T>Qg zY1y8YKLeEV_8fQ`>A3gj8|f_5bfd6K8|R6g-GA9|(~+pA&!-fhr8S?L;rg)Az0%C` zm-pd~kMyP_dUwxcXz)1{uXZ`1%%Z__)=JMAj)$UdCatPj{#n~}y}h@J=90XW6~T-v zd#&F%y@@?Uwavcl0YXwTh>O~<|;WvY9j86(2M@ zI4hoDT_O1HumkVn>VvMTUvDP#oH4z*UHT9{BR-Um}iDa(5+*Vx#@A4 zjo%#>OuoCyFfj4Z&l?jKZ{WNV^W&A>%B=G}rX@iUJVi@3ZMr^trcB|Vl@-2X>Mj=R zr+%{7{AzO3@uc^+ORvs}yOYDY-}G#B&u1{c*Pb#6RXM-72!RWy7TJy6-$hGFo@w*fe@hszt4!NhX2}-lq{Eys!}B5g+mC+Hd)^zp zeQ$9l+Iv~X8U`mHkIr{pM#`ZbE3}SApL=b%vc7=9<^QzpJ5Rlp<5&=JI43Ww_x2=* ztD-y_1;>vxY0hT5v~pt(-+QJ_fdLP4x;7=sYZf^A?R4B@&pBt0;%UX)VgoU`9q)b> zAF5v?@XP0u%F@p+#j;mil>g5>5h3x^&(~8qyI|fLtt{i0d|MXW2yE{#PJg~W%yhM8 zw%*RAF6}~M&yO`USedkR=ULsm&2MqAYPUt#p)@s|St-dg{u>U2k4ru?rb zW=Atk{Ve*fr`;|vkWuHlz@ojqclH-!nQ&gwvwl<8n=kx6v;2qi+;p)^-O`o4-a2`% zca;jO*QDG}7rFbyq~Q0~MLACojoT+NxJyx=bcOAr9IwHFPpDib&w~qw!inrT>+Vu-HR*VH2t)b zzMtWzb!XDW`wQ5tx*lpUoG<&?YRp&ZyIMhNpVl6=RWA=JwKtzzw>$HVw14Y+i~c#9 zM(Sxj(HXus*=8-Y+*`h4QPi!D=|7^pr`-&nBDZ_(L&k0XKkD2vdS0Aaf9}Zj?0wTV zZa1E<9`fv&+eEI#_qnd$d(2|{oO8?aiNSx(4ye9L3^`VDjde*@d3W4_O?^|pou2+- zrc-gvH^DejB~eWvk>k6+n-i<+M*=XrK>rJkCfQ_l9a~ zq#Xy!1f$bBw(7ptQ@M4wqwlxP9fOZm(SC*6HkP+%|KdrLHorW1;_5kp4!+{6oeml> zf8g0Als`3i+n>a0zhzDQYJAlKYi}C|)J(q_+LW<$?OqOs*~aBhV$B|}uzBk4@Y03j zTlS}w=8KPio~(P{sAhWLjb^V@rYFaRZ~c4FB_}(}%u2cU?>Tv;p!tF}dQKkKl(iQ8 zIKP)uKIrLDpDofn-gZid)o1CPJvdS0FK0=fxYMRxz-y_%VbQwkEwk+ z5wrfN;3CPiqD|(DZMec&Vsig%KCbX#g}M7;jd!`~`{reszVY7l$g-z@73Z9sgA7+C zCq`(qH_!b$H9cY1550Bf^S0i*w6A2l;hnds8FyIxpPkiPs-tz@;>|&>IUgRW3maPH z|LNPR@#@+C3#@WqwCnUnXQEbV>xC4EEO zpZ!e>yKgrixwh>|+LB{W9hY!_JK*0G?st^+L|yJ%)4yst{oIS@Z+oNMb9%L;db-?6 zF*94O82`jhuGYD%#T`rDeEX##v2m?J)vTAgr!-W`{k8QgZ_aqy6*9B`w`t6UriDMA zJvp>$oyJM^sguM$TM3@C^jo;{N>O^+s_#c@@?DvPcUQRoIP;xd<3>%nW_!ZEpg!}7 zb5AYT-|ODuyu2!NnK$Ea?~Fl!}S$sW|o~juxaHKQ}=y$?yTSYY)5xq zvdHDm=_go(ycNIes_&9@xjNHWq0hnO4m0z)3uiKy7cWq+nV_MT(`G2$@$kmZ^E=O{ zl=l~3*t(@O`O-7DC1vUr6A$mX`Sg+9^j;SWZo!{fp8c!(BPF`eB0AZ2UJT9_dan{oGz>Q_He&gA-BM-UH6zhSH`=FWiH8F z4gXo@bsfHOs_IZ|MnM$6_*Mr2mK^3Qq5NT~Q?u7U4>)Bgyq{J2YN1jm&+Ex6dba#H z^QH0JlZUb{%cC!zUfc3ixR9|ld^QJK&V4#mA@wHt^@sE`%ND&24O?R^8X6;>r=uu6 zgUP_T#4d4JKw$if9!4( zr>5Mphnbry(yE?b$+>Ag;}FN@a{m?TwV@JQCjKw!4>|kgW>mt`FUo!Qh2?C|I}0p2 zd+4Tc%0IXYyX;4!C!c$6}MiMDdT;b zn<^$QQ4#VhW0&F8=x0Y4uXz`oBxdsQ)$8oT)91Ttd(@ar*3uol&C7^=+E1^1FO}y$dm_ z`RXZ))%U&cd&zhqW0~>x{m-Ykf1G*sZYk^6?b6l1^h~49csVWlv2?yi;bgHV&3ZwH zYL?%tI^DIqH~YWIxD> z+kNb%2Gf*nJv~P{8bl=~)?^DT(>GsuNqb$mV_VU~?%i7t9#|~Z=st1UiDQxW%cf+U zKOJ$jGq5nxMp%#aTkhVazV|-v78Iye)HP5SxSzLc%1P0EvbI59p()O1o6nmlZDf+Y z<0B{0cBFCIXI;-bJ6C-E^tU^$YMu0Zz5O%2c~W2?r=lk+<$I&N7J2!prSf?X=Q&_e%O0UZDwo5z5!p3wb`wNdF z<6@<6#-FxiwGa+5sgAiV_o0?^hHA`?(DRC47XSGvqR*2bx9KhC4!>=C_>ye)uCQ5T zX!Y0Th}MY%Ic#YTPuGbuM=ki}q&{KCZMV%wyf*32vN*jh^~-c!&OMR8oIZ$#{3&~G zU(|6k?Qzp{HA3I(GNqMo7VVgBIPbBtkdm?SwYsxEro1!_R$i2HMq=sO z?OTsMRo|M}p5)1;u^@U?LWks{I@hPO{vJIvN0?LfK;g#8*BpLad3lMWSX=VInv!q% zFOQ45+g^WL``O)D@=lR!Y?#-@c9HMrcW}l|D6TzJUz! zeRqw@=9MN_mS2c_(UY@nYT(1Oe)GP5K32)RkNKkX#nexMN_`1-ytAWbga>dMzS#R> zqt{0^fj{0)gTBS|6(mJZ+Fg` z{p!`fD+fO>pSk$`0ZX0LzJA|ZU%#WCyMvF+-RQw!$Hf+R>CsmQuOH5tNm|UU%f2@3T>JO%rR{q>H{Sf7 zdVpWA>Tn3B**3n-HS?Ao_hV7?W7)oE+M)}=mP=3Q**I;R-Ciknwz@MaU+c}wbn(>d ziTiI>3a2;dxJ#dMcs4_kvuDP+<8iD@Us`l=>rI_v$v)day#3Ac$gK`1%+IYm@a0FK z%KCud`K=UGQ8lxjFl;$aa-S z2Hm$$F$g_p4100)SmiuM&J7mUuaBK#n9x4WNyKf9Tc6v-$7*NTB9qctJ2o-uZT6^Q zn|*?(G}#=qi{&|d!c>$DkZY5W{}?q?VZ zcleu_YhP(Ha-7sy)Sap_W$}zVk*78Xu=T$<8@BSnlZQtXrv|CqIzM5CW5=g=t(zN@ z{A{&Oxn$qnRr+wRZ>s)gj>rQki;J$!NPBPmW_|lHFUyHmV>iqXiema^-0bmb zZ`Vk2e7@7ETA}TV)}*L}Eh;{Eu(fNR(zNv-g(~BB zFLhZpFJ52Vvtc{Ok*z6hS0^!8Z*ABo5-p%x=k$2hy2W1pZ+GwUZl3GRS9s!G+$qr+ zqW+twFY=juCGn_#2hX|#b-kYZmdzA?d3=RaUA)FG8#4UTEgi-rVG2P^%)|GLFH&#qsG-H`gMMhZ6?WJ`J{144T zb$*=+c)|N?xwvB3#I@qqtfTgqS=SO{tCKwd+KT# z=l|In%o%RlsT1aJoyB@!*`%|a%*|W)I+X%XtPbB@nr$MWGq;HKVxR20XXlpqs*3r{ zP1w7&d2jD7hWCwzcTBFwYTwwqX!U~X?2{YAHqBJEcJK-bSsD`bN>=tdw{dxAsiNPd z8=Eh2dR=9)dv@YexN$~bQ*Uo^;XRf!ZmU!T4sVx#AQIioSa|mCMIDFoFTZ|Q^xs|j zls7enpXmL^s?NOVm!DVvE>~S_?abFYypQ*MSv3DqtH7kK z>+dBg?Y>@Zsh6}haAL#3hkO^e+`PiWuvt_<;Pe%RBPk5VqFY&|w_h^TS#^9Jd&=sK zvtvr8a>gEGej#VG^_>mF!q}#EbMt_2FBv!VvIxA7+|qN0Uy*wPlVl@T>=AD7YdkMLR%XPoU4P$-827r?!1y{!D+b5U6(a&b1DJ48bj!%YuQ|H)-I=c`+Ny6{>n>8o>c z^y{VtUzvYu$yBd-9VQ11@)P!)jCglx&5j~f*X=^vUzpj;JTw2V!aK{tC-BB8#ch_B z;s&zjFQ>_Fc&AtVbgJ2GtBA6r36k4euB>Jb=;`uoxjf_ik|mEnHJIqnIuc_NpDcBk zTUCBDQ^d)x6WcS-WF)T1xf>Jwee%yAm9+)V>YC!l^;2@V-uFJ98PH;AV>m19CjB^DNwrlz3JLee~PiM-yrhK+VnR|E0qJ%XU9|f$g zT(+y@R&;uu9k>0yWjVBk|-QoG8blKY__RhKaaaWxlD)CmDU%MO8yItm>YK`O1 z`4^6!yY8~yFgqqmo^1nr{$%x^oB#e;nx3K4y3YM!E8u$NFT`MK>N<8I;j`rFRc| z)a^+DOmoU3oj9&vOY@ji#glnAWLMEQ_DN4P_D}b9ITd|vPqN$MXWdJdzg;--N~L?N z`8lJ^9i{TzH;?STy?@b!8=bP+U2a`R?){7lTNJ|88GpuBY!mzb2|9-))>(%y`p2A6 z@_i9sc3`_&Wa8Y**%v4L^YKe?eeS_O#pCniU5PGlf{&MKah&Lwc%5q&Te7C)J_Pf$k z3AgHMlUWBQKg*u+J%9bJZGy|y_WK?6o^k8R--E9o9c!%?Ncxr4&!Ljtwf5DWf1L{V zyDYaHiE^88z30}qHJ5uoUTk%Yy}HBEEMOCxtiZ>em4*Vgf~PEAp4xTt>&v6@V&|mq zbZmWOVz_vH)8kK(CM}y^?t0|x*Aw$7CGpiB_YPyNg1V!xX8rxUt~5R)A?^RdPkJS} z-ks*T)o=Il)T|4Mop<(ilT7UL&>Qbq_c1uEE8>|uTgE2Udzt@-C=R2(oD|v8m>W<2 z-udvsd$I4m^+zJP746qNI}+Av*7fi2)9F=bd#loP=G{!XROS3He)|9XeQVDD)49Lx z|8)D*g(vIFasp(oO@C9b|M%^&zr6on|ET}8Lt0MiY5BK5mbJ>YwFh=?-q66Yx8cET z1N$BG{-15IuG?PnzU{!j`nQkgJTfrZ^I`qwM?e1C#T!^He^JwH_u$XY&uq{2Vi*|A zYW_c%bMYtd^MCIH98_!`rR`XB`oo0_9sl3$`@i`8|JM)x#TVJ^%gW#S`FXRwwqAKu z{J+1q+IXX5%yVx1`FVV8m%m;1yS!T)5|1xs;O<_1O-!tPeOvo4?Kw$@+fG}1$1GZJ z9kqG_=ka&8e~Z5_wvVehZRNS=(C+&Gzs_#1m#eP2`uw>3x2uKruR`AMuRC_t^3ckQ zCyzc=`ulJ3L+{j5{i#Z_>n_cH_uhy1t6dE5;?R>9_q^c|?22JdcmJ#r*>HA!)7N?1 z^jlZ{-*|HEn-%|Fia!WGz`iAG>6!D_1M=u^$6+a z8i%qKF6rA(`AggXDR}+zT(|TNt`CH~w;)|G8c{S@n3Uu>Ad<_cr~$*mU*$ zoAT#ZxVN9|s^1&@>Ef-rxVcfA`2-Lw=_1uH(1fyEiTU zcy;or_Q?;e-DS7sybN0w{m&?RpV`v0e5JO3zCQT0GG48$r@pW@{Fhhc_cz7g%KkfD zkh=FW{L(v5>4mRXpLxu;KYRa5rmehY*UwLR`_(>(zc#bL<+0ia|2Iz$x!*ptsV@BN z&iZrxrBBYB7c;fb_~W~yr2gPn|J}UhpU=OR-T(FRgY(t(I&)(8NC~8!{(tn|NwG!8 zj&HjC<5u|2*+=7VOqc%3Z0rBhZs(ubmDlBS>ZNt>$Ll<-|LC_|PTOLVgyFQ3J*%HD zmw&jwWlrwq%HoGw%f1|)y5GO*_tQArLfy?SGp9y%bvJuCtSu$~2kK9abuoXnY2UvT&F?D3 z-(TEW`uLhmkmI3!*Y-y2dwSt|ZRgICxq8u`Lqy-MR$I^dmA|LHrl9=E!FN}TU+&K0 zV=rc2R^Mu8@%zn(HeKO*nG=2X0-bvwOxdvb`ma~#3%{3td4E^)*1M38PrmYZ|7iak z?{Q_hYGb-=OT7G+JO7GvYvKAXb0|9o0Hec5vTB?UR*yKi6qHoxl2l}xdkZ-(zLHoINj zD1T^DZ~g8KjQKhBiQ7*-zOz>sf8AH` z_^hA%*(2wzyX><~d~?3a1^)VU`q;RZx{KW_#rX* zY5L)Px)1cF^Zzd_EuUO_c-kx3o{O>X+Ka@>6x_?XYWPj+-&rqU`Z0S^ea9!^J&NBB zA2psWBvm%ubaQj5V%zmA zGHu%DlNyIij<3=ZpDN9M;^55(Zx@6|?BBe`>GSGcrq)Z@%WOjOD%Sk@Dfs3%vv23~ z*%Qx7olQLZTW9O>V!3@a5uXiCe_H$WaQn7>=XHW-J5Q?N-xYJ zI~lkyr1DJtw%;{ky7jcj+_&w2=Gji46zKf3TgX!}NJg_%M7+HG`}B7z-)%+n?{2SO z#D2!mr@KXbr-SsHC)elKzWw9BbL;L|J4;3Q#dhB@l&M+ixA0zoroT4#tLyK?zkcqq zUAg^jd4y@&1+L{)50;h}IyyEsZ-1QcTvb}_z1!jag=?i@VST#iZfy%&&oF_h{2TkK zSiTdhw`|c^V)x|UpRErcMwPkDeZa6uXl0L$SB?`O*Bi?N8}H7uQe=QGh=i zw_?w#yd3ql(?9s;`EFA-*1Ke9F7s~h#Q)hx#oO6;o9vt7Z>IY}@NGw~p_}2XX)jOO zuadi{vHR+Ykg|?Fb%&FH-?)Sfx_uSIv1<%*2@&(~h4w6g%Ux{P`P` zOlL+WWjyoeUnZpy>v38|qRIJMTuWV;RI0wAnC+1xf7QR0zuP}4V3U2t{x_*tP6z7? zpX<0Yd6Z;DxML~+iQB$w=x z|1}le!n#JYtEUt;O%$6X^C>zsA@sr@*^8+YE9^4k&fDDH6R6BB(Zs>NZGpj^e};wG zzZaa%U|pP1P;g+4^i=Ilmt7v$A9&uF@Pgq|_9Y>y-A+QfA4{j5b#uvl^2uV3jZ0jV z*wfojqFY_x?_F5+;>n8-p7MAae5$?gT=dRpzrTL_x8!tgc;mt6 zb8i2YBu@{OmA~Y!chK7T-^NEnYwEr9TS z&;NQ^tLpSYUCHQ2e<#SFy}Lv3sc}Qos&8{R?dv|}KiSXwPsy$@*UK)d=66?fzT}B3 zGF7z>?Qa;YeqNsG6x%W}Eamg`o~Qbo9A!cpSjyb;kI`+^Qp9B+f*_Zedl<) zCxkmkcF{DOCksP2hDqc`W`0P1S-g-}Lw8~Cv!L3)yMos|&-8yH)pam=!9n?R3+}KT z=A0a1Y;tkNqldG@-Ev`D8uQ_mdlp_)75F_Nujjh;CzGU)(Hebg(`}CA$ z8gHAsp8UnR+=9%-0e(umE01NJ)`-Z8%Adva%kbU1M`zcu8NZnyG3Siqg-cGkhrT6u z7rcCMXlKE?%;{D3Q8tg63=eOA)VfG~lauD|nR|V@gNK={j1k6cTCjRxO&fi#r_%w z8H+dDKQ2;#u=)R2>-|6Wn{~x(y}z|ILn5~JhvKJ`#~(g?EnVYZ`+APVzdw=33!9(L zJAcb}zW%At@9#GAl7 zr<;U;6Uz@_i2WvtR%9zuR2*jX(a$ zzyANLwbLH!d|aMYFK%8IoA9!9`O59**XQqDR`qlHm*e*FW?d^44y?XspjBO}r&F%1 z{UPk2sp?e!Y1$X&7xDe8x;l4*rc( zUkb}$Nb&Wzcu22 z@NeF;;-0n#tZiFX>GzK< zy}HEaE&E#W^Y(WOb3R+CoBov*Hmi*azTVi8zj1$8UgMn2K{q#a%}Kv`>%Yynwzlpi z_6^UzPPpl_w^jJMl3u<;#+zR&7yrLuZy&T^TcnMeP5b*U-R^m9HSheQv?Pvbocy+Q z)$%`w3-aFF<5}rd&9!pU&Dp0)`7T{rU=?1mu{&yI&e{`|M`k>>&w6*Qw}<)I^#$*w zS_}5RW8nW-+4}EK&tC6W-Y-qh1*hkI{kJ)?JTp&E$jq1ZS%G*FSHF8;s8deg+-mO| zt6pE)@c7>6*P8!(-E(Xo>m|<)Y!iy%DDE8@;$kyOVcJ! z+_g{eOzSGcWk=-C+6FrKvkL1QHC2@-)P-5`b^kvxW2>*t{6EWAdButzeI`G3ckbq^ z_uu-8sXbnwt}MOK{OH5-EZO9HM`y&jo1a(Y)p+jY(Rtkb|777iYr{f2>LON_yZ@=a zrLjUGQEvV9yKf?{ZjF*r?C$DY-^$nY{9ok*i@UN}GE+t7KD=PFE=}^W&`UjWnU$As z)wRCMU-H=X*z~808+s)(r#=?>T|cS*Qu>pkH%X!54F%rQqI|xjn8;~*UR-_0{%!8s z*MI7Mdab|CyT5-b``^oF|Mvac{9XRT{=|U#gPQ}c{@nX+?xpDB#ZN_Z-9=Z;IMQ>_ zH*3#|cbdE6b$&JPI=8~<-_25q* zZ^O&|wrMJ2FY^BUS{5?L&idIM@1tMBtGOT%I05I58tgkvE_N1xWc6RvdYJMt#B`oVey;m;Rx$0_`ZwKV@0)7p`1k5lr@Wi? zE&GmfTVX24+)WihX@Q$xSg{4Z?EJK2(q)sS*(;vEz2)nFf4$I>a967r@2&X1DF0jB zAYL{nQN1Q_lllDH7j3WI3A|Qru<-Er)O#+*AA7v}USDF@TM~YB@!qBjF6En3f3;ly zUzl|1Unlz-9h?5u;-SCJKl~;;t0X0M;q{bj-HF~+>WjYmYRLb3wfLIa{qoC=< zNxqPKyTGI7oz?Mk?}Xc2&CGwk5nhQaZ4elxKlwa-P|LWxZoNJ6>_? z^caf+)9<)W_K=$E)}eWAAeEv$w{ea2`Y1!v@U3nSgki0~-WtD4X(1g3@ zQj>#465e+HJ-+ArPV0yFR6b3a80!~N6>+m@(Sv0s+o}(}d;jS5;i(JfbESod%Pt6a z>NnP>d)R>gj7?EhFDdg zKSxi^V4ZPbs>rI4o^|TKTPNymzPUG#uf|LK@w#n~z9}v=m{O&()#KUq=ZDW($yF76 zoAGwxg`G39b$#b+i@iK4I;r*3RL1Xqylz{bOYX{6dRf`Z#bETc|KQP|e2?b*dARIV zW1;+(fL#}KKPpOzg=D;SufC=psxyCO#+Lf}l<6nGX$bH0zqHR!JhQq`_~?nYs)gsR z{xXQ2{Pps}f=`jr{fF1XJ-HJSS|CHzc%xr<{x3-OC?*) zLif4n2|Y<}UtH^yabwE01=$m>%K8QgsVF9QbDc5^KJTvCJcaY?djnaU%}IBko8@gR zVp)@W=TBQ_w5dtXQOOCjS1n@8)b@YOwrX|!AM+a(Rj)Z8t#IsqEf+(MWpdK1`Yc6E z!ec+(3QcJJ#^cE`tC;(`(US;?11-8UIp=Ls{K}6w#O4|&VS4ACjHtX` zq-*mIb=#a~A)Q&V)oj1*X7=#z@UCe;d`VvQip7KY7p^<`f9m*6U6SrE_r7{l@XvJC z9QFgV-Dl6{6PUD0%l4A`hw4h#r!TYaOuppMdfLQ(uI??Fr5$NE{#gg~Jdsz-TK4y| zv$fnTu@T$;Tv#jA z=G4lD%`@&Q&UiJ^Bf`)3 z$sSqX{(~WGYqnWrr(&Ud<+{I*eBN0_Ok$a~hjXKUz*B8swe8^-SKEHwT`i~m>DGf) z@jFj1ILmHcb}a0JKSL~UJo}n&z0V7;Z@OC>HziSMwaT%1oUh(rZ7#bLqA~S})R#F| zHfQOw{7DvSZP@;7v2l-7?m`KhvacR78+Yw9)3M=N}$1j=Y|D{nf_r9yb{?s;-Z!~*WEwSjietp67-%Xn7te)%Wk+fM6LWe;34>pIdeB4?TL zt~&Kk*PE_2z3VK$>m6LWsb}BRgKQ1A`*>_qc_Z6fm-@7PPy3S5|35gT?!kKtWv?F@ zx-}MQ8^3*$J26?>Nn0sUzV(&ckko{KkFk2 zKfWFR*Y2{7f78E^+9c8Ii%q-Y7E1^6eopUh3pHDPLTAEJw_U8Bq8;Z_7CES#(>JMP zl>V2m@W|(tZFXyS-@@w-0by?$E_Z{_dPa6GVc7+MsI~+xsCISN=-vVc{7`8Chc&n zOccJlu2c8smkUcal(eq)(T;Jo|MhKM;oQr5yl;=@{d-wob=PqIE|!{eNy(n?gF>2= zKPzbmsdmL{@7%T2N&B{(ZqRWb%bbmi4l#edl#=k`vOW7b#`)6DZ$%SR^JEh98FsnM zy?yDs$d}2_COvW9u)KY1ZNGbLkn0WE>29YJAAeY1^{+KC=60U!d=q`&!0>?jYv=af z4CH5i*EfH&#_VHCS65}s%3#mk+xYU_sh|M4XSyeEUfNd3_CH-?&qgns0x^}7sh5m- z{97s}U7B0!FEYiZ`?)3K@AcETd3uM@ zzpGL8F_sx?Z-ojQ2grv_e$>py)w1^L$0bwMC&lK>{+_3C;{FYmrOV6{&KWay@O-+Q zvMkWwm&GqW!mikyoql_e#BgGj}iJrb%-POkTcz>!ST2L^VxQ{8i~I zmcNEZ3vXLaHmFIhvDt8Q>qai&mfQtz_#TB_ox)Ik!Z*G9!m)t&eR@~kt(d$(Xj9Yv zeNT6VB)$8wO}3FsE;uS=5O>3Z_rq+ z@_w(wSu$ygn)d4a_I;bTCG~vY_{2!8QmI?#+@h%-IXeAh#U)=K9u&yA_;+rV#^ zw`c$AFr(GUH=c2s#`73wE}336Gx4jl{~^C=n+$5FJlU?Y#68ONWi0ou$Gyj&)y1A{ z47hLiZ~KpTxx2ok^!VT3VQj+p_QAXA-W%?GS7W=rUrc{^EPv)tvG#ec+rRSiU9g_3 z`?zY-mS^7eP{=d@&Rk`pdnCKi_>OblO9- zDR|#Pjc{%L(3#DFpVT`Zd`a+Sw{Vn6TB@SyBH~+qIhvn9aXTLWo%zfIQ@Kb2U zo)<0--?H{k-|sdn{;<$P_PXhLi|^@O+9=U+^yPC|j&HNyrpkLIo78(PwJwS&>y%Fx zeiL-ywr;xpwpSB<;-_&))xQ>d@Gm6vVvW(`pq~qh-fj!+`#EQGwPmlvg>LJW=35`D z&HeaOooSJBhm`tbr>B#H1pUvs+>`wOsdD+UXN`aRclCIli#VI#D{pgUN}2Lh-EAAC z^%x!V!`DAkKkgA5{pxqly8xYpL(3SqAM9EG)a$%_j;C3r*L-iw>ZDay7O&dk(YkxN zR$P?eq`my{hAT}?H>~~onDg?iOE0x1*uB}VrNi-$iFY|W>%6ORU{pM9u`1&F#zE|SP zV>MC5yA%9so8B*de|^fl+if3R>vN3mZ41+nk2-AhO~IbGXn*1M_XbxJ^QK>UviQ1@ zxix?Fv2(IDNsBf;(ou?CU@RNXwex6kR>vHLN_|xPg;Xf3D=k1B}+p@-g-Q9Wpfls~9 zzqz{j&?U*tp7Pi?pA9#5Pr5UG#tCbd{sn8!o{jdh*5WcaSnz$mm$N%}PmWOeV`Xu5 z*H3RZ?r;CX@O19EFnM*pxrVX1t5>Dwo0*4sd}&=Ecx8F7vG6`SftOa#oJ;O)Q}5aI z@!>OzKeDy2_U=$L+wo|kSTn=a`|nae>KxyROUFU$u?=Oa&v|_Z{UHT$9Gi7&m!P@?vn?(Mz%;Nob zGDAP^;Khxa{d4%r+I`|eyR&PWvqGG$Wwrzz;1E;QXtoj zLDv{1zuR>GEok_jv{3Wk#&ypuFLXI*zw|h2{5iUF{ZjdFHVb~f3}d?dKKJI-9Dlh#eN)V-(wLL;kJNtYc2j(? zz~@lh;^e~(pTeW!_;_Y4o0435;gAP&S!VR%y#gFQ+>P*Z=Q6)P?f2L1vdza<>wbv$d?OZ9yxKL?hHc)8D}{HW-|p<}kKJ&7ruA>$Y1b;= zUwWF{u}=BM?%!E{EjK2upUCz9(t?%p0^znHUxGF^p4!VXr|OEpdJnOv`?agpR^8ih zYiC{Wel_{WFMAf&7erQgIKMr(eL4T!d1s8oubd9`2<3cM?`-q)h!nAd$wRwRpEFCZm&` zDi0=I-=U-yWuo(mFZ(hkx@7z}`UHlbZ%6|1&QFxg1E#Kk2Khmc4?>;Ww==VpfN^r@_69+RcHMSfr=iL7( z@SMPx6MJ))a7|k76Z!Z^z}Em}jj}b0A74oJc0ZQ-x1c;(jPvW4wFY}T9`M_Sx@Dhs zZ#uW{?z@*a|0LC=C#|*1s*2veL}F4-lT5IZzqq%6?K0QRQU|kXRgYI+md>;|vHbZ)_ua>eJ~evO zW)&U3ub3%%eoCVCQu8jEVr?slmbqX4opZgv>sav4fYR3wCm(KinE31T{VAVX%};M$ z%@FO`|Hp}?jg@8Zp2(|vHgo5_-S~lDGVaXs)76_@KKVXq6|O4hU$!yV(X-=$KgYkm z*tnZhADz}4g}N1xohb;-ZecG96yPHXFas65l=u{{>acZOT} ziKf*3vy*>_&1H0pPob;D2wfO^M7^8D2c!5^&k1I)2>Ug@6Y{y zEVF%f&0fpJPCrEc-w{zvKb>(X@WGxBdk_4*-v7sR)|8m=s}jHP@0z;xfVrpC2mkn4H`@)%FZKLoagDMpGd|;d8GkoAgwbZ(dH4 zZ=IOIu77+{;NDpu^3^WySvXJdNAJ5D>!Ke45!@4JNS>{j5Y|%}{_*3(Dep@@{)>5_ zS^wE^;RUO2XOeDjesNJj&uo?Z(?9XAM{uUv4~lpm=KAmy??uH|0#~?T0$xF_y+EahG)>a(IzIgVUt*hehbNcd2=jm_#-leNLb8%FI@zZ;o_iD|) zsrEGN!le`LYEcUgJZIr8D~K#uG|TS)^FK1jWv^ec-CW;ge7oj>YLd?le${ZB#ealk zIQ2iXZr;ciFZG)L$*tfG$GrUym$g>+E$!Qz{dcy&p;={Dmgz3-eA2(CXZ}prj{htd zPEDM3?%BGD+)`hD{w~OP^q47j0+$iDnAhcE*UQ2_7k-r=e$%X#a+Lo=-OZWz9%SC# zxOuAQ-`gj@=C68icG;YXhPS6~`Y3B2BQ3n~+3o3T4s11?bKkaYwczQ3o)@`FPM^M< ziQZWBXOB_!ub(0>C!U^MXylVED~+hem$j5qB>^E(&L}4WLB^5 zULE_(8iy^|z%ljc-{!NM>mTy>@iHyn$hNkh z@s#5RUf$=5UllaPyZ!8q4$SC zGh0rh^fp_bxtT)JzDm=oJC-5qnjB-eQq|qQ)nuNE_>dd;_s_$LtJISIi--wtyzzO* zCbOK(X?v~m*X~lWcvM#DnSFhO*w)V#>`^l}h>Ptxwe!qe#y`ttOw0S7mYwgIex|nA z)qM819TJXrQ%oM6`1^Kg#x_ar#H*_#uNeJ(=J4A3_oPk7@$P7SfS{B`f9Q<^h# z!@udaMcn%4Vee3v)ceghhGE;CJNwlS9%-yyW8@XE(EfSOeY49GSTER4n4}J zsA5x!LRO`ySkd37?hNj(#qRR#B|6_;zEkzqKDoO4U4(z{D`P>ggN}jqI)6l?%YLf9 zSX-d?U`t~4+PdzQ{_hNTouA{XRAl;6a@SRcZ+X{ey`HCI`tIzf#TPa;N&Ssgm|tGW za(u1Ib@q9gPqn|_+vpLVawUPc=U-Fnr2Z!>&u>3odbIL_aiZh;9igmKkF73VopHqL z+vaBBep$(riT~8U)MQDk9$%Sn@+eFCYR!wz1spS*t-oB+<9{&qYG;w-yNXkn7;}Hs ztls$VpNIdsBkaYuzOX!cy-)ASktsYmUePxetrYtg(O+-#_Sp9H`%5d2Jl(frxqJMI z`wON{^X{3g`>W*4)CpIgGqKgZ)(Efsw_sPS@3YT0k~fRbFj*_)e?sxKX6Cf*`EEU5 zL(Yh3U0wXF{Qp`eW{p%0fo-XYA#W~xy7V|~@1^HipL0*KEDctg^DL;g_@m;EMYDE1 zDxSu-DDA;hj!N%<;tTo}D#3-Cq0wt%U+kZ6vj2yKg4Dw<>IUyV)zi z=bYM)(@&S?T@sbPtaZfeve$pn=(E|@S(*Pfe$lh7s!A2lOUPN6m3dxn1{+7&8^yZ# zCwI22x8HAgONwvq-j#*_thFV?pPdWu;au)|YaT<|wJ#m#*G*+!_^Y>V;hC#SxiM#E z+&L;9|H1iJyZ^`h{jvoIr7t{=?(r&A%XNR}P#m}VJ-j>#9 zxyrIEy%#j(FWhTYnyaE~?)j=q|Kr8=ZnIw9oH)hrP4xdq6>sdm9bX$e{f#E4*RDop zGwVYEd}4=ZhVO_vRDJy5t~Ex_NU=jkioz1Op<>>|E$r1C6R znZd%(tMPl@*~`;)RNwkp1avkzzr1+v&Z_6^wQ)XwVgnp+N*sx@OHrtOWAbd#f{E|a z13HiLWjtwCVcDft@nXS)+|23A_b|A*~BB(0xQ{1{X{i8n)=t<0dY8(-} z(6w~`BkcvAkKK~(*B*NiB&}X9uvbO@nU)p1+Ogy7vzA9rxT*Ey*4@sh=Q#qhi>nSX zzI@D;%d_YC%}>dHKR%fIyu{UfX5Zv&mX)uAtSh(1ZjO-p-MeG!SM{%R7fS44tK?huE`Vry%Sjfw=h!9eZjGnuO%Dyb^NZ{uz1&p(zA!JS|6?YeUa~n zz3KmFJ4|Nx9gmvg`?*W+=)V=M(F^(7CZ)3E9o~{%_VLvAi^`MTZifjxm;0Y(De?c( zlTSN}m`t>VO}^Y*UUR@YB6i=wZ6bGnn0Uz6w%WJ2)^BT(s+9}kT*EZI=dR{$H68Dw z&kWqw&pE_R0)_Qd5eeH@t16s76L{ZIvp#q6tt+C345Pr>{6wGtc&O2T#@y(bRI$*M9oyvoEl2jh3|I=3_0swN&+>b@Qf@0v|trf7LLb z_jgwb?KEMT|J7Chf;BhG#_Nyz_nWw?@9^Cgrf-_{C1kIPobR+X8Z66sW1jJ^l#mM$ zVr}meoqVKN;CxltcDKblpOy66iM3BSuKP(zE-U=LvC|$6`=6=`uN~Wqq@u%vB&3q~ z9{aorys|H$^6bA~?f3WWIaqs7u514?w+EAr3f2bp-VqHk;9U6W`lEBsdzydDR+y*v zNB*+Ky@j>+J_f&i+Q!koD&x)dZ=UsYKdbN=W=c#?ucNXvp@7>vNA^DVBKkU;Ksrem=`UNmp|jjhgBs%v|sq^tk#p1RGxgq{p>g0cRewu zAJuJi;EKy+ng8U-51ys%`(GS+74G!kx_ErD?IQ)1j7H}<7Gbn1wzs6qQ?pa5Z9@lQNR?&{17vX8fa(H?F zoA4{ryTw*Y%l!g1)$)R*Ua~ho@al!x4{B6Hp|6scn z_$piM#V5;E+ft{gckNbLsl{6N;nmNk-W8tK6RMdmJm0kV^nw^Vuciu2x)qi}k=-^q&HHw#Hdiu^V>TEyorSD~Nv(TDjHQGL5atH1AY!2*?SyFfV zP++6Dx@_>Obmo6k7byk1e%haC-#x|kwyU4d&$3&JHVi4ox1_!#zs}hC_SVI;&l`^V z=+1Jv|Egy~($z&fEk0Jqe6$UlSG)4V#q54t%d2LG=WSYljNd0P^*6uEr~NUZKOXr0 z=XiDb15P|MF9yzK?PW=ep5a+wxK?O+J@@+SI=vj_b3boOG1K{S?{;aYbc0XU0+~C` z9xits`C~MtH7wb(TCZyJn$>>_NWK3}c8BBInJ3RP{k{8P&&z|GYiC)UJQQ@PZt3de z%jw6~v)uK*5d3$}%njN*9bX=pR9zOo)QxA?^XWgL^%t9@%=mPB>D8-lZ#Yg{dmm~L ziTmTfVB=FUU%{RST+8mw?q4dN@uFw%#l>a$PnJnWi$tf&uPESM{53FPSKC|3_%eOl z7nTgSp2j?H`owUd_fMl;*1d*jlOAqi=~#Zz^=9oXd6O5b=W%}BQvPV`6MtVmxmn9* zJm84py?rc3es9hSkpTUgW7SOOs|-G#+Fuu*eY374{Z+|~;u~B?FQ%?($oX(~t>siX zKZ)N-E7zr6t zUF!6&fISO;M1HwpR5o?-TKD6J;%7c=UE3fQkY4lhgWI}OvNx0;F1Fq2W%YSgWY!0x z?V{JE`}a%CxHThr&e_XS>CJD&zW#08$ff&wIq!n(Q)RL@_`RH;I~cSUA5HdESJ$sz z5y}zYZ>-~bQ#0aKV0E<3M&-nb=Wa~byL;B`&b42wWgR)=YB;3|WoEuz!d4|I);Lcr zB-b=|{kx+1aQYwP8^2ot$s4!5t7-S_`;?$lm2jx* zXT_f1|F^XNXj(p7{E!`w06UxUX^&qqPe0n<+HbdFLYw|BQJJdNpNIZ=7-($s)T>`K z>9>=%#hP}x`8>8$l=ZeS&s3ABFBjUI#=qipZ{_Saj$4y&^BhyockW-ff6kkZl6{|r zN*y1^KT;Nswh4be_m$%cWwm#^-et92oqCUnoqOx^JZ28Y10M5#TQIVIZ#R|txBOE$ zi|(encXEGDz2|U~-Q1aOy*+29&XNyT+_qom*v_KVw)39b9uR77^baj@S!z^Y zSh0Vv_0L&VN8?cc}${LqtD=NFD;x1YU8^yfXp zvCep#YRGz3cFC*q+iEf=F)8mo%{N;=yngPb#b+m-NjozC;GQX+>6?D<^4;|Ns4VZa zu=B2_kqXCyE+u_W*%!Ie&qP=*ZIYiqd>eh^nMOd( znrB>dKmW=1-}R#LtD>p!tC>Hh&YAn;gk|@eS~Y2>R6fC`+9z)htQ1tPR(<00z4PZ0 zxiyM1^YR=WFZKIX`n`R(?bNw~r~7YR1-Q022)zBf?T%1P z^t~jWlGw`TaNRq{O*_r!)uwNYw5WY~W(xb+FP~0lW$pU1-J(p$;<$Vd*M}R^rg|%I z*DhRiSW07;NWAsK1+Cq?4{yCB5zPI6_M^2%7iVNTPZ8(Z|LoeZdFZEOB>$PT?8GQOV-Inu;?@q7&=N)Z8vC{FHA%@2-5y1u1{XxmVxpiarNAbs; zi`8w)&Kf2r7#dGZJfLBevZuRq?!Gx}^07`*o0dciEC0+kiHcbn^wR8*f8C0Q(oe5y zZTzCSEk-qOZR1piSlQY0pFCMwxjX#c%lBNj<@Ua~EAn*>qvc<#ebe?Xy!Xjxt;VDE zy}{gPXC04SlQE}Fu%T@8g;Tq}25u<%nYQj;#L1;Mrtkf7IMhUWc3)e{{<9w&%kDa6 z{j6$R>$ZHw8U6XI^21wy#&HToEUpc*=A6**D5N&ccx#&PAy)s061k$^nzcphs{7(j z>NVA5eY*E@?X#+LEn9UyX)1r&awfk*=Biof!Q5&I$t&M3D2Uq_^7mAlTFZPtC{wJw zZhlXJN#g4X_huJ&pV)eH#WfSI$Irq(tR%g>_42&UZh&qcikN*zH5&j1^(}&leT!KKR7B*SO>S&j&kBi=WS)c0A$CyHm%K zelN>^^5vS1@SeIGeJ>aH&G0YmjnLYzwomoVW%)>pBX=46`!9N2d37U=`Rm-flP^EG z_PgiQPUq0(xy>T_wpFpMGrrx6abwyRSG1GA__iHS&=r|A{o>MOqtoJ-ZL6KjQ+{S1lG^(9$My>= zdK3a~T)Oik>eUtbgBtVMcUIgKUz%9?SZB^!qk6B&d(89$882Bp)O{fpnHvzjzwCo% z1jh~o>qqZ5sJ^`Yw_%@S=u)xBJBK(l_gMFrdj;=`lB%2jZNmKHQ5$FPvCliX<4bK4 zvuMwhtt?9mL(i<^;QC=C7b6{F;x;GM&rB|2-B%;8wMu>czdwHJtm9>@N{?jv7c_eb z+qR9n6n)~Bo3QqO`Y-A=_0i6HvjgW&xb51pLC~9Q#n+EGx@i=IDXyLOY|k?G&B4_Xa{G9N z_%0flY}d-Y#asR7$8J+KqwfXrQ|)C77ynP&;(M7(IsDR1J+CwWn!e{;mZ^%hySQ^o zcX)Kj|AwDNrG2dO?!rQ;N6pJaHx+Je=XpQJCPk#^7;9JGnupt8Zn2J7`Tg0AA3mY8 zrWrppd9Xy7@ukWpgIt+Db-U!}F2=D{`)+cI*VUH3S-;}5evA>=qUJ{N$&y_n{IIH@h zYkK7MJ>ktyr{2;3n6h+oeq?9+U5&}S*6HugM1Q&ecvZvtQ{t%$t$u8MdGK3x+@k4E zzb&|x!?M4$=#hz7gy-5%-35;gJ6pCsICrT)E>JUfLVKOLh^pJx)y5azpMCl};@qxB z>UtrwLN|Qm6}G7{sd^p#*pOA^)p@tY%de_m{KPu_zE&l7K^ zXkXsCl%UJZv))d7Y!~z?`*>Z>hY7bo{rRw9M`3^2XWt2S?DIn0Jgp3-$u1Xq>1BU^ zl4a5-#nLs4ITvk=E{^tzI{G}m=Ib8$H7U`y%M#t(+IQ5a`rWUnS??4cUsYGV$MKw7 zwEru~m}e$`wC z`_KB95pj32X3C}6U+ArxtaA0%dA{%|O*!YE9yYmC^7yfG+?VsyGOIRg^v=jK6*-=} z$!AiT*7nTYdJF4ni(e7md}^!GYIOa!cZo8VHtV01o1}MLDtB4U9?xonmu!bGr}~@q zojo?&hD+L$LFB5V-I?cRKVO|?bI7tNUYPz^NwWWv))$pIA1=D`fBR81BlW?QMXRpM zTArFLZjfRk{O#5YCO-!&yVidd=I_?*bQSUDnR(=ts>x~A_`_Q))L*dkI+Uz9Uh#0# z3^i`)%CPHstYRU)bu9^>&Wiua6HiGDoMtNgdqJMczrv~FvMb&6+wYk?x%5gd=dw+2 zzv#kS3pR4s)SXH3d!lvVx0WZ<)Z(A3??#-P+q&`*=eC*!Nzv9bMDxOpuf3ggig)FC z=}G@Y>z8V+U#x2C$Y01A!BD#0{ImSrI~|X9uXLT3^^Sc(+u7^?PGxNlo^|=n|RmrR-c;~WBS+D z`p7%y{F(FHn6=J~ zFYmtmKA*okmU&rA9$|IXVKWp~hgE8~gS9!+8Uhp}+mdn<)dui}t@$IkY zE)?ZwJihw$?X{Z~sv>zxyX*d)imI^|w0iaHUdoiEm=^Zg= zRU0qUAm0jZ{ff;~f81pX8KvLW%4`Y5qLK2qHHBc&%rsnrrc#Hxqd+Uw}^YuOZ~SkUVn^F$9?+z zWJ>GdlJXWA>-C;D(se8>0{=%I{rq*_$Az!*)4E! z3#p|20qzPu1hPlqvr-i{f_;!mht2~52Gs1g_FY# zeU)yS8lF_W%@XtEC+nKDp!S`U|6E-h`>j`Z`iWJSo;*t2usLs{#MxXurrm}|FYO7P zSL3#HuFiAj8!S)xo1C|PlKfPZ9%!BWR=QW~zXw-rX6oED&h+BfSAJN|eKB$Auj@~5 zJ(t=#>+;R>mv3LacdKR3Y39#Q>MuS@vIseL@u$VBy}$OKH`;P@_SKVbKXh!@`I*!G zWhIZ}9}Y3q$L6a$^{U(K1H440hF`H3=euP8QuagO>>V>j{hNO~B$}SD{y%T| z+a}w7|F&~>`~scX4th8K-D>eTzjpKA`*Y7N+Lv|agUIy!!%<7EyC3qo&aky?Ui{yj z`@swU7nvrxpL0udycUYrzpCq9%RTGE%1YP$VWZ0YtQSFz=}{|a>FmU;X& zIVw}~s}0oYF50K3zt%ni{gbI_i__;N?$pv2-O8l? z_iN48sp)M?_CJwn&U>N0HRYweNT|-Y@TeE-Lqc1=TwL(DVZz(}*A^E0Jx-ob7ysd1 z#?ds{o&Al^tqY`rYp>gOJ(Dh)wTh)aj?vEEAYkPimVXaRr&`bXXDqd%lk>*Zn_?#H zJVrskb&S3xGjB_}a`kMY<3D>r@3Ql0yYJX#tasM0?mM2$GcU(YXn$_~(|) z;oW7GUn_jCTixPj+52tpglAs^{PnrdRX<#2%lcBi(4e5EYQfzCWiekT>Fz4h{H%}v)I$w}(RwXeGUdfCk= zU#kROfp0Hwmwwn+xNhra-m;Yomvkp(-d}BfYT?}vtZhH1e{`{m%e1*$Imx4E6FWc4 zwx0U?eRYXz^7on5b^N$1{wlOe&*R+v#gBrgFg^SsY^?vvdFKmzO*h$7>tC7J@+3us zXRj9SvSXa8@W8a?*6+6rn~kon=1%6R(7N*}JY|F8uT`vtF-uk|uFHPk$r$E%hRHwv z(}GT+MKu==Wn4Hr$?(Oa6aU$lzIrL6G50`RopHWkvL^3@J+_lKO|EF&6>!bXcs=XO za?yi(C4>JL1ShdEoteQJ^7eMZ+>EuJF_Z1nGI#2%4e55;aVt*7Du404O;LwxGS@BH z7$n5!e&_H96|#cb0#sUdP_PNwY{?bGsD>PtSiIK{j~KOLK1jKD730r8n$)JT`Ue$G`moJpox_%!z88@*dM$ z7F)KY5k%Cv&-tA4NZZuu7tt6nasc6>1V z@9~vW#UpP%jQ)H0_AkR*Yfsm#`7O3hMJO?K$;4$}S7bWPKXFcNquCGhD-q85Z&X|5 zN)OFHW%xCdq2|Z8?z<9a_ii&g=#~8=@vCG+{R=bec%8>$ipLU9-aNPS&Hvr@+rMfy z+Bvd6e|tk(?7;)y_cJfA{kngN(Y@XOKL=GUKlK0dypX!?`4e12rQSSzf1dk)kNRu% zmf{ujBe~L#iyf}r^y?|_lW@j`hHowIdxvRS?VPsi@u&NG4c|@Fb5?({65e9Q%%)zu zJk2NmMt;_fU2}H_el#>Z@NfEhFZ<&CX5xQ%_+LtG@(*>m|KBa8e*3XHi9*Tm-AS_o ziZsRLpZ#6-@^QP-uiTf`FOSW6nwPttOWB;zS zQvR}M$O*Tjp$yp(%)$@Xux8A(xFb|I?a0T-pIfi>Ju+VPtZIEL+m4FGozucLMlZ4G zW_r{7{x`eumh#TquWzq6OO0Ol#`3drTH>Lr7jAz0=%vm3N^IH67wO6KnDUQTKb2m$ z(sC`=yJh}=mBe#;UfE6O^N2T0+T#6C`~1{t8)j|SjtY6ZuysP!yYFA7icebT85LIi zed8|aSkZ@0KTb8B`R88D{U!g}`zc$Zje>S`y6$-LrttkFv98TO&mTCtw(IY;oejQ? zHScZGoEL{@^X_7bdmiY#!ujj_Yj!Li8opoo_iX3CWp90B&j$IjZ=(Bb*II9C)Jja5 zn6)Ib?&6H{QvZJ@JNB=AT;jjtYNH~@%k{!8wl6t(FP#2vc2ED`twmEGy!MX2y<_UX ziVK&o2S@H-e0$O2164;lx^|mYT(0o0*{lBPL0JCUvhDl*4GvqrwTKf+vU~q@j@tCT zNwy!txeC7g7XH#dU(Mqp$KkEa+gj%Hi5}~il(*#etYymWx3+{tg;a^?Ww5P}^}Xh& zG5z-47a_BHopxa8(xboc3TB+l{CrH>{Z{UGUVo8grhfMy+P_(Ec7OZQ zg$%sMK1zozy|Dd`_R7~R#&I9stupn?x&G*8_=nq7e|B9qH@O*PE_qv}At2#E1H@2N|+BpCnW7RaBd;G>^o@_*m$ z)$f;WRxJ%Z_%ryGCi91R!I^qSrcpdPZ={gQ)Q4t)FgnXl=a-RiR&l8!e&63tbddZSzTP?Stf zm(ikv7BP|aY}w8?x_gr)i<9mpR&K7~eQ3M=s(;n&m3voyezUbfliBuL`m^IHahjWV zw$6RXeDvLNCz-1gtM_>pHUANu^4j>qG~Zo?t*8FQYaKr_*(Z7SJyD@~3wjqOGrjwE zP&zHY$h$7;g2veuwTCWq^16R}$YJWsuKNA?_e%Q@o=fkPEnIu`x!c@D+kVZ7d7K#U zH~$^GM{#=5_T+yDk44@LD)cJb6ZU8Ko1krVmu2p@zSwf*aT>dokzU@po^*tNe7f`Z4i@Wg0dadbtX)0#tGq#NtFUwFhf3kEZ+y3{v+sX+g|q0k=j5_lXY5)4TpPL;@q7!Bwi0XJ|`!`X>$}qNnqim~AOIA#7&%UGkXX*dh-c_)Z zV|L!{qCFvxH@<6$`Dirb*0j6d*F=R$-`sZXUg@vkIhm{eT`<|;onPnUaXt2AIgjtZ z&}Y7Xr>5p5HSYB*3RxVK__54Wq4tTV!HtzIl^q_|@ z3Nl4{tTR#`Mu&IYI(+_Si^azM(~mIvYLr}#bliS#>Zw!jJe-$uT{vj8;C#vVL*Ep- zOEmLE)+hY%W$;sam;YBZOD4hi!2Zf^(Z3V3E1xGvT@~|FnUU}y!&%S$@g&{)wTZlc zxj7P3S$m%R%uwkszQVihYvi7JAy?viZnb&U-u+&d`+W1`f@88V)0sY%?@aNXH-DyT zm14Z=&coXl-+aZpN9^nmP0QC0w!d_!)cMc$D@J$21F>%kOSZ-}e+rHZ*Y`BOaoV+W zlR)mq<`ReVR*8ejx zWZ5qHm&I#5+t-J0Iai#=TkhYptte)F+D*?YQP*g##?#zp^r$*q$6O~^h7Pqd?-qsazpG@@vF-Fk z7yncd{-bsrx8{|RfoA9)|!uN(ez;e(IsE+xtb?cMeA>i(_X zFZJ7;wtRW$dc67WnR=I6qg{I}XMb3b$}ywup2WOGH#rNJ3gxC;y48@Xa$!Fuu;r-s-s$DvyQe?+y!lu0mpZkSy!Fdc3i@W(G)O;auK#r=a#!t~ z2fa-8Z$3xW{w{y5ogQ^Z=Ii|Pm(=1)Uf+^yu{!hq>beyiWy|D_ynZgGI9=G{>w&^+ z@4r40vlDJ@_Fw9e@wxuz^T)4G>GPg&X!Kt7;o+=34@xc=vRtUvyd ze!D7Y9CJuqJ3;w_YAp|sI_uJBhts@f&x=pIBK2a)UH>b;o$qaQZNJbbX2ul5?DVbR zl~nU9&nh+s&rt5)TbdVCs`oB!TmPP+Ir*{dg`QXDjq?{dy!v&Kv3yDIS9RTA`B&8b zCT@u?*?Bs_Bu{Bx$usdad4jWMFNs&aYNTx~^k7wa#lNo(A>pf^fAKi15U@xyirrIs z?KzI{%BPFBC35?iI;~vy^XYWG&kGfn3oXBJ^TE`>JWVCrw7kP6U(;^~EnsVYa?&^d z%vvAGx~GMexjO8#vVQs=ixE$VC^}_)qyLiRvD&@oPqN8%2S%*_+O8c}y6)V)jQ@wP zZ+<;pOfF=jy=hgUtw1hY=<@zKmAlW+^pn1RQhBOV{|PDoiGdluVIM!H|JYer9yVu_ z?CJZ@=LNOyT7R82_HFQ{2SrgAOEk?_)VWHQ%zS10{r!V0`){oDIw<{yLGpWGPQ8r6 z^1}CJhAx4>t@RG*yX+2pxA|h?c}J(si+6ns3*72&Cy;;N>Ejz;Ma5dRj^%;d^cr)X zPhGJ>CZJ!l)PLWT^#MFfYh7cGy5HTvmeMPFXjb#Jg*&4os!|Rdsy(=hWy2)xO?hem zIm7eg{^riS@z8L_Y1XZ^FNN6iR;c^etSc1>TYrS@QSWp0MO*Km&t0PMmhEu?@8ol; zU!(V)X)0xOOsG?e^HpVjyfrdzL!ic)n=CC7xBJ9fuL~}k!uD=yK&zwIhzSS^?O9B=YJ_?7B~N~t?DPs zi&GWt=WM!TOzJw8Sp7UNl)J~sa>tstas{Tj$CvJqC`#V<^U7vRy_64HXYRb+d|5BQ zrs{U(=QjR$kJHyrTNr6OS7dMfduZn!nHtUe&8uXh<9=U1DD}oZpIvv|MEML8ktZp8 z1w-F+FyzJZ&2_IRPGfVjm(xf*#qw%4+i%lp+VeMMPu}VwVO*OvIV}Iu;}^>k&n}%C z=EIpCacN@ozgsw&G-JFwxB|()1>*pACnvDZ9eg4 zZ?p}rKZulW&o8LFs%^iaRMhzEynXh$t?@Ott5?XI9F?H8>^^+@ht}wVGy4gME&f7WK-O}?o{_MSXElwhJiFNyjznRKwcwcHqJj`?q zoj+0GWUWA6rNalc5QBLhLCtSNPpI}^Irj3eJ6C(l?ZT+erL2dt^*+r1pH%+)wdbKH zQ}^*?KXm@QgC+RHb(4yfvajD)oio4GUON9+j`BT$KQqss`gKUV;=Xs#<8bAN;z!f} z%>3tD=e^KjZmNXQ#&h{|xgstrWeT__<~Ck2{1gAf>Xh8%WjrrdtLW6l?40_1^TzAT zbB*%%UA@w9i(&1~xA|8$YyGf!W~})6ka1R}*|zUDw1bsj&6c^4s#7i2!Ra;2W82qD z?~69;EN)5uq+4sNtbXQSK%pt0`M>S^&RtgPGts_d{95YwOs>$S%M|k$r6zypS>_?h z$eyP<{ey4yPM_y#*MIGu6?o(0f~B@cr@p_Vz2nDEt^Gl1Q{^p~7o73ukZ9nz@b!$> z9=9J>S$oai-sf4!_ORPIbhCnbL2z09e#Bz zm-oRA_0{X_YU1QYw&^@5C^;6L^w%^p8G!&F)FB*3pF|XaoX<{JE|9iu77Xt|E8JC`b~B3>X*|j{_U4pQIMULU_-=?sJA z9d#?yckd00KgxWX=CtYOk@lcE-<4Wr``Kos{JXv5`ROX=_qvPO;{TodG$%Xk>FdjR z>k>_W3q)tytKVq4w}j__yxmKi0M43#mN=3B@q3sq&rjUjBq!Q=dYRkYFD0J2lD0F< zZ=4Le8T+gC(!4bV_4C(16snxCHhQxkH(&IDkiA*rIRdA4-{)AUJoifF8s%7-CB~Vr z^krtw*!}ohNZI@TzcLG^JMX;evvOO}q__>TPh&PqFMc00<8Z|`7Kiqy{SLpmPd$G3 zed&eZ#g4~SKK@qETH!9+Z#s2n${Y5#C$2v-Ic@#MZME~i=k<>FTi+cBm-XBl?)7S) z1q)xs`kD>fcIEInvA0gskuQH`a{Nn4kjTAzvx>AY1{U&i?Fb1C`_4bTypHRmeX;bt z2gi>ccPKE*s*I{!d0)KuSjE42Qj5wi=4PFGRBhm#(QU znwNBchxF4jsTB3d!{?lq_$|&anyBh|M-Uwe53z)2)}HSJ{{A*K>cg&FNcvSpG{-w)`8__ifs_)fH#M z1p`_N&E7Beouss~u~xc->CczR8CDEDzlx1tZMCXio%uEQfM2uM`-v}S^%p)%cKXiF z>hw|UvD^Y5z@T>5jjJp1Kz^lRN?c@m=t)W%SIvdk%sdAK<2$)1O6U%nkdzfYrRuO_|J*vjXQoGHWgQ_NS>=DCOzlB zTk?8a@jG`i*@OQ!%E+AvdbPPZy(K#<$8}MP_TRZvt?w?*dox}2rT?XG>&{*;|FVST zvi5Fa)x9&;ul^ew!v89fF`0Gt{q65JaX;a!yS}Mw{*TKFdra*NidBAH`8|Ed%8wSW z_QYmK&UzuZ^XaCg$&>k>J#8s4EdH8N|9(UDg^=b+A9EMi+h{pldArXhb4^_-cLZCe z$vTV1c@OjhJ||}1y!x$4f&XZcAXVq*`G(3)!!DMF;h(5w|yep=bpXHn`bA7-)fQZ*zzXs;5AduWoJF_ zKTh7!FYf5{>s{A``+HZuagGc&a=M||+IGl?@uIiDIn9k5Zrz!DtY*VI-eYo0)~TH5 z)+^t*pXK*gUzLN0PHy$QclC4hN&)sWahnvj^YdwIiRAcvu}itRQl;5q_o3gfT%}~^ zdw7|IzF#jKSrxatPxywWWZNESP=j+w;?E+Zv~Nj0 zNGn>@eEYe=!iCq4gkLJ2a_G*97n3G=&bZYf5tqNY*v%q3Qh{NH1NX*>sq3TE>fZ^? z@D%tW?6eg>v;3-(ZMVuCpSe*U^~oY-=O6KAcHP~@Qh$kK zuT{mC)1OPCc;j|_v1-(~HP!HzVtE3)F9*S~<${|w=-=Uqg1K6UxL$U^dmztH}+Uw`%+zZBTc&|9=Xtx_`a=Te~! z3)u|}>VjqCR<7IMdOqN8yv;ZNyEk7<&RZ+eynXj(tt!S}8|NtpCI&D5cU9t5FMH<( zSNn5bMW3FP`sXpz-9rvu-KJqQf&MMg{vG(oUF0u9>f3B21Tx7y|zbr&S(=7R2l*1>% z-2d+?4!$+`+4;jhZR+=w&5hHqR-fNmv+Jyb7K8rJ2*$lNa;KYWpS=>8%)Kn3YHxb{ z`MlGMKd{%7gspn6Fg-iN(y;68>Q9`eahqSPyjQ#PUV=?p^VI17b@IF4Za8EaO4H{#*kvRSZ8 z^ZmW@FHa>RKK!)Y{cZ6bM*A%%TV|i!?DHY?-1{lq+b{ey`y717KBfOATgh{ekoKNO z?E7CxC>!xk`FWUgmE(kZt2u|$ojiiHw;Y+(e{;u6cdNx0SLa@3e|_Qm?4t)fAK%?G zZ|}#PgYDHXQ-tmQORx9p(|EA2zH$59+&gu}Y4_BW>o-XjENyx4=k-HV$gRD=xa|3WtmA^8Yz$i|J{@x9L->&b_>M{_tzX z=*8a8de84@jFf$M%Dz;7iR23fy*E}C^ZV^tAN-tqNHQ|o;;B2YnB{tzS!Sl2md-L< zc=>gi>+chdPD;M4uQK-}ZcvSw-Lum!{Z8Jt^2Mb*+t)D84yn=)|JJX|D=P74?S;D9 z+;w@CHBA~t4A*()9&C=CFO?k8aIZGeJ?nnN;-5Zi<~eRX5K|>9Wo=jgf2-;b#zfuJ zWkev??&y@G28xUeF;~z-Y8|- zwCz_8tg5y1$};m=_hZ4gO-mmIJbuC`7yC*3##;NdiQDu!!#h6z|Fz?4%7leXt7_ht zeOB7a|Ne>n`OEc(Z#~hw{oU93$GP7c_Nx#273ps4+3xVD^~!u{)2N?H-xYUu&TA9t zY5vYNWBrF5#?5C7a(@@C+!s{u@&D}`W!5=7u@93~JOyVp9C$90<6LxIcU!&a zp{z^FGn4B#O5NLdF<9W5*CU&q`fS(46TUy=+s;>KoRl0}J#Sao3LD#U*DufBpSml4 zUe0QZ>DSyh`uzWr_Z?sJcgyjUkL2_D<(~FT73;5k9RG3UH;ps@%{Nb7Rd?d)^M9?& zKX+=@s}&hNn|OQQlvHNJ!1I1Oul=_>)=oNbf_G=`p8I=j-9E%wt!euH>{71nVoo-9 z(^j>cZu85$AM3w%KK>w@^|h(>o>jlDcRzb}B*x5Grs&kM)8&8omAena(s|8RBt$MioUb}6c7 zHwzyza;;YW)b=SZw=gtr=co6_CU1Q5Ur4}i&&m%=4Fw*)`SC3Goz#lOa=W*m_)_%s z(fgO%Pq6$mJ@0dC-j&_IEY-S_D%%q6W!bm3*?&B;ed`hVjbCoA<-5Q8?1>xsL1+JR zrM`dk@nN3Et?4hfU&wpCu#@EyvHfy({i^t^wD~33@)tdWHs7ulS2k7L zv+HTQ(HT{}^C2lq+jifXr2Ux7@cF@m)8<8I9Sffmv3UEb!^@AyIy`u~@b>d8Yj67$ z=5E!dxRmK@@(wN4dHzHAQ1^z4gj$DLO+^oKR|fh$F#IOmx-vrMPy8Kkzq87sJDgvB zmQ9`d#n?;f?5(A1>K){M-7{R~bvgEN!qir;bjitLva>W3+_`F-ZkxIZR4gm++!pit zhj5iWv-Ph6+bAXxfx_CZG9jz;(i0mF9jfQCpJT=>$*O!>ZNne?PLq$u5Ws33khkke`R6I*6^`5Lk*hb#QFWW!! z9-OzTkN5iID{oTY&YbmXZ|++@^F^G3*LIyz=HtG-)ObOqi$Lt{yEeRUJ=b^HJiZpR zX@2mUz7Cs+>!lf$tw+!0S$^LB{+IOS6IXc-Bp-gZ?zWNH@5|bkPpr#X=;Zc%;>D~= z&XY@a{I^P%Gq=^A-u97B`u))*gAUyWIZSiakl|?6dS5>=_<6)z8>b`PI!?>vd+5;^u87 z#WmTxXD`jVes$B;wf@JRM%`)Npx^f6`TF+R?}9$D%$dFGv$x`Pp-9uE&Ax%@_NO$@ z+2r-G>3;V+(cT_&!03E-ZN_P#Vwck~dx zqVq*@zV$g17Js>M`jJDr#)=FJzvLo|#Z7igK6B)@J>O$szUpMxnX;JutS&h{C+|M^ z8}L2uF{8KKNDtf%2Z9ioK;n$zD&_hNGiB)wZz$9>p62K>4ruH7tGXi z+pomg+*2#QY=Dppc`c>}x z@`!-yM~Ruwr+TlJ`)Zb&?^6$>ZNXdrUR24{@|=<0%(;c{l(FLa^)ERufBclM zvRrSw%#%&e7xwo{e|O2XNS67Y{ibw!W9Yf~>Ul?Y?>X7oTK-qL*3#+!X*GTCQ#Yd+ zkMeMC>?&7&bIRbC^7ZLgOg1buPK(z_czdupOzckbh5s*?zxpQfqb>Y!kiuj2IO#hZ zbvADayuIj`$HJ>=CbRxTE{-hs`>^Rl?q>b`Crpp`JN)7NS8N$=66qDGe)EL_uVJ9( z+Jj3E|Baacn(3mf_35s1-r2ez>L2X1R(=vArm43<^@ttg>xC_XIjRwd`OjsU?77%> z=k4V5uPW2(KRvDenzu`Y(SuvZ+fy!M_wt<$?+xGonVPxbhfH*uQQsTC(%bq$OlRV2rwiwM zO*$>58vQx$8mZm;_-;b|@s0mp9WeY8XQbh$YFWK~rbI>Y@BLPMIqzEZ(~m`;3VtB5 z;oG;%=|7s+?p9H{v2c^y?cO;L>@)nj;yr6*&h217r!d`Q*PD8c72%PLQ||pO)42WF zUS3ye>EfUh|4vApWjmHy>!ap({_;j|)BDn;Uat)9xp{9nZF%uh$j|Ff9}Bn~c($^- z_v6c(C3{~au8Nz@>Y-4xn~!txlJ|x;r(Rw8BrRfdP^x95>xu{6j~phIKKZ|CzJJLr zQH5o$0?{H*c_UxassMt-2&oW|Mj-Q@o8ymip}wQuXm42{?Oey{YIy)!c4H`>A zU+g>cYW4qg1KUy$!51G*vU_}1W?#@xbT(6Vjs=AFixF6Yj>KYdo`_G zd(mO~!LA&;6Mbp>yUVN?tXv&FhCb@zVl=&aGsxr{^EC~N%?AJ2G9J2JQhcyhvDdUY z{Nmo-3O2EJ!g~Z1uUQu_3duOJBxEL2?`jdRebFfjc3bN9&dqQOyb#?dYq)FGl=sy| zS@D1Ju3E4b6-sR^{$Tri{+Gu6wf}lowOE+yo#V)!pQh9~XWwn1B<}Rb^K^wWKFo{U zIjKZ;`LuN}@658WshNJmPVm4U^{}-jvTsgEx%&LIV6Ea?9~W8vZGFME+ksnqCs@6E za8s>&6Ho0Wz0G!seB4`i-d_ECHcxl3!sQc6w+zp3f9_Xz#iF{>EOr@_e&4B0Z{#XC zKYwPk7rAWPzE$-9$|;Wj<}_!^OZ5id)(~E+UvaUoyzxWvf{A|8rmx)fYrLlazZ8_+ zk#BY(M?!I$glXze)j8vDOig1-l@qh` zn!;d%Ip5DsiGSpoZhr8)=9aS|(W(zZ&*pC4diyi4@*!R2UupU}iIa=`r>9o%N!-l% z7<0?;kJOW1s|7x3jV3ofCb}-G;VTV4vY>4D^|gB86D@RBcH~?(oYZIX!nR-}I~E`??>u=6~bZH&eFV{^7oWBOBbSDt1Pn-yYi;_}pqM zU-wgHsV_DaJ5BpSy1%@0-qJ2<_2^ff`iYCed-Rjs91pgN^)9w=>ziZRyGLX0Kd0pm zQ$8IIwQT+J=G^h; z28z3Nk7cG>N~@n0O$^znB(!$VN5$C_7*6pXoqIa_k-^Rft{Y#72)>n(I=N%gv)q~& z*@qk+E5F`zw&BHohE&VbzIVTUTbR3nF=TBcSr?Wa{b=#~vf8qM0cUF!UmqlpCE{*J#x~^Ml9{ZX9>4nSE(b+qy z{ATG3y6fJOs@Y`8!4%tW(b1Y$v9rSC_L5h-c#eL3dB4o!iT%M!b;IKlW{dw7yzUU= zDEk}uU}C}SbqlU-SAKF?$M{h`i@8nw^oz5XYvkt&+ak7gAD4W4kj%Zg z!!Y*K)&rU;0{Kh#xvI6z);jiW-ny41_x2t95qNved=dZhfLZDKW+wf~o%=e(*79>21lV?EDIUzSW=X8*im<3)>h3C`I& z?VTP^J3Y0yT=T%{^EFko*^cm4X=%oWuBca)@_QL{WPRM_irp9YiLeXZF}`)?{gagY z#x43Eg{E71CVcgOK9f{JXQhY80M6zkTB86Q(uc3VL_-9t6g}I90XzL50`tmDb0C@2mRgtmTnD zqaHD3N2X`y@uxS=&sshI(E9~1UP|S2U%8ZCwd1f@={E^~5&5@nIWvDB{1U>Yt2n1L z_MzZLN9o!-KfTONvL^Fa&E3@;qn+RrIMw97_b0t6QD*TnM<#uWIg|XY)Kem#b?(Ej zbyE2rf1|F8zhqcGF*G<;J!$By+-Tpr}A8wxg zo4dJ5?r__ji7^uuSs(Oqyj?oy?i7wJ_bYpMm1Mg6XgoR@(S7ddHj%fF46c}*o4zjK z{dtF~b?5GZi^NRa0J>ZZ>QOAop5&ibX)dwJQC>%Z(@m_}8H28B#6 zmK4|S;C$mhW5){Fg-8C`|CklAHKotR`vFI?)mlx4tSn*UBBlp=uifJVuFZaB%Y5;1 z=QO7(V|9uDdzl!m)mvPa7U-+|pTA6L&FS;y3bFwgF7y_Ov`Y$XH%V>%zW1!fu8aHi494nDW_(!zwfTQ1-2Rh%=()fe zxk*2iy|=!4;C;Vt+3{-!8w2)vE$v@$cE+lUj5(hqOP0kx0{n`$%SfvN!qsxzFkvwIKupn){3Zir+3`k+BHvu zfkETFp~2mGU;nt@cd@ngfB0D_N6)D6-_x}H54Rlb|Ev1So~`lJ>%E0Dyr1lT@ulp^ z(vYC{TRyUjEU$caS~UL4vscAmolmcqbR~K!PUcA8HZG~rDqNk$sByrQYr5X7Pbw5wp_^e*&fAWQ2zSlKp${MFX{`kgu z{+ZoDm)>nR;`%USMh<83`$eXKEB4Iwez)4D%c3Dgy5ft^GO5+x4?nEfS^N3W(z||= zcHcL($^Cz-eCIgZuiW3QH$2XAX{v8vSHHixFml(^xe@g;&vJM?mMA^4`g?qxsnLtw zKWn~DoYv-J_{@J%%f%PZ?m3mL3n{pALi_(_!?1Vi%T}$u@m@`(Np0U1@%2+Yx6ZQe zxpe;E(%VxO&#{SUH}(0j;^XPVPjwQWA& z_}U>~u;Yc>>YYr!|9Wqkt-Txm>-~YbR(=nH?XFJwdhK-I$?AQP2a0W1SHF&__MRBY zQrg_yVGz9hkdD^6@FTLT4cso;a~!#G@xsL)D?UvU3p>W$d*jH#>z@<Sh)zvDtc z`I`Mrey2qv_VYbx63J{YSN`8*?_9pSI{W-KqZ_%(snSWfM;eX}>a$<2&(L|DEl3_oLtMYJJya_I8)XwRhw3OI8#EvUfKM=^GuDrCwu2;ZhiFg(7I1b>rTA2JUe%q zZDXz7)X!eYGR%@kIC9Ta-o1SM8UxuH;e-tt>>zwzf;8MGdC6lgwg zs(8c7+vM+s1tK^6H!tg4@p4P}qT3T&%~JSmZx$ZgH96yERLrt(Guz%>ewq|J@4=s= zS3TF>4~~3hs`P}T>uo2`&7j3wS64RQtGRyg>W6@b?f%Bfe9M^4yBN9Vo>-ivSbTir zp|%U>&WE<~UQ>U!VTIF~(8l|Y3O6^gzAh|(aHa46(z~qHPhE0<{0?h>Z#Fxn`ug(v zXPRbDyWA^J1}&|%U&$kt#r&3M`j*;C|Ce_+x3ZLRCb{|-h&wXRtD+lH!oSi!}f0F-ScTx6(0=f^TRDYbe_wk;YEN{H#U2wR& zea8p&DRWQg#d*FtJt;F{`(MMKQKk8N_k7jpe;eoW(`t?Awn)}FYwOnPC2cSIvZp|! zWP|Ciyy7pFmv=Az63S4V?qHvjXtBMsEOzN_*({q|y1Q~7i>%Q{%Jdwm7PUYBi;iCMmYH#3_Hwxj&i-#%rgOhC`tgUR{`}z^JGIWLM&(`F;~#e2se`TuM=b@oMgZLFXxFIU6U zr>`t*TC97bS1BJqeS2aZ&tLmF2RCOs{n&2#?|kRFGg+}GvO5}l+qf&{OihriPhYUe zb<;21P^S9J-=`N`ib_@Xdih>ex+~vonT7XJZUJY$n6# z`MDPlWG~L@>g-f+o%d~5+vjDUGdlIVWXrZH-(I@Zm?QUD!1d`f1UEqr&kg%0 zboO^p+5dgjs_91I)AS^deMs$6T3`1q_5TgMhm{HH|DJuF?iMJr`ciMI*4k(C4reC^ zoKO2Kp5+zrVI>RmvUB`bHJ)5Zw|tfJH>ont@1#z9xQ+SrOE-<~E!|x5^jy#H&mrBK z-wxMq-~Cc^Uz1hTft%+S`kb0P_kT~tz36f_9{K(Rr>Po@clVlg%wPHD-sT;LC(qT9 z{=1vGExr1DZ1lVDrB%O=A1PdGGileq$Olgz)_J~X=&I1qS~+b2&w+zW8#4YMyuACZ zu-AeKTBpxOyR_C+eh6{#xY*z(z`EpYO8290VMo7-39G4ee|@k_=!faz%{O1|zFAcE zYK8N4FNSwYdtN2;?p`FxYmwk`c1DJ`T86L7;g1PHI#JEvN{uA>#iqya=95@jYdBf> zpz@B;WcNoUUuI0~JDvOOy-TA)vtjYd>b9a11`7}WvUF9UB^6ACJF_<43VIu|<-p{M zRX&o7g0IcA<9~l|(me+qnnWYL%r$zKsJNTcjEPlD@>e4Nx+KyJ2mLA-o{!Vl9 zrDq@CcyBlR*7N8>`e$cuF(0iJ|JNV6oMl>DyRv@X0X4p3>NOP;a;!|}EoHLfW14U1 zVqDLc{coLhzrx?eD(v@uzYk_|xb$I`S9`Va?X#I4ukY+ry>a@{5{s2nP ze8@gNiL+x@CWWm!%;V*_{GiOr>*rg(JKJhJU$5jb`)R_C-P!Y%lg}+X zxnODDgMIDOSfp&v{@JVLW4Usl=>-(DP#OgFIlVzyuF z@L4x%ZC3l*lPRy)*2 zZr#4z($!AyRpU?ft!k_KuWok>EBdW+I72Dn)aImZy7>yyM`d2$tDF6*+H2yTrp;SJ zSBXekgx)V-q3U_?|9gew22TofnIHX56MnVgK>n^9xv#o!Rum*KUMY{8W+mfb&2D%n zD@?B5BaJI3N-u6t!?yiGXP^6Tes}fHl||}qippy3ruW@TMXvNoO?wb!p!0bt&rQp- z(vPin2QIR9Pe+vZhnzv_nebQaoGT@De1;Mn z-!*nB#2V(j5|vYPk2!iVX=9A_58;2#5j8K2Yxkc!-Lu~1Poct_EWh>;Q{`oKNsp7C zKM-HL^zqd7RhLbttBNm~=2fAz*0}r9^}TX?b_XTDKl{r4%sbvKdl(nlhR2E5FYM;> zd#`rO^sVx*-Ux?J3|Ibr>|4mY`1t1)b?th;-agTksIr>FV=(84@mcf7KhJU`DSpYV zIGxAUG-G+;%+nV?Nl%WJS|IkYj(mrRPiGmP!0 z$!)bSe%7Pp#amkG)ctkp-h_&c$x#QCfA9YLBh{lKwCeY?CD)e+Zu@RNnf>Xsqn$#* zUu=Ib6^wW0J;Q!!QR<4XHLTXsH%jy}>rdBe=Qe!&JM}>O=it6Mw*QMeaw|T}`MBy+ zU^{19?dNrziOvttp1ymrCFpFC`+AwjbNwF%JKvqKU}dZA41v}5jjE59Z^`uid1d*_ zh;N!d*PT0W`eMOGu3ch@B?tKoW>&7eV!h(3$g+UI-pIHe`qFw$-@ZthzB(szdP4Pdbhs1Zak{q`Rcmc?)kTul{1S=e`XC|3~YJJjdM(*U#6IFG@l46Ua@=Dl6OCDs4~6RRyRd>AfjZ>CVcE;y~)xARs*@3swrrT2dxKU;nDa*yo!^Y>mW@@7a~z7~?R_*ekJ?$*H@q0^t^t1^Gh$kKXc9@wZNYT-J(6WKKWMdCF`>|zh(NQ zy*u9um2JrT^)Yk(Yo(@N#YOepe->Z6Y|L_WduwT+c*Ci$->$wfySVyd>*f;|*ze3g z?6&c$xY41AFAOcxY1=ORbbssDmDpeuck}~uz~1}jXL9zvSX$(}Q~KE5UG}0kIh|$r zE_{B|`{jQB{Ip+xau%&;Sg-5vK3CoCpJ=Q`@`Ke_ndR zu6O1Yb0+VvIQLRx)$}&=M`@aDq6~i4taE#Vc&3})pe!C?(O-6{VDvLs~4+j zzi#@qVe$G;XP3%ve9>P0Z*Kgwy5d7~(;`3hZ@vAiNhc%d`T~J4=Ogp|clm`)n|5u_ zjMqX-s&g7v%P2j%@%8(j!<-E#=kI?lS35mblK;Y1!wKsXIclp`-~ao1?@fN8|DSJ9 zzxDoPsr{XRyDM#qqwY)!oaOoMRr|M%?o+><{U`YOsodqaGhH?rZhN&!xXf?Qqs-5y zrHSjkT>rn`vutkvzdLItE@qy*a@8*B75C3<+c)os-3@t`KXM*R&djh2;HhT+we9bM z{ep7JGc-e1=st`!nfyb~#>8N@`2&`kgZ*avwLkfEChcxe?~nYxV)@Hw7p&qB?!Gj~ zy!qX)lry(j9qiV+XDwgQ^Ts~!i2tOXZO?k7qvoAx)jp;3V}8a`i))2B|5$(T{-e$- zRmre${*iC-KM&6R(J^~bWWpBpl09#xe)rw9X|v*lKk574#U}M`YMlHgv(;MoweHOV zldfjAy^-e6CFhkUy}K!}|Fh4e#Wub&mgf2qipSqPtZg_bmz7Z?Q8ar=U$dRBW_(m? z$cfZH3y*5;{JJIDOZa-=c|4Nlwrd4bZ3)SF=%S*D9GY1rj{vq*pbbRp}y-a{w7zTLE+xZZPH`lI&Q|1B11 z=4&sTw&!O4J)b9cc063UOswtE+CL?y11D`ueER#vuGl~OBN?{da&lX8&T6aRvAb2V zQTv{sym6`2BU|g9@1YC+CqKGy{?WPH7Z8^8E=@J=;P(Y{e+1s1RrKE7s&KmRw)(}5 zd_C{YrU$iXJm8&_DbIL0yM58sa^(;O+5eU7^_%#oWF@9B-(_CsS9-JHR^5!pS*I2+ z`6GVh?~Qct?6ysN{%Tybnp+jBf3f56ZgaIMS#IIE@h4K^w!M_Tq&fFeXjRm=7IPDs z=PhQ<3T4Wly7n%gasSgJN47^?=X4!?V)jXW3_*N0x1>V1v#2!E65 zCekrIa*4+cW#6Bk+%GRqh?p?JH>S{zbD4p@inWczd#iJud-}XZmd-2Gv%7wMiufV> zAHF8Z4`%Zp64Mh3NZlXza6>x#w&HKW>%L4Z{l8fIQG%w?^;g%PwH%zGk+=L{#5R?3 zm!zGSmgmS%-y>^jrTNHE|9-sJ?PazxnwVk~&L^nDtl(k=yf#La&W#`rY&2V6?V-n%dut;5bNMwZt>;B;0JYmyN zVXkwhr{AqNc+G9`D#PEY(yF3%;i5XzsK@NGD-tGEeZJu&$b4SfL-o%~X71MfFE5^H zOflFjFR5(ryR^;k9qar1hlBb+B~nY#a`C9*PYYU@{Sh~90sdz*^?LcZt5Iy@D3wqMfGW}T&>z;vN1YUjhl z-d^d^J2ez!Wi}Oa`v@B@vfYp+_i59KcT6^C&!0LbSWz-j&sZ}-{Y#XSpC;SKbpo+` zR|@7u1|Jkus^7ZC!`N6pWr^~p-v_-eOw;Z#Ia^vH6vmr>QbJ|RN}Fi=tKV8=BAb@V z9n^VtwO+S1%uwa$o8L!*+<$b3d;K}Q^mg_lVY^Ac@=M#e*G8OA&)_tB>CC6Q#a)1T z;)0WRX4O=dtk1MIFqZ9V{2#mM#;J~2!*%Sx)TIwBTUqv4V@qO&?*R|*mk$;9+(>_L zQLg1{;r8@c%`FPgg?D@r7d?DGV%=~36$dU{v+Y`}@UP4Mt=ElW-TO7?@-p_ztaxaA zb+2x;=trN=)0z+EU)p*)-*V5LYdrIc4}S2Uxo6qZ_J7-Eq}l99)VQ?J=F*c3%e?0; zfBotBos-@jy3eB*uD<^Fcap>Q1iPfGs-IWLaf{0@&;6$9z|1{iqUg-8p7tf_f8E>7 zCK+$qVk`gZ!2uZ!)uNVSoBhd*#^z49pGEgL&ziR^o=kQNW@w&cGqv)$O?qG2v2eHF?Z1-qLuW?slU`nVPWz|AlcnyA_S5_)EO%I! zkT7R*-pr-K-tp$Mf7aB7GXLFEf6?9Qtnwu3vpy%UEs8N;aC%GAy-B72H?RqdZP~cn zOeU~YDC)b%k1g&8_q0xW{KRA3#f)unZDm`oUNby;^VXT4oa^+3YqH{QFup!B(VRP_ z)PY53uYqyFJhPqL(#{s!K1OnO%`uHXr61CNxG2lh1;h%K^4$>;9bK*1h4GRps=umA!#u z&WX~0tO=pF3&i)u966Ek#d-FjKMN+_|I?8Eo9&L&%a7A+uD|X5oWt2tZB=m6{%%j{ z0{86Bb9>vRq*ur)Z}@8#^~0=#W2XGu717Z``|3Dc@4c7rk&3A~998u<=;HqTYx!}3 z<@}>KE?Ju{^HAd z{NmE4jn8`}_r1BkagW}ri}yFp-1*K(!o{&k=FMc=e8-l{Eho1<=l{E3(By7*l!VPB zpIKI0Zx_9?j5qlev9(U@!<+RI1!_xPoyz%YuKL7FBmQPx{<|alCnP);vU3l`kQ4^ch)>j>%4SIM>jvk#LgmNnd?luTa2vVvb&sHvs;&b{Mr~2sajTPJIOWi zR#)E64&l|DUDjPQRu+D{$$Fvm%7txfLblZ0GnUs&yfHJ|ab| zKIl$5DlPppFZO$Fs2*vTvNUKrj01 zmn%hoe_E|fz4+WALV4xIYZE-r+=<@z@Fm+}w!5*)rgmw2T{PxePCV07y=UPCU9)YG z@6!Bs)VrI8oLXOWCnf7!uye<$va1<$%=d?iPgOQtyj{D${|C>r?OOV0IcJ}H70_68 zyh!=J!qaQUJyvE_i_>~0E`0Ya;2?K>(A9IS4<6ecU*yd#cyL~i#N~=8`>Aq1Q&VaJ z=3KOzdTI&#jQ1sb+?m#2IkVyS(}O7|r}Hhky3d(;_4}{Cr}34@iYyA6Iqm%JV_WPe zBrq>M%&053@7ca4@q-T}*1r$6Zo4gCRdRnz-oiEQZb43tr(cFXJo9jIZ=2$jX2DYr zZm#_=qJCLw#Z5Y6`KE73m;rDE9F@2q9EFn;Der*TdE_OC4* zEUH3fokeFd%PqvGs*^(vE418kFPxue-CQ{9Q4_f#6$wGoNhx>fe7k?%dYx+5sn9vc+wh z+|F!xd?NRC=-re1|DWmEl~i@7{Cf3muCxPL`#atRJghv}(${xv*1YP|Chc-xRzF_( z*lzE$6^W_+gM5wBo^;GYY# zx9nYfTQ*B%QplUMV?k&;I>aheEwOT&P)1Y)>2<=`>zOU|Mj*qb>GUf z_QGQ^?~QqJ`8LttY9(`3*wv-h*BuxBl*S_VV&i1%2d_$OXIUJvTP%0ixRSXe^K#X- zYs*%$vagsCv+`%4aD^A+9?Oaq(s^H-KdP3#X$^UHo$FonhQ_Gl&eIRh{So2)F8jl= z`Br!Kq!;(6$p3o3e0}=l=(l=1qJ-^@{<+%Ya znQl*a9Q-#k@`LF^H)mGcX;?Kay!WF65G`F#G$%ylg@!wg+L zW=1TlOxu`xpzEIfGa=tKd@k8#pDy`K3sIXeVb#HJ&W3ju6)j=mRO#RxSriL zemZAXZjF!bwaaBrdWRprzW-$UvxC)6y&Hc==jd@3Fk-?!m>5?w{w5wkn723K+ zGk;@XXtPRA`E+KnTUio^wbEi{dAemPy)K?}dqspnm))A*9e+Qnyo+#N{ncrMNpW(< zw8t;^YzR1|6&T}}p|3in$M8dIN6BPIuEOWv9JYM?RA}wRfA{?LjE~dY_UJb%2glrH za$6E(-m>?;RE|t+{=E~XSKcbAALV1KI(dk}EH?SKk7nvA*_`@Yzkgo5_jZ1Y=%E)E zayHMhN~)igvp?(etCF9Ga^2?LcCgvv*-`Ge-n8f$tN6imujHo+iMjt%YB+p<_k8No zJ^Ft7b(**163K`r6-Zzv6 zr5>6Yp*+6Ny)08}=A{cT?)Elxr$t8FMg*M)ZV*KTuaaOmxt%f2V0!~ zv3oh5Y6v{k%ejC(X;p~F$zQ!(PL|V8FqgJ*U$MD)^?Y(>`={GMPr~f7W-CU$-_AGP z&p}|#8w=(SCEL9p%?!y4)45a=XP_u!Ve0m8_66Pe`Pnls&hJZG{`lq99mS6R`WL^J ziiyp)?8$uKe93mT>~!Hx-d@qWK5H901UK$kbK=d%3ZE%?C(|Wb_)0z*1U~Aw-?U}o z(VTBt9@-zzznmcv@&RDs{RoLe}yVt6ZK0l)q{~KpYn+LTmDxEh~>cz_)e1{xc zG^I`K&zs(7o1QSYFVym{-)B9G+OWq5E#?&dG&ouIyl1`buIfKhHHEkSC!D%dzF@TwxxXw?i!I;-|128QFj)H!o8y05qT(MfIVez@vb^@~ zE}MX4Il&_mcXJ+(CC)>Kpb7 z*CrjD?IgV4j5UinS4ux>pQ&F;S4fgP%iA>*_ziXEcL^C(^xj`AJ+pAd-;ZkkxxMyp zRc1u*+>_Y#_PAEdeYrOw3(My)i3YZCDdRid7O7XOJDK6|C}uC zLAPG4-?R9X?XO4nq5Ai)^UOKDYr(;~ry8An5qmQv=TA-Q>Uvcb`hNS>wma{4y!U@n zb*S@>TB^T%hCt~yx3-tY(+=)-6`k@$;Wf{f?Xhe;x!gyOJuc@`xShUi>-k2%n7;y5 zZ(rZ-S=YBWcH^h?&5x_}m{NBnD4**2$)(gJ_%Lsdl6Mi)lIWG|mo#QXwQsI*USP57 z7N_Da(#zD`H+FyN&Tb^+^ory9P+LTOVoW=X`5_6XYIR(|GkUU zmN=KWUbcQGlPoVO`ln-B@FUfDmeA|lZ>`}EQE&fJI?&AP%RLU!&v_Fyg?s&GXGg zn3iq3(|GTy{O}vwey|8&kh) zVB0CP|K~n@JTz&?Mz_@xg-4S%igH#vHr!xszF~1hEAr>Gi*l>hMm!F(iz%~P7-kxJ zGxW}i+gI4i(gd|{P2E#@<3Va|?U$0aGl4m^WwHGkFVahQw{2!qy`sGHxFY-EgR|<4 zw||u@s60QtPRq|i>0$2S3WHx8FIm5R@xrs}$Z@GNPT#6(P8?bBFJkWDla=4@m>;SoeqtFHUtJi0oe%gAYvaCL?a`Eld zZVPoO>E$f)lN|1QPQN{MqWf1j0e!a>>1wY1{4)=iG&j9CE+u9y|{`|5vcUa^vEmPG#FTeT;uWU^ja@XWxx zHG;qTj+eI25+B2Q( zKFT%mneLo)jn!KWGK6=o|90daM_oDR#xI9V|K9Mr(X_8X^2(}5OV@9CY#G9I&d1e^ zbEng_Uo}y!d6JHd79ZQ?7QNnR5O*izgG!)?b@z}|Ar>9<;f5@qF})3SOcYoqYsddDqGAtp2=z@6Pp+HjA%K+#P)O{PeEkWm%~Uvp%N3 z`za-~sif@G-PM;5xpA9a=$s!0T~@ce zisjqrHJx{9PTuM8Eg8A;^JE3=`|p0-vE}Wm8@KJIwMxZ&-QDwyqlf=T#*$OE&*r}f zC@9--`_>)n`)k*pTo!M>e9p=gTggvW#+>1NIp5FAeS4bDxb&HLcB5T$q}GuiKV4xmWVcbUT*zy35mjxkWlvcrQ1+KEuLky?ueqQsd^fy)(~Wn!E4Y^qLvAl2M zzHsu+!aE!X`c&Rrx|HpCBIkb>PmhY*o`+jvrY$}unkD~o&GSbDk?BIf-t-hA+QhLTo#p};!# zKO1KMd3p9>x80q0Va1y28-6=Im-w^cOS*EI%CvjDrt=;PIcH8$O6Kt0^U7|upna6^ z^r~YW=C=}6^QTzupI|BT_SNP{jWUHxM{HZTqYZqkCK{^dst6fG?)Vg=wjttNr}flq zwhPaE_qJ&L^!=xOT%_Bmr8|Ln&-UNi>m1&`zTN!9EL8l=^?iBwDrK%NpC5Ad+Lexd zyKHx)1S@j7dGV-!*q?IQM({+kxxoV$*=1MW+VQUPFul36^RC0}Ep5Av;wPN-K6ohV zq2zgo`_Ah>-?}r)uiH@5v$yfE`?~hHe)Sl+X?d@{e<`T?8<(23OxU2kN^#oBsO7FJ zO{W{j-&C8n{MLuKHmC3Rm9NbU-}g23_u3tesfx9q)&BF&vrZHF|19eGU%iUoS5nwI zH5p@dtY-#&iaGss;_{#ie4OQywhIzwo%w0EFY@(juMYyh-@K3csrLH$uYevA8?G7W zUsmpT7iuaZpd@|o?y^U(lg|BCfBE;|&zDPYd*AI?KJ~OxMBD9Yo36%-o)6i6Q#fZ% z?J9|*OLMOGs;XXBm0QJJZ#}tp^X~GMul;$O<+Z(ws{5R_EexEtop}cTm-v}Qp|($d zmoPkEfA;R7Pq%AlSFQK*S#|XWyV|nI>4Bm`XGL!czS7QrWcSwoar)u!y_2mObyqaz z9pTgX5h%5P|K9a0z1=6M&a~6~mAC7X@rDz8{6?$qu9ybuJ^??kC>jrgy)tbWqHJ9-mV-ky5=)Wgc?&8HF%zs<=`%6k~J=*}Gp z>#2-lJv&Rg%$5~}sn1v0w0r57ib^3Dr}J-`g@Z4f-V5KOd8x*ABjXv~DT%$`XHHqM zaNC-RUGabHS3cz zhplS&0yW8tlNf5gt(PqpE^>VM$EA1OoN3dpP2dVT5_CCO_}Q?Kb??%R`X^n88hl%@5d2fYNJzLoA$bqS~|*E5!h_k6ni)vqJw zud0sjZ%JbM_0{Z@kWPGb*@?d@F?>1yl>)a|Jlj3xX8x1*I|jF2tWPd9wfaAMcIL0A z?|0w5w8pHeB-*m2|3iB*tKyd%8}-8zwuxVrt^O`*Q9I+~U8_I^Bj;gZB*_j@1b zWIWd1x#VW^*S{zI8p0R3wHz)GZ}`tTL$G+&%CCDPik27Y#wG46EQ}4FY&wre;$d;q zt$7-if=B=D(B1#{YTSg$Pfd*$RPVCOU(GIJ;rYS-cgD83+M0EN!7FEm2fW+!UHRaP z79)0pvu8iMJugWNJb1HmAM1yj-fMl%4s9C7(p9&b*R8GCpwM-$>$BUFHBlmmF9hFr z+|#k=;HeEqZB{b6+}==Wq7`9hyU5M)bidxMzuGN%e*MqG*w>2i+Cs>urzj`_5nktciM5QcOI)R38cQR*m zigcXS^J$gyZnw<6v$&bBm}wkxXFNLd{g-!=(t73$@42(Ar+B{c-Fx(ppYPuZ>ugVl z6m>3q|2p^hUYBUL{6&iu+U9<^c=7*po3Q=`rJ=r@JFh*yU#NF1b@hv)$`9}Kk|(zW zUjOMl>Gdu7%fa)%SXqnhHkCfFHO)CT*#Ew-^9I+{h)?wkOq=CZm~P&!P3k-J{FV0n ziT%qgZq>#9H0I1~boa?}zJD_9L)~;kosG_#x1Yb*^J+(8oUp}-gb!1q{~h>#(5ush zyCb2XC_QqW@>8zXUvGBa_IZ$}8(DFI)wI0R*0W2|`0Pc+ppDU5dv@8^+D&n8tz*8m z=+ci*0a1?<*4wB5nq_s|qO(^hrH^NKW9ihU>HFh@=U@9+_uH`K-;tWn?Dc+Ti~b8- zy`{7zJJ6B$W^X~myO8^ng1l@W3cVF+bxVn??`T_;$;$pkXQp?`9`jjd;XkJ*2rgN7 z?*BhNY58MvYcC)C$M!ws(}_urX_qo2(-$3F@w|L(n%Jf1_Zc>xar1qDHSyT;oY{Tf z=QipwE~z%2;}WlwUKjV?`@x-KpPviwnpgOF`@EXq%QY(`S$ki$_`O_wf6;e+z0m)1 zsyhOA+b+JAAbU1B`+-D3F!O)$h8t7%YFIB!%y5qu+)2S))HIuYhuboS{ z`q4z+dTsu>IWrvc>l5?0aI99del~4OL80yHQwyxSADRhEzu8gww_A0N?2Fq!a^K9F z@$A*U$vN|)s+d-Cl?Cyg4NmI`+4?xE$@u`AB%`$T@+#l=HnqhqW|5VB2iSwGH@f;i z)7w!ZYOqV;&?Eo%p5%;O4-v|0K8)-8><<$|vdnlJO8`|a-Wyf5pn+nP;%x!+!3@sStTjN>iT1=jf` zFuUA4$u6@?D|XT88V^;?Jsn+XFNE^1#@?_q%`ynn`5PkmV!O$nlV$CR#;!9DT@cDS zuvtm3_xj4FS6}|7-e~LGaNze=W?hfTVz%2(6y+Grs9w43*Unjs_oY9uFJ2@q9r5pv z&wu063)_Pd<6X8gEG%lh^Z#Yk3g!fnr{TQ`Iycn<^>19SnCrLGNjx>~boA=?MqW3H zb|@xVa720s{VJ(+DEhqTpBP7^Nv+ja-XCkXA9`un8~w1FRlDm##*xjB4C{4nS>HeF zF~9J`g0d<%J=U@*DZ8XL-u^WGCd=Or!_+Cjre_&VlVT{f#3f0%+UO>`>vSpF~W z?b?6e5B2e|J-aZgclwmJ49)pnraGCH+<&KUo%i47&&JvB{R~{~Oz+J$Hop1A+Vn%> zl0xfEYi#b+EuMaBqiJMZ4$I={61N0IoonN|-KAFtUOBW^!hKG_O_PQ`^|Gz!?_4zh z_S9M@c1DBGx3a&Rm-KyR{kr_*oT$rJpI!CO+_8A_^4`Ps0#l8qOs=&S^9+1{Y2q_k zwL7;SysWrAZNq_?2RgUz`YWXQUv-(+^}ic$zVh6@Ma@O)NrUV~r~UIax8Qr0$z?t$ui z;!{>XY@T-XZ&U9o7iM1vg^6=_L^*~nY<+k|_ht32jFOOCtEVB-Ysx-0U3z!o=-+kM zE2^|Q-YTrQWy+gwCm_94eFy7S$3(Ul>0Au^h5s!4@k#JN(~I31;S-w7+b`POynlV$ zaqGNIOP8PUJW=%Eb$z_$@A)^BC*G}D8h6+3V0Mi2vdoZso%i*(OEA^Hi!nUE@UQug zl+!K+al4RRQOJo|9A$-BPE>f2`<YZUXNH_IK|d<%(%OdwX|T zyM)cGB_BkNXrG%=$d=b-@7(kz3m1;2{BKF6B(DxW*^)FJTuWhX1?llEooMq1nVdFpB2PMEbje7%Ir zk?rX+*9|V^c^+ck*TwQN=&w8TbSvlQecXcfJ7q7$ihp2}dKK0`b#d?amPb7WOLjLJ zeK>#NRjSoLsU#_nbsWpHbH6FSGvj;|<)_A!W%d1-Xnc^DOh+D9(UoPhw2NaJ-6p-< zVUzehRdzmarSiGT#p`!+@Ups}HJ{t?;@sRzUq3DQ(^i&#e&b~4-I|7zo13SU9gTlv zD0QvZN21|&<SKy2)3C^9|SDg{=vUtvSo9z0WS+I@#afKp`Ko7VY{oKUhl}| z)w?emsZ_W==I0XF_A=>i_1uYnXD{5kdT+m9)>`wt^4RT%cNA!!ySF?}`t|dgP_g&# zS9RTpi2W&hK}Ip%!c4?k>MycV~X!r0cpnnY=^a==v_; z*t zR@N7$#C9ioEP4Hu|HWceUK^R^IZF;MdT{q5+xL*_mgncs?>ye*^G4i7a`6=Fv$E}p z$JTAv)NcmEXUpLYI>hE>dhtp-Z;5P<(35BMbWu^T>GNe+cShVyQ?IL z8gdtv9f~%;R+vy-Ve=jo`agkr?z7ylg}Kj6tW#g_e{FK%NL`4$ z)Ur08~$PPU7C*=`+Q_v26sL-U6Eo#%@yqy(1tPiv7s z;9P7|(~zpHKI8J#>xD^YUIZ?i-?iy<)4%(Vs{XHQ@HnTv%PyMtb@jG{?bhYN=^K8O z+C1`Y6#F(QKH4endhNBXvN%`YB!+CMoFSZ$m3c*T;}Pn{z(_nV!! znlOEN>?4gUD_6)H?8z5QUL4VCpQJa>=dBs5Z|{lO%UfrzT(&1$^7w>w*?aPTLo6&R zZvX$yA@=A<=A^=(?|7yeYVEzRFM4s_ZfnIoAx8E~K6o1Tl<)kb#gSRKJ-bo*?xT}6 zg}${aElg8p>wed~`iK9?8v*+V^Noz+ukdx>Yt=H{RJZKr0Vg@V(=m2Z-kP?&wcDS_ zNnMfm-)3aCW5=Xa`Bh))cI#c)l(Ee7Rb$Qn*Di0W)RR5AEfOSncWe%|TNqmwxVKRA zi~mpg8W&Ivy$s;ryoT(D=Z;HS)$3OnKylK1t*?KWDm+-;&( zpXQg+l9*5Gb3TnoS@ojc{on!n8wc;tI@;8B zT=4h9Gb^S%IVXLLS=f5B@?mqY9U-A}Uj92HZx)wWZ~peJQ{j1O`{{b7x7IjTAM!5v zxLtMnsk5H>>jj+NUjD{#!+zb9to6r3w=X^W^L@7QrnkYJ`Ez{}ea~Fz1R5Ee&lOI`<2P_AO74I{J&A=QPx!*N4WQeB&1G}TFugnVA6?bVxUE$I41%4maHAt)# z=8*qabozgO<8HlozE50g`=%W4yLL3f;Xu?>7KR93^X_ibLz}HbSbp(Ky3flne0P3} z(uFU(_pk3;J=MJa_n#H(OOIDxw=Lcy@u#Nda>tn$7adl=vcG=M?5ydz4DoqW`p$E= z8=3`HAKm>l`m*Wz4y%Kk?JDgjf8Lg)<$P?}Coi2VD%%BD+zU(icjPf!?&7S{zLLjo zuJSwn{@J`j=*GjM=i7eO?Dm}UeYV9%W2M5mvv(>TdOFYLM@dyixUtKJB`XRidVB9* zRyHwe*Di0iV6jyfLvewZ6i6!hh#~HLo7U#pH&s-^=E=O5pRnl&wf1b4Shm^$w9wy5rMlaUO+Pc^$HSBcjP?#~P(`sgIpxti4W$Wdn z`^#jDn=Z0H(F^XA^8c${Tje>W#93)U*3sSHHVN(fGxLknw$zlkNfHZMSr5b|rLXdp zef0LN)}rb0TlaI#w&iAtlb&0Z!76#-k?V&WpKiIh*6r~6hKyV91H1zjcz3M6 zs36hz?PE**O2f?Qsxsy-3)CFu%ylWaeD3q1E5;|R?{)5ZSNhE|MsQWRuaC6P{xz)U zr+$-D+f}(fP5KR!p;E%c4=XPQe6dvjx8Lj6LDk??@dN+tnGx*JYC{JmGqV?BGl&a2S-+XL;JRjSo8Ol&gvL-Th&d9pnuvD(&ZeSrI9wdMMo z7Hil%D5}2s{@Q!1D$CGSkDV_o)>X-SOnklCaJr@1p-F4LaBnsKy4~ndWSOz6yT&K| z=6>Fn4rOdSdzs_2CUkF%y`-?@l5$dKYGp^*kHtHEZBo3Vh4;Rb6JLCvb&vDiTRP=; z-_DXTyprFUACecaG3aypmyJDH?Na&se?}Ch{ytaIY!+v-dXlOnrV%gvjA)|Y-O z<)0ykSmW7W&s>q0`$W6J^HR{OM616cPvds(bh4V{5m)_!bAK1F7XMPUg-(YKSX_x) z)1-AU^_WNboZzmHP40?04|6p4URro|%V(=I?*8>E6Yu};(LVVi^5))Dy&rFxejL28 zHezDd7om?zRspP6Of(-#v**0Le>75WuKLFKBxR=d>UmnNQk60uuw+Vf)#(_;O%rS1H}9;|Tl%gMV(bvExQ-TdLkvtRn_pF~|!dF&sz z{F)?hln$?VNc&TM``b}H+l01FO=va}UY&1l`v20&_xGh{YF?FLF3p-@Dbe;;l()rr z-;3+PPLnR*V|Ljvf67h4RkPk_Z|>qg`FIb9zpd8#B~fzwrj(tYzb|FE{Q;}GdnXqC zTI_S7X`#iE|4skuUH(Qlrv}bAaQo9rb+vyg|CfK6Q!9Mr{kcg8*GpYfdvau@@5Rg_ z#lz>HaqZD|zMr{K@?>eMd0VcT&!=^_j?DVB`e2>)(ZfkUl@lEI&0$hrJuPU@@4XXT z%FT0cZcw{!rrWP+W5~`vSC^%4lXwod&s)uQKlan77yJxdz>(mxPSwULvi;*(rk#5x zuLxLgqP2`8QpW7Q?6Gq*R4%cuWie{w{x#SyXie^h21fGL??94)>Q6Y=Y2;1PQ}+98_PqF9@r~; zqxbW?R}qg=pD~Fqk``ODSWwPgQ0>N_#8jJ0A`EpKmVJMhs(0fzd%~5Ff1kYz&aQYO z^T{yVW=++R<6Dj@o5roulsj@KGIRR62eXbaHah-siP6k@+NCCTxM=!q%PpNd*(R|4 z*ZM3RS{GSZHRaOTyx8-~^CuTA+Svc#PyV$>W?R|5o{-rcDSY_Ejz3e%9}07?I%Amo z{_5FRuMaLOGF!9#rk$1S(-#~sz2`mj$7j5YR$uoQ z&*GSW;$T3}o}2e`yUkRe&U>NtI_^^G=Yn5aUZ-`0dlmS7`lR#rZo4w~@7=o9@4P%F z{yn+k$}Ri5cit_NjCr<;@5tT0iLq%nnUkxMf)?v2Y-Zi1z&r77xAabZg)?jye-(F6 zl6d;|oHN(TS5o~G{a-cz%zFBdIq2yv2X=?t%y`X6^^i|_w?emWV7_K+`(S?_^TTcB z_S3^F1!vXGQZ1f+&d#&8k+Y}dOMHdjH=79>0ayD3%w$i_%M>|sy_G*gDcgL%@3qS6 z^Dp}s7IkGyn--OO?%i-Y^V6h|s}hFhTTk!fEt&K*#Ygjx^n}0J?;jt$_k!EXfA*KE zJ9}Q3GaTUf9A0EJWqQ$TYs+i%0G+09w27EN`Twey)mGspbJjt8H(98_I#dDdb6 z%`Y4RU7v|}e^}`e{_?ruNrxpJ4}a*HOU>B$J@aFjk-7ajliE4^#9F1^YLvLl_R`3B z{^sPIXMTLmVattN*h+_~B*bt7dSp6h0O z;`X!HVijl@BDVI3-ib|hysqW-*J8E!mbtQ5Uf5MH{&}z4WcF7(4nLi0^FvU@H&!85 zWyg-Czc~$T|($ns;= zc;wWd68GkgWYL*&KJn-0hfORy9W)NwUY&fi^~b|&Q!FPspPXn^7|ivf-9|D~tNmNQ zFGpm-=b!B}O6Eo#yj?j@cX5lykNJvur}t*gFSU)?^jhKg+rzWVb}rQsR9)V=nZ04b z)Q8a<3cOxENd2%u-!#kVGn>Jo&iT9{CY4uqTw8i*|NMpev-sAn(DInRWbfq7^Q9*4 zlbfNx_u})iHwjFqvnm$u6xeuMi|x<OvB&j% z{c|F}>3n6`o&W9)XHMm<3z70!rah)hLO7K7zxL++Ei?T~(cBH6^y^|o=7b?zu#b&+!d}B z*0s(#J9)Kd3Az1S$Fd^dYHFSAPZ!grJ3C~z*LECdJyTqMJ$b`jy&vK?&SrBjdUN>6 z8a>{x+hw=EdEQ<$CniF_a?!PrM`vEnux?s^v&d`3{-+kj@=izBJS^H={AiJbEx+K= zxh&gvOP{(a^`$A~O1$B5iTjLRWx?u8a$hXxt+<+SBvtUgeE%ZTLq_6HXDr_9to7Qomwqvp2iYedVqdLNX!ZV#_v|(?AH{q5y<(^4OPBr+)^=R;x=eUa?ffO% z?u2n{Y2N;`OG3Y7KHnq$+d22nw{Z#E?F+gpxUh7;Y~uw#mYE%;%@c%oHqBn<@a3}4 zruX{W1WL0Us@JZLN&c_Kdvd?dqO)(F&Z(bZwUXOyOJujg%MD=<)@^e2KI#71=EIGx z6%F?S4_3--^SYzW^g&TuZ`$Rkss#NvaS}f-glO()E%wSXJk(|!^{C(ZRKDj~%|91- zpYF;N2`T6IU18(fF(uew0Uuw3-a9w5KEB_%_FHS@$*BSB7iN5Ac+oc5fSYemmhr9$OflOEoYFm~tlH>0 z|J@ujhWhOeaYX_~lhmu99AHmuPh>W_HN&k~cq1!=$)pwXtM@Irx~c4^+Hsk~vO=6c z^m}jfTe~wBsu#<7wp?DkY3Z)BqN^m#4|G^~CPq36E3FV+@xw3nmr0TYM`&@dR{g#6 z=R%x#Jg%Kj__?6u^3%M>Tcn;$?_L_+8k+lSO2mR6H>U~T`N#e5adT2^+MkMm8IL(~ z`=uA2TB<3$bL;Ir6K*iQd1G6Uy20`|OS6bkU%XhZAehehHkF5a<(A=+WYt zBXv@=rkgEZI_XXF^&P*{<@Wm@D)YADo~OR5#Pdw!3X9#}m!7g%-1Rhg{zLwP1slA% zy-f5>0`nu@-%9>;JIuKBsL7V)|5tciP7CFD{#)hxtkR>tUPYgM#CM9kyqeyayDIY* zkKByyT<`CRN-^c;f4?0UdT7PDR*MxkuU843dU>na^s4B8Ypyrbjjdk%dl@||Io#Ul z8GrKp_tsCAMON;7b5b#MO5f(b8PNse8Q952siZ|IuUr1R5l?%m6MN-ggL zv+Ar1lXy=E?<+4?at_KgZ)AMqV`4A#pXpQc$7j#ZXt=i7SIW06D~$h9pq{@<;ZKI8 zl)y7i`(Gs|m#x(7d;Rjrw}2j7rtySu1tTRK)MB;>oH|e*fhDU%oBBS-D=F z*d`{XbFX1W!y7Z@lIJho>$da?o?}*Y^#9)c^R0!1FZb?0<=qS-`*fFmGN{nwQ>xD2 zqo-v5dCKA|1ujo!d_MerKktr;4Eu7Am=8AZ>rU4x&a7Us?7_<~_RsTYPkZUI#pL9! z`7GVXy!Pb(s7m>hUw-z|Hh*!coch33r*B$&$4gaTHJ`>2ayXz#EOS|9y}{iLn>KFJ zpYV2q;0(njZIi!z-yX!{Y%e*_jN`_)ek28?Nlwi zury-9zAfD>KXRw47JfHy4;~jP`SWQYD;R-ni1_{w=TnP6l@$&ib{~ z;Zwscg}e_cHzY53XY{A5ys+DQh1X<3x0Y58LzvM^6{jQ9cQ|L1nH9LVO%Po=VSc&7 zsx22+?Qz}ze_HeAEB~h+_j@z<%JnUh=eyjNGBC#^hQ3;J*r7pw;%$CA{n#?@Z&6um zo#UQg%I02QbD$>OzD!bMN$0{%(V;sgE>Akz^U|Y0?ZKCe2co-Ld>D3B8%|`MeXXdt z!%p@5TXFk^_qkH$vj4g-eaiOQ1^MOqS<5^cA6@*%WO%~Q#OcfwyD8GuT5rr%Vwh?J ztu}wg+PjOe#xC-f(u(=DYYmUvj`Vb~!~0LOx_E6) zE@b=gEj(l<3F&JUA#)L4)FcK&y7jdt2XnQ8a=X53@E@&4phS8J}#i_~@>6;u{d zKTxOiNpHRAmr1)9UpfAC+Wy6Mn#S`ru631ph6Vt4sO7w-(1yUxl&UoLy^89auZrM{-*87pTPnZ4R z*x0Q6D|ppAohd!X4%H_upYtyQrc?^Ia-~?TRHjQhQ>;&fb(0 zD7Lc_u53|Me78k`S@tS_=ME5Z(Ltx62ld-FwiY}UT5}-a z-#g{|@7GP26^^-gx7)1h!f*fcM^^l~{Oi-7OQ-McKmJ0;y~r}IQ)u;n!-^HY8@sGN zPVi<5v9?xz(mR1AZ-bdap39lT=NCp@S-$_Bh`+e%Jrzl~=hP33mb0C{ zIK<(j%lCU1j=hhIRi5Z|c4K9epTv4&|IhpOZ{F|mJXpKd{ylri*~BH!6aymeUcFXv za`C40jG1eNG_GE>+I@H~vr?S1&~~Mz&EmqzekT-Hz5CC{l_tEu#H!}fgValxGQ=+P zH_VDO+`eSu^C{QVPR~0fT-PM$Gf6p#llw>TbG>z2<(%fuNU7Vow1lBx%3bT57xqpz zYWllBk|Bt9W>!|#^xyYSvdXZ%yZHNneqPfT(}UBOXqL-puH`zsehKsb?)f78H>@Kc zr_S2Fo6Ds)%~gJr|Mcot?<^P zuWMv3b__k(mH78$sk6}2?{(96n^nd$*{EKqb}ti~VjFzL(Cb|o%YMt}qFYi6CjO1O zV;7s#rI+U4>2~)t`#e6Az$)=l<9}+iX1ZRgPUlkjFXte5G>@SyESV{T-@(l!c!B-> z1&{x`o{MKVdNud$qJjw*I9aS%uDdaF9=t2XJ#PW$yLazQ|YVaMP%WtsZXd#`Bg zUY-!Ui!s)qLjT`JKXsea&rjQZFR=B=VqARv=PeQ2k29anv~BO3(ASpN;@kUnrtjJ- zdEXxX>RiWdRQKUy2m^ohyP~BB_nkfY`po6Y|FRcbJMw4ocWe^L%SvAHV`pAlF!O{b z4h;I~6CUyfY%F1au)xGd*Jj%aJM+8Re959lLCfy0d^nS@*+d}b+t!%Nfd@3EzOl~S z#~%4=-*v6UhvZs*7p~;u-jlt__MPV8f9X@Nyng3kTBV_3Sh(<5%qOAeRq16(rK#y3 zTc$4ytNT1LMZ9yH;hVf&?eBic%`2KN{L=2>qm#KBjh0h<|N8Bi@mgfIM%W5{^Yho3 zq)vP~dCjeIfo5QM&>y*D*GuZ1?!|437Qe6i(NQ;hXZu3U#`r6zE!HH@Z$1&$5>f4W zsUUs%qKs@)8I>9BUrT$h`A;f%9em(+K)!r_*ykOwQ*Yfeuv1{*{&%{c-AJKj*^e)# zd`fC&Rr}o%l%Acvo}$v^>}%oVqq8zn>A>_;S4%{ia^u9M44E~U7~Sy=#tT#stqw7 ziOmsVw;6s}3v{Zt4Y&y47Y6^=>V6)jrkV%y+=% zDXS3U63*LC#X0^SYroJ~RLZoaKep)A+kn^RZjL)EwO(!8_3eUNhO`gQ!pZwTPd#E2 zTH(obYpsp#`qDo~CRf~M`Ef7y=cesUW)-zRIP**#GxwcU(fA!BW?<>Sr1GmkXKqZ; zG;0-e`-WHFw7*s698-Ol?tZ9XM`_TkiQ9j#UZU_v!{pjM1G$df`t80l=bz57t9lxx z^etcHX#BvTfe7&W@6q=R4b=Zn<>;S8X`g!QNgDhN7pXHT@;7iJy*i zeAw_#uk!i7b79`hyEdJ@?0fm|w%?`Y2PQ;6+8kV9-Tqy5jaiJygSJZtqPFHv^WUi= z6n!(nIhl8Rx8<=P&hNH-*zWZ*R)=r*@mb9C@@B|Ak=t`ed~r#gc}M&IPq+6*A2!Z? zwfFX-pOY>-2FiW^?NoYd%aS>_9vXeWaJt;s{-f-l33EJ)lk?|Q@C4QJ=G(c(T>P@T zE3Dpsne(5z;$N@66nygvGfL!=V6-r1=&<}3V7ud8@utN;ayPSw&sO`Kwp8W9yV@11 zsxPy@wi;ZxzG}*=&Rjrrlv8a%TAVm(e)=6=#-Iv`N2`lC7=5TxO>i_MSFSzq!ehcTC z3+0|0SNYEWa<lcS6LKY!iA z_kiKvj>|8W_5M<8j`rG{QKI3Uop*Mj!rN_c#lmX8$?XcUDz(yaZ#sMQ`m2b}^JV?E ze7T<)=Y83KDuFr2QMy37j%Vr-+njkU^=I;ZIgeIezq|Q4!?aJ&N>;29|NUs~=_N}; zz8|c9d*8V*b1{=#-sB^P z#MzwS6I7?ne#g6T@5`3Mw`IO6S*+2{`y9GjQONJgGP}4+yBT^~8{|8Rz8;Y{V6uBd zgLRbE*Bb{cPR`ReP`hECWG;I0LS>S+Z1t_v75nS=rrQbbu062v=aHma@|$XP#J+A^ zSt7Ce@2>~uj?2r+uVlacyv3ofwWYSN`xukj;+?;yN(2WN`px`%>3z}zfAgIa^{28V zoWENqKeP1WA`NA^_iq<<9ow~S+Vx+%+7)zuWv_FUUctX8IPc~bN%wmR;%zl+wH>qczYuDW;fa#7KjeoMdn^)`Jv_sfiLeXq|=PfMIGa?!Qg zXZcPOZpm4U+a`WGT5jdD_FKUEDQcfs7oGq2%#~qn)z3%Ck2kI_XWpsy*YMiqyNRtA z^KaeyP<&L7Q|&rKS#P!#3s2sw-5J|675{V_ow&Z>aK$z6izOCi9<3>}=1;%Qci>gt zF;UT#)5N`{kGW2G@b2`{fIF-*&sDTeTwOHvLaA6uOUUtV)*XqL8NO|guJ^S(R?Nf1 zrW5snDgKoC-=CK*oYFBkyQ5jmF2(q`s&CWo>zhPPd`c~sKcA+)CZ@Cb`W&^DI<0lD z`q(`mvu@h()+=stk%Z5NciV;Hd=FK6dkMCc2H50$(97A*v$NIX-^59>E3F?_B<^}< ztDnd};d|(t&N98dl788bv4~*7+K%#;{K_roCHS zS`;9+LGzmYREf>ApQY*a_&r#(5H3P%oxZO<;>zU%RPp9t5nH!rh)WbDYW zR}J;MZDqE6qky_@bghNg!v>Fr?oHn_UD^F=_ON_4w_+$cV9CQ_E5PZb9y6DZAwELj zqC(=u(nHM`;+qdoh$X-Z7Sc@tk`mOI6?hoK-gai`U^X)dJ- z7IWDS*{03Tud;i>T6Cl5=ZB1~svo`9AG+Fq=*1`1`A3=8E;qktG-qAwt`C~$-y|+% z&heQ)XJNi*T-SljX9DjQ%sc^V4(hYj^6bAK&?~q+aPk z0Sj~3hUsMyw>GF+aQsm2-lx0nSGbTY3){hk{F4@~mhj%#`0~n&J8pt|Ca-Dlk6&eP z%6ncbp5ZRr=1t#jm%lkbW#2*X^W56!3pd?R$a!$;@kZP1y-USgo8C&D&?=r-)aCqn zQeG$DACGp+{dY`7Ga0shH41oW=KDq@s^jmyEhknn9KP~x;+=*2UQEh3R&rk;oG)UY z>+PnR=&H2iF@4kR`1dI6it7-0R=9TcxdQ1^3KzWg?UpUfKGxH79=QSpVjoJofnpEPUq>MthZyDPT6 z*qgbqH!)-O@_W6dZ$7kGt)93)@WZ$0Mm~M}h$XzH+nK+)?`>GM*zWxYt|paABkk6y z@Ao=B5Bl{gJ7fE$8G#MHr-BcBUa?>{@2Tb2uPv1N&qdzcqha&X_nN!D2J)l`-U(CwS^MDJ zuRV8`9sc;u-IQ}pNbN_~_wkIr*0&Qsn8i2xnm&v&D)$V0b~iPk$!ETp+`p;!`QrQ+ zi~ZJ~5U0Yi$$G_&?RjUaixggIWK6%5QTP2wzMkpjoJY-!MsvEnek*1Rt(xn0g6(5}7vbViq^f0)p(%FMmLzL_4I(*Hzobwux;b77^o?H%UR^SkIQK4IVb|UA1k`=q;=JYWukRUi{~VbiBk!x@fBoT(>#pH?4GG#o zJGs}pCFyVIYt&IVHIZXZ&_As&Iil}QUYLH=M3(cp<7w|tRVpHfrQF0X-Q;?-)aL7^ zHwoNb|0n!?Gxg7vj}OaaUR(CWCz&>LY-Z1_6KJjrk*~RuZEG^y>=o~!_g{Lwoz-?! z#om8?l#l&}@8hqw*=H-m{WC8J9zK_$w(a*4-9oJecB}fuL-*cdblM^k!|A-~oI|7r zD?@y7Y~q^(vliX|u)e4C@QxOZxP=?HC!O8A=Zf_$$JMK~9!p=GV81Coc5_%!wA1gU z-x*KyWEY-YX6mvzbFo~Xz{`cAPZmu2afw~}@|*TlmfLKLiqF2g+`anSrquV0rf18IjXu$wOa*z}o97>9vb<6DaFK*nZF9_>`!n;Z@7%EM zTe4#Pvi?1?jT`?&oV_~fn$%9`9m*^J^8L9K_4(o31Cd@^UkT4xcH!QV%kRPzx_8c5 z$GE%e|BD%|FEX;O>g=#tv*TaKV!wkYtY13o>$>ub$4iIrZcnWiRZN)`r&oSpn!w#v zolBVyN=Nm?f694Q`qEoDBj{K3@jV+Z^39(1>e3VQ?iu1oPTcH$@XpD?PBc4OEX(`B zuY{^{(+O=;RsV53oKe1drsRe%zcS}95d8NryW2&=?)uK@j&n{m^00bbx--}D2TN+j z3E#OFMAzJv3fix!ardp^9P^2P_a0>LzSFwJK5*CeZ_7-1UfQm`s9w8ybLqh=D;(xj zPIdLtPjTr`?9fry!79zC)!lK2`SP3b5Xpy__^c!*lO02SE>m&@``<>i*|hE+8ynyu4HqC zXUYGpw(UgV{OQM%{@*?I`2}CYlggD_I2+0)%G`DS8GcEF{qXv* z(*XjG=8;yf4O+@QI!?`g&!oVnALngxUpnr(+Yb@9LXRcA$G3W~zyFr?j_y+CH+egn z-`{KG*S#E2ps;i;!`*Wmc5!yy$;zMF=oOX4_{S^6B>%b%qm#Ddp{qTCA|(xF=hoNG z>ke3bY5E?{Z|#?V>PMcj?b*?_W$r=os5wP@litdTW)(MVe66zOulSTl(Z`cMF8HW= zH|fIM`_r{Q&J@^eDp0_tyk*uuuUKc1`g85i_Olr6-e<+{kRsnWv+!@cQex%08rw^YgPRRS z!|pz34fU@Qum}+I3vf7=;j6R9>2`W-Y*qM1rpVk!6ZIYC z@spklzQ`*`b-AH)M)}I?i?TcZ${sJ#pBg9Zw>A9MvmKYDQ?swkjg}gR=*(0)~GO6XS^OD0>RfS)-R9@qL zmdxiP{YXaSvZ=szGoFami?$qT5i~j7eW3Gw)C|6w$fQ-7>w9mWW;)HFFfG=^JJ~`c4*i+ztJb)xGTzh^xJ_q-r01Z%5WHu!#LKb#L*#oK!>4*AL29`g~6^T=+X#PH#7VdwKnp|4$S%6hjV) z#x68^Cda{$}cY0_DU4&_>k(jWJ{#)7d_=u2Ky)2Djc#g zsd%}}PqX@!QDgZ%joDjEWEox@e|NBAx1+`7I8DuX1JzS!wPPor{NiA-{3`FgBfJ&C zXSh=?-!u}r`ZrML)LDhVt6t89WgME_o-%U|+Z?rd>Z;LxR!W8;FkQSQ~(YmkZ*`odpSseFQrq0qVah-YUzi_Iiyy1m!`xBV%O}EOZyRiAp z;&qc_1$*5Eb9b98B2a_X==ars`Rhr^<5dKIXRav@pim9QQZ5( zflZu@8Ox`9QrZ)$vfR4d^UL(C&+*2qUw^Y=-=Dltrj_}s`&P!7Jw;5*YlElFTkrh- z?!CR+VtX&ui%ItIO)t4=o^@~E-X$%k&QxMU zKVnOs%>N&54Ev|n{^V5P3}yNE>~R+3TPc&NMKV!0ZSq&zSDLdwJoIaaaQ2>q|5jgT zHTu(ReEyB3tA@FtfYD#hcS1gORUV!bmu^y+TswvP#q;B@ZBD|zW%G5#oRsLmAP^~PHgxdn-=kFi^o0B?Z&>#)wk9hQeV<(=n>|%FW|oO-{fzT ztX4a%G zZ`>SOH+!RM%v4dK;(PqlL#E#RzRu{(&Yb(@sj-PLDu2<=Y|eev#tNmwCsJf{f+4N z+<%8N@2(}%Y$q!F&gZ^9HCFY`LISS~!Ty-|m&&q(@D%S?4^iO-6R?$?`EIbSy}=Getj z=I_VVS>|Sx>EBH}fp^ z-l5PQm3>lr$4AqpPKOhV`od&YDxbCc_q>|(?4{P7s{J1h3YaxH|M-vJ|#bf_0MU(ZJn)Jype~VR(^al$<4_@=i-%*IcsL!D?HSo8q}mO>!O#} zV$aU@`m@BGM^!7GG7l}e8{ zxj%Ei%qu$OSYo5Dc<!T7ukdHIq&j^|UiaH-q2fk^ z!{#Tw@1I}2=zP$$qrDp}s&$Hg@vp4;b+bOnAmZ+aXB%~ITkR@tGYP8AH{^X^XwBPT z^Zu${{k>g6SKiMy&K7jq@Y20XPq?r0T#DYdC&jO#q_>yxREWR!Iib2g=l%`rX=itZ z%Ew>Yxjz4=M2F*~#Ldg?W$YH6`;$AfSm>vn^37F~7o3=*AhY_{%=ek+n{yX`vK7B7 z=3zHAEc#Mb?$J=m;*SS~_cK=r8brz%>gI@DZWCJMl`0k*X1Lf~C-1-Uvm+{Dfzp$z z@~b7<*neo&>DC0T5tH4qC?(^;r?1Jnw`yh()Zo<1svu#GUH{L@kF{v$k7d_R zdYUeHYLRxL(EN9p-NTiu+XG+M#^_D((0Zt|$RL@)KeGH*;>U~Y%I`~D5H~p;X|eH% zQExSqS)JISjTen|+t! z;ojRLry2V=Xw~1)_3|e_igj&d^}UxH9C^#8LGbiBzIS4N-7>G+vxRG3M{^jJm+@GJ z)&`%^3Sg?!&#`hlV|V)dtJmhI#g`k@ew}!olh1QjuVL%_z8Upr1y?LC6YtB~>MGV7 z@7j7{_x5I)Opc{5{<2zemKS?`?w?R}D{9RJ+441^1(#y?%9@F%h6;Qa+J8^5^}pBU zC99KDdMCE9O05hG@u|3U_J(HUt{a=SSP9K>oqA-|N^Z%?lcuS$*@m8YHBCQ5r&Dv^ z!aDP&ncE+!TzY%!+})=pdR2ARAClO-JZCcC~N=7Z=i?Y|vS`j{F zz0!_Vk;WHi?K*RyU31mN$?~mp8>7Wm$DRxmo2}HgP41B6jw6*G_C3-c_}%P|JhJn> z-Pjr0<0f*KZB?wq*R`vS+CruZHW=PCm6?!d#P<7^iLGW#7MKh z7Z%(3YtGS6`@^|EtyhsdVRHML3NQB!{%t2>E;j`odU&huW!tA`Ups__8^qfS-F|0= zTS$f8Vt?b4{eGY#KbyVm(yznfZm@bJww+P`ma4h`FWkIyRiVjOpL zxW~eYHOJ!~*4VO$ED>?Kv+DN8&F5o}NL`58)-Ld@Ic>wOFO%lJiwy}~-|%;X{A}-F zN#E(a{{Ef2_`bHm&*$&Yzn1>EWx-dg?6JO8T+A5fF_Sibc zdD4w9ck+Hu=&V}v^55QWYmd+uu_3=Uew;OH@t>=P(vc=%LXpQKJF4@JsQB*xx88Zp zbE~f}-OrkwFh211%7^s#7a3+~6#dAyzH=?V@V)aijdFQ~xNk_~69yXaY|H<#gcP%na`JpZR=FqJ6&O)4ACvT7{=2>&<_Cb?UC*Otp#^`@No6x2%fb zzi{^MR<*v~IF*ohON4}Z)UK_Rjo7Vd$|d%=aN6&p5Y6-R1&`lZEwhI0lS?{l@nZk& zw?8bM%99>px>^2U)W?k2D{~EZs5pPoTAw&atjqEC_W5Veav%M@Z2Gi=2UOoZ@5qjt zGsV4`;gCmY;D%Y3e?O}D{ZCG@-B@JZZ63Dmi{@uvxRdbU_^u;t)34`#wU1HHuH3$V zqo&e{l|uXywRg>aU%4GNEw&;zT2FFmwd|!`3%}K^{>mF(8agSr`;_C)kEXX&PVIW= z6>+Thad7FmE9Wn;D@_nu_Tl3h&zWBlh~G=*S~Ph z``Bl!ei^2TTke>iZQxFCI(P5XpBmK&f}UF+VlO&^Uag?M|v{d zUf{pdr*RDn$KI_Aw>p0}G8E6$E9>_--k*C^AwfB^dxkXk+%`7t-18rK#I=hbPk(>> z`*ru@?2}xboga&rCmcSS6?kT%(|_mK=ei|Frzyue?|!xD@!LPEv;yyB-kRWbaXag; zzvZrTA}imp2p6we<37>O)_9R-;!XAb`Ed(Ous>7$c2ahLG1UDNt?`nI1(xE~9&&t3X-*(vT=?ioH}c6t^DhF{bEw``j{ ziQjP6xixk(q^&hBbbMG7J*Rx*vo+Ogd(H*5{VMbH`PB0MIRA-Vj~;IPa`TMHmH#}l z9w)DTW-YUJk<-h$pvuAi^6KXGe4k5CoQ<{McyUoiN;|;k#bp<@=^M-;{St)B}_EmH8G_R0NJSN8&|w4?eyJvwyEmdS!ZHGS9ed@=pLQoC3rh!_lj$Cjijs3 zTOPdVcksmNi{_gJ+q`B6H*#(4u*rKLWIAmV&sHJ6oqBR|M~>h2@Y{bwCH7o#XJyyr z&3pI`eGzv(6x zWG*e>7Z<4HPqNUCNjkw&i_)Q8;bG`-7Ip?r|l?SViyK&~tKz>%&)yH%{`&a%aXV z-dK6N;f8Y*=N9po%Q+p)_MP*0_SJhe`>lBTkwaU`Y!|Rulun-J$h2jtv2V49I^&6L z>8~yFgjpBWF0P%EeY1Jv_Kkvzwuv7~zWe#}jiWD( zw7alFL?KTCKH z>-)X>Ui3uE`o3>M^|wX8n>_7vzV~$JrDD$>m09_Vz1qL$eW6W( z#Wt?_ny>E7YA|+{zBT*3*D}$%=lkZ?Trjxt$vEQTY1NBa?u9G%E>~JV>u6qu0Q=ju zN7ZdT%45z3d|>?F^KnR&>lkr!{!M!EMR%3%_14_g_`~(J`B|-@PkWek<~x}cZ&vOsj9lVVXx{!vO*`55 zxsmx1OE**7#7!%v-tL^&TM~79wWvhy9j$P~T{i1Q_nSFSx>mFPQt`=0Ik&G%Y2V&{ z!(dj|>{FWc(Lym(dvadfE_?gHcFw|&Gg#~eWo~cSSr^c#-r#Q|vZjjZvZ0PNW9|M} z1{>|uAG4G!Y%XgsS~RD>zs+$!zIy7WxC^(lr|c;doAoqD{ZD~t;H=N9JO50G+x%qh z<|Av0trdTjx@oR9|Ni{&{8`E!=RR$geVa8SeCkrudv{EZe>*At+rB^g>W1~Zy;^H$ zN$@>3^}lB+t>cwv^Dyr0^mirpo8-zey}ai1WcIb(xqY6mWXX!kVg-|emIb}v=d`{# zZ29|u@5SwYl?zQ0f8LK=^lMS#iT(bIUCZnBzeg|slFM?dU)gQ{oVCk;t!|!mTIy`` z-0Q^?53RZydS}T4+&p+|gx5M{ z7wu$Lcb^O8sjGHbeG!?VxU%%Yi5r7ah6s^M(2he=XDJ7vrAxP4^B{kDFw*&dhE3?#kzJ z+j@9+2)&9veeaw7_MQ7@-@E<2Dp1zl`gC!im)yB!e(j4wMPwS-d3I~B`<(mXa9hLC z#NY~3OPk_vPcJQqI9J;}wTDsf=;?%Hw$@k2KFj~+U&i#+a|uZZV$UE!i2J ztA0LaqUopko9?z*Ut6aYeM{og@43FKO8o;iEV#7ha#pSQo5(=_Y@Nw-G>#_*vo6Tc zcYbWJgY{aR{>j7duN@9ts1SM5$jANAQOy&@9|M0z-kx&x$EMv4_EV_A6IDkXRXiG^_OWcC%eR z*H)Zt-}1rt@)DtAFW2$DvRHGxx@UDu-O-qxcV>r}zb&<_*dl&;+M*u;N_ooHt7bp6 zpRhCQ^s2Qv4*Q<%s4mmazYz5DS0lIXk|u-D9d=WrqbB*~7A|{u)Aa_Y=>1Fefo~I* zIO#>7z04Y1ckf;JV&h=>>pM?{{{LL4v}x9V+m$s_d%U;(HP(9D^|u5>rQR_5>qmFQD6n% z;jL#2yDURaeEhPew99nk!JYq$UOlR{3+Ft(G}BG-?)$tcyVzdZjq7Q~m#rW4GVbzF=Omv-Wey$5*E5#gkV_oZ&ZkQTBP- zxx1=7CyawO342Q!*{1E@yDPYDj(*?TI)SH$Z2xlIw_En%T*j53$Gu95GA^fo%wmy# z(edHH`MEmQKi6tq{;m5+M%%euRdlD*I^I4`^-qa6+a}b!p3Ey4`8f4=#lqYEzG_>0 zwYep}t^8$QU7Pv6@Vb$@igLlcomZwUG@Ud1rEh}!#mnqLb7E7P++2mK*XONybn$Jm zU-+uIuG?QN5uP@G(wvF~AHTS*`Yqz#n3}WwSv%`jtLmi6xpQ`Zm^C5poQUL=^n@L1 zb=r*nIXk}1bm#LGZ7!{CE_@)~kQW}>zAiSH?{ews9t{%)f3=IIit;J?F;3nZ4c*_LTaV3e~N?v*Ot@`{PE(w;ncV z_T4#Iq|2t(VvBu7v?B8%;T0F=eoVSxneuC)l>bqU^LOMYM5vw837xaWb-CIyjcea5 zoH=zf6(UddYD!7HJpZKLX@Sb5EhfkPx9py?UGvD?*?A!%t3nsZRf=iq`N{nVwck~@ zJ=xw_C$c12=KQjpENfGVr@dEebmXs|%~|{UagSAWUWsi$^`0e$acXsUDh?l%+IV?+ zwaU8Ui?0%=7R2r z@>TwetA^pq(ActQseY-d9lUSXo)c?(J~8-ZdcjPqBnJC)GF4AbTy2^nJXzQOi_(l4 zUWe|@GCj4@$m`wfC$%rdXTE%&6sr7BZdb(#Cf67LcNRT1Tv7C}%33f-`hCRm+RmlT z4_@E$ZFWBFlFg>bb9jR2wb_;@W@a|5+x2CWjjvCNRjg*{*2|fhMjMx>Tot;uQb#c+ zzQanR#J$?{+qs07UygjqvHR{jxjmbAb-Vn96K$Vdm;G3_WXHwp^&b5V@)J2%S@?;% z`Pv+n{XvZFL3=P~ac3rrNzSnX z*DTQ|GpGHj?B;m0;AO}x(Hd59>;Hi+6$-XroS*f*_+^|C99OA+sY3JY%gI-F7eD>J zFt04a%6`-Dhl|yMzji3@=BRGi+{c|WFOG%nvRt2k^tw}57j1jLj9qBf!o!!|_|49F z^ZK;GIsWzQGSimd{KkKA1E<&jC8ayU20HQ&v>>_6v)u)^=RLKX9t{_#;+|4fY8Qa300 z#|34s?U9w!E{AVjt{{_jIeT56z~rn~Klbiyt(3ZFANs0c9k1U(jjhRfRSV{;39jpN zyUFLo{kBj@d%IV`zdr{uSlu}u>}g#)JMPo0Su;;eGkA5*W@X$8xrQ}4_3MuG%6==3 zT^O?Us5aMkIgM@c7gPPKrrA1A=2)HQb)`~iZe@Te5_-^zGsT;I!Xbd z%Dm?HB4T&P{%wlble{=k$^KK6vhvcN*5mi2oG-e36qY}4_FV5zRg=rr)ES4JGMm?= zWUgQ-IO}4OWTd2GcG>UBt3xVESHnFfYF^WI@cZ-P(El5er^_d*-&wkFnf}sS5$Ya4 z7oWG@^QWUJLn|uq^8~w9pBHz({Uf6p75(@Xo5DZ$Q|@b-(%N`U-WGE5&1Gg>@Z-Dk zY&*T~Q^KEa@9nI5{bH(&UxY4O;9?t_J2W7kBU z?W`*gKXd-ag$u`LGtb;4yI^thwUxO!XVyNnC@Ep`dabrI&*$2y9mmQZytjxf^wqf~ zJfow>MPhN5_U}y!|Nivr-Sy62+0OQQ*O|6AzE7T)@;!?;Kdq%#^d{=GDZgsXCZpZn zp7m3ztX>H$Ph1|+b#zaySK6P8O|w(CFSo7Z>D#^F_fKmlKFv@Ixt8p+GgDpUWaMl0 zODC1Czx|`r=HvuH*eKlt|9@uwOO0rFMq&R`^}zz(;>A*LOzX#&0$L<+&8yfJGN}CQhkey z;r2f)QrFHUr1FU;ipHPYazyKveXUA{K#6Vi^nGg!nJ346I_{?DC6nU0#d)gbjuqRq zF5gv)mFq6Z{POxqqvx9N_?xjBZ*?uU_htFnS_S0y2Sq%a_ucY5yOK|Le{$HX_d9n^ zI=R?<+XuHdzry>bopA3{xTKkv-c{`Lt>&<>Wetn=g|icXU3&i8CeL{N%GOi&Zr5^N zp8uPFZDw?&<+bqnuWo)@(b~6f{_W`5yu~loF0r+*2(ow}+9l_haAi(+XR>;h=-Vtd z*PZ7dt<=d7tb7q0@qE3K!ZX)bUyH8B#r}j-?O6{0U6;sr zlGCmQCs~w5ioE!IG*w*P=UanB`qb-_pLFhW+bNy&=GcS>9-H?WvYxA6yQ{sU|Kml@ zV{Mn1%eHS=8S^(;Xbt1q$inne>+1WVr=RBu+g~%NsNUgP>{*($;TPLgsc(mVt=+%Yu0rPP;upt?esOs1JU-FN zGDpf|9p8la@BK=D-`hK@T+CDYUJ~;obJ19?zhcn^t1Yij+swM}4ww9$-$m~wt{#7~ z!urFV>ViL$Czf2i{(r}bV}%d?7A1x%N51gQIq7|g{d#SS(r2Ezfzfys3<%GFgkAF^S zxa;sHxO?BZkgu&jjw~vzTeEAkOX=xj1y^bkR({Rfzv*YgZBFa^?w(GwJZ|mLNO)J; zA;Z;g;v1}9KJQG}y{l)7gPZp0|0|ytrRqJu?~9zDz`>PA%YNO@GhO@8j$3W;C7{v8r3-^{cI?va$oG`3oK0v1H=W zuTE9YrJGu+)eP@5YhQWD^r7#tm{DVV+q0N=J12%letqCGSLoBU+>M$!U)E@To|IXA z`GS`?N725cm)@^wE8u?Uut{<2a^V}*IqNhZrm5`T#25ZUhL=6*kI0mqB|$3uXXZUS zvqIB%=XV*G-lUuFJlk0NBxK|dpRK+)`_;4K9h{#$gx#YLYdo?PzOwQi-?!%)*H`g{ zOR=x~dy6yJQoygGeg2ldtGDMyN4=1HU{oJnv#I&U%2kh-#VqgPU|f6f{X>tRF3w-h zr+G-XZ`G^F{2mhi=IZBt?K@Yx{*wy}w^p1kTBw@iQf^e$rT0cd`M?9oycj`ww=jwF zo=u+9Om3~5E?Lr%zcF}UH-DD3zVVj7OD5J&SiAaKNZnihU5v*gYRfJv-toGrq&+Lq z=Aq^ztDk4L8qIPr-a6TG^KE_Y%b)bPa@VYUvgj4#jcu~xPuZqd>{mZ=@@HDZ^NdQ3 zH}meVJaT>8{bR>3Ei5{wcfI^vy8nl7IgIw7R_xryJN>2a?v^N)Gu5{GIs1xsO?k`J zS$9I>RGZ?DgdqEgwf#q*-ukib@XuB2Q<(Z!KWA{6)W7#u%kNd3OSU}k%8RIcKQVLd z?mrAy=f1a@@?W!Z|G^!ae6pQkCCQmvw%?fli0kchk$oS3M7Ga4v&)ouh3<^QI~~7l z-#y2qcCOa9pTVc*!TlzkQ|{GL3yzLUBcT^*@n@Eu}?nTDueO|9(RQe%0h-Sxb)AsCvclZ_Zt*aZ6e6@`T$bHaMz% zdU-8yVb#{^O$}9FH<_y3c(u=~Z1P*F#dG!ZolhG6PmnP^WgBAGFv~o2j;mz&@fXVH zw`DMFPP?&PBw*<}o3E*i5i`C`7TVnXC~vQlop1ODk6TMGKU42G_grSl)(7`C-)|ON z-8FeS+s*E93-!(nzGu$`*BbZi2v< z^Lb`*DeA;6E^hs2_dm?uC(ty|T`b<2mFx4)0;c!rA+pAYCtUF`skK}sq*C%Qw<}d{ z(Y~j*tw_U)aH16Q?=E@6CkNteloiTs;wG|g! zqBb`!epJHx{Px-c)9Uh^=o@{d?~UtcZV=oxMRX0Ts+@g%Ys)0>jQBbK?nK=8(VDvV zv{<-oNy2jfP+6V$KdFD;TAV68J}>I;1?lUyOSzUTifEg7E%H;{vA}B6y$9OgKHy%( zKVR_IBagP9)0QsLQAzHW&D$a}-@o2>UZrC4SNUIo26{Sot+lRsec$lJZ2nrgy_=PV zx5rG|`iG-u-?m#T)O>kl)XZvpYNZrIN^Ch(4DPng^Je;Zc$QAiuX~SMtlwT+Ep)AP z#x=e99}Q%5>rMK%-2G~=Ume_Gap7W1O3hIb{*7zAlG=Z)w2)cLv%vED-OHbw^Y{8! zJ4~`UKhNalO|7ytyN&(3-==bEKM(sB{8v~wFaOKT3w1Seo&S#f`S#)5ZvM|@uYNS$ z^_sLetgJoj)GNtca>FCMg{QttN(M#DUWaU~e?z>kr%Y@^~jYG#IEHsSA= zBjVgOQ)~WS`Yc8( zDCV0$^P+h(GMQCoYXqy?|NV4x(l_qj8~u?E27dm0CEsH1e}Bg`joI?i&mHgXxpLg& z3si75I92(_;#Xtj%zul^UY6<_{vOM2S*8yWrE)=4weu77%;^_6=sYtL2|QSmF!I`rpm_`37(mz0Gf z-#$EiYH)Yni~B3$4o1v1O#kBLv*6SUH~sFyXw4-%3VALHEI+aO?oyt%Lnc?NAGVqr zyKYz_<^Cn)zT>O8k`2j1#iDE6`Pff|y|bLs)*4fGaC+nHtL1krTz9I*EiB({ANC~p z%df>7H=X6)en-0aEO+(}yUS_w1Q?!#*vHB-f7yFvU;TZR6Q+fwo9633nXd3-!%nl^ zRbNV8CMw5lh}=J6b8>inYWeQj)rp(lE7WY~2#+}P>&BBX_rM*Cb9O4*^4V^^y{xLX z=v>{oh?A97CvuKNeoS?;tY=VDlzINjl1jUc#oQJ}D~v<;Oq{SO zSNH$IDCMq|YP-MQ%4nRibzYL|zbAiWj%@p1xz1>P#2@GRNALY|ztZz3@A)tNV=u$1{2Ayow{{#XW8;x%edcWVCZe@Xz&l7E=gnD93GRET zcym=`?J48L1D}IKb{8I*wcGw_vCXRfJ6ldN-j;bcHJ@!#$NV!FtyV9(VIOzwx$4@d zv0*n~OO(HUHdoB8wXLSUZ~KWqFK_)2^boGU{B`rhs^<4K{bnkQUhdjd?lm{otp3if zIX?~WKK$bwS~+oH_@%#27k{p>)p#bi`o--_(v_ZH^^esrDB+gRlvh~BSNAvn^k&`J zVxlpV-uJrYe7chttd_agDl9y;Qi)uuwi<)!1@eb8866JIh-IKP`cXI4D zU7m#3EuPbrr|gP4Y;QJW;G$O`t2vX- zTM2Q;o?ev~-j#eaS+>&W&GSh$#-{4C&+X>hR=jQhO}?8)Zu=TswGBP-{cBNhYSpv@ z-TT6p9?9PLCsIB;YF%d9?)xDLcbtWv)vM@To^*ci{P(f*%5`!|J(WIIZx*XfR5_LE z{r%6z+tU;ed!Ag8`Sa1A?+VK;HppFB)za)$_U1#7+kANs{Hv515yLWM3?b50b-CzIl%KVm^d~-9;!}hHe9+UDcd&L&&sd!ENv+d*V z+GoPgf3~_W%4;y5eJ?Y9%R{p>F}gS31xKz=PSc#~sGRETm00*`ruC6;dPzYiZ*F=q zuP=M=^Qzq`FE>jsUU;$2w)xqHNsm3(d zjGtQKHtEBQ=RyiutgN4+CaI>JdUa|(bMuG(PkUOmIZmt+$(|;6%dvaQy=Tl5Eo&A2 zx81DWJ7MFJsPo}r?{(vQ!e8XJdosSZ&HVFAatiBmiB|s?TQzgVORK*mtZJXmJ861` zP~k1%X&uWJSvbq;-l;E@-TTwiPStPyHkCg+?{E3?M>zg``QjT1n!Ssq?N+NFf zDfw={iheQL`CY#69`SiXXx}L-{qh*k%6aWNkJhfclY7Oz>Y;2;x!<;Ve-;Q{YTjfq zJIll-ivPvOIO&QIBbz;OB9nNc*G`nv_5bNJGmPJU-CmJ-J^r!z>91ZFL~wIY-Wl3E z&-|-o&i$DO17CgdRZz1s1U3O&gl=6$`eta@G7Uvgob@B(hZ_Xz?QqG@x_2r=AKU4R;HJeW#V(vX% za^Wo7&)Xtfedf;OS-gwacJe)*KL+=oO?c2=_VL)RCzspTa9;fN_;2d$Ylhi?fhzsSifE| zooT%9$C{&;_VT53hijdyj4==BvwHo}+=6S{y?C#H$FonIeD{mLq|c}Q+q>6G*DhfE zwX6K8hDA<}@6|M#SSv@%3wk&#+Xpht#uWdMtfxT&ulr>z;_o@gB-I z*bEokkJYp2vyX{AaL4&nnKl=1X4Zta{3#+^{=O;{y0J3- zPxZ?p(>_kqUhe2ac7mUG{i(cutcp+WqU`hM9?PDW9owws9;mHr7G!vO>!ucusp@}Y zW}l9T4coe8()nA~)qU{=8}0I>KUmh~JC+@!QMfopH`x3+D1mcO8{iuW_BDu}x2d&1rh{)7Sq#37E0VTzGWt z!>N_~*|R6=e|R(ZLaE_rzfDf^B|%kYrBMg&T<~kY{h@N}2EB;AuN2liw$R^i{^(oL z>#1Fryy7oR`TOJ7RqL+8#}!L@C-Q8PJ=@6s|8w>N$*|8k)4Q#rgYViHs(agJWIa5R ztT$)l@2fIta@*_noqRN9UEYu6<|z4zRr^ab-(6Kcd~nkTvG>P!y55|bseNxs`{cvF zowg08z zs<7*!-Rs+QAK17H@kwv|`OT<-AgFJD+pE=(xi@mBMT z@9I_m&5GaVR4F}Y;o{rQqxC}XutdGsmxQ9)zKCvf&s)C*XK2{yzqSySl*wkAR2_A} zPL0>laL>edZ~Z3xUE;pNdsf@aYdb9KGn4M9{XgHHDiCj)|CR ztF^rNC8u#b%Rguk!6_N4mA zN0-bSQ)f%gpLyf=tC+Z;Lyx|FyUc!I-O9fo558q_t)KfZ>d&WHQzs-ahR;p=p~CRy zhuxY5jLQu!o_t(qvO4x-B;V$3DeK#_x)vVNxgU9d)dNP?zh`otKa{Q6&lNgXDdD+M z-X*WUIuCd8PmitsrrYeia`Wwb+um;6@V&}Q`$p`+w=S|rzFG0x8l5cvlvn!m?U^U( zJ$z4f&h~wbO#ZmgvCnETx7C{6myUh*WjShT@wRI3?);B@{^xdW&eyEE9&uM=f_TJ{ z*f-LeM)y`IJi27SpCakRt!{ZXJ8TDQW>Cexcgb}jI*wc(6P6v6f2c1uPpe#ZV(N-l z%gciU?x=d;V~8(2EUjx7chM>r{`;keIpA@t9$$v-F!vXX&e}SR++ldwcr^zP#tY zC10;hM*V90(%0*ZU#Y&C_hj;9vnx*P&1OgZHjLXI;cxcw%Dp!8N1}NP56l%`VOFoc zhuh^;)~?c!CDzx2<{a;`s5?@hcRI^;T6Wau=ME{A?^yrIsXi0z%vDi(v2;$MFZYx5 z?N6t!Te5bISLVco|4)=uIscj*G+pUYseAi2yRF9mefG@9AFKaaalpig;o7dde_isN zetw+%bYg@RgUVYkPMPoh8qtA^Ua-cnJv=mT@BF>~6&9W${AVI1Ru<`Q?rOat!+pg5 zk+STPKkHMI_ZfCBf5qV&a_mg-j}PmeOX5A-h;$Qr@0BG%!e5b zuIu#L7nCr`avHzibR%qKHF5F5uq;F)+ z8CQ71^tfmA*Z*A}o?;T`keE^2@JLL_z965YS@{drA$qb6sn zdA;@CDv|0qA=|m+pq#Ho(;_*(yMdQ3tT2+cS$?Wy9fRc8X6fU<7Byco%rD44wn)YB zsK-eL?|D`q8aqA&Mc+#KQgrI`?g_7&HBE!|m8vvzq?IoyV=K9`&GnOBg3Vv+!dlh6 z7vtqO{Lxq3v?%D+g`hSO{oTFsLO0)B+Q*}iH|66FQ-wN#&zn1&LKQ!S8h!9S%^}I^ zd9U0c-G2V#^{3@-$y_$rplkfeBKg#P+50t>AMZ_C7Hh4+z+SL6>Bg(6E#k*&H&1=C z@Pg(G-J+j7-7nY<=~i;8r`(atwi8+(aP{)M5Czl8zQ%`wb;Cv9IIW$3W(vQQ?&V+0 zZ(iT?e(lMZ1&Y&lPMGnr$ZLwtx}RT^zj}QMNPgsUCf9TE>G(6N{xbG$k+`vF))U3a z-8GuKE_%9uIM1FHAG^CF=f%pWP4Wg?AA}_T;OBktDV8TD*n3_1gymaRCUI!)%rjo9 zIq7XoVS3FRm#xQ^7613-(B6}ocqc_%N!_B2d*^AlJF6BxO-{Wr@#^;Wd9%e=q_AIb z>t7bRUgXCsiy04oquLPSKJn3%Wv9+8_c(XN zzjH_0#2$ux_8c|A>tezAqQ7{i7C+h7d2_$LkGI-^>ZU1ji|%m3#_wZ*JUr+qSOMC{QGLzvzz8-f$U3 z*|i#b4QAP>r`RPQ`OG@SV|kmx9!s|#Rh3V%&)>67ICZ?bDRf#=pV`(!cG;a_x=U+5 z@6J4G^Vj3qH{r>VC-qK9tQWAmr~OJp_^#=rcjXsPee&|K|GJ;{9|v$0=oRS1Ih2 zFQ58tX`GWUYdHIQ;|~i`Qq8Lx4L6(&eD;?qBenI}s>y*bE;moy_5Cf=;Zuu`s-$Rr zt63^|f7xC?x2eHjlR2iFcwG*5NxXRK{pVSK_HQqp&TnvB-KB4Gqn^qp^%WBAj|zS( zADotC!DQR`^LkbL+TOp*;?9)RW=TDde>wBn&Z?D3$AX<%uAZ9pezN>yq2y}qh_BMC zK9zdQL!sz0|Ac{e#?db0?c! zPFNy4{U*zb^UY#HNggU;=dN>bPkjH-)TCr_=$h&R+1InW&+7j^_5a@qYe9)?C-0mO zds&w_S?Tqa>Gk_p)jz+P)p6>XrTio@3GFOC;gHke&z=@M`?7F{_d(I?IXP`L=l6AA zc%at*I>+Ec&EAU6l;dC9Bmd46>MN~0t9m?^saaz{kot$ zwLiT!AY+03EWS&huQAV@dga5+=2u2+L9Sst8zVy>p3+UWasO5!dNs_IcdcpM!mr14 zg}>fsKUl|b=Ha}yN-(tL-bkySdyQBR7JB7{o-enXwFL~zmYo5oUpFg}7 zC7BxZzYx1GuVLc4A@u@N@&2{HVyjeFnajJby!XWZ&WsCM4k?Ew#~07teNQ&Zpm@V& zhwP|d3pZ@(?Z3+~e?f-orLt&^cq-O%FPvqn|e^{^|9L-+V=1uP;vGUBm`~ zN56DAn62+7FO3gMa{W3n|7hyVnh2}INx_rOBetOoybN9Wxgtk|A zR;`{G@L==gA56g~ztmfuNuFb}@bGj-yMR00&IpOq6+ez17IQT{ajuw#mg{~zC_^r!de=jn;_ z{mrCzOMEoi{_*jS@`i#>LG(F<`2^s zRkWPC}yyDBRM^D+;ALaJ_zwkPyf7-c+kO_ar*JIeRZp|A8n1VZ@u>S zQcCmk{P(9U-acQsIW^1FL75zC5wm==C}f9^v`|F7L!i=&s-|Eo1=aLp}s zf{jKv}8~s`S=u|LE z)~h_$s?)M2ay0=(P9~-T_WcPplRj~=HWhKqG_F{ay0cY9=ilX2?dvNRpS!d3&@w@u zQ^zGz@zQCx9b;_F#S0=Ct>0*d9Kd?T`vnhsKtdYShAjd-v3Uar~J?6 zY&~WFFR*v*`*Oy530?l#|G&Kc@8bD^y|}u2)}8v0$KLEre-4|)=-P=W{#ExnXFp^9 znpvL8|JjR~|0YWRua{1Hz4=>bW|Z5%kB>QXb%`r#x%>N$uj!4@&Rq zzh=}_%)fT(WjO$^Y}z_~hno3ON*9^7(JP@vrNb-+q4e zwdCfl4YOX{zg*MO=%~|k<;MZO|J(O;*qrL9w9WC&(th&4(QV3g*>4Rx@3gy)-~S|Z z(V$X!sbfQVjl^GmlmGL@1?_=@`RD#a-VfysdI!4Zd>j-<$nX!vEfO-}ss3J4f%H*f~=r=hQ7> z_e12CTz+6}wtw}f4#sC{d)H|O@|##%Z(22H;w6V~haHpZrLPMmMGKsM?Go;s`1x4# z&N-)|T(?yjp4j8jsqAj2iEz3UU zI}Jtmb`<$dyBlnL^g+&?J4Qzg&TiVrTmALE{P!c_>z_tUtg$Pqbnsriu2X03q8i3y z_Z2ooo!rm;AZAt!hwReqzpJ`k8+sK&uP(cn|4%kLr2k=>r~APagC@^~jDNb7!h4FA zO$tvxIK?>qxxgI5eMP73U%&g?{Z#4j12LA9hc`Vqe^2~al+^!8@$P3PUSAYce36-R zrxrhl>^g_$B+h+__J`%a>DN0jUSMgz-aGN!Jd1?Y*(DEJKhsbDQ43 z0-kp-58H7`Tzadnedgoayh*j%QJt!}2j>W`F5!w%Gfn?r688E*OMff30GDlNfc5h@ zms@cgjJ8TeG|Dd0`nPRYfTl*~hwSIksZ9T_SNv$VjXZkc&hxwGf0wL#{LtdtvQie0 zu$~oL^pCdAKeG4p49@NTI$d|xc}_j%^3_Sg_ki`2pO;rVI4J-5_oIBlw$;G_@BFgw zeZ3m>a%WVq+_zIPn%{04{=6ui`Ho}BfejI5Oqu>moW;#PFZz~d5r5nLaL=}zdz8Aq znw%XcmLc|L53u2q}ock^DF8{sggjw$%8P*#Vt(4%T6f%N~^Yop{p+>XBO^-TAidHj2c`O|q< zPn;KcAkW~~x+1wF880~xKC-v_#mZ8aF{4=Qn@;%_#aGiNXNj4xEWchfRo0x{UZier z;if$&EOu>pl9d@5@^-1y{O3gpZkIFfKMnex!u8_U=KI{P`){l(xqjgT>z;d?1-TFJ z)VdKFcgQcoHTBi3tEa988J^qXe_?sV0n3hQ`4L;cyFb1yn)>vrYj)(t2mHS|kLb)u z&u=ZU%58mWvWn}r*}CqE&)bFl7v0Ne`K}fI$SY58*XelKb3dM*+WR_&#ii?6_LlNs zb?cay*8-$2+AKPem~*Xub>xO0VF8n;u3Q^__xL%Zg(2ccE?9H#|LJ;k_M_-|&CfV{ znoS<VAJ6xg zasHVcDBOE^wTyP#Y*+c#&-yjfgvKX!&~MK})6yMtMh4_~&kLH8U`IB>KVW zo&03(i&OrbSy1~WGT^A$+GQ_wHy6Bk|8_mg4zJH&R{!|vls|E9Ics`%;8V_96Hj%0 z*K`glYIXM2@o7nj@X1(L_C0KRr2BVCfnAE(%TB3y#N9MfAP3YwL>N$`_aqyZ<8WF&Yg4a*(&W@SueVK)0WPf zfAYD<1&-LQ7Hd~!EIP34psam~^}g>LibLOUtg3V3a!|SJIC;JA@o5784At`V`X(Ap zf1JRXJ@22INY2TqceYo=7mH5)#;81h=c$LC(=VKJc{}}Zr2Ui3|8c+ECF58-CasTI z8h!2;?|}*~L7v-FUYB$>%O703sc3m?+V%ODCj6E1oc!3mQFv#+q-*A{@GDOJBJx4) zt97&&eA=$}@94q8BRXO=8=T5~eq22`;poRRP5rg?_Q76@1+_l^{_|u_4 zM`15A-oNyB7Zr?od@}3&qIvSWyWiMm9`Fs|J>Rd!x%As^t0}(epI4fPO$j@CT6wK> zNW!FYm)LJBJbZtdsz1Jdu6}jxpSZP32g=($)9oYIa1^M0-+aL3<>!w@qL*Ipdo)k( zyAn%!d}ZaYi@W!nH+)l3*}YKM`>Ac!ADy%>A(9%lhvgqhl-B9#ut%s~uiJM;w8|!u{w9~WasS`p=avJeBV0TH08@KX|K95Nqdf`$ky|(o@WFpG#qs4xwGi_v-Qga zRTEde3kysy_4=|mP4H)Q$gP>VQE!i}on6;(XLU;d%L5q!S%wL}Hca+(~HCRhq+g<)6a+lFB!jO3yK9@>~)Ieea_{p7m?8&5JHa@cgjhkbcNo7Vj)^Birec`v?tr?=XK z=f3tKZsmPfE_xqS`*2%%&AQ*S_jN?(Sa@&d=-8gd_w#nAuO&<0vukm)n06i32%g<- ze(99ORe|Dlr>~bA?(&$FovM2?cCW5(@s`yyBbvQ@uDZt6md=Qp`@Ut}x85`Bdi;Ek zY&6*XI`-s}RpIelmos@eJ*r4N`R~hzS`TK4_N`h4mIt0Ow(mM#nX&8m#x@s`GrO82 zU+2WkiM3Fb`(&9fps`Q+@z=!y6>E+MDg-y)eE2HQaKA>Fvf8cU>Hz8g6Y{l0?V{pl zM?78?^ms+|KJ~4tz5f~&C0}vnXl34h9Cg^=EZ(-d$Z6BYNv}^x6+M4SCX!_M_+5%(83Y%_E>vMTckJJcD>~*GF4AUo-vzYt}6U#<>!cb z-&*s9BgM^4UDsT*SQMk{^S-u5YQ6HLgYG-lEzJEqe?~~jQE{v0LzXhXw&ZuYdcA$e zb8E7BD{JnC4V&Fg-tP=_>9qTNJ*h@IbKb6ky#VT=4LwlvI2{u0)`B}l^3ztC;_Rdol3f?a&2cGhzy zTrruSZE$0HxAJw1d5U)x&XmqQ{bI>3)olxAR#$voy1vf!d3np1pIXbheiQ`xT)KCK z?bE#@B9k*2KOVZn6>!1Wz;Nk~Sq^RD%s(uejZ`O2b@JKwpvEX}hvc@qcZJ?&g`T;m z!!lD@KXbO}o4sBa9Hjei{5fgzYN`1qmv0HpuLJz-pWNB9bL!0QKcUMtw|D$o-;=`| z`pR?e@<2aD!F%l$Upn=__=!|1(d{u*kWPzf$wXXUPxk^K;Ly6MzpneQ)JuH3Ec zykh7pcCLYIRgTA^bPg>yw|jxR=7;WSTDjsehv&+jmcpN6YhT}gaCt}R@(LH_nUM-s zKQ=qR%#;k|$obmYXVWXW;o9=E-M8O0eLS_}jODx(y~n;rIV*OpzX{d z>-%>sZ*17C_1X8F+?)t8m9j>e?)!^aekAfZXsuZq+ZR6HA|N?V`kGhlv$d;!2ewb+ z;4wb>>D&$ZY_Oq+s-?~}aGJU_3QTHjC#b@qBaz@cTME+rl#eu9=giw>+^T3eZC?r^49ujJuB0 zY=?LDSMS+Ae_NjPZR<*oZW;b7Q~!TZKK*f#RcpPMeT`uMl5cCcZm+uBIj`1jkL*n= zp0iR@lPb(!GTbWgRsOMi!xAgg{iTYb9)}OF6zDFQz3cnxPv=u!s|jCcpK`W;tAFY5 zW0kQXw%+@0-jg|Ses@WM2HZt=6sIH(HhGKFj`I)YY-+sE_%A zEtB7f|DKe$zA649Q&`=+xkhbw1KQzUuhBQ2kiW-i_O99*I7kSQaf{%D?n@qI1Jd#^*UF_pGtsUYRtr zbYg<)vhRmQ4BkFEbnB~?!HlU=vI+6aBTg6Ii9Kd@AotfYe>;p*lRjYp3=w=*$o=6@HF*|yY<$syzIALr_2X*SFczS;U$3!bdE zFT3dXUtyNqg22=#Y1L9;eugS?-!7^1a{Uj^;dy+wHC<@(4PL#!Kg>=@Y`br|={~Dn z$AdfjHm}>Ur1wWh#EZi6`tOr`9a>iX$l7+{p@v7%q4Zy~N4BcH#k_8wSI*ZQPmGJ5^VDc}-C?`ds_O}V)BZF!C(l3DBjdN- zgy~@&M^NSMKl5%bIls8r>-S#Wub&pLFt?Mreab2^%bDvR``V?9+iUt4&0}0zUY@fv z#Ai;$rSNXnrB|81Td+CqZd14K<6zEXT3??o@byOY9EGP+Z{symSg!1p$=um6yJ1Id zS8Yf710Um0A3IY;qWE^Cm@Qqc|5r~S>7UE}@6MAyZPE<+yK1F!PQ8#vwi;{TWbu9f z8*HA(s=ohab2#>8`^?n%CCnL1mulE5N&0@7kv(N{#3A;dk1M4=z5g0AYyOq{QvM;5 z_YBWm-!{kTSfBImn)JGff-6^ER;zTGIF+^9V!=9zDQQ?TA-VC~8BduwulW4= zCCfOwbH<^+)hc-n4ZfkKAAC=&n69`q)@eaRgx2x%Ub%_2*-bTx%M0J>YpAGPT{}hd zm)*3V22rJ%tS@I=T(XRHxr@pC4efgN2bc~2%U=BS!gcRS;~V|E1T|+0=^vAh4+?+5 zEGyoB;#_}vaOSQR_Py@WUsu;H`cW2XwRGL2>6MT???lBeeJ1P|Hg#I!jgI@0-Fu`<bLJd_QE9PUcXRMqrGCur@axL0#a+VuDy6uabSIno!T`Ofz}H*cJDv- z_|LvQ23+@F&90MVk=+)xX5&VeWB+{~tzRxG`Ek`V-E{3QKP3vaC2GU*q)V#GM}=yp0V}_cl_;V;YU|yccxC`mMM&yTPJC^SgY@S?dR5` zw@!tv*XupJa(1Zmx&lG&bT^L)cZ{}sZ<+q>{(C|nvPBfP^Ze|u&U@+Dv)n_5 zf1}CHnTK{Cr^*#HtUcgbDeh|F5tVlNZsBK#q7Y?=3mXpYKe!@x zhSP4r&H$HB>IOz%u5NX^eEHj9*|?dCn`VB}TW0f9J1A-Eu5GJ(nwWHUvo+nA)ZOMG zb0__W2G?5o7q9Q?hUT8iDYlJ>dAR(TV|hT4#}k=1^B-?McRNu3S<$+km1dhR?NyHz zd^4YSM{1sOkL2eia~j_#NU@x$x)!y$YGy&sieo?0?wM@+-^lFetu~;-=Y$8);k?NP(QoUQR|JdsmQWPC);Ke zv+O%Pf1A+f!Y;?+%-NIg-Rk7Dl~^jfvc^TvKun`Ne1m3~@KVDG_pjdm{x)0auEEFt zOWVxCr`Gme*nMGw$+}Xmri#-uXS5nAg>5muk-#|V<5Y*e%)i`b2i5&;y54!!+s^Eg z729Gv(^oO;_S4pO>wKgKPOyvN>rQ5YOYavuk*;0;%c+>gdKYs9#yH;HmrEMd-c|DHy+$s&NySC zY3ACeubkq`l3W_^JAQej=Ad-d=xEf788550tW9%#oB#f=<%tJg#lgSkJY247Uwq3* z>1h5urW-lt_8(P(q{0>NAG}~m#WS)3*9UCEbXYlzrU;F&g(}AJnHO9-YL?z&>^>`>ao*S ztC?F`C;f3;EqK*1An&j}=ld=8PX)zGwGJr1i)(f?5fSV?nzMd$(>BL|TUF=xnas~f z(@Hw&9=)=2)|`fokA4?K{wdj?CldeNUFq-E^D(oMVm;0sxaKf3aQFEW1%{8WY~DKG z(d(hnW3yQ$9ddd{j{Ag5`Y9hNomXhe|3kHJVp)yz-ZEE~$mkodzK7ef{Yt;<&c(ZU zrjPrJ6(?$oxt^+=y3f2{&~)C>?#($BK8c(7ERO6mTI#J~y5q|2J2^a0ui5Ua>7V?f z@P+M$Q|_N;7Q8bJ)%?QqH}Uxo!O*E@wT-Wj{&(*#+4o;EgnxO&R;hz~OXs#$zizly zy_s$GPa*bz17~bMyBt|I^AU!zd~8 zJ9$aPkIqZ)PINZjS-Rk8HH+%ich@X#xdj)>p1ml~c!Kr$?571g`)+Od8G0u6)al1B zn|?>{ZqjpJk^E|6j866xH?O*b-z0uEX~`{aH@keL``ve+*FSx2?J^$UU=_-&y}abQ zx;h`vy9fBS9z1D?JB=C)UK*0c#rI}c2J_2hy6!`IH{ zU(I&(Zk1v8uMk{#GS;G^(ncpxJ#SH3_x_sTbmx$+37g!`n7ybw7wHqRs7J=i>-6{P ze|hh1g+l(+%Xx;ZF<>=Fxn>`i(z+bUK)(Lv{MD)9YpPOh9PjDX&sF=idV=pR z^K-AJEL7|iJMvrd<4<9>-j@+4N?wKUo;pACz4P?10mq%Q1*iCx%W=joHjc9A7Sh@u zKKJy)?KSDv!T)y0txHwzpS;zKN4?;;v7FiLqoFA(bBz{lVOn}y!EyJ-J2x{Yo!_o@ zbC36;r!|XTwB^To^On7IDV}bAV`;FI`tslN1*cThl^MR6>~=r;ns)rzy4P=)UAvqb zH9NFr>o-l4sDNpDZj;X|nRK#wZ01>ZMJeZJaNNS*C+n=sS^PW|a`S_@#BZ-VUaPro zy?(5J*e5;di7zHpus42qW$CK3ZjaUxk4Dp7Im)_kgQXoc4*z%>_5F0k^}ia$$2Ix? zoU%v{6#i7Wdx7dRarOe=#@s5EYlmFozt*34%6&27>;FC659-S+mEs;K%J z*e|OS-6Lwnyi91){cmoY->sXzbjNh9*_T<|b}Q=ibo^VjHKjSRp51E}Q}~AKD^^Zo z-6mD!j%ymDlJ`x~o*?(NTZmopx0^^T!Hj@2gjrF<( zFB4}*dFXxQIGrTp*)LU|xGOi9wKI;p@yg9WEEX=s|>DgTFc508eT#c5wvjczl=Jtc-5=kH{_fA{K~ z-pgm{zMGqyRYl4T8@HvFU6h=hWU+kP#LlSv34V{BJ9XV#(7&MBwQ0k}y&j?Gq;$MR z7};~g_dZFVb48`!l_Thkc%KhYep!I+2o|8WR^d&a``fnsr{ITTC zTUD0hQ;R;FkAMC5!~fQ_D8VV|vMrywIw$SXo?P00e)Zm^7W*0R^v0dp_wjPZ@d-0$ zyVbvr$j+amwDVTG=bA>1xwl&^ysN(U#2YRU*>ojACD&AW+s>o|`6_J^C1rUvYp!1Y z-cYEpHs#LJl|25v>!t-Wty|P;ALx*5xc=>Hj@vogm)6A0-S6a9R#K-vGpqg1rNxCU zebHwM-u6$PIGe@b9OH+bC2ed^E^S&fzcbn0Gr-NRGCJVsQj@3eZQsQ$ThTk^bE$Jz z()<`_Pj#uO&1E}fBK-FqmF`LSSdwAzr*`QKhClKa%ayx)Kd+I$(s5e2?Z>0&#S2zC zgj>xyd^30Q;j3|enP(SjP1e2ofPL5N<^t~r{kzux`}CY?PuA1z23&&MbZg^J8k^l- zk)1s0#>$)OTvZ>A6?5@Cf6B5-JIaCaL&TaptCr1~`EEYvdoPYplaKCTJ+f;3^vxo_ zJKCG>u8=biU88u={OO~txK!ap_cOWj#wUMs@mykX*5qAeUhT8o>K5m9zgp%+mn!P^ z`dvEZp;B^W<(3-9g-!KlF?Ex+w2OsL%y6x*xbdI0V%I^l?Pv>`=)>PboRCDCc zjK4BpJF1OxXV<5!-lMd}BK-}++Xedren*yk%iAV!I5ElY^s0*qm?sH%~ti&04r1eYK%{ObzFGvz-&v)^bn2 zvHMXMhwHLEYrnTYG)aFh;xzHx{dAW%84=Te?lXP$#44vQo=@k>pFI_Ei@pfIJv)UZ zbn_McLdKXQ49ng#uIB6vJ7mt_e^0KV_pN%W*(RReUCBAC7+3q=(KX+|&y-p0Cb`#^ zXZjw-RrCI-pW_UFFEG(b=OlOky8hgNPeJ`fU+h=U=CkX%dO|yY@q!BvD<3A5SwdDO)20OOa+>j2_+Z_P@4Pci4l~W; zdh_YK%;N6J`{KV`wP-rFVMfdpFW>44lbq}OCX_ymeDXBWWkdRQO2lO4y888$88kzRc18^>dlt@3L-&&q8tYO%<=1IS6=)4q*vji%ljoIk=r)<%xJM!Trxl7-WHy} z`vsMJo3HL`*z;EW(4Qaq*8L_A=G)1e3F%TIcIxL} z&TGrUraoxjTwY(ZQ9o-!@d_gzS@vYUbMvZeU*ziDSey5)>df=Ld97iO3(jfOnofHc zT3@58c5-v_eWTX~2lF!pXTONukl6Mt=6b@ez>c-N7vgoeRk$T zrj2h?#rA5iu>R`AaNjHb&FP+|o|(PnM_jjlz9srP^jFp&$)g9w_8XQ+pQ|y}D_{NY z?5+cg8*htRPrko^(`fdiKbc$Gy^DH{iYjlvDY&?c&-SO9Z=z!)yD{Hw=G3#t)Ar8s z`xRW}>EAl(WsWbd;zag}n+qwUo)?IGjPmk0T zu6^ly=++{(tK-!39`{qHHI|7xuel}cyBr&9aW z?Hg;3v3>WPvhVLXM(LY5vRM1xlkRaj1+ zb1AJ2)O@>X`xBl=9r|j=Jn|2`3fDZhtVwG7;=S3^6}~zj`|BRv`hm5tR5r%1(J)JT zm9T8l^p>q(ZWrI2!?62s?Bt|IZ^4sQ_x1LzpF875?1kx4?K8h~PviakB!9I}FwY^s zPuC?&v*xYN-T%KucGKZc2{r!z7;ddDdX@YqtiIo+^!CP*mm14#@}1)&&WZ z=oldKOyy_v^JDclcKvYYQhW3@q0L<5NqyumZHd!=FPyUFmp;Dai0;PHulsL`bn?aD ze5@>U(-dzqw+!cGBZz1L&Wx{Z2M%q1t@dzXLmZTGEXw-s;P^1k)dHk5aX{KjtVd45~|-IhCZ zNnpE2m(F`$U#FJqUDXSwe2`wOaDQ`j=r;G=F>kX|o84ktFDrc(`X|6HKjm!X`>>@G zzJBFzU7F&-#62rx1M4Pv!`Ho2YwkVkP3M*<3#@A}-S(rP;PC>nQ&r(Ff9J3G`%6A+ z^BukpM}h3Wf)_3aHP2w5w)&#lZ%2pQ1?Fa^q81WImtC@{6MDPm*ThYY(wq^&)gKm4 z<$dm?esw$l9h+rpTh30sd0hEv(d!!_iTS$UrL)rV@?ORptZ|T=v_$Aa!&F}FUgw=U zPq)8keY{1wh`V%^kN)$Y<_xR+ms}N}CwY8(e_W_s+%x96t6t5ytCLrpy);So?(?sV z`}vyBslS`3z#g^5W(Qm2tCw4^>D14a-ozEX&T;*z`L;@{q-P2ACj_r;4_^CEus_&O zr}A3u0*iZQYMNK?s7};W-_jHKBkWqLX!N^oE}=q6PdBM;=KI+;b%-&REbn40`+0wL zmXh?1KjjjB8Lf*pWWRs8r7!bqr|;Q)f0pfxoBw3m=8rQyeg$4;s(SK1w_u0T?>{M@ zS9P^+oV7d0YxjY>iym&dv1f1HiMZ_FhZ=%9pM>|uWeKY3uGnb3ROMN7XOgH{^`8Cm zxAtszco(j}{`f7==tJHDjPsM1vAk)oHVXgCr@LwWf&1x7>-pm+Yr7nsbf2~Mgj>w& z9aD1GSQXaK+bO5CUvk~~u5SMNr>h(L8=v0Zma|;o)|1z*h2p=zSbeE~^SWlKX~xy# zPt32(lgVleQ@ZxS^q|7tSwG`I%JAQY-+*AL4 z>s>LC`)xD3vu{U;)1}(7?!Ri{+YXi6ZG59crkSCzda2mGn}U{VkqcHFm9}u` z4s?%K2@CR^zwz!xjZf1fnSbQ1IaxI&^TVlW?|)UM|Fu26(>!}!sqpQ)Gw#YppX&Nm z*sQKxyi~c&Oy1*T@|2mU*i={~C1=i<7d%Jp)7b;x0`fO3x!xe%#<5p=PLZ+5&qY~P zQ@8i&c<0$Z_FG*bk!hWfOq!;X z7I`MYaPrYJaM0s@=EIx2&+lBW-L^Y_&-(8l^IDXaOfbp5I%n!;t>T`EGnuQ;JuMTK z`Cpwa_(RuQe$y{c&xRRa!gkr1Joyo_{NT2p%NJcX+N_mHoMFk{IjQ>VVb-e-XVt8# z!>xs!Cr=eTy6Jf$<;U`ZD9;x_gG@yPnuQ z%;8w$wtMc=BVS{8x$tiY@{sQREn0l7>E{Kjb4LYhOOyVuvsiEP|B|b#oFY@i805g zNG}b~ZDGl`Jak`B{IOd1syDJlvXN(BbP9c&y7ohm;mQ50pDf<3F5dV@`s5N#-KY0W zQ>{3rpP%g-x~l3|#{;`P%mo=g9+KoWSdxo z=YINdHOFv;NLjSA?@77Hh$_8s3*{_Lo)bBqdwFWNzm-2xKJ}c$Ew}q8lK;DjOndZi zgWZfXXB(a^S-<*rYNYDz>*<$gIImp1iRr(p`qG@l^Y^(Tbw1fM-jm|Fo&0CN<6GTl zAL2i*u2ERHq4S$&mn*YVI)9tkP0eba4}$yGyITL^*I3=(xL#@ri|{_tkFl2RR?D6< zUFut+`t=B2rxzf4Sbd6jzoW$Guv-R*032Syyf*>+Fqv+(bKvA0)$kbll|S1OUE z{&U(HhgWtUJEya=tvkf?-&>{I?F;|JH}5{3Qr~Y_p~pYZ?8Tfq>2*`fS7{2YWyvjF&iVDWlF#u47a8o- z_s%)Zu#VyWgW3Ps8|El~kapPTwW7=L&E0QTw12gsAM?@tNh#o{+aPdsBY$ep)G_ zpmRIl@YzJwhRYFk4DttpqdS%boP2vaUbte_veawJThDBWS?;SKn6YTW4S#9-gbUffBZxH3QtVZhL3w*{S-(sae01F zX}3oVv*B-z{Fp5&pE+yRe-_YkRyxj#WPRUDK8>tvYjpwPaKLOWA|kTYop| z8t%W#y5i8=DbqFd)}LIzb@n31cVBna8YV|Q%E;#Y8S^$$ZinLip70y1szy~+>fpHo3J>q>^bx7c^l@lZ{sPE zx;87uyN)?dP*bvGZ-8yE$*YbHs)k-a{W@1(laFvI#Nh1b_SEAu&LN!9!i z|GCS_GiZ0}8O>!{868snPM_zmN=y~h-V$Be{pz#j)n^t$r;Y2F9p#zTJEUXP+W$}Z zU**BZeXQf(gD0=-V;|1HV$Jb<#j9lJ+t(ZZfMOoChJ3xq zdG;*Fl5@g$+JB!gd4K=GuRhb6b7r3vpI!5kFW@6f*2C=?3Cq*WOHOC~_;7*4b&B6* ztCb%5?C+%}Sx!yKT1fYCPgKvDc6l zzx{F3qQ2{uE=vdJdp`yC4>E!Fi5oA>oLPwF%%b)8vKzcVO3Rdg21Uk0;=zq5^n4!$;3 z+I9S2aE;)3YdtrH*zF&Lo9BG({c=zAPVTqDQj@3;4AXaN&SqZVQV`K>bjw(L(Tq8B z@)|BFt*`P}EoHtxPH?wkOHtV+ByR-Iq?vW6uQno%dMbFt&rtR(& z`{AbEd9y8a&4+gz{;xb!T>e*BrpI{BZR5u^|D4vT2q#5a#jkfdJoAY}RsH(){(EKo z!j_85o!WBAq)Fx4s=qrkf4^q>bJ}j_EXOMh&%V-|Jvkf_kOHR zR!rA*l*Z$Si=8S3&W>UjcZv&+AdR4H4VeR&G_=Nr0=GE z(W|uiOT>h`>zz6S`NL0aKNK==J?nA{m9WIu{k*?cb>1{Ae8y+J*lI4vfB8TEOMbU)BB3P(+S@-&HpcL+xKs6TbbWVD~*8dEy8pEtTJY3X=b0F(?9u=%?7rr zmGg9GO!2!TDgAT$FUgH(erz}6d2r{OMf2B)%^oo&_Zw_)G%h>3e7$(YsVAp4K77=; zeCIU|bIyXJ9q&scBeveEPKoAYjGP>P^o)>?rVLZzC6;7W=fClulRT>x3Uz|^TCo1_ zR91Ms^vU0HnS)i;#=DYtrZx0`_6*DG!(wR%i*z&YSAOHl{d4hkyL3Wy?s@Z%YfgM+JL@U6>wBg2{>OHA-cBf1sGpOc z)Maz_1-s^*D@z;hhHI^mT>VDavb3T<#588@0h44YtMAV57#mKy1nNEc)x!FkKjiJZ z4-$+r|8IwH&EPAq(Cu$s-+%Jf6I~7dv~v%pJpSS*|A*^lk^V=AyUBlC`8G_rAG>U& z%jtlb>KQC|WH|lL+&(!?{-nrv_xL$ZR~UU#v|dPSB=^U!)~?AG`*Q2zOWpmG*G!qS zWbUi`Z>-qn?#`%5u)lKt?UDC!AI^VT%APj!>>{ITrrBjh-|d##Ub|C%>YQHd`m!yD z<93N__pH~K887!=uxsyqZc%Be6N+)`e(our^7l?Q%UZwc%wH=STd%iD zaP#NS_gLV5Az@)?$cChK8$$Nq=v$_&-`Jz^aE;HSbvrzHvonN`%>T0azx&BQSrRcX z|8(+29Oz!~AZMlGdB5FU6pNbpoQU|>0NWK zrr-E|>E5D!J;y$(e)|2wLi69r|I4f@uFXmNdB*IUvCmYt>yhtyXK^QTOzZb85;@yZ zI_doZ#mi=^R<~ct3JCw*8athN{=0o*md*bDJYU#eZLt>&S^rz(G~0>btybIYqym%8 zqa)usRc195D$KM0v;CO#%lW4F?lp&)w<+74*&caSbkln4BE^tnCVxL)*8br4N7(RT z|4i+!YLktUXPvS`vPBCzx%9q%(cZtv|AD>B{Eq2MkJg=Epysy(vW2b*sjgG}lk+$?@?HB|JC&Ot;(Z z^>D|wpyZb?r%BH;k}~?0F+Y7@cB7(q9N&dRwbKu{b>++L8pJnFSe;UG!}0SW@7YE( z6~nF5w8VU+wQBMmS6a%R`aD}UQqg~k+>D*ZbF(8KUM)(=6i%AgrEujvL+mxX?bR3F z*FK+guP)n>bdrOjEb&0qf%L`KHedoDI;-*($DYMrXHw`N7V$??6q?2dD%c-StmvP$Ys zk(Ya>^l#t6M?Y5XF?gW+@adY@krQvc`PF#uCey)np&egM-uz2jY7pJ@qF(#rivz9< zKMq-6|19`_*6~A`>-uIe$mpz#Z=XJ2F!+M_{ZnfcrK%N|*(|!UIVpYKCBb7gj;B|K zeqU6+^{fkn;FcR)sU7}0r}EDCYCq{V&g&0K-L$jSeRuZ?w+5S&7fxIKKY5+&$(lHz0K2gR0kMRM$W()lcB<*YA&YcUtHNNJk7#haxb5E zLaW4XCpTwxgT1w{<{0kQcptnm?{}`icDdfi)8^WK4G**15%%v@WNGF6>pLIG$nbr; z5-h2=()9#mEU(7PZi)GsrBQbxw@rF6@59-HWh?%a7_YBZIlqo)?zYm0l~(Kv>kT)= z-q*{l?>S_bIK9ZX?8p26_Dchu99tg!zchziYU!_2k7^z%e3|!8OW172N;$3iHCH!% ze9B|__+|ZNl~4ayIjWoe5|2}@x9wS{(c<-}KCfb;i&{nOE!GR~irzVW{ae33-(z1~ z^(EW?C-RSlvu)aTYQ^Hf9f_$6V~PUK{aCCtmtT|n%@zG->EK_}FQ+hEa+(}Ex1UMz zb#}_ZQ^^SdOTRzo5<0S9+r#Fn)xTes5o^2+Ej~V6_0M3&-M#Ppue$8xs#@8|(IT)` z=+AF1319ICMz`LIvt}Mp`TuWz(}eod5BBp}|6!lEvWYq4?Duu5SJ}*7UcX!GEb-}v zuwRnd|0z3mO77cWbSA?1%(MsF`L_!@tVvp$cknv*SEs6u^KKuv|MdAY?>viVl)fL^ zdmg?!;g3QK9y$go_m|y0KJT9Gq_1op4^pyAjQbu)H&`z|Qt)+2M7La!5AUS!&s|>q zZi!W%&I;~rd>>K&*Jk0PlK9hq%1^RMazutQ#P6`>?AU%^Yu)zGYqWMP zZ7G+%)o^I))?Y`z_q&`_-c~O4uD?*{>|MpDej-zu!`>>t;3|0k>thgO4M)eY&{+^A#dfy@|KIEmpeY^8=jQ)d-d$g{>X}4>ZNX4{Xp1${~+q1AH|GxN#54DSJ(%%Q&*yr(f-=*9s`-<92?dIB^ zOOJXVZ=oKTV!&fy%kZ@?*X~-{f`7Gc?)#noRI12sms8nQbav8&L*EXZdH;B`?$h}S zA6a%)AN_maX8ni#jruH17rNOwp6h66yJbYZ6ZUcP5-hsmd+hqEK$muHvwd@l7F!26 zRX*UHslDvsfjwW^X7^OwFxJ=r+Z%id-}`etrJ^vv{gSI zoip27J25e4ji{GN{FP_-%5=4_FK%hR*%r6OZXZ`b{84t}oT;DoG~WrW3Y#DtW4$l8 zOTqqZMwnkuR`u3=f3dwk(vN++V~{`l(-y^x>>*LHzQ@$J+C;k@UHWT+|8tkBZuzPE zi)N-&)tE1<%Z)v~MkqSTb>`iR=@x5V$iB}x+^}E#aJAuu(4xcH>@bIqg1<+u6{D1WG#>~m?Wj7xXT@07EfpG9x0Z$6-Klck~Y z-K`nCDKOE`UVDj0{E`i(Wsg6j*()}^lX6@>ka_;3(>1VPk zvJ2y?m)~PElMmTc*WPOhU(eB zi}vlcnDYH#Y)NzVrv#V!4^f;7Hs))u_U)R^lMr$-W7pe%HAhQ-PE>nTr80{p;CtFt z@9H)0c2+D6EPvH9!}0H%v$u|Zit1e{^itD&TDL+}R->6GPet%necow*f4|GtJ@$K+ zr%U$?6~-p76FN~YCe2AF#V@Pu_^kOe^!1(iE1FZ+Zfaima#K{WovBS;d%lM1ev`K! zO)|^^*IirfGxtTpCB`86LzBa5SNfggHPVUqy|#wAaZ97N#fcunE>0hl_I9y#UpXR` zCSS7=jX!Rlx3>H4WCgeX4ramsPw-6QHWvFYr?l{p^wo8L1wQ?}D|(!F{X4er zZw|gV$@uf_$IUJ_a%@WfA3Em;9l579@4?m8pC7+9o0n~QE849&#!t`5MtaVv!ymLh zC$oKdGH1@h{S3Lx;#p~iD<1Iau2^L9{{AG1-M=_K^g7;h*&-+?cW`Qk2HVq5U)lWZ z|HQ}tk)3)_*nQ!d#FZJ=et}b?{Pm|_zq&@v$2wi2PtJdB{@t7n*JqYkPn~7$U0s;d z@$~7Z%USZN7oyB;98NR)27b808YI3|zv2(CmH6U{F1A13Mg0QC>TV$mH79i}(q7jr zam(93B3$Y6Gm&e5XBn=2+x;q0y2iTt@6yocIqQBsEZM!&tm;(O?oAyWuEGzWepxFT zc0tN}{mG0OQgil2E_9e5ekgSfd)1+pZ>6mtNp`#6EX(tGz&~lzy>6*A_TWhxiRuRZ zM>l`;SbXi`yMGhTFt2o0`K8$yx*%m=LjB7+PyP>O{V^B1#e(wVBfmFqs+nH&yF;LR z#{2~(mI({XV^kJSyI9xNqZfNG_g}|f0V&o!?70zdoZqfq6FDu{*lzy{bN|ggHTpNc zNd9iVCBwk9clWv7N<3G3Bd-2yN-$iqwf9ayL*8ro9rq<|Zr`7OunS6iI_XG2mwMqFA8_qWUKk<`o z?TfR8dlsMkKjq#v#lXxRT!sls~ zJUznByr@xR|DUEv#k)+LZduB^HlA9;cVN%{_|TWCH>N4_SKqEsRdR0k4q7b#V(pcl z`rRi_CA{?2{J(FJ(1HD1XIi&?_v`&pT(mEGUGaunpSM~r`TTk1SKfQpFLM4fC$%ayW{7R8-CY4bwAR1%-d@A!fVQ^ORljWJMY|G^@=}#c~UmPJHFDzHwDcu%6Cm1JRqy zIv1_@bs_D=ElGxemy1%S{dWis*lzx!;`-*>6@jOWTUb;Jk4<%Wz-X8g`8R2g^_t+s zGarnl>uVLUpnJIrPgeYrdAOof z*;;k!%L$q9_)9-rZ$E3-d@v;0}a z#;9nOfPaiJYY#1#;|~e^b?Jp{ke1lK(uFFm<>5(N-!K@8T%UeS%i+}$`IV>CCz_@0 zYxRBnWX)wkIjxh2Unjrb8MJ3c*^Gtk9UPJDW>d=c&Ods+hkc8mT=;x7;f#9+Uha_f zGJX_pq}8g+_VeeL@+VUEM z(93dqdFLgUufCPoo>}_HMECt2wWFu?`zEHQC=Cw5E@iUeki>BUNUzN9pQ-0Tme|dsTEFU~~K4y|I zcz$D^g4#U6owLmtim$ckf0yOY%FJU(c(N`1@*W!wS*JXmi?W}!Bi5ce6tMH1_~nT& zudpphy6bh)&g4)3krQ`f_n0>@Jv$P_`o`noF2S@78cWVxx)ZY@TGX%Qc*#k*uNzG~ zcvE*ja|oMT`g56utla)Bzm_%HS08_u+$pys#$M~q^vH7?!x#2NUT+tUo7c3Dv8hu& z@#GhkvyZOIt1lOiiF&u1LrC2#lz-u2$IjZb!4)~a9Zr7v{J7-*hSu{o zafU8s$1Qg$h1uxxYL{x=sy*m8XT@WIe{O5e|K&Bhe^;g8)!SCpw;}OwBELVM@%G2F z8ke^`x`zM8 z_vkq?GShj*rZD$3ReeopN!Hu${GdMGJ?u~XL&I$>6H)}GnlCo}RdegKw2Rrs6CAbN z*4sJ@RI_hgNZi-`(mHG5@po+Z_FPtz*=u2~SlNH+mPP89dtVqiCsw$<<+-f7@$~CY zhOD)H>8Z0W#hG6{Z|dax-Sups7}L$y`kW^EANTYseEV3jWZoZ(*?)`Lq*@#&cf4tx zerCn;qr3mTw%y9*IP>ap)#-D*^F)%p4!^yB_qqP(%afEo>BL|0)840d&Q2hPDaA2b z%{}bzZ#A|ArTIMl^NN1{i9f(JeZyz7?KdN`L<9HjD9zNF;(WHS^^#tjuTDaWPL1%d zYAG8_flWpW6V6mhhzV3Cw?1fEoZe9PRQnn4I_;WI=kCmnm%bfvd*RnxuRFJt-I?1| zb$r^jWFF!D8-0Esmo1oko2O7kmv8o$nI`Eds0s;32+e=W{%UCw)UCp|}6>lsU~ zoydhxQd@3y#fmJo7WIhri!_~T#{AK`h1a}0MeOz3>ZNP*)Xw?K-Po)zdu-nJ+^OrC zAEwA@SFZaQey{Rfjzwa(^8JLl(#O}b^PHEPnZu{?@Pd-&j{R+J)hAp7cI7*k?@0a5 zkv!p#?WM^MY^S!}Nt!4s^l(K8GnYiMT$6gKp~>zq=MOno&wtahn8iFX#Hadonm}Qt z@sf>cbxyL?l}a^xM3(6`&8&$!qaw4k$X8qQ*<9)5EURacI!gT#H|~5jeI9r#_T#I( z-$k1<=Vt7muUGS`(yU)<)tWap|EDlr{^+pfP|!QmGuIMzF7e!0^QidoniC2B#kFmn zDwn#xRqYH-_`K?NT&0Jrb>)$s8(S*_-Y93b+Wmc@+~@g!hl{EY>d8xly^5CUlUEjywEH7@Isr|sQ@ve&Sh81d?q%Ty;F>apqw4qq* zzgmvC+MY}QPoJKh@T+6O`hN>PIvekOUlU&Pm?!Z0hR9g)&S;tEw$BZ+N*g?XGzVM$ zh_)1Pl!|zuKc)25&wpDPf86=4dM@h{qxA8DRZm$RZ_2hC^H*n{3%;7P%`4G+qC_hjmo6KkWw?`V4+Ni~?VXzrfsVD~AFOZ7kL-?+2Epon>0xgx(@ z=go% zJLlhq+Q-^H^;i6+9P501uKj%S-{cSTF1+2TT~sym)FiuXiQ^}nwiO3x&gSy?WE>ro z-2RCzPi)H1@hV<w*H!ZH zsvWx&Jh}b&CD-@Lsr8O+~cjVjg8td48cAvCMQ1!yvfBC^%7!S6(vnpJYo2)ly`yPj>`#xFi zN}tiOJnT!&iNOBJr8))xSxKhPd`*vw&CvKu0N8y_G@{sxmn%+^Yt>De8c1coy?OW9KBDO&Qq=&9c+yPsUhzwQ2>-R^j)0&!&yyOb z1o)ZGJoNI_TA%B0KTR@RsnWpmp!OVV!_#}L4{G~4e$5u%(b^**>Y?<5|CsVi{bR}L zM@?6EMN4TLF5bG^U;c4SP29N|iykE%)tkrS;8?nN!JH^X%h?vTAD+Fp5&17Y^S^SK zOv69P>uK|KJ$b^_s$t&cw>DvU z@*lV4OGoeb<}}K_O0Zgduwb#{RHauRpPoB#ujlMabA^~VZezaVrxvKbXx+TJ+Ifmk z%?!(z3H(ZSf2Fh(jnBMYwQ$p#O|ye01ysLiVz|6_vnco8RoS^ws+wZ=$`37?w{&jl zrYZx6&QC|U4WkeC z7k8%Z?{2xX|B$br^uH@*)0WAoPptR!9R^H9A-yScSv?1C2_~UyV=CY!F(Tu-l zF1POSn{^|4?mL%VB~vpeE8Yq@(=~N{^`__FoTb$d7hPp`cI>fbRPFDT<|->VxxV{u z`eU~Y;Sb+<4@zs#6-fES+2mgrH<>$~Q*{~l=dT;i?~GJEY4mIL(d!%q@2w?1`^6`{ zd2{k>jf#eq)6osTu5$SEvp?~A(V{)WN~T42n`ZN^`mnpz>7T1tHaaXffBvLgS#EAc zzto}!1-$}Yn)iNhwUeHycU^JYPI-kD}U00;QXY9zZIC*n?$`&do@=sbF71+n#kv*sl{24w+>`F{U;Oj5 zUw>{g9po}vUA859*J_2c=lRd%$jqLnRig{NBaty|gym>dyaIZilXD9pB?sKcX8iub#?%@YJ_#&Hf8g<(B0Q*OYf{ z*eY`NXot%B7L!@-&v|$Fa)`+CE50-A%qi5KwxsRY)8I@YOfkx6JYO>L(Fu4ITI9O4?~nyl`Nvz)X>+H>Vl|&3h!* z_x7GaoW@-fm1wJzoesjD>N|f~Jmh6c|Mn` z>+nPgQQp$)Mn}GG3GfXw4`-{`b+N zb+5T6So76*SXJvy-Do6izM*b|zhT+B;3csJ;(jU4hriXWbMnf6cRlOfhg36nf&+WSMYUcD`DHiodqE-lV2wy5a;#pu+{P={T=Zix(1o;$#XJ5@HYUei^}@9^Q(xm{}rnZ8433;_b=ZND_nfl#iB~h$+k~$-3Er}G;zyw1sDI8 zDW6Sz^SUqk`Ul@f^E3I6+%G+=n042QZEncAi0g|AGfunw`DOj!K}>IDul)JbS5yNu z*D61FoO!L^a)zOtWs=bqh={0`dwq7~dsPo$! zsSAc-it8nRJEp95YznzterxhK<4xSc`UPfX?Cftgy}#DND6A>w*`~oN+xg=u`hrxaPp$m%i;fesyBB zWZt8hWu3h&^5HC(!d<0}Gdxay$q-3xo3(nn#0%TYPND2MD)(m@-(0Hl=0w=MNjtqa zzt1YWqgbhG!1KP%&>*1iob-q5SEZ-5=~l;zZ^*5zvDj-1Tgd zu(GYwqZ?xHeO380G+0(Yktv(Cty%DIOjYeVuOp6YPgL)=tTNKnv|DYh8?JolvuJk7 z>_hSAZr8DJZr<`uP>TI)(d{BR89x7I-5Gi9(NcRB7i+n{l}wnh&GFsh1(JMUnqOTM zG_Q}`vqPU-B=Dk7XaA4Hb?V+i=?NP|=f$kOGwHYP^N@njPs#>&Vqb0iw&jt;md?^& z=VokqeECz%MQ`a^;qSNaE}C>YFil(Q`PTh9GpAa=Gupi>RCmv%e|J6F*K-J;`qmJ; z*;4-#3*YJK0Xi0MzucYPbh@?5*gv=b`@pl~?)i*`l;$`>$t=lX(BJJPFUdDWH0OZcc6;d)b-9 zGX*x6?OLxCC7c$lit%;{zFKzCsxxlt8U5!cCjQyN?YOjgrDk}es#9U#dB39L&UHHs z+VUh$-Q@6Et^HK6+@Ejbs@Hq&$9fcOJZ)?LNB0xs4C{Q+tS#5V5Btt_ndFrnJ;!~O zgs1Dp$pX_BXGYCDc~yP8z0&Nkp5IF=BbwitsOvQx@61=f9?q@2`|KUQ?~uT=5n9Mk+ysY;U< zIJN!#qq1h>wB@glIj%jiqkB!$0}`w%t9bCb!ot zLoBE2U0>k-6_1!z*R_4xxXdW^Twlp6U-z3!enfEOM2pXvbltll@Au7;$Rx()l1A~j z*WPH^QnCM+*+F*~%}eV|Uvr2DE!~}V+D@#jIBda5P1BASx%*}{G-tP}2X1;`VSPfZ zIoXx@Tu!L*(Mv1k8l^WHM2AJ0w{Bag^>+RnzY{avmd9p4evy7`OXc2uH!Z3nC*;O| zsoA}|aq;7p-;YZAJAbX0V*7L7@85G>D=+B@t;H_0J&w+|&{2NvTlDIA{wdwHu}>bP zEcxO1&c?%F`)qD)_bZ~xXEbMo3LkNs;bz>Xv6GLx$4B=s*Xikk9?#uAI4s@%YjKjH z>7zP>k1t=y*2-SI$^HC{)x{T#y$P!VW*zk2+`S_2ak%T#p45bj?j9>P#_UVozg!

4mlz#QGK7ZhzfA7J3vyZ;& zu70T<4IX(j4vW+armXQOv|n=h2FIj%S!^nQJIZn$cYH10w?sQc^{?Lsjyd;ABNDdr zZ@HfCChY9eoET;I#zn&a_Jd2D>ML4Jj7@ZN7^h$H_v*7=vA#bpeAnDp?Vlg=*UEm? zUaoP~i$O#*{YKt9&Nqj>xy2pzPq;z>kbe_b8R@Z8UwMJI6t)*!qr~ z+phJW4f2AR{zi+Q{F(CY;8Nc2D?(=9ULNrE=H1^fm3QB1;);-zNS^#wny2y9TO~i*PKvqd)K+-aX`b5Ta&{N?z#3wY|E}H z!S+^1hBq5H+N{2m>ebwSkdnIe@0Nvj=_<-ig*E3md1W_6Y4KVXIqwNF%UpA^%Hct% zrU2WTIg-1VIlecsR$Z-M;N7vv*WT`BO6I0lmmd~eR{fai@U6DvL-1dvYjp~;;f5#9 z*0?>{ezTWjtw7d<=hK8t#rH7mUKC^c!DzO3+4cesR9j z@P%vPW;V^u?8lTpd{zp67*+AKGJoE*&F3GoD*oAc!>iX|+OfZUhjw}Jo!VwpeJbFx zW2wul*XeJ++Y5hu^;Ti8s2-c*n;Z9q?f+Ch(BoqI@!_UuvsdBIN{jL%S0B&kIP7$= zX>+RGy|{AAi@^^>|L;swwz8Svy1{IHx1468l>U-~91jC(l`M0TULQVR$^7E4R#@-1 zSI2aIsVJr_`E=#LyZM<`S#QGl@4oq@#y8(Jz}4j zZ(jFu!gTd)f&C@?>Wg1GFnGqjeDX7)^|v0Y%&+qiS|+cbA3GDdzTGe)@ymIJ2cJyi zw|Fe(G%;9P7prR%zEUhWBVT{Jaat)`y~$P$@lG|p8JE(lV|R3ZDoFjgBf%`Nd2hHPkecUMkIIXBUF>P-pdY?lZt`}qC?=e!S=V+zaUw~-|)<0_T4wKMr=eK1Y@lI<(Xw*C3yWf>omZby6q-NxDz+5EQmbC&Ln z`?DsNG3LyVwmE$}D!De8jcwoF&OHl*-F}z+v(J9rt8mVn&%NUpXOFbplC|**e||`L zelYO-o$tG@iCsTy_p#x{rQKbNI)4AuyX0H7T~>ul@>JXXn-^7CFS+d89?F)Z7?>&D z!|YdXePQdZ%%CqkmPM1A#WI;JKdgSx*ZXqfn=PSj4C}HoH9TF)AFWN>k+aokv0>HH{bV@xE<3}yzFIz6Y_+;*R^sdPpSW*? zS8jj1>ZNc>zUS))$JLcyOPK3>1toE`eamk1zQCUU^UHC=?6(JHY|yVc+2tF;C2O}TylMq+-B#ZI^7buoqi87?qia`{zT z@L|m~JSxq>mPOyC{9JiYGx7R-t>Kz0w(hXnlAhOwucLhw_83~* z*2qeG+kH~Z_+Pd>F`|4AS7q?^sW(pMXy3iqdjHxPN!KVRo`beC{_bAz{Cn=xtr02{ zcfF3bs$rilwr1Iif9r$JTZF4;NXZGHOn zyeF3*9kw_4Wce~??Wd0Yu@%$5J>S>&D&>+li~Lx2)M1%Wh#-oPMe6R(0BKliK5D zPA3C0&3*4~oX1mKT~N5qD4{LndFAc$z?C}JHXcr$^2Pa~4#P&(86U1Zciu2#&YQ0D zsVl@XwR7H2X^+o;)cB~{YqpnF$xN9p=05R#JSr>gw>GU?uyCIZ+;*G5o)!cbOtntjIL)PNs8j>JCY7td5S7Q2y@0;`d4VDX*=$&%#5T z9JVbD=g;x43cV<}_>YIcdevKY4m~_qO2wR4E@(B@-rXPe`cDx5$GtN-CAc)}+a56H z>?tp0Pi0xEa<_W@g5P1sPnAm4<_PL{ELq)ek^h>Dx%}hoSyBdPlP`N&Obxgd!`A7r z$o@s?AI;UbIWF$)nj5z3k#_0z+7qq5<{h3#ww*F-+#J_!wNdBhkBIB*9@=V6`*~`2 z{f)gHT%IxS{#`9z^Qq8T@y((|pHdH`I#^u#X~DZI|G(^w*GCh&W@<3aSiIS2^%K|m z7BjX?p7nIX6vauY0hX^?L@MKrbrMc$@Ht(xyL)nm+10e1z9mcB7sTAU{;=t5`})NN zJNCLN*UdJHa*~kJy>~$OKmX#pm*zEvD}6P7>e|oS(5950tlF5@bW)8WbdTFiv6J`i z6iV|yW%`oQ(9$6ARswfsZMlP9}3TML;VSeLN%>pM->sq5YJctrz>lDO6eCNh@9SKK-D zc=kKnfU-MRtk?NH60nLWt#h<*in+JMYWIW5KkG77FYxW*SRi>uHe~L-BGI=-89cSg zI`bXnQdTW(UUju%Wkh25+Do}2i~1D%4!ra)ylL;kzm%sl|CaXZn(ccmggkgPvts!l zSnggV$7P^t;&?}}zwfy9`}J$%Z&XM>yS;H=z4ZAVMRu9bes5K}`b^1j&dax@x5b}- z^z(XlI`WGpv)Z=Rua9sas-60wnSXk-hTqx4>|dQePI}yR^^Q$ym>t|HV67 z-tWwA`2@+?Azwao$D9pZ<1?!}<>9U!zuv4|Y1nRL%gI}?KV!O1^FQO14eWVK?%hf@ z`o80M0R;nCzuTsUAFN@OX_TH$t ze{Nag{F_&kPpgXd?R0kkzdh#q>7=*mnsRMlp8R0=GG{()i4jvQuezm5SiIg8e|n*xW=;Mb30*Ejq3@oYTlG!{+zF04 zTi3c_i6*rb&?U-I1GQrF0qW;?)EzLb;@7I?v)7ZTtGkfP%!*KtG zgk2iF77J~%T>rga#~@T+%DTbs`J}*eIy}q&=!q{3{2*j?s!~tx|9d(8O3{?i*&W-A zE{Rm!{P*CrTjRQ-x7V)SkJ#w`W6e5YmV-6dgeJ&8m-_cRb@^Ux-#a#*zEkh-3w++` z{O|s$7{~v+?mZDsdl_#fps(`d(2A7aFN}h^>}T!6dOv-Ac_}Tubn?$By&uHcJlO)b zS7~aWGn{<6NOf2D{&i{Uk0)#YZueep<#=M%yUeXp|FW0_d<~XLbUgpZth+PuWq*iB zzWk2R72yHj{QvzAIMikENBD)4$!9&YxBHhbtm9Q#EZe7dOy|S<+e#PC{&5THl~h}o z^v`y-s=&AC(*OU}zCcm9@S~|Og0DVRUo^QvLR$KrRPnA$0vTJrO2sGS1@iKqa4@s@a*s9Ex($nSNbdOyZ(pq!#V{Zp9 zd$6tj1Xj0m`7st+HOsG`YihcA^Xz=-!V9PG+zHuPGa)YKcK{M41V43s-qHTOPPly7Y+4i)JZy#gCg4Un?>OF4EXHwf1-Qe6d~ot6uE7VZFY;aIXRP@t-1)75e?h?f zgksS|zikUe{L)Wc6t}QCdS1d*urSxo>GWmBIbkPUUk01WR({>!n!L{Isa8rt{=vUT ztlehzGHy!aJ#t&;zkjF<7yDg*?nhfJU$5b|YF=~O>UH+ds5#RAx}V>1{3crYv*y*@ zRf@|MpZ0BHu3snTdF1t3l?A@350AcPv)#NenaR8DT66 zE@%7&$11`U4x35W>@MM*2kY4@-bE9?7)6*`jzmxj4=$hhNo#_3? zUhrM%FjG%Vczf90;D}||gvXzjWU^VR6uoF&_+I23f1Fe5yl+3&OnTM6?`B`O%ASgj zt-oaFiQl^alVf^ykWtNUDX&S>1-L(nuUVWMVr#WaLZYw1^zkI#x$=dDD($Gep1u^xQnAFR@E z>3!Y$%$4@Ez0%s2nl7{d&5>I1e(uh#2c~`2{-LwrYRc+!OX@vjuKv6mHb-xzzuJXY z`z@{sJ(9b7_P~L%(l0kphfaN_qII;<#9sO9H0h^{KC;j9wN_YhY|F|$?Z;F;Y&5iq zH&`*l)K2rOf#s_Y0d03><$o=aD2)$x50`kOAhx$bb;++I4!sr~H5WxTJdQc!7bVPD z`9`2kz9i?&jOR59ayx^jyip65*r54k%9Z(!xBXi-e@vB}u~>JhKzaJYQwG!I@47OJ z&3u@!^u^1QZiRmjx38ZSS9J8;vR7LzZhrJ)?~FY!>9e0x$b+?&=e3vr$CHwms*Dqh zKQJ%hU3(&>+P_mV;*eTpYUa}P6LsJC-vwEjZ_er|{qEzoCxo;2<<=+qMeCmI*nRrl zlU*X6b(S^KojbFVr1w5_o6w!`m)*YWv%31kb#K4NEv#%dO#gD&{>290MJqM^8C2?C zusC||cQ(*iR)4%XTq8m6o;2&_UHfWmmwYSw<3|zTITwS87~wb z3ZGe=vyYwk_fpr&pru7&zZb+89{n1fn^d~}vr1Kk{j#sImzVx(pJZ{`amJ1BFHUd! zYrplwtG~5Ra*dzY@f+9d-tcnr5{ZmCUxk%xQV;#i%4#dFRX%fU<&ypq`Gq^KeJo?? zU-QIP%S?FdZsV`~v5uSHUH4kP?R4)Cp5OHbVdm8bTYiSgn;da_)B8oqLrn7-ch`Ei z-YwH=`nEDVSikOGoW=dw@bHO+TYmq(&2P(iIw6McC3i=Rk7PBvCz>8^^E(UnMk zWF+?GSFKWFbnfLnomYfERbFbFed%HN&A(Yo-BwTK<{oGB_+{&^zXdMC4#x%n4w zzsPLczWz#(kit{n9af*$7EZZ6b&X{C)GYR|QC6%I)2GBKCQp>M-;DG#`HfiN+DWaxdM=Uf>?U&_ z9N6tqY%0#Y?$B2Uk?D%wQ?@In&S|{$qD^q`0^9dGd4hL;rYO(({rdRUS1%5VzCE@) zYjx<>&x|{{gTnLV9Aw{!Eb{Ao^YL)r?PKe_x}J(fG?tt%za1$eq27wZdbsp za4zmmcm1QL^Qnm(j=cN6>}lNxu02d2?{q&(;I6Q*xn-D>Ex1@oXVpWk3h`2wx6+es zmS65@P2*m2wA3_4dj9bRlFRyUd6WuG&@cEmQ$zaB+1zPgnwqx%X+HY1^6v>wiET-| zlNr-RBP7)7N;Dir1T6k{uaoN96&ikFGGBSdG#LE~k}h$kFbVT)lboG)_P=86 z&Ad5&E8bX&EDPw^wm6PAEU?dDduyodi?fSYlEoXGq9ryX} zn4;8tA^cYy`|I}4w;I>H5HFUxoxFCl+S;cctG^xa-qbC~#uBQs+*smB{f#S|Rd=np zyzu*ef6FILe-_L>8_0a=s+9a$_uHLW{}mUnwV3(eLB6C#&#-2SwVPedMbk^(vWB}G zHvcQ=*>Femic)M>Tl6!B4}YF0c1>-MU!vH1`OBhS=Yv;%b#kmK`h6q9q_bU?OV3x; zMZ)OY>WkX%n;%}umDnb^+VYdfT|dvP%!N;KLUuh?{B^UI_2BG;9g3X4uG^p4$o*u6 zv~lL7yhnZ2SuNSCIBMUR+g@S1o>A+?Xy=NPT1Ab z(51Kj){Q>rlff)@by4c2*Y3vj3rKzHomXPfb9vgTG~G?k5$6?~MgLXw@AmOqRaCv` z`SmZm%)WfB`{H}We@fc)=6P=Ca=&kGe&k%TEcpK9`?7j7Qa+Ywtzm4i?!0W!!gozK zdAF>el)dzyl|m(AiPLPkr`575epdd)YiA54(n5brB&i z3l95Yf$1MIUM|hIiujtEzq{zR;zVaoX{9>>YL;sroa9aEpJF0*=;D(#o8;}YB9_!z z`kS6xU@dpACLq%>Q+$cWxOyb_p zf>~-;q!$K1*<+Bw$r^OYdiR~GwTxTl?_9BUw%wy<75=Rserr3iyjgW4^n|i3)$FIVo@K>v-_q9MaW(Axth*7+l5U(5 z^A=4in4SBo>fhD}@gb+n&1+SB-jwaWv#qHv_`r=n3$j8*FV=jIU*l2na>1O{Ca;CO z67Nmx&oR{2Wj(5zL|9AIp258RM@apaM z7`BJydnT0JJ8qsnz5A5L$4xCC9aFV+ldp7@dS%{?di&U>wDcA4@$*|2F4(sF_sZ6Y zX5D1*1J0F7F-6r!-dvC4{=OpJXzd2~8FN?_jF@gu@lXs_VgDW0cOv;RU!IDsdW=<> zwEPk2dFKDFSWkMm<>3_D`!Suyr}}mmC9Ro#!}YZ9<ooDvgVdADxFxlXuKfSBRl+|NrC-?3@sroPNL@z7R!W5Uw8DfgbKee1t#aK$6} zFq7HYDP3RRO<|mFbgr92an-8lY89S4x5zx662C8Dk?`_6D`GmQR&PGI^=1CILpMFw zvql<(tEt|sE+~5AVP8^X5ZzQ46~^LOzLot&<`FsTto!#o*9jaI?pmk(ibwKledy{> zyX!^%%sO2dp7HnR<9?poQT6i;SDBS7PBNC~-8J)Wagwe5@~2m0#iW=noH*&Ne);Ou z=(}#tH5=?qE`=s;(a}1(C*j{`<}LHr-j7+mOw&Q+{XNMDMj654=+~R7!jGKu&YZqW z>ePLc+ZOjFSpL1x_{e1SoGJX^&4NmYJ5Ju-YdU_3PUH15&04wF?~~Z=jc5G(?wiit z+-VuV*3ncqYv21za*-*z>wlzFX;g1sGqIc@`@#gT)s~k`_e2Psn$aO$RcgH^t~7pT zz}|gaDHB^{onmI%rg9%$yUS(TdVZ_F<`WIB-n#NzwRG;YecS#$;c+y6cxU0HT&*Qj zGLNq|`22T6R_OcoOGa#GKCt|F`!MH%*rN4py6mj3q0WqapKE5$`t>v4?Qo(hZ`LQL z_o_Zwzm4DB_*0hWx=?M}(QcDdY+b6x4;*KtzI#yY8M$?H>ib_>PeYG(X~_$pWSy)O zHfLVtqtx^B_qyfl2j9Q9>cHF}netGp>|&nsr~iJj-@D(Nnfd4Y*7B@F?>_r?Nd``l zIU9W>Nj6Yup2olB>bYwiUONj&>0W=HtC#*)?81||w$q>Op8SeQ@wL*-1AUgCHiW!> zALL+Wz3ao0f0M5HetgU=Sl-;Tqp~&lO_bE+bE9*fud$nI$w}w7M$s?->t^oi;?&>U7b7&+McJ^wc|X&=YK@9z zCPv)hXQ$!yZS$*sL{rP9XvfZXauGgZzeTuqo z{(0-ge-~MQ)_+tK&@@ZGe{Jg({+_K~mySGH^H!YOOLFeil1bYCmq$!(+1_;h-~P;l zr{%wKh8RxjSrk9b;uMR6W9W*G?FI$kuiSkuC!g!H;N#=}*LH{BetrGxf#6gB{&SvH z|HTuzjPIL#d*?6Hp7+y=e$-2~tvSW^%wDC;rLvaYDXi_|#pGYxr}o#?rk3^^eEhdO z`q!t^{OL^nGyeOtu+}mBc%L7+#o=h@tH$lQ_HV^(YpOEO>U+&Li+`S{_4A07!6na~ ztnazb*}5g(JEYKdE4H9KY45v-Vny@HH&^a+`(s((`t*A9tBhrdUhG(|^XCJ=DX@IHh})+|IJp3r|13oZ~;+dwIsKY42<|2+o)J*75f16QR(X z0e7vJ+fSVTd-XOIanTcpluVlBKFW9dmwHz-&dp1G_Uc7mbIaEElUoYw9li@%vz}RM z&8sNOe#+-~m{7#O6%#X`y<1z6bTacmHJ?z&*Vy?x7I?bqH-wvAUmh4C{Yi zn^M(MrSK~D{V$I6d{y3{f6FJ|Yi_x|+wODm+RxwDC@XH)Uh3-Pt3GS;sh;vHQ!PEF z{aa_#ARSwu;IZpm`R4cQzQu%`T~YS6bc4$I(*MUcEtr^+rL=9ohI_M(u89ezxmS9rq*uu^s`yAp)+oL=)a-m+5Pk2efz?lsb&?8uFQdwJ__s89^UH^hq%Pa+g?ExkXnPl^(7M ze{yF>!2W4>BQtLQt9h1r|Kx_sUmtxBy%fsP=#`yzZ&|S0(hV}o%}mznM#!9 zl1(d&Cn?LV^?SxrdDSFC;f+SmQMp3BKWSB2wMz=->59ghM*rI2>ak(ZnvmIvcU#}i zUhw4QW54V|BLW-d1$&i?EA};*zBc~w@xb28nTNkI zXNfiL(Dgb#<^7kV#RUTEViw-{>GWbtWN)A3ggrMIw|md#OO0N9N$iHv);!j8UlxAZ z8M)#0Ai3td={dVi7x?mIupKzt6L5Td{U!|J0S&%h|0t8eS-zTJxWgZ^m85-03bA zmrt$f`QDZ6+|OwFzG;_f_M@eY!lxwu7ka*Yx-H^ov)wU>t;~zFfbZLnPb=RXXYBW@sPeeg%a|=a|B2q(1BRv!`2s61 z-E0jMeRuj{^vu;hf=xo~+l@t5Cfgp2_Rk2JbYa<{6#2XIa~EB?|3WZ4eRn|8>vPuS z`5l&p(B_1UwFV^PpQwMftQS9kkAB=vUW$bOC6^-GW8LeA`G zxzbNx33?gdn{rR+fOt!!?)DqcSQfn$(tG;MA+~t#x2v(g=KOrKS4iJGFq1FYcGCVU z$=ND5U(cAPF0gagdj0tlZm_lW)!3 z_Hybg#;=!uwzFSoKV|pHD(0tjx8rTySROzB<68fw+pGIes+NDb;qrmLN&jZeTkH5u zWn20OlNGvu&8DVr*5{wTYPbDATZezYmnA7RX1A=H_u-v;^@o^T_Y*gJ-BjB?goM6s zU=q$a)LX4QLFy61tB<_J>%7+-Zf~kSK1o9VSW;ruZ_Q;Adj(gz7|r~=_sM$SpvQdE ze)ny9)KWENKSxjc&xL>glwX}$X1zmr<YY5RA->aJEo0Fdw+#*!uO>z>dC@WV==|=6 z@{CRQV&-fWyC;3oPmb5ZDsBEev3r7Z_LwXY|9|r<=iehsWp+GxmY)%4l_&l9l?$)& zt|GD9@?d;AL5-Ta!RGc#F&b&v95fn%4arG@SPcJt=N#JaGr zR}4foChpPweS-81*w$1(N*Y>L1kI0HWDY-s&is0KdEyeeftjgEF)cNQh&Kdivd}4!1^Q}{_ z6qcCmD}8XwYm!4}-?6(jFK?9^cdqWf7hrzn_7ydohdpW*e5b`iY`$tw*?e4E_}CYX z@C}MyGCeLA-q!i-|I+z;p1NEHUvc=%zVJNr{Miy2k-vcV`aUw+|9E&VD7?~?~c#ets5Mj<)*)7=W5K(>n^9-EL$Gp{&tJc zgG2LPMQ(qdI?;NvZkNqPPtoU3JKm`4InU%je|qD#4#wB>MJYcV{rCZ**I&)bgYhCiDA9LW9U;kVseabZrcdf7#m zwv>fTd9%Y-*G0EDUR!hD=f=M24XNvAPr7+Py(p1!gI5CI|9x{Od2&>&{j;m;DBrgl zVczV0B54b^SgrZWsJQg&lY1vb&s-2pdi$d*V)aYL;{^+&0(ZCCJ}cQXGo*Tf%e6<3 z?(Vu*ep%8oSTaqz{$1+)7c>^mkT6r-z?y4)hut?yn?a*p3+Ra`$uP* z{k->2v2gG4wsTRgFPO@(@@W|>v%BUTOsu_M8fPW5WKEyU%N29quo%Z|=V!}%`M~z+ z#}5Z5mT{fE5L|WmgL%&kx82-7xB6)`eD&6!RQzVk_sMaBvmYGD|FgqTSoSMuZ>-vQ@tWNXzD&w z!`l)|t3RptcIo-sT~Tp)w7PqX{R!9pzrQyNEB*BGD{u37{b%X7Z>q;G2CK`xUy&4a z?oLIRW2N!N%YKeov5mgVRW|;qU9OV+gfaEwf*q?;zx;Yq9vUw?Y3DMpZ<9{x99VBK zVI}*YHIePUuNH|keN|CzSpDMT@AG!8sgbIt*VldDlJa@gG5t*;h4I0KyLqhd2A+ED zoAGq%cij&MP85X9Q#o%J7Wj7F^x2!kLY28M8OIu|{Ts5}B$T0i1GnN*-hB+Y-Zj~+ zY%Oz2$`a;pV30k0b~SenZKcnR2TzpCaPf6F*ZP_U?7mcRb^5ARS3O->crOY4 z-u|G$NaR}j-Y?69g6COIZ)7g#d)LppPN{FRXsDg-{m(*us=9O21%22&CLK6d zBhy=HaPyq{t)=ao+zuZSYMash$T{lXM3v1;=FVODRem4$kJ3ZFO{KmX;My@|AUZo|T z+Phi%`*XGr^91yT3Ou*Rto7Nezgo2Ng5O5}+x!#%)=m~teApV?6Qi^5Y1jeXsGp_$ z-z*E3?LNQ$mbI+1b7`Px?4{d`#U}y^d>o#xk4f0sE(*_);VG% zb&pwU-G_+Hf~*z^cD;Yy-bSyxwW$8z9%aY4J0ef)A8A^M9BDS$od5TiuO;e+Au#BCY4`^*a;l+3x#C{^|-(J+H$m3;K!=__)rRGWp-F zTM2tTjqj!{TIDXhLh_07u+29es8`QursX7#6(h}F=&~Lq}=;j=LL5!{`Yt!>hX%H%5?W@@tNzRH(q+Qk+_H9>NCy1<2SoExgU6awq=c%D&H09Yo^=XC2#+| zzm?(F#5MQD1PhD8pH2VZD8^SZqk0=tvgC@w3nsm5o}OG4vaYQ1(AB`*Prv-zSaR=< zK#1>+#j^Sqwd*vp9~S(J)s>#|kYoQp0o?_6W8<<)ucoJ^r(YLwkeyz*|J@fG!xQ~4 zN*wMsB}u5Atd{d#8}r-mEOXtCy$cGQ+gINBHbEj{DYL(((B93=Y(m<%R9D^2T_00> z?4aDu*Au=Jvd3>csqM7nue8wRXzl@E>q>`Wg#_S`qO>^B|=xutcezehJ%cesoYp*o! zZOyThQSJQO>>J0NzJ*znd9HLEbdBtv&8rL zoX^pJCfuJeO;72T?E&Z8QnT+~%qw}(+uUv`8)jmiedo%rOP4tHSmQU$wz1nOdW>VM z(?Zh@x62ppe^;yy%l)%Vx@_+CBlG!$|5yB6c+*r^e*0!UVTJztSH-f{{@c~}sX}ps z-|b}+cV3ld-Nf)JrF@-x+m@ZF<^R@wWenkx@4mh1hl)jIq1%p-qa7Jug+C?KmVVgG z`Pb&JAIGiR*SGHa#&V=>v8k8xOM$?t%DW#k&6S&7s>M-w%GQ0yxj8d;ax{5VTet0d z`H|v!7EEql96JS$tT`m}Iq$}yLrG~T8}8kGYB1wU=&t0; zb3WTBm6o&4UODGhFUP&rsj5@nG8F#TnN|Md*VSv8PgCXP=4I{hQk^iV?p*zhpJwa7 zb<13ty8qVdVj;F`+iYX1j;#1`?@?U$k8F1te#>)@)VPBds%BsCUiMUk%ObO@JV7n* zNq^OW?^~pwI!th6&}F`RvLIz^x9;noFE!W9eg3&R|Hd+I|Ms=cMR{AAZ%%E!x!OT$ za^)$P^;}*>4!*j%{5;%m6>?M4SdMRWsuM5Skv+{=N-=w@@~zIby=JGQM0%HA;^-W4Jk-O0VNqW(oIq7pMI+e$gUc zbn2KilX(+A(?fPSmD_$_IrXAkKHTsxI6J{3Ixy8l_U1Wt{*B>J1K$4S%31NGzyEC_ zxB2Q@ff9T&>Z(t@%NKd@jX?U0vO7CZPX3b2jUdD;rD}e!Jzn<_^=j zK$Dj5xbA%4&KBgcZtkRy3_H$Fy2tx%w|HU3tn1||r6v5+xUcBz+VnMZOvnw}YI!-) zMta@bzNM4G{MN{Ltlq@6>7T0VgiKfdH8Hi7m-b$7@3p$vH;Fm^#-6=-8E3Z4+In+; z?dHx?XTDtBq*30ZkT~!6xha3GSOc%$m=QhE*WP@QFuy^m@S(02H|D(Md)BWLOPp5t zUaQgVAw#oR<&l@mb#A1+bQewf`zA>ABD+-UW9|DdR-JV^n0uyvultwJ7f(Ijc)^&+2PUhn?L zxz^RVI!isfc*>MRwRc}0l@BZobo5`iIrN-VU3*Tpz^!-xBWAt76m4&MA*B429KZ3y zGUedc;U7P3-^=a%@`UIat-n)_TWBV#-8I~6ESaUK|NHK@;?gSPsds8BZWvd&uzj&P z$-23d$BFIt(fzS@$#o@ZO@}N}_ByN$dFXs`M@^X1vllj-?$ijs&Z_s$T=VB&-?5!s zZcAhSR~Gd$^KaXn^8WT!ZiW?Wg7?3wlq-qQ=a=+KZzSxggx(1TkS5> zb7Wb&?bh@BhuZ{#U1z59{f^swTH^ARSL@5#)|_+oKIRvfs^sv;Gw%Fzw+99HSQ~}* z_$^rV+`72`lKS-i=Q3fdFR2>s{%-alSo5-;rplIA_BCv_Hx!ia-%Xk&RJyrbdaa86 z?C_^0|2M^IJgwV1yGWAX<-OTWCtp66!_9)V-3NJJZsPtX%57f%Z&u_Fmy9Qe#ZrpH z`O>&vSN`2N`S9eGvL{ZYNKLRUSbOx#5o7TQemZ?;g-&dp_C`CPJKy_Nkx-QCT(u`= zb7sozJpB8Uh!B@^;z1YP&%MJGO&5{nCcgLi5(ki`~LVJ(?PPk!yAbY*XZOgLnFFKdKtX%d? zmZ@{`K50kQw1s#6ocx%3e|6|7AD#o#u6>-m@?njxMeWp?bAw|$H;XBKP;vdeXI;9h zT|vwI$60G+vd-?|{NWZ@UFPJojmh)UJ-b7p%JbK3b&ohYF=F>_mbI@Ab9Tl~Sbb&X z!q`>oE-#hewDy$5s)IFOUl)5R{+rWLqSna;$Nl|XgH^iNPseG< zZIyj&Dib>YL+GLlAD5~nuMuukU->R)cBsbFUA7&@vqQ^sZgqJV2VF6$_-uUqXjR&> zH{9w;?A=cn_`K5IdGM=W(2tpB*M$Olrf>wMZEj@C+NyQ%8{6l5jLzIMg!m6nmX z)nNr<8QhW&1|IaToLZd`W&h8;rvncH+Fq@ukBuO zbr!Dxr|q9S#^oI0)e?S5slT7yH@PLFca7=UQSP`t*+Nm>>r7?7XOg%shI8|X%AaIR z+HmY;ldW(pyI;Fg^gDa~{9o;Sf74`Z^0)0+!{+kgY(w7G#0}dXp52yqG)`XRkzsZ1 z#MOtz((<25zEu3)0MezCB2^iApe+HP4-UHJGuh?*Uv=m2-Cgo z!yh!`t6`9Po5Zw7;riN6J#!odyTcB|&6GcTXSV9ZaKV3hjZITK7z&DtH*eKq2ww2Q z{mybDo3B+z68Bs&FZ%4)nwF-R*!Fe(-?XKxPVHzq8n;wPWq-QI0gjQ4lUzqzAF z<@)!=f}4rGdG9vwIX~^-F`b#_OO(#eK9t4ITt9iO=?>wmFZSOq+WJB>;E`m<2dSU; zoxU%4f6;s1t2?jkCk6ef=JSue7xPNbck;;_hNDGzT4ugdUvji`J5(Yd6Z5r4SacU@&@-aIX5iN5}K zp6rnH*wg*IE1eWJ-|1h+yk$z|^OIArEt_=GB5J0kM$x4Do0Wy#M=N7y9^7$b(*M@e z^X4u)>(OQQC~Ap%#Qkk&mm2oUq%?N^m7d~$VD@sWoJINGd9&k+4?ZlDZZKZakhsLF zTCHxCQD#=4>dAwub2L0uI2~rp_OuQ*KI*LH@TQuXpQ+L7fh=p`Z<*dC=Fnr@E)4Z0 zWq)Tem(OhYW>JsJE}dz^C+{+)Q#b@ zOitc-{UOI}-IV5uF*@6}eDDpk4|gxznO?e5OskOPoq_U!TYs5&9AByKGMRdO5?A>& z(N|kfFZo_K@srl8jpg4|S?Y~iD*0>#&i@STJ>SH?HWO&?6N}kW?L6&mV>+A*|bGJdNA$I|Em>@w^%&Ni}%=UsJCV= zQNOU6#l-MO?)}fY)rswfy=!OR$XR;kw_{eI-PFWN@x;iqeF-z$!!@~%C#`q`-0w_U^U%GytXvtMre z_vDJ_wT~rlelVD-C-Nx6I(ul7FREm;}B*#BkzjUJz+Pu}Gn4gQt&mMu}i z^W_A&z`RXjNhfwB7d?*sR}r;J>}*Bzi*41*wCBjyEM9Uq`rXa9#wVT_KQ?}^;vcav z<6U3ju9LC>o?p+{6xp)h__RhS( z!?FB~#EbT9yV-~D%?|$25V1k$)n~>P?^Ay$t*!g9VTEMg@+(f9@9b>bVqWc%7c?-v z7o*oH7;cgCJ=P}1SI??0s8CJ$G)Le@RnCR2&siqCS{}YjNOq0(*0d{2t!*#XeR!&u zm~!>DlK+hu*}G1;r_L%(LpK2 zn%_Msdl9AfVW-oxuzi=<$-y) zryuNna8{2^r~9AU1&_-H&t`Sb%i0SQ_}N<|SU!a2WPP{fh~WBvhQ&d-z11S&)wOqQj_mp8!V11mI(}vD z#_G*m>Rv0KIB_#4sIU1<-InEN}v?;q}`R9h8;W~kD-_OsJt^B^;w7_}x z+Lpyh`w!3A8yc`JyI`_-`2OD#6T++*kDB;I{7Lw3Chg|6cGo|zf316qnvMkj+Qku= z{Bo!02I*=2E6Y6Y#x@zQ_%QQSA)ar>#1%EDM^moHy`Mx1Ts zElX!y)-}8G^Q)s(JNLVH>^Q|z_44J^T`z4He%y5a+^^ZuMVC^JR$XSEGD)w;wf@$T z1w2=!W)^H%FFIZ5$r+iN(`_GEF5V8+3%Tll^TwfN=T>AqZ$H{{_V$-$vnNXTKD+tq zS@K?!EV;7zeUn#T3vAP}zJE(D>$KncCg0w>OU}*>FtL5VX79wwrLiAkuQ&7j@AjKJ z>AUsqy*{^EcQlLi2e+x6Z#+1~BL7DBzKOwlrgs*52L%E&#Gms_F4}tA z@bi-9^s{gGwfZ(4-tdQev-Zk)ZB1u$It?$r4d0rzz$5tFpASZDvF+17 z|CjXKyY({*)o!R=-(E36?vYNv!T!)2mm}gN1+M;!O=dSu*(~SP#<{3kehQC#xo+gy z6DH3mhTh~eT{nd}a7v%U^4mhkoCKXe|Koo*`O*e9a|cn|_Uy-c{{PbV6f?ws%qw2F z>2~a)>)W=+%|0BfAG?R`;kma`x@i@M8Fy=MnAp6k{9fkMd>@G%Q5)lQ>xnz>%g%m( z_smKicD{pQYfpRqu=F z%$uHX*V^E-W}E1j7hlg>1-zcg~+qq>{!U4ASkoP;TzL)C!UpAxWp+Wn#qKD$FJbQM%G`4>! z5@WR~ZO>1Z!*8ys?XW(}*3O!KZ)(_uh*Yt&uS|qqT-cPn=}CC+=lba|uzo&{=zT+R07(Tco$0OnJO_-Nw#CTQ>jWPOZstoDfnp(P6*i z?XA-d^7lMg^sD{tt<~35+T-6XHWlj2_I6cboA0|iw8=s=E8Vi(b$-)_wp))sw!5zX z{6cYc-goV&2&+HU?02g8-npl-WV~R}f8!AknZGpco_ zX4tLmv)?ywO!|9IVbQV~U5-m^-+o(daB6qm?X5N+-R#XpOuopi)5-~~(YhYrZhXDm zt4KUZrXJ6@6+7Ng0)GlRRM}C#J`=WE)3U0igGRIQxonG6q#VoTQ zX%$5t*Js@RVgI~$b>4HYt#K=OGOzgSE{1j2uXekw@hZ!!GIzbCkhij`>&u%=X5QXa zF%#}T&#S)F8PD|V9pjha-%nP5J$<}Ld)~#2lcw)eUoACAdA&TLLS#w;hy31(Ny!uP zE!^V{?tI>}Mxaz{g2^*Bfx~MaoK&b`+qKG&GxB(RfdxnYQMS*M7j=gS^|2OB?CZJb zdZ=Yj;O`Hc7oBu?aP-8YAAINJ%;d~$qSR-}U%O`_dTZ)Ci&IzP%;eAI>N7~{apirR z{q7xq(C&9<7Jm~h{>44}(6gwh^H*Evy*%}^`=i!_6MYR~J;z3+oR$-zc+VQQy1gH@EjHE;a9wJF+J(c2>*uOUHS7 zcbpWQBdWjL-$o`Szl=XVDv19c=ekvSKh;g;G~=Z{F8Ofpm&D?#be-Gt+x{rK`tNX! zXV>|>We($pncwd`+jy^h$BgTQn#?^SXQOs6txGrB)8x*twYiK;tMd-8 z-2ABh&hqWWWp__Y-TT&P+wOlneda2^_T$`>CtXQ2x%j;M9d{f523>W(YEe;NZH*Uw zAp%zl)+bj)ZOyZ6+g`kH#T_;4i(6W4e04YYzLDbp+gH{w^`ooy%=WV#2Y-iguXH_n z)Ajr2bZdXrw_jIJyrlR4?UKtTD~kDltUR-wb&cdj$9H$0tK6^o?#6ncxMI)KU$^gG zba{NWiE(FpY7V0YMkCR`{if9ozpnx{m#oexLH~5 z?3ZNjs3g;n?#Hk9T$>rnvUh4Q~HEY7OZIdncF82G`xAVY-IeRTl zuN22y{#n|yxBe8D>)i)u_vS5|R2HxI^KRVq9h2_QJR-Yd$`-DbB73eF-bzdr-J&>u z`O^nqW@H!Y);)GR?X>IjFSX!ZpCA4xd~l~WY*%i(@0{t=zDED5?XzESr#Sm-h0ud9 z&3`S{m%B|_-a2pfr@~w-8v*rmi{GS1PYL_EQPkk`(ygZo%L?7jetx`Ha(&0eLdG3O zgA`Mqr)t$<8%?>hcFy}&cd~izx}6XEwy(&GeeYFpv21H0_p)n6 z5%b^vn)XuR^PFB5ZNJl#e-~}bIW;H#_A8IWjC}p)SMxd)%u;#lWBeP;>p2>eA z{6y;}SM2!3@-*^(&5RFC+bs77WhOr=}3(| z)|L#+)8<$1N}MZYc_Z`fPnrJ1Z#Rq91WJhSeCCkeHjVLy_Zj;oQ`y)5`H-_wggr!} zpX-uW>AtenvLR6=ugHIhg*$y&p(m6Y{#noA%{gxvf|pVO)06|W3z)@W}j@k(?Y#{-{*IiEAQO&i8ih$krY|Ur6F3+n|+i(6kg8ykzK-GfW%w zRg^yeLP3)0ZTzv5z^S?8vAF_>II{)-kn-h0W-si5*+r?emGVf|nbEB&mTiKm2UuS4MN$g)K;AHt} z%L(^bljmpSSK41UnVZhCD6cMVd+tGv9F2`tsz0dMn;>RUN zey(^p|7zu@GaKISTikOd+waQ_mU)tMpJ-J$PG$Yg!@^W|jAhErBb)9ORQ_0Kd@`}z z@a5E#`)qks{}z_MezEd}TQQgSws$Wsl@*7S$9z4qx$Ao6iZYwUt!tOw+xwF`=0<$n^{s63i%qK4Hp{2Xo8LC9&x6;CxZ0KSgrttjnG|`&sX-rPWtgr==f%^W$-LclK88Q;sc) zdC417-+yBC+#I`H`Od1uw7X9(B$U5O`Smj@$8YiR^|_Zkvmfvt-m~~YZkUMgLgRpw zdcm7iPafGbf7!RW(O)wS4ew9L+aBp_Y+(OQ!g1!w-y4@+WXV=t(S5=??DEZXPgng? z{a;gCyeBj}Z1v-Z|GsrKhsf_Lnt!@+>(a@E4X(@qNAKKDUsPFP{o3(oS>nnqH$Oc{ zjyU1;nM)7yC8g)X{O&∾4WR(AsB*iY>3IEY7==9@lYU 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⪚vt@4krR=I7Rc1_~v-bFjpvRN9V-uY-x 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

mdtq8i>&uYXUOD%kegvYqWd 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 z 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�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

ZrC!-wO4Nk*dA7JYdycg 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

!@3}u7Q`5Y|E59Cr?`E&K- z{JaTQlXf>bwf`}1{%pKCGWqN$>3YUL&lAPx$LI*p;>~-Qppb5IBB}Ph&VlNN!;e0E zy7A-1qp~ZB0cXrQpYoqA|HYxFIIHpEhO#Rq%nQHw-6%LV<-$3x(=tB0l0E*0{t4`A zdU*F@n7DYB)DU!uz=82cWDFWnT>|TcVtbXX>xY&Y!4wTv@eNC*0gj+g9)8GPR@E zwj?(G@9dEN5b$_&&?bMzSx*}tcFOH4(cmpD6U_Yj!F7e9_jBtqp6xF!Z}6B{^Ih6M zt0LpDO->7QXZAeH()`nUNd>{Kovb zUI`hQH--CWq_*}}RsE9vHRE+^(yZ@ypE$%tNZ$$*t6QtLI#)T7>urI$QPT9>Gw&W6 zKI<<|{IgH5Yirn~D;<|||73}{UaUI2Rc+a=BQxedUT}18+6T`6N6n5*`_TW@dhS$# zJ;B?|SDCL&)VjF%gXoQKc6|#Kk7vH}T{Cl@t4FdvhuKxvBL|lqU$rxtS9*7ab-1EY z#nmHf_qE#Ci+DnLu1pkJo?H3v?f>FGAI{js$<_US_3`oJ>5|zI?JQdkusL(=V7vKn zj?J+Patk<$*E7m`|Np&eVfBmFeKzNf@@Crz&U(Uhr*L|7ZEMFHVaD$7fBbKXot}Hw z<3d&A_6ra7jpJhfo%eaN+I!F5o%-7@?0H%}PyWLPwVD+Yr=}J;et2)oz5O{0=iThx z2gOe$)E$$&wwJMJ`m?|@)rkjF4*rXHy45W?P0+o6=JA{R1@BGWalU}PO*8(lxT~M$ z=BsnB|6kfww(jYM(|eAYce}PqE=yRyysvDl2~V8&wFU3L9rS76eDHPP&h3Jm?MoFO z-fx)t{7=TD1g?F@zHMj_nH$PGY2v$h&O`3vc?M@hbX>2wPQ38#%!WA=m0t+xd-r@? z7k#FCRdlYR$b{qXyHrA0+$OGmshpLUP^`~QeH$74~&xtRL*7Cb6A$uTX>G@UL z=4`&xsHXB}g=fIKqbaLZEY^iCEZsi)-^vf0Zke_}S2IYx{^eeZ`)f9B_D(Y|WhQCP z8XX=(Kcgk}VGooV76esYf466zWl@)#Y{L`w&{=OQ7avu*_ow>9;~P5;@BH29nYlxI zZ3?rg@}}@Tx97!aI`2q3H_=eI?NQa?s2ky30=-Xo1g)o@m;KBjx8bgI*5UMz_Y6;( zWFL|F7WHL{I@{6O#Jx7v|Jom?tN;IPVg2{><^1{f4?|p|L=M$3J-S;WbyI8p!bco8 z6y{tn<%^Iy`pfC^w3*k}D0Fk#M#|qf*3Qy?Q|M5lxu{>{$>%#nM4qNiHJ^Ua;Q{ZK zIftG5zHg4K(Er$JxU?}@i({>CvRPrEDx=e?_n8UR{CjxrEfkMsyVsu)s(j|aEVC7} zKkfb-`13P|jMRs{pS80doqK&f`RmeO{kd0}Jh&I!ylpz?LG(<>sM>LQLXf9+@`}}O zGZ)IP$WE+Fj9_k0e9pOhD$75^<%QorzPaGEdo~Bdh9xogHdOEUH-DpIr-F1z%Q~L+ zC0jR6?_liSG)?%p5$okEJ?2yNY>ZdzJg}+v%Vvq$;R}TB=+06)omXh`r_2ky>h)*!{h(X+kfW6blKAA@ZgiXoTo0dU+*71Rjc!P#?CyG_^+M@ z)%}YfeX9A?dCz74EUB|;%K3L~9H#j{3T={_7kWaF(}?}j-ILExdJ@RHxajXn1(5fzxom{4R z+GVEv442PW?s^#W*L9pNo9X-U)sZO1OIB?&rEg~+kY4mNz^dNoy3lvCyuWvSyF6Xi zY+o(4_pI%uw?c0n3g5p8yxKgovbJ>DB4;Jw5i=AY2cjJYL4_*sS4%;Z-G4sN0zntRz&H8Ub_PpHVZ8m33RGx{9 zl<%C^r>5;+l+I)}Q}KPtOP+v7U$*H^IT<|vi`D#xi<;TCZ2SB^ELH5|vK=|g@7vW( za=Ewp&YZ80wx)8gZz_*V-=w?o<%`!(mMoB&lfn1Ub4CygYrKX?^4bsbRib9ng*!5C z+cci$UjAv`?Hs}Qb8_x$9R6+DbIEN&lj!tc@j@qcT?DK4h2)nuy%YKp?=&Na@lw>q zRE?`Ln)Y4aKPUgLQxTghyW#;WhtvAvbG%g(iV_4Ztt#US@1OjB#ckp`t$^LXr&*RU ztVy0(>&%*^G%5V#W0^}6U+X`dxlH&%&e4qrm!#Ejoe`TM{OWy_z#c_?f%C%V92@}$ zO*9@AebJrMd*KY<ws^u)6yrXGzu z=Umk*6xlt+TNk8xvNwJ0R2z9t*z_}sgl zdaA+!CC#TaRw(dT++X_5_d(yPd+$;es+u3N2=_(a*v@r~V?p_j`mg1a?D=~y9scRG zF8YlAYM=QpW9A=8iri-(vUq*ndbf)8n!h^bJnj{&Q0-iBWQI@d>l^!7i<>G`-mFiW zySu*a`ZBAJx99%{^}qYCwm<(>f8M^v`knvW8+RA&o3wOp=&@txi`LX%`M*B7YKiHB zB{z!XUM*l-CR%&(GmdscXao_9$|GwGt#U-Xpy`J%Wsd`DB!D98(b1pB- zdb{q_?Ue8)qqsLWAGSZOuuy*b&-*l=-PRUaFQ*4e`2s)N|NklY_3-~(jgEhvGRB?p zDzVK!HgMd$Cp*Rb<%7;HM`vG|#$SDtPDEMuOKl2M6ylZj__O3@O6}tV#c3}pzX;W( za9CX2^+oKH5l{EwEz)3*q4o76vc)V4^E{>Qf06L6yJQvouzS(h_T<+k3Wa}*8<#U(y4$h~;RpW*vQY1ZW2>(3MRg(u$ey1wA4 z=kJXkTX@-(yLHayuUWwH&hPD6#YgYAoSAUO{MgE4`PX<4)w1k-Y4EQw?%LnVTAV%@nuSoBsW>l?P^%7Z@GK!S0f8u7n9Hzuif7Z3w(WXlJh~r>;0>qKU=xU zwEwX{=YhV}BAcJ?EN?BdIsYoFLZSZ7inB9XZX7Cqn^Y9b)oxa`nM7WRiTywW+1 zrZiPQn4NjtSz+7k1Lh1(4u%o43N3qz8(6g&xtF*49a7!7Xph4+wTun!Eb=er9Xplu zb%yfw6MD@id5=O*n>^TAn4Njf|B%`RU6vFj@z1rpUhDelefhapPdrM!Yvk+gpEYOa7;bqnEEwR<5)u;OpODx!(*4KT) z?Zc1Ko6(Enx|jP}_g*aVny9SIQ4-!CZ(H4Ac;$&y_syd(Cithkat@o3usEuraoris z%dCd$7v{S6&y@2l2)-KX8fkL<)ya>W-=Ev}{X^!dX$<-2x{st(iD`JSB#(N= zUvp)YYP%VHF?s#o{=aFLR}205(!I$0;>K#BH_LvNJ!p(}j~5AgUoGn#^6e4hQ|{ia zEf1#0wccB_(P0fYNm8kuY03BubQp* zMbUF+&i|Jjd&>2Njn&t|y5PYKrP%G)*X3l2-<}*i^Ty-T?*$y|3l(OVH%eGP8&%f+?!VizPbGnKjblLmS=mzHrgS8ucgO}^+>nYa8)&_q1$~A#2yVm>;Kab0c zdii^A@ARk?F-!_)&#Zd>)kFX9i?6S*FTVIA+1TMlSX{C8diOI*7Ct?5?N9hW`td@u zVaj#UUBwxxxq-P4MgO{g@tLnyvpQ9Bul#yrpW+iCxp~@$<2{<_0`h^^yu{Zjkj>7Mm2^TiyOE!NOTU&$lDzb}YEA zoa)oU&(~$pS#`hk!S1~WPS0Z%Stp?Hk@o%20WA+{zL|kx4PDDmzSw+TRF<`*AwuNU z``c{tuckj`ZTOKi>;7q`TMDudvJ>@YKA&~wfT_)9D;LZ9?tPj$CNmjXxZl-oc65mL zeX;o`*Z(XR`@F@kZ#(@Ga{GPg!z}L!r@y>da3J>bWYgdW9R~feb#-y#@4ZYGgz6TQ zw_M);WA5~SCK1zI#Y)d^JbG5+cl5WZZTA|#=pNp)`(;cjQ}>+p`D$}r zCtR3ST_MSP@!5o1mr5;-v@E2>-|oHeajJaW(;HD4u`W}>*#kZ_eBO8Y%GZyzW`E1F z?*4RWYm5@Pt8sFgjPluq8}1cZ_qQbMTyd+S`QNJa+M`TKOS5*e+}OKbV%_OK7ylf) z!}m+Y@p`1hck{2-EI;pWDVxn*YLRuJWz&g3mD)$uDhfUKrui#$gsz8=+8n93j+>i}Rc6O+zT=Bt&RcMM)hvgM z-hH1-T}v`sjjX`nM(YMT2vS@RbjJ8TRS7=O>p-Or98KVQ^r<_G6O4w-Vh2%ZoD3 zmi-Ymy|XBU`Sc&_)t4`oCYr{q+bAy8UL?q2Ei`#%So5J-M*?~btY1`>uVlJ2`@54u zJ(sP^e9@|=*o>PW+u!$}V|kL^^q;Na;pe1f+_H|xUU(mV)pNI?DgK1Uk4G=wRBt$w zc0OJzMsdom`3y?;4?p*hv#nhgXJc>6`1-;Ot*Eav&olnCR2DhE>!8tjzj;0vvrkGy zzB$WuP;P=l>#AA%f3{^9r(95rjoh(6kZlQz&bC#*XYVcJd6ir%Sm2WQp(WKvNzPPu zN#3btd9q(KGv-I!fo01eetmioW8yNyeU-Sks3qxA+yrhMLqrH`KOlV?K&PY_ubxY z)hc(z_4%Gws9mn>t-5!Ov1YZXyLedVxhbx%Z5KKneA#;XQ~Tn{#w}G0dzg*oE&P*P z+s?GT*WPh=hqkT3Y#kP3KE0U9pLibaIc?^lsi_zg_(Rd>mRw7${=qHbin9)xY)ibz zZt=gYSzXO~r>*&f)6K8d-!nv;@$BE@d#rKanOldaDy@DRw!*kOnkln8oxk|TuH!l% zr>ziKx7GRh%WLc>P0#NaQs(eu+8g*X>(sdHa~jG`?Au>+#w_~$xhQm-dHm{} zt+m`qSDJVGfByBZx%#`^{m&m~OwRsdbN-mjR%U(n^WA1ow)U*Ic(>?tTx_OO)6q*z z%>9ga17pgBD(0~6JhQH_FZdYiqRrlSORjr@i4yc)MlO_1QY@^Wx>Fo=uy2|3#^x zXv`L=wuFN-T9*h0&9=j}H6(^`Gowm!^UGxJz~&Gq7ayV*SZm;bTLtm#o^u;QK^)XQ~eT5LkY zj(~T0+h+0TDg|xU>f$Y6kWeVli+UUULo!^iJ)CQU_*^;rntyLDYFe|HT|QFMyv#J< z-DB?Poz+;Zs`W6 zC$Fqcl1pZAUtm#?*zU___~}cm$Kq>$FRbXlTKeBZCVZRz9RsD<^gGkH3COQ1%)GSw zgGJ^k{yXuzkH1q~WA`XPY2p^S;)LLc4o;IrinmuNoh?h4d1t1P=NS>pjSExnG}zuW zTcdGUa-y1N_PT&O*<5)S**6>$P72QD+P9?dq1)08VSbCJOyHfr%f03_o4&jf_b%fM zKknn#9_Xs^)OfNTjp^SloVRu=vulb+5x3>{#Y^rq?z=1cXnFZFS<~Fzw!B8xiziR` z=~ZZ#cU$z&Y>QPZ-xqq-9Sm;o@7rJd^=|ob{mt*^+y6hTs9X8sR!8o`yV{J}llk^6 zx1V9nK2h=Aq$erU9$I9UKdQR)kJbCl;p#mt+oc~)e6{Vl?5cZ}$#x&#nN(S&PPg3h zKe#P0deYm!=YJT!S#{!i&vLfcT6|hxPW_Yr@x)=~sgiPd|BiWY zYu^n-Djr%BEX- ztx0nc--KN+Qcu?{xnfc^!RhaT{%d79-%oo#f8ckk@}U&-vZp(rIQ>d4TeCNPbOGAz74xOayr#L0AMf2fX3FZdh4G}TMh5$u72b>A%vmq~sZuLp&cTPq z|K{$E7Hzp&q|jl1UPSKrwzX%=WcN!w@?0Y*zx#J0zwg!a^|G0Viw_HUTvaQwa@D%G zqM7f=mxT9hTiZ+e^PbkJy!M!QMLE}Jo@U((F`kS==hI(2mFm5x`J#DaUHG-DzfLV% zSLAao^R@+>LFVtnAJ@Ft=F>I*xM%*At>POlO;(uu$bap{y@$U2%&D(1k=4BIX=6Dl zpUKIiQPR&U?c~B^N&4@;@ig$M9D4lz=uYG`F=i`6sFW6velN!C}*18IF-?(Qv)+esN>%0EM@%ZiFZI@znKW+UNy_NMyi_-t^hDwa) zGZsyhQYmEn$-i&^qQ&b=^c|jt^2{oZJ#l~6rQ-AZc57{nz4tl7*J>vJU&UYE|6eZu z)@&;7y1usT8k5JR->?4V+ic$}yRLkmf2hygo1!uEOWq39WrW_2ciHtxcGdlwd-0cC zLU>Kma;6^m+BE-0c-;c30OaR>Q`}@1y40Reo7}RzrEo-WtswZCm4X z_oV%vpI!XJn@%2kt^Q|&VaJy}$K&4ay*%Yr>+>h##jOE!gPh*{)f^BPFxIsOVc2`}tq*x7OWlWHhg8c&8nr-}^sU z$m??5ga2>z<@eeA`4H}5b-VhNVoild@|*Q1Tu&4>{1<#2Q0wXSNb>ymqDjy1<+1a< zt=xZqU6##R{(h!Uf4-!zoq7AJ=)6sWk!-p>1mUq7+E&JOin&u**hHqUZyX6O7Ou6dK{ zeJ+1-v90TTX*z$-oO!)hORQY)CzyFW)IRv~=0$IwI~H}{GG?i$e>iu<=_~7l%gtMx zV^+LqUzxf5p$2PGv9{{{u3Yum0XtlHUCbum3&@xZY?dgdyA zjV&L=MY#TPC7YiKn|Y|hx>G8^&s1gopycUk29ONy6!G({}c6J z^pa)FEDNg{9YS9v7EOp~{MTp8@^;tdPxA}f|4+~Q`v2@U7X3f>tL*2hOi68+AGs)W zo~?P>GudepGCJo%8c#Y+za_83*j;}1^k8n;mD+XDYgT3N)9?CjX;2{izK8AIN~?!= z=2py#et(kf!==wDf%~*C=KlTDw!BG$U!+WAV%L`cVF4$=I=IQ$NfeeQPYk&WFdh_+f zbgNtxqPDglCW+nY{JFem&nm8pKNp)?ca(@#?%uoUUBV%68G98u9k!}tyLPev zF>-FtId+9n_WISXSNz_x%eor=6r@$pW;he^qxs&^1IpS?%FeuwZUP@lwwfJ?(>+v~ zX2MtV_|bX)vbl^qTmHE*{<$#S@wiv@-j-d_0)9t!<|Ijke7{&?(`No-dxEefdu4`{ z%DjDRzOG%i+h9-Y)~bb!irpvU$w3z9 z-#pV?%~f+QdvBMTXZCrHRP{aIx=WvPFY!;lxx4K#gTHG5_xp-tAwL9?KQG;RS@BNa zyx0FfE&Ta<#q*7o{L7wtF8r1ly7utg8n%g--+wA<{WDkFU--iO&FaVNZR(ojzCL@{ zd_Ql(PQev?yCyumT0T{u>&xMGYa7P+Ek9LlCg`Yj$scp!eK>t)-O?ird&3jnYk0)% zp7!co>D>GmKcCCGOpNw_X@2dwgH4Tp()xSCpA5cDls;|B9r*K`?dkx>bDTnRjvWe} zwBgMm#>z}<>rCxQ(G5|z90ivsy)6BgeJY^MKk*~a!c|EN7OqjhWf#2i&8Zt_w(L&0 z_|<6MroaP-&PlL{-Ly~E5Zb)@via3-i<#$&oh|&C-OH3n2TDA!(tC8JKWr_XyG^4MybBSNF&oXth{yIs<_aw{AErn zzNkI9F>`JgYw{h2`TL3mq->rrNj%gsnN$)bzA3JO#Ui1XL+8wg0;Vwao2>l@ZcM3( zIicNqJ~JFoPzdGth3rtRn3-$hoefg*b)=cHA2r0P6M zKc*BDEvM4M% zqSx!hsWxZnY1M6=hF|l-uS`D5{dQ}#HN(M$7D9>7kF8)439xEZvfIM2P=Die<6X@P z>qPdyp7@lVk9mh;MPgsc%To{in9ga|e4e|xbGcdGw<OtpW|HLh`HMYrZ?( z!5;SW<7}gQA=~!P5G}u7$jQ3ee(JLBc{#n}S}GOJXH;(ga;ZIFa{aYe$!8c1b6Rm?2GCx4{?lP2xtAbb2Zn2Jsnyd+a)v8|ra9OKJ-yo>383+|PXGZcFWB`}Dh$J_t?_vUq!~CeDOc%_Hr6>*rNW^}3&U z?r+k4eea80{V^ZbBcE2)TnsOqX|CO)TR#6G+o25w$A!+`tqy&1cAK6?6WjYBrkwlh zY%AP2J3AJ+Mw+ipH{P;h`BAO=52`2UP3(F4!Cb&_hd$36Q^laVGc3NBk45F&IOd6x_jO&-id1R!$k(SXezo*GQf-t_)!^-u^{}YR*IcKj0sh{+yKO)G+w=MIFf%-*`g-a&e zElt|)k@`L0HB-fN!~d#07TcT|+4HS>6AlA8+?re` zz@uoVt1ose;`8kZ2ktjN6wF{{6ISIjO*(#Up^$sPJyWyCp993Fq|NroS%3W5%)M)W z7`zERsi!?J_H+N=1irK_i~*DXZA&-Zt$goO%f!Z-I|YXPN4=cGqx95n8(nmAULY|$ zEA(8xoe;;T>9ZEBe$68vX?!>8^8AleMRlzgz1|bo{OI@Ac>y~wwg1ole&pWFF4j~@ zlZ&rf3*TBlke&7Rg4S=21jBF^HY@X=<;K&Pb;Hi+wX>9Ml+-d`Jof>wp;x+qctZGD zaj6jRq}8!rn;#xr^}B9nQS02FhmNqhZF^|IRxglwNRiu>vtRN0#${DCpPoqM+WdMo zb3*8klb;v6-|XhRCc5J_LmdBvdHZf$+|eH5k@OOO7{+jUJ?Z?gBu0DOYck;`~{Jp=Gp2~z9csQc8b-$s%S& z_M0;5wO?DE7bSlv=RTR4FI`@K z>vyZ;*GrFT1M?X+ihK?7V&!4b5Q}-gJWhX$KF^C8=Zf3ETWw}Gt(UCJ7cR(~n|+em z`^7U(zIQXqWOj#GZPY&)`hMoZa_=_ddwjpn%RPNt^oDoVtAy`o;=jFeI~9EKIiqoM zHUB5!py|(M)!nlC8!j+?=g-5+32_q-FE((C7Uj3CG3XKwn?G&u`Pm=NJGI%*6|rxV zshzZ?{^sUK?gG#F9^JX5miGFQ6w}wO3Gp$X*KUjwI9-yzp(kX;)RXDQ?Nb!Il^+>} zEakZJ++XhDc^9|+&$;I`+z=PIk{cyoZh!ONkqZ(p*KV}lvawCi*d)1wso z?b)rl?(v(}Hiui*L{7ZFr6p2#TLb4~o`fQi#p-THmlVBv`PqH_nMA|N-9Lh()?9S! zv@hD6c3*O}^WBzPlzB(^LxBXc5FRkgn4W`Iun}tlaDsnTITV<>+ zRrxV_c}leu^LnKU597W3yj9hVf?3x-th>@)@TB*^Hodc=KlXUZ^IdKHA%3iA-8OM? zkyq+lw6}1~K56=8Me_b^$DJDY6@?`GyC*#`HTx@_Rr@CH`~;3KZAZF~z0*p&EO54t z^~{YapM>x9E;SR+V|ee;@$~Jx>8su;hm>62aH~B=_4=|Jj=C9#C+yie^QG;?Xb1MU z-lbiA%N&JeZXzQ6lYG%?a8rNqipNKT#TJ62_(7Q!T%;m%8Pg&<$y4P*>{__$+ zK6A3(i)GBO-(9Sb|MT6h8>t`H8E+K+q*eLKc3Vep@p^;q72H=HrJ6KdjIK*vX!9$I z@>(YH^MGK^MUkB^gsdjmlxHc)<(%U+n4D@cxn~*EpR51gig_-Wn|yO!Y3FiLGoQn~ zi_8~izL_+2?!E6pd)=0E-21$#DYHKO_V%30_hrU2e(Ac;<&JO3_#M`|`|G1GSN4?V z%iq3U;J z_IbA8UF*k<;yn>P)4Q)7UDi-y)uQw?oPW9YDXV3P(pzq%ZjbEZlP_5Puq8VB;H@XQ z$;pDUxBq#(+x;k+pRvN=_;!W%jJZRE)m@_8 zi4G~dl&cln8r|MmAK|`obW_dxB+fZ9dls)qIN~jLtb6+Le*b?eyt9u@o5JKVe~si9 zlWCo^a+ii~-Pa&vHYd9G^^BSm_ufjF$j|hgv&GXo^|g`BjCesPe!>!#Qjd#Sjd z?Gky*vlExthh=;Sk29KVb=>&=PTBPCrRzGjotV8^@p+f3YC_|iShZ4__mVw%3zYUJ zxISAkn^|S&t{tnktojh&zxvgFwp)e{yaA^_8cX|Ua2PQ+Z=I=fvEv5wb4T$tvo=oG zdhEEsr%q`y1B*G|dO5ubHJ>^+Jjy6#`*+s!?wN0q^)0EGjyjduU7MpCAd7RlAka*B^U&%HzfY#?|w5x6KZq^*w6oVKR>%o-KCjV)6;JA{wZg$VQAbOt^|#+ZSID zde&U%KWT^S&X}NQcDu7e_UVhxS)H)y-2HZwwSQhm{J(s@m3JQ_Lx0(Z-+tZ26R)Hz zS9GPW5nJ~zxya;DkK(_%xrgTpeHIbee>1hsh4pu|-f5;kGSj=>+~2|}!}L_5Z{dQs zyNbI{H5eIIXg8nyyeiOGt_g$CF-m~w(MdLPCg+~fZPSICqYEEn0DXSdN=));+ zm52Xc%*Dr+C3D)}Kk}>7J@E99+rf_pn=cCT?D*WdbA_{e-6<0{Gq=f?oz*H=Jd5sj z6Y;UXe`Ttg(-zzAa;7-e^xNCMGad@Nb8IF5j=9TDnLeCXS)^=PecREaTjF@y@rKj} zo`p_<+s%J8fA`4~ljM{8Z~L-*-(p>E^JVo_O7Rh!=SIJpzmk9X;&=Omn)XyxeR=fo zqH)ue_-WcF!Wqr)mi3CPyD4?c)k2vH7eT4GWY!+z3!!9Wj>zE&P(iSwGO-Mz3sSecgOLVcOJ%eOTWCS z%jrCLuAMvG=r|7GFD8Pl8+9x2b&t39=Cz26LnFG=%J}lx)H=Qnk110gAMFO?5}SlcmU!_JqBv>sc}*%=&y8<-y>wo5!Tm|!zJ|JUf8H^9xBksbT|qNm8uRWjSy_5vVSX%k3S)4te&GV; zeS!C4v`=qb+Ir&7AFJfoH}<{wcw*Uuxkr~(f4{1?`PLr^sXV6h>NlADbCr!-Hhh`& zRxdip=)lugd!MRBo!M?SbLPdeIZwrdyIgoDh0n6jd(*Z=hZUX**%VMk24 zuC3waojYooD;oDr3l?(tXBM{KX1&;i|CxotzENMd8y@84>ASr1w%@*k(<);4PR(A; z;oILL@%@ZI=C|beQa-^t8m<#vY&9=DZr>eemo#}ISMf4cuM>r9Qf4zde^8YFcH#+_ zKCjK2jQyAHu1nuj(D3r&2}ZVxJ;mYcmTb6Hkc)_vY`0U5JkL}*qWW7@D?^h7m zsgalCyxQ||&)L8z6}z@si*f|-F;AOuI!i_(xoKLjfnO65+er&uN#Umsy&F7=G zBcrK(pO>Ca`J6YM6XmkH?HCNyPJQjMdN;B6*>A=9wG|&;YJ5ACXv@XO#nHy|Snf=C z<6Xuh?K7n%zJ;W7p6KKEeV6m5e^1Y5{`s#KKJr)?=Rf&$?JSd-vI|Zs8=W}2BA4OZ zi}0M@k9i+-Ii_oHNKUJeJtpO{+Ww-gpSz-b@v|M`I{PI|dM~Usoe-p<=5@$s-RYmv ze+>Wq=wirnVr1$#{IzClY=O>3qvPno~XU+*hUHs058Tba?#%|J4YLAZP8f#sK1?oAOi z;Xbr%`h=Kya*ZbqMe83t|I#dSy0jV^`nFobs3QFyP5A zei6NGIrZh` zfti0rn=a3EjN?D2bi2G^a^loy)4sluzp+`?^^Ba==e22D({6lZvH3Oax5?RX-=**8 zemtSmxbpF`^S5sZ9-Fc4Wah-p;YQmx%Y3^krMj=%FO=<4(WM_kcQ@>gC}GR?wNN=Z zNvV1Hf?pH=Ich(?ZK`@J_L~OlpGl8YPM#BOc0Jy>N=jAR<3;7yq5uXH#cwb&cF+y{h1R zTw&pc8;?pdCf*QSaXmRd@P%vpR8@Yzd#_ya^BIf7a(xH=+`lo; zV!Nu8QMW#A(e`Q8lYSfAUctZlFn|5Y*N+ZQPyL+uP4&;)^>RD=&rCXIxp?6ZjcgU( zh1ZOJgkFpb>rVS@Y~=lc_mX(n&JSBoDz3BKuk$SGslyFhV}r)SFQywP^Le#=ZjCHS z*W6p95q?&_%rL#JtX@i@eU>c<;q$i)(QKSBmWnV(f3JS^iF6 z5y$Aq=Kb;8KMuRy*ED*!iYh2xEEd^ld((cyzVm^1T%XTacgnQn&ZBOhyHfcluKeqH z@%=;RzS~tZcFk#M-nuX6nA?u?zu5g`-*f%ARl1>=x7oY}shtTW3dG_BwNWmUwj zL*;4vrCASVZCX)b%gVgWHY@DcgXrYI#K7-~+dJ5MxKhnTZS$KoWbHP^Dkzr4IKN2h zKh-Yuo@0B}ebpDmV&)S(lj>}D&DvaUYIc;3r=Icrmut^guB>|1Bpss=U^e3r|3)Lj zdhP9UdvpGF__MEKE~R^CoiOLp9RxV!9RVM6*v}M?yzM)oc?6F z`NrV77iY4TyC%+$j1ITnv9as>PZ@(1uV2;N-r}ioOw@kenj@x76BaF%nrU#oZ}TQG zDeL1?4f`J0zj>(X&{tve>Rh(sxi=|1c3Ic_$|kVQdzo~Z{!EwJ@0u1izY~ud6wJ+TFVA4--IK6;o?3s8>(ymX zTke`|eHcDT@QkU=(mVW%m}c+&es^`reQg(+cjtnvvcFfKJzE#=&{4WQ^=C-O!OyRD zC&gZQddITPv}H})^yf#UAFhn+-;=}X`>yGh}`M2H=eZm(0%3iw-zx> zb#PCe{eDZtgKv+eR~A~k{1*5&cXKDl|3=-7*MtPL7Jd0V;mCr_l8QFb2|=?*G4OyOikrIi~#+4zKt8lj{3HD#!HH=9Ts_(~hm}=G}96y5TIZFHa6N&Ms7~eI{CxY})LO0N7|Gn zKP6UooVaY_Vb$EK(sp6;A9Eu48DXu5(C~S*!w|9>8{IYD3e(N&3<)K_@U2E2~ z?J3<=-PbIZ>G5*=npW}rf7PG2-O&gv;o+}lZQB}bcYZ;k&iT{tg`{+~Y%d4hz5M9W z`VdR814rA6?x?M4`Oy7r`TCH|P1b_E9KUa`vSyOAHS?ZksDCp_eT#|Rrn$+J7jM2> z!tnfQipF;a^J&h>r^!8hqpVKl7H!t4tHyUm>+0D`nmuyTZR9cg|_m+Gz=*ab+9ysn#@jWo1=<02iIg*znQeNwoHm=%dImMxmH*J!kne$8$&n?d`sg+CbetKm= zv%%Ahm%I=pS{39A*v9P|XIvpL+WZJV&%XBs1C&)Yr~Ig|O*PVJ}>b(xrW zyo2xUb`i<0_Pd+z1ZMYm*7@-M*_|@~;H%I})toD?opX+3c*diw`_VovEiNli!s2i}rDu;_+*jd@U{c#f4wqnuaF6&z7s4Q*B zIz7#xn7j6~gO|#WbPMYf(>ZG#R_~BZt?v2$dYeeTVgH5=vd$B>*-whDWl-2 zUT?iwc2+2KVx*+=zS1MxPxegEDc`WSDp(;m@^Nzy~N3< z$LsclY+W0U$I~V+npL>Rc$;95cFvUpIiVA3{rMjXT}u0UZgSRTm%VB}Piy01DiV7{ z?01+rs5M@akPheIXbL@+WfE+=kiY17#^!@fTbh^tp1D?MZ{Kb{9+$soI@h#2olQ%< z1*RJgOc_6bCXt^EIHF|m7KEEch=W`a}!TF?VqsikhgK3v^7xRuUw|$nrJin_(Lc`dl zG)cd1xxs_(rEhz;$98zjY&sqw^eTa=n0e}_1f_{<9@j6+Qo5Agc(;b@y0O{?qwKBo zw_cEV_2Fg2=i9uyPTyjG|5vJVvR?uZ`{eSUSsFU}&ny-%Px@~dP@3eptlIP3hvir9 z-oGnQ@wYqOy`{uQV{7D#_^(qR+i|>OS)(p_h{5gNm#ODhu@!w+x+G<>nkmy@(zGlq zhJ6z>LV7pp9BwMVsAseP%vZkG_ucGfbW2*CXKTN^(`}YvL%Cy*#i7 ziz?*p{u=!54wBy&(k}n+*V*<~sjm}xBK}psvp>%s=<%C5EJ6R8O4cDKM?vCUDa==<;+)U z*tSK3QOL*iU5;>LVM(2vv7>19trT{h>~^Nh!qy5+cb^JamUS_Cp9IWm%kgg*qmle{rPRL z;qI0PO*7mCs`+OhTj%c1HOFq7_J_laYo@Q5Yg`(aJJInMGn++TluMNa|1niz-3MG> zd%6nJDt+#F7>Ok3X1&_Gt1I-~UB4LH?MuJy+FUOAkGq#!bm1wDX*v?ynC*I}R_1@K z^^9Qtax)~_GT3q>$?{-D?<-G+dj3bd9|Y|AICqF z`tYgTN8jxX-LOUMx{P7yi2zgODV48UC%=C<$*^KY)KiA49V>EU8(v+}X06yP;E}N6 zqDloz5aaqS@hi7hEl`)_&adLgOLw*1dava4oQt`MhGH|;?wwk?zlMkPhL_Fd!)MKT zj|AEl_?oPKb<1qwQQyDkH(o!YDe}Us@V?2!T_wqv@`c-zK7W?@eD9V-$sy%KD#wIh zge~TGw0*(uem9sm=8wYnE^VPL2Mq0gOkBp-nR)$zQi?QpF?03fslM;8?%m;qxHC^(XR6Nr5Csk=Pt1G5d}u&!fw>w@g|Eg}!k#U3&XRljr}XUtX`6|MVZyzw{zLh4a9% zuigng(=p)Ivq3rh17Q*?*FEXUi!8e zms`bO-Jv$!<#%iB6_n|Tg? zUupSxY3;Q~vn@UR{~fbC?_aWayPdb0~hRnH1SCyuoTO}r=-0?SHs#u-UG2xX3DR(0lHvMI{ z+?6&vV(M|#MSmaH+A2Nl@p^sq?32|S*V^sz{^xC6-cfodP~LOq-NGt{1GU_jZioKc z$Dc28=jB7=xJ=LZWrlTny1j2A!mr;9{a1eGP>@b$$UgJ>8om6RZ{>H3$jSdYy!W51 z;FWJ5jMlez@;cW(tpD;;Gpmwy)kAB6*P+}uGI_Mx_9r`kv#JV;eXZN@{AH_V%4E+< z*7#hrM8{L6M~}`(IB|U1WvN?=!84C+>c80ee^t)qn3sJ=QWGt^rn6@+krY{;wD5xb z?cV2EN!s7}JGLEUu!wU~pYrGccUi_qXSY`=r!3_;o=vhdRa?vd)M&vLL$ALHaq7<# zPMiy^i_5*eWM|}g{nuHs|C%pYoLc61@ZGYExx!gn(QvpSW{J2^6gcK?A*C~ZI();|Cpb7=;@v* z=9S!n`)*Hjv|XFF=x0vcx{I&d<-TW|d{_PK^*(>|$`5RUTO()PO_-wH6MFv6vI7iE z34iYO41g)xW(}wo20cH)inky|f0_5>tqc2Y{+Ge)z>h1MGh(hE&Fc61 zUdkEa#4){(@9DgMZ&?m)D$dIb6_Ng9Bezq4eSXTrv-3ThD%!alY*fM)t8Z7!PI#a( zCr^6wEZ=RM`TkB#Oajtx`WP5`9Q*68d^+`F*Q)!kx(`spo_wdvmJg&Hh1~?&Rgs+|6%UL%gh*=QrOWX4~scj=?_^UF1G?IfTWEp836J`yqFa z|EKnOF(#J91)ke39=V5i^@|UIy)tpdN9yi~MHlCB?p}5;@5YPiUDsM?_f42B%+Kjk zqG9#@&Swp0{bdt6^`76Jw6|~9 z*4c8rGm>e~+MfGT;mmd%4=oi!FI0Q_?MUycGFX@Up*%hu&2Nps=Fg~6=*iZ^SmVdmyG;}72%_Go5L?4;>glVioS zcQkEfTIU@g9CwfF&)kO&FWxU&vSC-^CGj7VS~mXM=cGM}bywNF{`Lz7)3UQH-NM2X zrU+#AZxT4QG)7-rX!i=i+85h-zpT&p6MplBeFqn(_kx)h4bskjyCZV`%j9I38esYunY(yrK+C&z%P@bZ%=1;;{d0%W?90)QUJA zfs`GNB6=OY_wvME6h$@GKU`HYeQ~&y?IPs`ajm=sS?<>k@X5<(Oa6HJ@#VtJKVF~P zoVxJ6hVFqT)y|7e6ZXU&NyciK*AQg1?>f_1wwzl(D zI;$kzKDaPTZ}r5IsG%SSP*5A#|a z5Sx9Km-(Ljk?%eWlIB>rGIFq#9y%s;^``2cg$-?cG@dHI((;Bwdrm>V5idH+-DU%vmEVu6OJ4 z8ox}HlwsQNV1?TL!0Xd1s~bKWhAcPPKKt`w!B^c$n`S%+41Rf(_Zj1bXoe{D4>8=G z+clr(U#w-3kkCECqQ30u#_czFPNd9e)7V_exXh{a+UD44;sO>qK2l}Oe1g?UE`PS) z6Wf*e|BJF?2XFUUhbDy=t1f7FM$Y(pW0#iUMizhXDY=q6`}~~Ur?WJ)JQO>2PWf2C z#MYx)oJwy#96kN`&C`$F>hehZ_Wbcdgf%)D7Hdh)Z(`@TH=Sii^0&bE2t!b?W!_$8tKF4xsf zl>IV~o^$JZE^(@Yb?Wlk>?O~VuUCG!BY$ndl7f9&8=^xUWc@587D{ku&nOXC(mu`O z%YxQUC6D^$se5;QZGAp-pV9+&=`%rvB@N11ix@An_A&ZKRvnl%yJGdm;)Wpm$u6#j z6aRD{UB=rV-mu_wo!)IxiAaUHm2CCjtJ1G+5!6#q*Y(Y~ANyH?ksRa<&fYMj_@sW&T%tDinP+kVZv@b|;} z3x#)>r+emcgJ8qb?TWIogcPI+c`sMiLbN1sLZSfwY#mS*M2fmxu<(EkX^~d`R=cn!v0q8 zWNq;PNm0fqp(^9K^V&q(rx-0=%=-N1%&NjKANbwx%g&#)JVySa;=SGaH>_qh868UE z{5LCrFGJ<{sS?G^i8Wj;yU$#TdNyIg?;y(^5z#dZ)qCUS>AX(4;QFGiGT@?zN!Mk* z?GL8cFFZQoj;hhp-e1Mg{3bPani!SdM6O#4);kG;cw5%y_ zi_{{1g(YIS9A})ebI(0A{J`dVinpv}{u=klt<2g`o4e0_S_eVQ+?1pli^r!OzAui5+c_*vfFnzx0vr5=CR8lT~?wTbCT z#9W(#-t)W99CgUEcwXW)kM)B0AxVMW2AxJpK5l`s(>;NK&oazsa0LFj)GPitFGJ>t zk>SzF$9z=HZ3|dl9DeRU->!a|t)*pcqS}Aca|I1G&%UW&{Caz<-SuyAT)+5ToPydM zpCpCEhvu86tMsSXJT-`yG7N5>F~j$?P|mt17bc!NIV<&0e2+lzuW4%Ugyn@cSVYD+ zII!OKzn8GoJmC<-=J=aAJECVVc-gRb*X`Lyc1iU3NHF}G^UjaUCvMqXQQn!8c0RMv zUg_g6WuU*1qge6$%BjVEire!3>FI~RIH2kNmNKh@9qJqqBZtaKV>ayqo<|CF7e&H@Ac%nTs2bSsVn?1 zKb5NbkevND@bTh`^hGcB{YbuH))Qs&w14^3M8R!-+pTZTPVty1Tax#4mi9vT8a-yk zDf?{JpE6ZrvE9#jzVeZ~U;$suiEBUSn+J9kCQ6y5n6rp)V9*Hai3{~@?u=zoHM9#e ze_dKJ@rJv~zRh31nc8hWD1LzLW<}?N1rs#gGN`b=*Bu)5HmrBZt5`O3!njgr%r z6pBnqJ0kgAPowOrlaKTB{L??RHS8laWHzrcdv_|kZk?fKMd^{%ecO^;RwFXj5lH;0$Y{|jEpzx>z!|FYi; zzqRK~%KjjocvG%nNA&Kv?Sl6;B-?PPhzPgdIG0v!vBDrlY3GU!cO&OT8AD$}h_m&uc;4qx2clF4h>ETEA?|U*yNb+u)}}`^9ac^(>Xw*K!^SC|~`q`d^LjlYhdCPAIB!Jkz&%^?BE+gPZcy7fVNm ziog435?)*>de&p5rBw}+dBN6q&H5Q%B*iEI@Mp0fYI zvv1$pgtV28#7xigG+uMY>WmU=L-y@1CgwTQZY$dV(|u`dda&mA{inZbRyql6S6njD zsnqyf`Q)dqI?L@vtJ{4K6s7DC%X0D-N=bPwq;k-D#U%fIF8?>|7OZQw`7UmH=k(0G zKhJGDbETbCz(_vhncwrHLPDn*YAhceH|KC(!9OePyr#&lxLwAdCV#H=?qTMt`X4jh zbeT@BcJ1}lJGT}-+TZbLTeI`U={0RSy!V3k#(pk!)4U*)g4VsZ5sPIE03`E_cC#=ZQstQI|$ zcI6*sd*aT#Sar+^LB-~D|Q|AGBbPu9}9 zkB_&_+26|gT66pB-~X4^Kl?uYyS={L9Q}8;5zn3<6@UJG{@-WYpMSTD7u&zDzJA}2 z_@DoOeQkdF_x!Z|Kjz#2pZ`bsyuDHH?)^WO&-t%!_kYj-Kli!M|4)y<^ZTp*mFNG9 z|NZBG^FQ=sfBlo!S-(D?EuHcI|Fi4!@7D{w`7h32_j&gJhyVX~**|HRC7V{*$-FP( zzR$PWVqX|%B=Ou~X^L%Z*tWIG%T-Bk%?FO6I1zzMOH{wLR!*zjXd9n-^+O=*!>Zt= zePPDyUs!K!ljS9jnsFZ+4sPs=~&9V1phhf ze=ze)F5Ou)*EPFW*z#)@v+H_;JqQ1#yv;M-Z1OpjbyaVn{_;8c8vIO`-snzR@PqG_ z{Zhs0{+rCs79RR>d&{AhL36GAyu8l+xc9E}RMm~|-@7;5=Xw1)+lozDIQR2iHFoxe zm%3B81peK8f7#hp9?On$_ZUrozy8U~UtfOI|9`(Y{rvL#du@Jw?nqvI_2yx5nF{CJ zKmjgRk2K$kY zSf}W4fAoJmZ|Av-Daq_z%0~_=+_JwC6Ds#?<%>}5V?IwM^gpi4Syk1x%cxIe&7M0A zyXw#L7qtBIIi`5z)g19x2coyc&TK1K^1*&L*Q1;V^<|<{jD_p(N1oN$75a?*>f04{ z@s)nx6C5YZmOj#UNlW*7N75CeC~3VH2bUM^Zav6uEdJ1GhHSLB?vXuyw|}OYSwFGZ zY9n@kWlaj-;=RgQA{F(?Q^NN#iQko8R=vf4-O9uK{cbs%L}c8Y}%K zDfh+Q?=yceq42_?)iyhS>Mi@jwxcQB?9Ha<3z8T3wRz9G#HoC`&EIJjyG+fg+oGxB z7y6%yZIV3|wavb8=JQuCICLb-Gd`+c&{zE5-&)&$Bcz1E?)q1o=t&(1*Uw*ZK$vY8 zr{Dn=*D{S(#jQ={c^ePso%}AfcS{4C^sMvGk1qRqj^DgloZ-pE71u5I>O6n@cG9*$ z8Ma@uGaP#lc3E#Pyx_WI8tXf6CCOBFF}rsjJC0W!)%x|@eRum=m51AI&e_uG$@O7T zRk!7$7f%<&G#gI2Fy-3St&S@WTwlK3b)(|^pxQSF-#bqJV*Oa?_?r6`Tg@9*FL>ws zzV=@EGxHgodyj4CS-twLR8i~!6-_qrr9!$>pI*;aKC>rk`g_qO$tS~k|9;x~Pgs0X zR~fVAg#{Cq}iXCOdC3r{Qt6ZT@K&CdQZ>IO>lvPQBSbSJKxMR zIbsPj8DjVFp4qGZ=ik#gt0h(Arl-uhp558=)v&indQ+szf;Z1I?qqv1M9#jE6|rI7 zR5jCv*=L#hU4-H%PStp=$(r~=;r#u+-k0{XyE3JFVV6ptL~d$*V7`o|(_$S$^S@wMlMkFAGyz@nxUWrK{Ip4a?r5U7OWmp8i_5 zB186&@Wj|loj+$!wy4gy@7ecp&bkA<3gY}04w5cbri;V_O^wzqP&VDh-~86DWTT5l z_>-Mq%0Kt;)GsgHVQRTzewqFwd6fXi@WZFYoCFWAy5rySeZq`2v$M}{NGswza{qT% zyLrin{O89QSfq3^x&BX^%VFM}aR0(b^EcW{!#DZ}r$)y_{`V+SV7jmHez#Qa?bL74 z=Vj9t$k=V{)%ke-#;Qlv?vIXs<1pMMSi=3Ewf|ghqhXjre|FeX{ZHREelnuL-iSrp&fH|8SKE}llJ%auyz^_u3x$E!vYe|5?d%F117iQ&kGt3S;H&Re z)^cX;rH0FF??!*hdgjRZWTK9d1N)nE8}5})C^OgbV(TrowPC(;Y4(i+YkxKC)m*t9 zUhSv2@j~>ISCM*CWCLS!vRZ;gg(o{NlvIu7&|?#NJ$X4p)|wcX{TrU8{Z0;KC=bX^ zx3R2mIehxrCb0@__M6iKoLf215+KlV?%bb%HetRoF>{!rIaHm&gOLzXX z?aShnCu%Q=`C)L6ZOQMjZvO?DMk|_n>eaLF#&Dh#IoZ#8?AJpJ06Sd65CnSx8Hqndu1kHX#aVm>C8WWY+yd1cd2US zF}79JcQ^bv6z08KCPi!e>B$f6nb}j;B$~%^|JY$Od5TP_=DA+yy&~n8-+R7&$=+Zy zTj}5QziTDiUl#1{xg^}fVz=Vwxk&GZD{}j*)Er!Y%(?vY^`|VS^@rEbD@j!q*qpU) z-RdMgiD-_xFRQYxB-cn@U9m&belEkWb;5V-E*Bp+txKJ-ePP2aOJALrlOE(|9G2_U zllc0tBx&~zPd&j|4^`G0tT(7`l&`sZoW~~afwkG=$;vhhjG7;c+x?0E#qoEqV8n6Z z%HzKKJfGfv*K?a$c5%$Ks97St3KkXOY3p`RH#_pYmM7}q>+|dzrS;M-zAoFgs#8<= z{btXS_J&7l&0l?t7JmPDWsq#G_~M~a_5=G|~+{{jK$ zlfriU%l*&Bv~haazf`T;q5hnuzxbwWtN-MS?1|r(yzc6o{4YKBT<*c-hZkkbj0!(Y zuTJ)uIJM%Lo}mf{mxM=RV{VV+;<>qg_D@!CZwU&$Ch&OuRPH0bEzbfrU0Z#(V@YIN z&AL)s566cBc4;@9zN>aTZLHbIaF)Heq2iLv+K6zUG1mYC+3yicZH**%$= z>Bx?)Pd}`gdcR?Tug?T@}mb+mpB#detyk1r19gq67$I&9d%pp1ooZ} zjXBZt#(n>ri~HXO9-937nafJg{#lC0XI4Be`zLnrRdk|E-A4Y5l50oA3tw=YwYj-4 zjBV|r_<280@~)_N{BwQ%iP#0J1JCU)OWgb6OYehX=A_r_F5cDMA-hp+!3~atV-4QB z%iHJAlB$)p2=mqSU_AcT>X@f_=+Toin9i|(<=FRd^}VWRLR&cY$CS@MJ*_~xrr7?U z+U$gnQ7`5#Tl6dFqtu3?vz80k{90YRB=&`M@5}ybu;~BS*!c=yYQkS<%Ozwu@S6p) ziyh{Ot#9->V7oQSv+zXr(%lujOWm><+J3b;Y;KSYS{C}@uFVSW^_{(96HRmPX^6RL z1!wa5Cu`f>I(ubx(YHSrKT94B&{?&pae4ZOCYKG8J`Z*s^T=!oHdf9FNqJGDGsRM9 z)BG#z%3V~Xp5^U!5z70y+*{b*wT)9n(D~`_O$i@80?%%r7V`MsR5o>u3Cx~~oBljg zHql*~wYGEVY@u3R*Y%GsxN9W2PHcPW(x)kT!65U(61J4My60DP_vQ$_zd1i?+D*m3 zoeNpSH>SVzsMh9?cIXfnt3M_1^>4S{H#-F{^?B<|{}c&6pS7V!a&b<=F=s}u=htjp zy=C9XGC$sV_b}U}PN1fuw z8^YO!d0wvStjssQ{`h%%IamD8XKIWLd+V}}`Fiwko4h{JO5NK}>cfxQ&)3hhtx8mw z@0gy-e|=6_S6p!5!)vt{jKz|J0$06VFK6*)gT$_h-kfKxR{cKtH?6NQ)OuR-Gxg{v zQ?7h)-TCkDq;nUzS7d$Ra5d#~FzYJZnCF=2@LGcREW=rEfom_zWs@_Uox_E$ga_2! zPiEMd*evk0QOHVQ{ZdZ_TjTY2lRvsiZ{G0Tacz)*mk3v(&6WHZ_A;LAz_X7F=EyJ~ zIh?fl*%AAui*mcGC1302TzGGGin-?Z<8^{1*DXKo*-(A|kk`aAc1Eq_+@w|y=UTQG zcXfZ6D*Kkt`2EgoqJDX_kmu%#c9t8dB{?f3y4wCcdGYC6@so@CTe$<1?O)o8mOuEw z`!cFHu3=*I_1;T=Up(2pTyJyh$3H1|jHeusZK?0eJjrR7f9vF_C_R^N3lH|PgZFOg zh~vfiH{TW9x7ZOGd#|$pE2p8^{^VCi2FIk_!e!Bb%JDfODQo}Fq6BX1YcKw?T_|0&S@iTjFSX5@;jH=_8n+kEp7Y^(e61eFXn%IF(7`5!P$~)kNsb(wm&_-++%Vg+pQhnUQBxQ zZTpk-bFvYPJu0Wo?g=f>XzFvR_LHu8@;m*$uV&`?>iZwKYbux-%-`ijhQ3u*xls`M zcy48;<=r_>du1;5nQD||TkfrhKcl$wb6G8K3IBrlsIToRDKeSaYfVcFF9c-2_KJPp zk+*+^z{P@D5$(AW%nvg!>pf-IR1>$YH12+Y*{@@2f(z{=YkzkM?QN(x-+C-oAwn-L z^Poj*ru|`J67A~E-;`6J&apuiZg_$4RDy=7l3)MILsnLA>v1Lj7y;TLX z1CNR%&3|5^@N>JS>&pih3Y3o6v$;E!1^MuCD_Nb?^D66kFy+qj+hvcHD!%# zl}}gp_!M~0shBq}qegqWq`-Swb(_N`XEy6q+jgt{@+n9$X^S~`_uZc3I}|Q;*i3v_ zw0vDdch0U?Q8_uY_pGsPE}F13k@e=v$1kToUbuy8o%V%2lP@s7cs1v#mb2962MIrv z71VVS*IY7vdV%-zPAmE9Y-!F*ZAN>mG@qIp_Xe(6Ii+F!gs!tQn!Tetl@A~B`QH*1 zw&t$mw2~DyGw*G2Th0^xdFmchnWq_+-(rk|1&!U)4*opXkYQ+L*(~tRxg)SnAYLJy z(ZR0tG+$fju^#v7t0y1(TgJ_PGM15tak0{>Yv0gr_E_|?d`Rc<9ITY$E=k?3nxaaI6+qJu4K}APl`ZcRHiKVB756cBb{pczQefu{d z@3ci`aN+d0=o72rw#+}l|Mt&{vU}#W#xGSGwuo;yYVLnTwt143E35mpqC1sr?>IU< zW!~@G?|FRk-wnrRq$ypqkqy$z-)yADlJ?!>_l;kraobj$6PUvMn8m#I%<67Qrvyv8 zlKr1kGA*>$b;iy>Fdv?36hiIf0Q>}-5-TJwA z1KS_lvXw=xeA+h;R-_6W|K59>FW-Mn)DF!fJ@4EnL>rVPD{sHWeK;y=S-JhT{uNcZ zTS|6(Eb#l~rZP{K(dI|)W6y`PLi1j;%}^ECm3Qn$b;(TM>dw3#LnpI`GWnrWH}W4i zFAp`n?cTCof6C#9CoZTxNsdn_xEp=`;=ziRqrV#UHp~;>G5=Td(}`<1G`!RnOz4VN z4`fc_ouH_mGeOKKXG5~I`2x|24l+wR7pCp~V(j@{;M<4Yf0ym!c3w~}#26^Gk#jBE z-^q-VCcFIpV6^_TWyduMWs&8)!EAT;nl5))Bb6|NAtgBLr*8i9>C)FeofLm`b(f2Y zXSDd|K%d>`%%&)=Wf9)fxV^#Z%N6y;#V3-F8s_NBT-d2ICHs`14{y2gteK@t47KMu z{xHg)!~bUDLzNE+_w%*eL{iG_Cd*0hKlpmBf5uAB(BwH2Pw;wlJ49`Ly88XOD|P>- z{?3`NUYAnjC1OG_5RH!vBj+-idULlfVDrd&`nq;b#%5$s%l| z^X=KBn+ms9w>NmRW+m3M;fPXny^aKJ&;l39a?2 zKB6Vpk7}Q}KRx`x@ssOB;`BDwE_%sQr^lni!`3X%ygXHC(&3Qy(#EeBtj)WpUhv-T zb}wkrQTZ9}`%c`xb0p-U%&3V6_eGMEwk{QLEQECWg)lMEo^Vv+jHP_ zSa@9d8MlxVatTLtjvm?0;3^z+;e*uA$+CLc1y1b#cLX+n{B~pQD)-FBm8ET-`;XQf ze*g5BPyn}Jz1dQYtvu?bb(2r#Z|d!DPw3t04-X-$M`4cDG{>7Rw`M-Ya zc2RHM;oHs9YgbP_Z~3f#KkMr?cVFngTEDo_C~kfI&&%=dv0rnO4qyG%*(q@$_20S; z`i&o&+#?G=9!a?5J?C}l&M02flDsnS#+jliU1CA;-`a0advQ9w;^mi`+uJyTa_c19 zBeRkV^S4LbynV6Y|Gg7O?=SDWqn)83)?<8mabwF(>GnlJihF~7rnc`E+^|Y^$#!;j zk(?aykF2%-S$_St>`d_2lMguXZ|fdau4@VQmp+D_-S&0k6N8_}G>#vh(&IAw#|-hk zO5Zqyg6A-`o^{Gue9uZCgFQ*`p7w_H4{zS2sO(`O-qno}=Zd*vc)O_e&w^zQGEF7Qd- zufHSq)py!@afQ1=R^qW2x6IkT=c!;1k5zxigX%e}0$Ymv{xLmSvn{(s_n-KBKZRv4 zCw{Qll*@d)T7Bcmt$$XoR_1Zq_2+;1C;PMOw|&0)<@uQslNtYC9u%KnTln7G@!#_M zHHH7X|DXK-MgP?QEA#)ZRKNXXy<1$=3iYQkuea@Ln|}0U4cp-+i0f1!-LU-elhe!i)7xU#Eq-OY(l z8BV{J;@K)waQCE0>)k`*KDplfjK>zsZ@4e8iYMU-4PJ;Kf!AOKxlSGiiYpuO%M^e6Q?Z=*t@PIVoJp(;&EWT3YZT)hBmy zvhFXoe|Y`K(b)K_dvtFdd$6|r;Qr~g{<{r4G7cQ64RHQH=V8$8Mdos)_Y3~7oxJ9B z!Tialm;Z0IJ93*>?F8f9tEXoyH1Ksa4!wU*!p2!+eI@s{k7;F9pYERg%)IvI`QikN z)NBbUCb!ql+b-^!C8l*^|Bf8~1LulDW8$CbF5P^3Yr`th$!Td33O{wGGtA$h_o`;8 zn~cegC#RE49E0|(+{WV2m%FDmMJZ#>y{t!V%N8DJoOinNVa(>QNiQ=)qHa|hSO3xY z{qM!i#p=iP`4`w4PZxK$x3Ok0Q7AZ^vC7n~>$!GJ#DpH68<&o!NNehQc`PYcXLg_F z8W%tPzZIYtSzB%gS{7KjnDZ>LEju7J*RK9Y`{T`T zemp(>T;JUzz;@^E#`Ksh*_zf5ZWoPy9Gsvx<+M0@)H=<`A6i!cztc&y$6i58G_oykA@zOVBV>AjGO0lf3Mg2|Cej(zW;nVf5J7t zSD*fx?EJiXe))Z;9Z9=`<#$GH_pV!-T9@YhedS@v1JVJEOXNcKrEJaF`CyCV-gAk2 zH8)8xWeMh?R=~6;lui^w?0}p$}xR>9`d}@1 zVZ1!vX;6rc5bm9*qeMfvrJ@B~hYw^|x(3ET4KzdgitHM%f7_}wnowO8kDwc7dH zM)K5qmRr4czH{!Z=k_ty4wzmv@AVRagT84NX4;i6F5fz1Ud@=-eklCLvAEunxzqQ) z77#Tz-pqE{f$@7?(|T)fE`d3_PH`pu-!iX4CF;nNw=9g?7~V3KKI`6BC0Tz#0?S$t3VKMC3G^Tb=;A3E`%yJ-TO zd40&lecu)t9bsqqM^-_Xf6RJ$STOD5&a+`Wd2R2q|0Psdm(7&1%e%}HF1#zwx3o_S1jMw!aA|* z^P8fz8WOWViB1)ZxZt#}%5KTRUbE8f_chxL)7UFLcZ!8i4$GdK^hjK{refMry))f8 z^-X_mx?(-yP>aCA2$Qm@yJQTKzAQF0NWNp<+rRMc)1>-WZ_^IO_T&dvPq>hG(QgI+ z$ykmxaR=t|I9yiHFE*NyoMEJ#oN-C>`k^I{*XX8H`B`1&%VOTXwQWIO?N7ZbFVljl zIqQx-xOMP*U0HcThu)O){r^kMigayDB-cEAuMlbO)Z6l9PwLiOrJE1Tj*SndiRj+xj*B1AFQ(h0K^j%l)EJQ+tBe6f>t!pOexl>)$8nIYoGH zy!eu1Nw+(A;=;o(Ke>5Q_ygmD^$n-riXYf+wnF}`tntfRPfDl!-WZ)x?WeZjaNQXe z@mSfDD)*jpy*&3jEoZVUM;OcONA$7i6 z9=mXTo2+9io%V)J?)UTBuiw4M<+c3mPCFlad862WF6+5h zE3M!BeZn86#YJ~_d_Ng;eu|i!iM^}!i~t^?pTD=A;|yWiv*`;L(~7#s=`L>rzqrO# zKR!Bn;z6;`78SKs)r#Aa)S_>u$Cusua91!fPF_A;{2BWc1LJRvC5A4Xp80!DIu|55 z`>`z(_W0NJFE_=J@npo0@WO3(_hn3(68rdqHs6=PjYZpcL?_<$v|!cs5DLk!lD=Yl z@w?ZWdpFLjSXVsji5B`lJw~u&`Ry$WFFbo|bd5(w@$!uFX?Bk`T(Gyf^>(*K4%dy0 z#PUW9|4jwSni}&zRR`-BuNVBAe!Y6qiix48RV&WTHoUuR)xnKra|cxnG`f}!;yhwVb#=6}S)`{p(6>eYImAE9or_WKp@-J-&` zCtAI@Cg5VaI;+C+P@DDR2~VXMHt0kC|V@dzS5#eY336 zY2IJkh^RHMjOwR*dljFXYL*pIWBl;#wx-<7`Bh~t1^@P}y4(9^U3`H<%lz)xvbD}P zCW}`+`XN1SS?{|&k<(Zi(`NqcKY04=pUXCZB`hx@Kim}WQC#o#(C*g!pZfds`y;CA zn`Rtg{P_IqnmgjYtCB2|)~vh8=*4yI!|h!<(^gB*zT{{mHeG``bW`Rh<_`NM^EN&f zuD)Azd+FyB`<_I^POCM$nzmT-dfDU|-`$l(GH3e6P7|N5{kJ}MOW7{`Mvkohxzh#-ya75x&8O%bost3?f2_{yyu@^ z_v3ZD#r%s`_x*bHeb+U8dzqI_cP)12{kLVmWa#-nMryW&Xa19Z!^xL?(l!JIKD&OO z@91#``KBqsd-B6$W(U2PkfH3Ab@5z$_g%txt$`GiqN~9AcdI1c z8y4(d_wsN2M}x!VuZs6h%CEIfJ#RYwmk#Tm7!Q9FR+IJ0|8{GARg&J;6_jz)?AnrP zAI?r+ZNBUkV}nrG*CeKkE}D1!UOoMI@#W|A4XS}$4`cH#TT4bF!~lK##-<%Wjr>o`S26vbAJB8 z%*Rh=?3g;e^LqH6$@8avZaKca{qqln31xGhRDN2MBzS`F=rXU_eS2iPg+vO=_VKIQ zs>q+7vi9Kq)bQAe6KZC@vyDsom~6dEt9%MHy;0eVs5QC>n`UncSSa~e#y0KIPyiY}MF5sT|=~I%>4gROX3-!&O&+L4^Tl0*!V20GI#Jo?P zKUO9MPrOkoV|LUy>&nT~zYF%xaJZNCa;xLF_?rH!p^8k04RS(aeX=dpj@E|nb(MR^ zf7tKNqkUC7TnmLv4_;Xi-g@b)-mN|F?>pPgy=|QK_~-}gM;kZAUYNGk_2}Z~^W)^~ zx3O(+FTHBQ_vm6<)2mvm^U_5Tu1SwWmdGso$tGoaK+MO&DzLYcn|-UWlC7!aUhPlY zW+ram_sQd%mC$qsk*w3d7FK(<`Z5+ds&20fPq>%F@#om&D?T}2)Xe;J9i=Cz@5p&j z=O8U>9piiTbd%4&137ET*Qu4{D94+MN`AX@dv#G}pJCytntgkn+qurc4+iC+t?F|iutMgy6%*nnw`{$bp zbw%ex+u0407O?C!6*YU*#$cQ1%y6K*&rGu7Ts8C7^bcxIZ)dD$&#_$kXYVil4^t=p zefs&;>=W5XS~{*NGAzGgvh>2`sw*mIKAbM;kBx~Bo540a(WJ2A+xCs|emPThpVx77 zHOtAHb?s+;I%|=sz`SiS%@6PHSmbZ`;(c0hLPU7`k@bpSOyU_zvvtGe*Z+l zo&Jt>N4kzYc)I?@?zNKDR}A@%r37CnFRD*s6Fg#^oAEY%vtO^D*O9^oL9ab)1>YrK zS(03Rr`7vH5?9eP5vhh;&rjy_6(WK&)+C#*_-eMvJ8g^Dp2=!$yppUOFV{ui)8Z1@ z)gJmrWy6mf?yH_%ELr^T&#JPFoP+9{f)rl%_1))+I-UCF=v&;N3l|2H;POH1EyW}4o1#gkWLYKJ+?C&Qq0bJx4iN|ImQ zW=RV3KOZ;G=6BvKi666K9NT*KuyJUKtS*`+cy7D6ab6UsF{BH{}?0UAwt@%acphp#|la;*Nd{yR};7 zj(5;*re~cq<8;1X>3ZyXQR`%4a-Z-5haB@4iw-zNMn6}Gd%k-8DNNhxUMk73NAft|uSa*P*M{{Ue9^DM_%P_%`$so-t!Lnv zFR+}~d&c%PE)zd*ON+V6RWen7ZqvpEE0mhjvbV&2X`UuGD{b|3_A^oDT$@(_03x}`_K z*W9Jk9x!4(#%}0BmEfmm{Mk#)e`N7CY-zY1cW$?g@JY569_KrF?)g~7=Dj=d^w0aQ6Va>P{&(DR zYYIL)LpCH+=aJ!m!Rgm#JlnTPeTKiV*|D`p_Hy5Cys-F=Yebpb=US&=%T4Q?PfDBa zm*rgS@ASvu%<LWj-G2 z@i$l2cUivn%%e-(=$9 z+t|(Z)9?Qb8FkU~xh7#JCp7Zx=;rt-z;}Ncrv|UL+p{@(ry35q6sfJcqFS`&W4=`W zHrtW~-Cx(3e)I7*n%~(HxJ9nJ==efESKj$5Z*J+H+PCiP=IA4-=^L4k-+Q&?L)i5z z#V^j;Ug|wIt)CeS^-eN*+`g>0`fIuPaiNFv%rDx^ z__iS@=fu43CtZ`QtY%!ke9BJsX3mVz*-o#yU+6r)xXH8j2yCihVAt7uU~ObzD?)jz+g0 zm&g1&2aMS=XDxOQkh^dp?#flyx$&_N8~hyHW3pB{=PNFLy7Aqc2b0%-+8U?$F|BDw zp@N`!?ncE4Q+4+pmEfJ0mb)eO#?grz=JviwZHwnRdt})w%ZN|A^*5%lKE2{2J>mLx z>D3EQUl5L&HvPDJKi`*E&9^Pon%8d=pT1sV%apWRb;Ox}`GnVGxJLtVV|>$(HW zgYSe@d}q3$c4%H${w|O69a(wviVe>6eOoTgm3)}#;!Tk^c`Z9n?fd*>;>8UuDLpcE zA-<2-wA^+pJ}UaOC)U+@$;BxTr-L{J<5`Lx}|#4*_;}A z#l6qcUnulWViI3gkabt!c;Gtid>-M@m&;zi4oZ5hcJA}sEjlJk_IXY}qFiWuY2&P# z=I%!_cE6WDy0IqGUEWt=v5wNQ#;KQ%7X7|E!%SxXwYD7A#1Gd#9SL3L=~f&XVzPVD zv5M*UjQEou9#&(G+2UA!&GpLMFXyuT!WO*Svusm&-1eV8ZydYLvEA|D$xRdTg5DcX zy1P=%|ER>vuH1)q_D^<5?_bHhsqwo&xsqJYz$8o7gzuI zbFuK-lb?r`pWpOvaevZkw#L=+vwHsivyYX8Q-niB(&IIoqIyn< z-uSko=;Ah|unP~AYqf8gH>>SXG0)StU$RHC`g)H&yS7@X_Ks5vx9RjpuYIB)CtKys z`FcXv!>fh?MJE^*_|E?BEOqH%#1=+jUjwJd0by=?{Vb zHyU!v@h#03*!j6AXSu^fdlNbHKW_{4&*qygPWYn1-2AWXM$4bAY|6E-Ill+mFFo)# z=#rz>z4EH^i8J`P4*xEcwKxyjbbYvZ$y0|Jg`!s-&b*TlGEdCX|8?Fa*0E2;C-44R zUHfm_6j(P;5!iZ{|DThN#?b^LnY)^Qk zCcNie|Fk77_LcUQtCN^!%{^;Bo6*YH!^nQ(flm!bX2b@();YdNG-kDR@t687aT6bw zI)+}Ct80@Nd38}tGCSe%-iQaj>3r{2SsMSHHaBl8$If$p^XJ&unkCCuPUmYsbtY}D zA&-EWu*!oC3*U+JM)NtRoa$&ul$r2*-UX*qozp(d|C_w#TKTqj(%V@-ecH38I^FaB z@x%=~AHMWi<-B~SaP2);_JVn)7Z-fXdz1dWBcSGM^7+13(yBiM-kOPWWiOh-Q~WeK z)A^@F-{r-R^W$r$&$X%kQ!~p(PRln=(J~`Q`^1EXt${*!t{jcgw(H!QA<-fE@Xvgg zM~O%Fd|4EgK5^s6L!!d|ix^GsomB8Tu-SF(g0F!|NA+Wj;?@bl>jW4cWQIXCF4o{@!UWcmJAqbc}bk zUdr>ls*s77cUCb^<=_B)_dcAqc)#S~z@SgN%2x<;1n&rZw!8M_7emVlB9aA8 z<;Qj2TW52BezMN%hRbh}n)oxEshrac99lRV!KEPi;_sIGw)sOpx zmu2Z)EL~OZv+}}ir-mEMOSc@T3Qfv;_OSI@h~LBN$hAB9 zR8%Cj?uUxa<~$nl>i?tF>(AI48Y(U*u=u(Ji|e9-NBdQiPkC?aJbhrrHI;@X z)1&zWW-vU>d$4F$ez@h5xgUF8p5@T2ZP8phVNWlgrR>V-A1>tH^Z#DwaxAUl#3w;X z{y8-Z$}S{cOrF?gx&MiK2KVOLiO089*?w}m_d)a3R}cTXC?9pt*q8@Tj-L9S&!)%m z_NK`}y905&ciKKxR>)?0R#h1$=GVGBn10^;#;NN|Bo2L4e?PJJVihz0!~pB9>`$`S z-FrRj+QP#f{?eK~+cwX9Fxfim@K>3hJ3CHau$L9F*qw86&u+cU{Gji@Y+k-C75eD+ zI&yX4l!Z02g&~_wFQ;03?zF{|GI=dB4sXsv|O>;`82^~?pM{w;L@3k z1nMtnJy5=E*1zhZ_pPp9X)H6+!p&G~18&6zJu%Ey_`2^R)1%*)3a)Bp-AntI_WYSm zid^#JRYuhb+kftQVddAtyJ-Q_?+2$nud|-izjQ;wQgzagGFz+Jcc(gNX}%YE?+)IKXVmChoau)U^J*~cek=@wndRMicL7~H6 zs~P*()}7iC*Dho2q|$rfu0n+PV^eQEWuebYlb3uJI&Im0HPOHK!g+^P*PIW(iM=dW z)b1@l(_wm8vHz5PXO#1JWp@>w@832hKg6?T_Xi&im3fn0r%Y&bf0VrR{nfJVse)Et zM3-)0@O!g0=R?4wk8UwX!%zHHn%tD^=C_Jrm((}y@P*H>NIn0uFF57Ol{Lj3374Ix zc>nGFsLNUT!ASr0>@%;W>hc1NKiBgY?c=FjTwXb?yF$5Nc)QuJebG}+uDyFS`QT|! z4c1PNXZd?Io0Ry>1g?uNo$%zKWr1H*_n&rbK^;)j#- zm=|!LIB>@#^sdiUV}{N{-J?LD{=FN|Gi&926Bj8DD!d)pbEj`olL4S7u^ zf~$U~*=?QtvF1kAyZ3w7*{atc-1SiG_Scq-vtL;wVrB$>&W_k0VtDW2>gD~D4;%(G!j2rfXfs{ylU&j4XXY~w zX|2)=I49E;!&J}no~7Ne=)JY&loir`+AODde*8Z;>(FZvZ{^QSk6Nz&o-3F;%dkT# z;s2f3=YJ(O@A@UU%6QhMcOti6I|?-RD*9XR^a)YEa^=W9btA5BYo$27*_}e&?g`yT zH=I!4(I4{V`IOS$lYT2CciG14HOEg*JbI4pyCXCELzUzY;&L`z`c3o1Eaml-E}k?z z8KS|y;P&w^;py%iOAkrz-sc_~InQeA?e~?A90rM}H>T^^A6d2DRowRJOWQJbMz)kE zI-G%gO52Q_q>VQBFJC_C_JlpJdGa}HUb}q$P@nhS$LVmxj5Z~4!%xR#wjFf}%kAJ% z2{GKu)ot{q?crag|B5_3_gjw{Z<@K$@ba3(1lgBP(X2HQQI9_NHTGS2a_d-0^3`j{ zqC!ffmtAY&4HZ9~$Qo3ienIv8E{$_@X7pMw6h9pso|69KzO5O@t#9+VJ^wo8pH5q6 z-mm@p)8cZ1QiGK(*-*}pJNC+Y_Y+F<}}3V4s$3r zwOCzwo4ea|;_^94;@_f9f6Fcv5ZbfD`rL;lHBF-CHIu9^&J#y9al0RymH|L zx6zKzG3w_fOQI(G9QV|Zs7ovKdb!Tx!LdjsflA56Yj18n_&mw_lJNZ;KDLT8ecqM1 zg<=JrozrUa6>3dqPn&#W^+A^1#@BE6g)=q=itS@5zjkeZ%VAbGZd(UQp|0r>Z_d4* zFu!S5R^&#P2Bk^vX)g~dooZ1#sHl7;x#P9pt{vP?@$Y2(>i^F1NxODo^8c5-^@6qW zyFRbpvZ{G|;bdPxa1)IF)YvDg2-FG^DrQrQCM!V&U04 z-nz-nGf&gxZ!(yz?!J7vb*jCc`hl92=3F@s6%+6Lfgbncq@BwZoa*@c!TnlZg+mF8 zuK3QKzIxN%nZMZWjXqiIx!%KXSvvcO>1qFDW|=G6o=gAiYPS7wPk}GctwAFo_J+or z6qzIr@n>fzO!C@nJ;P$|`q@5e$`hQQpHiK2eLeftD+c0Dch*Tql`XBxDx95|UbsP4 z_Uc|PSc_1@ZYF5hOVsNTW{cRZTg4E#Po?#b{*3%OU|1Ux16|e zzj^r%IWhGYQ!i?5@wvidbg!q&Lg?F)j|;m5o6>#?t(VIw-^2cD#ht*ek_9~nuSmA8 zFO%i3d3l*ZVORI}*qPb~6b-7`4<-60#Jef;`8u`lNjR`la1&#?fa#vbDrFhvN&iY_ zn?8EsGCi=TlTE^L7gy;{m1~YdlRX>1Y|EYaRGLMI{n&Zo^V?=TIC*07!v%?XCEQ2! z)_4fz)vSG3;QfAAwCJJBhUebK_$=~H5KS#~Oj#H={a4c*C(fppCcQKJfBxxJFi75F zziQ?YezTr4kM{ivl+D-J<>s5y^Vn{$gRcL|xl0lco&8W*`N7l5Md?M$ZR_^i$7bqi zzUElb@I&E|c+;EUN9_M!+bRA#q*@#mSq4}I`*Oqq|HwfOJedvgXxt7Y~+byz3oEVPT zaTR=damOf1qQC!bh0>;iqu=`3cb(_E75=6|_N@NbBQK5q{h!R6(vmV+rD>ht)-{d7 z$IsY*GhAn`;FU7tGIyqn><;ygz~oD5`Yc*P^}Cx{-I60+-&}1tUZZov{N` zdczZi_{;|i#a_Kuho?q$VV!cJsZ(~|wsWWd{(t=5{_^dGGL?@j{+XV8@A}2*_``;02Nu~ z7vDOHCfUxe4RcO#ILCG5fJB4HWc8}I``3Awhu>#g@aAl>W&GP?D(Snje+9+H#>Rft z%zkC`T*z(C$%sXFSFnZY@td%pmu#Nf&b=(NPpo9Yhy4OPfoVBad9lt05}P0YPSDA8 zoq7BD+nS2N=QSUNKJA!MIFEgLf@iBG7waWeM$z*%EiC5i607(6ec5(T^wVVjiYXr) zX3SjZepN{3Sw+fAhW9}m*dVZ;`{ljJ)M@+j_`QF(y<1TsGi$=O z^%4ueO$!YsgBwZ^b zdGlhW%|WvO?;i#`eVoca9)8e!_06(>YP;6uU*oO1V=Aj?+t7V)SFB^CdxP`LV<#uS zv|}^*_Q}HHld;r8RR-5+<@O^VkL;AJ@~$ z7qqgwag*-MitUc)+^<}fexmH8BU*WKa{uYhO6^qjH=XxCM;O+g7QIrIv5o1N`Oo(U z;)*?(ett^(<>ad_>;2+c!SmSp-4$G#?>efPp88JKIh@seFUL{y{acNFhEqP3#CdO( z{Lk0BM(FOrqtl{n%C8@6`&0F|?Z)-F{hSjWleUMe8%XqhxhT6yLEcgML)mq!s5iRV z8&^GLG-{@9A96`!Ca8-F3gI;IW6>hU#jzJ8vxN4&3O?`sJ6;ywp5imgTU_r`68#8pl4& z@-=+sTQJ>X^{nzwTV9w=gd5aXxIlHRImP=7^6gd4Dax z@$qAY&8F*rJZ%~Z7SB_j+*6|S`g;^p>4eh?x44VuG=6=tY;pAJzj_NN z_1bi_bKc%FdDiLar#n>oZ@;|eRI{Ye-lrufbCPpLo||>%4AZdl?5QbJUus%tq+IiR z*&%pu`l9DMb6Pz2HMU+&;e6NnXWu;5GA^lfA9+TB#}g_)nMu|;mU-6*-(>#~agO(R z?$dyuTYfBMZ+N^f=fzIvOLfmzALP?v_U6<6CgY*BTCgu>SH@vB@yUEGE8gXarQMp5 zwePXp$%P+$4=r0bU#0CtrOcB4Xp_DldS;JRE_W2{_57h17`vm`>w1RW^pz(%Eg#yy zHgomg^zg)yLLE)Hg=?n!W_)|a@o7R&+}`x_3;IlJZ+=cqd$gdW{&K*^W6N&(Pk0@o z|68!Mi}Cg1bN}KU?7U=TpD};Ptd`Txd~|iu%IQmAH{9%q@ps|8DQ|i+i0ke}zJ29i zzh`zbvVCO>Hfg;7-o)s^c3bgFf6TXg-$^Q(zvTM<7vk9-Yp4HJ*mw8i-XGavm%hDs zxwq_;O-e%Hjo6=TKYvxH$cy2tG$=Y8zF&@ z+Y@)O&1}hkW1R6;>dgL~c`CM1!80E%o>lbli^Lz+X5T-dQFY) ze_f-@&L=N~FQ=_|CvZY|^{eGBTA9fneyfk!>@B%e5q?+hmuJc0#dkR0~@?sSdtrLx~&@TPKj zswMMI(pKED^3MkaY1Nnyo~IryP@g8F=9X>6tlV|;;JMppReygsnl+*S)uaUnR~+&3 ztE^udk}&K3Wrk97Vr>lPTxlD-Jul7xN z@3c#g&mT4B@^8p^$N1>Yb_L}xD{Ct4>mrk4zOFgaQRmu7T*i;ch49!?3?k@rN;Cdr`d^@3?E%4=xqq#KX&M`$C_w9J(+z?4I!TQ zEiM;IY(5?B$7kig$0h36M?Lj)q1g#(9MkI3&Sm{tx65Fe(ZB2o+cMadnBLC+DHU0< zXv?pO$BLp(xt_3;w9s3VdHP-0`o-V()xS~P{z5=}#mjlMuS(^fd;T)DnxB7KcKWaA zud{YC7ntbons;2Iq%u`#oy59C9s9|*0v62eYi42mxbLC;@;MAY1P?p=wHH=0=Db*T z`fF?a)HO?1m#J7a`=35*@?)2IhJEhrt?yQepNiPR(H+4m*q5Mxho%2O{?(iOUm0d< z%M0H-Y;fWNLv6)tAF&uIvAb0-_INkFHZlHtgV}L*gw#RC37;;ibx9bnS;k^!{Az{z z*`77?uW}2lTRh=KW98&EdUH?Q(PVJodeA-ZY4M_V&-WLM@84~bI`>m))={kHvxw@TJF6}zCekRO~guEjUlOc2zT*?i(vulIa6$1o!Y0e%;DrHaVwn`bqD z=)Hg7lEa+ag8dh6>J|&#J9cpWUFPW9rKaopV{%?yl7F=Nu39MjjXNO+@8|N)+2k^5 z!oI}I@0*G{>Wn@#GS<4iPs~?HlL@@cQ(JJ}Zi1ffm34ED%xYJ>>HlEbs|BY!Edo>) z_vYAG1m5OlYc#smJ8|B=7H$8y|Nm}Y-fSMU=`3@}ot@7sl7gnDvF6P;l6*C(Jp9Mf zON~u3zm7~jangoY`G&7bTGsiKEuy^KX7<^y`GS;7OKVvTHay?D>(G`nY1f5r+@3S9 zr0?Lo3BNDZ95YQ`bEV&}QPWUzyUWb?Q5|W`eg|_^Co*Q%%6G|Mj$K+mA`mQW(hb4JQ6eie%|}qMuz;i3%K`4NpV`tU`Uaf!R-Cz*xa+zsuRT0 z(scWyclfk?>ns!Jz5jXtX71a?7JmvpJ^Xm#uEwLhiyUXuI&7tW9hlA)e9KVpp4()$ zt=I2`6xOh%-!!x8NbB9+c~S9-%dX@N1}6g!C2idueCif6+dJv3=Bo$4-#pN|%k^nt zf$YvT_wyI<$-M5Wcrxws&PTiM`G!yUs(n?U^r}wh!F8*?f8owy^r$aYXV=-h@n!Oa zpQR~bty`WJo@ai+5&v4t>$=Qkhx+iO|F_vv54Bwie6f{fN6(bJJ)!5=zi+QQ`Y7`D zzGeoF2R&i2SCd2aw!Qxo!n|3m;qODf6I&IQD$iIc*}1u}Vq)|fvDUrmPboK37((=wwTQ+?Pqjb=zU{~ReB)eO( zO>Y{Mzf@k=+ZJ^xLdxYK*LLYUs;^GJ+SNGad-2ylU%tNgKOL@~|BvC;6G@J>Y0i}v zU;b@8+C5=oZq@zku77-XH7oCn>Y10Wr@eUNl8p3;I}Lx&6*<^lwK*%zhgGRiU82vs z-?&s^-o7vMFXr-p72f)BW!P`A!zHz~Nw*Gk)*qeU%I5!I;YHyTr4{>wd8FKK$Onq| zzdHLxUT=Z0l4AOdXWFZJ8gjCqPfz($l_lnqDpS^d(^8`1z?EC;_>8k%_3sFoXH}bM zm|ix2UDnAaciUt{Xsg|$&xtm0m; zH#7Zd{kYdoC~8^Td&b0b9PO9iN^PzcW6zswE>AOQUY*_D`-{M@L4Jk5M~MqVQC#_x zHC@bdrcHd6zZNgLa8|WJQzjfn3ve5U8MaR44 zYzJS>>)@YqqVvnd&TDDs5-akqZk+WY(Q{2rarpD2VLugfI@A|sO;ux(DN?vV~Juo;x&G%x%}F zDM2|CVja$^Xb6;r2WEKhxUjY}Qm34KM^*3ct?Avzf(z0o%Gw;z{7`@Q;$FttM-r#& z%>H>``t|FDhq`WT3s3r|^I$`E%bTDn0jKr;Pl>h9**77vaccJ4Kj)oKtL!#yR=nhC zJMnjE_;YqSKgrUC+pDk6GC0{IZ7*&6^6P=ha!0StCJS|?Je%1>SXtzgbze(MNCZYy z8sERQlVjoP?sw<1&vTv0ZasO+N?T4gzU!~5sGPB)uKv5dhF_lT^;CPAc-jBAmZ5M< zOrh*XzoG>!(ia;fR-0`OG)XXgel3PT`QJ}AzJ8_oM(jnty8lPF{q+)%lJ{A0 z;`am1iY*^Ivj4>VILoLW-}*j#-C>EIjF0Z8FK#Jc?C#&KAepSKT)yegkr=7NSJ&SD zeCy@S3$K2xNZ!J(w`XU};>fu5JT*p2;Ue3$yJM}N{@N0lDZ+K9S92lT1VtMz?L3{i zi8ibp@p}TxR((kE(hEo^OWII<>YDMHvpGv={*+oYYnSids6aF0-G3WBS?5iE9u-}^ zJ?pDa3FptL8;>`v>lZyO)^K;@;--o(TCUS4uVd;Fl=925_DKpnVjb7~&Sq~&_}QbX zFRtadT>NbA{=)J6uX~qOHh=3(`=s;4@{`V{D8`8#%^iBTzsUGnMR{DO9+e65PqW#}$XLD0f2;Btsh6E=v%bYgZ|Lzk*&((2@n(f9 z-ASd{`9GXHXZ&h<9?Ud-+P-5?x#j-;U3256?d8CuD|v*HoEh(VSNJN}eRVT?yX;SJ zSV&v(>?ypR*VOla7C2T@xpAjUnbgY1bNDxWzuCTIM}VmL{Ea_eCknbN?s4bdW4yD6 zfAQ1{%6n?B7hcTcX3m}Rt)P5e_g?MSuHp9&Y|Y>4b*4q5Q}})KnjSN@+#{_i84sWE zzU`bA9DGSac3!w*d(*pnvcH<0p9$3_8%>5$vtFw-A%m1|W z_050Src_IxU`SZo6!_+t*~^z{J>T=zUHh^rDlTAar1$eFFBh#7aJZ89d)Dj+TFe#u zl4?rVayCe={B(70w(;u)EiaCGTW`;ukvsA82dhK6!TGlyqC~6*emOul z_tN2ZJ9}2K)1o`eC%j*JBk_&#vou zouaYro`9eJ9go+yUR=_*+r3VIi${~g)s>r>W;{D7%&WO~Y2kH|`R|vlS$(31>$7Oq z)!DzYn&w_tp89uF?YBUONP$HLbJzFmGbvK6`%&tb6%*&9`(e}OkGGadN3VbFeaTbs z*{<93it`N9pB#~4_4DOTFv7kXDNP4$~u zwEE@lja6P+`ws3+xWNVBveG9gzM;t$%tt_oDefv zq48JcS#~iA*5v&kTNa#r_vA zowV+~ob57g;@Ojv_x_${E^E?cU=VTl(+bbtyBn=}SzRYgSM2xs5V(J#ir>dI&nLb4 z@p+l*cg|AP6<$oNHPW`DZ~0?wdNAh6DL&*&w9Nn zY~Ovr<5a|E>kP%-=aLgD+df|SeUanA#DHIph4X|yXm98~yxK6KYKBZu|Ea%Ao=$JN zy7htH$L)8{t^Xd`nrE}`z-OLIB~C(L^AGe#_RO}p`6hdxx6~UpMHVfdwCA!CwbpkP zLbjdkc(Gk<{?e$|2Wnr0RZTs1LHpBhjd#0NYH{YveEOwY<~>($!|}uK_nls=l&@Ly z|8Kxe?kSEUi{?wuTb+Ho_oZA|{}B({5V>BD*q(FI*UxoC{g#?4dw55f!S6b$M$W9G z6H;s0Q$KB~e-QKP>jcK$)Y`@0S@x}c@usvj&NySj?+<&T{PnLk|Ng#T>ZS_w?%#nb zq4!?oWo0Di`o-Jm)mPM3eL5blKYw3E@V}Q&ZuT!vpFe-EW#z{oPrg20IP1);14~;v zI)5wg%xG@0T6W{$yk=2No0lG5n{Qh&S8AC0J~{QQEU?;eO5LQ_Gj~S5-TTU=Jm&Wu zQ#ZHiPhQPl_GtN?+KJOs19SRV+4oh*)d`%sT3V25+4w`fqjts(^*I^dZ`%KG-A;2_ z?Be@dWu52x6X9X|+d}o`@bx~QRG6yuC|_&uQ;Yx0dWvVAJlT5uyxxbjlIaKb-Cp$L z#(^VxYqqfMi=8;l>BsFUf0GjuZma)dse8QBVrT8Dgca8B6+|P7kGRkMTU^oh^pEq- z**-UB-fdzs70Bl~)@+`lKmV1NK*F1*E$bA!_4wv*Z=b*Z{>_)OKgVwBb>%SjoRsiZ z&!8+Q|H^m1Bdwh)eJ3hw&JMb@+4LLJX5oc=F3)w1otSy*CF8i9_GmJ&hs}xj%kqX* z`jdx=%)|>Do6}{w4pn9UDHI?f>vAZ^DLkN2BHlX55sW@Ahf##pgY5 z4%w@}I(*-L&Px9O61xIrp5(>`ehQbof6-j*kdgG(v-=9g+bkE3PJ#kvYRwmUWM>CqPzf`z*MqTVy_n)BL)$NP|uDg=epFJ{^n|@KQ zkMU|-lv-2v%-MJRn#-AH?g-U2%NEFpxP91wN62NH(v$l6G83zg=_$(X<}JIsP`+e# z($O!e`#&Ap`QXsn+Urk@Dq9+6Y;s%X^`7SxN|X4^Y&{LkXO-)Q@#S-KhbrPvnk&2C;kdxy@Md-=C#lyL01 z;A$fvy{5C{ti&71vIQr%?l-vTCLrK$&AqGRbNk%8*^aZ1MYy8o2D{prKl>r;-~ zz3SL6^}XOA_X6#pJ6rnA=e?ik&Xiy8AM^5LYR%Vgr7w$L<#yeZOE;^Vu^PhSAa{NS#gioT4x2(&>!D!w|tslC?jE6a$ z4u{!Y`SjxOa_3*S>_keEedqqnS})aInz}0GX4}sOk*E(E*XA=;PhS^ZcD3{^&tFe7 z2^EQ+e1%0~)4pXF>@y8lNj06F8M{~d&zfsX)3&#;Or9PPx909l(^;>c3!INGn|`)t z@^^_skAx#~jCSjOmfx>0dcT?F{wG)8GlhN;x#67K{mjlT`LOLP&-TxvyS-ofC#m>l zzGoGx5n9C?V5@huJ7)6!`8Rd%%DPsaKgewo{^H`z)yiLAbpAUZ{CEHKAGbGOSI_&c z6aVMOpZ3ew_gy{s?!*pD^*P$s>kq7(8h=Ap=-a6oG14^w?~)Jg4i0NHedh5@>&FZ2 z3t0;5wI7I^@>=dQ+Mp%#^nl~NpT^5o6VGMaeYm?w!%X+ATima`axAG2ZgZdAx!P_< z>YdyVaT~74gj<%0S5J+q?D%|eX3gTMZw|KK|Kq9|vR6bq_6vvWs{b!mUdY=co-TUi ziCWf$ZWr4LoAs_Wx@m|zOX>I?d%>X=FsH&z>E3sz`Naw17xN9{eqL}V`O@$r)I zg=6cxTKWGl;(pEO^fjJfGh@Qw|$Op4D5ELOWK#`rpI-_Aq#vUl7$?dTWz?e*dJ zJCEqzDYg7>GduOtf!6{~otdw`e+@Zy>5WkU4=ayw=)Nqu75n*C_ueblyV`y;-juuc zM&`4Q6%F!^+$VK+^Upt*wZQZa=Zn)3;?}2^zPWx+!0_Kh7pvIUSNGq{PIx!<#S5F& z*Jg!J3Db4o(Dm=R&*?t?`G+L>L(cDH@>%QnwQ*(LmYpsaE~b6^u>NqeM1=Rbox-{2 zcmGmv{rpq%V9RB_6+5_po%MLV?Apbda{Ws06y0XT1zOY>2|liW%k@N8G+@CQi&wXP z+|%&YJyQHxNZ@?s`v>AOe%&HF3SPQiw@%T#>&L2ge(F1gU$RZr3Rd0=)OcfWrSdeu|iLsxp4we;imS&d7QoU@b-qw?DM#1>8V^?6h0;I-(}0n z+M)+iF0*AEwJLR;^;W;0CF6YfT=WgwW1oZ`yU3R$Tgb7PU)OF)<9x?ipvU%6w|vK8 zi#fAP{wQpUP|8l+yKjZAjsNogSG#1LKbdJ}SO{t@Q`sVR>Hng%cmKrC`W%vvSpUT( z|L_Iv7w4vkT>e^?Y4&f+uU)V2-+uI>yzIf%4L0o;9xnXnn*YZApVOU0uYD_}&MN($ z@+8#L{z;>=e&<$?CCqnO(hvK+J|5-RVDCPmX7|L(otw5Uka2Via!nUySoyA-k-Ii` zmWtmEMv+$QMCs}o7uG73o=Pn_J@Q%>lSbA()2Q=ihhHn)cC*O-&vJ88ZmL{ z9`JA4v(jd+r2IkeQVo&x``?e;%j2EC_SLmugZb8H$_*~mtZ0+l!B{OY%hdFEY+B=o zju}e@xon#I?JWLr#ql41eE#eI>|65>@A@yp6S_mZ_k3G`n33Q?U4f(TCfWvQ|JuLv z|5fqh`)96tKd^F%6L0jzHPF_s^QnEV7#5>}nP<-rycMncG zKYbOkY^P;fN|{06F~y9p{I-hO%BBBc-y?c)veG*-90t(mbRf$!T2 z3)c%D_sSRhc<+w8roww_UIdHZ;Zvakt$Vc{=EbL2rX()7;@#!7WZl)1Ywzn7Ims>b zerRJc%Es*ddpa|{+~F1km2$|uEuX?k8ha3dva!G z==JxfUM{`nY$l}d^;uRU!@J;wrNQRjzQ4Dhy7iYXoPM@#QvX^N!5QsSu1Wvj9QXf5 z#u}Ml?l0vk=QldBcsl*K8}V|%j_=_*3*P-LjlBQCA?n25<=z}SZ$_N4wOEjQAoR~> z*J|bk!fQP0m%Ws8;Bl?(U7l$0f2T><&T7WblLG8#uU=hst%3FZzVBkf@hYp&rmgfh zy>TRS@Ac(LRTNm_B~r+nxV3 z=w1GrIs5n*ZQ}Q368?9NrF>rU9=%VUbs;rAHzr(A)Rbet@cy3q@65K8hlFIi z<_TH0J1s8=3tDCF7_Zy!Hi2#W&(m8Zj+<%bl<6;w^W3#Mt$)Ve?5mG$S9@j8I{C2g zv;Hz(`6X&+^)%{lZK&~cdRMmm)y&%ob^RZLP4+*sp0{!Ly_juLyW6f@e;~2xknPS4 z%k)Ko4ks@+=UCV1G0(`-J)Kf=^mft@^`gr%LOye+$+{mcQPMiFwC=UErtc#+uS$>9 z+Fh*XYeZZdPCb}>==8JpH2%w-*Me34l)GjNt$JkoK&-c{SYbd`@U_?o|K zVlEQ{uT*D)`iyI9vd(OjRa5>E!e1lNz!z@&jCtdsT*tE;JMtKO4LNlFB+PQ{2{`KY zEvhK;a{G*98vjkDXS&b*G|B(Y$L`*rx8!`DJ&k&l%(J%p2opE|Iet;`sYb4AwCXPu zzx9>g(Dg8K?+pIpPTyN|jz9g-I`3_WDND|amCLrTOw`*Lz3&!h;tBrhpv_OT_g_q& zvMSTfI{2;Ng7_O*`&RS%d(5`v6T8XMzSDNgX*uo5<@5FC%cNauP4*Xmm16gJ29HYQ zKF@X8LG?S|NrY9-4q4Xm@{+UQI_cM?y3bTj^-r29rd#1JEAxY8$$DGvrTgcdHYk2m zoja3l!?fGq=DsS@&iTIV+7a7h8I`wm1zuRraX#~7hPU8Lf44pQPwsA!&0{>drnY59 z1m`X@#ja1BeNS%1EpmVI;M=qm52MrEM^gg#ub+NB%e_`l^!mEIhfGkMAjcwWInu|GO0LB~9FPv-Rmy>%gOlNqnCT=B~4F z>YQG2_sG3A=lhSRE$vQwzVGOTMGj4$3>}X+JaDY%cA9bi!^f!pYugmF&j0nfWZHUt zU&Qx22?oonSFcRJe!gVJ_4T>m*UbB%yD8iJZ*9r-$y3sm&N|L|H*df7?kihXrkr?d zmFPOhPfh;5*r_GkcUh~yJ?)+t?K|Cj_7vUw_s`CAUf$m~<+Vz*)R%uD24+@FI=8rO zKVN3wyY9%#v*tF8pBTj_B|P~sg>Q5A(JFprlZ0Dqn9dzP{>c0JSvA=Z4%W{}+65tU zz3(=$zcg~2>DPHKX~!24U!C`wGmjR?tyB!rx>MfuaM!Mbni9LX_0LX!D$dX5c|D*z zwZ@fkN=Ze}-meTv<5P3PUj8qq5kOE^3i7`VQj zTsD8}Q6I;shQXDk0X zebdx8q3Dpu;sn#jot_ULyI5=v@80Jirq7kLOy#-n-Ugk9Lki+DbE-_9GacbGIdWKm z@zw|Vp91@z-oMiMNB08TnZm|i$tC<|Pl`F3)NdNDiQZ-RHKywxudZ5o$`s#&_c^`W zw*T07a@(gT&(D>mr5(!DR4WO8(s%urXZHTZ;azC~S>FDuE&H3YH<$kNGnLq%ae9@F zaoac7ILpg>Y;xAsm}Ea;-{sahx#7pX1?IkuVN;3e zZ~LZ2{m+V=J>k&~N#%L=_G_Q4E?xb-W(TYPvc9aFGY=iR&CLGlv()~XGlbmDF4(%J z@4n-Ea_Y^=VoP_tQ9W8-$K4q7?A7@q^Xj&Jj>Vp}P4}igV4re+cj}1)hKkOtd~q%< zi=HibamuID^VIFP87qwoOTWlE{}=G+-roLKckAmjf1G}Nn5)FQ;<1E6{pr)d?pn}j%&p?NFJqbTr|dYV zUE$45KlER*f4GttKIM;qz-NZf=dYBw-p zLpxa&{;&GWp~mI1V9J*brK`D$|LclAyCv%P@gc_<-~9(uyV)M3+|i z9NGS-h+Xkp&$&svcIGTR;a8;gcDba|q9vR+TNbpfFBUl>FzXd-n)rc6Mz4UTl>%v1 zenBsG#^i^uGyGG$ujh9*6i5uQM=hopVX%^X82gUDj`t_L%?jvZ?N)Lt?l8Eze#1^=)&~ z5|7&FH8=l6HrzFipHgcY_%Q$9hhJZwd~8&;mbk*vdq1QzO^P@n6mKZ9avTi z&^uq3Keyy1 z&CtXa<{e_ww{zY57mz92&GfOO!6!b=B5lRH{{2Gp!uH5B`Q&q3i}r*SE%Cj@wA5{Z zOJZJ*7Rv{}>sB(2%JZ*tEqY*ant|f{QGfu zV%56;%fs)yuV>(S)H~mX?C>>>V#$s=rDLq-%}%SgvZM6 z-#bN@f|qCiG)84s+4#KpmLQjWYNfv&XXTtIf#so{PSQQ=Ijk4(*vrV;JBsglRQ%ia zv+j#^?|hXS6ufQ=2F_z8J`gjv zo8rWNLyd=NMS9`3)&~vE=SAw|V`hryZY`XlacT4O_wxHHK0U0j`}a`3ZpmgwwvA1k zyX>1d-)ig+*SphbC#lfj!^zD5RB>+C8?JTUf2Rq*J+Q<{?PPAcu>L=htH&&yC-Y4H zV76wVW7GUoasPfV{^pf`n?av#k^u7(jxB-pS%2gY$83{SjNfzY=0cy&mG2H6-qo1% z%2E8Q)#dhBmIdwh&$G`Q*_5Yn+IDy5ufpnQb6ezIW<~VL`fyf!OLtS1+1Io4?6npr z)l>U|vU^l(k38O5QSi0HDdv_$+mv5S`)~Rkl7Dr0y8o6<7JCl|C@;Nu@95d*My5SH z8i$U~*NzYRnYiqr&9CwVmJ*Fi?W)gMr&%3&ERe`8ywvjI6HE2eLVkiU6} zL#VHnb#S*NQgP~ z%1m;$Vr=rO$jGdPk)I1^e>?C)nfYF02a^U_7nV#7UcOVYLX+@5{v zgz1mjXOFO7*(W$>qvPqlWS|r zul(s(9xK=AbF)Nj?>JGgc*ma{n-E9d^FQaUT0&XMZg@b88oK$F$jHfBhz!b}eUlBD&*I(u5~04}Q7rmex=|Zq0wn z>F6Cj@yCXp_gX)D_*_VObS3g&^x>1U_QV*Mb)IovI4Py}_13(~>#O;E7F(9S{ddhN zdH1!bS2hRR%l5dGUUOS9US*pKfqYWDU$~ni`&!TqJYhJ0n|Q{;`72=`P9aYeH*$ z3p{uHo1@EU$7{8P_r7Gx`Ojy49`2G0yz_^p`T19|59baWu>^A_B;35SI-u#%wG~n? zK1Yb&pT3|}_@;&$$G!@CuD=I2GJfT$X8UzRp_grfqZY&bmJQdNWp44tYDc{+72yrn z58C5swm4dR!#v07VP|!w&M===UeW3P!*qYB&(rG#JbN`Y*@E`Jcl)EpEzsB@?bC8m zX~wnMwJSv;6D?|XUAcTeAa$LQqmAG%+b>>5ceN!Ld;jKKi19e*Q>L-3qtrTcnzTK) z_@Va&wnYaMAKHr(r>nc4TX(`&Wa{ISBG)*X z=a)@qFeo}{IwR!ZI`4Rc{O_fIKVH2w^YQh$UwN;Ds3$*WULeBmtm-Hi%Wp89d0mX& z%x*tZ)0QvC|DR$_%=@hLLGQEh{%Ni!goI|cUzmI&*#6RK$(^LnFKeqi3*v+Lb0=2=g0e0)*9Zr{$R+IRJj4!=2EVk7&jvny#!z`qx< zADx_=zdeZCJV$R^)wcbw%{DKSjjwxeA7%3V;O5)!iqG`P*|W`jY_EEf?L6D}7Yz&N z*;xOqJ^1kIm*Br)e@l1#d>!EX#s92SJ?m>Ojz6opu2lQH+p}+moZ^==4;B9u+6L8M zx7{SYyl$ggD<^N4zuB@+L%XcX>CfvACx*+k|3B|Pf6l+BFK1sqo|Y~lyVCyf)=`|N7}JpLTME^5}V+0)m@{XFt;qQbdm%lY~Wg4K+|r~7}r zdtvwIYyUxeHs|ACqb%Q?@q3=E%IR|P@3g{#0>_=_I<=MuGeqRHpAuLcs`a#HskBAS z-dMeh?1f!Bw`zTTC@*kMM|kDW-D|g3=1khK?~i8PQC}vfj_2uYukqNI3{=HdI@P2c3@-Du=GHXuHTI=bZlG5AUAr=+uZsw?x;5RL{ z_UaV183JXOr4$-J$X2a-{p~N~?v500*ji{22i`eoaC_1zyGtQa0MdYaGF z*&86D&Qanc{L%0Cs*m@V=4<6K&RX}R=hkh#?@a68+12qlt8c>tUP{RF0%c^%rusQ8CPPqY@1;h z(Ux{#?({!1eSNpz-{|o0V;7s8$(>?8=8v6^tS5@aPT78vMM9(^YV9muspY9gfpKSNH#O|7Uoe{}}(iKXYdA*juzo{=cgK<^8^Y-@i_eKXm?a z{=QxM^{?vr`}Y5Nc5r>){tN&AK0CdB-@j+G>C}Y0oxg9v{s%#nGF+8Ca&7P;B^|?^usK{yem)SDnIbz)th1Ey0BsUt~;C7U3;@@@wwOCZQHE& z-D~vq^qw!?Fgj#t1S?s6qxPPmEy*eu2ccs7niGKO(SLI)~NSCkGGg-In@!Q>uJKY4m@9H@U zzEOMDIBoKU2|}zrcH7q~eA{mLMbcEH$0Ta=QRSoQiw{qHyYyf9G}SXL|2CR?I)8ll zy}aI9uK(?G-;1X97$8?uRdMU6LL&-*=r%v6WU%VsW9YPJknbXlgw?PM2Q(2+uy z#R${3@^2x>F3;$_o+TERa+3f54uW43t zh5SF5U8KHoK1o;~`9JygA&nhwI}dHsRQ_{0$*kh*d5)-l`wU^l2MM2ouIxR)9dKiT z1J~sRXKSuKe%oNot-#0BStk@Q_w_&F*iCBF?1Eai&y^E7{;KiUA#tvGu`eRbqxjc| zIoB61%?T@C!R_dLHSE1=eWw&(`Rp|3OPBV}d^zHAAHZaBW+T; z52KSYxRv&*6}=N z`nBuV;?l%r2fv4#uHpISW4GQj&cfqMWOtkHWN+CL>D%trr;1`NjpA3Gi(b3@s<^vJ z&Yazg7oCvOjcnbs^PvCs%P+6_-pR?Hv#K!Zm_c}~Y5Sid8zJ*M3Hb{%9-jFUe#*1# zc%((rpS@2XO;eM#TIxONomqKsZE)$LgN%;@J{23EGVisliTt@RG-yWn&bWqoN%H!) zRd#sWFUqX?`HX-0`phREvYQu0-iq)ky!UBSz(=N1El%}0Mvo>;@~f17Hc_MIi*@t` z<=3GfRy^L@v?TBF@!LZFw>T_fa&KubRR8&IdqMBP@MX&`x$eD^Z24)G2Z#C_VKWvd z@tvh%PnaDq@(1!?DLAu>)jTn|)Wme>mOpGfckb#$a`!bnnV8eNj{AsA>961!4~=`Z z_gs^7k=((Sc%0$4pRCQFds4EOuAIs%-o4^9yOzqX-RBAoe0EFatzK%)5V?G@*dE;n zeG}Hl${nn1>tOrM*>OO3iPTb=I|et5jM{&k)cSFB%c^T9f2uB4bGK=J?iX*F67#4l z(tl&G_Oa_)HhMptcw9q-^&SL7b7tQXU$pHa*OOBf(J}`w+e8&MXJlDJ@_L`Kp7Psz;cBF$ zDd&|6+2qY`Wee``20YwkQXpC2ad3vypUYx*mZWc3q&tWEy~GtgxzLAKIhG%ox+NsT zv-rsp!8v|MUpN0+epFTI=;x;wpgnD^VvodSm&w*7wpUSNwS5{;Gzi!KJ`DTUTju={j`_u~bn)yqYXZ`t6$uU6PyU(d&D(IEb-^2ASe)}mVxj6Ww@cOPz+ zv|XT|%&8G{fcsbRHb16>^E-a@Xaqg~;JD1`sojD24f7AUiFkDHk4()tle2oosWqF< zuK3ZI>9+0Rwx`DH9!1$j_a9m~?`d1rw&WF+32!{kADXyKZTG@?ZzZy_)=R&9Q8k{(np=oTw-%U;OkXnc)B zZJL!&pOCxEpWlt?S1%PM$67y0Dp|(9hdEA9SxxV|Lyy+RP_~B`C8E^s^~Wp_xxn4L zvadwG??db6>nGDCc)Iz#E+?OLoX7iPZ=UYF>*pTUdDUhnrLX+ayusqzOS4_awE8T? zVrB2|Uw^*-d*dVKuMGb*+NS@yag*~`@``nc08A7 z{xDhKeW3Mn_1{Yi#9rQi_{7?4>b2QTR`Q%jf=U-WU%ivzMEBoNU-wu1#dX`Y%ci%y5{czMWd4Blkn`lDx1ZQB?(lCCnX7XvOYNUZJ?pK@*RI5t zUYI-m`Q0^FZeQL#%fWt6`HQw*hpQJ?hu$`Qzj*oOqiG)-%EM$5Idl3l{l3J_naf%M}SvHFIB%+s3qA1#Spd!nVoB7L^6cbv6A#+yftyRWbtxVTR=Hz{;{^LJ%rDJxx z@#Oxz$bPc_m*}MX$HEPi&cseQo7(#J!2ZK(J^_&zc{u$hOZ>aw#N1c8Yq6Na$4TDI zeojX{-muv$&lNA-+M;n{=d>9OFZE)Cde8n_q$=K3x_j@A5dV4mDq`mSz5Q7}&W`zc zYv$T{^Y>X^{PgCe_m`50b%+8bvtL>Em4l6+AdGF_4~XE@qH-s z?;4l#GA9kgW86px#d8*WId(2%|MGpk|G!+1mbkUAd#6RN@HcK?z57n4Q8}2^V`g{s%$+Xgd>X}% zoX;FPFw=!cu1j}Owf*W1j@_4Bn-b!F1huFH7O1?t%cA1)VCQGEo4RM7KDJ*RBfqG7 z1ILc~e#xud&PxRn!anc3cYHRl#rrL*cHhanQnvKmy+5}%U;cDneSN%5?Z@B71q*L3 zYCpR?U48wj$?5+7@eIuK_gVaO6t}Ma^?SMg>FN5X)cZN(@^s9WTBha{%>3pic5gky z-Tli#oL+UaE3=m`=oc3M+UB${cyna%mK~`AHx$*kvGLvS&!6{4jdzQ~LdB|;`R1SR z&zSSHO@vA8hS1u1OMKHm{IKYX^;b9^=-1%H=NrF&Qs7k=ue!E*9Y%k){z(rotp4IP z_iFau4C9W^U-!hV&pvQ|->#+^ip-{EyA%2f%4g2Hv!}9t=~Ul4GabwS{8<)R_t7Eo z!-RQ08^Sk!_4Aimzd_mUi`0$XXO6kBNp4XU;N>}0eL`rfwam-o4K;RLr!J|dTE?)} z>@}Qu{>wfF!KCc>-<+oBh+nTdpRt>FqxB!P1`%u59UT7gvGttuUjKT2{gldHqkT&Q z*ad|h_g$A}S$c>|qFynp!H@f0noMlk9G(Sro;znVneY`Uf4FMr^@Tn3Tz+P6((I+N zj@z5xFAslRcG=JIf>rzj=>i278R>?%OzBp6b4{M!{^rK{xcS(OZMS_Awizp}=yB9E zzb3dVR_V{Qc}mj8Y~}Z&=H-5UaJQ*msnXubIP#K1;$xR=Em!Bp>knkU{d)9d=QQo* z>;HfGaxt^=*RQXqub*gZus8YT|V9Hbl~;b>;AkrT;T9< z`MpzH?ydfLcb#6|jF0y{LRY=~=PhY>v;1J+1Xn>-8*hmxf-bQ}nR}gP%)AazeXM1b^3hgZFJ z2J{yCHi-R z>c+-v-uy!Ju_l_vsLd+W$2-b*2w&XglJ>kyNVSp0e(H{GQ0cU=_H>} zTog9-8qH^y>vy0mHW;{6@WS72#ox%Cq-3}?& z@(HIM+p1>RdLPW4db#&+)WZWkdrXvOOuzB|iLAs<*3_VD-!i0wCB-hJ_gn60J1bLZ zwa)ihaP6G1VjI`l?inj0JJfR{OShkXd2ed8$C?!Xrif0z**9gRM3-FUUN(ElK3`v9 z-f8V^YQvNP0K#Y`=_8Q)#WpM0HBR5hbyXOczY zV}n4mqhmS>y0hh({E2rv{ToAsHo@2e!fkjF-ki{ zS|zt#a#md=v-7p3mw6*yoVUH7p<>3~dLr_$%!z5Qnsc&QPDJnOxOL(P_fDrErX41( z*IJic@=8q6Rpk1yDQ4ruo88M7*xk65@$$farHuWuHz(x0?W~myIPoRBo+(jj!J){s z7M6Gi8M_!+&-t>)_k78PmJ9Pt#@3V}vR~vL9c>dRvIsM~XzM-D)s&DwzoU?~z zubOyWKFB!Z!t?Lyd|lm3dfmDwm;@TS?``__>BHo(#hW9W?Jmc*FZ}P5skds2U&WaN zvja8%tkL*(_21#sj+P3IiT+ZFWnaVQ*i%Q1k!8Cr2NrFMqmud3wHI z{En}ZYgFFf`-gq7tC+O5@+yFO+x z3YWF6UFfxXS6%xz`?YJ$5`xv{G1@+``}2LBpuxKNM>t})?$YM;Wd0*n*z<12x){y; z`&)KvG6}SQ-V&9wd+JY~*%{@$k~%-c{O>Qw6Fg{LZekg;LA}qeDTH7Cj}h;04y~Ch z|E#Dq+*W)kA!DWZMLwk|s~oDNu05O89X5aZb*EL3ne$ans(EuK1mviswo5qstA<^LDPD$k1E9CF`w z$N#J1@%{bsGXGysKhD4J=d;uI7q*$kU7P*>;JJ=>9#j5h7qYm>-P!+tcF_O-&FsmH zvui7Fn^s&8%GDFRD3VvnXP9*C@7m=%m}_@j-Ly6G_NJZAOHXcQ5KcX{%SQN;HsfBE zt!LOG97OKEnUhc)^h9dL-%WO>+vIp#kLx^{!eI4Y>hE{MxobCeIN8P6c~nik@>`=i zSVy7kbLO=L0gKCp()g99ye(VnU->P(@Q&bm#+lu1-&V!NUny&0P`nr-)9aM{>`T!8 zP`S+PDaN@QlF#z*I=sT^N=#+P={sT@7b?$@ujW?S)w!%=d+SlfzP8!9NuA=Ry*jdS z0(B3R^G@=uxqc;X=~j*@?_BqLemH*Q?k?G<@AoRq6=K~N)YjK9`DAd>p>x{WUuqIp z+_PKzC|7XjPZ?JJs#W5%6+T=oTgiM~;g*PkI{zGv)|nHFZp*2~G*7CORLnlh-#>5V zdyyYybw3mSJQX*aIH~aWoQCPgGAn;Azbu}A?vjbg^98T(S>)x-P(3=U-G^!B7S_HU zGw=TEXnlF>w4u%YX0GA~A0!i;3|Xsu3wW#SuXKm&|GGT+{(PI-gPb9ZN;e`VcpE73 zF}>jT3Z0#|pq~46x(9!)*o}n6mQ$H_c2C^>wMFtlquIT`t9D;?dS$CF`m6E5CeF2@ z`SWJ^t(|?7=iRmwPk+W=&{&!--?+l+%hmT$ZnqA(oPALlZ_07?*SC1S6FWPEf3IA< zD@v(m{x9QH?v~%iK8sr?{H$u2a75L?`0`mPx#BPDU;JyGnZ2=+VZ*gmk+Hf>ZHcv6 zGRst0>i?aplRx#~WamSPv&D~Fvy^yCFa&ks;nM$N@jyscy%j<;VZ*T6-Q@49FZ<*}-$6D*ywwg^~dho1M zF3F&4dB5K|znj*QmCKuEws-J-QcZMnS7iNU7=5k9^Tev$%?G!1v-R;ZpH#@(V3`SWBBg0T>tfFullCz1&MR#o}VjicgQKU1`?VXyW}Iu?I6M1W%fj5} zua2HJf2v*bSLe(6FV8)?Rldx0v;TQBU(oB)1)~L>!3n1n%TLwZt*f+zWYyWM_&&EJX{K@45aGC?G^Gu=A9g4ci``HT6L(t{KHB0AGIDY`GOnjEs9=*MxE8DVq`k<<(i?=Rcz7+AAl|2upbtS$l7r^j?-#Q)g<&$kyF6-oo9zNaApq zL^;>uXP4~K&Y1|t?vS`zd#B37@Y#J^KB?I%QYr6`wT3tG_s`0cS6r`jNMq5uZzV^6 zEqTd2yHUkAZhf@SmZ>x5JSpaX%%Kuom7;7TUf&zB@ZHbabocpg$umzUyb?co=lkc4 z_X`tU7qTbK>~fX=96m)PwN+b#Pwqo2V^_UT@Db<7p4!uW*-I1RoqDGHv0~r0C&_4c z@jHp6CzIBk-}wH-u_Pzu$%Te9t>*b`R@+b#dHjq>;+95%>uK}Fr2F?y+A$@``Ot>@ zQ^c?QYI;_rceZ5RB^A$#bD6zt-%tI&d)7!bcXE)JQ}B$XYHOXp%y4MF7*pw)|2FmG z@?VBmXGTXlB~~u^6&A}naa-tyH%te!5LVJXH{Qfa6p$mbu{ zHUENR#{!)f7d1|3o5hDbIFS5ktNNx?fvfCga#2U(ZXa=N{-+@%`6ErT{736#DOa6O zjrU(nOb~U=n(Mf9O|8;|(ziXK5yczq+l_B06=r9j*D&MxxNUao^4lx4=J&j~95Hum zK@dFF@R+kIwr_R)Sz47oS>Af7MS8UOK(=3qQ*4^#Aqv_t`2VEE5hK7Aix-R}e z+^(&4y;->Sh4)7Jw|~aStMNS+|Fy(#x}H(E*7A_G>t~nUp31XuL)iu1_L}*2e5%h#9MHQCpG`f~B) z?BxRSe;#+ce>ko9RA^<|^{LPLxwlj%HEHQqDRdNH=3DkUYu`bUvIl~G(^$^kWpQ)k zS=JK5^fuI4_h10yiOoCbWG-S>oO4nxhewP@_(j{I@}N1fk2twRYD<JC{nu5;TfOpnc>3{mVd1ZjuC)`$JeKtEFwe>!uKV^OlWiLR ztnSZw-BfeQe%H#Iziyh#-@IUH^x}L*<~)agSKYUTa!0ZMJ-CF;`cMA}>kaG0Lz0Tb zAH_Yi$vv{bd~u@q?wVO^rLR2NwQSlNGsib*-gw|9|Ng%e*Jbopa~Uu-uCH$CBzwP6H2eJp9(%3%yP+Rio+lN=lYwoKNmhqkC0|FD&i&c+1QhGwS$lCvz{YE>xCxQO)Pumss-Jd6|jnPWyJ%5LTb8Q7{+?+3p z(yRik>kN0hgm5HEyRqv9H|F}pFiM^f&VABQ@Q&|C;6z!nn20xEd8eo zAD!Z@ytmfaYFY7%p7L!nZv`jxPTeVZ@Mlr{mEOmblCQr>=vpvw#|}<8PZsu~AK?az zA01N8b-#Fc<@7yyZ6~)`Y}CE@xXS0Tm0z8a<+Kw=Tpt|Taeb-Ix!s>oK`u=qCb^ZC%_uJPN{`&Rg?90cW zE}lNV{HeC%(#Tcm`d=e|ZJF}?^=0KfAD`8jRxq^o2P`_$c>MJ)@tn=97vo-+mfg$| zsQ(!Flfz~O%QENUADXZn3a=dG}l7i-A|;mQlj+t zy~w06kE7Ew&EB7{idOb3s`eAlUzajvjgNTk15w^y%erT_5|(QHc`N>~PkNc!^h8#@ zO76>7_V-qd#di9Nf4*I)yD0G|NgmsS|t8A>j_qR2rR^@SH=Qr5}6`%i{xyHM#HKRdknwZb_ z$&Edq86G`o3oZNd!J_)~nZB^ws-E{Hp9QquJrtE!SXpDS_<#T7*F~@0*6o%yBB!8_1@KCWVd;B z+15+8_tvp#EW5)k^Z4|$M@0+&Z*Tl_AmdtFX5*Q+m%V4-4!iT%^fcqV@V(8Ow`y%p zH{98LDe|qr`gfDqP4%;6yL?&0Ql34TX|qH8-h7K4{pI|t-kmPlIQQf62>~f0+wIy| zK5<5H*t*MZbvdE2-}L8ibz6?^ZHv$BpLE%<&f(Gotr@LiZ>@_WPdz&$${TQuVeZ1| zOOn#~%+)QXrR-{cuG_`Hpug;4`~APwk#+0s{`@^$E^l}AexLgNI*XqR>VF<@_qYGk zUibgudw%)4_4W1_|NlPT{@>%sZZ~=FO`S0tTT}QGt3DnvJgnunJ^R2R-iUOY3f-a- zWh>=`6XD)G@78~G%BsDp^YR{tQTpWLmQ@E{Gk-WRiCJaREQ_AAJaHHQBZ*CBf8ine0R6D!s#1PGAI5#dFriE@;XCeL%)xTcczaieb{z;5ob;-+ZE*E60Z@!va zebGl#{mrh2Z}##oUnw#B%$L{YZ+<$|N$&WnJoT4t+n%hAYj66TzULZixZ`b3b?MWI zviy526s%V->qs`p5@MZDpmYA*r3a51Ilgl;o>e_Doi*m{l9FwYCVAgG zF0~$2b6(k++;sNLerLVeyQeS~&1mToa+~S*IsNxJ-tT+YPMNI6diL6@S;;K+e9UtV zj;7b`T)5RaWjS9s^R#V$XKvm7Q!rDYwWUAr$m~Ct%de)YP8Vg34x3-ApvlPpAzH6g zM2vfXVG5fMN7#|Oy=?z966P>y_nw`0%(ddd!+okRfBK%z-#g{TffTcak2MrkAG{Ya z>E8dodYenbl&kKKP6|bBeQ;<=n{HI9Y|sM-ubcP1pMRb@=V!y#t~rk;p83{!Uxe9Y zV(!iKEsH+f)Tp}FTp#jsAD`38gx_`^$ZHE_IVj^V9Lvoe)r{O{OW?>Lpk#| zI0fvh{Q2tU%lUru7p7Kydh_&T^7j{C{MFB&vj6|^3#;5k&4#HlOAS_9{nm2Kc(m)P z^9jGy`$c7zhZ`$yRB0b((}>{BHMt}0$J@B_rNY#!Jntu)+JugMoeQ$kycG)^|1haCr}Sjp zQ;+M)<$KZ1ebH%^;>DU|LEGzT3p!<9q|KhT{`tzCCHGuI_AGoJ*(oSKMVL$A^O>U3 zK;6BEuBY62Fu&!te_MFDzsBQ^Z@<)2G}(J9|IHVyh)q~q`t0D2jt}2UJ_}9RxNb?S zz4&5|8zRTo-uz+C?Rd%0CM3Px^7Y9{!XI>O?!0w$Yt%9;Jo({Rf|dWlP46}{el;ms zy)zLP1&uFWd9zg1?vPY`YLf4cW2T(B*N?L>y90jsAX~8%w%`y%2}0~ zhci~@x0yC7OkO?lK$Az@w<;}{Eq0S`7N5FbQLy!d{EJNvT~X5&oW=VMg4jN$Tsq@z zV_Np+k3~SWw)!28g*p%4z2RN@N@YP5-=p$+-*Z|;tM7dk(R=#RCTen`#?HS^Aws1~ zIZ+|Ow(8s+&u3g!HBTHS3YE`t;;qUt-EnTok|zum zEw2o3$+|fRuw8R`pTRrtS4R2aXFfWM7CV&7>{y~A6YA)1q1SpYVU5a(^pI2g#LnMI z?OyZRe(9uZOdY>%Z4Y;^N{c#G{-?)2bJ1FhA1$-FSAKi-U3=}$tJ$~Xeoi=TSjY5j z+P@9Shp*Y*PI!65{NkP)r4|Jrx^uWneAl;oh4tMJ;8l)_jS7^j?+`w=TfQgPu>PXA zu+Fw))4%CgRj%cK=+?PAttU~Lt#*}#(m`&mdu#f=*^CZOQnfKycv`10MPTM5n{4K3 z3l>-fMM?Y5ZgF3+*>-)HqOUr{fbNbX<1MI=KDDCS4oW zH?dkT3wV=Osa7XiB`%QLYpdN+Kg)ybi)=HGp5ErS%YQpul3CifZd2`TzHjdHmkKQ| z=!^KX`R1+7(+_Tndfj~Wu!hy;|5Dp`Z|>aT(fFN>u^=vC{>HV6k1oi4mfW_Vx9Z&@ zZbSRLst$+xAc;8Pf>ifM^6Q*x+bz9AgS+}@+cb08& z=z_lQI-l&kS4>jd5YeG9Gpwlon4sae3eV;K46)2JCu{iYawHk7=r?wj+Np40`C+~V z+zu9D4;@k-?~5>0zZy_tG?8_s!v4;;LOo_3RR@kFx`Z6B647`o5yCrjg>d^>-(}&K zcGvjtOg^CCsrOE`@Mm;$e2Cl5R{ba5Csb`iA5ZjnSkhvvX^|?L#jm_VDuzSghg@u~ zPE>76Q%A{;d9Oout9)&eT)tSg{@ny^fp1-(8NKuVZCo9ivbnh=wt;g=wQnD*+JPd0 zs=U{k>firmb*?D=Cc(DPHgvg#=$gEs&a@K>&tx(d%r-J?(`2%pdF@Z`5zpoeTFZ<% z9)C=^eE36?YK4a0!Mf@Ly3%eNuQTrcqA*{&Sb}d!doaVi1>xGomW$i;!0k`HXW_KQh##@|~_qDi%B!pz6MZ?jNZ{bb@pu_o~*w*F7$ zl_mZww2Rl+hZebTH5EVqTc^IYw{&rJoUTLUI^GD$l3(Zj@Bdk7Q~mkZarb<+SBFmq zsIH9{+v#?XHJfcm#&v-YlOxJ5DmQtZ(g~_Q(fVzpf2XhO*}P@i%#ABTTn>6`9{qRv zg;}OxYisd_R+V#nl9jVlrIg;9GEHgsV_JQ~$2{oDqKO|j=_+>m$=C*c37DZ`)GhJ6 z{*xhZ+|54!7pImoPM_f`dAn++tIw>(e>ciM`ukv2OrBtkQ7hBNSgpV#k-wAN0_$#x zaY)?KdDdoj(D1#GdEU1qJDJvhxzoPHh3qVtmUoM1Sv5me?=-gue|;MY4<(0{T;LBh zQf|mgV$*oJXO8LQP8mObXP$kf^&;8}-gvX~{J!hFfam3dsf%qU8DDw5kSEQ|^vbKw ze==69b3)dc9=^No-1pyiq^gSFNxe6HY_xIR^F{V?C)D(M|Kvc6phtX8SMDtS_9g7jlsii& zdqzutZP{*-p0H!K(uU&y=imO-yb--8;cMQRrqyb{F1r=Iwdkmr?z5jyzg1>;g0rx| z!s@k+3p^V$uCQO*sxM$#+{?DNppMyp<42L&3(;>n_=U1AJXrUEv;4{1mRCLR{N6}4 z-~GB<;%Lbsm;ZZut1rl}y|VdT65BMJNqqi$v)QW`Ep3@3Rb%eq$Uc9Gf9qW8@P6qo^DemgRjQKZ$CcQ> zldnI1^5AIpQB!$?{f&ioj}tAQ1U}LzvzO#E}DI;s7 zx9%pxllN}v&G&vVZ1q}J@X_Sdw7})Rj(Y63`I*i+t$yB-4!xG23%1Q?k^Fj`?OEQe z%|(a#6M5#yvE097dwS~JkAdsXemr?o+*b$ZSK=S{I ztLJ;3Z@<6l{7IPu&6jKWzD;m{dv)rv&udEDmtG=<2+j9{Whsz~ar6kh)n{?%s+$uW2Elnlt;dveq(DnHN5__aCnO zzC$DR);{(bww3kwx4xQ{yWA{wU#A!I|8gbMocr4zCj~#QJsQjQZ+pJo&De|yl16TE z%QL3NaVLen60?qH8Z$^!y(f93=3!l3#{&ed{z{-bnzv=P&hR4jDU6|&aA@J0!rsmg^m)u7_ zYn_k#_v6<^%{z~4H0nzs5TIv*=3x#Mu^+7i)HRG)?_1{*%wfXzNVt;NBZD zch~7C?W#PPzE(Zyp%?%CeuF!25^HY0cbMG4=eLscq~V0Hylq=I#l632|4ovQao&SX zCXx{!PRu;COJm2E&tZJ;MQ_~Fe))aZ&bxaTIoy{Jd}i z`@U)X8~#q_Z2CTV5r61xRjHDLmg}5kir%yzRB2#;a=cw!EaR6b!>N@?+jL{}X0L8Y zVDI_ANT%#J<3sDVUp(PVX;#0tKeyjglg4y5cFxXB`6I@8)1M1`(A+3?t#o_ri7A!O z$||q);T&$C>h_f)St zpUsn*&3w+@t2I%7E(x!Gce-s}vAys884mR#s-Ig`&RQO?%|E4klJnZPjaz@)wio`m zhJ4!B|U98Tyw{f!L-AX&9W~sTaY+oiv zS)K6Z5qZDd_l4pVMfVSqn)-ij+~zBo2YkMz*Hb5{;&yw7ki>F#FZcA=4ReLRAJ|}e zc)3L3@uM|~@4F;(HJ)fi3m(&0H$^Hv`e>#7X{#Oa6DP+;94tHjyUq2iYV=Bm!^a

RygNYZK0WiDb(t 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
iIA*OI> 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

#}F5W5M;HTUP~+ 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%0DSP!NdJ^W~=Z6$r8@|v;`GT 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 (b1Q3oEyORG7p$7-Z*AJk|EXKx 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 }bLQQvN>vq}XJ6}V+GV)7=h=#qA5S7aZ=9_^ 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 E04R$S7ytkO diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/split-sequence-v2.0.0.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/split-sequence-v2.0.0.tgz deleted file mode 100644 index fd15c573b1e3e7d274714f81941845b00abe60f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10329 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 Hfq?-4?iT%e diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/trivial-features-20190710-git.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/trivial-features-20190710-git.tgz deleted file mode 100644 index 546bdc65454123adc5f53a5564d8a35be6ff7f66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10765 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 a_EkW;)s=;OrF#y1j4#`|^&Eo(BLe_&ODV4a diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/trivial-gray-streams-20181018-git.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/trivial-gray-streams-20181018-git.tgz deleted file mode 100644 index 9806b7d5c16ec999726e1431f84ac9d95044c669..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8024 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 R?`8Fj*L&)>GMr#w0016!o1y>! diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/usocket-0.8.3.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/usocket-0.8.3.tgz deleted file mode 100644 index c76a656e31bc4a81e81edf2b25253b770af1f31e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85851 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/yason-v0.7.8.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/yason-v0.7.8.tgz deleted file mode 100644 index c34daf3aba5d700940561bc8771499965da07002..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27918 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

#r#{dbz*LHd>+4n&%OF(PNsMOd`*W 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

Z%+&F$oXH86}(jHjF;rum3O6u1!cE| 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 F0|41G`QZQn diff --git a/sbcl/.quicklisp/dists/quicklisp/distinfo.txt b/sbcl/.quicklisp/dists/quicklisp/distinfo.txt deleted file mode 100644 index 86798cc..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/distinfo.txt +++ /dev/null @@ -1,7 +0,0 @@ -name: quicklisp -version: 2019-12-27 -system-index-url: http://beta.quicklisp.org/dist/quicklisp/2019-12-27/systems.txt -release-index-url: http://beta.quicklisp.org/dist/quicklisp/2019-12-27/releases.txt -archive-base-url: http://beta.quicklisp.org/ -canonical-distinfo-url: http://beta.quicklisp.org/dist/quicklisp/2019-12-27/distinfo.txt -distinfo-subscription-url: http://beta.quicklisp.org/dist/quicklisp.txt diff --git a/sbcl/.quicklisp/dists/quicklisp/enabled.txt b/sbcl/.quicklisp/dists/quicklisp/enabled.txt deleted file mode 100644 index e69de29..0000000 diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/alexandria.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/alexandria.txt deleted file mode 100644 index 9c5a37d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/alexandria.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/alexandria-20191227-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/anaphora.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/anaphora.txt deleted file mode 100644 index e2ab29f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/anaphora.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/anaphora-20191007-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/babel.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/babel.txt deleted file mode 100644 index 1f5514f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/babel.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/babel-20191130-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/bordeaux-threads.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/bordeaux-threads.txt deleted file mode 100644 index 1259e13..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/bordeaux-threads.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/bordeaux-threads-v0.8.7/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/cffi.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/cffi.txt deleted file mode 100644 index 2581831..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/cffi.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cffi_0.20.1/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-ansi-text.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-ansi-text.txt deleted file mode 100644 index 6692a2f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-ansi-text.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cl-ansi-text-20150804-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-colors.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-colors.txt deleted file mode 100644 index b41f24c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-colors.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cl-colors-20180328-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-emb.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-emb.txt deleted file mode 100644 index 88fbd80..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-emb.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cl-emb-20190521-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-fad.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-fad.txt deleted file mode 100644 index d6146bd..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-fad.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cl-fad-20190813-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-ppcre.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-ppcre.txt deleted file mode 100644 index 11bae42..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-ppcre.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cl-ppcre-20190521-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-project.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-project.txt deleted file mode 100644 index 04eabea..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/cl-project.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cl-project-20190521-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/croatoan.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/croatoan.txt deleted file mode 100644 index 88bb748..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/croatoan.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/croatoan-20191227-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/html-template.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/html-template.txt deleted file mode 100644 index 4e46f0d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/html-template.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/html-template-20171227-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/let-plus.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/let-plus.txt deleted file mode 100644 index 3a2dfb3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/let-plus.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/let-plus-20191130-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/local-time.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/local-time.txt deleted file mode 100644 index 61900cf..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/local-time.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/local-time-20190710-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/prove.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/prove.txt deleted file mode 100644 index 9ea2f5e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/prove.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/prove-20171130-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/quickproject.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/quickproject.txt deleted file mode 100644 index b205a9a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/quickproject.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/quickproject-1.4.1/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/slime.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/slime.txt deleted file mode 100644 index 1a3e79a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/slime.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/slime-v2.24/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/split-sequence.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/split-sequence.txt deleted file mode 100644 index 28a0527..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/split-sequence.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/split-sequence-v2.0.0/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/trivial-features.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/trivial-features.txt deleted file mode 100644 index f478159..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/trivial-features.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/trivial-features-20190710-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/trivial-gray-streams.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/trivial-gray-streams.txt deleted file mode 100644 index 2e59812..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/trivial-gray-streams.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/trivial-gray-streams-20181018-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/usocket.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/usocket.txt deleted file mode 100644 index c7f96c6..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/usocket.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/usocket-0.8.3/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/vom.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/vom.txt deleted file mode 100644 index 00d6362..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/vom.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/vom-20160825-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/yason.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/yason.txt deleted file mode 100644 index 0071fa5..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/releases/yason.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/yason-v0.7.8/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/alexandria-tests.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/alexandria-tests.txt deleted file mode 100644 index 04e4471..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/alexandria-tests.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/alexandria-20191227-git/alexandria-tests.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/alexandria.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/alexandria.txt deleted file mode 100644 index 8f1de51..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/alexandria.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/alexandria-20191227-git/alexandria.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/anaphora.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/anaphora.txt deleted file mode 100644 index 65f11d4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/anaphora.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/anaphora-20191007-git/anaphora.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel-streams.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel-streams.txt deleted file mode 100644 index a87924e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel-streams.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/babel-20191130-git/babel-streams.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel-tests.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel-tests.txt deleted file mode 100644 index dffcd0e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel-tests.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/babel-20191130-git/babel-tests.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel.txt deleted file mode 100644 index a3bbc5a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/babel-20191130-git/babel.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/bordeaux-threads.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/bordeaux-threads.txt deleted file mode 100644 index 39327ae..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/bordeaux-threads.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/bordeaux-threads-v0.8.7/bordeaux-threads.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-examples.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-examples.txt deleted file mode 100644 index 96b10d4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-examples.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cffi_0.20.1/cffi-examples.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-grovel.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-grovel.txt deleted file mode 100644 index b10784b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-grovel.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cffi_0.20.1/cffi-grovel.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-libffi.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-libffi.txt deleted file mode 100644 index ada9d02..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-libffi.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cffi_0.20.1/cffi-libffi.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-tests.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-tests.txt deleted file mode 100644 index 14e7c79..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-tests.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cffi_0.20.1/cffi-tests.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-toolchain.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-toolchain.txt deleted file mode 100644 index ca8d287..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-toolchain.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cffi_0.20.1/cffi-toolchain.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-uffi-compat.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-uffi-compat.txt deleted file mode 100644 index 667c8f5..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-uffi-compat.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cffi_0.20.1/cffi-uffi-compat.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi.txt deleted file mode 100644 index 4d0cec7..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cffi_0.20.1/cffi.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-ansi-text-test.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-ansi-text-test.txt deleted file mode 100644 index 25f6096..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-ansi-text-test.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cl-ansi-text-20150804-git/cl-ansi-text-test.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-ansi-text.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-ansi-text.txt deleted file mode 100644 index c5ae783..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-ansi-text.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cl-ansi-text-20150804-git/cl-ansi-text.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-colors.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-colors.txt deleted file mode 100644 index 472e19a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-colors.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cl-colors-20180328-git/cl-colors.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-emb.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-emb.txt deleted file mode 100644 index b5a7d69..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-emb.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cl-emb-20190521-git/cl-emb.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-fad.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-fad.txt deleted file mode 100644 index 40c6425..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-fad.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cl-fad-20190813-git/cl-fad.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-postgres+local-time.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-postgres+local-time.txt deleted file mode 100644 index f1f74d9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-postgres+local-time.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/local-time-20190710-git/cl-postgres+local-time.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-ppcre-unicode.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-ppcre-unicode.txt deleted file mode 100644 index 6e4b68f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-ppcre-unicode.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre-unicode.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-ppcre.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-ppcre.txt deleted file mode 100644 index 5515d9e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-ppcre.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-project-test.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-project-test.txt deleted file mode 100644 index abeedbb..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-project-test.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cl-project-20190521-git/cl-project-test.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-project.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-project.txt deleted file mode 100644 index 5f1aec3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-project.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/cl-project-20190521-git/cl-project.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-test-more.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-test-more.txt deleted file mode 100644 index 77c5a45..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cl-test-more.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/prove-20171130-git/cl-test-more.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/croatoan-test.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/croatoan-test.txt deleted file mode 100644 index 62799e0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/croatoan-test.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/croatoan-20191227-git/croatoan-test.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/croatoan.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/croatoan.txt deleted file mode 100644 index bdcd772..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/croatoan.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/croatoan-20191227-git/croatoan.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/html-template.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/html-template.txt deleted file mode 100644 index 1c624d9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/html-template.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/html-template-20171227-git/html-template.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/let-plus.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/let-plus.txt deleted file mode 100644 index 7874a6b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/let-plus.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/let-plus-20191130-git/let-plus.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/local-time.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/local-time.txt deleted file mode 100644 index 8f414e0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/local-time.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/local-time-20190710-git/local-time.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/prove-asdf.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/prove-asdf.txt deleted file mode 100644 index 19a2b00..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/prove-asdf.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/prove-20171130-git/prove-asdf.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/prove-test.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/prove-test.txt deleted file mode 100644 index fe21905..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/prove-test.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/prove-20171130-git/prove-test.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/prove.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/prove.txt deleted file mode 100644 index 5e51355..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/prove.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/prove-20171130-git/prove.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/quickproject.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/quickproject.txt deleted file mode 100644 index 0ab4bbc..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/quickproject.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/quickproject-1.4.1/quickproject.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/split-sequence.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/split-sequence.txt deleted file mode 100644 index a06b52f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/split-sequence.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/split-sequence-v2.0.0/split-sequence.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/swank.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/swank.txt deleted file mode 100644 index 330bc34..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/swank.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/slime-v2.24/swank.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-features-tests.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-features-tests.txt deleted file mode 100644 index bd553fa..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-features-tests.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/trivial-features-20190710-git/trivial-features-tests.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-features.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-features.txt deleted file mode 100644 index 91f4fab..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-features.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/trivial-features-20190710-git/trivial-features.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-gray-streams-test.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-gray-streams-test.txt deleted file mode 100644 index 60077c8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-gray-streams-test.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/trivial-gray-streams-20181018-git/trivial-gray-streams-test.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-gray-streams.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-gray-streams.txt deleted file mode 100644 index 7db7b2f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-gray-streams.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/trivial-gray-streams-20181018-git/trivial-gray-streams.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/usocket-server.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/usocket-server.txt deleted file mode 100644 index 0e815d1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/usocket-server.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/usocket-0.8.3/usocket-server.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/usocket-test.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/usocket-test.txt deleted file mode 100644 index 2610e37..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/usocket-test.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/usocket-0.8.3/usocket-test.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/usocket.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/usocket.txt deleted file mode 100644 index 4f2aa80..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/usocket.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/usocket-0.8.3/usocket.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/vom.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/vom.txt deleted file mode 100644 index 94241fd..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/vom.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/vom-20160825-git/vom.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/yason.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/yason.txt deleted file mode 100644 index dd3ba86..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/installed/systems/yason.txt +++ /dev/null @@ -1 +0,0 @@ -dists/quicklisp/software/yason-v0.7.8/yason.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/preference.txt b/sbcl/.quicklisp/dists/quicklisp/preference.txt deleted file mode 100644 index ca57830..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/preference.txt +++ /dev/null @@ -1 +0,0 @@ -3788524139 \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/releases.cdb b/sbcl/.quicklisp/dists/quicklisp/releases.cdb deleted file mode 100644 index 1cafa2a146dfb1acc733b73e5b63d893c983930f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 515221 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%0ADnw#%Ky^XG!vMVQ4bxCafEXZM|6u{{i5n!E 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/releases.txt b/sbcl/.quicklisp/dists/quicklisp/releases.txt deleted file mode 100644 index fa290a3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/releases.txt +++ /dev/null @@ -1,1831 +0,0 @@ -# project url size file-md5 content-sha1 prefix [system-file1..system-fileN] -1am http://beta.quicklisp.org/archive/1am/2014-11-06/1am-20141106-git.tgz 3490 c5e83c329157518e3ebfeef63e4ac269 83dfee1159cc630cc2453681a7caaf745f987d41 1am-20141106-git 1am.asd -3b-bmfont http://beta.quicklisp.org/archive/3b-bmfont/2019-12-27/3b-bmfont-20191227-git.tgz 7982 86d51f81bfe1ce12cbbd6387105bc0f6 be1523d1f02ca7fce9fbd4b91c879d8bd3e68d8b 3b-bmfont-20191227-git 3b-bmfont.asd -3b-swf http://beta.quicklisp.org/archive/3b-swf/2012-01-07/3b-swf-20120107-git.tgz 75453 c130b35b44de03caa7cdf043d9d27dee 2dc75635c4d6a641618a63e61a9aa98252bbd2b7 3b-swf-20120107-git 3b-swf-swc.asd 3b-swf.asd -3bgl-shader http://beta.quicklisp.org/archive/3bgl-shader/2018-02-28/3bgl-shader-20180228-git.tgz 96057 fbd3727d73a99fc11116d13330b4e1a9 bbee1ba646c170f11a97829e1d3477990075bc1c 3bgl-shader-20180228-git 3bgl-shader-example.asd 3bgl-shader.asd -3bmd http://beta.quicklisp.org/archive/3bmd/2017-10-19/3bmd-20171019-git.tgz 22819 d691962a511f2edc15f4fc228ecdf546 054c8be1629c24d5658cdb57aa858e08919a955b 3bmd-20171019-git 3bmd-ext-code-blocks.asd 3bmd-ext-definition-lists.asd 3bmd-ext-tables.asd 3bmd-ext-wiki-links.asd 3bmd-youtube-tests.asd 3bmd-youtube.asd 3bmd.asd -3bz http://beta.quicklisp.org/archive/3bz/2019-10-07/3bz-20191007-git.tgz 30098 269233dd30c2203672739352bca94461 738b9a01b481ce80cdd75d5b44e0735e9d6f3517 3bz-20191007-git 3bz.asd -3d-matrices http://beta.quicklisp.org/archive/3d-matrices/2019-10-07/3d-matrices-20191007-git.tgz 41071 f1c646a034348281b8d05aed3c1ee153 ca19e0105d6c8d2614c2d0cbb487492c9aa077f9 3d-matrices-20191007-git 3d-matrices-test.asd 3d-matrices.asd -3d-vectors http://beta.quicklisp.org/archive/3d-vectors/2019-07-10/3d-vectors-20190710-git.tgz 27831 a5cf6cf3b78cba6ec36585bc6acbde61 b4cd1b5bfe087dc6ad95671fc74242905d6b22e5 3d-vectors-20190710-git 3d-vectors-test.asd 3d-vectors.asd -a-cl-logger http://beta.quicklisp.org/archive/a-cl-logger/2018-08-31/a-cl-logger-20180831-git.tgz 18415 27b4f20b1b3d779319df4f2da5e6740e 03171fd4aa730f0d692fa54c922d2ffb16558da3 a-cl-logger-20180831-git a-cl-logger-logstash.asd a-cl-logger.asd -able http://beta.quicklisp.org/archive/able/2017-12-27/able-20171227-git.tgz 30476 bf42d58fb2f32f239e9f98561fb11be1 3d1693e9704ba4fcd19a151baf16e3600447d83b able-20171227-git able.asd -access http://beta.quicklisp.org/archive/access/2015-12-18/access-20151218-git.tgz 14821 a6f1eb4a1823b04c6db4fa2dc16d648f f8cf34ea96902db935db8c183e7c09c2fc2c8c90 access-20151218-git access.asd -acclimation http://beta.quicklisp.org/archive/acclimation/2018-08-31/acclimation-20180831-git.tgz 5069 71fa994f03a01452e0a15d27c61f5d55 3488315089e411ebe6347e4acc6ff062667a91ed acclimation-20180831-git Temperature/acclimation-temperature.asd acclimation.asd -adopt http://beta.quicklisp.org/archive/adopt/2019-12-27/adopt-20191227-hg.tgz 22054 c5ae8be1ffe8c9f37be9e9fb60196859 b54e9303f9b8f6d9bb3a9437aa29a67832bdda73 adopt-20191227-hg adopt.asd -advanced-readtable http://beta.quicklisp.org/archive/advanced-readtable/2013-07-20/advanced-readtable-20130720-git.tgz 10570 bcb3c8a4757047bf7a41117265b74a3f 163baeafd28c4f4cb0c3fb42529df5ee75a711cc advanced-readtable-20130720-git advanced-readtable.asd -adw-charting http://beta.quicklisp.org/archive/adw-charting/2012-09-09/adw-charting-20120909-http.tgz 291857 932a2a8f87a6a26b8aece05240850451 7a7e66124521f356ff6b6b9653f8b190b827b7e1 adw-charting-20120909-http adw-charting-google.asd adw-charting-vecto.asd adw-charting.asd -agnostic-lizard http://beta.quicklisp.org/archive/agnostic-lizard/2019-03-07/agnostic-lizard-20190307-git.tgz 32336 b9fdba47c8bdb8071c824dbc4067f7bb 83be3235a297e14470fe2815edf191c221368990 agnostic-lizard-20190307-git agnostic-lizard-debugger-prototype.asd agnostic-lizard.asd -agutil http://beta.quicklisp.org/archive/agutil/2019-02-02/agutil-20190202-git.tgz 6480 87f78ed77eaddc8877b44af4a6151e2e 36e70c15d9938571501ba9da145a4c2aa95272b5 agutil-20190202-git agutil.asd -ahungry-fleece http://beta.quicklisp.org/archive/ahungry-fleece/2018-08-31/ahungry-fleece-20180831-git.tgz 94922 cf283b8fddaae5430703413bd22a8841 ed6c9c7e8def3ef93b16670c73dadc770beff94f ahungry-fleece-20180831-git ahungry-fleece.asd skel/skeleton.asd -alexa http://beta.quicklisp.org/archive/alexa/2018-08-31/alexa-20180831-git.tgz 11101 322aae1831d32c65e4f7512a749e5794 d27375e85ec943d49b3fcb77b3ab606b2dd63e92 alexa-20180831-git alexa-tests.asd alexa.asd -alexandria http://beta.quicklisp.org/archive/alexandria/2019-12-27/alexandria-20191227-git.tgz 53842 634105318a9c82a2a2729d0305c91667 3df48554c447086fe060dbbca21943dcbe7b82db alexandria-20191227-git alexandria-tests.asd alexandria.asd -algebraic-data-library http://beta.quicklisp.org/archive/algebraic-data-library/2018-08-31/algebraic-data-library-20180831-git.tgz 2657 4e0c9d6480ef5824821e38ef88ce7c0f 35e8cb9da56cd9b6f4bc6bbd9b6e7094f28e367a algebraic-data-library-20180831-git algebraic-data-library.asd -also-alsa http://beta.quicklisp.org/archive/also-alsa/2019-08-13/also-alsa-20190813-git.tgz 12973 0c4ae0cbe5abfcdcaf2cd448e9be85db 77fa84942c50e825d52643b03548d5d2c6e8d042 also-alsa-20190813-git also-alsa.asd -amazon-ecs http://beta.quicklisp.org/archive/amazon-ecs/2011-04-18/amazon-ecs-20110418-git.tgz 18915 6fdd5ad095bd4a492e0d5cd07b7fae98 f8aa169d0a8e927a8357b210570f72d0198d630d amazon-ecs-20110418-git amazon-ecs.asd -anaphora http://beta.quicklisp.org/archive/anaphora/2019-10-07/anaphora-20191007-git.tgz 6114 bfaae44cfb6226f35f0afde335e51ca4 88e839f9edff0b74502c7595df3122a434401268 anaphora-20191007-git anaphora.asd -anaphoric-variants http://beta.quicklisp.org/archive/anaphoric-variants/2012-10-13/anaphoric-variants-1.0.1.tgz 3961 1958c6eed506b8dd7f7ebf4fb85142ed affec75bb8b78489722f937336342d2e003695db anaphoric-variants-1.0.1 anaphoric-variants.asd -antik http://beta.quicklisp.org/archive/antik/2019-10-08/antik-master-df14cb8c-git.tgz 1655490 1bfdd37b226dd77d2a83a8262c7f5c75 027e6a3fca896a523a6cd49cb6ae501605c6d953 antik-master-df14cb8c-git antik-base.asd antik.asd foreign-array.asd physical-dimension.asd science-data.asd -apply-argv http://beta.quicklisp.org/archive/apply-argv/2015-06-08/apply-argv-20150608-git.tgz 2451 d6c331fb609e14d8e99c2c5235767ae5 41176149bfe25382fbeee01eef0ca9aaca6aa6ec apply-argv-20150608-git apply-argv.asd -april http://beta.quicklisp.org/archive/april/2019-12-27/april-20191227-git.tgz 81594 6dbbfc4183b598deef9adb7f86b0dde0 21c472f95c9b4690786b296a8e189f08bccd1a40 april-20191227-git aplesque/aplesque.asd april.asd vex/vex.asd -arc-compat http://beta.quicklisp.org/archive/arc-compat/2018-08-31/arc-compat-20180831-git.tgz 69330 724b920b586c131d72e21b9c7438050c 4709ebe97f06bec4e489306df69bc6bf308aca8f arc-compat-20180831-git arc-compat.asd -architecture.builder-protocol http://beta.quicklisp.org/archive/architecture.builder-protocol/2019-05-21/architecture.builder-protocol-20190521-git.tgz 42621 5513a5432729ab4577400825d93d919c 1282644bcd48c2a9d30f53b2c1d0db53ec171d5b architecture.builder-protocol-20190521-git architecture.builder-protocol.asd architecture.builder-protocol.json.asd architecture.builder-protocol.universal-builder.asd architecture.builder-protocol.xpath.asd -architecture.hooks http://beta.quicklisp.org/archive/architecture.hooks/2018-12-10/architecture.hooks-20181210-git.tgz 15541 698bdb1309cae19fb8f0e1e425ba4cd9 c5d4bd17509ba19d55913a247ef56853d51a4169 architecture.hooks-20181210-git cl-hooks.asd -architecture.service-provider http://beta.quicklisp.org/archive/architecture.service-provider/2019-10-07/architecture.service-provider-20191007-git.tgz 22626 7260877f29b3fe3ad6e94126360f0bd3 9ae3133023dfc49a6e891ce2a3d1eefdc25c0513 architecture.service-provider-20191007-git architecture.service-provider-and-hooks.asd architecture.service-provider.asd -archive http://beta.quicklisp.org/archive/archive/2016-03-18/archive-20160318-git.tgz 19507 5332faf00d7b8416c0468770fa9aaf1f 83bcf90b745c5d8967086741072f3b7496733868 archive-20160318-git archive.asd -arnesi http://beta.quicklisp.org/archive/arnesi/2017-04-03/arnesi-20170403-git.tgz 84553 bbb34e1a646b2cc489766690c741d964 c83ef816a3596038ebc507611c2c17bb822a1024 arnesi-20170403-git arnesi.asd -array-operations http://beta.quicklisp.org/archive/array-operations/2019-07-10/array-operations-20190710-git.tgz 26278 42291d895198108ea4a39c195a92b4fb faa7ed1c5d9d9b2f9f1beef7db4deb8060297dda array-operations-20190710-git array-operations.asd -array-utils http://beta.quicklisp.org/archive/array-utils/2019-07-10/array-utils-20190710-git.tgz 5723 58c39c2ba3d2c8cd8a695fb867b72c33 5bc7a920472f8e254062a993d720b3d1ae4642fe array-utils-20190710-git array-utils-test.asd array-utils.asd -arrival http://beta.quicklisp.org/archive/arrival/2019-05-21/arrival-20190521-git.tgz 204257 9bc7b64b7b838feb61a99fd9241d8b7e bafc2300f7fcb8c4d7574da9825658468bee8480 arrival-20190521-git arrival.asd -arrow-macros http://beta.quicklisp.org/archive/arrow-macros/2016-09-29/arrow-macros-20160929-git.tgz 4832 0545674913ad39b66989b2a6318c69df 0618dfc6a77bdb78065a9f52e19e2af7e49df5e0 arrow-macros-20160929-git arrow-macros-test.asd arrow-macros.asd -arrows http://beta.quicklisp.org/archive/arrows/2018-10-18/arrows-20181018-git.tgz 5067 c60b5d79680de19baad018a0fe87bc48 82ebf99cf60c78e451f73e515b418f7c2f40b18b arrows-20181018-git arrows.asd -asd-generator http://beta.quicklisp.org/archive/asd-generator/2019-01-07/asd-generator-20190107-git.tgz 17944 3d89b79133f9d2e7bff3e7735a299f96 b9e465de3e179e7a7c0b73aa62be878777b014ea asd-generator-20190107-git asd-generator.asd test/asd-generator-test.asd -asdf-dependency-grovel http://beta.quicklisp.org/archive/asdf-dependency-grovel/2017-04-03/asdf-dependency-grovel-20170403-git.tgz 41965 e5f32a1e82dd83fa6446c28c2e43a73d ecfb684ceed8f4a95d124aa4f5398ec35a2dc5e2 asdf-dependency-grovel-20170403-git asdf-dependency-grovel.asd tests/test-serial-system.asd -asdf-encodings http://beta.quicklisp.org/archive/asdf-encodings/2019-10-07/asdf-encodings-20191007-git.tgz 9259 76bd0a61aa4df19e683d16592e0e62cd e3a8f15e4b8e4c4b39d4bcbbb67c6e7c308cf3d1 asdf-encodings-20191007-git asdf-encodings.asd -asdf-finalizers http://beta.quicklisp.org/archive/asdf-finalizers/2017-04-03/asdf-finalizers-20170403-git.tgz 6663 a9e3c960e6b6fdbd69640b520ef8044b 3838733d2c72f1dfc49fd2adb186f490d9f4601a asdf-finalizers-20170403-git asdf-finalizers-test.asd asdf-finalizers.asd list-of.asd -asdf-flv http://beta.quicklisp.org/archive/asdf-flv/2016-04-21/asdf-flv-version-2.1.tgz 2116 2b74b721b7e5335d2230d6b95fc6be56 7f61773346be3e61c241d597d02a3ec533d15989 asdf-flv-version-2.1 net.didierverna.asdf-flv.asd -asdf-linguist http://beta.quicklisp.org/archive/asdf-linguist/2015-09-23/asdf-linguist-20150923-git.tgz 4653 110db875b9d5cbdbc41fff8b50cc6688 b5929afb75c89ab6729d90da79686bc0885d7b55 asdf-linguist-20150923-git asdf-linguist.asd -asdf-manager http://beta.quicklisp.org/archive/asdf-manager/2016-02-08/asdf-manager-20160208-git.tgz 3156 67452d33f1e027b145ca8bfd0fa2806c eda6b453d5d3481e2d4e164c3206ae84012e7edd asdf-manager-20160208-git asdf-manager-test.asd asdf-manager.asd -asdf-package-system http://beta.quicklisp.org/archive/asdf-package-system/2015-06-08/asdf-package-system-20150608-git.tgz 1383 9eee9d811aec4894843ac1d8ae6cbccd 910495edcf74671f08ba09181539bf644e0cbb3f asdf-package-system-20150608-git asdf-package-system.asd -asdf-system-connections http://beta.quicklisp.org/archive/asdf-system-connections/2017-01-24/asdf-system-connections-20170124-git.tgz 4933 23bdbb69c433568e3e15ed705b803992 c49a358d1e61207c282e985905eae1810205fc2b asdf-system-connections-20170124-git asdf-system-connections.asd -asdf-viz http://beta.quicklisp.org/archive/asdf-viz/2019-05-21/asdf-viz-20190521-git.tgz 4138601 d979610cccb9ff58b71d99b01aaaca8b 8ce5cfd76d8031d15055a2e8390d0ac97abffa67 asdf-viz-20190521-git asdf-viz.asd -aserve http://beta.quicklisp.org/archive/aserve/2018-12-10/aserve-20181210-git.tgz 524530 4f5ddf1dcb415a1dc18a280bff91334b 8c71220d450d52b271ae7c3875eba2f37dbd80db aserve-20181210-git zaserve.asd -assert-p http://beta.quicklisp.org/archive/assert-p/2019-12-27/assert-p-20191227-git.tgz 17261 4d729e645c2a4a65aaa2eacd7602c044 f9324004ac2a29a9f217563b3fe992eff57be600 assert-p-20191227-git assert-p.asd -assertion-error http://beta.quicklisp.org/archive/assertion-error/2019-12-27/assertion-error-20191227-git.tgz 14185 797ad3c5cad14fb25eec76ccfb79b66a d9aff6bf141a59631d4371eace22a865bd29b0e6 assertion-error-20191227-git assertion-error.asd -assoc-utils http://beta.quicklisp.org/archive/assoc-utils/2018-10-18/assoc-utils-20181018-git.tgz 3516 cb9f306c3d4fac34bcf58fdd1a45eb6f 3210b7eb3a287e0307777340517b73093bca1752 assoc-utils-20181018-git assoc-utils-test.asd assoc-utils.asd -asteroids http://beta.quicklisp.org/archive/asteroids/2019-10-07/asteroids-20191007-git.tgz 3522066 e6956f404d402140e6573e24d849fc7d 89a44fb3225d6525e4bd26d20992a10ae2a0917a asteroids-20191007-git asteroids.asd -async-process http://beta.quicklisp.org/archive/async-process/2019-11-30/async-process-20191130-git.tgz 204948 a5dc34d24a41128f6342446e6348e791 18ec6b174dc9e249c7295a315233192a3cc37eec async-process-20191130-git src/async-process.asd -atdoc http://beta.quicklisp.org/archive/atdoc/2012-03-05/atdoc-20120305-git.tgz 36850 e9c40fd27b136fd9db0d0f13dc7d51a7 e60e3ca611b8eb9ff908091482932c14a119066a atdoc-20120305-git atdoc.asd example/blocks-world.asd -atomics http://beta.quicklisp.org/archive/atomics/2019-10-07/atomics-20191007-git.tgz 7007 722ec3bce23a990b37a5ccfe28da725a dabf84714ae2eed3598d6efe390c124e1b8c9791 atomics-20191007-git atomics-test.asd atomics.asd -authenticated-encryption http://beta.quicklisp.org/archive/authenticated-encryption/2018-10-18/authenticated-encryption-20181018-git.tgz 3639 02feacbc3a7b22144c368c498d5c4376 e966e0e3779ca5769c995cf4dc16e241c708a37f authenticated-encryption-20181018-git authenticated-encryption-test.asd authenticated-encryption.asd -avatar-api http://beta.quicklisp.org/archive/avatar-api/2015-06-08/avatar-api-20150608-git.tgz 2129 52a2e667536e10f80124ae2436f5d9a6 9fda0ec095f9fbdb8073605703d792a0eb3e8398 avatar-api-20150608-git avatar-api-test.asd avatar-api.asd -aws-foundation http://beta.quicklisp.org/archive/aws-foundation/2018-07-11/aws-foundation-20180711-git.tgz 4880 1cc177097ef8968147370f9970f04174 a973090f169db7cbacba714b68499f442b084902 aws-foundation-20180711-git aws-foundation.asd -aws-sign4 http://beta.quicklisp.org/archive/aws-sign4/2019-07-10/aws-sign4-20190710-git.tgz 35619 6d4df76edbdc135eadf22d09450f9c3c 54a0e8742edbbd2be9740fb6b9f620fe12c64d92 aws-sign4-20190710-git aws-sign4.asd -ayah-captcha http://beta.quicklisp.org/archive/ayah-captcha/2018-02-28/ayah-captcha-20180228-git.tgz 4660 396998f1fc484ded0afe3209ff00a380 59257d29def50e9701cdef4d34f13242cc85db4b ayah-captcha-20180228-git ayah-captcha.asd demo/ayah-captcha-demo.asd -babel http://beta.quicklisp.org/archive/babel/2019-11-30/babel-20191130-git.tgz 271183 80087c99fe351d24e56bb279a62effeb 726d583c6b9f5ff7f5c1fccc10ce2105348b0405 babel-20191130-git babel-streams.asd babel-tests.asd babel.asd -base-blobs http://beta.quicklisp.org/archive/base-blobs/2018-07-11/base-blobs-stable-9d781d0e-git.tgz 2442960 8bc33597482b7c41dc961f7ca69e2aec 36ed71aab08457bf4452c4d70de23c4574383668 base-blobs-stable-9d781d0e-git base-blobs.asd -base64 http://beta.quicklisp.org/archive/base64/2018-10-18/base64-20181018-git.tgz 2014 e7d77c873d9111e6e0a6704422805b24 3d8e62f5d3313d09e1a9ecd8d66f25b24eb58e73 base64-20181018-git base64.asd -basic-binary-ipc http://beta.quicklisp.org/archive/basic-binary-ipc/2015-08-04/basic-binary-ipc-20150804-git.tgz 57492 800adaca3395dad2c379fb6d64a51b1c dbc53ed3a51db6ec3605366dfca6616efe79dbb6 basic-binary-ipc-20150804-git basic-binary-ipc-tests.asd basic-binary-ipc.asd -bdef http://beta.quicklisp.org/archive/bdef/2019-12-27/bdef-20191227-git.tgz 13288 d9ff843530ce32a539ba4c7273bed079 308a463a559f142d4afacd85b439633ad81ac76f bdef-20191227-git bdef.asd -beast http://beta.quicklisp.org/archive/beast/2019-12-27/beast-20191227-git.tgz 14403 2c7f63da4924d0436d38082a7b1787cd 50de9053276359660d73b742d39c29f6c9c2455c beast-20191227-git beast-test.asd beast.asd -beirc http://beta.quicklisp.org/archive/beirc/2015-05-05/beirc-20150505-git.tgz 27301 50b1ea2e799d918ee68ff607f2ed7c98 091f2c11d2b297704101697235a411841ceb23ad beirc-20150505-git beirc.asd -big-string http://beta.quicklisp.org/archive/big-string/2019-03-07/big-string-20190307-hg.tgz 3949 bdffed5d0ef77e065911aba09e1bdf8c 5489c493ce7ca3c482880797a0d80c9c84e91384 big-string-20190307-hg big-string.asd -bike http://beta.quicklisp.org/archive/bike/2019-10-07/bike-20191007-git.tgz 70596 4cb973b533ea10cb735a167f77e2ff7f 9b3226071cf82b50a349d501031b1a8908ac0e18 bike-20191007-git bike-examples.asd bike-internals.asd bike-tests.asd bike.asd -binary-io http://beta.quicklisp.org/archive/binary-io/2019-12-27/binary-io-20191227-git.tgz 8936 ba18c49eb1fb8ff286cac00f7d0009f8 4ab347c91ba4fd1a680a8f033b30d1e14fbf4f1e binary-io-20191227-git binary-io.asd -binary-types http://beta.quicklisp.org/archive/binary-types/2013-06-15/binary-types-20130615-git.tgz 21337 e26f69cddf40a07beb89d9066830c44a 2f1a13a9ef75be93d53cf55d7c4c07260a620c3e binary-types-20130615-git binary-types.asd -binascii http://beta.quicklisp.org/archive/binascii/2015-07-09/binascii-20150709-git.tgz 196802 23f4db8372bd521725dd78dd667c2be1 e02502e8146770e87fa5b6e461b7729ee1117ad2 binascii-20150709-git binascii.asd -binfix http://beta.quicklisp.org/archive/binfix/2019-08-13/binfix-20190813-git.tgz 103896 916f3d55cf63c374ff9afacf03f9e9cc b3848eabd74026fd5a24d290bff94cdacd7d6dd3 binfix-20190813-git binfix.asd -binomial-heap http://beta.quicklisp.org/archive/binomial-heap/2013-04-20/binomial-heap-20130420-git.tgz 6211 ca40cb01b88a3fe902cc4cc25fb2d242 81583c3945e9f392cb8943713ed18724f72296f2 binomial-heap-20130420-git binomial-heap.asd -binpack http://beta.quicklisp.org/archive/binpack/2019-07-10/binpack-20190710-git.tgz 4335 88c5ea5d36266243886fd6d92ed03c94 6716a0de1e6296ddafd615d56bf7799d30faa4c7 binpack-20190710-git binpack.asd -birch http://beta.quicklisp.org/archive/birch/2016-03-18/birch-20160318-git.tgz 20320 1ce06aa2cbcef122fcef36186955cbd4 7deb668bd53ed29ac66d33e598efedccfe5ae6e5 birch-20160318-git birch.asd birch.test.asd -bit-ops http://beta.quicklisp.org/archive/bit-ops/2018-02-28/bit-ops-20180228-git.tgz 7131 487abc6e8afc586eb96300931a43d7be 923abf5d89d48ea17333f812c9c4bc1ab3092d90 bit-ops-20180228-git bit-ops.asd bit-ops.test.asd -bit-smasher http://beta.quicklisp.org/archive/bit-smasher/2018-10-18/bit-smasher-20181018-git.tgz 8790 bbb6df9cffc70ad72fe3a5b06664a0bc 6a4942aee4a5d892bd3b89cd5f2684dea079e951 bit-smasher-20181018-git bit-smasher.asd -bitfield-schema http://beta.quicklisp.org/archive/bitfield-schema/2012-01-07/bitfield-schema-20120107-git.tgz 6659 fac865d5c6379fd8e4a8526b99ec0662 5b4bf17a55e13ed80e657a545b9ea1ca5ceb77ec bitfield-schema-20120107-git bitfield-schema.asd -bitio http://beta.quicklisp.org/archive/bitio/2017-10-23/bitio-20171023-git.tgz 19253 4f906c8f8928bd703b72eb2207fbb623 d70390717f22b95bdbab594c14f468d674809844 bitio-20171023-git bitio.asd -bk-tree http://beta.quicklisp.org/archive/bk-tree/2013-04-20/bk-tree-20130420-git.tgz 21425 5ae53564f2a64abdc1424a054f965485 e0690274745029d8135d91abcdb18598e60e2999 bk-tree-20130420-git bk-tree.asd -bknr-datastore http://beta.quicklisp.org/archive/bknr-datastore/2019-12-27/bknr-datastore-20191227-git.tgz 630259 48d376b77c3e4bf912d25e7606f96bc1 b31c08ff484786b46311c972c2cc02ee9cc71ec1 bknr-datastore-20191227-git src/bknr.data.impex.asd src/bknr.datastore.asd src/bknr.impex.asd src/bknr.indices.asd src/bknr.skip-list.asd src/bknr.utils.asd src/bknr.xml.asd -bknr-web http://beta.quicklisp.org/archive/bknr-web/2014-07-13/bknr-web-20140713-git.tgz 172044 e867c9d79b03ea02d3e8af6d5d4a1fd7 80c17f624bf44065d7992880117d8a2373cf6744 bknr-web-20140713-git modules/bknr.modules.asd modules/spider/leech.asd src/bknr.web.asd src/html-match/html-match.asd -black-tie http://beta.quicklisp.org/archive/black-tie/2019-08-13/black-tie-20190813-git.tgz 13657 c6384b61495e45e737b0a4c8befe02c1 ceb8f687a25fe99e90bb8c7619820a7c2a8fb7e1 black-tie-20190813-git black-tie.asd -blackbird http://beta.quicklisp.org/archive/blackbird/2016-05-31/blackbird-20160531-git.tgz 12865 5cb13dc06a0eae8dcba14714d2b5365d 956c28da3fa238c46a3c52bcfc15afa415af452b blackbird-20160531-git blackbird-test.asd blackbird.asd -bobbin http://beta.quicklisp.org/archive/bobbin/2019-12-27/bobbin-20191227-hg.tgz 6090 1375f0163d0143291610a6591c7045dc 78bd651ef3eda07422453447881f91873bae548a bobbin-20191227-hg bobbin.asd -bodge-blobs-support http://beta.quicklisp.org/archive/bodge-blobs-support/2018-07-11/bodge-blobs-support-stable-8c77e4af-git.tgz 2287 9bdcf48ab4ab9f403838cd059b9affaa f44ce99cff4fbfc8362b59098847185bb884cce3 bodge-blobs-support-stable-8c77e4af-git bodge-blobs-support.asd -bodge-chipmunk http://beta.quicklisp.org/archive/bodge-chipmunk/2019-10-08/bodge-chipmunk-stable-6370e76a-git.tgz 1252241 0e111d03004ccb45037cab97c96e9bf0 6d930f384a15c6aa5d8e194135c367f9a779dc9a bodge-chipmunk-stable-6370e76a-git bodge-chipmunk.asd -bodge-glad http://beta.quicklisp.org/archive/bodge-glad/2018-02-28/bodge-glad-stable-d488bef5-git.tgz 54298 e5672047f95295ce6ab1da8f1f98b4d0 1bd91fbe51194ceb31551b724626d37230831cc3 bodge-glad-stable-d488bef5-git bodge-glad.asd -bodge-glfw http://beta.quicklisp.org/archive/bodge-glfw/2019-10-08/bodge-glfw-stable-7519a922-git.tgz 511390 030b8f5e93f15e435c231daa1f59beed eea577b03d23779d483b5e82ca79612e5a2551ec bodge-glfw-stable-7519a922-git bodge-glfw.asd -bodge-nanovg http://beta.quicklisp.org/archive/bodge-nanovg/2019-10-08/bodge-nanovg-stable-90fd9f9d-git.tgz 2103878 197d1b793047b22c7ea6c25e7628e58d 24ea020872dd2507e284e46b0197f102f83b53a4 bodge-nanovg-stable-90fd9f9d-git bodge-nanovg.asd -bodge-nuklear http://beta.quicklisp.org/archive/bodge-nuklear/2019-10-08/bodge-nuklear-stable-16f52766-git.tgz 1867351 5a3230800bb5e1e50b25c981bbbcaa40 ce626e9ea26731e7c3fbfdc08fd6efb73daa6cf6 bodge-nuklear-stable-16f52766-git bodge-nuklear.asd -bodge-ode http://beta.quicklisp.org/archive/bodge-ode/2019-10-08/bodge-ode-stable-3a5fbcea-git.tgz 2343673 24d965361477cf314b4fa50f7d851edd 64b63a2426df1b0fcce1d98958bb78c76b5ccf53 bodge-ode-stable-3a5fbcea-git bodge-ode.asd -bodge-openal http://beta.quicklisp.org/archive/bodge-openal/2019-10-08/bodge-openal-stable-9dc6ea9c-git.tgz 956800 d8eb0bfaf88c75e94014aeb8c8ecee42 6287f84f6e9b32976f4d528a0359534701f0377b bodge-openal-stable-9dc6ea9c-git bodge-openal.asd -bodge-sndfile http://beta.quicklisp.org/archive/bodge-sndfile/2019-10-08/bodge-sndfile-stable-e57475a5-git.tgz 3099841 d2eb07bf885c7f2215cab2056a7bd0cd 7bbd1e3bb5afc3294d76e2b158c8a45214405ee3 bodge-sndfile-stable-e57475a5-git bodge-sndfile.asd -bordeaux-fft http://beta.quicklisp.org/archive/bordeaux-fft/2015-06-08/bordeaux-fft-20150608-http.tgz 13857 99bee7dc569e71f40783551c792295bd a0caf5c27a3c3734178472333279926177ffb23a bordeaux-fft-20150608-http bordeaux-fft.asd -bordeaux-threads http://beta.quicklisp.org/archive/bordeaux-threads/2019-11-30/bordeaux-threads-v0.8.7.tgz 21951 071b427dd047999ffe038a2ef848ac13 b947d6b5d66b895a715f6d60044ff6d3de8afcf3 bordeaux-threads-v0.8.7 bordeaux-threads.asd -bourbaki http://beta.quicklisp.org/archive/bourbaki/2011-01-10/bourbaki-20110110-http.tgz 133787 64d23b156e8cf295c76a144e6522749b c224635f433be2ab0e45fd2e0ec13c6d735751ab bourbaki-20110110-http bourbaki.asd -bp http://beta.quicklisp.org/archive/bp/2019-12-27/bp-20191227-git.tgz 37999 079f202bf3c7eb3f3dcd4f5ed31333bc a157e736ffd5f5b70e19001a89435d5a3c937553 bp-20191227-git bp.asd -bst http://beta.quicklisp.org/archive/bst/2019-07-10/bst-20190710-git.tgz 18426 52ed6faee1e8761e061cba6bbb73936c 7c5cf9987cc1340a4241ef941c5ed473b4e72e3c bst-20190710-git bst.asd -bt-semaphore http://beta.quicklisp.org/archive/bt-semaphore/2018-07-11/bt-semaphore-20180711-git.tgz 4185 f70c869eaf18e277056a16eb3a21fd4a 23d9c3966166a46e5c42bbdacab7a2f684bfcd0c bt-semaphore-20180711-git bt-semaphore-test.asd bt-semaphore.asd -btrie http://beta.quicklisp.org/archive/btrie/2014-07-13/btrie-20140713-git.tgz 6389 1fdf3a46133861b59f7a1063f5fe6696 9d9e506112d4b87225944df068090c68d4b2c563 btrie-20140713-git btrie.asd -bubble-operator-upwards http://beta.quicklisp.org/archive/bubble-operator-upwards/2012-11-25/bubble-operator-upwards-1.0.tgz 2943 390c6f1aad23154fc613a1941ab0ee90 e5c62a9e32928fc4e4d38f9949acd9b30b0a7187 bubble-operator-upwards-1.0 bubble-operator-upwards.asd -buildapp http://beta.quicklisp.org/archive/buildapp/2015-12-18/buildapp-1.5.6.tgz 16389 b6c1450b19370d7e4ac21bf565b62c89 33832bc72acbd9b3c4a097b054bd0de1921b873a buildapp-1.5.6 buildapp.asd -buildnode http://beta.quicklisp.org/archive/buildnode/2017-04-03/buildnode-20170403-git.tgz 66725 b917f0d6c20489febbef0d5b954c350d dfe5d7aec7c73eb6797069f1d5b7fdc2d60fb610 buildnode-20170403-git buildnode-excel.asd buildnode-html5.asd buildnode-kml.asd buildnode-xhtml.asd buildnode-xul.asd buildnode.asd -burgled-batteries http://beta.quicklisp.org/archive/burgled-batteries/2016-08-25/burgled-batteries-20160825-git.tgz 42019 d20613a907e062fd32128fe25aead746 3124f87459f2bf2ad793179593df364aa383c3b1 burgled-batteries-20160825-git burgled-batteries-tests.asd burgled-batteries.asd -burgled-batteries.syntax http://beta.quicklisp.org/archive/burgled-batteries.syntax/2016-03-18/burgled-batteries.syntax-20160318-git.tgz 8126 ffdbbba14dbf3205ba0fe9ac6fae0bb0 b2801c136e8ecf705eb05c3f39e882eb56c706bb burgled-batteries.syntax-20160318-git burgled-batteries.syntax-test.asd burgled-batteries.syntax.asd -bytecurry.asdf-ext http://beta.quicklisp.org/archive/bytecurry.asdf-ext/2015-05-05/bytecurry.asdf-ext-20150505-git.tgz 2750 9fb33756e2edcb3ab0074dd8c32b73e4 32af33d3211f1d3aa8cb3a32d125ee5e49ae4236 bytecurry.asdf-ext-20150505-git bytecurry.asdf-ext.asd -bytecurry.mocks http://beta.quicklisp.org/archive/bytecurry.mocks/2015-05-05/bytecurry.mocks-20150505-git.tgz 4281 fa669aeb93a4beeb2457b3d30718adf2 648c6215a6c87842c35f9d9db578b71a7bcd2536 bytecurry.mocks-20150505-git bytecurry.mocks.asd -cacau http://beta.quicklisp.org/archive/cacau/2019-12-27/cacau-20191227-git.tgz 316777 b02aec6139693a06b09972690c6c20bb 9268f540d65c3439ff4fd186f2d22b539613010c cacau-20191227-git cacau-asdf.asd cacau-test.asd cacau.asd examples/asdf-intregration/cacau-examples-asdf-integration-test.asd examples/asdf-intregration/cacau-examples-asdf-integration.asd -cacle http://beta.quicklisp.org/archive/cacle/2019-05-21/cacle-20190521-git.tgz 16699 8ea845a295a43d0794dc43c22d36ec2c edfe4bf4dc852fac85daf536ae908816aa269d28 cacle-20190521-git cacle.asd -calispel http://beta.quicklisp.org/archive/calispel/2017-08-30/calispel-20170830-git.tgz 28640 1fba6e4b2055f5d1f0a78387e29552b1 1035e7249ad45cc5fb7aa5d6e362b0a80fefb7b8 calispel-20170830-git calispel.asd -cambl http://beta.quicklisp.org/archive/cambl/2018-12-10/cambl-20181210-git.tgz 45991 e5857aaf953cfdb3ebb1c4c49a02e92c 8d9ad22f71869a88fa184ae7e2510e73ff7c669e cambl-20181210-git cambl-test.asd cambl.asd fprog.asd -can http://beta.quicklisp.org/archive/can/2018-03-28/can-20180328-git.tgz 2565 6ef0d28d5aa6bc2936078cc116b70f39 0e6ad110295f63dba70e4f4d5f467734c8b52e20 can-20180328-git can-test.asd can.asd -caramel http://beta.quicklisp.org/archive/caramel/2013-04-20/caramel-20130420-git.tgz 4745 b6e6020c467971a5118dd7dba8276270 5d89e63be813fb25e31975f4d42db250aa2aecb2 caramel-20130420-git caramel.asd -cardiogram http://beta.quicklisp.org/archive/cardiogram/2019-08-13/cardiogram-20190813-git.tgz 9994 ebf310b3df23d141ccfaf09abd264bee 939ff797658ae8ab074cb73d4de03bc75d46b305 cardiogram-20190813-git cardiogram.asd -cari3s http://beta.quicklisp.org/archive/cari3s/2019-07-10/cari3s-20190710-git.tgz 25064 f6b7bad1691bd59f46c9e2128ce18faa 473ce6a22fb69dd67c617d9d3c15eb6c5690d634 cari3s-20190710-git cari3s.asd -carrier http://beta.quicklisp.org/archive/carrier/2018-12-10/carrier-20181210-git.tgz 3881 f831e7a8f590a9c634eaacdc8f145fe5 d2f6c847ae390bf95b2b392f562fbe17e6530563 carrier-20181210-git carrier.asd -cartesian-product-switch http://beta.quicklisp.org/archive/cartesian-product-switch/2012-09-09/cartesian-product-switch-2.0.tgz 4502 0f48da4205f8cd3b201eae1e07131fcd 82200c07f66d5d80ebeb62388108699e03e27f49 cartesian-product-switch-2.0 cartesian-product-switch.asd -caveman http://beta.quicklisp.org/archive/caveman/2019-08-13/caveman-20190813-git.tgz 29873 09d7223fd528757eaf1285dd99105ed6 63f6dd0215e1d5dc7321ee12e2c52edb31fe674c caveman-20190813-git caveman-middleware-dbimanager.asd caveman-test.asd caveman.asd caveman2-db.asd caveman2-test.asd caveman2.asd -caveman2-widgets http://beta.quicklisp.org/archive/caveman2-widgets/2018-02-28/caveman2-widgets-20180228-git.tgz 115350 960ba92d1ac86f49ce553bffd7136b25 446246d6fb1f1a2891175b7e88f45704fa72c728 caveman2-widgets-20180228-git caveman2-widgets-test.asd caveman2-widgets.asd -caveman2-widgets-bootstrap http://beta.quicklisp.org/archive/caveman2-widgets-bootstrap/2018-02-28/caveman2-widgets-bootstrap-20180228-git.tgz 4962 b6fc04d5468c9b3d6a502024eaaa8750 7ce56c2e7c5eb75f32208c90695e44a3006c10be caveman2-widgets-bootstrap-20180228-git caveman2-widgets-bootstrap-test.asd caveman2-widgets-bootstrap.asd -ccl-compat http://beta.quicklisp.org/archive/ccl-compat/2017-11-30/ccl-compat-20171130-git.tgz 7068 3229bd0be4ffa2a90e882433253a0100 fc117e973fdd6c08994c81baf99e5cc025877654 ccl-compat-20171130-git ccl-compat.asd -ccldoc http://beta.quicklisp.org/archive/ccldoc/2018-01-31/ccldoc-20180131-git.tgz 46896 d35e98910bbb163d9e2e27d156b274f8 93b40acb846828ba4f51e19cf47feed6391a511f ccldoc-20180131-git source/ccldoc-libraries.asd source/ccldoc.asd -cells http://beta.quicklisp.org/archive/cells/2018-03-28/cells-20180328-git.tgz 20813259 c28d3bfb8ee51a0d8fae9c2357b6833a 49c5235fd154b630c785941523c910666b970a64 cells-20180328-git cells-test.asd cells.asd -cepl http://beta.quicklisp.org/archive/cepl/2019-10-07/cepl-release-quicklisp-635f3483-git.tgz 434389 900d85f9a403def693c93db2b8f147d0 baea38b63add26c6aee73e0658ebbe2d7453b3d3 cepl-release-quicklisp-635f3483-git cepl.asd cepl.build.asd -cepl.camera http://beta.quicklisp.org/archive/cepl.camera/2018-02-28/cepl.camera-release-quicklisp-1292212a-git.tgz 3590 ea3319909269d1defe329ae8e126a314 6ef8df0aa73f50df2b63f462301c0bf9331d6007 cepl.camera-release-quicklisp-1292212a-git cepl.camera.asd -cepl.devil http://beta.quicklisp.org/archive/cepl.devil/2018-02-28/cepl.devil-release-quicklisp-ea5f8514-git.tgz 1930 3ca7236c320de5b217c7cd924bf8e063 6b6f880612fd28a8573cc6b4795bfa663131cf83 cepl.devil-release-quicklisp-ea5f8514-git cepl.devil.asd -cepl.drm-gbm http://beta.quicklisp.org/archive/cepl.drm-gbm/2019-05-21/cepl.drm-gbm-20190521-git.tgz 4081 1303fc696e495ec12e2ece9ee4dc6344 b74136275913799eaae407b967c32eac5baec46c cepl.drm-gbm-20190521-git cepl.drm-gbm.asd -cepl.glop http://beta.quicklisp.org/archive/cepl.glop/2018-02-28/cepl.glop-release-quicklisp-8ec09801-git.tgz 2915 33579536bbfc7037efe4ee830ecaed5f b72f80288063b5d214cf27257d1bcdf8b703878b cepl.glop-release-quicklisp-8ec09801-git cepl.glop.asd -cepl.sdl2 http://beta.quicklisp.org/archive/cepl.sdl2/2018-02-28/cepl.sdl2-release-quicklisp-6da5a030-git.tgz 4119 8e30fec5d59a4cf8f21525d1cdb9f7d3 61e4d1868d907fc092236d7f6ad8b36b685b181c cepl.sdl2-release-quicklisp-6da5a030-git cepl.sdl2.asd -cepl.sdl2-image http://beta.quicklisp.org/archive/cepl.sdl2-image/2018-02-28/cepl.sdl2-image-release-quicklisp-94a77649-git.tgz 2449 7e83fbc6868c8a13579dd590377c15fa c784ddba948e3260da76df22b18b7cc41fba7fda cepl.sdl2-image-release-quicklisp-94a77649-git cepl.sdl2-image.asd -cepl.sdl2-ttf http://beta.quicklisp.org/archive/cepl.sdl2-ttf/2018-01-31/cepl.sdl2-ttf-release-quicklisp-11b498a3-git.tgz 2404 d5e31a84c08ec2bf453a0a9cf00fa4e9 7c4640f10b7220bee04db63eef4cbf6ecae2f757 cepl.sdl2-ttf-release-quicklisp-11b498a3-git cepl.sdl2-ttf.asd -cepl.skitter http://beta.quicklisp.org/archive/cepl.skitter/2018-02-28/cepl.skitter-release-quicklisp-f52b9240-git.tgz 1755 64a97da55e6074842428311cafc99bed 63f431bc9eaa088c5c77dda2f4d983c9aa17bfdb cepl.skitter-release-quicklisp-f52b9240-git cepl.skitter.glop.asd cepl.skitter.sdl2.asd -cepl.spaces http://beta.quicklisp.org/archive/cepl.spaces/2018-03-28/cepl.spaces-release-quicklisp-c7f83f26-git.tgz 24762 53d77882ea7a52043103f436138b5496 765133bddb709078ff096c43c9ff4d98cf8fabe2 cepl.spaces-release-quicklisp-c7f83f26-git cepl.spaces.asd -ceramic http://beta.quicklisp.org/archive/ceramic/2019-11-30/ceramic-20191130-git.tgz 86783 fe8e29a2f02e11260e50449dc17d9a2d 79c7d3bfc3315beb09afa2f9fcc36f08f54e0af8 ceramic-20191130-git ceramic.asd examples/hello-world/ceramic-hello-world.asd t/app/ceramic-test-app.asd -cerberus http://beta.quicklisp.org/archive/cerberus/2019-02-02/cerberus-20190202-git.tgz 3247973 993b538eb39bdc9fa976eb688f8aaf71 6aabeae31748df0b54550e00993e3b758b344581 cerberus-20190202-git cerberus.asd -cesdi http://beta.quicklisp.org/archive/cesdi/2019-08-13/cesdi_1.0.tgz 6241 3db5a8c77f7b5facf158ef91f2161d28 77436237165035312da19ea32641b3e2dfd57c58 cesdi_1.0 cesdi.asd tests/cesdi_tests.asd -cffi http://beta.quicklisp.org/archive/cffi/2019-07-10/cffi_0.20.1.tgz 260119 b8a8337465a7b4c1be05270b777ce14f 9f0940f1693b5d19ac354a426b218734d45fb6ef cffi_0.20.1 cffi-examples.asd cffi-grovel.asd cffi-libffi.asd cffi-tests.asd cffi-toolchain.asd cffi-uffi-compat.asd cffi.asd -chameleon http://beta.quicklisp.org/archive/chameleon/2019-11-30/chameleon-v1.1.0.tgz 4071 5d1819290c08797f2cd42cdeae0f4795 48012faabe08d783071117c747b80414550e3915 chameleon-v1.1.0 chameleon.asd -chancery http://beta.quicklisp.org/archive/chancery/2019-12-27/chancery-20191227-hg.tgz 15232 ac00423a87aa78b85a877eafa97056a8 c42e7495ac578efec42d4019cf306bd4d8e20e53 chancery-20191227-hg chancery.asd chancery.test.asd -changed-stream http://beta.quicklisp.org/archive/changed-stream/2013-01-28/changed-stream-20130128-git.tgz 233624 08dfb9234851b9bbe3d2b774efc809b6 153aecf366d19d2091f7e4c8a4aa22293cd0a66b changed-stream-20130128-git changed-stream.asd changed-stream.test.asd -chanl http://beta.quicklisp.org/archive/chanl/2019-11-30/chanl-20191130-git.tgz 27265 f3101f6d31943f48b2f963d9f4c54172 457163482b344b4976527d435e097451c65942aa chanl-20191130-git chanl.asd -cheat-js http://beta.quicklisp.org/archive/cheat-js/2012-10-13/cheat-js-20121013-git.tgz 27000 d23fc2a4dfd3a0ce8c7fb42c773feb2d 288b962ed29320e097d0bf871dcd0189aa5de94d cheat-js-20121013-git cheat-js.asd -check-it http://beta.quicklisp.org/archive/check-it/2015-07-09/check-it-20150709-git.tgz 19988 0baae55e5a9c8c884202cbc51e634c42 49933b16fc112096734546df0d91bb76bef3044e check-it-20150709-git check-it.asd -checkl http://beta.quicklisp.org/archive/checkl/2018-03-28/checkl-20180328-git.tgz 8294 a5050385e2ef2977ba2112ea88128535 aca1cf3498cb81a443772c0bc306b11e037d5dd6 checkl-20180328-git checkl-docs.asd checkl-test.asd checkl.asd -chemical-compounds http://beta.quicklisp.org/archive/chemical-compounds/2011-10-01/chemical-compounds-1.0.2.tgz 5119 05d45cf42a61e9dabab409d345b778c1 1fc077075d4b580f4b363a131f670bab602e8886 chemical-compounds-1.0.2 chemical-compounds.asd -chillax http://beta.quicklisp.org/archive/chillax/2015-03-02/chillax-20150302-git.tgz 207342 f173c34bb131fe6192f5c6c87bf1be7e 860cd942dd71757d22f1b81d24919e36cca850c5 chillax-20150302-git chillax.asd chillax.core.asd chillax.jsown.asd chillax.view-server.asd chillax.yason.asd -chipmunk-blob http://beta.quicklisp.org/archive/chipmunk-blob/2018-01-31/chipmunk-blob-stable-55c6bf5b-git.tgz 758650 179214dca154f48185307aa331e7318f 54b0bf182e9eaf483d9287cd8499f33d9ea49090 chipmunk-blob-stable-55c6bf5b-git chipmunk-blob.asd -chipz http://beta.quicklisp.org/archive/chipz/2019-02-02/chipz-20190202-git.tgz 37110 e3533408ca6899fe996eede390e820c7 b2a2321ae7eab3609bf20ffa01f7bddc307bf087 chipz-20190202-git chipz.asd -chirp http://beta.quicklisp.org/archive/chirp/2019-07-10/chirp-20190710-git.tgz 86852 f55281d67bea97ea0348500ae6713d70 a05e8372d96a09bf5a8676e286b35ea476ba200a chirp-20190710-git chirp-core.asd chirp-dexador.asd chirp-drakma.asd chirp.asd -chrome-native-messaging http://beta.quicklisp.org/archive/chrome-native-messaging/2015-03-02/chrome-native-messaging-20150302-git.tgz 1973 3fae36a2473eb7095d50f8472d31bd6c beeb53f51396f5fd05217c00b07306835a566943 chrome-native-messaging-20150302-git chrome-native-messaging.asd -chronicity http://beta.quicklisp.org/archive/chronicity/2019-02-02/chronicity-20190202-git.tgz 30517 43ca1a6e3f5f16f3c3fa8708aa6f8abb 8d561cd975aec6eceaabd245b8fc4e26f9450081 chronicity-20190202-git chronicity-test.asd chronicity.asd -chtml-matcher http://beta.quicklisp.org/archive/chtml-matcher/2011-10-01/chtml-matcher-20111001-git.tgz 9772 b78c982a080fa6264d0524f5aabb6440 c328ea450fd88170ce98235761bcd3973ce2fc1e chtml-matcher-20111001-git chtml-matcher.asd -chunga http://beta.quicklisp.org/archive/chunga/2018-01-31/chunga-20180131-git.tgz 20552 044b684535b11b1eee1cf939bec6e14a 674f398ede85b384db80b21d93d5a4fae335a982 chunga-20180131-git chunga.asd -ci-utils http://beta.quicklisp.org/archive/ci-utils/2019-12-27/ci-utils-20191227-git.tgz 16686 d0c3f9cc75bca68b50276a39a8a0a705 ce9949fcdb5a8e75c2c674e527ff649d39af0960 ci-utils-20191227-git ci-utils-features.asd ci-utils.asd -circular-streams http://beta.quicklisp.org/archive/circular-streams/2016-12-04/circular-streams-20161204-git.tgz 3335 2383f3b82fa3335d9106e1354a678db8 aaeec87552396bc112300d66e93905c546e2c0ec circular-streams-20161204-git circular-streams-test.asd circular-streams.asd -city-hash http://beta.quicklisp.org/archive/city-hash/2016-08-25/city-hash-20160825-git.tgz 31639 d6ea890c84c4745bbc435b97eaa0457d 76b2a1f9c2a3e1388b89f682c5d6d493e8f25e2c city-hash-20160825-git city-hash-test.asd city-hash.asd -cl+ssl http://beta.quicklisp.org/archive/cl+ssl/2019-11-30/cl+ssl-20191130-git.tgz 52704 995aaef02ec5112a0de78b2533691629 96dd6269d2044cbe4ee3cf3f3c2abd9b7fa17110 cl+ssl-20191130-git cl+ssl.asd cl+ssl.test.asd -cl-6502 http://beta.quicklisp.org/archive/cl-6502/2015-09-23/cl-6502-20150923-git.tgz 67684 b4396714cfa3693fd1f40d3464622304 f55e04108665aa220401d15ec2b08b8cf6739e35 cl-6502-20150923-git cl-6502.asd -cl-abnf http://beta.quicklisp.org/archive/cl-abnf/2019-05-21/cl-abnf-20190521-git.tgz 7966 59e6c617f7183ae62eb9626ae12d836f 8b6f0a0f9162ba4df5fea4046bc32b4e8108189c cl-abnf-20190521-git abnf.asd -cl-abstract-classes http://beta.quicklisp.org/archive/cl-abstract-classes/2019-03-07/cl-abstract-classes-20190307-hg.tgz 4719 9f70affac8015d8fc4e29f16c642890e 9c691e814b9e541e024751edd4e3e26c87082b0b cl-abstract-classes-20190307-hg abstract-classes.asd singleton-classes.asd -cl-acronyms http://beta.quicklisp.org/archive/cl-acronyms/2015-03-02/cl-acronyms-20150302-git.tgz 927131 99e7304da8f6408227323fdab76e07db 695aaa263b152453e6f8130afb6cfcea1165a463 cl-acronyms-20150302-git cl-acronyms.asd -cl-algebraic-data-type http://beta.quicklisp.org/archive/cl-algebraic-data-type/2019-10-07/cl-algebraic-data-type-20191007-git.tgz 7396 022de40e52b252919ea9c7f77ab90435 eec9f2941bcad980c2f76a5f94df20f1f920c87f cl-algebraic-data-type-20191007-git cl-algebraic-data-type.asd -cl-all http://beta.quicklisp.org/archive/cl-all/2019-07-10/cl-all-20190710-git.tgz 5429 7927a2782ba49b86ed0ce365841bbb70 b5c956f55bea28fa792c632e86bef7a6f65e7fc1 cl-all-20190710-git cl-all.asd -cl-amqp http://beta.quicklisp.org/archive/cl-amqp/2019-10-08/cl-amqp-v0.4.1.tgz 58162 1867a1d1ecdf4606ed8c50d583b1b876 92e5c46f853154df29fb8e8a1a62bbbf23b34332 cl-amqp-v0.4.1 cl-amqp.asd cl-amqp.test.asd -cl-ana http://beta.quicklisp.org/archive/cl-ana/2019-07-10/cl-ana-20190710-git.tgz 526237 a22444bc080a90f4ff3e2b08a1ad0595 036cf75968c23e91fbe6819a2a6ecf6c4a59387b cl-ana-20190710-git binary-tree/cl-ana.binary-tree.asd calculus/cl-ana.calculus.asd cl-ana.asd clos-utils/cl-ana.clos-utils.asd columnar-table/cl-ana.columnar-table.asd csv-table/cl-ana.csv-table.asd error-propogation/cl-ana.error-propogation.asd file-utils/cl-ana.file-utils.asd fitting/cl-ana.fitting.asd functional-utils/cl-ana.functional-utils.asd generic-math/cl-ana.generic-math.asd gnuplot-interface/cl-ana.gnuplot-interface.asd gsl-cffi/cl-ana.gsl-cffi.asd hash-table-utils/cl-ana.hash-table-utils.asd hdf-cffi/cl-ana.hdf-cffi.asd hdf-table/cl-ana.hdf-table.asd hdf-typespec/cl-ana.hdf-typespec.asd hdf-utils/cl-ana.hdf-utils.asd histogram/cl-ana.histogram.asd int-char/cl-ana.int-char.asd linear-algebra/cl-ana.linear-algebra.asd list-utils/cl-ana.list-utils.asd lorentz/cl-ana.lorentz.asd macro-utils/cl-ana.macro-utils.asd makeres-block/cl-ana.makeres-block.asd makeres-branch/cl-ana.makeres-branch.asd makeres-graphviz/cl-ana.makeres-graphviz.asd makeres-macro/cl-ana.makeres-macro.asd makeres-progress/cl-ana.makeres-progress.asd makeres-table/cl-ana.makeres-table.asd makeres-utils/cl-ana.makeres-utils.asd makeres/cl-ana.makeres.asd map/cl-ana.map.asd math-functions/cl-ana.math-functions.asd memoization/cl-ana.memoization.asd ntuple-table/cl-ana.ntuple-table.asd package-utils/cl-ana.package-utils.asd pathname-utils/cl-ana.pathname-utils.asd plotting/cl-ana.plotting.asd quantity/cl-ana.quantity.asd reusable-table/cl-ana.reusable-table.asd serialization/cl-ana.serialization.asd statistical-learning/cl-ana.statistical-learning.asd statistics/cl-ana.statistics.asd string-utils/cl-ana.string-utils.asd symbol-utils/cl-ana.symbol-utils.asd table-utils/cl-ana.table-utils.asd table-viewing/cl-ana.table-viewing.asd table/cl-ana.table.asd tensor/cl-ana.tensor.asd typed-table/cl-ana.typed-table.asd typespec/cl-ana.typespec.asd -cl-annot http://beta.quicklisp.org/archive/cl-annot/2015-06-08/cl-annot-20150608-git.tgz 10039 35d8f79311bda4dd86002d11edcd0a21 31e415954f5e033907cd5d88ee4735e4ed940f12 cl-annot-20150608-git cl-annot.asd -cl-annot-prove http://beta.quicklisp.org/archive/cl-annot-prove/2015-09-23/cl-annot-prove-20150923-git.tgz 9244 d7ee8d5c35f1aaa036b77bbd1092b77c 25a765cde6977c027de5adf3067647623e96ba05 cl-annot-prove-20150923-git cl-annot-prove-test.asd cl-annot-prove.asd -cl-anonfun http://beta.quicklisp.org/archive/cl-anonfun/2011-12-03/cl-anonfun-20111203-git.tgz 2163 915bda1a7653d42090f8d20a1ad85d0b a0a38ada878271e7bc8ebc9cb75a0bd7b5cc7aa5 cl-anonfun-20111203-git cl-anonfun.asd -cl-ansi-term http://beta.quicklisp.org/archive/cl-ansi-term/2018-02-28/cl-ansi-term-20180228-git.tgz 48226 abb6d07e957b16e6899144d27ee6019a 1f58dd2298e65b8e28d1a7acd0b16762e486032b cl-ansi-term-20180228-git cl-ansi-term.asd -cl-ansi-text http://beta.quicklisp.org/archive/cl-ansi-text/2015-08-04/cl-ansi-text-20150804-git.tgz 5876 70aa38b40377a5e89a7f22bb68b3f796 2de105750d54136d99a566bbf98d57c85088fb90 cl-ansi-text-20150804-git cl-ansi-text-test.asd cl-ansi-text.asd -cl-apple-plist http://beta.quicklisp.org/archive/cl-apple-plist/2011-11-05/cl-apple-plist-20111105-git.tgz 2720 95b6163c11c22fbb84c1f43c6703e612 b973e5c37b48d524c34b1ea2e8b89f636d69ad06 cl-apple-plist-20111105-git cl-apple-plist.asd -cl-arff-parser http://beta.quicklisp.org/archive/cl-arff-parser/2013-04-21/cl-arff-parser-20130421-git.tgz 4500 8ae977859eb11df65a1694b52436b0b5 d2342be9fa7b9a7aea26935b6268b7f556f7ff81 cl-arff-parser-20130421-git cl-arff-parser.asd -cl-argparse http://beta.quicklisp.org/archive/cl-argparse/2019-12-27/cl-argparse-20191227-git.tgz 6876 199e936fd0f8990d7fe264ef5d0c9101 becc75542c82a1d028a1d99cc74cec61448f2c78 cl-argparse-20191227-git src/cl-argparse.asd -cl-arrows http://beta.quicklisp.org/archive/cl-arrows/2016-03-18/cl-arrows-20160318-git.tgz 2072 3098c08f52480279d64bd1314e72d50c 91c9b1d1fb60d4e188647797785ace68d9bc4d5e cl-arrows-20160318-git cl-arrows.asd -cl-arxiv-api http://beta.quicklisp.org/archive/cl-arxiv-api/2017-04-03/cl-arxiv-api-20170403-git.tgz 9013 3537c564323f050ba434a8198e525455 7c066716a5453b08d60181849bfb302517009806 cl-arxiv-api-20170403-git cl-arxiv-api.asd -cl-ascii-art http://beta.quicklisp.org/archive/cl-ascii-art/2017-10-19/cl-ascii-art-20171019-git.tgz 2500481 cf7fe4d84658d5d65d899e5b2c2f88fe 1fce75ccdd44c7ff91be24c51e6d570f009ccd94 cl-ascii-art-20171019-git cl-ascii-art.asd -cl-ascii-table http://beta.quicklisp.org/archive/cl-ascii-table/2017-12-27/cl-ascii-table-20171227-git.tgz 3493 4a48649958049fd2a147ec6dcc2f4dea 83858d3fd90d9f3f41e7057bcdeefc583178d42a cl-ascii-table-20171227-git cl-ascii-table.asd -cl-association-rules http://beta.quicklisp.org/archive/cl-association-rules/2017-04-03/cl-association-rules-20170403-git.tgz 4370 641b30a4fcf913cf91acbe6aaf2cae1a cf2b99cd6350ac6eef1a1301b6f80d5d27d5e305 cl-association-rules-20170403-git cl-association-rules.asd -cl-async http://beta.quicklisp.org/archive/cl-async/2019-11-30/cl-async-20191130-git.tgz 56759 3850bc827b4c41b6047b962e3892bcb2 a958e4d8f40c64c4e0c2f0da80624af120bfb7cd cl-async-20191130-git cl-async-repl.asd cl-async-ssl.asd cl-async-test.asd cl-async.asd -cl-async-future http://beta.quicklisp.org/archive/cl-async-future/2015-01-13/cl-async-future-20150113-git.tgz 5719 961dbcb0bad3515ac7170f96dfd626ef 50751c2b573e0323f4c4687427df1d15b901cc38 cl-async-future-20150113-git cl-async-future.asd -cl-autorepo http://beta.quicklisp.org/archive/cl-autorepo/2018-07-11/cl-autorepo-20180711-git.tgz 2223 333fc8779ce41c4e87ed5bdae6a18047 93fa8ee37a34306d513fbdcdfef0b32b6e50723d cl-autorepo-20180711-git cl-autorepo.asd -cl-autowrap http://beta.quicklisp.org/archive/cl-autowrap/2019-05-21/cl-autowrap-20190521-git.tgz 76125 be601951cafd465e1445586a16024e0b b337ff6c7c98ded0be3c1b92853815a5fd38d23c cl-autowrap-20190521-git cl-autowrap-test.asd cl-autowrap.asd cl-plus-c.asd -cl-azure http://beta.quicklisp.org/archive/cl-azure/2016-08-25/cl-azure-20160825-git.tgz 16121 b85ed39bbbe3dc96b008dba7f7832365 e6bc24f54ee60ad9c51143995e36e9344f450b57 cl-azure-20160825-git cl-azure.asd -cl-base32 http://beta.quicklisp.org/archive/cl-base32/2013-04-20/cl-base32-20130420-git.tgz 3417 e5066e4e4947e6f9d4debcbb38c008b9 ae9f24b9a9f4055650d2cc5aafd986cd4251b19b cl-base32-20130420-git cl-base32.asd -cl-base58 http://beta.quicklisp.org/archive/cl-base58/2015-01-13/cl-base58-20150113-git.tgz 2327 18cbd835ced24e94b0eff6380d7ee088 114d203cecd45d09c54756b5042d493c31f37d51 cl-base58-20150113-git cl-base58-test.asd cl-base58.asd -cl-base64 http://beta.quicklisp.org/archive/cl-base64/2015-09-23/cl-base64-20150923-git.tgz 8589 560d0601eaa86901611f1484257b9a57 429e68ef554c75d437f2f109d670c28fd877bf0a cl-base64-20150923-git cl-base64.asd -cl-batis http://beta.quicklisp.org/archive/cl-batis/2019-01-07/cl-batis-20190107-git.tgz 9418 5dece883bcc69d11ed1f7e4a00b35671 a68412091d2bbbe32919dc0238ff3d504d5bacae cl-batis-20190107-git batis-test.asd batis.asd cl-batis.asd -cl-bayesnet http://beta.quicklisp.org/archive/cl-bayesnet/2013-04-20/cl-bayesnet-20130420-git.tgz 1176067 bfbc8a2a51d5b76c4c53993d2280d94f ff6228f63582e6f4a5665fb845bce62df365347a cl-bayesnet-20130420-git cl-bayesnet.asd -cl-beanstalk http://beta.quicklisp.org/archive/cl-beanstalk/2011-06-19/cl-beanstalk-20110619-git.tgz 8888 a0cc4fd21e978722d70185c8cb908053 657eca4550127ddf554db273999f89f5a4e1b7e7 cl-beanstalk-20110619-git cl-beanstalk.asd -cl-bencode http://beta.quicklisp.org/archive/cl-bencode/2018-02-28/cl-bencode-20180228-git.tgz 6343 4eaa85d018a4fbb35378c07c727bf585 0548331a29e838863d1f0573ca8c788647ea8196 cl-bencode-20180228-git bencode.asd -cl-bert http://beta.quicklisp.org/archive/cl-bert/2014-11-06/cl-bert-20141106-git.tgz 3107 146379540abc497d942ef89d33df9672 d7082e37cc22c2d99b2dba50f6cf8ea1060f85a9 cl-bert-20141106-git bert.asd -cl-bibtex http://beta.quicklisp.org/archive/cl-bibtex/2018-12-10/cl-bibtex-20181210-git.tgz 76724 83cf40c69b449a4b543538f67fdf69cd 05c1cf877743b2f32a2d8f87fc871858d9b403a5 cl-bibtex-20181210-git bibtex.asd -cl-bip39 http://beta.quicklisp.org/archive/cl-bip39/2018-07-11/cl-bip39-20180711-git.tgz 10742 a791287d7b55d8a813f3239016b321ea f24dffe751c80eaa3e0042545289be79c7447be2 cl-bip39-20180711-git cl-bip39.asd -cl-bloom http://beta.quicklisp.org/archive/cl-bloom/2018-02-28/cl-bloom-20180228-git.tgz 4302 89f0727b66223ccb6aeb294fc0cc011f ad6f0142aefcc1bfbeeec81e09627a2a74e78047 cl-bloom-20180228-git cl-bloom.asd -cl-bnf http://beta.quicklisp.org/archive/cl-bnf/2019-11-30/cl-bnf-20191130-git.tgz 5694 2a6d8add79f964ed0e4028dda0c3b3c0 8c26582251999166575d7d9d9fb379c8ae73f83b cl-bnf-20191130-git cl-bnf-examples.asd cl-bnf-tests.asd cl-bnf.asd -cl-bootstrap http://beta.quicklisp.org/archive/cl-bootstrap/2018-08-31/cl-bootstrap-20180831-git.tgz 161893 cee57823b000ebedbf0ca2a5bc745e8b 832338aec105f68f8982c4e6ecdc1209361ce3e8 cl-bootstrap-20180831-git cl-bootstrap-demo.asd cl-bootstrap-test.asd cl-bootstrap.asd -cl-bplustree http://beta.quicklisp.org/archive/cl-bplustree/2018-03-28/cl-bplustree-20180328-git.tgz 8921 e5a31bafa8e9e42a5da16d675b852697 84702c33e5625e787ea4df04d7d5c2cf82336bde cl-bplustree-20180328-git cl-bplustree.asd -cl-bson http://beta.quicklisp.org/archive/cl-bson/2017-04-03/cl-bson-20170403-git.tgz 35505 c9359beeeb67fde4566ca3fdcd2e7ba6 74baa529bd8c1038f4dc509baabba84f545f001f cl-bson-20170403-git cl-bson-test.asd cl-bson.asd -cl-buchberger http://beta.quicklisp.org/archive/cl-buchberger/2011-05-22/cl-buchberger-20110522-git.tgz 7989 8a993756267bd3eea16fdaaab023ad59 d0df1a56821d2187a97c578441b95980fbe92ec7 cl-buchberger-20110522-git cl-buchberger.asd -cl-bunny http://beta.quicklisp.org/archive/cl-bunny/2016-03-18/cl-bunny-0.4.5.tgz 44478 240ffda23fedfbb0b2cd1fcd51bb8a5d a02dfc2e897e1f9ffa2b6b3883bae1a3c7cc5f4e cl-bunny-0.4.5 cl-bunny.asd cl-bunny.examples.asd cl-bunny.test.asd -cl-ca http://beta.quicklisp.org/archive/cl-ca/2016-12-04/cl-ca-20161204-git.tgz 4056 e20a120a4bdea1da122f67d1c748c164 250c6a1fd47118fd4634c1ca7b67f6eec8822e29 cl-ca-20161204-git cl-ca.asd -cl-cache-tables http://beta.quicklisp.org/archive/cl-cache-tables/2017-10-19/cl-cache-tables-20171019-git.tgz 5219 24fcc0c7e5c4b56aa4d3c0ccf8013804 8467ba23db68b1b2136216eb37934664bbc56560 cl-cache-tables-20171019-git cl-cache-tables.asd -cl-cairo2 http://beta.quicklisp.org/archive/cl-cairo2/2016-05-31/cl-cairo2-20160531-git.tgz 219593 aa81d669f8c3feb77dd952f0e4d41719 34fc6c321105781ff8edce95e921dddf81f85a40 cl-cairo2-20160531-git a-cl-cairo2-loader.asd cl-cairo2-demos.asd cl-cairo2-gtk2.asd cl-cairo2-xlib.asd cl-cairo2.asd -cl-case-control http://beta.quicklisp.org/archive/cl-case-control/2014-11-06/cl-case-control-20141106-git.tgz 4262 9bd926eaf15cc7053ef7e6676491aa23 a2d273abfa6ff8f0680f0f9d6545064ba133908a cl-case-control-20141106-git cl-case-control.asd -cl-cffi-gtk http://beta.quicklisp.org/archive/cl-cffi-gtk/2019-07-10/cl-cffi-gtk-20190710-git.tgz 6290692 4ab4d1eabe6fd639f40cb1053ef002b9 788f1a286b96e4d0062e12e68d81e58c3dcb0a6c cl-cffi-gtk-20190710-git cairo/cl-cffi-gtk-cairo.asd demo/cairo-demo/cl-cffi-gtk-demo-cairo.asd demo/glib-demo/cl-cffi-gtk-demo-glib.asd demo/gobject-demo/cl-cffi-gtk-demo-gobject.asd demo/gtk-example/cl-cffi-gtk-example-gtk.asd demo/opengl-demo/cl-cffi-gtk-opengl-demo.asd gdk-pixbuf/cl-cffi-gtk-gdk-pixbuf.asd gdk/cl-cffi-gtk-gdk.asd gio/cl-cffi-gtk-gio.asd glib/cl-cffi-gtk-glib.asd gobject/cl-cffi-gtk-gobject.asd gtk/cl-cffi-gtk.asd pango/cl-cffi-gtk-pango.asd -cl-change-case http://beta.quicklisp.org/archive/cl-change-case/2019-10-07/cl-change-case-20191007-git.tgz 6031 385245df04b1f1514b9fd709a08c4082 5a754242c13cfc0b59832b63053c4fc1fdde0b3d cl-change-case-20191007-git cl-change-case-test.asd cl-change-case.asd -cl-charms http://beta.quicklisp.org/archive/cl-charms/2018-12-10/cl-charms-20181210-git.tgz 26980 19641e2e670b34fe8d8be493d48cb2b3 f00cd4c3c8afae0920c4c5e5181673550b6c1d90 cl-charms-20181210-git cl-charms-paint.asd cl-charms-timer.asd cl-charms.asd -cl-cheshire-cat http://beta.quicklisp.org/archive/cl-cheshire-cat/2012-11-25/cl-cheshire-cat-20121125-git.tgz 23482 729d03cde121deedf97f3669c262e82e d2797915bed6422d5516abeb9f3c4a33809c306b cl-cheshire-cat-20121125-git cl-cheshire-cat.asd -cl-clblas http://beta.quicklisp.org/archive/cl-clblas/2018-10-18/cl-clblas-20181018-git.tgz 8535 ae2ac2ceba89561bc472677ab373017f ecca33c74178a2f77c94fdb3f40a9fee5e87c399 cl-clblas-20181018-git cl-clblas-test.asd cl-clblas.asd -cl-cli http://beta.quicklisp.org/archive/cl-cli/2015-12-18/cl-cli-20151218-git.tgz 6467 820e5c7dde6800fcfa44b1fbc7a9d62b 95d3aaf9325b6317343844e8b40efdf7c302a47f cl-cli-20151218-git cl-cli.asd -cl-cli-parser http://beta.quicklisp.org/archive/cl-cli-parser/2015-06-08/cl-cli-parser-20150608-git.tgz 8093 38fc199ad50a98819a3cd0d82665fe68 a7e3a4d60a6069b08ecd5ebf477609c6927710c3 cl-cli-parser-20150608-git cli-parser.asd -cl-clon http://beta.quicklisp.org/archive/cl-clon/2018-02-28/clon-1.0b24.tgz 191003 7d74fc146a2de5be70a9cb2c5a94312e fa0a4d3ed8bf00ddbdb104b6764a272e21fd0e65 clon-1.0b24 core/net.didierverna.clon.core.asd net.didierverna.clon.asd setup/net.didierverna.clon.setup.asd termio/net.didierverna.clon.termio.asd -cl-closure-template http://beta.quicklisp.org/archive/cl-closure-template/2015-08-04/cl-closure-template-20150804-git.tgz 98945 d2b36fa36a3bbb532c7898c2ff6211f7 b58d01914b50c26a7a43ed1e0848562a212017b3 cl-closure-template-20150804-git closure-template.asd -cl-clsparse http://beta.quicklisp.org/archive/cl-clsparse/2019-08-13/cl-clsparse-20190813-git.tgz 5431 f52ee9a080bc55364c817ea7c032588d e9b211b3f6c39cca6e07516292673c76271b2349 cl-clsparse-20190813-git cl-clsparse.asd -cl-cognito http://beta.quicklisp.org/archive/cl-cognito/2018-12-10/cl-cognito-20181210-git.tgz 10532 6372b22b37cd2f092542cf4add7f336b a31ce281d683c6d15bd458f2dc366ea5ba641b86 cl-cognito-20181210-git cl-cognito.asd -cl-collider http://beta.quicklisp.org/archive/cl-collider/2019-12-27/cl-collider-20191227-git.tgz 54466 f20f5b92d3c9ff4ed7d3fdfabeda763a f30661c617108d845cd4d0144db0106a52019347 cl-collider-20191227-git cl-collider.asd osc/sc-osc.asd -cl-colors http://beta.quicklisp.org/archive/cl-colors/2018-03-28/cl-colors-20180328-git.tgz 14566 5e59ea59b32a0254df9610a5662ae2ec 08d7a2af682802fce159e47ff3511112f24e892a cl-colors-20180328-git cl-colors.asd -cl-colors2 http://beta.quicklisp.org/archive/cl-colors2/2018-10-18/cl-colors2-20181018-git.tgz 21403 ccf1cc214fbce1d11caba8124e844df7 d3a297fade1aa485fe17326c4f2e424558d0feba cl-colors2-20181018-git cl-colors2.asd -cl-conllu http://beta.quicklisp.org/archive/cl-conllu/2019-05-21/cl-conllu-20190521-git.tgz 41333 996654fc068fa6c548868e0455587d9f 2a807ef4d732e413d752212f0804b57c82c52e31 cl-conllu-20190521-git cl-conllu.asd -cl-conspack http://beta.quicklisp.org/archive/cl-conspack/2017-04-03/cl-conspack-20170403-git.tgz 46289 43b17d3d9bb969ffd1919f7c05453c14 6f2acf5bb1d4c2d18573fc5f6eec367325131924 cl-conspack-20170403-git cl-conspack-test.asd cl-conspack.asd -cl-cont http://beta.quicklisp.org/archive/cl-cont/2011-02-19/cl-cont-20110219-darcs.tgz 11715 204ad0178da3de604e92fab5ac1c20b6 f24ffb4d90a98f4ab82841279f29ac64615069de cl-cont-20110219-darcs cl-cont-test.asd cl-cont.asd -cl-containers http://beta.quicklisp.org/archive/cl-containers/2017-04-03/cl-containers-20170403-git.tgz 229279 17123cd2b018cd3eb048eceef78be3f8 3b0e0761995c807fa27cdc74ef97fecf1ba48339 cl-containers-20170403-git cl-containers-test.asd cl-containers.asd -cl-cookie http://beta.quicklisp.org/archive/cl-cookie/2019-10-07/cl-cookie-20191007-git.tgz 4880 37595a6705fdd77415b859aea90d30bc c1dad8b9e287398c5f909af268f1b3908dabc760 cl-cookie-20191007-git cl-cookie-test.asd cl-cookie.asd -cl-coroutine http://beta.quicklisp.org/archive/cl-coroutine/2016-09-29/cl-coroutine-20160929-git.tgz 3335 d89c78cb0a94768603c8f581227af23f 934dcbb769a9199affe633368462e104fbf2c03f cl-coroutine-20160929-git cl-coroutine-test.asd cl-coroutine.asd -cl-coveralls http://beta.quicklisp.org/archive/cl-coveralls/2019-10-07/cl-coveralls-20191007-git.tgz 6629 39f50fddc88f80f9129a17027cfeb6d5 3806f18146a0cbf543329d39508ae55e9607e8fc cl-coveralls-20191007-git cl-coveralls-test.asd cl-coveralls.asd -cl-cpus http://beta.quicklisp.org/archive/cl-cpus/2018-04-30/cl-cpus-20180430-git.tgz 2505 8144fd890f060d558d896c2b10538f02 1c38814243fe2a8f437189d7a7496cd51574f1bb cl-cpus-20180430-git cl-cpus.asd -cl-crc64 http://beta.quicklisp.org/archive/cl-crc64/2014-07-13/cl-crc64-20140713-git.tgz 3436 d97cf9231647235a938707e64a1766ad 3140afa99b2ee11f7cda85f9563b975c45cdb9d2 cl-crc64-20140713-git cl-crc64.asd -cl-creditcard http://beta.quicklisp.org/archive/cl-creditcard/2015-01-13/cl-creditcard-20150113-git.tgz 10834 35f506d0dcef15f26a46b6419c0f060b 0b816115dbedc264e2d3724088267220a8e43a5a cl-creditcard-20150113-git cl-authorize-net.asd cl-creditcard.asd -cl-cron http://beta.quicklisp.org/archive/cl-cron/2019-03-07/cl-cron-20190307-hg.tgz 15874 d5d1bace9780975f4f4144e0c0f4b0fc 35ccdd808c6e532928a100f25fc95bb5fcaf5b2a cl-cron-20190307-hg cl-cron.asd -cl-crypt http://beta.quicklisp.org/archive/cl-crypt/2012-05-20/cl-crypt-20120520-git.tgz 7279 0e6b5ba0cd7a565686e847197622698f f66ea06ec261e994f5ba7d71236c93a3a4edd113 cl-crypt-20120520-git crypt.asd -cl-css http://beta.quicklisp.org/archive/cl-css/2014-09-14/cl-css-20140914-git.tgz 4907 a91f5a5d6a751af31d5c4fd8170f6ece 0b25eb863296f4d83523535c606514502ad6aac5 cl-css-20140914-git cl-css.asd -cl-csv http://beta.quicklisp.org/archive/cl-csv/2018-08-31/cl-csv-20180831-git.tgz 25961 4bd0ef366dea9d48c4581ed73a208cf3 8d16eafebdbb7557ca46f0c3a9b7b8c61f06dcae cl-csv-20180831-git cl-csv-clsql.asd cl-csv-data-table.asd cl-csv.asd -cl-cuda http://beta.quicklisp.org/archive/cl-cuda/2019-10-08/cl-cuda-20191008-git.tgz 72953 bb1ed940f70994c6c078d25337ab343e 653bc8f9cdb6d04c1a1d1909ba278d1d327ace86 cl-cuda-20191008-git cl-cuda-examples.asd cl-cuda-interop-examples.asd cl-cuda-interop.asd cl-cuda-misc.asd cl-cuda.asd -cl-custom-hash-table http://beta.quicklisp.org/archive/cl-custom-hash-table/2017-11-30/cl-custom-hash-table-20171130-git.tgz 7684 c7f9c269174fb5b42717c55d3beed364 42bfbb4a958a3b3259e645d7ae2b434ec84d79a7 cl-custom-hash-table-20171130-git cl-custom-hash-table-test.asd cl-custom-hash-table.asd -cl-cut http://beta.quicklisp.org/archive/cl-cut/2018-01-31/cl-cut-20180131-git.tgz 5001 e020c977e8064ff8b5a6e00c43b2612e 6a7a89a4568e71e2d4b41cb711cd54c4a63ef928 cl-cut-20180131-git cl-cut.asd cl-cut.test.asd -cl-cxx http://beta.quicklisp.org/archive/cl-cxx/2019-05-21/cl-cxx-20190521-git.tgz 6123 2faa57c1c9a2b33b6b5a90828ad24b9f c1455566260bad2f68e58dfdca25b4cfbebbf2b4 cl-cxx-20190521-git cxx-test.asd cxx.asd -cl-darksky http://beta.quicklisp.org/archive/cl-darksky/2018-07-11/cl-darksky-20180711-git.tgz 2006 c62b43b0d00975df19b5c5e72433b462 4b55a096708a83a7fa703813c4ddb02178e45ab3 cl-darksky-20180711-git cl-darksky-test.asd cl-darksky.asd -cl-data-format-validation http://beta.quicklisp.org/archive/cl-data-format-validation/2014-07-13/cl-data-format-validation-20140713-git.tgz 37403 2d13446e593b3b0c46fb83ee9fc5da7f 0a085113a3c0e2c28735f4709b31ff46ee54b68b cl-data-format-validation-20140713-git data-format-validation.asd -cl-data-frame http://beta.quicklisp.org/archive/cl-data-frame/2017-11-30/cl-data-frame-20171130-git.tgz 8813 fdd3f478710440340ac70bffa48a1d73 6db4200be1705e935dc9c72a7e619cdaf47d1d8d cl-data-frame-20171130-git cl-data-frame.asd -cl-date-time-parser http://beta.quicklisp.org/archive/cl-date-time-parser/2014-07-13/cl-date-time-parser-20140713-git.tgz 10231 a5c384eafcdcf063499341b40c09129a 7633ae11684c9c8cd219f4cf615869bc2b5d2c42 cl-date-time-parser-20140713-git cl-date-time-parser.asd -cl-db3 http://beta.quicklisp.org/archive/cl-db3/2019-07-10/cl-db3-20190710-git.tgz 6063 efbee2cdb4ff1ce12dfd8d6fdea20f49 fca6a1dca15b58bf98bd856028e7ce029f985120 cl-db3-20190710-git db3.asd -cl-dbi http://beta.quicklisp.org/archive/cl-dbi/2019-10-07/cl-dbi-20191007-git.tgz 14683 bf524c4000468d12627fa419ae412abb 5f1c8914dca8ac2ef97a04c6068d988908422b1a cl-dbi-20191007-git cl-dbi.asd dbd-mysql.asd dbd-postgres.asd dbd-sqlite3.asd dbi-test.asd dbi.asd -cl-dbi-connection-pool http://beta.quicklisp.org/archive/cl-dbi-connection-pool/2019-01-07/cl-dbi-connection-pool-20190107-git.tgz 6113 a5724b7fc356695c5767580a86c6df9d d8cc6ce43e8b3fd42149fdbf4da5bd831944aa5c cl-dbi-connection-pool-20190107-git cl-dbi-connection-pool.asd dbi-cp-test.asd dbi-cp.asd -cl-dct http://beta.quicklisp.org/archive/cl-dct/2019-11-30/cl-dct-20191130-git.tgz 6823 6f4faa9be0f2ce2a6a959ea705fe8617 8eff1202d59f2f0e27b94d4587f9e2b142946272 cl-dct-20191130-git dct-test.asd dct.asd -cl-decimals http://beta.quicklisp.org/archive/cl-decimals/2019-07-10/cl-decimals-20190710-git.tgz 8044 978ca67fae1ab66015c551505734a149 14ba8ef7eae9319a141e0141f4d8d571b38d8dbb cl-decimals-20190710-git decimals.asd -cl-devil http://beta.quicklisp.org/archive/cl-devil/2015-03-02/cl-devil-20150302-git.tgz 7271 2386d79fa23a831b46dd3a851b635165 81f0c286536f30795267f35614562d2459c41cea cl-devil-20150302-git cl-devil.asd cl-ilu.asd cl-ilut.asd -cl-diceware http://beta.quicklisp.org/archive/cl-diceware/2015-09-23/cl-diceware-20150923-git.tgz 46217 1effc5add086f20640ecca3ea9fb6d44 26501cee6304c77b9db6320e1f2b3fbba88ede2b cl-diceware-20150923-git cl-diceware.asd -cl-difflib http://beta.quicklisp.org/archive/cl-difflib/2013-01-28/cl-difflib-20130128-git.tgz 11909 e8a3434843a368373b67d09983d2b809 2acef03b40d410454539b26882762b25f60da136 cl-difflib-20130128-git cl-difflib-tests.asd cl-difflib.asd -cl-digraph http://beta.quicklisp.org/archive/cl-digraph/2019-12-27/cl-digraph-20191227-hg.tgz 16154 1b66f04c2af3a2a7e6629f9d5f97c3f8 578cdb45125c0cfcf11d22ca52bfa736792bb8bc cl-digraph-20191227-hg cl-digraph.asd cl-digraph.dot.asd cl-digraph.test.asd -cl-diskspace http://beta.quicklisp.org/archive/cl-diskspace/2018-01-31/cl-diskspace-20180131-git.tgz 5005 e82009d42eb86994120bccb7ac5e85a7 f648ea789bba382408ad523e1117a48885ccf290 cl-diskspace-20180131-git cl-diskspace.asd -cl-disque http://beta.quicklisp.org/archive/cl-disque/2017-12-27/cl-disque-20171227-git.tgz 12120 422f594efe55882f080273d68d26c561 f0a7b26834d07a6b35c03c16ba8aeeae18df6160 cl-disque-20171227-git cl-disque-test.asd cl-disque.asd -cl-docutils http://beta.quicklisp.org/archive/cl-docutils/2013-01-28/cl-docutils-20130128-git.tgz 115606 e83e70398da47984339dd29632a78072 014884afae1335295230482b54b560ed7bc51db6 cl-docutils-20130128-git docutils.asd -cl-dot http://beta.quicklisp.org/archive/cl-dot/2018-01-31/cl-dot-20180131-git.tgz 186442 1a552bdc7365fd5e7d2f00a7e49c2202 c35f35701d4fbebe0fc06836ac412566494e28e8 cl-dot-20180131-git cl-dot.asd -cl-dotenv http://beta.quicklisp.org/archive/cl-dotenv/2018-10-18/cl-dotenv-20181018-git.tgz 5339 ea905b934f2a2dc8ee3bfc88fc35ac49 3fe52852f1350c31baa11f85094ad6b7c433ea42 cl-dotenv-20181018-git cl-dotenv-test.asd cl-dotenv.asd -cl-drm http://beta.quicklisp.org/archive/cl-drm/2016-12-04/cl-drm-20161204-git.tgz 3310 dc45def8e5c9df2d9622193b400aa968 5f5474b54ced85e2eaba592dac37c07eb12f702c cl-drm-20161204-git cl-drm.asd -cl-dropbox http://beta.quicklisp.org/archive/cl-dropbox/2015-06-08/cl-dropbox-20150608-git.tgz 3127 cb8e142a42e59c3ad3ebc51243f0e9fd 692318495dcbb349116b544b33482119a1620ff7 cl-dropbox-20150608-git cl-dropbox.asd -cl-dsl http://beta.quicklisp.org/archive/cl-dsl/2013-07-20/cl-dsl-20130720-git.tgz 14073 fce58e9d8682e3224120cc794922de84 a93b21d4833d1d92609d2399028cbba3e908cbbf cl-dsl-20130720-git cl-dsl.asd -cl-durian http://beta.quicklisp.org/archive/cl-durian/2015-06-08/cl-durian-20150608-git.tgz 4819 9da8dd551e1ee63907a79bea0b1565d3 a0ca0ed4bf0257b86270d66bda9a963d0d30529b cl-durian-20150608-git cl-durian.asd -cl-ecma-48 http://beta.quicklisp.org/archive/cl-ecma-48/2019-10-08/cl-ecma-48-20191008-http.tgz 22772 96f3b42f0e84f9743c5894e6b61e1e61 1d35c8d4bf7dfebe48f449b3a47116e2b7a1402b cl-ecma-48-20191008-http cl-ecma-48.asd -cl-editdistance http://beta.quicklisp.org/archive/cl-editdistance/2019-11-30/cl-editdistance-20191130-git.tgz 11143 a3daec92c5fb9595cec446bfa494ddfc d2c99d886ba1b4febe00a07cd7fa247ea44014c3 cl-editdistance-20191130-git edit-distance-test.asd edit-distance.asd -cl-egl http://beta.quicklisp.org/archive/cl-egl/2019-05-21/cl-egl-20190521-git.tgz 3064 022f1ac3d01a265e700d0aa99ff47d71 03446e74bcaa71e61d1f0e9352c9df99ad3ad403 cl-egl-20190521-git cl-egl.asd -cl-elastic http://beta.quicklisp.org/archive/cl-elastic/2019-11-30/cl-elastic-20191130-git.tgz 5445 f41cde9363a8de98bc677f978a4a76d8 59dcbf6275515d52e7ba4f48bfbdc80fb87eaece cl-elastic-20191130-git cl-elastic-test.asd cl-elastic.asd -cl-emacs-if http://beta.quicklisp.org/archive/cl-emacs-if/2012-03-05/cl-emacs-if-20120305-git.tgz 5080 79a7e7ed0dce7b6b937481da97bc5490 3328115dfa0afe358d2301ce9d0335fb323b7b3f cl-emacs-if-20120305-git cl-emacs-if.asd -cl-emb http://beta.quicklisp.org/archive/cl-emb/2019-05-21/cl-emb-20190521-git.tgz 14557 b27bbe8de2206ab7c461700b58d4d527 04a32481580be674abe707cdfd25f20ff710ac7a cl-emb-20190521-git cl-emb.asd -cl-emoji http://beta.quicklisp.org/archive/cl-emoji/2018-02-28/cl-emoji-20180228-git.tgz 130741 28944d5548ea7fb8a591c1f732edd538 fcaf8cb10f53a4155d3a96a9a3e41356c7fa33d1 cl-emoji-20180228-git cl-emoji-test.asd cl-emoji.asd -cl-enchant http://beta.quicklisp.org/archive/cl-enchant/2019-05-21/cl-enchant-20190521-git.tgz 8136 2a868c280fd5a74f9c298c384567e31b 724cc1533724de27d433c210bd63db8a65ecbdf4 cl-enchant-20190521-git enchant-autoload.asd enchant.asd -cl-enumeration http://beta.quicklisp.org/archive/cl-enumeration/2019-07-10/cl-enumeration-20190710-git.tgz 116101 d7f838b9f923cb925966a4cbc44453e4 8450c2282e83778407a297fb5510c5c32cd83468 cl-enumeration-20190710-git enumerations.asd -cl-env http://beta.quicklisp.org/archive/cl-env/2018-04-30/cl-env-20180430-git.tgz 2808 881867f2aee6a8f22acb2dc1db3b5a62 d79b84e8739451c189fa50a6df245db1d4dd0953 cl-env-20180430-git cl-env.asd -cl-environments http://beta.quicklisp.org/archive/cl-environments/2019-11-30/cl-environments-20191130-git.tgz 39644 b7b04131bb799a90c087eba6644f2e7c 47cbb62c93757d781167d60ad398a3d03346d789 cl-environments-20191130-git cl-environments.asd -cl-epmd http://beta.quicklisp.org/archive/cl-epmd/2014-02-11/cl-epmd-20140211-git.tgz 8497 535d47c3fdcbf90656549f48da838151 1e5e823a18ae86b707ebfae97acd4af7a31ef36e cl-epmd-20140211-git epmd-test.asd epmd.asd -cl-epoch http://beta.quicklisp.org/archive/cl-epoch/2018-12-10/cl-epoch-20181210-git.tgz 772 677d6391a0c4ae9b20e4115cb0681706 3266833985cfc3447642de88f2b808fd0e25d222 cl-epoch-20181210-git cl-epoch.asd -cl-erlang-term http://beta.quicklisp.org/archive/cl-erlang-term/2016-05-31/cl-erlang-term-20160531-git.tgz 19973 fb58d27f4aba01da6e4677ef8a1e4fff 65583551c5793e1c22f20414a65548043814608d cl-erlang-term-20160531-git erlang-term-optima.asd erlang-term-test.asd erlang-term.asd -cl-ev http://beta.quicklisp.org/archive/cl-ev/2015-09-23/cl-ev-20150923-git.tgz 6322 802c3966a9dbd25d22407825271e70fd d90c2e7c18e3710e25ecd2206430926dc4307891 cl-ev-20150923-git ev.asd -cl-events http://beta.quicklisp.org/archive/cl-events/2016-03-18/cl-events-20160318-git.tgz 7199 064df9efa3a6db5b1540d61a91671ca8 21f4cb9f76b3ffd12d7b6d5d17e0960cd8b57819 cl-events-20160318-git cl-events.asd cl-events.test.asd -cl-ewkb http://beta.quicklisp.org/archive/cl-ewkb/2011-06-19/cl-ewkb-20110619-git.tgz 9929 cbcc96a62750e5aee99f2261d4b2171c 262f1978c053c76a4fa288411f8fbd150d29fcbb cl-ewkb-20110619-git cl-ewkb.asd -cl-factoring http://beta.quicklisp.org/archive/cl-factoring/2018-04-30/cl-factoring-20180430-git.tgz 22615 d394be277a6a2639cf86f4547b31e959 773a33d4c38725d5eb0282dc64e2c880c48c38a5 cl-factoring-20180430-git cl-factoring-test.asd cl-factoring.asd -cl-fad http://beta.quicklisp.org/archive/cl-fad/2019-08-13/cl-fad-20190813-git.tgz 24659 7d0405b44fefccb8a807527249ee2700 06a84a76e539e6168fa868abd403ab036892857d cl-fad-20190813-git cl-fad.asd -cl-fam http://beta.quicklisp.org/archive/cl-fam/2012-11-25/cl-fam-20121125-git.tgz 8597 4844d1092223363858a0963b56b09d10 9def84e89f75f5d2449f31db352fc1d6d51c156a cl-fam-20121125-git cl-fam.asd -cl-fastcgi http://beta.quicklisp.org/archive/cl-fastcgi/2019-12-27/cl-fastcgi-20191227-git.tgz 3728 ad0d29720060f795dfb4270d3deb554a 600c0a050de8293f0af7570abcf6c248bf5da8c5 cl-fastcgi-20191227-git cl-fastcgi.asd -cl-fbclient http://beta.quicklisp.org/archive/cl-fbclient/2014-01-13/cl-fbclient-20140113-git.tgz 9685 48d0afd4a519cac7c0b219063d51f6d9 09f3e78c416b6524ebe3c2d75e279eeda08b2277 cl-fbclient-20140113-git cl-fbclient.asd -cl-feedparser http://beta.quicklisp.org/archive/cl-feedparser/2019-07-10/cl-feedparser-20190710-git.tgz 1144159 fbb3d704161400b6fa1d59a067a21e01 ccece16e6ca4b553ce6425e08a33c2ed5c511a1d cl-feedparser-20190710-git cl-feedparser.asd test/cl-feedparser-tests.asd -cl-fixtures http://beta.quicklisp.org/archive/cl-fixtures/2018-04-30/cl-fixtures-20180430-git.tgz 13986 5c3e871d243c4de04b35953c252d05c4 6a159febf5270b88ef432027547a9aa2ce0b8f5c cl-fixtures-20180430-git cl-fixtures-test.asd cl-fixtures.asd -cl-flac http://beta.quicklisp.org/archive/cl-flac/2019-07-10/cl-flac-20190710-git.tgz 290402 a987ae59d6785b72735a7a102cbc9907 399983a24191cc0bc3e9657d3b4ba3bb0c9d6142 cl-flac-20190710-git cl-flac.asd -cl-flat-tree http://beta.quicklisp.org/archive/cl-flat-tree/2019-08-13/cl-flat-tree-20190813-git.tgz 5132 8705ad941f264bdedb08e4a1ad6afcfb 3f0fb91a38e4246e34d9a76d4c1dddb4515063b5 cl-flat-tree-20190813-git flat-tree.asd -cl-flow http://beta.quicklisp.org/archive/cl-flow/2018-08-31/cl-flow-stable-778a219a-git.tgz 5227 821e95bb7e4a43c42e7c581faf4bb7df f4c311f389d822e5b87d20cab264111eae5c056a cl-flow-stable-778a219a-git cl-flow.asd -cl-flowd http://beta.quicklisp.org/archive/cl-flowd/2014-07-13/cl-flowd-20140713-git.tgz 5753 c8ec0147510ab231d0e3377beaf5f897 b5382880a7203fb47f6d55b6b587a5645eb2322e cl-flowd-20140713-git cl-flowd.asd -cl-fluent-logger http://beta.quicklisp.org/archive/cl-fluent-logger/2019-02-02/cl-fluent-logger-20190202-git.tgz 4829 db5f23548d9f4c7c93375456cc12ba6a 4c8b44df1de4e803896bdfe72c55b3f5995738de cl-fluent-logger-20190202-git cl-fluent-logger.asd -cl-fluidinfo http://beta.quicklisp.org/archive/cl-fluidinfo/2013-03-12/cl-fluidinfo-20130312-git.tgz 8963 31baff1a738ad8dcf30b4f466d71366c 0c8485eba076578d271d6190ba75dd853ad5867c cl-fluidinfo-20130312-git cl-fluiddb-test.asd cl-fluiddb.asd cl-fluidinfo.asd -cl-fond http://beta.quicklisp.org/archive/cl-fond/2019-11-30/cl-fond-20191130-git.tgz 328112 15c6094682447b9bc49bfa253a064360 df52e6e1d9515e749da9cca6ee1e54d378153ea3 cl-fond-20191130-git cl-fond.asd -cl-forms http://beta.quicklisp.org/archive/cl-forms/2019-07-10/cl-forms-20190710-git.tgz 841887 6945c01e82db6c989baf74c9b93ed8ac 424fb61fa9483e85d15b977c79c5ea6a33dd0166 cl-forms-20190710-git cl-forms.asd cl-forms.demo.asd cl-forms.djula.asd cl-forms.test.asd cl-forms.who.asd -cl-freeimage http://beta.quicklisp.org/archive/cl-freeimage/2017-04-03/cl-freeimage-20170403-git.tgz 10611 92c8fff7a488a73ff5793f43145cb641 ca94e56e0a67d03b054160c6a78c705b0172f14d cl-freeimage-20170403-git cl-freeimage.asd -cl-freetype2 http://beta.quicklisp.org/archive/cl-freetype2/2019-10-07/cl-freetype2-20191007-git.tgz 43368 0d4482c5201de0ff9b959deac59d1d25 ca147fa768c83e540583b780d38067bec7314d48 cl-freetype2-20191007-git cl-freetype2-tests.asd cl-freetype2.asd -cl-fsnotify http://beta.quicklisp.org/archive/cl-fsnotify/2015-03-02/cl-fsnotify-20150302-git.tgz 5979 54fe23d75d2baa6f404aef9c4da39449 6a6f82a1fc13f6286e1e9ae071e4a827830192d4 cl-fsnotify-20150302-git cl-fsnotify.asd -cl-ftp http://beta.quicklisp.org/archive/cl-ftp/2015-06-08/cl-ftp-20150608-http.tgz 9367 0743157a9fe2eea7c4a3a79874df1d55 e2ffb352da8b73a6895499ab6a1c1004e8bc5198 cl-ftp-20150608-http cl-ftp.asd ftp.asd -cl-fuse http://beta.quicklisp.org/archive/cl-fuse/2019-12-27/cl-fuse-20191227-git.tgz 23534 3c6f85db7797a2890d8303d11595100d 632def3847f0cff4ed2cc39ccbdeabb69e39802d cl-fuse-20191227-git cl-fuse.asd -cl-fuse-meta-fs http://beta.quicklisp.org/archive/cl-fuse-meta-fs/2019-07-10/cl-fuse-meta-fs-20190710-git.tgz 16844 461f7023274fb273e6c759e881bdd636 ab7279115b939e7a1d701d8d74538109313db2dc cl-fuse-meta-fs-20190710-git cl-fuse-meta-fs.asd -cl-fuzz http://beta.quicklisp.org/archive/cl-fuzz/2018-10-18/cl-fuzz-20181018-git.tgz 4141 22e715b370ea886bbff1e09db20c4e32 bd6ff387648fcf0c47266b2be40c7214b6e84bb3 cl-fuzz-20181018-git cl-fuzz.asd -cl-gambol http://beta.quicklisp.org/archive/cl-gambol/2016-03-18/cl-gambol-20160318-git.tgz 14886 887b54fee9fa3d77865a3eb3caaeac3e 5e9f5015bb42df0d9c70be356ce15dbec537c295 cl-gambol-20160318-git gambol.asd -cl-gamepad http://beta.quicklisp.org/archive/cl-gamepad/2019-07-10/cl-gamepad-20190710-git.tgz 107573 28a21a3aff9d9ad530fe9b69257cd72a 501a2372777fc5a55a723b1316c964e09a5494c5 cl-gamepad-20190710-git cl-gamepad-visualizer.asd cl-gamepad.asd -cl-gap-buffer http://beta.quicklisp.org/archive/cl-gap-buffer/2019-03-07/cl-gap-buffer-20190307-hg.tgz 4587 48de07c260d666659464734743de3646 05aa46f3548f072197a6e75c075b1b8ae60d15f7 cl-gap-buffer-20190307-hg cl-gap-buffer.asd -cl-gbm http://beta.quicklisp.org/archive/cl-gbm/2018-04-30/cl-gbm-20180430-git.tgz 2187 d5f7e5c5d37248986d4a882b44ac43a9 b504515681fb74f54f2e0c3dd4e05226a72ae03c cl-gbm-20180430-git cl-gbm.asd -cl-gd http://beta.quicklisp.org/archive/cl-gd/2017-11-30/cl-gd-20171130-git.tgz 203897 eef761d6507da1576b60da09f49d1dbb f8918ce5cc783b2474d73fc19a600644ae5b0f5b cl-gd-20171130-git cl-gd-test.asd cl-gd.asd -cl-gdata http://beta.quicklisp.org/archive/cl-gdata/2017-11-30/cl-gdata-20171130-git.tgz 31765 94763ae151858d354d5e9d8af3bdc538 cbcb9f87b27846e757bf70cf5cea38394ec414d4 cl-gdata-20171130-git cl-gdata.asd -cl-gearman http://beta.quicklisp.org/archive/cl-gearman/2015-09-23/cl-gearman-20150923-git.tgz 7680 6d7496a301f9cbb2d69e16bea12e2760 b39af5a987148d2492c7f85d0b58ae67b97b6f61 cl-gearman-20150923-git cl-gearman-test.asd cl-gearman.asd -cl-gendoc http://beta.quicklisp.org/archive/cl-gendoc/2018-08-31/cl-gendoc-20180831-git.tgz 6187 f74903585bca304a72b9739261c5c980 c0b1fec403200e417008b960c5ddbb6bb6bc9f53 cl-gendoc-20180831-git cl-gendoc.asd -cl-gene-searcher http://beta.quicklisp.org/archive/cl-gene-searcher/2011-10-01/cl-gene-searcher-20111001-git.tgz 3309 1350073f7965574a146421e59533bb00 35abc2a2a5b5091f0bb821269bfc6980260ed1fa cl-gene-searcher-20111001-git cl-gene-searcher.asd -cl-general-accumulator http://beta.quicklisp.org/archive/cl-general-accumulator/2019-05-21/cl-general-accumulator-20190521-git.tgz 5408 a60a9c5cff36fd49591f3f4cfd8c1cfd f68acdcdf203c36c6ed525bffd8884a59d3a931f cl-general-accumulator-20190521-git general-accumulator.asd -cl-generator http://beta.quicklisp.org/archive/cl-generator/2019-03-07/cl-generator-20190307-git.tgz 4308 e5ea88e49ed25ffacc11cdab4c6d77f6 5f7b67551d6628ea14667d8a54e95368016e1adb cl-generator-20190307-git cl-generator-test.asd cl-generator.asd -cl-generic-arithmetic http://beta.quicklisp.org/archive/cl-generic-arithmetic/2019-03-07/cl-generic-arithmetic-20190307-hg.tgz 5684 66225b9a7b00a5c36c86e8ae35002dfc 918705d37a97aff0cd98b31066b1b799a166407f cl-generic-arithmetic-20190307-hg cl-generic-arithmetic.asd -cl-geocode http://beta.quicklisp.org/archive/cl-geocode/2019-08-13/cl-geocode-20190813-git.tgz 583489 9c5dea4fa9d4d25ecb5a12d58ca518d3 a6b99dd47185ed88a289271cc668ba1c6d5a9961 cl-geocode-20190813-git cl-geocode.asd -cl-geoip http://beta.quicklisp.org/archive/cl-geoip/2013-06-15/cl-geoip-20130615-git.tgz 1698 2d174e9d08cead4ae9a320273c332844 08916ca6c4253b06adce2a03210916935d88e797 cl-geoip-20130615-git cl-geoip.asd -cl-geometry http://beta.quicklisp.org/archive/cl-geometry/2016-05-31/cl-geometry-20160531-git.tgz 17003 c0aaccbb4e2df6c504e6c1cd15155353 940f33dadfdfc8be044a94b0166ad99b29893865 cl-geometry-20160531-git cl-geometry-tests.asd cl-geometry.asd -cl-geos http://beta.quicklisp.org/archive/cl-geos/2018-07-11/cl-geos-20180711-git.tgz 18007 087b13649ed86240dead36394b5fea89 a32b0710b2ab3febb1af0fccec6a9e294675abb3 cl-geos-20180711-git cl-geos.asd -cl-gimei http://beta.quicklisp.org/archive/cl-gimei/2018-03-28/cl-gimei-20180328-git.tgz 148851 14be1ab4a8a88f11d8ad44c14f66a57b e1115122633adac652992deb4777015ed62f9444 cl-gimei-20180328-git cl-gimei.asd -cl-gists http://beta.quicklisp.org/archive/cl-gists/2018-02-28/cl-gists-20180228-git.tgz 10807 adbd22dbdccd05776ad5589add0983b8 1d8c375299852e4a7de3e5495eaa066147cb445d cl-gists-20180228-git cl-gists-test.asd cl-gists.asd -cl-git http://beta.quicklisp.org/archive/cl-git/2015-07-09/cl-git-20150709-git.tgz 60507 cbe03f1b837c775729c0b66fa707577f c3e37ce1e8437f76664b6779bd35b40b9485a8b4 cl-git-20150709-git cl-git.asd -cl-github-v3 http://beta.quicklisp.org/archive/cl-github-v3/2019-12-27/cl-github-v3-20191227-git.tgz 2857 e116ddd20a76120573acfe6583c24cb3 353704ab1cf6849d9e4a12e9e0f4dfb9c99d2135 cl-github-v3-20191227-git cl-github-v3.asd -cl-glfw http://beta.quicklisp.org/archive/cl-glfw/2015-03-02/cl-glfw-20150302-git.tgz 461048 c939bd97538b254d445f4b0904bbb8fa 03b779d59b8807cc72bdc2a5d407a393f24fa7fd cl-glfw-20150302-git cl-glfw-ftgl.asd cl-glfw-glu.asd cl-glfw-opengl-core.asd cl-glfw-opengl-version_1_0.asd cl-glfw-opengl-version_1_1.asd cl-glfw-opengl-version_1_2.asd cl-glfw-opengl-version_1_3.asd cl-glfw-opengl-version_1_4.asd cl-glfw-opengl-version_1_5.asd cl-glfw-opengl-version_2_0.asd cl-glfw-opengl-version_2_1.asd cl-glfw-types.asd cl-glfw.asd lib/cl-glfw-opengl-3dfx_multisample.asd lib/cl-glfw-opengl-3dfx_tbuffer.asd lib/cl-glfw-opengl-3dfx_texture_compression_fxt1.asd lib/cl-glfw-opengl-amd_blend_minmax_factor.asd lib/cl-glfw-opengl-amd_depth_clamp_separate.asd lib/cl-glfw-opengl-amd_draw_buffers_blend.asd lib/cl-glfw-opengl-amd_multi_draw_indirect.asd lib/cl-glfw-opengl-amd_name_gen_delete.asd lib/cl-glfw-opengl-amd_performance_monitor.asd lib/cl-glfw-opengl-amd_sample_positions.asd lib/cl-glfw-opengl-amd_seamless_cubemap_per_texture.asd lib/cl-glfw-opengl-amd_vertex_shader_tesselator.asd lib/cl-glfw-opengl-apple_aux_depth_stencil.asd lib/cl-glfw-opengl-apple_client_storage.asd lib/cl-glfw-opengl-apple_element_array.asd lib/cl-glfw-opengl-apple_fence.asd lib/cl-glfw-opengl-apple_float_pixels.asd lib/cl-glfw-opengl-apple_flush_buffer_range.asd lib/cl-glfw-opengl-apple_object_purgeable.asd lib/cl-glfw-opengl-apple_rgb_422.asd lib/cl-glfw-opengl-apple_row_bytes.asd lib/cl-glfw-opengl-apple_specular_vector.asd lib/cl-glfw-opengl-apple_texture_range.asd lib/cl-glfw-opengl-apple_transform_hint.asd lib/cl-glfw-opengl-apple_vertex_array_object.asd lib/cl-glfw-opengl-apple_vertex_array_range.asd lib/cl-glfw-opengl-apple_vertex_program_evaluators.asd lib/cl-glfw-opengl-apple_ycbcr_422.asd lib/cl-glfw-opengl-arb_blend_func_extended.asd lib/cl-glfw-opengl-arb_color_buffer_float.asd lib/cl-glfw-opengl-arb_copy_buffer.asd lib/cl-glfw-opengl-arb_depth_buffer_float.asd lib/cl-glfw-opengl-arb_depth_clamp.asd lib/cl-glfw-opengl-arb_depth_texture.asd lib/cl-glfw-opengl-arb_draw_buffers.asd lib/cl-glfw-opengl-arb_draw_buffers_blend.asd lib/cl-glfw-opengl-arb_draw_elements_base_vertex.asd lib/cl-glfw-opengl-arb_draw_indirect.asd lib/cl-glfw-opengl-arb_draw_instanced.asd lib/cl-glfw-opengl-arb_es2_compatibility.asd lib/cl-glfw-opengl-arb_fragment_program.asd lib/cl-glfw-opengl-arb_fragment_shader.asd lib/cl-glfw-opengl-arb_framebuffer_object.asd lib/cl-glfw-opengl-arb_framebuffer_object_deprecated.asd lib/cl-glfw-opengl-arb_framebuffer_srgb.asd lib/cl-glfw-opengl-arb_geometry_shader4.asd lib/cl-glfw-opengl-arb_get_program_binary.asd lib/cl-glfw-opengl-arb_gpu_shader5.asd lib/cl-glfw-opengl-arb_gpu_shader_fp64.asd lib/cl-glfw-opengl-arb_half_float_pixel.asd lib/cl-glfw-opengl-arb_half_float_vertex.asd lib/cl-glfw-opengl-arb_imaging.asd lib/cl-glfw-opengl-arb_imaging_deprecated.asd lib/cl-glfw-opengl-arb_instanced_arrays.asd lib/cl-glfw-opengl-arb_map_buffer_range.asd lib/cl-glfw-opengl-arb_matrix_palette.asd lib/cl-glfw-opengl-arb_multisample.asd lib/cl-glfw-opengl-arb_multitexture.asd lib/cl-glfw-opengl-arb_occlusion_query.asd lib/cl-glfw-opengl-arb_occlusion_query2.asd lib/cl-glfw-opengl-arb_pixel_buffer_object.asd lib/cl-glfw-opengl-arb_point_parameters.asd lib/cl-glfw-opengl-arb_point_sprite.asd lib/cl-glfw-opengl-arb_provoking_vertex.asd lib/cl-glfw-opengl-arb_robustness.asd lib/cl-glfw-opengl-arb_sample_shading.asd lib/cl-glfw-opengl-arb_sampler_objects.asd lib/cl-glfw-opengl-arb_seamless_cube_map.asd lib/cl-glfw-opengl-arb_separate_shader_objects.asd lib/cl-glfw-opengl-arb_shader_objects.asd lib/cl-glfw-opengl-arb_shader_subroutine.asd lib/cl-glfw-opengl-arb_shading_language_100.asd lib/cl-glfw-opengl-arb_shading_language_include.asd lib/cl-glfw-opengl-arb_shadow.asd lib/cl-glfw-opengl-arb_shadow_ambient.asd lib/cl-glfw-opengl-arb_tessellation_shader.asd lib/cl-glfw-opengl-arb_texture_border_clamp.asd lib/cl-glfw-opengl-arb_texture_buffer_object.asd lib/cl-glfw-opengl-arb_texture_buffer_object_rgb32.asd lib/cl-glfw-opengl-arb_texture_compression.asd lib/cl-glfw-opengl-arb_texture_compression_bptc.asd lib/cl-glfw-opengl-arb_texture_compression_rgtc.asd lib/cl-glfw-opengl-arb_texture_cube_map.asd lib/cl-glfw-opengl-arb_texture_cube_map_array.asd lib/cl-glfw-opengl-arb_texture_env_combine.asd lib/cl-glfw-opengl-arb_texture_env_dot3.asd lib/cl-glfw-opengl-arb_texture_float.asd lib/cl-glfw-opengl-arb_texture_gather.asd lib/cl-glfw-opengl-arb_texture_mirrored_repeat.asd lib/cl-glfw-opengl-arb_texture_multisample.asd lib/cl-glfw-opengl-arb_texture_rectangle.asd lib/cl-glfw-opengl-arb_texture_rg.asd lib/cl-glfw-opengl-arb_texture_rgb10_a2ui.asd lib/cl-glfw-opengl-arb_texture_swizzle.asd lib/cl-glfw-opengl-arb_timer_query.asd lib/cl-glfw-opengl-arb_transform_feedback2.asd lib/cl-glfw-opengl-arb_transpose_matrix.asd lib/cl-glfw-opengl-arb_uniform_buffer_object.asd lib/cl-glfw-opengl-arb_vertex_array_bgra.asd lib/cl-glfw-opengl-arb_vertex_array_object.asd lib/cl-glfw-opengl-arb_vertex_attrib_64bit.asd lib/cl-glfw-opengl-arb_vertex_blend.asd lib/cl-glfw-opengl-arb_vertex_buffer_object.asd lib/cl-glfw-opengl-arb_vertex_program.asd lib/cl-glfw-opengl-arb_vertex_shader.asd lib/cl-glfw-opengl-arb_vertex_type_2_10_10_10_rev.asd lib/cl-glfw-opengl-arb_viewport_array.asd lib/cl-glfw-opengl-arb_window_pos.asd lib/cl-glfw-opengl-ati_draw_buffers.asd lib/cl-glfw-opengl-ati_element_array.asd lib/cl-glfw-opengl-ati_envmap_bumpmap.asd lib/cl-glfw-opengl-ati_fragment_shader.asd lib/cl-glfw-opengl-ati_map_object_buffer.asd lib/cl-glfw-opengl-ati_meminfo.asd lib/cl-glfw-opengl-ati_pixel_format_float.asd lib/cl-glfw-opengl-ati_pn_triangles.asd lib/cl-glfw-opengl-ati_separate_stencil.asd lib/cl-glfw-opengl-ati_text_fragment_shader.asd lib/cl-glfw-opengl-ati_texture_env_combine3.asd lib/cl-glfw-opengl-ati_texture_float.asd lib/cl-glfw-opengl-ati_texture_mirror_once.asd lib/cl-glfw-opengl-ati_vertex_array_object.asd lib/cl-glfw-opengl-ati_vertex_attrib_array_object.asd lib/cl-glfw-opengl-ati_vertex_streams.asd lib/cl-glfw-opengl-ext_422_pixels.asd lib/cl-glfw-opengl-ext_abgr.asd lib/cl-glfw-opengl-ext_bgra.asd lib/cl-glfw-opengl-ext_bindable_uniform.asd lib/cl-glfw-opengl-ext_blend_color.asd lib/cl-glfw-opengl-ext_blend_equation_separate.asd lib/cl-glfw-opengl-ext_blend_func_separate.asd lib/cl-glfw-opengl-ext_blend_minmax.asd lib/cl-glfw-opengl-ext_blend_subtract.asd lib/cl-glfw-opengl-ext_clip_volume_hint.asd lib/cl-glfw-opengl-ext_cmyka.asd lib/cl-glfw-opengl-ext_color_subtable.asd lib/cl-glfw-opengl-ext_compiled_vertex_array.asd lib/cl-glfw-opengl-ext_convolution.asd lib/cl-glfw-opengl-ext_coordinate_frame.asd lib/cl-glfw-opengl-ext_copy_texture.asd lib/cl-glfw-opengl-ext_cull_vertex.asd lib/cl-glfw-opengl-ext_depth_bounds_test.asd lib/cl-glfw-opengl-ext_direct_state_access.asd lib/cl-glfw-opengl-ext_draw_buffers2.asd lib/cl-glfw-opengl-ext_draw_instanced.asd lib/cl-glfw-opengl-ext_draw_range_elements.asd lib/cl-glfw-opengl-ext_fog_coord.asd lib/cl-glfw-opengl-ext_framebuffer_blit.asd lib/cl-glfw-opengl-ext_framebuffer_multisample.asd lib/cl-glfw-opengl-ext_framebuffer_object.asd lib/cl-glfw-opengl-ext_framebuffer_srgb.asd lib/cl-glfw-opengl-ext_geometry_shader4.asd lib/cl-glfw-opengl-ext_gpu_program_parameters.asd lib/cl-glfw-opengl-ext_gpu_shader4.asd lib/cl-glfw-opengl-ext_histogram.asd lib/cl-glfw-opengl-ext_index_array_formats.asd lib/cl-glfw-opengl-ext_index_func.asd lib/cl-glfw-opengl-ext_index_material.asd lib/cl-glfw-opengl-ext_light_texture.asd lib/cl-glfw-opengl-ext_multi_draw_arrays.asd lib/cl-glfw-opengl-ext_multisample.asd lib/cl-glfw-opengl-ext_packed_depth_stencil.asd lib/cl-glfw-opengl-ext_packed_float.asd lib/cl-glfw-opengl-ext_packed_pixels.asd lib/cl-glfw-opengl-ext_paletted_texture.asd lib/cl-glfw-opengl-ext_pixel_buffer_object.asd lib/cl-glfw-opengl-ext_pixel_transform.asd lib/cl-glfw-opengl-ext_point_parameters.asd lib/cl-glfw-opengl-ext_polygon_offset.asd lib/cl-glfw-opengl-ext_provoking_vertex.asd lib/cl-glfw-opengl-ext_secondary_color.asd lib/cl-glfw-opengl-ext_separate_shader_objects.asd lib/cl-glfw-opengl-ext_separate_specular_color.asd lib/cl-glfw-opengl-ext_shader_image_load_store.asd lib/cl-glfw-opengl-ext_stencil_clear_tag.asd lib/cl-glfw-opengl-ext_stencil_two_side.asd lib/cl-glfw-opengl-ext_stencil_wrap.asd lib/cl-glfw-opengl-ext_subtexture.asd lib/cl-glfw-opengl-ext_texture.asd lib/cl-glfw-opengl-ext_texture3d.asd lib/cl-glfw-opengl-ext_texture_array.asd lib/cl-glfw-opengl-ext_texture_buffer_object.asd lib/cl-glfw-opengl-ext_texture_compression_latc.asd lib/cl-glfw-opengl-ext_texture_compression_rgtc.asd lib/cl-glfw-opengl-ext_texture_compression_s3tc.asd lib/cl-glfw-opengl-ext_texture_cube_map.asd lib/cl-glfw-opengl-ext_texture_env_combine.asd lib/cl-glfw-opengl-ext_texture_env_dot3.asd lib/cl-glfw-opengl-ext_texture_filter_anisotropic.asd lib/cl-glfw-opengl-ext_texture_integer.asd lib/cl-glfw-opengl-ext_texture_lod_bias.asd lib/cl-glfw-opengl-ext_texture_mirror_clamp.asd lib/cl-glfw-opengl-ext_texture_object.asd lib/cl-glfw-opengl-ext_texture_perturb_normal.asd lib/cl-glfw-opengl-ext_texture_shared_exponent.asd lib/cl-glfw-opengl-ext_texture_snorm.asd lib/cl-glfw-opengl-ext_texture_srgb.asd lib/cl-glfw-opengl-ext_texture_srgb_decode.asd lib/cl-glfw-opengl-ext_texture_swizzle.asd lib/cl-glfw-opengl-ext_timer_query.asd lib/cl-glfw-opengl-ext_transform_feedback.asd lib/cl-glfw-opengl-ext_vertex_array.asd lib/cl-glfw-opengl-ext_vertex_array_bgra.asd lib/cl-glfw-opengl-ext_vertex_attrib_64bit.asd lib/cl-glfw-opengl-ext_vertex_shader.asd lib/cl-glfw-opengl-ext_vertex_weighting.asd lib/cl-glfw-opengl-gremedy_frame_terminator.asd lib/cl-glfw-opengl-gremedy_string_marker.asd lib/cl-glfw-opengl-hp_convolution_border_modes.asd lib/cl-glfw-opengl-hp_image_transform.asd lib/cl-glfw-opengl-hp_occlusion_test.asd lib/cl-glfw-opengl-hp_texture_lighting.asd lib/cl-glfw-opengl-ibm_cull_vertex.asd lib/cl-glfw-opengl-ibm_multimode_draw_arrays.asd lib/cl-glfw-opengl-ibm_rasterpos_clip.asd lib/cl-glfw-opengl-ibm_texture_mirrored_repeat.asd lib/cl-glfw-opengl-ibm_vertex_array_lists.asd lib/cl-glfw-opengl-ingr_blend_func_separate.asd lib/cl-glfw-opengl-ingr_color_clamp.asd lib/cl-glfw-opengl-ingr_interlace_read.asd lib/cl-glfw-opengl-intel_parallel_arrays.asd lib/cl-glfw-opengl-mesa_pack_invert.asd lib/cl-glfw-opengl-mesa_packed_depth_stencil.asd lib/cl-glfw-opengl-mesa_program_debug.asd lib/cl-glfw-opengl-mesa_resize_buffers.asd lib/cl-glfw-opengl-mesa_shader_debug.asd lib/cl-glfw-opengl-mesa_trace.asd lib/cl-glfw-opengl-mesa_window_pos.asd lib/cl-glfw-opengl-mesa_ycbcr_texture.asd lib/cl-glfw-opengl-mesax_texture_stack.asd lib/cl-glfw-opengl-nv_conditional_render.asd lib/cl-glfw-opengl-nv_copy_depth_to_color.asd lib/cl-glfw-opengl-nv_copy_image.asd lib/cl-glfw-opengl-nv_depth_buffer_float.asd lib/cl-glfw-opengl-nv_depth_clamp.asd lib/cl-glfw-opengl-nv_evaluators.asd lib/cl-glfw-opengl-nv_explicit_multisample.asd lib/cl-glfw-opengl-nv_fence.asd lib/cl-glfw-opengl-nv_float_buffer.asd lib/cl-glfw-opengl-nv_fog_distance.asd lib/cl-glfw-opengl-nv_fragment_program.asd lib/cl-glfw-opengl-nv_fragment_program2.asd lib/cl-glfw-opengl-nv_framebuffer_multisample_coverage.asd lib/cl-glfw-opengl-nv_geometry_program4.asd lib/cl-glfw-opengl-nv_gpu_program4.asd lib/cl-glfw-opengl-nv_gpu_program5.asd lib/cl-glfw-opengl-nv_gpu_shader5.asd lib/cl-glfw-opengl-nv_half_float.asd lib/cl-glfw-opengl-nv_light_max_exponent.asd lib/cl-glfw-opengl-nv_multisample_coverage.asd lib/cl-glfw-opengl-nv_multisample_filter_hint.asd lib/cl-glfw-opengl-nv_occlusion_query.asd lib/cl-glfw-opengl-nv_packed_depth_stencil.asd lib/cl-glfw-opengl-nv_parameter_buffer_object.asd lib/cl-glfw-opengl-nv_pixel_data_range.asd lib/cl-glfw-opengl-nv_point_sprite.asd lib/cl-glfw-opengl-nv_present_video.asd lib/cl-glfw-opengl-nv_primitive_restart.asd lib/cl-glfw-opengl-nv_register_combiners.asd lib/cl-glfw-opengl-nv_register_combiners2.asd lib/cl-glfw-opengl-nv_shader_buffer_load.asd lib/cl-glfw-opengl-nv_shader_buffer_store.asd lib/cl-glfw-opengl-nv_tessellation_program5.asd lib/cl-glfw-opengl-nv_texgen_emboss.asd lib/cl-glfw-opengl-nv_texgen_reflection.asd lib/cl-glfw-opengl-nv_texture_barrier.asd lib/cl-glfw-opengl-nv_texture_env_combine4.asd lib/cl-glfw-opengl-nv_texture_expand_normal.asd lib/cl-glfw-opengl-nv_texture_multisample.asd lib/cl-glfw-opengl-nv_texture_rectangle.asd lib/cl-glfw-opengl-nv_texture_shader.asd lib/cl-glfw-opengl-nv_texture_shader2.asd lib/cl-glfw-opengl-nv_texture_shader3.asd lib/cl-glfw-opengl-nv_transform_feedback.asd lib/cl-glfw-opengl-nv_transform_feedback2.asd lib/cl-glfw-opengl-nv_vertex_array_range.asd lib/cl-glfw-opengl-nv_vertex_array_range2.asd lib/cl-glfw-opengl-nv_vertex_attrib_integer_64bit.asd lib/cl-glfw-opengl-nv_vertex_buffer_unified_memory.asd lib/cl-glfw-opengl-nv_vertex_program.asd lib/cl-glfw-opengl-nv_vertex_program2_option.asd lib/cl-glfw-opengl-nv_vertex_program3.asd lib/cl-glfw-opengl-nv_vertex_program4.asd lib/cl-glfw-opengl-oes_read_format.asd lib/cl-glfw-opengl-oml_interlace.asd lib/cl-glfw-opengl-oml_resample.asd lib/cl-glfw-opengl-oml_subsample.asd lib/cl-glfw-opengl-pgi_misc_hints.asd lib/cl-glfw-opengl-pgi_vertex_hints.asd lib/cl-glfw-opengl-rend_screen_coordinates.asd lib/cl-glfw-opengl-s3_s3tc.asd lib/cl-glfw-opengl-sgi_color_table.asd lib/cl-glfw-opengl-sgi_depth_pass_instrument.asd lib/cl-glfw-opengl-sgis_detail_texture.asd lib/cl-glfw-opengl-sgis_fog_function.asd lib/cl-glfw-opengl-sgis_multisample.asd lib/cl-glfw-opengl-sgis_pixel_texture.asd lib/cl-glfw-opengl-sgis_point_parameters.asd lib/cl-glfw-opengl-sgis_sharpen_texture.asd lib/cl-glfw-opengl-sgis_texture4d.asd lib/cl-glfw-opengl-sgis_texture_color_mask.asd lib/cl-glfw-opengl-sgis_texture_filter4.asd lib/cl-glfw-opengl-sgis_texture_select.asd lib/cl-glfw-opengl-sgix_async.asd lib/cl-glfw-opengl-sgix_depth_texture.asd lib/cl-glfw-opengl-sgix_flush_raster.asd lib/cl-glfw-opengl-sgix_fog_scale.asd lib/cl-glfw-opengl-sgix_fragment_lighting.asd lib/cl-glfw-opengl-sgix_framezoom.asd lib/cl-glfw-opengl-sgix_igloo_interface.asd lib/cl-glfw-opengl-sgix_instruments.asd lib/cl-glfw-opengl-sgix_line_quality_hint.asd lib/cl-glfw-opengl-sgix_list_priority.asd lib/cl-glfw-opengl-sgix_pixel_texture.asd lib/cl-glfw-opengl-sgix_polynomial_ffd.asd lib/cl-glfw-opengl-sgix_reference_plane.asd lib/cl-glfw-opengl-sgix_resample.asd lib/cl-glfw-opengl-sgix_scalebias_hint.asd lib/cl-glfw-opengl-sgix_shadow.asd lib/cl-glfw-opengl-sgix_shadow_ambient.asd lib/cl-glfw-opengl-sgix_slim.asd lib/cl-glfw-opengl-sgix_sprite.asd lib/cl-glfw-opengl-sgix_tag_sample_buffer.asd lib/cl-glfw-opengl-sgix_texture_coordinate_clamp.asd lib/cl-glfw-opengl-sgix_texture_lod_bias.asd lib/cl-glfw-opengl-sgix_texture_multi_buffer.asd lib/cl-glfw-opengl-sgix_ycrcba.asd lib/cl-glfw-opengl-sun_convolution_border_modes.asd lib/cl-glfw-opengl-sun_global_alpha.asd lib/cl-glfw-opengl-sun_mesh_array.asd lib/cl-glfw-opengl-sun_slice_accum.asd lib/cl-glfw-opengl-sun_triangle_list.asd lib/cl-glfw-opengl-sun_vertex.asd lib/cl-glfw-opengl-sunx_constant_data.asd lib/cl-glfw-opengl-win_phong_shading.asd lib/cl-glfw-opengl-win_specular_fog.asd -cl-glfw3 http://beta.quicklisp.org/archive/cl-glfw3/2019-07-10/cl-glfw3-20190710-git.tgz 13946 461eab74ffca4736d99436c73c1c54ad 5dd78157e4f4dc51ba4b9e206aaa9c4bf90c8a9f cl-glfw3-20190710-git cl-glfw3-examples.asd cl-glfw3.asd -cl-gobject-introspection http://beta.quicklisp.org/archive/cl-gobject-introspection/2019-11-30/cl-gobject-introspection-20191130-git.tgz 43736 c590518bb6bfa148e3eb58fe999f92a6 9850965e0bfced4f7cb2f8a1ac0b29fb318043e8 cl-gobject-introspection-20191130-git cl-gobject-introspection.asd -cl-gopher http://beta.quicklisp.org/archive/cl-gopher/2018-07-11/cl-gopher-20180711-git.tgz 10415 44843a10189c3f1b5ac6707512d1ab00 ba36371f358918f0724384537577da53ad71d657 cl-gopher-20180711-git cl-gopher.asd -cl-gpio http://beta.quicklisp.org/archive/cl-gpio/2019-07-10/cl-gpio-20190710-git.tgz 9091 1b490421fce75d573674f59e131a77c2 c69382364c82981b1eda62b5a7b8891e10824237 cl-gpio-20190710-git cl-gpio.asd -cl-grace http://beta.quicklisp.org/archive/cl-grace/2019-03-07/cl-grace-20190307-hg.tgz 13889 b703be6d2cbc1e7673cc5365ef213d08 839ba4127931baa62e6093d9ac15927fad413757 cl-grace-20190307-hg cl-grace.asd -cl-graph http://beta.quicklisp.org/archive/cl-graph/2017-12-27/cl-graph-20171227-git.tgz 60626 b133594d59ade148c07ad6fdec4cbdf6 2163417e2d2d61b2ad9d7c4eac1298d33573cdeb cl-graph-20171227-git cl-graph+hu.dwim.graphviz.asd cl-graph.asd -cl-gravatar http://beta.quicklisp.org/archive/cl-gravatar/2011-03-20/cl-gravatar-20110320-git.tgz 2127 6d4e5c83f238a7c301a572ddc926ef9b ae2e3b442465a3395c5f7d0948346bcd9562664e cl-gravatar-20110320-git gravatar.asd -cl-graylog http://beta.quicklisp.org/archive/cl-graylog/2018-04-30/cl-graylog-20180430-git.tgz 3582 4a821f6c2a6496f3fa7fefb4052186d5 5aa806c058074da350fd0208d5049bf1d4b1e4b9 cl-graylog-20180430-git graylog-log5.asd graylog.asd -cl-grnm http://beta.quicklisp.org/archive/cl-grnm/2018-01-31/cl-grnm-20180131-git.tgz 9511 9442e2489cf6894f4e61f9ec610d5c04 0609e0ac48299f120f71c2b86b7fec1f14897a08 cl-grnm-20180131-git cl-grnm.asd -cl-groupby http://beta.quicklisp.org/archive/cl-groupby/2017-08-30/cl-groupby-20170830-git.tgz 4240 5eab5f4784f0a154087daa7aa0caa930 9d7699457042096e05968c011013ad27b9271613 cl-groupby-20170830-git groupby.asd -cl-growl http://beta.quicklisp.org/archive/cl-growl/2016-12-08/cl-growl-20161208-git.tgz 9956 2a99024043323daf84837ae36fb89b2c 6dd1dfb8cec367fe2602a0b2b1bbaff83130f86c cl-growl-20161208-git cl-growl.asd -cl-gss http://beta.quicklisp.org/archive/cl-gss/2018-02-28/cl-gss-20180228-git.tgz 11188 62e9ab1eb233059a0b7f2276a95814d0 23537f4151f9472047e0725bd9e1f2899e766088 cl-gss-20180228-git cl-gss.asd -cl-gtk2 http://beta.quicklisp.org/archive/cl-gtk2/2012-09-09/cl-gtk2-20120909-git.tgz 377784 c61a7112e72154bf151b55d7ad6d93aa a5dc2aafc070b34b1ab09fdcd59dfed9ddd7b9c0 cl-gtk2-20120909-git cairo/cl-gtk2-cairo.asd gdk/cl-gtk2-gdk.asd glib/cl-gtk2-glib.asd gtk/cl-gtk2-gtk.asd pango/cl-gtk2-pango.asd -cl-hamcrest http://beta.quicklisp.org/archive/cl-hamcrest/2019-10-07/cl-hamcrest-20191007-git.tgz 26134 16b76ac7551db1a1567f511e3658890e f422c740a9c76af725d4235aceda909dc5cf675b cl-hamcrest-20191007-git hamcrest.asd -cl-haml http://beta.quicklisp.org/archive/cl-haml/2018-02-28/cl-haml-20180228-git.tgz 17830 0cc73c605a2f182eec47b645ace67498 474bdbb68dfaea7ffefd3396a6b1c14c63ecdfcb cl-haml-20180228-git cl-haml.asd -cl-hamt http://beta.quicklisp.org/archive/cl-hamt/2017-01-24/cl-hamt-20170124-git.tgz 12778 9b2e57f635917514c9a1f442023754ce 8f8ecbfb85c6c3f81b9f7490fc1ab867a18b8555 cl-hamt-20170124-git cl-hamt-examples.asd cl-hamt-test.asd cl-hamt.asd -cl-hash-table-destructuring http://beta.quicklisp.org/archive/cl-hash-table-destructuring/2016-05-31/cl-hash-table-destructuring-20160531-git.tgz 2604 05fb57c755f09ec4f2f5933fdaaedd4c 40d1d6441dd49fb7c51896d5f518d1addf4d2b7c cl-hash-table-destructuring-20160531-git cl-hash-table-destructuring.asd -cl-hash-util http://beta.quicklisp.org/archive/cl-hash-util/2019-01-07/cl-hash-util-20190107-git.tgz 7291 ff5044132c9684cf49f8b841096c67a2 c39b42dde00c70c608089c1c58c958bf46d152e9 cl-hash-util-20190107-git cl-hash-util-test.asd cl-hash-util.asd -cl-heap http://beta.quicklisp.org/archive/cl-heap/2013-03-12/cl-heap-0.1.6.tgz 26979 a12d71f7bbe22d6acdcc7cf36fb907b0 defa03668605e5a14a0431715adf2febf0aaa65a cl-heap-0.1.6 cl-heap-tests.asd cl-heap.asd -cl-heredoc http://beta.quicklisp.org/archive/cl-heredoc/2010-10-06/cl-heredoc-20101006-git.tgz 17070 122bfa8d85735a7ab83d26d827d83bf5 968e336ddb0fa28cbd963cea118e499a9b651c2a cl-heredoc-20101006-git cl-heredoc-test.asd cl-heredoc.asd -cl-html-diff http://beta.quicklisp.org/archive/cl-html-diff/2013-01-28/cl-html-diff-20130128-git.tgz 4134 70f93e60e968dad9a44ede60856dc343 62480247479faf7bad6c1bbd4f4135ac2485694e cl-html-diff-20130128-git cl-html-diff.asd -cl-html-parse http://beta.quicklisp.org/archive/cl-html-parse/2016-10-31/cl-html-parse-20161031-git.tgz 23507 7fe933c461eaf2dd442da189d6827a72 8dfd0cb5cebd248d33791d558e527c83c50bccbe cl-html-parse-20161031-git cl-html-parse.asd -cl-html5-parser http://beta.quicklisp.org/archive/cl-html5-parser/2019-05-21/cl-html5-parser-20190521-git.tgz 192746 149e5609d0a96c867fac6c22693c5e30 4b9882d952d5cf90ce0c874e0b134a04db64d0a4 cl-html5-parser-20190521-git cl-html5-parser.asd cxml/cl-html5-parser-cxml.asd tests/cl-html5-parser-tests.asd -cl-htmlprag http://beta.quicklisp.org/archive/cl-htmlprag/2016-06-28/cl-htmlprag-20160628-git.tgz 41128 8232a485fcb90e422bca541c4e81c263 3a1eb22bd66998acf5eb018237f4a85e0935d6c8 cl-htmlprag-20160628-git cl-htmlprag.asd -cl-httpsqs http://beta.quicklisp.org/archive/cl-httpsqs/2018-02-28/cl-httpsqs-20180228-git.tgz 2303 4ed58c978ada913cbff3fffa002f15eb 446c6bd9937ed987e9ed7bd0023b44512cb462c8 cl-httpsqs-20180228-git cl-httpsqs.asd -cl-hue http://beta.quicklisp.org/archive/cl-hue/2015-01-13/cl-hue-20150113-git.tgz 2734 c5703adb29241896c35f365be6470811 51c697d52abb18f0a370c50c7d9e83cf8d84c43a cl-hue-20150113-git cl-hue.asd -cl-i18n http://beta.quicklisp.org/archive/cl-i18n/2019-11-30/cl-i18n-20191130-git.tgz 50429 7e5d72d378b6585e8a516bb0361fcca7 a18e556f224065d061d239312633817dead01e55 cl-i18n-20191130-git cl-i18n.asd -cl-iconv http://beta.quicklisp.org/archive/cl-iconv/2017-12-27/cl-iconv-20171227-git.tgz 4909 3b6bccf9f50224194d2d0910cd563a6a 3509872d765d9d3a7557cecaa8fadd804f46fc4c cl-iconv-20171227-git iconv.asd -cl-inflector http://beta.quicklisp.org/archive/cl-inflector/2015-01-13/cl-inflector-20150113-git.tgz 6368 8563dd864200dc23b64648581ccec94f 7ef99cde744b4c4645bac4ea440fc1f2a709fdee cl-inflector-20150113-git cl-inflector.asd -cl-influxdb http://beta.quicklisp.org/archive/cl-influxdb/2018-01-31/cl-influxdb-20180131-git.tgz 15600 a34f8d1f70690f6c19465f9bd65f491c 8eb53449dbba61449beec84d34dcc989b06dd5a3 cl-influxdb-20180131-git cl-influxdb.asd -cl-inotify http://beta.quicklisp.org/archive/cl-inotify/2019-07-10/cl-inotify-20190710-git.tgz 11673 ab48770091489a0f6e177bdfb3794570 44417b941f8a79fd8dac1983cc27f8c8ca33637e cl-inotify-20190710-git cl-inotify-tests.asd cl-inotify.asd -cl-intbytes http://beta.quicklisp.org/archive/cl-intbytes/2015-09-23/cl-intbytes-20150923-git.tgz 3789 690cdfa2b0bc4829eeb1f8606291f0f5 f2a1bf6b3052fbd84755e3589d3370511f86b05c cl-intbytes-20150923-git cl-intbytes-test.asd cl-intbytes.asd -cl-interpol http://beta.quicklisp.org/archive/cl-interpol/2018-07-11/cl-interpol-20180711-git.tgz 43436 b2d6893ef703c5b6e5736fa33ba0794e a82431c7ecb6a7c73f2ba9d4d18e23f65d0e3d0b cl-interpol-20180711-git cl-interpol.asd -cl-ipfs-api2 http://beta.quicklisp.org/archive/cl-ipfs-api2/2019-08-13/cl-ipfs-api2-20190813-git.tgz 24730 90d1fdab8a26af11a2b561ce2e7c4177 b63e9d46ae949100396d31c989bf26bcba0fe805 cl-ipfs-api2-20190813-git cl-ipfs-api2.asd -cl-irc http://beta.quicklisp.org/archive/cl-irc/2015-09-23/cl-irc-0.9.2.tgz 921763 73e8ba73d8e4222cec427704c1a6aabd 8f0bf062ea520bfb6e4b0a0395c85c4250425cfb cl-irc-0.9.2 cl-irc.asd test/cl-irc-test.asd -cl-irregsexp http://beta.quicklisp.org/archive/cl-irregsexp/2016-08-25/cl-irregsexp-20160825-git.tgz 21596 717edf273168ca0ca638dcb8721ce4ac 40dd190eaf28eea03b2208469408590b390d07c2 cl-irregsexp-20160825-git cl-irregsexp.asd -cl-isaac http://beta.quicklisp.org/archive/cl-isaac/2015-08-04/cl-isaac-20150804-git.tgz 8731 03beb7c110fa638fa32c4afcb5a9d604 b879c74b9584ad644172e6cc616d159682e71029 cl-isaac-20150804-git cl-isaac.asd -cl-iterative http://beta.quicklisp.org/archive/cl-iterative/2016-03-18/cl-iterative-20160318-git.tgz 8987 7fc7c0e9e4451fc95b57db27e2e42f2c 85c5a21c03dc6e5c88bc3c9a2c1ece9731732a91 cl-iterative-20160318-git cl-iterative-tests.asd cl-iterative.asd -cl-itertools http://beta.quicklisp.org/archive/cl-itertools/2016-04-21/cl-itertools-20160421-git.tgz 6199 03577f82ecdbba2ed0977237a06c0017 97812f1df7ea506f413fee176e6897c85962a1bd cl-itertools-20160421-git cl-itertools.asd -cl-ixf http://beta.quicklisp.org/archive/cl-ixf/2018-02-28/cl-ixf-20180228-git.tgz 8677 23732795aa317d24c1a40cc321a0e394 7b99b33ef1a21049bc8eac1245f1d87fb38f98ea cl-ixf-20180228-git ixf.asd -cl-jpeg http://beta.quicklisp.org/archive/cl-jpeg/2017-06-30/cl-jpeg-20170630-git.tgz 25088 b6eb4ca5d893f428b5bbe46cd49f76ad 1e8f15736d3c038aae73b8283c5d13b50e23bdd0 cl-jpeg-20170630-git cl-jpeg.asd -cl-jpl-util http://beta.quicklisp.org/archive/cl-jpl-util/2015-10-31/cl-jpl-util-20151031-git.tgz 36026 e294bedace729724873e7633b8265a00 0d6d0d8d68c636de34c02e5b0f15b34758e50ac5 cl-jpl-util-20151031-git jpl-util.asd -cl-json http://beta.quicklisp.org/archive/cl-json/2014-12-17/cl-json-20141217-git.tgz 61399 9d873fa462b93c76d90642d8e3fb4881 a506ef6a9ce15a1b58b4d7fbeb9fd774e24008e2 cl-json-20141217-git cl-json.asd -cl-json-helper http://beta.quicklisp.org/archive/cl-json-helper/2018-12-10/cl-json-helper-20181210-git.tgz 2779 a681ca1edff40c68c65e2a6f4457ac01 38cfe3a53def3c09c9b013bc09a9b0c18577f24a cl-json-helper-20181210-git cl-json-helper.asd -cl-json-pointer http://beta.quicklisp.org/archive/cl-json-pointer/2019-05-21/cl-json-pointer-20190521-git.tgz 19712 927b20d2d60149978be02451a1245273 b582db7176bfda8f66bdd42007e7e21451defbaf cl-json-pointer-20190521-git cl-json-pointer.asd -cl-json-template http://beta.quicklisp.org/archive/cl-json-template/2017-06-30/cl-json-template-20170630-git.tgz 12106 cff23f61f7f349c6e9059e4083d95826 6b7435913677413c99e291886a0fab904128c2f9 cl-json-template-20170630-git json-template.asd -cl-jsx http://beta.quicklisp.org/archive/cl-jsx/2016-02-08/cl-jsx-20160208-git.tgz 6265 4e93808606526155d02fd3262e84e8bb 3e7d40b520e361bd8bc2dcd4c6e1fd92c3933672 cl-jsx-20160208-git cl-jsx-test.asd cl-jsx.asd -cl-junit-xml http://beta.quicklisp.org/archive/cl-junit-xml/2015-01-13/cl-junit-xml-20150113-git.tgz 5173 2a8e063e7431b6380ef6a6d268075af3 3d075953049523bb9b6071878607f59344201121 cl-junit-xml-20150113-git cl-junit-xml.asd cl-junit-xml.lisp-unit.asd cl-junit-xml.lisp-unit2.asd -cl-just-getopt-parser http://beta.quicklisp.org/archive/cl-just-getopt-parser/2019-07-10/cl-just-getopt-parser-20190710-git.tgz 7347 64419b6018a5f8012f7bc9445b2c1e8b 290fb2f9c52cf26680af825d1ab6866f22bafd9a cl-just-getopt-parser-20190710-git just-getopt-parser.asd -cl-k8055 http://beta.quicklisp.org/archive/cl-k8055/2019-07-10/cl-k8055-20190710-git.tgz 32114 4038e38dfb899c604beb50682fc85ace c20da9e467984ec6a920f95d12e1d60b1dcfb322 cl-k8055-20190710-git cl-k8055.asd -cl-kanren http://beta.quicklisp.org/archive/cl-kanren/2019-10-07/cl-kanren-20191007-git.tgz 12189 c6a29b570ac5047d4c5b1eb05a9f3b34 f11814e7348abcc947e9f22cfba4974d1277b691 cl-kanren-20191007-git cl-kanren.asd tests/cl-kanren-test.asd -cl-kanren-trs http://beta.quicklisp.org/archive/cl-kanren-trs/2012-03-05/cl-kanren-trs-20120305-svn.tgz 11024 7be1f8c2a6b396bf2403a51d9f5cd4b2 76bc8c61f0425273e137925aa278072284d5f6ef cl-kanren-trs-20120305-svn cl-kanren-trs/kanren-trs.asd cl-kanren-trs/tests/kanren-trs-test.asd -cl-keycloak http://beta.quicklisp.org/archive/cl-keycloak/2019-07-10/cl-keycloak-20190710-git.tgz 13878 c1fd4adadecb6bb9c8db69ea2a4a731e 08895e7fe14432588a82c1920c30d1865bbe63ea cl-keycloak-20190710-git cl-keycloak.asd -cl-kraken http://beta.quicklisp.org/archive/cl-kraken/2019-12-27/cl-kraken-20191227-git.tgz 21682 80c139f50020267f7091da3ba5a13ed1 e6194ec4c88b63bd629d6e1d9af822598eec7e2a cl-kraken-20191227-git cl-kraken.asd -cl-ksuid http://beta.quicklisp.org/archive/cl-ksuid/2017-08-30/cl-ksuid-20170830-git.tgz 15810 0d6c51c80711463b0d276455fc2d4bf9 63b788ba0f5bb0d1e4c436979e4be5a053b10994 cl-ksuid-20170830-git cl-ksuid.asd -cl-kyoto-cabinet http://beta.quicklisp.org/archive/cl-kyoto-cabinet/2019-11-30/cl-kyoto-cabinet-20191130-git.tgz 11166 e9ec82383fe859240e7711142878f8fa 9921f6a8e5750dfe6c300c3e6a7ccc41543bc203 cl-kyoto-cabinet-20191130-git cl-kyoto-cabinet.asd -cl-l10n http://beta.quicklisp.org/archive/cl-l10n/2016-12-04/cl-l10n-20161204-darcs.tgz 66664 c7cb0bb584b061799abaaaf2bd65c9c5 ea99b5ca38a28b28302222f9861a8c552cac4d67 cl-l10n-20161204-darcs cl-l10n.asd -cl-l10n-cldr http://beta.quicklisp.org/archive/cl-l10n-cldr/2012-09-09/cl-l10n-cldr-20120909-darcs.tgz 3538114 466e776f2f6b931d9863e1fc4d0b514e 6b3a2e8fbf2b933e13d85fb21d87943eac67cbf8 cl-l10n-cldr-20120909-darcs cl-l10n-cldr.asd -cl-langutils http://beta.quicklisp.org/archive/cl-langutils/2012-11-25/cl-langutils-20121125-git.tgz 2482768 ba2d1e4abbc7757c135273d76e8147db 0861ac6408e69c6bb155dc62a637ede5fac467de cl-langutils-20121125-git langutils.asd -cl-las http://beta.quicklisp.org/archive/cl-las/2019-12-27/cl-las-20191227-git.tgz 11248 0fccd424456784cbdeb8285a344afb77 1cbb5f4d24ac50519fa45d180c40b052a64c2579 cl-las-20191227-git cl-las.asd -cl-lastfm http://beta.quicklisp.org/archive/cl-lastfm/2014-07-13/cl-lastfm-0.2.1.tgz 22260 2eb42fa1964fe361108aa752fe7a9089 160d3d3dce74b91fadef38768494f1785882ad5b cl-lastfm-0.2.1 cl-lastfm-test.asd cl-lastfm.asd -cl-launch http://beta.quicklisp.org/archive/cl-launch/2015-10-31/cl-launch-4.1.4.1.tgz 94539 5f3d1dc76a5c734a8fd2dba5e567f2ad e809f8f3dcbb3d0b3f239ef3ade7686005aee383 cl-launch-4.1.4.1 cl-launch.asd -cl-ledger http://beta.quicklisp.org/archive/cl-ledger/2019-08-13/cl-ledger-20190813-git.tgz 1182473 7931d6ef3b6585821388d88cfc28a40c a04ab520522307ff5c748efdd69c6744b04699d5 cl-ledger-20190813-git cl-ledger.asd -cl-lex http://beta.quicklisp.org/archive/cl-lex/2016-09-29/cl-lex-20160929-git.tgz 15959 03ca8860afad55575c8747a12e58370a 249a1fb7e5d2070536213b83e9608bcba9cd79b1 cl-lex-20160929-git cl-lex.asd -cl-lexer http://beta.quicklisp.org/archive/cl-lexer/2019-10-07/cl-lexer-20191007-git.tgz 5477 810e054e68d67b18eaa3859114b62662 e8b213a35c04e07c34ca676ee5f7919548e092e2 cl-lexer-20191007-git cl-lexer.asd -cl-libevent2 http://beta.quicklisp.org/archive/cl-libevent2/2019-01-07/cl-libevent2-20190107-git.tgz 17801 e6cf8f0a5ead1184043107ae05505309 a0f45ed59ab51638f6a3081ab21a476ad495ea5d cl-libevent2-20190107-git cl-libevent2-ssl.asd cl-libevent2.asd -cl-libfarmhash http://beta.quicklisp.org/archive/cl-libfarmhash/2016-10-31/cl-libfarmhash-20161031-git.tgz 14254 18f1d5557e8cb18a8508d5aea161c29b f6246aa6bfc3d7d6add3f2f3cabbe574341a87ae cl-libfarmhash-20161031-git cl-libfarmhash.asd -cl-libhoedown http://beta.quicklisp.org/archive/cl-libhoedown/2016-10-31/cl-libhoedown-20161031-git.tgz 6116 e3e02a0108dd00d7d3d47eb7cb8933ba 8265b5849763171d07d9132a68fdf035e1e61f7e cl-libhoedown-20161031-git cl-libhoedown.asd -cl-libiio http://beta.quicklisp.org/archive/cl-libiio/2019-11-30/cl-libiio-20191130-git.tgz 8149 cc70d023b770af0ecdfd1f9e401ee6ff 2caa1a95b175464b2447926ca089babaa7656877 cl-libiio-20191130-git cl-libiio.asd -cl-libpuzzle http://beta.quicklisp.org/archive/cl-libpuzzle/2015-06-08/cl-libpuzzle-20150608-git.tgz 2604 6721ae95e9eaaac4b5cb23403c43f67c 9515ee0dbfe8dfc9af92c36c5bdd97d2cd754c88 cl-libpuzzle-20150608-git cl-libpuzzle-test.asd cl-libpuzzle.asd -cl-libssh2 http://beta.quicklisp.org/archive/cl-libssh2/2016-05-31/cl-libssh2-20160531-git.tgz 21638 f4fdafbe1ef21b9e9c9e07dd564faacd 479298ef75e5cc50679e6eb052606b3a7ebe8df7 cl-libssh2-20160531-git libssh2.asd libssh2.test.asd -cl-libsvm http://beta.quicklisp.org/archive/cl-libsvm/2014-11-06/cl-libsvm-20141106-git.tgz 295884 bf492a44400d6817b61a3ede9ddc6ed3 91d879748fa3b12f9144a1d1d5d6a4f7080e7201 cl-libsvm-20141106-git cl-liblinear.asd cl-libsvm.asd -cl-libsvm-format http://beta.quicklisp.org/archive/cl-libsvm-format/2018-07-11/cl-libsvm-format-20180711-git.tgz 9951 bac7636204a46c66cdfa135cdd147ca6 87adb8326851e29f2c96f0a02dca122336d95520 cl-libsvm-format-20180711-git cl-libsvm-format-test.asd cl-libsvm-format.asd -cl-libusb http://beta.quicklisp.org/archive/cl-libusb/2019-12-27/cl-libusb-20191227-git.tgz 7682 22a50679b150890000f41a697b7b812e 80035e10a4396dc9582554361fbb47b8f511fbe3 cl-libusb-20191227-git cl-libusb.asd libusb-ffi.asd -cl-libuv http://beta.quicklisp.org/archive/cl-libuv/2019-01-07/cl-libuv-20190107-git.tgz 14487 c09c505dc45812cc773454ffc6fdbd38 d4b0c20548ce1bf54bc44938317f437ec8733d8f cl-libuv-20190107-git cl-libuv.asd -cl-libxml2 http://beta.quicklisp.org/archive/cl-libxml2/2013-06-15/cl-libxml2-20130615-git.tgz 55579 88317bf302b5f1d2c1ac9efa6538fbe0 75977fe851405c2d85d67ed6df8dc3462628c661 cl-libxml2-20130615-git cl-libxml2.asd xfactory.asd xoverlay.asd -cl-libyaml http://beta.quicklisp.org/archive/cl-libyaml/2017-01-24/cl-libyaml-20170124-git.tgz 9324 407d5aa53ac8132fcce4b171feaf5d39 92cfe1f703bfe40ad94a2941d5d2d72c7feceb45 cl-libyaml-20170124-git cl-libyaml-test.asd cl-libyaml.asd -cl-locale http://beta.quicklisp.org/archive/cl-locale/2015-10-31/cl-locale-20151031-git.tgz 3916 7a8fb3678938af6dc5c9fd6431428aff b5e33ecae4ad91db85d6f3ead72a52a02547fd23 cl-locale-20151031-git cl-locale-syntax.asd cl-locale-test.asd cl-locale.asd -cl-locatives http://beta.quicklisp.org/archive/cl-locatives/2019-03-07/cl-locatives-20190307-hg.tgz 2705 f7dc0d49dccf787bc27c859ede74537e 83d8f4cc9457e0d907b44ab9d1422e9f75cec721 cl-locatives-20190307-hg cl-locatives.asd -cl-log http://beta.quicklisp.org/archive/cl-log/2013-01-28/cl-log.1.0.1.tgz 18463 fb960933eb748c14adc3ccb376ac8066 79eba93cc6a981a79d95b35533063b70083c6353 cl-log.1.0.1 cl-log-test.asd cl-log.asd -cl-logic http://beta.quicklisp.org/archive/cl-logic/2014-12-17/cl-logic-20141217-git.tgz 19237 1d2c46cd6d6b22eec42b0634ee6aad02 832125e585ebc79b14bad28a34bab16dede39272 cl-logic-20141217-git cl-logic.asd -cl-ltsv http://beta.quicklisp.org/archive/cl-ltsv/2014-07-13/cl-ltsv-20140713-git.tgz 1768 b0f6141d4d431c30cd3f89ed9b915cf9 78beea35eb74ae8e22963cbe6f5e8b7e03d5a578 cl-ltsv-20140713-git cl-ltsv-test.asd cl-ltsv.asd -cl-lzlib http://beta.quicklisp.org/archive/cl-lzlib/2019-10-07/cl-lzlib-20191007-git.tgz 584416 36b2ee8fac0805527d6a215375300123 c9c2bf1198e7f6e86a47f7cefbe8ff2b2f7f10a4 cl-lzlib-20191007-git lzlib-tests.asd lzlib.asd -cl-lzma http://beta.quicklisp.org/archive/cl-lzma/2019-11-30/cl-lzma-20191130-git.tgz 391732 839b371f342610b221e8455ec0e5ab9e 2d6b69f5e810f08f2c943ed3b5a977041608e1cc cl-lzma-20191130-git cl-lzma.asd -cl-m4 http://beta.quicklisp.org/archive/cl-m4/2013-03-12/cl-m4-20130312-git.tgz 43800 1b3c29d5e7fb294f95afd4a845f4c6b4 7dbee2d1711f7b212ba1f6b9a04ac1ba873f4e31 cl-m4-20130312-git cl-m4-test.asd cl-m4.asd -cl-mango http://beta.quicklisp.org/archive/cl-mango/2019-10-07/cl-mango-20191007-git.tgz 102780 771a85df4b2b62fec50913278fa6f27c 04487c9de38a8ef467c187e2506d5ea040b4c637 cl-mango-20191007-git cl-mango.asd -cl-markdown http://beta.quicklisp.org/archive/cl-markdown/2019-12-27/cl-markdown-20191227-git.tgz 73424 630fdb2615d0c7cd7b31a5d6295ae552 eebe40f532720a42422ecfca77bbb2ef60ecfe19 cl-markdown-20191227-git cl-markdown-comparisons.asd cl-markdown-test.asd cl-markdown.asd -cl-markless http://beta.quicklisp.org/archive/cl-markless/2019-10-07/cl-markless-20191007-git.tgz 73880 e9593b82942910bed2449495b7705323 6b690ae311a74c7f29f71abe87406a422633a291 cl-markless-20191007-git cl-markless-test.asd cl-markless.asd epub/cl-markless-epub.asd markdown/cl-markless-markdown.asd plump/cl-markless-plump.asd standalone/cl-markless-standalone.asd -cl-marklogic http://beta.quicklisp.org/archive/cl-marklogic/2017-04-03/cl-marklogic-20170403-git.tgz 1817555 a68c384b84563fa4d6f330ba6a02fb10 f32bfb51893fd300a1472b4891b86f4dbfe6bd7b cl-marklogic-20170403-git cl-marklogic.asd subsystem/ml-dsl/ml-dsl.asd subsystem/ml-optimizer/ml-optimizer.asd subsystem/ml-test/ml-test.asd -cl-markup http://beta.quicklisp.org/archive/cl-markup/2013-10-03/cl-markup-20131003-git.tgz 5785 3ec36b8e15435933f614959032987848 6aa4346b3ea4f1113934de898307229892252b12 cl-markup-20131003-git cl-markup-test.asd cl-markup.asd -cl-marshal http://beta.quicklisp.org/archive/cl-marshal/2018-03-28/cl-marshal-20180328-git.tgz 11220 2d13dd2a276f1e63965498d10d9406ce 47bdef36e420a338139a40e92003fa5d50401695 cl-marshal-20180328-git marshal-tests.asd marshal.asd -cl-match http://beta.quicklisp.org/archive/cl-match/2012-11-25/cl-match-20121125-git.tgz 23798 790a315e08136b3e9b3a42eaadc558a4 a747badf5dabd5b345df787c4b5765ee1d7bbe78 cl-match-20121125-git cl-match-test.asd cl-match.asd pcl-unit-test.asd standard-cl.asd -cl-mathstats http://beta.quicklisp.org/archive/cl-mathstats/2014-07-13/cl-mathstats-20140713-git.tgz 82601 f42fba86de264be6d626064228d15258 f53ab8b4758c0915a3389eb9d02824d226d128ab cl-mathstats-20140713-git cl-mathstats-test.asd cl-mathstats.asd -cl-maxsat http://beta.quicklisp.org/archive/cl-maxsat/2019-12-27/cl-maxsat-20191227-git.tgz 23197 beb673cdf1be131b12e5f2a6a77cf25e 9c6675f48a41c7ba12247c064ac293affde05e65 cl-maxsat-20191227-git cl-maxsat.asd cl-maxsat.test.asd -cl-mecab http://beta.quicklisp.org/archive/cl-mecab/2018-10-18/cl-mecab-20181018-git.tgz 2767 2ab93a1f4c43bab2428e5175108169a2 785e78ddcb996dc7d517f7796063d78f853c658c cl-mecab-20181018-git cl-mecab-test.asd cl-mecab.asd -cl-mechanize http://beta.quicklisp.org/archive/cl-mechanize/2018-07-11/cl-mechanize-20180711-git.tgz 3722 232d80473f28373048d93ca69f2b67a0 bfb4e5e0fcc4181fb4ba09c65c8b21e6bdafc9cc cl-mechanize-20180711-git cl-mechanize.asd -cl-mediawiki http://beta.quicklisp.org/archive/cl-mediawiki/2016-12-04/cl-mediawiki-20161204-git.tgz 16116 25991d3a28d94bf01f7a3a9464e2c3e9 5b3f1c43c010085a50b3459daec5b6b2fe16bd8a cl-mediawiki-20161204-git cl-mediawiki-test.asd cl-mediawiki.asd -cl-memcached http://beta.quicklisp.org/archive/cl-memcached/2015-06-08/cl-memcached-20150608-git.tgz 16575 d53b92973d51e95558aafaba56942c92 694deb82afc44290d593d4ca6d1242077af14fc9 cl-memcached-20150608-git cl-memcached.asd -cl-messagepack http://beta.quicklisp.org/archive/cl-messagepack/2019-03-07/cl-messagepack-20190307-git.tgz 11449 b106e4f7fa1817f7e15a519a4fca270a b49d4e18564a2a42336dec934eafbfa6509b14e5 cl-messagepack-20190307-git cl-messagepack-tests.asd cl-messagepack.asd -cl-messagepack-rpc http://beta.quicklisp.org/archive/cl-messagepack-rpc/2017-12-27/cl-messagepack-rpc-20171227-git.tgz 11177 6de2befbdd2a7e7ee028e0f9cc82bd7f 7b4c77bdb4dad0a365868591dbd75ad1ae3d4c10 cl-messagepack-rpc-20171227-git cl-messagepack-rpc-tests.asd cl-messagepack-rpc.asd -cl-migrations http://beta.quicklisp.org/archive/cl-migrations/2011-01-10/cl-migrations-20110110-http.tgz 3843 af513b9cd5bf182bd7c0910a98107823 cb5ae65cdda19f45cee7eaf4ad1726eddd3fd794 cl-migrations-20110110-http cl-migrations.asd -cl-mime http://beta.quicklisp.org/archive/cl-mime/2016-02-08/cl-mime-20160208-git.tgz 16217 7d91fe61a9d488bf61b2cfcc40aea430 37c0cfac084fd21c6c698023eff53af23d39357f cl-mime-20160208-git cl-mime.asd -cl-mixed http://beta.quicklisp.org/archive/cl-mixed/2019-07-10/cl-mixed-20190710-git.tgz 354610 c952a3a057a5e9c8cfe789f445e9532a dc47c3a46975ea4cd5ffa33eeccc7703fcb01ab0 cl-mixed-20190710-git cl-mixed.asd -cl-mlep http://beta.quicklisp.org/archive/cl-mlep/2018-04-30/cl-mlep-20180430-git.tgz 219387 378549be18c26b35a2a928b48f20e7c6 2e4e11c788b75de49c76163fb045d0741d33747e cl-mlep-20180430-git mlep-add.asd mlep.asd -cl-mock http://beta.quicklisp.org/archive/cl-mock/2016-04-21/cl-mock-20160421-git.tgz 7754 3d38feb9aa3a7d52b38ad18ff60d8f61 19d10980f1c83730327ca2f68e873586b3870dc5 cl-mock-20160421-git cl-mock-basic.asd cl-mock-tests-basic.asd cl-mock-tests.asd cl-mock.asd -cl-modlisp http://beta.quicklisp.org/archive/cl-modlisp/2015-09-23/cl-modlisp-20150923-git.tgz 10406 95f48447065e734ddfd23a58df53679b 5f92ef72be5b0897ed4ca226adbcbe9311a458bf cl-modlisp-20150923-git modlisp.asd -cl-monad-macros http://beta.quicklisp.org/archive/cl-monad-macros/2011-06-19/cl-monad-macros-20110619-svn.tgz 29833 8bff3b40a3720242b6f8f13932dd7b9e 46a54c95c093f7c263c8963479147624b3d234fd cl-monad-macros-20110619-svn cl-monad-macros.asd -cl-moneris http://beta.quicklisp.org/archive/cl-moneris/2011-04-18/cl-moneris-20110418-git.tgz 6676 ad2527ea7e6d8618757907dd2193224a 572b40deafdbd20a759bb36bc26250f6df64c8ac cl-moneris-20110418-git cl-moneris-test.asd cl-moneris.asd -cl-mongo http://beta.quicklisp.org/archive/cl-mongo/2016-05-31/cl-mongo-20160531-git.tgz 63737 f37c70b58ebbbc36dd855356b196c9a0 65b1c29c5c6bf02f9bbd7d64a260089968c41eec cl-mongo-20160531-git cl-mongo.asd -cl-mongo-id http://beta.quicklisp.org/archive/cl-mongo-id/2018-02-28/cl-mongo-id-20180228-git.tgz 3909 7c3a41a0801e9d8c9f03ce440f8a792f 3711c34c4d1a8f4ac40f014d8400339d2f2fb77d cl-mongo-id-20180228-git cl-mongo-id.asd -cl-monitors http://beta.quicklisp.org/archive/cl-monitors/2019-07-10/cl-monitors-20190710-git.tgz 30426 1c6c7f00915b0301a44f99eb5db282fe 6cbc22dbdf2b5dff91722aa12346e35a9a91f8c9 cl-monitors-20190710-git cl-monitors.asd -cl-mop http://beta.quicklisp.org/archive/cl-mop/2015-01-13/cl-mop-20150113-git.tgz 3524 2fafd8a889b9ad8455e0451d97a60f66 b6fd23f5ff74a7343158fcb9979362f24104a670 cl-mop-20150113-git cl-mop.asd -cl-moss http://beta.quicklisp.org/archive/cl-moss/2017-10-19/cl-moss-20171019-git.tgz 15420 5a242fbf7bc9a257a163dffd37467f1b 33a67534114561c248037d59806161a3c3281a05 cl-moss-20171019-git cl-moss.asd -cl-mount-info http://beta.quicklisp.org/archive/cl-mount-info/2019-12-27/cl-mount-info-20191227-git.tgz 22410 100934867273f68e6aed9da3e709637f 99c4259aa58db89fa480eba7429578233244761d cl-mount-info-20191227-git cl-mount-info.asd -cl-mpg123 http://beta.quicklisp.org/archive/cl-mpg123/2019-07-10/cl-mpg123-20190710-git.tgz 1362662 6a816599e8260a8509e39ba7a5d331aa f598325fa9e18963b96c3d9753370054a3d81d71 cl-mpg123-20190710-git cl-mpg123-example.asd cl-mpg123.asd -cl-mpi http://beta.quicklisp.org/archive/cl-mpi/2019-07-10/cl-mpi-20190710-git.tgz 29951 084a37f38bc915e7cb446f0d659e745c 6aec00040dd9c6d789642e78799a97f93bd15de3 cl-mpi-20190710-git cl-mpi-asdf-integration.asd cl-mpi-extensions.asd cl-mpi-test-suite.asd cl-mpi.asd examples/cl-mpi-examples.asd -cl-mssql http://beta.quicklisp.org/archive/cl-mssql/2019-08-13/cl-mssql-20190813-git.tgz 15740 53dce223161f2c5e015366c6b241d713 762a80f7edb4f0af09e000c3f5ec9afff663646d cl-mssql-20190813-git mssql.asd -cl-mtgnet http://beta.quicklisp.org/archive/cl-mtgnet/2018-07-11/cl-mtgnet-20180711-git.tgz 13584 552af7cb3547102849920f639964c694 91a94bf40fb828bc3c8353ca1a17bdc53b1d4960 cl-mtgnet-20180711-git cl-mtgnet-async.asd cl-mtgnet-sync.asd cl-mtgnet.asd -cl-murmurhash http://beta.quicklisp.org/archive/cl-murmurhash/2019-12-27/cl-murmurhash-20191227-git.tgz 6973 71f7d56d247ea19fef5880f8e5f04cb9 3fa7acea151a7124d4dcfcf0573ed08bcb0f5334 cl-murmurhash-20191227-git cl-murmurhash.asd -cl-mustache http://beta.quicklisp.org/archive/cl-mustache/2015-09-23/cl-mustache-20150923-git.tgz 15598 8eaa6901f070bd04cb30aed0c87ba252 c32a2a223da7d39568cc9337153492dfb55aef91 cl-mustache-20150923-git cl-mustache-test.asd cl-mustache.asd -cl-muth http://beta.quicklisp.org/archive/cl-muth/2018-07-11/cl-muth-stable-64e722c5-git.tgz 4920 0759a5f528c77b078bc00264f803d134 99d6871946b18f992c99d14f9c6d48b15c066860 cl-muth-stable-64e722c5-git cl-muth.asd -cl-mw http://beta.quicklisp.org/archive/cl-mw/2015-04-07/cl-mw-20150407-git.tgz 89150 688397a73badb51c626bb5633cfbf9bb 4a3d5e5a5d6413396e759c0895838bc03f70b93d cl-mw-20150407-git cl-mw.asd cl-mw.examples.argument-processing.asd cl-mw.examples.hello-world.asd cl-mw.examples.higher-order.asd cl-mw.examples.monte-carlo-pi.asd cl-mw.examples.ping.asd cl-mw.examples.with-task-policy.asd -cl-mysql http://beta.quicklisp.org/archive/cl-mysql/2017-10-19/cl-mysql-20171019-git.tgz 25620 e1021da4d35cbb584d4df4f0d7e2bbb9 629d419c6d0a1ab3ebb5cb2dadeb0efbc2988564 cl-mysql-20171019-git cl-mysql-test.asd cl-mysql.asd -cl-naive-store http://beta.quicklisp.org/archive/cl-naive-store/2019-12-27/cl-naive-store-20191227-git.tgz 30052 6e45ba6f62992382b70c37ded923235b 9903789369a53dc7af5f10daa4f1c41e02c1e594 cl-naive-store-20191227-git cl-naive-store.asd data-type-defs/cl-naive-data-type-defs.asd data-types/cl-naive-data-types.asd naive-indexed/cl-naive-indexed.asd naive-items/cl-naive-items.asd tests/cl-naive-store-tests.asd -cl-ncurses http://beta.quicklisp.org/archive/cl-ncurses/2010-10-06/cl-ncurses_0.1.4.tgz 23603 60cde15b3c037f394e0c24eb55ad56f8 8d7cfd9bb56ba8c2e6f98bcb298bfc121f8d51bd cl-ncurses_0.1.4 cl-ncurses.asd -cl-neo4j http://beta.quicklisp.org/archive/cl-neo4j/2013-01-28/cl-neo4j-release-b8ad637a-git.tgz 9194 cb073877ef9a06784c7d1964e0c9266d f8a127e60e89f6a419ac4c59f4e734ce3f513258 cl-neo4j-release-b8ad637a-git cl-neo4j.asd -cl-neovim http://beta.quicklisp.org/archive/cl-neovim/2019-05-21/cl-neovim-20190521-git.tgz 28387 c74dc12e6ebcac2f55b0c5f510740734 a47dc4c6b386f74eb24f8370b14ebe489a70753c cl-neovim-20190521-git cl-neovim.asd -cl-netpbm http://beta.quicklisp.org/archive/cl-netpbm/2019-12-27/cl-netpbm-20191227-hg.tgz 406726 456baffc4d3e3cd1c96a5bfc96831c3c 31ce4b59811ce99f0b9bb3bc6a5afbaf9d491be0 cl-netpbm-20191227-hg cl-netpbm.asd -cl-netstring-plus http://beta.quicklisp.org/archive/cl-netstring-plus/2015-07-09/cl-netstring-plus-20150709-git.tgz 4433 6e8765afb3524b15982841b1351e1f8c 21e3f577bcb812b607b5a1b180e97ee8763cf6c1 cl-netstring-plus-20150709-git cl-netstring+.asd -cl-netstrings http://beta.quicklisp.org/archive/cl-netstrings/2012-10-13/cl-netstrings-20121013-git.tgz 3736 8869774ca304843bb00041d63d80ba1e 9bf9f017e4e1b95c067e38c9fdc1e6db85a1457a cl-netstrings-20121013-git cl-netstrings.asd -cl-ntp-client http://beta.quicklisp.org/archive/cl-ntp-client/2019-07-10/cl-ntp-client-20190710-git.tgz 3473 2053825ff92db3e37d533619e64045ad 6b4472231012fda91a1e99de6b8cd930636898d1 cl-ntp-client-20190710-git cl-ntp-client.asd -cl-ntriples http://beta.quicklisp.org/archive/cl-ntriples/2019-03-07/cl-ntriples-20190307-hg.tgz 6167 118afd8c0a65aad8e83e92f19e31117b e6bbc4ad2c50a998124d50ec4b8fdc8eb99f807a cl-ntriples-20190307-hg cl-ntriples.asd -cl-num-utils http://beta.quicklisp.org/archive/cl-num-utils/2013-12-11/cl-num-utils-20131211-git.tgz 64210 a715b9ef4288025bb87a0f4d259763c5 f875e1452b9a0df2729ef874fe4b041557c8905d cl-num-utils-20131211-git cl-num-utils.asd -cl-nxt http://beta.quicklisp.org/archive/cl-nxt/2015-06-08/cl-nxt-20150608-git.tgz 25121 a63efb53921dfb220e9085b7c67a989a c453129fbccbffe7dc25c77c1fe974b453d97b32 cl-nxt-20150608-git nxt-proxy.asd nxt.asd -cl-oauth http://beta.quicklisp.org/archive/cl-oauth/2015-08-04/cl-oauth-20150804-git.tgz 22871 280ca181aaf219d292dfcc5795d68b01 b2dcc9fde0faa4a38dc07d20f523182e0d6ccb21 cl-oauth-20150804-git cl-oauth.asd -cl-oclapi http://beta.quicklisp.org/archive/cl-oclapi/2018-08-31/cl-oclapi-20180831-git.tgz 17154 e80585c65e677f1ad10c5ae6b10879fd 1e73f38e41e931301d229a751cb8eb7e7bd2e27b cl-oclapi-20180831-git cl-oclapi-test.asd cl-oclapi.asd -cl-octet-streams http://beta.quicklisp.org/archive/cl-octet-streams/2018-03-28/cl-octet-streams-20180328-git.tgz 16943 70aa3af68ea8ffa0d69312260f5e5287 5aaf8f807b502d33706fa0f5318cd8fa19a0e1b7 cl-octet-streams-20180328-git cl-octet-streams.asd -cl-ode http://beta.quicklisp.org/archive/cl-ode/2016-06-28/cl-ode-20160628-git.tgz 10617 21c1ba1c91b5910a201cfb824c45fbf0 756649c7ff0912184bb0fa7c8a7e6abafc20273e cl-ode-20160628-git cl-ode.asd -cl-odesk http://beta.quicklisp.org/archive/cl-odesk/2015-06-08/cl-odesk-20150608-git.tgz 6930 e19a70b04c5f7204d46b7bd33a14e054 ab5f306a08b087e175dfe6389e1634444e147adb cl-odesk-20150608-git odesk.asd -cl-ohm http://beta.quicklisp.org/archive/cl-ohm/2018-02-28/cl-ohm-20180228-git.tgz 18129 988fa480a9196cd349782dfefb91b173 e18484324b8fdb9c372d0ad9aa3ebd150c328ec7 cl-ohm-20180228-git cl-ohm.asd -cl-olefs http://beta.quicklisp.org/archive/cl-olefs/2015-07-09/cl-olefs-20150709-git.tgz 21367 e2051eb090625ecf6ef295bbee5e3f65 7dd0fb6d14d42fdb4d3f331c1f15770d8277eda4 cl-olefs-20150709-git cl-olefs.asd -cl-one-time-passwords http://beta.quicklisp.org/archive/cl-one-time-passwords/2017-10-19/cl-one-time-passwords-20171019-git.tgz 4901 c565262b547110b1d5528671483a6166 4b5b6788ed4c8c3b80d1d573779dfff638a30c9a cl-one-time-passwords-20171019-git cl-one-time-passwords-test.asd cl-one-time-passwords.asd -cl-online-learning http://beta.quicklisp.org/archive/cl-online-learning/2019-12-27/cl-online-learning-20191227-git.tgz 47081 8c6d99b9550ce542482229b43d8ac610 0e8108d5f5263a6482b1b94bbec46c661a6daadd cl-online-learning-20191227-git cl-online-learning-test.asd cl-online-learning.asd -cl-openal http://beta.quicklisp.org/archive/cl-openal/2015-03-02/cl-openal-20150302-git.tgz 10197 f85c83d057edf2f6273b0d9f89adfde9 6e4d3ead3768a92da6ab01cc41b88e54c37d7172 cl-openal-20150302-git cl-alc.asd cl-alut.asd cl-openal-examples.asd cl-openal.asd -cl-opengl http://beta.quicklisp.org/archive/cl-opengl/2019-11-30/cl-opengl-20191130-git.tgz 439215 c5387f051960e9179b2ed32fafb67e72 12c358b808eb731ea8519ef6bed602c3c7438cfa cl-opengl-20191130-git cl-glu.asd cl-glut-examples.asd cl-glut.asd cl-opengl.asd -cl-openstack-client http://beta.quicklisp.org/archive/cl-openstack-client/2019-10-07/cl-openstack-client-20191007-git.tgz 15217 21d5f62c63d36ec3b51bac01be54122c ac507feb7962ce6654e7c434f8abd3bfd59edad1 cl-openstack-client-20191007-git cl-openstack-client-test.asd cl-openstack-client.asd -cl-opsresearch http://beta.quicklisp.org/archive/cl-opsresearch/2017-04-03/cl-opsresearch-20170403-git.tgz 169006 3f9d2d4fa2e5bd0bd262c3e7d8473933 d5ec56c8385fdecddd862753f1941f476b6c4797 cl-opsresearch-20170403-git cl-opsresearch.asd subsystem/or-cluster/or-cluster.asd subsystem/or-fann/or-fann.asd subsystem/or-glpk/or-glpk.asd subsystem/or-gsl/or-gsl.asd subsystem/or-test/or-test.asd -cl-org-mode http://beta.quicklisp.org/archive/cl-org-mode/2010-12-07/cl-org-mode-20101207-git.tgz 16460 f4220fc89b86010c37f682b937e48758 4bb1c14e15eaacc107bbf539fc308766cd8f90d0 cl-org-mode-20101207-git cl-org-mode.asd -cl-out123 http://beta.quicklisp.org/archive/cl-out123/2019-07-10/cl-out123-20190710-git.tgz 793012 fe497cc028c073c1b28390c704a98e56 13f4bf99dd9d41f7f326f39c7d2acf561fc63b40 cl-out123-20190710-git cl-out123.asd -cl-pack http://beta.quicklisp.org/archive/cl-pack/2018-04-30/cl-pack-20180430-git.tgz 13791 cb9f9b4929d4d175316b3f3c7f0bff64 d9740ef0fe2d1dc2cd1897511e0b83cc8aac1e9c cl-pack-20180430-git cl-pack.asd -cl-package-locks http://beta.quicklisp.org/archive/cl-package-locks/2011-12-03/cl-package-locks-20111203-git.tgz 3225 27ed43ed35ef89c3b1d7c5b2594f854c 1cb55bc796f5325a251868413e66a915596477cb cl-package-locks-20111203-git cl-package-locks.asd -cl-pango http://beta.quicklisp.org/archive/cl-pango/2017-04-03/cl-pango-20170403-git.tgz 14796 3a55e08abc5f99a853b80c835edb868d 3a8f8780b761e9f58b803a743928c98741be4a4c cl-pango-20170403-git cl-pango.asd -cl-parallel http://beta.quicklisp.org/archive/cl-parallel/2013-03-12/cl-parallel-20130312-git.tgz 3888 246f314b0ffa627a311e775b00dd0b65 b1d4c6defe936a70b5a9bbe431e94c65f8d0c023 cl-parallel-20130312-git cl-parallel.asd -cl-parser-combinators http://beta.quicklisp.org/archive/cl-parser-combinators/2013-11-11/cl-parser-combinators-20131111-git.tgz 36429 25ad9b1459901738a6394422a41b8fec a708a8b6996a18c3aed1d9d909f9c52477c72fba cl-parser-combinators-20131111-git parser-combinators-cl-ppcre.asd parser-combinators-debug.asd parser-combinators-tests.asd parser-combinators.asd -cl-pass http://beta.quicklisp.org/archive/cl-pass/2018-02-28/cl-pass-20180228-git.tgz 2758 feb6fe90104a78686b6255ed8f88c3ed 20e7a18ffafe8683aa0a00f0cbd07b6b925fe29a cl-pass-20180228-git cl-pass-test.asd cl-pass.asd -cl-password-store http://beta.quicklisp.org/archive/cl-password-store/2018-02-28/cl-password-store-20180228-git.tgz 19029 77cc428e880cd136d7c2c0fe279ee90c 3ebe2c16fb1b89913040e2a21c10319ef959b335 cl-password-store-20180228-git cl-password-store.asd -cl-pattern http://beta.quicklisp.org/archive/cl-pattern/2014-07-13/cl-pattern-20140713-git.tgz 5143 cf8e74def535c66a358df1ada9d89785 cab8b56cdf63e359614d33840ef2faa539b351f3 cl-pattern-20140713-git cl-pattern-benchmark.asd cl-pattern.asd -cl-patterns http://beta.quicklisp.org/archive/cl-patterns/2019-12-27/cl-patterns-20191227-git.tgz 95628 a5aacb40f62573d42220d44e67b95a3b cf180356d08ad0ea68c6863ed997884a27c4d0f5 cl-patterns-20191227-git cl-patterns.asd -cl-paymill http://beta.quicklisp.org/archive/cl-paymill/2013-11-11/cl-paymill-20131111-git.tgz 7224 1c240a7da7b22b55d16f7e6922191aa9 95e9052fb40ff1dbbf7925287e1e4f1409198e7a cl-paymill-20131111-git cl-paymill.asd -cl-paypal http://beta.quicklisp.org/archive/cl-paypal/2010-10-06/cl-paypal-20101006-git.tgz 1701376 b24dd8ccbdb60e1dd220076d8a5baa4d 9cf3a3bba7d5ff0feea25875639f6728ac5b2d6a cl-paypal-20101006-git cl-paypal.asd -cl-pcg http://beta.quicklisp.org/archive/cl-pcg/2019-12-27/cl-pcg-20191227-git.tgz 11396 49d212680e99f7bcd2c76dbaa3fa2aab 0834c4cfec434c4d5e04b7590a5e2e1d8981d3ec cl-pcg-20191227-git cl-pcg.asd cl-pcg.test.asd -cl-pdf http://beta.quicklisp.org/archive/cl-pdf/2019-10-07/cl-pdf-20191007-git.tgz 477591 edde2f2da08ec10be65364737ed5fa5c f3740ece395f03b06e573054353d9ef7db6041dc cl-pdf-20191007-git cl-pdf-parser.asd cl-pdf.asd -cl-performance-tuning-helper http://beta.quicklisp.org/archive/cl-performance-tuning-helper/2013-06-15/cl-performance-tuning-helper-20130615-git.tgz 3639 79f43c12d4c35fc6ae10d28467fa5318 2ef8321821c30635eb0eedee03d9cba474b2f2c3 cl-performance-tuning-helper-20130615-git cl-performance-tuning-helper-test.asd cl-performance-tuning-helper.asd -cl-permutation http://beta.quicklisp.org/archive/cl-permutation/2019-10-07/cl-permutation-20191007-git.tgz 59069 bc3408a44f85fc6427c1b70f21015d87 fee0ab3a41141b552e98fad21654819852fc2ea3 cl-permutation-20191007-git cl-permutation-examples.asd cl-permutation-tests.asd cl-permutation.asd -cl-photo http://beta.quicklisp.org/archive/cl-photo/2015-09-23/cl-photo-20150923-git.tgz 12618 1cdf69f41104fcfb0a4ae99a01023148 16a6d27a0e01fc224be9741fb6dd4f0d4a568ef3 cl-photo-20150923-git cl-photo-tests.asd cl-photo.asd -cl-piglow http://beta.quicklisp.org/archive/cl-piglow/2019-12-27/cl-piglow-20191227-git.tgz 6186 2224abe7e444cbc90e6543165635a650 a58791224824666be3dabf06be83d257fa32ac7a cl-piglow-20191227-git cl-piglow.asd -cl-pixman http://beta.quicklisp.org/archive/cl-pixman/2017-08-30/cl-pixman-20170830-git.tgz 11694 5c0938bdf43ebe65574e446b47353e33 77f127fb3a0e55b4814a9796390070c86cc9ee94 cl-pixman-20170830-git pixman.asd -cl-plplot http://beta.quicklisp.org/archive/cl-plplot/2018-02-28/cl-plplot-20180228-git.tgz 289049 e4ac142b064ed3b20bdedd18c602e2c7 21da728b21572839150f71995713c7d54690bd70 cl-plplot-20180228-git cl-plplot.asd -cl-plumbing http://beta.quicklisp.org/archive/cl-plumbing/2018-10-18/cl-plumbing-20181018-git.tgz 3296 835188b1879ae9ad323bafb9cca36c0f fe1c2c004ee5f93822ecb669486ab9c5d6137c88 cl-plumbing-20181018-git cl-plumbing-test.asd cl-plumbing.asd -cl-ply http://beta.quicklisp.org/archive/cl-ply/2015-05-05/cl-ply-20150505-git.tgz 5845 54d8a7725a43455cd4d49ad6e2f1552b 16e20f501dd49b7c965542ee799b6e17c285fdfd cl-ply-20150505-git cl-ply-test.asd cl-ply.asd -cl-png http://beta.quicklisp.org/archive/cl-png/2019-07-10/cl-png-vl-anyversion-04dbb706-git.tgz 8510528 3bff5677a5fb7eecdb348b0f5ad3b2f9 f90b5c9d8b9b75e30872a4139e98687ade71be83 cl-png-vl-anyversion-04dbb706-git png.asd test/bmp-test.asd test/image-test.asd test/ops-test.asd test/png-test.asd -cl-poker-eval http://beta.quicklisp.org/archive/cl-poker-eval/2015-08-04/cl-poker-eval-20150804-git.tgz 15226 7771236a5bda08d88c85a4e33f30047d 5f1611423e82f6132b0ecbc1286f88083642566f cl-poker-eval-20150804-git cl-poker-eval.asd -cl-pop http://beta.quicklisp.org/archive/cl-pop/2011-04-18/cl-pop-20110418-http.tgz 50142 95c0c3418f4740938467514787857bf7 2f413630bb3a0bd507e7a6314f7063f8415c64eb cl-pop-20110418-http cl-pop.asd -cl-portaudio http://beta.quicklisp.org/archive/cl-portaudio/2017-12-27/cl-portaudio-20171227-git.tgz 262470 8a6c175dace75c13eea2378746e6f610 525f6d244842268db1ca65954d57d98854a04c7a cl-portaudio-20171227-git cl-portaudio.asd -cl-portmanteau http://beta.quicklisp.org/archive/cl-portmanteau/2018-10-18/cl-portmanteau-20181018-git.tgz 4041 69dc35a5efd5a58644a86291f114d0ae 1873a59021da676c57cb60a8624ca62231445ab4 cl-portmanteau-20181018-git portmanteau-tests.asd portmanteau.asd -cl-postgres-datetime http://beta.quicklisp.org/archive/cl-postgres-datetime/2019-05-21/cl-postgres-datetime-20190521-git.tgz 2835 2a8346142cf960438f21504a76b48f14 45becc2cce71b8582c605e5727c51f650d3fdf11 cl-postgres-datetime-20190521-git cl-postgres-datetime.asd -cl-postgres-plus-uuid http://beta.quicklisp.org/archive/cl-postgres-plus-uuid/2018-10-18/cl-postgres-plus-uuid-20181018-git.tgz 2270 2fe4f3d80a987192c303695d8629f522 4ca2391fa2cf146d789969453d066da82962af5d cl-postgres-plus-uuid-20181018-git cl-postgres-plus-uuid.asd -cl-ppcre http://beta.quicklisp.org/archive/cl-ppcre/2019-05-21/cl-ppcre-20190521-git.tgz 155009 a980b75c1b386b49bcb28107991eb4ec d6593d8f842bcf6af810ff93c6c02b757bd49ecf cl-ppcre-20190521-git cl-ppcre-unicode.asd cl-ppcre.asd -cl-prevalence http://beta.quicklisp.org/archive/cl-prevalence/2019-11-30/cl-prevalence-20191130-git.tgz 21174 7615cb79ec797a5520941aedc3101390 17538f96a0b5c73cc87d576dbaa63ecd1cbfd713 cl-prevalence-20191130-git cl-prevalence.asd test/cl-prevalence-test.asd -cl-primality http://beta.quicklisp.org/archive/cl-primality/2015-06-08/cl-primality-20150608-git.tgz 5079 e1590227314e5b4edee345232e8a4904 7698c3bcc32494cc4acf4ee91166745160668904 cl-primality-20150608-git cl-primality-test.asd cl-primality.asd -cl-prime-maker http://beta.quicklisp.org/archive/cl-prime-maker/2015-03-02/cl-prime-maker-20150302-git.tgz 5286 018c603dd74eb6a2f760188c1e9e581b b25b00051812d0c302e0e894dd3f3b6cb57cb4c9 cl-prime-maker-20150302-git cl-prime-maker.asd -cl-progress-bar http://beta.quicklisp.org/archive/cl-progress-bar/2018-10-18/cl-progress-bar-20181018-git.tgz 3607 c98f7a9ee6062e19c2a995d1c4952ecb 5de1c70cd16e6463ce9b21de87f3ed0b04f4dc3c cl-progress-bar-20181018-git cl-progress-bar.asd -cl-proj http://beta.quicklisp.org/archive/cl-proj/2019-03-07/cl-proj-20190307-git.tgz 27086 22f867c1041bf6483839be8f96201347 264035de8164730017178560ca47528b6cf53b87 cl-proj-20190307-git cl-proj.asd -cl-project http://beta.quicklisp.org/archive/cl-project/2019-05-21/cl-project-20190521-git.tgz 5426 1468189ff8880f43034c44adc317274f 879f47ff471149e1ad26ac3dfef124aeaceabd95 cl-project-20190521-git cl-project-test.asd cl-project.asd -cl-prolog2 http://beta.quicklisp.org/archive/cl-prolog2/2019-12-27/cl-prolog2-20191227-git.tgz 15590 9d662a6a868c59b66ddb91eae285a959 e09fa6b9921d8986e94738f7fc04a17426b08f27 cl-prolog2-20191227-git bprolog/cl-prolog2.bprolog.asd bprolog/cl-prolog2.bprolog.test.asd cl-prolog2.asd cl-prolog2.test.asd gprolog/cl-prolog2.gprolog.asd gprolog/cl-prolog2.gprolog.test.asd swi/cl-prolog2.swi.asd swi/cl-prolog2.swi.test.asd xsb/cl-prolog2.xsb.asd xsb/cl-prolog2.xsb.test.asd yap/cl-prolog2.yap.asd yap/cl-prolog2.yap.test.asd -cl-protobufs http://beta.quicklisp.org/archive/cl-protobufs/2018-03-28/cl-protobufs-20180328-git.tgz 590732 6573322beb8f27653f0c9b418c5f5b92 85505d3372e06de350a639f55e0e297cd364bcbd cl-protobufs-20180328-git cl-protobufs.asd tests/cl-protobufs-tests.asd -cl-pslib http://beta.quicklisp.org/archive/cl-pslib/2019-12-27/cl-pslib-20191227-git.tgz 41611 89c65c71420ab24a673c60fb68fc317f 14da423eee96d3ac21b4cee5481c85c2628eaf99 cl-pslib-20191227-git cl-pslib.asd -cl-pslib-barcode http://beta.quicklisp.org/archive/cl-pslib-barcode/2019-05-21/cl-pslib-barcode-20190521-git.tgz 25499 fa5459d7daee9546d972c859633d6fe9 3e954175d90c4b76c2b1697f97993f1ada1e67a3 cl-pslib-barcode-20190521-git cl-pslib-barcode.asd -cl-punch http://beta.quicklisp.org/archive/cl-punch/2019-01-07/cl-punch-20190107-git.tgz 1994 b5c6400872ae19221bf5a17f34750c63 e85b56b80563b86ab01b174561df88628c1ece7e cl-punch-20190107-git cl-punch-test.asd cl-punch.asd -cl-python http://beta.quicklisp.org/archive/cl-python/2019-08-13/cl-python-20190813-git.tgz 236882 c802663b1ac6cfa03df0e01c027a817a 3b554320dc2a5fdf31a91df9703f33250b2aaecd cl-python-20190813-git clpython.asd -cl-qprint http://beta.quicklisp.org/archive/cl-qprint/2015-08-04/cl-qprint-20150804-git.tgz 33969 74376a69e0b078724c94cc268f69e0f7 2e2600e7a6ea7c1c21df10f3fb37a531fa1c9382 cl-qprint-20150804-git cl-qprint.asd -cl-qrencode http://beta.quicklisp.org/archive/cl-qrencode/2019-10-07/cl-qrencode-20191007-git.tgz 31145 e94ac1137949ef70dea11ca78431e956 0e6589fa846a65032275cbb576bc13d194476b8f cl-qrencode-20191007-git cl-qrencode-test.asd cl-qrencode.asd -cl-quickcheck http://beta.quicklisp.org/archive/cl-quickcheck/2018-12-10/cl-quickcheck-20181210-git.tgz 18643 e17b3f199c97bfce961c1f9fa2c7602b e7eba42a2283c32af232a8e453c4155af6140a33 cl-quickcheck-20181210-git cl-quickcheck.asd -cl-rabbit http://beta.quicklisp.org/archive/cl-rabbit/2019-07-10/cl-rabbit-20190710-git.tgz 19444 1367680ba8d742821e98a0af16f5df48 a5b026d7e660368aae76cb95a1ac6e606818c447 cl-rabbit-20190710-git cl-rabbit-tests.asd cl-rabbit.asd -cl-rail http://beta.quicklisp.org/archive/cl-rail/2017-12-27/cl-rail-20171227-git.tgz 3644 7da276363c4b689b0bfd85edb449b5d2 95cfb2281dd525f4e6597364a7896022dc715939 cl-rail-20171227-git rail.asd -cl-randist http://beta.quicklisp.org/archive/cl-randist/2015-01-13/cl-randist-20150113-git.tgz 29385 3e79d7d52e4410f2dc2c9bd7287a9379 91d4779af0ce0a9d62364950780ac2d7ded03316 cl-randist-20150113-git cl-randist.asd -cl-random http://beta.quicklisp.org/archive/cl-random/2018-03-28/cl-random-20180328-git.tgz 47082 0f302ea0cf77c5120e85cda903a1026e 46bc508532878a29dfc9cd99fe61c0e18c9c88cc cl-random-20180328-git cl-random.asd -cl-random-forest http://beta.quicklisp.org/archive/cl-random-forest/2019-12-27/cl-random-forest-20191227-git.tgz 64264 f6ef2c6fb92a5763efad27aec06be165 60d5aa0fdc5c3570609ef25685946b4b73d4ab9f cl-random-forest-20191227-git cl-random-forest-test.asd cl-random-forest.asd -cl-rcfiles http://beta.quicklisp.org/archive/cl-rcfiles/2011-12-03/cl-rcfiles-20111203-http.tgz 1905 c6d90a1fe1488fba48dfc8174e829c63 58fbfde7a9339e3129ab1f67da5da7fbe13a493d cl-rcfiles-20111203-http com.dvlsoft.rcfiles.asd -cl-rdfxml http://beta.quicklisp.org/archive/cl-rdfxml/2014-07-13/cl-rdfxml-20140713-git.tgz 24185 ec6e7be8c793352109ab0b633c67c9b8 c27a5bb25404175ec960dccb0805fe8ff82caf5e cl-rdfxml-20140713-git cl-rdfxml.asd -cl-rdkafka http://beta.quicklisp.org/archive/cl-rdkafka/2019-11-30/cl-rdkafka-20191130-git.tgz 42963 4a0cf0f90eea364de2832ef973d9fd74 9481c15a668512774ec086b88b5465fa845ce10a cl-rdkafka-20191130-git cl-rdkafka.asd -cl-readline http://beta.quicklisp.org/archive/cl-readline/2019-08-13/cl-readline-20190813-git.tgz 74175 18272faddf5576e08e0976d98d7475c4 a92e5832b658ff3fdf78d3448636839b86eadd35 cl-readline-20190813-git cl-readline.asd -cl-recaptcha http://beta.quicklisp.org/archive/cl-recaptcha/2015-06-08/cl-recaptcha-20150608-git.tgz 2351 02198a25a246df0e1d2326d5a46bb9bb 127298018d8364bbc2b8c6763c772eef5d55651d cl-recaptcha-20150608-git cl-recaptcha.asd -cl-reddit http://beta.quicklisp.org/archive/cl-reddit/2019-05-21/cl-reddit-20190521-git.tgz 10181 23c2901b8bbffaefd648e8cf5e79db72 5f45f83eceb917e3ca830e714a11c3272078e8e3 cl-reddit-20190521-git cl-reddit.asd -cl-redis http://beta.quicklisp.org/archive/cl-redis/2019-11-30/cl-redis-20191130-git.tgz 25337 74f15acfea85009ca1d6807b35565c20 e2d90d578b588fc9ca4af915ef4dca8609b8ab6b cl-redis-20191130-git cl-redis.asd -cl-reexport http://beta.quicklisp.org/archive/cl-reexport/2015-07-09/cl-reexport-20150709-git.tgz 2621 207d02771cbd906d033ff704ca5c3a3d 5c0c92aab4f892e585116168c3622daf86e5f2ca cl-reexport-20150709-git cl-reexport-test.asd cl-reexport.asd -cl-rethinkdb http://beta.quicklisp.org/archive/cl-rethinkdb/2016-08-25/cl-rethinkdb-20160825-git.tgz 32793 b08605b7cfdc8351472c3764c1c86120 2d087d3e621659974f63a6c3a5fb28c1f22244bc cl-rethinkdb-20160825-git cl-rethinkdb-test.asd cl-rethinkdb.asd -cl-rfc2047 http://beta.quicklisp.org/archive/cl-rfc2047/2015-08-04/cl-rfc2047-20150804-git.tgz 6167 18e4a78b37f0b6bfb650907cb1dc8a17 4554d0124034923310e5134da555a5ac86c810e8 cl-rfc2047-20150804-git cl-rfc2047.asd test/cl-rfc2047-test.asd -cl-riff http://beta.quicklisp.org/archive/cl-riff/2018-01-31/cl-riff-20180131-git.tgz 3545 ab459dd87a44dea617ff845d4fc71191 4469a44389e88b68dff496dfa0b65c9530676400 cl-riff-20180131-git cl-riff.asd -cl-rlimit http://beta.quicklisp.org/archive/cl-rlimit/2015-06-08/cl-rlimit-20150608-git.tgz 3785 ea8d2343b95011bce0de3b699adf0cee 96e1fb8e23a5ad62b865930843dd6150488b8d84 cl-rlimit-20150608-git cl-rlimit.asd -cl-rmath http://beta.quicklisp.org/archive/cl-rmath/2018-03-28/cl-rmath-20180328-git.tgz 5219 0a7e999618e9381b458fea9703774f45 eb85ac5db3f73bba9f919287232e4ea895354424 cl-rmath-20180328-git cl-rmath.asd -cl-routes http://beta.quicklisp.org/archive/cl-routes/2017-01-24/cl-routes-20170124-git.tgz 16959 00cf290e3908eae5cfe4291da87fb7ec b6cf44512de1794cd364a428bd184b9663e8dfc6 cl-routes-20170124-git routes.asd -cl-rrd http://beta.quicklisp.org/archive/cl-rrd/2013-01-28/cl-rrd-20130128-git.tgz 6990 6ed1292cb978445d9952e464d547d149 e820e55875b893f4014ae7358768e480f0d1a28c cl-rrd-20130128-git cl-rrd.asd -cl-rrt http://beta.quicklisp.org/archive/cl-rrt/2015-06-08/cl-rrt-20150608-git.tgz 120843 eeb595209ff5b0c7a6c8c03b918c21c1 25c4808063a57c1af41122e1e17e17159ecc8568 cl-rrt-20150608-git cl-rrt.asd cl-rrt.benchmark.asd cl-rrt.rtree.asd cl-rrt.test.asd -cl-rss http://beta.quicklisp.org/archive/cl-rss/2015-09-23/cl-rss-20150923-git.tgz 6625 9aef52d11324357d191bd4f08cfb8db8 f53cfacd06eb140c1676eca5b1fb953546d5db5f cl-rss-20150923-git rss.asd -cl-rsvg2 http://beta.quicklisp.org/archive/cl-rsvg2/2012-01-07/cl-rsvg2-20120107-git.tgz 52077 a3843a8d8bb4a009252eb70b1cb6cf5d dac64d5abfdaca3743acf1d3b9f8cdf78fba659d cl-rsvg2-20120107-git cl-rsvg2-pixbuf.asd cl-rsvg2-test.asd cl-rsvg2.asd -cl-rules http://beta.quicklisp.org/archive/cl-rules/2019-07-10/cl-rules-20190710-git.tgz 19882 1630f82d032594f14e3eb73afa7cca02 30a3aa278f1df25ed0279dd26a755164d559c2e3 cl-rules-20190710-git cl-rules-test.asd cl-rules.asd -cl-s3 http://beta.quicklisp.org/archive/cl-s3/2013-01-28/cl-s3-20130128-git.tgz 5843 4d064571012b9604f35d38b54d394357 07603d2daf79010091a344f9818c07b435c2d5f2 cl-s3-20130128-git cl-s3.asd -cl-sam http://beta.quicklisp.org/archive/cl-sam/2015-06-08/cl-sam-20150608-git.tgz 4054488 63b1c3bb023e3ef06e5f3855e6144b24 b3e8816022b2cbed60171db86596242905c0edf3 cl-sam-20150608-git cl-sam-test.asd cl-sam.asd -cl-sandbox http://beta.quicklisp.org/archive/cl-sandbox/2018-01-31/cl-sandbox-20180131-git.tgz 6539 86be3668d5ac97547a5043a48f155303 fc1e5b23275df9e8fadea34ac67a19a52b6e1073 cl-sandbox-20180131-git cl-sandbox.asd -cl-sane http://beta.quicklisp.org/archive/cl-sane/2015-06-08/cl-sane-20150608-git.tgz 9398 eb13c4f10552e26bc25a3a262416b71d c956a99e26239fb1c7a7646a9372c1fe7d616c24 cl-sane-20150608-git sane.asd -cl-sanitize http://beta.quicklisp.org/archive/cl-sanitize/2013-07-20/cl-sanitize-20130720-git.tgz 14858 704397eb4bfd6eef71f7bdbba5a672bf 2cf5ca23dcb811cad0796d45ee062d30cc4ad682 cl-sanitize-20130720-git sanitize.asd -cl-sasl http://beta.quicklisp.org/archive/cl-sasl/2019-05-21/cl-sasl-v0.3.2.tgz 7083 61105fc8faf396a39fc9d9c3400b3c21 bed7a2a1a1908c83f5ee47d8d698aba828a12d83 cl-sasl-v0.3.2 cl-sasl.asd -cl-sat http://beta.quicklisp.org/archive/cl-sat/2019-08-13/cl-sat-20190813-git.tgz 18954 3f787f59692c9e962d2d37b2bec74da4 31adeffae9e4d430ac294ca80bb96302ba013372 cl-sat-20190813-git cl-sat.asd cl-sat.test.asd -cl-sat.glucose http://beta.quicklisp.org/archive/cl-sat.glucose/2019-08-13/cl-sat.glucose-20190813-git.tgz 2987 dc40b48ee3f9dcf7cbe9ab4a7c30f8a3 e8c69c7a3bf8f00b18c30cb271af3a96400a3a7d cl-sat.glucose-20190813-git cl-sat.glucose.asd cl-sat.glucose.test.asd -cl-sat.minisat http://beta.quicklisp.org/archive/cl-sat.minisat/2019-08-13/cl-sat.minisat-20190813-git.tgz 2868 25c3abddf6c4cbf76772862bd0d53ee6 9f63b2656623707b841a20d3af40557d3b374e87 cl-sat.minisat-20190813-git cl-sat.minisat.asd cl-sat.minisat.test.asd -cl-scram http://beta.quicklisp.org/archive/cl-scram/2015-09-23/cl-scram-20150923-git.tgz 5503 a010b20d5532a08fc85c2c532ddea09f 3e7475151f474a9d54817daebef5590da99a78a1 cl-scram-20150923-git cl-scram.asd -cl-scribd http://beta.quicklisp.org/archive/cl-scribd/2013-03-12/cl-scribd-20130312-git.tgz 3363 b87c90e9a765d543c2edf464479d5f88 c7995da5ad011d99cd74fee78889138678cf71d2 cl-scribd-20130312-git cl-scribd.asd -cl-scripting http://beta.quicklisp.org/archive/cl-scripting/2017-04-03/cl-scripting-20170403-git.tgz 3953 796475a259527bf7519811c2f567c4ec b56d960acee0ae374f0593ecb72c6900dacb5213 cl-scripting-20170403-git cl-scripting.asd -cl-scrobbler http://beta.quicklisp.org/archive/cl-scrobbler/2011-11-05/cl-scrobbler-20111105-git.tgz 10687 367d3741fc72df62a122ef7188117409 e14659ef82c2107a42ae6767c3137597a72202c1 cl-scrobbler-20111105-git cl-scrobbler.asd -cl-scsu http://beta.quicklisp.org/archive/cl-scsu/2019-05-21/cl-scsu-20190521-git.tgz 19345 057ab3d9bb1cfc12d0fae38e3ae4fd9d da65307115d9439ad16ee89359251eecf2ba0de8 cl-scsu-20190521-git cl-scsu-test.asd cl-scsu.asd -cl-sdl2 http://beta.quicklisp.org/archive/cl-sdl2/2019-11-30/cl-sdl2-20191130-git.tgz 1522180 ece07c78f925f43dddc5b99101248fe7 cdfbc6a245d8bf0f94fccfb75592bd0db1471999 cl-sdl2-20191130-git sdl2.asd -cl-sdl2-image http://beta.quicklisp.org/archive/cl-sdl2-image/2019-02-02/cl-sdl2-image-20190202-git.tgz 400442 d0771409506b37b0f56d0258396d31fd da0dd9f2ca73880afd6303d6f9a616ce976ce486 cl-sdl2-image-20190202-git sdl2-image.asd -cl-sdl2-mixer http://beta.quicklisp.org/archive/cl-sdl2-mixer/2018-10-18/cl-sdl2-mixer-20181018-git.tgz 365901 f5206e179e3fac259cce41b819b5e94d a5a406f8ffd8f08549951d63b919b4dc8dc01d0d cl-sdl2-mixer-20181018-git sdl2-mixer.asd -cl-sdl2-ttf http://beta.quicklisp.org/archive/cl-sdl2-ttf/2018-10-18/cl-sdl2-ttf-20181018-git.tgz 857358 4c174535752393ad7ed1e3546602584e b134b8a4a8ab3d4e9e1293fa70e1a7a8308bd395 cl-sdl2-ttf-20181018-git sdl2-ttf-examples.asd sdl2-ttf.asd -cl-selenium http://beta.quicklisp.org/archive/cl-selenium/2016-05-31/cl-selenium-20160531-git.tgz 15740 308b72c1bdad85a13bf79803c822ee95 9fa23dcb879cab1c8894e0bf8e207490c5acd8a3 cl-selenium-20160531-git selenium.asd -cl-selenium-webdriver http://beta.quicklisp.org/archive/cl-selenium-webdriver/2018-03-28/cl-selenium-webdriver-20180328-git.tgz 7935 d9ee1973788ddfd81380a33495c4ec85 1b90f0da0d3ce8d74e408be28b2c4884b7885b2a cl-selenium-webdriver-20180328-git cl-selenium-test.asd cl-selenium.asd -cl-sentiment http://beta.quicklisp.org/archive/cl-sentiment/2013-01-28/cl-sentiment-20130128-git.tgz 15819 2f3445dffa9105370751fa8ba7c2005c fc4a0651df4d453162919d5bd43540cba491c81e cl-sentiment-20130128-git cl-sentiment.asd -cl-server-manager http://beta.quicklisp.org/archive/cl-server-manager/2013-10-03/cl-server-manager-20131003-git.tgz 4564 046913915897f50caec525748a58cc01 8d8183ebce0e93f9e5e8f6a807b915995c1e6359 cl-server-manager-20131003-git cl-server-manager.asd -cl-shellwords http://beta.quicklisp.org/archive/cl-shellwords/2015-09-23/cl-shellwords-20150923-git.tgz 3943 c2c62c6a2ce4ed2590d60707ead2e084 e925f0d8cc96238116bc7f29b75eb3572e9ce325 cl-shellwords-20150923-git cl-shellwords-test.asd cl-shellwords.asd -cl-shlex http://beta.quicklisp.org/archive/cl-shlex/2019-10-07/cl-shlex-20191007-git.tgz 8580 814f4b1055bbd8423263a6ed5bde564a 1f5471b3cbe80db08b4162a413baa26c42b3b6aa cl-shlex-20191007-git shlex.asd -cl-simple-concurrent-jobs http://beta.quicklisp.org/archive/cl-simple-concurrent-jobs/2015-05-05/cl-simple-concurrent-jobs-20150505-git.tgz 4297 01612838d9d398b13eec9a5b0bc28abb ebe1febd1180f311c340458960719d74cb8bda21 cl-simple-concurrent-jobs-20150505-git cl-simple-concurrent-jobs.asd -cl-simple-fsm http://beta.quicklisp.org/archive/cl-simple-fsm/2019-12-27/cl-simple-fsm-20191227-git.tgz 3517 98e5f4fd0a0ab2cb328fe84db00e82c0 643aae5a3f87b97798b4bbac27925ac5dcdc1b5b cl-simple-fsm-20191227-git finite-state-machine.asd -cl-simple-table http://beta.quicklisp.org/archive/cl-simple-table/2013-03-12/cl-simple-table-20130312-git.tgz 5746 6b100dbdefa432b04a9dd2b36a7aa47b 701fddeefc3cbb1220fc31f7fcbd56294c7aa2a2 cl-simple-table-20130312-git cl-simple-table.asd -cl-singleton-mixin http://beta.quicklisp.org/archive/cl-singleton-mixin/2015-05-05/cl-singleton-mixin-20150505-git.tgz 2088 dbe6e7e009c5051cb4920e9965eff799 20a7748134ec477d642afc98e2a6117e817f8588 cl-singleton-mixin-20150505-git cl-singleton-mixin-test.asd cl-singleton-mixin.asd -cl-skip-list http://beta.quicklisp.org/archive/cl-skip-list/2013-06-15/cl-skip-list-20130615-git.tgz 13233 d8c7b91764103aa5f3db7dbf839968a3 999911f84161239c37601b3d87ed5f9792ee74c2 cl-skip-list-20130615-git cl-skip-list.asd -cl-skkserv http://beta.quicklisp.org/archive/cl-skkserv/2019-05-21/cl-skkserv-20190521-git.tgz 28061 10b4fd63908e842dd7b68abfaaf0a0d3 c2f6d01c3ae857e3acf6aba2fb9e35753fd1277a cl-skkserv-20190521-git cl-skkserv.asd -cl-sl4a http://beta.quicklisp.org/archive/cl-sl4a/2015-08-04/cl-sl4a-20150804-git.tgz 1951 dbfee5c96a7f36682929591319236b24 346a2d6dd6942fa65cd5326a15d127b86a3a99b3 cl-sl4a-20150804-git cl-android.asd -cl-slice http://beta.quicklisp.org/archive/cl-slice/2017-11-30/cl-slice-20171130-git.tgz 7633 b83a7a9aa503dc01cba43cf1e494e67d 0b4a4ecdec181ee34d57fca9d02a91d91a31594e cl-slice-20171130-git cl-slice.asd -cl-slp http://beta.quicklisp.org/archive/cl-slp/2014-08-26/cl-slp-20140826-git.tgz 7716 24dfaadf60cd54dfa811aa9d4e37d07e 0e6a27441f94c6e6ce46e0aead20fc9b2db4dfc7 cl-slp-20140826-git cl-slp.asd -cl-slug http://beta.quicklisp.org/archive/cl-slug/2018-02-28/cl-slug-20180228-git.tgz 7416 2b59b63bb9a234cb14959fda6f12fa2e 9512dd1601d8bcc265598fe6e49cdddf772eeb8f cl-slug-20180228-git cl-slug-test.asd cl-slug.asd -cl-smt-lib http://beta.quicklisp.org/archive/cl-smt-lib/2019-10-07/cl-smt-lib-20191007-git.tgz 4112 5c2af5fbcc3ec8863e909cad6cb921a7 be7e36d0edb1697685edd17839b2ca08aa50b91f cl-smt-lib-20191007-git cl-smt-lib.asd -cl-smtp http://beta.quicklisp.org/archive/cl-smtp/2019-11-30/cl-smtp-20191130-git.tgz 37408 880f09b9fd22e358d1b94a3caf3bd34b 9a19db97a6f0d4e1cc90ae2c03a989f723bcba71 cl-smtp-20191130-git cl-smtp.asd -cl-soil http://beta.quicklisp.org/archive/cl-soil/2018-08-31/cl-soil-release-quicklisp-f27087ce-git.tgz 330400 e26e1e23f2a4bf10a4e4d7c8e2fcd70c 6d7ad0c6aef48bb614d85a709222afcefa75c692 cl-soil-release-quicklisp-f27087ce-git cl-soil.asd -cl-soloud http://beta.quicklisp.org/archive/cl-soloud/2019-07-10/cl-soloud-20190710-git.tgz 521503 59b094adf83863dbf491001ec9dc0e33 f028ca7c4cbc2c3aa86a4341fdeb61e3d9482db4 cl-soloud-20190710-git cl-soloud.asd -cl-sophia http://beta.quicklisp.org/archive/cl-sophia/2015-06-08/cl-sophia-20150608-git.tgz 5748 4fa639f26d38c37be18c0d4e0da4b153 186948212d713ac7bac820f476e63a372b591b69 cl-sophia-20150608-git cl-sophia.asd -cl-spark http://beta.quicklisp.org/archive/cl-spark/2015-07-09/cl-spark-20150709-git.tgz 12519 0eec4e41100c4bbb0ab512e779399604 674f1bc695ae33dc00ab02502078af72720bf098 cl-spark-20150709-git cl-spark-test.asd cl-spark.asd -cl-speedy-queue http://beta.quicklisp.org/archive/cl-speedy-queue/2015-03-02/cl-speedy-queue-20150302-git.tgz 3631 509d1acf7e4cfcef99127de75b16521f 476412e42d63703c0b070d23e7e4cbd389d447e9 cl-speedy-queue-20150302-git cl-speedy-queue.asd -cl-sphinx http://beta.quicklisp.org/archive/cl-sphinx/2011-06-19/cl-sphinx-20110619-git.tgz 162782 0aa9e282a8ecc190b788d121071373d6 2ca537aaaac0a4d45151b6a7c8ca71909d10ff5d cl-sphinx-20110619-git sphinx.asd -cl-spidev http://beta.quicklisp.org/archive/cl-spidev/2019-07-10/cl-spidev-20190710-git.tgz 10495 59a6d3341753da1fed9b05864deaabc4 b9338baf09481b93f21f16cea80fc9023b195807 cl-spidev-20190710-git cl-spidev.asd -cl-splicing-macro http://beta.quicklisp.org/archive/cl-splicing-macro/2014-07-13/cl-splicing-macro-20140713-git.tgz 3041 d9ff0c4c0aa1a649ae7f6866ae5ce570 9b0b263f55f29e0dc141c8928f0151ce21bad99f cl-splicing-macro-20140713-git cl-splicing-macro.asd -cl-sqlite http://beta.quicklisp.org/archive/cl-sqlite/2019-08-13/cl-sqlite-20190813-git.tgz 14632 2269773eeb4a101ddd3b33f0f7e05e76 4edb0bfcfc4ec79ab48038c420e415b817c054f8 cl-sqlite-20190813-git sqlite.asd -cl-ssdb http://beta.quicklisp.org/archive/cl-ssdb/2017-08-30/cl-ssdb-20170830-git.tgz 16126 82ae579cf245edd48997fcb45c5a901c 3056cf48da051b98929d584dc5b841a2d15d55bd cl-ssdb-20170830-git cl-ssdb-test.asd cl-ssdb.asd -cl-statsd http://beta.quicklisp.org/archive/cl-statsd/2017-01-24/cl-statsd-20170124-git.tgz 6437 bc58e298a1cf3657375eeb7e9981d993 65edf0606df6f93ff2b212c619c1f315e68a0de1 cl-statsd-20170124-git cl-statsd.asd cl-statsd.test.asd -cl-stdutils http://beta.quicklisp.org/archive/cl-stdutils/2011-10-01/cl-stdutils-20111001-git.tgz 114509 0fa8879ce4004924ff1f534e9fb92dba 4204504d7107cd3eae33550c4e00797fa4dfba98 cl-stdutils-20111001-git stdutils.asd -cl-steamworks http://beta.quicklisp.org/archive/cl-steamworks/2019-08-13/cl-steamworks-20190813-git.tgz 99838 790744d59a1435552a001ed6c32b9c48 d9e683874159eae48619172982b9595248aad946 cl-steamworks-20190813-git cl-steamworks-generator.asd cl-steamworks.asd -cl-stomp http://beta.quicklisp.org/archive/cl-stomp/2019-05-21/cl-stomp-20190521-git.tgz 7487 8f0ec87e3a0bb05e97bf5e4d2509074e a9f15eac2d88439c1d93b7dec9a12a7262dd32f3 cl-stomp-20190521-git cl-stomp.asd -cl-stopwatch http://beta.quicklisp.org/archive/cl-stopwatch/2019-03-07/cl-stopwatch-20190307-hg.tgz 3481 f8aca8aac1dcaa3ff818e558dfb8471b 3963d39f4cdba3e518f0d027124d647592e77545 cl-stopwatch-20190307-hg cl-stopwatch.asd -cl-store http://beta.quicklisp.org/archive/cl-store/2019-11-30/cl-store-20191130-git.tgz 47654 d6052274cd0c6a86bfc2de1e4a8a0886 e486b6ae28113215280cb5d3bbf30f1ad5804613 cl-store-20191130-git cl-store.asd -cl-str http://beta.quicklisp.org/archive/cl-str/2019-12-27/cl-str-20191227-git.tgz 14864 b2800b32209061b274432c7e699d92b4 4b48d2a3a9348897e1318dffa9f8b574d57d5000 cl-str-20191227-git str.asd str.test.asd -cl-stream http://beta.quicklisp.org/archive/cl-stream/2019-05-21/cl-stream-20190521-git.tgz 10083 99bb43715db14c688bb32be11e4fee8b bd4e03b1155b2a3fe9a9a6faaae493f48bc0ad95 cl-stream-20190521-git cl-stream.asd -cl-strftime http://beta.quicklisp.org/archive/cl-strftime/2016-03-18/cl-strftime-20160318-git.tgz 7797 73097d6d00eca45c52ca5bedc99d0146 27c12e403c68bd330feffadd2b766cb9db160347 cl-strftime-20160318-git cl-strftime.asd -cl-string-complete http://beta.quicklisp.org/archive/cl-string-complete/2019-03-07/cl-string-complete-20190307-hg.tgz 5305 e828ace268105ad02b58ed26498ad28f eab194a8bfb0efe55ac8f0c7d8411e5e16408556 cl-string-complete-20190307-hg cl-string-complete.asd -cl-string-match http://beta.quicklisp.org/archive/cl-string-match/2019-03-07/cl-string-match-20190307-hg.tgz 176593 68e27c214f63e7c30f1e0c2ccad86131 7d2a654be746559ace31ef188a977826f86a0bfe cl-string-match-20190307-hg ascii-strings.asd cl-string-match-test.asd cl-string-match.asd simple-scanf.asd -cl-strings http://beta.quicklisp.org/archive/cl-strings/2018-01-31/cl-strings-20180131-git.tgz 11078 c10eee2534f8476b59acf13f34787a56 5256d9d0725aa96208b47d91a565f6e005670bba cl-strings-20180131-git cl-strings.asd -cl-svg http://beta.quicklisp.org/archive/cl-svg/2018-02-28/cl-svg-20180228-git.tgz 83379 672145ecadef2259a3833886dbe68617 1640e08a5ddbcc328a3b4240c13ff91cac3c5454 cl-svg-20180228-git cl-svg.asd -cl-svm http://beta.quicklisp.org/archive/cl-svm/2011-04-18/cl-svm-20110418-git.tgz 435539 c093c5810a77b5258a6b463168c7c8bb 8e4d8ad0cb5ec177c2373b14c251c5932a84615b cl-svm-20110418-git cl-svm.asd -cl-swagger-codegen http://beta.quicklisp.org/archive/cl-swagger-codegen/2018-08-31/cl-swagger-codegen-20180831-git.tgz 43309 5066805afea5280e16e3e58f05cd88e1 9b69504759ff81308c486b266ff3484d2a6e8531 cl-swagger-codegen-20180831-git cl-swagger.asd -cl-sxml http://beta.quicklisp.org/archive/cl-sxml/2016-08-25/cl-sxml-20160825-git.tgz 15206 5bf02bf2dcb4ddf1c1a869a0ff7277df f993c08874902296c2b2b6ddcbc21cae0cfbbbda cl-sxml-20160825-git cl-sxml.asd -cl-syntax http://beta.quicklisp.org/archive/cl-syntax/2015-04-07/cl-syntax-20150407-git.tgz 3102 602b84143aafe59d65f4e08ac20a124a e00e7def72875fd635f7e9d27e24fd3f23076247 cl-syntax-20150407-git cl-syntax-annot.asd cl-syntax-anonfun.asd cl-syntax-clsql.asd cl-syntax-fare-quasiquote.asd cl-syntax-interpol.asd cl-syntax-markup.asd cl-syntax.asd -cl-syslog http://beta.quicklisp.org/archive/cl-syslog/2019-02-02/cl-syslog-20190202-git.tgz 14759 eafff19eb1f38a36a9535c729d2217fe de0c891d0168db0a3079707794b5fafae6d99282 cl-syslog-20190202-git cl-syslog.asd -cl-table http://beta.quicklisp.org/archive/cl-table/2013-01-28/cl-table-20130128-git.tgz 4002 793e1222aebf00d28d4ec58173bd36b5 93e0aa5fb21ae9722e78814471019d1c2c62f6a3 cl-table-20130128-git cl-table.asd -cl-tasukete http://beta.quicklisp.org/archive/cl-tasukete/2018-02-28/cl-tasukete-20180228-git.tgz 5602 f4dc086f01e384684b371fbcf631c29b 793c27bce80661019dd5920e02074e538bd22855 cl-tasukete-20180228-git cl-tasukete-test.asd cl-tasukete.asd -cl-tcod http://beta.quicklisp.org/archive/cl-tcod/2019-03-07/cl-tcod-20190307-hg.tgz 88998 19b214124c8034ef7fab350ee8cac85d 7c1935d7f9d77ec4e954396b175a12e00ff4bb32 cl-tcod-20190307-hg parse-rgb.asd tcod.asd -cl-template http://beta.quicklisp.org/archive/cl-template/2013-06-15/cl-template-20130615-git.tgz 8316 9ff3872864a04535fa4fdd541e5fef70 3407880226be0be8fd02890e3ef18a2c9c8899f6 cl-template-20130615-git cl-template.asd -cl-tesseract http://beta.quicklisp.org/archive/cl-tesseract/2017-11-30/cl-tesseract-20171130-git.tgz 8190 761384aa2cde1733a96d6fca82d00750 98cef4ac03acf09549444079e5da579b19ebdc7a cl-tesseract-20171130-git cl-tesseract.asd -cl-tetris3d http://beta.quicklisp.org/archive/cl-tetris3d/2018-12-10/cl-tetris3d-20181210-git.tgz 5744 66d1a4aa18316e25bc0a7df127be71e7 5ea752a06b16d0d4aff9ad6a1bf5acc3eda92faf cl-tetris3d-20181210-git cl-tetris3d.asd -cl-textmagic http://beta.quicklisp.org/archive/cl-textmagic/2015-12-18/cl-textmagic-20151218-git.tgz 2035 f746d2e7ddea99e9cbe443e4a6c08175 3473012d8f21242b2a9bb6a85544938fe2c4a536 cl-textmagic-20151218-git cl-textmagic-test.asd cl-textmagic.asd -cl-tga http://beta.quicklisp.org/archive/cl-tga/2016-03-18/cl-tga-20160318-git.tgz 312452 84bf8ad6fc66ffd2519b933469ae3660 2d2b8b4fd47dde90818f6600bd73bf3cc0ede60f cl-tga-20160318-git cl-tga.asd -cl-threadpool http://beta.quicklisp.org/archive/cl-threadpool/2018-02-28/cl-threadpool-quickload-current-release-67b33ca4-git.tgz 7043 24d77e379a133b440f1ef61ba375ac68 24ab5b625c94a9dd1521bacc44da7316d4260060 cl-threadpool-quickload-current-release-67b33ca4-git cl-threadpool-test.asd cl-threadpool.asd -cl-tidy http://beta.quicklisp.org/archive/cl-tidy/2017-08-30/cl-tidy-20170830-git.tgz 6451 753b926424eaf57415e3cdb2545f4b51 8510d6d70053a5dcf0471a22507013b245695875 cl-tidy-20170830-git cl-tidy.asd -cl-tiled http://beta.quicklisp.org/archive/cl-tiled/2019-11-30/cl-tiled-20191130-git.tgz 18051 9b235a4a51b858842661c95871f72855 7e6134e180a45e3f52502be2f0f580be5538f25a cl-tiled-20191130-git cl-tiled.asd -cl-tk http://beta.quicklisp.org/archive/cl-tk/2015-06-08/cl-tk-20150608-git.tgz 11254 c6711a6dea114a6c3dec446420eec0f7 a69f6d26b9018482347f83542b91d5f913c13d4c cl-tk-20150608-git cl-tk.asd -cl-tld http://beta.quicklisp.org/archive/cl-tld/2014-09-14/cl-tld-20140914-git.tgz 42598 c1a599db2ff8f0bb76acb206743b8d98 bb55b6b60e8cf822c80fb220117d81b809616325 cl-tld-20140914-git cl-tld.asd -cl-tokyo-cabinet http://beta.quicklisp.org/archive/cl-tokyo-cabinet/2016-08-25/cl-tokyo-cabinet-20160825-git.tgz 19667 00d4bb23e393c6966b4acf17d9184627 9d22fd186290b36752b32010589d8f6b6c31024d cl-tokyo-cabinet-20160825-git cl-tokyo-cabinet-test.asd cl-tokyo-cabinet.asd -cl-toml http://beta.quicklisp.org/archive/cl-toml/2019-11-30/cl-toml-20191130-git.tgz 8835 093bee6524054b0b515d52db070eb300 8cf25c892ca26097b7d4880e49b8d32439ed4095 cl-toml-20191130-git cl-toml-test.asd cl-toml.asd -cl-torrents http://beta.quicklisp.org/archive/cl-torrents/2019-12-27/cl-torrents-20191227-git.tgz 579423 11d40517d088db7dbc506dede11ac452 c0707a0ffcfef7844340d48ea004ea5b6806f4b9 cl-torrents-20191227-git torrents-test.asd torrents.asd -cl-transmission http://beta.quicklisp.org/archive/cl-transmission/2019-11-30/cl-transmission-20191130-git.tgz 8850 403607bb79c4df111d3af41d03607b76 da1f5bf1637e728c1da70439e85a73016cafcee7 cl-transmission-20191130-git cl-transmission-test.asd cl-transmission.asd -cl-trie http://beta.quicklisp.org/archive/cl-trie/2018-02-28/cl-trie-20180228-git.tgz 11400 20a0f0facbed0ccfad54bfeac6dcbba7 3e5dc74d7aeb063b2cdb3a8a267b946606c1e541 cl-trie-20180228-git cl-trie-examples.asd cl-trie.asd -cl-tulip-graph http://beta.quicklisp.org/archive/cl-tulip-graph/2013-06-15/cl-tulip-graph-20130615-git.tgz 14772 eaf9d92e3bffcf93220052fd42b4d002 060726c29d1b14f683149de192541e5b30a99877 cl-tulip-graph-20130615-git cl-tulip-graph.asd -cl-tuples http://beta.quicklisp.org/archive/cl-tuples/2014-07-13/cl-tuples-20140713-git.tgz 28047 8676dd7e0be1af17f5ffa8aac21d0ab3 c977ce6c441bd413c363d63cc99382ff33192dff cl-tuples-20140713-git cl-tuples.asd -cl-twitter http://beta.quicklisp.org/archive/cl-twitter/2018-02-28/cl-twitter-20180228-git.tgz 70934 83638a0508cda507500ef9e633f6cec4 620458f22d28ab5e6f33027c492e7fe1cae28c48 cl-twitter-20180228-git cl-twit-repl.asd cl-twitter.asd twitter-mongodb-driver.asd -cl-typesetting http://beta.quicklisp.org/archive/cl-typesetting/2017-08-30/cl-typesetting-20170830-git.tgz 335971 e12b9f249c60c220c5dc4a0939eb3343 25acaabf4593729cebb2c2ee79d056633f9b2fdb cl-typesetting-20170830-git cl-typesetting.asd contrib/xhtml-renderer/xml-render.asd documentation/lisp-source/cl-pdf-doc.asd -cl-uglify-js http://beta.quicklisp.org/archive/cl-uglify-js/2015-07-09/cl-uglify-js-20150709-git.tgz 17631 f0ac4a43bb9da2478e995802b86df6dd b806550d06d7844466d36235876ff0a1698e854b cl-uglify-js-20150709-git cl-uglify-js.asd -cl-unicode http://beta.quicklisp.org/archive/cl-unicode/2019-05-21/cl-unicode-20190521-git.tgz 590698 04009a1266edbdda4d38902907caba25 58b893a1a34cee2803c9bfcc1ff1ac1056741c96 cl-unicode-20190521-git cl-unicode.asd -cl-unification http://beta.quicklisp.org/archive/cl-unification/2019-01-07/cl-unification-20190107-git.tgz 32390 a7a12789cc48e571b0871d55cef11b7f de98a21a56c2a219afca5cfc43b4cd8f74ed1abb cl-unification-20190107-git cl-unification-lib.asd cl-unification-test.asd cl-unification.asd lib-dependent/cl-ppcre-template.asd -cl-utilities http://beta.quicklisp.org/archive/cl-utilities/2010-10-06/cl-utilities-1.2.4.tgz 22998 c3a4ba38b627448d3ed40ce888048940 187862251617676b95b1386e277fb2c449472bf8 cl-utilities-1.2.4 cl-utilities.asd -cl-variates http://beta.quicklisp.org/archive/cl-variates/2018-01-31/cl-variates-20180131-darcs.tgz 13536 dd441faa5cf87e4f41102c4a2323f95f 0ee1831ebbfe0c3efb4a5a02936f8a01b624abcc cl-variates-20180131-darcs cl-variates.asd -cl-vectors http://beta.quicklisp.org/archive/cl-vectors/2018-02-28/cl-vectors-20180228-git.tgz 31415 9d9629786d4f2c19c15cc6cd3049c343 55f19b15187b1a1026c7fd139fedf3cb7663847b cl-vectors-20180228-git cl-aa-misc.asd cl-aa.asd cl-paths-ttf.asd cl-paths.asd cl-vectors.asd -cl-vhdl http://beta.quicklisp.org/archive/cl-vhdl/2016-04-21/cl-vhdl-20160421-git.tgz 38493 1cae44b3e18d5b1416e9c3afb7382f76 030aa263142eff790f30a947c7b606b7b6021d97 cl-vhdl-20160421-git cl-vhdl.asd -cl-video http://beta.quicklisp.org/archive/cl-video/2018-02-28/cl-video-20180228-git.tgz 9729 1390350148bca3730b1a7d24e298d0e2 82c761ab17ae349f4ec7efff0f438e1dfa57af3d cl-video-20180228-git cl-video-avi.asd cl-video-gif.asd cl-video-player.asd cl-video-wav.asd cl-video.asd -cl-virtualbox http://beta.quicklisp.org/archive/cl-virtualbox/2018-08-31/cl-virtualbox-20180831-git.tgz 5029 f75919b162c344bf5b3bee1bf3f91e32 90de58049f50133366139c8e37e5e8548ff1bce9 cl-virtualbox-20180831-git cl-virtualbox.asd -cl-voxelize http://beta.quicklisp.org/archive/cl-voxelize/2015-07-09/cl-voxelize-20150709-git.tgz 118708 2e3d839d201d64659726f553bebd6ac0 104f867098b7cde4f4ccd449633cd9a407e8ce46 cl-voxelize-20150709-git cl-voxelize-examples.asd cl-voxelize-test.asd cl-voxelize.asd -cl-wadler-pprint http://beta.quicklisp.org/archive/cl-wadler-pprint/2019-10-07/cl-wadler-pprint-20191007-git.tgz 4900 030262f0ac47b84a4cfbfa3e423b7eee c68f97c39c540a1bcd35023df432e026b651ded3 cl-wadler-pprint-20191007-git cl-wadler-pprint.asd -cl-wav http://beta.quicklisp.org/archive/cl-wav/2018-01-31/cl-wav-20180131-git.tgz 3469 c487c47fb702747ad1e0faffe5b7d388 b45d07885c30d4205d3d952b3a20ead799574b2e cl-wav-20180131-git cl-wav.asd -cl-wayland http://beta.quicklisp.org/archive/cl-wayland/2019-03-07/cl-wayland-20190307-git.tgz 44560 31887db1bf34dcf36f3978c8004d4e0f 9a189cafa43b0da7d79a9421afa30bebbf7db6ec cl-wayland-20190307-git cl-wayland.asd -cl-weather-jp http://beta.quicklisp.org/archive/cl-weather-jp/2016-02-08/cl-weather-jp-20160208-git.tgz 3398 705667b6c865f440d1667ccc5f83a8fb 3c40d7f65d92a9485ec4bb8e89c0d0af8d5e73c3 cl-weather-jp-20160208-git cl-weather-jp-test.asd cl-weather-jp.asd -cl-webdav http://beta.quicklisp.org/archive/cl-webdav/2017-08-30/cl-webdav-20170830-git.tgz 77311 9b5b1bbe0b24734a652a464f6924a019 68cbdcabb6c6e8c61ff4757554efa3e83af3e2a1 cl-webdav-20170830-git cl-webdav.asd -cl-webkit http://beta.quicklisp.org/archive/cl-webkit/2017-12-27/cl-webkit-20171227-git.tgz 19659 defcdf910b41f57bc33030b491596f6f 1915c831bf12e3418db939e7828021ec0b35c402 cl-webkit-20171227-git dom/cl-webkit-dom.asd soup/cl-soup.asd tests/cl-webkit2-tests.asd webkit2/cl-webkit2.asd -cl-who http://beta.quicklisp.org/archive/cl-who/2019-07-10/cl-who-20190710-git.tgz 24786 e5bb2856ed62d76528e4cef7b5e701c0 5ef6d9b6609320a8f11655194b9139f5e0a1555a cl-who-20190710-git cl-who.asd -cl-why http://beta.quicklisp.org/archive/cl-why/2018-02-28/cl-why-20180228-git.tgz 25872 00a337f35a516372da41415d25fb879b 86790d0b92642b89a6fde16249597db175cfb407 cl-why-20180228-git cl-why.asd -cl-wordcut http://beta.quicklisp.org/archive/cl-wordcut/2016-04-21/cl-wordcut-20160421-git.tgz 301706 1f251cf2df7f1946887d09c82e3ce968 4b7bbb407529d93d44f9799646a19301c9a81826 cl-wordcut-20160421-git cl-wordcut.asd -cl-xdg http://beta.quicklisp.org/archive/cl-xdg/2017-01-24/cl-xdg-20170124-git.tgz 22666 eaf304bd5c23c58f45f161afe180c2d4 dbdcbe7542181ebf9bfde5c57f120543a937911a cl-xdg-20170124-git cl-xdg.asd -cl-xkb http://beta.quicklisp.org/archive/cl-xkb/2018-02-28/cl-xkb-20180228-git.tgz 2792 97ba20ff9ea183afe00ea2cf7e0469f4 1a9f7395f10de77372af1dceee3b930814ae3173 cl-xkb-20180228-git cl-xkb.asd -cl-xkeysym http://beta.quicklisp.org/archive/cl-xkeysym/2014-09-14/cl-xkeysym-20140914-git.tgz 38246 15ad40d06aa25589bdb59ac5ef485b8c 3d95e7111d9560e75772dbdbd6655b917ede6d47 cl-xkeysym-20140914-git cl-xkeysym.asd -cl-xmlspam http://beta.quicklisp.org/archive/cl-xmlspam/2010-10-06/cl-xmlspam-20101006-http.tgz 10705 6e3a0944e96e17916b1445f4207babb8 82b47ae3227d537486d6bea267c473a068729ecd cl-xmlspam-20101006-http cl-xmlspam.asd -cl-xmpp http://beta.quicklisp.org/archive/cl-xmpp/2010-10-06/cl-xmpp-0.8.1.tgz 15271 303b035edd3bde5aa85c423278298e88 23935110f714202ce650c7e31af12fbbc1f22130 cl-xmpp-0.8.1 cl-xmpp-sasl.asd cl-xmpp-tls.asd cl-xmpp.asd -cl-xul http://beta.quicklisp.org/archive/cl-xul/2016-03-18/cl-xul-20160318-git.tgz 518863 2fbb767b222e632df40a3b7a57aa7f3e 19ad37e6129833ed96d57f92246922462d8f9fb9 cl-xul-20160318-git cl-xul-test.asd cl-xul.asd -cl-yacc http://beta.quicklisp.org/archive/cl-yacc/2010-10-06/cl-yacc-20101006-darcs.tgz 18774 748b9d59de8be3ccfdf0f001e15972ba 7e224cde172cc9db229385fcef1ee411403f9ff6 cl-yacc-20101006-darcs yacc.asd -cl-yaclyaml http://beta.quicklisp.org/archive/cl-yaclyaml/2016-08-25/cl-yaclyaml-20160825-git.tgz 35546 73ddfe97a2b8214e319b366245a216c2 fd3ddd09d55fb1176db7b23f16e3874d6c5018a6 cl-yaclyaml-20160825-git cl-yaclyaml.asd -cl-yahoo-finance http://beta.quicklisp.org/archive/cl-yahoo-finance/2013-03-12/cl-yahoo-finance-20130312-git.tgz 7759 ef1129e9f2bd7afbdde50048db25cc94 9801bb213a303af511c38d63a126b718a2b65085 cl-yahoo-finance-20130312-git cl-yahoo-finance.asd -cl-yaml http://beta.quicklisp.org/archive/cl-yaml/2017-01-24/cl-yaml-20170124-git.tgz 13310 97c545287084ae110c9ef9a76f44285e 5cd19d7b27dde6dfe7322e09729589d5b7839798 cl-yaml-20170124-git cl-yaml-test.asd cl-yaml.asd -cl-yesql http://beta.quicklisp.org/archive/cl-yesql/2019-12-27/cl-yesql-20191227-git.tgz 13398 d3fdef812f1c623db325feddb748449f 4036cd4d7f36483f83c4df9be5c76aa440c90b41 cl-yesql-20191227-git cl-yesql.asd -cl-zmq http://beta.quicklisp.org/archive/cl-zmq/2016-03-18/cl-zmq-20160318-git.tgz 13519 2edc111c3fa50504eb2ef997f9ded9c4 b50410e4f435a9e85b3d91df8101fb2048594ab0 cl-zmq-20160318-git zeromq.asd -cl4store http://beta.quicklisp.org/archive/cl4store/2015-03-02/cl4store-20150302-git.tgz 11305 a1a877db84a10e143004f580317c682f b29433e5ff5be42bdf7cea25e30ff378e22aa935 cl4store-20150302-git cl4store-tests.asd cl4store.asd -clache http://beta.quicklisp.org/archive/clache/2017-11-30/clache-20171130-git.tgz 5875 e319e26205af015787e5cd893eeb58cd 2c09d8401c5e225019bb7393ca899e0056f31790 clache-20171130-git clache-test.asd clache.asd -clack http://beta.quicklisp.org/archive/clack/2019-10-07/clack-20191007-git.tgz 194174 25741855fa1e989d373ac06ddfabf351 b7adffcaef66722766d91b6cd684f2bf1123a839 clack-20191007-git clack-handler-fcgi.asd clack-handler-hunchentoot.asd clack-handler-toot.asd clack-handler-wookie.asd clack-socket.asd clack-test.asd clack-v1-compat.asd clack.asd t-clack-handler-fcgi.asd t-clack-handler-hunchentoot.asd t-clack-handler-toot.asd t-clack-handler-wookie.asd t-clack-v1-compat.asd v1-compat/clack-middleware-auth-basic.asd v1-compat/clack-middleware-clsql.asd v1-compat/clack-middleware-csrf.asd v1-compat/clack-middleware-dbi.asd v1-compat/clack-middleware-oauth.asd v1-compat/clack-middleware-postmodern.asd v1-compat/clack-middleware-rucksack.asd v1-compat/clack-session-store-dbi.asd v1-compat/t-clack-middleware-auth-basic.asd v1-compat/t-clack-middleware-csrf.asd -clack-errors http://beta.quicklisp.org/archive/clack-errors/2019-08-13/clack-errors-20190813-git.tgz 278838 bbae5cf71b4d95e5dbb51c1b8cc11ff0 35df80382645afdbc51214118d2542bd446e3e6a clack-errors-20190813-git clack-errors-demo.asd clack-errors-test.asd clack-errors.asd lack-middleware-clack-errors.asd -clack-pretend http://beta.quicklisp.org/archive/clack-pretend/2017-11-30/clack-pretend-20171130-git.tgz 6573 618f531237dd52bfd5a5a821adaf2e39 a9979ccdd776ed6045de839bbd946f36162610e9 clack-pretend-20171130-git clack-pretend.asd -clack-static-asset-middleware http://beta.quicklisp.org/archive/clack-static-asset-middleware/2016-06-28/clack-static-asset-middleware-20160628-git.tgz 21786 9ee4736d1d084e1481454454a019b6fc 646c3fe12943be8d595913db958b2bc9bdcbaefe clack-static-asset-middleware-20160628-git clack-static-asset-djula-helpers.asd clack-static-asset-middleware-test.asd clack-static-asset-middleware.asd -clad http://beta.quicklisp.org/archive/clad/2019-03-07/clad-20190307-git.tgz 2549 bcac73710bff9ee6179f9c3b58f7da8e 36c35e7c4469b7ae22901c0c24e205fec94dc02e clad-20190307-git clad.asd -classimp http://beta.quicklisp.org/archive/classimp/2017-10-19/classimp-20171019-git.tgz 31643 25b91b1fa7d0b66c2ff89670fd6b54a9 5c31a29f474b74a20e0c91f253d44128450dcafc classimp-20171019-git classimp-samples.asd classimp.asd -classowary http://beta.quicklisp.org/archive/classowary/2019-10-07/classowary-20191007-git.tgz 24900 a2587986780a40251b0327686b817cc6 cce68e75254543ae11458499c408544f67dda874 classowary-20191007-git classowary-test.asd classowary.asd -clath http://beta.quicklisp.org/archive/clath/2017-11-30/clath-20171130-git.tgz 19773 e0c7ad1e7ac1c23f3ff8839ac48df7e8 0dea05c8eb86ad2816a4458cf15b1e5f5ec44a12 clath-20171130-git clath.asd cljwt-custom.asd -clavatar http://beta.quicklisp.org/archive/clavatar/2012-10-13/clavatar-20121013-git.tgz 3375 2861593e34c92b4faa7edb77be6044bb caf33a796f42b398be84fb304753622550cd41f1 clavatar-20121013-git clavatar.asd -clavier http://beta.quicklisp.org/archive/clavier/2017-08-30/clavier-20170830-git.tgz 7176 f6a24e93771e4426843fe5d13a3ff9b9 b3750931a63da718edec5a58e169adb00a3e24a9 clavier-20170830-git clavier.asd clavier.test.asd -claw http://beta.quicklisp.org/archive/claw/2018-08-31/claw-stable-9877cb7d-git.tgz 30850 6395c0bc853474d8ffb7a12754ccaade d9b1acdca9ecfaec7371f87452b6062e13cd81b0 claw-stable-9877cb7d-git claw.asd -clawk http://beta.quicklisp.org/archive/clawk/2011-11-05/clawk-20111105-git.tgz 14059 8ca7378b4dbae7d51644834cd9641f67 eaf0348d0ddcd167ed799e3b19d2eb976982537e clawk-20111105-git clawk.asd -clazy http://beta.quicklisp.org/archive/clazy/2019-01-07/clazy-20190107-git.tgz 24055 e0c29871eb4c7e80658511e9d20de6ea 3eeac3b7b971ea4ef80ebafafacbf650dc0e61f3 clazy-20190107-git clazy.asd -clem http://beta.quicklisp.org/archive/clem/2019-03-07/clem-20190307-git.tgz 84528 444f88b3b087a833d005b2b11f218e39 fd1abd391562801cc472c1e73bb74235b421cc01 clem-20190307-git clem-benchmark.asd clem-test.asd clem.asd -cleric http://beta.quicklisp.org/archive/cleric/2014-11-06/cleric-20141106-git.tgz 19915 2d51ed0118d3e4bd2c72668f109687a7 1226afbf0cd42110008438f9f283d3c52b2bfc46 cleric-20141106-git cleric-test.asd cleric.asd -clesh http://beta.quicklisp.org/archive/clesh/2019-07-10/clesh-20190710-git.tgz 8024 a9ce7e59326ca10074be1b73a1bfe83d e557ae5bff0ff9d20c43c91b63804c24049f6f79 clesh-20190710-git clesh-tests.asd clesh.asd -cletris http://beta.quicklisp.org/archive/cletris/2015-10-31/cletris-20151031-git.tgz 190792 d5b1f4c3a76675498491d191cadc7414 13e5975c8e01aedc97e4d14e5c1355e06c1fa6da cletris-20151031-git cletris-network.asd cletris-test.asd cletris.asd -clfswm http://beta.quicklisp.org/archive/clfswm/2016-12-04/clfswm-20161204-git.tgz 282721 dc976785ef899837ab0fc50a4ed6b740 f745e9682f549b4d92d31e3e7fcec68d561af370 clfswm-20161204-git clfswm.asd -clhs http://beta.quicklisp.org/archive/clhs/2015-04-07/clhs-0.6.3.tgz 2238743 37b804be8696e555a74f240ebc17bbc6 f1c4c385996573194e15316c2f4167f6d3998859 clhs-0.6.3 clhs.asd -clickr http://beta.quicklisp.org/archive/clickr/2014-07-13/clickr-20140713-git.tgz 23238 264cae768921c6e264d909bb4c40e873 af914f21f5a5cac958bfd57128000580dab268e5 clickr-20140713-git clickr.asd -clim-widgets http://beta.quicklisp.org/archive/clim-widgets/2018-02-28/clim-widgets-20180228-git.tgz 12167 b7f7093c7702fc6718c8b693a0ca9a6d db343ca3b774bb82515726ed5a509eb248b5e6a1 clim-widgets-20180228-git clim-widgets.asd -climacs http://beta.quicklisp.org/archive/climacs/2019-01-07/climacs-20190107-git.tgz 111467 a9b75b0f78c15d60ad47f7b87e68c903 c8d7a8ef35285367211e7867e1cd3f66891159bf climacs-20190107-git climacs.asd -climc http://beta.quicklisp.org/archive/climc/2015-09-23/climc-20150923-git.tgz 214296 c6ada8af39d27cf972f269fb2b0e3778 47cb3636d8a6bef908a58b6662d1020bbe6bf40a climc-20150923-git climc-test.asd climc.asd -climon http://beta.quicklisp.org/archive/climon/2015-10-31/climon-20151031-git.tgz 1005444 8e47631f5e0f6157e6581e746c5d3edf 6d02953a6250f423579e25efd65c1b5d2f1b6cec climon-20151031-git climon-test.asd climon.asd -clinch http://beta.quicklisp.org/archive/clinch/2018-02-28/clinch-20180228-git.tgz 15291213 26477d753d550ae020ae95c60315d8b3 232f53345667193c6f4899ab6322d31066e31eef clinch-20180228-git clinch-cairo.asd clinch-classimp.asd clinch-freeimage.asd clinch-pango.asd clinch.asd -clinenoise http://beta.quicklisp.org/archive/clinenoise/2018-01-31/clinenoise-20180131-git.tgz 5651 b72593638356978c952e69dc56fab335 c7837c33b327e4cf7db670804de80652e096d3c3 clinenoise-20180131-git clinenoise.asd -clip http://beta.quicklisp.org/archive/clip/2019-07-10/clip-20190710-git.tgz 23116 3a990d1a030d153c76def305df568c77 a48649b95c51b239c6f11ec4e592dd377c40a31c clip-20190710-git clip.asd -clipper http://beta.quicklisp.org/archive/clipper/2015-09-23/clipper-20150923-git.tgz 30698 a8d3f3fa89f2d31dd864a55a93604973 d45c4f34e7ea6db2ad08811d2f2b104dd9e5afbc clipper-20150923-git clipper-test.asd clipper.asd -clite http://beta.quicklisp.org/archive/clite/2013-06-15/clite-20130615-git.tgz 4207 e9ec17416118a4bc561b7ac0b1c8fe55 a33f68199901025b79110bb113ac204b47008231 clite-20130615-git clite.asd -clml http://beta.quicklisp.org/archive/clml/2018-08-31/clml-20180831-git.tgz 1008543 4c16c4b23748faa9f35e158f782404c2 358e2da5905a6b151724cd72e16d0bbde32aab7f clml-20180831-git addons/fork-future/fork-future.asd addons/future/future.asd association-rule/clml.association-rule.asd blas/clml.blas.asd blas/f2cl-lib.asd classifiers/clml.classifiers.asd clml.asd clustering/clml.clustering.asd data/clml.data.asd data/r-datasets/clml.data.r-datasets.asd decision-tree/clml.decision-tree.asd docs/clml.docs.asd graph/clml.graph.asd hjs/clml.hjs.asd lapack/clml.lapack.asd nearest-search/clml.nearest-search.asd nonparametric/clml.nonparametric.asd numeric/clml.numeric.asd pca/clml.pca.asd som/clml.som.asd statistics/clml.statistics.asd statistics/clml.statistics.rand.asd svm/clml.svm.asd test/clml.test.asd text/clml.text.asd time-series/clml.time-series.asd utility/clml.utility.asd -clnuplot http://beta.quicklisp.org/archive/clnuplot/2013-01-28/clnuplot-20130128-darcs.tgz 31274 0e5dccbbbe3408b3e0aebf639691c6a0 6a2749d3b7ef6bd1325b92160bb9eee35f099c96 clnuplot-20130128-darcs clnuplot.asd -clobber http://beta.quicklisp.org/archive/clobber/2019-05-21/clobber-20190521-git.tgz 6301 2a2d5490aa21ed847eff57bae8148582 f26247f00fc4821bb9a71756359ea4c78515d52c clobber-20190521-git clobber.asd -clod http://beta.quicklisp.org/archive/clod/2019-03-07/clod-20190307-hg.tgz 98259 df582b015aa80397402eee3bb5a13288 c3bc36581145c5abc6126b2c3ba88386f6ba7876 clod-20190307-hg clod.asd -clods-export http://beta.quicklisp.org/archive/clods-export/2017-10-19/clods-export-20171019-git.tgz 19990 342fb1799b9f0c2549666b204f9cb322 6554a4c2d68216e9fa33dc67a6096886c153df40 clods-export-20171019-git clods-export.asd -clon http://beta.quicklisp.org/archive/clon/2011-03-20/clon-20110320-git.tgz 7926 92c40493948d3466d1b149a000985ce0 db47fb37cae16262070c9d711ec49dd01b0075c0 clon-20110320-git clon-test.asd clon.asd -clonsigna http://beta.quicklisp.org/archive/clonsigna/2012-09-09/clonsigna-20120909-git.tgz 42948 3ae74680c33dfd5880914dac3873357c 11bf0a3df0e3309a054015629c01a282148208e5 clonsigna-20120909-git clonsigna.asd -clos-diff http://beta.quicklisp.org/archive/clos-diff/2015-06-08/clos-diff-20150608-git.tgz 14486 88dbce5dc199deb2ee44e7cb73946db0 8825ffc50639addefd79f604addcacf17309f512 clos-diff-20150608-git clos-diff.asd -clos-fixtures http://beta.quicklisp.org/archive/clos-fixtures/2016-08-25/clos-fixtures-20160825-git.tgz 2687 68898ca907a135d733ecdadb3f8b5723 75e8f147882b9e7fb56519a8c8a91d00798b1df7 clos-fixtures-20160825-git clos-fixtures-test.asd clos-fixtures.asd -closer-mop http://beta.quicklisp.org/archive/closer-mop/2019-12-27/closer-mop-20191227-git.tgz 23507 67dda2ff56690bb8eec6131983605031 7e849ccb36b31b485f8bb4b6a84f84ba03ced65c closer-mop-20191227-git closer-mop.asd -closure-common http://beta.quicklisp.org/archive/closure-common/2018-10-18/closure-common-20181018-git.tgz 27833 b09ee60c258a29f0c107960ec4c04ada 42e2f882070d49d3224c15a304354afb29f97841 closure-common-20181018-git closure-common.asd -closure-html http://beta.quicklisp.org/archive/closure-html/2018-07-11/closure-html-20180711-git.tgz 103413 461dc8caa65385da5f2d1cd8dd4f965f d8e52dc5d129aec699cd405c14a9080d01199506 closure-html-20180711-git closure-html.asd -clouchdb http://beta.quicklisp.org/archive/clouchdb/2012-04-07/clouchdb_0.0.16.tgz 33759 d39f8e71a5e1954b40af4291f0c05757 7d254f6edf1a28300e4c4c3fa387b4cfcdf24b28 clouchdb_0.0.16 clouchdb-examples.asd clouchdb.asd -clsql http://beta.quicklisp.org/archive/clsql/2016-02-08/clsql-20160208-git.tgz 968869 d1da7688361337a7de4fe7452c225a06 6cefb5c9d783acecb94b66e288faba7d1d7367e2 clsql-20160208-git clsql-aodbc.asd clsql-cffi.asd clsql-mysql.asd clsql-odbc.asd clsql-postgresql-socket.asd clsql-postgresql-socket3.asd clsql-postgresql.asd clsql-sqlite.asd clsql-sqlite3.asd clsql-tests.asd clsql-uffi.asd clsql.asd -clsql-fluid http://beta.quicklisp.org/archive/clsql-fluid/2017-08-30/clsql-fluid-20170830-git.tgz 4361 cd6191a16e81af2670f3ed84b29995b8 af7e03aca8277efe730c86075f3587be71a357c1 clsql-fluid-20170830-git clsql-fluid.asd -clsql-helper http://beta.quicklisp.org/archive/clsql-helper/2018-01-31/clsql-helper-20180131-git.tgz 31200 e3040bc42b24c8b0845abcd4a74d3db4 b92225c63d358fac585ce63bc132cca4bac1f50c clsql-helper-20180131-git clsql-helper-slot-coercer.asd clsql-helper.asd -clsql-local-time http://beta.quicklisp.org/archive/clsql-local-time/2019-11-30/clsql-local-time-20191130-git.tgz 1688 180d36508b76a5d9728f3e88fda8047d c0d26ade44c4ffbae84db81db346a6de3c727477 clsql-local-time-20191130-git clsql-local-time.asd -clsql-orm http://beta.quicklisp.org/archive/clsql-orm/2016-02-08/clsql-orm-20160208-git.tgz 19760 40b31c2bfbf7b27f35b362fc4cffb6bf 4d07a98d77328076b0844f4708c56087f5618426 clsql-orm-20160208-git clsql-orm.asd -clss http://beta.quicklisp.org/archive/clss/2019-11-30/clss-20191130-git.tgz 20000 9910677b36df00f3046905a9b84122a9 440121bc862ddcd72c421df4ade798ecfb26242a clss-20191130-git clss.asd -cltcl http://beta.quicklisp.org/archive/cltcl/2016-12-04/cltcl-20161204-git.tgz 338065 bb57496aeea233c7adb04e3bb6eca551 8d9140fafe4658324f8b354159cdef6d8c9d174b cltcl-20161204-git cltcl.asd -clump http://beta.quicklisp.org/archive/clump/2016-08-25/clump-20160825-git.tgz 25593 5132d2800138d435ef69f7e68b025c8f 68760a1e2e6e28ecf8f45e5b766774bc3a18e369 clump-20160825-git 2-3-tree/clump-2-3-tree.asd Binary-tree/clump-binary-tree.asd Test/clump-test.asd clump.asd -clunit http://beta.quicklisp.org/archive/clunit/2017-10-19/clunit-20171019-git.tgz 76811 389017f2f05a6287078ddacd0471817e 26340b858b8c784b90cda75ab57470410507d191 clunit-20171019-git clunit.asd -clunit2 http://beta.quicklisp.org/archive/clunit2/2018-10-18/clunit2-20181018-git.tgz 77822 44d69b87557a924fe8d49eaac739c20e cbb4457813e643061d977a5c5817f6a956888ed3 clunit2-20181018-git clunit2.asd -clutz http://beta.quicklisp.org/archive/clutz/2018-02-28/clutz-stable-0a544be0-git.tgz 2523 544e6326659345ecd6db81f774995660 1e9575546d2b360c777fb08aa8db7a61df62e651 clutz-stable-0a544be0-git clutz.asd -clweb http://beta.quicklisp.org/archive/clweb/2018-04-30/clweb-20180430-git.tgz 138871 a57892e3a6fe9fa2dbe7a2c1865e82c6 a37cbe2c941a71c08dbe47a5de7f55b9caeedc84 clweb-20180430-git clweb.asd -clws http://beta.quicklisp.org/archive/clws/2013-08-13/clws-20130813-git.tgz 32371 11a801aadeda244b749c2b36a19b9af9 521463b0aef355a1307f911327fee5ed5d65854d clws-20130813-git clws.asd -clx http://beta.quicklisp.org/archive/clx/2019-11-30/clx-20191130-git.tgz 457343 61e86a60727732df62c9fa383535fc89 0a39c0f03919c2e5c7730ef9c760fdd1f9471f6e clx-20191130-git clx.asd -clx-cursor http://beta.quicklisp.org/archive/clx-cursor/2018-01-31/clx-cursor-20180131-git.tgz 183731 227e05446493e0fc20836aeb90c0e500 6b37027d762656bb0b9fcaf82fa865b2dd57173c clx-cursor-20180131-git clx-cursor.asd -clx-truetype http://beta.quicklisp.org/archive/clx-truetype/2016-08-25/clx-truetype-20160825-git.tgz 376571 7c9dedb21d52dedf727de741ac6d9c60 9902edbe06af953b755beca024521c21d3f068c6 clx-truetype-20160825-git clx-truetype.asd -clx-xembed http://beta.quicklisp.org/archive/clx-xembed/2019-11-30/clx-xembed-20191130-git.tgz 21169 11d35eeb734c0694005a5e5cec4cad22 27ec06dc8e843deb1fd1b01058e78627e5dbf424 clx-xembed-20191130-git xembed.asd -clx-xkeyboard http://beta.quicklisp.org/archive/clx-xkeyboard/2012-08-11/clx-xkeyboard-20120811-git.tgz 47002 4e382b34e05d33f5de8e9c9dea33131c f18ddbbf8f7e5222cb44e2543386a8efd49abb7c clx-xkeyboard-20120811-git xkeyboard.asd -cmake-parser http://beta.quicklisp.org/archive/cmake-parser/2018-08-31/cmake-parser-20180831-git.tgz 5470 901e49335a490ad419aec7bcd4493d47 adc648f94bfc8e9e0834075e88f4098dafd9e982 cmake-parser-20180831-git cmake-parser.asd -cmu-infix http://beta.quicklisp.org/archive/cmu-infix/2018-02-28/cmu-infix-20180228-git.tgz 22615 6baab7e8fdbb211c1b1622073b9521c9 408f16c7594f02f53e39ea8b7684721d12406435 cmu-infix-20180228-git cmu-infix-tests.asd cmu-infix.asd -codata-recommended-values http://beta.quicklisp.org/archive/codata-recommended-values/2017-10-19/codata-recommended-values-20171019-git.tgz 186586 99a0ddb582b1182f499d0c94e41a45e9 628cba44e3699d2bb9194be9ceeac63c453008b5 codata-recommended-values-20171019-git codata-recommended-values.asd -codex http://beta.quicklisp.org/archive/codex/2018-12-10/codex-20181210-git.tgz 185947 7c33d0361d2e50d968aade71461443f4 7d7ee6fbc90ecdaa755d4f2f1b986d24d03ff912 codex-20181210-git codex-templates.asd codex.asd -coleslaw http://beta.quicklisp.org/archive/coleslaw/2019-11-30/coleslaw-20191130-git.tgz 165818 6c356af48e856daacfcd067c9e9a40af ce4f0603534ad09748bdbf16305084433f9ad6a1 coleslaw-20191130-git coleslaw-cli.asd coleslaw-test.asd coleslaw.asd -collectors http://beta.quicklisp.org/archive/collectors/2016-12-04/collectors-20161204-git.tgz 10522 59c8c885a8e512d4f09e73d3e0c97b1f 1e386552e3b2900580e3972c46152fb776dcc28a collectors-20161204-git collectors.asd -colleen http://beta.quicklisp.org/archive/colleen/2018-10-18/colleen-20181018-git.tgz 145758 b20ec13f6a9612e0f496af7eccb24f54 950fa71177e3966ae52eb7a986d9ceeeb5e117ed colleen-20181018-git colleen.asd -colliflower http://beta.quicklisp.org/archive/colliflower/2015-12-18/colliflower-20151218-git.tgz 24042 68f0d511fe9429919859b184e6b564e1 c02b61ea1e6f1732201ce36d3718c3eab9bce190 colliflower-20151218-git colliflower-test.asd colliflower.asd contrib/fset/colliflower-fset.asd garten/garten.asd liter/liter.asd silo/silo.asd -colorize http://beta.quicklisp.org/archive/colorize/2018-02-28/colorize-20180228-git.tgz 39488 1bc08c8f76b747e4d254669a205dc611 e0658fa18ae562a802f987eff7f16a8bc78906f8 colorize-20180228-git colorize.asd -com.clearly-useful.generic-collection-interface http://beta.quicklisp.org/archive/com.clearly-useful.generic-collection-interface/2019-07-10/com.clearly-useful.generic-collection-interface-20190710-git.tgz 14043 b22496129d4171c50de7ab85da024cc0 0dac346508bb07e3237054a0554c2c6d28153020 com.clearly-useful.generic-collection-interface-20190710-git com.clearly-useful.generic-collection-interface.asd com.clearly-useful.generic-collection-interface.test.asd -com.clearly-useful.iterate-plus http://beta.quicklisp.org/archive/com.clearly-useful.iterate-plus/2012-10-13/com.clearly-useful.iterate-plus-20121013-git.tgz 1981 691606442da9344a1b871a986dc83a42 c7a315d2b09d7666def427dc37cad324317caf51 com.clearly-useful.iterate-plus-20121013-git com.clearly-useful.iterate+.asd -com.clearly-useful.iterator-protocol http://beta.quicklisp.org/archive/com.clearly-useful.iterator-protocol/2013-03-12/com.clearly-useful.iterator-protocol-20130312-git.tgz 2846 b6219074982d29677ebf5a7ae1b5a22e 5f9051fdccbd78f3c919112a67acf80587c921d9 com.clearly-useful.iterator-protocol-20130312-git com.clearly-useful.iterator-protocol.asd -com.clearly-useful.protocols http://beta.quicklisp.org/archive/com.clearly-useful.protocols/2013-03-12/com.clearly-useful.protocols-20130312-git.tgz 8625 7a230b991c6f410f2f1f1cc016aa3ae1 174ae8cc771b48bc36f4ae2ee3dfb80fef266d60 com.clearly-useful.protocols-20130312-git com.clearly-useful.protocols.asd -com.google.base http://beta.quicklisp.org/archive/com.google.base/2015-10-31/com.google.base-20151031-git.tgz 6837 3ed818c26feeee4eba6dacbe4be622d5 51b658344270cf398a34798b321a377ca855bb8a com.google.base-20151031-git com.google.base-test.asd com.google.base.asd -command-line-arguments http://beta.quicklisp.org/archive/command-line-arguments/2019-12-27/command-line-arguments-20191227-git.tgz 11927 3ed82e1536b55fc0b7abc79626631aab 213d0538910a379a65c7919b2d39aee3abfe2cab command-line-arguments-20191227-git command-line-arguments.asd -common-doc http://beta.quicklisp.org/archive/common-doc/2016-04-21/common-doc-20160421-git.tgz 51299 516b26eb281a2c7a13161eb2346915f8 1a70ab2230e492f5f3a0bfb6ad8adc3a25332537 common-doc-20160421-git common-doc-contrib.asd common-doc-gnuplot.asd common-doc-graphviz.asd common-doc-include.asd common-doc-split-paragraphs.asd common-doc-test.asd common-doc-tex.asd common-doc.asd -common-doc-plump http://beta.quicklisp.org/archive/common-doc-plump/2016-04-21/common-doc-plump-20160421-git.tgz 6172 5e53d47b0bb2ad2d5bc1d6686b1446ba dc865b5fd8705da9ddbb20a44742ec5454679e12 common-doc-plump-20160421-git common-doc-plump-test.asd common-doc-plump.asd -common-html http://beta.quicklisp.org/archive/common-html/2016-04-21/common-html-20160421-git.tgz 7660 ab70df0dff34edb91d21b9eca3d5ba68 79ba08f283f191a1deeb0952447daded2e44cddf common-html-20160421-git common-html-test.asd common-html.asd -common-lisp-actors http://beta.quicklisp.org/archive/common-lisp-actors/2019-11-30/common-lisp-actors-20191130-git.tgz 4753 890e04c2f7df07e7180cbc7d81ed7bb5 5e927cacbb0fa3a49605423ca50b41626c1af00b common-lisp-actors-20191130-git cl-actors.asd -common-lisp-jupyter http://beta.quicklisp.org/archive/common-lisp-jupyter/2019-10-08/common-lisp-jupyter-20191008-git.tgz 84042 0a4b1e448dcaa528e7e43b2263a6bd59 2e3c7e7c98959c7200b651e744c43527ccdd2bd8 common-lisp-jupyter-20191008-git common-lisp-jupyter.asd -commonqt http://beta.quicklisp.org/archive/commonqt/2019-12-27/commonqt-20191227-git.tgz 61085 ec5826978ee14110ac866417388a24bf aaa433fca64abbf9b30d4714b8e1e9015bc2df37 commonqt-20191227-git qt+libs.asd qt-repl.asd qt-test.asd qt-tutorial.asd qt.asd -computable-reals http://beta.quicklisp.org/archive/computable-reals/2018-03-28/computable-reals-20180328-git.tgz 8146 9b7c4ffa4d91b1197be9f39621141175 f2d454e6bf5d6416d0a37605e9ec9f4a35c087f8 computable-reals-20180328-git computable-reals.asd -concrete-syntax-tree http://beta.quicklisp.org/archive/concrete-syntax-tree/2019-12-27/concrete-syntax-tree-20191227-git.tgz 42755 fc393a473bca784545f877c661e15fc7 36a516d426224a7d5e1e0b8bf06d608154ae7121 concrete-syntax-tree-20191227-git Destructuring/concrete-syntax-tree-destructuring.asd Lambda-list/Test/concrete-syntax-tree-lambda-list-test.asd Lambda-list/concrete-syntax-tree-lambda-list.asd Source-info/concrete-syntax-tree-source-info.asd concrete-syntax-tree-base.asd concrete-syntax-tree.asd -conduit-packages http://beta.quicklisp.org/archive/conduit-packages/2014-08-26/conduit-packages-20140826-http.tgz 5758 44257db8bdf0b87c42c5cb7e33e8efe3 a45e8aa50874f7837c4805df443266f9f496bb2a conduit-packages-20140826-http conduit-packages.asd -conf http://beta.quicklisp.org/archive/conf/2019-12-27/conf-20191227-git.tgz 15652 8b1e1498234b7b4d3ca9cd2f52b66415 9a5e80439fbb82d433465c632c8f901613a4baf5 conf-20191227-git conf.asd -configuration.options http://beta.quicklisp.org/archive/configuration.options/2019-07-10/configuration.options-20190710-git.tgz 129476 2ca51419ca5f6c62566cef94c5bf6c25 6a8c25c3a4ccb040f87f7b346df6d475fb8c415e configuration.options-20190710-git configuration.options-and-mop.asd configuration.options-and-puri.asd configuration.options-and-quri.asd configuration.options-and-service-provider.asd configuration.options-source-commandline.asd configuration.options-syntax-ini.asd configuration.options-syntax-xml.asd configuration.options.asd -conium http://beta.quicklisp.org/archive/conium/2018-08-31/conium-20180831-git.tgz 145062 60d1a37d859310d5bb50be5d2a011a1a 2ef38b57eda9a6bf6820729ab1ee6fddbe74cc2c conium-20180831-git conium.asd -consix http://beta.quicklisp.org/archive/consix/2014-12-17/consix-20141217-git.tgz 15428 6eb2f35075cab83f225f31bc72ffbb4f fb3e12d2614b5ec17d51bcc764990fbb997f4f2f consix-20141217-git consix.asd -constantfold http://beta.quicklisp.org/archive/constantfold/2019-12-27/constantfold-20191227-git.tgz 135729 e9e0021014c6f27280264be16166fee7 378cbed129d745f65125c9f3931f350e92d61c22 constantfold-20191227-git constantfold.asd constantfold.test.asd -contextl http://beta.quicklisp.org/archive/contextl/2019-05-21/contextl-20190521-git.tgz 26348 a4d8c6a69351ed26c0d8e26ebee0b8e1 c7ed0f7757991c10702a48c2d803344105075c23 contextl-20190521-git contextl.asd dynamic-wind.asd -copy-directory http://beta.quicklisp.org/archive/copy-directory/2016-06-28/copy-directory-20160628-git.tgz 2462 b82455b6979b785df488f990e156aa2b fe74b777a2f899c84de338f3c96b732cc1e2d06c copy-directory-20160628-git copy-directory-test.asd copy-directory.asd -corona http://beta.quicklisp.org/archive/corona/2016-08-25/corona-20160825-git.tgz 12412 75fdbf09861689695020ed0bcabb2bb3 bf12260d0c2c3b85f58fab8e872eaa059d9c12ca corona-20160825-git corona-test.asd corona-web.asd corona.asd -cover http://beta.quicklisp.org/archive/cover/2019-02-02/cover-20190202-git.tgz 17172 fdebe8767421553329d3620a2a0fcbc6 644769e371b3d0caaeb3cc676918a33dede6032a cover-20190202-git cover.asd -cqlcl http://beta.quicklisp.org/archive/cqlcl/2014-11-06/cqlcl-20141106-git.tgz 11896 2a63a524e1297e6a2577a29d63bd7ea2 7480e139c03880e1e41bca03ae6fde148a1ce161 cqlcl-20141106-git cqlcl.asd -crane http://beta.quicklisp.org/archive/crane/2016-02-08/crane-20160208-git.tgz 20738 df5119bed5754d9f7811efc770c09d47 d438f1997e83f251bb1b61653a2a0e6a08bccbda crane-20160208-git crane-test.asd crane.asd -croatoan http://beta.quicklisp.org/archive/croatoan/2019-12-27/croatoan-20191227-git.tgz 121276 beeb15e0c4008ad361d7ce20e1b72269 806cdd60ba813226684409a4c61978909343f10e croatoan-20191227-git croatoan-test.asd croatoan.asd -crypto-shortcuts http://beta.quicklisp.org/archive/crypto-shortcuts/2019-07-10/crypto-shortcuts-20190710-git.tgz 7150 2c6df84ebef1bc224c6c54c5112d0e04 bd30d942f16ef49e51a7dac01a799552d23c59fa crypto-shortcuts-20190710-git crypto-shortcuts.asd -cserial-port http://beta.quicklisp.org/archive/cserial-port/2017-04-03/cserial-port-20170403-git.tgz 10621 45e462dce2f7b68d1ca5e61906f115b3 4b2f943955a280573e46f95223f444a525759168 cserial-port-20170403-git cserial-port.asd -css-lite http://beta.quicklisp.org/archive/css-lite/2012-04-07/css-lite-20120407-git.tgz 6073 9b25afb0d2c3f0c32d2303ab1d3f570d 83ad13369198c8170fce93c6171f472fe8d7322a css-lite-20120407-git css-lite.asd -css-selectors http://beta.quicklisp.org/archive/css-selectors/2016-06-28/css-selectors-20160628-git.tgz 14832 28537144b89af4ebe28c2eb365d5569f 67e31993847a16f20b4eda93e1266644a426ff4c css-selectors-20160628-git css-selectors-simple-tree.asd css-selectors-stp.asd css-selectors.asd -csv http://beta.quicklisp.org/archive/csv/2019-07-10/csv-20190710-git.tgz 14041 cecd51e92195eb497c4b20d82c90930a 18cfd80c132c100ddac12ea2f82e9030783e0649 csv-20190710-git csv.asd -csv-parser http://beta.quicklisp.org/archive/csv-parser/2014-07-13/csv-parser-20140713-git.tgz 5012 d8f43b3da734b63f2064b7cd4c6f7550 033d33a6821c836cce4b2299e5ea688807ea12b3 csv-parser-20140713-git csv-parser.asd -cue-parser http://beta.quicklisp.org/archive/cue-parser/2018-02-28/cue-parser-20180228-git.tgz 6196 a762d2f16148e031ac658c19bc35fe95 dde1439487e627ca02f8d1e9641fbe40696b45bd cue-parser-20180228-git cue-parser.asd -curly http://beta.quicklisp.org/archive/curly/2012-04-07/curly-20120407-git.tgz 4647 abbdcfe5c08ee02a8f9014373db6fd86 adfe3715c7311e6a27755ca3da84155bcf93641a curly-20120407-git curly.asd -curry-compose-reader-macros http://beta.quicklisp.org/archive/curry-compose-reader-macros/2019-11-30/curry-compose-reader-macros-20191130-git.tgz 2800 013cf0caa673751961380f5f5d3d61be 25aa6825abe58369592458d8a5d855e7617ce396 curry-compose-reader-macros-20191130-git curry-compose-reader-macros.asd -curve http://beta.quicklisp.org/archive/curve/2013-01-28/curve-20130128-git.tgz 19617 f4c1a224405586a04d65cac6b38a5ccc 000367ed6ad72b814a533a633506ef30fda97271 curve-20130128-git com.elbeno.curve.asd -cxml http://beta.quicklisp.org/archive/cxml/2018-10-18/cxml-20181018-git.tgz 155061 33c5546de7099d65fdb2fbb716fd3de8 2e661fc6f2edb5d0d9c7923a4aa455803a90786b cxml-20181018-git cxml-dom.asd cxml-klacks.asd cxml-test.asd cxml.asd -cxml-rng http://beta.quicklisp.org/archive/cxml-rng/2019-07-10/cxml-rng-20190710-git.tgz 173375 ac7fb180022392f6cb689509bc14bab3 4cd12475c54fe7f34510a5d1d5b5fdb9c6403443 cxml-rng-20190710-git cxml-rng.asd -cxml-rpc http://beta.quicklisp.org/archive/cxml-rpc/2012-10-13/cxml-rpc-20121013-git.tgz 11422 58bca5e93a2f2eb5a5451e689b590c2b 0ada3a401ef59cbf83f0d4601b206895913711f6 cxml-rpc-20121013-git cxml-rpc.asd -cxml-stp http://beta.quicklisp.org/archive/cxml-stp/2019-05-21/cxml-stp-20190521-git.tgz 52265 9e0c99bd2b547e07b23305a5ff72aff6 d33d9dfe96de273f18696d15cf20e48c599f5678 cxml-stp-20190521-git cxml-stp.asd -daemon http://beta.quicklisp.org/archive/daemon/2017-04-03/daemon-20170403-git.tgz 4007 97d52817fa74191a6a07a49cd4a5b907 542f44f5a01f0d8bde303167edfa73cd2b5473cb daemon-20170403-git daemon.asd -dartsclemailaddress http://beta.quicklisp.org/archive/dartsclemailaddress/2016-04-21/dartsclemailaddress-quicklisp-release-48464635-git.tgz 11830 537619b8caa0c43db075a82f732a31ee bc0850e087137a945257bfafdc530b5f256ea5c6 dartsclemailaddress-quicklisp-release-48464635-git darts.lib.email-address-test.asd darts.lib.email-address.asd -dartsclhashtree http://beta.quicklisp.org/archive/dartsclhashtree/2019-11-30/dartsclhashtree-20191130-git.tgz 26824 98695e12a12439121037f85e65601406 2ca276fddec24d9815ad6646c4eb739267d371cf dartsclhashtree-20191130-git darts.lib.hashtree-test.asd darts.lib.hashtrie.asd darts.lib.wbtree.asd -dartsclmessagepack http://beta.quicklisp.org/archive/dartsclmessagepack/2015-05-05/dartsclmessagepack-20150505-git.tgz 8310 3323df326dfc7dc87219de82e14adaf7 5197fa8201d9dc3dccd13795058d49015dfcd57c dartsclmessagepack-20150505-git darts.lib.message-pack-test.asd darts.lib.message-pack.asd -dartsclsequencemetrics http://beta.quicklisp.org/archive/dartsclsequencemetrics/2013-03-12/dartsclsequencemetrics-20130312-git.tgz 8234 2440599722cb58ab64d30a687946166b 2a29fa7b05dff2273678b71dff33d1db79af1ff4 dartsclsequencemetrics-20130312-git darts.lib.sequence-metrics.asd -dartscltools http://beta.quicklisp.org/archive/dartscltools/2019-11-30/dartscltools-20191130-git.tgz 11484 87ea1ba235803b40f427fdcf844253e1 868175cc7f35ef717b1e2b67f55d3cdae4ae5fad dartscltools-20191130-git darts.lib.tools.asd -dartscluuid http://beta.quicklisp.org/archive/dartscluuid/2018-08-31/dartscluuid-20180831-git.tgz 7279 171eb01d8331bf101e4d4a8ca750e3e2 d532f54744a4578ced5481e49788dd034d02a0a0 dartscluuid-20180831-git darts.lib.uuid.asd -data-lens http://beta.quicklisp.org/archive/data-lens/2019-10-07/data-lens-20191007-git.tgz 39424 44764b0bc93f05b680e47c4f3b351a55 c41d78eea00a0beaf13d22a8868d6141842b5c34 data-lens-20191007-git data-lens.asd -data-sift http://beta.quicklisp.org/archive/data-sift/2013-01-28/data-sift-20130128-git.tgz 13070 2d023844d8a181dbbcc69368c3b90a9c 2ca3997e31fd229f29dc332b0a737ab23c62bb62 data-sift-20130128-git data-sift.asd -data-table http://beta.quicklisp.org/archive/data-table/2016-02-08/data-table-20160208-git.tgz 12042 0507150b0fcfdab96e0ef7668d31113c bfa3e175a53bea2d80b7358c7729e944d3781ec8 data-table-20160208-git data-table-clsql.asd data-table.asd -database-migrations http://beta.quicklisp.org/archive/database-migrations/2018-08-31/database-migrations-20180831-git.tgz 3983 2e3f0877c95e8fc8632a9fe7979bfe82 9c364cc2b74d76a3184be7e4a269e156521ae331 database-migrations-20180831-git database-migrations.asd -datafly http://beta.quicklisp.org/archive/datafly/2019-05-21/datafly-20190521-git.tgz 9762 e9f2d71b419516a501a5f9a782bf29d4 cfb320d68b303fa3851a70241bac28ee31aee280 datafly-20190521-git datafly-test.asd datafly.asd -datamuse http://beta.quicklisp.org/archive/datamuse/2019-12-27/datamuse-20191227-git.tgz 5912 a04c3124844336cdfad9bdb77828a11d d41fccf27d49d47e662345fc1e7ea06ef9498d04 datamuse-20191227-git datamuse.asd -date-calc http://beta.quicklisp.org/archive/date-calc/2019-12-27/date-calc-20191227-git.tgz 10417 fda245d738b350711fb614ba18ee01f4 6e55f21ffcedf6a36c8a212fde29a3ebb9f0ce85 date-calc-20191227-git date-calc.asd -datum-comments http://beta.quicklisp.org/archive/datum-comments/2019-08-13/datum-comments-20190813-git.tgz 3625 c3ad1f73fd4ece22e18f3b10106510f4 72113bce610b6b12d800586065c7425c70ae6fc8 datum-comments-20190813-git datum-comments.asd -dbd-oracle http://beta.quicklisp.org/archive/dbd-oracle/2018-03-28/dbd-oracle-20180328-git.tgz 39691 1e82985c46e557525af490981b5006ef fed08c112da3e508042b39d2bd47d59ceb4c3a1c dbd-oracle-20180328-git dbd-oracle-test.asd dbd-oracle.asd -dbus http://beta.quicklisp.org/archive/dbus/2019-05-21/dbus-20190521-git.tgz 23448 59e7ab92086503e4185273ec3f3ba3fc b63649ce3b7aae0107fb13d927a18e2d36cd284e dbus-20190521-git dbus.asd -de.setf.wilbur http://beta.quicklisp.org/archive/de.setf.wilbur/2018-12-10/de.setf.wilbur-20181210-git.tgz 77937 76864fbe1ad7bdf810efa74e2bb4765e 3a699742b7b8738c9f8cf51f391e9571f74b9f15 de.setf.wilbur-20181210-git src/wilbur.asd -declt http://beta.quicklisp.org/archive/declt/2019-11-30/declt-3.0.tgz 63861 3dff95e04c8e2e5b57ae0635b5cd32ec 519ceaae45727e2d7b982a53b657466714cf33bf declt-3.0 core/net.didierverna.declt.core.asd net.didierverna.declt.asd setup/net.didierverna.declt.setup.asd -deeds http://beta.quicklisp.org/archive/deeds/2019-07-10/deeds-20190710-git.tgz 35104 e450e559648cc639d52cd860c3f3acc6 833c7a206bc07c4671717d934d819b65157ec0be deeds-20190710-git deeds.asd -defclass-std http://beta.quicklisp.org/archive/defclass-std/2015-08-04/defclass-std-20150804-git.tgz 8922 cb335ba608a0ba468d3ab4ac8ab7d13c 8d3a192420a1124546d51844d5126732bb06635f defclass-std-20150804-git defclass-std-test.asd defclass-std.asd -defenum http://beta.quicklisp.org/archive/defenum/2019-01-07/defenum-20190107-git.tgz 13085 b6e5252710200ffff90cd26c551315eb aaffa0b7c21837ec518deae878c755be319dd07d defenum-20190107-git defenum.asd -deferred http://beta.quicklisp.org/archive/deferred/2019-07-10/deferred-20190710-git.tgz 5908 0830491b2d6bb9cfbc2a95036b9a7332 438d3927bc5dfe4215aaa39f79207e768ab45444 deferred-20190710-git deferred.asd -define-json-expander http://beta.quicklisp.org/archive/define-json-expander/2014-07-13/define-json-expander-20140713-git.tgz 5026 4f67d0f505ff548d386e3f6f3d24bef9 8ac3161ab7afd1de0a40473d86201b2fff87f17e define-json-expander-20140713-git define-json-expander.asd -definitions http://beta.quicklisp.org/archive/definitions/2019-10-07/definitions-20191007-git.tgz 22808 f108ab481145731b551d7e925658c1a1 e53c14d05bb4326f06e2165b751e5ab102c10761 definitions-20191007-git definitions.asd -definitions-systems http://beta.quicklisp.org/archive/definitions-systems/2018-12-10/definitions-systems-1.0.tgz 7147 611cd6ba8686c7644c6d0247e69e8118 af1e880079f06b7070f926e2a80de74f2d4d500e definitions-systems-1.0 definitions-systems.asd tests/definitions-systems_tests.asd -deflate http://beta.quicklisp.org/archive/deflate/2018-02-28/deflate-20180228-git.tgz 9418 a836910bc7b4b8cd1122d6da73316631 4772d9601c99ea4f91bb956f6e6e705fdb7a8d94 deflate-20180228-git deflate.asd -defmemo http://beta.quicklisp.org/archive/defmemo/2012-04-07/defmemo-20120407-git.tgz 1953 542105d03e8a0d012c21cefffed2f8ad e7d6f9f95ef8866e063c5e35eee1458e6022d7af defmemo-20120407-git defmemo.asd -defpackage-plus http://beta.quicklisp.org/archive/defpackage-plus/2018-01-31/defpackage-plus-20180131-git.tgz 6485 de7af07da901fe5623450d32fd4b7ddc dea6c565dee9b6d821b21a25f4169515e52595df defpackage-plus-20180131-git defpackage-plus.asd -defrec http://beta.quicklisp.org/archive/defrec/2019-03-07/defrec-20190307-hg.tgz 2488 28b1762c6fb45a24487be334d7d5db14 f5ea970dac951fd12455449ba66da09b471596e4 defrec-20190307-hg defrec.asd -defstar http://beta.quicklisp.org/archive/defstar/2014-07-13/defstar-20140713-git.tgz 46970 36db8379ba81239923e5f97dba352d8b 2983be99196ad25ad29404af66a6c61b6eca212a defstar-20140713-git defstar.asd -defsystem-compatibility http://beta.quicklisp.org/archive/defsystem-compatibility/2010-10-06/defsystem-compatibility-20101006-darcs.tgz 9848 ad19788379d30f53165b74683deee776 bc441cffe18d811b971e130cfa94b57938e353ec defsystem-compatibility-20101006-darcs defsystem-compatibility-test.asd defsystem-compatibility.asd -defvariant http://beta.quicklisp.org/archive/defvariant/2014-07-13/defvariant-20140713-git.tgz 10059 34cae097b3a510c71aec8638e6244384 8d43269b616dad7f0d0c9a6725e1614cb5c330c2 defvariant-20140713-git defvariant.asd -delorean http://beta.quicklisp.org/archive/delorean/2013-06-15/delorean-20130615-git.tgz 3788 441d44c6c37939df46fc1f6a549f97d6 f9b4b8ed3e1cf9811a32e19fa64f868598baf1c3 delorean-20130615-git delorean.asd -delta-debug http://beta.quicklisp.org/archive/delta-debug/2018-08-31/delta-debug-20180831-git.tgz 5769 0cfd1860910888e5d129e3a134a58e12 28dd1ae4e76fcd381539b1a09622525b083a7830 delta-debug-20180831-git delta-debug.asd -dendrite http://beta.quicklisp.org/archive/dendrite/2017-10-23/dendrite-release-quicklisp-409b1061-git.tgz 5988 574bb8da79376d36fdf04ae254ba04c5 d14f3b6356f3d6443fd76296e6c1ef32036045ca dendrite-release-quicklisp-409b1061-git dendrite.asd dendrite.micro-l-system.asd dendrite.primitives.asd -deoxybyte-gzip http://beta.quicklisp.org/archive/deoxybyte-gzip/2014-01-13/deoxybyte-gzip-20140113-git.tgz 130916 e6e373d376f3598f7ee3792e586a7dc3 53a1f55a7db874c66d5cf1f1ebf0800559e1584e deoxybyte-gzip-20140113-git deoxybyte-gzip-test.asd deoxybyte-gzip.asd -deoxybyte-io http://beta.quicklisp.org/archive/deoxybyte-io/2014-01-13/deoxybyte-io-20140113-git.tgz 40992 7283270d2df168edda80ec15bede2aa3 b4326e35061b6bed2625cb26cf545dd8984cb0e7 deoxybyte-io-20140113-git deoxybyte-io-test.asd deoxybyte-io.asd -deoxybyte-systems http://beta.quicklisp.org/archive/deoxybyte-systems/2014-01-13/deoxybyte-systems-20140113-git.tgz 3677 cb63033baf4ff3c8aaba80252e77f5d6 c306db96a2de41c23f2284164b9577cc1ba2c718 deoxybyte-systems-20140113-git deoxybyte-systems.asd -deoxybyte-unix http://beta.quicklisp.org/archive/deoxybyte-unix/2014-01-13/deoxybyte-unix-20140113-git.tgz 20104 058d5bc317967f587535fae8ee97a39f 6886a7daf781f97173d9cbb8fa84e3229054d260 deoxybyte-unix-20140113-git deoxybyte-unix-test.asd deoxybyte-unix.asd -deoxybyte-utilities http://beta.quicklisp.org/archive/deoxybyte-utilities/2014-01-13/deoxybyte-utilities-20140113-git.tgz 32707 1d29f3a612c1e7901b0fd053cac93f87 d9fa17f1f96255a973fe1c13b0b982197b303220 deoxybyte-utilities-20140113-git deoxybyte-utilities-test.asd deoxybyte-utilities.asd -deploy http://beta.quicklisp.org/archive/deploy/2019-11-30/deploy-20191130-git.tgz 20923 06a1abb219d7f23670bd3391beaa520a c02e00609dce7d2745ec799ced101a099321bddb deploy-20191130-git deploy-test.asd deploy.asd -descriptions http://beta.quicklisp.org/archive/descriptions/2015-03-02/descriptions-20150302-git.tgz 23662 b16c4d4768515759094d08043f6cd181 bae261da6cae337aabc0daa49fbe0f2d399dcecb descriptions-20150302-git descriptions-test.asd descriptions.asd descriptions.serialization.asd descriptions.validation.asd -destructuring-bind-star http://beta.quicklisp.org/archive/destructuring-bind-star/2018-10-18/destructuring-bind-star-20181018-git.tgz 3212 55e616f9df29c1d948f582cfbc7fe5af 4009c6cdb2aee5c28947b1b974934cd4f07d9584 destructuring-bind-star-20181018-git destructuring-bind-star.asd -dexador http://beta.quicklisp.org/archive/dexador/2019-10-07/dexador-20191007-git.tgz 235731 aa1c435f809a794610fe599987cb73a8 7144517ad2da8038bdbf61bcfabbb5adc7aaa06f dexador-20191007-git dexador-test.asd dexador.asd -diff http://beta.quicklisp.org/archive/diff/2013-08-13/diff-20130813-git.tgz 16642 c13a4545b12b26e6d99c5535048a435d dc6993e2890a59dd59dad95a098771117396e650 diff-20130813-git diff.asd -diff-match-patch http://beta.quicklisp.org/archive/diff-match-patch/2016-10-31/diff-match-patch-20161031-git.tgz 31108 70256cec4e141e3d0f88f0626e4cad8a 5bd2caadf478f6d941cf0771ce522ee02be862b5 diff-match-patch-20161031-git diff-match-patch.asd -dirt http://beta.quicklisp.org/archive/dirt/2017-10-19/dirt-release-quicklisp-0d13ebc2-git.tgz 5590 c3242835717a9db9c2db803d1b25f545 4ba2d03d1d5fad8f92e2683ac9c86e2d23b31678 dirt-release-quicklisp-0d13ebc2-git dirt.asd -disposable http://beta.quicklisp.org/archive/disposable/2016-02-08/disposable-20160208-git.tgz 1504 dd4e4ff956fb44ed624f8dafcaa4bea5 9ddcaa8fbf5ad43195e179882190fc68d4b58039 disposable-20160208-git disposable.asd -dissect http://beta.quicklisp.org/archive/dissect/2019-07-10/dissect-20190710-git.tgz 28483 fb0e90e86fe4c184c08d19c1ef61d4e4 a0330b1b69f02f46221e749956d78105e81d3d39 dissect-20190710-git dissect.asd -djula http://beta.quicklisp.org/archive/djula/2019-12-27/djula-20191227-git.tgz 84165 cc2836b922f4a6a6a09955bca4c2353c b482e8d335b4d44bca6b10173896383b896b0657 djula-20191227-git djula-demo.asd djula-test.asd djula.asd -dlist http://beta.quicklisp.org/archive/dlist/2012-11-25/dlist-20121125-git.tgz 14699 c935ee7e9bf0e30a5fd70ae703195f9e 2b23fc66cf9c4829828d4ef04b61938215c39c0f dlist-20121125-git dlist.asd -dml http://beta.quicklisp.org/archive/dml/2018-10-18/dml-20181018-git.tgz 440514 7423921f88d0a15f12fcba859ff518d9 48be480e302c2dd2151cda1d62ff8df9483c8814 dml-20181018-git dml.asd -do-urlencode http://beta.quicklisp.org/archive/do-urlencode/2018-10-18/do-urlencode-20181018-git.tgz 2318 cb6ab78689fe52680ee1b94cd7738b94 7eaef5c9b5cf8dfe004ad3a8fa101bad8193b3f1 do-urlencode-20181018-git do-urlencode.asd -docbrowser http://beta.quicklisp.org/archive/docbrowser/2019-07-10/docbrowser-20190710-git.tgz 905902 bfc1424c8de6eaf7150bb6e00a0222e7 004c4019482d81f82ffe5654a4fb0bb1f9656d1a docbrowser-20190710-git docbrowser.asd -docparser http://beta.quicklisp.org/archive/docparser/2018-12-10/docparser-20181210-git.tgz 13474 1fe23ad568298e975242358517e9871f 3391e2ee13c6c2c78fb8ed8028c6130ac7bf209e docparser-20181210-git docparser-test-system.asd docparser-test.asd docparser.asd -documentation-template http://beta.quicklisp.org/archive/documentation-template/2014-12-17/documentation-template-0.4.4.tgz 8721 847d38e9131779931cb7063e019afe5d 2cd71d1884d3eff7b76a0f907969b986c4125744 documentation-template-0.4.4 documentation-template.asd -documentation-utils http://beta.quicklisp.org/archive/documentation-utils/2019-07-10/documentation-utils-20190710-git.tgz 8913 4f45f511ac55008b8b8aa04f7feaa2d4 1071335af99636f62943713298b46a0244b5bda4 documentation-utils-20190710-git documentation-utils.asd multilang-documentation-utils.asd -documentation-utils-extensions http://beta.quicklisp.org/archive/documentation-utils-extensions/2018-07-11/documentation-utils-extensions-20180711-git.tgz 4676 e44cb3fbe27b04e2cceeb2240859a716 aaad552e01854bfc2fdd7758dde31edd3a2f5892 documentation-utils-extensions-20180711-git documentation-utils-extensions.asd -donuts http://beta.quicklisp.org/archive/donuts/2012-07-03/donuts-20120703-git.tgz 1232132 5d3e62b6453941a0bf64741c3df70b54 9c8061bcd3b2dd1443a1bccef991115169137482 donuts-20120703-git donuts.asd -doplus http://beta.quicklisp.org/archive/doplus/2019-03-07/doplus-20190307-hg.tgz 26769 6784a90135fc635ee016c490c535a218 014fdd3f79104f08209210fcf7806af3c428e1dd doplus-20190307-hg doplus-fset.asd doplus.asd -doubly-linked-list http://beta.quicklisp.org/archive/doubly-linked-list/2019-07-10/doubly-linked-list-20190710-git.tgz 3464 315b9f70ee726211f694fd81f17f5283 24a1e9aa58ecf2dd19c8a6bd7b82b0acdfc3862c doubly-linked-list-20190710-git doubly-linked-list.asd -drakma http://beta.quicklisp.org/archive/drakma/2019-11-30/drakma-v2.0.7.tgz 74290 f166498aaed67f726060e9e997df10a3 0920ad374a9b5d513efae5dc61af2484dc901d86 drakma-v2.0.7 drakma-test.asd drakma.asd -drakma-async http://beta.quicklisp.org/archive/drakma-async/2015-10-31/drakma-async-20151031-git.tgz 24061 7048777c70eeba4456b19e2cb6ab83ae c4cf9dcbc5a295bbf3187ef39e9b391155f36392 drakma-async-20151031-git drakma-async.asd -draw-cons-tree http://beta.quicklisp.org/archive/draw-cons-tree/2013-10-03/draw-cons-tree-20131003-git.tgz 2252 ce720e2ddf395246927e5765f5116084 94e6c5794403485da7bce440547e4e5cb59afb92 draw-cons-tree-20131003-git draw-cons-tree.asd -dso-lex http://beta.quicklisp.org/archive/dso-lex/2011-01-10/dso-lex-0.3.2.tgz 16481 fe8a4a6b9689c06f93f19c1b5506132d 2fac198fb75b4db2d2a1eb02479c94c0c3fa255a dso-lex-0.3.2 dso-lex.asd -dso-util http://beta.quicklisp.org/archive/dso-util/2011-01-10/dso-util-0.1.2.tgz 11309 ad11cec0f5a04142bcd5e117e53c7267 d861e27a509cd972ede6c7377fdc93abfa2c727a dso-util-0.1.2 dso-util.asd -dufy http://beta.quicklisp.org/archive/dufy/2019-11-30/dufy-20191130-git.tgz 482953 a61931fe902574a80df60eed19bb6805 fcb19f7921d363f04eb2196fb28ec00afa5dced3 dufy-20191130-git dufy.asd -duologue http://beta.quicklisp.org/archive/duologue/2015-04-07/duologue-20150407-git.tgz 6711 c5fca14a43ee08bc81f89e1cec71e0b0 49147aaaed48dcab2e57ce97e2ff07d4bfdced92 duologue-20150407-git duologue.asd -dweet http://beta.quicklisp.org/archive/dweet/2014-12-17/dweet-20141217-git.tgz 3051 68c4fe0638b6f9febe93925d4fd0cc33 b13c3333a955b851ee4286f5bd1583f09e9e8f75 dweet-20141217-git dweet.asd -dyna http://beta.quicklisp.org/archive/dyna/2018-04-30/dyna-20180430-git.tgz 25788 9ee5811b22d4692a11320a3ad9ce1ec5 f9981ccccdbf77753179dab0e77150c57d9a817b dyna-20180430-git dyna-test.asd dyna.asd -dynamic-classes http://beta.quicklisp.org/archive/dynamic-classes/2013-01-28/dynamic-classes-20130128-git.tgz 7148 a6ed01c4f21df2b6a142328b24ac7ba3 641573761b2d4fab3b17196cc10a9d46486ab495 dynamic-classes-20130128-git dynamic-classes-test.asd dynamic-classes.asd -dynamic-collect http://beta.quicklisp.org/archive/dynamic-collect/2019-03-07/dynamic-collect-20190307-hg.tgz 447578 c182c60ccb418c9f996f2fe48478cfbf 13d9d81f629b6c665753741ffa45b646f7caeb56 dynamic-collect-20190307-hg dynamic-collect.asd -dynamic-mixins http://beta.quicklisp.org/archive/dynamic-mixins/2018-10-18/dynamic-mixins-20181018-git.tgz 2492 8b2072af2b472c2c7bbaf28ff38e43be a389ddf18ddec5f634f28e506e349b83117085eb dynamic-mixins-20181018-git dynamic-mixins.asd -eager-future http://beta.quicklisp.org/archive/eager-future/2010-10-06/eager-future-20101006-darcs.tgz 3181 33ec9918cece34f35f2354e1f94a245c 862750b95d33edacbc73b08a636b9689a6167336 eager-future-20101006-darcs eager-future.asd -eager-future2 http://beta.quicklisp.org/archive/eager-future2/2019-11-30/eager-future2-20191130-git.tgz 26961 72298620b0fb2f874d86d887cce4acf0 70c0531898eddae204d38b0f5f2dd7c9d7381e8b eager-future2-20191130-git eager-future2.asd test.eager-future2.asd -easing http://beta.quicklisp.org/archive/easing/2018-02-28/easing-20180228-git.tgz 4636 775f27d44c58ff05c38ead610168f1ee 2e8889e1e4e5ece9d39b0d1f99cbe7b352b55ace easing-20180228-git easing-demo.asd easing-test.asd easing.asd -easy-audio http://beta.quicklisp.org/archive/easy-audio/2019-12-27/easy-audio-20191227-git.tgz 48893 144ad89fb846739df044683e05ee7aac 4c4a7c22d1cc3edb311822fa35d87590d19ef62c easy-audio-20191227-git easy-audio-examples.asd easy-audio-tests.asd easy-audio.asd -easy-bind http://beta.quicklisp.org/archive/easy-bind/2019-02-02/easy-bind-20190202-git.tgz 16880 ee624a12d458bdb17f4b3dfe7772f699 9240ed116049d326453d744303e65213704859c8 easy-bind-20190202-git easy-bind.asd -easy-routes http://beta.quicklisp.org/archive/easy-routes/2019-08-13/easy-routes-20190813-git.tgz 6334 8716f16268ed259deb98ac29662722d9 13649c2cd2a61ec73ab1fe159ee0060bca1387ff easy-routes-20190813-git easy-routes.asd -eazy-documentation http://beta.quicklisp.org/archive/eazy-documentation/2019-12-27/eazy-documentation-20191227-git.tgz 17422 494e67c0a0de0e1c45854129e1551f96 1b0c6db59b09899d8a1f424ed7c419f30f4bc554 eazy-documentation-20191227-git eazy-documentation.asd -eazy-gnuplot http://beta.quicklisp.org/archive/eazy-gnuplot/2018-08-31/eazy-gnuplot-20180831-git.tgz 8339018 5847b95b76c3a6ca908572c01ecd8474 d2ef349292b5c42baf46cd53834aefa9cb2df2cf eazy-gnuplot-20180831-git eazy-gnuplot.asd eazy-gnuplot.test.asd -eazy-process http://beta.quicklisp.org/archive/eazy-process/2015-12-18/eazy-process-20151218-git.tgz 27785 67eb10100308f984571ad75db1f77bf6 98ab4e587b7ccf079c8f77d5a6013289a21a36d1 eazy-process-20151218-git eazy-process.asd eazy-process.test.asd -eazy-project http://beta.quicklisp.org/archive/eazy-project/2019-07-10/eazy-project-20190710-git.tgz 15917 5b365c1ae21d9faf6eb7cfbb79b729cd 1e037cfaa916d41d7192fac829034426042a5bb4 eazy-project-20190710-git eazy-project.asd eazy-project.autoload.asd eazy-project.test.asd -ec2 http://beta.quicklisp.org/archive/ec2/2012-09-09/ec2-20120909-git.tgz 23603 0c6dea76f190aaa25305490b3e048437 d82ca8949aced8d7ef5fe3ca6bc02a1a3f1ab2a7 ec2-20120909-git ec2.asd -eclector http://beta.quicklisp.org/archive/eclector/2019-12-27/eclector-20191227-git.tgz 132183 b63ea9792bb5808adddd17fdedd35a38 3446a00516f7bda6135a5136bcd482f5e73ad969 eclector-20191227-git eclector-concrete-syntax-tree.asd eclector.asd -eco http://beta.quicklisp.org/archive/eco/2019-08-13/eco-20190813-git.tgz 6304 f27079c961c837ffc28f4d8c1a5cf81e 386d0cea4efbb4269e6b22d8387e447986c870cd eco-20190813-git eco-test.asd eco.asd -elb-log http://beta.quicklisp.org/archive/elb-log/2015-09-23/elb-log-20150923-git.tgz 6870 5eb6513fd03c1b015b9f215f96ba9d3b bd104f69efa8db03bdade2bf6fe70c61cd4b58e3 elb-log-20150923-git elb-log-test.asd elb-log.asd -electron-tools http://beta.quicklisp.org/archive/electron-tools/2016-04-21/electron-tools-20160421-git.tgz 2560 70ce32f5c79a23cff6c7fef7677422b4 d3de418ea520e7d7e672ad391a5905e1e72efd06 electron-tools-20160421-git electron-tools-test.asd electron-tools.asd -elf http://beta.quicklisp.org/archive/elf/2019-07-10/elf-20190710-git.tgz 473583 7edebf956ba1892304407f475bf6bdfe 6f7a1bfb3c1930c586d374122158c5a28dc34c56 elf-20190710-git elf.asd -enhanced-eval-when http://beta.quicklisp.org/archive/enhanced-eval-when/2012-11-25/enhanced-eval-when-1.0.tgz 1875 4cf59d63539f41b7b0c412f6d9e89ff5 48f3d1a21ddb4f8440d0c04f5a2b45da9bb4438c enhanced-eval-when-1.0 enhanced-eval-when.asd -enhanced-multiple-value-bind http://beta.quicklisp.org/archive/enhanced-multiple-value-bind/2012-11-25/enhanced-multiple-value-bind-1.0.1.tgz 2589 a0fdb32762b7bf6a8cd4b04f07bb05a1 cf4a330e2b640e43bb70ff5da1c7ab7fc97e8a19 enhanced-multiple-value-bind-1.0.1 enhanced-multiple-value-bind.asd -envy http://beta.quicklisp.org/archive/envy/2019-08-13/envy-20190813-git.tgz 3558 1f82d7f3221043577e44772d27d44932 73a1c0d37dfd06abd6bd7a1368aa4735c52845b7 envy-20190813-git envy-test.asd envy.asd -eos http://beta.quicklisp.org/archive/eos/2015-06-08/eos-20150608-git.tgz 13161 94f6a72534171ff6adcc823c31e3d53f bbfeefe9f70dd744142060ef1e96f85092bfdef7 eos-20150608-git eos.asd -epigraph http://beta.quicklisp.org/archive/epigraph/2016-06-28/epigraph-20160628-git.tgz 17490 6666b31324773f5aa275660da4cdedcc 9b971c5aabbd4b3b3ec2753766c37114ccd634a8 epigraph-20160628-git epigraph.asd -equals http://beta.quicklisp.org/archive/equals/2014-08-26/equals-20140826-git.tgz 2963 5acfaaebd7e1a683b3a84f85b7413340 a3321de358488a827d8535e9b947a316b914f5f5 equals-20140826-git equals.asd -ernestine http://beta.quicklisp.org/archive/ernestine/2016-12-04/ernestine-20161204-git.tgz 305333 1f254cb1f061e846181360fe059ca20d 170f5f6b5622462afa2f8b5d266aaa1b61e7e083 ernestine-20161204-git ernestine-tests.asd ernestine.asd -erudite http://beta.quicklisp.org/archive/erudite/2019-10-07/erudite-20191007-git.tgz 376268 d6de2a638ed93f2f87647be695e7e85f 9cad42dc1203dab78f12799ec4bd3c9bc62c9801 erudite-20191007-git erudite-test.asd erudite.asd -escalator http://beta.quicklisp.org/archive/escalator/2019-03-07/escalator-20190307-hg.tgz 4906 fff63c0a1de90711325f5952ae344e2e 935dbda8a5a4539db23d7555ed47060b2e882204 escalator-20190307-hg escalator-bench.asd escalator.asd -esrap http://beta.quicklisp.org/archive/esrap/2019-12-27/esrap-20191227-git.tgz 69274 8dd58ffc605bba6eec614bdea573978b 7ab73af2e8a3346142280622dd4a6d09936a8159 esrap-20191227-git esrap.asd -esrap-liquid http://beta.quicklisp.org/archive/esrap-liquid/2016-10-31/esrap-liquid-20161031-git.tgz 35689 7bc12d040919cb5b5da641334a1f23a1 9c8b389cc2c147922bbbc9be7a21c31c06a1b888 esrap-liquid-20161031-git esrap-liquid.asd -esrap-peg http://beta.quicklisp.org/archive/esrap-peg/2019-10-07/esrap-peg-20191007-git.tgz 7824 48d87d3118febeefc23ca3a8dda36fc0 27a86bbcd4eb649ac379c6b9ba0093234f285ff0 esrap-peg-20191007-git esrap-peg.asd -event-emitter http://beta.quicklisp.org/archive/event-emitter/2018-12-10/event-emitter-20181210-git.tgz 3346 1b6cb3e12d074e35da563e7163b47a91 651ad4bc759d2a947fb8ecd72d1f67f4d19c2d08 event-emitter-20181210-git event-emitter-test.asd event-emitter.asd -event-glue http://beta.quicklisp.org/archive/event-glue/2015-06-08/event-glue-20150608-git.tgz 9282 1aa70e889ffd2a2d01e7ee740c057415 faedf03cac4300b60f270a365e11a4dba5a74789 event-glue-20150608-git event-glue-test.asd event-glue.asd -eventbus http://beta.quicklisp.org/archive/eventbus/2019-12-27/eventbus-20191227-git.tgz 15807 99b4ca9efc30825dd56e77ae6cd5afe3 85c30ca68cb565572b5a5595e5d5a34e8f5e16c4 eventbus-20191227-git eventbus.asd -eventfd http://beta.quicklisp.org/archive/eventfd/2017-11-30/eventfd-20171130-git.tgz 2518 6580eb40265070dc8292ed4c2a137ee8 8fdce2b98e2d7d6d437a73a5de85f882c0c60859 eventfd-20171130-git eventfd.asd -everblocking-stream http://beta.quicklisp.org/archive/everblocking-stream/2018-10-18/everblocking-stream-20181018-git.tgz 887 307e7b6ba7ecb8912492497d7025e1cd 5539bdd086bef5526c4487ce9634239ac7f204b9 everblocking-stream-20181018-git everblocking-stream.asd -evol http://beta.quicklisp.org/archive/evol/2010-10-06/evol-20101006-git.tgz 36040 063813e42d598be1073625c38cc0fc76 de2a0507ad9682b4f783d23d8e579859e5283763 evol-20101006-git evol-test.asd evol.asd -exit-hooks http://beta.quicklisp.org/archive/exit-hooks/2017-04-03/exit-hooks-20170403-git.tgz 3070 9a5c96e590462bd417f1940ce9d374d2 2d5fb7624a86f2efec0106def24306beece56d53 exit-hooks-20170403-git exit-hooks.asd -exponential-backoff http://beta.quicklisp.org/archive/exponential-backoff/2015-01-13/exponential-backoff-20150113-git.tgz 2397 d3e5d082518de0e1d03ad6a8dac63f07 06dea928582daa17b07682a2df406de61205c63e exponential-backoff-20150113-git exponential-backoff.asd -exscribe http://beta.quicklisp.org/archive/exscribe/2017-04-03/exscribe-20170403-git.tgz 30757 a7317b96ab623ce1795d0e01c070daff 628b19937fb8477a42792829202dbf9ae9f634b6 exscribe-20170403-git exscribe.asd -ext-blog http://beta.quicklisp.org/archive/ext-blog/2016-08-25/ext-blog-20160825-git.tgz 393481 74fbc8b459a0d074c6fd08bbbd644c31 de4620d23fe78be0a39d8768724c86e074365252 ext-blog-20160825-git ext-blog.asd -extended-reals http://beta.quicklisp.org/archive/extended-reals/2018-03-28/extended-reals-20180328-git.tgz 2979 191bca02ac2c4a55ccc98aa6eda82f66 7d1fba685087c2236a5dd24abdc070f1b2394c4b extended-reals-20180328-git extended-reals.asd -external-program http://beta.quicklisp.org/archive/external-program/2019-03-07/external-program-20190307-git.tgz 10408 b30fe104c34059506fd4c493fa79fe1a f04bc9e1b3a0eb5b4c017a8799b9483fc10ea0ff external-program-20190307-git external-program.asd -external-symbol-not-found http://beta.quicklisp.org/archive/external-symbol-not-found/2018-04-30/external-symbol-not-found-20180430-git.tgz 2882 20cc0679a0de51547810d9f75c04d350 1b7140c2efa0f4b342568c8a34079c478d3c94c7 external-symbol-not-found-20180430-git external-symbol-not-found.asd -f-underscore http://beta.quicklisp.org/archive/f-underscore/2010-10-06/f-underscore-20101006-darcs.tgz 982 45ef9c0ac1c92d9aba76b69b53cc7838 34c192987ab8b11f9b09ba40098fc696250506e6 f-underscore-20101006-darcs f-underscore.asd -f2cl http://beta.quicklisp.org/archive/f2cl/2019-01-07/f2cl-20190107-git.tgz 2132799 3e24767fe26aa1bc1c6da904b8027d68 7de3a8a885f825a233e7523ae97354801ed08fb9 f2cl-20190107-git f2cl-asdf.asd f2cl.asd packages/blas-complex.asd packages/blas-hompack.asd packages/blas-package.asd packages/blas-real.asd packages/blas.asd packages/colnew.asd packages/fishpack.asd packages/hompack.asd packages/lapack.asd packages/minpack.asd packages/odepack.asd packages/quadpack.asd packages/toms419.asd packages/toms715.asd packages/toms717.asd -fact-base http://beta.quicklisp.org/archive/fact-base/2018-03-28/fact-base-20180328-git.tgz 9491 86825a1ba98fe3aa2866ec7e3452a371 26a527bafcf2bd38221c9bd737ca15660d0bed9e fact-base-20180328-git fact-base.asd -fare-csv http://beta.quicklisp.org/archive/fare-csv/2017-12-27/fare-csv-20171227-git.tgz 7223 1d73aaac9fcd86cc5ddb72019722bc2a d7cdb3a2b3ca5b92953201cc8769998fd8ee65de fare-csv-20171227-git fare-csv.asd -fare-memoization http://beta.quicklisp.org/archive/fare-memoization/2018-04-30/fare-memoization-20180430-git.tgz 7571 7446aa643f0e461d960efb673a706dc1 ef47d67c6d76e8e0c829bbd654e27b69e08fef3b fare-memoization-20180430-git fare-memoization.asd -fare-mop http://beta.quicklisp.org/archive/fare-mop/2015-12-18/fare-mop-20151218-git.tgz 2728 4721ff62e2ac2c55079cdd4f2a0f6d4a cd1f7fcd2aa132432f271f43de9cf39aeef37c71 fare-mop-20151218-git fare-mop.asd -fare-quasiquote http://beta.quicklisp.org/archive/fare-quasiquote/2019-05-21/fare-quasiquote-20190521-git.tgz 16060 e08c24d35a485a74642bd0c7c06662d6 b441f6dadd12309bd7cf1cba64f41fc9ca7974d6 fare-quasiquote-20190521-git fare-quasiquote-extras.asd fare-quasiquote-optima.asd fare-quasiquote-readtable.asd fare-quasiquote-test.asd fare-quasiquote.asd -fare-scripts http://beta.quicklisp.org/archive/fare-scripts/2019-10-07/fare-scripts-20191007-git.tgz 41613 be86769065461713423ac98bef91b900 1f2ffe437dbb926c9e728227a9d7c0f6172ad349 fare-scripts-20191007-git fare-scripts.asd -fare-utils http://beta.quicklisp.org/archive/fare-utils/2017-01-24/fare-utils-20170124-git.tgz 32604 6752362d0c7c03df6576ab2dbe807ee2 e0b139600b7693a13eece65ff148464168ae890b fare-utils-20170124-git fare-utils.asd test/fare-utils-test.asd -fast-http http://beta.quicklisp.org/archive/fast-http/2019-10-07/fast-http-20191007-git.tgz 33540 fd43be4dd72fd9bda5a3ecce87104c97 419610a07b0ccf3117378b6fb9b5faa025037d0b fast-http-20191007-git fast-http-test.asd fast-http.asd -fast-io http://beta.quicklisp.org/archive/fast-io/2017-10-23/fast-io-20171023-git.tgz 8067 89105f8277f3bf3709fae1b789e3d5ad c1cb21c5c9100e067b405fece7ee5f22bcc36f9f fast-io-20171023-git fast-io-test.asd fast-io.asd -fast-websocket http://beta.quicklisp.org/archive/fast-websocket/2019-08-13/fast-websocket-20190813-git.tgz 9136 1bfc212b4e196049ab66598b9055c225 ec4ff9ece37aba5d6885cbbf7184ad2032663fa2 fast-websocket-20190813-git fast-websocket-test.asd fast-websocket.asd -femlisp http://beta.quicklisp.org/archive/femlisp/2019-12-27/femlisp-20191227-git.tgz 648961 5ce598c1a5073081ab7621a9fb2eba72 fa87977048b8494b5902a9a4c22b17aaee31b636 femlisp-20191227-git external/cl-cpu-affinity/cl-cpu-affinity.asd external/infix/infix.asd src/applications/courses/dealii-tutorial/dealii-tutorial.asd src/contrib/femlisp-picture.asd src/ddo/ddo.asd src/femlisp-ddo/net.scipolis.graphs.asd systems/femlisp-basic.asd systems/femlisp-dictionary.asd systems/femlisp-matlisp.asd systems/femlisp-parallel.asd systems/femlisp.asd -ffa http://beta.quicklisp.org/archive/ffa/2010-10-06/ffa-20101006-git.tgz 79415 5fe81065a6834b2095373667f5d58426 a3d137edc9af56e3ba853082a2b30f59f7bb79b4 ffa-20101006-git ffa.asd -fft http://beta.quicklisp.org/archive/fft/2018-07-11/fft-20180711-git.tgz 4806 06c2d33d8ddd43332dc25ac4ea7f20cc f77ba0a8d9ccf55d8daaebe31a7053e78a2c29c2 fft-20180711-git fft.asd pfft.asd -fiasco http://beta.quicklisp.org/archive/fiasco/2019-11-30/fiasco-20191130-git.tgz 18955 235809b661c89fed1c4ca4ba3e4f3606 71ac8b6cc0d93752c76872d329818cc692ed32a9 fiasco-20191130-git fiasco.asd -file-local-variable http://beta.quicklisp.org/archive/file-local-variable/2016-03-18/file-local-variable-20160318-git.tgz 3725 8c486b517f733978fa3224ae225a5829 ab4f69526c059b17f5262006217f43b17f217358 file-local-variable-20160318-git file-local-variable.asd file-local-variable.test.asd -file-select http://beta.quicklisp.org/archive/file-select/2019-12-27/file-select-20191227-git.tgz 16660 792889047c3f0713c4ecd014f592b380 7f59269e56af417095f4027f6c52adbc10bbb246 file-select-20191227-git file-select.asd -file-types http://beta.quicklisp.org/archive/file-types/2016-09-29/file-types-20160929-git.tgz 16146 4fd40465a8bde55c444c65bdcb238a95 ef2a666fadb709340caf6340043fc21c157b4ec6 file-types-20160929-git file-types.asd -filtered-functions http://beta.quicklisp.org/archive/filtered-functions/2016-03-18/filtered-functions-20160318-git.tgz 5624 1a30c0712c4750954a9b645bdc6362cc 76f362ebb3655223f646d4be53dcc85572b307a8 filtered-functions-20160318-git filtered-functions.asd -find-port http://beta.quicklisp.org/archive/find-port/2019-07-10/find-port-20190710-git.tgz 2053 50b5558caf3cc39cc6b55142b6630404 2f18aa155913ec653ae88804cab4422e0e05fb23 find-port-20190710-git find-port-test.asd find-port.asd -firephp http://beta.quicklisp.org/archive/firephp/2016-05-31/firephp-20160531-git.tgz 3101 776c31d2d1d29e0f8ddf916d66f57416 354083daca9bc6e502792af81300ebdaf7fbfd1a firephp-20160531-git firephp-tests.asd firephp.asd -first-time-value http://beta.quicklisp.org/archive/first-time-value/2018-12-10/first-time-value-1.0.1.tgz 4590 ad1d225958063396e5260d963ffbb6e3 20c732c8a5b0b32c80b5d23eb1f70e4c98614d0c first-time-value-1.0.1 first-time-value.asd tests/first-time-value_tests.asd -fiveam http://beta.quicklisp.org/archive/fiveam/2018-02-28/fiveam-v1.4.1.tgz 24014 7f182f8a4c12b98671e1707ae0f140b7 42e5b2e54ef6cda091ce116963d2eea30bb48f6b fiveam-v1.4.1 fiveam.asd -fiveam-asdf http://beta.quicklisp.org/archive/fiveam-asdf/2019-07-10/fiveam-asdf-20190710-git.tgz 3484 951689cab836f8cefafcf75dd324eb23 b870df02fbca25d3f4adf4aa843081324669e353 fiveam-asdf-20190710-git fiveam-asdf.asd -fixed http://beta.quicklisp.org/archive/fixed/2017-01-24/fixed-20170124-git.tgz 12070 738197e9e3f84c000df9f7c270f49401 58f9ec849945c966fa5f539fc7fd3d1ff8178d3d fixed-20170124-git fixed.asd -flac-metadata http://beta.quicklisp.org/archive/flac-metadata/2019-07-10/flac-metadata-20190710-git.tgz 6580 a3cef395abd5beae99ba60f394f8e7b6 d7d0d842ece10d903bfcbc9ecaccca84ecd7fcd8 flac-metadata-20190710-git flac-metadata.asd -flac-parser http://beta.quicklisp.org/archive/flac-parser/2019-07-10/flac-parser-20190710-git.tgz 11365 26b6e66cc7d2c0a886d615f7a581b0e9 c70a38376cb8d55eb03d53c546f39c52155d2697 flac-parser-20190710-git flac-parser.asd -flare http://beta.quicklisp.org/archive/flare/2019-07-10/flare-20190710-git.tgz 58017 a15c9be05e27bfc9c3986fca21fda893 82f93831b5a49164bd9646edfcfd05462deb7c37 flare-20190710-git flare.asd viewer/flare-viewer.asd -flexi-streams http://beta.quicklisp.org/archive/flexi-streams/2019-01-07/flexi-streams-20190107-git.tgz 132948 b59014f9f9f0d1b94f161e36e64a35c2 d3d3a0dcedf92fccce96fcfb47561487b5bdde73 flexi-streams-20190107-git flexi-streams.asd -flexichain http://beta.quicklisp.org/archive/flexichain/2010-10-06/flexichain_1.5.1.tgz 19919 e63247e4e3f61ec768c5ceff0a5e1293 7eb528e31fea545467c6b629094a335dadbebe3f flexichain_1.5.1 flexichain-doc.asd flexichain.asd -float-features http://beta.quicklisp.org/archive/float-features/2019-10-07/float-features-20191007-git.tgz 6721 21215bd53d6c23908b92a4afd47a2880 91d3fe44e93a2f430d83496fadce7f6b16981fce float-features-20191007-git float-features.asd -floating-point http://beta.quicklisp.org/archive/floating-point/2014-11-06/floating-point-20141106-git.tgz 473538 2ebe55f78c56d8ca5af9d1e0914b6402 b894b79a5fb145795d45488395056efa86277310 floating-point-20141106-git lisp/floating-point.asd test/floating-point-test.asd -floating-point-contractions http://beta.quicklisp.org/archive/floating-point-contractions/2016-06-28/floating-point-contractions-20160628-git.tgz 1925 0250c90f09a3b6970560da61a22c3f67 503f4aff7528ba6302a22b953a14af263ff8e020 floating-point-contractions-20160628-git floating-point-contractions.asd -flow http://beta.quicklisp.org/archive/flow/2019-08-13/flow-20190813-git.tgz 29847 b74593ef1f3bd9838693b8595ae5e5c0 642af5ba117c129373f3c7d4e95a78f937e9f9c8 flow-20190813-git flow.asd visualizer/flow-visualizer.asd -flute http://beta.quicklisp.org/archive/flute/2018-08-31/flute-20180831-git.tgz 13138 8c312b0e18c10e7f03b81fc19587b786 632821535927afe4fe360af6ffcd6e1f2f6780bc flute-20180831-git flute-test.asd flute.asd -fmt http://beta.quicklisp.org/archive/fmt/2016-03-18/fmt-20160318-git.tgz 15539 94092c9cff6b2b24cddd779a0e059b6e 844964ccdb739dc6b569cd7627779600a4269661 fmt-20160318-git fmt-test.asd fmt-time.asd fmt.asd -fn http://beta.quicklisp.org/archive/fn/2017-10-19/fn-20171019-git.tgz 6936 0e1cfe5f19ceec8966baa3037772d31e 64871b26712de944ff79e1f58b0e7f4952044810 fn-20171019-git fn.asd -focus http://beta.quicklisp.org/archive/focus/2017-04-03/focus-20170403-git.tgz 47354 2be0459474ffdf328f5139164531a46e 84ef144a2ae449c507a5eaa37ef7c4274b15c36d focus-20170403-git core/net.didierverna.focus.core.asd demos/quotation/net.didierverna.focus.demos.quotation.asd flv/net.didierverna.focus.flv.asd net.didierverna.focus.asd setup/net.didierverna.focus.setup.asd -folio http://beta.quicklisp.org/archive/folio/2013-01-28/folio-20130128-git.tgz 21241 6f675b7346e8fcd492d4fde527eaa5ac bf20129ce9e18991bb60d1e20dc6c489c9529819 folio-20130128-git as/folio.as.asd boxes/folio.boxes.asd collections/folio.collections.asd folio.asd functions/folio.functions.asd -folio2 http://beta.quicklisp.org/archive/folio2/2019-10-07/folio2-20191007-git.tgz 55271 df04ee7b930f3eec45293a26523c2f42 539dca8db49ca54e344e0f6ba902ea3301ecd745 folio2-20191007-git folio2-as-syntax.asd folio2-as-tests.asd folio2-as.asd folio2-boxes-tests.asd folio2-boxes.asd folio2-functions-syntax.asd folio2-functions-tests.asd folio2-functions.asd folio2-make-tests.asd folio2-make.asd folio2-maps-syntax.asd folio2-maps-tests.asd folio2-maps.asd folio2-pairs-tests.asd folio2-pairs.asd folio2-sequences-syntax.asd folio2-sequences-tests.asd folio2-sequences.asd folio2-series-tests.asd folio2-series.asd folio2-taps-tests.asd folio2-taps.asd folio2-tests.asd folio2.asd -fomus http://beta.quicklisp.org/archive/fomus/2012-09-09/fomus-20120909-svn.tgz 1142093 f23d94ff232efc377e331114e62c508f ca319a5373898758cccfa40c4a37feef523d2a1a fomus-20120909-svn fomus.asd -font-discovery http://beta.quicklisp.org/archive/font-discovery/2019-10-07/font-discovery-20191007-git.tgz 14711 625c16ab54bee0f441482fcd535f3cfa 5b9db7476c19d53c6863f09bc95297da27c891db font-discovery-20191007-git font-discovery.asd -for http://beta.quicklisp.org/archive/for/2019-07-10/for-20190710-git.tgz 37031 69b66819a3e64c77fa9832d9d4d188a1 cb94c7ab09f15d6a75e95013d620163c728a197a for-20190710-git for.asd -form-fiddle http://beta.quicklisp.org/archive/form-fiddle/2019-07-10/form-fiddle-20190710-git.tgz 5635 2576065de1e3c95751285fb155f5bcf6 a6a057c05e5512f2f8a0a05e336d422646d76b2c form-fiddle-20190710-git form-fiddle.asd -format-string-builder http://beta.quicklisp.org/archive/format-string-builder/2017-01-24/format-string-builder-20170124-git.tgz 5303 4997e60ed7af0f32d1c5b06f19247288 89a375a3ed8fb7c2cb8f1805403ebd1824594138 format-string-builder-20170124-git format-string-builder.asd -formlets http://beta.quicklisp.org/archive/formlets/2016-12-04/formlets-20161204-git.tgz 10598 b630d094fbbb2fe157f7e3a4bd93b648 a034c03549a46f751d65473b2312e55782ecb4d5 formlets-20161204-git formlets-test.asd formlets.asd -fred http://beta.quicklisp.org/archive/fred/2015-09-23/fred-20150923-git.tgz 34873 dbd3a53435f31cd78f4ddc3e74e9b33b 4abfe6150cb271db84a4094e4d7cef1c50a13472 fred-20150923-git fred.asd -freebsd-sysctl http://beta.quicklisp.org/archive/freebsd-sysctl/2018-07-11/freebsd-sysctl-20180711-git.tgz 3640 e8b12534d89d5c8bcd9a5f6e73907372 028b66742f9f1b0bbdf40c1857fa03afd86bb53b freebsd-sysctl-20180711-git freebsd-sysctl.asd -froute http://beta.quicklisp.org/archive/froute/2018-07-11/froute-20180711-git.tgz 6514 fc27a158d568985e863460c9ac816ecf a22f3a153e2c9314db0e08e625e75909687b0347 froute-20180711-git froute.asd -frpc http://beta.quicklisp.org/archive/frpc/2015-10-31/frpc-20151031-git.tgz 140181 c13346249483dd290b8cf22221df05f7 dafa923a87ffc6bc0b0cdbc4f9d81ee2fd140e48 frpc-20151031-git frpc.asd frpcgen.asd -fs-watcher http://beta.quicklisp.org/archive/fs-watcher/2017-11-30/fs-watcher-20171130-git.tgz 2293 98f697c99206be8e728e98414d56c28f fb546e596be903ecec976563d09982a5b3894885 fs-watcher-20171130-git fs-watcher.asd -fset http://beta.quicklisp.org/archive/fset/2017-10-19/fset-20171019-git.tgz 107932 dc8de5917c513302dd0e135e6c133978 d53c56499c817bce4d486b1fc9611fe32b2c2eb1 fset-20171019-git fset.asd -fsvd http://beta.quicklisp.org/archive/fsvd/2013-12-11/fsvd-20131211-git.tgz 8009 b6459ca9296f6e331cef49ab5580c766 392c65723a931eb2e8a4bd752d7abf95fc818b5a fsvd-20131211-git fsvd.asd -fucc http://beta.quicklisp.org/archive/fucc/2011-01-10/fucc_0.2.1.tgz 33293 b822259462e1cba9329845709c5f607e 245cc4e542d10eff1bffb70ecc552f2f0247a53a fucc_0.2.1 fucc-generator.asd fucc-parser.asd -function-cache http://beta.quicklisp.org/archive/function-cache/2018-12-10/function-cache-20181210-git.tgz 12754 c9ed7dd8f103273bd9daa06b5a720944 98e3470ccaccbd88c7dbfe5e77f19cc742446fc1 function-cache-20181210-git function-cache-clsql.asd function-cache.asd -fxml http://beta.quicklisp.org/archive/fxml/2019-12-27/fxml-20191227-git.tgz 840266 232e2106b230f05dac277a8e34a19a4c a95b680748d598c58f8b84ff1337bb6cc0d3c8d9 fxml-20191227-git fxml.asd -gamebox-dgen http://beta.quicklisp.org/archive/gamebox-dgen/2019-03-07/gamebox-dgen-20190307-git.tgz 9378 6f107b87923081e68a76a00ba1c81766 a57f60f17c8dd30731bce3eaac6879c095332a34 gamebox-dgen-20190307-git gamebox-dgen.asd -gamebox-ecs http://beta.quicklisp.org/archive/gamebox-ecs/2018-02-28/gamebox-ecs-20180228-git.tgz 7070 a4fef9181021f72168844ba1dfa57871 50080fc42ace635ad1f5b58c53023bcdcd0e5cf7 gamebox-ecs-20180228-git gamebox-ecs.asd -gamebox-frame-manager http://beta.quicklisp.org/archive/gamebox-frame-manager/2018-07-11/gamebox-frame-manager-20180711-git.tgz 3717 f8461ce7dbcfc0597df45375d43174ab 0e989400611cd95d5cb9f117631099ee8bf45b17 gamebox-frame-manager-20180711-git gamebox-frame-manager.asd -garbage-pools http://beta.quicklisp.org/archive/garbage-pools/2013-07-20/garbage-pools-20130720-git.tgz 44210 f691e2ddf6ba22b3451c24b61d4ee8b6 cd82cc2ecf1de06bc18bd4c578736448ad3c088a garbage-pools-20130720-git garbage-pools-test.asd garbage-pools.asd -gcm http://beta.quicklisp.org/archive/gcm/2014-12-17/gcm-20141217-git.tgz 2461 6836ca1144f86e181cc4684a4be58c10 fddbfbef63cfa8f9301405fc5d5ace4a495b6fe5 gcm-20141217-git gcm.asd -gendl http://beta.quicklisp.org/archive/gendl/2019-12-27/gendl-devo-b6bd4ce1-git.tgz 69422705 b56261c7b6d9b554e198380f70b25696 90542cb830e48d5dd8050a55fbc017d7f4838fea gendl-devo-b6bd4ce1-git apps/dom/dom.asd apps/gorg/gorg.asd apps/graphs/graphs.asd apps/ta2/ta2.asd apps/tasty/tasty.asd apps/timer/timer.asd apps/translators/translators.asd apps/tree/tree.asd apps/yadd/yadd.asd base/base.asd cl-lite/cl-lite.asd demos/bus/bus.asd demos/ledger/ledger.asd demos/robot/robot.asd demos/wire-world/wire-world.asd gendl-asdf.asd gendl.asd geom-base/geom-base.asd glisp/glisp.asd gwl-graphics/gwl-graphics.asd gwl/gwl.asd regression/regression.asd setup-cffi/setup-cffi.asd surf/surf.asd -generators http://beta.quicklisp.org/archive/generators/2013-06-15/generators-20130615-git.tgz 4999 e0de3d2f81b7d5802403186012bc37b6 f9df68f27c422f6dcce84f0635a42500ca2d6e39 generators-20130615-git generators.asd -generic-cl http://beta.quicklisp.org/archive/generic-cl/2019-11-30/generic-cl-20191130-git.tgz 66629 4993917d297113bf47002d2f5afa24b4 c307f7ee08d74fdd7417c30208b43b6de50fd127 generic-cl-20191130-git generic-cl.asd -generic-comparability http://beta.quicklisp.org/archive/generic-comparability/2018-01-31/generic-comparability-20180131-git.tgz 5622 9cc021f7f580a6e4951066f629bc56f3 7ef5b496c236d42f4fdf529ae257a2e99a9e4417 generic-comparability-20180131-git generic-comparability.asd -generic-sequences http://beta.quicklisp.org/archive/generic-sequences/2015-07-09/generic-sequences-20150709-git.tgz 106323 be208c2f1e6ea5ecd39355d24676312c 330178da719e73413c84f11e42170e76cf60b657 generic-sequences-20150709-git generic-sequences-cont.asd generic-sequences-iterate.asd generic-sequences-stream.asd generic-sequences-test.asd generic-sequences.asd -geneva http://beta.quicklisp.org/archive/geneva/2016-12-04/geneva-20161204-git.tgz 28218 6539a3fb3b4d8e6c2f4c8b1193ded5b3 80144517cb11bd17dd0c6e04470faa450855292e geneva-20161204-git geneva-cl.asd geneva-html.asd geneva-latex.asd geneva-mk2.asd geneva-plain-text.asd geneva-tex.asd geneva.asd open-geneva.asd -genhash http://beta.quicklisp.org/archive/genhash/2018-12-10/genhash-20181210-git.tgz 4210 373e52616aa9563899004e5f017cff6b 36a71477e3ddb2de935ff044dbb9bbe38cc48c76 genhash-20181210-git genhash.asd -genie http://beta.quicklisp.org/archive/genie/2019-03-07/genie-20190307-git.tgz 2991 a330d90823d8b14bf935f7a78bfb47f7 de9fff083c39e125cda4e3c0bf479d9484e4621f genie-20190307-git genie.asd -geowkt http://beta.quicklisp.org/archive/geowkt/2018-10-18/geowkt-20181018-git.tgz 127442 a3827d633b77241dbe0a18d7df672f6e a75474f5cec2bda247c423004147faa68e8d9492 geowkt-20181018-git geowkt-update.asd geowkt.asd -getopt http://beta.quicklisp.org/archive/getopt/2015-09-23/getopt-20150923-git.tgz 5108 adc97a0ae99d65edff231b35862d67dd 001d521ec954ddd8222f708316c04c6e522e2b16 getopt-20150923-git getopt.asd -gettext http://beta.quicklisp.org/archive/gettext/2017-11-30/gettext-20171130-git.tgz 23766 d162cb5310db5011c82ef6343fd280ed 896479742580c8abecf8f47b77c48d56988b3089 gettext-20171130-git gettext-example/gettext-example.asd gettext-tests/gettext-tests.asd gettext.asd -git-file-history http://beta.quicklisp.org/archive/git-file-history/2016-08-25/git-file-history-20160825-git.tgz 2640 a642d433a7fd6c73b1c81ad21ab5223e 7522386a8d66527f352d2b63c66feab5814769df git-file-history-20160825-git git-file-history-test.asd git-file-history.asd -glad-blob http://beta.quicklisp.org/archive/glad-blob/2018-02-28/glad-blob-stable-e6dd7fef-git.tgz 325980 fe67fc6d40b544b404b43879467cf054 226a4be77594fec3dc1ee8205b5e8d6c67c8576e glad-blob-stable-e6dd7fef-git glad-blob.asd -glass http://beta.quicklisp.org/archive/glass/2015-07-09/glass-20150709-git.tgz 70206 45acf599d8810960366575efe9e6dae4 49a0edeb8c25222add274d8ec7aebb8416fda42d glass-20150709-git glass.asd -glaw http://beta.quicklisp.org/archive/glaw/2018-02-28/glaw-20180228-git.tgz 1427712 aa341fdc184de0a4be21654af6b95d5a 361ba78fe7b6456b03bf8ab9c49d6330c2e3b52a glaw-20180228-git glaw-examples.asd glaw-imago.asd glaw-sdl.asd glaw.asd -glfw-blob http://beta.quicklisp.org/archive/glfw-blob/2018-02-28/glfw-blob-stable-5af92db3-git.tgz 488790 5567c3a03fa4b5cb6557f84e49c2240d 44905ce7d667322a522783c24bbe3cd6d36f4a37 glfw-blob-stable-5af92db3-git glfw-blob.asd -glisph http://beta.quicklisp.org/archive/glisph/2017-04-03/glisph-20170403-git.tgz 2341692 8fbfbd69a4b60b1cf7456b1a05332d37 9316f601eb05d9db8eebc61a3f0746227ccf1062 glisph-20170403-git glisph-test.asd glisph.asd -glkit http://beta.quicklisp.org/archive/glkit/2017-12-27/glkit-20171227-git.tgz 15068 96045c730e405bff1729f56ef79ac65b 87b6502dc08a45f997b942c088677bd32189ce20 glkit-20171227-git glkit-examples.asd glkit.asd -global-vars http://beta.quicklisp.org/archive/global-vars/2014-11-06/global-vars-20141106-git.tgz 3581 dd3153ee75c972a80450aa00644b2200 06ef315e35eaf447159303a16827e05cc28af887 global-vars-20141106-git global-vars-test.asd global-vars.asd -glop http://beta.quicklisp.org/archive/glop/2017-10-19/glop-20171019-git.tgz 85964 329610c0ffc7a862ce454d1901895bca 7d196144d503e8bba5a1ea8b4afe1a19927f8ac6 glop-20171019-git glop-test.asd glop.asd -glsl-packing http://beta.quicklisp.org/archive/glsl-packing/2018-01-31/glsl-packing-20180131-git.tgz 11241 32b129a2f045f76689c253d13aa8c8bc 3d93bc0affd8a6db19ed7397ed211e4499de0eae glsl-packing-20180131-git glsl-packing.asd -glsl-spec http://beta.quicklisp.org/archive/glsl-spec/2019-10-07/glsl-spec-release-quicklisp-f04476f7-git.tgz 133677 52760939a269acce6b2cba8dbde81ef7 4427cd544f8db5028d5acf54c85f55f398d8a8e7 glsl-spec-release-quicklisp-f04476f7-git glsl-docs.asd glsl-spec.asd glsl-symbols.asd -glsl-toolkit http://beta.quicklisp.org/archive/glsl-toolkit/2019-12-27/glsl-toolkit-20191227-git.tgz 35623 69c04729b2bf81cd399e3c71577849fa 676d61ea181160e6276afd2d571e872467dfd167 glsl-toolkit-20191227-git glsl-toolkit.asd -glu-tessellate http://beta.quicklisp.org/archive/glu-tessellate/2015-06-08/glu-tessellate-20150608-git.tgz 4736 bebb4d2d5c471ecd0c542ea01b7c48ab 38ef8ee019ff2e082ecb7b582ab86ba245fc9b74 glu-tessellate-20150608-git glu-tessellate.asd -glyphs http://beta.quicklisp.org/archive/glyphs/2018-07-11/glyphs-20180711-git.tgz 16354 1b7cd4d3cda79fa8a35148fedf991e11 a14199085a75163efefd17cfce15fb0a6f3bc9ee glyphs-20180711-git glyphs-test.asd glyphs.asd -golden-utils http://beta.quicklisp.org/archive/golden-utils/2019-08-13/golden-utils-20190813-git.tgz 8881 f66ce89ef840df51d4576964e1bdf393 9ece6b4ea846177cc830248f062b214b4309c75f golden-utils-20190813-git golden-utils.asd -gordon http://beta.quicklisp.org/archive/gordon/2014-07-13/gordon-20140713-git.tgz 91027 aeb5459e295855ce205af6f3fa15621a 4d3952782099079c6f6f3070ed6c964f997fb83a gordon-20140713-git gordon.asd -graph http://beta.quicklisp.org/archive/graph/2019-11-30/graph-20191130-git.tgz 40849 f2ccfbb47e4bcdf39f203dd4eab17524 99b642d96f96d882cf6cd4cd0cdd0a96752adeb1 graph-20191130-git graph.asd -graylex http://beta.quicklisp.org/archive/graylex/2011-05-22/graylex-20110522-git.tgz 26517 ebed20d32a2ed9bb763adac09a28ee7d be6cbbe39543e51eafbd0aa171353905db8f251a graylex-20110522-git graylex-m4-example.asd graylex.asd -green-threads http://beta.quicklisp.org/archive/green-threads/2014-12-17/green-threads-20141217-git.tgz 7895 6f2ac5dde894abb04e9dbb55c70ee658 61959b4f605a546d4fbe07a6c84f6754e54e9563 green-threads-20141217-git green-threads.asd -group-by http://beta.quicklisp.org/archive/group-by/2014-02-11/group-by-20140211-git.tgz 9071 25caa8291d230d98f66bca57a28ee7a5 9f600f78dc04fbfd4a1260427eb3079278ba2932 group-by-20140211-git group-by.asd -grovel-locally http://beta.quicklisp.org/archive/grovel-locally/2018-02-28/grovel-locally-20180228-git.tgz 5896 e99f1dece67838730a8845c7fbbf19c6 c419b568a3d45c9232a2ceae328c099b736472bc grovel-locally-20180228-git grovel-locally.asd -gsll http://beta.quicklisp.org/archive/gsll/2018-08-31/gsll-quicklisp-eeeda841-git.tgz 317981 4b21395e6c4531dc067d00ed10b580e1 de3edd6293d93620c33938c1ca6318ae13b6bdb4 gsll-quicklisp-eeeda841-git gsll.asd -gtk-tagged-streams http://beta.quicklisp.org/archive/gtk-tagged-streams/2018-02-28/gtk-tagged-streams-quicklisp-d1c2b827-git.tgz 73541 952070238f59cf17496556a98f04e8f6 7d4a0f5d5895e8eb0ab4f7d0d37547dc7eb211b3 gtk-tagged-streams-quicklisp-d1c2b827-git gtk-tagged-streams.asd -gtype http://beta.quicklisp.org/archive/gtype/2019-12-27/gtype-20191227-git.tgz 23144 f56dcd60fb6508203deb7cb033a61160 802686958b3d24e9d37c3e72aa0490a29ac594ab gtype-20191227-git gtype.asd gtype.test.asd -gzip-stream http://beta.quicklisp.org/archive/gzip-stream/2010-10-06/gzip-stream_0.2.8.tgz 12149 6f0c06fdf7ca0c3124593a2b99b69935 fbcd75fd3042c6fb7f33bcd4d7f065e2248a6a38 gzip-stream_0.2.8 gzip-stream.asd -halftone http://beta.quicklisp.org/archive/halftone/2019-07-10/halftone-20190710-git.tgz 5664 8b0e8a4411bd73acac297d124dd4d672 6b80181e4f8e8c2e564df62cf751f0c8d7d2667d halftone-20190710-git halftone.asd -harmony http://beta.quicklisp.org/archive/harmony/2019-07-10/harmony-20190710-git.tgz 70775 20addce2884c8206923ed8e02c59cc8a 8036fd327146c97dc9161160323b220df4feeba6 harmony-20190710-git drains/harmony-alsa.asd drains/harmony-coreaudio.asd drains/harmony-openal.asd drains/harmony-out123.asd drains/harmony-pulse.asd drains/harmony-wasapi.asd harmony.asd simple/harmony-simple.asd sources/harmony-flac.asd sources/harmony-mp3.asd sources/harmony-wav.asd -hash-set http://beta.quicklisp.org/archive/hash-set/2016-06-28/hash-set-20160628-git.tgz 6076 254fe9e8496265f078c4151ba3023f1b c1ddb19b474dfb9cc36ed6d5fc1858a15181d8ac hash-set-20160628-git hash-set-tests.asd hash-set.asd -hdf5-cffi http://beta.quicklisp.org/archive/hdf5-cffi/2018-02-28/hdf5-cffi-20180228-git.tgz 54363 dbe93f460641f2be9a9c1a910d4ef315 f6a7edd796abf4c379fe7e954690e6362d342600 hdf5-cffi-20180228-git hdf5-cffi.asd hdf5-cffi.examples.asd hdf5-cffi.test.asd -heap http://beta.quicklisp.org/archive/heap/2018-10-18/heap-20181018-git.tgz 2871 a2355ef9c113a3335919a45195083951 3c94679187d9a855a343647f8503812c0925f4f9 heap-20181018-git heap.asd -helambdap http://beta.quicklisp.org/archive/helambdap/2019-10-07/helambdap-20191007-git.tgz 101499 29f86c6e34ec5c7b09a7425e78c4bf17 76ea5c8f4026daa236e3f0b4af990e1450f83ffb helambdap-20191007-git helambdap.asd -hemlock http://beta.quicklisp.org/archive/hemlock/2016-12-08/hemlock-20161208-git.tgz 1283394 743d6fab15c5eed78c259f7afb5cd748 dd3196e78efee2f55be6e08adfe2d5dafc308d2f hemlock-20161208-git hemlock.base.asd hemlock.clx.asd hemlock.qt.asd hemlock.tty.asd -hermetic http://beta.quicklisp.org/archive/hermetic/2019-10-07/hermetic-20191007-git.tgz 4564 72d6a7322c98bf3040e88bb17b2f8b27 532f1f055d8e3a277a123d6c7304588457c712ec hermetic-20191007-git hermetic.asd -hh-aws http://beta.quicklisp.org/archive/hh-aws/2015-08-04/hh-aws-20150804-git.tgz 16762 3d1f15d366f2c0b161f5c8b7759f868a 91faf1b47a18eeb129f608a594a43f230a0c10b4 hh-aws-20150804-git hh-aws.asd -hh-redblack http://beta.quicklisp.org/archive/hh-redblack/2015-10-31/hh-redblack-20151031-git.tgz 13091 4c61afc0406a8eacffebc494a1230beb b4f520f58d13ba5fddb22f042944db2dc02cd960 hh-redblack-20151031-git hh-redblack.asd -hh-web http://beta.quicklisp.org/archive/hh-web/2014-11-06/hh-web-20141106-git.tgz 49100 f18080fa53654dac8d77e5ed5d9953ff d40315c8346f3d101c6c3acecb2e3ae24100484a hh-web-20141106-git hh-web.asd -hl7-client http://beta.quicklisp.org/archive/hl7-client/2015-04-07/hl7-client-20150407-git.tgz 3149 ee18a7ef718e2fb389ad27e6dd628d6d ab1915436f9377f698785eacbafbb8615441956e hl7-client-20150407-git hl7-client.asd -hl7-parser http://beta.quicklisp.org/archive/hl7-parser/2016-05-31/hl7-parser-20160531-git.tgz 5154 92fc8f793d674bb661b0363e1721b3d0 388f1e64bb4d2b76818ac0c02299fcab906b5538 hl7-parser-20160531-git hl7-parser.asd -horner http://beta.quicklisp.org/archive/horner/2019-11-30/horner-20191130-git.tgz 4644 8b4eabb5b0d56ba098ac4a21ae82ff60 aee72c11f78279ad81a01703e3110f1fc0b8aff7 horner-20191130-git horner.asd -horse-html http://beta.quicklisp.org/archive/horse-html/2019-10-07/horse-html-20191007-git.tgz 6518 c5ecbddc6a5e3c40d8329d13a2683763 e5ca014c5a7ca7db9e1f24e27d33c0ee016a53fb horse-html-20191007-git horse-html.asd -house http://beta.quicklisp.org/archive/house/2018-04-30/house-20180430-git.tgz 13014 6f39b6666d880b2be9cf8ed12222b626 17bc8a62f6cca820ed1b89ffbb2249b46b2c4a57 house-20180430-git house.asd -hspell http://beta.quicklisp.org/archive/hspell/2014-12-17/hspell-20141217-git.tgz 2205 a2bce23a0e37215f8302d1092c60c35e 19c8bb3f33d3f7df3a6fbec8a798c1c1f358ab38 hspell-20141217-git hspell.asd -ht-simple-ajax http://beta.quicklisp.org/archive/ht-simple-ajax/2013-04-21/ht-simple-ajax-20130421-git.tgz 10059 2787aebfc9c4d458206d50461f9443ab e1871d0755dbd48151d54c0c0e512f84798b3d4c ht-simple-ajax-20130421-git ht-simple-ajax.asd -html-encode http://beta.quicklisp.org/archive/html-encode/2010-10-06/html-encode-1.2.tgz 3132 67f22483fe6d270b8830f78f285a1016 ce347529dbb02f008c079427bcb1050372cc24e4 html-encode-1.2 html-encode.asd -html-entities http://beta.quicklisp.org/archive/html-entities/2017-10-19/html-entities-20171019-git.tgz 39697 7a71bcd138f1f367f26e26e9c8e3a390 95458f97469288061d505756bc1f1518b37462d7 html-entities-20171019-git html-entities.asd -html-template http://beta.quicklisp.org/archive/html-template/2017-12-27/html-template-20171227-git.tgz 32376 fb77c495914641f5e67e51a370b2d5a3 946ce5d402bb54c60f84acd6c6d7f6590ede40f1 html-template-20171227-git html-template.asd -http-body http://beta.quicklisp.org/archive/http-body/2019-08-13/http-body-20190813-git.tgz 15739 d46ac52643ae7dc148438f84a8107a79 1da29c1f6f6a06a5ab784acad8ebf702ba6c6216 http-body-20190813-git http-body-test.asd http-body.asd -http-get-cache http://beta.quicklisp.org/archive/http-get-cache/2018-02-28/http-get-cache-20180228-git.tgz 3610 807a9feefeed19159ff46c5733e13da6 2c4623119391c1403fd86f5c19e4865839e62e71 http-get-cache-20180228-git http-get-cache.asd -http-parse http://beta.quicklisp.org/archive/http-parse/2015-06-08/http-parse-20150608-git.tgz 30047 89b5449d33d1ad027606259f84b4c282 65a5aa04e2f6761fc87e6f2c7e7182462ebdaf3f http-parse-20150608-git http-parse-test.asd http-parse.asd -hu.dwim.asdf http://beta.quicklisp.org/archive/hu.dwim.asdf/2019-05-21/hu.dwim.asdf-20190521-darcs.tgz 6579 b359bf05f587196eba172803b5594318 435c3581852106065ba0d6978a23ac3e896d3a64 hu.dwim.asdf-20190521-darcs hu.dwim.asdf.asd hu.dwim.asdf.documentation.asd -hu.dwim.bluez http://beta.quicklisp.org/archive/hu.dwim.bluez/2016-09-29/hu.dwim.bluez-quicklisp-f3ebd960-git.tgz 126596 f751576de9d66818115f4db9f448644e 7ffaa82b75608d347efe799d50665b30b5dc07d0 hu.dwim.bluez-quicklisp-f3ebd960-git hu.dwim.bluez.asd -hu.dwim.common http://beta.quicklisp.org/archive/hu.dwim.common/2015-07-09/hu.dwim.common-20150709-darcs.tgz 3083 fff7f05c24e71a0270021909ca86a9ef 6ff0a62c94fee95b1440b59230f4a9c174d95093 hu.dwim.common-20150709-darcs hu.dwim.common.asd hu.dwim.common.documentation.asd -hu.dwim.common-lisp http://beta.quicklisp.org/archive/hu.dwim.common-lisp/2015-07-09/hu.dwim.common-lisp-20150709-darcs.tgz 2107 d3319cf3d963bff64ff90847af79251f b49f86c70a89ef52bb6b8da5b981d4ff51de48f9 hu.dwim.common-lisp-20150709-darcs hu.dwim.common-lisp.asd hu.dwim.common-lisp.documentation.asd -hu.dwim.computed-class http://beta.quicklisp.org/archive/hu.dwim.computed-class/2016-12-04/hu.dwim.computed-class-20161204-darcs.tgz 18769 f644ad7dd48737020a814319c934d23a ddb5126e5d2ff305ad5701106875710c8ac9c833 hu.dwim.computed-class-20161204-darcs hu.dwim.computed-class+hu.dwim.logger.asd hu.dwim.computed-class+swank.asd hu.dwim.computed-class.asd hu.dwim.computed-class.documentation.asd hu.dwim.computed-class.test.asd -hu.dwim.debug http://beta.quicklisp.org/archive/hu.dwim.debug/2019-01-07/hu.dwim.debug-20190107-darcs.tgz 6637 18d7d06110fdbd454e350d92cf5f17cc 3ba6fdf418010b6d7dc03d3dc95ec7c4171d6933 hu.dwim.debug-20190107-darcs hu.dwim.debug.asd hu.dwim.debug.documentation.asd hu.dwim.debug.test.asd -hu.dwim.def http://beta.quicklisp.org/archive/hu.dwim.def/2017-10-19/hu.dwim.def-20171019-darcs.tgz 19966 b0b6adc89b6aeb22fc6bb0caa9253712 c7f0abc95067fafa8764cea694dfe69a852dee61 hu.dwim.def-20171019-darcs hu.dwim.def+cl-l10n.asd hu.dwim.def+contextl.asd hu.dwim.def+hu.dwim.common.asd hu.dwim.def+hu.dwim.delico.asd hu.dwim.def+swank.asd hu.dwim.def.asd hu.dwim.def.documentation.asd hu.dwim.def.namespace.asd hu.dwim.def.test.asd -hu.dwim.defclass-star http://beta.quicklisp.org/archive/hu.dwim.defclass-star/2015-07-09/hu.dwim.defclass-star-20150709-darcs.tgz 7655 e37f386dca8f789fb2e303a1914f0415 ef556505bb91ff2d2f87bd327815e0f8bc4bde49 hu.dwim.defclass-star-20150709-darcs hu.dwim.defclass-star+contextl.asd hu.dwim.defclass-star+hu.dwim.def+contextl.asd hu.dwim.defclass-star+hu.dwim.def.asd hu.dwim.defclass-star+swank.asd hu.dwim.defclass-star.asd hu.dwim.defclass-star.documentation.asd hu.dwim.defclass-star.test.asd -hu.dwim.delico http://beta.quicklisp.org/archive/hu.dwim.delico/2018-04-30/hu.dwim.delico-20180430-darcs.tgz 19912 8fed0622f682d1de701d343159a43c7f adb94372a21da4e5c6d01908331fabd4a8cbeead hu.dwim.delico-20180430-darcs hu.dwim.delico.asd hu.dwim.delico.documentation.asd hu.dwim.delico.test.asd -hu.dwim.graphviz http://beta.quicklisp.org/archive/hu.dwim.graphviz/2017-08-30/hu.dwim.graphviz-20170830-darcs.tgz 11239 421c6dacc287bbc76443cc0e657ccaec 187e541dfe4add0b4ce0e9d111c15a5cd30070fd hu.dwim.graphviz-20170830-darcs hu.dwim.graphviz.asd hu.dwim.graphviz.documentation.asd hu.dwim.graphviz.test.asd -hu.dwim.logger http://beta.quicklisp.org/archive/hu.dwim.logger/2015-12-18/hu.dwim.logger-20151218-darcs.tgz 11456 4e180dbb379266d0cd29f5c238e1da5a 4e014f4993835235ac53a47fb900ea44b0652cc8 hu.dwim.logger-20151218-darcs hu.dwim.logger+iolib.asd hu.dwim.logger+swank.asd hu.dwim.logger.asd hu.dwim.logger.documentation.asd hu.dwim.logger.test.asd -hu.dwim.partial-eval http://beta.quicklisp.org/archive/hu.dwim.partial-eval/2017-11-30/hu.dwim.partial-eval-20171130-darcs.tgz 24393 78c498a3ba353e0a62e15df49a459078 9acbc3ab6c50c1104c94047ef747456a7cffd854 hu.dwim.partial-eval-20171130-darcs hu.dwim.partial-eval.asd hu.dwim.partial-eval.documentation.asd hu.dwim.partial-eval.test.asd -hu.dwim.perec http://beta.quicklisp.org/archive/hu.dwim.perec/2018-01-31/hu.dwim.perec-20180131-darcs.tgz 183286 d83b7b553244d10d7ce1dfc163a5d7ff 4eecec9468212801e4574db2c0cdcf4eb662575f hu.dwim.perec-20180131-darcs hu.dwim.perec+hu.dwim.quasi-quote.xml.asd hu.dwim.perec+iolib.asd hu.dwim.perec+swank.asd hu.dwim.perec.all.asd hu.dwim.perec.all.test.asd hu.dwim.perec.asd hu.dwim.perec.documentation.asd hu.dwim.perec.oracle.asd hu.dwim.perec.oracle.test.asd hu.dwim.perec.postgresql.asd hu.dwim.perec.postgresql.test.asd hu.dwim.perec.sqlite.asd hu.dwim.perec.sqlite.test.asd hu.dwim.perec.test.asd -hu.dwim.presentation http://beta.quicklisp.org/archive/hu.dwim.presentation/2017-10-19/hu.dwim.presentation-20171019-darcs.tgz 1729653 428ab20690f3513d974448d0097e6de1 66e02a2cf33ed07c918bc81c48237a3a268baca9 hu.dwim.presentation-20171019-darcs hu.dwim.presentation+cl-graph+cl-typesetting.asd hu.dwim.presentation+cl-typesetting.asd hu.dwim.presentation+hu.dwim.stefil.asd hu.dwim.presentation+hu.dwim.web-server.asd hu.dwim.presentation.asd -hu.dwim.quasi-quote http://beta.quicklisp.org/archive/hu.dwim.quasi-quote/2017-11-30/hu.dwim.quasi-quote-20171130-darcs.tgz 72072 314b7f577e7aec4e0ad0fafea22664b3 a6cfe34f6d330f543155a40b1324a70c94272fa5 hu.dwim.quasi-quote-20171130-darcs hu.dwim.quasi-quote.asd hu.dwim.quasi-quote.css.asd hu.dwim.quasi-quote.documentation.asd hu.dwim.quasi-quote.js.asd hu.dwim.quasi-quote.pdf.asd hu.dwim.quasi-quote.test.asd hu.dwim.quasi-quote.xml+cxml.asd hu.dwim.quasi-quote.xml+hu.dwim.quasi-quote.js.asd hu.dwim.quasi-quote.xml.asd -hu.dwim.rdbms http://beta.quicklisp.org/archive/hu.dwim.rdbms/2018-02-28/hu.dwim.rdbms-20180228-darcs.tgz 116724 719880aa6837228d1f87176ab3cd003b cea924b46169e492767618038ea8351d8459eecf hu.dwim.rdbms-20180228-darcs hu.dwim.rdbms.all.asd hu.dwim.rdbms.all.test.asd hu.dwim.rdbms.asd hu.dwim.rdbms.documentation.asd hu.dwim.rdbms.oracle.asd hu.dwim.rdbms.oracle.test.asd hu.dwim.rdbms.postgresql.asd hu.dwim.rdbms.postgresql.test.asd hu.dwim.rdbms.sqlite.asd hu.dwim.rdbms.sqlite.test.asd hu.dwim.rdbms.test.asd -hu.dwim.reiterate http://beta.quicklisp.org/archive/hu.dwim.reiterate/2017-10-19/hu.dwim.reiterate-20171019-darcs.tgz 21412 d6f0210e9e4aaef63dcbf24aeb564dd1 bad2b13f2aedeee69b767e6fc723fea2d40246b3 hu.dwim.reiterate-20171019-darcs hu.dwim.reiterate+hu.dwim.logger.asd hu.dwim.reiterate.asd -hu.dwim.sdl http://beta.quicklisp.org/archive/hu.dwim.sdl/2018-02-28/hu.dwim.sdl-quicklisp-aad47404-git.tgz 1787723 9474a5fda11b03a06706ea11a56b2822 8f030144d97d14ac58dc2b12f4b5cf60bbc360af hu.dwim.sdl-quicklisp-aad47404-git hu.dwim.sdl.asd -hu.dwim.serializer http://beta.quicklisp.org/archive/hu.dwim.serializer/2016-12-04/hu.dwim.serializer-20161204-darcs.tgz 12092 bb15ef778eca814e4f1caa5ae05fb7ad 197e6d4df639b4bbd976e819b3247d20a937bb5e hu.dwim.serializer-20161204-darcs hu.dwim.serializer.asd hu.dwim.serializer.documentation.asd hu.dwim.serializer.test.asd -hu.dwim.stefil http://beta.quicklisp.org/archive/hu.dwim.stefil/2017-04-03/hu.dwim.stefil-20170403-darcs.tgz 24074 ea8be76a360b1df297a8bbd50be0d8a1 d5a5ca36649838b14a270cea28743883672598e3 hu.dwim.stefil-20170403-darcs hu.dwim.stefil+hu.dwim.def+swank.asd hu.dwim.stefil+hu.dwim.def.asd hu.dwim.stefil+swank.asd hu.dwim.stefil.asd -hu.dwim.syntax-sugar http://beta.quicklisp.org/archive/hu.dwim.syntax-sugar/2016-12-04/hu.dwim.syntax-sugar-20161204-darcs.tgz 19274 c155225d3a2b9a329adfcb705b915a91 2f4c5e896d05181efcf0debf1741ac3e0e2fca06 hu.dwim.syntax-sugar-20161204-darcs hu.dwim.syntax-sugar.asd hu.dwim.syntax-sugar.documentation.asd hu.dwim.syntax-sugar.test.asd -hu.dwim.uri http://beta.quicklisp.org/archive/hu.dwim.uri/2018-02-28/hu.dwim.uri-20180228-darcs.tgz 8543 0e3408935a77c74a944f9a34dae3e728 f26121022ce365911e2ab03d8de2af07b8ec2a2d hu.dwim.uri-20180228-darcs hu.dwim.uri.asd hu.dwim.uri.test.asd -hu.dwim.util http://beta.quicklisp.org/archive/hu.dwim.util/2017-10-19/hu.dwim.util-20171019-darcs.tgz 51237 57a824c371c7fc393373218e4c1b543f e43f21213958998e39ab6e6d1c563a019f277ff7 hu.dwim.util-20171019-darcs hu.dwim.util+iolib.asd hu.dwim.util.asd hu.dwim.util.documentation.asd hu.dwim.util.test.asd -hu.dwim.walker http://beta.quicklisp.org/archive/hu.dwim.walker/2015-12-18/hu.dwim.walker-20151218-darcs.tgz 37982 39c1af6715dacb25329cddefac1be792 72b3e954bd87f3834b7b2f7f79509677b6e57b54 hu.dwim.walker-20151218-darcs hu.dwim.walker.asd hu.dwim.walker.documentation.asd hu.dwim.walker.test.asd -hu.dwim.web-server http://beta.quicklisp.org/archive/hu.dwim.web-server/2018-12-10/hu.dwim.web-server-20181210-darcs.tgz 511462 1bc99a6a26cb46ba7a8fa968034376ef c9b3001c740074b12f5d45a787dec1fb373bba28 hu.dwim.web-server-20181210-darcs hu.dwim.web-server+swank.asd hu.dwim.web-server.application+hu.dwim.perec.asd hu.dwim.web-server.application.asd hu.dwim.web-server.application.test.asd hu.dwim.web-server.asd hu.dwim.web-server.documentation.asd hu.dwim.web-server.test.asd hu.dwim.web-server.websocket.asd -hu.dwim.zlib http://beta.quicklisp.org/archive/hu.dwim.zlib/2017-08-30/hu.dwim.zlib-quicklisp-18b8e530-git.tgz 164424 b211be3638ce70b50c87af43e982f46f 39e7e7e389db0189e84d852fb59079b9380110ea hu.dwim.zlib-quicklisp-18b8e530-git hu.dwim.zlib.asd -huffman http://beta.quicklisp.org/archive/huffman/2018-10-18/huffman-20181018-git.tgz 2956 195c5722536473cadd283336008bab57 a458727ba8a5e188ecc18e64544836e83fab9b24 huffman-20181018-git huffman.asd -humbler http://beta.quicklisp.org/archive/humbler/2019-07-10/humbler-20190710-git.tgz 48317 a24a0968292724abb594d0a114e61e73 94ec67e5fe60b158d713497084db49be582d1b3d humbler-20190710-git humbler.asd -hunchensocket http://beta.quicklisp.org/archive/hunchensocket/2018-07-11/hunchensocket-20180711-git.tgz 12634 bf6cd52c13e3b1f464c8a45a8bac85b8 6a24827054f897a200220f416ba63db56ce24887 hunchensocket-20180711-git hunchensocket.asd -hunchentools http://beta.quicklisp.org/archive/hunchentools/2016-12-04/hunchentools-20161204-git.tgz 5310 3e4c00484a54fce107969941aa695e35 81c5f8bed80dd333cbc1be69da3bb2c752d7ebf9 hunchentools-20161204-git hunchentools.asd -hunchentoot http://beta.quicklisp.org/archive/hunchentoot/2017-12-27/hunchentoot-v1.2.38.tgz 218697 878a7833eb34a53231011b78e998e2fa 4fb0bf93d3cf3720e0bf0b222d01df8df1012857 hunchentoot-v1.2.38 hunchentoot.asd -hunchentoot-auth http://beta.quicklisp.org/archive/hunchentoot-auth/2014-01-13/hunchentoot-auth-20140113-git.tgz 5878 f6763dbbfd1f5421e46ff3e9648eeef6 fffbfd821814f8460262143be04c16db0d5f29f7 hunchentoot-auth-20140113-git hunchentoot-auth.asd -hunchentoot-cgi http://beta.quicklisp.org/archive/hunchentoot-cgi/2014-02-11/hunchentoot-cgi-20140211-git.tgz 4322 e300c5959f7100b7e032066239d82541 bf8b301b9f4a99a4ef2237581df81f2d848349a4 hunchentoot-cgi-20140211-git hunchentoot-cgi.asd -hunchentoot-multi-acceptor http://beta.quicklisp.org/archive/hunchentoot-multi-acceptor/2019-11-30/hunchentoot-multi-acceptor-20191130-git.tgz 6408 734aa1624d6d04f26664f4fcff10df9e 1889515bcd205853c813f4d0527330b2077e0d84 hunchentoot-multi-acceptor-20191130-git hunchentoot-multi-acceptor.asd -hunchentoot-single-signon http://beta.quicklisp.org/archive/hunchentoot-single-signon/2013-11-11/hunchentoot-single-signon-20131111-git.tgz 2279 52b6a4438e7c63209f674eadba35168c a67c2e3a07f00cf2738ac14400ebdc44868195dc hunchentoot-single-signon-20131111-git hunchentoot-single-signon.asd -hyperluminal-mem http://beta.quicklisp.org/archive/hyperluminal-mem/2016-12-04/hyperluminal-mem-20161204-git.tgz 88995 da358539317553cbdaef4c219d20b67a 762447423e1be7578ac777b8bc18abd82e258c16 hyperluminal-mem-20161204-git hyperluminal-mem.asd -hyperobject http://beta.quicklisp.org/archive/hyperobject/2013-04-20/hyperobject-20130420-git.tgz 41879 460a3c040b1ef40bdc9290eaa1a86249 da930ff34d7d234a1ae6e7c7596f0f5810106a3f hyperobject-20130420-git hyperobject-tests.asd hyperobject.asd -hyperspec http://beta.quicklisp.org/archive/hyperspec/2018-12-10/hyperspec-20181210-git.tgz 23892 742d80f89020e90234f1b8b6f00a3056 4bafc32c2cfd86b013525385e98ec7fa6a6a32c7 hyperspec-20181210-git hyperspec.asd -ia-hash-table http://beta.quicklisp.org/archive/ia-hash-table/2016-03-18/ia-hash-table-20160318-git.tgz 4491 59a825b5b809aabb5ac5db96728756b7 e23c512d4ab5c06fe31cda3fddad17e88981d2c5 ia-hash-table-20160318-git ia-hash-table.asd ia-hash-table.test.asd -iclendar http://beta.quicklisp.org/archive/iclendar/2019-07-10/iclendar-20190710-git.tgz 88066 4ce57c1359648e497fb25962ec2c0594 0bbc2d371b1f87d4077dff0e978f29dc9ebeca50 iclendar-20190710-git iclendar.asd -id3v2 http://beta.quicklisp.org/archive/id3v2/2016-02-08/id3v2-20160208-git.tgz 3963 427ec2cf9a5f8a8be20a663c336c2288 523e03187ec89b0ce2fe95c9bb9dd1376b6856e4 id3v2-20160208-git id3v2-test.asd id3v2.asd -idna http://beta.quicklisp.org/archive/idna/2012-01-07/idna-20120107-git.tgz 6242 85b91a66efe4381bf116cdb5d2b756b6 a32def3834b2130ace95c31af82c6c8b92365c53 idna-20120107-git idna.asd -ieee-floats http://beta.quicklisp.org/archive/ieee-floats/2017-08-30/ieee-floats-20170830-git.tgz 5325 3434b4d91224ca6a817ced9d83f14bb6 fa9e496f0fcf4ba05754fc32787f728ca6e2d674 ieee-floats-20170830-git ieee-floats.asd -illogical-pathnames http://beta.quicklisp.org/archive/illogical-pathnames/2016-08-25/illogical-pathnames-20160825-git.tgz 6071 386d2b1c0a4f280a52841f4a58ddfad2 dce6a9935768ed7323f4744e9d42752aa52af3d2 illogical-pathnames-20160825-git illogical-pathnames.asd -illusion http://beta.quicklisp.org/archive/illusion/2018-08-31/illusion-20180831-git.tgz 5591 e29adc45f1e630a68b7a2594ce8e1d38 b3edb224814b92f42bdc85f76cfda22fb4a61caf illusion-20180831-git illusion-test.asd illusion.asd -image http://beta.quicklisp.org/archive/image/2012-01-07/image-20120107-git.tgz 12334 f6e1bdabba64a9be1f31602ef87b993c f54562f11b8c6b005a480974bf6742c3dff33864 image-20120107-git image.asd -imago http://beta.quicklisp.org/archive/imago/2015-06-08/imago-20150608-git.tgz 17228 2aadfc8061203e178ef01d1169d70371 7914c440be279c14f7af25456ace26b7cd0a7cf6 imago-20150608-git imago.asd -immutable-struct http://beta.quicklisp.org/archive/immutable-struct/2015-07-09/immutable-struct-20150709-git.tgz 2413 dd68ea45a64bd739e733aa2bcf59955c cca9b233fdb9c441fd02a0015a91b982b34978be immutable-struct-20150709-git immutable-struct.asd -incf-cl http://beta.quicklisp.org/archive/incf-cl/2019-07-10/incf-cl-20190710-git.tgz 14029 d517885c08a3c9ab7ab0f56071660ed4 4c29c854fba0610eb9f8adc42b99a1e15bff8bfe incf-cl-20190710-git incf-cl.asd -incognito-keywords http://beta.quicklisp.org/archive/incognito-keywords/2013-01-28/incognito-keywords-1.1.tgz 3817 4759f96fbe4f7873f52d126cec3d5b51 d01f0962811264cea7a3ae1abcc510fd0b177d07 incognito-keywords-1.1 incognito-keywords.asd -incongruent-methods http://beta.quicklisp.org/archive/incongruent-methods/2013-03-12/incongruent-methods-20130312-git.tgz 7171 9e41e9a0a9f33e4f9a00b7d525d8d9c2 73424d66cec5c544ac1fd30729d4357ee2ede37a incongruent-methods-20130312-git incongruent-methods.asd -inferior-shell http://beta.quicklisp.org/archive/inferior-shell/2016-09-29/inferior-shell-20160929-git.tgz 11709 0a48be6575e42fa47a574cd60596d73f 8e1c0011055880ad74bbf128679977b06cb119cb inferior-shell-20160929-git inferior-shell.asd -infix-dollar-reader http://beta.quicklisp.org/archive/infix-dollar-reader/2012-10-13/infix-dollar-reader-20121013-git.tgz 2671 b94e744bb2cb69b22b8ca1b94711372c 76156fbe2d0f809d57a8fb74355b4cd9a25c1272 infix-dollar-reader-20121013-git infix-dollar-reader-test.asd infix-dollar-reader.asd -infix-math http://beta.quicklisp.org/archive/infix-math/2017-08-30/infix-math-20170830-git.tgz 7244 3a4e1c58636f6126b6ad2a00a1bf0918 ea2bdbb2e223090a3bfa40f4bb120ab4dab730f9 infix-math-20170830-git infix-math.asd -injection http://beta.quicklisp.org/archive/injection/2016-05-31/injection-20160531-git.tgz 16529 fd550866b59e2f852a7457318435cc54 3688d8be08eecc9140e2f6141e94490409227a54 injection-20160531-git injection-test.asd injection.asd -inkwell http://beta.quicklisp.org/archive/inkwell/2019-07-10/inkwell-20190710-git.tgz 19455 80965d4bd6e377146f684c9f55dcdb50 a0e229d7125c2995ae6c28b1e2ce600d59c506da inkwell-20190710-git inkwell.asd -inlined-generic-function http://beta.quicklisp.org/archive/inlined-generic-function/2019-05-21/inlined-generic-function-20190521-git.tgz 13775 e9336f83fe941d4188063d5b8a1daee2 ddb708a3730c99fe766c6f7412119a1c828bd1a3 inlined-generic-function-20190521-git inlined-generic-function.asd inlined-generic-function.test.asd -inner-conditional http://beta.quicklisp.org/archive/inner-conditional/2015-06-08/inner-conditional-20150608-git.tgz 14366 ddb07ddd8d96bff1ccad30a690e48b88 3a3bd7bbff2901db70f79023dff565be75ac1a85 inner-conditional-20150608-git inner-conditional-test.asd inner-conditional.asd -inotify http://beta.quicklisp.org/archive/inotify/2015-06-08/inotify-20150608-git.tgz 3569 185ac26e780c2d0426b261fbbccca12a fce1a600d8dfddb1193e9ee71b0df2d58a2fe288 inotify-20150608-git inotify.asd -inquisitor http://beta.quicklisp.org/archive/inquisitor/2019-05-21/inquisitor-20190521-git.tgz 938309 b3ccd374ca6d78db990605fa34ca9e6f d9c38ed218610dd382652062ca3ddb5787d82906 inquisitor-20190521-git inquisitor-flexi-test.asd inquisitor-flexi.asd inquisitor-test.asd inquisitor.asd -integral http://beta.quicklisp.org/archive/integral/2018-10-18/integral-20181018-git.tgz 24642 d8c8057d590cbc0104f1e8eaf6dbb168 9858da149eac66b6bf18bd2100068da5313c7989 integral-20181018-git integral-test.asd integral.asd -integral-rest http://beta.quicklisp.org/archive/integral-rest/2015-09-23/integral-rest-20150923-git.tgz 5803 335875a5465c16346cd29689873dc643 97379a1ff7b2b586b9f3bc8070f70be0009d7487 integral-rest-20150923-git integral-rest-test.asd integral-rest.asd -intel-hex http://beta.quicklisp.org/archive/intel-hex/2016-03-18/intel-hex-20160318-git.tgz 5977 0558406788710ac04f4493a66deb2ebe 43cece1a8cf9a6d2b3b574e95a94a9f6825f5ce0 intel-hex-20160318-git intel-hex-test.asd intel-hex.asd -intercom http://beta.quicklisp.org/archive/intercom/2013-06-15/intercom-20130615-git.tgz 32404 9188e4147f75529e5d5e24561d5c6c4e 953a7a49ab8700823c352a0a488486bc2a80f392 intercom-20130615-git lisp/intercom-examples.asd lisp/intercom.asd -interface http://beta.quicklisp.org/archive/interface/2019-03-07/interface-20190307-hg.tgz 8186 2171f1127f13b79c82c56302b629c18b cbe7051bcbdb6fda388369eb1b31717a38217751 interface-20190307-hg interface.asd -introspect-environment http://beta.quicklisp.org/archive/introspect-environment/2015-10-31/introspect-environment-20151031-git.tgz 9127 3c61088583f11791530edb2e18f5d6f0 599d21a1de88776bb340d0830e7f3774f061c269 introspect-environment-20151031-git introspect-environment-test.asd introspect-environment.asd -iolib http://beta.quicklisp.org/archive/iolib/2018-02-28/iolib-v0.8.3.tgz 255866 fc28d4cad6f8e43972df3baa6a8ac45c e84165ed45f8746baa282c0e6152460421cb9ed1 iolib-v0.8.3 iolib.asd iolib.asdf.asd iolib.base.asd iolib.common-lisp.asd iolib.conf.asd iolib.examples.asd iolib.grovel.asd iolib.tests.asd -ip-interfaces http://beta.quicklisp.org/archive/ip-interfaces/2018-12-10/ip-interfaces-0.2.1.tgz 14797 c85e479e1eb4139f8996b335e7d0e034 573b6f8413bdfe11863e649f8aa3ec990662c1b8 ip-interfaces-0.2.1 ip-interfaces-test.asd ip-interfaces.asd -irc-logger http://beta.quicklisp.org/archive/irc-logger/2015-09-23/irc-logger-20150923-git.tgz 10393 6d6b60c0d2ac53575ee5c644beb162c3 1b39d7fad92c3ef94747f9be086c567c1dd317bb irc-logger-20150923-git irc-logger.asd -ironclad http://beta.quicklisp.org/archive/ironclad/2019-10-07/ironclad-v0.47.tgz 1452945 b82d370b037422fcaf8953857f03b5f6 07ff0ad14258a81e0ee4ab21abd1a3726a58328d ironclad-v0.47 ironclad-text.asd ironclad.asd -iso-8601-date http://beta.quicklisp.org/archive/iso-8601-date/2019-01-07/iso-8601-date-20190107-git.tgz 4440 b1ab5921a442d86bb2727b4a2bc9e8e0 f927777c79967a5afa2a419b5ef222a8817b9af7 iso-8601-date-20190107-git eclecticse.iso-8601-date.asd -iterate http://beta.quicklisp.org/archive/iterate/2018-02-28/iterate-20180228-git.tgz 333795 ee3b198b0f9674c11e5283e56f57ed78 063f13e39a7a17f8813f1707cab2c17ff3b20dc6 iterate-20180228-git iterate.asd -iterate-clsql http://beta.quicklisp.org/archive/iterate-clsql/2013-03-12/iterate-clsql-20130312-http.tgz 2704 0950d7a9b29b8ddb9d16b45b9096bdae 8f74118d5f989b73db760bcb0a794e23fa185a0a iterate-clsql-20130312-http iterate-clsql.asd -its http://beta.quicklisp.org/archive/its/2018-12-10/its-1.0.tgz 10137 221358638db1a4eedde70b5ff4870eea 69b22964952a5a537646ac0e3877e47101f12cb2 its-1.0 its.asd tests/its_tests.asd -jenkins http://beta.quicklisp.org/archive/jenkins/2013-03-12/jenkins-20130312-git.tgz 15878 53049d3dd8dfe5ea36738005c786f8d0 f3a1fad4ff41d91901a8fe5484bbb2b5df746119 jenkins-20130312-git jenkins.api.asd -jonathan http://beta.quicklisp.org/archive/jonathan/2019-02-02/jonathan-20190202-git.tgz 160340 bf340574fc901706ba2dcdc57e1e78ad 0d332a8f852c735d817c0eb4173f25d9e88f8262 jonathan-20190202-git jonathan-test.asd jonathan.asd -jose http://beta.quicklisp.org/archive/jose/2018-07-11/jose-20180711-git.tgz 14142 92786104f9775ea657c37ae846526ab4 d90b3bc348676117c1639fbdc0553e805daa5861 jose-20180711-git jose.asd -jp-numeral http://beta.quicklisp.org/archive/jp-numeral/2019-05-21/jp-numeral-20190521-git.tgz 41673 1969e0dec2db5270d6e7517ed1d9001b d8d48074786dad5f54b8ef528f575d38c68be6af jp-numeral-20190521-git jp-numeral-test.asd jp-numeral.asd -jpl-queues http://beta.quicklisp.org/archive/jpl-queues/2010-10-06/jpl-queues-0.1.tgz 15113 7c3d14c955db0a5c8ece2b9409333ce0 39497c7cb7292433b5c5a83d7ceb7a6e09cac7b1 jpl-queues-0.1 jpl-queues.asd -js http://beta.quicklisp.org/archive/js/2018-01-31/js-20180131-git.tgz 64836 52f3ec4406ac27a84b65be99ebda51e0 85b589dc6d059502fb56c7b265121ff36712cf19 js-20180131-git cl-js.asd -js-parser http://beta.quicklisp.org/archive/js-parser/2015-04-07/js-parser-20150407-git.tgz 67870 4b86296f7eb3542447528822f7fa2612 4b2e27dfa07c730235c2014740b4d91540d0f656 js-parser-20150407-git js-parser-tests.asd js-parser.asd -json-mop http://beta.quicklisp.org/archive/json-mop/2018-02-28/json-mop-20180228-git.tgz 6214 82d6e487a8410e7f4f95e02fa2615fc7 fd825e88baa5e8e9d7dc100acb1c6a35c60e8d87 json-mop-20180228-git json-mop.asd tests/json-mop-tests.asd -json-responses http://beta.quicklisp.org/archive/json-responses/2019-03-07/json-responses-20190307-hg.tgz 4722 27b0c30fe8df35ecbaa2a7e860191dc1 393cfe5d2254c49fb28ad2ba24a95d3ee5d26c89 json-responses-20190307-hg json-responses.asd -json-streams http://beta.quicklisp.org/archive/json-streams/2017-10-19/json-streams-20171019-git.tgz 45679 b5ab07dce6bfa17782384ecd66bba4bc 8cc35c603b9fdef5e94b82da5dbb72f3551f5530 json-streams-20171019-git json-streams-tests.asd json-streams.asd -jsonrpc http://beta.quicklisp.org/archive/jsonrpc/2019-10-07/jsonrpc-20191007-git.tgz 11608 dbc1e444df10dea1681e8e1a5b4180e8 9ac2f791d611f0be146e50628eeb2e5212d18748 jsonrpc-20191007-git jsonrpc.asd -jsown http://beta.quicklisp.org/archive/jsown/2019-11-30/jsown-20191130-git.tgz 14948 2714529af34123c5d5ea5a6ec401230b 69fa55f69254913584f583ba1aa66fd5f3aad7d6 jsown-20191130-git jsown.asd tests/jsown-tests.asd -jwacs http://beta.quicklisp.org/archive/jwacs/2018-02-28/jwacs-20180228-git.tgz 202732 9f9d92d2e616fddc3ceac0e5be375f8d 4e367cb507f1095f53b90aa52dab4b5ac83451f7 jwacs-20180228-git jwacs-tests.asd jwacs.asd -kebab http://beta.quicklisp.org/archive/kebab/2015-06-08/kebab-20150608-git.tgz 3165 b7136a488e5f7f202fd74c59516cac8e 7ba2ed7c0f2ed1ebc31f7c9776563257a5c12bdb kebab-20150608-git kebab-test.asd kebab.asd -kenzo http://beta.quicklisp.org/archive/kenzo/2019-12-27/kenzo-20191227-git.tgz 5263930 03078b7d09f64f801c45d966ff8a0106 05a19917ca01828e8bd25ab4d8057124c7c7be57 kenzo-20191227-git kenzo-test.asd kenzo.asd -kl-verify http://beta.quicklisp.org/archive/kl-verify/2012-09-09/kl-verify-20120909-git.tgz 1728 fd742a26d44433617cf60ded1b4954ac 573e3cde43bc677f4a5da6e76dc7d53923319c1f kl-verify-20120909-git kl-verify.asd -km http://beta.quicklisp.org/archive/km/2011-05-22/km-2-5-33.tgz 328656 f4ba865c0342c5cf8ebcb507becc5e56 57b80fb82b4ea580882fae61c663c79ba3e864ee km-2-5-33 km.asd -kmrcl http://beta.quicklisp.org/archive/kmrcl/2015-09-23/kmrcl-20150923-git.tgz 57358 0cd15d3ed3e7d56528dd3243d1a5c9b1 4fa994e358e4b454880961a4e0156e29e32f63ba kmrcl-20150923-git kmrcl-tests.asd kmrcl.asd -l-math http://beta.quicklisp.org/archive/l-math/2019-03-07/l-math-20190307-git.tgz 46344 1d72a81ab46e4ebfda1c749ca67a0e90 a5a68998c4bfebdf452c4d4386fab465051c7eb4 l-math-20190307-git l-math.asd -l-system http://beta.quicklisp.org/archive/l-system/2018-02-28/l-system-20180228-git.tgz 13953 d42ca0e95be4d4cb4390e62119ac7934 89f30dbbdbc8a60a242abc5c63f1daf7851691c8 l-system-20180228-git l-system-examples.asd l-system.asd -laap http://beta.quicklisp.org/archive/laap/2017-08-30/laap-20170830-git.tgz 15178 5d86b49f328d314cdf22a5bda9565f1a 8e90156c16ad1a0ff95b9f29bc8828bee5123101 laap-20170830-git laap.asd -lack http://beta.quicklisp.org/archive/lack/2019-10-07/lack-20191007-git.tgz 178459 bce7a6b5aefb5bfd3fbeb782dda7748f 63c157526deff72db55ccea3a93781fe0eb54897 lack-20191007-git lack-component.asd lack-middleware-accesslog.asd lack-middleware-auth-basic.asd lack-middleware-backtrace.asd lack-middleware-csrf.asd lack-middleware-mount.asd lack-middleware-session.asd lack-middleware-static.asd lack-request.asd lack-response.asd lack-session-store-dbi.asd lack-session-store-redis.asd lack-test.asd lack-util-writer-stream.asd lack-util.asd lack.asd t-lack-component.asd t-lack-middleware-accesslog.asd t-lack-middleware-auth-basic.asd t-lack-middleware-backtrace.asd t-lack-middleware-csrf.asd t-lack-middleware-mount.asd t-lack-middleware-session.asd t-lack-middleware-static.asd t-lack-request.asd t-lack-session-store-dbi.asd t-lack-session-store-redis.asd t-lack-util.asd t-lack.asd -lake http://beta.quicklisp.org/archive/lake/2019-12-27/lake-20191227-git.tgz 21133 0d875fa4eeb0618f27c0238b29d8a6fa 0febcaf9d47b37c55d37eeeb21eab7f3f4e72247 lake-20191227-git lake-test.asd lake.asd -lambda-fiddle http://beta.quicklisp.org/archive/lambda-fiddle/2019-07-10/lambda-fiddle-20190710-git.tgz 6230 78f68f144ace9cb8f634ac14b3414e5e fd5c91ae6695e1531502458db52d0410c471fcee lambda-fiddle-20190710-git lambda-fiddle.asd -lambda-reader http://beta.quicklisp.org/archive/lambda-reader/2017-01-24/lambda-reader-20170124-git.tgz 3905 f2d0b70125707b31f1975a58b6c3523e e96b520a862982bb8bb801dca92c7ee744c8588a lambda-reader-20170124-git lambda-reader-8bit.asd lambda-reader.asd -lambdalite http://beta.quicklisp.org/archive/lambdalite/2014-12-17/lambdalite-20141217-git.tgz 6077 77d34562c5527b0b771d923704e74420 b1334d9c1402362a9c3aeb17f0c53f065bbec9bb lambdalite-20141217-git lambdalite.asd -language-codes http://beta.quicklisp.org/archive/language-codes/2019-07-10/language-codes-20190710-git.tgz 68776 9629d0b8fb89f350d00c4aeac316ccc2 be5e14344c850f6c00f7d789fdce5e2b250b3109 language-codes-20190710-git language-codes.asd -lass http://beta.quicklisp.org/archive/lass/2019-07-10/lass-20190710-git.tgz 23036 f2d65dc5aaf652444a3bff08559ec46e e87598a425f5b0687dfb5ccb99c0d590500711cb lass-20190710-git binary-lass.asd lass.asd -lass-flexbox http://beta.quicklisp.org/archive/lass-flexbox/2016-02-08/lass-flexbox-20160208-git.tgz 3151 7307dc8d1b5133e50ebb930d6a754edc a45b8c9e8663e6d99d48dc86a6799c4e50d78466 lass-flexbox-20160208-git lass-flexbox-test.asd lass-flexbox.asd -lassie http://beta.quicklisp.org/archive/lassie/2014-07-13/lassie-20140713-git.tgz 11181 3cd995df3ef888663c6a2237567cac27 f7398a93be3c19ae0e84a9b22d06638f56e6cf95 lassie-20140713-git lassie.asd -lastfm http://beta.quicklisp.org/archive/lastfm/2019-10-07/lastfm-20191007-git.tgz 7538 dc29a7688ade882f2c65396d2086f9b9 9a4b61c1bed6af4fbacbf4ab77207409dbc349b5 lastfm-20191007-git lastfm.asd -latex-table http://beta.quicklisp.org/archive/latex-table/2018-03-28/latex-table-20180328-git.tgz 44576 9f102a30b9f31cda67570fdf37c11401 b7f7e7b83296ca127278daa932dd6b9377393e76 latex-table-20180328-git latex-table.asd -lazy http://beta.quicklisp.org/archive/lazy/2018-10-18/lazy-20181018-git.tgz 1596 7dd62fc17c12846379f7d7be8963bbd6 a991ff232722e78080fcbeab1d3722a2d281b47f lazy-20181018-git lazy.asd -legion http://beta.quicklisp.org/archive/legion/2017-11-30/legion-20171130-git.tgz 6236 5ce607b3df2c82c88ba87681bdeb9acd 36929bd08eaadcc5f2619758409e265e406d27c8 legion-20171130-git legion-test.asd legion.asd -legit http://beta.quicklisp.org/archive/legit/2019-07-10/legit-20190710-git.tgz 28792 9b380fc23d4bab086df8a0e4a598457a 3d87520bbf8d1e153bec0330725572c63b1645c0 legit-20190710-git legit.asd -let-over-lambda http://beta.quicklisp.org/archive/let-over-lambda/2015-09-23/let-over-lambda-20150923-git.tgz 9277 d1089d8f6a1b65629b4a5b560ec09814 83a37659648cfb353a46a01e1e65aaf4743e6639 let-over-lambda-20150923-git let-over-lambda-test.asd let-over-lambda.asd -let-plus http://beta.quicklisp.org/archive/let-plus/2019-11-30/let-plus-20191130-git.tgz 11247 1b8d1660ed67852ea31cad44a6fc15d0 e5ff604e4809908974fafaaf2af49e2cc0f8bcca let-plus-20191130-git let-plus.asd -letrec http://beta.quicklisp.org/archive/letrec/2019-03-07/letrec-20190307-hg.tgz 1899 68eed8ac600a1c2f157a3f6921efdfec ad8fb4a17a629ca025b5d6a8fda50ec84f5c8a8e letrec-20190307-hg letrec.asd -lev http://beta.quicklisp.org/archive/lev/2015-05-05/lev-20150505-git.tgz 9520 10f340f7500beb98b5c0d4a9876131fb e01073c528dbdfdaae90486095172dffc2c5c748 lev-20150505-git lev.asd -leveldb http://beta.quicklisp.org/archive/leveldb/2016-05-31/leveldb-20160531-git.tgz 6169 fa515cf6ba4109ee89db4c23039bff7b 0dc56929759d6562246601b782dc6fd6c1dbadb1 leveldb-20160531-git leveldb.asd -levenshtein http://beta.quicklisp.org/archive/levenshtein/2010-10-06/levenshtein-1.0.tgz 761 6266196d57f78c0dc894af44ecb9d223 bd6dc7c06dcde4ed721d0513cab44ffde6568bea levenshtein-1.0 levenshtein.asd -lfarm http://beta.quicklisp.org/archive/lfarm/2015-06-08/lfarm-20150608-git.tgz 41956 4cc91df44a932b3175a1eabf73d6e42d d0020b44060e11ef149b366645d915fb1cecff06 lfarm-20150608-git lfarm-admin.asd lfarm-client.asd lfarm-common.asd lfarm-gss.asd lfarm-launcher.asd lfarm-server.asd lfarm-ssl.asd lfarm-test.asd -lhstats http://beta.quicklisp.org/archive/lhstats/2012-01-07/lhstats-20120107-git.tgz 42573 828738a13c638d9d090439e57aaaf0ef 655b38385e0cb69d344e58c1dd7331a7f314a0af lhstats-20120107-git lhstats.asd -liblmdb http://beta.quicklisp.org/archive/liblmdb/2017-08-30/liblmdb-20170830-git.tgz 4501 32fbfb193f327493ade3440f5bf9e989 2a355ed6a5a753f2a59c6584979056b5e5dc9bde liblmdb-20170830-git liblmdb.asd -lichat-ldap http://beta.quicklisp.org/archive/lichat-ldap/2019-07-10/lichat-ldap-20190710-git.tgz 3001 6ab1394eaf6d55b04d40e5d229b30a51 811b669faaec5248b59e91f74d85f3aa21aab9b5 lichat-ldap-20190710-git lichat-ldap.asd -lichat-protocol http://beta.quicklisp.org/archive/lichat-protocol/2019-11-30/lichat-protocol-20191130-git.tgz 40126 8371f0b44edd51bd6c590c4d68373c88 d7da75c915cab1c5573ada70a630660dc4c03140 lichat-protocol-20191130-git lichat-protocol.asd -lichat-serverlib http://beta.quicklisp.org/archive/lichat-serverlib/2019-07-10/lichat-serverlib-20190710-git.tgz 15969 f6e93ed83b7b66732646b1178abf8978 7f27418370e6770c537b861586d2854db476b385 lichat-serverlib-20190710-git lichat-serverlib.asd -lichat-tcp-client http://beta.quicklisp.org/archive/lichat-tcp-client/2019-07-10/lichat-tcp-client-20190710-git.tgz 7146 9c22da901c9df97f415797ad79350683 e35ef93ecf768d30bdd13d64e74b2ee184f49056 lichat-tcp-client-20190710-git lichat-tcp-client.asd -lichat-tcp-server http://beta.quicklisp.org/archive/lichat-tcp-server/2019-07-10/lichat-tcp-server-20190710-git.tgz 7684 fa46f205b911e51931ac3573472f2a09 4f3498018d1a44b63c85d2b8144479114c65dce5 lichat-tcp-server-20190710-git lichat-tcp-server.asd -lichat-ws-server http://beta.quicklisp.org/archive/lichat-ws-server/2019-07-10/lichat-ws-server-20190710-git.tgz 7059 e8fa5d952a7ef7744d83875cd08ac8de 960dca9954534c9fc62384787cf4d2a02f4303e0 lichat-ws-server-20190710-git lichat-ws-server.asd -lift http://beta.quicklisp.org/archive/lift/2019-05-21/lift-20190521-git.tgz 1132278 c03d3fa715792440c7b51a852ad581e3 5bf930dadf4900ee6a03066f6d5f2a51c041c19f lift-20190521-git lift-documentation.asd lift-test.asd lift.asd -lila http://beta.quicklisp.org/archive/lila/2019-10-07/lila-20191007-git.tgz 18320 d6b601d97d413abf9f401d5e6c5a0b48 2a13279fa64442360d5b88c2a2bbfda2addb8b3f lila-20191007-git lila.asd -lime http://beta.quicklisp.org/archive/lime/2015-12-18/lime-20151218-git.tgz 14590 1c43d6c9dbd8db49e0e25234477775d1 c60882af85f65f2e0e6cd4bea80112d862848c94 lime-20151218-git lime-example.asd lime-test.asd lime.asd -linear-programming http://beta.quicklisp.org/archive/linear-programming/2019-11-30/linear-programming-20191130-git.tgz 25969 9348b8da3d2dbcbb51cf006525d41f0a c349e18b823684d354541e10df5e7b816f9a5712 linear-programming-20191130-git linear-programming-test.asd linear-programming.asd -linedit http://beta.quicklisp.org/archive/linedit/2018-04-30/linedit-20180430-git.tgz 21140 a9f679411d01ec162eb1ba7c76e25d7a 82f1fab330a425fe3406a8a8a707575590cecf9f linedit-20180430-git linedit.asd -linewise-template http://beta.quicklisp.org/archive/linewise-template/2016-02-08/linewise-template-20160208-git.tgz 14893 396034dd6aab87bfe5db95b0064187b2 1cbddfa14e8620ad6eb87b8041bd5d3bf44abd4d linewise-template-20160208-git linewise-template.asd -lionchat http://beta.quicklisp.org/archive/lionchat/2019-07-10/lionchat-20190710-git.tgz 313345 9cbf24d2fb7f54960d1daa58cd853468 c947b14bf01e7b48cb1d99cecb404b40daaa535e lionchat-20190710-git lionchat.asd -lisa http://beta.quicklisp.org/archive/lisa/2012-04-07/lisa-20120407-git.tgz 165079 6d999f92e2d894a7c4785b044955a49f b8b3350d837c7ea807163213dece93d59db0c725 lisa-20120407-git lisa.asd -lisp-binary http://beta.quicklisp.org/archive/lisp-binary/2019-12-27/lisp-binary-20191227-git.tgz 928451 0e8dab0533d47746b56a16927e75238f ba1a40dff70a00e6cc07a045cb2315c3351047f7 lisp-binary-20191227-git lisp-binary.asd test/lisp-binary-test.asd -lisp-chat http://beta.quicklisp.org/archive/lisp-chat/2019-05-21/lisp-chat-20190521-git.tgz 99269 2e3e425dab2610b63038e6fcced3eed4 212518260f0a1bb4a33332bc867bf625dfec8dc3 lisp-chat-20190521-git lisp-chat.asd -lisp-critic http://beta.quicklisp.org/archive/lisp-critic/2019-05-21/lisp-critic-20190521-git.tgz 20286 998d8aee18cc0265ea7e8b5ca480fd40 aaaa72cc78f46fe5652e318ce1f38dd4c26547f2 lisp-critic-20190521-git ckr-tables.asd lisp-critic.asd -lisp-executable http://beta.quicklisp.org/archive/lisp-executable/2018-08-31/lisp-executable-20180831-git.tgz 23139 63ea5e1673e9b2d90df1a2bbe10fd7b5 ec9d633c4ac367fa2f756e9960a83eb3805d3f71 lisp-executable-20180831-git lisp-executable-example.asd lisp-executable-tests.asd lisp-executable.asd -lisp-gflags http://beta.quicklisp.org/archive/lisp-gflags/2015-10-31/lisp-gflags-20151031-git.tgz 8022 2e96622a1f5e11acf9871c6171bad635 ff6654e50a07142e916d6eaebf9b09b199f4dc52 lisp-gflags-20151031-git com.google.flag-test.asd com.google.flag.asd -lisp-interface-library http://beta.quicklisp.org/archive/lisp-interface-library/2018-04-30/lisp-interface-library-20180430-git.tgz 60414 1d71936f692f30bb000ffbbb69b098e7 e695c2d9e57f1770e5cb6acceb5da9505d29e90a lisp-interface-library-20180430-git lil.asd lisp-interface-library.asd -lisp-invocation http://beta.quicklisp.org/archive/lisp-invocation/2018-02-28/lisp-invocation-20180228-git.tgz 10863 3ed327ad1fc47f27cc1332d9a8b7e20e 49234e20c19ecb65fa0d743684c92965e8978160 lisp-invocation-20180228-git lisp-invocation.asd -lisp-namespace http://beta.quicklisp.org/archive/lisp-namespace/2017-11-30/lisp-namespace-20171130-git.tgz 9762 d3052a13db167c6a53487f31753b7467 e84b47c0b146849eeb5f624cc2c491e36f62be8a lisp-namespace-20171130-git lisp-namespace.asd lisp-namespace.test.asd -lisp-unit http://beta.quicklisp.org/archive/lisp-unit/2017-01-24/lisp-unit-20170124-git.tgz 18163 2c55342cb8af18b290bb6a28c75deac5 234203b4f9903cd82b1698f3a90439fb2bbc3f7e lisp-unit-20170124-git lisp-unit.asd -lisp-unit2 http://beta.quicklisp.org/archive/lisp-unit2/2018-01-31/lisp-unit2-20180131-git.tgz 34698 d061fa640837441a5d2eecbefd8b2e69 dd120bb9dd809fbd3bd0b8ef579e5328719be3d2 lisp-unit2-20180131-git lisp-unit2.asd -lisp-zmq http://beta.quicklisp.org/archive/lisp-zmq/2016-02-08/lisp-zmq-20160208-git.tgz 15281 b1aa6a105b82083f62bc8e149fe840d0 985b9003de4ea3c8d4b26a85d27d31a08cc23785 lisp-zmq-20160208-git zmq-examples.asd zmq-test.asd zmq.asd -lispbuilder http://beta.quicklisp.org/archive/lispbuilder/2019-05-21/lispbuilder-20190521-git.tgz 7509055 7fd1bd4e45d0e35c4ac33c677072cf2a b97ce2b733d247ef2d3cbd718e2b193c1832c6e4 lispbuilder-20190521-git lispbuilder-lexer/lispbuilder-lexer.asd lispbuilder-net/lispbuilder-net-cffi.asd lispbuilder-net/lispbuilder-net.asd lispbuilder-opengl/lispbuilder-opengl-1-1.asd lispbuilder-opengl/lispbuilder-opengl-examples.asd lispbuilder-regex/lispbuilder-regex.asd lispbuilder-sdl-gfx/lispbuilder-sdl-gfx-binaries.asd lispbuilder-sdl-gfx/lispbuilder-sdl-gfx-cffi.asd lispbuilder-sdl-gfx/lispbuilder-sdl-gfx-examples.asd lispbuilder-sdl-gfx/lispbuilder-sdl-gfx.asd lispbuilder-sdl-image/lispbuilder-sdl-image-binaries.asd lispbuilder-sdl-image/lispbuilder-sdl-image-cffi.asd lispbuilder-sdl-image/lispbuilder-sdl-image-examples.asd lispbuilder-sdl-image/lispbuilder-sdl-image.asd lispbuilder-sdl-mixer/lispbuilder-sdl-mixer-binaries.asd lispbuilder-sdl-mixer/lispbuilder-sdl-mixer-cffi.asd lispbuilder-sdl-mixer/lispbuilder-sdl-mixer-examples.asd lispbuilder-sdl-mixer/lispbuilder-sdl-mixer.asd lispbuilder-sdl-ttf/lispbuilder-sdl-ttf-binaries.asd lispbuilder-sdl-ttf/lispbuilder-sdl-ttf-cffi.asd lispbuilder-sdl-ttf/lispbuilder-sdl-ttf-examples.asd lispbuilder-sdl-ttf/lispbuilder-sdl-ttf.asd lispbuilder-sdl/cocoahelper.asd lispbuilder-sdl/lispbuilder-sdl-assets.asd lispbuilder-sdl/lispbuilder-sdl-base.asd lispbuilder-sdl/lispbuilder-sdl-binaries.asd lispbuilder-sdl/lispbuilder-sdl-cffi.asd lispbuilder-sdl/lispbuilder-sdl-cl-vectors-examples.asd lispbuilder-sdl/lispbuilder-sdl-cl-vectors.asd lispbuilder-sdl/lispbuilder-sdl-examples.asd lispbuilder-sdl/lispbuilder-sdl-vecto-examples.asd lispbuilder-sdl/lispbuilder-sdl-vecto.asd lispbuilder-sdl/lispbuilder-sdl.asd lispbuilder-windows/lispbuilder-windows.asd lispbuilder-yacc/lispbuilder-yacc.asd -lispqr http://beta.quicklisp.org/archive/lispqr/2019-12-27/lispqr-20191227-git.tgz 24946 1fb86ba44a041d1b4f22b2f61299c66b ff88cd4d8665c966f478f73b20f664bc1e9310d9 lispqr-20191227-git lispqr.asd -listoflist http://beta.quicklisp.org/archive/listoflist/2014-08-26/listoflist-20140826-git.tgz 12188 598138f6ddf5241eaa283d0adce7878d c4138b36e50717f3e826fbc0d77cd9c00d0c9612 listoflist-20140826-git listoflist.asd -listopia http://beta.quicklisp.org/archive/listopia/2019-07-10/listopia-20190710-git.tgz 10846 54bbe555ec64ec4c63a8ea83738dde17 ccfa999552b2d86a7786825faae0d61c79d98a65 listopia-20190710-git listopia-bench.asd listopia-test.asd listopia.asd -literate-lisp http://beta.quicklisp.org/archive/literate-lisp/2019-12-27/literate-lisp-20191227-git.tgz 145340 5134652204467310acf6379e3b095730 84c8de8f253af7ee2cd24c3e81bffb8d65ca2114 literate-lisp-20191227-git literate-demo.asd literate-lisp.asd -livesupport http://beta.quicklisp.org/archive/livesupport/2019-05-21/livesupport-release-quicklisp-71e6e412-git.tgz 2939 9eb376b26689ac54d2a51f5189587ec5 e2df3d1a994fad4f8149c2795dc5d7de5a10d5ce livesupport-release-quicklisp-71e6e412-git livesupport.asd -lla http://beta.quicklisp.org/archive/lla/2018-03-28/lla-20180328-git.tgz 38969 61d583603d5cacf9d81486a0cfcfaf6a 5c747b960f4ed782de3a11505eb02fef3b7b5d0a lla-20180328-git lla.asd -lmdb http://beta.quicklisp.org/archive/lmdb/2017-04-03/lmdb-20170403-git.tgz 7367 65a7e5f3ddfc9bd1d322ac9e6bf08f09 5178d796ab2eec1c1404e6505f97453c09e95dc7 lmdb-20170403-git lmdb-test.asd lmdb.asd -lml http://beta.quicklisp.org/archive/lml/2015-09-23/lml-20150923-git.tgz 16279 4250f2b2c4d110cc728645e8a1eba963 5e9d7018b7487783aeec69ff4ac283a56bccd1ef lml-20150923-git lml-tests.asd lml.asd -lml2 http://beta.quicklisp.org/archive/lml2/2015-09-23/lml2-20150923-git.tgz 31590 99d76c1971e4fceaa6496291c4ede90b b119542c292e0ff8ed86874cbe6ee64a6c16a9a0 lml2-20150923-git lml2-tests.asd lml2.asd -local-package-aliases http://beta.quicklisp.org/archive/local-package-aliases/2013-03-12/local-package-aliases-20130312-git.tgz 8525 a949c3a09612e3913c798bd4cc67eadf 002c40de319cb0d4cfe4071aa5375a2f5434895f local-package-aliases-20130312-git local-package-aliases.asd -local-time http://beta.quicklisp.org/archive/local-time/2019-07-10/local-time-20190710-git.tgz 282522 ff315f40d1f955210c78aa0804a117f2 77d2629935ebb6b66cebcd121f0b14ee3449b698 local-time-20190710-git cl-postgres+local-time.asd local-time.asd -local-time-duration http://beta.quicklisp.org/archive/local-time-duration/2018-04-30/local-time-duration-20180430-git.tgz 10333 8ad2f86ea33d4c7b3014e2152632b88c 0b443efd31c990ad022e9c16576bf68b2359de0b local-time-duration-20180430-git cl-postgres+local-time-duration.asd local-time-duration.asd -log4cl http://beta.quicklisp.org/archive/log4cl/2019-10-07/log4cl-20191007-git.tgz 917204 11cdcd9da0ede86092886a055b186861 06118f3a37d1038fe1188c621dca7b62886733d3 log4cl-20191007-git log4cl-examples.asd log4cl.asd log4slime.asd -log5 http://beta.quicklisp.org/archive/log5/2011-06-19/log5-20110619-git.tgz 29106 b05a585fbf58b25367c05ec8bb814e8c 07d72b5327c5e8795eac99d235cc1a483a4cbafd log5-20110619-git log5.asd -lorem-ipsum http://beta.quicklisp.org/archive/lorem-ipsum/2018-10-18/lorem-ipsum-20181018-git.tgz 3756 4a89cae2f82951c8cf76348b5f0600ee 6216e403bb0c4da378eb6b16e094926355c13549 lorem-ipsum-20181018-git lorem-ipsum.asd -lowlight http://beta.quicklisp.org/archive/lowlight/2013-12-11/lowlight-20131211-git.tgz 17517 83b71610e5b7de0979ffc9dcff43e129 d90ad3e313ce9d51984519b5512fd892ab513f77 lowlight-20131211-git doc/lowlight.doc.asd lowlight.asd old/lowlight.old.asd tests/lowlight.tests.asd -lparallel http://beta.quicklisp.org/archive/lparallel/2016-08-25/lparallel-20160825-git.tgz 78551 6393e8d0c0cc9ed1c88b6e7cca8de5df 1514c95041efd503f335e2cd96ba5ef1537415cc lparallel-20160825-git lparallel-bench.asd lparallel-test.asd lparallel.asd -lquery http://beta.quicklisp.org/archive/lquery/2019-07-10/lquery-20190710-git.tgz 38615 987e9e505ff230c7bfc425bdf58fb717 e5fa7b08ffc8725db9180f41d1346312927f3bf6 lquery-20190710-git lquery-test.asd lquery.asd -lredis http://beta.quicklisp.org/archive/lredis/2014-11-06/lredis-20141106-git.tgz 8338 c3696a2d2665fd8c31002c3e9e22f6b6 49824a4b3d2730746a19c94536f68971cbb48ea1 lredis-20141106-git lredis.asd -lsx http://beta.quicklisp.org/archive/lsx/2019-10-07/lsx-20191007-git.tgz 6813 6eabb871226e5211632451e4286fdb0c b2d38cfc9642a0136dcb297545e66e6419f3db0b lsx-20191007-git cl-syntax-lsx.asd lsx.asd -ltk http://beta.quicklisp.org/archive/ltk/2019-02-02/ltk-20190202-git.tgz 62309 2560e392031180561698b49386b10c45 7d54dc61d474e2133bfbb0a0aa95484e48b0c4eb ltk-20190202-git ltk/ltk-mw.asd ltk/ltk-remote.asd ltk/ltk.asd -lucerne http://beta.quicklisp.org/archive/lucerne/2019-08-13/lucerne-20190813-git.tgz 155497 2355e311b1adeb91e9cb4582c236bc09 e785246a23c25a148e249cb43a97ba88558f967c lucerne-20190813-git lucerne-auth.asd lucerne-hello-world.asd lucerne-test.asd lucerne-utweet.asd lucerne.asd -lw-compat http://beta.quicklisp.org/archive/lw-compat/2016-03-18/lw-compat-20160318-git.tgz 2165 024b8e63d13fb12dbcccaf18cf4f8dfa 92259792af7830d80a868c5f06b2510ead325110 lw-compat-20160318-git lw-compat.asd -lyrics http://beta.quicklisp.org/archive/lyrics/2019-11-30/lyrics-20191130-git.tgz 4427 a0cd616233120323860aa65d112ba07c 8790d576f491d665894861e61394e5f8136a450d lyrics-20191130-git lyrics.asd -m2cl http://beta.quicklisp.org/archive/m2cl/2013-01-28/m2cl-20130128-git.tgz 47489 4d26b8e7cd1108db4c46070c2211c796 f69330a9442ec7192a433b51921d2a2c650291f8 m2cl-20130128-git m2cl-examples.asd m2cl-test.asd m2cl.asd -macro-html http://beta.quicklisp.org/archive/macro-html/2015-12-18/macro-html-20151218-git.tgz 18865 4c73847f830a8ccacd87e5ea76d44bb3 3b03c5253738adea7d0f7b8a67617356a293c7cc macro-html-20151218-git macro-html.asd -macro-level http://beta.quicklisp.org/archive/macro-level/2012-10-13/macro-level-1.0.1.tgz 1907 486ad598536a7b719f04c0f756d9017f 355a1254441193c1698f2641e84f3dfc356f8591 macro-level-1.0.1 macro-level.asd -macrodynamics http://beta.quicklisp.org/archive/macrodynamics/2018-02-28/macrodynamics-20180228-git.tgz 7668 8f226b02f6442d439edc80da09bd8a72 dcffeeebbb8b5084fd1517cab04abb515fb9a4a6 macrodynamics-20180228-git macrodynamics.asd -macroexpand-dammit http://beta.quicklisp.org/archive/macroexpand-dammit/2013-11-11/macroexpand-dammit-20131111-http.tgz 3604 6290fa304f986ea05e084c6342dd0c0f e0b77f879b8fd5a85120cae0b2a90ae17c93fc9d macroexpand-dammit-20131111-http macroexpand-dammit.asd -madeira-port http://beta.quicklisp.org/archive/madeira-port/2015-07-09/madeira-port-20150709-git.tgz 4844 f3d5a6aea61ecb83c56fb123d6a1ecf8 841f3bac6df3588220adc49c5caccaf495800c03 madeira-port-20150709-git madeira-port.asd -magicl http://beta.quicklisp.org/archive/magicl/2019-11-30/magicl-v0.6.5.tgz 510348 a7ffdb8d8e0911565de5c01cf0a6dc92 9b4acfd93471e917c26eef4e7bb1104fdd08acd4 magicl-v0.6.5 magicl-examples.asd magicl-gen.asd magicl-tests.asd magicl-transcendental.asd magicl.asd -maiden http://beta.quicklisp.org/archive/maiden/2019-12-27/maiden-20191227-git.tgz 234821 a24c727285b2693e197ce86231e9c5ab 538c7fadb21f7d8996b331882fc1a1a002f1e02f maiden-20191227-git agents/accounts/maiden-accounts.asd agents/activatable/maiden-activatable.asd agents/blocker/maiden-blocker.asd agents/chatlog/maiden-chatlog.asd agents/commands/maiden-commands.asd agents/core-manager/maiden-core-manager.asd agents/counter/maiden-counter.asd agents/crimes/maiden-crimes.asd agents/dictionary/maiden-dictionary.asd agents/emoticon/maiden-emoticon.asd agents/help/maiden-help.asd agents/lastfm/maiden-lastfm.asd agents/location/maiden-location.asd agents/lookup/maiden-lookup.asd agents/markov/maiden-markov.asd agents/medals/maiden-medals.asd agents/notify/maiden-notify.asd agents/permissions/maiden-permissions.asd agents/silly/maiden-silly.asd agents/talk/maiden-talk.asd agents/throttle/maiden-throttle.asd agents/time/maiden-time.asd agents/trivia/maiden-trivia.asd agents/urlinfo/maiden-urlinfo.asd agents/vote/maiden-vote.asd agents/weather/maiden-weather.asd clients/irc/maiden-irc.asd clients/lichat/maiden-lichat.asd clients/relay/maiden-relay.asd clients/twitter/maiden-twitter.asd maiden.asd modules/api-access/maiden-api-access.asd modules/client-entities/maiden-client-entities.asd modules/networking/maiden-networking.asd modules/serialize/maiden-serialize.asd modules/storage/maiden-storage.asd -mailbox http://beta.quicklisp.org/archive/mailbox/2013-10-03/mailbox-20131003-git.tgz 1907 fd52c2dc8d80c87013a6418b04c4c737 ee9f30c005b768a945c98fc466ec276a662b2b0b mailbox-20131003-git mailbox.asd -make-hash http://beta.quicklisp.org/archive/make-hash/2013-06-15/make-hash-20130615-git.tgz 361160 4f612ef068411284c88e0381fa4a0c7f a0f2260867e32967ef02f316b8d42d9d168c140f make-hash-20130615-git make-hash-tests.asd make-hash.asd -manifest http://beta.quicklisp.org/archive/manifest/2012-02-08/manifest-20120208-git.tgz 98532 16b500a79f0cd4a8f95760cb634cd617 13441aaf0b11a1275a8f72d0ec31908f60307556 manifest-20120208-git manifest.asd -map-bind http://beta.quicklisp.org/archive/map-bind/2012-08-11/map-bind-20120811-git.tgz 2092 a24c5c012e41b87f836b6d8ef318e7cd 047b3ccf3f9d433eb2104bd9da89de7f8e81a2a4 map-bind-20120811-git map-bind.asd -map-set http://beta.quicklisp.org/archive/map-set/2019-03-07/map-set-20190307-hg.tgz 2389 866dba36cdf060c943267cb79ccc0532 9b7c74de8b801583539807e28c676c5ed630bec3 map-set-20190307-hg map-set.asd -marching-cubes http://beta.quicklisp.org/archive/marching-cubes/2015-07-09/marching-cubes-20150709-git.tgz 97306 a44282b741e9dc43d40cb1979a6c7afe b8002c6a01dc8579d3f109c6ecd36dce88e9075f marching-cubes-20150709-git marching-cubes-example.asd marching-cubes-test.asd marching-cubes.asd -markdown.cl http://beta.quicklisp.org/archive/markdown.cl/2019-05-21/markdown.cl-20190521-git.tgz 21656 7de74021c21229dc5e8c94ff2d935b39 72d7124ff85b0ffcca09242f30dcb5837724ac0f markdown.cl-20190521-git markdown.cl-test.asd markdown.cl.asd -markup http://beta.quicklisp.org/archive/markup/2019-11-30/markup-20191130-git.tgz 12091 25727e4bc516291ea9265ef53c0a2629 53e8cbd2bf32b50b464ab9e84f784f0fa7679b60 markup-20191130-git markup.asd markup.test.asd -marshal http://beta.quicklisp.org/archive/marshal/2013-07-20/marshal-20130720-git.tgz 2921 7b2f8d0cb6c95f2418eca133a2e299b6 2c3d9e2c3b04cb581eb8f1f0dc94055176328029 marshal-20130720-git fmarshal-test.asd fmarshal.asd -mathkit http://beta.quicklisp.org/archive/mathkit/2016-02-08/mathkit-20160208-git.tgz 5451 f00124bdf2eea4d18154a4497bf414f7 f5323f595ca08be75b394d1baa82380982dd2f4e mathkit-20160208-git mathkit.asd -maxpc http://beta.quicklisp.org/archive/maxpc/2017-11-30/maxpc-20171130-git.tgz 26151 db7288e066a31f7080e1c7a71531a4d3 5d5aff90fe687119100e149abd22d4c8b19b6d56 maxpc-20171130-git maxpc-test.asd maxpc.asd -mcclim http://beta.quicklisp.org/archive/mcclim/2019-12-27/mcclim-20191227-git.tgz 2331764 7ebf5e9590689c238446b908fd78af49 5c3ea30aa513d6a22548ab0b00ca33d80f992e44 mcclim-20191227-git Apps/Clouseau/clouseau.asd Apps/Debugger/clim-debugger.asd Apps/Functional-Geometry/functional-geometry.asd Apps/Listener/clim-listener.asd Apps/Scigraph/scigraph.asd Backends/CLX-fb/mcclim-clx-fb.asd Backends/CLX/mcclim-clx.asd Backends/Null/mcclim-null.asd Backends/PDF/clim-pdf.asd Backends/PostScript/clim-postscript-font.asd Backends/PostScript/clim-postscript.asd Backends/RasterImage/mcclim-raster-image.asd Backends/common/mcclim-backend-common.asd Core/clim-basic/clim-basic.asd Core/clim-core/clim-core.asd Core/clim/clim.asd Examples/clim-examples.asd Experimental/tree-with-cross-edges/mcclim-tree-with-cross-edges.asd Extensions/Franz/mcclim-franz.asd Extensions/bezier/mcclim-bezier.asd Extensions/bitmap-formats/mcclim-bitmaps.asd Extensions/conditional-commands/conditional-commands.asd Extensions/fonts/mcclim-fonts.asd Extensions/image/mcclim-image.asd Extensions/layouts/mcclim-layouts.asd Extensions/render/mcclim-render.asd Libraries/Drei/Persistent/persistent.asd Libraries/Drei/cl-automaton/automaton.asd Libraries/Drei/drei-mcclim.asd Libraries/ESA/esa-mcclim.asd Libraries/Slim/slim.asd clim-lisp.asd mcclim.asd -md5 http://beta.quicklisp.org/archive/md5/2018-02-28/md5-20180228-git.tgz 15847 7f250f8a2487e4e0aac1ed9c50b79b4d 6539b395ec2b9513464f03e66f396a4c9c8b6da2 md5-20180228-git md5.asd -media-types http://beta.quicklisp.org/archive/media-types/2018-07-11/media-types-20180711-git.tgz 20767 ed16ed33fc38f0279e943d547377f3d6 e1b2d2564e260e9c78ce4eef58006a95a612259f media-types-20180711-git media-types.asd -mel-base http://beta.quicklisp.org/archive/mel-base/2018-02-28/mel-base-20180228-git.tgz 67969 17931e0cbfec8fafb7b825a0af0c897d 447445ec593bc3191d06233e505c9a55247f8be0 mel-base-20180228-git mel-base.asd -memoize http://beta.quicklisp.org/archive/memoize/2014-08-26/memoize-20140826-http.tgz 3547 bdf9cf51fb95293e42553045b7faea2f 1c29c09b7f60686ac929688b842db4c6bcb8f021 memoize-20140826-http memoize.asd -message-oo http://beta.quicklisp.org/archive/message-oo/2013-06-15/message-oo-20130615-git.tgz 2426 44631ce806432e2a55fdfdca7de414ac 95d35b35cfb93d1a19760a6291e5f756e05be25e message-oo-20130615-git message-oo.asd -meta http://beta.quicklisp.org/archive/meta/2015-06-08/meta-20150608-git.tgz 3371 3322d6d54783269122e087b1349e3171 1dfa5cc33d7d1840bfc0d5626758e3bce3e57914 meta-20150608-git meta.asd -meta-sexp http://beta.quicklisp.org/archive/meta-sexp/2010-10-06/meta-sexp-0.1.6.tgz 155693 1d8b6e9b6431340af88269fbd6bdaab3 c427e3744000b6b3275ce3c061e3b23241ba8d3b meta-sexp-0.1.6 meta-sexp.asd -metabang-bind http://beta.quicklisp.org/archive/metabang-bind/2019-11-30/metabang-bind-20191130-git.tgz 22549 b0845abb1eadb83e33e91c8d4ad88d2f 7e1cc7f04728acd7d6e9d322d5665bd9f2533171 metabang-bind-20191130-git metabang-bind-test.asd metabang-bind.asd -metacopy http://beta.quicklisp.org/archive/metacopy/2017-04-03/metacopy-20170403-darcs.tgz 9186 caa5ac0a1f5e3741e7f789589ff537fe 559f0201e9fe8708b9211ef856ed35eefd0167f9 metacopy-20170403-darcs metacopy-with-contextl.asd metacopy.asd -metap http://beta.quicklisp.org/archive/metap/2015-05-05/metap-20150505-git.tgz 3176 1de5d80b35b75fa3c8f668adb2fb891e bc6cb669fe93462ad434fd620eeeac1b17b59aa5 metap-20150505-git metap-test.asd metap.asd -metatilities http://beta.quicklisp.org/archive/metatilities/2018-02-28/metatilities-20180228-git.tgz 194405 bb75a7979528d08ec9c27ee154b9317e 531048725a416caea22d5996edd570f7cd25947a metatilities-20180228-git metatilities-test.asd metatilities.asd -metatilities-base http://beta.quicklisp.org/archive/metatilities-base/2019-12-27/metatilities-base-20191227-git.tgz 70648 7968829ca353c4a42784a151317029f1 e2abddb20c1a29455fc761c4c7716d9fdbebf0e9 metatilities-base-20191227-git metatilities-base-test.asd metatilities-base.asd -metering http://beta.quicklisp.org/archive/metering/2016-12-08/metering-20161208-git.tgz 17248 45dea763d90e5c9ddbdc31a8ccc5b6d7 e916a69c0148ea0ac6cbbab30f1e737b12b067cd metering-20161208-git metering.asd -method-combination-utilities http://beta.quicklisp.org/archive/method-combination-utilities/2014-11-06/method-combination-utilities-20141106-git.tgz 7311 881048d7bed117b8d7b4547a5111812d cb5a6ab010f6981e27c83f2ba22d33649a4db46a method-combination-utilities-20141106-git method-combination-utilities.asd -method-hooks http://beta.quicklisp.org/archive/method-hooks/2019-12-27/method-hooks-20191227-git.tgz 14332 f12af466f0dce69c3c50c8f5bd1ce61f 66ced022506a2eefbd65286cf7dd2af235bca45b method-hooks-20191227-git method-hooks-test.asd method-hooks.asd -method-versions http://beta.quicklisp.org/archive/method-versions/2011-05-22/method-versions_0.1.2011.05.18.tgz 4709 3e64215eeae18b8c830653e4ca22fe26 96476b31ff0c747c58477b2dc6227e1bfff611c8 method-versions_0.1.2011.05.18 method-versions.asd -mexpr http://beta.quicklisp.org/archive/mexpr/2015-07-09/mexpr-20150709-git.tgz 5385 7660c46156c0f98adc208451f64ff62f 9f9be5508184cc8dd23ed2e04812e1b71fdd1b5e mexpr-20150709-git mexpr-tests.asd mexpr.asd -mgl-pax http://beta.quicklisp.org/archive/mgl-pax/2018-01-31/mgl-pax-20180131-git.tgz 175872 05d6a95c330a661d0fe4ea8861dc86ea 07608475421ae501bf2a4857d31ac4b70a079233 mgl-pax-20180131-git mgl-pax-test.asd mgl-pax.asd -micmac http://beta.quicklisp.org/archive/micmac/2015-06-08/micmac-20150608-git.tgz 24509 fbe086e1ee3b4f4cb65a34872b6942b0 1dd7fb7a9c35a0f00f3a988ab35022a2db568c09 micmac-20150608-git micmac-test.asd micmac.asd -midi http://beta.quicklisp.org/archive/midi/2010-10-06/midi-20070618.tgz 6886 78d494c8d2fbc9a6af1b2d3e1b3c25d7 73a273cd33bccfa2bcd8ff93b38de5b1523e9993 midi-20070618 midi.asd -minheap http://beta.quicklisp.org/archive/minheap/2016-06-28/minheap-20160628-git.tgz 17015 27a57cdd27e91eb767f1377fcbfe2af3 0fe362afcf54c58c43ac9c36d8384d0be4782e02 minheap-20160628-git minheap-tests.asd minheap.asd -mini-cas http://beta.quicklisp.org/archive/mini-cas/2015-09-23/mini-cas-20150923-git.tgz 7018 5b29524320ea446c59ee913d6787faf0 7361170e6ebafe271aaf8b32962214bb2e860b5f mini-cas-20150923-git mini-cas.asd -misc-extensions http://beta.quicklisp.org/archive/misc-extensions/2015-06-08/misc-extensions-20150608-git.tgz 25456 ef8a05dd4382bb9d1e3960aeb77e332e 3f22977672a040f72b46d49fa680757deeff6a12 misc-extensions-20150608-git misc-extensions.asd -mito http://beta.quicklisp.org/archive/mito/2019-10-07/mito-20191007-git.tgz 38773 970032b767f3181967c179c7bc9bd0d3 07a8b4a3f24744dddeab1f7a6da068879c21998a mito-20191007-git lack-middleware-mito.asd mito-core.asd mito-migration.asd mito-test.asd mito.asd -mito-attachment http://beta.quicklisp.org/archive/mito-attachment/2019-05-21/mito-attachment-20190521-git.tgz 5159 00ff19e5e15a7bf9b2f159102d7b9f59 9e9d3a40b0ccc1b701ca9c76b1225a3bf909923e mito-attachment-20190521-git mito-attachment.asd -mito-auth http://beta.quicklisp.org/archive/mito-auth/2017-10-19/mito-auth-20171019-git.tgz 2014 f2ef144e4012a1ecac9420a64ac6ab16 f5c7ed9c9a43f739d1afddfb3616322b58b33746 mito-auth-20171019-git mito-auth.asd -mixalot http://beta.quicklisp.org/archive/mixalot/2015-12-18/mixalot-20151218-git.tgz 49886 c2132e94690a03a39343fff3a12cff1f 22856864b7a35fb44f52547cc6387e31f4db42e1 mixalot-20151218-git flac.asd mixalot-flac.asd mixalot-mp3.asd mixalot-vorbis.asd mixalot.asd mpg123-ffi.asd vorbisfile-ffi.asd -mk-string-metrics http://beta.quicklisp.org/archive/mk-string-metrics/2018-01-31/mk-string-metrics-20180131-git.tgz 5395 40f23794a7d841cb178f5951d3992886 e869de7baf6a85580ae92dd30e2ddffd9ce35400 mk-string-metrics-20180131-git mk-string-metrics-tests.asd mk-string-metrics.asd -mmap http://beta.quicklisp.org/archive/mmap/2019-11-30/mmap-20191130-git.tgz 13222 c465c1ec1dbbb17a227bc3c17d40bed4 983e80b42600cf539f8298716bfa9a0259ec309b mmap-20191130-git mmap-test.asd mmap.asd -mockingbird http://beta.quicklisp.org/archive/mockingbird/2017-11-30/mockingbird-20171130-git.tgz 8277 b5a2f5d401ba6ca7e2fab668bfa22cad 90ce36a82f42bf47eb9c87fd8f4694e4753673f5 mockingbird-20171130-git mockingbird-test.asd mockingbird.asd -modest-config http://beta.quicklisp.org/archive/modest-config/2018-02-28/modest-config-20180228-git.tgz 4144 25b0ea7d813ee8b806fd8ac434252ffd b899245e88298eb9bc042cd07237a6f1e6925af0 modest-config-20180228-git modest-config-test.asd modest-config.asd -modf http://beta.quicklisp.org/archive/modf/2019-05-21/modf-20190521-git.tgz 14168 42d31418ef8529e5e6be5c73c06eecb2 0e97b61de29d7ddd6d57d42627a385222e6fdc11 modf-20190521-git modf-test.asd modf.asd -modf-fset http://beta.quicklisp.org/archive/modf-fset/2015-06-08/modf-fset-20150608-git.tgz 2115 aec2b57d064522f5065597cd6619f851 0fb42b40b822fc95b98dacf7dcc86a0781f581cd modf-fset-20150608-git modf-fset-test.asd modf-fset.asd -modularize http://beta.quicklisp.org/archive/modularize/2019-07-10/modularize-20190710-git.tgz 10984 8a161c237e330eacdaae78a61b98bbdc 24d32656523252a1d0c367ba581ca98063b9ed50 modularize-20190710-git modularize-test-module.asd modularize.asd -modularize-hooks http://beta.quicklisp.org/archive/modularize-hooks/2019-07-10/modularize-hooks-20190710-git.tgz 6119 86d8ed59bb2e6231b3c651372920128a 164b8063183939b2b42aa744e4280bca1a626f35 modularize-hooks-20190710-git modularize-hooks.asd -modularize-interfaces http://beta.quicklisp.org/archive/modularize-interfaces/2019-07-10/modularize-interfaces-20190710-git.tgz 11193 c9730aafa93b237ffe0a5415a45e4c73 e37e1f7754385f011a46a0b0f7112f8ac3c10dc4 modularize-interfaces-20190710-git interfaces-test-implementation.asd modularize-interfaces.asd -moira http://beta.quicklisp.org/archive/moira/2017-11-30/moira-20171130-git.tgz 2823 a1cfcd5ab13cc5dda524d0f5e26e90ce 6e26e71c89b4ecdef7218d572ebcf342a26052bb moira-20171130-git moira.asd -monkeylib-binary-data http://beta.quicklisp.org/archive/monkeylib-binary-data/2011-12-03/monkeylib-binary-data-20111203-git.tgz 4927 ef6b8e9c30e6b8efa915ca35ed962cf3 77232f96c8600789af74f006a7af9eb1fc6e698d monkeylib-binary-data-20111203-git com.gigamonkeys.binary-data.asd -monkeylib-html http://beta.quicklisp.org/archive/monkeylib-html/2018-02-28/monkeylib-html-20180228-git.tgz 7951 2b2b680f1eb02d4392135cebc33825fe 464b87c31dcfde60e5e350c7f2b5bab63bd3eb32 monkeylib-html-20180228-git monkeylib-html.asd -monkeylib-json http://beta.quicklisp.org/archive/monkeylib-json/2018-02-28/monkeylib-json-20180228-git.tgz 4329 253e4e5aa8fd634fc76c97e8b9be0862 56e485b956487256210d5eb76a3031f95d54335d monkeylib-json-20180228-git com.gigamonkeys.json.asd -monkeylib-macro-utilities http://beta.quicklisp.org/archive/monkeylib-macro-utilities/2011-12-03/monkeylib-macro-utilities-20111203-git.tgz 1968 b03c3644ff328ded7e7e0a39741a69ba 4bc771174bdb9bb52952356408d7a617e6b4ce2c monkeylib-macro-utilities-20111203-git com.gigamonkeys.macro-utilities.asd -monkeylib-markup http://beta.quicklisp.org/archive/monkeylib-markup/2012-09-09/monkeylib-markup-20120909-git.tgz 51056 e2f052930d4ed6cbd97b802b20a83646 fcf29d2e6a193626a8c5eb3d2498caf192735479 monkeylib-markup-20120909-git com.gigamonkeys.markup.asd -monkeylib-markup-html http://beta.quicklisp.org/archive/monkeylib-markup-html/2012-02-08/monkeylib-markup-html-20120208-git.tgz 4582 f70d4f0c511f36d6fc4a10a6912b51e0 d1fb1db716fdb7fe0fa845e223d0da5e76629b69 monkeylib-markup-html-20120208-git monkeylib-markup-html.asd -monkeylib-parser http://beta.quicklisp.org/archive/monkeylib-parser/2012-02-08/monkeylib-parser-20120208-git.tgz 22347 3e4327f25a31e78f93fd50de71b41065 48d5b2a1b8072d27c7601124a166fbadb2bc1bb4 monkeylib-parser-20120208-git com.gigamonkeys.parser.asd -monkeylib-pathnames http://beta.quicklisp.org/archive/monkeylib-pathnames/2012-02-08/monkeylib-pathnames-20120208-git.tgz 3689 9f7c261f5a6f3e594c8b63f3a81fd87e 8d3750393675bcd26b42b59cf20ca4e9127d55f2 monkeylib-pathnames-20120208-git com.gigamonkeys.pathnames.asd -monkeylib-prose-diff http://beta.quicklisp.org/archive/monkeylib-prose-diff/2014-07-13/monkeylib-prose-diff-20140713-git.tgz 68305 6c656fe2d6bcb7eaba029b23da783a53 d70a0717980660fb19691b8f40c02fb430187a67 monkeylib-prose-diff-20140713-git com.gigamonkeys.prose-diff.asd -monkeylib-test-framework http://beta.quicklisp.org/archive/monkeylib-test-framework/2010-12-07/monkeylib-test-framework-20101207-git.tgz 7237 cebe94d4ac359f39cf0eef63cf0e8de5 52d736e23f6a71c8ea987186c1f4c1b460c5a356 monkeylib-test-framework-20101207-git com.gigamonkeys.test-framework.asd -monkeylib-text-languages http://beta.quicklisp.org/archive/monkeylib-text-languages/2011-12-03/monkeylib-text-languages-20111203-git.tgz 5234 a5ff209ee992b4fe4685cabd3616bc49 9e02022e60dfbcfa4e2c7399dec3d4e579721383 monkeylib-text-languages-20111203-git monkeylib-text-languages.asd -monkeylib-text-output http://beta.quicklisp.org/archive/monkeylib-text-output/2011-12-03/monkeylib-text-output-20111203-git.tgz 3919 1d0623eadd80d9b0bbfa71b5a6d08d31 12de87a35e9dd6169d0201c3d17f07ab7d9bcd16 monkeylib-text-output-20111203-git monkeylib-text-output.asd -monkeylib-utilities http://beta.quicklisp.org/archive/monkeylib-utilities/2017-04-03/monkeylib-utilities-20170403-git.tgz 12151 323d5400fe092b0aff4be8d39c8bef33 9c55b7c6192c126ff49da725fdadeaf4e90a5d3c monkeylib-utilities-20170403-git com.gigamonkeys.utilities.asd -montezuma http://beta.quicklisp.org/archive/montezuma/2018-02-28/montezuma-20180228-git.tgz 1264435 db964cddda9b92877259d7db67c2aac3 37dd0718f7823760da2d72d050b39a38c56b4758 montezuma-20180228-git contrib/montezuma-indexfiles/montezuma-indexfiles.asd lucene-in-action/lucene-in-action-tests.asd montezuma.asd -mop-utils http://beta.quicklisp.org/archive/mop-utils/2012-08-11/mop-utils-20120811-http.tgz 5309 f320b8601e9d921305b1fd5b405479b6 7ba77dc06ef07c5ff2ef756552a6016d4ba48071 mop-utils-20120811-http mop-utils.asd -moptilities http://beta.quicklisp.org/archive/moptilities/2017-04-03/moptilities-20170403-git.tgz 15618 b118397be325e60a772ea3631c4f19a4 a2b4eb6acad43773290ed22ee7698367476b01f5 moptilities-20170403-git moptilities-test.asd moptilities.asd -more-conditions http://beta.quicklisp.org/archive/more-conditions/2018-08-31/more-conditions-20180831-git.tgz 20791 c4797bd3c6c50fba02a6e8164ddafe28 d81093734a1f68b0ce022eaa1577334d22987390 more-conditions-20180831-git more-conditions.asd -mp3-duration http://beta.quicklisp.org/archive/mp3-duration/2016-02-08/mp3-duration-20160208-git.tgz 2763 fe74eb23d4016d798f4c7ab39fae1991 edeab1547d760345c92b49dbb707adf69c4e16a8 mp3-duration-20160208-git mp3-duration-test.asd mp3-duration.asd -mpc http://beta.quicklisp.org/archive/mpc/2016-09-29/mpc-20160929-git.tgz 22507 7a4be8c7f3c1a896d2fa06c6aff4accf fc09c11b6e330eee4d0435e1fe5a9d09c3d1c803 mpc-20160929-git mpc.asd -mra-wavelet-plot http://beta.quicklisp.org/archive/mra-wavelet-plot/2018-12-10/mra-wavelet-plot-20181210-git.tgz 2672 6e58c7f058b996710f89095bd7d55140 4824e4d538ea298a76d6c69f6df99782ce5e0b41 mra-wavelet-plot-20181210-git mra-wavelet-plot.asd -mt19937 http://beta.quicklisp.org/archive/mt19937/2011-02-19/mt19937-1.1.1.tgz 5551 54c63977b6d77abd66ebe0227b77c143 268d9a0d1dc870bd409bf9a85f80ff39840efd49 mt19937-1.1.1 mt19937.asd -mtif http://beta.quicklisp.org/archive/mtif/2017-11-30/mtif-20171130-git.tgz 36178 a713b90c4790464371cdc469d44a441f 8ee07bbf0c5b5fbfd618054945055ab638c7db57 mtif-20171130-git mtif.asd -mtlisp http://beta.quicklisp.org/archive/mtlisp/2013-06-15/mtlisp-20130615-git.tgz 41092 651cd99d4c77b0d533c1ee94e515b6b7 4d9ce6610ce99f89ddbfaea4d40a4369f8e1c8f8 mtlisp-20130615-git mtlisp.asd -multilang-documentation http://beta.quicklisp.org/archive/multilang-documentation/2019-07-10/multilang-documentation-20190710-git.tgz 7361 ba61cdd7a06d398143c4f18614c2b3a7 fa7caa1284353367149f88f1606465fa4357f49a multilang-documentation-20190710-git multilang-documentation.asd -multiple-value-variants http://beta.quicklisp.org/archive/multiple-value-variants/2014-08-26/multiple-value-variants-1.0.1.tgz 6991 b5676f66549832298262156277a79a52 b149d999e846c682677d7bbfbd3791c1baf73480 multiple-value-variants-1.0.1 multiple-value-variants.asd -multiposter http://beta.quicklisp.org/archive/multiposter/2019-07-10/multiposter-20190710-git.tgz 19032 38c12d3d08ad2b045f1b11e846eb2388 c49a54fb5fe7e314cbcc721677f0162e8b6a295e multiposter-20190710-git multiposter-git.asd multiposter-mastodon.asd multiposter-studio.asd multiposter-tumblr.asd multiposter-twitter.asd multiposter.asd -multival-plist http://beta.quicklisp.org/archive/multival-plist/2012-03-05/multival-plist-20120305-git.tgz 2263 db7767930bc07a150b697a6b63c369db eb4c2b023fccebd18549008ad67aa1ce6d4ace09 multival-plist-20120305-git multival-plist-test.asd multival-plist.asd -mw-equiv http://beta.quicklisp.org/archive/mw-equiv/2010-10-06/mw-equiv-0.1.3.tgz 6115 671497babfd44f6d9c5f0c02bddb457c 4a79edf2ca9f5e65daff7f37323da4f1055d914c mw-equiv-0.1.3 mw-equiv.asd -mystic http://beta.quicklisp.org/archive/mystic/2016-02-08/mystic-20160208-git.tgz 7566 c76b5583defbbc0a921332f496fee7c5 a0ddfaea0aea12b7ce41e05d446626cf02a5d99f mystic-20160208-git mystic-file-mixin.asd mystic-fiveam-mixin.asd mystic-gitignore-mixin.asd mystic-library-template.asd mystic-readme-mixin.asd mystic-test.asd mystic-travis-mixin.asd mystic.asd -myway http://beta.quicklisp.org/archive/myway/2018-10-18/myway-20181018-git.tgz 5345 88adecdaec89ceb262559d443512e545 59f2da1260d448da0d9fc41e6ae2ddde26d5f5bc myway-20181018-git myway-test.asd myway.asd -myweb http://beta.quicklisp.org/archive/myweb/2015-06-08/myweb-20150608-git.tgz 29572 bc91336495ca1421dac79bf14c5e6881 9e6e03663659d582aca58d1bfb7606952e9a7fcf myweb-20150608-git myweb.asd -named-read-macros http://beta.quicklisp.org/archive/named-read-macros/2018-02-28/named-read-macros-20180228-git.tgz 7508 d0d68f2a17654219f1b1aebd16978003 dbe6462ca342c5620b1438265f93785053df5d3a named-read-macros-20180228-git named-read-macros.asd test/named-read-macros-test.asd -named-readtables http://beta.quicklisp.org/archive/named-readtables/2018-01-31/named-readtables-20180131-git.tgz 32869 46db18ba947dc0aba14c76471604448d 6a6509d4c21a89df82098635fe655eb1d156dbbf named-readtables-20180131-git named-readtables.asd -nanovg-blob http://beta.quicklisp.org/archive/nanovg-blob/2018-02-28/nanovg-blob-stable-c9ef601c-git.tgz 805423 1efaa411fe9fcde20207682ec4e965a8 633c8e7c3059eb7269dfed86758b258de3994d05 nanovg-blob-stable-c9ef601c-git nanovg-blob.asd -napa-fft3 http://beta.quicklisp.org/archive/napa-fft3/2015-12-18/napa-fft3-20151218-git.tgz 31959 4930569d5c4092ab11f76d8886779e6e 61afdce14dfe27431acbbd063c9840786b5e5d11 napa-fft3-20151218-git napa-fft3.asd -narrowed-types http://beta.quicklisp.org/archive/narrowed-types/2018-02-28/narrowed-types-20180228-git.tgz 2510 a149f985d2032c17210a3f75a9eca101 130b28978940159ed19df76eed1945738cfd1b05 narrowed-types-20180228-git narrowed-types-test.asd narrowed-types.asd -neo4cl http://beta.quicklisp.org/archive/neo4cl/2018-08-31/neo4cl-20180831-git.tgz 10076 bc94c945ddee04e872ffb3958c1a2577 93efd8fbc1df222b66a3c401344c036b4b83ade6 neo4cl-20180831-git src/neo4cl.asd test/neo4cl-test.asd -net-telent-date http://beta.quicklisp.org/archive/net-telent-date/2010-10-06/net-telent-date_0.42.tgz 12575 6fedf40113b2462f7bd273d07950066b 2a0efdd496136ba7d0d1d7b701ff57f9f0a0929f net-telent-date_0.42 net-telent-date.asd -network-addresses http://beta.quicklisp.org/archive/network-addresses/2016-06-28/network-addresses-20160628-git.tgz 4504 6b48746dc7beff85ed4b81edc4d31732 aa2e821a7e184fa885827db8b111896d641d3f6b network-addresses-20160628-git network-addresses-test.asd network-addresses.asd -new-op http://beta.quicklisp.org/archive/new-op/2019-01-07/new-op-20190107-git.tgz 22260 6c2743ca9eaac48b619d911008f44795 6fb4b2b881e489757f4e4de9604b9f59f10dd8a7 new-op-20190107-git new-op.asd -nibbles http://beta.quicklisp.org/archive/nibbles/2018-08-31/nibbles-20180831-git.tgz 17647 4badf1f066a59c3c270d40be1116ecd5 8aa99c491fb71a18bf8da843556b1df0da368152 nibbles-20180831-git nibbles.asd -nineveh http://beta.quicklisp.org/archive/nineveh/2019-10-07/nineveh-release-quicklisp-0a10a846-git.tgz 47692 c7c3fe5e3a5a3bb9e8e7de3086cf95bb 43962ced034bf55962f61fe06ba75c2dd85a47a6 nineveh-release-quicklisp-0a10a846-git nineveh.asd -ningle http://beta.quicklisp.org/archive/ningle/2019-10-07/ningle-20191007-git.tgz 7069 13c890c05123b77d1d4c0f811490bfb2 f4677ddadcb493627fba8f96b6dd4142694afe57 ningle-20191007-git ningle-test.asd ningle.asd -nodgui http://beta.quicklisp.org/archive/nodgui/2019-12-27/nodgui-20191227-git.tgz 119723 8aefa966cc15e060128411810b3e1776 44069f8dfd09491695d398e8b8da762b6dc97dce nodgui-20191227-git nodgui.asd -north http://beta.quicklisp.org/archive/north/2019-07-10/north-20190710-git.tgz 53727 911fa6dff0ba34301ab3b7ed26194a69 0e36470bba12f4bc9e533a8efab20f452f42d793 north-20190710-git example/north-example.asd north-core.asd north-dexador.asd north-drakma.asd north.asd -nsort http://beta.quicklisp.org/archive/nsort/2015-05-05/nsort-20150505-git.tgz 1785 71e01656a21f61447e0298f89d3af456 912766fd5765889a4ce4a6a0b64fc2d14d29f63a nsort-20150505-git nsort.asd -nst http://beta.quicklisp.org/archive/nst/2016-03-18/nst-4.1.0.tgz 635557 4fedd2bed9ead1c50901087ff8b14ef6 037e7bb17db08f52a0286b5d4f2d7388792ede38 nst-4.1.0 asdf-nst.asd nst.asd test/direct/nst-simple-tests.asd test/lisp/comp-set/comp-set.asd test/manual/nst-manual-tests.asd test/meta/mnst-relay.asd test/meta/nst-meta-tests.asd test/nst-test-jenkins.asd test/nst-test.asd test/util/nst-selftest-utils.asd utils/mop/nst-mop-utils.asd -nuclblog http://beta.quicklisp.org/archive/nuclblog/2014-08-26/nuclblog-20140826-git.tgz 20053 fb80583640212d0bfc452f9156917eac ffded3e808a703fdda65f3b3ab7c677c9be60946 nuclblog-20140826-git nuclblog.asd -nuklear-blob http://beta.quicklisp.org/archive/nuklear-blob/2018-02-28/nuklear-blob-stable-6c297dc2-git.tgz 1144021 ff3ca427d01ca1b40a4793aae8ff5669 3aa2e0c8484bead4269be706f87593cf9c8b30d0 nuklear-blob-stable-6c297dc2-git nuklear-blob.asd -num-utils http://beta.quicklisp.org/archive/num-utils/2019-11-30/num-utils-20191130-git.tgz 69549 d48ab213d48378c1ed16506d43472c63 3c8458aea70de41f285c5bd93ee84eab036d39af num-utils-20191130-git num-utils.asd -numcl http://beta.quicklisp.org/archive/numcl/2019-12-27/numcl-20191227-git.tgz 252024 8832fb53f6839b4713d39972d8c01849 99f19f64e445e3e8b517c3ff7f5a9ed01fcbcd1f numcl-20191227-git numcl.asd numcl.test.asd -numpy-file-format http://beta.quicklisp.org/archive/numpy-file-format/2019-07-10/numpy-file-format-20190710-git.tgz 4675 06d473abeb72c1ff6d8905dfe2fc19ef 1c134c560b2e98b3f39f6ded3c0b4a37b8e2383b numpy-file-format-20190710-git code/numpy-file-format.asd -oclcl http://beta.quicklisp.org/archive/oclcl/2019-05-21/oclcl-20190521-git.tgz 171806 3e1768e4d9c1412aabd19fc23457ca8f 2f49a21ab843dc52b012a82c286142994c122e95 oclcl-20190521-git oclcl-examples.asd oclcl-test.asd oclcl.asd -ode-blob http://beta.quicklisp.org/archive/ode-blob/2018-02-28/ode-blob-stable-bf2a5e4e-git.tgz 3757262 0aab7098d5e984763feb298da1c041fb cd711fe77374c6065f16821af4e86eac156dab9a ode-blob-stable-bf2a5e4e-git ode-blob.asd -oe-encode http://beta.quicklisp.org/archive/oe-encode/2015-08-04/oe-encode-20150804-git.tgz 49756 317e7cb5295306a3b64a7b5cfe673093 1d2ad0214c58b88ddff8c2f66e8ef1d89b6de0ba oe-encode-20150804-git oe-encode.asd -omer-count http://beta.quicklisp.org/archive/omer-count/2019-01-07/omer-count-20190107-git.tgz 15545 286a7a336643883ab687d59e45411fd0 87d0a5cf584feec73ae0d49f0450d4281358562f omer-count-20190107-git eclecticse.omer.asd -oneliner http://beta.quicklisp.org/archive/oneliner/2013-10-03/oneliner-20131003-git.tgz 3129 8709f2596797542709d9fc02e557d8c2 b2c7d3ee581dc13e43cf14a85b1f3e0bca093625 oneliner-20131003-git cl-oneliner.asd -ook http://beta.quicklisp.org/archive/ook/2019-01-07/ook-20190107-git.tgz 12018 2d97c0df14bbeb217c3f040debad16c8 ee5b43757da4eec24f07ed7ae92af92823633603 ook-20190107-git ook.asd -oook http://beta.quicklisp.org/archive/oook/2017-11-30/oook-20171130-git.tgz 12023 eb6ee68a5f48b3720d7285fae7336485 b368840c0547253cb2c82e9ef9c48ffd27fed565 oook-20171130-git oook.asd -open-location-code http://beta.quicklisp.org/archive/open-location-code/2019-05-21/open-location-code-20190521-git.tgz 16291 b4284a6d6e2cc69ed83c55cda0b12e42 3026ae7a678f5cee8ee82cad27c742d604605ff7 open-location-code-20190521-git open-location-code.asd -open-vrp http://beta.quicklisp.org/archive/open-vrp/2014-09-14/open-vrp-20140914-git.tgz 925579 718ad8132bb06eb5a66b1c1a814b7e66 066d3adb2be495e1a76dadf9e55ec2e66519715c open-vrp-20140914-git open-vrp-lib.asd open-vrp.asd -openal-blob http://beta.quicklisp.org/archive/openal-blob/2018-02-28/openal-blob-stable-d414fc89-git.tgz 2266861 d372c27834a955621f3c8e1a3f853908 8a962e86b10de8af75d6b6b9c1f126d3dec759e9 openal-blob-stable-d414fc89-git openal-blob.asd -openid-key http://beta.quicklisp.org/archive/openid-key/2018-12-10/openid-key-20181210-git.tgz 3284 cbe196eef93ee9eec7ef117557c440b2 4cdb875b541259e7bb9bbf8d26244f3dba1078b2 openid-key-20181210-git openid-key-test.asd openid-key.asd -opticl http://beta.quicklisp.org/archive/opticl/2018-12-10/opticl-20181210-git.tgz 193833 4d33d1faff5db29a1ffe65df37555f4f 16a4b01d3a336929a0389211e349e1ea2122d143 opticl-20181210-git opticl-doc.asd opticl.asd -opticl-core http://beta.quicklisp.org/archive/opticl-core/2017-10-19/opticl-core-20171019-git.tgz 4502 612766d24e14244a87d0bf41a789ed5a 90fe1cccff0248626018b5634abdf717f5e8c445 opticl-core-20171019-git opticl-core.asd -optima http://beta.quicklisp.org/archive/optima/2015-07-09/optima-20150709-git.tgz 20345 20523dc3dfc04bb2526008dff0842caa aec56f162a6b34024d0b419ed9dfb35ef9e75be6 optima-20150709-git optima.asd optima.ppcre.asd optima.test.asd -org-davep-dict http://beta.quicklisp.org/archive/org-davep-dict/2019-05-21/org-davep-dict-20190521-git.tgz 6731 a5c307e394ddaf3dc23fd415fb025e04 84ce779221666927b4e07aaa47fcd26fb24f7bf0 org-davep-dict-20190521-git org-davep-dict.asd -org-davep-dictrepl http://beta.quicklisp.org/archive/org-davep-dictrepl/2019-05-21/org-davep-dictrepl-20190521-git.tgz 2983 311107f58978970b214e575690815a62 89eb453c83abfd72dd4c6a821a5b9704794e2fab org-davep-dictrepl-20190521-git org-davep-dictrepl.asd -org-sampler http://beta.quicklisp.org/archive/org-sampler/2016-03-18/org-sampler-0.2.0.tgz 61604 1d367f79a5cb325abce3e1640ce6bc91 e7e572deb75c9bb2f55bdca3a5915bf1fb4440da org-sampler-0.2.0 org-sampler.asd -origin http://beta.quicklisp.org/archive/origin/2019-12-27/origin-20191227-git.tgz 32925 6a1916f3d76c940967dd204be8f9ea1c 6daccc964991755c6dafaaaf40e18ebef136d7f4 origin-20191227-git origin.asd origin.test.asd -orizuru-orm http://beta.quicklisp.org/archive/orizuru-orm/2019-10-07/orizuru-orm-20191007-git.tgz 49639 3ea3d1379b9051835ff209074a67655b 71ccbac81c4d6cdc4c868be10a97d8d76e8b4960 orizuru-orm-20191007-git orizuru-orm.asd -osc http://beta.quicklisp.org/archive/osc/2019-05-21/osc-20190521-git.tgz 17189 3de093d1f99a34544e8555d3e51c7f6e 34689d25a01a1ef71f27de6f3bc4179a0b732e3e osc-20190521-git osc.asd -osicat http://beta.quicklisp.org/archive/osicat/2019-07-10/osicat-20190710-git.tgz 54723 9a062b84fce8979686c17d676ff0c0e5 49bbb5830916a90b306460aa396b6b3cee7db912 osicat-20190710-git osicat-tests.asd osicat.asd -osmpbf http://beta.quicklisp.org/archive/osmpbf/2019-12-27/osmpbf-20191227-git.tgz 18603 444df002a3e438b778531aa2fb8656b1 29c085b73c5dc84a3c14ae2c7d934b81d605e3d4 osmpbf-20191227-git osmpbf.asd -overlord http://beta.quicklisp.org/archive/overlord/2019-11-30/overlord-20191130-git.tgz 59572 1bc805d3c001a1a1416663edd488af1f d647d87e17a8c42e806162b10a2c6c6f13f8146f overlord-20191130-git overlord.asd -oxenfurt http://beta.quicklisp.org/archive/oxenfurt/2019-07-10/oxenfurt-20190710-git.tgz 23362 d3399266edf13969b0031f972a15477f 146d6718296832a33ebd25076d743677b4a74a95 oxenfurt-20190710-git oxenfurt-core.asd oxenfurt-dexador.asd oxenfurt-drakma.asd oxenfurt.asd -pack http://beta.quicklisp.org/archive/pack/2011-06-19/pack-20110619-git.tgz 3684 f769fa83d8487575facf6fe5adf9b245 e33f75deac5ab3a1facc24fc378c9184b6be6d04 pack-20110619-git pack.asd -package-renaming http://beta.quicklisp.org/archive/package-renaming/2012-04-07/package-renaming-20120407-git.tgz 4522 b9d7b446196fba632edd088bf9ad23ae bcba6923289ab9cf2f539dec333853ff7d9e0a65 package-renaming-20120407-git package-renaming-test.asd package-renaming.asd -packet http://beta.quicklisp.org/archive/packet/2015-03-02/packet-20150302-git.tgz 10533 71312a40fa6abb7027b94c8a57a90d00 5c459eb3feebdfed53359a7b021cba522ae6df71 packet-20150302-git packet.asd -paiprolog http://beta.quicklisp.org/archive/paiprolog/2018-02-28/paiprolog-20180228-git.tgz 172150 1f04f011c9f09d7fe854b98e845d21bd e5505fd5ff9fb77bf6e3374ab0d5e9e37cc7186a paiprolog-20180228-git paiprolog.asd unifgram.asd -pal http://beta.quicklisp.org/archive/pal/2015-06-08/pal-20150608-git.tgz 3707918 ce7afd79040188475efc67ae87287949 795d4e4f69cb4132ee35b641e564ee01ab6365d9 pal-20150608-git examples/bermuda/bermuda.asd pal.asd -pandocl http://beta.quicklisp.org/archive/pandocl/2015-09-23/pandocl-20150923-git.tgz 2581 ee9450a491206f3c606c05bb63268c08 613046a725fc6925372f484d1771c6acf4b74b0d pandocl-20150923-git pandocl.asd -pango-markup http://beta.quicklisp.org/archive/pango-markup/2019-07-10/pango-markup-20190710-git.tgz 9296 811d7fb0d9d3744030c5ff63873d9a8c 67ac0851ed2b9f01ca5a59c18c3a9c95e4f122c8 pango-markup-20190710-git pango-markup.asd -papyrus http://beta.quicklisp.org/archive/papyrus/2018-01-31/papyrus-20180131-git.tgz 75141 21f9ff35cb1dc7e0b908747c99bbfa63 6720de69bc909d07e0f4b9818b751361a1e16925 papyrus-20180131-git papyrus.asd -parachute http://beta.quicklisp.org/archive/parachute/2019-11-30/parachute-20191130-git.tgz 52496 ab5ee5589a6db1dbe0d6dbc1671022c6 3e30731da18f6ebf73c2e4ad5ea7ad3fe629917f parachute-20191130-git compat/parachute-fiveam.asd compat/parachute-lisp-unit.asd compat/parachute-prove.asd parachute.asd -parameterized-function http://beta.quicklisp.org/archive/parameterized-function/2019-03-07/parameterized-function-20190307-hg.tgz 3178 13de98b8381cd84c9cad3dde122e919a d0ee504ad9a10a393ff6326f1885ebfd16981149 parameterized-function-20190307-hg parameterized-function.asd -paren-files http://beta.quicklisp.org/archive/paren-files/2011-04-18/paren-files-20110418-git.tgz 11665 cf10bbcfa01d65e1487b2764d3967aeb 136c1ec5faace0cb6642fde48c9c8c317e0a3b91 paren-files-20110418-git paren-files.asd -paren-test http://beta.quicklisp.org/archive/paren-test/2017-08-30/paren-test-20170830-git.tgz 2796 1699edb46292e81cc416a717d42eb13a 8337b21fd440117d26c77f1ce1c6c3d81ec49265 paren-test-20170830-git examples/arith.asd paren-test.asd -paren-util http://beta.quicklisp.org/archive/paren-util/2011-04-18/paren-util-20110418-git.tgz 9583 ce8212375a6586235774baa4f7cfc4c5 1928ce6c595d307357e01e49fd47c32993b8562e paren-util-20110418-git paren-util.asd -paren6 http://beta.quicklisp.org/archive/paren6/2019-11-30/paren6-20191130-git.tgz 11611 0a7af3a318e176871cd0f5f54f701329 1fe467be360247f27cb410c5f19989cb9a002d00 paren6-20191130-git paren6.asd test-paren6.asd -parenml http://beta.quicklisp.org/archive/parenml/2015-09-23/parenml-20150923-git.tgz 2084 e02a5cb32d6ceda30744c90589b854cb 87db838f002b09178393e5162ebf681b43d23be6 parenml-20150923-git parenml-test.asd parenml.asd -parenscript http://beta.quicklisp.org/archive/parenscript/2018-12-10/Parenscript-2.7.1.tgz 103952 047c9a72bd36f1b4a5ec67af9453a0b9 2532046ecb26bcbc808bf8ed2d14d140a9a33fba Parenscript-2.7.1 parenscript.asd parenscript.tests.asd -parenscript-classic http://beta.quicklisp.org/archive/parenscript-classic/2011-12-03/parenscript-classic-20111203-darcs.tgz 185472 9d355c65babf238bdce498ff628e187b 3ea1563d8e21583c48b31677797e99b74fd31492 parenscript-classic-20111203-darcs parenscript-classic.asd -parse http://beta.quicklisp.org/archive/parse/2019-10-07/parse-20191007-git.tgz 7392 9b12a61e279f5cf969b45feff6946efa ab4b3da76e74abf9f5ca8a76c877c9d303caf79d parse-20191007-git parse.asd -parse-declarations http://beta.quicklisp.org/archive/parse-declarations/2010-10-06/parse-declarations-20101006-darcs.tgz 36664 e49222003e5b59c5c2a0cf58b86cfdcd f2ed7dbb076058e4aef57553469759b13a0a618c parse-declarations-20101006-darcs parse-declarations-1.0.asd -parse-float http://beta.quicklisp.org/archive/parse-float/2017-10-19/parse-float-20171019-git.tgz 4696 182135a8478013dbd52b87a9f378adc0 c280e2e4f7fd153d0ddec5de03f56b0891f33e24 parse-float-20171019-git parse-float.asd -parse-front-matter http://beta.quicklisp.org/archive/parse-front-matter/2016-08-25/parse-front-matter-20160825-git.tgz 1378 478c27505370135f5d8859fe5c755431 2da48a358580ac203b5762acdce7eb3e6516f39b parse-front-matter-20160825-git parse-front-matter-test.asd parse-front-matter.asd -parse-js http://beta.quicklisp.org/archive/parse-js/2016-04-21/parse-js-20160421-git.tgz 10664 14049fdc5f55bf48d7e3d54a9549a97e c6baef888b9383b2d437d31426f231de8a31b064 parse-js-20160421-git parse-js.asd -parse-number http://beta.quicklisp.org/archive/parse-number/2018-02-28/parse-number-v1.7.tgz 5715 b9ec925018b8f10193d73403873dde8f 472816dd6ad673d3be65ae33495c5378ba6b6588 parse-number-v1.7 parse-number.asd -parse-number-range http://beta.quicklisp.org/archive/parse-number-range/2012-11-25/parse-number-range-1.0.tgz 5733 a1a173bffeafcdca9320473f14103f80 c79d229ba4d3a0c5267b21b3560026b78a8c2300 parse-number-range-1.0 parse-number-range.asd -parseltongue http://beta.quicklisp.org/archive/parseltongue/2013-03-12/parseltongue-20130312-git.tgz 27941 4519905cf797085c6063c33bf0107b9c 3f9099ad7ee505fe0b8abaaca1e32d03bf6892b0 parseltongue-20130312-git parseltongue.asd -parseq http://beta.quicklisp.org/archive/parseq/2018-07-11/parseq-20180711-git.tgz 40220 850be8911e7bda4c0fa70da9891ab348 2e6f48a219623b5221774a3bc8f11fe999aafe75 parseq-20180711-git parseq.asd -parser.common-rules http://beta.quicklisp.org/archive/parser.common-rules/2019-08-13/parser.common-rules-20190813-git.tgz 18693 ac4b894c728378c016a4ab71eb00503f b768c951247e8f9596abcd52b67a9869d8c9e98e parser.common-rules-20190813-git parser.common-rules.asd parser.common-rules.operators.asd -parser.ini http://beta.quicklisp.org/archive/parser.ini/2018-10-18/parser.ini-20181018-git.tgz 11142 83943b433684f7bef2ad113adef8e4fd 60010609b62b382abbdda31e8824ab3026a42ffe parser.ini-20181018-git parser.ini.asd -parsley http://beta.quicklisp.org/archive/parsley/2019-07-10/parsley-20190710-git.tgz 2598 5e7ad4fb112607379dd20e2ad52ee766 d32698da74e3fadf88145220be4cd0c2d828addc parsley-20190710-git parsley.asd -patchwork http://beta.quicklisp.org/archive/patchwork/2019-10-08/patchwork-20191008-git.tgz 5446 0b6ec00c7d0cd7b60ee98bfc71fc9acc 2f96d153b0439cfbcf0b121771f6a11275ec2cac patchwork-20191008-git patchwork.asd -path-parse http://beta.quicklisp.org/archive/path-parse/2016-04-21/path-parse-20160421-git.tgz 2115 83ace94d06e0759f717bf11be698602e 331bfeef1557fa4133220cac48bf4afb4f62a8da path-parse-20160421-git path-parse-test.asd path-parse.asd -path-string http://beta.quicklisp.org/archive/path-string/2016-08-25/path-string-20160825-git.tgz 4983 bc3d1e818a793d955eb6877f67bd4d52 833c85edc0fffcfcef2a9b5cfd111910c648293a path-string-20160825-git path-string-test.asd path-string.asd -pathname-utils http://beta.quicklisp.org/archive/pathname-utils/2019-07-10/pathname-utils-20190710-git.tgz 11927 b9a4eca84ddaa0e4daa6f2a66f788d3e 1f11bb91ee40ef38fc9de2a3f1af40a58b135e81 pathname-utils-20190710-git pathname-utils-test.asd pathname-utils.asd -patron http://beta.quicklisp.org/archive/patron/2013-04-20/patron-20130420-git.tgz 12195 dd08fa2247852002f9884ccc842aeae4 6d2f8130f0ab4eab47b9aba79e3cc060ef6da096 patron-20130420-git patron.asd -pcall http://beta.quicklisp.org/archive/pcall/2010-10-06/pcall-0.3.tgz 14561 019d85dfd1d5d0ee8d4ee475411caf6b 65626582e38d7a8b3180382a694a96290fde4b2c pcall-0.3 pcall-queue.asd pcall.asd -percent-encoding http://beta.quicklisp.org/archive/percent-encoding/2012-10-13/percent-encoding-20121013-git.tgz 5240 de4b28564907c12b598630d27135d80f c945ddb56afaf0244019242f77e396edfe870e1f percent-encoding-20121013-git percent-encoding.asd -periodic-table http://beta.quicklisp.org/archive/periodic-table/2011-10-01/periodic-table-1.0.tgz 5100 1fe8e203b8b622857fe1af4ade13e7ce 1f118c131789908e9108b84e72c2e1325f1ee22e periodic-table-1.0 periodic-table.asd -periods http://beta.quicklisp.org/archive/periods/2019-03-07/periods-20190307-git.tgz 32775 2c6e7fb7b1bd2ce68fa8b4a465bbf1b8 8d5404ba512157b680285dbe51a8c5f0ed8d445e periods-20190307-git periods-series.asd periods.asd -perlre http://beta.quicklisp.org/archive/perlre/2018-10-18/perlre-20181018-git.tgz 7321 48d78039676ff6d2373bf194132e87d1 84d7222acf11fb1ef2cbe59a7a911e16a761913e perlre-20181018-git perlre.asd -persistent-tables http://beta.quicklisp.org/archive/persistent-tables/2012-02-08/persistent-tables-20120208-git.tgz 2585 08f6feb0c4716102d9f4c0ebe817a7be d53ebc25f643ca4ff4f4dda34421ddd1f6a2137c persistent-tables-20120208-git persistent-tables.asd -persistent-variables http://beta.quicklisp.org/archive/persistent-variables/2013-03-12/persistent-variables-20130312-git.tgz 117127 ba06997b04bdbeee85fc8861e0cdf687 ac9009d2637c21140d015c84b88200659808a7e1 persistent-variables-20130312-git persistent-variables.asd -petalisp http://beta.quicklisp.org/archive/petalisp/2019-12-27/petalisp-20191227-git.tgz 110026 e386843163c9b7be44df67aa3f1f4024 b158a44b6bb9dc21a985488f8c654f809aeecd48 petalisp-20191227-git code/api/petalisp.api.asd code/core/petalisp.core.asd code/graphviz/petalisp.graphviz.asd code/ir-backend/petalisp.ir-backend.asd code/ir/petalisp.ir.asd code/native-backend/petalisp.native-backend.asd code/native-compiler/petalisp.blueprint-compiler.asd code/petalisp.asd code/reference-backend/petalisp.reference-backend.asd code/scheduler/petalisp.scheduler.asd code/test-suite/petalisp.test-suite.asd code/type-inference/petalisp.type-inference.asd code/utilities/petalisp.utilities.asd examples/petalisp.examples.asd -petit.package-utils http://beta.quicklisp.org/archive/petit.package-utils/2014-08-26/petit.package-utils-20140826-git.tgz 2290 58e6dceab797eec3cea779e5fb366486 f8a4735180f1d47481349ed8801433a4a6a5a8df petit.package-utils-20140826-git petit.package-utils.asd -petit.string-utils http://beta.quicklisp.org/archive/petit.string-utils/2014-11-06/petit.string-utils-20141106-git.tgz 4262 dea2dea0ac8045a1930a81231a1ac39b 8169426736e26e55f30171560c3b0e17c0175eea petit.string-utils-20141106-git petit.string-utils-test.asd petit.string-utils.asd -petri http://beta.quicklisp.org/archive/petri/2019-02-02/petri-20190202-git.tgz 139161 9de1c080844a2430c69b41b9be625c3c 14be4e87ea4efea0e254459ec1ca3c094c9fe038 petri-20190202-git petri.asd -pettomato-deque http://beta.quicklisp.org/archive/pettomato-deque/2012-01-07/pettomato-deque-20120107-git.tgz 5573 f4aebae99019f5ca7c82fec60540bbd9 7f132a9c5c15aac2d555bc1c19570973d32eb5c3 pettomato-deque-20120107-git pettomato-deque-tests.asd pettomato-deque.asd -pettomato-indexed-priority-queue http://beta.quicklisp.org/archive/pettomato-indexed-priority-queue/2012-09-09/pettomato-indexed-priority-queue-20120909-git.tgz 7555 f734b68ce8cdb911562cdd62eed1d5aa fdeebe7c9c560e4c559c18ba9ee833310685a1eb pettomato-indexed-priority-queue-20120909-git pettomato-indexed-priority-queue-tests.asd pettomato-indexed-priority-queue.asd -pg http://beta.quicklisp.org/archive/pg/2015-06-08/pg-20150608-git.tgz 48921 11a6ddac157a7443155158e255a2452b 6e5a808a1b08d0049450724574058280cf3a8a2d pg-20150608-git pg.asd -pgloader http://beta.quicklisp.org/archive/pgloader/2019-02-02/pgloader-v3.6.1.tgz 3677520 9cba0e3afa1706a20cfdeced7ad1fce2 ca692deb0d4adecad7d351beb8180c775f09b78b pgloader-v3.6.1 pgloader.asd -phoe-toolbox http://beta.quicklisp.org/archive/phoe-toolbox/2019-11-30/phoe-toolbox-20191130-git.tgz 9300 051096aa7c921ca6179ae76e7d85675c 2f7e572ede4b16fc572518980bed8d2b74cb9b4f phoe-toolbox-20191130-git phoe-toolbox.asd -physical-quantities http://beta.quicklisp.org/archive/physical-quantities/2018-07-11/physical-quantities-20180711-git.tgz 30191 3e8e842b0e68b2ca2d446bead7ca0a1d 3ff468dd80a6f49475c13eff113eb3ab7b87cb9e physical-quantities-20180711-git physical-quantities.asd -piggyback-parameters http://beta.quicklisp.org/archive/piggyback-parameters/2019-10-07/piggyback-parameters-20191007-git.tgz 6763 65d36af31df9beeec878cc4d7ce0ba85 50544fdcb667c6a092e2a48dabcc3c44a5f6fcf1 piggyback-parameters-20191007-git piggyback-parameters.asd -pileup http://beta.quicklisp.org/archive/pileup/2015-07-09/pileup-20150709-git.tgz 20217 230aeb8bbb0993c5fecd4ef47052623f 045fe18800b0e56283617fa5b032c483f38be280 pileup-20150709-git pileup.asd -pipes http://beta.quicklisp.org/archive/pipes/2015-09-23/pipes-20150923-git.tgz 5603 77717361af87e7a83d38e84d08ad29f5 e7ce78dc510136ebd0b8b6a7495fac662233a363 pipes-20150923-git pipes.asd -piping http://beta.quicklisp.org/archive/piping/2019-07-10/piping-20190710-git.tgz 8533 852246a0c773a047dfb023638198387a 0f0fd020438d640c211736f0e572d11e4388edeb piping-20190710-git piping.asd -pithy-xml http://beta.quicklisp.org/archive/pithy-xml/2010-10-06/pithy-xml-20101006-git.tgz 10188 5401547ac31ab9c502d3409a9200a0dc 9445d371b1e0801e3e75ff112f8ba551bb372276 pithy-xml-20101006-git pithy-xml.asd -pjlink http://beta.quicklisp.org/archive/pjlink/2019-10-07/pjlink-20191007-git.tgz 14963 6d48f93695a792dbc2fb5c702596642a 04bcc61e1d3cdd6f11dfae46759542e906168159 pjlink-20191007-git src/pjlink.asd -place-modifiers http://beta.quicklisp.org/archive/place-modifiers/2012-11-25/place-modifiers-2.1.tgz 10202 8c209e6ee7e376b20b447a4e75fb12e3 3a15cc3cd06e587cb81222057b99efa0a27a1545 place-modifiers-2.1 place-modifiers.asd -place-utils http://beta.quicklisp.org/archive/place-utils/2018-10-18/place-utils-0.2.tgz 14315 5462562949ab3a8b5a9f40e9e6d2a628 164c95f8afeab6e8ddf256f1f845108665035fa0 place-utils-0.2 place-utils.asd -plain-odbc http://beta.quicklisp.org/archive/plain-odbc/2019-11-30/plain-odbc-20191130-git.tgz 60040 cfa0da32a083a406344e6f6504d962de 9a7a0ce75ac9e1ef7c2fddc0705a1b2429196400 plain-odbc-20191130-git plain-odbc.asd -planks http://beta.quicklisp.org/archive/planks/2011-05-22/planks-20110522-git.tgz 13152 b0881e48b242ea36e95a815ba6118950 6fd7b423ace8306647696ae42d465683bec59e1a planks-20110522-git planks.asd -plexippus-xpath http://beta.quicklisp.org/archive/plexippus-xpath/2019-05-21/plexippus-xpath-20190521-git.tgz 56479 eb9a4c39a7c37aa0338c401713b3f944 6acb71007298138bb494e04abe39a79fff54af86 plexippus-xpath-20190521-git xpath.asd -plokami http://beta.quicklisp.org/archive/plokami/2019-07-10/plokami-20190710-git.tgz 20055 2ec548790adf34ae9d0ffa3b3ba2549c 5b5c0dc3f9bbe2570e54aa4400b221a20cef9232 plokami-20190710-git plokami.asd -pludeck http://beta.quicklisp.org/archive/pludeck/2018-08-31/pludeck-20180831-git.tgz 5125 7cc744ed744245026604347abf01a539 3bed71c98b172d330579aaa8833575f9f7b5b7f3 pludeck-20180831-git pludeck.asd -plump http://beta.quicklisp.org/archive/plump/2019-07-10/plump-20190710-git.tgz 50917 e3276779e368758274156c9477f0b22a a2d8f464c4303e047d5b1bb982311ab11e82f09d plump-20190710-git plump-dom.asd plump-lexer.asd plump-parser.asd plump.asd -plump-bundle http://beta.quicklisp.org/archive/plump-bundle/2019-07-10/plump-bundle-20190710-git.tgz 7705 a89ccc2557c1657fa080302d5c929a6d 7a4b27d045b483bfc99ecfd43e5084bc6b985e60 plump-bundle-20190710-git plump-bundle.asd -plump-sexp http://beta.quicklisp.org/archive/plump-sexp/2019-07-10/plump-sexp-20190710-git.tgz 6669 d5dd63dd63cff2095b5f38211f684fd4 0dcbf5533db0fa9212ba9169bdcb14513885ae45 plump-sexp-20190710-git plump-sexp.asd -plump-tex http://beta.quicklisp.org/archive/plump-tex/2019-07-10/plump-tex-20190710-git.tgz 6490 ecef24ab6111712b5d0da63cc5e86a92 7badffb575c1b39a1f25886990f9b9ec48b848fe plump-tex-20190710-git plump-tex-test.asd plump-tex.asd -png-read http://beta.quicklisp.org/archive/png-read/2017-08-30/png-read-20170830-git.tgz 8677 40354aa5f3f3321a4d42629c15c6f9f7 d36071bb47abcda177284afddd83cf518d579b19 png-read-20170830-git png-read.asd -pngload http://beta.quicklisp.org/archive/pngload/2019-10-07/pngload-20191007-git.tgz 94912 3f2e9dbc56cefbc480cac2faaa97b49a 0b79824eebdb1644283ab767b2387f9824b00ae9 pngload-20191007-git pngload.asd pngload.test.asd -pngload-fast http://beta.quicklisp.org/archive/pngload-fast/2019-10-07/pngload-fast-20191007-git.tgz 94919 8f9f1aaeabea83e8b3c75f348a123606 1009b43c9e4cd2428e00518e843dfebd1db771d0 pngload-fast-20191007-git pngload-fast.asd pngload-fast.test.asd -poler http://beta.quicklisp.org/archive/poler/2018-12-10/poler-20181210-git.tgz 6505 9f7588fcb283ff5c56bab084304fc4a3 fbf7235432d08b6d488bd1282ba19dddd9e0db36 poler-20181210-git poler-test.asd poler.asd -policy-cond http://beta.quicklisp.org/archive/policy-cond/2019-03-07/policy-cond-20190307-hg.tgz 6132 1773f5aa332484e6742adf38e9fd4b15 51f227d249080950afa1d16fa3fefaa4e0967fab policy-cond-20190307-hg policy-cond.asd -polisher http://beta.quicklisp.org/archive/polisher/2019-12-27/polisher-20191227-git.tgz 6538 b6d069250705e6a07378beeaab5eb002 c7e88975635c889520c274d44a6a2d2d6b8e72dc polisher-20191227-git polisher.asd polisher.test.asd -pooler http://beta.quicklisp.org/archive/pooler/2015-06-08/pooler-20150608-git.tgz 4985 75efc3d397c6962954ec3c37b0f45c5f b118bb296d55bcd7d783a4b52b293a970b46728c pooler-20150608-git pooler.asd -portable-threads http://beta.quicklisp.org/archive/portable-threads/2019-03-07/portable-threads-20190307-git.tgz 31127 f5f5baa0847cce4910b0394e4157797a 0c062c9c6213d2566b7ebbdf9b09a6cd1448b473 portable-threads-20190307-git portable-threads.asd -portableaserve http://beta.quicklisp.org/archive/portableaserve/2019-08-13/portableaserve-20190813-git.tgz 586259 4cd7af3fbd45693800a823aff55fa442 dfd074e79bfd1d98385f2066a82dacf8b3f98bea portableaserve-20190813-git acl-compat/acl-compat.asd aserve/aserve.asd aserve/htmlgen/htmlgen.asd aserve/webactions/webactions.asd -positional-lambda http://beta.quicklisp.org/archive/positional-lambda/2012-10-13/positional-lambda-2.0.tgz 7250 1099a5457455b7c570132556073aa21f 7433ee7798c5bdbd6c2edd9869f5173d93178727 positional-lambda-2.0 positional-lambda.asd -postmodern http://beta.quicklisp.org/archive/postmodern/2019-12-27/postmodern-20191227-git.tgz 313862 67b909de432e6414e7832eed18f9ad18 6e54d9d2661bc600ff83abe2ea4ca8023bbbd6b5 postmodern-20191227-git cl-postgres.asd postmodern.asd s-sql.asd simple-date.asd -postmodernity http://beta.quicklisp.org/archive/postmodernity/2017-01-24/postmodernity-20170124-git.tgz 3251 9109aace9c9a906732eb0259a15274e0 380ce87aaceedd6aa00a2d94da9b4dfaa16ddd6a postmodernity-20170124-git postmodernity.asd -postoffice http://beta.quicklisp.org/archive/postoffice/2012-09-09/postoffice-20120909-git.tgz 36931 d09dd023aac099aba49bd3a485179a26 0e6aa7efb53da555f44a8b7caefff3dce1e7eaf3 postoffice-20120909-git postoffice.asd -pounds http://beta.quicklisp.org/archive/pounds/2016-02-08/pounds-20160208-git.tgz 22888 7690a4a5aaca79a60bbb5c49ac9ef1b2 b60ec9318d7017a982e95eae42a2a5c6844da2b7 pounds-20160208-git pounds.asd -pp-toml http://beta.quicklisp.org/archive/pp-toml/2018-02-28/pp-toml-20180228-git.tgz 10851 28f316d8f8309b0a56372e49dc0e7022 ea6b34bacc0556f7a67416f22b6bb9751461d16c pp-toml-20180228-git pp-toml-tests.asd pp-toml.asd -ppath http://beta.quicklisp.org/archive/ppath/2018-07-11/ppath-20180711-git.tgz 26911 bcfdda2ff1161721b98c2c1233434429 b93079de943fb4f9cf8ef0a3c2517ce4292b8cdc ppath-20180711-git ppath-test.asd ppath.asd -practical-cl http://beta.quicklisp.org/archive/practical-cl/2018-04-30/practical-cl-20180430-git.tgz 241556 6d0d20024a11897b190d9680fb067d79 462ef8018d44d307ae58197ff03d049ad9a0eff1 practical-cl-20180430-git practicals/Chapter03/pcl-simple-database.asd practicals/Chapter08/pcl-macro-utilities.asd practicals/Chapter09/pcl-test-framework.asd practicals/Chapter15/pcl-pathnames.asd practicals/Chapter23/pcl-spam.asd practicals/Chapter24/pcl-binary-data.asd practicals/Chapter25/pcl-id3v2.asd practicals/Chapter26/pcl-url-function.asd practicals/Chapter27/pcl-mp3-database.asd practicals/Chapter28/pcl-shoutcast.asd practicals/Chapter29/pcl-mp3-browser.asd practicals/Chapter31/pcl-html.asd practicals/practical-cl.asd -prbs http://beta.quicklisp.org/archive/prbs/2018-02-28/prbs-20180228-git.tgz 16327 6baec1bb244961320d1a034a30fdb89a c09a9e8fe05cea4dcc3b4573b33c5f517e4c566b prbs-20180228-git doc/prbs-docs.asd prbs.asd -prepl http://beta.quicklisp.org/archive/prepl/2018-10-18/prepl-20181018-git.tgz 24716 1da918018645e9ea8c291d66f55b9907 47ca4168a7d798f8369c037012bcc88befa094df prepl-20181018-git prepl.asd -pretty-function http://beta.quicklisp.org/archive/pretty-function/2013-06-15/pretty-function-20130615-git.tgz 6248 7b6ad93307bc8c8ec585a8199e5e9cb6 3eaf9baa4d31922b3adf8b04005393e7d054b4aa pretty-function-20130615-git pretty-function.asd -print-html http://beta.quicklisp.org/archive/print-html/2018-10-18/print-html-20181018-git.tgz 2917 c9f8962deb792e5dd82c3971bfdf3daa ec23887721f684f8cd6170676d7141df9c3b381b print-html-20181018-git print-html.asd -print-licenses http://beta.quicklisp.org/archive/print-licenses/2018-10-18/print-licenses-20181018-git.tgz 3079 fc2c8770ec8bc28f154f31fc247d47cd 8f76b7b3c94c29d916a1b31e07cc90f70c4a3737 print-licenses-20181018-git print-licenses.asd -printv http://beta.quicklisp.org/archive/printv/2014-07-14/printv-20140714-git.tgz 16113 049108fb64993d704fba006a1b7ce300 36b5b3188f22a39dafaa030219ccaa21c3b35e41 printv-20140714-git printv.asd -priority-queue http://beta.quicklisp.org/archive/priority-queue/2015-07-09/priority-queue-20150709-git.tgz 2535 5196d0b355b72215228de49eeb0df745 65644f0e3eb8bd23af1ffe64f856bbd9c4d1ac15 priority-queue-20150709-git priority-queue.asd -proc-parse http://beta.quicklisp.org/archive/proc-parse/2019-08-13/proc-parse-20190813-git.tgz 8695 99bdce79943071267c6a877d8de246c5 18fff39d2a228aeb60547154bb09745d2a8769e1 proc-parse-20190813-git proc-parse-test.asd proc-parse.asd -projectured http://beta.quicklisp.org/archive/projectured/2017-12-27/projectured-quicklisp-c3a60e76-git.tgz 3573436 501022101c0211a267b608c4615fdce0 3e002e0bc323ffa8a6495bdd42883027516f69c6 projectured-quicklisp-c3a60e76-git projectured.document.asd projectured.editor.asd projectured.executable.asd projectured.projection.asd projectured.sdl.asd projectured.sdl.test.asd projectured.swank.asd projectured.test.asd -prometheus.cl http://beta.quicklisp.org/archive/prometheus.cl/2019-10-07/prometheus.cl-20191007-git.tgz 26087 29af5bcaefc2787441403352a99f560c deba5912ebde30c75ba9bf35a0d8a3f808a3bda5 prometheus.cl-20191007-git prometheus.asd prometheus.collectors.process.asd prometheus.collectors.process.test.asd prometheus.collectors.sbcl.asd prometheus.collectors.sbcl.test.asd prometheus.examples.asd prometheus.exposers.hunchentoot.asd prometheus.exposers.hunchentoot.test.asd prometheus.formats.text.asd prometheus.formats.text.test.asd prometheus.pushgateway.asd prometheus.pushgateway.test.asd prometheus.test.all.asd prometheus.test.asd prometheus.test.support.asd -protest http://beta.quicklisp.org/archive/protest/2019-05-21/protest-20190521-git.tgz 68083 5ec1333564b4e27e54ea26efe2ed24f5 79619cbaac2f4dd3001536f5a32568718ad8b86e protest-20190521-git protest.asd -protobuf http://beta.quicklisp.org/archive/protobuf/2018-12-10/protobuf-20181210-git.tgz 64058 cdb5d92efc02b32f45febe83a1406490 db202763305822fc9736c145bcf869501b942520 protobuf-20181210-git protobuf.asd varint/varint-test.asd varint/varint.asd -prove http://beta.quicklisp.org/archive/prove/2017-11-30/prove-20171130-git.tgz 878875 630df4367537f799570be40242f8ed52 67eba1cb93bce0eb45d6ff02396eec04a3f439a6 prove-20171130-git cl-test-more.asd prove-asdf.asd prove-test.asd prove.asd -pseudonyms http://beta.quicklisp.org/archive/pseudonyms/2016-08-25/pseudonyms-20160825-git.tgz 4072 bbbea2ee21987734173b3ccf9db62015 3e255b706b3ae8d812a1d245eebfbae97d3c0a1e pseudonyms-20160825-git pseudonyms.asd -psgraph http://beta.quicklisp.org/archive/psgraph/2010-10-06/psgraph-1.2.tgz 8448 df735b2f6c45e14ea18c16650ad8e90d 1cb75fe9886dd39bc7dbdd92c5e4a0b7e229218a psgraph-1.2 psgraph.asd -psychiq http://beta.quicklisp.org/archive/psychiq/2018-02-28/psychiq-20180228-git.tgz 17573 d07eb5632c0c15ddeff1fde9ae860fa8 40d40d7d1c06fc1c5add607cf4d12af0e89e54a6 psychiq-20180228-git psychiq-test.asd psychiq.asd -ptester http://beta.quicklisp.org/archive/ptester/2016-09-29/ptester-20160929-git.tgz 12713 938a4366b6608ae5c4a0be9da11a61d4 c32afa4c3f143967eddf4ace14f3e15429610f7f ptester-20160929-git ptester.asd -puri http://beta.quicklisp.org/archive/puri/2018-02-28/puri-20180228-git.tgz 30002 0c43ad5d862ed0d18ef84d8e2a42f67f 79053c86ebabe7ec8aab7ef175e13c9f3a9f0960 puri-20180228-git puri.asd -purl http://beta.quicklisp.org/archive/purl/2016-09-29/purl-20160929-git.tgz 32297 ab5d05fcdd2b09d143ebc4e332b4058b 7ce1d37badf30b8386747f26d330b0432d2be4a1 purl-20160929-git purl.asd -py-configparser http://beta.quicklisp.org/archive/py-configparser/2017-08-30/py-configparser-20170830-svn.tgz 8452 b6a9fc2a9c70760d6683cafe656f9e90 256cf7e56d08aa7021f8c0739f0f6a2912780c1c py-configparser-20170830-svn py-configparser.asd -py4cl http://beta.quicklisp.org/archive/py4cl/2019-11-30/py4cl-20191130-git.tgz 615487 9d06ef58a7c9dc8ea406f57cdc07fb57 e2d470b9e7b80f447aa298550d99e68da16bed8d py4cl-20191130-git py4cl.asd -pythonic-string-reader http://beta.quicklisp.org/archive/pythonic-string-reader/2018-07-11/pythonic-string-reader-20180711-git.tgz 3594 8156636895b1148fad6e7bcedeb6b556 084f20b11e986f7f186f5f8744ce0e77c2065129 pythonic-string-reader-20180711-git pythonic-string-reader.asd -pzmq http://beta.quicklisp.org/archive/pzmq/2019-07-10/pzmq-20190710-git.tgz 20467 89e152691e331d660cd8861f8fee643d d617f4420e5c3f81c388786fbc4253cf10a9c8cd pzmq-20190710-git pzmq.asd -qbase64 http://beta.quicklisp.org/archive/qbase64/2019-11-30/qbase64-20191130-git.tgz 15721 32b03aa1b3c5ca4c49f586b4028cae5e 310210d449dd016d0b141a2f36ee68fa4c3d3979 qbase64-20191130-git qbase64.asd -qbook http://beta.quicklisp.org/archive/qbook/2013-03-12/qbook-20130312-darcs.tgz 12971 6e1cc023c21340d4884da27ce1a1df39 872d11a845287195e88e3fd1d3045a0c471e5698 qbook-20130312-darcs qbook.asd -ql-checkout http://beta.quicklisp.org/archive/ql-checkout/2019-05-21/ql-checkout-20190521-git.tgz 4290 e2b0b29b3829a67a6f88aab932b68e5f c3cf51de9f3c2a6155d838e5645363be4c596dd4 ql-checkout-20190521-git ql-checkout.asd -qlot http://beta.quicklisp.org/archive/qlot/2019-12-27/qlot-20191227-git.tgz 32386 20e2f6505eae2ccf98fc80f8624828e5 dbf0702831311a6ccb28975e1b64bba820e9e06b qlot-20191227-git qlot.asd -qmynd http://beta.quicklisp.org/archive/qmynd/2019-07-10/qmynd-20190710-git.tgz 48872 c4a230ca44c5c037664979dfd48985a9 2a43db7117073bc830ad419da96a5e60cb1d2a89 qmynd-20190710-git qmynd.asd tests/qmynd-test.asd -qt-libs http://beta.quicklisp.org/archive/qt-libs/2019-11-30/qt-libs-20191130-git.tgz 52709 8f92957d0b15b9a594924e3900c83c84 5dd81781a20ddf0ec0420308a2a8739def91ab62 qt-libs-20191130-git qt-lib-generator.asd qt-libs.asd systems/commonqt.asd systems/phonon.asd systems/qimageblitz.asd systems/qsci.asd systems/qt3support.asd systems/qtcore.asd systems/qtdbus.asd systems/qtdeclarative.asd systems/qtgui.asd systems/qthelp.asd systems/qtnetwork.asd systems/qtopengl.asd systems/qtscript.asd systems/qtsql.asd systems/qtsvg.asd systems/qttest.asd systems/qtuitools.asd systems/qtwebkit.asd systems/qtxml.asd systems/qtxmlpatterns.asd systems/qwt.asd systems/smokebase.asd -qtools http://beta.quicklisp.org/archive/qtools/2019-11-30/qtools-20191130-git.tgz 196923 450ea3932742e538d88583e51183d4f3 3bfae2c01582df632f6c3698af7f7ceeae27c0bf qtools-20191130-git examples/evaluator/qtools-evaluator.asd examples/game/qtools-game.asd examples/helloworld/qtools-helloworld.asd examples/melody/qtools-melody.asd examples/opengl/qtools-opengl.asd examples/titter/qtools-titter.asd q+.asd qtools.asd -qtools-ui http://beta.quicklisp.org/archive/qtools-ui/2019-07-10/qtools-ui-20190710-git.tgz 65416 e01a0e6a18e80b5fdd7ce862021f39c7 051d22af68720a01751d34a65caf6f12b5a30bf8 qtools-ui-20190710-git qtools-ui-base.asd qtools-ui-bytearray.asd qtools-ui-cell.asd qtools-ui-color-history.asd qtools-ui-color-picker.asd qtools-ui-color-sliders.asd qtools-ui-color-triangle.asd qtools-ui-compass.asd qtools-ui-container.asd qtools-ui-debugger.asd qtools-ui-dialog.asd qtools-ui-dictionary.asd qtools-ui-drag-and-drop.asd qtools-ui-executable.asd qtools-ui-fixed-qtextedit.asd qtools-ui-flow-layout.asd qtools-ui-helpers.asd qtools-ui-imagetools.asd qtools-ui-keychord-editor.asd qtools-ui-layout.asd qtools-ui-listing.asd qtools-ui-notification.asd qtools-ui-options.asd qtools-ui-panels.asd qtools-ui-placeholder-text-edit.asd qtools-ui-plot.asd qtools-ui-progress-bar.asd qtools-ui-repl.asd qtools-ui-slider.asd qtools-ui-spellchecked-text-edit.asd qtools-ui-splitter.asd qtools-ui-svgtools.asd qtools-ui.asd -quadtree http://beta.quicklisp.org/archive/quadtree/2015-07-09/quadtree-20150709-git.tgz 3869 50ff5dc28ea35f3073946739537f039d 7961bb58a4a4e50008d5398fbb1ae71380e36248 quadtree-20150709-git quadtree-test.asd quadtree.asd -quantile-estimator.cl http://beta.quicklisp.org/archive/quantile-estimator.cl/2016-08-25/quantile-estimator.cl-20160825-git.tgz 3510 3a28f05e4466c714f712d31cc190992c 30796c8194de9b436e022a35aa5973db986fbd05 quantile-estimator.cl-20160825-git quantile-estimator.asd quantile-estimator.test.asd -quasiquote-2.0 http://beta.quicklisp.org/archive/quasiquote-2.0/2015-05-05/quasiquote-2.0-20150505-git.tgz 8956 7c557e0c10cf7608afa5a20e4a83c778 5f61d74c96a9a863f38ab56c08b5287187bd9ef7 quasiquote-2.0-20150505-git quasiquote-2.0.asd -queen.lisp http://beta.quicklisp.org/archive/queen.lisp/2016-09-29/queen.lisp-20160929-git.tgz 22553 2e7c68441e99d826cfb2c7cb9aa83766 f7988f650dfc560c49226e848de326b9d69da068 queen.lisp-20160929-git queen.asd -query-fs http://beta.quicklisp.org/archive/query-fs/2019-05-21/query-fs-20190521-git.tgz 270327 1108c91b69007c6ab35b42d70d4dd7a2 97649ef86497ee0f029b8e5522769937f86b75fe query-fs-20190521-git query-fs.asd -queues http://beta.quicklisp.org/archive/queues/2017-01-24/queues-20170124-git.tgz 8748 9b291db09b7385e12515697f1f918e27 3835c55c8a7010b35d4b2ef2e9ce54845ca564bc queues-20170124-git queues.asd queues.priority-cqueue.asd queues.priority-queue.asd queues.simple-cqueue.asd queues.simple-queue.asd -quickapp http://beta.quicklisp.org/archive/quickapp/2016-08-25/quickapp-20160825-git.tgz 7116 f7c00d1217d7b58f6f1f023668580891 2f4eff6c45eca224463eb0a32eacfd5e34513f0f quickapp-20160825-git quickapp.asd -quicklisp-slime-helper http://beta.quicklisp.org/archive/quicklisp-slime-helper/2015-07-09/quicklisp-slime-helper-20150709-git.tgz 2211 08a86772cfee1a9dc7b1d4a9bb7d371e 6abe815efe3a1b03cb485d4d95329188b1100fe5 quicklisp-slime-helper-20150709-git quicklisp-slime-helper.asd -quickproject http://beta.quicklisp.org/archive/quickproject/2019-12-27/quickproject-1.4.1.tgz 6777 1d582d9dc066e0904f716166e448ccb7 eefaabe524fb4113b7b785f623899e417bed7d72 quickproject-1.4.1 quickproject.asd -quicksearch http://beta.quicklisp.org/archive/quicksearch/2017-10-19/quicksearch-20171019-git.tgz 13482 b64e3f756d4edafe270499058b087c26 8984719946dc05f5ad03063265e1fbc1e9986516 quicksearch-20171019-git quicksearch.asd -quickutil http://beta.quicklisp.org/archive/quickutil/2019-07-10/quickutil-20190710-git.tgz 1508394 fe9b44ce90e259c90c346f4005c1d9da 34629c942ff3f21b3746c0e6573077538bc0884f quickutil-20190710-git quickutil-client/quickutil-client-management.asd quickutil-client/quickutil-client.asd quickutil-client/quickutil.asd quickutil-server/quickutil-server.asd quickutil-utilities/quickutil-utilities-test.asd quickutil-utilities/quickutil-utilities.asd -quilc http://beta.quicklisp.org/archive/quilc/2019-12-27/quilc-v1.15.2.tgz 1184464 0ed9400a58a1c6b489a16f0269977311 7df7aa30ceb984a9d40807fb9e90d4271b327f78 quilc-v1.15.2 boondoggle/boondoggle-tests.asd boondoggle/boondoggle.asd cl-quil-benchmarking.asd cl-quil-tests.asd cl-quil.asd quilc-tests.asd quilc.asd -quri http://beta.quicklisp.org/archive/quri/2019-11-30/quri-20191130-git.tgz 69725 4a3e8d2ebe459ea731738650c2c5bf56 58c4d571f700fceb9a67ea6dc52ae739a26aaacd quri-20191130-git quri-test.asd quri.asd -quux-hunchentoot http://beta.quicklisp.org/archive/quux-hunchentoot/2018-04-30/quux-hunchentoot-20180430-git.tgz 4627 e767f34d08e5da1a98cf99ce6cacc99a 852c396d028964a975034ecf372454edb86a7f7d quux-hunchentoot-20180430-git quux-hunchentoot.asd -quux-time http://beta.quicklisp.org/archive/quux-time/2015-04-07/quux-time-20150407-git.tgz 34282 f89bd972e19dd2fd5abae2a9e8b143e2 51b24561e194e32110bbb5a6e6be5d98c6daac8c quux-time-20150407-git quux-time.asd -qvm http://beta.quicklisp.org/archive/qvm/2019-12-27/qvm-v1.15.2.tgz 355327 3dba4c207c58efd91b2d4662f1b7500a d24bb7ab705921df3b81f9f15c5f93addeac9fab qvm-v1.15.2 qvm-app-ng-tests.asd qvm-app-ng.asd qvm-app-tests.asd qvm-app.asd qvm-benchmarks.asd qvm-examples.asd qvm-tests.asd qvm.asd -racer http://beta.quicklisp.org/archive/racer/2019-07-10/racer-20190710-git.tgz 28462787 ecc163e4033836e93aaeb3990052fe3a f27637cb6f310019ad45377016535f15b1cbffdf racer-20190710-git clients/lracer/lracer.asd racer.asd -random http://beta.quicklisp.org/archive/random/2019-10-07/random-20191007-git.tgz 4620 13a609118dd74e217fafd018875b8366 9c3214946a660c5edc558c2f592ff70994c3df65 random-20191007-git acm-random-test.asd acm-random.asd random-test.asd random.asd -random-access-lists http://beta.quicklisp.org/archive/random-access-lists/2012-02-08/random-access-lists-20120208-git.tgz 4903 36e5b00c2556ffda4cc2d6297471d053 7f2fe5a0f6497a98b538bfed7fa0dea7c3c3d8cc random-access-lists-20120208-git random-access-lists.asd -random-sample http://beta.quicklisp.org/archive/random-sample/2018-07-11/random-sample-20180711-git.tgz 3416 c849823d61c7dc3c8ef9d4cea595391c 177806586fbe0d70144af9ee41144dc63ee687cf random-sample-20180711-git random-sample.asd -random-state http://beta.quicklisp.org/archive/random-state/2019-07-10/random-state-20190710-git.tgz 10759 c958cd6015c6ed0b3cd44283ed68dc08 cadf3310ad0f61167972ccb5b5ce71020a278e5d random-state-20190710-git random-state-viewer.asd random-state.asd -rate-monotonic http://beta.quicklisp.org/archive/rate-monotonic/2017-01-24/rate-monotonic-20170124-git.tgz 16931 40d28ad246c2fa1d84a1fe68fac0c74b c6198a314738cd44a2b9fdcf62037591b6d86d87 rate-monotonic-20170124-git rate-monotonic.asd rate-monotonic.examples.asd -ratify http://beta.quicklisp.org/archive/ratify/2019-10-07/ratify-20191007-git.tgz 30103 bb3371f343c1cfd75b6cc4ea6f2e7cc1 c4e33d368e883efdb66356afd4cffc0c6593bedf ratify-20191007-git ratify.asd -rcl http://beta.quicklisp.org/archive/rcl/2016-08-25/rcl-20160825-http.tgz 32780 c270ce4a4b2dcc12ac7c793c26a583d1 5e7494f2d3ddd826afc6f3211228e8acadecf123 rcl-20160825-http rcl.asd -re http://beta.quicklisp.org/archive/re/2019-10-07/re-20191007-git.tgz 8683 2dd52d733bdbcd7df45350dc0b9b143e babd0e0648cbeeb36f9d956f5fee45af694b9813 re-20191007-git re.asd -read-csv http://beta.quicklisp.org/archive/read-csv/2018-10-18/read-csv-20181018-git.tgz 4924 ef21abc13722ff1ede9f72951bd725af ac27005e51ff658b0b28665fefc260b812032802 read-csv-20181018-git read-csv.asd -read-number http://beta.quicklisp.org/archive/read-number/2019-05-21/read-number-20190521-git.tgz 7986 928e06ed46fb67f216f7299c8c1dfdf5 962d8a2d2f14748ab3e8d28cbd4131c2bcfdaf1d read-number-20190521-git read-number.asd -reader http://beta.quicklisp.org/archive/reader/2019-12-27/reader-20191227-git.tgz 5859 a1317a75a040760375d7ba7b2ab30a90 7335959482977c87f70843a4bd6e65a657299d32 reader-20191227-git reader-test.asd reader.asd -reader-interception http://beta.quicklisp.org/archive/reader-interception/2015-06-08/reader-interception-20150608-git.tgz 5162 8bb17a9cb708c842cb9cac112bd2d7b7 b8319c2a038be121cf1cc5ac493e876880d52ea2 reader-interception-20150608-git reader-interception-test.asd reader-interception.asd -rectangle-packing http://beta.quicklisp.org/archive/rectangle-packing/2013-06-15/rectangle-packing-20130615-git.tgz 16507 98a4a3e3a1daf65b56475e1f850ca0a7 08ed9778cc20bb058a54e1db28fbbdeb75c929ba rectangle-packing-20130615-git rectangle-packing.asd -recur http://beta.quicklisp.org/archive/recur/2019-03-07/recur-20190307-hg.tgz 1485 c29fa990323309c17e98cc7eadd2b31d edc298a910d5c737937aed72f66f7d484a55485a recur-20190307-hg recur.asd -recursive-regex http://beta.quicklisp.org/archive/recursive-regex/2012-04-07/recursive-regex-20120407-git.tgz 11763 fefa07fe68a4a99338900a7be78129b3 4a09f21c6e6daf510dc1570431ed4ddd40716815 recursive-regex-20120407-git recursive-regex.asd -recursive-restart http://beta.quicklisp.org/archive/recursive-restart/2016-10-31/recursive-restart-20161031-git.tgz 3054 39d5c3ca334229dd5f5111a6f993d8a0 cf91a8a01feb4efbf8ce3d7cd74e34b224a90faf recursive-restart-20161031-git recursive-restart.asd -redirect-stream http://beta.quicklisp.org/archive/redirect-stream/2019-07-10/redirect-stream-20190710-git.tgz 3914 3dbcdaad096f9ba1e308a351fce12744 14dcc7ff3bd776e2b391fa7f74a17b089b975c17 redirect-stream-20190710-git redirect-stream.asd -regex http://beta.quicklisp.org/archive/regex/2012-09-09/regex-20120909-git.tgz 30204 545d10011ea7d33cea0dfcb238acf94b 9ab918df7063e4aac22c3cb0a4776529747cf080 regex-20120909-git regex.asd -regular-type-expression http://beta.quicklisp.org/archive/regular-type-expression/2019-07-10/regular-type-expression-export-to-quicklisp-6a781b1f-git.tgz 2650721 c8f2228509c4b6f33df8a528759963a0 1eda28066cf0b186c1dd282376169b833a1e258b regular-type-expression-export-to-quicklisp-6a781b1f-git 2d-array/2d-array-test.asd 2d-array/2d-array.asd adjuvant/adjuvant-test.asd adjuvant/adjuvant.asd cl-robdd/cl-robdd-analysis-test.asd cl-robdd/cl-robdd-analysis.asd cl-robdd/cl-robdd-test.asd cl-robdd/cl-robdd.asd dispatch/dispatch-test.asd dispatch/dispatch.asd lisp-types/lisp-types-analysis.asd lisp-types/lisp-types-test.asd lisp-types/lisp-types.asd ndfa/ndfa-test.asd ndfa/ndfa.asd research.asd rte-regexp/rte-regexp-test.asd rte-regexp/rte-regexp.asd rte/rte-test.asd rte/rte.asd scrutiny/scrutiny-test.asd scrutiny/scrutiny.asd -remote-js http://beta.quicklisp.org/archive/remote-js/2019-07-10/remote-js-20190710-git.tgz 4434 fcc3b2e4201c1ad11ec8575a98bce39e 0a623b75ed970fe8e5f9d5572c4bf1bccbcf3ec5 remote-js-20190710-git remote-js-test.asd remote-js.asd -repl-utilities http://beta.quicklisp.org/archive/repl-utilities/2015-06-08/repl-utilities-20150608-git.tgz 11278 2299800cecc045af21fd3ac692138972 7a3098268b3a68781d537beba29d8cea39b56c9c repl-utilities-20150608-git repl-utilities.asd -replic http://beta.quicklisp.org/archive/replic/2019-11-30/replic-20191130-git.tgz 18002 da5c97326b1ccf7fce0704d2d29093f7 a8a44bea8976745fb2903a1e6deaf933495fdd41 replic-20191130-git replic-test.asd replic.asd -restas http://beta.quicklisp.org/archive/restas/2019-10-08/restas-20191008-git.tgz 182787 ceec9a0482460e2ad32446d43623480b cec4ae81730d0f741cdf3a436750a564de2c9d31 restas-20191008-git docs/restas-doc.asd restas.asd -restas-directory-publisher http://beta.quicklisp.org/archive/restas-directory-publisher/2013-01-28/restas-directory-publisher-20130128-git.tgz 13313 ac714dd7b907eebaa428fc411fce7434 112f0d8f6aa05b4e4a3fbae8131c1dd20f05a1cf restas-directory-publisher-20130128-git restas-directory-publisher.asd -restas.file-publisher http://beta.quicklisp.org/archive/restas.file-publisher/2012-01-07/restas.file-publisher-20120107-git.tgz 1176 74b3636315653b08c83747b8a45796d5 48bd0eb451bc218675ba47a64240d261a8cd5d4f restas.file-publisher-20120107-git restas.file-publisher.asd -restful http://beta.quicklisp.org/archive/restful/2015-06-08/restful-20150608-git.tgz 12311 fb8e34eba9a82fcd8351eb16dd908176 aebeed541ff77427483632265e4f0dda44c62669 restful-20150608-git restful-test.asd restful.asd -restricted-functions http://beta.quicklisp.org/archive/restricted-functions/2019-05-21/restricted-functions-20190521-git.tgz 6700 0ae3b25b8fa92ea9d625cae324ec445f 7e47bc6d54ff68ec0d0e65f34c635a3b6f9d9d10 restricted-functions-20190521-git code/restricted-functions.asd -retrospectiff http://beta.quicklisp.org/archive/retrospectiff/2017-10-19/retrospectiff-20171019-git.tgz 1460413 44c765984cd9dd0ecbb1bec8c78a3301 c9dce8ca0e8f0b738508d592b3c73d75e7ee4558 retrospectiff-20171019-git retrospectiff.asd -reversi http://beta.quicklisp.org/archive/reversi/2015-09-23/reversi-20150923-git.tgz 99958 b67728e66d479acb1a77983793092508 d6e3723c7a48943f49cff79f129812c76304da66 reversi-20150923-git reversi.asd -rfc2109 http://beta.quicklisp.org/archive/rfc2109/2015-12-18/rfc2109-20151218-darcs.tgz 29102 ca039ac430baaed87f08a1a01e4cfe91 8cfa85913f22053a81c691d8eb8309aa6e9eeeb6 rfc2109-20151218-darcs rfc2109.asd -rfc2388 http://beta.quicklisp.org/archive/rfc2388/2018-08-31/rfc2388-20180831-git.tgz 12522 f57e3c588e5e08210516260e67d69226 b9fce4ee84e60426fc9ef11f1847235b13dd256e rfc2388-20180831-git rfc2388.asd -rfc2388-binary http://beta.quicklisp.org/archive/rfc2388-binary/2017-01-24/rfc2388-binary-20170124-darcs.tgz 98374 0f0e4796ce5b4c0d30aee6f87ecf13d5 4ea6b34d653445314332dce88e4792b8332004f0 rfc2388-binary-20170124-darcs rfc2388-binary.asd -rfc3339-timestamp http://beta.quicklisp.org/archive/rfc3339-timestamp/2015-06-08/rfc3339-timestamp-20150608-git.tgz 5146 91a8159c603749a20e58847d0e4e78b2 57056b5fc5efb1d046f18e23eebf52d3b85fc1f0 rfc3339-timestamp-20150608-git rfc3339-timestamp-test.asd rfc3339-timestamp.asd -rlc http://beta.quicklisp.org/archive/rlc/2015-09-23/rlc-20150923-git.tgz 3997 b26fd533287f1033a7a2885a780c2318 e9d56b4078c5672498325308ae2898ab9dd9b797 rlc-20150923-git rlc.asd -roan http://beta.quicklisp.org/archive/roan/2019-11-30/roan-20191130-git.tgz 1135925 83b94f712f002f551ea85247bc11c71f b4f7339ccb26e26b3bea9bbc05634933131b2772 roan-20191130-git roan.asd -rock http://beta.quicklisp.org/archive/rock/2015-06-08/rock-20150608-git.tgz 9855 e54b64ba4d201d559355eb6bdb8e9d34 fcbcdd37d9cf8de9ae4c8b392ab7de632f58bdd9 rock-20150608-git rock-test.asd rock-web.asd rock.asd -romreader http://beta.quicklisp.org/archive/romreader/2014-07-13/romreader-20140713-git.tgz 6533 1e7c5f085d2495bd7a131b479b85ca8b 4133137ffba648f72739f0faa56b79b8bb48ec3a romreader-20140713-git romreader.asd -rove http://beta.quicklisp.org/archive/rove/2019-10-07/rove-20191007-git.tgz 14893 7ce5d3b0b423f8b68665bbcc51cf18a1 543f9a7bbc581ed2403309a944ee3b3fc28a2e1d rove-20191007-git rove.asd -rpc4cl http://beta.quicklisp.org/archive/rpc4cl/2015-06-08/rpc4cl-20150608-git.tgz 13071 75c4f8ed74f2688decbc26eb3c5094c8 a56e162d114af1ee168b08db47fe208db5fc7603 rpc4cl-20150608-git rpc4cl-test.asd rpc4cl.asd -rpcq http://beta.quicklisp.org/archive/rpcq/2019-12-27/rpcq-v3.0.0.tgz 79254 7e7cd7ebfe29c600984b967ad255fdba 1e59f7652c2a6edf42e087784c3577745dce910c rpcq-v3.0.0 rpcq-tests.asd rpcq.asd -rpm http://beta.quicklisp.org/archive/rpm/2016-04-21/rpm-20160421-git.tgz 4835 3c60f17576cb2c22554fff9b0eec2796 15eb5b24e92715d7e25605acd314702178122486 rpm-20160421-git rpm.asd -rt http://beta.quicklisp.org/archive/rt/2010-10-06/rt-20101006-git.tgz 10676 94a56c473399572ca835ac91c77c04e5 80643f045a1ff7313d55db64a3f6787236f68eff rt-20101006-git rt.asd -rt-events http://beta.quicklisp.org/archive/rt-events/2016-03-18/rt-events-20160318-git.tgz 5518 c9c0de2cafffd8319bc6f8a9ee9c4908 86aabf4057d784d88d938890ca0273ff1dba31f6 rt-events-20160318-git rt-events.asd rt-events.examples.asd -rtg-math http://beta.quicklisp.org/archive/rtg-math/2019-10-07/rtg-math-release-quicklisp-29fc5b3d-git.tgz 94423 fefa73c6923964666ecc8a8c382df718 2ce1482195edd95a831dd09c37f959277cb1a2e5 rtg-math-release-quicklisp-29fc5b3d-git rtg-math.asd rtg-math.vari.asd -rucksack http://beta.quicklisp.org/archive/rucksack/2015-06-08/rucksack-20150608-git.tgz 111832 e968c9e90632cbba892dae1e2833efe3 3e3ec1762970a3ad7df8d87afdae2bd80ab27af0 rucksack-20150608-git rucksack.asd tests/rucksack-test.asd -rutils http://beta.quicklisp.org/archive/rutils/2019-11-30/rutils-20191130-git.tgz 170325 11551d0709dbeeee44c4aa377e6471f2 3ce11df6da71853198327e4a0c524d56f8bdea54 rutils-20191130-git rutils-test.asd rutils.asd rutilsx.asd -ryeboy http://beta.quicklisp.org/archive/ryeboy/2015-03-02/ryeboy-20150302-git.tgz 9381 509436a25df82c2408d68db308650957 49bf72d638ae2a5485294e753cae73eadc9a1323 ryeboy-20150302-git ryeboy.asd -s-base64 http://beta.quicklisp.org/archive/s-base64/2013-01-28/s-base64-20130128-git.tgz 7033 9c4220053ea4b18fca7a49f29aae0ee1 70c7fc4ed0762db40bc6e0e71f36f358a2c6cb9a s-base64-20130128-git s-base64.asd -s-dot2 http://beta.quicklisp.org/archive/s-dot2/2018-10-18/s-dot2-20181018-git.tgz 6015 2f0d0948c7ab66c0fb75a761f113b9e9 bb3d07b3bc6c9803b97c65aa3dbc1f69cc187299 s-dot2-20181018-git s-dot2.asd -s-http-client http://beta.quicklisp.org/archive/s-http-client/2015-10-31/s-http-client-20151031-git.tgz 10204 be5c11bdc2c80fcc100230c352476d92 3ce9ade130aaf5b304573d6c73c8f47706030341 s-http-client-20151031-git s-http-client.asd -s-http-server http://beta.quicklisp.org/archive/s-http-server/2013-01-28/s-http-server-20130128-git.tgz 25877 c394b2543bbc48895794fe332adba23d f3ac20bd1203ab639ae397746c9904c722a63f88 s-http-server-20130128-git s-http-server.asd -s-protobuf http://beta.quicklisp.org/archive/s-protobuf/2015-12-18/s-protobuf-20151218-git.tgz 22278 99af6c044952679ad08513f945c59c4f 2835943d57cac223243d9638260fbcc252321481 s-protobuf-20151218-git src/s-protobuf.asd -s-sysdeps http://beta.quicklisp.org/archive/s-sysdeps/2013-01-28/s-sysdeps-20130128-git.tgz 6002 2fe61fadafd62ef9597e17b4783889ef 455bdf64e9ce28f99bda8dc20202cbcdc8015424 s-sysdeps-20130128-git s-sysdeps.asd -s-utils http://beta.quicklisp.org/archive/s-utils/2013-01-28/s-utils-20130128-git.tgz 5511 50d0bada77503606b9ec7dc1b4318a71 0f8314edbd003064faf03c56ee957ed6690927cd s-utils-20130128-git s-utils.asd -s-xml http://beta.quicklisp.org/archive/s-xml/2015-06-08/s-xml-20150608-git.tgz 21248 9c31c80f0661777c493fab683f776716 03cb87aacf1c44877a76572510df60c563727125 s-xml-20150608-git s-xml.asd -s-xml-rpc http://beta.quicklisp.org/archive/s-xml-rpc/2019-05-21/s-xml-rpc-20190521-git.tgz 23981 33c268048222002af4d6232d71ee7222 d8b595ab60be528be3848eaf64d3b9a77fc62319 s-xml-rpc-20190521-git s-xml-rpc.asd -safe-queue http://beta.quicklisp.org/archive/safe-queue/2016-04-21/safe-queue-20160421-git.tgz 3667 211b677bc15a7ac3ce6e88ee7f89d970 13efd7ab3e541ba00a86cfc774fffa702f9ac3d9 safe-queue-20160421-git safe-queue.asd -safe-read http://beta.quicklisp.org/archive/safe-read/2018-10-18/safe-read-20181018-git.tgz 5487 54bd985ab5f3ad1d30a2a53f1da03410 c93d1baf7f8499a0383f8ae38a5a01bb36542801 safe-read-20181018-git safe-read.asd -safety-params http://beta.quicklisp.org/archive/safety-params/2019-02-02/safety-params-20190202-git.tgz 7110 44bdeb52d69878bf67ecf413613538cb 3380fbb899e4130dbc98475d1803f733245e54e5 safety-params-20190202-git safety-params.asd -salza2 http://beta.quicklisp.org/archive/salza2/2013-07-20/salza2-2.0.9.tgz 15525 e62383de435081c0f1f888ec363bb32c 7f2eecaa9582bbedf7278fcf77bf46c9c5474f5b salza2-2.0.9 salza2.asd -sandalphon.lambda-list http://beta.quicklisp.org/archive/sandalphon.lambda-list/2018-07-11/sandalphon.lambda-list-20180711-git.tgz 11120 6b75d6bcd35d610abb1278547266246f 49223fc82d7af2364aba90b495442be3153b4494 sandalphon.lambda-list-20180711-git sandalphon.lambda-list.asd -sanity-clause http://beta.quicklisp.org/archive/sanity-clause/2019-11-30/sanity-clause-20191130-git.tgz 34489 5fadf7e610de59840d1208f80d767efd 1d64f5903d202b95dce700a1d4867e5b48217d2d sanity-clause-20191130-git sanity-clause.asd -sapaclisp http://beta.quicklisp.org/archive/sapaclisp/2012-05-20/sapaclisp-1.0a.tgz 141501 5a9d213d0063de0cc1ef9fd3aea811ca 2f3bbe44b16bc0bdc6c29be6f00312e9372f61cb sapaclisp-1.0a sapaclisp.asd -sb-cga http://beta.quicklisp.org/archive/sb-cga/2017-12-27/sb-cga-20171227-git.tgz 34033 46f69ae11e29b16a8da92965bddeb0e3 e59084d49f3a915c0cde0793f74ab68073ac948e sb-cga-20171227-git sb-cga.asd -sb-fastcgi http://beta.quicklisp.org/archive/sb-fastcgi/2019-12-27/sb-fastcgi-20191227-git.tgz 3835 b2f177181308a88dd65909d60e85d755 bbc4710baadd2d3bf61cac73fbefba83df0e5990 sb-fastcgi-20191227-git sb-fastcgi.asd -sb-vector-io http://beta.quicklisp.org/archive/sb-vector-io/2011-08-29/sb-vector-io-20110829-git.tgz 5263 a57684e11ed481a7c4cf7f2623942e49 15faae433ceb327a16f5bcf29cdcd7728a5c1aca sb-vector-io-20110829-git sb-vector-io.asd -sc-extensions http://beta.quicklisp.org/archive/sc-extensions/2019-11-30/sc-extensions-20191130-git.tgz 8141 b929525a11725794c55b86dfdb6798c7 14a000be3e6b719a491ff9ce2ee376cdb2d33538 sc-extensions-20191130-git sc-extensions.asd -scalpl http://beta.quicklisp.org/archive/scalpl/2019-12-27/scalpl-20191227-git.tgz 50929 0187001e6d53616d588fa0dc385c6e83 eee08d1d92f743f59496f96201c2155bf6c4fd5e scalpl-20191227-git scalpl.asd -screamer http://beta.quicklisp.org/archive/screamer/2019-07-10/screamer-20190710-git.tgz 953872 6eb822a63c82ed6007f2c1f662005f1f 15d7e15f78b9d23db8da9efa3ae260a17a3038e4 screamer-20190710-git screamer-tests.asd screamer.asd -scriba http://beta.quicklisp.org/archive/scriba/2015-12-18/scriba-20151218-git.tgz 33936 867dbaf3a2660a23f29d27e5633abd94 4e79592dfc97bb7997c32696439706dabe16d4d5 scriba-20151218-git scriba-test.asd scriba.asd -scribble http://beta.quicklisp.org/archive/scribble/2016-06-28/scribble-20160628-git.tgz 15810 976a908f6bbe7ac8516a4916dd6cee20 e1e46a668bfda1cb2848b489176ea6d82d5800d7 scribble-20160628-git scribble.asd -scriptl http://beta.quicklisp.org/archive/scriptl/2018-02-28/scriptl-20180228-git.tgz 125271 37927d71784ccef1cdeb309272416d0a 3f940ab4a12dcbb23f78f2a3d8b33f3aaf454793 scriptl-20180228-git scriptl-examples.asd scriptl-util.asd scriptl.asd -sdl2-game-controller-db http://beta.quicklisp.org/archive/sdl2-game-controller-db/2018-02-28/sdl2-game-controller-db-release-quicklisp-335d2b68-git.tgz 7352 ad3ab5458419a5a259313807c8e0b181 770ccc1def893343b1d3ed5ad511b3537b5c7b02 sdl2-game-controller-db-release-quicklisp-335d2b68-git sdl2-game-controller-db.asd -sdl2kit http://beta.quicklisp.org/archive/sdl2kit/2017-11-30/sdl2kit-20171130-git.tgz 11804 906f93a606d1ff2ed8ed613a3fb2d553 0e077fd40e966e93f505a90a9027fe784dc8aaaf sdl2kit-20171130-git sdl2kit-examples.asd sdl2kit.asd -sealable-metaobjects http://beta.quicklisp.org/archive/sealable-metaobjects/2019-12-27/sealable-metaobjects-20191227-git.tgz 11693 89191336d30215431ee3c916974e5127 1acc25792468db5251863b324ac36e22628791ef sealable-metaobjects-20191227-git code/sealable-metaobjects.asd test-suite/sealable-metaobjects-test-suite.asd -secret-values http://beta.quicklisp.org/archive/secret-values/2017-10-19/secret-values-20171019-git.tgz 2590 02ce6929d8923975f7368470730be760 516f54287f35b7c90e82f64cf769502fd47ef8e2 secret-values-20171019-git secret-values.asd -secure-random http://beta.quicklisp.org/archive/secure-random/2016-02-08/secure-random-20160208-git.tgz 2912 ee57beb30d51da8b3969c27ca52fd0d7 5f5b15e224164c1658ed62532759761ba9c26ccc secure-random-20160208-git secure-random.asd -sel http://beta.quicklisp.org/archive/sel/2019-12-27/sel-20191227-git.tgz 1265692 843828381be7aa65b2ae07d9e5e78147 a2ec44c65fd2a5addb6656feb5b059d4568c5934 sel-20191227-git software-evolution-library.asd -select http://beta.quicklisp.org/archive/select/2019-10-07/select-20191007-git.tgz 271138 d5e63be051777d39e0d74791ab88e078 384cb66fd750ce8ae601f19502ab299dac85abbf select-20191007-git select.asd -semantic-spinneret http://beta.quicklisp.org/archive/semantic-spinneret/2017-08-30/semantic-spinneret-20170830-git.tgz 2079 3cdc958d8000f1e26f683aa30f0950cb afeea07a5ef5c41d6d90ba0c7b7dfbb9d9569e15 semantic-spinneret-20170830-git semantic-spinneret.asd -sequence-iterators http://beta.quicklisp.org/archive/sequence-iterators/2013-08-13/sequence-iterators-20130813-darcs.tgz 34899 a6b61a5e9026a03c4978f3721bb17632 7cab8da70f985eb5165aa2145e937a04c605e23c sequence-iterators-20130813-darcs extensible-sequences/extensible-sequences.asd sequence-iterators.asd -serapeum http://beta.quicklisp.org/archive/serapeum/2019-12-27/serapeum-20191227-git.tgz 188510 dabf40eb6c6af7509da66450790cbf4e c5c3041a39533725c8c1b0278dea67dbdddba8e9 serapeum-20191227-git serapeum.asd -serializable-object http://beta.quicklisp.org/archive/serializable-object/2019-12-27/serializable-object-20191227-git.tgz 22152 5035427309018750274ef7767cf2b2e7 bbdcb991e44ad56e18b3fc8e4873539b731a937e serializable-object-20191227-git serializable-object.asd serializable-object.test.asd -series http://beta.quicklisp.org/archive/series/2013-11-11/series-20131111-git.tgz 151865 396c160a736ad38829dce1db13a75bcc 6bf27684cdd5fae7ab739d954a72bfde7154bc67 series-20131111-git series.asd -session-token http://beta.quicklisp.org/archive/session-token/2014-11-06/session-token-20141106-git.tgz 3020 5e7727a5a92a8ca9b70304f47b6b52b6 713d1d511e522fe2bd1732e03b088ff062852e8f session-token-20141106-git session-token.asd -sexml http://beta.quicklisp.org/archive/sexml/2014-07-13/sexml-20140713-git.tgz 27508 f71d4ee8da885671be8b779266cd865a f4f482c546f955b9eb4f8c200cc5947528ae6b7e sexml-20140713-git contrib/sexml-objects/sexml-objects.asd sexml.asd -sha1 http://beta.quicklisp.org/archive/sha1/2018-10-18/sha1-20181018-git.tgz 3198 1e49b3c92abf33a84a4e7a18fafc6ec7 96078e0ee02b1811391c36d46356856606156c0a sha1-20181018-git sha1.asd -sha3 http://beta.quicklisp.org/archive/sha3/2018-02-28/sha3-20180228-git.tgz 17156 26078e9dcb90cc6d6e3174880c4514cb 6ba93591c151ee6b04f0aadfc5f93292ef238527 sha3-20180228-git sha3.asd -shadchen http://beta.quicklisp.org/archive/shadchen/2013-10-03/shadchen-20131003-git.tgz 11298 159f11f77ef2c1c2279e502213a97d43 751e9e27c0d249076ae7a14c275d22f5007c9f69 shadchen-20131003-git shadchen.asd -shadow http://beta.quicklisp.org/archive/shadow/2019-12-27/shadow-20191227-git.tgz 15478 bec5fb5889cfc6d91d0095c61a994457 200b818cf6aae5a86a4a7fe1d3d2e651eca11e63 shadow-20191227-git shadow.asd -sheeple http://beta.quicklisp.org/archive/sheeple/2015-03-02/sheeple-20150302-git.tgz 623383 3077aa64386b96c2aae8b42ea750503d b8c84650eb413b8c6187e5a8d0b8cb0de4217d0e sheeple-20150302-git sheeple.asd -shellpool http://beta.quicklisp.org/archive/shellpool/2015-05-05/shellpool-20150505-git.tgz 26021 5f8713d9dcfd08d3db2bce7ef3f6ed44 1d0065a166713f7e02493d3acdaf735cfcbd09cd shellpool-20150505-git shellpool.asd -shelly http://beta.quicklisp.org/archive/shelly/2014-11-06/shelly-20141106-git.tgz 18127 824938aaaac93602dc927a9734aa1581 2dc9eff9949e91277a0db6376a431b6992681d4b shelly-20141106-git shelly-test.asd shelly.asd -shorty http://beta.quicklisp.org/archive/shorty/2018-02-28/shorty-20180228-git.tgz 4280 4141a8fd8c22806935284b312bdbae6f 38a21fee651b92c319e4d00215d84f01138557fc shorty-20180228-git shorty.asd -should-test http://beta.quicklisp.org/archive/should-test/2019-10-07/should-test-20191007-git.tgz 7618 f27c9a9c25be4f67204f7c3dccde755f 32aeafca31add71fa61077717e5e5e932033f85f should-test-20191007-git should-test.asd -shuffletron http://beta.quicklisp.org/archive/shuffletron/2018-10-18/shuffletron-20181018-git.tgz 125912 ffa1e84964f41af31bbb853d0b0776a9 7a8f2aaf66cd8978094dacd5e92242dc859deca7 shuffletron-20181018-git shuffletron.asd -simple-actors http://beta.quicklisp.org/archive/simple-actors/2019-07-10/simple-actors-20190710-git.tgz 4857 449f12288ea6f0bb441bc93936283bb1 3403542e34ca9033faf5935ce4c894e1d3385775 simple-actors-20190710-git simple-actors.asd -simple-config http://beta.quicklisp.org/archive/simple-config/2019-12-27/simple-config-20191227-git.tgz 2421 581baa322bb5c6924fb37bcb391ca719 ab402780a2ba1ee230bacaf4fa3d0a73127ad2c0 simple-config-20191227-git simple-config-test.asd simple-config.asd -simple-currency http://beta.quicklisp.org/archive/simple-currency/2017-11-30/simple-currency-20171130-git.tgz 12557 71ea0f64c63b4287fc56ece336e08ef9 aa40c0d344e0c9c4b20583d8df86887e55081b2b simple-currency-20171130-git simple-currency.asd -simple-date-time http://beta.quicklisp.org/archive/simple-date-time/2016-04-21/simple-date-time-20160421-git.tgz 5688 a5b1e4af539646723dafacbc8cf732a0 74ea55a0c7d77d7b967b3ad94f9f67137c9cd01e simple-date-time-20160421-git simple-date-time.asd -simple-finalizer http://beta.quicklisp.org/archive/simple-finalizer/2010-10-06/simple-finalizer-20101006-git.tgz 3415 fcc7c3966af77de524e6f24bb9dc1c94 6ac4c1cb19186e78e445885f86da20ba99d868bb simple-finalizer-20101006-git simple-finalizer.asd -simple-flow-dispatcher http://beta.quicklisp.org/archive/simple-flow-dispatcher/2018-07-11/simple-flow-dispatcher-stable-a7b66fbc-git.tgz 2472 04fa311af0ae1be7e1b9c6fc3eaa0630 f398b15e606b6fdb4480b5b010365ba0520da616 simple-flow-dispatcher-stable-a7b66fbc-git simple-flow-dispatcher.asd -simple-inferiors http://beta.quicklisp.org/archive/simple-inferiors/2019-07-10/simple-inferiors-20190710-git.tgz 9654 e3194d746e03dd1dbf8d0f185a7cb457 7f287a3f922a929483e1e03f5273deefd0701603 simple-inferiors-20190710-git simple-inferiors.asd -simple-logger http://beta.quicklisp.org/archive/simple-logger/2018-02-28/simple-logger-20180228-git.tgz 2800 bae2008abb490d9ab93474676dbe944a a00039c9467b7f09977bbe9a0d500a1b8cf5e371 simple-logger-20180228-git simple-logger.asd -simple-parallel-tasks http://beta.quicklisp.org/archive/simple-parallel-tasks/2019-11-30/simple-parallel-tasks-20191130-git.tgz 14217 a7d4af2253c91d4dca663e14c99e918d 18111bf3848866bd1cc5276388526012f3e0995d simple-parallel-tasks-20191130-git simple-parallel-tasks-tests.asd simple-parallel-tasks.asd -simple-rgb http://beta.quicklisp.org/archive/simple-rgb/2019-05-21/simple-rgb-20190521-git.tgz 5464 8afe42c3bb2bec023cfae77a8153c668 2573e45d315e8fe7a0b30f90bd5bb9624044cdb5 simple-rgb-20190521-git simple-rgb.asd -simple-routes http://beta.quicklisp.org/archive/simple-routes/2018-02-28/simple-routes-20180228-git.tgz 6209 95b881171c381674a275da21692442f2 06b1a640d86490ed1e346b2a37306e4a8c7a66f2 simple-routes-20180228-git simple-routes.asd -simple-tasks http://beta.quicklisp.org/archive/simple-tasks/2019-07-10/simple-tasks-20190710-git.tgz 12567 8e88a9a762bc8691f92217d256baa55e 3fdcc5d1debf45d1480f31ce5f7de206ff6aeb87 simple-tasks-20190710-git simple-tasks.asd -simplet http://beta.quicklisp.org/archive/simplet/2019-12-27/simplet-20191227-git.tgz 16303 9fa3343c7a0b9f6f7f43d8b4ed706d98 bf0ee7b1a8770cc028a66ffd6da9770ab6492a3a simplet-20191227-git simplet-asdf.asd simplet.asd -simplified-types http://beta.quicklisp.org/archive/simplified-types/2019-08-13/simplified-types-20190813-git.tgz 6647 c3666e2faf2aed0ec040912db0a91285 c89aa23f3c54e114a3c8de9f3b8254d128bdf7f3 simplified-types-20190813-git code/simplified-types.asd test-suite/simplified-types-test-suite.asd -simpsamp http://beta.quicklisp.org/archive/simpsamp/2010-10-06/simpsamp-0.1.tgz 44485 afd8bdfae4b4f0924839753086bab0bf 38b802cbd0a7855ff101020e71ee2e9fd7927316 simpsamp-0.1 simpsamp.asd -single-threaded-ccl http://beta.quicklisp.org/archive/single-threaded-ccl/2015-06-08/single-threaded-ccl-20150608-git.tgz 2611 fa4c2cf5223e2c57e1b3352edeecca0c 3f7bedd0e7741ac4503bd09a6a84da5921e62b81 single-threaded-ccl-20150608-git single-threaded-ccl.asd -sip-hash http://beta.quicklisp.org/archive/sip-hash/2016-08-25/sip-hash-20160825-git.tgz 5396 a79aea8e4847580308bcc46ac2ddeaa2 89284d247a8403a555731ca5dd8bd135bd22609a sip-hash-20160825-git sip-hash-test.asd sip-hash.asd -skeleton-creator http://beta.quicklisp.org/archive/skeleton-creator/2019-12-27/skeleton-creator-20191227-git.tgz 42572 ca2c99e3eb2951f96db1190da7ed3c15 68ef28b145fe342fbc69df5b67d300f23733fea4 skeleton-creator-20191227-git skeleton-creator.asd -sketch http://beta.quicklisp.org/archive/sketch/2017-11-30/sketch-20171130-git.tgz 1117712 4074bf2418d86d392ce6dcca5e379f31 e4f1d2eccd31d987648b90668a7b33025057d3c4 sketch-20171130-git sketch-examples.asd sketch.asd -skippy http://beta.quicklisp.org/archive/skippy/2015-04-07/skippy-1.3.12.tgz 31965 c64deda635cd8b93768ff837c3b66a72 0a9255fa75a12a7c2f74db9ad584abe68d66a538 skippy-1.3.12 skippy.asd -skippy-renderer http://beta.quicklisp.org/archive/skippy-renderer/2018-01-31/skippy-renderer-20180131-git.tgz 2045 38e6ebfbf61921f6d3d8c3b523d7af45 06d79b76393363b593af29a89ce637d62908b5ba skippy-renderer-20180131-git skippy-renderer.asd -skitter http://beta.quicklisp.org/archive/skitter/2018-02-28/skitter-release-quicklisp-620772ae-git.tgz 21551 d9148bdb15605412b813b955cc9fb46b 984a7e9102c2fc65635cec373b3944f884e65a03 skitter-release-quicklisp-620772ae-git skitter.asd skitter.glop.asd skitter.sdl2.asd -slack-client http://beta.quicklisp.org/archive/slack-client/2016-08-25/slack-client-20160825-git.tgz 7752 245f64f7188363f1eabbb4b8a2e9c572 c500065dbbd1bf63fc37ec82114d0f76ebc9d906 slack-client-20160825-git slack-client-test.asd slack-client.asd -slime http://beta.quicklisp.org/archive/slime/2019-07-10/slime-v2.24.tgz 813432 05f421f7a9dffa4ba206c548524ef1c0 2a03cc43352ffec5d863568af298c54fe36138e7 slime-v2.24 swank.asd -slk-581 http://beta.quicklisp.org/archive/slk-581/2019-01-07/slk-581-20190107-git.tgz 4848 d90326b00b92d657b6424002dee00a56 f367c37a8378bddf0810f8fc91a87cbae39a4097 slk-581-20190107-git eclecticse.slk-581.asd -sly http://beta.quicklisp.org/archive/sly/2019-12-27/sly-20191227-git.tgz 1821100 6c38ce18567734425fff81326b7eda5f 7e735a1f2257de7c00b3043399008d1d6e98b5ae sly-20191227-git slynk/slynk.asd -smackjack http://beta.quicklisp.org/archive/smackjack/2018-02-28/smackjack-20180228-git.tgz 17449 398e790adbd5c3d1c85d211d8e119990 9de59527f4fa97c9c09aaaa448978fdc9d3e4ac7 smackjack-20180228-git demo/smackjack-demo.asd smackjack.asd -smart-buffer http://beta.quicklisp.org/archive/smart-buffer/2016-06-28/smart-buffer-20160628-git.tgz 3176 454d8510618da8111c7ca687549b7035 a4f22d227b6266c70e94597af8adf7dfc67b193a smart-buffer-20160628-git smart-buffer-test.asd smart-buffer.asd -smug http://beta.quicklisp.org/archive/smug/2016-04-21/smug-20160421-git.tgz 77846 8139d7813bb3130497b6da3bb4cb8924 588308bcd788fff31da9b464a0e6df1c2386cf16 smug-20160421-git smug.asd -sn.man http://beta.quicklisp.org/archive/sn.man/2019-02-02/sn.man-20190202-git.tgz 1563 c8398aefe8bc3818fbe9a6994bce7f8b 0b2fac544b0edf64f5b7fc0ee520a3853914ff96 sn.man-20190202-git sn.man.asd -snakes http://beta.quicklisp.org/archive/snakes/2018-12-10/snakes-20181210-git.tgz 16534 0bdb11ea92090dabcdc3509af16f0d2a 26c6e7ac29960d3ede577ecc75aceed7461a688f snakes-20181210-git snakes.asd -snappy http://beta.quicklisp.org/archive/snappy/2015-10-31/snappy-20151031-git.tgz 1319848 a454814a316902731bb6e28d4eadd115 8e8a9c046eab9ad4e5497201d4c1e547d5fbc20e snappy-20151031-git snappy-test.asd snappy.asd -snark http://beta.quicklisp.org/archive/snark/2016-04-21/snark-20160421-git.tgz 275436 b7ee5cb5350f5c675359022c10fc6bb9 b265505c5c331237e1fffbb0aa19fa68ff581cee snark-20160421-git snark-agenda.asd snark-auxiliary-packages.asd snark-deque.asd snark-dpll.asd snark-examples.asd snark-feature.asd snark-implementation.asd snark-infix-reader.asd snark-lisp.asd snark-loads.asd snark-numbering.asd snark-pkg.asd snark-sparse-array.asd snark.asd -sndfile-blob http://beta.quicklisp.org/archive/sndfile-blob/2018-02-28/sndfile-blob-stable-d904a06e-git.tgz 4041275 159b41bc37d6fcd4ef294bfd275c051c 8b39988db1b0581af5bf6509e01cf7b9c81bcaec sndfile-blob-stable-d904a06e-git sndfile-blob.asd -snmp http://beta.quicklisp.org/archive/snmp/2016-10-31/snmp-6.1.tgz 4454924 9ea185bf039906911b5f48b73a43c31f 826501f7973e77cd5e2cb19a7ce79d3cb2ecdf1d snmp-6.1 snmp-server.asd snmp-test.asd snmp-ui.asd snmp.asd -snooze http://beta.quicklisp.org/archive/snooze/2019-07-10/snooze-20190710-git.tgz 36180 9c30dee1f9b15e97f7fcc0509291e6f0 9f95a32ebfa69e910a64e56601ccd6758a88448f snooze-20190710-git snooze.asd -softdrink http://beta.quicklisp.org/archive/softdrink/2019-07-10/softdrink-20190710-git.tgz 5640 3fb4add6efa5aa90b69db11b6a0444f7 cff7e8b2e476a2050f1b39fa93d7193f00c47398 softdrink-20190710-git softdrink.asd -solid-engine http://beta.quicklisp.org/archive/solid-engine/2019-05-21/solid-engine-20190521-git.tgz 6543 f666e1d94dd1a915ce8c680d43ddbf02 a8f3345f2690c751b2df8522c9ad200db016960f solid-engine-20190521-git solid-engine.asd -soundex http://beta.quicklisp.org/archive/soundex/2010-10-06/soundex-1.0.tgz 1652 247f7c15b49b230100d37bbc3964bd10 8515dcfcd3bf21025931ca0837e9fe83c2622012 soundex-1.0 soundex.asd -south http://beta.quicklisp.org/archive/south/2019-07-10/south-20190710-git.tgz 20288 5635201c1fe341b9e75f1c0ea97e4e33 77c9ede6f2025cc776071555e2fc2844fce08650 south-20190710-git south.asd -spatial-trees http://beta.quicklisp.org/archive/spatial-trees/2014-08-26/spatial-trees-20140826-git.tgz 21925 2772b963aae5c4d06fff83c22e5c8aa9 5038860caf1e9687de757b3158f9df3086a4d54e spatial-trees-20140826-git spatial-trees.asd spatial-trees.nns.asd spatial-trees.nns.test.asd spatial-trees.test.asd -specialization-store http://beta.quicklisp.org/archive/specialization-store/2019-01-07/specialization-store-v0.0.4.tgz 64336 0d979c5e42a73aa6c764da38506c95bb 7fc8577146bd23a00a1dfabfdc4719429d743335 specialization-store-v0.0.4 specialization-store-features.asd specialization-store-tests.asd specialization-store.asd -specialized-function http://beta.quicklisp.org/archive/specialized-function/2019-12-27/specialized-function-20191227-git.tgz 101044 63a158875039df164af5c3a9b8c6a82d 245ec60790a804b0d859e579f333ae7ddcd445fc specialized-function-20191227-git specialized-function.asd specialized-function.test.asd -spell http://beta.quicklisp.org/archive/spell/2019-03-07/spell-20190307-git.tgz 3643983 f765650ae77e3aa237817ea9d0edf292 b8280c38fd4e628358ffc445d233b4c2a55c1f36 spell-20190307-git spell.asd -spellcheck http://beta.quicklisp.org/archive/spellcheck/2013-10-03/spellcheck-20131003-git.tgz 2375587 1633f18983bbb368192d1355f3f4f13e f6de93b47beda9d56e14184826bb8b49e10cb789 spellcheck-20131003-git spellcheck.asd -spinneret http://beta.quicklisp.org/archive/spinneret/2019-10-07/spinneret-20191007-git.tgz 26495 64de57957fcc72e90b43e1cb26357e4d 5522c52b347f5fbdfe70b8c62b70997bf7db987a spinneret-20191007-git spinneret.asd -split-sequence http://beta.quicklisp.org/archive/split-sequence/2019-05-21/split-sequence-v2.0.0.tgz 10329 88aadc6c9da23663ebbb39d546991df4 54314a3e7e3cb272f6ceec84acd23309bbdbba0f split-sequence-v2.0.0 split-sequence.asd -sprint-stars http://beta.quicklisp.org/archive/sprint-stars/2018-08-31/sprint-stars-20180831-git.tgz 1517 db7adeef5208184377f65388661f7ed2 a9de0cfd9e556c34cd2807084fc6ad2e2328a54f sprint-stars-20180831-git stars.asd -st-json http://beta.quicklisp.org/archive/st-json/2018-10-18/st-json-20181018-git.tgz 7402 75d772cb5d9367f44b924aa1f5620260 d33eaaaa20c73c2ce2a542e7c087ef0273b0d185 st-json-20181018-git st-json.asd -staple http://beta.quicklisp.org/archive/staple/2019-11-30/staple-20191130-git.tgz 98804 e79eb9df05381d830a30256a37f2b105 b097d9a02e2912e8669b7a295f41c9a0515cacec staple-20191130-git parser/staple-code-parser.asd server/staple-server.asd staple-markdown.asd staple-markless.asd staple-package-recording.asd staple-restructured-text.asd staple.asd -static-dispatch http://beta.quicklisp.org/archive/static-dispatch/2019-12-27/static-dispatch-20191227-git.tgz 13045 d796924e4669809b5a4fe74e55af584a 36280bd7c6cb42de15a30b2cbaf2bc2a92e8fdea static-dispatch-20191227-git static-dispatch.asd -static-vectors http://beta.quicklisp.org/archive/static-vectors/2019-11-30/static-vectors-v1.8.4.tgz 7420 401085c3ec0edc3ab47409e5a4b534c7 f0618189731f3099f2790f5b07f1247d2b59ff18 static-vectors-v1.8.4 static-vectors.asd -stealth-mixin http://beta.quicklisp.org/archive/stealth-mixin/2018-12-10/stealth-mixin-20181210-git.tgz 2180 2b6ba6744ac4c4fcdcf1a8c8b71ce567 f3a18458497c73a2a7b901f6f97eb2ce0133c5d9 stealth-mixin-20181210-git stealth-mixin.asd -stefil http://beta.quicklisp.org/archive/stefil/2018-12-10/stefil-20181210-git.tgz 18041 3418bf358366748593f65e4b6e1bb8cf f974b02c814ebaaa804f2ecf4c86b0a18abfe6b2 stefil-20181210-git stefil.asd -stem http://beta.quicklisp.org/archive/stem/2015-06-08/stem-20150608-git.tgz 116071 0dc7713fb0412a4d116304960410cdd7 2eecde21d5d4c35d095bc83b2dd26b55bf8d461e stem-20150608-git stem.asd -stl http://beta.quicklisp.org/archive/stl/2017-10-19/stl-20171019-git.tgz 3089 01a69ac8892b8f4a4bb97c57cf4a9da7 90d1d6084da63bf66ecf50ebf2f84d28531d10b4 stl-20171019-git stl.asd -stmx http://beta.quicklisp.org/archive/stmx/2018-10-18/stmx-stable-4d915e33-git.tgz 360397 817d021e01c934d21a0edadb726e49d4 dc1b0dfe140635e1f2e2974780112e6bf64dc703 stmx-stable-4d915e33-git stmx.asd -string-case http://beta.quicklisp.org/archive/string-case/2018-07-11/string-case-20180711-git.tgz 9081 145c4e13f1e90a070b0a95ca979a9680 ff3958a84d23a5b9e743fbf30726a1d9b6c0fbfd string-case-20180711-git string-case.asd -string-escape http://beta.quicklisp.org/archive/string-escape/2015-04-07/string-escape-20150407-http.tgz 15485 8e2acbd7ce3914258979b87a0284a4a1 1d9841f3e851d744c21af85156651eba4aa322d6 string-escape-20150407-http string-escape.asd -stripe http://beta.quicklisp.org/archive/stripe/2019-08-13/stripe-20190813-git.tgz 11794 df2fada3fcb94abac84dde39ebfbfaaa 9ff3e4e67910a7418362012df2bd894611af8828 stripe-20190813-git stripe.asd -structy-defclass http://beta.quicklisp.org/archive/structy-defclass/2017-06-30/structy-defclass-20170630-git.tgz 2769 ae666e7951c4137242d95fff9ca6c31e df7f719fa42dc7d3115ed1e0e14cd289eb9f7cce structy-defclass-20170630-git structy-defclass.asd -studio-client http://beta.quicklisp.org/archive/studio-client/2019-11-30/studio-client-20191130-git.tgz 8792 5b8fd01399af33f5244d4ecb1bf9ca4d 1e83a2a60bd8b087412e8824a4fb3fc626c4908b studio-client-20191130-git studio-client.asd -stumpwm http://beta.quicklisp.org/archive/stumpwm/2019-12-27/stumpwm-20191227-git.tgz 217019 247f56ddbdc8bdf4cf087a467ddce6f6 c658a1e8528de2113f6a15d55c6c5db3de81dd83 stumpwm-20191227-git stumpwm-tests.asd stumpwm.asd -submarine http://beta.quicklisp.org/archive/submarine/2012-09-09/submarine-20120909-darcs.tgz 38895 461d3050c80b3bbfa73e0ccddc3c00f3 2695b1d9c135e05e6f8bbcb23f0b663a438961e8 submarine-20120909-darcs submarine.asd -sucle http://beta.quicklisp.org/archive/sucle/2019-05-21/sucle-20190521-git.tgz 1010033 53bfdeeb528acc9be632877ac21625a3 f713be4086345e3b3f3fa201a77b90b59e1369a6 sucle-20190521-git application/app-subsystem/application/application.asd application/app-subsystem/clock/clock.asd application/app-subsystem/control/control.asd application/app-subsystem/deflazy/deflazy.asd application/app-subsystem/fps-independent-timestep/fps-independent-timestep.asd application/app-subsystem/opengl-immediate/opengl-immediate.asd application/app-subsystem/scratch-buffer/scratch-buffer.asd application/app-subsystem/window/window.asd application/application-example-hello-world/application-example-hello-world.asd application/basic0/sucle.asd application/subsystems/cartesian-graphing/cartesian-graphing.asd application/subsystems/fast-text-grid-sprites/fast-text-grid-sprites.asd application/subsystems/sandbox/sandbox.asd application/subsystems/sketch-sucle/sketch-sucle-examples.asd application/subsystems/sketch-sucle/sketch-sucle.asd application/subsystems/text-subsystem/doc/text-subsystem-generate-font.asd application/subsystems/text-subsystem/text-subsystem.asd application/subsystems/vecto-test/vecto-stuff.asd application/sucle2/sucle2.asd application/testbed/testbed.asd src/character-modifier-bits/character-modifier-bits.asd src/data-structures/doubly-linked-list/sucle-doubly-linked-list.asd src/data-structures/matrix/matrix.asd src/data-structures/reverse-array-array/example/reverse-array-array-example.asd src/data-structures/reverse-array-array/reverse-array-array.asd src/data-structures/reverse-array-iterator/reverse-array-iterator.asd src/data-structures/sprite-chain/sprite-chain.asd src/euclidean-geometry/aabbcc/aabbcc.asd src/euclidean-geometry/camera-matrix/camera-matrix.asd src/euclidean-geometry/quads/quads.asd src/image/image-utility/image-utility.asd src/nsb-cga/nsb-cga.asd src/opengl/glhelp.asd src/uncommon-lisp/uncommon-lisp.asd src/window-opengl-glfw3/opengl-glfw3.asd -swank-client http://beta.quicklisp.org/archive/swank-client/2019-10-07/swank-client-20191007-git.tgz 15470 e9956d8033709c673ba16a2d7a7fb43e 07830b6ade8802791510e40241ba38b042a9f06e swank-client-20191007-git swank-client-test.asd swank-client.asd -swank-crew http://beta.quicklisp.org/archive/swank-crew/2015-10-31/swank-crew-20151031-git.tgz 15837 8a792387ad5d695a0d80ab5cd44866d0 b0e5cbbe82a9c95199a67ec21769f3f2167a6b07 swank-crew-20151031-git swank-crew-test.asd swank-crew.asd -swank-protocol http://beta.quicklisp.org/archive/swank-protocol/2015-12-18/swank-protocol-20151218-git.tgz 7391 715d26e8b7d0a2d8e18d2a7dc2b946f1 0d695ac0968fa294475c425b5a3345d76973f692 swank-protocol-20151218-git swank-protocol.asd -swank.live http://beta.quicklisp.org/archive/swank.live/2016-02-08/swank.live-20160208-git.tgz 1754 0cfd0cc920b37a27359244797dfd8817 0e98e9c945773a2f6e8e79688081c942a3327f9d swank.live-20160208-git swank.live.asd -swap-bytes http://beta.quicklisp.org/archive/swap-bytes/2019-11-30/swap-bytes-v1.2.tgz 4342 eea516d7fdbe20bc963a6708c225d719 e1ab274454408933c57dd932be413f0b11f18444 swap-bytes-v1.2 swap-bytes.asd -sxql http://beta.quicklisp.org/archive/sxql/2019-11-30/sxql-20191130-git.tgz 25711 f46e9a33b39f5b069b805e00f80a5410 d2291dc7e569deeb81b2f0d5665d99d46e92c5cd sxql-20191130-git sxql-test.asd sxql.asd -sycamore http://beta.quicklisp.org/archive/sycamore/2018-10-18/sycamore-20181018-git.tgz 55595 ecc982173a52ead05a35454a23e60cc3 dde17ef19ba0c690a9790acaab9344b7f67e7f5c sycamore-20181018-git src/sycamore.asd -symbol-munger http://beta.quicklisp.org/archive/symbol-munger/2015-04-07/symbol-munger-20150407-git.tgz 5298 b1e35b63d7ad1451868d1c40e2fbfab7 a8589c60f470b8b280eacd9c983d96bc5f337341 symbol-munger-20150407-git symbol-munger.asd -symbol-namespaces http://beta.quicklisp.org/archive/symbol-namespaces/2013-01-28/symbol-namespaces-1.0.tgz 4915 0ffbf4f50332e324feb40269ca1848cd 1088d4f5d922d472fc16a77da01c498ec956a9a7 symbol-namespaces-1.0 symbol-namespaces.asd -synonyms http://beta.quicklisp.org/archive/synonyms/2019-03-07/synonyms-20190307-hg.tgz 1628 6f956534aa5f68cd03988303fdc40f30 2a5f07c4a581566a998f4a56048850c9e7f6268b synonyms-20190307-hg synonyms.asd -system-locale http://beta.quicklisp.org/archive/system-locale/2019-07-10/system-locale-20190710-git.tgz 6241 1f2bbaabf7b0c8122666cdd688592c09 e2c3f0c6894a1480f6ab9fb01aac138ef2c75998 system-locale-20190710-git system-locale.asd -tagger http://beta.quicklisp.org/archive/tagger/2019-03-07/tagger-20190307-git.tgz 1107234 8eceb5a9684410e3f4f8471c1e10608b 9b157554e13131da1f942375cb4d647a3717d686 tagger-20190307-git tagger.asd -taglib http://beta.quicklisp.org/archive/taglib/2018-07-11/taglib-20180711-git.tgz 49606 4c8725f03df326ab12ce2b810e79724b 114161a2d82899942d7c36f8f66f5f345cdc2ba1 taglib-20180711-git taglib-tests.asd taglib.asd -talcl http://beta.quicklisp.org/archive/talcl/2018-02-28/talcl-20180228-git.tgz 32272 12f54d47f90bc8385b3fa8bc4ded7530 39bf555e8bcdb9497663597dc6fe0d725d4c9388 talcl-20180228-git talcl.asd -tap-unit-test http://beta.quicklisp.org/archive/tap-unit-test/2017-12-27/tap-unit-test-20171227-git.tgz 6640 999414b562bcad22ad8be263d13cf813 bee7f65ad728387c7496f6ee412711c2982d8d7c tap-unit-test-20171227-git tap-unit-test.asd -targa http://beta.quicklisp.org/archive/targa/2018-10-18/targa-20181018-git.tgz 6717 abdb921075c2f42c314bcaa6af93402a 5d82e49c058ae56f9c586a82424f853476023ee7 targa-20181018-git targa.asd -teepeedee2 http://beta.quicklisp.org/archive/teepeedee2/2016-04-21/teepeedee2-20160421-git.tgz 92218 1685bc037dcaaeba1f5b9224fda7dccb 1d8e266e9e2f6063bfabccd37b55c66fa42ddb49 teepeedee2-20160421-git teepeedee2-test.asd teepeedee2.asd -telnetlib http://beta.quicklisp.org/archive/telnetlib/2014-12-17/telnetlib-20141217-git.tgz 9030 d002d6c2aa8cda700fa7b0e114404197 65dff3a01133aacc554aea10ecfb2d4a95ad6c12 telnetlib-20141217-git telnetlib.asd -template http://beta.quicklisp.org/archive/template/2019-03-07/template-20190307-hg.tgz 3558 f1f963f928879fb2ef6903e5e0466d6d a2a448c28c9b96927ef288929c04f931a86ed63c template-20190307-hg template.asd -template-function http://beta.quicklisp.org/archive/template-function/2017-11-30/template-function-v0.0.1-git.tgz 28074 cfe8ff39d2006b55a46b7f0bdf770ecb 327ad56f17a4923c9124834168791462d5274252 template-function-v0.0.1-git template-function-tests.asd template-function.asd -temporal-functions http://beta.quicklisp.org/archive/temporal-functions/2017-10-19/temporal-functions-20171019-git.tgz 6586 0a4ad318c90a9cc2c7ca391d2c471c1a 70bfe85677d18c3de5434d054d6dd7b6ae3395d4 temporal-functions-20171019-git temporal-functions.asd -temporary-file http://beta.quicklisp.org/archive/temporary-file/2015-06-08/temporary-file-20150608-git.tgz 10812 0df609812523566a84604d768158f3b0 1ac3046923b6136defee3d28344f9c4e69d8e83a temporary-file-20150608-git temporary-file.asd -terminfo http://beta.quicklisp.org/archive/terminfo/2018-08-31/terminfo-20180831-git.tgz 12813 0b3ee86845c43c92cfb8eaddaa94ce42 39995b17e1b4fe3a6e6bd4aaf16720bb646cfa7c terminfo-20180831-git terminfo.asd -terrable http://beta.quicklisp.org/archive/terrable/2019-07-10/terrable-20190710-git.tgz 8756 99d92ae77464827a2c3f17cbcef09388 5b7f6b7821374d913cc4f8aa34968db75a065480 terrable-20190710-git terrable.asd -test-utils http://beta.quicklisp.org/archive/test-utils/2018-08-31/test-utils-20180831-git.tgz 5073 dff3c30e51b7ff5812b6eb7671342033 b11396183f5751bb224571c8981290a59fab14f0 test-utils-20180831-git test-utils.asd -testbild http://beta.quicklisp.org/archive/testbild/2010-12-07/testbild-20101207-git.tgz 52330 d3008e32481ed01aaf4bf8d2fd0bcbad 95fca0344bb5af81f7f9c0453ed51e24fd27419f testbild-20101207-git testbild-test.asd testbild.asd -texp http://beta.quicklisp.org/archive/texp/2015-12-18/texp-20151218-git.tgz 16321 0ded17b1ba2ad4506e5f4bde9ba9a2d7 e73f7a2267913b386f31b78b6e68ddd4c896de92 texp-20151218-git texp.asd -text-query http://beta.quicklisp.org/archive/text-query/2011-11-05/text-query-1.1.tgz 5548 57d28b552f346a00ece98824b1bc898f f5ec2327f9d7049749d6bea161ea7d90a5db5017 text-query-1.1 text-query.asd -tfm http://beta.quicklisp.org/archive/tfm/2019-11-30/tfm-20191130-git.tgz 39947 a86c7c0f808b834cd42557375003bfc1 95a09ff4cf730fe82a9a03a85efb3d9e2bbf7542 tfm-20191130-git core/net.didierverna.tfm.core.asd net.didierverna.tfm.asd setup/net.didierverna.tfm.setup.asd -the-cost-of-nothing http://beta.quicklisp.org/archive/the-cost-of-nothing/2019-11-30/the-cost-of-nothing-20191130-git.tgz 6864 e7b9891f6a3827425124ed8c00b13bab c8f6ee5ed5ee075729d28dcbe354386ba555aab1 the-cost-of-nothing-20191130-git the-cost-of-nothing.asd -thnappy http://beta.quicklisp.org/archive/thnappy/2018-08-31/thnappy-20180831-git.tgz 2879 e399d3a0aea4a4d46b4f3779b083b759 e68599d93d642eb88c3c4ead9a7724c43c34bf5c thnappy-20180831-git thnappy.asd -thorn http://beta.quicklisp.org/archive/thorn/2015-06-08/thorn-20150608-git.tgz 4539 efcc67773fb54b4e4680d50ed5091f9a 436eb3485d54524cc23cc97d1d30ea4f3d1af29b thorn-20150608-git thorn-doc.asd thorn-test.asd thorn.asd -thread-pool http://beta.quicklisp.org/archive/thread-pool/2012-01-07/thread-pool-20120107-git.tgz 3061 9dfcb3dd5692d474d90f7916722d5bf8 5754230b3648ae4d84f80a8cf552518d6851e96b thread-pool-20120107-git thread-pool.asd -thread.comm.rendezvous http://beta.quicklisp.org/archive/thread.comm.rendezvous/2012-10-13/thread.comm.rendezvous-20121013-git.tgz 3295 819e6c2c9fc715f47b9fc1fae4dd9620 fb0ada0703f62f9d2c38cd8d100571b087d6f61f thread.comm.rendezvous-20121013-git thread.comm.rendezvous.asd thread.comm.rendezvous.test.asd -time-interval http://beta.quicklisp.org/archive/time-interval/2019-02-02/time-interval-20190202-git.tgz 3914 be8f598fa583bc02d5aef61c9da05497 2e3b1a01d3aca24e573fdf98ce81b5a15909ce2c time-interval-20190202-git time-interval.asd -timer-wheel http://beta.quicklisp.org/archive/timer-wheel/2018-02-28/timer-wheel-20180228-git.tgz 6804 aecee06490b30b7395bd6bf8e30e293f f5394005e0e5214210a8dd1a0d41fd35674c364d timer-wheel-20180228-git timer-wheel.asd timer-wheel.examples.asd -tinaa http://beta.quicklisp.org/archive/tinaa/2017-12-27/tinaa-20171227-git.tgz 80171 bc067fbe6af7f03f247e93c0d35c5f3a 7cb5eed990ef9deaa609f923c9361840131a90f2 tinaa-20171227-git tinaa-test.asd tinaa.asd -tm http://beta.quicklisp.org/archive/tm/2018-02-28/tm-v0.8.tgz 173992 8c2219879aa24677951a02235855dcf6 dbe34f193e9e3e16b829d8516ef3c510322408c0 tm-v0.8 tm.asd -tmpdir http://beta.quicklisp.org/archive/tmpdir/2019-11-30/tmpdir-20191130-git.tgz 1540 39548e71b34a0a43b2930eb248fe9695 26c38135426f38f3c4b8476b5f1dad1f2382e3e1 tmpdir-20191130-git tmpdir.asd -toadstool http://beta.quicklisp.org/archive/toadstool/2013-06-15/toadstool-20130615-git.tgz 14309 8bd093fb81edf56821b538339c70c1f1 404dd62b14525f642110dfd30dadbe4e753f1e9f toadstool-20130615-git toadstool-tests.asd toadstool.asd -toot http://beta.quicklisp.org/archive/toot/2012-11-25/toot-20121125-git.tgz 57834 569c801b0b9e880977df5ab9743ec23c b97041f2040590e8751eae383532996923ec5ad0 toot-20121125-git toot.asd -tooter http://beta.quicklisp.org/archive/tooter/2019-07-10/tooter-20190710-git.tgz 37879 b53a4836c868a7e2c0008f2d85d4cb98 b9089b0b627fb7378a50fb276b4f186af4530859 tooter-20190710-git tooter.asd -torta http://beta.quicklisp.org/archive/torta/2014-07-13/torta-20140713-git.tgz 126230 5f2ab2b6d6cb48f17dbf147adde1941e 77e116a79f5931c42d675485991dc5d8352beff1 torta-20140713-git torta.asd -towers http://beta.quicklisp.org/archive/towers/2014-12-17/towers-20141217-git.tgz 17597 2af927bf9a75351e0216b45dafef01ce 8949f07d1929307532b2b9ad4009480ea166c808 towers-20141217-git towers.asd -trace-db http://beta.quicklisp.org/archive/trace-db/2019-07-10/trace-db-20190710-git.tgz 52753 4fa5f75f0239ab1e04cf235fe3c0574c 59f7a19923caaceeaab8661b084c99e70485df46 trace-db-20190710-git trace-db.asd -track-best http://beta.quicklisp.org/archive/track-best/2018-10-18/track-best-20181018-git.tgz 6252 e8a45d9ea61867c6873bb5b78018a5f9 96a1746115744d3c733a52b9eaf14a40d9318a08 track-best-20181018-git track-best.asd -trainable-object http://beta.quicklisp.org/archive/trainable-object/2019-12-27/trainable-object-20191227-git.tgz 19230 9db5fb29c21927d7d1aee421e673ee66 bcb41c52a7278aaf9c381b14218eb79617290766 trainable-object-20191227-git trainable-object.asd trainable-object.test.asd -translate http://beta.quicklisp.org/archive/translate/2018-02-28/translate-20180228-git.tgz 6688 95c46dec58c83cd01efd27d60049712f 8660e413ff82b5e83b42bb0d3a64990ee1383db7 translate-20180228-git translate.asd -translate-client http://beta.quicklisp.org/archive/translate-client/2018-02-28/translate-client-20180228-git.tgz 4495 94b7fb3e9836500104348162732512be bdf15a4a38460632c85d3979ef08ea27e79f8c3c translate-client-20180228-git translate-client.asd -transparent-wrap http://beta.quicklisp.org/archive/transparent-wrap/2015-07-09/transparent-wrap-20150709-git.tgz 10282 fbbcfb41c7bdc8e959d4a6716d12fed9 60be87e9f50ecbbde5038341a990ab8e5aaa18f4 transparent-wrap-20150709-git transparent-wrap.asd -treedb http://beta.quicklisp.org/archive/treedb/2016-08-25/treedb-20160825-git.tgz 16294 af216acd41ca7a14497d3f045af39b26 d12e833c2d1c271e6ef49bc189a51ccd8f4edfde treedb-20160825-git doc/treedb.doc.asd tests/treedb.tests.asd treedb.asd -trees http://beta.quicklisp.org/archive/trees/2018-01-31/trees-20180131-git.tgz 20019 a1b156d15d444d114f475f7abc908064 3e5523710bbc6c5d96894e036377fbb4487460f9 trees-20180131-git trees.asd -trivia http://beta.quicklisp.org/archive/trivia/2019-12-27/trivia-20191227-git.tgz 58411 645f0e0fcf57ab37ebd4f0a1b7b05854 2354871dba25e2b875edd4cb9f4ebc6fc416badf trivia-20191227-git trivia.asd trivia.balland2006.asd trivia.benchmark.asd trivia.cffi.asd trivia.level0.asd trivia.level1.asd trivia.level2.asd trivia.ppcre.asd trivia.quasiquote.asd trivia.test.asd trivia.trivial.asd -trivial-arguments http://beta.quicklisp.org/archive/trivial-arguments/2019-07-10/trivial-arguments-20190710-git.tgz 3375 e18fa47699802dee1731e0c2d9903f96 3eac3be70009b856090eaee2c4d217eb702efe81 trivial-arguments-20190710-git trivial-arguments.asd -trivial-backtrace http://beta.quicklisp.org/archive/trivial-backtrace/2019-07-10/trivial-backtrace-20190710-git.tgz 9208 e9035ed00321b24278cbf5449a1aebed 15034f7fba32e86bfa374f97134b0bfda8760e32 trivial-backtrace-20190710-git trivial-backtrace-test.asd trivial-backtrace.asd -trivial-battery http://beta.quicklisp.org/archive/trivial-battery/2019-03-07/trivial-battery-20190307-git.tgz 2248 ccb8f68e7086523a8da2700fab0e5c7d f13fceb155f8e99202ae1d9c99ff0e140b4e4803 trivial-battery-20190307-git trivial-battery.asd -trivial-benchmark http://beta.quicklisp.org/archive/trivial-benchmark/2019-11-30/trivial-benchmark-20191130-git.tgz 14929 8b2be09b1d8312c790006118847261cf aa6d4b7201691f97b4808a34b28b29a1a438ad9b trivial-benchmark-20191130-git trivial-benchmark.asd -trivial-bit-streams http://beta.quicklisp.org/archive/trivial-bit-streams/2019-07-10/trivial-bit-streams-20190710-git.tgz 7667 c08ad7b58a972f45c4939ad6869a9283 819805e50d470ec6b09ee0ea53889f633754408e trivial-bit-streams-20190710-git trivial-bit-streams-tests.asd trivial-bit-streams.asd -trivial-build http://beta.quicklisp.org/archive/trivial-build/2015-12-18/trivial-build-20151218-git.tgz 3150 51479b61f4cbe7a113065b0f3ac50834 654770325c8c5ebd1632430aae2bc3f4ac027fd7 trivial-build-20151218-git trivial-build-test.asd trivial-build.asd -trivial-channels http://beta.quicklisp.org/archive/trivial-channels/2016-04-21/trivial-channels-20160421-git.tgz 2810 7bd8731f8ffbbc61aeaf7fde3309c2a3 2c856642b1ac4006d2f8a1f8bd55d18697c9329e trivial-channels-20160421-git trivial-channels.asd -trivial-clipboard http://beta.quicklisp.org/archive/trivial-clipboard/2019-02-02/trivial-clipboard-20190202-git.tgz 4086 d9b9ee3754e10888ce243172681a0db2 2078c5844dd927ec38e8d7103090b440715dbc32 trivial-clipboard-20190202-git trivial-clipboard-test.asd trivial-clipboard.asd -trivial-cltl2 http://beta.quicklisp.org/archive/trivial-cltl2/2019-07-10/trivial-cltl2-20190710-git.tgz 5067 8114f96b9770a9f0e0a94933918dc171 2530e30e0927283650c2f36c38025edbd84e2473 trivial-cltl2-20190710-git trivial-cltl2.asd -trivial-compress http://beta.quicklisp.org/archive/trivial-compress/2016-04-21/trivial-compress-20160421-git.tgz 2838 8d531a2607e6b206c3bbfe51d003c8b6 d228a5309280c996ceaa25e9234e238359050c16 trivial-compress-20160421-git trivial-compress-test.asd trivial-compress.asd -trivial-continuation http://beta.quicklisp.org/archive/trivial-continuation/2019-10-07/trivial-continuation-20191007-git.tgz 6021 cd66f3f621bd6004b18c8cfb834fa61c b031d2c2d477949c038e14b9a84fb13cba7f5ae6 trivial-continuation-20191007-git trivial-continuation.asd -trivial-debug-console http://beta.quicklisp.org/archive/trivial-debug-console/2015-04-07/trivial-debug-console-20150407-git.tgz 2602 570ce84cfc527c3ce9a66eb9a3e32a33 c78bc7dbf398faba7518f9edc3fa7ef64ac74768 trivial-debug-console-20150407-git trivial-debug-console.asd -trivial-documentation http://beta.quicklisp.org/archive/trivial-documentation/2016-12-04/trivial-documentation-20161204-git.tgz 15596 9f092a90567e4f77dc9bd1d06fa58ed0 be1d89ac255c31e9de3ad7966312cfa1e6cda9e2 trivial-documentation-20161204-git trivial-documentation-test.asd trivial-documentation.asd -trivial-download http://beta.quicklisp.org/archive/trivial-download/2015-12-18/trivial-download-20151218-git.tgz 3819 486d3b0da2d832e3f0a6176e40adc449 c975d97de65d514f66b82ce1f52f4a8dcc8ec68e trivial-download-20151218-git trivial-download-test.asd trivial-download.asd -trivial-dump-core http://beta.quicklisp.org/archive/trivial-dump-core/2017-02-27/trivial-dump-core-20170227-git.tgz 5550 1ba1e853c238b2545002db6ee9530144 8a54cef6a4d0dea05cb5844ebb44f0cf03da762d trivial-dump-core-20170227-git trivial-dump-core.asd -trivial-escapes http://beta.quicklisp.org/archive/trivial-escapes/2018-02-28/trivial-escapes-20180228-git.tgz 6079 b8afeb445f9a3fd8e046d5899fd21e2e 102cfd6ba8f9af527302062704cbd04974848bae trivial-escapes-20180228-git test/trivial-escapes-test.asd trivial-escapes.asd -trivial-exe http://beta.quicklisp.org/archive/trivial-exe/2015-12-18/trivial-exe-20151218-git.tgz 1983 d85a8e198c31aa3d6c07351a41732e49 a860186969c29240babffd1c0e2209635a5e2e3a trivial-exe-20151218-git trivial-exe-test.asd trivial-exe.asd -trivial-extensible-sequences http://beta.quicklisp.org/archive/trivial-extensible-sequences/2019-08-13/trivial-extensible-sequences-20190813-git.tgz 15428 7001347e293ccd5cd15026e0a7ec4158 0f339cefb94cc1225113d7f64ebccbb87e28c8c0 trivial-extensible-sequences-20190813-git trivial-extensible-sequences.asd -trivial-extract http://beta.quicklisp.org/archive/trivial-extract/2016-04-21/trivial-extract-20160421-git.tgz 3545 b9c3ede33a7f4d565f6916a52a6ea708 c89c03f8cd08876c412a3ae40b0ac763b1930635 trivial-extract-20160421-git trivial-extract-test.asd trivial-extract.asd -trivial-features http://beta.quicklisp.org/archive/trivial-features/2019-07-10/trivial-features-20190710-git.tgz 10765 3907b044e00a812ebae989134fe57c55 67b7502615c36002f611536020ee5ffb3e23513a trivial-features-20190710-git trivial-features-tests.asd trivial-features.asd -trivial-file-size http://beta.quicklisp.org/archive/trivial-file-size/2018-01-31/trivial-file-size-20180131-git.tgz 3254 ac921679334dd8bd12f927f0bd806f4b cf8f78bbbbb18e547dd47cff487ac30a4f356c43 trivial-file-size-20180131-git trivial-file-size.asd -trivial-garbage http://beta.quicklisp.org/archive/trivial-garbage/2019-05-21/trivial-garbage-20190521-git.tgz 10438 38fb70797069d4402c6b0fe91f4ca5a8 d9013ebd6a0ea3bd5a23dc9368fb0e318d651fcd trivial-garbage-20190521-git trivial-garbage.asd -trivial-gray-streams http://beta.quicklisp.org/archive/trivial-gray-streams/2018-10-18/trivial-gray-streams-20181018-git.tgz 8024 0a9f564079dc41ce10d7869d82cc0952 27c3dc766e7c8fed3051403e0c38468a235f6acf trivial-gray-streams-20181018-git trivial-gray-streams-test.asd trivial-gray-streams.asd -trivial-hashtable-serialize http://beta.quicklisp.org/archive/trivial-hashtable-serialize/2019-10-07/trivial-hashtable-serialize-20191007-git.tgz 4010 9983c4dff65eb69b0eadb067cf03a834 79afe82d413cd42fbcd64a6f66a7bdb0f15ad245 trivial-hashtable-serialize-20191007-git trivial-hashtable-serialize.asd -trivial-http http://beta.quicklisp.org/archive/trivial-http/2011-02-19/trivial-http-20110219-http.tgz 12646 9f6b15eb07fd99fd0b6b69387a520a4f c71ab658c7c6a98eefdd9a69f8d358a9752bb1dc trivial-http-20110219-http trivial-http-test.asd trivial-http.asd -trivial-indent http://beta.quicklisp.org/archive/trivial-indent/2019-10-07/trivial-indent-20191007-git.tgz 3419 d0489ff824d58c03b5c2a9b16279f583 480bc42651968cf7b9566c190c83d39a42be03d3 trivial-indent-20191007-git trivial-indent.asd -trivial-irc http://beta.quicklisp.org/archive/trivial-irc/2017-10-19/trivial-irc-20171019-git.tgz 22705 e63a9436c7db593d5aab25d4eb89679b 1fd2165891ad015f7d978e275dc7f99063a605fa trivial-irc-20171019-git trivial-irc-echobot.asd trivial-irc.asd -trivial-json-codec http://beta.quicklisp.org/archive/trivial-json-codec/2019-10-07/trivial-json-codec-20191007-git.tgz 8065 1c55c7d97d49750189d5bd9fbc5afd15 2261bc37879f3f0be83fd74bcdc6964ebec13dbe trivial-json-codec-20191007-git trivial-json-codec.asd -trivial-jumptables http://beta.quicklisp.org/archive/trivial-jumptables/2019-11-30/trivial-jumptables_1.1.tgz 12374 f8ef2c3b2659c6874a0d3f5555b353af 83d069ac067e1a258ad39ee3b5d0cc437f33469f trivial-jumptables_1.1 tests/trivial-jumptables_tests.asd trivial-jumptables.asd -trivial-lazy http://beta.quicklisp.org/archive/trivial-lazy/2015-07-09/trivial-lazy-20150709-git.tgz 1714 ebb499de9ea8b79b0d580222d36ddee9 e9b99256aeec0f0184f3ae5cf20a9e294c1dd972 trivial-lazy-20150709-git trivial-lazy.asd -trivial-ldap http://beta.quicklisp.org/archive/trivial-ldap/2018-07-11/trivial-ldap-20180711-git.tgz 28258 355759d2c532a377b0ec3c0a689548fd 160ff42b50f8f664b029cb53e598301cd8f2d7f4 trivial-ldap-20180711-git trivial-ldap.asd -trivial-left-pad http://beta.quicklisp.org/archive/trivial-left-pad/2019-08-13/trivial-left-pad-20190813-git.tgz 6592 04a7ef287111319605989f582bf7ce4f 544fa2a3c678fe11f7a5a65e7f3e591abf9bcd5e trivial-left-pad-20190813-git trivial-left-pad.asd -trivial-macroexpand-all http://beta.quicklisp.org/archive/trivial-macroexpand-all/2017-10-23/trivial-macroexpand-all-20171023-git.tgz 1968 9cec494869344eb64ebce802c01928c5 87006c97029637389a4371efc28ba43ececfc315 trivial-macroexpand-all-20171023-git trivial-macroexpand-all.asd -trivial-main-thread http://beta.quicklisp.org/archive/trivial-main-thread/2019-07-10/trivial-main-thread-20190710-git.tgz 6114 ab95906f1831aa5b40f271eebdfe11a3 899bc9fa1f863baeece94f9aea0d7f6b7385dbbb trivial-main-thread-20190710-git trivial-main-thread.asd -trivial-method-combinations http://beta.quicklisp.org/archive/trivial-method-combinations/2019-11-30/trivial-method-combinations-20191130-git.tgz 1502 810ed9f3459831000b175970a35c0a0f 323703b64bd61e9dbe911d601c8360e4500c0057 trivial-method-combinations-20191130-git trivial-method-combinations.asd -trivial-mimes http://beta.quicklisp.org/archive/trivial-mimes/2019-07-10/trivial-mimes-20190710-git.tgz 20215 b7fa1cb9382a2a562343c6ca87b1b4ac 9ab070fa12b583fee21df36d50f102b29ef648c5 trivial-mimes-20190710-git trivial-mimes.asd -trivial-mmap http://beta.quicklisp.org/archive/trivial-mmap/2018-07-11/trivial-mmap-20180711-git.tgz 3387 17bfc83b320be648da993a83991f911a efaef0202a10f2416443adea49d225bc9da3e3ff trivial-mmap-20180711-git trivial-mmap.asd -trivial-monitored-thread http://beta.quicklisp.org/archive/trivial-monitored-thread/2019-10-07/trivial-monitored-thread-20191007-git.tgz 6500 2ae90d97c0abe51cd14fc59427233ced 482f9c9a177bd73291fdfc24b9e21c5ae48751ce trivial-monitored-thread-20191007-git trivial-monitored-thread.asd -trivial-msi http://beta.quicklisp.org/archive/trivial-msi/2016-02-08/trivial-msi-20160208-git.tgz 2142 c2b860a6959e61707142419756f7cf3e 0d6d8cf48d175a6616a245801fa44a165baee4c4 trivial-msi-20160208-git trivial-msi-test.asd trivial-msi.asd -trivial-nntp http://beta.quicklisp.org/archive/trivial-nntp/2016-12-04/trivial-nntp-20161204-git.tgz 4937 f03c13ee62ce27792941d9f9d8cd7c43 b311c46a549c4dbffaed13b8c338ce976ad7b892 trivial-nntp-20161204-git trivial-nntp.asd -trivial-object-lock http://beta.quicklisp.org/archive/trivial-object-lock/2019-10-07/trivial-object-lock-20191007-git.tgz 128346 c0fe973e9a00faf5286895d18952c231 6e0a1fc45e98e903b54182cf2ac1d01bee87993c trivial-object-lock-20191007-git trivial-object-lock.asd -trivial-octet-streams http://beta.quicklisp.org/archive/trivial-octet-streams/2013-01-28/trivial-octet-streams-20130128-git.tgz 3452 00d2c8cd41b5ace65519f366bc6542fb e0b865e9b1787e6f91b5d5e6c454a1a5890e077e trivial-octet-streams-20130128-git trivial-octet-streams.asd -trivial-open-browser http://beta.quicklisp.org/archive/trivial-open-browser/2016-08-25/trivial-open-browser-20160825-git.tgz 1176 038c4cd110fa9b34a77fe655bc1e35ba bac02728c1ed3037f88b89764dacf204bb8a1b4a trivial-open-browser-20160825-git trivial-open-browser.asd -trivial-openstack http://beta.quicklisp.org/archive/trivial-openstack/2016-06-28/trivial-openstack-20160628-git.tgz 9849 fd4cea1d1a6e3079f4778c226fbb08b1 d7bb60c337b47ad21205099b8ac38efb7b48bd59 trivial-openstack-20160628-git trivial-openstack-test.asd trivial-openstack.asd -trivial-package-local-nicknames http://beta.quicklisp.org/archive/trivial-package-local-nicknames/2019-11-30/trivial-package-local-nicknames-20191130-git.tgz 3681 703a57785a11477361ac4253aab0698e 56036aae9c02f10390e91c6c141e9a15bf0e0462 trivial-package-local-nicknames-20191130-git trivial-package-local-nicknames.asd -trivial-package-manager http://beta.quicklisp.org/archive/trivial-package-manager/2017-12-27/trivial-package-manager-20171227-git.tgz 6042 161ae810ca261f04aae86068365839da bdda9666a328e2d6e8278fceb8d6b9dff46e1c31 trivial-package-manager-20171227-git trivial-package-manager.asd trivial-package-manager.test.asd -trivial-pooled-database http://beta.quicklisp.org/archive/trivial-pooled-database/2019-10-07/trivial-pooled-database-20191007-git.tgz 6240 4649ea77d57c2e1a5a01656f8f480eb9 2d7e41c5267119fb0a7a10f77c115ece76804b29 trivial-pooled-database-20191007-git trivial-pooled-database.asd -trivial-project http://beta.quicklisp.org/archive/trivial-project/2017-08-30/trivial-project-quicklisp-9e3fe231-git.tgz 7676 1702cda33bf5d228c4f865f4ca2f28da f9050c412d5c9851d3f384000a6b8b8eaab82473 trivial-project-quicklisp-9e3fe231-git trivial-project.asd -trivial-raw-io http://beta.quicklisp.org/archive/trivial-raw-io/2014-12-17/trivial-raw-io-20141217-git.tgz 2861 627f83a54a94278675c03c14934b272a f89b8c4e06554471bfcb9216dd2eb385b5dd8e8a trivial-raw-io-20141217-git trivial-raw-io.asd -trivial-renamer http://beta.quicklisp.org/archive/trivial-renamer/2017-08-30/trivial-renamer-quicklisp-1282597d-git.tgz 3794 ff77e08decb7ca7b5b18e7b03c6cb05b 071cd2c4f5eb569ca958dbfd91a8effb3f0df647 trivial-renamer-quicklisp-1282597d-git trivial-renamer.asd -trivial-rfc-1123 http://beta.quicklisp.org/archive/trivial-rfc-1123/2017-01-24/trivial-rfc-1123-20170124-git.tgz 5622 a91a7fc1fae5a5da9e34ff58b72236e7 8fd5bfe63f661ab64c368a0831c81bedf9f0d015 trivial-rfc-1123-20170124-git trivial-rfc-1123.asd -trivial-shell http://beta.quicklisp.org/archive/trivial-shell/2018-02-28/trivial-shell-20180228-git.tgz 14473 d7b93648abd06be95148d43d09fa2ed0 cea06f83f2a0a7f17ba75b612535dc2676296025 trivial-shell-20180228-git trivial-shell-test.asd trivial-shell.asd -trivial-signal http://beta.quicklisp.org/archive/trivial-signal/2019-07-10/trivial-signal-20190710-git.tgz 13446 835a39ed6f968c22862be53487bab640 f1eda45929be115101e995590fefd4fcf8abd6f3 trivial-signal-20190710-git trivial-signal.asd -trivial-sockets http://beta.quicklisp.org/archive/trivial-sockets/2019-01-07/trivial-sockets-20190107-git.tgz 11603 bd56e19a9716b8beb0d482d38fc16472 da768132611e7d7ff0b44212a8011bf17b45e99f trivial-sockets-20190107-git trivial-sockets.asd -trivial-ssh http://beta.quicklisp.org/archive/trivial-ssh/2019-11-30/trivial-ssh-20191130-git.tgz 16118 d1b5dcc547de445a4fde156b66942ab1 001183c4093a3ff5b6133f9f81327f062842d8a5 trivial-ssh-20191130-git trivial-ssh-libssh2.asd trivial-ssh-test.asd trivial-ssh.asd -trivial-string-template http://beta.quicklisp.org/archive/trivial-string-template/2016-10-31/trivial-string-template-20161031-git.tgz 9755 d9836199d9f7a53e1c3e7625c08a6208 cf82a2302fffcbbc86b385e73aba958fd26a6044 trivial-string-template-20161031-git trivial-string-template-test.asd trivial-string-template.asd -trivial-swank http://beta.quicklisp.org/archive/trivial-swank/2018-02-28/trivial-swank-quicklisp-ab90d90f-git.tgz 5553 a5ca451d2b9c5bf338f16f5bbf52fd14 840a996a64f567f46af09caa8213fc7b38fd184a trivial-swank-quicklisp-ab90d90f-git trivial-swank.asd -trivial-tco http://beta.quicklisp.org/archive/trivial-tco/2013-10-03/trivial-tco-20131003-git.tgz 2541 9123b9c05aec84967cb9db6648c958f4 2416c68735324bfec2f53d16abfd76cc29846861 trivial-tco-20131003-git trivial-tco-test.asd trivial-tco.asd -trivial-thumbnail http://beta.quicklisp.org/archive/trivial-thumbnail/2019-07-10/trivial-thumbnail-20190710-git.tgz 5331 c8bfe5f627830e849104d7e0ba54bca6 86865b4054ada83afe01f1a5fbebf35076328215 trivial-thumbnail-20190710-git trivial-thumbnail.asd -trivial-timeout http://beta.quicklisp.org/archive/trivial-timeout/2018-01-31/trivial-timeout-20180131-git.tgz 8556 43a318a74a174a0a5bb0921f650f0727 afe9bd2217f8ebc0c67c9c66d4b3d76a678a4d98 trivial-timeout-20180131-git trivial-timeout.asd -trivial-timer http://beta.quicklisp.org/archive/trivial-timer/2019-10-07/trivial-timer-20191007-git.tgz 5648 5da2440d5bf9b090992aa9df04751858 337112f3b0548401daaa336c0ad865ff259128e0 trivial-timer-20191007-git trivial-timer.asd -trivial-timers http://beta.quicklisp.org/archive/trivial-timers/2010-10-06/trivial-timers-20101006-http.tgz 4064 c2191b98e93888880e7b99c5f3db050e caf09574cc58601410b46b2b03654f0e7742347b trivial-timers-20101006-http trivial-timers.asd -trivial-types http://beta.quicklisp.org/archive/trivial-types/2012-04-07/trivial-types-20120407-git.tgz 3228 b14dbe0564dcea33d8f4e852a612d7db acf9e5a4b0ef99bdcb121cfbc8f07c647c302e57 trivial-types-20120407-git trivial-types.asd -trivial-update http://beta.quicklisp.org/archive/trivial-update/2018-01-31/trivial-update-20180131-git.tgz 2718 d8c0e6814b49272876ea768cd1e46e2f 4b672e0127418b00f5c12a21f24f5db7cc8af279 trivial-update-20180131-git trivial-update.asd -trivial-utf-8 http://beta.quicklisp.org/archive/trivial-utf-8/2011-10-01/trivial-utf-8-20111001-darcs.tgz 6055 0206c4ba7a6c0b9b23762f244aca6614 a6eb987246e5f233c6b9c4b8b15edbbe2770d848 trivial-utf-8-20111001-darcs trivial-utf-8.asd -trivial-utilities http://beta.quicklisp.org/archive/trivial-utilities/2019-10-07/trivial-utilities-20191007-git.tgz 7187 bb0a1b0c7edd5783ff7e2717fde2df60 9a64bfa3b0c977f7d4f4c5856be3a1853a76c3a3 trivial-utilities-20191007-git trivial-utilities.asd -trivial-variable-bindings http://beta.quicklisp.org/archive/trivial-variable-bindings/2019-10-07/trivial-variable-bindings-20191007-git.tgz 4594 13e84f4912598f04d5da6a4bd4c7be5f 8bfa3f68d6b82a13767f88f5595cecc8a6df2d3a trivial-variable-bindings-20191007-git trivial-variable-bindings.asd -trivial-wish http://beta.quicklisp.org/archive/trivial-wish/2017-06-30/trivial-wish-quicklisp-910afeea-git.tgz 3604 37c6d054b8047635f893bcca3b20043f 477cbc87778ab161717f3247495b99ce82d26fe0 trivial-wish-quicklisp-910afeea-git trivial-wish.asd -trivial-with http://beta.quicklisp.org/archive/trivial-with/2017-08-30/trivial-with-quicklisp-2fd8ca54-git.tgz 1554 8b816ed9e2c29f3f8015efb749417e1f ee005208b66ede42608dd15837b701d270932620 trivial-with-quicklisp-2fd8ca54-git trivial-with.asd -trivial-ws http://beta.quicklisp.org/archive/trivial-ws/2018-01-31/trivial-ws-20180131-git.tgz 2798 d94a58b084bfae82b57533be1ab60d22 6b21f895b2401e4b6ba676597db3398d4d45eeaa trivial-ws-20180131-git trivial-ws-client.asd trivial-ws-test.asd trivial-ws.asd -trivial-yenc http://beta.quicklisp.org/archive/trivial-yenc/2016-12-04/trivial-yenc-20161204-git.tgz 24777 3e30073ec4a3aac9eb79bcedd773afd3 63208129d025e58445a65f7da343aaf5a2661d96 trivial-yenc-20161204-git trivial-yenc.asd -trivialib.bdd http://beta.quicklisp.org/archive/trivialib.bdd/2018-03-28/trivialib.bdd-20180328-git.tgz 5701 13f189714290a75342f159476d9df3d1 f71adf02c9caabe16c2f23318d992d67d7c2b25a trivialib.bdd-20180328-git trivialib.bdd.asd trivialib.bdd.test.asd -trivialib.type-unify http://beta.quicklisp.org/archive/trivialib.type-unify/2016-08-25/trivialib.type-unify-20160825-git.tgz 6556 039773d2b44f8c1fd8f517288b88a4ff 6bd076666d819c7e6443509bd6405d7e5d3704c9 trivialib.type-unify-20160825-git trivialib.type-unify.asd trivialib.type-unify.test.asd -twfy http://beta.quicklisp.org/archive/twfy/2013-04-20/twfy-20130420-git.tgz 6872 970b20e4c143014bf2faf5d470e3cf72 3840c3c70a63c07bf225bea595bc196ed243b17c twfy-20130420-git twfy.asd -type-i http://beta.quicklisp.org/archive/type-i/2019-12-27/type-i-20191227-git.tgz 5932 af344179d3f97b836d1e3106f8d1c306 ef2cd7a2e099a2d1c1bc1f5d913a711872735f1b type-i-20191227-git type-i.asd type-i.test.asd -type-r http://beta.quicklisp.org/archive/type-r/2019-12-27/type-r-20191227-git.tgz 10627 9dd5400746e6c8352fc4248e5384669a 82c0916f793c2f678770c2c0152dbd26af130259 type-r-20191227-git type-r.asd type-r.test.asd -uax-14 http://beta.quicklisp.org/archive/uax-14/2019-10-07/uax-14-20191007-git.tgz 130672 6b9518e234152ca5cb540e2ca6b81c17 e9838d6abfd6bc21873d737cc59eacc4aee37b8e uax-14-20191007-git uax-14-test.asd uax-14.asd -uax-9 http://beta.quicklisp.org/archive/uax-9/2019-10-07/uax-9-20191007-git.tgz 1794867 dc653d87a4ddfb75efec85030a074cbc 7cdb719c1cdc1b1724860826c9436f71db9898c8 uax-9-20191007-git uax-9-test.asd uax-9.asd -ubiquitous http://beta.quicklisp.org/archive/ubiquitous/2019-07-10/ubiquitous-20190710-git.tgz 43252 f1300d3ed47beda6abc92ef0d85a8eee 30b0eb81f56864c4e07a916d94a849c72577cd9e ubiquitous-20190710-git ubiquitous-concurrent.asd ubiquitous.asd -ucons http://beta.quicklisp.org/archive/ucons/2019-03-07/ucons-20190307-git.tgz 5200 44d78424883fa78514e14bfd24ddde67 d8fbdea632c3050f1a4bbd2f63b74e1cc0f626c7 ucons-20190307-git code/ucons.asd -ucw http://beta.quicklisp.org/archive/ucw/2016-02-08/ucw-20160208-darcs.tgz 164029 b5a4f28e311b70010bd98be79e544c48 d461b81886f15d368a521ba254c282f224638623 ucw-20160208-darcs ucw-core.asd ucw.asd -uffi http://beta.quicklisp.org/archive/uffi/2018-02-28/uffi-20180228-git.tgz 179928 b0dfb2f966912f4797327948aa7e9119 3fa7b46bc21bcbbc59528bf4c2ea9bda84f57088 uffi-20180228-git uffi-tests.asd uffi.asd -ufo http://beta.quicklisp.org/archive/ufo/2016-12-04/ufo-20161204-git.tgz 5130 bb490f5b3086088cab2746a7c7a102eb ff24b84a9e8f1118e87b77fe8edb002005b91883 ufo-20161204-git ufo-test.asd ufo.asd -ugly-tiny-infix-macro http://beta.quicklisp.org/archive/ugly-tiny-infix-macro/2016-08-25/ugly-tiny-infix-macro-20160825-git.tgz 8284 ed38d0a89cf772f96244934a78bc1ec4 3d5e3f693c1f45322d1c7f6d117fa96a3d9d4557 ugly-tiny-infix-macro-20160825-git ugly-tiny-infix-macro.asd -uiop http://beta.quicklisp.org/archive/uiop/2019-05-21/uiop-3.3.3.tgz 99847 64d561117f048ad8621eff7a6173d65e c044515fda0bcb9d12c1b53ba47f1aee03031f49 uiop-3.3.3 asdf-driver.asd uiop.asd -umbra http://beta.quicklisp.org/archive/umbra/2019-12-27/umbra-20191227-git.tgz 24348 7a8a74b32f35a6541c115af22f20a04e 716e497a8588bd0de7b3c30fa9f5decf78ce5dc1 umbra-20191227-git umbra.asd -umlisp http://beta.quicklisp.org/archive/umlisp/2018-02-28/umlisp-20180228-git.tgz 46926 26b8f39fc0e8833f389a322c41bb7a30 a7fbd8c2636c3dbc182355c9637fb7c90bcd1351 umlisp-20180228-git umlisp-tests.asd umlisp.asd -umlisp-orf http://beta.quicklisp.org/archive/umlisp-orf/2015-09-23/umlisp-orf-20150923-git.tgz 31495 401d1d133f874eccafc76426495bdfc6 340233287e9c9c427e2d0260eb2cb457cb494a56 umlisp-orf-20150923-git umlisp-orf.asd -unicly http://beta.quicklisp.org/archive/unicly/2012-09-09/unicly-20120909-git.tgz 101223 bb1940ca1f2a88b46863874742c7e469 74a73d2f1507e0bd808aefffa5e7519ccadcdfbb unicly-20120909-git unicly.asd -unit-formula http://beta.quicklisp.org/archive/unit-formula/2018-07-11/unit-formula-20180711-git.tgz 22478 4739cdb264153430300215eec7d8a766 43c9faa30a3d9bf36d81be4df653f66c5104a8c2 unit-formula-20180711-git unit-formulas.asd -unit-test http://beta.quicklisp.org/archive/unit-test/2012-05-20/unit-test-20120520-git.tgz 5026 ffcde1c03dd33862cd4f7288649c3cbc a90ba788826db66fb183ef221a2bd57550d66d51 unit-test-20120520-git unit-test.asd -universal-config http://beta.quicklisp.org/archive/universal-config/2018-04-30/universal-config-20180430-git.tgz 18717 ea3d382afa8904aa76d6e3131c89a1b8 b177d9d562fe68db71f805451e6d7e357647d055 universal-config-20180430-git universal-config.asd -unix-options http://beta.quicklisp.org/archive/unix-options/2015-10-31/unix-options-20151031-git.tgz 11220 3bbdeafbef3e7a2e94b9756bf173f636 64c26167d493cca5c981c1c9a3f923f7406d6e25 unix-options-20151031-git unix-options.asd -unix-opts http://beta.quicklisp.org/archive/unix-opts/2018-04-30/unix-opts-20180430-git.tgz 11405 2875ea0a1f5c49ef2697bb1046c4c4e5 4a650a081079badf6f7e93f4f50f5efa2ea77dae unix-opts-20180430-git unix-opts-tests.asd unix-opts.asd -uri-template http://beta.quicklisp.org/archive/uri-template/2019-08-13/uri-template-1.3.1.tgz 20667 2819c38acf5408c90ef2c4f12bfaf73e 42d350f11de6975925bd1aba0878e322836b8817 uri-template-1.3.1 uri-template.asd uri-template.test.asd -url-rewrite http://beta.quicklisp.org/archive/url-rewrite/2017-12-27/url-rewrite-20171227-git.tgz 12733 a27f51e1cd3b62263386c02b07b754b5 16fe74d55e44c734edc7286ac793686150721520 url-rewrite-20171227-git url-rewrite.asd -userial http://beta.quicklisp.org/archive/userial/2011-06-19/userial_0.8.2011.06.02.tgz 25305 18ca2d20cbb483ddb2cb6712387384dc 358b810d26b835ff5a26e1be33aeb6721801d94d userial_0.8.2011.06.02 userial-tests.asd userial.asd -usocket http://beta.quicklisp.org/archive/usocket/2019-12-27/usocket-0.8.3.tgz 85851 b1103034f32565487ab3b6eb92c0ca2b 12cc3af115d1d393cad4eae8e9b3e3aa123617ed usocket-0.8.3 usocket-server.asd usocket-test.asd usocket.asd -utilities.binary-dump http://beta.quicklisp.org/archive/utilities.binary-dump/2018-12-10/utilities.binary-dump-20181210-git.tgz 13155 2f2ae5e2669f8d4f3e0bbea638cf473f 437ea86b8f923e9929ffc644beebc1e687433e9f utilities.binary-dump-20181210-git utilities.binary-dump.asd -utilities.print-items http://beta.quicklisp.org/archive/utilities.print-items/2019-08-13/utilities.print-items-20190813-git.tgz 10205 0f26580bb5d3587ed1815f70976b2a0a 6ac5606c1d28cb88aa5f1c3e861653d738b756dc utilities.print-items-20190813-git utilities.print-items.asd -utilities.print-tree http://beta.quicklisp.org/archive/utilities.print-tree/2017-12-27/utilities.print-tree-20171227-git.tgz 9725 5a730c9e31eeaf14dd40a04fcb1c126e a9d3766bf42b8ffbfa90400e62430cd9612ab7c7 utilities.print-tree-20171227-git utilities.print-tree.asd -utility http://beta.quicklisp.org/archive/utility/2019-02-02/utility-20190202-git.tgz 5158 55e9e5ba352fe19b956af04fa4dc19bc 62360ca825f0bbbbaf2d244698a01cbf75f6e86e utility-20190202-git utility.asd -utility-arguments http://beta.quicklisp.org/archive/utility-arguments/2016-12-04/utility-arguments-20161204-git.tgz 8656 0f60552f326f7164cac4b957e4d48099 9cdfeb9cad7d4e0d84c18ac8f895ce7561bf62e4 utility-arguments-20161204-git utility-arguments.asd -utils-kt http://beta.quicklisp.org/archive/utils-kt/2018-03-28/utils-kt-20180328-git.tgz 17087 d953652f3e3d5bfa076af8d99abf8b6f bd13212a6d0d1e3538d9e0e21fe6d555ca461ee1 utils-kt-20180328-git utils-kt.asd -utm http://beta.quicklisp.org/archive/utm/2018-10-18/utm-20181018-git.tgz 5031 947c9a1da25a77c21cf9417245c0d170 d9f0506f6eb45e71215c986c569ed1d5b5f78331 utm-20181018-git utm.asd utm.test.asd -uuid http://beta.quicklisp.org/archive/uuid/2018-08-31/uuid-20180831-git.tgz 22230 ad7c7cbe9889e1ccd6aea7e63a230919 dbf0542e03040e75c3583c69aa252b5575446d17 uuid-20180831-git uuid.asd -varjo http://beta.quicklisp.org/archive/varjo/2019-10-07/varjo-release-quicklisp-6150bdcb-git.tgz 335430 d7a1a178eb64d77ee41be43c5c62b415 ee6c88aab96f8a3f9d5bf712ef5dde106c46e2ee varjo-release-quicklisp-6150bdcb-git varjo.asd varjo.import.asd varjo.tests.asd -vas-string-metrics http://beta.quicklisp.org/archive/vas-string-metrics/2016-02-08/vas-string-metrics-20160208-git.tgz 6807 5f38d4ee241c11286be6147f481e7fd0 f8d0b6752ab519cc94a92c2371aca239867a4b9f vas-string-metrics-20160208-git test.vas-string-metrics.asd vas-string-metrics.asd -vecto http://beta.quicklisp.org/archive/vecto/2017-12-27/vecto-1.5.tgz 70758 69e6b2f7fa10066d50f9134942afad73 e5c820e88138ed60294d2987002a523ce37e2b02 vecto-1.5 vecto.asd vectometry/vectometry.asd -vector http://beta.quicklisp.org/archive/vector/2013-01-28/vector-20130128-git.tgz 13555 d00644c19ce7e0d1302acda0bf238081 042f916e4c5c4648ab2b8e2d41f164783563522a vector-20130128-git com.elbeno.vector.asd -vectors http://beta.quicklisp.org/archive/vectors/2017-12-27/vectors-20171227-git.tgz 4968 413caa1cced2681421c9ee3438079a7c a52d5b2e5ff875860d90cd76f8cf63650041e60a vectors-20171227-git vectors.asd -verbose http://beta.quicklisp.org/archive/verbose/2019-10-07/verbose-20191007-git.tgz 61584 e3c00fd4bf624d2c6982e1fc4ff2f410 c803731cb2f4bada32b942a19a83034d5b6c0b35 verbose-20191007-git verbose.asd -vernacular http://beta.quicklisp.org/archive/vernacular/2019-11-30/vernacular-20191130-git.tgz 40968 8cd9c408b36fb1a34616cb2d35341cfa f947b87120806fe045a2641f04e0e0be2b3b3055 vernacular-20191130-git vernacular.asd -verrazano http://beta.quicklisp.org/archive/verrazano/2012-09-09/verrazano-20120909-darcs.tgz 154093 fdb516677e8414b3400fd8dd6f91817b 3dfe039d928da642c40544b7418fcc8929a43dae verrazano-20120909-darcs verrazano-runtime.asd verrazano.asd -vertex http://beta.quicklisp.org/archive/vertex/2015-06-08/vertex-20150608-git.tgz 3549 f0e1a725b6733155306c4dd9d8245ea8 27473fcccbf03bd3a904a3c0d04b8c40413c514d vertex-20150608-git vertex-test.asd vertex.asd -vgplot http://beta.quicklisp.org/archive/vgplot/2018-12-10/vgplot-20181210-git.tgz 18197 58711ed4482a29cdc31a3434f59ade7b 0fb4df3cdd8986b89ef01a21bddde9ce24b93874 vgplot-20181210-git vgplot.asd -vom http://beta.quicklisp.org/archive/vom/2016-08-25/vom-20160825-git.tgz 4286 ad16bdc0221b08de371be6ce25ce3d47 4618a41b412c27f8a543c70bef09b49d68d9b1f7 vom-20160825-git vom.asd -water http://beta.quicklisp.org/archive/water/2019-01-07/water-20190107-git.tgz 2387 8340d15004bc9b07d822eb08d73846d7 679bc44d0f73f8963f5ced8211c3abd45e7cb8b8 water-20190107-git water.asd -weblocks http://beta.quicklisp.org/archive/weblocks/2018-02-28/weblocks-20180228-git.tgz 312275 b6f3ca9a3ded521dafa271773a659883 e416f64744e54eb0e7cb6e199c09d3b797ea21b3 weblocks-20180228-git contrib/jwr/yui/weblocks-yui.asd contrib/s11001001/weblocks-s11.asd contrib/yarek/examples/weblocks-demo-popover/weblocks-demo-popover.asd contrib/yarek/weblocks-yarek.asd weblocks-scripts.asd weblocks-test.asd weblocks-util.asd weblocks.asd -weblocks-examples http://beta.quicklisp.org/archive/weblocks-examples/2017-04-03/weblocks-examples-20170403-git.tgz 375952 1b9270e0836945d03becda9cdb5187a6 ed2905772b09a5f2b2a053c3e6c080f8384e45bd weblocks-examples-20170403-git simple-blog/simple-blog.asd weblocks-clsql-demo/weblocks-clsql-demo.asd weblocks-demo/weblocks-demo.asd -weblocks-prototype-js http://beta.quicklisp.org/archive/weblocks-prototype-js/2016-09-29/weblocks-prototype-js-20160929-git.tgz 90118 d0771a1127d33de4a5151f53e728dd1c 507c4195da245c61e9cbd80863039b51661b8dc7 weblocks-prototype-js-20160929-git weblocks-prototype-js.asd -weblocks-stores http://beta.quicklisp.org/archive/weblocks-stores/2016-12-08/weblocks-stores-20161208-git.tgz 25350 e1af85f0729db0461ae83c659b2532cd 55f2582051f6490ec3e505ddc8c81edb063794c8 weblocks-stores-20161208-git src/store/clsql/weblocks-clsql.asd src/store/custom/weblocks-custom.asd src/store/memory/weblocks-memory.asd src/store/montezuma/weblocks-montezuma.asd src/store/perec/weblocks-perec.asd src/store/postmodern/weblocks-postmodern.asd src/store/prevalence/weblocks-prevalence.asd weblocks-store-test.asd weblocks-stores.asd -weblocks-tree-widget http://beta.quicklisp.org/archive/weblocks-tree-widget/2014-12-17/weblocks-tree-widget-20141217-git.tgz 10153 5b1d46fcd648d745bbaff396d3f36146 3c7ebac35e2c49ca5f288b84449f247475450854 weblocks-tree-widget-20141217-git weblocks-tree-widget.asd -weblocks-utils http://beta.quicklisp.org/archive/weblocks-utils/2017-01-24/weblocks-utils-20170124-git.tgz 15494 6434a0c9e0384261c38a620b4beeca8a d73a491d6787b8338f269427c1d0e740e5de042b weblocks-utils-20170124-git weblocks-utils.asd -websocket-driver http://beta.quicklisp.org/archive/websocket-driver/2019-01-07/websocket-driver-20190107-git.tgz 11394 d1504b09817ad229459d33120e9c52a1 7a704d461b3cde4dd89b4eab9d738a52bfcdae31 websocket-driver-20190107-git websocket-driver-base.asd websocket-driver-client.asd websocket-driver-server.asd websocket-driver.asd -weft http://beta.quicklisp.org/archive/weft/2018-02-28/weft-20180228-git.tgz 6282 ec7196f159294035d3c06b5723920058 d9ea5ff22d830c1f0deb6fd047e4b62ec280c74c weft-20180228-git weft.asd -westbrook http://beta.quicklisp.org/archive/westbrook/2018-01-31/westbrook-20180131-git.tgz 3249 43e514336921135f6fc3c1b3063eaf4b 97ed8af62728b92027a7321387a64b918475ca7c westbrook-20180131-git westbrook-tests.asd westbrook.asd -what3words http://beta.quicklisp.org/archive/what3words/2016-12-04/what3words-20161204-git.tgz 5600 54303b21497ffca394575c7376c8b9f3 7b37b1c4c32ab419d4f07cf6f1798f4a0b69b88f what3words-20161204-git what3words.asd -which http://beta.quicklisp.org/archive/which/2016-04-21/which-20160421-git.tgz 2063 d352101dca7f6e985c0e437bcdb6fe40 528a7fdbb3c1485e5685145fd0023ece6a9b32c5 which-20160421-git which-test.asd which.asd -whofields http://beta.quicklisp.org/archive/whofields/2018-08-31/whofields-20180831-git.tgz 5512 5679091e30971df0d7aae59146a3b1c6 520ef39d46eed4734d891be27a44fadd80b54ae4 whofields-20180831-git whofields.asd -wild-package-inferred-system http://beta.quicklisp.org/archive/wild-package-inferred-system/2019-01-07/wild-package-inferred-system-20190107-git.tgz 9603 5699a756f42960ef0c7ed450572e2f08 fbd51d7acb33d182d3b105fa01b7f4013bcbded8 wild-package-inferred-system-20190107-git test/foo-wild/foo-wild.asd wild-package-inferred-system.asd -winhttp http://beta.quicklisp.org/archive/winhttp/2019-01-07/winhttp-20190107-git.tgz 13864 03ad3ec6a6f5ca7f86fe4956dba43021 f2a6ac37a949396ed7898af1ffcb7f56ace0a2a1 winhttp-20190107-git winhttp.asd -winlock http://beta.quicklisp.org/archive/winlock/2019-11-30/winlock-20191130-git.tgz 3577 f637484323c2b64fc680325bcadef786 fc646ddf5184afcbf5c84370b68087120a63e7bd winlock-20191130-git winlock.asd -with-c-syntax http://beta.quicklisp.org/archive/with-c-syntax/2019-05-21/with-c-syntax-20190521-git.tgz 59911 7cf31666dd69c8cde2471fabeb593733 46347e74d5741633ee26723301c3b11c3be4c3b6 with-c-syntax-20190521-git with-c-syntax-test.asd with-c-syntax.asd -with-cached-reader-conditionals http://beta.quicklisp.org/archive/with-cached-reader-conditionals/2017-06-30/with-cached-reader-conditionals-20170630-git.tgz 2457 16049564ecfdb5a6db9edd1bdcf0a921 4be7101d32ea9f59c716ce5b822a58e0bb124a05 with-cached-reader-conditionals-20170630-git with-cached-reader-conditionals.asd -with-output-to-stream http://beta.quicklisp.org/archive/with-output-to-stream/2019-10-07/with-output-to-stream_1.0.tgz 4266 d9bee5027d6c04bcd7f63f4c48706f5c a3b23295277552cf9dd81191edd50ed8019a1c67 with-output-to-stream_1.0 tests/with-output-to-stream_tests.asd with-output-to-stream.asd -with-setf http://beta.quicklisp.org/archive/with-setf/2018-02-28/with-setf-release-quicklisp-df3eed9d-git.tgz 2558 9218b3765e9e2fd26a7f103e63fc89fe a6db3e7df0bb1b289e2134d8668be0ff51b4389e with-setf-release-quicklisp-df3eed9d-git with-setf.asd -with-shadowed-bindings http://beta.quicklisp.org/archive/with-shadowed-bindings/2019-01-07/with-shadowed-bindings-1.0.tgz 5127 1f583c77f5d2c67c934ab33d2ba810c3 a786cd36c9aee7348f63f7d6fe482225a728ccb2 with-shadowed-bindings-1.0 tests/with-shadowed-bindings_tests.asd with-shadowed-bindings.asd -with-user-abort http://beta.quicklisp.org/archive/with-user-abort/2019-11-30/with-user-abort-20191130-git.tgz 962 b66699b4f17ac57a0dfd3d4dc12c287b 1cdb0588df587008e8c151e547975707ba56c9e0 with-user-abort-20191130-git with-user-abort.asd -woo http://beta.quicklisp.org/archive/woo/2019-11-30/woo-20191130-git.tgz 225538 a876d194ed1ccb7439e3f3b6da63760e 1c4d4a1928361e61fc45518b6bcaf1f094484470 woo-20191130-git clack-handler-woo.asd woo-test.asd woo.asd -wookie http://beta.quicklisp.org/archive/wookie/2019-11-30/wookie-20191130-git.tgz 29738 5e5d6537637312919fd528bb1d0c1eba 660d6b8277d9bc3a82aeb0db51bb2d51e71a3678 wookie-20191130-git wookie.asd -wordnet http://beta.quicklisp.org/archive/wordnet/2019-05-21/wordnet-20190521-git.tgz 10484879 ee0272f4d2fa645dd13d555d759a3345 8638e9e3ac07cdbacab95baa0f03a5d20ecc83e9 wordnet-20190521-git wordnet.asd -workout-timer http://beta.quicklisp.org/archive/workout-timer/2017-12-27/workout-timer-20171227-git.tgz 319162 b5dc79cd91c6d2a4aed6f67a244bff9a d99a5b7d16a1b94b17b0c248b5bb4e1873d7dff8 workout-timer-20171227-git workout-timer.asd -wu-decimal http://beta.quicklisp.org/archive/wu-decimal/2013-01-28/wu-decimal-20130128-git.tgz 6244 e0676ea5ba7ce65e4d80cc5128c1e668 b37c145557a1b9541f9219629c1091976dc2656f wu-decimal-20130128-git wu-decimal.asd -wu-sugar http://beta.quicklisp.org/archive/wu-sugar/2016-08-25/wu-sugar-20160825-git.tgz 3555 ef7aec6772cda55c04bf117a2a8cb4ac a2dde559d7e28bdaa93dfcf0e1f080447873c9d3 wu-sugar-20160825-git wu-sugar.asd -wuwei http://beta.quicklisp.org/archive/wuwei/2019-02-02/wuwei-20190202-git.tgz 140953 e389c75644b0a8a5900e21e0daecfcd8 da295007ea36414aabdd389c4fff3aa3a40b10ce wuwei-20190202-git wuwei.asd -x.fdatatypes http://beta.quicklisp.org/archive/x.fdatatypes/2015-07-09/x.fdatatypes-20150709-git.tgz 15713 45c2b2939107acb4a07fbf66a1479750 8f58da1f8c5fb55a797b6458f81033ebe3caf9c4 x.fdatatypes-20150709-git x.fdatatypes-iterate.asd x.fdatatypes.asd -x.let-star http://beta.quicklisp.org/archive/x.let-star/2015-07-09/x.let-star-20150709-git.tgz 7921 2a0f7fbf6a621cd121020e140af08ded c66f72bf9b9e42964818dcc75c322203a262c52b x.let-star-20150709-git x.let-star.asd -xarray http://beta.quicklisp.org/archive/xarray/2014-01-13/xarray-20140113-git.tgz 26181 477bb421f87f6de0236065bf81949a32 5466b0687c3ac4a6466d2761b9d29510658785bb xarray-20140113-git xarray-test.asd xarray.asd -xecto http://beta.quicklisp.org/archive/xecto/2015-12-18/xecto-20151218-git.tgz 29803 f770596c9d7a9ce86fb2d7952bc9e40e 489a3f39048451dfaab304a73681d5f8ce779a8b xecto-20151218-git xecto.asd -xhtmlambda http://beta.quicklisp.org/archive/xhtmlambda/2019-01-07/xhtmlambda-20190107-git.tgz 49855 70ddb72e53acf4cfe8eb5610164e28f5 7c03dc39b2d88d62be563748aca9c86613c1c84c xhtmlambda-20190107-git xhtmlambda.asd -xhtmlgen http://beta.quicklisp.org/archive/xhtmlgen/2017-01-24/xhtmlgen-20170124-git.tgz 4264 17fc90eab99b1fb0cf6335065e84c109 bbb503e316f419d7cffb2f3f648e0227bc61cb15 xhtmlgen-20170124-git xhtmlgen.asd -xlsx http://beta.quicklisp.org/archive/xlsx/2018-07-11/xlsx-20180711-git.tgz 3050 10133595e8973f9acdd0301c00d04f8c 5a5dc8579c348ffae3625fbb088aa4ee008e3eaf xlsx-20180711-git xlsx.asd -xlunit http://beta.quicklisp.org/archive/xlunit/2015-09-23/xlunit-20150923-git.tgz 9484 1c673862f57e998c7a7b8e74de0d0c92 de0142632a8227f339178055eb5543a0c8dce789 xlunit-20150923-git xlunit.asd -xml-emitter http://beta.quicklisp.org/archive/xml-emitter/2019-11-30/xml-emitter-20191130-git.tgz 6734 6976af2c99934b14486c754dae996801 2895936a28c46607a5fb737b29d80c8e7f25a0df xml-emitter-20191130-git xml-emitter.asd -xml-mop http://beta.quicklisp.org/archive/xml-mop/2011-04-18/xml-mop-20110418-git.tgz 15391 028fde76c0d121865cb5167962a4b78b f5fb4a43a2defedb352b072be94d4c22f433dfc3 xml-mop-20110418-git xml-mop.asd -xml.location http://beta.quicklisp.org/archive/xml.location/2018-08-31/xml.location-20180831-git.tgz 31123 ad828a5b218d4a88e9e102ad534920ed 4679296b59b742a41b58a8d8f4be5e5e0a08be2c xml.location-20180831-git xml.location-and-local-time.asd xml.location.asd -xmls http://beta.quicklisp.org/archive/xmls/2018-04-30/xmls-3.0.2.tgz 113037 2462bab4a5d74e87ef7bdef41cd06dc8 80181e6c0ac15a4a41eb352b50b871679c65ab4d xmls-3.0.2 xmls.asd -xptest http://beta.quicklisp.org/archive/xptest/2015-09-23/xptest-20150923-git.tgz 6874 61f6ff5cc44cf8da5d8036084a31fbc3 09eebbc1fa611a9b628c9d2de12f6c81bf4420b8 xptest-20150923-git xptest.asd -xsubseq http://beta.quicklisp.org/archive/xsubseq/2017-08-30/xsubseq-20170830-git.tgz 4006 960bb8f329649b6e4b820e065e6b38e8 77ef22871e590349e22e892cd8f80121db1b1566 xsubseq-20170830-git xsubseq-test.asd xsubseq.asd -xuriella http://beta.quicklisp.org/archive/xuriella/2012-03-05/xuriella-20120305-git.tgz 122204 55eb6e13da338bc47b640a2767b0bd20 49899b4682e3a72322c69feb21ced8a109675833 xuriella-20120305-git xuriella.asd -yaclml http://beta.quicklisp.org/archive/yaclml/2018-01-31/yaclml-20180131-git.tgz 32006 b3dba0cd334aef4fc75b465b2b31a94a 76172119d82a08b4483721cc6746228c8d9b8079 yaclml-20180131-git yaclml.asd -yason http://beta.quicklisp.org/archive/yason/2019-12-27/yason-v0.7.8.tgz 27918 7c3231635aa494f1721273713ea8c56a ac532785adb017b0eecdd6dfa9b3ab1add7100f9 yason-v0.7.8 yason.asd -youtube http://beta.quicklisp.org/archive/youtube/2019-12-27/youtube-20191227-git.tgz 3054 36af0a0118f51e4e57d1dee28f720a44 dc8b73c9c8d14ba29827baf8ef5bda3b0a25d275 youtube-20191227-git youtube.asd -zacl http://beta.quicklisp.org/archive/zacl/2018-12-10/zacl-20181210-git.tgz 20817 08bff0310769f27a0d24ad7ebd8ae924 315cf8c605344323d082cdcd0bb82c6dfd59c697 zacl-20181210-git zacl.asd -zaws http://beta.quicklisp.org/archive/zaws/2015-04-07/zaws-20150407-git.tgz 13832 13ada144680e2f5d111df8f0a0217d99 8d181469163fac8b77280c98c5ab28ca7098fe4b zaws-20150407-git xml/zaws-xml.asd zaws.asd -zbucium http://beta.quicklisp.org/archive/zbucium/2019-07-10/zbucium-20190710-git.tgz 4503 90b10e33e3fa82d42174016881d557bc d0e1df0c25eb87e1e0e66af27fd2dac5b20c7fb4 zbucium-20190710-git zbucium.asd -zcdb http://beta.quicklisp.org/archive/zcdb/2015-04-07/zcdb-1.0.4.tgz 7393 e924c2b419f9875364cd662184fc55d1 db5f7a8e8a22f858794b64ef255f7dea015835f8 zcdb-1.0.4 zcdb.asd -zenekindarl http://beta.quicklisp.org/archive/zenekindarl/2017-11-30/zenekindarl-20171130-git.tgz 17395 2c8e9002b6434d92761ced8e187c5903 0a732633d8173828feec7a8b5eaab103de638e7f zenekindarl-20171130-git zenekindarl-test.asd zenekindarl.asd -zip http://beta.quicklisp.org/archive/zip/2015-06-08/zip-20150608-git.tgz 20940 5be194863779dcbd3c83e07524392f14 a8fa33dc2a19df78942e02c0e35a78f054992bd7 zip-20150608-git zip.asd -ziz http://beta.quicklisp.org/archive/ziz/2019-10-07/ziz-20191007-git.tgz 3184 24b32be09b15855c77b6fddc2d6d6ea3 f9d30703cd655564a12063a77b466930cd52a41d ziz-20191007-git ziz.asd -zlib http://beta.quicklisp.org/archive/zlib/2017-04-03/zlib-20170403-git.tgz 9104 67450036249df47288f4a8330ea28f57 498b41ab3e46c63d5f0ae3ece8eeb47c95009bad zlib-20170403-git zlib.asd -zpb-exif http://beta.quicklisp.org/archive/zpb-exif/2015-04-07/zpb-exif-1.2.3.tgz 15564 f2286ce8d693823e55886c2cd5d73390 69dfc9d86bdf5bd858815c453da0db024556dcfe zpb-exif-1.2.3 zpb-exif.asd -zpb-ttf http://beta.quicklisp.org/archive/zpb-ttf/2013-07-20/zpb-ttf-1.0.3.tgz 44869 1e896d8b0b01babab882e43fe4c3c2d4 f144607522f1fd0914e5576581b459e017cbde9f zpb-ttf-1.0.3 zpb-ttf.asd -zpng http://beta.quicklisp.org/archive/zpng/2015-04-07/zpng-1.2.2.tgz 40141 0a208f4ce0087ef578d477341d5f4078 0374a5e03f266152dea01c6fff9839798725697c zpng-1.2.2 zpng.asd -zs3 http://beta.quicklisp.org/archive/zs3/2019-10-07/zs3-1.3.3.tgz 57149 5ea13aa7a490758882e245c3f8bb063e 8b3bcc4f7a524ca09f3b6fa6600c510e1f2d9e3b zs3-1.3.3 zs3.asd -zsort http://beta.quicklisp.org/archive/zsort/2012-05-20/zsort-20120520-git.tgz 6259 08689032aed3f283c9ab84b536d0aca3 5b8b68c44983d394a8328f30cdc2b8fb6c96331a zsort-20120520-git zsort.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/.boring b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/.boring deleted file mode 100644 index dfa9e6d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/.boring +++ /dev/null @@ -1,13 +0,0 @@ -# Boring file regexps: -~$ -^_darcs -^\{arch\} -^.arch-ids -\# -\.dfsl$ -\.ppcf$ -\.fasl$ -\.x86f$ -\.fas$ -\.lib$ -^public_html diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/.gitignore b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/.gitignore deleted file mode 100644 index e832e94..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -*.fasl -*~ -\#* -*.patch diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/AUTHORS b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/AUTHORS deleted file mode 100644 index b550ea5..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/AUTHORS +++ /dev/null @@ -1,9 +0,0 @@ - -ACTA EST FABULA PLAUDITE - -Nikodemus Siivola -Attila Lendvai -Marco Baringer -Robert Strandh -Luis Oliveira -Tobias C. Rittweiler \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/LICENCE b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/LICENCE deleted file mode 100644 index b5140fb..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/LICENCE +++ /dev/null @@ -1,37 +0,0 @@ -Alexandria software and associated documentation are in the public -domain: - - Authors dedicate this work to public domain, for the benefit of the - public at large and to the detriment of the authors' heirs and - successors. Authors intends this dedication to be an overt act of - relinquishment in perpetuity of all present and future rights under - copyright law, whether vested or contingent, in the work. Authors - understands that such relinquishment of all rights includes the - relinquishment of all rights to enforce (by lawsuit or otherwise) - those copyrights in the work. - - Authors recognize that, once placed in the public domain, the work - may be freely reproduced, distributed, transmitted, used, modified, - built upon, or otherwise exploited by anyone for any purpose, - commercial or non-commercial, and in any way, including by methods - that have not yet been invented or conceived. - -In those legislations where public domain dedications are not -recognized or possible, Alexandria is distributed under the following -terms and conditions: - - 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 SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/README b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/README deleted file mode 100644 index 59e49ab..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/README +++ /dev/null @@ -1,52 +0,0 @@ -Alexandria is a collection of portable public domain utilities that -meet the following constraints: - - * Utilities, not extensions: Alexandria will not contain conceptual - extensions to Common Lisp, instead limiting itself to tools and - utilities that fit well within the framework of standard ANSI - Common Lisp. Test-frameworks, system definitions, logging - facilities, serialization layers, etc. are all outside the scope of - Alexandria as a library, though well within the scope of Alexandria - as a project. - - * Conservative: Alexandria limits itself to what project members - consider conservative utilities. Alexandria does not and will not - include anaphoric constructs, loop-like binding macros, etc. - - * Portable: Alexandria limits itself to portable parts of Common - Lisp. Even apparently conservative and useful functions remain - outside the scope of Alexandria if they cannot be implemented - portably. Portability is here defined as portable within a - conforming implementation: implementation bugs are not considered - portability issues. - -Homepage: - - http://common-lisp.net/project/alexandria/ - -Mailing lists: - - http://lists.common-lisp.net/mailman/listinfo/alexandria-devel - http://lists.common-lisp.net/mailman/listinfo/alexandria-cvs - -Repository: - - git://common-lisp.net/projects/alexandria/alexandria.git - -Documentation: - - http://common-lisp.net/project/alexandria/draft/alexandria.html - - (To build docs locally: cd doc && make html pdf info) - -Patches: - - Patches are always welcome! Please send them to the mailing list as - attachments, generated by "git format-patch -1". - - Patches should include a commit message that explains what's being - done and /why/, and when fixing a bug or adding a feature you should - also include a test-case. - - Be advised though that right now new features are unlikely to be - accepted until 1.0 is officially out of the door. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/alexandria-tests.asd b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/alexandria-tests.asd deleted file mode 100644 index 445c18c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/alexandria-tests.asd +++ /dev/null @@ -1,11 +0,0 @@ -(defsystem "alexandria-tests" - :licence "Public Domain / 0-clause MIT" - :description "Tests for Alexandria, which is a collection of portable public domain utilities." - :author "Nikodemus Siivola , and others." - :depends-on (:alexandria #+sbcl :sb-rt #-sbcl :rt) - :components ((:file "tests")) - :perform (test-op (o c) - (flet ((run-tests (&rest args) - (apply (intern (string '#:run-tests) '#:alexandria-tests) args))) - (run-tests :compiled nil) - (run-tests :compiled t)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/alexandria.asd b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/alexandria.asd deleted file mode 100644 index db10e4f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/alexandria.asd +++ /dev/null @@ -1,62 +0,0 @@ -(defsystem "alexandria" - :version "1.0.0" - :licence "Public Domain / 0-clause MIT" - :description "Alexandria is a collection of portable public domain utilities." - :author "Nikodemus Siivola and others." - :long-description - "Alexandria is a project and a library. - -As a project Alexandria's goal is to reduce duplication of effort and improve -portability of Common Lisp code according to its own idiosyncratic and rather -conservative aesthetic. - -As a library Alexandria is one of the means by which the project strives for -its goals. - -Alexandria is a collection of portable public domain utilities that meet -the following constraints: - - * Utilities, not extensions: Alexandria will not contain conceptual - extensions to Common Lisp, instead limiting itself to tools and utilities - that fit well within the framework of standard ANSI Common Lisp. - Test-frameworks, system definitions, logging facilities, serialization - layers, etc. are all outside the scope of Alexandria as a library, though - well within the scope of Alexandria as a project. - - * Conservative: Alexandria limits itself to what project members consider - conservative utilities. Alexandria does not and will not include anaphoric - constructs, loop-like binding macros, etc. - Also, its exported symbols are being imported by many other packages - already, so each new export carries the danger of causing conflicts. - - * Portable: Alexandria limits itself to portable parts of Common Lisp. Even - apparently conservative and useful functions remain outside the scope of - Alexandria if they cannot be implemented portably. Portability is here - defined as portable within a conforming implementation: implementation bugs - are not considered portability issues. - - * Team player: Alexandria will not (initially, at least) subsume or provide - functionality for which good-quality special-purpose packages exist, like - split-sequence. Instead, third party packages such as that may be - \"blessed\"." - :components - ((:static-file "LICENCE") - (:static-file "tests.lisp") - (:file "package") - (:file "definitions" :depends-on ("package")) - (:file "binding" :depends-on ("package")) - (:file "strings" :depends-on ("package")) - (:file "conditions" :depends-on ("package")) - (:file "io" :depends-on ("package" "macros" "lists" "types")) - (:file "macros" :depends-on ("package" "strings" "symbols")) - (:file "hash-tables" :depends-on ("package" "macros")) - (:file "control-flow" :depends-on ("package" "definitions" "macros")) - (:file "symbols" :depends-on ("package")) - (:file "functions" :depends-on ("package" "symbols" "macros")) - (:file "lists" :depends-on ("package" "functions")) - (:file "types" :depends-on ("package" "symbols" "lists")) - (:file "arrays" :depends-on ("package" "types")) - (:file "sequences" :depends-on ("package" "lists" "types")) - (:file "numbers" :depends-on ("package" "sequences")) - (:file "features" :depends-on ("package" "control-flow"))) - :in-order-to ((test-op (test-op "alexandria-tests")))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/arrays.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/arrays.lisp deleted file mode 100644 index 76c1879..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/arrays.lisp +++ /dev/null @@ -1,18 +0,0 @@ -(in-package :alexandria) - -(defun copy-array (array &key (element-type (array-element-type array)) - (fill-pointer (and (array-has-fill-pointer-p array) - (fill-pointer array))) - (adjustable (adjustable-array-p array))) - "Returns an undisplaced copy of ARRAY, with same fill-pointer and -adjustability (if any) as the original, unless overridden by the keyword -arguments." - (let* ((dimensions (array-dimensions array)) - (new-array (make-array dimensions - :element-type element-type - :adjustable adjustable - :fill-pointer fill-pointer))) - (dotimes (i (array-total-size array)) - (setf (row-major-aref new-array i) - (row-major-aref array i))) - new-array)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/binding.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/binding.lisp deleted file mode 100644 index 37a3d52..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/binding.lisp +++ /dev/null @@ -1,90 +0,0 @@ -(in-package :alexandria) - -(defmacro if-let (bindings &body (then-form &optional else-form)) - "Creates new variable bindings, and conditionally executes either -THEN-FORM or ELSE-FORM. ELSE-FORM defaults to NIL. - -BINDINGS must be either single binding of the form: - - (variable initial-form) - -or a list of bindings of the form: - - ((variable-1 initial-form-1) - (variable-2 initial-form-2) - ... - (variable-n initial-form-n)) - -All initial-forms are executed sequentially in the specified order. Then all -the variables are bound to the corresponding values. - -If all variables were bound to true values, the THEN-FORM is executed with the -bindings in effect, otherwise the ELSE-FORM is executed with the bindings in -effect." - (let* ((binding-list (if (and (consp bindings) (symbolp (car bindings))) - (list bindings) - bindings)) - (variables (mapcar #'car binding-list))) - `(let ,binding-list - (if (and ,@variables) - ,then-form - ,else-form)))) - -(defmacro when-let (bindings &body forms) - "Creates new variable bindings, and conditionally executes FORMS. - -BINDINGS must be either single binding of the form: - - (variable initial-form) - -or a list of bindings of the form: - - ((variable-1 initial-form-1) - (variable-2 initial-form-2) - ... - (variable-n initial-form-n)) - -All initial-forms are executed sequentially in the specified order. Then all -the variables are bound to the corresponding values. - -If all variables were bound to true values, then FORMS are executed as an -implicit PROGN." - (let* ((binding-list (if (and (consp bindings) (symbolp (car bindings))) - (list bindings) - bindings)) - (variables (mapcar #'car binding-list))) - `(let ,binding-list - (when (and ,@variables) - ,@forms)))) - -(defmacro when-let* (bindings &body body) - "Creates new variable bindings, and conditionally executes BODY. - -BINDINGS must be either single binding of the form: - - (variable initial-form) - -or a list of bindings of the form: - - ((variable-1 initial-form-1) - (variable-2 initial-form-2) - ... - (variable-n initial-form-n)) - -Each INITIAL-FORM is executed in turn, and the variable bound to the -corresponding value. INITIAL-FORM expressions can refer to variables -previously bound by the WHEN-LET*. - -Execution of WHEN-LET* stops immediately if any INITIAL-FORM evaluates to NIL. -If all INITIAL-FORMs evaluate to true, then BODY is executed as an implicit -PROGN." - (let ((binding-list (if (and (consp bindings) (symbolp (car bindings))) - (list bindings) - bindings))) - (labels ((bind (bindings body) - (if bindings - `(let (,(car bindings)) - (when ,(caar bindings) - ,(bind (cdr bindings) body))) - `(progn ,@body)))) - (bind binding-list body)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/conditions.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/conditions.lisp deleted file mode 100644 index ac471cc..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/conditions.lisp +++ /dev/null @@ -1,91 +0,0 @@ -(in-package :alexandria) - -(defun required-argument (&optional name) - "Signals an error for a missing argument of NAME. Intended for -use as an initialization form for structure and class-slots, and -a default value for required keyword arguments." - (error "Required argument ~@[~S ~]missing." name)) - -(define-condition simple-style-warning (simple-warning style-warning) - ()) - -(defun simple-style-warning (message &rest args) - (warn 'simple-style-warning :format-control message :format-arguments args)) - -;; We don't specify a :report for simple-reader-error to let the -;; underlying implementation report the line and column position for -;; us. Unfortunately this way the message from simple-error is not -;; displayed, unless there's special support for that in the -;; implementation. But even then it's still inspectable from the -;; debugger... -(define-condition simple-reader-error - #-sbcl(simple-error reader-error) - #+sbcl(sb-int:simple-reader-error) - ()) - -(defun simple-reader-error (stream message &rest args) - (error 'simple-reader-error - :stream stream - :format-control message - :format-arguments args)) - -(define-condition simple-parse-error (simple-error parse-error) - ()) - -(defun simple-parse-error (message &rest args) - (error 'simple-parse-error - :format-control message - :format-arguments args)) - -(define-condition simple-program-error (simple-error program-error) - ()) - -(defun simple-program-error (message &rest args) - (error 'simple-program-error - :format-control message - :format-arguments args)) - -(defmacro ignore-some-conditions ((&rest conditions) &body body) - "Similar to CL:IGNORE-ERRORS but the (unevaluated) CONDITIONS -list determines which specific conditions are to be ignored." - `(handler-case - (progn ,@body) - ,@(loop for condition in conditions collect - `(,condition (c) (values nil c))))) - -(defmacro unwind-protect-case ((&optional abort-flag) protected-form &body clauses) - "Like CL:UNWIND-PROTECT, but you can specify the circumstances that -the cleanup CLAUSES are run. - - clauses ::= (:NORMAL form*)* | (:ABORT form*)* | (:ALWAYS form*)* - -Clauses can be given in any order, and more than one clause can be -given for each circumstance. The clauses whose denoted circumstance -occured, are executed in the order the clauses appear. - -ABORT-FLAG is the name of a variable that will be bound to T in -CLAUSES if the PROTECTED-FORM aborted preemptively, and to NIL -otherwise. - -Examples: - - (unwind-protect-case () - (protected-form) - (:normal (format t \"This is only evaluated if PROTECTED-FORM executed normally.~%\")) - (:abort (format t \"This is only evaluated if PROTECTED-FORM aborted preemptively.~%\")) - (:always (format t \"This is evaluated in either case.~%\"))) - - (unwind-protect-case (aborted-p) - (protected-form) - (:always (perform-cleanup-if aborted-p))) -" - (check-type abort-flag (or null symbol)) - (let ((gflag (gensym "FLAG+"))) - `(let ((,gflag t)) - (unwind-protect (multiple-value-prog1 ,protected-form (setf ,gflag nil)) - (let ,(and abort-flag `((,abort-flag ,gflag))) - ,@(loop for (cleanup-kind . forms) in clauses - collect (ecase cleanup-kind - (:normal `(when (not ,gflag) ,@forms)) - (:abort `(when ,gflag ,@forms)) - (:always `(progn ,@forms))))))))) \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/control-flow.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/control-flow.lisp deleted file mode 100644 index dd00df3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/control-flow.lisp +++ /dev/null @@ -1,106 +0,0 @@ -(in-package :alexandria) - -(defun extract-function-name (spec) - "Useful for macros that want to mimic the functional interface for functions -like #'eq and 'eq." - (if (and (consp spec) - (member (first spec) '(quote function))) - (second spec) - spec)) - -(defun generate-switch-body (whole object clauses test key &optional default) - (with-gensyms (value) - (setf test (extract-function-name test)) - (setf key (extract-function-name key)) - (when (and (consp default) - (member (first default) '(error cerror))) - (setf default `(,@default "No keys match in SWITCH. Testing against ~S with ~S." - ,value ',test))) - `(let ((,value (,key ,object))) - (cond ,@(mapcar (lambda (clause) - (if (member (first clause) '(t otherwise)) - (progn - (when default - (error "Multiple default clauses or illegal use of a default clause in ~S." - whole)) - (setf default `(progn ,@(rest clause))) - '(())) - (destructuring-bind (key-form &body forms) clause - `((,test ,value ,key-form) - ,@forms)))) - clauses) - (t ,default))))) - -(defmacro switch (&whole whole (object &key (test 'eql) (key 'identity)) - &body clauses) - "Evaluates first matching clause, returning its values, or evaluates and -returns the values of T or OTHERWISE if no keys match." - (generate-switch-body whole object clauses test key)) - -(defmacro eswitch (&whole whole (object &key (test 'eql) (key 'identity)) - &body clauses) - "Like SWITCH, but signals an error if no key matches." - (generate-switch-body whole object clauses test key '(error))) - -(defmacro cswitch (&whole whole (object &key (test 'eql) (key 'identity)) - &body clauses) - "Like SWITCH, but signals a continuable error if no key matches." - (generate-switch-body whole object clauses test key '(cerror "Return NIL from CSWITCH."))) - -(defmacro whichever (&rest possibilities &environment env) - "Evaluates exactly one of POSSIBILITIES, chosen at random." - (setf possibilities (mapcar (lambda (p) (macroexpand p env)) possibilities)) - (if (every (lambda (p) (constantp p)) possibilities) - `(svref (load-time-value (vector ,@possibilities)) (random ,(length possibilities))) - (labels ((expand (possibilities position random-number) - (if (null (cdr possibilities)) - (car possibilities) - (let* ((length (length possibilities)) - (half (truncate length 2)) - (second-half (nthcdr half possibilities)) - (first-half (butlast possibilities (- length half)))) - `(if (< ,random-number ,(+ position half)) - ,(expand first-half position random-number) - ,(expand second-half (+ position half) random-number)))))) - (with-gensyms (random-number) - (let ((length (length possibilities))) - `(let ((,random-number (random ,length))) - ,(expand possibilities 0 random-number))))))) - -(defmacro xor (&rest datums) - "Evaluates its arguments one at a time, from left to right. If more than one -argument evaluates to a true value no further DATUMS are evaluated, and NIL is -returned as both primary and secondary value. If exactly one argument -evaluates to true, its value is returned as the primary value after all the -arguments have been evaluated, and T is returned as the secondary value. If no -arguments evaluate to true NIL is retuned as primary, and T as secondary -value." - (with-gensyms (xor tmp true) - `(let (,tmp ,true) - (block ,xor - ,@(mapcar (lambda (datum) - `(if (setf ,tmp ,datum) - (if ,true - (return-from ,xor (values nil nil)) - (setf ,true ,tmp)))) - datums) - (return-from ,xor (values ,true t)))))) - -(defmacro nth-value-or (nth-value &body forms) - "Evaluates FORM arguments one at a time, until the NTH-VALUE returned by one -of the forms is true. It then returns all the values returned by evaluating -that form. If none of the forms return a true nth value, this form returns -NIL." - (once-only (nth-value) - (with-gensyms (values) - `(let ((,values (multiple-value-list ,(first forms)))) - (if (nth ,nth-value ,values) - (values-list ,values) - ,(if (rest forms) - `(nth-value-or ,nth-value ,@(rest forms)) - nil)))))) - -(defmacro multiple-value-prog2 (first-form second-form &body forms) - "Evaluates FIRST-FORM, then SECOND-FORM, and then FORMS. Yields as its value -all the value returned by SECOND-FORM." - `(progn ,first-form (multiple-value-prog1 ,second-form ,@forms))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/definitions.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/definitions.lisp deleted file mode 100644 index 863e1f6..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/definitions.lisp +++ /dev/null @@ -1,37 +0,0 @@ -(in-package :alexandria) - -(defun %reevaluate-constant (name value test) - (if (not (boundp name)) - value - (let ((old (symbol-value name)) - (new value)) - (if (not (constantp name)) - (prog1 new - (cerror "Try to redefine the variable as a constant." - "~@<~S is an already bound non-constant variable ~ - whose value is ~S.~:@>" name old)) - (if (funcall test old new) - old - (restart-case - (error "~@<~S is an already defined constant whose value ~ - ~S is not equal to the provided initial value ~S ~ - under ~S.~:@>" name old new test) - (ignore () - :report "Retain the current value." - old) - (continue () - :report "Try to redefine the constant." - new))))))) - -(defmacro define-constant (name initial-value &key (test ''eql) documentation) - "Ensures that the global variable named by NAME is a constant with a value -that is equal under TEST to the result of evaluating INITIAL-VALUE. TEST is a -/function designator/ that defaults to EQL. If DOCUMENTATION is given, it -becomes the documentation string of the constant. - -Signals an error if NAME is already a bound non-constant variable. - -Signals an error if NAME is already a constant variable whose value is not -equal under TEST to result of evaluating INITIAL-VALUE." - `(defconstant ,name (%reevaluate-constant ',name ,initial-value ,test) - ,@(when documentation `(,documentation)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/doc/.gitignore b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/doc/.gitignore deleted file mode 100644 index f22577b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/doc/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -alexandria -include - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/doc/Makefile b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/doc/Makefile deleted file mode 100644 index 85eb818..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/doc/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -.PHONY: clean html pdf include clean-include clean-crap info doc - -doc: pdf html info clean-crap - -clean-include: - rm -rf include - -clean-crap: - rm -f *.aux *.cp *.fn *.fns *.ky *.log *.pg *.toc *.tp *.tps *.vr - -clean: clean-include - rm -f *.pdf *.html *.info - -include: - sbcl --no-userinit --eval '(require :asdf)' \ - --eval '(let ((asdf:*central-registry* (list "../"))) (require :alexandria))' \ - --load docstrings.lisp \ - --eval '(sb-texinfo:generate-includes "include/" (list :alexandria) :base-package :alexandria)' \ - --eval '(quit)' - -pdf: include - texi2pdf alexandria.texinfo - -html: include - makeinfo --html --no-split alexandria.texinfo - -info: include - makeinfo alexandria.texinfo diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/doc/alexandria.texinfo b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/doc/alexandria.texinfo deleted file mode 100644 index 89b03ac..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/doc/alexandria.texinfo +++ /dev/null @@ -1,277 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header -@setfilename alexandria.info -@settitle Alexandria Manual -@c %**end of header - -@settitle Alexandria Manual -- draft version - -@c for install-info -@dircategory Software development -@direntry -* alexandria: Common Lisp utilities. -@end direntry - -@copying -Alexandria software and associated documentation are in the public -domain: - -@quotation - Authors dedicate this work to public domain, for the benefit of the - public at large and to the detriment of the authors' heirs and - successors. Authors intends this dedication to be an overt act of - relinquishment in perpetuity of all present and future rights under - copyright law, whether vested or contingent, in the work. Authors - understands that such relinquishment of all rights includes the - relinquishment of all rights to enforce (by lawsuit or otherwise) - those copyrights in the work. - - Authors recognize that, once placed in the public domain, the work - may be freely reproduced, distributed, transmitted, used, modified, - built upon, or otherwise exploited by anyone for any purpose, - commercial or non-commercial, and in any way, including by methods - that have not yet been invented or conceived. -@end quotation - -In those legislations where public domain dedications are not -recognized or possible, Alexandria is distributed under the following -terms and conditions: - -@quotation - 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 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 -@end copying - -@titlepage - -@title Alexandria Manual -@subtitle draft version - -@c The following two commands start the copyright page. -@page -@vskip 0pt plus 1filll -@insertcopying - -@end titlepage - -@contents - -@ifnottex - -@include include/ifnottex.texinfo - -@node Top -@comment node-name, next, previous, up -@top Alexandria - -@insertcopying - -@menu -* Hash Tables:: -* Data and Control Flow:: -* Conses:: -* Sequences:: -* IO:: -* Macro Writing:: -* Symbols:: -* Arrays:: -* Types:: -* Numbers:: -@end menu - -@end ifnottex - -@node Hash Tables -@comment node-name, next, previous, up -@chapter Hash Tables - -@include include/macro-alexandria-ensure-gethash.texinfo -@include include/fun-alexandria-copy-hash-table.texinfo -@include include/fun-alexandria-maphash-keys.texinfo -@include include/fun-alexandria-maphash-values.texinfo -@include include/fun-alexandria-hash-table-keys.texinfo -@include include/fun-alexandria-hash-table-values.texinfo -@include include/fun-alexandria-hash-table-alist.texinfo -@include include/fun-alexandria-hash-table-plist.texinfo -@include include/fun-alexandria-alist-hash-table.texinfo -@include include/fun-alexandria-plist-hash-table.texinfo - -@node Data and Control Flow -@comment node-name, next, previous, up -@chapter Data and Control Flow - -@include include/macro-alexandria-define-constant.texinfo -@include include/macro-alexandria-destructuring-case.texinfo -@include include/macro-alexandria-ensure-functionf.texinfo -@include include/macro-alexandria-multiple-value-prog2.texinfo -@include include/macro-alexandria-named-lambda.texinfo -@include include/macro-alexandria-nth-value-or.texinfo -@include include/macro-alexandria-if-let.texinfo -@include include/macro-alexandria-when-let.texinfo -@include include/macro-alexandria-when-let-star.texinfo -@include include/macro-alexandria-switch.texinfo -@include include/macro-alexandria-cswitch.texinfo -@include include/macro-alexandria-eswitch.texinfo -@include include/macro-alexandria-whichever.texinfo -@include include/macro-alexandria-xor.texinfo - -@include include/fun-alexandria-disjoin.texinfo -@include include/fun-alexandria-conjoin.texinfo -@include include/fun-alexandria-compose.texinfo -@include include/fun-alexandria-ensure-function.texinfo -@include include/fun-alexandria-multiple-value-compose.texinfo -@include include/fun-alexandria-curry.texinfo -@include include/fun-alexandria-rcurry.texinfo - -@node Conses -@comment node-name, next, previous, up -@chapter Conses - -@include include/type-alexandria-proper-list.texinfo -@include include/type-alexandria-circular-list.texinfo - -@include include/macro-alexandria-appendf.texinfo -@include include/macro-alexandria-nconcf.texinfo -@include include/macro-alexandria-remove-from-plistf.texinfo -@include include/macro-alexandria-delete-from-plistf.texinfo -@include include/macro-alexandria-reversef.texinfo -@include include/macro-alexandria-nreversef.texinfo -@include include/macro-alexandria-unionf.texinfo -@include include/macro-alexandria-nunionf.texinfo - -@include include/macro-alexandria-doplist.texinfo - -@include include/fun-alexandria-circular-list-p.texinfo -@include include/fun-alexandria-circular-tree-p.texinfo -@include include/fun-alexandria-proper-list-p.texinfo - -@include include/fun-alexandria-alist-plist.texinfo -@include include/fun-alexandria-plist-alist.texinfo -@include include/fun-alexandria-circular-list.texinfo -@include include/fun-alexandria-make-circular-list.texinfo -@include include/fun-alexandria-ensure-car.texinfo -@include include/fun-alexandria-ensure-cons.texinfo -@include include/fun-alexandria-ensure-list.texinfo -@include include/fun-alexandria-flatten.texinfo -@include include/fun-alexandria-lastcar.texinfo -@include include/fun-alexandria-setf-lastcar.texinfo -@include include/fun-alexandria-proper-list-length.texinfo -@include include/fun-alexandria-mappend.texinfo -@include include/fun-alexandria-map-product.texinfo -@include include/fun-alexandria-remove-from-plist.texinfo -@include include/fun-alexandria-delete-from-plist.texinfo -@include include/fun-alexandria-set-equal.texinfo -@include include/fun-alexandria-setp.texinfo - -@node Sequences -@comment node-name, next, previous, up -@chapter Sequences - -@include include/type-alexandria-proper-sequence.texinfo - -@include include/macro-alexandria-deletef.texinfo -@include include/macro-alexandria-removef.texinfo - -@include include/fun-alexandria-rotate.texinfo -@include include/fun-alexandria-shuffle.texinfo -@include include/fun-alexandria-random-elt.texinfo -@include include/fun-alexandria-emptyp.texinfo -@include include/fun-alexandria-sequence-of-length-p.texinfo -@include include/fun-alexandria-length-equals.texinfo -@include include/fun-alexandria-copy-sequence.texinfo -@include include/fun-alexandria-first-elt.texinfo -@include include/fun-alexandria-setf-first-elt.texinfo -@include include/fun-alexandria-last-elt.texinfo -@include include/fun-alexandria-setf-last-elt.texinfo -@include include/fun-alexandria-starts-with.texinfo -@include include/fun-alexandria-starts-with-subseq.texinfo -@include include/fun-alexandria-ends-with.texinfo -@include include/fun-alexandria-ends-with-subseq.texinfo -@include include/fun-alexandria-map-combinations.texinfo -@include include/fun-alexandria-map-derangements.texinfo -@include include/fun-alexandria-map-permutations.texinfo - -@node IO -@comment node-name, next, previous, up -@chapter IO - -@include include/fun-alexandria-read-stream-content-into-string.texinfo -@include include/fun-alexandria-read-file-into-string.texinfo -@include include/fun-alexandria-read-stream-content-into-byte-vector.texinfo -@include include/fun-alexandria-read-file-into-byte-vector.texinfo - -@node Macro Writing -@comment node-name, next, previous, up -@chapter Macro Writing - -@include include/macro-alexandria-once-only.texinfo -@include include/macro-alexandria-with-gensyms.texinfo -@include include/macro-alexandria-with-unique-names.texinfo -@include include/fun-alexandria-featurep.texinfo -@include include/fun-alexandria-parse-body.texinfo -@include include/fun-alexandria-parse-ordinary-lambda-list.texinfo - -@node Symbols -@comment node-name, next, previous, up -@chapter Symbols - -@include include/fun-alexandria-ensure-symbol.texinfo -@include include/fun-alexandria-format-symbol.texinfo -@include include/fun-alexandria-make-keyword.texinfo -@include include/fun-alexandria-make-gensym.texinfo -@include include/fun-alexandria-make-gensym-list.texinfo -@include include/fun-alexandria-symbolicate.texinfo - -@node Arrays -@comment node-name, next, previous, up -@chapter Arrays - -@include include/type-alexandria-array-index.texinfo -@include include/type-alexandria-array-length.texinfo -@include include/fun-alexandria-copy-array.texinfo - -@node Types -@comment node-name, next, previous, up -@chapter Types - -@include include/type-alexandria-string-designator.texinfo -@include include/macro-alexandria-coercef.texinfo -@include include/fun-alexandria-of-type.texinfo -@include include/fun-alexandria-type-equals.texinfo - -@node Numbers -@comment node-name, next, previous, up -@chapter Numbers - -@include include/macro-alexandria-maxf.texinfo -@include include/macro-alexandria-minf.texinfo - -@include include/fun-alexandria-binomial-coefficient.texinfo -@include include/fun-alexandria-count-permutations.texinfo -@include include/fun-alexandria-clamp.texinfo -@include include/fun-alexandria-lerp.texinfo -@include include/fun-alexandria-factorial.texinfo -@include include/fun-alexandria-subfactorial.texinfo -@include include/fun-alexandria-gaussian-random.texinfo -@include include/fun-alexandria-iota.texinfo -@include include/fun-alexandria-map-iota.texinfo -@include include/fun-alexandria-mean.texinfo -@include include/fun-alexandria-median.texinfo -@include include/fun-alexandria-variance.texinfo -@include include/fun-alexandria-standard-deviation.texinfo - -@bye diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/doc/docstrings.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/doc/docstrings.lisp deleted file mode 100644 index 51dda07..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/doc/docstrings.lisp +++ /dev/null @@ -1,881 +0,0 @@ -;;; -*- lisp -*- - -;;;; A docstring extractor for the sbcl manual. Creates -;;;; @include-ready documentation from the docstrings of exported -;;;; symbols of specified packages. - -;;;; This software is part of the SBCL software system. SBCL is in the -;;;; public domain and is provided with absolutely no warranty. See -;;;; the COPYING file for more information. -;;;; -;;;; Written by Rudi Schlatte , mangled -;;;; by Nikodemus Siivola. - -;;;; TODO -;;;; * Verbatim text -;;;; * Quotations -;;;; * Method documentation untested -;;;; * Method sorting, somehow -;;;; * Index for macros & constants? -;;;; * This is getting complicated enough that tests would be good -;;;; * Nesting (currently only nested itemizations work) -;;;; * doc -> internal form -> texinfo (so that non-texinfo format are also -;;;; easily generated) - -;;;; FIXME: The description below is no longer complete. This -;;;; should possibly be turned into a contrib with proper documentation. - -;;;; Formatting heuristics (tweaked to format SAVE-LISP-AND-DIE sanely): -;;;; -;;;; Formats SYMBOL as @code{symbol}, or @var{symbol} if symbol is in -;;;; the argument list of the defun / defmacro. -;;;; -;;;; Lines starting with * or - that are followed by intented lines -;;;; are marked up with @itemize. -;;;; -;;;; Lines containing only a SYMBOL that are followed by indented -;;;; lines are marked up as @table @code, with the SYMBOL as the item. - -(eval-when (:compile-toplevel :load-toplevel :execute) - (require 'sb-introspect)) - -(defpackage :sb-texinfo - (:use :cl :sb-mop) - (:shadow #:documentation) - (:export #:generate-includes #:document-package) - (:documentation - "Tools to generate TexInfo documentation from docstrings.")) - -(in-package :sb-texinfo) - -;;;; various specials and parameters - -(defvar *texinfo-output*) -(defvar *texinfo-variables*) -(defvar *documentation-package*) -(defvar *base-package*) - -(defparameter *undocumented-packages* '(sb-pcl sb-int sb-kernel sb-sys sb-c)) - -(defparameter *documentation-types* - '(compiler-macro - function - method-combination - setf - ;;structure ; also handled by `type' - type - variable) - "A list of symbols accepted as second argument of `documentation'") - -(defparameter *character-replacements* - '((#\* . "star") (#\/ . "slash") (#\+ . "plus") - (#\< . "lt") (#\> . "gt") - (#\= . "equals")) - "Characters and their replacement names that `alphanumize' uses. If -the replacements contain any of the chars they're supposed to replace, -you deserve to lose.") - -(defparameter *characters-to-drop* '(#\\ #\` #\') - "Characters that should be removed by `alphanumize'.") - -(defparameter *texinfo-escaped-chars* "@{}" - "Characters that must be escaped with #\@ for Texinfo.") - -(defparameter *itemize-start-characters* '(#\* #\-) - "Characters that might start an itemization in docstrings when - at the start of a line.") - -(defparameter *symbol-characters* "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890*:-+&#'" - "List of characters that make up symbols in a docstring.") - -(defparameter *symbol-delimiters* " ,.!?;") - -(defparameter *ordered-documentation-kinds* - '(package type structure condition class macro)) - -;;;; utilities - -(defun flatten (list) - (cond ((null list) - nil) - ((consp (car list)) - (nconc (flatten (car list)) (flatten (cdr list)))) - ((null (cdr list)) - (cons (car list) nil)) - (t - (cons (car list) (flatten (cdr list)))))) - -(defun whitespacep (char) - (find char #(#\tab #\space #\page))) - -(defun setf-name-p (name) - (or (symbolp name) - (and (listp name) (= 2 (length name)) (eq (car name) 'setf)))) - -(defgeneric specializer-name (specializer)) - -(defmethod specializer-name ((specializer eql-specializer)) - (list 'eql (eql-specializer-object specializer))) - -(defmethod specializer-name ((specializer class)) - (class-name specializer)) - -(defun ensure-class-precedence-list (class) - (unless (class-finalized-p class) - (finalize-inheritance class)) - (class-precedence-list class)) - -(defun specialized-lambda-list (method) - ;; courtecy of AMOP p. 61 - (let* ((specializers (method-specializers method)) - (lambda-list (method-lambda-list method)) - (n-required (length specializers))) - (append (mapcar (lambda (arg specializer) - (if (eq specializer (find-class 't)) - arg - `(,arg ,(specializer-name specializer)))) - (subseq lambda-list 0 n-required) - specializers) - (subseq lambda-list n-required)))) - -(defun string-lines (string) - "Lines in STRING as a vector." - (coerce (with-input-from-string (s string) - (loop for line = (read-line s nil nil) - while line collect line)) - 'vector)) - -(defun indentation (line) - "Position of first non-SPACE character in LINE." - (position-if-not (lambda (c) (char= c #\Space)) line)) - -(defun docstring (x doc-type) - (cl:documentation x doc-type)) - -(defun flatten-to-string (list) - (format nil "~{~A~^-~}" (flatten list))) - -(defun alphanumize (original) - "Construct a string without characters like *`' that will f-star-ck -up filename handling. See `*character-replacements*' and -`*characters-to-drop*' for customization." - (let ((name (remove-if (lambda (x) (member x *characters-to-drop*)) - (if (listp original) - (flatten-to-string original) - (string original)))) - (chars-to-replace (mapcar #'car *character-replacements*))) - (flet ((replacement-delimiter (index) - (cond ((or (< index 0) (>= index (length name))) "") - ((alphanumericp (char name index)) "-") - (t "")))) - (loop for index = (position-if #'(lambda (x) (member x chars-to-replace)) - name) - while index - do (setf name (concatenate 'string (subseq name 0 index) - (replacement-delimiter (1- index)) - (cdr (assoc (aref name index) - *character-replacements*)) - (replacement-delimiter (1+ index)) - (subseq name (1+ index)))))) - name)) - -;;;; generating various names - -(defgeneric name (thing) - (:documentation "Name for a documented thing. Names are either -symbols or lists of symbols.")) - -(defmethod name ((symbol symbol)) - symbol) - -(defmethod name ((cons cons)) - cons) - -(defmethod name ((package package)) - (short-package-name package)) - -(defmethod name ((method method)) - (list - (generic-function-name (method-generic-function method)) - (method-qualifiers method) - (specialized-lambda-list method))) - -;;; Node names for DOCUMENTATION instances - -(defgeneric name-using-kind/name (kind name doc)) - -(defmethod name-using-kind/name (kind (name string) doc) - (declare (ignore kind doc)) - name) - -(defmethod name-using-kind/name (kind (name symbol) doc) - (declare (ignore kind)) - (format nil "~@[~A:~]~A" (short-package-name (get-package doc)) name)) - -(defmethod name-using-kind/name (kind (name list) doc) - (declare (ignore kind)) - (assert (setf-name-p name)) - (format nil "(setf ~@[~A:~]~A)" (short-package-name (get-package doc)) (second name))) - -(defmethod name-using-kind/name ((kind (eql 'method)) name doc) - (format nil "~A~{ ~A~} ~A" - (name-using-kind/name nil (first name) doc) - (second name) - (third name))) - -(defun node-name (doc) - "Returns TexInfo node name as a string for a DOCUMENTATION instance." - (let ((kind (get-kind doc))) - (format nil "~:(~A~) ~(~A~)" kind (name-using-kind/name kind (get-name doc) doc)))) - -(defun short-package-name (package) - (unless (eq package *base-package*) - (car (sort (copy-list (cons (package-name package) (package-nicknames package))) - #'< :key #'length)))) - -;;; Definition titles for DOCUMENTATION instances - -(defgeneric title-using-kind/name (kind name doc)) - -(defmethod title-using-kind/name (kind (name string) doc) - (declare (ignore kind doc)) - name) - -(defmethod title-using-kind/name (kind (name symbol) doc) - (declare (ignore kind)) - (format nil "~@[~A:~]~A" (short-package-name (get-package doc)) name)) - -(defmethod title-using-kind/name (kind (name list) doc) - (declare (ignore kind)) - (assert (setf-name-p name)) - (format nil "(setf ~@[~A:~]~A)" (short-package-name (get-package doc)) (second name))) - -(defmethod title-using-kind/name ((kind (eql 'method)) name doc) - (format nil "~{~A ~}~A" - (second name) - (title-using-kind/name nil (first name) doc))) - -(defun title-name (doc) - "Returns a string to be used as name of the definition." - (string-downcase (title-using-kind/name (get-kind doc) (get-name doc) doc))) - -(defun include-pathname (doc) - (let* ((kind (get-kind doc)) - (name (nstring-downcase - (if (eq 'package kind) - (format nil "package-~A" (alphanumize (get-name doc))) - (format nil "~A-~A-~A" - (case (get-kind doc) - ((function generic-function) "fun") - (structure "struct") - (variable "var") - (otherwise (symbol-name (get-kind doc)))) - (alphanumize (let ((*base-package* nil)) - (short-package-name (get-package doc)))) - (alphanumize (get-name doc))))))) - (make-pathname :name name :type "texinfo"))) - -;;;; documentation class and related methods - -(defclass documentation () - ((name :initarg :name :reader get-name) - (kind :initarg :kind :reader get-kind) - (string :initarg :string :reader get-string) - (children :initarg :children :initform nil :reader get-children) - (package :initform *documentation-package* :reader get-package))) - -(defmethod print-object ((documentation documentation) stream) - (print-unreadable-object (documentation stream :type t) - (princ (list (get-kind documentation) (get-name documentation)) stream))) - -(defgeneric make-documentation (x doc-type string)) - -(defmethod make-documentation ((x package) doc-type string) - (declare (ignore doc-type)) - (make-instance 'documentation - :name (name x) - :kind 'package - :string string)) - -(defmethod make-documentation (x (doc-type (eql 'function)) string) - (declare (ignore doc-type)) - (let* ((fdef (and (fboundp x) (fdefinition x))) - (name x) - (kind (cond ((and (symbolp x) (special-operator-p x)) - 'special-operator) - ((and (symbolp x) (macro-function x)) - 'macro) - ((typep fdef 'generic-function) - (assert (or (symbolp name) (setf-name-p name))) - 'generic-function) - (fdef - (assert (or (symbolp name) (setf-name-p name))) - 'function))) - (children (when (eq kind 'generic-function) - (collect-gf-documentation fdef)))) - (make-instance 'documentation - :name (name x) - :string string - :kind kind - :children children))) - -(defmethod make-documentation ((x method) doc-type string) - (declare (ignore doc-type)) - (make-instance 'documentation - :name (name x) - :kind 'method - :string string)) - -(defmethod make-documentation (x (doc-type (eql 'type)) string) - (make-instance 'documentation - :name (name x) - :string string - :kind (etypecase (find-class x nil) - (structure-class 'structure) - (standard-class 'class) - (sb-pcl::condition-class 'condition) - ((or built-in-class null) 'type)))) - -(defmethod make-documentation (x (doc-type (eql 'variable)) string) - (make-instance 'documentation - :name (name x) - :string string - :kind (if (constantp x) - 'constant - 'variable))) - -(defmethod make-documentation (x (doc-type (eql 'setf)) string) - (declare (ignore doc-type)) - (make-instance 'documentation - :name (name x) - :kind 'setf-expander - :string string)) - -(defmethod make-documentation (x doc-type string) - (make-instance 'documentation - :name (name x) - :kind doc-type - :string string)) - -(defun maybe-documentation (x doc-type) - "Returns a DOCUMENTATION instance for X and DOC-TYPE, or NIL if -there is no corresponding docstring." - (let ((docstring (docstring x doc-type))) - (when docstring - (make-documentation x doc-type docstring)))) - -(defun lambda-list (doc) - (case (get-kind doc) - ((package constant variable type structure class condition nil) - nil) - (method - (third (get-name doc))) - (t - ;; KLUDGE: Eugh. - ;; - ;; believe it or not, the above comment was written before CSR - ;; came along and obfuscated this. (2005-07-04) - (when (symbolp (get-name doc)) - (labels ((clean (x &key optional key) - (typecase x - (atom x) - ((cons (member &optional)) - (cons (car x) (clean (cdr x) :optional t))) - ((cons (member &key)) - (cons (car x) (clean (cdr x) :key t))) - ((cons (member &whole &environment)) - ;; Skip these - (clean (cdr x) :optional optional :key key)) - ((cons cons) - (cons - (cond (key (if (consp (caar x)) - (caaar x) - (caar x))) - (optional (caar x)) - (t (clean (car x)))) - (clean (cdr x) :key key :optional optional))) - (cons - (cons - (cond ((or key optional) (car x)) - (t (clean (car x)))) - (clean (cdr x) :key key :optional optional)))))) - (clean (sb-introspect:function-lambda-list (get-name doc)))))))) - -(defun get-string-name (x) - (let ((name (get-name x))) - (cond ((symbolp name) - (symbol-name name)) - ((and (consp name) (eq 'setf (car name))) - (symbol-name (second name))) - ((stringp name) - name) - (t - (error "Don't know which symbol to use for name ~S" name))))) - -(defun documentation< (x y) - (let ((p1 (position (get-kind x) *ordered-documentation-kinds*)) - (p2 (position (get-kind y) *ordered-documentation-kinds*))) - (if (or (not (and p1 p2)) (= p1 p2)) - (string< (get-string-name x) (get-string-name y)) - (< p1 p2)))) - -;;;; turning text into texinfo - -(defun escape-for-texinfo (string &optional downcasep) - "Return STRING with characters in *TEXINFO-ESCAPED-CHARS* escaped -with #\@. Optionally downcase the result." - (let ((result (with-output-to-string (s) - (loop for char across string - when (find char *texinfo-escaped-chars*) - do (write-char #\@ s) - do (write-char char s))))) - (if downcasep (nstring-downcase result) result))) - -(defun empty-p (line-number lines) - (and (< -1 line-number (length lines)) - (not (indentation (svref lines line-number))))) - -;;; line markups - -(defvar *not-symbols* '("ANSI" "CLHS")) - -(defun locate-symbols (line) - "Return a list of index pairs of symbol-like parts of LINE." - ;; This would be a good application for a regex ... - (let (result) - (flet ((grab (start end) - (unless (member (subseq line start end) '("ANSI" "CLHS")) - (push (list start end) result)))) - (do ((begin nil) - (maybe-begin t) - (i 0 (1+ i))) - ((= i (length line)) - ;; symbol at end of line - (when (and begin (or (> i (1+ begin)) - (not (member (char line begin) '(#\A #\I))))) - (grab begin i)) - (nreverse result)) - (cond - ((and begin (find (char line i) *symbol-delimiters*)) - ;; symbol end; remember it if it's not "A" or "I" - (when (or (> i (1+ begin)) (not (member (char line begin) '(#\A #\I)))) - (grab begin i)) - (setf begin nil - maybe-begin t)) - ((and begin (not (find (char line i) *symbol-characters*))) - ;; Not a symbol: abort - (setf begin nil)) - ((and maybe-begin (not begin) (find (char line i) *symbol-characters*)) - ;; potential symbol begin at this position - (setf begin i - maybe-begin nil)) - ((find (char line i) *symbol-delimiters*) - ;; potential symbol begin after this position - (setf maybe-begin t)) - (t - ;; Not reading a symbol, not at potential start of symbol - (setf maybe-begin nil))))))) - -(defun texinfo-line (line) - "Format symbols in LINE texinfo-style: either as code or as -variables if the symbol in question is contained in symbols -*TEXINFO-VARIABLES*." - (with-output-to-string (result) - (let ((last 0)) - (dolist (symbol/index (locate-symbols line)) - (write-string (subseq line last (first symbol/index)) result) - (let ((symbol-name (apply #'subseq line symbol/index))) - (format result (if (member symbol-name *texinfo-variables* - :test #'string=) - "@var{~A}" - "@code{~A}") - (string-downcase symbol-name))) - (setf last (second symbol/index))) - (write-string (subseq line last) result)))) - -;;; lisp sections - -(defun lisp-section-p (line line-number lines) - "Returns T if the given LINE looks like start of lisp code -- -ie. if it starts with whitespace followed by a paren or -semicolon, and the previous line is empty" - (let ((offset (indentation line))) - (and offset - (plusp offset) - (find (find-if-not #'whitespacep line) "(;") - (empty-p (1- line-number) lines)))) - -(defun collect-lisp-section (lines line-number) - (let ((lisp (loop for index = line-number then (1+ index) - for line = (and (< index (length lines)) (svref lines index)) - while (indentation line) - collect line))) - (values (length lisp) `("@lisp" ,@lisp "@end lisp")))) - -;;; itemized sections - -(defun maybe-itemize-offset (line) - "Return NIL or the indentation offset if LINE looks like it starts -an item in an itemization." - (let* ((offset (indentation line)) - (char (when offset (char line offset)))) - (and offset - (member char *itemize-start-characters* :test #'char=) - (char= #\Space (find-if-not (lambda (c) (char= c char)) - line :start offset)) - offset))) - -(defun collect-maybe-itemized-section (lines starting-line) - ;; Return index of next line to be processed outside - (let ((this-offset (maybe-itemize-offset (svref lines starting-line))) - (result nil) - (lines-consumed 0)) - (loop for line-number from starting-line below (length lines) - for line = (svref lines line-number) - for indentation = (indentation line) - for offset = (maybe-itemize-offset line) - do (cond - ((not indentation) - ;; empty line -- inserts paragraph. - (push "" result) - (incf lines-consumed)) - ((and offset (> indentation this-offset)) - ;; nested itemization -- handle recursively - ;; FIXME: tables in itemizations go wrong - (multiple-value-bind (sub-lines-consumed sub-itemization) - (collect-maybe-itemized-section lines line-number) - (when sub-lines-consumed - (incf line-number (1- sub-lines-consumed)) ; +1 on next loop - (incf lines-consumed sub-lines-consumed) - (setf result (nconc (nreverse sub-itemization) result))))) - ((and offset (= indentation this-offset)) - ;; start of new item - (push (format nil "@item ~A" - (texinfo-line (subseq line (1+ offset)))) - result) - (incf lines-consumed)) - ((and (not offset) (> indentation this-offset)) - ;; continued item from previous line - (push (texinfo-line line) result) - (incf lines-consumed)) - (t - ;; end of itemization - (loop-finish)))) - ;; a single-line itemization isn't. - (if (> (count-if (lambda (line) (> (length line) 0)) result) 1) - (values lines-consumed `("@itemize" ,@(reverse result) "@end itemize")) - nil))) - -;;; table sections - -(defun tabulation-body-p (offset line-number lines) - (when (< line-number (length lines)) - (let ((offset2 (indentation (svref lines line-number)))) - (and offset2 (< offset offset2))))) - -(defun tabulation-p (offset line-number lines direction) - (let ((step (ecase direction - (:backwards (1- line-number)) - (:forwards (1+ line-number))))) - (when (and (plusp line-number) (< line-number (length lines))) - (and (eql offset (indentation (svref lines line-number))) - (or (when (eq direction :backwards) - (empty-p step lines)) - (tabulation-p offset step lines direction) - (tabulation-body-p offset step lines)))))) - -(defun maybe-table-offset (line-number lines) - "Return NIL or the indentation offset if LINE looks like it starts -an item in a tabulation. Ie, if it is (1) indented, (2) preceded by an -empty line, another tabulation label, or a tabulation body, (3) and -followed another tabulation label or a tabulation body." - (let* ((line (svref lines line-number)) - (offset (indentation line)) - (prev (1- line-number)) - (next (1+ line-number))) - (when (and offset (plusp offset)) - (and (or (empty-p prev lines) - (tabulation-body-p offset prev lines) - (tabulation-p offset prev lines :backwards)) - (or (tabulation-body-p offset next lines) - (tabulation-p offset next lines :forwards)) - offset)))) - -;;; FIXME: This and itemization are very similar: could they share -;;; some code, mayhap? - -(defun collect-maybe-table-section (lines starting-line) - ;; Return index of next line to be processed outside - (let ((this-offset (maybe-table-offset starting-line lines)) - (result nil) - (lines-consumed 0)) - (loop for line-number from starting-line below (length lines) - for line = (svref lines line-number) - for indentation = (indentation line) - for offset = (maybe-table-offset line-number lines) - do (cond - ((not indentation) - ;; empty line -- inserts paragraph. - (push "" result) - (incf lines-consumed)) - ((and offset (= indentation this-offset)) - ;; start of new item, or continuation of previous item - (if (and result (search "@item" (car result) :test #'char=)) - (push (format nil "@itemx ~A" (texinfo-line line)) - result) - (progn - (push "" result) - (push (format nil "@item ~A" (texinfo-line line)) - result))) - (incf lines-consumed)) - ((> indentation this-offset) - ;; continued item from previous line - (push (texinfo-line line) result) - (incf lines-consumed)) - (t - ;; end of itemization - (loop-finish)))) - ;; a single-line table isn't. - (if (> (count-if (lambda (line) (> (length line) 0)) result) 1) - (values lines-consumed - `("" "@table @emph" ,@(reverse result) "@end table" "")) - nil))) - -;;; section markup - -(defmacro with-maybe-section (index &rest forms) - `(multiple-value-bind (count collected) (progn ,@forms) - (when count - (dolist (line collected) - (write-line line *texinfo-output*)) - (incf ,index (1- count))))) - -(defun write-texinfo-string (string &optional lambda-list) - "Try to guess as much formatting for a raw docstring as possible." - (let ((*texinfo-variables* (flatten lambda-list)) - (lines (string-lines (escape-for-texinfo string nil)))) - (loop for line-number from 0 below (length lines) - for line = (svref lines line-number) - do (cond - ((with-maybe-section line-number - (and (lisp-section-p line line-number lines) - (collect-lisp-section lines line-number)))) - ((with-maybe-section line-number - (and (maybe-itemize-offset line) - (collect-maybe-itemized-section lines line-number)))) - ((with-maybe-section line-number - (and (maybe-table-offset line-number lines) - (collect-maybe-table-section lines line-number)))) - (t - (write-line (texinfo-line line) *texinfo-output*)))))) - -;;;; texinfo formatting tools - -(defun hide-superclass-p (class-name super-name) - (let ((super-package (symbol-package super-name))) - (or - ;; KLUDGE: We assume that we don't want to advertise internal - ;; classes in CP-lists, unless the symbol we're documenting is - ;; internal as well. - (and (member super-package #.'(mapcar #'find-package *undocumented-packages*)) - (not (eq super-package (symbol-package class-name)))) - ;; KLUDGE: We don't generally want to advertise SIMPLE-ERROR or - ;; SIMPLE-CONDITION in the CPLs of conditions that inherit them - ;; simply as a matter of convenience. The assumption here is that - ;; the inheritance is incidental unless the name of the condition - ;; begins with SIMPLE-. - (and (member super-name '(simple-error simple-condition)) - (let ((prefix "SIMPLE-")) - (mismatch prefix (string class-name) :end2 (length prefix))) - t ; don't return number from MISMATCH - )))) - -(defun hide-slot-p (symbol slot) - ;; FIXME: There is no pricipal reason to avoid the slot docs fo - ;; structures and conditions, but their DOCUMENTATION T doesn't - ;; currently work with them the way we'd like. - (not (and (typep (find-class symbol nil) 'standard-class) - (docstring slot t)))) - -(defun texinfo-anchor (doc) - (format *texinfo-output* "@anchor{~A}~%" (node-name doc))) - -;;; KLUDGE: &AUX *PRINT-PRETTY* here means "no linebreaks please" -(defun texinfo-begin (doc &aux *print-pretty*) - (let ((kind (get-kind doc))) - (format *texinfo-output* "@~A {~:(~A~)} ~({~A}~@[ ~{~A~^ ~}~]~)~%" - (case kind - ((package constant variable) - "defvr") - ((structure class condition type) - "deftp") - (t - "deffn")) - (map 'string (lambda (char) (if (eql char #\-) #\Space char)) (string kind)) - (title-name doc) - ;; &foo would be amusingly bold in the pdf thanks to TeX/Texinfo - ;; interactions,so we escape the ampersand -- amusingly for TeX. - ;; sbcl.texinfo defines macros that expand @&key and friends to &key. - (mapcar (lambda (name) - (if (member name lambda-list-keywords) - (format nil "@~A" name) - name)) - (lambda-list doc))))) - -(defun texinfo-index (doc) - (let ((title (title-name doc))) - (case (get-kind doc) - ((structure type class condition) - (format *texinfo-output* "@tindex ~A~%" title)) - ((variable constant) - (format *texinfo-output* "@vindex ~A~%" title)) - ((compiler-macro function method-combination macro generic-function) - (format *texinfo-output* "@findex ~A~%" title))))) - -(defun texinfo-inferred-body (doc) - (when (member (get-kind doc) '(class structure condition)) - (let ((name (get-name doc))) - ;; class precedence list - (format *texinfo-output* "Class precedence list: @code{~(~{@lw{~A}~^, ~}~)}~%~%" - (remove-if (lambda (class) (hide-superclass-p name class)) - (mapcar #'class-name (ensure-class-precedence-list (find-class name))))) - ;; slots - (let ((slots (remove-if (lambda (slot) (hide-slot-p name slot)) - (class-direct-slots (find-class name))))) - (when slots - (format *texinfo-output* "Slots:~%@itemize~%") - (dolist (slot slots) - (format *texinfo-output* - "@item ~(@code{~A}~#[~:; --- ~]~ - ~:{~2*~@[~2:*~A~P: ~{@code{@w{~S}}~^, ~}~]~:^; ~}~)~%~%" - (slot-definition-name slot) - (remove - nil - (mapcar - (lambda (name things) - (if things - (list name (length things) things))) - '("initarg" "reader" "writer") - (list - (slot-definition-initargs slot) - (slot-definition-readers slot) - (slot-definition-writers slot))))) - ;; FIXME: Would be neater to handler as children - (write-texinfo-string (docstring slot t))) - (format *texinfo-output* "@end itemize~%~%")))))) - -(defun texinfo-body (doc) - (write-texinfo-string (get-string doc))) - -(defun texinfo-end (doc) - (write-line (case (get-kind doc) - ((package variable constant) "@end defvr") - ((structure type class condition) "@end deftp") - (t "@end deffn")) - *texinfo-output*)) - -(defun write-texinfo (doc) - "Writes TexInfo for a DOCUMENTATION instance to *TEXINFO-OUTPUT*." - (texinfo-anchor doc) - (texinfo-begin doc) - (texinfo-index doc) - (texinfo-inferred-body doc) - (texinfo-body doc) - (texinfo-end doc) - ;; FIXME: Children should be sorted one way or another - (mapc #'write-texinfo (get-children doc))) - -;;;; main logic - -(defun collect-gf-documentation (gf) - "Collects method documentation for the generic function GF" - (loop for method in (generic-function-methods gf) - for doc = (maybe-documentation method t) - when doc - collect doc)) - -(defun collect-name-documentation (name) - (loop for type in *documentation-types* - for doc = (maybe-documentation name type) - when doc - collect doc)) - -(defun collect-symbol-documentation (symbol) - "Collects all docs for a SYMBOL and (SETF SYMBOL), returns a list of -the form DOC instances. See `*documentation-types*' for the possible -values of doc-type." - (nconc (collect-name-documentation symbol) - (collect-name-documentation (list 'setf symbol)))) - -(defun collect-documentation (package) - "Collects all documentation for all external symbols of the given -package, as well as for the package itself." - (let* ((*documentation-package* (find-package package)) - (docs nil)) - (check-type package package) - (do-external-symbols (symbol package) - (setf docs (nconc (collect-symbol-documentation symbol) docs))) - (let ((doc (maybe-documentation *documentation-package* t))) - (when doc - (push doc docs))) - docs)) - -(defmacro with-texinfo-file (pathname &body forms) - `(with-open-file (*texinfo-output* ,pathname - :direction :output - :if-does-not-exist :create - :if-exists :supersede) - ,@forms)) - -(defun write-ifnottex () - ;; We use @&key, etc to escape & from TeX in lambda lists -- so we need to - ;; define them for info as well. - (flet ((macro (name) - (let ((string (string-downcase name))) - (format *texinfo-output* "@macro ~A~%~A~%@end macro~%" string string)))) - (macro '&allow-other-keys) - (macro '&optional) - (macro '&rest) - (macro '&key) - (macro '&body))) - -(defun generate-includes (directory packages &key (base-package :cl-user)) - "Create files in `directory' containing Texinfo markup of all -docstrings of each exported symbol in `packages'. `directory' is -created if necessary. If you supply a namestring that doesn't end in a -slash, you lose. The generated files are of the form -\"__.texinfo\" and can be included -via @include statements. Texinfo syntax-significant characters are -escaped in symbol names, but if a docstring contains invalid Texinfo -markup, you lose." - (handler-bind ((warning #'muffle-warning)) - (let ((directory (merge-pathnames (pathname directory))) - (*base-package* (find-package base-package))) - (ensure-directories-exist directory) - (dolist (package packages) - (dolist (doc (collect-documentation (find-package package))) - (with-texinfo-file (merge-pathnames (include-pathname doc) directory) - (write-texinfo doc)))) - (with-texinfo-file (merge-pathnames "ifnottex.texinfo" directory) - (write-ifnottex)) - directory))) - -(defun document-package (package &optional filename) - "Create a file containing all available documentation for the -exported symbols of `package' in Texinfo format. If `filename' is not -supplied, a file \".texinfo\" is generated. - -The definitions can be referenced using Texinfo statements like -@ref{__.texinfo}. Texinfo -syntax-significant characters are escaped in symbol names, but if a -docstring contains invalid Texinfo markup, you lose." - (handler-bind ((warning #'muffle-warning)) - (let* ((package (find-package package)) - (filename (or filename (make-pathname - :name (string-downcase (short-package-name package)) - :type "texinfo"))) - (docs (sort (collect-documentation package) #'documentation<))) - (with-texinfo-file filename - (dolist (doc docs) - (write-texinfo doc))) - filename))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/features.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/features.lisp deleted file mode 100644 index 67348db..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/features.lisp +++ /dev/null @@ -1,14 +0,0 @@ -(in-package :alexandria) - -(defun featurep (feature-expression) - "Returns T if the argument matches the state of the *FEATURES* -list and NIL if it does not. FEATURE-EXPRESSION can be any atom -or list acceptable to the reader macros #+ and #-." - (etypecase feature-expression - (symbol (not (null (member feature-expression *features*)))) - (cons (check-type (first feature-expression) symbol) - (eswitch ((first feature-expression) :test 'string=) - (:and (every #'featurep (rest feature-expression))) - (:or (some #'featurep (rest feature-expression))) - (:not (assert (= 2 (length feature-expression))) - (not (featurep (second feature-expression)))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/functions.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/functions.lisp deleted file mode 100644 index dd83e38..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/functions.lisp +++ /dev/null @@ -1,161 +0,0 @@ -(in-package :alexandria) - -;;; To propagate return type and allow the compiler to eliminate the IF when -;;; it is known if the argument is function or not. -(declaim (inline ensure-function)) - -(declaim (ftype (function (t) (values function &optional)) - ensure-function)) -(defun ensure-function (function-designator) - "Returns the function designated by FUNCTION-DESIGNATOR: -if FUNCTION-DESIGNATOR is a function, it is returned, otherwise -it must be a function name and its FDEFINITION is returned." - (if (functionp function-designator) - function-designator - (fdefinition function-designator))) - -(define-modify-macro ensure-functionf/1 () ensure-function) - -(defmacro ensure-functionf (&rest places) - "Multiple-place modify macro for ENSURE-FUNCTION: ensures that each of -PLACES contains a function." - `(progn ,@(mapcar (lambda (x) `(ensure-functionf/1 ,x)) places))) - -(defun disjoin (predicate &rest more-predicates) - "Returns a function that applies each of PREDICATE and MORE-PREDICATE -functions in turn to its arguments, returning the primary value of the first -predicate that returns true, without calling the remaining predicates. -If none of the predicates returns true, NIL is returned." - (declare (optimize (speed 3) (safety 1) (debug 1))) - (let ((predicate (ensure-function predicate)) - (more-predicates (mapcar #'ensure-function more-predicates))) - (lambda (&rest arguments) - (or (apply predicate arguments) - (some (lambda (p) - (declare (type function p)) - (apply p arguments)) - more-predicates))))) - -(defun conjoin (predicate &rest more-predicates) - "Returns a function that applies each of PREDICATE and MORE-PREDICATE -functions in turn to its arguments, returning NIL if any of the predicates -returns false, without calling the remaining predicates. If none of the -predicates returns false, returns the primary value of the last predicate." - (if (null more-predicates) - predicate - (lambda (&rest arguments) - (and (apply predicate arguments) - ;; Cannot simply use CL:EVERY because we want to return the - ;; non-NIL value of the last predicate if all succeed. - (do ((tail (cdr more-predicates) (cdr tail)) - (head (car more-predicates) (car tail))) - ((not tail) - (apply head arguments)) - (unless (apply head arguments) - (return nil))))))) - - -(defun compose (function &rest more-functions) - "Returns a function composed of FUNCTION and MORE-FUNCTIONS that applies its -arguments to to each in turn, starting from the rightmost of MORE-FUNCTIONS, -and then calling the next one with the primary value of the last." - (declare (optimize (speed 3) (safety 1) (debug 1))) - (reduce (lambda (f g) - (let ((f (ensure-function f)) - (g (ensure-function g))) - (lambda (&rest arguments) - (declare (dynamic-extent arguments)) - (funcall f (apply g arguments))))) - more-functions - :initial-value function)) - -(define-compiler-macro compose (function &rest more-functions) - (labels ((compose-1 (funs) - (if (cdr funs) - `(funcall ,(car funs) ,(compose-1 (cdr funs))) - `(apply ,(car funs) arguments)))) - (let* ((args (cons function more-functions)) - (funs (make-gensym-list (length args) "COMPOSE"))) - `(let ,(loop for f in funs for arg in args - collect `(,f (ensure-function ,arg))) - (declare (optimize (speed 3) (safety 1) (debug 1))) - (lambda (&rest arguments) - (declare (dynamic-extent arguments)) - ,(compose-1 funs)))))) - -(defun multiple-value-compose (function &rest more-functions) - "Returns a function composed of FUNCTION and MORE-FUNCTIONS that applies -its arguments to each in turn, starting from the rightmost of -MORE-FUNCTIONS, and then calling the next one with all the return values of -the last." - (declare (optimize (speed 3) (safety 1) (debug 1))) - (reduce (lambda (f g) - (let ((f (ensure-function f)) - (g (ensure-function g))) - (lambda (&rest arguments) - (declare (dynamic-extent arguments)) - (multiple-value-call f (apply g arguments))))) - more-functions - :initial-value function)) - -(define-compiler-macro multiple-value-compose (function &rest more-functions) - (labels ((compose-1 (funs) - (if (cdr funs) - `(multiple-value-call ,(car funs) ,(compose-1 (cdr funs))) - `(apply ,(car funs) arguments)))) - (let* ((args (cons function more-functions)) - (funs (make-gensym-list (length args) "MV-COMPOSE"))) - `(let ,(mapcar #'list funs args) - (declare (optimize (speed 3) (safety 1) (debug 1))) - (lambda (&rest arguments) - (declare (dynamic-extent arguments)) - ,(compose-1 funs)))))) - -(declaim (inline curry rcurry)) - -(defun curry (function &rest arguments) - "Returns a function that applies ARGUMENTS and the arguments -it is called with to FUNCTION." - (declare (optimize (speed 3) (safety 1))) - (let ((fn (ensure-function function))) - (lambda (&rest more) - (declare (dynamic-extent more)) - ;; Using M-V-C we don't need to append the arguments. - (multiple-value-call fn (values-list arguments) (values-list more))))) - -(define-compiler-macro curry (function &rest arguments) - (let ((curries (make-gensym-list (length arguments) "CURRY")) - (fun (gensym "FUN"))) - `(let ((,fun (ensure-function ,function)) - ,@(mapcar #'list curries arguments)) - (declare (optimize (speed 3) (safety 1))) - (lambda (&rest more) - (declare (dynamic-extent more)) - (apply ,fun ,@curries more))))) - -(defun rcurry (function &rest arguments) - "Returns a function that applies the arguments it is called -with and ARGUMENTS to FUNCTION." - (declare (optimize (speed 3) (safety 1))) - (let ((fn (ensure-function function))) - (lambda (&rest more) - (declare (dynamic-extent more)) - (multiple-value-call fn (values-list more) (values-list arguments))))) - -(define-compiler-macro rcurry (function &rest arguments) - (let ((rcurries (make-gensym-list (length arguments) "RCURRY")) - (fun (gensym "FUN"))) - `(let ((,fun (ensure-function ,function)) - ,@(mapcar #'list rcurries arguments)) - (declare (optimize (speed 3) (safety 1))) - (lambda (&rest more) - (declare (dynamic-extent more)) - (multiple-value-call ,fun (values-list more) ,@rcurries))))) - -(declaim (notinline curry rcurry)) - -(defmacro named-lambda (name lambda-list &body body) - "Expands into a lambda-expression within whose BODY NAME denotes the -corresponding function." - `(labels ((,name ,lambda-list ,@body)) - #',name)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/hash-tables.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/hash-tables.lisp deleted file mode 100644 index a9f7902..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/hash-tables.lisp +++ /dev/null @@ -1,101 +0,0 @@ -(in-package :alexandria) - -(defmacro ensure-gethash (key hash-table &optional default) - "Like GETHASH, but if KEY is not found in the HASH-TABLE saves the DEFAULT -under key before returning it. Secondary return value is true if key was -already in the table." - (once-only (key hash-table) - (with-unique-names (value presentp) - `(multiple-value-bind (,value ,presentp) (gethash ,key ,hash-table) - (if ,presentp - (values ,value ,presentp) - (values (setf (gethash ,key ,hash-table) ,default) nil)))))) - -(defun copy-hash-table (table &key key test size - rehash-size rehash-threshold) - "Returns a copy of hash table TABLE, with the same keys and values -as the TABLE. The copy has the same properties as the original, unless -overridden by the keyword arguments. - -Before each of the original values is set into the new hash-table, KEY -is invoked on the value. As KEY defaults to CL:IDENTITY, a shallow -copy is returned by default." - (setf key (or key 'identity)) - (setf test (or test (hash-table-test table))) - (setf size (or size (hash-table-size table))) - (setf rehash-size (or rehash-size (hash-table-rehash-size table))) - (setf rehash-threshold (or rehash-threshold (hash-table-rehash-threshold table))) - (let ((copy (make-hash-table :test test :size size - :rehash-size rehash-size - :rehash-threshold rehash-threshold))) - (maphash (lambda (k v) - (setf (gethash k copy) (funcall key v))) - table) - copy)) - -(declaim (inline maphash-keys)) -(defun maphash-keys (function table) - "Like MAPHASH, but calls FUNCTION with each key in the hash table TABLE." - (maphash (lambda (k v) - (declare (ignore v)) - (funcall function k)) - table)) - -(declaim (inline maphash-values)) -(defun maphash-values (function table) - "Like MAPHASH, but calls FUNCTION with each value in the hash table TABLE." - (maphash (lambda (k v) - (declare (ignore k)) - (funcall function v)) - table)) - -(defun hash-table-keys (table) - "Returns a list containing the keys of hash table TABLE." - (let ((keys nil)) - (maphash-keys (lambda (k) - (push k keys)) - table) - keys)) - -(defun hash-table-values (table) - "Returns a list containing the values of hash table TABLE." - (let ((values nil)) - (maphash-values (lambda (v) - (push v values)) - table) - values)) - -(defun hash-table-alist (table) - "Returns an association list containing the keys and values of hash table -TABLE." - (let ((alist nil)) - (maphash (lambda (k v) - (push (cons k v) alist)) - table) - alist)) - -(defun hash-table-plist (table) - "Returns a property list containing the keys and values of hash table -TABLE." - (let ((plist nil)) - (maphash (lambda (k v) - (setf plist (list* k v plist))) - table) - plist)) - -(defun alist-hash-table (alist &rest hash-table-initargs) - "Returns a hash table containing the keys and values of the association list -ALIST. Hash table is initialized using the HASH-TABLE-INITARGS." - (let ((table (apply #'make-hash-table hash-table-initargs))) - (dolist (cons alist) - (ensure-gethash (car cons) table (cdr cons))) - table)) - -(defun plist-hash-table (plist &rest hash-table-initargs) - "Returns a hash table containing the keys and values of the property list -PLIST. Hash table is initialized using the HASH-TABLE-INITARGS." - (let ((table (apply #'make-hash-table hash-table-initargs))) - (do ((tail plist (cddr tail))) - ((not tail)) - (ensure-gethash (car tail) table (cadr tail))) - table)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/io.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/io.lisp deleted file mode 100644 index 28bf5e6..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/io.lisp +++ /dev/null @@ -1,172 +0,0 @@ -;; Copyright (c) 2002-2006, Edward Marco Baringer -;; All rights reserved. - -(in-package :alexandria) - -(defmacro with-open-file* ((stream filespec &key direction element-type - if-exists if-does-not-exist external-format) - &body body) - "Just like WITH-OPEN-FILE, but NIL values in the keyword arguments mean to use -the default value specified for OPEN." - (once-only (direction element-type if-exists if-does-not-exist external-format) - `(with-open-stream - (,stream (apply #'open ,filespec - (append - (when ,direction - (list :direction ,direction)) - (when ,element-type - (list :element-type ,element-type)) - (when ,if-exists - (list :if-exists ,if-exists)) - (when ,if-does-not-exist - (list :if-does-not-exist ,if-does-not-exist)) - (when ,external-format - (list :external-format ,external-format))))) - ,@body))) - -(defmacro with-input-from-file ((stream-name file-name &rest args - &key (direction nil direction-p) - &allow-other-keys) - &body body) - "Evaluate BODY with STREAM-NAME to an input stream on the file -FILE-NAME. ARGS is sent as is to the call to OPEN except EXTERNAL-FORMAT, -which is only sent to WITH-OPEN-FILE when it's not NIL." - (declare (ignore direction)) - (when direction-p - (error "Can't specify :DIRECTION for WITH-INPUT-FROM-FILE.")) - `(with-open-file* (,stream-name ,file-name :direction :input ,@args) - ,@body)) - -(defmacro with-output-to-file ((stream-name file-name &rest args - &key (direction nil direction-p) - &allow-other-keys) - &body body) - "Evaluate BODY with STREAM-NAME to an output stream on the file -FILE-NAME. ARGS is sent as is to the call to OPEN except EXTERNAL-FORMAT, -which is only sent to WITH-OPEN-FILE when it's not NIL." - (declare (ignore direction)) - (when direction-p - (error "Can't specify :DIRECTION for WITH-OUTPUT-TO-FILE.")) - `(with-open-file* (,stream-name ,file-name :direction :output ,@args) - ,@body)) - -(defun read-stream-content-into-string (stream &key (buffer-size 4096)) - "Return the \"content\" of STREAM as a fresh string." - (check-type buffer-size positive-integer) - (let ((*print-pretty* nil)) - (with-output-to-string (datum) - (let ((buffer (make-array buffer-size :element-type 'character))) - (loop - :for bytes-read = (read-sequence buffer stream) - :do (write-sequence buffer datum :start 0 :end bytes-read) - :while (= bytes-read buffer-size)))))) - -(defun read-file-into-string (pathname &key (buffer-size 4096) external-format) - "Return the contents of the file denoted by PATHNAME as a fresh string. - -The EXTERNAL-FORMAT parameter will be passed directly to WITH-OPEN-FILE -unless it's NIL, which means the system default." - (with-input-from-file - (file-stream pathname :external-format external-format) - (read-stream-content-into-string file-stream :buffer-size buffer-size))) - -(defun write-string-into-file (string pathname &key (if-exists :error) - if-does-not-exist - external-format) - "Write STRING to PATHNAME. - -The EXTERNAL-FORMAT parameter will be passed directly to WITH-OPEN-FILE -unless it's NIL, which means the system default." - (with-output-to-file (file-stream pathname :if-exists if-exists - :if-does-not-exist if-does-not-exist - :external-format external-format) - (write-sequence string file-stream))) - -(defun read-stream-content-into-byte-vector (stream &key ((%length length)) - (initial-size 4096)) - "Return \"content\" of STREAM as freshly allocated (unsigned-byte 8) vector." - (check-type length (or null non-negative-integer)) - (check-type initial-size positive-integer) - (do ((buffer (make-array (or length initial-size) - :element-type '(unsigned-byte 8))) - (offset 0) - (offset-wanted 0)) - ((or (/= offset-wanted offset) - (and length (>= offset length))) - (if (= offset (length buffer)) - buffer - (subseq buffer 0 offset))) - (unless (zerop offset) - (let ((new-buffer (make-array (* 2 (length buffer)) - :element-type '(unsigned-byte 8)))) - (replace new-buffer buffer) - (setf buffer new-buffer))) - (setf offset-wanted (length buffer) - offset (read-sequence buffer stream :start offset)))) - -(defun read-file-into-byte-vector (pathname) - "Read PATHNAME into a freshly allocated (unsigned-byte 8) vector." - (with-input-from-file (stream pathname :element-type '(unsigned-byte 8)) - (read-stream-content-into-byte-vector stream '%length (file-length stream)))) - -(defun write-byte-vector-into-file (bytes pathname &key (if-exists :error) - if-does-not-exist) - "Write BYTES to PATHNAME." - (check-type bytes (vector (unsigned-byte 8))) - (with-output-to-file (stream pathname :if-exists if-exists - :if-does-not-exist if-does-not-exist - :element-type '(unsigned-byte 8)) - (write-sequence bytes stream))) - -(defun copy-file (from to &key (if-to-exists :supersede) - (element-type '(unsigned-byte 8)) finish-output) - (with-input-from-file (input from :element-type element-type) - (with-output-to-file (output to :element-type element-type - :if-exists if-to-exists) - (copy-stream input output - :element-type element-type - :finish-output finish-output)))) - -(defun copy-stream (input output &key (element-type (stream-element-type input)) - (buffer-size 4096) - (buffer (make-array buffer-size :element-type element-type)) - (start 0) end - finish-output) - "Reads data from INPUT and writes it to OUTPUT. Both INPUT and OUTPUT must -be streams, they will be passed to READ-SEQUENCE and WRITE-SEQUENCE and must have -compatible element-types." - (check-type start non-negative-integer) - (check-type end (or null non-negative-integer)) - (check-type buffer-size positive-integer) - (when (and end - (< end start)) - (error "END is smaller than START in ~S" 'copy-stream)) - (let ((output-position 0) - (input-position 0)) - (unless (zerop start) - ;; FIXME add platform specific optimization to skip seekable streams - (loop while (< input-position start) - do (let ((n (read-sequence buffer input - :end (min (length buffer) - (- start input-position))))) - (when (zerop n) - (error "~@" 'copy-stream start)) - (incf input-position n)))) - (assert (= input-position start)) - (loop while (or (null end) (< input-position end)) - do (let ((n (read-sequence buffer input - :end (when end - (min (length buffer) - (- end input-position)))))) - (when (zerop n) - (if end - (error "~@" 'copy-stream end) - (return))) - (incf input-position n) - (write-sequence buffer output :end n) - (incf output-position n))) - (when finish-output - (finish-output output)) - output-position)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/lists.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/lists.lisp deleted file mode 100644 index 5128607..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/lists.lisp +++ /dev/null @@ -1,367 +0,0 @@ -(in-package :alexandria) - -(declaim (inline safe-endp)) -(defun safe-endp (x) - (declare (optimize safety)) - (endp x)) - -(defun alist-plist (alist) - "Returns a property list containing the same keys and values as the -association list ALIST in the same order." - (let (plist) - (dolist (pair alist) - (push (car pair) plist) - (push (cdr pair) plist)) - (nreverse plist))) - -(defun plist-alist (plist) - "Returns an association list containing the same keys and values as the -property list PLIST in the same order." - (let (alist) - (do ((tail plist (cddr tail))) - ((safe-endp tail) (nreverse alist)) - (push (cons (car tail) (cadr tail)) alist)))) - -(declaim (inline racons)) -(defun racons (key value ralist) - (acons value key ralist)) - -(macrolet - ((define-alist-get (name get-entry get-value-from-entry add doc) - `(progn - (declaim (inline ,name)) - (defun ,name (alist key &key (test 'eql)) - ,doc - (let ((entry (,get-entry key alist :test test))) - (values (,get-value-from-entry entry) entry))) - (define-setf-expander ,name (place key &key (test ''eql) - &environment env) - (multiple-value-bind - (temporary-variables initforms newvals setter getter) - (get-setf-expansion place env) - (when (cdr newvals) - (error "~A cannot store multiple values in one place" ',name)) - (with-unique-names (new-value key-val test-val alist entry) - (values - (append temporary-variables - (list alist - key-val - test-val - entry)) - (append initforms - (list getter - key - test - `(,',get-entry ,key-val ,alist :test ,test-val))) - `(,new-value) - `(cond - (,entry - (setf (,',get-value-from-entry ,entry) ,new-value)) - (t - (let ,newvals - (setf ,(first newvals) (,',add ,key ,new-value ,alist)) - ,setter - ,new-value))) - `(,',get-value-from-entry ,entry)))))))) - (define-alist-get assoc-value assoc cdr acons -"ASSOC-VALUE is an alist accessor very much like ASSOC, but it can -be used with SETF.") - (define-alist-get rassoc-value rassoc car racons -"RASSOC-VALUE is an alist accessor very much like RASSOC, but it can -be used with SETF.")) - -(defun malformed-plist (plist) - (error "Malformed plist: ~S" plist)) - -(defmacro doplist ((key val plist &optional values) &body body) - "Iterates over elements of PLIST. BODY can be preceded by -declarations, and is like a TAGBODY. RETURN may be used to terminate -the iteration early. If RETURN is not used, returns VALUES." - (multiple-value-bind (forms declarations) (parse-body body) - (with-gensyms (tail loop results) - `(block nil - (flet ((,results () - (let (,key ,val) - (declare (ignorable ,key ,val)) - (return ,values)))) - (let* ((,tail ,plist) - (,key (if ,tail - (pop ,tail) - (,results))) - (,val (if ,tail - (pop ,tail) - (malformed-plist ',plist)))) - (declare (ignorable ,key ,val)) - ,@declarations - (tagbody - ,loop - ,@forms - (setf ,key (if ,tail - (pop ,tail) - (,results)) - ,val (if ,tail - (pop ,tail) - (malformed-plist ',plist))) - (go ,loop)))))))) - -(define-modify-macro appendf (&rest lists) append - "Modify-macro for APPEND. Appends LISTS to the place designated by the first -argument.") - -(define-modify-macro nconcf (&rest lists) nconc - "Modify-macro for NCONC. Concatenates LISTS to place designated by the first -argument.") - -(define-modify-macro unionf (list &rest args) union - "Modify-macro for UNION. Saves the union of LIST and the contents of the -place designated by the first argument to the designated place.") - -(define-modify-macro nunionf (list &rest args) nunion - "Modify-macro for NUNION. Saves the union of LIST and the contents of the -place designated by the first argument to the designated place. May modify -either argument.") - -(define-modify-macro reversef () reverse - "Modify-macro for REVERSE. Copies and reverses the list stored in the given -place and saves back the result into the place.") - -(define-modify-macro nreversef () nreverse - "Modify-macro for NREVERSE. Reverses the list stored in the given place by -destructively modifying it and saves back the result into the place.") - -(defun circular-list (&rest elements) - "Creates a circular list of ELEMENTS." - (let ((cycle (copy-list elements))) - (nconc cycle cycle))) - -(defun circular-list-p (object) - "Returns true if OBJECT is a circular list, NIL otherwise." - (and (listp object) - (do ((fast object (cddr fast)) - (slow (cons (car object) (cdr object)) (cdr slow))) - (nil) - (unless (and (consp fast) (listp (cdr fast))) - (return nil)) - (when (eq fast slow) - (return t))))) - -(defun circular-tree-p (object) - "Returns true if OBJECT is a circular tree, NIL otherwise." - (labels ((circularp (object seen) - (and (consp object) - (do ((fast (cons (car object) (cdr object)) (cddr fast)) - (slow object (cdr slow))) - (nil) - (when (or (eq fast slow) (member slow seen)) - (return-from circular-tree-p t)) - (when (or (not (consp fast)) (not (consp (cdr slow)))) - (return - (do ((tail object (cdr tail))) - ((not (consp tail)) - nil) - (let ((elt (car tail))) - (circularp elt (cons object seen)))))))))) - (circularp object nil))) - -(defun proper-list-p (object) - "Returns true if OBJECT is a proper list." - (cond ((not object) - t) - ((consp object) - (do ((fast object (cddr fast)) - (slow (cons (car object) (cdr object)) (cdr slow))) - (nil) - (unless (and (listp fast) (consp (cdr fast))) - (return (and (listp fast) (not (cdr fast))))) - (when (eq fast slow) - (return nil)))) - (t - nil))) - -(deftype proper-list () - "Type designator for proper lists. Implemented as a SATISFIES type, hence -not recommended for performance intensive use. Main usefullness as a type -designator of the expected type in a TYPE-ERROR." - `(and list (satisfies proper-list-p))) - -(defun circular-list-error (list) - (error 'type-error - :datum list - :expected-type '(and list (not circular-list)))) - -(macrolet ((def (name lambda-list doc step declare ret1 ret2) - (assert (member 'list lambda-list)) - `(defun ,name ,lambda-list - ,doc - (do ((last list fast) - (fast list (cddr fast)) - (slow (cons (car list) (cdr list)) (cdr slow)) - ,@(when step (list step))) - (nil) - (declare (dynamic-extent slow) ,@(when declare (list declare)) - (ignorable last)) - (when (safe-endp fast) - (return ,ret1)) - (when (safe-endp (cdr fast)) - (return ,ret2)) - (when (eq fast slow) - (circular-list-error list)))))) - (def proper-list-length (list) - "Returns length of LIST, signalling an error if it is not a proper list." - (n 1 (+ n 2)) - ;; KLUDGE: Most implementations don't actually support lists with bignum - ;; elements -- and this is WAY faster on most implementations then declaring - ;; N to be an UNSIGNED-BYTE. - (fixnum n) - (1- n) - n) - - (def lastcar (list) - "Returns the last element of LIST. Signals a type-error if LIST is not a -proper list." - nil - nil - (cadr last) - (car fast)) - - (def (setf lastcar) (object list) - "Sets the last element of LIST. Signals a type-error if LIST is not a proper -list." - nil - nil - (setf (cadr last) object) - (setf (car fast) object))) - -(defun make-circular-list (length &key initial-element) - "Creates a circular list of LENGTH with the given INITIAL-ELEMENT." - (let ((cycle (make-list length :initial-element initial-element))) - (nconc cycle cycle))) - -(deftype circular-list () - "Type designator for circular lists. Implemented as a SATISFIES type, so not -recommended for performance intensive use. Main usefullness as the -expected-type designator of a TYPE-ERROR." - `(satisfies circular-list-p)) - -(defun ensure-car (thing) - "If THING is a CONS, its CAR is returned. Otherwise THING is returned." - (if (consp thing) - (car thing) - thing)) - -(defun ensure-cons (cons) - "If CONS is a cons, it is returned. Otherwise returns a fresh cons with CONS - in the car, and NIL in the cdr." - (if (consp cons) - cons - (cons cons nil))) - -(defun ensure-list (list) - "If LIST is a list, it is returned. Otherwise returns the list designated by LIST." - (if (listp list) - list - (list list))) - -(defun remove-from-plist (plist &rest keys) - "Returns a propery-list with same keys and values as PLIST, except that keys -in the list designated by KEYS and values corresponding to them are removed. -The returned property-list may share structure with the PLIST, but PLIST is -not destructively modified. Keys are compared using EQ." - (declare (optimize (speed 3))) - ;; FIXME: possible optimization: (remove-from-plist '(:x 0 :a 1 :b 2) :a) - ;; could return the tail without consing up a new list. - (loop for (key . rest) on plist by #'cddr - do (assert rest () "Expected a proper plist, got ~S" plist) - unless (member key keys :test #'eq) - collect key and collect (first rest))) - -(defun delete-from-plist (plist &rest keys) - "Just like REMOVE-FROM-PLIST, but this version may destructively modify the -provided PLIST." - (declare (optimize speed)) - (loop with head = plist - with tail = nil ; a nil tail means an empty result so far - for (key . rest) on plist by #'cddr - do (assert rest () "Expected a proper plist, got ~S" plist) - (if (member key keys :test #'eq) - ;; skip over this pair - (let ((next (cdr rest))) - (if tail - (setf (cdr tail) next) - (setf head next))) - ;; keep this pair - (setf tail rest)) - finally (return head))) - -(define-modify-macro remove-from-plistf (&rest keys) remove-from-plist - "Modify macro for REMOVE-FROM-PLIST.") -(define-modify-macro delete-from-plistf (&rest keys) delete-from-plist - "Modify macro for DELETE-FROM-PLIST.") - -(declaim (inline sans)) -(defun sans (plist &rest keys) - "Alias of REMOVE-FROM-PLIST for backward compatibility." - (apply #'remove-from-plist plist keys)) - -(defun mappend (function &rest lists) - "Applies FUNCTION to respective element(s) of each LIST, appending all the -all the result list to a single list. FUNCTION must return a list." - (loop for results in (apply #'mapcar function lists) - append results)) - -(defun setp (object &key (test #'eql) (key #'identity)) - "Returns true if OBJECT is a list that denotes a set, NIL otherwise. A list -denotes a set if each element of the list is unique under KEY and TEST." - (and (listp object) - (let (seen) - (dolist (elt object t) - (let ((key (funcall key elt))) - (if (member key seen :test test) - (return nil) - (push key seen))))))) - -(defun set-equal (list1 list2 &key (test #'eql) (key nil keyp)) - "Returns true if every element of LIST1 matches some element of LIST2 and -every element of LIST2 matches some element of LIST1. Otherwise returns false." - (let ((keylist1 (if keyp (mapcar key list1) list1)) - (keylist2 (if keyp (mapcar key list2) list2))) - (and (dolist (elt keylist1 t) - (or (member elt keylist2 :test test) - (return nil))) - (dolist (elt keylist2 t) - (or (member elt keylist1 :test test) - (return nil)))))) - -(defun map-product (function list &rest more-lists) - "Returns a list containing the results of calling FUNCTION with one argument -from LIST, and one from each of MORE-LISTS for each combination of arguments. -In other words, returns the product of LIST and MORE-LISTS using FUNCTION. - -Example: - - (map-product 'list '(1 2) '(3 4) '(5 6)) - => ((1 3 5) (1 3 6) (1 4 5) (1 4 6) - (2 3 5) (2 3 6) (2 4 5) (2 4 6)) -" - (labels ((%map-product (f lists) - (let ((more (cdr lists)) - (one (car lists))) - (if (not more) - (mapcar f one) - (mappend (lambda (x) - (%map-product (curry f x) more)) - one))))) - (%map-product (ensure-function function) (cons list more-lists)))) - -(defun flatten (tree) - "Traverses the tree in order, collecting non-null leaves into a list." - (let (list) - (labels ((traverse (subtree) - (when subtree - (if (consp subtree) - (progn - (traverse (car subtree)) - (traverse (cdr subtree))) - (push subtree list))))) - (traverse tree)) - (nreverse list))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/macros.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/macros.lisp deleted file mode 100644 index 4364ad6..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/macros.lisp +++ /dev/null @@ -1,370 +0,0 @@ -(in-package :alexandria) - -(defmacro with-gensyms (names &body forms) - "Binds a set of variables to gensyms and evaluates the implicit progn FORMS. - -Each element within NAMES is either a symbol SYMBOL or a pair (SYMBOL -STRING-DESIGNATOR). Bare symbols are equivalent to the pair (SYMBOL SYMBOL). - -Each pair (SYMBOL STRING-DESIGNATOR) specifies that the variable named by SYMBOL -should be bound to a symbol constructed using GENSYM with the string designated -by STRING-DESIGNATOR being its first argument." - `(let ,(mapcar (lambda (name) - (multiple-value-bind (symbol string) - (etypecase name - (symbol - (values name (symbol-name name))) - ((cons symbol (cons string-designator null)) - (values (first name) (string (second name))))) - `(,symbol (gensym ,string)))) - names) - ,@forms)) - -(defmacro with-unique-names (names &body forms) - "Alias for WITH-GENSYMS." - `(with-gensyms ,names ,@forms)) - -(defmacro once-only (specs &body forms) - "Constructs code whose primary goal is to help automate the handling of -multiple evaluation within macros. Multiple evaluation is handled by introducing -intermediate variables, in order to reuse the result of an expression. - -The returned value is a list of the form - - (let (( ) - ... - ( )) - ) - -where GENSYM-1, ..., GENSYM-N are the intermediate variables introduced in order -to evaluate EXPR-1, ..., EXPR-N once, only. RES is code that is the result of -evaluating the implicit progn FORMS within a special context determined by -SPECS. RES should make use of (reference) the intermediate variables. - -Each element within SPECS is either a symbol SYMBOL or a pair (SYMBOL INITFORM). -Bare symbols are equivalent to the pair (SYMBOL SYMBOL). - -Each pair (SYMBOL INITFORM) specifies a single intermediate variable: - -- INITFORM is an expression evaluated to produce EXPR-i - -- SYMBOL is the name of the variable that will be bound around FORMS to the - corresponding gensym GENSYM-i, in order for FORMS to generate RES that - references the intermediate variable - -The evaluation of INITFORMs and binding of SYMBOLs resembles LET. INITFORMs of -all the pairs are evaluated before binding SYMBOLs and evaluating FORMS. - -Example: - - The following expression - - (let ((x '(incf y))) - (once-only (x) - `(cons ,x ,x))) - - ;;; => - ;;; (let ((#1=#:X123 (incf y))) - ;;; (cons #1# #1#)) - - could be used within a macro to avoid multiple evaluation like so - - (defmacro cons1 (x) - (once-only (x) - `(cons ,x ,x))) - - (let ((y 0)) - (cons1 (incf y))) - - ;;; => (1 . 1) - -Example: - - The following expression demonstrates the usage of the INITFORM field - - (let ((expr '(incf y))) - (once-only ((var `(1+ ,expr))) - `(list ',expr ,var ,var))) - - ;;; => - ;;; (let ((#1=#:VAR123 (1+ (incf y)))) - ;;; (list '(incf y) #1# #1)) - - which could be used like so - - (defmacro print-succ-twice (expr) - (once-only ((var `(1+ ,expr))) - `(format t \"Expr: ~s, Once: ~s, Twice: ~s~%\" ',expr ,var ,var))) - - (let ((y 10)) - (print-succ-twice (incf y))) - - ;;; >> - ;;; Expr: (INCF Y), Once: 12, Twice: 12" - (let ((gensyms (make-gensym-list (length specs) "ONCE-ONLY")) - (names-and-forms (mapcar (lambda (spec) - (etypecase spec - (list - (destructuring-bind (name form) spec - (cons name form))) - (symbol - (cons spec spec)))) - specs))) - ;; bind in user-macro - `(let ,(mapcar (lambda (g n) (list g `(gensym ,(string (car n))))) - gensyms names-and-forms) - ;; bind in final expansion - `(let (,,@(mapcar (lambda (g n) - ``(,,g ,,(cdr n))) - gensyms names-and-forms)) - ;; bind in user-macro - ,(let ,(mapcar (lambda (n g) (list (car n) g)) - names-and-forms gensyms) - ,@forms))))) - -(defun parse-body (body &key documentation whole) - "Parses BODY into (values remaining-forms declarations doc-string). -Documentation strings are recognized only if DOCUMENTATION is true. -Syntax errors in body are signalled and WHOLE is used in the signal -arguments when given." - (let ((doc nil) - (decls nil) - (current nil)) - (tagbody - :declarations - (setf current (car body)) - (when (and documentation (stringp current) (cdr body)) - (if doc - (error "Too many documentation strings in ~S." (or whole body)) - (setf doc (pop body))) - (go :declarations)) - (when (and (listp current) (eql (first current) 'declare)) - (push (pop body) decls) - (go :declarations))) - (values body (nreverse decls) doc))) - -(defun parse-ordinary-lambda-list (lambda-list &key (normalize t) - allow-specializers - (normalize-optional normalize) - (normalize-keyword normalize) - (normalize-auxilary normalize)) - "Parses an ordinary lambda-list, returning as multiple values: - -1. Required parameters. - -2. Optional parameter specifications, normalized into form: - - (name init suppliedp) - -3. Name of the rest parameter, or NIL. - -4. Keyword parameter specifications, normalized into form: - - ((keyword-name name) init suppliedp) - -5. Boolean indicating &ALLOW-OTHER-KEYS presence. - -6. &AUX parameter specifications, normalized into form - - (name init). - -7. Existence of &KEY in the lambda-list. - -Signals a PROGRAM-ERROR is the lambda-list is malformed." - (let ((state :required) - (allow-other-keys nil) - (auxp nil) - (required nil) - (optional nil) - (rest nil) - (keys nil) - (keyp nil) - (aux nil)) - (labels ((fail (elt) - (simple-program-error "Misplaced ~S in ordinary lambda-list:~% ~S" - elt lambda-list)) - (check-variable (elt what &optional (allow-specializers allow-specializers)) - (unless (and (or (symbolp elt) - (and allow-specializers - (consp elt) (= 2 (length elt)) (symbolp (first elt)))) - (not (constantp elt))) - (simple-program-error "Invalid ~A ~S in ordinary lambda-list:~% ~S" - what elt lambda-list))) - (check-spec (spec what) - (destructuring-bind (init suppliedp) spec - (declare (ignore init)) - (check-variable suppliedp what nil)))) - (dolist (elt lambda-list) - (case elt - (&optional - (if (eq state :required) - (setf state elt) - (fail elt))) - (&rest - (if (member state '(:required &optional)) - (setf state elt) - (fail elt))) - (&key - (if (member state '(:required &optional :after-rest)) - (setf state elt) - (fail elt)) - (setf keyp t)) - (&allow-other-keys - (if (eq state '&key) - (setf allow-other-keys t - state elt) - (fail elt))) - (&aux - (cond ((eq state '&rest) - (fail elt)) - (auxp - (simple-program-error "Multiple ~S in ordinary lambda-list:~% ~S" - elt lambda-list)) - (t - (setf auxp t - state elt)) - )) - (otherwise - (when (member elt '#.(set-difference lambda-list-keywords - '(&optional &rest &key &allow-other-keys &aux))) - (simple-program-error - "Bad lambda-list keyword ~S in ordinary lambda-list:~% ~S" - elt lambda-list)) - (case state - (:required - (check-variable elt "required parameter") - (push elt required)) - (&optional - (cond ((consp elt) - (destructuring-bind (name &rest tail) elt - (check-variable name "optional parameter") - (cond ((cdr tail) - (check-spec tail "optional-supplied-p parameter")) - ((and normalize-optional tail) - (setf elt (append elt '(nil)))) - (normalize-optional - (setf elt (append elt '(nil nil))))))) - (t - (check-variable elt "optional parameter") - (when normalize-optional - (setf elt (cons elt '(nil nil)))))) - (push (ensure-list elt) optional)) - (&rest - (check-variable elt "rest parameter") - (setf rest elt - state :after-rest)) - (&key - (cond ((consp elt) - (destructuring-bind (var-or-kv &rest tail) elt - (cond ((consp var-or-kv) - (destructuring-bind (keyword var) var-or-kv - (unless (symbolp keyword) - (simple-program-error "Invalid keyword name ~S in ordinary ~ - lambda-list:~% ~S" - keyword lambda-list)) - (check-variable var "keyword parameter"))) - (t - (check-variable var-or-kv "keyword parameter") - (when normalize-keyword - (setf var-or-kv (list (make-keyword var-or-kv) var-or-kv))))) - (cond ((cdr tail) - (check-spec tail "keyword-supplied-p parameter")) - ((and normalize-keyword tail) - (setf tail (append tail '(nil)))) - (normalize-keyword - (setf tail '(nil nil)))) - (setf elt (cons var-or-kv tail)))) - (t - (check-variable elt "keyword parameter") - (setf elt (if normalize-keyword - (list (list (make-keyword elt) elt) nil nil) - elt)))) - (push elt keys)) - (&aux - (if (consp elt) - (destructuring-bind (var &optional init) elt - (declare (ignore init)) - (check-variable var "&aux parameter")) - (progn - (check-variable elt "&aux parameter") - (setf elt (list* elt (when normalize-auxilary - '(nil)))))) - (push elt aux)) - (t - (simple-program-error "Invalid ordinary lambda-list:~% ~S" lambda-list))))))) - (values (nreverse required) (nreverse optional) rest (nreverse keys) - allow-other-keys (nreverse aux) keyp))) - -;;;; DESTRUCTURING-*CASE - -(defun expand-destructuring-case (key clauses case) - (once-only (key) - `(if (typep ,key 'cons) - (,case (car ,key) - ,@(mapcar (lambda (clause) - (destructuring-bind ((keys . lambda-list) &body body) clause - `(,keys - (destructuring-bind ,lambda-list (cdr ,key) - ,@body)))) - clauses)) - (error "Invalid key to DESTRUCTURING-~S: ~S" ',case ,key)))) - -(defmacro destructuring-case (keyform &body clauses) - "DESTRUCTURING-CASE, -CCASE, and -ECASE are a combination of CASE and DESTRUCTURING-BIND. -KEYFORM must evaluate to a CONS. - -Clauses are of the form: - - ((CASE-KEYS . DESTRUCTURING-LAMBDA-LIST) FORM*) - -The clause whose CASE-KEYS matches CAR of KEY, as if by CASE, CCASE, or ECASE, -is selected, and FORMs are then executed with CDR of KEY is destructured and -bound by the DESTRUCTURING-LAMBDA-LIST. - -Example: - - (defun dcase (x) - (destructuring-case x - ((:foo a b) - (format nil \"foo: ~S, ~S\" a b)) - ((:bar &key a b) - (format nil \"bar: ~S, ~S\" a b)) - (((:alt1 :alt2) a) - (format nil \"alt: ~S\" a)) - ((t &rest rest) - (format nil \"unknown: ~S\" rest)))) - - (dcase (list :foo 1 2)) ; => \"foo: 1, 2\" - (dcase (list :bar :a 1 :b 2)) ; => \"bar: 1, 2\" - (dcase (list :alt1 1)) ; => \"alt: 1\" - (dcase (list :alt2 2)) ; => \"alt: 2\" - (dcase (list :quux 1 2 3)) ; => \"unknown: 1, 2, 3\" - - (defun decase (x) - (destructuring-case x - ((:foo a b) - (format nil \"foo: ~S, ~S\" a b)) - ((:bar &key a b) - (format nil \"bar: ~S, ~S\" a b)) - (((:alt1 :alt2) a) - (format nil \"alt: ~S\" a)))) - - (decase (list :foo 1 2)) ; => \"foo: 1, 2\" - (decase (list :bar :a 1 :b 2)) ; => \"bar: 1, 2\" - (decase (list :alt1 1)) ; => \"alt: 1\" - (decase (list :alt2 2)) ; => \"alt: 2\" - (decase (list :quux 1 2 3)) ; =| error -" - (expand-destructuring-case keyform clauses 'case)) - -(defmacro destructuring-ccase (keyform &body clauses) - (expand-destructuring-case keyform clauses 'ccase)) - -(defmacro destructuring-ecase (keyform &body clauses) - (expand-destructuring-case keyform clauses 'ecase)) - -(dolist (name '(destructuring-ccase destructuring-ecase)) - (setf (documentation name 'function) (documentation 'destructuring-case 'function))) - - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/numbers.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/numbers.lisp deleted file mode 100644 index 1c06f71..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/numbers.lisp +++ /dev/null @@ -1,295 +0,0 @@ -(in-package :alexandria) - -(declaim (inline clamp)) -(defun clamp (number min max) - "Clamps the NUMBER into [min, max] range. Returns MIN if NUMBER is lesser then -MIN and MAX if NUMBER is greater then MAX, otherwise returns NUMBER." - (if (< number min) - min - (if (> number max) - max - number))) - -(defun gaussian-random (&optional min max) - "Returns two gaussian random double floats as the primary and secondary value, -optionally constrained by MIN and MAX. Gaussian random numbers form a standard -normal distribution around 0.0d0. - -Sufficiently positive MIN or negative MAX will cause the algorithm used to -take a very long time. If MIN is positive it should be close to zero, and -similarly if MAX is negative it should be close to zero." - (macrolet - ((valid (x) - `(<= (or min ,x) ,x (or max ,x)) )) - (labels - ((gauss () - (loop - for x1 = (- (random 2.0d0) 1.0d0) - for x2 = (- (random 2.0d0) 1.0d0) - for w = (+ (expt x1 2) (expt x2 2)) - when (< w 1.0d0) - do (let ((v (sqrt (/ (* -2.0d0 (log w)) w)))) - (return (values (* x1 v) (* x2 v)))))) - (guard (x) - (unless (valid x) - (tagbody - :retry - (multiple-value-bind (x1 x2) (gauss) - (when (valid x1) - (setf x x1) - (go :done)) - (when (valid x2) - (setf x x2) - (go :done)) - (go :retry)) - :done)) - x)) - (multiple-value-bind - (g1 g2) (gauss) - (values (guard g1) (guard g2)))))) - -(declaim (inline iota)) -(defun iota (n &key (start 0) (step 1)) - "Return a list of n numbers, starting from START (with numeric contagion -from STEP applied), each consequtive number being the sum of the previous one -and STEP. START defaults to 0 and STEP to 1. - -Examples: - - (iota 4) => (0 1 2 3) - (iota 3 :start 1 :step 1.0) => (1.0 2.0 3.0) - (iota 3 :start -1 :step -1/2) => (-1 -3/2 -2) -" - (declare (type (integer 0) n) (number start step)) - (loop ;; KLUDGE: get numeric contagion right for the first element too - for i = (+ (- (+ start step) step)) then (+ i step) - repeat n - collect i)) - -(declaim (inline map-iota)) -(defun map-iota (function n &key (start 0) (step 1)) - "Calls FUNCTION with N numbers, starting from START (with numeric contagion -from STEP applied), each consequtive number being the sum of the previous one -and STEP. START defaults to 0 and STEP to 1. Returns N. - -Examples: - - (map-iota #'print 3 :start 1 :step 1.0) => 3 - ;;; 1.0 - ;;; 2.0 - ;;; 3.0 -" - (declare (type (integer 0) n) (number start step)) - (loop ;; KLUDGE: get numeric contagion right for the first element too - for i = (+ start (- step step)) then (+ i step) - repeat n - do (funcall function i)) - n) - -(declaim (inline lerp)) -(defun lerp (v a b) - "Returns the result of linear interpolation between A and B, using the -interpolation coefficient V." - ;; The correct version is numerically stable, at the expense of an - ;; extra multiply. See (lerp 0.1 4 25) with (+ a (* v (- b a))). The - ;; unstable version can often be converted to a fast instruction on - ;; a lot of machines, though this is machine/implementation - ;; specific. As alexandria is more about correct code, than - ;; efficiency, and we're only talking about a single extra multiply, - ;; many would prefer the stable version - (+ (* (- 1.0 v) a) (* v b))) - -(declaim (inline mean)) -(defun mean (sample) - "Returns the mean of SAMPLE. SAMPLE must be a sequence of numbers." - (/ (reduce #'+ sample) (length sample))) - -(defun median (sample) - "Returns median of SAMPLE. SAMPLE must be a sequence of real numbers." - ;; Implements and uses the quick-select algorithm to find the median - ;; https://en.wikipedia.org/wiki/Quickselect - - (labels ((randint-in-range (start-int end-int) - "Returns a random integer in the specified range, inclusive" - (+ start-int (random (1+ (- end-int start-int))))) - (partition (vec start-i end-i) - "Implements the partition function, which performs a partial - sort of vec around the (randomly) chosen pivot. - Returns the index where the pivot element would be located - in a correctly-sorted array" - (if (= start-i end-i) - start-i - (let ((pivot-i (randint-in-range start-i end-i))) - (rotatef (aref vec start-i) (aref vec pivot-i)) - (let ((swap-i end-i)) - (loop for i from swap-i downto (1+ start-i) do - (when (>= (aref vec i) (aref vec start-i)) - (rotatef (aref vec i) (aref vec swap-i)) - (decf swap-i))) - (rotatef (aref vec swap-i) (aref vec start-i)) - swap-i))))) - - (let* ((vector (copy-sequence 'vector sample)) - (len (length vector)) - (mid-i (ash len -1)) - (i 0) - (j (1- len))) - - (loop for correct-pos = (partition vector i j) - while (/= correct-pos mid-i) do - (if (< correct-pos mid-i) - (setf i (1+ correct-pos)) - (setf j (1- correct-pos)))) - - (if (oddp len) - (aref vector mid-i) - (* 1/2 - (+ (aref vector mid-i) - (reduce #'max (make-array - mid-i - :displaced-to vector)))))))) - -(declaim (inline variance)) -(defun variance (sample &key (biased t)) - "Variance of SAMPLE. Returns the biased variance if BIASED is true (the default), -and the unbiased estimator of variance if BIASED is false. SAMPLE must be a -sequence of numbers." - (let ((mean (mean sample))) - (/ (reduce (lambda (a b) - (+ a (expt (- b mean) 2))) - sample - :initial-value 0) - (- (length sample) (if biased 0 1))))) - -(declaim (inline standard-deviation)) -(defun standard-deviation (sample &key (biased t)) - "Standard deviation of SAMPLE. Returns the biased standard deviation if -BIASED is true (the default), and the square root of the unbiased estimator -for variance if BIASED is false (which is not the same as the unbiased -estimator for standard deviation). SAMPLE must be a sequence of numbers." - (sqrt (variance sample :biased biased))) - -(define-modify-macro maxf (&rest numbers) max - "Modify-macro for MAX. Sets place designated by the first argument to the -maximum of its original value and NUMBERS.") - -(define-modify-macro minf (&rest numbers) min - "Modify-macro for MIN. Sets place designated by the first argument to the -minimum of its original value and NUMBERS.") - -;;;; Factorial - -;;; KLUDGE: This is really dependant on the numbers in question: for -;;; small numbers this is larger, and vice versa. Ideally instead of a -;;; constant we would have RANGE-FAST-TO-MULTIPLY-DIRECTLY-P. -(defconstant +factorial-bisection-range-limit+ 8) - -;;; KLUDGE: This is really platform dependant: ideally we would use -;;; (load-time-value (find-good-direct-multiplication-limit)) instead. -(defconstant +factorial-direct-multiplication-limit+ 13) - -(defun %multiply-range (i j) - ;; We use a a bit of cleverness here: - ;; - ;; 1. For large factorials we bisect in order to avoid expensive bignum - ;; multiplications: 1 x 2 x 3 x ... runs into bignums pretty soon, - ;; and once it does that all further multiplications will be with bignums. - ;; - ;; By instead doing the multiplication in a tree like - ;; ((1 x 2) x (3 x 4)) x ((5 x 6) x (7 x 8)) - ;; we manage to get less bignums. - ;; - ;; 2. Division isn't exactly free either, however, so we don't bisect - ;; all the way down, but multiply ranges of integers close to each - ;; other directly. - ;; - ;; For even better results it should be possible to use prime - ;; factorization magic, but Nikodemus ran out of steam. - ;; - ;; KLUDGE: We support factorials of bignums, but it seems quite - ;; unlikely anyone would ever be able to use them on a modern lisp, - ;; since the resulting numbers are unlikely to fit in memory... but - ;; it would be extremely unelegant to define FACTORIAL only on - ;; fixnums, _and_ on lisps with 16 bit fixnums this can actually be - ;; needed. - (labels ((bisect (j k) - (declare (type (integer 1 #.most-positive-fixnum) j k)) - (if (< (- k j) +factorial-bisection-range-limit+) - (multiply-range j k) - (let ((middle (+ j (truncate (- k j) 2)))) - (* (bisect j middle) - (bisect (+ middle 1) k))))) - (bisect-big (j k) - (declare (type (integer 1) j k)) - (if (= j k) - j - (let ((middle (+ j (truncate (- k j) 2)))) - (* (if (<= middle most-positive-fixnum) - (bisect j middle) - (bisect-big j middle)) - (bisect-big (+ middle 1) k))))) - (multiply-range (j k) - (declare (type (integer 1 #.most-positive-fixnum) j k)) - (do ((f k (* f m)) - (m (1- k) (1- m))) - ((< m j) f) - (declare (type (integer 0 (#.most-positive-fixnum)) m) - (type unsigned-byte f))))) - (if (and (typep i 'fixnum) (typep j 'fixnum)) - (bisect i j) - (bisect-big i j)))) - -(declaim (inline factorial)) -(defun %factorial (n) - (if (< n 2) - 1 - (%multiply-range 1 n))) - -(defun factorial (n) - "Factorial of non-negative integer N." - (check-type n (integer 0)) - (%factorial n)) - -;;;; Combinatorics - -(defun binomial-coefficient (n k) - "Binomial coefficient of N and K, also expressed as N choose K. This is the -number of K element combinations given N choises. N must be equal to or -greater then K." - (check-type n (integer 0)) - (check-type k (integer 0)) - (assert (>= n k)) - (if (or (zerop k) (= n k)) - 1 - (let ((n-k (- n k))) - ;; Swaps K and N-K if K < N-K because the algorithm - ;; below is faster for bigger K and smaller N-K - (when (< k n-k) - (rotatef k n-k)) - (if (= 1 n-k) - n - ;; General case, avoid computing the 1x...xK twice: - ;; - ;; N! 1x...xN (K+1)x...xN - ;; -------- = ---------------- = ------------, N>1 - ;; K!(N-K)! 1x...xK x (N-K)! (N-K)! - (/ (%multiply-range (+ k 1) n) - (%factorial n-k)))))) - -(defun subfactorial (n) - "Subfactorial of the non-negative integer N." - (check-type n (integer 0)) - (if (zerop n) - 1 - (do ((x 1 (1+ x)) - (a 0 (* x (+ a b))) - (b 1 a)) - ((= n x) a)))) - -(defun count-permutations (n &optional (k n)) - "Number of K element permutations for a sequence of N objects. -K defaults to N" - (check-type n (integer 0)) - (check-type k (integer 0)) - (assert (>= n k)) - (%multiply-range (1+ (- n k)) n)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/package.lisp deleted file mode 100644 index f9d2014..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/package.lisp +++ /dev/null @@ -1,243 +0,0 @@ -(defpackage :alexandria.1.0.0 - (:nicknames :alexandria) - (:use :cl) - #+sb-package-locks - (:lock t) - (:export - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; BLESSED - ;; - ;; Binding constructs - #:if-let - #:when-let - #:when-let* - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; REVIEW IN PROGRESS - ;; - ;; Control flow - ;; - ;; -- no clear consensus yet -- - #:cswitch - #:eswitch - #:switch - ;; -- problem free? -- - #:multiple-value-prog2 - #:nth-value-or - #:whichever - #:xor - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; REVIEW PENDING - ;; - ;; Definitions - #:define-constant - ;; Hash tables - #:alist-hash-table - #:copy-hash-table - #:ensure-gethash - #:hash-table-alist - #:hash-table-keys - #:hash-table-plist - #:hash-table-values - #:maphash-keys - #:maphash-values - #:plist-hash-table - ;; Functions - #:compose - #:conjoin - #:curry - #:disjoin - #:ensure-function - #:ensure-functionf - #:multiple-value-compose - #:named-lambda - #:rcurry - ;; Lists - #:alist-plist - #:appendf - #:nconcf - #:reversef - #:nreversef - #:circular-list - #:circular-list-p - #:circular-tree-p - #:doplist - #:ensure-car - #:ensure-cons - #:ensure-list - #:flatten - #:lastcar - #:make-circular-list - #:map-product - #:mappend - #:nunionf - #:plist-alist - #:proper-list - #:proper-list-length - #:proper-list-p - #:remove-from-plist - #:remove-from-plistf - #:delete-from-plist - #:delete-from-plistf - #:set-equal - #:setp - #:unionf - ;; Numbers - #:binomial-coefficient - #:clamp - #:count-permutations - #:factorial - #:gaussian-random - #:iota - #:lerp - #:map-iota - #:maxf - #:mean - #:median - #:minf - #:standard-deviation - #:subfactorial - #:variance - ;; Arrays - #:array-index - #:array-length - #:copy-array - ;; Sequences - #:copy-sequence - #:deletef - #:emptyp - #:ends-with - #:ends-with-subseq - #:extremum - #:first-elt - #:last-elt - #:length= - #:map-combinations - #:map-derangements - #:map-permutations - #:proper-sequence - #:random-elt - #:removef - #:rotate - #:sequence-of-length-p - #:shuffle - #:starts-with - #:starts-with-subseq - ;; Macros - #:once-only - #:parse-body - #:parse-ordinary-lambda-list - #:with-gensyms - #:with-unique-names - ;; Symbols - #:ensure-symbol - #:format-symbol - #:make-gensym - #:make-gensym-list - #:make-keyword - ;; Strings - #:string-designator - ;; Types - #:negative-double-float - #:negative-fixnum-p - #:negative-float - #:negative-float-p - #:negative-long-float - #:negative-long-float-p - #:negative-rational - #:negative-rational-p - #:negative-real - #:negative-single-float-p - #:non-negative-double-float - #:non-negative-double-float-p - #:non-negative-fixnum - #:non-negative-fixnum-p - #:non-negative-float - #:non-negative-float-p - #:non-negative-integer-p - #:non-negative-long-float - #:non-negative-rational - #:non-negative-real-p - #:non-negative-short-float-p - #:non-negative-single-float - #:non-negative-single-float-p - #:non-positive-double-float - #:non-positive-double-float-p - #:non-positive-fixnum - #:non-positive-fixnum-p - #:non-positive-float - #:non-positive-float-p - #:non-positive-integer - #:non-positive-rational - #:non-positive-real - #:non-positive-real-p - #:non-positive-short-float - #:non-positive-short-float-p - #:non-positive-single-float-p - #:positive-double-float - #:positive-double-float-p - #:positive-fixnum - #:positive-fixnum-p - #:positive-float - #:positive-float-p - #:positive-integer - #:positive-rational - #:positive-real - #:positive-real-p - #:positive-short-float - #:positive-short-float-p - #:positive-single-float - #:positive-single-float-p - #:coercef - #:negative-double-float-p - #:negative-fixnum - #:negative-integer - #:negative-integer-p - #:negative-real-p - #:negative-short-float - #:negative-short-float-p - #:negative-single-float - #:non-negative-integer - #:non-negative-long-float-p - #:non-negative-rational-p - #:non-negative-real - #:non-negative-short-float - #:non-positive-integer-p - #:non-positive-long-float - #:non-positive-long-float-p - #:non-positive-rational-p - #:non-positive-single-float - #:of-type - #:positive-integer-p - #:positive-long-float - #:positive-long-float-p - #:positive-rational-p - #:type= - ;; Conditions - #:required-argument - #:ignore-some-conditions - #:simple-style-warning - #:simple-reader-error - #:simple-parse-error - #:simple-program-error - #:unwind-protect-case - ;; Features - #:featurep - ;; io - #:with-input-from-file - #:with-output-to-file - #:read-stream-content-into-string - #:read-file-into-string - #:write-string-into-file - #:read-stream-content-into-byte-vector - #:read-file-into-byte-vector - #:write-byte-vector-into-file - #:copy-stream - #:copy-file - ;; new additions collected at the end (subject to removal or further changes) - #:symbolicate - #:assoc-value - #:rassoc-value - #:destructuring-case - #:destructuring-ccase - #:destructuring-ecase - )) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/sequences.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/sequences.lisp deleted file mode 100644 index 21464f5..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/sequences.lisp +++ /dev/null @@ -1,555 +0,0 @@ -(in-package :alexandria) - -;; Make these inlinable by declaiming them INLINE here and some of them -;; NOTINLINE at the end of the file. Exclude functions that have a compiler -;; macro, because NOTINLINE is required to prevent compiler-macro expansion. -(declaim (inline copy-sequence sequence-of-length-p)) - -(defun sequence-of-length-p (sequence length) - "Return true if SEQUENCE is a sequence of length LENGTH. Signals an error if -SEQUENCE is not a sequence. Returns FALSE for circular lists." - (declare (type array-index length) - #-lispworks (inline length) - (optimize speed)) - (etypecase sequence - (null - (zerop length)) - (cons - (let ((n (1- length))) - (unless (minusp n) - (let ((tail (nthcdr n sequence))) - (and tail - (null (cdr tail))))))) - (vector - (= length (length sequence))) - (sequence - (= length (length sequence))))) - -(defun rotate-tail-to-head (sequence n) - (declare (type (integer 1) n)) - (if (listp sequence) - (let ((m (mod n (proper-list-length sequence)))) - (if (null (cdr sequence)) - sequence - (let* ((tail (last sequence (+ m 1))) - (last (cdr tail))) - (setf (cdr tail) nil) - (nconc last sequence)))) - (let* ((len (length sequence)) - (m (mod n len)) - (tail (subseq sequence (- len m)))) - (replace sequence sequence :start1 m :start2 0) - (replace sequence tail) - sequence))) - -(defun rotate-head-to-tail (sequence n) - (declare (type (integer 1) n)) - (if (listp sequence) - (let ((m (mod (1- n) (proper-list-length sequence)))) - (if (null (cdr sequence)) - sequence - (let* ((headtail (nthcdr m sequence)) - (tail (cdr headtail))) - (setf (cdr headtail) nil) - (nconc tail sequence)))) - (let* ((len (length sequence)) - (m (mod n len)) - (head (subseq sequence 0 m))) - (replace sequence sequence :start1 0 :start2 m) - (replace sequence head :start1 (- len m)) - sequence))) - -(defun rotate (sequence &optional (n 1)) - "Returns a sequence of the same type as SEQUENCE, with the elements of -SEQUENCE rotated by N: N elements are moved from the end of the sequence to -the front if N is positive, and -N elements moved from the front to the end if -N is negative. SEQUENCE must be a proper sequence. N must be an integer, -defaulting to 1. - -If absolute value of N is greater then the length of the sequence, the results -are identical to calling ROTATE with - - (* (signum n) (mod n (length sequence))). - -Note: the original sequence may be destructively altered, and result sequence may -share structure with it." - (if (plusp n) - (rotate-tail-to-head sequence n) - (if (minusp n) - (rotate-head-to-tail sequence (- n)) - sequence))) - -(defun shuffle (sequence &key (start 0) end) - "Returns a random permutation of SEQUENCE bounded by START and END. -Original sequence may be destructively modified, and (if it contains -CONS or lists themselv) share storage with the original one. -Signals an error if SEQUENCE is not a proper sequence." - (declare (type fixnum start) - (type (or fixnum null) end)) - (etypecase sequence - (list - (let* ((end (or end (proper-list-length sequence))) - (n (- end start))) - (do ((tail (nthcdr start sequence) (cdr tail))) - ((zerop n)) - (rotatef (car tail) (car (nthcdr (random n) tail))) - (decf n)))) - (vector - (let ((end (or end (length sequence)))) - (loop for i from start below end - do (rotatef (aref sequence i) - (aref sequence (+ i (random (- end i)))))))) - (sequence - (let ((end (or end (length sequence)))) - (loop for i from (- end 1) downto start - do (rotatef (elt sequence i) - (elt sequence (+ i (random (- end i))))))))) - sequence) - -(defun random-elt (sequence &key (start 0) end) - "Returns a random element from SEQUENCE bounded by START and END. Signals an -error if the SEQUENCE is not a proper non-empty sequence, or if END and START -are not proper bounding index designators for SEQUENCE." - (declare (sequence sequence) (fixnum start) (type (or fixnum null) end)) - (let* ((size (if (listp sequence) - (proper-list-length sequence) - (length sequence))) - (end2 (or end size))) - (cond ((zerop size) - (error 'type-error - :datum sequence - :expected-type `(and sequence (not (satisfies emptyp))))) - ((not (and (<= 0 start) (< start end2) (<= end2 size))) - (error 'simple-type-error - :datum (cons start end) - :expected-type `(cons (integer 0 (,end2)) - (or null (integer (,start) ,size))) - :format-control "~@<~S and ~S are not valid bounding index designators for ~ - a sequence of length ~S.~:@>" - :format-arguments (list start end size))) - (t - (let ((index (+ start (random (- end2 start))))) - (elt sequence index)))))) - -(declaim (inline remove/swapped-arguments)) -(defun remove/swapped-arguments (sequence item &rest keyword-arguments) - (apply #'remove item sequence keyword-arguments)) - -(define-modify-macro removef (item &rest keyword-arguments) - remove/swapped-arguments - "Modify-macro for REMOVE. Sets place designated by the first argument to -the result of calling REMOVE with ITEM, place, and the KEYWORD-ARGUMENTS.") - -(declaim (inline delete/swapped-arguments)) -(defun delete/swapped-arguments (sequence item &rest keyword-arguments) - (apply #'delete item sequence keyword-arguments)) - -(define-modify-macro deletef (item &rest keyword-arguments) - delete/swapped-arguments - "Modify-macro for DELETE. Sets place designated by the first argument to -the result of calling DELETE with ITEM, place, and the KEYWORD-ARGUMENTS.") - -(deftype proper-sequence () - "Type designator for proper sequences, that is proper lists and sequences -that are not lists." - `(or proper-list - (and (not list) sequence))) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (when (and (find-package '#:sequence) - (find-symbol (string '#:emptyp) '#:sequence)) - (pushnew 'sequence-emptyp *features*))) - -#-alexandria::sequence-emptyp -(defun emptyp (sequence) - "Returns true if SEQUENCE is an empty sequence. Signals an error if SEQUENCE -is not a sequence." - (etypecase sequence - (list (null sequence)) - (sequence (zerop (length sequence))))) - -#+alexandria::sequence-emptyp -(declaim (ftype (function (sequence) (values boolean &optional)) emptyp)) -#+alexandria::sequence-emptyp -(setf (symbol-function 'emptyp) (symbol-function 'sequence:emptyp)) -#+alexandria::sequence-emptyp -(define-compiler-macro emptyp (sequence) - `(sequence:emptyp ,sequence)) - -(defun length= (&rest sequences) - "Takes any number of sequences or integers in any order. Returns true iff -the length of all the sequences and the integers are equal. Hint: there's a -compiler macro that expands into more efficient code if the first argument -is a literal integer." - (declare (dynamic-extent sequences) - (inline sequence-of-length-p) - (optimize speed)) - (unless (cdr sequences) - (error "You must call LENGTH= with at least two arguments")) - ;; There's room for optimization here: multiple list arguments could be - ;; traversed in parallel. - (let* ((first (pop sequences)) - (current (if (integerp first) - first - (length first)))) - (declare (type array-index current)) - (dolist (el sequences) - (if (integerp el) - (unless (= el current) - (return-from length= nil)) - (unless (sequence-of-length-p el current) - (return-from length= nil))))) - t) - -(define-compiler-macro length= (&whole form length &rest sequences) - (cond - ((zerop (length sequences)) - form) - (t - (let ((optimizedp (integerp length))) - (with-unique-names (tmp current) - (declare (ignorable current)) - `(locally - (declare (inline sequence-of-length-p)) - (let ((,tmp) - ,@(unless optimizedp - `((,current ,length)))) - ,@(unless optimizedp - `((unless (integerp ,current) - (setf ,current (length ,current))))) - (and - ,@(loop - :for sequence :in sequences - :collect `(progn - (setf ,tmp ,sequence) - (if (integerp ,tmp) - (= ,tmp ,(if optimizedp - length - current)) - (sequence-of-length-p ,tmp ,(if optimizedp - length - current))))))))))))) - -(defun copy-sequence (type sequence) - "Returns a fresh sequence of TYPE, which has the same elements as -SEQUENCE." - (if (typep sequence type) - (copy-seq sequence) - (coerce sequence type))) - -(defun first-elt (sequence) - "Returns the first element of SEQUENCE. Signals a type-error if SEQUENCE is -not a sequence, or is an empty sequence." - ;; Can't just directly use ELT, as it is not guaranteed to signal the - ;; type-error. - (cond ((consp sequence) - (car sequence)) - ((and (typep sequence 'sequence) (not (emptyp sequence))) - (elt sequence 0)) - (t - (error 'type-error - :datum sequence - :expected-type '(and sequence (not (satisfies emptyp))))))) - -(defun (setf first-elt) (object sequence) - "Sets the first element of SEQUENCE. Signals a type-error if SEQUENCE is -not a sequence, is an empty sequence, or if OBJECT cannot be stored in SEQUENCE." - ;; Can't just directly use ELT, as it is not guaranteed to signal the - ;; type-error. - (cond ((consp sequence) - (setf (car sequence) object)) - ((and (typep sequence 'sequence) (not (emptyp sequence))) - (setf (elt sequence 0) object)) - (t - (error 'type-error - :datum sequence - :expected-type '(and sequence (not (satisfies emptyp))))))) - -(defun last-elt (sequence) - "Returns the last element of SEQUENCE. Signals a type-error if SEQUENCE is -not a proper sequence, or is an empty sequence." - ;; Can't just directly use ELT, as it is not guaranteed to signal the - ;; type-error. - (let ((len 0)) - (cond ((consp sequence) - (lastcar sequence)) - ((and (typep sequence '(and sequence (not list))) (plusp (setf len (length sequence)))) - (elt sequence (1- len))) - (t - (error 'type-error - :datum sequence - :expected-type '(and proper-sequence (not (satisfies emptyp)))))))) - -(defun (setf last-elt) (object sequence) - "Sets the last element of SEQUENCE. Signals a type-error if SEQUENCE is not a proper -sequence, is an empty sequence, or if OBJECT cannot be stored in SEQUENCE." - (let ((len 0)) - (cond ((consp sequence) - (setf (lastcar sequence) object)) - ((and (typep sequence '(and sequence (not list))) (plusp (setf len (length sequence)))) - (setf (elt sequence (1- len)) object)) - (t - (error 'type-error - :datum sequence - :expected-type '(and proper-sequence (not (satisfies emptyp)))))))) - -(defun starts-with-subseq (prefix sequence &rest args - &key - (return-suffix nil return-suffix-supplied-p) - &allow-other-keys) - "Test whether the first elements of SEQUENCE are the same (as per TEST) as the elements of PREFIX. - -If RETURN-SUFFIX is T the function returns, as a second value, a -sub-sequence or displaced array pointing to the sequence after PREFIX." - (declare (dynamic-extent args)) - (let ((sequence-length (length sequence)) - (prefix-length (length prefix))) - (when (< sequence-length prefix-length) - (return-from starts-with-subseq (values nil nil))) - (flet ((make-suffix (start) - (when return-suffix - (cond - ((not (arrayp sequence)) - (if start - (subseq sequence start) - (subseq sequence 0 0))) - ((not start) - (make-array 0 - :element-type (array-element-type sequence) - :adjustable nil)) - (t - (make-array (- sequence-length start) - :element-type (array-element-type sequence) - :displaced-to sequence - :displaced-index-offset start - :adjustable nil)))))) - (let ((mismatch (apply #'mismatch prefix sequence - (if return-suffix-supplied-p - (remove-from-plist args :return-suffix) - args)))) - (cond - ((not mismatch) - (values t (make-suffix nil))) - ((= mismatch prefix-length) - (values t (make-suffix mismatch))) - (t - (values nil nil))))))) - -(defun ends-with-subseq (suffix sequence &key (test #'eql)) - "Test whether SEQUENCE ends with SUFFIX. In other words: return true if -the last (length SUFFIX) elements of SEQUENCE are equal to SUFFIX." - (let ((sequence-length (length sequence)) - (suffix-length (length suffix))) - (when (< sequence-length suffix-length) - ;; if SEQUENCE is shorter than SUFFIX, then SEQUENCE can't end with SUFFIX. - (return-from ends-with-subseq nil)) - (loop for sequence-index from (- sequence-length suffix-length) below sequence-length - for suffix-index from 0 below suffix-length - when (not (funcall test (elt sequence sequence-index) (elt suffix suffix-index))) - do (return-from ends-with-subseq nil) - finally (return t)))) - -(defun starts-with (object sequence &key (test #'eql) (key #'identity)) - "Returns true if SEQUENCE is a sequence whose first element is EQL to OBJECT. -Returns NIL if the SEQUENCE is not a sequence or is an empty sequence." - (let ((first-elt (typecase sequence - (cons (car sequence)) - (sequence - (if (emptyp sequence) - (return-from starts-with nil) - (elt sequence 0))) - (t - (return-from starts-with nil))))) - (funcall test (funcall key first-elt) object))) - -(defun ends-with (object sequence &key (test #'eql) (key #'identity)) - "Returns true if SEQUENCE is a sequence whose last element is EQL to OBJECT. -Returns NIL if the SEQUENCE is not a sequence or is an empty sequence. Signals -an error if SEQUENCE is an improper list." - (let ((last-elt (typecase sequence - (cons - (lastcar sequence)) ; signals for improper lists - (sequence - ;; Can't use last-elt, as that signals an error - ;; for empty sequences - (let ((len (length sequence))) - (if (plusp len) - (elt sequence (1- len)) - (return-from ends-with nil)))) - (t - (return-from ends-with nil))))) - (funcall test (funcall key last-elt) object))) - -(defun map-combinations (function sequence &key (start 0) end length (copy t)) - "Calls FUNCTION with each combination of LENGTH constructable from the -elements of the subsequence of SEQUENCE delimited by START and END. START -defaults to 0, END to length of SEQUENCE, and LENGTH to the length of the -delimited subsequence. (So unless LENGTH is specified there is only a single -combination, which has the same elements as the delimited subsequence.) If -COPY is true (the default) each combination is freshly allocated. If COPY is -false all combinations are EQ to each other, in which case consequences are -unspecified if a combination is modified by FUNCTION." - (let* ((end (or end (length sequence))) - (size (- end start)) - (length (or length size)) - (combination (subseq sequence 0 length)) - (function (ensure-function function))) - (if (= length size) - (funcall function combination) - (flet ((call () - (funcall function (if copy - (copy-seq combination) - combination)))) - (etypecase sequence - ;; When dealing with lists we prefer walking back and - ;; forth instead of using indexes. - (list - (labels ((combine-list (c-tail o-tail) - (if (not c-tail) - (call) - (do ((tail o-tail (cdr tail))) - ((not tail)) - (setf (car c-tail) (car tail)) - (combine-list (cdr c-tail) (cdr tail)))))) - (combine-list combination (nthcdr start sequence)))) - (vector - (labels ((combine (count start) - (if (zerop count) - (call) - (loop for i from start below end - do (let ((j (- count 1))) - (setf (aref combination j) (aref sequence i)) - (combine j (+ i 1))))))) - (combine length start))) - (sequence - (labels ((combine (count start) - (if (zerop count) - (call) - (loop for i from start below end - do (let ((j (- count 1))) - (setf (elt combination j) (elt sequence i)) - (combine j (+ i 1))))))) - (combine length start))))))) - sequence) - -(defun map-permutations (function sequence &key (start 0) end length (copy t)) - "Calls function with each permutation of LENGTH constructable -from the subsequence of SEQUENCE delimited by START and END. START -defaults to 0, END to length of the sequence, and LENGTH to the -length of the delimited subsequence." - (let* ((end (or end (length sequence))) - (size (- end start)) - (length (or length size))) - (labels ((permute (seq n) - (let ((n-1 (- n 1))) - (if (zerop n-1) - (funcall function (if copy - (copy-seq seq) - seq)) - (loop for i from 0 upto n-1 - do (permute seq n-1) - (if (evenp n-1) - (rotatef (elt seq 0) (elt seq n-1)) - (rotatef (elt seq i) (elt seq n-1))))))) - (permute-sequence (seq) - (permute seq length))) - (if (= length size) - ;; Things are simple if we need to just permute the - ;; full START-END range. - (permute-sequence (subseq sequence start end)) - ;; Otherwise we need to generate all the combinations - ;; of LENGTH in the START-END range, and then permute - ;; a copy of the result: can't permute the combination - ;; directly, as they share structure with each other. - (let ((permutation (subseq sequence 0 length))) - (flet ((permute-combination (combination) - (permute-sequence (replace permutation combination)))) - (declare (dynamic-extent #'permute-combination)) - (map-combinations #'permute-combination sequence - :start start - :end end - :length length - :copy nil))))))) - -(defun map-derangements (function sequence &key (start 0) end (copy t)) - "Calls FUNCTION with each derangement of the subsequence of SEQUENCE denoted -by the bounding index designators START and END. Derangement is a permutation -of the sequence where no element remains in place. SEQUENCE is not modified, -but individual derangements are EQ to each other. Consequences are unspecified -if calling FUNCTION modifies either the derangement or SEQUENCE." - (let* ((end (or end (length sequence))) - (size (- end start)) - ;; We don't really care about the elements here. - (derangement (subseq sequence 0 size)) - ;; Bitvector that has 1 for elements that have been deranged. - (mask (make-array size :element-type 'bit :initial-element 0))) - (declare (dynamic-extent mask)) - ;; ad hoc algorith - (labels ((derange (place n) - ;; Perform one recursive step in deranging the - ;; sequence: PLACE is index of the original sequence - ;; to derange to another index, and N is the number of - ;; indexes not yet deranged. - (if (zerop n) - (funcall function (if copy - (copy-seq derangement) - derangement)) - ;; Itarate over the indexes I of the subsequence to - ;; derange: if I != PLACE and I has not yet been - ;; deranged by an earlier call put the element from - ;; PLACE to I, mark I as deranged, and recurse, - ;; finally removing the mark. - (loop for i from 0 below size - do - (unless (or (= place (+ i start)) (not (zerop (bit mask i)))) - (setf (elt derangement i) (elt sequence place) - (bit mask i) 1) - (derange (1+ place) (1- n)) - (setf (bit mask i) 0)))))) - (derange start size) - sequence))) - -(declaim (notinline sequence-of-length-p)) - -(defun extremum (sequence predicate &key key (start 0) end) - "Returns the element of SEQUENCE that would appear first if the subsequence -bounded by START and END was sorted using PREDICATE and KEY. - -EXTREMUM determines the relationship between two elements of SEQUENCE by using -the PREDICATE function. PREDICATE should return true if and only if the first -argument is strictly less than the second one (in some appropriate sense). Two -arguments X and Y are considered to be equal if (FUNCALL PREDICATE X Y) -and (FUNCALL PREDICATE Y X) are both false. - -The arguments to the PREDICATE function are computed from elements of SEQUENCE -using the KEY function, if supplied. If KEY is not supplied or is NIL, the -sequence element itself is used. - -If SEQUENCE is empty, NIL is returned." - (let* ((pred-fun (ensure-function predicate)) - (key-fun (unless (or (not key) (eq key 'identity) (eq key #'identity)) - (ensure-function key))) - (real-end (or end (length sequence)))) - (cond ((> real-end start) - (if key-fun - (flet ((reduce-keys (a b) - (if (funcall pred-fun - (funcall key-fun a) - (funcall key-fun b)) - a - b))) - (declare (dynamic-extent #'reduce-keys)) - (reduce #'reduce-keys sequence :start start :end real-end)) - (flet ((reduce-elts (a b) - (if (funcall pred-fun a b) - a - b))) - (declare (dynamic-extent #'reduce-elts)) - (reduce #'reduce-elts sequence :start start :end real-end)))) - ((= real-end start) - nil) - (t - (error "Invalid bounding indexes for sequence of length ~S: ~S ~S, ~S ~S" - (length sequence) - :start start - :end end))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/strings.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/strings.lisp deleted file mode 100644 index e9fd91c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/strings.lisp +++ /dev/null @@ -1,6 +0,0 @@ -(in-package :alexandria) - -(deftype string-designator () - "A string designator type. A string designator is either a string, a symbol, -or a character." - `(or symbol string character)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/symbols.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/symbols.lisp deleted file mode 100644 index 5733d3e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/symbols.lisp +++ /dev/null @@ -1,65 +0,0 @@ -(in-package :alexandria) - -(declaim (inline ensure-symbol)) -(defun ensure-symbol (name &optional (package *package*)) - "Returns a symbol with name designated by NAME, accessible in package -designated by PACKAGE. If symbol is not already accessible in PACKAGE, it is -interned there. Returns a secondary value reflecting the status of the symbol -in the package, which matches the secondary return value of INTERN. - -Example: - - (ensure-symbol :cons :cl) => cl:cons, :external -" - (intern (string name) package)) - -(defun maybe-intern (name package) - (values - (if package - (intern name (if (eq t package) *package* package)) - (make-symbol name)))) - -(declaim (inline format-symbol)) -(defun format-symbol (package control &rest arguments) - "Constructs a string by applying ARGUMENTS to string designator CONTROL as -if by FORMAT within WITH-STANDARD-IO-SYNTAX, and then creates a symbol named -by that string. - -If PACKAGE is NIL, returns an uninterned symbol, if package is T, returns a -symbol interned in the current package, and otherwise returns a symbol -interned in the package designated by PACKAGE." - (maybe-intern (with-standard-io-syntax - (apply #'format nil (string control) arguments)) - package)) - -(defun make-keyword (name) - "Interns the string designated by NAME in the KEYWORD package." - (intern (string name) :keyword)) - -(defun make-gensym (name) - "If NAME is a non-negative integer, calls GENSYM using it. Otherwise NAME -must be a string designator, in which case calls GENSYM using the designated -string as the argument." - (gensym (if (typep name '(integer 0)) - name - (string name)))) - -(defun make-gensym-list (length &optional (x "G")) - "Returns a list of LENGTH gensyms, each generated as if with a call to MAKE-GENSYM, -using the second (optional, defaulting to \"G\") argument." - (let ((g (if (typep x '(integer 0)) x (string x)))) - (loop repeat length - collect (gensym g)))) - -(defun symbolicate (&rest things) - "Concatenate together the names of some strings and symbols, -producing a symbol in the current package." - (let* ((length (reduce #'+ things - :key (lambda (x) (length (string x))))) - (name (make-array length :element-type 'character))) - (let ((index 0)) - (dolist (thing things (values (intern name))) - (let* ((x (string thing)) - (len (length x))) - (replace name x :start1 index) - (incf index len)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/tests.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/tests.lisp deleted file mode 100644 index b70ef04..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/tests.lisp +++ /dev/null @@ -1,2047 +0,0 @@ -(in-package :cl-user) - -(defpackage :alexandria-tests - (:use :cl :alexandria #+sbcl :sb-rt #-sbcl :rtest) - (:import-from #+sbcl :sb-rt #-sbcl :rtest - #:*compile-tests* #:*expected-failures*)) - -(in-package :alexandria-tests) - -(defun run-tests (&key ((:compiled *compile-tests*))) - (do-tests)) - -(defun hash-table-test-name (name) - ;; Workaround for Clisp calling EQL in a hash-table FASTHASH-EQL. - (hash-table-test (make-hash-table :test name))) - -;;;; Arrays - -(deftest copy-array.1 - (let* ((orig (vector 1 2 3)) - (copy (copy-array orig))) - (values (eq orig copy) (equalp orig copy))) - nil t) - -(deftest copy-array.2 - (let ((orig (make-array 1024 :fill-pointer 0))) - (vector-push-extend 1 orig) - (vector-push-extend 2 orig) - (vector-push-extend 3 orig) - (let ((copy (copy-array orig))) - (values (eq orig copy) (equalp orig copy) - (array-has-fill-pointer-p copy) - (eql (fill-pointer orig) (fill-pointer copy))))) - nil t t t) - -(deftest copy-array.3 - (let* ((orig (vector 1 2 3)) - (copy (copy-array orig))) - (typep copy 'simple-array)) - t) - -(deftest copy-array.4 - (let ((orig (make-array 21 - :adjustable t - :fill-pointer 0))) - (dotimes (n 42) - (vector-push-extend n orig)) - (let ((copy (copy-array orig - :adjustable nil - :fill-pointer nil))) - (typep copy 'simple-array))) - t) - -(deftest array-index.1 - (typep 0 'array-index) - t) - -;;;; Conditions - -(deftest unwind-protect-case.1 - (let (result) - (unwind-protect-case () - (random 10) - (:normal (push :normal result)) - (:abort (push :abort result)) - (:always (push :always result))) - result) - (:always :normal)) - -(deftest unwind-protect-case.2 - (let (result) - (unwind-protect-case () - (random 10) - (:always (push :always result)) - (:normal (push :normal result)) - (:abort (push :abort result))) - result) - (:normal :always)) - -(deftest unwind-protect-case.3 - (let (result1 result2 result3) - (ignore-errors - (unwind-protect-case () - (error "FOOF!") - (:normal (push :normal result1)) - (:abort (push :abort result1)) - (:always (push :always result1)))) - (catch 'foof - (unwind-protect-case () - (throw 'foof 42) - (:normal (push :normal result2)) - (:abort (push :abort result2)) - (:always (push :always result2)))) - (block foof - (unwind-protect-case () - (return-from foof 42) - (:normal (push :normal result3)) - (:abort (push :abort result3)) - (:always (push :always result3)))) - (values result1 result2 result3)) - (:always :abort) - (:always :abort) - (:always :abort)) - -(deftest unwind-protect-case.4 - (let (result) - (unwind-protect-case (aborted-p) - (random 42) - (:always (setq result aborted-p))) - result) - nil) - -(deftest unwind-protect-case.5 - (let (result) - (block foof - (unwind-protect-case (aborted-p) - (return-from foof) - (:always (setq result aborted-p)))) - result) - t) - -;;;; Control flow - -(deftest switch.1 - (switch (13 :test =) - (12 :oops) - (13.0 :yay)) - :yay) - -(deftest switch.2 - (switch (13) - ((+ 12 2) :oops) - ((- 13 1) :oops2) - (t :yay)) - :yay) - -(deftest eswitch.1 - (let ((x 13)) - (eswitch (x :test =) - (12 :oops) - (13.0 :yay))) - :yay) - -(deftest eswitch.2 - (let ((x 13)) - (eswitch (x :key 1+) - (11 :oops) - (14 :yay))) - :yay) - -(deftest cswitch.1 - (cswitch (13 :test =) - (12 :oops) - (13.0 :yay)) - :yay) - -(deftest cswitch.2 - (cswitch (13 :key 1-) - (12 :yay) - (13.0 :oops)) - :yay) - -(deftest multiple-value-prog2.1 - (multiple-value-prog2 - (values 1 1 1) - (values 2 20 200) - (values 3 3 3)) - 2 20 200) - -(deftest nth-value-or.1 - (multiple-value-bind (a b c) - (nth-value-or 1 - (values 1 nil 1) - (values 2 2 2)) - (= a b c 2)) - t) - -(deftest whichever.1 - (let ((x (whichever 1 2 3))) - (and (member x '(1 2 3)) t)) - t) - -(deftest whichever.2 - (let* ((a 1) - (b 2) - (c 3) - (x (whichever a b c))) - (and (member x '(1 2 3)) t)) - t) - -(deftest xor.1 - (xor nil nil 1 nil) - 1 - t) - -(deftest xor.2 - (xor nil nil 1 2) - nil - nil) - -(deftest xor.3 - (xor nil nil nil) - nil - t) - -;;;; Definitions - -(deftest define-constant.1 - (let ((name (gensym))) - (eval `(define-constant ,name "FOO" :test 'equal)) - (eval `(define-constant ,name "FOO" :test 'equal)) - (values (equal "FOO" (symbol-value name)) - (constantp name))) - t - t) - -(deftest define-constant.2 - (let ((name (gensym))) - (eval `(define-constant ,name 13)) - (eval `(define-constant ,name 13)) - (values (eql 13 (symbol-value name)) - (constantp name))) - t - t) - -;;;; Errors - -;;; TYPEP is specified to return a generalized boolean and, for -;;; example, ECL exploits this by returning the superclasses of ERROR -;;; in this case. -(defun errorp (x) - (not (null (typep x 'error)))) - -(deftest required-argument.1 - (multiple-value-bind (res err) - (ignore-errors (required-argument)) - (errorp err)) - t) - -;;;; Hash tables - -(deftest ensure-gethash.1 - (let ((table (make-hash-table)) - (x (list 1))) - (multiple-value-bind (value already-there) - (ensure-gethash x table 42) - (and (= value 42) - (not already-there) - (= 42 (gethash x table)) - (multiple-value-bind (value2 already-there2) - (ensure-gethash x table 13) - (and (= value2 42) - already-there2 - (= 42 (gethash x table))))))) - t) - -(deftest ensure-gethash.2 - (let ((table (make-hash-table)) - (count 0)) - (multiple-value-call #'values - (ensure-gethash (progn (incf count) :foo) - (progn (incf count) table) - (progn (incf count) :bar)) - (gethash :foo table) - count)) - :bar nil :bar t 3) - -(deftest copy-hash-table.1 - (let ((orig (make-hash-table :test 'eq :size 123)) - (foo "foo")) - (setf (gethash orig orig) t - (gethash foo orig) t) - (let ((eq-copy (copy-hash-table orig)) - (eql-copy (copy-hash-table orig :test 'eql)) - (equal-copy (copy-hash-table orig :test 'equal)) - (equalp-copy (copy-hash-table orig :test 'equalp))) - (list (eql (hash-table-size eq-copy) (hash-table-size orig)) - (eql (hash-table-rehash-size eq-copy) - (hash-table-rehash-size orig)) - (hash-table-count eql-copy) - (gethash orig eq-copy) - (gethash (copy-seq foo) eql-copy) - (gethash foo eql-copy) - (gethash (copy-seq foo) equal-copy) - (gethash "FOO" equal-copy) - (gethash "FOO" equalp-copy)))) - (t t 2 t nil t t nil t)) - -(deftest copy-hash-table.2 - (let ((ht (make-hash-table)) - (list (list :list (vector :A :B :C)))) - (setf (gethash 'list ht) list) - (let* ((shallow-copy (copy-hash-table ht)) - (deep1-copy (copy-hash-table ht :key 'copy-list)) - (list (gethash 'list ht)) - (shallow-list (gethash 'list shallow-copy)) - (deep1-list (gethash 'list deep1-copy))) - (list (eq ht shallow-copy) - (eq ht deep1-copy) - (eq list shallow-list) - (eq list deep1-list) ; outer list was copied. - (eq (second list) (second shallow-list)) - (eq (second list) (second deep1-list)) ; inner vector wasn't copied. - ))) - (nil nil t nil t t)) - -(deftest maphash-keys.1 - (let ((keys nil) - (table (make-hash-table))) - (declare (notinline maphash-keys)) - (dotimes (i 10) - (setf (gethash i table) t)) - (maphash-keys (lambda (k) (push k keys)) table) - (set-equal keys '(0 1 2 3 4 5 6 7 8 9))) - t) - -(deftest maphash-values.1 - (let ((vals nil) - (table (make-hash-table))) - (declare (notinline maphash-values)) - (dotimes (i 10) - (setf (gethash i table) (- i))) - (maphash-values (lambda (v) (push v vals)) table) - (set-equal vals '(0 -1 -2 -3 -4 -5 -6 -7 -8 -9))) - t) - -(deftest hash-table-keys.1 - (let ((table (make-hash-table))) - (dotimes (i 10) - (setf (gethash i table) t)) - (set-equal (hash-table-keys table) '(0 1 2 3 4 5 6 7 8 9))) - t) - -(deftest hash-table-values.1 - (let ((table (make-hash-table))) - (dotimes (i 10) - (setf (gethash (gensym) table) i)) - (set-equal (hash-table-values table) '(0 1 2 3 4 5 6 7 8 9))) - t) - -(deftest hash-table-alist.1 - (let ((table (make-hash-table))) - (dotimes (i 10) - (setf (gethash i table) (- i))) - (let ((alist (hash-table-alist table))) - (list (length alist) - (assoc 0 alist) - (assoc 3 alist) - (assoc 9 alist) - (assoc nil alist)))) - (10 (0 . 0) (3 . -3) (9 . -9) nil)) - -(deftest hash-table-plist.1 - (let ((table (make-hash-table))) - (dotimes (i 10) - (setf (gethash i table) (- i))) - (let ((plist (hash-table-plist table))) - (list (length plist) - (getf plist 0) - (getf plist 2) - (getf plist 7) - (getf plist nil)))) - (20 0 -2 -7 nil)) - -(deftest alist-hash-table.1 - (let* ((alist '((0 a) (1 b) (2 c))) - (table (alist-hash-table alist))) - (list (hash-table-count table) - (gethash 0 table) - (gethash 1 table) - (gethash 2 table) - (eq (hash-table-test-name 'eql) - (hash-table-test table)))) - (3 (a) (b) (c) t)) - -(deftest alist-hash-table.duplicate-keys - (let* ((alist '((0 a) (1 b) (0 c) (1 d) (2 e))) - (table (alist-hash-table alist))) - (list (hash-table-count table) - (gethash 0 table) - (gethash 1 table) - (gethash 2 table))) - (3 (a) (b) (e))) - -(deftest plist-hash-table.1 - (let* ((plist '(:a 1 :b 2 :c 3)) - (table (plist-hash-table plist :test 'eq))) - (list (hash-table-count table) - (gethash :a table) - (gethash :b table) - (gethash :c table) - (gethash 2 table) - (gethash nil table) - (eq (hash-table-test-name 'eq) - (hash-table-test table)))) - (3 1 2 3 nil nil t)) - -(deftest plist-hash-table.duplicate-keys - (let* ((plist '(:a 1 :b 2 :a 3 :b 4 :c 5)) - (table (plist-hash-table plist))) - (list (hash-table-count table) - (gethash :a table) - (gethash :b table) - (gethash :c table))) - (3 1 2 5)) - -;;;; Functions - -(deftest disjoin.1 - (let ((disjunction (disjoin (lambda (x) - (and (consp x) :cons)) - (lambda (x) - (and (stringp x) :string))))) - (list (funcall disjunction 'zot) - (funcall disjunction '(foo bar)) - (funcall disjunction "test"))) - (nil :cons :string)) - -(deftest disjoin.2 - (let ((disjunction (disjoin #'zerop))) - (list (funcall disjunction 0) - (funcall disjunction 1))) - (t nil)) - -(deftest conjoin.1 - (let ((conjunction (conjoin #'consp - (lambda (x) - (stringp (car x))) - (lambda (x) - (char (car x) 0))))) - (list (funcall conjunction 'zot) - (funcall conjunction '(foo)) - (funcall conjunction '("foo")))) - (nil nil #\f)) - -(deftest conjoin.2 - (let ((conjunction (conjoin #'zerop))) - (list (funcall conjunction 0) - (funcall conjunction 1))) - (t nil)) - -(deftest compose.1 - (let ((composite (compose '1+ - (lambda (x) - (* x 2)) - #'read-from-string))) - (funcall composite "1")) - 3) - -(deftest compose.2 - (let ((composite - (locally (declare (notinline compose)) - (compose '1+ - (lambda (x) - (* x 2)) - #'read-from-string)))) - (funcall composite "2")) - 5) - -(deftest compose.3 - (let ((compose-form (funcall (compiler-macro-function 'compose) - '(compose '1+ - (lambda (x) - (* x 2)) - #'read-from-string) - nil))) - (let ((fun (funcall (compile nil `(lambda () ,compose-form))))) - (funcall fun "3"))) - 7) - -(deftest compose.4 - (let ((composite (compose #'zerop))) - (list (funcall composite 0) - (funcall composite 1))) - (t nil)) - -(deftest multiple-value-compose.1 - (let ((composite (multiple-value-compose - #'truncate - (lambda (x y) - (values y x)) - (lambda (x) - (with-input-from-string (s x) - (values (read s) (read s))))))) - (multiple-value-list (funcall composite "2 7"))) - (3 1)) - -(deftest multiple-value-compose.2 - (let ((composite (locally (declare (notinline multiple-value-compose)) - (multiple-value-compose - #'truncate - (lambda (x y) - (values y x)) - (lambda (x) - (with-input-from-string (s x) - (values (read s) (read s)))))))) - (multiple-value-list (funcall composite "2 11"))) - (5 1)) - -(deftest multiple-value-compose.3 - (let ((compose-form (funcall (compiler-macro-function 'multiple-value-compose) - '(multiple-value-compose - #'truncate - (lambda (x y) - (values y x)) - (lambda (x) - (with-input-from-string (s x) - (values (read s) (read s))))) - nil))) - (let ((fun (funcall (compile nil `(lambda () ,compose-form))))) - (multiple-value-list (funcall fun "2 9")))) - (4 1)) - -(deftest multiple-value-compose.4 - (let ((composite (multiple-value-compose #'truncate))) - (multiple-value-list (funcall composite 9 2))) - (4 1)) - -(deftest curry.1 - (let ((curried (curry '+ 3))) - (funcall curried 1 5)) - 9) - -(deftest curry.2 - (let ((curried (locally (declare (notinline curry)) - (curry '* 2 3)))) - (funcall curried 7)) - 42) - -(deftest curry.3 - (let ((curried-form (funcall (compiler-macro-function 'curry) - '(curry '/ 8) - nil))) - (let ((fun (funcall (compile nil `(lambda () ,curried-form))))) - (funcall fun 2))) - 4) - -(deftest curry.4 - (let* ((x 1) - (curried (curry (progn - (incf x) - (lambda (y z) (* x y z))) - 3))) - (list (funcall curried 7) - (funcall curried 7) - x)) - (42 42 2)) - -(deftest rcurry.1 - (let ((r (rcurry '/ 2))) - (funcall r 8)) - 4) - -(deftest rcurry.2 - (let* ((x 1) - (curried (rcurry (progn - (incf x) - (lambda (y z) (* x y z))) - 3))) - (list (funcall curried 7) - (funcall curried 7) - x)) - (42 42 2)) - -(deftest named-lambda.1 - (let ((fac (named-lambda fac (x) - (if (> x 1) - (* x (fac (- x 1))) - x)))) - (funcall fac 5)) - 120) - -(deftest named-lambda.2 - (let ((fac (named-lambda fac (&key x) - (if (> x 1) - (* x (fac :x (- x 1))) - x)))) - (funcall fac :x 5)) - 120) - -;;;; Lists - -(deftest alist-plist.1 - (alist-plist '((a . 1) (b . 2) (c . 3))) - (a 1 b 2 c 3)) - -(deftest plist-alist.1 - (plist-alist '(a 1 b 2 c 3)) - ((a . 1) (b . 2) (c . 3))) - -(deftest unionf.1 - (let* ((list (list 1 2 3)) - (orig list)) - (unionf list (list 1 2 4)) - (values (equal orig (list 1 2 3)) - (eql (length list) 4) - (set-difference list (list 1 2 3 4)) - (set-difference (list 1 2 3 4) list))) - t - t - nil - nil) - -(deftest nunionf.1 - (let ((list (list 1 2 3))) - (nunionf list (list 1 2 4)) - (values (eql (length list) 4) - (set-difference (list 1 2 3 4) list) - (set-difference list (list 1 2 3 4)))) - t - nil - nil) - -(deftest appendf.1 - (let* ((list (list 1 2 3)) - (orig list)) - (appendf list '(4 5 6) '(7 8)) - (list list (eq list orig))) - ((1 2 3 4 5 6 7 8) nil)) - -(deftest nconcf.1 - (let ((list1 (list 1 2 3)) - (list2 (list 4 5 6))) - (nconcf list1 list2 (list 7 8 9)) - list1) - (1 2 3 4 5 6 7 8 9)) - -(deftest circular-list.1 - (let ((circle (circular-list 1 2 3))) - (list (first circle) - (second circle) - (third circle) - (fourth circle) - (eq circle (nthcdr 3 circle)))) - (1 2 3 1 t)) - -(deftest circular-list-p.1 - (let* ((circle (circular-list 1 2 3 4)) - (tree (list circle circle)) - (dotted (cons circle t)) - (proper (list 1 2 3 circle)) - (tailcirc (list* 1 2 3 circle))) - (list (circular-list-p circle) - (circular-list-p tree) - (circular-list-p dotted) - (circular-list-p proper) - (circular-list-p tailcirc))) - (t nil nil nil t)) - -(deftest circular-list-p.2 - (circular-list-p 'foo) - nil) - -(deftest circular-tree-p.1 - (let* ((circle (circular-list 1 2 3 4)) - (tree1 (list circle circle)) - (tree2 (let* ((level2 (list 1 nil 2)) - (level1 (list level2))) - (setf (second level2) level1) - level1)) - (dotted (cons circle t)) - (proper (list 1 2 3 circle)) - (tailcirc (list* 1 2 3 circle)) - (quite-proper (list 1 2 3)) - (quite-dotted (list 1 (cons 2 3)))) - (list (circular-tree-p circle) - (circular-tree-p tree1) - (circular-tree-p tree2) - (circular-tree-p dotted) - (circular-tree-p proper) - (circular-tree-p tailcirc) - (circular-tree-p quite-proper) - (circular-tree-p quite-dotted))) - (t t t t t t nil nil)) - -(deftest circular-tree-p.2 - (alexandria:circular-tree-p '#1=(#1#)) - t) - -(deftest proper-list-p.1 - (let ((l1 (list 1)) - (l2 (list 1 2)) - (l3 (cons 1 2)) - (l4 (list (cons 1 2) 3)) - (l5 (circular-list 1 2))) - (list (proper-list-p l1) - (proper-list-p l2) - (proper-list-p l3) - (proper-list-p l4) - (proper-list-p l5))) - (t t nil t nil)) - -(deftest proper-list-p.2 - (proper-list-p '(1 2 . 3)) - nil) - -(deftest proper-list.type.1 - (let ((l1 (list 1)) - (l2 (list 1 2)) - (l3 (cons 1 2)) - (l4 (list (cons 1 2) 3)) - (l5 (circular-list 1 2))) - (list (typep l1 'proper-list) - (typep l2 'proper-list) - (typep l3 'proper-list) - (typep l4 'proper-list) - (typep l5 'proper-list))) - (t t nil t nil)) - -(deftest proper-list-length.1 - (values - (proper-list-length nil) - (proper-list-length (list 1)) - (proper-list-length (list 2 2)) - (proper-list-length (list 3 3 3)) - (proper-list-length (list 4 4 4 4)) - (proper-list-length (list 5 5 5 5 5)) - (proper-list-length (list 6 6 6 6 6 6)) - (proper-list-length (list 7 7 7 7 7 7 7)) - (proper-list-length (list 8 8 8 8 8 8 8 8)) - (proper-list-length (list 9 9 9 9 9 9 9 9 9))) - 0 1 2 3 4 5 6 7 8 9) - -(deftest proper-list-length.2 - (flet ((plength (x) - (handler-case - (proper-list-length x) - (type-error () - :ok)))) - (values - (plength (list* 1)) - (plength (list* 2 2)) - (plength (list* 3 3 3)) - (plength (list* 4 4 4 4)) - (plength (list* 5 5 5 5 5)) - (plength (list* 6 6 6 6 6 6)) - (plength (list* 7 7 7 7 7 7 7)) - (plength (list* 8 8 8 8 8 8 8 8)) - (plength (list* 9 9 9 9 9 9 9 9 9)))) - :ok :ok :ok - :ok :ok :ok - :ok :ok :ok) - -(deftest lastcar.1 - (let ((l1 (list 1)) - (l2 (list 1 2))) - (list (lastcar l1) - (lastcar l2))) - (1 2)) - -(deftest lastcar.error.2 - (handler-case - (progn - (lastcar (circular-list 1 2 3)) - nil) - (error () - t)) - t) - -(deftest setf-lastcar.1 - (let ((l (list 1 2 3 4))) - (values (lastcar l) - (progn - (setf (lastcar l) 42) - (lastcar l)))) - 4 - 42) - -(deftest setf-lastcar.2 - (let ((l (circular-list 1 2 3))) - (multiple-value-bind (res err) - (ignore-errors (setf (lastcar l) 4)) - (typep err 'type-error))) - t) - -(deftest make-circular-list.1 - (let ((l (make-circular-list 3 :initial-element :x))) - (setf (car l) :y) - (list (eq l (nthcdr 3 l)) - (first l) - (second l) - (third l) - (fourth l))) - (t :y :x :x :y)) - -(deftest circular-list.type.1 - (let* ((l1 (list 1 2 3)) - (l2 (circular-list 1 2 3)) - (l3 (list* 1 2 3 l2))) - (list (typep l1 'circular-list) - (typep l2 'circular-list) - (typep l3 'circular-list))) - (nil t t)) - -(deftest ensure-list.1 - (let ((x (list 1)) - (y 2)) - (list (ensure-list x) - (ensure-list y))) - ((1) (2))) - -(deftest ensure-cons.1 - (let ((x (cons 1 2)) - (y nil) - (z "foo")) - (values (ensure-cons x) - (ensure-cons y) - (ensure-cons z))) - (1 . 2) - (nil) - ("foo")) - -(deftest setp.1 - (setp '(1)) - t) - -(deftest setp.2 - (setp nil) - t) - -(deftest setp.3 - (setp "foo") - nil) - -(deftest setp.4 - (setp '(1 2 3 1)) - nil) - -(deftest setp.5 - (setp '(1 2 3)) - t) - -(deftest setp.6 - (setp '(a :a)) - t) - -(deftest setp.7 - (setp '(a :a) :key 'character) - nil) - -(deftest setp.8 - (setp '(a :a) :key 'character :test (constantly nil)) - t) - -(deftest set-equal.1 - (set-equal '(1 2 3) '(3 1 2)) - t) - -(deftest set-equal.2 - (set-equal '("Xa") '("Xb") - :test (lambda (a b) (eql (char a 0) (char b 0)))) - t) - -(deftest set-equal.3 - (set-equal '(1 2) '(4 2)) - nil) - -(deftest set-equal.4 - (set-equal '(a b c) '(:a :b :c) :key 'string :test 'equal) - t) - -(deftest set-equal.5 - (set-equal '(a d c) '(:a :b :c) :key 'string :test 'equal) - nil) - -(deftest set-equal.6 - (set-equal '(a b c) '(a b c d)) - nil) - -(deftest map-product.1 - (map-product 'cons '(2 3) '(1 4)) - ((2 . 1) (2 . 4) (3 . 1) (3 . 4))) - -(deftest map-product.2 - (map-product #'cons '(2 3) '(1 4)) - ((2 . 1) (2 . 4) (3 . 1) (3 . 4))) - -(deftest flatten.1 - (flatten '((1) 2 (((3 4))) ((((5)) 6)) 7)) - (1 2 3 4 5 6 7)) - -(deftest remove-from-plist.1 - (let ((orig '(a 1 b 2 c 3 d 4))) - (list (remove-from-plist orig 'a 'c) - (remove-from-plist orig 'b 'd) - (remove-from-plist orig 'b) - (remove-from-plist orig 'a) - (remove-from-plist orig 'd 42 "zot") - (remove-from-plist orig 'a 'b 'c 'd) - (remove-from-plist orig 'a 'b 'c 'd 'x) - (equal orig '(a 1 b 2 c 3 d 4)))) - ((b 2 d 4) - (a 1 c 3) - (a 1 c 3 d 4) - (b 2 c 3 d 4) - (a 1 b 2 c 3) - nil - nil - t)) - -(deftest delete-from-plist.1 - (let ((orig '(a 1 b 2 c 3 d 4 d 5))) - (list (delete-from-plist (copy-list orig) 'a 'c) - (delete-from-plist (copy-list orig) 'b 'd) - (delete-from-plist (copy-list orig) 'b) - (delete-from-plist (copy-list orig) 'a) - (delete-from-plist (copy-list orig) 'd 42 "zot") - (delete-from-plist (copy-list orig) 'a 'b 'c 'd) - (delete-from-plist (copy-list orig) 'a 'b 'c 'd 'x) - (equal orig (delete-from-plist orig)) - (eq orig (delete-from-plist orig)))) - ((b 2 d 4 d 5) - (a 1 c 3) - (a 1 c 3 d 4 d 5) - (b 2 c 3 d 4 d 5) - (a 1 b 2 c 3) - nil - nil - t - t)) - -(deftest mappend.1 - (mappend (compose 'list '*) '(1 2 3) '(1 2 3)) - (1 4 9)) - -(deftest assoc-value.1 - (let ((key1 '(complex key)) - (key2 'simple-key) - (alist '()) - (result '())) - (push 1 (assoc-value alist key1 :test #'equal)) - (push 2 (assoc-value alist key1 :test 'equal)) - (push 42 (assoc-value alist key2)) - (push 43 (assoc-value alist key2 :test 'eq)) - (push (assoc-value alist key1 :test #'equal) result) - (push (assoc-value alist key2) result) - - (push 'very (rassoc-value alist (list 2 1) :test #'equal)) - (push (cdr (assoc '(very complex key) alist :test #'equal)) result) - result) - ((2 1) (43 42) (2 1))) - -;;;; Numbers - -(deftest clamp.1 - (list (clamp 1.5 1 2) - (clamp 2.0 1 2) - (clamp 1.0 1 2) - (clamp 3 1 2) - (clamp 0 1 2)) - (1.5 2.0 1.0 2 1)) - -(deftest gaussian-random.1 - (let ((min -0.2) - (max +0.2)) - (multiple-value-bind (g1 g2) - (gaussian-random min max) - (values (<= min g1 max) - (<= min g2 max) - (/= g1 g2) ;uh - ))) - t - t - t) - -#+sbcl -(deftest gaussian-random.2 - (handler-case - (sb-ext:with-timeout 2 - (progn - (loop - :repeat 10000 - :do (gaussian-random 0 nil)) - 'done)) - (sb-ext:timeout () - 'timed-out)) - done) - -(deftest iota.1 - (iota 3) - (0 1 2)) - -(deftest iota.2 - (iota 3 :start 0.0d0) - (0.0d0 1.0d0 2.0d0)) - -(deftest iota.3 - (iota 3 :start 2 :step 3.0) - (2.0 5.0 8.0)) - -(deftest map-iota.1 - (let (all) - (declare (notinline map-iota)) - (values (map-iota (lambda (x) (push x all)) - 3 - :start 2 - :step 1.1d0) - all)) - 3 - (4.2d0 3.1d0 2.0d0)) - -(deftest lerp.1 - (lerp 0.5 1 2) - 1.5) - -(deftest lerp.2 - (lerp 0.1 1 2) - 1.1) - -(deftest lerp.3 - (lerp 0.1 4 25) - 6.1) - -(deftest mean.1 - (mean '(1 2 3)) - 2) - -(deftest mean.2 - (mean '(1 2 3 4)) - 5/2) - -(deftest mean.3 - (mean '(1 2 10)) - 13/3) - -(deftest median.1 - (median '(100 0 99 1 98 2 97)) - 97) - -(deftest median.2 - (median '(100 0 99 1 98 2 97 96)) - 193/2) - -(deftest variance.1 - (variance (list 1 2 3)) - 2/3) - -(deftest standard-deviation.1 - (< 0 (standard-deviation (list 1 2 3)) 1) - t) - -(deftest maxf.1 - (let ((x 1)) - (maxf x 2) - x) - 2) - -(deftest maxf.2 - (let ((x 1)) - (maxf x 0) - x) - 1) - -(deftest maxf.3 - (let ((x 1) - (c 0)) - (maxf x (incf c)) - (list x c)) - (1 1)) - -(deftest maxf.4 - (let ((xv (vector 0 0 0)) - (p 0)) - (maxf (svref xv (incf p)) (incf p)) - (list p xv)) - (2 #(0 2 0))) - -(deftest minf.1 - (let ((y 1)) - (minf y 0) - y) - 0) - -(deftest minf.2 - (let ((xv (vector 10 10 10)) - (p 0)) - (minf (svref xv (incf p)) (incf p)) - (list p xv)) - (2 #(10 2 10))) - -(deftest subfactorial.1 - (mapcar #'subfactorial (iota 22)) - (1 - 0 - 1 - 2 - 9 - 44 - 265 - 1854 - 14833 - 133496 - 1334961 - 14684570 - 176214841 - 2290792932 - 32071101049 - 481066515734 - 7697064251745 - 130850092279664 - 2355301661033953 - 44750731559645106 - 895014631192902121 - 18795307255050944540)) - -;;;; Arrays - -#+nil -(deftest array-index.type) - -#+nil -(deftest copy-array) - -;;;; Sequences - -(deftest rotate.1 - (list (rotate (list 1 2 3) 0) - (rotate (list 1 2 3) 1) - (rotate (list 1 2 3) 2) - (rotate (list 1 2 3) 3) - (rotate (list 1 2 3) 4)) - ((1 2 3) - (3 1 2) - (2 3 1) - (1 2 3) - (3 1 2))) - -(deftest rotate.2 - (list (rotate (vector 1 2 3 4) 0) - (rotate (vector 1 2 3 4)) - (rotate (vector 1 2 3 4) 2) - (rotate (vector 1 2 3 4) 3) - (rotate (vector 1 2 3 4) 4) - (rotate (vector 1 2 3 4) 5)) - (#(1 2 3 4) - #(4 1 2 3) - #(3 4 1 2) - #(2 3 4 1) - #(1 2 3 4) - #(4 1 2 3))) - -(deftest rotate.3 - (list (rotate (list 1 2 3) 0) - (rotate (list 1 2 3) -1) - (rotate (list 1 2 3) -2) - (rotate (list 1 2 3) -3) - (rotate (list 1 2 3) -4)) - ((1 2 3) - (2 3 1) - (3 1 2) - (1 2 3) - (2 3 1))) - -(deftest rotate.4 - (list (rotate (vector 1 2 3 4) 0) - (rotate (vector 1 2 3 4) -1) - (rotate (vector 1 2 3 4) -2) - (rotate (vector 1 2 3 4) -3) - (rotate (vector 1 2 3 4) -4) - (rotate (vector 1 2 3 4) -5)) - (#(1 2 3 4) - #(2 3 4 1) - #(3 4 1 2) - #(4 1 2 3) - #(1 2 3 4) - #(2 3 4 1))) - -(deftest rotate.5 - (values (rotate (list 1) 17) - (rotate (list 1) -5)) - (1) - (1)) - -(deftest shuffle.1 - (let ((s (shuffle (iota 100)))) - (list (equal s (iota 100)) - (every (lambda (x) - (member x s)) - (iota 100)) - (every (lambda (x) - (typep x '(integer 0 99))) - s))) - (nil t t)) - -(deftest shuffle.2 - (let ((s (shuffle (coerce (iota 100) 'vector)))) - (list (equal s (coerce (iota 100) 'vector)) - (every (lambda (x) - (find x s)) - (iota 100)) - (every (lambda (x) - (typep x '(integer 0 99))) - s))) - (nil t t)) - -(deftest shuffle.3 - (let* ((orig (coerce (iota 21) 'vector)) - (copy (copy-seq orig))) - (shuffle copy :start 10 :end 15) - (list (every #'eql (subseq copy 0 10) (subseq orig 0 10)) - (every #'eql (subseq copy 15) (subseq orig 15)))) - (t t)) - -(deftest random-elt.1 - (let ((s1 #(1 2 3 4)) - (s2 '(1 2 3 4))) - (list (dotimes (i 1000 nil) - (unless (member (random-elt s1) s2) - (return nil)) - (when (/= (random-elt s1) (random-elt s1)) - (return t))) - (dotimes (i 1000 nil) - (unless (member (random-elt s2) s2) - (return nil)) - (when (/= (random-elt s2) (random-elt s2)) - (return t))))) - (t t)) - -(deftest removef.1 - (let* ((x '(1 2 3)) - (x* x) - (y #(1 2 3)) - (y* y)) - (removef x 1) - (removef y 3) - (list x x* y y*)) - ((2 3) - (1 2 3) - #(1 2) - #(1 2 3))) - -(deftest deletef.1 - (let* ((x (list 1 2 3)) - (x* x) - (y (vector 1 2 3))) - (deletef x 2) - (deletef y 1) - (list x x* y)) - ((1 3) - (1 3) - #(2 3))) - -(deftest map-permutations.1 - (let ((seq (list 1 2 3)) - (seen nil) - (ok t)) - (map-permutations (lambda (s) - (unless (set-equal s seq) - (setf ok nil)) - (when (member s seen :test 'equal) - (setf ok nil)) - (push s seen)) - seq - :copy t) - (values ok (length seen))) - t - 6) - -(deftest proper-sequence.type.1 - (mapcar (lambda (x) - (typep x 'proper-sequence)) - (list (list 1 2 3) - (vector 1 2 3) - #2a((1 2) (3 4)) - (circular-list 1 2 3 4))) - (t t nil nil)) - -(deftest emptyp.1 - (mapcar #'emptyp - (list (list 1) - (circular-list 1) - nil - (vector) - (vector 1))) - (nil nil t t nil)) - -(deftest sequence-of-length-p.1 - (mapcar #'sequence-of-length-p - (list nil - #() - (list 1) - (vector 1) - (list 1 2) - (vector 1 2) - (list 1 2) - (vector 1 2) - (list 1 2) - (vector 1 2)) - (list 0 - 0 - 1 - 1 - 2 - 2 - 1 - 1 - 4 - 4)) - (t t t t t t nil nil nil nil)) - -(deftest length=.1 - (mapcar #'length= - (list nil - #() - (list 1) - (vector 1) - (list 1 2) - (vector 1 2) - (list 1 2) - (vector 1 2) - (list 1 2) - (vector 1 2)) - (list 0 - 0 - 1 - 1 - 2 - 2 - 1 - 1 - 4 - 4)) - (t t t t t t nil nil nil nil)) - -(deftest length=.2 - ;; test the compiler macro - (macrolet ((x (&rest args) - (funcall - (compile nil - `(lambda () - (length= ,@args)))))) - (list (x 2 '(1 2)) - (x '(1 2) '(3 4)) - (x '(1 2) 2) - (x '(1 2) 2 '(3 4)) - (x 1 2 3))) - (t t t t nil)) - -(deftest copy-sequence.1 - (let ((l (list 1 2 3)) - (v (vector #\a #\b #\c))) - (declare (notinline copy-sequence)) - (let ((l.list (copy-sequence 'list l)) - (l.vector (copy-sequence 'vector l)) - (l.spec-v (copy-sequence '(vector fixnum) l)) - (v.vector (copy-sequence 'vector v)) - (v.list (copy-sequence 'list v)) - (v.string (copy-sequence 'string v))) - (list (member l (list l.list l.vector l.spec-v)) - (member v (list v.vector v.list v.string)) - (equal l.list l) - (equalp l.vector #(1 2 3)) - (type= (upgraded-array-element-type 'fixnum) - (array-element-type l.spec-v)) - (equalp v.vector v) - (equal v.list '(#\a #\b #\c)) - (equal "abc" v.string)))) - (nil nil t t t t t t)) - -(deftest first-elt.1 - (mapcar #'first-elt - (list (list 1 2 3) - "abc" - (vector :a :b :c))) - (1 #\a :a)) - -(deftest first-elt.error.1 - (mapcar (lambda (x) - (handler-case - (first-elt x) - (type-error () - :type-error))) - (list nil - #() - 12 - :zot)) - (:type-error - :type-error - :type-error - :type-error)) - -(deftest setf-first-elt.1 - (let ((l (list 1 2 3)) - (s (copy-seq "foobar")) - (v (vector :a :b :c))) - (setf (first-elt l) -1 - (first-elt s) #\x - (first-elt v) 'zot) - (values l s v)) - (-1 2 3) - "xoobar" - #(zot :b :c)) - -(deftest setf-first-elt.error.1 - (let ((l 'foo)) - (multiple-value-bind (res err) - (ignore-errors (setf (first-elt l) 4)) - (typep err 'type-error))) - t) - -(deftest last-elt.1 - (mapcar #'last-elt - (list (list 1 2 3) - (vector :a :b :c) - "FOOBAR" - #*001 - #*010)) - (3 :c #\R 1 0)) - -(deftest last-elt.error.1 - (mapcar (lambda (x) - (handler-case - (last-elt x) - (type-error () - :type-error))) - (list nil - #() - 12 - :zot - (circular-list 1 2 3) - (list* 1 2 3 (circular-list 4 5)))) - (:type-error - :type-error - :type-error - :type-error - :type-error - :type-error)) - -(deftest setf-last-elt.1 - (let ((l (list 1 2 3)) - (s (copy-seq "foobar")) - (b (copy-seq #*010101001))) - (setf (last-elt l) '??? - (last-elt s) #\? - (last-elt b) 0) - (values l s b)) - (1 2 ???) - "fooba?" - #*010101000) - -(deftest setf-last-elt.error.1 - (handler-case - (setf (last-elt 'foo) 13) - (type-error () - :type-error)) - :type-error) - -(deftest starts-with.1 - (list (starts-with 1 '(1 2 3)) - (starts-with 1 #(1 2 3)) - (starts-with #\x "xyz") - (starts-with 2 '(1 2 3)) - (starts-with 3 #(1 2 3)) - (starts-with 1 1) - (starts-with nil nil)) - (t t t nil nil nil nil)) - -(deftest starts-with.2 - (values (starts-with 1 '(-1 2 3) :key '-) - (starts-with "foo" '("foo" "bar") :test 'equal) - (starts-with "f" '(#\f) :key 'string :test 'equal) - (starts-with -1 '(0 1 2) :key #'1+) - (starts-with "zot" '("ZOT") :test 'equal)) - t - t - t - nil - nil) - -(deftest ends-with.1 - (list (ends-with 3 '(1 2 3)) - (ends-with 3 #(1 2 3)) - (ends-with #\z "xyz") - (ends-with 2 '(1 2 3)) - (ends-with 1 #(1 2 3)) - (ends-with 1 1) - (ends-with nil nil)) - (t t t nil nil nil nil)) - -(deftest ends-with.2 - (values (ends-with 2 '(0 13 1) :key '1+) - (ends-with "foo" (vector "bar" "foo") :test 'equal) - (ends-with "X" (vector 1 2 #\X) :key 'string :test 'equal) - (ends-with "foo" "foo" :test 'equal)) - t - t - t - nil) - -(deftest ends-with.error.1 - (handler-case - (ends-with 3 (circular-list 3 3 3 1 3 3)) - (type-error () - :type-error)) - :type-error) - -(deftest sequences.passing-improper-lists - (macrolet ((signals-error-p (form) - `(handler-case - (progn ,form nil) - (type-error (e) - t))) - (cut (fn &rest args) - (with-gensyms (arg) - (print`(lambda (,arg) - (apply ,fn (list ,@(substitute arg '_ args)))))))) - (let ((circular-list (make-circular-list 5 :initial-element :foo)) - (dotted-list (list* 'a 'b 'c 'd))) - (loop for nth from 0 - for fn in (list - (cut #'lastcar _) - (cut #'rotate _ 3) - (cut #'rotate _ -3) - (cut #'shuffle _) - (cut #'random-elt _) - (cut #'last-elt _) - (cut #'ends-with :foo _)) - nconcing - (let ((on-circular-p (signals-error-p (funcall fn circular-list))) - (on-dotted-p (signals-error-p (funcall fn dotted-list)))) - (when (or (not on-circular-p) (not on-dotted-p)) - (append - (unless on-circular-p - (let ((*print-circle* t)) - (list - (format nil - "No appropriate error signalled when passing ~S to ~Ath entry." - circular-list nth)))) - (unless on-dotted-p - (list - (format nil - "No appropriate error signalled when passing ~S to ~Ath entry." - dotted-list nth))))))))) - nil) - -;;;; IO - -(deftest read-stream-content-into-string.1 - (values (with-input-from-string (stream "foo bar") - (read-stream-content-into-string stream)) - (with-input-from-string (stream "foo bar") - (read-stream-content-into-string stream :buffer-size 1)) - (with-input-from-string (stream "foo bar") - (read-stream-content-into-string stream :buffer-size 6)) - (with-input-from-string (stream "foo bar") - (read-stream-content-into-string stream :buffer-size 7))) - "foo bar" - "foo bar" - "foo bar" - "foo bar") - -(deftest read-stream-content-into-string.2 - (handler-case - (let ((stream (make-broadcast-stream))) - (read-stream-content-into-string stream :buffer-size 0)) - (type-error () - :type-error)) - :type-error) - -#+(or) -(defvar *octets* - (map '(simple-array (unsigned-byte 8) (7)) #'char-code "foo bar")) - -#+(or) -(deftest read-stream-content-into-byte-vector.1 - (values (with-input-from-byte-vector (stream *octets*) - (read-stream-content-into-byte-vector stream)) - (with-input-from-byte-vector (stream *octets*) - (read-stream-content-into-byte-vector stream :initial-size 1)) - (with-input-from-byte-vector (stream *octets*) - (read-stream-content-into-byte-vector stream 'alexandria::%length 6)) - (with-input-from-byte-vector (stream *octets*) - (read-stream-content-into-byte-vector stream 'alexandria::%length 3))) - *octets* - *octets* - *octets* - (subseq *octets* 0 3)) - -(deftest read-stream-content-into-byte-vector.2 - (handler-case - (let ((stream (make-broadcast-stream))) - (read-stream-content-into-byte-vector stream :initial-size 0)) - (type-error () - :type-error)) - :type-error) - -;;;; Macros - -(deftest with-unique-names.1 - (let ((*gensym-counter* 0)) - (let ((syms (with-unique-names (foo bar quux) - (list foo bar quux)))) - (list (find-if #'symbol-package syms) - (equal '("FOO0" "BAR1" "QUUX2") - (mapcar #'symbol-name syms))))) - (nil t)) - -(deftest with-unique-names.2 - (let ((*gensym-counter* 0)) - (let ((syms (with-unique-names ((foo "_foo_") (bar -bar-) (quux #\q)) - (list foo bar quux)))) - (list (find-if #'symbol-package syms) - (equal '("_foo_0" "-BAR-1" "q2") - (mapcar #'symbol-name syms))))) - (nil t)) - -(deftest with-unique-names.3 - (let ((*gensym-counter* 0)) - (multiple-value-bind (res err) - (ignore-errors - (eval - '(let ((syms - (with-unique-names ((foo "_foo_") (bar -bar-) (quux 42)) - (list foo bar quux)))) - (list (find-if #'symbol-package syms) - (equal '("_foo_0" "-BAR-1" "q2") - (mapcar #'symbol-name syms)))))) - (errorp err))) - t) - -(deftest once-only.1 - (macrolet ((cons1.good (x) - (once-only (x) - `(cons ,x ,x))) - (cons1.bad (x) - `(cons ,x ,x))) - (let ((y 0)) - (list (cons1.good (incf y)) - y - (cons1.bad (incf y)) - y))) - ((1 . 1) 1 (2 . 3) 3)) - -(deftest once-only.2 - (macrolet ((cons1 (x) - (once-only ((y x)) - `(cons ,y ,y)))) - (let ((z 0)) - (list (cons1 (incf z)) - z - (cons1 (incf z))))) - ((1 . 1) 1 (2 . 2))) - -(deftest parse-body.1 - (parse-body '("doc" "body") :documentation t) - ("body") - nil - "doc") - -(deftest parse-body.2 - (parse-body '("body") :documentation t) - ("body") - nil - nil) - -(deftest parse-body.3 - (parse-body '("doc" "body")) - ("doc" "body") - nil - nil) - -(deftest parse-body.4 - (parse-body '((declare (foo)) "doc" (declare (bar)) body) :documentation t) - (body) - ((declare (foo)) (declare (bar))) - "doc") - -(deftest parse-body.5 - (parse-body '((declare (foo)) "doc" (declare (bar)) body)) - ("doc" (declare (bar)) body) - ((declare (foo))) - nil) - -(deftest parse-body.6 - (multiple-value-bind (res err) - (ignore-errors - (parse-body '("foo" "bar" "quux") - :documentation t)) - (errorp err)) - t) - -;;;; Symbols - -(deftest ensure-symbol.1 - (ensure-symbol :cons :cl) - cons - :external) - -(deftest ensure-symbol.2 - (ensure-symbol "CONS" :alexandria) - cons - :inherited) - -(deftest ensure-symbol.3 - (ensure-symbol 'foo :keyword) - :foo - :external) - -(deftest ensure-symbol.4 - (ensure-symbol #\* :alexandria) - * - :inherited) - -(deftest format-symbol.1 - (let ((s (format-symbol nil '#:x-~d 13))) - (list (symbol-package s) - (string= (string '#:x-13) (symbol-name s)))) - (nil t)) - -(deftest format-symbol.2 - (format-symbol :keyword '#:sym-~a (string :bolic)) - :sym-bolic) - -(deftest format-symbol.3 - (let ((*package* (find-package :cl))) - (format-symbol t '#:find-~a (string 'package))) - find-package) - -(deftest make-keyword.1 - (list (make-keyword 'zot) - (make-keyword "FOO") - (make-keyword #\Q)) - (:zot :foo :q)) - -(deftest make-gensym-list.1 - (let ((*gensym-counter* 0)) - (let ((syms (make-gensym-list 3 "FOO"))) - (list (find-if 'symbol-package syms) - (equal '("FOO0" "FOO1" "FOO2") - (mapcar 'symbol-name syms))))) - (nil t)) - -(deftest make-gensym-list.2 - (let ((*gensym-counter* 0)) - (let ((syms (make-gensym-list 3))) - (list (find-if 'symbol-package syms) - (equal '("G0" "G1" "G2") - (mapcar 'symbol-name syms))))) - (nil t)) - -;;;; Type-system - -(deftest of-type.1 - (locally - (declare (notinline of-type)) - (let ((f (of-type 'string))) - (list (funcall f "foo") - (funcall f 'bar)))) - (t nil)) - -(deftest type=.1 - (type= 'string 'string) - t - t) - -(deftest type=.2 - (type= 'list '(or null cons)) - t - t) - -(deftest type=.3 - (type= 'null '(and symbol list)) - t - t) - -(deftest type=.4 - (type= 'string '(satisfies emptyp)) - nil - nil) - -(deftest type=.5 - (type= 'string 'list) - nil - t) - -(macrolet - ((test (type numbers) - `(deftest ,(format-symbol t '#:cdr5.~a (string type)) - (let ((numbers ,numbers)) - (values (mapcar (of-type ',(format-symbol t '#:negative-~a (string type))) numbers) - (mapcar (of-type ',(format-symbol t '#:non-positive-~a (string type))) numbers) - (mapcar (of-type ',(format-symbol t '#:non-negative-~a (string type))) numbers) - (mapcar (of-type ',(format-symbol t '#:positive-~a (string type))) numbers))) - (t t t nil nil nil nil) - (t t t t nil nil nil) - (nil nil nil t t t t) - (nil nil nil nil t t t)))) - (test fixnum (list most-negative-fixnum -42 -1 0 1 42 most-positive-fixnum)) - (test integer (list (1- most-negative-fixnum) -42 -1 0 1 42 (1+ most-positive-fixnum))) - (test rational (list (1- most-negative-fixnum) -42/13 -1 0 1 42/13 (1+ most-positive-fixnum))) - (test real (list most-negative-long-float -42/13 -1 0 1 42/13 most-positive-long-float)) - (test float (list most-negative-short-float -42.02 -1.0 0.0 1.0 42.02 most-positive-short-float)) - (test short-float (list most-negative-short-float -42.02s0 -1.0s0 0.0s0 1.0s0 42.02s0 most-positive-short-float)) - (test single-float (list most-negative-single-float -42.02f0 -1.0f0 0.0f0 1.0f0 42.02f0 most-positive-single-float)) - (test double-float (list most-negative-double-float -42.02d0 -1.0d0 0.0d0 1.0d0 42.02d0 most-positive-double-float)) - (test long-float (list most-negative-long-float -42.02l0 -1.0l0 0.0l0 1.0l0 42.02l0 most-positive-long-float))) - -;;;; Bindings - -(declaim (notinline opaque)) -(defun opaque (x) - x) - -(deftest if-let.1 - (if-let (x (opaque :ok)) - x - :bad) - :ok) - -(deftest if-let.2 - (if-let (x (opaque nil)) - :bad - (and (not x) :ok)) - :ok) - -(deftest if-let.3 - (let ((x 1)) - (if-let ((x 2) - (y x)) - (+ x y) - :oops)) - 3) - -(deftest if-let.4 - (if-let ((x 1) - (y nil)) - :oops - (and (not y) x)) - 1) - -(deftest if-let.5 - (if-let (x) - :oops - (not x)) - t) - -(deftest if-let.error.1 - (handler-case - (eval '(if-let x - :oops - :oops)) - (type-error () - :type-error)) - :type-error) - -(deftest when-let.1 - (when-let (x (opaque :ok)) - (setf x (cons x x)) - x) - (:ok . :ok)) - -(deftest when-let.2 - (when-let ((x 1) - (y nil) - (z 3)) - :oops) - nil) - -(deftest when-let.3 - (let ((x 1)) - (when-let ((x 2) - (y x)) - (+ x y))) - 3) - -(deftest when-let.error.1 - (handler-case - (eval '(when-let x :oops)) - (type-error () - :type-error)) - :type-error) - -(deftest when-let*.1 - (let ((x 1)) - (when-let* ((x 2) - (y x)) - (+ x y))) - 4) - -(deftest when-let*.2 - (let ((y 1)) - (when-let* (x y) - (1+ x))) - 2) - -(deftest when-let*.3 - (when-let* ((x t) - (y (consp x)) - (z (error "OOPS"))) - t) - nil) - -(deftest when-let*.error.1 - (handler-case - (eval '(when-let* x :oops)) - (type-error () - :type-error)) - :type-error) - -(deftest doplist.1 - (let (keys values) - (doplist (k v '(a 1 b 2 c 3) (values t (reverse keys) (reverse values) k v)) - (push k keys) - (push v values))) - t - (a b c) - (1 2 3) - nil - nil) - -(deftest count-permutations.1 - (values (count-permutations 31 7) - (count-permutations 1 1) - (count-permutations 2 1) - (count-permutations 2 2) - (count-permutations 3 2) - (count-permutations 3 1)) - 13253058000 - 1 - 2 - 2 - 6 - 3) - -(deftest binomial-coefficient.1 - (alexandria:binomial-coefficient 1239 139) - 28794902202288970200771694600561826718847179309929858835480006683522184441358211423695124921058123706380656375919763349913245306834194782172712255592710204598527867804110129489943080460154) - -;; Exercise bignum case (at least on x86). -(deftest binomial-coefficient.2 - (alexandria:binomial-coefficient 2000000000000 20) - 430998041177272843950422879590338454856322722740402365741730748431530623813012487773080486408378680853987520854296499536311275320016878730999689934464711239072435565454954447356845336730100919970769793030177499999999900000000000) - -(deftest copy-stream.1 - (let ((data "sdkfjhsakfh weior763495ewofhsdfk sdfadlkfjhsadf woif sdlkjfhslkdfh sdklfjh")) - (values (equal data - (with-input-from-string (in data) - (with-output-to-string (out) - (alexandria:copy-stream in out)))) - (equal (subseq data 10 20) - (with-input-from-string (in data) - (with-output-to-string (out) - (alexandria:copy-stream in out :start 10 :end 20)))) - (equal (subseq data 10) - (with-input-from-string (in data) - (with-output-to-string (out) - (alexandria:copy-stream in out :start 10)))) - (equal (subseq data 0 20) - (with-input-from-string (in data) - (with-output-to-string (out) - (alexandria:copy-stream in out :end 20)))))) - t - t - t - t) - -(deftest extremum.1 - (let ((n 0)) - (dotimes (i 10) - (let ((data (shuffle (coerce (iota 10000 :start i) 'vector))) - (ok t)) - (unless (eql i (extremum data #'<)) - (setf ok nil)) - (unless (eql i (extremum (coerce data 'list) #'<)) - (setf ok nil)) - (unless (eql (+ 9999 i) (extremum data #'>)) - (setf ok nil)) - (unless (eql (+ 9999 i) (extremum (coerce data 'list) #'>)) - (setf ok nil)) - (when ok - (incf n)))) - (when (eql 10 (extremum #(100 1 10 1000) #'> :start 1 :end 3)) - (incf n)) - (when (eql -1000 (extremum #(100 1 10 -1000) #'> :key 'abs)) - (incf n)) - (when (eq nil (extremum "" (lambda (a b) (error "wtf? ~S, ~S" a b)))) - (incf n)) - n) - 13) - -(deftest starts-with-subseq.string - (starts-with-subseq "f" "foo" :return-suffix t) - t - "oo") - -(deftest starts-with-subseq.vector - (starts-with-subseq #(1) #(1 2 3) :return-suffix t) - t - #(2 3)) - -(deftest starts-with-subseq.list - (starts-with-subseq '(1) '(1 2 3) :return-suffix t) - t - (2 3)) - -(deftest starts-with-subseq.start1 - (starts-with-subseq "foo" "oop" :start1 1) - t - nil) - -(deftest starts-with-subseq.start2 - (starts-with-subseq "foo" "xfoop" :start2 1) - t - nil) - -(deftest format-symbol.print-case-bound - (let ((upper (intern "FOO-BAR")) - (lower (intern "foo-bar")) - (*print-escape* nil)) - (values - (let ((*print-case* :downcase)) - (and (eq upper (format-symbol t "~A" upper)) - (eq lower (format-symbol t "~A" lower)))) - (let ((*print-case* :upcase)) - (and (eq upper (format-symbol t "~A" upper)) - (eq lower (format-symbol t "~A" lower)))) - (let ((*print-case* :capitalize)) - (and (eq upper (format-symbol t "~A" upper)) - (eq lower (format-symbol t "~A" lower)))))) - t - t - t) - -(deftest iota.fp-start-and-complex-integer-step - (equal '(#C(0.0 0.0) #C(0.0 2.0) #C(0.0 4.0)) - (iota 3 :start 0.0 :step #C(0 2))) - t) - -(deftest parse-ordinary-lambda-list.1 - (multiple-value-bind (req opt rest keys allowp aux keyp) - (parse-ordinary-lambda-list '(a b c - &optional o1 (o2 42) (o3 42 o3-supplied?) - &key (k1) ((:key k2)) (k3 42 k3-supplied?)) - :normalize t) - (and (equal '(a b c) req) - (equal '((o1 nil nil) - (o2 42 nil) - (o3 42 o3-supplied?)) - opt) - (equal '(((:k1 k1) nil nil) - ((:key k2) nil nil) - ((:k3 k3) 42 k3-supplied?)) - keys) - (not allowp) - (not aux) - (eq t keyp))) - t) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/types.lisp b/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/types.lisp deleted file mode 100644 index 1942d0e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/alexandria-20191227-git/types.lisp +++ /dev/null @@ -1,137 +0,0 @@ -(in-package :alexandria) - -(deftype array-index (&optional (length (1- array-dimension-limit))) - "Type designator for an index into array of LENGTH: an integer between -0 (inclusive) and LENGTH (exclusive). LENGTH defaults to one less than -ARRAY-DIMENSION-LIMIT." - `(integer 0 (,length))) - -(deftype array-length (&optional (length (1- array-dimension-limit))) - "Type designator for a dimension of an array of LENGTH: an integer between -0 (inclusive) and LENGTH (inclusive). LENGTH defaults to one less than -ARRAY-DIMENSION-LIMIT." - `(integer 0 ,length)) - -;; This MACROLET will generate most of CDR5 (http://cdr.eurolisp.org/document/5/) -;; except the RATIO related definitions and ARRAY-INDEX. -(macrolet - ((frob (type &optional (base-type type)) - (let ((subtype-names (list)) - (predicate-names (list))) - (flet ((make-subtype-name (format-control) - (let ((result (format-symbol :alexandria format-control - (symbol-name type)))) - (push result subtype-names) - result)) - (make-predicate-name (sybtype-name) - (let ((result (format-symbol :alexandria '#:~A-p - (symbol-name sybtype-name)))) - (push result predicate-names) - result)) - (make-docstring (range-beg range-end range-type) - (let ((inf (ecase range-type (:negative "-inf") (:positive "+inf")))) - (format nil "Type specifier denoting the ~(~A~) range from ~A to ~A." - type - (if (equal range-beg ''*) inf (ensure-car range-beg)) - (if (equal range-end ''*) inf (ensure-car range-end)))))) - (let* ((negative-name (make-subtype-name '#:negative-~a)) - (non-positive-name (make-subtype-name '#:non-positive-~a)) - (non-negative-name (make-subtype-name '#:non-negative-~a)) - (positive-name (make-subtype-name '#:positive-~a)) - (negative-p-name (make-predicate-name negative-name)) - (non-positive-p-name (make-predicate-name non-positive-name)) - (non-negative-p-name (make-predicate-name non-negative-name)) - (positive-p-name (make-predicate-name positive-name)) - (negative-extremum) - (positive-extremum) - (below-zero) - (above-zero) - (zero)) - (setf (values negative-extremum below-zero - above-zero positive-extremum zero) - (ecase type - (fixnum (values 'most-negative-fixnum -1 1 'most-positive-fixnum 0)) - (integer (values ''* -1 1 ''* 0)) - (rational (values ''* '(0) '(0) ''* 0)) - (real (values ''* '(0) '(0) ''* 0)) - (float (values ''* '(0.0E0) '(0.0E0) ''* 0.0E0)) - (short-float (values ''* '(0.0S0) '(0.0S0) ''* 0.0S0)) - (single-float (values ''* '(0.0F0) '(0.0F0) ''* 0.0F0)) - (double-float (values ''* '(0.0D0) '(0.0D0) ''* 0.0D0)) - (long-float (values ''* '(0.0L0) '(0.0L0) ''* 0.0L0)))) - `(progn - (deftype ,negative-name () - ,(make-docstring negative-extremum below-zero :negative) - `(,',base-type ,,negative-extremum ,',below-zero)) - - (deftype ,non-positive-name () - ,(make-docstring negative-extremum zero :negative) - `(,',base-type ,,negative-extremum ,',zero)) - - (deftype ,non-negative-name () - ,(make-docstring zero positive-extremum :positive) - `(,',base-type ,',zero ,,positive-extremum)) - - (deftype ,positive-name () - ,(make-docstring above-zero positive-extremum :positive) - `(,',base-type ,',above-zero ,,positive-extremum)) - - (declaim (inline ,@predicate-names)) - - (defun ,negative-p-name (n) - (and (typep n ',type) - (< n ,zero))) - - (defun ,non-positive-p-name (n) - (and (typep n ',type) - (<= n ,zero))) - - (defun ,non-negative-p-name (n) - (and (typep n ',type) - (<= ,zero n))) - - (defun ,positive-p-name (n) - (and (typep n ',type) - (< ,zero n))))))))) - (frob fixnum integer) - (frob integer) - (frob rational) - (frob real) - (frob float) - (frob short-float) - (frob single-float) - (frob double-float) - (frob long-float)) - -(defun of-type (type) - "Returns a function of one argument, which returns true when its argument is -of TYPE." - (lambda (thing) (typep thing type))) - -(define-compiler-macro of-type (&whole form type &environment env) - ;; This can yeild a big benefit, but no point inlining the function - ;; all over the place if TYPE is not constant. - (if (constantp type env) - (with-gensyms (thing) - `(lambda (,thing) - (typep ,thing ,type))) - form)) - -(declaim (inline type=)) -(defun type= (type1 type2) - "Returns a primary value of T is TYPE1 and TYPE2 are the same type, -and a secondary value that is true is the type equality could be reliably -determined: primary value of NIL and secondary value of T indicates that the -types are not equivalent." - (multiple-value-bind (sub ok) (subtypep type1 type2) - (cond ((and ok sub) - (subtypep type2 type1)) - (ok - (values nil ok)) - (t - (multiple-value-bind (sub ok) (subtypep type2 type1) - (declare (ignore sub)) - (values nil ok)))))) - -(define-modify-macro coercef (type-spec) coerce - "Modify-macro for COERCE.") diff --git a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/.travis.yml b/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/.travis.yml deleted file mode 100644 index 9a1fdd8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/.travis.yml +++ /dev/null @@ -1,34 +0,0 @@ -language: lisp -sudo: required - -env: - matrix: - - LISP=abcl - - LISP=allegro - - LISP=sbcl - - LISP=sbcl32 - - LISP=ccl - - LISP=ccl32 - - LISP=ecl - - LISP=clisp - - LISP=clisp32 - - LISP=cmucl - -matrix: - allow_failures: - # Disabled until issue #6 is fixed. - - env: LISP=clisp - - env: LISP=clisp32 - # Disabled until cim supports cmucl. - - env: LISP=cmucl - -install: - - curl -L https://github.com/tokenrove/cl-travis/raw/master/install.sh | sh - - if [ "${LISP:(-2)}" = "32" ]; then - sudo apt-get install -qq -y libc6-dev-i386; - fi - -script: - - cl -e '(ql:quickload :anaphora/test) - (unless (asdf:oos :test-op :anaphora/test) - (uiop:quit 1))' diff --git a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/LICENSE b/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/LICENSE deleted file mode 100644 index 8a7316d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/LICENSE +++ /dev/null @@ -1,3 +0,0 @@ -;;;; This file is part of the Anaphora package Common Lisp, -;;;; and has been placed in Public Domain by the author, -;;;; Nikodemus Siivola diff --git a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/README.md b/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/README.md deleted file mode 100644 index 5fa3c97..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# Anaphora - -Anaphora is the anaphoric macro collection from Hell: it includes many -new fiends in addition to old friends like `AIF` and `AWHEN`. -Anaphora has been placed in Public Domain by the author, [Nikodemus -Siivola](mailto:nikodemus@random-state.net). - -# Installation - -Use [quicklisp](http://www.quicklisp.org/), and simply: - -``` -CL-USER(1): (ql:quickload "anaphora") -``` - -# Documentation - -Anaphoric macros provide implicit bindings for various -operations. Extensive use of anaphoric macros is not good style, -and probably makes you go blind as well — there's a reason why -Anaphora claims to be from Hell. - -Anaphora provides two families of anaphoric macros, which can be -identified by their names and packages (both families are also -exported from the package `ANAPHORA`). The implicitly-bound symbol -`ANAPHORA:IT` is also exported from all three packages. - -## Basic anaphora - -#### Exported from package `ANAPHORA-BASIC` - -These bind their first argument to `IT` via `LET`. In case of `COND` -all clauses have their test-values bound to `IT`. - -Variants: `AAND`, `ALET`, `APROG1`, `AIF`, `ACOND`, `AWHEN`, `ACASE`, -`ACCASE`, `AECASE`, `ATYPECASE`, `ACTYPECASE`, and `AETYPECASE`. - -## Symbol-macro anaphora - -#### Exported from package `ANAPHORA-SYMBOL` - -These bind their first argument (unevaluated) to `IT` via -SYMBOL-`MACROLET.` - -Variants: `SOR`, `SLET`, `SIF`, `SCOND`, `SUNLESS`, -`SWHEN`, `SCASE`, `SCCASE`, `SECASE`, `STYPECASE`, `SCTYPECASE`, -`SETYPECASE`. - -Also: `ASIF`, which binds via `LET` for the -then-clause, and `SYMBOL-MACROLET` for the else-clause. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/anaphora.asd b/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/anaphora.asd deleted file mode 100644 index d02b818..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/anaphora.asd +++ /dev/null @@ -1,31 +0,0 @@ -;;;; -*- Mode: Lisp; Base: 10; Syntax: ANSI-Common-lisp; -*- - -;;;; Anaphora: The Anaphoric Macro Package from Hell -;;;; -;;;; This been placed in Public Domain by the author, -;;;; Nikodemus Siivola - -(defsystem :anaphora - :version "0.9.6" - :description "The Anaphoric Macro Package from Hell" - :author "Nikodemus Siivola " - :license "Public Domain" - :components - ((:file "packages") - (:file "early" :depends-on ("packages")) - (:file "symbolic" :depends-on ("early")) - (:file "anaphora" :depends-on ("symbolic")))) - -(defsystem :anaphora/test - :description "Tests for anaphora" - :author "Nikodemus Siivola " - :license "Public Domain" - :depends-on (:anaphora :rt) - :components ((:file "tests"))) - -(defmethod perform ((o test-op) (c (eql (find-system :anaphora)))) - (test-system :anaphora/test)) - -(defmethod perform ((o test-op) (c (eql (find-system :anaphora/test)))) - (or (symbol-call :rt '#:do-tests) - (error "test-op failed"))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/anaphora.lisp b/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/anaphora.lisp deleted file mode 100644 index 1cfd8e4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/anaphora.lisp +++ /dev/null @@ -1,162 +0,0 @@ -;;;; -*- Mode: Lisp; Base: 10; Syntax: ANSI-Common-Lisp; Package: ANAPHORA -*- - -;;;; Anaphora: The Anaphoric Macro Package from Hell -;;;; -;;;; This been placed in Public Domain by the author, -;;;; Nikodemus Siivola - -(in-package :anaphora) - -;;; This was the original implementation of SYMBOLIC -- and still good -;;; for getting the basic idea. Brian Masterbrooks solution to -;;; infinite recusion during macroexpansion, that nested forms of this -;;; are subject to, is in symbolic.lisp. -;;; -;;; (defmacro symbolic (op test &body body &environment env) -;;; `(symbol-macrolet ((it ,test)) -;;; (,op it ,@body))) - -(defmacro alet (form &body body) - "Binds the FORM to IT (via LET) in the scope of the BODY." - `(anaphoric ignore-first ,form (progn ,@body))) - -(defmacro slet (form &body body) - "Binds the FORM to IT (via SYMBOL-MACROLET) in the scope of the BODY. IT can -be set with SETF." - `(symbolic ignore-first ,form (progn ,@body))) - -(defmacro aand (first &rest rest) - "Like AND, except binds the first argument to IT (via LET) for the -scope of the rest of the arguments." - `(anaphoric and ,first ,@rest)) - -(defmacro sor (first &rest rest) - "Like OR, except binds the first argument to IT (via SYMBOL-MACROLET) for -the scope of the rest of the arguments. IT can be set with SETF." - `(symbolic or ,first ,@rest)) - -(defmacro aif (test then &optional else) - "Like IF, except binds the result of the test to IT (via LET) for -the scope of the then and else expressions." - `(anaphoric if ,test ,then ,else)) - -(defmacro sif (test then &optional else) - "Like IF, except binds the test form to IT (via SYMBOL-MACROLET) for -the scope of the then and else expressions. IT can be set with SETF" - `(symbolic if ,test ,then ,else)) - -(defmacro asif (test then &optional else) - "Like IF, except binds the result of the test to IT (via LET) for -the the scope of the then-expression, and the test form to IT (via -SYMBOL-MACROLET) for the scope of the else-expression. Within scope of -the else-expression, IT can be set with SETF." - `(let ((it ,test)) - (if it - ,then - (symbolic ignore-first ,test ,else)))) - -(defmacro aprog1 (first &body rest) - "Binds IT to the first form so that it can be used in the rest of the -forms. The whole thing returns IT." - `(anaphoric prog1 ,first ,@rest)) - -(defmacro awhen (test &body body) - "Like WHEN, except binds the result of the test to IT (via LET) for the scope -of the body." - `(anaphoric when ,test ,@body)) - -(defmacro swhen (test &body body) - "Like WHEN, except binds the test form to IT (via SYMBOL-MACROLET) for the -scope of the body. IT can be set with SETF." - `(symbolic when ,test ,@body)) - -(defmacro sunless (test &body body) - "Like UNLESS, except binds the test form to IT (via SYMBOL-MACROLET) for the -scope of the body. IT can be set with SETF." - `(symbolic unless ,test ,@body)) - -(defmacro acase (keyform &body cases) - "Like CASE, except binds the result of the keyform to IT (via LET) for the -scope of the cases." - `(anaphoric case ,keyform ,@cases)) - -(defmacro scase (keyform &body cases) - "Like CASE, except binds the keyform to IT (via SYMBOL-MACROLET) for the -scope of the body. IT can be set with SETF." - `(symbolic case ,keyform ,@cases)) - -(defmacro aecase (keyform &body cases) - "Like ECASE, except binds the result of the keyform to IT (via LET) for the -scope of the cases." - `(anaphoric ecase ,keyform ,@cases)) - -(defmacro secase (keyform &body cases) - "Like ECASE, except binds the keyform to IT (via SYMBOL-MACROLET) for the -scope of the cases. IT can be set with SETF." - `(symbolic ecase ,keyform ,@cases)) - -(defmacro accase (keyform &body cases) - "Like CCASE, except binds the result of the keyform to IT (via LET) for the -scope of the cases. Unlike CCASE, the keyform/place doesn't receive new values -possibly stored with STORE-VALUE restart; the new value is received by IT." - `(anaphoric ccase ,keyform ,@cases)) - -(defmacro sccase (keyform &body cases) - "Like CCASE, except binds the keyform to IT (via SYMBOL-MACROLET) for the -scope of the cases. IT can be set with SETF." - `(symbolic ccase ,keyform ,@cases)) - -(defmacro atypecase (keyform &body cases) - "Like TYPECASE, except binds the result of the keyform to IT (via LET) for -the scope of the cases." - `(anaphoric typecase ,keyform ,@cases)) - -(defmacro stypecase (keyform &body cases) - "Like TYPECASE, except binds the keyform to IT (via SYMBOL-MACROLET) for the -scope of the cases. IT can be set with SETF." - `(symbolic typecase ,keyform ,@cases)) - -(defmacro aetypecase (keyform &body cases) - "Like ETYPECASE, except binds the result of the keyform to IT (via LET) for -the scope of the cases." - `(anaphoric etypecase ,keyform ,@cases)) - -(defmacro setypecase (keyform &body cases) - "Like ETYPECASE, except binds the keyform to IT (via SYMBOL-MACROLET) for -the scope of the cases. IT can be set with SETF." - `(symbolic etypecase ,keyform ,@cases)) - -(defmacro actypecase (keyform &body cases) - "Like CTYPECASE, except binds the result of the keyform to IT (via LET) for -the scope of the cases. Unlike CTYPECASE, new values possible stored by the -STORE-VALUE restart are not received by the keyform/place, but by IT." - `(anaphoric ctypecase ,keyform ,@cases)) - -(defmacro sctypecase (keyform &body cases) - "Like CTYPECASE, except binds the keyform to IT (via SYMBOL-MACROLET) for -the scope of the cases. IT can be set with SETF." - `(symbolic ctypecase ,keyform ,@cases)) - -(defmacro acond (&body clauses) - "Like COND, except result of each test-form is bound to IT (via LET) for the -scope of the corresponding clause." - (labels ((rec (clauses) - (if clauses - (destructuring-bind ((test &body body) . rest) clauses - (if body - `(anaphoric if ,test (progn ,@body) ,(rec rest)) - `(anaphoric if ,test it ,(rec rest)))) - nil))) - (rec clauses))) - -(defmacro scond (&body clauses) - "Like COND, except each test-form is bound to IT (via SYMBOL-MACROLET) for the -scope of the corresponsing clause. IT can be set with SETF." - (labels ((rec (clauses) - (if clauses - (destructuring-bind ((test &body body) . rest) clauses - (if body - `(symbolic if ,test (progn ,@body) ,(rec rest)) - `(symbolic if ,test it ,(rec rest)))) - nil))) - (rec clauses))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/early.lisp b/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/early.lisp deleted file mode 100644 index db044af..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/early.lisp +++ /dev/null @@ -1,20 +0,0 @@ -;;;; -*- Mode: Lisp; Base: 10; Syntax: ANSI-Common-Lisp; Package: ANAPHORA -*- - -;;;; Anaphora: The Anaphoric Macro Package from Hell -;;;; -;;;; This been placed in Public Domain by the author, -;;;; Nikodemus Siivola - -(in-package :anaphora) - -(defmacro with-unique-names ((&rest bindings) &body body) - `(let ,(mapcar #'(lambda (binding) - (destructuring-bind (var prefix) - (if (consp binding) binding (list binding binding)) - `(,var (gensym ,(string prefix))))) - bindings) - ,@body)) - -(defmacro ignore-first (first expr) - (declare (ignore first)) - expr) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/packages.lisp b/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/packages.lisp deleted file mode 100644 index 3b36730..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/packages.lisp +++ /dev/null @@ -1,90 +0,0 @@ -;;;; -*- Mode: Lisp; Base: 10; Syntax: ANSI-Common-Lisp; Package: CL-USER -*- - -;;;; Anaphora: The Anaphoric Macro Package from Hell -;;;; -;;;; This been placed in Public Domain by the author, -;;;; Nikodemus Siivola - -(defpackage :anaphora - (:use :cl) - (:export - #:it - #:alet - #:slet - #:aif - #:aand - #:sor - #:awhen - #:aprog1 - #:acase - #:aecase - #:accase - #:atypecase - #:aetypecase - #:actypecase - #:acond - #:sif - #:asif - #:swhen - #:sunless - #:scase - #:secase - #:sccase - #:stypecase - #:setypecase - #:sctypecase - #:scond) - (:documentation - "ANAPHORA provides a full complement of anaphoric macros. Subsets of the -functionality provided by this package are exported from ANAPHORA-BASIC and -ANAPHORA-SYMBOL.")) - -(defpackage :anaphora-basic - (:use :cl :anaphora) - (:export - #:it - #:alet - #:aif - #:aand - #:awhen - #:aprog1 - #:acase - #:aecase - #:accase - #:atypecase - #:aetypecase - #:actypecase - #:acond) - (:documentation - "ANAPHORA-BASIC provides all normal anaphoric constructs, which bind -primary values to IT.")) - -(defpackage :anaphora-symbol - (:use :cl :anaphora) - (:export - #:it - #:slet - #:sor - #:sif - #:asif - #:swhen - #:sunless - #:scase - #:secase - #:sccase - #:stypecase - #:setypecase - #:sctypecase - #:scond) - (:documentation - "ANAPHORA-SYMBOL provides ``symbolic anaphoric macros'', which bind forms -to IT via SYMBOL-MACROLET. - -Examples: - - (sor (gethash key table) (setf it default)) - - (asif (gethash key table) - (foo it) ; IT is a value bound by LET here - (setf it default)) ; IT is the GETHASH form bound by SYMBOL-MACROLET here -")) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/symbolic.lisp b/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/symbolic.lisp deleted file mode 100644 index 686c6fd..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/symbolic.lisp +++ /dev/null @@ -1,54 +0,0 @@ -;;;; -*- Mode: Lisp; Base: 10; Syntax: ANSI-Common-Lisp; Package: ANAPHORA -*- - -;;;; Copyright (c) 2003 Brian Mastenbrook - -;;;; 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. - -(in-package :anaphora) - -(defmacro internal-symbol-macrolet (&rest whatever) - `(symbol-macrolet ,@whatever)) - -(define-setf-expander internal-symbol-macrolet (binding-forms place &environment env) - (multiple-value-bind (dummies vals newvals setter getter) - (get-setf-expansion place env) - (values dummies - (substitute `(symbol-macrolet ,binding-forms it) 'it vals) - newvals - `(symbol-macrolet ,binding-forms ,setter) - `(symbol-macrolet ,binding-forms ,getter)))) - -(with-unique-names (s-indicator current-s-indicator) - (defmacro symbolic (operation test &rest other-args) - (with-unique-names (this-s) - (let ((current-s (get s-indicator current-s-indicator))) - (setf (get s-indicator current-s-indicator) this-s) - `(symbol-macrolet - ((,this-s (internal-symbol-macrolet ((it ,current-s)) ,test)) - (it ,this-s)) - (,operation it ,@other-args))))) - - (defmacro anaphoric (op test &body body) - (with-unique-names (this-s) - (setf (get s-indicator current-s-indicator) this-s) - `(let* ((it ,test) - (,this-s it)) - (declare (ignorable ,this-s)) - (,op it ,@body))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/tests.lisp b/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/tests.lisp deleted file mode 100644 index e4a26fc..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/anaphora-20191007-git/tests.lisp +++ /dev/null @@ -1,427 +0,0 @@ -;;;; Anaphora: The Anaphoric Macro Package from Hell -;;;; -;;;; This been placed in Public Domain by the author, -;;;; Nikodemus Siivola - -(defpackage :anaphora-test - (:use :cl :anaphora :rt)) - -(in-package :anaphora-test) - -(deftest alet.1 - (alet (1+ 1) - (1+ it)) - 3) - -(deftest alet.2 - (alet (1+ 1) - it - (1+ it)) - 3) - -(deftest slet.1 - (let ((x (list 1 2 3))) - (slet (car x) - (incf it) (values it x))) - 2 (2 2 3)) - -(deftest aand.1 - (aand (+ 1 1) - (+ 1 it)) - 3) - -(deftest aand.2 - (aand 1 t (values it 2)) - 1 2) - -(deftest aand.3 - (let ((x 1)) - (aand (incf x) t t (values t it))) - t 2) - -(deftest aand.4 - (aand 1 (values t it)) - t 1) - -#+(or) -;;; bug or a feature? forms like this expand to -;;; -;;; (let ((it (values ...))) (and it ...)) -;;; -(deftest aand.5 - (aand (values nil t) it) - nil t) - -(deftest sor.1 - (let ((x (list nil))) - (sor (car x) - (setf it t)) - x) - (t)) - -(deftest aif.1 - (aif (+ 1 1) - (+ 1 it) - :never) - 3) - -(deftest aif.2 - (let ((x 0)) - (aif (incf x) - it - :never)) - 1) - -(deftest aif.3 - (let ((x 0)) - (aif (eval `(and ,(incf x) nil)) - :never - (list it x))) - (nil 1)) - -(deftest sif.1 - (let ((x (list nil))) - (sif (car x) - (setf it :oops) - (setf it :yes!)) - (car x)) - :yes!) - -(deftest sif.2 - (let ((x (list t))) - (sif (car x) - (setf it :yes!) - (setf it :oops)) - (car x)) - :yes!) - -(deftest sif.3 - (sif (list 1 2 3) - (sif (car it) - (setf it 'a) - :foo)) - a) - -(deftest sif.4 - (progn - (defclass sif.4 () - ((a :initform (list :sif)))) - (with-slots (a) - (make-instance 'sif.4) - (sif a - (sif (car it) - it)))) - :sif) - -(deftest asif.1 - (let ((x (list 0))) - (asif (incf (car x)) - it - (list :oops it))) - 1) - -(deftest asif.2 - (let ((x (list nil))) - (asif (car x) - (setf x :oops) - (setf it :yes!)) - x) - (:yes!)) - -(deftest awhen.1 - (let ((x 0)) - (awhen (incf x) - (+ 1 it))) - 2) - -(deftest awhen.2 - (let ((x 0)) - (or (awhen (not (incf x)) - t) - x)) - 1) - -(deftest swhen.1 - (let ((x 0)) - (swhen x - (setf it :ok)) - x) - :ok) - -(deftest swhen.2 - (let ((x nil)) - (swhen x - (setf it :oops)) - x) - nil) - -(deftest sunless.1 - (let ((x nil)) - (sunless x - (setf it :ok)) - x) - :ok) - -(deftest sunless.2 - (let ((x t)) - (sunless x - (setf it :oops)) - x) - t) - -(deftest acase.1 - (let ((x 0)) - (acase (incf x) - (0 :no) - (1 (list :yes it)) - (2 :nono))) - (:yes 1)) - -(deftest scase.1 - (let ((x (list 3))) - (scase (car x) - (0 (setf it :no)) - (3 (setf it :yes!)) - (t (setf it :nono))) - x) - (:yes!)) - -(deftest aecase.1 - (let ((x (list :x))) - (aecase (car x) - (:y :no) - (:x (list it :yes)))) - (:x :yes)) - -(deftest aecase.2 - (nth-value 0 (ignore-errors - (let ((x (list :x))) - (secase (car x) - (:y :no))) - :oops)) - nil) - -(deftest secase.1 - (let ((x (list :x))) - (secase (car x) - (:y (setf it :no)) - (:x (setf it :yes))) - x) - (:yes)) - -(deftest secase.2 - (nth-value 0 (ignore-errors - (let ((x (list :x))) - (secase (car x) - (:y (setf it :no))) - :oops))) - nil) - -(deftest accase.1 - (let ((x (list :x))) - (accase (car x) - (:y :no) - (:x (list it :yes)))) - (:x :yes)) - -(deftest accase.2 - (let ((x (list :x))) - (handler-bind ((type-error (lambda (e) (store-value :z e)))) - (accase (car x) - (:y (setf x :no)) - (:z (setf x :yes)))) - x) - :yes) - -(deftest accase.3 - (let ((x (list :x))) - (accase (car x) - (:x (setf it :foo))) - x) - (:x)) - -(deftest sccase.1 - (let ((x (list :x))) - (sccase (car x) - (:y (setf it :no)) - (:x (setf it :yes))) - x) - (:yes)) - -(deftest sccase.2 - (let ((x (list :x))) - (handler-bind ((type-error (lambda (e) (store-value :z e)))) - (sccase (car x) - (:y (setf it :no)) - (:z (setf it :yes)))) - x) - (:yes)) - -(deftest atypecase.1 - (atypecase 1.0 - (integer (+ 2 it)) - (float (1- it))) - 0.0) - -(deftest atypecase.2 - (atypecase "Foo" - (fixnum :no) - (hash-table :nono)) - nil) - -(deftest stypecase.1 - (let ((x (list 'foo))) - (stypecase (car x) - (vector (setf it :no)) - (symbol (setf it :yes))) - x) - (:yes)) - -(deftest stypecase.2 - (let ((x (list :bar))) - (stypecase (car x) - (fixnum (setf it :no))) - x) - (:bar)) - -(deftest aetypecase.1 - (aetypecase 1.0 - (fixnum (* 2 it)) - (float (+ 2.0 it)) - (symbol :oops)) - 3.0) - -(deftest aetypecase.2 - (nth-value 0 (ignore-errors - (aetypecase 1.0 - (symbol :oops)))) - nil) - -(deftest setypecase.1 - (let ((x (list "Foo"))) - (setypecase (car x) - (symbol (setf it :no)) - (string (setf it "OK")) - (integer (setf it :noon))) - x) - ("OK")) - -(deftest setypecase.2 - (nth-value 0 (ignore-errors - (setypecase 'foo - (string :nono)))) - nil) - -(deftest actypecase.1 - (actypecase :foo - (string (list :string it)) - (keyword (list :keyword it)) - (symbol (list :symbol it))) - (:keyword :foo)) - -(deftest actypecase.2 - (handler-bind ((type-error (lambda (e) (store-value "OK" e)))) - (actypecase 0 - (string it))) - "OK") - -(deftest sctypecase.1 - (let ((x (list 0))) - (sctypecase (car x) - (symbol (setf it 'symbol)) - (bit (setf it 'bit))) - x) - (bit)) - -(deftest sctypecase.2 - (handler-bind ((type-error (lambda (e) (store-value "OK" e)))) - (let ((x (list 0))) - (sctypecase (car x) - (string (setf it :ok))) - x)) - (:ok)) - -(deftest acond.1 - (acond (:foo)) - :foo) - -(deftest acond.2 - (acond ((null 1) (list :no it)) - ((+ 1 2) (list :yes it)) - (t :nono)) - (:yes 3)) - -(deftest acond.3 - (acond ((= 1 2) :no) - (nil :nono) - (t :yes)) - :yes) - -;; Test COND with multiple forms in the implicit progn. -(deftest acond.4 - (let ((foo)) - (acond ((+ 2 2) (setf foo 38) (incf foo it) foo) - (t nil))) - 42) - -(deftest scond.1 - (let ((x (list nil)) - (y (list t))) - (scond ((car x) (setf it :nono)) - ((car y) (setf it :yes))) - (values x y)) - (nil) - (:yes)) - -(deftest scond.2 - (scond ((= 1 2) :no!)) - nil) - -(deftest aprog.1 - (aprog1 :yes - (unless (eql it :yes) (error "Broken.")) - :no) - :yes) - -(deftest aif.sif.1 - (sif 1 (aif it it)) - 1) - -(deftest aif.sif.2 - (aif 1 (sif it it)) - 1) - -(deftest aif.sif.3 - (aif (list 1 2 3) - (sif (car it) - (setf it 'a) - :foo)) - a) - -(deftest alet.slet.1 - (slet 42 (alet 43 (slet it it))) - 43) - - -(defun elt-like (index seq) - (elt seq index)) - -(define-setf-expander elt-like (index seq) - (let ((index-var (gensym "index")) - (seq-var (gensym "seq")) - (store (gensym "store"))) - (values (list index-var seq-var) - (list index seq) - (list store) - `(if (listp ,seq-var) - (setf (nth ,index-var ,seq-var) ,store) - (setf (aref ,seq-var ,index-var) ,store)) - `(if (listp ,seq-var) - (nth ,index-var ,seq-var) - (aref ,seq-var ,index-var))))) - -(deftest symbolic.setf-expansion.1 - (let ((cell (list nil))) - (sor (elt-like 0 cell) (setf it 1)) - (equal cell '(1))) - t) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/.travis.yml b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/.travis.yml deleted file mode 100644 index 7460681..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/.travis.yml +++ /dev/null @@ -1,31 +0,0 @@ -language: lisp - -env: - matrix: - - LISP=abcl - - LISP=allegro - - LISP=sbcl - - LISP=sbcl32 - - LISP=ccl - - LISP=ccl32 - - LISP=clisp - - LISP=clisp32 - - LISP=cmucl - - LISP=ecl - -matrix: - allow_failures: - - env: LISP=cmucl - - env: LISP=ecl - -install: - - curl -L https://github.com/luismbo/cl-travis/raw/master/install.sh | sh - - git clone --depth=1 git://github.com/trivial-features/trivial-features.git ~/lisp/trivial-features - - git clone https://gitlab.common-lisp.net/alexandria/alexandria.git ~/lisp/alexandria - -script: - - cl -e '(ql:quickload :babel-tests) - (unless (babel-tests:run) - (uiop:quit 1))' - -sudo: required diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/COPYRIGHT b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/COPYRIGHT deleted file mode 100644 index 029c569..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/COPYRIGHT +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (C) 2007, Luis Oliveira - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/HEADER b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/HEADER deleted file mode 100644 index 6687549..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/HEADER +++ /dev/null @@ -1,27 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; filename --- description -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; Permission is hereby granted, free of charge, to any person -;;; obtaining a copy of this software and associated documentation -;;; files (the "Software"), to deal in the Software without -;;; restriction, including without limitation the rights to use, copy, -;;; modify, merge, publish, distribute, sublicense, and/or sell copies -;;; of the Software, and to permit persons to whom the Software is -;;; furnished to do so, subject to the following conditions: -;;; -;;; The above copyright notice and this permission notice shall be -;;; included in all copies or substantial portions of the Software. -;;; -;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -;;; DEALINGS IN THE SOFTWARE. - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/NOTES b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/NOTES deleted file mode 100644 index 47105d5..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/NOTES +++ /dev/null @@ -1,34 +0,0 @@ -====================================== -LIST OF IDEAS AND TODO ITEMS FOR BABEL - - * VERY IMPORTANT: given that we steal a lot of code from OpenMCL we - probably to license those files under the LLGPL (or is it the - whole library?) Figure this out ASAP. - - * Many more tests needed. - - test invalid sequences. - - use more interesting test files. - - test with big strings that when converted would need a array - with more than array-index-limit elements. - - * Add support for ennforcing endiannes for multi-byte encodings like - UTF-16 and UTF-32. - - * Implement more encodings. (ISO-8859-*, windows, CJK encodings, etc) - - * null-termination, bom-markers. Add to string-to-octets. - - * Unicode normalization routines? - - * Allow for non-fixnum indexes? - - * Documentation. - - * Address the various XXX and TODO items in the source. - - * Should we start adding a lot of encodings, a load-on-demand scheme - might come in handy. It would also help with debugging. - - * Make the test suite reusable, very much like mappings are reusable. - - * Make the whole thing easier to debug. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/README.md b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/README.md deleted file mode 100644 index 76d64e7..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/README.md +++ /dev/null @@ -1,19 +0,0 @@ -[![Build Status](https://travis-ci.org/cl-babel/babel.svg?branch=master)](https://travis-ci.org/cl-babel/babel) - -Babel is a charset encoding/decoding library, not unlike GNU libiconv, -but completely written in Common Lisp. - -It strives to achieve decent performance. To that effect, we use -OpenMCL's approach of calculating the destination buffer size in -advance. Most of the encoding/decoding algorithms have been adapted -from OpenMCL's source. - -Another important goal is reusability. Similarly to SBCL, we define -an interface wherein the algorithms can be reused between a variety of -data types so long we're dealing with conversions between octets and -unicode code points. - -Babel comes with converters between strings and (unsigned-byte 8) -vectors but can be easily extended to deal with, e.g., strings and -foreign memory, vectors and Closure's runes, etc... - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel-streams.asd b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel-streams.asd deleted file mode 100644 index 8a5cac0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel-streams.asd +++ /dev/null @@ -1,38 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; babel-streams.asd --- ASDF system definition for Babel streams. -;;; -;;; Copyright (C) 2008, Attila Lendvai -;;; -;;; 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. - -(defsystem :babel-streams - :description "Some useful streams based on Babel's encoding code" - :author ("Dr. Edmund Weitz" - "Attila Lendvai ") - :version "0.1.0" - :licence "MIT" - :depends-on (:babel :alexandria :trivial-gray-streams) - :components - ((:module "src" - :serial t - :components - ((:file "streams"))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel-tests.asd b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel-tests.asd deleted file mode 100644 index 9c1eed0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel-tests.asd +++ /dev/null @@ -1,42 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; babel-tests.asd --- ASDF system definition for Babel unit tests. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(defsystem babel-tests - :description "Unit tests for Babel." - :depends-on (babel hu.dwim.stefil) - :components - ((:module "tests" - :serial t - :components - ((:file "tests"))))) - -(defmethod perform ((o test-op) (c (eql (find-system :babel-tests)))) - (funcall (intern (string '#:run) '#:babel-tests))) - -(defmethod operation-done-p ((o test-op) (c (eql (find-system :babel-tests)))) - nil) - -;;; vim: ft=lisp et diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel.asd b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel.asd deleted file mode 100644 index abb8885..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel.asd +++ /dev/null @@ -1,59 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; babel.asd --- ASDF system definition for Babel. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(defsystem babel - :description "Babel, a charset conversion library." - :author "Luis Oliveira " - :licence "MIT" - :depends-on (trivial-features alexandria) - :components - ((:module src - :serial t - :components - ((:file "packages") - (:file "encodings") - (:file "enc-ascii") - (:file "enc-ebcdic") - (:file "enc-ebcdic-int") - (:file "enc-iso-8859") - (:file "enc-unicode") - (:file "enc-cp1251") - (:file "enc-cp1252") - (:file "jpn-table") - (:file "enc-jpn") - (:file "enc-gbk") - (:file "enc-koi8") - (:file "external-format") - (:file "strings") - (:file "gbk-map") - (:file "sharp-backslash"))))) - -(defmethod perform ((o test-op) (c (eql (find-system :babel)))) - (operate 'load-op :babel-tests) - (operate 'test-op :babel-tests)) - -(defmethod operation-done-p ((o test-op) (c (eql (find-system :babel)))) - nil) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/Makefile b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/Makefile deleted file mode 100644 index 5446d3c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -# -*- Mode: Makefile; tab-width: 4; indent-tabs-mode: t -*- - -MANUAL := "babel" -SYSTEM := "babel" -PACKAGES := babel babel-encodings -TITLE := "Babel Manual" -CSS := "default" - -export LISP ?= sbcl -export SBCL_OPTIONS ?= --noinform - -.PHONY: all clean html pdf upload - -all: - texinfo-docstrings all $(SYSTEM) $(MANUAL) $(TITLE) $(CSS) $(PACKAGES) - -pdf: - texinfo-docstrings pdf $(SYSTEM) $(MANUAL) $(TITLE) $(CSS) $(PACKAGES) - -html: - texinfo-docstrings html $(SYSTEM) $(MANUAL) $(TITLE) $(CSS) $(PACKAGES) - -upload: -# rsync -av --delete -e ssh manual common-lisp.net:/project/FOO/public_html/ -# scp -r manual common-lisp.net:/project/cffi/public_html/ - -clean: - find . \( -name "*.pdf" -o -name "*.html" -o -name "*.info" -o -name "*.aux" -o -name "*.cp" -o -name "*.fn" -o -name "*.fns" -o -name "*.ky" -o -name "*.log" -o -name "*.pg" -o -name "*.toc" -o -name "*.tp" -o -name "*.vr" -o -name "*.dvi" -o -name "*.cps" -o -name "*.vrs" \) -exec rm {} \; - rm -rf include manual - -# vim: ft=make ts=4 noet diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/babel.texinfo b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/babel.texinfo deleted file mode 100644 index efdc5dc..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/babel.texinfo +++ /dev/null @@ -1,105 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header -@setfilename babel.info -@settitle Babel Manual - -@c @exampleindent 2 -@c @documentencoding utf-8 - -@c %**end of header - -@c for install-info -@c @dircategory %%INFO-CATEGORY%% -@c @direntry -@c * babel: %%PROJECT-DESCRIPTION%% -@c @end direntry - -@include macros.texinfo - -@c Show types, functions, and concepts in the same index. -@syncodeindex tp cp -@syncodeindex fn cp - -@copying -@c Copyright @copyright{} 2084 John Doe - -@include license.texinfo -@end copying - -@titlepage -@title Babel Manual -@subtitle draft version -@c @author John Doe -@page -@vskip 0pt plus 1filll -@insertcopying -@end titlepage - -@contents - -@ifnottex -@node Top -@top babel -@insertcopying -@end ifnottex - -@c Top Menu -@menu -* First Chapter:: -* Comprehensive Index:: -@end menu - -@node First Chapter -@chapter First Chapter - -Bla bla bla, bla bla bla. - -@section Conditions - -@include include/condition-babel-character-out-of-range.texinfo -@include include/condition-babel-encodings-character-out-of-range.texinfo -@include include/condition-babel-encodings-end-of-input-in-character.texinfo -@include include/condition-babel-encodings-invalid-utf8-continuation-byte.texinfo -@include include/condition-babel-encodings-invalid-utf8-starter-byte.texinfo -@include include/condition-babel-encodings-overlong-utf8-sequence.texinfo -@include include/condition-babel-end-of-input-in-character.texinfo -@include include/condition-babel-invalid-utf8-continuation-byte.texinfo -@include include/condition-babel-invalid-utf8-starter-byte.texinfo -@include include/condition-babel-overlong-utf8-sequence.texinfo -@include include/constant-babel-unicode-char-code-limit.texinfo - -@section More stuff - -@include include/fun-babel-encodings-get-character-encoding.texinfo -@include include/fun-babel-encodings-list-character-encodings.texinfo -@include include/fun-babel-encodings-lookup-mapping.texinfo -@include include/fun-babel-list-character-encodings.texinfo -@include include/macro-babel-encodings-with-checked-simple-vector.texinfo -@include include/macro-babel-encodings-with-simple-vector.texinfo -@include include/type-babel-simple-unicode-string.texinfo -@include include/type-babel-unicode-char.texinfo -@include include/type-babel-unicode-string.texinfo -@include include/var-babel-encodings-star-default-character-encoding-star.texinfo -@include include/var-babel-encodings-star-suppress-character-coding-errors-star.texinfo -@include include/var-babel-star-default-character-encoding-star.texinfo -@include include/var-babel-star-default-eol-style-star.texinfo - -@c @include include/fun-somepackage-somefunction.texinfo -@c @include include/macro-somepackage-somemacro.texinfo - -@c @node First Section -@c @section First Section - -@c @include include/fun-somepackage-somefunction.texinfo -@c @include include/fun-somepackage-somefunction.texinfo - - - -@c We call this node ``Comprehensive Index'' so that texinfo's HTML -@c output doesn't generate an index.html that'd overwrite the manual's -@c initial page. -@node Comprehensive Index -@unnumbered Index -@printindex cp - -@bye diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/license.texinfo b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/license.texinfo deleted file mode 100644 index 2835843..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/license.texinfo +++ /dev/null @@ -1,20 +0,0 @@ -@quotation -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. - -@sc{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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/macros.texinfo b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/macros.texinfo deleted file mode 100644 index 95f47cf..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/macros.texinfo +++ /dev/null @@ -1,27 +0,0 @@ -@c Some plain TeX macrology to wrap text in \hbox{} only if the text -@c contains no hyphens. -@iftex -@tex -\newif\ifdash -\long\def\dashp#1{\expandafter\setnext#1-\dashphelper} -\long\def\setnext#1-{\futurelet\next\dashphelper} -\long\def\dashphelper#1\dashphelper{ - \ifx\dashphelper\next\dashfalse\else\dashtrue\fi -} -\def\lw#1{\leavevmode\dashp{#1}\ifdash#1\else\hbox{#1}\fi} -@end tex -@end iftex - -@c A Texinfo binding for the plain TeX above. Analogous to Texinfo's -@c @w, but for Lisp symbols. AFAICT, the comment characters are -@c necessary to prevent treating the newline as a space. -@macro lw{word} -@iftex -@tex -\\lw{\word\}% -@end tex -@end iftex -@ifnottex -\word\@c -@end ifnottex -@end macro diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/scripts/release.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/scripts/release.lisp deleted file mode 100644 index 80308d0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/scripts/release.lisp +++ /dev/null @@ -1,250 +0,0 @@ -#!/usr/bin/env clisp -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- - -(defpackage :release-script (:use #:cl #:regexp)) -(in-package :release-script) - -;;;; Configuration ------------------------------------------------------------ - -(defparameter *project-name* "babel") -(defparameter *asdf-file* (format nil "~A.asd" *project-name*)) - -(defparameter *host* "common-lisp.net") -(defparameter *release-dir* - (format nil "/project/~A/public_html/releases" *project-name*)) - -(defparameter *version-file* "VERSION") -(defparameter *version-file-dir* - (format nil "/project/~A/public_html" *project-name*)) - -;;;; -------------------------------------------------------------------------- - -;;;; Utilities - -(defun ensure-list (x) - (if (listp x) x (list x))) - -(defmacro string-case (expression &body clauses) - `(let ((it ,expression)) ; yes, anaphoric, deal with it. - (cond - ,@(loop for clause in clauses collect - `((or ,@(loop for alternative in (ensure-list (first clause)) - collect (or (eq t alternative) - `(string= it ,alternative)))) - ,@(rest clause)))))) - -(defparameter *development-mode* nil) - -(defun die (format-control &rest format-args) - (format *error-output* "~?" format-control format-args) - (if *development-mode* - (cerror "continue" "die") - (ext:quit 1))) - -(defun numeric-split (string) - (if (digit-char-p (char string 0)) - (multiple-value-bind (number next-position) - (parse-integer string :junk-allowed t) - (cons number (when (< next-position (length string)) - (numeric-split (subseq string next-position))))) - (let ((next-digit-position (position-if #'digit-char-p string))) - (if next-digit-position - (cons (subseq string 0 next-digit-position) - (numeric-split (subseq string next-digit-position))) - (list string))))) - -(defun natural-string-< (s1 s2) - (labels ((aux< (l1 l2) - (cond ((null l1) (not (null l2))) - ((null l2) nil) - (t (destructuring-bind (x . xs) l1 - (destructuring-bind (y . ys) l2 - (cond ((and (numberp x) (stringp y)) - t) - ((and (numberp y) (stringp x)) - nil) - ((and (numberp x) (numberp y)) - (or (< x y) (and (= x y) (aux< xs ys)))) - (t - (or (string-lessp x y) - (and (string-equal x y) - (aux< xs ys))))))))))) - (aux< (numeric-split s1) - (numeric-split s2)))) - -;;;; Running commands - -(defparameter *dry-run* nil) - -(defun cmd? (format-control &rest format-args) - (let ((cmd (format nil "~?" format-control format-args))) - (with-open-stream (s1 (ext:run-shell-command cmd :output :stream)) - (loop for line = (read-line s1 nil nil) - while line - collect line)))) - -;; XXX: quote arguments. -(defun cmd (format-control &rest format-args) - (when *development-mode* - (format *debug-io* "CMD: ~?~%" format-control format-args)) - (let ((ret (ext:run-shell-command (format nil "~?" format-control format-args)))) - (or (null ret) - (zerop ret)))) - -(defun cmd! (format-control &rest format-args) - (or (apply #'cmd format-control format-args) - (die "cmd '~?' failed." format-control format-args))) - -(defun maybe-cmd! (format-control &rest format-args) - (if *dry-run* - (format t "SUPPRESSING: ~?~%" format-control format-args) - (apply #'cmd! format-control format-args))) - -;;;; - -(defun find-current-version () - (subseq (reduce (lambda (x y) (if (natural-string-< x y) y x)) - (or (cmd? "git tag -l v\\*") - (die "no version tags found. Please specify initial version."))) - 1)) - -(defun parse-version (string) - (mapcar (lambda (x) - (parse-integer x :junk-allowed t)) - (loop repeat 3 ; XXX: parameterize - for el in (regexp-split "\\." (find-current-version)) - collect el))) - -(defun check-for-unrecorded-changes (&optional force) - (unless (cmd "git diff --exit-code") - (write-line "Unrecorded changes.") - (if force - (write-line "Continuing anyway.") - (die "Aborting.~@ - Use -f or --force if you want to make a release anyway.")))) - -(defun new-version-number-candidates (current-version) - (let ((current-version (parse-version current-version))) - (labels ((alternatives (before after) - (when after - (cons (append before (list (1+ (first after))) - (mapcar (constantly 0) (rest after))) - (alternatives (append before (list (first after))) - (rest after)))))) - (loop for alt in (alternatives nil current-version) - collect (reduce (lambda (acc next) - (format nil "~a.~a" acc next)) - alt))))) - -(defun ask-user-for-version (current-version next-versions) - (format *query-io* "Current version is ~A. Which will be the next one?~%" - current-version) - (loop for i from 1 and version in next-versions - do (format *query-io* "~T~A) ~A~%" i version)) - (format *query-io* "? ") - (finish-output *query-io*) - (nth (1- (parse-integer (read-line) :junk-allowed t)) - next-versions)) - -(defun git-tag-tree (version) - (write-line "Tagging the tree...") - (maybe-cmd! "git tag \"v~A\"" version)) - -(defun add-version-to-system-file (version path-in path-out) - (with-open-file (in path-in :direction :input) - (with-open-file (out path-out :direction :output) - (loop for line = (read-line in nil nil) while line - do (write-line line out) - when (string= #1="(defsystem " line - :end2 (min (length #1#) (length line))) - do (format out " :version ~s~%" version))))) - -(defun create-dist (version distname) - (write-line "Creating distribution...") - (cmd! "mkdir \"~a\"" distname) - (cmd! "git archive master | tar xC \"~A\"" distname) - (format t "Updating ~A with new version: ~A~%" *asdf-file* version) - (let* ((asdf-file-path (format nil "~A/~A" distname *asdf-file*)) - (tmp-asdf-file-path (format nil "~a.tmp" asdf-file-path))) - (add-version-to-system-file version asdf-file-path tmp-asdf-file-path) - (cmd! "mv \"~a\" \"~a\"" tmp-asdf-file-path asdf-file-path))) - -(defun tar-and-sign (distname tarball) - (write-line "Creating and signing tarball...") - (cmd! "tar czf \"~a\" \"~a\"" tarball distname) - (cmd! "gpg -b -a \"~a\"" tarball)) - -(defparameter *remote-directory* (format nil "~A:~A" *host* *release-dir*)) - -(defun upload-tarball (tarball signature remote-directory) - (write-line "Copying tarball to web server...") - (maybe-cmd! "scp \"~A\" \"~A\" \"~A\"" tarball signature remote-directory) - (format t "Uploaded ~A and ~A.~%" tarball signature)) - -(defun update-remote-links (tarball signature host release-dir project-name) - (format t "Updating ~A_latest links...~%" project-name) - (maybe-cmd! "ssh \"~A\" ln -sf \"~A\" \"~A/~A_latest.tar.gz\"" - host tarball release-dir project-name) - (maybe-cmd! "ssh \"~A\" ln -sf \"~A\" \"~A/~A_latest.tar.gz.asc\"" - host signature release-dir project-name)) - -(defun upload-version-file (version version-file host version-file-dir) - (format t "Uploading ~A...~%" version-file) - (with-open-file (out version-file :direction :output) - (write-string version out)) - (maybe-cmd! "scp \"~A\" \"~A\":\"~A\"" version-file host version-file-dir) - (maybe-cmd! "rm \"~A\"" version-file)) - -(defun maybe-clean-things-up (tarball signature) - (when (y-or-n-p "Clean local tarball and signature?") - (cmd! "rm \"~A\" \"~A\"" tarball signature))) - -(defun run (force version) - (check-for-unrecorded-changes force) - ;; figure out what version we'll be preparing. - (unless version - (let* ((current-version (find-current-version)) - (next-versions (new-version-number-candidates current-version))) - (setf version (or (ask-user-for-version current-version next-versions) - (die "invalid selection."))))) - (git-tag-tree version) - (let* ((distname (format nil "~A_~A" *project-name* version)) - (tarball (format nil "~A.tar.gz" distname)) - (signature (format nil "~A.asc" tarball))) - ;; package things up. - (create-dist version distname) - (tar-and-sign distname tarball) - ;; upload. - (upload-tarball tarball signature *remote-directory*) - (update-remote-links tarball signature *host* *release-dir* *project-name*) - (when *version-file* - (upload-version-file version *version-file* *host* *version-file-dir*)) - ;; clean up. - (maybe-clean-things-up tarball signature) - ;; documentation. - ;; (write-line "Building and uploading documentation...") - ;; (maybe-cmd! "make -C doc upload-docs") - ;; push tags and any outstanding changes. - (write-line "Pushing tags and changes...") - (maybe-cmd! "git push --tags origin master"))) - - -;;;; Do it to it - -(let ((force nil) - (version nil) - (args ext:*args*)) - (loop while args - do (string-case (pop args) - (("-h" "--help") - (write-line "No help, sorry. Read the source.") - (ext:quit 0)) - (("-f" "--force") - (setf force t)) - (("-v" "--version") - (setf version (pop args))) - (("-n" "--dry-run") - (setf *dry-run* t)) - (t - (die "Unrecognized argument '~a'" it)))) - (run force version)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ascii.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ascii.lisp deleted file mode 100644 index dd26d13..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ascii.lisp +++ /dev/null @@ -1,43 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; enc-ascii.lisp --- Implementation of the ASCII character encoding. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package #:babel-encodings) - -(define-character-encoding :ascii - "A 7-bit, fixed-width character encoding in which all -character codes map to their Unicode equivalents." - :aliases '(:us-ascii) - :literal-char-code-limit 128) - -(define-unibyte-encoder :ascii (code) - (if (>= code 128) - (handle-error) - code)) - -(define-unibyte-decoder :ascii (octet) - (if (>= octet 128) - (handle-error) - octet)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-cp1251.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-cp1251.lisp deleted file mode 100644 index 8bcead0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-cp1251.lisp +++ /dev/null @@ -1,119 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; enc-cp1251.lisp --- Implementation of the CP1251 character encoding. -;;; -;;; Copyright (C) 2009, Andrey Moskvitin -;;; -;;; 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. - -(in-package #:babel-encodings) - -(define-character-encoding :cp1251 - "An 8-bit, fixed-width character Russian encoding from Windows." - :aliases '(:windows-1251) - :literal-char-code-limit #x80) - -(define-constant +cp1251-to-unicode+ - #(;; #x80 - #x0402 #x0403 #x201a #x0453 #x201e #x2026 #x2020 #x2021 - #x20ac #x2030 #x0409 #x2039 #x040a #x040c #x040b #x040f - ;; #x90 - #x0452 #x2018 #x2019 #x201c #x201d #x2022 #x2013 #x2014 - #xfffd #x2122 #x0459 #x203a #x045a #x045c #x045b #x045f - ;; #xa0 - #x00a0 #x040e #x045e #x0408 #x00a4 #x0490 #x00a6 #x00a7 - #x0401 #x00a9 #x0404 #x00ab #x00ac #x00ad #x00ae #x0407 - ;; #xb0 - #x00b0 #x00b1 #x0406 #x0456 #x0491 #x00b5 #x00b6 #x00b7 - #x0451 #x2116 #x0454 #x00bb #x0458 #x0405 #x0455 #x0457 - ;; #xc0 - #x0410 #x0411 #x0412 #x0413 #x0414 #x0415 #x0416 #x0417 - #x0418 #x0419 #x041a #x041b #x041c #x041d #x041e #x041f - ;; #xd0 - #x0420 #x0421 #x0422 #x0423 #x0424 #x0425 #x0426 #x0427 - #x0428 #x0429 #x042a #x042b #x042c #x042d #x042e #x042f - ;; #xe0 - #x0430 #x0431 #x0432 #x0433 #x0434 #x0435 #x0436 #x0437 - #x0438 #x0439 #x043a #x043b #x043c #x043d #x043e #x043f - ;; #xf0 - #x0440 #x0441 #x0442 #x0443 #x0444 #x0445 #x0446 #x0447 - #x0448 #x0449 #x044a #x044b #x044c #x044d #x044e #x044f) - :test #'equalp) - -(define-unibyte-decoder :cp1251 (octet) - (if (< octet #x80) - octet - (svref +cp1251-to-unicode+ (the ub8 (- octet #x80))))) - -(define-constant +unicode-a0-bf-to-cp1251+ - #(#xa0 #x00 #x00 #x00 #xa4 #x00 #xa6 #xa7 ; #xa0-#xa7 - #x00 #xa9 #x00 #xab #xac #xad #xae #x00 ; #xa8-#xaf - #xb0 #xb1 #x00 #x00 #x00 #xb5 #xb6 #xb7 ; #xb0-#xb7 - #x00 #x00 #x00 #xbb #x00 #x00 #x00 #x00) ; #xb8-#xbf - :test #'equalp) - -(define-constant +unicode-0-97-to-cp1251+ - #(#x00 #xa8 #x80 #x81 #xaa #xbd #xb2 #xaf ; #x00-#x07 - #xa3 #x8a #x8c #x8e #x8d #x00 #xa1 #x8f ; #x08-#x0f - #xc0 #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 #xc7 ; #x10-#x17 - #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #x18-#x1f - #xd0 #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 #xd7 ; #x20-#x27 - #xd8 #xd9 #xda #xdb #xdc #xdd #xde #xdf ; #x28-#x2f - #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #x30-#x37 - #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #x38-#x3f - #xf0 #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 #xf7 ; #x40-#x47 - #xf8 #xf9 #xfa #xfb #xfc #xfd #xfe #xff ; #x48-#x4f - #x00 #xb8 #x90 #x83 #xba #xbe #xb3 #xbf ; #x50-#x57 - #xbc #x9a #x9c #x9e #x9d #x00 #xa2 #x9f ; #x58-#x5f - #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 ; #x60-#x67 - #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 ; #x68-#x6f - #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 ; #x70-#x77 - #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 ; #x78-#x7f - #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 ; #x80-#x87 - #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 ; #x88-#x8f - #xa5 #xb4 #x00 #x00 #x00 #x00 #x00 #x00) ; #x90-#x97 - :test #'equalp) - -(define-constant +unicode-10-3f-to-cp1251+ - #(#x00 #x00 #x00 #x96 #x97 #x00 #x00 #x00 ; #x10-#x17 - #x91 #x92 #x82 #x00 #x93 #x94 #x84 #x00 ; #x18-#x1f - #x86 #x87 #x95 #x00 #x00 #x00 #x85 #x00 ; #x20-#x27 - #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 ; #x28-#x2f - #x89 #x00 #x00 #x00 #x00 #x00 #x00 #x00 ; #x30-#x37 - #x00 #x8b #x9b #x00 #x00 #x00 #x00 #x00) ; #x38-#x3f - :test #'equalp) - -(define-unibyte-encoder :cp1251 (code) - (cond - ((< code #x80) code) - ((and (>= code #xa0) (< code #xc0)) - (svref +unicode-a0-bf-to-cp1251+ - (the ub8 (- code #xa0)))) - ((and (>= code #x400) (< code #x498)) - (svref +unicode-0-97-to-cp1251+ - (the ub8 (- code #x400)))) - ((and (>= code #x2010) (< code #x2040)) - (svref +unicode-10-3f-to-cp1251+ - (the ub8 (- code #x2010)))) - ((= code #x20ac) #x88) - ((= code #x2116) #xb9) - ((= code #x2122) #x99) - (t (handle-error)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-cp1252.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-cp1252.lisp deleted file mode 100644 index cae80d8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-cp1252.lisp +++ /dev/null @@ -1,81 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; enc-cp1252.lisp --- Implementation of the CP1252 character encoding. -;;; -;;; Copyright (C) 2011, Nicolas Martyanoff -;;; -;;; 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. - -(in-package #:babel-encodings) - -(define-character-encoding :cp1252 - "A 8-bit, fixed-width character encoding used by Windows for Western - European languages." - :aliases '(:windows-1252) - :literal-char-code-limit 256) - -(define-constant +cp1252-to-unicode+ - #(#x20ac nil #x201a #x0192 #x201e #x2026 #x2020 #x2021 - #x02c6 #x2030 #x0160 #x2039 #x0152 nil #x017d nil - nil #x2018 #x2019 #x201c #x201d #x2022 #x2013 #x2014 - #x02dc #x2122 #x0161 #x203a #x0153 nil #x017e #x0178) - :test #'equalp) - -(define-unibyte-decoder :cp1252 (octet) - (if (and (>= octet #x80) (<= octet #x9f)) - (svref +cp1252-to-unicode+ - (the ub8 (- octet #x80))) - octet)) - -(define-constant +unicode-0152-017e-cp1252+ - #(#x8c #x9c #x00 #x00 #x00 #x00 #x00 #x00 - #x00 #x00 #x00 #x00 #x00 #x00 #x8a #x9a - #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 - #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 - #x00 #x00 #x00 #x00 #x00 #x00 #x9f #x00 - #x00 #x00 #x00 #x8e #x9e) - :test #'equalp) - -(define-constant +unicode-2013-203a-cp1252+ - #(#x96 #x97 #x00 #x00 #x00 #x91 #x92 #x82 - #x00 #x93 #x94 #x84 #x00 #x86 #x87 #x95 - #x00 #x00 #x00 #x85 #x00 #x00 #x00 #x00 - #x00 #x00 #x00 #x00 #x00 #x89 #x00 #x00 - #x00 #x00 #x00 #x00 #x00 #x00 #x8b #x9b) - :test #'equalp) - -(define-unibyte-encoder :cp1252 (code) - (cond - ((or (< code #x80) - (and (> code #xa0) (<= code #xff))) - code) - ((and (>= code #x0152) (<= code #x017e)) - (svref +unicode-0152-017e-cp1252+ - (the ub8 (- code #x0152)))) - ((= code #x0192) #x83) - ((= code #x02c6) #x88) - ((= code #x02dc) #x89) - ((and (>= code #x2013) (<= code #x203a)) - (svref +unicode-2013-203a-cp1252+ - (the ub8 (- code #x2013)))) - ((= code #x20ac) #x80) - ((= code #x2122) #x99) - (t (handle-error)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ebcdic-int.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ebcdic-int.lisp deleted file mode 100644 index aa01572..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ebcdic-int.lisp +++ /dev/null @@ -1,49 +0,0 @@ -(in-package #:babel-encodings) - -(define-character-encoding :ebcdic-international - "An 8-bit, fixed-width character encoding from IBM.") - -(defparameter +ebcdic-int-to-unicode+ - #(0 1 2 3 156 9 134 127 151 141 142 11 12 13 14 15 16 17 18 19 157 133 8 135 - 24 25 146 143 28 29 30 31 128 129 130 65535 132 10 23 27 65535 65535 138 139 - 65535 5 6 7 65535 65535 22 65535 148 149 150 4 65535 65535 65535 155 20 21 - 65535 26 32 65535 65535 65535 65535 65535 65535 65535 65535 65535 91 46 60 - 40 43 33 38 65535 65535 65535 65535 65535 65535 65535 65535 65535 93 164 42 - 41 59 172 45 47 65535 65535 65535 65535 65535 65535 65535 65535 124 44 37 95 - 62 63 65535 65535 65535 65535 65535 65535 1102 1072 1073 96 58 35 64 39 61 - 34 1094 97 98 99 100 101 102 103 104 105 1076 1077 1092 1075 1093 1080 1081 - 106 107 108 109 110 111 112 113 114 1082 1083 1084 1085 1086 1087 1103 126 - 115 116 117 118 119 120 121 122 1088 1089 1090 1091 1078 1074 1100 1099 1079 - 1096 1101 1097 1095 1098 1070 1040 1041 1062 1044 1045 1060 1043 123 65 66 - 67 68 69 70 71 72 73 1061 1048 1049 1050 1051 1052 125 74 75 76 77 78 79 80 - 81 82 1053 1054 1055 1071 1056 1057 92 65535 83 84 85 86 87 88 89 90 1058 - 1059 1046 1042 1068 1067 48 49 50 51 52 53 54 55 56 57 1047 1064 1069 1065 - 1063 159)) - -(defparameter +unicode-upto-ac-ebcdic-int+ - #(0 1 2 3 55 45 46 47 22 5 37 11 12 13 14 15 16 17 18 19 60 61 50 38 24 25 63 - 39 28 29 30 31 64 79 127 123 0 108 80 125 77 93 92 78 107 96 75 97 240 241 - 242 243 244 245 246 247 248 249 122 94 76 126 110 111 124 193 194 195 196 - 197 198 199 200 201 209 210 211 212 213 214 215 216 217 226 227 228 229 230 - 231 232 233 74 224 90 0 109 121 129 130 131 132 133 134 135 136 137 145 146 - 147 148 149 150 151 152 153 162 163 164 165 166 167 168 169 192 106 208 161 - 7 32 33 34 0 36 21 6 23 0 0 42 43 0 9 10 27 0 0 26 0 52 53 54 8 0 0 0 59 4 - 20 0 255 0 0 0 0 91 0 0 0 0 0 0 0 95)) - -(defparameter +unicode-0410-0450-ebcdic-int+ - #(185 186 237 191 188 189 236 250 203 204 205 206 207 218 219 220 222 223 234 - 235 190 202 187 254 251 253 0 239 238 252 184 221 119 120 175 141 138 139 - 174 178 143 144 154 155 156 157 158 159 170 171 172 173 140 142 128 182 179 - 181 183 177 176 180 118 160)) - -(define-unibyte-decoder :ebcdic-international (octet) - (svref +ebcdic-int-to-unicode+ (the ub8 octet))) - -(define-unibyte-encoder :ebcdic-international (code) - (let ((result (cond - ((<= code 172) (svref +unicode-upto-ac-ebcdic-int+ code)) - ((<= #x0410 code #x0450) (svref +unicode-0410-0450-ebcdic-int+ - (- code #x0410)))))) - (prog1 result - (when (and (zerop result) (plusp code)) - (handle-error))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ebcdic.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ebcdic.lisp deleted file mode 100644 index 6977da4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ebcdic.lisp +++ /dev/null @@ -1,71 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; enc-ebcdic.lisp --- EBCDIC encodings. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package #:babel-encodings) - -(define-character-encoding :ebcdic-us - "An alleged character set used on IBM dinosaurs." - :aliases '(:ibm-037)) - -(define-constant +ebcdic-decode-table+ - (make-array - 256 :element-type 'ub8 :initial-contents - '(#x00 #x01 #x02 #x03 #x9c #x09 #x86 #x7f #x97 #x8d #x8e #x0b #x0c #x0d - #x0e #x0f #x10 #x11 #x12 #x13 #x9d #x85 #x08 #x87 #x18 #x19 #x92 #x8f - #x1c #x1d #x1e #x1f #x80 #x81 #x82 #x83 #x84 #x0a #x17 #x1b #x88 #x89 - #x8a #x8b #x8c #x05 #x06 #x07 #x90 #x91 #x16 #x93 #x94 #x95 #x96 #x04 - #x98 #x99 #x9a #x9b #x14 #x15 #x9e #x1a #x20 #xa0 #xe2 #xe4 #xe0 #xe1 - #xe3 #xe5 #xe7 #xf1 #xa2 #x2e #x3c #x28 #x2b #x7c #x26 #xe9 #xea #xeb - #xe8 #xed #xee #xef #xec #xdf #x21 #x24 #x2a #x29 #x3b #xac #x2d #x2f - #xc2 #xc4 #xc0 #xc1 #xc3 #xc5 #xc7 #xd1 #xa6 #x2c #x25 #x5f #x3e #x3f - #xf8 #xc9 #xca #xcb #xc8 #xcd #xce #xcf #xcc #x60 #x3a #x23 #x40 #x27 - #x3d #x22 #xd8 #x61 #x62 #x63 #x64 #x65 #x66 #x67 #x68 #x69 #xab #xbb - #xf0 #xfd #xfe #xb1 #xb0 #x6a #x6b #x6c #x6d #x6e #x6f #x70 #x71 #x72 - #xaa #xba #xe6 #xb8 #xc6 #xa4 #xb5 #x7e #x73 #x74 #x75 #x76 #x77 #x78 - #x79 #x7a #xa1 #xbf #xd0 #xdd #xde #xae #x5e #xa3 #xa5 #xb7 #xa9 #xa7 - #xb6 #xbc #xbd #xbe #x5b #x5d #xaf #xa8 #xb4 #xd7 #x7b #x41 #x42 #x43 - #x44 #x45 #x46 #x47 #x48 #x49 #xad #xf4 #xf6 #xf2 #xf3 #xf5 #x7d #x4a - #x4b #x4c #x4d #x4e #x4f #x50 #x51 #x52 #xb9 #xfb #xfc #xf9 #xfa #xff - #x5c #xf7 #x53 #x54 #x55 #x56 #x57 #x58 #x59 #x5a #xb2 #xd4 #xd6 #xd2 - #xd3 #xd5 #x30 #x31 #x32 #x33 #x34 #x35 #x36 #x37 #x38 #x39 #xb3 #xdb - #xdc #xd9 #xda #x9f)) - :test #'equalp) - -(define-constant +ebcdic-encode-table+ - (loop with rt = (make-array 256 :element-type 'ub8 :initial-element 0) - for code across +ebcdic-decode-table+ for i from 0 do - (assert (= 0 (aref rt code))) - (setf (aref rt code) i) - finally (return rt)) - :test #'equalp) - -(define-unibyte-encoder :ebcdic-us (code) - (if (>= code 256) - (handle-error) - (aref +ebcdic-encode-table+ code))) - -(define-unibyte-decoder :ebcdic-us (octet) - (aref +ebcdic-decode-table+ octet)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-gbk.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-gbk.lisp deleted file mode 100644 index 816f18c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-gbk.lisp +++ /dev/null @@ -1,184 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; enc-gbk.lisp --- GBK encodings. -;;; -;;; Copyright (C) 2011, Li Wenpeng -;;; -;;; 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. - -(in-package #:babel-encodings) - -;; populated in gbk-map.lisp -(defvar *gbk-unicode-mapping*) - -(defconstant +gbk2-offset+ 0) -(defconstant +gbk3-offset+ 6763) -(defconstant +gbk4-offset+ (+ 6763 6080)) -(defconstant +gbk1-offset+ 20902) -(defconstant +gbk5-offset+ (+ 20902 846)) - -(define-character-encoding :gbk - "GBK is an extension of the GB2312 character set for simplified -Chinese characters, used in the People's Republic of China." - :max-units-per-char 4 - :literal-char-code-limit #x80) - -(define-condition invalid-gbk-byte (character-decoding-error) - () - (:documentation "Signalled when an invalid GBK byte is found.")) - -(define-condition invalid-gbk-character (character-encoding-error) - () - (:documentation "Signalled when an invalid GBK character is found.")) - -(define-octet-counter :gbk (getter type) - `(lambda (seq start end max) - (declare (type ,type seq) (fixnum start end max)) - (let ((noctets 0)) - (loop for i from start below end - for u1 of-type code-point = (,getter seq i) - do (cond ((< u1 #x80) (incf noctets)) - (t (incf noctets 2))) - (when (and (plusp max) (= noctets max)) - (return (values noctets i))) - finally (return (values noctets i)))))) - -(define-code-point-counter :gbk (getter type) - `(lambda (seq start end max) - (declare (type ,type seq)) - (let (u1 (noctets 0)) - (loop with i = start - while (< i end) - do (setf u1 (,getter seq i)) - (cond - ((eq 0 (logand u1 #x80)) (incf i)) - (t (incf i 2))) - (incf noctets) - (when (and (plusp max) (= noctets max)) - (return (values noctets i))) - finally (return (values noctets i)))))) - -(define-encoder :gbk (getter src-type setter dest-type) - `(lambda (src start end dest d-start) - (declare (type ,src-type src) - (type ,dest-type dest) - (fixnum start end d-start)) - (macrolet - ((do-encoding (index) - `(let ((u1 0) (u2 0)) - (cond - ((<= +gbk2-offset+ ,index (- +gbk3-offset+ 1)) ; gbk/2 - (setf u1 (+ #xB0 (truncate (/ ,index 94)))) - (setf u2 (+ #xA1 (mod ,index 94)))) - ((<= +gbk3-offset+ ,index (- +gbk4-offset+ 1)) ; gbk/3 - (setf index (- ,index +gbk3-offset+)) - (setf u1 (+ #x81 (truncate (/ ,index 190)))) - (setf u2 (+ #x40 (mod ,index 190))) - (if (>= u2 #x7F) (incf u2))) - ((<= +gbk4-offset+ ,index (- +gbk1-offset+ 1)) ; gbk/4 - (setf index (- ,index +gbk4-offset+)) - (setf u1 (+ #xAA (truncate (/ ,index 96)))) - (setf u2 (+ #x40 (mod ,index 96))) - (if (>= u2 #x7F) (incf u2))) - ((<= +gbk1-offset+ ,index (- +gbk5-offset+ 1)) ; gbk/1 - (setf index (- ,index +gbk1-offset+)) - (setf u1 (+ #xA1 (truncate (/ ,index 94)))) - (setf u2 (+ #xA1 (mod ,index 94)))) - ((<= +gbk5-offset+ ,index (length *gbk-unicode-mapping*)) ; gbk/5 - (setf index (- ,index +gbk5-offset+)) - (setf u1 (+ #xA8 (truncate (/ ,index 96)))) - (setf u2 (+ #x40 (mod ,index 96))) - (if (>= u2 #x7F) (incf u2)))) - (values u1 u2)))) - (let ((c 0) index (noctets 0)) - (loop for i from start below end - for code of-type code-point = (,getter src i) - do (macrolet - ((handle-error (&optional (c 'character-encoding-error)) - `(encoding-error code :gbk src i +repl+ ',c))) - (setf c (code-char code)) - (cond - ((< code #x80) ; ascii - (,setter code dest noctets) - (incf noctets)) - (t ; gbk - (setf index - (position c *gbk-unicode-mapping*)) - - (if (not index) - (handle-error invalid-gbk-character)) - (multiple-value-bind (uh ul) (do-encoding index) - (,setter uh dest noctets) - (,setter ul dest (+ 1 noctets)) - (incf noctets 2))))) - finally (return (the fixnum (- noctets d-start)))))))) - -(define-decoder :gbk (getter src-type setter dest-type) - `(lambda (src start end dest d-start) - (declare (type ,src-type src) - (type ,dest-type dest)) - (let ((u1 0) (u2 0) (index 0) (tmp 0) (noctets 0)) - (loop with i = start - while (< i end) - do (macrolet - ((handle-error (&optional (c 'character-decoding-error)) - `(decoding-error #(u1 u2) :gbk src i +repl+ ',c))) - (setf u1 (,getter src i)) - (incf i) - (cond - ((eq 0 (logand u1 #x80)) - (,setter u1 dest noctets)) - (t - (setf u2 (,getter src i)) - (incf i) - (setf index - (block setter-block - (cond - ((and (<= #xB0 u1 #xF7) (<= #xA1 u2 #xFE)) - (+ +gbk2-offset+ (+ (* 94 (- u1 #xB0)) (- u2 #xA1)))) - - ((and (<= #x81 u1 #xA0) (<= #x40 u2 #xFE)) - (cond ((> u2 #x7F) (setf tmp 1)) - (t (setf tmp 0))) - (+ +gbk3-offset+ (* 190 (- u1 #x81)) (- u2 #x40 tmp))) - - ((and (<= #xAA u1 #xFE) (<= #x40 #xA0)) - (cond ((> u2 #x7F) (setf tmp 1)) - (t (setf tmp 0))) - (+ +gbk4-offset+ (* 96 (- u1 #xAA)) (- u2 #x40 tmp))) - - ((and (<= #xA1 u1 #xA9) (<= #xA1 u2 #xFE)) - (+ +gbk1-offset+ (* 94 (- u1 #xA1)) (- u2 #xA1))) - - ((and (<= #xA8 u1 #xA9) (<= #x40 #xA0)) - (cond ((> u2 #x7F) (setf tmp 1)) - (t (setf tmp 0))) - (+ +gbk5-offset+ (* 96 (- u1 #xA8)) (- u2 #x40 tmp))) - (t - (handle-error invalid-gbk-byte))))) - - (when (>= index (length *gbk-unicode-mapping*)) - (handle-error invalid-gbk-byte)) - (,setter (char-code - (elt *gbk-unicode-mapping* index)) - dest noctets))) - (incf noctets)) - finally (return (the fixnum (- noctets d-start))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-iso-8859.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-iso-8859.lisp deleted file mode 100644 index aeed673..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-iso-8859.lisp +++ /dev/null @@ -1,1087 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; enc-iso-8859.lisp --- ISO-8859-* encodings. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -;;; This implementation is largely based on OpenMCL's l1-unicode.lisp -;;; Copyright (C) 2006 Clozure Associates and contributors. - -(in-package #:babel-encodings) - -;;; Typically, ISO-8859-* codes in the range #x00-#x9f map straight -;;; through, while codes #xa0-#xff select arbitrary Unicode characters -;;; that are commonly used in some locale. (Sometimes the break is at -;;; #x80 instead of #xa0). -;;; -;;; (comment from OpenMCL's ccl/level-1/l1-unicode.lisp) - -(define-character-encoding :iso-8859-1 - "An 8-bit, fixed-width character encoding in which all -character codes map to their Unicode equivalents. Intended to -support most characters used in most Western European languages." - :aliases '(:latin-1 :latin1) - :literal-char-code-limit 256) - -(define-unibyte-encoder :iso-8859-1 (code) - (if (>= code 256) - (handle-error) - code)) - -(define-unibyte-decoder :iso-8859-1 (octet) - octet) - -(define-character-encoding :iso-8859-2 - "An 8-bit, fixed-width character encoding in which codes -#x00-#x9f map to their Unicode equivalents and other codes map to -other Unicode character values. Intended to provide most -characters found in most languages used in Central/Eastern -Europe." - :aliases '(:latin-2 :latin2) - :literal-char-code-limit #xa0) - -(define-constant +unicode-00a0-0180-to-iso-8859-2+ - #(#xa0 nil nil nil #xa4 nil nil #xa7 ; #xa0-#xa7 - #xa8 nil nil nil nil #xad nil nil ; #xa8-#xaf - #xb0 nil nil nil #xb4 nil nil nil ; #xb0-#xb7 - #xb8 nil nil nil nil nil nil nil ; #xb8-#xbf - nil #xc1 #xc2 nil #xc4 nil nil #xc7 ; #xc0-#xc7 - nil #xc9 nil #xcb nil #xcd #xce nil ; #xc8-#xcf - nil nil nil #xd3 #xd4 nil #xd6 #xd7 ; #xd0-#xd7 - nil nil #xda nil #xdc #xdd nil #xdf ; #xd8-#xdf - nil #xe1 #xe2 nil #xe4 nil nil #xe7 ; #xe0-#xe7 - nil #xe9 nil #xeb nil #xed #xee nil ; #xe8-#xef - nil nil nil #xf3 #xf4 nil #xf6 #xf7 ; #xf0-#xf7 - nil nil #xfa nil #xfc #xfd nil nil ; #xf8-#xff - ;; #x0100 - nil nil #xc3 #xe3 #xa1 #xb1 #xc6 #xe6 ; #x100-#x107 - nil nil nil nil #xc8 #xe8 #xcf #xef ; #x108-#x10f - #xd0 #xf0 nil nil nil nil nil nil ; #x110-#x117 - #xca #xea #xcc #xec nil nil nil nil ; #x118-#x11f - nil nil nil nil nil nil nil nil ; #x120-#x127 - nil nil nil nil nil nil nil nil ; #x128-#x12f - nil nil nil nil nil nil nil nil ; #x130-#x137 - nil #xc5 #xe5 nil nil #xa5 #xb5 nil ; #x138-#x13f - nil #xa3 #xb3 #xd1 #xf1 nil nil #xd2 ; #x140-#x147 - #xf2 nil nil nil nil nil nil nil ; #x148-#x14f - #xd5 #xf5 nil nil #xc0 #xe0 nil nil ; #x150-#x157 - #xd8 #xf8 #xa6 #xb6 nil nil #xaa #xba ; #x158-#x15f - #xa9 #xb9 #xde #xfe #xab #xbb nil nil ; #x160-#x167 - nil nil nil nil nil nil #xd9 #xf9 ; #x168-#x16f - #xdb #xfb nil nil nil nil nil nil ; #x170-#x177 - nil #xac #xbc #xaf #xbf #xae #xbe nil) ; #x178-#x17f - :test #'equalp) - -(define-constant +unicode-02c0-02e0-to-iso-8859-2+ - #(nil nil nil nil nil nil nil #xb7 ; #x2c0-#x2c7 - nil nil nil nil nil nil nil nil ; #x2c8-#x2cf - nil nil nil nil nil nil nil nil ; #x2d0-#x2d7 - #xa2 #xff nil #xb2 nil #xbd nil nil) ; #x2d8-#x2df - :test #'equalp) - -(define-unibyte-encoder :iso-8859-2 (code) - (or (cond ((< code #xa0) code) - ((< code #x180) - (svref +unicode-00a0-0180-to-iso-8859-2+ - (the ub8 (- code #xa0)))) - ((<= #x2c0 code #x2df) - (svref +unicode-02c0-02e0-to-iso-8859-2+ - (the ub8 (- code #x2c0))))) - (handle-error))) - -(define-constant +iso-8859-2-to-unicode+ - #(;; #xa0 - #x00a0 #x0104 #x02d8 #x0141 #x00a4 #x013d #x015a #x00a7 - #x00a8 #x0160 #x015e #x0164 #x0179 #x00ad #x017d #x017b - ;; #xb0 - #x00b0 #x0105 #x02db #x0142 #x00b4 #x013e #x015b #x02c7 - #x00b8 #x0161 #x015f #x0165 #x017a #x02dd #x017e #x017c - ;; #xc0 - #x0154 #x00c1 #x00c2 #x0102 #x00c4 #x0139 #x0106 #x00c7 - #x010c #x00c9 #x0118 #x00cb #x011a #x00cd #x00ce #x010e - ;; #xd0 - #x0110 #x0143 #x0147 #x00d3 #x00d4 #x0150 #x00d6 #x00d7 - #x0158 #x016e #x00da #x0170 #x00dc #x00dd #x0162 #x00df - ;; #xe0 - #x0155 #x00e1 #x00e2 #x0103 #x00e4 #x013a #x0107 #x00e7 - #x010d #x00e9 #x0119 #x00eb #x011b #x00ed #x00ee #x010f - ;; #xf0 - #x0111 #x0144 #x0148 #x00f3 #x00f4 #x0151 #x00f6 #x00f7 - #x0159 #x016f #x00fa #x0171 #x00fc #x00fd #x0163 #x02d9) - :test #'equalp) - -(define-unibyte-decoder :iso-8859-2 (octet) - (if (< octet #xa0) - octet - (svref +iso-8859-2-to-unicode+ (the ub8 (- octet #xa0))))) - -(define-character-encoding :iso-8859-3 - "An 8-bit, fixed-width character encoding in which codes -#x00-#x9f map to their Unicode equivalents and other codes map to -other Unicode character values. Intended to provide most -characters found in most languages used in Southern Europe." - :aliases '(:latin-3 :latin3) - :literal-char-code-limit #xa0) - -(define-constant +unicode-a0-100-to-iso-8859-3+ - #(#xa0 nil nil #xa3 #xa4 nil nil #xa7 ; #xa0-#xa7 - #xa8 nil nil nil nil #xad nil nil ; #xa8-#xaf - #xb0 nil #xb2 #xb3 #xb4 #xb5 nil #xb7 ; #xb0-#xb7 - #xb8 nil nil nil nil #xbd nil nil ; #xb8-#xbf - #xc0 #xc1 #xc2 nil #xc4 nil nil #xc7 ; #xc0-#xc7 - #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #xc8-#xcf - nil #xd1 #xd2 #xd3 #xd4 nil #xd6 #xd7 ; #xd0-#xd7 - nil #xd9 #xda #xdb #xdc nil nil #xdf ; #xd8-#xdf - #xe0 #xe1 #xe2 nil #xe4 nil nil #xe7 ; #xe0-#xe7 - #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #xe8-#xef - nil #xf1 #xf2 #xf3 #xf4 nil #xf6 #xf7 ; #xf0-#xf7 - nil #xf9 #xfa #xfb #xfc nil nil nil) ; #xf8-#xff - :test #'equalp) - -(define-constant +unicode-108-180-to-iso-8859-3+ - #(#xc6 #xe6 #xc5 #xe5 #x00 #x00 #x00 #x00 ; #x108-#x10f - nil nil nil nil nil nil nil nil ; #x110-#x117 - nil nil nil nil #xd8 #xf8 #xab #xbb ; #x118-#x11f - #xd5 #xf5 nil nil #xa6 #xb6 #xa1 #xb1 ; #x120-#x127 - nil nil nil nil nil nil nil nil ; #x128-#x12f - #xa9 #xb9 nil nil #xac #xbc nil nil ; #x130-#x137 - nil nil nil nil nil nil nil nil ; #x138-#x13f - nil nil nil nil nil nil nil nil ; #x140-#x147 - nil nil nil nil nil nil nil nil ; #x148-#x14f - nil nil nil nil nil nil nil nil ; #x150-#x157 - nil nil nil nil #xde #xfe #xaa #xba ; #x158-#x15f - nil nil nil nil nil nil nil nil ; #x160-#x167 - nil nil nil nil #xdd #xfd nil nil ; #x168-#x16f - nil nil nil nil nil nil nil nil ; #x170-#x177 - nil nil nil #xaf #xbf nil nil nil) ; #x178-#x17f - :test #'equalp) - -(define-constant +unicode-2d8-2e0-to-iso-8859-3+ - #(#xa2 #xff nil nil nil nil nil nil) ; #x2d8-#x2df - :test #'equalp) - -(define-unibyte-encoder :iso-8859-3 (code) - (or (cond ((< code #xa0) code) - ((< code #x100) - (svref +unicode-a0-100-to-iso-8859-3+ - (the ub8 (- code #xa0)))) - ((<= #x108 code #x17f) - (svref +unicode-108-180-to-iso-8859-3+ - (the ub8 (- code #x108)))) - ((<= #x2d8 code #x2df) - (svref +unicode-2d8-2e0-to-iso-8859-3+ - (the ub8 (- code #x2d8))))) - (handle-error))) - -(define-constant +iso-8859-3-to-unicode+ - #(;; #xa0 - #x00a0 #x0126 #x02d8 #x00a3 #x00a4 #xfffd #x0124 #x00a7 - #x00a8 #x0130 #x015e #x011e #x0134 #x00ad #xfffd #x017b - ;; #xb0 - #x00b0 #x0127 #x00b2 #x00b3 #x00b4 #x00b5 #x0125 #x00b7 - #x00b8 #x0131 #x015f #x011f #x0135 #x00bd #xfffd #x017c - ;; #xc0 - #x00c0 #x00c1 #x00c2 #xfffd #x00c4 #x010a #x0108 #x00c7 - #x00c8 #x00c9 #x00ca #x00cb #x00cc #x00cd #x00ce #x00cf - ;; #xd0 - #xfffd #x00d1 #x00d2 #x00d3 #x00d4 #x0120 #x00d6 #x00d7 - #x011c #x00d9 #x00da #x00db #x00dc #x016c #x015c #x00df - ;; #xe0 - #x00e0 #x00e1 #x00e2 #xfffd #x00e4 #x010b #x0109 #x00e7 - #x00e8 #x00e9 #x00ea #x00eb #x00ec #x00ed #x00ee #x00ef - ;; #xf0 - #xfffd #x00f1 #x00f2 #x00f3 #x00f4 #x0121 #x00f6 #x00f7 - #x011d #x00f9 #x00fa #x00fb #x00fc #x016d #x015d #x02d9) - :test #'equalp) - -(define-unibyte-decoder :iso-8859-3 (octet) - (if (< octet #xa0) - octet - (svref +iso-8859-3-to-unicode+ (the ub8 (- octet #xa0))))) - -(define-character-encoding :iso-8859-4 - "An 8-bit, fixed-width character encoding in which codes -#x00-#x9f map to their Unicode equivalents and other codes map to -other Unicode character values. Intended to provide most -characters found in most languages used in Northern Europe." - :aliases '(:latin-4 :latin4) - :literal-char-code-limit #xa0) - -(define-constant +unicode-a0-180-to-iso-8859-4+ - #(#xa0 nil nil nil #xa4 nil nil #xa7 ; #xa0-#xa7 - #xa8 nil nil nil nil #xad nil #xaf ; #xa8-#xaf - #xb0 nil nil nil #xb4 nil nil nil ; #xb0-#xb7 - #xb8 nil nil nil nil nil nil nil ; #xb8-#xbf - nil #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 nil ; #xc0-#xc7 - nil #xc9 nil #xcb nil #xcd #xce nil ; #xc8-#xcf - nil nil nil nil #xd4 #xd5 #xd6 #xd7 ; #xd0-#xd7 - #xd8 nil #xda #xdb #xdc nil nil #xdf ; #xd8-#xdf - nil #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 nil ; #xe0-#xe7 - nil #xe9 nil #xeb nil #xed #xee nil ; #xe8-#xef - nil nil nil nil #xf4 #xf5 #xf6 #xf7 ; #xf0-#xf7 - #xf8 nil #xfa #xfb #xfc nil nil nil ; #xf8-#xff - #xc0 #xe0 nil nil #xa1 #xb1 nil nil ; #x100-#x107 - nil nil nil nil #xc8 #xe8 nil nil ; #x108-#x10f - #xd0 #xf0 #xaa #xba nil nil #xcc #xec ; #x110-#x117 - #xca #xea nil nil nil nil nil nil ; #x118-#x11f - nil nil #xab #xbb nil nil nil nil ; #x120-#x127 - #xa5 #xb5 #xcf #xef nil nil #xc7 #xe7 ; #x128-#x12f - nil nil nil nil nil nil #xd3 #xf3 ; #x130-#x137 - #xa2 nil nil #xa6 #xb6 nil nil nil ; #x138-#x13f - nil nil nil nil nil #xd1 #xf1 nil ; #x140-#x147 - nil nil #xbd #xbf #xd2 #xf2 nil nil ; #x148-#x14f - nil nil nil nil nil nil #xa3 #xb3 ; #x150-#x157 - nil nil nil nil nil nil nil nil ; #x158-#x15f - #xa9 #xb9 nil nil nil nil #xac #xbc ; #x160-#x167 - #xdd #xfd #xde #xfe nil nil nil nil ; #x168-#x16f - nil nil #xd9 #xf9 nil nil nil nil ; #x170-#x177 - nil nil nil nil nil #xae #xbe nil) ; #x178-#x17f - :test #'equalp) - -(define-constant +unicode-2c0-2e0-to-iso-8859-4+ - #(nil nil nil nil nil nil nil #xb7 ; #x2c0-#x2c7 - nil nil nil nil nil nil nil nil ; #x2c8-#x2cf - nil nil nil nil nil nil nil nil ; #x2d0-#x2d7 - nil #xff nil #xb2 nil nil nil nil) ; #x2d8-#x2df - :test #'equalp) - -(define-unibyte-encoder :iso-8859-4 (code) - (or (cond ((< code #xa0) code) - ((< code #x180) - (svref +unicode-a0-180-to-iso-8859-4+ - (the ub8 (- code #xa0)))) - ((<= #x2c0 code #x2df) - (svref +unicode-2c0-2e0-to-iso-8859-4+ - (the ub8 (- code #x2c0))))) - (handle-error))) - -(define-constant +iso-8859-4-to-unicode+ - #(;; #xa0 - #x00a0 #x0104 #x0138 #x0156 #x00a4 #x0128 #x013b #x00a7 - #x00a8 #x0160 #x0112 #x0122 #x0166 #x00ad #x017d #x00af - ;; #xb0 - #x00b0 #x0105 #x02db #x0157 #x00b4 #x0129 #x013c #x02c7 - #x00b8 #x0161 #x0113 #x0123 #x0167 #x014a #x017e #x014b - ;; #xc0 - #x0100 #x00c1 #x00c2 #x00c3 #x00c4 #x00c5 #x00c6 #x012e - #x010c #x00c9 #x0118 #x00cb #x0116 #x00cd #x00ce #x012a - ;; #xd0 - #x0110 #x0145 #x014c #x0136 #x00d4 #x00d5 #x00d6 #x00d7 - #x00d8 #x0172 #x00da #x00db #x00dc #x0168 #x016a #x00df - ;; #xe0 - #x0101 #x00e1 #x00e2 #x00e3 #x00e4 #x00e5 #x00e6 #x012f - #x010d #x00e9 #x0119 #x00eb #x0117 #x00ed #x00ee #x012b - ;; #xf0 - #x0111 #x0146 #x014d #x0137 #x00f4 #x00f5 #x00f6 #x00f7 - #x00f8 #x0173 #x00fa #x00fb #x00fc #x0169 #x016b #x02d9) - :test #'equalp) - -(define-unibyte-decoder :iso-8859-4 (octet) - (if (< octet #xa0) - octet - (svref +iso-8859-4-to-unicode+ (the ub8 (- octet #xa0))))) - -(define-character-encoding :iso-8859-5 - "An 8-bit, fixed-width character encoding in which codes -#x00-#x9f map to their Unicode equivalents and other codes map to -other Unicode character values. Intended to provide most -characters found in the Cyrillic alphabet." - :aliases '(:cyrillic) - :literal-char-code-limit #xa0) - -(define-constant +unicode-a0-b0-to-iso-8859-5+ - #(#xa0 nil nil nil nil nil nil #xfd ; #xa0-#xa7 - nil nil nil nil nil #xad nil nil) ; #xa8-#xaf - :test #'equalp) - -(define-constant +unicode-400-460-to-iso-8859-5+ - #(nil #xa1 #xa2 #xa3 #xa4 #xa5 #xa6 #xa7 ; #x400-#x407 - #xa8 #xa9 #xaa #xab #xac nil #xae #xaf ; #x408-#x40f - #xb0 #xb1 #xb2 #xb3 #xb4 #xb5 #xb6 #xb7 ; #x410-#x417 - #xb8 #xb9 #xba #xbb #xbc #xbd #xbe #xbf ; #x418-#x41f - #xc0 #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 #xc7 ; #x420-#x427 - #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #x428-#x42f - #xd0 #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 #xd7 ; #x430-#x437 - #xd8 #xd9 #xda #xdb #xdc #xdd #xde #xdf ; #x438-#x43f - #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #x440-#x447 - #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #x448-#x44f - nil #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 #xf7 ; #x450-#x457 - #xf8 #xf9 #xfa #xfb #xfc nil #xfe #xff) ; #x458-#x45f - :test #'equalp) - -(define-unibyte-encoder :iso-8859-5 (code) - (or (cond ((< code #xa0) code) - ((< code #xb0) - (svref +unicode-a0-b0-to-iso-8859-5+ - (the ub8 (- code #xa0)))) - ((<= #x400 code #x45f) - (svref +unicode-400-460-to-iso-8859-5+ - (the ub8 (- code #x400)))) - ;; the Numero sign - ((= code #x2116) #xf0)) - (handle-error))) - -(define-constant +iso-8859-5-to-unicode+ - #(;; #xa0 - #x00a0 #x0401 #x0402 #x0403 #x0404 #x0405 #x0406 #x0407 - #x0408 #x0409 #x040a #x040b #x040c #x00ad #x040e #x040f - ;; #xb0 - #x0410 #x0411 #x0412 #x0413 #x0414 #x0415 #x0416 #x0417 - #x0418 #x0419 #x041a #x041b #x041c #x041d #x041e #x041f - ;; #xc0 - #x0420 #x0421 #x0422 #x0423 #x0424 #x0425 #x0426 #x0427 - #x0428 #x0429 #x042a #x042b #x042c #x042d #x042e #x042f - ;; #xd0 - #x0430 #x0431 #x0432 #x0433 #x0434 #x0435 #x0436 #x0437 - #x0438 #x0439 #x043a #x043b #x043c #x043d #x043e #x043f - ;; #xe0 - #x0440 #x0441 #x0442 #x0443 #x0444 #x0445 #x0446 #x0447 - #x0448 #x0449 #x044a #x044b #x044c #x044d #x044e #x044f - ;; #xf0 - #x2116 #x0451 #x0452 #x0453 #x0454 #x0455 #x0456 #x0457 - #x0458 #x0459 #x045a #x045b #x045c #x00a7 #x045e #x045f) - :test #'equalp) - -(define-unibyte-decoder :iso-8859-5 (octet) - (if (< octet #xa0) - octet - (svref +iso-8859-5-to-unicode+ (the ub8 (- octet #xa0))))) - -(define-character-encoding :iso-8859-6 - "An 8-bit, fixed-width character encoding in which codes #x00-#x9f -map to their Unicode equivalents and other codes map to other Unicode -character values. Intended to provide most characters found in the -Arabic alphabet." - :aliases '(:arabic) - :literal-char-code-limit #xa0) - -(define-constant +unicode-a0-b0-to-iso-8859-6+ - #(#xa0 nil nil nil #xa4 nil nil nil ; #xa0-#xa7 - nil nil nil nil nil #xad nil nil) ; #xa8-#xaf - :test #'equalp) - -(define-constant +unicode-608-658-to-iso-8859-6+ - #(nil nil nil nil #xac nil nil nil ; #x608-#x60f - nil nil nil nil nil nil nil nil ; #x610-#x617 - nil nil nil #xbb nil nil nil #xbf ; #x618-#x61f - nil #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 #xc7 ; #x620-#x627 - #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #x628-#x62f - #xd0 #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 #xd7 ; #x630-#x637 - #xd8 #xd9 #xda nil nil nil nil nil ; #x638-#x63f - #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #x640-#x647 - #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #x648-#x64f - #xf0 #xf1 #xf2 nil nil nil nil nil) ; #x650-#x657 - :test #'equalp) - -(define-unibyte-encoder :iso-8859-6 (code) - (or (cond ((< code #xa0) code) - ((< code #xb0) - (svref +unicode-a0-b0-to-iso-8859-6+ - (the ub8 (- code #xa0)))) - ((<= #x608 code #x657) - (svref +unicode-608-658-to-iso-8859-6+ - (the ub8 (- code #x608))))) - (handle-error))) - -(define-constant +iso-8859-6-to-unicode+ - #(;; #xa0 - #x00a0 #xfffd #xfffd #xfffd #x00a4 #xfffd #xfffd #xfffd - #xfffd #xfffd #xfffd #xfffd #x060c #x00ad #xfffd #xfffd - ;; #xb0 - #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd - #xfffd #xfffd #xfffd #x061b #xfffd #xfffd #xfffd #x061f - ;; #xc0 - #xfffd #x0621 #x0622 #x0623 #x0624 #x0625 #x0626 #x0627 - #x0628 #x0629 #x062a #x062b #x062c #x062d #x062e #x062f - ;; #xd0 - #x0630 #x0631 #x0632 #x0633 #x0634 #x0635 #x0636 #x0637 - #x0638 #x0639 #x063a #xfffd #xfffd #xfffd #xfffd #xfffd - ;; #xe0 - #x0640 #x0641 #x0642 #x0643 #x0644 #x0645 #x0646 #x0647 - #x0648 #x0649 #x064a #x064b #x064c #x064d #x064e #x064f - ;; #xf0 - #x0650 #x0651 #x0652 #xfffd #xfffd #xfffd #xfffd #xfffd - #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd) - :test #'equalp) - -(define-unibyte-decoder :iso-8859-6 (octet) - (if (< octet #xa0) - octet - (svref +iso-8859-6-to-unicode+ (the ub8 (- octet #xa0))))) - -(define-character-encoding :iso-8859-7 - "An 8-bit, fixed-width character encoding in which codes -#x00-#x9f map to their Unicode equivalents and other codes map to -other Unicode character values. Intended to provide most -characters found in the Greek alphabet." - :aliases '(:greek) - :literal-char-code-limit #xa0) - -(define-constant +unicode-a0-c0-to-iso-8859-7+ - #(#xa0 nil nil #xa3 nil nil #xa6 #xa7 ; #xa0-#xa7 - #xa8 #xa9 nil #xab #xac #xad nil nil ; #xa8-#xaf - #xb0 #xb1 #xb2 #xb3 nil nil nil #xb7 ; #xb0-#xb7 - nil nil nil #xbb nil #xbd nil nil) ; #xb8-#xbf - :test #'equalp) - -(define-constant +unicode-378-3d0-to-iso-8859-7+ - #(nil nil #xaa nil nil nil nil nil ; #x378-#x37f - nil nil nil nil #xb4 #xb5 #xb6 nil ; #x380-#x387 - #xb8 #xb9 #xba nil #xbc nil #xbe #xbf ; #x388-#x38f - #xc0 #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 #xc7 ; #x390-#x397 - #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #x398-#x39f - #xd0 #xd1 nil #xd3 #xd4 #xd5 #xd6 #xd7 ; #x3a0-#x3a7 - #xd8 #xd9 #xda #xdb #xdc #xdd #xde #xdf ; #x3a8-#x3af - #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #x3b0-#x3b7 - #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #x3b8-#x3bf - #xf0 #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 #xf7 ; #x3c0-#x3c7 - #xf8 #xf9 #xfa #xfb #xfc #xfd #xfe nil) ; #x3c8-#x3cf - :test #'equalp) - -(define-constant +unicode-2010-2020-to-iso-8859-7+ - #(nil nil nil nil nil #xaf nil nil ; #x2010-#x2017 - #xa1 #xa2 nil nil nil nil nil nil) ; #x2018-#x201f - :test #'equalp) - -(define-constant +unicode-20ac-20b0-to-iso-8859-7+ - #(#xa4 nil nil #xa5) - :test #'equalp) - -(define-unibyte-encoder :iso-8859-7 (code) - (or (cond ((< code #xa0) code) - ((< code #xc0) - (svref +unicode-a0-c0-to-iso-8859-7+ - (the ub8 (- code #xa0)))) - ((<= #x378 code #x3cf) - (svref +unicode-378-3d0-to-iso-8859-7+ - (the ub8 (- code #x378)))) - ((<= #x2010 code #x201f) - (svref +unicode-2010-2020-to-iso-8859-7+ - (the ub8 (- code #x2010)))) - ((<= #x201c code #x20af) - (svref +unicode-20ac-20b0-to-iso-8859-7+ - (the ub8 (- code #x20ac))))) - (handle-error))) - -(define-constant +iso-8859-7-to-unicode+ - #(;; #xa0 - #x00a0 #x2018 #x2019 #x00a3 #x20ac #x20af #x00a6 #x00a7 - #x00a8 #x00a9 #x037a #x00ab #x00ac #x00ad #xfffd #x2015 - ;; #xb0 - #x00b0 #x00b1 #x00b2 #x00b3 #x0384 #x0385 #x0386 #x00b7 - #x0388 #x0389 #x038a #x00bb #x038c #x00bd #x038e #x038f - ;; #xc0 - #x0390 #x0391 #x0392 #x0393 #x0394 #x0395 #x0396 #x0397 - #x0398 #x0399 #x039a #x039b #x039c #x039d #x039e #x039f - ;; #xd0 - #x03a0 #x03a1 #xfffd #x03a3 #x03a4 #x03a5 #x03a6 #x03a7 - #x03a8 #x03a9 #x03aa #x03ab #x03ac #x03ad #x03ae #x03af - ;; #xe0 - #x03b0 #x03b1 #x03b2 #x03b3 #x03b4 #x03b5 #x03b6 #x03b7 - #x03b8 #x03b9 #x03ba #x03bb #x03bc #x03bd #x03be #x03bf - ;; #xf0 - #x03c0 #x03c1 #x03c2 #x03c3 #x03c4 #x03c5 #x03c6 #x03c7 - #x03c8 #x03c9 #x03ca #x03cb #x03cc #x03cd #x03ce #xfffd) - :test #'equalp) - -(define-unibyte-decoder :iso-8859-7 (octet) - (if (< octet #xa0) - octet - (svref +iso-8859-7-to-unicode+ (the ub8 (- octet #xa0))))) - -(define-character-encoding :iso-8859-8 - "An 8-bit, fixed-width character encoding in which codes #x00-#x9f -map to their Unicode equivalents and other codes map to other Unicode -character values. Intended to provide most characters found in the -Hebrew alphabet." - :aliases '(:hebrew) - :literal-char-code-limit #xa0) - -(define-constant +unicode-a0-f8-to-iso-8859-8+ - #(#xa0 nil #xa2 #xa3 #xa4 #xa5 #xa6 #xa7 ; #xa0-#xa7 - #xa8 #xa9 nil #xab #xac #xad #xae #xaf ; #xa8-#xaf - #xb0 #xb1 #xb2 #xb3 #xb4 #xb5 #xb6 #xb7 ; #xb0-#xb7 - #xb8 #xb9 nil #xbb #xbc #xbd #xbe nil ; #xb8-#xbf - nil nil nil nil nil nil nil nil ; #xc0-#xc7 - nil nil nil nil nil nil nil nil ; #xc8-#xcf - nil nil nil nil nil nil nil #xaa ; #xd0-#xd7 - nil nil nil nil nil nil nil nil ; #xd8-#xdf - nil nil nil nil nil nil nil nil ; #xe0-#xe7 - nil nil nil nil nil nil nil nil ; #xe8-#xef - nil nil nil nil nil nil nil #xba) ; #xf0-#xf7 - :test #'equalp) - -(define-constant +unicode-5d0-5f0-to-iso-8859-8+ - #(#xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #x5d0-#x5d7 - #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #x5d8-#x5df - #xf0 #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 #xf7 ; #x5e0-#x5e7 - #xf8 #xf9 #xfa nil nil nil nil nil) ; #x5e8-#x5ef - :test #'equalp) - -(define-constant +unicode-2008-2018-to-iso-8859-8+ - #(nil nil nil nil nil nil #xfd #xfe ; #x2008-#x200f - nil nil nil nil nil nil nil #xdf) ; #x2010-#x2017 - :test #'equalp) - -(define-unibyte-encoder :iso-8859-8 (code) - (or (cond ((< code #xa0) code) - ((< code #xf8) - (svref +unicode-a0-f8-to-iso-8859-8+ - (the ub8 (- code #xa0)))) - ((<= #x5d0 code #x5ef) - (svref +unicode-5d0-5f0-to-iso-8859-8+ - (the ub8 (- code #x5d0)))) - ((<= #x2008 code #x201f) - (svref +unicode-2008-2018-to-iso-8859-8+ - (the ub8 (- code #x2008))))) - (handle-error))) - -(define-constant +iso-8859-8-to-unicode+ - #(;; #xa0 - #x00a0 #xfffd #x00a2 #x00a3 #x00a4 #x00a5 #x00a6 #x00a7 - #x00a8 #x00a9 #x00d7 #x00ab #x00ac #x00ad #x00ae #x00af - ;; #xb0 - #x00b0 #x00b1 #x00b2 #x00b3 #x00b4 #x00b5 #x00b6 #x00b7 - #x00b8 #x00b9 #x00f7 #x00bb #x00bc #x00bd #x00be #xfffd - ;; #xc0 - #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd - #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd - ;; #xd0 - #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd - #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #x2017 - ;; #xe0 - #x05d0 #x05d1 #x05d2 #x05d3 #x05d4 #x05d5 #x05d6 #x05d7 - #x05d8 #x05d9 #x05da #x05db #x05dc #x05dd #x05de #x05df - ;; #xf0 - #x05e0 #x05e1 #x05e2 #x05e3 #x05e4 #x05e5 #x05e6 #x05e7 - #x05e8 #x05e9 #x05ea #xfffd #xfffd #x200e #x200f #xfffd) - :test #'equalp) - -(define-unibyte-decoder :iso-8859-8 (octet) - (if (< octet #xa0) - octet - (svref +iso-8859-8-to-unicode+ (the ub8 (- octet #xa0))))) - -(define-character-encoding :iso-8859-9 - "An 8-bit, fixed-width character encoding in which codes -#x00-#xcf map to their Unicode equivalents and other codes map to -other Unicode character values. Intended to provide most -characters found in the Turkish alphabet." - :aliases '(:latin-5 :latin5) - :decode-literal-code-unit-limit #xd0 - :encode-literal-code-unit-limit #xa0) - -(define-constant +unicode-d0-100-to-iso-8859-9+ - #(nil #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 #xd7 ; #xd0-#xd7 - #xd8 #xd9 #xda #xdb #xdc nil nil #xdf ; #xd8-#xdf - #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #xe0-#xe7 - #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #xe8-#xef - nil #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 #xf7 ; #xf0-#xf7 - #xf8 #xf9 #xfa #xfb #xfc nil nil #xff) ; #xf8-#xff - :test #'equalp) - -(define-constant +unicode-118-160-to-iso-8859-9+ - #(nil nil nil nil nil nil #xd0 #xf0 ; #x118-#x11f - nil nil nil nil nil nil nil nil ; #x120-#x127 - nil nil nil nil nil nil nil nil ; #x128-#x12f - #xdd #xfd nil nil nil nil nil nil ; #x130-#x137 - nil nil nil nil nil nil nil nil ; #x138-#x13f - nil nil nil nil nil nil nil nil ; #x140-#x147 - nil nil nil nil nil nil nil nil ; #x148-#x14f - nil nil nil nil nil nil nil nil ; #x150-#x157 - nil nil nil nil nil nil #xde #xfe) ; #x158-#x15f - :test #'equalp) - -(define-unibyte-encoder :iso-8859-9 (code) - (or (cond ((< code #xd0) code) - ((< code #x100) - (svref +unicode-d0-100-to-iso-8859-9+ - (the ub8 (- code #xd0)))) - ((<= #x118 code #x15f) - (svref +unicode-118-160-to-iso-8859-9+ - (the ub8 (- code #x118))))) - (handle-error))) - -(define-constant +iso-8859-9-to-unicode+ - #(;; #xd0 - #x011e #x00d1 #x00d2 #x00d3 #x00d4 #x00d5 #x00d6 #x00d7 - #x00d8 #x00d9 #x00da #x00db #x00dc #x0130 #x015e #x00df - ;; #xe0 - #x00e0 #x00e1 #x00e2 #x00e3 #x00e4 #x00e5 #x00e6 #x00e7 - #x00e8 #x00e9 #x00ea #x00eb #x00ec #x00ed #x00ee #x00ef - ;; #xf0 - #x011f #x00f1 #x00f2 #x00f3 #x00f4 #x00f5 #x00f6 #x00f7 - #x00f8 #x00f9 #x00fa #x00fb #x00fc #x0131 #x015f #x00ff) - :test #'equalp) - -(define-unibyte-decoder :iso-8859-9 (octet) - (if (< octet #xd0) - octet - (svref +iso-8859-9-to-unicode+ (the ub8 (- octet #xd0))))) - -(define-character-encoding :iso-8859-10 - "An 8-bit, fixed-width character encoding in which codes -#x00-#x9f map to their Unicode equivalents and other codes map to -other Unicode character values. Intended to provide most -characters found in Nordic alphabets." - :aliases '(:latin-6 :latin6) - :literal-char-code-limit #xa0) - -(define-constant +unicode-a0-180-to-iso-8859-10+ - #(#xa0 nil nil nil nil nil nil #xa7 ; #xa0-#xa7 - nil nil nil nil nil #xad nil nil ; #xa8-#xaf - #xb0 nil nil nil nil nil nil #xb7 ; #xb0-#xb7 - nil nil nil nil nil #x2015 nil nil ; #xb8-#xbf - nil #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 nil ; #xc0-#xc7 - nil #xc9 nil #xcb nil #xcd #xce #xcf ; #xc8-#xcf - #xd0 nil nil #xd3 #xd4 #xd5 #xd6 nil ; #xd0-#xd7 - #xd8 nil #xda #xdb #xdc #xdd #xde #xdf ; #xd8-#xdf - nil #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 nil ; #xe0-#xe7 - nil #xe9 nil #xeb nil #xed #xee #xef ; #xe8-#xef - #xf0 nil nil #xf3 #xf4 #xf5 #xf6 nil ; #xf0-#xf7 - #xf8 nil #xfa #xfb #xfc #xfd #xfe nil ; #xf8-#xff - #xc0 #xe0 nil nil #xa1 #xb1 nil nil ; #x100-#x107 - nil nil nil nil #xc8 #xe8 nil nil ; #x108-#x10f - #xa9 #xb9 #xa2 #xb2 nil nil #xcc #xec ; #x110-#x117 - #xca #xea nil nil nil nil nil nil ; #x118-#x11f - nil nil #xa3 #xb3 nil nil nil nil ; #x120-#x127 - #xa5 #xb5 #xa4 #xb4 nil nil #xc7 #xe7 ; #x128-#x12f - nil nil nil nil nil nil #xa6 #xb6 ; #x130-#x137 - #xff nil nil #xa8 #xb8 nil nil nil ; #x138-#x13f - nil nil nil nil nil #xd1 #xf1 nil ; #x140-#x147 - nil nil #xaf #xbf #xd2 #xf2 nil nil ; #x148-#x14f - nil nil nil nil nil nil nil nil ; #x150-#x157 - nil nil nil nil nil nil nil nil ; #x158-#x15f - #xaa #xba nil nil nil nil #xab #xbb ; #x160-#x167 - #xd7 #xf7 #xae #xbe nil nil nil nil ; #x168-#x16f - nil nil #xd9 #xf9 nil nil nil nil ; #x170-#x177 - nil nil nil nil nil #xac #xbc nil) ; #x178-#x17f - :test #'equalp) - -(define-unibyte-encoder :iso-8859-10 (code) - (or (cond ((< code #xa0) code) - ((< code #x180) - (svref +unicode-a0-180-to-iso-8859-10+ - (the ub8 (- code #xa0)))) - ;; Horizontal bar - ((= code #x2015) #xbd)) - (handle-error))) - -(define-constant +iso-8859-10-to-unicode+ - #(;; #xa0 - #x00a0 #x0104 #x0112 #x0122 #x012a #x0128 #x0136 #x00a7 - #x013b #x0110 #x0160 #x0166 #x017d #x00ad #x016a #x014a - ;; #xb0 - #x00b0 #x0105 #x0113 #x0123 #x012b #x0129 #x0137 #x00b7 - #x013c #x0111 #x0161 #x0167 #x017e #x2015 #x016b #x014b - ;; #xc0 - #x0100 #x00c1 #x00c2 #x00c3 #x00c4 #x00c5 #x00c6 #x012e - #x010c #x00c9 #x0118 #x00cb #x0116 #x00cd #x00ce #x00cf - ;; #xd0 - #x00d0 #x0145 #x014c #x00d3 #x00d4 #x00d5 #x00d6 #x0168 - #x00d8 #x0172 #x00da #x00db #x00dc #x00dd #x00de #x00df - ;; #xe0 - #x0101 #x00e1 #x00e2 #x00e3 #x00e4 #x00e5 #x00e6 #x012f - #x010d #x00e9 #x0119 #x00eb #x0117 #x00ed #x00ee #x00ef - ;; #xf0 - #x00f0 #x0146 #x014d #x00f3 #x00f4 #x00f5 #x00f6 #x0169 - #x00f8 #x0173 #x00fa #x00fb #x00fc #x00fd #x00fe #x0138) - :test #'equalp) - -(define-unibyte-decoder :iso-8859-10 (octet) - (if (< octet #xa0) - octet - (svref +iso-8859-10-to-unicode+ (the ub8 (- octet #xa0))))) - -(define-character-encoding :iso-8859-11 - "An 8-bit, fixed-width character encoding in which codes -#x00-#x9f map to their Unicode equivalents and other codes map to -other Unicode character values. Intended to provide most -characters found the Thai alphabet." - :aliases '() - :literal-char-code-limit #xa0) - -(define-unibyte-encoder :iso-8859-11 (code) - (cond ((< code #xa1) code) - ((and (<= #xe01 code #xe5b) - (not (<= #xe3b code #xe3e)) - (not (<= #xe5c code #xe5f))) - (- code #xd60)) - (t (handle-error)))) - -(define-unibyte-decoder :iso-8859-11 (octet) - (cond ((<= octet #xa0) octet) - ((or (<= #xdb octet #xde) - (<= #xfc octet #xff)) - #xfffd) - ((<= octet #xfb) - (+ octet #x0d60)) - (t (handle-error)))) - -;;; There is no iso-8859-12 encoding. - -(define-character-encoding :iso-8859-13 - "An 8-bit, fixed-width character encoding in which codes -#x00-#x9f map to their Unicode equivalents and other codes map to -other Unicode character values. Intended to provide most -characters found in Baltic alphabets." - :aliases '() - :literal-char-code-limit #xa0) - -(define-constant +unicode-a0-180-to-iso-8859-13+ - #(#xa0 nil #xa2 #xa3 #xa4 nil #xa6 #xa7 ; #xa0-#xa7 - nil #xa9 nil #xab #xac #xad #xae nil ; #xa8-#xaf - #xb0 #xb1 #xb2 #xb3 nil #xb5 #xb6 #xb7 ; #xb0-#xb7 - nil #xb9 nil #xbb #xbc #xbd #xbe nil ; #xb8-#xbf - nil nil nil nil #xc4 #xc5 #xaf nil ; #xc0-#xc7 - nil #xc9 nil nil nil nil nil nil ; #xc8-#xcf - nil nil nil #xd3 nil #xd5 #xd6 #xd7 ; #xd0-#xd7 - #xa8 nil nil nil #xdc nil nil #xdf ; #xd8-#xdf - nil nil nil nil #xe4 #xe5 #xbf nil ; #xe0-#xe7 - nil #xe9 nil nil nil nil nil nil ; #xe8-#xef - nil nil nil #xf3 nil #xf5 #xf6 #xf7 ; #xf0-#xf7 - #xb8 nil nil nil #xfc nil nil nil ; #xf8-#xff - #xc2 #xe2 nil nil #xc0 #xe0 #xc3 #xe3 ; #x100-#x107 - nil nil nil nil #xc8 #xe8 nil nil ; #x108-#x10f - nil nil #xc7 #xe7 nil nil #xcb #xeb ; #x110-#x117 - #xc6 #xe6 nil nil nil nil nil nil ; #x118-#x11f - nil nil #xcc #xec nil nil nil nil ; #x120-#x127 - nil nil #xce #xee nil nil #xc1 #xe1 ; #x128-#x12f - nil nil nil nil nil nil #xcd #xed ; #x130-#x137 - nil nil nil #xcf #xef nil nil nil ; #x138-#x13f - nil #xd9 #xf9 #xd1 #xf1 #xd2 #xf2 nil ; #x140-#x147 - nil nil nil nil #xd4 #xf4 nil nil ; #x148-#x14f - nil nil nil nil nil nil #xaa #xba ; #x150-#x157 - nil nil #xda #xfa nil nil nil nil ; #x158-#x15f - #xd0 #xf0 nil nil nil nil nil nil ; #x160-#x167 - nil nil #xdb #xfb nil nil nil nil ; #x168-#x16f - nil nil #xd8 #xf8 nil nil nil nil ; #x170-#x177 - nil #xca #xea #xdd #xfd #xde #xfe nil) ; #x178-#x17f - :test #'equalp) - -(define-constant +unicode-2018-2020-to-iso-8859-13+ - #(nil #xff nil nil #xb4 #xa1 #xa5 nil) ; #x2018-#x201f - :test #'equalp) - -(define-unibyte-encoder :iso-8859-13 (code) - (or (cond ((< code #xa0) code) - ((< code #x180) - (svref +unicode-a0-180-to-iso-8859-13+ - (the ub8 (- code #xa0)))) - ((<= #x2018 code #x201f) - (svref +unicode-2018-2020-to-iso-8859-13+ - (the ub8 (- code #x2018))))) - (handle-error))) - -(define-constant +iso-8859-13-to-unicode+ - #(;; #xa0 - #x00a0 #x201d #x00a2 #x00a3 #x00a4 #x201e #x00a6 #x00a7 - #x00d8 #x00a9 #x0156 #x00ab #x00ac #x00ad #x00ae #x00c6 - ;; #xb0 - #x00b0 #x00b1 #x00b2 #x00b3 #x201c #x00b5 #x00b6 #x00b7 - #x00f8 #x00b9 #x0157 #x00bb #x00bc #x00bd #x00be #x00e6 - ;; #xc0 - #x0104 #x012e #x0100 #x0106 #x00c4 #x00c5 #x0118 #x0112 - #x010c #x00c9 #x0179 #x0116 #x0122 #x0136 #x012a #x013b - ;; #xd0 - #x0160 #x0143 #x0145 #x00d3 #x014c #x00d5 #x00d6 #x00d7 - #x0172 #x0141 #x015a #x016a #x00dc #x017b #x017d #x00df - ;; #xe0 - #x0105 #x012f #x0101 #x0107 #x00e4 #x00e5 #x0119 #x0113 - #x010d #x00e9 #x017a #x0117 #x0123 #x0137 #x012b #x013c - ;; #xf0 - #x0161 #x0144 #x0146 #x00f3 #x014d #x00f5 #x00f6 #x00f7 - #x0173 #x0142 #x015b #x016b #x00fc #x017c #x017e #x2019) - :test #'equalp) - -(define-unibyte-decoder :iso-8859-13 (octet) - (if (< octet #xa0) - octet - (svref +iso-8859-13-to-unicode+ (the ub8 (- octet #xa0))))) - -(define-character-encoding :iso-8859-14 - "An 8-bit, fixed-width character encoding in which codes -#x00-#x9f map to their Unicode equivalents and other codes map to -other Unicode character values. Intended to provide most -characters found in Celtic languages." - :aliases '(:latin-8 :latin8) - :literal-char-code-limit #xa0) - -(define-constant +unicode-a0-100-to-iso-8859-14+ - #(#xa0 nil nil #xa3 nil nil nil #xa7 ; #xa0-#xa7 - nil #xa9 nil nil nil #xad #xae nil ; #xa8-#xaf - nil nil nil nil nil nil #xb6 nil ; #xb0-#xb7 - nil nil nil nil nil nil nil nil ; #xb8-#xbf - #xc0 #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 #xc7 ; #xc0-#xc7 - #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #xc8-#xcf - nil #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 nil ; #xd0-#xd7 - #xd8 #xd9 #xda #xdb #xdc #xdd nil #xdf ; #xd8-#xdf - #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #xe0-#xe7 - #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #xe8-#xef - nil #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 nil ; #xf0-#xf7 - #xf8 #xf9 #xfa #xfb #xfc #xfd nil #xff) ; #xf8-#xff - :test #'equalp) - -(define-constant +unicode-108-128-to-iso-8859-14+ - #(nil nil #xa4 #xa5 nil nil nil nil ; #x108-#x10f - nil nil nil nil nil nil nil nil ; #x110-#x117 - nil nil nil nil nil nil nil nil ; #x118-#x11f - #xb2 #xb3 nil nil nil nil nil nil) ; #x120-#x127 - :test #'equalp) - -(define-constant +unicode-170-180-to-iso-8859-14+ - #(nil nil nil nil #xd0 #xf0 #xde #xfe ; #x170-#x177 - #xaf nil nil nil nil nil nil nil) ; #x178-#x17f - :test #'equalp) - -(define-constant +unicode-1e00-1e88-to-iso-8859-14+ - #(nil nil #xa1 #xa2 nil nil nil nil ; #x1e00-#x1e07 - nil nil #xa6 #xab nil nil nil nil ; #x1e08-#x1e0f - nil nil nil nil nil nil nil nil ; #x1e10-#x1e17 - nil nil nil nil nil nil #xb0 #xb1 ; #x1e18-#x1e1f - nil nil nil nil nil nil nil nil ; #x1e20-#x1e27 - nil nil nil nil nil nil nil nil ; #x1e28-#x1e2f - nil nil nil nil nil nil nil nil ; #x1e30-#x1e37 - nil nil nil nil nil nil nil nil ; #x1e38-#x1e3f - #xb4 #xb5 nil nil nil nil nil nil ; #x1e40-#x1e47 - nil nil nil nil nil nil nil nil ; #x1e48-#x1e4f - nil nil nil nil nil nil #xb7 #xb9 ; #x1e50-#x1e57 - nil nil nil nil nil nil nil nil ; #x1e58-#x1e5f - #xbb #xbf nil nil nil nil nil nil ; #x1e60-#x1e67 - nil nil #xd7 #xf7 nil nil nil nil ; #x1e68-#x1e6f - nil nil nil nil nil nil nil nil ; #x1e70-#x1e77 - nil nil nil nil nil nil nil nil ; #x1e78-#x1e7f - #xa8 #xb8 #xaa #xba #xbd #xbe nil nil) ; #x1e80-#x1e87 - :test #'equalp) - -(define-constant +unicode-1ef0-1ef8-to-iso-8859-14+ - #(nil nil #xac #xbc nil nil nil nil) ; #x1ef0-#x1ef7 - :test #'equalp) - -(define-unibyte-encoder :iso-8859-14 (code) - (or (cond ((< code #xa0) code) - ((< code #x100) - (svref +unicode-a0-100-to-iso-8859-14+ - (the ub8 (- code #xa0)))) - ((<= #x108 code #x127) - (svref +unicode-108-128-to-iso-8859-14+ - (the ub8 (- code #x108)))) - ((<= #x170 code #x17f) - (svref +unicode-170-180-to-iso-8859-14+ - (the ub8 (- code #x170)))) - ((<= #x1e00 code #x1e87) - (svref +unicode-1e00-1e88-to-iso-8859-14+ - (the ub8 (- code #x1e00)))) - ((<= #x1ef0 code #x1ef7) - (svref +unicode-1ef0-1ef8-to-iso-8859-14+ - (the ub8 (- code #x1ef0))))) - (handle-error))) - -(define-constant +iso-8859-14-to-unicode+ - #(;; #xa0 - #x00a0 #x1e02 #x1e03 #x00a3 #x010a #x010b #x1e0a #x00a7 - #x1e80 #x00a9 #x1e82 #x1e0b #x1ef2 #x00ad #x00ae #x0178 - ;; #xb0 - #x1e1e #x1e1f #x0120 #x0121 #x1e40 #x1e41 #x00b6 #x1e56 - #x1e81 #x1e57 #x1e83 #x1e60 #x1ef3 #x1e84 #x1e85 #x1e61 - ;; #xc0 - #x00c0 #x00c1 #x00c2 #x00c3 #x00c4 #x00c5 #x00c6 #x00c7 - #x00c8 #x00c9 #x00ca #x00cb #x00cc #x00cd #x00ce #x00cf - ;; #xd0 - #x0174 #x00d1 #x00d2 #x00d3 #x00d4 #x00d5 #x00d6 #x1e6a - #x00d8 #x00d9 #x00da #x00db #x00dc #x00dd #x0176 #x00df - ;; #xe0 - #x00e0 #x00e1 #x00e2 #x00e3 #x00e4 #x00e5 #x00e6 #x00e7 - #x00e8 #x00e9 #x00ea #x00eb #x00ec #x00ed #x00ee #x00ef - ;; #xf0 - #x0175 #x00f1 #x00f2 #x00f3 #x00f4 #x00f5 #x00f6 #x1e6b - #x00f8 #x00f9 #x00fa #x00fb #x00fc #x00fd #x0177 #x00ff) - :test #'equalp) - -(define-unibyte-decoder :iso-8859-14 (octet) - (if (< octet #xa0) - octet - (svref +iso-8859-14-to-unicode+ (the ub8 (- octet #xa0))))) - -(define-character-encoding :iso-8859-15 - "An 8-bit, fixed-width character encoding in which codes -#x00-#x9f map to their Unicode equivalents and other codes map to -other Unicode character values. Intended to provide most -characters found in Western European languages (including the -Euro sign and some other characters missing from ISO-8859-1." - :aliases '(:latin-9 :latin9) - :literal-char-code-limit #xa0) - -(define-constant +unicode-a0-100-to-iso-8859-15+ - #(#xa0 #xa1 #xa2 #xa3 nil #xa5 nil #xa7 ; #xa0-#xa7 - nil #xa9 #xaa #xab #xac #xad #xae #xaf ; #xa8-#xaf - #xb0 #xb1 #xb2 #xb3 nil #xb5 #xb6 #xb7 ; #xb0-#xb7 - nil #xb9 #xba #xbb nil nil nil #xbf ; #xb8-0xbf - #xc0 #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 #xc7 ; #xc0-#xc7 - #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #xc8-#xcf - #xd0 #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 #xd7 ; #xd0-#xd7 - #xd8 #xd9 #xda #xdb #xdc #xdd #xde #xdf ; #xd8-#xdf - #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #xe0-#xe7 - #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #xe8-#xef - #xf0 #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 #xf7 ; #xf0-#xf7 - #xf8 #xf9 #xfa #xfb #xfc #xfd #xfe #xff) ; #xf8-#xff - :test #'equalp) - -(define-constant +unicode-150-180-to-iso-8859-15+ - #(nil nil #xbc #xbd nil nil nil nil ; #x150-#x157 - nil nil nil nil nil nil nil nil ; #x158-#x15f - #xa6 #xa8 nil nil nil nil nil nil ; #x160-#x167 - nil nil nil nil nil nil nil nil ; #x168-#x16f - nil nil nil nil nil nil nil nil ; #x170-#x177 - #xbe nil nil nil nil #xb4 #xb8 nil) ; #x178-#x17f - :test #'equalp) - -(define-unibyte-encoder :iso-8859-15 (code) - (or (cond ((< code #xa0) code) - ((< code #x100) - (svref +unicode-a0-100-to-iso-8859-15+ - (the ub8 (- code #xa0)))) - ((<= #x150 code #x1f7) - (svref +unicode-150-180-to-iso-8859-15+ - (the ub8 (- code #x150)))) - ;; Euro sign - ((= code #x20ac) #xa4)) - (handle-error))) - -(define-constant +iso-8859-15-to-unicode+ - #(;; #xa0 - #x00a0 #x00a1 #x00a2 #x00a3 #x20ac #x00a5 #x0160 #x00a7 - #x0161 #x00a9 #x00aa #x00ab #x00ac #x00ad #x00ae #x00af - ;; #xb0 - #x00b0 #x00b1 #x00b2 #x00b3 #x017d #x00b5 #x00b6 #x00b7 - #x017e #x00b9 #x00ba #x00bb #x0152 #x0153 #x0178 #x00bf - ;; #xc0 - #x00c0 #x00c1 #x00c2 #x00c3 #x00c4 #x00c5 #x00c6 #x00c7 - ;; #xc8 - #x00c8 #x00c9 #x00ca #x00cb #x00cc #x00cd #x00ce #x00cf - ;; #xd0 - #x00d0 #x00d1 #x00d2 #x00d3 #x00d4 #x00d5 #x00d6 #x00d7 - ;; #xd8 - #x00d8 #x00d9 #x00da #x00db #x00dc #x00dd #x00de #x00df - ;; #xe0 - #x00e0 #x00e1 #x00e2 #x00e3 #x00e4 #x00e5 #x00e6 #x00e7 - ;; #xe8 - #x00e8 #x00e9 #x00ea #x00eb #x00ec #x00ed #x00ee #x00ef - ;; #xf0 - #x00f0 #x00f1 #x00f2 #x00f3 #x00f4 #x00f5 #x00f6 #x00f7 - ;; #xf8 - #x00f8 #x00f9 #x00fa #x00fb #x00fc #x00fd #x00fe #x00ff) - :test #'equalp) - -(define-unibyte-decoder :iso-8859-15 (octet) - (if (< octet #xa0) - octet - (svref +iso-8859-15-to-unicode+ (the ub8 (- octet #xa0))))) - -(define-character-encoding :iso-8859-16 - "An 8-bit, fixed-width character encoding in which codes -#x00-#x9f map to their Unicode equivalents and other codes map to -other Unicode character values. Intended to provide most -characters found in Southeast European languages." - :aliases '(:latin-10 :latin10) - :literal-char-code-limit #xa0) - -(define-constant +unicode-a0-180-to-iso-8859-16+ - #(#xa0 nil nil nil nil nil nil #xa7 ; #xa0-#xa7 - nil #xa9 nil #xab nil #xad nil nil ; #xa8-#xaf - #xb0 #xb1 nil nil nil nil #xb6 #xb7 ; #xb0-#xb7 - nil nil nil #xbb nil nil nil nil ; #xb8-#xbf - #xc0 #xc1 #xc2 nil #xc4 nil #xc6 #xc7 ; #xc0-#xc7 - #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #xc8-#xcf - nil nil #xd2 #xd3 #xd4 nil #xd6 nil ; #xd0-#xd7 - nil #xd9 #xda #xdb #xdc nil nil #xdf ; #xd8-#xdf - #xe0 #xe1 #xe2 nil #xe4 nil #xe6 #xe7 ; #xe0-#xe7 - #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #xe8-#xef - nil nil #xf2 #xf3 #xf4 nil #xf6 nil ; #xf0-#xf7 - nil #xf9 #xfa #xfb #xfc nil nil #xff ; #xf8-#xff - nil nil #xc3 #xe3 #xa1 #xa2 #xc5 #xe5 ; #x100-#x107 - nil nil nil nil #xb2 #xb9 nil nil ; #x108-#x10f - #xd0 #xf0 nil nil nil nil nil nil ; #x110-#x117 - #xdd #xfd nil nil nil nil nil nil ; #x118-#x11f - nil nil nil nil nil nil nil nil ; #x120-#x127 - nil nil nil nil nil nil nil nil ; #x128-#x12f - nil nil nil nil nil nil nil nil ; #x130-#x137 - nil nil nil nil nil nil nil nil ; #x138-#x13f - nil #xa3 #xb3 #xd1 #xf1 nil nil nil ; #x140-#x147 - nil nil nil nil nil nil nil nil ; #x148-#x14f - #xd5 #xf5 #xbc #xbd nil nil nil nil ; #x150-#x157 - nil nil #xd7 #xf7 nil nil nil nil ; #x158-#x15f - #xa6 #xa8 nil nil nil nil nil nil ; #x160-#x167 - nil nil nil nil nil nil nil nil ; #x168-#x16f - #xd8 #xf8 nil nil nil nil nil nil ; #x170-#x177 - #xbe #xac #xae #xaf #xbf #xb4 #xb8 nil) ; #x178-#x17f - :test #'equalp) - -(define-constant +unicode-218-220-to-iso-8859-16+ - #(#xaa #xba #xde #xfe nil nil nil nil) ; #x218-#x21f - :test #'equalp) - -(define-constant +unicode-2018-2020-to-iso-8859-16+ - #(nil nil nil nil nil #xb5 #xa5 nil) ; #x2018-#x201f - :test #'equalp) - -(define-unibyte-encoder :iso-8859-16 (code) - (or (cond ((< code #xa0) code) - ((< code #x180) - (svref +unicode-a0-180-to-iso-8859-16+ - (the ub8 (- code #xa0)))) - ((<= #x218 code #x21f) - (svref +unicode-218-220-to-iso-8859-16+ - (the ub8 (- code #x218)))) - ((< #x2018 code #x201f) - (svref +unicode-2018-2020-to-iso-8859-16+ - (the ub8 (- code #x2018)))) - ;; Euro sign - ((= code #x20ac) #xa4)) - (handle-error))) - -(define-constant +iso-8859-16-to-unicode+ - #(;; #xa0 - #x00a0 #x0104 #x0105 #x0141 #x20ac #x201e #x0160 #x00a7 - #x0161 #x00a9 #x0218 #x00ab #x0179 #x00ad #x017a #x017b - ;; #xb0 - #x00b0 #x00b1 #x010c #x0142 #x017d #x201d #x00b6 #x00b7 - #x017e #x010d #x0219 #x00bb #x0152 #x0153 #x0178 #x017c - ;; #xc0 - #x00c0 #x00c1 #x00c2 #x0102 #x00c4 #x0106 #x00c6 #x00c7 - #x00c8 #x00c9 #x00ca #x00cb #x00cc #x00cd #x00ce #x00cf - ;; #xd0 - #x0110 #x0143 #x00d2 #x00d3 #x00d4 #x0150 #x00d6 #x015a - #x0170 #x00d9 #x00da #x00db #x00dc #x0118 #x021a #x00df - ;; #xe0 - #x00e0 #x00e1 #x00e2 #x0103 #x00e4 #x0107 #x00e6 #x00e7 - #x00e8 #x00e9 #x00ea #x00eb #x00ec #x00ed #x00ee #x00ef - ;; #xf0 - #x0111 #x0144 #x00f2 #x00f3 #x00f4 #x0151 #x00f6 #x015b - #x0171 #x00f9 #x00fa #x00fb #x00fc #x0119 #x021b #x00ff) - :test #'equalp) - -(define-unibyte-decoder :iso-8859-16 (octet) - (if (< octet #xa0) - octet - (svref +iso-8859-16-to-unicode+ (the ub8 (- octet #xa0))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-jpn.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-jpn.lisp deleted file mode 100644 index 9504f89..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-jpn.lisp +++ /dev/null @@ -1,767 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; enc-jpn.lisp --- Japanese encodings. -;;; - -(in-package #:babel-encodings) - -;;;; helper functions -(defvar *eucjp-to-ucs-hash* (make-hash-table)) -(defvar *ucs-to-eucjp-hash* (make-hash-table)) -(defvar *cp932-to-ucs-hash* (make-hash-table)) -(defvar *ucs-to-cp932-hash* (make-hash-table)) - -(dolist (i `((,*cp932-only* - ,*cp932-to-ucs-hash* - ,*ucs-to-cp932-hash*) - (,*eucjp-only* - ,*eucjp-to-ucs-hash* - ,*ucs-to-eucjp-hash*) - (,*eucjp* - ,*eucjp-to-ucs-hash* - ,*ucs-to-eucjp-hash*))) - (dolist (j (first i)) - (setf (gethash (car j) (second i)) (cadr j)) - (setf (gethash (cadr j) (third i)) (car j)))) - -(flet ((euc-cp932 (x) - (let ((high (ash x -16)) - (mid (logand (ash x -8) 255)) - (low (logand x 255))) - (cond ((not (zerop high)) - nil) - ((= mid #x8e) - (logand x 255)) - ((zerop mid) - x) - ((decf mid #xa1) - (decf low #x80) - (incf low (if (zerop (logand mid 1)) #x1f #x7e)) - (incf low (if (<= #x7f low #x9d) 1 0)) - (setq mid (ash mid -1)) - (incf mid (if (<= mid #x1e) #x81 #xc1)) - (+ (ash mid 8) low)))))) - (dolist (i *eucjp*) - (let ((cp932 (euc-cp932 (first i)))) - (when cp932 - (setf (gethash cp932 *cp932-to-ucs-hash*) (second i)) - (setf (gethash (second i) *ucs-to-cp932-hash*) cp932))))) - -;ascii -(loop for i from #x00 to #x7f do - (setf (gethash i *cp932-to-ucs-hash*) i) - (setf (gethash i *eucjp-to-ucs-hash*) i) - (setf (gethash i *ucs-to-eucjp-hash*) i) - (setf (gethash i *ucs-to-cp932-hash*) i)) - -;half-width katakana -(loop for i from #xa1 to #xdf do - (setf (gethash i *cp932-to-ucs-hash*) (+ #xff61 #x-a1 i)) - (setf (gethash (+ #xff61 #x-a1 i) *ucs-to-cp932-hash*) i) - (setf (gethash (+ #x8e00 i) *eucjp-to-ucs-hash*) (+ #xff61 #x-a1 i)) - (setf (gethash (+ #xff61 #x-a1 i) *ucs-to-eucjp-hash*) (+ #x8e00 i))) - -;; This is quoted from https://support.microsoft.com/en-us/kb/170559/en-us -(let ((kb170559 "0x8790 -> U+2252 -> 0x81e0 Approximately Equal To Or The Image Of -0x8791 -> U+2261 -> 0x81df Identical To -0x8792 -> U+222b -> 0x81e7 Integral -0x8795 -> U+221a -> 0x81e3 Square Root -0x8796 -> U+22a5 -> 0x81db Up Tack -0x8797 -> U+2220 -> 0x81da Angle -0x879a -> U+2235 -> 0x81e6 Because -0x879b -> U+2229 -> 0x81bf Intersection -0x879c -> U+222a -> 0x81be Union -0xed40 -> U+7e8a -> 0xfa5c CJK Unified Ideograph -0xed41 -> U+891c -> 0xfa5d CJK Unified Ideograph -0xed42 -> U+9348 -> 0xfa5e CJK Unified Ideograph -0xed43 -> U+9288 -> 0xfa5f CJK Unified Ideograph -0xed44 -> U+84dc -> 0xfa60 CJK Unified Ideograph -0xed45 -> U+4fc9 -> 0xfa61 CJK Unified Ideograph -0xed46 -> U+70bb -> 0xfa62 CJK Unified Ideograph -0xed47 -> U+6631 -> 0xfa63 CJK Unified Ideograph -0xed48 -> U+68c8 -> 0xfa64 CJK Unified Ideograph -0xed49 -> U+92f9 -> 0xfa65 CJK Unified Ideograph -0xed4a -> U+66fb -> 0xfa66 CJK Unified Ideograph -0xed4b -> U+5f45 -> 0xfa67 CJK Unified Ideograph -0xed4c -> U+4e28 -> 0xfa68 CJK Unified Ideograph -0xed4d -> U+4ee1 -> 0xfa69 CJK Unified Ideograph -0xed4e -> U+4efc -> 0xfa6a CJK Unified Ideograph -0xed4f -> U+4f00 -> 0xfa6b CJK Unified Ideograph -0xed50 -> U+4f03 -> 0xfa6c CJK Unified Ideograph -0xed51 -> U+4f39 -> 0xfa6d CJK Unified Ideograph -0xed52 -> U+4f56 -> 0xfa6e CJK Unified Ideograph -0xed53 -> U+4f92 -> 0xfa6f CJK Unified Ideograph -0xed54 -> U+4f8a -> 0xfa70 CJK Unified Ideograph -0xed55 -> U+4f9a -> 0xfa71 CJK Unified Ideograph -0xed56 -> U+4f94 -> 0xfa72 CJK Unified Ideograph -0xed57 -> U+4fcd -> 0xfa73 CJK Unified Ideograph -0xed58 -> U+5040 -> 0xfa74 CJK Unified Ideograph -0xed59 -> U+5022 -> 0xfa75 CJK Unified Ideograph -0xed5a -> U+4fff -> 0xfa76 CJK Unified Ideograph -0xed5b -> U+501e -> 0xfa77 CJK Unified Ideograph -0xed5c -> U+5046 -> 0xfa78 CJK Unified Ideograph -0xed5d -> U+5070 -> 0xfa79 CJK Unified Ideograph -0xed5e -> U+5042 -> 0xfa7a CJK Unified Ideograph -0xed5f -> U+5094 -> 0xfa7b CJK Unified Ideograph -0xed60 -> U+50f4 -> 0xfa7c CJK Unified Ideograph -0xed61 -> U+50d8 -> 0xfa7d CJK Unified Ideograph -0xed62 -> U+514a -> 0xfa7e CJK Unified Ideograph -0xed63 -> U+5164 -> 0xfa80 CJK Unified Ideograph -0xed64 -> U+519d -> 0xfa81 CJK Unified Ideograph -0xed65 -> U+51be -> 0xfa82 CJK Unified Ideograph -0xed66 -> U+51ec -> 0xfa83 CJK Unified Ideograph -0xed67 -> U+5215 -> 0xfa84 CJK Unified Ideograph -0xed68 -> U+529c -> 0xfa85 CJK Unified Ideograph -0xed69 -> U+52a6 -> 0xfa86 CJK Unified Ideograph -0xed6a -> U+52c0 -> 0xfa87 CJK Unified Ideograph -0xed6b -> U+52db -> 0xfa88 CJK Unified Ideograph -0xed6c -> U+5300 -> 0xfa89 CJK Unified Ideograph -0xed6d -> U+5307 -> 0xfa8a CJK Unified Ideograph -0xed6e -> U+5324 -> 0xfa8b CJK Unified Ideograph -0xed6f -> U+5372 -> 0xfa8c CJK Unified Ideograph -0xed70 -> U+5393 -> 0xfa8d CJK Unified Ideograph -0xed71 -> U+53b2 -> 0xfa8e CJK Unified Ideograph -0xed72 -> U+53dd -> 0xfa8f CJK Unified Ideograph -0xed73 -> U+fa0e -> 0xfa90 CJK compatibility Ideograph -0xed74 -> U+549c -> 0xfa91 CJK Unified Ideograph -0xed75 -> U+548a -> 0xfa92 CJK Unified Ideograph -0xed76 -> U+54a9 -> 0xfa93 CJK Unified Ideograph -0xed77 -> U+54ff -> 0xfa94 CJK Unified Ideograph -0xed78 -> U+5586 -> 0xfa95 CJK Unified Ideograph -0xed79 -> U+5759 -> 0xfa96 CJK Unified Ideograph -0xed7a -> U+5765 -> 0xfa97 CJK Unified Ideograph -0xed7b -> U+57ac -> 0xfa98 CJK Unified Ideograph -0xed7c -> U+57c8 -> 0xfa99 CJK Unified Ideograph -0xed7d -> U+57c7 -> 0xfa9a CJK Unified Ideograph -0xed7e -> U+fa0f -> 0xfa9b CJK compatibility Ideograph -0xed80 -> U+fa10 -> 0xfa9c CJK compatibility Ideograph -0xed81 -> U+589e -> 0xfa9d CJK Unified Ideograph -0xed82 -> U+58b2 -> 0xfa9e CJK Unified Ideograph -0xed83 -> U+590b -> 0xfa9f CJK Unified Ideograph -0xed84 -> U+5953 -> 0xfaa0 CJK Unified Ideograph -0xed85 -> U+595b -> 0xfaa1 CJK Unified Ideograph -0xed86 -> U+595d -> 0xfaa2 CJK Unified Ideograph -0xed87 -> U+5963 -> 0xfaa3 CJK Unified Ideograph -0xed88 -> U+59a4 -> 0xfaa4 CJK Unified Ideograph -0xed89 -> U+59ba -> 0xfaa5 CJK Unified Ideograph -0xed8a -> U+5b56 -> 0xfaa6 CJK Unified Ideograph -0xed8b -> U+5bc0 -> 0xfaa7 CJK Unified Ideograph -0xed8c -> U+752f -> 0xfaa8 CJK Unified Ideograph -0xed8d -> U+5bd8 -> 0xfaa9 CJK Unified Ideograph -0xed8e -> U+5bec -> 0xfaaa CJK Unified Ideograph -0xed8f -> U+5c1e -> 0xfaab CJK Unified Ideograph -0xed90 -> U+5ca6 -> 0xfaac CJK Unified Ideograph -0xed91 -> U+5cba -> 0xfaad CJK Unified Ideograph -0xed92 -> U+5cf5 -> 0xfaae CJK Unified Ideograph -0xed93 -> U+5d27 -> 0xfaaf CJK Unified Ideograph -0xed94 -> U+5d53 -> 0xfab0 CJK Unified Ideograph -0xed95 -> U+fa11 -> 0xfab1 CJK compatibility Ideograph -0xed96 -> U+5d42 -> 0xfab2 CJK Unified Ideograph -0xed97 -> U+5d6d -> 0xfab3 CJK Unified Ideograph -0xed98 -> U+5db8 -> 0xfab4 CJK Unified Ideograph -0xed99 -> U+5db9 -> 0xfab5 CJK Unified Ideograph -0xed9a -> U+5dd0 -> 0xfab6 CJK Unified Ideograph -0xed9b -> U+5f21 -> 0xfab7 CJK Unified Ideograph -0xed9c -> U+5f34 -> 0xfab8 CJK Unified Ideograph -0xed9d -> U+5f67 -> 0xfab9 CJK Unified Ideograph -0xed9e -> U+5fb7 -> 0xfaba CJK Unified Ideograph -0xed9f -> U+5fde -> 0xfabb CJK Unified Ideograph -0xeda0 -> U+605d -> 0xfabc CJK Unified Ideograph -0xeda1 -> U+6085 -> 0xfabd CJK Unified Ideograph -0xeda2 -> U+608a -> 0xfabe CJK Unified Ideograph -0xeda3 -> U+60de -> 0xfabf CJK Unified Ideograph -0xeda4 -> U+60d5 -> 0xfac0 CJK Unified Ideograph -0xeda5 -> U+6120 -> 0xfac1 CJK Unified Ideograph -0xeda6 -> U+60f2 -> 0xfac2 CJK Unified Ideograph -0xeda7 -> U+6111 -> 0xfac3 CJK Unified Ideograph -0xeda8 -> U+6137 -> 0xfac4 CJK Unified Ideograph -0xeda9 -> U+6130 -> 0xfac5 CJK Unified Ideograph -0xedaa -> U+6198 -> 0xfac6 CJK Unified Ideograph -0xedab -> U+6213 -> 0xfac7 CJK Unified Ideograph -0xedac -> U+62a6 -> 0xfac8 CJK Unified Ideograph -0xedad -> U+63f5 -> 0xfac9 CJK Unified Ideograph -0xedae -> U+6460 -> 0xfaca CJK Unified Ideograph -0xedaf -> U+649d -> 0xfacb CJK Unified Ideograph -0xedb0 -> U+64ce -> 0xfacc CJK Unified Ideograph -0xedb1 -> U+654e -> 0xfacd CJK Unified Ideograph -0xedb2 -> U+6600 -> 0xface CJK Unified Ideograph -0xedb3 -> U+6615 -> 0xfacf CJK Unified Ideograph -0xedb4 -> U+663b -> 0xfad0 CJK Unified Ideograph -0xedb5 -> U+6609 -> 0xfad1 CJK Unified Ideograph -0xedb6 -> U+662e -> 0xfad2 CJK Unified Ideograph -0xedb7 -> U+661e -> 0xfad3 CJK Unified Ideograph -0xedb8 -> U+6624 -> 0xfad4 CJK Unified Ideograph -0xedb9 -> U+6665 -> 0xfad5 CJK Unified Ideograph -0xedba -> U+6657 -> 0xfad6 CJK Unified Ideograph -0xedbb -> U+6659 -> 0xfad7 CJK Unified Ideograph -0xedbc -> U+fa12 -> 0xfad8 CJK compatibility Ideograph -0xedbd -> U+6673 -> 0xfad9 CJK Unified Ideograph -0xedbe -> U+6699 -> 0xfada CJK Unified Ideograph -0xedbf -> U+66a0 -> 0xfadb CJK Unified Ideograph -0xedc0 -> U+66b2 -> 0xfadc CJK Unified Ideograph -0xedc1 -> U+66bf -> 0xfadd CJK Unified Ideograph -0xedc2 -> U+66fa -> 0xfade CJK Unified Ideograph -0xedc3 -> U+670e -> 0xfadf CJK Unified Ideograph -0xedc4 -> U+f929 -> 0xfae0 CJK compatibility Ideograph -0xedc5 -> U+6766 -> 0xfae1 CJK Unified Ideograph -0xedc6 -> U+67bb -> 0xfae2 CJK Unified Ideograph -0xedc7 -> U+6852 -> 0xfae3 CJK Unified Ideograph -0xedc8 -> U+67c0 -> 0xfae4 CJK Unified Ideograph -0xedc9 -> U+6801 -> 0xfae5 CJK Unified Ideograph -0xedca -> U+6844 -> 0xfae6 CJK Unified Ideograph -0xedcb -> U+68cf -> 0xfae7 CJK Unified Ideograph -0xedcc -> U+fa13 -> 0xfae8 CJK compatibility Ideograph -0xedcd -> U+6968 -> 0xfae9 CJK Unified Ideograph -0xedce -> U+fa14 -> 0xfaea CJK compatibility Ideograph -0xedcf -> U+6998 -> 0xfaeb CJK Unified Ideograph -0xedd0 -> U+69e2 -> 0xfaec CJK Unified Ideograph -0xedd1 -> U+6a30 -> 0xfaed CJK Unified Ideograph -0xedd2 -> U+6a6b -> 0xfaee CJK Unified Ideograph -0xedd3 -> U+6a46 -> 0xfaef CJK Unified Ideograph -0xedd4 -> U+6a73 -> 0xfaf0 CJK Unified Ideograph -0xedd5 -> U+6a7e -> 0xfaf1 CJK Unified Ideograph -0xedd6 -> U+6ae2 -> 0xfaf2 CJK Unified Ideograph -0xedd7 -> U+6ae4 -> 0xfaf3 CJK Unified Ideograph -0xedd8 -> U+6bd6 -> 0xfaf4 CJK Unified Ideograph -0xedd9 -> U+6c3f -> 0xfaf5 CJK Unified Ideograph -0xedda -> U+6c5c -> 0xfaf6 CJK Unified Ideograph -0xeddb -> U+6c86 -> 0xfaf7 CJK Unified Ideograph -0xeddc -> U+6c6f -> 0xfaf8 CJK Unified Ideograph -0xeddd -> U+6cda -> 0xfaf9 CJK Unified Ideograph -0xedde -> U+6d04 -> 0xfafa CJK Unified Ideograph -0xeddf -> U+6d87 -> 0xfafb CJK Unified Ideograph -0xede0 -> U+6d6f -> 0xfafc CJK Unified Ideograph -0xede1 -> U+6d96 -> 0xfb40 CJK Unified Ideograph -0xede2 -> U+6dac -> 0xfb41 CJK Unified Ideograph -0xede3 -> U+6dcf -> 0xfb42 CJK Unified Ideograph -0xede4 -> U+6df8 -> 0xfb43 CJK Unified Ideograph -0xede5 -> U+6df2 -> 0xfb44 CJK Unified Ideograph -0xede6 -> U+6dfc -> 0xfb45 CJK Unified Ideograph -0xede7 -> U+6e39 -> 0xfb46 CJK Unified Ideograph -0xede8 -> U+6e5c -> 0xfb47 CJK Unified Ideograph -0xede9 -> U+6e27 -> 0xfb48 CJK Unified Ideograph -0xedea -> U+6e3c -> 0xfb49 CJK Unified Ideograph -0xedeb -> U+6ebf -> 0xfb4a CJK Unified Ideograph -0xedec -> U+6f88 -> 0xfb4b CJK Unified Ideograph -0xeded -> U+6fb5 -> 0xfb4c CJK Unified Ideograph -0xedee -> U+6ff5 -> 0xfb4d CJK Unified Ideograph -0xedef -> U+7005 -> 0xfb4e CJK Unified Ideograph -0xedf0 -> U+7007 -> 0xfb4f CJK Unified Ideograph -0xedf1 -> U+7028 -> 0xfb50 CJK Unified Ideograph -0xedf2 -> U+7085 -> 0xfb51 CJK Unified Ideograph -0xedf3 -> U+70ab -> 0xfb52 CJK Unified Ideograph -0xedf4 -> U+710f -> 0xfb53 CJK Unified Ideograph -0xedf5 -> U+7104 -> 0xfb54 CJK Unified Ideograph -0xedf6 -> U+715c -> 0xfb55 CJK Unified Ideograph -0xedf7 -> U+7146 -> 0xfb56 CJK Unified Ideograph -0xedf8 -> U+7147 -> 0xfb57 CJK Unified Ideograph -0xedf9 -> U+fa15 -> 0xfb58 CJK compatibility Ideograph -0xedfa -> U+71c1 -> 0xfb59 CJK Unified Ideograph -0xedfb -> U+71fe -> 0xfb5a CJK Unified Ideograph -0xedfc -> U+72b1 -> 0xfb5b CJK Unified Ideograph -0xee40 -> U+72be -> 0xfb5c CJK Unified Ideograph -0xee41 -> U+7324 -> 0xfb5d CJK Unified Ideograph -0xee42 -> U+fa16 -> 0xfb5e CJK compatibility Ideograph -0xee43 -> U+7377 -> 0xfb5f CJK Unified Ideograph -0xee44 -> U+73bd -> 0xfb60 CJK Unified Ideograph -0xee45 -> U+73c9 -> 0xfb61 CJK Unified Ideograph -0xee46 -> U+73d6 -> 0xfb62 CJK Unified Ideograph -0xee47 -> U+73e3 -> 0xfb63 CJK Unified Ideograph -0xee48 -> U+73d2 -> 0xfb64 CJK Unified Ideograph -0xee49 -> U+7407 -> 0xfb65 CJK Unified Ideograph -0xee4a -> U+73f5 -> 0xfb66 CJK Unified Ideograph -0xee4b -> U+7426 -> 0xfb67 CJK Unified Ideograph -0xee4c -> U+742a -> 0xfb68 CJK Unified Ideograph -0xee4d -> U+7429 -> 0xfb69 CJK Unified Ideograph -0xee4e -> U+742e -> 0xfb6a CJK Unified Ideograph -0xee4f -> U+7462 -> 0xfb6b CJK Unified Ideograph -0xee50 -> U+7489 -> 0xfb6c CJK Unified Ideograph -0xee51 -> U+749f -> 0xfb6d CJK Unified Ideograph -0xee52 -> U+7501 -> 0xfb6e CJK Unified Ideograph -0xee53 -> U+756f -> 0xfb6f CJK Unified Ideograph -0xee54 -> U+7682 -> 0xfb70 CJK Unified Ideograph -0xee55 -> U+769c -> 0xfb71 CJK Unified Ideograph -0xee56 -> U+769e -> 0xfb72 CJK Unified Ideograph -0xee57 -> U+769b -> 0xfb73 CJK Unified Ideograph -0xee58 -> U+76a6 -> 0xfb74 CJK Unified Ideograph -0xee59 -> U+fa17 -> 0xfb75 CJK compatibility Ideograph -0xee5a -> U+7746 -> 0xfb76 CJK Unified Ideograph -0xee5b -> U+52af -> 0xfb77 CJK Unified Ideograph -0xee5c -> U+7821 -> 0xfb78 CJK Unified Ideograph -0xee5d -> U+784e -> 0xfb79 CJK Unified Ideograph -0xee5e -> U+7864 -> 0xfb7a CJK Unified Ideograph -0xee5f -> U+787a -> 0xfb7b CJK Unified Ideograph -0xee60 -> U+7930 -> 0xfb7c CJK Unified Ideograph -0xee61 -> U+fa18 -> 0xfb7d CJK compatibility Ideograph -0xee62 -> U+fa19 -> 0xfb7e CJK compatibility Ideograph -0xee63 -> U+fa1a -> 0xfb80 CJK compatibility Ideograph -0xee64 -> U+7994 -> 0xfb81 CJK Unified Ideograph -0xee65 -> U+fa1b -> 0xfb82 CJK compatibility Ideograph -0xee66 -> U+799b -> 0xfb83 CJK Unified Ideograph -0xee67 -> U+7ad1 -> 0xfb84 CJK Unified Ideograph -0xee68 -> U+7ae7 -> 0xfb85 CJK Unified Ideograph -0xee69 -> U+fa1c -> 0xfb86 CJK compatibility Ideograph -0xee6a -> U+7aeb -> 0xfb87 CJK Unified Ideograph -0xee6b -> U+7b9e -> 0xfb88 CJK Unified Ideograph -0xee6c -> U+fa1d -> 0xfb89 CJK compatibility Ideograph -0xee6d -> U+7d48 -> 0xfb8a CJK Unified Ideograph -0xee6e -> U+7d5c -> 0xfb8b CJK Unified Ideograph -0xee6f -> U+7db7 -> 0xfb8c CJK Unified Ideograph -0xee70 -> U+7da0 -> 0xfb8d CJK Unified Ideograph -0xee71 -> U+7dd6 -> 0xfb8e CJK Unified Ideograph -0xee72 -> U+7e52 -> 0xfb8f CJK Unified Ideograph -0xee73 -> U+7f47 -> 0xfb90 CJK Unified Ideograph -0xee74 -> U+7fa1 -> 0xfb91 CJK Unified Ideograph -0xee75 -> U+fa1e -> 0xfb92 CJK compatibility Ideograph -0xee76 -> U+8301 -> 0xfb93 CJK Unified Ideograph -0xee77 -> U+8362 -> 0xfb94 CJK Unified Ideograph -0xee78 -> U+837f -> 0xfb95 CJK Unified Ideograph -0xee79 -> U+83c7 -> 0xfb96 CJK Unified Ideograph -0xee7a -> U+83f6 -> 0xfb97 CJK Unified Ideograph -0xee7b -> U+8448 -> 0xfb98 CJK Unified Ideograph -0xee7c -> U+84b4 -> 0xfb99 CJK Unified Ideograph -0xee7d -> U+8553 -> 0xfb9a CJK Unified Ideograph -0xee7e -> U+8559 -> 0xfb9b CJK Unified Ideograph -0xee80 -> U+856b -> 0xfb9c CJK Unified Ideograph -0xee81 -> U+fa1f -> 0xfb9d CJK compatibility Ideograph -0xee82 -> U+85b0 -> 0xfb9e CJK Unified Ideograph -0xee83 -> U+fa20 -> 0xfb9f CJK compatibility Ideograph -0xee84 -> U+fa21 -> 0xfba0 CJK compatibility Ideograph -0xee85 -> U+8807 -> 0xfba1 CJK Unified Ideograph -0xee86 -> U+88f5 -> 0xfba2 CJK Unified Ideograph -0xee87 -> U+8a12 -> 0xfba3 CJK Unified Ideograph -0xee88 -> U+8a37 -> 0xfba4 CJK Unified Ideograph -0xee89 -> U+8a79 -> 0xfba5 CJK Unified Ideograph -0xee8a -> U+8aa7 -> 0xfba6 CJK Unified Ideograph -0xee8b -> U+8abe -> 0xfba7 CJK Unified Ideograph -0xee8c -> U+8adf -> 0xfba8 CJK Unified Ideograph -0xee8d -> U+fa22 -> 0xfba9 CJK compatibility Ideograph -0xee8e -> U+8af6 -> 0xfbaa CJK Unified Ideograph -0xee8f -> U+8b53 -> 0xfbab CJK Unified Ideograph -0xee90 -> U+8b7f -> 0xfbac CJK Unified Ideograph -0xee91 -> U+8cf0 -> 0xfbad CJK Unified Ideograph -0xee92 -> U+8cf4 -> 0xfbae CJK Unified Ideograph -0xee93 -> U+8d12 -> 0xfbaf CJK Unified Ideograph -0xee94 -> U+8d76 -> 0xfbb0 CJK Unified Ideograph -0xee95 -> U+fa23 -> 0xfbb1 CJK compatibility Ideograph -0xee96 -> U+8ecf -> 0xfbb2 CJK Unified Ideograph -0xee97 -> U+fa24 -> 0xfbb3 CJK compatibility Ideograph -0xee98 -> U+fa25 -> 0xfbb4 CJK compatibility Ideograph -0xee99 -> U+9067 -> 0xfbb5 CJK Unified Ideograph -0xee9a -> U+90de -> 0xfbb6 CJK Unified Ideograph -0xee9b -> U+fa26 -> 0xfbb7 CJK compatibility Ideograph -0xee9c -> U+9115 -> 0xfbb8 CJK Unified Ideograph -0xee9d -> U+9127 -> 0xfbb9 CJK Unified Ideograph -0xee9e -> U+91da -> 0xfbba CJK Unified Ideograph -0xee9f -> U+91d7 -> 0xfbbb CJK Unified Ideograph -0xeea0 -> U+91de -> 0xfbbc CJK Unified Ideograph -0xeea1 -> U+91ed -> 0xfbbd CJK Unified Ideograph -0xeea2 -> U+91ee -> 0xfbbe CJK Unified Ideograph -0xeea3 -> U+91e4 -> 0xfbbf CJK Unified Ideograph -0xeea4 -> U+91e5 -> 0xfbc0 CJK Unified Ideograph -0xeea5 -> U+9206 -> 0xfbc1 CJK Unified Ideograph -0xeea6 -> U+9210 -> 0xfbc2 CJK Unified Ideograph -0xeea7 -> U+920a -> 0xfbc3 CJK Unified Ideograph -0xeea8 -> U+923a -> 0xfbc4 CJK Unified Ideograph -0xeea9 -> U+9240 -> 0xfbc5 CJK Unified Ideograph -0xeeaa -> U+923c -> 0xfbc6 CJK Unified Ideograph -0xeeab -> U+924e -> 0xfbc7 CJK Unified Ideograph -0xeeac -> U+9259 -> 0xfbc8 CJK Unified Ideograph -0xeead -> U+9251 -> 0xfbc9 CJK Unified Ideograph -0xeeae -> U+9239 -> 0xfbca CJK Unified Ideograph -0xeeaf -> U+9267 -> 0xfbcb CJK Unified Ideograph -0xeeb0 -> U+92a7 -> 0xfbcc CJK Unified Ideograph -0xeeb1 -> U+9277 -> 0xfbcd CJK Unified Ideograph -0xeeb2 -> U+9278 -> 0xfbce CJK Unified Ideograph -0xeeb3 -> U+92e7 -> 0xfbcf CJK Unified Ideograph -0xeeb4 -> U+92d7 -> 0xfbd0 CJK Unified Ideograph -0xeeb5 -> U+92d9 -> 0xfbd1 CJK Unified Ideograph -0xeeb6 -> U+92d0 -> 0xfbd2 CJK Unified Ideograph -0xeeb7 -> U+fa27 -> 0xfbd3 CJK compatibility Ideograph -0xeeb8 -> U+92d5 -> 0xfbd4 CJK Unified Ideograph -0xeeb9 -> U+92e0 -> 0xfbd5 CJK Unified Ideograph -0xeeba -> U+92d3 -> 0xfbd6 CJK Unified Ideograph -0xeebb -> U+9325 -> 0xfbd7 CJK Unified Ideograph -0xeebc -> U+9321 -> 0xfbd8 CJK Unified Ideograph -0xeebd -> U+92fb -> 0xfbd9 CJK Unified Ideograph -0xeebe -> U+fa28 -> 0xfbda CJK compatibility Ideograph -0xeebf -> U+931e -> 0xfbdb CJK Unified Ideograph -0xeec0 -> U+92ff -> 0xfbdc CJK Unified Ideograph -0xeec1 -> U+931d -> 0xfbdd CJK Unified Ideograph -0xeec2 -> U+9302 -> 0xfbde CJK Unified Ideograph -0xeec3 -> U+9370 -> 0xfbdf CJK Unified Ideograph -0xeec4 -> U+9357 -> 0xfbe0 CJK Unified Ideograph -0xeec5 -> U+93a4 -> 0xfbe1 CJK Unified Ideograph -0xeec6 -> U+93c6 -> 0xfbe2 CJK Unified Ideograph -0xeec7 -> U+93de -> 0xfbe3 CJK Unified Ideograph -0xeec8 -> U+93f8 -> 0xfbe4 CJK Unified Ideograph -0xeec9 -> U+9431 -> 0xfbe5 CJK Unified Ideograph -0xeeca -> U+9445 -> 0xfbe6 CJK Unified Ideograph -0xeecb -> U+9448 -> 0xfbe7 CJK Unified Ideograph -0xeecc -> U+9592 -> 0xfbe8 CJK Unified Ideograph -0xeecd -> U+f9dc -> 0xfbe9 CJK compatibility Ideograph -0xeece -> U+fa29 -> 0xfbea CJK compatibility Ideograph -0xeecf -> U+969d -> 0xfbeb CJK Unified Ideograph -0xeed0 -> U+96af -> 0xfbec CJK Unified Ideograph -0xeed1 -> U+9733 -> 0xfbed CJK Unified Ideograph -0xeed2 -> U+973b -> 0xfbee CJK Unified Ideograph -0xeed3 -> U+9743 -> 0xfbef CJK Unified Ideograph -0xeed4 -> U+974d -> 0xfbf0 CJK Unified Ideograph -0xeed5 -> U+974f -> 0xfbf1 CJK Unified Ideograph -0xeed6 -> U+9751 -> 0xfbf2 CJK Unified Ideograph -0xeed7 -> U+9755 -> 0xfbf3 CJK Unified Ideograph -0xeed8 -> U+9857 -> 0xfbf4 CJK Unified Ideograph -0xeed9 -> U+9865 -> 0xfbf5 CJK Unified Ideograph -0xeeda -> U+fa2a -> 0xfbf6 CJK compatibility Ideograph -0xeedb -> U+fa2b -> 0xfbf7 CJK compatibility Ideograph -0xeedc -> U+9927 -> 0xfbf8 CJK Unified Ideograph -0xeedd -> U+fa2c -> 0xfbf9 CJK compatibility Ideograph -0xeede -> U+999e -> 0xfbfa CJK Unified Ideograph -0xeedf -> U+9a4e -> 0xfbfb CJK Unified Ideograph -0xeee0 -> U+9ad9 -> 0xfbfc CJK Unified Ideograph -0xeee1 -> U+9adc -> 0xfc40 CJK Unified Ideograph -0xeee2 -> U+9b75 -> 0xfc41 CJK Unified Ideograph -0xeee3 -> U+9b72 -> 0xfc42 CJK Unified Ideograph -0xeee4 -> U+9b8f -> 0xfc43 CJK Unified Ideograph -0xeee5 -> U+9bb1 -> 0xfc44 CJK Unified Ideograph -0xeee6 -> U+9bbb -> 0xfc45 CJK Unified Ideograph -0xeee7 -> U+9c00 -> 0xfc46 CJK Unified Ideograph -0xeee8 -> U+9d70 -> 0xfc47 CJK Unified Ideograph -0xeee9 -> U+9d6b -> 0xfc48 CJK Unified Ideograph -0xeeea -> U+fa2d -> 0xfc49 CJK compatibility Ideograph -0xeeeb -> U+9e19 -> 0xfc4a CJK Unified Ideograph -0xeeec -> U+9ed1 -> 0xfc4b CJK Unified Ideograph -0xeeef -> U+2170 -> 0xfa40 Small Roman Numeral One -0xeef0 -> U+2171 -> 0xfa41 Small Roman Numeral Two -0xeef1 -> U+2172 -> 0xfa42 Small Roman Numeral Three -0xeef2 -> U+2173 -> 0xfa43 Small Roman Numeral Four -0xeef3 -> U+2174 -> 0xfa44 Small Roman Numeral Five -0xeef4 -> U+2175 -> 0xfa45 Small Roman Numeral Six -0xeef5 -> U+2176 -> 0xfa46 Small Roman Numeral Seven -0xeef6 -> U+2177 -> 0xfa47 Small Roman Numeral Eight -0xeef7 -> U+2178 -> 0xfa48 Small Roman Numeral Nine -0xeef8 -> U+2179 -> 0xfa49 Small Roman Numeral Ten -0xeef9 -> U+ffe2 -> 0x81ca Fullwidth Not Sign -0xeefa -> U+ffe4 -> 0xfa55 Fullwidth Broken Bar -0xeefb -> U+ff07 -> 0xfa56 Fullwidth Apostrophe -0xeefc -> U+ff02 -> 0xfa57 Fullwidth Quotation Mark -0xfa4a -> U+2160 -> 0x8754 Roman Numeral One -0xfa4b -> U+2161 -> 0x8755 Roman Numeral Two -0xfa4c -> U+2162 -> 0x8756 Roman Numeral Three -0xfa4d -> U+2163 -> 0x8757 Roman Numeral Four -0xfa4e -> U+2164 -> 0x8758 Roman Numeral Five -0xfa4f -> U+2165 -> 0x8759 Roman Numeral Six -0xfa50 -> U+2166 -> 0x875a Roman Numeral Seven -0xfa51 -> U+2167 -> 0x875b Roman Numeral Eight -0xfa52 -> U+2168 -> 0x875c Roman Numeral Nine -0xfa53 -> U+2169 -> 0x875d Roman Numeral Ten -0xfa54 -> U+ffe2 -> 0x81ca Fullwidth Not Sign -0xfa58 -> U+3231 -> 0x878a Parenthesized Ideograph Stock -0xfa59 -> U+2116 -> 0x8782 Numero Sign -0xfa5a -> U+2121 -> 0x8784 Telephone Sign -0xfa5b -> U+2235 -> 0x81e6 Because")) - (with-input-from-string (s kb170559) - (loop for line = (read-line s nil) until (null line) - do (let ((ucs (parse-integer (subseq line 14 18) :radix 16)) - (cp932 (parse-integer (subseq line 26 30) :radix 16))) - (setf (gethash ucs *ucs-to-cp932-hash*) cp932))))) - -(defun eucjp-to-ucs (code) - (values (gethash code *eucjp-to-ucs-hash*))) - -(defun ucs-to-eucjp (code) - (values (gethash code *ucs-to-eucjp-hash*))) - -(defun cp932-to-ucs (code) - (values (gethash code *cp932-to-ucs-hash*))) - -(defun ucs-to-cp932 (code) - (values (gethash code *ucs-to-cp932-hash*))) - -;;;; EUC-JP - -(define-character-encoding :eucjp - "An 8-bit, variable-length character encoding in which -character code points in the range #x00-#x7f can be encoded in a -single octet; characters with larger code values can be encoded -in 2 to 3 bytes." - :max-units-per-char 3 - :literal-char-code-limit #x80) - - -(define-octet-counter :eucjp (getter type) - `(named-lambda eucjp-octet-counter (seq start end max) - (declare (type ,type seq) (fixnum start end max)) - (loop with noctets fixnum = 0 - for i fixnum from start below end - for code of-type code-point = (,getter seq i) - do (let* ((c (ucs-to-eucjp code)) - (new (+ (cond ((< #xffff c) 3) - ((< #xff c) 2) - (t 1)) - noctets))) - (if (and (plusp max) (> new max)) - (loop-finish) - (setq noctets new))) - finally (return (values noctets i))))) - -(define-code-point-counter :eucjp (getter type) - `(named-lambda eucjp-code-point-counter (seq start end max) - (declare (type ,type seq) (fixnum start end max)) - (loop with nchars fixnum = 0 - with i fixnum = start - while (< i end) do - (let* ((octet (,getter seq i)) - (next-i (+ i (cond ((= #x8f octet) 3) - ((or (< #xa0 octet #xff) - (= #x8e octet)) 2) - (t 1))))) - (declare (type ub8 octet) (fixnum next-i)) - (cond ((> next-i end) - ;; Should we add restarts to this error, we'll have - ;; to figure out a way to communicate with the - ;; decoder since we probably want to do something - ;; about it right here when we have a chance to - ;; change the count or something. (Like an - ;; alternative replacement character or perhaps the - ;; existence of this error so that the decoder - ;; doesn't have to check for it on every iteration - ;; like we do.) - ;; - ;; FIXME: The data for this error is not right. - (decoding-error (vector octet) :eucjp seq i - nil 'end-of-input-in-character) - (return (values (1+ nchars) end))) - (t - (setq nchars (1+ nchars) - i next-i) - (when (and (plusp max) (= nchars max)) - (return (values nchars i)))))) - finally (progn (assert (= i end)) - (return (values nchars i)))))) - -(define-encoder :eucjp (getter src-type setter dest-type) - `(named-lambda eucjp-encoder (src start end dest d-start) - (declare (type ,src-type src) - (type ,dest-type dest) - (fixnum start end d-start)) - (loop with di fixnum = d-start - for i fixnum from start below end - for code of-type code-point = (,getter src i) - for eucjp of-type code-point - = (ucs-to-eucjp code) do - (macrolet ((set-octet (offset value) - `(,',setter ,value dest (the fixnum (+ di ,offset))))) - (cond - ;; 1 octet - ((< eucjp #x100) - (set-octet 0 eucjp) - (incf di)) - ;; 2 octets - ((< eucjp #x10000) - (set-octet 0 (f-logand #xff (f-ash eucjp -8))) - (set-octet 1 (logand eucjp #xff)) - (incf di 2)) - ;; 3 octets - (t - (set-octet 0 (f-logand #xff (f-ash eucjp -16))) - (set-octet 1 (f-logand #xff (f-ash eucjp -8))) - (set-octet 2 (logand eucjp #xff)) - (incf di 3)) - )) - finally (return (the fixnum (- di d-start)))))) - - -(define-decoder :eucjp (getter src-type setter dest-type) - `(named-lambda eucjp-decoder (src start end dest d-start) - (declare (type ,src-type src) - (type ,dest-type dest) - (fixnum start end d-start)) - (let ((u2 0)) - (declare (type ub8 u2)) - (loop for di fixnum from d-start - for i fixnum from start below end - for u1 of-type ub8 = (,getter src i) do - ;; Note: CONSUME-OCTET doesn't check if I is being - ;; incremented past END. We're assuming that END has - ;; been calculated with the CODE-POINT-POINTER above that - ;; checks this. - (macrolet - ((consume-octet () - `(let ((next-i (incf i))) - (if (= next-i end) - ;; FIXME: data for this error is incomplete. - ;; and signalling this error twice - (return-from setter-block - (decoding-error nil :eucjp src i +repl+ - 'end-of-input-in-character)) - (,',getter src next-i)))) - (handle-error (n &optional (c 'character-decoding-error)) - `(decoding-error - (vector ,@(subseq '(u1 u2) 0 n)) - :eucjp src (1+ (- i ,n)) +repl+ ',c)) - (handle-error-if-icb (var n) - `(when (not (< #x7f ,var #xc0)) - (decf i) - (return-from setter-block - (handle-error ,n invalid-utf8-continuation-byte))))) - (,setter - (block setter-block - (cond - ;; 3 octets - ((= u1 #x8f) - (setq u2 (consume-octet)) - (eucjp-to-ucs (logior #x8f0000 - (f-ash u2 8) - (consume-octet)))) - ;; 2 octets - ((or (= u1 #x8e) - (< #xa0 u1 #xff)) - (eucjp-to-ucs (logior (f-ash u1 8) - (consume-octet)))) - ;; 1 octet - (t - (eucjp-to-ucs u1)))) - dest di)) - finally (return (the fixnum (- di d-start))))))) - -;;;; CP932 - -(define-character-encoding :cp932 - "An 8-bit, variable-length character encoding in which -character code points in the range #x00-#x7f can be encoded in a -single octet; characters with larger code values can be encoded -in 2 bytes." - :max-units-per-char 2 - :literal-char-code-limit #x80) - - -(define-octet-counter :cp932 (getter type) - `(named-lambda cp932-octet-counter (seq start end max) - (declare (type ,type seq) (fixnum start end max)) - (loop with noctets fixnum = 0 - for i fixnum from start below end - for code of-type code-point = (,getter seq i) - do (let* ((c (ucs-to-cp932 code)) - (new (+ (cond ((< #xff c) 2) - (t 1)) - noctets))) - (if (and (plusp max) (> new max)) - (loop-finish) - (setq noctets new))) - finally (return (values noctets i))))) - -(define-code-point-counter :cp932 (getter type) - `(named-lambda cp932-code-point-counter (seq start end max) - (declare (type ,type seq) (fixnum start end max)) - (loop with nchars fixnum = 0 - with i fixnum = start - while (< i end) do - (let* ((octet (,getter seq i)) - (next-i (+ i (cond ((or (<= #x81 octet #x9f) - (<= #xe0 octet #xfc)) - 2) - (t 1))))) - (declare (type ub8 octet) (fixnum next-i)) - (cond ((> next-i end) - ;; Should we add restarts to this error, we'll have - ;; to figure out a way to communicate with the - ;; decoder since we probably want to do something - ;; about it right here when we have a chance to - ;; change the count or something. (Like an - ;; alternative replacement character or perhaps the - ;; existence of this error so that the decoder - ;; doesn't have to check for it on every iteration - ;; like we do.) - ;; - ;; FIXME: The data for this error is not right. - (decoding-error (vector octet) :cp932 seq i - nil 'end-of-input-in-character) - (return (values (1+ nchars) end))) - (t - (setq nchars (1+ nchars) - i next-i) - (when (and (plusp max) (= nchars max)) - (return (values nchars i)))))) - finally (progn (assert (= i end)) - (return (values nchars i)))))) - -(define-encoder :cp932 (getter src-type setter dest-type) - `(named-lambda cp932-encoder (src start end dest d-start) - (declare (type ,src-type src) - (type ,dest-type dest) - (fixnum start end d-start)) - (loop with di fixnum = d-start - for i fixnum from start below end - for code of-type code-point = (,getter src i) - for cp932 of-type code-point - = (ucs-to-cp932 code) do - (macrolet ((set-octet (offset value) - `(,',setter ,value dest (the fixnum (+ di ,offset))))) - (cond - ;; 1 octet - ((< cp932 #x100) - (set-octet 0 cp932) - (incf di)) - ;; 2 octets - ((< cp932 #x10000) - (set-octet 0 (f-logand #xff (f-ash cp932 -8))) - (set-octet 1 (logand cp932 #xff)) - (incf di 2)) - ;; 3 octets - (t - (set-octet 0 (f-logand #xff (f-ash cp932 -16))) - (set-octet 1 (f-logand #xff (f-ash cp932 -8))) - (set-octet 2 (logand cp932 #xff)) - (incf di 3)) - )) - finally (return (the fixnum (- di d-start)))))) - - -(define-decoder :cp932 (getter src-type setter dest-type) - `(named-lambda cp932-decoder (src start end dest d-start) - (declare (type ,src-type src) - (type ,dest-type dest) - (fixnum start end d-start)) - (let ((u2 0)) - (declare (type ub8 u2)) - (loop for di fixnum from d-start - for i fixnum from start below end - for u1 of-type ub8 = (,getter src i) do - ;; Note: CONSUME-OCTET doesn't check if I is being - ;; incremented past END. We're assuming that END has - ;; been calculated with the CODE-POINT-POINTER above that - ;; checks this. - (macrolet - ((consume-octet () - `(let ((next-i (incf i))) - (if (= next-i end) - ;; FIXME: data for this error is incomplete. - ;; and signalling this error twice - (return-from setter-block - (decoding-error nil :cp932 src i +repl+ - 'end-of-input-in-character)) - (,',getter src next-i)))) - (handle-error (n &optional (c 'character-decoding-error)) - `(decoding-error - (vector ,@(subseq '(u1 u2) 0 n)) - :cp932 src (1+ (- i ,n)) +repl+ ',c)) - (handle-error-if-icb (var n) - `(when (not (< #x7f ,var #xc0)) - (decf i) - (return-from setter-block - (handle-error ,n invalid-utf8-continuation-byte))))) - (,setter - (block setter-block - (cond - ;; 2 octets - ((or (<= #x81 u1 #x9f) - (<= #xe0 u1 #xfc)) - (setq u2 (consume-octet)) - (cp932-to-ucs (logior (f-ash u1 8) - u2))) - ;; 1 octet - (t - (cp932-to-ucs u1)))) - dest di)) - finally (return (the fixnum (- di d-start))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-koi8.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-koi8.lisp deleted file mode 100644 index 6f9f5db..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-koi8.lisp +++ /dev/null @@ -1,577 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; enc-cp1251.lisp --- Implementation of the CP1251 character encoding. -;;; -;;; Copyright (C) 2009, Andrey Moskvitin -;;; -;;; 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. - -(in-package #:babel-encodings) - -(define-character-encoding :koi8-ru - "An 8-bit, fixed-width character Russian encoding." - :literal-char-code-limit #x80) - -(define-constant +koi8-ru-to-unicode+ - #(#x2500 #x2502 #x250C #x2510 #x2514 #x2518 #x251C #x2524 - #x252C #x2534 #x253C #x2580 #x2584 #x2588 #x258C #x2590 - #x2591 #x2592 #x2593 #x2320 #x25A0 #x2219 #x221A #x2248 - #x2264 #x2265 #x00A0 #x2321 #x00B0 #x00B2 #x00B7 #x00F7 - #x2550 #x2551 #x2552 #x0451 #x0454 #x2554 #x0456 #x0457 - #x2557 #x2558 #x2559 #x255A #x255B #x0491 #x045E #x255E - #x255F #x2560 #x2561 #x0401 #x0404 #x2563 #x0406 #x0407 - #x2566 #x2567 #x2568 #x2569 #x256A #x0490 #x040E #x00A9 - #x044E #x0430 #x0431 #x0446 #x0434 #x0435 #x0444 #x0433 - #x0445 #x0438 #x0439 #x043A #x043B #x043C #x043D #x043E - #x043F #x044F #x0440 #x0441 #x0442 #x0443 #x0436 #x0432 - #x044C #x044B #x0437 #x0448 #x044D #x0449 #x0447 #x044A - #x042E #x0410 #x0411 #x0426 #x0414 #x0415 #x0424 #x0413 - #x0425 #x0418 #x0419 #x041A #x041B #x041C #x041D #x041E - #x041F #x042F #x0420 #x0421 #x0422 #x0423 #x0416 #x0412 - #x042C #x042B #x0417 #x0428 #x042D #x0429 #x0427 #x042A) - :test #'equalp) - -(define-unibyte-decoder :koi8-ru (octet) - (if (< octet #x80) - octet - (svref +koi8-ru-to-unicode+ (the ub8 (- octet #x80))))) - -(define-constant +unicode-04->koi8-ru+ - #(#x7f #x79 #x78 #x7c #x60 #x71 #x41 #x42 #x57 #x47 #x44 #x45 #x56 #x5a - #x49 #x4a #x4b #x4c #x4d #x4e #x4f #x50 #x52 #x53 #x54 #x55 #x46 #x48 - #x43 #x5e #x5b #x5d #x5f #x59 #x58 #x5c #x40 #x51 nil #x23 nil nil #x24 - nil #x26 #x27 nil nil nil nil nil nil #x2e nil nil nil nil nil nil nil - nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil - nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil - nil nil nil nil nil nil #x3d #x2d) - :test 'equalp) - -(define-unibyte-encoder :koi8-ru (code) - (or (and (< code #x80) code) - (let ((hi (ldb (byte 8 8) code)) - (lo (ldb (byte 8 0) code))) - (case hi - (#x4 - (case lo - (#x1 #xb3) - (#x4 #xb4) - (#x6 #xb6) - (#x7 #xb7) - (#xe #xbe) - (#x10 #xe1) - (#x11 #xe2) - (#x12 #xf7) - (#x13 #xe7) - (#x14 #xe4) - (#x15 #xe5) - (#x16 #xf6) - (#x17 #xfa) - (#x18 #xe9) - (#x19 #xea) - (#x1a #xeb) - (#x1b #xec) - (#x1c #xed) - (#x1d #xee) - (#x1e #xef) - (#x1f #xf0) - (#x20 #xf2) - (#x21 #xf3) - (#x22 #xf4) - (#x23 #xf5) - (#x24 #xe6) - (#x25 #xe8) - (#x26 #xe3) - (#x27 #xfe) - (#x28 #xfb) - (#x29 #xfd) - (#x2a #xff) - (#x2b #xf9) - (#x2c #xf8) - (#x2d #xfc) - (#x2e #xe0) - (#x2f #xf1) - (#x30 #xc1) - (#x31 #xc2) - (#x32 #xd7) - (#x33 #xc7) - (#x34 #xc4) - (#x35 #xc5) - (#x36 #xd6) - (#x37 #xda) - (#x38 #xc9) - (#x39 #xca) - (#x3a #xcb) - (#x3b #xcc) - (#x3c #xcd) - (#x3d #xce) - (#x3e #xcf) - (#x3f #xd0) - (#x40 #xd2) - (#x41 #xd3) - (#x42 #xd4) - (#x43 #xd5) - (#x44 #xc6) - (#x45 #xc8) - (#x46 #xc3) - (#x47 #xde) - (#x48 #xdb) - (#x49 #xdd) - (#x4a #xdf) - (#x4b #xd9) - (#x4c #xd8) - (#x4d #xdc) - (#x4e #xc0) - (#x4f #xd1) - (#x51 #xa3) - (#x54 #xa4) - (#x56 #xa6) - (#x57 #xa7) - (#x5e #xae) - (#x90 #xbd) - (#x91 #xad))) - (#x0 - (case lo - (#xa0 #x9a) - (#xa9 #xbf) - (#xb0 #x9c) - (#xb2 #x9d) - (#xb7 #x9e) - (#xf7 #x9f))) - (#x22 (case lo (#x19 #x95) (#x1a #x96) (#x48 #x97) (#x64 #x98) (#x65 #x99))) - (#x23 (case lo (#x20 #x93) (#x21 #x9b))) - (#x25 - (case lo - (#x0 #x80) - (#x2 #x81) - (#xc #x82) - (#x10 #x83) - (#x14 #x84) - (#x18 #x85) - (#x1c #x86) - (#x24 #x87) - (#x2c #x88) - (#x34 #x89) - (#x3c #x8a) - (#x50 #xa0) - (#x51 #xa1) - (#x52 #xa2) - (#x54 #xa5) - (#x57 #xa8) - (#x58 #xa9) - (#x59 #xaa) - (#x5a #xab) - (#x5b #xac) - (#x5e #xaf) - (#x5f #xb0) - (#x60 #xb1) - (#x61 #xb2) - (#x63 #xb5) - (#x66 #xb8) - (#x67 #xb9) - (#x68 #xba) - (#x69 #xbb) - (#x6a #xbc) - (#x80 #x8b) - (#x84 #x8c) - (#x88 #x8d) - (#x8c #x8e) - (#x90 #x8f) - (#x91 #x90) - (#x92 #x91) - (#x93 #x92) - (#xa0 #x94))))) - (handle-error))) - -(define-character-encoding :koi8-r - "An 8-bit, fixed-width character Russian encoding." - :literal-char-code-limit #x80) - -(define-constant +koi8-r-to-unicode+ - #(#x2500 #x2502 #x250C #x2510 #x2514 #x2518 #x251C #x2524 - #x252C #x2534 #x253C #x2580 #x2584 #x2588 #x258C #x2590 - #x2591 #x2592 #x2593 #x2320 #x25A0 #x2219 #x221A #x2248 - #x2264 #x2265 #x00A0 #x2321 #x00B0 #x00B2 #x00B7 #x00F7 - #x2550 #x2551 #x2552 #x0451 #x2553 #x2554 #x2555 #x2556 - #x2557 #x2558 #x2559 #x255A #x255B #x255C #x255D #x255E - #x255F #x2560 #x2561 #x0401 #x2562 #x2563 #x2564 #x2565 - #x2566 #x2567 #x2568 #x2569 #x256A #x256B #x256C #x00A9 - #x044E #x0430 #x0431 #x0446 #x0434 #x0435 #x0444 #x0433 - #x0445 #x0438 #x0439 #x043A #x043B #x043C #x043D #x043E - #x043F #x044F #x0440 #x0441 #x0442 #x0443 #x0436 #x0432 - #x044C #x044B #x0437 #x0448 #x044D #x0449 #x0447 #x044A - #x042E #x0410 #x0411 #x0426 #x0414 #x0415 #x0424 #x0413 - #x0425 #x0418 #x0419 #x041A #x041B #x041C #x041D #x041E - #x041F #x042F #x0420 #x0421 #x0422 #x0423 #x0416 #x0412 - #x042C #x042B #x0417 #x0428 #x042D #x0429 #x0427 #x042A) - :test #'equalp) - -(define-unibyte-decoder :koi8-r (octet) - (if (< octet #x80) - octet - (svref +koi8-r-to-unicode+ (the ub8 (- octet #x80))))) - -(define-constant +unicode-x04->koi8-r+ - #(nil #x33 nil nil nil nil nil nil nil nil nil nil nil nil nil nil #x61 - #x62 #x77 #x67 #x64 #x65 #x76 #x7a #x69 #x6a #x6b #x6c #x6d #x6e #x6f - #x70 #x72 #x73 #x74 #x75 #x66 #x68 #x63 #x7e #x7b #x7d #x7f #x79 #x78 - #x7c #x60 #x71 #x41 #x42 #x57 #x47 #x44 #x45 #x56 #x5a #x49 #x4a #x4b - #x4c #x4d #x4e #x4f #x50 #x52 #x53 #x54 #x55 #x46 #x48 #x43 #x5e #x5b - #x5d #x5f #x59 #x58 #x5c #x40 #x51 nil #x23) - :test 'equalp) - -(define-constant +unicode-x25->koi8-r+ - #(#x0 nil #x1 nil nil nil nil nil nil nil nil nil #x2 nil nil nil #x3 nil - nil nil #x4 nil nil nil #x5 nil nil nil #x6 nil nil nil nil nil nil nil - #x7 nil nil nil nil nil nil nil #x8 nil nil nil nil nil nil nil #x9 nil - nil nil nil nil nil nil #xa nil nil nil nil nil nil nil nil nil nil nil - nil nil nil nil nil nil nil nil #x20 #x21 #x22 #x24 #x25 #x26 #x27 #x28 - #x29 #x2a #x2b #x2c #x2d #x2e #x2f #x30 #x31 #x32 #x34 #x35 #x36 #x37 - #x38 #x39 #x3a #x3b #x3c #x3d #x3e nil nil nil nil nil nil nil nil nil - nil nil nil nil nil nil nil nil nil nil #xb nil nil nil #xc nil nil nil - #xd nil nil nil #xe nil nil nil #xf #x10 #x11 #x12 nil nil nil nil nil - nil nil nil nil nil nil nil #x14) - :test 'equalp) - -(define-unibyte-encoder :koi8-r (code) - (or (and (< code #x80) code) - (let ((hi (ldb (byte 8 8) code)) - (lo (ldb (byte 8 0) code))) - (case hi - (#x4 - (case lo - (#x1 #xb3) - (#x10 #xe1) - (#x11 #xe2) - (#x12 #xf7) - (#x13 #xe7) - (#x14 #xe4) - (#x15 #xe5) - (#x16 #xf6) - (#x17 #xfa) - (#x18 #xe9) - (#x19 #xea) - (#x1a #xeb) - (#x1b #xec) - (#x1c #xed) - (#x1d #xee) - (#x1e #xef) - (#x1f #xf0) - (#x20 #xf2) - (#x21 #xf3) - (#x22 #xf4) - (#x23 #xf5) - (#x24 #xe6) - (#x25 #xe8) - (#x26 #xe3) - (#x27 #xfe) - (#x28 #xfb) - (#x29 #xfd) - (#x2a #xff) - (#x2b #xf9) - (#x2c #xf8) - (#x2d #xfc) - (#x2e #xe0) - (#x2f #xf1) - (#x30 #xc1) - (#x31 #xc2) - (#x32 #xd7) - (#x33 #xc7) - (#x34 #xc4) - (#x35 #xc5) - (#x36 #xd6) - (#x37 #xda) - (#x38 #xc9) - (#x39 #xca) - (#x3a #xcb) - (#x3b #xcc) - (#x3c #xcd) - (#x3d #xce) - (#x3e #xcf) - (#x3f #xd0) - (#x40 #xd2) - (#x41 #xd3) - (#x42 #xd4) - (#x43 #xd5) - (#x44 #xc6) - (#x45 #xc8) - (#x46 #xc3) - (#x47 #xde) - (#x48 #xdb) - (#x49 #xdd) - (#x4a #xdf) - (#x4b #xd9) - (#x4c #xd8) - (#x4d #xdc) - (#x4e #xc0) - (#x4f #xd1) - (#x51 #xa3))) - (#x0 - (case lo - (#xa0 #x9a) - (#xa9 #xbf) - (#xb0 #x9c) - (#xb2 #x9d) - (#xb7 #x9e) - (#xf7 #x9f))) - (#x22 (case lo (#x19 #x95) (#x1a #x96) (#x48 #x97) (#x64 #x98) (#x65 #x99))) - (#x23 (case lo (#x20 #x93) (#x21 #x9b))) - (#x25 - (case lo - (#x0 #x80) - (#x2 #x81) - (#xc #x82) - (#x10 #x83) - (#x14 #x84) - (#x18 #x85) - (#x1c #x86) - (#x24 #x87) - (#x2c #x88) - (#x34 #x89) - (#x3c #x8a) - (#x50 #xa0) - (#x51 #xa1) - (#x52 #xa2) - (#x53 #xa4) - (#x54 #xa5) - (#x55 #xa6) - (#x56 #xa7) - (#x57 #xa8) - (#x58 #xa9) - (#x59 #xaa) - (#x5a #xab) - (#x5b #xac) - (#x5c #xad) - (#x5d #xae) - (#x5e #xaf) - (#x5f #xb0) - (#x60 #xb1) - (#x61 #xb2) - (#x62 #xb4) - (#x63 #xb5) - (#x64 #xb6) - (#x65 #xb7) - (#x66 #xb8) - (#x67 #xb9) - (#x68 #xba) - (#x69 #xbb) - (#x6a #xbc) - (#x6b #xbd) - (#x6c #xbe) - (#x80 #x8b) - (#x84 #x8c) - (#x88 #x8d) - (#x8c #x8e) - (#x90 #x8f) - (#x91 #x90) - (#x92 #x91) - (#x93 #x92) - (#xa0 #x94))))) - (handle-error))) - -(define-character-encoding :koi8-u - "An 8-bit, fixed-width character Ukranian encoding." - :literal-char-code-limit #x80) - -(define-constant +koi8-u-to-unicode+ - #(#x2500 #x2502 #x250C #x2510 #x2514 #x2518 #x251C #x2524 - #x252C #x2534 #x253C #x2580 #x2584 #x2588 #x258C #x2590 - #x2591 #x2592 #x2593 #x2320 #x25A0 #x2219 #x221A #x2248 - #x2264 #x2265 #x00A0 #x2321 #x00B0 #x00B2 #x00B7 #x00F7 - #x2550 #x2551 #x2552 #x0451 #x0454 #x2554 #x0456 #x0457 - #x2557 #x2558 #x2559 #x255A #x255B #x0491 #x255D #x255E - #x255F #x2560 #x2561 #x0401 #x0404 #x2563 #x0406 #x0407 - #x2566 #x2567 #x2568 #x2569 #x256A #x0490 #x256C #x00A9 - #x044E #x0430 #x0431 #x0446 #x0434 #x0435 #x0444 #x0433 - #x0445 #x0438 #x0439 #x043A #x043B #x043C #x043D #x043E - #x043F #x044F #x0440 #x0441 #x0442 #x0443 #x0436 #x0432 - #x044C #x044B #x0437 #x0448 #x044D #x0449 #x0447 #x044A - #x042E #x0410 #x0411 #x0426 #x0414 #x0415 #x0424 #x0413 - #x0425 #x0418 #x0419 #x041A #x041B #x041C #x041D #x041E - #x041F #x042F #x0420 #x0421 #x0422 #x0423 #x0416 #x0412 - #x042C #x042B #x0417 #x0428 #x042D #x0429 #x0427 #x042A ) - :test #'equalp) - -(define-unibyte-decoder :koi8-u (octet) - (if (< octet #x80) - octet - (svref +koi8-u-to-unicode+ (the ub8 (- octet #x80))))) - -(define-constant +unicode-x04->koi8-u+ - #(nil #x33 nil nil #x34 nil #x36 #x37 nil nil nil nil nil nil nil nil #x61 - #x62 #x77 #x67 #x64 #x65 #x76 #x7a #x69 #x6a #x6b #x6c #x6d #x6e #x6f - #x70 #x72 #x73 #x74 #x75 #x66 #x68 #x63 #x7e #x7b #x7d #x7f #x79 #x78 - #x7c #x60 #x71 #x41 #x42 #x57 #x47 #x44 #x45 #x56 #x5a #x49 #x4a #x4b - #x4c #x4d #x4e #x4f #x50 #x52 #x53 #x54 #x55 #x46 #x48 #x43 #x5e #x5b - #x5d #x5f #x59 #x58 #x5c #x40 #x51 nil #x23 nil nil #x24 nil #x26 #x27 - nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil - nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil - nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil - nil nil #x3d #x2d) - :test 'equalp) - -(define-constant +unicode-x25->koi8-u+ - #(#x0 nil #x1 nil nil nil nil nil nil nil nil nil #x2 nil nil nil #x3 nil - nil nil #x4 nil nil nil #x5 nil nil nil #x6 nil nil nil nil nil nil nil - #x7 nil nil nil nil nil nil nil #x8 nil nil nil nil nil nil nil #x9 nil - nil nil nil nil nil nil #xa nil nil nil nil nil nil nil nil nil nil nil - nil nil nil nil nil nil nil nil #x20 #x21 #x22 nil #x25 nil nil #x28 - #x29 #x2a #x2b #x2c nil #x2e #x2f #x30 #x31 #x32 nil #x35 nil nil #x38 - #x39 #x3a #x3b #x3c nil #x3e nil nil nil nil nil nil nil nil nil nil nil - nil nil nil nil nil nil nil nil #xb nil nil nil #xc nil nil nil #xd nil - nil nil #xe nil nil nil #xf #x10 #x11 #x12 nil nil nil nil nil nil nil - nil nil nil nil nil #x14) - :test 'equalp) - -(define-unibyte-encoder :koi8-u (code) - (or (and (< code #x80) code) - (let ((hi (ldb (byte 8 8) code)) - (lo (ldb (byte 8 0) code))) - (case hi - (#x4 - (case lo - (#x1 #xb3) - (#x4 #xb4) - (#x6 #xb6) - (#x7 #xb7) - (#x10 #xe1) - (#x11 #xe2) - (#x12 #xf7) - (#x13 #xe7) - (#x14 #xe4) - (#x15 #xe5) - (#x16 #xf6) - (#x17 #xfa) - (#x18 #xe9) - (#x19 #xea) - (#x1a #xeb) - (#x1b #xec) - (#x1c #xed) - (#x1d #xee) - (#x1e #xef) - (#x1f #xf0) - (#x20 #xf2) - (#x21 #xf3) - (#x22 #xf4) - (#x23 #xf5) - (#x24 #xe6) - (#x25 #xe8) - (#x26 #xe3) - (#x27 #xfe) - (#x28 #xfb) - (#x29 #xfd) - (#x2a #xff) - (#x2b #xf9) - (#x2c #xf8) - (#x2d #xfc) - (#x2e #xe0) - (#x2f #xf1) - (#x30 #xc1) - (#x31 #xc2) - (#x32 #xd7) - (#x33 #xc7) - (#x34 #xc4) - (#x35 #xc5) - (#x36 #xd6) - (#x37 #xda) - (#x38 #xc9) - (#x39 #xca) - (#x3a #xcb) - (#x3b #xcc) - (#x3c #xcd) - (#x3d #xce) - (#x3e #xcf) - (#x3f #xd0) - (#x40 #xd2) - (#x41 #xd3) - (#x42 #xd4) - (#x43 #xd5) - (#x44 #xc6) - (#x45 #xc8) - (#x46 #xc3) - (#x47 #xde) - (#x48 #xdb) - (#x49 #xdd) - (#x4a #xdf) - (#x4b #xd9) - (#x4c #xd8) - (#x4d #xdc) - (#x4e #xc0) - (#x4f #xd1) - (#x51 #xa3) - (#x54 #xa4) - (#x56 #xa6) - (#x57 #xa7) - (#x90 #xbd) - (#x91 #xad))) - (#x0 - (case lo - (#xa0 #x9a) - (#xa9 #xbf) - (#xb0 #x9c) - (#xb2 #x9d) - (#xb7 #x9e) - (#xf7 #x9f))) - (#x22 (case lo (#x19 #x95) (#x1a #x96) (#x48 #x97) (#x64 #x98) (#x65 #x99))) - (#x23 (case lo (#x20 #x93) (#x21 #x9b))) - (#x25 - (case lo - (#x0 #x80) - (#x2 #x81) - (#xc #x82) - (#x10 #x83) - (#x14 #x84) - (#x18 #x85) - (#x1c #x86) - (#x24 #x87) - (#x2c #x88) - (#x34 #x89) - (#x3c #x8a) - (#x50 #xa0) - (#x51 #xa1) - (#x52 #xa2) - (#x54 #xa5) - (#x57 #xa8) - (#x58 #xa9) - (#x59 #xaa) - (#x5a #xab) - (#x5b #xac) - (#x5d #xae) - (#x5e #xaf) - (#x5f #xb0) - (#x60 #xb1) - (#x61 #xb2) - (#x63 #xb5) - (#x66 #xb8) - (#x67 #xb9) - (#x68 #xba) - (#x69 #xbb) - (#x6a #xbc) - (#x6c #xbe) - (#x80 #x8b) - (#x84 #x8c) - (#x88 #x8d) - (#x8c #x8e) - (#x90 #x8f) - (#x91 #x90) - (#x92 #x91) - (#x93 #x92) - (#xa0 #x94))))) - (handle-error))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-unicode.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-unicode.lisp deleted file mode 100644 index f4e4ecf..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-unicode.lisp +++ /dev/null @@ -1,881 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; enc-unicode.lisp --- Unicode encodings. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -;;; This implementation is largely based on OpenMCL's l1-unicode.lisp -;;; Copyright (C) 2006 Clozure Associates and contributors. - -(in-package #:babel-encodings) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defconstant +repl+ #xfffd "Unicode replacement character code point.") - (defconstant +byte-order-mark-code+ #xfeff) - (defconstant +swapped-byte-order-mark-code+ #xfffe) - (defconstant +swapped-byte-order-mark-code-32+ #xfffe0000)) - -;;; Some convenience macros adding FIXNUM declarations. -(defmacro f-ash (integer count) `(the fixnum (ash ,integer ,count))) -(defmacro f-logior (&rest integers) `(the fixnum (logior ,@integers))) -(defmacro f-logand (&rest integers) `(the fixnum (logand ,@integers))) -(defmacro f-logxor (&rest integers) `(the fixnum (logxor ,@integers))) - -;;;; UTF-8 - -(define-character-encoding :utf-8 - "An 8-bit, variable-length character encoding in which -character code points in the range #x00-#x7f can be encoded in a -single octet; characters with larger code values can be encoded -in 2 to 4 bytes." - :max-units-per-char 4 - :literal-char-code-limit #x80 - :bom-encoding #(#xef #xbb #xbf) - :default-replacement #xfffd) - -(define-condition invalid-utf8-starter-byte (character-decoding-error) - () - (:documentation "Signalled when an invalid UTF-8 starter byte is found.")) - -(define-condition invalid-utf8-continuation-byte (character-decoding-error) - () - (:documentation - "Signalled when an invalid UTF-8 continuation byte is found.")) - -(define-condition overlong-utf8-sequence (character-decoding-error) - () - (:documentation "Signalled upon overlong UTF-8 sequences.")) - -(define-octet-counter :utf-8 (getter type) - `(named-lambda utf-8-octet-counter (seq start end max) - (declare (type ,type seq) (fixnum start end max)) - (loop with noctets fixnum = 0 - for i fixnum from start below end - for code of-type code-point = (,getter seq i) do - (let ((new (+ (cond ((< code #x80) 1) - ((< code #x800) 2) - ((< code #x10000) 3) - (t 4)) - noctets))) - (if (and (plusp max) (> new max)) - (loop-finish) - (setq noctets new))) - finally (return (values noctets i))))) - -(define-code-point-counter :utf-8 (getter type) - `(named-lambda utf-8-code-point-counter (seq start end max) - (declare (type ,type seq) (fixnum start end max)) - (loop with nchars fixnum = 0 - with i fixnum = start - while (< i end) do - ;; check for invalid continuation bytes - (macrolet ((invalid-cb-p (n) - `(and (< (+ i ,n) end) - (not (< #x7f (,',getter seq (+ i ,n)) #xc0))))) - ;; wrote this code with LET instead of FOR because CLISP's - ;; LOOP doesn't like WHILE clauses before FOR clauses. - (let* ((octet (,getter seq i)) - (next-i (+ i (cond ((or (< octet #xc0) (invalid-cb-p 1)) 1) - ((or (< octet #xe0) (invalid-cb-p 2)) 2) - ((or (< octet #xf0) (invalid-cb-p 3)) 3) - ((or (< octet #xf8) (invalid-cb-p 4)) 4) - ((or (< octet #xfc) (invalid-cb-p 5)) 5) - (t 6))))) - (declare (type ub8 octet) (fixnum next-i)) - (cond - ((> next-i end) - ;; Should we add restarts to this error, we'll have - ;; to figure out a way to communicate with the - ;; decoder since we probably want to do something - ;; about it right here when we have a chance to - ;; change the count or something. (Like an - ;; alternative replacement character or perhaps the - ;; existence of this error so that the decoder - ;; doesn't have to check for it on every iteration - ;; like we do.) - ;; - ;; FIXME: The data for this error is not right. - (decoding-error (vector octet) :utf-8 seq i - nil 'end-of-input-in-character) - (return (values (1+ nchars) end))) - (t - (setq nchars (1+ nchars) - i next-i) - (when (and (plusp max) (= nchars max)) - (return (values nchars i))))))) - finally (progn - (assert (= i end)) - (return (values nchars i)))))) - -(define-encoder :utf-8 (getter src-type setter dest-type) - `(named-lambda utf-8-encoder (src start end dest d-start) - (declare (type ,src-type src) - (type ,dest-type dest) - (fixnum start end d-start)) - (loop with di fixnum = d-start - for i fixnum from start below end - for code of-type code-point = (,getter src i) do - (macrolet ((set-octet (offset value) - `(,',setter ,value dest (the fixnum (+ di ,offset))))) - (cond - ;; 1 octet - ((< code #x80) - (set-octet 0 code) - (incf di)) - ;; 2 octets - ((< code #x800) - (set-octet 0 (logior #xc0 (f-ash code -6))) - (set-octet 1 (logior #x80 (f-logand code #x3f))) - (incf di 2)) - ;; 3 octets - ((< code #x10000) - (set-octet 0 (logior #xe0 (f-ash code -12))) - (set-octet 1 (logior #x80 (f-logand #x3f (f-ash code -6)))) - (set-octet 2 (logior #x80 (f-logand code #x3f))) - (incf di 3)) - ;; 4 octets - (t - (set-octet 0 (logior #xf0 (f-logand #x07 (f-ash code -18)))) - (set-octet 1 (logior #x80 (f-logand #x3f (f-ash code -12)))) - (set-octet 2 (logior #x80 (f-logand #x3f (f-ash code -6)))) - (set-octet 3 (logior #x80 (logand code #x3f))) - (incf di 4)))) - finally (return (the fixnum (- di d-start)))))) - -(define-decoder :utf-8 (getter src-type setter dest-type) - `(named-lambda utf-8-decoder (src start end dest d-start) - (declare (type ,src-type src) - (type ,dest-type dest) - (fixnum start end d-start)) - (let ((u2 0) (u3 0) (u4 0) (u5 0) (u6 0)) - (declare (type ub8 u2 u3 u4 u5 u6)) - (loop for di fixnum from d-start - for i fixnum from start below end - for u1 of-type ub8 = (,getter src i) do - ;; Note: CONSUME-OCTET doesn't check if I is being - ;; incremented past END. We're assuming that END has - ;; been calculated with the CODE-POINT-POINTER above that - ;; checks this. - (macrolet - ((consume-octet () - `(let ((next-i (incf i))) - (if (= next-i end) - ;; FIXME: data for this error is incomplete. - ;; and signalling this error twice - (return-from setter-block - (decoding-error nil :utf-8 src i +repl+ - 'end-of-input-in-character)) - (,',getter src next-i)))) - (handle-error (n &optional (c 'character-decoding-error)) - `(decoding-error - (vector ,@(subseq '(u1 u2 u3 u4 u5 u6) 0 n)) - :utf-8 src (1+ (- i ,n)) +repl+ ',c)) - (handle-error-if-icb (var n) - `(when (not (< #x7f ,var #xc0)) - (decf i) - (return-from setter-block - (handle-error ,n invalid-utf8-continuation-byte))))) - (,setter - (block setter-block - (cond - ((< u1 #x80) u1) ; 1 octet - ((< u1 #xc0) - (handle-error 1 invalid-utf8-starter-byte)) - (t - (setq u2 (consume-octet)) - (handle-error-if-icb u2 1) - (cond - ((< u1 #xc2) - (handle-error 2 overlong-utf8-sequence)) - ((< u1 #xe0) ; 2 octets - (logior (f-ash (f-logand #x1f u1) 6) - (f-logxor u2 #x80))) - (t - (setq u3 (consume-octet)) - (handle-error-if-icb u3 2) - (cond - ((and (= u1 #xe0) (< u2 #xa0)) - (handle-error 3 overlong-utf8-sequence)) - ((< u1 #xf0) ; 3 octets - (let ((start (f-logior (f-ash (f-logand u1 #x0f) 12) - (f-ash (f-logand u2 #x3f) 6)))) - (if (<= #xd800 start #xdfc0) - (handle-error 3 character-out-of-range) - (logior start (f-logand u3 #x3f))))) - (t ; 4 octets - (setq u4 (consume-octet)) - (handle-error-if-icb u4 3) - (cond - ((and (= u1 #xf0) (< u2 #x90)) - (handle-error 4 overlong-utf8-sequence)) - ((< u1 #xf8) - (if (or (> u1 #xf4) (and (= u1 #xf4) (> u2 #x8f))) - (handle-error 4 character-out-of-range) - (f-logior (f-ash (f-logand u1 7) 18) - (f-ash (f-logxor u2 #x80) 12) - (f-ash (f-logxor u3 #x80) 6) - (f-logxor u4 #x80)))) - ;; from here on we'll be getting either - ;; invalid continuation bytes or overlong - ;; 5-byte or 6-byte sequences. - (t - (setq u5 (consume-octet)) - (handle-error-if-icb u5 4) - (cond - ((and (= u1 #xf8) (< u2 #x88)) - (handle-error 5 overlong-utf8-sequence)) - ((< u1 #xfc) - (handle-error 5 character-out-of-range)) - (t - (setq u6 (consume-octet)) - (handle-error-if-icb u6 5) - (cond - ((and (= u1 #xfc) (< u2 #x84)) - (handle-error 6 overlong-utf8-sequence)) - (t - (handle-error 6 character-out-of-range) - ))))))))))))) - dest di)) - finally (return (the fixnum (- di d-start))))))) - -;;;; UTF-8B - -;;; The following excerpt from a linux-utf8 message by Markus Kuhn is -;;; the closest thing to a UTF-8B specification: -;;; -;;; -;;; -;;; "D) Emit a malformed UTF-16 sequence for every byte in a malformed -;;; UTF-8 sequence -;;; -;;; All the previous options for converting malformed UTF-8 sequences -;;; to UTF-16 destroy information. This can be highly undesirable in -;;; applications such as text file editors, where guaranteed binary -;;; transparency is a desireable feature. (E.g., I frequently edit -;;; executable code or graphic files with the Emacs text editor and I -;;; hate the idea that my editor might automatically make U+FFFD -;;; substitutions at locations that I haven't even edited when I save -;;; the file again.) -;;; -;;; I therefore suggested 1999-11-02 on the unicode@xxxxxxxxxxx -;;; mailing list the following approach. Instead of using U+FFFD, -;;; simply encode malformed UTF-8 sequences as malformed UTF-16 -;;; sequences. Malformed UTF-8 sequences consist excludively of the -;;; bytes 0x80 - 0xff, and each of these bytes can be represented -;;; using a 16-bit value from the UTF-16 low-half surrogate zone -;;; U+DC80 to U+DCFF. Thus, the overlong "K" (U+004B) 0xc1 0x8b from -;;; the above example would be represented in UTF-16 as U+DCC1 -;;; U+DC8B. If we simply make sure that every UTF-8 encoded surrogate -;;; character is also treated like a malformed sequence, then there -;;; is no way that a single high-half surrogate could precede the -;;; encoded malformed sequence and cause a valid UTF-16 sequence to -;;; emerge. -;;; -;;; This way 100% binary transparent UTF-8 -> UTF-16 -> UTF-8 -;;; round-trip compatibility can be achieved quite easily. -;;; -;;; On an output device, a lonely low-half surrogate character should -;;; be treated just like a character outside the adopted subset of -;;; representable characters, that is for the end user, the display -;;; would look exactly like with semantics B), i.e. one symbol per -;;; byte of a malformed sequence. However in contrast to semantics -;;; B), no information is thrown away, and a cut&paste in an editor -;;; or terminal emulator will be guaranteed to reconstruct the -;;; original byte sequence. This should greatly reduce the incidence -;;; of accidental corruption of binary data by UTF-8 -> UTF-16 -> -;;; UTF-8 conversion round trips." - -(define-character-encoding :utf-8b - "An 8-bit, variable-length character encoding in which -character code points in the range #x00-#x7f can be encoded in a -single octet; characters with larger code values can be encoded -in 2 to 4 bytes. Invalid UTF-8 sequences are encoded with #xDCXX -code points for each invalid byte." - :max-units-per-char 4 - :literal-char-code-limit #x80 - :bom-encoding #(#xef #xbb #xbf) - :default-replacement nil) - -;;; TODO: reuse the :UTF-8 octet counter through a simple macro. -(define-octet-counter :utf-8b (getter type) - `(named-lambda utf-8b-octet-counter (seq start end max) - (declare (type ,type seq) (fixnum start end max)) - (loop with noctets fixnum = 0 - for i fixnum from start below end - for code of-type code-point = (,getter seq i) do - (let ((new (+ (cond ((< code #x80) 1) - ((< code #x800) 2) - ((<= #xdc80 code #xdcff) 1) - ((< code #x10000) 3) - (t 4)) - noctets))) - (if (and (plusp max) (> new max)) - (loop-finish) - (setq noctets new))) - finally (return (values noctets i))))) - -(define-code-point-counter :utf-8b (getter type) - `(named-lambda utf-8b-code-point-counter (seq start end max) - (declare (type ,type seq) (fixnum start end max)) - (loop with nchars fixnum = 0 - with i fixnum = start - while (< i end) do - ;; wrote this code with LET instead of FOR because CLISP's - ;; LOOP doesn't like WHILE clauses before FOR clauses. - (let* ((octet (,getter seq i)) - (noctets (cond ((< octet #x80) 1) - ((< octet #xe0) 2) - ((< octet #xf0) 3) - (t 4)))) - (declare (type ub8 octet) (fixnum noctets)) - (cond - ((> (+ i noctets) end) - ;; If this error is suppressed these last few bytes - ;; will be encoded as raw bytes later. - (decoding-error (vector octet) :utf-8 seq i - nil 'end-of-input-in-character) - (return (values (+ nchars (- end i)) end))) - (t - ;; FIXME: clean this mess up. - (let* ((u1 octet) - (u2 (if (>= noctets 2) (,getter seq (1+ i)) 0)) - (u3 (if (>= noctets 3) (,getter seq (+ i 2)) 0)) - (u4 (if (= noctets 4) (,getter seq (+ i 3)) 0)) - (inc (or (and (> noctets 1) - (< u1 #xc2)) - (and (= noctets 2) - (not (logior u2 #x40))) - (and (= noctets 3) - (not (and (< (f-logxor u2 #x80) #x40) - (< (f-logxor u3 #x80) #x40) - (or (>= u1 #xe1) (>= u2 #xa0)) - (or (/= u1 #xed) (< u2 #xa0) (> u2 #xbf))))) - (and (= noctets 4) - (not - (and (< (f-logxor u2 #x80) #x40) - (< (f-logxor u3 #x80) #x40) - (< (f-logxor u4 #x80) #x40) - (or (>= u1 #xf1) (>= u2 #x90)))))))) - (let ((new-nchars (if inc (+ nchars noctets) (1+ nchars)))) - (when (and (plusp max) (> new-nchars max)) - (return (values nchars i))) - (incf i noctets) - (setq nchars new-nchars)))))) - finally (progn - (assert (= i end)) - (return (values nchars i)))))) - -;;; TODO: reuse the :UTF-8 encoder with through a simple macro. -(define-encoder :utf-8b (getter src-type setter dest-type) - `(named-lambda utf-8b-encoder (src start end dest d-start) - (declare (type ,src-type src) - (type ,dest-type dest) - (fixnum start end d-start)) - (loop with di fixnum = d-start - for i fixnum from start below end - for code of-type code-point = (,getter src i) do - (macrolet ((set-octet (offset value) - `(,',setter ,value dest (the fixnum (+ di ,offset))))) - (cond - ;; 1 octet - ((< code #x80) - (set-octet 0 code) - (incf di)) - ;; 2 octets - ((< code #x800) - (set-octet 0 (logior #xc0 (f-ash code -6))) - (set-octet 1 (logior #x80 (f-logand code #x3f))) - (incf di 2)) - ;; 1 octet (invalid octet) - ((<= #xdc80 code #xdcff) - (set-octet 0 (f-logand code #xff)) - (incf di)) - ;; 3 octets - ((< code #x10000) - (set-octet 0 (logior #xe0 (f-ash code -12))) - (set-octet 1 (logior #x80 (f-logand #x3f (f-ash code -6)))) - (set-octet 2 (logior #x80 (f-logand code #x3f))) - (incf di 3)) - ;; 4 octets - (t - (set-octet 0 (logior #xf0 (f-logand #x07 (f-ash code -18)))) - (set-octet 1 (logior #x80 (f-logand #x3f (f-ash code -12)))) - (set-octet 2 (logior #x80 (f-logand #x3f (f-ash code -6)))) - (set-octet 3 (logand #x3f code)) - (incf di 4)))) - finally (return (the fixnum (- di d-start)))))) - -(define-decoder :utf-8b (getter src-type setter dest-type) - `(named-lambda utf-8b-decoder (src start end dest d-start) - (declare (type ,src-type src) - (type ,dest-type dest) - (fixnum start end d-start)) - (let ((u2 0) (u3 0) (u4 0)) - (declare (type ub8 u2 u3 u4)) - (loop for di fixnum from d-start - for i fixnum from start below end - for u1 of-type ub8 = (,getter src i) do - ;; Unlike the UTF-8 version, this version of - ;; CONSUME-OCTET needs to check if I is being incremented - ;; past END because we might have trailing binary - ;; garbage. - (macrolet - ((consume-octet (n) - `(if (= i (1- end)) - (encode-raw-octets ,n) - (,',getter src (incf i)))) - (encode-raw-octets (n) - `(progn - ,@(loop for i below n and var in '(u1 u2 u3 u4) - collect `(,',setter (logior #xdc00 ,var) dest di) - unless (= i (1- n)) - collect '(incf di)) - (return-from set-body)))) - (block set-body - (,setter (cond - ((< u1 #x80) ; 1 octet - u1) - ((>= u1 #xc2) - (setq u2 (consume-octet 1)) - (cond - ((< u1 #xe0) ; 2 octets - (if (< (f-logxor u2 #x80) #x40) - (logior (f-ash (f-logand #x1f u1) 6) - (f-logxor u2 #x80)) - (encode-raw-octets 2))) - (t - (setq u3 (consume-octet 2)) - (cond - ((< u1 #xf0) ; 3 octets - (if (and (< (f-logxor u2 #x80) #x40) - (< (f-logxor u3 #x80) #x40) - (or (>= u1 #xe1) (>= u2 #xa0))) - (let ((start (f-logior (f-ash (f-logand u1 #x0f) 12) - (f-ash (f-logand u2 #x3f) 6)))) - (if (<= #xd800 start #xdfc0) - (encode-raw-octets 3) - (logior start (f-logand u3 #x3f)))) - (encode-raw-octets 3))) - (t ; 4 octets - (setq u4 (consume-octet 3)) - (if (and (< (f-logxor u2 #x80) #x40) - (< (f-logxor u3 #x80) #x40) - (< (f-logxor u4 #x80) #x40) - (or (>= u1 #xf1) (>= u2 #x90))) - (logior - (f-logior (f-ash (f-logand u1 7) 18) - (f-ash (f-logxor u2 #x80) 12)) - (f-logior (f-ash (f-logxor u3 #x80) 6) - (f-logxor u4 #x80))) - (encode-raw-octets 4))))))) - (t (encode-raw-octets 1))) - dest di))) - finally (return (the fixnum (- di d-start))))))) - -;;;; UTF-16 - -;;; TODO: add a way to pass some info at compile-time telling us that, -;;; for example, the maximum code-point will always be < #x10000 in -;;; which case we could simply return (* 2 (- end start)). -(defmacro utf16-octet-counter (getter type) - `(named-lambda utf-16-octet-counter (seq start end max) - (declare (type ,type seq) (fixnum start end max)) - (loop with noctets fixnum = 0 - for i fixnum from start below end - for code of-type code-point = (,getter seq i) - do (let ((new (the fixnum (+ (if (< code #x10000) 2 4) noctets)))) - (if (and (plusp max) (> new max)) - (loop-finish) - (setq noctets new))) - finally (return (values noctets i))))) - -(defmacro utf-16-combine-surrogate-pairs (u1 u2) - `(the (unsigned-byte 21) - (+ #x10000 - (the (unsigned-byte 20) - (logior - (the (unsigned-byte 20) - (ash (the (unsigned-byte 10) (- ,u1 #xd800)) 10)) - (the (unsigned-byte 10) - (- ,u2 #xdc00))))))) - -(defmacro define-utf-16 (name &optional endianness) - (check-type endianness (or null (eql :be) (eql :le))) - (check-type name keyword) - (let ((swap-var (gensym "SWAP")) - (code-point-counter-name - (format-symbol t '#:~a-code-point-counter (string name))) - (encoder-name (format-symbol t '#:~a-encoder (string name))) - (decoder-name (format-symbol t '#:~a-decoder (string name)))) - (labels ((make-bom-check-form (end start getter seq) - (if (null endianness) - ``((,',swap-var - (when (> ,,end ,,start) - (case (,,getter ,,seq ,,start 2 :ne) - (#.+byte-order-mark-code+ (incf ,,start 2) nil) - (#.+swapped-byte-order-mark-code+ (incf ,,start 2) t) - (t #+little-endian t))))) - '())) - (make-getter-form (getter src i) - (case endianness - (:le ``(,,getter ,,src ,,i 2 :le)) - (:be ``(,,getter ,,src ,,i 2 :be)) - (t ``(if ,',swap-var - (,,getter ,,src ,,i 2 :re) - (,,getter ,,src ,,i 2 :ne))))) - (make-setter-form (setter code dest di) - (case endianness - (:be ``(,,setter ,,code ,,dest ,,di 2 :be)) - (:le ``(,,setter ,,code ,,dest ,,di 2 :le)) - (t ``(,,setter ,,code ,,dest ,,di 2 :ne))))) - `(progn - (define-octet-counter ,name (getter type) - `(utf16-octet-counter ,getter ,type)) - (define-code-point-counter ,name (getter type) - `(named-lambda ,',code-point-counter-name (seq start end max) - (declare (type ,type seq) (fixnum start end max)) - (let* ,,(make-bom-check-form ''end ''start 'getter ''seq) - (loop with count fixnum = 0 - with i fixnum = start - while (<= i (- end 2)) do - (let* ((code ,,(make-getter-form 'getter ''seq ''i)) - (next-i (+ i (if (or (< code #xd800) (>= code #xdc00)) - 2 - 4)))) - (declare (type (unsigned-byte 16) code) (fixnum next-i)) - (cond - ((> next-i end) - (decoding-error - (vector (,getter seq i) (,getter seq (1+ i))) - ,',name seq i nil 'end-of-input-in-character) - (return (values count i))) - (t - (setq i next-i - count (1+ count)) - (when (and (plusp max) (= count max)) - (return (values count i)))))) - finally (progn - (assert (= i end)) - (return (values count i))))))) - (define-encoder ,name (getter src-type setter dest-type) - `(named-lambda ,',encoder-name (src start end dest d-start) - (declare (type ,src-type src) - (type ,dest-type dest) - (fixnum start end d-start)) - (loop with di fixnum = d-start - for i fixnum from start below end - for code of-type code-point = (,getter src i) - for high-bits fixnum = (- code #x10000) do - (cond ((< high-bits 0) - ,,(make-setter-form 'setter ''code ''dest ''di) - (incf di 2)) - (t - ,,(make-setter-form - 'setter ''(logior #xd800 (f-ash high-bits -10)) - ''dest ''di) - ,,(make-setter-form - 'setter ''(logior #xdc00 (f-logand high-bits #x3ff)) - ''dest ''(+ di 2)) - (incf di 4))) - finally (return (the fixnum (- di d-start)))))) - (define-decoder ,name (getter src-type setter dest-type) - `(named-lambda ,',decoder-name (src start end dest d-start) - (declare (type ,src-type src) - (type ,dest-type dest) - (fixnum start end d-start)) - (let ,,(make-bom-check-form ''end ''start 'getter ''src) - (loop with i fixnum = start - for di fixnum from d-start - until (= i end) do - (let ((u1 ,,(make-getter-form 'getter ''src ''i))) - (declare (type (unsigned-byte 16) u1)) - (incf i 2) - (,setter (cond - ((or (< u1 #xd800) (>= u1 #xe000)) ; 2 octets - u1) - ((< u1 #xdc00) ; 4 octets - (let ((u2 ,,(make-getter-form 'getter ''src ''i))) - (declare (type (unsigned-byte 16) u2)) - (incf i 2) - (if (and (>= u2 #xdc00) (< u2 #xe000)) - (utf-16-combine-surrogate-pairs u1 u2) - (decoding-error - (vector (,getter src (- i 4)) - (,getter src (- i 3)) - (,getter src (- i 2)) - (,getter src (- i 1))) - ,',name src i +repl+)))) - (t - (decoding-error (vector (,getter src (- i 2)) - (,getter src (- i 1))) - ,',name src i +repl+))) - dest di)) - finally (return (the fixnum (- di d-start))))))) - ',name)))) - -(define-character-encoding :utf-16 - "A 16-bit, variable-length encoding in which characters with -code points less than #x10000 can be encoded in a single 16-bit -word and characters with larger codes can be encoded in a pair of -16-bit words. The endianness of the encoded data is indicated by -the endianness of a byte-order-mark character (#\u+feff) -prepended to the data; in the absence of such a character on -input, the data is assumed to be in big-endian order. Output is -written in native byte-order with a leading byte-order mark." - :max-units-per-char 2 - :code-unit-size 16 - :native-endianness t ; not necessarily true when decoding - :decode-literal-code-unit-limit #xd800 - :encode-literal-code-unit-limit #x10000 - :use-bom #+big-endian :utf-16be #+little-endian :utf-16le - :bom-encoding #+big-endian #(#xfe #xff) #+little-endian #(#xff #xfe) - :nul-encoding #(0 0) - :default-replacement #xfffd - :ambiguous #+little-endian t #+big-endian nil) - -(define-utf-16 :utf-16) - -(define-character-encoding :utf-16le - "A 16-bit, variable-length encoding in which characters with -code points less than #x10000 can be encoded in a single 16-bit -word and characters with larger codes can be encoded in a pair of -16-bit words. The data is assumed to be in little-endian order. Output is -written in little-endian byte-order without a leading byte-order mark." - :aliases '(:utf-16/le) - :max-units-per-char 2 - :code-unit-size 16 - :native-endianness #+little-endian t #+big-endian nil - :decode-literal-code-unit-limit #xd800 - :encode-literal-code-unit-limit #x10000 - :nul-encoding #(0 0) - :default-replacement #xfffd) - -(define-utf-16 :utf-16le :le) - -(define-character-encoding :utf-16be - "A 16-bit, variable-length encoding in which characters with -code points less than #x10000 can be encoded in a single 16-bit -word and characters with larger codes can be encoded in a pair of -16-bit words. The data is assumed to be in big-endian order. Output is -written in big-endian byte-order without a leading byte-order mark." - :aliases '(:utf-16/be) - :max-units-per-char 2 - :code-unit-size 16 - :native-endianness #+little-endian nil #+big-endian t - :decode-literal-code-unit-limit #xd800 - :encode-literal-code-unit-limit #x10000 - :nul-encoding #(0 0) - :default-replacement #xfffd) - -(define-utf-16 :utf-16be :be) - -(defmacro define-ucs (name bytes &optional endianness (limit #x110000)) - (check-type name keyword) - (check-type bytes (or (eql 2) (eql 4))) - (check-type endianness (or null (eql :le) (eql :be))) - (let ((swap-var (gensym "SWAP")) - (code-point-counter-name - (format-symbol t '#:~a-code-point-counter (string name))) - (encoder-name - (format-symbol t '#:~a-encoder (string name))) - (decoder-name - (format-symbol t '#:~a-decoder (string name)))) - (labels ((make-bom-check-form (end start getter src) - (if (null endianness) - ``(when (not (zerop (- ,,end ,,start))) - (case (,,getter ,,src 0 ,',bytes :ne) - (#.+byte-order-mark-code+ - (incf ,,start ,',bytes) nil) - (#.+swapped-byte-order-mark-code-32+ - (incf ,,start ,',bytes) t) - (t #+little-endian t))) - '())) - (make-setter-form (setter code dest di) - ``(,,setter ,,code ,,dest ,,di ,',bytes - ,',(or endianness :ne))) - (make-getter-form (getter src i) - (if (null endianness) - ``(if ,',swap-var - (,,getter ,,src ,,i ,',bytes :re) - (,,getter ,,src ,,i ,',bytes :ne)) - ``(,,getter ,,src ,,i ,',bytes ,',endianness)))) - `(progn - (define-code-point-counter ,name (getter type) - `(named-lambda ,',code-point-counter-name (seq start end max) - (declare (type ,type seq) (fixnum start end max)) - ;; check for bom - ,,(make-bom-check-form ''end ''start 'getter ''seq) - (multiple-value-bind (count rem) - (floor (- end start) ,',bytes) - (cond - ((and (plusp max) (> count max)) - (values max (the fixnum (+ start (* ,',bytes max))))) - (t - ;; check for incomplete last character - (unless (zerop rem) - (let ((vector (make-array ,',bytes :fill-pointer 0))) - (dotimes (i rem) - (vector-push (,getter seq (+ i (- end rem))) vector)) - (decoding-error vector ,',name seq (the fixnum (- end rem)) nil - 'end-of-input-in-character) - (decf end rem))) - (values count end)))))) - (define-encoder ,name (getter src-type setter dest-type) - `(named-lambda ,',encoder-name (src start end dest d-start) - (declare (type ,src-type src) - (type ,dest-type dest) - (fixnum start end d-start)) - (loop for i fixnum from start below end - and di fixnum from d-start by ,',bytes - for code of-type code-point = (,getter src i) - do (if (>= code ,',limit) - (encoding-error code ,',name src i +repl+) - ,,(make-setter-form 'setter ''code ''dest ''di)) - finally (return (the fixnum (- di d-start)))))) - (define-decoder ,name (getter src-type setter dest-type) - `(named-lambda ,',decoder-name (src start end dest d-start) - (declare (type ,src-type src) - (type ,dest-type dest) - (fixnum start end d-start)) - (let ((,',swap-var ,,(make-bom-check-form ''end ''start 'getter ''src))) - (declare (ignorable ,',swap-var)) - (loop for i fixnum from start below end by ,',bytes - and di from d-start - do (,setter (let ((unit ,,(make-getter-form 'getter ''src ''i))) - (if (>= unit ,',limit) - (decoding-error - (vector (,getter src i) - (,getter src (+ i 1)) - ,@,(if (= bytes 4) - ``((,getter src (+ i 2)) - (,getter src (+ i 3))))) - ,',name src i +repl+ - 'character-out-of-range) - unit)) - dest di) - finally (return (the fixnum (- di d-start))))))) - ',name)))) - -;;;; UTF-32 - -(define-character-encoding :utf-32 - "A 32-bit, fixed-length encoding in which all Unicode -characters can be encoded in a single 32-bit word. The -endianness of the encoded data is indicated by the endianness of -a byte-order-mark character (#\u+feff) prepended to the data; in -the absence of such a character on input, input data is assumed -to be in big-endian order. Output is written in native byte -order with a leading byte-order mark." - :aliases '(:ucs-4) - :max-units-per-char 1 - :code-unit-size 32 - :native-endianness t ; not necessarily true when decoding - :literal-char-code-limit #x110000 - :use-bom #+little-endian :utf-32le #+big-endian :utf-32be - :bom-encoding - #+big-endian #(#x00 #x00 #xfe #xff) - #+little-endian #(#xff #xfe #x00 #x00) - :nul-encoding #(0 0 0 0) - :ambiguous #+little-endian t #+big-endian nil) - -(define-ucs :utf-32 4) - -(define-character-encoding :utf-32le - "A 32-bit, fixed-length encoding in which all Unicode -characters can be encoded in a single 32-bit word. Input data is assumed -to be in little-endian order. Output is also written in little-endian byte -order without a leading byte-order mark." - :max-units-per-char 1 - :code-unit-size 32 - :aliases '(:utf-32/le :ucs-4le :ucs-4/le) - :native-endianness #+little-endian t #+big-endian nil - :literal-char-code-limit #x110000 - :nul-encoding #(0 0 0 0)) - -(define-ucs :utf-32le 4 :le) - -(define-character-encoding :utf-32be - "A 32-bit, fixed-length encoding in which all Unicode -characters can be encoded in a single 32-bit word. Input data is assumed -to be in big-endian order. Output is also written in big-endian byte -order without a leading byte-order mark." - :max-units-per-char 1 - :code-unit-size 32 - :aliases '(:utf-32/be :ucs-4be :ucs-4/be) - :native-endianness #+little-endian nil #+big-endian t - :literal-char-code-limit #x110000 - :nul-encoding #(0 0 0 0)) - -(define-ucs :utf-32be 4 :be) - -;; UCS-2 - -(define-character-encoding :ucs-2 - "A 16-bit, fixed-length encoding in which all Unicode -characters can be encoded in a single 16-bit word. The -endianness of the encoded data is indicated by the endianness of -a byte-order-mark character (#\u+feff) prepended to the data; in -the absence of such a character on input, input data is assumed -to be in big-endian order. Output is written in native byte -order with a leading byte-order mark." - :aliases '(:ucs-2) - :max-units-per-char 1 - :code-unit-size 16 - :native-endianness t ; not necessarily true when decoding - :literal-char-code-limit #x10000 - :use-bom #+little-endian :ucs-2le #+big-endian :ucs-2be - :bom-encoding - #+big-endian #(#xfe #xff) - #+little-endian #(#xff #xfe) - :nul-encoding #(0 0) - :ambiguous #+little-endian t #+big-endian nil) - -(define-ucs :ucs-2 2 nil #x10000) - -(define-character-encoding :ucs-2le - "A 16-bit, fixed-length encoding in which all Unicode -characters can be encoded in a single 16-bit word. Input data is assumed -to be in little-endian order. Output is also written in little-endian byte -order without a leading byte-order mark." - :max-units-per-char 1 - :code-unit-size 16 - :aliases '(:ucs-2/le) - :native-endianness #+little-endian t #+big-endian nil - :literal-char-code-limit #x10000 - :nul-encoding #(0 0)) - -(define-ucs :ucs-2le 2 :le #x10000) - -(define-character-encoding :ucs-2be - "A 16-bit, fixed-length encoding in which all Unicode -characters can be encoded in a single 16-bit word. Input data is assumed -to be in big-endian order. Output is also written in big-endian byte -order without a leading byte-order mark." - :max-units-per-char 1 - :code-unit-size 16 - :aliases '(:ucs-2/be) - :native-endianness #+little-endian nil #+big-endian t - :literal-char-code-limit #x10000 - :nul-encoding #(0 0)) - -(define-ucs :ucs-2be 2 :be #x10000) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/encodings.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/encodings.lisp deleted file mode 100644 index da2c66b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/encodings.lisp +++ /dev/null @@ -1,503 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; encodings.lisp --- Character encodings and mappings. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package #:babel-encodings) - -;;;; Character Encodings - -(defclass character-encoding () - ((name :initarg :name :reader enc-name - :initform (error "Must specify a NAME for this character encoding.")) - ;; Most of these documentation strings are taken from OpenMCL. - (documentation - :initarg :documentation :reader enc-documentation :initform nil) - ;; A non-exhaustive list of aliases for the encoding. - (aliases :initarg :aliases :initform nil :reader enc-aliases) - ;; Specified in bits. Usually 8, 16 or 32. - (code-unit-size - :initarg :code-unit-size :reader enc-code-unit-size :initform 8) - (max-units-per-char - :initarg :max-units-per-char :reader enc-max-units-per-char :initform 1) - ;; If NIL, it is necessary to swap 16- and 32-bit units. - (native-endianness - :initarg :native-endianness :reader enc-native-endianness :initform t) - ;; Code units less than this value map to themselves on input. - (decode-literal-code-unit-limit - :initarg :decode-literal-code-unit-limit :initform 0 - :reader enc-decode-literal-code-unit-limit) - ;; Code points less than this value map to themselves on output. - (encode-literal-code-unit-limit - :initarg :encode-literal-code-unit-limit :initform 0 - :reader enc-encode-literal-code-unit-limit) - ;; Defines whether it is necessary to prepend a byte-order-mark to - ;; determine the endianness. - (use-bom :initarg :use-bom :initform nil :reader enc-use-bom) - ;; How the byte-order-mark should be encoded, specified as a - ;; sequence of octets. NIL if it cannot be encoded. - (bom-encoding - :initarg :bom-encoding :reader enc-bom-encoding :initform nil) - ;; How should NUL be encoded, specified as sequence of octets. - (nul-encoding - :initarg :nul-encoding :reader enc-nul-encoding :initform #(0)) - ;; Preferred replacement character code point. - (default-replacement - :initarg :default-replacement :reader enc-default-replacement - :initform #x1a) - ;; Does VALID-STRING => OCTETS => STRING2 guarantee a valid - ;; STRING2? UTF-{16,32} on little-endian plaforms don't because - ;; they assume different endianness on each direction. - (ambiguous - :initarg :ambiguous :reader ambiguous-encoding-p :initform nil))) - -;;; I'm too lazy to write all the identical limits twice. -(defmethod initialize-instance :after ((enc character-encoding) - &key literal-char-code-limit) - (when literal-char-code-limit - (setf (slot-value enc 'encode-literal-code-unit-limit) - literal-char-code-limit) - (setf (slot-value enc 'decode-literal-code-unit-limit) - literal-char-code-limit))) - -#-(and) -(defmethod describe-object ((enc character-encoding) s) - "Prints out the name, aliases and documentation slots of a -character encoding object." - (with-slots (name aliases documentation) enc - (format s "~&~S" name) - (when aliases - (format s " [Aliases:~{ ~S~}]" aliases)) - (format s "~&~A~%~%" documentation)) - (call-next-method)) - -(defvar *supported-character-encodings* nil) - -(defun list-character-encodings () - "List of keyword symbols denoting supported character -encodings. This list does not include aliases." - *supported-character-encodings*) - -(defvar *character-encodings* (make-hash-table :test 'eq)) - -(defvar *default-character-encoding* :utf-8 - "Special variable used to determine the default character -encoding.") - -(defun get-character-encoding (name) - "Lookups the character encoding denoted by the keyword symbol -NAME. Signals an error if one is not found. If NAME is already -a CHARACTER-ENCONDING object, it is returned unmodified." - (when (typep name 'character-encoding) - (return-from get-character-encoding name)) - (when (eq name :default) - (setq name *default-character-encoding*)) - (or (gethash name *character-encodings*) - (error "Unknown character encoding: ~S" name))) - -(defmethod ambiguous-encoding-p ((encoding symbol)) - (ambiguous-encoding-p (get-character-encoding encoding))) - -(defun notice-character-encoding (enc) - (pushnew (enc-name enc) *supported-character-encodings*) - (dolist (kw (cons (enc-name enc) (enc-aliases enc))) - (setf (gethash kw *character-encodings*) enc)) - (enc-name enc)) - -(defmacro define-character-encoding (name docstring &body options) - `(notice-character-encoding - (make-instance 'character-encoding :name ,name ,@options - :documentation ,docstring))) - -;;;; Mappings - -;;; TODO: describe what mappings are - -(defun make-fixed-width-counter (getter type &optional (unit-size-in-bits 8)) - (declare (ignore getter type)) - (check-type unit-size-in-bits positive-fixnum) - (let ((unit-size-in-bytes (/ unit-size-in-bits 8))) - `(named-lambda fixed-width-counter (seq start end max) - (declare (ignore seq) (fixnum start end max)) - ;; XXX: the result can be bigger than a fixnum when (> unit-size - ;; 1) and we don't want that to happen. Possible solution: signal - ;; a warning (hmm, make that an actual error) and truncate. - (if (plusp max) - (let ((count (the fixnum (min (floor max ,unit-size-in-bytes) - (the fixnum (- end start)))))) - (values (the fixnum (* count ,unit-size-in-bytes)) - (the fixnum (+ start count)))) - (values (the fixnum (* (the fixnum (- end start)) - ,unit-size-in-bytes)) - (the fixnum end)))))) - -;;; Useful to develop new encodings incrementally starting with octet -;;; and code-unit counters. -(defun make-dummy-coder (sg st ds dt) - (declare (ignore sg st ds dt)) - `(named-lambda dummy-coder (src s e dest i) - (declare (ignore src s e dest i)) - (error "this encoder/decoder hasn't been implemented yet"))) - -;;; TODO: document here -;;; -;;; ENCODER -- (lambda (src-getter src-type dest-setter dest-type) ...) -;;; DECODER -- (lambda (src-getter src-type dest-setter dest-type) ...) -;;; -;;; OCTET-COUNTER -- (lambda (getter type) ...) -;;; CODE-POINT-COUNTER -- (lambda (getter type) ...) -(defclass abstract-mapping () - ((encoder-factory :accessor encoder-factory :initform 'make-dummy-coder) - (decoder-factory :accessor decoder-factory :initform 'make-dummy-coder) - (octet-counter-factory :accessor octet-counter-factory - :initform 'make-fixed-width-counter) - (code-point-counter-factory :accessor code-point-counter-factory - :initform 'make-fixed-width-counter))) - -;;; TODO: document these -;;; -;;; ENCODER -- (lambda (src start end dest d-start) ...) -;;; DECODER -- (lambda (src start end dest d-start) ...) -;;; -;;; OCTET-COUNTER -- (lambda (seq start end max-octets) ...) -;;; CODE-POINT-COUNTER -- (lambda (seq start end max-chars) ...) -;;; => N-CHARS NEW-END -;;; (important: describe NEW-END) -(defclass concrete-mapping () - ((encoder :accessor encoder) - (decoder :accessor decoder) - (octet-counter :accessor octet-counter) - (code-point-counter :accessor code-point-counter))) - -(defparameter *abstract-mappings* (make-hash-table :test 'eq)) - -(defun get-abstract-mapping (encoding) - (gethash encoding *abstract-mappings*)) - -(defun (setf get-abstract-mapping) (value encoding) - (setf (gethash encoding *abstract-mappings*) value)) - -(defun %register-mapping-part (encoding slot-name fn) - (let ((mapping (get-abstract-mapping encoding))) - (unless mapping - (setq mapping (make-instance 'abstract-mapping)) - (setf (get-abstract-mapping encoding) mapping)) - (setf (slot-value mapping slot-name) fn))) - -;;; See enc-*.lisp for example usages of these 4 macros. - -(defmacro define-encoder (encoding (sa st da dt) &body body) - `(%register-mapping-part ,encoding 'encoder-factory - (named-lambda encoder (,sa ,st ,da ,dt) - ,@body))) - -(defmacro define-decoder (encoding (sa st da dt) &body body) - `(%register-mapping-part ,encoding 'decoder-factory - (named-lambda decoder (,sa ,st ,da ,dt) - ,@body))) - -(defmacro define-octet-counter (encoding (acc type) &body body) - `(%register-mapping-part ,encoding 'octet-counter-factory - (named-lambda octet-counter-factory (,acc ,type) - ,@body))) - -(defmacro define-code-point-counter (encoding (acc type) &body body) - `(%register-mapping-part ,encoding 'code-point-counter-factory - (named-lambda code-point-counter (,acc ,type) - ,@body))) - -(defun instantiate-encoder (encoding am octet-seq-getter octet-seq-type - code-point-seq-setter code-point-seq-type) - (declare (ignore encoding)) - (funcall (encoder-factory am) - octet-seq-getter - octet-seq-type - code-point-seq-setter - code-point-seq-type)) - -(defun instantiate-decoder (encoding am octet-seq-getter octet-seq-type - code-point-seq-setter code-point-seq-type) - (declare (ignore encoding)) - (funcall (decoder-factory am) - octet-seq-getter - octet-seq-type - code-point-seq-setter - code-point-seq-type)) - -(defun instantiate-code-point-counter (encoding am octet-seq-getter - octet-seq-type) - (declare (ignore encoding)) - (funcall (code-point-counter-factory am) - octet-seq-getter - octet-seq-type)) - -(defun instantiate-octet-counter (encoding am code-point-seq-getter - code-point-seq-type) - (if (= 1 (enc-max-units-per-char encoding)) - (make-fixed-width-counter code-point-seq-getter code-point-seq-type - (enc-code-unit-size encoding)) - (funcall (octet-counter-factory am) - code-point-seq-getter - code-point-seq-type))) - -;;; Expands into code generated by the available abstract mappings -;;; that will be compiled into concrete mappings. This is used in -;;; e.g. strings.lisp to define mappings between strings and -;;; (unsigned-byte 8) vectors. -;;; -;;; For each encoding funcall the abstract mappings at macro-expansion -;;; time with the src/dest accessors and types to generate the -;;; appropriate code for the concrete mappings. These functions are -;;; then saved in their respective slots of the CONCRETE-MAPPING -;;; object. -(defmacro instantiate-concrete-mappings - (&key (encodings (hash-table-keys *abstract-mappings*)) - (optimize '((speed 3) (debug 0) (compilation-speed 0))) - octet-seq-getter octet-seq-setter octet-seq-type - code-point-seq-getter code-point-seq-setter code-point-seq-type - (instantiate-decoders t)) - `(let ((ht (make-hash-table :test 'eq))) - (declare (optimize ,@optimize) - #+sbcl (sb-ext:muffle-conditions sb-ext:compiler-note)) - (flet ((notice-mapping (encoding-name cm) - (let* ((encoding (get-character-encoding encoding-name)) - (aliases (enc-aliases encoding))) - (dolist (kw (cons (enc-name encoding) aliases)) - (setf (gethash kw ht) cm))))) - ,@(loop for encoding-name in encodings - for encoding = (get-character-encoding encoding-name) - for am = (gethash encoding-name *abstract-mappings*) - collect - `(let ((cm (make-instance 'concrete-mapping))) - (setf (encoder cm) - ,(instantiate-encoder encoding am - code-point-seq-getter - code-point-seq-type - octet-seq-setter - octet-seq-type)) - ,(when instantiate-decoders - `(progn - (setf (decoder cm) - ,(instantiate-decoder encoding am - octet-seq-getter - octet-seq-type - code-point-seq-setter - code-point-seq-type)) - (setf (code-point-counter cm) - ,(instantiate-code-point-counter - encoding am octet-seq-getter octet-seq-type)))) - (setf (octet-counter cm) - ,(instantiate-octet-counter encoding am - code-point-seq-getter - code-point-seq-type)) - (notice-mapping ,encoding-name cm)))) - ht)) - -;;; debugging stuff - -#-(and) -(defun pprint-instantiate-concrete-mappings - (&key (encodings (hash-table-keys *abstract-mappings*)) - (optimize '((debug 3) (safety 3))) - (octet-seq-setter 'ub-set) (octet-seq-getter 'ub-get) - (octet-seq-type '(simple-array (unsigned-byte 8) (*))) - (code-point-seq-setter 'string-set) - (code-point-seq-getter 'string-get) - (code-point-seq-type 'simple-unicode-string)) - (let ((encodings (ensure-list encodings)) - (*package* (find-package :babel-encodings)) - (*print-case* :downcase)) - (pprint - (macroexpand - `(instantiate-concrete-mappings - :encodings ,encodings - :optimize ,optimize - :octet-seq-getter ,octet-seq-getter - :octet-seq-setter ,octet-seq-setter - :octet-seq-type ,octet-seq-type - :code-point-seq-getter ,code-point-seq-getter - :code-point-seq-setter ,code-point-seq-setter - :code-point-seq-type ,code-point-seq-type)))) - (values)) - -;;;; Utilities used in enc-*.lisp - -(defconstant +default-substitution-code-point+ #x1a - "Default ASCII substitution character code point used in case of an encoding/decoding error.") - -;;; We're converting between objects of the (UNSIGNED-BYTE 8) and -;;; (MOD #x110000) types which are aliased here to UB8 and CODE-POINT -;;; for convenience. -(deftype ub8 () '(unsigned-byte 8)) -(deftype code-point () '(mod #x110000)) - -;;; Utility macro around DEFINE-ENCODER that takes care of most of the -;;; work need to deal with an 8-bit, fixed-width character encoding. -;;; -;;; BODY will be inside a loop and its return value will placed in the -;;; destination buffer. BODY will be surounded by lexical BLOCK which -;;; will have the ENCODING's name, usually a keyword. It handles all -;;; sorts of type declarations. -;;; -;;; See enc-ascii.lisp for a simple usage example. -(defmacro define-unibyte-encoder (encoding (code) &body body) - (with-unique-names (s-getter s-type d-setter d-type - src start end dest d-start i di) - `(define-encoder ,encoding (,s-getter ,s-type ,d-setter ,d-type) - `(named-lambda ,',(symbolicate encoding '#:-unibyte-encoder) - (,',src ,',start ,',end ,',dest ,',d-start) - (declare (type ,,s-type ,',src) - (type ,,d-type ,',dest) - (fixnum ,',start ,',end ,',d-start)) - (loop for ,',i fixnum from ,',start below ,',end - and ,',di fixnum from ,',d-start do - (,,d-setter - (macrolet - ;; this should probably be a function... - ((handle-error (&optional (c ''character-encoding-error)) - `(encoding-error - ,',',code ,',',encoding ,',',src ,',',i - +default-substitution-code-point+ ,c))) - (let ((,',code (,,s-getter ,',src ,',i))) - (declare (type code-point ,',code)) - (block ,',encoding ,@',body))) - ,',dest ,',di) - finally (return (the fixnum (- ,',di ,',d-start)))))))) - -;;; The decoder version of the above macro. -(defmacro define-unibyte-decoder (encoding (octet) &body body) - (with-unique-names (s-getter s-type d-setter d-type - src start end dest d-start i di) - `(define-decoder ,encoding (,s-getter ,s-type ,d-setter ,d-type) - `(named-lambda ,',(symbolicate encoding '#:-unibyte-encoder) - (,',src ,',start ,',end ,',dest ,',d-start) - (declare (type ,,s-type ,',src) - (type ,,d-type ,',dest) - (fixnum ,',start ,',end ,',d-start)) - (loop for ,',i fixnum from ,',start below ,',end - and ,',di fixnum from ,',d-start do - (,,d-setter - (macrolet - ;; this should probably be a function... - ((handle-error (&optional (c ''character-decoding-error)) - `(decoding-error - (vector ,',',octet) ,',',encoding ,',',src ,',',i - +default-substitution-code-point+ ,c))) - (let ((,',octet (,,s-getter ,',src ,',i))) - (declare (type ub8 ,',octet)) - (block ,',encoding ,@',body))) - ,',dest ,',di) - finally (return (the fixnum (- ,',di ,',d-start)))))))) - -;;;; Error Conditions -;;; -;;; For now, we don't define any actual restarts. The only mechanism -;;; for "restarting" a coding error is the -;;; *SUPPRESS-CHARACTER-CODING-ERRORS* special variable which, when -;;; bound to T (the default), suppresses any error and uses a default -;;; replacement character instead. -;;; -;;; If it turns out that other more options are necessary, possible -;;; alternative approaches include: -;;; -;;; a) use a *REPLACEMENT-CHARACTER* special variable that lets us -;;; pick our own replacement character. The encoder must do -;;; additional work to check if this is character is encodable. -;;; -;;; b) offer a restart to pick a replacement character. Same -;;; problem as above. -;;; -;;; Both approaches pose encoding problems when dealing with a -;;; variable-width encodings because different replacement characters -;;; will need different numbers of octets. This is not a problem for -;;; UTF but will be a problem for the CJK charsets. Approach (a) is -;;; nevertheless easier since the replacement character is known in -;;; advance and therefore the octet-counter can account for it. -;;; -;;; For more complex restarts like SBCL's -- that'll let you specify -;;; _several_ replacement characters for a single character error -- -;;; will probably need extra support code outside the encoder/decoder -;;; (i.e. in the string-to-octets function, for example) since the -;;; encoders/decoders deal with pre-allocated fixed-length buffers. -;;; -;;; SBCL has ASCII-specific (MALFORMED-ASCII) and UTF8-specific -;;; errors. Why? Do we want to add some of those too? - -;;; FIXME: We used to deal with this with an extra ERRORP argument for -;;; encoders, decoders, etc... Still undecided on the best way to do -;;; it. We could also use a simple restart instead of this... -;;; -;;; In any case, this is not for the users to bind and it's not -;;; exported from the BABEL package. -(defvar *suppress-character-coding-errors* nil - "If non-NIL, encoding or decoding errors are suppressed and the -the current character encoding's default replacement character is -used.") - -;;; All of Babel's error conditions are subtypes of -;;; CHARACTER-CODING-ERROR. This error hierarchy is based on SBCL's. -(define-condition character-coding-error (error) - ((buffer :initarg :buffer :reader character-coding-error-buffer) - (position :initarg :position :reader character-coding-error-position) - (encoding :initarg :encoding :reader character-coding-error-encoding))) - -(define-condition character-encoding-error (character-coding-error) - ((code :initarg :code :reader character-encoding-error-code)) - (:report (lambda (c s) - (format s "Unable to encode character code point ~A as ~S." - (character-encoding-error-code c) - (character-coding-error-encoding c))))) - -(declaim (inline encoding-error)) -(defun encoding-error (code enc buf pos &optional - (sub +default-substitution-code-point+) - (e 'character-encoding-error)) - (unless *suppress-character-coding-errors* - (error e :encoding enc :buffer buf :position pos :code code)) - sub) - -(define-condition character-decoding-error (character-coding-error) - ((octets :initarg :octets :reader character-decoding-error-octets)) - (:report (lambda (c s) - (format s "Illegal ~S character starting at position ~D." - (character-coding-error-encoding c) - (character-coding-error-position c))))) - -(define-condition end-of-input-in-character (character-decoding-error) - () - (:documentation "Signalled by DECODERs or CODE-POINT-COUNTERs -of variable-width character encodings.")) - -(define-condition character-out-of-range (character-decoding-error) - () - (:documentation - "Signalled when the character being decoded is out of range.")) - -(declaim (inline decoding-error)) -(defun decoding-error (octets enc buf pos &optional - (sub +default-substitution-code-point+) - (e 'character-decoding-error)) - (unless *suppress-character-coding-errors* - (error e :octets octets :encoding enc :buffer buf :position pos)) - sub) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/external-format.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/external-format.lisp deleted file mode 100644 index 62bb919..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/external-format.lisp +++ /dev/null @@ -1,88 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; external-format.lisp --- External format classes and functions. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package #:babel) - -(defvar *default-eol-style* - #+windows :crlf - #-windows :lf - "The end-of-line style used by external formats if none is -explicitly given. Depends on the OS the code is compiled on.") - -(deftype eol-style () - "Possible end-of-line styles." - '(member :cr :lf :crlf)) - -(defclass external-format () - ((encoding :initarg :encoding :reader external-format-encoding - :type character-encoding) - (eol-style :initarg :eol-style :reader external-format-eol-style - :type eol-style :initform *default-eol-style*)) - (:documentation - "An EXTERNAL-FORMAT consists in a combination of a Babel -CHARACTER-ENCODING and an end-of-line style.")) - -(defmethod print-object ((ef external-format) stream) - (print-unreadable-object (ef stream :type t :identity t) - (format stream "~A ~A" - (enc-name (external-format-encoding ef)) - (external-format-eol-style ef)))) - -;;; This interface is still somewhat sketchy. The rest of Babel -;;; doesn't really understand external formats, for instance. -(defun make-external-format (encoding &key (eol-style *default-eol-style*)) - (check-type eol-style eol-style) - (make-instance 'external-format - :encoding (get-character-encoding encoding) - :eol-style eol-style)) - -(defun ensure-external-format (thing) - (etypecase thing - (external-format thing) - (character-encoding (make-instance 'external-format :encoding thing)) - (symbol (make-external-format thing)) - (list (apply #'make-external-format thing)))) - -(defun external-format-equal (ef1 ef2) - (and (eq (external-format-encoding ef1) (external-format-encoding ef2)) - (eq (external-format-eol-style ef1) (external-format-eol-style ef2)))) - -(declaim (inline lookup-mapping)) -(defun lookup-mapping (ht encoding) - "HT should be an hashtable created by -INSTANTIATE-CONCRETE-MAPPINGS. ENCODING should be either an -external format, an encoding object or a keyword symbol -denoting a character encoding name or one of its aliases." - (or (etypecase encoding - (keyword - (gethash encoding ht)) - (babel-encodings::concrete-mapping - encoding) - (character-encoding - (gethash (enc-name encoding) ht)) - (external-format - (gethash (enc-name (external-format-encoding encoding)) ht))) - (error "~S is not a valid encoding designator" encoding))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/gbk-map.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/gbk-map.lisp deleted file mode 100644 index 5b7eb4f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/gbk-map.lisp +++ /dev/null @@ -1,2226 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; gbk-map.lisp --- GBK encoding map. -;;; -;;; Copyright (C) 2011, Li Wenpeng -;;; -;;; 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. - -(in-package #:babel-encodings) - -(defparameter *gbk-unicode-mapping* - (map 'babel:unicode-string - #'code-char - '(#x554A #x963F #x57C3 #x6328 #x54CE #x5509 #x54C0 #x7691 #x764C #x853C - #x77EE #x827E #x788D #x7231 #x9698 #x978D #x6C28 #x5B89 #x4FFA #x6309 - #x6697 #x5CB8 #x80FA #x6848 #x80AE #x6602 #x76CE #x51F9 #x6556 #x71AC - #x7FF1 #x8884 #x50B2 #x5965 #x61CA #x6FB3 #x82AD #x634C #x6252 #x53ED - #x5427 #x7B06 #x516B #x75A4 #x5DF4 #x62D4 #x8DCB #x9776 #x628A #x8019 - #x575D #x9738 #x7F62 #x7238 #x767D #x67CF #x767E #x6446 #x4F70 #x8D25 - #x62DC #x7A17 #x6591 #x73ED #x642C #x6273 #x822C #x9881 #x677F #x7248 - #x626E #x62CC #x4F34 #x74E3 #x534A #x529E #x7ECA #x90A6 #x5E2E #x6886 - #x699C #x8180 #x7ED1 #x68D2 #x78C5 #x868C #x9551 #x508D #x8C24 #x82DE - #x80DE #x5305 #x8912 #x5265 #x8584 #x96F9 #x4FDD #x5821 #x9971 #x5B9D - #x62B1 #x62A5 #x66B4 #x8C79 #x9C8D #x7206 #x676F #x7891 #x60B2 #x5351 - #x5317 #x8F88 #x80CC #x8D1D #x94A1 #x500D #x72C8 #x5907 #x60EB #x7119 - #x88AB #x5954 #x82EF #x672C #x7B28 #x5D29 #x7EF7 #x752D #x6CF5 #x8E66 - #x8FF8 #x903C #x9F3B #x6BD4 #x9119 #x7B14 #x5F7C #x78A7 #x84D6 #x853D - #x6BD5 #x6BD9 #x6BD6 #x5E01 #x5E87 #x75F9 #x95ED #x655D #x5F0A #x5FC5 - #x8F9F #x58C1 #x81C2 #x907F #x965B #x97AD #x8FB9 #x7F16 #x8D2C #x6241 - #x4FBF #x53D8 #x535E #x8FA8 #x8FA9 #x8FAB #x904D #x6807 #x5F6A #x8198 - #x8868 #x9CD6 #x618B #x522B #x762A #x5F6C #x658C #x6FD2 #x6EE8 #x5BBE - #x6448 #x5175 #x51B0 #x67C4 #x4E19 #x79C9 #x997C #x70B3 #x75C5 #x5E76 - #x73BB #x83E0 #x64AD #x62E8 #x94B5 #x6CE2 #x535A #x52C3 #x640F #x94C2 - #x7B94 #x4F2F #x5E1B #x8236 #x8116 #x818A #x6E24 #x6CCA #x9A73 #x6355 - #x535C #x54FA #x8865 #x57E0 #x4E0D #x5E03 #x6B65 #x7C3F #x90E8 #x6016 - #x64E6 #x731C #x88C1 #x6750 #x624D #x8D22 #x776C #x8E29 #x91C7 #x5F69 - #x83DC #x8521 #x9910 #x53C2 #x8695 #x6B8B #x60ED #x60E8 #x707F #x82CD - #x8231 #x4ED3 #x6CA7 #x85CF #x64CD #x7CD9 #x69FD #x66F9 #x8349 #x5395 - #x7B56 #x4FA7 #x518C #x6D4B #x5C42 #x8E6D #x63D2 #x53C9 #x832C #x8336 - #x67E5 #x78B4 #x643D #x5BDF #x5C94 #x5DEE #x8BE7 #x62C6 #x67F4 #x8C7A - #x6400 #x63BA #x8749 #x998B #x8C17 #x7F20 #x94F2 #x4EA7 #x9610 #x98A4 - #x660C #x7316 #x573A #x5C1D #x5E38 #x957F #x507F #x80A0 #x5382 #x655E - #x7545 #x5531 #x5021 #x8D85 #x6284 #x949E #x671D #x5632 #x6F6E #x5DE2 - #x5435 #x7092 #x8F66 #x626F #x64A4 #x63A3 #x5F7B #x6F88 #x90F4 #x81E3 - #x8FB0 #x5C18 #x6668 #x5FF1 #x6C89 #x9648 #x8D81 #x886C #x6491 #x79F0 - #x57CE #x6A59 #x6210 #x5448 #x4E58 #x7A0B #x60E9 #x6F84 #x8BDA #x627F - #x901E #x9A8B #x79E4 #x5403 #x75F4 #x6301 #x5319 #x6C60 #x8FDF #x5F1B - #x9A70 #x803B #x9F7F #x4F88 #x5C3A #x8D64 #x7FC5 #x65A5 #x70BD #x5145 - #x51B2 #x866B #x5D07 #x5BA0 #x62BD #x916C #x7574 #x8E0C #x7A20 #x6101 - #x7B79 #x4EC7 #x7EF8 #x7785 #x4E11 #x81ED #x521D #x51FA #x6A71 #x53A8 - #x8E87 #x9504 #x96CF #x6EC1 #x9664 #x695A #x7840 #x50A8 #x77D7 #x6410 - #x89E6 #x5904 #x63E3 #x5DDD #x7A7F #x693D #x4F20 #x8239 #x5598 #x4E32 - #x75AE #x7A97 #x5E62 #x5E8A #x95EF #x521B #x5439 #x708A #x6376 #x9524 - #x5782 #x6625 #x693F #x9187 #x5507 #x6DF3 #x7EAF #x8822 #x6233 #x7EF0 - #x75B5 #x8328 #x78C1 #x96CC #x8F9E #x6148 #x74F7 #x8BCD #x6B64 #x523A - #x8D50 #x6B21 #x806A #x8471 #x56F1 #x5306 #x4ECE #x4E1B #x51D1 #x7C97 - #x918B #x7C07 #x4FC3 #x8E7F #x7BE1 #x7A9C #x6467 #x5D14 #x50AC #x8106 - #x7601 #x7CB9 #x6DEC #x7FE0 #x6751 #x5B58 #x5BF8 #x78CB #x64AE #x6413 - #x63AA #x632B #x9519 #x642D #x8FBE #x7B54 #x7629 #x6253 #x5927 #x5446 - #x6B79 #x50A3 #x6234 #x5E26 #x6B86 #x4EE3 #x8D37 #x888B #x5F85 #x902E - #x6020 #x803D #x62C5 #x4E39 #x5355 #x90F8 #x63B8 #x80C6 #x65E6 #x6C2E - #x4F46 #x60EE #x6DE1 #x8BDE #x5F39 #x86CB #x5F53 #x6321 #x515A #x8361 - #x6863 #x5200 #x6363 #x8E48 #x5012 #x5C9B #x7977 #x5BFC #x5230 #x7A3B - #x60BC #x9053 #x76D7 #x5FB7 #x5F97 #x7684 #x8E6C #x706F #x767B #x7B49 - #x77AA #x51F3 #x9093 #x5824 #x4F4E #x6EF4 #x8FEA #x654C #x7B1B #x72C4 - #x6DA4 #x7FDF #x5AE1 #x62B5 #x5E95 #x5730 #x8482 #x7B2C #x5E1D #x5F1F - #x9012 #x7F14 #x98A0 #x6382 #x6EC7 #x7898 #x70B9 #x5178 #x975B #x57AB - #x7535 #x4F43 #x7538 #x5E97 #x60E6 #x5960 #x6DC0 #x6BBF #x7889 #x53FC - #x96D5 #x51CB #x5201 #x6389 #x540A #x9493 #x8C03 #x8DCC #x7239 #x789F - #x8776 #x8FED #x8C0D #x53E0 #x4E01 #x76EF #x53EE #x9489 #x9876 #x9F0E - #x952D #x5B9A #x8BA2 #x4E22 #x4E1C #x51AC #x8463 #x61C2 #x52A8 #x680B - #x4F97 #x606B #x51BB #x6D1E #x515C #x6296 #x6597 #x9661 #x8C46 #x9017 - #x75D8 #x90FD #x7763 #x6BD2 #x728A #x72EC #x8BFB #x5835 #x7779 #x8D4C - #x675C #x9540 #x809A #x5EA6 #x6E21 #x5992 #x7AEF #x77ED #x953B #x6BB5 - #x65AD #x7F0E #x5806 #x5151 #x961F #x5BF9 #x58A9 #x5428 #x8E72 #x6566 - #x987F #x56E4 #x949D #x76FE #x9041 #x6387 #x54C6 #x591A #x593A #x579B - #x8EB2 #x6735 #x8DFA #x8235 #x5241 #x60F0 #x5815 #x86FE #x5CE8 #x9E45 - #x4FC4 #x989D #x8BB9 #x5A25 #x6076 #x5384 #x627C #x904F #x9102 #x997F - #x6069 #x800C #x513F #x8033 #x5C14 #x9975 #x6D31 #x4E8C #x8D30 #x53D1 - #x7F5A #x7B4F #x4F10 #x4E4F #x9600 #x6CD5 #x73D0 #x85E9 #x5E06 #x756A - #x7FFB #x6A0A #x77FE #x9492 #x7E41 #x51E1 #x70E6 #x53CD #x8FD4 #x8303 - #x8D29 #x72AF #x996D #x6CDB #x574A #x82B3 #x65B9 #x80AA #x623F #x9632 - #x59A8 #x4EFF #x8BBF #x7EBA #x653E #x83F2 #x975E #x5561 #x98DE #x80A5 - #x532A #x8BFD #x5420 #x80BA #x5E9F #x6CB8 #x8D39 #x82AC #x915A #x5429 - #x6C1B #x5206 #x7EB7 #x575F #x711A #x6C7E #x7C89 #x594B #x4EFD #x5FFF - #x6124 #x7CAA #x4E30 #x5C01 #x67AB #x8702 #x5CF0 #x950B #x98CE #x75AF - #x70FD #x9022 #x51AF #x7F1D #x8BBD #x5949 #x51E4 #x4F5B #x5426 #x592B - #x6577 #x80A4 #x5B75 #x6276 #x62C2 #x8F90 #x5E45 #x6C1F #x7B26 #x4F0F - #x4FD8 #x670D #x6D6E #x6DAA #x798F #x88B1 #x5F17 #x752B #x629A #x8F85 - #x4FEF #x91DC #x65A7 #x812F #x8151 #x5E9C #x8150 #x8D74 #x526F #x8986 - #x8D4B #x590D #x5085 #x4ED8 #x961C #x7236 #x8179 #x8D1F #x5BCC #x8BA3 - #x9644 #x5987 #x7F1A #x5490 #x5676 #x560E #x8BE5 #x6539 #x6982 #x9499 - #x76D6 #x6E89 #x5E72 #x7518 #x6746 #x67D1 #x7AFF #x809D #x8D76 #x611F - #x79C6 #x6562 #x8D63 #x5188 #x521A #x94A2 #x7F38 #x809B #x7EB2 #x5C97 - #x6E2F #x6760 #x7BD9 #x768B #x9AD8 #x818F #x7F94 #x7CD5 #x641E #x9550 - #x7A3F #x544A #x54E5 #x6B4C #x6401 #x6208 #x9E3D #x80F3 #x7599 #x5272 - #x9769 #x845B #x683C #x86E4 #x9601 #x9694 #x94EC #x4E2A #x5404 #x7ED9 - #x6839 #x8DDF #x8015 #x66F4 #x5E9A #x7FB9 #x57C2 #x803F #x6897 #x5DE5 - #x653B #x529F #x606D #x9F9A #x4F9B #x8EAC #x516C #x5BAB #x5F13 #x5DE9 - #x6C5E #x62F1 #x8D21 #x5171 #x94A9 #x52FE #x6C9F #x82DF #x72D7 #x57A2 - #x6784 #x8D2D #x591F #x8F9C #x83C7 #x5495 #x7B8D #x4F30 #x6CBD #x5B64 - #x59D1 #x9F13 #x53E4 #x86CA #x9AA8 #x8C37 #x80A1 #x6545 #x987E #x56FA - #x96C7 #x522E #x74DC #x5250 #x5BE1 #x6302 #x8902 #x4E56 #x62D0 #x602A - #x68FA #x5173 #x5B98 #x51A0 #x89C2 #x7BA1 #x9986 #x7F50 #x60EF #x704C - #x8D2F #x5149 #x5E7F #x901B #x7470 #x89C4 #x572D #x7845 #x5F52 #x9F9F - #x95FA #x8F68 #x9B3C #x8BE1 #x7678 #x6842 #x67DC #x8DEA #x8D35 #x523D - #x8F8A #x6EDA #x68CD #x9505 #x90ED #x56FD #x679C #x88F9 #x8FC7 #x54C8 - #x9AB8 #x5B69 #x6D77 #x6C26 #x4EA5 #x5BB3 #x9A87 #x9163 #x61A8 #x90AF - #x97E9 #x542B #x6DB5 #x5BD2 #x51FD #x558A #x7F55 #x7FF0 #x64BC #x634D - #x65F1 #x61BE #x608D #x710A #x6C57 #x6C49 #x592F #x676D #x822A #x58D5 - #x568E #x8C6A #x6BEB #x90DD #x597D #x8017 #x53F7 #x6D69 #x5475 #x559D - #x8377 #x83CF #x6838 #x79BE #x548C #x4F55 #x5408 #x76D2 #x8C89 #x9602 - #x6CB3 #x6DB8 #x8D6B #x8910 #x9E64 #x8D3A #x563F #x9ED1 #x75D5 #x5F88 - #x72E0 #x6068 #x54FC #x4EA8 #x6A2A #x8861 #x6052 #x8F70 #x54C4 #x70D8 - #x8679 #x9E3F #x6D2A #x5B8F #x5F18 #x7EA2 #x5589 #x4FAF #x7334 #x543C - #x539A #x5019 #x540E #x547C #x4E4E #x5FFD #x745A #x58F6 #x846B #x80E1 - #x8774 #x72D0 #x7CCA #x6E56 #x5F27 #x864E #x552C #x62A4 #x4E92 #x6CAA - #x6237 #x82B1 #x54D7 #x534E #x733E #x6ED1 #x753B #x5212 #x5316 #x8BDD - #x69D0 #x5F8A #x6000 #x6DEE #x574F #x6B22 #x73AF #x6853 #x8FD8 #x7F13 - #x6362 #x60A3 #x5524 #x75EA #x8C62 #x7115 #x6DA3 #x5BA6 #x5E7B #x8352 - #x614C #x9EC4 #x78FA #x8757 #x7C27 #x7687 #x51F0 #x60F6 #x714C #x6643 - #x5E4C #x604D #x8C0E #x7070 #x6325 #x8F89 #x5FBD #x6062 #x86D4 #x56DE - #x6BC1 #x6094 #x6167 #x5349 #x60E0 #x6666 #x8D3F #x79FD #x4F1A #x70E9 - #x6C47 #x8BB3 #x8BF2 #x7ED8 #x8364 #x660F #x5A5A #x9B42 #x6D51 #x6DF7 - #x8C41 #x6D3B #x4F19 #x706B #x83B7 #x6216 #x60D1 #x970D #x8D27 #x7978 - #x51FB #x573E #x57FA #x673A #x7578 #x7A3D #x79EF #x7B95 #x808C #x9965 - #x8FF9 #x6FC0 #x8BA5 #x9E21 #x59EC #x7EE9 #x7F09 #x5409 #x6781 #x68D8 - #x8F91 #x7C4D #x96C6 #x53CA #x6025 #x75BE #x6C72 #x5373 #x5AC9 #x7EA7 - #x6324 #x51E0 #x810A #x5DF1 #x84DF #x6280 #x5180 #x5B63 #x4F0E #x796D - #x5242 #x60B8 #x6D4E #x5BC4 #x5BC2 #x8BA1 #x8BB0 #x65E2 #x5FCC #x9645 - #x5993 #x7EE7 #x7EAA #x5609 #x67B7 #x5939 #x4F73 #x5BB6 #x52A0 #x835A - #x988A #x8D3E #x7532 #x94BE #x5047 #x7A3C #x4EF7 #x67B6 #x9A7E #x5AC1 - #x6B7C #x76D1 #x575A #x5C16 #x7B3A #x95F4 #x714E #x517C #x80A9 #x8270 - #x5978 #x7F04 #x8327 #x68C0 #x67EC #x78B1 #x7877 #x62E3 #x6361 #x7B80 - #x4FED #x526A #x51CF #x8350 #x69DB #x9274 #x8DF5 #x8D31 #x89C1 #x952E - #x7BAD #x4EF6 #x5065 #x8230 #x5251 #x996F #x6E10 #x6E85 #x6DA7 #x5EFA - #x50F5 #x59DC #x5C06 #x6D46 #x6C5F #x7586 #x848B #x6868 #x5956 #x8BB2 - #x5320 #x9171 #x964D #x8549 #x6912 #x7901 #x7126 #x80F6 #x4EA4 #x90CA - #x6D47 #x9A84 #x5A07 #x56BC #x6405 #x94F0 #x77EB #x4FA5 #x811A #x72E1 - #x89D2 #x997A #x7F34 #x7EDE #x527F #x6559 #x9175 #x8F7F #x8F83 #x53EB - #x7A96 #x63ED #x63A5 #x7686 #x79F8 #x8857 #x9636 #x622A #x52AB #x8282 - #x6854 #x6770 #x6377 #x776B #x7AED #x6D01 #x7ED3 #x89E3 #x59D0 #x6212 - #x85C9 #x82A5 #x754C #x501F #x4ECB #x75A5 #x8BEB #x5C4A #x5DFE #x7B4B - #x65A4 #x91D1 #x4ECA #x6D25 #x895F #x7D27 #x9526 #x4EC5 #x8C28 #x8FDB - #x9773 #x664B #x7981 #x8FD1 #x70EC #x6D78 #x5C3D #x52B2 #x8346 #x5162 - #x830E #x775B #x6676 #x9CB8 #x4EAC #x60CA #x7CBE #x7CB3 #x7ECF #x4E95 - #x8B66 #x666F #x9888 #x9759 #x5883 #x656C #x955C #x5F84 #x75C9 #x9756 - #x7ADF #x7ADE #x51C0 #x70AF #x7A98 #x63EA #x7A76 #x7EA0 #x7396 #x97ED - #x4E45 #x7078 #x4E5D #x9152 #x53A9 #x6551 #x65E7 #x81FC #x8205 #x548E - #x5C31 #x759A #x97A0 #x62D8 #x72D9 #x75BD #x5C45 #x9A79 #x83CA #x5C40 - #x5480 #x77E9 #x4E3E #x6CAE #x805A #x62D2 #x636E #x5DE8 #x5177 #x8DDD - #x8E1E #x952F #x4FF1 #x53E5 #x60E7 #x70AC #x5267 #x6350 #x9E43 #x5A1F - #x5026 #x7737 #x5377 #x7EE2 #x6485 #x652B #x6289 #x6398 #x5014 #x7235 - #x89C9 #x51B3 #x8BC0 #x7EDD #x5747 #x83CC #x94A7 #x519B #x541B #x5CFB - #x4FCA #x7AE3 #x6D5A #x90E1 #x9A8F #x5580 #x5496 #x5361 #x54AF #x5F00 - #x63E9 #x6977 #x51EF #x6168 #x520A #x582A #x52D8 #x574E #x780D #x770B - #x5EB7 #x6177 #x7CE0 #x625B #x6297 #x4EA2 #x7095 #x8003 #x62F7 #x70E4 - #x9760 #x5777 #x82DB #x67EF #x68F5 #x78D5 #x9897 #x79D1 #x58F3 #x54B3 - #x53EF #x6E34 #x514B #x523B #x5BA2 #x8BFE #x80AF #x5543 #x57A6 #x6073 - #x5751 #x542D #x7A7A #x6050 #x5B54 #x63A7 #x62A0 #x53E3 #x6263 #x5BC7 - #x67AF #x54ED #x7A9F #x82E6 #x9177 #x5E93 #x88E4 #x5938 #x57AE #x630E - #x8DE8 #x80EF #x5757 #x7B77 #x4FA9 #x5FEB #x5BBD #x6B3E #x5321 #x7B50 - #x72C2 #x6846 #x77FF #x7736 #x65F7 #x51B5 #x4E8F #x76D4 #x5CBF #x7AA5 - #x8475 #x594E #x9B41 #x5080 #x9988 #x6127 #x6E83 #x5764 #x6606 #x6346 - #x56F0 #x62EC #x6269 #x5ED3 #x9614 #x5783 #x62C9 #x5587 #x8721 #x814A - #x8FA3 #x5566 #x83B1 #x6765 #x8D56 #x84DD #x5A6A #x680F #x62E6 #x7BEE - #x9611 #x5170 #x6F9C #x8C30 #x63FD #x89C8 #x61D2 #x7F06 #x70C2 #x6EE5 - #x7405 #x6994 #x72FC #x5ECA #x90CE #x6717 #x6D6A #x635E #x52B3 #x7262 - #x8001 #x4F6C #x59E5 #x916A #x70D9 #x6D9D #x52D2 #x4E50 #x96F7 #x956D - #x857E #x78CA #x7D2F #x5121 #x5792 #x64C2 #x808B #x7C7B #x6CEA #x68F1 - #x695E #x51B7 #x5398 #x68A8 #x7281 #x9ECE #x7BF1 #x72F8 #x79BB #x6F13 - #x7406 #x674E #x91CC #x9CA4 #x793C #x8389 #x8354 #x540F #x6817 #x4E3D - #x5389 #x52B1 #x783E #x5386 #x5229 #x5088 #x4F8B #x4FD0 #x75E2 #x7ACB - #x7C92 #x6CA5 #x96B6 #x529B #x7483 #x54E9 #x4FE9 #x8054 #x83B2 #x8FDE - #x9570 #x5EC9 #x601C #x6D9F #x5E18 #x655B #x8138 #x94FE #x604B #x70BC - #x7EC3 #x7CAE #x51C9 #x6881 #x7CB1 #x826F #x4E24 #x8F86 #x91CF #x667E - #x4EAE #x8C05 #x64A9 #x804A #x50DA #x7597 #x71CE #x5BE5 #x8FBD #x6F66 - #x4E86 #x6482 #x9563 #x5ED6 #x6599 #x5217 #x88C2 #x70C8 #x52A3 #x730E - #x7433 #x6797 #x78F7 #x9716 #x4E34 #x90BB #x9CDE #x6DCB #x51DB #x8D41 - #x541D #x62CE #x73B2 #x83F1 #x96F6 #x9F84 #x94C3 #x4F36 #x7F9A #x51CC - #x7075 #x9675 #x5CAD #x9886 #x53E6 #x4EE4 #x6E9C #x7409 #x69B4 #x786B - #x998F #x7559 #x5218 #x7624 #x6D41 #x67F3 #x516D #x9F99 #x804B #x5499 - #x7B3C #x7ABF #x9686 #x5784 #x62E2 #x9647 #x697C #x5A04 #x6402 #x7BD3 - #x6F0F #x964B #x82A6 #x5362 #x9885 #x5E90 #x7089 #x63B3 #x5364 #x864F - #x9C81 #x9E93 #x788C #x9732 #x8DEF #x8D42 #x9E7F #x6F5E #x7984 #x5F55 - #x9646 #x622E #x9A74 #x5415 #x94DD #x4FA3 #x65C5 #x5C65 #x5C61 #x7F15 - #x8651 #x6C2F #x5F8B #x7387 #x6EE4 #x7EFF #x5CE6 #x631B #x5B6A #x6EE6 - #x5375 #x4E71 #x63A0 #x7565 #x62A1 #x8F6E #x4F26 #x4ED1 #x6CA6 #x7EB6 - #x8BBA #x841D #x87BA #x7F57 #x903B #x9523 #x7BA9 #x9AA1 #x88F8 #x843D - #x6D1B #x9A86 #x7EDC #x5988 #x9EBB #x739B #x7801 #x8682 #x9A6C #x9A82 - #x561B #x5417 #x57CB #x4E70 #x9EA6 #x5356 #x8FC8 #x8109 #x7792 #x9992 - #x86EE #x6EE1 #x8513 #x66FC #x6162 #x6F2B #x8C29 #x8292 #x832B #x76F2 - #x6C13 #x5FD9 #x83BD #x732B #x8305 #x951A #x6BDB #x77DB #x94C6 #x536F - #x8302 #x5192 #x5E3D #x8C8C #x8D38 #x4E48 #x73AB #x679A #x6885 #x9176 - #x9709 #x7164 #x6CA1 #x7709 #x5A92 #x9541 #x6BCF #x7F8E #x6627 #x5BD0 - #x59B9 #x5A9A #x95E8 #x95F7 #x4EEC #x840C #x8499 #x6AAC #x76DF #x9530 - #x731B #x68A6 #x5B5F #x772F #x919A #x9761 #x7CDC #x8FF7 #x8C1C #x5F25 - #x7C73 #x79D8 #x89C5 #x6CCC #x871C #x5BC6 #x5E42 #x68C9 #x7720 #x7EF5 - #x5195 #x514D #x52C9 #x5A29 #x7F05 #x9762 #x82D7 #x63CF #x7784 #x85D0 - #x79D2 #x6E3A #x5E99 #x5999 #x8511 #x706D #x6C11 #x62BF #x76BF #x654F - #x60AF #x95FD #x660E #x879F #x9E23 #x94ED #x540D #x547D #x8C2C #x6478 - #x6479 #x8611 #x6A21 #x819C #x78E8 #x6469 #x9B54 #x62B9 #x672B #x83AB - #x58A8 #x9ED8 #x6CAB #x6F20 #x5BDE #x964C #x8C0B #x725F #x67D0 #x62C7 - #x7261 #x4EA9 #x59C6 #x6BCD #x5893 #x66AE #x5E55 #x52DF #x6155 #x6728 - #x76EE #x7766 #x7267 #x7A46 #x62FF #x54EA #x5450 #x94A0 #x90A3 #x5A1C - #x7EB3 #x6C16 #x4E43 #x5976 #x8010 #x5948 #x5357 #x7537 #x96BE #x56CA - #x6320 #x8111 #x607C #x95F9 #x6DD6 #x5462 #x9981 #x5185 #x5AE9 #x80FD - #x59AE #x9713 #x502A #x6CE5 #x5C3C #x62DF #x4F60 #x533F #x817B #x9006 - #x6EBA #x852B #x62C8 #x5E74 #x78BE #x64B5 #x637B #x5FF5 #x5A18 #x917F - #x9E1F #x5C3F #x634F #x8042 #x5B7D #x556E #x954A #x954D #x6D85 #x60A8 - #x67E0 #x72DE #x51DD #x5B81 #x62E7 #x6CDE #x725B #x626D #x94AE #x7EBD - #x8113 #x6D53 #x519C #x5F04 #x5974 #x52AA #x6012 #x5973 #x6696 #x8650 - #x759F #x632A #x61E6 #x7CEF #x8BFA #x54E6 #x6B27 #x9E25 #x6BB4 #x85D5 - #x5455 #x5076 #x6CA4 #x556A #x8DB4 #x722C #x5E15 #x6015 #x7436 #x62CD - #x6392 #x724C #x5F98 #x6E43 #x6D3E #x6500 #x6F58 #x76D8 #x78D0 #x76FC - #x7554 #x5224 #x53DB #x4E53 #x5E9E #x65C1 #x802A #x80D6 #x629B #x5486 - #x5228 #x70AE #x888D #x8DD1 #x6CE1 #x5478 #x80DA #x57F9 #x88F4 #x8D54 - #x966A #x914D #x4F69 #x6C9B #x55B7 #x76C6 #x7830 #x62A8 #x70F9 #x6F8E - #x5F6D #x84EC #x68DA #x787C #x7BF7 #x81A8 #x670B #x9E4F #x6367 #x78B0 - #x576F #x7812 #x9739 #x6279 #x62AB #x5288 #x7435 #x6BD7 #x5564 #x813E - #x75B2 #x76AE #x5339 #x75DE #x50FB #x5C41 #x8B6C #x7BC7 #x504F #x7247 - #x9A97 #x98D8 #x6F02 #x74E2 #x7968 #x6487 #x77A5 #x62FC #x9891 #x8D2B - #x54C1 #x8058 #x4E52 #x576A #x82F9 #x840D #x5E73 #x51ED #x74F6 #x8BC4 - #x5C4F #x5761 #x6CFC #x9887 #x5A46 #x7834 #x9B44 #x8FEB #x7C95 #x5256 - #x6251 #x94FA #x4EC6 #x8386 #x8461 #x83E9 #x84B2 #x57D4 #x6734 #x5703 - #x666E #x6D66 #x8C31 #x66DD #x7011 #x671F #x6B3A #x6816 #x621A #x59BB - #x4E03 #x51C4 #x6F06 #x67D2 #x6C8F #x5176 #x68CB #x5947 #x6B67 #x7566 - #x5D0E #x8110 #x9F50 #x65D7 #x7948 #x7941 #x9A91 #x8D77 #x5C82 #x4E5E - #x4F01 #x542F #x5951 #x780C #x5668 #x6C14 #x8FC4 #x5F03 #x6C7D #x6CE3 - #x8BAB #x6390 #x6070 #x6D3D #x7275 #x6266 #x948E #x94C5 #x5343 #x8FC1 - #x7B7E #x4EDF #x8C26 #x4E7E #x9ED4 #x94B1 #x94B3 #x524D #x6F5C #x9063 - #x6D45 #x8C34 #x5811 #x5D4C #x6B20 #x6B49 #x67AA #x545B #x8154 #x7F8C - #x5899 #x8537 #x5F3A #x62A2 #x6A47 #x9539 #x6572 #x6084 #x6865 #x77A7 - #x4E54 #x4FA8 #x5DE7 #x9798 #x64AC #x7FD8 #x5CED #x4FCF #x7A8D #x5207 - #x8304 #x4E14 #x602F #x7A83 #x94A6 #x4FB5 #x4EB2 #x79E6 #x7434 #x52E4 - #x82B9 #x64D2 #x79BD #x5BDD #x6C81 #x9752 #x8F7B #x6C22 #x503E #x537F - #x6E05 #x64CE #x6674 #x6C30 #x60C5 #x9877 #x8BF7 #x5E86 #x743C #x7A77 - #x79CB #x4E18 #x90B1 #x7403 #x6C42 #x56DA #x914B #x6CC5 #x8D8B #x533A - #x86C6 #x66F2 #x8EAF #x5C48 #x9A71 #x6E20 #x53D6 #x5A36 #x9F8B #x8DA3 - #x53BB #x5708 #x98A7 #x6743 #x919B #x6CC9 #x5168 #x75CA #x62F3 #x72AC - #x5238 #x529D #x7F3A #x7094 #x7638 #x5374 #x9E4A #x69B7 #x786E #x96C0 - #x88D9 #x7FA4 #x7136 #x71C3 #x5189 #x67D3 #x74E4 #x58E4 #x6518 #x56B7 - #x8BA9 #x9976 #x6270 #x7ED5 #x60F9 #x70ED #x58EC #x4EC1 #x4EBA #x5FCD - #x97E7 #x4EFB #x8BA4 #x5203 #x598A #x7EAB #x6254 #x4ECD #x65E5 #x620E - #x8338 #x84C9 #x8363 #x878D #x7194 #x6EB6 #x5BB9 #x7ED2 #x5197 #x63C9 - #x67D4 #x8089 #x8339 #x8815 #x5112 #x5B7A #x5982 #x8FB1 #x4E73 #x6C5D - #x5165 #x8925 #x8F6F #x962E #x854A #x745E #x9510 #x95F0 #x6DA6 #x82E5 - #x5F31 #x6492 #x6D12 #x8428 #x816E #x9CC3 #x585E #x8D5B #x4E09 #x53C1 - #x4F1E #x6563 #x6851 #x55D3 #x4E27 #x6414 #x9A9A #x626B #x5AC2 #x745F - #x8272 #x6DA9 #x68EE #x50E7 #x838E #x7802 #x6740 #x5239 #x6C99 #x7EB1 - #x50BB #x5565 #x715E #x7B5B #x6652 #x73CA #x82EB #x6749 #x5C71 #x5220 - #x717D #x886B #x95EA #x9655 #x64C5 #x8D61 #x81B3 #x5584 #x6C55 #x6247 - #x7F2E #x5892 #x4F24 #x5546 #x8D4F #x664C #x4E0A #x5C1A #x88F3 #x68A2 - #x634E #x7A0D #x70E7 #x828D #x52FA #x97F6 #x5C11 #x54E8 #x90B5 #x7ECD - #x5962 #x8D4A #x86C7 #x820C #x820D #x8D66 #x6444 #x5C04 #x6151 #x6D89 - #x793E #x8BBE #x7837 #x7533 #x547B #x4F38 #x8EAB #x6DF1 #x5A20 #x7EC5 - #x795E #x6C88 #x5BA1 #x5A76 #x751A #x80BE #x614E #x6E17 #x58F0 #x751F - #x7525 #x7272 #x5347 #x7EF3 #x7701 #x76DB #x5269 #x80DC #x5723 #x5E08 - #x5931 #x72EE #x65BD #x6E7F #x8BD7 #x5C38 #x8671 #x5341 #x77F3 #x62FE - #x65F6 #x4EC0 #x98DF #x8680 #x5B9E #x8BC6 #x53F2 #x77E2 #x4F7F #x5C4E - #x9A76 #x59CB #x5F0F #x793A #x58EB #x4E16 #x67FF #x4E8B #x62ED #x8A93 - #x901D #x52BF #x662F #x55DC #x566C #x9002 #x4ED5 #x4F8D #x91CA #x9970 - #x6C0F #x5E02 #x6043 #x5BA4 #x89C6 #x8BD5 #x6536 #x624B #x9996 #x5B88 - #x5BFF #x6388 #x552E #x53D7 #x7626 #x517D #x852C #x67A2 #x68B3 #x6B8A - #x6292 #x8F93 #x53D4 #x8212 #x6DD1 #x758F #x4E66 #x8D4E #x5B70 #x719F - #x85AF #x6691 #x66D9 #x7F72 #x8700 #x9ECD #x9F20 #x5C5E #x672F #x8FF0 - #x6811 #x675F #x620D #x7AD6 #x5885 #x5EB6 #x6570 #x6F31 #x6055 #x5237 - #x800D #x6454 #x8870 #x7529 #x5E05 #x6813 #x62F4 #x971C #x53CC #x723D - #x8C01 #x6C34 #x7761 #x7A0E #x542E #x77AC #x987A #x821C #x8BF4 #x7855 - #x6714 #x70C1 #x65AF #x6495 #x5636 #x601D #x79C1 #x53F8 #x4E1D #x6B7B - #x8086 #x5BFA #x55E3 #x56DB #x4F3A #x4F3C #x9972 #x5DF3 #x677E #x8038 - #x6002 #x9882 #x9001 #x5B8B #x8BBC #x8BF5 #x641C #x8258 #x64DE #x55FD - #x82CF #x9165 #x4FD7 #x7D20 #x901F #x7C9F #x50F3 #x5851 #x6EAF #x5BBF - #x8BC9 #x8083 #x9178 #x849C #x7B97 #x867D #x968B #x968F #x7EE5 #x9AD3 - #x788E #x5C81 #x7A57 #x9042 #x96A7 #x795F #x5B59 #x635F #x7B0B #x84D1 - #x68AD #x5506 #x7F29 #x7410 #x7D22 #x9501 #x6240 #x584C #x4ED6 #x5B83 - #x5979 #x5854 #x736D #x631E #x8E4B #x8E0F #x80CE #x82D4 #x62AC #x53F0 - #x6CF0 #x915E #x592A #x6001 #x6C70 #x574D #x644A #x8D2A #x762B #x6EE9 - #x575B #x6A80 #x75F0 #x6F6D #x8C2D #x8C08 #x5766 #x6BEF #x8892 #x78B3 - #x63A2 #x53F9 #x70AD #x6C64 #x5858 #x642A #x5802 #x68E0 #x819B #x5510 - #x7CD6 #x5018 #x8EBA #x6DCC #x8D9F #x70EB #x638F #x6D9B #x6ED4 #x7EE6 - #x8404 #x6843 #x9003 #x6DD8 #x9676 #x8BA8 #x5957 #x7279 #x85E4 #x817E - #x75BC #x8A8A #x68AF #x5254 #x8E22 #x9511 #x63D0 #x9898 #x8E44 #x557C - #x4F53 #x66FF #x568F #x60D5 #x6D95 #x5243 #x5C49 #x5929 #x6DFB #x586B - #x7530 #x751C #x606C #x8214 #x8146 #x6311 #x6761 #x8FE2 #x773A #x8DF3 - #x8D34 #x94C1 #x5E16 #x5385 #x542C #x70C3 #x6C40 #x5EF7 #x505C #x4EAD - #x5EAD #x633A #x8247 #x901A #x6850 #x916E #x77B3 #x540C #x94DC #x5F64 - #x7AE5 #x6876 #x6345 #x7B52 #x7EDF #x75DB #x5077 #x6295 #x5934 #x900F - #x51F8 #x79C3 #x7A81 #x56FE #x5F92 #x9014 #x6D82 #x5C60 #x571F #x5410 - #x5154 #x6E4D #x56E2 #x63A8 #x9893 #x817F #x8715 #x892A #x9000 #x541E - #x5C6F #x81C0 #x62D6 #x6258 #x8131 #x9E35 #x9640 #x9A6E #x9A7C #x692D - #x59A5 #x62D3 #x553E #x6316 #x54C7 #x86D9 #x6D3C #x5A03 #x74E6 #x889C - #x6B6A #x5916 #x8C4C #x5F2F #x6E7E #x73A9 #x987D #x4E38 #x70F7 #x5B8C - #x7897 #x633D #x665A #x7696 #x60CB #x5B9B #x5A49 #x4E07 #x8155 #x6C6A - #x738B #x4EA1 #x6789 #x7F51 #x5F80 #x65FA #x671B #x5FD8 #x5984 #x5A01 - #x5DCD #x5FAE #x5371 #x97E6 #x8FDD #x6845 #x56F4 #x552F #x60DF #x4E3A - #x6F4D #x7EF4 #x82C7 #x840E #x59D4 #x4F1F #x4F2A #x5C3E #x7EAC #x672A - #x851A #x5473 #x754F #x80C3 #x5582 #x9B4F #x4F4D #x6E2D #x8C13 #x5C09 - #x6170 #x536B #x761F #x6E29 #x868A #x6587 #x95FB #x7EB9 #x543B #x7A33 - #x7D0A #x95EE #x55E1 #x7FC1 #x74EE #x631D #x8717 #x6DA1 #x7A9D #x6211 - #x65A1 #x5367 #x63E1 #x6C83 #x5DEB #x545C #x94A8 #x4E4C #x6C61 #x8BEC - #x5C4B #x65E0 #x829C #x68A7 #x543E #x5434 #x6BCB #x6B66 #x4E94 #x6342 - #x5348 #x821E #x4F0D #x4FAE #x575E #x620A #x96FE #x6664 #x7269 #x52FF - #x52A1 #x609F #x8BEF #x6614 #x7199 #x6790 #x897F #x7852 #x77FD #x6670 - #x563B #x5438 #x9521 #x727A #x7A00 #x606F #x5E0C #x6089 #x819D #x5915 - #x60DC #x7184 #x70EF #x6EAA #x6C50 #x7280 #x6A84 #x88AD #x5E2D #x4E60 - #x5AB3 #x559C #x94E3 #x6D17 #x7CFB #x9699 #x620F #x7EC6 #x778E #x867E - #x5323 #x971E #x8F96 #x6687 #x5CE1 #x4FA0 #x72ED #x4E0B #x53A6 #x590F - #x5413 #x6380 #x9528 #x5148 #x4ED9 #x9C9C #x7EA4 #x54B8 #x8D24 #x8854 - #x8237 #x95F2 #x6D8E #x5F26 #x5ACC #x663E #x9669 #x73B0 #x732E #x53BF - #x817A #x9985 #x7FA1 #x5BAA #x9677 #x9650 #x7EBF #x76F8 #x53A2 #x9576 - #x9999 #x7BB1 #x8944 #x6E58 #x4E61 #x7FD4 #x7965 #x8BE6 #x60F3 #x54CD - #x4EAB #x9879 #x5DF7 #x6A61 #x50CF #x5411 #x8C61 #x8427 #x785D #x9704 - #x524A #x54EE #x56A3 #x9500 #x6D88 #x5BB5 #x6DC6 #x6653 #x5C0F #x5B5D - #x6821 #x8096 #x5578 #x7B11 #x6548 #x6954 #x4E9B #x6B47 #x874E #x978B - #x534F #x631F #x643A #x90AA #x659C #x80C1 #x8C10 #x5199 #x68B0 #x5378 - #x87F9 #x61C8 #x6CC4 #x6CFB #x8C22 #x5C51 #x85AA #x82AF #x950C #x6B23 - #x8F9B #x65B0 #x5FFB #x5FC3 #x4FE1 #x8845 #x661F #x8165 #x7329 #x60FA - #x5174 #x5211 #x578B #x5F62 #x90A2 #x884C #x9192 #x5E78 #x674F #x6027 - #x59D3 #x5144 #x51F6 #x80F8 #x5308 #x6C79 #x96C4 #x718A #x4F11 #x4FEE - #x7F9E #x673D #x55C5 #x9508 #x79C0 #x8896 #x7EE3 #x589F #x620C #x9700 - #x865A #x5618 #x987B #x5F90 #x8BB8 #x84C4 #x9157 #x53D9 #x65ED #x5E8F - #x755C #x6064 #x7D6E #x5A7F #x7EEA #x7EED #x8F69 #x55A7 #x5BA3 #x60AC - #x65CB #x7384 #x9009 #x7663 #x7729 #x7EDA #x9774 #x859B #x5B66 #x7A74 - #x96EA #x8840 #x52CB #x718F #x5FAA #x65EC #x8BE2 #x5BFB #x9A6F #x5DE1 - #x6B89 #x6C5B #x8BAD #x8BAF #x900A #x8FC5 #x538B #x62BC #x9E26 #x9E2D - #x5440 #x4E2B #x82BD #x7259 #x869C #x5D16 #x8859 #x6DAF #x96C5 #x54D1 - #x4E9A #x8BB6 #x7109 #x54BD #x9609 #x70DF #x6DF9 #x76D0 #x4E25 #x7814 - #x8712 #x5CA9 #x5EF6 #x8A00 #x989C #x960E #x708E #x6CBF #x5944 #x63A9 - #x773C #x884D #x6F14 #x8273 #x5830 #x71D5 #x538C #x781A #x96C1 #x5501 - #x5F66 #x7130 #x5BB4 #x8C1A #x9A8C #x6B83 #x592E #x9E2F #x79E7 #x6768 - #x626C #x4F6F #x75A1 #x7F8A #x6D0B #x9633 #x6C27 #x4EF0 #x75D2 #x517B - #x6837 #x6F3E #x9080 #x8170 #x5996 #x7476 #x6447 #x5C27 #x9065 #x7A91 - #x8C23 #x59DA #x54AC #x8200 #x836F #x8981 #x8000 #x6930 #x564E #x8036 - #x7237 #x91CE #x51B6 #x4E5F #x9875 #x6396 #x4E1A #x53F6 #x66F3 #x814B - #x591C #x6DB2 #x4E00 #x58F9 #x533B #x63D6 #x94F1 #x4F9D #x4F0A #x8863 - #x9890 #x5937 #x9057 #x79FB #x4EEA #x80F0 #x7591 #x6C82 #x5B9C #x59E8 - #x5F5D #x6905 #x8681 #x501A #x5DF2 #x4E59 #x77E3 #x4EE5 #x827A #x6291 - #x6613 #x9091 #x5C79 #x4EBF #x5F79 #x81C6 #x9038 #x8084 #x75AB #x4EA6 - #x88D4 #x610F #x6BC5 #x5FC6 #x4E49 #x76CA #x6EA2 #x8BE3 #x8BAE #x8C0A - #x8BD1 #x5F02 #x7FFC #x7FCC #x7ECE #x8335 #x836B #x56E0 #x6BB7 #x97F3 - #x9634 #x59FB #x541F #x94F6 #x6DEB #x5BC5 #x996E #x5C39 #x5F15 #x9690 - #x5370 #x82F1 #x6A31 #x5A74 #x9E70 #x5E94 #x7F28 #x83B9 #x8424 #x8425 - #x8367 #x8747 #x8FCE #x8D62 #x76C8 #x5F71 #x9896 #x786C #x6620 #x54DF - #x62E5 #x4F63 #x81C3 #x75C8 #x5EB8 #x96CD #x8E0A #x86F9 #x548F #x6CF3 - #x6D8C #x6C38 #x607F #x52C7 #x7528 #x5E7D #x4F18 #x60A0 #x5FE7 #x5C24 - #x7531 #x90AE #x94C0 #x72B9 #x6CB9 #x6E38 #x9149 #x6709 #x53CB #x53F3 - #x4F51 #x91C9 #x8BF1 #x53C8 #x5E7C #x8FC2 #x6DE4 #x4E8E #x76C2 #x6986 - #x865E #x611A #x8206 #x4F59 #x4FDE #x903E #x9C7C #x6109 #x6E1D #x6E14 - #x9685 #x4E88 #x5A31 #x96E8 #x4E0E #x5C7F #x79B9 #x5B87 #x8BED #x7FBD - #x7389 #x57DF #x828B #x90C1 #x5401 #x9047 #x55BB #x5CEA #x5FA1 #x6108 - #x6B32 #x72F1 #x80B2 #x8A89 #x6D74 #x5BD3 #x88D5 #x9884 #x8C6B #x9A6D - #x9E33 #x6E0A #x51A4 #x5143 #x57A3 #x8881 #x539F #x63F4 #x8F95 #x56ED - #x5458 #x5706 #x733F #x6E90 #x7F18 #x8FDC #x82D1 #x613F #x6028 #x9662 - #x66F0 #x7EA6 #x8D8A #x8DC3 #x94A5 #x5CB3 #x7CA4 #x6708 #x60A6 #x9605 - #x8018 #x4E91 #x90E7 #x5300 #x9668 #x5141 #x8FD0 #x8574 #x915D #x6655 - #x97F5 #x5B55 #x531D #x7838 #x6742 #x683D #x54C9 #x707E #x5BB0 #x8F7D - #x518D #x5728 #x54B1 #x6512 #x6682 #x8D5E #x8D43 #x810F #x846C #x906D - #x7CDF #x51FF #x85FB #x67A3 #x65E9 #x6FA1 #x86A4 #x8E81 #x566A #x9020 - #x7682 #x7076 #x71E5 #x8D23 #x62E9 #x5219 #x6CFD #x8D3C #x600E #x589E - #x618E #x66FE #x8D60 #x624E #x55B3 #x6E23 #x672D #x8F67 #x94E1 #x95F8 - #x7728 #x6805 #x69A8 #x548B #x4E4D #x70B8 #x8BC8 #x6458 #x658B #x5B85 - #x7A84 #x503A #x5BE8 #x77BB #x6BE1 #x8A79 #x7C98 #x6CBE #x76CF #x65A9 - #x8F97 #x5D2D #x5C55 #x8638 #x6808 #x5360 #x6218 #x7AD9 #x6E5B #x7EFD - #x6A1F #x7AE0 #x5F70 #x6F33 #x5F20 #x638C #x6DA8 #x6756 #x4E08 #x5E10 - #x8D26 #x4ED7 #x80C0 #x7634 #x969C #x62DB #x662D #x627E #x6CBC #x8D75 - #x7167 #x7F69 #x5146 #x8087 #x53EC #x906E #x6298 #x54F2 #x86F0 #x8F99 - #x8005 #x9517 #x8517 #x8FD9 #x6D59 #x73CD #x659F #x771F #x7504 #x7827 - #x81FB #x8D1E #x9488 #x4FA6 #x6795 #x75B9 #x8BCA #x9707 #x632F #x9547 - #x9635 #x84B8 #x6323 #x7741 #x5F81 #x72F0 #x4E89 #x6014 #x6574 #x62EF - #x6B63 #x653F #x5E27 #x75C7 #x90D1 #x8BC1 #x829D #x679D #x652F #x5431 - #x8718 #x77E5 #x80A2 #x8102 #x6C41 #x4E4B #x7EC7 #x804C #x76F4 #x690D - #x6B96 #x6267 #x503C #x4F84 #x5740 #x6307 #x6B62 #x8DBE #x53EA #x65E8 - #x7EB8 #x5FD7 #x631A #x63B7 #x81F3 #x81F4 #x7F6E #x5E1C #x5CD9 #x5236 - #x667A #x79E9 #x7A1A #x8D28 #x7099 #x75D4 #x6EDE #x6CBB #x7A92 #x4E2D - #x76C5 #x5FE0 #x949F #x8877 #x7EC8 #x79CD #x80BF #x91CD #x4EF2 #x4F17 - #x821F #x5468 #x5DDE #x6D32 #x8BCC #x7CA5 #x8F74 #x8098 #x5E1A #x5492 - #x76B1 #x5B99 #x663C #x9AA4 #x73E0 #x682A #x86DB #x6731 #x732A #x8BF8 - #x8BDB #x9010 #x7AF9 #x70DB #x716E #x62C4 #x77A9 #x5631 #x4E3B #x8457 - #x67F1 #x52A9 #x86C0 #x8D2E #x94F8 #x7B51 #x4F4F #x6CE8 #x795D #x9A7B - #x6293 #x722A #x62FD #x4E13 #x7816 #x8F6C #x64B0 #x8D5A #x7BC6 #x6869 - #x5E84 #x88C5 #x5986 #x649E #x58EE #x72B6 #x690E #x9525 #x8FFD #x8D58 - #x5760 #x7F00 #x8C06 #x51C6 #x6349 #x62D9 #x5353 #x684C #x7422 #x8301 - #x914C #x5544 #x7740 #x707C #x6D4A #x5179 #x54A8 #x8D44 #x59FF #x6ECB - #x6DC4 #x5B5C #x7D2B #x4ED4 #x7C7D #x6ED3 #x5B50 #x81EA #x6E0D #x5B57 - #x9B03 #x68D5 #x8E2A #x5B97 #x7EFC #x603B #x7EB5 #x90B9 #x8D70 #x594F - #x63CD #x79DF #x8DB3 #x5352 #x65CF #x7956 #x8BC5 #x963B #x7EC4 #x94BB - #x7E82 #x5634 #x9189 #x6700 #x7F6A #x5C0A #x9075 #x6628 #x5DE6 #x4F50 - #x67DE #x505A #x4F5C #x5750 #x5EA7 #x4E8D #x4E0C #x5140 #x4E10 #x5EFF - #x5345 #x4E15 #x4E98 #x4E1E #x9B32 #x5B6C #x5669 #x4E28 #x79BA #x4E3F - #x5315 #x4E47 #x592D #x723B #x536E #x6C10 #x56DF #x80E4 #x9997 #x6BD3 - #x777E #x9F17 #x4E36 #x4E9F #x9F10 #x4E5C #x4E69 #x4E93 #x8288 #x5B5B - #x556C #x560F #x4EC4 #x538D #x539D #x53A3 #x53A5 #x53AE #x9765 #x8D5D - #x531A #x53F5 #x5326 #x532E #x533E #x8D5C #x5366 #x5363 #x5202 #x5208 - #x520E #x522D #x5233 #x523F #x5240 #x524C #x525E #x5261 #x525C #x84AF - #x527D #x5282 #x5281 #x5290 #x5293 #x5182 #x7F54 #x4EBB #x4EC3 #x4EC9 - #x4EC2 #x4EE8 #x4EE1 #x4EEB #x4EDE #x4F1B #x4EF3 #x4F22 #x4F64 #x4EF5 - #x4F25 #x4F27 #x4F09 #x4F2B #x4F5E #x4F67 #x6538 #x4F5A #x4F5D #x4F5F - #x4F57 #x4F32 #x4F3D #x4F76 #x4F74 #x4F91 #x4F89 #x4F83 #x4F8F #x4F7E - #x4F7B #x4FAA #x4F7C #x4FAC #x4F94 #x4FE6 #x4FE8 #x4FEA #x4FC5 #x4FDA - #x4FE3 #x4FDC #x4FD1 #x4FDF #x4FF8 #x5029 #x504C #x4FF3 #x502C #x500F - #x502E #x502D #x4FFE #x501C #x500C #x5025 #x5028 #x507E #x5043 #x5055 - #x5048 #x504E #x506C #x507B #x50A5 #x50A7 #x50A9 #x50BA #x50D6 #x5106 - #x50ED #x50EC #x50E6 #x50EE #x5107 #x510B #x4EDD #x6C3D #x4F58 #x4F65 - #x4FCE #x9FA0 #x6C46 #x7C74 #x516E #x5DFD #x9EC9 #x9998 #x5181 #x5914 - #x52F9 #x530D #x8A07 #x5310 #x51EB #x5919 #x5155 #x4EA0 #x5156 #x4EB3 - #x886E #x88A4 #x4EB5 #x8114 #x88D2 #x7980 #x5B34 #x8803 #x7FB8 #x51AB - #x51B1 #x51BD #x51BC #x51C7 #x5196 #x51A2 #x51A5 #x8BA0 #x8BA6 #x8BA7 - #x8BAA #x8BB4 #x8BB5 #x8BB7 #x8BC2 #x8BC3 #x8BCB #x8BCF #x8BCE #x8BD2 - #x8BD3 #x8BD4 #x8BD6 #x8BD8 #x8BD9 #x8BDC #x8BDF #x8BE0 #x8BE4 #x8BE8 - #x8BE9 #x8BEE #x8BF0 #x8BF3 #x8BF6 #x8BF9 #x8BFC #x8BFF #x8C00 #x8C02 - #x8C04 #x8C07 #x8C0C #x8C0F #x8C11 #x8C12 #x8C14 #x8C15 #x8C16 #x8C19 - #x8C1B #x8C18 #x8C1D #x8C1F #x8C20 #x8C21 #x8C25 #x8C27 #x8C2A #x8C2B - #x8C2E #x8C2F #x8C32 #x8C33 #x8C35 #x8C36 #x5369 #x537A #x961D #x9622 - #x9621 #x9631 #x962A #x963D #x963C #x9642 #x9649 #x9654 #x965F #x9667 - #x966C #x9672 #x9674 #x9688 #x968D #x9697 #x96B0 #x9097 #x909B #x909D - #x9099 #x90AC #x90A1 #x90B4 #x90B3 #x90B6 #x90BA #x90B8 #x90B0 #x90CF - #x90C5 #x90BE #x90D0 #x90C4 #x90C7 #x90D3 #x90E6 #x90E2 #x90DC #x90D7 - #x90DB #x90EB #x90EF #x90FE #x9104 #x9122 #x911E #x9123 #x9131 #x912F - #x9139 #x9143 #x9146 #x520D #x5942 #x52A2 #x52AC #x52AD #x52BE #x54FF - #x52D0 #x52D6 #x52F0 #x53DF #x71EE #x77CD #x5EF4 #x51F5 #x51FC #x9B2F - #x53B6 #x5F01 #x755A #x5DEF #x574C #x57A9 #x57A1 #x587E #x58BC #x58C5 - #x58D1 #x5729 #x572C #x572A #x5733 #x5739 #x572E #x572F #x575C #x573B - #x5742 #x5769 #x5785 #x576B #x5786 #x577C #x577B #x5768 #x576D #x5776 - #x5773 #x57AD #x57A4 #x578C #x57B2 #x57CF #x57A7 #x57B4 #x5793 #x57A0 - #x57D5 #x57D8 #x57DA #x57D9 #x57D2 #x57B8 #x57F4 #x57EF #x57F8 #x57E4 - #x57DD #x580B #x580D #x57FD #x57ED #x5800 #x581E #x5819 #x5844 #x5820 - #x5865 #x586C #x5881 #x5889 #x589A #x5880 #x99A8 #x9F19 #x61FF #x8279 - #x827D #x827F #x828F #x828A #x82A8 #x8284 #x828E #x8291 #x8297 #x8299 - #x82AB #x82B8 #x82BE #x82B0 #x82C8 #x82CA #x82E3 #x8298 #x82B7 #x82AE - #x82CB #x82CC #x82C1 #x82A9 #x82B4 #x82A1 #x82AA #x829F #x82C4 #x82CE - #x82A4 #x82E1 #x8309 #x82F7 #x82E4 #x830F #x8307 #x82DC #x82F4 #x82D2 - #x82D8 #x830C #x82FB #x82D3 #x8311 #x831A #x8306 #x8314 #x8315 #x82E0 - #x82D5 #x831C #x8351 #x835B #x835C #x8308 #x8392 #x833C #x8334 #x8331 - #x839B #x835E #x832F #x834F #x8347 #x8343 #x835F #x8340 #x8317 #x8360 - #x832D #x833A #x8333 #x8366 #x8365 #x8368 #x831B #x8369 #x836C #x836A - #x836D #x836E #x83B0 #x8378 #x83B3 #x83B4 #x83A0 #x83AA #x8393 #x839C - #x8385 #x837C #x83B6 #x83A9 #x837D #x83B8 #x837B #x8398 #x839E #x83A8 - #x83BA #x83BC #x83C1 #x8401 #x83E5 #x83D8 #x5807 #x8418 #x840B #x83DD - #x83FD #x83D6 #x841C #x8438 #x8411 #x8406 #x83D4 #x83DF #x840F #x8403 - #x83F8 #x83F9 #x83EA #x83C5 #x83C0 #x8426 #x83F0 #x83E1 #x845C #x8451 - #x845A #x8459 #x8473 #x8487 #x8488 #x847A #x8489 #x8478 #x843C #x8446 - #x8469 #x8476 #x848C #x848E #x8431 #x846D #x84C1 #x84CD #x84D0 #x84E6 - #x84BD #x84D3 #x84CA #x84BF #x84BA #x84E0 #x84A1 #x84B9 #x84B4 #x8497 - #x84E5 #x84E3 #x850C #x750D #x8538 #x84F0 #x8539 #x851F #x853A #x8556 - #x853B #x84FF #x84FC #x8559 #x8548 #x8568 #x8564 #x855E #x857A #x77A2 - #x8543 #x8572 #x857B #x85A4 #x85A8 #x8587 #x858F #x8579 #x85AE #x859C - #x8585 #x85B9 #x85B7 #x85B0 #x85D3 #x85C1 #x85DC #x85FF #x8627 #x8605 - #x8629 #x8616 #x863C #x5EFE #x5F08 #x593C #x5941 #x8037 #x5955 #x595A - #x5958 #x530F #x5C22 #x5C25 #x5C2C #x5C34 #x624C #x626A #x629F #x62BB - #x62CA #x62DA #x62D7 #x62EE #x6322 #x62F6 #x6339 #x634B #x6343 #x63AD - #x63F6 #x6371 #x637A #x638E #x63B4 #x636D #x63AC #x638A #x6369 #x63AE - #x63BC #x63F2 #x63F8 #x63E0 #x63FF #x63C4 #x63DE #x63CE #x6452 #x63C6 - #x63BE #x6445 #x6441 #x640B #x641B #x6420 #x640C #x6426 #x6421 #x645E - #x6484 #x646D #x6496 #x647A #x64B7 #x64B8 #x6499 #x64BA #x64C0 #x64D0 - #x64D7 #x64E4 #x64E2 #x6509 #x6525 #x652E #x5F0B #x5FD2 #x7519 #x5F11 - #x535F #x53F1 #x53FD #x53E9 #x53E8 #x53FB #x5412 #x5416 #x5406 #x544B - #x5452 #x5453 #x5454 #x5456 #x5443 #x5421 #x5457 #x5459 #x5423 #x5432 - #x5482 #x5494 #x5477 #x5471 #x5464 #x549A #x549B #x5484 #x5476 #x5466 - #x549D #x54D0 #x54AD #x54C2 #x54B4 #x54D2 #x54A7 #x54A6 #x54D3 #x54D4 - #x5472 #x54A3 #x54D5 #x54BB #x54BF #x54CC #x54D9 #x54DA #x54DC #x54A9 - #x54AA #x54A4 #x54DD #x54CF #x54DE #x551B #x54E7 #x5520 #x54FD #x5514 - #x54F3 #x5522 #x5523 #x550F #x5511 #x5527 #x552A #x5567 #x558F #x55B5 - #x5549 #x556D #x5541 #x5555 #x553F #x5550 #x553C #x5537 #x5556 #x5575 - #x5576 #x5577 #x5533 #x5530 #x555C #x558B #x55D2 #x5583 #x55B1 #x55B9 - #x5588 #x5581 #x559F #x557E #x55D6 #x5591 #x557B #x55DF #x55BD #x55BE - #x5594 #x5599 #x55EA #x55F7 #x55C9 #x561F #x55D1 #x55EB #x55EC #x55D4 - #x55E6 #x55DD #x55C4 #x55EF #x55E5 #x55F2 #x55F3 #x55CC #x55CD #x55E8 - #x55F5 #x55E4 #x8F94 #x561E #x5608 #x560C #x5601 #x5624 #x5623 #x55FE - #x5600 #x5627 #x562D #x5658 #x5639 #x5657 #x562C #x564D #x5662 #x5659 - #x565C #x564C #x5654 #x5686 #x5664 #x5671 #x566B #x567B #x567C #x5685 - #x5693 #x56AF #x56D4 #x56D7 #x56DD #x56E1 #x56F5 #x56EB #x56F9 #x56FF - #x5704 #x570A #x5709 #x571C #x5E0F #x5E19 #x5E14 #x5E11 #x5E31 #x5E3B - #x5E3C #x5E37 #x5E44 #x5E54 #x5E5B #x5E5E #x5E61 #x5C8C #x5C7A #x5C8D - #x5C90 #x5C96 #x5C88 #x5C98 #x5C99 #x5C91 #x5C9A #x5C9C #x5CB5 #x5CA2 - #x5CBD #x5CAC #x5CAB #x5CB1 #x5CA3 #x5CC1 #x5CB7 #x5CC4 #x5CD2 #x5CE4 - #x5CCB #x5CE5 #x5D02 #x5D03 #x5D27 #x5D26 #x5D2E #x5D24 #x5D1E #x5D06 - #x5D1B #x5D58 #x5D3E #x5D34 #x5D3D #x5D6C #x5D5B #x5D6F #x5D5D #x5D6B - #x5D4B #x5D4A #x5D69 #x5D74 #x5D82 #x5D99 #x5D9D #x8C73 #x5DB7 #x5DC5 - #x5F73 #x5F77 #x5F82 #x5F87 #x5F89 #x5F8C #x5F95 #x5F99 #x5F9C #x5FA8 - #x5FAD #x5FB5 #x5FBC #x8862 #x5F61 #x72AD #x72B0 #x72B4 #x72B7 #x72B8 - #x72C3 #x72C1 #x72CE #x72CD #x72D2 #x72E8 #x72EF #x72E9 #x72F2 #x72F4 - #x72F7 #x7301 #x72F3 #x7303 #x72FA #x72FB #x7317 #x7313 #x7321 #x730A - #x731E #x731D #x7315 #x7322 #x7339 #x7325 #x732C #x7338 #x7331 #x7350 - #x734D #x7357 #x7360 #x736C #x736F #x737E #x821B #x5925 #x98E7 #x5924 - #x5902 #x9963 #x9967 #x9968 #x9969 #x996A #x996B #x996C #x9974 #x9977 - #x997D #x9980 #x9984 #x9987 #x998A #x998D #x9990 #x9991 #x9993 #x9994 - #x9995 #x5E80 #x5E91 #x5E8B #x5E96 #x5EA5 #x5EA0 #x5EB9 #x5EB5 #x5EBE - #x5EB3 #x8D53 #x5ED2 #x5ED1 #x5EDB #x5EE8 #x5EEA #x81BA #x5FC4 #x5FC9 - #x5FD6 #x5FCF #x6003 #x5FEE #x6004 #x5FE1 #x5FE4 #x5FFE #x6005 #x6006 - #x5FEA #x5FED #x5FF8 #x6019 #x6035 #x6026 #x601B #x600F #x600D #x6029 - #x602B #x600A #x603F #x6021 #x6078 #x6079 #x607B #x607A #x6042 #x606A - #x607D #x6096 #x609A #x60AD #x609D #x6083 #x6092 #x608C #x609B #x60EC - #x60BB #x60B1 #x60DD #x60D8 #x60C6 #x60DA #x60B4 #x6120 #x6126 #x6115 - #x6123 #x60F4 #x6100 #x610E #x612B #x614A #x6175 #x61AC #x6194 #x61A7 - #x61B7 #x61D4 #x61F5 #x5FDD #x96B3 #x95E9 #x95EB #x95F1 #x95F3 #x95F5 - #x95F6 #x95FC #x95FE #x9603 #x9604 #x9606 #x9608 #x960A #x960B #x960C - #x960D #x960F #x9612 #x9615 #x9616 #x9617 #x9619 #x961A #x4E2C #x723F - #x6215 #x6C35 #x6C54 #x6C5C #x6C4A #x6CA3 #x6C85 #x6C90 #x6C94 #x6C8C - #x6C68 #x6C69 #x6C74 #x6C76 #x6C86 #x6CA9 #x6CD0 #x6CD4 #x6CAD #x6CF7 - #x6CF8 #x6CF1 #x6CD7 #x6CB2 #x6CE0 #x6CD6 #x6CFA #x6CEB #x6CEE #x6CB1 - #x6CD3 #x6CEF #x6CFE #x6D39 #x6D27 #x6D0C #x6D43 #x6D48 #x6D07 #x6D04 - #x6D19 #x6D0E #x6D2B #x6D4D #x6D2E #x6D35 #x6D1A #x6D4F #x6D52 #x6D54 - #x6D33 #x6D91 #x6D6F #x6D9E #x6DA0 #x6D5E #x6D93 #x6D94 #x6D5C #x6D60 - #x6D7C #x6D63 #x6E1A #x6DC7 #x6DC5 #x6DDE #x6E0E #x6DBF #x6DE0 #x6E11 - #x6DE6 #x6DDD #x6DD9 #x6E16 #x6DAB #x6E0C #x6DAE #x6E2B #x6E6E #x6E4E - #x6E6B #x6EB2 #x6E5F #x6E86 #x6E53 #x6E54 #x6E32 #x6E25 #x6E44 #x6EDF - #x6EB1 #x6E98 #x6EE0 #x6F2D #x6EE2 #x6EA5 #x6EA7 #x6EBD #x6EBB #x6EB7 - #x6ED7 #x6EB4 #x6ECF #x6E8F #x6EC2 #x6E9F #x6F62 #x6F46 #x6F47 #x6F24 - #x6F15 #x6EF9 #x6F2F #x6F36 #x6F4B #x6F74 #x6F2A #x6F09 #x6F29 #x6F89 - #x6F8D #x6F8C #x6F78 #x6F72 #x6F7C #x6F7A #x6FD1 #x6FC9 #x6FA7 #x6FB9 - #x6FB6 #x6FC2 #x6FE1 #x6FEE #x6FDE #x6FE0 #x6FEF #x701A #x7023 #x701B - #x7039 #x7035 #x704F #x705E #x5B80 #x5B84 #x5B95 #x5B93 #x5BA5 #x5BB8 - #x752F #x9A9E #x6434 #x5BE4 #x5BEE #x8930 #x5BF0 #x8E47 #x8B07 #x8FB6 - #x8FD3 #x8FD5 #x8FE5 #x8FEE #x8FE4 #x8FE9 #x8FE6 #x8FF3 #x8FE8 #x9005 - #x9004 #x900B #x9026 #x9011 #x900D #x9016 #x9021 #x9035 #x9036 #x902D - #x902F #x9044 #x9051 #x9052 #x9050 #x9068 #x9058 #x9062 #x905B #x66B9 - #x9074 #x907D #x9082 #x9088 #x9083 #x908B #x5F50 #x5F57 #x5F56 #x5F58 - #x5C3B #x54AB #x5C50 #x5C59 #x5B71 #x5C63 #x5C66 #x7FBC #x5F2A #x5F29 - #x5F2D #x8274 #x5F3C #x9B3B #x5C6E #x5981 #x5983 #x598D #x59A9 #x59AA - #x59A3 #x5997 #x59CA #x59AB #x599E #x59A4 #x59D2 #x59B2 #x59AF #x59D7 - #x59BE #x5A05 #x5A06 #x59DD #x5A08 #x59E3 #x59D8 #x59F9 #x5A0C #x5A09 - #x5A32 #x5A34 #x5A11 #x5A23 #x5A13 #x5A40 #x5A67 #x5A4A #x5A55 #x5A3C - #x5A62 #x5A75 #x80EC #x5AAA #x5A9B #x5A77 #x5A7A #x5ABE #x5AEB #x5AB2 - #x5AD2 #x5AD4 #x5AB8 #x5AE0 #x5AE3 #x5AF1 #x5AD6 #x5AE6 #x5AD8 #x5ADC - #x5B09 #x5B17 #x5B16 #x5B32 #x5B37 #x5B40 #x5C15 #x5C1C #x5B5A #x5B65 - #x5B73 #x5B51 #x5B53 #x5B62 #x9A75 #x9A77 #x9A78 #x9A7A #x9A7F #x9A7D - #x9A80 #x9A81 #x9A85 #x9A88 #x9A8A #x9A90 #x9A92 #x9A93 #x9A96 #x9A98 - #x9A9B #x9A9C #x9A9D #x9A9F #x9AA0 #x9AA2 #x9AA3 #x9AA5 #x9AA7 #x7E9F - #x7EA1 #x7EA3 #x7EA5 #x7EA8 #x7EA9 #x7EAD #x7EB0 #x7EBE #x7EC0 #x7EC1 - #x7EC2 #x7EC9 #x7ECB #x7ECC #x7ED0 #x7ED4 #x7ED7 #x7EDB #x7EE0 #x7EE1 - #x7EE8 #x7EEB #x7EEE #x7EEF #x7EF1 #x7EF2 #x7F0D #x7EF6 #x7EFA #x7EFB - #x7EFE #x7F01 #x7F02 #x7F03 #x7F07 #x7F08 #x7F0B #x7F0C #x7F0F #x7F11 - #x7F12 #x7F17 #x7F19 #x7F1C #x7F1B #x7F1F #x7F21 #x7F22 #x7F23 #x7F24 - #x7F25 #x7F26 #x7F27 #x7F2A #x7F2B #x7F2C #x7F2D #x7F2F #x7F30 #x7F31 - #x7F32 #x7F33 #x7F35 #x5E7A #x757F #x5DDB #x753E #x9095 #x738E #x7391 - #x73AE #x73A2 #x739F #x73CF #x73C2 #x73D1 #x73B7 #x73B3 #x73C0 #x73C9 - #x73C8 #x73E5 #x73D9 #x987C #x740A #x73E9 #x73E7 #x73DE #x73BA #x73F2 - #x740F #x742A #x745B #x7426 #x7425 #x7428 #x7430 #x742E #x742C #x741B - #x741A #x7441 #x745C #x7457 #x7455 #x7459 #x7477 #x746D #x747E #x749C - #x748E #x7480 #x7481 #x7487 #x748B #x749E #x74A8 #x74A9 #x7490 #x74A7 - #x74D2 #x74BA #x97EA #x97EB #x97EC #x674C #x6753 #x675E #x6748 #x6769 - #x67A5 #x6787 #x676A #x6773 #x6798 #x67A7 #x6775 #x67A8 #x679E #x67AD - #x678B #x6777 #x677C #x67F0 #x6809 #x67D8 #x680A #x67E9 #x67B0 #x680C - #x67D9 #x67B5 #x67DA #x67B3 #x67DD #x6800 #x67C3 #x67B8 #x67E2 #x680E - #x67C1 #x67FD #x6832 #x6833 #x6860 #x6861 #x684E #x6862 #x6844 #x6864 - #x6883 #x681D #x6855 #x6866 #x6841 #x6867 #x6840 #x683E #x684A #x6849 - #x6829 #x68B5 #x688F #x6874 #x6877 #x6893 #x686B #x68C2 #x696E #x68FC - #x691F #x6920 #x68F9 #x6924 #x68F0 #x690B #x6901 #x6957 #x68E3 #x6910 - #x6971 #x6939 #x6960 #x6942 #x695D #x6984 #x696B #x6980 #x6998 #x6978 - #x6934 #x69CC #x6987 #x6988 #x69CE #x6989 #x6966 #x6963 #x6979 #x699B - #x69A7 #x69BB #x69AB #x69AD #x69D4 #x69B1 #x69C1 #x69CA #x69DF #x6995 - #x69E0 #x698D #x69FF #x6A2F #x69ED #x6A17 #x6A18 #x6A65 #x69F2 #x6A44 - #x6A3E #x6AA0 #x6A50 #x6A5B #x6A35 #x6A8E #x6A79 #x6A3D #x6A28 #x6A58 - #x6A7C #x6A91 #x6A90 #x6AA9 #x6A97 #x6AAB #x7337 #x7352 #x6B81 #x6B82 - #x6B87 #x6B84 #x6B92 #x6B93 #x6B8D #x6B9A #x6B9B #x6BA1 #x6BAA #x8F6B - #x8F6D #x8F71 #x8F72 #x8F73 #x8F75 #x8F76 #x8F78 #x8F77 #x8F79 #x8F7A - #x8F7C #x8F7E #x8F81 #x8F82 #x8F84 #x8F87 #x8F8B #x8F8D #x8F8E #x8F8F - #x8F98 #x8F9A #x8ECE #x620B #x6217 #x621B #x621F #x6222 #x6221 #x6225 - #x6224 #x622C #x81E7 #x74EF #x74F4 #x74FF #x750F #x7511 #x7513 #x6534 - #x65EE #x65EF #x65F0 #x660A #x6619 #x6772 #x6603 #x6615 #x6600 #x7085 - #x66F7 #x661D #x6634 #x6631 #x6636 #x6635 #x8006 #x665F #x6654 #x6641 - #x664F #x6656 #x6661 #x6657 #x6677 #x6684 #x668C #x66A7 #x669D #x66BE - #x66DB #x66DC #x66E6 #x66E9 #x8D32 #x8D33 #x8D36 #x8D3B #x8D3D #x8D40 - #x8D45 #x8D46 #x8D48 #x8D49 #x8D47 #x8D4D #x8D55 #x8D59 #x89C7 #x89CA - #x89CB #x89CC #x89CE #x89CF #x89D0 #x89D1 #x726E #x729F #x725D #x7266 - #x726F #x727E #x727F #x7284 #x728B #x728D #x728F #x7292 #x6308 #x6332 - #x63B0 #x643F #x64D8 #x8004 #x6BEA #x6BF3 #x6BFD #x6BF5 #x6BF9 #x6C05 - #x6C07 #x6C06 #x6C0D #x6C15 #x6C18 #x6C19 #x6C1A #x6C21 #x6C29 #x6C24 - #x6C2A #x6C32 #x6535 #x6555 #x656B #x724D #x7252 #x7256 #x7230 #x8662 - #x5216 #x809F #x809C #x8093 #x80BC #x670A #x80BD #x80B1 #x80AB #x80AD - #x80B4 #x80B7 #x80E7 #x80E8 #x80E9 #x80EA #x80DB #x80C2 #x80C4 #x80D9 - #x80CD #x80D7 #x6710 #x80DD #x80EB #x80F1 #x80F4 #x80ED #x810D #x810E - #x80F2 #x80FC #x6715 #x8112 #x8C5A #x8136 #x811E #x812C #x8118 #x8132 - #x8148 #x814C #x8153 #x8174 #x8159 #x815A #x8171 #x8160 #x8169 #x817C - #x817D #x816D #x8167 #x584D #x5AB5 #x8188 #x8182 #x8191 #x6ED5 #x81A3 - #x81AA #x81CC #x6726 #x81CA #x81BB #x81C1 #x81A6 #x6B24 #x6B37 #x6B39 - #x6B43 #x6B46 #x6B59 #x98D1 #x98D2 #x98D3 #x98D5 #x98D9 #x98DA #x6BB3 - #x5F40 #x6BC2 #x89F3 #x6590 #x9F51 #x6593 #x65BC #x65C6 #x65C4 #x65C3 - #x65CC #x65CE #x65D2 #x65D6 #x7080 #x709C #x7096 #x709D #x70BB #x70C0 - #x70B7 #x70AB #x70B1 #x70E8 #x70CA #x7110 #x7113 #x7116 #x712F #x7131 - #x7173 #x715C #x7168 #x7145 #x7172 #x714A #x7178 #x717A #x7198 #x71B3 - #x71B5 #x71A8 #x71A0 #x71E0 #x71D4 #x71E7 #x71F9 #x721D #x7228 #x706C - #x7118 #x7166 #x71B9 #x623E #x623D #x6243 #x6248 #x6249 #x793B #x7940 - #x7946 #x7949 #x795B #x795C #x7953 #x795A #x7962 #x7957 #x7960 #x796F - #x7967 #x797A #x7985 #x798A #x799A #x79A7 #x79B3 #x5FD1 #x5FD0 #x603C - #x605D #x605A #x6067 #x6041 #x6059 #x6063 #x60AB #x6106 #x610D #x615D - #x61A9 #x619D #x61CB #x61D1 #x6206 #x8080 #x807F #x6C93 #x6CF6 #x6DFC - #x77F6 #x77F8 #x7800 #x7809 #x7817 #x7818 #x7811 #x65AB #x782D #x781C - #x781D #x7839 #x783A #x783B #x781F #x783C #x7825 #x782C #x7823 #x7829 - #x784E #x786D #x7856 #x7857 #x7826 #x7850 #x7847 #x784C #x786A #x789B - #x7893 #x789A #x7887 #x789C #x78A1 #x78A3 #x78B2 #x78B9 #x78A5 #x78D4 - #x78D9 #x78C9 #x78EC #x78F2 #x7905 #x78F4 #x7913 #x7924 #x791E #x7934 - #x9F9B #x9EF9 #x9EFB #x9EFC #x76F1 #x7704 #x770D #x76F9 #x7707 #x7708 - #x771A #x7722 #x7719 #x772D #x7726 #x7735 #x7738 #x7750 #x7751 #x7747 - #x7743 #x775A #x7768 #x7762 #x7765 #x777F #x778D #x777D #x7780 #x778C - #x7791 #x779F #x77A0 #x77B0 #x77B5 #x77BD #x753A #x7540 #x754E #x754B - #x7548 #x755B #x7572 #x7579 #x7583 #x7F58 #x7F61 #x7F5F #x8A48 #x7F68 - #x7F74 #x7F71 #x7F79 #x7F81 #x7F7E #x76CD #x76E5 #x8832 #x9485 #x9486 - #x9487 #x948B #x948A #x948C #x948D #x948F #x9490 #x9494 #x9497 #x9495 - #x949A #x949B #x949C #x94A3 #x94A4 #x94AB #x94AA #x94AD #x94AC #x94AF - #x94B0 #x94B2 #x94B4 #x94B6 #x94B7 #x94B8 #x94B9 #x94BA #x94BC #x94BD - #x94BF #x94C4 #x94C8 #x94C9 #x94CA #x94CB #x94CC #x94CD #x94CE #x94D0 - #x94D1 #x94D2 #x94D5 #x94D6 #x94D7 #x94D9 #x94D8 #x94DB #x94DE #x94DF - #x94E0 #x94E2 #x94E4 #x94E5 #x94E7 #x94E8 #x94EA #x94E9 #x94EB #x94EE - #x94EF #x94F3 #x94F4 #x94F5 #x94F7 #x94F9 #x94FC #x94FD #x94FF #x9503 - #x9502 #x9506 #x9507 #x9509 #x950A #x950D #x950E #x950F #x9512 #x9513 - #x9514 #x9515 #x9516 #x9518 #x951B #x951D #x951E #x951F #x9522 #x952A - #x952B #x9529 #x952C #x9531 #x9532 #x9534 #x9536 #x9537 #x9538 #x953C - #x953E #x953F #x9542 #x9535 #x9544 #x9545 #x9546 #x9549 #x954C #x954E - #x954F #x9552 #x9553 #x9554 #x9556 #x9557 #x9558 #x9559 #x955B #x955E - #x955F #x955D #x9561 #x9562 #x9564 #x9565 #x9566 #x9567 #x9568 #x9569 - #x956A #x956B #x956C #x956F #x9571 #x9572 #x9573 #x953A #x77E7 #x77EC - #x96C9 #x79D5 #x79ED #x79E3 #x79EB #x7A06 #x5D47 #x7A03 #x7A02 #x7A1E - #x7A14 #x7A39 #x7A37 #x7A51 #x9ECF #x99A5 #x7A70 #x7688 #x768E #x7693 - #x7699 #x76A4 #x74DE #x74E0 #x752C #x9E20 #x9E22 #x9E28 #x9E29 #x9E2A - #x9E2B #x9E2C #x9E32 #x9E31 #x9E36 #x9E38 #x9E37 #x9E39 #x9E3A #x9E3E - #x9E41 #x9E42 #x9E44 #x9E46 #x9E47 #x9E48 #x9E49 #x9E4B #x9E4C #x9E4E - #x9E51 #x9E55 #x9E57 #x9E5A #x9E5B #x9E5C #x9E5E #x9E63 #x9E66 #x9E67 - #x9E68 #x9E69 #x9E6A #x9E6B #x9E6C #x9E71 #x9E6D #x9E73 #x7592 #x7594 - #x7596 #x75A0 #x759D #x75AC #x75A3 #x75B3 #x75B4 #x75B8 #x75C4 #x75B1 - #x75B0 #x75C3 #x75C2 #x75D6 #x75CD #x75E3 #x75E8 #x75E6 #x75E4 #x75EB - #x75E7 #x7603 #x75F1 #x75FC #x75FF #x7610 #x7600 #x7605 #x760C #x7617 - #x760A #x7625 #x7618 #x7615 #x7619 #x761B #x763C #x7622 #x7620 #x7640 - #x762D #x7630 #x763F #x7635 #x7643 #x763E #x7633 #x764D #x765E #x7654 - #x765C #x7656 #x766B #x766F #x7FCA #x7AE6 #x7A78 #x7A79 #x7A80 #x7A86 - #x7A88 #x7A95 #x7AA6 #x7AA0 #x7AAC #x7AA8 #x7AAD #x7AB3 #x8864 #x8869 - #x8872 #x887D #x887F #x8882 #x88A2 #x88C6 #x88B7 #x88BC #x88C9 #x88E2 - #x88CE #x88E3 #x88E5 #x88F1 #x891A #x88FC #x88E8 #x88FE #x88F0 #x8921 - #x8919 #x8913 #x891B #x890A #x8934 #x892B #x8936 #x8941 #x8966 #x897B - #x758B #x80E5 #x76B2 #x76B4 #x77DC #x8012 #x8014 #x8016 #x801C #x8020 - #x8022 #x8025 #x8026 #x8027 #x8029 #x8028 #x8031 #x800B #x8035 #x8043 - #x8046 #x804D #x8052 #x8069 #x8071 #x8983 #x9878 #x9880 #x9883 #x9889 - #x988C #x988D #x988F #x9894 #x989A #x989B #x989E #x989F #x98A1 #x98A2 - #x98A5 #x98A6 #x864D #x8654 #x866C #x866E #x867F #x867A #x867C #x867B - #x86A8 #x868D #x868B #x86AC #x869D #x86A7 #x86A3 #x86AA #x8693 #x86A9 - #x86B6 #x86C4 #x86B5 #x86CE #x86B0 #x86BA #x86B1 #x86AF #x86C9 #x86CF - #x86B4 #x86E9 #x86F1 #x86F2 #x86ED #x86F3 #x86D0 #x8713 #x86DE #x86F4 - #x86DF #x86D8 #x86D1 #x8703 #x8707 #x86F8 #x8708 #x870A #x870D #x8709 - #x8723 #x873B #x871E #x8725 #x872E #x871A #x873E #x8748 #x8734 #x8731 - #x8729 #x8737 #x873F #x8782 #x8722 #x877D #x877E #x877B #x8760 #x8770 - #x874C #x876E #x878B #x8753 #x8763 #x877C #x8764 #x8759 #x8765 #x8793 - #x87AF #x87A8 #x87D2 #x87C6 #x8788 #x8785 #x87AD #x8797 #x8783 #x87AB - #x87E5 #x87AC #x87B5 #x87B3 #x87CB #x87D3 #x87BD #x87D1 #x87C0 #x87CA - #x87DB #x87EA #x87E0 #x87EE #x8816 #x8813 #x87FE #x880A #x881B #x8821 - #x8839 #x883C #x7F36 #x7F42 #x7F44 #x7F45 #x8210 #x7AFA #x7AFD #x7B08 - #x7B03 #x7B04 #x7B15 #x7B0A #x7B2B #x7B0F #x7B47 #x7B38 #x7B2A #x7B19 - #x7B2E #x7B31 #x7B20 #x7B25 #x7B24 #x7B33 #x7B3E #x7B1E #x7B58 #x7B5A - #x7B45 #x7B75 #x7B4C #x7B5D #x7B60 #x7B6E #x7B7B #x7B62 #x7B72 #x7B71 - #x7B90 #x7BA6 #x7BA7 #x7BB8 #x7BAC #x7B9D #x7BA8 #x7B85 #x7BAA #x7B9C - #x7BA2 #x7BAB #x7BB4 #x7BD1 #x7BC1 #x7BCC #x7BDD #x7BDA #x7BE5 #x7BE6 - #x7BEA #x7C0C #x7BFE #x7BFC #x7C0F #x7C16 #x7C0B #x7C1F #x7C2A #x7C26 - #x7C38 #x7C41 #x7C40 #x81FE #x8201 #x8202 #x8204 #x81EC #x8844 #x8221 - #x8222 #x8223 #x822D #x822F #x8228 #x822B #x8238 #x823B #x8233 #x8234 - #x823E #x8244 #x8249 #x824B #x824F #x825A #x825F #x8268 #x887E #x8885 - #x8888 #x88D8 #x88DF #x895E #x7F9D #x7F9F #x7FA7 #x7FAF #x7FB0 #x7FB2 - #x7C7C #x6549 #x7C91 #x7C9D #x7C9C #x7C9E #x7CA2 #x7CB2 #x7CBC #x7CBD - #x7CC1 #x7CC7 #x7CCC #x7CCD #x7CC8 #x7CC5 #x7CD7 #x7CE8 #x826E #x66A8 - #x7FBF #x7FCE #x7FD5 #x7FE5 #x7FE1 #x7FE6 #x7FE9 #x7FEE #x7FF3 #x7CF8 - #x7D77 #x7DA6 #x7DAE #x7E47 #x7E9B #x9EB8 #x9EB4 #x8D73 #x8D84 #x8D94 - #x8D91 #x8DB1 #x8D67 #x8D6D #x8C47 #x8C49 #x914A #x9150 #x914E #x914F - #x9164 #x9162 #x9161 #x9170 #x9169 #x916F #x917D #x917E #x9172 #x9174 - #x9179 #x918C #x9185 #x9190 #x918D #x9191 #x91A2 #x91A3 #x91AA #x91AD - #x91AE #x91AF #x91B5 #x91B4 #x91BA #x8C55 #x9E7E #x8DB8 #x8DEB #x8E05 - #x8E59 #x8E69 #x8DB5 #x8DBF #x8DBC #x8DBA #x8DC4 #x8DD6 #x8DD7 #x8DDA - #x8DDE #x8DCE #x8DCF #x8DDB #x8DC6 #x8DEC #x8DF7 #x8DF8 #x8DE3 #x8DF9 - #x8DFB #x8DE4 #x8E09 #x8DFD #x8E14 #x8E1D #x8E1F #x8E2C #x8E2E #x8E23 - #x8E2F #x8E3A #x8E40 #x8E39 #x8E35 #x8E3D #x8E31 #x8E49 #x8E41 #x8E42 - #x8E51 #x8E52 #x8E4A #x8E70 #x8E76 #x8E7C #x8E6F #x8E74 #x8E85 #x8E8F - #x8E94 #x8E90 #x8E9C #x8E9E #x8C78 #x8C82 #x8C8A #x8C85 #x8C98 #x8C94 - #x659B #x89D6 #x89DE #x89DA #x89DC #x89E5 #x89EB #x89EF #x8A3E #x8B26 - #x9753 #x96E9 #x96F3 #x96EF #x9706 #x9701 #x9708 #x970F #x970E #x972A - #x972D #x9730 #x973E #x9F80 #x9F83 #x9F85 #x9F86 #x9F87 #x9F88 #x9F89 - #x9F8A #x9F8C #x9EFE #x9F0B #x9F0D #x96B9 #x96BC #x96BD #x96CE #x96D2 - #x77BF #x96E0 #x928E #x92AE #x92C8 #x933E #x936A #x93CA #x938F #x943E - #x946B #x9C7F #x9C82 #x9C85 #x9C86 #x9C87 #x9C88 #x7A23 #x9C8B #x9C8E - #x9C90 #x9C91 #x9C92 #x9C94 #x9C95 #x9C9A #x9C9B #x9C9E #x9C9F #x9CA0 - #x9CA1 #x9CA2 #x9CA3 #x9CA5 #x9CA6 #x9CA7 #x9CA8 #x9CA9 #x9CAB #x9CAD - #x9CAE #x9CB0 #x9CB1 #x9CB2 #x9CB3 #x9CB4 #x9CB5 #x9CB6 #x9CB7 #x9CBA - #x9CBB #x9CBC #x9CBD #x9CC4 #x9CC5 #x9CC6 #x9CC7 #x9CCA #x9CCB #x9CCC - #x9CCD #x9CCE #x9CCF #x9CD0 #x9CD3 #x9CD4 #x9CD5 #x9CD7 #x9CD8 #x9CD9 - #x9CDC #x9CDD #x9CDF #x9CE2 #x977C #x9785 #x9791 #x9792 #x9794 #x97AF - #x97AB #x97A3 #x97B2 #x97B4 #x9AB1 #x9AB0 #x9AB7 #x9E58 #x9AB6 #x9ABA - #x9ABC #x9AC1 #x9AC0 #x9AC5 #x9AC2 #x9ACB #x9ACC #x9AD1 #x9B45 #x9B43 - #x9B47 #x9B49 #x9B48 #x9B4D #x9B51 #x98E8 #x990D #x992E #x9955 #x9954 - #x9ADF #x9AE1 #x9AE6 #x9AEF #x9AEB #x9AFB #x9AED #x9AF9 #x9B08 #x9B0F - #x9B13 #x9B1F #x9B23 #x9EBD #x9EBE #x7E3B #x9E82 #x9E87 #x9E88 #x9E8B - #x9E92 #x93D6 #x9E9D #x9E9F #x9EDB #x9EDC #x9EDD #x9EE0 #x9EDF #x9EE2 - #x9EE9 #x9EE7 #x9EE5 #x9EEA #x9EEF #x9F22 #x9F2C #x9F2F #x9F39 #x9F37 - #x9F3D #x9F3E #x9F44 #x4E02 #x4E04 #x4E05 #x4E06 #x4E0F #x4E12 #x4E17 - #x4E1F #x4E20 #x4E21 #x4E23 #x4E26 #x4E29 #x4E2E #x4E2F #x4E31 #x4E33 - #x4E35 #x4E37 #x4E3C #x4E40 #x4E41 #x4E42 #x4E44 #x4E46 #x4E4A #x4E51 - #x4E55 #x4E57 #x4E5A #x4E5B #x4E62 #x4E63 #x4E64 #x4E65 #x4E67 #x4E68 - #x4E6A #x4E6B #x4E6C #x4E6D #x4E6E #x4E6F #x4E72 #x4E74 #x4E75 #x4E76 - #x4E77 #x4E78 #x4E79 #x4E7A #x4E7B #x4E7C #x4E7D #x4E7F #x4E80 #x4E81 - #x4E82 #x4E83 #x4E84 #x4E85 #x4E87 #x4E8A #x4E90 #x4E96 #x4E97 #x4E99 - #x4E9C #x4E9D #x4E9E #x4EA3 #x4EAA #x4EAF #x4EB0 #x4EB1 #x4EB4 #x4EB6 - #x4EB7 #x4EB8 #x4EB9 #x4EBC #x4EBD #x4EBE #x4EC8 #x4ECC #x4ECF #x4ED0 - #x4ED2 #x4EDA #x4EDB #x4EDC #x4EE0 #x4EE2 #x4EE6 #x4EE7 #x4EE9 #x4EED - #x4EEE #x4EEF #x4EF1 #x4EF4 #x4EF8 #x4EF9 #x4EFA #x4EFC #x4EFE #x4F00 - #x4F02 #x4F03 #x4F04 #x4F05 #x4F06 #x4F07 #x4F08 #x4F0B #x4F0C #x4F12 - #x4F13 #x4F14 #x4F15 #x4F16 #x4F1C #x4F1D #x4F21 #x4F23 #x4F28 #x4F29 - #x4F2C #x4F2D #x4F2E #x4F31 #x4F33 #x4F35 #x4F37 #x4F39 #x4F3B #x4F3E - #x4F3F #x4F40 #x4F41 #x4F42 #x4F44 #x4F45 #x4F47 #x4F48 #x4F49 #x4F4A - #x4F4B #x4F4C #x4F52 #x4F54 #x4F56 #x4F61 #x4F62 #x4F66 #x4F68 #x4F6A - #x4F6B #x4F6D #x4F6E #x4F71 #x4F72 #x4F75 #x4F77 #x4F78 #x4F79 #x4F7A - #x4F7D #x4F80 #x4F81 #x4F82 #x4F85 #x4F86 #x4F87 #x4F8A #x4F8C #x4F8E - #x4F90 #x4F92 #x4F93 #x4F95 #x4F96 #x4F98 #x4F99 #x4F9A #x4F9C #x4F9E - #x4F9F #x4FA1 #x4FA2 #x4FA4 #x4FAB #x4FAD #x4FB0 #x4FB1 #x4FB2 #x4FB3 - #x4FB4 #x4FB6 #x4FB7 #x4FB8 #x4FB9 #x4FBA #x4FBB #x4FBC #x4FBD #x4FBE - #x4FC0 #x4FC1 #x4FC2 #x4FC6 #x4FC7 #x4FC8 #x4FC9 #x4FCB #x4FCC #x4FCD - #x4FD2 #x4FD3 #x4FD4 #x4FD5 #x4FD6 #x4FD9 #x4FDB #x4FE0 #x4FE2 #x4FE4 - #x4FE5 #x4FE7 #x4FEB #x4FEC #x4FF0 #x4FF2 #x4FF4 #x4FF5 #x4FF6 #x4FF7 - #x4FF9 #x4FFB #x4FFC #x4FFD #x4FFF #x5000 #x5001 #x5002 #x5003 #x5004 - #x5005 #x5006 #x5007 #x5008 #x5009 #x500A #x500B #x500E #x5010 #x5011 - #x5013 #x5015 #x5016 #x5017 #x501B #x501D #x501E #x5020 #x5022 #x5023 - #x5024 #x5027 #x502B #x502F #x5030 #x5031 #x5032 #x5033 #x5034 #x5035 - #x5036 #x5037 #x5038 #x5039 #x503B #x503D #x503F #x5040 #x5041 #x5042 - #x5044 #x5045 #x5046 #x5049 #x504A #x504B #x504D #x5050 #x5051 #x5052 - #x5053 #x5054 #x5056 #x5057 #x5058 #x5059 #x505B #x505D #x505E #x505F - #x5060 #x5061 #x5062 #x5063 #x5064 #x5066 #x5067 #x5068 #x5069 #x506A - #x506B #x506D #x506E #x506F #x5070 #x5071 #x5072 #x5073 #x5074 #x5075 - #x5078 #x5079 #x507A #x507C #x507D #x5081 #x5082 #x5083 #x5084 #x5086 - #x5087 #x5089 #x508A #x508B #x508C #x508E #x508F #x5090 #x5091 #x5092 - #x5093 #x5094 #x5095 #x5096 #x5097 #x5098 #x5099 #x509A #x509B #x509C - #x509D #x509E #x509F #x50A0 #x50A1 #x50A2 #x50A4 #x50A6 #x50AA #x50AB - #x50AD #x50AE #x50AF #x50B0 #x50B1 #x50B3 #x50B4 #x50B5 #x50B6 #x50B7 - #x50B8 #x50B9 #x50BC #x50BD #x50BE #x50BF #x50C0 #x50C1 #x50C2 #x50C3 - #x50C4 #x50C5 #x50C6 #x50C7 #x50C8 #x50C9 #x50CA #x50CB #x50CC #x50CD - #x50CE #x50D0 #x50D1 #x50D2 #x50D3 #x50D4 #x50D5 #x50D7 #x50D8 #x50D9 - #x50DB #x50DC #x50DD #x50DE #x50DF #x50E0 #x50E1 #x50E2 #x50E3 #x50E4 - #x50E5 #x50E8 #x50E9 #x50EA #x50EB #x50EF #x50F0 #x50F1 #x50F2 #x50F4 - #x50F6 #x50F7 #x50F8 #x50F9 #x50FA #x50FC #x50FD #x50FE #x50FF #x5100 - #x5101 #x5102 #x5103 #x5104 #x5105 #x5108 #x5109 #x510A #x510C #x510D - #x510E #x510F #x5110 #x5111 #x5113 #x5114 #x5115 #x5116 #x5117 #x5118 - #x5119 #x511A #x511B #x511C #x511D #x511E #x511F #x5120 #x5122 #x5123 - #x5124 #x5125 #x5126 #x5127 #x5128 #x5129 #x512A #x512B #x512C #x512D - #x512E #x512F #x5130 #x5131 #x5132 #x5133 #x5134 #x5135 #x5136 #x5137 - #x5138 #x5139 #x513A #x513B #x513C #x513D #x513E #x5142 #x5147 #x514A - #x514C #x514E #x514F #x5150 #x5152 #x5153 #x5157 #x5158 #x5159 #x515B - #x515D #x515E #x515F #x5160 #x5161 #x5163 #x5164 #x5166 #x5167 #x5169 - #x516A #x516F #x5172 #x517A #x517E #x517F #x5183 #x5184 #x5186 #x5187 - #x518A #x518B #x518E #x518F #x5190 #x5191 #x5193 #x5194 #x5198 #x519A - #x519D #x519E #x519F #x51A1 #x51A3 #x51A6 #x51A7 #x51A8 #x51A9 #x51AA - #x51AD #x51AE #x51B4 #x51B8 #x51B9 #x51BA #x51BE #x51BF #x51C1 #x51C2 - #x51C3 #x51C5 #x51C8 #x51CA #x51CD #x51CE #x51D0 #x51D2 #x51D3 #x51D4 - #x51D5 #x51D6 #x51D7 #x51D8 #x51D9 #x51DA #x51DC #x51DE #x51DF #x51E2 - #x51E3 #x51E5 #x51E6 #x51E7 #x51E8 #x51E9 #x51EA #x51EC #x51EE #x51F1 - #x51F2 #x51F4 #x51F7 #x51FE #x5204 #x5205 #x5209 #x520B #x520C #x520F - #x5210 #x5213 #x5214 #x5215 #x521C #x521E #x521F #x5221 #x5222 #x5223 - #x5225 #x5226 #x5227 #x522A #x522C #x522F #x5231 #x5232 #x5234 #x5235 - #x523C #x523E #x5244 #x5245 #x5246 #x5247 #x5248 #x5249 #x524B #x524E - #x524F #x5252 #x5253 #x5255 #x5257 #x5258 #x5259 #x525A #x525B #x525D - #x525F #x5260 #x5262 #x5263 #x5264 #x5266 #x5268 #x526B #x526C #x526D - #x526E #x5270 #x5271 #x5273 #x5274 #x5275 #x5276 #x5277 #x5278 #x5279 - #x527A #x527B #x527C #x527E #x5280 #x5283 #x5284 #x5285 #x5286 #x5287 - #x5289 #x528A #x528B #x528C #x528D #x528E #x528F #x5291 #x5292 #x5294 - #x5295 #x5296 #x5297 #x5298 #x5299 #x529A #x529C #x52A4 #x52A5 #x52A6 - #x52A7 #x52AE #x52AF #x52B0 #x52B4 #x52B5 #x52B6 #x52B7 #x52B8 #x52B9 - #x52BA #x52BB #x52BC #x52BD #x52C0 #x52C1 #x52C2 #x52C4 #x52C5 #x52C6 - #x52C8 #x52CA #x52CC #x52CD #x52CE #x52CF #x52D1 #x52D3 #x52D4 #x52D5 - #x52D7 #x52D9 #x52DA #x52DB #x52DC #x52DD #x52DE #x52E0 #x52E1 #x52E2 - #x52E3 #x52E5 #x52E6 #x52E7 #x52E8 #x52E9 #x52EA #x52EB #x52EC #x52ED - #x52EE #x52EF #x52F1 #x52F2 #x52F3 #x52F4 #x52F5 #x52F6 #x52F7 #x52F8 - #x52FB #x52FC #x52FD #x5301 #x5302 #x5303 #x5304 #x5307 #x5309 #x530A - #x530B #x530C #x530E #x5311 #x5312 #x5313 #x5314 #x5318 #x531B #x531C - #x531E #x531F #x5322 #x5324 #x5325 #x5327 #x5328 #x5329 #x532B #x532C - #x532D #x532F #x5330 #x5331 #x5332 #x5333 #x5334 #x5335 #x5336 #x5337 - #x5338 #x533C #x533D #x5340 #x5342 #x5344 #x5346 #x534B #x534C #x534D - #x5350 #x5354 #x5358 #x5359 #x535B #x535D #x5365 #x5368 #x536A #x536C - #x536D #x5372 #x5376 #x5379 #x537B #x537C #x537D #x537E #x5380 #x5381 - #x5383 #x5387 #x5388 #x538A #x538E #x538F #x5390 #x5391 #x5392 #x5393 - #x5394 #x5396 #x5397 #x5399 #x539B #x539C #x539E #x53A0 #x53A1 #x53A4 - #x53A7 #x53AA #x53AB #x53AC #x53AD #x53AF #x53B0 #x53B1 #x53B2 #x53B3 - #x53B4 #x53B5 #x53B7 #x53B8 #x53B9 #x53BA #x53BC #x53BD #x53BE #x53C0 - #x53C3 #x53C4 #x53C5 #x53C6 #x53C7 #x53CE #x53CF #x53D0 #x53D2 #x53D3 - #x53D5 #x53DA #x53DC #x53DD #x53DE #x53E1 #x53E2 #x53E7 #x53F4 #x53FA - #x53FE #x53FF #x5400 #x5402 #x5405 #x5407 #x540B #x5414 #x5418 #x5419 - #x541A #x541C #x5422 #x5424 #x5425 #x542A #x5430 #x5433 #x5436 #x5437 - #x543A #x543D #x543F #x5441 #x5442 #x5444 #x5445 #x5447 #x5449 #x544C - #x544D #x544E #x544F #x5451 #x545A #x545D #x545E #x545F #x5460 #x5461 - #x5463 #x5465 #x5467 #x5469 #x546A #x546B #x546C #x546D #x546E #x546F - #x5470 #x5474 #x5479 #x547A #x547E #x547F #x5481 #x5483 #x5485 #x5487 - #x5488 #x5489 #x548A #x548D #x5491 #x5493 #x5497 #x5498 #x549C #x549E - #x549F #x54A0 #x54A1 #x54A2 #x54A5 #x54AE #x54B0 #x54B2 #x54B5 #x54B6 - #x54B7 #x54B9 #x54BA #x54BC #x54BE #x54C3 #x54C5 #x54CA #x54CB #x54D6 - #x54D8 #x54DB #x54E0 #x54E1 #x54E2 #x54E3 #x54E4 #x54EB #x54EC #x54EF - #x54F0 #x54F1 #x54F4 #x54F5 #x54F6 #x54F7 #x54F8 #x54F9 #x54FB #x54FE - #x5500 #x5502 #x5503 #x5504 #x5505 #x5508 #x550A #x550B #x550C #x550D - #x550E #x5512 #x5513 #x5515 #x5516 #x5517 #x5518 #x5519 #x551A #x551C - #x551D #x551E #x551F #x5521 #x5525 #x5526 #x5528 #x5529 #x552B #x552D - #x5532 #x5534 #x5535 #x5536 #x5538 #x5539 #x553A #x553B #x553D #x5540 - #x5542 #x5545 #x5547 #x5548 #x554B #x554C #x554D #x554E #x554F #x5551 - #x5552 #x5553 #x5554 #x5557 #x5558 #x5559 #x555A #x555B #x555D #x555E - #x555F #x5560 #x5562 #x5563 #x5568 #x5569 #x556B #x556F #x5570 #x5571 - #x5572 #x5573 #x5574 #x5579 #x557A #x557D #x557F #x5585 #x5586 #x558C - #x558D #x558E #x5590 #x5592 #x5593 #x5595 #x5596 #x5597 #x559A #x559B - #x559E #x55A0 #x55A1 #x55A2 #x55A3 #x55A4 #x55A5 #x55A6 #x55A8 #x55A9 - #x55AA #x55AB #x55AC #x55AD #x55AE #x55AF #x55B0 #x55B2 #x55B4 #x55B6 - #x55B8 #x55BA #x55BC #x55BF #x55C0 #x55C1 #x55C2 #x55C3 #x55C6 #x55C7 - #x55C8 #x55CA #x55CB #x55CE #x55CF #x55D0 #x55D5 #x55D7 #x55D8 #x55D9 - #x55DA #x55DB #x55DE #x55E0 #x55E2 #x55E7 #x55E9 #x55ED #x55EE #x55F0 - #x55F1 #x55F4 #x55F6 #x55F8 #x55F9 #x55FA #x55FB #x55FC #x55FF #x5602 - #x5603 #x5604 #x5605 #x5606 #x5607 #x560A #x560B #x560D #x5610 #x5611 - #x5612 #x5613 #x5614 #x5615 #x5616 #x5617 #x5619 #x561A #x561C #x561D - #x5620 #x5621 #x5622 #x5625 #x5626 #x5628 #x5629 #x562A #x562B #x562E - #x562F #x5630 #x5633 #x5635 #x5637 #x5638 #x563A #x563C #x563D #x563E - #x5640 #x5641 #x5642 #x5643 #x5644 #x5645 #x5646 #x5647 #x5648 #x5649 - #x564A #x564B #x564F #x5650 #x5651 #x5652 #x5653 #x5655 #x5656 #x565A - #x565B #x565D #x565E #x565F #x5660 #x5661 #x5663 #x5665 #x5666 #x5667 - #x566D #x566E #x566F #x5670 #x5672 #x5673 #x5674 #x5675 #x5677 #x5678 - #x5679 #x567A #x567D #x567E #x567F #x5680 #x5681 #x5682 #x5683 #x5684 - #x5687 #x5688 #x5689 #x568A #x568B #x568C #x568D #x5690 #x5691 #x5692 - #x5694 #x5695 #x5696 #x5697 #x5698 #x5699 #x569A #x569B #x569C #x569D - #x569E #x569F #x56A0 #x56A1 #x56A2 #x56A4 #x56A5 #x56A6 #x56A7 #x56A8 - #x56A9 #x56AA #x56AB #x56AC #x56AD #x56AE #x56B0 #x56B1 #x56B2 #x56B3 - #x56B4 #x56B5 #x56B6 #x56B8 #x56B9 #x56BA #x56BB #x56BD #x56BE #x56BF - #x56C0 #x56C1 #x56C2 #x56C3 #x56C4 #x56C5 #x56C6 #x56C7 #x56C8 #x56C9 - #x56CB #x56CC #x56CD #x56CE #x56CF #x56D0 #x56D1 #x56D2 #x56D3 #x56D5 - #x56D6 #x56D8 #x56D9 #x56DC #x56E3 #x56E5 #x56E6 #x56E7 #x56E8 #x56E9 - #x56EA #x56EC #x56EE #x56EF #x56F2 #x56F3 #x56F6 #x56F7 #x56F8 #x56FB - #x56FC #x5700 #x5701 #x5702 #x5705 #x5707 #x570B #x570C #x570D #x570E - #x570F #x5710 #x5711 #x5712 #x5713 #x5714 #x5715 #x5716 #x5717 #x5718 - #x5719 #x571A #x571B #x571D #x571E #x5720 #x5721 #x5722 #x5724 #x5725 - #x5726 #x5727 #x572B #x5731 #x5732 #x5734 #x5735 #x5736 #x5737 #x5738 - #x573C #x573D #x573F #x5741 #x5743 #x5744 #x5745 #x5746 #x5748 #x5749 - #x574B #x5752 #x5753 #x5754 #x5755 #x5756 #x5758 #x5759 #x5762 #x5763 - #x5765 #x5767 #x576C #x576E #x5770 #x5771 #x5772 #x5774 #x5775 #x5778 - #x5779 #x577A #x577D #x577E #x577F #x5780 #x5781 #x5787 #x5788 #x5789 - #x578A #x578D #x578E #x578F #x5790 #x5791 #x5794 #x5795 #x5796 #x5797 - #x5798 #x5799 #x579A #x579C #x579D #x579E #x579F #x57A5 #x57A8 #x57AA - #x57AC #x57AF #x57B0 #x57B1 #x57B3 #x57B5 #x57B6 #x57B7 #x57B9 #x57BA - #x57BB #x57BC #x57BD #x57BE #x57BF #x57C0 #x57C1 #x57C4 #x57C5 #x57C6 - #x57C7 #x57C8 #x57C9 #x57CA #x57CC #x57CD #x57D0 #x57D1 #x57D3 #x57D6 - #x57D7 #x57DB #x57DC #x57DE #x57E1 #x57E2 #x57E3 #x57E5 #x57E6 #x57E7 - #x57E8 #x57E9 #x57EA #x57EB #x57EC #x57EE #x57F0 #x57F1 #x57F2 #x57F3 - #x57F5 #x57F6 #x57F7 #x57FB #x57FC #x57FE #x57FF #x5801 #x5803 #x5804 - #x5805 #x5808 #x5809 #x580A #x580C #x580E #x580F #x5810 #x5812 #x5813 - #x5814 #x5816 #x5817 #x5818 #x581A #x581B #x581C #x581D #x581F #x5822 - #x5823 #x5825 #x5826 #x5827 #x5828 #x5829 #x582B #x582C #x582D #x582E - #x582F #x5831 #x5832 #x5833 #x5834 #x5836 #x5837 #x5838 #x5839 #x583A - #x583B #x583C #x583D #x583E #x583F #x5840 #x5841 #x5842 #x5843 #x5845 - #x5846 #x5847 #x5848 #x5849 #x584A #x584B #x584E #x584F #x5850 #x5852 - #x5853 #x5855 #x5856 #x5857 #x5859 #x585A #x585B #x585C #x585D #x585F - #x5860 #x5861 #x5862 #x5863 #x5864 #x5866 #x5867 #x5868 #x5869 #x586A - #x586D #x586E #x586F #x5870 #x5871 #x5872 #x5873 #x5874 #x5875 #x5876 - #x5877 #x5878 #x5879 #x587A #x587B #x587C #x587D #x587F #x5882 #x5884 - #x5886 #x5887 #x5888 #x588A #x588B #x588C #x588D #x588E #x588F #x5890 - #x5891 #x5894 #x5895 #x5896 #x5897 #x5898 #x589B #x589C #x589D #x58A0 - #x58A1 #x58A2 #x58A3 #x58A4 #x58A5 #x58A6 #x58A7 #x58AA #x58AB #x58AC - #x58AD #x58AE #x58AF #x58B0 #x58B1 #x58B2 #x58B3 #x58B4 #x58B5 #x58B6 - #x58B7 #x58B8 #x58B9 #x58BA #x58BB #x58BD #x58BE #x58BF #x58C0 #x58C2 - #x58C3 #x58C4 #x58C6 #x58C7 #x58C8 #x58C9 #x58CA #x58CB #x58CC #x58CD - #x58CE #x58CF #x58D0 #x58D2 #x58D3 #x58D4 #x58D6 #x58D7 #x58D8 #x58D9 - #x58DA #x58DB #x58DC #x58DD #x58DE #x58DF #x58E0 #x58E1 #x58E2 #x58E3 - #x58E5 #x58E6 #x58E7 #x58E8 #x58E9 #x58EA #x58ED #x58EF #x58F1 #x58F2 - #x58F4 #x58F5 #x58F7 #x58F8 #x58FA #x58FB #x58FC #x58FD #x58FE #x58FF - #x5900 #x5901 #x5903 #x5905 #x5906 #x5908 #x5909 #x590A #x590B #x590C - #x590E #x5910 #x5911 #x5912 #x5913 #x5917 #x5918 #x591B #x591D #x591E - #x5920 #x5921 #x5922 #x5923 #x5926 #x5928 #x592C #x5930 #x5932 #x5933 - #x5935 #x5936 #x593B #x593D #x593E #x593F #x5940 #x5943 #x5945 #x5946 - #x594A #x594C #x594D #x5950 #x5952 #x5953 #x5959 #x595B #x595C #x595D - #x595E #x595F #x5961 #x5963 #x5964 #x5966 #x5967 #x5968 #x5969 #x596A - #x596B #x596C #x596D #x596E #x596F #x5970 #x5971 #x5972 #x5975 #x5977 - #x597A #x597B #x597C #x597E #x597F #x5980 #x5985 #x5989 #x598B #x598C - #x598E #x598F #x5990 #x5991 #x5994 #x5995 #x5998 #x599A #x599B #x599C - #x599D #x599F #x59A0 #x59A1 #x59A2 #x59A6 #x59A7 #x59AC #x59AD #x59B0 - #x59B1 #x59B3 #x59B4 #x59B5 #x59B6 #x59B7 #x59B8 #x59BA #x59BC #x59BD - #x59BF #x59C0 #x59C1 #x59C2 #x59C3 #x59C4 #x59C5 #x59C7 #x59C8 #x59C9 - #x59CC #x59CD #x59CE #x59CF #x59D5 #x59D6 #x59D9 #x59DB #x59DE #x59DF - #x59E0 #x59E1 #x59E2 #x59E4 #x59E6 #x59E7 #x59E9 #x59EA #x59EB #x59ED - #x59EE #x59EF #x59F0 #x59F1 #x59F2 #x59F3 #x59F4 #x59F5 #x59F6 #x59F7 - #x59F8 #x59FA #x59FC #x59FD #x59FE #x5A00 #x5A02 #x5A0A #x5A0B #x5A0D - #x5A0E #x5A0F #x5A10 #x5A12 #x5A14 #x5A15 #x5A16 #x5A17 #x5A19 #x5A1A - #x5A1B #x5A1D #x5A1E #x5A21 #x5A22 #x5A24 #x5A26 #x5A27 #x5A28 #x5A2A - #x5A2B #x5A2C #x5A2D #x5A2E #x5A2F #x5A30 #x5A33 #x5A35 #x5A37 #x5A38 - #x5A39 #x5A3A #x5A3B #x5A3D #x5A3E #x5A3F #x5A41 #x5A42 #x5A43 #x5A44 - #x5A45 #x5A47 #x5A48 #x5A4B #x5A4C #x5A4D #x5A4E #x5A4F #x5A50 #x5A51 - #x5A52 #x5A53 #x5A54 #x5A56 #x5A57 #x5A58 #x5A59 #x5A5B #x5A5C #x5A5D - #x5A5E #x5A5F #x5A60 #x5A61 #x5A63 #x5A64 #x5A65 #x5A66 #x5A68 #x5A69 - #x5A6B #x5A6C #x5A6D #x5A6E #x5A6F #x5A70 #x5A71 #x5A72 #x5A73 #x5A78 - #x5A79 #x5A7B #x5A7C #x5A7D #x5A7E #x5A80 #x5A81 #x5A82 #x5A83 #x5A84 - #x5A85 #x5A86 #x5A87 #x5A88 #x5A89 #x5A8A #x5A8B #x5A8C #x5A8D #x5A8E - #x5A8F #x5A90 #x5A91 #x5A93 #x5A94 #x5A95 #x5A96 #x5A97 #x5A98 #x5A99 - #x5A9C #x5A9D #x5A9E #x5A9F #x5AA0 #x5AA1 #x5AA2 #x5AA3 #x5AA4 #x5AA5 - #x5AA6 #x5AA7 #x5AA8 #x5AA9 #x5AAB #x5AAC #x5AAD #x5AAE #x5AAF #x5AB0 - #x5AB1 #x5AB4 #x5AB6 #x5AB7 #x5AB9 #x5ABA #x5ABB #x5ABC #x5ABD #x5ABF - #x5AC0 #x5AC3 #x5AC4 #x5AC5 #x5AC6 #x5AC7 #x5AC8 #x5ACA #x5ACB #x5ACD - #x5ACE #x5ACF #x5AD0 #x5AD1 #x5AD3 #x5AD5 #x5AD7 #x5AD9 #x5ADA #x5ADB - #x5ADD #x5ADE #x5ADF #x5AE2 #x5AE4 #x5AE5 #x5AE7 #x5AE8 #x5AEA #x5AEC - #x5AED #x5AEE #x5AEF #x5AF0 #x5AF2 #x5AF3 #x5AF4 #x5AF5 #x5AF6 #x5AF7 - #x5AF8 #x5AF9 #x5AFA #x5AFB #x5AFC #x5AFD #x5AFE #x5AFF #x5B00 #x5B01 - #x5B02 #x5B03 #x5B04 #x5B05 #x5B06 #x5B07 #x5B08 #x5B0A #x5B0B #x5B0C - #x5B0D #x5B0E #x5B0F #x5B10 #x5B11 #x5B12 #x5B13 #x5B14 #x5B15 #x5B18 - #x5B19 #x5B1A #x5B1B #x5B1C #x5B1D #x5B1E #x5B1F #x5B20 #x5B21 #x5B22 - #x5B23 #x5B24 #x5B25 #x5B26 #x5B27 #x5B28 #x5B29 #x5B2A #x5B2B #x5B2C - #x5B2D #x5B2E #x5B2F #x5B30 #x5B31 #x5B33 #x5B35 #x5B36 #x5B38 #x5B39 - #x5B3A #x5B3B #x5B3C #x5B3D #x5B3E #x5B3F #x5B41 #x5B42 #x5B43 #x5B44 - #x5B45 #x5B46 #x5B47 #x5B48 #x5B49 #x5B4A #x5B4B #x5B4C #x5B4D #x5B4E - #x5B4F #x5B52 #x5B56 #x5B5E #x5B60 #x5B61 #x5B67 #x5B68 #x5B6B #x5B6D - #x5B6E #x5B6F #x5B72 #x5B74 #x5B76 #x5B77 #x5B78 #x5B79 #x5B7B #x5B7C - #x5B7E #x5B7F #x5B82 #x5B86 #x5B8A #x5B8D #x5B8E #x5B90 #x5B91 #x5B92 - #x5B94 #x5B96 #x5B9F #x5BA7 #x5BA8 #x5BA9 #x5BAC #x5BAD #x5BAE #x5BAF - #x5BB1 #x5BB2 #x5BB7 #x5BBA #x5BBB #x5BBC #x5BC0 #x5BC1 #x5BC3 #x5BC8 - #x5BC9 #x5BCA #x5BCB #x5BCD #x5BCE #x5BCF #x5BD1 #x5BD4 #x5BD5 #x5BD6 - #x5BD7 #x5BD8 #x5BD9 #x5BDA #x5BDB #x5BDC #x5BE0 #x5BE2 #x5BE3 #x5BE6 - #x5BE7 #x5BE9 #x5BEA #x5BEB #x5BEC #x5BED #x5BEF #x5BF1 #x5BF2 #x5BF3 - #x5BF4 #x5BF5 #x5BF6 #x5BF7 #x5BFD #x5BFE #x5C00 #x5C02 #x5C03 #x5C05 - #x5C07 #x5C08 #x5C0B #x5C0C #x5C0D #x5C0E #x5C10 #x5C12 #x5C13 #x5C17 - #x5C19 #x5C1B #x5C1E #x5C1F #x5C20 #x5C21 #x5C23 #x5C26 #x5C28 #x5C29 - #x5C2A #x5C2B #x5C2D #x5C2E #x5C2F #x5C30 #x5C32 #x5C33 #x5C35 #x5C36 - #x5C37 #x5C43 #x5C44 #x5C46 #x5C47 #x5C4C #x5C4D #x5C52 #x5C53 #x5C54 - #x5C56 #x5C57 #x5C58 #x5C5A #x5C5B #x5C5C #x5C5D #x5C5F #x5C62 #x5C64 - #x5C67 #x5C68 #x5C69 #x5C6A #x5C6B #x5C6C #x5C6D #x5C70 #x5C72 #x5C73 - #x5C74 #x5C75 #x5C76 #x5C77 #x5C78 #x5C7B #x5C7C #x5C7D #x5C7E #x5C80 - #x5C83 #x5C84 #x5C85 #x5C86 #x5C87 #x5C89 #x5C8A #x5C8B #x5C8E #x5C8F - #x5C92 #x5C93 #x5C95 #x5C9D #x5C9E #x5C9F #x5CA0 #x5CA1 #x5CA4 #x5CA5 - #x5CA6 #x5CA7 #x5CA8 #x5CAA #x5CAE #x5CAF #x5CB0 #x5CB2 #x5CB4 #x5CB6 - #x5CB9 #x5CBA #x5CBB #x5CBC #x5CBE #x5CC0 #x5CC2 #x5CC3 #x5CC5 #x5CC6 - #x5CC7 #x5CC8 #x5CC9 #x5CCA #x5CCC #x5CCD #x5CCE #x5CCF #x5CD0 #x5CD1 - #x5CD3 #x5CD4 #x5CD5 #x5CD6 #x5CD7 #x5CD8 #x5CDA #x5CDB #x5CDC #x5CDD - #x5CDE #x5CDF #x5CE0 #x5CE2 #x5CE3 #x5CE7 #x5CE9 #x5CEB #x5CEC #x5CEE - #x5CEF #x5CF1 #x5CF2 #x5CF3 #x5CF4 #x5CF5 #x5CF6 #x5CF7 #x5CF8 #x5CF9 - #x5CFA #x5CFC #x5CFD #x5CFE #x5CFF #x5D00 #x5D01 #x5D04 #x5D05 #x5D08 - #x5D09 #x5D0A #x5D0B #x5D0C #x5D0D #x5D0F #x5D10 #x5D11 #x5D12 #x5D13 - #x5D15 #x5D17 #x5D18 #x5D19 #x5D1A #x5D1C #x5D1D #x5D1F #x5D20 #x5D21 - #x5D22 #x5D23 #x5D25 #x5D28 #x5D2A #x5D2B #x5D2C #x5D2F #x5D30 #x5D31 - #x5D32 #x5D33 #x5D35 #x5D36 #x5D37 #x5D38 #x5D39 #x5D3A #x5D3B #x5D3C - #x5D3F #x5D40 #x5D41 #x5D42 #x5D43 #x5D44 #x5D45 #x5D46 #x5D48 #x5D49 - #x5D4D #x5D4E #x5D4F #x5D50 #x5D51 #x5D52 #x5D53 #x5D54 #x5D55 #x5D56 - #x5D57 #x5D59 #x5D5A #x5D5C #x5D5E #x5D5F #x5D60 #x5D61 #x5D62 #x5D63 - #x5D64 #x5D65 #x5D66 #x5D67 #x5D68 #x5D6A #x5D6D #x5D6E #x5D70 #x5D71 - #x5D72 #x5D73 #x5D75 #x5D76 #x5D77 #x5D78 #x5D79 #x5D7A #x5D7B #x5D7C - #x5D7D #x5D7E #x5D7F #x5D80 #x5D81 #x5D83 #x5D84 #x5D85 #x5D86 #x5D87 - #x5D88 #x5D89 #x5D8A #x5D8B #x5D8C #x5D8D #x5D8E #x5D8F #x5D90 #x5D91 - #x5D92 #x5D93 #x5D94 #x5D95 #x5D96 #x5D97 #x5D98 #x5D9A #x5D9B #x5D9C - #x5D9E #x5D9F #x5DA0 #x5DA1 #x5DA2 #x5DA3 #x5DA4 #x5DA5 #x5DA6 #x5DA7 - #x5DA8 #x5DA9 #x5DAA #x5DAB #x5DAC #x5DAD #x5DAE #x5DAF #x5DB0 #x5DB1 - #x5DB2 #x5DB3 #x5DB4 #x5DB5 #x5DB6 #x5DB8 #x5DB9 #x5DBA #x5DBB #x5DBC - #x5DBD #x5DBE #x5DBF #x5DC0 #x5DC1 #x5DC2 #x5DC3 #x5DC4 #x5DC6 #x5DC7 - #x5DC8 #x5DC9 #x5DCA #x5DCB #x5DCC #x5DCE #x5DCF #x5DD0 #x5DD1 #x5DD2 - #x5DD3 #x5DD4 #x5DD5 #x5DD6 #x5DD7 #x5DD8 #x5DD9 #x5DDA #x5DDC #x5DDF - #x5DE0 #x5DE3 #x5DE4 #x5DEA #x5DEC #x5DED #x5DF0 #x5DF5 #x5DF6 #x5DF8 - #x5DF9 #x5DFA #x5DFB #x5DFC #x5DFF #x5E00 #x5E04 #x5E07 #x5E09 #x5E0A - #x5E0B #x5E0D #x5E0E #x5E12 #x5E13 #x5E17 #x5E1E #x5E1F #x5E20 #x5E21 - #x5E22 #x5E23 #x5E24 #x5E25 #x5E28 #x5E29 #x5E2A #x5E2B #x5E2C #x5E2F - #x5E30 #x5E32 #x5E33 #x5E34 #x5E35 #x5E36 #x5E39 #x5E3A #x5E3E #x5E3F - #x5E40 #x5E41 #x5E43 #x5E46 #x5E47 #x5E48 #x5E49 #x5E4A #x5E4B #x5E4D - #x5E4E #x5E4F #x5E50 #x5E51 #x5E52 #x5E53 #x5E56 #x5E57 #x5E58 #x5E59 - #x5E5A #x5E5C #x5E5D #x5E5F #x5E60 #x5E63 #x5E64 #x5E65 #x5E66 #x5E67 - #x5E68 #x5E69 #x5E6A #x5E6B #x5E6C #x5E6D #x5E6E #x5E6F #x5E70 #x5E71 - #x5E75 #x5E77 #x5E79 #x5E7E #x5E81 #x5E82 #x5E83 #x5E85 #x5E88 #x5E89 - #x5E8C #x5E8D #x5E8E #x5E92 #x5E98 #x5E9B #x5E9D #x5EA1 #x5EA2 #x5EA3 - #x5EA4 #x5EA8 #x5EA9 #x5EAA #x5EAB #x5EAC #x5EAE #x5EAF #x5EB0 #x5EB1 - #x5EB2 #x5EB4 #x5EBA #x5EBB #x5EBC #x5EBD #x5EBF #x5EC0 #x5EC1 #x5EC2 - #x5EC3 #x5EC4 #x5EC5 #x5EC6 #x5EC7 #x5EC8 #x5ECB #x5ECC #x5ECD #x5ECE - #x5ECF #x5ED0 #x5ED4 #x5ED5 #x5ED7 #x5ED8 #x5ED9 #x5EDA #x5EDC #x5EDD - #x5EDE #x5EDF #x5EE0 #x5EE1 #x5EE2 #x5EE3 #x5EE4 #x5EE5 #x5EE6 #x5EE7 - #x5EE9 #x5EEB #x5EEC #x5EED #x5EEE #x5EEF #x5EF0 #x5EF1 #x5EF2 #x5EF3 - #x5EF5 #x5EF8 #x5EF9 #x5EFB #x5EFC #x5EFD #x5F05 #x5F06 #x5F07 #x5F09 - #x5F0C #x5F0D #x5F0E #x5F10 #x5F12 #x5F14 #x5F16 #x5F19 #x5F1A #x5F1C - #x5F1D #x5F1E #x5F21 #x5F22 #x5F23 #x5F24 #x5F28 #x5F2B #x5F2C #x5F2E - #x5F30 #x5F32 #x5F33 #x5F34 #x5F35 #x5F36 #x5F37 #x5F38 #x5F3B #x5F3D - #x5F3E #x5F3F #x5F41 #x5F42 #x5F43 #x5F44 #x5F45 #x5F46 #x5F47 #x5F48 - #x5F49 #x5F4A #x5F4B #x5F4C #x5F4D #x5F4E #x5F4F #x5F51 #x5F54 #x5F59 - #x5F5A #x5F5B #x5F5C #x5F5E #x5F5F #x5F60 #x5F63 #x5F65 #x5F67 #x5F68 - #x5F6B #x5F6E #x5F6F #x5F72 #x5F74 #x5F75 #x5F76 #x5F78 #x5F7A #x5F7D - #x5F7E #x5F7F #x5F83 #x5F86 #x5F8D #x5F8E #x5F8F #x5F91 #x5F93 #x5F94 - #x5F96 #x5F9A #x5F9B #x5F9D #x5F9E #x5F9F #x5FA0 #x5FA2 #x5FA3 #x5FA4 - #x5FA5 #x5FA6 #x5FA7 #x5FA9 #x5FAB #x5FAC #x5FAF #x5FB0 #x5FB1 #x5FB2 - #x5FB3 #x5FB4 #x5FB6 #x5FB8 #x5FB9 #x5FBA #x5FBB #x5FBE #x5FBF #x5FC0 - #x5FC1 #x5FC2 #x5FC7 #x5FC8 #x5FCA #x5FCB #x5FCE #x5FD3 #x5FD4 #x5FD5 - #x5FDA #x5FDB #x5FDC #x5FDE #x5FDF #x5FE2 #x5FE3 #x5FE5 #x5FE6 #x5FE8 - #x5FE9 #x5FEC #x5FEF #x5FF0 #x5FF2 #x5FF3 #x5FF4 #x5FF6 #x5FF7 #x5FF9 - #x5FFA #x5FFC #x6007 #x6008 #x6009 #x600B #x600C #x6010 #x6011 #x6013 - #x6017 #x6018 #x601A #x601E #x601F #x6022 #x6023 #x6024 #x602C #x602D - #x602E #x6030 #x6031 #x6032 #x6033 #x6034 #x6036 #x6037 #x6038 #x6039 - #x603A #x603D #x603E #x6040 #x6044 #x6045 #x6046 #x6047 #x6048 #x6049 - #x604A #x604C #x604E #x604F #x6051 #x6053 #x6054 #x6056 #x6057 #x6058 - #x605B #x605C #x605E #x605F #x6060 #x6061 #x6065 #x6066 #x606E #x6071 - #x6072 #x6074 #x6075 #x6077 #x607E #x6080 #x6081 #x6082 #x6085 #x6086 - #x6087 #x6088 #x608A #x608B #x608E #x608F #x6090 #x6091 #x6093 #x6095 - #x6097 #x6098 #x6099 #x609C #x609E #x60A1 #x60A2 #x60A4 #x60A5 #x60A7 - #x60A9 #x60AA #x60AE #x60B0 #x60B3 #x60B5 #x60B6 #x60B7 #x60B9 #x60BA - #x60BD #x60BE #x60BF #x60C0 #x60C1 #x60C2 #x60C3 #x60C4 #x60C7 #x60C8 - #x60C9 #x60CC #x60CD #x60CE #x60CF #x60D0 #x60D2 #x60D3 #x60D4 #x60D6 - #x60D7 #x60D9 #x60DB #x60DE #x60E1 #x60E2 #x60E3 #x60E4 #x60E5 #x60EA - #x60F1 #x60F2 #x60F5 #x60F7 #x60F8 #x60FB #x60FC #x60FD #x60FE #x60FF - #x6102 #x6103 #x6104 #x6105 #x6107 #x610A #x610B #x610C #x6110 #x6111 - #x6112 #x6113 #x6114 #x6116 #x6117 #x6118 #x6119 #x611B #x611C #x611D - #x611E #x6121 #x6122 #x6125 #x6128 #x6129 #x612A #x612C #x612D #x612E - #x612F #x6130 #x6131 #x6132 #x6133 #x6134 #x6135 #x6136 #x6137 #x6138 - #x6139 #x613A #x613B #x613C #x613D #x613E #x6140 #x6141 #x6142 #x6143 - #x6144 #x6145 #x6146 #x6147 #x6149 #x614B #x614D #x614F #x6150 #x6152 - #x6153 #x6154 #x6156 #x6157 #x6158 #x6159 #x615A #x615B #x615C #x615E - #x615F #x6160 #x6161 #x6163 #x6164 #x6165 #x6166 #x6169 #x616A #x616B - #x616C #x616D #x616E #x616F #x6171 #x6172 #x6173 #x6174 #x6176 #x6178 - #x6179 #x617A #x617B #x617C #x617D #x617E #x617F #x6180 #x6181 #x6182 - #x6183 #x6184 #x6185 #x6186 #x6187 #x6188 #x6189 #x618A #x618C #x618D - #x618F #x6190 #x6191 #x6192 #x6193 #x6195 #x6196 #x6197 #x6198 #x6199 - #x619A #x619B #x619C #x619E #x619F #x61A0 #x61A1 #x61A2 #x61A3 #x61A4 - #x61A5 #x61A6 #x61AA #x61AB #x61AD #x61AE #x61AF #x61B0 #x61B1 #x61B2 - #x61B3 #x61B4 #x61B5 #x61B6 #x61B8 #x61B9 #x61BA #x61BB #x61BC #x61BD - #x61BF #x61C0 #x61C1 #x61C3 #x61C4 #x61C5 #x61C6 #x61C7 #x61C9 #x61CC - #x61CD #x61CE #x61CF #x61D0 #x61D3 #x61D5 #x61D6 #x61D7 #x61D8 #x61D9 - #x61DA #x61DB #x61DC #x61DD #x61DE #x61DF #x61E0 #x61E1 #x61E2 #x61E3 - #x61E4 #x61E5 #x61E7 #x61E8 #x61E9 #x61EA #x61EB #x61EC #x61ED #x61EE - #x61EF #x61F0 #x61F1 #x61F2 #x61F3 #x61F4 #x61F6 #x61F7 #x61F8 #x61F9 - #x61FA #x61FB #x61FC #x61FD #x61FE #x6200 #x6201 #x6202 #x6203 #x6204 - #x6205 #x6207 #x6209 #x6213 #x6214 #x6219 #x621C #x621D #x621E #x6220 - #x6223 #x6226 #x6227 #x6228 #x6229 #x622B #x622D #x622F #x6230 #x6231 - #x6232 #x6235 #x6236 #x6238 #x6239 #x623A #x623B #x623C #x6242 #x6244 - #x6245 #x6246 #x624A #x624F #x6250 #x6255 #x6256 #x6257 #x6259 #x625A - #x625C #x625D #x625E #x625F #x6260 #x6261 #x6262 #x6264 #x6265 #x6268 - #x6271 #x6272 #x6274 #x6275 #x6277 #x6278 #x627A #x627B #x627D #x6281 - #x6282 #x6283 #x6285 #x6286 #x6287 #x6288 #x628B #x628C #x628D #x628E - #x628F #x6290 #x6294 #x6299 #x629C #x629D #x629E #x62A3 #x62A6 #x62A7 - #x62A9 #x62AA #x62AD #x62AE #x62AF #x62B0 #x62B2 #x62B3 #x62B4 #x62B6 - #x62B7 #x62B8 #x62BA #x62BE #x62C0 #x62C1 #x62C3 #x62CB #x62CF #x62D1 - #x62D5 #x62DD #x62DE #x62E0 #x62E1 #x62E4 #x62EA #x62EB #x62F0 #x62F2 - #x62F5 #x62F8 #x62F9 #x62FA #x62FB #x6300 #x6303 #x6304 #x6305 #x6306 - #x630A #x630B #x630C #x630D #x630F #x6310 #x6312 #x6313 #x6314 #x6315 - #x6317 #x6318 #x6319 #x631C #x6326 #x6327 #x6329 #x632C #x632D #x632E - #x6330 #x6331 #x6333 #x6334 #x6335 #x6336 #x6337 #x6338 #x633B #x633C - #x633E #x633F #x6340 #x6341 #x6344 #x6347 #x6348 #x634A #x6351 #x6352 - #x6353 #x6354 #x6356 #x6357 #x6358 #x6359 #x635A #x635B #x635C #x635D - #x6360 #x6364 #x6365 #x6366 #x6368 #x636A #x636B #x636C #x636F #x6370 - #x6372 #x6373 #x6374 #x6375 #x6378 #x6379 #x637C #x637D #x637E #x637F - #x6381 #x6383 #x6384 #x6385 #x6386 #x638B #x638D #x6391 #x6393 #x6394 - #x6395 #x6397 #x6399 #x639A #x639B #x639C #x639D #x639E #x639F #x63A1 - #x63A4 #x63A6 #x63AB #x63AF #x63B1 #x63B2 #x63B5 #x63B6 #x63B9 #x63BB - #x63BD #x63BF #x63C0 #x63C1 #x63C2 #x63C3 #x63C5 #x63C7 #x63C8 #x63CA - #x63CB #x63CC #x63D1 #x63D3 #x63D4 #x63D5 #x63D7 #x63D8 #x63D9 #x63DA - #x63DB #x63DC #x63DD #x63DF #x63E2 #x63E4 #x63E5 #x63E6 #x63E7 #x63E8 - #x63EB #x63EC #x63EE #x63EF #x63F0 #x63F1 #x63F3 #x63F5 #x63F7 #x63F9 - #x63FA #x63FB #x63FC #x63FE #x6403 #x6404 #x6406 #x6407 #x6408 #x6409 - #x640A #x640D #x640E #x6411 #x6412 #x6415 #x6416 #x6417 #x6418 #x6419 - #x641A #x641D #x641F #x6422 #x6423 #x6424 #x6425 #x6427 #x6428 #x6429 - #x642B #x642E #x642F #x6430 #x6431 #x6432 #x6433 #x6435 #x6436 #x6437 - #x6438 #x6439 #x643B #x643C #x643E #x6440 #x6442 #x6443 #x6449 #x644B - #x644C #x644D #x644E #x644F #x6450 #x6451 #x6453 #x6455 #x6456 #x6457 - #x6459 #x645A #x645B #x645C #x645D #x645F #x6460 #x6461 #x6462 #x6463 - #x6464 #x6465 #x6466 #x6468 #x646A #x646B #x646C #x646E #x646F #x6470 - #x6471 #x6472 #x6473 #x6474 #x6475 #x6476 #x6477 #x647B #x647C #x647D - #x647E #x647F #x6480 #x6481 #x6483 #x6486 #x6488 #x6489 #x648A #x648B - #x648C #x648D #x648E #x648F #x6490 #x6493 #x6494 #x6497 #x6498 #x649A - #x649B #x649C #x649D #x649F #x64A0 #x64A1 #x64A2 #x64A3 #x64A5 #x64A6 - #x64A7 #x64A8 #x64AA #x64AB #x64AF #x64B1 #x64B2 #x64B3 #x64B4 #x64B6 - #x64B9 #x64BB #x64BD #x64BE #x64BF #x64C1 #x64C3 #x64C4 #x64C6 #x64C7 - #x64C8 #x64C9 #x64CA #x64CB #x64CC #x64CF #x64D1 #x64D3 #x64D4 #x64D5 - #x64D6 #x64D9 #x64DA #x64DB #x64DC #x64DD #x64DF #x64E0 #x64E1 #x64E3 - #x64E5 #x64E7 #x64E8 #x64E9 #x64EA #x64EB #x64EC #x64ED #x64EE #x64EF - #x64F0 #x64F1 #x64F2 #x64F3 #x64F4 #x64F5 #x64F6 #x64F7 #x64F8 #x64F9 - #x64FA #x64FB #x64FC #x64FD #x64FE #x64FF #x6501 #x6502 #x6503 #x6504 - #x6505 #x6506 #x6507 #x6508 #x650A #x650B #x650C #x650D #x650E #x650F - #x6510 #x6511 #x6513 #x6514 #x6515 #x6516 #x6517 #x6519 #x651A #x651B - #x651C #x651D #x651E #x651F #x6520 #x6521 #x6522 #x6523 #x6524 #x6526 - #x6527 #x6528 #x6529 #x652A #x652C #x652D #x6530 #x6531 #x6532 #x6533 - #x6537 #x653A #x653C #x653D #x6540 #x6541 #x6542 #x6543 #x6544 #x6546 - #x6547 #x654A #x654B #x654D #x654E #x6550 #x6552 #x6553 #x6554 #x6557 - #x6558 #x655A #x655C #x655F #x6560 #x6561 #x6564 #x6565 #x6567 #x6568 - #x6569 #x656A #x656D #x656E #x656F #x6571 #x6573 #x6575 #x6576 #x6578 - #x6579 #x657A #x657B #x657C #x657D #x657E #x657F #x6580 #x6581 #x6582 - #x6583 #x6584 #x6585 #x6586 #x6588 #x6589 #x658A #x658D #x658E #x658F - #x6592 #x6594 #x6595 #x6596 #x6598 #x659A #x659D #x659E #x65A0 #x65A2 - #x65A3 #x65A6 #x65A8 #x65AA #x65AC #x65AE #x65B1 #x65B2 #x65B3 #x65B4 - #x65B5 #x65B6 #x65B7 #x65B8 #x65BA #x65BB #x65BE #x65BF #x65C0 #x65C2 - #x65C7 #x65C8 #x65C9 #x65CA #x65CD #x65D0 #x65D1 #x65D3 #x65D4 #x65D5 - #x65D8 #x65D9 #x65DA #x65DB #x65DC #x65DD #x65DE #x65DF #x65E1 #x65E3 - #x65E4 #x65EA #x65EB #x65F2 #x65F3 #x65F4 #x65F5 #x65F8 #x65F9 #x65FB - #x65FC #x65FD #x65FE #x65FF #x6601 #x6604 #x6605 #x6607 #x6608 #x6609 - #x660B #x660D #x6610 #x6611 #x6612 #x6616 #x6617 #x6618 #x661A #x661B - #x661C #x661E #x6621 #x6622 #x6623 #x6624 #x6626 #x6629 #x662A #x662B - #x662C #x662E #x6630 #x6632 #x6633 #x6637 #x6638 #x6639 #x663A #x663B - #x663D #x663F #x6640 #x6642 #x6644 #x6645 #x6646 #x6647 #x6648 #x6649 - #x664A #x664D #x664E #x6650 #x6651 #x6658 #x6659 #x665B #x665C #x665D - #x665E #x6660 #x6662 #x6663 #x6665 #x6667 #x6669 #x666A #x666B #x666C - #x666D #x6671 #x6672 #x6673 #x6675 #x6678 #x6679 #x667B #x667C #x667D - #x667F #x6680 #x6681 #x6683 #x6685 #x6686 #x6688 #x6689 #x668A #x668B - #x668D #x668E #x668F #x6690 #x6692 #x6693 #x6694 #x6695 #x6698 #x6699 - #x669A #x669B #x669C #x669E #x669F #x66A0 #x66A1 #x66A2 #x66A3 #x66A4 - #x66A5 #x66A6 #x66A9 #x66AA #x66AB #x66AC #x66AD #x66AF #x66B0 #x66B1 - #x66B2 #x66B3 #x66B5 #x66B6 #x66B7 #x66B8 #x66BA #x66BB #x66BC #x66BD - #x66BF #x66C0 #x66C1 #x66C2 #x66C3 #x66C4 #x66C5 #x66C6 #x66C7 #x66C8 - #x66C9 #x66CA #x66CB #x66CC #x66CD #x66CE #x66CF #x66D0 #x66D1 #x66D2 - #x66D3 #x66D4 #x66D5 #x66D6 #x66D7 #x66D8 #x66DA #x66DE #x66DF #x66E0 - #x66E1 #x66E2 #x66E3 #x66E4 #x66E5 #x66E7 #x66E8 #x66EA #x66EB #x66EC - #x66ED #x66EE #x66EF #x66F1 #x66F5 #x66F6 #x66F8 #x66FA #x66FB #x66FD - #x6701 #x6702 #x6703 #x6704 #x6705 #x6706 #x6707 #x670C #x670E #x670F - #x6711 #x6712 #x6713 #x6716 #x6718 #x6719 #x671A #x671C #x671E #x6720 - #x6721 #x6722 #x6723 #x6724 #x6725 #x6727 #x6729 #x672E #x6730 #x6732 - #x6733 #x6736 #x6737 #x6738 #x6739 #x673B #x673C #x673E #x673F #x6741 - #x6744 #x6745 #x6747 #x674A #x674B #x674D #x6752 #x6754 #x6755 #x6757 - #x6758 #x6759 #x675A #x675B #x675D #x6762 #x6763 #x6764 #x6766 #x6767 - #x676B #x676C #x676E #x6771 #x6774 #x6776 #x6778 #x6779 #x677A #x677B - #x677D #x6780 #x6782 #x6783 #x6785 #x6786 #x6788 #x678A #x678C #x678D - #x678E #x678F #x6791 #x6792 #x6793 #x6794 #x6796 #x6799 #x679B #x679F - #x67A0 #x67A1 #x67A4 #x67A6 #x67A9 #x67AC #x67AE #x67B1 #x67B2 #x67B4 - #x67B9 #x67BA #x67BB #x67BC #x67BD #x67BE #x67BF #x67C0 #x67C2 #x67C5 - #x67C6 #x67C7 #x67C8 #x67C9 #x67CA #x67CB #x67CC #x67CD #x67CE #x67D5 - #x67D6 #x67D7 #x67DB #x67DF #x67E1 #x67E3 #x67E4 #x67E6 #x67E7 #x67E8 - #x67EA #x67EB #x67ED #x67EE #x67F2 #x67F5 #x67F6 #x67F7 #x67F8 #x67F9 - #x67FA #x67FB #x67FC #x67FE #x6801 #x6802 #x6803 #x6804 #x6806 #x680D - #x6810 #x6812 #x6814 #x6815 #x6818 #x6819 #x681A #x681B #x681C #x681E - #x681F #x6820 #x6822 #x6823 #x6824 #x6825 #x6826 #x6827 #x6828 #x682B - #x682C #x682D #x682E #x682F #x6830 #x6831 #x6834 #x6835 #x6836 #x683A - #x683B #x683F #x6847 #x684B #x684D #x684F #x6852 #x6856 #x6857 #x6858 - #x6859 #x685A #x685B #x685C #x685D #x685E #x685F #x686A #x686C #x686D - #x686E #x686F #x6870 #x6871 #x6872 #x6873 #x6875 #x6878 #x6879 #x687A - #x687B #x687C #x687D #x687E #x687F #x6880 #x6882 #x6884 #x6887 #x6888 - #x6889 #x688A #x688B #x688C #x688D #x688E #x6890 #x6891 #x6892 #x6894 - #x6895 #x6896 #x6898 #x6899 #x689A #x689B #x689C #x689D #x689E #x689F - #x68A0 #x68A1 #x68A3 #x68A4 #x68A5 #x68A9 #x68AA #x68AB #x68AC #x68AE - #x68B1 #x68B2 #x68B4 #x68B6 #x68B7 #x68B8 #x68B9 #x68BA #x68BB #x68BC - #x68BD #x68BE #x68BF #x68C1 #x68C3 #x68C4 #x68C5 #x68C6 #x68C7 #x68C8 - #x68CA #x68CC #x68CE #x68CF #x68D0 #x68D1 #x68D3 #x68D4 #x68D6 #x68D7 - #x68D9 #x68DB #x68DC #x68DD #x68DE #x68DF #x68E1 #x68E2 #x68E4 #x68E5 - #x68E6 #x68E7 #x68E8 #x68E9 #x68EA #x68EB #x68EC #x68ED #x68EF #x68F2 - #x68F3 #x68F4 #x68F6 #x68F7 #x68F8 #x68FB #x68FD #x68FE #x68FF #x6900 - #x6902 #x6903 #x6904 #x6906 #x6907 #x6908 #x6909 #x690A #x690C #x690F - #x6911 #x6913 #x6914 #x6915 #x6916 #x6917 #x6918 #x6919 #x691A #x691B - #x691C #x691D #x691E #x6921 #x6922 #x6923 #x6925 #x6926 #x6927 #x6928 - #x6929 #x692A #x692B #x692C #x692E #x692F #x6931 #x6932 #x6933 #x6935 - #x6936 #x6937 #x6938 #x693A #x693B #x693C #x693E #x6940 #x6941 #x6943 - #x6944 #x6945 #x6946 #x6947 #x6948 #x6949 #x694A #x694B #x694C #x694D - #x694E #x694F #x6950 #x6951 #x6952 #x6953 #x6955 #x6956 #x6958 #x6959 - #x695B #x695C #x695F #x6961 #x6962 #x6964 #x6965 #x6967 #x6968 #x6969 - #x696A #x696C #x696D #x696F #x6970 #x6972 #x6973 #x6974 #x6975 #x6976 - #x697A #x697B #x697D #x697E #x697F #x6981 #x6983 #x6985 #x698A #x698B - #x698C #x698E #x698F #x6990 #x6991 #x6992 #x6993 #x6996 #x6997 #x6999 - #x699A #x699D #x699E #x699F #x69A0 #x69A1 #x69A2 #x69A3 #x69A4 #x69A5 - #x69A6 #x69A9 #x69AA #x69AC #x69AE #x69AF #x69B0 #x69B2 #x69B3 #x69B5 - #x69B6 #x69B8 #x69B9 #x69BA #x69BC #x69BD #x69BE #x69BF #x69C0 #x69C2 - #x69C3 #x69C4 #x69C5 #x69C6 #x69C7 #x69C8 #x69C9 #x69CB #x69CD #x69CF - #x69D1 #x69D2 #x69D3 #x69D5 #x69D6 #x69D7 #x69D8 #x69D9 #x69DA #x69DC - #x69DD #x69DE #x69E1 #x69E2 #x69E3 #x69E4 #x69E5 #x69E6 #x69E7 #x69E8 - #x69E9 #x69EA #x69EB #x69EC #x69EE #x69EF #x69F0 #x69F1 #x69F3 #x69F4 - #x69F5 #x69F6 #x69F7 #x69F8 #x69F9 #x69FA #x69FB #x69FC #x69FE #x6A00 - #x6A01 #x6A02 #x6A03 #x6A04 #x6A05 #x6A06 #x6A07 #x6A08 #x6A09 #x6A0B - #x6A0C #x6A0D #x6A0E #x6A0F #x6A10 #x6A11 #x6A12 #x6A13 #x6A14 #x6A15 - #x6A16 #x6A19 #x6A1A #x6A1B #x6A1C #x6A1D #x6A1E #x6A20 #x6A22 #x6A23 - #x6A24 #x6A25 #x6A26 #x6A27 #x6A29 #x6A2B #x6A2C #x6A2D #x6A2E #x6A30 - #x6A32 #x6A33 #x6A34 #x6A36 #x6A37 #x6A38 #x6A39 #x6A3A #x6A3B #x6A3C - #x6A3F #x6A40 #x6A41 #x6A42 #x6A43 #x6A45 #x6A46 #x6A48 #x6A49 #x6A4A - #x6A4B #x6A4C #x6A4D #x6A4E #x6A4F #x6A51 #x6A52 #x6A53 #x6A54 #x6A55 - #x6A56 #x6A57 #x6A5A #x6A5C #x6A5D #x6A5E #x6A5F #x6A60 #x6A62 #x6A63 - #x6A64 #x6A66 #x6A67 #x6A68 #x6A69 #x6A6A #x6A6B #x6A6C #x6A6D #x6A6E - #x6A6F #x6A70 #x6A72 #x6A73 #x6A74 #x6A75 #x6A76 #x6A77 #x6A78 #x6A7A - #x6A7B #x6A7D #x6A7E #x6A7F #x6A81 #x6A82 #x6A83 #x6A85 #x6A86 #x6A87 - #x6A88 #x6A89 #x6A8A #x6A8B #x6A8C #x6A8D #x6A8F #x6A92 #x6A93 #x6A94 - #x6A95 #x6A96 #x6A98 #x6A99 #x6A9A #x6A9B #x6A9C #x6A9D #x6A9E #x6A9F - #x6AA1 #x6AA2 #x6AA3 #x6AA4 #x6AA5 #x6AA6 #x6AA7 #x6AA8 #x6AAA #x6AAD - #x6AAE #x6AAF #x6AB0 #x6AB1 #x6AB2 #x6AB3 #x6AB4 #x6AB5 #x6AB6 #x6AB7 - #x6AB8 #x6AB9 #x6ABA #x6ABB #x6ABC #x6ABD #x6ABE #x6ABF #x6AC0 #x6AC1 - #x6AC2 #x6AC3 #x6AC4 #x6AC5 #x6AC6 #x6AC7 #x6AC8 #x6AC9 #x6ACA #x6ACB - #x6ACC #x6ACD #x6ACE #x6ACF #x6AD0 #x6AD1 #x6AD2 #x6AD3 #x6AD4 #x6AD5 - #x6AD6 #x6AD7 #x6AD8 #x6AD9 #x6ADA #x6ADB #x6ADC #x6ADD #x6ADE #x6ADF - #x6AE0 #x6AE1 #x6AE2 #x6AE3 #x6AE4 #x6AE5 #x6AE6 #x6AE7 #x6AE8 #x6AE9 - #x6AEA #x6AEB #x6AEC #x6AED #x6AEE #x6AEF #x6AF0 #x6AF1 #x6AF2 #x6AF3 - #x6AF4 #x6AF5 #x6AF6 #x6AF7 #x6AF8 #x6AF9 #x6AFA #x6AFB #x6AFC #x6AFD - #x6AFE #x6AFF #x6B00 #x6B01 #x6B02 #x6B03 #x6B04 #x6B05 #x6B06 #x6B07 - #x6B08 #x6B09 #x6B0A #x6B0B #x6B0C #x6B0D #x6B0E #x6B0F #x6B10 #x6B11 - #x6B12 #x6B13 #x6B14 #x6B15 #x6B16 #x6B17 #x6B18 #x6B19 #x6B1A #x6B1B - #x6B1C #x6B1D #x6B1E #x6B1F #x6B25 #x6B26 #x6B28 #x6B29 #x6B2A #x6B2B - #x6B2C #x6B2D #x6B2E #x6B2F #x6B30 #x6B31 #x6B33 #x6B34 #x6B35 #x6B36 - #x6B38 #x6B3B #x6B3C #x6B3D #x6B3F #x6B40 #x6B41 #x6B42 #x6B44 #x6B45 - #x6B48 #x6B4A #x6B4B #x6B4D #x6B4E #x6B4F #x6B50 #x6B51 #x6B52 #x6B53 - #x6B54 #x6B55 #x6B56 #x6B57 #x6B58 #x6B5A #x6B5B #x6B5C #x6B5D #x6B5E - #x6B5F #x6B60 #x6B61 #x6B68 #x6B69 #x6B6B #x6B6C #x6B6D #x6B6E #x6B6F - #x6B70 #x6B71 #x6B72 #x6B73 #x6B74 #x6B75 #x6B76 #x6B77 #x6B78 #x6B7A - #x6B7D #x6B7E #x6B7F #x6B80 #x6B85 #x6B88 #x6B8C #x6B8E #x6B8F #x6B90 - #x6B91 #x6B94 #x6B95 #x6B97 #x6B98 #x6B99 #x6B9C #x6B9D #x6B9E #x6B9F - #x6BA0 #x6BA2 #x6BA3 #x6BA4 #x6BA5 #x6BA6 #x6BA7 #x6BA8 #x6BA9 #x6BAB - #x6BAC #x6BAD #x6BAE #x6BAF #x6BB0 #x6BB1 #x6BB2 #x6BB6 #x6BB8 #x6BB9 - #x6BBA #x6BBB #x6BBC #x6BBD #x6BBE #x6BC0 #x6BC3 #x6BC4 #x6BC6 #x6BC7 - #x6BC8 #x6BC9 #x6BCA #x6BCC #x6BCE #x6BD0 #x6BD1 #x6BD8 #x6BDA #x6BDC - #x6BDD #x6BDE #x6BDF #x6BE0 #x6BE2 #x6BE3 #x6BE4 #x6BE5 #x6BE6 #x6BE7 - #x6BE8 #x6BE9 #x6BEC #x6BED #x6BEE #x6BF0 #x6BF1 #x6BF2 #x6BF4 #x6BF6 - #x6BF7 #x6BF8 #x6BFA #x6BFB #x6BFC #x6BFE #x6BFF #x6C00 #x6C01 #x6C02 - #x6C03 #x6C04 #x6C08 #x6C09 #x6C0A #x6C0B #x6C0C #x6C0E #x6C12 #x6C17 - #x6C1C #x6C1D #x6C1E #x6C20 #x6C23 #x6C25 #x6C2B #x6C2C #x6C2D #x6C31 - #x6C33 #x6C36 #x6C37 #x6C39 #x6C3A #x6C3B #x6C3C #x6C3E #x6C3F #x6C43 - #x6C44 #x6C45 #x6C48 #x6C4B #x6C4C #x6C4D #x6C4E #x6C4F #x6C51 #x6C52 - #x6C53 #x6C56 #x6C58 #x6C59 #x6C5A #x6C62 #x6C63 #x6C65 #x6C66 #x6C67 - #x6C6B #x6C6C #x6C6D #x6C6E #x6C6F #x6C71 #x6C73 #x6C75 #x6C77 #x6C78 - #x6C7A #x6C7B #x6C7C #x6C7F #x6C80 #x6C84 #x6C87 #x6C8A #x6C8B #x6C8D - #x6C8E #x6C91 #x6C92 #x6C95 #x6C96 #x6C97 #x6C98 #x6C9A #x6C9C #x6C9D - #x6C9E #x6CA0 #x6CA2 #x6CA8 #x6CAC #x6CAF #x6CB0 #x6CB4 #x6CB5 #x6CB6 - #x6CB7 #x6CBA #x6CC0 #x6CC1 #x6CC2 #x6CC3 #x6CC6 #x6CC7 #x6CC8 #x6CCB - #x6CCD #x6CCE #x6CCF #x6CD1 #x6CD2 #x6CD8 #x6CD9 #x6CDA #x6CDC #x6CDD - #x6CDF #x6CE4 #x6CE6 #x6CE7 #x6CE9 #x6CEC #x6CED #x6CF2 #x6CF4 #x6CF9 - #x6CFF #x6D00 #x6D02 #x6D03 #x6D05 #x6D06 #x6D08 #x6D09 #x6D0A #x6D0D - #x6D0F #x6D10 #x6D11 #x6D13 #x6D14 #x6D15 #x6D16 #x6D18 #x6D1C #x6D1D - #x6D1F #x6D20 #x6D21 #x6D22 #x6D23 #x6D24 #x6D26 #x6D28 #x6D29 #x6D2C - #x6D2D #x6D2F #x6D30 #x6D34 #x6D36 #x6D37 #x6D38 #x6D3A #x6D3F #x6D40 - #x6D42 #x6D44 #x6D49 #x6D4C #x6D50 #x6D55 #x6D56 #x6D57 #x6D58 #x6D5B - #x6D5D #x6D5F #x6D61 #x6D62 #x6D64 #x6D65 #x6D67 #x6D68 #x6D6B #x6D6C - #x6D6D #x6D70 #x6D71 #x6D72 #x6D73 #x6D75 #x6D76 #x6D79 #x6D7A #x6D7B - #x6D7D #x6D7E #x6D7F #x6D80 #x6D81 #x6D83 #x6D84 #x6D86 #x6D87 #x6D8A - #x6D8B #x6D8D #x6D8F #x6D90 #x6D92 #x6D96 #x6D97 #x6D98 #x6D99 #x6D9A - #x6D9C #x6DA2 #x6DA5 #x6DAC #x6DAD #x6DB0 #x6DB1 #x6DB3 #x6DB4 #x6DB6 - #x6DB7 #x6DB9 #x6DBA #x6DBB #x6DBC #x6DBD #x6DBE #x6DC1 #x6DC2 #x6DC3 - #x6DC8 #x6DC9 #x6DCA #x6DCD #x6DCE #x6DCF #x6DD0 #x6DD2 #x6DD3 #x6DD4 - #x6DD5 #x6DD7 #x6DDA #x6DDB #x6DDC #x6DDF #x6DE2 #x6DE3 #x6DE5 #x6DE7 - #x6DE8 #x6DE9 #x6DEA #x6DED #x6DEF #x6DF0 #x6DF2 #x6DF4 #x6DF5 #x6DF6 - #x6DF8 #x6DFA #x6DFD #x6DFE #x6DFF #x6E00 #x6E01 #x6E02 #x6E03 #x6E04 - #x6E06 #x6E07 #x6E08 #x6E09 #x6E0B #x6E0F #x6E12 #x6E13 #x6E15 #x6E18 - #x6E19 #x6E1B #x6E1C #x6E1E #x6E1F #x6E22 #x6E26 #x6E27 #x6E28 #x6E2A - #x6E2C #x6E2E #x6E30 #x6E31 #x6E33 #x6E35 #x6E36 #x6E37 #x6E39 #x6E3B - #x6E3C #x6E3D #x6E3E #x6E3F #x6E40 #x6E41 #x6E42 #x6E45 #x6E46 #x6E47 - #x6E48 #x6E49 #x6E4A #x6E4B #x6E4C #x6E4F #x6E50 #x6E51 #x6E52 #x6E55 - #x6E57 #x6E59 #x6E5A #x6E5C #x6E5D #x6E5E #x6E60 #x6E61 #x6E62 #x6E63 - #x6E64 #x6E65 #x6E66 #x6E67 #x6E68 #x6E69 #x6E6A #x6E6C #x6E6D #x6E6F - #x6E70 #x6E71 #x6E72 #x6E73 #x6E74 #x6E75 #x6E76 #x6E77 #x6E78 #x6E79 - #x6E7A #x6E7B #x6E7C #x6E7D #x6E80 #x6E81 #x6E82 #x6E84 #x6E87 #x6E88 - #x6E8A #x6E8B #x6E8C #x6E8D #x6E8E #x6E91 #x6E92 #x6E93 #x6E94 #x6E95 - #x6E96 #x6E97 #x6E99 #x6E9A #x6E9B #x6E9D #x6E9E #x6EA0 #x6EA1 #x6EA3 - #x6EA4 #x6EA6 #x6EA8 #x6EA9 #x6EAB #x6EAC #x6EAD #x6EAE #x6EB0 #x6EB3 - #x6EB5 #x6EB8 #x6EB9 #x6EBC #x6EBE #x6EBF #x6EC0 #x6EC3 #x6EC4 #x6EC5 - #x6EC6 #x6EC8 #x6EC9 #x6ECA #x6ECC #x6ECD #x6ECE #x6ED0 #x6ED2 #x6ED6 - #x6ED8 #x6ED9 #x6EDB #x6EDC #x6EDD #x6EE3 #x6EE7 #x6EEA #x6EEB #x6EEC - #x6EED #x6EEE #x6EEF #x6EF0 #x6EF1 #x6EF2 #x6EF3 #x6EF5 #x6EF6 #x6EF7 - #x6EF8 #x6EFA #x6EFB #x6EFC #x6EFD #x6EFE #x6EFF #x6F00 #x6F01 #x6F03 - #x6F04 #x6F05 #x6F07 #x6F08 #x6F0A #x6F0B #x6F0C #x6F0D #x6F0E #x6F10 - #x6F11 #x6F12 #x6F16 #x6F17 #x6F18 #x6F19 #x6F1A #x6F1B #x6F1C #x6F1D - #x6F1E #x6F1F #x6F21 #x6F22 #x6F23 #x6F25 #x6F26 #x6F27 #x6F28 #x6F2C - #x6F2E #x6F30 #x6F32 #x6F34 #x6F35 #x6F37 #x6F38 #x6F39 #x6F3A #x6F3B - #x6F3C #x6F3D #x6F3F #x6F40 #x6F41 #x6F42 #x6F43 #x6F44 #x6F45 #x6F48 - #x6F49 #x6F4A #x6F4C #x6F4E #x6F4F #x6F50 #x6F51 #x6F52 #x6F53 #x6F54 - #x6F55 #x6F56 #x6F57 #x6F59 #x6F5A #x6F5B #x6F5D #x6F5F #x6F60 #x6F61 - #x6F63 #x6F64 #x6F65 #x6F67 #x6F68 #x6F69 #x6F6A #x6F6B #x6F6C #x6F6F - #x6F70 #x6F71 #x6F73 #x6F75 #x6F76 #x6F77 #x6F79 #x6F7B #x6F7D #x6F7E - #x6F7F #x6F80 #x6F81 #x6F82 #x6F83 #x6F85 #x6F86 #x6F87 #x6F8A #x6F8B - #x6F8F #x6F90 #x6F91 #x6F92 #x6F93 #x6F94 #x6F95 #x6F96 #x6F97 #x6F98 - #x6F99 #x6F9A #x6F9B #x6F9D #x6F9E #x6F9F #x6FA0 #x6FA2 #x6FA3 #x6FA4 - #x6FA5 #x6FA6 #x6FA8 #x6FA9 #x6FAA #x6FAB #x6FAC #x6FAD #x6FAE #x6FAF - #x6FB0 #x6FB1 #x6FB2 #x6FB4 #x6FB5 #x6FB7 #x6FB8 #x6FBA #x6FBB #x6FBC - #x6FBD #x6FBE #x6FBF #x6FC1 #x6FC3 #x6FC4 #x6FC5 #x6FC6 #x6FC7 #x6FC8 - #x6FCA #x6FCB #x6FCC #x6FCD #x6FCE #x6FCF #x6FD0 #x6FD3 #x6FD4 #x6FD5 - #x6FD6 #x6FD7 #x6FD8 #x6FD9 #x6FDA #x6FDB #x6FDC #x6FDD #x6FDF #x6FE2 - #x6FE3 #x6FE4 #x6FE5 #x6FE6 #x6FE7 #x6FE8 #x6FE9 #x6FEA #x6FEB #x6FEC - #x6FED #x6FF0 #x6FF1 #x6FF2 #x6FF3 #x6FF4 #x6FF5 #x6FF6 #x6FF7 #x6FF8 - #x6FF9 #x6FFA #x6FFB #x6FFC #x6FFD #x6FFE #x6FFF #x7000 #x7001 #x7002 - #x7003 #x7004 #x7005 #x7006 #x7007 #x7008 #x7009 #x700A #x700B #x700C - #x700D #x700E #x700F #x7010 #x7012 #x7013 #x7014 #x7015 #x7016 #x7017 - #x7018 #x7019 #x701C #x701D #x701E #x701F #x7020 #x7021 #x7022 #x7024 - #x7025 #x7026 #x7027 #x7028 #x7029 #x702A #x702B #x702C #x702D #x702E - #x702F #x7030 #x7031 #x7032 #x7033 #x7034 #x7036 #x7037 #x7038 #x703A - #x703B #x703C #x703D #x703E #x703F #x7040 #x7041 #x7042 #x7043 #x7044 - #x7045 #x7046 #x7047 #x7048 #x7049 #x704A #x704B #x704D #x704E #x7050 - #x7051 #x7052 #x7053 #x7054 #x7055 #x7056 #x7057 #x7058 #x7059 #x705A - #x705B #x705C #x705D #x705F #x7060 #x7061 #x7062 #x7063 #x7064 #x7065 - #x7066 #x7067 #x7068 #x7069 #x706A #x706E #x7071 #x7072 #x7073 #x7074 - #x7077 #x7079 #x707A #x707B #x707D #x7081 #x7082 #x7083 #x7084 #x7086 - #x7087 #x7088 #x708B #x708C #x708D #x708F #x7090 #x7091 #x7093 #x7097 - #x7098 #x709A #x709B #x709E #x709F #x70A0 #x70A1 #x70A2 #x70A3 #x70A4 - #x70A5 #x70A6 #x70A7 #x70A8 #x70A9 #x70AA #x70B0 #x70B2 #x70B4 #x70B5 - #x70B6 #x70BA #x70BE #x70BF #x70C4 #x70C5 #x70C6 #x70C7 #x70C9 #x70CB - #x70CC #x70CD #x70CE #x70CF #x70D0 #x70D1 #x70D2 #x70D3 #x70D4 #x70D5 - #x70D6 #x70D7 #x70DA #x70DC #x70DD #x70DE #x70E0 #x70E1 #x70E2 #x70E3 - #x70E5 #x70EA #x70EE #x70F0 #x70F1 #x70F2 #x70F3 #x70F4 #x70F5 #x70F6 - #x70F8 #x70FA #x70FB #x70FC #x70FE #x70FF #x7100 #x7101 #x7102 #x7103 - #x7104 #x7105 #x7106 #x7107 #x7108 #x710B #x710C #x710D #x710E #x710F - #x7111 #x7112 #x7114 #x7117 #x711B #x711C #x711D #x711E #x711F #x7120 - #x7121 #x7122 #x7123 #x7124 #x7125 #x7127 #x7128 #x7129 #x712A #x712B - #x712C #x712D #x712E #x7132 #x7133 #x7134 #x7135 #x7137 #x7138 #x7139 - #x713A #x713B #x713C #x713D #x713E #x713F #x7140 #x7141 #x7142 #x7143 - #x7144 #x7146 #x7147 #x7148 #x7149 #x714B #x714D #x714F #x7150 #x7151 - #x7152 #x7153 #x7154 #x7155 #x7156 #x7157 #x7158 #x7159 #x715A #x715B - #x715D #x715F #x7160 #x7161 #x7162 #x7163 #x7165 #x7169 #x716A #x716B - #x716C #x716D #x716F #x7170 #x7171 #x7174 #x7175 #x7176 #x7177 #x7179 - #x717B #x717C #x717E #x717F #x7180 #x7181 #x7182 #x7183 #x7185 #x7186 - #x7187 #x7188 #x7189 #x718B #x718C #x718D #x718E #x7190 #x7191 #x7192 - #x7193 #x7195 #x7196 #x7197 #x719A #x719B #x719C #x719D #x719E #x71A1 - #x71A2 #x71A3 #x71A4 #x71A5 #x71A6 #x71A7 #x71A9 #x71AA #x71AB #x71AD - #x71AE #x71AF #x71B0 #x71B1 #x71B2 #x71B4 #x71B6 #x71B7 #x71B8 #x71BA - #x71BB #x71BC #x71BD #x71BE #x71BF #x71C0 #x71C1 #x71C2 #x71C4 #x71C5 - #x71C6 #x71C7 #x71C8 #x71C9 #x71CA #x71CB #x71CC #x71CD #x71CF #x71D0 - #x71D1 #x71D2 #x71D3 #x71D6 #x71D7 #x71D8 #x71D9 #x71DA #x71DB #x71DC - #x71DD #x71DE #x71DF #x71E1 #x71E2 #x71E3 #x71E4 #x71E6 #x71E8 #x71E9 - #x71EA #x71EB #x71EC #x71ED #x71EF #x71F0 #x71F1 #x71F2 #x71F3 #x71F4 - #x71F5 #x71F6 #x71F7 #x71F8 #x71FA #x71FB #x71FC #x71FD #x71FE #x71FF - #x7200 #x7201 #x7202 #x7203 #x7204 #x7205 #x7207 #x7208 #x7209 #x720A - #x720B #x720C #x720D #x720E #x720F #x7210 #x7211 #x7212 #x7213 #x7214 - #x7215 #x7216 #x7217 #x7218 #x7219 #x721A #x721B #x721C #x721E #x721F - #x7220 #x7221 #x7222 #x7223 #x7224 #x7225 #x7226 #x7227 #x7229 #x722B - #x722D #x722E #x722F #x7232 #x7233 #x7234 #x723A #x723C #x723E #x7240 - #x7241 #x7242 #x7243 #x7244 #x7245 #x7246 #x7249 #x724A #x724B #x724E - #x724F #x7250 #x7251 #x7253 #x7254 #x7255 #x7257 #x7258 #x725A #x725C - #x725E #x7260 #x7263 #x7264 #x7265 #x7268 #x726A #x726B #x726C #x726D - #x7270 #x7271 #x7273 #x7274 #x7276 #x7277 #x7278 #x727B #x727C #x727D - #x7282 #x7283 #x7285 #x7286 #x7287 #x7288 #x7289 #x728C #x728E #x7290 - #x7291 #x7293 #x7294 #x7295 #x7296 #x7297 #x7298 #x7299 #x729A #x729B - #x729C #x729D #x729E #x72A0 #x72A1 #x72A2 #x72A3 #x72A4 #x72A5 #x72A6 - #x72A7 #x72A8 #x72A9 #x72AA #x72AB #x72AE #x72B1 #x72B2 #x72B3 #x72B5 - #x72BA #x72BB #x72BC #x72BD #x72BE #x72BF #x72C0 #x72C5 #x72C6 #x72C7 - #x72C9 #x72CA #x72CB #x72CC #x72CF #x72D1 #x72D3 #x72D4 #x72D5 #x72D6 - #x72D8 #x72DA #x72DB #x72DC #x72DD #x72DF #x72E2 #x72E3 #x72E4 #x72E5 - #x72E6 #x72E7 #x72EA #x72EB #x72F5 #x72F6 #x72F9 #x72FD #x72FE #x72FF - #x7300 #x7302 #x7304 #x7305 #x7306 #x7307 #x7308 #x7309 #x730B #x730C - #x730D #x730F #x7310 #x7311 #x7312 #x7314 #x7318 #x7319 #x731A #x731F - #x7320 #x7323 #x7324 #x7326 #x7327 #x7328 #x732D #x732F #x7330 #x7332 - #x7333 #x7335 #x7336 #x733A #x733B #x733C #x733D #x7340 #x7341 #x7342 - #x7343 #x7344 #x7345 #x7346 #x7347 #x7348 #x7349 #x734A #x734B #x734C - #x734E #x734F #x7351 #x7353 #x7354 #x7355 #x7356 #x7358 #x7359 #x735A - #x735B #x735C #x735D #x735E #x735F #x7361 #x7362 #x7363 #x7364 #x7365 - #x7366 #x7367 #x7368 #x7369 #x736A #x736B #x736E #x7370 #x7371 #x7372 - #x7373 #x7374 #x7375 #x7376 #x7377 #x7378 #x7379 #x737A #x737B #x737C - #x737D #x737F #x7380 #x7381 #x7382 #x7383 #x7385 #x7386 #x7388 #x738A - #x738C #x738D #x738F #x7390 #x7392 #x7393 #x7394 #x7395 #x7397 #x7398 - #x7399 #x739A #x739C #x739D #x739E #x73A0 #x73A1 #x73A3 #x73A4 #x73A5 - #x73A6 #x73A7 #x73A8 #x73AA #x73AC #x73AD #x73B1 #x73B4 #x73B5 #x73B6 - #x73B8 #x73B9 #x73BC #x73BD #x73BE #x73BF #x73C1 #x73C3 #x73C4 #x73C5 - #x73C6 #x73C7 #x73CB #x73CC #x73CE #x73D2 #x73D3 #x73D4 #x73D5 #x73D6 - #x73D7 #x73D8 #x73DA #x73DB #x73DC #x73DD #x73DF #x73E1 #x73E2 #x73E3 - #x73E4 #x73E6 #x73E8 #x73EA #x73EB #x73EC #x73EE #x73EF #x73F0 #x73F1 - #x73F3 #x73F4 #x73F5 #x73F6 #x73F7 #x73F8 #x73F9 #x73FA #x73FB #x73FC - #x73FD #x73FE #x73FF #x7400 #x7401 #x7402 #x7404 #x7407 #x7408 #x740B - #x740C #x740D #x740E #x7411 #x7412 #x7413 #x7414 #x7415 #x7416 #x7417 - #x7418 #x7419 #x741C #x741D #x741E #x741F #x7420 #x7421 #x7423 #x7424 - #x7427 #x7429 #x742B #x742D #x742F #x7431 #x7432 #x7437 #x7438 #x7439 - #x743A #x743B #x743D #x743E #x743F #x7440 #x7442 #x7443 #x7444 #x7445 - #x7446 #x7447 #x7448 #x7449 #x744A #x744B #x744C #x744D #x744E #x744F - #x7450 #x7451 #x7452 #x7453 #x7454 #x7456 #x7458 #x745D #x7460 #x7461 - #x7462 #x7463 #x7464 #x7465 #x7466 #x7467 #x7468 #x7469 #x746A #x746B - #x746C #x746E #x746F #x7471 #x7472 #x7473 #x7474 #x7475 #x7478 #x7479 - #x747A #x747B #x747C #x747D #x747F #x7482 #x7484 #x7485 #x7486 #x7488 - #x7489 #x748A #x748C #x748D #x748F #x7491 #x7492 #x7493 #x7494 #x7495 - #x7496 #x7497 #x7498 #x7499 #x749A #x749B #x749D #x749F #x74A0 #x74A1 - #x74A2 #x74A3 #x74A4 #x74A5 #x74A6 #x74AA #x74AB #x74AC #x74AD #x74AE - #x74AF #x74B0 #x74B1 #x74B2 #x74B3 #x74B4 #x74B5 #x74B6 #x74B7 #x74B8 - #x74B9 #x74BB #x74BC #x74BD #x74BE #x74BF #x74C0 #x74C1 #x74C2 #x74C3 - #x74C4 #x74C5 #x74C6 #x74C7 #x74C8 #x74C9 #x74CA #x74CB #x74CC #x74CD - #x74CE #x74CF #x74D0 #x74D1 #x74D3 #x74D4 #x74D5 #x74D6 #x74D7 #x74D8 - #x74D9 #x74DA #x74DB #x74DD #x74DF #x74E1 #x74E5 #x74E7 #x74E8 #x74E9 - #x74EA #x74EB #x74EC #x74ED #x74F0 #x74F1 #x74F2 #x74F3 #x74F5 #x74F8 - #x74F9 #x74FA #x74FB #x74FC #x74FD #x74FE #x7500 #x7501 #x7502 #x7503 - #x7505 #x7506 #x7507 #x7508 #x7509 #x750A #x750B #x750C #x750E #x7510 - #x7512 #x7514 #x7515 #x7516 #x7517 #x751B #x751D #x751E #x7520 #x7521 - #x7522 #x7523 #x7524 #x7526 #x7527 #x752A #x752E #x7534 #x7536 #x7539 - #x753C #x753D #x753F #x7541 #x7542 #x7543 #x7544 #x7546 #x7547 #x7549 - #x754A #x754D #x7550 #x7551 #x7552 #x7553 #x7555 #x7556 #x7557 #x7558 - #x755D #x755E #x755F #x7560 #x7561 #x7562 #x7563 #x7564 #x7567 #x7568 - #x7569 #x756B #x756C #x756D #x756E #x756F #x7570 #x7571 #x7573 #x7575 - #x7576 #x7577 #x757A #x757B #x757C #x757D #x757E #x7580 #x7581 #x7582 - #x7584 #x7585 #x7587 #x7588 #x7589 #x758A #x758C #x758D #x758E #x7590 - #x7593 #x7595 #x7598 #x759B #x759C #x759E #x75A2 #x75A6 #x75A7 #x75A8 - #x75A9 #x75AA #x75AD #x75B6 #x75B7 #x75BA #x75BB #x75BF #x75C0 #x75C1 - #x75C6 #x75CB #x75CC #x75CE #x75CF #x75D0 #x75D1 #x75D3 #x75D7 #x75D9 - #x75DA #x75DC #x75DD #x75DF #x75E0 #x75E1 #x75E5 #x75E9 #x75EC #x75ED - #x75EE #x75EF #x75F2 #x75F3 #x75F5 #x75F6 #x75F7 #x75F8 #x75FA #x75FB - #x75FD #x75FE #x7602 #x7604 #x7606 #x7607 #x7608 #x7609 #x760B #x760D - #x760E #x760F #x7611 #x7612 #x7613 #x7614 #x7616 #x761A #x761C #x761D - #x761E #x7621 #x7623 #x7627 #x7628 #x762C #x762E #x762F #x7631 #x7632 - #x7636 #x7637 #x7639 #x763A #x763B #x763D #x7641 #x7642 #x7644 #x7645 - #x7646 #x7647 #x7648 #x7649 #x764A #x764B #x764E #x764F #x7650 #x7651 - #x7652 #x7653 #x7655 #x7657 #x7658 #x7659 #x765A #x765B #x765D #x765F - #x7660 #x7661 #x7662 #x7664 #x7665 #x7666 #x7667 #x7668 #x7669 #x766A - #x766C #x766D #x766E #x7670 #x7671 #x7672 #x7673 #x7674 #x7675 #x7676 - #x7677 #x7679 #x767A #x767C #x767F #x7680 #x7681 #x7683 #x7685 #x7689 - #x768A #x768C #x768D #x768F #x7690 #x7692 #x7694 #x7695 #x7697 #x7698 - #x769A #x769B #x769C #x769D #x769E #x769F #x76A0 #x76A1 #x76A2 #x76A3 - #x76A5 #x76A6 #x76A7 #x76A8 #x76A9 #x76AA #x76AB #x76AC #x76AD #x76AF - #x76B0 #x76B3 #x76B5 #x76B6 #x76B7 #x76B8 #x76B9 #x76BA #x76BB #x76BC - #x76BD #x76BE #x76C0 #x76C1 #x76C3 #x76C4 #x76C7 #x76C9 #x76CB #x76CC - #x76D3 #x76D5 #x76D9 #x76DA #x76DC #x76DD #x76DE #x76E0 #x76E1 #x76E2 - #x76E3 #x76E4 #x76E6 #x76E7 #x76E8 #x76E9 #x76EA #x76EB #x76EC #x76ED - #x76F0 #x76F3 #x76F5 #x76F6 #x76F7 #x76FA #x76FB #x76FD #x76FF #x7700 - #x7702 #x7703 #x7705 #x7706 #x770A #x770C #x770E #x770F #x7710 #x7711 - #x7712 #x7713 #x7714 #x7715 #x7716 #x7717 #x7718 #x771B #x771C #x771D - #x771E #x7721 #x7723 #x7724 #x7725 #x7727 #x772A #x772B #x772C #x772E - #x7730 #x7731 #x7732 #x7733 #x7734 #x7739 #x773B #x773D #x773E #x773F - #x7742 #x7744 #x7745 #x7746 #x7748 #x7749 #x774A #x774B #x774C #x774D - #x774E #x774F #x7752 #x7753 #x7754 #x7755 #x7756 #x7757 #x7758 #x7759 - #x775C #x775D #x775E #x775F #x7760 #x7764 #x7767 #x7769 #x776A #x776D - #x776E #x776F #x7770 #x7771 #x7772 #x7773 #x7774 #x7775 #x7776 #x7777 - #x7778 #x777A #x777B #x777C #x7781 #x7782 #x7783 #x7786 #x7787 #x7788 - #x7789 #x778A #x778B #x778F #x7790 #x7793 #x7794 #x7795 #x7796 #x7797 - #x7798 #x7799 #x779A #x779B #x779C #x779D #x779E #x77A1 #x77A3 #x77A4 - #x77A6 #x77A8 #x77AB #x77AD #x77AE #x77AF #x77B1 #x77B2 #x77B4 #x77B6 - #x77B7 #x77B8 #x77B9 #x77BA #x77BC #x77BE #x77C0 #x77C1 #x77C2 #x77C3 - #x77C4 #x77C5 #x77C6 #x77C7 #x77C8 #x77C9 #x77CA #x77CB #x77CC #x77CE - #x77CF #x77D0 #x77D1 #x77D2 #x77D3 #x77D4 #x77D5 #x77D6 #x77D8 #x77D9 - #x77DA #x77DD #x77DE #x77DF #x77E0 #x77E1 #x77E4 #x77E6 #x77E8 #x77EA - #x77EF #x77F0 #x77F1 #x77F2 #x77F4 #x77F5 #x77F7 #x77F9 #x77FA #x77FB - #x77FC #x7803 #x7804 #x7805 #x7806 #x7807 #x7808 #x780A #x780B #x780E - #x780F #x7810 #x7813 #x7815 #x7819 #x781B #x781E #x7820 #x7821 #x7822 - #x7824 #x7828 #x782A #x782B #x782E #x782F #x7831 #x7832 #x7833 #x7835 - #x7836 #x783D #x783F #x7841 #x7842 #x7843 #x7844 #x7846 #x7848 #x7849 - #x784A #x784B #x784D #x784F #x7851 #x7853 #x7854 #x7858 #x7859 #x785A - #x785B #x785C #x785E #x785F #x7860 #x7861 #x7862 #x7863 #x7864 #x7865 - #x7866 #x7867 #x7868 #x7869 #x786F #x7870 #x7871 #x7872 #x7873 #x7874 - #x7875 #x7876 #x7878 #x7879 #x787A #x787B #x787D #x787E #x787F #x7880 - #x7881 #x7882 #x7883 #x7884 #x7885 #x7886 #x7888 #x788A #x788B #x788F - #x7890 #x7892 #x7894 #x7895 #x7896 #x7899 #x789D #x789E #x78A0 #x78A2 - #x78A4 #x78A6 #x78A8 #x78A9 #x78AA #x78AB #x78AC #x78AD #x78AE #x78AF - #x78B5 #x78B6 #x78B7 #x78B8 #x78BA #x78BB #x78BC #x78BD #x78BF #x78C0 - #x78C2 #x78C3 #x78C4 #x78C6 #x78C7 #x78C8 #x78CC #x78CD #x78CE #x78CF - #x78D1 #x78D2 #x78D3 #x78D6 #x78D7 #x78D8 #x78DA #x78DB #x78DC #x78DD - #x78DE #x78DF #x78E0 #x78E1 #x78E2 #x78E3 #x78E4 #x78E5 #x78E6 #x78E7 - #x78E9 #x78EA #x78EB #x78ED #x78EE #x78EF #x78F0 #x78F1 #x78F3 #x78F5 - #x78F6 #x78F8 #x78F9 #x78FB #x78FC #x78FD #x78FE #x78FF #x7900 #x7902 - #x7903 #x7904 #x7906 #x7907 #x7908 #x7909 #x790A #x790B #x790C #x790D - #x790E #x790F #x7910 #x7911 #x7912 #x7914 #x7915 #x7916 #x7917 #x7918 - #x7919 #x791A #x791B #x791C #x791D #x791F #x7920 #x7921 #x7922 #x7923 - #x7925 #x7926 #x7927 #x7928 #x7929 #x792A #x792B #x792C #x792D #x792E - #x792F #x7930 #x7931 #x7932 #x7933 #x7935 #x7936 #x7937 #x7938 #x7939 - #x793D #x793F #x7942 #x7943 #x7944 #x7945 #x7947 #x794A #x794B #x794C - #x794D #x794E #x794F #x7950 #x7951 #x7952 #x7954 #x7955 #x7958 #x7959 - #x7961 #x7963 #x7964 #x7966 #x7969 #x796A #x796B #x796C #x796E #x7970 - #x7971 #x7972 #x7973 #x7974 #x7975 #x7976 #x7979 #x797B #x797C #x797D - #x797E #x797F #x7982 #x7983 #x7986 #x7987 #x7988 #x7989 #x798B #x798C - #x798D #x798E #x7990 #x7991 #x7992 #x7993 #x7994 #x7995 #x7996 #x7997 - #x7998 #x7999 #x799B #x799C #x799D #x799E #x799F #x79A0 #x79A1 #x79A2 - #x79A3 #x79A4 #x79A5 #x79A6 #x79A8 #x79A9 #x79AA #x79AB #x79AC #x79AD - #x79AE #x79AF #x79B0 #x79B1 #x79B2 #x79B4 #x79B5 #x79B6 #x79B7 #x79B8 - #x79BC #x79BF #x79C2 #x79C4 #x79C5 #x79C7 #x79C8 #x79CA #x79CC #x79CE - #x79CF #x79D0 #x79D3 #x79D4 #x79D6 #x79D7 #x79D9 #x79DA #x79DB #x79DC - #x79DD #x79DE #x79E0 #x79E1 #x79E2 #x79E5 #x79E8 #x79EA #x79EC #x79EE - #x79F1 #x79F2 #x79F3 #x79F4 #x79F5 #x79F6 #x79F7 #x79F9 #x79FA #x79FC - #x79FE #x79FF #x7A01 #x7A04 #x7A05 #x7A07 #x7A08 #x7A09 #x7A0A #x7A0C - #x7A0F #x7A10 #x7A11 #x7A12 #x7A13 #x7A15 #x7A16 #x7A18 #x7A19 #x7A1B - #x7A1C #x7A1D #x7A1F #x7A21 #x7A22 #x7A24 #x7A25 #x7A26 #x7A27 #x7A28 - #x7A29 #x7A2A #x7A2B #x7A2C #x7A2D #x7A2E #x7A2F #x7A30 #x7A31 #x7A32 - #x7A34 #x7A35 #x7A36 #x7A38 #x7A3A #x7A3E #x7A40 #x7A41 #x7A42 #x7A43 - #x7A44 #x7A45 #x7A47 #x7A48 #x7A49 #x7A4A #x7A4B #x7A4C #x7A4D #x7A4E - #x7A4F #x7A50 #x7A52 #x7A53 #x7A54 #x7A55 #x7A56 #x7A58 #x7A59 #x7A5A - #x7A5B #x7A5C #x7A5D #x7A5E #x7A5F #x7A60 #x7A61 #x7A62 #x7A63 #x7A64 - #x7A65 #x7A66 #x7A67 #x7A68 #x7A69 #x7A6A #x7A6B #x7A6C #x7A6D #x7A6E - #x7A6F #x7A71 #x7A72 #x7A73 #x7A75 #x7A7B #x7A7C #x7A7D #x7A7E #x7A82 - #x7A85 #x7A87 #x7A89 #x7A8A #x7A8B #x7A8C #x7A8E #x7A8F #x7A90 #x7A93 - #x7A94 #x7A99 #x7A9A #x7A9B #x7A9E #x7AA1 #x7AA2 #x7AA3 #x7AA4 #x7AA7 - #x7AA9 #x7AAA #x7AAB #x7AAE #x7AAF #x7AB0 #x7AB1 #x7AB2 #x7AB4 #x7AB5 - #x7AB6 #x7AB7 #x7AB8 #x7AB9 #x7ABA #x7ABB #x7ABC #x7ABD #x7ABE #x7AC0 - #x7AC1 #x7AC2 #x7AC3 #x7AC4 #x7AC5 #x7AC6 #x7AC7 #x7AC8 #x7AC9 #x7ACA - #x7ACC #x7ACD #x7ACE #x7ACF #x7AD0 #x7AD1 #x7AD2 #x7AD3 #x7AD4 #x7AD5 - #x7AD7 #x7AD8 #x7ADA #x7ADB #x7ADC #x7ADD #x7AE1 #x7AE2 #x7AE4 #x7AE7 - #x7AE8 #x7AE9 #x7AEA #x7AEB #x7AEC #x7AEE #x7AF0 #x7AF1 #x7AF2 #x7AF3 - #x7AF4 #x7AF5 #x7AF6 #x7AF7 #x7AF8 #x7AFB #x7AFC #x7AFE #x7B00 #x7B01 - #x7B02 #x7B05 #x7B07 #x7B09 #x7B0C #x7B0D #x7B0E #x7B10 #x7B12 #x7B13 - #x7B16 #x7B17 #x7B18 #x7B1A #x7B1C #x7B1D #x7B1F #x7B21 #x7B22 #x7B23 - #x7B27 #x7B29 #x7B2D #x7B2F #x7B30 #x7B32 #x7B34 #x7B35 #x7B36 #x7B37 - #x7B39 #x7B3B #x7B3D #x7B3F #x7B40 #x7B41 #x7B42 #x7B43 #x7B44 #x7B46 - #x7B48 #x7B4A #x7B4D #x7B4E #x7B53 #x7B55 #x7B57 #x7B59 #x7B5C #x7B5E - #x7B5F #x7B61 #x7B63 #x7B64 #x7B65 #x7B66 #x7B67 #x7B68 #x7B69 #x7B6A - #x7B6B #x7B6C #x7B6D #x7B6F #x7B70 #x7B73 #x7B74 #x7B76 #x7B78 #x7B7A - #x7B7C #x7B7D #x7B7F #x7B81 #x7B82 #x7B83 #x7B84 #x7B86 #x7B87 #x7B88 - #x7B89 #x7B8A #x7B8B #x7B8C #x7B8E #x7B8F #x7B91 #x7B92 #x7B93 #x7B96 - #x7B98 #x7B99 #x7B9A #x7B9B #x7B9E #x7B9F #x7BA0 #x7BA3 #x7BA4 #x7BA5 - #x7BAE #x7BAF #x7BB0 #x7BB2 #x7BB3 #x7BB5 #x7BB6 #x7BB7 #x7BB9 #x7BBA - #x7BBB #x7BBC #x7BBD #x7BBE #x7BBF #x7BC0 #x7BC2 #x7BC3 #x7BC4 #x7BC5 - #x7BC8 #x7BC9 #x7BCA #x7BCB #x7BCD #x7BCE #x7BCF #x7BD0 #x7BD2 #x7BD4 - #x7BD5 #x7BD6 #x7BD7 #x7BD8 #x7BDB #x7BDC #x7BDE #x7BDF #x7BE0 #x7BE2 - #x7BE3 #x7BE4 #x7BE7 #x7BE8 #x7BE9 #x7BEB #x7BEC #x7BED #x7BEF #x7BF0 - #x7BF2 #x7BF3 #x7BF4 #x7BF5 #x7BF6 #x7BF8 #x7BF9 #x7BFA #x7BFB #x7BFD - #x7BFF #x7C00 #x7C01 #x7C02 #x7C03 #x7C04 #x7C05 #x7C06 #x7C08 #x7C09 - #x7C0A #x7C0D #x7C0E #x7C10 #x7C11 #x7C12 #x7C13 #x7C14 #x7C15 #x7C17 - #x7C18 #x7C19 #x7C1A #x7C1B #x7C1C #x7C1D #x7C1E #x7C20 #x7C21 #x7C22 - #x7C23 #x7C24 #x7C25 #x7C28 #x7C29 #x7C2B #x7C2C #x7C2D #x7C2E #x7C2F - #x7C30 #x7C31 #x7C32 #x7C33 #x7C34 #x7C35 #x7C36 #x7C37 #x7C39 #x7C3A - #x7C3B #x7C3C #x7C3D #x7C3E #x7C42 #x7C43 #x7C44 #x7C45 #x7C46 #x7C47 - #x7C48 #x7C49 #x7C4A #x7C4B #x7C4C #x7C4E #x7C4F #x7C50 #x7C51 #x7C52 - #x7C53 #x7C54 #x7C55 #x7C56 #x7C57 #x7C58 #x7C59 #x7C5A #x7C5B #x7C5C - #x7C5D #x7C5E #x7C5F #x7C60 #x7C61 #x7C62 #x7C63 #x7C64 #x7C65 #x7C66 - #x7C67 #x7C68 #x7C69 #x7C6A #x7C6B #x7C6C #x7C6D #x7C6E #x7C6F #x7C70 - #x7C71 #x7C72 #x7C75 #x7C76 #x7C77 #x7C78 #x7C79 #x7C7A #x7C7E #x7C7F - #x7C80 #x7C81 #x7C82 #x7C83 #x7C84 #x7C85 #x7C86 #x7C87 #x7C88 #x7C8A - #x7C8B #x7C8C #x7C8D #x7C8E #x7C8F #x7C90 #x7C93 #x7C94 #x7C96 #x7C99 - #x7C9A #x7C9B #x7CA0 #x7CA1 #x7CA3 #x7CA6 #x7CA7 #x7CA8 #x7CA9 #x7CAB - #x7CAC #x7CAD #x7CAF #x7CB0 #x7CB4 #x7CB5 #x7CB6 #x7CB7 #x7CB8 #x7CBA - #x7CBB #x7CBF #x7CC0 #x7CC2 #x7CC3 #x7CC4 #x7CC6 #x7CC9 #x7CCB #x7CCE - #x7CCF #x7CD0 #x7CD1 #x7CD2 #x7CD3 #x7CD4 #x7CD8 #x7CDA #x7CDB #x7CDD - #x7CDE #x7CE1 #x7CE2 #x7CE3 #x7CE4 #x7CE5 #x7CE6 #x7CE7 #x7CE9 #x7CEA - #x7CEB #x7CEC #x7CED #x7CEE #x7CF0 #x7CF1 #x7CF2 #x7CF3 #x7CF4 #x7CF5 - #x7CF6 #x7CF7 #x7CF9 #x7CFA #x7CFC #x7CFD #x7CFE #x7CFF #x7D00 #x7D01 - #x7D02 #x7D03 #x7D04 #x7D05 #x7D06 #x7D07 #x7D08 #x7D09 #x7D0B #x7D0C - #x7D0D #x7D0E #x7D0F #x7D10 #x7D11 #x7D12 #x7D13 #x7D14 #x7D15 #x7D16 - #x7D17 #x7D18 #x7D19 #x7D1A #x7D1B #x7D1C #x7D1D #x7D1E #x7D1F #x7D21 - #x7D23 #x7D24 #x7D25 #x7D26 #x7D28 #x7D29 #x7D2A #x7D2C #x7D2D #x7D2E - #x7D30 #x7D31 #x7D32 #x7D33 #x7D34 #x7D35 #x7D36 #x7D37 #x7D38 #x7D39 - #x7D3A #x7D3B #x7D3C #x7D3D #x7D3E #x7D3F #x7D40 #x7D41 #x7D42 #x7D43 - #x7D44 #x7D45 #x7D46 #x7D47 #x7D48 #x7D49 #x7D4A #x7D4B #x7D4C #x7D4D - #x7D4E #x7D4F #x7D50 #x7D51 #x7D52 #x7D53 #x7D54 #x7D55 #x7D56 #x7D57 - #x7D58 #x7D59 #x7D5A #x7D5B #x7D5C #x7D5D #x7D5E #x7D5F #x7D60 #x7D61 - #x7D62 #x7D63 #x7D64 #x7D65 #x7D66 #x7D67 #x7D68 #x7D69 #x7D6A #x7D6B - #x7D6C #x7D6D #x7D6F #x7D70 #x7D71 #x7D72 #x7D73 #x7D74 #x7D75 #x7D76 - #x7D78 #x7D79 #x7D7A #x7D7B #x7D7C #x7D7D #x7D7E #x7D7F #x7D80 #x7D81 - #x7D82 #x7D83 #x7D84 #x7D85 #x7D86 #x7D87 #x7D88 #x7D89 #x7D8A #x7D8B - #x7D8C #x7D8D #x7D8E #x7D8F #x7D90 #x7D91 #x7D92 #x7D93 #x7D94 #x7D95 - #x7D96 #x7D97 #x7D98 #x7D99 #x7D9A #x7D9B #x7D9C #x7D9D #x7D9E #x7D9F - #x7DA0 #x7DA1 #x7DA2 #x7DA3 #x7DA4 #x7DA5 #x7DA7 #x7DA8 #x7DA9 #x7DAA - #x7DAB #x7DAC #x7DAD #x7DAF #x7DB0 #x7DB1 #x7DB2 #x7DB3 #x7DB4 #x7DB5 - #x7DB6 #x7DB7 #x7DB8 #x7DB9 #x7DBA #x7DBB #x7DBC #x7DBD #x7DBE #x7DBF - #x7DC0 #x7DC1 #x7DC2 #x7DC3 #x7DC4 #x7DC5 #x7DC6 #x7DC7 #x7DC8 #x7DC9 - #x7DCA #x7DCB #x7DCC #x7DCD #x7DCE #x7DCF #x7DD0 #x7DD1 #x7DD2 #x7DD3 - #x7DD4 #x7DD5 #x7DD6 #x7DD7 #x7DD8 #x7DD9 #x7DDA #x7DDB #x7DDC #x7DDD - #x7DDE #x7DDF #x7DE0 #x7DE1 #x7DE2 #x7DE3 #x7DE4 #x7DE5 #x7DE6 #x7DE7 - #x7DE8 #x7DE9 #x7DEA #x7DEB #x7DEC #x7DED #x7DEE #x7DEF #x7DF0 #x7DF1 - #x7DF2 #x7DF3 #x7DF4 #x7DF5 #x7DF6 #x7DF7 #x7DF8 #x7DF9 #x7DFA #x7DFB - #x7DFC #x7DFD #x7DFE #x7DFF #x7E00 #x7E01 #x7E02 #x7E03 #x7E04 #x7E05 - #x7E06 #x7E07 #x7E08 #x7E09 #x7E0A #x7E0B #x7E0C #x7E0D #x7E0E #x7E0F - #x7E10 #x7E11 #x7E12 #x7E13 #x7E14 #x7E15 #x7E16 #x7E17 #x7E18 #x7E19 - #x7E1A #x7E1B #x7E1C #x7E1D #x7E1E #x7E1F #x7E20 #x7E21 #x7E22 #x7E23 - #x7E24 #x7E25 #x7E26 #x7E27 #x7E28 #x7E29 #x7E2A #x7E2B #x7E2C #x7E2D - #x7E2E #x7E2F #x7E30 #x7E31 #x7E32 #x7E33 #x7E34 #x7E35 #x7E36 #x7E37 - #x7E38 #x7E39 #x7E3A #x7E3C #x7E3D #x7E3E #x7E3F #x7E40 #x7E42 #x7E43 - #x7E44 #x7E45 #x7E46 #x7E48 #x7E49 #x7E4A #x7E4B #x7E4C #x7E4D #x7E4E - #x7E4F #x7E50 #x7E51 #x7E52 #x7E53 #x7E54 #x7E55 #x7E56 #x7E57 #x7E58 - #x7E59 #x7E5A #x7E5B #x7E5C #x7E5D #x7E5E #x7E5F #x7E60 #x7E61 #x7E62 - #x7E63 #x7E64 #x7E65 #x7E66 #x7E67 #x7E68 #x7E69 #x7E6A #x7E6B #x7E6C - #x7E6D #x7E6E #x7E6F #x7E70 #x7E71 #x7E72 #x7E73 #x7E74 #x7E75 #x7E76 - #x7E77 #x7E78 #x7E79 #x7E7A #x7E7B #x7E7C #x7E7D #x7E7E #x7E7F #x7E80 - #x7E81 #x7E83 #x7E84 #x7E85 #x7E86 #x7E87 #x7E88 #x7E89 #x7E8A #x7E8B - #x7E8C #x7E8D #x7E8E #x7E8F #x7E90 #x7E91 #x7E92 #x7E93 #x7E94 #x7E95 - #x7E96 #x7E97 #x7E98 #x7E99 #x7E9A #x7E9C #x7E9D #x7E9E #x7EAE #x7EB4 - #x7EBB #x7EBC #x7ED6 #x7EE4 #x7EEC #x7EF9 #x7F0A #x7F10 #x7F1E #x7F37 - #x7F39 #x7F3B #x7F3C #x7F3D #x7F3E #x7F3F #x7F40 #x7F41 #x7F43 #x7F46 - #x7F47 #x7F48 #x7F49 #x7F4A #x7F4B #x7F4C #x7F4D #x7F4E #x7F4F #x7F52 - #x7F53 #x7F56 #x7F59 #x7F5B #x7F5C #x7F5D #x7F5E #x7F60 #x7F63 #x7F64 - #x7F65 #x7F66 #x7F67 #x7F6B #x7F6C #x7F6D #x7F6F #x7F70 #x7F73 #x7F75 - #x7F76 #x7F77 #x7F78 #x7F7A #x7F7B #x7F7C #x7F7D #x7F7F #x7F80 #x7F82 - #x7F83 #x7F84 #x7F85 #x7F86 #x7F87 #x7F88 #x7F89 #x7F8B #x7F8D #x7F8F - #x7F90 #x7F91 #x7F92 #x7F93 #x7F95 #x7F96 #x7F97 #x7F98 #x7F99 #x7F9B - #x7F9C #x7FA0 #x7FA2 #x7FA3 #x7FA5 #x7FA6 #x7FA8 #x7FA9 #x7FAA #x7FAB - #x7FAC #x7FAD #x7FAE #x7FB1 #x7FB3 #x7FB4 #x7FB5 #x7FB6 #x7FB7 #x7FBA - #x7FBB #x7FBE #x7FC0 #x7FC2 #x7FC3 #x7FC4 #x7FC6 #x7FC7 #x7FC8 #x7FC9 - #x7FCB #x7FCD #x7FCF #x7FD0 #x7FD1 #x7FD2 #x7FD3 #x7FD6 #x7FD7 #x7FD9 - #x7FDA #x7FDB #x7FDC #x7FDD #x7FDE #x7FE2 #x7FE3 #x7FE4 #x7FE7 #x7FE8 - #x7FEA #x7FEB #x7FEC #x7FED #x7FEF #x7FF2 #x7FF4 #x7FF5 #x7FF6 #x7FF7 - #x7FF8 #x7FF9 #x7FFA #x7FFD #x7FFE #x7FFF #x8002 #x8007 #x8008 #x8009 - #x800A #x800E #x800F #x8011 #x8013 #x801A #x801B #x801D #x801E #x801F - #x8021 #x8023 #x8024 #x802B #x802C #x802D #x802E #x802F #x8030 #x8032 - #x8034 #x8039 #x803A #x803C #x803E #x8040 #x8041 #x8044 #x8045 #x8047 - #x8048 #x8049 #x804E #x804F #x8050 #x8051 #x8053 #x8055 #x8056 #x8057 - #x8059 #x805B #x805C #x805D #x805E #x805F #x8060 #x8061 #x8062 #x8063 - #x8064 #x8065 #x8066 #x8067 #x8068 #x806B #x806C #x806D #x806E #x806F - #x8070 #x8072 #x8073 #x8074 #x8075 #x8076 #x8077 #x8078 #x8079 #x807A - #x807B #x807C #x807D #x807E #x8081 #x8082 #x8085 #x8088 #x808A #x808D - #x808E #x808F #x8090 #x8091 #x8092 #x8094 #x8095 #x8097 #x8099 #x809E - #x80A3 #x80A6 #x80A7 #x80A8 #x80AC #x80B0 #x80B3 #x80B5 #x80B6 #x80B8 - #x80B9 #x80BB #x80C5 #x80C7 #x80C8 #x80C9 #x80CA #x80CB #x80CF #x80D0 - #x80D1 #x80D2 #x80D3 #x80D4 #x80D5 #x80D8 #x80DF #x80E0 #x80E2 #x80E3 - #x80E6 #x80EE #x80F5 #x80F7 #x80F9 #x80FB #x80FE #x80FF #x8100 #x8101 - #x8103 #x8104 #x8105 #x8107 #x8108 #x810B #x810C #x8115 #x8117 #x8119 - #x811B #x811C #x811D #x811F #x8120 #x8121 #x8122 #x8123 #x8124 #x8125 - #x8126 #x8127 #x8128 #x8129 #x812A #x812B #x812D #x812E #x8130 #x8133 - #x8134 #x8135 #x8137 #x8139 #x813A #x813B #x813C #x813D #x813F #x8140 - #x8141 #x8142 #x8143 #x8144 #x8145 #x8147 #x8149 #x814D #x814E #x814F - #x8152 #x8156 #x8157 #x8158 #x815B #x815C #x815D #x815E #x815F #x8161 - #x8162 #x8163 #x8164 #x8166 #x8168 #x816A #x816B #x816C #x816F #x8172 - #x8173 #x8175 #x8176 #x8177 #x8178 #x8181 #x8183 #x8184 #x8185 #x8186 - #x8187 #x8189 #x818B #x818C #x818D #x818E #x8190 #x8192 #x8193 #x8194 - #x8195 #x8196 #x8197 #x8199 #x819A #x819E #x819F #x81A0 #x81A1 #x81A2 - #x81A4 #x81A5 #x81A7 #x81A9 #x81AB #x81AC #x81AD #x81AE #x81AF #x81B0 - #x81B1 #x81B2 #x81B4 #x81B5 #x81B6 #x81B7 #x81B8 #x81B9 #x81BC #x81BD - #x81BE #x81BF #x81C4 #x81C5 #x81C7 #x81C8 #x81C9 #x81CB #x81CD #x81CE - #x81CF #x81D0 #x81D1 #x81D2 #x81D3 #x81D4 #x81D5 #x81D6 #x81D7 #x81D8 - #x81D9 #x81DA #x81DB #x81DC #x81DD #x81DE #x81DF #x81E0 #x81E1 #x81E2 - #x81E4 #x81E5 #x81E6 #x81E8 #x81E9 #x81EB #x81EE #x81EF #x81F0 #x81F1 - #x81F2 #x81F5 #x81F6 #x81F7 #x81F8 #x81F9 #x81FA #x81FD #x81FF #x8203 - #x8207 #x8208 #x8209 #x820A #x820B #x820E #x820F #x8211 #x8213 #x8215 - #x8216 #x8217 #x8218 #x8219 #x821A #x821D #x8220 #x8224 #x8225 #x8226 - #x8227 #x8229 #x822E #x8232 #x823A #x823C #x823D #x823F #x8240 #x8241 - #x8242 #x8243 #x8245 #x8246 #x8248 #x824A #x824C #x824D #x824E #x8250 - #x8251 #x8252 #x8253 #x8254 #x8255 #x8256 #x8257 #x8259 #x825B #x825C - #x825D #x825E #x8260 #x8261 #x8262 #x8263 #x8264 #x8265 #x8266 #x8267 - #x8269 #x826A #x826B #x826C #x826D #x8271 #x8275 #x8276 #x8277 #x8278 - #x827B #x827C #x8280 #x8281 #x8283 #x8285 #x8286 #x8287 #x8289 #x828C - #x8290 #x8293 #x8294 #x8295 #x8296 #x829A #x829B #x829E #x82A0 #x82A2 - #x82A3 #x82A7 #x82B2 #x82B5 #x82B6 #x82BA #x82BB #x82BC #x82BF #x82C0 - #x82C2 #x82C3 #x82C5 #x82C6 #x82C9 #x82D0 #x82D6 #x82D9 #x82DA #x82DD - #x82E2 #x82E7 #x82E8 #x82E9 #x82EA #x82EC #x82ED #x82EE #x82F0 #x82F2 - #x82F3 #x82F5 #x82F6 #x82F8 #x82FA #x82FC #x82FD #x82FE #x82FF #x8300 - #x830A #x830B #x830D #x8310 #x8312 #x8313 #x8316 #x8318 #x8319 #x831D - #x831E #x831F #x8320 #x8321 #x8322 #x8323 #x8324 #x8325 #x8326 #x8329 - #x832A #x832E #x8330 #x8332 #x8337 #x833B #x833D #x833E #x833F #x8341 - #x8342 #x8344 #x8345 #x8348 #x834A #x834B #x834C #x834D #x834E #x8353 - #x8355 #x8356 #x8357 #x8358 #x8359 #x835D #x8362 #x8370 #x8371 #x8372 - #x8373 #x8374 #x8375 #x8376 #x8379 #x837A #x837E #x837F #x8380 #x8381 - #x8382 #x8383 #x8384 #x8387 #x8388 #x838A #x838B #x838C #x838D #x838F - #x8390 #x8391 #x8394 #x8395 #x8396 #x8397 #x8399 #x839A #x839D #x839F - #x83A1 #x83A2 #x83A3 #x83A4 #x83A5 #x83A6 #x83A7 #x83AC #x83AD #x83AE - #x83AF #x83B5 #x83BB #x83BE #x83BF #x83C2 #x83C3 #x83C4 #x83C6 #x83C8 - #x83C9 #x83CB #x83CD #x83CE #x83D0 #x83D1 #x83D2 #x83D3 #x83D5 #x83D7 - #x83D9 #x83DA #x83DB #x83DE #x83E2 #x83E3 #x83E4 #x83E6 #x83E7 #x83E8 - #x83EB #x83EC #x83ED #x83EE #x83EF #x83F3 #x83F4 #x83F5 #x83F6 #x83F7 - #x83FA #x83FB #x83FC #x83FE #x83FF #x8400 #x8402 #x8405 #x8407 #x8408 - #x8409 #x840A #x8410 #x8412 #x8413 #x8414 #x8415 #x8416 #x8417 #x8419 - #x841A #x841B #x841E #x841F #x8420 #x8421 #x8422 #x8423 #x8429 #x842A - #x842B #x842C #x842D #x842E #x842F #x8430 #x8432 #x8433 #x8434 #x8435 - #x8436 #x8437 #x8439 #x843A #x843B #x843E #x843F #x8440 #x8441 #x8442 - #x8443 #x8444 #x8445 #x8447 #x8448 #x8449 #x844A #x844B #x844C #x844D - #x844E #x844F #x8450 #x8452 #x8453 #x8454 #x8455 #x8456 #x8458 #x845D - #x845E #x845F #x8460 #x8462 #x8464 #x8465 #x8466 #x8467 #x8468 #x846A - #x846E #x846F #x8470 #x8472 #x8474 #x8477 #x8479 #x847B #x847C #x847D - #x847E #x847F #x8480 #x8481 #x8483 #x8484 #x8485 #x8486 #x848A #x848D - #x848F #x8490 #x8491 #x8492 #x8493 #x8494 #x8495 #x8496 #x8498 #x849A - #x849B #x849D #x849E #x849F #x84A0 #x84A2 #x84A3 #x84A4 #x84A5 #x84A6 - #x84A7 #x84A8 #x84A9 #x84AA #x84AB #x84AC #x84AD #x84AE #x84B0 #x84B1 - #x84B3 #x84B5 #x84B6 #x84B7 #x84BB #x84BC #x84BE #x84C0 #x84C2 #x84C3 - #x84C5 #x84C6 #x84C7 #x84C8 #x84CB #x84CC #x84CE #x84CF #x84D2 #x84D4 - #x84D5 #x84D7 #x84D8 #x84D9 #x84DA #x84DB #x84DC #x84DE #x84E1 #x84E2 - #x84E4 #x84E7 #x84E8 #x84E9 #x84EA #x84EB #x84ED #x84EE #x84EF #x84F1 - #x84F2 #x84F3 #x84F4 #x84F5 #x84F6 #x84F7 #x84F8 #x84F9 #x84FA #x84FB - #x84FD #x84FE #x8500 #x8501 #x8502 #x8503 #x8504 #x8505 #x8506 #x8507 - #x8508 #x8509 #x850A #x850B #x850D #x850E #x850F #x8510 #x8512 #x8514 - #x8515 #x8516 #x8518 #x8519 #x851B #x851C #x851D #x851E #x8520 #x8522 - #x8523 #x8524 #x8525 #x8526 #x8527 #x8528 #x8529 #x852A #x852D #x852E - #x852F #x8530 #x8531 #x8532 #x8533 #x8534 #x8535 #x8536 #x853E #x853F - #x8540 #x8541 #x8542 #x8544 #x8545 #x8546 #x8547 #x854B #x854C #x854D - #x854E #x854F #x8550 #x8551 #x8552 #x8553 #x8554 #x8555 #x8557 #x8558 - #x855A #x855B #x855C #x855D #x855F #x8560 #x8561 #x8562 #x8563 #x8565 - #x8566 #x8567 #x8569 #x856A #x856B #x856C #x856D #x856E #x856F #x8570 - #x8571 #x8573 #x8575 #x8576 #x8577 #x8578 #x857C #x857D #x857F #x8580 - #x8581 #x8582 #x8583 #x8586 #x8588 #x8589 #x858A #x858B #x858C #x858D - #x858E #x8590 #x8591 #x8592 #x8593 #x8594 #x8595 #x8596 #x8597 #x8598 - #x8599 #x859A #x859D #x859E #x859F #x85A0 #x85A1 #x85A2 #x85A3 #x85A5 - #x85A6 #x85A7 #x85A9 #x85AB #x85AC #x85AD #x85B1 #x85B2 #x85B3 #x85B4 - #x85B5 #x85B6 #x85B8 #x85BA #x85BB #x85BC #x85BD #x85BE #x85BF #x85C0 - #x85C2 #x85C3 #x85C4 #x85C5 #x85C6 #x85C7 #x85C8 #x85CA #x85CB #x85CC - #x85CD #x85CE #x85D1 #x85D2 #x85D4 #x85D6 #x85D7 #x85D8 #x85D9 #x85DA - #x85DB #x85DD #x85DE #x85DF #x85E0 #x85E1 #x85E2 #x85E3 #x85E5 #x85E6 - #x85E7 #x85E8 #x85EA #x85EB #x85EC #x85ED #x85EE #x85EF #x85F0 #x85F1 - #x85F2 #x85F3 #x85F4 #x85F5 #x85F6 #x85F7 #x85F8 #x85F9 #x85FA #x85FC - #x85FD #x85FE #x8600 #x8601 #x8602 #x8603 #x8604 #x8606 #x8607 #x8608 - #x8609 #x860A #x860B #x860C #x860D #x860E #x860F #x8610 #x8612 #x8613 - #x8614 #x8615 #x8617 #x8618 #x8619 #x861A #x861B #x861C #x861D #x861E - #x861F #x8620 #x8621 #x8622 #x8623 #x8624 #x8625 #x8626 #x8628 #x862A - #x862B #x862C #x862D #x862E #x862F #x8630 #x8631 #x8632 #x8633 #x8634 - #x8635 #x8636 #x8637 #x8639 #x863A #x863B #x863D #x863E #x863F #x8640 - #x8641 #x8642 #x8643 #x8644 #x8645 #x8646 #x8647 #x8648 #x8649 #x864A - #x864B #x864C #x8652 #x8653 #x8655 #x8656 #x8657 #x8658 #x8659 #x865B - #x865C #x865D #x865F #x8660 #x8661 #x8663 #x8664 #x8665 #x8666 #x8667 - #x8668 #x8669 #x866A #x866D #x866F #x8670 #x8672 #x8673 #x8674 #x8675 - #x8676 #x8677 #x8678 #x8683 #x8684 #x8685 #x8686 #x8687 #x8688 #x8689 - #x868E #x868F #x8690 #x8691 #x8692 #x8694 #x8696 #x8697 #x8698 #x8699 - #x869A #x869B #x869E #x869F #x86A0 #x86A1 #x86A2 #x86A5 #x86A6 #x86AB - #x86AD #x86AE #x86B2 #x86B3 #x86B7 #x86B8 #x86B9 #x86BB #x86BC #x86BD - #x86BE #x86BF #x86C1 #x86C2 #x86C3 #x86C5 #x86C8 #x86CC #x86CD #x86D2 - #x86D3 #x86D5 #x86D6 #x86D7 #x86DA #x86DC #x86DD #x86E0 #x86E1 #x86E2 - #x86E3 #x86E5 #x86E6 #x86E7 #x86E8 #x86EA #x86EB #x86EC #x86EF #x86F5 - #x86F6 #x86F7 #x86FA #x86FB #x86FC #x86FD #x86FF #x8701 #x8704 #x8705 - #x8706 #x870B #x870C #x870E #x870F #x8710 #x8711 #x8714 #x8716 #x8719 - #x871B #x871D #x871F #x8720 #x8724 #x8726 #x8727 #x8728 #x872A #x872B - #x872C #x872D #x872F #x8730 #x8732 #x8733 #x8735 #x8736 #x8738 #x8739 - #x873A #x873C #x873D #x8740 #x8741 #x8742 #x8743 #x8744 #x8745 #x8746 - #x874A #x874B #x874D #x874F #x8750 #x8751 #x8752 #x8754 #x8755 #x8756 - #x8758 #x875A #x875B #x875C #x875D #x875E #x875F #x8761 #x8762 #x8766 - #x8767 #x8768 #x8769 #x876A #x876B #x876C #x876D #x876F #x8771 #x8772 - #x8773 #x8775 #x8777 #x8778 #x8779 #x877A #x877F #x8780 #x8781 #x8784 - #x8786 #x8787 #x8789 #x878A #x878C #x878E #x878F #x8790 #x8791 #x8792 - #x8794 #x8795 #x8796 #x8798 #x8799 #x879A #x879B #x879C #x879D #x879E - #x87A0 #x87A1 #x87A2 #x87A3 #x87A4 #x87A5 #x87A6 #x87A7 #x87A9 #x87AA - #x87AE #x87B0 #x87B1 #x87B2 #x87B4 #x87B6 #x87B7 #x87B8 #x87B9 #x87BB - #x87BC #x87BE #x87BF #x87C1 #x87C2 #x87C3 #x87C4 #x87C5 #x87C7 #x87C8 - #x87C9 #x87CC #x87CD #x87CE #x87CF #x87D0 #x87D4 #x87D5 #x87D6 #x87D7 - #x87D8 #x87D9 #x87DA #x87DC #x87DD #x87DE #x87DF #x87E1 #x87E2 #x87E3 - #x87E4 #x87E6 #x87E7 #x87E8 #x87E9 #x87EB #x87EC #x87ED #x87EF #x87F0 - #x87F1 #x87F2 #x87F3 #x87F4 #x87F5 #x87F6 #x87F7 #x87F8 #x87FA #x87FB - #x87FC #x87FD #x87FF #x8800 #x8801 #x8802 #x8804 #x8805 #x8806 #x8807 - #x8808 #x8809 #x880B #x880C #x880D #x880E #x880F #x8810 #x8811 #x8812 - #x8814 #x8817 #x8818 #x8819 #x881A #x881C #x881D #x881E #x881F #x8820 - #x8823 #x8824 #x8825 #x8826 #x8827 #x8828 #x8829 #x882A #x882B #x882C - #x882D #x882E #x882F #x8830 #x8831 #x8833 #x8834 #x8835 #x8836 #x8837 - #x8838 #x883A #x883B #x883D #x883E #x883F #x8841 #x8842 #x8843 #x8846 - #x8847 #x8848 #x8849 #x884A #x884B #x884E #x884F #x8850 #x8851 #x8852 - #x8853 #x8855 #x8856 #x8858 #x885A #x885B #x885C #x885D #x885E #x885F - #x8860 #x8866 #x8867 #x886A #x886D #x886F #x8871 #x8873 #x8874 #x8875 - #x8876 #x8878 #x8879 #x887A #x887B #x887C #x8880 #x8883 #x8886 #x8887 - #x8889 #x888A #x888C #x888E #x888F #x8890 #x8891 #x8893 #x8894 #x8895 - #x8897 #x8898 #x8899 #x889A #x889B #x889D #x889E #x889F #x88A0 #x88A1 - #x88A3 #x88A5 #x88A6 #x88A7 #x88A8 #x88A9 #x88AA #x88AC #x88AE #x88AF - #x88B0 #x88B2 #x88B3 #x88B4 #x88B5 #x88B6 #x88B8 #x88B9 #x88BA #x88BB - #x88BD #x88BE #x88BF #x88C0 #x88C3 #x88C4 #x88C7 #x88C8 #x88CA #x88CB - #x88CC #x88CD #x88CF #x88D0 #x88D1 #x88D3 #x88D6 #x88D7 #x88DA #x88DB - #x88DC #x88DD #x88DE #x88E0 #x88E1 #x88E6 #x88E7 #x88E9 #x88EA #x88EB - #x88EC #x88ED #x88EE #x88EF #x88F2 #x88F5 #x88F6 #x88F7 #x88FA #x88FB - #x88FD #x88FF #x8900 #x8901 #x8903 #x8904 #x8905 #x8906 #x8907 #x8908 - #x8909 #x890B #x890C #x890D #x890E #x890F #x8911 #x8914 #x8915 #x8916 - #x8917 #x8918 #x891C #x891D #x891E #x891F #x8920 #x8922 #x8923 #x8924 - #x8926 #x8927 #x8928 #x8929 #x892C #x892D #x892E #x892F #x8931 #x8932 - #x8933 #x8935 #x8937 #x8938 #x8939 #x893A #x893B #x893C #x893D #x893E - #x893F #x8940 #x8942 #x8943 #x8945 #x8946 #x8947 #x8948 #x8949 #x894A - #x894B #x894C #x894D #x894E #x894F #x8950 #x8951 #x8952 #x8953 #x8954 - #x8955 #x8956 #x8957 #x8958 #x8959 #x895A #x895B #x895C #x895D #x8960 - #x8961 #x8962 #x8963 #x8964 #x8965 #x8967 #x8968 #x8969 #x896A #x896B - #x896C #x896D #x896E #x896F #x8970 #x8971 #x8972 #x8973 #x8974 #x8975 - #x8976 #x8977 #x8978 #x8979 #x897A #x897C #x897D #x897E #x8980 #x8982 - #x8984 #x8985 #x8987 #x8988 #x8989 #x898A #x898B #x898C #x898D #x898E - #x898F #x8990 #x8991 #x8992 #x8993 #x8994 #x8995 #x8996 #x8997 #x8998 - #x8999 #x899A #x899B #x899C #x899D #x899E #x899F #x89A0 #x89A1 #x89A2 - #x89A3 #x89A4 #x89A5 #x89A6 #x89A7 #x89A8 #x89A9 #x89AA #x89AB #x89AC - #x89AD #x89AE #x89AF #x89B0 #x89B1 #x89B2 #x89B3 #x89B4 #x89B5 #x89B6 - #x89B7 #x89B8 #x89B9 #x89BA #x89BB #x89BC #x89BD #x89BE #x89BF #x89C0 - #x89C3 #x89CD #x89D3 #x89D4 #x89D5 #x89D7 #x89D8 #x89D9 #x89DB #x89DD - #x89DF #x89E0 #x89E1 #x89E2 #x89E4 #x89E7 #x89E8 #x89E9 #x89EA #x89EC - #x89ED #x89EE #x89F0 #x89F1 #x89F2 #x89F4 #x89F5 #x89F6 #x89F7 #x89F8 - #x89F9 #x89FA #x89FB #x89FC #x89FD #x89FE #x89FF #x8A01 #x8A02 #x8A03 - #x8A04 #x8A05 #x8A06 #x8A08 #x8A09 #x8A0A #x8A0B #x8A0C #x8A0D #x8A0E - #x8A0F #x8A10 #x8A11 #x8A12 #x8A13 #x8A14 #x8A15 #x8A16 #x8A17 #x8A18 - #x8A19 #x8A1A #x8A1B #x8A1C #x8A1D #x8A1E #x8A1F #x8A20 #x8A21 #x8A22 - #x8A23 #x8A24 #x8A25 #x8A26 #x8A27 #x8A28 #x8A29 #x8A2A #x8A2B #x8A2C - #x8A2D #x8A2E #x8A2F #x8A30 #x8A31 #x8A32 #x8A33 #x8A34 #x8A35 #x8A36 - #x8A37 #x8A38 #x8A39 #x8A3A #x8A3B #x8A3C #x8A3D #x8A3F #x8A40 #x8A41 - #x8A42 #x8A43 #x8A44 #x8A45 #x8A46 #x8A47 #x8A49 #x8A4A #x8A4B #x8A4C - #x8A4D #x8A4E #x8A4F #x8A50 #x8A51 #x8A52 #x8A53 #x8A54 #x8A55 #x8A56 - #x8A57 #x8A58 #x8A59 #x8A5A #x8A5B #x8A5C #x8A5D #x8A5E #x8A5F #x8A60 - #x8A61 #x8A62 #x8A63 #x8A64 #x8A65 #x8A66 #x8A67 #x8A68 #x8A69 #x8A6A - #x8A6B #x8A6C #x8A6D #x8A6E #x8A6F #x8A70 #x8A71 #x8A72 #x8A73 #x8A74 - #x8A75 #x8A76 #x8A77 #x8A78 #x8A7A #x8A7B #x8A7C #x8A7D #x8A7E #x8A7F - #x8A80 #x8A81 #x8A82 #x8A83 #x8A84 #x8A85 #x8A86 #x8A87 #x8A88 #x8A8B - #x8A8C #x8A8D #x8A8E #x8A8F #x8A90 #x8A91 #x8A92 #x8A94 #x8A95 #x8A96 - #x8A97 #x8A98 #x8A99 #x8A9A #x8A9B #x8A9C #x8A9D #x8A9E #x8A9F #x8AA0 - #x8AA1 #x8AA2 #x8AA3 #x8AA4 #x8AA5 #x8AA6 #x8AA7 #x8AA8 #x8AA9 #x8AAA - #x8AAB #x8AAC #x8AAD #x8AAE #x8AAF #x8AB0 #x8AB1 #x8AB2 #x8AB3 #x8AB4 - #x8AB5 #x8AB6 #x8AB7 #x8AB8 #x8AB9 #x8ABA #x8ABB #x8ABC #x8ABD #x8ABE - #x8ABF #x8AC0 #x8AC1 #x8AC2 #x8AC3 #x8AC4 #x8AC5 #x8AC6 #x8AC7 #x8AC8 - #x8AC9 #x8ACA #x8ACB #x8ACC #x8ACD #x8ACE #x8ACF #x8AD0 #x8AD1 #x8AD2 - #x8AD3 #x8AD4 #x8AD5 #x8AD6 #x8AD7 #x8AD8 #x8AD9 #x8ADA #x8ADB #x8ADC - #x8ADD #x8ADE #x8ADF #x8AE0 #x8AE1 #x8AE2 #x8AE3 #x8AE4 #x8AE5 #x8AE6 - #x8AE7 #x8AE8 #x8AE9 #x8AEA #x8AEB #x8AEC #x8AED #x8AEE #x8AEF #x8AF0 - #x8AF1 #x8AF2 #x8AF3 #x8AF4 #x8AF5 #x8AF6 #x8AF7 #x8AF8 #x8AF9 #x8AFA - #x8AFB #x8AFC #x8AFD #x8AFE #x8AFF #x8B00 #x8B01 #x8B02 #x8B03 #x8B04 - #x8B05 #x8B06 #x8B08 #x8B09 #x8B0A #x8B0B #x8B0C #x8B0D #x8B0E #x8B0F - #x8B10 #x8B11 #x8B12 #x8B13 #x8B14 #x8B15 #x8B16 #x8B17 #x8B18 #x8B19 - #x8B1A #x8B1B #x8B1C #x8B1D #x8B1E #x8B1F #x8B20 #x8B21 #x8B22 #x8B23 - #x8B24 #x8B25 #x8B27 #x8B28 #x8B29 #x8B2A #x8B2B #x8B2C #x8B2D #x8B2E - #x8B2F #x8B30 #x8B31 #x8B32 #x8B33 #x8B34 #x8B35 #x8B36 #x8B37 #x8B38 - #x8B39 #x8B3A #x8B3B #x8B3C #x8B3D #x8B3E #x8B3F #x8B40 #x8B41 #x8B42 - #x8B43 #x8B44 #x8B45 #x8B46 #x8B47 #x8B48 #x8B49 #x8B4A #x8B4B #x8B4C - #x8B4D #x8B4E #x8B4F #x8B50 #x8B51 #x8B52 #x8B53 #x8B54 #x8B55 #x8B56 - #x8B57 #x8B58 #x8B59 #x8B5A #x8B5B #x8B5C #x8B5D #x8B5E #x8B5F #x8B60 - #x8B61 #x8B62 #x8B63 #x8B64 #x8B65 #x8B67 #x8B68 #x8B69 #x8B6A #x8B6B - #x8B6D #x8B6E #x8B6F #x8B70 #x8B71 #x8B72 #x8B73 #x8B74 #x8B75 #x8B76 - #x8B77 #x8B78 #x8B79 #x8B7A #x8B7B #x8B7C #x8B7D #x8B7E #x8B7F #x8B80 - #x8B81 #x8B82 #x8B83 #x8B84 #x8B85 #x8B86 #x8B87 #x8B88 #x8B89 #x8B8A - #x8B8B #x8B8C #x8B8D #x8B8E #x8B8F #x8B90 #x8B91 #x8B92 #x8B93 #x8B94 - #x8B95 #x8B96 #x8B97 #x8B98 #x8B99 #x8B9A #x8B9B #x8B9C #x8B9D #x8B9E - #x8B9F #x8BAC #x8BB1 #x8BBB #x8BC7 #x8BD0 #x8BEA #x8C09 #x8C1E #x8C38 - #x8C39 #x8C3A #x8C3B #x8C3C #x8C3D #x8C3E #x8C3F #x8C40 #x8C42 #x8C43 - #x8C44 #x8C45 #x8C48 #x8C4A #x8C4B #x8C4D #x8C4E #x8C4F #x8C50 #x8C51 - #x8C52 #x8C53 #x8C54 #x8C56 #x8C57 #x8C58 #x8C59 #x8C5B #x8C5C #x8C5D - #x8C5E #x8C5F #x8C60 #x8C63 #x8C64 #x8C65 #x8C66 #x8C67 #x8C68 #x8C69 - #x8C6C #x8C6D #x8C6E #x8C6F #x8C70 #x8C71 #x8C72 #x8C74 #x8C75 #x8C76 - #x8C77 #x8C7B #x8C7C #x8C7D #x8C7E #x8C7F #x8C80 #x8C81 #x8C83 #x8C84 - #x8C86 #x8C87 #x8C88 #x8C8B #x8C8D #x8C8E #x8C8F #x8C90 #x8C91 #x8C92 - #x8C93 #x8C95 #x8C96 #x8C97 #x8C99 #x8C9A #x8C9B #x8C9C #x8C9D #x8C9E - #x8C9F #x8CA0 #x8CA1 #x8CA2 #x8CA3 #x8CA4 #x8CA5 #x8CA6 #x8CA7 #x8CA8 - #x8CA9 #x8CAA #x8CAB #x8CAC #x8CAD #x8CAE #x8CAF #x8CB0 #x8CB1 #x8CB2 - #x8CB3 #x8CB4 #x8CB5 #x8CB6 #x8CB7 #x8CB8 #x8CB9 #x8CBA #x8CBB #x8CBC - #x8CBD #x8CBE #x8CBF #x8CC0 #x8CC1 #x8CC2 #x8CC3 #x8CC4 #x8CC5 #x8CC6 - #x8CC7 #x8CC8 #x8CC9 #x8CCA #x8CCB #x8CCC #x8CCD #x8CCE #x8CCF #x8CD0 - #x8CD1 #x8CD2 #x8CD3 #x8CD4 #x8CD5 #x8CD6 #x8CD7 #x8CD8 #x8CD9 #x8CDA - #x8CDB #x8CDC #x8CDD #x8CDE #x8CDF #x8CE0 #x8CE1 #x8CE2 #x8CE3 #x8CE4 - #x8CE5 #x8CE6 #x8CE7 #x8CE8 #x8CE9 #x8CEA #x8CEB #x8CEC #x8CED #x8CEE - #x8CEF #x8CF0 #x8CF1 #x8CF2 #x8CF3 #x8CF4 #x8CF5 #x8CF6 #x8CF7 #x8CF8 - #x8CF9 #x8CFA #x8CFB #x8CFC #x8CFD #x8CFE #x8CFF #x8D00 #x8D01 #x8D02 - #x8D03 #x8D04 #x8D05 #x8D06 #x8D07 #x8D08 #x8D09 #x8D0A #x8D0B #x8D0C - #x8D0D #x8D0E #x8D0F #x8D10 #x8D11 #x8D12 #x8D13 #x8D14 #x8D15 #x8D16 - #x8D17 #x8D18 #x8D19 #x8D1A #x8D1B #x8D1C #x8D20 #x8D51 #x8D52 #x8D57 - #x8D5F #x8D65 #x8D68 #x8D69 #x8D6A #x8D6C #x8D6E #x8D6F #x8D71 #x8D72 - #x8D78 #x8D79 #x8D7A #x8D7B #x8D7C #x8D7D #x8D7E #x8D7F #x8D80 #x8D82 - #x8D83 #x8D86 #x8D87 #x8D88 #x8D89 #x8D8C #x8D8D #x8D8E #x8D8F #x8D90 - #x8D92 #x8D93 #x8D95 #x8D96 #x8D97 #x8D98 #x8D99 #x8D9A #x8D9B #x8D9C - #x8D9D #x8D9E #x8DA0 #x8DA1 #x8DA2 #x8DA4 #x8DA5 #x8DA6 #x8DA7 #x8DA8 - #x8DA9 #x8DAA #x8DAB #x8DAC #x8DAD #x8DAE #x8DAF #x8DB0 #x8DB2 #x8DB6 - #x8DB7 #x8DB9 #x8DBB #x8DBD #x8DC0 #x8DC1 #x8DC2 #x8DC5 #x8DC7 #x8DC8 - #x8DC9 #x8DCA #x8DCD #x8DD0 #x8DD2 #x8DD3 #x8DD4 #x8DD5 #x8DD8 #x8DD9 - #x8DDC #x8DE0 #x8DE1 #x8DE2 #x8DE5 #x8DE6 #x8DE7 #x8DE9 #x8DED #x8DEE - #x8DF0 #x8DF1 #x8DF2 #x8DF4 #x8DF6 #x8DFC #x8DFE #x8DFF #x8E00 #x8E01 - #x8E02 #x8E03 #x8E04 #x8E06 #x8E07 #x8E08 #x8E0B #x8E0D #x8E0E #x8E10 - #x8E11 #x8E12 #x8E13 #x8E15 #x8E16 #x8E17 #x8E18 #x8E19 #x8E1A #x8E1B - #x8E1C #x8E20 #x8E21 #x8E24 #x8E25 #x8E26 #x8E27 #x8E28 #x8E2B #x8E2D - #x8E30 #x8E32 #x8E33 #x8E34 #x8E36 #x8E37 #x8E38 #x8E3B #x8E3C #x8E3E - #x8E3F #x8E43 #x8E45 #x8E46 #x8E4C #x8E4D #x8E4E #x8E4F #x8E50 #x8E53 - #x8E54 #x8E55 #x8E56 #x8E57 #x8E58 #x8E5A #x8E5B #x8E5C #x8E5D #x8E5E - #x8E5F #x8E60 #x8E61 #x8E62 #x8E63 #x8E64 #x8E65 #x8E67 #x8E68 #x8E6A - #x8E6B #x8E6E #x8E71 #x8E73 #x8E75 #x8E77 #x8E78 #x8E79 #x8E7A #x8E7B - #x8E7D #x8E7E #x8E80 #x8E82 #x8E83 #x8E84 #x8E86 #x8E88 #x8E89 #x8E8A - #x8E8B #x8E8C #x8E8D #x8E8E #x8E91 #x8E92 #x8E93 #x8E95 #x8E96 #x8E97 - #x8E98 #x8E99 #x8E9A #x8E9B #x8E9D #x8E9F #x8EA0 #x8EA1 #x8EA2 #x8EA3 - #x8EA4 #x8EA5 #x8EA6 #x8EA7 #x8EA8 #x8EA9 #x8EAA #x8EAD #x8EAE #x8EB0 - #x8EB1 #x8EB3 #x8EB4 #x8EB5 #x8EB6 #x8EB7 #x8EB8 #x8EB9 #x8EBB #x8EBC - #x8EBD #x8EBE #x8EBF #x8EC0 #x8EC1 #x8EC2 #x8EC3 #x8EC4 #x8EC5 #x8EC6 - #x8EC7 #x8EC8 #x8EC9 #x8ECA #x8ECB #x8ECC #x8ECD #x8ECF #x8ED0 #x8ED1 - #x8ED2 #x8ED3 #x8ED4 #x8ED5 #x8ED6 #x8ED7 #x8ED8 #x8ED9 #x8EDA #x8EDB - #x8EDC #x8EDD #x8EDE #x8EDF #x8EE0 #x8EE1 #x8EE2 #x8EE3 #x8EE4 #x8EE5 - #x8EE6 #x8EE7 #x8EE8 #x8EE9 #x8EEA #x8EEB #x8EEC #x8EED #x8EEE #x8EEF - #x8EF0 #x8EF1 #x8EF2 #x8EF3 #x8EF4 #x8EF5 #x8EF6 #x8EF7 #x8EF8 #x8EF9 - #x8EFA #x8EFB #x8EFC #x8EFD #x8EFE #x8EFF #x8F00 #x8F01 #x8F02 #x8F03 - #x8F04 #x8F05 #x8F06 #x8F07 #x8F08 #x8F09 #x8F0A #x8F0B #x8F0C #x8F0D - #x8F0E #x8F0F #x8F10 #x8F11 #x8F12 #x8F13 #x8F14 #x8F15 #x8F16 #x8F17 - #x8F18 #x8F19 #x8F1A #x8F1B #x8F1C #x8F1D #x8F1E #x8F1F #x8F20 #x8F21 - #x8F22 #x8F23 #x8F24 #x8F25 #x8F26 #x8F27 #x8F28 #x8F29 #x8F2A #x8F2B - #x8F2C #x8F2D #x8F2E #x8F2F #x8F30 #x8F31 #x8F32 #x8F33 #x8F34 #x8F35 - #x8F36 #x8F37 #x8F38 #x8F39 #x8F3A #x8F3B #x8F3C #x8F3D #x8F3E #x8F3F - #x8F40 #x8F41 #x8F42 #x8F43 #x8F44 #x8F45 #x8F46 #x8F47 #x8F48 #x8F49 - #x8F4A #x8F4B #x8F4C #x8F4D #x8F4E #x8F4F #x8F50 #x8F51 #x8F52 #x8F53 - #x8F54 #x8F55 #x8F56 #x8F57 #x8F58 #x8F59 #x8F5A #x8F5B #x8F5C #x8F5D - #x8F5E #x8F5F #x8F60 #x8F61 #x8F62 #x8F63 #x8F64 #x8F65 #x8F6A #x8F80 - #x8F8C #x8F92 #x8F9D #x8FA0 #x8FA1 #x8FA2 #x8FA4 #x8FA5 #x8FA6 #x8FA7 - #x8FAA #x8FAC #x8FAD #x8FAE #x8FAF #x8FB2 #x8FB3 #x8FB4 #x8FB5 #x8FB7 - #x8FB8 #x8FBA #x8FBB #x8FBC #x8FBF #x8FC0 #x8FC3 #x8FC6 #x8FC9 #x8FCA - #x8FCB #x8FCC #x8FCD #x8FCF #x8FD2 #x8FD6 #x8FD7 #x8FDA #x8FE0 #x8FE1 - #x8FE3 #x8FE7 #x8FEC #x8FEF #x8FF1 #x8FF2 #x8FF4 #x8FF5 #x8FF6 #x8FFA - #x8FFB #x8FFC #x8FFE #x8FFF #x9007 #x9008 #x900C #x900E #x9013 #x9015 - #x9018 #x9019 #x901C #x9023 #x9024 #x9025 #x9027 #x9028 #x9029 #x902A - #x902B #x902C #x9030 #x9031 #x9032 #x9033 #x9034 #x9037 #x9039 #x903A - #x903D #x903F #x9040 #x9043 #x9045 #x9046 #x9048 #x9049 #x904A #x904B - #x904C #x904E #x9054 #x9055 #x9056 #x9059 #x905A #x905C #x905D #x905E - #x905F #x9060 #x9061 #x9064 #x9066 #x9067 #x9069 #x906A #x906B #x906C - #x906F #x9070 #x9071 #x9072 #x9073 #x9076 #x9077 #x9078 #x9079 #x907A - #x907B #x907C #x907E #x9081 #x9084 #x9085 #x9086 #x9087 #x9089 #x908A - #x908C #x908D #x908E #x908F #x9090 #x9092 #x9094 #x9096 #x9098 #x909A - #x909C #x909E #x909F #x90A0 #x90A4 #x90A5 #x90A7 #x90A8 #x90A9 #x90AB - #x90AD #x90B2 #x90B7 #x90BC #x90BD #x90BF #x90C0 #x90C2 #x90C3 #x90C6 - #x90C8 #x90C9 #x90CB #x90CC #x90CD #x90D2 #x90D4 #x90D5 #x90D6 #x90D8 - #x90D9 #x90DA #x90DE #x90DF #x90E0 #x90E3 #x90E4 #x90E5 #x90E9 #x90EA - #x90EC #x90EE #x90F0 #x90F1 #x90F2 #x90F3 #x90F5 #x90F6 #x90F7 #x90F9 - #x90FA #x90FB #x90FC #x90FF #x9100 #x9101 #x9103 #x9105 #x9106 #x9107 - #x9108 #x9109 #x910A #x910B #x910C #x910D #x910E #x910F #x9110 #x9111 - #x9112 #x9113 #x9114 #x9115 #x9116 #x9117 #x9118 #x911A #x911B #x911C - #x911D #x911F #x9120 #x9121 #x9124 #x9125 #x9126 #x9127 #x9128 #x9129 - #x912A #x912B #x912C #x912D #x912E #x9130 #x9132 #x9133 #x9134 #x9135 - #x9136 #x9137 #x9138 #x913A #x913B #x913C #x913D #x913E #x913F #x9140 - #x9141 #x9142 #x9144 #x9145 #x9147 #x9148 #x9151 #x9153 #x9154 #x9155 - #x9156 #x9158 #x9159 #x915B #x915C #x915F #x9160 #x9166 #x9167 #x9168 - #x916B #x916D #x9173 #x917A #x917B #x917C #x9180 #x9181 #x9182 #x9183 - #x9184 #x9186 #x9188 #x918A #x918E #x918F #x9193 #x9194 #x9195 #x9196 - #x9197 #x9198 #x9199 #x919C #x919D #x919E #x919F #x91A0 #x91A1 #x91A4 - #x91A5 #x91A6 #x91A7 #x91A8 #x91A9 #x91AB #x91AC #x91B0 #x91B1 #x91B2 - #x91B3 #x91B6 #x91B7 #x91B8 #x91B9 #x91BB #x91BC #x91BD #x91BE #x91BF - #x91C0 #x91C1 #x91C2 #x91C3 #x91C4 #x91C5 #x91C6 #x91C8 #x91CB #x91D0 - #x91D2 #x91D3 #x91D4 #x91D5 #x91D6 #x91D7 #x91D8 #x91D9 #x91DA #x91DB - #x91DD #x91DE #x91DF #x91E0 #x91E1 #x91E2 #x91E3 #x91E4 #x91E5 #x91E6 - #x91E7 #x91E8 #x91E9 #x91EA #x91EB #x91EC #x91ED #x91EE #x91EF #x91F0 - #x91F1 #x91F2 #x91F3 #x91F4 #x91F5 #x91F6 #x91F7 #x91F8 #x91F9 #x91FA - #x91FB #x91FC #x91FD #x91FE #x91FF #x9200 #x9201 #x9202 #x9203 #x9204 - #x9205 #x9206 #x9207 #x9208 #x9209 #x920A #x920B #x920C #x920D #x920E - #x920F #x9210 #x9211 #x9212 #x9213 #x9214 #x9215 #x9216 #x9217 #x9218 - #x9219 #x921A #x921B #x921C #x921D #x921E #x921F #x9220 #x9221 #x9222 - #x9223 #x9224 #x9225 #x9226 #x9227 #x9228 #x9229 #x922A #x922B #x922C - #x922D #x922E #x922F #x9230 #x9231 #x9232 #x9233 #x9234 #x9235 #x9236 - #x9237 #x9238 #x9239 #x923A #x923B #x923C #x923D #x923E #x923F #x9240 - #x9241 #x9242 #x9243 #x9244 #x9245 #x9246 #x9247 #x9248 #x9249 #x924A - #x924B #x924C #x924D #x924E #x924F #x9250 #x9251 #x9252 #x9253 #x9254 - #x9255 #x9256 #x9257 #x9258 #x9259 #x925A #x925B #x925C #x925D #x925E - #x925F #x9260 #x9261 #x9262 #x9263 #x9264 #x9265 #x9266 #x9267 #x9268 - #x9269 #x926A #x926B #x926C #x926D #x926E #x926F #x9270 #x9271 #x9272 - #x9273 #x9275 #x9276 #x9277 #x9278 #x9279 #x927A #x927B #x927C #x927D - #x927E #x927F #x9280 #x9281 #x9282 #x9283 #x9284 #x9285 #x9286 #x9287 - #x9288 #x9289 #x928A #x928B #x928C #x928D #x928F #x9290 #x9291 #x9292 - #x9293 #x9294 #x9295 #x9296 #x9297 #x9298 #x9299 #x929A #x929B #x929C - #x929D #x929E #x929F #x92A0 #x92A1 #x92A2 #x92A3 #x92A4 #x92A5 #x92A6 - #x92A7 #x92A8 #x92A9 #x92AA #x92AB #x92AC #x92AD #x92AF #x92B0 #x92B1 - #x92B2 #x92B3 #x92B4 #x92B5 #x92B6 #x92B7 #x92B8 #x92B9 #x92BA #x92BB - #x92BC #x92BD #x92BE #x92BF #x92C0 #x92C1 #x92C2 #x92C3 #x92C4 #x92C5 - #x92C6 #x92C7 #x92C9 #x92CA #x92CB #x92CC #x92CD #x92CE #x92CF #x92D0 - #x92D1 #x92D2 #x92D3 #x92D4 #x92D5 #x92D6 #x92D7 #x92D8 #x92D9 #x92DA - #x92DB #x92DC #x92DD #x92DE #x92DF #x92E0 #x92E1 #x92E2 #x92E3 #x92E4 - #x92E5 #x92E6 #x92E7 #x92E8 #x92E9 #x92EA #x92EB #x92EC #x92ED #x92EE - #x92EF #x92F0 #x92F1 #x92F2 #x92F3 #x92F4 #x92F5 #x92F6 #x92F7 #x92F8 - #x92F9 #x92FA #x92FB #x92FC #x92FD #x92FE #x92FF #x9300 #x9301 #x9302 - #x9303 #x9304 #x9305 #x9306 #x9307 #x9308 #x9309 #x930A #x930B #x930C - #x930D #x930E #x930F #x9310 #x9311 #x9312 #x9313 #x9314 #x9315 #x9316 - #x9317 #x9318 #x9319 #x931A #x931B #x931C #x931D #x931E #x931F #x9320 - #x9321 #x9322 #x9323 #x9324 #x9325 #x9326 #x9327 #x9328 #x9329 #x932A - #x932B #x932C #x932D #x932E #x932F #x9330 #x9331 #x9332 #x9333 #x9334 - #x9335 #x9336 #x9337 #x9338 #x9339 #x933A #x933B #x933C #x933D #x933F - #x9340 #x9341 #x9342 #x9343 #x9344 #x9345 #x9346 #x9347 #x9348 #x9349 - #x934A #x934B #x934C #x934D #x934E #x934F #x9350 #x9351 #x9352 #x9353 - #x9354 #x9355 #x9356 #x9357 #x9358 #x9359 #x935A #x935B #x935C #x935D - #x935E #x935F #x9360 #x9361 #x9362 #x9363 #x9364 #x9365 #x9366 #x9367 - #x9368 #x9369 #x936B #x936C #x936D #x936E #x936F #x9370 #x9371 #x9372 - #x9373 #x9374 #x9375 #x9376 #x9377 #x9378 #x9379 #x937A #x937B #x937C - #x937D #x937E #x937F #x9380 #x9381 #x9382 #x9383 #x9384 #x9385 #x9386 - #x9387 #x9388 #x9389 #x938A #x938B #x938C #x938D #x938E #x9390 #x9391 - #x9392 #x9393 #x9394 #x9395 #x9396 #x9397 #x9398 #x9399 #x939A #x939B - #x939C #x939D #x939E #x939F #x93A0 #x93A1 #x93A2 #x93A3 #x93A4 #x93A5 - #x93A6 #x93A7 #x93A8 #x93A9 #x93AA #x93AB #x93AC #x93AD #x93AE #x93AF - #x93B0 #x93B1 #x93B2 #x93B3 #x93B4 #x93B5 #x93B6 #x93B7 #x93B8 #x93B9 - #x93BA #x93BB #x93BC #x93BD #x93BE #x93BF #x93C0 #x93C1 #x93C2 #x93C3 - #x93C4 #x93C5 #x93C6 #x93C7 #x93C8 #x93C9 #x93CB #x93CC #x93CD #x93CE - #x93CF #x93D0 #x93D1 #x93D2 #x93D3 #x93D4 #x93D5 #x93D7 #x93D8 #x93D9 - #x93DA #x93DB #x93DC #x93DD #x93DE #x93DF #x93E0 #x93E1 #x93E2 #x93E3 - #x93E4 #x93E5 #x93E6 #x93E7 #x93E8 #x93E9 #x93EA #x93EB #x93EC #x93ED - #x93EE #x93EF #x93F0 #x93F1 #x93F2 #x93F3 #x93F4 #x93F5 #x93F6 #x93F7 - #x93F8 #x93F9 #x93FA #x93FB #x93FC #x93FD #x93FE #x93FF #x9400 #x9401 - #x9402 #x9403 #x9404 #x9405 #x9406 #x9407 #x9408 #x9409 #x940A #x940B - #x940C #x940D #x940E #x940F #x9410 #x9411 #x9412 #x9413 #x9414 #x9415 - #x9416 #x9417 #x9418 #x9419 #x941A #x941B #x941C #x941D #x941E #x941F - #x9420 #x9421 #x9422 #x9423 #x9424 #x9425 #x9426 #x9427 #x9428 #x9429 - #x942A #x942B #x942C #x942D #x942E #x942F #x9430 #x9431 #x9432 #x9433 - #x9434 #x9435 #x9436 #x9437 #x9438 #x9439 #x943A #x943B #x943C #x943D - #x943F #x9440 #x9441 #x9442 #x9443 #x9444 #x9445 #x9446 #x9447 #x9448 - #x9449 #x944A #x944B #x944C #x944D #x944E #x944F #x9450 #x9451 #x9452 - #x9453 #x9454 #x9455 #x9456 #x9457 #x9458 #x9459 #x945A #x945B #x945C - #x945D #x945E #x945F #x9460 #x9461 #x9462 #x9463 #x9464 #x9465 #x9466 - #x9467 #x9468 #x9469 #x946A #x946C #x946D #x946E #x946F #x9470 #x9471 - #x9472 #x9473 #x9474 #x9475 #x9476 #x9477 #x9478 #x9479 #x947A #x947B - #x947C #x947D #x947E #x947F #x9480 #x9481 #x9482 #x9483 #x9484 #x9491 - #x9496 #x9498 #x94C7 #x94CF #x94D3 #x94D4 #x94DA #x94E6 #x94FB #x951C - #x9520 #x9527 #x9533 #x953D #x9543 #x9548 #x954B #x9555 #x955A #x9560 - #x956E #x9574 #x9575 #x9577 #x9578 #x9579 #x957A #x957B #x957C #x957D - #x957E #x9580 #x9581 #x9582 #x9583 #x9584 #x9585 #x9586 #x9587 #x9588 - #x9589 #x958A #x958B #x958C #x958D #x958E #x958F #x9590 #x9591 #x9592 - #x9593 #x9594 #x9595 #x9596 #x9597 #x9598 #x9599 #x959A #x959B #x959C - #x959D #x959E #x959F #x95A0 #x95A1 #x95A2 #x95A3 #x95A4 #x95A5 #x95A6 - #x95A7 #x95A8 #x95A9 #x95AA #x95AB #x95AC #x95AD #x95AE #x95AF #x95B0 - #x95B1 #x95B2 #x95B3 #x95B4 #x95B5 #x95B6 #x95B7 #x95B8 #x95B9 #x95BA - #x95BB #x95BC #x95BD #x95BE #x95BF #x95C0 #x95C1 #x95C2 #x95C3 #x95C4 - #x95C5 #x95C6 #x95C7 #x95C8 #x95C9 #x95CA #x95CB #x95CC #x95CD #x95CE - #x95CF #x95D0 #x95D1 #x95D2 #x95D3 #x95D4 #x95D5 #x95D6 #x95D7 #x95D8 - #x95D9 #x95DA #x95DB #x95DC #x95DD #x95DE #x95DF #x95E0 #x95E1 #x95E2 - #x95E3 #x95E4 #x95E5 #x95E6 #x95E7 #x95EC #x95FF #x9607 #x9613 #x9618 - #x961B #x961E #x9620 #x9623 #x9624 #x9625 #x9626 #x9627 #x9628 #x9629 - #x962B #x962C #x962D #x962F #x9630 #x9637 #x9638 #x9639 #x963A #x963E - #x9641 #x9643 #x964A #x964E #x964F #x9651 #x9652 #x9653 #x9656 #x9657 - #x9658 #x9659 #x965A #x965C #x965D #x965E #x9660 #x9663 #x9665 #x9666 - #x966B #x966D #x966E #x966F #x9670 #x9671 #x9673 #x9678 #x9679 #x967A - #x967B #x967C #x967D #x967E #x967F #x9680 #x9681 #x9682 #x9683 #x9684 - #x9687 #x9689 #x968A #x968C #x968E #x9691 #x9692 #x9693 #x9695 #x9696 - #x969A #x969B #x969D #x969E #x969F #x96A0 #x96A1 #x96A2 #x96A3 #x96A4 - #x96A5 #x96A6 #x96A8 #x96A9 #x96AA #x96AB #x96AC #x96AD #x96AE #x96AF - #x96B1 #x96B2 #x96B4 #x96B5 #x96B7 #x96B8 #x96BA #x96BB #x96BF #x96C2 - #x96C3 #x96C8 #x96CA #x96CB #x96D0 #x96D1 #x96D3 #x96D4 #x96D6 #x96D7 - #x96D8 #x96D9 #x96DA #x96DB #x96DC #x96DD #x96DE #x96DF #x96E1 #x96E2 - #x96E3 #x96E4 #x96E5 #x96E6 #x96E7 #x96EB #x96EC #x96ED #x96EE #x96F0 - #x96F1 #x96F2 #x96F4 #x96F5 #x96F8 #x96FA #x96FB #x96FC #x96FD #x96FF - #x9702 #x9703 #x9705 #x970A #x970B #x970C #x9710 #x9711 #x9712 #x9714 - #x9715 #x9717 #x9718 #x9719 #x971A #x971B #x971D #x971F #x9720 #x9721 - #x9722 #x9723 #x9724 #x9725 #x9726 #x9727 #x9728 #x9729 #x972B #x972C - #x972E #x972F #x9731 #x9733 #x9734 #x9735 #x9736 #x9737 #x973A #x973B - #x973C #x973D #x973F #x9740 #x9741 #x9742 #x9743 #x9744 #x9745 #x9746 - #x9747 #x9748 #x9749 #x974A #x974B #x974C #x974D #x974E #x974F #x9750 - #x9751 #x9754 #x9755 #x9757 #x9758 #x975A #x975C #x975D #x975F #x9763 - #x9764 #x9766 #x9767 #x9768 #x976A #x976B #x976C #x976D #x976E #x976F - #x9770 #x9771 #x9772 #x9775 #x9777 #x9778 #x9779 #x977A #x977B #x977D - #x977E #x977F #x9780 #x9781 #x9782 #x9783 #x9784 #x9786 #x9787 #x9788 - #x9789 #x978A #x978C #x978E #x978F #x9790 #x9793 #x9795 #x9796 #x9797 - #x9799 #x979A #x979B #x979C #x979D #x979E #x979F #x97A1 #x97A2 #x97A4 - #x97A5 #x97A6 #x97A7 #x97A8 #x97A9 #x97AA #x97AC #x97AE #x97B0 #x97B1 - #x97B3 #x97B5 #x97B6 #x97B7 #x97B8 #x97B9 #x97BA #x97BB #x97BC #x97BD - #x97BE #x97BF #x97C0 #x97C1 #x97C2 #x97C3 #x97C4 #x97C5 #x97C6 #x97C7 - #x97C8 #x97C9 #x97CA #x97CB #x97CC #x97CD #x97CE #x97CF #x97D0 #x97D1 - #x97D2 #x97D3 #x97D4 #x97D5 #x97D6 #x97D7 #x97D8 #x97D9 #x97DA #x97DB - #x97DC #x97DD #x97DE #x97DF #x97E0 #x97E1 #x97E2 #x97E3 #x97E4 #x97E5 - #x97E8 #x97EE #x97EF #x97F0 #x97F1 #x97F2 #x97F4 #x97F7 #x97F8 #x97F9 - #x97FA #x97FB #x97FC #x97FD #x97FE #x97FF #x9800 #x9801 #x9802 #x9803 - #x9804 #x9805 #x9806 #x9807 #x9808 #x9809 #x980A #x980B #x980C #x980D - #x980E #x980F #x9810 #x9811 #x9812 #x9813 #x9814 #x9815 #x9816 #x9817 - #x9818 #x9819 #x981A #x981B #x981C #x981D #x981E #x981F #x9820 #x9821 - #x9822 #x9823 #x9824 #x9825 #x9826 #x9827 #x9828 #x9829 #x982A #x982B - #x982C #x982D #x982E #x982F #x9830 #x9831 #x9832 #x9833 #x9834 #x9835 - #x9836 #x9837 #x9838 #x9839 #x983A #x983B #x983C #x983D #x983E #x983F - #x9840 #x9841 #x9842 #x9843 #x9844 #x9845 #x9846 #x9847 #x9848 #x9849 - #x984A #x984B #x984C #x984D #x984E #x984F #x9850 #x9851 #x9852 #x9853 - #x9854 #x9855 #x9856 #x9857 #x9858 #x9859 #x985A #x985B #x985C #x985D - #x985E #x985F #x9860 #x9861 #x9862 #x9863 #x9864 #x9865 #x9866 #x9867 - #x9868 #x9869 #x986A #x986B #x986C #x986D #x986E #x986F #x9870 #x9871 - #x9872 #x9873 #x9874 #x988B #x988E #x9892 #x9895 #x9899 #x98A3 #x98A8 - #x98A9 #x98AA #x98AB #x98AC #x98AD #x98AE #x98AF #x98B0 #x98B1 #x98B2 - #x98B3 #x98B4 #x98B5 #x98B6 #x98B7 #x98B8 #x98B9 #x98BA #x98BB #x98BC - #x98BD #x98BE #x98BF #x98C0 #x98C1 #x98C2 #x98C3 #x98C4 #x98C5 #x98C6 - #x98C7 #x98C8 #x98C9 #x98CA #x98CB #x98CC #x98CD #x98CF #x98D0 #x98D4 - #x98D6 #x98D7 #x98DB #x98DC #x98DD #x98E0 #x98E1 #x98E2 #x98E3 #x98E4 - #x98E5 #x98E6 #x98E9 #x98EA #x98EB #x98EC #x98ED #x98EE #x98EF #x98F0 - #x98F1 #x98F2 #x98F3 #x98F4 #x98F5 #x98F6 #x98F7 #x98F8 #x98F9 #x98FA - #x98FB #x98FC #x98FD #x98FE #x98FF #x9900 #x9901 #x9902 #x9903 #x9904 - #x9905 #x9906 #x9907 #x9908 #x9909 #x990A #x990B #x990C #x990E #x990F - #x9911 #x9912 #x9913 #x9914 #x9915 #x9916 #x9917 #x9918 #x9919 #x991A - #x991B #x991C #x991D #x991E #x991F #x9920 #x9921 #x9922 #x9923 #x9924 - #x9925 #x9926 #x9927 #x9928 #x9929 #x992A #x992B #x992C #x992D #x992F - #x9930 #x9931 #x9932 #x9933 #x9934 #x9935 #x9936 #x9937 #x9938 #x9939 - #x993A #x993B #x993C #x993D #x993E #x993F #x9940 #x9941 #x9942 #x9943 - #x9944 #x9945 #x9946 #x9947 #x9948 #x9949 #x994A #x994B #x994C #x994D - #x994E #x994F #x9950 #x9951 #x9952 #x9953 #x9956 #x9957 #x9958 #x9959 - #x995A #x995B #x995C #x995D #x995E #x995F #x9960 #x9961 #x9962 #x9964 - #x9966 #x9973 #x9978 #x9979 #x997B #x997E #x9982 #x9983 #x9989 #x998C - #x998E #x999A #x999B #x999C #x999D #x999E #x999F #x99A0 #x99A1 #x99A2 - #x99A3 #x99A4 #x99A6 #x99A7 #x99A9 #x99AA #x99AB #x99AC #x99AD #x99AE - #x99AF #x99B0 #x99B1 #x99B2 #x99B3 #x99B4 #x99B5 #x99B6 #x99B7 #x99B8 - #x99B9 #x99BA #x99BB #x99BC #x99BD #x99BE #x99BF #x99C0 #x99C1 #x99C2 - #x99C3 #x99C4 #x99C5 #x99C6 #x99C7 #x99C8 #x99C9 #x99CA #x99CB #x99CC - #x99CD #x99CE #x99CF #x99D0 #x99D1 #x99D2 #x99D3 #x99D4 #x99D5 #x99D6 - #x99D7 #x99D8 #x99D9 #x99DA #x99DB #x99DC #x99DD #x99DE #x99DF #x99E0 - #x99E1 #x99E2 #x99E3 #x99E4 #x99E5 #x99E6 #x99E7 #x99E8 #x99E9 #x99EA - #x99EB #x99EC #x99ED #x99EE #x99EF #x99F0 #x99F1 #x99F2 #x99F3 #x99F4 - #x99F5 #x99F6 #x99F7 #x99F8 #x99F9 #x99FA #x99FB #x99FC #x99FD #x99FE - #x99FF #x9A00 #x9A01 #x9A02 #x9A03 #x9A04 #x9A05 #x9A06 #x9A07 #x9A08 - #x9A09 #x9A0A #x9A0B #x9A0C #x9A0D #x9A0E #x9A0F #x9A10 #x9A11 #x9A12 - #x9A13 #x9A14 #x9A15 #x9A16 #x9A17 #x9A18 #x9A19 #x9A1A #x9A1B #x9A1C - #x9A1D #x9A1E #x9A1F #x9A20 #x9A21 #x9A22 #x9A23 #x9A24 #x9A25 #x9A26 - #x9A27 #x9A28 #x9A29 #x9A2A #x9A2B #x9A2C #x9A2D #x9A2E #x9A2F #x9A30 - #x9A31 #x9A32 #x9A33 #x9A34 #x9A35 #x9A36 #x9A37 #x9A38 #x9A39 #x9A3A - #x9A3B #x9A3C #x9A3D #x9A3E #x9A3F #x9A40 #x9A41 #x9A42 #x9A43 #x9A44 - #x9A45 #x9A46 #x9A47 #x9A48 #x9A49 #x9A4A #x9A4B #x9A4C #x9A4D #x9A4E - #x9A4F #x9A50 #x9A51 #x9A52 #x9A53 #x9A54 #x9A55 #x9A56 #x9A57 #x9A58 - #x9A59 #x9A5A #x9A5B #x9A5C #x9A5D #x9A5E #x9A5F #x9A60 #x9A61 #x9A62 - #x9A63 #x9A64 #x9A65 #x9A66 #x9A67 #x9A68 #x9A69 #x9A6A #x9A6B #x9A72 - #x9A83 #x9A89 #x9A8D #x9A8E #x9A94 #x9A95 #x9A99 #x9AA6 #x9AA9 #x9AAA - #x9AAB #x9AAC #x9AAD #x9AAE #x9AAF #x9AB2 #x9AB3 #x9AB4 #x9AB5 #x9AB9 - #x9ABB #x9ABD #x9ABE #x9ABF #x9AC3 #x9AC4 #x9AC6 #x9AC7 #x9AC8 #x9AC9 - #x9ACA #x9ACD #x9ACE #x9ACF #x9AD0 #x9AD2 #x9AD4 #x9AD5 #x9AD6 #x9AD7 - #x9AD9 #x9ADA #x9ADB #x9ADC #x9ADD #x9ADE #x9AE0 #x9AE2 #x9AE3 #x9AE4 - #x9AE5 #x9AE7 #x9AE8 #x9AE9 #x9AEA #x9AEC #x9AEE #x9AF0 #x9AF1 #x9AF2 - #x9AF3 #x9AF4 #x9AF5 #x9AF6 #x9AF7 #x9AF8 #x9AFA #x9AFC #x9AFD #x9AFE - #x9AFF #x9B00 #x9B01 #x9B02 #x9B04 #x9B05 #x9B06 #x9B07 #x9B09 #x9B0A - #x9B0B #x9B0C #x9B0D #x9B0E #x9B10 #x9B11 #x9B12 #x9B14 #x9B15 #x9B16 - #x9B17 #x9B18 #x9B19 #x9B1A #x9B1B #x9B1C #x9B1D #x9B1E #x9B20 #x9B21 - #x9B22 #x9B24 #x9B25 #x9B26 #x9B27 #x9B28 #x9B29 #x9B2A #x9B2B #x9B2C - #x9B2D #x9B2E #x9B30 #x9B31 #x9B33 #x9B34 #x9B35 #x9B36 #x9B37 #x9B38 - #x9B39 #x9B3A #x9B3D #x9B3E #x9B3F #x9B40 #x9B46 #x9B4A #x9B4B #x9B4C - #x9B4E #x9B50 #x9B52 #x9B53 #x9B55 #x9B56 #x9B57 #x9B58 #x9B59 #x9B5A - #x9B5B #x9B5C #x9B5D #x9B5E #x9B5F #x9B60 #x9B61 #x9B62 #x9B63 #x9B64 - #x9B65 #x9B66 #x9B67 #x9B68 #x9B69 #x9B6A #x9B6B #x9B6C #x9B6D #x9B6E - #x9B6F #x9B70 #x9B71 #x9B72 #x9B73 #x9B74 #x9B75 #x9B76 #x9B77 #x9B78 - #x9B79 #x9B7A #x9B7B #x9B7C #x9B7D #x9B7E #x9B7F #x9B80 #x9B81 #x9B82 - #x9B83 #x9B84 #x9B85 #x9B86 #x9B87 #x9B88 #x9B89 #x9B8A #x9B8B #x9B8C - #x9B8D #x9B8E #x9B8F #x9B90 #x9B91 #x9B92 #x9B93 #x9B94 #x9B95 #x9B96 - #x9B97 #x9B98 #x9B99 #x9B9A #x9B9B #x9B9C #x9B9D #x9B9E #x9B9F #x9BA0 - #x9BA1 #x9BA2 #x9BA3 #x9BA4 #x9BA5 #x9BA6 #x9BA7 #x9BA8 #x9BA9 #x9BAA - #x9BAB #x9BAC #x9BAD #x9BAE #x9BAF #x9BB0 #x9BB1 #x9BB2 #x9BB3 #x9BB4 - #x9BB5 #x9BB6 #x9BB7 #x9BB8 #x9BB9 #x9BBA #x9BBB #x9BBC #x9BBD #x9BBE - #x9BBF #x9BC0 #x9BC1 #x9BC2 #x9BC3 #x9BC4 #x9BC5 #x9BC6 #x9BC7 #x9BC8 - #x9BC9 #x9BCA #x9BCB #x9BCC #x9BCD #x9BCE #x9BCF #x9BD0 #x9BD1 #x9BD2 - #x9BD3 #x9BD4 #x9BD5 #x9BD6 #x9BD7 #x9BD8 #x9BD9 #x9BDA #x9BDB #x9BDC - #x9BDD #x9BDE #x9BDF #x9BE0 #x9BE1 #x9BE2 #x9BE3 #x9BE4 #x9BE5 #x9BE6 - #x9BE7 #x9BE8 #x9BE9 #x9BEA #x9BEB #x9BEC #x9BED #x9BEE #x9BEF #x9BF0 - #x9BF1 #x9BF2 #x9BF3 #x9BF4 #x9BF5 #x9BF6 #x9BF7 #x9BF8 #x9BF9 #x9BFA - #x9BFB #x9BFC #x9BFD #x9BFE #x9BFF #x9C00 #x9C01 #x9C02 #x9C03 #x9C04 - #x9C05 #x9C06 #x9C07 #x9C08 #x9C09 #x9C0A #x9C0B #x9C0C #x9C0D #x9C0E - #x9C0F #x9C10 #x9C11 #x9C12 #x9C13 #x9C14 #x9C15 #x9C16 #x9C17 #x9C18 - #x9C19 #x9C1A #x9C1B #x9C1C #x9C1D #x9C1E #x9C1F #x9C20 #x9C21 #x9C22 - #x9C23 #x9C24 #x9C25 #x9C26 #x9C27 #x9C28 #x9C29 #x9C2A #x9C2B #x9C2C - #x9C2D #x9C2E #x9C2F #x9C30 #x9C31 #x9C32 #x9C33 #x9C34 #x9C35 #x9C36 - #x9C37 #x9C38 #x9C39 #x9C3A #x9C3B #x9C3C #x9C3D #x9C3E #x9C3F #x9C40 - #x9C41 #x9C42 #x9C43 #x9C44 #x9C45 #x9C46 #x9C47 #x9C48 #x9C49 #x9C4A - #x9C4B #x9C4C #x9C4D #x9C4E #x9C4F #x9C50 #x9C51 #x9C52 #x9C53 #x9C54 - #x9C55 #x9C56 #x9C57 #x9C58 #x9C59 #x9C5A #x9C5B #x9C5C #x9C5D #x9C5E - #x9C5F #x9C60 #x9C61 #x9C62 #x9C63 #x9C64 #x9C65 #x9C66 #x9C67 #x9C68 - #x9C69 #x9C6A #x9C6B #x9C6C #x9C6D #x9C6E #x9C6F #x9C70 #x9C71 #x9C72 - #x9C73 #x9C74 #x9C75 #x9C76 #x9C77 #x9C78 #x9C79 #x9C7A #x9C7B #x9C7D - #x9C7E #x9C80 #x9C83 #x9C84 #x9C89 #x9C8A #x9C8C #x9C8F #x9C93 #x9C96 - #x9C97 #x9C98 #x9C99 #x9C9D #x9CAA #x9CAC #x9CAF #x9CB9 #x9CBE #x9CBF - #x9CC0 #x9CC1 #x9CC2 #x9CC8 #x9CC9 #x9CD1 #x9CD2 #x9CDA #x9CDB #x9CE0 - #x9CE1 #x9CE3 #x9CE4 #x9CE5 #x9CE6 #x9CE7 #x9CE8 #x9CE9 #x9CEA #x9CEB - #x9CEC #x9CED #x9CEE #x9CEF #x9CF0 #x9CF1 #x9CF2 #x9CF3 #x9CF4 #x9CF5 - #x9CF6 #x9CF7 #x9CF8 #x9CF9 #x9CFA #x9CFB #x9CFC #x9CFD #x9CFE #x9CFF - #x9D00 #x9D01 #x9D02 #x9D03 #x9D04 #x9D05 #x9D06 #x9D07 #x9D08 #x9D09 - #x9D0A #x9D0B #x9D0C #x9D0D #x9D0E #x9D0F #x9D10 #x9D11 #x9D12 #x9D13 - #x9D14 #x9D15 #x9D16 #x9D17 #x9D18 #x9D19 #x9D1A #x9D1B #x9D1C #x9D1D - #x9D1E #x9D1F #x9D20 #x9D21 #x9D22 #x9D23 #x9D24 #x9D25 #x9D26 #x9D27 - #x9D28 #x9D29 #x9D2A #x9D2B #x9D2C #x9D2D #x9D2E #x9D2F #x9D30 #x9D31 - #x9D32 #x9D33 #x9D34 #x9D35 #x9D36 #x9D37 #x9D38 #x9D39 #x9D3A #x9D3B - #x9D3C #x9D3D #x9D3E #x9D3F #x9D40 #x9D41 #x9D42 #x9D43 #x9D44 #x9D45 - #x9D46 #x9D47 #x9D48 #x9D49 #x9D4A #x9D4B #x9D4C #x9D4D #x9D4E #x9D4F - #x9D50 #x9D51 #x9D52 #x9D53 #x9D54 #x9D55 #x9D56 #x9D57 #x9D58 #x9D59 - #x9D5A #x9D5B #x9D5C #x9D5D #x9D5E #x9D5F #x9D60 #x9D61 #x9D62 #x9D63 - #x9D64 #x9D65 #x9D66 #x9D67 #x9D68 #x9D69 #x9D6A #x9D6B #x9D6C #x9D6D - #x9D6E #x9D6F #x9D70 #x9D71 #x9D72 #x9D73 #x9D74 #x9D75 #x9D76 #x9D77 - #x9D78 #x9D79 #x9D7A #x9D7B #x9D7C #x9D7D #x9D7E #x9D7F #x9D80 #x9D81 - #x9D82 #x9D83 #x9D84 #x9D85 #x9D86 #x9D87 #x9D88 #x9D89 #x9D8A #x9D8B - #x9D8C #x9D8D #x9D8E #x9D8F #x9D90 #x9D91 #x9D92 #x9D93 #x9D94 #x9D95 - #x9D96 #x9D97 #x9D98 #x9D99 #x9D9A #x9D9B #x9D9C #x9D9D #x9D9E #x9D9F - #x9DA0 #x9DA1 #x9DA2 #x9DA3 #x9DA4 #x9DA5 #x9DA6 #x9DA7 #x9DA8 #x9DA9 - #x9DAA #x9DAB #x9DAC #x9DAD #x9DAE #x9DAF #x9DB0 #x9DB1 #x9DB2 #x9DB3 - #x9DB4 #x9DB5 #x9DB6 #x9DB7 #x9DB8 #x9DB9 #x9DBA #x9DBB #x9DBC #x9DBD - #x9DBE #x9DBF #x9DC0 #x9DC1 #x9DC2 #x9DC3 #x9DC4 #x9DC5 #x9DC6 #x9DC7 - #x9DC8 #x9DC9 #x9DCA #x9DCB #x9DCC #x9DCD #x9DCE #x9DCF #x9DD0 #x9DD1 - #x9DD2 #x9DD3 #x9DD4 #x9DD5 #x9DD6 #x9DD7 #x9DD8 #x9DD9 #x9DDA #x9DDB - #x9DDC #x9DDD #x9DDE #x9DDF #x9DE0 #x9DE1 #x9DE2 #x9DE3 #x9DE4 #x9DE5 - #x9DE6 #x9DE7 #x9DE8 #x9DE9 #x9DEA #x9DEB #x9DEC #x9DED #x9DEE #x9DEF - #x9DF0 #x9DF1 #x9DF2 #x9DF3 #x9DF4 #x9DF5 #x9DF6 #x9DF7 #x9DF8 #x9DF9 - #x9DFA #x9DFB #x9DFC #x9DFD #x9DFE #x9DFF #x9E00 #x9E01 #x9E02 #x9E03 - #x9E04 #x9E05 #x9E06 #x9E07 #x9E08 #x9E09 #x9E0A #x9E0B #x9E0C #x9E0D - #x9E0E #x9E0F #x9E10 #x9E11 #x9E12 #x9E13 #x9E14 #x9E15 #x9E16 #x9E17 - #x9E18 #x9E19 #x9E1A #x9E1B #x9E1C #x9E1D #x9E1E #x9E24 #x9E27 #x9E2E - #x9E30 #x9E34 #x9E3B #x9E3C #x9E40 #x9E4D #x9E50 #x9E52 #x9E53 #x9E54 - #x9E56 #x9E59 #x9E5D #x9E5F #x9E60 #x9E61 #x9E62 #x9E65 #x9E6E #x9E6F - #x9E72 #x9E74 #x9E75 #x9E76 #x9E77 #x9E78 #x9E79 #x9E7A #x9E7B #x9E7C - #x9E7D #x9E80 #x9E81 #x9E83 #x9E84 #x9E85 #x9E86 #x9E89 #x9E8A #x9E8C - #x9E8D #x9E8E #x9E8F #x9E90 #x9E91 #x9E94 #x9E95 #x9E96 #x9E97 #x9E98 - #x9E99 #x9E9A #x9E9B #x9E9C #x9E9E #x9EA0 #x9EA1 #x9EA2 #x9EA3 #x9EA4 - #x9EA5 #x9EA7 #x9EA8 #x9EA9 #x9EAA #x9EAB #x9EAC #x9EAD #x9EAE #x9EAF - #x9EB0 #x9EB1 #x9EB2 #x9EB3 #x9EB5 #x9EB6 #x9EB7 #x9EB9 #x9EBA #x9EBC - #x9EBF #x9EC0 #x9EC1 #x9EC2 #x9EC3 #x9EC5 #x9EC6 #x9EC7 #x9EC8 #x9ECA - #x9ECB #x9ECC #x9ED0 #x9ED2 #x9ED3 #x9ED5 #x9ED6 #x9ED7 #x9ED9 #x9EDA - #x9EDE #x9EE1 #x9EE3 #x9EE4 #x9EE6 #x9EE8 #x9EEB #x9EEC #x9EED #x9EEE - #x9EF0 #x9EF1 #x9EF2 #x9EF3 #x9EF4 #x9EF5 #x9EF6 #x9EF7 #x9EF8 #x9EFA - #x9EFD #x9EFF #x9F00 #x9F01 #x9F02 #x9F03 #x9F04 #x9F05 #x9F06 #x9F07 - #x9F08 #x9F09 #x9F0A #x9F0C #x9F0F #x9F11 #x9F12 #x9F14 #x9F15 #x9F16 - #x9F18 #x9F1A #x9F1B #x9F1C #x9F1D #x9F1E #x9F1F #x9F21 #x9F23 #x9F24 - #x9F25 #x9F26 #x9F27 #x9F28 #x9F29 #x9F2A #x9F2B #x9F2D #x9F2E #x9F30 - #x9F31 #x9F32 #x9F33 #x9F34 #x9F35 #x9F36 #x9F38 #x9F3A #x9F3C #x9F3F - #x9F40 #x9F41 #x9F42 #x9F43 #x9F45 #x9F46 #x9F47 #x9F48 #x9F49 #x9F4A - #x9F4B #x9F4C #x9F4D #x9F4E #x9F4F #x9F52 #x9F53 #x9F54 #x9F55 #x9F56 - #x9F57 #x9F58 #x9F59 #x9F5A #x9F5B #x9F5C #x9F5D #x9F5E #x9F5F #x9F60 - #x9F61 #x9F62 #x9F63 #x9F64 #x9F65 #x9F66 #x9F67 #x9F68 #x9F69 #x9F6A - #x9F6B #x9F6C #x9F6D #x9F6E #x9F6F #x9F70 #x9F71 #x9F72 #x9F73 #x9F74 - #x9F75 #x9F76 #x9F77 #x9F78 #x9F79 #x9F7A #x9F7B #x9F7C #x9F7D #x9F7E - #x9F81 #x9F82 #x9F8D #x9F8E #x9F8F #x9F90 #x9F91 #x9F92 #x9F93 #x9F94 - #x9F95 #x9F96 #x9F97 #x9F98 #x9F9C #x9F9D #x9F9E #x9FA1 #x9FA2 #x9FA3 - #x9FA4 #x9FA5 #x3000 #x3001 #x3002 #x00B7 #x02C9 #x02C7 #x00A8 #x3003 - #x3005 #x2014 #xFF5E #x2016 #x2026 #x2018 #x2019 #x201C #x201D #x3014 - #x3015 #x3008 #x3009 #x300A #x300B #x300C #x300D #x300E #x300F #x3016 - #x3017 #x3010 #x3011 #x00B1 #x00D7 #x00F7 #x2236 #x2227 #x2228 #x2211 - #x220F #x222A #x2229 #x2208 #x2237 #x221A #x22A5 #x2225 #x2220 #x2312 - #x2299 #x222B #x222E #x2261 #x224C #x2248 #x223D #x221D #x2260 #x226E - #x226F #x2264 #x2265 #x221E #x2235 #x2234 #x2642 #x2640 #x00B0 #x2032 - #x2033 #x2103 #xFF04 #x00A4 #xFFE0 #xFFE1 #x2030 #x00A7 #x2116 #x2606 - #x2605 #x25CB #x25CF #x25CE #x25C7 #x25C6 #x25A1 #x25A0 #x25B3 #x25B2 - #x203B #x2192 #x2190 #x2191 #x2193 #x3013 #x2170 #x2171 #x2172 #x2173 - #x2174 #x2175 #x2176 #x2177 #x2178 #x2179 #xE766 #xE767 #xE768 #xE769 - #xE76A #xE76B #x2488 #x2489 #x248A #x248B #x248C #x248D #x248E #x248F - #x2490 #x2491 #x2492 #x2493 #x2494 #x2495 #x2496 #x2497 #x2498 #x2499 - #x249A #x249B #x2474 #x2475 #x2476 #x2477 #x2478 #x2479 #x247A #x247B - #x247C #x247D #x247E #x247F #x2480 #x2481 #x2482 #x2483 #x2484 #x2485 - #x2486 #x2487 #x2460 #x2461 #x2462 #x2463 #x2464 #x2465 #x2466 #x2467 - #x2468 #x2469 #xE76C #xE76D #x3220 #x3221 #x3222 #x3223 #x3224 #x3225 - #x3226 #x3227 #x3228 #x3229 #xE76E #xE76F #x2160 #x2161 #x2162 #x2163 - #x2164 #x2165 #x2166 #x2167 #x2168 #x2169 #x216A #x216B #xE770 #xE771 - #xFF01 #xFF02 #xFF03 #xFFE5 #xFF05 #xFF06 #xFF07 #xFF08 #xFF09 #xFF0A - #xFF0B #xFF0C #xFF0D #xFF0E #xFF0F #xFF10 #xFF11 #xFF12 #xFF13 #xFF14 - #xFF15 #xFF16 #xFF17 #xFF18 #xFF19 #xFF1A #xFF1B #xFF1C #xFF1D #xFF1E - #xFF1F #xFF20 #xFF21 #xFF22 #xFF23 #xFF24 #xFF25 #xFF26 #xFF27 #xFF28 - #xFF29 #xFF2A #xFF2B #xFF2C #xFF2D #xFF2E #xFF2F #xFF30 #xFF31 #xFF32 - #xFF33 #xFF34 #xFF35 #xFF36 #xFF37 #xFF38 #xFF39 #xFF3A #xFF3B #xFF3C - #xFF3D #xFF3E #xFF3F #xFF40 #xFF41 #xFF42 #xFF43 #xFF44 #xFF45 #xFF46 - #xFF47 #xFF48 #xFF49 #xFF4A #xFF4B #xFF4C #xFF4D #xFF4E #xFF4F #xFF50 - #xFF51 #xFF52 #xFF53 #xFF54 #xFF55 #xFF56 #xFF57 #xFF58 #xFF59 #xFF5A - #xFF5B #xFF5C #xFF5D #xFFE3 #x3041 #x3042 #x3043 #x3044 #x3045 #x3046 - #x3047 #x3048 #x3049 #x304A #x304B #x304C #x304D #x304E #x304F #x3050 - #x3051 #x3052 #x3053 #x3054 #x3055 #x3056 #x3057 #x3058 #x3059 #x305A - #x305B #x305C #x305D #x305E #x305F #x3060 #x3061 #x3062 #x3063 #x3064 - #x3065 #x3066 #x3067 #x3068 #x3069 #x306A #x306B #x306C #x306D #x306E - #x306F #x3070 #x3071 #x3072 #x3073 #x3074 #x3075 #x3076 #x3077 #x3078 - #x3079 #x307A #x307B #x307C #x307D #x307E #x307F #x3080 #x3081 #x3082 - #x3083 #x3084 #x3085 #x3086 #x3087 #x3088 #x3089 #x308A #x308B #x308C - #x308D #x308E #x308F #x3090 #x3091 #x3092 #x3093 #xE772 #xE773 #xE774 - #xE775 #xE776 #xE777 #xE778 #xE779 #xE77A #xE77B #xE77C #x30A1 #x30A2 - #x30A3 #x30A4 #x30A5 #x30A6 #x30A7 #x30A8 #x30A9 #x30AA #x30AB #x30AC - #x30AD #x30AE #x30AF #x30B0 #x30B1 #x30B2 #x30B3 #x30B4 #x30B5 #x30B6 - #x30B7 #x30B8 #x30B9 #x30BA #x30BB #x30BC #x30BD #x30BE #x30BF #x30C0 - #x30C1 #x30C2 #x30C3 #x30C4 #x30C5 #x30C6 #x30C7 #x30C8 #x30C9 #x30CA - #x30CB #x30CC #x30CD #x30CE #x30CF #x30D0 #x30D1 #x30D2 #x30D3 #x30D4 - #x30D5 #x30D6 #x30D7 #x30D8 #x30D9 #x30DA #x30DB #x30DC #x30DD #x30DE - #x30DF #x30E0 #x30E1 #x30E2 #x30E3 #x30E4 #x30E5 #x30E6 #x30E7 #x30E8 - #x30E9 #x30EA #x30EB #x30EC #x30ED #x30EE #x30EF #x30F0 #x30F1 #x30F2 - #x30F3 #x30F4 #x30F5 #x30F6 #xE77D #xE77E #xE77F #xE780 #xE781 #xE782 - #xE783 #xE784 #x0391 #x0392 #x0393 #x0394 #x0395 #x0396 #x0397 #x0398 - #x0399 #x039A #x039B #x039C #x039D #x039E #x039F #x03A0 #x03A1 #x03A3 - #x03A4 #x03A5 #x03A6 #x03A7 #x03A8 #x03A9 #xE785 #xE786 #xE787 #xE788 - #xE789 #xE78A #xE78B #xE78C #x03B1 #x03B2 #x03B3 #x03B4 #x03B5 #x03B6 - #x03B7 #x03B8 #x03B9 #x03BA #x03BB #x03BC #x03BD #x03BE #x03BF #x03C0 - #x03C1 #x03C3 #x03C4 #x03C5 #x03C6 #x03C7 #x03C8 #x03C9 #xE78D #xE78E - #xE78F #xE790 #xE791 #xE792 #xE793 #xFE35 #xFE36 #xFE39 #xFE3A #xFE3F - #xFE40 #xFE3D #xFE3E #xFE41 #xFE42 #xFE43 #xFE44 #xE794 #xE795 #xFE3B - #xFE3C #xFE37 #xFE38 #xFE31 #xE796 #xFE33 #xFE34 #xE797 #xE798 #xE799 - #xE79A #xE79B #xE79C #xE79D #xE79E #xE79F #x0410 #x0411 #x0412 #x0413 - #x0414 #x0415 #x0401 #x0416 #x0417 #x0418 #x0419 #x041A #x041B #x041C - #x041D #x041E #x041F #x0420 #x0421 #x0422 #x0423 #x0424 #x0425 #x0426 - #x0427 #x0428 #x0429 #x042A #x042B #x042C #x042D #x042E #x042F #xE7A0 - #xE7A1 #xE7A2 #xE7A3 #xE7A4 #xE7A5 #xE7A6 #xE7A7 #xE7A8 #xE7A9 #xE7AA - #xE7AB #xE7AC #xE7AD #xE7AE #x0430 #x0431 #x0432 #x0433 #x0434 #x0435 - #x0451 #x0436 #x0437 #x0438 #x0439 #x043A #x043B #x043C #x043D #x043E - #x043F #x0440 #x0441 #x0442 #x0443 #x0444 #x0445 #x0446 #x0447 #x0448 - #x0449 #x044A #x044B #x044C #x044D #x044E #x044F #xE7AF #xE7B0 #xE7B1 - #xE7B2 #xE7B3 #xE7B4 #xE7B5 #xE7B6 #xE7B7 #xE7B8 #xE7B9 #xE7BA #xE7BB - #x0101 #x00E1 #x01CE #x00E0 #x0113 #x00E9 #x011B #x00E8 #x012B #x00ED - #x01D0 #x00EC #x014D #x00F3 #x01D2 #x00F2 #x016B #x00FA #x01D4 #x00F9 - #x01D6 #x01D8 #x01DA #x01DC #x00FC #x00EA #x0251 #xE7C7 #x0144 #x0148 - #xE7C8 #x0261 #xE7C9 #xE7CA #xE7CB #xE7CC #x3105 #x3106 #x3107 #x3108 - #x3109 #x310A #x310B #x310C #x310D #x310E #x310F #x3110 #x3111 #x3112 - #x3113 #x3114 #x3115 #x3116 #x3117 #x3118 #x3119 #x311A #x311B #x311C - #x311D #x311E #x311F #x3120 #x3121 #x3122 #x3123 #x3124 #x3125 #x3126 - #x3127 #x3128 #x3129 #xE7CD #xE7CE #xE7CF #xE7D0 #xE7D1 #xE7D2 #xE7D3 - #xE7D4 #xE7D5 #xE7D6 #xE7D7 #xE7D8 #xE7D9 #xE7DA #xE7DB #xE7DC #xE7DD - #xE7DE #xE7DF #xE7E0 #xE7E1 #xE7FE #xE7FF #xE800 #x2500 #x2501 #x2502 - #x2503 #x2504 #x2505 #x2506 #x2507 #x2508 #x2509 #x250A #x250B #x250C - #x250D #x250E #x250F #x2510 #x2511 #x2512 #x2513 #x2514 #x2515 #x2516 - #x2517 #x2518 #x2519 #x251A #x251B #x251C #x251D #x251E #x251F #x2520 - #x2521 #x2522 #x2523 #x2524 #x2525 #x2526 #x2527 #x2528 #x2529 #x252A - #x252B #x252C #x252D #x252E #x252F #x2530 #x2531 #x2532 #x2533 #x2534 - #x2535 #x2536 #x2537 #x2538 #x2539 #x253A #x253B #x253C #x253D #x253E - #x253F #x2540 #x2541 #x2542 #x2543 #x2544 #x2545 #x2546 #x2547 #x2548 - #x2549 #x254A #x254B #xE801 #xE802 #xE803 #xE804 #xE805 #xE806 #xE807 - #xE808 #xE809 #xE80A #xE80B #xE80C #xE80D #xE80E #xE80F #x02CA #x02CB - #x02D9 #x2013 #x2015 #x2025 #x2035 #x2105 #x2109 #x2196 #x2197 #x2198 - #x2199 #x2215 #x221F #x2223 #x2252 #x2266 #x2267 #x22BF #x2550 #x2551 - #x2552 #x2553 #x2554 #x2555 #x2556 #x2557 #x2558 #x2559 #x255A #x255B - #x255C #x255D #x255E #x255F #x2560 #x2561 #x2562 #x2563 #x2564 #x2565 - #x2566 #x2567 #x2568 #x2569 #x256A #x256B #x256C #x256D #x256E #x256F - #x2570 #x2571 #x2572 #x2573 #x2581 #x2582 #x2583 #x2584 #x2585 #x2586 - #x2587 #x2588 #x2589 #x258A #x258B #x258C #x258D #x258E #x258F #x2593 - #x2594 #x2595 #x25BC #x25BD #x25E2 #x25E3 #x25E4 #x25E5 #x2609 #x2295 - #x3012 #x301D #x301E #xE7BC #xE7BD #xE7BE #xE7BF #xE7C0 #xE7C1 #xE7C2 - #xE7C3 #xE7C4 #xE7C5 #xE7C6 #x3021 #x3022 #x3023 #x3024 #x3025 #x3026 - #x3027 #x3028 #x3029 #x32A3 #x338E #x338F #x339C #x339D #x339E #x33A1 - #x33C4 #x33CE #x33D1 #x33D2 #x33D5 #xFE30 #xFFE2 #xFFE4 #xE7E2 #x2121 - #x3231 #xE7E3 #x2010 #xE7E4 #xE7E5 #xE7E6 #x30FC #x309B #x309C #x30FD - #x30FE #x3006 #x309D #x309E #xFE49 #xFE4A #xFE4B #xFE4C #xFE4D #xFE4E - #xFE4F #xFE50 #xFE51 #xFE52 #xFE54 #xFE55 #xFE56 #xFE57 #xFE59 #xFE5A - #xFE5B #xFE5C #xFE5D #xFE5E #xFE5F #xFE60 #xFE61 #xFE62 #xFE63 #xFE64 - #xFE65 #xFE66 #xFE68 #xFE69 #xFE6A #xFE6B #xE7E7 #xE7E8 #xE7E9 #xE7EA - #xE7EB #xE7EC #xE7ED #xE7EE #xE7EF #xE7F0 #xE7F1 #xE7F2 #xE7F3 #x3007 - #xE7F4 #xE7F5 #xE7F6 #xE7F7 #xE7F8 #xE7F9 #xE7FA #xE7FB #xE7FC #xE7FD - #x0020))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/jpn-table.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/jpn-table.lisp deleted file mode 100644 index f0cf849..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/jpn-table.lisp +++ /dev/null @@ -1,17637 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; jpn-table.lisp --- Unicode tables for Japanese encodings. -;;; - -(in-package #:babel-encodings) - -(defvar *cp932-only* - '((#xFC4B #x9ED1) - (#xFC4A #x9E19) - (#xFC49 #xFA2D) - (#xFC48 #x9D6B) - (#xFC47 #x9D70) - (#xFC46 #x9C00) - (#xFC45 #x9BBB) - (#xFC44 #x9BB1) - (#xFC43 #x9B8F) - (#xFC42 #x9B72) - (#xFC41 #x9B75) - (#xFC40 #x9ADC) - (#xFBFC #x9AD9) - (#xFBFB #x9A4E) - (#xFBFA #x999E) - (#xFBF9 #xFA2C) - (#xFBF8 #x9927) - (#xFBF7 #xFA2B) - (#xFBF6 #xFA2A) - (#xFBF5 #x9865) - (#xFBF4 #x9857) - (#xFBF3 #x9755) - (#xFBF2 #x9751) - (#xFBF1 #x974F) - (#xFBF0 #x974D) - (#xFBEF #x9743) - (#xFBEE #x973B) - (#xFBED #x9733) - (#xFBEC #x96AF) - (#xFBEB #x969D) - (#xFBEA #xFA29) - (#xFBE9 #xF9DC) - (#xFBE8 #x9592) - (#xFBE7 #x9448) - (#xFBE6 #x9445) - (#xFBE5 #x9431) - (#xFBE4 #x93F8) - (#xFBE3 #x93DE) - (#xFBE2 #x93C6) - (#xFBE1 #x93A4) - (#xFBE0 #x9357) - (#xFBDF #x9370) - (#xFBDE #x9302) - (#xFBDD #x931D) - (#xFBDC #x92FF) - (#xFBDB #x931E) - (#xFBDA #xFA28) - (#xFBD9 #x92FB) - (#xFBD8 #x9321) - (#xFBD7 #x9325) - (#xFBD6 #x92D3) - (#xFBD5 #x92E0) - (#xFBD4 #x92D5) - (#xFBD3 #xFA27) - (#xFBD2 #x92D0) - (#xFBD1 #x92D9) - (#xFBD0 #x92D7) - (#xFBCF #x92E7) - (#xFBCE #x9278) - (#xFBCD #x9277) - (#xFBCC #x92A7) - (#xFBCB #x9267) - (#xFBCA #x9239) - (#xFBC9 #x9251) - (#xFBC8 #x9259) - (#xFBC7 #x924E) - (#xFBC6 #x923C) - (#xFBC5 #x9240) - (#xFBC4 #x923A) - (#xFBC3 #x920A) - (#xFBC2 #x9210) - (#xFBC1 #x9206) - (#xFBC0 #x91E5) - (#xFBBF #x91E4) - (#xFBBE #x91EE) - (#xFBBD #x91ED) - (#xFBBC #x91DE) - (#xFBBB #x91D7) - (#xFBBA #x91DA) - (#xFBB9 #x9127) - (#xFBB8 #x9115) - (#xFBB7 #xFA26) - (#xFBB6 #x90DE) - (#xFBB5 #x9067) - (#xFBB4 #xFA25) - (#xFBB3 #xFA24) - (#xFBB2 #x8ECF) - (#xFBB1 #xFA23) - (#xFBB0 #x8D76) - (#xFBAF #x8D12) - (#xFBAE #x8CF4) - (#xFBAD #x8CF0) - (#xFBAC #x8B7F) - (#xFBAB #x8B53) - (#xFBAA #x8AF6) - (#xFBA9 #xFA22) - (#xFBA8 #x8ADF) - (#xFBA7 #x8ABE) - (#xFBA6 #x8AA7) - (#xFBA5 #x8A79) - (#xFBA4 #x8A37) - (#xFBA3 #x8A12) - (#xFBA2 #x88F5) - (#xFBA1 #x8807) - (#xFBA0 #xFA21) - (#xFB9F #xFA20) - (#xFB9E #x85B0) - (#xFB9D #xFA1F) - (#xFB9C #x856B) - (#xFB9B #x8559) - (#xFB9A #x8553) - (#xFB99 #x84B4) - (#xFB98 #x8448) - (#xFB97 #x83F6) - (#xFB96 #x83C7) - (#xFB95 #x837F) - (#xFB94 #x8362) - (#xFB93 #x8301) - (#xFB92 #xFA1E) - (#xFB91 #x7FA1) - (#xFB90 #x7F47) - (#xFB8F #x7E52) - (#xFB8E #x7DD6) - (#xFB8D #x7DA0) - (#xFB8C #x7DB7) - (#xFB8B #x7D5C) - (#xFB8A #x7D48) - (#xFB89 #xFA1D) - (#xFB88 #x7B9E) - (#xFB87 #x7AEB) - (#xFB86 #xFA1C) - (#xFB85 #x7AE7) - (#xFB84 #x7AD1) - (#xFB83 #x799B) - (#xFB82 #xFA1B) - (#xFB81 #x7994) - (#xFB80 #xFA1A) - (#xFB7E #xFA19) - (#xFB7D #xFA18) - (#xFB7C #x7930) - (#xFB7B #x787A) - (#xFB7A #x7864) - (#xFB79 #x784E) - (#xFB78 #x7821) - (#xFB77 #x52AF) - (#xFB76 #x7746) - (#xFB75 #xFA17) - (#xFB74 #x76A6) - (#xFB73 #x769B) - (#xFB72 #x769E) - (#xFB71 #x769C) - (#xFB70 #x7682) - (#xFB6F #x756F) - (#xFB6E #x7501) - (#xFB6D #x749F) - (#xFB6C #x7489) - (#xFB6B #x7462) - (#xFB6A #x742E) - (#xFB69 #x7429) - (#xFB68 #x742A) - (#xFB67 #x7426) - (#xFB66 #x73F5) - (#xFB65 #x7407) - (#xFB64 #x73D2) - (#xFB63 #x73E3) - (#xFB62 #x73D6) - (#xFB61 #x73C9) - (#xFB60 #x73BD) - (#xFB5F #x7377) - (#xFB5E #xFA16) - (#xFB5D #x7324) - (#xFB5C #x72BE) - (#xFB5B #x72B1) - (#xFB5A #x71FE) - (#xFB59 #x71C1) - (#xFB58 #xFA15) - (#xFB57 #x7147) - (#xFB56 #x7146) - (#xFB55 #x715C) - (#xFB54 #x7104) - (#xFB53 #x710F) - (#xFB52 #x70AB) - (#xFB51 #x7085) - (#xFB50 #x7028) - (#xFB4F #x7007) - (#xFB4E #x7005) - (#xFB4D #x6FF5) - (#xFB4C #x6FB5) - (#xFB4B #x6F88) - (#xFB4A #x6EBF) - (#xFB49 #x6E3C) - (#xFB48 #x6E27) - (#xFB47 #x6E5C) - (#xFB46 #x6E39) - (#xFB45 #x6DFC) - (#xFB44 #x6DF2) - (#xFB43 #x6DF8) - (#xFB42 #x6DCF) - (#xFB41 #x6DAC) - (#xFB40 #x6D96) - (#xFAFC #x6D6F) - (#xFAFB #x6D87) - (#xFAFA #x6D04) - (#xFAF9 #x6CDA) - (#xFAF8 #x6C6F) - (#xFAF7 #x6C86) - (#xFAF6 #x6C5C) - (#xFAF5 #x6C3F) - (#xFAF4 #x6BD6) - (#xFAF3 #x6AE4) - (#xFAF2 #x6AE2) - (#xFAF1 #x6A7E) - (#xFAF0 #x6A73) - (#xFAEF #x6A46) - (#xFAEE #x6A6B) - (#xFAED #x6A30) - (#xFAEC #x69E2) - (#xFAEB #x6998) - (#xFAEA #xFA14) - (#xFAE9 #x6968) - (#xFAE8 #xFA13) - (#xFAE7 #x68CF) - (#xFAE6 #x6844) - (#xFAE5 #x6801) - (#xFAE4 #x67C0) - (#xFAE3 #x6852) - (#xFAE2 #x67BB) - (#xFAE1 #x6766) - (#xFAE0 #xF929) - (#xFADF #x670E) - (#xFADE #x66FA) - (#xFADD #x66BF) - (#xFADC #x66B2) - (#xFADB #x66A0) - (#xFADA #x6699) - (#xFAD9 #x6673) - (#xFAD8 #xFA12) - (#xFAD7 #x6659) - (#xFAD6 #x6657) - (#xFAD5 #x6665) - (#xFAD4 #x6624) - (#xFAD3 #x661E) - (#xFAD2 #x662E) - (#xFAD1 #x6609) - (#xFAD0 #x663B) - (#xFACF #x6615) - (#xFACE #x6600) - (#xFACD #x654E) - (#xFACC #x64CE) - (#xFACB #x649D) - (#xFACA #x6460) - (#xFAC9 #x63F5) - (#xFAC8 #x62A6) - (#xFAC7 #x6213) - (#xFAC6 #x6198) - (#xFAC5 #x6130) - (#xFAC4 #x6137) - (#xFAC3 #x6111) - (#xFAC2 #x60F2) - (#xFAC1 #x6120) - (#xFAC0 #x60D5) - (#xFABF #x60DE) - (#xFABE #x608A) - (#xFABD #x6085) - (#xFABC #x605D) - (#xFABB #x5FDE) - (#xFABA #x5FB7) - (#xFAB9 #x5F67) - (#xFAB8 #x5F34) - (#xFAB7 #x5F21) - (#xFAB6 #x5DD0) - (#xFAB5 #x5DB9) - (#xFAB4 #x5DB8) - (#xFAB3 #x5D6D) - (#xFAB2 #x5D42) - (#xFAB1 #xFA11) - (#xFAB0 #x5D53) - (#xFAAF #x5D27) - (#xFAAE #x5CF5) - (#xFAAD #x5CBA) - (#xFAAC #x5CA6) - (#xFAAB #x5C1E) - (#xFAAA #x5BEC) - (#xFAA9 #x5BD8) - (#xFAA8 #x752F) - (#xFAA7 #x5BC0) - (#xFAA6 #x5B56) - (#xFAA5 #x59BA) - (#xFAA4 #x59A4) - (#xFAA3 #x5963) - (#xFAA2 #x595D) - (#xFAA1 #x595B) - (#xFAA0 #x5953) - (#xFA9F #x590B) - (#xFA9E #x58B2) - (#xFA9D #x589E) - (#xFA9C #xFA10) - (#xFA9B #xFA0F) - (#xFA9A #x57C7) - (#xFA99 #x57C8) - (#xFA98 #x57AC) - (#xFA97 #x5765) - (#xFA96 #x5759) - (#xFA95 #x5586) - (#xFA94 #x54FF) - (#xFA93 #x54A9) - (#xFA92 #x548A) - (#xFA91 #x549C) - (#xFA90 #xFA0E) - (#xFA8F #x53DD) - (#xFA8E #x53B2) - (#xFA8D #x5393) - (#xFA8C #x5372) - (#xFA8B #x5324) - (#xFA8A #x5307) - (#xFA89 #x5300) - (#xFA88 #x52DB) - (#xFA87 #x52C0) - (#xFA86 #x52A6) - (#xFA85 #x529C) - (#xFA84 #x5215) - (#xFA83 #x51EC) - (#xFA82 #x51BE) - (#xFA81 #x519D) - (#xFA80 #x5164) - (#xFA7E #x514A) - (#xFA7D #x50D8) - (#xFA7C #x50F4) - (#xFA7B #x5094) - (#xFA7A #x5042) - (#xFA79 #x5070) - (#xFA78 #x5046) - (#xFA77 #x501E) - (#xFA76 #x4FFF) - (#xFA75 #x5022) - (#xFA74 #x5040) - (#xFA73 #x4FCD) - (#xFA72 #x4F94) - (#xFA71 #x4F9A) - (#xFA70 #x4F8A) - (#xFA6F #x4F92) - (#xFA6E #x4F56) - (#xFA6D #x4F39) - (#xFA6C #x4F03) - (#xFA6B #x4F00) - (#xFA6A #x4EFC) - (#xFA69 #x4EE1) - (#xFA68 #x4E28) - (#xFA67 #x5F45) - (#xFA66 #x66FB) - (#xFA65 #x92F9) - (#xFA64 #x68C8) - (#xFA63 #x6631) - (#xFA62 #x70BB) - (#xFA61 #x4FC9) - (#xFA60 #x84DC) - (#xFA5F #x9288) - (#xFA5E #x9348) - (#xFA5D #x891C) - (#xFA5C #x7E8A) - (#xFA5B #x2235) - (#xFA5A #x2121) - (#xFA59 #x2116) - (#xFA58 #x3231) - (#xFA57 #xFF02) - (#xFA56 #xFF07) - (#xFA55 #xFFE4) - (#xFA54 #xFFE2) - (#xFA53 #x2169) - (#xFA52 #x2168) - (#xFA51 #x2167) - (#xFA50 #x2166) - (#xFA4F #x2165) - (#xFA4E #x2164) - (#xFA4D #x2163) - (#xFA4C #x2162) - (#xFA4B #x2161) - (#xFA4A #x2160) - (#xFA49 #x2179) - (#xFA48 #x2178) - (#xFA47 #x2177) - (#xFA46 #x2176) - (#xFA45 #x2175) - (#xFA44 #x2174) - (#xFA43 #x2173) - (#xFA42 #x2172) - (#xFA41 #x2171) - (#xFA40 #x2170) - (#xF9FC #xE757) - (#xF9FB #xE756) - (#xF9FA #xE755) - (#xF9F9 #xE754) - (#xF9F8 #xE753) - (#xF9F7 #xE752) - (#xF9F6 #xE751) - (#xF9F5 #xE750) - (#xF9F4 #xE74F) - (#xF9F3 #xE74E) - (#xF9F2 #xE74D) - (#xF9F1 #xE74C) - (#xF9F0 #xE74B) - (#xF9EF #xE74A) - (#xF9EE #xE749) - (#xF9ED #xE748) - (#xF9EC #xE747) - (#xF9EB #xE746) - (#xF9EA #xE745) - (#xF9E9 #xE744) - (#xF9E8 #xE743) - (#xF9E7 #xE742) - (#xF9E6 #xE741) - (#xF9E5 #xE740) - (#xF9E4 #xE73F) - (#xF9E3 #xE73E) - (#xF9E2 #xE73D) - (#xF9E1 #xE73C) - (#xF9E0 #xE73B) - (#xF9DF #xE73A) - (#xF9DE #xE739) - (#xF9DD #xE738) - (#xF9DC #xE737) - (#xF9DB #xE736) - (#xF9DA #xE735) - (#xF9D9 #xE734) - (#xF9D8 #xE733) - (#xF9D7 #xE732) - (#xF9D6 #xE731) - (#xF9D5 #xE730) - (#xF9D4 #xE72F) - (#xF9D3 #xE72E) - (#xF9D2 #xE72D) - (#xF9D1 #xE72C) - (#xF9D0 #xE72B) - (#xF9CF #xE72A) - (#xF9CE #xE729) - (#xF9CD #xE728) - (#xF9CC #xE727) - (#xF9CB #xE726) - (#xF9CA #xE725) - (#xF9C9 #xE724) - (#xF9C8 #xE723) - (#xF9C7 #xE722) - (#xF9C6 #xE721) - (#xF9C5 #xE720) - (#xF9C4 #xE71F) - (#xF9C3 #xE71E) - (#xF9C2 #xE71D) - (#xF9C1 #xE71C) - (#xF9C0 #xE71B) - (#xF9BF #xE71A) - (#xF9BE #xE719) - (#xF9BD #xE718) - (#xF9BC #xE717) - (#xF9BB #xE716) - (#xF9BA #xE715) - (#xF9B9 #xE714) - (#xF9B8 #xE713) - (#xF9B7 #xE712) - (#xF9B6 #xE711) - (#xF9B5 #xE710) - (#xF9B4 #xE70F) - (#xF9B3 #xE70E) - (#xF9B2 #xE70D) - (#xF9B1 #xE70C) - (#xF9B0 #xE70B) - (#xF9AF #xE70A) - (#xF9AE #xE709) - (#xF9AD #xE708) - (#xF9AC #xE707) - (#xF9AB #xE706) - (#xF9AA #xE705) - (#xF9A9 #xE704) - (#xF9A8 #xE703) - (#xF9A7 #xE702) - (#xF9A6 #xE701) - (#xF9A5 #xE700) - (#xF9A4 #xE6FF) - (#xF9A3 #xE6FE) - (#xF9A2 #xE6FD) - (#xF9A1 #xE6FC) - (#xF9A0 #xE6FB) - (#xF99F #xE6FA) - (#xF99E #xE6F9) - (#xF99D #xE6F8) - (#xF99C #xE6F7) - (#xF99B #xE6F6) - (#xF99A #xE6F5) - (#xF999 #xE6F4) - (#xF998 #xE6F3) - (#xF997 #xE6F2) - (#xF996 #xE6F1) - (#xF995 #xE6F0) - (#xF994 #xE6EF) - (#xF993 #xE6EE) - (#xF992 #xE6ED) - (#xF991 #xE6EC) - (#xF990 #xE6EB) - (#xF98F #xE6EA) - (#xF98E #xE6E9) - (#xF98D #xE6E8) - (#xF98C #xE6E7) - (#xF98B #xE6E6) - (#xF98A #xE6E5) - (#xF989 #xE6E4) - (#xF988 #xE6E3) - (#xF987 #xE6E2) - (#xF986 #xE6E1) - (#xF985 #xE6E0) - (#xF984 #xE6DF) - (#xF983 #xE6DE) - (#xF982 #xE6DD) - (#xF981 #xE6DC) - (#xF980 #xE6DB) - (#xF97E #xE6DA) - (#xF97D #xE6D9) - (#xF97C #xE6D8) - (#xF97B #xE6D7) - (#xF97A #xE6D6) - (#xF979 #xE6D5) - (#xF978 #xE6D4) - (#xF977 #xE6D3) - (#xF976 #xE6D2) - (#xF975 #xE6D1) - (#xF974 #xE6D0) - (#xF973 #xE6CF) - (#xF972 #xE6CE) - (#xF971 #xE6CD) - (#xF970 #xE6CC) - (#xF96F #xE6CB) - (#xF96E #xE6CA) - (#xF96D #xE6C9) - (#xF96C #xE6C8) - (#xF96B #xE6C7) - (#xF96A #xE6C6) - (#xF969 #xE6C5) - (#xF968 #xE6C4) - (#xF967 #xE6C3) - (#xF966 #xE6C2) - (#xF965 #xE6C1) - (#xF964 #xE6C0) - (#xF963 #xE6BF) - (#xF962 #xE6BE) - (#xF961 #xE6BD) - (#xF960 #xE6BC) - (#xF95F #xE6BB) - (#xF95E #xE6BA) - (#xF95D #xE6B9) - (#xF95C #xE6B8) - (#xF95B #xE6B7) - (#xF95A #xE6B6) - (#xF959 #xE6B5) - (#xF958 #xE6B4) - (#xF957 #xE6B3) - (#xF956 #xE6B2) - (#xF955 #xE6B1) - (#xF954 #xE6B0) - (#xF953 #xE6AF) - (#xF952 #xE6AE) - (#xF951 #xE6AD) - (#xF950 #xE6AC) - (#xF94F #xE6AB) - (#xF94E #xE6AA) - (#xF94D #xE6A9) - (#xF94C #xE6A8) - (#xF94B #xE6A7) - (#xF94A #xE6A6) - (#xF949 #xE6A5) - (#xF948 #xE6A4) - (#xF947 #xE6A3) - (#xF946 #xE6A2) - (#xF945 #xE6A1) - (#xF944 #xE6A0) - (#xF943 #xE69F) - (#xF942 #xE69E) - (#xF941 #xE69D) - (#xF940 #xE69C) - (#xF8FC #xE69B) - (#xF8FB #xE69A) - (#xF8FA #xE699) - (#xF8F9 #xE698) - (#xF8F8 #xE697) - (#xF8F7 #xE696) - (#xF8F6 #xE695) - (#xF8F5 #xE694) - (#xF8F4 #xE693) - (#xF8F3 #xE692) - (#xF8F2 #xE691) - (#xF8F1 #xE690) - (#xF8F0 #xE68F) - (#xF8EF #xE68E) - (#xF8EE #xE68D) - (#xF8ED #xE68C) - (#xF8EC #xE68B) - (#xF8EB #xE68A) - (#xF8EA #xE689) - (#xF8E9 #xE688) - (#xF8E8 #xE687) - (#xF8E7 #xE686) - (#xF8E6 #xE685) - (#xF8E5 #xE684) - (#xF8E4 #xE683) - (#xF8E3 #xE682) - (#xF8E2 #xE681) - (#xF8E1 #xE680) - (#xF8E0 #xE67F) - (#xF8DF #xE67E) - (#xF8DE #xE67D) - (#xF8DD #xE67C) - (#xF8DC #xE67B) - (#xF8DB #xE67A) - (#xF8DA #xE679) - (#xF8D9 #xE678) - (#xF8D8 #xE677) - (#xF8D7 #xE676) - (#xF8D6 #xE675) - (#xF8D5 #xE674) - (#xF8D4 #xE673) - (#xF8D3 #xE672) - (#xF8D2 #xE671) - (#xF8D1 #xE670) - (#xF8D0 #xE66F) - (#xF8CF #xE66E) - (#xF8CE #xE66D) - (#xF8CD #xE66C) - (#xF8CC #xE66B) - (#xF8CB #xE66A) - (#xF8CA #xE669) - (#xF8C9 #xE668) - (#xF8C8 #xE667) - (#xF8C7 #xE666) - (#xF8C6 #xE665) - (#xF8C5 #xE664) - (#xF8C4 #xE663) - (#xF8C3 #xE662) - (#xF8C2 #xE661) - (#xF8C1 #xE660) - (#xF8C0 #xE65F) - (#xF8BF #xE65E) - (#xF8BE #xE65D) - (#xF8BD #xE65C) - (#xF8BC #xE65B) - (#xF8BB #xE65A) - (#xF8BA #xE659) - (#xF8B9 #xE658) - (#xF8B8 #xE657) - (#xF8B7 #xE656) - (#xF8B6 #xE655) - (#xF8B5 #xE654) - (#xF8B4 #xE653) - (#xF8B3 #xE652) - (#xF8B2 #xE651) - (#xF8B1 #xE650) - (#xF8B0 #xE64F) - (#xF8AF #xE64E) - (#xF8AE #xE64D) - (#xF8AD #xE64C) - (#xF8AC #xE64B) - (#xF8AB #xE64A) - (#xF8AA #xE649) - (#xF8A9 #xE648) - (#xF8A8 #xE647) - (#xF8A7 #xE646) - (#xF8A6 #xE645) - (#xF8A5 #xE644) - (#xF8A4 #xE643) - (#xF8A3 #xE642) - (#xF8A2 #xE641) - (#xF8A1 #xE640) - (#xF8A0 #xE63F) - (#xF89F #xE63E) - (#xF89E #xE63D) - (#xF89D #xE63C) - (#xF89C #xE63B) - (#xF89B #xE63A) - (#xF89A #xE639) - (#xF899 #xE638) - (#xF898 #xE637) - (#xF897 #xE636) - (#xF896 #xE635) - (#xF895 #xE634) - (#xF894 #xE633) - (#xF893 #xE632) - (#xF892 #xE631) - (#xF891 #xE630) - (#xF890 #xE62F) - (#xF88F #xE62E) - (#xF88E #xE62D) - (#xF88D #xE62C) - (#xF88C #xE62B) - (#xF88B #xE62A) - (#xF88A #xE629) - (#xF889 #xE628) - (#xF888 #xE627) - (#xF887 #xE626) - (#xF886 #xE625) - (#xF885 #xE624) - (#xF884 #xE623) - (#xF883 #xE622) - (#xF882 #xE621) - (#xF881 #xE620) - (#xF880 #xE61F) - (#xF87E #xE61E) - (#xF87D #xE61D) - (#xF87C #xE61C) - (#xF87B #xE61B) - (#xF87A #xE61A) - (#xF879 #xE619) - (#xF878 #xE618) - (#xF877 #xE617) - (#xF876 #xE616) - (#xF875 #xE615) - (#xF874 #xE614) - (#xF873 #xE613) - (#xF872 #xE612) - (#xF871 #xE611) - (#xF870 #xE610) - (#xF86F #xE60F) - (#xF86E #xE60E) - (#xF86D #xE60D) - (#xF86C #xE60C) - (#xF86B #xE60B) - (#xF86A #xE60A) - (#xF869 #xE609) - (#xF868 #xE608) - (#xF867 #xE607) - (#xF866 #xE606) - (#xF865 #xE605) - (#xF864 #xE604) - (#xF863 #xE603) - (#xF862 #xE602) - (#xF861 #xE601) - (#xF860 #xE600) - (#xF85F #xE5FF) - (#xF85E #xE5FE) - (#xF85D #xE5FD) - (#xF85C #xE5FC) - (#xF85B #xE5FB) - (#xF85A #xE5FA) - (#xF859 #xE5F9) - (#xF858 #xE5F8) - (#xF857 #xE5F7) - (#xF856 #xE5F6) - (#xF855 #xE5F5) - (#xF854 #xE5F4) - (#xF853 #xE5F3) - (#xF852 #xE5F2) - (#xF851 #xE5F1) - (#xF850 #xE5F0) - (#xF84F #xE5EF) - (#xF84E #xE5EE) - (#xF84D #xE5ED) - (#xF84C #xE5EC) - (#xF84B #xE5EB) - (#xF84A #xE5EA) - (#xF849 #xE5E9) - (#xF848 #xE5E8) - (#xF847 #xE5E7) - (#xF846 #xE5E6) - (#xF845 #xE5E5) - (#xF844 #xE5E4) - (#xF843 #xE5E3) - (#xF842 #xE5E2) - (#xF841 #xE5E1) - (#xF840 #xE5E0) - (#xF7FC #xE5DF) - (#xF7FB #xE5DE) - (#xF7FA #xE5DD) - (#xF7F9 #xE5DC) - (#xF7F8 #xE5DB) - (#xF7F7 #xE5DA) - (#xF7F6 #xE5D9) - (#xF7F5 #xE5D8) - (#xF7F4 #xE5D7) - (#xF7F3 #xE5D6) - (#xF7F2 #xE5D5) - (#xF7F1 #xE5D4) - (#xF7F0 #xE5D3) - (#xF7EF #xE5D2) - (#xF7EE #xE5D1) - (#xF7ED #xE5D0) - (#xF7EC #xE5CF) - (#xF7EB #xE5CE) - (#xF7EA #xE5CD) - (#xF7E9 #xE5CC) - (#xF7E8 #xE5CB) - (#xF7E7 #xE5CA) - (#xF7E6 #xE5C9) - (#xF7E5 #xE5C8) - (#xF7E4 #xE5C7) - (#xF7E3 #xE5C6) - (#xF7E2 #xE5C5) - (#xF7E1 #xE5C4) - (#xF7E0 #xE5C3) - (#xF7DF #xE5C2) - (#xF7DE #xE5C1) - (#xF7DD #xE5C0) - (#xF7DC #xE5BF) - (#xF7DB #xE5BE) - (#xF7DA #xE5BD) - (#xF7D9 #xE5BC) - (#xF7D8 #xE5BB) - (#xF7D7 #xE5BA) - (#xF7D6 #xE5B9) - (#xF7D5 #xE5B8) - (#xF7D4 #xE5B7) - (#xF7D3 #xE5B6) - (#xF7D2 #xE5B5) - (#xF7D1 #xE5B4) - (#xF7D0 #xE5B3) - (#xF7CF #xE5B2) - (#xF7CE #xE5B1) - (#xF7CD #xE5B0) - (#xF7CC #xE5AF) - (#xF7CB #xE5AE) - (#xF7CA #xE5AD) - (#xF7C9 #xE5AC) - (#xF7C8 #xE5AB) - (#xF7C7 #xE5AA) - (#xF7C6 #xE5A9) - (#xF7C5 #xE5A8) - (#xF7C4 #xE5A7) - (#xF7C3 #xE5A6) - (#xF7C2 #xE5A5) - (#xF7C1 #xE5A4) - (#xF7C0 #xE5A3) - (#xF7BF #xE5A2) - (#xF7BE #xE5A1) - (#xF7BD #xE5A0) - (#xF7BC #xE59F) - (#xF7BB #xE59E) - (#xF7BA #xE59D) - (#xF7B9 #xE59C) - (#xF7B8 #xE59B) - (#xF7B7 #xE59A) - (#xF7B6 #xE599) - (#xF7B5 #xE598) - (#xF7B4 #xE597) - (#xF7B3 #xE596) - (#xF7B2 #xE595) - (#xF7B1 #xE594) - (#xF7B0 #xE593) - (#xF7AF #xE592) - (#xF7AE #xE591) - (#xF7AD #xE590) - (#xF7AC #xE58F) - (#xF7AB #xE58E) - (#xF7AA #xE58D) - (#xF7A9 #xE58C) - (#xF7A8 #xE58B) - (#xF7A7 #xE58A) - (#xF7A6 #xE589) - (#xF7A5 #xE588) - (#xF7A4 #xE587) - (#xF7A3 #xE586) - (#xF7A2 #xE585) - (#xF7A1 #xE584) - (#xF7A0 #xE583) - (#xF79F #xE582) - (#xF79E #xE581) - (#xF79D #xE580) - (#xF79C #xE57F) - (#xF79B #xE57E) - (#xF79A #xE57D) - (#xF799 #xE57C) - (#xF798 #xE57B) - (#xF797 #xE57A) - (#xF796 #xE579) - (#xF795 #xE578) - (#xF794 #xE577) - (#xF793 #xE576) - (#xF792 #xE575) - (#xF791 #xE574) - (#xF790 #xE573) - (#xF78F #xE572) - (#xF78E #xE571) - (#xF78D #xE570) - (#xF78C #xE56F) - (#xF78B #xE56E) - (#xF78A #xE56D) - (#xF789 #xE56C) - (#xF788 #xE56B) - (#xF787 #xE56A) - (#xF786 #xE569) - (#xF785 #xE568) - (#xF784 #xE567) - (#xF783 #xE566) - (#xF782 #xE565) - (#xF781 #xE564) - (#xF780 #xE563) - (#xF77E #xE562) - (#xF77D #xE561) - (#xF77C #xE560) - (#xF77B #xE55F) - (#xF77A #xE55E) - (#xF779 #xE55D) - (#xF778 #xE55C) - (#xF777 #xE55B) - (#xF776 #xE55A) - (#xF775 #xE559) - (#xF774 #xE558) - (#xF773 #xE557) - (#xF772 #xE556) - (#xF771 #xE555) - (#xF770 #xE554) - (#xF76F #xE553) - (#xF76E #xE552) - (#xF76D #xE551) - (#xF76C #xE550) - (#xF76B #xE54F) - (#xF76A #xE54E) - (#xF769 #xE54D) - (#xF768 #xE54C) - (#xF767 #xE54B) - (#xF766 #xE54A) - (#xF765 #xE549) - (#xF764 #xE548) - (#xF763 #xE547) - (#xF762 #xE546) - (#xF761 #xE545) - (#xF760 #xE544) - (#xF75F #xE543) - (#xF75E #xE542) - (#xF75D #xE541) - (#xF75C #xE540) - (#xF75B #xE53F) - (#xF75A #xE53E) - (#xF759 #xE53D) - (#xF758 #xE53C) - (#xF757 #xE53B) - (#xF756 #xE53A) - (#xF755 #xE539) - (#xF754 #xE538) - (#xF753 #xE537) - (#xF752 #xE536) - (#xF751 #xE535) - (#xF750 #xE534) - (#xF74F #xE533) - (#xF74E #xE532) - (#xF74D #xE531) - (#xF74C #xE530) - (#xF74B #xE52F) - (#xF74A #xE52E) - (#xF749 #xE52D) - (#xF748 #xE52C) - (#xF747 #xE52B) - (#xF746 #xE52A) - (#xF745 #xE529) - (#xF744 #xE528) - (#xF743 #xE527) - (#xF742 #xE526) - (#xF741 #xE525) - (#xF740 #xE524) - (#xF6FC #xE523) - (#xF6FB #xE522) - (#xF6FA #xE521) - (#xF6F9 #xE520) - (#xF6F8 #xE51F) - (#xF6F7 #xE51E) - (#xF6F6 #xE51D) - (#xF6F5 #xE51C) - (#xF6F4 #xE51B) - (#xF6F3 #xE51A) - (#xF6F2 #xE519) - (#xF6F1 #xE518) - (#xF6F0 #xE517) - (#xF6EF #xE516) - (#xF6EE #xE515) - (#xF6ED #xE514) - (#xF6EC #xE513) - (#xF6EB #xE512) - (#xF6EA #xE511) - (#xF6E9 #xE510) - (#xF6E8 #xE50F) - (#xF6E7 #xE50E) - (#xF6E6 #xE50D) - (#xF6E5 #xE50C) - (#xF6E4 #xE50B) - (#xF6E3 #xE50A) - (#xF6E2 #xE509) - (#xF6E1 #xE508) - (#xF6E0 #xE507) - (#xF6DF #xE506) - (#xF6DE #xE505) - (#xF6DD #xE504) - (#xF6DC #xE503) - (#xF6DB #xE502) - (#xF6DA #xE501) - (#xF6D9 #xE500) - (#xF6D8 #xE4FF) - (#xF6D7 #xE4FE) - (#xF6D6 #xE4FD) - (#xF6D5 #xE4FC) - (#xF6D4 #xE4FB) - (#xF6D3 #xE4FA) - (#xF6D2 #xE4F9) - (#xF6D1 #xE4F8) - (#xF6D0 #xE4F7) - (#xF6CF #xE4F6) - (#xF6CE #xE4F5) - (#xF6CD #xE4F4) - (#xF6CC #xE4F3) - (#xF6CB #xE4F2) - (#xF6CA #xE4F1) - (#xF6C9 #xE4F0) - (#xF6C8 #xE4EF) - (#xF6C7 #xE4EE) - (#xF6C6 #xE4ED) - (#xF6C5 #xE4EC) - (#xF6C4 #xE4EB) - (#xF6C3 #xE4EA) - (#xF6C2 #xE4E9) - (#xF6C1 #xE4E8) - (#xF6C0 #xE4E7) - (#xF6BF #xE4E6) - (#xF6BE #xE4E5) - (#xF6BD #xE4E4) - (#xF6BC #xE4E3) - (#xF6BB #xE4E2) - (#xF6BA #xE4E1) - (#xF6B9 #xE4E0) - (#xF6B8 #xE4DF) - (#xF6B7 #xE4DE) - (#xF6B6 #xE4DD) - (#xF6B5 #xE4DC) - (#xF6B4 #xE4DB) - (#xF6B3 #xE4DA) - (#xF6B2 #xE4D9) - (#xF6B1 #xE4D8) - (#xF6B0 #xE4D7) - (#xF6AF #xE4D6) - (#xF6AE #xE4D5) - (#xF6AD #xE4D4) - (#xF6AC #xE4D3) - (#xF6AB #xE4D2) - (#xF6AA #xE4D1) - (#xF6A9 #xE4D0) - (#xF6A8 #xE4CF) - (#xF6A7 #xE4CE) - (#xF6A6 #xE4CD) - (#xF6A5 #xE4CC) - (#xF6A4 #xE4CB) - (#xF6A3 #xE4CA) - (#xF6A2 #xE4C9) - (#xF6A1 #xE4C8) - (#xF6A0 #xE4C7) - (#xF69F #xE4C6) - (#xF69E #xE4C5) - (#xF69D #xE4C4) - (#xF69C #xE4C3) - (#xF69B #xE4C2) - (#xF69A #xE4C1) - (#xF699 #xE4C0) - (#xF698 #xE4BF) - (#xF697 #xE4BE) - (#xF696 #xE4BD) - (#xF695 #xE4BC) - (#xF694 #xE4BB) - (#xF693 #xE4BA) - (#xF692 #xE4B9) - (#xF691 #xE4B8) - (#xF690 #xE4B7) - (#xF68F #xE4B6) - (#xF68E #xE4B5) - (#xF68D #xE4B4) - (#xF68C #xE4B3) - (#xF68B #xE4B2) - (#xF68A #xE4B1) - (#xF689 #xE4B0) - (#xF688 #xE4AF) - (#xF687 #xE4AE) - (#xF686 #xE4AD) - (#xF685 #xE4AC) - (#xF684 #xE4AB) - (#xF683 #xE4AA) - (#xF682 #xE4A9) - (#xF681 #xE4A8) - (#xF680 #xE4A7) - (#xF67E #xE4A6) - (#xF67D #xE4A5) - (#xF67C #xE4A4) - (#xF67B #xE4A3) - (#xF67A #xE4A2) - (#xF679 #xE4A1) - (#xF678 #xE4A0) - (#xF677 #xE49F) - (#xF676 #xE49E) - (#xF675 #xE49D) - (#xF674 #xE49C) - (#xF673 #xE49B) - (#xF672 #xE49A) - (#xF671 #xE499) - (#xF670 #xE498) - (#xF66F #xE497) - (#xF66E #xE496) - (#xF66D #xE495) - (#xF66C #xE494) - (#xF66B #xE493) - (#xF66A #xE492) - (#xF669 #xE491) - (#xF668 #xE490) - (#xF667 #xE48F) - (#xF666 #xE48E) - (#xF665 #xE48D) - (#xF664 #xE48C) - (#xF663 #xE48B) - (#xF662 #xE48A) - (#xF661 #xE489) - (#xF660 #xE488) - (#xF65F #xE487) - (#xF65E #xE486) - (#xF65D #xE485) - (#xF65C #xE484) - (#xF65B #xE483) - (#xF65A #xE482) - (#xF659 #xE481) - (#xF658 #xE480) - (#xF657 #xE47F) - (#xF656 #xE47E) - (#xF655 #xE47D) - (#xF654 #xE47C) - (#xF653 #xE47B) - (#xF652 #xE47A) - (#xF651 #xE479) - (#xF650 #xE478) - (#xF64F #xE477) - (#xF64E #xE476) - (#xF64D #xE475) - (#xF64C #xE474) - (#xF64B #xE473) - (#xF64A #xE472) - (#xF649 #xE471) - (#xF648 #xE470) - (#xF647 #xE46F) - (#xF646 #xE46E) - (#xF645 #xE46D) - (#xF644 #xE46C) - (#xF643 #xE46B) - (#xF642 #xE46A) - (#xF641 #xE469) - (#xF640 #xE468) - (#xF5FC #xE467) - (#xF5FB #xE466) - (#xF5FA #xE465) - (#xF5F9 #xE464) - (#xF5F8 #xE463) - (#xF5F7 #xE462) - (#xF5F6 #xE461) - (#xF5F5 #xE460) - (#xF5F4 #xE45F) - (#xF5F3 #xE45E) - (#xF5F2 #xE45D) - (#xF5F1 #xE45C) - (#xF5F0 #xE45B) - (#xF5EF #xE45A) - (#xF5EE #xE459) - (#xF5ED #xE458) - (#xF5EC #xE457) - (#xF5EB #xE456) - (#xF5EA #xE455) - (#xF5E9 #xE454) - (#xF5E8 #xE453) - (#xF5E7 #xE452) - (#xF5E6 #xE451) - (#xF5E5 #xE450) - (#xF5E4 #xE44F) - (#xF5E3 #xE44E) - (#xF5E2 #xE44D) - (#xF5E1 #xE44C) - (#xF5E0 #xE44B) - (#xF5DF #xE44A) - (#xF5DE #xE449) - (#xF5DD #xE448) - (#xF5DC #xE447) - (#xF5DB #xE446) - (#xF5DA #xE445) - (#xF5D9 #xE444) - (#xF5D8 #xE443) - (#xF5D7 #xE442) - (#xF5D6 #xE441) - (#xF5D5 #xE440) - (#xF5D4 #xE43F) - (#xF5D3 #xE43E) - (#xF5D2 #xE43D) - (#xF5D1 #xE43C) - (#xF5D0 #xE43B) - (#xF5CF #xE43A) - (#xF5CE #xE439) - (#xF5CD #xE438) - (#xF5CC #xE437) - (#xF5CB #xE436) - (#xF5CA #xE435) - (#xF5C9 #xE434) - (#xF5C8 #xE433) - (#xF5C7 #xE432) - (#xF5C6 #xE431) - (#xF5C5 #xE430) - (#xF5C4 #xE42F) - (#xF5C3 #xE42E) - (#xF5C2 #xE42D) - (#xF5C1 #xE42C) - (#xF5C0 #xE42B) - (#xF5BF #xE42A) - (#xF5BE #xE429) - (#xF5BD #xE428) - (#xF5BC #xE427) - (#xF5BB #xE426) - (#xF5BA #xE425) - (#xF5B9 #xE424) - (#xF5B8 #xE423) - (#xF5B7 #xE422) - (#xF5B6 #xE421) - (#xF5B5 #xE420) - (#xF5B4 #xE41F) - (#xF5B3 #xE41E) - (#xF5B2 #xE41D) - (#xF5B1 #xE41C) - (#xF5B0 #xE41B) - (#xF5AF #xE41A) - (#xF5AE #xE419) - (#xF5AD #xE418) - (#xF5AC #xE417) - (#xF5AB #xE416) - (#xF5AA #xE415) - (#xF5A9 #xE414) - (#xF5A8 #xE413) - (#xF5A7 #xE412) - (#xF5A6 #xE411) - (#xF5A5 #xE410) - (#xF5A4 #xE40F) - (#xF5A3 #xE40E) - (#xF5A2 #xE40D) - (#xF5A1 #xE40C) - (#xF5A0 #xE40B) - (#xF59F #xE40A) - (#xF59E #xE409) - (#xF59D #xE408) - (#xF59C #xE407) - (#xF59B #xE406) - (#xF59A #xE405) - (#xF599 #xE404) - (#xF598 #xE403) - (#xF597 #xE402) - (#xF596 #xE401) - (#xF595 #xE400) - (#xF594 #xE3FF) - (#xF593 #xE3FE) - (#xF592 #xE3FD) - (#xF591 #xE3FC) - (#xF590 #xE3FB) - (#xF58F #xE3FA) - (#xF58E #xE3F9) - (#xF58D #xE3F8) - (#xF58C #xE3F7) - (#xF58B #xE3F6) - (#xF58A #xE3F5) - (#xF589 #xE3F4) - (#xF588 #xE3F3) - (#xF587 #xE3F2) - (#xF586 #xE3F1) - (#xF585 #xE3F0) - (#xF584 #xE3EF) - (#xF583 #xE3EE) - (#xF582 #xE3ED) - (#xF581 #xE3EC) - (#xF580 #xE3EB) - (#xF57E #xE3EA) - (#xF57D #xE3E9) - (#xF57C #xE3E8) - (#xF57B #xE3E7) - (#xF57A #xE3E6) - (#xF579 #xE3E5) - (#xF578 #xE3E4) - (#xF577 #xE3E3) - (#xF576 #xE3E2) - (#xF575 #xE3E1) - (#xF574 #xE3E0) - (#xF573 #xE3DF) - (#xF572 #xE3DE) - (#xF571 #xE3DD) - (#xF570 #xE3DC) - (#xF56F #xE3DB) - (#xF56E #xE3DA) - (#xF56D #xE3D9) - (#xF56C #xE3D8) - (#xF56B #xE3D7) - (#xF56A #xE3D6) - (#xF569 #xE3D5) - (#xF568 #xE3D4) - (#xF567 #xE3D3) - (#xF566 #xE3D2) - (#xF565 #xE3D1) - (#xF564 #xE3D0) - (#xF563 #xE3CF) - (#xF562 #xE3CE) - (#xF561 #xE3CD) - (#xF560 #xE3CC) - (#xF55F #xE3CB) - (#xF55E #xE3CA) - (#xF55D #xE3C9) - (#xF55C #xE3C8) - (#xF55B #xE3C7) - (#xF55A #xE3C6) - (#xF559 #xE3C5) - (#xF558 #xE3C4) - (#xF557 #xE3C3) - (#xF556 #xE3C2) - (#xF555 #xE3C1) - (#xF554 #xE3C0) - (#xF553 #xE3BF) - (#xF552 #xE3BE) - (#xF551 #xE3BD) - (#xF550 #xE3BC) - (#xF54F #xE3BB) - (#xF54E #xE3BA) - (#xF54D #xE3B9) - (#xF54C #xE3B8) - (#xF54B #xE3B7) - (#xF54A #xE3B6) - (#xF549 #xE3B5) - (#xF548 #xE3B4) - (#xF547 #xE3B3) - (#xF546 #xE3B2) - (#xF545 #xE3B1) - (#xF544 #xE3B0) - (#xF543 #xE3AF) - (#xF542 #xE3AE) - (#xF541 #xE3AD) - (#xF540 #xE3AC) - (#xF4FC #xE3AB) - (#xF4FB #xE3AA) - (#xF4FA #xE3A9) - (#xF4F9 #xE3A8) - (#xF4F8 #xE3A7) - (#xF4F7 #xE3A6) - (#xF4F6 #xE3A5) - (#xF4F5 #xE3A4) - (#xF4F4 #xE3A3) - (#xF4F3 #xE3A2) - (#xF4F2 #xE3A1) - (#xF4F1 #xE3A0) - (#xF4F0 #xE39F) - (#xF4EF #xE39E) - (#xF4EE #xE39D) - (#xF4ED #xE39C) - (#xF4EC #xE39B) - (#xF4EB #xE39A) - (#xF4EA #xE399) - (#xF4E9 #xE398) - (#xF4E8 #xE397) - (#xF4E7 #xE396) - (#xF4E6 #xE395) - (#xF4E5 #xE394) - (#xF4E4 #xE393) - (#xF4E3 #xE392) - (#xF4E2 #xE391) - (#xF4E1 #xE390) - (#xF4E0 #xE38F) - (#xF4DF #xE38E) - (#xF4DE #xE38D) - (#xF4DD #xE38C) - (#xF4DC #xE38B) - (#xF4DB #xE38A) - (#xF4DA #xE389) - (#xF4D9 #xE388) - (#xF4D8 #xE387) - (#xF4D7 #xE386) - (#xF4D6 #xE385) - (#xF4D5 #xE384) - (#xF4D4 #xE383) - (#xF4D3 #xE382) - (#xF4D2 #xE381) - (#xF4D1 #xE380) - (#xF4D0 #xE37F) - (#xF4CF #xE37E) - (#xF4CE #xE37D) - (#xF4CD #xE37C) - (#xF4CC #xE37B) - (#xF4CB #xE37A) - (#xF4CA #xE379) - (#xF4C9 #xE378) - (#xF4C8 #xE377) - (#xF4C7 #xE376) - (#xF4C6 #xE375) - (#xF4C5 #xE374) - (#xF4C4 #xE373) - (#xF4C3 #xE372) - (#xF4C2 #xE371) - (#xF4C1 #xE370) - (#xF4C0 #xE36F) - (#xF4BF #xE36E) - (#xF4BE #xE36D) - (#xF4BD #xE36C) - (#xF4BC #xE36B) - (#xF4BB #xE36A) - (#xF4BA #xE369) - (#xF4B9 #xE368) - (#xF4B8 #xE367) - (#xF4B7 #xE366) - (#xF4B6 #xE365) - (#xF4B5 #xE364) - (#xF4B4 #xE363) - (#xF4B3 #xE362) - (#xF4B2 #xE361) - (#xF4B1 #xE360) - (#xF4B0 #xE35F) - (#xF4AF #xE35E) - (#xF4AE #xE35D) - (#xF4AD #xE35C) - (#xF4AC #xE35B) - (#xF4AB #xE35A) - (#xF4AA #xE359) - (#xF4A9 #xE358) - (#xF4A8 #xE357) - (#xF4A7 #xE356) - (#xF4A6 #xE355) - (#xF4A5 #xE354) - (#xF4A4 #xE353) - (#xF4A3 #xE352) - (#xF4A2 #xE351) - (#xF4A1 #xE350) - (#xF4A0 #xE34F) - (#xF49F #xE34E) - (#xF49E #xE34D) - (#xF49D #xE34C) - (#xF49C #xE34B) - (#xF49B #xE34A) - (#xF49A #xE349) - (#xF499 #xE348) - (#xF498 #xE347) - (#xF497 #xE346) - (#xF496 #xE345) - (#xF495 #xE344) - (#xF494 #xE343) - (#xF493 #xE342) - (#xF492 #xE341) - (#xF491 #xE340) - (#xF490 #xE33F) - (#xF48F #xE33E) - (#xF48E #xE33D) - (#xF48D #xE33C) - (#xF48C #xE33B) - (#xF48B #xE33A) - (#xF48A #xE339) - (#xF489 #xE338) - (#xF488 #xE337) - (#xF487 #xE336) - (#xF486 #xE335) - (#xF485 #xE334) - (#xF484 #xE333) - (#xF483 #xE332) - (#xF482 #xE331) - (#xF481 #xE330) - (#xF480 #xE32F) - (#xF47E #xE32E) - (#xF47D #xE32D) - (#xF47C #xE32C) - (#xF47B #xE32B) - (#xF47A #xE32A) - (#xF479 #xE329) - (#xF478 #xE328) - (#xF477 #xE327) - (#xF476 #xE326) - (#xF475 #xE325) - (#xF474 #xE324) - (#xF473 #xE323) - (#xF472 #xE322) - (#xF471 #xE321) - (#xF470 #xE320) - (#xF46F #xE31F) - (#xF46E #xE31E) - (#xF46D #xE31D) - (#xF46C #xE31C) - (#xF46B #xE31B) - (#xF46A #xE31A) - (#xF469 #xE319) - (#xF468 #xE318) - (#xF467 #xE317) - (#xF466 #xE316) - (#xF465 #xE315) - (#xF464 #xE314) - (#xF463 #xE313) - (#xF462 #xE312) - (#xF461 #xE311) - (#xF460 #xE310) - (#xF45F #xE30F) - (#xF45E #xE30E) - (#xF45D #xE30D) - (#xF45C #xE30C) - (#xF45B #xE30B) - (#xF45A #xE30A) - (#xF459 #xE309) - (#xF458 #xE308) - (#xF457 #xE307) - (#xF456 #xE306) - (#xF455 #xE305) - (#xF454 #xE304) - (#xF453 #xE303) - (#xF452 #xE302) - (#xF451 #xE301) - (#xF450 #xE300) - (#xF44F #xE2FF) - (#xF44E #xE2FE) - (#xF44D #xE2FD) - (#xF44C #xE2FC) - (#xF44B #xE2FB) - (#xF44A #xE2FA) - (#xF449 #xE2F9) - (#xF448 #xE2F8) - (#xF447 #xE2F7) - (#xF446 #xE2F6) - (#xF445 #xE2F5) - (#xF444 #xE2F4) - (#xF443 #xE2F3) - (#xF442 #xE2F2) - (#xF441 #xE2F1) - (#xF440 #xE2F0) - (#xF3FC #xE2EF) - (#xF3FB #xE2EE) - (#xF3FA #xE2ED) - (#xF3F9 #xE2EC) - (#xF3F8 #xE2EB) - (#xF3F7 #xE2EA) - (#xF3F6 #xE2E9) - (#xF3F5 #xE2E8) - (#xF3F4 #xE2E7) - (#xF3F3 #xE2E6) - (#xF3F2 #xE2E5) - (#xF3F1 #xE2E4) - (#xF3F0 #xE2E3) - (#xF3EF #xE2E2) - (#xF3EE #xE2E1) - (#xF3ED #xE2E0) - (#xF3EC #xE2DF) - (#xF3EB #xE2DE) - (#xF3EA #xE2DD) - (#xF3E9 #xE2DC) - (#xF3E8 #xE2DB) - (#xF3E7 #xE2DA) - (#xF3E6 #xE2D9) - (#xF3E5 #xE2D8) - (#xF3E4 #xE2D7) - (#xF3E3 #xE2D6) - (#xF3E2 #xE2D5) - (#xF3E1 #xE2D4) - (#xF3E0 #xE2D3) - (#xF3DF #xE2D2) - (#xF3DE #xE2D1) - (#xF3DD #xE2D0) - (#xF3DC #xE2CF) - (#xF3DB #xE2CE) - (#xF3DA #xE2CD) - (#xF3D9 #xE2CC) - (#xF3D8 #xE2CB) - (#xF3D7 #xE2CA) - (#xF3D6 #xE2C9) - (#xF3D5 #xE2C8) - (#xF3D4 #xE2C7) - (#xF3D3 #xE2C6) - (#xF3D2 #xE2C5) - (#xF3D1 #xE2C4) - (#xF3D0 #xE2C3) - (#xF3CF #xE2C2) - (#xF3CE #xE2C1) - (#xF3CD #xE2C0) - (#xF3CC #xE2BF) - (#xF3CB #xE2BE) - (#xF3CA #xE2BD) - (#xF3C9 #xE2BC) - (#xF3C8 #xE2BB) - (#xF3C7 #xE2BA) - (#xF3C6 #xE2B9) - (#xF3C5 #xE2B8) - (#xF3C4 #xE2B7) - (#xF3C3 #xE2B6) - (#xF3C2 #xE2B5) - (#xF3C1 #xE2B4) - (#xF3C0 #xE2B3) - (#xF3BF #xE2B2) - (#xF3BE #xE2B1) - (#xF3BD #xE2B0) - (#xF3BC #xE2AF) - (#xF3BB #xE2AE) - (#xF3BA #xE2AD) - (#xF3B9 #xE2AC) - (#xF3B8 #xE2AB) - (#xF3B7 #xE2AA) - (#xF3B6 #xE2A9) - (#xF3B5 #xE2A8) - (#xF3B4 #xE2A7) - (#xF3B3 #xE2A6) - (#xF3B2 #xE2A5) - (#xF3B1 #xE2A4) - (#xF3B0 #xE2A3) - (#xF3AF #xE2A2) - (#xF3AE #xE2A1) - (#xF3AD #xE2A0) - (#xF3AC #xE29F) - (#xF3AB #xE29E) - (#xF3AA #xE29D) - (#xF3A9 #xE29C) - (#xF3A8 #xE29B) - (#xF3A7 #xE29A) - (#xF3A6 #xE299) - (#xF3A5 #xE298) - (#xF3A4 #xE297) - (#xF3A3 #xE296) - (#xF3A2 #xE295) - (#xF3A1 #xE294) - (#xF3A0 #xE293) - (#xF39F #xE292) - (#xF39E #xE291) - (#xF39D #xE290) - (#xF39C #xE28F) - (#xF39B #xE28E) - (#xF39A #xE28D) - (#xF399 #xE28C) - (#xF398 #xE28B) - (#xF397 #xE28A) - (#xF396 #xE289) - (#xF395 #xE288) - (#xF394 #xE287) - (#xF393 #xE286) - (#xF392 #xE285) - (#xF391 #xE284) - (#xF390 #xE283) - (#xF38F #xE282) - (#xF38E #xE281) - (#xF38D #xE280) - (#xF38C #xE27F) - (#xF38B #xE27E) - (#xF38A #xE27D) - (#xF389 #xE27C) - (#xF388 #xE27B) - (#xF387 #xE27A) - (#xF386 #xE279) - (#xF385 #xE278) - (#xF384 #xE277) - (#xF383 #xE276) - (#xF382 #xE275) - (#xF381 #xE274) - (#xF380 #xE273) - (#xF37E #xE272) - (#xF37D #xE271) - (#xF37C #xE270) - (#xF37B #xE26F) - (#xF37A #xE26E) - (#xF379 #xE26D) - (#xF378 #xE26C) - (#xF377 #xE26B) - (#xF376 #xE26A) - (#xF375 #xE269) - (#xF374 #xE268) - (#xF373 #xE267) - (#xF372 #xE266) - (#xF371 #xE265) - (#xF370 #xE264) - (#xF36F #xE263) - (#xF36E #xE262) - (#xF36D #xE261) - (#xF36C #xE260) - (#xF36B #xE25F) - (#xF36A #xE25E) - (#xF369 #xE25D) - (#xF368 #xE25C) - (#xF367 #xE25B) - (#xF366 #xE25A) - (#xF365 #xE259) - (#xF364 #xE258) - (#xF363 #xE257) - (#xF362 #xE256) - (#xF361 #xE255) - (#xF360 #xE254) - (#xF35F #xE253) - (#xF35E #xE252) - (#xF35D #xE251) - (#xF35C #xE250) - (#xF35B #xE24F) - (#xF35A #xE24E) - (#xF359 #xE24D) - (#xF358 #xE24C) - (#xF357 #xE24B) - (#xF356 #xE24A) - (#xF355 #xE249) - (#xF354 #xE248) - (#xF353 #xE247) - (#xF352 #xE246) - (#xF351 #xE245) - (#xF350 #xE244) - (#xF34F #xE243) - (#xF34E #xE242) - (#xF34D #xE241) - (#xF34C #xE240) - (#xF34B #xE23F) - (#xF34A #xE23E) - (#xF349 #xE23D) - (#xF348 #xE23C) - (#xF347 #xE23B) - (#xF346 #xE23A) - (#xF345 #xE239) - (#xF344 #xE238) - (#xF343 #xE237) - (#xF342 #xE236) - (#xF341 #xE235) - (#xF340 #xE234) - (#xF2FC #xE233) - (#xF2FB #xE232) - (#xF2FA #xE231) - (#xF2F9 #xE230) - (#xF2F8 #xE22F) - (#xF2F7 #xE22E) - (#xF2F6 #xE22D) - (#xF2F5 #xE22C) - (#xF2F4 #xE22B) - (#xF2F3 #xE22A) - (#xF2F2 #xE229) - (#xF2F1 #xE228) - (#xF2F0 #xE227) - (#xF2EF #xE226) - (#xF2EE #xE225) - (#xF2ED #xE224) - (#xF2EC #xE223) - (#xF2EB #xE222) - (#xF2EA #xE221) - (#xF2E9 #xE220) - (#xF2E8 #xE21F) - (#xF2E7 #xE21E) - (#xF2E6 #xE21D) - (#xF2E5 #xE21C) - (#xF2E4 #xE21B) - (#xF2E3 #xE21A) - (#xF2E2 #xE219) - (#xF2E1 #xE218) - (#xF2E0 #xE217) - (#xF2DF #xE216) - (#xF2DE #xE215) - (#xF2DD #xE214) - (#xF2DC #xE213) - (#xF2DB #xE212) - (#xF2DA #xE211) - (#xF2D9 #xE210) - (#xF2D8 #xE20F) - (#xF2D7 #xE20E) - (#xF2D6 #xE20D) - (#xF2D5 #xE20C) - (#xF2D4 #xE20B) - (#xF2D3 #xE20A) - (#xF2D2 #xE209) - (#xF2D1 #xE208) - (#xF2D0 #xE207) - (#xF2CF #xE206) - (#xF2CE #xE205) - (#xF2CD #xE204) - (#xF2CC #xE203) - (#xF2CB #xE202) - (#xF2CA #xE201) - (#xF2C9 #xE200) - (#xF2C8 #xE1FF) - (#xF2C7 #xE1FE) - (#xF2C6 #xE1FD) - (#xF2C5 #xE1FC) - (#xF2C4 #xE1FB) - (#xF2C3 #xE1FA) - (#xF2C2 #xE1F9) - (#xF2C1 #xE1F8) - (#xF2C0 #xE1F7) - (#xF2BF #xE1F6) - (#xF2BE #xE1F5) - (#xF2BD #xE1F4) - (#xF2BC #xE1F3) - (#xF2BB #xE1F2) - (#xF2BA #xE1F1) - (#xF2B9 #xE1F0) - (#xF2B8 #xE1EF) - (#xF2B7 #xE1EE) - (#xF2B6 #xE1ED) - (#xF2B5 #xE1EC) - (#xF2B4 #xE1EB) - (#xF2B3 #xE1EA) - (#xF2B2 #xE1E9) - (#xF2B1 #xE1E8) - (#xF2B0 #xE1E7) - (#xF2AF #xE1E6) - (#xF2AE #xE1E5) - (#xF2AD #xE1E4) - (#xF2AC #xE1E3) - (#xF2AB #xE1E2) - (#xF2AA #xE1E1) - (#xF2A9 #xE1E0) - (#xF2A8 #xE1DF) - (#xF2A7 #xE1DE) - (#xF2A6 #xE1DD) - (#xF2A5 #xE1DC) - (#xF2A4 #xE1DB) - (#xF2A3 #xE1DA) - (#xF2A2 #xE1D9) - (#xF2A1 #xE1D8) - (#xF2A0 #xE1D7) - (#xF29F #xE1D6) - (#xF29E #xE1D5) - (#xF29D #xE1D4) - (#xF29C #xE1D3) - (#xF29B #xE1D2) - (#xF29A #xE1D1) - (#xF299 #xE1D0) - (#xF298 #xE1CF) - (#xF297 #xE1CE) - (#xF296 #xE1CD) - (#xF295 #xE1CC) - (#xF294 #xE1CB) - (#xF293 #xE1CA) - (#xF292 #xE1C9) - (#xF291 #xE1C8) - (#xF290 #xE1C7) - (#xF28F #xE1C6) - (#xF28E #xE1C5) - (#xF28D #xE1C4) - (#xF28C #xE1C3) - (#xF28B #xE1C2) - (#xF28A #xE1C1) - (#xF289 #xE1C0) - (#xF288 #xE1BF) - (#xF287 #xE1BE) - (#xF286 #xE1BD) - (#xF285 #xE1BC) - (#xF284 #xE1BB) - (#xF283 #xE1BA) - (#xF282 #xE1B9) - (#xF281 #xE1B8) - (#xF280 #xE1B7) - (#xF27E #xE1B6) - (#xF27D #xE1B5) - (#xF27C #xE1B4) - (#xF27B #xE1B3) - (#xF27A #xE1B2) - (#xF279 #xE1B1) - (#xF278 #xE1B0) - (#xF277 #xE1AF) - (#xF276 #xE1AE) - (#xF275 #xE1AD) - (#xF274 #xE1AC) - (#xF273 #xE1AB) - (#xF272 #xE1AA) - (#xF271 #xE1A9) - (#xF270 #xE1A8) - (#xF26F #xE1A7) - (#xF26E #xE1A6) - (#xF26D #xE1A5) - (#xF26C #xE1A4) - (#xF26B #xE1A3) - (#xF26A #xE1A2) - (#xF269 #xE1A1) - (#xF268 #xE1A0) - (#xF267 #xE19F) - (#xF266 #xE19E) - (#xF265 #xE19D) - (#xF264 #xE19C) - (#xF263 #xE19B) - (#xF262 #xE19A) - (#xF261 #xE199) - (#xF260 #xE198) - (#xF25F #xE197) - (#xF25E #xE196) - (#xF25D #xE195) - (#xF25C #xE194) - (#xF25B #xE193) - (#xF25A #xE192) - (#xF259 #xE191) - (#xF258 #xE190) - (#xF257 #xE18F) - (#xF256 #xE18E) - (#xF255 #xE18D) - (#xF254 #xE18C) - (#xF253 #xE18B) - (#xF252 #xE18A) - (#xF251 #xE189) - (#xF250 #xE188) - (#xF24F #xE187) - (#xF24E #xE186) - (#xF24D #xE185) - (#xF24C #xE184) - (#xF24B #xE183) - (#xF24A #xE182) - (#xF249 #xE181) - (#xF248 #xE180) - (#xF247 #xE17F) - (#xF246 #xE17E) - (#xF245 #xE17D) - (#xF244 #xE17C) - (#xF243 #xE17B) - (#xF242 #xE17A) - (#xF241 #xE179) - (#xF240 #xE178) - (#xF1FC #xE177) - (#xF1FB #xE176) - (#xF1FA #xE175) - (#xF1F9 #xE174) - (#xF1F8 #xE173) - (#xF1F7 #xE172) - (#xF1F6 #xE171) - (#xF1F5 #xE170) - (#xF1F4 #xE16F) - (#xF1F3 #xE16E) - (#xF1F2 #xE16D) - (#xF1F1 #xE16C) - (#xF1F0 #xE16B) - (#xF1EF #xE16A) - (#xF1EE #xE169) - (#xF1ED #xE168) - (#xF1EC #xE167) - (#xF1EB #xE166) - (#xF1EA #xE165) - (#xF1E9 #xE164) - (#xF1E8 #xE163) - (#xF1E7 #xE162) - (#xF1E6 #xE161) - (#xF1E5 #xE160) - (#xF1E4 #xE15F) - (#xF1E3 #xE15E) - (#xF1E2 #xE15D) - (#xF1E1 #xE15C) - (#xF1E0 #xE15B) - (#xF1DF #xE15A) - (#xF1DE #xE159) - (#xF1DD #xE158) - (#xF1DC #xE157) - (#xF1DB #xE156) - (#xF1DA #xE155) - (#xF1D9 #xE154) - (#xF1D8 #xE153) - (#xF1D7 #xE152) - (#xF1D6 #xE151) - (#xF1D5 #xE150) - (#xF1D4 #xE14F) - (#xF1D3 #xE14E) - (#xF1D2 #xE14D) - (#xF1D1 #xE14C) - (#xF1D0 #xE14B) - (#xF1CF #xE14A) - (#xF1CE #xE149) - (#xF1CD #xE148) - (#xF1CC #xE147) - (#xF1CB #xE146) - (#xF1CA #xE145) - (#xF1C9 #xE144) - (#xF1C8 #xE143) - (#xF1C7 #xE142) - (#xF1C6 #xE141) - (#xF1C5 #xE140) - (#xF1C4 #xE13F) - (#xF1C3 #xE13E) - (#xF1C2 #xE13D) - (#xF1C1 #xE13C) - (#xF1C0 #xE13B) - (#xF1BF #xE13A) - (#xF1BE #xE139) - (#xF1BD #xE138) - (#xF1BC #xE137) - (#xF1BB #xE136) - (#xF1BA #xE135) - (#xF1B9 #xE134) - (#xF1B8 #xE133) - (#xF1B7 #xE132) - (#xF1B6 #xE131) - (#xF1B5 #xE130) - (#xF1B4 #xE12F) - (#xF1B3 #xE12E) - (#xF1B2 #xE12D) - (#xF1B1 #xE12C) - (#xF1B0 #xE12B) - (#xF1AF #xE12A) - (#xF1AE #xE129) - (#xF1AD #xE128) - (#xF1AC #xE127) - (#xF1AB #xE126) - (#xF1AA #xE125) - (#xF1A9 #xE124) - (#xF1A8 #xE123) - (#xF1A7 #xE122) - (#xF1A6 #xE121) - (#xF1A5 #xE120) - (#xF1A4 #xE11F) - (#xF1A3 #xE11E) - (#xF1A2 #xE11D) - (#xF1A1 #xE11C) - (#xF1A0 #xE11B) - (#xF19F #xE11A) - (#xF19E #xE119) - (#xF19D #xE118) - (#xF19C #xE117) - (#xF19B #xE116) - (#xF19A #xE115) - (#xF199 #xE114) - (#xF198 #xE113) - (#xF197 #xE112) - (#xF196 #xE111) - (#xF195 #xE110) - (#xF194 #xE10F) - (#xF193 #xE10E) - (#xF192 #xE10D) - (#xF191 #xE10C) - (#xF190 #xE10B) - (#xF18F #xE10A) - (#xF18E #xE109) - (#xF18D #xE108) - (#xF18C #xE107) - (#xF18B #xE106) - (#xF18A #xE105) - (#xF189 #xE104) - (#xF188 #xE103) - (#xF187 #xE102) - (#xF186 #xE101) - (#xF185 #xE100) - (#xF184 #xE0FF) - (#xF183 #xE0FE) - (#xF182 #xE0FD) - (#xF181 #xE0FC) - (#xF180 #xE0FB) - (#xF17E #xE0FA) - (#xF17D #xE0F9) - (#xF17C #xE0F8) - (#xF17B #xE0F7) - (#xF17A #xE0F6) - (#xF179 #xE0F5) - (#xF178 #xE0F4) - (#xF177 #xE0F3) - (#xF176 #xE0F2) - (#xF175 #xE0F1) - (#xF174 #xE0F0) - (#xF173 #xE0EF) - (#xF172 #xE0EE) - (#xF171 #xE0ED) - (#xF170 #xE0EC) - (#xF16F #xE0EB) - (#xF16E #xE0EA) - (#xF16D #xE0E9) - (#xF16C #xE0E8) - (#xF16B #xE0E7) - (#xF16A #xE0E6) - (#xF169 #xE0E5) - (#xF168 #xE0E4) - (#xF167 #xE0E3) - (#xF166 #xE0E2) - (#xF165 #xE0E1) - (#xF164 #xE0E0) - (#xF163 #xE0DF) - (#xF162 #xE0DE) - (#xF161 #xE0DD) - (#xF160 #xE0DC) - (#xF15F #xE0DB) - (#xF15E #xE0DA) - (#xF15D #xE0D9) - (#xF15C #xE0D8) - (#xF15B #xE0D7) - (#xF15A #xE0D6) - (#xF159 #xE0D5) - (#xF158 #xE0D4) - (#xF157 #xE0D3) - (#xF156 #xE0D2) - (#xF155 #xE0D1) - (#xF154 #xE0D0) - (#xF153 #xE0CF) - (#xF152 #xE0CE) - (#xF151 #xE0CD) - (#xF150 #xE0CC) - (#xF14F #xE0CB) - (#xF14E #xE0CA) - (#xF14D #xE0C9) - (#xF14C #xE0C8) - (#xF14B #xE0C7) - (#xF14A #xE0C6) - (#xF149 #xE0C5) - (#xF148 #xE0C4) - (#xF147 #xE0C3) - (#xF146 #xE0C2) - (#xF145 #xE0C1) - (#xF144 #xE0C0) - (#xF143 #xE0BF) - (#xF142 #xE0BE) - (#xF141 #xE0BD) - (#xF140 #xE0BC) - (#xF0FC #xE0BB) - (#xF0FB #xE0BA) - (#xF0FA #xE0B9) - (#xF0F9 #xE0B8) - (#xF0F8 #xE0B7) - (#xF0F7 #xE0B6) - (#xF0F6 #xE0B5) - (#xF0F5 #xE0B4) - (#xF0F4 #xE0B3) - (#xF0F3 #xE0B2) - (#xF0F2 #xE0B1) - (#xF0F1 #xE0B0) - (#xF0F0 #xE0AF) - (#xF0EF #xE0AE) - (#xF0EE #xE0AD) - (#xF0ED #xE0AC) - (#xF0EC #xE0AB) - (#xF0EB #xE0AA) - (#xF0EA #xE0A9) - (#xF0E9 #xE0A8) - (#xF0E8 #xE0A7) - (#xF0E7 #xE0A6) - (#xF0E6 #xE0A5) - (#xF0E5 #xE0A4) - (#xF0E4 #xE0A3) - (#xF0E3 #xE0A2) - (#xF0E2 #xE0A1) - (#xF0E1 #xE0A0) - (#xF0E0 #xE09F) - (#xF0DF #xE09E) - (#xF0DE #xE09D) - (#xF0DD #xE09C) - (#xF0DC #xE09B) - (#xF0DB #xE09A) - (#xF0DA #xE099) - (#xF0D9 #xE098) - (#xF0D8 #xE097) - (#xF0D7 #xE096) - (#xF0D6 #xE095) - (#xF0D5 #xE094) - (#xF0D4 #xE093) - (#xF0D3 #xE092) - (#xF0D2 #xE091) - (#xF0D1 #xE090) - (#xF0D0 #xE08F) - (#xF0CF #xE08E) - (#xF0CE #xE08D) - (#xF0CD #xE08C) - (#xF0CC #xE08B) - (#xF0CB #xE08A) - (#xF0CA #xE089) - (#xF0C9 #xE088) - (#xF0C8 #xE087) - (#xF0C7 #xE086) - (#xF0C6 #xE085) - (#xF0C5 #xE084) - (#xF0C4 #xE083) - (#xF0C3 #xE082) - (#xF0C2 #xE081) - (#xF0C1 #xE080) - (#xF0C0 #xE07F) - (#xF0BF #xE07E) - (#xF0BE #xE07D) - (#xF0BD #xE07C) - (#xF0BC #xE07B) - (#xF0BB #xE07A) - (#xF0BA #xE079) - (#xF0B9 #xE078) - (#xF0B8 #xE077) - (#xF0B7 #xE076) - (#xF0B6 #xE075) - (#xF0B5 #xE074) - (#xF0B4 #xE073) - (#xF0B3 #xE072) - (#xF0B2 #xE071) - (#xF0B1 #xE070) - (#xF0B0 #xE06F) - (#xF0AF #xE06E) - (#xF0AE #xE06D) - (#xF0AD #xE06C) - (#xF0AC #xE06B) - (#xF0AB #xE06A) - (#xF0AA #xE069) - (#xF0A9 #xE068) - (#xF0A8 #xE067) - (#xF0A7 #xE066) - (#xF0A6 #xE065) - (#xF0A5 #xE064) - (#xF0A4 #xE063) - (#xF0A3 #xE062) - (#xF0A2 #xE061) - (#xF0A1 #xE060) - (#xF0A0 #xE05F) - (#xF09F #xE05E) - (#xF09E #xE05D) - (#xF09D #xE05C) - (#xF09C #xE05B) - (#xF09B #xE05A) - (#xF09A #xE059) - (#xF099 #xE058) - (#xF098 #xE057) - (#xF097 #xE056) - (#xF096 #xE055) - (#xF095 #xE054) - (#xF094 #xE053) - (#xF093 #xE052) - (#xF092 #xE051) - (#xF091 #xE050) - (#xF090 #xE04F) - (#xF08F #xE04E) - (#xF08E #xE04D) - (#xF08D #xE04C) - (#xF08C #xE04B) - (#xF08B #xE04A) - (#xF08A #xE049) - (#xF089 #xE048) - (#xF088 #xE047) - (#xF087 #xE046) - (#xF086 #xE045) - (#xF085 #xE044) - (#xF084 #xE043) - (#xF083 #xE042) - (#xF082 #xE041) - (#xF081 #xE040) - (#xF080 #xE03F) - (#xF07E #xE03E) - (#xF07D #xE03D) - (#xF07C #xE03C) - (#xF07B #xE03B) - (#xF07A #xE03A) - (#xF079 #xE039) - (#xF078 #xE038) - (#xF077 #xE037) - (#xF076 #xE036) - (#xF075 #xE035) - (#xF074 #xE034) - (#xF073 #xE033) - (#xF072 #xE032) - (#xF071 #xE031) - (#xF070 #xE030) - (#xF06F #xE02F) - (#xF06E #xE02E) - (#xF06D #xE02D) - (#xF06C #xE02C) - (#xF06B #xE02B) - (#xF06A #xE02A) - (#xF069 #xE029) - (#xF068 #xE028) - (#xF067 #xE027) - (#xF066 #xE026) - (#xF065 #xE025) - (#xF064 #xE024) - (#xF063 #xE023) - (#xF062 #xE022) - (#xF061 #xE021) - (#xF060 #xE020) - (#xF05F #xE01F) - (#xF05E #xE01E) - (#xF05D #xE01D) - (#xF05C #xE01C) - (#xF05B #xE01B) - (#xF05A #xE01A) - (#xF059 #xE019) - (#xF058 #xE018) - (#xF057 #xE017) - (#xF056 #xE016) - (#xF055 #xE015) - (#xF054 #xE014) - (#xF053 #xE013) - (#xF052 #xE012) - (#xF051 #xE011) - (#xF050 #xE010) - (#xF04F #xE00F) - (#xF04E #xE00E) - (#xF04D #xE00D) - (#xF04C #xE00C) - (#xF04B #xE00B) - (#xF04A #xE00A) - (#xF049 #xE009) - (#xF048 #xE008) - (#xF047 #xE007) - (#xF046 #xE006) - (#xF045 #xE005) - (#xF044 #xE004) - (#xF043 #xE003) - (#xF042 #xE002) - (#xF041 #xE001) - (#xF040 #xE000) - (#xEEFC #xFF02) - (#xEEFB #xFF07) - (#xEEFA #xFFE4) - (#xEEF9 #xFFE2) - (#xEEF8 #x2179) - (#xEEF7 #x2178) - (#xEEF6 #x2177) - (#xEEF5 #x2176) - (#xEEF4 #x2175) - (#xEEF3 #x2174) - (#xEEF2 #x2173) - (#xEEF1 #x2172) - (#xEEF0 #x2171) - (#xEEEF #x2170) - (#xEEEC #x9ED1) - (#xEEEB #x9E19) - (#xEEEA #xFA2D) - (#xEEE9 #x9D6B) - (#xEEE8 #x9D70) - (#xEEE7 #x9C00) - (#xEEE6 #x9BBB) - (#xEEE5 #x9BB1) - (#xEEE4 #x9B8F) - (#xEEE3 #x9B72) - (#xEEE2 #x9B75) - (#xEEE1 #x9ADC) - (#xEEE0 #x9AD9) - (#xEEDF #x9A4E) - (#xEEDE #x999E) - (#xEEDD #xFA2C) - (#xEEDC #x9927) - (#xEEDB #xFA2B) - (#xEEDA #xFA2A) - (#xEED9 #x9865) - (#xEED8 #x9857) - (#xEED7 #x9755) - (#xEED6 #x9751) - (#xEED5 #x974F) - (#xEED4 #x974D) - (#xEED3 #x9743) - (#xEED2 #x973B) - (#xEED1 #x9733) - (#xEED0 #x96AF) - (#xEECF #x969D) - (#xEECE #xFA29) - (#xEECD #xF9DC) - (#xEECC #x9592) - (#xEECB #x9448) - (#xEECA #x9445) - (#xEEC9 #x9431) - (#xEEC8 #x93F8) - (#xEEC7 #x93DE) - (#xEEC6 #x93C6) - (#xEEC5 #x93A4) - (#xEEC4 #x9357) - (#xEEC3 #x9370) - (#xEEC2 #x9302) - (#xEEC1 #x931D) - (#xEEC0 #x92FF) - (#xEEBF #x931E) - (#xEEBE #xFA28) - (#xEEBD #x92FB) - (#xEEBC #x9321) - (#xEEBB #x9325) - (#xEEBA #x92D3) - (#xEEB9 #x92E0) - (#xEEB8 #x92D5) - (#xEEB7 #xFA27) - (#xEEB6 #x92D0) - (#xEEB5 #x92D9) - (#xEEB4 #x92D7) - (#xEEB3 #x92E7) - (#xEEB2 #x9278) - (#xEEB1 #x9277) - (#xEEB0 #x92A7) - (#xEEAF #x9267) - (#xEEAE #x9239) - (#xEEAD #x9251) - (#xEEAC #x9259) - (#xEEAB #x924E) - (#xEEAA #x923C) - (#xEEA9 #x9240) - (#xEEA8 #x923A) - (#xEEA7 #x920A) - (#xEEA6 #x9210) - (#xEEA5 #x9206) - (#xEEA4 #x91E5) - (#xEEA3 #x91E4) - (#xEEA2 #x91EE) - (#xEEA1 #x91ED) - (#xEEA0 #x91DE) - (#xEE9F #x91D7) - (#xEE9E #x91DA) - (#xEE9D #x9127) - (#xEE9C #x9115) - (#xEE9B #xFA26) - (#xEE9A #x90DE) - (#xEE99 #x9067) - (#xEE98 #xFA25) - (#xEE97 #xFA24) - (#xEE96 #x8ECF) - (#xEE95 #xFA23) - (#xEE94 #x8D76) - (#xEE93 #x8D12) - (#xEE92 #x8CF4) - (#xEE91 #x8CF0) - (#xEE90 #x8B7F) - (#xEE8F #x8B53) - (#xEE8E #x8AF6) - (#xEE8D #xFA22) - (#xEE8C #x8ADF) - (#xEE8B #x8ABE) - (#xEE8A #x8AA7) - (#xEE89 #x8A79) - (#xEE88 #x8A37) - (#xEE87 #x8A12) - (#xEE86 #x88F5) - (#xEE85 #x8807) - (#xEE84 #xFA21) - (#xEE83 #xFA20) - (#xEE82 #x85B0) - (#xEE81 #xFA1F) - (#xEE80 #x856B) - (#xEE7E #x8559) - (#xEE7D #x8553) - (#xEE7C #x84B4) - (#xEE7B #x8448) - (#xEE7A #x83F6) - (#xEE79 #x83C7) - (#xEE78 #x837F) - (#xEE77 #x8362) - (#xEE76 #x8301) - (#xEE75 #xFA1E) - (#xEE74 #x7FA1) - (#xEE73 #x7F47) - (#xEE72 #x7E52) - (#xEE71 #x7DD6) - (#xEE70 #x7DA0) - (#xEE6F #x7DB7) - (#xEE6E #x7D5C) - (#xEE6D #x7D48) - (#xEE6C #xFA1D) - (#xEE6B #x7B9E) - (#xEE6A #x7AEB) - (#xEE69 #xFA1C) - (#xEE68 #x7AE7) - (#xEE67 #x7AD1) - (#xEE66 #x799B) - (#xEE65 #xFA1B) - (#xEE64 #x7994) - (#xEE63 #xFA1A) - (#xEE62 #xFA19) - (#xEE61 #xFA18) - (#xEE60 #x7930) - (#xEE5F #x787A) - (#xEE5E #x7864) - (#xEE5D #x784E) - (#xEE5C #x7821) - (#xEE5B #x52AF) - (#xEE5A #x7746) - (#xEE59 #xFA17) - (#xEE58 #x76A6) - (#xEE57 #x769B) - (#xEE56 #x769E) - (#xEE55 #x769C) - (#xEE54 #x7682) - (#xEE53 #x756F) - (#xEE52 #x7501) - (#xEE51 #x749F) - (#xEE50 #x7489) - (#xEE4F #x7462) - (#xEE4E #x742E) - (#xEE4D #x7429) - (#xEE4C #x742A) - (#xEE4B #x7426) - (#xEE4A #x73F5) - (#xEE49 #x7407) - (#xEE48 #x73D2) - (#xEE47 #x73E3) - (#xEE46 #x73D6) - (#xEE45 #x73C9) - (#xEE44 #x73BD) - (#xEE43 #x7377) - (#xEE42 #xFA16) - (#xEE41 #x7324) - (#xEE40 #x72BE) - (#xEDFC #x72B1) - (#xEDFB #x71FE) - (#xEDFA #x71C1) - (#xEDF9 #xFA15) - (#xEDF8 #x7147) - (#xEDF7 #x7146) - (#xEDF6 #x715C) - (#xEDF5 #x7104) - (#xEDF4 #x710F) - (#xEDF3 #x70AB) - (#xEDF2 #x7085) - (#xEDF1 #x7028) - (#xEDF0 #x7007) - (#xEDEF #x7005) - (#xEDEE #x6FF5) - (#xEDED #x6FB5) - (#xEDEC #x6F88) - (#xEDEB #x6EBF) - (#xEDEA #x6E3C) - (#xEDE9 #x6E27) - (#xEDE8 #x6E5C) - (#xEDE7 #x6E39) - (#xEDE6 #x6DFC) - (#xEDE5 #x6DF2) - (#xEDE4 #x6DF8) - (#xEDE3 #x6DCF) - (#xEDE2 #x6DAC) - (#xEDE1 #x6D96) - (#xEDE0 #x6D6F) - (#xEDDF #x6D87) - (#xEDDE #x6D04) - (#xEDDD #x6CDA) - (#xEDDC #x6C6F) - (#xEDDB #x6C86) - (#xEDDA #x6C5C) - (#xEDD9 #x6C3F) - (#xEDD8 #x6BD6) - (#xEDD7 #x6AE4) - (#xEDD6 #x6AE2) - (#xEDD5 #x6A7E) - (#xEDD4 #x6A73) - (#xEDD3 #x6A46) - (#xEDD2 #x6A6B) - (#xEDD1 #x6A30) - (#xEDD0 #x69E2) - (#xEDCF #x6998) - (#xEDCE #xFA14) - (#xEDCD #x6968) - (#xEDCC #xFA13) - (#xEDCB #x68CF) - (#xEDCA #x6844) - (#xEDC9 #x6801) - (#xEDC8 #x67C0) - (#xEDC7 #x6852) - (#xEDC6 #x67BB) - (#xEDC5 #x6766) - (#xEDC4 #xF929) - (#xEDC3 #x670E) - (#xEDC2 #x66FA) - (#xEDC1 #x66BF) - (#xEDC0 #x66B2) - (#xEDBF #x66A0) - (#xEDBE #x6699) - (#xEDBD #x6673) - (#xEDBC #xFA12) - (#xEDBB #x6659) - (#xEDBA #x6657) - (#xEDB9 #x6665) - (#xEDB8 #x6624) - (#xEDB7 #x661E) - (#xEDB6 #x662E) - (#xEDB5 #x6609) - (#xEDB4 #x663B) - (#xEDB3 #x6615) - (#xEDB2 #x6600) - (#xEDB1 #x654E) - (#xEDB0 #x64CE) - (#xEDAF #x649D) - (#xEDAE #x6460) - (#xEDAD #x63F5) - (#xEDAC #x62A6) - (#xEDAB #x6213) - (#xEDAA #x6198) - (#xEDA9 #x6130) - (#xEDA8 #x6137) - (#xEDA7 #x6111) - (#xEDA6 #x60F2) - (#xEDA5 #x6120) - (#xEDA4 #x60D5) - (#xEDA3 #x60DE) - (#xEDA2 #x608A) - (#xEDA1 #x6085) - (#xEDA0 #x605D) - (#xED9F #x5FDE) - (#xED9E #x5FB7) - (#xED9D #x5F67) - (#xED9C #x5F34) - (#xED9B #x5F21) - (#xED9A #x5DD0) - (#xED99 #x5DB9) - (#xED98 #x5DB8) - (#xED97 #x5D6D) - (#xED96 #x5D42) - (#xED95 #xFA11) - (#xED94 #x5D53) - (#xED93 #x5D27) - (#xED92 #x5CF5) - (#xED91 #x5CBA) - (#xED90 #x5CA6) - (#xED8F #x5C1E) - (#xED8E #x5BEC) - (#xED8D #x5BD8) - (#xED8C #x752F) - (#xED8B #x5BC0) - (#xED8A #x5B56) - (#xED89 #x59BA) - (#xED88 #x59A4) - (#xED87 #x5963) - (#xED86 #x595D) - (#xED85 #x595B) - (#xED84 #x5953) - (#xED83 #x590B) - (#xED82 #x58B2) - (#xED81 #x589E) - (#xED80 #xFA10) - (#xED7E #xFA0F) - (#xED7D #x57C7) - (#xED7C #x57C8) - (#xED7B #x57AC) - (#xED7A #x5765) - (#xED79 #x5759) - (#xED78 #x5586) - (#xED77 #x54FF) - (#xED76 #x54A9) - (#xED75 #x548A) - (#xED74 #x549C) - (#xED73 #xFA0E) - (#xED72 #x53DD) - (#xED71 #x53B2) - (#xED70 #x5393) - (#xED6F #x5372) - (#xED6E #x5324) - (#xED6D #x5307) - (#xED6C #x5300) - (#xED6B #x52DB) - (#xED6A #x52C0) - (#xED69 #x52A6) - (#xED68 #x529C) - (#xED67 #x5215) - (#xED66 #x51EC) - (#xED65 #x51BE) - (#xED64 #x519D) - (#xED63 #x5164) - (#xED62 #x514A) - (#xED61 #x50D8) - (#xED60 #x50F4) - (#xED5F #x5094) - (#xED5E #x5042) - (#xED5D #x5070) - (#xED5C #x5046) - (#xED5B #x501E) - (#xED5A #x4FFF) - (#xED59 #x5022) - (#xED58 #x5040) - (#xED57 #x4FCD) - (#xED56 #x4F94) - (#xED55 #x4F9A) - (#xED54 #x4F8A) - (#xED53 #x4F92) - (#xED52 #x4F56) - (#xED51 #x4F39) - (#xED50 #x4F03) - (#xED4F #x4F00) - (#xED4E #x4EFC) - (#xED4D #x4EE1) - (#xED4C #x4E28) - (#xED4B #x5F45) - (#xED4A #x66FB) - (#xED49 #x92F9) - (#xED48 #x68C8) - (#xED47 #x6631) - (#xED46 #x70BB) - (#xED45 #x4FC9) - (#xED44 #x84DC) - (#xED43 #x9288) - (#xED42 #x9348) - (#xED41 #x891C) - (#xED40 #x7E8A) - (#xEA9E #x9FA0) - (#xEA40 #x9D5D) - (#xE99E #x9AF7) - (#xE940 #x9871) - (#xE89E #x965E) - (#xE840 #x9319) - (#xE79E #x8FF8) - (#xE740 #x8E47) - (#xE69E #x8B6B) - (#xE640 #x8966) - (#xE59E #x8759) - (#xE540 #x8541) - (#xE49E #x82D9) - (#xE440 #x968B) - (#xE39E #x7F3A) - (#xE340 #x7D02) - (#xE29E #x7B50) - (#xE240 #x78E7) - (#xE19E #x7670) - (#xE140 #x74E0) - (#xE09E #x71FC) - (#xE040 #x6F3E) - (#x9F9E #x6CBE) - (#x9F40 #x6A97) - (#x9E9E #x68CD) - (#x9E40 #x66C4) - (#x9D9E #x64BC) - (#x9D40 #x621E) - (#x9C9E #x609A) - (#x9C40 #x5ED6) - (#x9B9E #x5C53) - (#x9B40 #x5978) - (#x9A9E #x5709) - (#x9A40 #x54AB) - (#x999E #x8FA8) - (#x9940 #x50C9) - (#x9840 #x84EE) - (#x979E #x7483) - (#x9740 #x8AED) - (#x969E #x6E80) - (#x9640 #x6CD5) - (#x959E #x670D) - (#x9540 #x9F3B) - (#x949E #x9EA6) - (#x9440 #x5982) - (#x939E #x5230) - (#x9340 #x90B8) - (#x929E #x5BF5) - (#x9240 #x53E9) - (#x919E #x618E) - (#x9140 #x7E4A) - (#x909E #x88FE) - (#x9040 #x62ED) - (#x8F9E #x511F) - (#x8F40 #x5B97) - (#x8E9E #x6642) - (#x8E40 #x5BDF) - (#x8D9E #x8FBC) - (#x8D40 #x540E) - (#x8C9E #x6372) - (#x8C40 #x6398) - (#x8B9E #x4EAC) - (#x8B40 #x6A5F) - (#x8A9E #x8431) - (#x8A40 #x9B41) - (#x899E #x5FDC) - (#x8940 #x9662) - (#x879C #x222A) - (#x879B #x2229) - (#x879A #x2235) - (#x8799 #x22BF) - (#x8798 #x221F) - (#x8797 #x2220) - (#x8796 #x22A5) - (#x8795 #x221A) - (#x8794 #x2211) - (#x8793 #x222E) - (#x8792 #x222B) - (#x8791 #x2261) - (#x8790 #x2252) - (#x878F #x337C) - (#x878E #x337D) - (#x878D #x337E) - (#x878C #x3239) - (#x878B #x3232) - (#x878A #x3231) - (#x8789 #x32A8) - (#x8788 #x32A7) - (#x8787 #x32A6) - (#x8786 #x32A5) - (#x8785 #x32A4) - (#x8784 #x2121) - (#x8783 #x33CD) - (#x8782 #x2116) - (#x8781 #x301F) - (#x8780 #x301D) - (#x877E #x337B) - (#x8775 #x33A1) - (#x8774 #x33C4) - (#x8773 #x338F) - (#x8772 #x338E) - (#x8771 #x339E) - (#x8770 #x339D) - (#x876F #x339C) - (#x876E #x333B) - (#x876D #x334A) - (#x876C #x332B) - (#x876B #x3323) - (#x876A #x3326) - (#x8769 #x330D) - (#x8768 #x3357) - (#x8767 #x3351) - (#x8766 #x3336) - (#x8765 #x3303) - (#x8764 #x3327) - (#x8763 #x3318) - (#x8762 #x334D) - (#x8761 #x3322) - (#x8760 #x3314) - (#x875F #x3349) - (#x875D #x2169) - (#x875C #x2168) - (#x875B #x2167) - (#x875A #x2166) - (#x8759 #x2165) - (#x8758 #x2164) - (#x8757 #x2163) - (#x8756 #x2162) - (#x8755 #x2161) - (#x8754 #x2160) - (#x8753 #x2473) - (#x8752 #x2472) - (#x8751 #x2471) - (#x8750 #x2470) - (#x874F #x246F) - (#x874E #x246E) - (#x874D #x246D) - (#x874C #x246C) - (#x874B #x246B) - (#x874A #x246A) - (#x8749 #x2469) - (#x8748 #x2468) - (#x8747 #x2467) - (#x8746 #x2466) - (#x8745 #x2465) - (#x8744 #x2464) - (#x8743 #x2463) - (#x8742 #x2462) - (#x8741 #x2461) - (#x8740 #x2460) - (#x8440 #x410) - (#x8340 #x30A1) - (#x819E #x25C7) - (#x8140 #x3000) - )) - -(defvar *eucjp-only* - '((#xFEFE #xE3AB) - (#xFEFD #xE3AA) - (#xFEFC #xE3A9) - (#xFEFB #xE3A8) - (#xFEFA #xE3A7) - (#xFEF9 #xE3A6) - (#xFEF8 #xE3A5) - (#xFEF7 #xE3A4) - (#xFEF6 #xE3A3) - (#xFEF5 #xE3A2) - (#xFEF4 #xE3A1) - (#xFEF3 #xE3A0) - (#xFEF2 #xE39F) - (#xFEF1 #xE39E) - (#xFEF0 #xE39D) - (#xFEEF #xE39C) - (#xFEEE #xE39B) - (#xFEED #xE39A) - (#xFEEC #xE399) - (#xFEEB #xE398) - (#xFEEA #xE397) - (#xFEE9 #xE396) - (#xFEE8 #xE395) - (#xFEE7 #xE394) - (#xFEE6 #xE393) - (#xFEE5 #xE392) - (#xFEE4 #xE391) - (#xFEE3 #xE390) - (#xFEE2 #xE38F) - (#xFEE1 #xE38E) - (#xFEE0 #xE38D) - (#xFEDF #xE38C) - (#xFEDE #xE38B) - (#xFEDD #xE38A) - (#xFEDC #xE389) - (#xFEDB #xE388) - (#xFEDA #xE387) - (#xFED9 #xE386) - (#xFED8 #xE385) - (#xFED7 #xE384) - (#xFED6 #xE383) - (#xFED5 #xE382) - (#xFED4 #xE381) - (#xFED3 #xE380) - (#xFED2 #xE37F) - (#xFED1 #xE37E) - (#xFED0 #xE37D) - (#xFECF #xE37C) - (#xFECE #xE37B) - (#xFECD #xE37A) - (#xFECC #xE379) - (#xFECB #xE378) - (#xFECA #xE377) - (#xFEC9 #xE376) - (#xFEC8 #xE375) - (#xFEC7 #xE374) - (#xFEC6 #xE373) - (#xFEC5 #xE372) - (#xFEC4 #xE371) - (#xFEC3 #xE370) - (#xFEC2 #xE36F) - (#xFEC1 #xE36E) - (#xFEC0 #xE36D) - (#xFEBF #xE36C) - (#xFEBE #xE36B) - (#xFEBD #xE36A) - (#xFEBC #xE369) - (#xFEBB #xE368) - (#xFEBA #xE367) - (#xFEB9 #xE366) - (#xFEB8 #xE365) - (#xFEB7 #xE364) - (#xFEB6 #xE363) - (#xFEB5 #xE362) - (#xFEB4 #xE361) - (#xFEB3 #xE360) - (#xFEB2 #xE35F) - (#xFEB1 #xE35E) - (#xFEB0 #xE35D) - (#xFEAF #xE35C) - (#xFEAE #xE35B) - (#xFEAD #xE35A) - (#xFEAC #xE359) - (#xFEAB #xE358) - (#xFEAA #xE357) - (#xFEA9 #xE356) - (#xFEA8 #xE355) - (#xFEA7 #xE354) - (#xFEA6 #xE353) - (#xFEA5 #xE352) - (#xFEA4 #xE351) - (#xFEA3 #xE350) - (#xFEA2 #xE34F) - (#xFEA1 #xE34E) - (#xFDFE #xE34D) - (#xFDFD #xE34C) - (#xFDFC #xE34B) - (#xFDFB #xE34A) - (#xFDFA #xE349) - (#xFDF9 #xE348) - (#xFDF8 #xE347) - (#xFDF7 #xE346) - (#xFDF6 #xE345) - (#xFDF5 #xE344) - (#xFDF4 #xE343) - (#xFDF3 #xE342) - (#xFDF2 #xE341) - (#xFDF1 #xE340) - (#xFDF0 #xE33F) - (#xFDEF #xE33E) - (#xFDEE #xE33D) - (#xFDED #xE33C) - (#xFDEC #xE33B) - (#xFDEB #xE33A) - (#xFDEA #xE339) - (#xFDE9 #xE338) - (#xFDE8 #xE337) - (#xFDE7 #xE336) - (#xFDE6 #xE335) - (#xFDE5 #xE334) - (#xFDE4 #xE333) - (#xFDE3 #xE332) - (#xFDE2 #xE331) - (#xFDE1 #xE330) - (#xFDE0 #xE32F) - (#xFDDF #xE32E) - (#xFDDE #xE32D) - (#xFDDD #xE32C) - (#xFDDC #xE32B) - (#xFDDB #xE32A) - (#xFDDA #xE329) - (#xFDD9 #xE328) - (#xFDD8 #xE327) - (#xFDD7 #xE326) - (#xFDD6 #xE325) - (#xFDD5 #xE324) - (#xFDD4 #xE323) - (#xFDD3 #xE322) - (#xFDD2 #xE321) - (#xFDD1 #xE320) - (#xFDD0 #xE31F) - (#xFDCF #xE31E) - (#xFDCE #xE31D) - (#xFDCD #xE31C) - (#xFDCC #xE31B) - (#xFDCB #xE31A) - (#xFDCA #xE319) - (#xFDC9 #xE318) - (#xFDC8 #xE317) - (#xFDC7 #xE316) - (#xFDC6 #xE315) - (#xFDC5 #xE314) - (#xFDC4 #xE313) - (#xFDC3 #xE312) - (#xFDC2 #xE311) - (#xFDC1 #xE310) - (#xFDC0 #xE30F) - (#xFDBF #xE30E) - (#xFDBE #xE30D) - (#xFDBD #xE30C) - (#xFDBC #xE30B) - (#xFDBB #xE30A) - (#xFDBA #xE309) - (#xFDB9 #xE308) - (#xFDB8 #xE307) - (#xFDB7 #xE306) - (#xFDB6 #xE305) - (#xFDB5 #xE304) - (#xFDB4 #xE303) - (#xFDB3 #xE302) - (#xFDB2 #xE301) - (#xFDB1 #xE300) - (#xFDB0 #xE2FF) - (#xFDAF #xE2FE) - (#xFDAE #xE2FD) - (#xFDAD #xE2FC) - (#xFDAC #xE2FB) - (#xFDAB #xE2FA) - (#xFDAA #xE2F9) - (#xFDA9 #xE2F8) - (#xFDA8 #xE2F7) - (#xFDA7 #xE2F6) - (#xFDA6 #xE2F5) - (#xFDA5 #xE2F4) - (#xFDA4 #xE2F3) - (#xFDA3 #xE2F2) - (#xFDA2 #xE2F1) - (#xFDA1 #xE2F0) - (#xFCFE #xE2EF) - (#xFCFD #xE2EE) - (#xFCFC #xE2ED) - (#xFCFB #xE2EC) - (#xFCFA #xE2EB) - (#xFCF9 #xE2EA) - (#xFCF8 #xE2E9) - (#xFCF7 #xE2E8) - (#xFCF6 #xE2E7) - (#xFCF5 #xE2E6) - (#xFCF4 #xE2E5) - (#xFCF3 #xE2E4) - (#xFCF2 #xE2E3) - (#xFCF1 #xE2E2) - (#xFCF0 #xE2E1) - (#xFCEF #xE2E0) - (#xFCEE #xE2DF) - (#xFCED #xE2DE) - (#xFCEC #xE2DD) - (#xFCEB #xE2DC) - (#xFCEA #xE2DB) - (#xFCE9 #xE2DA) - (#xFCE8 #xE2D9) - (#xFCE7 #xE2D8) - (#xFCE6 #xE2D7) - (#xFCE5 #xE2D6) - (#xFCE4 #xE2D5) - (#xFCE3 #xE2D4) - (#xFCE2 #xE2D3) - (#xFCE1 #xE2D2) - (#xFCE0 #xE2D1) - (#xFCDF #xE2D0) - (#xFCDE #xE2CF) - (#xFCDD #xE2CE) - (#xFCDC #xE2CD) - (#xFCDB #xE2CC) - (#xFCDA #xE2CB) - (#xFCD9 #xE2CA) - (#xFCD8 #xE2C9) - (#xFCD7 #xE2C8) - (#xFCD6 #xE2C7) - (#xFCD5 #xE2C6) - (#xFCD4 #xE2C5) - (#xFCD3 #xE2C4) - (#xFCD2 #xE2C3) - (#xFCD1 #xE2C2) - (#xFCD0 #xE2C1) - (#xFCCF #xE2C0) - (#xFCCE #xE2BF) - (#xFCCD #xE2BE) - (#xFCCC #xE2BD) - (#xFCCB #xE2BC) - (#xFCCA #xE2BB) - (#xFCC9 #xE2BA) - (#xFCC8 #xE2B9) - (#xFCC7 #xE2B8) - (#xFCC6 #xE2B7) - (#xFCC5 #xE2B6) - (#xFCC4 #xE2B5) - (#xFCC3 #xE2B4) - (#xFCC2 #xE2B3) - (#xFCC1 #xE2B2) - (#xFCC0 #xE2B1) - (#xFCBF #xE2B0) - (#xFCBE #xE2AF) - (#xFCBD #xE2AE) - (#xFCBC #xE2AD) - (#xFCBB #xE2AC) - (#xFCBA #xE2AB) - (#xFCB9 #xE2AA) - (#xFCB8 #xE2A9) - (#xFCB7 #xE2A8) - (#xFCB6 #xE2A7) - (#xFCB5 #xE2A6) - (#xFCB4 #xE2A5) - (#xFCB3 #xE2A4) - (#xFCB2 #xE2A3) - (#xFCB1 #xE2A2) - (#xFCB0 #xE2A1) - (#xFCAF #xE2A0) - (#xFCAE #xE29F) - (#xFCAD #xE29E) - (#xFCAC #xE29D) - (#xFCAB #xE29C) - (#xFCAA #xE29B) - (#xFCA9 #xE29A) - (#xFCA8 #xE299) - (#xFCA7 #xE298) - (#xFCA6 #xE297) - (#xFCA5 #xE296) - (#xFCA4 #xE295) - (#xFCA3 #xE294) - (#xFCA2 #xE293) - (#xFCA1 #xE292) - (#xFBFE #xE291) - (#xFBFD #xE290) - (#xFBFC #xE28F) - (#xFBFB #xE28E) - (#xFBFA #xE28D) - (#xFBF9 #xE28C) - (#xFBF8 #xE28B) - (#xFBF7 #xE28A) - (#xFBF6 #xE289) - (#xFBF5 #xE288) - (#xFBF4 #xE287) - (#xFBF3 #xE286) - (#xFBF2 #xE285) - (#xFBF1 #xE284) - (#xFBF0 #xE283) - (#xFBEF #xE282) - (#xFBEE #xE281) - (#xFBED #xE280) - (#xFBEC #xE27F) - (#xFBEB #xE27E) - (#xFBEA #xE27D) - (#xFBE9 #xE27C) - (#xFBE8 #xE27B) - (#xFBE7 #xE27A) - (#xFBE6 #xE279) - (#xFBE5 #xE278) - (#xFBE4 #xE277) - (#xFBE3 #xE276) - (#xFBE2 #xE275) - (#xFBE1 #xE274) - (#xFBE0 #xE273) - (#xFBDF #xE272) - (#xFBDE #xE271) - (#xFBDD #xE270) - (#xFBDC #xE26F) - (#xFBDB #xE26E) - (#xFBDA #xE26D) - (#xFBD9 #xE26C) - (#xFBD8 #xE26B) - (#xFBD7 #xE26A) - (#xFBD6 #xE269) - (#xFBD5 #xE268) - (#xFBD4 #xE267) - (#xFBD3 #xE266) - (#xFBD2 #xE265) - (#xFBD1 #xE264) - (#xFBD0 #xE263) - (#xFBCF #xE262) - (#xFBCE #xE261) - (#xFBCD #xE260) - (#xFBCC #xE25F) - (#xFBCB #xE25E) - (#xFBCA #xE25D) - (#xFBC9 #xE25C) - (#xFBC8 #xE25B) - (#xFBC7 #xE25A) - (#xFBC6 #xE259) - (#xFBC5 #xE258) - (#xFBC4 #xE257) - (#xFBC3 #xE256) - (#xFBC2 #xE255) - (#xFBC1 #xE254) - (#xFBC0 #xE253) - (#xFBBF #xE252) - (#xFBBE #xE251) - (#xFBBD #xE250) - (#xFBBC #xE24F) - (#xFBBB #xE24E) - (#xFBBA #xE24D) - (#xFBB9 #xE24C) - (#xFBB8 #xE24B) - (#xFBB7 #xE24A) - (#xFBB6 #xE249) - (#xFBB5 #xE248) - (#xFBB4 #xE247) - (#xFBB3 #xE246) - (#xFBB2 #xE245) - (#xFBB1 #xE244) - (#xFBB0 #xE243) - (#xFBAF #xE242) - (#xFBAE #xE241) - (#xFBAD #xE240) - (#xFBAC #xE23F) - (#xFBAB #xE23E) - (#xFBAA #xE23D) - (#xFBA9 #xE23C) - (#xFBA8 #xE23B) - (#xFBA7 #xE23A) - (#xFBA6 #xE239) - (#xFBA5 #xE238) - (#xFBA4 #xE237) - (#xFBA3 #xE236) - (#xFBA2 #xE235) - (#xFBA1 #xE234) - (#xFAFE #xE233) - (#xFAFD #xE232) - (#xFAFC #xE231) - (#xFAFB #xE230) - (#xFAFA #xE22F) - (#xFAF9 #xE22E) - (#xFAF8 #xE22D) - (#xFAF7 #xE22C) - (#xFAF6 #xE22B) - (#xFAF5 #xE22A) - (#xFAF4 #xE229) - (#xFAF3 #xE228) - (#xFAF2 #xE227) - (#xFAF1 #xE226) - (#xFAF0 #xE225) - (#xFAEF #xE224) - (#xFAEE #xE223) - (#xFAED #xE222) - (#xFAEC #xE221) - (#xFAEB #xE220) - (#xFAEA #xE21F) - (#xFAE9 #xE21E) - (#xFAE8 #xE21D) - (#xFAE7 #xE21C) - (#xFAE6 #xE21B) - (#xFAE5 #xE21A) - (#xFAE4 #xE219) - (#xFAE3 #xE218) - (#xFAE2 #xE217) - (#xFAE1 #xE216) - (#xFAE0 #xE215) - (#xFADF #xE214) - (#xFADE #xE213) - (#xFADD #xE212) - (#xFADC #xE211) - (#xFADB #xE210) - (#xFADA #xE20F) - (#xFAD9 #xE20E) - (#xFAD8 #xE20D) - (#xFAD7 #xE20C) - (#xFAD6 #xE20B) - (#xFAD5 #xE20A) - (#xFAD4 #xE209) - (#xFAD3 #xE208) - (#xFAD2 #xE207) - (#xFAD1 #xE206) - (#xFAD0 #xE205) - (#xFACF #xE204) - (#xFACE #xE203) - (#xFACD #xE202) - (#xFACC #xE201) - (#xFACB #xE200) - (#xFACA #xE1FF) - (#xFAC9 #xE1FE) - (#xFAC8 #xE1FD) - (#xFAC7 #xE1FC) - (#xFAC6 #xE1FB) - (#xFAC5 #xE1FA) - (#xFAC4 #xE1F9) - (#xFAC3 #xE1F8) - (#xFAC2 #xE1F7) - (#xFAC1 #xE1F6) - (#xFAC0 #xE1F5) - (#xFABF #xE1F4) - (#xFABE #xE1F3) - (#xFABD #xE1F2) - (#xFABC #xE1F1) - (#xFABB #xE1F0) - (#xFABA #xE1EF) - (#xFAB9 #xE1EE) - (#xFAB8 #xE1ED) - (#xFAB7 #xE1EC) - (#xFAB6 #xE1EB) - (#xFAB5 #xE1EA) - (#xFAB4 #xE1E9) - (#xFAB3 #xE1E8) - (#xFAB2 #xE1E7) - (#xFAB1 #xE1E6) - (#xFAB0 #xE1E5) - (#xFAAF #xE1E4) - (#xFAAE #xE1E3) - (#xFAAD #xE1E2) - (#xFAAC #xE1E1) - (#xFAAB #xE1E0) - (#xFAAA #xE1DF) - (#xFAA9 #xE1DE) - (#xFAA8 #xE1DD) - (#xFAA7 #xE1DC) - (#xFAA6 #xE1DB) - (#xFAA5 #xE1DA) - (#xFAA4 #xE1D9) - (#xFAA3 #xE1D8) - (#xFAA2 #xE1D7) - (#xFAA1 #xE1D6) - (#xF9FE #xE1D5) - (#xF9FD #xE1D4) - (#xF9FC #xE1D3) - (#xF9FB #xE1D2) - (#xF9FA #xE1D1) - (#xF9F9 #xE1D0) - (#xF9F8 #xE1CF) - (#xF9F7 #xE1CE) - (#xF9F6 #xE1CD) - (#xF9F5 #xE1CC) - (#xF9F4 #xE1CB) - (#xF9F3 #xE1CA) - (#xF9F2 #xE1C9) - (#xF9F1 #xE1C8) - (#xF9F0 #xE1C7) - (#xF9EF #xE1C6) - (#xF9EE #xE1C5) - (#xF9ED #xE1C4) - (#xF9EC #xE1C3) - (#xF9EB #xE1C2) - (#xF9EA #xE1C1) - (#xF9E9 #xE1C0) - (#xF9E8 #xE1BF) - (#xF9E7 #xE1BE) - (#xF9E6 #xE1BD) - (#xF9E5 #xE1BC) - (#xF9E4 #xE1BB) - (#xF9E3 #xE1BA) - (#xF9E2 #xE1B9) - (#xF9E1 #xE1B8) - (#xF9E0 #xE1B7) - (#xF9DF #xE1B6) - (#xF9DE #xE1B5) - (#xF9DD #xE1B4) - (#xF9DC #xE1B3) - (#xF9DB #xE1B2) - (#xF9DA #xE1B1) - (#xF9D9 #xE1B0) - (#xF9D8 #xE1AF) - (#xF9D7 #xE1AE) - (#xF9D6 #xE1AD) - (#xF9D5 #xE1AC) - (#xF9D4 #xE1AB) - (#xF9D3 #xE1AA) - (#xF9D2 #xE1A9) - (#xF9D1 #xE1A8) - (#xF9D0 #xE1A7) - (#xF9CF #xE1A6) - (#xF9CE #xE1A5) - (#xF9CD #xE1A4) - (#xF9CC #xE1A3) - (#xF9CB #xE1A2) - (#xF9CA #xE1A1) - (#xF9C9 #xE1A0) - (#xF9C8 #xE19F) - (#xF9C7 #xE19E) - (#xF9C6 #xE19D) - (#xF9C5 #xE19C) - (#xF9C4 #xE19B) - (#xF9C3 #xE19A) - (#xF9C2 #xE199) - (#xF9C1 #xE198) - (#xF9C0 #xE197) - (#xF9BF #xE196) - (#xF9BE #xE195) - (#xF9BD #xE194) - (#xF9BC #xE193) - (#xF9BB #xE192) - (#xF9BA #xE191) - (#xF9B9 #xE190) - (#xF9B8 #xE18F) - (#xF9B7 #xE18E) - (#xF9B6 #xE18D) - (#xF9B5 #xE18C) - (#xF9B4 #xE18B) - (#xF9B3 #xE18A) - (#xF9B2 #xE189) - (#xF9B1 #xE188) - (#xF9B0 #xE187) - (#xF9AF #xE186) - (#xF9AE #xE185) - (#xF9AD #xE184) - (#xF9AC #xE183) - (#xF9AB #xE182) - (#xF9AA #xE181) - (#xF9A9 #xE180) - (#xF9A8 #xE17F) - (#xF9A7 #xE17E) - (#xF9A6 #xE17D) - (#xF9A5 #xE17C) - (#xF9A4 #xE17B) - (#xF9A3 #xE17A) - (#xF9A2 #xE179) - (#xF9A1 #xE178) - (#xF8FE #xE177) - (#xF8FD #xE176) - (#xF8FC #xE175) - (#xF8FB #xE174) - (#xF8FA #xE173) - (#xF8F9 #xE172) - (#xF8F8 #xE171) - (#xF8F7 #xE170) - (#xF8F6 #xE16F) - (#xF8F5 #xE16E) - (#xF8F4 #xE16D) - (#xF8F3 #xE16C) - (#xF8F2 #xE16B) - (#xF8F1 #xE16A) - (#xF8F0 #xE169) - (#xF8EF #xE168) - (#xF8EE #xE167) - (#xF8ED #xE166) - (#xF8EC #xE165) - (#xF8EB #xE164) - (#xF8EA #xE163) - (#xF8E9 #xE162) - (#xF8E8 #xE161) - (#xF8E7 #xE160) - (#xF8E6 #xE15F) - (#xF8E5 #xE15E) - (#xF8E4 #xE15D) - (#xF8E3 #xE15C) - (#xF8E2 #xE15B) - (#xF8E1 #xE15A) - (#xF8E0 #xE159) - (#xF8DF #xE158) - (#xF8DE #xE157) - (#xF8DD #xE156) - (#xF8DC #xE155) - (#xF8DB #xE154) - (#xF8DA #xE153) - (#xF8D9 #xE152) - (#xF8D8 #xE151) - (#xF8D7 #xE150) - (#xF8D6 #xE14F) - (#xF8D5 #xE14E) - (#xF8D4 #xE14D) - (#xF8D3 #xE14C) - (#xF8D2 #xE14B) - (#xF8D1 #xE14A) - (#xF8D0 #xE149) - (#xF8CF #xE148) - (#xF8CE #xE147) - (#xF8CD #xE146) - (#xF8CC #xE145) - (#xF8CB #xE144) - (#xF8CA #xE143) - (#xF8C9 #xE142) - (#xF8C8 #xE141) - (#xF8C7 #xE140) - (#xF8C6 #xE13F) - (#xF8C5 #xE13E) - (#xF8C4 #xE13D) - (#xF8C3 #xE13C) - (#xF8C2 #xE13B) - (#xF8C1 #xE13A) - (#xF8C0 #xE139) - (#xF8BF #xE138) - (#xF8BE #xE137) - (#xF8BD #xE136) - (#xF8BC #xE135) - (#xF8BB #xE134) - (#xF8BA #xE133) - (#xF8B9 #xE132) - (#xF8B8 #xE131) - (#xF8B7 #xE130) - (#xF8B6 #xE12F) - (#xF8B5 #xE12E) - (#xF8B4 #xE12D) - (#xF8B3 #xE12C) - (#xF8B2 #xE12B) - (#xF8B1 #xE12A) - (#xF8B0 #xE129) - (#xF8AF #xE128) - (#xF8AE #xE127) - (#xF8AD #xE126) - (#xF8AC #xE125) - (#xF8AB #xE124) - (#xF8AA #xE123) - (#xF8A9 #xE122) - (#xF8A8 #xE121) - (#xF8A7 #xE120) - (#xF8A6 #xE11F) - (#xF8A5 #xE11E) - (#xF8A4 #xE11D) - (#xF8A3 #xE11C) - (#xF8A2 #xE11B) - (#xF8A1 #xE11A) - (#xF7FE #xE119) - (#xF7FD #xE118) - (#xF7FC #xE117) - (#xF7FB #xE116) - (#xF7FA #xE115) - (#xF7F9 #xE114) - (#xF7F8 #xE113) - (#xF7F7 #xE112) - (#xF7F6 #xE111) - (#xF7F5 #xE110) - (#xF7F4 #xE10F) - (#xF7F3 #xE10E) - (#xF7F2 #xE10D) - (#xF7F1 #xE10C) - (#xF7F0 #xE10B) - (#xF7EF #xE10A) - (#xF7EE #xE109) - (#xF7ED #xE108) - (#xF7EC #xE107) - (#xF7EB #xE106) - (#xF7EA #xE105) - (#xF7E9 #xE104) - (#xF7E8 #xE103) - (#xF7E7 #xE102) - (#xF7E6 #xE101) - (#xF7E5 #xE100) - (#xF7E4 #xE0FF) - (#xF7E3 #xE0FE) - (#xF7E2 #xE0FD) - (#xF7E1 #xE0FC) - (#xF7E0 #xE0FB) - (#xF7DF #xE0FA) - (#xF7DE #xE0F9) - (#xF7DD #xE0F8) - (#xF7DC #xE0F7) - (#xF7DB #xE0F6) - (#xF7DA #xE0F5) - (#xF7D9 #xE0F4) - (#xF7D8 #xE0F3) - (#xF7D7 #xE0F2) - (#xF7D6 #xE0F1) - (#xF7D5 #xE0F0) - (#xF7D4 #xE0EF) - (#xF7D3 #xE0EE) - (#xF7D2 #xE0ED) - (#xF7D1 #xE0EC) - (#xF7D0 #xE0EB) - (#xF7CF #xE0EA) - (#xF7CE #xE0E9) - (#xF7CD #xE0E8) - (#xF7CC #xE0E7) - (#xF7CB #xE0E6) - (#xF7CA #xE0E5) - (#xF7C9 #xE0E4) - (#xF7C8 #xE0E3) - (#xF7C7 #xE0E2) - (#xF7C6 #xE0E1) - (#xF7C5 #xE0E0) - (#xF7C4 #xE0DF) - (#xF7C3 #xE0DE) - (#xF7C2 #xE0DD) - (#xF7C1 #xE0DC) - (#xF7C0 #xE0DB) - (#xF7BF #xE0DA) - (#xF7BE #xE0D9) - (#xF7BD #xE0D8) - (#xF7BC #xE0D7) - (#xF7BB #xE0D6) - (#xF7BA #xE0D5) - (#xF7B9 #xE0D4) - (#xF7B8 #xE0D3) - (#xF7B7 #xE0D2) - (#xF7B6 #xE0D1) - (#xF7B5 #xE0D0) - (#xF7B4 #xE0CF) - (#xF7B3 #xE0CE) - (#xF7B2 #xE0CD) - (#xF7B1 #xE0CC) - (#xF7B0 #xE0CB) - (#xF7AF #xE0CA) - (#xF7AE #xE0C9) - (#xF7AD #xE0C8) - (#xF7AC #xE0C7) - (#xF7AB #xE0C6) - (#xF7AA #xE0C5) - (#xF7A9 #xE0C4) - (#xF7A8 #xE0C3) - (#xF7A7 #xE0C2) - (#xF7A6 #xE0C1) - (#xF7A5 #xE0C0) - (#xF7A4 #xE0BF) - (#xF7A3 #xE0BE) - (#xF7A2 #xE0BD) - (#xF7A1 #xE0BC) - (#xF6FE #xE0BB) - (#xF6FD #xE0BA) - (#xF6FC #xE0B9) - (#xF6FB #xE0B8) - (#xF6FA #xE0B7) - (#xF6F9 #xE0B6) - (#xF6F8 #xE0B5) - (#xF6F7 #xE0B4) - (#xF6F6 #xE0B3) - (#xF6F5 #xE0B2) - (#xF6F4 #xE0B1) - (#xF6F3 #xE0B0) - (#xF6F2 #xE0AF) - (#xF6F1 #xE0AE) - (#xF6F0 #xE0AD) - (#xF6EF #xE0AC) - (#xF6EE #xE0AB) - (#xF6ED #xE0AA) - (#xF6EC #xE0A9) - (#xF6EB #xE0A8) - (#xF6EA #xE0A7) - (#xF6E9 #xE0A6) - (#xF6E8 #xE0A5) - (#xF6E7 #xE0A4) - (#xF6E6 #xE0A3) - (#xF6E5 #xE0A2) - (#xF6E4 #xE0A1) - (#xF6E3 #xE0A0) - (#xF6E2 #xE09F) - (#xF6E1 #xE09E) - (#xF6E0 #xE09D) - (#xF6DF #xE09C) - (#xF6DE #xE09B) - (#xF6DD #xE09A) - (#xF6DC #xE099) - (#xF6DB #xE098) - (#xF6DA #xE097) - (#xF6D9 #xE096) - (#xF6D8 #xE095) - (#xF6D7 #xE094) - (#xF6D6 #xE093) - (#xF6D5 #xE092) - (#xF6D4 #xE091) - (#xF6D3 #xE090) - (#xF6D2 #xE08F) - (#xF6D1 #xE08E) - (#xF6D0 #xE08D) - (#xF6CF #xE08C) - (#xF6CE #xE08B) - (#xF6CD #xE08A) - (#xF6CC #xE089) - (#xF6CB #xE088) - (#xF6CA #xE087) - (#xF6C9 #xE086) - (#xF6C8 #xE085) - (#xF6C7 #xE084) - (#xF6C6 #xE083) - (#xF6C5 #xE082) - (#xF6C4 #xE081) - (#xF6C3 #xE080) - (#xF6C2 #xE07F) - (#xF6C1 #xE07E) - (#xF6C0 #xE07D) - (#xF6BF #xE07C) - (#xF6BE #xE07B) - (#xF6BD #xE07A) - (#xF6BC #xE079) - (#xF6BB #xE078) - (#xF6BA #xE077) - (#xF6B9 #xE076) - (#xF6B8 #xE075) - (#xF6B7 #xE074) - (#xF6B6 #xE073) - (#xF6B5 #xE072) - (#xF6B4 #xE071) - (#xF6B3 #xE070) - (#xF6B2 #xE06F) - (#xF6B1 #xE06E) - (#xF6B0 #xE06D) - (#xF6AF #xE06C) - (#xF6AE #xE06B) - (#xF6AD #xE06A) - (#xF6AC #xE069) - (#xF6AB #xE068) - (#xF6AA #xE067) - (#xF6A9 #xE066) - (#xF6A8 #xE065) - (#xF6A7 #xE064) - (#xF6A6 #xE063) - (#xF6A5 #xE062) - (#xF6A4 #xE061) - (#xF6A3 #xE060) - (#xF6A2 #xE05F) - (#xF6A1 #xE05E) - (#xF5FE #xE05D) - (#xF5FD #xE05C) - (#xF5FC #xE05B) - (#xF5FB #xE05A) - (#xF5FA #xE059) - (#xF5F9 #xE058) - (#xF5F8 #xE057) - (#xF5F7 #xE056) - (#xF5F6 #xE055) - (#xF5F5 #xE054) - (#xF5F4 #xE053) - (#xF5F3 #xE052) - (#xF5F2 #xE051) - (#xF5F1 #xE050) - (#xF5F0 #xE04F) - (#xF5EF #xE04E) - (#xF5EE #xE04D) - (#xF5ED #xE04C) - (#xF5EC #xE04B) - (#xF5EB #xE04A) - (#xF5EA #xE049) - (#xF5E9 #xE048) - (#xF5E8 #xE047) - (#xF5E7 #xE046) - (#xF5E6 #xE045) - (#xF5E5 #xE044) - (#xF5E4 #xE043) - (#xF5E3 #xE042) - (#xF5E2 #xE041) - (#xF5E1 #xE040) - (#xF5E0 #xE03F) - (#xF5DF #xE03E) - (#xF5DE #xE03D) - (#xF5DD #xE03C) - (#xF5DC #xE03B) - (#xF5DB #xE03A) - (#xF5DA #xE039) - (#xF5D9 #xE038) - (#xF5D8 #xE037) - (#xF5D7 #xE036) - (#xF5D6 #xE035) - (#xF5D5 #xE034) - (#xF5D4 #xE033) - (#xF5D3 #xE032) - (#xF5D2 #xE031) - (#xF5D1 #xE030) - (#xF5D0 #xE02F) - (#xF5CF #xE02E) - (#xF5CE #xE02D) - (#xF5CD #xE02C) - (#xF5CC #xE02B) - (#xF5CB #xE02A) - (#xF5CA #xE029) - (#xF5C9 #xE028) - (#xF5C8 #xE027) - (#xF5C7 #xE026) - (#xF5C6 #xE025) - (#xF5C5 #xE024) - (#xF5C4 #xE023) - (#xF5C3 #xE022) - (#xF5C2 #xE021) - (#xF5C1 #xE020) - (#xF5C0 #xE01F) - (#xF5BF #xE01E) - (#xF5BE #xE01D) - (#xF5BD #xE01C) - (#xF5BC #xE01B) - (#xF5BB #xE01A) - (#xF5BA #xE019) - (#xF5B9 #xE018) - (#xF5B8 #xE017) - (#xF5B7 #xE016) - (#xF5B6 #xE015) - (#xF5B5 #xE014) - (#xF5B4 #xE013) - (#xF5B3 #xE012) - (#xF5B2 #xE011) - (#xF5B1 #xE010) - (#xF5B0 #xE00F) - (#xF5AF #xE00E) - (#xF5AE #xE00D) - (#xF5AD #xE00C) - (#xF5AC #xE00B) - (#xF5AB #xE00A) - (#xF5AA #xE009) - (#xF5A9 #xE008) - (#xF5A8 #xE007) - (#xF5A7 #xE006) - (#xF5A6 #xE005) - (#xF5A5 #xE004) - (#xF5A4 #xE003) - (#xF5A3 #xE002) - (#xF5A2 #xE001) - (#xF5A1 #xE000) - )) - -(defvar *eucjp* - '((#x8FA2AF #x2D8) - (#x8FA2B0 #x2C7) - (#x8FA2B1 #xB8) - (#x8FA2B2 #x2D9) - (#x8FA2B3 #x2DD) - (#x8FA2B4 #xAF) - (#x8FA2B5 #x2DB) - (#x8FA2B6 #x2DA) - (#x8FA2B7 #xFF5E) - (#x8FA2B8 #x384) - (#x8FA2B9 #x385) - (#x8FA2C2 #xA1) - (#x8FA2C3 #xA6) - (#x8FA2C4 #xBF) - (#x8FA2EB #xBA) - (#x8FA2EC #xAA) - (#x8FA2ED #xA9) - (#x8FA2EE #xAE) - (#x8FA2EF #x2122) - (#x8FA2F0 #xA4) - (#x8FA2F1 #x2116) - (#x8FA6E1 #x386) - (#x8FA6E2 #x388) - (#x8FA6E3 #x389) - (#x8FA6E4 #x38A) - (#x8FA6E5 #x3AA) - (#x8FA6E7 #x38C) - (#x8FA6E9 #x38E) - (#x8FA6EA #x3AB) - (#x8FA6EC #x38F) - (#x8FA6F1 #x3AC) - (#x8FA6F2 #x3AD) - (#x8FA6F3 #x3AE) - (#x8FA6F4 #x3AF) - (#x8FA6F5 #x3CA) - (#x8FA6F6 #x390) - (#x8FA6F7 #x3CC) - (#x8FA6F8 #x3C2) - (#x8FA6F9 #x3CD) - (#x8FA6FA #x3CB) - (#x8FA6FB #x3B0) - (#x8FA6FC #x3CE) - (#x8FA7C2 #x402) - (#x8FA7C3 #x403) - (#x8FA7C4 #x404) - (#x8FA7C5 #x405) - (#x8FA7C6 #x406) - (#x8FA7C7 #x407) - (#x8FA7C8 #x408) - (#x8FA7C9 #x409) - (#x8FA7CA #x40A) - (#x8FA7CB #x40B) - (#x8FA7CC #x40C) - (#x8FA7CD #x40E) - (#x8FA7CE #x40F) - (#x8FA7F2 #x452) - (#x8FA7F3 #x453) - (#x8FA7F4 #x454) - (#x8FA7F5 #x455) - (#x8FA7F6 #x456) - (#x8FA7F7 #x457) - (#x8FA7F8 #x458) - (#x8FA7F9 #x459) - (#x8FA7FA #x45A) - (#x8FA7FB #x45B) - (#x8FA7FC #x45C) - (#x8FA7FD #x45E) - (#x8FA7FE #x45F) - (#x8FA9A1 #xC6) - (#x8FA9A2 #x110) - (#x8FA9A4 #x126) - (#x8FA9A6 #x132) - (#x8FA9A8 #x141) - (#x8FA9A9 #x13F) - (#x8FA9AB #x14A) - (#x8FA9AC #xD8) - (#x8FA9AD #x152) - (#x8FA9AF #x166) - (#x8FA9B0 #xDE) - (#x8FA9C1 #xE6) - (#x8FA9C2 #x111) - (#x8FA9C3 #xF0) - (#x8FA9C4 #x127) - (#x8FA9C5 #x131) - (#x8FA9C6 #x133) - (#x8FA9C7 #x138) - (#x8FA9C8 #x142) - (#x8FA9C9 #x140) - (#x8FA9CA #x149) - (#x8FA9CB #x14B) - (#x8FA9CC #xF8) - (#x8FA9CD #x153) - (#x8FA9CE #xDF) - (#x8FA9CF #x167) - (#x8FA9D0 #xFE) - (#x8FAAA1 #xC1) - (#x8FAAA2 #xC0) - (#x8FAAA3 #xC4) - (#x8FAAA4 #xC2) - (#x8FAAA5 #x102) - (#x8FAAA6 #x1CD) - (#x8FAAA7 #x100) - (#x8FAAA8 #x104) - (#x8FAAA9 #xC5) - (#x8FAAAA #xC3) - (#x8FAAAB #x106) - (#x8FAAAC #x108) - (#x8FAAAD #x10C) - (#x8FAAAE #xC7) - (#x8FAAAF #x10A) - (#x8FAAB0 #x10E) - (#x8FAAB1 #xC9) - (#x8FAAB2 #xC8) - (#x8FAAB3 #xCB) - (#x8FAAB4 #xCA) - (#x8FAAB5 #x11A) - (#x8FAAB6 #x116) - (#x8FAAB7 #x112) - (#x8FAAB8 #x118) - (#x8FAABA #x11C) - (#x8FAABB #x11E) - (#x8FAABC #x122) - (#x8FAABD #x120) - (#x8FAABE #x124) - (#x8FAABF #xCD) - (#x8FAAC0 #xCC) - (#x8FAAC1 #xCF) - (#x8FAAC2 #xCE) - (#x8FAAC3 #x1CF) - (#x8FAAC4 #x130) - (#x8FAAC5 #x12A) - (#x8FAAC6 #x12E) - (#x8FAAC7 #x128) - (#x8FAAC8 #x134) - (#x8FAAC9 #x136) - (#x8FAACA #x139) - (#x8FAACB #x13D) - (#x8FAACC #x13B) - (#x8FAACD #x143) - (#x8FAACE #x147) - (#x8FAACF #x145) - (#x8FAAD0 #xD1) - (#x8FAAD1 #xD3) - (#x8FAAD2 #xD2) - (#x8FAAD3 #xD6) - (#x8FAAD4 #xD4) - (#x8FAAD5 #x1D1) - (#x8FAAD6 #x150) - (#x8FAAD7 #x14C) - (#x8FAAD8 #xD5) - (#x8FAAD9 #x154) - (#x8FAADA #x158) - (#x8FAADB #x156) - (#x8FAADC #x15A) - (#x8FAADD #x15C) - (#x8FAADE #x160) - (#x8FAADF #x15E) - (#x8FAAE0 #x164) - (#x8FAAE1 #x162) - (#x8FAAE2 #xDA) - (#x8FAAE3 #xD9) - (#x8FAAE4 #xDC) - (#x8FAAE5 #xDB) - (#x8FAAE6 #x16C) - (#x8FAAE7 #x1D3) - (#x8FAAE8 #x170) - (#x8FAAE9 #x16A) - (#x8FAAEA #x172) - (#x8FAAEB #x16E) - (#x8FAAEC #x168) - (#x8FAAED #x1D7) - (#x8FAAEE #x1DB) - (#x8FAAEF #x1D9) - (#x8FAAF0 #x1D5) - (#x8FAAF1 #x174) - (#x8FAAF2 #xDD) - (#x8FAAF3 #x178) - (#x8FAAF4 #x176) - (#x8FAAF5 #x179) - (#x8FAAF6 #x17D) - (#x8FAAF7 #x17B) - (#x8FABA1 #xE1) - (#x8FABA2 #xE0) - (#x8FABA3 #xE4) - (#x8FABA4 #xE2) - (#x8FABA5 #x103) - (#x8FABA6 #x1CE) - (#x8FABA7 #x101) - (#x8FABA8 #x105) - (#x8FABA9 #xE5) - (#x8FABAA #xE3) - (#x8FABAB #x107) - (#x8FABAC #x109) - (#x8FABAD #x10D) - (#x8FABAE #xE7) - (#x8FABAF #x10B) - (#x8FABB0 #x10F) - (#x8FABB1 #xE9) - (#x8FABB2 #xE8) - (#x8FABB3 #xEB) - (#x8FABB4 #xEA) - (#x8FABB5 #x11B) - (#x8FABB6 #x117) - (#x8FABB7 #x113) - (#x8FABB8 #x119) - (#x8FABB9 #x1F5) - (#x8FABBA #x11D) - (#x8FABBB #x11F) - (#x8FABBD #x121) - (#x8FABBE #x125) - (#x8FABBF #xED) - (#x8FABC0 #xEC) - (#x8FABC1 #xEF) - (#x8FABC2 #xEE) - (#x8FABC3 #x1D0) - (#x8FABC5 #x12B) - (#x8FABC6 #x12F) - (#x8FABC7 #x129) - (#x8FABC8 #x135) - (#x8FABC9 #x137) - (#x8FABCA #x13A) - (#x8FABCB #x13E) - (#x8FABCC #x13C) - (#x8FABCD #x144) - (#x8FABCE #x148) - (#x8FABCF #x146) - (#x8FABD0 #xF1) - (#x8FABD1 #xF3) - (#x8FABD2 #xF2) - (#x8FABD3 #xF6) - (#x8FABD4 #xF4) - (#x8FABD5 #x1D2) - (#x8FABD6 #x151) - (#x8FABD7 #x14D) - (#x8FABD8 #xF5) - (#x8FABD9 #x155) - (#x8FABDA #x159) - (#x8FABDB #x157) - (#x8FABDC #x15B) - (#x8FABDD #x15D) - (#x8FABDE #x161) - (#x8FABDF #x15F) - (#x8FABE0 #x165) - (#x8FABE1 #x163) - (#x8FABE2 #xFA) - (#x8FABE3 #xF9) - (#x8FABE4 #xFC) - (#x8FABE5 #xFB) - (#x8FABE6 #x16D) - (#x8FABE7 #x1D4) - (#x8FABE8 #x171) - (#x8FABE9 #x16B) - (#x8FABEA #x173) - (#x8FABEB #x16F) - (#x8FABEC #x169) - (#x8FABED #x1D8) - (#x8FABEE #x1DC) - (#x8FABEF #x1DA) - (#x8FABF0 #x1D6) - (#x8FABF1 #x175) - (#x8FABF2 #xFD) - (#x8FABF3 #xFF) - (#x8FABF4 #x177) - (#x8FABF5 #x17A) - (#x8FABF6 #x17E) - (#x8FABF7 #x17C) - (#x8FB0A1 #x4E02) - (#x8FB0A2 #x4E04) - (#x8FB0A3 #x4E05) - (#x8FB0A4 #x4E0C) - (#x8FB0A5 #x4E12) - (#x8FB0A6 #x4E1F) - (#x8FB0A7 #x4E23) - (#x8FB0A8 #x4E24) - (#x8FB0A9 #x4E28) - (#x8FB0AA #x4E2B) - (#x8FB0AB #x4E2E) - (#x8FB0AC #x4E2F) - (#x8FB0AD #x4E30) - (#x8FB0AE #x4E35) - (#x8FB0AF #x4E40) - (#x8FB0B0 #x4E41) - (#x8FB0B1 #x4E44) - (#x8FB0B2 #x4E47) - (#x8FB0B3 #x4E51) - (#x8FB0B4 #x4E5A) - (#x8FB0B5 #x4E5C) - (#x8FB0B6 #x4E63) - (#x8FB0B7 #x4E68) - (#x8FB0B8 #x4E69) - (#x8FB0B9 #x4E74) - (#x8FB0BA #x4E75) - (#x8FB0BB #x4E79) - (#x8FB0BC #x4E7F) - (#x8FB0BD #x4E8D) - (#x8FB0BE #x4E96) - (#x8FB0BF #x4E97) - (#x8FB0C0 #x4E9D) - (#x8FB0C1 #x4EAF) - (#x8FB0C2 #x4EB9) - (#x8FB0C3 #x4EC3) - (#x8FB0C4 #x4ED0) - (#x8FB0C5 #x4EDA) - (#x8FB0C6 #x4EDB) - (#x8FB0C7 #x4EE0) - (#x8FB0C8 #x4EE1) - (#x8FB0C9 #x4EE2) - (#x8FB0CA #x4EE8) - (#x8FB0CB #x4EEF) - (#x8FB0CC #x4EF1) - (#x8FB0CD #x4EF3) - (#x8FB0CE #x4EF5) - (#x8FB0CF #x4EFD) - (#x8FB0D0 #x4EFE) - (#x8FB0D1 #x4EFF) - (#x8FB0D2 #x4F00) - (#x8FB0D3 #x4F02) - (#x8FB0D4 #x4F03) - (#x8FB0D5 #x4F08) - (#x8FB0D6 #x4F0B) - (#x8FB0D7 #x4F0C) - (#x8FB0D8 #x4F12) - (#x8FB0D9 #x4F15) - (#x8FB0DA #x4F16) - (#x8FB0DB #x4F17) - (#x8FB0DC #x4F19) - (#x8FB0DD #x4F2E) - (#x8FB0DE #x4F31) - (#x8FB0DF #x4F60) - (#x8FB0E0 #x4F33) - (#x8FB0E1 #x4F35) - (#x8FB0E2 #x4F37) - (#x8FB0E3 #x4F39) - (#x8FB0E4 #x4F3B) - (#x8FB0E5 #x4F3E) - (#x8FB0E6 #x4F40) - (#x8FB0E7 #x4F42) - (#x8FB0E8 #x4F48) - (#x8FB0E9 #x4F49) - (#x8FB0EA #x4F4B) - (#x8FB0EB #x4F4C) - (#x8FB0EC #x4F52) - (#x8FB0ED #x4F54) - (#x8FB0EE #x4F56) - (#x8FB0EF #x4F58) - (#x8FB0F0 #x4F5F) - (#x8FB0F1 #x4F63) - (#x8FB0F2 #x4F6A) - (#x8FB0F3 #x4F6C) - (#x8FB0F4 #x4F6E) - (#x8FB0F5 #x4F71) - (#x8FB0F6 #x4F77) - (#x8FB0F7 #x4F78) - (#x8FB0F8 #x4F79) - (#x8FB0F9 #x4F7A) - (#x8FB0FA #x4F7D) - (#x8FB0FB #x4F7E) - (#x8FB0FC #x4F81) - (#x8FB0FD #x4F82) - (#x8FB0FE #x4F84) - (#x8FB1A1 #x4F85) - (#x8FB1A2 #x4F89) - (#x8FB1A3 #x4F8A) - (#x8FB1A4 #x4F8C) - (#x8FB1A5 #x4F8E) - (#x8FB1A6 #x4F90) - (#x8FB1A7 #x4F92) - (#x8FB1A8 #x4F93) - (#x8FB1A9 #x4F94) - (#x8FB1AA #x4F97) - (#x8FB1AB #x4F99) - (#x8FB1AC #x4F9A) - (#x8FB1AD #x4F9E) - (#x8FB1AE #x4F9F) - (#x8FB1AF #x4FB2) - (#x8FB1B0 #x4FB7) - (#x8FB1B1 #x4FB9) - (#x8FB1B2 #x4FBB) - (#x8FB1B3 #x4FBC) - (#x8FB1B4 #x4FBD) - (#x8FB1B5 #x4FBE) - (#x8FB1B6 #x4FC0) - (#x8FB1B7 #x4FC1) - (#x8FB1B8 #x4FC5) - (#x8FB1B9 #x4FC6) - (#x8FB1BA #x4FC8) - (#x8FB1BB #x4FC9) - (#x8FB1BC #x4FCB) - (#x8FB1BD #x4FCC) - (#x8FB1BE #x4FCD) - (#x8FB1BF #x4FCF) - (#x8FB1C0 #x4FD2) - (#x8FB1C1 #x4FDC) - (#x8FB1C2 #x4FE0) - (#x8FB1C3 #x4FE2) - (#x8FB1C4 #x4FF0) - (#x8FB1C5 #x4FF2) - (#x8FB1C6 #x4FFC) - (#x8FB1C7 #x4FFD) - (#x8FB1C8 #x4FFF) - (#x8FB1C9 #x5000) - (#x8FB1CA #x5001) - (#x8FB1CB #x5004) - (#x8FB1CC #x5007) - (#x8FB1CD #x500A) - (#x8FB1CE #x500C) - (#x8FB1CF #x500E) - (#x8FB1D0 #x5010) - (#x8FB1D1 #x5013) - (#x8FB1D2 #x5017) - (#x8FB1D3 #x5018) - (#x8FB1D4 #x501B) - (#x8FB1D5 #x501C) - (#x8FB1D6 #x501D) - (#x8FB1D7 #x501E) - (#x8FB1D8 #x5022) - (#x8FB1D9 #x5027) - (#x8FB1DA #x502E) - (#x8FB1DB #x5030) - (#x8FB1DC #x5032) - (#x8FB1DD #x5033) - (#x8FB1DE #x5035) - (#x8FB1DF #x5040) - (#x8FB1E0 #x5041) - (#x8FB1E1 #x5042) - (#x8FB1E2 #x5045) - (#x8FB1E3 #x5046) - (#x8FB1E4 #x504A) - (#x8FB1E5 #x504C) - (#x8FB1E6 #x504E) - (#x8FB1E7 #x5051) - (#x8FB1E8 #x5052) - (#x8FB1E9 #x5053) - (#x8FB1EA #x5057) - (#x8FB1EB #x5059) - (#x8FB1EC #x505F) - (#x8FB1ED #x5060) - (#x8FB1EE #x5062) - (#x8FB1EF #x5063) - (#x8FB1F0 #x5066) - (#x8FB1F1 #x5067) - (#x8FB1F2 #x506A) - (#x8FB1F3 #x506D) - (#x8FB1F4 #x5070) - (#x8FB1F5 #x5071) - (#x8FB1F6 #x503B) - (#x8FB1F7 #x5081) - (#x8FB1F8 #x5083) - (#x8FB1F9 #x5084) - (#x8FB1FA #x5086) - (#x8FB1FB #x508A) - (#x8FB1FC #x508E) - (#x8FB1FD #x508F) - (#x8FB1FE #x5090) - (#x8FB2A1 #x5092) - (#x8FB2A2 #x5093) - (#x8FB2A3 #x5094) - (#x8FB2A4 #x5096) - (#x8FB2A5 #x509B) - (#x8FB2A6 #x509C) - (#x8FB2A7 #x509E) - (#x8FB2A8 #x509F) - (#x8FB2A9 #x50A0) - (#x8FB2AA #x50A1) - (#x8FB2AB #x50A2) - (#x8FB2AC #x50AA) - (#x8FB2AD #x50AF) - (#x8FB2AE #x50B0) - (#x8FB2AF #x50B9) - (#x8FB2B0 #x50BA) - (#x8FB2B1 #x50BD) - (#x8FB2B2 #x50C0) - (#x8FB2B3 #x50C3) - (#x8FB2B4 #x50C4) - (#x8FB2B5 #x50C7) - (#x8FB2B6 #x50CC) - (#x8FB2B7 #x50CE) - (#x8FB2B8 #x50D0) - (#x8FB2B9 #x50D3) - (#x8FB2BA #x50D4) - (#x8FB2BB #x50D8) - (#x8FB2BC #x50DC) - (#x8FB2BD #x50DD) - (#x8FB2BE #x50DF) - (#x8FB2BF #x50E2) - (#x8FB2C0 #x50E4) - (#x8FB2C1 #x50E6) - (#x8FB2C2 #x50E8) - (#x8FB2C3 #x50E9) - (#x8FB2C4 #x50EF) - (#x8FB2C5 #x50F1) - (#x8FB2C6 #x50F6) - (#x8FB2C7 #x50FA) - (#x8FB2C8 #x50FE) - (#x8FB2C9 #x5103) - (#x8FB2CA #x5106) - (#x8FB2CB #x5107) - (#x8FB2CC #x5108) - (#x8FB2CD #x510B) - (#x8FB2CE #x510C) - (#x8FB2CF #x510D) - (#x8FB2D0 #x510E) - (#x8FB2D1 #x50F2) - (#x8FB2D2 #x5110) - (#x8FB2D3 #x5117) - (#x8FB2D4 #x5119) - (#x8FB2D5 #x511B) - (#x8FB2D6 #x511C) - (#x8FB2D7 #x511D) - (#x8FB2D8 #x511E) - (#x8FB2D9 #x5123) - (#x8FB2DA #x5127) - (#x8FB2DB #x5128) - (#x8FB2DC #x512C) - (#x8FB2DD #x512D) - (#x8FB2DE #x512F) - (#x8FB2DF #x5131) - (#x8FB2E0 #x5133) - (#x8FB2E1 #x5134) - (#x8FB2E2 #x5135) - (#x8FB2E3 #x5138) - (#x8FB2E4 #x5139) - (#x8FB2E5 #x5142) - (#x8FB2E6 #x514A) - (#x8FB2E7 #x514F) - (#x8FB2E8 #x5153) - (#x8FB2E9 #x5155) - (#x8FB2EA #x5157) - (#x8FB2EB #x5158) - (#x8FB2EC #x515F) - (#x8FB2ED #x5164) - (#x8FB2EE #x5166) - (#x8FB2EF #x517E) - (#x8FB2F0 #x5183) - (#x8FB2F1 #x5184) - (#x8FB2F2 #x518B) - (#x8FB2F3 #x518E) - (#x8FB2F4 #x5198) - (#x8FB2F5 #x519D) - (#x8FB2F6 #x51A1) - (#x8FB2F7 #x51A3) - (#x8FB2F8 #x51AD) - (#x8FB2F9 #x51B8) - (#x8FB2FA #x51BA) - (#x8FB2FB #x51BC) - (#x8FB2FC #x51BE) - (#x8FB2FD #x51BF) - (#x8FB2FE #x51C2) - (#x8FB3A1 #x51C8) - (#x8FB3A2 #x51CF) - (#x8FB3A3 #x51D1) - (#x8FB3A4 #x51D2) - (#x8FB3A5 #x51D3) - (#x8FB3A6 #x51D5) - (#x8FB3A7 #x51D8) - (#x8FB3A8 #x51DE) - (#x8FB3A9 #x51E2) - (#x8FB3AA #x51E5) - (#x8FB3AB #x51EE) - (#x8FB3AC #x51F2) - (#x8FB3AD #x51F3) - (#x8FB3AE #x51F4) - (#x8FB3AF #x51F7) - (#x8FB3B0 #x5201) - (#x8FB3B1 #x5202) - (#x8FB3B2 #x5205) - (#x8FB3B3 #x5212) - (#x8FB3B4 #x5213) - (#x8FB3B5 #x5215) - (#x8FB3B6 #x5216) - (#x8FB3B7 #x5218) - (#x8FB3B8 #x5222) - (#x8FB3B9 #x5228) - (#x8FB3BA #x5231) - (#x8FB3BB #x5232) - (#x8FB3BC #x5235) - (#x8FB3BD #x523C) - (#x8FB3BE #x5245) - (#x8FB3BF #x5249) - (#x8FB3C0 #x5255) - (#x8FB3C1 #x5257) - (#x8FB3C2 #x5258) - (#x8FB3C3 #x525A) - (#x8FB3C4 #x525C) - (#x8FB3C5 #x525F) - (#x8FB3C6 #x5260) - (#x8FB3C7 #x5261) - (#x8FB3C8 #x5266) - (#x8FB3C9 #x526E) - (#x8FB3CA #x5277) - (#x8FB3CB #x5278) - (#x8FB3CC #x5279) - (#x8FB3CD #x5280) - (#x8FB3CE #x5282) - (#x8FB3CF #x5285) - (#x8FB3D0 #x528A) - (#x8FB3D1 #x528C) - (#x8FB3D2 #x5293) - (#x8FB3D3 #x5295) - (#x8FB3D4 #x5296) - (#x8FB3D5 #x5297) - (#x8FB3D6 #x5298) - (#x8FB3D7 #x529A) - (#x8FB3D8 #x529C) - (#x8FB3D9 #x52A4) - (#x8FB3DA #x52A5) - (#x8FB3DB #x52A6) - (#x8FB3DC #x52A7) - (#x8FB3DD #x52AF) - (#x8FB3DE #x52B0) - (#x8FB3DF #x52B6) - (#x8FB3E0 #x52B7) - (#x8FB3E1 #x52B8) - (#x8FB3E2 #x52BA) - (#x8FB3E3 #x52BB) - (#x8FB3E4 #x52BD) - (#x8FB3E5 #x52C0) - (#x8FB3E6 #x52C4) - (#x8FB3E7 #x52C6) - (#x8FB3E8 #x52C8) - (#x8FB3E9 #x52CC) - (#x8FB3EA #x52CF) - (#x8FB3EB #x52D1) - (#x8FB3EC #x52D4) - (#x8FB3ED #x52D6) - (#x8FB3EE #x52DB) - (#x8FB3EF #x52DC) - (#x8FB3F0 #x52E1) - (#x8FB3F1 #x52E5) - (#x8FB3F2 #x52E8) - (#x8FB3F3 #x52E9) - (#x8FB3F4 #x52EA) - (#x8FB3F5 #x52EC) - (#x8FB3F6 #x52F0) - (#x8FB3F7 #x52F1) - (#x8FB3F8 #x52F4) - (#x8FB3F9 #x52F6) - (#x8FB3FA #x52F7) - (#x8FB3FB #x5300) - (#x8FB3FC #x5303) - (#x8FB3FD #x530A) - (#x8FB3FE #x530B) - (#x8FB4A1 #x530C) - (#x8FB4A2 #x5311) - (#x8FB4A3 #x5313) - (#x8FB4A4 #x5318) - (#x8FB4A5 #x531B) - (#x8FB4A6 #x531C) - (#x8FB4A7 #x531E) - (#x8FB4A8 #x531F) - (#x8FB4A9 #x5325) - (#x8FB4AA #x5327) - (#x8FB4AB #x5328) - (#x8FB4AC #x5329) - (#x8FB4AD #x532B) - (#x8FB4AE #x532C) - (#x8FB4AF #x532D) - (#x8FB4B0 #x5330) - (#x8FB4B1 #x5332) - (#x8FB4B2 #x5335) - (#x8FB4B3 #x533C) - (#x8FB4B4 #x533D) - (#x8FB4B5 #x533E) - (#x8FB4B6 #x5342) - (#x8FB4B7 #x534C) - (#x8FB4B8 #x534B) - (#x8FB4B9 #x5359) - (#x8FB4BA #x535B) - (#x8FB4BB #x5361) - (#x8FB4BC #x5363) - (#x8FB4BD #x5365) - (#x8FB4BE #x536C) - (#x8FB4BF #x536D) - (#x8FB4C0 #x5372) - (#x8FB4C1 #x5379) - (#x8FB4C2 #x537E) - (#x8FB4C3 #x5383) - (#x8FB4C4 #x5387) - (#x8FB4C5 #x5388) - (#x8FB4C6 #x538E) - (#x8FB4C7 #x5393) - (#x8FB4C8 #x5394) - (#x8FB4C9 #x5399) - (#x8FB4CA #x539D) - (#x8FB4CB #x53A1) - (#x8FB4CC #x53A4) - (#x8FB4CD #x53AA) - (#x8FB4CE #x53AB) - (#x8FB4CF #x53AF) - (#x8FB4D0 #x53B2) - (#x8FB4D1 #x53B4) - (#x8FB4D2 #x53B5) - (#x8FB4D3 #x53B7) - (#x8FB4D4 #x53B8) - (#x8FB4D5 #x53BA) - (#x8FB4D6 #x53BD) - (#x8FB4D7 #x53C0) - (#x8FB4D8 #x53C5) - (#x8FB4D9 #x53CF) - (#x8FB4DA #x53D2) - (#x8FB4DB #x53D3) - (#x8FB4DC #x53D5) - (#x8FB4DD #x53DA) - (#x8FB4DE #x53DD) - (#x8FB4DF #x53DE) - (#x8FB4E0 #x53E0) - (#x8FB4E1 #x53E6) - (#x8FB4E2 #x53E7) - (#x8FB4E3 #x53F5) - (#x8FB4E4 #x5402) - (#x8FB4E5 #x5413) - (#x8FB4E6 #x541A) - (#x8FB4E7 #x5421) - (#x8FB4E8 #x5427) - (#x8FB4E9 #x5428) - (#x8FB4EA #x542A) - (#x8FB4EB #x542F) - (#x8FB4EC #x5431) - (#x8FB4ED #x5434) - (#x8FB4EE #x5435) - (#x8FB4EF #x5443) - (#x8FB4F0 #x5444) - (#x8FB4F1 #x5447) - (#x8FB4F2 #x544D) - (#x8FB4F3 #x544F) - (#x8FB4F4 #x545E) - (#x8FB4F5 #x5462) - (#x8FB4F6 #x5464) - (#x8FB4F7 #x5466) - (#x8FB4F8 #x5467) - (#x8FB4F9 #x5469) - (#x8FB4FA #x546B) - (#x8FB4FB #x546D) - (#x8FB4FC #x546E) - (#x8FB4FD #x5474) - (#x8FB4FE #x547F) - (#x8FB5A1 #x5481) - (#x8FB5A2 #x5483) - (#x8FB5A3 #x5485) - (#x8FB5A4 #x5488) - (#x8FB5A5 #x5489) - (#x8FB5A6 #x548D) - (#x8FB5A7 #x5491) - (#x8FB5A8 #x5495) - (#x8FB5A9 #x5496) - (#x8FB5AA #x549C) - (#x8FB5AB #x549F) - (#x8FB5AC #x54A1) - (#x8FB5AD #x54A6) - (#x8FB5AE #x54A7) - (#x8FB5AF #x54A9) - (#x8FB5B0 #x54AA) - (#x8FB5B1 #x54AD) - (#x8FB5B2 #x54AE) - (#x8FB5B3 #x54B1) - (#x8FB5B4 #x54B7) - (#x8FB5B5 #x54B9) - (#x8FB5B6 #x54BA) - (#x8FB5B7 #x54BB) - (#x8FB5B8 #x54BF) - (#x8FB5B9 #x54C6) - (#x8FB5BA #x54CA) - (#x8FB5BB #x54CD) - (#x8FB5BC #x54CE) - (#x8FB5BD #x54E0) - (#x8FB5BE #x54EA) - (#x8FB5BF #x54EC) - (#x8FB5C0 #x54EF) - (#x8FB5C1 #x54F6) - (#x8FB5C2 #x54FC) - (#x8FB5C3 #x54FE) - (#x8FB5C4 #x54FF) - (#x8FB5C5 #x5500) - (#x8FB5C6 #x5501) - (#x8FB5C7 #x5505) - (#x8FB5C8 #x5508) - (#x8FB5C9 #x5509) - (#x8FB5CA #x550C) - (#x8FB5CB #x550D) - (#x8FB5CC #x550E) - (#x8FB5CD #x5515) - (#x8FB5CE #x552A) - (#x8FB5CF #x552B) - (#x8FB5D0 #x5532) - (#x8FB5D1 #x5535) - (#x8FB5D2 #x5536) - (#x8FB5D3 #x553B) - (#x8FB5D4 #x553C) - (#x8FB5D5 #x553D) - (#x8FB5D6 #x5541) - (#x8FB5D7 #x5547) - (#x8FB5D8 #x5549) - (#x8FB5D9 #x554A) - (#x8FB5DA #x554D) - (#x8FB5DB #x5550) - (#x8FB5DC #x5551) - (#x8FB5DD #x5558) - (#x8FB5DE #x555A) - (#x8FB5DF #x555B) - (#x8FB5E0 #x555E) - (#x8FB5E1 #x5560) - (#x8FB5E2 #x5561) - (#x8FB5E3 #x5564) - (#x8FB5E4 #x5566) - (#x8FB5E5 #x557F) - (#x8FB5E6 #x5581) - (#x8FB5E7 #x5582) - (#x8FB5E8 #x5586) - (#x8FB5E9 #x5588) - (#x8FB5EA #x558E) - (#x8FB5EB #x558F) - (#x8FB5EC #x5591) - (#x8FB5ED #x5592) - (#x8FB5EE #x5593) - (#x8FB5EF #x5594) - (#x8FB5F0 #x5597) - (#x8FB5F1 #x55A3) - (#x8FB5F2 #x55A4) - (#x8FB5F3 #x55AD) - (#x8FB5F4 #x55B2) - (#x8FB5F5 #x55BF) - (#x8FB5F6 #x55C1) - (#x8FB5F7 #x55C3) - (#x8FB5F8 #x55C6) - (#x8FB5F9 #x55C9) - (#x8FB5FA #x55CB) - (#x8FB5FB #x55CC) - (#x8FB5FC #x55CE) - (#x8FB5FD #x55D1) - (#x8FB5FE #x55D2) - (#x8FB6A1 #x55D3) - (#x8FB6A2 #x55D7) - (#x8FB6A3 #x55D8) - (#x8FB6A4 #x55DB) - (#x8FB6A5 #x55DE) - (#x8FB6A6 #x55E2) - (#x8FB6A7 #x55E9) - (#x8FB6A8 #x55F6) - (#x8FB6A9 #x55FF) - (#x8FB6AA #x5605) - (#x8FB6AB #x5608) - (#x8FB6AC #x560A) - (#x8FB6AD #x560D) - (#x8FB6AE #x560E) - (#x8FB6AF #x560F) - (#x8FB6B0 #x5610) - (#x8FB6B1 #x5611) - (#x8FB6B2 #x5612) - (#x8FB6B3 #x5619) - (#x8FB6B4 #x562C) - (#x8FB6B5 #x5630) - (#x8FB6B6 #x5633) - (#x8FB6B7 #x5635) - (#x8FB6B8 #x5637) - (#x8FB6B9 #x5639) - (#x8FB6BA #x563B) - (#x8FB6BB #x563C) - (#x8FB6BC #x563D) - (#x8FB6BD #x563F) - (#x8FB6BE #x5640) - (#x8FB6BF #x5641) - (#x8FB6C0 #x5643) - (#x8FB6C1 #x5644) - (#x8FB6C2 #x5646) - (#x8FB6C3 #x5649) - (#x8FB6C4 #x564B) - (#x8FB6C5 #x564D) - (#x8FB6C6 #x564F) - (#x8FB6C7 #x5654) - (#x8FB6C8 #x565E) - (#x8FB6C9 #x5660) - (#x8FB6CA #x5661) - (#x8FB6CB #x5662) - (#x8FB6CC #x5663) - (#x8FB6CD #x5666) - (#x8FB6CE #x5669) - (#x8FB6CF #x566D) - (#x8FB6D0 #x566F) - (#x8FB6D1 #x5671) - (#x8FB6D2 #x5672) - (#x8FB6D3 #x5675) - (#x8FB6D4 #x5684) - (#x8FB6D5 #x5685) - (#x8FB6D6 #x5688) - (#x8FB6D7 #x568B) - (#x8FB6D8 #x568C) - (#x8FB6D9 #x5695) - (#x8FB6DA #x5699) - (#x8FB6DB #x569A) - (#x8FB6DC #x569D) - (#x8FB6DD #x569E) - (#x8FB6DE #x569F) - (#x8FB6DF #x56A6) - (#x8FB6E0 #x56A7) - (#x8FB6E1 #x56A8) - (#x8FB6E2 #x56A9) - (#x8FB6E3 #x56AB) - (#x8FB6E4 #x56AC) - (#x8FB6E5 #x56AD) - (#x8FB6E6 #x56B1) - (#x8FB6E7 #x56B3) - (#x8FB6E8 #x56B7) - (#x8FB6E9 #x56BE) - (#x8FB6EA #x56C5) - (#x8FB6EB #x56C9) - (#x8FB6EC #x56CA) - (#x8FB6ED #x56CB) - (#x8FB6EE #x56CF) - (#x8FB6EF #x56D0) - (#x8FB6F0 #x56CC) - (#x8FB6F1 #x56CD) - (#x8FB6F2 #x56D9) - (#x8FB6F3 #x56DC) - (#x8FB6F4 #x56DD) - (#x8FB6F5 #x56DF) - (#x8FB6F6 #x56E1) - (#x8FB6F7 #x56E4) - (#x8FB6F8 #x56E5) - (#x8FB6F9 #x56E6) - (#x8FB6FA #x56E7) - (#x8FB6FB #x56E8) - (#x8FB6FC #x56F1) - (#x8FB6FD #x56EB) - (#x8FB6FE #x56ED) - (#x8FB7A1 #x56F6) - (#x8FB7A2 #x56F7) - (#x8FB7A3 #x5701) - (#x8FB7A4 #x5702) - (#x8FB7A5 #x5707) - (#x8FB7A6 #x570A) - (#x8FB7A7 #x570C) - (#x8FB7A8 #x5711) - (#x8FB7A9 #x5715) - (#x8FB7AA #x571A) - (#x8FB7AB #x571B) - (#x8FB7AC #x571D) - (#x8FB7AD #x5720) - (#x8FB7AE #x5722) - (#x8FB7AF #x5723) - (#x8FB7B0 #x5724) - (#x8FB7B1 #x5725) - (#x8FB7B2 #x5729) - (#x8FB7B3 #x572A) - (#x8FB7B4 #x572C) - (#x8FB7B5 #x572E) - (#x8FB7B6 #x572F) - (#x8FB7B7 #x5733) - (#x8FB7B8 #x5734) - (#x8FB7B9 #x573D) - (#x8FB7BA #x573E) - (#x8FB7BB #x573F) - (#x8FB7BC #x5745) - (#x8FB7BD #x5746) - (#x8FB7BE #x574C) - (#x8FB7BF #x574D) - (#x8FB7C0 #x5752) - (#x8FB7C1 #x5762) - (#x8FB7C2 #x5765) - (#x8FB7C3 #x5767) - (#x8FB7C4 #x5768) - (#x8FB7C5 #x576B) - (#x8FB7C6 #x576D) - (#x8FB7C7 #x576E) - (#x8FB7C8 #x576F) - (#x8FB7C9 #x5770) - (#x8FB7CA #x5771) - (#x8FB7CB #x5773) - (#x8FB7CC #x5774) - (#x8FB7CD #x5775) - (#x8FB7CE #x5777) - (#x8FB7CF #x5779) - (#x8FB7D0 #x577A) - (#x8FB7D1 #x577B) - (#x8FB7D2 #x577C) - (#x8FB7D3 #x577E) - (#x8FB7D4 #x5781) - (#x8FB7D5 #x5783) - (#x8FB7D6 #x578C) - (#x8FB7D7 #x5794) - (#x8FB7D8 #x5797) - (#x8FB7D9 #x5799) - (#x8FB7DA #x579A) - (#x8FB7DB #x579C) - (#x8FB7DC #x579D) - (#x8FB7DD #x579E) - (#x8FB7DE #x579F) - (#x8FB7DF #x57A1) - (#x8FB7E0 #x5795) - (#x8FB7E1 #x57A7) - (#x8FB7E2 #x57A8) - (#x8FB7E3 #x57A9) - (#x8FB7E4 #x57AC) - (#x8FB7E5 #x57B8) - (#x8FB7E6 #x57BD) - (#x8FB7E7 #x57C7) - (#x8FB7E8 #x57C8) - (#x8FB7E9 #x57CC) - (#x8FB7EA #x57CF) - (#x8FB7EB #x57D5) - (#x8FB7EC #x57DD) - (#x8FB7ED #x57DE) - (#x8FB7EE #x57E4) - (#x8FB7EF #x57E6) - (#x8FB7F0 #x57E7) - (#x8FB7F1 #x57E9) - (#x8FB7F2 #x57ED) - (#x8FB7F3 #x57F0) - (#x8FB7F4 #x57F5) - (#x8FB7F5 #x57F6) - (#x8FB7F6 #x57F8) - (#x8FB7F7 #x57FD) - (#x8FB7F8 #x57FE) - (#x8FB7F9 #x57FF) - (#x8FB7FA #x5803) - (#x8FB7FB #x5804) - (#x8FB7FC #x5808) - (#x8FB7FD #x5809) - (#x8FB7FE #x57E1) - (#x8FB8A1 #x580C) - (#x8FB8A2 #x580D) - (#x8FB8A3 #x581B) - (#x8FB8A4 #x581E) - (#x8FB8A5 #x581F) - (#x8FB8A6 #x5820) - (#x8FB8A7 #x5826) - (#x8FB8A8 #x5827) - (#x8FB8A9 #x582D) - (#x8FB8AA #x5832) - (#x8FB8AB #x5839) - (#x8FB8AC #x583F) - (#x8FB8AD #x5849) - (#x8FB8AE #x584C) - (#x8FB8AF #x584D) - (#x8FB8B0 #x584F) - (#x8FB8B1 #x5850) - (#x8FB8B2 #x5855) - (#x8FB8B3 #x585F) - (#x8FB8B4 #x5861) - (#x8FB8B5 #x5864) - (#x8FB8B6 #x5867) - (#x8FB8B7 #x5868) - (#x8FB8B8 #x5878) - (#x8FB8B9 #x587C) - (#x8FB8BA #x587F) - (#x8FB8BB #x5880) - (#x8FB8BC #x5881) - (#x8FB8BD #x5887) - (#x8FB8BE #x5888) - (#x8FB8BF #x5889) - (#x8FB8C0 #x588A) - (#x8FB8C1 #x588C) - (#x8FB8C2 #x588D) - (#x8FB8C3 #x588F) - (#x8FB8C4 #x5890) - (#x8FB8C5 #x5894) - (#x8FB8C6 #x5896) - (#x8FB8C7 #x589D) - (#x8FB8C8 #x58A0) - (#x8FB8C9 #x58A1) - (#x8FB8CA #x58A2) - (#x8FB8CB #x58A6) - (#x8FB8CC #x58A9) - (#x8FB8CD #x58B1) - (#x8FB8CE #x58B2) - (#x8FB8CF #x58C4) - (#x8FB8D0 #x58BC) - (#x8FB8D1 #x58C2) - (#x8FB8D2 #x58C8) - (#x8FB8D3 #x58CD) - (#x8FB8D4 #x58CE) - (#x8FB8D5 #x58D0) - (#x8FB8D6 #x58D2) - (#x8FB8D7 #x58D4) - (#x8FB8D8 #x58D6) - (#x8FB8D9 #x58DA) - (#x8FB8DA #x58DD) - (#x8FB8DB #x58E1) - (#x8FB8DC #x58E2) - (#x8FB8DD #x58E9) - (#x8FB8DE #x58F3) - (#x8FB8DF #x5905) - (#x8FB8E0 #x5906) - (#x8FB8E1 #x590B) - (#x8FB8E2 #x590C) - (#x8FB8E3 #x5912) - (#x8FB8E4 #x5913) - (#x8FB8E5 #x5914) - (#x8FB8E6 #x8641) - (#x8FB8E7 #x591D) - (#x8FB8E8 #x5921) - (#x8FB8E9 #x5923) - (#x8FB8EA #x5924) - (#x8FB8EB #x5928) - (#x8FB8EC #x592F) - (#x8FB8ED #x5930) - (#x8FB8EE #x5933) - (#x8FB8EF #x5935) - (#x8FB8F0 #x5936) - (#x8FB8F1 #x593F) - (#x8FB8F2 #x5943) - (#x8FB8F3 #x5946) - (#x8FB8F4 #x5952) - (#x8FB8F5 #x5953) - (#x8FB8F6 #x5959) - (#x8FB8F7 #x595B) - (#x8FB8F8 #x595D) - (#x8FB8F9 #x595E) - (#x8FB8FA #x595F) - (#x8FB8FB #x5961) - (#x8FB8FC #x5963) - (#x8FB8FD #x596B) - (#x8FB8FE #x596D) - (#x8FB9A1 #x596F) - (#x8FB9A2 #x5972) - (#x8FB9A3 #x5975) - (#x8FB9A4 #x5976) - (#x8FB9A5 #x5979) - (#x8FB9A6 #x597B) - (#x8FB9A7 #x597C) - (#x8FB9A8 #x598B) - (#x8FB9A9 #x598C) - (#x8FB9AA #x598E) - (#x8FB9AB #x5992) - (#x8FB9AC #x5995) - (#x8FB9AD #x5997) - (#x8FB9AE #x599F) - (#x8FB9AF #x59A4) - (#x8FB9B0 #x59A7) - (#x8FB9B1 #x59AD) - (#x8FB9B2 #x59AE) - (#x8FB9B3 #x59AF) - (#x8FB9B4 #x59B0) - (#x8FB9B5 #x59B3) - (#x8FB9B6 #x59B7) - (#x8FB9B7 #x59BA) - (#x8FB9B8 #x59BC) - (#x8FB9B9 #x59C1) - (#x8FB9BA #x59C3) - (#x8FB9BB #x59C4) - (#x8FB9BC #x59C8) - (#x8FB9BD #x59CA) - (#x8FB9BE #x59CD) - (#x8FB9BF #x59D2) - (#x8FB9C0 #x59DD) - (#x8FB9C1 #x59DE) - (#x8FB9C2 #x59DF) - (#x8FB9C3 #x59E3) - (#x8FB9C4 #x59E4) - (#x8FB9C5 #x59E7) - (#x8FB9C6 #x59EE) - (#x8FB9C7 #x59EF) - (#x8FB9C8 #x59F1) - (#x8FB9C9 #x59F2) - (#x8FB9CA #x59F4) - (#x8FB9CB #x59F7) - (#x8FB9CC #x5A00) - (#x8FB9CD #x5A04) - (#x8FB9CE #x5A0C) - (#x8FB9CF #x5A0D) - (#x8FB9D0 #x5A0E) - (#x8FB9D1 #x5A12) - (#x8FB9D2 #x5A13) - (#x8FB9D3 #x5A1E) - (#x8FB9D4 #x5A23) - (#x8FB9D5 #x5A24) - (#x8FB9D6 #x5A27) - (#x8FB9D7 #x5A28) - (#x8FB9D8 #x5A2A) - (#x8FB9D9 #x5A2D) - (#x8FB9DA #x5A30) - (#x8FB9DB #x5A44) - (#x8FB9DC #x5A45) - (#x8FB9DD #x5A47) - (#x8FB9DE #x5A48) - (#x8FB9DF #x5A4C) - (#x8FB9E0 #x5A50) - (#x8FB9E1 #x5A55) - (#x8FB9E2 #x5A5E) - (#x8FB9E3 #x5A63) - (#x8FB9E4 #x5A65) - (#x8FB9E5 #x5A67) - (#x8FB9E6 #x5A6D) - (#x8FB9E7 #x5A77) - (#x8FB9E8 #x5A7A) - (#x8FB9E9 #x5A7B) - (#x8FB9EA #x5A7E) - (#x8FB9EB #x5A8B) - (#x8FB9EC #x5A90) - (#x8FB9ED #x5A93) - (#x8FB9EE #x5A96) - (#x8FB9EF #x5A99) - (#x8FB9F0 #x5A9C) - (#x8FB9F1 #x5A9E) - (#x8FB9F2 #x5A9F) - (#x8FB9F3 #x5AA0) - (#x8FB9F4 #x5AA2) - (#x8FB9F5 #x5AA7) - (#x8FB9F6 #x5AAC) - (#x8FB9F7 #x5AB1) - (#x8FB9F8 #x5AB2) - (#x8FB9F9 #x5AB3) - (#x8FB9FA #x5AB5) - (#x8FB9FB #x5AB8) - (#x8FB9FC #x5ABA) - (#x8FB9FD #x5ABB) - (#x8FB9FE #x5ABF) - (#x8FBAA1 #x5AC4) - (#x8FBAA2 #x5AC6) - (#x8FBAA3 #x5AC8) - (#x8FBAA4 #x5ACF) - (#x8FBAA5 #x5ADA) - (#x8FBAA6 #x5ADC) - (#x8FBAA7 #x5AE0) - (#x8FBAA8 #x5AE5) - (#x8FBAA9 #x5AEA) - (#x8FBAAA #x5AEE) - (#x8FBAAB #x5AF5) - (#x8FBAAC #x5AF6) - (#x8FBAAD #x5AFD) - (#x8FBAAE #x5B00) - (#x8FBAAF #x5B01) - (#x8FBAB0 #x5B08) - (#x8FBAB1 #x5B17) - (#x8FBAB2 #x5B34) - (#x8FBAB3 #x5B19) - (#x8FBAB4 #x5B1B) - (#x8FBAB5 #x5B1D) - (#x8FBAB6 #x5B21) - (#x8FBAB7 #x5B25) - (#x8FBAB8 #x5B2D) - (#x8FBAB9 #x5B38) - (#x8FBABA #x5B41) - (#x8FBABB #x5B4B) - (#x8FBABC #x5B4C) - (#x8FBABD #x5B52) - (#x8FBABE #x5B56) - (#x8FBABF #x5B5E) - (#x8FBAC0 #x5B68) - (#x8FBAC1 #x5B6E) - (#x8FBAC2 #x5B6F) - (#x8FBAC3 #x5B7C) - (#x8FBAC4 #x5B7D) - (#x8FBAC5 #x5B7E) - (#x8FBAC6 #x5B7F) - (#x8FBAC7 #x5B81) - (#x8FBAC8 #x5B84) - (#x8FBAC9 #x5B86) - (#x8FBACA #x5B8A) - (#x8FBACB #x5B8E) - (#x8FBACC #x5B90) - (#x8FBACD #x5B91) - (#x8FBACE #x5B93) - (#x8FBACF #x5B94) - (#x8FBAD0 #x5B96) - (#x8FBAD1 #x5BA8) - (#x8FBAD2 #x5BA9) - (#x8FBAD3 #x5BAC) - (#x8FBAD4 #x5BAD) - (#x8FBAD5 #x5BAF) - (#x8FBAD6 #x5BB1) - (#x8FBAD7 #x5BB2) - (#x8FBAD8 #x5BB7) - (#x8FBAD9 #x5BBA) - (#x8FBADA #x5BBC) - (#x8FBADB #x5BC0) - (#x8FBADC #x5BC1) - (#x8FBADD #x5BCD) - (#x8FBADE #x5BCF) - (#x8FBADF #x5BD6) - (#x8FBAE0 #x5BD7) - (#x8FBAE1 #x5BD8) - (#x8FBAE2 #x5BD9) - (#x8FBAE3 #x5BDA) - (#x8FBAE4 #x5BE0) - (#x8FBAE5 #x5BEF) - (#x8FBAE6 #x5BF1) - (#x8FBAE7 #x5BF4) - (#x8FBAE8 #x5BFD) - (#x8FBAE9 #x5C0C) - (#x8FBAEA #x5C17) - (#x8FBAEB #x5C1E) - (#x8FBAEC #x5C1F) - (#x8FBAED #x5C23) - (#x8FBAEE #x5C26) - (#x8FBAEF #x5C29) - (#x8FBAF0 #x5C2B) - (#x8FBAF1 #x5C2C) - (#x8FBAF2 #x5C2E) - (#x8FBAF3 #x5C30) - (#x8FBAF4 #x5C32) - (#x8FBAF5 #x5C35) - (#x8FBAF6 #x5C36) - (#x8FBAF7 #x5C59) - (#x8FBAF8 #x5C5A) - (#x8FBAF9 #x5C5C) - (#x8FBAFA #x5C62) - (#x8FBAFB #x5C63) - (#x8FBAFC #x5C67) - (#x8FBAFD #x5C68) - (#x8FBAFE #x5C69) - (#x8FBBA1 #x5C6D) - (#x8FBBA2 #x5C70) - (#x8FBBA3 #x5C74) - (#x8FBBA4 #x5C75) - (#x8FBBA5 #x5C7A) - (#x8FBBA6 #x5C7B) - (#x8FBBA7 #x5C7C) - (#x8FBBA8 #x5C7D) - (#x8FBBA9 #x5C87) - (#x8FBBAA #x5C88) - (#x8FBBAB #x5C8A) - (#x8FBBAC #x5C8F) - (#x8FBBAD #x5C92) - (#x8FBBAE #x5C9D) - (#x8FBBAF #x5C9F) - (#x8FBBB0 #x5CA0) - (#x8FBBB1 #x5CA2) - (#x8FBBB2 #x5CA3) - (#x8FBBB3 #x5CA6) - (#x8FBBB4 #x5CAA) - (#x8FBBB5 #x5CB2) - (#x8FBBB6 #x5CB4) - (#x8FBBB7 #x5CB5) - (#x8FBBB8 #x5CBA) - (#x8FBBB9 #x5CC9) - (#x8FBBBA #x5CCB) - (#x8FBBBB #x5CD2) - (#x8FBBBC #x5CDD) - (#x8FBBBD #x5CD7) - (#x8FBBBE #x5CEE) - (#x8FBBBF #x5CF1) - (#x8FBBC0 #x5CF2) - (#x8FBBC1 #x5CF4) - (#x8FBBC2 #x5D01) - (#x8FBBC3 #x5D06) - (#x8FBBC4 #x5D0D) - (#x8FBBC5 #x5D12) - (#x8FBBC6 #x5D2B) - (#x8FBBC7 #x5D23) - (#x8FBBC8 #x5D24) - (#x8FBBC9 #x5D26) - (#x8FBBCA #x5D27) - (#x8FBBCB #x5D31) - (#x8FBBCC #x5D34) - (#x8FBBCD #x5D39) - (#x8FBBCE #x5D3D) - (#x8FBBCF #x5D3F) - (#x8FBBD0 #x5D42) - (#x8FBBD1 #x5D43) - (#x8FBBD2 #x5D46) - (#x8FBBD3 #x5D48) - (#x8FBBD4 #x5D55) - (#x8FBBD5 #x5D51) - (#x8FBBD6 #x5D59) - (#x8FBBD7 #x5D4A) - (#x8FBBD8 #x5D5F) - (#x8FBBD9 #x5D60) - (#x8FBBDA #x5D61) - (#x8FBBDB #x5D62) - (#x8FBBDC #x5D64) - (#x8FBBDD #x5D6A) - (#x8FBBDE #x5D6D) - (#x8FBBDF #x5D70) - (#x8FBBE0 #x5D79) - (#x8FBBE1 #x5D7A) - (#x8FBBE2 #x5D7E) - (#x8FBBE3 #x5D7F) - (#x8FBBE4 #x5D81) - (#x8FBBE5 #x5D83) - (#x8FBBE6 #x5D88) - (#x8FBBE7 #x5D8A) - (#x8FBBE8 #x5D92) - (#x8FBBE9 #x5D93) - (#x8FBBEA #x5D94) - (#x8FBBEB #x5D95) - (#x8FBBEC #x5D99) - (#x8FBBED #x5D9B) - (#x8FBBEE #x5D9F) - (#x8FBBEF #x5DA0) - (#x8FBBF0 #x5DA7) - (#x8FBBF1 #x5DAB) - (#x8FBBF2 #x5DB0) - (#x8FBBF3 #x5DB4) - (#x8FBBF4 #x5DB8) - (#x8FBBF5 #x5DB9) - (#x8FBBF6 #x5DC3) - (#x8FBBF7 #x5DC7) - (#x8FBBF8 #x5DCB) - (#x8FBBF9 #x5DD0) - (#x8FBBFA #x5DCE) - (#x8FBBFB #x5DD8) - (#x8FBBFC #x5DD9) - (#x8FBBFD #x5DE0) - (#x8FBBFE #x5DE4) - (#x8FBCA1 #x5DE9) - (#x8FBCA2 #x5DF8) - (#x8FBCA3 #x5DF9) - (#x8FBCA4 #x5E00) - (#x8FBCA5 #x5E07) - (#x8FBCA6 #x5E0D) - (#x8FBCA7 #x5E12) - (#x8FBCA8 #x5E14) - (#x8FBCA9 #x5E15) - (#x8FBCAA #x5E18) - (#x8FBCAB #x5E1F) - (#x8FBCAC #x5E20) - (#x8FBCAD #x5E2E) - (#x8FBCAE #x5E28) - (#x8FBCAF #x5E32) - (#x8FBCB0 #x5E35) - (#x8FBCB1 #x5E3E) - (#x8FBCB2 #x5E4B) - (#x8FBCB3 #x5E50) - (#x8FBCB4 #x5E49) - (#x8FBCB5 #x5E51) - (#x8FBCB6 #x5E56) - (#x8FBCB7 #x5E58) - (#x8FBCB8 #x5E5B) - (#x8FBCB9 #x5E5C) - (#x8FBCBA #x5E5E) - (#x8FBCBB #x5E68) - (#x8FBCBC #x5E6A) - (#x8FBCBD #x5E6B) - (#x8FBCBE #x5E6C) - (#x8FBCBF #x5E6D) - (#x8FBCC0 #x5E6E) - (#x8FBCC1 #x5E70) - (#x8FBCC2 #x5E80) - (#x8FBCC3 #x5E8B) - (#x8FBCC4 #x5E8E) - (#x8FBCC5 #x5EA2) - (#x8FBCC6 #x5EA4) - (#x8FBCC7 #x5EA5) - (#x8FBCC8 #x5EA8) - (#x8FBCC9 #x5EAA) - (#x8FBCCA #x5EAC) - (#x8FBCCB #x5EB1) - (#x8FBCCC #x5EB3) - (#x8FBCCD #x5EBD) - (#x8FBCCE #x5EBE) - (#x8FBCCF #x5EBF) - (#x8FBCD0 #x5EC6) - (#x8FBCD1 #x5ECC) - (#x8FBCD2 #x5ECB) - (#x8FBCD3 #x5ECE) - (#x8FBCD4 #x5ED1) - (#x8FBCD5 #x5ED2) - (#x8FBCD6 #x5ED4) - (#x8FBCD7 #x5ED5) - (#x8FBCD8 #x5EDC) - (#x8FBCD9 #x5EDE) - (#x8FBCDA #x5EE5) - (#x8FBCDB #x5EEB) - (#x8FBCDC #x5F02) - (#x8FBCDD #x5F06) - (#x8FBCDE #x5F07) - (#x8FBCDF #x5F08) - (#x8FBCE0 #x5F0E) - (#x8FBCE1 #x5F19) - (#x8FBCE2 #x5F1C) - (#x8FBCE3 #x5F1D) - (#x8FBCE4 #x5F21) - (#x8FBCE5 #x5F22) - (#x8FBCE6 #x5F23) - (#x8FBCE7 #x5F24) - (#x8FBCE8 #x5F28) - (#x8FBCE9 #x5F2B) - (#x8FBCEA #x5F2C) - (#x8FBCEB #x5F2E) - (#x8FBCEC #x5F30) - (#x8FBCED #x5F34) - (#x8FBCEE #x5F36) - (#x8FBCEF #x5F3B) - (#x8FBCF0 #x5F3D) - (#x8FBCF1 #x5F3F) - (#x8FBCF2 #x5F40) - (#x8FBCF3 #x5F44) - (#x8FBCF4 #x5F45) - (#x8FBCF5 #x5F47) - (#x8FBCF6 #x5F4D) - (#x8FBCF7 #x5F50) - (#x8FBCF8 #x5F54) - (#x8FBCF9 #x5F58) - (#x8FBCFA #x5F5B) - (#x8FBCFB #x5F60) - (#x8FBCFC #x5F63) - (#x8FBCFD #x5F64) - (#x8FBCFE #x5F67) - (#x8FBDA1 #x5F6F) - (#x8FBDA2 #x5F72) - (#x8FBDA3 #x5F74) - (#x8FBDA4 #x5F75) - (#x8FBDA5 #x5F78) - (#x8FBDA6 #x5F7A) - (#x8FBDA7 #x5F7D) - (#x8FBDA8 #x5F7E) - (#x8FBDA9 #x5F89) - (#x8FBDAA #x5F8D) - (#x8FBDAB #x5F8F) - (#x8FBDAC #x5F96) - (#x8FBDAD #x5F9C) - (#x8FBDAE #x5F9D) - (#x8FBDAF #x5FA2) - (#x8FBDB0 #x5FA7) - (#x8FBDB1 #x5FAB) - (#x8FBDB2 #x5FA4) - (#x8FBDB3 #x5FAC) - (#x8FBDB4 #x5FAF) - (#x8FBDB5 #x5FB0) - (#x8FBDB6 #x5FB1) - (#x8FBDB7 #x5FB8) - (#x8FBDB8 #x5FC4) - (#x8FBDB9 #x5FC7) - (#x8FBDBA #x5FC8) - (#x8FBDBB #x5FC9) - (#x8FBDBC #x5FCB) - (#x8FBDBD #x5FD0) - (#x8FBDBE #x5FD1) - (#x8FBDBF #x5FD2) - (#x8FBDC0 #x5FD3) - (#x8FBDC1 #x5FD4) - (#x8FBDC2 #x5FDE) - (#x8FBDC3 #x5FE1) - (#x8FBDC4 #x5FE2) - (#x8FBDC5 #x5FE8) - (#x8FBDC6 #x5FE9) - (#x8FBDC7 #x5FEA) - (#x8FBDC8 #x5FEC) - (#x8FBDC9 #x5FED) - (#x8FBDCA #x5FEE) - (#x8FBDCB #x5FEF) - (#x8FBDCC #x5FF2) - (#x8FBDCD #x5FF3) - (#x8FBDCE #x5FF6) - (#x8FBDCF #x5FFA) - (#x8FBDD0 #x5FFC) - (#x8FBDD1 #x6007) - (#x8FBDD2 #x600A) - (#x8FBDD3 #x600D) - (#x8FBDD4 #x6013) - (#x8FBDD5 #x6014) - (#x8FBDD6 #x6017) - (#x8FBDD7 #x6018) - (#x8FBDD8 #x601A) - (#x8FBDD9 #x601F) - (#x8FBDDA #x6024) - (#x8FBDDB #x602D) - (#x8FBDDC #x6033) - (#x8FBDDD #x6035) - (#x8FBDDE #x6040) - (#x8FBDDF #x6047) - (#x8FBDE0 #x6048) - (#x8FBDE1 #x6049) - (#x8FBDE2 #x604C) - (#x8FBDE3 #x6051) - (#x8FBDE4 #x6054) - (#x8FBDE5 #x6056) - (#x8FBDE6 #x6057) - (#x8FBDE7 #x605D) - (#x8FBDE8 #x6061) - (#x8FBDE9 #x6067) - (#x8FBDEA #x6071) - (#x8FBDEB #x607E) - (#x8FBDEC #x607F) - (#x8FBDED #x6082) - (#x8FBDEE #x6086) - (#x8FBDEF #x6088) - (#x8FBDF0 #x608A) - (#x8FBDF1 #x608E) - (#x8FBDF2 #x6091) - (#x8FBDF3 #x6093) - (#x8FBDF4 #x6095) - (#x8FBDF5 #x6098) - (#x8FBDF6 #x609D) - (#x8FBDF7 #x609E) - (#x8FBDF8 #x60A2) - (#x8FBDF9 #x60A4) - (#x8FBDFA #x60A5) - (#x8FBDFB #x60A8) - (#x8FBDFC #x60B0) - (#x8FBDFD #x60B1) - (#x8FBDFE #x60B7) - (#x8FBEA1 #x60BB) - (#x8FBEA2 #x60BE) - (#x8FBEA3 #x60C2) - (#x8FBEA4 #x60C4) - (#x8FBEA5 #x60C8) - (#x8FBEA6 #x60C9) - (#x8FBEA7 #x60CA) - (#x8FBEA8 #x60CB) - (#x8FBEA9 #x60CE) - (#x8FBEAA #x60CF) - (#x8FBEAB #x60D4) - (#x8FBEAC #x60D5) - (#x8FBEAD #x60D9) - (#x8FBEAE #x60DB) - (#x8FBEAF #x60DD) - (#x8FBEB0 #x60DE) - (#x8FBEB1 #x60E2) - (#x8FBEB2 #x60E5) - (#x8FBEB3 #x60F2) - (#x8FBEB4 #x60F5) - (#x8FBEB5 #x60F8) - (#x8FBEB6 #x60FC) - (#x8FBEB7 #x60FD) - (#x8FBEB8 #x6102) - (#x8FBEB9 #x6107) - (#x8FBEBA #x610A) - (#x8FBEBB #x610C) - (#x8FBEBC #x6110) - (#x8FBEBD #x6111) - (#x8FBEBE #x6112) - (#x8FBEBF #x6113) - (#x8FBEC0 #x6114) - (#x8FBEC1 #x6116) - (#x8FBEC2 #x6117) - (#x8FBEC3 #x6119) - (#x8FBEC4 #x611C) - (#x8FBEC5 #x611E) - (#x8FBEC6 #x6122) - (#x8FBEC7 #x612A) - (#x8FBEC8 #x612B) - (#x8FBEC9 #x6130) - (#x8FBECA #x6131) - (#x8FBECB #x6135) - (#x8FBECC #x6136) - (#x8FBECD #x6137) - (#x8FBECE #x6139) - (#x8FBECF #x6141) - (#x8FBED0 #x6145) - (#x8FBED1 #x6146) - (#x8FBED2 #x6149) - (#x8FBED3 #x615E) - (#x8FBED4 #x6160) - (#x8FBED5 #x616C) - (#x8FBED6 #x6172) - (#x8FBED7 #x6178) - (#x8FBED8 #x617B) - (#x8FBED9 #x617C) - (#x8FBEDA #x617F) - (#x8FBEDB #x6180) - (#x8FBEDC #x6181) - (#x8FBEDD #x6183) - (#x8FBEDE #x6184) - (#x8FBEDF #x618B) - (#x8FBEE0 #x618D) - (#x8FBEE1 #x6192) - (#x8FBEE2 #x6193) - (#x8FBEE3 #x6197) - (#x8FBEE4 #x6198) - (#x8FBEE5 #x619C) - (#x8FBEE6 #x619D) - (#x8FBEE7 #x619F) - (#x8FBEE8 #x61A0) - (#x8FBEE9 #x61A5) - (#x8FBEEA #x61A8) - (#x8FBEEB #x61AA) - (#x8FBEEC #x61AD) - (#x8FBEED #x61B8) - (#x8FBEEE #x61B9) - (#x8FBEEF #x61BC) - (#x8FBEF0 #x61C0) - (#x8FBEF1 #x61C1) - (#x8FBEF2 #x61C2) - (#x8FBEF3 #x61CE) - (#x8FBEF4 #x61CF) - (#x8FBEF5 #x61D5) - (#x8FBEF6 #x61DC) - (#x8FBEF7 #x61DD) - (#x8FBEF8 #x61DE) - (#x8FBEF9 #x61DF) - (#x8FBEFA #x61E1) - (#x8FBEFB #x61E2) - (#x8FBEFC #x61E7) - (#x8FBEFD #x61E9) - (#x8FBEFE #x61E5) - (#x8FBFA1 #x61EC) - (#x8FBFA2 #x61ED) - (#x8FBFA3 #x61EF) - (#x8FBFA4 #x6201) - (#x8FBFA5 #x6203) - (#x8FBFA6 #x6204) - (#x8FBFA7 #x6207) - (#x8FBFA8 #x6213) - (#x8FBFA9 #x6215) - (#x8FBFAA #x621C) - (#x8FBFAB #x6220) - (#x8FBFAC #x6222) - (#x8FBFAD #x6223) - (#x8FBFAE #x6227) - (#x8FBFAF #x6229) - (#x8FBFB0 #x622B) - (#x8FBFB1 #x6239) - (#x8FBFB2 #x623D) - (#x8FBFB3 #x6242) - (#x8FBFB4 #x6243) - (#x8FBFB5 #x6244) - (#x8FBFB6 #x6246) - (#x8FBFB7 #x624C) - (#x8FBFB8 #x6250) - (#x8FBFB9 #x6251) - (#x8FBFBA #x6252) - (#x8FBFBB #x6254) - (#x8FBFBC #x6256) - (#x8FBFBD #x625A) - (#x8FBFBE #x625C) - (#x8FBFBF #x6264) - (#x8FBFC0 #x626D) - (#x8FBFC1 #x626F) - (#x8FBFC2 #x6273) - (#x8FBFC3 #x627A) - (#x8FBFC4 #x627D) - (#x8FBFC5 #x628D) - (#x8FBFC6 #x628E) - (#x8FBFC7 #x628F) - (#x8FBFC8 #x6290) - (#x8FBFC9 #x62A6) - (#x8FBFCA #x62A8) - (#x8FBFCB #x62B3) - (#x8FBFCC #x62B6) - (#x8FBFCD #x62B7) - (#x8FBFCE #x62BA) - (#x8FBFCF #x62BE) - (#x8FBFD0 #x62BF) - (#x8FBFD1 #x62C4) - (#x8FBFD2 #x62CE) - (#x8FBFD3 #x62D5) - (#x8FBFD4 #x62D6) - (#x8FBFD5 #x62DA) - (#x8FBFD6 #x62EA) - (#x8FBFD7 #x62F2) - (#x8FBFD8 #x62F4) - (#x8FBFD9 #x62FC) - (#x8FBFDA #x62FD) - (#x8FBFDB #x6303) - (#x8FBFDC #x6304) - (#x8FBFDD #x630A) - (#x8FBFDE #x630B) - (#x8FBFDF #x630D) - (#x8FBFE0 #x6310) - (#x8FBFE1 #x6313) - (#x8FBFE2 #x6316) - (#x8FBFE3 #x6318) - (#x8FBFE4 #x6329) - (#x8FBFE5 #x632A) - (#x8FBFE6 #x632D) - (#x8FBFE7 #x6335) - (#x8FBFE8 #x6336) - (#x8FBFE9 #x6339) - (#x8FBFEA #x633C) - (#x8FBFEB #x6341) - (#x8FBFEC #x6342) - (#x8FBFED #x6343) - (#x8FBFEE #x6344) - (#x8FBFEF #x6346) - (#x8FBFF0 #x634A) - (#x8FBFF1 #x634B) - (#x8FBFF2 #x634E) - (#x8FBFF3 #x6352) - (#x8FBFF4 #x6353) - (#x8FBFF5 #x6354) - (#x8FBFF6 #x6358) - (#x8FBFF7 #x635B) - (#x8FBFF8 #x6365) - (#x8FBFF9 #x6366) - (#x8FBFFA #x636C) - (#x8FBFFB #x636D) - (#x8FBFFC #x6371) - (#x8FBFFD #x6374) - (#x8FBFFE #x6375) - (#x8FC0A1 #x6378) - (#x8FC0A2 #x637C) - (#x8FC0A3 #x637D) - (#x8FC0A4 #x637F) - (#x8FC0A5 #x6382) - (#x8FC0A6 #x6384) - (#x8FC0A7 #x6387) - (#x8FC0A8 #x638A) - (#x8FC0A9 #x6390) - (#x8FC0AA #x6394) - (#x8FC0AB #x6395) - (#x8FC0AC #x6399) - (#x8FC0AD #x639A) - (#x8FC0AE #x639E) - (#x8FC0AF #x63A4) - (#x8FC0B0 #x63A6) - (#x8FC0B1 #x63AD) - (#x8FC0B2 #x63AE) - (#x8FC0B3 #x63AF) - (#x8FC0B4 #x63BD) - (#x8FC0B5 #x63C1) - (#x8FC0B6 #x63C5) - (#x8FC0B7 #x63C8) - (#x8FC0B8 #x63CE) - (#x8FC0B9 #x63D1) - (#x8FC0BA #x63D3) - (#x8FC0BB #x63D4) - (#x8FC0BC #x63D5) - (#x8FC0BD #x63DC) - (#x8FC0BE #x63E0) - (#x8FC0BF #x63E5) - (#x8FC0C0 #x63EA) - (#x8FC0C1 #x63EC) - (#x8FC0C2 #x63F2) - (#x8FC0C3 #x63F3) - (#x8FC0C4 #x63F5) - (#x8FC0C5 #x63F8) - (#x8FC0C6 #x63F9) - (#x8FC0C7 #x6409) - (#x8FC0C8 #x640A) - (#x8FC0C9 #x6410) - (#x8FC0CA #x6412) - (#x8FC0CB #x6414) - (#x8FC0CC #x6418) - (#x8FC0CD #x641E) - (#x8FC0CE #x6420) - (#x8FC0CF #x6422) - (#x8FC0D0 #x6424) - (#x8FC0D1 #x6425) - (#x8FC0D2 #x6429) - (#x8FC0D3 #x642A) - (#x8FC0D4 #x642F) - (#x8FC0D5 #x6430) - (#x8FC0D6 #x6435) - (#x8FC0D7 #x643D) - (#x8FC0D8 #x643F) - (#x8FC0D9 #x644B) - (#x8FC0DA #x644F) - (#x8FC0DB #x6451) - (#x8FC0DC #x6452) - (#x8FC0DD #x6453) - (#x8FC0DE #x6454) - (#x8FC0DF #x645A) - (#x8FC0E0 #x645B) - (#x8FC0E1 #x645C) - (#x8FC0E2 #x645D) - (#x8FC0E3 #x645F) - (#x8FC0E4 #x6460) - (#x8FC0E5 #x6461) - (#x8FC0E6 #x6463) - (#x8FC0E7 #x646D) - (#x8FC0E8 #x6473) - (#x8FC0E9 #x6474) - (#x8FC0EA #x647B) - (#x8FC0EB #x647D) - (#x8FC0EC #x6485) - (#x8FC0ED #x6487) - (#x8FC0EE #x648F) - (#x8FC0EF #x6490) - (#x8FC0F0 #x6491) - (#x8FC0F1 #x6498) - (#x8FC0F2 #x6499) - (#x8FC0F3 #x649B) - (#x8FC0F4 #x649D) - (#x8FC0F5 #x649F) - (#x8FC0F6 #x64A1) - (#x8FC0F7 #x64A3) - (#x8FC0F8 #x64A6) - (#x8FC0F9 #x64A8) - (#x8FC0FA #x64AC) - (#x8FC0FB #x64B3) - (#x8FC0FC #x64BD) - (#x8FC0FD #x64BE) - (#x8FC0FE #x64BF) - (#x8FC1A1 #x64C4) - (#x8FC1A2 #x64C9) - (#x8FC1A3 #x64CA) - (#x8FC1A4 #x64CB) - (#x8FC1A5 #x64CC) - (#x8FC1A6 #x64CE) - (#x8FC1A7 #x64D0) - (#x8FC1A8 #x64D1) - (#x8FC1A9 #x64D5) - (#x8FC1AA #x64D7) - (#x8FC1AB #x64E4) - (#x8FC1AC #x64E5) - (#x8FC1AD #x64E9) - (#x8FC1AE #x64EA) - (#x8FC1AF #x64ED) - (#x8FC1B0 #x64F0) - (#x8FC1B1 #x64F5) - (#x8FC1B2 #x64F7) - (#x8FC1B3 #x64FB) - (#x8FC1B4 #x64FF) - (#x8FC1B5 #x6501) - (#x8FC1B6 #x6504) - (#x8FC1B7 #x6508) - (#x8FC1B8 #x6509) - (#x8FC1B9 #x650A) - (#x8FC1BA #x650F) - (#x8FC1BB #x6513) - (#x8FC1BC #x6514) - (#x8FC1BD #x6516) - (#x8FC1BE #x6519) - (#x8FC1BF #x651B) - (#x8FC1C0 #x651E) - (#x8FC1C1 #x651F) - (#x8FC1C2 #x6522) - (#x8FC1C3 #x6526) - (#x8FC1C4 #x6529) - (#x8FC1C5 #x652E) - (#x8FC1C6 #x6531) - (#x8FC1C7 #x653A) - (#x8FC1C8 #x653C) - (#x8FC1C9 #x653D) - (#x8FC1CA #x6543) - (#x8FC1CB #x6547) - (#x8FC1CC #x6549) - (#x8FC1CD #x6550) - (#x8FC1CE #x6552) - (#x8FC1CF #x6554) - (#x8FC1D0 #x655F) - (#x8FC1D1 #x6560) - (#x8FC1D2 #x6567) - (#x8FC1D3 #x656B) - (#x8FC1D4 #x657A) - (#x8FC1D5 #x657D) - (#x8FC1D6 #x6581) - (#x8FC1D7 #x6585) - (#x8FC1D8 #x658A) - (#x8FC1D9 #x6592) - (#x8FC1DA #x6595) - (#x8FC1DB #x6598) - (#x8FC1DC #x659D) - (#x8FC1DD #x65A0) - (#x8FC1DE #x65A3) - (#x8FC1DF #x65A6) - (#x8FC1E0 #x65AE) - (#x8FC1E1 #x65B2) - (#x8FC1E2 #x65B3) - (#x8FC1E3 #x65B4) - (#x8FC1E4 #x65BF) - (#x8FC1E5 #x65C2) - (#x8FC1E6 #x65C8) - (#x8FC1E7 #x65C9) - (#x8FC1E8 #x65CE) - (#x8FC1E9 #x65D0) - (#x8FC1EA #x65D4) - (#x8FC1EB #x65D6) - (#x8FC1EC #x65D8) - (#x8FC1ED #x65DF) - (#x8FC1EE #x65F0) - (#x8FC1EF #x65F2) - (#x8FC1F0 #x65F4) - (#x8FC1F1 #x65F5) - (#x8FC1F2 #x65F9) - (#x8FC1F3 #x65FE) - (#x8FC1F4 #x65FF) - (#x8FC1F5 #x6600) - (#x8FC1F6 #x6604) - (#x8FC1F7 #x6608) - (#x8FC1F8 #x6609) - (#x8FC1F9 #x660D) - (#x8FC1FA #x6611) - (#x8FC1FB #x6612) - (#x8FC1FC #x6615) - (#x8FC1FD #x6616) - (#x8FC1FE #x661D) - (#x8FC2A1 #x661E) - (#x8FC2A2 #x6621) - (#x8FC2A3 #x6622) - (#x8FC2A4 #x6623) - (#x8FC2A5 #x6624) - (#x8FC2A6 #x6626) - (#x8FC2A7 #x6629) - (#x8FC2A8 #x662A) - (#x8FC2A9 #x662B) - (#x8FC2AA #x662C) - (#x8FC2AB #x662E) - (#x8FC2AC #x6630) - (#x8FC2AD #x6631) - (#x8FC2AE #x6633) - (#x8FC2AF #x6639) - (#x8FC2B0 #x6637) - (#x8FC2B1 #x6640) - (#x8FC2B2 #x6645) - (#x8FC2B3 #x6646) - (#x8FC2B4 #x664A) - (#x8FC2B5 #x664C) - (#x8FC2B6 #x6651) - (#x8FC2B7 #x664E) - (#x8FC2B8 #x6657) - (#x8FC2B9 #x6658) - (#x8FC2BA #x6659) - (#x8FC2BB #x665B) - (#x8FC2BC #x665C) - (#x8FC2BD #x6660) - (#x8FC2BE #x6661) - (#x8FC2BF #x66FB) - (#x8FC2C0 #x666A) - (#x8FC2C1 #x666B) - (#x8FC2C2 #x666C) - (#x8FC2C3 #x667E) - (#x8FC2C4 #x6673) - (#x8FC2C5 #x6675) - (#x8FC2C6 #x667F) - (#x8FC2C7 #x6677) - (#x8FC2C8 #x6678) - (#x8FC2C9 #x6679) - (#x8FC2CA #x667B) - (#x8FC2CB #x6680) - (#x8FC2CC #x667C) - (#x8FC2CD #x668B) - (#x8FC2CE #x668C) - (#x8FC2CF #x668D) - (#x8FC2D0 #x6690) - (#x8FC2D1 #x6692) - (#x8FC2D2 #x6699) - (#x8FC2D3 #x669A) - (#x8FC2D4 #x669B) - (#x8FC2D5 #x669C) - (#x8FC2D6 #x669F) - (#x8FC2D7 #x66A0) - (#x8FC2D8 #x66A4) - (#x8FC2D9 #x66AD) - (#x8FC2DA #x66B1) - (#x8FC2DB #x66B2) - (#x8FC2DC #x66B5) - (#x8FC2DD #x66BB) - (#x8FC2DE #x66BF) - (#x8FC2DF #x66C0) - (#x8FC2E0 #x66C2) - (#x8FC2E1 #x66C3) - (#x8FC2E2 #x66C8) - (#x8FC2E3 #x66CC) - (#x8FC2E4 #x66CE) - (#x8FC2E5 #x66CF) - (#x8FC2E6 #x66D4) - (#x8FC2E7 #x66DB) - (#x8FC2E8 #x66DF) - (#x8FC2E9 #x66E8) - (#x8FC2EA #x66EB) - (#x8FC2EB #x66EC) - (#x8FC2EC #x66EE) - (#x8FC2ED #x66FA) - (#x8FC2EE #x6705) - (#x8FC2EF #x6707) - (#x8FC2F0 #x670E) - (#x8FC2F1 #x6713) - (#x8FC2F2 #x6719) - (#x8FC2F3 #x671C) - (#x8FC2F4 #x6720) - (#x8FC2F5 #x6722) - (#x8FC2F6 #x6733) - (#x8FC2F7 #x673E) - (#x8FC2F8 #x6745) - (#x8FC2F9 #x6747) - (#x8FC2FA #x6748) - (#x8FC2FB #x674C) - (#x8FC2FC #x6754) - (#x8FC2FD #x6755) - (#x8FC2FE #x675D) - (#x8FC3A1 #x6766) - (#x8FC3A2 #x676C) - (#x8FC3A3 #x676E) - (#x8FC3A4 #x6774) - (#x8FC3A5 #x6776) - (#x8FC3A6 #x677B) - (#x8FC3A7 #x6781) - (#x8FC3A8 #x6784) - (#x8FC3A9 #x678E) - (#x8FC3AA #x678F) - (#x8FC3AB #x6791) - (#x8FC3AC #x6793) - (#x8FC3AD #x6796) - (#x8FC3AE #x6798) - (#x8FC3AF #x6799) - (#x8FC3B0 #x679B) - (#x8FC3B1 #x67B0) - (#x8FC3B2 #x67B1) - (#x8FC3B3 #x67B2) - (#x8FC3B4 #x67B5) - (#x8FC3B5 #x67BB) - (#x8FC3B6 #x67BC) - (#x8FC3B7 #x67BD) - (#x8FC3B8 #x67F9) - (#x8FC3B9 #x67C0) - (#x8FC3BA #x67C2) - (#x8FC3BB #x67C3) - (#x8FC3BC #x67C5) - (#x8FC3BD #x67C8) - (#x8FC3BE #x67C9) - (#x8FC3BF #x67D2) - (#x8FC3C0 #x67D7) - (#x8FC3C1 #x67D9) - (#x8FC3C2 #x67DC) - (#x8FC3C3 #x67E1) - (#x8FC3C4 #x67E6) - (#x8FC3C5 #x67F0) - (#x8FC3C6 #x67F2) - (#x8FC3C7 #x67F6) - (#x8FC3C8 #x67F7) - (#x8FC3C9 #x6852) - (#x8FC3CA #x6814) - (#x8FC3CB #x6819) - (#x8FC3CC #x681D) - (#x8FC3CD #x681F) - (#x8FC3CE #x6828) - (#x8FC3CF #x6827) - (#x8FC3D0 #x682C) - (#x8FC3D1 #x682D) - (#x8FC3D2 #x682F) - (#x8FC3D3 #x6830) - (#x8FC3D4 #x6831) - (#x8FC3D5 #x6833) - (#x8FC3D6 #x683B) - (#x8FC3D7 #x683F) - (#x8FC3D8 #x6844) - (#x8FC3D9 #x6845) - (#x8FC3DA #x684A) - (#x8FC3DB #x684C) - (#x8FC3DC #x6855) - (#x8FC3DD #x6857) - (#x8FC3DE #x6858) - (#x8FC3DF #x685B) - (#x8FC3E0 #x686B) - (#x8FC3E1 #x686E) - (#x8FC3E2 #x686F) - (#x8FC3E3 #x6870) - (#x8FC3E4 #x6871) - (#x8FC3E5 #x6872) - (#x8FC3E6 #x6875) - (#x8FC3E7 #x6879) - (#x8FC3E8 #x687A) - (#x8FC3E9 #x687B) - (#x8FC3EA #x687C) - (#x8FC3EB #x6882) - (#x8FC3EC #x6884) - (#x8FC3ED #x6886) - (#x8FC3EE #x6888) - (#x8FC3EF #x6896) - (#x8FC3F0 #x6898) - (#x8FC3F1 #x689A) - (#x8FC3F2 #x689C) - (#x8FC3F3 #x68A1) - (#x8FC3F4 #x68A3) - (#x8FC3F5 #x68A5) - (#x8FC3F6 #x68A9) - (#x8FC3F7 #x68AA) - (#x8FC3F8 #x68AE) - (#x8FC3F9 #x68B2) - (#x8FC3FA #x68BB) - (#x8FC3FB #x68C5) - (#x8FC3FC #x68C8) - (#x8FC3FD #x68CC) - (#x8FC3FE #x68CF) - (#x8FC4A1 #x68D0) - (#x8FC4A2 #x68D1) - (#x8FC4A3 #x68D3) - (#x8FC4A4 #x68D6) - (#x8FC4A5 #x68D9) - (#x8FC4A6 #x68DC) - (#x8FC4A7 #x68DD) - (#x8FC4A8 #x68E5) - (#x8FC4A9 #x68E8) - (#x8FC4AA #x68EA) - (#x8FC4AB #x68EB) - (#x8FC4AC #x68EC) - (#x8FC4AD #x68ED) - (#x8FC4AE #x68F0) - (#x8FC4AF #x68F1) - (#x8FC4B0 #x68F5) - (#x8FC4B1 #x68F6) - (#x8FC4B2 #x68FB) - (#x8FC4B3 #x68FC) - (#x8FC4B4 #x68FD) - (#x8FC4B5 #x6906) - (#x8FC4B6 #x6909) - (#x8FC4B7 #x690A) - (#x8FC4B8 #x6910) - (#x8FC4B9 #x6911) - (#x8FC4BA #x6913) - (#x8FC4BB #x6916) - (#x8FC4BC #x6917) - (#x8FC4BD #x6931) - (#x8FC4BE #x6933) - (#x8FC4BF #x6935) - (#x8FC4C0 #x6938) - (#x8FC4C1 #x693B) - (#x8FC4C2 #x6942) - (#x8FC4C3 #x6945) - (#x8FC4C4 #x6949) - (#x8FC4C5 #x694E) - (#x8FC4C6 #x6957) - (#x8FC4C7 #x695B) - (#x8FC4C8 #x6963) - (#x8FC4C9 #x6964) - (#x8FC4CA #x6965) - (#x8FC4CB #x6966) - (#x8FC4CC #x6968) - (#x8FC4CD #x6969) - (#x8FC4CE #x696C) - (#x8FC4CF #x6970) - (#x8FC4D0 #x6971) - (#x8FC4D1 #x6972) - (#x8FC4D2 #x697A) - (#x8FC4D3 #x697B) - (#x8FC4D4 #x697F) - (#x8FC4D5 #x6980) - (#x8FC4D6 #x698D) - (#x8FC4D7 #x6992) - (#x8FC4D8 #x6996) - (#x8FC4D9 #x6998) - (#x8FC4DA #x69A1) - (#x8FC4DB #x69A5) - (#x8FC4DC #x69A6) - (#x8FC4DD #x69A8) - (#x8FC4DE #x69AB) - (#x8FC4DF #x69AD) - (#x8FC4E0 #x69AF) - (#x8FC4E1 #x69B7) - (#x8FC4E2 #x69B8) - (#x8FC4E3 #x69BA) - (#x8FC4E4 #x69BC) - (#x8FC4E5 #x69C5) - (#x8FC4E6 #x69C8) - (#x8FC4E7 #x69D1) - (#x8FC4E8 #x69D6) - (#x8FC4E9 #x69D7) - (#x8FC4EA #x69E2) - (#x8FC4EB #x69E5) - (#x8FC4EC #x69EE) - (#x8FC4ED #x69EF) - (#x8FC4EE #x69F1) - (#x8FC4EF #x69F3) - (#x8FC4F0 #x69F5) - (#x8FC4F1 #x69FE) - (#x8FC4F2 #x6A00) - (#x8FC4F3 #x6A01) - (#x8FC4F4 #x6A03) - (#x8FC4F5 #x6A0F) - (#x8FC4F6 #x6A11) - (#x8FC4F7 #x6A15) - (#x8FC4F8 #x6A1A) - (#x8FC4F9 #x6A1D) - (#x8FC4FA #x6A20) - (#x8FC4FB #x6A24) - (#x8FC4FC #x6A28) - (#x8FC4FD #x6A30) - (#x8FC4FE #x6A32) - (#x8FC5A1 #x6A34) - (#x8FC5A2 #x6A37) - (#x8FC5A3 #x6A3B) - (#x8FC5A4 #x6A3E) - (#x8FC5A5 #x6A3F) - (#x8FC5A6 #x6A45) - (#x8FC5A7 #x6A46) - (#x8FC5A8 #x6A49) - (#x8FC5A9 #x6A4A) - (#x8FC5AA #x6A4E) - (#x8FC5AB #x6A50) - (#x8FC5AC #x6A51) - (#x8FC5AD #x6A52) - (#x8FC5AE #x6A55) - (#x8FC5AF #x6A56) - (#x8FC5B0 #x6A5B) - (#x8FC5B1 #x6A64) - (#x8FC5B2 #x6A67) - (#x8FC5B3 #x6A6A) - (#x8FC5B4 #x6A71) - (#x8FC5B5 #x6A73) - (#x8FC5B6 #x6A7E) - (#x8FC5B7 #x6A81) - (#x8FC5B8 #x6A83) - (#x8FC5B9 #x6A86) - (#x8FC5BA #x6A87) - (#x8FC5BB #x6A89) - (#x8FC5BC #x6A8B) - (#x8FC5BD #x6A91) - (#x8FC5BE #x6A9B) - (#x8FC5BF #x6A9D) - (#x8FC5C0 #x6A9E) - (#x8FC5C1 #x6A9F) - (#x8FC5C2 #x6AA5) - (#x8FC5C3 #x6AAB) - (#x8FC5C4 #x6AAF) - (#x8FC5C5 #x6AB0) - (#x8FC5C6 #x6AB1) - (#x8FC5C7 #x6AB4) - (#x8FC5C8 #x6ABD) - (#x8FC5C9 #x6ABE) - (#x8FC5CA #x6ABF) - (#x8FC5CB #x6AC6) - (#x8FC5CC #x6AC9) - (#x8FC5CD #x6AC8) - (#x8FC5CE #x6ACC) - (#x8FC5CF #x6AD0) - (#x8FC5D0 #x6AD4) - (#x8FC5D1 #x6AD5) - (#x8FC5D2 #x6AD6) - (#x8FC5D3 #x6ADC) - (#x8FC5D4 #x6ADD) - (#x8FC5D5 #x6AE4) - (#x8FC5D6 #x6AE7) - (#x8FC5D7 #x6AEC) - (#x8FC5D8 #x6AF0) - (#x8FC5D9 #x6AF1) - (#x8FC5DA #x6AF2) - (#x8FC5DB #x6AFC) - (#x8FC5DC #x6AFD) - (#x8FC5DD #x6B02) - (#x8FC5DE #x6B03) - (#x8FC5DF #x6B06) - (#x8FC5E0 #x6B07) - (#x8FC5E1 #x6B09) - (#x8FC5E2 #x6B0F) - (#x8FC5E3 #x6B10) - (#x8FC5E4 #x6B11) - (#x8FC5E5 #x6B17) - (#x8FC5E6 #x6B1B) - (#x8FC5E7 #x6B1E) - (#x8FC5E8 #x6B24) - (#x8FC5E9 #x6B28) - (#x8FC5EA #x6B2B) - (#x8FC5EB #x6B2C) - (#x8FC5EC #x6B2F) - (#x8FC5ED #x6B35) - (#x8FC5EE #x6B36) - (#x8FC5EF #x6B3B) - (#x8FC5F0 #x6B3F) - (#x8FC5F1 #x6B46) - (#x8FC5F2 #x6B4A) - (#x8FC5F3 #x6B4D) - (#x8FC5F4 #x6B52) - (#x8FC5F5 #x6B56) - (#x8FC5F6 #x6B58) - (#x8FC5F7 #x6B5D) - (#x8FC5F8 #x6B60) - (#x8FC5F9 #x6B67) - (#x8FC5FA #x6B6B) - (#x8FC5FB #x6B6E) - (#x8FC5FC #x6B70) - (#x8FC5FD #x6B75) - (#x8FC5FE #x6B7D) - (#x8FC6A1 #x6B7E) - (#x8FC6A2 #x6B82) - (#x8FC6A3 #x6B85) - (#x8FC6A4 #x6B97) - (#x8FC6A5 #x6B9B) - (#x8FC6A6 #x6B9F) - (#x8FC6A7 #x6BA0) - (#x8FC6A8 #x6BA2) - (#x8FC6A9 #x6BA3) - (#x8FC6AA #x6BA8) - (#x8FC6AB #x6BA9) - (#x8FC6AC #x6BAC) - (#x8FC6AD #x6BAD) - (#x8FC6AE #x6BAE) - (#x8FC6AF #x6BB0) - (#x8FC6B0 #x6BB8) - (#x8FC6B1 #x6BB9) - (#x8FC6B2 #x6BBD) - (#x8FC6B3 #x6BBE) - (#x8FC6B4 #x6BC3) - (#x8FC6B5 #x6BC4) - (#x8FC6B6 #x6BC9) - (#x8FC6B7 #x6BCC) - (#x8FC6B8 #x6BD6) - (#x8FC6B9 #x6BDA) - (#x8FC6BA #x6BE1) - (#x8FC6BB #x6BE3) - (#x8FC6BC #x6BE6) - (#x8FC6BD #x6BE7) - (#x8FC6BE #x6BEE) - (#x8FC6BF #x6BF1) - (#x8FC6C0 #x6BF7) - (#x8FC6C1 #x6BF9) - (#x8FC6C2 #x6BFF) - (#x8FC6C3 #x6C02) - (#x8FC6C4 #x6C04) - (#x8FC6C5 #x6C05) - (#x8FC6C6 #x6C09) - (#x8FC6C7 #x6C0D) - (#x8FC6C8 #x6C0E) - (#x8FC6C9 #x6C10) - (#x8FC6CA #x6C12) - (#x8FC6CB #x6C19) - (#x8FC6CC #x6C1F) - (#x8FC6CD #x6C26) - (#x8FC6CE #x6C27) - (#x8FC6CF #x6C28) - (#x8FC6D0 #x6C2C) - (#x8FC6D1 #x6C2E) - (#x8FC6D2 #x6C33) - (#x8FC6D3 #x6C35) - (#x8FC6D4 #x6C36) - (#x8FC6D5 #x6C3A) - (#x8FC6D6 #x6C3B) - (#x8FC6D7 #x6C3F) - (#x8FC6D8 #x6C4A) - (#x8FC6D9 #x6C4B) - (#x8FC6DA #x6C4D) - (#x8FC6DB #x6C4F) - (#x8FC6DC #x6C52) - (#x8FC6DD #x6C54) - (#x8FC6DE #x6C59) - (#x8FC6DF #x6C5B) - (#x8FC6E0 #x6C5C) - (#x8FC6E1 #x6C6B) - (#x8FC6E2 #x6C6D) - (#x8FC6E3 #x6C6F) - (#x8FC6E4 #x6C74) - (#x8FC6E5 #x6C76) - (#x8FC6E6 #x6C78) - (#x8FC6E7 #x6C79) - (#x8FC6E8 #x6C7B) - (#x8FC6E9 #x6C85) - (#x8FC6EA #x6C86) - (#x8FC6EB #x6C87) - (#x8FC6EC #x6C89) - (#x8FC6ED #x6C94) - (#x8FC6EE #x6C95) - (#x8FC6EF #x6C97) - (#x8FC6F0 #x6C98) - (#x8FC6F1 #x6C9C) - (#x8FC6F2 #x6C9F) - (#x8FC6F3 #x6CB0) - (#x8FC6F4 #x6CB2) - (#x8FC6F5 #x6CB4) - (#x8FC6F6 #x6CC2) - (#x8FC6F7 #x6CC6) - (#x8FC6F8 #x6CCD) - (#x8FC6F9 #x6CCF) - (#x8FC6FA #x6CD0) - (#x8FC6FB #x6CD1) - (#x8FC6FC #x6CD2) - (#x8FC6FD #x6CD4) - (#x8FC6FE #x6CD6) - (#x8FC7A1 #x6CDA) - (#x8FC7A2 #x6CDC) - (#x8FC7A3 #x6CE0) - (#x8FC7A4 #x6CE7) - (#x8FC7A5 #x6CE9) - (#x8FC7A6 #x6CEB) - (#x8FC7A7 #x6CEC) - (#x8FC7A8 #x6CEE) - (#x8FC7A9 #x6CF2) - (#x8FC7AA #x6CF4) - (#x8FC7AB #x6D04) - (#x8FC7AC #x6D07) - (#x8FC7AD #x6D0A) - (#x8FC7AE #x6D0E) - (#x8FC7AF #x6D0F) - (#x8FC7B0 #x6D11) - (#x8FC7B1 #x6D13) - (#x8FC7B2 #x6D1A) - (#x8FC7B3 #x6D26) - (#x8FC7B4 #x6D27) - (#x8FC7B5 #x6D28) - (#x8FC7B6 #x6C67) - (#x8FC7B7 #x6D2E) - (#x8FC7B8 #x6D2F) - (#x8FC7B9 #x6D31) - (#x8FC7BA #x6D39) - (#x8FC7BB #x6D3C) - (#x8FC7BC #x6D3F) - (#x8FC7BD #x6D57) - (#x8FC7BE #x6D5E) - (#x8FC7BF #x6D5F) - (#x8FC7C0 #x6D61) - (#x8FC7C1 #x6D65) - (#x8FC7C2 #x6D67) - (#x8FC7C3 #x6D6F) - (#x8FC7C4 #x6D70) - (#x8FC7C5 #x6D7C) - (#x8FC7C6 #x6D82) - (#x8FC7C7 #x6D87) - (#x8FC7C8 #x6D91) - (#x8FC7C9 #x6D92) - (#x8FC7CA #x6D94) - (#x8FC7CB #x6D96) - (#x8FC7CC #x6D97) - (#x8FC7CD #x6D98) - (#x8FC7CE #x6DAA) - (#x8FC7CF #x6DAC) - (#x8FC7D0 #x6DB4) - (#x8FC7D1 #x6DB7) - (#x8FC7D2 #x6DB9) - (#x8FC7D3 #x6DBD) - (#x8FC7D4 #x6DBF) - (#x8FC7D5 #x6DC4) - (#x8FC7D6 #x6DC8) - (#x8FC7D7 #x6DCA) - (#x8FC7D8 #x6DCE) - (#x8FC7D9 #x6DCF) - (#x8FC7DA #x6DD6) - (#x8FC7DB #x6DDB) - (#x8FC7DC #x6DDD) - (#x8FC7DD #x6DDF) - (#x8FC7DE #x6DE0) - (#x8FC7DF #x6DE2) - (#x8FC7E0 #x6DE5) - (#x8FC7E1 #x6DE9) - (#x8FC7E2 #x6DEF) - (#x8FC7E3 #x6DF0) - (#x8FC7E4 #x6DF4) - (#x8FC7E5 #x6DF6) - (#x8FC7E6 #x6DFC) - (#x8FC7E7 #x6E00) - (#x8FC7E8 #x6E04) - (#x8FC7E9 #x6E1E) - (#x8FC7EA #x6E22) - (#x8FC7EB #x6E27) - (#x8FC7EC #x6E32) - (#x8FC7ED #x6E36) - (#x8FC7EE #x6E39) - (#x8FC7EF #x6E3B) - (#x8FC7F0 #x6E3C) - (#x8FC7F1 #x6E44) - (#x8FC7F2 #x6E45) - (#x8FC7F3 #x6E48) - (#x8FC7F4 #x6E49) - (#x8FC7F5 #x6E4B) - (#x8FC7F6 #x6E4F) - (#x8FC7F7 #x6E51) - (#x8FC7F8 #x6E52) - (#x8FC7F9 #x6E53) - (#x8FC7FA #x6E54) - (#x8FC7FB #x6E57) - (#x8FC7FC #x6E5C) - (#x8FC7FD #x6E5D) - (#x8FC7FE #x6E5E) - (#x8FC8A1 #x6E62) - (#x8FC8A2 #x6E63) - (#x8FC8A3 #x6E68) - (#x8FC8A4 #x6E73) - (#x8FC8A5 #x6E7B) - (#x8FC8A6 #x6E7D) - (#x8FC8A7 #x6E8D) - (#x8FC8A8 #x6E93) - (#x8FC8A9 #x6E99) - (#x8FC8AA #x6EA0) - (#x8FC8AB #x6EA7) - (#x8FC8AC #x6EAD) - (#x8FC8AD #x6EAE) - (#x8FC8AE #x6EB1) - (#x8FC8AF #x6EB3) - (#x8FC8B0 #x6EBB) - (#x8FC8B1 #x6EBF) - (#x8FC8B2 #x6EC0) - (#x8FC8B3 #x6EC1) - (#x8FC8B4 #x6EC3) - (#x8FC8B5 #x6EC7) - (#x8FC8B6 #x6EC8) - (#x8FC8B7 #x6ECA) - (#x8FC8B8 #x6ECD) - (#x8FC8B9 #x6ECE) - (#x8FC8BA #x6ECF) - (#x8FC8BB #x6EEB) - (#x8FC8BC #x6EED) - (#x8FC8BD #x6EEE) - (#x8FC8BE #x6EF9) - (#x8FC8BF #x6EFB) - (#x8FC8C0 #x6EFD) - (#x8FC8C1 #x6F04) - (#x8FC8C2 #x6F08) - (#x8FC8C3 #x6F0A) - (#x8FC8C4 #x6F0C) - (#x8FC8C5 #x6F0D) - (#x8FC8C6 #x6F16) - (#x8FC8C7 #x6F18) - (#x8FC8C8 #x6F1A) - (#x8FC8C9 #x6F1B) - (#x8FC8CA #x6F26) - (#x8FC8CB #x6F29) - (#x8FC8CC #x6F2A) - (#x8FC8CD #x6F2F) - (#x8FC8CE #x6F30) - (#x8FC8CF #x6F33) - (#x8FC8D0 #x6F36) - (#x8FC8D1 #x6F3B) - (#x8FC8D2 #x6F3C) - (#x8FC8D3 #x6F2D) - (#x8FC8D4 #x6F4F) - (#x8FC8D5 #x6F51) - (#x8FC8D6 #x6F52) - (#x8FC8D7 #x6F53) - (#x8FC8D8 #x6F57) - (#x8FC8D9 #x6F59) - (#x8FC8DA #x6F5A) - (#x8FC8DB #x6F5D) - (#x8FC8DC #x6F5E) - (#x8FC8DD #x6F61) - (#x8FC8DE #x6F62) - (#x8FC8DF #x6F68) - (#x8FC8E0 #x6F6C) - (#x8FC8E1 #x6F7D) - (#x8FC8E2 #x6F7E) - (#x8FC8E3 #x6F83) - (#x8FC8E4 #x6F87) - (#x8FC8E5 #x6F88) - (#x8FC8E6 #x6F8B) - (#x8FC8E7 #x6F8C) - (#x8FC8E8 #x6F8D) - (#x8FC8E9 #x6F90) - (#x8FC8EA #x6F92) - (#x8FC8EB #x6F93) - (#x8FC8EC #x6F94) - (#x8FC8ED #x6F96) - (#x8FC8EE #x6F9A) - (#x8FC8EF #x6F9F) - (#x8FC8F0 #x6FA0) - (#x8FC8F1 #x6FA5) - (#x8FC8F2 #x6FA6) - (#x8FC8F3 #x6FA7) - (#x8FC8F4 #x6FA8) - (#x8FC8F5 #x6FAE) - (#x8FC8F6 #x6FAF) - (#x8FC8F7 #x6FB0) - (#x8FC8F8 #x6FB5) - (#x8FC8F9 #x6FB6) - (#x8FC8FA #x6FBC) - (#x8FC8FB #x6FC5) - (#x8FC8FC #x6FC7) - (#x8FC8FD #x6FC8) - (#x8FC8FE #x6FCA) - (#x8FC9A1 #x6FDA) - (#x8FC9A2 #x6FDE) - (#x8FC9A3 #x6FE8) - (#x8FC9A4 #x6FE9) - (#x8FC9A5 #x6FF0) - (#x8FC9A6 #x6FF5) - (#x8FC9A7 #x6FF9) - (#x8FC9A8 #x6FFC) - (#x8FC9A9 #x6FFD) - (#x8FC9AA #x7000) - (#x8FC9AB #x7005) - (#x8FC9AC #x7006) - (#x8FC9AD #x7007) - (#x8FC9AE #x700D) - (#x8FC9AF #x7017) - (#x8FC9B0 #x7020) - (#x8FC9B1 #x7023) - (#x8FC9B2 #x702F) - (#x8FC9B3 #x7034) - (#x8FC9B4 #x7037) - (#x8FC9B5 #x7039) - (#x8FC9B6 #x703C) - (#x8FC9B7 #x7043) - (#x8FC9B8 #x7044) - (#x8FC9B9 #x7048) - (#x8FC9BA #x7049) - (#x8FC9BB #x704A) - (#x8FC9BC #x704B) - (#x8FC9BD #x7054) - (#x8FC9BE #x7055) - (#x8FC9BF #x705D) - (#x8FC9C0 #x705E) - (#x8FC9C1 #x704E) - (#x8FC9C2 #x7064) - (#x8FC9C3 #x7065) - (#x8FC9C4 #x706C) - (#x8FC9C5 #x706E) - (#x8FC9C6 #x7075) - (#x8FC9C7 #x7076) - (#x8FC9C8 #x707E) - (#x8FC9C9 #x7081) - (#x8FC9CA #x7085) - (#x8FC9CB #x7086) - (#x8FC9CC #x7094) - (#x8FC9CD #x7095) - (#x8FC9CE #x7096) - (#x8FC9CF #x7097) - (#x8FC9D0 #x7098) - (#x8FC9D1 #x709B) - (#x8FC9D2 #x70A4) - (#x8FC9D3 #x70AB) - (#x8FC9D4 #x70B0) - (#x8FC9D5 #x70B1) - (#x8FC9D6 #x70B4) - (#x8FC9D7 #x70B7) - (#x8FC9D8 #x70CA) - (#x8FC9D9 #x70D1) - (#x8FC9DA #x70D3) - (#x8FC9DB #x70D4) - (#x8FC9DC #x70D5) - (#x8FC9DD #x70D6) - (#x8FC9DE #x70D8) - (#x8FC9DF #x70DC) - (#x8FC9E0 #x70E4) - (#x8FC9E1 #x70FA) - (#x8FC9E2 #x7103) - (#x8FC9E3 #x7104) - (#x8FC9E4 #x7105) - (#x8FC9E5 #x7106) - (#x8FC9E6 #x7107) - (#x8FC9E7 #x710B) - (#x8FC9E8 #x710C) - (#x8FC9E9 #x710F) - (#x8FC9EA #x711E) - (#x8FC9EB #x7120) - (#x8FC9EC #x712B) - (#x8FC9ED #x712D) - (#x8FC9EE #x712F) - (#x8FC9EF #x7130) - (#x8FC9F0 #x7131) - (#x8FC9F1 #x7138) - (#x8FC9F2 #x7141) - (#x8FC9F3 #x7145) - (#x8FC9F4 #x7146) - (#x8FC9F5 #x7147) - (#x8FC9F6 #x714A) - (#x8FC9F7 #x714B) - (#x8FC9F8 #x7150) - (#x8FC9F9 #x7152) - (#x8FC9FA #x7157) - (#x8FC9FB #x715A) - (#x8FC9FC #x715C) - (#x8FC9FD #x715E) - (#x8FC9FE #x7160) - (#x8FCAA1 #x7168) - (#x8FCAA2 #x7179) - (#x8FCAA3 #x7180) - (#x8FCAA4 #x7185) - (#x8FCAA5 #x7187) - (#x8FCAA6 #x718C) - (#x8FCAA7 #x7192) - (#x8FCAA8 #x719A) - (#x8FCAA9 #x719B) - (#x8FCAAA #x71A0) - (#x8FCAAB #x71A2) - (#x8FCAAC #x71AF) - (#x8FCAAD #x71B0) - (#x8FCAAE #x71B2) - (#x8FCAAF #x71B3) - (#x8FCAB0 #x71BA) - (#x8FCAB1 #x71BF) - (#x8FCAB2 #x71C0) - (#x8FCAB3 #x71C1) - (#x8FCAB4 #x71C4) - (#x8FCAB5 #x71CB) - (#x8FCAB6 #x71CC) - (#x8FCAB7 #x71D3) - (#x8FCAB8 #x71D6) - (#x8FCAB9 #x71D9) - (#x8FCABA #x71DA) - (#x8FCABB #x71DC) - (#x8FCABC #x71F8) - (#x8FCABD #x71FE) - (#x8FCABE #x7200) - (#x8FCABF #x7207) - (#x8FCAC0 #x7208) - (#x8FCAC1 #x7209) - (#x8FCAC2 #x7213) - (#x8FCAC3 #x7217) - (#x8FCAC4 #x721A) - (#x8FCAC5 #x721D) - (#x8FCAC6 #x721F) - (#x8FCAC7 #x7224) - (#x8FCAC8 #x722B) - (#x8FCAC9 #x722F) - (#x8FCACA #x7234) - (#x8FCACB #x7238) - (#x8FCACC #x7239) - (#x8FCACD #x7241) - (#x8FCACE #x7242) - (#x8FCACF #x7243) - (#x8FCAD0 #x7245) - (#x8FCAD1 #x724E) - (#x8FCAD2 #x724F) - (#x8FCAD3 #x7250) - (#x8FCAD4 #x7253) - (#x8FCAD5 #x7255) - (#x8FCAD6 #x7256) - (#x8FCAD7 #x725A) - (#x8FCAD8 #x725C) - (#x8FCAD9 #x725E) - (#x8FCADA #x7260) - (#x8FCADB #x7263) - (#x8FCADC #x7268) - (#x8FCADD #x726B) - (#x8FCADE #x726E) - (#x8FCADF #x726F) - (#x8FCAE0 #x7271) - (#x8FCAE1 #x7277) - (#x8FCAE2 #x7278) - (#x8FCAE3 #x727B) - (#x8FCAE4 #x727C) - (#x8FCAE5 #x727F) - (#x8FCAE6 #x7284) - (#x8FCAE7 #x7289) - (#x8FCAE8 #x728D) - (#x8FCAE9 #x728E) - (#x8FCAEA #x7293) - (#x8FCAEB #x729B) - (#x8FCAEC #x72A8) - (#x8FCAED #x72AD) - (#x8FCAEE #x72AE) - (#x8FCAEF #x72B1) - (#x8FCAF0 #x72B4) - (#x8FCAF1 #x72BE) - (#x8FCAF2 #x72C1) - (#x8FCAF3 #x72C7) - (#x8FCAF4 #x72C9) - (#x8FCAF5 #x72CC) - (#x8FCAF6 #x72D5) - (#x8FCAF7 #x72D6) - (#x8FCAF8 #x72D8) - (#x8FCAF9 #x72DF) - (#x8FCAFA #x72E5) - (#x8FCAFB #x72F3) - (#x8FCAFC #x72F4) - (#x8FCAFD #x72FA) - (#x8FCAFE #x72FB) - (#x8FCBA1 #x72FE) - (#x8FCBA2 #x7302) - (#x8FCBA3 #x7304) - (#x8FCBA4 #x7305) - (#x8FCBA5 #x7307) - (#x8FCBA6 #x730B) - (#x8FCBA7 #x730D) - (#x8FCBA8 #x7312) - (#x8FCBA9 #x7313) - (#x8FCBAA #x7318) - (#x8FCBAB #x7319) - (#x8FCBAC #x731E) - (#x8FCBAD #x7322) - (#x8FCBAE #x7324) - (#x8FCBAF #x7327) - (#x8FCBB0 #x7328) - (#x8FCBB1 #x732C) - (#x8FCBB2 #x7331) - (#x8FCBB3 #x7332) - (#x8FCBB4 #x7335) - (#x8FCBB5 #x733A) - (#x8FCBB6 #x733B) - (#x8FCBB7 #x733D) - (#x8FCBB8 #x7343) - (#x8FCBB9 #x734D) - (#x8FCBBA #x7350) - (#x8FCBBB #x7352) - (#x8FCBBC #x7356) - (#x8FCBBD #x7358) - (#x8FCBBE #x735D) - (#x8FCBBF #x735E) - (#x8FCBC0 #x735F) - (#x8FCBC1 #x7360) - (#x8FCBC2 #x7366) - (#x8FCBC3 #x7367) - (#x8FCBC4 #x7369) - (#x8FCBC5 #x736B) - (#x8FCBC6 #x736C) - (#x8FCBC7 #x736E) - (#x8FCBC8 #x736F) - (#x8FCBC9 #x7371) - (#x8FCBCA #x7377) - (#x8FCBCB #x7379) - (#x8FCBCC #x737C) - (#x8FCBCD #x7380) - (#x8FCBCE #x7381) - (#x8FCBCF #x7383) - (#x8FCBD0 #x7385) - (#x8FCBD1 #x7386) - (#x8FCBD2 #x738E) - (#x8FCBD3 #x7390) - (#x8FCBD4 #x7393) - (#x8FCBD5 #x7395) - (#x8FCBD6 #x7397) - (#x8FCBD7 #x7398) - (#x8FCBD8 #x739C) - (#x8FCBD9 #x739E) - (#x8FCBDA #x739F) - (#x8FCBDB #x73A0) - (#x8FCBDC #x73A2) - (#x8FCBDD #x73A5) - (#x8FCBDE #x73A6) - (#x8FCBDF #x73AA) - (#x8FCBE0 #x73AB) - (#x8FCBE1 #x73AD) - (#x8FCBE2 #x73B5) - (#x8FCBE3 #x73B7) - (#x8FCBE4 #x73B9) - (#x8FCBE5 #x73BC) - (#x8FCBE6 #x73BD) - (#x8FCBE7 #x73BF) - (#x8FCBE8 #x73C5) - (#x8FCBE9 #x73C6) - (#x8FCBEA #x73C9) - (#x8FCBEB #x73CB) - (#x8FCBEC #x73CC) - (#x8FCBED #x73CF) - (#x8FCBEE #x73D2) - (#x8FCBEF #x73D3) - (#x8FCBF0 #x73D6) - (#x8FCBF1 #x73D9) - (#x8FCBF2 #x73DD) - (#x8FCBF3 #x73E1) - (#x8FCBF4 #x73E3) - (#x8FCBF5 #x73E6) - (#x8FCBF6 #x73E7) - (#x8FCBF7 #x73E9) - (#x8FCBF8 #x73F4) - (#x8FCBF9 #x73F5) - (#x8FCBFA #x73F7) - (#x8FCBFB #x73F9) - (#x8FCBFC #x73FA) - (#x8FCBFD #x73FB) - (#x8FCBFE #x73FD) - (#x8FCCA1 #x73FF) - (#x8FCCA2 #x7400) - (#x8FCCA3 #x7401) - (#x8FCCA4 #x7404) - (#x8FCCA5 #x7407) - (#x8FCCA6 #x740A) - (#x8FCCA7 #x7411) - (#x8FCCA8 #x741A) - (#x8FCCA9 #x741B) - (#x8FCCAA #x7424) - (#x8FCCAB #x7426) - (#x8FCCAC #x7428) - (#x8FCCAD #x7429) - (#x8FCCAE #x742A) - (#x8FCCAF #x742B) - (#x8FCCB0 #x742C) - (#x8FCCB1 #x742D) - (#x8FCCB2 #x742E) - (#x8FCCB3 #x742F) - (#x8FCCB4 #x7430) - (#x8FCCB5 #x7431) - (#x8FCCB6 #x7439) - (#x8FCCB7 #x7440) - (#x8FCCB8 #x7443) - (#x8FCCB9 #x7444) - (#x8FCCBA #x7446) - (#x8FCCBB #x7447) - (#x8FCCBC #x744B) - (#x8FCCBD #x744D) - (#x8FCCBE #x7451) - (#x8FCCBF #x7452) - (#x8FCCC0 #x7457) - (#x8FCCC1 #x745D) - (#x8FCCC2 #x7462) - (#x8FCCC3 #x7466) - (#x8FCCC4 #x7467) - (#x8FCCC5 #x7468) - (#x8FCCC6 #x746B) - (#x8FCCC7 #x746D) - (#x8FCCC8 #x746E) - (#x8FCCC9 #x7471) - (#x8FCCCA #x7472) - (#x8FCCCB #x7480) - (#x8FCCCC #x7481) - (#x8FCCCD #x7485) - (#x8FCCCE #x7486) - (#x8FCCCF #x7487) - (#x8FCCD0 #x7489) - (#x8FCCD1 #x748F) - (#x8FCCD2 #x7490) - (#x8FCCD3 #x7491) - (#x8FCCD4 #x7492) - (#x8FCCD5 #x7498) - (#x8FCCD6 #x7499) - (#x8FCCD7 #x749A) - (#x8FCCD8 #x749C) - (#x8FCCD9 #x749F) - (#x8FCCDA #x74A0) - (#x8FCCDB #x74A1) - (#x8FCCDC #x74A3) - (#x8FCCDD #x74A6) - (#x8FCCDE #x74A8) - (#x8FCCDF #x74A9) - (#x8FCCE0 #x74AA) - (#x8FCCE1 #x74AB) - (#x8FCCE2 #x74AE) - (#x8FCCE3 #x74AF) - (#x8FCCE4 #x74B1) - (#x8FCCE5 #x74B2) - (#x8FCCE6 #x74B5) - (#x8FCCE7 #x74B9) - (#x8FCCE8 #x74BB) - (#x8FCCE9 #x74BF) - (#x8FCCEA #x74C8) - (#x8FCCEB #x74C9) - (#x8FCCEC #x74CC) - (#x8FCCED #x74D0) - (#x8FCCEE #x74D3) - (#x8FCCEF #x74D8) - (#x8FCCF0 #x74DA) - (#x8FCCF1 #x74DB) - (#x8FCCF2 #x74DE) - (#x8FCCF3 #x74DF) - (#x8FCCF4 #x74E4) - (#x8FCCF5 #x74E8) - (#x8FCCF6 #x74EA) - (#x8FCCF7 #x74EB) - (#x8FCCF8 #x74EF) - (#x8FCCF9 #x74F4) - (#x8FCCFA #x74FA) - (#x8FCCFB #x74FB) - (#x8FCCFC #x74FC) - (#x8FCCFD #x74FF) - (#x8FCCFE #x7506) - (#x8FCDA1 #x7512) - (#x8FCDA2 #x7516) - (#x8FCDA3 #x7517) - (#x8FCDA4 #x7520) - (#x8FCDA5 #x7521) - (#x8FCDA6 #x7524) - (#x8FCDA7 #x7527) - (#x8FCDA8 #x7529) - (#x8FCDA9 #x752A) - (#x8FCDAA #x752F) - (#x8FCDAB #x7536) - (#x8FCDAC #x7539) - (#x8FCDAD #x753D) - (#x8FCDAE #x753E) - (#x8FCDAF #x753F) - (#x8FCDB0 #x7540) - (#x8FCDB1 #x7543) - (#x8FCDB2 #x7547) - (#x8FCDB3 #x7548) - (#x8FCDB4 #x754E) - (#x8FCDB5 #x7550) - (#x8FCDB6 #x7552) - (#x8FCDB7 #x7557) - (#x8FCDB8 #x755E) - (#x8FCDB9 #x755F) - (#x8FCDBA #x7561) - (#x8FCDBB #x756F) - (#x8FCDBC #x7571) - (#x8FCDBD #x7579) - (#x8FCDBE #x757A) - (#x8FCDBF #x757B) - (#x8FCDC0 #x757C) - (#x8FCDC1 #x757D) - (#x8FCDC2 #x757E) - (#x8FCDC3 #x7581) - (#x8FCDC4 #x7585) - (#x8FCDC5 #x7590) - (#x8FCDC6 #x7592) - (#x8FCDC7 #x7593) - (#x8FCDC8 #x7595) - (#x8FCDC9 #x7599) - (#x8FCDCA #x759C) - (#x8FCDCB #x75A2) - (#x8FCDCC #x75A4) - (#x8FCDCD #x75B4) - (#x8FCDCE #x75BA) - (#x8FCDCF #x75BF) - (#x8FCDD0 #x75C0) - (#x8FCDD1 #x75C1) - (#x8FCDD2 #x75C4) - (#x8FCDD3 #x75C6) - (#x8FCDD4 #x75CC) - (#x8FCDD5 #x75CE) - (#x8FCDD6 #x75CF) - (#x8FCDD7 #x75D7) - (#x8FCDD8 #x75DC) - (#x8FCDD9 #x75DF) - (#x8FCDDA #x75E0) - (#x8FCDDB #x75E1) - (#x8FCDDC #x75E4) - (#x8FCDDD #x75E7) - (#x8FCDDE #x75EC) - (#x8FCDDF #x75EE) - (#x8FCDE0 #x75EF) - (#x8FCDE1 #x75F1) - (#x8FCDE2 #x75F9) - (#x8FCDE3 #x7600) - (#x8FCDE4 #x7602) - (#x8FCDE5 #x7603) - (#x8FCDE6 #x7604) - (#x8FCDE7 #x7607) - (#x8FCDE8 #x7608) - (#x8FCDE9 #x760A) - (#x8FCDEA #x760C) - (#x8FCDEB #x760F) - (#x8FCDEC #x7612) - (#x8FCDED #x7613) - (#x8FCDEE #x7615) - (#x8FCDEF #x7616) - (#x8FCDF0 #x7619) - (#x8FCDF1 #x761B) - (#x8FCDF2 #x761C) - (#x8FCDF3 #x761D) - (#x8FCDF4 #x761E) - (#x8FCDF5 #x7623) - (#x8FCDF6 #x7625) - (#x8FCDF7 #x7626) - (#x8FCDF8 #x7629) - (#x8FCDF9 #x762D) - (#x8FCDFA #x7632) - (#x8FCDFB #x7633) - (#x8FCDFC #x7635) - (#x8FCDFD #x7638) - (#x8FCDFE #x7639) - (#x8FCEA1 #x763A) - (#x8FCEA2 #x763C) - (#x8FCEA3 #x764A) - (#x8FCEA4 #x7640) - (#x8FCEA5 #x7641) - (#x8FCEA6 #x7643) - (#x8FCEA7 #x7644) - (#x8FCEA8 #x7645) - (#x8FCEA9 #x7649) - (#x8FCEAA #x764B) - (#x8FCEAB #x7655) - (#x8FCEAC #x7659) - (#x8FCEAD #x765F) - (#x8FCEAE #x7664) - (#x8FCEAF #x7665) - (#x8FCEB0 #x766D) - (#x8FCEB1 #x766E) - (#x8FCEB2 #x766F) - (#x8FCEB3 #x7671) - (#x8FCEB4 #x7674) - (#x8FCEB5 #x7681) - (#x8FCEB6 #x7685) - (#x8FCEB7 #x768C) - (#x8FCEB8 #x768D) - (#x8FCEB9 #x7695) - (#x8FCEBA #x769B) - (#x8FCEBB #x769C) - (#x8FCEBC #x769D) - (#x8FCEBD #x769F) - (#x8FCEBE #x76A0) - (#x8FCEBF #x76A2) - (#x8FCEC0 #x76A3) - (#x8FCEC1 #x76A4) - (#x8FCEC2 #x76A5) - (#x8FCEC3 #x76A6) - (#x8FCEC4 #x76A7) - (#x8FCEC5 #x76A8) - (#x8FCEC6 #x76AA) - (#x8FCEC7 #x76AD) - (#x8FCEC8 #x76BD) - (#x8FCEC9 #x76C1) - (#x8FCECA #x76C5) - (#x8FCECB #x76C9) - (#x8FCECC #x76CB) - (#x8FCECD #x76CC) - (#x8FCECE #x76CE) - (#x8FCECF #x76D4) - (#x8FCED0 #x76D9) - (#x8FCED1 #x76E0) - (#x8FCED2 #x76E6) - (#x8FCED3 #x76E8) - (#x8FCED4 #x76EC) - (#x8FCED5 #x76F0) - (#x8FCED6 #x76F1) - (#x8FCED7 #x76F6) - (#x8FCED8 #x76F9) - (#x8FCED9 #x76FC) - (#x8FCEDA #x7700) - (#x8FCEDB #x7706) - (#x8FCEDC #x770A) - (#x8FCEDD #x770E) - (#x8FCEDE #x7712) - (#x8FCEDF #x7714) - (#x8FCEE0 #x7715) - (#x8FCEE1 #x7717) - (#x8FCEE2 #x7719) - (#x8FCEE3 #x771A) - (#x8FCEE4 #x771C) - (#x8FCEE5 #x7722) - (#x8FCEE6 #x7728) - (#x8FCEE7 #x772D) - (#x8FCEE8 #x772E) - (#x8FCEE9 #x772F) - (#x8FCEEA #x7734) - (#x8FCEEB #x7735) - (#x8FCEEC #x7736) - (#x8FCEED #x7739) - (#x8FCEEE #x773D) - (#x8FCEEF #x773E) - (#x8FCEF0 #x7742) - (#x8FCEF1 #x7745) - (#x8FCEF2 #x7746) - (#x8FCEF3 #x774A) - (#x8FCEF4 #x774D) - (#x8FCEF5 #x774E) - (#x8FCEF6 #x774F) - (#x8FCEF7 #x7752) - (#x8FCEF8 #x7756) - (#x8FCEF9 #x7757) - (#x8FCEFA #x775C) - (#x8FCEFB #x775E) - (#x8FCEFC #x775F) - (#x8FCEFD #x7760) - (#x8FCEFE #x7762) - (#x8FCFA1 #x7764) - (#x8FCFA2 #x7767) - (#x8FCFA3 #x776A) - (#x8FCFA4 #x776C) - (#x8FCFA5 #x7770) - (#x8FCFA6 #x7772) - (#x8FCFA7 #x7773) - (#x8FCFA8 #x7774) - (#x8FCFA9 #x777A) - (#x8FCFAA #x777D) - (#x8FCFAB #x7780) - (#x8FCFAC #x7784) - (#x8FCFAD #x778C) - (#x8FCFAE #x778D) - (#x8FCFAF #x7794) - (#x8FCFB0 #x7795) - (#x8FCFB1 #x7796) - (#x8FCFB2 #x779A) - (#x8FCFB3 #x779F) - (#x8FCFB4 #x77A2) - (#x8FCFB5 #x77A7) - (#x8FCFB6 #x77AA) - (#x8FCFB7 #x77AE) - (#x8FCFB8 #x77AF) - (#x8FCFB9 #x77B1) - (#x8FCFBA #x77B5) - (#x8FCFBB #x77BE) - (#x8FCFBC #x77C3) - (#x8FCFBD #x77C9) - (#x8FCFBE #x77D1) - (#x8FCFBF #x77D2) - (#x8FCFC0 #x77D5) - (#x8FCFC1 #x77D9) - (#x8FCFC2 #x77DE) - (#x8FCFC3 #x77DF) - (#x8FCFC4 #x77E0) - (#x8FCFC5 #x77E4) - (#x8FCFC6 #x77E6) - (#x8FCFC7 #x77EA) - (#x8FCFC8 #x77EC) - (#x8FCFC9 #x77F0) - (#x8FCFCA #x77F1) - (#x8FCFCB #x77F4) - (#x8FCFCC #x77F8) - (#x8FCFCD #x77FB) - (#x8FCFCE #x7805) - (#x8FCFCF #x7806) - (#x8FCFD0 #x7809) - (#x8FCFD1 #x780D) - (#x8FCFD2 #x780E) - (#x8FCFD3 #x7811) - (#x8FCFD4 #x781D) - (#x8FCFD5 #x7821) - (#x8FCFD6 #x7822) - (#x8FCFD7 #x7823) - (#x8FCFD8 #x782D) - (#x8FCFD9 #x782E) - (#x8FCFDA #x7830) - (#x8FCFDB #x7835) - (#x8FCFDC #x7837) - (#x8FCFDD #x7843) - (#x8FCFDE #x7844) - (#x8FCFDF #x7847) - (#x8FCFE0 #x7848) - (#x8FCFE1 #x784C) - (#x8FCFE2 #x784E) - (#x8FCFE3 #x7852) - (#x8FCFE4 #x785C) - (#x8FCFE5 #x785E) - (#x8FCFE6 #x7860) - (#x8FCFE7 #x7861) - (#x8FCFE8 #x7863) - (#x8FCFE9 #x7864) - (#x8FCFEA #x7868) - (#x8FCFEB #x786A) - (#x8FCFEC #x786E) - (#x8FCFED #x787A) - (#x8FCFEE #x787E) - (#x8FCFEF #x788A) - (#x8FCFF0 #x788F) - (#x8FCFF1 #x7894) - (#x8FCFF2 #x7898) - (#x8FCFF3 #x78A1) - (#x8FCFF4 #x789D) - (#x8FCFF5 #x789E) - (#x8FCFF6 #x789F) - (#x8FCFF7 #x78A4) - (#x8FCFF8 #x78A8) - (#x8FCFF9 #x78AC) - (#x8FCFFA #x78AD) - (#x8FCFFB #x78B0) - (#x8FCFFC #x78B1) - (#x8FCFFD #x78B2) - (#x8FCFFE #x78B3) - (#x8FD0A1 #x78BB) - (#x8FD0A2 #x78BD) - (#x8FD0A3 #x78BF) - (#x8FD0A4 #x78C7) - (#x8FD0A5 #x78C8) - (#x8FD0A6 #x78C9) - (#x8FD0A7 #x78CC) - (#x8FD0A8 #x78CE) - (#x8FD0A9 #x78D2) - (#x8FD0AA #x78D3) - (#x8FD0AB #x78D5) - (#x8FD0AC #x78D6) - (#x8FD0AD #x78E4) - (#x8FD0AE #x78DB) - (#x8FD0AF #x78DF) - (#x8FD0B0 #x78E0) - (#x8FD0B1 #x78E1) - (#x8FD0B2 #x78E6) - (#x8FD0B3 #x78EA) - (#x8FD0B4 #x78F2) - (#x8FD0B5 #x78F3) - (#x8FD0B6 #x7900) - (#x8FD0B7 #x78F6) - (#x8FD0B8 #x78F7) - (#x8FD0B9 #x78FA) - (#x8FD0BA #x78FB) - (#x8FD0BB #x78FF) - (#x8FD0BC #x7906) - (#x8FD0BD #x790C) - (#x8FD0BE #x7910) - (#x8FD0BF #x791A) - (#x8FD0C0 #x791C) - (#x8FD0C1 #x791E) - (#x8FD0C2 #x791F) - (#x8FD0C3 #x7920) - (#x8FD0C4 #x7925) - (#x8FD0C5 #x7927) - (#x8FD0C6 #x7929) - (#x8FD0C7 #x792D) - (#x8FD0C8 #x7931) - (#x8FD0C9 #x7934) - (#x8FD0CA #x7935) - (#x8FD0CB #x793B) - (#x8FD0CC #x793D) - (#x8FD0CD #x793F) - (#x8FD0CE #x7944) - (#x8FD0CF #x7945) - (#x8FD0D0 #x7946) - (#x8FD0D1 #x794A) - (#x8FD0D2 #x794B) - (#x8FD0D3 #x794F) - (#x8FD0D4 #x7951) - (#x8FD0D5 #x7954) - (#x8FD0D6 #x7958) - (#x8FD0D7 #x795B) - (#x8FD0D8 #x795C) - (#x8FD0D9 #x7967) - (#x8FD0DA #x7969) - (#x8FD0DB #x796B) - (#x8FD0DC #x7972) - (#x8FD0DD #x7979) - (#x8FD0DE #x797B) - (#x8FD0DF #x797C) - (#x8FD0E0 #x797E) - (#x8FD0E1 #x798B) - (#x8FD0E2 #x798C) - (#x8FD0E3 #x7991) - (#x8FD0E4 #x7993) - (#x8FD0E5 #x7994) - (#x8FD0E6 #x7995) - (#x8FD0E7 #x7996) - (#x8FD0E8 #x7998) - (#x8FD0E9 #x799B) - (#x8FD0EA #x799C) - (#x8FD0EB #x79A1) - (#x8FD0EC #x79A8) - (#x8FD0ED #x79A9) - (#x8FD0EE #x79AB) - (#x8FD0EF #x79AF) - (#x8FD0F0 #x79B1) - (#x8FD0F1 #x79B4) - (#x8FD0F2 #x79B8) - (#x8FD0F3 #x79BB) - (#x8FD0F4 #x79C2) - (#x8FD0F5 #x79C4) - (#x8FD0F6 #x79C7) - (#x8FD0F7 #x79C8) - (#x8FD0F8 #x79CA) - (#x8FD0F9 #x79CF) - (#x8FD0FA #x79D4) - (#x8FD0FB #x79D6) - (#x8FD0FC #x79DA) - (#x8FD0FD #x79DD) - (#x8FD0FE #x79DE) - (#x8FD1A1 #x79E0) - (#x8FD1A2 #x79E2) - (#x8FD1A3 #x79E5) - (#x8FD1A4 #x79EA) - (#x8FD1A5 #x79EB) - (#x8FD1A6 #x79ED) - (#x8FD1A7 #x79F1) - (#x8FD1A8 #x79F8) - (#x8FD1A9 #x79FC) - (#x8FD1AA #x7A02) - (#x8FD1AB #x7A03) - (#x8FD1AC #x7A07) - (#x8FD1AD #x7A09) - (#x8FD1AE #x7A0A) - (#x8FD1AF #x7A0C) - (#x8FD1B0 #x7A11) - (#x8FD1B1 #x7A15) - (#x8FD1B2 #x7A1B) - (#x8FD1B3 #x7A1E) - (#x8FD1B4 #x7A21) - (#x8FD1B5 #x7A27) - (#x8FD1B6 #x7A2B) - (#x8FD1B7 #x7A2D) - (#x8FD1B8 #x7A2F) - (#x8FD1B9 #x7A30) - (#x8FD1BA #x7A34) - (#x8FD1BB #x7A35) - (#x8FD1BC #x7A38) - (#x8FD1BD #x7A39) - (#x8FD1BE #x7A3A) - (#x8FD1BF #x7A44) - (#x8FD1C0 #x7A45) - (#x8FD1C1 #x7A47) - (#x8FD1C2 #x7A48) - (#x8FD1C3 #x7A4C) - (#x8FD1C4 #x7A55) - (#x8FD1C5 #x7A56) - (#x8FD1C6 #x7A59) - (#x8FD1C7 #x7A5C) - (#x8FD1C8 #x7A5D) - (#x8FD1C9 #x7A5F) - (#x8FD1CA #x7A60) - (#x8FD1CB #x7A65) - (#x8FD1CC #x7A67) - (#x8FD1CD #x7A6A) - (#x8FD1CE #x7A6D) - (#x8FD1CF #x7A75) - (#x8FD1D0 #x7A78) - (#x8FD1D1 #x7A7E) - (#x8FD1D2 #x7A80) - (#x8FD1D3 #x7A82) - (#x8FD1D4 #x7A85) - (#x8FD1D5 #x7A86) - (#x8FD1D6 #x7A8A) - (#x8FD1D7 #x7A8B) - (#x8FD1D8 #x7A90) - (#x8FD1D9 #x7A91) - (#x8FD1DA #x7A94) - (#x8FD1DB #x7A9E) - (#x8FD1DC #x7AA0) - (#x8FD1DD #x7AA3) - (#x8FD1DE #x7AAC) - (#x8FD1DF #x7AB3) - (#x8FD1E0 #x7AB5) - (#x8FD1E1 #x7AB9) - (#x8FD1E2 #x7ABB) - (#x8FD1E3 #x7ABC) - (#x8FD1E4 #x7AC6) - (#x8FD1E5 #x7AC9) - (#x8FD1E6 #x7ACC) - (#x8FD1E7 #x7ACE) - (#x8FD1E8 #x7AD1) - (#x8FD1E9 #x7ADB) - (#x8FD1EA #x7AE8) - (#x8FD1EB #x7AE9) - (#x8FD1EC #x7AEB) - (#x8FD1ED #x7AEC) - (#x8FD1EE #x7AF1) - (#x8FD1EF #x7AF4) - (#x8FD1F0 #x7AFB) - (#x8FD1F1 #x7AFD) - (#x8FD1F2 #x7AFE) - (#x8FD1F3 #x7B07) - (#x8FD1F4 #x7B14) - (#x8FD1F5 #x7B1F) - (#x8FD1F6 #x7B23) - (#x8FD1F7 #x7B27) - (#x8FD1F8 #x7B29) - (#x8FD1F9 #x7B2A) - (#x8FD1FA #x7B2B) - (#x8FD1FB #x7B2D) - (#x8FD1FC #x7B2E) - (#x8FD1FD #x7B2F) - (#x8FD1FE #x7B30) - (#x8FD2A1 #x7B31) - (#x8FD2A2 #x7B34) - (#x8FD2A3 #x7B3D) - (#x8FD2A4 #x7B3F) - (#x8FD2A5 #x7B40) - (#x8FD2A6 #x7B41) - (#x8FD2A7 #x7B47) - (#x8FD2A8 #x7B4E) - (#x8FD2A9 #x7B55) - (#x8FD2AA #x7B60) - (#x8FD2AB #x7B64) - (#x8FD2AC #x7B66) - (#x8FD2AD #x7B69) - (#x8FD2AE #x7B6A) - (#x8FD2AF #x7B6D) - (#x8FD2B0 #x7B6F) - (#x8FD2B1 #x7B72) - (#x8FD2B2 #x7B73) - (#x8FD2B3 #x7B77) - (#x8FD2B4 #x7B84) - (#x8FD2B5 #x7B89) - (#x8FD2B6 #x7B8E) - (#x8FD2B7 #x7B90) - (#x8FD2B8 #x7B91) - (#x8FD2B9 #x7B96) - (#x8FD2BA #x7B9B) - (#x8FD2BB #x7B9E) - (#x8FD2BC #x7BA0) - (#x8FD2BD #x7BA5) - (#x8FD2BE #x7BAC) - (#x8FD2BF #x7BAF) - (#x8FD2C0 #x7BB0) - (#x8FD2C1 #x7BB2) - (#x8FD2C2 #x7BB5) - (#x8FD2C3 #x7BB6) - (#x8FD2C4 #x7BBA) - (#x8FD2C5 #x7BBB) - (#x8FD2C6 #x7BBC) - (#x8FD2C7 #x7BBD) - (#x8FD2C8 #x7BC2) - (#x8FD2C9 #x7BC5) - (#x8FD2CA #x7BC8) - (#x8FD2CB #x7BCA) - (#x8FD2CC #x7BD4) - (#x8FD2CD #x7BD6) - (#x8FD2CE #x7BD7) - (#x8FD2CF #x7BD9) - (#x8FD2D0 #x7BDA) - (#x8FD2D1 #x7BDB) - (#x8FD2D2 #x7BE8) - (#x8FD2D3 #x7BEA) - (#x8FD2D4 #x7BF2) - (#x8FD2D5 #x7BF4) - (#x8FD2D6 #x7BF5) - (#x8FD2D7 #x7BF8) - (#x8FD2D8 #x7BF9) - (#x8FD2D9 #x7BFA) - (#x8FD2DA #x7BFC) - (#x8FD2DB #x7BFE) - (#x8FD2DC #x7C01) - (#x8FD2DD #x7C02) - (#x8FD2DE #x7C03) - (#x8FD2DF #x7C04) - (#x8FD2E0 #x7C06) - (#x8FD2E1 #x7C09) - (#x8FD2E2 #x7C0B) - (#x8FD2E3 #x7C0C) - (#x8FD2E4 #x7C0E) - (#x8FD2E5 #x7C0F) - (#x8FD2E6 #x7C19) - (#x8FD2E7 #x7C1B) - (#x8FD2E8 #x7C20) - (#x8FD2E9 #x7C25) - (#x8FD2EA #x7C26) - (#x8FD2EB #x7C28) - (#x8FD2EC #x7C2C) - (#x8FD2ED #x7C31) - (#x8FD2EE #x7C33) - (#x8FD2EF #x7C34) - (#x8FD2F0 #x7C36) - (#x8FD2F1 #x7C39) - (#x8FD2F2 #x7C3A) - (#x8FD2F3 #x7C46) - (#x8FD2F4 #x7C4A) - (#x8FD2F5 #x7C55) - (#x8FD2F6 #x7C51) - (#x8FD2F7 #x7C52) - (#x8FD2F8 #x7C53) - (#x8FD2F9 #x7C59) - (#x8FD2FA #x7C5A) - (#x8FD2FB #x7C5B) - (#x8FD2FC #x7C5C) - (#x8FD2FD #x7C5D) - (#x8FD2FE #x7C5E) - (#x8FD3A1 #x7C61) - (#x8FD3A2 #x7C63) - (#x8FD3A3 #x7C67) - (#x8FD3A4 #x7C69) - (#x8FD3A5 #x7C6D) - (#x8FD3A6 #x7C6E) - (#x8FD3A7 #x7C70) - (#x8FD3A8 #x7C72) - (#x8FD3A9 #x7C79) - (#x8FD3AA #x7C7C) - (#x8FD3AB #x7C7D) - (#x8FD3AC #x7C86) - (#x8FD3AD #x7C87) - (#x8FD3AE #x7C8F) - (#x8FD3AF #x7C94) - (#x8FD3B0 #x7C9E) - (#x8FD3B1 #x7CA0) - (#x8FD3B2 #x7CA6) - (#x8FD3B3 #x7CB0) - (#x8FD3B4 #x7CB6) - (#x8FD3B5 #x7CB7) - (#x8FD3B6 #x7CBA) - (#x8FD3B7 #x7CBB) - (#x8FD3B8 #x7CBC) - (#x8FD3B9 #x7CBF) - (#x8FD3BA #x7CC4) - (#x8FD3BB #x7CC7) - (#x8FD3BC #x7CC8) - (#x8FD3BD #x7CC9) - (#x8FD3BE #x7CCD) - (#x8FD3BF #x7CCF) - (#x8FD3C0 #x7CD3) - (#x8FD3C1 #x7CD4) - (#x8FD3C2 #x7CD5) - (#x8FD3C3 #x7CD7) - (#x8FD3C4 #x7CD9) - (#x8FD3C5 #x7CDA) - (#x8FD3C6 #x7CDD) - (#x8FD3C7 #x7CE6) - (#x8FD3C8 #x7CE9) - (#x8FD3C9 #x7CEB) - (#x8FD3CA #x7CF5) - (#x8FD3CB #x7D03) - (#x8FD3CC #x7D07) - (#x8FD3CD #x7D08) - (#x8FD3CE #x7D09) - (#x8FD3CF #x7D0F) - (#x8FD3D0 #x7D11) - (#x8FD3D1 #x7D12) - (#x8FD3D2 #x7D13) - (#x8FD3D3 #x7D16) - (#x8FD3D4 #x7D1D) - (#x8FD3D5 #x7D1E) - (#x8FD3D6 #x7D23) - (#x8FD3D7 #x7D26) - (#x8FD3D8 #x7D2A) - (#x8FD3D9 #x7D2D) - (#x8FD3DA #x7D31) - (#x8FD3DB #x7D3C) - (#x8FD3DC #x7D3D) - (#x8FD3DD #x7D3E) - (#x8FD3DE #x7D40) - (#x8FD3DF #x7D41) - (#x8FD3E0 #x7D47) - (#x8FD3E1 #x7D48) - (#x8FD3E2 #x7D4D) - (#x8FD3E3 #x7D51) - (#x8FD3E4 #x7D53) - (#x8FD3E5 #x7D57) - (#x8FD3E6 #x7D59) - (#x8FD3E7 #x7D5A) - (#x8FD3E8 #x7D5C) - (#x8FD3E9 #x7D5D) - (#x8FD3EA #x7D65) - (#x8FD3EB #x7D67) - (#x8FD3EC #x7D6A) - (#x8FD3ED #x7D70) - (#x8FD3EE #x7D78) - (#x8FD3EF #x7D7A) - (#x8FD3F0 #x7D7B) - (#x8FD3F1 #x7D7F) - (#x8FD3F2 #x7D81) - (#x8FD3F3 #x7D82) - (#x8FD3F4 #x7D83) - (#x8FD3F5 #x7D85) - (#x8FD3F6 #x7D86) - (#x8FD3F7 #x7D88) - (#x8FD3F8 #x7D8B) - (#x8FD3F9 #x7D8C) - (#x8FD3FA #x7D8D) - (#x8FD3FB #x7D91) - (#x8FD3FC #x7D96) - (#x8FD3FD #x7D97) - (#x8FD3FE #x7D9D) - (#x8FD4A1 #x7D9E) - (#x8FD4A2 #x7DA6) - (#x8FD4A3 #x7DA7) - (#x8FD4A4 #x7DAA) - (#x8FD4A5 #x7DB3) - (#x8FD4A6 #x7DB6) - (#x8FD4A7 #x7DB7) - (#x8FD4A8 #x7DB9) - (#x8FD4A9 #x7DC2) - (#x8FD4AA #x7DC3) - (#x8FD4AB #x7DC4) - (#x8FD4AC #x7DC5) - (#x8FD4AD #x7DC6) - (#x8FD4AE #x7DCC) - (#x8FD4AF #x7DCD) - (#x8FD4B0 #x7DCE) - (#x8FD4B1 #x7DD7) - (#x8FD4B2 #x7DD9) - (#x8FD4B3 #x7E00) - (#x8FD4B4 #x7DE2) - (#x8FD4B5 #x7DE5) - (#x8FD4B6 #x7DE6) - (#x8FD4B7 #x7DEA) - (#x8FD4B8 #x7DEB) - (#x8FD4B9 #x7DED) - (#x8FD4BA #x7DF1) - (#x8FD4BB #x7DF5) - (#x8FD4BC #x7DF6) - (#x8FD4BD #x7DF9) - (#x8FD4BE #x7DFA) - (#x8FD4BF #x7E08) - (#x8FD4C0 #x7E10) - (#x8FD4C1 #x7E11) - (#x8FD4C2 #x7E15) - (#x8FD4C3 #x7E17) - (#x8FD4C4 #x7E1C) - (#x8FD4C5 #x7E1D) - (#x8FD4C6 #x7E20) - (#x8FD4C7 #x7E27) - (#x8FD4C8 #x7E28) - (#x8FD4C9 #x7E2C) - (#x8FD4CA #x7E2D) - (#x8FD4CB #x7E2F) - (#x8FD4CC #x7E33) - (#x8FD4CD #x7E36) - (#x8FD4CE #x7E3F) - (#x8FD4CF #x7E44) - (#x8FD4D0 #x7E45) - (#x8FD4D1 #x7E47) - (#x8FD4D2 #x7E4E) - (#x8FD4D3 #x7E50) - (#x8FD4D4 #x7E52) - (#x8FD4D5 #x7E58) - (#x8FD4D6 #x7E5F) - (#x8FD4D7 #x7E61) - (#x8FD4D8 #x7E62) - (#x8FD4D9 #x7E65) - (#x8FD4DA #x7E6B) - (#x8FD4DB #x7E6E) - (#x8FD4DC #x7E6F) - (#x8FD4DD #x7E73) - (#x8FD4DE #x7E78) - (#x8FD4DF #x7E7E) - (#x8FD4E0 #x7E81) - (#x8FD4E1 #x7E86) - (#x8FD4E2 #x7E87) - (#x8FD4E3 #x7E8A) - (#x8FD4E4 #x7E8D) - (#x8FD4E5 #x7E91) - (#x8FD4E6 #x7E95) - (#x8FD4E7 #x7E98) - (#x8FD4E8 #x7E9A) - (#x8FD4E9 #x7E9D) - (#x8FD4EA #x7E9E) - (#x8FD4EB #x7F3C) - (#x8FD4EC #x7F3B) - (#x8FD4ED #x7F3D) - (#x8FD4EE #x7F3E) - (#x8FD4EF #x7F3F) - (#x8FD4F0 #x7F43) - (#x8FD4F1 #x7F44) - (#x8FD4F2 #x7F47) - (#x8FD4F3 #x7F4F) - (#x8FD4F4 #x7F52) - (#x8FD4F5 #x7F53) - (#x8FD4F6 #x7F5B) - (#x8FD4F7 #x7F5C) - (#x8FD4F8 #x7F5D) - (#x8FD4F9 #x7F61) - (#x8FD4FA #x7F63) - (#x8FD4FB #x7F64) - (#x8FD4FC #x7F65) - (#x8FD4FD #x7F66) - (#x8FD4FE #x7F6D) - (#x8FD5A1 #x7F71) - (#x8FD5A2 #x7F7D) - (#x8FD5A3 #x7F7E) - (#x8FD5A4 #x7F7F) - (#x8FD5A5 #x7F80) - (#x8FD5A6 #x7F8B) - (#x8FD5A7 #x7F8D) - (#x8FD5A8 #x7F8F) - (#x8FD5A9 #x7F90) - (#x8FD5AA #x7F91) - (#x8FD5AB #x7F96) - (#x8FD5AC #x7F97) - (#x8FD5AD #x7F9C) - (#x8FD5AE #x7FA1) - (#x8FD5AF #x7FA2) - (#x8FD5B0 #x7FA6) - (#x8FD5B1 #x7FAA) - (#x8FD5B2 #x7FAD) - (#x8FD5B3 #x7FB4) - (#x8FD5B4 #x7FBC) - (#x8FD5B5 #x7FBF) - (#x8FD5B6 #x7FC0) - (#x8FD5B7 #x7FC3) - (#x8FD5B8 #x7FC8) - (#x8FD5B9 #x7FCE) - (#x8FD5BA #x7FCF) - (#x8FD5BB #x7FDB) - (#x8FD5BC #x7FDF) - (#x8FD5BD #x7FE3) - (#x8FD5BE #x7FE5) - (#x8FD5BF #x7FE8) - (#x8FD5C0 #x7FEC) - (#x8FD5C1 #x7FEE) - (#x8FD5C2 #x7FEF) - (#x8FD5C3 #x7FF2) - (#x8FD5C4 #x7FFA) - (#x8FD5C5 #x7FFD) - (#x8FD5C6 #x7FFE) - (#x8FD5C7 #x7FFF) - (#x8FD5C8 #x8007) - (#x8FD5C9 #x8008) - (#x8FD5CA #x800A) - (#x8FD5CB #x800D) - (#x8FD5CC #x800E) - (#x8FD5CD #x800F) - (#x8FD5CE #x8011) - (#x8FD5CF #x8013) - (#x8FD5D0 #x8014) - (#x8FD5D1 #x8016) - (#x8FD5D2 #x801D) - (#x8FD5D3 #x801E) - (#x8FD5D4 #x801F) - (#x8FD5D5 #x8020) - (#x8FD5D6 #x8024) - (#x8FD5D7 #x8026) - (#x8FD5D8 #x802C) - (#x8FD5D9 #x802E) - (#x8FD5DA #x8030) - (#x8FD5DB #x8034) - (#x8FD5DC #x8035) - (#x8FD5DD #x8037) - (#x8FD5DE #x8039) - (#x8FD5DF #x803A) - (#x8FD5E0 #x803C) - (#x8FD5E1 #x803E) - (#x8FD5E2 #x8040) - (#x8FD5E3 #x8044) - (#x8FD5E4 #x8060) - (#x8FD5E5 #x8064) - (#x8FD5E6 #x8066) - (#x8FD5E7 #x806D) - (#x8FD5E8 #x8071) - (#x8FD5E9 #x8075) - (#x8FD5EA #x8081) - (#x8FD5EB #x8088) - (#x8FD5EC #x808E) - (#x8FD5ED #x809C) - (#x8FD5EE #x809E) - (#x8FD5EF #x80A6) - (#x8FD5F0 #x80A7) - (#x8FD5F1 #x80AB) - (#x8FD5F2 #x80B8) - (#x8FD5F3 #x80B9) - (#x8FD5F4 #x80C8) - (#x8FD5F5 #x80CD) - (#x8FD5F6 #x80CF) - (#x8FD5F7 #x80D2) - (#x8FD5F8 #x80D4) - (#x8FD5F9 #x80D5) - (#x8FD5FA #x80D7) - (#x8FD5FB #x80D8) - (#x8FD5FC #x80E0) - (#x8FD5FD #x80ED) - (#x8FD5FE #x80EE) - (#x8FD6A1 #x80F0) - (#x8FD6A2 #x80F2) - (#x8FD6A3 #x80F3) - (#x8FD6A4 #x80F6) - (#x8FD6A5 #x80F9) - (#x8FD6A6 #x80FA) - (#x8FD6A7 #x80FE) - (#x8FD6A8 #x8103) - (#x8FD6A9 #x810B) - (#x8FD6AA #x8116) - (#x8FD6AB #x8117) - (#x8FD6AC #x8118) - (#x8FD6AD #x811C) - (#x8FD6AE #x811E) - (#x8FD6AF #x8120) - (#x8FD6B0 #x8124) - (#x8FD6B1 #x8127) - (#x8FD6B2 #x812C) - (#x8FD6B3 #x8130) - (#x8FD6B4 #x8135) - (#x8FD6B5 #x813A) - (#x8FD6B6 #x813C) - (#x8FD6B7 #x8145) - (#x8FD6B8 #x8147) - (#x8FD6B9 #x814A) - (#x8FD6BA #x814C) - (#x8FD6BB #x8152) - (#x8FD6BC #x8157) - (#x8FD6BD #x8160) - (#x8FD6BE #x8161) - (#x8FD6BF #x8167) - (#x8FD6C0 #x8168) - (#x8FD6C1 #x8169) - (#x8FD6C2 #x816D) - (#x8FD6C3 #x816F) - (#x8FD6C4 #x8177) - (#x8FD6C5 #x8181) - (#x8FD6C6 #x8190) - (#x8FD6C7 #x8184) - (#x8FD6C8 #x8185) - (#x8FD6C9 #x8186) - (#x8FD6CA #x818B) - (#x8FD6CB #x818E) - (#x8FD6CC #x8196) - (#x8FD6CD #x8198) - (#x8FD6CE #x819B) - (#x8FD6CF #x819E) - (#x8FD6D0 #x81A2) - (#x8FD6D1 #x81AE) - (#x8FD6D2 #x81B2) - (#x8FD6D3 #x81B4) - (#x8FD6D4 #x81BB) - (#x8FD6D5 #x81CB) - (#x8FD6D6 #x81C3) - (#x8FD6D7 #x81C5) - (#x8FD6D8 #x81CA) - (#x8FD6D9 #x81CE) - (#x8FD6DA #x81CF) - (#x8FD6DB #x81D5) - (#x8FD6DC #x81D7) - (#x8FD6DD #x81DB) - (#x8FD6DE #x81DD) - (#x8FD6DF #x81DE) - (#x8FD6E0 #x81E1) - (#x8FD6E1 #x81E4) - (#x8FD6E2 #x81EB) - (#x8FD6E3 #x81EC) - (#x8FD6E4 #x81F0) - (#x8FD6E5 #x81F1) - (#x8FD6E6 #x81F2) - (#x8FD6E7 #x81F5) - (#x8FD6E8 #x81F6) - (#x8FD6E9 #x81F8) - (#x8FD6EA #x81F9) - (#x8FD6EB #x81FD) - (#x8FD6EC #x81FF) - (#x8FD6ED #x8200) - (#x8FD6EE #x8203) - (#x8FD6EF #x820F) - (#x8FD6F0 #x8213) - (#x8FD6F1 #x8214) - (#x8FD6F2 #x8219) - (#x8FD6F3 #x821A) - (#x8FD6F4 #x821D) - (#x8FD6F5 #x8221) - (#x8FD6F6 #x8222) - (#x8FD6F7 #x8228) - (#x8FD6F8 #x8232) - (#x8FD6F9 #x8234) - (#x8FD6FA #x823A) - (#x8FD6FB #x8243) - (#x8FD6FC #x8244) - (#x8FD6FD #x8245) - (#x8FD6FE #x8246) - (#x8FD7A1 #x824B) - (#x8FD7A2 #x824E) - (#x8FD7A3 #x824F) - (#x8FD7A4 #x8251) - (#x8FD7A5 #x8256) - (#x8FD7A6 #x825C) - (#x8FD7A7 #x8260) - (#x8FD7A8 #x8263) - (#x8FD7A9 #x8267) - (#x8FD7AA #x826D) - (#x8FD7AB #x8274) - (#x8FD7AC #x827B) - (#x8FD7AD #x827D) - (#x8FD7AE #x827F) - (#x8FD7AF #x8280) - (#x8FD7B0 #x8281) - (#x8FD7B1 #x8283) - (#x8FD7B2 #x8284) - (#x8FD7B3 #x8287) - (#x8FD7B4 #x8289) - (#x8FD7B5 #x828A) - (#x8FD7B6 #x828E) - (#x8FD7B7 #x8291) - (#x8FD7B8 #x8294) - (#x8FD7B9 #x8296) - (#x8FD7BA #x8298) - (#x8FD7BB #x829A) - (#x8FD7BC #x829B) - (#x8FD7BD #x82A0) - (#x8FD7BE #x82A1) - (#x8FD7BF #x82A3) - (#x8FD7C0 #x82A4) - (#x8FD7C1 #x82A7) - (#x8FD7C2 #x82A8) - (#x8FD7C3 #x82A9) - (#x8FD7C4 #x82AA) - (#x8FD7C5 #x82AE) - (#x8FD7C6 #x82B0) - (#x8FD7C7 #x82B2) - (#x8FD7C8 #x82B4) - (#x8FD7C9 #x82B7) - (#x8FD7CA #x82BA) - (#x8FD7CB #x82BC) - (#x8FD7CC #x82BE) - (#x8FD7CD #x82BF) - (#x8FD7CE #x82C6) - (#x8FD7CF #x82D0) - (#x8FD7D0 #x82D5) - (#x8FD7D1 #x82DA) - (#x8FD7D2 #x82E0) - (#x8FD7D3 #x82E2) - (#x8FD7D4 #x82E4) - (#x8FD7D5 #x82E8) - (#x8FD7D6 #x82EA) - (#x8FD7D7 #x82ED) - (#x8FD7D8 #x82EF) - (#x8FD7D9 #x82F6) - (#x8FD7DA #x82F7) - (#x8FD7DB #x82FD) - (#x8FD7DC #x82FE) - (#x8FD7DD #x8300) - (#x8FD7DE #x8301) - (#x8FD7DF #x8307) - (#x8FD7E0 #x8308) - (#x8FD7E1 #x830A) - (#x8FD7E2 #x830B) - (#x8FD7E3 #x8354) - (#x8FD7E4 #x831B) - (#x8FD7E5 #x831D) - (#x8FD7E6 #x831E) - (#x8FD7E7 #x831F) - (#x8FD7E8 #x8321) - (#x8FD7E9 #x8322) - (#x8FD7EA #x832C) - (#x8FD7EB #x832D) - (#x8FD7EC #x832E) - (#x8FD7ED #x8330) - (#x8FD7EE #x8333) - (#x8FD7EF #x8337) - (#x8FD7F0 #x833A) - (#x8FD7F1 #x833C) - (#x8FD7F2 #x833D) - (#x8FD7F3 #x8342) - (#x8FD7F4 #x8343) - (#x8FD7F5 #x8344) - (#x8FD7F6 #x8347) - (#x8FD7F7 #x834D) - (#x8FD7F8 #x834E) - (#x8FD7F9 #x8351) - (#x8FD7FA #x8355) - (#x8FD7FB #x8356) - (#x8FD7FC #x8357) - (#x8FD7FD #x8370) - (#x8FD7FE #x8378) - (#x8FD8A1 #x837D) - (#x8FD8A2 #x837F) - (#x8FD8A3 #x8380) - (#x8FD8A4 #x8382) - (#x8FD8A5 #x8384) - (#x8FD8A6 #x8386) - (#x8FD8A7 #x838D) - (#x8FD8A8 #x8392) - (#x8FD8A9 #x8394) - (#x8FD8AA #x8395) - (#x8FD8AB #x8398) - (#x8FD8AC #x8399) - (#x8FD8AD #x839B) - (#x8FD8AE #x839C) - (#x8FD8AF #x839D) - (#x8FD8B0 #x83A6) - (#x8FD8B1 #x83A7) - (#x8FD8B2 #x83A9) - (#x8FD8B3 #x83AC) - (#x8FD8B4 #x83BE) - (#x8FD8B5 #x83BF) - (#x8FD8B6 #x83C0) - (#x8FD8B7 #x83C7) - (#x8FD8B8 #x83C9) - (#x8FD8B9 #x83CF) - (#x8FD8BA #x83D0) - (#x8FD8BB #x83D1) - (#x8FD8BC #x83D4) - (#x8FD8BD #x83DD) - (#x8FD8BE #x8353) - (#x8FD8BF #x83E8) - (#x8FD8C0 #x83EA) - (#x8FD8C1 #x83F6) - (#x8FD8C2 #x83F8) - (#x8FD8C3 #x83F9) - (#x8FD8C4 #x83FC) - (#x8FD8C5 #x8401) - (#x8FD8C6 #x8406) - (#x8FD8C7 #x840A) - (#x8FD8C8 #x840F) - (#x8FD8C9 #x8411) - (#x8FD8CA #x8415) - (#x8FD8CB #x8419) - (#x8FD8CC #x83AD) - (#x8FD8CD #x842F) - (#x8FD8CE #x8439) - (#x8FD8CF #x8445) - (#x8FD8D0 #x8447) - (#x8FD8D1 #x8448) - (#x8FD8D2 #x844A) - (#x8FD8D3 #x844D) - (#x8FD8D4 #x844F) - (#x8FD8D5 #x8451) - (#x8FD8D6 #x8452) - (#x8FD8D7 #x8456) - (#x8FD8D8 #x8458) - (#x8FD8D9 #x8459) - (#x8FD8DA #x845A) - (#x8FD8DB #x845C) - (#x8FD8DC #x8460) - (#x8FD8DD #x8464) - (#x8FD8DE #x8465) - (#x8FD8DF #x8467) - (#x8FD8E0 #x846A) - (#x8FD8E1 #x8470) - (#x8FD8E2 #x8473) - (#x8FD8E3 #x8474) - (#x8FD8E4 #x8476) - (#x8FD8E5 #x8478) - (#x8FD8E6 #x847C) - (#x8FD8E7 #x847D) - (#x8FD8E8 #x8481) - (#x8FD8E9 #x8485) - (#x8FD8EA #x8492) - (#x8FD8EB #x8493) - (#x8FD8EC #x8495) - (#x8FD8ED #x849E) - (#x8FD8EE #x84A6) - (#x8FD8EF #x84A8) - (#x8FD8F0 #x84A9) - (#x8FD8F1 #x84AA) - (#x8FD8F2 #x84AF) - (#x8FD8F3 #x84B1) - (#x8FD8F4 #x84B4) - (#x8FD8F5 #x84BA) - (#x8FD8F6 #x84BD) - (#x8FD8F7 #x84BE) - (#x8FD8F8 #x84C0) - (#x8FD8F9 #x84C2) - (#x8FD8FA #x84C7) - (#x8FD8FB #x84C8) - (#x8FD8FC #x84CC) - (#x8FD8FD #x84CF) - (#x8FD8FE #x84D3) - (#x8FD9A1 #x84DC) - (#x8FD9A2 #x84E7) - (#x8FD9A3 #x84EA) - (#x8FD9A4 #x84EF) - (#x8FD9A5 #x84F0) - (#x8FD9A6 #x84F1) - (#x8FD9A7 #x84F2) - (#x8FD9A8 #x84F7) - (#x8FD9A9 #x8532) - (#x8FD9AA #x84FA) - (#x8FD9AB #x84FB) - (#x8FD9AC #x84FD) - (#x8FD9AD #x8502) - (#x8FD9AE #x8503) - (#x8FD9AF #x8507) - (#x8FD9B0 #x850C) - (#x8FD9B1 #x850E) - (#x8FD9B2 #x8510) - (#x8FD9B3 #x851C) - (#x8FD9B4 #x851E) - (#x8FD9B5 #x8522) - (#x8FD9B6 #x8523) - (#x8FD9B7 #x8524) - (#x8FD9B8 #x8525) - (#x8FD9B9 #x8527) - (#x8FD9BA #x852A) - (#x8FD9BB #x852B) - (#x8FD9BC #x852F) - (#x8FD9BD #x8533) - (#x8FD9BE #x8534) - (#x8FD9BF #x8536) - (#x8FD9C0 #x853F) - (#x8FD9C1 #x8546) - (#x8FD9C2 #x854F) - (#x8FD9C3 #x8550) - (#x8FD9C4 #x8551) - (#x8FD9C5 #x8552) - (#x8FD9C6 #x8553) - (#x8FD9C7 #x8556) - (#x8FD9C8 #x8559) - (#x8FD9C9 #x855C) - (#x8FD9CA #x855D) - (#x8FD9CB #x855E) - (#x8FD9CC #x855F) - (#x8FD9CD #x8560) - (#x8FD9CE #x8561) - (#x8FD9CF #x8562) - (#x8FD9D0 #x8564) - (#x8FD9D1 #x856B) - (#x8FD9D2 #x856F) - (#x8FD9D3 #x8579) - (#x8FD9D4 #x857A) - (#x8FD9D5 #x857B) - (#x8FD9D6 #x857D) - (#x8FD9D7 #x857F) - (#x8FD9D8 #x8581) - (#x8FD9D9 #x8585) - (#x8FD9DA #x8586) - (#x8FD9DB #x8589) - (#x8FD9DC #x858B) - (#x8FD9DD #x858C) - (#x8FD9DE #x858F) - (#x8FD9DF #x8593) - (#x8FD9E0 #x8598) - (#x8FD9E1 #x859D) - (#x8FD9E2 #x859F) - (#x8FD9E3 #x85A0) - (#x8FD9E4 #x85A2) - (#x8FD9E5 #x85A5) - (#x8FD9E6 #x85A7) - (#x8FD9E7 #x85B4) - (#x8FD9E8 #x85B6) - (#x8FD9E9 #x85B7) - (#x8FD9EA #x85B8) - (#x8FD9EB #x85BC) - (#x8FD9EC #x85BD) - (#x8FD9ED #x85BE) - (#x8FD9EE #x85BF) - (#x8FD9EF #x85C2) - (#x8FD9F0 #x85C7) - (#x8FD9F1 #x85CA) - (#x8FD9F2 #x85CB) - (#x8FD9F3 #x85CE) - (#x8FD9F4 #x85AD) - (#x8FD9F5 #x85D8) - (#x8FD9F6 #x85DA) - (#x8FD9F7 #x85DF) - (#x8FD9F8 #x85E0) - (#x8FD9F9 #x85E6) - (#x8FD9FA #x85E8) - (#x8FD9FB #x85ED) - (#x8FD9FC #x85F3) - (#x8FD9FD #x85F6) - (#x8FD9FE #x85FC) - (#x8FDAA1 #x85FF) - (#x8FDAA2 #x8600) - (#x8FDAA3 #x8604) - (#x8FDAA4 #x8605) - (#x8FDAA5 #x860D) - (#x8FDAA6 #x860E) - (#x8FDAA7 #x8610) - (#x8FDAA8 #x8611) - (#x8FDAA9 #x8612) - (#x8FDAAA #x8618) - (#x8FDAAB #x8619) - (#x8FDAAC #x861B) - (#x8FDAAD #x861E) - (#x8FDAAE #x8621) - (#x8FDAAF #x8627) - (#x8FDAB0 #x8629) - (#x8FDAB1 #x8636) - (#x8FDAB2 #x8638) - (#x8FDAB3 #x863A) - (#x8FDAB4 #x863C) - (#x8FDAB5 #x863D) - (#x8FDAB6 #x8640) - (#x8FDAB7 #x8642) - (#x8FDAB8 #x8646) - (#x8FDAB9 #x8652) - (#x8FDABA #x8653) - (#x8FDABB #x8656) - (#x8FDABC #x8657) - (#x8FDABD #x8658) - (#x8FDABE #x8659) - (#x8FDABF #x865D) - (#x8FDAC0 #x8660) - (#x8FDAC1 #x8661) - (#x8FDAC2 #x8662) - (#x8FDAC3 #x8663) - (#x8FDAC4 #x8664) - (#x8FDAC5 #x8669) - (#x8FDAC6 #x866C) - (#x8FDAC7 #x866F) - (#x8FDAC8 #x8675) - (#x8FDAC9 #x8676) - (#x8FDACA #x8677) - (#x8FDACB #x867A) - (#x8FDACC #x868D) - (#x8FDACD #x8691) - (#x8FDACE #x8696) - (#x8FDACF #x8698) - (#x8FDAD0 #x869A) - (#x8FDAD1 #x869C) - (#x8FDAD2 #x86A1) - (#x8FDAD3 #x86A6) - (#x8FDAD4 #x86A7) - (#x8FDAD5 #x86A8) - (#x8FDAD6 #x86AD) - (#x8FDAD7 #x86B1) - (#x8FDAD8 #x86B3) - (#x8FDAD9 #x86B4) - (#x8FDADA #x86B5) - (#x8FDADB #x86B7) - (#x8FDADC #x86B8) - (#x8FDADD #x86B9) - (#x8FDADE #x86BF) - (#x8FDADF #x86C0) - (#x8FDAE0 #x86C1) - (#x8FDAE1 #x86C3) - (#x8FDAE2 #x86C5) - (#x8FDAE3 #x86D1) - (#x8FDAE4 #x86D2) - (#x8FDAE5 #x86D5) - (#x8FDAE6 #x86D7) - (#x8FDAE7 #x86DA) - (#x8FDAE8 #x86DC) - (#x8FDAE9 #x86E0) - (#x8FDAEA #x86E3) - (#x8FDAEB #x86E5) - (#x8FDAEC #x86E7) - (#x8FDAED #x8688) - (#x8FDAEE #x86FA) - (#x8FDAEF #x86FC) - (#x8FDAF0 #x86FD) - (#x8FDAF1 #x8704) - (#x8FDAF2 #x8705) - (#x8FDAF3 #x8707) - (#x8FDAF4 #x870B) - (#x8FDAF5 #x870E) - (#x8FDAF6 #x870F) - (#x8FDAF7 #x8710) - (#x8FDAF8 #x8713) - (#x8FDAF9 #x8714) - (#x8FDAFA #x8719) - (#x8FDAFB #x871E) - (#x8FDAFC #x871F) - (#x8FDAFD #x8721) - (#x8FDAFE #x8723) - (#x8FDBA1 #x8728) - (#x8FDBA2 #x872E) - (#x8FDBA3 #x872F) - (#x8FDBA4 #x8731) - (#x8FDBA5 #x8732) - (#x8FDBA6 #x8739) - (#x8FDBA7 #x873A) - (#x8FDBA8 #x873C) - (#x8FDBA9 #x873D) - (#x8FDBAA #x873E) - (#x8FDBAB #x8740) - (#x8FDBAC #x8743) - (#x8FDBAD #x8745) - (#x8FDBAE #x874D) - (#x8FDBAF #x8758) - (#x8FDBB0 #x875D) - (#x8FDBB1 #x8761) - (#x8FDBB2 #x8764) - (#x8FDBB3 #x8765) - (#x8FDBB4 #x876F) - (#x8FDBB5 #x8771) - (#x8FDBB6 #x8772) - (#x8FDBB7 #x877B) - (#x8FDBB8 #x8783) - (#x8FDBB9 #x8784) - (#x8FDBBA #x8785) - (#x8FDBBB #x8786) - (#x8FDBBC #x8787) - (#x8FDBBD #x8788) - (#x8FDBBE #x8789) - (#x8FDBBF #x878B) - (#x8FDBC0 #x878C) - (#x8FDBC1 #x8790) - (#x8FDBC2 #x8793) - (#x8FDBC3 #x8795) - (#x8FDBC4 #x8797) - (#x8FDBC5 #x8798) - (#x8FDBC6 #x8799) - (#x8FDBC7 #x879E) - (#x8FDBC8 #x87A0) - (#x8FDBC9 #x87A3) - (#x8FDBCA #x87A7) - (#x8FDBCB #x87AC) - (#x8FDBCC #x87AD) - (#x8FDBCD #x87AE) - (#x8FDBCE #x87B1) - (#x8FDBCF #x87B5) - (#x8FDBD0 #x87BE) - (#x8FDBD1 #x87BF) - (#x8FDBD2 #x87C1) - (#x8FDBD3 #x87C8) - (#x8FDBD4 #x87C9) - (#x8FDBD5 #x87CA) - (#x8FDBD6 #x87CE) - (#x8FDBD7 #x87D5) - (#x8FDBD8 #x87D6) - (#x8FDBD9 #x87D9) - (#x8FDBDA #x87DA) - (#x8FDBDB #x87DC) - (#x8FDBDC #x87DF) - (#x8FDBDD #x87E2) - (#x8FDBDE #x87E3) - (#x8FDBDF #x87E4) - (#x8FDBE0 #x87EA) - (#x8FDBE1 #x87EB) - (#x8FDBE2 #x87ED) - (#x8FDBE3 #x87F1) - (#x8FDBE4 #x87F3) - (#x8FDBE5 #x87F8) - (#x8FDBE6 #x87FA) - (#x8FDBE7 #x87FF) - (#x8FDBE8 #x8801) - (#x8FDBE9 #x8803) - (#x8FDBEA #x8806) - (#x8FDBEB #x8809) - (#x8FDBEC #x880A) - (#x8FDBED #x880B) - (#x8FDBEE #x8810) - (#x8FDBEF #x8819) - (#x8FDBF0 #x8812) - (#x8FDBF1 #x8813) - (#x8FDBF2 #x8814) - (#x8FDBF3 #x8818) - (#x8FDBF4 #x881A) - (#x8FDBF5 #x881B) - (#x8FDBF6 #x881C) - (#x8FDBF7 #x881E) - (#x8FDBF8 #x881F) - (#x8FDBF9 #x8828) - (#x8FDBFA #x882D) - (#x8FDBFB #x882E) - (#x8FDBFC #x8830) - (#x8FDBFD #x8832) - (#x8FDBFE #x8835) - (#x8FDCA1 #x883A) - (#x8FDCA2 #x883C) - (#x8FDCA3 #x8841) - (#x8FDCA4 #x8843) - (#x8FDCA5 #x8845) - (#x8FDCA6 #x8848) - (#x8FDCA7 #x8849) - (#x8FDCA8 #x884A) - (#x8FDCA9 #x884B) - (#x8FDCAA #x884E) - (#x8FDCAB #x8851) - (#x8FDCAC #x8855) - (#x8FDCAD #x8856) - (#x8FDCAE #x8858) - (#x8FDCAF #x885A) - (#x8FDCB0 #x885C) - (#x8FDCB1 #x885F) - (#x8FDCB2 #x8860) - (#x8FDCB3 #x8864) - (#x8FDCB4 #x8869) - (#x8FDCB5 #x8871) - (#x8FDCB6 #x8879) - (#x8FDCB7 #x887B) - (#x8FDCB8 #x8880) - (#x8FDCB9 #x8898) - (#x8FDCBA #x889A) - (#x8FDCBB #x889B) - (#x8FDCBC #x889C) - (#x8FDCBD #x889F) - (#x8FDCBE #x88A0) - (#x8FDCBF #x88A8) - (#x8FDCC0 #x88AA) - (#x8FDCC1 #x88BA) - (#x8FDCC2 #x88BD) - (#x8FDCC3 #x88BE) - (#x8FDCC4 #x88C0) - (#x8FDCC5 #x88CA) - (#x8FDCC6 #x88CB) - (#x8FDCC7 #x88CC) - (#x8FDCC8 #x88CD) - (#x8FDCC9 #x88CE) - (#x8FDCCA #x88D1) - (#x8FDCCB #x88D2) - (#x8FDCCC #x88D3) - (#x8FDCCD #x88DB) - (#x8FDCCE #x88DE) - (#x8FDCCF #x88E7) - (#x8FDCD0 #x88EF) - (#x8FDCD1 #x88F0) - (#x8FDCD2 #x88F1) - (#x8FDCD3 #x88F5) - (#x8FDCD4 #x88F7) - (#x8FDCD5 #x8901) - (#x8FDCD6 #x8906) - (#x8FDCD7 #x890D) - (#x8FDCD8 #x890E) - (#x8FDCD9 #x890F) - (#x8FDCDA #x8915) - (#x8FDCDB #x8916) - (#x8FDCDC #x8918) - (#x8FDCDD #x8919) - (#x8FDCDE #x891A) - (#x8FDCDF #x891C) - (#x8FDCE0 #x8920) - (#x8FDCE1 #x8926) - (#x8FDCE2 #x8927) - (#x8FDCE3 #x8928) - (#x8FDCE4 #x8930) - (#x8FDCE5 #x8931) - (#x8FDCE6 #x8932) - (#x8FDCE7 #x8935) - (#x8FDCE8 #x8939) - (#x8FDCE9 #x893A) - (#x8FDCEA #x893E) - (#x8FDCEB #x8940) - (#x8FDCEC #x8942) - (#x8FDCED #x8945) - (#x8FDCEE #x8946) - (#x8FDCEF #x8949) - (#x8FDCF0 #x894F) - (#x8FDCF1 #x8952) - (#x8FDCF2 #x8957) - (#x8FDCF3 #x895A) - (#x8FDCF4 #x895B) - (#x8FDCF5 #x895C) - (#x8FDCF6 #x8961) - (#x8FDCF7 #x8962) - (#x8FDCF8 #x8963) - (#x8FDCF9 #x896B) - (#x8FDCFA #x896E) - (#x8FDCFB #x8970) - (#x8FDCFC #x8973) - (#x8FDCFD #x8975) - (#x8FDCFE #x897A) - (#x8FDDA1 #x897B) - (#x8FDDA2 #x897C) - (#x8FDDA3 #x897D) - (#x8FDDA4 #x8989) - (#x8FDDA5 #x898D) - (#x8FDDA6 #x8990) - (#x8FDDA7 #x8994) - (#x8FDDA8 #x8995) - (#x8FDDA9 #x899B) - (#x8FDDAA #x899C) - (#x8FDDAB #x899F) - (#x8FDDAC #x89A0) - (#x8FDDAD #x89A5) - (#x8FDDAE #x89B0) - (#x8FDDAF #x89B4) - (#x8FDDB0 #x89B5) - (#x8FDDB1 #x89B6) - (#x8FDDB2 #x89B7) - (#x8FDDB3 #x89BC) - (#x8FDDB4 #x89D4) - (#x8FDDB5 #x89D5) - (#x8FDDB6 #x89D6) - (#x8FDDB7 #x89D7) - (#x8FDDB8 #x89D8) - (#x8FDDB9 #x89E5) - (#x8FDDBA #x89E9) - (#x8FDDBB #x89EB) - (#x8FDDBC #x89ED) - (#x8FDDBD #x89F1) - (#x8FDDBE #x89F3) - (#x8FDDBF #x89F6) - (#x8FDDC0 #x89F9) - (#x8FDDC1 #x89FD) - (#x8FDDC2 #x89FF) - (#x8FDDC3 #x8A04) - (#x8FDDC4 #x8A05) - (#x8FDDC5 #x8A07) - (#x8FDDC6 #x8A0F) - (#x8FDDC7 #x8A11) - (#x8FDDC8 #x8A12) - (#x8FDDC9 #x8A14) - (#x8FDDCA #x8A15) - (#x8FDDCB #x8A1E) - (#x8FDDCC #x8A20) - (#x8FDDCD #x8A22) - (#x8FDDCE #x8A24) - (#x8FDDCF #x8A26) - (#x8FDDD0 #x8A2B) - (#x8FDDD1 #x8A2C) - (#x8FDDD2 #x8A2F) - (#x8FDDD3 #x8A35) - (#x8FDDD4 #x8A37) - (#x8FDDD5 #x8A3D) - (#x8FDDD6 #x8A3E) - (#x8FDDD7 #x8A40) - (#x8FDDD8 #x8A43) - (#x8FDDD9 #x8A45) - (#x8FDDDA #x8A47) - (#x8FDDDB #x8A49) - (#x8FDDDC #x8A4D) - (#x8FDDDD #x8A4E) - (#x8FDDDE #x8A53) - (#x8FDDDF #x8A56) - (#x8FDDE0 #x8A57) - (#x8FDDE1 #x8A58) - (#x8FDDE2 #x8A5C) - (#x8FDDE3 #x8A5D) - (#x8FDDE4 #x8A61) - (#x8FDDE5 #x8A65) - (#x8FDDE6 #x8A67) - (#x8FDDE7 #x8A75) - (#x8FDDE8 #x8A76) - (#x8FDDE9 #x8A77) - (#x8FDDEA #x8A79) - (#x8FDDEB #x8A7A) - (#x8FDDEC #x8A7B) - (#x8FDDED #x8A7E) - (#x8FDDEE #x8A7F) - (#x8FDDEF #x8A80) - (#x8FDDF0 #x8A83) - (#x8FDDF1 #x8A86) - (#x8FDDF2 #x8A8B) - (#x8FDDF3 #x8A8F) - (#x8FDDF4 #x8A90) - (#x8FDDF5 #x8A92) - (#x8FDDF6 #x8A96) - (#x8FDDF7 #x8A97) - (#x8FDDF8 #x8A99) - (#x8FDDF9 #x8A9F) - (#x8FDDFA #x8AA7) - (#x8FDDFB #x8AA9) - (#x8FDDFC #x8AAE) - (#x8FDDFD #x8AAF) - (#x8FDDFE #x8AB3) - (#x8FDEA1 #x8AB6) - (#x8FDEA2 #x8AB7) - (#x8FDEA3 #x8ABB) - (#x8FDEA4 #x8ABE) - (#x8FDEA5 #x8AC3) - (#x8FDEA6 #x8AC6) - (#x8FDEA7 #x8AC8) - (#x8FDEA8 #x8AC9) - (#x8FDEA9 #x8ACA) - (#x8FDEAA #x8AD1) - (#x8FDEAB #x8AD3) - (#x8FDEAC #x8AD4) - (#x8FDEAD #x8AD5) - (#x8FDEAE #x8AD7) - (#x8FDEAF #x8ADD) - (#x8FDEB0 #x8ADF) - (#x8FDEB1 #x8AEC) - (#x8FDEB2 #x8AF0) - (#x8FDEB3 #x8AF4) - (#x8FDEB4 #x8AF5) - (#x8FDEB5 #x8AF6) - (#x8FDEB6 #x8AFC) - (#x8FDEB7 #x8AFF) - (#x8FDEB8 #x8B05) - (#x8FDEB9 #x8B06) - (#x8FDEBA #x8B0B) - (#x8FDEBB #x8B11) - (#x8FDEBC #x8B1C) - (#x8FDEBD #x8B1E) - (#x8FDEBE #x8B1F) - (#x8FDEBF #x8B0A) - (#x8FDEC0 #x8B2D) - (#x8FDEC1 #x8B30) - (#x8FDEC2 #x8B37) - (#x8FDEC3 #x8B3C) - (#x8FDEC4 #x8B42) - (#x8FDEC5 #x8B43) - (#x8FDEC6 #x8B44) - (#x8FDEC7 #x8B45) - (#x8FDEC8 #x8B46) - (#x8FDEC9 #x8B48) - (#x8FDECA #x8B52) - (#x8FDECB #x8B53) - (#x8FDECC #x8B54) - (#x8FDECD #x8B59) - (#x8FDECE #x8B4D) - (#x8FDECF #x8B5E) - (#x8FDED0 #x8B63) - (#x8FDED1 #x8B6D) - (#x8FDED2 #x8B76) - (#x8FDED3 #x8B78) - (#x8FDED4 #x8B79) - (#x8FDED5 #x8B7C) - (#x8FDED6 #x8B7E) - (#x8FDED7 #x8B81) - (#x8FDED8 #x8B84) - (#x8FDED9 #x8B85) - (#x8FDEDA #x8B8B) - (#x8FDEDB #x8B8D) - (#x8FDEDC #x8B8F) - (#x8FDEDD #x8B94) - (#x8FDEDE #x8B95) - (#x8FDEDF #x8B9C) - (#x8FDEE0 #x8B9E) - (#x8FDEE1 #x8B9F) - (#x8FDEE2 #x8C38) - (#x8FDEE3 #x8C39) - (#x8FDEE4 #x8C3D) - (#x8FDEE5 #x8C3E) - (#x8FDEE6 #x8C45) - (#x8FDEE7 #x8C47) - (#x8FDEE8 #x8C49) - (#x8FDEE9 #x8C4B) - (#x8FDEEA #x8C4F) - (#x8FDEEB #x8C51) - (#x8FDEEC #x8C53) - (#x8FDEED #x8C54) - (#x8FDEEE #x8C57) - (#x8FDEEF #x8C58) - (#x8FDEF0 #x8C5B) - (#x8FDEF1 #x8C5D) - (#x8FDEF2 #x8C59) - (#x8FDEF3 #x8C63) - (#x8FDEF4 #x8C64) - (#x8FDEF5 #x8C66) - (#x8FDEF6 #x8C68) - (#x8FDEF7 #x8C69) - (#x8FDEF8 #x8C6D) - (#x8FDEF9 #x8C73) - (#x8FDEFA #x8C75) - (#x8FDEFB #x8C76) - (#x8FDEFC #x8C7B) - (#x8FDEFD #x8C7E) - (#x8FDEFE #x8C86) - (#x8FDFA1 #x8C87) - (#x8FDFA2 #x8C8B) - (#x8FDFA3 #x8C90) - (#x8FDFA4 #x8C92) - (#x8FDFA5 #x8C93) - (#x8FDFA6 #x8C99) - (#x8FDFA7 #x8C9B) - (#x8FDFA8 #x8C9C) - (#x8FDFA9 #x8CA4) - (#x8FDFAA #x8CB9) - (#x8FDFAB #x8CBA) - (#x8FDFAC #x8CC5) - (#x8FDFAD #x8CC6) - (#x8FDFAE #x8CC9) - (#x8FDFAF #x8CCB) - (#x8FDFB0 #x8CCF) - (#x8FDFB1 #x8CD6) - (#x8FDFB2 #x8CD5) - (#x8FDFB3 #x8CD9) - (#x8FDFB4 #x8CDD) - (#x8FDFB5 #x8CE1) - (#x8FDFB6 #x8CE8) - (#x8FDFB7 #x8CEC) - (#x8FDFB8 #x8CEF) - (#x8FDFB9 #x8CF0) - (#x8FDFBA #x8CF2) - (#x8FDFBB #x8CF5) - (#x8FDFBC #x8CF7) - (#x8FDFBD #x8CF8) - (#x8FDFBE #x8CFE) - (#x8FDFBF #x8CFF) - (#x8FDFC0 #x8D01) - (#x8FDFC1 #x8D03) - (#x8FDFC2 #x8D09) - (#x8FDFC3 #x8D12) - (#x8FDFC4 #x8D17) - (#x8FDFC5 #x8D1B) - (#x8FDFC6 #x8D65) - (#x8FDFC7 #x8D69) - (#x8FDFC8 #x8D6C) - (#x8FDFC9 #x8D6E) - (#x8FDFCA #x8D7F) - (#x8FDFCB #x8D82) - (#x8FDFCC #x8D84) - (#x8FDFCD #x8D88) - (#x8FDFCE #x8D8D) - (#x8FDFCF #x8D90) - (#x8FDFD0 #x8D91) - (#x8FDFD1 #x8D95) - (#x8FDFD2 #x8D9E) - (#x8FDFD3 #x8D9F) - (#x8FDFD4 #x8DA0) - (#x8FDFD5 #x8DA6) - (#x8FDFD6 #x8DAB) - (#x8FDFD7 #x8DAC) - (#x8FDFD8 #x8DAF) - (#x8FDFD9 #x8DB2) - (#x8FDFDA #x8DB5) - (#x8FDFDB #x8DB7) - (#x8FDFDC #x8DB9) - (#x8FDFDD #x8DBB) - (#x8FDFDE #x8DC0) - (#x8FDFDF #x8DC5) - (#x8FDFE0 #x8DC6) - (#x8FDFE1 #x8DC7) - (#x8FDFE2 #x8DC8) - (#x8FDFE3 #x8DCA) - (#x8FDFE4 #x8DCE) - (#x8FDFE5 #x8DD1) - (#x8FDFE6 #x8DD4) - (#x8FDFE7 #x8DD5) - (#x8FDFE8 #x8DD7) - (#x8FDFE9 #x8DD9) - (#x8FDFEA #x8DE4) - (#x8FDFEB #x8DE5) - (#x8FDFEC #x8DE7) - (#x8FDFED #x8DEC) - (#x8FDFEE #x8DF0) - (#x8FDFEF #x8DBC) - (#x8FDFF0 #x8DF1) - (#x8FDFF1 #x8DF2) - (#x8FDFF2 #x8DF4) - (#x8FDFF3 #x8DFD) - (#x8FDFF4 #x8E01) - (#x8FDFF5 #x8E04) - (#x8FDFF6 #x8E05) - (#x8FDFF7 #x8E06) - (#x8FDFF8 #x8E0B) - (#x8FDFF9 #x8E11) - (#x8FDFFA #x8E14) - (#x8FDFFB #x8E16) - (#x8FDFFC #x8E20) - (#x8FDFFD #x8E21) - (#x8FDFFE #x8E22) - (#x8FE0A1 #x8E23) - (#x8FE0A2 #x8E26) - (#x8FE0A3 #x8E27) - (#x8FE0A4 #x8E31) - (#x8FE0A5 #x8E33) - (#x8FE0A6 #x8E36) - (#x8FE0A7 #x8E37) - (#x8FE0A8 #x8E38) - (#x8FE0A9 #x8E39) - (#x8FE0AA #x8E3D) - (#x8FE0AB #x8E40) - (#x8FE0AC #x8E41) - (#x8FE0AD #x8E4B) - (#x8FE0AE #x8E4D) - (#x8FE0AF #x8E4E) - (#x8FE0B0 #x8E4F) - (#x8FE0B1 #x8E54) - (#x8FE0B2 #x8E5B) - (#x8FE0B3 #x8E5C) - (#x8FE0B4 #x8E5D) - (#x8FE0B5 #x8E5E) - (#x8FE0B6 #x8E61) - (#x8FE0B7 #x8E62) - (#x8FE0B8 #x8E69) - (#x8FE0B9 #x8E6C) - (#x8FE0BA #x8E6D) - (#x8FE0BB #x8E6F) - (#x8FE0BC #x8E70) - (#x8FE0BD #x8E71) - (#x8FE0BE #x8E79) - (#x8FE0BF #x8E7A) - (#x8FE0C0 #x8E7B) - (#x8FE0C1 #x8E82) - (#x8FE0C2 #x8E83) - (#x8FE0C3 #x8E89) - (#x8FE0C4 #x8E90) - (#x8FE0C5 #x8E92) - (#x8FE0C6 #x8E95) - (#x8FE0C7 #x8E9A) - (#x8FE0C8 #x8E9B) - (#x8FE0C9 #x8E9D) - (#x8FE0CA #x8E9E) - (#x8FE0CB #x8EA2) - (#x8FE0CC #x8EA7) - (#x8FE0CD #x8EA9) - (#x8FE0CE #x8EAD) - (#x8FE0CF #x8EAE) - (#x8FE0D0 #x8EB3) - (#x8FE0D1 #x8EB5) - (#x8FE0D2 #x8EBA) - (#x8FE0D3 #x8EBB) - (#x8FE0D4 #x8EC0) - (#x8FE0D5 #x8EC1) - (#x8FE0D6 #x8EC3) - (#x8FE0D7 #x8EC4) - (#x8FE0D8 #x8EC7) - (#x8FE0D9 #x8ECF) - (#x8FE0DA #x8ED1) - (#x8FE0DB #x8ED4) - (#x8FE0DC #x8EDC) - (#x8FE0DD #x8EE8) - (#x8FE0DE #x8EEE) - (#x8FE0DF #x8EF0) - (#x8FE0E0 #x8EF1) - (#x8FE0E1 #x8EF7) - (#x8FE0E2 #x8EF9) - (#x8FE0E3 #x8EFA) - (#x8FE0E4 #x8EED) - (#x8FE0E5 #x8F00) - (#x8FE0E6 #x8F02) - (#x8FE0E7 #x8F07) - (#x8FE0E8 #x8F08) - (#x8FE0E9 #x8F0F) - (#x8FE0EA #x8F10) - (#x8FE0EB #x8F16) - (#x8FE0EC #x8F17) - (#x8FE0ED #x8F18) - (#x8FE0EE #x8F1E) - (#x8FE0EF #x8F20) - (#x8FE0F0 #x8F21) - (#x8FE0F1 #x8F23) - (#x8FE0F2 #x8F25) - (#x8FE0F3 #x8F27) - (#x8FE0F4 #x8F28) - (#x8FE0F5 #x8F2C) - (#x8FE0F6 #x8F2D) - (#x8FE0F7 #x8F2E) - (#x8FE0F8 #x8F34) - (#x8FE0F9 #x8F35) - (#x8FE0FA #x8F36) - (#x8FE0FB #x8F37) - (#x8FE0FC #x8F3A) - (#x8FE0FD #x8F40) - (#x8FE0FE #x8F41) - (#x8FE1A1 #x8F43) - (#x8FE1A2 #x8F47) - (#x8FE1A3 #x8F4F) - (#x8FE1A4 #x8F51) - (#x8FE1A5 #x8F52) - (#x8FE1A6 #x8F53) - (#x8FE1A7 #x8F54) - (#x8FE1A8 #x8F55) - (#x8FE1A9 #x8F58) - (#x8FE1AA #x8F5D) - (#x8FE1AB #x8F5E) - (#x8FE1AC #x8F65) - (#x8FE1AD #x8F9D) - (#x8FE1AE #x8FA0) - (#x8FE1AF #x8FA1) - (#x8FE1B0 #x8FA4) - (#x8FE1B1 #x8FA5) - (#x8FE1B2 #x8FA6) - (#x8FE1B3 #x8FB5) - (#x8FE1B4 #x8FB6) - (#x8FE1B5 #x8FB8) - (#x8FE1B6 #x8FBE) - (#x8FE1B7 #x8FC0) - (#x8FE1B8 #x8FC1) - (#x8FE1B9 #x8FC6) - (#x8FE1BA #x8FCA) - (#x8FE1BB #x8FCB) - (#x8FE1BC #x8FCD) - (#x8FE1BD #x8FD0) - (#x8FE1BE #x8FD2) - (#x8FE1BF #x8FD3) - (#x8FE1C0 #x8FD5) - (#x8FE1C1 #x8FE0) - (#x8FE1C2 #x8FE3) - (#x8FE1C3 #x8FE4) - (#x8FE1C4 #x8FE8) - (#x8FE1C5 #x8FEE) - (#x8FE1C6 #x8FF1) - (#x8FE1C7 #x8FF5) - (#x8FE1C8 #x8FF6) - (#x8FE1C9 #x8FFB) - (#x8FE1CA #x8FFE) - (#x8FE1CB #x9002) - (#x8FE1CC #x9004) - (#x8FE1CD #x9008) - (#x8FE1CE #x900C) - (#x8FE1CF #x9018) - (#x8FE1D0 #x901B) - (#x8FE1D1 #x9028) - (#x8FE1D2 #x9029) - (#x8FE1D3 #x902F) - (#x8FE1D4 #x902A) - (#x8FE1D5 #x902C) - (#x8FE1D6 #x902D) - (#x8FE1D7 #x9033) - (#x8FE1D8 #x9034) - (#x8FE1D9 #x9037) - (#x8FE1DA #x903F) - (#x8FE1DB #x9043) - (#x8FE1DC #x9044) - (#x8FE1DD #x904C) - (#x8FE1DE #x905B) - (#x8FE1DF #x905D) - (#x8FE1E0 #x9062) - (#x8FE1E1 #x9066) - (#x8FE1E2 #x9067) - (#x8FE1E3 #x906C) - (#x8FE1E4 #x9070) - (#x8FE1E5 #x9074) - (#x8FE1E6 #x9079) - (#x8FE1E7 #x9085) - (#x8FE1E8 #x9088) - (#x8FE1E9 #x908B) - (#x8FE1EA #x908C) - (#x8FE1EB #x908E) - (#x8FE1EC #x9090) - (#x8FE1ED #x9095) - (#x8FE1EE #x9097) - (#x8FE1EF #x9098) - (#x8FE1F0 #x9099) - (#x8FE1F1 #x909B) - (#x8FE1F2 #x90A0) - (#x8FE1F3 #x90A1) - (#x8FE1F4 #x90A2) - (#x8FE1F5 #x90A5) - (#x8FE1F6 #x90B0) - (#x8FE1F7 #x90B2) - (#x8FE1F8 #x90B3) - (#x8FE1F9 #x90B4) - (#x8FE1FA #x90B6) - (#x8FE1FB #x90BD) - (#x8FE1FC #x90CC) - (#x8FE1FD #x90BE) - (#x8FE1FE #x90C3) - (#x8FE2A1 #x90C4) - (#x8FE2A2 #x90C5) - (#x8FE2A3 #x90C7) - (#x8FE2A4 #x90C8) - (#x8FE2A5 #x90D5) - (#x8FE2A6 #x90D7) - (#x8FE2A7 #x90D8) - (#x8FE2A8 #x90D9) - (#x8FE2A9 #x90DC) - (#x8FE2AA #x90DD) - (#x8FE2AB #x90DF) - (#x8FE2AC #x90E5) - (#x8FE2AD #x90D2) - (#x8FE2AE #x90F6) - (#x8FE2AF #x90EB) - (#x8FE2B0 #x90EF) - (#x8FE2B1 #x90F0) - (#x8FE2B2 #x90F4) - (#x8FE2B3 #x90FE) - (#x8FE2B4 #x90FF) - (#x8FE2B5 #x9100) - (#x8FE2B6 #x9104) - (#x8FE2B7 #x9105) - (#x8FE2B8 #x9106) - (#x8FE2B9 #x9108) - (#x8FE2BA #x910D) - (#x8FE2BB #x9110) - (#x8FE2BC #x9114) - (#x8FE2BD #x9116) - (#x8FE2BE #x9117) - (#x8FE2BF #x9118) - (#x8FE2C0 #x911A) - (#x8FE2C1 #x911C) - (#x8FE2C2 #x911E) - (#x8FE2C3 #x9120) - (#x8FE2C4 #x9125) - (#x8FE2C5 #x9122) - (#x8FE2C6 #x9123) - (#x8FE2C7 #x9127) - (#x8FE2C8 #x9129) - (#x8FE2C9 #x912E) - (#x8FE2CA #x912F) - (#x8FE2CB #x9131) - (#x8FE2CC #x9134) - (#x8FE2CD #x9136) - (#x8FE2CE #x9137) - (#x8FE2CF #x9139) - (#x8FE2D0 #x913A) - (#x8FE2D1 #x913C) - (#x8FE2D2 #x913D) - (#x8FE2D3 #x9143) - (#x8FE2D4 #x9147) - (#x8FE2D5 #x9148) - (#x8FE2D6 #x914F) - (#x8FE2D7 #x9153) - (#x8FE2D8 #x9157) - (#x8FE2D9 #x9159) - (#x8FE2DA #x915A) - (#x8FE2DB #x915B) - (#x8FE2DC #x9161) - (#x8FE2DD #x9164) - (#x8FE2DE #x9167) - (#x8FE2DF #x916D) - (#x8FE2E0 #x9174) - (#x8FE2E1 #x9179) - (#x8FE2E2 #x917A) - (#x8FE2E3 #x917B) - (#x8FE2E4 #x9181) - (#x8FE2E5 #x9183) - (#x8FE2E6 #x9185) - (#x8FE2E7 #x9186) - (#x8FE2E8 #x918A) - (#x8FE2E9 #x918E) - (#x8FE2EA #x9191) - (#x8FE2EB #x9193) - (#x8FE2EC #x9194) - (#x8FE2ED #x9195) - (#x8FE2EE #x9198) - (#x8FE2EF #x919E) - (#x8FE2F0 #x91A1) - (#x8FE2F1 #x91A6) - (#x8FE2F2 #x91A8) - (#x8FE2F3 #x91AC) - (#x8FE2F4 #x91AD) - (#x8FE2F5 #x91AE) - (#x8FE2F6 #x91B0) - (#x8FE2F7 #x91B1) - (#x8FE2F8 #x91B2) - (#x8FE2F9 #x91B3) - (#x8FE2FA #x91B6) - (#x8FE2FB #x91BB) - (#x8FE2FC #x91BC) - (#x8FE2FD #x91BD) - (#x8FE2FE #x91BF) - (#x8FE3A1 #x91C2) - (#x8FE3A2 #x91C3) - (#x8FE3A3 #x91C5) - (#x8FE3A4 #x91D3) - (#x8FE3A5 #x91D4) - (#x8FE3A6 #x91D7) - (#x8FE3A7 #x91D9) - (#x8FE3A8 #x91DA) - (#x8FE3A9 #x91DE) - (#x8FE3AA #x91E4) - (#x8FE3AB #x91E5) - (#x8FE3AC #x91E9) - (#x8FE3AD #x91EA) - (#x8FE3AE #x91EC) - (#x8FE3AF #x91ED) - (#x8FE3B0 #x91EE) - (#x8FE3B1 #x91EF) - (#x8FE3B2 #x91F0) - (#x8FE3B3 #x91F1) - (#x8FE3B4 #x91F7) - (#x8FE3B5 #x91F9) - (#x8FE3B6 #x91FB) - (#x8FE3B7 #x91FD) - (#x8FE3B8 #x9200) - (#x8FE3B9 #x9201) - (#x8FE3BA #x9204) - (#x8FE3BB #x9205) - (#x8FE3BC #x9206) - (#x8FE3BD #x9207) - (#x8FE3BE #x9209) - (#x8FE3BF #x920A) - (#x8FE3C0 #x920C) - (#x8FE3C1 #x9210) - (#x8FE3C2 #x9212) - (#x8FE3C3 #x9213) - (#x8FE3C4 #x9216) - (#x8FE3C5 #x9218) - (#x8FE3C6 #x921C) - (#x8FE3C7 #x921D) - (#x8FE3C8 #x9223) - (#x8FE3C9 #x9224) - (#x8FE3CA #x9225) - (#x8FE3CB #x9226) - (#x8FE3CC #x9228) - (#x8FE3CD #x922E) - (#x8FE3CE #x922F) - (#x8FE3CF #x9230) - (#x8FE3D0 #x9233) - (#x8FE3D1 #x9235) - (#x8FE3D2 #x9236) - (#x8FE3D3 #x9238) - (#x8FE3D4 #x9239) - (#x8FE3D5 #x923A) - (#x8FE3D6 #x923C) - (#x8FE3D7 #x923E) - (#x8FE3D8 #x9240) - (#x8FE3D9 #x9242) - (#x8FE3DA #x9243) - (#x8FE3DB #x9246) - (#x8FE3DC #x9247) - (#x8FE3DD #x924A) - (#x8FE3DE #x924D) - (#x8FE3DF #x924E) - (#x8FE3E0 #x924F) - (#x8FE3E1 #x9251) - (#x8FE3E2 #x9258) - (#x8FE3E3 #x9259) - (#x8FE3E4 #x925C) - (#x8FE3E5 #x925D) - (#x8FE3E6 #x9260) - (#x8FE3E7 #x9261) - (#x8FE3E8 #x9265) - (#x8FE3E9 #x9267) - (#x8FE3EA #x9268) - (#x8FE3EB #x9269) - (#x8FE3EC #x926E) - (#x8FE3ED #x926F) - (#x8FE3EE #x9270) - (#x8FE3EF #x9275) - (#x8FE3F0 #x9276) - (#x8FE3F1 #x9277) - (#x8FE3F2 #x9278) - (#x8FE3F3 #x9279) - (#x8FE3F4 #x927B) - (#x8FE3F5 #x927C) - (#x8FE3F6 #x927D) - (#x8FE3F7 #x927F) - (#x8FE3F8 #x9288) - (#x8FE3F9 #x9289) - (#x8FE3FA #x928A) - (#x8FE3FB #x928D) - (#x8FE3FC #x928E) - (#x8FE3FD #x9292) - (#x8FE3FE #x9297) - (#x8FE4A1 #x9299) - (#x8FE4A2 #x929F) - (#x8FE4A3 #x92A0) - (#x8FE4A4 #x92A4) - (#x8FE4A5 #x92A5) - (#x8FE4A6 #x92A7) - (#x8FE4A7 #x92A8) - (#x8FE4A8 #x92AB) - (#x8FE4A9 #x92AF) - (#x8FE4AA #x92B2) - (#x8FE4AB #x92B6) - (#x8FE4AC #x92B8) - (#x8FE4AD #x92BA) - (#x8FE4AE #x92BB) - (#x8FE4AF #x92BC) - (#x8FE4B0 #x92BD) - (#x8FE4B1 #x92BF) - (#x8FE4B2 #x92C0) - (#x8FE4B3 #x92C1) - (#x8FE4B4 #x92C2) - (#x8FE4B5 #x92C3) - (#x8FE4B6 #x92C5) - (#x8FE4B7 #x92C6) - (#x8FE4B8 #x92C7) - (#x8FE4B9 #x92C8) - (#x8FE4BA #x92CB) - (#x8FE4BB #x92CC) - (#x8FE4BC #x92CD) - (#x8FE4BD #x92CE) - (#x8FE4BE #x92D0) - (#x8FE4BF #x92D3) - (#x8FE4C0 #x92D5) - (#x8FE4C1 #x92D7) - (#x8FE4C2 #x92D8) - (#x8FE4C3 #x92D9) - (#x8FE4C4 #x92DC) - (#x8FE4C5 #x92DD) - (#x8FE4C6 #x92DF) - (#x8FE4C7 #x92E0) - (#x8FE4C8 #x92E1) - (#x8FE4C9 #x92E3) - (#x8FE4CA #x92E5) - (#x8FE4CB #x92E7) - (#x8FE4CC #x92E8) - (#x8FE4CD #x92EC) - (#x8FE4CE #x92EE) - (#x8FE4CF #x92F0) - (#x8FE4D0 #x92F9) - (#x8FE4D1 #x92FB) - (#x8FE4D2 #x92FF) - (#x8FE4D3 #x9300) - (#x8FE4D4 #x9302) - (#x8FE4D5 #x9308) - (#x8FE4D6 #x930D) - (#x8FE4D7 #x9311) - (#x8FE4D8 #x9314) - (#x8FE4D9 #x9315) - (#x8FE4DA #x931C) - (#x8FE4DB #x931D) - (#x8FE4DC #x931E) - (#x8FE4DD #x931F) - (#x8FE4DE #x9321) - (#x8FE4DF #x9324) - (#x8FE4E0 #x9325) - (#x8FE4E1 #x9327) - (#x8FE4E2 #x9329) - (#x8FE4E3 #x932A) - (#x8FE4E4 #x9333) - (#x8FE4E5 #x9334) - (#x8FE4E6 #x9336) - (#x8FE4E7 #x9337) - (#x8FE4E8 #x9347) - (#x8FE4E9 #x9348) - (#x8FE4EA #x9349) - (#x8FE4EB #x9350) - (#x8FE4EC #x9351) - (#x8FE4ED #x9352) - (#x8FE4EE #x9355) - (#x8FE4EF #x9357) - (#x8FE4F0 #x9358) - (#x8FE4F1 #x935A) - (#x8FE4F2 #x935E) - (#x8FE4F3 #x9364) - (#x8FE4F4 #x9365) - (#x8FE4F5 #x9367) - (#x8FE4F6 #x9369) - (#x8FE4F7 #x936A) - (#x8FE4F8 #x936D) - (#x8FE4F9 #x936F) - (#x8FE4FA #x9370) - (#x8FE4FB #x9371) - (#x8FE4FC #x9373) - (#x8FE4FD #x9374) - (#x8FE4FE #x9376) - (#x8FE5A1 #x937A) - (#x8FE5A2 #x937D) - (#x8FE5A3 #x937F) - (#x8FE5A4 #x9380) - (#x8FE5A5 #x9381) - (#x8FE5A6 #x9382) - (#x8FE5A7 #x9388) - (#x8FE5A8 #x938A) - (#x8FE5A9 #x938B) - (#x8FE5AA #x938D) - (#x8FE5AB #x938F) - (#x8FE5AC #x9392) - (#x8FE5AD #x9395) - (#x8FE5AE #x9398) - (#x8FE5AF #x939B) - (#x8FE5B0 #x939E) - (#x8FE5B1 #x93A1) - (#x8FE5B2 #x93A3) - (#x8FE5B3 #x93A4) - (#x8FE5B4 #x93A6) - (#x8FE5B5 #x93A8) - (#x8FE5B6 #x93AB) - (#x8FE5B7 #x93B4) - (#x8FE5B8 #x93B5) - (#x8FE5B9 #x93B6) - (#x8FE5BA #x93BA) - (#x8FE5BB #x93A9) - (#x8FE5BC #x93C1) - (#x8FE5BD #x93C4) - (#x8FE5BE #x93C5) - (#x8FE5BF #x93C6) - (#x8FE5C0 #x93C7) - (#x8FE5C1 #x93C9) - (#x8FE5C2 #x93CA) - (#x8FE5C3 #x93CB) - (#x8FE5C4 #x93CC) - (#x8FE5C5 #x93CD) - (#x8FE5C6 #x93D3) - (#x8FE5C7 #x93D9) - (#x8FE5C8 #x93DC) - (#x8FE5C9 #x93DE) - (#x8FE5CA #x93DF) - (#x8FE5CB #x93E2) - (#x8FE5CC #x93E6) - (#x8FE5CD #x93E7) - (#x8FE5CE #x93F9) - (#x8FE5CF #x93F7) - (#x8FE5D0 #x93F8) - (#x8FE5D1 #x93FA) - (#x8FE5D2 #x93FB) - (#x8FE5D3 #x93FD) - (#x8FE5D4 #x9401) - (#x8FE5D5 #x9402) - (#x8FE5D6 #x9404) - (#x8FE5D7 #x9408) - (#x8FE5D8 #x9409) - (#x8FE5D9 #x940D) - (#x8FE5DA #x940E) - (#x8FE5DB #x940F) - (#x8FE5DC #x9415) - (#x8FE5DD #x9416) - (#x8FE5DE #x9417) - (#x8FE5DF #x941F) - (#x8FE5E0 #x942E) - (#x8FE5E1 #x942F) - (#x8FE5E2 #x9431) - (#x8FE5E3 #x9432) - (#x8FE5E4 #x9433) - (#x8FE5E5 #x9434) - (#x8FE5E6 #x943B) - (#x8FE5E7 #x943F) - (#x8FE5E8 #x943D) - (#x8FE5E9 #x9443) - (#x8FE5EA #x9445) - (#x8FE5EB #x9448) - (#x8FE5EC #x944A) - (#x8FE5ED #x944C) - (#x8FE5EE #x9455) - (#x8FE5EF #x9459) - (#x8FE5F0 #x945C) - (#x8FE5F1 #x945F) - (#x8FE5F2 #x9461) - (#x8FE5F3 #x9463) - (#x8FE5F4 #x9468) - (#x8FE5F5 #x946B) - (#x8FE5F6 #x946D) - (#x8FE5F7 #x946E) - (#x8FE5F8 #x946F) - (#x8FE5F9 #x9471) - (#x8FE5FA #x9472) - (#x8FE5FB #x9484) - (#x8FE5FC #x9483) - (#x8FE5FD #x9578) - (#x8FE5FE #x9579) - (#x8FE6A1 #x957E) - (#x8FE6A2 #x9584) - (#x8FE6A3 #x9588) - (#x8FE6A4 #x958C) - (#x8FE6A5 #x958D) - (#x8FE6A6 #x958E) - (#x8FE6A7 #x959D) - (#x8FE6A8 #x959E) - (#x8FE6A9 #x959F) - (#x8FE6AA #x95A1) - (#x8FE6AB #x95A6) - (#x8FE6AC #x95A9) - (#x8FE6AD #x95AB) - (#x8FE6AE #x95AC) - (#x8FE6AF #x95B4) - (#x8FE6B0 #x95B6) - (#x8FE6B1 #x95BA) - (#x8FE6B2 #x95BD) - (#x8FE6B3 #x95BF) - (#x8FE6B4 #x95C6) - (#x8FE6B5 #x95C8) - (#x8FE6B6 #x95C9) - (#x8FE6B7 #x95CB) - (#x8FE6B8 #x95D0) - (#x8FE6B9 #x95D1) - (#x8FE6BA #x95D2) - (#x8FE6BB #x95D3) - (#x8FE6BC #x95D9) - (#x8FE6BD #x95DA) - (#x8FE6BE #x95DD) - (#x8FE6BF #x95DE) - (#x8FE6C0 #x95DF) - (#x8FE6C1 #x95E0) - (#x8FE6C2 #x95E4) - (#x8FE6C3 #x95E6) - (#x8FE6C4 #x961D) - (#x8FE6C5 #x961E) - (#x8FE6C6 #x9622) - (#x8FE6C7 #x9624) - (#x8FE6C8 #x9625) - (#x8FE6C9 #x9626) - (#x8FE6CA #x962C) - (#x8FE6CB #x9631) - (#x8FE6CC #x9633) - (#x8FE6CD #x9637) - (#x8FE6CE #x9638) - (#x8FE6CF #x9639) - (#x8FE6D0 #x963A) - (#x8FE6D1 #x963C) - (#x8FE6D2 #x963D) - (#x8FE6D3 #x9641) - (#x8FE6D4 #x9652) - (#x8FE6D5 #x9654) - (#x8FE6D6 #x9656) - (#x8FE6D7 #x9657) - (#x8FE6D8 #x9658) - (#x8FE6D9 #x9661) - (#x8FE6DA #x966E) - (#x8FE6DB #x9674) - (#x8FE6DC #x967B) - (#x8FE6DD #x967C) - (#x8FE6DE #x967E) - (#x8FE6DF #x967F) - (#x8FE6E0 #x9681) - (#x8FE6E1 #x9682) - (#x8FE6E2 #x9683) - (#x8FE6E3 #x9684) - (#x8FE6E4 #x9689) - (#x8FE6E5 #x9691) - (#x8FE6E6 #x9696) - (#x8FE6E7 #x969A) - (#x8FE6E8 #x969D) - (#x8FE6E9 #x969F) - (#x8FE6EA #x96A4) - (#x8FE6EB #x96A5) - (#x8FE6EC #x96A6) - (#x8FE6ED #x96A9) - (#x8FE6EE #x96AE) - (#x8FE6EF #x96AF) - (#x8FE6F0 #x96B3) - (#x8FE6F1 #x96BA) - (#x8FE6F2 #x96CA) - (#x8FE6F3 #x96D2) - (#x8FE6F4 #x5DB2) - (#x8FE6F5 #x96D8) - (#x8FE6F6 #x96DA) - (#x8FE6F7 #x96DD) - (#x8FE6F8 #x96DE) - (#x8FE6F9 #x96DF) - (#x8FE6FA #x96E9) - (#x8FE6FB #x96EF) - (#x8FE6FC #x96F1) - (#x8FE6FD #x96FA) - (#x8FE6FE #x9702) - (#x8FE7A1 #x9703) - (#x8FE7A2 #x9705) - (#x8FE7A3 #x9709) - (#x8FE7A4 #x971A) - (#x8FE7A5 #x971B) - (#x8FE7A6 #x971D) - (#x8FE7A7 #x9721) - (#x8FE7A8 #x9722) - (#x8FE7A9 #x9723) - (#x8FE7AA #x9728) - (#x8FE7AB #x9731) - (#x8FE7AC #x9733) - (#x8FE7AD #x9741) - (#x8FE7AE #x9743) - (#x8FE7AF #x974A) - (#x8FE7B0 #x974E) - (#x8FE7B1 #x974F) - (#x8FE7B2 #x9755) - (#x8FE7B3 #x9757) - (#x8FE7B4 #x9758) - (#x8FE7B5 #x975A) - (#x8FE7B6 #x975B) - (#x8FE7B7 #x9763) - (#x8FE7B8 #x9767) - (#x8FE7B9 #x976A) - (#x8FE7BA #x976E) - (#x8FE7BB #x9773) - (#x8FE7BC #x9776) - (#x8FE7BD #x9777) - (#x8FE7BE #x9778) - (#x8FE7BF #x977B) - (#x8FE7C0 #x977D) - (#x8FE7C1 #x977F) - (#x8FE7C2 #x9780) - (#x8FE7C3 #x9789) - (#x8FE7C4 #x9795) - (#x8FE7C5 #x9796) - (#x8FE7C6 #x9797) - (#x8FE7C7 #x9799) - (#x8FE7C8 #x979A) - (#x8FE7C9 #x979E) - (#x8FE7CA #x979F) - (#x8FE7CB #x97A2) - (#x8FE7CC #x97AC) - (#x8FE7CD #x97AE) - (#x8FE7CE #x97B1) - (#x8FE7CF #x97B2) - (#x8FE7D0 #x97B5) - (#x8FE7D1 #x97B6) - (#x8FE7D2 #x97B8) - (#x8FE7D3 #x97B9) - (#x8FE7D4 #x97BA) - (#x8FE7D5 #x97BC) - (#x8FE7D6 #x97BE) - (#x8FE7D7 #x97BF) - (#x8FE7D8 #x97C1) - (#x8FE7D9 #x97C4) - (#x8FE7DA #x97C5) - (#x8FE7DB #x97C7) - (#x8FE7DC #x97C9) - (#x8FE7DD #x97CA) - (#x8FE7DE #x97CC) - (#x8FE7DF #x97CD) - (#x8FE7E0 #x97CE) - (#x8FE7E1 #x97D0) - (#x8FE7E2 #x97D1) - (#x8FE7E3 #x97D4) - (#x8FE7E4 #x97D7) - (#x8FE7E5 #x97D8) - (#x8FE7E6 #x97D9) - (#x8FE7E7 #x97DD) - (#x8FE7E8 #x97DE) - (#x8FE7E9 #x97E0) - (#x8FE7EA #x97DB) - (#x8FE7EB #x97E1) - (#x8FE7EC #x97E4) - (#x8FE7ED #x97EF) - (#x8FE7EE #x97F1) - (#x8FE7EF #x97F4) - (#x8FE7F0 #x97F7) - (#x8FE7F1 #x97F8) - (#x8FE7F2 #x97FA) - (#x8FE7F3 #x9807) - (#x8FE7F4 #x980A) - (#x8FE7F5 #x9819) - (#x8FE7F6 #x980D) - (#x8FE7F7 #x980E) - (#x8FE7F8 #x9814) - (#x8FE7F9 #x9816) - (#x8FE7FA #x981C) - (#x8FE7FB #x981E) - (#x8FE7FC #x9820) - (#x8FE7FD #x9823) - (#x8FE7FE #x9826) - (#x8FE8A1 #x982B) - (#x8FE8A2 #x982E) - (#x8FE8A3 #x982F) - (#x8FE8A4 #x9830) - (#x8FE8A5 #x9832) - (#x8FE8A6 #x9833) - (#x8FE8A7 #x9835) - (#x8FE8A8 #x9825) - (#x8FE8A9 #x983E) - (#x8FE8AA #x9844) - (#x8FE8AB #x9847) - (#x8FE8AC #x984A) - (#x8FE8AD #x9851) - (#x8FE8AE #x9852) - (#x8FE8AF #x9853) - (#x8FE8B0 #x9856) - (#x8FE8B1 #x9857) - (#x8FE8B2 #x9859) - (#x8FE8B3 #x985A) - (#x8FE8B4 #x9862) - (#x8FE8B5 #x9863) - (#x8FE8B6 #x9865) - (#x8FE8B7 #x9866) - (#x8FE8B8 #x986A) - (#x8FE8B9 #x986C) - (#x8FE8BA #x98AB) - (#x8FE8BB #x98AD) - (#x8FE8BC #x98AE) - (#x8FE8BD #x98B0) - (#x8FE8BE #x98B4) - (#x8FE8BF #x98B7) - (#x8FE8C0 #x98B8) - (#x8FE8C1 #x98BA) - (#x8FE8C2 #x98BB) - (#x8FE8C3 #x98BF) - (#x8FE8C4 #x98C2) - (#x8FE8C5 #x98C5) - (#x8FE8C6 #x98C8) - (#x8FE8C7 #x98CC) - (#x8FE8C8 #x98E1) - (#x8FE8C9 #x98E3) - (#x8FE8CA #x98E5) - (#x8FE8CB #x98E6) - (#x8FE8CC #x98E7) - (#x8FE8CD #x98EA) - (#x8FE8CE #x98F3) - (#x8FE8CF #x98F6) - (#x8FE8D0 #x9902) - (#x8FE8D1 #x9907) - (#x8FE8D2 #x9908) - (#x8FE8D3 #x9911) - (#x8FE8D4 #x9915) - (#x8FE8D5 #x9916) - (#x8FE8D6 #x9917) - (#x8FE8D7 #x991A) - (#x8FE8D8 #x991B) - (#x8FE8D9 #x991C) - (#x8FE8DA #x991F) - (#x8FE8DB #x9922) - (#x8FE8DC #x9926) - (#x8FE8DD #x9927) - (#x8FE8DE #x992B) - (#x8FE8DF #x9931) - (#x8FE8E0 #x9932) - (#x8FE8E1 #x9933) - (#x8FE8E2 #x9934) - (#x8FE8E3 #x9935) - (#x8FE8E4 #x9939) - (#x8FE8E5 #x993A) - (#x8FE8E6 #x993B) - (#x8FE8E7 #x993C) - (#x8FE8E8 #x9940) - (#x8FE8E9 #x9941) - (#x8FE8EA #x9946) - (#x8FE8EB #x9947) - (#x8FE8EC #x9948) - (#x8FE8ED #x994D) - (#x8FE8EE #x994E) - (#x8FE8EF #x9954) - (#x8FE8F0 #x9958) - (#x8FE8F1 #x9959) - (#x8FE8F2 #x995B) - (#x8FE8F3 #x995C) - (#x8FE8F4 #x995E) - (#x8FE8F5 #x995F) - (#x8FE8F6 #x9960) - (#x8FE8F7 #x999B) - (#x8FE8F8 #x999D) - (#x8FE8F9 #x999F) - (#x8FE8FA #x99A6) - (#x8FE8FB #x99B0) - (#x8FE8FC #x99B1) - (#x8FE8FD #x99B2) - (#x8FE8FE #x99B5) - (#x8FE9A1 #x99B9) - (#x8FE9A2 #x99BA) - (#x8FE9A3 #x99BD) - (#x8FE9A4 #x99BF) - (#x8FE9A5 #x99C3) - (#x8FE9A6 #x99C9) - (#x8FE9A7 #x99D3) - (#x8FE9A8 #x99D4) - (#x8FE9A9 #x99D9) - (#x8FE9AA #x99DA) - (#x8FE9AB #x99DC) - (#x8FE9AC #x99DE) - (#x8FE9AD #x99E7) - (#x8FE9AE #x99EA) - (#x8FE9AF #x99EB) - (#x8FE9B0 #x99EC) - (#x8FE9B1 #x99F0) - (#x8FE9B2 #x99F4) - (#x8FE9B3 #x99F5) - (#x8FE9B4 #x99F9) - (#x8FE9B5 #x99FD) - (#x8FE9B6 #x99FE) - (#x8FE9B7 #x9A02) - (#x8FE9B8 #x9A03) - (#x8FE9B9 #x9A04) - (#x8FE9BA #x9A0B) - (#x8FE9BB #x9A0C) - (#x8FE9BC #x9A10) - (#x8FE9BD #x9A11) - (#x8FE9BE #x9A16) - (#x8FE9BF #x9A1E) - (#x8FE9C0 #x9A20) - (#x8FE9C1 #x9A22) - (#x8FE9C2 #x9A23) - (#x8FE9C3 #x9A24) - (#x8FE9C4 #x9A27) - (#x8FE9C5 #x9A2D) - (#x8FE9C6 #x9A2E) - (#x8FE9C7 #x9A33) - (#x8FE9C8 #x9A35) - (#x8FE9C9 #x9A36) - (#x8FE9CA #x9A38) - (#x8FE9CB #x9A47) - (#x8FE9CC #x9A41) - (#x8FE9CD #x9A44) - (#x8FE9CE #x9A4A) - (#x8FE9CF #x9A4B) - (#x8FE9D0 #x9A4C) - (#x8FE9D1 #x9A4E) - (#x8FE9D2 #x9A51) - (#x8FE9D3 #x9A54) - (#x8FE9D4 #x9A56) - (#x8FE9D5 #x9A5D) - (#x8FE9D6 #x9AAA) - (#x8FE9D7 #x9AAC) - (#x8FE9D8 #x9AAE) - (#x8FE9D9 #x9AAF) - (#x8FE9DA #x9AB2) - (#x8FE9DB #x9AB4) - (#x8FE9DC #x9AB5) - (#x8FE9DD #x9AB6) - (#x8FE9DE #x9AB9) - (#x8FE9DF #x9ABB) - (#x8FE9E0 #x9ABE) - (#x8FE9E1 #x9ABF) - (#x8FE9E2 #x9AC1) - (#x8FE9E3 #x9AC3) - (#x8FE9E4 #x9AC6) - (#x8FE9E5 #x9AC8) - (#x8FE9E6 #x9ACE) - (#x8FE9E7 #x9AD0) - (#x8FE9E8 #x9AD2) - (#x8FE9E9 #x9AD5) - (#x8FE9EA #x9AD6) - (#x8FE9EB #x9AD7) - (#x8FE9EC #x9ADB) - (#x8FE9ED #x9ADC) - (#x8FE9EE #x9AE0) - (#x8FE9EF #x9AE4) - (#x8FE9F0 #x9AE5) - (#x8FE9F1 #x9AE7) - (#x8FE9F2 #x9AE9) - (#x8FE9F3 #x9AEC) - (#x8FE9F4 #x9AF2) - (#x8FE9F5 #x9AF3) - (#x8FE9F6 #x9AF5) - (#x8FE9F7 #x9AF9) - (#x8FE9F8 #x9AFA) - (#x8FE9F9 #x9AFD) - (#x8FE9FA #x9AFF) - (#x8FE9FB #x9B00) - (#x8FE9FC #x9B01) - (#x8FE9FD #x9B02) - (#x8FE9FE #x9B03) - (#x8FEAA1 #x9B04) - (#x8FEAA2 #x9B05) - (#x8FEAA3 #x9B08) - (#x8FEAA4 #x9B09) - (#x8FEAA5 #x9B0B) - (#x8FEAA6 #x9B0C) - (#x8FEAA7 #x9B0D) - (#x8FEAA8 #x9B0E) - (#x8FEAA9 #x9B10) - (#x8FEAAA #x9B12) - (#x8FEAAB #x9B16) - (#x8FEAAC #x9B19) - (#x8FEAAD #x9B1B) - (#x8FEAAE #x9B1C) - (#x8FEAAF #x9B20) - (#x8FEAB0 #x9B26) - (#x8FEAB1 #x9B2B) - (#x8FEAB2 #x9B2D) - (#x8FEAB3 #x9B33) - (#x8FEAB4 #x9B34) - (#x8FEAB5 #x9B35) - (#x8FEAB6 #x9B37) - (#x8FEAB7 #x9B39) - (#x8FEAB8 #x9B3A) - (#x8FEAB9 #x9B3D) - (#x8FEABA #x9B48) - (#x8FEABB #x9B4B) - (#x8FEABC #x9B4C) - (#x8FEABD #x9B55) - (#x8FEABE #x9B56) - (#x8FEABF #x9B57) - (#x8FEAC0 #x9B5B) - (#x8FEAC1 #x9B5E) - (#x8FEAC2 #x9B61) - (#x8FEAC3 #x9B63) - (#x8FEAC4 #x9B65) - (#x8FEAC5 #x9B66) - (#x8FEAC6 #x9B68) - (#x8FEAC7 #x9B6A) - (#x8FEAC8 #x9B6B) - (#x8FEAC9 #x9B6C) - (#x8FEACA #x9B6D) - (#x8FEACB #x9B6E) - (#x8FEACC #x9B73) - (#x8FEACD #x9B75) - (#x8FEACE #x9B77) - (#x8FEACF #x9B78) - (#x8FEAD0 #x9B79) - (#x8FEAD1 #x9B7F) - (#x8FEAD2 #x9B80) - (#x8FEAD3 #x9B84) - (#x8FEAD4 #x9B85) - (#x8FEAD5 #x9B86) - (#x8FEAD6 #x9B87) - (#x8FEAD7 #x9B89) - (#x8FEAD8 #x9B8A) - (#x8FEAD9 #x9B8B) - (#x8FEADA #x9B8D) - (#x8FEADB #x9B8F) - (#x8FEADC #x9B90) - (#x8FEADD #x9B94) - (#x8FEADE #x9B9A) - (#x8FEADF #x9B9D) - (#x8FEAE0 #x9B9E) - (#x8FEAE1 #x9BA6) - (#x8FEAE2 #x9BA7) - (#x8FEAE3 #x9BA9) - (#x8FEAE4 #x9BAC) - (#x8FEAE5 #x9BB0) - (#x8FEAE6 #x9BB1) - (#x8FEAE7 #x9BB2) - (#x8FEAE8 #x9BB7) - (#x8FEAE9 #x9BB8) - (#x8FEAEA #x9BBB) - (#x8FEAEB #x9BBC) - (#x8FEAEC #x9BBE) - (#x8FEAED #x9BBF) - (#x8FEAEE #x9BC1) - (#x8FEAEF #x9BC7) - (#x8FEAF0 #x9BC8) - (#x8FEAF1 #x9BCE) - (#x8FEAF2 #x9BD0) - (#x8FEAF3 #x9BD7) - (#x8FEAF4 #x9BD8) - (#x8FEAF5 #x9BDD) - (#x8FEAF6 #x9BDF) - (#x8FEAF7 #x9BE5) - (#x8FEAF8 #x9BE7) - (#x8FEAF9 #x9BEA) - (#x8FEAFA #x9BEB) - (#x8FEAFB #x9BEF) - (#x8FEAFC #x9BF3) - (#x8FEAFD #x9BF7) - (#x8FEAFE #x9BF8) - (#x8FEBA1 #x9BF9) - (#x8FEBA2 #x9BFA) - (#x8FEBA3 #x9BFD) - (#x8FEBA4 #x9BFF) - (#x8FEBA5 #x9C00) - (#x8FEBA6 #x9C02) - (#x8FEBA7 #x9C0B) - (#x8FEBA8 #x9C0F) - (#x8FEBA9 #x9C11) - (#x8FEBAA #x9C16) - (#x8FEBAB #x9C18) - (#x8FEBAC #x9C19) - (#x8FEBAD #x9C1A) - (#x8FEBAE #x9C1C) - (#x8FEBAF #x9C1E) - (#x8FEBB0 #x9C22) - (#x8FEBB1 #x9C23) - (#x8FEBB2 #x9C26) - (#x8FEBB3 #x9C27) - (#x8FEBB4 #x9C28) - (#x8FEBB5 #x9C29) - (#x8FEBB6 #x9C2A) - (#x8FEBB7 #x9C31) - (#x8FEBB8 #x9C35) - (#x8FEBB9 #x9C36) - (#x8FEBBA #x9C37) - (#x8FEBBB #x9C3D) - (#x8FEBBC #x9C41) - (#x8FEBBD #x9C43) - (#x8FEBBE #x9C44) - (#x8FEBBF #x9C45) - (#x8FEBC0 #x9C49) - (#x8FEBC1 #x9C4A) - (#x8FEBC2 #x9C4E) - (#x8FEBC3 #x9C4F) - (#x8FEBC4 #x9C50) - (#x8FEBC5 #x9C53) - (#x8FEBC6 #x9C54) - (#x8FEBC7 #x9C56) - (#x8FEBC8 #x9C58) - (#x8FEBC9 #x9C5B) - (#x8FEBCA #x9C5D) - (#x8FEBCB #x9C5E) - (#x8FEBCC #x9C5F) - (#x8FEBCD #x9C63) - (#x8FEBCE #x9C69) - (#x8FEBCF #x9C6A) - (#x8FEBD0 #x9C5C) - (#x8FEBD1 #x9C6B) - (#x8FEBD2 #x9C68) - (#x8FEBD3 #x9C6E) - (#x8FEBD4 #x9C70) - (#x8FEBD5 #x9C72) - (#x8FEBD6 #x9C75) - (#x8FEBD7 #x9C77) - (#x8FEBD8 #x9C7B) - (#x8FEBD9 #x9CE6) - (#x8FEBDA #x9CF2) - (#x8FEBDB #x9CF7) - (#x8FEBDC #x9CF9) - (#x8FEBDD #x9D0B) - (#x8FEBDE #x9D02) - (#x8FEBDF #x9D11) - (#x8FEBE0 #x9D17) - (#x8FEBE1 #x9D18) - (#x8FEBE2 #x9D1C) - (#x8FEBE3 #x9D1D) - (#x8FEBE4 #x9D1E) - (#x8FEBE5 #x9D2F) - (#x8FEBE6 #x9D30) - (#x8FEBE7 #x9D32) - (#x8FEBE8 #x9D33) - (#x8FEBE9 #x9D34) - (#x8FEBEA #x9D3A) - (#x8FEBEB #x9D3C) - (#x8FEBEC #x9D45) - (#x8FEBED #x9D3D) - (#x8FEBEE #x9D42) - (#x8FEBEF #x9D43) - (#x8FEBF0 #x9D47) - (#x8FEBF1 #x9D4A) - (#x8FEBF2 #x9D53) - (#x8FEBF3 #x9D54) - (#x8FEBF4 #x9D5F) - (#x8FEBF5 #x9D63) - (#x8FEBF6 #x9D62) - (#x8FEBF7 #x9D65) - (#x8FEBF8 #x9D69) - (#x8FEBF9 #x9D6A) - (#x8FEBFA #x9D6B) - (#x8FEBFB #x9D70) - (#x8FEBFC #x9D76) - (#x8FEBFD #x9D77) - (#x8FEBFE #x9D7B) - (#x8FECA1 #x9D7C) - (#x8FECA2 #x9D7E) - (#x8FECA3 #x9D83) - (#x8FECA4 #x9D84) - (#x8FECA5 #x9D86) - (#x8FECA6 #x9D8A) - (#x8FECA7 #x9D8D) - (#x8FECA8 #x9D8E) - (#x8FECA9 #x9D92) - (#x8FECAA #x9D93) - (#x8FECAB #x9D95) - (#x8FECAC #x9D96) - (#x8FECAD #x9D97) - (#x8FECAE #x9D98) - (#x8FECAF #x9DA1) - (#x8FECB0 #x9DAA) - (#x8FECB1 #x9DAC) - (#x8FECB2 #x9DAE) - (#x8FECB3 #x9DB1) - (#x8FECB4 #x9DB5) - (#x8FECB5 #x9DB9) - (#x8FECB6 #x9DBC) - (#x8FECB7 #x9DBF) - (#x8FECB8 #x9DC3) - (#x8FECB9 #x9DC7) - (#x8FECBA #x9DC9) - (#x8FECBB #x9DCA) - (#x8FECBC #x9DD4) - (#x8FECBD #x9DD5) - (#x8FECBE #x9DD6) - (#x8FECBF #x9DD7) - (#x8FECC0 #x9DDA) - (#x8FECC1 #x9DDE) - (#x8FECC2 #x9DDF) - (#x8FECC3 #x9DE0) - (#x8FECC4 #x9DE5) - (#x8FECC5 #x9DE7) - (#x8FECC6 #x9DE9) - (#x8FECC7 #x9DEB) - (#x8FECC8 #x9DEE) - (#x8FECC9 #x9DF0) - (#x8FECCA #x9DF3) - (#x8FECCB #x9DF4) - (#x8FECCC #x9DFE) - (#x8FECCD #x9E0A) - (#x8FECCE #x9E02) - (#x8FECCF #x9E07) - (#x8FECD0 #x9E0E) - (#x8FECD1 #x9E10) - (#x8FECD2 #x9E11) - (#x8FECD3 #x9E12) - (#x8FECD4 #x9E15) - (#x8FECD5 #x9E16) - (#x8FECD6 #x9E19) - (#x8FECD7 #x9E1C) - (#x8FECD8 #x9E1D) - (#x8FECD9 #x9E7A) - (#x8FECDA #x9E7B) - (#x8FECDB #x9E7C) - (#x8FECDC #x9E80) - (#x8FECDD #x9E82) - (#x8FECDE #x9E83) - (#x8FECDF #x9E84) - (#x8FECE0 #x9E85) - (#x8FECE1 #x9E87) - (#x8FECE2 #x9E8E) - (#x8FECE3 #x9E8F) - (#x8FECE4 #x9E96) - (#x8FECE5 #x9E98) - (#x8FECE6 #x9E9B) - (#x8FECE7 #x9E9E) - (#x8FECE8 #x9EA4) - (#x8FECE9 #x9EA8) - (#x8FECEA #x9EAC) - (#x8FECEB #x9EAE) - (#x8FECEC #x9EAF) - (#x8FECED #x9EB0) - (#x8FECEE #x9EB3) - (#x8FECEF #x9EB4) - (#x8FECF0 #x9EB5) - (#x8FECF1 #x9EC6) - (#x8FECF2 #x9EC8) - (#x8FECF3 #x9ECB) - (#x8FECF4 #x9ED5) - (#x8FECF5 #x9EDF) - (#x8FECF6 #x9EE4) - (#x8FECF7 #x9EE7) - (#x8FECF8 #x9EEC) - (#x8FECF9 #x9EED) - (#x8FECFA #x9EEE) - (#x8FECFB #x9EF0) - (#x8FECFC #x9EF1) - (#x8FECFD #x9EF2) - (#x8FECFE #x9EF5) - (#x8FEDA1 #x9EF8) - (#x8FEDA2 #x9EFF) - (#x8FEDA3 #x9F02) - (#x8FEDA4 #x9F03) - (#x8FEDA5 #x9F09) - (#x8FEDA6 #x9F0F) - (#x8FEDA7 #x9F10) - (#x8FEDA8 #x9F11) - (#x8FEDA9 #x9F12) - (#x8FEDAA #x9F14) - (#x8FEDAB #x9F16) - (#x8FEDAC #x9F17) - (#x8FEDAD #x9F19) - (#x8FEDAE #x9F1A) - (#x8FEDAF #x9F1B) - (#x8FEDB0 #x9F1F) - (#x8FEDB1 #x9F22) - (#x8FEDB2 #x9F26) - (#x8FEDB3 #x9F2A) - (#x8FEDB4 #x9F2B) - (#x8FEDB5 #x9F2F) - (#x8FEDB6 #x9F31) - (#x8FEDB7 #x9F32) - (#x8FEDB8 #x9F34) - (#x8FEDB9 #x9F37) - (#x8FEDBA #x9F39) - (#x8FEDBB #x9F3A) - (#x8FEDBC #x9F3C) - (#x8FEDBD #x9F3D) - (#x8FEDBE #x9F3F) - (#x8FEDBF #x9F41) - (#x8FEDC0 #x9F43) - (#x8FEDC1 #x9F44) - (#x8FEDC2 #x9F45) - (#x8FEDC3 #x9F46) - (#x8FEDC4 #x9F47) - (#x8FEDC5 #x9F53) - (#x8FEDC6 #x9F55) - (#x8FEDC7 #x9F56) - (#x8FEDC8 #x9F57) - (#x8FEDC9 #x9F58) - (#x8FEDCA #x9F5A) - (#x8FEDCB #x9F5D) - (#x8FEDCC #x9F5E) - (#x8FEDCD #x9F68) - (#x8FEDCE #x9F69) - (#x8FEDCF #x9F6D) - (#x8FEDD0 #x9F6E) - (#x8FEDD1 #x9F6F) - (#x8FEDD2 #x9F70) - (#x8FEDD3 #x9F71) - (#x8FEDD4 #x9F73) - (#x8FEDD5 #x9F75) - (#x8FEDD6 #x9F7A) - (#x8FEDD7 #x9F7D) - (#x8FEDD8 #x9F8F) - (#x8FEDD9 #x9F90) - (#x8FEDDA #x9F91) - (#x8FEDDB #x9F92) - (#x8FEDDC #x9F94) - (#x8FEDDD #x9F96) - (#x8FEDDE #x9F97) - (#x8FEDDF #x9F9E) - (#x8FEDE0 #x9FA1) - (#x8FEDE1 #x9FA2) - (#x8FEDE2 #x9FA3) - (#x8FEDE3 #x9FA5) - (#x8FF5A1 #xE3AC) - (#x8FF5A2 #xE3AD) - (#x8FF5A3 #xE3AE) - (#x8FF5A4 #xE3AF) - (#x8FF5A5 #xE3B0) - (#x8FF5A6 #xE3B1) - (#x8FF5A7 #xE3B2) - (#x8FF5A8 #xE3B3) - (#x8FF5A9 #xE3B4) - (#x8FF5AA #xE3B5) - (#x8FF5AB #xE3B6) - (#x8FF5AC #xE3B7) - (#x8FF5AD #xE3B8) - (#x8FF5AE #xE3B9) - (#x8FF5AF #xE3BA) - (#x8FF5B0 #xE3BB) - (#x8FF5B1 #xE3BC) - (#x8FF5B2 #xE3BD) - (#x8FF5B3 #xE3BE) - (#x8FF5B4 #xE3BF) - (#x8FF5B5 #xE3C0) - (#x8FF5B6 #xE3C1) - (#x8FF5B7 #xE3C2) - (#x8FF5B8 #xE3C3) - (#x8FF5B9 #xE3C4) - (#x8FF5BA #xE3C5) - (#x8FF5BB #xE3C6) - (#x8FF5BC #xE3C7) - (#x8FF5BD #xE3C8) - (#x8FF5BE #xE3C9) - (#x8FF5BF #xE3CA) - (#x8FF5C0 #xE3CB) - (#x8FF5C1 #xE3CC) - (#x8FF5C2 #xE3CD) - (#x8FF5C3 #xE3CE) - (#x8FF5C4 #xE3CF) - (#x8FF5C5 #xE3D0) - (#x8FF5C6 #xE3D1) - (#x8FF5C7 #xE3D2) - (#x8FF5C8 #xE3D3) - (#x8FF5C9 #xE3D4) - (#x8FF5CA #xE3D5) - (#x8FF5CB #xE3D6) - (#x8FF5CC #xE3D7) - (#x8FF5CD #xE3D8) - (#x8FF5CE #xE3D9) - (#x8FF5CF #xE3DA) - (#x8FF5D0 #xE3DB) - (#x8FF5D1 #xE3DC) - (#x8FF5D2 #xE3DD) - (#x8FF5D3 #xE3DE) - (#x8FF5D4 #xE3DF) - (#x8FF5D5 #xE3E0) - (#x8FF5D6 #xE3E1) - (#x8FF5D7 #xE3E2) - (#x8FF5D8 #xE3E3) - (#x8FF5D9 #xE3E4) - (#x8FF5DA #xE3E5) - (#x8FF5DB #xE3E6) - (#x8FF5DC #xE3E7) - (#x8FF5DD #xE3E8) - (#x8FF5DE #xE3E9) - (#x8FF5DF #xE3EA) - (#x8FF5E0 #xE3EB) - (#x8FF5E1 #xE3EC) - (#x8FF5E2 #xE3ED) - (#x8FF5E3 #xE3EE) - (#x8FF5E4 #xE3EF) - (#x8FF5E5 #xE3F0) - (#x8FF5E6 #xE3F1) - (#x8FF5E7 #xE3F2) - (#x8FF5E8 #xE3F3) - (#x8FF5E9 #xE3F4) - (#x8FF5EA #xE3F5) - (#x8FF5EB #xE3F6) - (#x8FF5EC #xE3F7) - (#x8FF5ED #xE3F8) - (#x8FF5EE #xE3F9) - (#x8FF5EF #xE3FA) - (#x8FF5F0 #xE3FB) - (#x8FF5F1 #xE3FC) - (#x8FF5F2 #xE3FD) - (#x8FF5F3 #xE3FE) - (#x8FF5F4 #xE3FF) - (#x8FF5F5 #xE400) - (#x8FF5F6 #xE401) - (#x8FF5F7 #xE402) - (#x8FF5F8 #xE403) - (#x8FF5F9 #xE404) - (#x8FF5FA #xE405) - (#x8FF5FB #xE406) - (#x8FF5FC #xE407) - (#x8FF5FD #xE408) - (#x8FF5FE #xE409) - (#x8FF6A1 #xE40A) - (#x8FF6A2 #xE40B) - (#x8FF6A3 #xE40C) - (#x8FF6A4 #xE40D) - (#x8FF6A5 #xE40E) - (#x8FF6A6 #xE40F) - (#x8FF6A7 #xE410) - (#x8FF6A8 #xE411) - (#x8FF6A9 #xE412) - (#x8FF6AA #xE413) - (#x8FF6AB #xE414) - (#x8FF6AC #xE415) - (#x8FF6AD #xE416) - (#x8FF6AE #xE417) - (#x8FF6AF #xE418) - (#x8FF6B0 #xE419) - (#x8FF6B1 #xE41A) - (#x8FF6B2 #xE41B) - (#x8FF6B3 #xE41C) - (#x8FF6B4 #xE41D) - (#x8FF6B5 #xE41E) - (#x8FF6B6 #xE41F) - (#x8FF6B7 #xE420) - (#x8FF6B8 #xE421) - (#x8FF6B9 #xE422) - (#x8FF6BA #xE423) - (#x8FF6BB #xE424) - (#x8FF6BC #xE425) - (#x8FF6BD #xE426) - (#x8FF6BE #xE427) - (#x8FF6BF #xE428) - (#x8FF6C0 #xE429) - (#x8FF6C1 #xE42A) - (#x8FF6C2 #xE42B) - (#x8FF6C3 #xE42C) - (#x8FF6C4 #xE42D) - (#x8FF6C5 #xE42E) - (#x8FF6C6 #xE42F) - (#x8FF6C7 #xE430) - (#x8FF6C8 #xE431) - (#x8FF6C9 #xE432) - (#x8FF6CA #xE433) - (#x8FF6CB #xE434) - (#x8FF6CC #xE435) - (#x8FF6CD #xE436) - (#x8FF6CE #xE437) - (#x8FF6CF #xE438) - (#x8FF6D0 #xE439) - (#x8FF6D1 #xE43A) - (#x8FF6D2 #xE43B) - (#x8FF6D3 #xE43C) - (#x8FF6D4 #xE43D) - (#x8FF6D5 #xE43E) - (#x8FF6D6 #xE43F) - (#x8FF6D7 #xE440) - (#x8FF6D8 #xE441) - (#x8FF6D9 #xE442) - (#x8FF6DA #xE443) - (#x8FF6DB #xE444) - (#x8FF6DC #xE445) - (#x8FF6DD #xE446) - (#x8FF6DE #xE447) - (#x8FF6DF #xE448) - (#x8FF6E0 #xE449) - (#x8FF6E1 #xE44A) - (#x8FF6E2 #xE44B) - (#x8FF6E3 #xE44C) - (#x8FF6E4 #xE44D) - (#x8FF6E5 #xE44E) - (#x8FF6E6 #xE44F) - (#x8FF6E7 #xE450) - (#x8FF6E8 #xE451) - (#x8FF6E9 #xE452) - (#x8FF6EA #xE453) - (#x8FF6EB #xE454) - (#x8FF6EC #xE455) - (#x8FF6ED #xE456) - (#x8FF6EE #xE457) - (#x8FF6EF #xE458) - (#x8FF6F0 #xE459) - (#x8FF6F1 #xE45A) - (#x8FF6F2 #xE45B) - (#x8FF6F3 #xE45C) - (#x8FF6F4 #xE45D) - (#x8FF6F5 #xE45E) - (#x8FF6F6 #xE45F) - (#x8FF6F7 #xE460) - (#x8FF6F8 #xE461) - (#x8FF6F9 #xE462) - (#x8FF6FA #xE463) - (#x8FF6FB #xE464) - (#x8FF6FC #xE465) - (#x8FF6FD #xE466) - (#x8FF6FE #xE467) - (#x8FF7A1 #xE468) - (#x8FF7A2 #xE469) - (#x8FF7A3 #xE46A) - (#x8FF7A4 #xE46B) - (#x8FF7A5 #xE46C) - (#x8FF7A6 #xE46D) - (#x8FF7A7 #xE46E) - (#x8FF7A8 #xE46F) - (#x8FF7A9 #xE470) - (#x8FF7AA #xE471) - (#x8FF7AB #xE472) - (#x8FF7AC #xE473) - (#x8FF7AD #xE474) - (#x8FF7AE #xE475) - (#x8FF7AF #xE476) - (#x8FF7B0 #xE477) - (#x8FF7B1 #xE478) - (#x8FF7B2 #xE479) - (#x8FF7B3 #xE47A) - (#x8FF7B4 #xE47B) - (#x8FF7B5 #xE47C) - (#x8FF7B6 #xE47D) - (#x8FF7B7 #xE47E) - (#x8FF7B8 #xE47F) - (#x8FF7B9 #xE480) - (#x8FF7BA #xE481) - (#x8FF7BB #xE482) - (#x8FF7BC #xE483) - (#x8FF7BD #xE484) - (#x8FF7BE #xE485) - (#x8FF7BF #xE486) - (#x8FF7C0 #xE487) - (#x8FF7C1 #xE488) - (#x8FF7C2 #xE489) - (#x8FF7C3 #xE48A) - (#x8FF7C4 #xE48B) - (#x8FF7C5 #xE48C) - (#x8FF7C6 #xE48D) - (#x8FF7C7 #xE48E) - (#x8FF7C8 #xE48F) - (#x8FF7C9 #xE490) - (#x8FF7CA #xE491) - (#x8FF7CB #xE492) - (#x8FF7CC #xE493) - (#x8FF7CD #xE494) - (#x8FF7CE #xE495) - (#x8FF7CF #xE496) - (#x8FF7D0 #xE497) - (#x8FF7D1 #xE498) - (#x8FF7D2 #xE499) - (#x8FF7D3 #xE49A) - (#x8FF7D4 #xE49B) - (#x8FF7D5 #xE49C) - (#x8FF7D6 #xE49D) - (#x8FF7D7 #xE49E) - (#x8FF7D8 #xE49F) - (#x8FF7D9 #xE4A0) - (#x8FF7DA #xE4A1) - (#x8FF7DB #xE4A2) - (#x8FF7DC #xE4A3) - (#x8FF7DD #xE4A4) - (#x8FF7DE #xE4A5) - (#x8FF7DF #xE4A6) - (#x8FF7E0 #xE4A7) - (#x8FF7E1 #xE4A8) - (#x8FF7E2 #xE4A9) - (#x8FF7E3 #xE4AA) - (#x8FF7E4 #xE4AB) - (#x8FF7E5 #xE4AC) - (#x8FF7E6 #xE4AD) - (#x8FF7E7 #xE4AE) - (#x8FF7E8 #xE4AF) - (#x8FF7E9 #xE4B0) - (#x8FF7EA #xE4B1) - (#x8FF7EB #xE4B2) - (#x8FF7EC #xE4B3) - (#x8FF7ED #xE4B4) - (#x8FF7EE #xE4B5) - (#x8FF7EF #xE4B6) - (#x8FF7F0 #xE4B7) - (#x8FF7F1 #xE4B8) - (#x8FF7F2 #xE4B9) - (#x8FF7F3 #xE4BA) - (#x8FF7F4 #xE4BB) - (#x8FF7F5 #xE4BC) - (#x8FF7F6 #xE4BD) - (#x8FF7F7 #xE4BE) - (#x8FF7F8 #xE4BF) - (#x8FF7F9 #xE4C0) - (#x8FF7FA #xE4C1) - (#x8FF7FB #xE4C2) - (#x8FF7FC #xE4C3) - (#x8FF7FD #xE4C4) - (#x8FF7FE #xE4C5) - (#x8FF8A1 #xE4C6) - (#x8FF8A2 #xE4C7) - (#x8FF8A3 #xE4C8) - (#x8FF8A4 #xE4C9) - (#x8FF8A5 #xE4CA) - (#x8FF8A6 #xE4CB) - (#x8FF8A7 #xE4CC) - (#x8FF8A8 #xE4CD) - (#x8FF8A9 #xE4CE) - (#x8FF8AA #xE4CF) - (#x8FF8AB #xE4D0) - (#x8FF8AC #xE4D1) - (#x8FF8AD #xE4D2) - (#x8FF8AE #xE4D3) - (#x8FF8AF #xE4D4) - (#x8FF8B0 #xE4D5) - (#x8FF8B1 #xE4D6) - (#x8FF8B2 #xE4D7) - (#x8FF8B3 #xE4D8) - (#x8FF8B4 #xE4D9) - (#x8FF8B5 #xE4DA) - (#x8FF8B6 #xE4DB) - (#x8FF8B7 #xE4DC) - (#x8FF8B8 #xE4DD) - (#x8FF8B9 #xE4DE) - (#x8FF8BA #xE4DF) - (#x8FF8BB #xE4E0) - (#x8FF8BC #xE4E1) - (#x8FF8BD #xE4E2) - (#x8FF8BE #xE4E3) - (#x8FF8BF #xE4E4) - (#x8FF8C0 #xE4E5) - (#x8FF8C1 #xE4E6) - (#x8FF8C2 #xE4E7) - (#x8FF8C3 #xE4E8) - (#x8FF8C4 #xE4E9) - (#x8FF8C5 #xE4EA) - (#x8FF8C6 #xE4EB) - (#x8FF8C7 #xE4EC) - (#x8FF8C8 #xE4ED) - (#x8FF8C9 #xE4EE) - (#x8FF8CA #xE4EF) - (#x8FF8CB #xE4F0) - (#x8FF8CC #xE4F1) - (#x8FF8CD #xE4F2) - (#x8FF8CE #xE4F3) - (#x8FF8CF #xE4F4) - (#x8FF8D0 #xE4F5) - (#x8FF8D1 #xE4F6) - (#x8FF8D2 #xE4F7) - (#x8FF8D3 #xE4F8) - (#x8FF8D4 #xE4F9) - (#x8FF8D5 #xE4FA) - (#x8FF8D6 #xE4FB) - (#x8FF8D7 #xE4FC) - (#x8FF8D8 #xE4FD) - (#x8FF8D9 #xE4FE) - (#x8FF8DA #xE4FF) - (#x8FF8DB #xE500) - (#x8FF8DC #xE501) - (#x8FF8DD #xE502) - (#x8FF8DE #xE503) - (#x8FF8DF #xE504) - (#x8FF8E0 #xE505) - (#x8FF8E1 #xE506) - (#x8FF8E2 #xE507) - (#x8FF8E3 #xE508) - (#x8FF8E4 #xE509) - (#x8FF8E5 #xE50A) - (#x8FF8E6 #xE50B) - (#x8FF8E7 #xE50C) - (#x8FF8E8 #xE50D) - (#x8FF8E9 #xE50E) - (#x8FF8EA #xE50F) - (#x8FF8EB #xE510) - (#x8FF8EC #xE511) - (#x8FF8ED #xE512) - (#x8FF8EE #xE513) - (#x8FF8EF #xE514) - (#x8FF8F0 #xE515) - (#x8FF8F1 #xE516) - (#x8FF8F2 #xE517) - (#x8FF8F3 #xE518) - (#x8FF8F4 #xE519) - (#x8FF8F5 #xE51A) - (#x8FF8F6 #xE51B) - (#x8FF8F7 #xE51C) - (#x8FF8F8 #xE51D) - (#x8FF8F9 #xE51E) - (#x8FF8FA #xE51F) - (#x8FF8FB #xE520) - (#x8FF8FC #xE521) - (#x8FF8FD #xE522) - (#x8FF8FE #xE523) - (#x8FF9A1 #xE524) - (#x8FF9A2 #xE525) - (#x8FF9A3 #xE526) - (#x8FF9A4 #xE527) - (#x8FF9A5 #xE528) - (#x8FF9A6 #xE529) - (#x8FF9A7 #xE52A) - (#x8FF9A8 #xE52B) - (#x8FF9A9 #xE52C) - (#x8FF9AA #xE52D) - (#x8FF9AB #xE52E) - (#x8FF9AC #xE52F) - (#x8FF9AD #xE530) - (#x8FF9AE #xE531) - (#x8FF9AF #xE532) - (#x8FF9B0 #xE533) - (#x8FF9B1 #xE534) - (#x8FF9B2 #xE535) - (#x8FF9B3 #xE536) - (#x8FF9B4 #xE537) - (#x8FF9B5 #xE538) - (#x8FF9B6 #xE539) - (#x8FF9B7 #xE53A) - (#x8FF9B8 #xE53B) - (#x8FF9B9 #xE53C) - (#x8FF9BA #xE53D) - (#x8FF9BB #xE53E) - (#x8FF9BC #xE53F) - (#x8FF9BD #xE540) - (#x8FF9BE #xE541) - (#x8FF9BF #xE542) - (#x8FF9C0 #xE543) - (#x8FF9C1 #xE544) - (#x8FF9C2 #xE545) - (#x8FF9C3 #xE546) - (#x8FF9C4 #xE547) - (#x8FF9C5 #xE548) - (#x8FF9C6 #xE549) - (#x8FF9C7 #xE54A) - (#x8FF9C8 #xE54B) - (#x8FF9C9 #xE54C) - (#x8FF9CA #xE54D) - (#x8FF9CB #xE54E) - (#x8FF9CC #xE54F) - (#x8FF9CD #xE550) - (#x8FF9CE #xE551) - (#x8FF9CF #xE552) - (#x8FF9D0 #xE553) - (#x8FF9D1 #xE554) - (#x8FF9D2 #xE555) - (#x8FF9D3 #xE556) - (#x8FF9D4 #xE557) - (#x8FF9D5 #xE558) - (#x8FF9D6 #xE559) - (#x8FF9D7 #xE55A) - (#x8FF9D8 #xE55B) - (#x8FF9D9 #xE55C) - (#x8FF9DA #xE55D) - (#x8FF9DB #xE55E) - (#x8FF9DC #xE55F) - (#x8FF9DD #xE560) - (#x8FF9DE #xE561) - (#x8FF9DF #xE562) - (#x8FF9E0 #xE563) - (#x8FF9E1 #xE564) - (#x8FF9E2 #xE565) - (#x8FF9E3 #xE566) - (#x8FF9E4 #xE567) - (#x8FF9E5 #xE568) - (#x8FF9E6 #xE569) - (#x8FF9E7 #xE56A) - (#x8FF9E8 #xE56B) - (#x8FF9E9 #xE56C) - (#x8FF9EA #xE56D) - (#x8FF9EB #xE56E) - (#x8FF9EC #xE56F) - (#x8FF9ED #xE570) - (#x8FF9EE #xE571) - (#x8FF9EF #xE572) - (#x8FF9F0 #xE573) - (#x8FF9F1 #xE574) - (#x8FF9F2 #xE575) - (#x8FF9F3 #xE576) - (#x8FF9F4 #xE577) - (#x8FF9F5 #xE578) - (#x8FF9F6 #xE579) - (#x8FF9F7 #xE57A) - (#x8FF9F8 #xE57B) - (#x8FF9F9 #xE57C) - (#x8FF9FA #xE57D) - (#x8FF9FB #xE57E) - (#x8FF9FC #xE57F) - (#x8FF9FD #xE580) - (#x8FF9FE #xE581) - (#x8FFAA1 #xE582) - (#x8FFAA2 #xE583) - (#x8FFAA3 #xE584) - (#x8FFAA4 #xE585) - (#x8FFAA5 #xE586) - (#x8FFAA6 #xE587) - (#x8FFAA7 #xE588) - (#x8FFAA8 #xE589) - (#x8FFAA9 #xE58A) - (#x8FFAAA #xE58B) - (#x8FFAAB #xE58C) - (#x8FFAAC #xE58D) - (#x8FFAAD #xE58E) - (#x8FFAAE #xE58F) - (#x8FFAAF #xE590) - (#x8FFAB0 #xE591) - (#x8FFAB1 #xE592) - (#x8FFAB2 #xE593) - (#x8FFAB3 #xE594) - (#x8FFAB4 #xE595) - (#x8FFAB5 #xE596) - (#x8FFAB6 #xE597) - (#x8FFAB7 #xE598) - (#x8FFAB8 #xE599) - (#x8FFAB9 #xE59A) - (#x8FFABA #xE59B) - (#x8FFABB #xE59C) - (#x8FFABC #xE59D) - (#x8FFABD #xE59E) - (#x8FFABE #xE59F) - (#x8FFABF #xE5A0) - (#x8FFAC0 #xE5A1) - (#x8FFAC1 #xE5A2) - (#x8FFAC2 #xE5A3) - (#x8FFAC3 #xE5A4) - (#x8FFAC4 #xE5A5) - (#x8FFAC5 #xE5A6) - (#x8FFAC6 #xE5A7) - (#x8FFAC7 #xE5A8) - (#x8FFAC8 #xE5A9) - (#x8FFAC9 #xE5AA) - (#x8FFACA #xE5AB) - (#x8FFACB #xE5AC) - (#x8FFACC #xE5AD) - (#x8FFACD #xE5AE) - (#x8FFACE #xE5AF) - (#x8FFACF #xE5B0) - (#x8FFAD0 #xE5B1) - (#x8FFAD1 #xE5B2) - (#x8FFAD2 #xE5B3) - (#x8FFAD3 #xE5B4) - (#x8FFAD4 #xE5B5) - (#x8FFAD5 #xE5B6) - (#x8FFAD6 #xE5B7) - (#x8FFAD7 #xE5B8) - (#x8FFAD8 #xE5B9) - (#x8FFAD9 #xE5BA) - (#x8FFADA #xE5BB) - (#x8FFADB #xE5BC) - (#x8FFADC #xE5BD) - (#x8FFADD #xE5BE) - (#x8FFADE #xE5BF) - (#x8FFADF #xE5C0) - (#x8FFAE0 #xE5C1) - (#x8FFAE1 #xE5C2) - (#x8FFAE2 #xE5C3) - (#x8FFAE3 #xE5C4) - (#x8FFAE4 #xE5C5) - (#x8FFAE5 #xE5C6) - (#x8FFAE6 #xE5C7) - (#x8FFAE7 #xE5C8) - (#x8FFAE8 #xE5C9) - (#x8FFAE9 #xE5CA) - (#x8FFAEA #xE5CB) - (#x8FFAEB #xE5CC) - (#x8FFAEC #xE5CD) - (#x8FFAED #xE5CE) - (#x8FFAEE #xE5CF) - (#x8FFAEF #xE5D0) - (#x8FFAF0 #xE5D1) - (#x8FFAF1 #xE5D2) - (#x8FFAF2 #xE5D3) - (#x8FFAF3 #xE5D4) - (#x8FFAF4 #xE5D5) - (#x8FFAF5 #xE5D6) - (#x8FFAF6 #xE5D7) - (#x8FFAF7 #xE5D8) - (#x8FFAF8 #xE5D9) - (#x8FFAF9 #xE5DA) - (#x8FFAFA #xE5DB) - (#x8FFAFB #xE5DC) - (#x8FFAFC #xE5DD) - (#x8FFAFD #xE5DE) - (#x8FFAFE #xE5DF) - (#x8FFBA1 #xE5E0) - (#x8FFBA2 #xE5E1) - (#x8FFBA3 #xE5E2) - (#x8FFBA4 #xE5E3) - (#x8FFBA5 #xE5E4) - (#x8FFBA6 #xE5E5) - (#x8FFBA7 #xE5E6) - (#x8FFBA8 #xE5E7) - (#x8FFBA9 #xE5E8) - (#x8FFBAA #xE5E9) - (#x8FFBAB #xE5EA) - (#x8FFBAC #xE5EB) - (#x8FFBAD #xE5EC) - (#x8FFBAE #xE5ED) - (#x8FFBAF #xE5EE) - (#x8FFBB0 #xE5EF) - (#x8FFBB1 #xE5F0) - (#x8FFBB2 #xE5F1) - (#x8FFBB3 #xE5F2) - (#x8FFBB4 #xE5F3) - (#x8FFBB5 #xE5F4) - (#x8FFBB6 #xE5F5) - (#x8FFBB7 #xE5F6) - (#x8FFBB8 #xE5F7) - (#x8FFBB9 #xE5F8) - (#x8FFBBA #xE5F9) - (#x8FFBBB #xE5FA) - (#x8FFBBC #xE5FB) - (#x8FFBBD #xE5FC) - (#x8FFBBE #xE5FD) - (#x8FFBBF #xE5FE) - (#x8FFBC0 #xE5FF) - (#x8FFBC1 #xE600) - (#x8FFBC2 #xE601) - (#x8FFBC3 #xE602) - (#x8FFBC4 #xE603) - (#x8FFBC5 #xE604) - (#x8FFBC6 #xE605) - (#x8FFBC7 #xE606) - (#x8FFBC8 #xE607) - (#x8FFBC9 #xE608) - (#x8FFBCA #xE609) - (#x8FFBCB #xE60A) - (#x8FFBCC #xE60B) - (#x8FFBCD #xE60C) - (#x8FFBCE #xE60D) - (#x8FFBCF #xE60E) - (#x8FFBD0 #xE60F) - (#x8FFBD1 #xE610) - (#x8FFBD2 #xE611) - (#x8FFBD3 #xE612) - (#x8FFBD4 #xE613) - (#x8FFBD5 #xE614) - (#x8FFBD6 #xE615) - (#x8FFBD7 #xE616) - (#x8FFBD8 #xE617) - (#x8FFBD9 #xE618) - (#x8FFBDA #xE619) - (#x8FFBDB #xE61A) - (#x8FFBDC #xE61B) - (#x8FFBDD #xE61C) - (#x8FFBDE #xE61D) - (#x8FFBDF #xE61E) - (#x8FFBE0 #xE61F) - (#x8FFBE1 #xE620) - (#x8FFBE2 #xE621) - (#x8FFBE3 #xE622) - (#x8FFBE4 #xE623) - (#x8FFBE5 #xE624) - (#x8FFBE6 #xE625) - (#x8FFBE7 #xE626) - (#x8FFBE8 #xE627) - (#x8FFBE9 #xE628) - (#x8FFBEA #xE629) - (#x8FFBEB #xE62A) - (#x8FFBEC #xE62B) - (#x8FFBED #xE62C) - (#x8FFBEE #xE62D) - (#x8FFBEF #xE62E) - (#x8FFBF0 #xE62F) - (#x8FFBF1 #xE630) - (#x8FFBF2 #xE631) - (#x8FFBF3 #xE632) - (#x8FFBF4 #xE633) - (#x8FFBF5 #xE634) - (#x8FFBF6 #xE635) - (#x8FFBF7 #xE636) - (#x8FFBF8 #xE637) - (#x8FFBF9 #xE638) - (#x8FFBFA #xE639) - (#x8FFBFB #xE63A) - (#x8FFBFC #xE63B) - (#x8FFBFD #xE63C) - (#x8FFBFE #xE63D) - (#x8FFCA1 #xE63E) - (#x8FFCA2 #xE63F) - (#x8FFCA3 #xE640) - (#x8FFCA4 #xE641) - (#x8FFCA5 #xE642) - (#x8FFCA6 #xE643) - (#x8FFCA7 #xE644) - (#x8FFCA8 #xE645) - (#x8FFCA9 #xE646) - (#x8FFCAA #xE647) - (#x8FFCAB #xE648) - (#x8FFCAC #xE649) - (#x8FFCAD #xE64A) - (#x8FFCAE #xE64B) - (#x8FFCAF #xE64C) - (#x8FFCB0 #xE64D) - (#x8FFCB1 #xE64E) - (#x8FFCB2 #xE64F) - (#x8FFCB3 #xE650) - (#x8FFCB4 #xE651) - (#x8FFCB5 #xE652) - (#x8FFCB6 #xE653) - (#x8FFCB7 #xE654) - (#x8FFCB8 #xE655) - (#x8FFCB9 #xE656) - (#x8FFCBA #xE657) - (#x8FFCBB #xE658) - (#x8FFCBC #xE659) - (#x8FFCBD #xE65A) - (#x8FFCBE #xE65B) - (#x8FFCBF #xE65C) - (#x8FFCC0 #xE65D) - (#x8FFCC1 #xE65E) - (#x8FFCC2 #xE65F) - (#x8FFCC3 #xE660) - (#x8FFCC4 #xE661) - (#x8FFCC5 #xE662) - (#x8FFCC6 #xE663) - (#x8FFCC7 #xE664) - (#x8FFCC8 #xE665) - (#x8FFCC9 #xE666) - (#x8FFCCA #xE667) - (#x8FFCCB #xE668) - (#x8FFCCC #xE669) - (#x8FFCCD #xE66A) - (#x8FFCCE #xE66B) - (#x8FFCCF #xE66C) - (#x8FFCD0 #xE66D) - (#x8FFCD1 #xE66E) - (#x8FFCD2 #xE66F) - (#x8FFCD3 #xE670) - (#x8FFCD4 #xE671) - (#x8FFCD5 #xE672) - (#x8FFCD6 #xE673) - (#x8FFCD7 #xE674) - (#x8FFCD8 #xE675) - (#x8FFCD9 #xE676) - (#x8FFCDA #xE677) - (#x8FFCDB #xE678) - (#x8FFCDC #xE679) - (#x8FFCDD #xE67A) - (#x8FFCDE #xE67B) - (#x8FFCDF #xE67C) - (#x8FFCE0 #xE67D) - (#x8FFCE1 #xE67E) - (#x8FFCE2 #xE67F) - (#x8FFCE3 #xE680) - (#x8FFCE4 #xE681) - (#x8FFCE5 #xE682) - (#x8FFCE6 #xE683) - (#x8FFCE7 #xE684) - (#x8FFCE8 #xE685) - (#x8FFCE9 #xE686) - (#x8FFCEA #xE687) - (#x8FFCEB #xE688) - (#x8FFCEC #xE689) - (#x8FFCED #xE68A) - (#x8FFCEE #xE68B) - (#x8FFCEF #xE68C) - (#x8FFCF0 #xE68D) - (#x8FFCF1 #xE68E) - (#x8FFCF2 #xE68F) - (#x8FFCF3 #xE690) - (#x8FFCF4 #xE691) - (#x8FFCF5 #xE692) - (#x8FFCF6 #xE693) - (#x8FFCF7 #xE694) - (#x8FFCF8 #xE695) - (#x8FFCF9 #xE696) - (#x8FFCFA #xE697) - (#x8FFCFB #xE698) - (#x8FFCFC #xE699) - (#x8FFCFD #xE69A) - (#x8FFCFE #xE69B) - (#x8FFDA1 #xE69C) - (#x8FFDA2 #xE69D) - (#x8FFDA3 #xE69E) - (#x8FFDA4 #xE69F) - (#x8FFDA5 #xE6A0) - (#x8FFDA6 #xE6A1) - (#x8FFDA7 #xE6A2) - (#x8FFDA8 #xE6A3) - (#x8FFDA9 #xE6A4) - (#x8FFDAA #xE6A5) - (#x8FFDAB #xE6A6) - (#x8FFDAC #xE6A7) - (#x8FFDAD #xE6A8) - (#x8FFDAE #xE6A9) - (#x8FFDAF #xE6AA) - (#x8FFDB0 #xE6AB) - (#x8FFDB1 #xE6AC) - (#x8FFDB2 #xE6AD) - (#x8FFDB3 #xE6AE) - (#x8FFDB4 #xE6AF) - (#x8FFDB5 #xE6B0) - (#x8FFDB6 #xE6B1) - (#x8FFDB7 #xE6B2) - (#x8FFDB8 #xE6B3) - (#x8FFDB9 #xE6B4) - (#x8FFDBA #xE6B5) - (#x8FFDBB #xE6B6) - (#x8FFDBC #xE6B7) - (#x8FFDBD #xE6B8) - (#x8FFDBE #xE6B9) - (#x8FFDBF #xE6BA) - (#x8FFDC0 #xE6BB) - (#x8FFDC1 #xE6BC) - (#x8FFDC2 #xE6BD) - (#x8FFDC3 #xE6BE) - (#x8FFDC4 #xE6BF) - (#x8FFDC5 #xE6C0) - (#x8FFDC6 #xE6C1) - (#x8FFDC7 #xE6C2) - (#x8FFDC8 #xE6C3) - (#x8FFDC9 #xE6C4) - (#x8FFDCA #xE6C5) - (#x8FFDCB #xE6C6) - (#x8FFDCC #xE6C7) - (#x8FFDCD #xE6C8) - (#x8FFDCE #xE6C9) - (#x8FFDCF #xE6CA) - (#x8FFDD0 #xE6CB) - (#x8FFDD1 #xE6CC) - (#x8FFDD2 #xE6CD) - (#x8FFDD3 #xE6CE) - (#x8FFDD4 #xE6CF) - (#x8FFDD5 #xE6D0) - (#x8FFDD6 #xE6D1) - (#x8FFDD7 #xE6D2) - (#x8FFDD8 #xE6D3) - (#x8FFDD9 #xE6D4) - (#x8FFDDA #xE6D5) - (#x8FFDDB #xE6D6) - (#x8FFDDC #xE6D7) - (#x8FFDDD #xE6D8) - (#x8FFDDE #xE6D9) - (#x8FFDDF #xE6DA) - (#x8FFDE0 #xE6DB) - (#x8FFDE1 #xE6DC) - (#x8FFDE2 #xE6DD) - (#x8FFDE3 #xE6DE) - (#x8FFDE4 #xE6DF) - (#x8FFDE5 #xE6E0) - (#x8FFDE6 #xE6E1) - (#x8FFDE7 #xE6E2) - (#x8FFDE8 #xE6E3) - (#x8FFDE9 #xE6E4) - (#x8FFDEA #xE6E5) - (#x8FFDEB #xE6E6) - (#x8FFDEC #xE6E7) - (#x8FFDED #xE6E8) - (#x8FFDEE #xE6E9) - (#x8FFDEF #xE6EA) - (#x8FFDF0 #xE6EB) - (#x8FFDF1 #xE6EC) - (#x8FFDF2 #xE6ED) - (#x8FFDF3 #xE6EE) - (#x8FFDF4 #xE6EF) - (#x8FFDF5 #xE6F0) - (#x8FFDF6 #xE6F1) - (#x8FFDF7 #xE6F2) - (#x8FFDF8 #xE6F3) - (#x8FFDF9 #xE6F4) - (#x8FFDFA #xE6F5) - (#x8FFDFB #xE6F6) - (#x8FFDFC #xE6F7) - (#x8FFDFD #xE6F8) - (#x8FFDFE #xE6F9) - (#x8FFEA1 #xE6FA) - (#x8FFEA2 #xE6FB) - (#x8FFEA3 #xE6FC) - (#x8FFEA4 #xE6FD) - (#x8FFEA5 #xE6FE) - (#x8FFEA6 #xE6FF) - (#x8FFEA7 #xE700) - (#x8FFEA8 #xE701) - (#x8FFEA9 #xE702) - (#x8FFEAA #xE703) - (#x8FFEAB #xE704) - (#x8FFEAC #xE705) - (#x8FFEAD #xE706) - (#x8FFEAE #xE707) - (#x8FFEAF #xE708) - (#x8FFEB0 #xE709) - (#x8FFEB1 #xE70A) - (#x8FFEB2 #xE70B) - (#x8FFEB3 #xE70C) - (#x8FFEB4 #xE70D) - (#x8FFEB5 #xE70E) - (#x8FFEB6 #xE70F) - (#x8FFEB7 #xE710) - (#x8FFEB8 #xE711) - (#x8FFEB9 #xE712) - (#x8FFEBA #xE713) - (#x8FFEBB #xE714) - (#x8FFEBC #xE715) - (#x8FFEBD #xE716) - (#x8FFEBE #xE717) - (#x8FFEBF #xE718) - (#x8FFEC0 #xE719) - (#x8FFEC1 #xE71A) - (#x8FFEC2 #xE71B) - (#x8FFEC3 #xE71C) - (#x8FFEC4 #xE71D) - (#x8FFEC5 #xE71E) - (#x8FFEC6 #xE71F) - (#x8FFEC7 #xE720) - (#x8FFEC8 #xE721) - (#x8FFEC9 #xE722) - (#x8FFECA #xE723) - (#x8FFECB #xE724) - (#x8FFECC #xE725) - (#x8FFECD #xE726) - (#x8FFECE #xE727) - (#x8FFECF #xE728) - (#x8FFED0 #xE729) - (#x8FFED1 #xE72A) - (#x8FFED2 #xE72B) - (#x8FFED3 #xE72C) - (#x8FFED4 #xE72D) - (#x8FFED5 #xE72E) - (#x8FFED6 #xE72F) - (#x8FFED7 #xE730) - (#x8FFED8 #xE731) - (#x8FFED9 #xE732) - (#x8FFEDA #xE733) - (#x8FFEDB #xE734) - (#x8FFEDC #xE735) - (#x8FFEDD #xE736) - (#x8FFEDE #xE737) - (#x8FFEDF #xE738) - (#x8FFEE0 #xE739) - (#x8FFEE1 #xE73A) - (#x8FFEE2 #xE73B) - (#x8FFEE3 #xE73C) - (#x8FFEE4 #xE73D) - (#x8FFEE5 #xE73E) - (#x8FFEE6 #xE73F) - (#x8FFEE7 #xE740) - (#x8FFEE8 #xE741) - (#x8FFEE9 #xE742) - (#x8FFEEA #xE743) - (#x8FFEEB #xE744) - (#x8FFEEC #xE745) - (#x8FFEED #xE746) - (#x8FFEEE #xE747) - (#x8FFEEF #xE748) - (#x8FFEF0 #xE749) - (#x8FFEF1 #xE74A) - (#x8FFEF2 #xE74B) - (#x8FFEF3 #xE74C) - (#x8FFEF4 #xE74D) - (#x8FFEF5 #xE74E) - (#x8FFEF6 #xE74F) - (#x8FFEF7 #xE750) - (#x8FFEF8 #xE751) - (#x8FFEF9 #xE752) - (#x8FFEFA #xE753) - (#x8FFEFB #xE754) - (#x8FFEFC #xE755) - (#x8FFEFD #xE756) - (#x8FFEFE #xE757) - (#xA1A1 #x3000) - (#xA1A2 #x3001) - (#xA1A3 #x3002) - (#xA1A4 #xFF0C) - (#xA1A5 #xFF0E) - (#xA1A6 #x30FB) - (#xA1A7 #xFF1A) - (#xA1A8 #xFF1B) - (#xA1A9 #xFF1F) - (#xA1AA #xFF01) - (#xA1AB #x309B) - (#xA1AC #x309C) - (#xA1AD #xB4) - (#xA1AE #xFF40) - (#xA1AF #xA8) - (#xA1B0 #xFF3E) - (#xA1B1 #xFFE3) - (#xA1B2 #xFF3F) - (#xA1B3 #x30FD) - (#xA1B4 #x30FE) - (#xA1B5 #x309D) - (#xA1B6 #x309E) - (#xA1B7 #x3003) - (#xA1B8 #x4EDD) - (#xA1B9 #x3005) - (#xA1BA #x3006) - (#xA1BB #x3007) - (#xA1BC #x30FC) - (#xA1BD #x2015) - (#xA1BE #x2010) - (#xA1BF #xFF0F) - (#xA1C0 #xFF3C) - (#xA1C1 #x301C) - (#xA1C2 #x2016) - (#xA1C3 #xFF5C) - (#xA1C4 #x2026) - (#xA1C5 #x2025) - (#xA1C6 #x2018) - (#xA1C7 #x2019) - (#xA1C8 #x201C) - (#xA1C9 #x201D) - (#xA1CA #xFF08) - (#xA1CB #xFF09) - (#xA1CC #x3014) - (#xA1CD #x3015) - (#xA1CE #xFF3B) - (#xA1CF #xFF3D) - (#xA1D0 #xFF5B) - (#xA1D1 #xFF5D) - (#xA1D2 #x3008) - (#xA1D3 #x3009) - (#xA1D4 #x300A) - (#xA1D5 #x300B) - (#xA1D6 #x300C) - (#xA1D7 #x300D) - (#xA1D8 #x300E) - (#xA1D9 #x300F) - (#xA1DA #x3010) - (#xA1DB #x3011) - (#xA1DC #xFF0B) - (#xA1DD #x2212) - (#xA1DE #xB1) - (#xA1DF #xD7) - (#xA1E0 #xF7) - (#xA1E1 #xFF1D) - (#xA1E2 #x2260) - (#xA1E3 #xFF1C) - (#xA1E4 #xFF1E) - (#xA1E5 #x2266) - (#xA1E6 #x2267) - (#xA1E7 #x221E) - (#xA1E8 #x2234) - (#xA1E9 #x2642) - (#xA1EA #x2640) - (#xA1EB #xB0) - (#xA1EC #x2032) - (#xA1ED #x2033) - (#xA1EE #x2103) - (#xA1EF #xFFE5) - (#xA1F0 #xFF04) - (#xA1F1 #xA2) - (#xA1F2 #xA3) - (#xA1F3 #xFF05) - (#xA1F4 #xFF03) - (#xA1F5 #xFF06) - (#xA1F6 #xFF0A) - (#xA1F7 #xFF20) - (#xA1F8 #xA7) - (#xA1F9 #x2606) - (#xA1FA #x2605) - (#xA1FB #x25CB) - (#xA1FC #x25CF) - (#xA1FD #x25CE) - (#xA1FE #x25C7) - (#xA2A1 #x25C6) - (#xA2A2 #x25A1) - (#xA2A3 #x25A0) - (#xA2A4 #x25B3) - (#xA2A5 #x25B2) - (#xA2A6 #x25BD) - (#xA2A7 #x25BC) - (#xA2A8 #x203B) - (#xA2A9 #x3012) - (#xA2AA #x2192) - (#xA2AB #x2190) - (#xA2AC #x2191) - (#xA2AD #x2193) - (#xA2AE #x3013) - (#xA2BA #x2208) - (#xA2BB #x220B) - (#xA2BC #x2286) - (#xA2BD #x2287) - (#xA2BE #x2282) - (#xA2BF #x2283) - (#xA2C0 #x222A) - (#xA2C1 #x2229) - (#xA2CA #x2227) - (#xA2CB #x2228) - (#xA2CC #xAC) - (#xA2CD #x21D2) - (#xA2CE #x21D4) - (#xA2CF #x2200) - (#xA2D0 #x2203) - (#xA2DC #x2220) - (#xA2DD #x22A5) - (#xA2DE #x2312) - (#xA2DF #x2202) - (#xA2E0 #x2207) - (#xA2E1 #x2261) - (#xA2E2 #x2252) - (#xA2E3 #x226A) - (#xA2E4 #x226B) - (#xA2E5 #x221A) - (#xA2E6 #x223D) - (#xA2E7 #x221D) - (#xA2E8 #x2235) - (#xA2E9 #x222B) - (#xA2EA #x222C) - (#xA2F2 #x212B) - (#xA2F3 #x2030) - (#xA2F4 #x266F) - (#xA2F5 #x266D) - (#xA2F6 #x266A) - (#xA2F7 #x2020) - (#xA2F8 #x2021) - (#xA2F9 #xB6) - (#xA2FE #x25EF) - (#xA3B0 #xFF10) - (#xA3B1 #xFF11) - (#xA3B2 #xFF12) - (#xA3B3 #xFF13) - (#xA3B4 #xFF14) - (#xA3B5 #xFF15) - (#xA3B6 #xFF16) - (#xA3B7 #xFF17) - (#xA3B8 #xFF18) - (#xA3B9 #xFF19) - (#xA3C1 #xFF21) - (#xA3C2 #xFF22) - (#xA3C3 #xFF23) - (#xA3C4 #xFF24) - (#xA3C5 #xFF25) - (#xA3C6 #xFF26) - (#xA3C7 #xFF27) - (#xA3C8 #xFF28) - (#xA3C9 #xFF29) - (#xA3CA #xFF2A) - (#xA3CB #xFF2B) - (#xA3CC #xFF2C) - (#xA3CD #xFF2D) - (#xA3CE #xFF2E) - (#xA3CF #xFF2F) - (#xA3D0 #xFF30) - (#xA3D1 #xFF31) - (#xA3D2 #xFF32) - (#xA3D3 #xFF33) - (#xA3D4 #xFF34) - (#xA3D5 #xFF35) - (#xA3D6 #xFF36) - (#xA3D7 #xFF37) - (#xA3D8 #xFF38) - (#xA3D9 #xFF39) - (#xA3DA #xFF3A) - (#xA3E1 #xFF41) - (#xA3E2 #xFF42) - (#xA3E3 #xFF43) - (#xA3E4 #xFF44) - (#xA3E5 #xFF45) - (#xA3E6 #xFF46) - (#xA3E7 #xFF47) - (#xA3E8 #xFF48) - (#xA3E9 #xFF49) - (#xA3EA #xFF4A) - (#xA3EB #xFF4B) - (#xA3EC #xFF4C) - (#xA3ED #xFF4D) - (#xA3EE #xFF4E) - (#xA3EF #xFF4F) - (#xA3F0 #xFF50) - (#xA3F1 #xFF51) - (#xA3F2 #xFF52) - (#xA3F3 #xFF53) - (#xA3F4 #xFF54) - (#xA3F5 #xFF55) - (#xA3F6 #xFF56) - (#xA3F7 #xFF57) - (#xA3F8 #xFF58) - (#xA3F9 #xFF59) - (#xA3FA #xFF5A) - (#xA4A1 #x3041) - (#xA4A2 #x3042) - (#xA4A3 #x3043) - (#xA4A4 #x3044) - (#xA4A5 #x3045) - (#xA4A6 #x3046) - (#xA4A7 #x3047) - (#xA4A8 #x3048) - (#xA4A9 #x3049) - (#xA4AA #x304A) - (#xA4AB #x304B) - (#xA4AC #x304C) - (#xA4AD #x304D) - (#xA4AE #x304E) - (#xA4AF #x304F) - (#xA4B0 #x3050) - (#xA4B1 #x3051) - (#xA4B2 #x3052) - (#xA4B3 #x3053) - (#xA4B4 #x3054) - (#xA4B5 #x3055) - (#xA4B6 #x3056) - (#xA4B7 #x3057) - (#xA4B8 #x3058) - (#xA4B9 #x3059) - (#xA4BA #x305A) - (#xA4BB #x305B) - (#xA4BC #x305C) - (#xA4BD #x305D) - (#xA4BE #x305E) - (#xA4BF #x305F) - (#xA4C0 #x3060) - (#xA4C1 #x3061) - (#xA4C2 #x3062) - (#xA4C3 #x3063) - (#xA4C4 #x3064) - (#xA4C5 #x3065) - (#xA4C6 #x3066) - (#xA4C7 #x3067) - (#xA4C8 #x3068) - (#xA4C9 #x3069) - (#xA4CA #x306A) - (#xA4CB #x306B) - (#xA4CC #x306C) - (#xA4CD #x306D) - (#xA4CE #x306E) - (#xA4CF #x306F) - (#xA4D0 #x3070) - (#xA4D1 #x3071) - (#xA4D2 #x3072) - (#xA4D3 #x3073) - (#xA4D4 #x3074) - (#xA4D5 #x3075) - (#xA4D6 #x3076) - (#xA4D7 #x3077) - (#xA4D8 #x3078) - (#xA4D9 #x3079) - (#xA4DA #x307A) - (#xA4DB #x307B) - (#xA4DC #x307C) - (#xA4DD #x307D) - (#xA4DE #x307E) - (#xA4DF #x307F) - (#xA4E0 #x3080) - (#xA4E1 #x3081) - (#xA4E2 #x3082) - (#xA4E3 #x3083) - (#xA4E4 #x3084) - (#xA4E5 #x3085) - (#xA4E6 #x3086) - (#xA4E7 #x3087) - (#xA4E8 #x3088) - (#xA4E9 #x3089) - (#xA4EA #x308A) - (#xA4EB #x308B) - (#xA4EC #x308C) - (#xA4ED #x308D) - (#xA4EE #x308E) - (#xA4EF #x308F) - (#xA4F0 #x3090) - (#xA4F1 #x3091) - (#xA4F2 #x3092) - (#xA4F3 #x3093) - (#xA5A1 #x30A1) - (#xA5A2 #x30A2) - (#xA5A3 #x30A3) - (#xA5A4 #x30A4) - (#xA5A5 #x30A5) - (#xA5A6 #x30A6) - (#xA5A7 #x30A7) - (#xA5A8 #x30A8) - (#xA5A9 #x30A9) - (#xA5AA #x30AA) - (#xA5AB #x30AB) - (#xA5AC #x30AC) - (#xA5AD #x30AD) - (#xA5AE #x30AE) - (#xA5AF #x30AF) - (#xA5B0 #x30B0) - (#xA5B1 #x30B1) - (#xA5B2 #x30B2) - (#xA5B3 #x30B3) - (#xA5B4 #x30B4) - (#xA5B5 #x30B5) - (#xA5B6 #x30B6) - (#xA5B7 #x30B7) - (#xA5B8 #x30B8) - (#xA5B9 #x30B9) - (#xA5BA #x30BA) - (#xA5BB #x30BB) - (#xA5BC #x30BC) - (#xA5BD #x30BD) - (#xA5BE #x30BE) - (#xA5BF #x30BF) - (#xA5C0 #x30C0) - (#xA5C1 #x30C1) - (#xA5C2 #x30C2) - (#xA5C3 #x30C3) - (#xA5C4 #x30C4) - (#xA5C5 #x30C5) - (#xA5C6 #x30C6) - (#xA5C7 #x30C7) - (#xA5C8 #x30C8) - (#xA5C9 #x30C9) - (#xA5CA #x30CA) - (#xA5CB #x30CB) - (#xA5CC #x30CC) - (#xA5CD #x30CD) - (#xA5CE #x30CE) - (#xA5CF #x30CF) - (#xA5D0 #x30D0) - (#xA5D1 #x30D1) - (#xA5D2 #x30D2) - (#xA5D3 #x30D3) - (#xA5D4 #x30D4) - (#xA5D5 #x30D5) - (#xA5D6 #x30D6) - (#xA5D7 #x30D7) - (#xA5D8 #x30D8) - (#xA5D9 #x30D9) - (#xA5DA #x30DA) - (#xA5DB #x30DB) - (#xA5DC #x30DC) - (#xA5DD #x30DD) - (#xA5DE #x30DE) - (#xA5DF #x30DF) - (#xA5E0 #x30E0) - (#xA5E1 #x30E1) - (#xA5E2 #x30E2) - (#xA5E3 #x30E3) - (#xA5E4 #x30E4) - (#xA5E5 #x30E5) - (#xA5E6 #x30E6) - (#xA5E7 #x30E7) - (#xA5E8 #x30E8) - (#xA5E9 #x30E9) - (#xA5EA #x30EA) - (#xA5EB #x30EB) - (#xA5EC #x30EC) - (#xA5ED #x30ED) - (#xA5EE #x30EE) - (#xA5EF #x30EF) - (#xA5F0 #x30F0) - (#xA5F1 #x30F1) - (#xA5F2 #x30F2) - (#xA5F3 #x30F3) - (#xA5F4 #x30F4) - (#xA5F5 #x30F5) - (#xA5F6 #x30F6) - (#xA6A1 #x391) - (#xA6A2 #x392) - (#xA6A3 #x393) - (#xA6A4 #x394) - (#xA6A5 #x395) - (#xA6A6 #x396) - (#xA6A7 #x397) - (#xA6A8 #x398) - (#xA6A9 #x399) - (#xA6AA #x39A) - (#xA6AB #x39B) - (#xA6AC #x39C) - (#xA6AD #x39D) - (#xA6AE #x39E) - (#xA6AF #x39F) - (#xA6B0 #x3A0) - (#xA6B1 #x3A1) - (#xA6B2 #x3A3) - (#xA6B3 #x3A4) - (#xA6B4 #x3A5) - (#xA6B5 #x3A6) - (#xA6B6 #x3A7) - (#xA6B7 #x3A8) - (#xA6B8 #x3A9) - (#xA6C1 #x3B1) - (#xA6C2 #x3B2) - (#xA6C3 #x3B3) - (#xA6C4 #x3B4) - (#xA6C5 #x3B5) - (#xA6C6 #x3B6) - (#xA6C7 #x3B7) - (#xA6C8 #x3B8) - (#xA6C9 #x3B9) - (#xA6CA #x3BA) - (#xA6CB #x3BB) - (#xA6CC #x3BC) - (#xA6CD #x3BD) - (#xA6CE #x3BE) - (#xA6CF #x3BF) - (#xA6D0 #x3C0) - (#xA6D1 #x3C1) - (#xA6D2 #x3C3) - (#xA6D3 #x3C4) - (#xA6D4 #x3C5) - (#xA6D5 #x3C6) - (#xA6D6 #x3C7) - (#xA6D7 #x3C8) - (#xA6D8 #x3C9) - (#xA7A1 #x410) - (#xA7A2 #x411) - (#xA7A3 #x412) - (#xA7A4 #x413) - (#xA7A5 #x414) - (#xA7A6 #x415) - (#xA7A7 #x401) - (#xA7A8 #x416) - (#xA7A9 #x417) - (#xA7AA #x418) - (#xA7AB #x419) - (#xA7AC #x41A) - (#xA7AD #x41B) - (#xA7AE #x41C) - (#xA7AF #x41D) - (#xA7B0 #x41E) - (#xA7B1 #x41F) - (#xA7B2 #x420) - (#xA7B3 #x421) - (#xA7B4 #x422) - (#xA7B5 #x423) - (#xA7B6 #x424) - (#xA7B7 #x425) - (#xA7B8 #x426) - (#xA7B9 #x427) - (#xA7BA #x428) - (#xA7BB #x429) - (#xA7BC #x42A) - (#xA7BD #x42B) - (#xA7BE #x42C) - (#xA7BF #x42D) - (#xA7C0 #x42E) - (#xA7C1 #x42F) - (#xA7D1 #x430) - (#xA7D2 #x431) - (#xA7D3 #x432) - (#xA7D4 #x433) - (#xA7D5 #x434) - (#xA7D6 #x435) - (#xA7D7 #x451) - (#xA7D8 #x436) - (#xA7D9 #x437) - (#xA7DA #x438) - (#xA7DB #x439) - (#xA7DC #x43A) - (#xA7DD #x43B) - (#xA7DE #x43C) - (#xA7DF #x43D) - (#xA7E0 #x43E) - (#xA7E1 #x43F) - (#xA7E2 #x440) - (#xA7E3 #x441) - (#xA7E4 #x442) - (#xA7E5 #x443) - (#xA7E6 #x444) - (#xA7E7 #x445) - (#xA7E8 #x446) - (#xA7E9 #x447) - (#xA7EA #x448) - (#xA7EB #x449) - (#xA7EC #x44A) - (#xA7ED #x44B) - (#xA7EE #x44C) - (#xA7EF #x44D) - (#xA7F0 #x44E) - (#xA7F1 #x44F) - (#xA8A1 #x2500) - (#xA8A2 #x2502) - (#xA8A3 #x250C) - (#xA8A4 #x2510) - (#xA8A5 #x2518) - (#xA8A6 #x2514) - (#xA8A7 #x251C) - (#xA8A8 #x252C) - (#xA8A9 #x2524) - (#xA8AA #x2534) - (#xA8AB #x253C) - (#xA8AC #x2501) - (#xA8AD #x2503) - (#xA8AE #x250F) - (#xA8AF #x2513) - (#xA8B0 #x251B) - (#xA8B1 #x2517) - (#xA8B2 #x2523) - (#xA8B3 #x2533) - (#xA8B4 #x252B) - (#xA8B5 #x253B) - (#xA8B6 #x254B) - (#xA8B7 #x2520) - (#xA8B8 #x252F) - (#xA8B9 #x2528) - (#xA8BA #x2537) - (#xA8BB #x253F) - (#xA8BC #x251D) - (#xA8BD #x2530) - (#xA8BE #x2525) - (#xA8BF #x2538) - (#xA8C0 #x2542) - (#xB0A1 #x4E9C) - (#xB0A2 #x5516) - (#xB0A3 #x5A03) - (#xB0A4 #x963F) - (#xB0A5 #x54C0) - (#xB0A6 #x611B) - (#xB0A7 #x6328) - (#xB0A8 #x59F6) - (#xB0A9 #x9022) - (#xB0AA #x8475) - (#xB0AB #x831C) - (#xB0AC #x7A50) - (#xB0AD #x60AA) - (#xB0AE #x63E1) - (#xB0AF #x6E25) - (#xB0B0 #x65ED) - (#xB0B1 #x8466) - (#xB0B2 #x82A6) - (#xB0B3 #x9BF5) - (#xB0B4 #x6893) - (#xB0B5 #x5727) - (#xB0B6 #x65A1) - (#xB0B7 #x6271) - (#xB0B8 #x5B9B) - (#xB0B9 #x59D0) - (#xB0BA #x867B) - (#xB0BB #x98F4) - (#xB0BC #x7D62) - (#xB0BD #x7DBE) - (#xB0BE #x9B8E) - (#xB0BF #x6216) - (#xB0C0 #x7C9F) - (#xB0C1 #x88B7) - (#xB0C2 #x5B89) - (#xB0C3 #x5EB5) - (#xB0C4 #x6309) - (#xB0C5 #x6697) - (#xB0C6 #x6848) - (#xB0C7 #x95C7) - (#xB0C8 #x978D) - (#xB0C9 #x674F) - (#xB0CA #x4EE5) - (#xB0CB #x4F0A) - (#xB0CC #x4F4D) - (#xB0CD #x4F9D) - (#xB0CE #x5049) - (#xB0CF #x56F2) - (#xB0D0 #x5937) - (#xB0D1 #x59D4) - (#xB0D2 #x5A01) - (#xB0D3 #x5C09) - (#xB0D4 #x60DF) - (#xB0D5 #x610F) - (#xB0D6 #x6170) - (#xB0D7 #x6613) - (#xB0D8 #x6905) - (#xB0D9 #x70BA) - (#xB0DA #x754F) - (#xB0DB #x7570) - (#xB0DC #x79FB) - (#xB0DD #x7DAD) - (#xB0DE #x7DEF) - (#xB0DF #x80C3) - (#xB0E0 #x840E) - (#xB0E1 #x8863) - (#xB0E2 #x8B02) - (#xB0E3 #x9055) - (#xB0E4 #x907A) - (#xB0E5 #x533B) - (#xB0E6 #x4E95) - (#xB0E7 #x4EA5) - (#xB0E8 #x57DF) - (#xB0E9 #x80B2) - (#xB0EA #x90C1) - (#xB0EB #x78EF) - (#xB0EC #x4E00) - (#xB0ED #x58F1) - (#xB0EE #x6EA2) - (#xB0EF #x9038) - (#xB0F0 #x7A32) - (#xB0F1 #x8328) - (#xB0F2 #x828B) - (#xB0F3 #x9C2F) - (#xB0F4 #x5141) - (#xB0F5 #x5370) - (#xB0F6 #x54BD) - (#xB0F7 #x54E1) - (#xB0F8 #x56E0) - (#xB0F9 #x59FB) - (#xB0FA #x5F15) - (#xB0FB #x98F2) - (#xB0FC #x6DEB) - (#xB0FD #x80E4) - (#xB0FE #x852D) - (#xB1A1 #x9662) - (#xB1A2 #x9670) - (#xB1A3 #x96A0) - (#xB1A4 #x97FB) - (#xB1A5 #x540B) - (#xB1A6 #x53F3) - (#xB1A7 #x5B87) - (#xB1A8 #x70CF) - (#xB1A9 #x7FBD) - (#xB1AA #x8FC2) - (#xB1AB #x96E8) - (#xB1AC #x536F) - (#xB1AD #x9D5C) - (#xB1AE #x7ABA) - (#xB1AF #x4E11) - (#xB1B0 #x7893) - (#xB1B1 #x81FC) - (#xB1B2 #x6E26) - (#xB1B3 #x5618) - (#xB1B4 #x5504) - (#xB1B5 #x6B1D) - (#xB1B6 #x851A) - (#xB1B7 #x9C3B) - (#xB1B8 #x59E5) - (#xB1B9 #x53A9) - (#xB1BA #x6D66) - (#xB1BB #x74DC) - (#xB1BC #x958F) - (#xB1BD #x5642) - (#xB1BE #x4E91) - (#xB1BF #x904B) - (#xB1C0 #x96F2) - (#xB1C1 #x834F) - (#xB1C2 #x990C) - (#xB1C3 #x53E1) - (#xB1C4 #x55B6) - (#xB1C5 #x5B30) - (#xB1C6 #x5F71) - (#xB1C7 #x6620) - (#xB1C8 #x66F3) - (#xB1C9 #x6804) - (#xB1CA #x6C38) - (#xB1CB #x6CF3) - (#xB1CC #x6D29) - (#xB1CD #x745B) - (#xB1CE #x76C8) - (#xB1CF #x7A4E) - (#xB1D0 #x9834) - (#xB1D1 #x82F1) - (#xB1D2 #x885B) - (#xB1D3 #x8A60) - (#xB1D4 #x92ED) - (#xB1D5 #x6DB2) - (#xB1D6 #x75AB) - (#xB1D7 #x76CA) - (#xB1D8 #x99C5) - (#xB1D9 #x60A6) - (#xB1DA #x8B01) - (#xB1DB #x8D8A) - (#xB1DC #x95B2) - (#xB1DD #x698E) - (#xB1DE #x53AD) - (#xB1DF #x5186) - (#xB1E0 #x5712) - (#xB1E1 #x5830) - (#xB1E2 #x5944) - (#xB1E3 #x5BB4) - (#xB1E4 #x5EF6) - (#xB1E5 #x6028) - (#xB1E6 #x63A9) - (#xB1E7 #x63F4) - (#xB1E8 #x6CBF) - (#xB1E9 #x6F14) - (#xB1EA #x708E) - (#xB1EB #x7114) - (#xB1EC #x7159) - (#xB1ED #x71D5) - (#xB1EE #x733F) - (#xB1EF #x7E01) - (#xB1F0 #x8276) - (#xB1F1 #x82D1) - (#xB1F2 #x8597) - (#xB1F3 #x9060) - (#xB1F4 #x925B) - (#xB1F5 #x9D1B) - (#xB1F6 #x5869) - (#xB1F7 #x65BC) - (#xB1F8 #x6C5A) - (#xB1F9 #x7525) - (#xB1FA #x51F9) - (#xB1FB #x592E) - (#xB1FC #x5965) - (#xB1FD #x5F80) - (#xB1FE #x5FDC) - (#xB2A1 #x62BC) - (#xB2A2 #x65FA) - (#xB2A3 #x6A2A) - (#xB2A4 #x6B27) - (#xB2A5 #x6BB4) - (#xB2A6 #x738B) - (#xB2A7 #x7FC1) - (#xB2A8 #x8956) - (#xB2A9 #x9D2C) - (#xB2AA #x9D0E) - (#xB2AB #x9EC4) - (#xB2AC #x5CA1) - (#xB2AD #x6C96) - (#xB2AE #x837B) - (#xB2AF #x5104) - (#xB2B0 #x5C4B) - (#xB2B1 #x61B6) - (#xB2B2 #x81C6) - (#xB2B3 #x6876) - (#xB2B4 #x7261) - (#xB2B5 #x4E59) - (#xB2B6 #x4FFA) - (#xB2B7 #x5378) - (#xB2B8 #x6069) - (#xB2B9 #x6E29) - (#xB2BA #x7A4F) - (#xB2BB #x97F3) - (#xB2BC #x4E0B) - (#xB2BD #x5316) - (#xB2BE #x4EEE) - (#xB2BF #x4F55) - (#xB2C0 #x4F3D) - (#xB2C1 #x4FA1) - (#xB2C2 #x4F73) - (#xB2C3 #x52A0) - (#xB2C4 #x53EF) - (#xB2C5 #x5609) - (#xB2C6 #x590F) - (#xB2C7 #x5AC1) - (#xB2C8 #x5BB6) - (#xB2C9 #x5BE1) - (#xB2CA #x79D1) - (#xB2CB #x6687) - (#xB2CC #x679C) - (#xB2CD #x67B6) - (#xB2CE #x6B4C) - (#xB2CF #x6CB3) - (#xB2D0 #x706B) - (#xB2D1 #x73C2) - (#xB2D2 #x798D) - (#xB2D3 #x79BE) - (#xB2D4 #x7A3C) - (#xB2D5 #x7B87) - (#xB2D6 #x82B1) - (#xB2D7 #x82DB) - (#xB2D8 #x8304) - (#xB2D9 #x8377) - (#xB2DA #x83EF) - (#xB2DB #x83D3) - (#xB2DC #x8766) - (#xB2DD #x8AB2) - (#xB2DE #x5629) - (#xB2DF #x8CA8) - (#xB2E0 #x8FE6) - (#xB2E1 #x904E) - (#xB2E2 #x971E) - (#xB2E3 #x868A) - (#xB2E4 #x4FC4) - (#xB2E5 #x5CE8) - (#xB2E6 #x6211) - (#xB2E7 #x7259) - (#xB2E8 #x753B) - (#xB2E9 #x81E5) - (#xB2EA #x82BD) - (#xB2EB #x86FE) - (#xB2EC #x8CC0) - (#xB2ED #x96C5) - (#xB2EE #x9913) - (#xB2EF #x99D5) - (#xB2F0 #x4ECB) - (#xB2F1 #x4F1A) - (#xB2F2 #x89E3) - (#xB2F3 #x56DE) - (#xB2F4 #x584A) - (#xB2F5 #x58CA) - (#xB2F6 #x5EFB) - (#xB2F7 #x5FEB) - (#xB2F8 #x602A) - (#xB2F9 #x6094) - (#xB2FA #x6062) - (#xB2FB #x61D0) - (#xB2FC #x6212) - (#xB2FD #x62D0) - (#xB2FE #x6539) - (#xB3A1 #x9B41) - (#xB3A2 #x6666) - (#xB3A3 #x68B0) - (#xB3A4 #x6D77) - (#xB3A5 #x7070) - (#xB3A6 #x754C) - (#xB3A7 #x7686) - (#xB3A8 #x7D75) - (#xB3A9 #x82A5) - (#xB3AA #x87F9) - (#xB3AB #x958B) - (#xB3AC #x968E) - (#xB3AD #x8C9D) - (#xB3AE #x51F1) - (#xB3AF #x52BE) - (#xB3B0 #x5916) - (#xB3B1 #x54B3) - (#xB3B2 #x5BB3) - (#xB3B3 #x5D16) - (#xB3B4 #x6168) - (#xB3B5 #x6982) - (#xB3B6 #x6DAF) - (#xB3B7 #x788D) - (#xB3B8 #x84CB) - (#xB3B9 #x8857) - (#xB3BA #x8A72) - (#xB3BB #x93A7) - (#xB3BC #x9AB8) - (#xB3BD #x6D6C) - (#xB3BE #x99A8) - (#xB3BF #x86D9) - (#xB3C0 #x57A3) - (#xB3C1 #x67FF) - (#xB3C2 #x86CE) - (#xB3C3 #x920E) - (#xB3C4 #x5283) - (#xB3C5 #x5687) - (#xB3C6 #x5404) - (#xB3C7 #x5ED3) - (#xB3C8 #x62E1) - (#xB3C9 #x64B9) - (#xB3CA #x683C) - (#xB3CB #x6838) - (#xB3CC #x6BBB) - (#xB3CD #x7372) - (#xB3CE #x78BA) - (#xB3CF #x7A6B) - (#xB3D0 #x899A) - (#xB3D1 #x89D2) - (#xB3D2 #x8D6B) - (#xB3D3 #x8F03) - (#xB3D4 #x90ED) - (#xB3D5 #x95A3) - (#xB3D6 #x9694) - (#xB3D7 #x9769) - (#xB3D8 #x5B66) - (#xB3D9 #x5CB3) - (#xB3DA #x697D) - (#xB3DB #x984D) - (#xB3DC #x984E) - (#xB3DD #x639B) - (#xB3DE #x7B20) - (#xB3DF #x6A2B) - (#xB3E0 #x6A7F) - (#xB3E1 #x68B6) - (#xB3E2 #x9C0D) - (#xB3E3 #x6F5F) - (#xB3E4 #x5272) - (#xB3E5 #x559D) - (#xB3E6 #x6070) - (#xB3E7 #x62EC) - (#xB3E8 #x6D3B) - (#xB3E9 #x6E07) - (#xB3EA #x6ED1) - (#xB3EB #x845B) - (#xB3EC #x8910) - (#xB3ED #x8F44) - (#xB3EE #x4E14) - (#xB3EF #x9C39) - (#xB3F0 #x53F6) - (#xB3F1 #x691B) - (#xB3F2 #x6A3A) - (#xB3F3 #x9784) - (#xB3F4 #x682A) - (#xB3F5 #x515C) - (#xB3F6 #x7AC3) - (#xB3F7 #x84B2) - (#xB3F8 #x91DC) - (#xB3F9 #x938C) - (#xB3FA #x565B) - (#xB3FB #x9D28) - (#xB3FC #x6822) - (#xB3FD #x8305) - (#xB3FE #x8431) - (#xB4A1 #x7CA5) - (#xB4A2 #x5208) - (#xB4A3 #x82C5) - (#xB4A4 #x74E6) - (#xB4A5 #x4E7E) - (#xB4A6 #x4F83) - (#xB4A7 #x51A0) - (#xB4A8 #x5BD2) - (#xB4A9 #x520A) - (#xB4AA #x52D8) - (#xB4AB #x52E7) - (#xB4AC #x5DFB) - (#xB4AD #x559A) - (#xB4AE #x582A) - (#xB4AF #x59E6) - (#xB4B0 #x5B8C) - (#xB4B1 #x5B98) - (#xB4B2 #x5BDB) - (#xB4B3 #x5E72) - (#xB4B4 #x5E79) - (#xB4B5 #x60A3) - (#xB4B6 #x611F) - (#xB4B7 #x6163) - (#xB4B8 #x61BE) - (#xB4B9 #x63DB) - (#xB4BA #x6562) - (#xB4BB #x67D1) - (#xB4BC #x6853) - (#xB4BD #x68FA) - (#xB4BE #x6B3E) - (#xB4BF #x6B53) - (#xB4C0 #x6C57) - (#xB4C1 #x6F22) - (#xB4C2 #x6F97) - (#xB4C3 #x6F45) - (#xB4C4 #x74B0) - (#xB4C5 #x7518) - (#xB4C6 #x76E3) - (#xB4C7 #x770B) - (#xB4C8 #x7AFF) - (#xB4C9 #x7BA1) - (#xB4CA #x7C21) - (#xB4CB #x7DE9) - (#xB4CC #x7F36) - (#xB4CD #x7FF0) - (#xB4CE #x809D) - (#xB4CF #x8266) - (#xB4D0 #x839E) - (#xB4D1 #x89B3) - (#xB4D2 #x8ACC) - (#xB4D3 #x8CAB) - (#xB4D4 #x9084) - (#xB4D5 #x9451) - (#xB4D6 #x9593) - (#xB4D7 #x9591) - (#xB4D8 #x95A2) - (#xB4D9 #x9665) - (#xB4DA #x97D3) - (#xB4DB #x9928) - (#xB4DC #x8218) - (#xB4DD #x4E38) - (#xB4DE #x542B) - (#xB4DF #x5CB8) - (#xB4E0 #x5DCC) - (#xB4E1 #x73A9) - (#xB4E2 #x764C) - (#xB4E3 #x773C) - (#xB4E4 #x5CA9) - (#xB4E5 #x7FEB) - (#xB4E6 #x8D0B) - (#xB4E7 #x96C1) - (#xB4E8 #x9811) - (#xB4E9 #x9854) - (#xB4EA #x9858) - (#xB4EB #x4F01) - (#xB4EC #x4F0E) - (#xB4ED #x5371) - (#xB4EE #x559C) - (#xB4EF #x5668) - (#xB4F0 #x57FA) - (#xB4F1 #x5947) - (#xB4F2 #x5B09) - (#xB4F3 #x5BC4) - (#xB4F4 #x5C90) - (#xB4F5 #x5E0C) - (#xB4F6 #x5E7E) - (#xB4F7 #x5FCC) - (#xB4F8 #x63EE) - (#xB4F9 #x673A) - (#xB4FA #x65D7) - (#xB4FB #x65E2) - (#xB4FC #x671F) - (#xB4FD #x68CB) - (#xB4FE #x68C4) - (#xB5A1 #x6A5F) - (#xB5A2 #x5E30) - (#xB5A3 #x6BC5) - (#xB5A4 #x6C17) - (#xB5A5 #x6C7D) - (#xB5A6 #x757F) - (#xB5A7 #x7948) - (#xB5A8 #x5B63) - (#xB5A9 #x7A00) - (#xB5AA #x7D00) - (#xB5AB #x5FBD) - (#xB5AC #x898F) - (#xB5AD #x8A18) - (#xB5AE #x8CB4) - (#xB5AF #x8D77) - (#xB5B0 #x8ECC) - (#xB5B1 #x8F1D) - (#xB5B2 #x98E2) - (#xB5B3 #x9A0E) - (#xB5B4 #x9B3C) - (#xB5B5 #x4E80) - (#xB5B6 #x507D) - (#xB5B7 #x5100) - (#xB5B8 #x5993) - (#xB5B9 #x5B9C) - (#xB5BA #x622F) - (#xB5BB #x6280) - (#xB5BC #x64EC) - (#xB5BD #x6B3A) - (#xB5BE #x72A0) - (#xB5BF #x7591) - (#xB5C0 #x7947) - (#xB5C1 #x7FA9) - (#xB5C2 #x87FB) - (#xB5C3 #x8ABC) - (#xB5C4 #x8B70) - (#xB5C5 #x63AC) - (#xB5C6 #x83CA) - (#xB5C7 #x97A0) - (#xB5C8 #x5409) - (#xB5C9 #x5403) - (#xB5CA #x55AB) - (#xB5CB #x6854) - (#xB5CC #x6A58) - (#xB5CD #x8A70) - (#xB5CE #x7827) - (#xB5CF #x6775) - (#xB5D0 #x9ECD) - (#xB5D1 #x5374) - (#xB5D2 #x5BA2) - (#xB5D3 #x811A) - (#xB5D4 #x8650) - (#xB5D5 #x9006) - (#xB5D6 #x4E18) - (#xB5D7 #x4E45) - (#xB5D8 #x4EC7) - (#xB5D9 #x4F11) - (#xB5DA #x53CA) - (#xB5DB #x5438) - (#xB5DC #x5BAE) - (#xB5DD #x5F13) - (#xB5DE #x6025) - (#xB5DF #x6551) - (#xB5E0 #x673D) - (#xB5E1 #x6C42) - (#xB5E2 #x6C72) - (#xB5E3 #x6CE3) - (#xB5E4 #x7078) - (#xB5E5 #x7403) - (#xB5E6 #x7A76) - (#xB5E7 #x7AAE) - (#xB5E8 #x7B08) - (#xB5E9 #x7D1A) - (#xB5EA #x7CFE) - (#xB5EB #x7D66) - (#xB5EC #x65E7) - (#xB5ED #x725B) - (#xB5EE #x53BB) - (#xB5EF #x5C45) - (#xB5F0 #x5DE8) - (#xB5F1 #x62D2) - (#xB5F2 #x62E0) - (#xB5F3 #x6319) - (#xB5F4 #x6E20) - (#xB5F5 #x865A) - (#xB5F6 #x8A31) - (#xB5F7 #x8DDD) - (#xB5F8 #x92F8) - (#xB5F9 #x6F01) - (#xB5FA #x79A6) - (#xB5FB #x9B5A) - (#xB5FC #x4EA8) - (#xB5FD #x4EAB) - (#xB5FE #x4EAC) - (#xB6A1 #x4F9B) - (#xB6A2 #x4FA0) - (#xB6A3 #x50D1) - (#xB6A4 #x5147) - (#xB6A5 #x7AF6) - (#xB6A6 #x5171) - (#xB6A7 #x51F6) - (#xB6A8 #x5354) - (#xB6A9 #x5321) - (#xB6AA #x537F) - (#xB6AB #x53EB) - (#xB6AC #x55AC) - (#xB6AD #x5883) - (#xB6AE #x5CE1) - (#xB6AF #x5F37) - (#xB6B0 #x5F4A) - (#xB6B1 #x602F) - (#xB6B2 #x6050) - (#xB6B3 #x606D) - (#xB6B4 #x631F) - (#xB6B5 #x6559) - (#xB6B6 #x6A4B) - (#xB6B7 #x6CC1) - (#xB6B8 #x72C2) - (#xB6B9 #x72ED) - (#xB6BA #x77EF) - (#xB6BB #x80F8) - (#xB6BC #x8105) - (#xB6BD #x8208) - (#xB6BE #x854E) - (#xB6BF #x90F7) - (#xB6C0 #x93E1) - (#xB6C1 #x97FF) - (#xB6C2 #x9957) - (#xB6C3 #x9A5A) - (#xB6C4 #x4EF0) - (#xB6C5 #x51DD) - (#xB6C6 #x5C2D) - (#xB6C7 #x6681) - (#xB6C8 #x696D) - (#xB6C9 #x5C40) - (#xB6CA #x66F2) - (#xB6CB #x6975) - (#xB6CC #x7389) - (#xB6CD #x6850) - (#xB6CE #x7C81) - (#xB6CF #x50C5) - (#xB6D0 #x52E4) - (#xB6D1 #x5747) - (#xB6D2 #x5DFE) - (#xB6D3 #x9326) - (#xB6D4 #x65A4) - (#xB6D5 #x6B23) - (#xB6D6 #x6B3D) - (#xB6D7 #x7434) - (#xB6D8 #x7981) - (#xB6D9 #x79BD) - (#xB6DA #x7B4B) - (#xB6DB #x7DCA) - (#xB6DC #x82B9) - (#xB6DD #x83CC) - (#xB6DE #x887F) - (#xB6DF #x895F) - (#xB6E0 #x8B39) - (#xB6E1 #x8FD1) - (#xB6E2 #x91D1) - (#xB6E3 #x541F) - (#xB6E4 #x9280) - (#xB6E5 #x4E5D) - (#xB6E6 #x5036) - (#xB6E7 #x53E5) - (#xB6E8 #x533A) - (#xB6E9 #x72D7) - (#xB6EA #x7396) - (#xB6EB #x77E9) - (#xB6EC #x82E6) - (#xB6ED #x8EAF) - (#xB6EE #x99C6) - (#xB6EF #x99C8) - (#xB6F0 #x99D2) - (#xB6F1 #x5177) - (#xB6F2 #x611A) - (#xB6F3 #x865E) - (#xB6F4 #x55B0) - (#xB6F5 #x7A7A) - (#xB6F6 #x5076) - (#xB6F7 #x5BD3) - (#xB6F8 #x9047) - (#xB6F9 #x9685) - (#xB6FA #x4E32) - (#xB6FB #x6ADB) - (#xB6FC #x91E7) - (#xB6FD #x5C51) - (#xB6FE #x5C48) - (#xB7A1 #x6398) - (#xB7A2 #x7A9F) - (#xB7A3 #x6C93) - (#xB7A4 #x9774) - (#xB7A5 #x8F61) - (#xB7A6 #x7AAA) - (#xB7A7 #x718A) - (#xB7A8 #x9688) - (#xB7A9 #x7C82) - (#xB7AA #x6817) - (#xB7AB #x7E70) - (#xB7AC #x6851) - (#xB7AD #x936C) - (#xB7AE #x52F2) - (#xB7AF #x541B) - (#xB7B0 #x85AB) - (#xB7B1 #x8A13) - (#xB7B2 #x7FA4) - (#xB7B3 #x8ECD) - (#xB7B4 #x90E1) - (#xB7B5 #x5366) - (#xB7B6 #x8888) - (#xB7B7 #x7941) - (#xB7B8 #x4FC2) - (#xB7B9 #x50BE) - (#xB7BA #x5211) - (#xB7BB #x5144) - (#xB7BC #x5553) - (#xB7BD #x572D) - (#xB7BE #x73EA) - (#xB7BF #x578B) - (#xB7C0 #x5951) - (#xB7C1 #x5F62) - (#xB7C2 #x5F84) - (#xB7C3 #x6075) - (#xB7C4 #x6176) - (#xB7C5 #x6167) - (#xB7C6 #x61A9) - (#xB7C7 #x63B2) - (#xB7C8 #x643A) - (#xB7C9 #x656C) - (#xB7CA #x666F) - (#xB7CB #x6842) - (#xB7CC #x6E13) - (#xB7CD #x7566) - (#xB7CE #x7A3D) - (#xB7CF #x7CFB) - (#xB7D0 #x7D4C) - (#xB7D1 #x7D99) - (#xB7D2 #x7E4B) - (#xB7D3 #x7F6B) - (#xB7D4 #x830E) - (#xB7D5 #x834A) - (#xB7D6 #x86CD) - (#xB7D7 #x8A08) - (#xB7D8 #x8A63) - (#xB7D9 #x8B66) - (#xB7DA #x8EFD) - (#xB7DB #x981A) - (#xB7DC #x9D8F) - (#xB7DD #x82B8) - (#xB7DE #x8FCE) - (#xB7DF #x9BE8) - (#xB7E0 #x5287) - (#xB7E1 #x621F) - (#xB7E2 #x6483) - (#xB7E3 #x6FC0) - (#xB7E4 #x9699) - (#xB7E5 #x6841) - (#xB7E6 #x5091) - (#xB7E7 #x6B20) - (#xB7E8 #x6C7A) - (#xB7E9 #x6F54) - (#xB7EA #x7A74) - (#xB7EB #x7D50) - (#xB7EC #x8840) - (#xB7ED #x8A23) - (#xB7EE #x6708) - (#xB7EF #x4EF6) - (#xB7F0 #x5039) - (#xB7F1 #x5026) - (#xB7F2 #x5065) - (#xB7F3 #x517C) - (#xB7F4 #x5238) - (#xB7F5 #x5263) - (#xB7F6 #x55A7) - (#xB7F7 #x570F) - (#xB7F8 #x5805) - (#xB7F9 #x5ACC) - (#xB7FA #x5EFA) - (#xB7FB #x61B2) - (#xB7FC #x61F8) - (#xB7FD #x62F3) - (#xB7FE #x6372) - (#xB8A1 #x691C) - (#xB8A2 #x6A29) - (#xB8A3 #x727D) - (#xB8A4 #x72AC) - (#xB8A5 #x732E) - (#xB8A6 #x7814) - (#xB8A7 #x786F) - (#xB8A8 #x7D79) - (#xB8A9 #x770C) - (#xB8AA #x80A9) - (#xB8AB #x898B) - (#xB8AC #x8B19) - (#xB8AD #x8CE2) - (#xB8AE #x8ED2) - (#xB8AF #x9063) - (#xB8B0 #x9375) - (#xB8B1 #x967A) - (#xB8B2 #x9855) - (#xB8B3 #x9A13) - (#xB8B4 #x9E78) - (#xB8B5 #x5143) - (#xB8B6 #x539F) - (#xB8B7 #x53B3) - (#xB8B8 #x5E7B) - (#xB8B9 #x5F26) - (#xB8BA #x6E1B) - (#xB8BB #x6E90) - (#xB8BC #x7384) - (#xB8BD #x73FE) - (#xB8BE #x7D43) - (#xB8BF #x8237) - (#xB8C0 #x8A00) - (#xB8C1 #x8AFA) - (#xB8C2 #x9650) - (#xB8C3 #x4E4E) - (#xB8C4 #x500B) - (#xB8C5 #x53E4) - (#xB8C6 #x547C) - (#xB8C7 #x56FA) - (#xB8C8 #x59D1) - (#xB8C9 #x5B64) - (#xB8CA #x5DF1) - (#xB8CB #x5EAB) - (#xB8CC #x5F27) - (#xB8CD #x6238) - (#xB8CE #x6545) - (#xB8CF #x67AF) - (#xB8D0 #x6E56) - (#xB8D1 #x72D0) - (#xB8D2 #x7CCA) - (#xB8D3 #x88B4) - (#xB8D4 #x80A1) - (#xB8D5 #x80E1) - (#xB8D6 #x83F0) - (#xB8D7 #x864E) - (#xB8D8 #x8A87) - (#xB8D9 #x8DE8) - (#xB8DA #x9237) - (#xB8DB #x96C7) - (#xB8DC #x9867) - (#xB8DD #x9F13) - (#xB8DE #x4E94) - (#xB8DF #x4E92) - (#xB8E0 #x4F0D) - (#xB8E1 #x5348) - (#xB8E2 #x5449) - (#xB8E3 #x543E) - (#xB8E4 #x5A2F) - (#xB8E5 #x5F8C) - (#xB8E6 #x5FA1) - (#xB8E7 #x609F) - (#xB8E8 #x68A7) - (#xB8E9 #x6A8E) - (#xB8EA #x745A) - (#xB8EB #x7881) - (#xB8EC #x8A9E) - (#xB8ED #x8AA4) - (#xB8EE #x8B77) - (#xB8EF #x9190) - (#xB8F0 #x4E5E) - (#xB8F1 #x9BC9) - (#xB8F2 #x4EA4) - (#xB8F3 #x4F7C) - (#xB8F4 #x4FAF) - (#xB8F5 #x5019) - (#xB8F6 #x5016) - (#xB8F7 #x5149) - (#xB8F8 #x516C) - (#xB8F9 #x529F) - (#xB8FA #x52B9) - (#xB8FB #x52FE) - (#xB8FC #x539A) - (#xB8FD #x53E3) - (#xB8FE #x5411) - (#xB9A1 #x540E) - (#xB9A2 #x5589) - (#xB9A3 #x5751) - (#xB9A4 #x57A2) - (#xB9A5 #x597D) - (#xB9A6 #x5B54) - (#xB9A7 #x5B5D) - (#xB9A8 #x5B8F) - (#xB9A9 #x5DE5) - (#xB9AA #x5DE7) - (#xB9AB #x5DF7) - (#xB9AC #x5E78) - (#xB9AD #x5E83) - (#xB9AE #x5E9A) - (#xB9AF #x5EB7) - (#xB9B0 #x5F18) - (#xB9B1 #x6052) - (#xB9B2 #x614C) - (#xB9B3 #x6297) - (#xB9B4 #x62D8) - (#xB9B5 #x63A7) - (#xB9B6 #x653B) - (#xB9B7 #x6602) - (#xB9B8 #x6643) - (#xB9B9 #x66F4) - (#xB9BA #x676D) - (#xB9BB #x6821) - (#xB9BC #x6897) - (#xB9BD #x69CB) - (#xB9BE #x6C5F) - (#xB9BF #x6D2A) - (#xB9C0 #x6D69) - (#xB9C1 #x6E2F) - (#xB9C2 #x6E9D) - (#xB9C3 #x7532) - (#xB9C4 #x7687) - (#xB9C5 #x786C) - (#xB9C6 #x7A3F) - (#xB9C7 #x7CE0) - (#xB9C8 #x7D05) - (#xB9C9 #x7D18) - (#xB9CA #x7D5E) - (#xB9CB #x7DB1) - (#xB9CC #x8015) - (#xB9CD #x8003) - (#xB9CE #x80AF) - (#xB9CF #x80B1) - (#xB9D0 #x8154) - (#xB9D1 #x818F) - (#xB9D2 #x822A) - (#xB9D3 #x8352) - (#xB9D4 #x884C) - (#xB9D5 #x8861) - (#xB9D6 #x8B1B) - (#xB9D7 #x8CA2) - (#xB9D8 #x8CFC) - (#xB9D9 #x90CA) - (#xB9DA #x9175) - (#xB9DB #x9271) - (#xB9DC #x783F) - (#xB9DD #x92FC) - (#xB9DE #x95A4) - (#xB9DF #x964D) - (#xB9E0 #x9805) - (#xB9E1 #x9999) - (#xB9E2 #x9AD8) - (#xB9E3 #x9D3B) - (#xB9E4 #x525B) - (#xB9E5 #x52AB) - (#xB9E6 #x53F7) - (#xB9E7 #x5408) - (#xB9E8 #x58D5) - (#xB9E9 #x62F7) - (#xB9EA #x6FE0) - (#xB9EB #x8C6A) - (#xB9EC #x8F5F) - (#xB9ED #x9EB9) - (#xB9EE #x514B) - (#xB9EF #x523B) - (#xB9F0 #x544A) - (#xB9F1 #x56FD) - (#xB9F2 #x7A40) - (#xB9F3 #x9177) - (#xB9F4 #x9D60) - (#xB9F5 #x9ED2) - (#xB9F6 #x7344) - (#xB9F7 #x6F09) - (#xB9F8 #x8170) - (#xB9F9 #x7511) - (#xB9FA #x5FFD) - (#xB9FB #x60DA) - (#xB9FC #x9AA8) - (#xB9FD #x72DB) - (#xB9FE #x8FBC) - (#xBAA1 #x6B64) - (#xBAA2 #x9803) - (#xBAA3 #x4ECA) - (#xBAA4 #x56F0) - (#xBAA5 #x5764) - (#xBAA6 #x58BE) - (#xBAA7 #x5A5A) - (#xBAA8 #x6068) - (#xBAA9 #x61C7) - (#xBAAA #x660F) - (#xBAAB #x6606) - (#xBAAC #x6839) - (#xBAAD #x68B1) - (#xBAAE #x6DF7) - (#xBAAF #x75D5) - (#xBAB0 #x7D3A) - (#xBAB1 #x826E) - (#xBAB2 #x9B42) - (#xBAB3 #x4E9B) - (#xBAB4 #x4F50) - (#xBAB5 #x53C9) - (#xBAB6 #x5506) - (#xBAB7 #x5D6F) - (#xBAB8 #x5DE6) - (#xBAB9 #x5DEE) - (#xBABA #x67FB) - (#xBABB #x6C99) - (#xBABC #x7473) - (#xBABD #x7802) - (#xBABE #x8A50) - (#xBABF #x9396) - (#xBAC0 #x88DF) - (#xBAC1 #x5750) - (#xBAC2 #x5EA7) - (#xBAC3 #x632B) - (#xBAC4 #x50B5) - (#xBAC5 #x50AC) - (#xBAC6 #x518D) - (#xBAC7 #x6700) - (#xBAC8 #x54C9) - (#xBAC9 #x585E) - (#xBACA #x59BB) - (#xBACB #x5BB0) - (#xBACC #x5F69) - (#xBACD #x624D) - (#xBACE #x63A1) - (#xBACF #x683D) - (#xBAD0 #x6B73) - (#xBAD1 #x6E08) - (#xBAD2 #x707D) - (#xBAD3 #x91C7) - (#xBAD4 #x7280) - (#xBAD5 #x7815) - (#xBAD6 #x7826) - (#xBAD7 #x796D) - (#xBAD8 #x658E) - (#xBAD9 #x7D30) - (#xBADA #x83DC) - (#xBADB #x88C1) - (#xBADC #x8F09) - (#xBADD #x969B) - (#xBADE #x5264) - (#xBADF #x5728) - (#xBAE0 #x6750) - (#xBAE1 #x7F6A) - (#xBAE2 #x8CA1) - (#xBAE3 #x51B4) - (#xBAE4 #x5742) - (#xBAE5 #x962A) - (#xBAE6 #x583A) - (#xBAE7 #x698A) - (#xBAE8 #x80B4) - (#xBAE9 #x54B2) - (#xBAEA #x5D0E) - (#xBAEB #x57FC) - (#xBAEC #x7895) - (#xBAED #x9DFA) - (#xBAEE #x4F5C) - (#xBAEF #x524A) - (#xBAF0 #x548B) - (#xBAF1 #x643E) - (#xBAF2 #x6628) - (#xBAF3 #x6714) - (#xBAF4 #x67F5) - (#xBAF5 #x7A84) - (#xBAF6 #x7B56) - (#xBAF7 #x7D22) - (#xBAF8 #x932F) - (#xBAF9 #x685C) - (#xBAFA #x9BAD) - (#xBAFB #x7B39) - (#xBAFC #x5319) - (#xBAFD #x518A) - (#xBAFE #x5237) - (#xBBA1 #x5BDF) - (#xBBA2 #x62F6) - (#xBBA3 #x64AE) - (#xBBA4 #x64E6) - (#xBBA5 #x672D) - (#xBBA6 #x6BBA) - (#xBBA7 #x85A9) - (#xBBA8 #x96D1) - (#xBBA9 #x7690) - (#xBBAA #x9BD6) - (#xBBAB #x634C) - (#xBBAC #x9306) - (#xBBAD #x9BAB) - (#xBBAE #x76BF) - (#xBBAF #x6652) - (#xBBB0 #x4E09) - (#xBBB1 #x5098) - (#xBBB2 #x53C2) - (#xBBB3 #x5C71) - (#xBBB4 #x60E8) - (#xBBB5 #x6492) - (#xBBB6 #x6563) - (#xBBB7 #x685F) - (#xBBB8 #x71E6) - (#xBBB9 #x73CA) - (#xBBBA #x7523) - (#xBBBB #x7B97) - (#xBBBC #x7E82) - (#xBBBD #x8695) - (#xBBBE #x8B83) - (#xBBBF #x8CDB) - (#xBBC0 #x9178) - (#xBBC1 #x9910) - (#xBBC2 #x65AC) - (#xBBC3 #x66AB) - (#xBBC4 #x6B8B) - (#xBBC5 #x4ED5) - (#xBBC6 #x4ED4) - (#xBBC7 #x4F3A) - (#xBBC8 #x4F7F) - (#xBBC9 #x523A) - (#xBBCA #x53F8) - (#xBBCB #x53F2) - (#xBBCC #x55E3) - (#xBBCD #x56DB) - (#xBBCE #x58EB) - (#xBBCF #x59CB) - (#xBBD0 #x59C9) - (#xBBD1 #x59FF) - (#xBBD2 #x5B50) - (#xBBD3 #x5C4D) - (#xBBD4 #x5E02) - (#xBBD5 #x5E2B) - (#xBBD6 #x5FD7) - (#xBBD7 #x601D) - (#xBBD8 #x6307) - (#xBBD9 #x652F) - (#xBBDA #x5B5C) - (#xBBDB #x65AF) - (#xBBDC #x65BD) - (#xBBDD #x65E8) - (#xBBDE #x679D) - (#xBBDF #x6B62) - (#xBBE0 #x6B7B) - (#xBBE1 #x6C0F) - (#xBBE2 #x7345) - (#xBBE3 #x7949) - (#xBBE4 #x79C1) - (#xBBE5 #x7CF8) - (#xBBE6 #x7D19) - (#xBBE7 #x7D2B) - (#xBBE8 #x80A2) - (#xBBE9 #x8102) - (#xBBEA #x81F3) - (#xBBEB #x8996) - (#xBBEC #x8A5E) - (#xBBED #x8A69) - (#xBBEE #x8A66) - (#xBBEF #x8A8C) - (#xBBF0 #x8AEE) - (#xBBF1 #x8CC7) - (#xBBF2 #x8CDC) - (#xBBF3 #x96CC) - (#xBBF4 #x98FC) - (#xBBF5 #x6B6F) - (#xBBF6 #x4E8B) - (#xBBF7 #x4F3C) - (#xBBF8 #x4F8D) - (#xBBF9 #x5150) - (#xBBFA #x5B57) - (#xBBFB #x5BFA) - (#xBBFC #x6148) - (#xBBFD #x6301) - (#xBBFE #x6642) - (#xBCA1 #x6B21) - (#xBCA2 #x6ECB) - (#xBCA3 #x6CBB) - (#xBCA4 #x723E) - (#xBCA5 #x74BD) - (#xBCA6 #x75D4) - (#xBCA7 #x78C1) - (#xBCA8 #x793A) - (#xBCA9 #x800C) - (#xBCAA #x8033) - (#xBCAB #x81EA) - (#xBCAC #x8494) - (#xBCAD #x8F9E) - (#xBCAE #x6C50) - (#xBCAF #x9E7F) - (#xBCB0 #x5F0F) - (#xBCB1 #x8B58) - (#xBCB2 #x9D2B) - (#xBCB3 #x7AFA) - (#xBCB4 #x8EF8) - (#xBCB5 #x5B8D) - (#xBCB6 #x96EB) - (#xBCB7 #x4E03) - (#xBCB8 #x53F1) - (#xBCB9 #x57F7) - (#xBCBA #x5931) - (#xBCBB #x5AC9) - (#xBCBC #x5BA4) - (#xBCBD #x6089) - (#xBCBE #x6E7F) - (#xBCBF #x6F06) - (#xBCC0 #x75BE) - (#xBCC1 #x8CEA) - (#xBCC2 #x5B9F) - (#xBCC3 #x8500) - (#xBCC4 #x7BE0) - (#xBCC5 #x5072) - (#xBCC6 #x67F4) - (#xBCC7 #x829D) - (#xBCC8 #x5C61) - (#xBCC9 #x854A) - (#xBCCA #x7E1E) - (#xBCCB #x820E) - (#xBCCC #x5199) - (#xBCCD #x5C04) - (#xBCCE #x6368) - (#xBCCF #x8D66) - (#xBCD0 #x659C) - (#xBCD1 #x716E) - (#xBCD2 #x793E) - (#xBCD3 #x7D17) - (#xBCD4 #x8005) - (#xBCD5 #x8B1D) - (#xBCD6 #x8ECA) - (#xBCD7 #x906E) - (#xBCD8 #x86C7) - (#xBCD9 #x90AA) - (#xBCDA #x501F) - (#xBCDB #x52FA) - (#xBCDC #x5C3A) - (#xBCDD #x6753) - (#xBCDE #x707C) - (#xBCDF #x7235) - (#xBCE0 #x914C) - (#xBCE1 #x91C8) - (#xBCE2 #x932B) - (#xBCE3 #x82E5) - (#xBCE4 #x5BC2) - (#xBCE5 #x5F31) - (#xBCE6 #x60F9) - (#xBCE7 #x4E3B) - (#xBCE8 #x53D6) - (#xBCE9 #x5B88) - (#xBCEA #x624B) - (#xBCEB #x6731) - (#xBCEC #x6B8A) - (#xBCED #x72E9) - (#xBCEE #x73E0) - (#xBCEF #x7A2E) - (#xBCF0 #x816B) - (#xBCF1 #x8DA3) - (#xBCF2 #x9152) - (#xBCF3 #x9996) - (#xBCF4 #x5112) - (#xBCF5 #x53D7) - (#xBCF6 #x546A) - (#xBCF7 #x5BFF) - (#xBCF8 #x6388) - (#xBCF9 #x6A39) - (#xBCFA #x7DAC) - (#xBCFB #x9700) - (#xBCFC #x56DA) - (#xBCFD #x53CE) - (#xBCFE #x5468) - (#xBDA1 #x5B97) - (#xBDA2 #x5C31) - (#xBDA3 #x5DDE) - (#xBDA4 #x4FEE) - (#xBDA5 #x6101) - (#xBDA6 #x62FE) - (#xBDA7 #x6D32) - (#xBDA8 #x79C0) - (#xBDA9 #x79CB) - (#xBDAA #x7D42) - (#xBDAB #x7E4D) - (#xBDAC #x7FD2) - (#xBDAD #x81ED) - (#xBDAE #x821F) - (#xBDAF #x8490) - (#xBDB0 #x8846) - (#xBDB1 #x8972) - (#xBDB2 #x8B90) - (#xBDB3 #x8E74) - (#xBDB4 #x8F2F) - (#xBDB5 #x9031) - (#xBDB6 #x914B) - (#xBDB7 #x916C) - (#xBDB8 #x96C6) - (#xBDB9 #x919C) - (#xBDBA #x4EC0) - (#xBDBB #x4F4F) - (#xBDBC #x5145) - (#xBDBD #x5341) - (#xBDBE #x5F93) - (#xBDBF #x620E) - (#xBDC0 #x67D4) - (#xBDC1 #x6C41) - (#xBDC2 #x6E0B) - (#xBDC3 #x7363) - (#xBDC4 #x7E26) - (#xBDC5 #x91CD) - (#xBDC6 #x9283) - (#xBDC7 #x53D4) - (#xBDC8 #x5919) - (#xBDC9 #x5BBF) - (#xBDCA #x6DD1) - (#xBDCB #x795D) - (#xBDCC #x7E2E) - (#xBDCD #x7C9B) - (#xBDCE #x587E) - (#xBDCF #x719F) - (#xBDD0 #x51FA) - (#xBDD1 #x8853) - (#xBDD2 #x8FF0) - (#xBDD3 #x4FCA) - (#xBDD4 #x5CFB) - (#xBDD5 #x6625) - (#xBDD6 #x77AC) - (#xBDD7 #x7AE3) - (#xBDD8 #x821C) - (#xBDD9 #x99FF) - (#xBDDA #x51C6) - (#xBDDB #x5FAA) - (#xBDDC #x65EC) - (#xBDDD #x696F) - (#xBDDE #x6B89) - (#xBDDF #x6DF3) - (#xBDE0 #x6E96) - (#xBDE1 #x6F64) - (#xBDE2 #x76FE) - (#xBDE3 #x7D14) - (#xBDE4 #x5DE1) - (#xBDE5 #x9075) - (#xBDE6 #x9187) - (#xBDE7 #x9806) - (#xBDE8 #x51E6) - (#xBDE9 #x521D) - (#xBDEA #x6240) - (#xBDEB #x6691) - (#xBDEC #x66D9) - (#xBDED #x6E1A) - (#xBDEE #x5EB6) - (#xBDEF #x7DD2) - (#xBDF0 #x7F72) - (#xBDF1 #x66F8) - (#xBDF2 #x85AF) - (#xBDF3 #x85F7) - (#xBDF4 #x8AF8) - (#xBDF5 #x52A9) - (#xBDF6 #x53D9) - (#xBDF7 #x5973) - (#xBDF8 #x5E8F) - (#xBDF9 #x5F90) - (#xBDFA #x6055) - (#xBDFB #x92E4) - (#xBDFC #x9664) - (#xBDFD #x50B7) - (#xBDFE #x511F) - (#xBEA1 #x52DD) - (#xBEA2 #x5320) - (#xBEA3 #x5347) - (#xBEA4 #x53EC) - (#xBEA5 #x54E8) - (#xBEA6 #x5546) - (#xBEA7 #x5531) - (#xBEA8 #x5617) - (#xBEA9 #x5968) - (#xBEAA #x59BE) - (#xBEAB #x5A3C) - (#xBEAC #x5BB5) - (#xBEAD #x5C06) - (#xBEAE #x5C0F) - (#xBEAF #x5C11) - (#xBEB0 #x5C1A) - (#xBEB1 #x5E84) - (#xBEB2 #x5E8A) - (#xBEB3 #x5EE0) - (#xBEB4 #x5F70) - (#xBEB5 #x627F) - (#xBEB6 #x6284) - (#xBEB7 #x62DB) - (#xBEB8 #x638C) - (#xBEB9 #x6377) - (#xBEBA #x6607) - (#xBEBB #x660C) - (#xBEBC #x662D) - (#xBEBD #x6676) - (#xBEBE #x677E) - (#xBEBF #x68A2) - (#xBEC0 #x6A1F) - (#xBEC1 #x6A35) - (#xBEC2 #x6CBC) - (#xBEC3 #x6D88) - (#xBEC4 #x6E09) - (#xBEC5 #x6E58) - (#xBEC6 #x713C) - (#xBEC7 #x7126) - (#xBEC8 #x7167) - (#xBEC9 #x75C7) - (#xBECA #x7701) - (#xBECB #x785D) - (#xBECC #x7901) - (#xBECD #x7965) - (#xBECE #x79F0) - (#xBECF #x7AE0) - (#xBED0 #x7B11) - (#xBED1 #x7CA7) - (#xBED2 #x7D39) - (#xBED3 #x8096) - (#xBED4 #x83D6) - (#xBED5 #x848B) - (#xBED6 #x8549) - (#xBED7 #x885D) - (#xBED8 #x88F3) - (#xBED9 #x8A1F) - (#xBEDA #x8A3C) - (#xBEDB #x8A54) - (#xBEDC #x8A73) - (#xBEDD #x8C61) - (#xBEDE #x8CDE) - (#xBEDF #x91A4) - (#xBEE0 #x9266) - (#xBEE1 #x937E) - (#xBEE2 #x9418) - (#xBEE3 #x969C) - (#xBEE4 #x9798) - (#xBEE5 #x4E0A) - (#xBEE6 #x4E08) - (#xBEE7 #x4E1E) - (#xBEE8 #x4E57) - (#xBEE9 #x5197) - (#xBEEA #x5270) - (#xBEEB #x57CE) - (#xBEEC #x5834) - (#xBEED #x58CC) - (#xBEEE #x5B22) - (#xBEEF #x5E38) - (#xBEF0 #x60C5) - (#xBEF1 #x64FE) - (#xBEF2 #x6761) - (#xBEF3 #x6756) - (#xBEF4 #x6D44) - (#xBEF5 #x72B6) - (#xBEF6 #x7573) - (#xBEF7 #x7A63) - (#xBEF8 #x84B8) - (#xBEF9 #x8B72) - (#xBEFA #x91B8) - (#xBEFB #x9320) - (#xBEFC #x5631) - (#xBEFD #x57F4) - (#xBEFE #x98FE) - (#xBFA1 #x62ED) - (#xBFA2 #x690D) - (#xBFA3 #x6B96) - (#xBFA4 #x71ED) - (#xBFA5 #x7E54) - (#xBFA6 #x8077) - (#xBFA7 #x8272) - (#xBFA8 #x89E6) - (#xBFA9 #x98DF) - (#xBFAA #x8755) - (#xBFAB #x8FB1) - (#xBFAC #x5C3B) - (#xBFAD #x4F38) - (#xBFAE #x4FE1) - (#xBFAF #x4FB5) - (#xBFB0 #x5507) - (#xBFB1 #x5A20) - (#xBFB2 #x5BDD) - (#xBFB3 #x5BE9) - (#xBFB4 #x5FC3) - (#xBFB5 #x614E) - (#xBFB6 #x632F) - (#xBFB7 #x65B0) - (#xBFB8 #x664B) - (#xBFB9 #x68EE) - (#xBFBA #x699B) - (#xBFBB #x6D78) - (#xBFBC #x6DF1) - (#xBFBD #x7533) - (#xBFBE #x75B9) - (#xBFBF #x771F) - (#xBFC0 #x795E) - (#xBFC1 #x79E6) - (#xBFC2 #x7D33) - (#xBFC3 #x81E3) - (#xBFC4 #x82AF) - (#xBFC5 #x85AA) - (#xBFC6 #x89AA) - (#xBFC7 #x8A3A) - (#xBFC8 #x8EAB) - (#xBFC9 #x8F9B) - (#xBFCA #x9032) - (#xBFCB #x91DD) - (#xBFCC #x9707) - (#xBFCD #x4EBA) - (#xBFCE #x4EC1) - (#xBFCF #x5203) - (#xBFD0 #x5875) - (#xBFD1 #x58EC) - (#xBFD2 #x5C0B) - (#xBFD3 #x751A) - (#xBFD4 #x5C3D) - (#xBFD5 #x814E) - (#xBFD6 #x8A0A) - (#xBFD7 #x8FC5) - (#xBFD8 #x9663) - (#xBFD9 #x976D) - (#xBFDA #x7B25) - (#xBFDB #x8ACF) - (#xBFDC #x9808) - (#xBFDD #x9162) - (#xBFDE #x56F3) - (#xBFDF #x53A8) - (#xBFE0 #x9017) - (#xBFE1 #x5439) - (#xBFE2 #x5782) - (#xBFE3 #x5E25) - (#xBFE4 #x63A8) - (#xBFE5 #x6C34) - (#xBFE6 #x708A) - (#xBFE7 #x7761) - (#xBFE8 #x7C8B) - (#xBFE9 #x7FE0) - (#xBFEA #x8870) - (#xBFEB #x9042) - (#xBFEC #x9154) - (#xBFED #x9310) - (#xBFEE #x9318) - (#xBFEF #x968F) - (#xBFF0 #x745E) - (#xBFF1 #x9AC4) - (#xBFF2 #x5D07) - (#xBFF3 #x5D69) - (#xBFF4 #x6570) - (#xBFF5 #x67A2) - (#xBFF6 #x8DA8) - (#xBFF7 #x96DB) - (#xBFF8 #x636E) - (#xBFF9 #x6749) - (#xBFFA #x6919) - (#xBFFB #x83C5) - (#xBFFC #x9817) - (#xBFFD #x96C0) - (#xBFFE #x88FE) - (#xC0A1 #x6F84) - (#xC0A2 #x647A) - (#xC0A3 #x5BF8) - (#xC0A4 #x4E16) - (#xC0A5 #x702C) - (#xC0A6 #x755D) - (#xC0A7 #x662F) - (#xC0A8 #x51C4) - (#xC0A9 #x5236) - (#xC0AA #x52E2) - (#xC0AB #x59D3) - (#xC0AC #x5F81) - (#xC0AD #x6027) - (#xC0AE #x6210) - (#xC0AF #x653F) - (#xC0B0 #x6574) - (#xC0B1 #x661F) - (#xC0B2 #x6674) - (#xC0B3 #x68F2) - (#xC0B4 #x6816) - (#xC0B5 #x6B63) - (#xC0B6 #x6E05) - (#xC0B7 #x7272) - (#xC0B8 #x751F) - (#xC0B9 #x76DB) - (#xC0BA #x7CBE) - (#xC0BB #x8056) - (#xC0BC #x58F0) - (#xC0BD #x88FD) - (#xC0BE #x897F) - (#xC0BF #x8AA0) - (#xC0C0 #x8A93) - (#xC0C1 #x8ACB) - (#xC0C2 #x901D) - (#xC0C3 #x9192) - (#xC0C4 #x9752) - (#xC0C5 #x9759) - (#xC0C6 #x6589) - (#xC0C7 #x7A0E) - (#xC0C8 #x8106) - (#xC0C9 #x96BB) - (#xC0CA #x5E2D) - (#xC0CB #x60DC) - (#xC0CC #x621A) - (#xC0CD #x65A5) - (#xC0CE #x6614) - (#xC0CF #x6790) - (#xC0D0 #x77F3) - (#xC0D1 #x7A4D) - (#xC0D2 #x7C4D) - (#xC0D3 #x7E3E) - (#xC0D4 #x810A) - (#xC0D5 #x8CAC) - (#xC0D6 #x8D64) - (#xC0D7 #x8DE1) - (#xC0D8 #x8E5F) - (#xC0D9 #x78A9) - (#xC0DA #x5207) - (#xC0DB #x62D9) - (#xC0DC #x63A5) - (#xC0DD #x6442) - (#xC0DE #x6298) - (#xC0DF #x8A2D) - (#xC0E0 #x7A83) - (#xC0E1 #x7BC0) - (#xC0E2 #x8AAC) - (#xC0E3 #x96EA) - (#xC0E4 #x7D76) - (#xC0E5 #x820C) - (#xC0E6 #x8749) - (#xC0E7 #x4ED9) - (#xC0E8 #x5148) - (#xC0E9 #x5343) - (#xC0EA #x5360) - (#xC0EB #x5BA3) - (#xC0EC #x5C02) - (#xC0ED #x5C16) - (#xC0EE #x5DDD) - (#xC0EF #x6226) - (#xC0F0 #x6247) - (#xC0F1 #x64B0) - (#xC0F2 #x6813) - (#xC0F3 #x6834) - (#xC0F4 #x6CC9) - (#xC0F5 #x6D45) - (#xC0F6 #x6D17) - (#xC0F7 #x67D3) - (#xC0F8 #x6F5C) - (#xC0F9 #x714E) - (#xC0FA #x717D) - (#xC0FB #x65CB) - (#xC0FC #x7A7F) - (#xC0FD #x7BAD) - (#xC0FE #x7DDA) - (#xC1A1 #x7E4A) - (#xC1A2 #x7FA8) - (#xC1A3 #x817A) - (#xC1A4 #x821B) - (#xC1A5 #x8239) - (#xC1A6 #x85A6) - (#xC1A7 #x8A6E) - (#xC1A8 #x8CCE) - (#xC1A9 #x8DF5) - (#xC1AA #x9078) - (#xC1AB #x9077) - (#xC1AC #x92AD) - (#xC1AD #x9291) - (#xC1AE #x9583) - (#xC1AF #x9BAE) - (#xC1B0 #x524D) - (#xC1B1 #x5584) - (#xC1B2 #x6F38) - (#xC1B3 #x7136) - (#xC1B4 #x5168) - (#xC1B5 #x7985) - (#xC1B6 #x7E55) - (#xC1B7 #x81B3) - (#xC1B8 #x7CCE) - (#xC1B9 #x564C) - (#xC1BA #x5851) - (#xC1BB #x5CA8) - (#xC1BC #x63AA) - (#xC1BD #x66FE) - (#xC1BE #x66FD) - (#xC1BF #x695A) - (#xC1C0 #x72D9) - (#xC1C1 #x758F) - (#xC1C2 #x758E) - (#xC1C3 #x790E) - (#xC1C4 #x7956) - (#xC1C5 #x79DF) - (#xC1C6 #x7C97) - (#xC1C7 #x7D20) - (#xC1C8 #x7D44) - (#xC1C9 #x8607) - (#xC1CA #x8A34) - (#xC1CB #x963B) - (#xC1CC #x9061) - (#xC1CD #x9F20) - (#xC1CE #x50E7) - (#xC1CF #x5275) - (#xC1D0 #x53CC) - (#xC1D1 #x53E2) - (#xC1D2 #x5009) - (#xC1D3 #x55AA) - (#xC1D4 #x58EE) - (#xC1D5 #x594F) - (#xC1D6 #x723D) - (#xC1D7 #x5B8B) - (#xC1D8 #x5C64) - (#xC1D9 #x531D) - (#xC1DA #x60E3) - (#xC1DB #x60F3) - (#xC1DC #x635C) - (#xC1DD #x6383) - (#xC1DE #x633F) - (#xC1DF #x63BB) - (#xC1E0 #x64CD) - (#xC1E1 #x65E9) - (#xC1E2 #x66F9) - (#xC1E3 #x5DE3) - (#xC1E4 #x69CD) - (#xC1E5 #x69FD) - (#xC1E6 #x6F15) - (#xC1E7 #x71E5) - (#xC1E8 #x4E89) - (#xC1E9 #x75E9) - (#xC1EA #x76F8) - (#xC1EB #x7A93) - (#xC1EC #x7CDF) - (#xC1ED #x7DCF) - (#xC1EE #x7D9C) - (#xC1EF #x8061) - (#xC1F0 #x8349) - (#xC1F1 #x8358) - (#xC1F2 #x846C) - (#xC1F3 #x84BC) - (#xC1F4 #x85FB) - (#xC1F5 #x88C5) - (#xC1F6 #x8D70) - (#xC1F7 #x9001) - (#xC1F8 #x906D) - (#xC1F9 #x9397) - (#xC1FA #x971C) - (#xC1FB #x9A12) - (#xC1FC #x50CF) - (#xC1FD #x5897) - (#xC1FE #x618E) - (#xC2A1 #x81D3) - (#xC2A2 #x8535) - (#xC2A3 #x8D08) - (#xC2A4 #x9020) - (#xC2A5 #x4FC3) - (#xC2A6 #x5074) - (#xC2A7 #x5247) - (#xC2A8 #x5373) - (#xC2A9 #x606F) - (#xC2AA #x6349) - (#xC2AB #x675F) - (#xC2AC #x6E2C) - (#xC2AD #x8DB3) - (#xC2AE #x901F) - (#xC2AF #x4FD7) - (#xC2B0 #x5C5E) - (#xC2B1 #x8CCA) - (#xC2B2 #x65CF) - (#xC2B3 #x7D9A) - (#xC2B4 #x5352) - (#xC2B5 #x8896) - (#xC2B6 #x5176) - (#xC2B7 #x63C3) - (#xC2B8 #x5B58) - (#xC2B9 #x5B6B) - (#xC2BA #x5C0A) - (#xC2BB #x640D) - (#xC2BC #x6751) - (#xC2BD #x905C) - (#xC2BE #x4ED6) - (#xC2BF #x591A) - (#xC2C0 #x592A) - (#xC2C1 #x6C70) - (#xC2C2 #x8A51) - (#xC2C3 #x553E) - (#xC2C4 #x5815) - (#xC2C5 #x59A5) - (#xC2C6 #x60F0) - (#xC2C7 #x6253) - (#xC2C8 #x67C1) - (#xC2C9 #x8235) - (#xC2CA #x6955) - (#xC2CB #x9640) - (#xC2CC #x99C4) - (#xC2CD #x9A28) - (#xC2CE #x4F53) - (#xC2CF #x5806) - (#xC2D0 #x5BFE) - (#xC2D1 #x8010) - (#xC2D2 #x5CB1) - (#xC2D3 #x5E2F) - (#xC2D4 #x5F85) - (#xC2D5 #x6020) - (#xC2D6 #x614B) - (#xC2D7 #x6234) - (#xC2D8 #x66FF) - (#xC2D9 #x6CF0) - (#xC2DA #x6EDE) - (#xC2DB #x80CE) - (#xC2DC #x817F) - (#xC2DD #x82D4) - (#xC2DE #x888B) - (#xC2DF #x8CB8) - (#xC2E0 #x9000) - (#xC2E1 #x902E) - (#xC2E2 #x968A) - (#xC2E3 #x9EDB) - (#xC2E4 #x9BDB) - (#xC2E5 #x4EE3) - (#xC2E6 #x53F0) - (#xC2E7 #x5927) - (#xC2E8 #x7B2C) - (#xC2E9 #x918D) - (#xC2EA #x984C) - (#xC2EB #x9DF9) - (#xC2EC #x6EDD) - (#xC2ED #x7027) - (#xC2EE #x5353) - (#xC2EF #x5544) - (#xC2F0 #x5B85) - (#xC2F1 #x6258) - (#xC2F2 #x629E) - (#xC2F3 #x62D3) - (#xC2F4 #x6CA2) - (#xC2F5 #x6FEF) - (#xC2F6 #x7422) - (#xC2F7 #x8A17) - (#xC2F8 #x9438) - (#xC2F9 #x6FC1) - (#xC2FA #x8AFE) - (#xC2FB #x8338) - (#xC2FC #x51E7) - (#xC2FD #x86F8) - (#xC2FE #x53EA) - (#xC3A1 #x53E9) - (#xC3A2 #x4F46) - (#xC3A3 #x9054) - (#xC3A4 #x8FB0) - (#xC3A5 #x596A) - (#xC3A6 #x8131) - (#xC3A7 #x5DFD) - (#xC3A8 #x7AEA) - (#xC3A9 #x8FBF) - (#xC3AA #x68DA) - (#xC3AB #x8C37) - (#xC3AC #x72F8) - (#xC3AD #x9C48) - (#xC3AE #x6A3D) - (#xC3AF #x8AB0) - (#xC3B0 #x4E39) - (#xC3B1 #x5358) - (#xC3B2 #x5606) - (#xC3B3 #x5766) - (#xC3B4 #x62C5) - (#xC3B5 #x63A2) - (#xC3B6 #x65E6) - (#xC3B7 #x6B4E) - (#xC3B8 #x6DE1) - (#xC3B9 #x6E5B) - (#xC3BA #x70AD) - (#xC3BB #x77ED) - (#xC3BC #x7AEF) - (#xC3BD #x7BAA) - (#xC3BE #x7DBB) - (#xC3BF #x803D) - (#xC3C0 #x80C6) - (#xC3C1 #x86CB) - (#xC3C2 #x8A95) - (#xC3C3 #x935B) - (#xC3C4 #x56E3) - (#xC3C5 #x58C7) - (#xC3C6 #x5F3E) - (#xC3C7 #x65AD) - (#xC3C8 #x6696) - (#xC3C9 #x6A80) - (#xC3CA #x6BB5) - (#xC3CB #x7537) - (#xC3CC #x8AC7) - (#xC3CD #x5024) - (#xC3CE #x77E5) - (#xC3CF #x5730) - (#xC3D0 #x5F1B) - (#xC3D1 #x6065) - (#xC3D2 #x667A) - (#xC3D3 #x6C60) - (#xC3D4 #x75F4) - (#xC3D5 #x7A1A) - (#xC3D6 #x7F6E) - (#xC3D7 #x81F4) - (#xC3D8 #x8718) - (#xC3D9 #x9045) - (#xC3DA #x99B3) - (#xC3DB #x7BC9) - (#xC3DC #x755C) - (#xC3DD #x7AF9) - (#xC3DE #x7B51) - (#xC3DF #x84C4) - (#xC3E0 #x9010) - (#xC3E1 #x79E9) - (#xC3E2 #x7A92) - (#xC3E3 #x8336) - (#xC3E4 #x5AE1) - (#xC3E5 #x7740) - (#xC3E6 #x4E2D) - (#xC3E7 #x4EF2) - (#xC3E8 #x5B99) - (#xC3E9 #x5FE0) - (#xC3EA #x62BD) - (#xC3EB #x663C) - (#xC3EC #x67F1) - (#xC3ED #x6CE8) - (#xC3EE #x866B) - (#xC3EF #x8877) - (#xC3F0 #x8A3B) - (#xC3F1 #x914E) - (#xC3F2 #x92F3) - (#xC3F3 #x99D0) - (#xC3F4 #x6A17) - (#xC3F5 #x7026) - (#xC3F6 #x732A) - (#xC3F7 #x82E7) - (#xC3F8 #x8457) - (#xC3F9 #x8CAF) - (#xC3FA #x4E01) - (#xC3FB #x5146) - (#xC3FC #x51CB) - (#xC3FD #x558B) - (#xC3FE #x5BF5) - (#xC4A1 #x5E16) - (#xC4A2 #x5E33) - (#xC4A3 #x5E81) - (#xC4A4 #x5F14) - (#xC4A5 #x5F35) - (#xC4A6 #x5F6B) - (#xC4A7 #x5FB4) - (#xC4A8 #x61F2) - (#xC4A9 #x6311) - (#xC4AA #x66A2) - (#xC4AB #x671D) - (#xC4AC #x6F6E) - (#xC4AD #x7252) - (#xC4AE #x753A) - (#xC4AF #x773A) - (#xC4B0 #x8074) - (#xC4B1 #x8139) - (#xC4B2 #x8178) - (#xC4B3 #x8776) - (#xC4B4 #x8ABF) - (#xC4B5 #x8ADC) - (#xC4B6 #x8D85) - (#xC4B7 #x8DF3) - (#xC4B8 #x929A) - (#xC4B9 #x9577) - (#xC4BA #x9802) - (#xC4BB #x9CE5) - (#xC4BC #x52C5) - (#xC4BD #x6357) - (#xC4BE #x76F4) - (#xC4BF #x6715) - (#xC4C0 #x6C88) - (#xC4C1 #x73CD) - (#xC4C2 #x8CC3) - (#xC4C3 #x93AE) - (#xC4C4 #x9673) - (#xC4C5 #x6D25) - (#xC4C6 #x589C) - (#xC4C7 #x690E) - (#xC4C8 #x69CC) - (#xC4C9 #x8FFD) - (#xC4CA #x939A) - (#xC4CB #x75DB) - (#xC4CC #x901A) - (#xC4CD #x585A) - (#xC4CE #x6802) - (#xC4CF #x63B4) - (#xC4D0 #x69FB) - (#xC4D1 #x4F43) - (#xC4D2 #x6F2C) - (#xC4D3 #x67D8) - (#xC4D4 #x8FBB) - (#xC4D5 #x8526) - (#xC4D6 #x7DB4) - (#xC4D7 #x9354) - (#xC4D8 #x693F) - (#xC4D9 #x6F70) - (#xC4DA #x576A) - (#xC4DB #x58F7) - (#xC4DC #x5B2C) - (#xC4DD #x7D2C) - (#xC4DE #x722A) - (#xC4DF #x540A) - (#xC4E0 #x91E3) - (#xC4E1 #x9DB4) - (#xC4E2 #x4EAD) - (#xC4E3 #x4F4E) - (#xC4E4 #x505C) - (#xC4E5 #x5075) - (#xC4E6 #x5243) - (#xC4E7 #x8C9E) - (#xC4E8 #x5448) - (#xC4E9 #x5824) - (#xC4EA #x5B9A) - (#xC4EB #x5E1D) - (#xC4EC #x5E95) - (#xC4ED #x5EAD) - (#xC4EE #x5EF7) - (#xC4EF #x5F1F) - (#xC4F0 #x608C) - (#xC4F1 #x62B5) - (#xC4F2 #x633A) - (#xC4F3 #x63D0) - (#xC4F4 #x68AF) - (#xC4F5 #x6C40) - (#xC4F6 #x7887) - (#xC4F7 #x798E) - (#xC4F8 #x7A0B) - (#xC4F9 #x7DE0) - (#xC4FA #x8247) - (#xC4FB #x8A02) - (#xC4FC #x8AE6) - (#xC4FD #x8E44) - (#xC4FE #x9013) - (#xC5A1 #x90B8) - (#xC5A2 #x912D) - (#xC5A3 #x91D8) - (#xC5A4 #x9F0E) - (#xC5A5 #x6CE5) - (#xC5A6 #x6458) - (#xC5A7 #x64E2) - (#xC5A8 #x6575) - (#xC5A9 #x6EF4) - (#xC5AA #x7684) - (#xC5AB #x7B1B) - (#xC5AC #x9069) - (#xC5AD #x93D1) - (#xC5AE #x6EBA) - (#xC5AF #x54F2) - (#xC5B0 #x5FB9) - (#xC5B1 #x64A4) - (#xC5B2 #x8F4D) - (#xC5B3 #x8FED) - (#xC5B4 #x9244) - (#xC5B5 #x5178) - (#xC5B6 #x586B) - (#xC5B7 #x5929) - (#xC5B8 #x5C55) - (#xC5B9 #x5E97) - (#xC5BA #x6DFB) - (#xC5BB #x7E8F) - (#xC5BC #x751C) - (#xC5BD #x8CBC) - (#xC5BE #x8EE2) - (#xC5BF #x985B) - (#xC5C0 #x70B9) - (#xC5C1 #x4F1D) - (#xC5C2 #x6BBF) - (#xC5C3 #x6FB1) - (#xC5C4 #x7530) - (#xC5C5 #x96FB) - (#xC5C6 #x514E) - (#xC5C7 #x5410) - (#xC5C8 #x5835) - (#xC5C9 #x5857) - (#xC5CA #x59AC) - (#xC5CB #x5C60) - (#xC5CC #x5F92) - (#xC5CD #x6597) - (#xC5CE #x675C) - (#xC5CF #x6E21) - (#xC5D0 #x767B) - (#xC5D1 #x83DF) - (#xC5D2 #x8CED) - (#xC5D3 #x9014) - (#xC5D4 #x90FD) - (#xC5D5 #x934D) - (#xC5D6 #x7825) - (#xC5D7 #x783A) - (#xC5D8 #x52AA) - (#xC5D9 #x5EA6) - (#xC5DA #x571F) - (#xC5DB #x5974) - (#xC5DC #x6012) - (#xC5DD #x5012) - (#xC5DE #x515A) - (#xC5DF #x51AC) - (#xC5E0 #x51CD) - (#xC5E1 #x5200) - (#xC5E2 #x5510) - (#xC5E3 #x5854) - (#xC5E4 #x5858) - (#xC5E5 #x5957) - (#xC5E6 #x5B95) - (#xC5E7 #x5CF6) - (#xC5E8 #x5D8B) - (#xC5E9 #x60BC) - (#xC5EA #x6295) - (#xC5EB #x642D) - (#xC5EC #x6771) - (#xC5ED #x6843) - (#xC5EE #x68BC) - (#xC5EF #x68DF) - (#xC5F0 #x76D7) - (#xC5F1 #x6DD8) - (#xC5F2 #x6E6F) - (#xC5F3 #x6D9B) - (#xC5F4 #x706F) - (#xC5F5 #x71C8) - (#xC5F6 #x5F53) - (#xC5F7 #x75D8) - (#xC5F8 #x7977) - (#xC5F9 #x7B49) - (#xC5FA #x7B54) - (#xC5FB #x7B52) - (#xC5FC #x7CD6) - (#xC5FD #x7D71) - (#xC5FE #x5230) - (#xC6A1 #x8463) - (#xC6A2 #x8569) - (#xC6A3 #x85E4) - (#xC6A4 #x8A0E) - (#xC6A5 #x8B04) - (#xC6A6 #x8C46) - (#xC6A7 #x8E0F) - (#xC6A8 #x9003) - (#xC6A9 #x900F) - (#xC6AA #x9419) - (#xC6AB #x9676) - (#xC6AC #x982D) - (#xC6AD #x9A30) - (#xC6AE #x95D8) - (#xC6AF #x50CD) - (#xC6B0 #x52D5) - (#xC6B1 #x540C) - (#xC6B2 #x5802) - (#xC6B3 #x5C0E) - (#xC6B4 #x61A7) - (#xC6B5 #x649E) - (#xC6B6 #x6D1E) - (#xC6B7 #x77B3) - (#xC6B8 #x7AE5) - (#xC6B9 #x80F4) - (#xC6BA #x8404) - (#xC6BB #x9053) - (#xC6BC #x9285) - (#xC6BD #x5CE0) - (#xC6BE #x9D07) - (#xC6BF #x533F) - (#xC6C0 #x5F97) - (#xC6C1 #x5FB3) - (#xC6C2 #x6D9C) - (#xC6C3 #x7279) - (#xC6C4 #x7763) - (#xC6C5 #x79BF) - (#xC6C6 #x7BE4) - (#xC6C7 #x6BD2) - (#xC6C8 #x72EC) - (#xC6C9 #x8AAD) - (#xC6CA #x6803) - (#xC6CB #x6A61) - (#xC6CC #x51F8) - (#xC6CD #x7A81) - (#xC6CE #x6934) - (#xC6CF #x5C4A) - (#xC6D0 #x9CF6) - (#xC6D1 #x82EB) - (#xC6D2 #x5BC5) - (#xC6D3 #x9149) - (#xC6D4 #x701E) - (#xC6D5 #x5678) - (#xC6D6 #x5C6F) - (#xC6D7 #x60C7) - (#xC6D8 #x6566) - (#xC6D9 #x6C8C) - (#xC6DA #x8C5A) - (#xC6DB #x9041) - (#xC6DC #x9813) - (#xC6DD #x5451) - (#xC6DE #x66C7) - (#xC6DF #x920D) - (#xC6E0 #x5948) - (#xC6E1 #x90A3) - (#xC6E2 #x5185) - (#xC6E3 #x4E4D) - (#xC6E4 #x51EA) - (#xC6E5 #x8599) - (#xC6E6 #x8B0E) - (#xC6E7 #x7058) - (#xC6E8 #x637A) - (#xC6E9 #x934B) - (#xC6EA #x6962) - (#xC6EB #x99B4) - (#xC6EC #x7E04) - (#xC6ED #x7577) - (#xC6EE #x5357) - (#xC6EF #x6960) - (#xC6F0 #x8EDF) - (#xC6F1 #x96E3) - (#xC6F2 #x6C5D) - (#xC6F3 #x4E8C) - (#xC6F4 #x5C3C) - (#xC6F5 #x5F10) - (#xC6F6 #x8FE9) - (#xC6F7 #x5302) - (#xC6F8 #x8CD1) - (#xC6F9 #x8089) - (#xC6FA #x8679) - (#xC6FB #x5EFF) - (#xC6FC #x65E5) - (#xC6FD #x4E73) - (#xC6FE #x5165) - (#xC7A1 #x5982) - (#xC7A2 #x5C3F) - (#xC7A3 #x97EE) - (#xC7A4 #x4EFB) - (#xC7A5 #x598A) - (#xC7A6 #x5FCD) - (#xC7A7 #x8A8D) - (#xC7A8 #x6FE1) - (#xC7A9 #x79B0) - (#xC7AA #x7962) - (#xC7AB #x5BE7) - (#xC7AC #x8471) - (#xC7AD #x732B) - (#xC7AE #x71B1) - (#xC7AF #x5E74) - (#xC7B0 #x5FF5) - (#xC7B1 #x637B) - (#xC7B2 #x649A) - (#xC7B3 #x71C3) - (#xC7B4 #x7C98) - (#xC7B5 #x4E43) - (#xC7B6 #x5EFC) - (#xC7B7 #x4E4B) - (#xC7B8 #x57DC) - (#xC7B9 #x56A2) - (#xC7BA #x60A9) - (#xC7BB #x6FC3) - (#xC7BC #x7D0D) - (#xC7BD #x80FD) - (#xC7BE #x8133) - (#xC7BF #x81BF) - (#xC7C0 #x8FB2) - (#xC7C1 #x8997) - (#xC7C2 #x86A4) - (#xC7C3 #x5DF4) - (#xC7C4 #x628A) - (#xC7C5 #x64AD) - (#xC7C6 #x8987) - (#xC7C7 #x6777) - (#xC7C8 #x6CE2) - (#xC7C9 #x6D3E) - (#xC7CA #x7436) - (#xC7CB #x7834) - (#xC7CC #x5A46) - (#xC7CD #x7F75) - (#xC7CE #x82AD) - (#xC7CF #x99AC) - (#xC7D0 #x4FF3) - (#xC7D1 #x5EC3) - (#xC7D2 #x62DD) - (#xC7D3 #x6392) - (#xC7D4 #x6557) - (#xC7D5 #x676F) - (#xC7D6 #x76C3) - (#xC7D7 #x724C) - (#xC7D8 #x80CC) - (#xC7D9 #x80BA) - (#xC7DA #x8F29) - (#xC7DB #x914D) - (#xC7DC #x500D) - (#xC7DD #x57F9) - (#xC7DE #x5A92) - (#xC7DF #x6885) - (#xC7E0 #x6973) - (#xC7E1 #x7164) - (#xC7E2 #x72FD) - (#xC7E3 #x8CB7) - (#xC7E4 #x58F2) - (#xC7E5 #x8CE0) - (#xC7E6 #x966A) - (#xC7E7 #x9019) - (#xC7E8 #x877F) - (#xC7E9 #x79E4) - (#xC7EA #x77E7) - (#xC7EB #x8429) - (#xC7EC #x4F2F) - (#xC7ED #x5265) - (#xC7EE #x535A) - (#xC7EF #x62CD) - (#xC7F0 #x67CF) - (#xC7F1 #x6CCA) - (#xC7F2 #x767D) - (#xC7F3 #x7B94) - (#xC7F4 #x7C95) - (#xC7F5 #x8236) - (#xC7F6 #x8584) - (#xC7F7 #x8FEB) - (#xC7F8 #x66DD) - (#xC7F9 #x6F20) - (#xC7FA #x7206) - (#xC7FB #x7E1B) - (#xC7FC #x83AB) - (#xC7FD #x99C1) - (#xC7FE #x9EA6) - (#xC8A1 #x51FD) - (#xC8A2 #x7BB1) - (#xC8A3 #x7872) - (#xC8A4 #x7BB8) - (#xC8A5 #x8087) - (#xC8A6 #x7B48) - (#xC8A7 #x6AE8) - (#xC8A8 #x5E61) - (#xC8A9 #x808C) - (#xC8AA #x7551) - (#xC8AB #x7560) - (#xC8AC #x516B) - (#xC8AD #x9262) - (#xC8AE #x6E8C) - (#xC8AF #x767A) - (#xC8B0 #x9197) - (#xC8B1 #x9AEA) - (#xC8B2 #x4F10) - (#xC8B3 #x7F70) - (#xC8B4 #x629C) - (#xC8B5 #x7B4F) - (#xC8B6 #x95A5) - (#xC8B7 #x9CE9) - (#xC8B8 #x567A) - (#xC8B9 #x5859) - (#xC8BA #x86E4) - (#xC8BB #x96BC) - (#xC8BC #x4F34) - (#xC8BD #x5224) - (#xC8BE #x534A) - (#xC8BF #x53CD) - (#xC8C0 #x53DB) - (#xC8C1 #x5E06) - (#xC8C2 #x642C) - (#xC8C3 #x6591) - (#xC8C4 #x677F) - (#xC8C5 #x6C3E) - (#xC8C6 #x6C4E) - (#xC8C7 #x7248) - (#xC8C8 #x72AF) - (#xC8C9 #x73ED) - (#xC8CA #x7554) - (#xC8CB #x7E41) - (#xC8CC #x822C) - (#xC8CD #x85E9) - (#xC8CE #x8CA9) - (#xC8CF #x7BC4) - (#xC8D0 #x91C6) - (#xC8D1 #x7169) - (#xC8D2 #x9812) - (#xC8D3 #x98EF) - (#xC8D4 #x633D) - (#xC8D5 #x6669) - (#xC8D6 #x756A) - (#xC8D7 #x76E4) - (#xC8D8 #x78D0) - (#xC8D9 #x8543) - (#xC8DA #x86EE) - (#xC8DB #x532A) - (#xC8DC #x5351) - (#xC8DD #x5426) - (#xC8DE #x5983) - (#xC8DF #x5E87) - (#xC8E0 #x5F7C) - (#xC8E1 #x60B2) - (#xC8E2 #x6249) - (#xC8E3 #x6279) - (#xC8E4 #x62AB) - (#xC8E5 #x6590) - (#xC8E6 #x6BD4) - (#xC8E7 #x6CCC) - (#xC8E8 #x75B2) - (#xC8E9 #x76AE) - (#xC8EA #x7891) - (#xC8EB #x79D8) - (#xC8EC #x7DCB) - (#xC8ED #x7F77) - (#xC8EE #x80A5) - (#xC8EF #x88AB) - (#xC8F0 #x8AB9) - (#xC8F1 #x8CBB) - (#xC8F2 #x907F) - (#xC8F3 #x975E) - (#xC8F4 #x98DB) - (#xC8F5 #x6A0B) - (#xC8F6 #x7C38) - (#xC8F7 #x5099) - (#xC8F8 #x5C3E) - (#xC8F9 #x5FAE) - (#xC8FA #x6787) - (#xC8FB #x6BD8) - (#xC8FC #x7435) - (#xC8FD #x7709) - (#xC8FE #x7F8E) - (#xC9A1 #x9F3B) - (#xC9A2 #x67CA) - (#xC9A3 #x7A17) - (#xC9A4 #x5339) - (#xC9A5 #x758B) - (#xC9A6 #x9AED) - (#xC9A7 #x5F66) - (#xC9A8 #x819D) - (#xC9A9 #x83F1) - (#xC9AA #x8098) - (#xC9AB #x5F3C) - (#xC9AC #x5FC5) - (#xC9AD #x7562) - (#xC9AE #x7B46) - (#xC9AF #x903C) - (#xC9B0 #x6867) - (#xC9B1 #x59EB) - (#xC9B2 #x5A9B) - (#xC9B3 #x7D10) - (#xC9B4 #x767E) - (#xC9B5 #x8B2C) - (#xC9B6 #x4FF5) - (#xC9B7 #x5F6A) - (#xC9B8 #x6A19) - (#xC9B9 #x6C37) - (#xC9BA #x6F02) - (#xC9BB #x74E2) - (#xC9BC #x7968) - (#xC9BD #x8868) - (#xC9BE #x8A55) - (#xC9BF #x8C79) - (#xC9C0 #x5EDF) - (#xC9C1 #x63CF) - (#xC9C2 #x75C5) - (#xC9C3 #x79D2) - (#xC9C4 #x82D7) - (#xC9C5 #x9328) - (#xC9C6 #x92F2) - (#xC9C7 #x849C) - (#xC9C8 #x86ED) - (#xC9C9 #x9C2D) - (#xC9CA #x54C1) - (#xC9CB #x5F6C) - (#xC9CC #x658C) - (#xC9CD #x6D5C) - (#xC9CE #x7015) - (#xC9CF #x8CA7) - (#xC9D0 #x8CD3) - (#xC9D1 #x983B) - (#xC9D2 #x654F) - (#xC9D3 #x74F6) - (#xC9D4 #x4E0D) - (#xC9D5 #x4ED8) - (#xC9D6 #x57E0) - (#xC9D7 #x592B) - (#xC9D8 #x5A66) - (#xC9D9 #x5BCC) - (#xC9DA #x51A8) - (#xC9DB #x5E03) - (#xC9DC #x5E9C) - (#xC9DD #x6016) - (#xC9DE #x6276) - (#xC9DF #x6577) - (#xC9E0 #x65A7) - (#xC9E1 #x666E) - (#xC9E2 #x6D6E) - (#xC9E3 #x7236) - (#xC9E4 #x7B26) - (#xC9E5 #x8150) - (#xC9E6 #x819A) - (#xC9E7 #x8299) - (#xC9E8 #x8B5C) - (#xC9E9 #x8CA0) - (#xC9EA #x8CE6) - (#xC9EB #x8D74) - (#xC9EC #x961C) - (#xC9ED #x9644) - (#xC9EE #x4FAE) - (#xC9EF #x64AB) - (#xC9F0 #x6B66) - (#xC9F1 #x821E) - (#xC9F2 #x8461) - (#xC9F3 #x856A) - (#xC9F4 #x90E8) - (#xC9F5 #x5C01) - (#xC9F6 #x6953) - (#xC9F7 #x98A8) - (#xC9F8 #x847A) - (#xC9F9 #x8557) - (#xC9FA #x4F0F) - (#xC9FB #x526F) - (#xC9FC #x5FA9) - (#xC9FD #x5E45) - (#xC9FE #x670D) - (#xCAA1 #x798F) - (#xCAA2 #x8179) - (#xCAA3 #x8907) - (#xCAA4 #x8986) - (#xCAA5 #x6DF5) - (#xCAA6 #x5F17) - (#xCAA7 #x6255) - (#xCAA8 #x6CB8) - (#xCAA9 #x4ECF) - (#xCAAA #x7269) - (#xCAAB #x9B92) - (#xCAAC #x5206) - (#xCAAD #x543B) - (#xCAAE #x5674) - (#xCAAF #x58B3) - (#xCAB0 #x61A4) - (#xCAB1 #x626E) - (#xCAB2 #x711A) - (#xCAB3 #x596E) - (#xCAB4 #x7C89) - (#xCAB5 #x7CDE) - (#xCAB6 #x7D1B) - (#xCAB7 #x96F0) - (#xCAB8 #x6587) - (#xCAB9 #x805E) - (#xCABA #x4E19) - (#xCABB #x4F75) - (#xCABC #x5175) - (#xCABD #x5840) - (#xCABE #x5E63) - (#xCABF #x5E73) - (#xCAC0 #x5F0A) - (#xCAC1 #x67C4) - (#xCAC2 #x4E26) - (#xCAC3 #x853D) - (#xCAC4 #x9589) - (#xCAC5 #x965B) - (#xCAC6 #x7C73) - (#xCAC7 #x9801) - (#xCAC8 #x50FB) - (#xCAC9 #x58C1) - (#xCACA #x7656) - (#xCACB #x78A7) - (#xCACC #x5225) - (#xCACD #x77A5) - (#xCACE #x8511) - (#xCACF #x7B86) - (#xCAD0 #x504F) - (#xCAD1 #x5909) - (#xCAD2 #x7247) - (#xCAD3 #x7BC7) - (#xCAD4 #x7DE8) - (#xCAD5 #x8FBA) - (#xCAD6 #x8FD4) - (#xCAD7 #x904D) - (#xCAD8 #x4FBF) - (#xCAD9 #x52C9) - (#xCADA #x5A29) - (#xCADB #x5F01) - (#xCADC #x97AD) - (#xCADD #x4FDD) - (#xCADE #x8217) - (#xCADF #x92EA) - (#xCAE0 #x5703) - (#xCAE1 #x6355) - (#xCAE2 #x6B69) - (#xCAE3 #x752B) - (#xCAE4 #x88DC) - (#xCAE5 #x8F14) - (#xCAE6 #x7A42) - (#xCAE7 #x52DF) - (#xCAE8 #x5893) - (#xCAE9 #x6155) - (#xCAEA #x620A) - (#xCAEB #x66AE) - (#xCAEC #x6BCD) - (#xCAED #x7C3F) - (#xCAEE #x83E9) - (#xCAEF #x5023) - (#xCAF0 #x4FF8) - (#xCAF1 #x5305) - (#xCAF2 #x5446) - (#xCAF3 #x5831) - (#xCAF4 #x5949) - (#xCAF5 #x5B9D) - (#xCAF6 #x5CF0) - (#xCAF7 #x5CEF) - (#xCAF8 #x5D29) - (#xCAF9 #x5E96) - (#xCAFA #x62B1) - (#xCAFB #x6367) - (#xCAFC #x653E) - (#xCAFD #x65B9) - (#xCAFE #x670B) - (#xCBA1 #x6CD5) - (#xCBA2 #x6CE1) - (#xCBA3 #x70F9) - (#xCBA4 #x7832) - (#xCBA5 #x7E2B) - (#xCBA6 #x80DE) - (#xCBA7 #x82B3) - (#xCBA8 #x840C) - (#xCBA9 #x84EC) - (#xCBAA #x8702) - (#xCBAB #x8912) - (#xCBAC #x8A2A) - (#xCBAD #x8C4A) - (#xCBAE #x90A6) - (#xCBAF #x92D2) - (#xCBB0 #x98FD) - (#xCBB1 #x9CF3) - (#xCBB2 #x9D6C) - (#xCBB3 #x4E4F) - (#xCBB4 #x4EA1) - (#xCBB5 #x508D) - (#xCBB6 #x5256) - (#xCBB7 #x574A) - (#xCBB8 #x59A8) - (#xCBB9 #x5E3D) - (#xCBBA #x5FD8) - (#xCBBB #x5FD9) - (#xCBBC #x623F) - (#xCBBD #x66B4) - (#xCBBE #x671B) - (#xCBBF #x67D0) - (#xCBC0 #x68D2) - (#xCBC1 #x5192) - (#xCBC2 #x7D21) - (#xCBC3 #x80AA) - (#xCBC4 #x81A8) - (#xCBC5 #x8B00) - (#xCBC6 #x8C8C) - (#xCBC7 #x8CBF) - (#xCBC8 #x927E) - (#xCBC9 #x9632) - (#xCBCA #x5420) - (#xCBCB #x982C) - (#xCBCC #x5317) - (#xCBCD #x50D5) - (#xCBCE #x535C) - (#xCBCF #x58A8) - (#xCBD0 #x64B2) - (#xCBD1 #x6734) - (#xCBD2 #x7267) - (#xCBD3 #x7766) - (#xCBD4 #x7A46) - (#xCBD5 #x91E6) - (#xCBD6 #x52C3) - (#xCBD7 #x6CA1) - (#xCBD8 #x6B86) - (#xCBD9 #x5800) - (#xCBDA #x5E4C) - (#xCBDB #x5954) - (#xCBDC #x672C) - (#xCBDD #x7FFB) - (#xCBDE #x51E1) - (#xCBDF #x76C6) - (#xCBE0 #x6469) - (#xCBE1 #x78E8) - (#xCBE2 #x9B54) - (#xCBE3 #x9EBB) - (#xCBE4 #x57CB) - (#xCBE5 #x59B9) - (#xCBE6 #x6627) - (#xCBE7 #x679A) - (#xCBE8 #x6BCE) - (#xCBE9 #x54E9) - (#xCBEA #x69D9) - (#xCBEB #x5E55) - (#xCBEC #x819C) - (#xCBED #x6795) - (#xCBEE #x9BAA) - (#xCBEF #x67FE) - (#xCBF0 #x9C52) - (#xCBF1 #x685D) - (#xCBF2 #x4EA6) - (#xCBF3 #x4FE3) - (#xCBF4 #x53C8) - (#xCBF5 #x62B9) - (#xCBF6 #x672B) - (#xCBF7 #x6CAB) - (#xCBF8 #x8FC4) - (#xCBF9 #x4FAD) - (#xCBFA #x7E6D) - (#xCBFB #x9EBF) - (#xCBFC #x4E07) - (#xCBFD #x6162) - (#xCBFE #x6E80) - (#xCCA1 #x6F2B) - (#xCCA2 #x8513) - (#xCCA3 #x5473) - (#xCCA4 #x672A) - (#xCCA5 #x9B45) - (#xCCA6 #x5DF3) - (#xCCA7 #x7B95) - (#xCCA8 #x5CAC) - (#xCCA9 #x5BC6) - (#xCCAA #x871C) - (#xCCAB #x6E4A) - (#xCCAC #x84D1) - (#xCCAD #x7A14) - (#xCCAE #x8108) - (#xCCAF #x5999) - (#xCCB0 #x7C8D) - (#xCCB1 #x6C11) - (#xCCB2 #x7720) - (#xCCB3 #x52D9) - (#xCCB4 #x5922) - (#xCCB5 #x7121) - (#xCCB6 #x725F) - (#xCCB7 #x77DB) - (#xCCB8 #x9727) - (#xCCB9 #x9D61) - (#xCCBA #x690B) - (#xCCBB #x5A7F) - (#xCCBC #x5A18) - (#xCCBD #x51A5) - (#xCCBE #x540D) - (#xCCBF #x547D) - (#xCCC0 #x660E) - (#xCCC1 #x76DF) - (#xCCC2 #x8FF7) - (#xCCC3 #x9298) - (#xCCC4 #x9CF4) - (#xCCC5 #x59EA) - (#xCCC6 #x725D) - (#xCCC7 #x6EC5) - (#xCCC8 #x514D) - (#xCCC9 #x68C9) - (#xCCCA #x7DBF) - (#xCCCB #x7DEC) - (#xCCCC #x9762) - (#xCCCD #x9EBA) - (#xCCCE #x6478) - (#xCCCF #x6A21) - (#xCCD0 #x8302) - (#xCCD1 #x5984) - (#xCCD2 #x5B5F) - (#xCCD3 #x6BDB) - (#xCCD4 #x731B) - (#xCCD5 #x76F2) - (#xCCD6 #x7DB2) - (#xCCD7 #x8017) - (#xCCD8 #x8499) - (#xCCD9 #x5132) - (#xCCDA #x6728) - (#xCCDB #x9ED9) - (#xCCDC #x76EE) - (#xCCDD #x6762) - (#xCCDE #x52FF) - (#xCCDF #x9905) - (#xCCE0 #x5C24) - (#xCCE1 #x623B) - (#xCCE2 #x7C7E) - (#xCCE3 #x8CB0) - (#xCCE4 #x554F) - (#xCCE5 #x60B6) - (#xCCE6 #x7D0B) - (#xCCE7 #x9580) - (#xCCE8 #x5301) - (#xCCE9 #x4E5F) - (#xCCEA #x51B6) - (#xCCEB #x591C) - (#xCCEC #x723A) - (#xCCED #x8036) - (#xCCEE #x91CE) - (#xCCEF #x5F25) - (#xCCF0 #x77E2) - (#xCCF1 #x5384) - (#xCCF2 #x5F79) - (#xCCF3 #x7D04) - (#xCCF4 #x85AC) - (#xCCF5 #x8A33) - (#xCCF6 #x8E8D) - (#xCCF7 #x9756) - (#xCCF8 #x67F3) - (#xCCF9 #x85AE) - (#xCCFA #x9453) - (#xCCFB #x6109) - (#xCCFC #x6108) - (#xCCFD #x6CB9) - (#xCCFE #x7652) - (#xCDA1 #x8AED) - (#xCDA2 #x8F38) - (#xCDA3 #x552F) - (#xCDA4 #x4F51) - (#xCDA5 #x512A) - (#xCDA6 #x52C7) - (#xCDA7 #x53CB) - (#xCDA8 #x5BA5) - (#xCDA9 #x5E7D) - (#xCDAA #x60A0) - (#xCDAB #x6182) - (#xCDAC #x63D6) - (#xCDAD #x6709) - (#xCDAE #x67DA) - (#xCDAF #x6E67) - (#xCDB0 #x6D8C) - (#xCDB1 #x7336) - (#xCDB2 #x7337) - (#xCDB3 #x7531) - (#xCDB4 #x7950) - (#xCDB5 #x88D5) - (#xCDB6 #x8A98) - (#xCDB7 #x904A) - (#xCDB8 #x9091) - (#xCDB9 #x90F5) - (#xCDBA #x96C4) - (#xCDBB #x878D) - (#xCDBC #x5915) - (#xCDBD #x4E88) - (#xCDBE #x4F59) - (#xCDBF #x4E0E) - (#xCDC0 #x8A89) - (#xCDC1 #x8F3F) - (#xCDC2 #x9810) - (#xCDC3 #x50AD) - (#xCDC4 #x5E7C) - (#xCDC5 #x5996) - (#xCDC6 #x5BB9) - (#xCDC7 #x5EB8) - (#xCDC8 #x63DA) - (#xCDC9 #x63FA) - (#xCDCA #x64C1) - (#xCDCB #x66DC) - (#xCDCC #x694A) - (#xCDCD #x69D8) - (#xCDCE #x6D0B) - (#xCDCF #x6EB6) - (#xCDD0 #x7194) - (#xCDD1 #x7528) - (#xCDD2 #x7AAF) - (#xCDD3 #x7F8A) - (#xCDD4 #x8000) - (#xCDD5 #x8449) - (#xCDD6 #x84C9) - (#xCDD7 #x8981) - (#xCDD8 #x8B21) - (#xCDD9 #x8E0A) - (#xCDDA #x9065) - (#xCDDB #x967D) - (#xCDDC #x990A) - (#xCDDD #x617E) - (#xCDDE #x6291) - (#xCDDF #x6B32) - (#xCDE0 #x6C83) - (#xCDE1 #x6D74) - (#xCDE2 #x7FCC) - (#xCDE3 #x7FFC) - (#xCDE4 #x6DC0) - (#xCDE5 #x7F85) - (#xCDE6 #x87BA) - (#xCDE7 #x88F8) - (#xCDE8 #x6765) - (#xCDE9 #x83B1) - (#xCDEA #x983C) - (#xCDEB #x96F7) - (#xCDEC #x6D1B) - (#xCDED #x7D61) - (#xCDEE #x843D) - (#xCDEF #x916A) - (#xCDF0 #x4E71) - (#xCDF1 #x5375) - (#xCDF2 #x5D50) - (#xCDF3 #x6B04) - (#xCDF4 #x6FEB) - (#xCDF5 #x85CD) - (#xCDF6 #x862D) - (#xCDF7 #x89A7) - (#xCDF8 #x5229) - (#xCDF9 #x540F) - (#xCDFA #x5C65) - (#xCDFB #x674E) - (#xCDFC #x68A8) - (#xCDFD #x7406) - (#xCDFE #x7483) - (#xCEA1 #x75E2) - (#xCEA2 #x88CF) - (#xCEA3 #x88E1) - (#xCEA4 #x91CC) - (#xCEA5 #x96E2) - (#xCEA6 #x9678) - (#xCEA7 #x5F8B) - (#xCEA8 #x7387) - (#xCEA9 #x7ACB) - (#xCEAA #x844E) - (#xCEAB #x63A0) - (#xCEAC #x7565) - (#xCEAD #x5289) - (#xCEAE #x6D41) - (#xCEAF #x6E9C) - (#xCEB0 #x7409) - (#xCEB1 #x7559) - (#xCEB2 #x786B) - (#xCEB3 #x7C92) - (#xCEB4 #x9686) - (#xCEB5 #x7ADC) - (#xCEB6 #x9F8D) - (#xCEB7 #x4FB6) - (#xCEB8 #x616E) - (#xCEB9 #x65C5) - (#xCEBA #x865C) - (#xCEBB #x4E86) - (#xCEBC #x4EAE) - (#xCEBD #x50DA) - (#xCEBE #x4E21) - (#xCEBF #x51CC) - (#xCEC0 #x5BEE) - (#xCEC1 #x6599) - (#xCEC2 #x6881) - (#xCEC3 #x6DBC) - (#xCEC4 #x731F) - (#xCEC5 #x7642) - (#xCEC6 #x77AD) - (#xCEC7 #x7A1C) - (#xCEC8 #x7CE7) - (#xCEC9 #x826F) - (#xCECA #x8AD2) - (#xCECB #x907C) - (#xCECC #x91CF) - (#xCECD #x9675) - (#xCECE #x9818) - (#xCECF #x529B) - (#xCED0 #x7DD1) - (#xCED1 #x502B) - (#xCED2 #x5398) - (#xCED3 #x6797) - (#xCED4 #x6DCB) - (#xCED5 #x71D0) - (#xCED6 #x7433) - (#xCED7 #x81E8) - (#xCED8 #x8F2A) - (#xCED9 #x96A3) - (#xCEDA #x9C57) - (#xCEDB #x9E9F) - (#xCEDC #x7460) - (#xCEDD #x5841) - (#xCEDE #x6D99) - (#xCEDF #x7D2F) - (#xCEE0 #x985E) - (#xCEE1 #x4EE4) - (#xCEE2 #x4F36) - (#xCEE3 #x4F8B) - (#xCEE4 #x51B7) - (#xCEE5 #x52B1) - (#xCEE6 #x5DBA) - (#xCEE7 #x601C) - (#xCEE8 #x73B2) - (#xCEE9 #x793C) - (#xCEEA #x82D3) - (#xCEEB #x9234) - (#xCEEC #x96B7) - (#xCEED #x96F6) - (#xCEEE #x970A) - (#xCEEF #x9E97) - (#xCEF0 #x9F62) - (#xCEF1 #x66A6) - (#xCEF2 #x6B74) - (#xCEF3 #x5217) - (#xCEF4 #x52A3) - (#xCEF5 #x70C8) - (#xCEF6 #x88C2) - (#xCEF7 #x5EC9) - (#xCEF8 #x604B) - (#xCEF9 #x6190) - (#xCEFA #x6F23) - (#xCEFB #x7149) - (#xCEFC #x7C3E) - (#xCEFD #x7DF4) - (#xCEFE #x806F) - (#xCFA1 #x84EE) - (#xCFA2 #x9023) - (#xCFA3 #x932C) - (#xCFA4 #x5442) - (#xCFA5 #x9B6F) - (#xCFA6 #x6AD3) - (#xCFA7 #x7089) - (#xCFA8 #x8CC2) - (#xCFA9 #x8DEF) - (#xCFAA #x9732) - (#xCFAB #x52B4) - (#xCFAC #x5A41) - (#xCFAD #x5ECA) - (#xCFAE #x5F04) - (#xCFAF #x6717) - (#xCFB0 #x697C) - (#xCFB1 #x6994) - (#xCFB2 #x6D6A) - (#xCFB3 #x6F0F) - (#xCFB4 #x7262) - (#xCFB5 #x72FC) - (#xCFB6 #x7BED) - (#xCFB7 #x8001) - (#xCFB8 #x807E) - (#xCFB9 #x874B) - (#xCFBA #x90CE) - (#xCFBB #x516D) - (#xCFBC #x9E93) - (#xCFBD #x7984) - (#xCFBE #x808B) - (#xCFBF #x9332) - (#xCFC0 #x8AD6) - (#xCFC1 #x502D) - (#xCFC2 #x548C) - (#xCFC3 #x8A71) - (#xCFC4 #x6B6A) - (#xCFC5 #x8CC4) - (#xCFC6 #x8107) - (#xCFC7 #x60D1) - (#xCFC8 #x67A0) - (#xCFC9 #x9DF2) - (#xCFCA #x4E99) - (#xCFCB #x4E98) - (#xCFCC #x9C10) - (#xCFCD #x8A6B) - (#xCFCE #x85C1) - (#xCFCF #x8568) - (#xCFD0 #x6900) - (#xCFD1 #x6E7E) - (#xCFD2 #x7897) - (#xCFD3 #x8155) - (#xD0A1 #x5F0C) - (#xD0A2 #x4E10) - (#xD0A3 #x4E15) - (#xD0A4 #x4E2A) - (#xD0A5 #x4E31) - (#xD0A6 #x4E36) - (#xD0A7 #x4E3C) - (#xD0A8 #x4E3F) - (#xD0A9 #x4E42) - (#xD0AA #x4E56) - (#xD0AB #x4E58) - (#xD0AC #x4E82) - (#xD0AD #x4E85) - (#xD0AE #x8C6B) - (#xD0AF #x4E8A) - (#xD0B0 #x8212) - (#xD0B1 #x5F0D) - (#xD0B2 #x4E8E) - (#xD0B3 #x4E9E) - (#xD0B4 #x4E9F) - (#xD0B5 #x4EA0) - (#xD0B6 #x4EA2) - (#xD0B7 #x4EB0) - (#xD0B8 #x4EB3) - (#xD0B9 #x4EB6) - (#xD0BA #x4ECE) - (#xD0BB #x4ECD) - (#xD0BC #x4EC4) - (#xD0BD #x4EC6) - (#xD0BE #x4EC2) - (#xD0BF #x4ED7) - (#xD0C0 #x4EDE) - (#xD0C1 #x4EED) - (#xD0C2 #x4EDF) - (#xD0C3 #x4EF7) - (#xD0C4 #x4F09) - (#xD0C5 #x4F5A) - (#xD0C6 #x4F30) - (#xD0C7 #x4F5B) - (#xD0C8 #x4F5D) - (#xD0C9 #x4F57) - (#xD0CA #x4F47) - (#xD0CB #x4F76) - (#xD0CC #x4F88) - (#xD0CD #x4F8F) - (#xD0CE #x4F98) - (#xD0CF #x4F7B) - (#xD0D0 #x4F69) - (#xD0D1 #x4F70) - (#xD0D2 #x4F91) - (#xD0D3 #x4F6F) - (#xD0D4 #x4F86) - (#xD0D5 #x4F96) - (#xD0D6 #x5118) - (#xD0D7 #x4FD4) - (#xD0D8 #x4FDF) - (#xD0D9 #x4FCE) - (#xD0DA #x4FD8) - (#xD0DB #x4FDB) - (#xD0DC #x4FD1) - (#xD0DD #x4FDA) - (#xD0DE #x4FD0) - (#xD0DF #x4FE4) - (#xD0E0 #x4FE5) - (#xD0E1 #x501A) - (#xD0E2 #x5028) - (#xD0E3 #x5014) - (#xD0E4 #x502A) - (#xD0E5 #x5025) - (#xD0E6 #x5005) - (#xD0E7 #x4F1C) - (#xD0E8 #x4FF6) - (#xD0E9 #x5021) - (#xD0EA #x5029) - (#xD0EB #x502C) - (#xD0EC #x4FFE) - (#xD0ED #x4FEF) - (#xD0EE #x5011) - (#xD0EF #x5006) - (#xD0F0 #x5043) - (#xD0F1 #x5047) - (#xD0F2 #x6703) - (#xD0F3 #x5055) - (#xD0F4 #x5050) - (#xD0F5 #x5048) - (#xD0F6 #x505A) - (#xD0F7 #x5056) - (#xD0F8 #x506C) - (#xD0F9 #x5078) - (#xD0FA #x5080) - (#xD0FB #x509A) - (#xD0FC #x5085) - (#xD0FD #x50B4) - (#xD0FE #x50B2) - (#xD1A1 #x50C9) - (#xD1A2 #x50CA) - (#xD1A3 #x50B3) - (#xD1A4 #x50C2) - (#xD1A5 #x50D6) - (#xD1A6 #x50DE) - (#xD1A7 #x50E5) - (#xD1A8 #x50ED) - (#xD1A9 #x50E3) - (#xD1AA #x50EE) - (#xD1AB #x50F9) - (#xD1AC #x50F5) - (#xD1AD #x5109) - (#xD1AE #x5101) - (#xD1AF #x5102) - (#xD1B0 #x5116) - (#xD1B1 #x5115) - (#xD1B2 #x5114) - (#xD1B3 #x511A) - (#xD1B4 #x5121) - (#xD1B5 #x513A) - (#xD1B6 #x5137) - (#xD1B7 #x513C) - (#xD1B8 #x513B) - (#xD1B9 #x513F) - (#xD1BA #x5140) - (#xD1BB #x5152) - (#xD1BC #x514C) - (#xD1BD #x5154) - (#xD1BE #x5162) - (#xD1BF #x7AF8) - (#xD1C0 #x5169) - (#xD1C1 #x516A) - (#xD1C2 #x516E) - (#xD1C3 #x5180) - (#xD1C4 #x5182) - (#xD1C5 #x56D8) - (#xD1C6 #x518C) - (#xD1C7 #x5189) - (#xD1C8 #x518F) - (#xD1C9 #x5191) - (#xD1CA #x5193) - (#xD1CB #x5195) - (#xD1CC #x5196) - (#xD1CD #x51A4) - (#xD1CE #x51A6) - (#xD1CF #x51A2) - (#xD1D0 #x51A9) - (#xD1D1 #x51AA) - (#xD1D2 #x51AB) - (#xD1D3 #x51B3) - (#xD1D4 #x51B1) - (#xD1D5 #x51B2) - (#xD1D6 #x51B0) - (#xD1D7 #x51B5) - (#xD1D8 #x51BD) - (#xD1D9 #x51C5) - (#xD1DA #x51C9) - (#xD1DB #x51DB) - (#xD1DC #x51E0) - (#xD1DD #x8655) - (#xD1DE #x51E9) - (#xD1DF #x51ED) - (#xD1E0 #x51F0) - (#xD1E1 #x51F5) - (#xD1E2 #x51FE) - (#xD1E3 #x5204) - (#xD1E4 #x520B) - (#xD1E5 #x5214) - (#xD1E6 #x520E) - (#xD1E7 #x5227) - (#xD1E8 #x522A) - (#xD1E9 #x522E) - (#xD1EA #x5233) - (#xD1EB #x5239) - (#xD1EC #x524F) - (#xD1ED #x5244) - (#xD1EE #x524B) - (#xD1EF #x524C) - (#xD1F0 #x525E) - (#xD1F1 #x5254) - (#xD1F2 #x526A) - (#xD1F3 #x5274) - (#xD1F4 #x5269) - (#xD1F5 #x5273) - (#xD1F6 #x527F) - (#xD1F7 #x527D) - (#xD1F8 #x528D) - (#xD1F9 #x5294) - (#xD1FA #x5292) - (#xD1FB #x5271) - (#xD1FC #x5288) - (#xD1FD #x5291) - (#xD1FE #x8FA8) - (#xD2A1 #x8FA7) - (#xD2A2 #x52AC) - (#xD2A3 #x52AD) - (#xD2A4 #x52BC) - (#xD2A5 #x52B5) - (#xD2A6 #x52C1) - (#xD2A7 #x52CD) - (#xD2A8 #x52D7) - (#xD2A9 #x52DE) - (#xD2AA #x52E3) - (#xD2AB #x52E6) - (#xD2AC #x98ED) - (#xD2AD #x52E0) - (#xD2AE #x52F3) - (#xD2AF #x52F5) - (#xD2B0 #x52F8) - (#xD2B1 #x52F9) - (#xD2B2 #x5306) - (#xD2B3 #x5308) - (#xD2B4 #x7538) - (#xD2B5 #x530D) - (#xD2B6 #x5310) - (#xD2B7 #x530F) - (#xD2B8 #x5315) - (#xD2B9 #x531A) - (#xD2BA #x5323) - (#xD2BB #x532F) - (#xD2BC #x5331) - (#xD2BD #x5333) - (#xD2BE #x5338) - (#xD2BF #x5340) - (#xD2C0 #x5346) - (#xD2C1 #x5345) - (#xD2C2 #x4E17) - (#xD2C3 #x5349) - (#xD2C4 #x534D) - (#xD2C5 #x51D6) - (#xD2C6 #x535E) - (#xD2C7 #x5369) - (#xD2C8 #x536E) - (#xD2C9 #x5918) - (#xD2CA #x537B) - (#xD2CB #x5377) - (#xD2CC #x5382) - (#xD2CD #x5396) - (#xD2CE #x53A0) - (#xD2CF #x53A6) - (#xD2D0 #x53A5) - (#xD2D1 #x53AE) - (#xD2D2 #x53B0) - (#xD2D3 #x53B6) - (#xD2D4 #x53C3) - (#xD2D5 #x7C12) - (#xD2D6 #x96D9) - (#xD2D7 #x53DF) - (#xD2D8 #x66FC) - (#xD2D9 #x71EE) - (#xD2DA #x53EE) - (#xD2DB #x53E8) - (#xD2DC #x53ED) - (#xD2DD #x53FA) - (#xD2DE #x5401) - (#xD2DF #x543D) - (#xD2E0 #x5440) - (#xD2E1 #x542C) - (#xD2E2 #x542D) - (#xD2E3 #x543C) - (#xD2E4 #x542E) - (#xD2E5 #x5436) - (#xD2E6 #x5429) - (#xD2E7 #x541D) - (#xD2E8 #x544E) - (#xD2E9 #x548F) - (#xD2EA #x5475) - (#xD2EB #x548E) - (#xD2EC #x545F) - (#xD2ED #x5471) - (#xD2EE #x5477) - (#xD2EF #x5470) - (#xD2F0 #x5492) - (#xD2F1 #x547B) - (#xD2F2 #x5480) - (#xD2F3 #x5476) - (#xD2F4 #x5484) - (#xD2F5 #x5490) - (#xD2F6 #x5486) - (#xD2F7 #x54C7) - (#xD2F8 #x54A2) - (#xD2F9 #x54B8) - (#xD2FA #x54A5) - (#xD2FB #x54AC) - (#xD2FC #x54C4) - (#xD2FD #x54C8) - (#xD2FE #x54A8) - (#xD3A1 #x54AB) - (#xD3A2 #x54C2) - (#xD3A3 #x54A4) - (#xD3A4 #x54BE) - (#xD3A5 #x54BC) - (#xD3A6 #x54D8) - (#xD3A7 #x54E5) - (#xD3A8 #x54E6) - (#xD3A9 #x550F) - (#xD3AA #x5514) - (#xD3AB #x54FD) - (#xD3AC #x54EE) - (#xD3AD #x54ED) - (#xD3AE #x54FA) - (#xD3AF #x54E2) - (#xD3B0 #x5539) - (#xD3B1 #x5540) - (#xD3B2 #x5563) - (#xD3B3 #x554C) - (#xD3B4 #x552E) - (#xD3B5 #x555C) - (#xD3B6 #x5545) - (#xD3B7 #x5556) - (#xD3B8 #x5557) - (#xD3B9 #x5538) - (#xD3BA #x5533) - (#xD3BB #x555D) - (#xD3BC #x5599) - (#xD3BD #x5580) - (#xD3BE #x54AF) - (#xD3BF #x558A) - (#xD3C0 #x559F) - (#xD3C1 #x557B) - (#xD3C2 #x557E) - (#xD3C3 #x5598) - (#xD3C4 #x559E) - (#xD3C5 #x55AE) - (#xD3C6 #x557C) - (#xD3C7 #x5583) - (#xD3C8 #x55A9) - (#xD3C9 #x5587) - (#xD3CA #x55A8) - (#xD3CB #x55DA) - (#xD3CC #x55C5) - (#xD3CD #x55DF) - (#xD3CE #x55C4) - (#xD3CF #x55DC) - (#xD3D0 #x55E4) - (#xD3D1 #x55D4) - (#xD3D2 #x5614) - (#xD3D3 #x55F7) - (#xD3D4 #x5616) - (#xD3D5 #x55FE) - (#xD3D6 #x55FD) - (#xD3D7 #x561B) - (#xD3D8 #x55F9) - (#xD3D9 #x564E) - (#xD3DA #x5650) - (#xD3DB #x71DF) - (#xD3DC #x5634) - (#xD3DD #x5636) - (#xD3DE #x5632) - (#xD3DF #x5638) - (#xD3E0 #x566B) - (#xD3E1 #x5664) - (#xD3E2 #x562F) - (#xD3E3 #x566C) - (#xD3E4 #x566A) - (#xD3E5 #x5686) - (#xD3E6 #x5680) - (#xD3E7 #x568A) - (#xD3E8 #x56A0) - (#xD3E9 #x5694) - (#xD3EA #x568F) - (#xD3EB #x56A5) - (#xD3EC #x56AE) - (#xD3ED #x56B6) - (#xD3EE #x56B4) - (#xD3EF #x56C2) - (#xD3F0 #x56BC) - (#xD3F1 #x56C1) - (#xD3F2 #x56C3) - (#xD3F3 #x56C0) - (#xD3F4 #x56C8) - (#xD3F5 #x56CE) - (#xD3F6 #x56D1) - (#xD3F7 #x56D3) - (#xD3F8 #x56D7) - (#xD3F9 #x56EE) - (#xD3FA #x56F9) - (#xD3FB #x5700) - (#xD3FC #x56FF) - (#xD3FD #x5704) - (#xD3FE #x5709) - (#xD4A1 #x5708) - (#xD4A2 #x570B) - (#xD4A3 #x570D) - (#xD4A4 #x5713) - (#xD4A5 #x5718) - (#xD4A6 #x5716) - (#xD4A7 #x55C7) - (#xD4A8 #x571C) - (#xD4A9 #x5726) - (#xD4AA #x5737) - (#xD4AB #x5738) - (#xD4AC #x574E) - (#xD4AD #x573B) - (#xD4AE #x5740) - (#xD4AF #x574F) - (#xD4B0 #x5769) - (#xD4B1 #x57C0) - (#xD4B2 #x5788) - (#xD4B3 #x5761) - (#xD4B4 #x577F) - (#xD4B5 #x5789) - (#xD4B6 #x5793) - (#xD4B7 #x57A0) - (#xD4B8 #x57B3) - (#xD4B9 #x57A4) - (#xD4BA #x57AA) - (#xD4BB #x57B0) - (#xD4BC #x57C3) - (#xD4BD #x57C6) - (#xD4BE #x57D4) - (#xD4BF #x57D2) - (#xD4C0 #x57D3) - (#xD4C1 #x580A) - (#xD4C2 #x57D6) - (#xD4C3 #x57E3) - (#xD4C4 #x580B) - (#xD4C5 #x5819) - (#xD4C6 #x581D) - (#xD4C7 #x5872) - (#xD4C8 #x5821) - (#xD4C9 #x5862) - (#xD4CA #x584B) - (#xD4CB #x5870) - (#xD4CC #x6BC0) - (#xD4CD #x5852) - (#xD4CE #x583D) - (#xD4CF #x5879) - (#xD4D0 #x5885) - (#xD4D1 #x58B9) - (#xD4D2 #x589F) - (#xD4D3 #x58AB) - (#xD4D4 #x58BA) - (#xD4D5 #x58DE) - (#xD4D6 #x58BB) - (#xD4D7 #x58B8) - (#xD4D8 #x58AE) - (#xD4D9 #x58C5) - (#xD4DA #x58D3) - (#xD4DB #x58D1) - (#xD4DC #x58D7) - (#xD4DD #x58D9) - (#xD4DE #x58D8) - (#xD4DF #x58E5) - (#xD4E0 #x58DC) - (#xD4E1 #x58E4) - (#xD4E2 #x58DF) - (#xD4E3 #x58EF) - (#xD4E4 #x58FA) - (#xD4E5 #x58F9) - (#xD4E6 #x58FB) - (#xD4E7 #x58FC) - (#xD4E8 #x58FD) - (#xD4E9 #x5902) - (#xD4EA #x590A) - (#xD4EB #x5910) - (#xD4EC #x591B) - (#xD4ED #x68A6) - (#xD4EE #x5925) - (#xD4EF #x592C) - (#xD4F0 #x592D) - (#xD4F1 #x5932) - (#xD4F2 #x5938) - (#xD4F3 #x593E) - (#xD4F4 #x7AD2) - (#xD4F5 #x5955) - (#xD4F6 #x5950) - (#xD4F7 #x594E) - (#xD4F8 #x595A) - (#xD4F9 #x5958) - (#xD4FA #x5962) - (#xD4FB #x5960) - (#xD4FC #x5967) - (#xD4FD #x596C) - (#xD4FE #x5969) - (#xD5A1 #x5978) - (#xD5A2 #x5981) - (#xD5A3 #x599D) - (#xD5A4 #x4F5E) - (#xD5A5 #x4FAB) - (#xD5A6 #x59A3) - (#xD5A7 #x59B2) - (#xD5A8 #x59C6) - (#xD5A9 #x59E8) - (#xD5AA #x59DC) - (#xD5AB #x598D) - (#xD5AC #x59D9) - (#xD5AD #x59DA) - (#xD5AE #x5A25) - (#xD5AF #x5A1F) - (#xD5B0 #x5A11) - (#xD5B1 #x5A1C) - (#xD5B2 #x5A09) - (#xD5B3 #x5A1A) - (#xD5B4 #x5A40) - (#xD5B5 #x5A6C) - (#xD5B6 #x5A49) - (#xD5B7 #x5A35) - (#xD5B8 #x5A36) - (#xD5B9 #x5A62) - (#xD5BA #x5A6A) - (#xD5BB #x5A9A) - (#xD5BC #x5ABC) - (#xD5BD #x5ABE) - (#xD5BE #x5ACB) - (#xD5BF #x5AC2) - (#xD5C0 #x5ABD) - (#xD5C1 #x5AE3) - (#xD5C2 #x5AD7) - (#xD5C3 #x5AE6) - (#xD5C4 #x5AE9) - (#xD5C5 #x5AD6) - (#xD5C6 #x5AFA) - (#xD5C7 #x5AFB) - (#xD5C8 #x5B0C) - (#xD5C9 #x5B0B) - (#xD5CA #x5B16) - (#xD5CB #x5B32) - (#xD5CC #x5AD0) - (#xD5CD #x5B2A) - (#xD5CE #x5B36) - (#xD5CF #x5B3E) - (#xD5D0 #x5B43) - (#xD5D1 #x5B45) - (#xD5D2 #x5B40) - (#xD5D3 #x5B51) - (#xD5D4 #x5B55) - (#xD5D5 #x5B5A) - (#xD5D6 #x5B5B) - (#xD5D7 #x5B65) - (#xD5D8 #x5B69) - (#xD5D9 #x5B70) - (#xD5DA #x5B73) - (#xD5DB #x5B75) - (#xD5DC #x5B78) - (#xD5DD #x6588) - (#xD5DE #x5B7A) - (#xD5DF #x5B80) - (#xD5E0 #x5B83) - (#xD5E1 #x5BA6) - (#xD5E2 #x5BB8) - (#xD5E3 #x5BC3) - (#xD5E4 #x5BC7) - (#xD5E5 #x5BC9) - (#xD5E6 #x5BD4) - (#xD5E7 #x5BD0) - (#xD5E8 #x5BE4) - (#xD5E9 #x5BE6) - (#xD5EA #x5BE2) - (#xD5EB #x5BDE) - (#xD5EC #x5BE5) - (#xD5ED #x5BEB) - (#xD5EE #x5BF0) - (#xD5EF #x5BF6) - (#xD5F0 #x5BF3) - (#xD5F1 #x5C05) - (#xD5F2 #x5C07) - (#xD5F3 #x5C08) - (#xD5F4 #x5C0D) - (#xD5F5 #x5C13) - (#xD5F6 #x5C20) - (#xD5F7 #x5C22) - (#xD5F8 #x5C28) - (#xD5F9 #x5C38) - (#xD5FA #x5C39) - (#xD5FB #x5C41) - (#xD5FC #x5C46) - (#xD5FD #x5C4E) - (#xD5FE #x5C53) - (#xD6A1 #x5C50) - (#xD6A2 #x5C4F) - (#xD6A3 #x5B71) - (#xD6A4 #x5C6C) - (#xD6A5 #x5C6E) - (#xD6A6 #x4E62) - (#xD6A7 #x5C76) - (#xD6A8 #x5C79) - (#xD6A9 #x5C8C) - (#xD6AA #x5C91) - (#xD6AB #x5C94) - (#xD6AC #x599B) - (#xD6AD #x5CAB) - (#xD6AE #x5CBB) - (#xD6AF #x5CB6) - (#xD6B0 #x5CBC) - (#xD6B1 #x5CB7) - (#xD6B2 #x5CC5) - (#xD6B3 #x5CBE) - (#xD6B4 #x5CC7) - (#xD6B5 #x5CD9) - (#xD6B6 #x5CE9) - (#xD6B7 #x5CFD) - (#xD6B8 #x5CFA) - (#xD6B9 #x5CED) - (#xD6BA #x5D8C) - (#xD6BB #x5CEA) - (#xD6BC #x5D0B) - (#xD6BD #x5D15) - (#xD6BE #x5D17) - (#xD6BF #x5D5C) - (#xD6C0 #x5D1F) - (#xD6C1 #x5D1B) - (#xD6C2 #x5D11) - (#xD6C3 #x5D14) - (#xD6C4 #x5D22) - (#xD6C5 #x5D1A) - (#xD6C6 #x5D19) - (#xD6C7 #x5D18) - (#xD6C8 #x5D4C) - (#xD6C9 #x5D52) - (#xD6CA #x5D4E) - (#xD6CB #x5D4B) - (#xD6CC #x5D6C) - (#xD6CD #x5D73) - (#xD6CE #x5D76) - (#xD6CF #x5D87) - (#xD6D0 #x5D84) - (#xD6D1 #x5D82) - (#xD6D2 #x5DA2) - (#xD6D3 #x5D9D) - (#xD6D4 #x5DAC) - (#xD6D5 #x5DAE) - (#xD6D6 #x5DBD) - (#xD6D7 #x5D90) - (#xD6D8 #x5DB7) - (#xD6D9 #x5DBC) - (#xD6DA #x5DC9) - (#xD6DB #x5DCD) - (#xD6DC #x5DD3) - (#xD6DD #x5DD2) - (#xD6DE #x5DD6) - (#xD6DF #x5DDB) - (#xD6E0 #x5DEB) - (#xD6E1 #x5DF2) - (#xD6E2 #x5DF5) - (#xD6E3 #x5E0B) - (#xD6E4 #x5E1A) - (#xD6E5 #x5E19) - (#xD6E6 #x5E11) - (#xD6E7 #x5E1B) - (#xD6E8 #x5E36) - (#xD6E9 #x5E37) - (#xD6EA #x5E44) - (#xD6EB #x5E43) - (#xD6EC #x5E40) - (#xD6ED #x5E4E) - (#xD6EE #x5E57) - (#xD6EF #x5E54) - (#xD6F0 #x5E5F) - (#xD6F1 #x5E62) - (#xD6F2 #x5E64) - (#xD6F3 #x5E47) - (#xD6F4 #x5E75) - (#xD6F5 #x5E76) - (#xD6F6 #x5E7A) - (#xD6F7 #x9EBC) - (#xD6F8 #x5E7F) - (#xD6F9 #x5EA0) - (#xD6FA #x5EC1) - (#xD6FB #x5EC2) - (#xD6FC #x5EC8) - (#xD6FD #x5ED0) - (#xD6FE #x5ECF) - (#xD7A1 #x5ED6) - (#xD7A2 #x5EE3) - (#xD7A3 #x5EDD) - (#xD7A4 #x5EDA) - (#xD7A5 #x5EDB) - (#xD7A6 #x5EE2) - (#xD7A7 #x5EE1) - (#xD7A8 #x5EE8) - (#xD7A9 #x5EE9) - (#xD7AA #x5EEC) - (#xD7AB #x5EF1) - (#xD7AC #x5EF3) - (#xD7AD #x5EF0) - (#xD7AE #x5EF4) - (#xD7AF #x5EF8) - (#xD7B0 #x5EFE) - (#xD7B1 #x5F03) - (#xD7B2 #x5F09) - (#xD7B3 #x5F5D) - (#xD7B4 #x5F5C) - (#xD7B5 #x5F0B) - (#xD7B6 #x5F11) - (#xD7B7 #x5F16) - (#xD7B8 #x5F29) - (#xD7B9 #x5F2D) - (#xD7BA #x5F38) - (#xD7BB #x5F41) - (#xD7BC #x5F48) - (#xD7BD #x5F4C) - (#xD7BE #x5F4E) - (#xD7BF #x5F2F) - (#xD7C0 #x5F51) - (#xD7C1 #x5F56) - (#xD7C2 #x5F57) - (#xD7C3 #x5F59) - (#xD7C4 #x5F61) - (#xD7C5 #x5F6D) - (#xD7C6 #x5F73) - (#xD7C7 #x5F77) - (#xD7C8 #x5F83) - (#xD7C9 #x5F82) - (#xD7CA #x5F7F) - (#xD7CB #x5F8A) - (#xD7CC #x5F88) - (#xD7CD #x5F91) - (#xD7CE #x5F87) - (#xD7CF #x5F9E) - (#xD7D0 #x5F99) - (#xD7D1 #x5F98) - (#xD7D2 #x5FA0) - (#xD7D3 #x5FA8) - (#xD7D4 #x5FAD) - (#xD7D5 #x5FBC) - (#xD7D6 #x5FD6) - (#xD7D7 #x5FFB) - (#xD7D8 #x5FE4) - (#xD7D9 #x5FF8) - (#xD7DA #x5FF1) - (#xD7DB #x5FDD) - (#xD7DC #x60B3) - (#xD7DD #x5FFF) - (#xD7DE #x6021) - (#xD7DF #x6060) - (#xD7E0 #x6019) - (#xD7E1 #x6010) - (#xD7E2 #x6029) - (#xD7E3 #x600E) - (#xD7E4 #x6031) - (#xD7E5 #x601B) - (#xD7E6 #x6015) - (#xD7E7 #x602B) - (#xD7E8 #x6026) - (#xD7E9 #x600F) - (#xD7EA #x603A) - (#xD7EB #x605A) - (#xD7EC #x6041) - (#xD7ED #x606A) - (#xD7EE #x6077) - (#xD7EF #x605F) - (#xD7F0 #x604A) - (#xD7F1 #x6046) - (#xD7F2 #x604D) - (#xD7F3 #x6063) - (#xD7F4 #x6043) - (#xD7F5 #x6064) - (#xD7F6 #x6042) - (#xD7F7 #x606C) - (#xD7F8 #x606B) - (#xD7F9 #x6059) - (#xD7FA #x6081) - (#xD7FB #x608D) - (#xD7FC #x60E7) - (#xD7FD #x6083) - (#xD7FE #x609A) - (#xD8A1 #x6084) - (#xD8A2 #x609B) - (#xD8A3 #x6096) - (#xD8A4 #x6097) - (#xD8A5 #x6092) - (#xD8A6 #x60A7) - (#xD8A7 #x608B) - (#xD8A8 #x60E1) - (#xD8A9 #x60B8) - (#xD8AA #x60E0) - (#xD8AB #x60D3) - (#xD8AC #x60B4) - (#xD8AD #x5FF0) - (#xD8AE #x60BD) - (#xD8AF #x60C6) - (#xD8B0 #x60B5) - (#xD8B1 #x60D8) - (#xD8B2 #x614D) - (#xD8B3 #x6115) - (#xD8B4 #x6106) - (#xD8B5 #x60F6) - (#xD8B6 #x60F7) - (#xD8B7 #x6100) - (#xD8B8 #x60F4) - (#xD8B9 #x60FA) - (#xD8BA #x6103) - (#xD8BB #x6121) - (#xD8BC #x60FB) - (#xD8BD #x60F1) - (#xD8BE #x610D) - (#xD8BF #x610E) - (#xD8C0 #x6147) - (#xD8C1 #x613E) - (#xD8C2 #x6128) - (#xD8C3 #x6127) - (#xD8C4 #x614A) - (#xD8C5 #x613F) - (#xD8C6 #x613C) - (#xD8C7 #x612C) - (#xD8C8 #x6134) - (#xD8C9 #x613D) - (#xD8CA #x6142) - (#xD8CB #x6144) - (#xD8CC #x6173) - (#xD8CD #x6177) - (#xD8CE #x6158) - (#xD8CF #x6159) - (#xD8D0 #x615A) - (#xD8D1 #x616B) - (#xD8D2 #x6174) - (#xD8D3 #x616F) - (#xD8D4 #x6165) - (#xD8D5 #x6171) - (#xD8D6 #x615F) - (#xD8D7 #x615D) - (#xD8D8 #x6153) - (#xD8D9 #x6175) - (#xD8DA #x6199) - (#xD8DB #x6196) - (#xD8DC #x6187) - (#xD8DD #x61AC) - (#xD8DE #x6194) - (#xD8DF #x619A) - (#xD8E0 #x618A) - (#xD8E1 #x6191) - (#xD8E2 #x61AB) - (#xD8E3 #x61AE) - (#xD8E4 #x61CC) - (#xD8E5 #x61CA) - (#xD8E6 #x61C9) - (#xD8E7 #x61F7) - (#xD8E8 #x61C8) - (#xD8E9 #x61C3) - (#xD8EA #x61C6) - (#xD8EB #x61BA) - (#xD8EC #x61CB) - (#xD8ED #x7F79) - (#xD8EE #x61CD) - (#xD8EF #x61E6) - (#xD8F0 #x61E3) - (#xD8F1 #x61F6) - (#xD8F2 #x61FA) - (#xD8F3 #x61F4) - (#xD8F4 #x61FF) - (#xD8F5 #x61FD) - (#xD8F6 #x61FC) - (#xD8F7 #x61FE) - (#xD8F8 #x6200) - (#xD8F9 #x6208) - (#xD8FA #x6209) - (#xD8FB #x620D) - (#xD8FC #x620C) - (#xD8FD #x6214) - (#xD8FE #x621B) - (#xD9A1 #x621E) - (#xD9A2 #x6221) - (#xD9A3 #x622A) - (#xD9A4 #x622E) - (#xD9A5 #x6230) - (#xD9A6 #x6232) - (#xD9A7 #x6233) - (#xD9A8 #x6241) - (#xD9A9 #x624E) - (#xD9AA #x625E) - (#xD9AB #x6263) - (#xD9AC #x625B) - (#xD9AD #x6260) - (#xD9AE #x6268) - (#xD9AF #x627C) - (#xD9B0 #x6282) - (#xD9B1 #x6289) - (#xD9B2 #x627E) - (#xD9B3 #x6292) - (#xD9B4 #x6293) - (#xD9B5 #x6296) - (#xD9B6 #x62D4) - (#xD9B7 #x6283) - (#xD9B8 #x6294) - (#xD9B9 #x62D7) - (#xD9BA #x62D1) - (#xD9BB #x62BB) - (#xD9BC #x62CF) - (#xD9BD #x62FF) - (#xD9BE #x62C6) - (#xD9BF #x64D4) - (#xD9C0 #x62C8) - (#xD9C1 #x62DC) - (#xD9C2 #x62CC) - (#xD9C3 #x62CA) - (#xD9C4 #x62C2) - (#xD9C5 #x62C7) - (#xD9C6 #x629B) - (#xD9C7 #x62C9) - (#xD9C8 #x630C) - (#xD9C9 #x62EE) - (#xD9CA #x62F1) - (#xD9CB #x6327) - (#xD9CC #x6302) - (#xD9CD #x6308) - (#xD9CE #x62EF) - (#xD9CF #x62F5) - (#xD9D0 #x6350) - (#xD9D1 #x633E) - (#xD9D2 #x634D) - (#xD9D3 #x641C) - (#xD9D4 #x634F) - (#xD9D5 #x6396) - (#xD9D6 #x638E) - (#xD9D7 #x6380) - (#xD9D8 #x63AB) - (#xD9D9 #x6376) - (#xD9DA #x63A3) - (#xD9DB #x638F) - (#xD9DC #x6389) - (#xD9DD #x639F) - (#xD9DE #x63B5) - (#xD9DF #x636B) - (#xD9E0 #x6369) - (#xD9E1 #x63BE) - (#xD9E2 #x63E9) - (#xD9E3 #x63C0) - (#xD9E4 #x63C6) - (#xD9E5 #x63E3) - (#xD9E6 #x63C9) - (#xD9E7 #x63D2) - (#xD9E8 #x63F6) - (#xD9E9 #x63C4) - (#xD9EA #x6416) - (#xD9EB #x6434) - (#xD9EC #x6406) - (#xD9ED #x6413) - (#xD9EE #x6426) - (#xD9EF #x6436) - (#xD9F0 #x651D) - (#xD9F1 #x6417) - (#xD9F2 #x6428) - (#xD9F3 #x640F) - (#xD9F4 #x6467) - (#xD9F5 #x646F) - (#xD9F6 #x6476) - (#xD9F7 #x644E) - (#xD9F8 #x652A) - (#xD9F9 #x6495) - (#xD9FA #x6493) - (#xD9FB #x64A5) - (#xD9FC #x64A9) - (#xD9FD #x6488) - (#xD9FE #x64BC) - (#xDAA1 #x64DA) - (#xDAA2 #x64D2) - (#xDAA3 #x64C5) - (#xDAA4 #x64C7) - (#xDAA5 #x64BB) - (#xDAA6 #x64D8) - (#xDAA7 #x64C2) - (#xDAA8 #x64F1) - (#xDAA9 #x64E7) - (#xDAAA #x8209) - (#xDAAB #x64E0) - (#xDAAC #x64E1) - (#xDAAD #x62AC) - (#xDAAE #x64E3) - (#xDAAF #x64EF) - (#xDAB0 #x652C) - (#xDAB1 #x64F6) - (#xDAB2 #x64F4) - (#xDAB3 #x64F2) - (#xDAB4 #x64FA) - (#xDAB5 #x6500) - (#xDAB6 #x64FD) - (#xDAB7 #x6518) - (#xDAB8 #x651C) - (#xDAB9 #x6505) - (#xDABA #x6524) - (#xDABB #x6523) - (#xDABC #x652B) - (#xDABD #x6534) - (#xDABE #x6535) - (#xDABF #x6537) - (#xDAC0 #x6536) - (#xDAC1 #x6538) - (#xDAC2 #x754B) - (#xDAC3 #x6548) - (#xDAC4 #x6556) - (#xDAC5 #x6555) - (#xDAC6 #x654D) - (#xDAC7 #x6558) - (#xDAC8 #x655E) - (#xDAC9 #x655D) - (#xDACA #x6572) - (#xDACB #x6578) - (#xDACC #x6582) - (#xDACD #x6583) - (#xDACE #x8B8A) - (#xDACF #x659B) - (#xDAD0 #x659F) - (#xDAD1 #x65AB) - (#xDAD2 #x65B7) - (#xDAD3 #x65C3) - (#xDAD4 #x65C6) - (#xDAD5 #x65C1) - (#xDAD6 #x65C4) - (#xDAD7 #x65CC) - (#xDAD8 #x65D2) - (#xDAD9 #x65DB) - (#xDADA #x65D9) - (#xDADB #x65E0) - (#xDADC #x65E1) - (#xDADD #x65F1) - (#xDADE #x6772) - (#xDADF #x660A) - (#xDAE0 #x6603) - (#xDAE1 #x65FB) - (#xDAE2 #x6773) - (#xDAE3 #x6635) - (#xDAE4 #x6636) - (#xDAE5 #x6634) - (#xDAE6 #x661C) - (#xDAE7 #x664F) - (#xDAE8 #x6644) - (#xDAE9 #x6649) - (#xDAEA #x6641) - (#xDAEB #x665E) - (#xDAEC #x665D) - (#xDAED #x6664) - (#xDAEE #x6667) - (#xDAEF #x6668) - (#xDAF0 #x665F) - (#xDAF1 #x6662) - (#xDAF2 #x6670) - (#xDAF3 #x6683) - (#xDAF4 #x6688) - (#xDAF5 #x668E) - (#xDAF6 #x6689) - (#xDAF7 #x6684) - (#xDAF8 #x6698) - (#xDAF9 #x669D) - (#xDAFA #x66C1) - (#xDAFB #x66B9) - (#xDAFC #x66C9) - (#xDAFD #x66BE) - (#xDAFE #x66BC) - (#xDBA1 #x66C4) - (#xDBA2 #x66B8) - (#xDBA3 #x66D6) - (#xDBA4 #x66DA) - (#xDBA5 #x66E0) - (#xDBA6 #x663F) - (#xDBA7 #x66E6) - (#xDBA8 #x66E9) - (#xDBA9 #x66F0) - (#xDBAA #x66F5) - (#xDBAB #x66F7) - (#xDBAC #x670F) - (#xDBAD #x6716) - (#xDBAE #x671E) - (#xDBAF #x6726) - (#xDBB0 #x6727) - (#xDBB1 #x9738) - (#xDBB2 #x672E) - (#xDBB3 #x673F) - (#xDBB4 #x6736) - (#xDBB5 #x6741) - (#xDBB6 #x6738) - (#xDBB7 #x6737) - (#xDBB8 #x6746) - (#xDBB9 #x675E) - (#xDBBA #x6760) - (#xDBBB #x6759) - (#xDBBC #x6763) - (#xDBBD #x6764) - (#xDBBE #x6789) - (#xDBBF #x6770) - (#xDBC0 #x67A9) - (#xDBC1 #x677C) - (#xDBC2 #x676A) - (#xDBC3 #x678C) - (#xDBC4 #x678B) - (#xDBC5 #x67A6) - (#xDBC6 #x67A1) - (#xDBC7 #x6785) - (#xDBC8 #x67B7) - (#xDBC9 #x67EF) - (#xDBCA #x67B4) - (#xDBCB #x67EC) - (#xDBCC #x67B3) - (#xDBCD #x67E9) - (#xDBCE #x67B8) - (#xDBCF #x67E4) - (#xDBD0 #x67DE) - (#xDBD1 #x67DD) - (#xDBD2 #x67E2) - (#xDBD3 #x67EE) - (#xDBD4 #x67B9) - (#xDBD5 #x67CE) - (#xDBD6 #x67C6) - (#xDBD7 #x67E7) - (#xDBD8 #x6A9C) - (#xDBD9 #x681E) - (#xDBDA #x6846) - (#xDBDB #x6829) - (#xDBDC #x6840) - (#xDBDD #x684D) - (#xDBDE #x6832) - (#xDBDF #x684E) - (#xDBE0 #x68B3) - (#xDBE1 #x682B) - (#xDBE2 #x6859) - (#xDBE3 #x6863) - (#xDBE4 #x6877) - (#xDBE5 #x687F) - (#xDBE6 #x689F) - (#xDBE7 #x688F) - (#xDBE8 #x68AD) - (#xDBE9 #x6894) - (#xDBEA #x689D) - (#xDBEB #x689B) - (#xDBEC #x6883) - (#xDBED #x6AAE) - (#xDBEE #x68B9) - (#xDBEF #x6874) - (#xDBF0 #x68B5) - (#xDBF1 #x68A0) - (#xDBF2 #x68BA) - (#xDBF3 #x690F) - (#xDBF4 #x688D) - (#xDBF5 #x687E) - (#xDBF6 #x6901) - (#xDBF7 #x68CA) - (#xDBF8 #x6908) - (#xDBF9 #x68D8) - (#xDBFA #x6922) - (#xDBFB #x6926) - (#xDBFC #x68E1) - (#xDBFD #x690C) - (#xDBFE #x68CD) - (#xDCA1 #x68D4) - (#xDCA2 #x68E7) - (#xDCA3 #x68D5) - (#xDCA4 #x6936) - (#xDCA5 #x6912) - (#xDCA6 #x6904) - (#xDCA7 #x68D7) - (#xDCA8 #x68E3) - (#xDCA9 #x6925) - (#xDCAA #x68F9) - (#xDCAB #x68E0) - (#xDCAC #x68EF) - (#xDCAD #x6928) - (#xDCAE #x692A) - (#xDCAF #x691A) - (#xDCB0 #x6923) - (#xDCB1 #x6921) - (#xDCB2 #x68C6) - (#xDCB3 #x6979) - (#xDCB4 #x6977) - (#xDCB5 #x695C) - (#xDCB6 #x6978) - (#xDCB7 #x696B) - (#xDCB8 #x6954) - (#xDCB9 #x697E) - (#xDCBA #x696E) - (#xDCBB #x6939) - (#xDCBC #x6974) - (#xDCBD #x693D) - (#xDCBE #x6959) - (#xDCBF #x6930) - (#xDCC0 #x6961) - (#xDCC1 #x695E) - (#xDCC2 #x695D) - (#xDCC3 #x6981) - (#xDCC4 #x696A) - (#xDCC5 #x69B2) - (#xDCC6 #x69AE) - (#xDCC7 #x69D0) - (#xDCC8 #x69BF) - (#xDCC9 #x69C1) - (#xDCCA #x69D3) - (#xDCCB #x69BE) - (#xDCCC #x69CE) - (#xDCCD #x5BE8) - (#xDCCE #x69CA) - (#xDCCF #x69DD) - (#xDCD0 #x69BB) - (#xDCD1 #x69C3) - (#xDCD2 #x69A7) - (#xDCD3 #x6A2E) - (#xDCD4 #x6991) - (#xDCD5 #x69A0) - (#xDCD6 #x699C) - (#xDCD7 #x6995) - (#xDCD8 #x69B4) - (#xDCD9 #x69DE) - (#xDCDA #x69E8) - (#xDCDB #x6A02) - (#xDCDC #x6A1B) - (#xDCDD #x69FF) - (#xDCDE #x6B0A) - (#xDCDF #x69F9) - (#xDCE0 #x69F2) - (#xDCE1 #x69E7) - (#xDCE2 #x6A05) - (#xDCE3 #x69B1) - (#xDCE4 #x6A1E) - (#xDCE5 #x69ED) - (#xDCE6 #x6A14) - (#xDCE7 #x69EB) - (#xDCE8 #x6A0A) - (#xDCE9 #x6A12) - (#xDCEA #x6AC1) - (#xDCEB #x6A23) - (#xDCEC #x6A13) - (#xDCED #x6A44) - (#xDCEE #x6A0C) - (#xDCEF #x6A72) - (#xDCF0 #x6A36) - (#xDCF1 #x6A78) - (#xDCF2 #x6A47) - (#xDCF3 #x6A62) - (#xDCF4 #x6A59) - (#xDCF5 #x6A66) - (#xDCF6 #x6A48) - (#xDCF7 #x6A38) - (#xDCF8 #x6A22) - (#xDCF9 #x6A90) - (#xDCFA #x6A8D) - (#xDCFB #x6AA0) - (#xDCFC #x6A84) - (#xDCFD #x6AA2) - (#xDCFE #x6AA3) - (#xDDA1 #x6A97) - (#xDDA2 #x8617) - (#xDDA3 #x6ABB) - (#xDDA4 #x6AC3) - (#xDDA5 #x6AC2) - (#xDDA6 #x6AB8) - (#xDDA7 #x6AB3) - (#xDDA8 #x6AAC) - (#xDDA9 #x6ADE) - (#xDDAA #x6AD1) - (#xDDAB #x6ADF) - (#xDDAC #x6AAA) - (#xDDAD #x6ADA) - (#xDDAE #x6AEA) - (#xDDAF #x6AFB) - (#xDDB0 #x6B05) - (#xDDB1 #x8616) - (#xDDB2 #x6AFA) - (#xDDB3 #x6B12) - (#xDDB4 #x6B16) - (#xDDB5 #x9B31) - (#xDDB6 #x6B1F) - (#xDDB7 #x6B38) - (#xDDB8 #x6B37) - (#xDDB9 #x76DC) - (#xDDBA #x6B39) - (#xDDBB #x98EE) - (#xDDBC #x6B47) - (#xDDBD #x6B43) - (#xDDBE #x6B49) - (#xDDBF #x6B50) - (#xDDC0 #x6B59) - (#xDDC1 #x6B54) - (#xDDC2 #x6B5B) - (#xDDC3 #x6B5F) - (#xDDC4 #x6B61) - (#xDDC5 #x6B78) - (#xDDC6 #x6B79) - (#xDDC7 #x6B7F) - (#xDDC8 #x6B80) - (#xDDC9 #x6B84) - (#xDDCA #x6B83) - (#xDDCB #x6B8D) - (#xDDCC #x6B98) - (#xDDCD #x6B95) - (#xDDCE #x6B9E) - (#xDDCF #x6BA4) - (#xDDD0 #x6BAA) - (#xDDD1 #x6BAB) - (#xDDD2 #x6BAF) - (#xDDD3 #x6BB2) - (#xDDD4 #x6BB1) - (#xDDD5 #x6BB3) - (#xDDD6 #x6BB7) - (#xDDD7 #x6BBC) - (#xDDD8 #x6BC6) - (#xDDD9 #x6BCB) - (#xDDDA #x6BD3) - (#xDDDB #x6BDF) - (#xDDDC #x6BEC) - (#xDDDD #x6BEB) - (#xDDDE #x6BF3) - (#xDDDF #x6BEF) - (#xDDE0 #x9EBE) - (#xDDE1 #x6C08) - (#xDDE2 #x6C13) - (#xDDE3 #x6C14) - (#xDDE4 #x6C1B) - (#xDDE5 #x6C24) - (#xDDE6 #x6C23) - (#xDDE7 #x6C5E) - (#xDDE8 #x6C55) - (#xDDE9 #x6C62) - (#xDDEA #x6C6A) - (#xDDEB #x6C82) - (#xDDEC #x6C8D) - (#xDDED #x6C9A) - (#xDDEE #x6C81) - (#xDDEF #x6C9B) - (#xDDF0 #x6C7E) - (#xDDF1 #x6C68) - (#xDDF2 #x6C73) - (#xDDF3 #x6C92) - (#xDDF4 #x6C90) - (#xDDF5 #x6CC4) - (#xDDF6 #x6CF1) - (#xDDF7 #x6CD3) - (#xDDF8 #x6CBD) - (#xDDF9 #x6CD7) - (#xDDFA #x6CC5) - (#xDDFB #x6CDD) - (#xDDFC #x6CAE) - (#xDDFD #x6CB1) - (#xDDFE #x6CBE) - (#xDEA1 #x6CBA) - (#xDEA2 #x6CDB) - (#xDEA3 #x6CEF) - (#xDEA4 #x6CD9) - (#xDEA5 #x6CEA) - (#xDEA6 #x6D1F) - (#xDEA7 #x884D) - (#xDEA8 #x6D36) - (#xDEA9 #x6D2B) - (#xDEAA #x6D3D) - (#xDEAB #x6D38) - (#xDEAC #x6D19) - (#xDEAD #x6D35) - (#xDEAE #x6D33) - (#xDEAF #x6D12) - (#xDEB0 #x6D0C) - (#xDEB1 #x6D63) - (#xDEB2 #x6D93) - (#xDEB3 #x6D64) - (#xDEB4 #x6D5A) - (#xDEB5 #x6D79) - (#xDEB6 #x6D59) - (#xDEB7 #x6D8E) - (#xDEB8 #x6D95) - (#xDEB9 #x6FE4) - (#xDEBA #x6D85) - (#xDEBB #x6DF9) - (#xDEBC #x6E15) - (#xDEBD #x6E0A) - (#xDEBE #x6DB5) - (#xDEBF #x6DC7) - (#xDEC0 #x6DE6) - (#xDEC1 #x6DB8) - (#xDEC2 #x6DC6) - (#xDEC3 #x6DEC) - (#xDEC4 #x6DDE) - (#xDEC5 #x6DCC) - (#xDEC6 #x6DE8) - (#xDEC7 #x6DD2) - (#xDEC8 #x6DC5) - (#xDEC9 #x6DFA) - (#xDECA #x6DD9) - (#xDECB #x6DE4) - (#xDECC #x6DD5) - (#xDECD #x6DEA) - (#xDECE #x6DEE) - (#xDECF #x6E2D) - (#xDED0 #x6E6E) - (#xDED1 #x6E2E) - (#xDED2 #x6E19) - (#xDED3 #x6E72) - (#xDED4 #x6E5F) - (#xDED5 #x6E3E) - (#xDED6 #x6E23) - (#xDED7 #x6E6B) - (#xDED8 #x6E2B) - (#xDED9 #x6E76) - (#xDEDA #x6E4D) - (#xDEDB #x6E1F) - (#xDEDC #x6E43) - (#xDEDD #x6E3A) - (#xDEDE #x6E4E) - (#xDEDF #x6E24) - (#xDEE0 #x6EFF) - (#xDEE1 #x6E1D) - (#xDEE2 #x6E38) - (#xDEE3 #x6E82) - (#xDEE4 #x6EAA) - (#xDEE5 #x6E98) - (#xDEE6 #x6EC9) - (#xDEE7 #x6EB7) - (#xDEE8 #x6ED3) - (#xDEE9 #x6EBD) - (#xDEEA #x6EAF) - (#xDEEB #x6EC4) - (#xDEEC #x6EB2) - (#xDEED #x6ED4) - (#xDEEE #x6ED5) - (#xDEEF #x6E8F) - (#xDEF0 #x6EA5) - (#xDEF1 #x6EC2) - (#xDEF2 #x6E9F) - (#xDEF3 #x6F41) - (#xDEF4 #x6F11) - (#xDEF5 #x704C) - (#xDEF6 #x6EEC) - (#xDEF7 #x6EF8) - (#xDEF8 #x6EFE) - (#xDEF9 #x6F3F) - (#xDEFA #x6EF2) - (#xDEFB #x6F31) - (#xDEFC #x6EEF) - (#xDEFD #x6F32) - (#xDEFE #x6ECC) - (#xDFA1 #x6F3E) - (#xDFA2 #x6F13) - (#xDFA3 #x6EF7) - (#xDFA4 #x6F86) - (#xDFA5 #x6F7A) - (#xDFA6 #x6F78) - (#xDFA7 #x6F81) - (#xDFA8 #x6F80) - (#xDFA9 #x6F6F) - (#xDFAA #x6F5B) - (#xDFAB #x6FF3) - (#xDFAC #x6F6D) - (#xDFAD #x6F82) - (#xDFAE #x6F7C) - (#xDFAF #x6F58) - (#xDFB0 #x6F8E) - (#xDFB1 #x6F91) - (#xDFB2 #x6FC2) - (#xDFB3 #x6F66) - (#xDFB4 #x6FB3) - (#xDFB5 #x6FA3) - (#xDFB6 #x6FA1) - (#xDFB7 #x6FA4) - (#xDFB8 #x6FB9) - (#xDFB9 #x6FC6) - (#xDFBA #x6FAA) - (#xDFBB #x6FDF) - (#xDFBC #x6FD5) - (#xDFBD #x6FEC) - (#xDFBE #x6FD4) - (#xDFBF #x6FD8) - (#xDFC0 #x6FF1) - (#xDFC1 #x6FEE) - (#xDFC2 #x6FDB) - (#xDFC3 #x7009) - (#xDFC4 #x700B) - (#xDFC5 #x6FFA) - (#xDFC6 #x7011) - (#xDFC7 #x7001) - (#xDFC8 #x700F) - (#xDFC9 #x6FFE) - (#xDFCA #x701B) - (#xDFCB #x701A) - (#xDFCC #x6F74) - (#xDFCD #x701D) - (#xDFCE #x7018) - (#xDFCF #x701F) - (#xDFD0 #x7030) - (#xDFD1 #x703E) - (#xDFD2 #x7032) - (#xDFD3 #x7051) - (#xDFD4 #x7063) - (#xDFD5 #x7099) - (#xDFD6 #x7092) - (#xDFD7 #x70AF) - (#xDFD8 #x70F1) - (#xDFD9 #x70AC) - (#xDFDA #x70B8) - (#xDFDB #x70B3) - (#xDFDC #x70AE) - (#xDFDD #x70DF) - (#xDFDE #x70CB) - (#xDFDF #x70DD) - (#xDFE0 #x70D9) - (#xDFE1 #x7109) - (#xDFE2 #x70FD) - (#xDFE3 #x711C) - (#xDFE4 #x7119) - (#xDFE5 #x7165) - (#xDFE6 #x7155) - (#xDFE7 #x7188) - (#xDFE8 #x7166) - (#xDFE9 #x7162) - (#xDFEA #x714C) - (#xDFEB #x7156) - (#xDFEC #x716C) - (#xDFED #x718F) - (#xDFEE #x71FB) - (#xDFEF #x7184) - (#xDFF0 #x7195) - (#xDFF1 #x71A8) - (#xDFF2 #x71AC) - (#xDFF3 #x71D7) - (#xDFF4 #x71B9) - (#xDFF5 #x71BE) - (#xDFF6 #x71D2) - (#xDFF7 #x71C9) - (#xDFF8 #x71D4) - (#xDFF9 #x71CE) - (#xDFFA #x71E0) - (#xDFFB #x71EC) - (#xDFFC #x71E7) - (#xDFFD #x71F5) - (#xDFFE #x71FC) - (#xE0A1 #x71F9) - (#xE0A2 #x71FF) - (#xE0A3 #x720D) - (#xE0A4 #x7210) - (#xE0A5 #x721B) - (#xE0A6 #x7228) - (#xE0A7 #x722D) - (#xE0A8 #x722C) - (#xE0A9 #x7230) - (#xE0AA #x7232) - (#xE0AB #x723B) - (#xE0AC #x723C) - (#xE0AD #x723F) - (#xE0AE #x7240) - (#xE0AF #x7246) - (#xE0B0 #x724B) - (#xE0B1 #x7258) - (#xE0B2 #x7274) - (#xE0B3 #x727E) - (#xE0B4 #x7282) - (#xE0B5 #x7281) - (#xE0B6 #x7287) - (#xE0B7 #x7292) - (#xE0B8 #x7296) - (#xE0B9 #x72A2) - (#xE0BA #x72A7) - (#xE0BB #x72B9) - (#xE0BC #x72B2) - (#xE0BD #x72C3) - (#xE0BE #x72C6) - (#xE0BF #x72C4) - (#xE0C0 #x72CE) - (#xE0C1 #x72D2) - (#xE0C2 #x72E2) - (#xE0C3 #x72E0) - (#xE0C4 #x72E1) - (#xE0C5 #x72F9) - (#xE0C6 #x72F7) - (#xE0C7 #x500F) - (#xE0C8 #x7317) - (#xE0C9 #x730A) - (#xE0CA #x731C) - (#xE0CB #x7316) - (#xE0CC #x731D) - (#xE0CD #x7334) - (#xE0CE #x732F) - (#xE0CF #x7329) - (#xE0D0 #x7325) - (#xE0D1 #x733E) - (#xE0D2 #x734E) - (#xE0D3 #x734F) - (#xE0D4 #x9ED8) - (#xE0D5 #x7357) - (#xE0D6 #x736A) - (#xE0D7 #x7368) - (#xE0D8 #x7370) - (#xE0D9 #x7378) - (#xE0DA #x7375) - (#xE0DB #x737B) - (#xE0DC #x737A) - (#xE0DD #x73C8) - (#xE0DE #x73B3) - (#xE0DF #x73CE) - (#xE0E0 #x73BB) - (#xE0E1 #x73C0) - (#xE0E2 #x73E5) - (#xE0E3 #x73EE) - (#xE0E4 #x73DE) - (#xE0E5 #x74A2) - (#xE0E6 #x7405) - (#xE0E7 #x746F) - (#xE0E8 #x7425) - (#xE0E9 #x73F8) - (#xE0EA #x7432) - (#xE0EB #x743A) - (#xE0EC #x7455) - (#xE0ED #x743F) - (#xE0EE #x745F) - (#xE0EF #x7459) - (#xE0F0 #x7441) - (#xE0F1 #x745C) - (#xE0F2 #x7469) - (#xE0F3 #x7470) - (#xE0F4 #x7463) - (#xE0F5 #x746A) - (#xE0F6 #x7476) - (#xE0F7 #x747E) - (#xE0F8 #x748B) - (#xE0F9 #x749E) - (#xE0FA #x74A7) - (#xE0FB #x74CA) - (#xE0FC #x74CF) - (#xE0FD #x74D4) - (#xE0FE #x73F1) - (#xE1A1 #x74E0) - (#xE1A2 #x74E3) - (#xE1A3 #x74E7) - (#xE1A4 #x74E9) - (#xE1A5 #x74EE) - (#xE1A6 #x74F2) - (#xE1A7 #x74F0) - (#xE1A8 #x74F1) - (#xE1A9 #x74F8) - (#xE1AA #x74F7) - (#xE1AB #x7504) - (#xE1AC #x7503) - (#xE1AD #x7505) - (#xE1AE #x750C) - (#xE1AF #x750E) - (#xE1B0 #x750D) - (#xE1B1 #x7515) - (#xE1B2 #x7513) - (#xE1B3 #x751E) - (#xE1B4 #x7526) - (#xE1B5 #x752C) - (#xE1B6 #x753C) - (#xE1B7 #x7544) - (#xE1B8 #x754D) - (#xE1B9 #x754A) - (#xE1BA #x7549) - (#xE1BB #x755B) - (#xE1BC #x7546) - (#xE1BD #x755A) - (#xE1BE #x7569) - (#xE1BF #x7564) - (#xE1C0 #x7567) - (#xE1C1 #x756B) - (#xE1C2 #x756D) - (#xE1C3 #x7578) - (#xE1C4 #x7576) - (#xE1C5 #x7586) - (#xE1C6 #x7587) - (#xE1C7 #x7574) - (#xE1C8 #x758A) - (#xE1C9 #x7589) - (#xE1CA #x7582) - (#xE1CB #x7594) - (#xE1CC #x759A) - (#xE1CD #x759D) - (#xE1CE #x75A5) - (#xE1CF #x75A3) - (#xE1D0 #x75C2) - (#xE1D1 #x75B3) - (#xE1D2 #x75C3) - (#xE1D3 #x75B5) - (#xE1D4 #x75BD) - (#xE1D5 #x75B8) - (#xE1D6 #x75BC) - (#xE1D7 #x75B1) - (#xE1D8 #x75CD) - (#xE1D9 #x75CA) - (#xE1DA #x75D2) - (#xE1DB #x75D9) - (#xE1DC #x75E3) - (#xE1DD #x75DE) - (#xE1DE #x75FE) - (#xE1DF #x75FF) - (#xE1E0 #x75FC) - (#xE1E1 #x7601) - (#xE1E2 #x75F0) - (#xE1E3 #x75FA) - (#xE1E4 #x75F2) - (#xE1E5 #x75F3) - (#xE1E6 #x760B) - (#xE1E7 #x760D) - (#xE1E8 #x7609) - (#xE1E9 #x761F) - (#xE1EA #x7627) - (#xE1EB #x7620) - (#xE1EC #x7621) - (#xE1ED #x7622) - (#xE1EE #x7624) - (#xE1EF #x7634) - (#xE1F0 #x7630) - (#xE1F1 #x763B) - (#xE1F2 #x7647) - (#xE1F3 #x7648) - (#xE1F4 #x7646) - (#xE1F5 #x765C) - (#xE1F6 #x7658) - (#xE1F7 #x7661) - (#xE1F8 #x7662) - (#xE1F9 #x7668) - (#xE1FA #x7669) - (#xE1FB #x766A) - (#xE1FC #x7667) - (#xE1FD #x766C) - (#xE1FE #x7670) - (#xE2A1 #x7672) - (#xE2A2 #x7676) - (#xE2A3 #x7678) - (#xE2A4 #x767C) - (#xE2A5 #x7680) - (#xE2A6 #x7683) - (#xE2A7 #x7688) - (#xE2A8 #x768B) - (#xE2A9 #x768E) - (#xE2AA #x7696) - (#xE2AB #x7693) - (#xE2AC #x7699) - (#xE2AD #x769A) - (#xE2AE #x76B0) - (#xE2AF #x76B4) - (#xE2B0 #x76B8) - (#xE2B1 #x76B9) - (#xE2B2 #x76BA) - (#xE2B3 #x76C2) - (#xE2B4 #x76CD) - (#xE2B5 #x76D6) - (#xE2B6 #x76D2) - (#xE2B7 #x76DE) - (#xE2B8 #x76E1) - (#xE2B9 #x76E5) - (#xE2BA #x76E7) - (#xE2BB #x76EA) - (#xE2BC #x862F) - (#xE2BD #x76FB) - (#xE2BE #x7708) - (#xE2BF #x7707) - (#xE2C0 #x7704) - (#xE2C1 #x7729) - (#xE2C2 #x7724) - (#xE2C3 #x771E) - (#xE2C4 #x7725) - (#xE2C5 #x7726) - (#xE2C6 #x771B) - (#xE2C7 #x7737) - (#xE2C8 #x7738) - (#xE2C9 #x7747) - (#xE2CA #x775A) - (#xE2CB #x7768) - (#xE2CC #x776B) - (#xE2CD #x775B) - (#xE2CE #x7765) - (#xE2CF #x777F) - (#xE2D0 #x777E) - (#xE2D1 #x7779) - (#xE2D2 #x778E) - (#xE2D3 #x778B) - (#xE2D4 #x7791) - (#xE2D5 #x77A0) - (#xE2D6 #x779E) - (#xE2D7 #x77B0) - (#xE2D8 #x77B6) - (#xE2D9 #x77B9) - (#xE2DA #x77BF) - (#xE2DB #x77BC) - (#xE2DC #x77BD) - (#xE2DD #x77BB) - (#xE2DE #x77C7) - (#xE2DF #x77CD) - (#xE2E0 #x77D7) - (#xE2E1 #x77DA) - (#xE2E2 #x77DC) - (#xE2E3 #x77E3) - (#xE2E4 #x77EE) - (#xE2E5 #x77FC) - (#xE2E6 #x780C) - (#xE2E7 #x7812) - (#xE2E8 #x7926) - (#xE2E9 #x7820) - (#xE2EA #x792A) - (#xE2EB #x7845) - (#xE2EC #x788E) - (#xE2ED #x7874) - (#xE2EE #x7886) - (#xE2EF #x787C) - (#xE2F0 #x789A) - (#xE2F1 #x788C) - (#xE2F2 #x78A3) - (#xE2F3 #x78B5) - (#xE2F4 #x78AA) - (#xE2F5 #x78AF) - (#xE2F6 #x78D1) - (#xE2F7 #x78C6) - (#xE2F8 #x78CB) - (#xE2F9 #x78D4) - (#xE2FA #x78BE) - (#xE2FB #x78BC) - (#xE2FC #x78C5) - (#xE2FD #x78CA) - (#xE2FE #x78EC) - (#xE3A1 #x78E7) - (#xE3A2 #x78DA) - (#xE3A3 #x78FD) - (#xE3A4 #x78F4) - (#xE3A5 #x7907) - (#xE3A6 #x7912) - (#xE3A7 #x7911) - (#xE3A8 #x7919) - (#xE3A9 #x792C) - (#xE3AA #x792B) - (#xE3AB #x7940) - (#xE3AC #x7960) - (#xE3AD #x7957) - (#xE3AE #x795F) - (#xE3AF #x795A) - (#xE3B0 #x7955) - (#xE3B1 #x7953) - (#xE3B2 #x797A) - (#xE3B3 #x797F) - (#xE3B4 #x798A) - (#xE3B5 #x799D) - (#xE3B6 #x79A7) - (#xE3B7 #x9F4B) - (#xE3B8 #x79AA) - (#xE3B9 #x79AE) - (#xE3BA #x79B3) - (#xE3BB #x79B9) - (#xE3BC #x79BA) - (#xE3BD #x79C9) - (#xE3BE #x79D5) - (#xE3BF #x79E7) - (#xE3C0 #x79EC) - (#xE3C1 #x79E1) - (#xE3C2 #x79E3) - (#xE3C3 #x7A08) - (#xE3C4 #x7A0D) - (#xE3C5 #x7A18) - (#xE3C6 #x7A19) - (#xE3C7 #x7A20) - (#xE3C8 #x7A1F) - (#xE3C9 #x7980) - (#xE3CA #x7A31) - (#xE3CB #x7A3B) - (#xE3CC #x7A3E) - (#xE3CD #x7A37) - (#xE3CE #x7A43) - (#xE3CF #x7A57) - (#xE3D0 #x7A49) - (#xE3D1 #x7A61) - (#xE3D2 #x7A62) - (#xE3D3 #x7A69) - (#xE3D4 #x9F9D) - (#xE3D5 #x7A70) - (#xE3D6 #x7A79) - (#xE3D7 #x7A7D) - (#xE3D8 #x7A88) - (#xE3D9 #x7A97) - (#xE3DA #x7A95) - (#xE3DB #x7A98) - (#xE3DC #x7A96) - (#xE3DD #x7AA9) - (#xE3DE #x7AC8) - (#xE3DF #x7AB0) - (#xE3E0 #x7AB6) - (#xE3E1 #x7AC5) - (#xE3E2 #x7AC4) - (#xE3E3 #x7ABF) - (#xE3E4 #x9083) - (#xE3E5 #x7AC7) - (#xE3E6 #x7ACA) - (#xE3E7 #x7ACD) - (#xE3E8 #x7ACF) - (#xE3E9 #x7AD5) - (#xE3EA #x7AD3) - (#xE3EB #x7AD9) - (#xE3EC #x7ADA) - (#xE3ED #x7ADD) - (#xE3EE #x7AE1) - (#xE3EF #x7AE2) - (#xE3F0 #x7AE6) - (#xE3F1 #x7AED) - (#xE3F2 #x7AF0) - (#xE3F3 #x7B02) - (#xE3F4 #x7B0F) - (#xE3F5 #x7B0A) - (#xE3F6 #x7B06) - (#xE3F7 #x7B33) - (#xE3F8 #x7B18) - (#xE3F9 #x7B19) - (#xE3FA #x7B1E) - (#xE3FB #x7B35) - (#xE3FC #x7B28) - (#xE3FD #x7B36) - (#xE3FE #x7B50) - (#xE4A1 #x7B7A) - (#xE4A2 #x7B04) - (#xE4A3 #x7B4D) - (#xE4A4 #x7B0B) - (#xE4A5 #x7B4C) - (#xE4A6 #x7B45) - (#xE4A7 #x7B75) - (#xE4A8 #x7B65) - (#xE4A9 #x7B74) - (#xE4AA #x7B67) - (#xE4AB #x7B70) - (#xE4AC #x7B71) - (#xE4AD #x7B6C) - (#xE4AE #x7B6E) - (#xE4AF #x7B9D) - (#xE4B0 #x7B98) - (#xE4B1 #x7B9F) - (#xE4B2 #x7B8D) - (#xE4B3 #x7B9C) - (#xE4B4 #x7B9A) - (#xE4B5 #x7B8B) - (#xE4B6 #x7B92) - (#xE4B7 #x7B8F) - (#xE4B8 #x7B5D) - (#xE4B9 #x7B99) - (#xE4BA #x7BCB) - (#xE4BB #x7BC1) - (#xE4BC #x7BCC) - (#xE4BD #x7BCF) - (#xE4BE #x7BB4) - (#xE4BF #x7BC6) - (#xE4C0 #x7BDD) - (#xE4C1 #x7BE9) - (#xE4C2 #x7C11) - (#xE4C3 #x7C14) - (#xE4C4 #x7BE6) - (#xE4C5 #x7BE5) - (#xE4C6 #x7C60) - (#xE4C7 #x7C00) - (#xE4C8 #x7C07) - (#xE4C9 #x7C13) - (#xE4CA #x7BF3) - (#xE4CB #x7BF7) - (#xE4CC #x7C17) - (#xE4CD #x7C0D) - (#xE4CE #x7BF6) - (#xE4CF #x7C23) - (#xE4D0 #x7C27) - (#xE4D1 #x7C2A) - (#xE4D2 #x7C1F) - (#xE4D3 #x7C37) - (#xE4D4 #x7C2B) - (#xE4D5 #x7C3D) - (#xE4D6 #x7C4C) - (#xE4D7 #x7C43) - (#xE4D8 #x7C54) - (#xE4D9 #x7C4F) - (#xE4DA #x7C40) - (#xE4DB #x7C50) - (#xE4DC #x7C58) - (#xE4DD #x7C5F) - (#xE4DE #x7C64) - (#xE4DF #x7C56) - (#xE4E0 #x7C65) - (#xE4E1 #x7C6C) - (#xE4E2 #x7C75) - (#xE4E3 #x7C83) - (#xE4E4 #x7C90) - (#xE4E5 #x7CA4) - (#xE4E6 #x7CAD) - (#xE4E7 #x7CA2) - (#xE4E8 #x7CAB) - (#xE4E9 #x7CA1) - (#xE4EA #x7CA8) - (#xE4EB #x7CB3) - (#xE4EC #x7CB2) - (#xE4ED #x7CB1) - (#xE4EE #x7CAE) - (#xE4EF #x7CB9) - (#xE4F0 #x7CBD) - (#xE4F1 #x7CC0) - (#xE4F2 #x7CC5) - (#xE4F3 #x7CC2) - (#xE4F4 #x7CD8) - (#xE4F5 #x7CD2) - (#xE4F6 #x7CDC) - (#xE4F7 #x7CE2) - (#xE4F8 #x9B3B) - (#xE4F9 #x7CEF) - (#xE4FA #x7CF2) - (#xE4FB #x7CF4) - (#xE4FC #x7CF6) - (#xE4FD #x7CFA) - (#xE4FE #x7D06) - (#xE5A1 #x7D02) - (#xE5A2 #x7D1C) - (#xE5A3 #x7D15) - (#xE5A4 #x7D0A) - (#xE5A5 #x7D45) - (#xE5A6 #x7D4B) - (#xE5A7 #x7D2E) - (#xE5A8 #x7D32) - (#xE5A9 #x7D3F) - (#xE5AA #x7D35) - (#xE5AB #x7D46) - (#xE5AC #x7D73) - (#xE5AD #x7D56) - (#xE5AE #x7D4E) - (#xE5AF #x7D72) - (#xE5B0 #x7D68) - (#xE5B1 #x7D6E) - (#xE5B2 #x7D4F) - (#xE5B3 #x7D63) - (#xE5B4 #x7D93) - (#xE5B5 #x7D89) - (#xE5B6 #x7D5B) - (#xE5B7 #x7D8F) - (#xE5B8 #x7D7D) - (#xE5B9 #x7D9B) - (#xE5BA #x7DBA) - (#xE5BB #x7DAE) - (#xE5BC #x7DA3) - (#xE5BD #x7DB5) - (#xE5BE #x7DC7) - (#xE5BF #x7DBD) - (#xE5C0 #x7DAB) - (#xE5C1 #x7E3D) - (#xE5C2 #x7DA2) - (#xE5C3 #x7DAF) - (#xE5C4 #x7DDC) - (#xE5C5 #x7DB8) - (#xE5C6 #x7D9F) - (#xE5C7 #x7DB0) - (#xE5C8 #x7DD8) - (#xE5C9 #x7DDD) - (#xE5CA #x7DE4) - (#xE5CB #x7DDE) - (#xE5CC #x7DFB) - (#xE5CD #x7DF2) - (#xE5CE #x7DE1) - (#xE5CF #x7E05) - (#xE5D0 #x7E0A) - (#xE5D1 #x7E23) - (#xE5D2 #x7E21) - (#xE5D3 #x7E12) - (#xE5D4 #x7E31) - (#xE5D5 #x7E1F) - (#xE5D6 #x7E09) - (#xE5D7 #x7E0B) - (#xE5D8 #x7E22) - (#xE5D9 #x7E46) - (#xE5DA #x7E66) - (#xE5DB #x7E3B) - (#xE5DC #x7E35) - (#xE5DD #x7E39) - (#xE5DE #x7E43) - (#xE5DF #x7E37) - (#xE5E0 #x7E32) - (#xE5E1 #x7E3A) - (#xE5E2 #x7E67) - (#xE5E3 #x7E5D) - (#xE5E4 #x7E56) - (#xE5E5 #x7E5E) - (#xE5E6 #x7E59) - (#xE5E7 #x7E5A) - (#xE5E8 #x7E79) - (#xE5E9 #x7E6A) - (#xE5EA #x7E69) - (#xE5EB #x7E7C) - (#xE5EC #x7E7B) - (#xE5ED #x7E83) - (#xE5EE #x7DD5) - (#xE5EF #x7E7D) - (#xE5F0 #x8FAE) - (#xE5F1 #x7E7F) - (#xE5F2 #x7E88) - (#xE5F3 #x7E89) - (#xE5F4 #x7E8C) - (#xE5F5 #x7E92) - (#xE5F6 #x7E90) - (#xE5F7 #x7E93) - (#xE5F8 #x7E94) - (#xE5F9 #x7E96) - (#xE5FA #x7E8E) - (#xE5FB #x7E9B) - (#xE5FC #x7E9C) - (#xE5FD #x7F38) - (#xE5FE #x7F3A) - (#xE6A1 #x7F45) - (#xE6A2 #x7F4C) - (#xE6A3 #x7F4D) - (#xE6A4 #x7F4E) - (#xE6A5 #x7F50) - (#xE6A6 #x7F51) - (#xE6A7 #x7F55) - (#xE6A8 #x7F54) - (#xE6A9 #x7F58) - (#xE6AA #x7F5F) - (#xE6AB #x7F60) - (#xE6AC #x7F68) - (#xE6AD #x7F69) - (#xE6AE #x7F67) - (#xE6AF #x7F78) - (#xE6B0 #x7F82) - (#xE6B1 #x7F86) - (#xE6B2 #x7F83) - (#xE6B3 #x7F88) - (#xE6B4 #x7F87) - (#xE6B5 #x7F8C) - (#xE6B6 #x7F94) - (#xE6B7 #x7F9E) - (#xE6B8 #x7F9D) - (#xE6B9 #x7F9A) - (#xE6BA #x7FA3) - (#xE6BB #x7FAF) - (#xE6BC #x7FB2) - (#xE6BD #x7FB9) - (#xE6BE #x7FAE) - (#xE6BF #x7FB6) - (#xE6C0 #x7FB8) - (#xE6C1 #x8B71) - (#xE6C2 #x7FC5) - (#xE6C3 #x7FC6) - (#xE6C4 #x7FCA) - (#xE6C5 #x7FD5) - (#xE6C6 #x7FD4) - (#xE6C7 #x7FE1) - (#xE6C8 #x7FE6) - (#xE6C9 #x7FE9) - (#xE6CA #x7FF3) - (#xE6CB #x7FF9) - (#xE6CC #x98DC) - (#xE6CD #x8006) - (#xE6CE #x8004) - (#xE6CF #x800B) - (#xE6D0 #x8012) - (#xE6D1 #x8018) - (#xE6D2 #x8019) - (#xE6D3 #x801C) - (#xE6D4 #x8021) - (#xE6D5 #x8028) - (#xE6D6 #x803F) - (#xE6D7 #x803B) - (#xE6D8 #x804A) - (#xE6D9 #x8046) - (#xE6DA #x8052) - (#xE6DB #x8058) - (#xE6DC #x805A) - (#xE6DD #x805F) - (#xE6DE #x8062) - (#xE6DF #x8068) - (#xE6E0 #x8073) - (#xE6E1 #x8072) - (#xE6E2 #x8070) - (#xE6E3 #x8076) - (#xE6E4 #x8079) - (#xE6E5 #x807D) - (#xE6E6 #x807F) - (#xE6E7 #x8084) - (#xE6E8 #x8086) - (#xE6E9 #x8085) - (#xE6EA #x809B) - (#xE6EB #x8093) - (#xE6EC #x809A) - (#xE6ED #x80AD) - (#xE6EE #x5190) - (#xE6EF #x80AC) - (#xE6F0 #x80DB) - (#xE6F1 #x80E5) - (#xE6F2 #x80D9) - (#xE6F3 #x80DD) - (#xE6F4 #x80C4) - (#xE6F5 #x80DA) - (#xE6F6 #x80D6) - (#xE6F7 #x8109) - (#xE6F8 #x80EF) - (#xE6F9 #x80F1) - (#xE6FA #x811B) - (#xE6FB #x8129) - (#xE6FC #x8123) - (#xE6FD #x812F) - (#xE6FE #x814B) - (#xE7A1 #x968B) - (#xE7A2 #x8146) - (#xE7A3 #x813E) - (#xE7A4 #x8153) - (#xE7A5 #x8151) - (#xE7A6 #x80FC) - (#xE7A7 #x8171) - (#xE7A8 #x816E) - (#xE7A9 #x8165) - (#xE7AA #x8166) - (#xE7AB #x8174) - (#xE7AC #x8183) - (#xE7AD #x8188) - (#xE7AE #x818A) - (#xE7AF #x8180) - (#xE7B0 #x8182) - (#xE7B1 #x81A0) - (#xE7B2 #x8195) - (#xE7B3 #x81A4) - (#xE7B4 #x81A3) - (#xE7B5 #x815F) - (#xE7B6 #x8193) - (#xE7B7 #x81A9) - (#xE7B8 #x81B0) - (#xE7B9 #x81B5) - (#xE7BA #x81BE) - (#xE7BB #x81B8) - (#xE7BC #x81BD) - (#xE7BD #x81C0) - (#xE7BE #x81C2) - (#xE7BF #x81BA) - (#xE7C0 #x81C9) - (#xE7C1 #x81CD) - (#xE7C2 #x81D1) - (#xE7C3 #x81D9) - (#xE7C4 #x81D8) - (#xE7C5 #x81C8) - (#xE7C6 #x81DA) - (#xE7C7 #x81DF) - (#xE7C8 #x81E0) - (#xE7C9 #x81E7) - (#xE7CA #x81FA) - (#xE7CB #x81FB) - (#xE7CC #x81FE) - (#xE7CD #x8201) - (#xE7CE #x8202) - (#xE7CF #x8205) - (#xE7D0 #x8207) - (#xE7D1 #x820A) - (#xE7D2 #x820D) - (#xE7D3 #x8210) - (#xE7D4 #x8216) - (#xE7D5 #x8229) - (#xE7D6 #x822B) - (#xE7D7 #x8238) - (#xE7D8 #x8233) - (#xE7D9 #x8240) - (#xE7DA #x8259) - (#xE7DB #x8258) - (#xE7DC #x825D) - (#xE7DD #x825A) - (#xE7DE #x825F) - (#xE7DF #x8264) - (#xE7E0 #x8262) - (#xE7E1 #x8268) - (#xE7E2 #x826A) - (#xE7E3 #x826B) - (#xE7E4 #x822E) - (#xE7E5 #x8271) - (#xE7E6 #x8277) - (#xE7E7 #x8278) - (#xE7E8 #x827E) - (#xE7E9 #x828D) - (#xE7EA #x8292) - (#xE7EB #x82AB) - (#xE7EC #x829F) - (#xE7ED #x82BB) - (#xE7EE #x82AC) - (#xE7EF #x82E1) - (#xE7F0 #x82E3) - (#xE7F1 #x82DF) - (#xE7F2 #x82D2) - (#xE7F3 #x82F4) - (#xE7F4 #x82F3) - (#xE7F5 #x82FA) - (#xE7F6 #x8393) - (#xE7F7 #x8303) - (#xE7F8 #x82FB) - (#xE7F9 #x82F9) - (#xE7FA #x82DE) - (#xE7FB #x8306) - (#xE7FC #x82DC) - (#xE7FD #x8309) - (#xE7FE #x82D9) - (#xE8A1 #x8335) - (#xE8A2 #x8334) - (#xE8A3 #x8316) - (#xE8A4 #x8332) - (#xE8A5 #x8331) - (#xE8A6 #x8340) - (#xE8A7 #x8339) - (#xE8A8 #x8350) - (#xE8A9 #x8345) - (#xE8AA #x832F) - (#xE8AB #x832B) - (#xE8AC #x8317) - (#xE8AD #x8318) - (#xE8AE #x8385) - (#xE8AF #x839A) - (#xE8B0 #x83AA) - (#xE8B1 #x839F) - (#xE8B2 #x83A2) - (#xE8B3 #x8396) - (#xE8B4 #x8323) - (#xE8B5 #x838E) - (#xE8B6 #x8387) - (#xE8B7 #x838A) - (#xE8B8 #x837C) - (#xE8B9 #x83B5) - (#xE8BA #x8373) - (#xE8BB #x8375) - (#xE8BC #x83A0) - (#xE8BD #x8389) - (#xE8BE #x83A8) - (#xE8BF #x83F4) - (#xE8C0 #x8413) - (#xE8C1 #x83EB) - (#xE8C2 #x83CE) - (#xE8C3 #x83FD) - (#xE8C4 #x8403) - (#xE8C5 #x83D8) - (#xE8C6 #x840B) - (#xE8C7 #x83C1) - (#xE8C8 #x83F7) - (#xE8C9 #x8407) - (#xE8CA #x83E0) - (#xE8CB #x83F2) - (#xE8CC #x840D) - (#xE8CD #x8422) - (#xE8CE #x8420) - (#xE8CF #x83BD) - (#xE8D0 #x8438) - (#xE8D1 #x8506) - (#xE8D2 #x83FB) - (#xE8D3 #x846D) - (#xE8D4 #x842A) - (#xE8D5 #x843C) - (#xE8D6 #x855A) - (#xE8D7 #x8484) - (#xE8D8 #x8477) - (#xE8D9 #x846B) - (#xE8DA #x84AD) - (#xE8DB #x846E) - (#xE8DC #x8482) - (#xE8DD #x8469) - (#xE8DE #x8446) - (#xE8DF #x842C) - (#xE8E0 #x846F) - (#xE8E1 #x8479) - (#xE8E2 #x8435) - (#xE8E3 #x84CA) - (#xE8E4 #x8462) - (#xE8E5 #x84B9) - (#xE8E6 #x84BF) - (#xE8E7 #x849F) - (#xE8E8 #x84D9) - (#xE8E9 #x84CD) - (#xE8EA #x84BB) - (#xE8EB #x84DA) - (#xE8EC #x84D0) - (#xE8ED #x84C1) - (#xE8EE #x84C6) - (#xE8EF #x84D6) - (#xE8F0 #x84A1) - (#xE8F1 #x8521) - (#xE8F2 #x84FF) - (#xE8F3 #x84F4) - (#xE8F4 #x8517) - (#xE8F5 #x8518) - (#xE8F6 #x852C) - (#xE8F7 #x851F) - (#xE8F8 #x8515) - (#xE8F9 #x8514) - (#xE8FA #x84FC) - (#xE8FB #x8540) - (#xE8FC #x8563) - (#xE8FD #x8558) - (#xE8FE #x8548) - (#xE9A1 #x8541) - (#xE9A2 #x8602) - (#xE9A3 #x854B) - (#xE9A4 #x8555) - (#xE9A5 #x8580) - (#xE9A6 #x85A4) - (#xE9A7 #x8588) - (#xE9A8 #x8591) - (#xE9A9 #x858A) - (#xE9AA #x85A8) - (#xE9AB #x856D) - (#xE9AC #x8594) - (#xE9AD #x859B) - (#xE9AE #x85EA) - (#xE9AF #x8587) - (#xE9B0 #x859C) - (#xE9B1 #x8577) - (#xE9B2 #x857E) - (#xE9B3 #x8590) - (#xE9B4 #x85C9) - (#xE9B5 #x85BA) - (#xE9B6 #x85CF) - (#xE9B7 #x85B9) - (#xE9B8 #x85D0) - (#xE9B9 #x85D5) - (#xE9BA #x85DD) - (#xE9BB #x85E5) - (#xE9BC #x85DC) - (#xE9BD #x85F9) - (#xE9BE #x860A) - (#xE9BF #x8613) - (#xE9C0 #x860B) - (#xE9C1 #x85FE) - (#xE9C2 #x85FA) - (#xE9C3 #x8606) - (#xE9C4 #x8622) - (#xE9C5 #x861A) - (#xE9C6 #x8630) - (#xE9C7 #x863F) - (#xE9C8 #x864D) - (#xE9C9 #x4E55) - (#xE9CA #x8654) - (#xE9CB #x865F) - (#xE9CC #x8667) - (#xE9CD #x8671) - (#xE9CE #x8693) - (#xE9CF #x86A3) - (#xE9D0 #x86A9) - (#xE9D1 #x86AA) - (#xE9D2 #x868B) - (#xE9D3 #x868C) - (#xE9D4 #x86B6) - (#xE9D5 #x86AF) - (#xE9D6 #x86C4) - (#xE9D7 #x86C6) - (#xE9D8 #x86B0) - (#xE9D9 #x86C9) - (#xE9DA #x8823) - (#xE9DB #x86AB) - (#xE9DC #x86D4) - (#xE9DD #x86DE) - (#xE9DE #x86E9) - (#xE9DF #x86EC) - (#xE9E0 #x86DF) - (#xE9E1 #x86DB) - (#xE9E2 #x86EF) - (#xE9E3 #x8712) - (#xE9E4 #x8706) - (#xE9E5 #x8708) - (#xE9E6 #x8700) - (#xE9E7 #x8703) - (#xE9E8 #x86FB) - (#xE9E9 #x8711) - (#xE9EA #x8709) - (#xE9EB #x870D) - (#xE9EC #x86F9) - (#xE9ED #x870A) - (#xE9EE #x8734) - (#xE9EF #x873F) - (#xE9F0 #x8737) - (#xE9F1 #x873B) - (#xE9F2 #x8725) - (#xE9F3 #x8729) - (#xE9F4 #x871A) - (#xE9F5 #x8760) - (#xE9F6 #x875F) - (#xE9F7 #x8778) - (#xE9F8 #x874C) - (#xE9F9 #x874E) - (#xE9FA #x8774) - (#xE9FB #x8757) - (#xE9FC #x8768) - (#xE9FD #x876E) - (#xE9FE #x8759) - (#xEAA1 #x8753) - (#xEAA2 #x8763) - (#xEAA3 #x876A) - (#xEAA4 #x8805) - (#xEAA5 #x87A2) - (#xEAA6 #x879F) - (#xEAA7 #x8782) - (#xEAA8 #x87AF) - (#xEAA9 #x87CB) - (#xEAAA #x87BD) - (#xEAAB #x87C0) - (#xEAAC #x87D0) - (#xEAAD #x96D6) - (#xEAAE #x87AB) - (#xEAAF #x87C4) - (#xEAB0 #x87B3) - (#xEAB1 #x87C7) - (#xEAB2 #x87C6) - (#xEAB3 #x87BB) - (#xEAB4 #x87EF) - (#xEAB5 #x87F2) - (#xEAB6 #x87E0) - (#xEAB7 #x880F) - (#xEAB8 #x880D) - (#xEAB9 #x87FE) - (#xEABA #x87F6) - (#xEABB #x87F7) - (#xEABC #x880E) - (#xEABD #x87D2) - (#xEABE #x8811) - (#xEABF #x8816) - (#xEAC0 #x8815) - (#xEAC1 #x8822) - (#xEAC2 #x8821) - (#xEAC3 #x8831) - (#xEAC4 #x8836) - (#xEAC5 #x8839) - (#xEAC6 #x8827) - (#xEAC7 #x883B) - (#xEAC8 #x8844) - (#xEAC9 #x8842) - (#xEACA #x8852) - (#xEACB #x8859) - (#xEACC #x885E) - (#xEACD #x8862) - (#xEACE #x886B) - (#xEACF #x8881) - (#xEAD0 #x887E) - (#xEAD1 #x889E) - (#xEAD2 #x8875) - (#xEAD3 #x887D) - (#xEAD4 #x88B5) - (#xEAD5 #x8872) - (#xEAD6 #x8882) - (#xEAD7 #x8897) - (#xEAD8 #x8892) - (#xEAD9 #x88AE) - (#xEADA #x8899) - (#xEADB #x88A2) - (#xEADC #x888D) - (#xEADD #x88A4) - (#xEADE #x88B0) - (#xEADF #x88BF) - (#xEAE0 #x88B1) - (#xEAE1 #x88C3) - (#xEAE2 #x88C4) - (#xEAE3 #x88D4) - (#xEAE4 #x88D8) - (#xEAE5 #x88D9) - (#xEAE6 #x88DD) - (#xEAE7 #x88F9) - (#xEAE8 #x8902) - (#xEAE9 #x88FC) - (#xEAEA #x88F4) - (#xEAEB #x88E8) - (#xEAEC #x88F2) - (#xEAED #x8904) - (#xEAEE #x890C) - (#xEAEF #x890A) - (#xEAF0 #x8913) - (#xEAF1 #x8943) - (#xEAF2 #x891E) - (#xEAF3 #x8925) - (#xEAF4 #x892A) - (#xEAF5 #x892B) - (#xEAF6 #x8941) - (#xEAF7 #x8944) - (#xEAF8 #x893B) - (#xEAF9 #x8936) - (#xEAFA #x8938) - (#xEAFB #x894C) - (#xEAFC #x891D) - (#xEAFD #x8960) - (#xEAFE #x895E) - (#xEBA1 #x8966) - (#xEBA2 #x8964) - (#xEBA3 #x896D) - (#xEBA4 #x896A) - (#xEBA5 #x896F) - (#xEBA6 #x8974) - (#xEBA7 #x8977) - (#xEBA8 #x897E) - (#xEBA9 #x8983) - (#xEBAA #x8988) - (#xEBAB #x898A) - (#xEBAC #x8993) - (#xEBAD #x8998) - (#xEBAE #x89A1) - (#xEBAF #x89A9) - (#xEBB0 #x89A6) - (#xEBB1 #x89AC) - (#xEBB2 #x89AF) - (#xEBB3 #x89B2) - (#xEBB4 #x89BA) - (#xEBB5 #x89BD) - (#xEBB6 #x89BF) - (#xEBB7 #x89C0) - (#xEBB8 #x89DA) - (#xEBB9 #x89DC) - (#xEBBA #x89DD) - (#xEBBB #x89E7) - (#xEBBC #x89F4) - (#xEBBD #x89F8) - (#xEBBE #x8A03) - (#xEBBF #x8A16) - (#xEBC0 #x8A10) - (#xEBC1 #x8A0C) - (#xEBC2 #x8A1B) - (#xEBC3 #x8A1D) - (#xEBC4 #x8A25) - (#xEBC5 #x8A36) - (#xEBC6 #x8A41) - (#xEBC7 #x8A5B) - (#xEBC8 #x8A52) - (#xEBC9 #x8A46) - (#xEBCA #x8A48) - (#xEBCB #x8A7C) - (#xEBCC #x8A6D) - (#xEBCD #x8A6C) - (#xEBCE #x8A62) - (#xEBCF #x8A85) - (#xEBD0 #x8A82) - (#xEBD1 #x8A84) - (#xEBD2 #x8AA8) - (#xEBD3 #x8AA1) - (#xEBD4 #x8A91) - (#xEBD5 #x8AA5) - (#xEBD6 #x8AA6) - (#xEBD7 #x8A9A) - (#xEBD8 #x8AA3) - (#xEBD9 #x8AC4) - (#xEBDA #x8ACD) - (#xEBDB #x8AC2) - (#xEBDC #x8ADA) - (#xEBDD #x8AEB) - (#xEBDE #x8AF3) - (#xEBDF #x8AE7) - (#xEBE0 #x8AE4) - (#xEBE1 #x8AF1) - (#xEBE2 #x8B14) - (#xEBE3 #x8AE0) - (#xEBE4 #x8AE2) - (#xEBE5 #x8AF7) - (#xEBE6 #x8ADE) - (#xEBE7 #x8ADB) - (#xEBE8 #x8B0C) - (#xEBE9 #x8B07) - (#xEBEA #x8B1A) - (#xEBEB #x8AE1) - (#xEBEC #x8B16) - (#xEBED #x8B10) - (#xEBEE #x8B17) - (#xEBEF #x8B20) - (#xEBF0 #x8B33) - (#xEBF1 #x97AB) - (#xEBF2 #x8B26) - (#xEBF3 #x8B2B) - (#xEBF4 #x8B3E) - (#xEBF5 #x8B28) - (#xEBF6 #x8B41) - (#xEBF7 #x8B4C) - (#xEBF8 #x8B4F) - (#xEBF9 #x8B4E) - (#xEBFA #x8B49) - (#xEBFB #x8B56) - (#xEBFC #x8B5B) - (#xEBFD #x8B5A) - (#xEBFE #x8B6B) - (#xECA1 #x8B5F) - (#xECA2 #x8B6C) - (#xECA3 #x8B6F) - (#xECA4 #x8B74) - (#xECA5 #x8B7D) - (#xECA6 #x8B80) - (#xECA7 #x8B8C) - (#xECA8 #x8B8E) - (#xECA9 #x8B92) - (#xECAA #x8B93) - (#xECAB #x8B96) - (#xECAC #x8B99) - (#xECAD #x8B9A) - (#xECAE #x8C3A) - (#xECAF #x8C41) - (#xECB0 #x8C3F) - (#xECB1 #x8C48) - (#xECB2 #x8C4C) - (#xECB3 #x8C4E) - (#xECB4 #x8C50) - (#xECB5 #x8C55) - (#xECB6 #x8C62) - (#xECB7 #x8C6C) - (#xECB8 #x8C78) - (#xECB9 #x8C7A) - (#xECBA #x8C82) - (#xECBB #x8C89) - (#xECBC #x8C85) - (#xECBD #x8C8A) - (#xECBE #x8C8D) - (#xECBF #x8C8E) - (#xECC0 #x8C94) - (#xECC1 #x8C7C) - (#xECC2 #x8C98) - (#xECC3 #x621D) - (#xECC4 #x8CAD) - (#xECC5 #x8CAA) - (#xECC6 #x8CBD) - (#xECC7 #x8CB2) - (#xECC8 #x8CB3) - (#xECC9 #x8CAE) - (#xECCA #x8CB6) - (#xECCB #x8CC8) - (#xECCC #x8CC1) - (#xECCD #x8CE4) - (#xECCE #x8CE3) - (#xECCF #x8CDA) - (#xECD0 #x8CFD) - (#xECD1 #x8CFA) - (#xECD2 #x8CFB) - (#xECD3 #x8D04) - (#xECD4 #x8D05) - (#xECD5 #x8D0A) - (#xECD6 #x8D07) - (#xECD7 #x8D0F) - (#xECD8 #x8D0D) - (#xECD9 #x8D10) - (#xECDA #x9F4E) - (#xECDB #x8D13) - (#xECDC #x8CCD) - (#xECDD #x8D14) - (#xECDE #x8D16) - (#xECDF #x8D67) - (#xECE0 #x8D6D) - (#xECE1 #x8D71) - (#xECE2 #x8D73) - (#xECE3 #x8D81) - (#xECE4 #x8D99) - (#xECE5 #x8DC2) - (#xECE6 #x8DBE) - (#xECE7 #x8DBA) - (#xECE8 #x8DCF) - (#xECE9 #x8DDA) - (#xECEA #x8DD6) - (#xECEB #x8DCC) - (#xECEC #x8DDB) - (#xECED #x8DCB) - (#xECEE #x8DEA) - (#xECEF #x8DEB) - (#xECF0 #x8DDF) - (#xECF1 #x8DE3) - (#xECF2 #x8DFC) - (#xECF3 #x8E08) - (#xECF4 #x8E09) - (#xECF5 #x8DFF) - (#xECF6 #x8E1D) - (#xECF7 #x8E1E) - (#xECF8 #x8E10) - (#xECF9 #x8E1F) - (#xECFA #x8E42) - (#xECFB #x8E35) - (#xECFC #x8E30) - (#xECFD #x8E34) - (#xECFE #x8E4A) - (#xEDA1 #x8E47) - (#xEDA2 #x8E49) - (#xEDA3 #x8E4C) - (#xEDA4 #x8E50) - (#xEDA5 #x8E48) - (#xEDA6 #x8E59) - (#xEDA7 #x8E64) - (#xEDA8 #x8E60) - (#xEDA9 #x8E2A) - (#xEDAA #x8E63) - (#xEDAB #x8E55) - (#xEDAC #x8E76) - (#xEDAD #x8E72) - (#xEDAE #x8E7C) - (#xEDAF #x8E81) - (#xEDB0 #x8E87) - (#xEDB1 #x8E85) - (#xEDB2 #x8E84) - (#xEDB3 #x8E8B) - (#xEDB4 #x8E8A) - (#xEDB5 #x8E93) - (#xEDB6 #x8E91) - (#xEDB7 #x8E94) - (#xEDB8 #x8E99) - (#xEDB9 #x8EAA) - (#xEDBA #x8EA1) - (#xEDBB #x8EAC) - (#xEDBC #x8EB0) - (#xEDBD #x8EC6) - (#xEDBE #x8EB1) - (#xEDBF #x8EBE) - (#xEDC0 #x8EC5) - (#xEDC1 #x8EC8) - (#xEDC2 #x8ECB) - (#xEDC3 #x8EDB) - (#xEDC4 #x8EE3) - (#xEDC5 #x8EFC) - (#xEDC6 #x8EFB) - (#xEDC7 #x8EEB) - (#xEDC8 #x8EFE) - (#xEDC9 #x8F0A) - (#xEDCA #x8F05) - (#xEDCB #x8F15) - (#xEDCC #x8F12) - (#xEDCD #x8F19) - (#xEDCE #x8F13) - (#xEDCF #x8F1C) - (#xEDD0 #x8F1F) - (#xEDD1 #x8F1B) - (#xEDD2 #x8F0C) - (#xEDD3 #x8F26) - (#xEDD4 #x8F33) - (#xEDD5 #x8F3B) - (#xEDD6 #x8F39) - (#xEDD7 #x8F45) - (#xEDD8 #x8F42) - (#xEDD9 #x8F3E) - (#xEDDA #x8F4C) - (#xEDDB #x8F49) - (#xEDDC #x8F46) - (#xEDDD #x8F4E) - (#xEDDE #x8F57) - (#xEDDF #x8F5C) - (#xEDE0 #x8F62) - (#xEDE1 #x8F63) - (#xEDE2 #x8F64) - (#xEDE3 #x8F9C) - (#xEDE4 #x8F9F) - (#xEDE5 #x8FA3) - (#xEDE6 #x8FAD) - (#xEDE7 #x8FAF) - (#xEDE8 #x8FB7) - (#xEDE9 #x8FDA) - (#xEDEA #x8FE5) - (#xEDEB #x8FE2) - (#xEDEC #x8FEA) - (#xEDED #x8FEF) - (#xEDEE #x9087) - (#xEDEF #x8FF4) - (#xEDF0 #x9005) - (#xEDF1 #x8FF9) - (#xEDF2 #x8FFA) - (#xEDF3 #x9011) - (#xEDF4 #x9015) - (#xEDF5 #x9021) - (#xEDF6 #x900D) - (#xEDF7 #x901E) - (#xEDF8 #x9016) - (#xEDF9 #x900B) - (#xEDFA #x9027) - (#xEDFB #x9036) - (#xEDFC #x9035) - (#xEDFD #x9039) - (#xEDFE #x8FF8) - (#xEEA1 #x904F) - (#xEEA2 #x9050) - (#xEEA3 #x9051) - (#xEEA4 #x9052) - (#xEEA5 #x900E) - (#xEEA6 #x9049) - (#xEEA7 #x903E) - (#xEEA8 #x9056) - (#xEEA9 #x9058) - (#xEEAA #x905E) - (#xEEAB #x9068) - (#xEEAC #x906F) - (#xEEAD #x9076) - (#xEEAE #x96A8) - (#xEEAF #x9072) - (#xEEB0 #x9082) - (#xEEB1 #x907D) - (#xEEB2 #x9081) - (#xEEB3 #x9080) - (#xEEB4 #x908A) - (#xEEB5 #x9089) - (#xEEB6 #x908F) - (#xEEB7 #x90A8) - (#xEEB8 #x90AF) - (#xEEB9 #x90B1) - (#xEEBA #x90B5) - (#xEEBB #x90E2) - (#xEEBC #x90E4) - (#xEEBD #x6248) - (#xEEBE #x90DB) - (#xEEBF #x9102) - (#xEEC0 #x9112) - (#xEEC1 #x9119) - (#xEEC2 #x9132) - (#xEEC3 #x9130) - (#xEEC4 #x914A) - (#xEEC5 #x9156) - (#xEEC6 #x9158) - (#xEEC7 #x9163) - (#xEEC8 #x9165) - (#xEEC9 #x9169) - (#xEECA #x9173) - (#xEECB #x9172) - (#xEECC #x918B) - (#xEECD #x9189) - (#xEECE #x9182) - (#xEECF #x91A2) - (#xEED0 #x91AB) - (#xEED1 #x91AF) - (#xEED2 #x91AA) - (#xEED3 #x91B5) - (#xEED4 #x91B4) - (#xEED5 #x91BA) - (#xEED6 #x91C0) - (#xEED7 #x91C1) - (#xEED8 #x91C9) - (#xEED9 #x91CB) - (#xEEDA #x91D0) - (#xEEDB #x91D6) - (#xEEDC #x91DF) - (#xEEDD #x91E1) - (#xEEDE #x91DB) - (#xEEDF #x91FC) - (#xEEE0 #x91F5) - (#xEEE1 #x91F6) - (#xEEE2 #x921E) - (#xEEE3 #x91FF) - (#xEEE4 #x9214) - (#xEEE5 #x922C) - (#xEEE6 #x9215) - (#xEEE7 #x9211) - (#xEEE8 #x925E) - (#xEEE9 #x9257) - (#xEEEA #x9245) - (#xEEEB #x9249) - (#xEEEC #x9264) - (#xEEED #x9248) - (#xEEEE #x9295) - (#xEEEF #x923F) - (#xEEF0 #x924B) - (#xEEF1 #x9250) - (#xEEF2 #x929C) - (#xEEF3 #x9296) - (#xEEF4 #x9293) - (#xEEF5 #x929B) - (#xEEF6 #x925A) - (#xEEF7 #x92CF) - (#xEEF8 #x92B9) - (#xEEF9 #x92B7) - (#xEEFA #x92E9) - (#xEEFB #x930F) - (#xEEFC #x92FA) - (#xEEFD #x9344) - (#xEEFE #x932E) - (#xEFA1 #x9319) - (#xEFA2 #x9322) - (#xEFA3 #x931A) - (#xEFA4 #x9323) - (#xEFA5 #x933A) - (#xEFA6 #x9335) - (#xEFA7 #x933B) - (#xEFA8 #x935C) - (#xEFA9 #x9360) - (#xEFAA #x937C) - (#xEFAB #x936E) - (#xEFAC #x9356) - (#xEFAD #x93B0) - (#xEFAE #x93AC) - (#xEFAF #x93AD) - (#xEFB0 #x9394) - (#xEFB1 #x93B9) - (#xEFB2 #x93D6) - (#xEFB3 #x93D7) - (#xEFB4 #x93E8) - (#xEFB5 #x93E5) - (#xEFB6 #x93D8) - (#xEFB7 #x93C3) - (#xEFB8 #x93DD) - (#xEFB9 #x93D0) - (#xEFBA #x93C8) - (#xEFBB #x93E4) - (#xEFBC #x941A) - (#xEFBD #x9414) - (#xEFBE #x9413) - (#xEFBF #x9403) - (#xEFC0 #x9407) - (#xEFC1 #x9410) - (#xEFC2 #x9436) - (#xEFC3 #x942B) - (#xEFC4 #x9435) - (#xEFC5 #x9421) - (#xEFC6 #x943A) - (#xEFC7 #x9441) - (#xEFC8 #x9452) - (#xEFC9 #x9444) - (#xEFCA #x945B) - (#xEFCB #x9460) - (#xEFCC #x9462) - (#xEFCD #x945E) - (#xEFCE #x946A) - (#xEFCF #x9229) - (#xEFD0 #x9470) - (#xEFD1 #x9475) - (#xEFD2 #x9477) - (#xEFD3 #x947D) - (#xEFD4 #x945A) - (#xEFD5 #x947C) - (#xEFD6 #x947E) - (#xEFD7 #x9481) - (#xEFD8 #x947F) - (#xEFD9 #x9582) - (#xEFDA #x9587) - (#xEFDB #x958A) - (#xEFDC #x9594) - (#xEFDD #x9596) - (#xEFDE #x9598) - (#xEFDF #x9599) - (#xEFE0 #x95A0) - (#xEFE1 #x95A8) - (#xEFE2 #x95A7) - (#xEFE3 #x95AD) - (#xEFE4 #x95BC) - (#xEFE5 #x95BB) - (#xEFE6 #x95B9) - (#xEFE7 #x95BE) - (#xEFE8 #x95CA) - (#xEFE9 #x6FF6) - (#xEFEA #x95C3) - (#xEFEB #x95CD) - (#xEFEC #x95CC) - (#xEFED #x95D5) - (#xEFEE #x95D4) - (#xEFEF #x95D6) - (#xEFF0 #x95DC) - (#xEFF1 #x95E1) - (#xEFF2 #x95E5) - (#xEFF3 #x95E2) - (#xEFF4 #x9621) - (#xEFF5 #x9628) - (#xEFF6 #x962E) - (#xEFF7 #x962F) - (#xEFF8 #x9642) - (#xEFF9 #x964C) - (#xEFFA #x964F) - (#xEFFB #x964B) - (#xEFFC #x9677) - (#xEFFD #x965C) - (#xEFFE #x965E) - (#xF0A1 #x965D) - (#xF0A2 #x965F) - (#xF0A3 #x9666) - (#xF0A4 #x9672) - (#xF0A5 #x966C) - (#xF0A6 #x968D) - (#xF0A7 #x9698) - (#xF0A8 #x9695) - (#xF0A9 #x9697) - (#xF0AA #x96AA) - (#xF0AB #x96A7) - (#xF0AC #x96B1) - (#xF0AD #x96B2) - (#xF0AE #x96B0) - (#xF0AF #x96B4) - (#xF0B0 #x96B6) - (#xF0B1 #x96B8) - (#xF0B2 #x96B9) - (#xF0B3 #x96CE) - (#xF0B4 #x96CB) - (#xF0B5 #x96C9) - (#xF0B6 #x96CD) - (#xF0B7 #x894D) - (#xF0B8 #x96DC) - (#xF0B9 #x970D) - (#xF0BA #x96D5) - (#xF0BB #x96F9) - (#xF0BC #x9704) - (#xF0BD #x9706) - (#xF0BE #x9708) - (#xF0BF #x9713) - (#xF0C0 #x970E) - (#xF0C1 #x9711) - (#xF0C2 #x970F) - (#xF0C3 #x9716) - (#xF0C4 #x9719) - (#xF0C5 #x9724) - (#xF0C6 #x972A) - (#xF0C7 #x9730) - (#xF0C8 #x9739) - (#xF0C9 #x973D) - (#xF0CA #x973E) - (#xF0CB #x9744) - (#xF0CC #x9746) - (#xF0CD #x9748) - (#xF0CE #x9742) - (#xF0CF #x9749) - (#xF0D0 #x975C) - (#xF0D1 #x9760) - (#xF0D2 #x9764) - (#xF0D3 #x9766) - (#xF0D4 #x9768) - (#xF0D5 #x52D2) - (#xF0D6 #x976B) - (#xF0D7 #x9771) - (#xF0D8 #x9779) - (#xF0D9 #x9785) - (#xF0DA #x977C) - (#xF0DB #x9781) - (#xF0DC #x977A) - (#xF0DD #x9786) - (#xF0DE #x978B) - (#xF0DF #x978F) - (#xF0E0 #x9790) - (#xF0E1 #x979C) - (#xF0E2 #x97A8) - (#xF0E3 #x97A6) - (#xF0E4 #x97A3) - (#xF0E5 #x97B3) - (#xF0E6 #x97B4) - (#xF0E7 #x97C3) - (#xF0E8 #x97C6) - (#xF0E9 #x97C8) - (#xF0EA #x97CB) - (#xF0EB #x97DC) - (#xF0EC #x97ED) - (#xF0ED #x9F4F) - (#xF0EE #x97F2) - (#xF0EF #x7ADF) - (#xF0F0 #x97F6) - (#xF0F1 #x97F5) - (#xF0F2 #x980F) - (#xF0F3 #x980C) - (#xF0F4 #x9838) - (#xF0F5 #x9824) - (#xF0F6 #x9821) - (#xF0F7 #x9837) - (#xF0F8 #x983D) - (#xF0F9 #x9846) - (#xF0FA #x984F) - (#xF0FB #x984B) - (#xF0FC #x986B) - (#xF0FD #x986F) - (#xF0FE #x9870) - (#xF1A1 #x9871) - (#xF1A2 #x9874) - (#xF1A3 #x9873) - (#xF1A4 #x98AA) - (#xF1A5 #x98AF) - (#xF1A6 #x98B1) - (#xF1A7 #x98B6) - (#xF1A8 #x98C4) - (#xF1A9 #x98C3) - (#xF1AA #x98C6) - (#xF1AB #x98E9) - (#xF1AC #x98EB) - (#xF1AD #x9903) - (#xF1AE #x9909) - (#xF1AF #x9912) - (#xF1B0 #x9914) - (#xF1B1 #x9918) - (#xF1B2 #x9921) - (#xF1B3 #x991D) - (#xF1B4 #x991E) - (#xF1B5 #x9924) - (#xF1B6 #x9920) - (#xF1B7 #x992C) - (#xF1B8 #x992E) - (#xF1B9 #x993D) - (#xF1BA #x993E) - (#xF1BB #x9942) - (#xF1BC #x9949) - (#xF1BD #x9945) - (#xF1BE #x9950) - (#xF1BF #x994B) - (#xF1C0 #x9951) - (#xF1C1 #x9952) - (#xF1C2 #x994C) - (#xF1C3 #x9955) - (#xF1C4 #x9997) - (#xF1C5 #x9998) - (#xF1C6 #x99A5) - (#xF1C7 #x99AD) - (#xF1C8 #x99AE) - (#xF1C9 #x99BC) - (#xF1CA #x99DF) - (#xF1CB #x99DB) - (#xF1CC #x99DD) - (#xF1CD #x99D8) - (#xF1CE #x99D1) - (#xF1CF #x99ED) - (#xF1D0 #x99EE) - (#xF1D1 #x99F1) - (#xF1D2 #x99F2) - (#xF1D3 #x99FB) - (#xF1D4 #x99F8) - (#xF1D5 #x9A01) - (#xF1D6 #x9A0F) - (#xF1D7 #x9A05) - (#xF1D8 #x99E2) - (#xF1D9 #x9A19) - (#xF1DA #x9A2B) - (#xF1DB #x9A37) - (#xF1DC #x9A45) - (#xF1DD #x9A42) - (#xF1DE #x9A40) - (#xF1DF #x9A43) - (#xF1E0 #x9A3E) - (#xF1E1 #x9A55) - (#xF1E2 #x9A4D) - (#xF1E3 #x9A5B) - (#xF1E4 #x9A57) - (#xF1E5 #x9A5F) - (#xF1E6 #x9A62) - (#xF1E7 #x9A65) - (#xF1E8 #x9A64) - (#xF1E9 #x9A69) - (#xF1EA #x9A6B) - (#xF1EB #x9A6A) - (#xF1EC #x9AAD) - (#xF1ED #x9AB0) - (#xF1EE #x9ABC) - (#xF1EF #x9AC0) - (#xF1F0 #x9ACF) - (#xF1F1 #x9AD1) - (#xF1F2 #x9AD3) - (#xF1F3 #x9AD4) - (#xF1F4 #x9ADE) - (#xF1F5 #x9ADF) - (#xF1F6 #x9AE2) - (#xF1F7 #x9AE3) - (#xF1F8 #x9AE6) - (#xF1F9 #x9AEF) - (#xF1FA #x9AEB) - (#xF1FB #x9AEE) - (#xF1FC #x9AF4) - (#xF1FD #x9AF1) - (#xF1FE #x9AF7) - (#xF2A1 #x9AFB) - (#xF2A2 #x9B06) - (#xF2A3 #x9B18) - (#xF2A4 #x9B1A) - (#xF2A5 #x9B1F) - (#xF2A6 #x9B22) - (#xF2A7 #x9B23) - (#xF2A8 #x9B25) - (#xF2A9 #x9B27) - (#xF2AA #x9B28) - (#xF2AB #x9B29) - (#xF2AC #x9B2A) - (#xF2AD #x9B2E) - (#xF2AE #x9B2F) - (#xF2AF #x9B32) - (#xF2B0 #x9B44) - (#xF2B1 #x9B43) - (#xF2B2 #x9B4F) - (#xF2B3 #x9B4D) - (#xF2B4 #x9B4E) - (#xF2B5 #x9B51) - (#xF2B6 #x9B58) - (#xF2B7 #x9B74) - (#xF2B8 #x9B93) - (#xF2B9 #x9B83) - (#xF2BA #x9B91) - (#xF2BB #x9B96) - (#xF2BC #x9B97) - (#xF2BD #x9B9F) - (#xF2BE #x9BA0) - (#xF2BF #x9BA8) - (#xF2C0 #x9BB4) - (#xF2C1 #x9BC0) - (#xF2C2 #x9BCA) - (#xF2C3 #x9BB9) - (#xF2C4 #x9BC6) - (#xF2C5 #x9BCF) - (#xF2C6 #x9BD1) - (#xF2C7 #x9BD2) - (#xF2C8 #x9BE3) - (#xF2C9 #x9BE2) - (#xF2CA #x9BE4) - (#xF2CB #x9BD4) - (#xF2CC #x9BE1) - (#xF2CD #x9C3A) - (#xF2CE #x9BF2) - (#xF2CF #x9BF1) - (#xF2D0 #x9BF0) - (#xF2D1 #x9C15) - (#xF2D2 #x9C14) - (#xF2D3 #x9C09) - (#xF2D4 #x9C13) - (#xF2D5 #x9C0C) - (#xF2D6 #x9C06) - (#xF2D7 #x9C08) - (#xF2D8 #x9C12) - (#xF2D9 #x9C0A) - (#xF2DA #x9C04) - (#xF2DB #x9C2E) - (#xF2DC #x9C1B) - (#xF2DD #x9C25) - (#xF2DE #x9C24) - (#xF2DF #x9C21) - (#xF2E0 #x9C30) - (#xF2E1 #x9C47) - (#xF2E2 #x9C32) - (#xF2E3 #x9C46) - (#xF2E4 #x9C3E) - (#xF2E5 #x9C5A) - (#xF2E6 #x9C60) - (#xF2E7 #x9C67) - (#xF2E8 #x9C76) - (#xF2E9 #x9C78) - (#xF2EA #x9CE7) - (#xF2EB #x9CEC) - (#xF2EC #x9CF0) - (#xF2ED #x9D09) - (#xF2EE #x9D08) - (#xF2EF #x9CEB) - (#xF2F0 #x9D03) - (#xF2F1 #x9D06) - (#xF2F2 #x9D2A) - (#xF2F3 #x9D26) - (#xF2F4 #x9DAF) - (#xF2F5 #x9D23) - (#xF2F6 #x9D1F) - (#xF2F7 #x9D44) - (#xF2F8 #x9D15) - (#xF2F9 #x9D12) - (#xF2FA #x9D41) - (#xF2FB #x9D3F) - (#xF2FC #x9D3E) - (#xF2FD #x9D46) - (#xF2FE #x9D48) - (#xF3A1 #x9D5D) - (#xF3A2 #x9D5E) - (#xF3A3 #x9D64) - (#xF3A4 #x9D51) - (#xF3A5 #x9D50) - (#xF3A6 #x9D59) - (#xF3A7 #x9D72) - (#xF3A8 #x9D89) - (#xF3A9 #x9D87) - (#xF3AA #x9DAB) - (#xF3AB #x9D6F) - (#xF3AC #x9D7A) - (#xF3AD #x9D9A) - (#xF3AE #x9DA4) - (#xF3AF #x9DA9) - (#xF3B0 #x9DB2) - (#xF3B1 #x9DC4) - (#xF3B2 #x9DC1) - (#xF3B3 #x9DBB) - (#xF3B4 #x9DB8) - (#xF3B5 #x9DBA) - (#xF3B6 #x9DC6) - (#xF3B7 #x9DCF) - (#xF3B8 #x9DC2) - (#xF3B9 #x9DD9) - (#xF3BA #x9DD3) - (#xF3BB #x9DF8) - (#xF3BC #x9DE6) - (#xF3BD #x9DED) - (#xF3BE #x9DEF) - (#xF3BF #x9DFD) - (#xF3C0 #x9E1A) - (#xF3C1 #x9E1B) - (#xF3C2 #x9E1E) - (#xF3C3 #x9E75) - (#xF3C4 #x9E79) - (#xF3C5 #x9E7D) - (#xF3C6 #x9E81) - (#xF3C7 #x9E88) - (#xF3C8 #x9E8B) - (#xF3C9 #x9E8C) - (#xF3CA #x9E92) - (#xF3CB #x9E95) - (#xF3CC #x9E91) - (#xF3CD #x9E9D) - (#xF3CE #x9EA5) - (#xF3CF #x9EA9) - (#xF3D0 #x9EB8) - (#xF3D1 #x9EAA) - (#xF3D2 #x9EAD) - (#xF3D3 #x9761) - (#xF3D4 #x9ECC) - (#xF3D5 #x9ECE) - (#xF3D6 #x9ECF) - (#xF3D7 #x9ED0) - (#xF3D8 #x9ED4) - (#xF3D9 #x9EDC) - (#xF3DA #x9EDE) - (#xF3DB #x9EDD) - (#xF3DC #x9EE0) - (#xF3DD #x9EE5) - (#xF3DE #x9EE8) - (#xF3DF #x9EEF) - (#xF3E0 #x9EF4) - (#xF3E1 #x9EF6) - (#xF3E2 #x9EF7) - (#xF3E3 #x9EF9) - (#xF3E4 #x9EFB) - (#xF3E5 #x9EFC) - (#xF3E6 #x9EFD) - (#xF3E7 #x9F07) - (#xF3E8 #x9F08) - (#xF3E9 #x76B7) - (#xF3EA #x9F15) - (#xF3EB #x9F21) - (#xF3EC #x9F2C) - (#xF3ED #x9F3E) - (#xF3EE #x9F4A) - (#xF3EF #x9F52) - (#xF3F0 #x9F54) - (#xF3F1 #x9F63) - (#xF3F2 #x9F5F) - (#xF3F3 #x9F60) - (#xF3F4 #x9F61) - (#xF3F5 #x9F66) - (#xF3F6 #x9F67) - (#xF3F7 #x9F6C) - (#xF3F8 #x9F6A) - (#xF3F9 #x9F77) - (#xF3FA #x9F72) - (#xF3FB #x9F76) - (#xF3FC #x9F95) - (#xF3FD #x9F9C) - (#xF3FE #x9FA0) - (#xF4A1 #x582F) - (#xF4A2 #x69C7) - (#xF4A3 #x9059) - (#xF4A4 #x7464) - (#xF4A5 #x51DC) - (#xF4A6 #x7199) - )) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/packages.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/packages.lisp deleted file mode 100644 index ace36e8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/packages.lisp +++ /dev/null @@ -1,115 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; package.lisp --- Package definition for Babel -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package #:cl-user) - -(defpackage #:babel-encodings - (:use #:common-lisp #:alexandria) - (:export - ;; character encoding objects - #:list-character-encodings - #:character-encoding - #:*default-character-encoding* - #:get-character-encoding - #:enc-name - #:enc-aliases - #:enc-code-unit-size - #:enc-max-units-per-char - #:enc-native-endianness - #:enc-decode-literal-code-unit-limit - #:enc-encode-literal-code-unit-limit - #:enc-use-bom - #:enc-bom-encoding - #:enc-nul-encoding - #:enc-default-replacement - #:ambiguous-encoding-p - ;; concrete mappings - #:instantiate-concrete-mappings - #:encoder - #:decoder - #:octet-counter - #:code-point-counter - #:lookup-mapping - #:with-simple-vector - #:with-checked-simple-vector - #:*suppress-character-coding-errors* - ;; errors - #:character-coding-error - #:character-coding-error-encoding ; accessor - #:character-coding-error-buffer ; accessor - #:character-coding-error-position ; accessor - #:character-decoding-error - #:character-decoding-error-octets ; accessor - #:character-encoding-error - #:character-encoding-error-code ; accessor - #:end-of-input-in-character - #:character-out-of-range - #:invalid-utf8-starter-byte - #:invalid-utf8-continuation-byte - #:overlong-utf8-sequence)) - -(defpackage #:babel - (:use #:common-lisp #:babel-encodings #:alexandria) - (:import-from #:babel-encodings) - (:export - ;; types - #:unicode-char - #:unicode-char-code-limit - #:unicode-string - #:simple-unicode-string - ;; fixed sharp-backslash reader - #:enable-sharp-backslash-syntax - #:set-sharp-backslash-syntax-in-readtable - ;; external formats - #:external-format - #:make-external-format - #:ensure-external-format - #:external-format-encoding - #:external-format-eol-style - #:external-format-equal - #:*default-eol-style* - ;; general user API - #:*default-character-encoding* - #:list-character-encodings - #:string-to-octets - #:octets-to-string - #:concatenate-strings-to-octets - #:string-size-in-octets - #:vector-size-in-chars - ;; errors - #:character-coding-error - #:character-coding-error-encoding ; accessor - #:character-coding-error-buffer ; accessor - #:character-coding-error-position ; accessor - #:character-decoding-error - #:character-decoding-error-octets ; accessor - #:character-encoding-error - #:character-encoding-error-code ; accessor - #:end-of-input-in-character - #:character-out-of-range - #:invalid-utf8-starter-byte - #:invalid-utf8-continuation-byte - #:overlong-utf8-sequence)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/sharp-backslash.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/sharp-backslash.lisp deleted file mode 100644 index d4e772e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/sharp-backslash.lisp +++ /dev/null @@ -1,82 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; sharp-backslash.lisp --- Alternative #\ dispatch code. -;;; -;;; Copyright (C) 2007-2009, Luis Oliveira -;;; -;;; 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. - -(in-package #:babel) - -#-allegro -(defun sharp-backslash-reader (original-reader stream char numarg) - (let ((1st-char (read-char stream))) - (if (and (char-equal 1st-char #\u) - ;; because #\z is not a digit char... - (digit-char-p (peek-char nil stream nil #\z) 16)) - ;; something better than READ would be nice here - (let ((token (let ((*read-base* 16)) (read stream)))) - (if (typep token 'babel-encodings::code-point) - (code-char token) - (if *read-suppress* - nil - (simple-reader-error - stream "Unrecognized character name: u~A" token)))) - (funcall original-reader - (make-concatenated-stream (make-string-input-stream - (string 1st-char)) - stream) - char - numarg)))) - -;;; Allegro's PEEK-CHAR seems broken in some situations, and the code -;;; above would generate an error about too many calls to UNREAD-CHAR. -;;; Then Allegro's original SHARP-BACKSLASH wants to UNREAD-CHAR -;;; twice, very weird. This is the best workaround I could think of. -;;; It sucks. -#+allegro -(defun sharp-backslash-reader (original-reader stream char numarg) - (let* ((1st-char (read-char stream)) - (rest (ignore-errors (excl::read-extended-token stream))) - (code (when (and rest (char-equal 1st-char #\u)) - (ignore-errors (parse-integer rest :radix 16))))) - (if code - (code-char code) - (with-input-from-string - (s (concatenate 'string "#\\" (string 1st-char) rest)) - (read-char s) - (read-char s) - (funcall original-reader s char numarg))))) - -(defun make-sharp-backslash-reader () - (let ((original-sharp-backslash (get-dispatch-macro-character #\# #\\))) - (lambda (stream char numarg) - (sharp-backslash-reader original-sharp-backslash stream char numarg)))) - -(defmacro enable-sharp-backslash-syntax () - `(eval-when (:compile-toplevel :execute) - (setf *readtable* (copy-readtable *readtable*)) - (set-sharp-backslash-syntax-in-readtable) - (values))) - -(defun set-sharp-backslash-syntax-in-readtable () - (set-dispatch-macro-character #\# #\\ (make-sharp-backslash-reader)) - (values)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/streams.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/streams.lisp deleted file mode 100644 index 266d34b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/streams.lisp +++ /dev/null @@ -1,436 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; streams.lisp --- Conversions between strings and UB8 vectors. -;;; -;;; Copyright (c) 2005-2007, Dr. Edmund Weitz. All rights reserved. -;;; Copyright (c) 2008, Attila Lendvai. All rights reserved. -;;; -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: -;;; -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. -;;; -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. -;;; -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -;;; STATUS -;;; -;;; - in-memory output streams support binary/bivalent/character -;;; element-types and file-position - -;;; TODO -;;; -;;; - filter-stream types/mixins that can wrap a binary stream and -;;; turn it into a bivalent/character stream -;;; - in-memory input streams with file-position similar to in-memory -;;; output streams -;;; - in-memory input/output streams? - -(in-package #:babel) - -(defpackage #:babel-streams - (:use #:common-lisp #:babel #:trivial-gray-streams #:alexandria) - (:export - #:in-memory-stream - #:vector-output-stream - #:vector-input-stream - #:make-in-memory-output-stream - #:make-in-memory-input-stream - #:get-output-stream-sequence - #:with-output-to-sequence - #:with-input-from-sequence)) - -(in-package :babel-streams) - -(declaim (inline check-if-open check-if-accepts-octets - check-if-accepts-characters stream-accepts-characters? - stream-accepts-octets? vector-extend - extend-vector-output-stream-buffer)) - -(defgeneric get-output-stream-sequence (stream &key &allow-other-keys)) - -;;;; Some utilities (on top due to inlining) - -(defun vector-extend (extension vector &key (start 0) (end (length extension))) - ;; copied over from cl-quasi-quote - (declare (optimize speed) - (type vector extension vector) - (type array-index start end)) - (let* ((original-length (length vector)) - (extension-length (- end start)) - (new-length (+ original-length extension-length)) - (original-dimension (array-dimension vector 0))) - (when (< original-dimension new-length) - (setf vector - (adjust-array vector (max (* 2 original-dimension) new-length)))) - (setf (fill-pointer vector) new-length) - (replace vector extension :start1 original-length :start2 start :end2 end) - vector)) - -(defclass in-memory-stream (trivial-gray-stream-mixin) - ((element-type ; :default means bivalent - :initform :default :initarg :element-type :accessor element-type-of) - (external-format - :initform (ensure-external-format *default-character-encoding*) - :initarg :external-format :accessor external-format-of) - #+cmu - (open-p - :initform t :accessor in-memory-stream-open-p - :documentation "For CMUCL we have to keep track of this manually.")) - (:documentation "An IN-MEMORY-STREAM is a binary stream that reads octets - from or writes octets to a sequence in RAM.")) - -(defmethod stream-element-type ((self in-memory-stream)) - ;; stream-element-type is a CL symbol, we may not install an accessor on it. - ;; so, go through this extra step. - (element-type-of self)) - -(defun stream-accepts-octets? (stream) - (let ((element-type (element-type-of stream))) - (or (eq element-type :default) - (equal element-type '(unsigned-byte 8)) - (subtypep element-type '(unsigned-byte 8))))) - -(defun stream-accepts-characters? (stream) - (let ((element-type (element-type-of stream))) - (member element-type '(:default character base-char)))) - -(defclass in-memory-input-stream (in-memory-stream fundamental-binary-input-stream) - () - (:documentation "An IN-MEMORY-INPUT-STREAM is a binary stream that reads - octets from a sequence in RAM.")) - -#+cmu -(defmethod output-stream-p ((stream in-memory-input-stream)) - "Explicitly states whether this is an output stream." - (declare (optimize speed)) - nil) - -(defclass in-memory-output-stream (in-memory-stream - fundamental-binary-output-stream) - () - (:documentation "An IN-MEMORY-OUTPUT-STREAM is a binary stream that - writes octets to a sequence in RAM.")) - -#+cmu -(defmethod input-stream-p ((stream in-memory-output-stream)) - "Explicitly states whether this is an input stream." - (declare (optimize speed)) - nil) - -(defun make-in-memory-output-stream (&key (element-type :default) - external-format - initial-buffer-size) - "Returns a binary output stream which accepts objects of type -ELEMENT-TYPE \(a subtype of OCTET) and makes available a sequence that -contains the octes that were actually output." - (declare (optimize speed)) - (unless external-format - (setf external-format *default-character-encoding*)) - (when (eq element-type :bivalent) - (setf element-type :default)) - (make-instance 'vector-output-stream - :vector (make-vector-stream-buffer - :element-type - (cond - ((or (eq element-type :default) - (equal element-type '(unsigned-byte 8))) - '(unsigned-byte 8)) - ((eq element-type 'character) - 'character) - ((subtypep element-type '(unsigned-byte 8)) - '(unsigned-byte 8)) - (t (error "Illegal element-type ~S" element-type))) - :initial-size initial-buffer-size) - :element-type element-type - :external-format (ensure-external-format external-format))) - -(defun make-in-memory-input-stream (data &key (element-type :default) - external-format) - "Returns a binary input stream which provides the elements of DATA when read." - (declare (optimize speed)) - (unless external-format - (setf external-format *default-character-encoding*)) - (when (eq element-type :bivalent) - (setf element-type :default)) - (make-instance 'vector-input-stream - :vector data - :element-type element-type - :end (length data) - :external-format (ensure-external-format external-format))) - -(defclass vector-stream () - ((vector - :initarg :vector :accessor vector-stream-vector - :documentation "The underlying vector of the stream which \(for output) - must always be adjustable and have a fill pointer.") - (index - :initform 0 :initarg :index :accessor vector-stream-index - :type (integer 0 #.array-dimension-limit) - :documentation "An index into the underlying vector denoting the - current position.")) - (:documentation - "A VECTOR-STREAM is a mixin for IN-MEMORY streams where the underlying - sequence is a vector.")) - -(defclass vector-input-stream (vector-stream in-memory-input-stream) - ((end - :initarg :end :accessor vector-stream-end - :type (integer 0 #.array-dimension-limit) - :documentation "An index into the underlying vector denoting the end - of the available data.")) - (:documentation "A binary input stream that gets its data from an - associated vector of octets.")) - -(defclass vector-output-stream (vector-stream in-memory-output-stream) - () - (:documentation - "A binary output stream that writes its data to an associated vector.")) - -(define-condition in-memory-stream-error (stream-error) - () - (:documentation "Superclass for all errors related to IN-MEMORY streams.")) - -(define-condition in-memory-stream-closed-error (in-memory-stream-error) - () - (:report (lambda (condition stream) - (format stream "~S is closed." - (stream-error-stream condition)))) - (:documentation "An error that is signalled when someone is trying to read - from or write to a closed IN-MEMORY stream.")) - -(define-condition wrong-element-type-stream-error (stream-error) - ((expected-type :accessor expected-type-of :initarg :expected-type)) - (:report (lambda (condition output) - (let ((stream (stream-error-stream condition))) - (format output "The element-type of ~S is ~S while expecting ~ - a stream that accepts ~S." - stream (element-type-of stream) - (expected-type-of condition)))))) - -(defun wrong-element-type-stream-error (stream expected-type) - (error 'wrong-element-type-stream-error - :stream stream :expected-type expected-type)) - -#+cmu -(defmethod open-stream-p ((stream in-memory-stream)) - "Returns a true value if STREAM is open. See ANSI standard." - (declare (optimize speed)) - (in-memory-stream-open-p stream)) - -#+cmu -(defmethod close ((stream in-memory-stream) &key abort) - "Closes the stream STREAM. See ANSI standard." - (declare (ignore abort) (optimize speed)) - (prog1 - (in-memory-stream-open-p stream) - (setf (in-memory-stream-open-p stream) nil))) - -(defun check-if-open (stream) - "Checks if STREAM is open and signals an error otherwise." - (declare (optimize speed)) - (unless (open-stream-p stream) - (error 'in-memory-stream-closed-error :stream stream))) - -(defun check-if-accepts-octets (stream) - (declare (optimize speed)) - (unless (stream-accepts-octets? stream) - (wrong-element-type-stream-error stream '(unsigned-byte 8)))) - -(defun check-if-accepts-characters (stream) - (declare (optimize speed)) - (unless (stream-accepts-characters? stream) - (wrong-element-type-stream-error stream 'character))) - -(defmethod stream-read-byte ((stream vector-input-stream)) - "Reads one byte and increments INDEX pointer unless we're beyond END pointer." - (declare (optimize speed)) - (check-if-open stream) - (let ((index (vector-stream-index stream))) - (cond ((< index (vector-stream-end stream)) - (incf (vector-stream-index stream)) - (aref (vector-stream-vector stream) index)) - (t :eof)))) - -#+#:ignore -(defmethod stream-read-char ((stream vector-input-stream)) - ;; TODO - ) - -(defmethod stream-listen ((stream vector-input-stream)) - "Checking whether INDEX is beyond END." - (declare (optimize speed)) - (check-if-open stream) - (< (vector-stream-index stream) (vector-stream-end stream))) - -(defmethod stream-read-sequence ((stream vector-input-stream) - sequence start end &key) - (declare (optimize speed) (type array-index start end)) - ;; TODO check the sequence type, assert for the element-type and use - ;; the external-format. - (loop with vector-end of-type array-index = (vector-stream-end stream) - with vector = (vector-stream-vector stream) - for index from start below end - for vector-index of-type array-index = (vector-stream-index stream) - while (< vector-index vector-end) - do (setf (elt sequence index) - (aref vector vector-index)) - (incf (vector-stream-index stream)) - finally (return index))) - -(defmethod stream-write-byte ((stream vector-output-stream) byte) - "Writes a byte \(octet) by extending the underlying vector." - (declare (optimize speed)) - (check-if-open stream) - (check-if-accepts-octets stream) - (vector-push-extend byte (vector-stream-vector stream)) - (incf (vector-stream-index stream)) - byte) - -(defun extend-vector-output-stream-buffer (extension stream &key (start 0) - (end (length extension))) - (declare (optimize speed) - (type array-index start end) - (type vector extension)) - (vector-extend extension (vector-stream-vector stream) :start start :end end) - (incf (vector-stream-index stream) (- end start)) - (values)) - -(defmethod stream-write-char ((stream vector-output-stream) char) - (declare (optimize speed)) - (check-if-open stream) - (check-if-accepts-characters stream) - ;; TODO this is naiive here, there's room for optimization - (let ((octets (string-to-octets (string char) - :encoding (external-format-of stream)))) - (extend-vector-output-stream-buffer octets stream)) - char) - -(defmethod stream-write-sequence ((stream vector-output-stream) - sequence start end &key) - "Just calls VECTOR-PUSH-EXTEND repeatedly." - (declare (optimize speed) - (type array-index start end)) - (etypecase sequence - (string - (if (stream-accepts-octets? stream) - ;; TODO this is naiive here, there's room for optimization - (let ((octets (string-to-octets sequence - :encoding (external-format-of stream) - :start start - :end end))) - (extend-vector-output-stream-buffer octets stream)) - (progn - (assert (stream-accepts-characters? stream)) - (extend-vector-output-stream-buffer sequence stream - :start start :end end)))) - ((vector (unsigned-byte 8)) - ;; specialized branch to help inlining - (check-if-accepts-octets stream) - (extend-vector-output-stream-buffer sequence stream :start start :end end)) - (vector - (check-if-accepts-octets stream) - (extend-vector-output-stream-buffer sequence stream :start start :end end))) - sequence) - -(defmethod stream-write-string ((stream vector-output-stream) - string &optional (start 0) (end (length string))) - (stream-write-sequence stream string start (or end (length string)))) - -(defmethod stream-line-column ((stream vector-output-stream)) - "Dummy line-column method that always returns NIL. Needed for -character output streams." - nil) - -(defmethod stream-file-position ((stream vector-stream)) - "Simply returns the index into the underlying vector." - (declare (optimize speed)) - (vector-stream-index stream)) - -(defun make-vector-stream-buffer (&key (element-type '(unsigned-byte 8)) - initial-size) - "Creates and returns an array which can be used as the underlying vector - for a VECTOR-OUTPUT-STREAM." - (declare (optimize speed) - (type (or null array-index) initial-size)) - (make-array (the array-index (or initial-size 32)) - :adjustable t - :fill-pointer 0 - :element-type element-type)) - -(defmethod get-output-stream-sequence ((stream in-memory-output-stream) &key (return-as 'vector)) - "Returns a vector containing, in order, all the octets that have -been output to the IN-MEMORY stream STREAM. This operation clears any -octets on STREAM, so the vector contains only those octets which have -been output since the last call to GET-OUTPUT-STREAM-SEQUENCE or since -the creation of the stream, whichever occurred most recently. If -AS-LIST is true the return value is coerced to a list." - (declare (optimize speed)) - (prog1 - (ecase return-as - (vector (vector-stream-vector stream)) - (string (octets-to-string (vector-stream-vector stream) - :encoding (external-format-of stream))) - (list (coerce (vector-stream-vector stream) 'list))) - (setf (vector-stream-vector stream) (make-vector-stream-buffer)))) - -(defmacro with-output-to-sequence - ((var &key (return-as ''vector) (element-type '':default) - (external-format '*default-character-encoding*) initial-buffer-size) - &body body) - "Creates an IN-MEMORY output stream, binds VAR to this stream and -then executes the code in BODY. The stream stores data of type -ELEMENT-TYPE \(a subtype of OCTET). The stream is automatically closed -on exit from WITH-OUTPUT-TO-SEQUENCE, no matter whether the exit is -normal or abnormal. The return value of this macro is a vector \(or a -list if AS-LIST is true) containing the octets that were sent to the -stream within BODY." - (multiple-value-bind (body declarations) (parse-body body) - ;; this is here to stop SBCL complaining about binding them to NIL - `(let ((,var (make-in-memory-output-stream - :element-type ,element-type - :external-format ,external-format - :initial-buffer-size ,initial-buffer-size))) - ,@declarations - (unwind-protect - (progn - ,@body - (get-output-stream-sequence ,var :return-as ,return-as)) - (close ,var))))) - -(defmacro with-input-from-sequence - ((var data &key (element-type '':default) - (external-format '*default-character-encoding*)) - &body body) - "Creates an IN-MEMORY input stream that will return the values -available in DATA, binds VAR to this stream and then executes the code -in BODY. The stream stores data of type ELEMENT-TYPE \(a subtype of -OCTET). The stream is automatically closed on exit from -WITH-INPUT-FROM-SEQUENCE, no matter whether the exit is normal or -abnormal. The return value of this macro is the return value of BODY." - (multiple-value-bind (body declarations) (parse-body body) - ;; this is here to stop SBCL complaining about binding them to NIL - `(let ((,var (make-in-memory-input-stream - ,data :element-type ,element-type - :external-format ,external-format))) - ,@declarations - (unwind-protect - (progn - ,@body) - (close ,var))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/strings.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/strings.lisp deleted file mode 100644 index ba02089..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/strings.lisp +++ /dev/null @@ -1,353 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; strings.lisp --- Conversions between strings and UB8 vectors. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package #:babel) - -;;; The usefulness of this string/octets interface of Babel's is very -;;; limited on Lisps with 8-bit characters which will in effect only -;;; support the latin-1 subset of Unicode. That is, all encodings are -;;; supported but we can only store the first 256 code points in Lisp -;;; strings. Support for using other 8-bit encodings for strings on -;;; these Lisps could be added with an extra encoding/decoding step. -;;; Supporting other encodings with larger code units would be silly -;;; (it would break expectations about common string operations) and -;;; better done with something like Closure's runes. - -;;; Can we handle unicode fully? -(eval-when (:compile-toplevel :load-toplevel :execute) - ;; The EVAL is just here to avoid warnings... - (case (eval char-code-limit) - (#x100 (pushnew '8-bit-chars *features*)) - (#x10000 (pushnew 'ucs-2-chars *features*)) - (#x110000 #| yay |#) - ;; This is here mostly because if the CHAR-CODE-LIMIT is bigger - ;; than #x11000, strange things might happen but we probably - ;; shouldn't descriminate against other, smaller, values. - (t (error "Strange CHAR-CODE-LIMIT (#x~X), bailing out." - char-code-limit)))) - -;;; Adapted from Ironclad. TODO: check if it's worthwhile adding -;;; implementation-specific accessors such as SAP-REF-* for SBCL. -(defmacro ub-get (vector index &optional (bytes 1) (endianness :ne)) - (let ((big-endian (member endianness - '(:be #+big-endian :ne #+little-endian :re)))) - (once-only (vector index) - `(logand - ,(1- (ash 1 (* 8 bytes))) - (logior - ,@(loop for i from 0 below bytes - for offset = (if big-endian i (- bytes i 1)) - for shift = (if big-endian - (* (- bytes i 1) 8) - (* offset 8)) - collect `(ash (aref ,vector (+ ,index ,offset)) ,shift))))))) - -(defmacro ub-set (value vector index &optional (bytes 1) (endianness :ne)) - (let ((big-endian (member endianness - '(:be #+big-endian :ne #+little-endian :re)))) - `(progn - ,@(loop for i from 1 to bytes - for offset = (if big-endian (- bytes i) (1- i)) collect - `(setf (aref ,vector (+ ,index ,offset)) - (ldb (byte 8 ,(* 8 (1- i))) ,value))) - (values)))) - -(defmacro string-get (string index) - `(char-code (schar ,string ,index))) - -(defmacro string-set (code string index) - `(setf (schar ,string ,index) (code-char ,code))) - -;;; SIMPLE-BASE-STRING would also be a subtype of SIMPLE-STRING so we -;;; don't use that because on SBCL BASE-CHARs can only hold ASCII. -;;; Also, with (> SPEED SAFETY) (setf (schar base-str n) big-char) -;;; will quietly work, sort of. -;;; -;;; XXX: test this on various lisps. - -(defconstant unicode-char-code-limit - char-code-limit - "An alias for CL:CHAR-CODE-LIMIT which might be lower than -#x110000 on some Lisps.") - -(deftype unicode-char () - "This character type can hold any characters whose CHAR-CODEs -are less than UNICODE-CHAR-CODE-LIMIT." - #+lispworks 'lw:simple-char - #-lispworks 'character) - -(deftype simple-unicode-string () - "Alias for (SIMPLE-ARRAY UNICODE-CHAR (*))." - '(simple-array unicode-char (*))) - -(deftype unicode-string () - "Alias for (VECTOR UNICODE-CHAR *)." - '(vector unicode-char *)) - -(defparameter *string-vector-mappings* - (instantiate-concrete-mappings - ;; :optimize ((speed 3) (safety 0) (debug 0) (compilation-speed 0)) - :octet-seq-setter ub-set - :octet-seq-getter ub-get - :octet-seq-type (simple-array (unsigned-byte 8) (*)) - :code-point-seq-setter string-set - :code-point-seq-getter string-get - :code-point-seq-type simple-unicode-string)) - -#+sbcl -(defparameter *simple-base-string-vector-mappings* - (instantiate-concrete-mappings - ;; :optimize ((speed 3) (safety 0) (debug 0) (compilation-speed 0)) - :instantiate-decoders nil - :octet-seq-setter ub-set - :octet-seq-getter ub-get - :octet-seq-type (simple-array (unsigned-byte 8) (*)) - :code-point-seq-setter string-set - :code-point-seq-getter string-get - :code-point-seq-type simple-base-string)) - -;;; Do we want a more a specific error condition here? -(defun check-vector-bounds (vector start end) - (unless (<= 0 start end (length vector)) - (error "Invalid start (~A) and end (~A) values for vector of length ~A." - start end (length vector)))) - -(defmacro with-simple-vector (((v vector) (s start) (e end)) &body body) - "If VECTOR is a displaced or adjustable array, binds V to the -underlying simple vector, adds an adequate offset to START and -END and binds those offset values to S and E. Otherwise, if -VECTOR is already a simple array, it's simply bound to V with no -further changes. - -START and END are unchecked and assumed to be within bounds. - -Note that in some Lisps, a slow copying implementation is -necessary to obtain a simple vector thus V will be bound to a -copy of VECTOR coerced to a simple-vector. Therefore, you -shouldn't attempt to modify V." - #+sbcl - `(sb-kernel:with-array-data ((,v ,vector) (,s ,start) (,e ,end)) - ,@body) - #+(or cmu scl) - `(lisp::with-array-data ((,v ,vector) (,s ,start) (,e ,end)) - ,@body) - #+openmcl - (with-unique-names (offset) - `(multiple-value-bind (,v ,offset) - (ccl::array-data-and-offset ,vector) - (let ((,s (+ ,start ,offset)) - (,e (+ ,end ,offset))) - ,@body))) - #+allegro - (with-unique-names (offset) - `(excl::with-underlying-simple-vector (,vector ,v ,offset) - (let ((,e (+ ,end ,offset)) - (,s (+ ,start ,offset))) - ,@body))) - ;; slow, copying implementation - #-(or sbcl cmu scl openmcl allegro) - (once-only (vector) - `(funcall (if (adjustable-array-p ,vector) - #'call-with-array-data/copy - #'call-with-array-data/fast) - ,vector ,start ,end - (lambda (,v ,s ,e) ,@body)))) - -#-(or sbcl cmu scl openmcl allegro) -(progn - ;; Stolen from f2cl. - (defun array-data-and-offset (array) - (loop with offset = 0 do - (multiple-value-bind (displaced-to index-offset) - (array-displacement array) - (when (null displaced-to) - (return-from array-data-and-offset - (values array offset))) - (incf offset index-offset) - (setf array displaced-to)))) - - (defun call-with-array-data/fast (vector start end fn) - (multiple-value-bind (data offset) - (array-data-and-offset vector) - (funcall fn data (+ offset start) (+ offset end)))) - - (defun call-with-array-data/copy (vector start end fn) - (funcall fn (replace (make-array (- end start) :element-type - (array-element-type vector)) - vector :start2 start :end2 end) - 0 (- end start)))) - -(defmacro with-checked-simple-vector (((v vector) (s start) (e end)) &body body) - "Like WITH-SIMPLE-VECTOR but bound-checks START and END." - (once-only (vector start) - `(let ((,e (or ,end (length ,vector)))) - (check-vector-bounds ,vector ,start ,e) - (with-simple-vector ((,v ,vector) (,s ,start) (,e ,e)) - ,@body)))) - -;;; Future features these functions should have: -;;; -;;; * null-terminate -;;; * specify target vector/string + offset -;;; * documentation :) - -(declaim (inline octets-to-string string-to-octets string-size-in-octets - vector-size-in-chars concatenate-strings-to-octets - bom-vector)) - -(defun octets-to-string (vector &key (start 0) end - (errorp (not *suppress-character-coding-errors*)) - (encoding *default-character-encoding*)) - (check-type vector (vector (unsigned-byte 8))) - (with-checked-simple-vector ((vector vector) (start start) (end end)) - (declare (type (simple-array (unsigned-byte 8) (*)) vector)) - (let ((*suppress-character-coding-errors* (not errorp)) - (mapping (lookup-mapping *string-vector-mappings* encoding))) - (multiple-value-bind (size new-end) - (funcall (code-point-counter mapping) vector start end -1) - ;; TODO we could optimize ASCII here: the result should - ;; be a simple-base-string filled using code-char... - (let ((string (make-string size :element-type 'unicode-char))) - (funcall (decoder mapping) vector start new-end string 0) - string))))) - -(defun bom-vector (encoding use-bom) - (check-type use-bom (member :default t nil)) - (the simple-vector - (if (null use-bom) - #() - (let ((enc (typecase encoding - (external-format (external-format-encoding encoding)) - (t (get-character-encoding encoding))))) - (if (or (eq use-bom t) - (and (eq use-bom :default) (enc-use-bom enc))) - ;; VALUES avoids a "type assertion too complex to check" note. - (values (enc-bom-encoding enc)) - #()))))) - -(defun string-to-octets (string &key (encoding *default-character-encoding*) - (start 0) end (use-bom :default) - (errorp (not *suppress-character-coding-errors*))) - (declare (optimize (speed 3) (safety 2))) - (let ((*suppress-character-coding-errors* (not errorp))) - (etypecase string - ;; On some lisps (e.g. clisp and ccl) all strings are BASE-STRING and all - ;; characters are BASE-CHAR. So, only enable this optimization for - ;; selected targets. - #+sbcl - (simple-base-string - (unless end - (setf end (length string))) - (check-vector-bounds string start end) - (let* ((mapping (lookup-mapping *simple-base-string-vector-mappings* - encoding)) - (bom (bom-vector encoding use-bom)) - (bom-length (length bom)) - ;; OPTIMIZE: we could use the (length string) information here - ;; because it's a simple-base-string where each character <= 127 - (result (make-array - (+ (the array-index - (funcall (the function (octet-counter mapping)) - string start end -1)) - bom-length) - :element-type '(unsigned-byte 8)))) - (replace result bom) - (funcall (the function (encoder mapping)) - string start end result bom-length) - result)) - (string - ;; FIXME: we shouldn't really need that coercion to UNICODE-STRING - ;; but we kind of because it's declared all over. To avoid that, - ;; we'd need different types for input and output strings. Or maybe - ;; this is not a problem; figure that out. - (with-checked-simple-vector ((string (coerce string 'unicode-string)) - (start start) (end end)) - (declare (type simple-unicode-string string)) - (let* ((mapping (lookup-mapping *string-vector-mappings* encoding)) - (bom (bom-vector encoding use-bom)) - (bom-length (length bom)) - (result (make-array - (+ (the array-index - (funcall (the function (octet-counter mapping)) - string start end -1)) - bom-length) - :element-type '(unsigned-byte 8)))) - (replace result bom) - (funcall (the function (encoder mapping)) - string start end result bom-length) - result)))))) - -(defun concatenate-strings-to-octets (encoding &rest strings) - "Optimized equivalent of -\(string-to-octets \(apply #'concatenate 'string strings) - :encoding encoding)" - (declare (dynamic-extent strings)) - (let* ((mapping (lookup-mapping *string-vector-mappings* encoding)) - (octet-counter (octet-counter mapping)) - (vector (make-array - (the array-index - (reduce #'+ strings - :key (lambda (string) - (funcall octet-counter - string 0 (length string) -1)))) - :element-type '(unsigned-byte 8))) - (current-index 0)) - (declare (type array-index current-index)) - (dolist (string strings) - (check-type string string) - (with-checked-simple-vector ((string (coerce string 'unicode-string)) - (start 0) (end (length string))) - (declare (type simple-unicode-string string)) - (incf current-index - (funcall (encoder mapping) - string start end vector current-index)))) - vector)) - -(defun string-size-in-octets (string &key (start 0) end (max -1 maxp) - (errorp (not *suppress-character-coding-errors*)) - (encoding *default-character-encoding*)) - (check-type string string) - (with-checked-simple-vector ((string (coerce string 'unicode-string)) - (start start) (end end)) - (declare (type simple-unicode-string string)) - (let ((mapping (lookup-mapping *string-vector-mappings* encoding)) - (*suppress-character-coding-errors* (not errorp))) - (when maxp (assert (plusp max))) - (funcall (octet-counter mapping) string start end max)))) - -(defun vector-size-in-chars (vector &key (start 0) end (max -1 maxp) - (errorp (not *suppress-character-coding-errors*)) - (encoding *default-character-encoding*)) - (check-type vector (vector (unsigned-byte 8))) - (with-checked-simple-vector ((vector vector) (start start) (end end)) - (declare (type (simple-array (unsigned-byte 8) (*)) vector)) - (let ((mapping (lookup-mapping *string-vector-mappings* encoding)) - (*suppress-character-coding-errors* (not errorp))) - (when maxp (assert (plusp max))) - (funcall (code-point-counter mapping) vector start end max)))) - -(declaim (notinline octets-to-string string-to-octets string-size-in-octets - vector-size-in-chars concatenate-strings-to-octets)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ascii.txt b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ascii.txt deleted file mode 100644 index d430ef4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ascii.txt +++ /dev/null @@ -1,212 +0,0 @@ - -UTF-8 encoded sample plain-text file - - -Markus Kuhn [maks kun] 2002-07-25 - - -The ASCII compatible UTF-8 encoding used in this plain-text file -is defined in Unicode, ISO 10646-1, and RFC 2279. - - -Using Unicode/UTF-8, you can write in emails and source code things such as - -Mathematics and sciences: - - Eda = Q, n , f(i) = g(i), - a+b - x: x = x, = ( ), - c - , - - < a b c d (A B), - a-b - 2H + O 2HO, R = 4.7 k, 200 mm i=1 - -Linguistics and dictionaries: - - i ntnnl fntk sosien - Y [psiln], Yen [jn], Yoga [jog] - -APL: - - ((VV)=V)/V,V - -Nicer typography in plain text files: - - - - single and double quotes - - Curly apostrophes: Weve been here - - Latin-1 apostrophe and accents: '` - - deutsche Anfhrungszeichen - - , , , , 34, , 5/+5, , - - ASCII safety test: 1lI|, 0OD, 8B - - the euro symbol: 14.95 - - - -Combining characters: - - STARGTE SG-1, a = v = r, a b - -Greek (in Polytonic): - - The Greek anthem: - - - , - - . - - - - - , , ! - - From a speech of Demosthenes in the 4th century BC: - - , , - - - , - , - . - , , - . , - - , , - - , - . , - - , - . - - , - -Georgian: - - From a Unicode conference invitation: - - Unicode- - , 10-12 , - . , . - Unicode-, - , Unicode- - , , , - . - -Russian: - - From a Unicode conference invitation: - - - Unicode, 10-12 1997 . - - Unicode, , - Unicode - , , . - -Thai (UCS Level 2): - - Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese - classic 'San Gua'): - - [----------------------------|------------------------] - - - - - - - - - - (The above is a two-column text. If combining characters are handled - correctly, the lines of the second column should be aligned with the - | character above.) - -Ethiopian: - - Proverbs in the Amharic language: - - - - - - - - - - - - - - - - - - - - -Runes: - - - - (Old English, which transcribed into Latin reads 'He cwaeth that he - bude thaem lande northweardum with tha Westsae.' and means 'He said - that he lived in the northern land near the Western Sea.') - -Braille: - - - - - - - - - - - - - - - - - - - - - - - (The first couple of paragraphs of "A Christmas Carol" by Dickens) - -Compact font selection example text: - - ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 - abcdefghijklmnopqrstuvwxyz - - - -Greetings in various languages: - - Hello world, , - -Box drawing alignment tests: - - - - - - - - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ascii.txt-utf8 b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ascii.txt-utf8 deleted file mode 100644 index d430ef4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ascii.txt-utf8 +++ /dev/null @@ -1,212 +0,0 @@ - -UTF-8 encoded sample plain-text file - - -Markus Kuhn [maks kun] 2002-07-25 - - -The ASCII compatible UTF-8 encoding used in this plain-text file -is defined in Unicode, ISO 10646-1, and RFC 2279. - - -Using Unicode/UTF-8, you can write in emails and source code things such as - -Mathematics and sciences: - - Eda = Q, n , f(i) = g(i), - a+b - x: x = x, = ( ), - c - , - - < a b c d (A B), - a-b - 2H + O 2HO, R = 4.7 k, 200 mm i=1 - -Linguistics and dictionaries: - - i ntnnl fntk sosien - Y [psiln], Yen [jn], Yoga [jog] - -APL: - - ((VV)=V)/V,V - -Nicer typography in plain text files: - - - - single and double quotes - - Curly apostrophes: Weve been here - - Latin-1 apostrophe and accents: '` - - deutsche Anfhrungszeichen - - , , , , 34, , 5/+5, , - - ASCII safety test: 1lI|, 0OD, 8B - - the euro symbol: 14.95 - - - -Combining characters: - - STARGTE SG-1, a = v = r, a b - -Greek (in Polytonic): - - The Greek anthem: - - - , - - . - - - - - , , ! - - From a speech of Demosthenes in the 4th century BC: - - , , - - - , - , - . - , , - . , - - , , - - , - . , - - , - . - - , - -Georgian: - - From a Unicode conference invitation: - - Unicode- - , 10-12 , - . , . - Unicode-, - , Unicode- - , , , - . - -Russian: - - From a Unicode conference invitation: - - - Unicode, 10-12 1997 . - - Unicode, , - Unicode - , , . - -Thai (UCS Level 2): - - Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese - classic 'San Gua'): - - [----------------------------|------------------------] - - - - - - - - - - (The above is a two-column text. If combining characters are handled - correctly, the lines of the second column should be aligned with the - | character above.) - -Ethiopian: - - Proverbs in the Amharic language: - - - - - - - - - - - - - - - - - - - - -Runes: - - - - (Old English, which transcribed into Latin reads 'He cwaeth that he - bude thaem lande northweardum with tha Westsae.' and means 'He said - that he lived in the northern land near the Western Sea.') - -Braille: - - - - - - - - - - - - - - - - - - - - - - - (The first couple of paragraphs of "A Christmas Carol" by Dickens) - -Compact font selection example text: - - ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 - abcdefghijklmnopqrstuvwxyz - - - -Greetings in various languages: - - Hello world, , - -Box drawing alignment tests: - - - - - - - - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/benchmarks.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/benchmarks.lisp deleted file mode 100644 index 1b1d294..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/benchmarks.lisp +++ /dev/null @@ -1,43 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; benchmarks.lisp --- Benchmarks, Babel vs. other implementations. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(defpackage #:babel-benchmarks - (:use #:cl #:babel)) -(in-package #:babel-benchmarks) - -(defun benchmark (enc file-name file-type &optional (n 100)) - (let* ((octets (read-test-file file-name file-type)) - (string (octets-to-string octets :encoding enc))) - (write-line ";; testing SB-EXT:STRING-TO-OCTETS") - (time (loop repeat n do - (sb-ext:string-to-octets string :external-format enc))) - (write-line ";; testing BABEL:STRING-TO-OCTETS") - (time (loop repeat n do (string-to-octets string :encoding enc))) - (write-line ";; testing SB-EXT:OCTETS-TO-STRING") - (time (loop repeat n do - (sb-ext:octets-to-string octets :external-format enc))) - (write-line ";; testing BABEL:OCTETS-TO-STRING") - (time (loop repeat n do (octets-to-string octets :encoding enc))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ebcdic-us.txt b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ebcdic-us.txt deleted file mode 100644 index 910ad2d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ebcdic-us.txt +++ /dev/null @@ -1 +0,0 @@ -%äãÆ`ø@…•ƒ–„…„@¢”—“…@—“‰•`£…§£@†‰“…%%%Ô™’¤¢@Ò¤ˆ•@”’¢@’¤•@Lˆ££—zaa¦¦¦Kƒ“Kƒ”KƒK¤’a¡”‡’òõan@@òððò`ð÷`òõ%%%㈅@ÁâÃÉÉ@ƒ–”—£‰‚“…@äãÆ`ø@…•ƒ–„‰•‡@¤¢…„@‰•@£ˆ‰¢@—“‰•`£…§£@†‰“…%‰¢@„…†‰•…„@‰•@䕉ƒ–„…k@ÉâÖ@ñðöôö`ñk@•„@ÙÆÃ@òò÷ùK%%%䢉•‡@䕉ƒ–„…aäãÆ`øk@¨–¤@ƒ•@¦™‰£…@‰•@…”‰“¢@•„@¢–¤™ƒ…@ƒ–„…@£ˆ‰•‡¢@¢¤ƒˆ@¢%%Ô£ˆ…”£‰ƒ¢@•„@¢ƒ‰…•ƒ…¢z%%@@@Å„@~@Øk@@•@@k@@†M‰]@~@@‡M‰]k@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N‚@%@@§z@§@~@§k@@@_@~@_M_@@]k@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ƒ@@@%@@@@@@@@@@@@k@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@L@@@‚@@ƒ@@„@@@@MÁ@@Â]k@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`‚%@@òÈ@N@Ö@@òÈÖk@Ù@~@ôK÷@’k@@òðð@””@@@@@‰~ñ@@@@%%Ó‰•‡¤‰¢£‰ƒ¢@•„@„‰ƒ£‰–•™‰…¢z%%@@‰@•£••“@†•£’@¢–¢‰…•%@@è@—¢‰“•k@è…•@‘•k@è–‡@‘–‡%%Á×Óz%%@@MMåå]~å]aåkå@@@@%%Õ‰ƒ…™@£¨—–‡™—ˆ¨@‰•@—“‰•@£…§£@†‰“…¢z%%@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@¢‰•‡“…@•„@„–¤‚“…@˜¤–£…¢@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@䙓¨@—–¢£™–—ˆ…¢z@æ…¥…@‚……•@ˆ…™…@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@Ó£‰•`ñ@—–¢£™–—ˆ…@•„@ƒƒ…•£¢z@}y@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@„…¤£¢ƒˆ…@Á•†ˆ™¤•‡¢©…‰ƒˆ…•@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@k@k@k@k@óôk@k@õaNõk@k@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@ÁâÃÉÉ@¢†…£¨@£…¢£z@ñ“ÉOk@ðÖÄk@øÂ@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@£ˆ…@…¤™–@¢¨”‚–“z@@ñôKùõ@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%%Ö”‚‰•‰•‡@ƒˆ™ƒ£…™¢z%%@@âãÁÙÇãÅ@âÇ`ñk@@~@¥@~@™k@@@‚%%Ç™……’@M‰•@×–“¨£–•‰ƒ]z%%@@㈅@Ç™……’@•£ˆ…”z%%@@@@@@%@@@@@k%@@@@@@%@@@@@@@K%%@@@@@%@@@@@%@@@@@%@@k@@k@Z%%@@Æ™–”@@¢—……ƒˆ@–†@Ä…”–¢£ˆ…•…¢@‰•@£ˆ…@ô£ˆ@ƒ…•£¤™¨@ÂÃz%%@@@@@@k@@@k%@@@@@@@@@@@%@@@@@@@@@@%@@@@@k@@@%@@@@k@@@@@@%@@@@@K@@@@@%@@@@@@@@k@@@k%@@@@@@@K@@k@@%@@@@@@@@@@@@%@@k@@@@@@@k@@%@@@@@@@@@%@@@@@@k@@@%@@K@@@@@k@@@@%@@@@@@@@@@@%@@@@@k@@@@%@@@@@K%%@@k@@%%Ç…–™‡‰•z%%@@Æ™–”@@䕉ƒ–„…@ƒ–•†…™…•ƒ…@‰•¥‰££‰–•z%%@@@@@@䕉ƒ–„…`@@%@@@k@@@ñð`ñò@k%@@K@k@K@@@@%@@@@@@@@䕉ƒ–„…`k%@@@@k@䕉ƒ–„…`@%@@@k@@@k@k%@@@@@@@K%%Ù¤¢¢‰•z%%@@Æ™–”@@䕉ƒ–„…@ƒ–•†…™…•ƒ…@‰•¥‰££‰–•z%%@@@@@@@@%@@䕉ƒ–„…k@@@ñð`ñò@@ñùù÷@@@@@K%@@@@@@@@@@%@@@@䕉ƒ–„…k@@@k@@%@@@䕉ƒ–„…@@@@@@%@@k@k@@@@@K%%㈉@MäÃâ@Ó…¥…“@ò]z%%@@ŧƒ…™—£@†™–”@@—–…£™¨@–•@㈅@Ù–”•ƒ…@–†@㈅@㈙……@Ò‰•‡„–”¢@M@ȉ•…¢…%@@ƒ“¢¢‰ƒ@}â•@Ǥ}]z%%@@````````````````````````````O````````````````````````%@@@@@@@%@@@@@@@@@%@@@@@@@@@@@@@@@%@@@@@@@@@@@%@@@@@@@@@@%@@@@@@@@@@@@%@@@@@@@@@@@@@@%@@@@@@@@@@@@@@%%@@M㈅@‚–¥…@‰¢@@£¦–`ƒ–“¤”•@£…§£K@Ɇ@ƒ–”‚‰•‰•‡@ƒˆ™ƒ£…™¢@™…@ˆ•„“…„%@@ƒ–™™…ƒ£“¨k@£ˆ…@“‰•…¢@–†@£ˆ…@¢…ƒ–•„@ƒ–“¤”•@¢ˆ–¤“„@‚…@“‰‡•…„@¦‰£ˆ@£ˆ…%@@O@ƒˆ™ƒ£…™@‚–¥…K]%%Å£ˆ‰–—‰•z%%@@×™–¥…™‚¢@‰•@£ˆ…@Á”ˆ™‰ƒ@“•‡¤‡…z%%@@@@@%@@@@@%@@@@@%@@@@@@@%@@@@@%@@@@@%@@@%@@@@@@%@@@@@%@@@@@@@%@@@@@@%@@@@@@@%@@@@@%@@@@@@@%@@@@@@@%@@@@@%@@@@@@%@@@@@%%Ù¤•…¢z%%@@@@@@@@@@@@@%%@@MÖ“„@Å•‡“‰¢ˆk@¦ˆ‰ƒˆ@£™•¢ƒ™‰‚…„@‰•£–@Ó£‰•@™…„¢@}È…@ƒ¦…£ˆ@£ˆ£@ˆ…%@@‚¤„…@£ˆ…”@“•„…@•–™£ˆ¦…™„¤”@¦‰£ˆ@£ˆ@æ…¢£¢…K}@•„@”…•¢@}È…@¢‰„%@@£ˆ£@ˆ…@“‰¥…„@‰•@£ˆ…@•–™£ˆ…™•@“•„@•…™@£ˆ…@æ…¢£…™•@â…K}]%%™‰““…z%%@@@@@@%%@@@@@@@@@@@%@@@@@@@@@@%@@@@@@@@@%@@@@@@@@@%@@@@@@@@@@%@@@@@@@%%@@@@@@@@@%%@@@@@@@@@@@@%@@@@@@@@@%@@@@@@@@@@%@@@@@@@@@@%@@@@@@@@@@%@@@@@@@@@%@@@@@@@@@@@%@@@@@@@@@%@@@@@@@@%%@@M㈅@†‰™¢£@ƒ–¤—“…@–†@—™‡™—ˆ¢@–†@Á@È™‰¢£”¢@Ù–“@‚¨@ĉƒ’…•¢]%%Ö”—ƒ£@†–•£@¢…“…ƒ£‰–•@…§”—“…@£…§£z%%@@ÁÂÃÄÅÆÇÈÉÑÒÓÔÕÖרÙâãäåæçèé@aðñòóôõö÷øù%@@‚ƒ„…†‡ˆ‰‘’“”•–—˜™¢£¤¥¦§¨©@%@@@@%@@@@@%%Ç™……£‰•‡¢@‰•@¥™‰–¤¢@“•‡¤‡…¢z%%@@È…““–@¦–™“„k@@k@%%–§@„™¦‰•‡@“‰‡•”…•£@£…¢£¢z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@% \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ebcdic-us.txt-utf8 b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ebcdic-us.txt-utf8 deleted file mode 100644 index e7ea1ac..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ebcdic-us.txt-utf8 +++ /dev/null @@ -1,212 +0,0 @@ - -UTF-8 encoded sample plain-text file - - -Markus Kuhn maks kun 2002-07-25 - - -The ASCII compatible UTF-8 encoding used in this plain-text file -is defined in Unicode, ISO 10646-1, and RFC 2279. - - -Using Unicode/UTF-8, you can write in emails and source code things such as - -Mathematics and sciences: - - Eda = Q, n , f(i) = g(i), - a+b - x: x = x, ¬ = ¬(¬ ), - c - , - - < a b c d (A B), - a-b - 2H + O 2HO, R = 4.7 k, 200 mm i=1 - -Linguistics and dictionaries: - - i ntnnl fntk sosien - Y psiln, Yen jn, Yoga jog - -APL: - - ((VV)=V)/V,V - -Nicer typography in plain text files: - - - - single and double quotes - - Curly apostrophes: Weve been here - - Latin-1 apostrophe and accents: '` - - deutsche Anfhrungszeichen - - , , , , 34, , 5/+5, , - - ASCII safety test: 1lI|, 0OD, 8B - - the euro symbol: 14.95 - - - -Combining characters: - - STARGTE SG-1, a = v = r, a b - -Greek (in Polytonic): - - The Greek anthem: - - - , - - . - - - - - , , ! - - From a speech of Demosthenes in the 4th century BC: - - , , - - - , - , - . - , , - . , - - , , - - , - . , - - , - . - - , - -Georgian: - - From a Unicode conference invitation: - - Unicode- - , 10-12 , - . , . - Unicode-, - , Unicode- - , , , - . - -Russian: - - From a Unicode conference invitation: - - - Unicode, 10-12 1997 . - - Unicode, , - Unicode - , , . - -Thai (UCS Level 2): - - Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese - classic 'San Gua'): - - ----------------------------|------------------------ - - - - - - - - - - (The above is a two-column text. If combining characters are handled - correctly, the lines of the second column should be aligned with the - | character above.) - -Ethiopian: - - Proverbs in the Amharic language: - - - - - - - - - - - - - - - - - - - - -Runes: - - - - (Old English, which transcribed into Latin reads 'He cwaeth that he - bude thaem lande northweardum with tha Westsae.' and means 'He said - that he lived in the northern land near the Western Sea.') - -Braille: - - - - - - - - - - - - - - - - - - - - - - - (The first couple of paragraphs of "A Christmas Carol" by Dickens) - -Compact font selection example text: - - ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 - abcdefghijklmnopqrstuvwxyz - - - -Greetings in various languages: - - Hello world, , - -Box drawing alignment tests: - - - - - - - - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/gen-test-files.sh b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/gen-test-files.sh deleted file mode 100644 index cd0e343..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/gen-test-files.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/sh -# -*- indent-tabs-mode: nil -*- -# -# gen-test-files.sh --- Generates test files with iconv. -# -# Copyright (C) 2007, Luis Oliveira -# -# 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. - -INPUT_FILE="utf-8.txt" -INPUT_ENC="utf-8" -CHARSETS=('ebcdic-us' 'ascii' 'iso-8859-1' 'utf-16' 'utf-32') - -echo "Converting $INPUT_FILE..." -for c in ${CHARSETS[@]}; do - echo " ${c}.txt"; - iconv -c -f $INPUT_ENC -t $c $INPUT_FILE > ${c}.txt; - iconv -f $c -t 'utf-8' ${c}.txt > ${c}.txt-utf8; -done diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/streams.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/streams.lisp deleted file mode 100644 index 9dd53df..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/streams.lisp +++ /dev/null @@ -1,45 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; streams.lisp --- Unit and regression tests for Babel streams. -;;; -;;; Copyright (C) 2007, Attila Lendva -;;; -;;; 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. - -(in-package #:babel-tests) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (use-package :babel-streams)) - -(deftest in-memory-vector-stream - (with-output-to-sequence (output) - ;; TODO use a better test lib and inject asserts for the file position - ;(print (file-position output)) - (write-sequence "éáőűú" output) - ;(print (file-position output)) - (write-char #\ű output) - ;(print (file-position output)) - (write-byte 12 output) - (write-sequence (string-to-octets "körte") output) - (write-string "körte" output) - ;(print (file-position output)) - ) - #(195 169 195 161 197 145 197 177 195 186 197 177 12 107 195 182 114 116 101)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/tests.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/tests.lisp deleted file mode 100644 index 82c29bb..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/tests.lisp +++ /dev/null @@ -1,912 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tests.lisp --- Unit and regression tests for Babel. -;;; -;;; Copyright (C) 2007-2009, Luis Oliveira -;;; -;;; 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. - -(in-package #:cl-user) -(defpackage #:babel-tests - (:use #:common-lisp #:babel #:babel-encodings #:hu.dwim.stefil) - (:import-from #:alexandria #:ignore-some-conditions) - (:export #:run)) -(in-package #:babel-tests) - -(defun indented-format (level stream format-control &rest format-arguments) - (let ((line-prefix (make-string level :initial-element #\Space))) - (let ((output (format nil "~?~%" format-control format-arguments))) - (with-input-from-string (s output) - (loop for line = (read-line s nil nil) until (null line) - do (format stream "~A~A~%" line-prefix line)))))) - -;; adapted from https://github.com/luismbo/stefil/blob/master/source/suite.lisp -(defun describe-failed-tests (&key (result *last-test-result*) (stream t)) - "Prints out a report for RESULT in STREAM. - -RESULT defaults to `*last-test-result*' and STREAM defaults to t" - (let ((descs (hu.dwim.stefil::failure-descriptions-of result))) - (cond ((zerop (length descs)) - (format stream "~&~%[no failures!]")) - (t - (format stream "~&~%Test failures:~%") - (dotimes (i (length descs)) - (let ((desc (aref descs i)) - format-control format-arguments) - ;; XXX: most of Stefil's conditions specialise DESCRIBE-OBJECT - ;; with nice human-readable messages. We should add any missing - ;; ones (like UNEXPECTED-ERROR) and ditch this code. - (etypecase desc - (hu.dwim.stefil::unexpected-error - (let ((c (hu.dwim.stefil::condition-of desc))) - (typecase c - (simple-condition - (setf format-control (simple-condition-format-control c)) - (setf format-arguments - (simple-condition-format-arguments c))) - (t - (setf format-control "~S" - format-arguments (list c)))))) - (hu.dwim.stefil::failed-assertion - (setf format-control (hu.dwim.stefil::format-control-of desc) - format-arguments (hu.dwim.stefil::format-arguments-of desc))) - (hu.dwim.stefil::missing-condition - (setf format-control "~A" - format-arguments (list (with-output-to-string (stream) - (describe desc stream))))) - (null - (setf format-control "Test succeeded!"))) - (format stream "~%Failure ~A: ~A when running ~S~%~%" - (1+ i) - (type-of desc) - (hu.dwim.stefil::name-of (hu.dwim.stefil::test-of (first (hu.dwim.stefil::test-context-backtrace-of desc))))) - (indented-format 4 stream "~?" format-control format-arguments))))))) - -(defun run () - (let ((test-run (without-debugging (babel-tests)))) - (print test-run) - (describe-failed-tests :result test-run) - (values (zerop (length (hu.dwim.stefil::failure-descriptions-of test-run))) - test-run))) - -(defsuite* (babel-tests :in root-suite)) - -(defun ub8v (&rest contents) - (make-array (length contents) :element-type '(unsigned-byte 8) - :initial-contents contents)) - -(defun make-ub8-vector (size) - (make-array size :element-type '(unsigned-byte 8) - :initial-element 0)) - -(defmacro returns (form &rest values) - "Asserts, through EQUALP, that FORM returns VALUES." - `(is (equalp (multiple-value-list ,form) (list ,@values)))) - -(defmacro defstest (name form &body return-values) - "Similar to RT's DEFTEST." - `(deftest ,name () - (returns ,form ,@(mapcar (lambda (x) `',x) return-values)))) - -(defun fail (control-string &rest arguments) - (hu.dwim.stefil::record/failure 'hu.dwim.stefil::failed-assertion - :format-control control-string - :format-arguments arguments)) - -(defun expected (expected &key got) - (fail "expected ~A, got ~A instead" expected got)) - -(enable-sharp-backslash-syntax) - -;;;; Simple tests using ASCII - -(defstest enc.ascii.1 - (string-to-octets "abc" :encoding :ascii) - #(97 98 99)) - -(defstest enc.ascii.2 - (string-to-octets (string #\uED) :encoding :ascii :errorp nil) - #(#x1a)) - -(deftest enc.ascii.3 () - (handler-case - (string-to-octets (string #\uED) :encoding :ascii :errorp t) - (character-encoding-error (c) - (is (eql 0 (character-coding-error-position c))) - (is (eq :ascii (character-coding-error-encoding c))) - (is (eql #xed (character-encoding-error-code c)))) - (:no-error (result) - (expected 'character-encoding-error :got result)))) - -(defstest dec.ascii.1 - (octets-to-string (ub8v 97 98 99) :encoding :ascii) - "abc") - -(deftest dec.ascii.2 () - (handler-case - (octets-to-string (ub8v 97 128 99) :encoding :ascii :errorp t) - (character-decoding-error (c) - (is (equalp #(128) (character-decoding-error-octets c))) - (is (eql 1 (character-coding-error-position c))) - (is (eq :ascii (character-coding-error-encoding c)))) - (:no-error (result) - (expected 'character-decoding-error :got result)))) - -(defstest dec.ascii.3 - (octets-to-string (ub8v 97 255 98 99) :encoding :ascii :errorp nil) - #(#\a #\Sub #\b #\c)) - -(defstest oct-count.ascii.1 - (string-size-in-octets "abc" :encoding :ascii) - 3 3) - -(defstest char-count.ascii.1 - (vector-size-in-chars (ub8v 97 98 99) :encoding :ascii) - 3 3) - -;;;; UTF-8 - -(defstest char-count.utf-8.1 - ;; "ni hao" in hanzi with the last octet missing - (vector-size-in-chars (ub8v 228 189 160 229 165) :errorp nil) - 2 5) - -(deftest char-count.utf-8.2 () - ;; same as above with the last 2 octets missing - (handler-case - (vector-size-in-chars (ub8v 228 189 160 229) :errorp t) - (end-of-input-in-character (c) - (is (equalp #(229) (character-decoding-error-octets c))) - (is (eql 3 (character-coding-error-position c))) - (is (eq :utf-8 (character-coding-error-encoding c)))) - (:no-error (result) - (expected 'end-of-input-in-character :got result)))) - -;;; Lispworks bug? -;; #+lispworks -;; (pushnew 'dec.utf-8.1 rtest::*expected-failures*) - -(defstest dec.utf-8.1 - (octets-to-string (ub8v 228 189 160 229) :errorp nil) - #(#\u4f60 #\ufffd)) - -(deftest dec.utf-8.2 () - (handler-case - (octets-to-string (ub8v 228 189 160 229) :errorp t) - (end-of-input-in-character (c) - (is (equalp #(229) (character-decoding-error-octets c))) - (is (eql 3 (character-coding-error-position c))) - (is (eq :utf-8 (character-coding-error-encoding c)))) - (:no-error (result) - (expected 'end-of-input-in-character :got result)))) - -;;;; UTF-16 - -;;; Test that the BOM is not being counted as a character. -(deftest char-count.utf-16.bom () - (is (eql (vector-size-in-chars (ub8v #xfe #xff #x00 #x55 #x00 #x54 #x00 #x46) - :encoding :utf-16) - 3)) - (is (eql (vector-size-in-chars (ub8v #xff #xfe #x00 #x55 #x00 #x54 #x00 #x46) - :encoding :utf-16) - 3))) - -;;;; UTF-32 - -;;; RT: check that UTF-32 characters without a BOM are treated as -;;; little-endian. -(deftest endianness.utf-32.no-bom () - (is (string= "a" (octets-to-string (ub8v 0 0 0 97) :encoding :utf-32)))) - -;;;; MORE TESTS - -(defparameter *standard-characters* - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!$\"'(),_-./:;?+<=>#%&*@[\\]{|}`^~") - -;;; Testing consistency by encoding and decoding a simple string for -;;; all character encodings. -(deftest rw-equiv.1 () - (let ((compatible-encodings (remove :ebcdic-international (list-character-encodings)))) - (dolist (*default-character-encoding* compatible-encodings) - (let ((octets (string-to-octets *standard-characters*))) - (is (string= (octets-to-string octets) *standard-characters*)))))) - -;;; FIXME: assumes little-endianness. Easily fixable when we -;;; implement the BE and LE variants of :UTF-16. -(deftest concatenate-strings-to-octets-equiv.1 () - (let ((foo (octets-to-string (ub8v 102 195 186 195 186) - :encoding :utf-8)) - (bar (octets-to-string (ub8v 98 195 161 114) - :encoding :utf-8))) - ;; note: FOO and BAR are not ascii - (is (equalp (concatenate-strings-to-octets :utf-8 foo bar) - (ub8v 102 195 186 195 186 98 195 161 114))) - (is (equalp (concatenate-strings-to-octets :utf-16 foo bar) - (ub8v 102 0 250 0 250 0 98 0 225 0 114 0))))) - -;;;; Testing against files generated by GNU iconv. - -(defun test-file (name type) - (uiop:subpathname (asdf:system-relative-pathname "babel-tests" "tests/") - name :type type)) - -(defun read-test-file (name type) - (with-open-file (in (test-file name type) :element-type '(unsigned-byte 8)) - (let* ((data (loop for byte = (read-byte in nil nil) - until (null byte) collect byte))) - (make-array (length data) :element-type '(unsigned-byte 8) - :initial-contents data)))) - -(deftest test-encoding (enc &optional input-enc-name) - (let* ((*default-character-encoding* enc) - (enc-name (string-downcase (symbol-name enc))) - (utf8-octets (read-test-file enc-name "txt-utf8")) - (foo-octets (read-test-file (or input-enc-name enc-name) "txt")) - (utf8-string (octets-to-string utf8-octets :encoding :utf-8 :errorp t)) - (foo-string (octets-to-string foo-octets :errorp t))) - (is (string= utf8-string foo-string)) - (is (= (length foo-string) (vector-size-in-chars foo-octets :errorp t))) - (unless (member enc '(:utf-16 :utf-32)) - ;; FIXME: skipping UTF-16 and UTF-32 because of the BOMs and - ;; because the input might not be in native-endian order so the - ;; comparison will fail there. - (let ((new-octets (string-to-octets foo-string :errorp t))) - (is (equalp new-octets foo-octets)) - (is (eql (length foo-octets) - (string-size-in-octets foo-string :errorp t))))))) - -(deftest iconv-test () - (dolist (enc '(:ascii :ebcdic-us :utf-8 :utf-16 :utf-32)) - (case enc - (:utf-16 (test-encoding :utf-16 "utf-16-with-le-bom")) - (:utf-32 (test-encoding :utf-32 "utf-32-with-le-bom"))) - (test-encoding enc))) - -;;; RT: accept encoding objects in LOOKUP-MAPPING etc. -(defstest encoding-objects.1 - (string-to-octets "abc" :encoding (get-character-encoding :ascii)) - #(97 98 99)) - -(defmacro with-sharp-backslash-syntax (&body body) - `(let ((*readtable* (copy-readtable *readtable*))) - (set-sharp-backslash-syntax-in-readtable) - ,@body)) - -(defstest sharp-backslash.1 - (with-sharp-backslash-syntax - (loop for string in '("#\\a" "#\\u" "#\\ued") - collect (char-code (read-from-string string)))) - (97 117 #xed)) - -(deftest sharp-backslash.2 () - (signals reader-error (with-sharp-backslash-syntax - (read-from-string "#\\u12zz")))) - -(deftest test-read-from-string (string object position) - "Test that (read-from-string STRING) returns values OBJECT and POSITION." - (multiple-value-bind (obj pos) - (read-from-string string) - (is (eql object obj)) - (is (eql position pos)))) - -;;; RT: our #\ reader didn't honor *READ-SUPPRESS*. -(deftest sharp-backslash.3 () - (with-sharp-backslash-syntax - (let ((*read-suppress* t)) - (test-read-from-string "#\\ujunk" nil 7) - (test-read-from-string "#\\u12zz" nil 7)))) - -;;; RT: the slow implementation of with-simple-vector was buggy. -(defstest string-to-octets.1 - (code-char (aref (string-to-octets "abc" :start 1 :end 2) 0)) - #\b) - -(defstest simple-base-string.1 - (string-to-octets (coerce "abc" 'base-string) :encoding :ascii) - #(97 98 99)) - -;;; For now, disable this tests for Lisps that are strict about -;;; non-character code points. In the future, simply mark them as -;;; expected failures. -#-(or abcl ccl) -(progn - (defstest utf-8b.1 - (string-to-octets (coerce #(#\a #\b #\udcf0) 'unicode-string) - :encoding :utf-8b) - #(97 98 #xf0)) - - #+#:temporarily-disabled - (defstest utf-8b.2 - (octets-to-string (ub8v 97 98 #xcd) :encoding :utf-8b) - #(#\a #\b #\udccd)) - - (defstest utf-8b.3 - (octets-to-string (ub8v 97 #xf0 #xf1 #xff #x01) :encoding :utf-8b) - #(#\a #\udcf0 #\udcf1 #\udcff #\udc01)) - - (deftest utf-8b.4 () - (let* ((octets (coerce (loop repeat 8192 collect (random (+ #x82))) - '(array (unsigned-byte 8) (*)))) - (string (octets-to-string octets :encoding :utf-8b))) - (is (equalp octets (string-to-octets string :encoding :utf-8b)))))) - -;;; The following tests have been adapted from SBCL's -;;; tests/octets.pure.lisp file. - -(deftest ensure-roundtrip-ascii () - (let ((octets (make-ub8-vector 128))) - (dotimes (i 128) - (setf (aref octets i) i)) - (let* ((str (octets-to-string octets :encoding :ascii)) - (oct2 (string-to-octets str :encoding :ascii))) - (is (= (length octets) (length oct2))) - (is (every #'= octets oct2))))) - -(deftest test-8bit-roundtrip (enc) - (let ((octets (make-ub8-vector 256))) - (dotimes (i 256) - (setf (aref octets i) i)) - (let* ((str (octets-to-string octets :encoding enc))) - ;; remove the undefined code-points because they translate - ;; to #xFFFD and string-to-octets raises an error when - ;; encoding #xFFFD - (multiple-value-bind (filtered-str filtered-octets) - (let ((s (make-array 0 :element-type 'character - :adjustable t :fill-pointer 0)) - (o (make-array 0 :element-type '(unsigned-byte 16) - :adjustable t :fill-pointer 0))) - (loop for i below 256 - for c = (aref str i) - when (/= (char-code c) #xFFFD) - do (vector-push-extend c s) - (vector-push-extend (aref octets i) o)) - (values s o)) - (let ((oct2 (string-to-octets filtered-str :encoding enc))) - (is (eql (length filtered-octets) (length oct2))) - (is (every #'eql filtered-octets oct2))))))) - -(defparameter *iso-8859-charsets* - '(:iso-8859-1 :iso-8859-2 :iso-8859-3 :iso-8859-4 :iso-8859-5 :iso-8859-6 - :iso-8859-7 :iso-8859-8 :iso-8859-9 :iso-8859-10 :iso-8859-11 :iso-8859-13 - :iso-8859-14 :iso-8859-15 :iso-8859-16)) - -;;; Don't actually see what comes out, but there shouldn't be any -;;; errors. -(deftest iso-8859-roundtrip-no-checking () - (loop for enc in *iso-8859-charsets* do (test-8bit-roundtrip enc))) - -(deftest ensure-roundtrip-latin () - (loop for enc in '(:latin1 :latin9) do (test-8bit-roundtrip enc))) - -;;; Latin-9 chars; the previous test checked roundtrip from -;;; octets->char and back, now test that the latin-9 characters did in -;;; fact appear during that trip. -(deftest ensure-roundtrip-latin9 () - (let ((l9c (map 'string #'code-char '(8364 352 353 381 382 338 339 376)))) - (is (string= (octets-to-string (string-to-octets l9c :encoding :latin9) - :encoding :latin9) - l9c)))) - -;; Expected to fail on Lisps that are strict about non-character code -;; points. Mark this as an expected failure when Stefil supports such -;; a feature. -#-(or abcl ccl) -(deftest code-char-nilness () - (is (loop for i below unicode-char-code-limit - never (null (code-char i))))) - -(deftest test-unicode-roundtrip (enc) - (let ((string (make-string unicode-char-code-limit))) - (dotimes (i unicode-char-code-limit) - (setf (char string i) - (if (or (<= #xD800 i #xDFFF) - (<= #xFDD0 i #xFDEF) - (eql (logand i #xFFFF) #xFFFF) - (eql (logand i #xFFFF) #xFFFE)) - #\? ; don't try to encode non-characters. - (code-char i)))) - (let ((string2 (octets-to-string - (string-to-octets string :encoding enc :errorp t) - :encoding enc :errorp t))) - (is (eql (length string2) (length string))) - (is (string= string string2))))) - -(deftest ensure-roundtrip.utf8 () - (test-unicode-roundtrip :utf-8)) - -(deftest ensure-roundtrip.utf16 () - (test-unicode-roundtrip :utf-16)) - -(deftest ensure-roundtrip.utf32 () - (test-unicode-roundtrip :utf-32)) - -#+sbcl -(progn - (deftest test-encode-against-sbcl (enc) - (let ((string (make-string unicode-char-code-limit))) - (dotimes (i unicode-char-code-limit) - (setf (char string i) (code-char i))) - (loop for ch across string - for babel = (string-to-octets (string ch) :encoding enc) - for sbcl = (sb-ext:string-to-octets (string ch) - :external-format enc) - do (is (equalp babel sbcl))))) - - ;; not run automatically because it's a bit slow (1114112 assertions) - (deftest (test-encode-against-sbcl.utf-8 :auto-call nil) () - (test-encode-against-sbcl :utf-8))) - -(deftest non-ascii-bytes () - (let ((octets (make-array 128 - :element-type '(unsigned-byte 8) - :initial-contents (loop for i from 128 below 256 - collect i)))) - (is (string= (octets-to-string octets :encoding :ascii :errorp nil) - (make-string 128 :initial-element #\Sub))))) - -(deftest non-ascii-chars () - (let ((string (make-array 128 - :element-type 'character - :initial-contents (loop for i from 128 below 256 - collect (code-char i))))) - (is (equalp (string-to-octets string :encoding :ascii :errorp nil) - (make-array 128 :initial-element (char-code #\Sub)))))) - -;;;; The following UTF-8 decoding tests are adapted from -;;;; . - -(deftest utf8-decode-test (octets expected-results expected-errors) - (let ((string (octets-to-string (coerce octets '(vector (unsigned-byte 8) *)) - :encoding :utf-8 :errorp nil))) - (is (string= expected-results string)) - (is (= (count #\ufffd string) expected-errors)))) - -(deftest utf8-decode-tests (octets expected-results) - (setf expected-results (coerce expected-results '(simple-array character (*)))) - (let ((expected-errors (count #\? expected-results)) - (expected-results (substitute #\ufffd #\? expected-results))) - (utf8-decode-test octets expected-results expected-errors) - (utf8-decode-test (concatenate 'vector '(34) octets '(34)) - (format nil "\"~A\"" expected-results) - expected-errors))) - -(deftest utf8-too-big-characters () - (utf8-decode-tests #(#xf4 #x90 #x80 #x80) "?") ; #x110000 - (utf8-decode-tests #(#xf7 #xbf #xbf #xbf) "?") ; #x1fffff - (utf8-decode-tests #(#xf8 #x88 #x80 #x80 #x80) "?") ; #x200000 - (utf8-decode-tests #(#xfb #xbf #xbf #xbf #xbf) "?") ; #x3ffffff - (utf8-decode-tests #(#xfc #x84 #x80 #x80 #x80 #x80) "?") ; #x4000000e - (utf8-decode-tests #(#xfd #xbf #xbf #xbf #xbf #xbf) "?")) ; #x7fffffff - -(deftest utf8-unexpected-continuation-bytes () - (utf8-decode-tests #(#x80) "?") - (utf8-decode-tests #(#xbf) "?") - (utf8-decode-tests #(#x80 #xbf) "??") - (utf8-decode-tests #(#x80 #xbf #x80) "???") - (utf8-decode-tests #(#x80 #xbf #x80 #xbf) "????") - (utf8-decode-tests #(#x80 #xbf #x80 #xbf #x80) "?????") - (utf8-decode-tests #(#x80 #xbf #x80 #xbf #x80 #xbf) "??????") - (utf8-decode-tests #(#x80 #xbf #x80 #xbf #x80 #xbf #x80) "???????")) - -;;; All 64 continuation bytes in a row. -(deftest utf8-continuation-bytes () - (apply #'utf8-decode-tests - (loop for i from #x80 to #xbf - collect i into bytes - collect #\? into chars - finally (return (list bytes - (coerce chars 'string)))))) - -(deftest utf8-lonely-start-characters () - (flet ((lsc (first last) - (apply #'utf8-decode-tests - (loop for i from first to last - nconc (list i 32) into bytes - nconc (list #\? #\Space) into chars - finally (return (list bytes (coerce chars 'string))))) - (apply #'utf8-decode-tests - (loop for i from first to last - collect i into bytes - collect #\? into chars - finally (return - (list bytes (coerce chars 'string))))))) - (lsc #xc0 #xdf) ; 2-byte sequence start chars - (lsc #xe0 #xef) ; 3-byte - (lsc #xf0 #xf7) ; 4-byte - (lsc #xf8 #xfb) ; 5-byte - (lsc #xfc #xfd))) ; 6-byte - -;;; Otherwise incomplete sequences (last continuation byte missing) -(deftest utf8-incomplete-sequences () - (utf8-decode-tests #0=#(#xc0) "?") - (utf8-decode-tests #1=#(#xe0 #x80) "?") - (utf8-decode-tests #2=#(#xf0 #x80 #x80) "?") - (utf8-decode-tests #3=#(#xf8 #x80 #x80 #x80) "?") - (utf8-decode-tests #4=#(#xfc #x80 #x80 #x80 #x80) "?") - (utf8-decode-tests #5=#(#xdf) "?") - (utf8-decode-tests #6=#(#xef #xbf) "?") - (utf8-decode-tests #7=#(#xf7 #xbf #xbf) "?") - (utf8-decode-tests #8=#(#xfb #xbf #xbf #xbf) "?") - (utf8-decode-tests #9=#(#xfd #xbf #xbf #xbf #xbf) "?") - ;; All ten previous tests concatenated - (utf8-decode-tests (concatenate 'vector - #0# #1# #2# #3# #4# #5# #6# #7# #8# #9#) - "??????????")) - -(deftest utf8-random-impossible-bytes () - (utf8-decode-tests #(#xfe) "?") - (utf8-decode-tests #(#xff) "?") - (utf8-decode-tests #(#xfe #xfe #xff #xff) "????")) - -(deftest utf8-overlong-sequences-/ () - (utf8-decode-tests #(#xc0 #xaf) "?") - (utf8-decode-tests #(#xe0 #x80 #xaf) "?") - (utf8-decode-tests #(#xf0 #x80 #x80 #xaf) "?") - (utf8-decode-tests #(#xf8 #x80 #x80 #x80 #xaf) "?") - (utf8-decode-tests #(#xfc #x80 #x80 #x80 #x80 #xaf) "?")) - -(deftest utf8-overlong-sequences-rubout () - (utf8-decode-tests #(#xc1 #xbf) "?") - (utf8-decode-tests #(#xe0 #x9f #xbf) "?") - (utf8-decode-tests #(#xf0 #x8f #xbf #xbf) "?") - (utf8-decode-tests #(#xf8 #x87 #xbf #xbf #xbf) "?") - (utf8-decode-tests #(#xfc #x83 #xbf #xbf #xbf #xbf) "?")) - -(deftest utf8-overlong-sequences-null () - (utf8-decode-tests #(#xc0 #x80) "?") - (utf8-decode-tests #(#xe0 #x80 #x80) "?") - (utf8-decode-tests #(#xf0 #x80 #x80 #x80) "?") - (utf8-decode-tests #(#xf8 #x80 #x80 #x80 #x80) "?") - (utf8-decode-tests #(#xfc #x80 #x80 #x80 #x80 #x80) "?")) - -;;;; End of adapted SBCL tests. - -;;; Expected to fail, for now. -#+#:ignore -(deftest utf8-illegal-code-positions () - ;; single UTF-16 surrogates - (utf8-decode-tests #(#xed #xa0 #x80) "?") - (utf8-decode-tests #(#xed #xad #xbf) "?") - (utf8-decode-tests #(#xed #xae #x80) "?") - (utf8-decode-tests #(#xed #xaf #xbf) "?") - (utf8-decode-tests #(#xed #xb0 #x80) "?") - (utf8-decode-tests #(#xed #xbe #x80) "?") - (utf8-decode-tests #(#xed #xbf #xbf) "?") - ;; paired UTF-16 surrogates - (utf8-decode-tests #(ed a0 80 ed b0 80) "??") - (utf8-decode-tests #(ed a0 80 ed bf bf) "??") - (utf8-decode-tests #(ed ad bf ed b0 80) "??") - (utf8-decode-tests #(ed ad bf ed bf bf) "??") - (utf8-decode-tests #(ed ae 80 ed b0 80) "??") - (utf8-decode-tests #(ed ae 80 ed bf bf) "??") - (utf8-decode-tests #(ed af bf ed b0 80) "??") - (utf8-decode-tests #(ed af bf ed bf bf) "??") - ;; other illegal code positions - (utf8-decode-tests #(#xef #xbf #xbe) "?") ; #\uFFFE - (utf8-decode-tests #(#xef #xbf #xbf) "?")) ; #\uFFFF - -;;; A list of the ISO-8859 encodings where each element is a cons with -;;; the car being a keyword denoting the encoding and the cdr being a -;;; vector enumerating the corresponding character codes. -;;; -;;; It was auto-generated from files which can be found at -;;; . -;;; -;;; Taken from flexi-streams. -(defparameter *iso-8859-tables* - '((:iso-8859-1 . - #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 - 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 - 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 - 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 - 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 - 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 - 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 - 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 - 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 - 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 - 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 - 243 244 245 246 247 248 249 250 251 252 253 254 255)) - - (:iso-8859-2 . - #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 - 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 - 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 - 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 - 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 - 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 - 153 154 155 156 157 158 159 160 260 728 321 164 317 346 167 168 352 350 - 356 377 173 381 379 176 261 731 322 180 318 347 711 184 353 351 357 378 - 733 382 380 340 193 194 258 196 313 262 199 268 201 280 203 282 205 206 - 270 272 323 327 211 212 336 214 215 344 366 218 368 220 221 354 223 341 - 225 226 259 228 314 263 231 269 233 281 235 283 237 238 271 273 324 328 - 243 244 337 246 247 345 367 250 369 252 253 355 729)) - - (:iso-8859-3 . - #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 - 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 - 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 - 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 - 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 - 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 - 153 154 155 156 157 158 159 160 294 728 163 164 65533 292 167 168 304 - 350 286 308 173 65533 379 176 295 178 179 180 181 293 183 184 305 351 - 287 309 189 65533 380 192 193 194 65533 196 266 264 199 200 201 202 203 - 204 205 206 207 65533 209 210 211 212 288 214 215 284 217 218 219 220 - 364 348 223 224 225 226 65533 228 267 265 231 232 233 234 235 236 237 - 238 239 65533 241 242 243 244 289 246 247 285 249 250 251 252 365 349 - 729)) - - (:iso-8859-4 . - #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 - 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 - 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 - 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 - 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 - 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 - 153 154 155 156 157 158 159 160 260 312 342 164 296 315 167 168 352 274 - 290 358 173 381 175 176 261 731 343 180 297 316 711 184 353 275 291 359 - 330 382 331 256 193 194 195 196 197 198 302 268 201 280 203 278 205 206 - 298 272 325 332 310 212 213 214 215 216 370 218 219 220 360 362 223 257 - 225 226 227 228 229 230 303 269 233 281 235 279 237 238 299 273 326 333 - 311 244 245 246 247 248 371 250 251 252 361 363 729)) - - (:iso-8859-5 . - #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 - 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 - 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 - 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 - 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 - 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 - 153 154 155 156 157 158 159 160 1025 1026 1027 1028 1029 1030 1031 1032 - 1033 1034 1035 1036 173 1038 1039 1040 1041 1042 1043 1044 1045 1046 - 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 - 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 - 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 - 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 - 1103 8470 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 - 167 1118 1119)) - - (:iso-8859-6 . - #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 - 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 - 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 - 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 - 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 - 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 - 153 154 155 156 157 158 159 160 65533 65533 65533 164 65533 65533 65533 - 65533 65533 65533 65533 1548 173 65533 65533 65533 65533 65533 65533 - 65533 65533 65533 65533 65533 65533 65533 1563 65533 65533 65533 1567 - 65533 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 - 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 65533 - 65533 65533 65533 65533 1600 1601 1602 1603 1604 1605 1606 1607 1608 - 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 65533 65533 65533 - 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533)) - - (:iso-8859-7 . - #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 - 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 - 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 - 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 - 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 - 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 - 153 154 155 156 157 158 159 160 8216 8217 163 8364 8367 166 167 168 169 - 890 171 172 173 65533 8213 176 177 178 179 900 901 902 183 904 905 906 - 187 908 189 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 - 925 926 927 928 929 65533 931 932 933 934 935 936 937 938 939 940 941 - 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 - 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 65533)) - - (:iso-8859-8 . - #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 - 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 - 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 - 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 - 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 - 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 - 153 154 155 156 157 158 159 160 65533 162 163 164 165 166 167 168 169 - 215 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 247 187 - 188 189 190 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 - 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 - 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 8215 1488 - 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 - 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 65533 65533 - 8206 8207 65533)) - - (:iso-8859-9 . - #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 - 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 - 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 - 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 - 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 - 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 - 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 - 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 - 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 - 207 286 209 210 211 212 213 214 215 216 217 218 219 220 304 350 223 224 - 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 287 241 242 - 243 244 245 246 247 248 249 250 251 252 305 351 255)) - - (:iso-8859-10 . - #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 - 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 - 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 - 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 - 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 - 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 - 153 154 155 156 157 158 159 160 260 274 290 298 296 310 167 315 272 352 - 358 381 173 362 330 176 261 275 291 299 297 311 183 316 273 353 359 382 - 8213 363 331 256 193 194 195 196 197 198 302 268 201 280 203 278 205 206 - 207 208 325 332 211 212 213 214 360 216 370 218 219 220 221 222 223 257 - 225 226 227 228 229 230 303 269 233 281 235 279 237 238 239 240 326 333 - 243 244 245 246 361 248 371 250 251 252 253 254 312)) - - (:iso-8859-11 . - #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 - 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 - 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 - 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 - 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 - 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 - 153 154 155 156 157 158 159 160 3585 3586 3587 3588 3589 3590 3591 3592 - 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 - 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 - 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 - 3635 3636 3637 3638 3639 3640 3641 3642 65533 65533 65533 65533 3647 - 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 - 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 - 65533 65533 65533 65533)) - - (:iso-8859-13 . - #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 - 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 - 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 - 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 - 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 - 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 - 153 154 155 156 157 158 159 160 8221 162 163 164 8222 166 167 216 169 - 342 171 172 173 174 198 176 177 178 179 8220 181 182 183 248 185 343 187 - 188 189 190 230 260 302 256 262 196 197 280 274 268 201 377 278 290 310 - 298 315 352 323 325 211 332 213 214 215 370 321 346 362 220 379 381 223 - 261 303 257 263 228 229 281 275 269 233 378 279 291 311 299 316 353 324 - 326 243 333 245 246 247 371 322 347 363 252 380 382 8217)) - - (:iso-8859-14 . - #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 - 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 - 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 - 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 - 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 - 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 - 153 154 155 156 157 158 159 160 7682 7683 163 266 267 7690 167 7808 169 - 7810 7691 7922 173 174 376 7710 7711 288 289 7744 7745 182 7766 7809 - 7767 7811 7776 7923 7812 7813 7777 192 193 194 195 196 197 198 199 200 - 201 202 203 204 205 206 207 372 209 210 211 212 213 214 7786 216 217 218 - 219 220 221 374 223 224 225 226 227 228 229 230 231 232 233 234 235 236 - 237 238 239 373 241 242 243 244 245 246 7787 248 249 250 251 252 253 375 - 255)) - - (:iso-8859-15 . - #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 - 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 - 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 - 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 - 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 - 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 - 153 154 155 156 157 158 159 160 161 162 163 8364 165 352 167 353 169 170 - 171 172 173 174 175 176 177 178 179 381 181 182 183 382 185 186 187 338 - 339 376 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 - 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 - 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 - 243 244 245 246 247 248 249 250 251 252 253 254 255)) - - (:iso-8859-16 . - #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 - 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 - 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 - 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 - 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 - 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 - 153 154 155 156 157 158 159 160 260 261 321 8364 8222 352 167 353 169 - 536 171 377 173 378 379 176 177 268 322 381 8221 182 183 382 269 537 187 - 338 339 376 380 192 193 194 258 196 262 198 199 200 201 202 203 204 205 - 206 207 272 323 210 211 212 336 214 346 368 217 218 219 220 280 538 223 - 224 225 226 259 228 263 230 231 232 233 234 235 236 237 238 239 273 324 - 242 243 244 337 246 347 369 249 250 251 252 281 539 255)))) - -(deftest iso-8859-decode-check () - (loop for enc in *iso-8859-charsets* - for octets = (let ((octets (make-ub8-vector 256))) - (dotimes (i 256 octets) - (setf (aref octets i) i))) - for string = (octets-to-string octets :encoding enc) - do (is (equalp (map 'vector #'char-code string) - (cdr (assoc enc *iso-8859-tables*)))))) - -(deftest character-out-of-range.utf-32 () - (signals character-out-of-range - (octets-to-string (ub8v 0 0 #xfe #xff 0 #x11 0 0) - :encoding :utf-32 :errorp t))) - -;;; RT: encoders and decoders were returning bogus values. -(deftest encoder/decoder-retvals (encoding &optional (test-string (coerce "abc" '(simple-array character (*))))) - (let* ((mapping (lookup-mapping babel::*string-vector-mappings* encoding)) - (strlen (length test-string)) - ;; encoding - (octet-precount (funcall (octet-counter mapping) - test-string 0 strlen -1)) - (array (make-array octet-precount :element-type '(unsigned-byte 8))) - (encoded-octet-count (funcall (encoder mapping) - test-string 0 strlen array 0)) - ;; decoding - (string (make-string strlen)) - (char-precount (funcall (code-point-counter mapping) - array 0 octet-precount -1)) - (char-count (funcall (decoder mapping) - array 0 octet-precount string 0))) - (is (= octet-precount encoded-octet-count)) - (is (= char-precount char-count)) - (is (string= test-string string)))) - -(deftest encoder-and-decoder-return-values () - (mapcar 'encoder/decoder-retvals - (remove-if 'ambiguous-encoding-p - (list-character-encodings)))) - -(deftest code-point-sweep (encoding) - (finishes - (dotimes (i char-code-limit) - (let ((char (ignore-errors (code-char i)))) - (when char - (ignore-some-conditions (character-encoding-error) - (string-to-octets (string char) :encoding encoding))))))) - -#+enable-slow-babel-tests -(deftest code-point-sweep-all-encodings () - (mapc #'code-point-sweep (list-character-encodings))) - -(deftest octet-sweep (encoding) - (finishes - (loop for b1 upto #xff do - (loop for b2 upto #xff do - (loop for b3 upto #xff do - (loop for b4 upto #xff do - (ignore-some-conditions (character-decoding-error) - (octets-to-string (ub8v b1 b2 b3 b4) :encoding encoding)))))))) - -#+enable-slow-babel-tests -(deftest octet-sweep-all-encodings () - (mapc #'octet-sweep (list-character-encodings))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16-with-le-bom.txt b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16-with-le-bom.txt deleted file mode 100644 index 7c40274dc6d53fe89cbf1e73217c93475deedfab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15244 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 JI$xEG0RTxZe*ypi diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16.txt b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16.txt deleted file mode 100644 index ca4a8e6123f7109931ca3126274b3d61f5fde48c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15244 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16.txt-utf8 b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16.txt-utf8 deleted file mode 100644 index 4363f27..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16.txt-utf8 +++ /dev/null @@ -1,212 +0,0 @@ - -UTF-8 encoded sample plain-text file -‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ - -Markus Kuhn [ˈmaʳkÊŠs kuËn] — 2002-07-25 - - -The ASCII compatible UTF-8 encoding used in this plain-text file -is defined in Unicode, ISO 10646-1, and RFC 2279. - - -Using Unicode/UTF-8, you can write in emails and source code things such as - -Mathematics and sciences: - - ∮ Eâ‹…da = Q, n → ∞, ∑ f(i) = ∠g(i), ⎧⎡⎛┌─────â”⎞⎤⎫ - ⎪⎢⎜│a²+b³ ⎟⎥⎪ - ∀x∈â„: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪ - ⎪⎢⎜⎷ c₈ ⎟⎥⎪ - â„• ⊆ â„•â‚€ ⊂ ℤ ⊂ ℚ ⊂ ℠⊂ â„‚, ⎨⎢⎜ ⎟⎥⎬ - ⎪⎢⎜ ∞ ⎟⎥⎪ - ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪ - ⎪⎢⎜ ⎳aâ±-bâ±âŽŸâŽ¥âŽª - 2Hâ‚‚ + Oâ‚‚ ⇌ 2Hâ‚‚O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣âŽi=1 ⎠⎦⎭ - -Linguistics and dictionaries: - - ði ıntəˈnæʃənÉ™l fəˈnÉ›tık É™soÊŠsiˈeıʃn - Y [ˈÊpsilÉ”n], Yen [jÉ›n], Yoga [ˈjoËgÉ‘] - -APL: - - ((Vâ³V)=â³â´V)/Vâ†,V ⌷â†â³â†’â´âˆ†âˆ‡âŠƒâ€¾âŽâ•⌈ - -Nicer typography in plain text files: - - â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•— - â•‘ â•‘ - â•‘ • ‘single’ and “double†quotes â•‘ - â•‘ â•‘ - â•‘ • Curly apostrophes: “We’ve been here†║ - â•‘ â•‘ - â•‘ • Latin-1 apostrophe and accents: '´` â•‘ - â•‘ â•‘ - â•‘ • ‚deutsche‘ „Anführungszeichen“ â•‘ - â•‘ â•‘ - â•‘ • †, ‡, ‰, •, 3–4, —, −5/+5, â„¢, … â•‘ - â•‘ â•‘ - â•‘ • ASCII safety test: 1lI|, 0OD, 8B â•‘ - â•‘ ╭─────────╮ â•‘ - â•‘ • the euro symbol: │ 14.95 € │ â•‘ - â•‘ ╰─────────╯ â•‘ - ╚â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â• - -Combining characters: - - STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑ - -Greek (in Polytonic): - - The Greek anthem: - - Σὲ γνωÏίζω ἀπὸ τὴν κόψη - τοῦ σπαθιοῦ τὴν Ï„ÏομεÏá½µ, - σὲ γνωÏίζω ἀπὸ τὴν ὄψη - ποὺ μὲ βία μετÏάει τὴ γῆ. - - ᾿Απ᾿ τὰ κόκκαλα βγαλμένη - τῶν ῾Ελλήνων τὰ ἱεÏá½± - καὶ σὰν Ï€Ïῶτα ἀνδÏειωμένη - χαῖÏε, ὦ χαῖÏε, ᾿ΕλευθεÏιά! - - From a speech of Demosthenes in the 4th century BC: - - Οá½Ï‡á½¶ ταá½Ï„á½° παÏίσταταί μοι γιγνώσκειν, ὦ ἄνδÏες ᾿Αθηναῖοι, - ὅταν τ᾿ εἰς τὰ Ï€Ïάγματα ἀποβλέψω καὶ ὅταν Ï€Ïὸς τοὺς - λόγους οὓς ἀκούω· τοὺς μὲν Î³á½°Ï Î»á½¹Î³Î¿Ï…Ï‚ πεÏá½¶ τοῦ - τιμωÏήσασθαι Φίλιππον á½Ïá¿¶ γιγνομένους, τὰ δὲ Ï€Ïάγματ᾿ - εἰς τοῦτο Ï€Ïοήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αá½Ï„οὶ - Ï€ÏότεÏον κακῶς σκέψασθαι δέον. οá½Î´á½³Î½ οὖν ἄλλο μοι δοκοῦσιν - οἱ τὰ τοιαῦτα λέγοντες á¼¢ τὴν ὑπόθεσιν, πεÏá½¶ á¼§Ï‚ βουλεύεσθαι, - οá½Ï‡á½¶ τὴν οὖσαν παÏιστάντες ὑμῖν á¼Î¼Î±Ïτάνειν. á¼Î³á½¼ δέ, ὅτι μέν - ποτ᾿ á¼Î¾á¿†Î½ τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον - τιμωÏήσασθαι, καὶ μάλ᾿ ἀκÏιβῶς οἶδα· á¼Ï€á¾¿ á¼Î¼Î¿á¿¦ γάÏ, οὠπάλαι - γέγονεν ταῦτ᾿ ἀμφότεÏα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν - Ï€Ïολαβεῖν ἡμῖν εἶναι τὴν Ï€Ïώτην, ὅπως τοὺς συμμάχους - σώσομεν. á¼á½°Î½ Î³á½°Ï Ï„Î¿á¿¦Ï„Î¿ βεβαίως ὑπάÏξῃ, τότε καὶ πεÏá½¶ τοῦ - τίνα τιμωÏήσεταί τις καὶ ὃν Ï„Ïόπον á¼Î¾á½³ÏƒÏ„αι σκοπεῖν· Ï€Ïὶν δὲ - τὴν á¼€Ïχὴν á½€Ïθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι πεÏá½¶ τῆς - τελευτῆς á½Î½Ï„ινοῦν ποιεῖσθαι λόγον. - - Δημοσθένους, Γ´ ᾿Ολυνθιακὸς - -Georgian: - - From a Unicode conference invitation: - - გთხáƒáƒ•თ áƒáƒ®áƒšáƒáƒ•ე გáƒáƒ˜áƒáƒ áƒáƒ— რეგისტრáƒáƒªáƒ˜áƒ Unicode-ის მეáƒáƒ—ე სáƒáƒ”რთáƒáƒ¨áƒáƒ áƒ˜áƒ¡áƒ - კáƒáƒœáƒ¤áƒ”რენციáƒáƒ–ე დáƒáƒ¡áƒáƒ¡áƒ¬áƒ áƒ”ბáƒáƒ“, რáƒáƒ›áƒ”ლიც გáƒáƒ˜áƒ›áƒáƒ áƒ—ებრ10-12 მáƒáƒ áƒ¢áƒ¡, - ქ. მáƒáƒ˜áƒœáƒªáƒ¨áƒ˜, გერმáƒáƒœáƒ˜áƒáƒ¨áƒ˜. კáƒáƒœáƒ¤áƒ”რენცირშეჰკრებს ერთáƒáƒ“ მსáƒáƒ¤áƒšáƒ˜áƒáƒ¡ - ექსპერტებს ისეთ დáƒáƒ áƒ’ებში რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ ინტერნეტი დრUnicode-ი, - ინტერნáƒáƒªáƒ˜áƒáƒœáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ დრლáƒáƒ™áƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ, Unicode-ის გáƒáƒ›áƒáƒ§áƒ”ნებრ- áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒš სისტემებსáƒ, დრგáƒáƒ›áƒáƒ§áƒ”ნებით პრáƒáƒ’რáƒáƒ›áƒ”ბში, შრიფტებში, - ტექსტების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒáƒ¡áƒ დრმრáƒáƒ•áƒáƒšáƒ”ნáƒáƒ•áƒáƒœ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რულ სისტემებში. - -Russian: - - From a Unicode conference invitation: - - ЗарегиÑтрируйтеÑÑŒ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° ДеÑÑтую Международную Конференцию по - Unicode, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑоÑтоитÑÑ 10-12 марта 1997 года в Майнце в Германии. - ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ñоберет широкий круг ÑкÑпертов по вопроÑам глобального - Интернета и Unicode, локализации и интернационализации, воплощению и - применению Unicode в различных операционных ÑиÑтемах и программных - приложениÑÑ…, шрифтах, верÑтке и многоÑзычных компьютерных ÑиÑтемах. - -Thai (UCS Level 2): - - Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese - classic 'San Gua'): - - [----------------------------|------------------------] - ๠à¹à¸œà¹ˆà¸™à¸”ินฮั่นเสื่อมโทรมà¹à¸ªà¸™à¸ªà¸±à¸‡à¹€à¸§à¸Š พระปà¸à¹€à¸à¸¨à¸à¸­à¸‡à¸šà¸¹à¹Šà¸à¸¹à¹‰à¸‚ึ้นใหม่ - สิบสองà¸à¸©à¸±à¸•ริย์à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¹à¸¥à¸–ัดไป สององค์ไซร้โง่เขลาเบาปัà¸à¸à¸² - ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนัà¸à¸«à¸™à¸² - โฮจิ๋นเรียà¸à¸—ัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัภ- เหมือนขับไสไล่เสือจาà¸à¹€à¸„หา รับหมาป่าเข้ามาเลยอาสัภ- à¸à¹ˆà¸²à¸¢à¸­à¹‰à¸­à¸‡à¸­à¸¸à¹‰à¸™à¸¢à¸¸à¹à¸¢à¸à¹ƒà¸«à¹‰à¹à¸•à¸à¸à¸±à¸™ ใช้สาวนั้นเป็นชนวนชื่นชวนใจ - พลันลิฉุยà¸à¸¸à¸¢à¸à¸µà¸à¸¥à¸±à¸šà¸à¹ˆà¸­à¹€à¸«à¸•ุ ช่างอาเพศจริงหนาฟ้าร้องไห้ - ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูà¸à¸¹à¹‰à¸šà¸£à¸£à¸¥à¸±à¸‡à¸à¹Œ ฯ - - (The above is a two-column text. If combining characters are handled - correctly, the lines of the second column should be aligned with the - | character above.) - -Ethiopian: - - Proverbs in the Amharic language: - - ሰማይ አይታረስ ንጉሥ አይከሰስᢠ- ብላ ካለአእንደአባቴ በቆመጠáŠá¢ - ጌጥ ያለቤቱ á‰áˆáŒ¥áŠ“ áŠá‹á¢ - ደሀ በሕáˆáˆ™ ቅቤ ባይጠጣ ንጣት በገደለá‹á¢ - የአá ወለáˆá‰³ በቅቤ አይታሽáˆá¢ - አይጥ በበላ ዳዋ ተመታᢠ- ሲተረጉሙ ይደረáŒáˆ™á¢ - ቀስ በቀስᥠዕንá‰áˆ‹áˆ በእáŒáˆ© ይሄዳáˆá¢ - ድር ቢያብር አንበሳ ያስርᢠ- ሰዠእንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርáˆá¢ - እáŒá‹œáˆ­ የከáˆá‰°á‹áŠ• ጉሮሮ ሳይዘጋዠአይድርáˆá¢ - የጎረቤት ሌባᥠቢያዩት ይስቅ ባያዩት ያጠáˆá‰…ᢠ- ሥራ ከመáታት áˆáŒ„ን ላá‹á‰³á‰µá¢ - ዓባይ ማደሪያ የለá‹á¥ áŒáŠ•á‹µ ይዞ ይዞራáˆá¢ - የእስላሠአገሩ መካ የአሞራ አገሩ ዋርካᢠ- ተንጋሎ ቢተበተመáˆáˆ¶ ባá‰á¢ - ወዳጅህ ማር ቢሆን ጨርስህ አትላሰá‹á¢ - እáŒáˆ­áˆ…ን በáራሽህ áˆáŠ­ ዘርጋᢠ- -Runes: - - ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛠᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ áš¹á›áš¦ ᚦᚪ ᚹᛖᛥᚫ - - (Old English, which transcribed into Latin reads 'He cwaeth that he - bude thaem lande northweardum with tha Westsae.' and means 'He said - that he lived in the northern land near the Western Sea.') - -Braille: - - ⡌â â §â ‘ â ¼â â ’ â¡â œâ ‡â ‘⠹⠰⠎ ⡣⠕⠌ - - â¡â œâ ‡â ‘â ¹ â ºâ â Ž ⠙⠑â â ™â ’ â žâ • ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ â Šâ Ž â â • ⠙⠳⠃⠞ - â ±â â žâ ‘â §â » â â ƒâ ³â ž â ¹â â žâ ² ⡹⠑ ⠗⠑⠛⠊⠌⠻ â •â ‹ ⠙⠊⠎ ⠃⠥⠗⠊â â ‡ â ºâ â Ž - â Žâ Šâ ›â â « ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹â â â â ‚ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ â ¥â â ™â »â žâ â …⠻⠂ - â â â ™ ⠹⠑ â ¡â Šâ ‘â ‹ â â ³â —â â »â ² ⡎⠊⠗⠕⠕⠛⠑ â Žâ Šâ ›â â « â Šâ žâ ² â¡â â ™ - ⡎⠊⠗⠕⠕⠛⠑⠰⠎ â â â â ‘ â ºâ â Ž ⠛⠕⠕⠙ â ¥â â •â  â °â¡¡â â â ›â ‘â ‚ â ‹â •â — â â â ¹â ¹â ”â › ⠙⠑ - â ¡â •â Žâ ‘ â žâ • â â ¥â ž ⠙⠊⠎ â ™â â â ™ â žâ •â ² - - ⡕⠇⠙ â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² - - â¡â ”⠙⠖ ⡊ ⠙⠕â â °â ž â â ‘â â  â žâ • â Žâ â ¹ â ¹â â ž ⡊ â …â â ªâ ‚ â •â ‹ â â ¹ - â ªâ  â …â â ªâ ‡â «â ›â ‘â ‚ â ±â â ž ⠹⠻⠑ â Šâ Ž â â œâ žâ Šâ Šâ ¥â ‡â œâ ‡â ¹ ⠙⠑â â ™ â â ƒâ ³â ž - â  â ™â •â •â —â ¤â â â Šâ ‡â ² ⡊ â â Šâ £â ž â ™â â §â ‘ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ â â ¹â Žâ ‘⠇⠋⠂ â žâ • - ⠗⠑⠛⠜⠙ â  â Šâ •â ‹â ‹â ”â ¤â â â Šâ ‡ â â Ž ⠹⠑ ⠙⠑â â ™â ‘â Œ â â Šâ ‘â Šâ ‘ â •â ‹ â Šâ —â •â â â •â â ›â »â ¹ - â ” ⠹⠑ â žâ —â â ™â ‘â ² ⡃⠥⠞ ⠹⠑ â ºâ Šâ Žâ ™â •â  â •â ‹ ⠳⠗ â â â Šâ ‘⠌⠕⠗⠎ - â Šâ Ž â ” ⠹⠑ â Žâ Šâ â Šâ ‡â ‘â † â â â ™ â â ¹ â ¥â â ™â â ‡â ‡â ªâ « â ™â â â ™â Ž - â ©â â ‡â ‡ â â •â ž ⠙⠊⠌⠥⠗⠃ â Šâ žâ ‚ â •â — ⠹⠑ ⡊⠳â â žâ —⠹⠰⠎ ⠙⠕â â ‘ â ‹â •â —â ² ⡹⠳ - ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ â â »â â Šâ ž â â ‘ â žâ • â —â ‘â â ‘â â žâ ‚ â ‘â â â ™â â žâ Šâ Šâ â ‡â ‡â ¹â ‚ â ¹â â ž - â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² - - (The first couple of paragraphs of "A Christmas Carol" by Dickens) - -Compact font selection example text: - - ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 - abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ - –—‘“â€â€žâ€ â€¢â€¦â€°â„¢Å“ŠŸž€ ΑΒΓΔΩαβγδω ÐБВГДабвгд - ∀∂∈â„∧∪≡∞ ↑↗↨↻⇣ â”┼╔╘░►☺♀ ï¬ï¿½â‘€â‚‚ἠḂӥẄÉËâŽ×Աრ- -Greetings in various languages: - - Hello world, ΚαλημέÏα κόσμε, コンニãƒãƒ - -Box drawing alignment tests: â–ˆ - â–‰ - â•”â•â•╦â•â•â•— ┌──┬──┠╭──┬──╮ ╭──┬──╮ â”â”â”┳â”â”┓ ┎┒â”┑ â•· â•» â”┯┓ ┌┰┠▊ ╱╲╱╲╳╳╳ - ║┌─╨─â”â•‘ │╔â•â•§â•╗│ │╒â•╪â•╕│ │╓─â•─╖│ ┃┌─╂─â”┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ â”╋┥ â–‹ ╲╱╲╱╳╳╳ - ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ â•¿ │┃ â”╅╆┓ ╵ ╹ â”—â”·â”› └┸┘ â–Œ ╱╲╱╲╳╳╳ - â• â•¡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┠╎ â”┅┅┓ ┋ ■╲╱╲╱╳╳╳ - ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ â–Ž - ║└─╥─┘║ │╚â•╤â•â•│ │╘â•╪â•╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ â– - ╚â•â•â•©â•â•╠└──┴──┘ ╰──┴──╯ ╰──┴──╯ â”—â”â”â”»â”â”â”› ▗▄▖▛▀▜ └╌╌┘ ╎ â”—â•â•â”› ┋ â–▂▃▄▅▆▇█ - â–▀▘▙▄▟ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32-with-le-bom.txt b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32-with-le-bom.txt deleted file mode 100644 index 815e37b99cac82fba3f54a47348f6bd192d58947..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30488 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 HL(>HS$N_%> diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32.txt b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32.txt deleted file mode 100644 index fc2824ce9ee91fafd21bd861e1a057ad823cc9b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30488 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32.txt-utf8 b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32.txt-utf8 deleted file mode 100644 index 4363f27..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32.txt-utf8 +++ /dev/null @@ -1,212 +0,0 @@ - -UTF-8 encoded sample plain-text file -‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ - -Markus Kuhn [ˈmaʳkÊŠs kuËn] — 2002-07-25 - - -The ASCII compatible UTF-8 encoding used in this plain-text file -is defined in Unicode, ISO 10646-1, and RFC 2279. - - -Using Unicode/UTF-8, you can write in emails and source code things such as - -Mathematics and sciences: - - ∮ Eâ‹…da = Q, n → ∞, ∑ f(i) = ∠g(i), ⎧⎡⎛┌─────â”⎞⎤⎫ - ⎪⎢⎜│a²+b³ ⎟⎥⎪ - ∀x∈â„: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪ - ⎪⎢⎜⎷ c₈ ⎟⎥⎪ - â„• ⊆ â„•â‚€ ⊂ ℤ ⊂ ℚ ⊂ ℠⊂ â„‚, ⎨⎢⎜ ⎟⎥⎬ - ⎪⎢⎜ ∞ ⎟⎥⎪ - ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪ - ⎪⎢⎜ ⎳aâ±-bâ±âŽŸâŽ¥âŽª - 2Hâ‚‚ + Oâ‚‚ ⇌ 2Hâ‚‚O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣âŽi=1 ⎠⎦⎭ - -Linguistics and dictionaries: - - ði ıntəˈnæʃənÉ™l fəˈnÉ›tık É™soÊŠsiˈeıʃn - Y [ˈÊpsilÉ”n], Yen [jÉ›n], Yoga [ˈjoËgÉ‘] - -APL: - - ((Vâ³V)=â³â´V)/Vâ†,V ⌷â†â³â†’â´âˆ†âˆ‡âŠƒâ€¾âŽâ•⌈ - -Nicer typography in plain text files: - - â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•— - â•‘ â•‘ - â•‘ • ‘single’ and “double†quotes â•‘ - â•‘ â•‘ - â•‘ • Curly apostrophes: “We’ve been here†║ - â•‘ â•‘ - â•‘ • Latin-1 apostrophe and accents: '´` â•‘ - â•‘ â•‘ - â•‘ • ‚deutsche‘ „Anführungszeichen“ â•‘ - â•‘ â•‘ - â•‘ • †, ‡, ‰, •, 3–4, —, −5/+5, â„¢, … â•‘ - â•‘ â•‘ - â•‘ • ASCII safety test: 1lI|, 0OD, 8B â•‘ - â•‘ ╭─────────╮ â•‘ - â•‘ • the euro symbol: │ 14.95 € │ â•‘ - â•‘ ╰─────────╯ â•‘ - ╚â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â• - -Combining characters: - - STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑ - -Greek (in Polytonic): - - The Greek anthem: - - Σὲ γνωÏίζω ἀπὸ τὴν κόψη - τοῦ σπαθιοῦ τὴν Ï„ÏομεÏá½µ, - σὲ γνωÏίζω ἀπὸ τὴν ὄψη - ποὺ μὲ βία μετÏάει τὴ γῆ. - - ᾿Απ᾿ τὰ κόκκαλα βγαλμένη - τῶν ῾Ελλήνων τὰ ἱεÏá½± - καὶ σὰν Ï€Ïῶτα ἀνδÏειωμένη - χαῖÏε, ὦ χαῖÏε, ᾿ΕλευθεÏιά! - - From a speech of Demosthenes in the 4th century BC: - - Οá½Ï‡á½¶ ταá½Ï„á½° παÏίσταταί μοι γιγνώσκειν, ὦ ἄνδÏες ᾿Αθηναῖοι, - ὅταν τ᾿ εἰς τὰ Ï€Ïάγματα ἀποβλέψω καὶ ὅταν Ï€Ïὸς τοὺς - λόγους οὓς ἀκούω· τοὺς μὲν Î³á½°Ï Î»á½¹Î³Î¿Ï…Ï‚ πεÏá½¶ τοῦ - τιμωÏήσασθαι Φίλιππον á½Ïá¿¶ γιγνομένους, τὰ δὲ Ï€Ïάγματ᾿ - εἰς τοῦτο Ï€Ïοήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αá½Ï„οὶ - Ï€ÏότεÏον κακῶς σκέψασθαι δέον. οá½Î´á½³Î½ οὖν ἄλλο μοι δοκοῦσιν - οἱ τὰ τοιαῦτα λέγοντες á¼¢ τὴν ὑπόθεσιν, πεÏá½¶ á¼§Ï‚ βουλεύεσθαι, - οá½Ï‡á½¶ τὴν οὖσαν παÏιστάντες ὑμῖν á¼Î¼Î±Ïτάνειν. á¼Î³á½¼ δέ, ὅτι μέν - ποτ᾿ á¼Î¾á¿†Î½ τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον - τιμωÏήσασθαι, καὶ μάλ᾿ ἀκÏιβῶς οἶδα· á¼Ï€á¾¿ á¼Î¼Î¿á¿¦ γάÏ, οὠπάλαι - γέγονεν ταῦτ᾿ ἀμφότεÏα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν - Ï€Ïολαβεῖν ἡμῖν εἶναι τὴν Ï€Ïώτην, ὅπως τοὺς συμμάχους - σώσομεν. á¼á½°Î½ Î³á½°Ï Ï„Î¿á¿¦Ï„Î¿ βεβαίως ὑπάÏξῃ, τότε καὶ πεÏá½¶ τοῦ - τίνα τιμωÏήσεταί τις καὶ ὃν Ï„Ïόπον á¼Î¾á½³ÏƒÏ„αι σκοπεῖν· Ï€Ïὶν δὲ - τὴν á¼€Ïχὴν á½€Ïθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι πεÏá½¶ τῆς - τελευτῆς á½Î½Ï„ινοῦν ποιεῖσθαι λόγον. - - Δημοσθένους, Γ´ ᾿Ολυνθιακὸς - -Georgian: - - From a Unicode conference invitation: - - გთხáƒáƒ•თ áƒáƒ®áƒšáƒáƒ•ე გáƒáƒ˜áƒáƒ áƒáƒ— რეგისტრáƒáƒªáƒ˜áƒ Unicode-ის მეáƒáƒ—ე სáƒáƒ”რთáƒáƒ¨áƒáƒ áƒ˜áƒ¡áƒ - კáƒáƒœáƒ¤áƒ”რენციáƒáƒ–ე დáƒáƒ¡áƒáƒ¡áƒ¬áƒ áƒ”ბáƒáƒ“, რáƒáƒ›áƒ”ლიც გáƒáƒ˜áƒ›áƒáƒ áƒ—ებრ10-12 მáƒáƒ áƒ¢áƒ¡, - ქ. მáƒáƒ˜áƒœáƒªáƒ¨áƒ˜, გერმáƒáƒœáƒ˜áƒáƒ¨áƒ˜. კáƒáƒœáƒ¤áƒ”რენცირშეჰკრებს ერთáƒáƒ“ მსáƒáƒ¤áƒšáƒ˜áƒáƒ¡ - ექსპერტებს ისეთ დáƒáƒ áƒ’ებში რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ ინტერნეტი დრUnicode-ი, - ინტერნáƒáƒªáƒ˜áƒáƒœáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ დრლáƒáƒ™áƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ, Unicode-ის გáƒáƒ›áƒáƒ§áƒ”ნებრ- áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒš სისტემებსáƒ, დრგáƒáƒ›áƒáƒ§áƒ”ნებით პრáƒáƒ’რáƒáƒ›áƒ”ბში, შრიფტებში, - ტექსტების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒáƒ¡áƒ დრმრáƒáƒ•áƒáƒšáƒ”ნáƒáƒ•áƒáƒœ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რულ სისტემებში. - -Russian: - - From a Unicode conference invitation: - - ЗарегиÑтрируйтеÑÑŒ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° ДеÑÑтую Международную Конференцию по - Unicode, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑоÑтоитÑÑ 10-12 марта 1997 года в Майнце в Германии. - ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ñоберет широкий круг ÑкÑпертов по вопроÑам глобального - Интернета и Unicode, локализации и интернационализации, воплощению и - применению Unicode в различных операционных ÑиÑтемах и программных - приложениÑÑ…, шрифтах, верÑтке и многоÑзычных компьютерных ÑиÑтемах. - -Thai (UCS Level 2): - - Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese - classic 'San Gua'): - - [----------------------------|------------------------] - ๠à¹à¸œà¹ˆà¸™à¸”ินฮั่นเสื่อมโทรมà¹à¸ªà¸™à¸ªà¸±à¸‡à¹€à¸§à¸Š พระปà¸à¹€à¸à¸¨à¸à¸­à¸‡à¸šà¸¹à¹Šà¸à¸¹à¹‰à¸‚ึ้นใหม่ - สิบสองà¸à¸©à¸±à¸•ริย์à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¹à¸¥à¸–ัดไป สององค์ไซร้โง่เขลาเบาปัà¸à¸à¸² - ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนัà¸à¸«à¸™à¸² - โฮจิ๋นเรียà¸à¸—ัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัภ- เหมือนขับไสไล่เสือจาà¸à¹€à¸„หา รับหมาป่าเข้ามาเลยอาสัภ- à¸à¹ˆà¸²à¸¢à¸­à¹‰à¸­à¸‡à¸­à¸¸à¹‰à¸™à¸¢à¸¸à¹à¸¢à¸à¹ƒà¸«à¹‰à¹à¸•à¸à¸à¸±à¸™ ใช้สาวนั้นเป็นชนวนชื่นชวนใจ - พลันลิฉุยà¸à¸¸à¸¢à¸à¸µà¸à¸¥à¸±à¸šà¸à¹ˆà¸­à¹€à¸«à¸•ุ ช่างอาเพศจริงหนาฟ้าร้องไห้ - ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูà¸à¸¹à¹‰à¸šà¸£à¸£à¸¥à¸±à¸‡à¸à¹Œ ฯ - - (The above is a two-column text. If combining characters are handled - correctly, the lines of the second column should be aligned with the - | character above.) - -Ethiopian: - - Proverbs in the Amharic language: - - ሰማይ አይታረስ ንጉሥ አይከሰስᢠ- ብላ ካለአእንደአባቴ በቆመጠáŠá¢ - ጌጥ ያለቤቱ á‰áˆáŒ¥áŠ“ áŠá‹á¢ - ደሀ በሕáˆáˆ™ ቅቤ ባይጠጣ ንጣት በገደለá‹á¢ - የአá ወለáˆá‰³ በቅቤ አይታሽáˆá¢ - አይጥ በበላ ዳዋ ተመታᢠ- ሲተረጉሙ ይደረáŒáˆ™á¢ - ቀስ በቀስᥠዕንá‰áˆ‹áˆ በእáŒáˆ© ይሄዳáˆá¢ - ድር ቢያብር አንበሳ ያስርᢠ- ሰዠእንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርáˆá¢ - እáŒá‹œáˆ­ የከáˆá‰°á‹áŠ• ጉሮሮ ሳይዘጋዠአይድርáˆá¢ - የጎረቤት ሌባᥠቢያዩት ይስቅ ባያዩት ያጠáˆá‰…ᢠ- ሥራ ከመáታት áˆáŒ„ን ላá‹á‰³á‰µá¢ - ዓባይ ማደሪያ የለá‹á¥ áŒáŠ•á‹µ ይዞ ይዞራáˆá¢ - የእስላሠአገሩ መካ የአሞራ አገሩ ዋርካᢠ- ተንጋሎ ቢተበተመáˆáˆ¶ ባá‰á¢ - ወዳጅህ ማር ቢሆን ጨርስህ አትላሰá‹á¢ - እáŒáˆ­áˆ…ን በáራሽህ áˆáŠ­ ዘርጋᢠ- -Runes: - - ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛠᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ áš¹á›áš¦ ᚦᚪ ᚹᛖᛥᚫ - - (Old English, which transcribed into Latin reads 'He cwaeth that he - bude thaem lande northweardum with tha Westsae.' and means 'He said - that he lived in the northern land near the Western Sea.') - -Braille: - - ⡌â â §â ‘ â ¼â â ’ â¡â œâ ‡â ‘⠹⠰⠎ ⡣⠕⠌ - - â¡â œâ ‡â ‘â ¹ â ºâ â Ž ⠙⠑â â ™â ’ â žâ • ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ â Šâ Ž â â • ⠙⠳⠃⠞ - â ±â â žâ ‘â §â » â â ƒâ ³â ž â ¹â â žâ ² ⡹⠑ ⠗⠑⠛⠊⠌⠻ â •â ‹ ⠙⠊⠎ ⠃⠥⠗⠊â â ‡ â ºâ â Ž - â Žâ Šâ ›â â « ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹â â â â ‚ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ â ¥â â ™â »â žâ â …⠻⠂ - â â â ™ ⠹⠑ â ¡â Šâ ‘â ‹ â â ³â —â â »â ² ⡎⠊⠗⠕⠕⠛⠑ â Žâ Šâ ›â â « â Šâ žâ ² â¡â â ™ - ⡎⠊⠗⠕⠕⠛⠑⠰⠎ â â â â ‘ â ºâ â Ž ⠛⠕⠕⠙ â ¥â â •â  â °â¡¡â â â ›â ‘â ‚ â ‹â •â — â â â ¹â ¹â ”â › ⠙⠑ - â ¡â •â Žâ ‘ â žâ • â â ¥â ž ⠙⠊⠎ â ™â â â ™ â žâ •â ² - - ⡕⠇⠙ â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² - - â¡â ”⠙⠖ ⡊ ⠙⠕â â °â ž â â ‘â â  â žâ • â Žâ â ¹ â ¹â â ž ⡊ â …â â ªâ ‚ â •â ‹ â â ¹ - â ªâ  â …â â ªâ ‡â «â ›â ‘â ‚ â ±â â ž ⠹⠻⠑ â Šâ Ž â â œâ žâ Šâ Šâ ¥â ‡â œâ ‡â ¹ ⠙⠑â â ™ â â ƒâ ³â ž - â  â ™â •â •â —â ¤â â â Šâ ‡â ² ⡊ â â Šâ £â ž â ™â â §â ‘ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ â â ¹â Žâ ‘⠇⠋⠂ â žâ • - ⠗⠑⠛⠜⠙ â  â Šâ •â ‹â ‹â ”â ¤â â â Šâ ‡ â â Ž ⠹⠑ ⠙⠑â â ™â ‘â Œ â â Šâ ‘â Šâ ‘ â •â ‹ â Šâ —â •â â â •â â ›â »â ¹ - â ” ⠹⠑ â žâ —â â ™â ‘â ² ⡃⠥⠞ ⠹⠑ â ºâ Šâ Žâ ™â •â  â •â ‹ ⠳⠗ â â â Šâ ‘⠌⠕⠗⠎ - â Šâ Ž â ” ⠹⠑ â Žâ Šâ â Šâ ‡â ‘â † â â â ™ â â ¹ â ¥â â ™â â ‡â ‡â ªâ « â ™â â â ™â Ž - â ©â â ‡â ‡ â â •â ž ⠙⠊⠌⠥⠗⠃ â Šâ žâ ‚ â •â — ⠹⠑ ⡊⠳â â žâ —⠹⠰⠎ ⠙⠕â â ‘ â ‹â •â —â ² ⡹⠳ - ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ â â »â â Šâ ž â â ‘ â žâ • â —â ‘â â ‘â â žâ ‚ â ‘â â â ™â â žâ Šâ Šâ â ‡â ‡â ¹â ‚ â ¹â â ž - â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² - - (The first couple of paragraphs of "A Christmas Carol" by Dickens) - -Compact font selection example text: - - ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 - abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ - –—‘“â€â€žâ€ â€¢â€¦â€°â„¢Å“ŠŸž€ ΑΒΓΔΩαβγδω ÐБВГДабвгд - ∀∂∈â„∧∪≡∞ ↑↗↨↻⇣ â”┼╔╘░►☺♀ ï¬ï¿½â‘€â‚‚ἠḂӥẄÉËâŽ×Աრ- -Greetings in various languages: - - Hello world, ΚαλημέÏα κόσμε, コンニãƒãƒ - -Box drawing alignment tests: â–ˆ - â–‰ - â•”â•â•╦â•â•â•— ┌──┬──┠╭──┬──╮ ╭──┬──╮ â”â”â”┳â”â”┓ ┎┒â”┑ â•· â•» â”┯┓ ┌┰┠▊ ╱╲╱╲╳╳╳ - ║┌─╨─â”â•‘ │╔â•â•§â•╗│ │╒â•╪â•╕│ │╓─â•─╖│ ┃┌─╂─â”┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ â”╋┥ â–‹ ╲╱╲╱╳╳╳ - ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ â•¿ │┃ â”╅╆┓ ╵ ╹ â”—â”·â”› └┸┘ â–Œ ╱╲╱╲╳╳╳ - â• â•¡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┠╎ â”┅┅┓ ┋ ■╲╱╲╱╳╳╳ - ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ â–Ž - ║└─╥─┘║ │╚â•╤â•â•│ │╘â•╪â•╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ â– - ╚â•â•â•©â•â•╠└──┴──┘ ╰──┴──╯ ╰──┴──╯ â”—â”â”â”»â”â”â”› ▗▄▖▛▀▜ └╌╌┘ ╎ â”—â•â•â”› ┋ â–▂▃▄▅▆▇█ - â–▀▘▙▄▟ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-8.txt b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-8.txt deleted file mode 100644 index 4363f27..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-8.txt +++ /dev/null @@ -1,212 +0,0 @@ - -UTF-8 encoded sample plain-text file -‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ - -Markus Kuhn [ˈmaʳkÊŠs kuËn] — 2002-07-25 - - -The ASCII compatible UTF-8 encoding used in this plain-text file -is defined in Unicode, ISO 10646-1, and RFC 2279. - - -Using Unicode/UTF-8, you can write in emails and source code things such as - -Mathematics and sciences: - - ∮ Eâ‹…da = Q, n → ∞, ∑ f(i) = ∠g(i), ⎧⎡⎛┌─────â”⎞⎤⎫ - ⎪⎢⎜│a²+b³ ⎟⎥⎪ - ∀x∈â„: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪ - ⎪⎢⎜⎷ c₈ ⎟⎥⎪ - â„• ⊆ â„•â‚€ ⊂ ℤ ⊂ ℚ ⊂ ℠⊂ â„‚, ⎨⎢⎜ ⎟⎥⎬ - ⎪⎢⎜ ∞ ⎟⎥⎪ - ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪ - ⎪⎢⎜ ⎳aâ±-bâ±âŽŸâŽ¥âŽª - 2Hâ‚‚ + Oâ‚‚ ⇌ 2Hâ‚‚O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣âŽi=1 ⎠⎦⎭ - -Linguistics and dictionaries: - - ði ıntəˈnæʃənÉ™l fəˈnÉ›tık É™soÊŠsiˈeıʃn - Y [ˈÊpsilÉ”n], Yen [jÉ›n], Yoga [ˈjoËgÉ‘] - -APL: - - ((Vâ³V)=â³â´V)/Vâ†,V ⌷â†â³â†’â´âˆ†âˆ‡âŠƒâ€¾âŽâ•⌈ - -Nicer typography in plain text files: - - â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•— - â•‘ â•‘ - â•‘ • ‘single’ and “double†quotes â•‘ - â•‘ â•‘ - â•‘ • Curly apostrophes: “We’ve been here†║ - â•‘ â•‘ - â•‘ • Latin-1 apostrophe and accents: '´` â•‘ - â•‘ â•‘ - â•‘ • ‚deutsche‘ „Anführungszeichen“ â•‘ - â•‘ â•‘ - â•‘ • †, ‡, ‰, •, 3–4, —, −5/+5, â„¢, … â•‘ - â•‘ â•‘ - â•‘ • ASCII safety test: 1lI|, 0OD, 8B â•‘ - â•‘ ╭─────────╮ â•‘ - â•‘ • the euro symbol: │ 14.95 € │ â•‘ - â•‘ ╰─────────╯ â•‘ - ╚â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â• - -Combining characters: - - STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑ - -Greek (in Polytonic): - - The Greek anthem: - - Σὲ γνωÏίζω ἀπὸ τὴν κόψη - τοῦ σπαθιοῦ τὴν Ï„ÏομεÏá½µ, - σὲ γνωÏίζω ἀπὸ τὴν ὄψη - ποὺ μὲ βία μετÏάει τὴ γῆ. - - ᾿Απ᾿ τὰ κόκκαλα βγαλμένη - τῶν ῾Ελλήνων τὰ ἱεÏá½± - καὶ σὰν Ï€Ïῶτα ἀνδÏειωμένη - χαῖÏε, ὦ χαῖÏε, ᾿ΕλευθεÏιά! - - From a speech of Demosthenes in the 4th century BC: - - Οá½Ï‡á½¶ ταá½Ï„á½° παÏίσταταί μοι γιγνώσκειν, ὦ ἄνδÏες ᾿Αθηναῖοι, - ὅταν τ᾿ εἰς τὰ Ï€Ïάγματα ἀποβλέψω καὶ ὅταν Ï€Ïὸς τοὺς - λόγους οὓς ἀκούω· τοὺς μὲν Î³á½°Ï Î»á½¹Î³Î¿Ï…Ï‚ πεÏá½¶ τοῦ - τιμωÏήσασθαι Φίλιππον á½Ïá¿¶ γιγνομένους, τὰ δὲ Ï€Ïάγματ᾿ - εἰς τοῦτο Ï€Ïοήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αá½Ï„οὶ - Ï€ÏότεÏον κακῶς σκέψασθαι δέον. οá½Î´á½³Î½ οὖν ἄλλο μοι δοκοῦσιν - οἱ τὰ τοιαῦτα λέγοντες á¼¢ τὴν ὑπόθεσιν, πεÏá½¶ á¼§Ï‚ βουλεύεσθαι, - οá½Ï‡á½¶ τὴν οὖσαν παÏιστάντες ὑμῖν á¼Î¼Î±Ïτάνειν. á¼Î³á½¼ δέ, ὅτι μέν - ποτ᾿ á¼Î¾á¿†Î½ τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον - τιμωÏήσασθαι, καὶ μάλ᾿ ἀκÏιβῶς οἶδα· á¼Ï€á¾¿ á¼Î¼Î¿á¿¦ γάÏ, οὠπάλαι - γέγονεν ταῦτ᾿ ἀμφότεÏα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν - Ï€Ïολαβεῖν ἡμῖν εἶναι τὴν Ï€Ïώτην, ὅπως τοὺς συμμάχους - σώσομεν. á¼á½°Î½ Î³á½°Ï Ï„Î¿á¿¦Ï„Î¿ βεβαίως ὑπάÏξῃ, τότε καὶ πεÏá½¶ τοῦ - τίνα τιμωÏήσεταί τις καὶ ὃν Ï„Ïόπον á¼Î¾á½³ÏƒÏ„αι σκοπεῖν· Ï€Ïὶν δὲ - τὴν á¼€Ïχὴν á½€Ïθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι πεÏá½¶ τῆς - τελευτῆς á½Î½Ï„ινοῦν ποιεῖσθαι λόγον. - - Δημοσθένους, Γ´ ᾿Ολυνθιακὸς - -Georgian: - - From a Unicode conference invitation: - - გთხáƒáƒ•თ áƒáƒ®áƒšáƒáƒ•ე გáƒáƒ˜áƒáƒ áƒáƒ— რეგისტრáƒáƒªáƒ˜áƒ Unicode-ის მეáƒáƒ—ე სáƒáƒ”რთáƒáƒ¨áƒáƒ áƒ˜áƒ¡áƒ - კáƒáƒœáƒ¤áƒ”რენციáƒáƒ–ე დáƒáƒ¡áƒáƒ¡áƒ¬áƒ áƒ”ბáƒáƒ“, რáƒáƒ›áƒ”ლიც გáƒáƒ˜áƒ›áƒáƒ áƒ—ებრ10-12 მáƒáƒ áƒ¢áƒ¡, - ქ. მáƒáƒ˜áƒœáƒªáƒ¨áƒ˜, გერმáƒáƒœáƒ˜áƒáƒ¨áƒ˜. კáƒáƒœáƒ¤áƒ”რენცირშეჰკრებს ერთáƒáƒ“ მსáƒáƒ¤áƒšáƒ˜áƒáƒ¡ - ექსპერტებს ისეთ დáƒáƒ áƒ’ებში რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ ინტერნეტი დრUnicode-ი, - ინტერნáƒáƒªáƒ˜áƒáƒœáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ დრლáƒáƒ™áƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ, Unicode-ის გáƒáƒ›áƒáƒ§áƒ”ნებრ- áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒš სისტემებსáƒ, დრგáƒáƒ›áƒáƒ§áƒ”ნებით პრáƒáƒ’რáƒáƒ›áƒ”ბში, შრიფტებში, - ტექსტების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒáƒ¡áƒ დრმრáƒáƒ•áƒáƒšáƒ”ნáƒáƒ•áƒáƒœ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რულ სისტემებში. - -Russian: - - From a Unicode conference invitation: - - ЗарегиÑтрируйтеÑÑŒ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° ДеÑÑтую Международную Конференцию по - Unicode, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑоÑтоитÑÑ 10-12 марта 1997 года в Майнце в Германии. - ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ñоберет широкий круг ÑкÑпертов по вопроÑам глобального - Интернета и Unicode, локализации и интернационализации, воплощению и - применению Unicode в различных операционных ÑиÑтемах и программных - приложениÑÑ…, шрифтах, верÑтке и многоÑзычных компьютерных ÑиÑтемах. - -Thai (UCS Level 2): - - Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese - classic 'San Gua'): - - [----------------------------|------------------------] - ๠à¹à¸œà¹ˆà¸™à¸”ินฮั่นเสื่อมโทรมà¹à¸ªà¸™à¸ªà¸±à¸‡à¹€à¸§à¸Š พระปà¸à¹€à¸à¸¨à¸à¸­à¸‡à¸šà¸¹à¹Šà¸à¸¹à¹‰à¸‚ึ้นใหม่ - สิบสองà¸à¸©à¸±à¸•ริย์à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¹à¸¥à¸–ัดไป สององค์ไซร้โง่เขลาเบาปัà¸à¸à¸² - ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนัà¸à¸«à¸™à¸² - โฮจิ๋นเรียà¸à¸—ัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัภ- เหมือนขับไสไล่เสือจาà¸à¹€à¸„หา รับหมาป่าเข้ามาเลยอาสัภ- à¸à¹ˆà¸²à¸¢à¸­à¹‰à¸­à¸‡à¸­à¸¸à¹‰à¸™à¸¢à¸¸à¹à¸¢à¸à¹ƒà¸«à¹‰à¹à¸•à¸à¸à¸±à¸™ ใช้สาวนั้นเป็นชนวนชื่นชวนใจ - พลันลิฉุยà¸à¸¸à¸¢à¸à¸µà¸à¸¥à¸±à¸šà¸à¹ˆà¸­à¹€à¸«à¸•ุ ช่างอาเพศจริงหนาฟ้าร้องไห้ - ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูà¸à¸¹à¹‰à¸šà¸£à¸£à¸¥à¸±à¸‡à¸à¹Œ ฯ - - (The above is a two-column text. If combining characters are handled - correctly, the lines of the second column should be aligned with the - | character above.) - -Ethiopian: - - Proverbs in the Amharic language: - - ሰማይ አይታረስ ንጉሥ አይከሰስᢠ- ብላ ካለአእንደአባቴ በቆመጠáŠá¢ - ጌጥ ያለቤቱ á‰áˆáŒ¥áŠ“ áŠá‹á¢ - ደሀ በሕáˆáˆ™ ቅቤ ባይጠጣ ንጣት በገደለá‹á¢ - የአá ወለáˆá‰³ በቅቤ አይታሽáˆá¢ - አይጥ በበላ ዳዋ ተመታᢠ- ሲተረጉሙ ይደረáŒáˆ™á¢ - ቀስ በቀስᥠዕንá‰áˆ‹áˆ በእáŒáˆ© ይሄዳáˆá¢ - ድር ቢያብር አንበሳ ያስርᢠ- ሰዠእንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርáˆá¢ - እáŒá‹œáˆ­ የከáˆá‰°á‹áŠ• ጉሮሮ ሳይዘጋዠአይድርáˆá¢ - የጎረቤት ሌባᥠቢያዩት ይስቅ ባያዩት ያጠáˆá‰…ᢠ- ሥራ ከመáታት áˆáŒ„ን ላá‹á‰³á‰µá¢ - ዓባይ ማደሪያ የለá‹á¥ áŒáŠ•á‹µ ይዞ ይዞራáˆá¢ - የእስላሠአገሩ መካ የአሞራ አገሩ ዋርካᢠ- ተንጋሎ ቢተበተመáˆáˆ¶ ባá‰á¢ - ወዳጅህ ማር ቢሆን ጨርስህ አትላሰá‹á¢ - እáŒáˆ­áˆ…ን በáራሽህ áˆáŠ­ ዘርጋᢠ- -Runes: - - ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛠᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ áš¹á›áš¦ ᚦᚪ ᚹᛖᛥᚫ - - (Old English, which transcribed into Latin reads 'He cwaeth that he - bude thaem lande northweardum with tha Westsae.' and means 'He said - that he lived in the northern land near the Western Sea.') - -Braille: - - ⡌â â §â ‘ â ¼â â ’ â¡â œâ ‡â ‘⠹⠰⠎ ⡣⠕⠌ - - â¡â œâ ‡â ‘â ¹ â ºâ â Ž ⠙⠑â â ™â ’ â žâ • ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ â Šâ Ž â â • ⠙⠳⠃⠞ - â ±â â žâ ‘â §â » â â ƒâ ³â ž â ¹â â žâ ² ⡹⠑ ⠗⠑⠛⠊⠌⠻ â •â ‹ ⠙⠊⠎ ⠃⠥⠗⠊â â ‡ â ºâ â Ž - â Žâ Šâ ›â â « ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹â â â â ‚ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ â ¥â â ™â »â žâ â …⠻⠂ - â â â ™ ⠹⠑ â ¡â Šâ ‘â ‹ â â ³â —â â »â ² ⡎⠊⠗⠕⠕⠛⠑ â Žâ Šâ ›â â « â Šâ žâ ² â¡â â ™ - ⡎⠊⠗⠕⠕⠛⠑⠰⠎ â â â â ‘ â ºâ â Ž ⠛⠕⠕⠙ â ¥â â •â  â °â¡¡â â â ›â ‘â ‚ â ‹â •â — â â â ¹â ¹â ”â › ⠙⠑ - â ¡â •â Žâ ‘ â žâ • â â ¥â ž ⠙⠊⠎ â ™â â â ™ â žâ •â ² - - ⡕⠇⠙ â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² - - â¡â ”⠙⠖ ⡊ ⠙⠕â â °â ž â â ‘â â  â žâ • â Žâ â ¹ â ¹â â ž ⡊ â …â â ªâ ‚ â •â ‹ â â ¹ - â ªâ  â …â â ªâ ‡â «â ›â ‘â ‚ â ±â â ž ⠹⠻⠑ â Šâ Ž â â œâ žâ Šâ Šâ ¥â ‡â œâ ‡â ¹ ⠙⠑â â ™ â â ƒâ ³â ž - â  â ™â •â •â —â ¤â â â Šâ ‡â ² ⡊ â â Šâ £â ž â ™â â §â ‘ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ â â ¹â Žâ ‘⠇⠋⠂ â žâ • - ⠗⠑⠛⠜⠙ â  â Šâ •â ‹â ‹â ”â ¤â â â Šâ ‡ â â Ž ⠹⠑ ⠙⠑â â ™â ‘â Œ â â Šâ ‘â Šâ ‘ â •â ‹ â Šâ —â •â â â •â â ›â »â ¹ - â ” ⠹⠑ â žâ —â â ™â ‘â ² ⡃⠥⠞ ⠹⠑ â ºâ Šâ Žâ ™â •â  â •â ‹ ⠳⠗ â â â Šâ ‘⠌⠕⠗⠎ - â Šâ Ž â ” ⠹⠑ â Žâ Šâ â Šâ ‡â ‘â † â â â ™ â â ¹ â ¥â â ™â â ‡â ‡â ªâ « â ™â â â ™â Ž - â ©â â ‡â ‡ â â •â ž ⠙⠊⠌⠥⠗⠃ â Šâ žâ ‚ â •â — ⠹⠑ ⡊⠳â â žâ —⠹⠰⠎ ⠙⠕â â ‘ â ‹â •â —â ² ⡹⠳ - ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ â â »â â Šâ ž â â ‘ â žâ • â —â ‘â â ‘â â žâ ‚ â ‘â â â ™â â žâ Šâ Šâ â ‡â ‡â ¹â ‚ â ¹â â ž - â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² - - (The first couple of paragraphs of "A Christmas Carol" by Dickens) - -Compact font selection example text: - - ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 - abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ - –—‘“â€â€žâ€ â€¢â€¦â€°â„¢Å“ŠŸž€ ΑΒΓΔΩαβγδω ÐБВГДабвгд - ∀∂∈â„∧∪≡∞ ↑↗↨↻⇣ â”┼╔╘░►☺♀ ï¬ï¿½â‘€â‚‚ἠḂӥẄÉËâŽ×Աრ- -Greetings in various languages: - - Hello world, ΚαλημέÏα κόσμε, コンニãƒãƒ - -Box drawing alignment tests: â–ˆ - â–‰ - â•”â•â•╦â•â•â•— ┌──┬──┠╭──┬──╮ ╭──┬──╮ â”â”â”┳â”â”┓ ┎┒â”┑ â•· â•» â”┯┓ ┌┰┠▊ ╱╲╱╲╳╳╳ - ║┌─╨─â”â•‘ │╔â•â•§â•╗│ │╒â•╪â•╕│ │╓─â•─╖│ ┃┌─╂─â”┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ â”╋┥ â–‹ ╲╱╲╱╳╳╳ - ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ â•¿ │┃ â”╅╆┓ ╵ ╹ â”—â”·â”› └┸┘ â–Œ ╱╲╱╲╳╳╳ - â• â•¡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┠╎ â”┅┅┓ ┋ ■╲╱╲╱╳╳╳ - ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ â–Ž - ║└─╥─┘║ │╚â•╤â•â•│ │╘â•╪â•╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ â– - ╚â•â•â•©â•â•╠└──┴──┘ ╰──┴──╯ ╰──┴──╯ â”—â”â”â”»â”â”â”› ▗▄▖▛▀▜ └╌╌┘ ╎ â”—â•â•â”› ┋ â–▂▃▄▅▆▇█ - â–▀▘▙▄▟ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-8.txt-utf8 b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-8.txt-utf8 deleted file mode 100644 index 4363f27..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-8.txt-utf8 +++ /dev/null @@ -1,212 +0,0 @@ - -UTF-8 encoded sample plain-text file -‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ - -Markus Kuhn [ˈmaʳkÊŠs kuËn] — 2002-07-25 - - -The ASCII compatible UTF-8 encoding used in this plain-text file -is defined in Unicode, ISO 10646-1, and RFC 2279. - - -Using Unicode/UTF-8, you can write in emails and source code things such as - -Mathematics and sciences: - - ∮ Eâ‹…da = Q, n → ∞, ∑ f(i) = ∠g(i), ⎧⎡⎛┌─────â”⎞⎤⎫ - ⎪⎢⎜│a²+b³ ⎟⎥⎪ - ∀x∈â„: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪ - ⎪⎢⎜⎷ c₈ ⎟⎥⎪ - â„• ⊆ â„•â‚€ ⊂ ℤ ⊂ ℚ ⊂ ℠⊂ â„‚, ⎨⎢⎜ ⎟⎥⎬ - ⎪⎢⎜ ∞ ⎟⎥⎪ - ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪ - ⎪⎢⎜ ⎳aâ±-bâ±âŽŸâŽ¥âŽª - 2Hâ‚‚ + Oâ‚‚ ⇌ 2Hâ‚‚O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣âŽi=1 ⎠⎦⎭ - -Linguistics and dictionaries: - - ði ıntəˈnæʃənÉ™l fəˈnÉ›tık É™soÊŠsiˈeıʃn - Y [ˈÊpsilÉ”n], Yen [jÉ›n], Yoga [ˈjoËgÉ‘] - -APL: - - ((Vâ³V)=â³â´V)/Vâ†,V ⌷â†â³â†’â´âˆ†âˆ‡âŠƒâ€¾âŽâ•⌈ - -Nicer typography in plain text files: - - â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•— - â•‘ â•‘ - â•‘ • ‘single’ and “double†quotes â•‘ - â•‘ â•‘ - â•‘ • Curly apostrophes: “We’ve been here†║ - â•‘ â•‘ - â•‘ • Latin-1 apostrophe and accents: '´` â•‘ - â•‘ â•‘ - â•‘ • ‚deutsche‘ „Anführungszeichen“ â•‘ - â•‘ â•‘ - â•‘ • †, ‡, ‰, •, 3–4, —, −5/+5, â„¢, … â•‘ - â•‘ â•‘ - â•‘ • ASCII safety test: 1lI|, 0OD, 8B â•‘ - â•‘ ╭─────────╮ â•‘ - â•‘ • the euro symbol: │ 14.95 € │ â•‘ - â•‘ ╰─────────╯ â•‘ - ╚â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â• - -Combining characters: - - STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑ - -Greek (in Polytonic): - - The Greek anthem: - - Σὲ γνωÏίζω ἀπὸ τὴν κόψη - τοῦ σπαθιοῦ τὴν Ï„ÏομεÏá½µ, - σὲ γνωÏίζω ἀπὸ τὴν ὄψη - ποὺ μὲ βία μετÏάει τὴ γῆ. - - ᾿Απ᾿ τὰ κόκκαλα βγαλμένη - τῶν ῾Ελλήνων τὰ ἱεÏá½± - καὶ σὰν Ï€Ïῶτα ἀνδÏειωμένη - χαῖÏε, ὦ χαῖÏε, ᾿ΕλευθεÏιά! - - From a speech of Demosthenes in the 4th century BC: - - Οá½Ï‡á½¶ ταá½Ï„á½° παÏίσταταί μοι γιγνώσκειν, ὦ ἄνδÏες ᾿Αθηναῖοι, - ὅταν τ᾿ εἰς τὰ Ï€Ïάγματα ἀποβλέψω καὶ ὅταν Ï€Ïὸς τοὺς - λόγους οὓς ἀκούω· τοὺς μὲν Î³á½°Ï Î»á½¹Î³Î¿Ï…Ï‚ πεÏá½¶ τοῦ - τιμωÏήσασθαι Φίλιππον á½Ïá¿¶ γιγνομένους, τὰ δὲ Ï€Ïάγματ᾿ - εἰς τοῦτο Ï€Ïοήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αá½Ï„οὶ - Ï€ÏότεÏον κακῶς σκέψασθαι δέον. οá½Î´á½³Î½ οὖν ἄλλο μοι δοκοῦσιν - οἱ τὰ τοιαῦτα λέγοντες á¼¢ τὴν ὑπόθεσιν, πεÏá½¶ á¼§Ï‚ βουλεύεσθαι, - οá½Ï‡á½¶ τὴν οὖσαν παÏιστάντες ὑμῖν á¼Î¼Î±Ïτάνειν. á¼Î³á½¼ δέ, ὅτι μέν - ποτ᾿ á¼Î¾á¿†Î½ τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον - τιμωÏήσασθαι, καὶ μάλ᾿ ἀκÏιβῶς οἶδα· á¼Ï€á¾¿ á¼Î¼Î¿á¿¦ γάÏ, οὠπάλαι - γέγονεν ταῦτ᾿ ἀμφότεÏα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν - Ï€Ïολαβεῖν ἡμῖν εἶναι τὴν Ï€Ïώτην, ὅπως τοὺς συμμάχους - σώσομεν. á¼á½°Î½ Î³á½°Ï Ï„Î¿á¿¦Ï„Î¿ βεβαίως ὑπάÏξῃ, τότε καὶ πεÏá½¶ τοῦ - τίνα τιμωÏήσεταί τις καὶ ὃν Ï„Ïόπον á¼Î¾á½³ÏƒÏ„αι σκοπεῖν· Ï€Ïὶν δὲ - τὴν á¼€Ïχὴν á½€Ïθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι πεÏá½¶ τῆς - τελευτῆς á½Î½Ï„ινοῦν ποιεῖσθαι λόγον. - - Δημοσθένους, Γ´ ᾿Ολυνθιακὸς - -Georgian: - - From a Unicode conference invitation: - - გთხáƒáƒ•თ áƒáƒ®áƒšáƒáƒ•ე გáƒáƒ˜áƒáƒ áƒáƒ— რეგისტრáƒáƒªáƒ˜áƒ Unicode-ის მეáƒáƒ—ე სáƒáƒ”რთáƒáƒ¨áƒáƒ áƒ˜áƒ¡áƒ - კáƒáƒœáƒ¤áƒ”რენციáƒáƒ–ე დáƒáƒ¡áƒáƒ¡áƒ¬áƒ áƒ”ბáƒáƒ“, რáƒáƒ›áƒ”ლიც გáƒáƒ˜áƒ›áƒáƒ áƒ—ებრ10-12 მáƒáƒ áƒ¢áƒ¡, - ქ. მáƒáƒ˜áƒœáƒªáƒ¨áƒ˜, გერმáƒáƒœáƒ˜áƒáƒ¨áƒ˜. კáƒáƒœáƒ¤áƒ”რენცირშეჰკრებს ერთáƒáƒ“ მსáƒáƒ¤áƒšáƒ˜áƒáƒ¡ - ექსპერტებს ისეთ დáƒáƒ áƒ’ებში რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ ინტერნეტი დრUnicode-ი, - ინტერნáƒáƒªáƒ˜áƒáƒœáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ დრლáƒáƒ™áƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ, Unicode-ის გáƒáƒ›áƒáƒ§áƒ”ნებრ- áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒš სისტემებსáƒ, დრგáƒáƒ›áƒáƒ§áƒ”ნებით პრáƒáƒ’რáƒáƒ›áƒ”ბში, შრიფტებში, - ტექსტების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒáƒ¡áƒ დრმრáƒáƒ•áƒáƒšáƒ”ნáƒáƒ•áƒáƒœ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რულ სისტემებში. - -Russian: - - From a Unicode conference invitation: - - ЗарегиÑтрируйтеÑÑŒ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° ДеÑÑтую Международную Конференцию по - Unicode, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑоÑтоитÑÑ 10-12 марта 1997 года в Майнце в Германии. - ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ñоберет широкий круг ÑкÑпертов по вопроÑам глобального - Интернета и Unicode, локализации и интернационализации, воплощению и - применению Unicode в различных операционных ÑиÑтемах и программных - приложениÑÑ…, шрифтах, верÑтке и многоÑзычных компьютерных ÑиÑтемах. - -Thai (UCS Level 2): - - Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese - classic 'San Gua'): - - [----------------------------|------------------------] - ๠à¹à¸œà¹ˆà¸™à¸”ินฮั่นเสื่อมโทรมà¹à¸ªà¸™à¸ªà¸±à¸‡à¹€à¸§à¸Š พระปà¸à¹€à¸à¸¨à¸à¸­à¸‡à¸šà¸¹à¹Šà¸à¸¹à¹‰à¸‚ึ้นใหม่ - สิบสองà¸à¸©à¸±à¸•ริย์à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¹à¸¥à¸–ัดไป สององค์ไซร้โง่เขลาเบาปัà¸à¸à¸² - ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนัà¸à¸«à¸™à¸² - โฮจิ๋นเรียà¸à¸—ัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัภ- เหมือนขับไสไล่เสือจาà¸à¹€à¸„หา รับหมาป่าเข้ามาเลยอาสัภ- à¸à¹ˆà¸²à¸¢à¸­à¹‰à¸­à¸‡à¸­à¸¸à¹‰à¸™à¸¢à¸¸à¹à¸¢à¸à¹ƒà¸«à¹‰à¹à¸•à¸à¸à¸±à¸™ ใช้สาวนั้นเป็นชนวนชื่นชวนใจ - พลันลิฉุยà¸à¸¸à¸¢à¸à¸µà¸à¸¥à¸±à¸šà¸à¹ˆà¸­à¹€à¸«à¸•ุ ช่างอาเพศจริงหนาฟ้าร้องไห้ - ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูà¸à¸¹à¹‰à¸šà¸£à¸£à¸¥à¸±à¸‡à¸à¹Œ ฯ - - (The above is a two-column text. If combining characters are handled - correctly, the lines of the second column should be aligned with the - | character above.) - -Ethiopian: - - Proverbs in the Amharic language: - - ሰማይ አይታረስ ንጉሥ አይከሰስᢠ- ብላ ካለአእንደአባቴ በቆመጠáŠá¢ - ጌጥ ያለቤቱ á‰áˆáŒ¥áŠ“ áŠá‹á¢ - ደሀ በሕáˆáˆ™ ቅቤ ባይጠጣ ንጣት በገደለá‹á¢ - የአá ወለáˆá‰³ በቅቤ አይታሽáˆá¢ - አይጥ በበላ ዳዋ ተመታᢠ- ሲተረጉሙ ይደረáŒáˆ™á¢ - ቀስ በቀስᥠዕንá‰áˆ‹áˆ በእáŒáˆ© ይሄዳáˆá¢ - ድር ቢያብር አንበሳ ያስርᢠ- ሰዠእንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርáˆá¢ - እáŒá‹œáˆ­ የከáˆá‰°á‹áŠ• ጉሮሮ ሳይዘጋዠአይድርáˆá¢ - የጎረቤት ሌባᥠቢያዩት ይስቅ ባያዩት ያጠáˆá‰…ᢠ- ሥራ ከመáታት áˆáŒ„ን ላá‹á‰³á‰µá¢ - ዓባይ ማደሪያ የለá‹á¥ áŒáŠ•á‹µ ይዞ ይዞራáˆá¢ - የእስላሠአገሩ መካ የአሞራ አገሩ ዋርካᢠ- ተንጋሎ ቢተበተመáˆáˆ¶ ባá‰á¢ - ወዳጅህ ማር ቢሆን ጨርስህ አትላሰá‹á¢ - እáŒáˆ­áˆ…ን በáራሽህ áˆáŠ­ ዘርጋᢠ- -Runes: - - ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛠᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ áš¹á›áš¦ ᚦᚪ ᚹᛖᛥᚫ - - (Old English, which transcribed into Latin reads 'He cwaeth that he - bude thaem lande northweardum with tha Westsae.' and means 'He said - that he lived in the northern land near the Western Sea.') - -Braille: - - ⡌â â §â ‘ â ¼â â ’ â¡â œâ ‡â ‘⠹⠰⠎ ⡣⠕⠌ - - â¡â œâ ‡â ‘â ¹ â ºâ â Ž ⠙⠑â â ™â ’ â žâ • ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ â Šâ Ž â â • ⠙⠳⠃⠞ - â ±â â žâ ‘â §â » â â ƒâ ³â ž â ¹â â žâ ² ⡹⠑ ⠗⠑⠛⠊⠌⠻ â •â ‹ ⠙⠊⠎ ⠃⠥⠗⠊â â ‡ â ºâ â Ž - â Žâ Šâ ›â â « ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹â â â â ‚ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ â ¥â â ™â »â žâ â …⠻⠂ - â â â ™ ⠹⠑ â ¡â Šâ ‘â ‹ â â ³â —â â »â ² ⡎⠊⠗⠕⠕⠛⠑ â Žâ Šâ ›â â « â Šâ žâ ² â¡â â ™ - ⡎⠊⠗⠕⠕⠛⠑⠰⠎ â â â â ‘ â ºâ â Ž ⠛⠕⠕⠙ â ¥â â •â  â °â¡¡â â â ›â ‘â ‚ â ‹â •â — â â â ¹â ¹â ”â › ⠙⠑ - â ¡â •â Žâ ‘ â žâ • â â ¥â ž ⠙⠊⠎ â ™â â â ™ â žâ •â ² - - ⡕⠇⠙ â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² - - â¡â ”⠙⠖ ⡊ ⠙⠕â â °â ž â â ‘â â  â žâ • â Žâ â ¹ â ¹â â ž ⡊ â …â â ªâ ‚ â •â ‹ â â ¹ - â ªâ  â …â â ªâ ‡â «â ›â ‘â ‚ â ±â â ž ⠹⠻⠑ â Šâ Ž â â œâ žâ Šâ Šâ ¥â ‡â œâ ‡â ¹ ⠙⠑â â ™ â â ƒâ ³â ž - â  â ™â •â •â —â ¤â â â Šâ ‡â ² ⡊ â â Šâ £â ž â ™â â §â ‘ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ â â ¹â Žâ ‘⠇⠋⠂ â žâ • - ⠗⠑⠛⠜⠙ â  â Šâ •â ‹â ‹â ”â ¤â â â Šâ ‡ â â Ž ⠹⠑ ⠙⠑â â ™â ‘â Œ â â Šâ ‘â Šâ ‘ â •â ‹ â Šâ —â •â â â •â â ›â »â ¹ - â ” ⠹⠑ â žâ —â â ™â ‘â ² ⡃⠥⠞ ⠹⠑ â ºâ Šâ Žâ ™â •â  â •â ‹ ⠳⠗ â â â Šâ ‘⠌⠕⠗⠎ - â Šâ Ž â ” ⠹⠑ â Žâ Šâ â Šâ ‡â ‘â † â â â ™ â â ¹ â ¥â â ™â â ‡â ‡â ªâ « â ™â â â ™â Ž - â ©â â ‡â ‡ â â •â ž ⠙⠊⠌⠥⠗⠃ â Šâ žâ ‚ â •â — ⠹⠑ ⡊⠳â â žâ —⠹⠰⠎ ⠙⠕â â ‘ â ‹â •â —â ² ⡹⠳ - ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ â â »â â Šâ ž â â ‘ â žâ • â —â ‘â â ‘â â žâ ‚ â ‘â â â ™â â žâ Šâ Šâ â ‡â ‡â ¹â ‚ â ¹â â ž - â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² - - (The first couple of paragraphs of "A Christmas Carol" by Dickens) - -Compact font selection example text: - - ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 - abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ - –—‘“â€â€žâ€ â€¢â€¦â€°â„¢Å“ŠŸž€ ΑΒΓΔΩαβγδω ÐБВГДабвгд - ∀∂∈â„∧∪≡∞ ↑↗↨↻⇣ â”┼╔╘░►☺♀ ï¬ï¿½â‘€â‚‚ἠḂӥẄÉËâŽ×Աრ- -Greetings in various languages: - - Hello world, ΚαλημέÏα κόσμε, コンニãƒãƒ - -Box drawing alignment tests: â–ˆ - â–‰ - â•”â•â•╦â•â•â•— ┌──┬──┠╭──┬──╮ ╭──┬──╮ â”â”â”┳â”â”┓ ┎┒â”┑ â•· â•» â”┯┓ ┌┰┠▊ ╱╲╱╲╳╳╳ - ║┌─╨─â”â•‘ │╔â•â•§â•╗│ │╒â•╪â•╕│ │╓─â•─╖│ ┃┌─╂─â”┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ â”╋┥ â–‹ ╲╱╲╱╳╳╳ - ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ â•¿ │┃ â”╅╆┓ ╵ ╹ â”—â”·â”› └┸┘ â–Œ ╱╲╱╲╳╳╳ - â• â•¡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┠╎ â”┅┅┓ ┋ ■╲╱╲╱╳╳╳ - ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ â–Ž - ║└─╥─┘║ │╚â•╤â•â•│ │╘â•╪â•╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ â– - ╚â•â•â•©â•â•╠└──┴──┘ ╰──┴──╯ ╰──┴──╯ â”—â”â”â”»â”â”â”› ▗▄▖▛▀▜ └╌╌┘ ╎ â”—â•â•â”› ┋ â–▂▃▄▅▆▇█ - â–▀▘▙▄▟ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/.travis.yml b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/.travis.yml deleted file mode 100644 index 93b85c7..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/.travis.yml +++ /dev/null @@ -1,46 +0,0 @@ -language: lisp - -env: - matrix: - - LISP=allegro - - LISP=ccl - - LISP=ccl32 - - LISP=sbcl - - LISP=sbcl32 - - LISP=abcl - - LISP=cmucl - - LISP=ecl - -matrix: - allow_failures: - - env: LISP=abcl - - env: LISP=cmucl - - env: LISP=ecl - -notifications: - email: - on_success: change - on_failure: always - irc: - channels: - - "chat.freenode.net#iolib" - on_success: change - on_failure: always - use_notice: true - skip_join: true - -install: - - curl -L https://raw.githubusercontent.com/sionescu/cl-travis/master/install.sh | sh - - cl -e "(cl:in-package :cl-user) - (dolist (p '(:fiveam)) - (ql:quickload p :verbose t))" - -script: - - cl -e "(cl:in-package :cl-user) - (prin1 (lisp-implementation-type)) (terpri) (prin1 (lisp-implementation-version)) (terpri) - (ql:quickload :bordeaux-threads/test :verbose t) - (uiop:quit (if (some (lambda (x) (typep x '5am::test-failure)) - (5am:run :bordeaux-threads)) - 1 0))" - -sudo: required diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/CONTRIBUTORS b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/CONTRIBUTORS deleted file mode 100644 index 5b63524..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/CONTRIBUTORS +++ /dev/null @@ -1,19 +0,0 @@ --*- outline -*- - -Based on original Bordeaux-MP spec by Dan Barlow - -Contributors: - -* Attila Lendvai - - better handling of unsupported Lisps -* Vladimir Sekissov - - fixes for CMUCL implementation -* Pierre Thierry - - added license information -* Stelian Ionescu - - finished conversion from generic functions - - enabled running thread-safe code in unthreaded lisps -* Douglas Crosher - - added Scieneer Common Lisp support -* Daniel KochmaÅ„ski - - semaphores implementation diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/LICENSE b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/LICENSE deleted file mode 100644 index 3ce400f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/README b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/README deleted file mode 100644 index 1531578..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/README +++ /dev/null @@ -1,2 +0,0 @@ -You can find API documentation on the project's wiki: - http://trac.common-lisp.net/bordeaux-threads/wiki/ApiDocumentation diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/bordeaux-threads.asd b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/bordeaux-threads.asd deleted file mode 100644 index 8db0d2e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/bordeaux-threads.asd +++ /dev/null @@ -1,76 +0,0 @@ -;;;; -*- Mode: Lisp; indent-tabs-mode: nil -*- - -#| -Copyright 2006,2007 Greg Pfeil - -Distributed under the MIT license (see LICENSE file) -|# - -#.(unless (or #+asdf3.1 (version<= "3.1" (asdf-version))) - (error "You need ASDF >= 3.1 to load this system correctly.")) - -(eval-when (:compile-toplevel :load-toplevel :execute) - #+(or armedbear - (and allegro multiprocessing) - (and clasp threads) - (and clisp mt) - (and openmcl openmcl-native-threads) - (and cmu mp) - corman - (and ecl threads) - genera - mkcl - lispworks - (and digitool ccl-5.1) - (and sbcl sb-thread) - scl) - (pushnew :thread-support *features*)) - -(defsystem :bordeaux-threads - :author "Greg Pfeil " - :licence "MIT" - :description "Bordeaux Threads makes writing portable multi-threaded apps simple." - :version (:read-file-form "version.sexp") - :depends-on (:alexandria - #+(and allegro (version>= 9)) (:require "smputil") - #+(and allegro (not (version>= 9))) (:require "process") - #+corman (:require "threads")) - :components ((:static-file "version.sexp") - (:module "src" - :serial t - :components - ((:file "pkgdcl") - (:file "bordeaux-threads") - (:file #+(and thread-support armedbear) "impl-abcl" - #+(and thread-support allegro) "impl-allegro" - #+(and thread-support clasp) "impl-clasp" - #+(and thread-support clisp) "impl-clisp" - #+(and thread-support openmcl) "impl-clozure" - #+(and thread-support cmu) "impl-cmucl" - #+(and thread-support corman) "impl-corman" - #+(and thread-support ecl) "impl-ecl" - #+(and thread-support genera) "impl-genera" - #+(and thread-support mkcl) "impl-mkcl" - #+(and thread-support lispworks) "impl-lispworks" - #+(and thread-support digitool) "impl-mcl" - #+(and thread-support sbcl) "impl-sbcl" - #+(and thread-support scl) "impl-scl" - #-thread-support "impl-null") - #+(and thread-support lispworks (or lispworks4 lispworks5)) - (:file "impl-lispworks-condition-variables") - #+(and thread-support digitool) - (:file "condition-variables") - (:file "default-implementations"))))) - -(defsystem :bordeaux-threads/test - :author "Greg Pfeil " - :description "Bordeaux Threads test suite." - :licence "MIT" - :version (:read-file-form "version.sexp") - :depends-on (:bordeaux-threads :fiveam) - :components ((:module "test" - :components ((:file "bordeaux-threads-test"))))) - -(defmethod perform ((o test-op) (c (eql (find-system :bordeaux-threads)))) - (load-system :bordeaux-threads/test) - (symbol-call :5am :run! :bordeaux-threads)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/site/index.html b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/site/index.html deleted file mode 100644 index dfc5fc6..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/site/index.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - Bordeaux Threads project - - - - - -

- -

Based on an original proposal by Dan Barlow (Bordeaux-MP) this - library is meant to make writing portable multi-threaded apps - simple.

- -

Read the current API documentation.

- -

Supports all major Common Lisp implementations: SBCL, CCL, - Lispworks, Allegro, ABCL, ECL, Clisp.
The MKCL, Corman, - MCL and Scieneer backends are not tested frequently(if ever) and - might not work.

- -

For discussion, use the mailing - list bordeaux-threads-devel - or the #lisp IRC channel on Freenode.

- -

Source repository

- -

Bordeaux-threads is developed - at Github. The - repository is also mirrored - to Gitlab - and Bitbucket.

- - - - - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/site/style.css b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/site/style.css deleted file mode 100644 index 5617a85..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/site/style.css +++ /dev/null @@ -1,86 +0,0 @@ -/* -Copyright 2006,2007 Greg Pfeil - -Distributed under the MIT license (see LICENSE file) -*/ - -tbody { - border-top: thin dotted black; -} - -.failure { - background-color: #ff0; -} - -.nonexistant { - background-color: #ccc; -} - -.perfect { - background-color: #0f0; -} - -.error { - background-color: #f00; -} - -.header { - font-size: medium; - background-color:#336699; - color:#ffffff; - border-style:solid; - border-width: 5px; - border-color:#002244; - padding: 1mm 1mm 1mm 5mm; -} - -.footer { - font-size: small; - font-style: italic; - text-align: right; - background-color:#336699; - color:#ffffff; - border-style:solid; - border-width: 2px; - border-color:#002244; - padding: 1mm 1mm 1mm 1mm; -} - -.footer a:link { - font-weight:bold; - color:#ffffff; - background-color: #336699; - text-decoration:underline; -} - -.footer a:visited { - font-weight:bold; - color:#ffffff; - background-color: #336699; - text-decoration:underline; -} - -.footer a:hover { - font-weight:bold; - color:#002244; - background-color: #336699; - text-decoration:underline; } - -.check {font-size: x-small; - text-align:right;} - -.check a:link { font-weight:bold; - color:#a0a0ff; - background-color: #FFFFFF; - text-decoration:underline; } - -.check a:visited { font-weight:bold; - color:#a0a0ff; - background-color: #FFFFFF; - text-decoration:underline; } - -.check a:hover { font-weight:bold; - color:#000000; - background-color: #FFFFFF; - text-decoration:underline; } - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/bordeaux-threads.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/bordeaux-threads.lisp deleted file mode 100644 index 5aeb7d8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/bordeaux-threads.lisp +++ /dev/null @@ -1,170 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -#| -Copyright 2006, 2007 Greg Pfeil - -Distributed under the MIT license (see LICENSE file) -|# - -(in-package #:bordeaux-threads) - -(defvar *supports-threads-p* nil - "This should be set to T if the running instance has thread support.") - -(defun mark-supported () - (setf *supports-threads-p* t) - (pushnew :bordeaux-threads *features*)) - -(define-condition bordeaux-mp-condition (error) - ((message :initarg :message :reader message)) - (:report (lambda (condition stream) - (format stream (message condition))))) - -(defgeneric make-threading-support-error () - (:documentation "Creates a BORDEAUX-THREADS condition which specifies - whether there is no BORDEAUX-THREADS support for the implementation, no - threads enabled for the system, or no support for a particular - function.") - (:method () - (make-condition - 'bordeaux-mp-condition - :message (if *supports-threads-p* - "There is no support for this method on this implementation." - "There is no thread support in this instance.")))) - -;;; Timeouts - -#-sbcl -(define-condition timeout (serious-condition) - ((length :initform nil - :initarg :length - :reader timeout-length)) - (:report (lambda (c s) - (if (timeout-length c) - (format s "A timeout set to ~A seconds occurred." - (timeout-length c)) - (format s "A timeout occurred."))))) - -#-sbcl -(defmacro with-timeout ((timeout) &body body) - "Execute `BODY' and signal a condition of type TIMEOUT if the execution of -BODY does not complete within `TIMEOUT' seconds. On implementations which do not -support WITH-TIMEOUT natively and don't support threads either it has no effect." - (declare (ignorable timeout body)) - #+thread-support - (let ((ok-tag (gensym "OK")) - (timeout-tag (gensym "TIMEOUT")) - (caller (gensym "CALLER"))) - (once-only (timeout) - `(multiple-value-prog1 - (catch ',ok-tag - (catch ',timeout-tag - (let ((,caller (current-thread))) - (make-thread #'(lambda () - (sleep ,timeout) - (interrupt-thread ,caller - #'(lambda () - (ignore-errors - (throw ',timeout-tag nil))))) - :name (format nil "WITH-TIMEOUT thread serving: ~S." - (thread-name ,caller))) - (throw ',ok-tag (progn ,@body)))) - (error 'timeout :length ,timeout))))) - #-thread-support - `(error (make-threading-support-error))) - -;;; Semaphores - -;;; We provide this structure definition unconditionally regardless of the fact -;;; it may not be used not to prevent warnings from compiling default functions -;;; for semaphore in default-implementations.lisp. -(defstruct %semaphore - lock - condition-variable - counter) - -#-(or ccl sbcl) -(deftype semaphore () - '%semaphore) - -;;; Thread Creation - -;;; See default-implementations.lisp for MAKE-THREAD. - -;; Forms are evaluated in the new thread or in the calling thread? -(defvar *default-special-bindings* nil - "This variable holds an alist associating special variable symbols - to forms to evaluate. Special variables named in this list will - be locally bound in the new thread before it begins executing user code. - - This variable may be rebound around calls to MAKE-THREAD to - add/alter default bindings. The effect of mutating this list is - undefined, but earlier forms take precedence over later forms for - the same symbol, so defaults may be overridden by consing to the - head of the list.") - -(defmacro defbindings (name docstring &body initforms) - (check-type docstring string) - `(defparameter ,name - (list - ,@(loop for (special form) in initforms - collect `(cons ',special ',form))) - ,docstring)) - -;; Forms are evaluated in the new thread or in the calling thread? -(defbindings *standard-io-bindings* - "Standard bindings of printer/reader control variables as per CL:WITH-STANDARD-IO-SYNTAX." - (*package* (find-package :common-lisp-user)) - (*print-array* t) - (*print-base* 10) - (*print-case* :upcase) - (*print-circle* nil) - (*print-escape* t) - (*print-gensym* t) - (*print-length* nil) - (*print-level* nil) - (*print-lines* nil) - (*print-miser-width* nil) - (*print-pprint-dispatch* (copy-pprint-dispatch nil)) - (*print-pretty* nil) - (*print-radix* nil) - (*print-readably* t) - (*print-right-margin* nil) - (*random-state* (make-random-state t)) - (*read-base* 10) - (*read-default-float-format* 'single-float) - (*read-eval* t) - (*read-suppress* nil) - (*readtable* (copy-readtable nil))) - -(defun binding-default-specials (function special-bindings) - "Return a closure that binds the symbols in SPECIAL-BINDINGS and calls -FUNCTION." - (let ((specials (remove-duplicates special-bindings :from-end t :key #'car))) - (lambda () - (progv (mapcar #'car specials) - (loop for (nil . form) in specials collect (eval form)) - (funcall function))))) - -;;; FIXME: This test won't work if CURRENT-THREAD -;;; conses a new object each time -(defun signal-error-if-current-thread (thread) - (when (eq thread (current-thread)) - (error 'bordeaux-mp-condition - :message "Cannot destroy the current thread"))) - -(defparameter *no-condition-wait-timeout-message* - "CONDITION-WAIT with :TIMEOUT is not available for this Lisp implementation.") - -(defun signal-error-if-condition-wait-timeout (timeout) - (when timeout - (error 'bordeaux-mp-condition - :message *no-condition-wait-timeout-message*))) - -(defmacro define-condition-wait-compiler-macro () - `(define-compiler-macro condition-wait - (&whole whole condition-variable lock &key timeout) - (declare (ignore condition-variable lock)) - (when timeout - (simple-style-warning *no-condition-wait-timeout-message*)) - whole)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/condition-variables.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/condition-variables.lisp deleted file mode 100644 index 33b090b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/condition-variables.lisp +++ /dev/null @@ -1,38 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -#| -Copyright 2006, 2007 Greg Pfeil - -Distributed under the MIT license (see LICENSE file) -|# - -(in-package #:bordeaux-threads) - -;;; This file provides a portable implementation of condition -;;; variables (given a working WITH-LOCK-HELD and THREAD-YIELD), and -;;; should be used if there is no condition variable implementation in -;;; the host Lisp. - -(defstruct condition-var - name - lock - active) - -(defun condition-wait (condition-variable lock &key timeout) - (signal-error-if-condition-wait-timeout timeout) - (check-type condition-variable condition-var) - (setf (condition-var-active condition-variable) nil) - (release-lock lock) - (do () - ((when (condition-var-active condition-variable) - (acquire-lock lock) - t)) - (thread-yield)) - t) - -(define-condition-wait-compiler-macro) - -(defun condition-notify (condition-variable) - (check-type condition-variable condition-var) - (with-lock-held ((condition-var-lock condition-variable)) - (setf (condition-var-active condition-variable) t))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/default-implementations.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/default-implementations.lisp deleted file mode 100644 index c148ac3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/default-implementations.lisp +++ /dev/null @@ -1,361 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -(in-package #:bordeaux-threads) - -;;; Helper macros - -(defmacro defdfun (name args doc &body body) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (unless (fboundp ',name) - (defun ,name ,args ,@body)) - (setf (documentation ',name 'function) - (or (documentation ',name 'function) ,doc)))) - -(defmacro defdmacro (name args doc &body body) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (unless (fboundp ',name) - (defmacro ,name ,args ,@body)) - (setf (documentation ',name 'function) - (or (documentation ',name 'function) ,doc)))) - -;;; Thread Creation - -(defdfun start-multiprocessing () - "If the host implementation uses user-level threads, start the -scheduler and multiprocessing, otherwise do nothing. -It is safe to call repeatedly." - nil) - -(defdfun make-thread (function &key name - (initial-bindings *default-special-bindings*)) - "Creates and returns a thread named NAME, which will call the - function FUNCTION with no arguments: when FUNCTION returns, the - thread terminates. NAME defaults to \"Anonymous thread\" if unsupplied. - - On systems that do not support multi-threading, MAKE-THREAD will - signal an error. - - The interaction between threads and dynamic variables is in some - cases complex, and depends on whether the variable has only a global - binding (as established by e.g. DEFVAR/DEFPARAMETER/top-level SETQ) - or has been bound locally (e.g. with LET or LET*) in the calling - thread. - - - Global bindings are shared between threads: the initial value of a - global variable in the new thread will be the same as in the - parent, and an assignment to such a variable in any thread will be - visible to all threads in which the global binding is visible. - - - Local bindings, such as the ones introduced by INITIAL-BINDINGS, - are local to the thread they are introduced in, except that - - - Local bindings in the the caller of MAKE-THREAD may or may not be - shared with the new thread that it creates: this is - implementation-defined. Portable code should not depend on - particular behaviour in this case, nor should it assign to such - variables without first rebinding them in the new thread." - (%make-thread (binding-default-specials function initial-bindings) - (or name "Anonymous thread"))) - -(defdfun %make-thread (function name) - "The actual implementation-dependent function that creates threads." - (declare (ignore function name)) - (error (make-threading-support-error))) - -(defdfun current-thread () - "Returns the thread object for the calling - thread. This is the same kind of object as would be returned by - MAKE-THREAD." - nil) - -(defdfun threadp (object) - "Returns true if object is a thread, otherwise NIL." - (declare (ignore object)) - nil) - -(defdfun thread-name (thread) - "Returns the name of the thread, as supplied to MAKE-THREAD." - (declare (ignore thread)) - "Main thread") - -;;; Resource contention: locks and recursive locks - -(defdfun lock-p (object) - "Returns T if OBJECT is a lock; returns NIL otherwise." - (declare (ignore object)) - nil) - -(defdfun recursive-lock-p (object) - "Returns T if OBJECT is a recursive lock; returns NIL otherwise." - (declare (ignore object)) - nil) - -(defdfun make-lock (&optional name) - "Creates a lock (a mutex) whose name is NAME. If the system does not - support multiple threads this will still return some object, but it - may not be used for very much." - ;; In CLIM-SYS this is a freshly consed list (NIL). I don't know if - ;; there's some good reason it should be said structure or that it - ;; be freshly consed - EQ comparison of locks? - (declare (ignore name)) - (list nil)) - -(defdfun acquire-lock (lock &optional wait-p) - "Acquire the lock LOCK for the calling thread. - WAIT-P governs what happens if the lock is not available: if WAIT-P - is true, the calling thread will wait until the lock is available - and then acquire it; if WAIT-P is NIL, ACQUIRE-LOCK will return - immediately. ACQUIRE-LOCK returns true if the lock was acquired and - NIL otherwise. - - This specification does not define what happens if a thread - attempts to acquire a lock that it already holds. For applications - that require locks to be safe when acquired recursively, see instead - MAKE-RECURSIVE-LOCK and friends." - (declare (ignore lock wait-p)) - t) - -(defdfun release-lock (lock) - "Release LOCK. It is an error to call this unless - the lock has previously been acquired (and not released) by the same - thread. If other threads are waiting for the lock, the - ACQUIRE-LOCK call in one of them will now be able to continue. - - This function has no interesting return value." - (declare (ignore lock)) - (values)) - -(defdmacro with-lock-held ((place) &body body) - "Evaluates BODY with the lock named by PLACE, the value of which - is a lock created by MAKE-LOCK. Before the forms in BODY are - evaluated, the lock is acquired as if by using ACQUIRE-LOCK. After the - forms in BODY have been evaluated, or if a non-local control transfer - is caused (e.g. by THROW or SIGNAL), the lock is released as if by - RELEASE-LOCK. - - Note that if the debugger is entered, it is unspecified whether the - lock is released at debugger entry or at debugger exit when execution - is restarted." - `(when (acquire-lock ,place t) - (unwind-protect - (locally ,@body) - (release-lock ,place)))) - -(defdfun make-recursive-lock (&optional name) - "Create and return a recursive lock whose name is NAME. A recursive - lock differs from an ordinary lock in that a thread that already - holds the recursive lock can acquire it again without blocking. The - thread must then release the lock twice before it becomes available - for another thread." - (declare (ignore name)) - (list nil)) - -(defdfun acquire-recursive-lock (lock) - "As for ACQUIRE-LOCK, but for recursive locks." - (declare (ignore lock)) - t) - -(defdfun release-recursive-lock (lock) - "Release the recursive LOCK. The lock will only - become free after as many Release operations as there have been - Acquire operations. See RELEASE-LOCK for other information." - (declare (ignore lock)) - (values)) - -(defdmacro with-recursive-lock-held ((place &key timeout) &body body) - "Evaluates BODY with the recursive lock named by PLACE, which is a -reference to a recursive lock created by MAKE-RECURSIVE-LOCK. See -WITH-LOCK-HELD etc etc" - (declare (ignore timeout)) - `(when (acquire-recursive-lock ,place) - (unwind-protect - (locally ,@body) - (release-recursive-lock ,place)))) - -;;; Resource contention: condition variables - -;;; A condition variable provides a mechanism for threads to put -;;; themselves to sleep while waiting for the state of something to -;;; change, then to be subsequently woken by another thread which has -;;; changed the state. -;;; -;;; A condition variable must be used in conjunction with a lock to -;;; protect access to the state of the object of interest. The -;;; procedure is as follows: -;;; -;;; Suppose two threads A and B, and some kind of notional event -;;; channel C. A is consuming events in C, and B is producing them. -;;; CV is a condition-variable -;;; -;;; 1) A acquires the lock that safeguards access to C -;;; 2) A threads and removes all events that are available in C -;;; 3) When C is empty, A calls CONDITION-WAIT, which atomically -;;; releases the lock and puts A to sleep on CV -;;; 4) Wait to be notified; CONDITION-WAIT will acquire the lock again -;;; before returning -;;; 5) Loop back to step 2, for as long as threading should continue -;;; -;;; When B generates an event E, it -;;; 1) acquires the lock guarding C -;;; 2) adds E to the channel -;;; 3) calls CONDITION-NOTIFY on CV to wake any sleeping thread -;;; 4) releases the lock -;;; -;;; To avoid the "lost wakeup" problem, the implementation must -;;; guarantee that CONDITION-WAIT in thread A atomically releases the -;;; lock and sleeps. If this is not guaranteed there is the -;;; possibility that thread B can add an event and call -;;; CONDITION-NOTIFY between the lock release and the sleep - in this -;;; case the notify call would not see A, which would be left sleeping -;;; despite there being an event available. - -(defdfun thread-yield () - "Allows other threads to run. It may be necessary or desirable to - call this periodically in some implementations; others may schedule - threads automatically. On systems that do not support - multi-threading, this does nothing." - (values)) - -(defdfun make-condition-variable (&key name) - "Returns a new condition-variable object for use - with CONDITION-WAIT and CONDITION-NOTIFY." - (declare (ignore name)) - nil) - -(defdfun condition-wait (condition-variable lock &key timeout) - "Atomically release LOCK and enqueue the calling - thread waiting for CONDITION-VARIABLE. The thread will resume when - another thread has notified it using CONDITION-NOTIFY; it may also - resume if interrupted by some external event or in other - implementation-dependent circumstances: the caller must always test - on waking that there is threading to be done, instead of assuming - that it can go ahead. - - It is an error to call function this unless from the thread that - holds LOCK. - - If TIMEOUT is nil or not provided, the system always reacquires LOCK - before returning to the caller. In this case T is returned. - - If TIMEOUT is non-nil, the call will return after at most TIMEOUT - seconds (approximately), whether or not a notification has occurred. - Either NIL or T will be returned. A return of NIL indicates that the - lock is no longer held and that the timeout has expired. A return of - T indicates that the lock is held, in which case the timeout may or - may not have expired. - - **NOTE**: The behavior of CONDITION-WAIT with TIMEOUT diverges from - the POSIX function pthread_cond_timedwait. The former may return - without the lock being held while the latter always returns with the - lock held. - - In an implementation that does not support multiple threads, this - function signals an error." - (declare (ignore condition-variable lock timeout)) - (error (make-threading-support-error))) - -(defdfun condition-notify (condition-variable) - "Notify at least one of the threads waiting for - CONDITION-VARIABLE. It is implementation-dependent whether one or - more than one (and possibly all) threads are woken, but if the - implementation is capable of waking only a single thread (not all - are) this is probably preferable for efficiency reasons. The order - of wakeup is unspecified and does not necessarily relate to the - order that the threads went to sleep in. - - CONDITION-NOTIFY has no useful return value. In an implementation - that does not support multiple threads, it has no effect." - (declare (ignore condition-variable)) - (values)) - -;;; Resource contention: semaphores - -(defdfun make-semaphore (&key name (count 0)) - "Create a semaphore with the supplied NAME and initial counter value COUNT." - (make-%semaphore :lock (make-lock name) - :condition-variable (make-condition-variable :name name) - :counter count)) - -(defdfun signal-semaphore (semaphore &key (count 1)) - "Increment SEMAPHORE by COUNT. If there are threads waiting on this -semaphore, then COUNT of them are woken up." - (with-lock-held ((%semaphore-lock semaphore)) - (incf (%semaphore-counter semaphore) count) - (dotimes (v count) - (condition-notify (%semaphore-condition-variable semaphore)))) - (values)) - -(defdfun wait-on-semaphore (semaphore &key timeout) - "Decrement the count of SEMAPHORE by 1 if the count would not be negative. - -Else blocks until the semaphore can be decremented. Returns generalized boolean -T on success. - -If TIMEOUT is given, it is the maximum number of seconds to wait. If the count -cannot be decremented in that time, returns NIL without decrementing the count." - (with-lock-held ((%semaphore-lock semaphore)) - (if (>= (%semaphore-counter semaphore) 1) - (decf (%semaphore-counter semaphore)) - (let ((deadline (when timeout - (+ (get-internal-real-time) - (* timeout internal-time-units-per-second))))) - ;; we need this loop because of a spurious wakeup possibility - (loop until (>= (%semaphore-counter semaphore) 1) - do (cond - ((null (condition-wait (%semaphore-condition-variable semaphore) - (%semaphore-lock semaphore) - :timeout timeout)) - (return-from wait-on-semaphore)) - ;; unfortunately cv-wait may return T on timeout too - ((and deadline (>= (get-internal-real-time) deadline)) - (return-from wait-on-semaphore)) - (timeout - (setf timeout (/ (- deadline (get-internal-real-time)) - internal-time-units-per-second))))) - (decf (%semaphore-counter semaphore)))))) - -(defdfun semaphore-p (object) - "Returns T if OBJECT is a semaphore; returns NIL otherwise." - (typep object 'semaphore)) - -;;; Introspection/debugging - -;;; The following functions may be provided for debugging purposes, -;;; but are not advised to be called from normal user code. - -(defdfun all-threads () - "Returns a sequence of all of the threads. This may not - be freshly-allocated, so the caller should not modify it." - (error (make-threading-support-error))) - -(defdfun interrupt-thread (thread function) - "Interrupt THREAD and cause it to evaluate FUNCTION - before continuing with the interrupted path of execution. This may - not be a good idea if THREAD is holding locks or doing anything - important. On systems that do not support multiple threads, this - function signals an error." - (declare (ignore thread function)) - (error (make-threading-support-error))) - -(defdfun destroy-thread (thread) - "Terminates the thread THREAD, which is an object - as returned by MAKE-THREAD. This should be used with caution: it is - implementation-defined whether the thread runs cleanup forms or - releases its locks first. - - Destroying the calling thread is an error." - (declare (ignore thread)) - (error (make-threading-support-error))) - -(defdfun thread-alive-p (thread) - "Returns true if THREAD is alive, that is, if - DESTROY-THREAD has not been called on it." - (declare (ignore thread)) - (error (make-threading-support-error))) - -(defdfun join-thread (thread) - "Wait until THREAD terminates. If THREAD has already terminated, - return immediately. The return values of the thread function are - returned." - (declare (ignore thread)) - (error (make-threading-support-error))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-abcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-abcl.lisp deleted file mode 100644 index c9ccb36..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-abcl.lisp +++ /dev/null @@ -1,150 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -#| -Copyright 2006, 2007 Greg Pfeil - -Reimplemented with java.util.concurrent.locks.ReentrantLock by Mark Evenson 2011. - -Distributed under the MIT license (see LICENSE file) -|# - -(in-package #:bordeaux-threads) - -;;; the implementation of the Armed Bear thread interface can be found in -;;; src/org/armedbear/lisp/LispThread.java - -(deftype thread () - 'threads:thread) - -;;; Thread Creation - -(defun %make-thread (function name) - (threads:make-thread function :name name)) - -(defun current-thread () - (threads:current-thread)) - -(defun thread-name (thread) - (threads:thread-name thread)) - -(defun threadp (object) - (typep object 'thread)) - -;;; Resource contention: locks and recursive locks - -(defstruct mutex name lock) -(defstruct (mutex-recursive (:include mutex))) - -;; Making methods constants in this manner avoids the runtime expense of -;; introspection involved in JCALL with string arguments. -(defconstant +lock+ - (jmethod "java.util.concurrent.locks.ReentrantLock" "lock")) -(defconstant +try-lock+ - (jmethod "java.util.concurrent.locks.ReentrantLock" "tryLock")) -(defconstant +is-held-by-current-thread+ - (jmethod "java.util.concurrent.locks.ReentrantLock" "isHeldByCurrentThread")) -(defconstant +unlock+ - (jmethod "java.util.concurrent.locks.ReentrantLock" "unlock")) -(defconstant +get-hold-count+ - (jmethod "java.util.concurrent.locks.ReentrantLock" "getHoldCount")) - -(deftype lock () 'mutex) - -(deftype recursive-lock () 'mutex-recursive) - -(defun lock-p (object) - (typep object 'mutex)) - -(defun recursive-lock-p (object) - (typep object 'mutex-recursive)) - -(defun make-lock (&optional name) - (make-mutex - :name (or name "Anonymous lock") - :lock (jnew "java.util.concurrent.locks.ReentrantLock"))) - -(defun acquire-lock (lock &optional (wait-p t)) - (check-type lock mutex) - (when (jcall +is-held-by-current-thread+ (mutex-lock lock)) - (error "Non-recursive lock being reacquired by owner.")) - (cond - (wait-p - (jcall +lock+ (mutex-lock lock)) - t) - (t (jcall +try-lock+ (mutex-lock lock))))) - -(defun release-lock (lock) - (check-type lock mutex) - (unless (jcall +is-held-by-current-thread+ (mutex-lock lock)) - (error "Attempt to release lock not held by calling thread.")) - (jcall +unlock+ (mutex-lock lock)) - (values)) - -(defun make-recursive-lock (&optional name) - (make-mutex-recursive - :name (or name "Anonymous lock") - :lock (jnew "java.util.concurrent.locks.ReentrantLock"))) - -(defun acquire-recursive-lock (lock &optional (wait-p t)) - (check-type lock mutex-recursive) - (cond - (wait-p - (jcall +lock+ (mutex-recursive-lock lock)) - t) - (t (jcall +try-lock+ (mutex-recursive-lock lock))))) - -(defun release-recursive-lock (lock) - (check-type lock mutex-recursive) - (unless (jcall +is-held-by-current-thread+ (mutex-lock lock)) - (error "Attempt to release lock not held by calling thread.")) - (jcall +unlock+ (mutex-lock lock)) - (values)) - -;;; Resource contention: condition variables - -(defun thread-yield () - (java:jstatic "yield" "java.lang.Thread")) - -(defstruct condition-variable - (name "Anonymous condition variable")) - -(defun condition-wait (condition lock &key timeout) - (threads:synchronized-on condition - (release-lock lock) - (if timeout - ;; Since giving a zero time value to threads:object-wait means - ;; an indefinite wait, use some arbitrary small number. - (threads:object-wait condition - (if (zerop timeout) - least-positive-single-float - timeout)) - (threads:object-wait condition))) - (acquire-lock lock) - t) - -(defun condition-notify (condition) - (threads:synchronized-on condition - (threads:object-notify condition))) - -;;; Introspection/debugging - -(defun all-threads () - (let ((threads ())) - (threads:mapcar-threads (lambda (thread) - (push thread threads))) - (reverse threads))) - -(defun interrupt-thread (thread function &rest args) - (apply #'threads:interrupt-thread thread function args)) - -(defun destroy-thread (thread) - (signal-error-if-current-thread thread) - (threads:destroy-thread thread)) - -(defun thread-alive-p (thread) - (threads:thread-alive-p thread)) - -(defun join-thread (thread) - (threads:thread-join thread)) - -(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-allegro.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-allegro.lisp deleted file mode 100644 index e648bde..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-allegro.lisp +++ /dev/null @@ -1,143 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -#| -Copyright 2006, 2007 Greg Pfeil - -Distributed under the MIT license (see LICENSE file) -|# - -(in-package #:bordeaux-threads) - -;;; documentation on the Allegro Multiprocessing interface can be found at -;;; http://www.franz.com/support/documentation/8.1/doc/multiprocessing.htm - -;;; Resource contention: locks and recursive locks - -(deftype lock () 'mp:process-lock) - -(deftype recursive-lock () 'mp:process-lock) - -(defun lock-p (object) - (typep object 'mp:process-lock)) - -(defun recursive-lock-p (object) - (typep object 'mp:process-lock)) - -(defun make-lock (&optional name) - (mp:make-process-lock :name (or name "Anonymous lock"))) - -(defun make-recursive-lock (&optional name) - (mp:make-process-lock :name (or name "Anonymous recursive lock"))) - -(defun acquire-lock (lock &optional (wait-p t)) - (mp:process-lock lock mp:*current-process* "Lock" (if wait-p nil 0))) - -(defun release-lock (lock) - (mp:process-unlock lock)) - -(defmacro with-lock-held ((place) &body body) - `(mp:with-process-lock (,place :norecursive t) - ,@body)) - -(defmacro with-recursive-lock-held ((place &key timeout) &body body) - `(mp:with-process-lock (,place :timeout ,timeout) - ,@body)) - -;;; Resource contention: condition variables - -(defun make-condition-variable (&key name) - (declare (ignorable name)) - #-(version>= 9) - (mp:make-gate nil) - #+(version>= 9) - (mp:make-condition-variable :name name)) - -(defun condition-wait (condition-variable lock &key timeout) - #-(version>= 9) - (progn - (release-lock lock) - (if timeout - (mp:process-wait-with-timeout "wait for message" timeout - #'mp:gate-open-p condition-variable) - (mp:process-wait "wait for message" #'mp:gate-open-p condition-variable)) - (acquire-lock lock) - (mp:close-gate condition-variable)) - #+(version>= 9) - (mp:condition-variable-wait condition-variable lock :timeout timeout) - t) - -(defun condition-notify (condition-variable) - #-(version>= 9) - (mp:open-gate condition-variable) - #+(version>= 9) - (mp:condition-variable-signal condition-variable)) - -(defun thread-yield () - (mp:process-allow-schedule)) - -(deftype thread () - 'mp:process) - -;;; Thread Creation - -(defun start-multiprocessing () - (mp:start-scheduler)) - -(defun %make-thread (function name) - #+smp - (mp:process-run-function name function) - #-smp - (mp:process-run-function - name - (lambda () - (let ((return-values - (multiple-value-list (funcall function)))) - (setf (getf (mp:process-property-list mp:*current-process*) - 'return-values) - return-values) - (values-list return-values))))) - -(defun current-thread () - mp:*current-process*) - -(defun threadp (object) - (typep object 'mp:process)) - -(defun thread-name (thread) - (mp:process-name thread)) - -;;; Timeouts - -(defmacro with-timeout ((timeout) &body body) - (once-only (timeout) - `(mp:with-timeout (,timeout (error 'timeout :length ,timeout)) - ,@body))) - -;;; Introspection/debugging - -(defun all-threads () - mp:*all-processes*) - -(defun interrupt-thread (thread function &rest args) - (apply #'mp:process-interrupt thread function args)) - -(defun destroy-thread (thread) - (signal-error-if-current-thread thread) - (mp:process-kill thread)) - -(defun thread-alive-p (thread) - (mp:process-alive-p thread)) - -(defun join-thread (thread) - #+smp - (values-list (mp:process-join thread)) - #-smp - (progn - (mp:process-wait (format nil "Waiting for thread ~A to complete" thread) - (complement #'mp:process-alive-p) - thread) - (let ((return-values - (getf (mp:process-property-list thread) 'return-values))) - (values-list return-values)))) - -(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clasp.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clasp.lisp deleted file mode 100644 index e268ac1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clasp.lisp +++ /dev/null @@ -1,111 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -#| -Copyright 2006, 2007 Greg Pfeil - -Distributed under the MIT license (see LICENSE file) -|# - -(in-package #:bordeaux-threads) - -;;; documentation on the ECL Multiprocessing interface can be found at -;;; http://ecls.sourceforge.net/cgi-bin/view/Main/MultiProcessing - -(deftype thread () - 'mp:process) - -;;; Thread Creation - -(defun %make-thread (function name) - (mp:process-run-function name function bordeaux-threads:*default-special-bindings*)) - -(defun current-thread () - mp:*current-process*) - -(defun threadp (object) - (typep object 'mp:process)) - -(defun thread-name (thread) - (mp:process-name thread)) - -;;; Resource contention: locks and recursive locks - -(deftype lock () 'mp:mutex) - -(deftype recursive-lock () - '(and mp:mutex (satisfies mp:recursive-lock-p))) - -(defun lock-p (object) - (typep object 'mp:mutex)) - -(defun recursive-lock-p (object) - (and (typep object 'mp:lock) - (mp:recursive-lock-p object))) - -(defun make-lock (&optional name) - (mp:make-lock :name (or name :anonymous))) - -(defun acquire-lock (lock &optional (wait-p t)) - (mp:get-lock lock wait-p)) - -(defun release-lock (lock) - (mp:giveup-lock lock)) - - -(defmacro with-lock-held ((place) &body body) - `(mp:with-lock (,place) ,@body)) - -(defun make-recursive-lock (&optional name) - (mp:make-recursive-mutex (or name :anonymous-recursive-lock))) - -(defun acquire-recursive-lock (lock &optional (wait-p t)) - (mp:get-lock lock wait-p)) - -(defun release-recursive-lock (lock) - (mp:giveup-lock lock)) - -(defmacro with-recursive-lock-held ((place) &body body) - `(mp:with-lock (,place) ,@body)) - -;;; Resource contention: condition variables - -(defun make-condition-variable (&key name) - (declare (ignore name)) - (mp:make-condition-variable)) - -(defun condition-wait (condition-variable lock &key timeout) - (if timeout - (mp:condition-variable-timedwait condition-variable lock timeout) - (mp:condition-variable-wait condition-variable lock)) - t) - -(defun condition-notify (condition-variable) - (mp:condition-variable-signal condition-variable)) - -(defun thread-yield () - (mp:process-yield)) - -;;; Introspection/debugging - -(defun all-threads () - (mp:all-processes)) - -(defun interrupt-thread (thread function &rest args) - (flet ((apply-function () - (if args - (lambda () (apply function args)) - function))) - (declare (dynamic-extent #'apply-function)) - (mp:interrupt-process thread (apply-function)))) - -(defun destroy-thread (thread) - (signal-error-if-current-thread thread) - (mp:process-kill thread)) - -(defun thread-alive-p (thread) - (mp:process-active-p thread)) - -(defun join-thread (thread) - (mp:process-join thread)) - -(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clisp.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clisp.lisp deleted file mode 100644 index 7ae8cab..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clisp.lisp +++ /dev/null @@ -1,105 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -#| -Copyright 2006, 2007 Greg Pfeil - -Distributed under the MIT license (see LICENSE file) -|# - -(in-package #:bordeaux-threads) - -(deftype thread () - 'mt:thread) - -;;; Thread Creation -(defun %make-thread (function name) - (mt:make-thread function - :name name - :initial-bindings mt:*default-special-bindings*)) - -(defun current-thread () - (mt:current-thread)) - -(defun threadp (object) - (mt:threadp object)) - -(defun thread-name (thread) - (mt:thread-name thread)) - -;;; Resource contention: locks and recursive locks - -(deftype lock () 'mt:mutex) - -(deftype recursive-lock () - '(and mt:mutex (satisfies mt:mutex-recursive-p))) - -(defun lock-p (object) - (typep object 'mt:mutex)) - -(defun recursive-lock-p (object) - (and (typep object 'mt:mutex) - (mt:mutex-recursive-p object))) - -(defun make-lock (&optional name) - (mt:make-mutex :name (or name "Anonymous lock"))) - -(defun acquire-lock (lock &optional (wait-p t)) - (mt:mutex-lock lock :timeout (if wait-p nil 0))) - -(defun release-lock (lock) - (mt:mutex-unlock lock)) - -(defmacro with-lock-held ((place) &body body) - `(mt:with-mutex-lock (,place) ,@body)) - -(defun make-recursive-lock (&optional name) - (mt:make-mutex :name (or name "Anonymous recursive lock") - :recursive-p t)) - -(defmacro with-recursive-lock-held ((place) &body body) - `(mt:with-mutex-lock (,place) ,@body)) - -;;; Resource contention: condition variables - -(defun make-condition-variable (&key name) - (mt:make-exemption :name (or name "Anonymous condition variable"))) - -(defun condition-wait (condition-variable lock &key timeout) - (mt:exemption-wait condition-variable lock :timeout timeout) - t) - -(defun condition-notify (condition-variable) - (mt:exemption-signal condition-variable)) - -(defun thread-yield () - (mt:thread-yield)) - -;;; Timeouts - -(defmacro with-timeout ((timeout) &body body) - (once-only (timeout) - `(mt:with-timeout (,timeout (error 'timeout :length ,timeout)) - ,@body))) - -;;; Introspection/debugging - -;;; VTZ: mt:list-threads returns all threads that are not garbage collected. -(defun all-threads () - (delete-if-not #'mt:thread-active-p (mt:list-threads))) - -(defun interrupt-thread (thread function &rest args) - (mt:thread-interrupt thread :function function :arguments args)) - -(defun destroy-thread (thread) - ;;; VTZ: actually we can kill ourselelf. - ;;; suicide is part of our contemporary life :) - (signal-error-if-current-thread thread) - (mt:thread-interrupt thread :function t)) - -(defun thread-alive-p (thread) - (mt:thread-active-p thread)) - -(defun join-thread (thread) - (mt:thread-join thread)) - -(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clozure.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clozure.lisp deleted file mode 100644 index f9dc61b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clozure.lisp +++ /dev/null @@ -1,130 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -#| -Copyright 2006, 2007 Greg Pfeil - -Distributed under the MIT license (see LICENSE file) -|# - -(in-package #:bordeaux-threads) - -;;; documentation on the OpenMCL Threads interface can be found at -;;; http://openmcl.clozure.com/Doc/Programming-with-Threads.html - -(deftype thread () - 'ccl:process) - -;;; Thread Creation - -(defun %make-thread (function name) - (ccl:process-run-function name function)) - -(defun current-thread () - ccl:*current-process*) - -(defun threadp (object) - (typep object 'ccl:process)) - -(defun thread-name (thread) - (ccl:process-name thread)) - -;;; Resource contention: locks and recursive locks - -(deftype lock () 'ccl:lock) - -(deftype recursive-lock () 'ccl:lock) - -(defun lock-p (object) - (typep object 'ccl:lock)) - -(defun recursive-lock-p (object) - (typep object 'ccl:lock)) - -(defun make-lock (&optional name) - (ccl:make-lock (or name "Anonymous lock"))) - -(defun acquire-lock (lock &optional (wait-p t)) - (if wait-p - (ccl:grab-lock lock) - (ccl:try-lock lock))) - -(defun release-lock (lock) - (ccl:release-lock lock)) - -(defmacro with-lock-held ((place) &body body) - `(ccl:with-lock-grabbed (,place) - ,@body)) - -(defun make-recursive-lock (&optional name) - (ccl:make-lock (or name "Anonymous recursive lock"))) - -(defun acquire-recursive-lock (lock) - (ccl:grab-lock lock)) - -(defun release-recursive-lock (lock) - (ccl:release-lock lock)) - -(defmacro with-recursive-lock-held ((place) &body body) - `(ccl:with-lock-grabbed (,place) - ,@body)) - -;;; Resource contention: condition variables - -(defun make-condition-variable (&key name) - (declare (ignore name)) - (ccl:make-semaphore)) - -(defun condition-wait (condition-variable lock &key timeout) - (release-lock lock) - (unwind-protect - (if timeout - (ccl:timed-wait-on-semaphore condition-variable timeout) - (ccl:wait-on-semaphore condition-variable)) - (acquire-lock lock t)) - t) - -(defun condition-notify (condition-variable) - (ccl:signal-semaphore condition-variable)) - -(defun thread-yield () - (ccl:process-allow-schedule)) - -;;; Semaphores - -(deftype semaphore () - 'ccl:semaphore) - -(defun make-semaphore (&key name (count 0)) - (declare (ignore name)) - (let ((semaphore (ccl:make-semaphore))) - (dotimes (c count) (ccl:signal-semaphore semaphore)) - semaphore)) - -(defun signal-semaphore (semaphore &key (count 1)) - (dotimes (c count) (ccl:signal-semaphore semaphore))) - -(defun wait-on-semaphore (semaphore &key timeout) - (if timeout - (ccl:timed-wait-on-semaphore semaphore timeout) - (ccl:wait-on-semaphore semaphore))) - -;;; Introspection/debugging - -(defun all-threads () - (ccl:all-processes)) - -(defun interrupt-thread (thread function &rest args) - (declare (dynamic-extent args)) - (apply #'ccl:process-interrupt thread function args)) - -(defun destroy-thread (thread) - (signal-error-if-current-thread thread) - (ccl:process-kill thread)) - -(defun thread-alive-p (thread) - (not (ccl:process-exhausted-p thread))) - -(defun join-thread (thread) - (ccl:join-process thread)) - -(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-cmucl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-cmucl.lisp deleted file mode 100644 index d3a6de2..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-cmucl.lisp +++ /dev/null @@ -1,161 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -#| -Copyright 2006, 2007 Greg Pfeil - -Distributed under the MIT license (see LICENSE file) -|# - -(in-package #:bordeaux-threads) - -(deftype thread () - 'mp::process) - -;;; Thread Creation - -(defun start-multiprocessing () - (mp::startup-idle-and-top-level-loops)) - -(defun %make-thread (function name) - #+#.(cl:if (cl:find-symbol (cl:string '#:process-join) :mp) '(and) '(or)) - (mp:make-process function :name name) - #-#.(cl:if (cl:find-symbol (cl:string '#:process-join) :mp) '(and) '(or)) - (mp:make-process (lambda () - (let ((return-values - (multiple-value-list (funcall function)))) - (setf (getf (mp:process-property-list mp:*current-process*) - 'return-values) - return-values) - (values-list return-values))) - :name name)) - -(defun current-thread () - mp:*current-process*) - -(defmethod threadp (object) - (mp:processp object)) - -(defun thread-name (thread) - (mp:process-name thread)) - -;;; Resource contention: locks and recursive locks - -(deftype lock () 'mp::error-check-lock) - -(deftype recursive-lock () 'mp::recursive-lock) - -(defun lock-p (object) - (typep object 'mp::error-check-lock)) - -(defun recursive-lock-p (object) - (typep object 'mp::recursive-lock)) - -(defun make-lock (&optional name) - (mp:make-lock (or name "Anonymous lock") - :kind :error-check)) - -(defun acquire-lock (lock &optional (wait-p t)) - (if wait-p - (mp::lock-wait lock "Lock wait") - (mp::lock-wait-with-timeout lock "Lock wait" 0))) - -(defun release-lock (lock) - (setf (mp::lock-process lock) nil)) - -(defmacro with-lock-held ((place) &body body) - `(mp:with-lock-held (,place "Lock wait") ,@body)) - -(defun make-recursive-lock (&optional name) - (mp:make-lock (or name "Anonymous recursive lock") - :kind :recursive)) - -(defun acquire-recursive-lock (lock &optional (wait-p t)) - (acquire-lock lock)) - -(defun release-recursive-lock (lock) - (release-lock lock)) - -(defmacro with-recursive-lock-held ((place &key timeout) &body body) - `(mp:with-lock-held (,place "Lock Wait" :timeout ,timeout) ,@body)) - -;;; Note that the locks _are_ recursive, but not "balanced", and only -;;; checked if they are being held by the same process by with-lock-held. -;;; The default with-lock-held in bordeaux-mp.lisp sort of works, in that -;;; it will wait for recursive locks by the same process as well. - -;;; Resource contention: condition variables - -;;; There's some stuff in x86-vm.lisp that might be worth investigating -;;; whether to build on. There's also process-wait and friends. - -(defstruct condition-var - "CMUCL doesn't have conditions, so we need to create our own type." - name - lock - active) - -(defun make-condition-variable (&key name) - (make-condition-var :lock (make-lock) - :name (or name "Anonymous condition variable"))) - -(defun condition-wait (condition-variable lock &key timeout) - (signal-error-if-condition-wait-timeout timeout) - (check-type condition-variable condition-var) - (with-lock-held ((condition-var-lock condition-variable)) - (setf (condition-var-active condition-variable) nil)) - (release-lock lock) - (mp:process-wait "Condition Wait" - #'(lambda () (condition-var-active condition-variable))) - (acquire-lock lock) - t) - -(define-condition-wait-compiler-macro) - -(defun condition-notify (condition-variable) - (check-type condition-variable condition-var) - (with-lock-held ((condition-var-lock condition-variable)) - (setf (condition-var-active condition-variable) t)) - (thread-yield)) - -(defun thread-yield () - (mp:process-yield)) - -;;; Timeouts - -(defmacro with-timeout ((timeout) &body body) - (once-only (timeout) - `(mp:with-timeout (,timeout (error 'timeout :length ,timeout)) - ,@body))) - -;;; Introspection/debugging - -(defun all-threads () - (mp:all-processes)) - -(defun interrupt-thread (thread function &rest args) - (flet ((apply-function () - (if args - (lambda () (apply function args)) - function))) - (declare (dynamic-extent #'apply-function)) - (mp:process-interrupt thread (apply-function)))) - -(defun destroy-thread (thread) - (signal-error-if-current-thread thread) - (mp:destroy-process thread)) - -(defun thread-alive-p (thread) - (mp:process-active-p thread)) - -(defun join-thread (thread) - #+#.(cl:if (cl:find-symbol (cl:string '#:process-join) :mp) '(and) '(or)) - (mp:process-join thread) - #-#.(cl:if (cl:find-symbol (cl:string '#:process-join) :mp) '(and) '(or)) - (progn - (mp:process-wait (format nil "Waiting for thread ~A to complete" thread) - (lambda () (not (mp:process-alive-p thread)))) - (let ((return-values - (getf (mp:process-property-list thread) 'return-values))) - (values-list return-values)))) - -(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-corman.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-corman.lisp deleted file mode 100644 index dad4524..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-corman.lisp +++ /dev/null @@ -1,26 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -#| -Copyright 2006, 2007 Greg Pfeil - -Distributed under the MIT license (see LICENSE file) -|# - -(in-package #:bordeaux-threads) - -;;; Thread Creation - -(defun %make-thread (function name) - (declare (ignore name)) - (threads:create-thread function)) - -(defun current-thread () - threads:*current-thread*) - -;;; Introspection/debugging - -(defun destroy-thread (thread) - (signal-error-if-current-thread thread) - (threads:terminate-thread thread)) - -(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-ecl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-ecl.lisp deleted file mode 100644 index 50c4f27..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-ecl.lisp +++ /dev/null @@ -1,111 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -#| -Copyright 2006, 2007 Greg Pfeil - -Distributed under the MIT license (see LICENSE file) -|# - -(in-package #:bordeaux-threads) - -;;; documentation on the ECL Multiprocessing interface can be found at -;;; http://ecls.sourceforge.net/cgi-bin/view/Main/MultiProcessing - -(deftype thread () - 'mp:process) - -;;; Thread Creation - -(defun %make-thread (function name) - (mp:process-run-function name function)) - -(defun current-thread () - mp::*current-process*) - -(defun threadp (object) - (typep object 'mp:process)) - -(defun thread-name (thread) - (mp:process-name thread)) - -;;; Resource contention: locks and recursive locks - -(deftype lock () 'mp:lock) - -(deftype recursive-lock () - '(and mp:lock (satisfies mp:recursive-lock-p))) - -(defun lock-p (object) - (typep object 'mp:lock)) - -(defun recursive-lock-p (object) - (and (typep object 'mp:lock) - (mp:recursive-lock-p object))) - -(defun make-lock (&optional name) - (mp:make-lock :name (or name "Anonymous lock"))) - -(defun acquire-lock (lock &optional (wait-p t)) - (mp:get-lock lock wait-p)) - -(defun release-lock (lock) - (mp:giveup-lock lock)) - -(defmacro with-lock-held ((place) &body body) - `(mp:with-lock (,place) ,@body)) - -(defun make-recursive-lock (&optional name) - (mp:make-lock :name (or name "Anonymous recursive lock") :recursive t)) - -(defun acquire-recursive-lock (lock &optional (wait-p t)) - (mp:get-lock lock wait-p)) - -(defun release-recursive-lock (lock) - (mp:giveup-lock lock)) - -(defmacro with-recursive-lock-held ((place) &body body) - `(mp:with-lock (,place) ,@body)) - -;;; Resource contention: condition variables - -(defun make-condition-variable (&key name) - (declare (ignore name)) - (mp:make-condition-variable)) - -(defun condition-wait (condition-variable lock &key timeout) - (if timeout - (handler-case (with-timeout (timeout) - (mp:condition-variable-wait condition-variable lock)) - (timeout () nil)) - (mp:condition-variable-wait condition-variable lock))) - -(defun condition-notify (condition-variable) - (mp:condition-variable-signal condition-variable)) - -(defun thread-yield () - (mp:process-yield)) - -;;; Introspection/debugging - -(defun all-threads () - (mp:all-processes)) - -(defun interrupt-thread (thread function &rest args) - (flet ((apply-function () - (if args - (lambda () (apply function args)) - function))) - (declare (dynamic-extent #'apply-function)) - (mp:interrupt-process thread (apply-function)))) - -(defun destroy-thread (thread) - (signal-error-if-current-thread thread) - (mp:process-kill thread)) - -(defun thread-alive-p (thread) - (mp:process-active-p thread)) - -(defun join-thread (thread) - (mp:process-join thread)) - -(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-genera.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-genera.lisp deleted file mode 100644 index c8c3e6c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-genera.lisp +++ /dev/null @@ -1,136 +0,0 @@ -;;;; -*- Mode: LISP; Syntax: Ansi-Common-Lisp; Package: BORDEAUX-THREADS; Base: 10; -*- - -#| -Distributed under the MIT license (see LICENSE file) -|# - -(in-package #:bordeaux-threads) - -(deftype thread () - 'process:process) - -;;; Thread Creation - -(defun %make-thread (function name) - (process:process-run-function name function)) - -(defun current-thread () - scl:*current-process*) - -(defun threadp (object) - (process:process-p object)) - -(defun thread-name (thread) - (process:process-name thread)) - -;;; Resource contention: locks and recursive locks - -(defstruct (lock (:constructor make-lock-internal)) - lock - lock-argument) - -(defun make-lock (&optional name) - (let ((lock (process:make-lock (or name "Anonymous lock")))) - (make-lock-internal :lock lock - :lock-argument nil))) - -(defun acquire-lock (lock &optional (wait-p t)) - (check-type lock lock) - (setf (lock-lock-argument lock) (process:make-lock-argument (lock-lock lock))) - (if wait-p - (process:lock (lock-lock lock) (lock-lock-argument lock)) - (process:with-no-other-processes - (when (process:lock-lockable-p (lock-lock lock)) - (process:lock (lock-lock lock) (lock-lock-argument lock)))))) - -(defun release-lock (lock) - (check-type lock lock) - (process:unlock (lock-lock lock) (scl:shiftf (lock-lock-argument lock) nil))) - -(defmacro with-lock-held ((place) &body body) - `(process:with-lock ((lock-lock ,place)) - ,@body)) - -(defstruct (recursive-lock (:constructor make-recursive-lock-internal)) - lock - lock-arguments) - -(defun make-recursive-lock (&optional name) - (make-recursive-lock-internal :lock (process:make-lock (or name "Anonymous recursive lock") - :recursive t) - :lock-arguments nil)) - -(defun acquire-recursive-lock (lock) - (check-type lock recursive-lock) - (process:lock (recursive-lock-lock lock) - (car (push (process:make-lock-argument (recursive-lock-lock lock)) - (recursive-lock-lock-arguments lock))))) - -(defun release-recursive-lock (lock) - (check-type lock recursive-lock) - (process:unlock (recursive-lock-lock lock) (pop (recursive-lock-lock-arguments lock)))) - -(defmacro with-recursive-lock-held ((place) &body body) - `(process:with-lock ((recursive-lock-lock ,place)) - ,@body)) - -;;; Resource contention: condition variables - -(eval-when (:compile-toplevel :load-toplevel :execute) -(defstruct (condition-variable (:constructor %make-condition-variable)) - name - (waiters nil)) -) - -(defun make-condition-variable (&key name) - (%make-condition-variable :name name)) - -(defun condition-wait (condition-variable lock) - (check-type condition-variable condition-variable) - (check-type lock lock) - (process:with-no-other-processes - (let ((waiter (cons scl:*current-process* nil))) - (process:atomic-updatef (condition-variable-waiters condition-variable) - #'(lambda (waiters) - (append waiters (scl:ncons waiter)))) - (process:without-lock ((lock-lock lock)) - (process:process-block (format nil "Waiting~@[ on ~A~]" - (condition-variable-name condition-variable)) - #'(lambda (waiter) - (not (null (cdr waiter)))) - waiter))))) - -(defun condition-notify (condition-variable) - (check-type condition-variable condition-variable) - (let ((waiter (process:atomic-pop (condition-variable-waiters condition-variable)))) - (when waiter - (setf (cdr waiter) t) - (process:wakeup (car waiter)))) - (values)) - -(defun thread-yield () - (scl:process-allow-schedule)) - -;;; Introspection/debugging - -(defun all-threads () - process:*all-processes*) - -(defun interrupt-thread (thread function &rest args) - (declare (dynamic-extent args)) - (apply #'process:process-interrupt thread function args)) - -(defun destroy-thread (thread) - (signal-error-if-current-thread thread) - (process:process-kill thread :without-aborts :force)) - -(defun thread-alive-p (thread) - (process:process-active-p thread)) - -(defun join-thread (thread) - (process:process-wait (format nil "Join ~S" thread) - #'(lambda (thread) - (not (process:process-active-p thread))) - thread)) - -(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-lispworks-condition-variables.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-lispworks-condition-variables.lisp deleted file mode 100644 index d33123d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-lispworks-condition-variables.lisp +++ /dev/null @@ -1,144 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -(in-package #:bordeaux-threads) - -;; Lispworks condition support is simulated, albeit via a lightweight wrapper over -;; its own polling-based wait primitive. Waiters register with the condition variable, -;; and use MP:process-wait which queries for permission to proceed at its own (usspecified) interval. -;; http://www.lispworks.com/documentation/lw51/LWRM/html/lwref-445.htm -;; A wakeup callback (on notify) is provided to lighten this query to not have to do a hash lookup -;; on every poll (or have to serialize on the condition variable) and a mechanism is put -;; in place to unregister any waiter that exits wait for other reasons, -;; and to resend any (single) notification that may have been consumed before this (corner -;; case). Much of the complexity present is to support single notification (as recommended in -;; the spec); but a distinct condition-notify-all is provided for reference. -;; Single-notification follows a first-in first-out ordering -;; -;; Performance: With 1000 threads waiting on one condition-variable, the steady-state hit (at least -;; as tested on a 3GHz Win32 box) is noise - hovering at 0% on Task manager. -;; While not true zero like a true native solution, the use of the Lispworks native checks appear -;; fast enough to be an equivalent substitute (thread count will cause issue before the -;; waiting overhead becomes significant) -(defstruct (condition-variable (:constructor make-lw-condition (name))) - name - (lock (mp:make-lock :name "For condition-variable") :type mp:lock :read-only t) - (wait-tlist (cons nil nil) :type cons :read-only t) - (wait-hash (make-hash-table :test 'eq) :type hash-table :read-only t) - ;; unconsumed-notifications is to track :remove-from-consideration - ;; for entries that may have exited prematurely - notification is sent through - ;; to someone else, and offender is removed from hash and list - (unconsumed-notifications (make-hash-table :test 'eq) :type hash-table :read-only t)) - -(defun make-condition-variable (&key name) - (make-lw-condition name)) - -(defmacro with-cv-access (condition-variable &body body) - (let ((cv-sym (gensym)) - (slots '(lock wait-tlist wait-hash unconsumed-notifications))) - `(let ((,cv-sym ,condition-variable)) - (with-slots ,slots - ,cv-sym - (macrolet ((locked (&body body) `(mp:with-lock (lock) ,@body))) - (labels ((,(gensym) () ,@slots))) ; Trigger expansion of the symbol-macrolets to ignore - ,@body))))) - -(defmacro defcvfun (function-name (condition-variable &rest args) &body body) - `(defun ,function-name (,condition-variable ,@args) - (with-cv-access ,condition-variable - ,@body))) -#+lispworks (editor:setup-indent "defcvfun" 2 2 7) ; indent defcvfun - -; utility function thath assumes process is locked on condition-variable's lock. -(defcvfun do-notify-single (condition-variable) ; assumes already locked - (let ((id (caar wait-tlist))) - (when id - (pop (car wait-tlist)) - (unless (car wait-tlist) ; check for empty - (setf (cdr wait-tlist) nil)) - (funcall (gethash id wait-hash)) ; call waiter-wakeup - (remhash id wait-hash) ; absence of entry = permission to proceed - (setf (gethash id unconsumed-notifications) t)))) - -;; Added for completeness/to show how it's done in this paradigm; but -;; The symbol for this call is not exposed in the api -(defcvfun condition-notify-all (condition-variable) - (locked - (loop for waiter-wakeup being the hash-values in wait-hash do (funcall waiter-wakeup)) - (clrhash wait-hash) - (clrhash unconsumed-notifications) ; don't care as everyone just got notified - (setf (car wait-tlist) nil) - (setf (cdr wait-tlist) nil))) - -;; Currently implemented so as to notify only one waiting thread -(defcvfun condition-notify (condition-variable) - (locked (do-notify-single condition-variable))) - -(defun delete-from-tlist (tlist element) - (let ((deleter - (lambda () - (setf (car tlist) (cdar tlist)) - (unless (car tlist) - (setf (cdr tlist) nil))))) - (loop for cons in (car tlist) do - (if (eq element (car cons)) - (progn - (funcall deleter) - (return nil)) - (let ((cons cons)) - (setq deleter - (lambda () - (setf (cdr cons) (cddr cons)) - (unless (cdr cons) - (setf (cdr tlist) cons))))))))) - -(defun add-to-tlist-tail (tlist element) - (let ((new-link (cons element nil))) - (cond - ((car tlist) - (setf (cddr tlist) new-link) - (setf (cdr tlist) new-link)) - (t - (setf (car tlist) new-link) - (setf (cdr tlist) new-link))))) - -(defcvfun condition-wait (condition-variable lock- &key timeout) - (signal-error-if-condition-wait-timeout timeout) - (mp:process-unlock lock-) - (unwind-protect ; for the re-taking of the lock. Guarding all of the code - (let ((wakeup-allowed-to-proceed nil) - (wakeup-lock (mp:make-lock :name "wakeup lock for condition-wait"))) - ;; wakeup-allowed-to-proceed is an optimisation to avoid having to serialize all waiters and - ;; search the hashtable. That it is locked is for safety/completeness, although - ;; as wakeup-allowed-to-proceed only transitions nil -> t, and that missing it once or twice is - ;; moot in this situation, it would be redundant even if ever a Lispworks implementation ever became - ;; non-atomic in its assigments - (let ((id (cons nil nil)) - (clean-exit nil)) - (locked - (add-to-tlist-tail wait-tlist id) - (setf (gethash id wait-hash) (lambda () (mp:with-lock (wakeup-lock) (setq wakeup-allowed-to-proceed t))))) - (unwind-protect - (progn - (mp:process-wait - "Waiting for notification" - (lambda () - (when (mp:with-lock (wakeup-lock) wakeup-allowed-to-proceed) - (locked (not (gethash id wait-hash)))))) - (locked (remhash id unconsumed-notifications)) - (setq clean-exit t)) ; Notification was consumed - ;; Have to call remove-from-consideration just in case process was interrupted - ;; rather than having condition met - (unless clean-exit ; clean-exit is just an optimization - (locked - (when (gethash id wait-hash) ; not notified - must have been interrupted - ;; Have to unsubscribe - (remhash id wait-hash) - (delete-from-tlist wait-tlist id)) - ;; note - it's possible to be removed from wait-hash/wait-tlist (in notify-single); but still have an unconsumed notification! - (when (gethash id unconsumed-notifications) ; Must have exited for reasons unrelated to notification - (remhash id unconsumed-notifications) ; Have to pass on the notification to an eligible waiter - (do-notify-single condition-variable))))))) - (mp:process-lock lock-)) - t) - -(define-condition-wait-compiler-macro) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-lispworks.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-lispworks.lisp deleted file mode 100644 index b12fc94..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-lispworks.lisp +++ /dev/null @@ -1,143 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -#| -Copyright 2006, 2007 Greg Pfeil - -Distributed under the MIT license (see LICENSE file) -|# - -(in-package #:bordeaux-threads) - -;;; documentation on the LispWorks Multiprocessing interface can be found at -;;; http://www.lispworks.com/documentation/lw445/LWUG/html/lwuser-156.htm - -(deftype thread () - 'mp:process) - -;;; Thread Creation - -(defun start-multiprocessing () - (mp:initialize-multiprocessing)) - -(defun %make-thread (function name) - (mp:process-run-function - name nil - (lambda () - (let ((return-values - (multiple-value-list (funcall function)))) - (setf (mp:process-property 'return-values) - return-values) - (values-list return-values))))) - -(defun current-thread () - #-#.(cl:if (cl:find-symbol (cl:string '#:get-current-process) :mp) '(and) '(or)) - mp:*current-process* - ;; introduced in LispWorks 5.1 - #+#.(cl:if (cl:find-symbol (cl:string '#:get-current-process) :mp) '(and) '(or)) - (mp:get-current-process)) - -(defun threadp (object) - (mp:process-p object)) - -(defun thread-name (thread) - (mp:process-name thread)) - -;;; Resource contention: locks and recursive locks - - -(deftype lock () 'mp:lock) - -#-(or lispworks4 lispworks5) -(deftype recursive-lock () - '(and mp:lock (satisfies mp:lock-recursive-p))) - -(defun lock-p (object) - (typep object 'mp:lock)) - -(defun recursive-lock-p (object) - #+(or lispworks4 lispworks5) - nil - #-(or lispworks4 lispworks5) ; version 6+ - (and (typep object 'mp:lock) - (mp:lock-recursive-p object))) - -(defun make-lock (&optional name) - (mp:make-lock :name (or name "Anonymous lock") - #-(or lispworks4 lispworks5) :recursivep - #-(or lispworks4 lispworks5) nil)) - -(defun acquire-lock (lock &optional (wait-p t)) - (mp:process-lock lock nil - (cond ((null wait-p) 0) - ((numberp wait-p) wait-p) - (t nil)))) - -(defun release-lock (lock) - (mp:process-unlock lock)) - -(defmacro with-lock-held ((place) &body body) - `(mp:with-lock (,place) ,@body)) - -(defun make-recursive-lock (&optional name) - (mp:make-lock :name (or name "Anonymous recursive lock") - #-(or lispworks4 lispworks5) :recursivep - #-(or lispworks4 lispworks5) t)) - -(defun acquire-recursive-lock (lock &optional (wait-p t)) - (acquire-lock lock wait-p)) - -(defun release-recursive-lock (lock) - (release-lock lock)) - -(defmacro with-recursive-lock-held ((place) &body body) - `(mp:with-lock (,place) ,@body)) - -;;; Resource contention: condition variables - -#+(or lispworks6 lispworks7) -(defun make-condition-variable (&key name) - (mp:make-condition-variable :name (or name "Anonymous condition variable"))) - -#+(or lispworks6 lispworks7) -(defun condition-wait (condition-variable lock &key timeout) - (mp:condition-variable-wait condition-variable lock :timeout timeout) - t) - -#+(or lispworks6 lispworks7) -(defun condition-notify (condition-variable) - (mp:condition-variable-signal condition-variable)) - -(defun thread-yield () - (mp:process-allow-scheduling)) - -;;; Introspection/debugging - -(defun all-threads () - (mp:list-all-processes)) - -(defun interrupt-thread (thread function &rest args) - (apply #'mp:process-interrupt thread function args)) - -(defun destroy-thread (thread) - (signal-error-if-current-thread thread) - (mp:process-kill thread)) - -(defun thread-alive-p (thread) - (mp:process-alive-p thread)) - -(declaim (inline %join-thread)) -(defun %join-thread (thread) - #-#.(cl:if (cl:find-symbol (cl:string '#:process-join) :mp) '(and) '(or)) - (mp:process-wait (format nil "Waiting for thread ~A to complete" thread) - (complement #'mp:process-alive-p) - thread) - #+#.(cl:if (cl:find-symbol (cl:string '#:process-join) :mp) '(and) '(or)) - (mp:process-join thread)) - -(defun join-thread (thread) - (%join-thread thread) - (let ((return-values - (mp:process-property 'return-values thread))) - (values-list return-values))) - -(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-mcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-mcl.lisp deleted file mode 100644 index d8e83cf..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-mcl.lisp +++ /dev/null @@ -1,68 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -#| -Copyright 2006, 2007 Greg Pfeil - -Distributed under the MIT license (see LICENSE file) -|# - -(in-package #:bordeaux-threads) - -(deftype thread () - 'ccl::process) - -;;; Thread Creation - -(defun %make-thread (function name) - (ccl:process-run-function name function)) - -(defun current-thread () - ccl:*current-process*) - -(defun threadp (object) - (ccl::processp object)) - -(defun thread-name (thread) - (ccl:process-name thread)) - -;;; Resource contention: locks and recursive locks - -(deftype lock () 'ccl:lock) - -(defun lock-p (object) - (typep object 'ccl:lock)) - -(defun make-lock (&optional name) - (ccl:make-lock (or name "Anonymous lock"))) - -(defun acquire-lock (lock &optional (wait-p t)) - (if wait-p - (ccl:process-lock lock ccl:*current-process*) - ;; this is broken, but it's better than a no-op - (ccl:without-interrupts - (when (null (ccl::lock.value lock)) - (ccl:process-lock lock ccl:*current-process*))))) - -(defun release-lock (lock) - (ccl:process-unlock lock)) - -(defmacro with-lock-held ((place) &body body) - `(ccl:with-lock-grabbed (,place) ,@body)) - -(defun thread-yield () - (ccl:process-allow-schedule)) - -;;; Introspection/debugging - -(defun all-threads () - ccl:*all-processes*) - -(defun interrupt-thread (thread function &rest args) - (declare (dynamic-extent args)) - (apply #'ccl:process-interrupt thread function args)) - -(defun destroy-thread (thread) - (signal-error-if-current-thread thread) - (ccl:process-kill thread)) - -(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-mkcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-mkcl.lisp deleted file mode 100644 index 2ac678c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-mkcl.lisp +++ /dev/null @@ -1,109 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -#| -Copyright 2006, 2007 Greg Pfeil -Copyright 2010 Jean-Claude Beaudoin. - -Distributed under the MIT license (see LICENSE file) -|# - -(in-package #:bordeaux-threads) - -(deftype thread () - 'mt:thread) - -;;; Thread Creation - -(defun %make-thread (function name) - (mt:thread-run-function name function)) - -(defun current-thread () - mt::*thread*) - -(defun threadp (object) - (typep object 'mt:thread)) - -(defun thread-name (thread) - (mt:thread-name thread)) - -;;; Resource contention: locks and recursive locks - -(deftype lock () 'mt:lock) - -(deftype recursive-lock () - '(and mt:lock (satisfies mt:recursive-lock-p))) - -(defun lock-p (object) - (typep object 'mt:lock)) - -(defun recursive-lock-p (object) - (and (typep object 'mt:lock) - (mt:recursive-lock-p object))) - -(defun make-lock (&optional name) - (mt:make-lock :name (or name "Anonymous lock"))) - -(defun acquire-lock (lock &optional (wait-p t)) - (mt:get-lock lock wait-p)) - -(defun release-lock (lock) - (mt:giveup-lock lock)) - -(defmacro with-lock-held ((place) &body body) - `(mt:with-lock (,place) ,@body)) - -(defun make-recursive-lock (&optional name) - (mt:make-lock :name (or name "Anonymous recursive lock") :recursive t)) - -(defun acquire-recursive-lock (lock &optional (wait-p t)) - (mt:get-lock lock wait-p)) - -(defun release-recursive-lock (lock) - (mt:giveup-lock lock)) - -(defmacro with-recursive-lock-held ((place) &body body) - `(mt:with-lock (,place) ,@body)) - -;;; Resource contention: condition variables - -(defun make-condition-variable (&key name) - (declare (ignore name)) - (mt:make-condition-variable)) - -(defun condition-wait (condition-variable lock &key timeout) - (signal-error-if-condition-wait-timeout timeout) - (mt:condition-wait condition-variable lock) - t) - -(define-condition-wait-compiler-macro) - -(defun condition-notify (condition-variable) - (mt:condition-signal condition-variable)) - -(defun thread-yield () - (mt:thread-yield)) - -;;; Introspection/debugging - -(defun all-threads () - (mt:all-threads)) - -(defun interrupt-thread (thread function &rest args) - (flet ((apply-function () - (if args - (lambda () (apply function args)) - function))) - (declare (dynamic-extent #'apply-function)) - (mt:interrupt-thread thread (apply-function)))) - -(defun destroy-thread (thread) - (signal-error-if-current-thread thread) - (mt:thread-kill thread)) - -(defun thread-alive-p (thread) - (mt:thread-active-p thread)) - -(defun join-thread (thread) - (mt:thread-join thread)) - -(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-null.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-null.lisp deleted file mode 100644 index 2cf4bbb..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-null.lisp +++ /dev/null @@ -1,3 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -(in-package #:bordeaux-threads) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-sbcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-sbcl.lisp deleted file mode 100644 index a1b8850..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-sbcl.lisp +++ /dev/null @@ -1,130 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -#| -Copyright 2006, 2007 Greg Pfeil - -Distributed under the MIT license (see LICENSE file) -|# - -(in-package #:bordeaux-threads) - -;;; documentation on the SBCL Threads interface can be found at -;;; http://www.sbcl.org/manual/Threading.html - -(deftype thread () - 'sb-thread:thread) - -;;; Thread Creation - -(defun %make-thread (function name) - (sb-thread:make-thread function :name name)) - -(defun current-thread () - sb-thread:*current-thread*) - -(defun threadp (object) - (typep object 'sb-thread:thread)) - -(defun thread-name (thread) - (sb-thread:thread-name thread)) - -;;; Resource contention: locks and recursive locks - -(deftype lock () 'sb-thread:mutex) - -(deftype recursive-lock () 'sb-thread:mutex) - -(defun lock-p (object) - (typep object 'sb-thread:mutex)) - -(defun recursive-lock-p (object) - (typep object 'sb-thread:mutex)) - -(defun make-lock (&optional name) - (sb-thread:make-mutex :name (or name "Anonymous lock"))) - -(defun acquire-lock (lock &optional (wait-p t)) - #+#.(cl:if (cl:find-symbol (cl:string '#:grab-mutex) :sb-thread) '(and) '(or)) - (sb-thread:grab-mutex lock :waitp wait-p) - #-#.(cl:if (cl:find-symbol (cl:string '#:grab-mutex) :sb-thread) '(and) '(or)) - (sb-thread:get-mutex lock nil wait-p)) - -(defun release-lock (lock) - (sb-thread:release-mutex lock)) - -(defmacro with-lock-held ((place) &body body) - `(sb-thread:with-mutex (,place) ,@body)) - -(defun make-recursive-lock (&optional name) - (sb-thread:make-mutex :name (or name "Anonymous recursive lock"))) - -;;; XXX acquire-recursive-lock and release-recursive-lock are actually -;;; complicated because we can't use control stack tricks. We need to -;;; actually count something to check that the acquire/releases are -;;; balanced - -(defmacro with-recursive-lock-held ((place) &body body) - `(sb-thread:with-recursive-lock (,place) - ,@body)) - -;;; Resource contention: condition variables - -(defun make-condition-variable (&key name) - (sb-thread:make-waitqueue :name (or name "Anonymous condition variable"))) - -(defun condition-wait (condition-variable lock &key timeout) - (sb-thread:condition-wait condition-variable lock :timeout timeout)) - -(defun condition-notify (condition-variable) - (sb-thread:condition-notify condition-variable)) - -(defun thread-yield () - (sb-thread:release-foreground)) - -;;; Timeouts - -(deftype timeout () - 'sb-ext:timeout) - -(defmacro with-timeout ((timeout) &body body) - `(sb-ext:with-timeout ,timeout - ,@body)) - -;;; Semaphores - -(deftype semaphore () - 'sb-thread:semaphore) - -(defun make-semaphore (&key name (count 0)) - (sb-thread:make-semaphore :name name :count count)) - -(defun signal-semaphore (semaphore &key (count 1)) - (sb-thread:signal-semaphore semaphore count)) - -(defun wait-on-semaphore (semaphore &key timeout) - (sb-thread:wait-on-semaphore semaphore :timeout timeout)) - -;;; Introspection/debugging - -(defun all-threads () - (sb-thread:list-all-threads)) - -(defun interrupt-thread (thread function &rest args) - (flet ((apply-function () - (if args - (lambda () (apply function args)) - function))) - (declare (dynamic-extent #'apply-function)) - (sb-thread:interrupt-thread thread (apply-function)))) - -(defun destroy-thread (thread) - (signal-error-if-current-thread thread) - (sb-thread:terminate-thread thread)) - -(defun thread-alive-p (thread) - (sb-thread:thread-alive-p thread)) - -(defun join-thread (thread) - (sb-thread:join-thread thread)) - -(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-scl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-scl.lisp deleted file mode 100644 index 11715e1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-scl.lisp +++ /dev/null @@ -1,103 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -#| -Copyright 2008 Scieneer Pty Ltd - -Distributed under the MIT license (see LICENSE file) -|# - -(in-package #:bordeaux-threads) - -(deftype thread () - 'thread:thread) - -(defun %make-thread (function name) - (thread:thread-create function :name name)) - -(defun current-thread () - thread:*thread*) - -(defun threadp (object) - (typep object 'thread:thread)) - -(defun thread-name (thread) - (thread:thread-name thread)) - -;;; Resource contention: locks and recursive locks - -(deftype lock () 'thread:lock) - -(deftype recursive-lock () 'thread:recursive-lock) - -(defun lock-p (object) - (typep object 'thread:lock)) - -(defun recursive-lock-p (object) - (typep object 'thread:recursive-lock)) - -(defun make-lock (&optional name) - (thread:make-lock (or name "Anonymous lock"))) - -(defun acquire-lock (lock &optional (wait-p t)) - (thread::acquire-lock lock nil wait-p)) - -(defun release-lock (lock) - (thread::release-lock lock)) - -(defmacro with-lock-held ((place) &body body) - `(thread:with-lock-held (,place) ,@body)) - -(defun make-recursive-lock (&optional name) - (thread:make-lock (or name "Anonymous recursive lock") - :type :recursive)) - -;;; XXX acquire-recursive-lock and release-recursive-lock are actually -;;; complicated because we can't use control stack tricks. We need to -;;; actually count something to check that the acquire/releases are -;;; balanced - -(defmacro with-recursive-lock-held ((place) &body body) - `(thread:with-lock-held (,place) - ,@body)) - -;;; Resource contention: condition variables - -(defun make-condition-variable (&key name) - (thread:make-cond-var (or name "Anonymous condition variable"))) - -(defun condition-wait (condition-variable lock &key timeout) - (if timeout - (thread:cond-var-timedwait condition-variable lock timeout) - (thread:cond-var-wait condition-variable lock)) - t) - -(defun condition-notify (condition-variable) - (thread:cond-var-broadcast condition-variable)) - -(defun thread-yield () - (mp:process-yield)) - -;;; Introspection/debugging - -(defun all-threads () - (mp:all-processes)) - -(defun interrupt-thread (thread function &rest args) - (flet ((apply-function () - (if args - (lambda () (apply function args)) - function))) - (declare (dynamic-extent #'apply-function)) - (thread:thread-interrupt thread (apply-function)))) - -(defun destroy-thread (thread) - (thread:destroy-thread thread)) - -(defun thread-alive-p (thread) - (mp:process-alive-p thread)) - -(defun join-thread (thread) - (mp:process-wait (format nil "Waiting for thread ~A to complete" thread) - (lambda () (not (mp:process-alive-p thread))))) - -(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/pkgdcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/pkgdcl.lisp deleted file mode 100644 index 1c1e45d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/pkgdcl.lisp +++ /dev/null @@ -1,66 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -(cl:defpackage :bordeaux-threads - (:nicknames #:bt) - (:use #:cl #:alexandria) - #+abcl - (:import-from :java #:jnew #:jcall #:jmethod) - (:export #:thread #:make-thread #:current-thread #:threadp #:thread-name - #:start-multiprocessing - #:*default-special-bindings* #:*standard-io-bindings* - #:*supports-threads-p* - - #:lock #:make-lock #:lock-p - #:acquire-lock #:release-lock #:with-lock-held - - #:recursive-lock #:make-recursive-lock #:recursive-lock-p - #:acquire-recursive-lock #:release-recursive-lock #:with-recursive-lock-held - - #:make-condition-variable #:condition-wait #:condition-notify - - #:make-semaphore #:signal-semaphore #:wait-on-semaphore #:semaphore #:semaphore-p - - #:with-timeout #:timeout - - #:all-threads #:interrupt-thread #:destroy-thread #:thread-alive-p - #:join-thread #:thread-yield) - (:documentation "BORDEAUX-THREADS is a proposed standard for a minimal - MP/threading interface. It is similar to the CLIM-SYS threading and - lock support, but for the following broad differences: - - 1) Some behaviours are defined in additional detail: attention has - been given to special variable interaction, whether and when - cleanup forms are run. Some behaviours are defined in less - detail: an implementation that does not support multiple - threads is not required to use a new list (nil) for a lock, for - example. - - 2) Many functions which would be difficult, dangerous or inefficient - to provide on some implementations have been removed. Chiefly - these are functions such as thread-wait which expect for - efficiency that the thread scheduler is written in Lisp and - 'hookable', which can't sensibly be done if the scheduler is - external to the Lisp image, or the system has more than one CPU. - - 3) Unbalanced ACQUIRE-LOCK and RELEASE-LOCK functions have been - added. - - 4) Posix-style condition variables have been added, as it's not - otherwise possible to implement them correctly using the other - operations that are specified. - - Threads may be implemented using whatever applicable techniques are - provided by the operating system: user-space scheduling, - kernel-based LWPs or anything else that does the job. - - Some parts of this specification can also be implemented in a Lisp - that does not support multiple threads. Thread creation and some - thread inspection operations will not work, but the locking - functions are still present (though they may do nothing) so that - thread-safe code can be compiled on both multithread and - single-thread implementations without need of conditionals. - - To avoid conflict with existing MP/threading interfaces in - implementations, these symbols live in the BORDEAUX-THREADS package. - Implementations and/or users may also make them visible or exported - in other more traditionally named packages.")) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/test/bordeaux-threads-test.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/test/bordeaux-threads-test.lisp deleted file mode 100644 index 730f90c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/test/bordeaux-threads-test.lisp +++ /dev/null @@ -1,251 +0,0 @@ -#| -Copyright 2006,2007 Greg Pfeil - -Distributed under the MIT license (see LICENSE file) -|# - -(defpackage bordeaux-threads/test - (:use #:cl #:bordeaux-threads #:fiveam) - (:shadow #:with-timeout)) - -(in-package #:bordeaux-threads/test) - -(def-suite :bordeaux-threads) -(def-fixture using-lock () - (let ((lock (make-lock))) - (&body))) -(in-suite :bordeaux-threads) - -(test should-have-current-thread - (is (current-thread))) - -(test current-thread-identity - (let* ((box (list nil)) - (thread (make-thread (lambda () - (setf (car box) (current-thread)))))) - (join-thread thread) - (is (eql (car box) thread)))) - -(test join-thread-return-value - (is (eql 0 (join-thread (make-thread (lambda () 0)))))) - -(test should-identify-threads-correctly - (is (threadp (current-thread))) - (is (threadp (make-thread (lambda () t) :name "foo"))) - (is (not (threadp (make-lock))))) - -(test should-retrieve-thread-name - (is (equal "foo" (thread-name (make-thread (lambda () t) :name "foo"))))) - -(test interrupt-thread - (let* ((box (list nil)) - (thread (make-thread (lambda () - (setf (car box) - (catch 'new-thread - (sleep 60) - 'not-interrupted)))))) - (sleep 1) - (interrupt-thread thread (lambda () - (throw 'new-thread 'interrupted))) - (join-thread thread) - (is (eql 'interrupted (car box))))) - -(test should-lock-without-contention - (with-fixture using-lock () - (is (acquire-lock lock t)) - (release-lock lock) - (is (acquire-lock lock nil)) - (release-lock lock))) - -(defun set-equal (set-a set-b) - (and (null (set-difference set-a set-b)) - (null (set-difference set-b set-a)))) - -(test default-special-bindings - (locally (declare (special *a* *c*)) - (let* ((the-as 50) (the-bs 150) (*b* 42) - some-a some-b some-other-a some-other-b - (*default-special-bindings* - `((*a* . (funcall ,(lambda () (incf the-as)))) - (*b* . (funcall ,(lambda () (incf the-bs)))) - ,@*default-special-bindings*)) - (threads (list (make-thread - (lambda () - (setf some-a *a* some-b *b*))) - (make-thread - (lambda () - (setf some-other-a *a* - some-other-b *b*)))))) - (declare (special *b*)) - (thread-yield) - (is (not (boundp '*a*))) - (loop while (some #'thread-alive-p threads) - do (thread-yield)) - (is (set-equal (list some-a some-other-a) '(51 52))) - (is (set-equal (list some-b some-other-b) '(151 152))) - (is (not (boundp '*a*)))))) - - -(defparameter *shared* 0) -(defparameter *lock* (make-lock)) - -(test should-have-thread-interaction - ;; this simple test generates N process. Each process grabs and - ;; releases the lock until SHARED has some value, it then - ;; increments SHARED. the outer code first sets shared 1 which - ;; gets the thing running and then waits for SHARED to reach some - ;; value. this should, i think, stress test locks. - (setf *shared* 0) - (flet ((worker (i) - (loop - do (with-lock-held (*lock*) - (when (= i *shared*) - (incf *shared*) - (return))) - (thread-yield) - (sleep 0.001)))) - (let* ((procs (loop - for i from 1 upto 2 - ;; create a new binding to protect against implementations that - ;; mutate instead of binding the loop variable - collect (let ((i i)) - (make-thread (lambda () - (funcall #'worker i)) - :name (format nil "Proc #~D" i)))))) - (with-lock-held (*lock*) - (incf *shared*)) - (block test - (loop - until (with-lock-held (*lock*) - (= (1+ (length procs)) *shared*)) - do (with-lock-held (*lock*) - (is (>= (1+ (length procs)) *shared*))) - (thread-yield) - (sleep 0.001)))))) - - -(defparameter *condition-variable* (make-condition-variable)) - -(test condition-variable - (setf *shared* 0) - (flet ((worker (i) - (with-lock-held (*lock*) - (loop - until (= i *shared*) - do (condition-wait *condition-variable* *lock*)) - (incf *shared*)) - (condition-notify *condition-variable*))) - (let ((num-procs 100)) - (dotimes (i num-procs) - ;; create a new binding to protect against implementations that - ;; mutate instead of binding the loop variable - (let ((i i)) - (make-thread (lambda () - (funcall #'worker i)) - :name (format nil "Proc #~D" i)))) - (with-lock-held (*lock*) - (loop - until (= num-procs *shared*) - do (condition-wait *condition-variable* *lock*))) - (is (equal num-procs *shared*))))) - -;; Generally safe sanity check for the locks and single-notify -#+(and lispworks (not lispworks6)) -(test condition-variable-lw - (let ((condition-variable (make-condition-variable :name "Test")) - (test-lock (make-lock)) - (completed nil)) - (dotimes (id 6) - (let ((id id)) - (make-thread (lambda () - (with-lock-held (test-lock) - (condition-wait condition-variable test-lock) - (push id completed) - (condition-notify condition-variable)))))) - (sleep 2) - (if completed - (print "Failed: Premature passage through condition-wait") - (print "Successfully waited on condition")) - (condition-notify condition-variable) - (sleep 2) - (if (and completed - (eql (length completed) 6) - (equal (sort completed #'<) - (loop for id from 0 to 5 collect id))) - (print "Success: All elements notified") - (print (format nil "Failed: Of 6 expected elements, only ~A proceeded" completed))) - (bt::with-cv-access condition-variable - (if (and - (not (or (car wait-tlist) (cdr wait-tlist))) - (zerop (hash-table-count wait-hash)) - (zerop (hash-table-count unconsumed-notifications))) - (print "Success: condition variable restored to initial state") - (print "Error: condition variable retains residue from completed waiters"))) - (setq completed nil) - (dotimes (id 6) - (let ((id id)) - (make-thread (lambda () - (with-lock-held (test-lock) - (condition-wait condition-variable test-lock) - (push id completed)))))) - (sleep 2) - (condition-notify condition-variable) - (sleep 2) - (if (= (length completed) 1) - (print "Success: Notify-single only notified a single waiter to restart") - (format t "Failure: Notify-single restarted ~A items" (length completed))) - (condition-notify condition-variable) - (sleep 2) - (if (= (length completed) 2) - (print "Success: second Notify-single only notified a single waiter to restart") - (format t "Failure: Two Notify-singles restarted ~A items" (length completed))) - (loop for i from 0 to 5 do (condition-notify condition-variable)) - (print "Note: In the case of any failures, assume there are outstanding waiting threads") - (values))) - -#+(or abcl allegro clisp clozure ecl lispworks6 sbcl scl) -(test condition-wait-timeout - (let ((lock (make-lock)) - (cvar (make-condition-variable)) - (flag nil)) - (make-thread (lambda () (sleep 0.4) (setf flag t))) - (with-lock-held (lock) - (condition-wait cvar lock :timeout 0.2) - (is (null flag)) - (sleep 0.4) - (is (eq t flag))))) - -(test semaphore-signal - (let ((sem (make-semaphore))) - (make-thread (lambda () (sleep 0.4) (signal-semaphore sem))) - (is (not (null (wait-on-semaphore sem)))))) - -(test semaphore-signal-n-of-m - (let* ((sem (make-semaphore :count 1)) - (lock (make-lock)) - (count 0) - (waiter (lambda () - (wait-on-semaphore sem) - (with-lock-held (lock) (incf count))))) - (make-thread (lambda () (sleep 0.2) (signal-semaphore sem :count 3))) - (dotimes (v 5) (make-thread waiter)) - (sleep 0.3) - (is (= count 4)) - ;; release other waiters - (signal-semaphore sem :count 10) - (sleep 0.1) - (is (= count 5)))) - -(test semaphore-wait-timeout - (let ((sem (make-semaphore)) - (flag nil)) - (make-thread (lambda () (sleep 0.4) (setf flag t))) - (is (null (wait-on-semaphore sem :timeout 0.2))) - (is (null flag)) - (sleep 0.4) - (is (eq t flag)))) - -(test semaphore-typed - (is (typep (bt:make-semaphore) 'bt:semaphore)) - (is (bt:semaphore-p (bt:make-semaphore))) - (is (null (bt:semaphore-p (bt:make-lock))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/version.sexp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/version.sexp deleted file mode 100644 index 822e921..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/version.sexp +++ /dev/null @@ -1,2 +0,0 @@ -;; -*- lisp -*- -"0.8.7" diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/.gitignore b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/.gitignore deleted file mode 100644 index 1395ff4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/.gitignore +++ /dev/null @@ -1,28 +0,0 @@ -*~ -*.o -*.dylib -*.dll -*.bundle -*.so -*.fasl -*.xfasl -.DS_Store -doc/*.aux -doc/manual/ -doc/spec/ -doc/*.log -doc/*.info -doc/*.aux -doc/*.cp -doc/*.fn -doc/*.fns -doc/*.ky -doc/*.pg -doc/*.toc -doc/*.tps -doc/*.tp -doc/*.vr -doc/*.dvi -doc/*.cps -doc/*.vrs -doc/dir diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/.travis.yml b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/.travis.yml deleted file mode 100644 index 1d154f4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/.travis.yml +++ /dev/null @@ -1,38 +0,0 @@ -branches: - only: - - master - -language: lisp - -env: - matrix: - #- LISP=abcl - #- LISP=allegro - - LISP=sbcl - - LISP=sbcl32 - - LISP=ccl - - LISP=ccl32 - #- LISP=clisp - #- LISP=clisp32 - #- LISP=cmucl - #- LISP=ecl - -matrix: - allow_failures: - - env: LISP=ccl32 - -install: - - curl -L https://github.com/luismbo/cl-travis/raw/master/install.sh | sh - - if [ "${LISP:(-2)}" = "32" ]; then - sudo apt-get install -y libc6-dev-i386 libffi-dev:i386; - fi - - git clone --depth=1 git://github.com/trivial-features/trivial-features.git ~/lisp/trivial-features - - git clone https://gitlab.common-lisp.net/alexandria/alexandria.git ~/lisp/alexandria - - git clone --depth=1 git://github.com/cl-babel/babel.git ~/lisp/babel - -script: - - cl -e '(ql:quickload :cffi-tests) - (when (cffi-tests:run-all-cffi-tests) - (uiop:quit 1))' - -sudo: required diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/COPYRIGHT b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/COPYRIGHT deleted file mode 100644 index 67a5f68..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/COPYRIGHT +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (C) 2005-2007, James Bielman - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, copy, -modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/HEADER b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/HEADER deleted file mode 100644 index 7181d31..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/HEADER +++ /dev/null @@ -1,28 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; filename --- description -;;; -;;; Copyright (C) 2007, James Bielman -;;; -;;; Permission is hereby granted, free of charge, to any person -;;; obtaining a copy of this software and associated documentation -;;; files (the "Software"), to deal in the Software without -;;; restriction, including without limitation the rights to use, copy, -;;; modify, merge, publish, distribute, sublicense, and/or sell copies -;;; of the Software, and to permit persons to whom the Software is -;;; furnished to do so, subject to the following conditions: -;;; -;;; The above copyright notice and this permission notice shall be -;;; included in all copies or substantial portions of the Software. -;;; -;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -;;; DEALINGS IN THE SOFTWARE. -;;; - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/Makefile b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/Makefile deleted file mode 100644 index f0da0db..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/Makefile +++ /dev/null @@ -1,72 +0,0 @@ -# -*- Mode: Makefile; tab-width: 3; indent-tabs-mode: t -*- -# -# Makefile --- Make targets for various tasks. -# -# Copyright (C) 2005-2006, James Bielman -# -# 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. -# - -# This way you can easily run the tests for different versions -# of each lisp with, e.g. ALLEGRO=/path/to/some/lisp make test-allegro -CMUCL ?= lisp -OPENMCL ?= openmcl -SBCL ?= sbcl -CLISP ?= clisp -ALLEGRO ?= alisp -SCL ?= scl -ECL ?= ecl - -shlibs: - @$(MAKE) -wC tests shlibs - -clean: - @$(MAKE) -wC tests clean - find . -name ".fasls" | xargs rm -rf - find . \( -name "*.dfsl" -o -name "*.fasl" -o -name "*.fas" -o -name "*.lib" -o -name "*.x86f" -o -name "*.amd64f" -o -name "*.sparcf" -o -name "*.sparc64f" -o -name "*.hpf" -o -name "*.hp64f" -o -name "*.ppcf" -o -name "*.nfasl" -o -name "*.ufsl" -o -name "*.fsl" -o -name "*.lx64fsl" \) -exec rm {} \; - -test-openmcl: - @-$(OPENMCL) --load tests/run-tests.lisp - -test-sbcl: - @-$(SBCL) --noinform --load tests/run-tests.lisp - -test-cmucl: - @-$(CMUCL) -load tests/run-tests.lisp - -test-scl: - @-$(SCL) -load tests/run-tests.lisp - -test-clisp: - @-$(CLISP) -q -x '(load "tests/run-tests.lisp")' - -test-clisp-modern: - @-$(CLISP) -modern -q -x '(load "tests/run-tests.lisp")' - -test-allegro: - @-$(ALLEGRO) -L tests/run-tests.lisp - -test-ecl: - @-$(ECL) --quiet --load tests/run-tests.lisp - -test: test-openmcl test-sbcl test-cmucl test-clisp test-ecl - -# vim: ft=make ts=3 noet diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/README.md b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/README.md deleted file mode 100644 index 91e2135..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/README.md +++ /dev/null @@ -1,19 +0,0 @@ -[![Build Status](https://travis-ci.org/cffi/cffi.svg?branch=master)](https://travis-ci.org/cffi/cffi) - -CFFI, the Common Foreign Function Interface, purports to be a portable -foreign function interface for Common Lisp. The CFFI library is -composed of a Lisp-implementation-specific backend in the CFFI-SYS -package, and a portable frontend in the CFFI package. - -The CFFI-SYS backend package defines a low-level interface to the -native FFI support in the Lisp implementation. It offers operators for -allocating and dereferencing foreign memory, calling foreign -functions, and loading shared libraries. The CFFI frontend provides a -declarative interface for defining foreign functions, structures, -typedefs, enumerated types, etc. It is implemented in portable ANSI CL -making use of the low-level operators exported by CFFI-SYS. - -Please consult [the manual][1] for further details, including -installation instructions. - -[1]: http://common-lisp.net/project/cffi/manual/html_node/ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/TODO b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/TODO deleted file mode 100644 index ff25df1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/TODO +++ /dev/null @@ -1,115 +0,0 @@ --*- Text -*- - -This is a collection of TODO items and ideas in no particular order. - -### Testing - --> Test uffi-compat with more UFFI libraries. --> Write more FOREIGN-GLOBALS.SET.* tests. --> Finish tests/random-tester.lisp --> Write benchmarks comparing CFFI vs. native FFIs and also demonstrating - performance of each platform. --> Write more STRUCT.ALIGNMENT.* tests (namely involving the :LONG-LONG - and :UNSIGNED-LONG-LONG types) and test them in more ABIs. --> Run tests with the different kinds of shared libraries available on - MacOS X. - -### Ports - --> Finish GCL port, port to MCL. --> Update Corman port. [2007-02-22 LO] - -### Features - --> Implement a declarative interface for FOREIGN-FUNCALL-PTR, similar to - DEFCUN/FOREIGN-FUNCALL. --> Implement the proposed interfaces (see doc/). --> Extend FOREIGN-SLOT-VALUE and make it accept multiple "indices" for - directly accessing structs inside structs, arrays inside structs, etc... --> Implement EXPLAIN-FOREIGN-SLOT-VALUE. --> Implement :in/:out/:in-out for DEFCFUN (and FOREIGN-FUNCALL?). --> Add support for multiple memory allocation schemes (like CLISP), namely - support for allocating with malloc() (so that it can be freed on the C - side)> --> Extend DEFCVAR's symbol macro in order to handle memory (de)allocation - automatically (see CLISP). --> Implement byte swapping routines (see /usr/include/linux/byteorder) --> Warn about :void in places where it doesn't make sense. - -### Underspecified Semantics - --> (setf (mem-ref ptr offset) ) --> Review the interface for coherence across Lisps with regard to - behaviour in "exceptional" situations. Eg: threads, dumping cores, - accessing foreign symbols that don't exist, etc... --> On Lispworks a Lisp float is a double and therefore won't necessarily - fit in a C float. Figure out a way to handle this. --> Allegro: callbacks' return values. --> Lack of uniformity with regard to pointers. Allegro: 0 -> NULL. - CLISP/Lispworks: NIL -> NULL. --> Some lisps will accept a lisp float being passed to :double - and a lisp double to :float. We should either coerce on lisps that - don't accept this or check-type on lisps that do. Probably the former - is better since on lispworks/x86 double == float. - -### Possible Optimizations - --> More compiler macros on some of the CFFI-SYS implementations. --> Optimize UFFI-COMPAT when the vector stuff is implemented. --> Being able to declare that some C int will always fit in a Lisp - fixnum. Allegro has a :fixnum ftype and CMUCL/SBCL can use - (unsigned-byte 29) others could perhaps behave like :int? --> An option for defcfun to expand into a compiler macro which would - allow the macroexpansion-time translators to look at the forms - passed to the functions. - -### Known Issues - --> CLISP FASL portability is broken. Fix this by placing LOAD-TIME-VALUE - forms in the right places and moving other calculations to load-time. - (eg: calculating struct size/alignment.) Ideally we'd only move them - to load-time when we actually care about fasl portability. - (defmacro maybe-load-time-value (form) - (if - `(load-time-value ,form) - form)) --> cffi-tests.asd's :c-test-lib component is causing the whole testsuite - to be recompiled everytime. Figure that out. --> The (if (constantp foo) (do-something-with (eval foo)) ...) pattern - used in many places throughout the code is apparently not 100% safe. --> On ECL platforms without DFFI we need to build a non-linked version - of libtest. --> foreign-enum-keyword/value should have their own error condition? - [2007-02-22 LO] - -### Documentation - --> Fill the missing sections in the CFFI User Manual. --> Update the CFFI-SYS Specification. --> have two versions of the manual on the website - -### CFFI-Grovel - --> Look into making the C output more concise. - -### CFFI-Toolchain - --> Port the toolchain parameter detection to more implementations --> Port the static linking support to more implementations --> Add a mechanism to configure and/or detect dynamic libraries against - which to link for instance. - It could be a variable in which flags are accumulated, - or an autodetection after loading everything, see - https://github.com/borodust/cl-bodge/blob/0.3.0/distribution/build.lisp#L79 - -### CFFI/C2FFI - --> Generate wrappers for C inline function definitions (and maybe for some - #define's?) --> It would be nice if c2ffi emitted its output in a stable order - for details see https://github.com/rpav/c2ffi/issues/28 --> Handle va_list. For now it's treated as any other argument. - -### Other - --> Type-checking pointer interface. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-examples.asd b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-examples.asd deleted file mode 100644 index 4208923..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-examples.asd +++ /dev/null @@ -1,37 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-examples.asd --- ASDF system definition for CFFI examples. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -(defsystem cffi-examples - :description "CFFI Examples" - :author "James Bielman " - :components - ((:module examples - :components - ((:file "examples") - (:file "gethostname") - (:file "gettimeofday")))) - :depends-on (cffi)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-grovel.asd b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-grovel.asd deleted file mode 100644 index cca587e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-grovel.asd +++ /dev/null @@ -1,41 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-grovel.asd --- ASDF system definition for cffi-grovel. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. -;;; - -(defsystem "cffi-grovel" - :description "The CFFI Groveller" - :author "Dan Knapp " - :depends-on ("cffi" "cffi-toolchain" "alexandria") - :licence "MIT" - :components - ((:module "grovel" - :components - ((:static-file "common.h") - (:file "package") - (:file "grovel" :depends-on ("package")) - (:file "asdf" :depends-on ("grovel")))))) - -;; vim: ft=lisp et diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-libffi.asd b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-libffi.asd deleted file mode 100644 index ef2fb2c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-libffi.asd +++ /dev/null @@ -1,48 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-libffi.asd --- Foreign Structures By Value -;;; -;;; Copyright (C) 2011 Liam M. Healy -;;; -;;; 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. -;;; - -(in-package :asdf) - -(eval-when (:compile-toplevel :execute) - (asdf:oos 'asdf:load-op :cffi-grovel) - (asdf:oos 'asdf:load-op :trivial-features)) - -(defsystem cffi-libffi - :description "Foreign structures by value" - :author "Liam Healy " - :maintainer "Liam Healy " - :defsystem-depends-on (#:trivial-features #:cffi-grovel) - :components - ((:module libffi - :serial t - :components - ((:file "libffi") - (cffi-grovel:grovel-file "libffi-types") - (:file "libffi-functions") - (:file "type-descriptors") - (:file "funcall")))) - :depends-on (#:cffi #:cffi-grovel #:trivial-features)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-tests.asd b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-tests.asd deleted file mode 100644 index 618d7d5..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-tests.asd +++ /dev/null @@ -1,91 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-tests.asd --- ASDF system definition for CFFI unit tests. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; Copyright (C) 2005-2011, Luis Oliveira -;;; -;;; 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. -;;; - -(load-systems "trivial-features" "cffi-grovel") - -(defclass c-test-lib (c-source-file) - ()) - -(defmethod perform ((o load-op) (c c-test-lib)) - nil) - -(defmethod perform ((o load-source-op) (c c-test-lib)) - nil) - -(defmethod output-files ((o compile-op) (c c-test-lib)) - (let ((p (component-pathname c))) - (values - (list (make-pathname :defaults p :type (asdf/bundle:bundle-pathname-type :object)) - (make-pathname :defaults p :type (asdf/bundle:bundle-pathname-type :shared-library))) - t))) - -(defmethod perform ((o compile-op) (c c-test-lib)) - (let ((cffi-toolchain:*cc-flags* `(,@cffi-toolchain:*cc-flags* "-Wall" "-std=c99" "-pedantic"))) - (destructuring-bind (obj dll) (output-files o c) - (cffi-toolchain:cc-compile obj (input-files o c)) - (cffi-toolchain:link-shared-library dll (list obj))))) - -(defsystem "cffi-tests" - :description "Unit tests for CFFI." - :depends-on ("cffi-grovel" "cffi-libffi" "bordeaux-threads" #-ecl "rt" #+ecl (:require "rt")) - :components - ((:module "tests" - :components - ((:c-test-lib "libtest") - (:c-test-lib "libtest2") - (:c-test-lib "libfsbv") - (:file "package") - (:file "bindings" :depends-on ("package" "libtest" "libtest2" "libfsbv")) - (:file "funcall" :depends-on ("bindings")) - (:file "defcfun" :depends-on ("bindings")) - (:file "callbacks" :depends-on ("bindings")) - (:file "foreign-globals" :depends-on ("package")) - (:file "memory" :depends-on ("package")) - (:file "strings" :depends-on ("package")) - (:file "arrays" :depends-on ("package")) - (:file "struct" :depends-on ("package")) - (:file "union" :depends-on ("package")) - (:file "enum" :depends-on ("package")) - (:file "fsbv" :depends-on ("bindings" "enum")) - (:file "misc-types" :depends-on ("bindings")) - (:file "misc" :depends-on ("bindings")) - (:file "test-asdf" :depends-on ("package")) - (:file "grovel" :depends-on ("package"))))) - :perform (test-op (o c) (symbol-call :cffi-tests '#:run-all-cffi-tests))) - -(defsystem "cffi-tests/example" - :defsystem-depends-on ("cffi-grovel") - :entry-point "cffi-example::entry-point" - :components - ((:module "examples" :components - ((:file "package") - (:cffi-wrapper-file "wrapper-example" :depends-on ("package")) - (:cffi-grovel-file "grovel-example" :depends-on ("package")) - (:file "main-example" :depends-on ("package")))))) - -;;; vim: ft=lisp et diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-toolchain.asd b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-toolchain.asd deleted file mode 100644 index f3864f1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-toolchain.asd +++ /dev/null @@ -1,48 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-toolchain.asd --- ASDF system definition for cffi-toolchain. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. -;;; - -;; Make sure to upgrade ASDF before the #.(if ...) below may be read. -(load-system "asdf") -#-asdf3.1 (error "CFFI-toolchain requires ASDF 3.1!") - -(defsystem "cffi-toolchain" - :description "The CFFI toolchain" - :long-description "Portable abstractions for using the C compiler, linker, etc." - :author "Francois-Rene Rideau " - :depends-on ((:version "asdf" "3.1.2") "cffi") - :licence "MIT" - :components - ((:module "toolchain" - :components - (;; This is a plain copy of bundle.lisp from ASDF 3.2.0 - ;; in case your asdf isn't up to snuff. - (:file "bundle" :if-feature (#.(if (version< "3.1.8" (asdf-version)) :or :and))) - (:file "package") - (:file "c-toolchain" :depends-on ("package")) - (:file "static-link" :depends-on ("bundle" "c-toolchain")))))) - -;; vim: ft=lisp et diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-uffi-compat.asd b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-uffi-compat.asd deleted file mode 100644 index 3ea9b77..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-uffi-compat.asd +++ /dev/null @@ -1,41 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-uffi-compat.asd --- ASDF system definition for CFFI-UFFI-COMPAT. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -(defpackage #:cffi-uffi-compat-system - (:use #:cl #:asdf)) -(in-package #:cffi-uffi-compat-system) - -(defsystem cffi-uffi-compat - :description "UFFI Compatibility Layer for CFFI" - :author "James Bielman " - :components - ((:module uffi-compat - :components - ((:file "uffi-compat")))) - :depends-on (cffi)) - -;; vim: ft=lisp et diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi.asd b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi.asd deleted file mode 100644 index 491698a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi.asd +++ /dev/null @@ -1,101 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi.asd --- ASDF system definition for CFFI. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; Copyright (C) 2005-2010, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package :asdf) - -#-(or openmcl mcl sbcl cmucl scl clisp lispworks ecl allegro cormanlisp abcl mkcl clasp) -(error "Sorry, this Lisp is not yet supported. Patches welcome!") - -(defsystem "cffi" - :description "The Common Foreign Function Interface" - :author "James Bielman " - :maintainer "Luis Oliveira " - :licence "MIT" - :depends-on (:uiop :alexandria :trivial-features :babel) - :in-order-to ((test-op (load-op :cffi-tests))) - :perform (test-op (o c) (operate 'asdf:test-op :cffi-tests)) - :components - ((:module "src" - :serial t - :components - (#+openmcl (:file "cffi-openmcl") - #+mcl (:file "cffi-mcl") - #+sbcl (:file "cffi-sbcl") - #+cmucl (:file "cffi-cmucl") - #+scl (:file "cffi-scl") - #+clisp (:file "cffi-clisp") - #+lispworks (:file "cffi-lispworks") - #+ecl (:file "cffi-ecl") - #+allegro (:file "cffi-allegro") - #+cormanlisp (:file "cffi-corman") - #+abcl (:file "cffi-abcl") - #+mkcl (:file "cffi-mkcl") - #+clasp (:file "cffi-clasp") - (:file "package") - (:file "utils") - (:file "libraries") - (:file "early-types") - (:file "types") - (:file "enum") - (:file "strings") - (:file "structures") - (:file "functions") - (:file "foreign-vars") - (:file "features"))))) - -;; when you get CFFI from git, its defsystem doesn't have a version, -;; so we assume it satisfies any version requirements whatsoever. -(defmethod version-satisfies ((c (eql (find-system :cffi))) version) - (declare (ignorable version)) - (or (null (component-version c)) - (call-next-method))) - -(defsystem "cffi/c2ffi" - :description "CFFI definition generator from the FFI spec generated by c2ffi. This system is enough to use the ASDF machinery (as a :defsystem-depends-on)." - :author "Attila Lendvai " - :depends-on (:alexandria - :cffi) - :licence "MIT" - :components - ((:module "src/c2ffi" - :components - ((:file "package") - (:file "c2ffi" :depends-on ("package")) - (:file "asdf" :depends-on ("package" "c2ffi")))))) - -(defsystem "cffi/c2ffi-generator" - :description "This system gets loaded lazily when the CFFI bindings need to be regenerated." - :author "Attila Lendvai " - :depends-on (:cffi/c2ffi - :cl-ppcre - :cl-json) - :licence "MIT" - :components - ((:module "src/c2ffi" - :components - ((:file "generator"))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/Makefile b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/Makefile deleted file mode 100644 index 7a285cf..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/Makefile +++ /dev/null @@ -1,46 +0,0 @@ -# -*- Mode: Makefile; tab-width: 3; indent-tabs-mode: t -*- -# -# Makefile --- Make targets for generating the documentation. -# -# Copyright (C) 2005-2007, Luis Oliveira -# -# 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. -# - -export LC_ALL=C - -all: manual spec - -manual: cffi-manual.texinfo style.css - sh gendocs.sh -o manual --html "--css-include=style.css" cffi-manual "CFFI User Manual" - -spec: cffi-sys-spec.texinfo style.css - sh gendocs.sh -o spec --html "--css-include=style.css" cffi-sys-spec "CFFI-SYS Interface Specification" - -clean: - find . \( -name "*.info" -o -name "*.aux" -o -name "*.cp" -o -name "*.fn" -o -name "*.fns" -o -name "*.ky" -o -name "*.log" -o -name "*.pg" -o -name "*.toc" -o -name "*.tp" -o -name "*.vr" -o -name "*.dvi" -o -name "*.cps" -o -name "*.vrs" \) -exec rm {} \; - rm -rf manual spec dir - -upload-docs: manual spec - rsync -av --delete -e ssh manual spec common-lisp.net:/project/cffi/public_html/ -# scp -r manual spec common-lisp.net:/project/cffi/public_html/ - -# vim: ft=make ts=3 noet diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/allegro-internals.txt b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/allegro-internals.txt deleted file mode 100644 index 64c0d7e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/allegro-internals.txt +++ /dev/null @@ -1,132 +0,0 @@ -July 2005 -These details were kindly provided by Duane Rettig of Franz. - -Regarding the following snippet of the macro expansion of -FF:DEF-FOREIGN-CALL: - - (SYSTEM::FF-FUNCALL - (LOAD-TIME-VALUE (EXCL::DETERMINE-FOREIGN-ADDRESS - '("foo" :LANGUAGE :C) 2 NIL)) - '(:INT (INTEGER * *)) ARG1 - '(:DOUBLE (DOUBLE-FLOAT * *)) ARG2 - '(:INT (INTEGER * *))) - -" -... in Allegro CL, if you define a foreign call FOO with C entry point -"foo" and with :call-direct t in the arguments, and if other things are -satisfied, then if a lisp function BAR is compiled which has a call to -FOO, that call will not go through ff-funcall (and thus a large amount -of argument manipulation and processing) but will instead set up its -arguments directly on the stack, and will then perform the "call" more -or less directly, through the "entry vec" (a small structure which -keeps track of a foreign entry's address and status)." - -This is the code that generates what the compiler expects to see: - -(setq call-direct-form - (if* call-direct - then `(setf (get ',lispname 'sys::direct-ff-call) - (list ',external-name - ,callback - ,convention - ',returning - ',arg-types - ,arg-checking - ,entry-vec-flags)) - else `(remprop ',lispname 'sys::direct-ff-call))) - -Thus generating something like: - - (EVAL-WHEN (COMPILE LOAD EVAL) - (SETF (GET 'FOO 'SYSTEM::DIRECT-FF-CALL) - (LIST '("foo" :LANGUAGE :C) T :C - '(:INT (INTEGER * *)) - '((:INT (INTEGER * *)) - (:FLOAT (SINGLE-FLOAT * *))) - T - 2 ; this magic value is explained later - ))) - -" -(defun determine-foreign-address (name &optional (flags 0) method-index) - ;; return an entry-vec struct suitable for the foreign-call of name. - ;; - ;; name is either a string, which is taken without conversion, or - ;; a list consisting of a string to convert or a conversion function - ;; call. - ;; flags is an integer representing the flags to place into the entry-vec. - ;; method-index, if non-nil, is a word-index into a vtbl (virtual table). - ;; If method-index is true, then the name must be a string uniquely - ;; represented by the index and by the flags field. - -Note that not all architectures implement the :method-index argument -to def-foreign-call, but your interface likely won't support it -anyway, so just leave it nil. As for the flags, they are constants -stored into the entry-vec returned by d-f-a and are given here: - -(defconstant ep-flag-call-semidirect 1) ; Real address stored in alt-address slot -(defconstant ep-flag-never-release 2) ; Never release the heap -(defconstant ep-flag-always-release 4) ; Always release the heap -(defconstant ep-flag-release-when-ok 8) ; Release the heap unless without-interrupts - -(defconstant ep-flag-tramp-calls #x70) ; Make calls through special trampolines -(defconstant ep-flag-tramp-shift 4) - -(defconstant ep-flag-variable-address #x100) ; Entry-point contains address of C var -(defconstant ep-flag-strings-convert #x200) ; Convert strings automatically - -(defconstant ep-flag-get-errno #x1000) ;; [rfe5060]: Get errno value after call -(defconstant ep-flag-get-last-error #x2000) ;; [rfe5060]: call GetLastError after call -;; Leave #x4000 and #x8000 open for expansion - -Mostly, you'll give the value 2 (never release the heap), but if you -give 4 or 8, then d-f-a will automatically set the 1 bit as well, -which takes the call through a heap-release/reacquire process. - -Some docs for entry-vec are: - -;; -- entry vec -- -;; An entry-vec is an entry-point descriptor, usually a pointer into -;; a shared-library. It is represented as a 5-element struct of type -;; foreign-vector. The reason for this represntation is -;; that it allows the entry point to be stored in a table, called -;; the .saved-entry-points. table, and to be used by a foreign -;; function. When the location of the foreign function to which the entry -;; point refers changes, it is simply a matter of changing the value in entry -;; point vector and the foreign call code sees it immediately. There is -;; even an address that can be put in the entry point vector that denotes -;; a missing foreign function, thus lookup can happen dynamically. - -(defstruct (entry-vec - (:type (vector excl::foreign (*))) - (:constructor make-entry-vec-boa ())) - name ; entry point name - (address 0) ; jump address for foreign code - (handle 0) ; shared-lib handle - (flags 0) ; ep-* flags - (alt-address 0) ; sometimes holds the real func addr - ) - -[...] -" - -Regarding the arguments to SYSTEM::FF-FUNCALL: - '(:int (integer * *)) argN - -"The type-spec is as it is given in the def-foreign-call -syntax, with a C type optionally followed by a lisp type, -followed optionally by a user-conversion function name[...]" - - -Getting the alignment: - -CL-USER(2): (ff:get-foreign-type :int) -#S(FOREIGN-FUNCTIONS::IFOREIGN-TYPE - :ATTRIBUTES NIL - :SFTYPE - #S(FOREIGN-FUNCTIONS::SIZED-FTYPE-PRIM - :KIND :INT - :WIDTH 4 - :OFFSET 0 - :ALIGN 4) - ...) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/cffi-manual.texinfo b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/cffi-manual.texinfo deleted file mode 100644 index 03c71d4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/cffi-manual.texinfo +++ /dev/null @@ -1,7113 +0,0 @@ -\input texinfo @c -*- Mode: Texinfo; Mode: auto-fill -*- -@c %**start of header -@setfilename cffi.info -@settitle CFFI User Manual -@exampleindent 2 - -@c @documentencoding utf-8 - -@c Style notes: -@c -@c * The reference section names and "See Also" list are roman, not -@c @code. This is to follow the format of CLHS. -@c -@c * How it looks in HTML is the priority. - -@c ============================= Macros ============================= -@c The following macros are used throughout this manual. - -@macro Function {args} -@defun \args\ -@end defun -@end macro - -@macro Macro {args} -@defmac \args\ -@end defmac -@end macro - -@macro Accessor {args} -@deffn {Accessor} \args\ -@end deffn -@end macro - -@macro GenericFunction {args} -@deffn {Generic Function} \args\ -@end deffn -@end macro - -@macro ForeignType {args} -@deftp {Foreign Type} \args\ -@end deftp -@end macro - -@macro Variable {args} -@defvr {Special Variable} \args\ -@end defvr -@end macro - -@macro Condition {args} -@deftp {Condition Type} \args\ -@end deftp -@end macro - -@macro cffi -@acronym{CFFI} -@end macro - -@macro impnote {text} -@quotation -@strong{Implementor's note:} @emph{\text\} -@end quotation -@end macro - -@c Info "requires" that x-refs end in a period or comma, or ) in the -@c case of @pxref. So the following implements that requirement for -@c the "See also" subheadings that permeate this manual, but only in -@c Info mode. -@ifinfo -@macro seealso {name} -@ref{\name\}. -@end macro -@end ifinfo - -@ifnotinfo -@alias seealso = ref -@end ifnotinfo - -@c Typeset comments in roman font for the TeX output. -@iftex -@alias lispcmt = r -@end iftex -@ifnottex -@alias lispcmt = asis -@end ifnottex - -@alias res = result - -@c ============================= Macros ============================= - - -@c Show types, functions, and concepts in the same index. -@syncodeindex tp cp -@syncodeindex fn cp - -@copying -Copyright @copyright{} 2005 James Bielman @* -Copyright @copyright{} 2005-2015 Lu@'{@dotless{i}}s Oliveira - @* -Copyright @copyright{} 2005-2006 Dan Knapp @* -Copyright @copyright{} 2005-2006 Emily Backes @* -Copyright @copyright{} 2006 Stephen Compall - -@quotation -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. - -@sc{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 -@end copying -@c %**end of header - -@dircategory Software development -@direntry -* CFFI Manual: (cffi-manual). CFFI Manual. -@end direntry - -@titlepage -@title CFFI User Manual -@c @subtitle Version X.X -@c @author James Bielman - -@page -@vskip 0pt plus 1filll -@insertcopying -@end titlepage - -@contents - -@ifnottex -@node Top, Introduction, (dir), (dir) -@top cffi -@insertcopying -@end ifnottex - -@menu -* Introduction:: What is CFFI? -* Installation:: -* Implementation Support:: -* Tutorial:: Interactive intro to using CFFI. -* Wrapper generators:: CFFI forms from munging C source code. -* Foreign Types:: -* Pointers:: -* Strings:: -* Variables:: -* Functions:: -* Libraries:: -* Callbacks:: -* The Groveller:: -* Static Linking:: -* Limitations:: -* Platform-specific features:: Details about the underlying system. -* Glossary:: List of CFFI-specific terms and meanings. -* Comprehensive Index:: - -@detailmenu - --- Dictionary --- - -Foreign Types - -* convert-from-foreign:: Outside interface to backward type translator. -* convert-to-foreign:: Outside interface to forward type translator. -* defbitfield:: Defines a bitfield. -* defcstruct:: Defines a C structure type. -* defcunion:: Defines a C union type. -* defctype:: Defines a foreign typedef. -* defcenum:: Defines a C enumeration. -* define-foreign-type:: Defines a foreign type specifier. -* define-parse-method:: Specifies how a type should be parsed. -@c * explain-foreign-slot-value:: -* foreign-bitfield-symbols:: Returns a list of symbols for a bitfield type. -* foreign-bitfield-value:: Calculates a value for a bitfield type. -* foreign-enum-keyword:: Finds a keyword in an enum type. -* foreign-enum-value:: Finds a value in an enum type. -* foreign-slot-names:: Returns a list of slot names in a foreign struct. -* foreign-slot-offset:: Returns the offset of a slot in a foreign struct. -* foreign-slot-pointer:: Returns a pointer to a slot in a foreign struct. -* foreign-slot-value:: Returns the value of a slot in a foreign struct. -* foreign-type-alignment:: Returns the alignment of a foreign type. -* foreign-type-size:: Returns the size of a foreign type. -* free-converted-object:: Outside interface to typed object deallocators. -* free-translated-object:: Defines how to free a oreign object. -* translate-from-foreign:: Defines a foreign-to-Lisp object translation. -* translate-to-foreign:: Defines a Lisp-to-foreign object translation. -* with-foreign-object:: Allocates a foreign object with dynamic extent. -* with-foreign-objects:: Plural form of @code{with-foreign-object}. -* with-foreign-slots:: Accesses the slots of a foreign structure. - -Pointers - -* foreign-free:: Deallocates memory. -* foreign-alloc:: Allocates memory. -* foreign-symbol-pointer:: Returns a pointer to a foreign symbol. -* inc-pointer:: Increments the address held by a pointer. -* incf-pointer:: Increments the pointer address in a place. -* make-pointer:: Returns a pointer to a given address. -* mem-aptr:: The pointer to an element of an array. -* mem-aref:: Accesses the value of an index in an array. -* mem-ref:: Dereferences a pointer. -* null-pointer:: Returns a NULL pointer. -* null-pointer-p:: Tests a pointer for NULL value. -* pointerp:: Tests whether an object is a pointer or not. -* pointer-address:: Returns the address pointed to by a pointer. -* pointer-eq:: Tests if two pointers point to the same address. -* with-foreign-pointer:: Allocates memory with dynamic extent. - -Strings - -* *default-foreign-encoding*:: Default encoding for the string types. -* foreign-string-alloc:: Converts a Lisp string to a foreign string. -* foreign-string-free:: Deallocates memory used by a foreign string. -* foreign-string-to-lisp:: Converts a foreign string to a Lisp string. -* lisp-string-to-foreign:: Copies a Lisp string into a foreign string. -* with-foreign-string:: Allocates a foreign string with dynamic extent. -* with-foreign-strings:: Plural form of @code{with-foreign-string}. -* with-foreign-pointer-as-string:: Similar to CL's with-output-to-string. - -Variables - -* defcvar:: Defines a C global variable. -* get-var-pointer:: Returns a pointer to a defined global variable. - -Functions - -* defcfun:: Defines a foreign function. -* foreign-funcall:: Performs a call to a foreign function. -* foreign-funcall-pointer:: Performs a call through a foreign pointer. -* translate-camelcase-name:: Converts a camelCase foreign name to/from a Lisp name. -* translate-name-from-foreign:: Converts a foreign name to a Lisp name. -* translate-name-to-foreign:: Converts a Lisp name to a foreign name. -* translate-underscore-separated-name:: Converts an underscore_separated foreign name to/from a Lisp name. - -Libraries - -* close-foreign-library:: Closes a foreign library. -* *darwin-framework-directories*:: Search path for Darwin frameworks. -* define-foreign-library:: Explain how to load a foreign library. -* *foreign-library-directories*:: Search path for shared libraries. -* load-foreign-library:: Load a foreign library. -* load-foreign-library-error:: Signalled on failure of its namesake. -@c * reload-foreign-libraries:: Reload foreign libraries. -* use-foreign-library:: Load a foreign library when needed. - -Callbacks - -* callback:: Returns a pointer to a defined callback. -* defcallback:: Defines a Lisp callback. -* get-callback:: Returns a pointer to a defined callback. - -@end detailmenu -@end menu - - - - -@c =================================================================== -@c CHAPTER: Introduction - -@node Introduction, Installation, Top, Top -@chapter Introduction - -@cffi{} is the Common Foreign Function Interface for @acronym{ANSI} -Common Lisp systems. By @dfn{foreign function} we mean a function -written in another programming language and having different data and -calling conventions than Common Lisp, namely, C. @cffi{} allows you -to call foreign functions and access foreign variables, all without -leaving the Lisp image. - -We consider this manual ever a work in progress. If you have -difficulty with anything @cffi{}-specific presented in the manual, -please contact @email{cffi-devel@@common-lisp.net,the developers} with -details. - - -@heading Motivation - -@xref{Tutorial-Comparison,, What makes Lisp different}, for -an argument in favor of @acronym{FFI} in general. - -@cffi{}'s primary role in any image is to mediate between Lisp -developers and the widely varying @acronym{FFI}s present in the -various Lisp implementations it supports. With @cffi{}, you can -define foreign function interfaces while still maintaining portability -between implementations. It is not the first Common Lisp package with -this objective; however, it is meant to be a more malleable framework -than similar packages. - - -@heading Design Philosophy - -@itemize -@item -Pointers do not carry around type information. Instead, type -information is supplied when pointers are dereferenced. - -@item -A type safe pointer interface can be developed on top of an -untyped one. It is difficult to do the opposite. - -@item -Functions are better than macros. When a macro could be used -for performance, use a compiler-macro instead. -@end itemize - - -@c =================================================================== -@c CHAPTER: Installation - -@node Installation, Implementation Support, Introduction, Top -@chapter Installation - -@cffi{} can be obtained through one of the following means available -through its @uref{http://common-lisp.net/project/cffi/,,website}: - -@itemize -@item -@uref{http://common-lisp.net/project/cffi/releases/?M=D,,official release -tarballs} - -@item -@uref{http://common-lisp.net/gitweb?p=projects/cffi/cffi.git,,git -repository} - -@c snapshots have been disabled as of -@c @item -@c @uref{http://common-lisp.net/project/cffi/tarballs/?M=D,,nightly-generated -@c snapshots} - -@end itemize - -In addition, you will need to obtain and install the following -dependencies: - -@itemize -@item -@uref{http://common-lisp.net/project/babel/,,Babel}, a charset -encoding/decoding library. - -@item -@uref{http://common-lisp.net/project/alexandria/,,Alexandria}, a -collection of portable public-domain utilities. - -@item -@uref{http://www.cliki.net/trivial-features,,trivial-features}, a -portability layer that ensures consistent @code{*features*} across -multiple Common Lisp implementations. - -@end itemize - -Furthermore, if you wish to run the testsuite, -@uref{http://www.cliki.net/rt,,RT} is required. - -You may find mechanisms such as -@uref{https://www.quicklisp.org/beta/,Quicklisp} (recommended) -or @uref{http://common-lisp.net/project/clbuild/,,clbuild} (for advanced -uses) helpful in getting and managing @cffi{} and its -dependencies. - - -@c =================================================================== -@c CHAPTER: Implementation Support - -@node Implementation Support, Tutorial, Installation, Top -@chapter Implementation Support - -@cffi{} supports various free and commercial Lisp implementations: -@acronym{ABCL}, Allegro CL, Clasp, @sc{clisp}, Clozure CL, -@acronym{CMUCL}, Corman CL, @acronym{ECL}, @acronym{GCL}, LispWorks, -@acronym{MCL}, @acronym{SBCL} and the Scieneer CL. - -In general, you should work with the latest versions of each -implementation since those will usually be tested against recent -versions of CFFI more often and might include necessary features or -bug fixes. Reasonable patches for compatibility with earlier versions -are welcome nevertheless. - -@section Limitations - -Some features are not supported in all implementations. -@c TODO: describe these features here. -@c flat-namespace too - -@subheading Allegro CL - -@itemize -@item -Does not support the @code{:long-long} type natively. -@item -Unicode support is limited to the Basic Multilingual Plane (16-bit -code points). -@end itemize - -@subheading Clasp - -@itemize -@item -Only supports a flat namespace. -@end itemize - -@subheading CMUCL - -@itemize -@item -No Unicode support. (8-bit code points) -@end itemize - -@subheading Corman CL - -@itemize -@item -Does not support @code{foreign-funcall}. -@end itemize - -@subheading @acronym{ECL} - -@itemize -@item -On platforms where ECL's dynamic FFI is not supported (ie. when -@code{:dffi} is not present in @code{*features*}), -@code{cffi:load-foreign-library} does not work and you must use ECL's -own @code{ffi:load-foreign-library} with a constant string argument. -@end itemize - -@subheading Lispworks - -@itemize -@item -Does not completely support the @code{:long-long} type natively in -32-bit platforms. -@item -Unicode support is limited to the Basic Multilingual Plane (16-bit -code points). -@end itemize - -@subheading @acronym{SBCL} - -@itemize -@item -Not all platforms support callbacks. - -@end itemize - - -@c =================================================================== -@c CHAPTER: An Introduction to Foreign Interfaces and CFFI - -@c This macro is merely a marker that I don't think I'll use after -@c all. -@macro tutorialsource {text} -@c \text\ -@end macro - -@c because I don't want to type this over and over -@macro clikicffi -http://www.cliki.net/CFFI -@end macro -@c TeX puts spurious newlines in when you use the above macro -@c in @examples &c. So it is expanded below in some places. - - -@node Tutorial, Wrapper generators, Implementation Support, Top -@chapter An Introduction to Foreign Interfaces and @acronym{CFFI} - -@c Above, I don't use the cffi macro because it breaks TeX. - -@cindex tutorial, @cffi{} -Users of many popular languages bearing semantic similarity to Lisp, -such as Perl and Python, are accustomed to having access to popular C -libraries, such as @acronym{GTK}, by way of ``bindings''. In Lisp, we -do something similar, but take a fundamentally different approach. -This tutorial first explains this difference, then explains how you -can use @cffi{}, a powerful system for calling out to C and C++ and -access C data from many Common Lisp implementations. - -@cindex foreign functions and data -The concept can be generalized to other languages; at the time of -writing, only @cffi{}'s C support is fairly complete. Therefore, we -will interchangeably refer to @dfn{foreign functions} and @dfn{foreign -data}, and ``C functions'' and ``C data''. At no time will the word -``foreign'' carry its usual, non-programming meaning. - -This tutorial expects you to have a working understanding of both -Common Lisp and C, including the Common Lisp macro system. - -@menu -* Tutorial-Comparison:: Why FFI? -* Tutorial-Getting a URL:: An FFI use case. -* Tutorial-Loading:: Load libcurl.so. -* Tutorial-Initializing:: Call a function in libcurl.so. -* Tutorial-easy_setopt:: An advanced libcurl function. -* Tutorial-Abstraction:: Why breaking it is necessary. -* Tutorial-Lisp easy_setopt:: Semi-Lispy option interface. -* Tutorial-Memory:: In C, you collect the garbage. -* Tutorial-Callbacks:: Make useful C function pointers. -* Tutorial-Completion:: Minimal get-url functionality. -* Tutorial-Types:: Defining new foreign types. -* Tutorial-Conclusion:: What's next? -@end menu - - -@node Tutorial-Comparison, Tutorial-Getting a URL, Tutorial, Tutorial -@section What makes Lisp different - -The following sums up how bindings to foreign libraries are usually -implemented in other languages, then in Common Lisp: - -@table @asis -@item Perl, Python, Java, other one-implementation languages -@cindex @acronym{SWIG} -@cindex Perl -@cindex Python -Bindings are implemented as shared objects written in C. In some -cases, the C code is generated by a tool, such as @acronym{SWIG}, but -the result is the same: a new C library that manually translates -between the language implementation's objects, such as @code{PyObject} -in Python, and whatever C object is called for, often using C -functions provided by the implementation. It also translates between -the calling conventions of the language and C. - -@item Common Lisp -@cindex @acronym{SLIME} -Bindings are written in Lisp. They can be created at-will by Lisp -programs. Lisp programmers can write new bindings and add them to the -image, using a listener such as @acronym{SLIME}, as easily as with -regular Lisp definitions. The only foreign library to load is the one -being wrapped---the one with the pure C interface; no C or other -non-Lisp compilation is required. -@end table - -@cindex advantages of @acronym{FFI} -@cindex benefits of @acronym{FFI} -We believe the advantages of the Common Lisp approach far outweigh any -disadvantages. Incremental development with a listener can be as -productive for C binding development as it is with other Lisp -development. Keeping it ``in the [Lisp] family'', as it were, makes -it much easier for you and other Lisp programmers to load and use the -bindings. Common Lisp implementations such as @acronym{CMUCL}, freed -from having to provide a C interface to their own objects, are thus -freed to be implemented in another language (as @acronym{CMUCL} is) -while still allowing programmers to call foreign functions. - -@cindex minimal bindings -Perhaps the greatest advantage is that using an @acronym{FFI} doesn't -obligate you to become a professional binding developer. Writers of -bindings for other languages usually end up maintaining or failing to -maintain complete bindings to the foreign library. Using an -@acronym{FFI}, however, means if you only need one or two functions, -you can write bindings for only those functions, and be assured that -you can just as easily add to the bindings if need be. - -@cindex C abstractions -@cindex abstractions in C -The removal of the C compiler, or C interpretation of any kind, -creates the main disadvantage: some of C's ``abstractions'' are not -available, violating information encapsulation. For example, -@code{struct}s that must be passed on the stack, or used as return -values, without corresponding functional abstractions to create and -manage the @code{struct}s, must be declared explicitly in Lisp. This -is fine for structs whose contents are ``public'', but is not so -pleasant when a struct is supposed to be ``opaque'' by convention, -even though it is not so defined.@footnote{Admittedly, this is an -advanced issue, and we encourage you to leave this text until you are -more familiar with how @cffi{} works.} - -Without an abstraction to create the struct, Lisp needs to be able to -lay out the struct in memory, so must know its internal details. - -@cindex workaround for C -In these cases, you can create a minimal C library to provide the -missing abstractions, without destroying all the advantages of the -Common Lisp approach discussed above. In the case of @code{struct}s, -you can write simple, pure C functions that tell you how many bytes a -struct requires or allocate new structs, read and write fields of the -struct, or whatever operations are supposed to be -public.@footnote{This does not apply to structs whose contents are -intended to be part of the public library interface. In those cases, -a pure Lisp struct definition is always preferred. In fact, many -prefer to stay in Lisp and break the encapsulation anyway, placing the -burden of correct library interface definition on the library.} -@ref{The Groveller} automates this and other processes. - -Another disadvantage appears when you would rather use the foreign -language than Lisp. However, someone who prefers C to Lisp is not a -likely candidate for developing a Lisp interface to a C library. - - -@node Tutorial-Getting a URL, Tutorial-Loading, Tutorial-Comparison, Tutorial -@section Getting a @acronym{URL} - -@cindex c@acronym{URL} -The widely available @code{libcurl} is a library for downloading files -over protocols like @acronym{HTTP}. We will use @code{libcurl} with -@cffi{} to download a web page. - -Please note that there are many other ways to download files from the -web, not least the @sc{cl-curl} project to provide bindings to -@code{libcurl} via a similar @acronym{FFI}.@footnote{Specifically, -@acronym{UFFI}, an older @acronym{FFI} that takes a somewhat different -approach compared to @cffi{}. I believe that these days (December -2005) @cffi{} is more portable and actively developed, though not as -mature yet. Consensus in the free @sc{unix} Common Lisp community -seems to be that @cffi{} is preferred for new development, though -@acronym{UFFI} will likely go on for quite some time as many projects -already use it. @cffi{} includes the @code{UFFI-COMPAT} package for -complete compatibility with @acronym{UFFI}.} - -@uref{http://curl.haxx.se/libcurl/c/libcurl-tutorial.html,,libcurl-tutorial(3)} -is a tutorial for @code{libcurl} programming in C. We will follow -that to develop a binding to download a file. We will also use -@file{curl.h}, @file{easy.h}, and the @command{man} pages for the -@code{libcurl} function, all available in the @samp{curl-dev} package -or equivalent for your system, or in the c@acronym{URL} source code -package. If you have the development package, the headers should be -installed in @file{/usr/include/curl/}, and the @command{man} pages -may be accessed through your favorite @command{man} facility. - - -@node Tutorial-Loading, Tutorial-Initializing, Tutorial-Getting a URL, Tutorial -@section Loading foreign libraries - -@cindex loading @cffi{} -@cindex requiring @cffi{} -First of all, we will create a package to work in. You can save these -forms in a file, or just send them to the listener as they are. If -creating bindings for an @acronym{ASDF} package of yours, you will -want to add @code{:cffi} to the @code{:depends-on} list in your -@file{.asd} file. Otherwise, just use the @code{asdf:load-system} function to -load @cffi{}. - -@tutorialsource{Initialization} -@lisp -(asdf:load-system :cffi) - -;;; @lispcmt{Nothing special about the "CFFI-USER" package. We're just} -;;; @lispcmt{using it as a substitute for your own CL package.} -(defpackage :cffi-user - (:use :common-lisp :cffi)) - -(in-package :cffi-user) - -(define-foreign-library libcurl - (:darwin (:or "libcurl.3.dylib" "libcurl.dylib")) - (:unix (:or "libcurl.so.3" "libcurl.so")) - (t (:default "libcurl"))) - -(use-foreign-library libcurl) -@end lisp - -@cindex foreign library load -@cindex library, foreign -Using @code{define-foreign-library} and @code{use-foreign-library}, we -have loaded @code{libcurl} into Lisp, much as the linker does when you -start a C program, or @code{common-lisp:load} does with a Lisp source -file or @acronym{FASL} file. We special-cased for @sc{unix} machines -to always load a particular version, the one this tutorial was tested -with; for those who don't care, the @code{define-foreign-library} -clause @code{(t (:default "libcurl"))} should be satisfactory, and -will adapt to various operating systems. - - -@node Tutorial-Initializing, Tutorial-easy_setopt, Tutorial-Loading, Tutorial -@section Initializing @code{libcurl} - -@cindex function definition -After the introductory matter, the tutorial goes on to present the -first function you should use. - -@example -CURLcode curl_global_init(long flags); -@end example - -@noindent -Let's pick this apart into appropriate Lisp code: - -@tutorialsource{First CURLcode} -@lisp -;;; @lispcmt{A CURLcode is the universal error code. curl/curl.h says} -;;; @lispcmt{no return code will ever be removed, and new ones will be} -;;; @lispcmt{added to the end.} -(defctype curl-code :int) - -;;; @lispcmt{Initialize libcurl with FLAGS.} -(defcfun "curl_global_init" curl-code - (flags :long)) -@end lisp - -@impnote{By default, CFFI assumes the UNIX viewpoint that there is one -C symbol namespace, containing all symbols in all loaded objects. -This is not so on Windows and Darwin, but we emulate UNIX's behaviour -there. @ref{defcfun} for more details.} - -Note the parallels with the original C declaration. We've defined -@code{curl-code} as a wrapping type for @code{:int}; right now, it -only marks it as special, but later we will do something more -interesting with it. The point is that we don't have to do it yet. - -@cindex calling foreign functions -Looking at @file{curl.h}, @code{CURL_GLOBAL_NOTHING}, a possible value -for @code{flags} above, is defined as @samp{0}. So we can now call -the function: - -@example -@sc{cffi-user>} (curl-global-init 0) -@result{} 0 -@end example - -@cindex looks like it worked -Looking at @file{curl.h} again, @code{0} means @code{CURLE_OK}, so it -looks like the call succeeded. Note that @cffi{} converted the -function name to a Lisp-friendly name. You can specify your own name -if you want; use @code{("curl_global_init" @var{your-name-here})} as -the @var{name} argument to @code{defcfun}. - -The tutorial goes on to have us allocate a handle. For good measure, -we should also include the deallocator. Let's look at these -functions: - -@example -CURL *curl_easy_init( ); -void curl_easy_cleanup(CURL *handle); -@end example - -Advanced users may want to define special pointer types; we will -explore this possibility later. For now, just treat every pointer as -the same: - -@tutorialsource{curl_easy handles} -@lisp -(defcfun "curl_easy_init" :pointer) - -(defcfun "curl_easy_cleanup" :void - (easy-handle :pointer)) -@end lisp - -Now we can continue with the tutorial: - -@example -@sc{cffi-user>} (defparameter *easy-handle* (curl-easy-init)) -@result{} *EASY-HANDLE* -@sc{cffi-user>} *easy-handle* -@result{} # -@end example - -@cindex pointers in Lisp -Note the print representation of a pointer. It changes depending on -what Lisp you are using, but that doesn't make any difference to -@cffi{}. - - -@node Tutorial-easy_setopt, Tutorial-Abstraction, Tutorial-Initializing, Tutorial -@section Setting download options - -The @code{libcurl} tutorial says we'll want to set many options before -performing any download actions. This is done through -@code{curl_easy_setopt}: - -@c That is literally ..., not an ellipsis. -@example -CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...); -@end example - -@cindex varargs -@cindex foreign arguments -We've introduced a new twist: variable arguments. There is no obvious -translation to the @code{defcfun} form, particularly as there are four -possible argument types. Because of the way C works, we could define -four wrappers around @code{curl_easy_setopt}, one for each type; in -this case, however, we'll use the general-purpose macro -@code{foreign-funcall} to call this function. - -@cindex enumeration, C -To make things easier on ourselves, we'll create an enumeration of the -kinds of options we want to set. The @code{enum CURLoption} isn't the -most straightforward, but reading the @code{CINIT} C macro definition -should be enlightening. - -@tutorialsource{CURLoption enumeration} -@lisp -(defmacro define-curl-options (name type-offsets &rest enum-args) - "As with CFFI:DEFCENUM, except each of ENUM-ARGS is as follows: - - (NAME TYPE NUMBER) - -Where the arguments are as they are with the CINIT macro defined -in curl.h, except NAME is a keyword. - -TYPE-OFFSETS is a plist of TYPEs to their integer offsets, as -defined by the CURLOPTTYPE_LONG et al constants in curl.h." - (flet ((enumerated-value (type offset) - (+ (getf type-offsets type) offset))) - `(progn - (defcenum ,name - ,@@(loop for (name type number) in enum-args - collect (list name (enumerated-value type number)))) - ',name))) ;@lispcmt{for REPL users' sanity} - -(define-curl-options curl-option - (long 0 objectpoint 10000 functionpoint 20000 off-t 30000) - (:noprogress long 43) - (:nosignal long 99) - (:errorbuffer objectpoint 10) - (:url objectpoint 2)) -@end lisp - -With some well-placed Emacs @code{query-replace-regexp}s, you could -probably similarly define the entire @code{CURLoption} enumeration. I -have selected to transcribe a few that we will use in this tutorial. - -If you're having trouble following the macrology, just macroexpand the -@code{curl-option} definition, or see the following macroexpansion, -conveniently downcased and reformatted: - -@tutorialsource{DEFINE-CURL-OPTIONS macroexpansion} -@lisp -(progn - (defcenum curl-option - (:noprogress 43) - (:nosignal 99) - (:errorbuffer 10010) - (:url 10002)) - 'curl-option) -@end lisp - -@noindent -That seems more than reasonable. You may notice that we only use the -@var{type} to compute the real enumeration offset; we will also need -the type information later. - -First, however, let's make sure a simple call to the foreign function -works: - -@example -@sc{cffi-user>} (foreign-funcall "curl_easy_setopt" - :pointer *easy-handle* - curl-option :nosignal :long 1 curl-code) -@result{} 0 -@end example - -@code{foreign-funcall}, despite its surface simplicity, can be used to -call any C function. Its first argument is a string, naming the -function to be called. Next, for each argument, we pass the name of -the C type, which is the same as in @code{defcfun}, followed by a Lisp -object representing the data to be passed as the argument. The final -argument is the return type, for which we use the @code{curl-code} -type defined earlier. - -@code{defcfun} just puts a convenient fa@,cade on -@code{foreign-funcall}.@footnote{This isn't entirely true; some Lisps -don't support @code{foreign-funcall}, so @code{defcfun} is implemented -without it. @code{defcfun} may also perform optimizations that -@code{foreign-funcall} cannot.} Our earlier call to -@code{curl-global-init} could have been written as follows: - -@example -@sc{cffi-user>} (foreign-funcall "curl_global_init" :long 0 - curl-code) -@result{} 0 -@end example - -Before we continue, we will take a look at what @cffi{} can and can't -do, and why this is so. - - -@node Tutorial-Abstraction, Tutorial-Lisp easy_setopt, Tutorial-easy_setopt, Tutorial -@section Breaking the abstraction - -@cindex breaking the abstraction -@cindex abstraction breaking -In @ref{Tutorial-Comparison,, What makes Lisp different}, we mentioned -that writing an @acronym{FFI} sometimes requires depending on -information not provided as part of the interface. The easy option -@code{CURLOPT_WRITEDATA}, which we will not provide as part of the -Lisp interface, illustrates this issue. - -Strictly speaking, the @code{curl-option} enumeration is not -necessary; we could have used @code{:int 99} instead of -@code{curl-option :nosignal} in our call to @code{curl_easy_setopt} -above. We defined it anyway, in part to hide the fact that we are -breaking the abstraction that the C @code{enum} provides. If the -c@acronym{URL} developers decide to change those numbers later, we -must change the Lisp enumeration, because enumeration values are not -provided in the compiled C library, @code{libcurl.so.3}. - -@cffi{} works because the most useful things in C libraries --- -non-static functions and non-static variables --- are included -accessibly in @code{libcurl.so.3}. A C compiler that violated this -would be considered a worthless compiler. - -The other thing @code{define-curl-options} does is give the ``type'' -of the third argument passed to @code{curl_easy_setopt}. Using this -information, we can tell that the @code{:nosignal} option should -accept a long integer argument. We can implicitly assume @code{t} -@equiv{} 1 and @code{nil} @equiv{} 0, as it is in C, which takes care -of the fact that @code{CURLOPT_NOSIGNAL} is really asking for a -boolean. - -The ``type'' of @code{CURLOPT_WRITEDATA} is @code{objectpoint}. -However, it is really looking for a @code{FILE*}. -@code{CURLOPT_ERRORBUFFER} is looking for a @code{char*}, so there is -no obvious @cffi{} type but @code{:pointer}. - -The first thing to note is that nowhere in the C interface includes -this information; it can only be found in the manual. We could -disjoin these clearly different types ourselves, by splitting -@code{objectpoint} into @code{filepoint} and @code{charpoint}, but we -are still breaking the abstraction, because we have to augment the -entire enumeration form with this additional -information.@footnote{Another possibility is to allow the caller to -specify the desired C type of the third argument. This is essentially -what happens in a call to the function written in C.} - -@cindex streams and C -@cindex @sc{file}* and streams -The second is that the @code{CURLOPT_WRITEDATA} argument is completely -incompatible with the desired Lisp data, a -stream.@footnote{@xref{Other Kinds of Streams,,, libc, GNU C Library -Reference}, for a @acronym{GNU}-only way to extend the @code{FILE*} -type. You could use this to convert Lisp streams to the needed C -data. This would be quite involved and far outside the scope of this -tutorial.} It is probably acceptable if we are controlling every file -we might want to use as this argument, in which case we can just call -the foreign function @code{fopen}. Regardless, though, we can't write -to arbitrary streams, which is exactly what we want to do for this -application. - -Finally, note that the @code{curl_easy_setopt} interface itself is a -hack, intended to work around some of the drawbacks of C. The -definition of @code{Curl_setopt}, while long, is far less cluttered -than the equivalent disjoint-function set would be; in addition, -setting a new option in an old @code{libcurl} can generate a run-time -error rather than breaking the compile. Lisp can just as concisely -generate functions as compare values, and the ``undefined function'' -error is just as useful as any explicit error we could define here -might be. - - -@node Tutorial-Lisp easy_setopt, Tutorial-Memory, Tutorial-Abstraction, Tutorial -@section Option functions in Lisp - -We could use @code{foreign-funcall} directly every time we wanted to -call @code{curl_easy_setopt}. However, we can encapsulate some of the -necessary information with the following. - -@lisp -;;; @lispcmt{We will use this type later in a more creative way. For} -;;; @lispcmt{now, just consider it a marker that this isn't just any} -;;; @lispcmt{pointer.} -(defctype easy-handle :pointer) - -(defmacro curl-easy-setopt (easy-handle enumerated-name - value-type new-value) - "Call `curl_easy_setopt' on EASY-HANDLE, using ENUMERATED-NAME -as the OPTION. VALUE-TYPE is the CFFI foreign type of the third -argument, and NEW-VALUE is the Lisp data to be translated to the -third argument. VALUE-TYPE is not evaluated." - `(foreign-funcall "curl_easy_setopt" easy-handle ,easy-handle - curl-option ,enumerated-name - ,value-type ,new-value curl-code)) -@end lisp - -Now we define a function for each kind of argument that encodes the -correct @code{value-type} in the above. This can be done reasonably -in the @code{define-curl-options} macroexpansion; after all, that is -where the different options are listed! - -@cindex Lispy C functions -We could make @code{cl:defun} forms in the expansion that simply call -@code{curl-easy-setopt}; however, it is probably easier and clearer to -use @code{defcfun}. @code{define-curl-options} was becoming unwieldy, -so I defined some helpers in this new definition. - -@smalllisp -(defun curry-curl-option-setter (function-name option-keyword) - "Wrap the function named by FUNCTION-NAME with a version that -curries the second argument as OPTION-KEYWORD. - -This function is intended for use in DEFINE-CURL-OPTION-SETTER." - (setf (symbol-function function-name) - (let ((c-function (symbol-function function-name))) - (lambda (easy-handle new-value) - (funcall c-function easy-handle option-keyword - new-value))))) - -(defmacro define-curl-option-setter (name option-type - option-value foreign-type) - "Define (with DEFCFUN) a function NAME that calls -curl_easy_setopt. OPTION-TYPE and OPTION-VALUE are the CFFI -foreign type and value to be passed as the second argument to -easy_setopt, and FOREIGN-TYPE is the CFFI foreign type to be used -for the resultant function's third argument. - -This macro is intended for use in DEFINE-CURL-OPTIONS." - `(progn - (defcfun ("curl_easy_setopt" ,name) curl-code - (easy-handle easy-handle) - (option ,option-type) - (new-value ,foreign-type)) - (curry-curl-option-setter ',name ',option-value))) - -(defmacro define-curl-options (type-name type-offsets &rest enum-args) - "As with CFFI:DEFCENUM, except each of ENUM-ARGS is as follows: - - (NAME TYPE NUMBER) - -Where the arguments are as they are with the CINIT macro defined -in curl.h, except NAME is a keyword. - -TYPE-OFFSETS is a plist of TYPEs to their integer offsets, as -defined by the CURLOPTTYPE_LONG et al constants in curl.h. - -Also, define functions for each option named -set-`TYPE-NAME'-`OPTION-NAME', where OPTION-NAME is the NAME from -the above destructuring." - (flet ((enumerated-value (type offset) - (+ (getf type-offsets type) offset)) - ;; @lispcmt{map PROCEDURE, destructuring each of ENUM-ARGS} - (map-enum-args (procedure) - (mapcar (lambda (arg) (apply procedure arg)) enum-args)) - ;; @lispcmt{build a name like SET-CURL-OPTION-NOSIGNAL} - (make-setter-name (option-name) - (intern (concatenate - 'string "SET-" (symbol-name type-name) - "-" (symbol-name option-name))))) - `(progn - (defcenum ,type-name - ,@@(map-enum-args - (lambda (name type number) - (list name (enumerated-value type number))))) - ,@@(map-enum-args - (lambda (name type number) - (declare (ignore number)) - `(define-curl-option-setter ,(make-setter-name name) - ,type-name ,name ,(ecase type - (long :long) - (objectpoint :pointer) - (functionpoint :pointer) - (off-t :long))))) - ',type-name))) -@end smalllisp - -@noindent -Macroexpanding our @code{define-curl-options} form once more, we -see something different: - -@lisp -(progn - (defcenum curl-option - (:noprogress 43) - (:nosignal 99) - (:errorbuffer 10010) - (:url 10002)) - (define-curl-option-setter set-curl-option-noprogress - curl-option :noprogress :long) - (define-curl-option-setter set-curl-option-nosignal - curl-option :nosignal :long) - (define-curl-option-setter set-curl-option-errorbuffer - curl-option :errorbuffer :pointer) - (define-curl-option-setter set-curl-option-url - curl-option :url :pointer) - 'curl-option) -@end lisp - -@noindent -Macroexpanding one of the new @code{define-curl-option-setter} -forms yields the following: - -@lisp -(progn - (defcfun ("curl_easy_setopt" set-curl-option-nosignal) curl-code - (easy-handle easy-handle) - (option curl-option) - (new-value :long)) - (curry-curl-option-setter 'set-curl-option-nosignal ':nosignal)) -@end lisp - -@noindent -Finally, let's try this out: - -@example -@sc{cffi-user>} (set-curl-option-nosignal *easy-handle* 1) -@result{} 0 -@end example - -@noindent -Looks like it works just as well. This interface is now reasonably -high-level to wash out some of the ugliness of the thinnest possible -@code{curl_easy_setopt} @acronym{FFI}, without obscuring the remaining -C bookkeeping details we will explore. - - -@node Tutorial-Memory, Tutorial-Callbacks, Tutorial-Lisp easy_setopt, Tutorial -@section Memory management - -According to the documentation for @code{curl_easy_setopt}, the type -of the third argument when @var{option} is @code{CURLOPT_ERRORBUFFER} -is @code{char*}. Above, we've defined -@code{set-curl-option-errorbuffer} to accept a @code{:pointer} as the -new option value. However, there is a @cffi{} type @code{:string}, -which translates Lisp strings to C strings when passed as arguments to -foreign function calls. Why not, then, use @code{:string} as the -@cffi{} type of the third argument? There are two reasons, both -related to the necessity of breaking abstraction described in -@ref{Tutorial-Abstraction,, Breaking the abstraction}. - -The first reason also applies to @code{CURLOPT_URL}, which we will use -to illustrate the point. Assuming we have changed the type of the -third argument underlying @code{set-curl-option-url} to -@code{:string}, look at these two equivalent forms. - -@lisp -(set-curl-option-url *easy-handle* "http://www.cliki.net/CFFI") - -@equiv{} (with-foreign-string (url "http://www.cliki.net/CFFI") - (foreign-funcall "curl_easy_setopt" easy-handle *easy-handle* - curl-option :url :pointer url curl-code)) -@end lisp - -@noindent -The latter, in fact, is mostly equivalent to what a foreign function -call's macroexpansion actually does. As you can see, the Lisp string -@code{"@clikicffi{}"} is copied into a @code{char} array and -null-terminated; the pointer to beginning of this array, now a C -string, is passed as a @cffi{} @code{:pointer} to the foreign -function. - -@cindex dynamic extent -@cindex foreign values with dynamic extent -Unfortunately, the C abstraction has failed us, and we must break it. -While @code{:string} works well for many @code{char*} arguments, it -does not for cases like this. As the @code{curl_easy_setopt} -documentation explains, ``The string must remain present until curl no -longer needs it, as it doesn't copy the string.'' The C string -created by @code{with-foreign-string}, however, only has dynamic -extent: it is ``deallocated'' when the body (above containing the -@code{foreign-funcall} form) exits. - -@cindex premature deallocation -If we are supposed to keep the C string around, but it goes away, what -happens when some @code{libcurl} function tries to access the -@acronym{URL} string? We have reentered the dreaded world of C -``undefined behavior''. In some Lisps, it will probably get a chunk -of the Lisp/C stack. You may segfault. You may get some random piece -of other data from the heap. Maybe, in a world where ``dynamic -extent'' is defined to be ``infinite extent'', everything will turn -out fine. Regardless, results are likely to be almost universally -unpleasant.@footnote{``@i{But I thought Lisp was supposed to protect -me from all that buggy C crap!}'' Before asking a question like that, -remember that you are a stranger in a foreign land, whose residents -have a completely different set of values.} - -Returning to the current @code{set-curl-option-url} interface, here is -what we must do: - -@lisp -(let (easy-handle) - (unwind-protect - (with-foreign-string (url "http://www.cliki.net/CFFI") - (setf easy-handle (curl-easy-init)) - (set-curl-option-url easy-handle url) - #|@lispcmt{do more with the easy-handle, like actually get the URL}|#) - (when easy-handle - (curl-easy-cleanup easy-handle)))) -@end lisp - -@c old comment to luis: I go on to say that this isn't obviously -@c extensible to new option settings that require C strings to stick -@c around, as it would involve re-evaluating the unwind-protect form -@c with more dynamic memory allocation. So I plan to show how to -@c write something similar to ObjC's NSAutoreleasePool, to be managed -@c with a simple unwind-protect form. - -@noindent -That is fine for the single string defined here, but for every string -option we want to pass, we have to surround the body of -@code{with-foreign-string} with another @code{with-foreign-string} -wrapper, or else do some extremely error-prone pointer manipulation -and size calculation in advance. We could alleviate some of the pain -with a recursively expanding macro, but this would not remove the need -to modify the block every time we want to add an option, anathema as -it is to a modular interface. - -Before modifying the code to account for this case, consider the other -reason we can't simply use @code{:string} as the foreign type. In C, -a @code{char *} is a @code{char *}, not necessarily a string. The -option @code{CURLOPT_ERRORBUFFER} accepts a @code{char *}, but does -not expect anything about the data there. However, it does expect -that some @code{libcurl} function we call later can write a C string -of up to 255 characters there. We, the callers of the function, are -expected to read the C string at a later time, exactly the opposite of -what @code{:string} implies. - -With the semantics for an input string in mind --- namely, that the -string should be kept around until we @code{curl_easy_cleanup} the -easy handle --- we are ready to extend the Lisp interface: - -@lisp -(defvar *easy-handle-cstrings* (make-hash-table) - "Hashtable of easy handles to lists of C strings that may be -safely freed after the handle is freed.") - -(defun make-easy-handle () - "Answer a new CURL easy interface handle, to which the lifetime -of C strings may be tied. See `add-curl-handle-cstring'." - (let ((easy-handle (curl-easy-init))) - (setf (gethash easy-handle *easy-handle-cstrings*) '()) - easy-handle)) - -(defun free-easy-handle (handle) - "Free CURL easy interface HANDLE and any C strings created to -be its options." - (curl-easy-cleanup handle) - (mapc #'foreign-string-free - (gethash handle *easy-handle-cstrings*)) - (remhash handle *easy-handle-cstrings*)) - -(defun add-curl-handle-cstring (handle cstring) - "Add CSTRING to be freed when HANDLE is, answering CSTRING." - (car (push cstring (gethash handle *easy-handle-cstrings*)))) -@end lisp - -@noindent -Here we have redefined the interface to create and free handles, to -associate a list of allocated C strings with each handle while it -exists. The strategy of using different function names to wrap around -simple foreign functions is more common than the solution implemented -earlier with @code{curry-curl-option-setter}, which was to modify the -function name's function slot.@footnote{There are advantages and -disadvantages to each approach; I chose to @code{(setf -symbol-function)} earlier because it entailed generating fewer magic -function names.} - -Incidentally, the next step is to redefine -@code{curry-curl-option-setter} to allocate C strings for the -appropriate length of time, given a Lisp string as the -@code{new-value} argument: - -@lisp -(defun curry-curl-option-setter (function-name option-keyword) - "Wrap the function named by FUNCTION-NAME with a version that -curries the second argument as OPTION-KEYWORD. - -This function is intended for use in DEFINE-CURL-OPTION-SETTER." - (setf (symbol-function function-name) - (let ((c-function (symbol-function function-name))) - (lambda (easy-handle new-value) - (funcall c-function easy-handle option-keyword - (if (stringp new-value) - (add-curl-handle-cstring - easy-handle - (foreign-string-alloc new-value)) - new-value)))))) -@end lisp - -@noindent -A quick analysis of the code shows that you need only reevaluate the -@code{curl-option} enumeration definition to take advantage of these -new semantics. Now, for good measure, let's reallocate the handle -with the new functions we just defined, and set its @acronym{URL}: - -@example -@sc{cffi-user>} (curl-easy-cleanup *easy-handle*) -@result{} NIL -@sc{cffi-user>} (setf *easy-handle* (make-easy-handle)) -@result{} # -@sc{cffi-user>} (set-curl-option-nosignal *easy-handle* 1) -@result{} 0 -@sc{cffi-user>} (set-curl-option-url *easy-handle* - "http://www.cliki.net/CFFI") -@result{} 0 -@end example - -@cindex strings -For fun, let's inspect the Lisp value of the C string that was created -to hold @code{"@clikicffi{}"}. By virtue of the implementation of -@code{add-curl-handle-cstring}, it should be accessible through the -hash table defined: - -@example -@sc{cffi-user>} (foreign-string-to-lisp - (car (gethash *easy-handle* *easy-handle-cstrings*))) -@result{} "http://www.cliki.net/CFFI" -@end example - -@noindent -Looks like that worked, and @code{libcurl} now knows what -@acronym{URL} we want to retrieve. - -Finally, we turn back to the @code{:errorbuffer} option mentioned at -the beginning of this section. Whereas the abstraction added to -support string inputs works fine for cases like @code{CURLOPT_URL}, it -hides the detail of keeping the C string; for @code{:errorbuffer}, -however, we need that C string. - -In a moment, we'll define something slightly cleaner, but for now, -remember that you can always hack around anything. We're modifying -handle creation, so make sure you free the old handle before -redefining @code{free-easy-handle}. - -@smalllisp -(defvar *easy-handle-errorbuffers* (make-hash-table) - "Hashtable of easy handles to C strings serving as error -writeback buffers.") - -;;; @lispcmt{An extra byte is very little to pay for peace of mind.} -(defparameter *curl-error-size* 257 - "Minimum char[] size used by cURL to report errors.") - -(defun make-easy-handle () - "Answer a new CURL easy interface handle, to which the lifetime -of C strings may be tied. See `add-curl-handle-cstring'." - (let ((easy-handle (curl-easy-init))) - (setf (gethash easy-handle *easy-handle-cstrings*) '()) - (setf (gethash easy-handle *easy-handle-errorbuffers*) - (foreign-alloc :char :count *curl-error-size* - :initial-element 0)) - easy-handle)) - -(defun free-easy-handle (handle) - "Free CURL easy interface HANDLE and any C strings created to -be its options." - (curl-easy-cleanup handle) - (foreign-free (gethash handle *easy-handle-errorbuffers*)) - (remhash handle *easy-handle-errorbuffers*) - (mapc #'foreign-string-free - (gethash handle *easy-handle-cstrings*)) - (remhash handle *easy-handle-cstrings*)) - -(defun get-easy-handle-error (handle) - "Answer a string containing HANDLE's current error message." - (foreign-string-to-lisp - (gethash handle *easy-handle-errorbuffers*))) -@end smalllisp - -Be sure to once again set the options we've set thus far. You may -wish to define yet another wrapper function to do this. - - -@node Tutorial-Callbacks, Tutorial-Completion, Tutorial-Memory, Tutorial -@section Calling Lisp from C - -If you have been reading -@uref{http://curl.haxx.se/libcurl/c/curl_easy_setopt.html,, -@code{curl_easy_setopt(3)}}, you should have noticed that some options -accept a function pointer. In particular, we need one function -pointer to set as @code{CURLOPT_WRITEFUNCTION}, to be called by -@code{libcurl} rather than the reverse, in order to receive data as it -is downloaded. - -A binding writer without the aid of @acronym{FFI} usually approaches -this problem by writing a C function that accepts C data, converts to -the language's internal objects, and calls the callback provided by -the user, again in a reverse of usual practices. - -The @cffi{} approach to callbacks precisely mirrors its differences -with the non-@acronym{FFI} approach on the ``calling C from Lisp'' -side, which we have dealt with exclusively up to now. That is, you -define a callback function in Lisp using @code{defcallback}, and -@cffi{} effectively creates a C function to be passed as a function -pointer. - -@impnote{This is much trickier than calling C functions from Lisp, as -it literally involves somehow generating a new C function that is as -good as any created by the compiler. Therefore, not all Lisps support -them. @xref{Implementation Support}, for information about @cffi{} -support issues in this and other areas. You may want to consider -changing to a Lisp that supports callbacks in order to continue with -this tutorial.} - -@cindex callback definition -@cindex defining callbacks -Defining a callback is very similar to defining a callout; the main -difference is that we must provide some Lisp forms to be evaluated as -part of the callback. Here is the signature for the function the -@code{:writefunction} option takes: - -@example -size_t -@var{function}(void *ptr, size_t size, size_t nmemb, void *stream); -@end example - -@impnote{size_t is almost always an unsigned int. You can get this -and many other types using feature tests for your system by using -cffi-grovel.} - -The above signature trivially translates into a @cffi{} -@code{defcallback} form, as follows. - -@lisp -;;; @lispcmt{Alias in case size_t changes.} -(defctype size :unsigned-int) - -;;; @lispcmt{To be set as the CURLOPT_WRITEFUNCTION of every easy handle.} -(defcallback easy-write size ((ptr :pointer) (size size) - (nmemb size) (stream :pointer)) - (let ((data-size (* size nmemb))) - (handler-case - ;; @lispcmt{We use the dynamically-bound *easy-write-procedure* to} - ;; @lispcmt{call a closure with useful lexical context.} - (progn (funcall (symbol-value '*easy-write-procedure*) - (foreign-string-to-lisp ptr :count data-size)) - data-size) ;@lispcmt{indicates success} - ;; @lispcmt{The WRITEFUNCTION should return something other than the} - ;; @lispcmt{#bytes available to signal an error.} - (error () (if (zerop data-size) 1 0))))) -@end lisp - -First, note the correlation of the first few forms, used to declare -the C function's signature, with the signature in C syntax. We -provide a Lisp name for the function, its return type, and a name and -type for each argument. - -In the body, we call the dynamically-bound -@code{*easy-write-procedure*} with a ``finished'' translation, of -pulling together the raw data and size into a Lisp string, rather than -deal with the data directly. As part of calling -@code{curl_easy_perform} later, we'll bind that variable to a closure -with more useful lexical bindings than the top-level -@code{defcallback} form. - -Finally, we make a halfhearted effort to prevent non-local exits from -unwinding the C stack, covering the most likely case with an -@code{error} handler, which is usually triggered -unexpectedly.@footnote{Unfortunately, we can't protect against -@emph{all} non-local exits, such as @code{return}s and @code{throw}s, -because @code{unwind-protect} cannot be used to ``short-circuit'' a -non-local exit in Common Lisp, due to proposal @code{minimal} in -@uref{http://www.lisp.org/HyperSpec/Issues/iss152-writeup.html, -@acronym{ANSI} issue @sc{Exit-Extent}}. Furthermore, binding an -@code{error} handler prevents higher-up code from invoking restarts -that may be provided under the callback's dynamic context. Such is -the way of compromise.} The reason is that most C code is written to -understand its own idiosyncratic error condition, implemented above in -the case of @code{curl_easy_perform}, and more ``undefined behavior'' -can result if we just wipe C stack frames without allowing them to -execute whatever cleanup actions as they like. - -Using the @code{CURLoption} enumeration in @file{curl.h} once more, we -can describe the new option by modifying and reevaluating -@code{define-curl-options}. - -@lisp -(define-curl-options curl-option - (long 0 objectpoint 10000 functionpoint 20000 off-t 30000) - (:noprogress long 43) - (:nosignal long 99) - (:errorbuffer objectpoint 10) - (:url objectpoint 2) - (:writefunction functionpoint 11)) ;@lispcmt{new item here} -@end lisp - -Finally, we can use the defined callback and the new -@code{set-curl-option-writefunction} to finish configuring the easy -handle, using the @code{callback} macro to retrieve a @cffi{} -@code{:pointer}, which works like a function pointer in C code. - -@example -@sc{cffi-user>} (set-curl-option-writefunction - *easy-handle* (callback easy-write)) -@result{} 0 -@end example - - -@node Tutorial-Completion, Tutorial-Types, Tutorial-Callbacks, Tutorial -@section A complete @acronym{FFI}? - -@c TeX goes insane on @uref{@clikicffi{}} - -With all options finally set and a medium-level interface developed, -we can finish the definition and retrieve -@uref{http://www.cliki.net/CFFI}, as is done in the tutorial. - -@lisp -(defcfun "curl_easy_perform" curl-code - (handle easy-handle)) -@end lisp - -@example -@sc{cffi-user>} (with-output-to-string (contents) - (let ((*easy-write-procedure* - (lambda (string) - (write-string string contents)))) - (declare (special *easy-write-procedure*)) - (curl-easy-perform *easy-handle*))) -@result{} " -" -@end example - -Of course, that itself is slightly unwieldy, so you may want to define -a function around it that simply retrieves a @acronym{URL}. I will -leave synthesis of all the relevant @acronym{REPL} forms presented -thus far into a single function as an exercise for the reader. - -The remaining sections of this tutorial explore some advanced features -of @cffi{}; the definition of new types will receive special -attention. Some of these features are essential for particular -foreign function calls; some are very helpful when trying to develop a -Lispy interface to C. - - -@node Tutorial-Types, Tutorial-Conclusion, Tutorial-Completion, Tutorial -@section Defining new types - -We've occasionally used the @code{defctype} macro in previous sections -as a kind of documentation, much what you'd use @code{typedef} for in -C. We also tried one special kind of type definition, the -@code{defcenum} type. @xref{defcstruct}, for a definition macro that -may come in handy if you need to use C @code{struct}s as data. - -@cindex type definition -@cindex data in Lisp and C -@cindex translating types -However, all of these are mostly sugar for the powerful underlying -foreign type interface called @dfn{type translators}. You can easily -define new translators for any simple named foreign type. Since we've -defined the new type @code{curl-code} to use as the return type for -various @code{libcurl} functions, we can use that to directly convert -c@acronym{URL} errors to Lisp errors. - -@code{defctype}'s purpose is to define simple @code{typedef}-like -aliases. In order to use @dfn{type translators} we must use the -@code{define-foreign-type} macro. So let's redefine @code{curl-code} -using it. - -@lisp -(define-foreign-type curl-code-type () - () - (:actual-type :int) - (:simple-parser curl-code)) -@end lisp - -@code{define-foreign-type} is a thin wrapper around @code{defclass}. -For now, all you need to know in the context of this example is that -it does what @code{(defctype curl-code :int)} would do and, -additionally, defines a new class @code{curl-code-type} which we will -take advantage of shortly. - -The @code{CURLcode} enumeration seems to follow the typical error code -convention of @samp{0} meaning all is well, and each non-zero integer -indicating a different kind of error. We can apply that trivially to -differentiate between normal exits and error exits. - -@lisp -(define-condition curl-code-error (error) - (($code :initarg :curl-code :reader curl-error-code)) - (:report (lambda (c stream) - (format stream "libcurl function returned error ~A" - (curl-error-code c)))) - (:documentation "Signalled when a libcurl function answers -a code other than CURLE_OK.")) - -(defmethod translate-from-foreign (value (type curl-code-type)) - "Raise a CURL-CODE-ERROR if VALUE, a curl-code, is non-zero." - (if (zerop value) - :curle-ok - (error 'curl-code-error :curl-code value))) -@end lisp - -@noindent -The heart of this translator is new method -@code{translate-from-foreign}. By specializing the @var{type} -parameter on @code{curl-code-type}, we immediately modify the behavior -of every function that returns a @code{curl-code} to pass the result -through this new method. - -To see the translator in action, try invoking a function that returns -a @code{curl-code}. You need to reevaluate the respective -@code{defcfun} form so that it picks up the new @code{curl-code} -definition. - -@example -@sc{cffi-user>} (set-curl-option-nosignal *easy-handle* 1) -@result{} :CURLE-OK -@end example - -@noindent -As the result was @samp{0}, the new method returned @code{:curle-ok}, -just as specified.@footnote{It might be better to return -@code{(values)} than @code{:curle-ok} in real code, but this is good -for illustration.} I will leave disjoining the separate -@code{CURLcode}s into condition types and improving the @code{:report} -function as an exercise for you. - -The creation of @code{*easy-handle-cstrings*} and -@code{*easy-handle-errorbuffers*} as properties of @code{easy-handle}s -is a kluge. What we really want is a Lisp structure that stores these -properties along with the C pointer. Unfortunately, -@code{easy-handle} is currently just a fancy name for the foreign type -@code{:pointer}; the actual pointer object varies from Common Lisp -implementation to implementation, needing only to satisfy -@code{pointerp} and be returned from @code{make-pointer} and friends. - -One solution that would allow us to define a new Lisp structure to -represent @code{easy-handle}s would be to write a wrapper around every -function that currently takes an @code{easy-handle}; the wrapper would -extract the pointer and pass it to the foreign function. However, we -can use type translators to more elegantly integrate this -``translation'' into the foreign function calling framework, using -@code{translate-to-foreign}. - -@smalllisp -(defclass easy-handle () - ((pointer :initform (curl-easy-init) - :documentation "Foreign pointer from curl_easy_init") - (error-buffer - :initform (foreign-alloc :char :count *curl-error-size* - :initial-element 0) - :documentation "C string describing last error") - (c-strings :initform '() - :documentation "C strings set as options")) - (:documentation "I am a parameterization you may pass to -curl-easy-perform to perform a cURL network protocol request.")) - -(defmethod initialize-instance :after ((self easy-handle) &key) - (set-curl-option-errorbuffer self (slot-value self 'error-buffer))) - -(defun add-curl-handle-cstring (handle cstring) - "Add CSTRING to be freed when HANDLE is, answering CSTRING." - (car (push cstring (slot-value handle 'c-strings)))) - -(defun get-easy-handle-error (handle) - "Answer a string containing HANDLE's current error message." - (foreign-string-to-lisp - (slot-value handle 'error-buffer))) - -(defun free-easy-handle (handle) - "Free CURL easy interface HANDLE and any C strings created to -be its options." - (with-slots (pointer error-buffer c-strings) handle - (curl-easy-cleanup pointer) - (foreign-free error-buffer) - (mapc #'foreign-string-free c-strings))) - -(define-foreign-type easy-handle-type () - () - (:actual-type :pointer) - (:simple-parser easy-handle)) - -(defmethod translate-to-foreign (handle (type easy-handle-type)) - "Extract the pointer from an easy-HANDLE." - (slot-value handle 'pointer)) -@end smalllisp - -While we changed some of the Lisp functions defined earlier to use -@acronym{CLOS} slots rather than hash tables, the foreign functions -work just as well as they did before. - -@cindex limitations of type translators -The greatest strength, and the greatest limitation, of the type -translator comes from its generalized interface. As stated -previously, we could define all foreign function calls in terms of the -primitive foreign types provided by @cffi{}. The type translator -interface allows us to cleanly specify the relationship between Lisp -and C data, independent of where it appears in a function call. This -independence comes at a price; for example, it cannot be used to -modify translation semantics based on other arguments to a function -call. In these cases, you should rely on other features of Lisp, -rather than the powerful, yet domain-specific, type translator -interface. - - -@node Tutorial-Conclusion, , Tutorial-Types, Tutorial -@section What's next? - -@cffi{} provides a rich and powerful foundation for communicating with -foreign libraries; as we have seen, it is up to you to make that -experience a pleasantly Lispy one. This tutorial does not cover all -the features of @cffi{}; please see the rest of the manual for -details. In particular, if something seems obviously missing, it is -likely that either code or a good reason for lack of code is already -present. - -@impnote{There are some other things in @cffi{} that might deserve -tutorial sections, such as free-translated-object, or structs. Let us -know which ones you care about.} - - -@c =================================================================== -@c CHAPTER: Wrapper generators - -@node Wrapper generators, Foreign Types, Tutorial, Top -@chapter Wrapper generators - -@cffi{}'s interface is designed for human programmers, being aimed at -aesthetic as well as technical sophistication. However, there are a -few programs aimed at translating C and C++ header files, or -approximations thereof, into @cffi{} forms constituting a foreign -interface to the symbols in those files. - -These wrapper generators are known to support output of @cffi{} forms. - -@table @asis -@item @uref{http://www.cliki.net/Verrazano,Verrazano} -Designed specifically for Common Lisp. Uses @acronym{GCC}'s parser -output in @acronym{XML} format to discover functions, variables, and -other header file data. This means you need @acronym{GCC} to generate -forms; on the other hand, the parser employed is mostly compliant with -@acronym{ANSI} C. - -@item @uref{http://www.cliki.net/SWIG,SWIG} -A foreign interface generator originally designed to generate Python -bindings, it has been ported to many other systems, including @cffi{} -in version 1.3.28. Includes its own C declaration munger, not -intended to be fully-compliant with @acronym{ANSI} C. -@end table - -First, this manual does not describe use of these other programs; they -have documentation of their own. If you have problems using a -generated interface, please look at the output @cffi{} forms and -verify that they are a correct @cffi{} interface to the library in -question; if they are correct, contact @cffi{} developers with -details, keeping in mind that they communicate in terms of those forms -rather than any particular wrapper generator. Otherwise, contact the -maintainers of the wrapper generator you are using, provided you can -reasonably expect more accuracy from the generator. - -When is more accuracy an unreasonable expectation? As described in -the tutorial (@pxref{Tutorial-Abstraction,, Breaking the -abstraction}), the information in C declarations is insufficient to -completely describe every interface. In fact, it is quite common to -run into an interface that cannot be handled automatically, and -generators should be excused from generating a complete interface in -these cases. - -As further described in the tutorial, the thinnest Lisp interface to a -C function is not always the most pleasant one. In many cases, you -will want to manually write a Lispier interface to the C functions -that interest you. - -Wrapper generators should be treated as time-savers, not complete -automation of the full foreign interface writing job. Reports of the -amount of work done by generators vary from 30% to 90%. The -incremental development style enabled by @cffi{} generally reduces -this proportion below that for languages like Python. - -@c Where I got the above 30-90% figures: -@c 30%: lemonodor's post about SWIG -@c 90%: Balooga on #lisp. He said 99%, but that's probably an -@c exaggeration (leave it to me to pass judgement :) -@c -stephen - - -@c =================================================================== -@c CHAPTER: Foreign Types - -@node Foreign Types, Pointers, Wrapper generators, Top -@chapter Foreign Types - -Foreign types describe how data is translated back and forth between C -and Lisp. @cffi{} provides various built-in types and allows the user to -define new types. - -@menu -* Built-In Types:: -* Other Types:: -* Defining Foreign Types:: -* Foreign Type Translators:: -* Optimizing Type Translators:: -* Foreign Structure Types:: -* Allocating Foreign Objects:: - -Dictionary - -* convert-from-foreign:: -* convert-to-foreign:: -* defbitfield:: -* defcstruct:: -* defcunion:: -* defctype:: -* defcenum:: -@c * define-type-spec-parser:: -* define-foreign-type:: -* define-parse-method:: -@c * explain-foreign-slot-value: -* foreign-bitfield-symbols:: -* foreign-bitfield-value:: -* foreign-enum-keyword:: -* foreign-enum-value:: -* foreign-slot-names:: -* foreign-slot-offset:: -* foreign-slot-pointer:: -* foreign-slot-value:: -* foreign-type-alignment:: -* foreign-type-size:: -* free-converted-object:: -* free-translated-object:: -* translate-from-foreign:: -* translate-to-foreign:: -* translate-into-foreign-memory:: -* with-foreign-slots:: -@end menu - -@node Built-In Types, Other Types, Foreign Types, Foreign Types -@section Built-In Types - -@ForeignType{:char} -@ForeignType{:unsigned-char} -@ForeignType{:short} -@ForeignType{:unsigned-short} -@ForeignType{:int} -@ForeignType{:unsigned-int} -@ForeignType{:long} -@ForeignType{:unsigned-long} -@ForeignType{:long-long} -@ForeignType{:unsigned-long-long} - -These types correspond to the native C integer types according to the -@acronym{ABI} of the Lisp implementation's host system. - -@code{:long-long} and @code{:unsigned-long-long} are not supported -natively on all implementations. However, they are emulated by -@code{mem-ref} and @code{mem-set}. - -When those types are @strong{not} available, the symbol -@code{cffi-sys::no-long-long} is pushed into @code{*features*}. - -@ForeignType{:uchar} -@ForeignType{:ushort} -@ForeignType{:uint} -@ForeignType{:ulong} -@ForeignType{:llong} -@ForeignType{:ullong} - -For convenience, the above types are provided as shortcuts for -@code{unsigned-char}, @code{unsigned-short}, @code{unsigned-int}, -@code{unsigned-long}, @code{long-long} and @code{unsigned-long-long}, -respectively. - -@ForeignType{:int8} -@ForeignType{:uint8} -@ForeignType{:int16} -@ForeignType{:uint16} -@ForeignType{:int32} -@ForeignType{:uint32} -@ForeignType{:int64} -@ForeignType{:uint64} - -Foreign integer types of specific sizes, corresponding to the C types -defined in @code{stdint.h}. - -@c @ForeignType{:size} -@c @ForeignType{:ssize} -@c @ForeignType{:ptrdiff} -@c @ForeignType{:time} - -@c Foreign integer types corresponding to the standard C types (without -@c the @code{_t} suffix). - -@c @impnote{These are not implemented yet. --luis} - -@c @impnote{I'm sure there are more of these that could be useful, let's -@c add any types that can't be defined portably to this list as -@c necessary. --james} - -@ForeignType{:float} -@ForeignType{:double} - -On all systems, the @code{:float} and @code{:double} types represent a -C @code{float} and @code{double}, respectively. On most but not all -systems, @code{:float} and @code{:double} represent a Lisp -@code{single-float} and @code{double-float}, respectively. It is not -so useful to consider the relationship between Lisp types and C types -as isomorphic, as simply to recognize the relationship, and relative -precision, among each respective category. - -@ForeignType{:long-double} - -This type is only supported on SCL. - -@ForeignType{:pointer &optional type} - -A foreign pointer to an object of any type, corresponding to -@code{void *}. You can optionally specify type of pointer -(e.g. @code{(:pointer :char)}). Although @cffi{} won't do anything -with that information yet, it is useful for documentation purposes. - -@ForeignType{:void} - -No type at all. Only valid as the return type of a function. - -@node Other Types, Defining Foreign Types, Built-In Types, Foreign Types -@section Other Types - -@cffi{} also provides a few useful types that aren't built-in C -types. - -@ForeignType{:string} - -The @code{:string} type performs automatic conversion between Lisp and -C strings. Note that, in the case of functions the converted C string -will have dynamic extent (i.e.@: it will be automatically freed after -the foreign function returns). - -In addition to Lisp strings, this type will accept foreign pointers -and pass them unmodified. - -A method for @ref{free-translated-object} is specialized for this -type. So, for example, foreign strings allocated by this type and -passed to a foreign function will be freed after the function -returns. - -@lisp -CFFI> (foreign-funcall "getenv" :string "SHELL" :string) -@result{} "/bin/bash" - -CFFI> (with-foreign-string (str "abcdef") - (foreign-funcall "strlen" :string str :int)) -@result{} 6 -@end lisp - -@ForeignType{:string+ptr} - -Like @code{:string} but returns a list with two values when convert -from C to Lisp: a Lisp string and the C string's foreign pointer. - -@lisp -CFFI> (foreign-funcall "getenv" :string "SHELL" :string+ptr) -@result{} ("/bin/bash" #.(SB-SYS:INT-SAP #XBFFFFC6F)) -@end lisp - -@ForeignType{:boolean &optional (base-type :int)} - -The @code{:boolean} type converts between a Lisp boolean and a C -boolean. It canonicalizes to @var{base-type} which is @code{:int} by -default. - -@lisp -(convert-to-foreign nil :boolean) @result{} 0 -(convert-to-foreign t :boolean) @result{} 1 -(convert-from-foreign 0 :boolean) @result{} nil -(convert-from-foreign 1 :boolean) @result{} t -@end lisp - -@ForeignType{:bool} - -The @code{:bool} type represents the C99 @code{_Bool} or C++ -@code{bool}. Its size is usually 1 byte except on OSX where it's an -@code{int}. - -@ForeignType{:wrapper base-type &key to-c from-c} - -The @code{:wrapper} type stores two symbols passed to the @var{to-c} -and @var{from-c} arguments. When a value is being translated to or -from C, this type @code{funcall}s the respective symbol. - -@code{:wrapper} types will be typedefs for @var{base-type} and will -inherit its translators, if any. - -Here's an example of how the @code{:boolean} type could be defined in -terms of @code{:wrapper}. - -@lisp -(defun bool-c-to-lisp (value) - (not (zerop value))) - -(defun bool-lisp-to-c (value) - (if value 1 0)) - -(defctype my-bool (:wrapper :int :from-c bool-c-to-lisp - :to-c bool-lisp-to-c)) - -(convert-to-foreign nil 'my-bool) @result{} 0 -(convert-from-foreign 1 'my-bool) @result{} t -@end lisp - -@node Defining Foreign Types, Foreign Type Translators, Other Types, Foreign Types -@section Defining Foreign Types - -You can define simple C-like @code{typedef}s through the -@code{defctype} macro. Defining a typedef is as simple as giving -@code{defctype} a new name and the name of the type to be wrapped. - -@lisp -;;; @lispcmt{Define MY-INT as an alias for the built-in type :INT.} -(defctype my-int :int) -@end lisp - -With this type definition, one can, for instance, declare arguments to -foreign functions as having the type @code{my-int}, and they will be -passed as integers. - -@subheading More complex types - -@cffi{} offers another way to define types through -@code{define-foreign-type}, a thin wrapper macro around -@code{defclass}. As an example, let's go through the steps needed to -define a @code{(my-string &key encoding)} type. First, we need to -define our type class: - -@lisp -(define-foreign-type my-string-type () - ((encoding :reader string-type-encoding :initarg :encoding)) - (:actual-type :pointer)) -@end lisp - -The @code{:actual-type} class option tells CFFI that this type will -ultimately be passed to and received from foreign code as a -@code{:pointer}. Now you need to tell CFFI how to parse a type -specification such as @code{(my-string :encoding :utf8)} into an -instance of @code{my-string-type}. We do that with -@code{define-parse-method}: - -@lisp -(define-parse-method my-string (&key (encoding :utf-8)) - (make-instance 'my-string-type :encoding encoding)) -@end lisp - -The next section describes how make this type actually translate -between C and Lisp strings. - -@node Foreign Type Translators, Optimizing Type Translators, Defining Foreign Types, Foreign Types -@section Foreign Type Translators - -Type translators are used to automatically convert Lisp values to or -from foreign values. For example, using type translators, one can -take the @code{my-string} type defined in the previous section and -specify that it should: - -@itemize -@item -convert C strings to Lisp strings; -@item -convert Lisp strings to newly allocated C strings; -@item -free said C strings when they are no longer needed. -@end itemize - -In order to tell @cffi{} how to automatically convert Lisp values to -foreign values, define a specialized method for the -@code{translate-to-foreign} generic function: - -@lisp -;;; @lispcmt{Define a method that converts Lisp strings to C strings.} -(defmethod translate-to-foreign (string (type my-string-type)) - (foreign-string-alloc string :encoding (string-type-encoding type))) -@end lisp - -@noindent -From now on, whenever an object is passed as a @code{my-string} to a -foreign function, this method will be invoked to convert the Lisp -value. To perform the inverse operation, which is needed for functions -that return a @code{my-string}, specialize the -@code{translate-from-foreign} generic function in the same manner: - -@lisp -;;; @lispcmt{Define a method that converts C strings to Lisp strings.} -(defmethod translate-from-foreign (pointer (type my-string-type)) - (foreign-string-to-lisp pointer :encoding (string-type-encoding type))) -@end lisp - -@noindent -When a @code{translate-to-foreign} method requires allocation of -foreign memory, you must also define a @code{free-translated-object} -method to free the memory once the foreign object is no longer needed, -otherwise you'll be faced with memory leaks. This generic function is -called automatically by @cffi{} when passing objects to foreign -functions. Let's do that: - -@lisp -;;; @lispcmt{Free strings allocated by translate-to-foreign.} -(defmethod free-translated-object (pointer (type my-string-type) param) - (declare (ignore param)) - (foreign-string-free pointer)) -@end lisp - -@noindent -In this specific example, we don't need the @var{param} argument, so -we ignore it. See @ref{free-translated-object}, for an explanation of -its purpose and how you can use it. - -A type translator does not necessarily need to convert the value. For -example, one could define a typedef for @code{:pointer} that ensures, -in the @code{translate-to-foreign} method, that the value is not a -null pointer, signalling an error if a null pointer is passed. This -would prevent some pointer errors when calling foreign functions that -cannot handle null pointers. - -@strong{Please note:} these methods are meant as extensible hooks -only, and you should not call them directly. Use -@code{convert-to-foreign}, @code{convert-from-foreign} and -@code{free-converted-object} instead. - -@xref{Tutorial-Types,, Defining new types}, for another example of -type translators. - -@node Optimizing Type Translators, Foreign Structure Types, Foreign Type Translators, Foreign Types -@section Optimizing Type Translators - -@cindex type translators, optimizing -@cindex compiler macros for type translation -@cindex defining type-translation compiler macros -Being based on generic functions, the type translation mechanism -described above can add a bit of overhead. This is usually not -significant, but we nevertheless provide a way of getting rid of the -overhead for the cases where it matters. - -A good way to understand this issue is to look at the code generated -by @code{defcfun}. Consider the following example using the previously -defined @code{my-string} type: - -@lisp -CFFI> (macroexpand-1 '(defcfun foo my-string (x my-string))) -;; @lispcmt{(simplified, downcased, etc...)} -(defun foo (x) - (multiple-value-bind (#:G2019 #:PARAM3149) - (translate-to-foreign x #) - (unwind-protect - (translate-from-foreign - (foreign-funcall "foo" :pointer #:G2019 :pointer) - #) - (free-translated-object #:G2019 # - #:PARAM3149)))) -@end lisp - -@noindent -In order to get rid of those generic function calls, @cffi{} has -another set of extensible generic functions that provide functionality -similar to @acronym{CL}'s compiler macros: -@code{expand-to-foreign-dyn}, @code{expand-to-foreign} and -@code{expand-from-foreign}. Here's how one could define a -@code{my-boolean} with them: - -@lisp -(define-foreign-type my-boolean-type () - () - (:actual-type :int) - (:simple-parser my-boolean)) - -(defmethod expand-to-foreign (value (type my-boolean-type)) - `(if ,value 1 0)) - -(defmethod expand-from-foreign (value (type my-boolean-type)) - `(not (zerop ,value))) -@end lisp - -@noindent -And here's what the macroexpansion of a function using this type would -look like: - -@lisp -CFFI> (macroexpand-1 '(defcfun bar my-boolean (x my-boolean))) -;; @lispcmt{(simplified, downcased, etc...)} -(defun bar (x) - (let ((#:g3182 (if x 1 0))) - (not (zerop (foreign-funcall "bar" :int #:g3182 :int))))) -@end lisp - -@noindent -No generic function overhead. - -Let's go back to our @code{my-string} type. The expansion interface -has no equivalent of @code{free-translated-object}; you must instead -define a method on @code{expand-to-foreign-dyn}, the third generic -function in this interface. This is especially useful when you can -allocate something much more efficiently if you know the object has -dynamic extent, as is the case with function calls that don't save the -relevant allocated arguments. - -This exactly what we need for the @code{my-string} type: - -@lisp -(defmethod expand-from-foreign (form (type my-string-type)) - `(foreign-string-to-lisp ,form)) - -(defmethod expand-to-foreign-dyn (value var body (type my-string-type)) - (let ((encoding (string-type-encoding type))) - `(with-foreign-string (,var ,value :encoding ',encoding) - ,@@body))) -@end lisp - -@noindent -So let's look at the macro expansion: - -@lisp -CFFI> (macroexpand-1 '(defcfun foo my-string (x my-string))) -;; @lispcmt{(simplified, downcased, etc...)} -(defun foo (x) - (with-foreign-string (#:G2021 X :encoding ':utf-8) - (foreign-string-to-lisp - (foreign-funcall "foo" :pointer #:g2021 :pointer)))) -@end lisp - -@noindent -Again, no generic function overhead. - -@subheading Other details - -To short-circuit expansion and use the @code{translate-*} functions -instead, simply call the next method. Return its result in cases -where your method cannot generate an appropriate replacement for it. -This analogous to the @code{&whole form} mechanism compiler macros -provide. - -The @code{expand-*} methods have precedence over their -@code{translate-*} counterparts and are guaranteed to be used in -@code{defcfun}, @code{foreign-funcall}, @code{defcvar} and -@code{defcallback}. If you define a method on each of the -@code{expand-*} generic functions, you are guaranteed to have full -control over the expressions generated for type translation in these -macros. - -They may or may not be used in other @cffi{} operators that need to -translate between Lisp and C data; you may only assume that -@code{expand-*} methods will probably only be called during Lisp -compilation. - -@code{expand-to-foreign-dyn} has precedence over -@code{expand-to-foreign} and is only used in @code{defcfun} and -@code{foreign-funcall}, only making sense in those contexts. - -@strong{Important note:} this set of generic functions is called at -macroexpansion time. Methods are defined when loaded or evaluated, -not compiled. You are responsible for ensuring that your -@code{expand-*} methods are defined when the @code{foreign-funcall} or -other forms that use them are compiled. One way to do this is to put -the method definitions earlier in the file and inside an appropriate -@code{eval-when} form; another way is to always load a separate Lisp -or @acronym{FASL} file containing your @code{expand-*} definitions -before compiling files with forms that ought to use them. Otherwise, -they will not be found and the runtime translators will be used -instead. - -@node Foreign Structure Types, Allocating Foreign Objects, Optimizing Type Translators, Foreign Types -@section Foreign Structure Types - -For more involved C types than simple aliases to built-in types, such -as you can make with @code{defctype}, @cffi{} allows declaration of -structures and unions with @code{defcstruct} and @code{defcunion}. - -For example, consider this fictional C structure declaration holding -some personal information: - -@example -struct person @{ - int number; - char* reason; -@}; -@end example - -@noindent -The equivalent @code{defcstruct} form follows: - -@lisp -(defcstruct person - (number :int) - (reason :string)) -@end lisp - -@c LMH structure translation -By default, @ref{convert-from-foreign} (and also @ref{mem-ref}) will -make a plist with slot names as keys, and @ref{convert-to-foreign} will -translate such a plist to a foreign structure. A user wishing to define -other translations should use the @code{:class} argument to -@ref{defcstruct}, and then define methods for -@ref{translate-from-foreign} and -@ref{translate-into-foreign-memory} that specialize on this class, -possibly calling @code{call-next-method} to translate from and to the -plists rather than provide a direct interface to the foreign object. -The macro @code{translation-forms-for-class} will generate the forms -necessary to translate a Lisp class into a foreign structure and vice -versa. -@c Write separate function doc section for translation-forms-for-class? -@c Examples, perhaps taken from the tests? - -Please note that this interface is only for those that must know about -the values contained in a relevant struct. If the library you are -interfacing returns an opaque pointer that needs only be passed to -other C library functions, by all means just use @code{:pointer} or a -type-safe definition munged together with @code{defctype} and type -translation. To pass or return a structure by value to a function, load -the cffi-libffi system and specify the structure as @code{(:struct -@var{structure-name})}. To pass or return the pointer, you can use -either @code{:pointer} or @code{(:pointer (:struct -@var{structure-name}))}. - -@subheading Optimizing translate-into-foreign-memory - -Just like how @ref{translate-from-foreign} had -@code{expand-from-foreign} to optimize away the generic function call -and @ref{translate-to-foreign} had the same in -@code{expand-to-foreign}, @ref{translate-into-foreign-memory} has -@code{expand-into-foreign-memory}. - -Let's use our @code{person} struct in an example. However, we are -going to spice it up by using a lisp struct rather than a plist to -represent the person in lisp. - -First we redefine @code{person} very slightly. - -@lisp -(defcstruct (person :class c-person) - (number :int) - (reason :string)) -@end lisp - -By adding @code{:class} we can specialize the @code{translate-*} -methods on the type @code{c-person}. - -Next we define a lisp struct to use instead of the plists. - -@lisp -(defstruct lisp-person - (number 0 :type integer) - (reason "" :type string)) -@end lisp - -And now let's define the type translators we know already: - -@lisp -(defmethod translate-from-foreign (ptr (type c-person)) - (with-foreign-slots ((number reason) ptr (:struct person)) - (make-lisp-person :number number :reason reason))) - -(defmethod expand-from-foreign (ptr (type c-person)) - `(with-foreign-slots ((number reason) ,ptr (:struct person)) - (make-lisp-person :number number :reason reason))) - -(defmethod translate-into-foreign-memory (value (type c-person) ptr) - (with-foreign-slots ((number reason) ptr (:struct person)) - (setf number (lisp-person-number value) - reason (lisp-person-reason value)))) -@end lisp - -At this point everything works, we can convert to and from our -@code{lisp-person} and foreign @code{person}. If we macroexpand - -@lisp -(setf (mem-aref ptr '(:struct person)) x) -@end lisp - -we get something like: - -@lisp -(let ((#:store879 x)) - (translate-into-foreign-memory #:store879 # - (inc-pointer ptr 0)) - #:store879) -@end lisp - -Which is good, but now we can do better and get rid of that generic -function call to @code{translate-into-foreign-memory}. - -@lisp -(defmethod expand-into-foreign-memory (value (type c-person) ptr) - `(with-foreign-slots ((number reason) ,ptr (:struct person)) - (setf number (lisp-person-number ,value) - reason (lisp-person-reason ,value)))) -@end lisp - -Now we can expand again so see the changes: - -@lisp -;; this: -(setf (mem-aref ptr '(:struct person)) x) - -;; expands to this -;; (simplified, downcased, etc..) -(let ((#:store887 x)) - (with-foreign-slots ((number reason) (inc-pointer ptr 0) (:struct person)) - (setf number (lisp-person-number #:store887) - reason (lisp-person-reason #:store887))) #:store887) -@end lisp - -And there we are, no generic function overhead. - -@subheading Compatibility note - -Previous versions of CFFI accepted the -``bare'' @var{structure-name} as a type specification, which was -interpreted as a pointer to the structure. This is deprecated and -produces a style warning. Using this deprecated form means that -@ref{mem-aref} retains its prior meaning and returns a pointer. Using -the @code{(:struct @var{structure-name})} form for the type, -@ref{mem-aref} provides a Lisp object translated from the -structure (by default a plist). Thus the semantics are consistent with all -types in returning the object as represented in Lisp, and not a pointer, -with the exception of the ``bare'' structure compatibility retained. -In order to obtain the pointer, you should use the function @ref{mem-aptr}. - -See @ref{defcstruct} for more details. - -@node Allocating Foreign Objects, convert-from-foreign, Foreign Structure Types, Foreign Types -@section Allocating Foreign Objects - -@c I moved this because I moved with-foreign-object to the Pointers -@c chapter, where foreign-alloc is. - -@xref{Allocating Foreign Memory}. - - -@c =================================================================== -@c CONVERT-FROM-FOREIGN - -@page -@node convert-from-foreign, convert-to-foreign, Allocating Foreign Objects, Foreign Types -@heading convert-from-foreign -@subheading Syntax -@Function{convert-from-foreign foreign-value type @res{} value} - -@subheading Arguments and Values - -@table @var -@item foreign-value -The primitive C value as returned from a primitive foreign function or -from @code{convert-to-foreign}. - -@item type -A @cffi{} type specifier. - -@item value -The Lisp value translated from @var{foreign-value}. -@end table - -@subheading Description - -This is an external interface to the type translation facility. In -the implementation, all foreign functions are ultimately defined as -type translation wrappers around primitive foreign function -invocations. - -This function is available mostly for inspection of the type -translation process, and possibly optimization of special cases of -your foreign function calls. - -Its behavior is better described under @code{translate-from-foreign}'s -documentation. - -@subheading Examples - -@lisp -CFFI-USER> (convert-to-foreign "a boat" :string) -@result{} # -@result{} T -CFFI-USER> (convert-from-foreign * :string) -@result{} "a boat" -@end lisp - -@subheading See Also -@seealso{convert-to-foreign} @* -@seealso{free-converted-object} @* -@seealso{translate-from-foreign} - - -@c =================================================================== -@c CONVERT-TO-FOREIGN - -@page -@node convert-to-foreign, defbitfield, convert-from-foreign, Foreign Types -@heading convert-to-foreign -@subheading Syntax -@Function{convert-to-foreign value type @res{} foreign-value, alloc-params} - -@subheading Arguments and Values - -@table @var -@item value -The Lisp object to be translated to a foreign object. - -@item type -A @cffi{} type specifier. - -@item foreign-value -The primitive C value, ready to be passed to a primitive foreign -function. - -@item alloc-params -Something of a translation state; you must pass it to -@code{free-converted-object} along with the foreign value for that to -work. -@end table - -@subheading Description - -This is an external interface to the type translation facility. In -the implementation, all foreign functions are ultimately defined as -type translation wrappers around primitive foreign function -invocations. - -This function is available mostly for inspection of the type -translation process, and possibly optimization of special cases of -your foreign function calls. - -Its behavior is better described under @code{translate-to-foreign}'s -documentation. - -@subheading Examples - -@lisp -CFFI-USER> (convert-to-foreign t :boolean) -@result{} 1 -@result{} NIL -CFFI-USER> (convert-to-foreign "hello, world" :string) -@result{} # -@result{} T -CFFI-USER> (code-char (mem-aref * :char 5)) -@result{} #\, -@end lisp - -@subheading See Also -@seealso{convert-from-foreign} @* -@seealso{free-converted-object} @* -@seealso{translate-to-foreign} - - -@c =================================================================== -@c DEFBITFIELD - -@page -@node defbitfield, defcstruct, convert-to-foreign, Foreign Types -@heading defbitfield -@subheading Syntax -@Macro{defbitfield name-and-options &body masks} - -masks ::= [docstring] @{ (symbol value) @}* @* -name-and-options ::= name | (name &optional (base-type :int)) - -@subheading Arguments and Values - -@table @var -@item name -The name of the new bitfield type. - -@item docstring -A documentation string, ignored. - -@item base-type -A symbol denoting a foreign type. - -@item symbol -A Lisp symbol. - -@item value -An integer representing a bitmask. -@end table - -@subheading Description -The @code{defbitfield} macro is used to define foreign types that map -lists of symbols to integer values. - -If @var{value} is omitted, it will be computed as follows: find the -greatest @var{value} previously used, including those so computed, -with only a single 1-bit in its binary representation (that is, powers -of two), and left-shift it by one. This rule guarantees that a -computed @var{value} cannot clash with previous values, but may clash -with future explicitly specified values. - -Symbol lists will be automatically converted to values and vice versa -when being passed as arguments to or returned from foreign functions, -respectively. The same applies to any other situations where an object -of a bitfield type is expected. - -Types defined with @code{defbitfield} canonicalize to @var{base-type} -which is @code{:int} by default. - -@subheading Examples -@lisp -(defbitfield open-flags - (:rdonly #x0000) - :wronly ;@lispcmt{#x0001} - :rdwr ;@lispcmt{@dots{}} - :nonblock - :append - (:creat #x0200)) - ;; @lispcmt{etc@dots{}} - -CFFI> (foreign-bitfield-symbols 'open-flags #b1101) -@result{} (:WRONLY :NONBLOCK :APPEND) - -CFFI> (foreign-bitfield-value 'open-flags '(:rdwr :creat)) -@result{} 514 ; #x0202 - -(defcfun ("open" unix-open) :int - (path :string) - (flags open-flags) - (mode :uint16)) ; unportable - -CFFI> (unix-open "/tmp/foo" '(:wronly :creat) #o644) -@result{} # - -;;; @lispcmt{Consider also the following lispier wrapper around open()} -(defun lispier-open (path mode &rest flags) - (unix-open path flags mode)) -@end lisp - -@subheading See Also -@seealso{foreign-bitfield-value} @* -@seealso{foreign-bitfield-symbols} - - -@c =================================================================== -@c DEFCSTRUCT - -@page -@node defcstruct, defcunion, defbitfield, Foreign Types -@heading defcstruct -@subheading Syntax -@Macro{defcstruct name-and-options &body doc-and-slots @res{} name} - -name-and-options ::= structure-name | (structure-name &key size) - -doc-and-slots ::= [docstring] @{ (slot-name slot-type &key count offset) @}* - -@subheading Arguments and Values - -@table @var -@item structure-name -The name of new structure type. - -@item docstring -A documentation string, ignored. - -@item slot-name -A symbol naming the slot. It must be unique among slot names in this -structure. - -@item size -Use this option to override the size (in bytes) of the struct. - -@item slot-type -The type specifier for the slot. - -@item count -Used to declare an array of size @var{count} inside the -structure. Defaults to @code{1} as such an array and a single element -are semantically equivalent. - -@item offset -Overrides the slot's offset. The next slot's offset is calculated -based on this one. -@end table - -@subheading Description -This defines a new @cffi{} aggregate type akin to C @code{struct}s. -In other words, it specifies that foreign objects of the type -@var{structure-name} are groups of different pieces of data, or -``slots'', of the @var{slot-type}s, distinguished from each other by -the @var{slot-name}s. Each structure is located in memory at a -position, and the slots are allocated sequentially beginning at that -point in memory (with some padding allowances as defined by the C -@acronym{ABI}, unless otherwise requested by specifying an -@var{offset} from the beginning of the structure (offset 0). - -In other words, it is isomorphic to the C @code{struct}, giving -several extra features. - -There are two kinds of slots, for the two kinds of @cffi{} types: - -@table @dfn -@item Simple -Contain a single instance of a type that canonicalizes to a built-in -type, such as @code{:long} or @code{:pointer}. Used for simple -@cffi{} types. - -@item Aggregate -Contain an embedded structure or union, or an array of objects. Used -for aggregate @cffi{} types. -@end table - -The use of @acronym{CLOS} terminology for the structure-related -features is intentional; structure definitions are very much like -classes with (far) fewer features. - -@subheading Examples -@lisp -(defcstruct point - "Point structure." - (x :int) - (y :int)) - -CFFI> (with-foreign-object (ptr 'point) - ;; @lispcmt{Initialize the slots} - (setf (foreign-slot-value ptr 'point 'x) 42 - (foreign-slot-value ptr 'point 'y) 42) - ;; @lispcmt{Return a list with the coordinates} - (with-foreign-slots ((x y) ptr point) - (list x y))) -@result{} (42 42) -@end lisp - -@lisp -;; @lispcmt{Using the :size and :offset options to define a partial structure.} -;; @lispcmt{(this is useful when you are interested in only a few slots} -;; @lispcmt{of a big foreign structure)} - -(defcstruct (foo :size 32) - "Some struct with 32 bytes." - ; @lispcmt{<16 bytes we don't care about>} - (x :int :offset 16) ; @lispcmt{an int at offset 16} - (y :int) ; @lispcmt{another int at offset 16+sizeof(int)} - ; @lispcmt{} - (z :char :offset 24)) ; @lispcmt{a char at offset 24} - ; @lispcmt{<7 more bytes ignored (since size is 32)>} - -CFFI> (foreign-type-size 'foo) -@result{} 32 -@end lisp - -@lisp -;;; @lispcmt{Using :count to define arrays inside of a struct.} -(defcstruct video_tuner - (name :char :count 32)) -@end lisp - -@subheading See Also -@seealso{foreign-slot-pointer} @* -@seealso{foreign-slot-value} @* -@seealso{with-foreign-slots} - - -@c =================================================================== -@c DEFCUNION - -@page -@node defcunion, defctype, defcstruct, Foreign Types -@heading defcunion -@subheading Syntax -@Macro{defcunion name &body doc-and-slots @res{} name} - -doc-and-slots ::= [docstring] @{ (slot-name slot-type &key count) @}* - -@subheading Arguments and Values - -@table @var -@item name -The name of new union type. - -@item docstring -A documentation string, ignored. - -@item slot-name -A symbol naming the slot. - -@item slot-type -The type specifier for the slot. - -@item count -Used to declare an array of size @var{count} inside the -structure. -@end table - -@subheading Description -A union is a structure in which all slots have an offset of zero. It -is isomorphic to the C @code{union}. Therefore, you should use the -usual foreign structure operations for accessing a union's slots. - -@subheading Examples -@lisp -(defcunion uint32-bytes - (int-value :unsigned-int) - (bytes :unsigned-char :count 4)) -@end lisp - -@subheading See Also -@seealso{foreign-slot-pointer} @* -@seealso{foreign-slot-value} - - -@c =================================================================== -@c DEFCTYPE - -@page -@node defctype, defcenum, defcunion, Foreign Types -@heading defctype -@subheading Syntax -@Macro{defctype name base-type &optional documentation} - -@subheading Arguments and Values - -@table @var -@item name -The name of the new foreign type. - -@item base-type -A symbol or a list defining the new type. - -@item documentation -A documentation string, currently ignored. -@end table - -@subheading Description -The @code{defctype} macro provides a mechanism similar to C's -@code{typedef} to define new types. The new type inherits -@var{base-type}'s translators, if any. There is no way to define -translations for types defined with @code{defctype}. For that, -you should use @ref{define-foreign-type}. - -@subheading Examples -@lisp -(defctype my-string :string - "My own string type.") - -(defctype long-bools (:boolean :long) - "Booleans that map to C longs.") -@end lisp - -@subheading See Also -@seealso{define-foreign-type} - - -@c =================================================================== -@c DEFCENUM - -@page -@node defcenum, define-foreign-type, defctype, Foreign Types -@heading defcenum -@subheading Syntax -@Macro{defcenum name-and-options &body enum-list} - -enum-list ::= [docstring] @{ keyword | (keyword value) @}* -name-and-options ::= name | (name &optional (base-type :int)) - -@subheading Arguments and Values - -@table @var -@item name -The name of the new enum type. - -@item docstring -A documentation string, ignored. - -@item base-type -A symbol denoting a foreign type. - -@item keyword -A keyword symbol. - -@item value -An index value for a keyword. -@end table - -@subheading Description -The @code{defcenum} macro is used to define foreign types that map -keyword symbols to integer values, similar to the C @code{enum} type. - -If @var{value} is omitted its value will either be 0, if it's the -first entry, or it it will continue the progression from the last -specified value. - -Keywords will be automatically converted to values and vice-versa when -being passed as arguments to or returned from foreign functions, -respectively. The same applies to any other situations where an object -of an @code{enum} type is expected. - -Types defined with @code{defcenum} canonicalize to @var{base-type} -which is @code{:int} by default. - -@subheading Examples -@lisp -(defcenum boolean - :no - :yes) - -CFFI> (foreign-enum-value 'boolean :no) -@result{} 0 -@end lisp - -@lisp -(defcenum numbers - (:one 1) - :two - (:four 4)) - -CFFI> (foreign-enum-keyword 'numbers 2) -@result{} :TWO -@end lisp - -@subheading See Also -@seealso{foreign-enum-value} @* -@seealso{foreign-enum-keyword} - - -@c =================================================================== -@c DEFINE-FOREIGN-TYPE - -@page -@node define-foreign-type, define-parse-method, defcenum, Foreign Types -@heading define-foreign-type -@subheading Syntax -@Macro{define-foreign-type class-name supers slots &rest options @res{} class-name} - -options ::= (@code{:actual-type} @var{type}) | @ - (@code{:simple-parser} @var{symbol}) | @ - @emph{regular defclass option} - -@subheading Arguments and Values - -@table @var -@item class-name -A symbol naming the new foreign type class. - -@item supers -A list of symbols naming the super classes. - -@item slots -A list of slot definitions, passed to @code{defclass}. -@end table - -@subheading Description - -@c TODO rewrite - -The macro @code{define-foreign-type} defines a new class -@var{class-name}. It is a thin wrapper around @code{defclass}. Among -other things, it ensures that @var{class-name} becomes a subclass of -@var{foreign-type}, what you need to know about that is that there's -an initarg @code{:actual-type} which serves the same purpose as -@code{defctype}'s @var{base-type} argument. - -@c TODO mention the type translators here -@c FIX FIX - -@subheading Examples -Taken from @cffi{}'s @code{:boolean} type definition: - -@lisp -(define-foreign-type :boolean (&optional (base-type :int)) - "Boolean type. Maps to an :int by default. Only accepts integer types." - (ecase base-type - ((:char - :unsigned-char - :int - :unsigned-int - :long - :unsigned-long) base-type))) - -CFFI> (canonicalize-foreign-type :boolean) -@result{} :INT -CFFI> (canonicalize-foreign-type '(:boolean :long)) -@result{} :LONG -CFFI> (canonicalize-foreign-type '(:boolean :float)) -;; @lispcmt{@error{} signalled by ECASE.} -@end lisp - -@subheading See Also -@seealso{defctype} @* -@seealso{define-parse-method} - - -@c =================================================================== -@c DEFINE-PARSE-METHOD - -@page -@node define-parse-method, foreign-bitfield-symbols, define-foreign-type, Foreign Types -@heading define-parse-method -@subheading Syntax -@Macro{define-parse-method name lambda-list &body body @res{} name} - -@subheading Arguments and Values - -@table @var -@item type-name -A symbol naming the new foreign type. - -@item lambda-list -A lambda list which is the argument list of the new foreign type. - -@item body -One or more forms that provide a definition of the new foreign type. -@end table - -@subheading Description - - -@c TODO: update example. The boolean type is probably a good choice. - -@subheading Examples -Taken from @cffi{}'s @code{:boolean} type definition: - -@lisp -(define-foreign-type :boolean (&optional (base-type :int)) - "Boolean type. Maps to an :int by default. Only accepts integer types." - (ecase base-type - ((:char - :unsigned-char - :int - :unsigned-int - :long - :unsigned-long) base-type))) - -CFFI> (canonicalize-foreign-type :boolean) -@result{} :INT -CFFI> (canonicalize-foreign-type '(:boolean :long)) -@result{} :LONG -CFFI> (canonicalize-foreign-type '(:boolean :float)) -;; @lispcmt{@error{} signalled by ECASE.} -@end lisp - -@subheading See Also -@seealso{define-foreign-type} - - -@c =================================================================== -@c EXPLAIN-FOREIGN-SLOT-VALUE - -@c @node explain-foreign-slot-value -@c @heading explain-foreign-slot-value -@c @subheading Syntax -@c @Macro{explain-foreign-slot-value ptr type &rest slot-names} - -@c @subheading Arguments and Values - -@c @table @var -@c @item ptr -@c ... - -@c @item type -@c ... - -@c @item slot-names -@c ... -@c @end table - -@c @subheading Description -@c This macro translates the slot access that would occur by calling -@c @code{foreign-slot-value} with the same arguments into an equivalent -@c expression in C and prints it to @code{*standard-output*}. - -@c @emph{Note: this is not implemented yet.} - -@c @subheading Examples -@c @lisp -@c CFFI> (explain-foreign-slot-value ptr 'timeval 'tv-secs) -@c @result{} ptr->tv_secs - -@c CFFI> (explain-foreign-slot-value emp 'employee 'hire-date 'tv-usecs) -@c @result{} emp->hire_date.tv_usecs -@c @end lisp - -@c @subheading See Also - - -@c =================================================================== -@c FOREIGN-BITFIELD-SYMBOLS - -@page -@node foreign-bitfield-symbols, foreign-bitfield-value, define-parse-method, Foreign Types -@heading foreign-bitfield-symbols -@subheading Syntax -@Function{foreign-bitfield-symbols type value @res{} symbols} - -@subheading Arguments and Values - -@table @var -@item type -A bitfield type. - -@item value -An integer. - -@item symbols -A potentially shared list of symbols. -@code{nil}. -@end table - -@subheading Description -The function @code{foreign-bitfield-symbols} returns a possibly shared -list of symbols that correspond to @var{value} in @var{type}. - -@subheading Examples -@lisp -(defbitfield flags - (flag-a 1) - (flag-b 2) - (flag-c 4)) - -CFFI> (foreign-bitfield-symbols 'flags #b101) -@result{} (FLAG-A FLAG-C) -@end lisp - -@subheading See Also -@seealso{defbitfield} @* -@seealso{foreign-bitfield-value} - - -@c =================================================================== -@c FOREIGN-BITFIELD-VALUE - -@page -@node foreign-bitfield-value, foreign-enum-keyword, foreign-bitfield-symbols, Foreign Types -@heading foreign-bitfield-value -@subheading Syntax -@Function{foreign-bitfield-value type symbols @res{} value} - -@subheading Arguments and Values - -@table @var -@item type -A @code{bitfield} type. - -@item symbol -A Lisp symbol. - -@item value -An integer. -@end table - -@subheading Description -The function @code{foreign-bitfield-value} returns the @var{value} that -corresponds to the symbols in the @var{symbols} list. - -@subheading Examples -@lisp -(defbitfield flags - (flag-a 1) - (flag-b 2) - (flag-c 4)) - -CFFI> (foreign-bitfield-value 'flags '(flag-a flag-c)) -@result{} 5 ; #b101 -@end lisp - -@subheading See Also -@seealso{defbitfield} @* -@seealso{foreign-bitfield-symbols} - - -@c =================================================================== -@c FOREIGN-ENUM-KEYWORD - -@page -@node foreign-enum-keyword, foreign-enum-value, foreign-bitfield-value, Foreign Types -@heading foreign-enum-keyword -@subheading Syntax -@Function{foreign-enum-keyword type value &key errorp @res{} keyword} - -@subheading Arguments and Values - -@table @var -@item type -An @code{enum} type. - -@item value -An integer. - -@item errorp -If true (the default), signal an error if @var{value} is not defined -in @var{type}. If false, @code{foreign-enum-keyword} returns -@code{nil}. - -@item keyword -A keyword symbol. -@end table - -@subheading Description -The function @code{foreign-enum-keyword} returns the keyword symbol -that corresponds to @var{value} in @var{type}. - -An error is signaled if @var{type} doesn't contain such @var{value} -and @var{errorp} is true. - -@subheading Examples -@lisp -(defcenum boolean - :no - :yes) - -CFFI> (foreign-enum-keyword 'boolean 1) -@result{} :YES -@end lisp - -@subheading See Also -@seealso{defcenum} @* -@seealso{foreign-enum-value} - - -@c =================================================================== -@c FOREIGN-ENUM-VALUE - -@page -@node foreign-enum-value, foreign-slot-names, foreign-enum-keyword, Foreign Types -@heading foreign-enum-value -@subheading Syntax -@Function{foreign-enum-value type keyword &key errorp @res{} value} - -@subheading Arguments and Values - -@table @var -@item type -An @code{enum} type. - -@item keyword -A keyword symbol. - -@item errorp -If true (the default), signal an error if @var{keyword} is not -defined in @var{type}. If false, @code{foreign-enum-value} returns -@code{nil}. - -@item value -An integer. -@end table - -@subheading Description -The function @code{foreign-enum-value} returns the @var{value} that -corresponds to @var{keyword} in @var{type}. - -An error is signaled if @var{type} doesn't contain such -@var{keyword}, and @var{errorp} is true. - -@subheading Examples -@lisp -(defcenum boolean - :no - :yes) - -CFFI> (foreign-enum-value 'boolean :yes) -@result{} 1 -@end lisp - -@subheading See Also -@seealso{defcenum} @* -@seealso{foreign-enum-keyword} - - -@c =================================================================== -@c FOREIGN-SLOT-NAMES - -@page -@node foreign-slot-names, foreign-slot-offset, foreign-enum-value, Foreign Types -@heading foreign-slot-names -@subheading Syntax -@Function{foreign-slot-names type @res{} names} - -@subheading Arguments and Values - -@table @var -@item type -A foreign struct type. - -@item names -A list. -@end table - -@subheading Description -The function @code{foreign-slot-names} returns a potentially shared -list of slot @var{names} for the given structure @var{type}. This list -has no particular order. - -@subheading Examples -@lisp -(defcstruct timeval - (tv-secs :long) - (tv-usecs :long)) - -CFFI> (foreign-slot-names '(:struct timeval)) -@result{} (TV-SECS TV-USECS) -@end lisp - -@subheading See Also -@seealso{defcstruct} @* -@seealso{foreign-slot-offset} @* -@seealso{foreign-slot-value} @* -@seealso{foreign-slot-pointer} - - -@c =================================================================== -@c FOREIGN-SLOT-OFFSET - -@page -@node foreign-slot-offset, foreign-slot-pointer, foreign-slot-names, Foreign Types -@heading foreign-slot-offset -@subheading Syntax -@Function{foreign-slot-offset type slot-name @res{} offset} - -@subheading Arguments and Values - -@table @var -@item type -A foreign struct type. - -@item slot-name -A symbol. - -@item offset -An integer. -@end table - -@subheading Description -The function @code{foreign-slot-offset} returns the @var{offset} in -bytes of a slot in a foreign struct type. - -@subheading Examples -@lisp -(defcstruct timeval - (tv-secs :long) - (tv-usecs :long)) - -CFFI> (foreign-slot-offset '(:struct timeval) 'tv-secs) -@result{} 0 -CFFI> (foreign-slot-offset '(:struct timeval) 'tv-usecs) -@result{} 4 -@end lisp - -@subheading See Also -@seealso{defcstruct} @* -@seealso{foreign-slot-names} @* -@seealso{foreign-slot-pointer} @* -@seealso{foreign-slot-value} - - -@c =================================================================== -@c FOREIGN-SLOT-POINTER - -@page -@node foreign-slot-pointer, foreign-slot-value, foreign-slot-offset, Foreign Types -@heading foreign-slot-pointer -@subheading Syntax -@Function{foreign-slot-pointer ptr type slot-name @res{} pointer} - -@subheading Arguments and Values - -@table @var -@item ptr -A pointer to a structure. - -@item type -A foreign structure type. - -@item slot-names -A slot name in the @var{type}. - -@item pointer -A pointer to the slot @var{slot-name}. -@end table - -@subheading Description -Returns a pointer to the location of the slot @var{slot-name} in a -foreign object of type @var{type} at @var{ptr}. The returned pointer -points inside the structure. Both the pointer and the memory it points -to have the same extent as @var{ptr}. - -For aggregate slots, this is the same value returned by -@code{foreign-slot-value}. - -@subheading Examples -@lisp -(defcstruct point - "Pointer structure." - (x :int) - (y :int)) - -CFFI> (with-foreign-object (ptr '(:struct point)) - (foreign-slot-pointer ptr '(:struct point) 'x)) -@result{} # -;; @lispcmt{Note: the exact pointer representation varies from lisp to lisp.} -@end lisp - -@subheading See Also -@seealso{defcstruct} @* -@seealso{foreign-slot-value} @* -@seealso{foreign-slot-names} @* -@seealso{foreign-slot-offset} - - -@c =================================================================== -@c FOREIGN-SLOT-VALUE - -@page -@node foreign-slot-value, foreign-type-alignment, foreign-slot-pointer, Foreign Types -@heading foreign-slot-value -@subheading Syntax -@Accessor{foreign-slot-value ptr type slot-name @res{} object} - -@subheading Arguments and Values - -@table @var -@item ptr -A pointer to a structure. - -@item type -A foreign structure type. - -@item slot-name -A symbol naming a slot in the structure type. - -@item object -The object contained in the slot specified by @var{slot-name}. -@end table - -@subheading Description -For simple slots, @code{foreign-slot-value} returns the value of the -object, such as a Lisp integer or pointer. In C, this would be -expressed as @code{ptr->slot}. - -For aggregate slots, a pointer inside the structure to the beginning -of the slot's data is returned. In C, this would be expressed as -@code{&ptr->slot}. This pointer and the memory it points to have the -same extent as @var{ptr}. - -There are compiler macros for @code{foreign-slot-value} and its -@code{setf} expansion that open code the memory access when -@var{type} and @var{slot-names} are constant at compile-time. - -@subheading Examples -@lisp -(defcstruct point - "Pointer structure." - (x :int) - (y :int)) - -CFFI> (with-foreign-object (ptr '(:struct point)) - ;; @lispcmt{Initialize the slots} - (setf (foreign-slot-value ptr '(:struct point) 'x) 42 - (foreign-slot-value ptr '(:struct point) 'y) 42) - ;; @lispcmt{Return a list with the coordinates} - (with-foreign-slots ((x y) ptr (:struct point)) - (list x y))) -@result{} (42 42) -@end lisp - -@subheading See Also -@seealso{defcstruct} @* -@seealso{foreign-slot-names} @* -@seealso{foreign-slot-offset} @* -@seealso{foreign-slot-pointer} @* -@seealso{with-foreign-slots} - - -@c =================================================================== -@c FOREIGN-TYPE-ALIGNMENT - -@page -@node foreign-type-alignment, foreign-type-size, foreign-slot-value, Foreign Types -@heading foreign-type-alignment -@subheading Syntax -@c XXX: This is actually a generic function. -@Function{foreign-type-alignment type @res{} alignment} - -@subheading Arguments and Values - -@table @var -@item type -A foreign type. - -@item alignment -An integer. -@end table - -@subheading Description -The function @code{foreign-type-alignment} returns the -@var{alignment} of @var{type} in bytes. - -@subheading Examples -@lisp -CFFI> (foreign-type-alignment :char) -@result{} 1 -CFFI> (foreign-type-alignment :short) -@result{} 2 -CFFI> (foreign-type-alignment :int) -@result{} 4 -@end lisp - -@lisp -(defcstruct foo - (a :char)) - -CFFI> (foreign-type-alignment '(:struct foo)) -@result{} 1 -@end lisp - -@subheading See Also -@seealso{foreign-type-size} - - -@c =================================================================== -@c FOREIGN-TYPE-SIZE - -@page -@node foreign-type-size, free-converted-object, foreign-type-alignment, Foreign Types -@heading foreign-type-size -@subheading Syntax -@c XXX: this is actually a generic function. -@Function{foreign-type-size type @res{} size} - -@subheading Arguments and Values - -@table @var -@item type -A foreign type. - -@item size -An integer. -@end table - -@subheading Description -The function @code{foreign-type-size} return the @var{size} of -@var{type} in bytes. This includes any padding within and following -the in-memory representation as needed to create an array of -@var{type} objects. - -@subheading Examples -@lisp -(defcstruct foo - (a :double) - (c :char)) - -CFFI> (foreign-type-size :double) -@result{} 8 -CFFI> (foreign-type-size :char) -@result{} 1 -CFFI> (foreign-type-size '(:struct foo)) -@result{} 16 -@end lisp - -@subheading See Also -@seealso{foreign-type-alignment} - - -@c =================================================================== -@c FREE-CONVERTED-OBJECT - -@page -@node free-converted-object, free-translated-object, foreign-type-size, Foreign Types -@heading free-converted-object -@subheading Syntax -@Function{free-converted-object foreign-value type params} - -@subheading Arguments and Values - -@table @var -@item foreign-value -The C object to be freed. - -@item type -A @cffi{} type specifier. - -@item params -The state returned as the second value from @code{convert-to-foreign}; -used to implement the third argument to @code{free-translated-object}. -@end table - -@subheading Description - -The return value is unspecified. - -This is an external interface to the type translation facility. In -the implementation, all foreign functions are ultimately defined as -type translation wrappers around primitive foreign function -invocations. - -This function is available mostly for inspection of the type -translation process, and possibly optimization of special cases of -your foreign function calls. - -Its behavior is better described under @code{free-translated-object}'s -documentation. - -@subheading Examples - -@lisp -CFFI-USER> (convert-to-foreign "a boat" :string) -@result{} # -@result{} T -CFFI-USER> (free-converted-object * :string t) -@result{} NIL -@end lisp - -@subheading See Also -@seealso{convert-from-foreign} @* -@seealso{convert-to-foreign} @* -@seealso{free-translated-object} - - -@c =================================================================== -@c FREE-TRANSLATED-OBJECT - -@c TODO: update - -@page -@node free-translated-object, translate-from-foreign, free-converted-object, Foreign Types -@heading free-translated-object -@subheading Syntax -@GenericFunction{free-translated-object value type-name param} - -@subheading Arguments and Values - -@table @var -@item pointer -The foreign value returned by @code{translate-to-foreign}. - -@item type-name -A symbol naming a foreign type defined by @code{defctype}. - -@item param -The second value, if any, returned by @code{translate-to-foreign}. -@end table - -@subheading Description -This generic function may be specialized by user code to perform -automatic deallocation of foreign objects as they are passed to C -functions. - -Any methods defined on this generic function must EQL-specialize the -@var{type-name} parameter on a symbol defined as a foreign type by -the @code{defctype} macro. - -@subheading See Also -@seealso{Foreign Type Translators} @* -@seealso{translate-to-foreign} - - -@c =================================================================== -@c TRANSLATE-FROM-FOREIGN - -@c TODO: update - -@page -@node translate-from-foreign, translate-to-foreign, free-translated-object, Foreign Types -@heading translate-from-foreign -@subheading Syntax -@GenericFunction{translate-from-foreign foreign-value type-name @ - @res{} lisp-value} - -@subheading Arguments and Values - -@table @var -@item foreign-value -The foreign value to convert to a Lisp object. - -@item type-name -A symbol naming a foreign type defined by @code{defctype}. - -@item lisp-value -The lisp value to pass in place of @code{foreign-value} to Lisp code. -@end table - -@subheading Description -This generic function is invoked by @cffi{} to convert a foreign value to -a Lisp value, such as when returning from a foreign function, passing -arguments to a callback function, or accessing a foreign variable. - -To extend the @cffi{} type system by performing custom translations, this -method may be specialized by @sc{eql}-specializing @code{type-name} on a -symbol naming a foreign type defined with @code{defctype}. This -method should return the appropriate Lisp value to use in place of the -foreign value. - -The results are undefined if the @code{type-name} parameter is -specialized in any way except an @sc{eql} specializer on a foreign type -defined with @code{defctype}. Specifically, translations may not be -defined for built-in types. - -@subheading See Also -@seealso{Foreign Type Translators} @* -@seealso{translate-to-foreign} @* -@seealso{free-translated-object} - - -@c =================================================================== -@c TRANSLATE-TO-FOREIGN - -@c TODO: update - -@page -@node translate-to-foreign, translate-into-foreign-memory, translate-from-foreign, Foreign Types -@heading translate-to-foreign -@subheading Syntax -@GenericFunction{translate-to-foreign lisp-value type-name @ - @res{} foreign-value, alloc-param} - -@subheading Arguments and Values - -@table @var -@item lisp-value -The Lisp value to convert to foreign representation. - -@item type-name -A symbol naming a foreign type defined by @code{defctype}. - -@item foreign-value -The foreign value to pass in place of @code{lisp-value} to foreign code. - -@item alloc-param -If present, this value will be passed to -@code{free-translated-object}. -@end table - -@subheading Description -This generic function is invoked by @cffi{} to convert a Lisp value to a -foreign value, such as when passing arguments to a foreign function, -returning a value from a callback, or setting a foreign variable. A -``foreign value'' is one appropriate for passing to the next-lowest -translator, including the low-level translators that are ultimately -invoked invisibly with @cffi{}. - -To extend the @cffi{} type system by performing custom translations, this -method may be specialized by @sc{eql}-specializing @code{type-name} on a -symbol naming a foreign type defined with @code{defctype}. This -method should return the appropriate foreign value to use in place of -the Lisp value. - -In cases where @cffi{} can determine the lifetime of the foreign object -returned by this method, it will invoke @code{free-translated-object} -on the foreign object at the appropriate time. If -@code{translate-to-foreign} returns a second value, it will be passed -as the @code{param} argument to @code{free-translated-object}. This -can be used to establish communication between the allocation and -deallocation methods. - -The results are undefined if the @code{type-name} parameter is -specialized in any way except an @sc{eql} specializer on a foreign type -defined with @code{defctype}. Specifically, translations may not be -defined for built-in types. - -@subheading See Also -@seealso{Foreign Type Translators} @* -@seealso{translate-from-foreign} @* -@seealso{free-translated-object} - - -@c =================================================================== -@c TRANSLATE-INTO-FOREIGN-MEMORY - -@page -@node translate-into-foreign-memory, with-foreign-slots, translate-to-foreign, Foreign Types -@heading translate-into-foreign-memory -@subheading Syntax -@GenericFunction{translate-into-foreign-memory lisp-value type-name pointer} - -@subheading Arguments and Values - -@table @var -@item lisp-value -The Lisp value to convert to foreign representation. - -@item type-name -A symbol or list @code{(:struct @var{structure-name})} naming a foreign type defined by @code{defctype}. - -@item pointer -The foreign pointer where the translated object should be stored. -@end table - -@subheading Description -Translate the Lisp value into the foreign memory location given by -pointer. The return value is not used. - -@c =================================================================== -@c WITH-FOREIGN-SLOTS - -@page -@node with-foreign-slots, , translate-into-foreign-memory, Foreign Types -@heading with-foreign-slots -@subheading Syntax -@Macro{with-foreign-slots (vars ptr type) &body body} - -@subheading Arguments and Values - -@table @var -@item vars -A list with each element a symbol, or list of length two with the -first element @code{:pointer} and the second a symbol. - -@item ptr -A foreign pointer to a structure. - -@item type -A structure type. - -@item body -A list of forms to be executed. -@end table - -@subheading Description -The @code{with-foreign-slots} macro creates local symbol macros for each -var in @var{vars} to reference foreign slots in @var{ptr} of @var{type}. -If the var is a list starting with @code{:pointer}, it will bind the -pointer to the slot (rather than the value). It is similar to Common -Lisp's @code{with-slots} macro. - -@subheading Examples -@lisp -(defcstruct tm - (sec :int) - (min :int) - (hour :int) - (mday :int) - (mon :int) - (year :int) - (wday :int) - (yday :int) - (isdst :boolean) - (zone :string) - (gmtoff :long)) - -CFFI> (with-foreign-object (time :int) - (setf (mem-ref time :int) - (foreign-funcall "time" :pointer (null-pointer) :int)) - (foreign-funcall "gmtime" :pointer time (:pointer (:struct tm)))) -@result{} # -CFFI> (with-foreign-slots ((sec min hour mday mon year) * (:struct tm)) - (format nil "~A:~A:~A, ~A/~A/~A" - hour min sec (+ 1900 year) mon mday)) -@result{} "7:22:47, 2005/8/2" -@end lisp - -@subheading See Also -@seealso{defcstruct} @* -@seealso{defcunion} @* -@seealso{foreign-slot-value} - - -@c =================================================================== -@c CHAPTER: Pointers - -@node Pointers, Strings, Foreign Types, Top -@chapter Pointers - -All C data in @cffi{} is referenced through pointers. This includes -defined C variables that hold immediate values, and integers. - -To see why this is, consider the case of the C integer. It is not -only an arbitrary representation for an integer, congruent to Lisp's -fixnums; the C integer has a specific bit pattern in memory defined by -the C @acronym{ABI}. Lisp has no such constraint on its fixnums; -therefore, it only makes sense to think of fixnums as C integers if -you assume that @cffi{} converts them when necessary, such as when -storing one for use in a C function call, or as the value of a C -variable. This requires defining an area of memory@footnote{The -definition of @dfn{memory} includes the @acronym{CPU} registers.}, -represented through an effective address, and storing it there. - -Due to this compartmentalization, it only makes sense to manipulate -raw C data in Lisp through pointers to it. For example, while there -may be a Lisp representation of a @code{struct} that is converted to C -at store time, you may only manipulate its raw data through a pointer. -The C compiler does this also, albeit informally. - -@menu -* Basic Pointer Operations:: -* Allocating Foreign Memory:: -* Accessing Foreign Memory:: - -Dictionary - -* foreign-free:: -* foreign-alloc:: -* foreign-symbol-pointer:: -* inc-pointer:: -* incf-pointer:: -* make-pointer:: -* mem-aptr:: -* mem-aref:: -* mem-ref:: -* null-pointer:: -* null-pointer-p:: -* pointerp:: -* pointer-address:: -* pointer-eq:: -* with-foreign-object:: -* with-foreign-objects:: -* with-foreign-pointer:: -@end menu - -@node Basic Pointer Operations, Allocating Foreign Memory, Pointers, Pointers -@section Basic Pointer Operations - -Manipulating pointers proper can be accomplished through most of the -other operations defined in the Pointers dictionary, such as -@code{make-pointer}, @code{pointer-address}, and @code{pointer-eq}. -When using them, keep in mind that they merely manipulate the Lisp -representation of pointers, not the values they point to. - -@deftp {Lisp Type} foreign-pointer -The pointers' representations differ from implementation to -implementation and have different types. @code{foreign-pointer} -provides a portable type alias to each of these types. -@end deftp - - -@node Allocating Foreign Memory, Accessing Foreign Memory, Basic Pointer Operations, Pointers -@section Allocating Foreign Memory - -@cffi{} provides support for stack and heap C memory allocation. -Stack allocation, done with @code{with-foreign-object}, is sometimes -called ``dynamic'' allocation in Lisp, because memory allocated as -such has dynamic extent, much as with @code{let} bindings of special -variables. - -This should not be confused with what C calls ``dynamic'' allocation, -or that done with @code{malloc} and friends. This sort of heap -allocation is done with @code{foreign-alloc}, creating objects that -exist until freed with @code{foreign-free}. - - -@node Accessing Foreign Memory, foreign-free, Allocating Foreign Memory, Pointers -@section Accessing Foreign Memory - -When manipulating raw C data, consider that all pointers are pointing -to an array. When you only want one C value, such as a single -@code{struct}, this array only has one such value. It is worthwhile -to remember that everything is an array, though, because this is also -the semantic that C imposes natively. - -C values are accessed as the @code{setf}-able places defined by -@code{mem-aref} and @code{mem-ref}. Given a pointer and a @cffi{} -type (@pxref{Foreign Types}), either of these will dereference the -pointer, translate the C data there back to Lisp, and return the -result of said translation, performing the reverse operation when -@code{setf}-ing. To decide which one to use, consider whether you -would use the array index operator @code{[@var{n}]} or the pointer -dereference @code{*} in C; use @code{mem-aref} for array indexing and -@code{mem-ref} for pointer dereferencing. - - -@c =================================================================== -@c FOREIGN-FREE - -@page -@node foreign-free, foreign-alloc, Accessing Foreign Memory, Pointers -@heading foreign-free -@subheading Syntax -@Function{foreign-free ptr @res{} undefined} - -@subheading Arguments and Values - -@table @var -@item ptr -A foreign pointer. -@end table - -@subheading Description -The @code{foreign-free} function frees a @code{ptr} previously -allocated by @code{foreign-alloc}. The consequences of freeing a given -pointer twice are undefined. - -@subheading Examples - -@lisp -CFFI> (foreign-alloc :int) -@result{} # -CFFI> (foreign-free *) -@result{} NIL -@end lisp - -@subheading See Also -@seealso{foreign-alloc} @* -@seealso{with-foreign-pointer} - - -@c =================================================================== -@c FOREIGN-ALLOC - -@page -@node foreign-alloc, foreign-symbol-pointer, foreign-free, Pointers -@heading foreign-alloc -@subheading Syntax -@Function{foreign-alloc type &key initial-element initial-contents (count 1) @ - null-terminated-p @res{} pointer} - -@subheading Arguments and Values - -@table @var -@item type -A foreign type. - -@item initial-element -A Lisp object. - -@item initial-contents -A sequence. - -@item count -An integer. Defaults to 1 or the length of @var{initial-contents} if -supplied. - -@item null-terminated-p -A boolean, false by default. - -@item pointer -A foreign pointer to the newly allocated memory. -@end table - -@subheading Description -The @code{foreign-alloc} function allocates enough memory to hold -@var{count} objects of type @var{type} and returns a -@var{pointer}. This memory must be explicitly freed using -@code{foreign-free} once it is no longer needed. - -If @var{initial-element} is supplied, it is used to initialize the -@var{count} objects the newly allocated memory holds. - -If an @var{initial-contents} sequence is supplied, it must have a -length less than or equal to @var{count} and each of its elements -will be used to initialize the contents of the newly allocated -memory. - -If @var{count} is omitted and @var{initial-contents} is specified, it -will default to @code{(length @var{initial-contents})}. - -@var{initial-element} and @var{initial-contents} are mutually -exclusive. - -When @var{null-terminated-p} is true, -@code{(1+ (max @var{count} (length @var{initial-contents})))} elements -are allocated and the last one is set to @code{NULL}. Note that in -this case @var{type} must be a pointer type (ie. a type that -canonicalizes to @code{:pointer}), otherwise an error is signaled. - -@subheading Examples -@lisp -CFFI> (foreign-alloc :char) -@result{} # ; @lispcmt{A pointer to 1 byte of memory.} - -CFFI> (foreign-alloc :char :count 20) -@result{} # ; @lispcmt{A pointer to 20 bytes of memory.} - -CFFI> (foreign-alloc :int :initial-element 12) -@result{} # -CFFI> (mem-ref * :int) -@result{} 12 - -CFFI> (foreign-alloc :int :initial-contents '(1 2 3)) -@result{} # -CFFI> (loop for i from 0 below 3 - collect (mem-aref * :int i)) -@result{} (1 2 3) - -CFFI> (foreign-alloc :int :initial-contents #(1 2 3)) -@result{} # -CFFI> (loop for i from 0 below 3 - collect (mem-aref * :int i)) -@result{} (1 2 3) - -;;; @lispcmt{Allocate a char** pointer that points to newly allocated memory} -;;; @lispcmt{by the :string type translator for the string "foo".} -CFFI> (foreign-alloc :string :initial-element "foo") -@result{} # -@end lisp - -@lisp -;;; @lispcmt{Allocate a null-terminated array of strings.} -;;; @lispcmt{(Note: FOREIGN-STRING-TO-LISP returns NIL when passed a null pointer)} -CFFI> (foreign-alloc :string - :initial-contents '("foo" "bar" "baz") - :null-terminated-p t) -@result{} # -CFFI> (loop for i from 0 below 4 - collect (mem-aref * :string i)) -@result{} ("foo" "bar" "baz" NIL) -CFFI> (progn - (dotimes (i 3) - (foreign-free (mem-aref ** :pointer i))) - (foreign-free **)) -@result{} nil -@end lisp - -@subheading See Also -@seealso{foreign-free} @* -@seealso{with-foreign-object} @* -@seealso{with-foreign-pointer} - - -@c =================================================================== -@c FOREIGN-SYMBOL-POINTER - -@page -@node foreign-symbol-pointer, inc-pointer, foreign-alloc, Pointers -@heading foreign-symbol-pointer -@subheading Syntax -@Function{foreign-symbol-pointer foreign-name &key library @res{} pointer} - -@subheading Arguments and Values - -@table @var -@item foreign-name -A string. - -@item pointer -A foreign pointer, or @code{nil}. - -@item library -A Lisp symbol or an instance of @code{foreign-library}. -@end table - -@subheading Description -The function @code{foreign-symbol-pointer} will return a foreign -pointer corresponding to the foreign symbol denoted by the string -@var{foreign-name}. If a foreign symbol named @var{foreign-name} -doesn't exist, @code{nil} is returned. - -ABI name manglings will be performed on @var{foreign-name} by -@code{foreign-symbol-pointer} if necessary. (eg: adding a leading -underscore on darwin/ppc) - -@var{library} should name a foreign library as defined by -@code{define-foreign-library}, @code{:default} (which is the default) -or an instance of @code{foreign-library} as returned by -@code{load-foreign-library}. - -@strong{Important note:} do not keep these pointers across saved Lisp -cores as the foreign-library may move across sessions. - -@subheading Examples - -@lisp -CFFI> (foreign-symbol-pointer "errno") -@result{} # -CFFI> (foreign-symbol-pointer "strerror") -@result{} # -CFFI> (foreign-funcall-pointer * () :int (mem-ref ** :int) :string) -@result{} "No such file or directory" - -CFFI> (foreign-symbol-pointer "inexistent symbol") -@result{} NIL -@end lisp - -@subheading See Also -@seealso{defcvar} - - -@c =================================================================== -@c INC-POINTER - -@page -@node inc-pointer, incf-pointer, foreign-symbol-pointer, Pointers -@heading inc-pointer -@subheading Syntax -@Function{inc-pointer pointer offset @res{} new-pointer} - -@subheading Arguments and Values - -@table @var -@item pointer -@itemx new-pointer -A foreign pointer. - -@item offset -An integer. -@end table - -@subheading Description -The function @code{inc-pointer} will return a @var{new-pointer} pointing -@var{offset} bytes past @var{pointer}. - -@subheading Examples - -@lisp -CFFI> (foreign-string-alloc "Common Lisp") -@result{} # -CFFI> (inc-pointer * 7) -@result{} # -CFFI> (foreign-string-to-lisp *) -@result{} "Lisp" -@end lisp - -@subheading See Also -@seealso{incf-pointer} @* -@seealso{make-pointer} @* -@seealso{pointerp} @* -@seealso{null-pointer} @* -@seealso{null-pointer-p} - - -@c =================================================================== -@c INCF-POINTER - -@page -@node incf-pointer, make-pointer, inc-pointer, Pointers -@heading incf-pointer -@subheading Syntax -@Macro{incf-pointer place &optional (offset 1) @res{} new-pointer} - -@subheading Arguments and Values - -@table @var -@item place -A @code{setf} place. - -@item new-pointer -A foreign pointer. - -@item offset -An integer. -@end table - -@subheading Description -The @code{incf-pointer} macro takes the foreign pointer from -@var{place} and creates a @var{new-pointer} incremented by -@var{offset} bytes and which is stored in @var{place}. - -@subheading Examples - -@lisp -CFFI> (defparameter *two-words* (foreign-string-alloc "Common Lisp")) -@result{} *TWO-WORDS* -CFFI> (defparameter *one-word* *two-words*) -@result{} *ONE-WORD* -CFFI> (incf-pointer *one-word* 7) -@result{} #.(SB-SYS:INT-SAP #X00600457) -CFFI> (foreign-string-to-lisp *one-word*) -@result{} "Lisp" -CFFI> (foreign-string-to-lisp *two-words*) -@result{} "Common Lisp" -@end lisp - -@subheading See Also -@seealso{inc-pointer} @* -@seealso{make-pointer} @* -@seealso{pointerp} @* -@seealso{null-pointer} @* -@seealso{null-pointer-p} - - -@c =================================================================== -@c MAKE-POINTER - -@page -@node make-pointer, mem-aptr, incf-pointer, Pointers -@heading make-pointer -@subheading Syntax -@Function{make-pointer address @res{} ptr} - -@subheading Arguments and Values - -@table @var -@item address -An integer. - -@item ptr -A foreign pointer. -@end table - -@subheading Description -The function @code{make-pointer} will return a foreign pointer -pointing to @var{address}. - -@subheading Examples - -@lisp -CFFI> (make-pointer 42) -@result{} # -CFFI> (pointerp *) -@result{} T -CFFI> (pointer-address **) -@result{} 42 -CFFI> (inc-pointer *** -42) -@result{} # -CFFI> (null-pointer-p *) -@result{} T -CFFI> (typep ** 'foreign-pointer) -@result{} T -@end lisp - -@subheading See Also -@seealso{inc-pointer} @* -@seealso{null-pointer} @* -@seealso{null-pointer-p} @* -@seealso{pointerp} @* -@seealso{pointer-address} @* -@seealso{pointer-eq} @* -@seealso{mem-ref} - - -@c =================================================================== -@c MEM-APTR - -@page -@node mem-aptr, mem-aref, make-pointer, Pointers -@heading mem-aptr -@subheading Syntax -@Accessor{mem-aptr ptr type &optional (index 0)} - -@subheading Arguments and Values - -@table @var -@item ptr -A foreign pointer. - -@item type -A foreign type. - -@item index -An integer. - -@item new-value -A Lisp value compatible with @var{type}. -@end table - -@subheading Description -The @code{mem-aptr} function finds the pointer to an element of the array. - -@lisp -(mem-aptr ptr type n) - -;; @lispcmt{is identical to:} - -(inc-pointer ptr (* n (foreign-type-size type))) -@end lisp - -@subheading Examples - -@lisp -CFFI> (with-foreign-string (str "Hello, foreign world!") - (mem-aptr str :char 6)) -@result{} #.(SB-SYS:INT-SAP #X0063D4B6) -@end lisp - -@c =================================================================== -@c MEM-AREF - -@page -@node mem-aref, mem-ref, mem-aptr, Pointers -@heading mem-aref -@subheading Syntax -@Accessor{mem-aref ptr type &optional (index 0)} - -(setf (@strong{mem-aref} @emph{ptr type &optional (index 0)) new-value}) - -@subheading Arguments and Values - -@table @var -@item ptr -A foreign pointer. - -@item type -A foreign type. - -@item index -An integer. - -@item new-value -A Lisp value compatible with @var{type}. -@end table - -@subheading Description -The @code{mem-aref} function is similar to @code{mem-ref} but will -automatically calculate the offset from an @var{index}. - -@lisp -(mem-aref ptr type n) - -;; @lispcmt{is identical to:} - -(mem-ref ptr type (* n (foreign-type-size type))) -@end lisp - -@subheading Examples - -@lisp -CFFI> (with-foreign-string (str "Hello, foreign world!") - (mem-aref str :char 6)) -@result{} 32 -CFFI> (code-char *) -@result{} #\Space - -CFFI> (with-foreign-object (array :int 10) - (loop for i below 10 - do (setf (mem-aref array :int i) (random 100))) - (loop for i below 10 collect (mem-aref array :int i))) -@result{} (22 7 22 52 69 1 46 93 90 65) -@end lisp - -@subheading Compatibility Note - -For compatibility with older versions of CFFI, @ref{mem-aref} will -produce a pointer for the deprecated bare structure specification, but -it is consistent with other types for the current specification form -@code{(:struct @var{structure-name})} and provides a Lisp object -translated from the structure (by default a plist). In order to obtain -the pointer, you should use the new function @ref{mem-aptr}. - -@subheading See Also -@seealso{mem-ref} @* -@seealso{mem-aptr} - -@c =================================================================== -@c MEM-REF - -@page -@node mem-ref, null-pointer, mem-aref, Pointers -@heading mem-ref -@subheading Syntax -@Accessor{mem-ref ptr type &optional offset @res{} object} - -@subheading Arguments and Values - -@table @var -@item ptr -A pointer. - -@item type -A foreign type. - -@item offset -An integer (in byte units). - -@item object -The value @var{ptr} points to. -@end table - -@subheading Description -@subheading Examples - -@lisp -CFFI> (with-foreign-string (ptr "Saluton") - (setf (mem-ref ptr :char 3) (char-code #\a)) - (loop for i from 0 below 8 - collect (code-char (mem-ref ptr :char i)))) -@result{} (#\S #\a #\l #\a #\t #\o #\n #\Null) -CFFI> (setq ptr-to-int (foreign-alloc :int)) -@result{} # -CFFI> (mem-ref ptr-to-int :int) -@result{} 1054619 -CFFI> (setf (mem-ref ptr-to-int :int) 1984) -@result{} 1984 -CFFI> (mem-ref ptr-to-int :int) -@result{} 1984 -@end lisp - -@subheading See Also -@seealso{mem-aref} - - -@c =================================================================== -@c NULL-POINTER - -@page -@node null-pointer, null-pointer-p, mem-ref, Pointers -@heading null-pointer -@subheading Syntax -@Function{null-pointer @res{} pointer} - -@subheading Arguments and Values - -@table @var -@item pointer -A @code{NULL} pointer. -@end table - -@subheading Description -The function @code{null-pointer} returns a null pointer. - -@subheading Examples - -@lisp -CFFI> (null-pointer) -@result{} # -CFFI> (pointerp *) -@result{} T -@end lisp - -@subheading See Also -@seealso{null-pointer-p} @* -@seealso{make-pointer} - - -@c =================================================================== -@c NULL-POINTER-P - -@page -@node null-pointer-p, pointerp, null-pointer, Pointers -@heading null-pointer-p -@subheading Syntax -@Function{null-pointer-p ptr @res{} boolean} - -@subheading Arguments and Values - -@table @var -@item ptr -A foreign pointer that may be a null pointer. - -@item boolean -@code{T} or @code{NIL}. -@end table - -@subheading Description -The function @code{null-pointer-p} returns true if @var{ptr} is a null -pointer and false otherwise. - -@subheading Examples - -@lisp -CFFI> (null-pointer-p (null-pointer)) -@result{} T -@end lisp - -@lisp -(defun contains-str-p (big little) - (not (null-pointer-p - (foreign-funcall "strstr" :string big :string little :pointer)))) - -CFFI> (contains-str-p "Popcorns" "corn") -@result{} T -CFFI> (contains-str-p "Popcorns" "salt") -@result{} NIL -@end lisp - -@subheading See Also -@seealso{null-pointer} @* -@seealso{pointerp} - - -@c =================================================================== -@c POINTERP - -@page -@node pointerp, pointer-address, null-pointer-p, Pointers -@heading pointerp -@subheading Syntax -@Function{pointerp ptr @res{} boolean} - -@subheading Arguments and Values - -@table @var -@item ptr -An object that may be a foreign pointer. - -@item boolean -@code{T} or @code{NIL}. -@end table - -@subheading Description -The function @code{pointerp} returns true if @var{ptr} is a foreign -pointer and false otherwise. - -@subheading Implementation-specific Notes -In Allegro CL, foreign pointers are integers thus in this -implementation @code{pointerp} will return true for any ordinary integer. - -@subheading Examples - -@lisp -CFFI> (foreign-alloc 32) -@result{} # -CFFI> (pointerp *) -@result{} T -CFFI> (pointerp "this is not a pointer") -@result{} NIL -@end lisp - -@subheading See Also -@seealso{make-pointer} -@seealso{null-pointer-p} - - -@c =================================================================== -@c POINTER-ADDRESS - -@page -@node pointer-address, pointer-eq, pointerp, Pointers -@heading pointer-address -@subheading Syntax -@Function{pointer-address ptr @res{} address} - -@subheading Arguments and Values - -@table @var -@item ptr -A foreign pointer. - -@item address -An integer. -@end table - -@subheading Description -The function @code{pointer-address} will return the @var{address} of -a foreign pointer @var{ptr}. - -@subheading Examples - -@lisp -CFFI> (pointer-address (null-pointer)) -@result{} 0 -CFFI> (pointer-address (make-pointer 123)) -@result{} 123 -@end lisp - -@subheading See Also -@seealso{make-pointer} @* -@seealso{inc-pointer} @* -@seealso{null-pointer} @* -@seealso{null-pointer-p} @* -@seealso{pointerp} @* -@seealso{pointer-eq} @* -@seealso{mem-ref} - - -@c =================================================================== -@c POINTER-EQ - -@page -@node pointer-eq, with-foreign-object, pointer-address, Pointers -@heading pointer-eq -@subheading Syntax -@Function{pointer-eq ptr1 ptr2 @res{} boolean} - -@subheading Arguments and Values - -@table @var -@item ptr1 -@itemx ptr2 -A foreign pointer. - -@item boolean -@code{T} or @code{NIL}. -@end table - -@subheading Description -The function @code{pointer-eq} returns true if @var{ptr1} and -@var{ptr2} point to the same memory address and false otherwise. - -@subheading Implementation-specific Notes -The representation of foreign pointers varies across the various Lisp -implementations as does the behaviour of the built-in Common Lisp -equality predicates. Comparing two pointers that point to the same -address with @code{EQ} Lisps will return true on some Lisps, others require -more general predicates like @code{EQL} or @code{EQUALP} and finally -some will return false using any of these predicates. Therefore, for -portability, you should use @code{POINTER-EQ}. - -@subheading Examples -This is an example using @acronym{SBCL}, see the -implementation-specific notes above. - -@lisp -CFFI> (eql (null-pointer) (null-pointer)) -@result{} NIL -CFFI> (pointer-eq (null-pointer) (null-pointer)) -@result{} T -@end lisp - -@subheading See Also -@seealso{inc-pointer} - - -@c =================================================================== -@c WITH-FOREIGN-OBJECT - -@page -@node with-foreign-object, with-foreign-pointer, pointer-eq, Pointers -@heading with-foreign-object, with-foreign-objects -@subheading Syntax -@Macro{with-foreign-object (var type &optional count) &body body} - -@anchor{with-foreign-objects} -@Macro{with-foreign-objects (bindings) &body body} - -bindings ::= @{(var type &optional count)@}* - -@subheading Arguments and Values - -@table @var -@item var -A symbol. - -@item type -A foreign type, evaluated. - -@item count -An integer. -@end table - -@subheading Description -The macros @code{with-foreign-object} and @code{with-foreign-objects} -bind @var{var} to a pointer to @var{count} newly allocated objects -of type @var{type} during @var{body}. The buffer has dynamic extent -and may be stack allocated if supported by the host Lisp. - -@subheading Examples - -@lisp -CFFI> (with-foreign-object (array :int 10) - (dotimes (i 10) - (setf (mem-aref array :int i) (random 100))) - (loop for i below 10 - collect (mem-aref array :int i))) -@result{} (22 7 22 52 69 1 46 93 90 65) -@end lisp - -@subheading See Also -@seealso{foreign-alloc} - - -@c =================================================================== -@c WITH-FOREIGN-POINTER - -@page -@node with-foreign-pointer, , with-foreign-object, Pointers -@heading with-foreign-pointer -@subheading Syntax -@Macro{with-foreign-pointer (var size &optional size-var) &body body} - -@subheading Arguments and Values - -@table @var -@item var -@itemx size-var -A symbol. - -@item size -An integer. - -@item body -A list of forms to be executed. -@end table - -@subheading Description -The @code{with-foreign-pointer} macro, binds @var{var} to @var{size} -bytes of foreign memory during @var{body}. The pointer in @var{var} -is invalid beyond the dynamic extend of @var{body} and may be -stack-allocated if supported by the implementation. - -If @var{size-var} is supplied, it will be bound to @var{size} during -@var{body}. - -@subheading Examples - -@lisp -CFFI> (with-foreign-pointer (string 4 size) - (setf (mem-ref string :char (1- size)) 0) - (lisp-string-to-foreign "Popcorns" string size) - (loop for i from 0 below size - collect (code-char (mem-ref string :char i)))) -@result{} (#\P #\o #\p #\Null) -@end lisp - -@subheading See Also -@seealso{foreign-alloc} @* -@seealso{foreign-free} - - -@c =================================================================== -@c CHAPTER: Strings - -@node Strings, Variables, Pointers, Top -@chapter Strings - -As with many languages, Lisp and C have special support for logical -arrays of characters, going so far as to give them a special name, -``strings''. In that spirit, @cffi{} provides special support for -translating between Lisp and C strings. - -The @code{:string} type and the symbols related below also serve as an -example of what you can do portably with @cffi{}; were it not -included, you could write an equally functional @file{strings.lisp} -without referring to any implementation-specific symbols. - -@menu -Dictionary - -* *default-foreign-encoding*:: -* foreign-string-alloc:: -* foreign-string-free:: -* foreign-string-to-lisp:: -* lisp-string-to-foreign:: -* with-foreign-string:: -* with-foreign-strings:: -* with-foreign-pointer-as-string:: -@end menu - - -@c =================================================================== -@c *DEFAULT-FOREIGN-ENCODING* - -@page -@node *default-foreign-encoding*, foreign-string-alloc, Strings, Strings -@heading *default-foreign-encoding* -@subheading Syntax - -@Variable{*default-foreign-encoding*} - -@subheading Value type - -A keyword. - -@subheading Initial value - -@code{:utf-8} - -@subheading Description - -This special variable holds the default foreign encoding. - -@subheading Examples - -@lisp -CFFI> *default-foreign-encoding* -:utf-8 -CFFI> (foreign-funcall "strdup" (:string :encoding :utf-16) "foo" :string) -"f" -CFFI> (let ((*default-foreign-encoding* :utf-16)) - (foreign-funcall "strdup" (:string :encoding :utf-16) "foo" :string)) -"foo" -@end lisp - -@subheading See also - -@seealso{Other Types} (@code{:string} type) @* -@seealso{foreign-string-alloc} @* -@seealso{foreign-string-to-lisp} @* -@seealso{lisp-string-to-foreign} @* -@seealso{with-foreign-string} @* -@seealso{with-foreign-pointer-as-string} - - -@c =================================================================== -@c FOREIGN-STRING-ALLOC - -@page -@node foreign-string-alloc, foreign-string-free, *default-foreign-encoding*, Strings -@heading foreign-string-alloc -@subheading Syntax -@Function{foreign-string-alloc string &key encoding null-terminated-p @ - start end @res{} pointer} - -@subheading Arguments and Values - -@table @emph -@item @var{string} -A Lisp string. - -@item @var{encoding} -Foreign encoding. Defaults to @code{*default-foreign-encoding*}. - -@item @var{null-terminated-p} -Boolean, defaults to true. - -@item @var{start}, @var{end} -Bounding index designators of @var{string}. 0 and @code{nil}, by -default. - -@item @var{pointer} -A pointer to the newly allocated foreign string. -@end table - -@subheading Description -The @code{foreign-string-alloc} function allocates foreign memory -holding a copy of @var{string} converted using the specified -@var{encoding}. @var{Start} specifies an offset into @var{string} and -@var{end} marks the position following the last element of the foreign -string. - -This string must be freed with @code{foreign-string-free}. - -If @var{null-terminated-p} is false, the string will not be -null-terminated. - -@subheading Examples - -@lisp -CFFI> (defparameter *str* (foreign-string-alloc "Hello, foreign world!")) -@result{} # -CFFI> (foreign-funcall "strlen" :pointer *str* :int) -@result{} 21 -@end lisp - -@subheading See Also -@seealso{foreign-string-free} @* -@seealso{with-foreign-string} -@c @seealso{:string} - - -@c =================================================================== -@c FOREIGN-STRING-FREE - -@page -@node foreign-string-free, foreign-string-to-lisp, foreign-string-alloc, Strings -@heading foreign-string-free -@subheading Syntax -@Function{foreign-string-free pointer} - -@subheading Arguments and Values - -@table @var -@item pointer -A pointer to a string allocated by @code{foreign-string-alloc}. -@end table - -@subheading Description -The @code{foreign-string-free} function frees a foreign string -allocated by @code{foreign-string-alloc}. - -@subheading Examples - -@subheading See Also -@seealso{foreign-string-alloc} - - -@c =================================================================== -@c FOREIGN-STRING-TO-LISP - -@page -@node foreign-string-to-lisp, lisp-string-to-foreign, foreign-string-free, Strings -@heading foreign-string-to-lisp -@subheading Syntax -@Function{foreign-string-to-lisp ptr &key offset count max-chars @ - encoding @res{} string} - -@subheading Arguments and Values - -@table @var -@item ptr -A pointer. - -@item offset -An integer greater than or equal to 0. Defauls to 0. - -@item count -Either @code{nil} (the default), or an integer greater than or equal to 0. - -@item max-chars -An integer greater than or equal to 0. -@code{(1- array-total-size-limit)}, by default. - -@item encoding -Foreign encoding. Defaults to @code{*default-foreign-encoding*}. - -@item string -A Lisp string. -@end table - -@subheading Description -The @code{foreign-string-to-lisp} function converts at most -@var{count} octets from @var{ptr} into a Lisp string, using the -defined @var{encoding}. - -If @var{count} is @code{nil} (the default), characters are copied -until @var{max-chars} is reached or a @code{NULL} character is found. - -If @var{ptr} is a null pointer, returns @code{nil}. - -Note that the @code{:string} type will automatically convert between -Lisp strings and foreign strings. - -@subheading Examples - -@lisp -CFFI> (foreign-funcall "getenv" :string "HOME" :pointer) -@result{} # -CFFI> (foreign-string-to-lisp *) -@result{} "/Users/luis" -@end lisp - -@subheading See Also -@seealso{lisp-string-to-foreign} @* -@seealso{foreign-string-alloc} -@c @seealso{:string} - - -@c =================================================================== -@c LISP-STRING-TO-FOREIGN - -@page -@node lisp-string-to-foreign, with-foreign-string, foreign-string-to-lisp, Strings -@heading lisp-string-to-foreign -@subheading Syntax -@Function{lisp-string-to-foreign string buffer bufsize &key start @ - end offset encoding @res{} buffer} - -@subheading Arguments and Values - -@table @emph -@item @var{string} -A Lisp string. - -@item @var{buffer} -A foreign pointer. - -@item @var{bufsize} -An integer. - -@item @var{start}, @var{end} -Bounding index designators of @var{string}. 0 and @code{nil}, by -default. - -@item @var{offset} -An integer greater than or equal to 0. Defauls to 0. - -@item @var{encoding} -Foreign encoding. Defaults to @code{*default-foreign-encoding*}. -@end table - -@subheading Description -The @code{lisp-string-to-foreign} function copies at most -@var{bufsize}-1 octets from a Lisp @var{string} using the specified -@var{encoding} into @var{buffer}+@var{offset}. The foreign string will -be null-terminated. - -@var{Start} specifies an offset into @var{string} and -@var{end} marks the position following the last element of the foreign -string. - -@subheading Examples - -@lisp -CFFI> (with-foreign-pointer-as-string (str 255) - (lisp-string-to-foreign "Hello, foreign world!" str 6)) -@result{} "Hello" -@end lisp - -@subheading See Also -@seealso{foreign-string-alloc} @* -@seealso{foreign-string-to-lisp} @* -@seealso{with-foreign-pointer-as-string} - - -@c =================================================================== -@c WITH-FOREIGN-STRING - -@page -@node with-foreign-string, with-foreign-pointer-as-string, lisp-string-to-foreign, Strings -@heading with-foreign-string, with-foreign-strings -@subheading Syntax -@Macro{with-foreign-string (var-or-vars string &rest args) &body body} - -@anchor{with-foreign-strings} -@Macro{with-foreign-strings (bindings) &body body} - -var-or-vars ::= var | (var &optional octet-size-var) -bindings ::= @{(var-or-vars string &rest args)@}* - -@subheading Arguments and Values - -@table @emph -@item @var{var}, @var{byte-size-var} -A symbol. - -@item @var{string} -A Lisp string. - -@item @var{body} -A list of forms to be executed. -@end table - -@subheading Description -The @code{with-foreign-string} macro will bind @var{var} to a newly -allocated foreign string containing @var{string}. @var{Args} is passed -to the underlying @code{foreign-string-alloc} call. - -If @var{octet-size-var} is provided, it will be bound the length of -foreign string in octets including the null terminator. - -@subheading Examples - -@lisp -CFFI> (with-foreign-string (foo "12345") - (foreign-funcall "strlen" :pointer foo :int)) -@result{} 5 - -CFFI> (let ((array (coerce #(84 117 114 97 110 103 97) - '(array (unsigned-byte 8))))) - (with-foreign-string (foreign-string array) - (foreign-string-to-lisp foreign-string))) -@result{} "Turanga" -@end lisp - -@subheading See Also -@seealso{foreign-string-alloc} @* -@seealso{with-foreign-pointer-as-string} - - -@c =================================================================== -@c WITH-FOREIGN-POINTER-AS-STRING - -@page -@node with-foreign-pointer-as-string, , with-foreign-string, Strings -@heading with-foreign-pointer-as-string -@subheading Syntax -@Macro{with-foreign-pointer-as-string (var size &optional size-var @ - &rest args) &body body @res{} string} - -@subheading Arguments and Values - -@table @var -@item var -A symbol. - -@item string -A Lisp string. - -@item body -List of forms to be executed. -@end table - -@subheading Description -The @code{with-foreign-pointer-as-string} macro is similar to -@code{with-foreign-pointer} except that @var{var} is used as the -returned value of an implicit @code{progn} around @var{body}, after -being converted to a Lisp string using the provided @var{args}. - -@subheading Examples - -@lisp -CFFI> (with-foreign-pointer-as-string (str 6 str-size :encoding :ascii) - (lisp-string-to-foreign "Hello, foreign world!" str str-size)) -@result{} "Hello" -@end lisp - -@subheading See Also -@seealso{foreign-string-alloc} @* -@seealso{with-foreign-string} - - -@c =================================================================== -@c CHAPTER: Variables - -@node Variables, Functions, Strings, Top -@chapter Variables - -@menu -Dictionary - -* defcvar:: -* get-var-pointer:: -@end menu - - -@c =================================================================== -@c DEFCVAR - -@page -@node defcvar, get-var-pointer, Variables, Variables -@heading defcvar -@subheading Syntax -@Macro{defcvar name-and-options type &optional documentation @res{} lisp-name} - -@var{name-and-options} ::= name | (name &key read-only (library :default)) @* -@var{name} ::= lisp-name [foreign-name] | foreign-name [lisp-name] - -@subheading Arguments and Values - -@table @var -@item foreign-name -A string denoting a foreign function. - -@item lisp-name -A symbol naming the Lisp function to be created. - -@item type -A foreign type. - -@item read-only -A boolean. - -@item documentation -A Lisp string; not evaluated. -@end table - -@subheading Description -The @code{defcvar} macro defines a symbol macro @var{lisp-name} that looks -up @var{foreign-name} and dereferences it acording to @var{type}. It -can also be @code{setf}ed, unless @var{read-only} is true, in which -case an error will be signaled. - -When one of @var{lisp-name} or @var{foreign-name} is omitted, the -other is automatically derived using the following rules: - -@itemize -@item -Foreign names are converted to Lisp names by uppercasing, replacing -underscores with hyphens, and wrapping around asterisks. -@item -Lisp names are converted to foreign names by lowercasing, replacing -hyphens with underscores, and removing asterisks, if any. -@end itemize - -@subheading Examples - -@lisp -CFFI> (defcvar "errno" :int) -@result{} *ERRNO* -CFFI> (foreign-funcall "strerror" :int *errno* :string) -@result{} "Inappropriate ioctl for device" -CFFI> (setf *errno* 1) -@result{} 1 -CFFI> (foreign-funcall "strerror" :int *errno* :string) -@result{} "Operation not permitted" -@end lisp - -Trying to modify a read-only foreign variable: - -@lisp -CFFI> (defcvar ("errno" +error-number+ :read-only t) :int) -@result{} +ERROR-NUMBER+ -CFFI> (setf +error-number+ 12) -;; @lispcmt{@error{} Trying to modify read-only foreign var: +ERROR-NUMBER+.} -@end lisp - -@emph{Note that accessing @code{errno} this way won't work with every -implementation of the C standard library.} - -@subheading See Also -@seealso{get-var-pointer} - - -@c =================================================================== -@c GET-VAR-POINTER - -@page -@node get-var-pointer, , defcvar, Variables -@heading get-var-pointer -@subheading Syntax -@Function{get-var-pointer symbol @res{} pointer} - -@subheading Arguments and Values - -@table @var -@item symbol -A symbol denoting a foreign variable defined with @code{defcvar}. - -@item pointer -A foreign pointer. -@end table - -@subheading Description -The function @code{get-var-pointer} will return a @var{pointer} to the -foreign global variable @var{symbol} previously defined with -@code{defcvar}. - -@subheading Examples - -@lisp -CFFI> (defcvar "errno" :int :read-only t) -@result{} *ERRNO* -CFFI> *errno* -@result{} 25 -CFFI> (get-var-pointer '*errno*) -@result{} # -CFFI> (mem-ref * :int) -@result{} 25 -@end lisp - -@subheading See Also -@seealso{defcvar} - - -@c =================================================================== -@c CHAPTER: Functions - -@node Functions, Libraries, Variables, Top -@chapter Functions - -@menu -@c * Defining Foreign Functions:: -@c * Calling Foreign Functions:: - -Dictionary - -* defcfun:: -* foreign-funcall:: -* foreign-funcall-pointer:: -* foreign-funcall-varargs:: -* foreign-funcall-pointer-varargs:: -* translate-camelcase-name:: -* translate-name-from-foreign:: -* translate-name-to-foreign:: -* translate-underscore-separated-name:: -@end menu - -@c @node Calling Foreign Functions -@c @section Calling Foreign Functions - -@c @node Defining Foreign Functions -@c @section Defining Foreign Functions - - -@c =================================================================== -@c DEFCFUN - -@page -@node defcfun, foreign-funcall, Functions, Functions -@heading defcfun -@subheading Syntax -@Macro{defcfun name-and-options return-type &body [docstring] arguments [&rest] @ - @res{} lisp-name} - -@var{name-and-options} ::= @var{name} | (@var{name} &key @var{library} @var{convention}) @* -@var{name} ::= @var{lisp-name} [@var{foreign-name}] | @var{foreign-name} [@var{lisp-name}] @* -@var{arguments} ::= @{ (@var{arg-name} @var{arg-type}) @}* @* - -@subheading Arguments and Values - -@table @var -@item foreign-name -A string denoting a foreign function. - -@item lisp-name -A symbol naming the Lisp function to be created. - -@item arg-name -A symbol. - -@item return-type -@itemx arg-type -A foreign type. - -@item convention -One of @code{:cdecl} (default) or @code{:stdcall}. - -@item library -A symbol designating a foreign library. - -@item docstring -A documentation string. -@end table - -@subheading Description -The @code{defcfun} macro provides a declarative interface for defining -Lisp functions that call foreign functions. - -When one of @var{lisp-name} or @var{foreign-name} is omitted, the -other is automatically derived using the following rules: - -@itemize -@item -Foreign names are converted to Lisp names by uppercasing and replacing -underscores with hyphens. -@item -Lisp names are converted to foreign names by lowercasing and replacing -hyphens with underscores. -@end itemize - -If you place the symbol @code{&rest} in the end of the argument list -after the fixed arguments, @code{defcfun} will treat the foreign -function as a @strong{variadic function}. The variadic arguments -should be passed in a way similar to what @code{foreign-funcall} would -expect. Unlike @code{foreign-funcall} though, @code{defcfun} will take -care of doing argument promotion. Note that in this case -@code{defcfun} will generate a Lisp @emph{macro} instead of a -function and will only work for Lisps that support -@code{foreign-funcall.} - -If a foreign structure is to be passed or returned by value (that is, -the type is of the form @code{(:struct ...)}), then the cffi-libffi system -must be loaded, which in turn depends on -@uref{http://sourceware.org/libffi/,libffi}, including the header files. -Failure to load that system will result in an error. -Variadic functions cannot at present accept or return structures by -value. - -@subheading Examples - -@lisp -(defcfun "strlen" :int - "Calculate the length of a string." - (n :string)) - -CFFI> (strlen "123") -@result{} 3 -@end lisp - -@lisp -(defcfun ("abs" c-abs) :int (n :int)) - -CFFI> (c-abs -42) -@result{} 42 -@end lisp - -Function without arguments: - -@lisp -(defcfun "rand" :int) - -CFFI> (rand) -@result{} 1804289383 -@end lisp - -Variadic function example: - -@lisp -(defcfun "sprintf" :int - (str :pointer) - (control :string) - &rest) - -CFFI> (with-foreign-pointer-as-string (s 100) - (sprintf s "%c %d %.2f %s" :char 90 :short 42 :float pi - :string "super-locrian")) -@result{} "A 42 3.14 super-locrian" -@end lisp - -@subheading See Also -@seealso{foreign-funcall} @* -@seealso{foreign-funcall-pointer} @* -@seealso{foreign-funcall-varargs} @* -@seealso{foreign-funcall-pointer-varargs} - - -@c =================================================================== -@c FOREIGN-FUNCALL - -@page -@node foreign-funcall, foreign-funcall-pointer, defcfun, Functions -@heading foreign-funcall -@subheading Syntax -@Macro{foreign-funcall name-and-options &rest arguments @res{} return-value} - -@var{arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* -@var{name-and-options} ::= @var{name} | (@var{name} &key @var{library} @var{convention}) @* - -@subheading Arguments and Values - -@table @var -@item name -A Lisp string. - -@item arg-type -A foreign type. - -@item arg -An argument of type @var{arg-type}. - -@item return-type -A foreign type, @code{:void} by default. - -@item return-value -A lisp object. - -@item library -A lisp symbol; not evaluated. - -@item convention -One of @code{:cdecl} (default) or @code{:stdcall}. -@end table - -@subheading Description -The @code{foreign-funcall} macro is the main primitive for calling -foreign functions. - -If a foreign structure is to be passed or returned by value (that is, -the type is of the form @code{(:struct ...)}), then the cffi-libffi system -must be loaded, which in turn depends on -@uref{http://sourceware.org/libffi/,libffi}, including the header files. -Failure to load that system will result in an error. -Variadic functions cannot at present accept or return structures by -value. - -@emph{Note: The return value of foreign-funcall on functions with a -:void return type is still undefined.} - -@subheading Implementation-specific Notes -@itemize -@item -Corman Lisp does not support @code{foreign-funcall}. On -implementations that @strong{don't} support @code{foreign-funcall} -@code{cffi-sys::no-foreign-funcall} will be present in -@code{*features*}. Note: in these Lisps you can still use the -@code{defcfun} interface. -@end itemize - -@subheading Examples - -@lisp -CFFI> (foreign-funcall "strlen" :string "foo" :int) -@result{} 3 -@end lisp - -Given the C code: - -@example -void print_number(int n) -@{ - printf("N: %d\n", n); -@} -@end example - -@lisp -CFFI> (foreign-funcall "print_number" :int 123456) -@print{} N: 123456 -@result{} NIL -@end lisp - -@noindent -Or, equivalently: - -@lisp -CFFI> (foreign-funcall "print_number" :int 123456 :void) -@print{} N: 123456 -@result{} NIL -@end lisp - -@lisp -CFFI> (foreign-funcall "printf" :string (format nil "%s: %d.~%") - :string "So long and thanks for all the fish" - :int 42 :int) -@print{} So long and thanks for all the fish: 42. -@result{} 41 -@end lisp - -@subheading See Also -@seealso{defcfun} @* -@seealso{foreign-funcall-pointer} - - -@c =================================================================== -@c FOREIGN-FUNCALL-POINTER - -@page -@node foreign-funcall-pointer, foreign-funcall-varargs, foreign-funcall, Functions -@heading foreign-funcall-pointer -@subheading Syntax -@Macro{foreign-funcall-pointer pointer options &rest arguments @res{} return-value} - -@var{arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* -@var{options} ::= (&key @var{convention}) @* - -@subheading Arguments and Values - -@table @var -@item pointer -A foreign pointer. - -@item arg-type -A foreign type. - -@item arg -An argument of type @var{arg-type}. - -@item return-type -A foreign type, @code{:void} by default. - -@item return-value -A lisp object. - -@item convention -One of @code{:cdecl} (default) or @code{:stdcall}. -@end table - -@subheading Description -The @code{foreign-funcall} macro is the main primitive for calling -foreign functions. - -@emph{Note: The return value of foreign-funcall on functions with a -:void return type is still undefined.} - -@subheading Implementation-specific Notes -@itemize -@item -Corman Lisp does not support @code{foreign-funcall}. On -implementations that @strong{don't} support @code{foreign-funcall} -@code{cffi-sys::no-foreign-funcall} will be present in -@code{*features*}. Note: in these Lisps you can still use the -@code{defcfun} interface. -@end itemize - -@subheading Examples - -@lisp -CFFI> (foreign-funcall-pointer (foreign-symbol-pointer "abs") () - :int -42 :int) -@result{} 42 -@end lisp - -@subheading See Also -@seealso{defcfun} @* -@seealso{foreign-funcall} - - -@c =================================================================== -@c FOREIGN-FUNCALL-VARARGS - -@page -@node foreign-funcall-varargs, foreign-funcall-pointer-varargs, foreign-funcall-pointer, Functions -@heading foreign-funcall-varargs -@subheading Syntax -@Macro{foreign-funcall-varargs name-and-options (fixed-arguments) &rest arguments @res{} return-value} - -@var{fixed-arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* -@var{arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* -@var{name-and-options} ::= @var{name} | (@var{name} &key @var{library} @var{convention}) @* - -@subheading Arguments and Values - -@table @var -@item name -A Lisp string. - -@item arg-type -A foreign type. - -@item arg -An argument of type @var{arg-type}. - -@item return-type -A foreign type, @code{:void} by default. - -@item return-value -A lisp object. - -@item library -A lisp symbol; not evaluated. - -@item convention -One of @code{:cdecl} (default) or @code{:stdcall}. -@end table - -@subheading Description -The @code{foreign-funcall-varargs} macro is the main primitive for -calling foreign variadic functions. It behaves similarily to -@code{foreign-funcall} except @code{fixed-arguments} are distinguished -from the remaining arguments. - -@subheading Examples - -@lisp -CFFI> (with-foreign-pointer-as-string (s 100) - (setf (mem-ref s :char) 0) - (foreign-funcall-varargs - "sprintf" (:pointer s :string) "%.2f") - :double (coerce pi 'double-float) :int)) -@result{} 3.14 -@end lisp - - -@c =================================================================== -@c FOREIGN-FUNCALL-POINTER-VARARGS - -@page -@node foreign-funcall-pointer-varargs, translate-camelcase-name, foreign-funcall-varargs, Functions -@heading foreign-funcall-pointer-varargs -@subheading Syntax -@Macro{foreign-funcall-pointer-varargs pointer options (fixed-arguments) &rest arguments @res{} return-value} - -@var{fixed-arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* -@var{arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* -@var{options} ::= (&key @var{convention}) @* - -@subheading Arguments and Values - -@table @var -@item pointer -A foreign pointer. - -@item arg-type -A foreign type. - -@item arg -An argument of type @var{arg-type}. - -@item return-type -A foreign type, @code{:void} by default. - -@item return-value -A lisp object. - -@item convention -One of @code{:cdecl} (default) or @code{:stdcall}. -@end table - -@subheading Description -The @code{foreign-funcall-pointer-varargs} macro is the main primitive -for calling foreign variadic functions. It behaves similarily to -@code{foreign-funcall-pointer} except @code{fixed-arguments} are -distinguished from the remaining arguments. - -@subheading Examples - -@lisp -CFFI> (with-foreign-pointer-as-string (s 100) - (setf (mem-ref s :char) 0) - (foreign-funcall-pointer-varargs - (foreign-symbol-pointer "sprintf") () (:pointer s :string "%.2f") - :double (coerce pi 'double-float) :int)) -@result{} 3.14 -@end lisp - - -@c =================================================================== -@c TRANSLATE-CAMELCASE-NAME - -@page -@node translate-camelcase-name, translate-name-from-foreign, foreign-funcall-pointer-varargs, Functions -@heading translate-camelcase-name -@subheading Syntax -@Function{translate-camelcase-name name &key upper-initial-p special-words @res{} return-value} - -@subheading Arguments and Values - -@table @var -@item name -Either a symbol or a string. - -@item upper-initial-p -A generalized boolean. - -@item special words -A list of strings. - -@item return-value -If @var{name} is a symbol, this is a string, and vice versa. -@end table - -@subheading Description -@code{translate-camelcase-name} is a helper function for -specializations of @code{translate-name-from-foreign} and -@code{translate-name-to-foreign}. It handles the common case of -converting between foreign camelCase names and lisp -names. @var{upper-initial-p} indicates whether the first letter of the -foreign name should be uppercase. @var{special-words} is a list of -strings that should be treated atomically in translation. This list is -case-sensitive. - -@subheading Examples - -@lisp -CFFI> (translate-camelcase-name some-xml-function) -@result{} "someXmlFunction" -CFFI> (translate-camelcase-name some-xml-function :upper-initial-p t) -@result{} "SomeXmlFunction" -CFFI> (translate-camelcase-name some-xml-function :special-words '("XML")) -@result{} "someXMLFunction" -CFFI> (translate-camelcase-name "someXMLFunction") -@result{} SOME-X-M-L-FUNCTION -CFFI> (translate-camelcase-name "someXMLFunction" :special-words '("XML")) -@result{} SOME-XML-FUNCTION -@end lisp - -@subheading See Also -@seealso{translate-name-from-foreign} @* -@seealso{translate-name-to-foreign} @* -@seealso{translate-underscore-separated-name} - - -@c =================================================================== -@c TRANSLATE-NAME-FROM-FOREIGN - -@page -@node translate-name-from-foreign, translate-name-to-foreign, translate-camelcase-name, Functions -@heading translate-name-from-foreign -@subheading Syntax -@Function{translate-name-from-foreign foreign-name package &optional varp @res{} symbol} - -@subheading Arguments and Values - -@table @var -@item foreign-name -A string denoting a foreign function. - -@item package -A Lisp package - -@item varp -A generalized boolean. - -@item symbol -The Lisp symbol to be used a function name. -@end table - -@subheading Description -@code{translate-name-from-foreign} is used by @ref{defcfun} to handle -the conversion of foreign names to lisp names. By default, it -translates using @ref{translate-underscore-separated-name}. However, -you can create specialized methods on this function to make -translating more closely match the foreign library's naming -conventions. - -Specialize @var{package} on some package. This allows other packages -to load libraries with different naming conventions. - -@subheading Examples - -@lisp -CFFI> (defcfun "someXmlFunction" ...) -@result{} SOMEXMLFUNCTION -CFFI> (defmethod translate-name-from-foreign ((spec string) - (package (eql *package*)) - &optional varp) - (let ((name (translate-camelcase-name spec))) - (if varp (intern (format nil "*~a*" name)) name))) -@result{} #))> -CFFI> (defcfun "someXmlFunction" ...) -@result{} SOME-XML-FUNCTION -@end lisp - -@subheading See Also -@seealso{defcfun} @* -@seealso{translate-camelcase-name} @* -@seealso{translate-name-to-foreign} @* -@seealso{translate-underscore-separated-name} - - -@c =================================================================== -@c TRANSLATE-NAME-TO-FOREIGN - -@page -@node translate-name-to-foreign, translate-underscore-separated-name, translate-name-from-foreign, Functions -@heading translate-name-to-foreign -@subheading Syntax -@Function{translate-name-to-foreign lisp-name package &optional varp @res{} string} - -@subheading Arguments and Values - -@table @var -@item lisp-name -A symbol naming the Lisp function to be created. - -@item package -A Lisp package - -@item varp -A generalized boolean. - -@item string -The string representing the foreign function name. -@end table - -@subheading Description -@code{translate-name-to-foreign} is used by @ref{defcfun} to handle -the conversion of lisp names to foreign names. By default, it -translates using @ref{translate-underscore-separated-name}. However, -you can create specialized methods on this function to make -translating more closely match the foreign library's naming -conventions. - -Specialize @var{package} on some package. This allows other packages -to load libraries with different naming conventions. - -@subheading Examples - -@lisp -CFFI> (defcfun some-xml-function ...) -@result{} "some_xml_function" -CFFI> (defmethod translate-name-to-foreign ((spec symbol) - (package (eql *package*)) - &optional varp) - (let ((name (translate-camelcase-name spec))) - (if varp (subseq name 1 (1- (length name))) name))) -@result{} #))> -CFFI> (defcfun some-xml-function ...) -@result{} "someXmlFunction" -@end lisp - -@subheading See Also -@seealso{defcfun} @* -@seealso{translate-camelcase-name} @* -@seealso{translate-name-from-foreign} @* -@seealso{translate-underscore-separated-name} - - -@c =================================================================== -@c TRANSLATE-UNDERSCORE-SEPARATED-NAME - -@page -@node translate-underscore-separated-name, , translate-name-to-foreign, Functions -@heading translate-underscore-separated-name -@subheading Syntax -@Function{translate-underscore-separated-name name @res{} return-value} - -@subheading Arguments and Values - -@table @var -@item name -Either a symbol or a string. - -@item return-value -If @var{name} is a symbol, this is a string, and vice versa. -@end table - -@subheading Description -@code{translate-underscore-separated-name} is a helper function for -specializations of @ref{translate-name-from-foreign} and -@ref{translate-name-to-foreign}. It handles the common case of -converting between foreign underscore_separated names and lisp names. - -@subheading Examples - -@lisp -CFFI> (translate-underscore-separated-name some-xml-function) -@result{} "some_xml_function" -CFFI> (translate-camelcase-name "some_xml_function") -@result{} SOME-XML-FUNCTION -@end lisp - -@subheading See Also -@seealso{translate-name-from-foreign} @* -@seealso{translate-name-to-foreign} @* -@seealso{translate-camelcase-name} - - -@c =================================================================== -@c CHAPTER: Libraries - -@node Libraries, Callbacks, Functions, Top -@chapter Libraries - -@menu -* Defining a library:: -* Library definition style:: - -Dictionary - -* close-foreign-library:: Close a foreign library. -* *darwin-framework-directories*:: Search path for Darwin frameworks. -* define-foreign-library:: Explain how to load a foreign library. -* *foreign-library-directories*:: Search path for shared libraries. -* load-foreign-library:: Load a foreign library. -* load-foreign-library-error:: Signalled on failure of its namesake. -* use-foreign-library:: Load a foreign library when needed. -@end menu - - -@node Defining a library, Library definition style, Libraries, Libraries -@section Defining a library - -Almost all foreign code you might want to access exists in some kind -of shared library. The meaning of @dfn{shared library} varies among -platforms, but for our purposes, we will consider it to include -@file{.so} files on @sc{unix}, frameworks on Darwin (and derivatives -like Mac @acronym{OS X}), and @file{.dll} files on Windows. - -Bringing one of these libraries into the Lisp image is normally a -two-step process. - -@enumerate -@item -Describe to @cffi{} how to load the library at some future point, -depending on platform and other factors, with a -@code{define-foreign-library} top-level form. - -@item -Load the library so defined with either a top-level -@code{use-foreign-library} form or by calling the function -@code{load-foreign-library}. -@end enumerate - -@xref{Tutorial-Loading,, Loading foreign libraries}, for a working -example of the above two steps. - - -@node Library definition style, close-foreign-library, Defining a library, Libraries -@section Library definition style - -Looking at the @code{libcurl} library definition presented earlier, -you may ask why we did not simply do this: - -@lisp -(define-foreign-library libcurl - (t (:default "libcurl"))) -@end lisp - -@noindent -Indeed, this would work just as well on the computer on which I tested -the tutorial. There are a couple of good reasons to provide the -@file{.so}'s current version number, however. Namely, the versionless -@file{.so} is not packaged on most @sc{unix} systems along with the -actual, fully-versioned library; instead, it is included in the -``development'' package along with C headers and static @file{.a} -libraries. - -The reason @cffi{} does not try to account for this lies in the -meaning of the version numbers. A full treatment of shared library -versions is beyond this manual's scope; see @ref{Versioning,, Library -interface versions, libtool, @acronym{GNU} Libtool}, for helpful -information for the unfamiliar. For our purposes, consider that a -mismatch between the library version with which you tested and the -installed library version may cause undefined -behavior.@footnote{Windows programmers may chafe at adding a -@sc{unix}-specific clause to @code{define-foreign-library}. Instead, -ask why the Windows solution to library incompatibility is ``include -your own version of every library you use with every program''.} - -@impnote{Maybe some notes should go here about OS X, which I know -little about. --stephen} - - -@c =================================================================== -@c CLOSE-FOREIGN-LIBRARY - -@page -@node close-foreign-library, *darwin-framework-directories*, Library definition style, Libraries -@heading close-foreign-library -@subheading Syntax -@Function{close-foreign-library library @res{} success} - -@subheading Arguments and Values - -@table @var -@item library -A symbol or an instance of @code{foreign-library}. - -@item success -A Lisp boolean. -@end table - -@subheading Description - -Closes @var{library} which can be a symbol designating a library -define through @code{define-foreign-library} or an instance of -@code{foreign-library} as returned by @code{load-foreign-library}. - -@c @subheading Examples -@c @xref{Tutorial-Loading,, Loading foreign libraries}. - -@subheading See Also - -@seealso{define-foreign-library} @* -@seealso{load-foreign-library} @* -@seealso{use-foreign-library} - - -@c =================================================================== -@c *DARWIN-FRAMEWORK-DIRECTORIES* - -@page -@node *darwin-framework-directories*, define-foreign-library, close-foreign-library, Libraries -@heading *darwin-framework-directories* -@subheading Syntax - -@Variable{*darwin-framework-directories*} - -@subheading Value type - -A list, in which each element is a string, a pathname, or a simple -Lisp expression. - -@subheading Initial value - -A list containing the following, in order: an expression corresponding -to Darwin path @file{~/Library/Frameworks/}, -@code{#P"/Library/Frameworks/"}, and -@code{#P"/System/Library/Frameworks/"}. - -@subheading Description - -The meaning of ``simple Lisp expression'' is explained in -@ref{*foreign-library-directories*}. In contrast to that variable, -this is not a fallback search path; the default value described above -is intended to be a reasonably complete search path on Darwin systems. - -@subheading Examples - -@lisp -CFFI> (let ((lib (load-foreign-library '(:framework "OpenGL")))) - (foreign-library-pathname lib)) -@result{} #P"/System/Library/Frameworks/OpenGL.framework/OpenGL" -@end lisp - -@subheading See also - -@seealso{*foreign-library-directories*} @* -@seealso{define-foreign-library} - - -@c =================================================================== -@c DEFINE-FOREIGN-LIBRARY - -@page -@node define-foreign-library, *foreign-library-directories*, *darwin-framework-directories*, Libraries -@heading define-foreign-library - -@subheading Syntax - -@Macro{define-foreign-library name-and-options @{ load-clause @}* @res{} name} - -name-and-options ::= name | (name &key convention search-path) -load-clause ::= (feature library &key convention search-path) - -@subheading Arguments and Values - -@table @var -@item name -A symbol. - -@item feature -A feature expression. - -@item library -A library designator. - -@item convention -One of @code{:cdecl} (default) or @code{:stdcall} - -@item search-path -A path or list of paths where the library will be searched if not found in -system-global directories. Paths specified in a load clause take priority over -paths specified as library option, with *foreign-library-directories* having -lowest priority. -@end table - -@subheading Description - -Creates a new library designator called @var{name}. The -@var{load-clause}s describe how to load that designator when passed to -@code{load-foreign-library} or @code{use-foreign-library}. - -When trying to load the library @var{name}, the relevant function -searches the @var{load-clause}s in order for the first one where -@var{feature} evaluates to true. That happens for any of the -following situations: - -@enumerate 1 -@item -If @var{feature} is a symbol present in @code{common-lisp:*features*}. - -@item -If @var{feature} is a list, depending on @code{(first @var{feature})}, -a keyword: - -@table @code -@item :and -All of the feature expressions in @code{(rest @var{feature})} are -true. - -@item :or -At least one of the feature expressions in @code{(rest @var{feature})} -is true. - -@item :not -The feature expression @code{(second @var{feature})} is not true. -@end table - -@item -Finally, if @var{feature} is @code{t}, this @var{load-clause} is -picked unconditionally. -@end enumerate - -Upon finding the first true @var{feature}, the library loader then -loads the @var{library}. The meaning of ``library designator'' is -described in @ref{load-foreign-library}. - -Functions associated to a library defined by -@code{define-foreign-library} (e.g. through @code{defcfun}'s -@code{:library} option, will inherit the library's options. The -precedence is as follows: - -@enumerate 1 -@item -@code{defcfun}/@code{foreign-funcall} specific options; - -@item -@var{load-clause} options; - -@item -global library options (the @var{name-and-options} argument) -@end enumerate - - -@subheading Examples - -@xref{Tutorial-Loading,, Loading foreign libraries}. - - -@subheading See Also - -@seealso{close-foreign-library} @* -@seealso{load-foreign-library} - - -@c =================================================================== -@c *FOREIGN-LIBRARY-DIRECTORIES* - -@page -@node *foreign-library-directories*, load-foreign-library, define-foreign-library, Libraries -@heading *foreign-library-directories* -@subheading Syntax - -@Variable{*foreign-library-directories*} - -@subheading Value type - -A list, in which each element is a string, a pathname, or a simple -Lisp expression. - -@subheading Initial value - -The empty list. - -@subheading Description - -You should not have to use this variable. - -Most, if not all, Lisps supported by @cffi{} have a reasonable default -search algorithm for foreign libraries. For example, Lisps for -@sc{unix} usually call -@uref{http://www.opengroup.org/onlinepubs/009695399/functions/dlopen.html,, -@code{dlopen(3)}}, which in turn looks in the system library -directories. Only if that fails does @cffi{} look for the named -library file in these directories, and load it from there if found. - -Thus, this is intended to be a @cffi{}-only fallback to the library -search configuration provided by your operating system. For example, -if you distribute a foreign library with your Lisp package, you can -add the library's containing directory to this list and portably -expect @cffi{} to find it. - -A @dfn{simple Lisp expression} is intended to provide functionality -commonly used in search paths such as -@acronym{ASDF}'s@footnote{@xref{Using asdf to load systems,,, asdf, -asdf: another system definition facility}, for information on -@code{asdf:*central-registry*}.}, and is defined recursively as -follows:@footnote{See @code{mini-eval} in @file{libraries.lisp} for -the source of this definition. As is always the case with a Lisp -@code{eval}, it's easier to understand the Lisp definition than the -english.} - -@enumerate -@item -A list, whose @samp{first} is a function designator, and whose -@samp{rest} is a list of simple Lisp expressions to be evaluated and -passed to the so-designated function. The result is the result of the -function call. - -@item -A symbol, whose result is its symbol value. - -@item -Anything else evaluates to itself. -@end enumerate - -The result of evaluating the @dfn{simple Lisp expression} should yield -a @emph{designator} for a @emph{list} of @emph{pathname designators}. - -@strong{Note}: in Common Lisp, @code{#p"/foo/bar"} designates the -@emph{bar} file within the @emph{/foo} directory whereas -@code{#p"/foo/bar/"} designates the @emph{/foo/bar} directory. Keep -that in mind when customising the value of -@code{*foreign-library-directories*}. - - -@subheading Examples - -@example -$ ls -@print{} liblibli.so libli.lisp -@end example - -@noindent -In @file{libli.lisp}: - -@lisp -(pushnew #P"/home/sirian/lisp/libli/" *foreign-library-directories* - :test #'equal) - -(load-foreign-library '(:default "liblibli")) -@end lisp - -@noindent -The following example would achieve the same effect: - -@lisp -(pushnew '(merge-pathnames #p"lisp/libli/" (user-homedir-pathname)) - *foreign-library-directories* - :test #'equal) -@result{} ((MERGE-PATHNAMES #P"lisp/libli/" (USER-HOMEDIR-PATHNAME))) - -(load-foreign-library '(:default "liblibli")) -@end lisp - -@subheading See also - -@seealso{*darwin-framework-directories*} @* -@seealso{define-foreign-library} - - -@c =================================================================== -@c LOAD-FOREIGN-LIBRARY - -@page -@node load-foreign-library, load-foreign-library-error, *foreign-library-directories*, Libraries -@heading load-foreign-library -@subheading Syntax -@Function{load-foreign-library library-designator @res{} library} - -@subheading Arguments and Values - -@table @var -@item library-designator -A library designator. - -@item library-designator -An instance of @code{foreign-library}. -@end table - -@subheading Description - -Load the library indicated by @var{library-designator}. A @dfn{library -designator} is defined as follows: - -@enumerate -@item -If a symbol, is considered a name previously defined with -@code{define-foreign-library}. - -@item -If a string or pathname, passed as a namestring directly to the -implementation's foreign library loader. If that fails, search the -directories in @code{*foreign-library-directories*} with -@code{cl:probe-file}; if found, the absolute path is passed to the -implementation's loader. - -@item -If a list, the meaning depends on @code{(first @var{library})}: - -@table @code -@item :framework -The second list element is taken to be a Darwin framework name, which -is then searched in @code{*darwin-framework-directories*}, and loaded -when found. - -@item :or -Each remaining list element, itself a @dfn{library designator}, is loaded in -order, until one succeeds. - -@item :default -The name is transformed according to the platform's naming convention -to shared libraries, and the resultant string is loaded as a @dfn{library -designator}. For example, on @sc{unix}, the name is suffixed with -@file{.so}. -@end table -@end enumerate - -If the library is already loaded it will be reloaded. - -If the load fails, signal a @code{load-foreign-library-error}. - -@strong{Please note:} For system libraries, you should not need to -specify the directory containing the library. Each operating system -has its own idea of a default search path, and you should rely on it -when it is reasonable. - -@subheading Implementation-specific Notes -On ECL platforms where its dynamic FFI is not supported (ie. when -@code{:dffi} is not present in @code{*features*}), -@code{cffi:load-foreign-library} does not work and you must use ECL's -own @code{ffi:load-foreign-library} with a constant string argument. - -@subheading Examples - -@xref{Tutorial-Loading,, Loading foreign libraries}. - -@subheading See Also - -@seealso{close-foreign-library} @* -@seealso{*darwin-framework-directories*} @* -@seealso{define-foreign-library} @* -@seealso{*foreign-library-directories*} @* -@seealso{load-foreign-library-error} @* -@seealso{use-foreign-library} - - -@c =================================================================== -@c LOAD-FOREIGN-LIBRARY-ERROR - -@page -@node load-foreign-library-error, use-foreign-library, load-foreign-library, Libraries -@heading load-foreign-library-error - -@subheading Syntax - -@Condition{load-foreign-library-error} - -@subheading Class precedence list - -@code{load-foreign-library-error}, @code{error}, -@code{serious-condition}, @code{condition}, @code{t} - -@subheading Description - -Signalled when a foreign library load completely fails. The exact -meaning of this varies depending on the real conditions at work, but -almost universally, the implementation's error message is useless. -However, @cffi{} does provide the useful restarts @code{retry} and -@code{use-value}; invoke the @code{retry} restart to try loading the -foreign library again, or the @code{use-value} restart to try loading -a different foreign library designator. - -@subheading See also - -@seealso{load-foreign-library} - - -@c =================================================================== -@c USE-FOREIGN-LIBRARY - -@page -@node use-foreign-library, , load-foreign-library-error, Libraries -@heading use-foreign-library - -@subheading Syntax - -@Macro{use-foreign-library name} - -@subheading Arguments and values - -@table @var -@item name -A library designator; unevaluated. -@end table - - -@subheading Description - -@xref{load-foreign-library}, for the meaning of ``library -designator''. This is intended to be the top-level form used -idiomatically after a @code{define-foreign-library} form to go ahead -and load the library. @c ; it also sets the ``current foreign library''. -Finally, on implementations where the regular evaluation rule is -insufficient for foreign library loading, it loads it at the required -time.@footnote{Namely, @acronym{CMUCL}. See -@code{use-foreign-library} in @file{libraries.lisp} for details.} - -@c current foreign library is a concept created a few hours ago as of -@c this writing. It is not actually used yet, but probably will be. - -@subheading Examples - -@xref{Tutorial-Loading,, Loading foreign libraries}. - - -@subheading See also - -@seealso{load-foreign-library} - - -@c =================================================================== -@c CHAPTER: Callbacks - -@node Callbacks, The Groveller, Libraries, Top -@chapter Callbacks - -@menu -Dictionary - -* callback:: -* defcallback:: -* get-callback:: -@end menu - - -@c =================================================================== -@c CALLBACK - -@page -@node callback, defcallback, Callbacks, Callbacks -@heading callback -@subheading Syntax -@Macro{callback symbol @res{} pointer} - -@subheading Arguments and Values - -@table @var -@item symbol -A symbol denoting a callback. - -@item pointer -@itemx new-value -A pointer. -@end table - -@subheading Description -The @code{callback} macro is analogous to the standard CL special -operator @code{function} and will return a pointer to the callback -denoted by the symbol @var{name}. - -@subheading Examples - -@lisp -CFFI> (defcallback sum :int ((a :int) (b :int)) - (+ a b)) -@result{} SUM -CFFI> (callback sum) -@result{} # -@end lisp - -@subheading See Also -@seealso{get-callback} @* -@seealso{defcallback} - - -@c =================================================================== -@c DEFCALLBACK - -@page -@node defcallback, get-callback, callback, Callbacks -@heading defcallback -@subheading Syntax -@Macro{defcallback name-and-options return-type arguments &body body @res{} name} - -name-and-options ::= name | (name &key convention) -arguments ::= (@{ (arg-name arg-type) @}*) - -@subheading Arguments and Values - -@table @var -@item name -A symbol naming the callback created. - -@item return-type -The foreign type for the callback's return value. - -@item arg-name -A symbol. - -@item arg-type -A foreign type. - -@item convention -One of @code{:cdecl} (default) or @code{:stdcall}. -@end table - -@subheading Description -The @code{defcallback} macro defines a Lisp function that can be called -from C. The arguments passed to this function will be converted to the -appropriate Lisp representation and its return value will be converted -to its C representation. - -This Lisp function can be accessed by the @code{callback} macro or the -@code{get-callback} function. - -@strong{Portability note:} @code{defcallback} will not work correctly -on some Lisps if it's not a top-level form. - -@subheading Examples - -@lisp -(defcfun "qsort" :void - (base :pointer) - (nmemb :int) - (size :int) - (fun-compar :pointer)) - -(defcallback < :int ((a :pointer) (b :pointer)) - (let ((x (mem-ref a :int)) - (y (mem-ref b :int))) - (cond ((> x y) 1) - ((< x y) -1) - (t 0)))) - -CFFI> (with-foreign-object (array :int 10) - ;; @lispcmt{Initialize array.} - (loop for i from 0 and n in '(7 2 10 4 3 5 1 6 9 8) - do (setf (mem-aref array :int i) n)) - ;; @lispcmt{Sort it.} - (qsort array 10 (foreign-type-size :int) (callback <)) - ;; @lispcmt{Return it as a list.} - (loop for i from 0 below 10 - collect (mem-aref array :int i))) -@result{} (1 2 3 4 5 6 7 8 9 10) -@end lisp - -@subheading See Also -@seealso{callback} @* -@seealso{get-callback} - - -@c =================================================================== -@c GET-CALLBACK - -@page -@node get-callback, , defcallback, Callbacks -@heading get-callback -@subheading Syntax -@Accessor{get-callback symbol @res{} pointer} - -@subheading Arguments and Values - -@table @var -@item symbol -A symbol denoting a callback. - -@item pointer -A pointer. -@end table - -@subheading Description -This is the functional version of the @code{callback} macro. It -returns a pointer to the callback named by @var{symbol} suitable, for -example, to pass as arguments to foreign functions. - -@subheading Examples - -@lisp -CFFI> (defcallback sum :int ((a :int) (b :int)) - (+ a b)) -@result{} SUM -CFFI> (get-callback 'sum) -@result{} # -@end lisp - -@subheading See Also -@seealso{callback} @* -@seealso{defcallback} - - -@c =================================================================== -@c CHAPTER: The Groveller - -@node The Groveller, Limitations, Callbacks, Top -@chapter The Groveller - -@cffi{}-Grovel is a tool which makes it easier to write @cffi{} -declarations for libraries that are implemented in C. That is, it -grovels through the system headers, getting information about types -and structures, so you don't have to. This is especially important -for libraries which are implemented in different ways by different -vendors, such as the @sc{unix}/@sc{posix} functions. The @cffi{} -declarations are usually quite different from platform to platform, -but the information you give to @cffi{}-Grovel is the same. Hence, -much less work is required! - -If you use @acronym{ASDF}, @cffi{}-Grovel is integrated, so that it -will run automatically when your system is building. This feature was -inspired by SB-Grovel, a similar @acronym{SBCL}-specific project. -@cffi{}-Grovel can also be used without @acronym{ASDF}. - -@section Building FFIs with CFFI-Grovel - -@cffi{}-Grovel uses a specification file (*.lisp) describing the -features that need groveling. The C compiler is used to retrieve this -data and write a Lisp file (*.cffi.lisp) which contains the necessary -@cffi{} definitions to access the variables, structures, constants, and -enums mentioned in the specification. - -@c This is most similar to the SB-Grovel package, upon which it is -@c based. Unlike SB-Grovel, we do not currently support defining -@c regular foreign functions in the specification file; those are best -@c defined in normal Lisp code. - -@cffi{}-Grovel provides an @acronym{ASDF} component for handling the -necessary calls to the C compiler and resulting file management. - -@c See the included CFFI-Unix package for an example of how to -@c integrate a specification file with ASDF-built packages. - -@menu -* Groveller Syntax:: How grovel files should look like. -* Groveller ASDF Integration:: ASDF components for grovel files. -* Groveller Implementation Notes:: Implementation notes. -* Wrapper for Inline/Static Functions and Macros:: Wrapper -@end menu - -@node Groveller Syntax, Groveller ASDF Integration, The Groveller, The Groveller -@section Specification File Syntax - -The specification files are read by the normal Lisp reader, so they -have syntax very similar to normal Lisp code. In particular, -semicolon-comments and reader-macros will work as expected. - -There are several forms recognized by @cffi{}-Grovel: - -@deffn {Grovel Form} progn &rest forms - -Processes a list of forms. Useful for conditionalizing several -forms. For example: -@end deffn - -@lisp -#+freebsd -(progn - (constant (ev-enable "EV_ENABLE")) - (constant (ev-disable "EV_DISABLE"))) -@end lisp - -@deffn {Grovel Form} include &rest files - -Include the specified files (specified as strings) in the generated C -source code. -@end deffn - -@deffn {Grovel Form} in-package symbol - -Set the package to be used for the final Lisp output. -@end deffn - -@deffn {Grovel Form} ctype lisp-name size-designator - -Define a @cffi{} foreign type for the string in @var{size-designator}, -e.g. @code{(ctype :pid "pid_t")}. -@end deffn - -@deffn {Grovel Form} constant (lisp-name &rest c-names) &key type documentation optional - -Search for the constant named by the first @var{c-name} string found -to be known to the C preprocessor and define it as @var{lisp-name}. - -The @var{type} keyword argument specifies how to grovel the constant: -either @code{integer} (the default) or @code{double-float}. If -@var{optional} is true, no error will be raised if all the -@var{c-names} are unknown. If @var{lisp-name} is a keyword, the actual -constant will be a symbol of the same name interned in the current -package. -@end deffn - -@deffn {Grovel Form} feature lisp-feature-name c-name &key feature-list - -Adds @var{lisp-feature-name} to the list @var{feature-list} if the @var{c-name} -string is known to the C preprocessor. @var{feature-list} defaults -to @code{cl:*features*}. -@end deffn - -@deffn {Grovel Form} define name &optional value - -Defines an additional C preprocessor symbol, which is useful for -altering the behavior of included system headers. -@end deffn - -@deffn {Grovel Form} cc-flags &rest flags - -Adds @var{cc-flags} to the command line arguments used for the C compiler -invocation. -@end deffn - -@deffn {Grovel Form} pkg-config-cflags pkg &key optional - -Adds @var{pkg} to the command line arguments for the external program -@code{pkg-config} and runs it to retrieve the relevant include flags -used for the C compiler invocation. This syntax can be used instead of -hard-coding paths using @code{cc-flags}, and ensures that include -flags are added correctly on the build system. Assumes -@code{pkg-config} is installed and working. @var{pkg} is a string -that identifies an installed @code{pkg-config} package. See the -pkg-config manual for more information. If @var{optional} is true, -failure to execute @code{pkg-config} does @emph{not} abort -compilation. -@end deffn - -@deffn {Grovel Form} cstruct lisp-name c-name slots - -Define a @cffi{} foreign struct with the slot data specfied. Slots -are of the form @code{(lisp-name c-name &key type count (signed t))}. -@end deffn - -@deffn {Grovel Form} cunion lisp-name c-name slots - -Identical to @code{cstruct}, but defines a @cffi{} foreign union. -@end deffn - -@deffn {Grovel Form} cstruct-and-class c-name slots - -Defines a @cffi{} foreign struct, as with @code{cstruct} and defines a -@acronym{CLOS} class to be used with it. This is useful for mapping -foreign structures to application-layer code that shouldn't need to -worry about memory allocation issues. -@end deffn - -@deffn {Grovel Form} cvar namespec type &key read-only - -Defines a foreign variable of the specified type, even if that -variable is potentially a C preprocessor pseudo-variable. e.g. -@code{(cvar ("errno" errno) errno-values)}, assuming that errno-values -is an enum or equivalent to type @code{:int}. - -The @var{namespec} is similar to the one used in @ref{defcvar}. -@end deffn - -@deffn {Grovel Form} cenum name-and-opts &rest elements - -Defines a true C enum, with elements specified as @code{((lisp-name -&rest c-names) &key optional documentation)}. -@var{name-and-opts} can be either a symbol as name, or a list -@code{(name &key base-type define-constants)}. If @var{define-constants} -is non-null, a Lisp constant will be defined for each enum member. -@end deffn - -@deffn {Grovel Form} constantenum name-and-opts &rest elements - -Defines an enumeration of pre-processor constants, with elements -specified as @code{((lisp-name &rest c-names) &key optional -documentation)}. -@var{name-and-opts} can be either a symbol as name, or a list -@code{(name &key base-type define-constants)}. If @var{define-constants} -is non-null, a Lisp constant will be defined for each enum member. - -This example defines @code{:af-inet} to represent the value held by -@code{AF_INET} or @code{PF_INET}, whichever the pre-processor finds -first. Similarly for @code{:af-packet}, but no error will be -signalled if the platform supports neither @code{AF_PACKET} nor -@code{PF_PACKET}. -@end deffn - -@lisp -(constantenum address-family - ((:af-inet "AF_INET" "PF_INET") - :documentation "IPv4 Protocol family") - ((:af-local "AF_UNIX" "AF_LOCAL" "PF_UNIX" "PF_LOCAL") - :documentation "File domain sockets") - ((:af-inet6 "AF_INET6" "PF_INET6") - :documentation "IPv6 Protocol family") - ((:af-packet "AF_PACKET" "PF_PACKET") - :documentation "Raw packet access" - :optional t)) -@end lisp - -@deffn {Grovel Form} bitfield name-and-opts &rest elements - -Defines a bitfield, with elements specified as @code{((lisp-name &rest -c-names) &key optional documentation)}. @var{name-and-opts} can be either a -symbol as name, or a list @code{(name &key base-type)}. For example: -@end deffn - -@lisp -(bitfield flags-ctype - ((:flag-a "FLAG_A") - :documentation "DOCU_A") - ((:flag-b "FLAG_B" "FLAG_B_ALT") - :documentation "DOCU_B") - ((:flag-c "FLAG_C") - :documentation "DOCU_C" - :optional t)) -@end lisp - - -@c =================================================================== -@c SECTION: Groveller ASDF Integration - -@node Groveller ASDF Integration, Groveller Implementation Notes, Groveller Syntax, The Groveller -@section ASDF Integration - -An example software project might contain four files; an -@acronym{ASDF} file, a package definition file, an implementation -file, and a @cffi{}-Grovel specification file. - -The @acronym{ASDF} file defines the system and its dependencies. -Notice the use of @code{eval-when} to ensure @cffi{}-Grovel is present -and the use of @code{(cffi-grovel:grovel-file name &key cc-flags)} -instead of @code{(:file name)}. - -The @file{example-software.asd} file would look like that: - -@lisp -;;; @lispcmt{CFFI-Grovel is needed for processing grovel-file components} -(defsystem "example-software" - :defsystem-depends-on ("cffi-grovel") - :depends-on ("cffi") - :serial t - :components - ((:file "package") - (:cffi-grovel-file "example-grovelling") - (:cffi-wrapper-file "example-wrappers") - (:file "example"))) -@end lisp - -The @file{package.lisp} file would contain one or several -@code{defpackage} forms, to remove circular dependencies and make -building the project easier. Note that you may or may not want to -@code{:use} your internal package. - -@impnote{Note that it's a not a good idea to @code{:use} when names may -clash with, say, CL symbols. -Or you could use @code{uiop:define-package} and its @code{:mix} option.} - -@lisp -(defpackage #:example-internal - (:use) - (:nicknames #:exampleint)) - -(defpackage #:example-software - (:export ...) - (:use #:cl #:cffi #:exampleint)) -@end lisp - -The internal package is created by Lisp code output from the C program -written by @cffi{}-Grovel; if your specification file is -@file{exampleint.lisp}, the @file{exampleint.cffi.lisp} file will contain the -@cffi{} definitions needed by the rest of your project. -@xref{Groveller Syntax}. - -@node Groveller Implementation Notes, Wrapper for Inline/Static Functions and Macros, Groveller ASDF Integration, The Groveller -@section Implementation Notes - -@cffi{}-Grovel will generate many files that not only architecture-specific, -but also implementation-specific, and should not be distributed. -ASDF will generate these files in its output cache; -if you build with multiple architectures (e.g. with NFS/AFS home -directories) or implementations, it is critical for avoiding clashes -to keep this cache in an implementation-dependent directory (as is the -default). - -For @code{foo-internal.lisp}, the resulting @code{foo-internal.c}, -@code{foo-internal}, and @code{foo-internal.cffi.lisp} are all -platform-specific, either because of possible reader-macros in -foo-internal.lisp, or because of varying C environments on the host -system. For this reason, it is not helpful to distribute any of those -files; end users building @cffi{}-Grovel based software will need -@code{cffi}-Grovel anyway. - -@impnote{For now, after some experimentation with @sc{clisp} having no -long-long, it seems appropriate to assert that the generated @code{.c} -files are architecture and operating-system dependent, but -lisp-implementation independent. This way the same @code{.c} file -(and so the same @code{.grovel-tmp.lisp} file) will be shareable -between the implementations running on a given system.} - -@c TODO: document the new wrapper stuff. - -@node Wrapper for Inline/Static Functions and Macros, , Groveller Implementation Notes, The Groveller -@section Wrapper for Inline/Static Functions and Macros - -In a shared library, information in static/inlined functions and -macros are already removed during the compilation. Wrapper file -enables to write an uninlined function wrapping the call to them. - -A wrapper file compilation/loading proceeds as follows: -Unlike groveller which generates C code that emits lisp files -containing cffi definitions, it generates C code, compiles it as a -shared library, loads the library, generate the cffi definitions (as -lisp code) and then loads the lisp code. - -It has asdf integration similar to groveller. - -@lisp -(defsystem "example-software" - :defsystem-depends-on ("cffi-grovel") - :depends-on ("cffi") - :serial t - :components - ((:file "package") - (:cffi-grovel-file "example-grovelling") - (:cffi-wrapper-file "example-wrappers") ;; <<--- this part - (:file "example"))) -@end lisp - -@deffn {Wrapper Form} defwrapper name-and-options return-type &rest args -@end deffn - -@example -static inline int foo(int i) @{ - return 1+i; -@}; -#define bar(i) (1+(i)) -@end example - -@lisp -(in-package :mypackage) -(defwrapper ("foo" foo) :int - (i :int)) -(defwrapper ("bar" bar) :int - (i :int)) -@end lisp - -Other forms are similar to grovel files. - -@deffn {Wrapper Form} progn &rest forms - -Processes a list of forms. Useful for conditionalizing several -forms. For example: -@end deffn - -@lisp -#+freebsd -(progn - (constant (ev-enable "EV_ENABLE")) - (constant (ev-disable "EV_DISABLE"))) -@end lisp - -@deffn {Wrapper Form} include &rest files - -Include the specified files (specified as strings) in the generated C -source code. -@end deffn - -@deffn {Wrapper Form} in-package symbol - -Set the package to be used for the final Lisp output. -@end deffn - -@deffn {Wrapper Form} flags &rest flags - -Adds @var{cc-flags} to the command line arguments used for the C compiler -invocation. -@end deffn - -@deffn {Wrapper Form} proclaim &rest proclaimations -@end deffn -@deffn {Wrapper Form} declaim &rest declaimations -@end deffn - - - -@c =================================================================== -@c CHAPTER: Static Linking - -@node Static Linking, Limitations, The Groveller, Top -@chapter Static Linking - -On recent enough versions of supported implementations (currently, -GNU CLISP 2.49, CMUCL 2015-11, and SBCL 1.2.17), and with a recent -enough ASDF (3.1.2 or later), you can create a statically linked -Lisp executable image that includes all the C extensions -(wrappers and any other objects output by @code{compile-op}) -as well as your Lisp code --- or a standalone application executable. -This makes it easier to deliver your code as a single file. - -To dump a statically linked executable image, use: - -@lisp -(asdf:load-system :cffi-grovel) -(asdf:operate :static-image-op :example-software) -@end lisp - -To dump a statically linked executable standalone application, use: - -@lisp -(asdf:load-system :cffi-grovel) -(asdf:operate :static-program-op :example-software) -@end lisp - -See @uref{https://common-lisp.net/project/asdf/,,the ASDF -manual} for documentation about @code{image-op} and @code{program-op} -which are the parent operation classes that behave similarly except -they don't statically link C code. - -@impnote{There is also an operation @code{:static-runtime-op} to create the -statically linked runtime alone, but it's admittedly not very useful -except as an intermediate step dependency towards building -@code{:static-image-op} or @code{:static-program-op}.} - - - -@c =================================================================== -@c CHAPTER: Limitations - -@node Limitations, Platform-specific features, The Groveller, Top -@chapter Limitations - -These are @cffi{}'s limitations across all platforms; for information -on the warts on particular Lisp implementations, see -@ref{Implementation Support}. - -@itemize @bullet -@item -The tutorial includes a treatment of the primary, intractable -limitation of @cffi{}, or any @acronym{FFI}: that the abstractions -commonly used by C are insufficiently expressive. -@xref{Tutorial-Abstraction,, Breaking the abstraction}, for more -details. - -@end itemize - - -@node Platform-specific features, Glossary, Limitations, Top -@appendix Platform-specific features - -Whenever a backend doesn't support one of @cffi{}'s features, a -specific symbol is pushed onto @code{common-lisp:*features*}. The -meanings of these symbols follow. - -@table @var -@item cffi-sys::flat-namespace -This Lisp has a flat namespace for foreign symbols meaning that you -won't be able to load two different libraries with homograph functions -and successfully differentiate them through the @code{:library} -option to @code{defcfun}, @code{defcvar}, etc@dots{} - -@item cffi-sys::no-foreign-funcall -The macro @code{foreign-funcall} is @strong{not} available. On such -platforms, the only way to call a foreign function is through -@code{defcfun}. @xref{foreign-funcall}, and @ref{defcfun}. - -@item cffi-sys::no-long-long -The C @code{long long} type is @strong{not} available as a foreign -type. - -However, on such platforms @cffi{} provides its own implementation of -the @code{long long} type for all of operations in chapters -@ref{Foreign Types}, @ref{Pointers} and @ref{Variables}. The -functionality described in @ref{Functions} and @ref{Callbacks} will -not be available. - -32-bit Lispworks 5.0+ is an exception. In addition to the @cffi{} -implementation described above, Lispworks itself implements the -@code{long long} type for @ref{Functions}. @ref{Callbacks} are still -missing @code{long long} support, though. - -@item cffi-sys::no-stdcall -This Lisp doesn't support the @code{stdcall} calling convention. Note -that it only makes sense to support @code{stdcall} on (32-bit) x86 -platforms. - -@end table - - -@node Glossary, Comprehensive Index, Platform-specific features, Top -@appendix Glossary - -@table @dfn -@item aggregate type -A @cffi{} type for C data defined as an organization of data of simple -type; in structures and unions, which are themselves aggregate types, -they are represented by value. - -@item foreign value -This has two meanings; in any context, only one makes sense. - -When using type translators, the foreign value is the lower-level Lisp -value derived from the object passed to @code{translate-to-foreign} -(@pxref{translate-to-foreign}). This value should be a Lisp number or -a pointer (satisfies @code{pointerp}), and it can be treated like any -general Lisp object; it only completes the transformation to a true -foreign value when passed through low-level code in the Lisp -implementation, such as the foreign function caller or indirect memory -addressing combined with a data move. - -In other contexts, this refers to a value accessible by C, but which -may only be accessed through @cffi{} functions. The closest you can -get to such a foreign value is through a pointer Lisp object, which -itself counts as a foreign value in only the previous sense. - -@item simple type -A @cffi{} type that is ultimately represented as a builtin type; -@cffi{} only provides extra semantics for Lisp that are invisible to C -code or data. -@end table - -@node Comprehensive Index, , Glossary, Top -@unnumbered Index -@printindex cp - -@bye diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/cffi-sys-spec.texinfo b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/cffi-sys-spec.texinfo deleted file mode 100644 index e3ebf5c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/cffi-sys-spec.texinfo +++ /dev/null @@ -1,334 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header -@setfilename cffi-sys.info -@settitle CFFI-SYS Interface Specification - -@c Show types in the same index as the functions. -@synindex tp fn - -@copying -Copyright @copyright{} 2005-2006, James Bielman - -@quotation -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. - -@sc{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 -@end copying - -@macro impnote {text} -@emph{Implementor's note: \text\} -@end macro -@c %**end of header - -@dircategory Software development -@direntry -* CFFI Sys spec: (cffi-sys-spec). CFFI Sys spec. -@end direntry - -@titlepage -@title CFFI-SYS Interface Specification -@c @subtitle Version X.X -@c @author James Bielman - -@page -@vskip 0pt plus 1filll -@insertcopying -@end titlepage - -@contents - -@ifnottex -@node Top -@top cffi-sys -@insertcopying -@end ifnottex - -@menu -* Introduction:: -* Built-In Foreign Types:: -* Operations on Foreign Types:: -* Basic Pointer Operations:: -* Foreign Memory Allocation:: -* Memory Access:: -* Foreign Function Calling:: -* Loading Foreign Libraries:: -* Foreign Globals:: -* Symbol Index:: -@end menu - -@node Introduction -@chapter Introduction - -@acronym{CFFI}, the Common Foreign Function Interface, purports to be -a portable foreign function interface for Common Lisp. - -This specification defines a set of low-level primitives that must be -defined for each Lisp implementation supported by @acronym{CFFI}. -These operators are defined in the @code{CFFI-SYS} package. - -The @code{CFFI} package uses the @code{CFFI-SYS} interface -to implement an extensible foreign type system with support for -typedefs, structures, and unions, a declarative interface for -defining foreign function calls, and automatic conversion of -foreign function arguments to/from Lisp types. - -Please note the following conventions that apply to everything in -@code{CFFI-SYS}: - -@itemize @bullet -@item -Functions in @code{CFFI-SYS} that are low-level versions of functions -exported from the @code{CFFI} package begin with a leading -percent-sign (eg. @code{%mem-ref}). - -@item -Where ``foreign type'' is mentioned as the kind of an argument, the -meaning is restricted to that subset of all foreign types defined in -@ref{Built-In Foreign Types}. Support for higher-level types is -always defined in terms of those lower-level types in @code{CFFI} -proper. -@end itemize - - -@node Built-In Foreign Types -@chapter Built-In Foreign Types - -@deftp {Foreign Type} :char -@deftpx {Foreign Type} :unsigned-char -@deftpx {Foreign Type} :short -@deftpx {Foreign Type} :unsigned-short -@deftpx {Foreign Type} :int -@deftpx {Foreign Type} :unsigned-int -@deftpx {Foreign Type} :long -@deftpx {Foreign Type} :unsigned-long -@deftpx {Foreign Type} :long-long -@deftpx {Foreign Type} :unsigned-long-long -These types correspond to the native C integer types according to the -ABI of the system the Lisp implementation is compiled against. -@end deftp - -@deftp {Foreign Type} :int8 -@deftpx {Foreign Type} :uint8 -@deftpx {Foreign Type} :int16 -@deftpx {Foreign Type} :uint16 -@deftpx {Foreign Type} :int32 -@deftpx {Foreign Type} :uint32 -@deftpx {Foreign Type} :int64 -@deftpx {Foreign Type} :uint64 -Foreign integer types of specific sizes, corresponding to the C types -defined in @code{stdint.h}. -@end deftp - -@deftp {Foreign Type} :size -@deftpx {Foreign Type} :ssize -@deftpx {Foreign Type} :ptrdiff -@deftpx {Foreign Type} :time -Foreign integer types corresponding to the standard C types (without -the @code{_t} suffix). -@end deftp - -@impnote{I'm sure there are more of these that could be useful, let's -add any types that can't be defined portably to this list as -necessary.} - -@deftp {Foreign Type} :float -@deftpx {Foreign Type} :double -The @code{:float} type represents a C @code{float} and a Lisp -@code{single-float}. @code{:double} represents a C @code{double} and a -Lisp @code{double-float}. -@end deftp - -@deftp {Foreign Type} :pointer -A foreign pointer to an object of any type, corresponding to -@code{void *}. -@end deftp - -@deftp {Foreign Type} :void -No type at all. Only valid as the return type of a function. -@end deftp - - -@node Operations on Foreign Types -@chapter Operations on Built-in Foreign Types - -@defun %foreign-type-size type @result{} size -Return the @var{size}, in bytes, of objects having foreign type -@var{type}. An error is signalled if @var{type} is not a known -built-in foreign type. -@end defun - -@defun %foreign-type-alignment type @result{} alignment -Return the default alignment in bytes for structure members of foreign -type @var{type}. An error is signalled if @var{type} is not a known -built-in foreign type. - -@impnote{Maybe this should take an optional keyword argument specifying an -alternate alignment system, eg. :mac68k for 68000-compatible alignment -on Darwin.} -@end defun - - -@node Basic Pointer Operations -@chapter Basic Pointer Operations - -@defun pointerp ptr @result{} boolean -Return true if @var{ptr} is a foreign pointer. -@end defun - -@defun null-pointer @result{} pointer -Return a null foreign pointer. -@end defun - -@defun null-pointer-p ptr @result{} boolean -Return true if @var{ptr} is a null foreign pointer. -@end defun - -@defun make-pointer address @result{} pointer -Return a pointer corresponding to the numeric integer @var{address}. -@end defun - -@defun inc-pointer ptr offset @result{} pointer -Return the result of numerically incrementing @var{ptr} by @var{offset}. -@end defun - - -@node Foreign Memory Allocation -@chapter Foreign Memory Allocation - -@defun foreign-alloc size @result{} pointer -Allocate @var{size} bytes of foreign-addressable memory and return -a @var{pointer} to the allocated block. An implementation-specific -error is signalled if the memory cannot be allocated. -@end defun - -@defun foreign-free ptr @result{} unspecified -Free a pointer @var{ptr} allocated by @code{foreign-alloc}. The -results are undefined if @var{ptr} is used after being freed. -@end defun - -@defmac with-foreign-pointer (var size &optional size-var) &body body -Bind @var{var} to a pointer to @var{size} bytes of -foreign-accessible memory during @var{body}. Both @var{ptr} and the -memory block it points to have dynamic extent and may be stack -allocated if supported by the implementation. If @var{size-var} is -supplied, it will be bound to @var{size} during @var{body}. -@end defmac - - -@node Memory Access -@chapter Memory Access - -@deffn {Accessor} %mem-ref ptr type &optional offset -Dereference a pointer @var{offset} bytes from @var{ptr} to an object -for reading (or writing when used with @code{setf}) of built-in type -@var{type}. -@end deffn - -@heading Example - -@lisp -;; An impractical example, since time returns the time as well, -;; but it demonstrates %MEM-REF. Better (simple) examples wanted! -(with-foreign-pointer (p (foreign-type-size :time)) - (foreign-funcall "time" :pointer p :time) - (%mem-ref p :time)) -@end lisp - - -@node Foreign Function Calling -@chapter Foreign Function Calling - -@defmac %foreign-funcall name @{arg-type arg@}* &optional result-type @result{} object -@defmacx %foreign-funcall-pointer ptr @{arg-type arg@}* &optional result-type @result{} object -Invoke a foreign function called @var{name} in the foreign source code. - -Each @var{arg-type} is a foreign type specifier, followed by -@var{arg}, Lisp data to be converted to foreign data of type -@var{arg-type}. @var{result-type} is the foreign type of the -function's return value, and is assumed to be @code{:void} if not -supplied. - -@code{%foreign-funcall-pointer} takes a pointer @var{ptr} to the -function, as returned by @code{foreign-symbol-pointer}, rather than a -string @var{name}. -@end defmac - -@defmac %foreign-funcall-varargs name (@{fixed-type arg@}*) @{vararg-type arg@}* &optional result-type @result{} object -@defmacx %foreign-funcall-varargs-pointer ptr (@{fixed-type arg@}*) @{vararg-type arg@}* &optional result-type @result{} object -Invoke a foreign variadic function called @var{name} in the foreign -source code. - -Each @var{fixed-type} and @var{vararg-type} is a foreign type -specifier, followed by @var{arg}, Lisp data to be converted to foreign -data of type @var{arg-type}. @var{result-type} is the foreign type of -the function's return value, and is assumed to be @code{:void} if not -supplied. - -@code{%foreign-funcall-pointer-varargs} takes a pointer @var{ptr} to -the variadic function, as returned by @code{foreign-symbol-pointer}, -rather than a string @var{name}. - -Both functions have default implementation which call -@code{%foreign-funcall} and @code{%foreign-funcall-pointer} -approprietly. -@end defmac - -@heading Examples - -@lisp -;; Calling a standard C library function: -(%foreign-funcall "sqrtf" :float 16.0 :float) @result{} 4.0 -@end lisp - -@lisp -;; Dynamic allocation of a buffer and passing to a function: -(with-foreign-ptr (buf 255 buf-size) - (%foreign-funcall "gethostname" :pointer buf :size buf-size :int) - ;; Convert buf to a Lisp string using MAKE-STRING and %MEM-REF or - ;; a portable CFFI function such as CFFI:FOREIGN-STRING-TO-LISP. - ) -@end lisp - - -@node Loading Foreign Libraries -@chapter Loading Foreign Libraries - -@defun %load-foreign-library name @result{} unspecified -Load the foreign shared library @var{name}. - -@impnote{There is a lot of behavior to decide here. Currently I lean -toward not requiring NAME to be a full path to the library so -we can search the system library directories (maybe even get -LD_LIBRARY_PATH from the environment) as necessary.} -@end defun - - -@node Foreign Globals -@chapter Foreign Globals - -@defun foreign-symbol-pointer name @result{} pointer -Return a pointer to a foreign symbol @var{name}. -@end defun - -@node Symbol Index -@unnumbered Symbol Index -@printindex fn - -@bye diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/colorize-lisp-examples.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/colorize-lisp-examples.lisp deleted file mode 100644 index 3f37e43..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/colorize-lisp-examples.lisp +++ /dev/null @@ -1,1058 +0,0 @@ -;;; This is code was taken from lisppaste2 and is a quick hack -;;; to colorize lisp examples in the html generated by Texinfo. -;;; It is not general-purpose utility, though it could easily be -;;; turned into one. - -;;;; colorize-package.lisp - -(defpackage :colorize - (:use :common-lisp) - (:export :scan-string :format-scan :html-colorization - :find-coloring-type :autodetect-coloring-type - :coloring-types :scan :scan-any :advance :call-parent-formatter - :*coloring-css* :make-background-css :*css-background-class* - :colorize-file :colorize-file-to-stream :*version-token*)) - -;;;; coloring-css.lisp - -(in-package :colorize) - -(defparameter *coloring-css* - ".symbol { color: #770055; background-color: transparent; border: 0px; margin: 0px;} -a.symbol:link { color: #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } -a.symbol:active { color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } -a.symbol:visited { color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } -a.symbol:hover { color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } -.special { color : #FF5000; background-color : inherit; } -.keyword { color : #770000; background-color : inherit; } -.comment { color : #007777; background-color : inherit; } -.string { color : #777777; background-color : inherit; } -.character { color : #0055AA; background-color : inherit; } -.syntaxerror { color : #FF0000; background-color : inherit; } -span.paren1:hover { color : inherit; background-color : #BAFFFF; } -span.paren2:hover { color : inherit; background-color : #FFCACA; } -span.paren3:hover { color : inherit; background-color : #FFFFBA; } -span.paren4:hover { color : inherit; background-color : #CACAFF; } -span.paren5:hover { color : inherit; background-color : #CAFFCA; } -span.paren6:hover { color : inherit; background-color : #FFBAFF; } -") - -(defvar *css-background-class* "lisp-bg") - -(defun for-css (thing) - (if (symbolp thing) (string-downcase (symbol-name thing)) - thing)) - -(defun make-background-css (color &key (class *css-background-class*) (extra nil)) - (format nil ".~A { background-color: ~A; color: black; ~{~A; ~}}~:*~:*~:* -.~A:hover { background-color: ~A; color: black; ~{~A; ~}}~%" - class color - (mapcar #'(lambda (extra) - (format nil "~A : ~{~A ~}" - (for-css (first extra)) - (mapcar #'for-css (cdr extra)))) - extra))) - -;;;; colorize.lisp - -;(in-package :colorize) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defparameter *coloring-types* nil) - (defparameter *version-token* (gensym))) - -(defclass coloring-type () - ((modes :initarg :modes :accessor coloring-type-modes) - (default-mode :initarg :default-mode :accessor coloring-type-default-mode) - (transition-functions :initarg :transition-functions :accessor coloring-type-transition-functions) - (fancy-name :initarg :fancy-name :accessor coloring-type-fancy-name) - (term-formatter :initarg :term-formatter :accessor coloring-type-term-formatter) - (formatter-initial-values :initarg :formatter-initial-values :accessor coloring-type-formatter-initial-values :initform nil) - (formatter-after-hook :initarg :formatter-after-hook :accessor coloring-type-formatter-after-hook :initform (constantly "")) - (autodetect-function :initarg :autodetect-function :accessor coloring-type-autodetect-function - :initform (constantly nil)) - (parent-type :initarg :parent-type :accessor coloring-type-parent-type - :initform nil) - (visible :initarg :visible :accessor coloring-type-visible - :initform t))) - -(defun find-coloring-type (type) - (if (typep type 'coloring-type) - type - (cdr (assoc (symbol-name type) *coloring-types* :test #'string-equal :key #'symbol-name)))) - -(defun autodetect-coloring-type (name) - (car - (find name *coloring-types* - :key #'cdr - :test #'(lambda (name type) - (and (coloring-type-visible type) - (funcall (coloring-type-autodetect-function type) name)))))) - -(defun coloring-types () - (loop for type-pair in *coloring-types* - if (coloring-type-visible (cdr type-pair)) - collect (cons (car type-pair) - (coloring-type-fancy-name (cdr type-pair))))) - -(defun (setf find-coloring-type) (new-value type) - (if new-value - (let ((found (assoc type *coloring-types*))) - (if found - (setf (cdr found) new-value) - (setf *coloring-types* - (nconc *coloring-types* - (list (cons type new-value)))))) - (setf *coloring-types* (remove type *coloring-types* :key #'car)))) - -(defvar *scan-calls* 0) - -(defvar *reset-position* nil) - -(defmacro with-gensyms ((&rest names) &body body) - `(let ,(mapcar #'(lambda (name) - (list name `(make-symbol ,(symbol-name name)))) names) - ,@body)) - -(defmacro with-scanning-functions (string-param position-place mode-place mode-wait-place &body body) - (with-gensyms (num items position not-preceded-by string item new-mode until advancing) - `(labels ((advance (,num) - (setf ,position-place (+ ,position-place ,num)) - t) - (peek-any (,items &key ,not-preceded-by) - (incf *scan-calls*) - (let* ((,items (if (stringp ,items) - (coerce ,items 'list) ,items)) - (,not-preceded-by (if (characterp ,not-preceded-by) - (string ,not-preceded-by) ,not-preceded-by)) - (,position ,position-place) - (,string ,string-param)) - (let ((,item (and - (< ,position (length ,string)) - (find ,string ,items - :test #'(lambda (,string ,item) - #+nil - (format t "looking for ~S in ~S starting at ~S~%" - ,item ,string ,position) - (if (characterp ,item) - (char= (elt ,string ,position) - ,item) - (search ,item ,string :start2 ,position - :end2 (min (length ,string) - (+ ,position (length ,item)))))))))) - (if (characterp ,item) - (setf ,item (string ,item))) - (if - (if ,item - (if ,not-preceded-by - (if (>= (- ,position (length ,not-preceded-by)) 0) - (not (string= (subseq ,string - (- ,position (length ,not-preceded-by)) - ,position) - ,not-preceded-by)) - t) - t) - nil) - ,item - (progn - (and *reset-position* - (setf ,position-place *reset-position*)) - nil))))) - (scan-any (,items &key ,not-preceded-by) - (let ((,item (peek-any ,items :not-preceded-by ,not-preceded-by))) - (and ,item (advance (length ,item))))) - (peek (,item &key ,not-preceded-by) - (peek-any (list ,item) :not-preceded-by ,not-preceded-by)) - (scan (,item &key ,not-preceded-by) - (scan-any (list ,item) :not-preceded-by ,not-preceded-by))) - (macrolet ((set-mode (,new-mode &key ,until (,advancing t)) - (list 'progn - (list 'setf ',mode-place ,new-mode) - (list 'setf ',mode-wait-place - (list 'lambda (list ',position) - (list 'let (list (list '*reset-position* ',position)) - (list 'values ,until ,advancing))))))) - ,@body)))) - -(defvar *formatter-local-variables*) - -(defmacro define-coloring-type (name fancy-name &key modes default-mode transitions formatters - autodetect parent formatter-variables (formatter-after-hook '(constantly "")) - invisible) - (with-gensyms (parent-type term type string current-mode position position-foobage mode-wait new-position advance) - `(let ((,parent-type (or (find-coloring-type ,parent) - (and ,parent - (error "No such coloring type: ~S" ,parent))))) - (setf (find-coloring-type ,name) - (make-instance 'coloring-type - :fancy-name ',fancy-name - :modes (append ',modes (if ,parent-type (coloring-type-modes ,parent-type))) - :default-mode (or ',default-mode - (if ,parent-type (coloring-type-default-mode ,parent-type))) - ,@(if autodetect - `(:autodetect-function ,autodetect)) - :parent-type ,parent-type - :visible (not ,invisible) - :formatter-initial-values (lambda nil - (list* ,@(mapcar #'(lambda (e) - `(cons ',(car e) ,(second e))) - formatter-variables) - (if ,parent-type - (funcall (coloring-type-formatter-initial-values ,parent-type)) - nil))) - :formatter-after-hook (lambda nil - (symbol-macrolet ,(mapcar #'(lambda (e) - `(,(car e) (cdr (assoc ',(car e) *formatter-local-variables*)))) - formatter-variables) - (concatenate 'string - (funcall ,formatter-after-hook) - (if ,parent-type - (funcall (coloring-type-formatter-after-hook ,parent-type)) - "")))) - :term-formatter - (symbol-macrolet ,(mapcar #'(lambda (e) - `(,(car e) (cdr (assoc ',(car e) *formatter-local-variables*)))) - formatter-variables) - (lambda (,term) - (labels ((call-parent-formatter (&optional (,type (car ,term)) - (,string (cdr ,term))) - (if ,parent-type - (funcall (coloring-type-term-formatter ,parent-type) - (cons ,type ,string)))) - (call-formatter (&optional (,type (car ,term)) - (,string (cdr ,term))) - (funcall - (case (first ,type) - ,@formatters - (t (lambda (,type text) - (call-parent-formatter ,type text)))) - ,type ,string))) - (call-formatter)))) - :transition-functions - (list - ,@(loop for transition in transitions - collect (destructuring-bind (mode &rest table) transition - `(cons ',mode - (lambda (,current-mode ,string ,position) - (let ((,mode-wait (constantly nil)) - (,position-foobage ,position)) - (with-scanning-functions ,string ,position-foobage - ,current-mode ,mode-wait - (let ((*reset-position* ,position)) - (cond ,@table)) - (values ,position-foobage ,current-mode - (lambda (,new-position) - (setf ,position-foobage ,new-position) - (let ((,advance (nth-value 1 (funcall ,mode-wait ,position-foobage)))) - (values ,position-foobage ,advance))))) - ))))))))))) - -(defun full-transition-table (coloring-type-object) - (let ((parent (coloring-type-parent-type coloring-type-object))) - (if parent - (append (coloring-type-transition-functions coloring-type-object) - (full-transition-table parent)) - (coloring-type-transition-functions coloring-type-object)))) - -(defun scan-string (coloring-type string) - (let* ((coloring-type-object (or (find-coloring-type coloring-type) - (error "No such coloring type: ~S" coloring-type))) - (transitions (full-transition-table coloring-type-object)) - (result nil) - (low-bound 0) - (current-mode (coloring-type-default-mode coloring-type-object)) - (mode-stack nil) - (current-wait (constantly nil)) - (wait-stack nil) - (current-position 0) - (*scan-calls* 0)) - (flet ((finish-current (new-position new-mode new-wait &key (extend t) push pop) - (let ((to (if extend new-position current-position))) - (if (> to low-bound) - (setf result (nconc result - (list (cons (cons current-mode mode-stack) - (subseq string low-bound - to)))))) - (setf low-bound to) - (when pop - (pop mode-stack) - (pop wait-stack)) - (when push - (push current-mode mode-stack) - (push current-wait wait-stack)) - (setf current-mode new-mode - current-position new-position - current-wait new-wait)))) - (loop - (if (> current-position (length string)) - (return-from scan-string - (progn - (format *trace-output* "Scan was called ~S times.~%" - *scan-calls*) - (finish-current (length string) nil (constantly nil)) - result)) - (or - (loop for transition in - (mapcar #'cdr - (remove current-mode transitions - :key #'car - :test-not #'(lambda (a b) - (or (eql a b) - (if (listp b) - (member a b)))))) - if - (and transition - (multiple-value-bind - (new-position new-mode new-wait) - (funcall transition current-mode string current-position) - (when (> new-position current-position) - (finish-current new-position new-mode new-wait :extend nil :push t) - t))) - return t) - (multiple-value-bind - (pos advance) - (funcall current-wait current-position) - #+nil - (format t "current-wait returns ~S ~S (mode is ~S, pos is ~S)~%" pos advance current-mode current-position) - (and pos - (when (> pos current-position) - (finish-current (if advance - pos - current-position) - (car mode-stack) - (car wait-stack) - :extend advance - :pop t) - t))) - (progn - (incf current-position))) - ))))) - -(defun format-scan (coloring-type scan) - (let* ((coloring-type-object (or (find-coloring-type coloring-type) - (error "No such coloring type: ~S" coloring-type))) - (color-formatter (coloring-type-term-formatter coloring-type-object)) - (*formatter-local-variables* (funcall (coloring-type-formatter-initial-values coloring-type-object)))) - (format nil "~{~A~}~A" - (mapcar color-formatter scan) - (funcall (coloring-type-formatter-after-hook coloring-type-object))))) - -(defun encode-for-pre (string) - (declare (simple-string string)) - (let ((output (make-array (truncate (length string) 2/3) - :element-type 'character - :adjustable t - :fill-pointer 0))) - (with-output-to-string (out output) - (loop for char across string - do (case char - ((#\&) (write-string "&" out)) - ((#\<) (write-string "<" out)) - ((#\>) (write-string ">" out)) - ((#\") (write-string """ out)) - ((#\RIGHTWARDS_DOUBLE_ARROW) (write-string "⇒" out)) - (t (write-char char out))))) - (coerce output 'simple-string))) - -(defun string-substitute (string substring replacement-string) - "String substitute by Larry Hunter. Obtained from Google" - (let ((substring-length (length substring)) - (last-end 0) - (new-string "")) - (do ((next-start - (search substring string) - (search substring string :start2 last-end))) - ((null next-start) - (concatenate 'string new-string (subseq string last-end))) - (setq new-string - (concatenate 'string - new-string - (subseq string last-end next-start) - replacement-string)) - (setq last-end (+ next-start substring-length))))) - -(defun decode-from-tt (string) - (string-substitute - (string-substitute - (string-substitute - (string-substitute - (string-substitute string "&" "&") - "<" "<") - ">" ">") - "⇒" (string #\RIGHTWARDS_DOUBLE_ARROW)) - """ "\"")) - -(defun html-colorization (coloring-type string) - (format-scan coloring-type - (mapcar #'(lambda (p) - (cons (car p) - (let ((tt (encode-for-pre (cdr p)))) - (if (and (> (length tt) 0) - (char= (elt tt (1- (length tt))) #\>)) - (format nil "~A~%" tt) tt)))) - (scan-string coloring-type string)))) - -(defun colorize-file-to-stream (coloring-type input-file-name s2 &key (wrap t) (css-background "default")) - (let* ((input-file (if (pathname-type (merge-pathnames input-file-name)) - (merge-pathnames input-file-name) - (make-pathname :type "lisp" - :defaults (merge-pathnames input-file-name)))) - (*css-background-class* css-background)) - (with-open-file (s input-file :direction :input) - (let ((lines nil) - (string nil)) - (block done - (loop (let ((line (read-line s nil nil))) - (if line - (push line lines) - (return-from done))))) - (setf string (format nil "~{~A~%~}" - (nreverse lines))) - (if wrap - (format s2 - " - -
-~A -
" - *coloring-css* - (make-background-css "white") - *css-background-class* - (html-colorization coloring-type string)) - (write-string (html-colorization coloring-type string) s2)))))) - -(defun colorize-file (coloring-type input-file-name &optional output-file-name) - (let* ((input-file (if (pathname-type (merge-pathnames input-file-name)) - (merge-pathnames input-file-name) - (make-pathname :type "lisp" - :defaults (merge-pathnames input-file-name)))) - (output-file (or output-file-name - (make-pathname :type "html" - :defaults input-file)))) - (with-open-file (s2 output-file :direction :output :if-exists :supersede) - (colorize-file-to-stream coloring-type input-file-name s2)))) - -;; coloring-types.lisp - -;(in-package :colorize) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defparameter *version-token* (gensym))) - -(defparameter *symbol-characters* - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*!%$&+-1234567890") - -(defparameter *non-constituent* - '(#\space #\tab #\newline #\linefeed #\page #\return - #\" #\' #\( #\) #\, #\; #\` #\[ #\])) - -(defparameter *special-forms* - '("let" "load-time-value" "quote" "macrolet" "progn" "progv" "go" "flet" "the" - "if" "throw" "eval-when" "multiple-value-prog1" "unwind-protect" "let*" - "labels" "function" "symbol-macrolet" "block" "tagbody" "catch" "locally" - "return-from" "setq" "multiple-value-call")) - -(defparameter *common-macros* - '("loop" "cond" "lambda")) - -(defparameter *open-parens* '(#\()) -(defparameter *close-parens* '(#\))) - -(define-coloring-type :lisp "Basic Lisp" - :modes (:first-char-on-line :normal :symbol :escaped-symbol :keyword :string :comment - :multiline :character - :single-escaped :in-list :syntax-error) - :default-mode :first-char-on-line - :transitions - (((:in-list) - ((or - (scan-any *symbol-characters*) - (and (scan #\.) (scan-any *symbol-characters*)) - (and (scan #\\) (advance 1))) - (set-mode :symbol - :until (scan-any *non-constituent*) - :advancing nil)) - ((or (scan #\:) (scan "#:")) - (set-mode :keyword - :until (scan-any *non-constituent*) - :advancing nil)) - ((scan "#\\") - (let ((count 0)) - (set-mode :character - :until (progn - (incf count) - (if (> count 1) - (scan-any *non-constituent*))) - :advancing nil))) - ((scan #\") - (set-mode :string - :until (scan #\"))) - ((scan #\;) - (set-mode :comment - :until (scan #\newline))) - ((scan "#|") - (set-mode :multiline - :until (scan "|#"))) - ((scan #\() - (set-mode :in-list - :until (scan #\))))) - ((:normal :first-char-on-line) - ((scan #\() - (set-mode :in-list - :until (scan #\))))) - (:first-char-on-line - ((scan #\;) - (set-mode :comment - :until (scan #\newline))) - ((scan "#|") - (set-mode :multiline - :until (scan "|#"))) - ((advance 1) - (set-mode :normal - :until (scan #\newline)))) - (:multiline - ((scan "#|") - (set-mode :multiline - :until (scan "|#")))) - ((:symbol :keyword :escaped-symbol :string) - ((scan #\\) - (let ((count 0)) - (set-mode :single-escaped - :until (progn - (incf count) - (if (< count 2) - (advance 1)))))))) - :formatter-variables ((paren-counter 0)) - :formatter-after-hook (lambda nil - (format nil "~{~A~}" - (loop for i from paren-counter downto 1 - collect ""))) - :formatters - (((:normal :first-char-on-line) - (lambda (type s) - (declare (ignore type)) - s)) - ((:in-list) - (lambda (type s) - (declare (ignore type)) - (labels ((color-parens (s) - (let ((paren-pos (find-if-not #'null - (mapcar #'(lambda (c) - (position c s)) - (append *open-parens* - *close-parens*))))) - (if paren-pos - (let ((before-paren (subseq s 0 paren-pos)) - (after-paren (subseq s (1+ paren-pos))) - (paren (elt s paren-pos)) - (open nil) - (count 0)) - (when (member paren *open-parens* :test #'char=) - (setf count (mod paren-counter 6)) - (incf paren-counter) - (setf open t)) - (when (member paren *close-parens* :test #'char=) - (decf paren-counter)) - (if open - (format nil "~A~C~A" - before-paren - (1+ count) - paren *css-background-class* - (color-parens after-paren)) - (format nil "~A~C~A" - before-paren - paren (color-parens after-paren)))) - s)))) - (color-parens s)))) - ((:symbol :escaped-symbol) - (lambda (type s) - (declare (ignore type)) - (let* ((colon (position #\: s :from-end t)) - (new-s (or (and colon (subseq s (1+ colon))) s))) - (cond - ((or - (member new-s *common-macros* :test #'string-equal) - (member new-s *special-forms* :test #'string-equal) - (some #'(lambda (e) - (and (> (length new-s) (length e)) - (string-equal e (subseq new-s 0 (length e))))) - '("WITH-" "DEF"))) - (format nil "~A" s)) - ((and (> (length new-s) 2) - (char= (elt new-s 0) #\*) - (char= (elt new-s (1- (length new-s))) #\*)) - (format nil "~A" s)) - (t s))))) - (:keyword (lambda (type s) - (declare (ignore type)) - (format nil "~A" - s))) - ((:comment :multiline) - (lambda (type s) - (declare (ignore type)) - (format nil "~A" - s))) - ((:character) - (lambda (type s) - (declare (ignore type)) - (format nil "~A" - s))) - ((:string) - (lambda (type s) - (declare (ignore type)) - (format nil "~A" - s))) - ((:single-escaped) - (lambda (type s) - (call-formatter (cdr type) s))) - ((:syntax-error) - (lambda (type s) - (declare (ignore type)) - (format nil "~A" - s))))) - -(define-coloring-type :scheme "Scheme" - :autodetect (lambda (text) - (or - (search "scheme" text :test #'char-equal) - (search "chicken" text :test #'char-equal))) - :parent :lisp - :transitions - (((:normal :in-list) - ((scan "...") - (set-mode :symbol - :until (scan-any *non-constituent*) - :advancing nil)) - ((scan #\[) - (set-mode :in-list - :until (scan #\]))))) - :formatters - (((:in-list) - (lambda (type s) - (declare (ignore type s)) - (let ((*open-parens* (cons #\[ *open-parens*)) - (*close-parens* (cons #\] *close-parens*))) - (call-parent-formatter)))) - ((:symbol :escaped-symbol) - (lambda (type s) - (declare (ignore type)) - (let ((result (if (find-package :r5rs-lookup) - (funcall (symbol-function (intern "SYMBOL-LOOKUP" :r5rs-lookup)) - s)))) - (if result - (format nil "
~A" - result (call-parent-formatter)) - (call-parent-formatter))))))) - -(define-coloring-type :elisp "Emacs Lisp" - :autodetect (lambda (name) - (member name '("emacs") - :test #'(lambda (name ext) - (search ext name :test #'char-equal)))) - :parent :lisp - :formatters - (((:symbol :escaped-symbol) - (lambda (type s) - (declare (ignore type)) - (let ((result (if (find-package :elisp-lookup) - (funcall (symbol-function (intern "SYMBOL-LOOKUP" :elisp-lookup)) - s)))) - (if result - (format nil "~A" - result (call-parent-formatter)) - (call-parent-formatter))))))) - -(define-coloring-type :common-lisp "Common Lisp" - :autodetect (lambda (text) - (search "lisp" text :test #'char-equal)) - :parent :lisp - :transitions - (((:normal :in-list) - ((scan #\|) - (set-mode :escaped-symbol - :until (scan #\|))))) - :formatters - (((:symbol :escaped-symbol) - (lambda (type s) - (declare (ignore type)) - (let* ((colon (position #\: s :from-end t :test #'char=)) - (to-lookup (if colon (subseq s (1+ colon)) s)) - (result (if (find-package :clhs-lookup) - (funcall (symbol-function (intern "SYMBOL-LOOKUP" :clhs-lookup)) - to-lookup)))) - (if result - (format nil "~A" - result (call-parent-formatter)) - (call-parent-formatter))))))) - -(define-coloring-type :common-lisp-file "Common Lisp File" - :parent :common-lisp - :default-mode :in-list - :invisible t) - -(defvar *c-open-parens* "([{") -(defvar *c-close-parens* ")]}") - -(defvar *c-reserved-words* - '("auto" "break" "case" "char" "const" - "continue" "default" "do" "double" "else" - "enum" "extern" "float" "for" "goto" - "if" "int" "long" "register" "return" - "short" "signed" "sizeof" "static" "struct" - "switch" "typedef" "union" "unsigned" "void" - "volatile" "while" "__restrict" "_Bool")) - -(defparameter *c-begin-word* "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789") -(defparameter *c-terminators* '(#\space #\return #\tab #\newline #\. #\/ #\- #\* #\+ #\{ #\} #\( #\) #\' #\" #\[ #\] #\< #\> #\#)) - -(define-coloring-type :basic-c "Basic C" - :modes (:normal :comment :word-ish :paren-ish :string :char :single-escape :preprocessor) - :default-mode :normal - :invisible t - :transitions - ((:normal - ((scan-any *c-begin-word*) - (set-mode :word-ish - :until (scan-any *c-terminators*) - :advancing nil)) - ((scan "/*") - (set-mode :comment - :until (scan "*/"))) - ((or - (scan-any *c-open-parens*) - (scan-any *c-close-parens*)) - (set-mode :paren-ish - :until (advance 1) - :advancing nil)) - ((scan #\") - (set-mode :string - :until (scan #\"))) - ((or (scan "'\\") - (scan #\')) - (set-mode :character - :until (advance 2)))) - (:string - ((scan #\\) - (set-mode :single-escape - :until (advance 1))))) - :formatter-variables - ((paren-counter 0)) - :formatter-after-hook (lambda nil - (format nil "~{~A~}" - (loop for i from paren-counter downto 1 - collect ""))) - :formatters - ((:normal - (lambda (type s) - (declare (ignore type)) - s)) - (:comment - (lambda (type s) - (declare (ignore type)) - (format nil "~A" - s))) - (:string - (lambda (type s) - (declare (ignore type)) - (format nil "~A" - s))) - (:character - (lambda (type s) - (declare (ignore type)) - (format nil "~A" - s))) - (:single-escape - (lambda (type s) - (call-formatter (cdr type) s))) - (:paren-ish - (lambda (type s) - (declare (ignore type)) - (let ((open nil) - (count 0)) - (if (eql (length s) 1) - (progn - (when (member (elt s 0) (coerce *c-open-parens* 'list)) - (setf open t) - (setf count (mod paren-counter 6)) - (incf paren-counter)) - (when (member (elt s 0) (coerce *c-close-parens* 'list)) - (setf open nil) - (decf paren-counter) - (setf count (mod paren-counter 6))) - (if open - (format nil "~A" - (1+ count) s *css-background-class*) - (format nil "~A" - s))) - s)))) - (:word-ish - (lambda (type s) - (declare (ignore type)) - (if (member s *c-reserved-words* :test #'string=) - (format nil "~A" s) - s))) - )) - -(define-coloring-type :c "C" - :parent :basic-c - :transitions - ((:normal - ((scan #\#) - (set-mode :preprocessor - :until (scan-any '(#\return #\newline)))))) - :formatters - ((:preprocessor - (lambda (type s) - (declare (ignore type)) - (format nil "~A" s))))) - -(defvar *c++-reserved-words* - '("asm" "auto" "bool" "break" "case" - "catch" "char" "class" "const" "const_cast" - "continue" "default" "delete" "do" "double" - "dynamic_cast" "else" "enum" "explicit" "export" - "extern" "false" "float" "for" "friend" - "goto" "if" "inline" "int" "long" - "mutable" "namespace" "new" "operator" "private" - "protected" "public" "register" "reinterpret_cast" "return" - "short" "signed" "sizeof" "static" "static_cast" - "struct" "switch" "template" "this" "throw" - "true" "try" "typedef" "typeid" "typename" - "union" "unsigned" "using" "virtual" "void" - "volatile" "wchar_t" "while")) - -(define-coloring-type :c++ "C++" - :parent :c - :transitions - ((:normal - ((scan "//") - (set-mode :comment - :until (scan-any '(#\return #\newline)))))) - :formatters - ((:word-ish - (lambda (type s) - (declare (ignore type)) - (if (member s *c++-reserved-words* :test #'string=) - (format nil "~A" - s) - s))))) - -(defvar *java-reserved-words* - '("abstract" "boolean" "break" "byte" "case" - "catch" "char" "class" "const" "continue" - "default" "do" "double" "else" "extends" - "final" "finally" "float" "for" "goto" - "if" "implements" "import" "instanceof" "int" - "interface" "long" "native" "new" "package" - "private" "protected" "public" "return" "short" - "static" "strictfp" "super" "switch" "synchronized" - "this" "throw" "throws" "transient" "try" - "void" "volatile" "while")) - -(define-coloring-type :java "Java" - :parent :c++ - :formatters - ((:word-ish - (lambda (type s) - (declare (ignore type)) - (if (member s *java-reserved-words* :test #'string=) - (format nil "~A" - s) - s))))) - -(let ((terminate-next nil)) - (define-coloring-type :objective-c "Objective C" - :autodetect (lambda (text) (search "mac" text :test #'char=)) - :modes (:begin-message-send :end-message-send) - :transitions - ((:normal - ((scan #\[) - (set-mode :begin-message-send - :until (advance 1) - :advancing nil)) - ((scan #\]) - (set-mode :end-message-send - :until (advance 1) - :advancing nil)) - ((scan-any *c-begin-word*) - (set-mode :word-ish - :until (or - (and (peek-any '(#\:)) - (setf terminate-next t)) - (and terminate-next (progn - (setf terminate-next nil) - (advance 1))) - (scan-any *c-terminators*)) - :advancing nil))) - (:word-ish - #+nil - ((scan #\:) - (format t "hi~%") - (set-mode :word-ish :until (advance 1) :advancing nil) - (setf terminate-next t)))) - :parent :c++ - :formatter-variables ((is-keyword nil) (in-message-send nil)) - :formatters - ((:begin-message-send - (lambda (type s) - (setf is-keyword nil) - (setf in-message-send t) - (call-formatter (cons :paren-ish type) s))) - (:end-message-send - (lambda (type s) - (setf is-keyword nil) - (setf in-message-send nil) - (call-formatter (cons :paren-ish type) s))) - (:word-ish - (lambda (type s) - (declare (ignore type)) - (prog1 - (let ((result (if (find-package :cocoa-lookup) - (funcall (symbol-function (intern "SYMBOL-LOOKUP" :cocoa-lookup)) - s)))) - (if result - (format nil "~A" - result s) - (if (member s *c-reserved-words* :test #'string=) - (format nil "~A" s) - (if in-message-send - (if is-keyword - (format nil "~A" s) - s) - s)))) - (setf is-keyword (not is-keyword)))))))) - - -;#!/usr/bin/clisp -;#+sbcl -;(require :asdf) -;(asdf:oos 'asdf:load-op :colorize) - -(defmacro with-each-stream-line ((var stream) &body body) - (let ((eof (gensym)) - (eof-value (gensym)) - (strm (gensym))) - `(let ((,strm ,stream) - (,eof ',eof-value)) - (do ((,var (read-line ,strm nil ,eof) (read-line ,strm nil ,eof))) - ((eql ,var ,eof)) - ,@body)))) - -(defun system (control-string &rest args) - "Interpolate ARGS into CONTROL-STRING as if by FORMAT, and -synchronously execute the result using a Bourne-compatible shell, with -output to *verbose-out*. Returns the shell's exit code." - (let ((command (apply #'format nil control-string args))) - (format t "; $ ~A~%" command) - #+sbcl - (sb-impl::process-exit-code - (sb-ext:run-program - "/bin/sh" - (list "-c" command) - :input nil :output *standard-output*)) - #+(or cmucl scl) - (ext:process-exit-code - (ext:run-program - "/bin/sh" - (list "-c" command) - :input nil :output *verbose-out*)) - #+clisp ;XXX not exactly *verbose-out*, I know - (ext:run-shell-command command :output :terminal :wait t) - )) - -(defun strcat (&rest strings) - (apply #'concatenate 'string strings)) - -(defun string-starts-with (start str) - (and (>= (length str) (length start)) - (string-equal start str :end2 (length start)))) - -(defmacro string-append (outputstr &rest args) - `(setq ,outputstr (concatenate 'string ,outputstr ,@args))) - -(defconstant +indent+ 0 - "Indentation used in the examples.") - -(defun texinfo->raw-lisp (code) - "Answer CODE with spurious Texinfo output removed. For use in -preprocessing output in a @lisp block before passing to colorize." - (decode-from-tt - (with-output-to-string (output) - (do* ((last-position 0) - (next-position - #0=(search #1="" code - :start2 last-position :test #'char-equal) - #0#)) - ((eq nil next-position) - (write-string code output :start last-position)) - (write-string code output :start last-position :end next-position) - (let ((end (search #2="" code - :start2 (+ next-position (length #1#)) - :test #'char-equal))) - (assert (integerp end) () - "Missing ~A tag in HTML for @lisp block~%~ - HTML contents of block:~%~A" #2# code) - (write-string code output - :start (+ next-position (length #1#)) - :end end) - (setf last-position (+ end (length #2#)))))))) - -(defun process-file (from to) - (with-open-file (output to :direction :output :if-exists :error) - (with-open-file (input from :direction :input) - (let ((line-processor nil) - (piece-of-code '())) - (labels - ((process-line-inside-pre (line) - (cond ((string-starts-with "" line) - (with-input-from-string - (stream (colorize:html-colorization - :common-lisp - (texinfo->raw-lisp - (apply #'concatenate 'string - (nreverse piece-of-code))))) - (with-each-stream-line (cline stream) - (format output " ~A~%" cline))) - (write-line line output) - (setq piece-of-code '() - line-processor #'process-regular-line)) - (t (let ((to-append (subseq line +indent+))) - (push (if (string= "" to-append) - " " - to-append) piece-of-code) - (push (string #\Newline) piece-of-code))))) - (process-regular-line (line) - (let ((len (some (lambda (test-string) - (when (string-starts-with test-string line) - (length test-string))) - '("
"
-                                 "
"))))
-                 (cond (len
-                         (setq line-processor #'process-line-inside-pre)
-                         (write-string "
" output)
-                         (push (subseq line (+ len +indent+)) piece-of-code)
-                         (push (string #\Newline) piece-of-code))
-                       (t (write-line line output))))))
-          (setf line-processor #'process-regular-line)
-          (with-each-stream-line (line input)
-            (funcall line-processor line)))))))
-
-(defun process-dir (dir)
-  (dolist (html-file (directory dir))
-    (let* ((name (namestring html-file))
-           (temp-name (strcat name ".temp")))
-      (process-file name temp-name)
-      (system "mv ~A ~A" temp-name name))))
-
-;; (go "/tmp/doc/manual/html_node/*.html")
-
-#+clisp
-(progn
-  (assert (first ext:*args*))
-  (process-dir (first ext:*args*)))
-
-#+sbcl
-(progn
-  (assert (second sb-ext:*posix-argv*))
-  (process-dir (second sb-ext:*posix-argv*))
-  (sb-ext:quit))
diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/gendocs.sh b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/gendocs.sh
deleted file mode 100644
index b2bd343..0000000
--- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/gendocs.sh
+++ /dev/null
@@ -1,313 +0,0 @@
-#!/bin/sh
-# gendocs.sh -- generate a GNU manual in many formats.  This script is
-#   mentioned in maintain.texi.  See the help message below for usage details.
-# $Id: gendocs.sh,v 1.16 2005/05/15 00:00:08 karl Exp $
-# 
-# Copyright (C) 2003, 2004, 2005 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, 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, you can either send email to this
-# program's maintainer or write to: The Free Software Foundation,
-# Inc.; 51 Franklin Street, Fifth Floor; Boston, MA 02110-1301, USA.
-#
-# Original author: Mohit Agarwal.
-# Send bug reports and any other correspondence to bug-texinfo@gnu.org.
-
-#set -e
-
-prog="`basename \"$0\"`"
-srcdir=`pwd`
-
-scripturl="https://github.com/cffi/cffi/blob/master/doc/gendocs.sh"
-templateurl="http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs_template"
-
-: ${MAKEINFO="makeinfo"}
-: ${TEXI2DVI="texi2dvi -t @finalout"}
-: ${DVIPS="dvips"}
-: ${DOCBOOK2TXT="docbook2txt"}
-: ${DOCBOOK2HTML="docbook2html"}
-: ${DOCBOOK2PDF="docbook2pdf"}
-: ${DOCBOOK2PS="docbook2ps"}
-: ${GENDOCS_TEMPLATE_DIR="."}
-unset CDPATH
-
-rcs_revision='$Revision: 1.16 $'
-rcs_version=`set - $rcs_revision; echo $2`
-program=`echo $0 | sed -e 's!.*/!!'`
-version="gendocs.sh $rcs_version
-
-Copyright (C) 2005 Free Software Foundation, Inc.
-There is NO warranty.  You may redistribute this software
-under the terms of the GNU General Public License.
-For more information about these matters, see the files named COPYING."
-
-usage="Usage: $prog [OPTION]... PACKAGE MANUAL-TITLE
-
-Generate various output formats from PACKAGE.texinfo (or .texi or .txi) source.
-See the GNU Maintainers document for a more extensive discussion:
-  http://www.gnu.org/prep/maintain_toc.html
-
-Options:
-  -o OUTDIR   write files into OUTDIR, instead of manual/.
-  --docbook   convert to DocBook too (xml, txt, html, pdf and ps).
-  --html ARG  pass indicated ARG to makeinfo for HTML targets.
-  --help      display this help and exit successfully.
-  --version   display version information and exit successfully.
-
-Simple example: $prog emacs \"GNU Emacs Manual\"
-
-Typical sequence:
-  cd YOURPACKAGESOURCE/doc
-  wget \"$scripturl\"
-  wget \"$templateurl\"
-  $prog YOURMANUAL \"GNU YOURMANUAL - One-line description\"
-
-Output will be in a new subdirectory \"manual\" (by default, use -o OUTDIR
-to override).  Move all the new files into your web CVS tree, as
-explained in the Web Pages node of maintain.texi.
-
-MANUAL-TITLE is included as part of the HTML  of the overall
-manual/index.html file.  It should include the name of the package being
-documented.  manual/index.html is created by substitution from the file
-$GENDOCS_TEMPLATE_DIR/gendocs_template.  (Feel free to modify the
-generic template for your own purposes.)
-
-If you have several manuals, you'll need to run this script several
-times with different YOURMANUAL values, specifying a different output
-directory with -o each time.  Then write (by hand) an overall index.html
-with links to them all.
-
-You can set the environment variables MAKEINFO, TEXI2DVI, and DVIPS to
-control the programs that get executed, and GENDOCS_TEMPLATE_DIR to
-control where the gendocs_template file is looked for.
-
-Email bug reports or enhancement requests to bug-texinfo@gnu.org.
-"
-
-calcsize()
-{
-  size="`ls -ksl $1 | awk '{print $1}'`"
-  echo $size
-}
-
-outdir=manual
-html=
-PACKAGE=
-MANUAL_TITLE=
-
-while test $# -gt 0; do
-  case $1 in
-    --help) echo "$usage"; exit 0;;
-    --version) echo "$version"; exit 0;;
-    -o) shift; outdir=$1;;
-    --docbook) docbook=yes;;
-    --html) shift; html=$1;;
-    -*)
-      echo "$0: Unknown or ambiguous option \`$1'." >&2
-      echo "$0: Try \`--help' for more information." >&2
-      exit 1;;
-    *)
-      if test -z "$PACKAGE"; then
-        PACKAGE=$1
-      elif test -z "$MANUAL_TITLE"; then
-        MANUAL_TITLE=$1
-      else
-        echo "$0: extra non-option argument \`$1'." >&2
-        exit 1
-      fi;;
-  esac
-  shift
-done
-
-if test -s $srcdir/$PACKAGE.texinfo; then
-  srcfile=$srcdir/$PACKAGE.texinfo
-elif test -s $srcdir/$PACKAGE.texi; then
-  srcfile=$srcdir/$PACKAGE.texi
-elif test -s $srcdir/$PACKAGE.txi; then
-  srcfile=$srcdir/$PACKAGE.txi
-else
-  echo "$0: cannot find .texinfo or .texi or .txi for $PACKAGE in $srcdir." >&2
-  exit 1
-fi
-
-if test ! -r $GENDOCS_TEMPLATE_DIR/gendocs_template; then
-  echo "$0: cannot read $GENDOCS_TEMPLATE_DIR/gendocs_template." >&2
-  echo "$0: it is available from $templateurl." >&2
-  exit 1
-fi
-
-echo Generating output formats for $srcfile
-
-cmd="${MAKEINFO} -o $PACKAGE.info $srcfile"
-echo "Generating info files... ($cmd)"
-eval $cmd
-install-info $PACKAGE.info dir
-mkdir -p $outdir/
-tar czf $outdir/$PACKAGE.info.tar.gz $PACKAGE.info*
-info_tgz_size="`calcsize $outdir/$PACKAGE.info.tar.gz`"
-# do not mv the info files, there's no point in having them available
-# separately on the web.
-
-cmd="${TEXI2DVI} $srcfile"
-echo "Generating dvi ... ($cmd)"
-eval $cmd
-
-# now, before we compress dvi:
-echo Generating postscript...
-${DVIPS} $PACKAGE -o
-gzip -f -9 $PACKAGE.ps
-ps_gz_size="`calcsize $PACKAGE.ps.gz`"
-mv $PACKAGE.ps.gz $outdir/
-
-# compress/finish dvi:
-gzip -f -9 $PACKAGE.dvi
-dvi_gz_size="`calcsize $PACKAGE.dvi.gz`"
-mv $PACKAGE.dvi.gz $outdir/
-
-cmd="${TEXI2DVI} --pdf $srcfile"
-echo "Generating pdf ... ($cmd)"
-eval $cmd
-pdf_size="`calcsize $PACKAGE.pdf`"
-mv $PACKAGE.pdf $outdir/
-
-cmd="${MAKEINFO} -o $PACKAGE.txt --no-split --no-headers $srcfile"
-echo "Generating ASCII... ($cmd)"
-eval $cmd
-ascii_size="`calcsize $PACKAGE.txt`"
-gzip -f -9 -c $PACKAGE.txt >$outdir/$PACKAGE.txt.gz
-ascii_gz_size="`calcsize $outdir/$PACKAGE.txt.gz`"
-mv $PACKAGE.txt $outdir/
-
-# Print a SED expression that will translate references to MANUAL to
-# the proper page on gnu.org.  This is a horrible shell hack done
-# because \| in sed regexps is a GNU extension.
-monognuorg () {
-    case "$1" in
-	libtool) echo "s!$1.html!http://www.gnu.org/software/$1/manual.html!" ;;
-	*) echo "s!$1.html!http://www.gnu.org/software/$1/manual/html_mono/$1.html!" ;;
-    esac
-}
-polygnuorg () {
-    case "$1" in
-	libtool) echo 's!\.\./'"$1/.*\.html!http://www.gnu.org/software/$1/manual.html!" ;;
-	*) echo 's!\.\./'"$1!http://www.gnu.org/software/$1/manual/html_node!" ;;
-    esac
-}
-
-cmd="${MAKEINFO} --no-split --html -o $PACKAGE.html $html $srcfile"
-echo "Generating monolithic html... ($cmd)"
-rm -rf $PACKAGE.html  # in case a directory is left over
-eval $cmd
-sbcl --no-sysinit --no-userinit --load colorize-lisp-examples.lisp $PACKAGE.html
-#fix libc/libtool xrefs
-sed -e `monognuorg libc` -e `monognuorg libtool` $PACKAGE.html >$outdir/$PACKAGE.html
-rm $PACKAGE.html
-html_mono_size="`calcsize $outdir/$PACKAGE.html`"
-gzip -f -9 -c $outdir/$PACKAGE.html >$outdir/$PACKAGE.html.gz
-html_mono_gz_size="`calcsize $outdir/$PACKAGE.html.gz`"
-
-cmd="${MAKEINFO} --html -o $PACKAGE.html $html $srcfile"
-echo "Generating html by node... ($cmd)"
-eval $cmd
-split_html_dir=$PACKAGE.html
-sbcl --no-userinit --no-sysinit --load colorize-lisp-examples.lisp "${split_html_dir}"/\*.html
-(
-  cd ${split_html_dir} || exit 1
-  #fix libc xrefs
-  for broken_file in *.html; do
-      sed -e `polygnuorg libc` -e `polygnuorg libtool` "$broken_file" > "$broken_file".temp
-      mv -f "$broken_file".temp "$broken_file"
-  done
-  tar -czf ../$outdir/${PACKAGE}.html_node.tar.gz -- *.html
-)
-html_node_tgz_size="`calcsize $outdir/${PACKAGE}.html_node.tar.gz`"
-rm -f $outdir/html_node/*.html
-mkdir -p $outdir/html_node/
-mv ${split_html_dir}/*.html $outdir/html_node/
-rmdir ${split_html_dir}
-
-echo Making .tar.gz for sources...
-srcfiles=`ls *.texinfo *.texi *.txi *.eps 2>/dev/null`
-tar cvzfh $outdir/$PACKAGE.texi.tar.gz $srcfiles
-texi_tgz_size="`calcsize $outdir/$PACKAGE.texi.tar.gz`"
-
-if test -n "$docbook"; then
-  cmd="${MAKEINFO} -o - --docbook $srcfile > ${srcdir}/$PACKAGE-db.xml"
-  echo "Generating docbook XML... $(cmd)"
-  eval $cmd
-  docbook_xml_size="`calcsize $PACKAGE-db.xml`"
-  gzip -f -9 -c $PACKAGE-db.xml >$outdir/$PACKAGE-db.xml.gz
-  docbook_xml_gz_size="`calcsize $outdir/$PACKAGE-db.xml.gz`"
-  mv $PACKAGE-db.xml $outdir/
-
-  cmd="${DOCBOOK2HTML} -o $split_html_db_dir ${outdir}/$PACKAGE-db.xml"
-  echo "Generating docbook HTML... ($cmd)"
-  eval $cmd
-  split_html_db_dir=html_node_db
-  (
-    cd ${split_html_db_dir} || exit 1
-    tar -czf ../$outdir/${PACKAGE}.html_node_db.tar.gz -- *.html
-  )
-  html_node_db_tgz_size="`calcsize $outdir/${PACKAGE}.html_node_db.tar.gz`"
-  rm -f $outdir/html_node_db/*.html
-  mkdir -p $outdir/html_node_db
-  mv ${split_html_db_dir}/*.html $outdir/html_node_db/
-  rmdir ${split_html_db_dir}
-
-  cmd="${DOCBOOK2TXT} ${outdir}/$PACKAGE-db.xml"
-  echo "Generating docbook ASCII... ($cmd)"
-  eval $cmd
-  docbook_ascii_size="`calcsize $PACKAGE-db.txt`"
-  mv $PACKAGE-db.txt $outdir/
-
-  cmd="${DOCBOOK2PS} ${outdir}/$PACKAGE-db.xml"
-  echo "Generating docbook PS... $(cmd)"
-  eval $cmd
-  gzip -f -9 -c $PACKAGE-db.ps >$outdir/$PACKAGE-db.ps.gz
-  docbook_ps_gz_size="`calcsize $outdir/$PACKAGE-db.ps.gz`"
-  mv $PACKAGE-db.ps $outdir/
-
-  cmd="${DOCBOOK2PDF} ${outdir}/$PACKAGE-db.xml"
-  echo "Generating docbook PDF... ($cmd)"
-  eval $cmd
-  docbook_pdf_size="`calcsize $PACKAGE-db.pdf`"
-  mv $PACKAGE-db.pdf $outdir/
-fi
-
-echo Writing index file...
-curdate="`date '+%B %d, %Y'`"
-sed \
-   -e "s!%%TITLE%%!$MANUAL_TITLE!g" \
-   -e "s!%%DATE%%!$curdate!g" \
-   -e "s!%%PACKAGE%%!$PACKAGE!g" \
-   -e "s!%%HTML_MONO_SIZE%%!$html_mono_size!g" \
-   -e "s!%%HTML_MONO_GZ_SIZE%%!$html_mono_gz_size!g" \
-   -e "s!%%HTML_NODE_TGZ_SIZE%%!$html_node_tgz_size!g" \
-   -e "s!%%INFO_TGZ_SIZE%%!$info_tgz_size!g" \
-   -e "s!%%DVI_GZ_SIZE%%!$dvi_gz_size!g" \
-   -e "s!%%PDF_SIZE%%!$pdf_size!g" \
-   -e "s!%%PS_GZ_SIZE%%!$ps_gz_size!g" \
-   -e "s!%%ASCII_SIZE%%!$ascii_size!g" \
-   -e "s!%%ASCII_GZ_SIZE%%!$ascii_gz_size!g" \
-   -e "s!%%TEXI_TGZ_SIZE%%!$texi_tgz_size!g" \
-   -e "s!%%DOCBOOK_HTML_NODE_TGZ_SIZE%%!$html_node_db_tgz_size!g" \
-   -e "s!%%DOCBOOK_ASCII_SIZE%%!$docbook_ascii_size!g" \
-   -e "s!%%DOCBOOK_PS_GZ_SIZE%%!$docbook_ps_gz_size!g" \
-   -e "s!%%DOCBOOK_PDF_SIZE%%!$docbook_pdf_size!g" \
-   -e "s!%%DOCBOOK_XML_SIZE%%!$docbook_xml_size!g" \
-   -e "s!%%DOCBOOK_XML_GZ_SIZE%%!$docbook_xml_gz_size!g" \
-   -e "s,%%SCRIPTURL%%,$scripturl,g" \
-   -e "s!%%SCRIPTNAME%%!$prog!g" \
-$GENDOCS_TEMPLATE_DIR/gendocs_template >$outdir/index.html
-
-echo "Done!  See $outdir/ subdirectory for new files."
diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/gendocs_template b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/gendocs_template
deleted file mode 100644
index 5ff3351..0000000
--- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/gendocs_template
+++ /dev/null
@@ -1,259 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<!-- $Id: gendocs_template,v 1.7 2005/05/15 00:00:08 karl Exp $ -->
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-
-<!--
-
- This template was adapted from Texinfo:
- http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs_template
-
--->
-
-
-<head>
-<title>%%TITLE%%
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

%%TITLE%%

- - -
last updated %%DATE%%
- - - -
- -

This document is available in the following formats:

- - - -

(This page was generated by the %%SCRIPTNAME%% -script.)

- - - - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/mem-vector.txt b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/mem-vector.txt deleted file mode 100644 index 51b0c4f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/mem-vector.txt +++ /dev/null @@ -1,75 +0,0 @@ - -# Block Memory Operations - -Function: mem-fill ptr type count value &optional (offset 0) - -Fill COUNT objects of TYPE, starting at PTR plus offset, with VALUE. - -;; Equivalent to (but possibly more efficient than): -(loop for i below count - for off from offset by (%foreign-type-size type) - do (setf (%mem-ref ptr type off) value)) - -Function: mem-read-vector vector ptr type count &optional (offset 0) - -Copy COUNT objects of TYPE from foreign memory at PTR plus OFFSET into -VECTOR. If VECTOR is not large enough to contain COUNT objects, it -will copy as many objects as necessary to fill the vector. The -results are undefined if the foreign memory block is not large enough -to supply the data to copy. - -TYPE must be a built-in foreign type (integer, float, double, or -pointer). - -Returns the number of objects copied. - -;; Equivalent to (but possibly more efficient than): -(loop for i below (min count (length vector)) - for off from offset by (%foreign-type-size type) - do (setf (aref vector i) (%mem-ref ptr type off)) - finally (return i)) - - -Function: mem-read-c-string string ptr &optional (offset 0) - -Copy a null-terminated C string from PTR plus OFFSET into STRING, a -Lisp string. If STRING is not large enough to contain the data at PTR -it will be truncated. - -Returns the number of characters copied into STRING. - -;; Equivalent to (but possibly more efficient than): -(loop for i below (length string) - for off from offset - for char = (%mem-ref ptr :char off) - until (zerop char) - do (setf (char string i) char) - finally (return i)) - -Function: mem-write-vector vector ptr type &optional - (count (length vector)) (offset 0) - -Copy COUNT objects from VECTOR into objects of TYPE in foreign memory, -starting at PTR plus OFFSET. The results are undefined if PTR does -not point to a memory block large enough to hold the data copied. - -TYPE must be a built-in type (integer, float, double, or pointer). - -Returns the number of objects copied from VECTOR to PTR. - -;; Equivalent to (but possibly more efficient than): -(loop for i below count - for off from offset by (%foreign-type-size type) - do (setf (%mem-ref ptr type off) (aref vector i)) - finally (return i)) - - -Function: mem-write-c-string string ptr &optional (offset 0) - -Copy the characters from a Lisp STRING to PTR plus OFFSET, adding a -final null terminator at the end. The results are undefined if the -memory at PTR is not large enough to accomodate the data. - -This interface is currently equivalent to MEM-WRITE-VECTOR with a TYPE -of :CHAR, but will be useful when proper support for Unicode strings -is implemented. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/shareable-vectors.txt b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/shareable-vectors.txt deleted file mode 100644 index 7418a45..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/shareable-vectors.txt +++ /dev/null @@ -1,44 +0,0 @@ - -# Shareable Byte Vectors - -Function: make-shareable-byte-vector size - -Create a vector of element type (UNSIGNED-BYTE 8) suitable for passing -to WITH-POINTER-TO-VECTOR-DATA. - -;; Minimal implementation: -(defun make-shareable-byte-vector (size) - (make-array size :element-type '(unsigned-byte 8))) - - -Macro: with-pointer-to-vector-data (ptr-var vector) &body body - -Bind PTR-VAR to a pointer to the data contained in a shareable byte -vector. - -VECTOR must be a shareable vector created by MAKE-SHAREABLE-BYTE-VECTOR. - -PTR-VAR may point directly into the Lisp vector data, or it may point -to a temporary block of foreign memory which will be copied to and -from VECTOR. - -Both the pointer object in PTR-VAR and the memory it points to have -dynamic extent. The results are undefined if foreign code attempts to -access this memory outside this dynamic contour. - -The implementation must guarantee the memory pointed to by PTR-VAR -will not be moved during the dynamic contour of this operator, either -by creating the vector in a static area or temporarily disabling the -garbage collector. - -;; Minimal (copying) implementation: -(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) - (let ((vector-var (gensym)) - (size-var (gensym))) - `(let* ((,vector-var ,vector) - (,size-var (length ,vector-var))) - (with-foreign-ptr (,ptr-var ,size-var) - (mem-write-vector ,vector-var ,ptr :uint8) - (prog1 - (progn ,@body) - (mem-read-vector ,vector-var ,ptr-var :uint8 ,size-var)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/style.css b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/style.css deleted file mode 100644 index 87540e2..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/style.css +++ /dev/null @@ -1,48 +0,0 @@ -body {font-family: Georgia, serif; - line-height: 1.3; - padding-left: 5em; padding-right: 1em; - padding-bottom: 1em; max-width: 60em;} -table {border-collapse: collapse} -span.roman { font-family: century schoolbook, serif; font-weight: normal; } -h1, h2, h3, h4, h5, h6 {font-family: Helvetica, sans-serif} -h4 { margin-top: 2.5em; } -dfn {font-family: inherit; font-variant: italic; font-weight: bolder } -kbd {font-family: monospace; text-decoration: underline} -/*var {font-family: Helvetica, sans-serif; font-variant: slanted}*/ -var {font-variant: slanted;} -td {padding-right: 1em; padding-left: 1em} -sub {font-size: smaller} -.node {padding: 0; margin: 0} - -pre.lisp { font-family: monospace; - background-color: #F4F4F4; border: 1px solid #AAA; - padding-top: 0.5em; padding-bottom: 0.5em; } - -/* coloring */ - -.lisp-bg { background-color: #F4F4F4 ; color: black; } -.lisp-bg:hover { background-color: #F4F4F4 ; color: black; } - -.symbol { font-weight: bold; color: #770055; background-color : transparent; border: 0px; margin: 0px;} -a.symbol:link { font-weight: bold; color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } -a.symbol:active { font-weight: bold; color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } -a.symbol:visited { font-weight: bold; color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } -a.symbol:hover { font-weight: bold; color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } -.special { font-weight: bold; color: #FF5000; background-color: inherit; } -.keyword { font-weight: bold; color: #770000; background-color: inherit; } -.comment { font-weight: normal; color: #007777; background-color: inherit; } -.string { font-weight: bold; color: #777777; background-color: inherit; } -.character { font-weight: bold; color: #0055AA; background-color: inherit; } -.syntaxerror { font-weight: bold; color: #FF0000; background-color: inherit; } -span.paren1 { font-weight: bold; color: #777777; } -span.paren1:hover { color: #777777; background-color: #BAFFFF; } -span.paren2 { color: #777777; } -span.paren2:hover { color: #777777; background-color: #FFCACA; } -span.paren3 { color: #777777; } -span.paren3:hover { color: #777777; background-color: #FFFFBA; } -span.paren4 { color: #777777; } -span.paren4:hover { color: #777777; background-color: #CACAFF; } -span.paren5 { color: #777777; } -span.paren5:hover { color: #777777; background-color: #CAFFCA; } -span.paren6 { color: #777777; } -span.paren6:hover { color: #777777; background-color: #FFBAFF; } diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/examples.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/examples.lisp deleted file mode 100644 index 6093acb..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/examples.lisp +++ /dev/null @@ -1,78 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; examples.lisp --- Simple test examples of CFFI. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -(defpackage #:cffi-examples - (:use #:cl #:cffi) - (:export - #:run-examples - #:sqrtf - #:getenv)) - -(in-package #:cffi-examples) - -;; A simple libc function. -(defcfun "sqrtf" :float - (n :float)) - -;; This definition uses the STRING type translator to automatically -;; convert Lisp strings to foreign strings and vice versa. -(defcfun "getenv" :string - (name :string)) - -;; Calling a varargs function. -(defun sprintf-test () - "Test calling a varargs function." - (with-foreign-pointer-as-string ((buf buf-size) 255) - (foreign-funcall - "snprintf" :pointer buf :int buf-size - :string "%d %f #x%x!" :int 666 - :double (coerce pi 'double-float) - :unsigned-int #xcafebabe - :void))) - -;; Defining an emerated type. -(defcenum test-enum - (:invalid 0) - (:positive 1) - (:negative -1)) - -;; Use the absolute value function to test keyword/enum translation. -(defcfun ("abs" c-abs) test-enum - (n test-enum)) - -(defun cffi-version () - (asdf:component-version (asdf:find-system 'cffi))) - -(defun run-examples () - (format t "~&;;; CFFI version ~A on ~A ~A:~%" - (cffi-version) (lisp-implementation-type) - (lisp-implementation-version)) - (format t "~&;; shell: ~A~%" (getenv "SHELL")) - (format t "~&;; sprintf test: ~A~%" (sprintf-test)) - (format t "~&;; (c-abs :positive): ~A~%" (c-abs :positive)) - (format t "~&;; (c-abs :negative): ~A~%" (c-abs :negative)) - (force-output)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/gethostname.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/gethostname.lisp deleted file mode 100644 index f37d275..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/gethostname.lisp +++ /dev/null @@ -1,51 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; gethostname.lisp --- A simple CFFI example. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -;;;# CFFI Example: gethostname binding -;;; -;;; This is a very simple CFFI example that illustrates calling a C -;;; function that fills in a user-supplied string buffer. - -(defpackage #:cffi-example-gethostname - (:use #:common-lisp #:cffi) - (:export #:gethostname)) - -(in-package #:cffi-example-gethostname) - -;;; Define the Lisp function %GETHOSTNAME to call the C 'gethostname' -;;; function, which will fill BUF with up to BUFSIZE characters of the -;;; system's hostname. -(defcfun ("gethostname" %gethostname) :int - (buf :pointer) - (bufsize :int)) - -;;; Define a Lispy interface to 'gethostname'. The utility macro -;;; WITH-FOREIGN-POINTER-AS-STRING is used to allocate a temporary -;;; buffer and return it as a Lisp string. -(defun gethostname () - (with-foreign-pointer-as-string ((buf bufsize) 255) - (%gethostname buf bufsize))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/gettimeofday.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/gettimeofday.lisp deleted file mode 100644 index 1d07cb3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/gettimeofday.lisp +++ /dev/null @@ -1,93 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; gettimeofday.lisp --- Example CFFI binding to gettimeofday(2) -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -;;;# CFFI Example: gettimeofday binding -;;; -;;; This example illustrates the use of foreign structures, typedefs, -;;; and using type translators to do checking of input and output -;;; arguments to a foreign function. - -(defpackage #:cffi-example-gettimeofday - (:use #:common-lisp #:cffi) - (:export #:gettimeofday)) - -(in-package #:cffi-example-gettimeofday) - -;;; Define the TIMEVAL structure used by 'gettimeofday'. This assumes -;;; that 'time_t' is a 'long' --- it would be nice if CFFI could -;;; provide a proper :TIME-T type to help make this portable. -(defcstruct timeval - (tv-sec :long) - (tv-usec :long)) - -;;; A NULL-POINTER is a foreign :POINTER that must always be NULL. -;;; Both a NULL pointer and NIL are legal values---any others will -;;; result in a runtime error. -(define-foreign-type null-pointer-type () - () - (:actual-type :pointer) - (:simple-parser null-pointer)) - -;;; This type translator is used to ensure that a NULL-POINTER has a -;;; null value. It also converts NIL to a null pointer. -(defmethod translate-to-foreign (value (type null-pointer-type)) - (cond - ((null value) (null-pointer)) - ((null-pointer-p value) value) - (t (error "~A is not a null pointer." value)))) - -;;; The SYSCALL-RESULT type is an integer type used for the return -;;; value of C functions that return -1 and set errno on errors. -;;; Someday when CFFI has a portable interface for dealing with -;;; 'errno', this error reporting can be more useful. -(define-foreign-type syscall-result-type () - () - (:actual-type :int) - (:simple-parser syscall-result)) - -;;; Type translator to check a SYSCALL-RESULT and signal a Lisp error -;;; if the value is negative. -(defmethod translate-from-foreign (value (type syscall-result-type)) - (if (minusp value) - (error "System call failed with return value ~D." value) - value)) - -;;; Define the Lisp function %GETTIMEOFDAY to call the C function -;;; 'gettimeofday', passing a pointer to the TIMEVAL structure to fill -;;; in. The TZP parameter is deprecated and should be NULL --- we can -;;; enforce this by using our NULL-POINTER type defined above. -(defcfun ("gettimeofday" %gettimeofday) syscall-result - (tp :pointer) - (tzp null-pointer)) - -;;; Define a Lispy interface to 'gettimeofday' that returns the -;;; seconds and microseconds as multiple values. -(defun gettimeofday () - (with-foreign-object (tv 'timeval) - (%gettimeofday tv nil) - (with-foreign-slots ((tv-sec tv-usec) tv timeval) - (values tv-sec tv-usec)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/grovel-example.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/grovel-example.lisp deleted file mode 100644 index ea861b3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/grovel-example.lisp +++ /dev/null @@ -1,20 +0,0 @@ -(in-package #:cffi-example) - -(define "a0(x)" "+x+x") -(define "a1(x)" "a0(+x+x)") -(define "a2(x)" "a1(+x+x)") -(define "a3(x)" "a2(+x+x)") -(define "a4(x)" "a3(+x+x)") -(define "a5(x)" "a4(+x+x)") - -(define "A0" "a0(1)") -(define "A1" "a1(1)") -(define "A2" "a2(1)") -(define "A3" "a3(1)") -(define "A4" "a4(1)") - -(constant (+a0+ "A0")) -(constant (+a1+ "A1")) -(constant (+a2+ "A2")) -(constant (+a3+ "A3")) -(constant (+a4+ "A4")) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/main-example.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/main-example.lisp deleted file mode 100644 index 59bad2f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/main-example.lisp +++ /dev/null @@ -1,17 +0,0 @@ -(in-package #:cffi-example) - -(defcfun "puts" :int - "Put a string to standard output, return non-negative length output, or EOF" - (string :string)) - -(defun check-groveller () - (assert (equal (list +a0+ +a1+ +a2+ +a3+ +a4+) '(2 4 8 16 32))) - (assert (equal (bn 1) 32))) - -(defun entry-point () - (when uiop:*command-line-arguments* - (uiop:format! t "Arguments: ~A~%" (uiop:escape-command uiop:*command-line-arguments*))) - (puts "hello, world!") - (check-groveller) - (uiop:finish-outputs) - (uiop:quit 0)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/mapping.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/mapping.lisp deleted file mode 100644 index 5e9a371..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/mapping.lisp +++ /dev/null @@ -1,76 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; mapping.lisp --- An example for mapping Lisp objects to ints. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. -;;; - -;;; This is an example on how to tackle the problem of passing Lisp -;;; object identifiers to foreign code. It is not a great example, -;;; but might be useful nevertheless. -;;; -;;; Requires trivial-garbage: - -(defpackage #:cffi-mapping-test - (:use #:common-lisp #:cffi #:trivial-garbage) - (:export #:run)) - -(in-package #:cffi-mapping-test) - -(define-foreign-type lisp-object-type () - ((weakp :initarg :weakp)) - (:actual-type :unsigned-int)) - -(define-parse-method lisp-object (&key weak-mapping) - (make-instance 'lisp-object-type :weakp weak-mapping)) - -(defvar *regular-hashtable* (make-hash-table)) -(defvar *weak-hashtable* (make-weak-hash-table :weakness :value)) -(defvar *regular-counter* 0) -(defvar *weak-counter* 0) - -(defun increment-counter (value) - (mod (1+ value) (expt 2 (* 8 (foreign-type-size :unsigned-int))))) - -(define-modify-macro incf-counter () increment-counter) - -(defmethod translate-to-foreign (value (type lisp-object-type)) - (with-slots (weakp) type - (let ((id (if weakp - (incf-counter *weak-counter*) - (incf-counter *regular-counter*))) - (ht (if weakp *weak-hashtable* *regular-hashtable*))) - (setf (gethash id ht) value) - id))) - -(defmethod translate-from-foreign (int (type lisp-object-type)) - (with-slots (weakp) type - (gethash int (if weakp *weak-hashtable* *regular-hashtable*)))) - -;;;; Silly example. - -(defctype weak-mapping (lisp-object :weak-mapping t)) - -;;; (run) => # -(defun run () - (foreign-funcall "abs" weak-mapping (lambda (x) x) weak-mapping)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/package.lisp deleted file mode 100644 index c6c440b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/package.lisp +++ /dev/null @@ -1,30 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; package.lisp --- CFFI-EXAMPLES package definition. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -(defpackage #:cffi-example - (:use #:cl #:cffi #:cffi-sys) - (:export #:check-groveller #:entry-point)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/run-examples.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/run-examples.lisp deleted file mode 100644 index 5c99910..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/run-examples.lisp +++ /dev/null @@ -1,39 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; run-examples.lisp --- Simple script to run the examples. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -(setf *load-verbose* nil *compile-verbose* nil) - -#-asdf -(ignore-errors (require "asdf")) -#-asdf -(load "~/common-lisp/asdf/build/asdf.lisp") - -(asdf:load-system 'cffi-examples :verbose nil) -(cffi-examples:run-examples) -(force-output) - -(quit) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/translator-test.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/translator-test.lisp deleted file mode 100644 index 15b7ce4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/translator-test.lisp +++ /dev/null @@ -1,88 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; translator-test.lisp --- Testing type translators. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -(defpackage #:cffi-translator-test - (:use #:common-lisp #:cffi)) - -(in-package #:cffi-translator-test) - -;;;# Verbose Pointer Translator -;;; -;;; This is a silly type translator that doesn't actually do any -;;; translating, but it prints out a debug message when the pointer is -;;; converted to/from its foreign representation. - -(define-foreign-type verbose-pointer-type () - () - (:actual-type :pointer)) - -(defmethod translate-to-foreign (value (type verbose-pointer-type)) - (format *debug-io* "~&;; to foreign: VERBOSE-POINTER: ~S~%" value) - value) - -(defmethod translate-from-foreign (value (type verbose-pointer-type)) - (format *debug-io* "~&;; from foreign: VERBOSE-POINTER: ~S~%" value) - value) - -;;;# Verbose String Translator -;;; -;;; A VERBOSE-STRING extends VERBOSE-POINTER and converts Lisp strings -;;; C strings. If things are working properly, both type translators -;;; should be called when converting a Lisp string to/from a C string. -;;; -;;; The translators should be called most-specific-first when -;;; translating to C, and most-specific-last when translating from C. - -(define-foreign-type verbose-string-type (verbose-pointer-type) - () - (:simple-parser verbose-string)) - -(defmethod translate-to-foreign ((s string) (type verbose-string-type)) - (let ((value (foreign-string-alloc s))) - (format *debug-io* "~&;; to foreign: VERBOSE-STRING: ~S -> ~S~%" s value) - (values (call-next-method value type) t))) - -(defmethod translate-to-foreign (value (type verbose-string-type)) - (if (pointerp value) - (progn - (format *debug-io* "~&;; to foreign: VERBOSE-STRING: ~S -> ~:*~S~%" value) - (values (call-next-method) nil)) - (error "Cannot convert ~S to a foreign string: it is not a Lisp ~ - string or pointer." value))) - -(defmethod translate-from-foreign (ptr (type verbose-string-type)) - (let ((value (foreign-string-to-lisp (call-next-method)))) - (format *debug-io* "~&;; from foreign: VERBOSE-STRING: ~S -> ~S~%" ptr value) - value)) - -(defmethod free-translated-object (ptr (type verbose-string-type) free-p) - (when free-p - (format *debug-io* "~&;; freeing VERBOSE-STRING: ~S~%" ptr) - (foreign-string-free ptr))) - -(defun test-verbose-string () - (foreign-funcall "getenv" verbose-string "SHELL" verbose-string)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/wrapper-example.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/wrapper-example.lisp deleted file mode 100644 index f37db29..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/wrapper-example.lisp +++ /dev/null @@ -1,20 +0,0 @@ -(in-package #:cffi-example) - -(defwrapper* "b0" :long ((x :long)) "return x;") -(defwrapper* "b1" :long ((x :long)) "return x;") -(defwrapper* "b2" :long ((x :long)) "return x;") -(defwrapper* "b3" :long ((x :long)) "return x;") -(defwrapper* "b4" :long ((x :long)) "return x;") - -(define "b0_cffi_wrap(x)" - "b0_cffi_wrap(b1_cffi_wrap(b2_cffi_wrap(b3_cffi_wrap(b4_cffi_wrap(+x+x)))))") -(define "b1_cffi_wrap(x)" - "b0_cffi_wrap(b1_cffi_wrap(b2_cffi_wrap(b3_cffi_wrap(b4_cffi_wrap(+x+x)))))") -(define "b2_cffi_wrap(x)" - "b0_cffi_wrap(b1_cffi_wrap(b2_cffi_wrap(b3_cffi_wrap(b4_cffi_wrap(+x+x)))))") -;;(define "b3_cffi_wrap(x)" -;; "b0_cffi_wrap(b1_cffi_wrap(b2_cffi_wrap(b3_cffi_wrap(b4_cffi_wrap(+x+x)))))") -;;(define "b4_cffi_wrap(x)" -;; "b0_cffi_wrap(b1_cffi_wrap(b2_cffi_wrap(b3_cffi_wrap(b4_cffi_wrap(+x+x)))))") - -(defwrapper* "bn" :long ((x :long)) "return b0_cffi_wrap(x);") diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/asdf.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/asdf.lisp deleted file mode 100644 index 11eddc6..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/asdf.lisp +++ /dev/null @@ -1,152 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; asdf.lisp --- ASDF components for cffi-grovel. -;;; -;;; Copyright (C) 2005-2006, Dan Knap -;;; Copyright (C) 2005-2006, Emily Backes -;;; Copyright (C) 2007, Stelian Ionescu -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi-grovel) - -(defclass cc-flags-mixin () - ((cc-flags :initform nil :accessor cc-flags-of :initarg :cc-flags))) - -(defclass process-op (downward-operation) - () - (:documentation "This ASDF operation performs the steps necessary - to generate a compilable and loadable lisp file from a - PROCESS-OP-INPUT component.")) - -(defclass process-op-input (cl-source-file) - ((generated-lisp-file-type - :initarg :generated-lisp-file-type - :accessor generated-lisp-file-type - :documentation "The :TYPE argument to use for the generated lisp file.")) - (:default-initargs - :generated-lisp-file-type "generated-lisp-file") - (:documentation "This ASDF component represents a file that is - used as input to a function that generates lisp source file. This - component acts as if it is a CL-SOURCE-FILE by applying the - COMPILE-OP and LOAD-SOURCE-OP operations to the file generated by - PROCESS-OP.")) - -(defmethod perform :around ((op process-op) (file cc-flags-mixin)) - (let ((*cc-flags* (append (ensure-list (cc-flags-of file)) - *cc-flags*))) - (call-next-method))) - -(defmethod input-files ((op process-op) (c process-op-input)) - (list (component-pathname c))) - -(defmethod input-files ((op compile-op) (c process-op-input)) - (list (first (output-files 'process-op c)))) - -(defmethod component-depends-on ((op process-op) (c process-op-input)) - `((prepare-op ,c) ,@(call-next-method))) - -(defmethod component-depends-on ((op compile-op) (c process-op-input)) - `((process-op ,c) ,@(call-next-method))) - -(defmethod component-depends-on ((op load-source-op) (c process-op-input)) - `((process-op ,c) ,@(call-next-method))) - -;;;# ASDF component: GROVEL-FILE - -(defclass grovel-file (process-op-input cc-flags-mixin) - () - (:default-initargs - :generated-lisp-file-type "processed-grovel-file") - (:documentation - "This ASDF component represents an input file that is processed - by PROCESS-GROVEL-FILE.")) - -(defmethod output-files ((op process-op) (c grovel-file)) - (let* ((input-file (first (input-files op c))) - (output-file (make-pathname :type (generated-lisp-file-type c) - :defaults input-file)) - (c-file (make-c-file-name output-file "__grovel"))) - (list output-file - c-file - (make-exe-file-name c-file)))) - -(defmethod perform ((op process-op) (c grovel-file)) - (let* ((output-file (first (output-files op c))) - (input-file (first (input-files op c))) - (tmp-file (process-grovel-file input-file output-file))) - (rename-file-overwriting-target tmp-file output-file))) - - -;;;# ASDF component: WRAPPER-FILE - -(defclass wrapper-file (process-op-input cc-flags-mixin) - ((soname :initform nil :initarg :soname :accessor soname-of)) - (:default-initargs - :generated-lisp-file-type "processed-wrapper-file") - (:documentation - "This ASDF component represents an input file that is processed - by PROCESS-WRAPPER-FILE. This generates a foreign library and - matching CFFI bindings that are subsequently compiled and - loaded.")) - -(defun wrapper-soname (c) - (or (soname-of c) - (component-name c))) - -(defmethod output-files ((op process-op) (c wrapper-file)) - (let* ((input-file (first (input-files op c))) - (output-file (make-pathname :type (generated-lisp-file-type c) - :defaults input-file)) - (c-file (make-c-file-name output-file "__wrapper")) - (o-file (make-o-file-name output-file "__wrapper")) - (lib-soname (wrapper-soname c))) - (list output-file - (make-so-file-name (make-soname lib-soname output-file)) - c-file - o-file))) - -;;; Declare the .o and .so files as compilation outputs, -;;; so they get picked up by bundle operations. -#.(when (version<= "3.1.6" (asdf-version)) - '(defmethod output-files ((op compile-op) (c wrapper-file)) - (destructuring-bind (generated-lisp lib-file c-file o-file) (output-files 'process-op c) - (declare (ignore generated-lisp c-file)) - (multiple-value-bind (files translatedp) (call-next-method) - (values (append files (list lib-file o-file)) translatedp))))) - -(defmethod perform ((op process-op) (c wrapper-file)) - (let* ((output-file (first (output-files op c))) - (input-file (first (input-files op c))) - (tmp-file (process-wrapper-file - input-file - :output-defaults output-file - :lib-soname (wrapper-soname c)))) - (unwind-protect - (alexandria:copy-file tmp-file output-file :if-to-exists :supersede) - (delete-file tmp-file)))) - -;; Allow for naked :cffi-grovel-file and :cffi-wrapper-file in asdf definitions. -(setf (find-class 'asdf::cffi-grovel-file) (find-class 'grovel-file)) -(setf (find-class 'asdf::cffi-wrapper-file) (find-class 'wrapper-file)) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/common.h b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/common.h deleted file mode 100644 index 895059f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/common.h +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include -#include -#include -#include - -#ifndef offsetof -#define offsetof(type, slot) ((long) ((char *) &(((type *) 0)->slot))) -#endif -#define getslot(type, slot) (((type *) 0)->slot) -#define sizeofslot(type, slot) (sizeof(getslot(type, slot))) -#define countofslot(type, slot) \ - (sizeof(getslot(type, slot)) / sizeof(getslot(type, slot)[0])) -#define stringify(x) #x -#define indirect_stringify(x) stringify(x) - -#define TYPE_SIGNED_P(type) (((type)-1)<0LL) -#define _64_BIT_VALUE_FITS_SIGNED_P(value) ( (value) <= 0x7FFFFFFFFFFFFFFFLL ) -#define SLOT_SIGNED_P(result, type, slot) \ - do { \ - type slot_signed_p_struct; \ - slot_signed_p_struct.slot = -1; \ - (result) = slot_signed_p_struct.slot < 0; \ - } while (0) - -void type_name(FILE *output, int signed_p, int size) { - if (signed_p) { - switch (size) { - case 1: fprintf(output, ":int8"); break; - case 2: fprintf(output, ":int16"); break; - case 4: fprintf(output, ":int32"); break; - case 8: fprintf(output, ":int64"); break; - default: goto error; - } - } else { - switch(size) { - case 1: fprintf(output, ":uint8"); break; - case 2: fprintf(output, ":uint16"); break; - case 4: fprintf(output, ":uint32"); break; - case 8: fprintf(output, ":uint64"); break; - default: goto error; - } - } - - return; - -error: - fprintf(output, "(cl:error \"No type of size ~D.\" %i)\n", size); -} - -char* print_double_for_lisp(double n) -{ - static char buf[256]; - memset(buf, 0, 256); - snprintf(buf, 255, "(let ((*read-default-float-format* 'double-float)) (coerce (read-from-string \"%.20E\") 'double-float))", n); - return buf; -} diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/grovel.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/grovel.lisp deleted file mode 100644 index 727e45d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/grovel.lisp +++ /dev/null @@ -1,913 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; grovel.lisp --- The CFFI Groveller. -;;; -;;; Copyright (C) 2005-2006, Dan Knap -;;; Copyright (C) 2005-2006, Emily Backes -;;; Copyright (C) 2007, Stelian Ionescu -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi-grovel) - -;;;# Error Conditions - -(define-condition grovel-error (simple-error) ()) - -(defun grovel-error (format-control &rest format-arguments) - (error 'grovel-error - :format-control format-control - :format-arguments format-arguments)) - -;;; This warning is signalled when cffi-grovel can't find some macro. -;;; Signalled by CONSTANT or CONSTANTENUM. -(define-condition missing-definition (warning) - ((%name :initarg :name :reader name-of)) - (:report (lambda (condition stream) - (format stream "No definition for ~A" - (name-of condition))))) - -;;;# Grovelling - -;;; The header of the intermediate C file. -(defparameter *header* - "/* - * This file has been automatically generated by cffi-grovel. - * Do not edit it by hand. - */ - -") - -;;; C code generated by cffi-grovel is inserted between the contents -;;; of *PROLOGUE* and *POSTSCRIPT*, inside the main function's body. - -(defparameter *prologue* - " -#include - -int main(int argc, char**argv) { - int autotype_tmp; - FILE *output = argc > 1 ? fopen(argv[1], \"w\") : stdout; - fprintf(output, \";;;; This file has been automatically generated by \" - \"cffi-grovel.\\n;;;; Do not edit it by hand.\\n\\n\"); -") - -(defparameter *postscript* - " - if (output != stdout) - fclose(output); - return 0; -} -") - -(defun unescape-for-c (text) - (with-output-to-string (result) - (loop for i below (length text) - for char = (char text i) do - (cond ((eql char #\") (princ "\\\"" result)) - ((eql char #\newline) (princ "\\n" result)) - (t (princ char result)))))) - -(defun c-format (out fmt &rest args) - (let ((text (unescape-for-c (format nil "~?" fmt args)))) - (format out "~& fputs(\"~A\", output);~%" text))) - -(defun c-printf (out fmt &rest args) - (flet ((item (item) - (format out "~A" (unescape-for-c (format nil item))))) - (format out "~& fprintf(output, \"") - (item fmt) - (format out "\"") - (loop for arg in args do - (format out ", ") - (item arg)) - (format out ");~%"))) - -(defun c-print-integer-constant (out arg &optional foreign-type) - (let ((foreign-type (or foreign-type :int))) - (c-format out "#.(cffi-grovel::convert-intmax-constant ") - (format out "~& fprintf(output, \"%\"PRIiMAX, (intmax_t)~A);~%" - arg) - (c-format out " ") - (c-write out `(quote ,foreign-type)) - (c-format out ")"))) - -;;; TODO: handle packages in a better way. One way is to process each -;;; grovel form as it is read (like we already do for wrapper -;;; forms). This way in can expect *PACKAGE* to have sane values. -;;; This would require that "header forms" come before any other -;;; forms. -(defun c-print-symbol (out symbol &optional no-package) - (c-format out - (let ((package (symbol-package symbol))) - (cond - ((eq (find-package '#:keyword) package) ":~(~A~)") - (no-package "~(~A~)") - ((eq (find-package '#:cl) package) "cl:~(~A~)") - (t "~(~A~)"))) - symbol)) - -(defun c-write (out form &optional no-package) - (cond - ((and (listp form) - (eq 'quote (car form))) - (c-format out "'") - (c-write out (cadr form) no-package)) - ((listp form) - (c-format out "(") - (loop for subform in form - for first-p = t then nil - unless first-p do (c-format out " ") - do (c-write out subform no-package)) - (c-format out ")")) - ((symbolp form) - (c-print-symbol out form no-package)))) - -;;; Always NIL for now, add {ENABLE,DISABLE}-AUTO-EXPORT grovel forms -;;; later, if necessary. -(defvar *auto-export* nil) - -(defun c-export (out symbol) - (when (and *auto-export* (not (keywordp symbol))) - (c-format out "(cl:export '") - (c-print-symbol out symbol t) - (c-format out ")~%"))) - -(defun c-section-header (out section-type section-symbol) - (format out "~% /* ~A section for ~S */~%" - section-type - section-symbol)) - -(defun remove-suffix (string suffix) - (let ((suffix-start (- (length string) (length suffix)))) - (if (and (> suffix-start 0) - (string= string suffix :start1 suffix-start)) - (subseq string 0 suffix-start) - string))) - -(defgeneric %process-grovel-form (name out arguments) - (:method (name out arguments) - (declare (ignore out arguments)) - (grovel-error "Unknown Grovel syntax: ~S" name))) - -(defun process-grovel-form (out form) - (%process-grovel-form (form-kind form) out (cdr form))) - -(defun form-kind (form) - ;; Using INTERN here instead of FIND-SYMBOL will result in less - ;; cryptic error messages when an undefined grovel/wrapper form is - ;; found. - (intern (symbol-name (car form)) '#:cffi-grovel)) - -(defvar *header-forms* '(c include define flag typedef)) - -(defun header-form-p (form) - (member (form-kind form) *header-forms*)) - -(defun generate-c-file (input-file output-defaults) - (nest - (with-standard-io-syntax) - (let ((c-file (make-c-file-name output-defaults "__grovel")) - (*print-readably* nil) - (*print-escape* t))) - (with-open-file (out c-file :direction :output :if-exists :supersede)) - (with-open-file (in input-file :direction :input)) - (flet ((read-forms (s) - (do ((forms ()) - (form (read s nil nil) (read s nil nil))) - ((null form) (nreverse forms)) - (labels - ((process-form (f) - (case (form-kind f) - (flag (warn "Groveler clause FLAG is deprecated, use CC-FLAGS instead."))) - (case (form-kind f) - (in-package - (setf *package* (find-package (second f))) - (push f forms)) - (progn - ;; flatten progn forms - (mapc #'process-form (rest f))) - (t (push f forms))))) - (process-form form)))))) - (let* ((forms (read-forms in)) - (header-forms (remove-if-not #'header-form-p forms)) - (body-forms (remove-if #'header-form-p forms))) - (write-string *header* out) - (dolist (form header-forms) - (process-grovel-form out form)) - (write-string *prologue* out) - (dolist (form body-forms) - (process-grovel-form out form)) - (write-string *postscript* out) - c-file))) - -(defun tmp-lisp-file-name (defaults) - (make-pathname :name (strcat (pathname-name defaults) ".grovel-tmp") - :type "lisp" :defaults defaults)) - - - -;;; *PACKAGE* is rebound so that the IN-PACKAGE form can set it during -;;; *the extent of a given grovel file. -(defun process-grovel-file (input-file &optional (output-defaults input-file)) - (with-standard-io-syntax - (let* ((c-file (generate-c-file input-file output-defaults)) - (o-file (make-o-file-name c-file)) - (exe-file (make-exe-file-name c-file)) - (lisp-file (tmp-lisp-file-name c-file)) - (inputs (list (cc-include-grovel-argument) c-file))) - (handler-case - (progn - ;; at least MKCL wants to separate compile and link - (cc-compile o-file inputs) - (link-executable exe-file (list o-file))) - (error (e) - (grovel-error "~a" e))) - (invoke exe-file lisp-file) - lisp-file))) - -;;; OUT is lexically bound to the output stream within BODY. -(defmacro define-grovel-syntax (name lambda-list &body body) - (with-unique-names (name-var args) - `(defmethod %process-grovel-form ((,name-var (eql ',name)) out ,args) - (declare (ignorable out)) - (destructuring-bind ,lambda-list ,args - ,@body)))) - -(define-grovel-syntax c (body) - (format out "~%~A~%" body)) - -(define-grovel-syntax include (&rest includes) - (format out "~{#include <~A>~%~}" includes)) - -(define-grovel-syntax define (name &optional value) - (format out "#define ~A~@[ ~A~]~%" name value)) - -(define-grovel-syntax typedef (base-type new-type) - (format out "typedef ~A ~A;~%" base-type new-type)) - -;;; Is this really needed? -(define-grovel-syntax ffi-typedef (new-type base-type) - (c-format out "(cffi:defctype ~S ~S)~%" new-type base-type)) - -(define-grovel-syntax flag (&rest flags) - (appendf *cc-flags* (parse-command-flags-list flags))) - -(define-grovel-syntax cc-flags (&rest flags) - (appendf *cc-flags* (parse-command-flags-list flags))) - -(define-grovel-syntax pkg-config-cflags (pkg &key optional) - (let ((output-stream (make-string-output-stream)) - (program+args (list "pkg-config" pkg "--cflags"))) - (format *debug-io* "~&;~{ ~a~}~%" program+args) - (handler-case - (progn - (run-program program+args - :output (make-broadcast-stream output-stream *debug-io*) - :error-output output-stream) - (appendf *cc-flags* - (parse-command-flags (get-output-stream-string output-stream)))) - (error (e) - (let ((message (format nil "~a~&~%~a~&" - e (get-output-stream-string output-stream)))) - (cond (optional - (format *debug-io* "~&; ERROR: ~a" message) - (format *debug-io* "~&~%; Attempting to continue anyway.~%")) - (t - (grovel-error "~a" message)))))))) - -;;; This form also has some "read time" effects. See GENERATE-C-FILE. -(define-grovel-syntax in-package (name) - (c-format out "(cl:in-package #:~A)~%~%" name)) - -(define-grovel-syntax ctype (lisp-name size-designator) - (c-section-header out "ctype" lisp-name) - (c-export out lisp-name) - (c-format out "(cffi:defctype ") - (c-print-symbol out lisp-name t) - (c-format out " ") - (format out "~& type_name(output, TYPE_SIGNED_P(~A), ~:[sizeof(~A)~;~D~]);~%" - size-designator - (etypecase size-designator - (string nil) - (integer t)) - size-designator) - (c-format out ")~%") - (unless (keywordp lisp-name) - (c-export out lisp-name)) - (let ((size-of-constant-name (symbolicate '#:size-of- lisp-name))) - (c-export out size-of-constant-name) - (c-format out "(cl:defconstant " - size-of-constant-name lisp-name) - (c-print-symbol out size-of-constant-name) - (c-format out " (cffi:foreign-type-size '") - (c-print-symbol out lisp-name) - (c-format out "))~%"))) - -;;; Syntax differs from anything else in CFFI. Fix? -(define-grovel-syntax constant ((lisp-name &rest c-names) - &key (type 'integer) documentation optional) - (when (keywordp lisp-name) - (setf lisp-name (format-symbol "~A" lisp-name))) - (c-section-header out "constant" lisp-name) - (dolist (c-name c-names) - (format out "~&#ifdef ~A~%" c-name) - (c-export out lisp-name) - (c-format out "(cl:defconstant ") - (c-print-symbol out lisp-name t) - (c-format out " ") - (ecase type - (integer - (format out "~& if(_64_BIT_VALUE_FITS_SIGNED_P(~A))~%" c-name) - (format out " fprintf(output, \"%lli\", (long long signed) ~A);" c-name) - (format out "~& else~%") - (format out " fprintf(output, \"%llu\", (long long unsigned) ~A);" c-name)) - (double-float - (format out "~& fprintf(output, \"%s\", print_double_for_lisp((double)~A));~%" c-name))) - (when documentation - (c-format out " ~S" documentation)) - (c-format out ")~%") - (format out "~&#else~%")) - (unless optional - (c-format out "(cl:warn 'cffi-grovel:missing-definition :name '~A)~%" - lisp-name)) - (dotimes (i (length c-names)) - (format out "~&#endif~%"))) - -(define-grovel-syntax feature (lisp-feature-name c-name &key (feature-list 'cl:*features*)) - (c-section-header out "feature" lisp-feature-name) - (format out "~&#ifdef ~A~%" c-name) - (c-format out "(cl:pushnew '") - (c-print-symbol out lisp-feature-name t) - (c-format out " ") - (c-print-symbol out feature-list) - (c-format out ")~%") - (format out "~&#endif~%")) - -(define-grovel-syntax cunion (union-lisp-name union-c-name &rest slots) - (let ((documentation (when (stringp (car slots)) (pop slots)))) - (c-section-header out "cunion" union-lisp-name) - (c-export out union-lisp-name) - (dolist (slot slots) - (let ((slot-lisp-name (car slot))) - (c-export out slot-lisp-name))) - (c-format out "(cffi:defcunion (") - (c-print-symbol out union-lisp-name t) - (c-printf out " :size %llu)" (format nil "(long long unsigned) sizeof(~A)" union-c-name)) - (when documentation - (c-format out "~% ~S" documentation)) - (dolist (slot slots) - (destructuring-bind (slot-lisp-name slot-c-name &key type count) - slot - (declare (ignore slot-c-name)) - (c-format out "~% (") - (c-print-symbol out slot-lisp-name t) - (c-format out " ") - (c-write out type) - (etypecase count - (integer - (c-format out " :count ~D" count)) - ((eql :auto) - ;; nb, works like :count :auto does in cstruct below - (c-printf out " :count %llu" - (format nil "(long long unsigned) sizeof(~A)" union-c-name))) - (null t)) - (c-format out ")"))) - (c-format out ")~%"))) - -(defun make-from-pointer-function-name (type-name) - (symbolicate '#:make- type-name '#:-from-pointer)) - -;;; DEFINE-C-STRUCT-WRAPPER (in ../src/types.lisp) seems like a much -;;; cleaner way to do this. Unless I can find any advantage in doing -;;; it this way I'll delete this soon. --luis -(define-grovel-syntax cstruct-and-class-item (&rest arguments) - (process-grovel-form out (cons 'cstruct arguments)) - (destructuring-bind (struct-lisp-name struct-c-name &rest slots) - arguments - (declare (ignore struct-c-name)) - (let* ((slot-names (mapcar #'car slots)) - (reader-names (mapcar - (lambda (slot-name) - (intern - (strcat (symbol-name struct-lisp-name) "-" - (symbol-name slot-name)))) - slot-names)) - (initarg-names (mapcar - (lambda (slot-name) - (intern (symbol-name slot-name) "KEYWORD")) - slot-names)) - (slot-decoders (mapcar (lambda (slot) - (destructuring-bind - (lisp-name c-name - &key type count - &allow-other-keys) - slot - (declare (ignore lisp-name c-name)) - (cond ((and (eq type :char) count) - 'cffi:foreign-string-to-lisp) - (t nil)))) - slots)) - (defclass-form - `(defclass ,struct-lisp-name () - ,(mapcar (lambda (slot-name initarg-name reader-name) - `(,slot-name :initarg ,initarg-name - :reader ,reader-name)) - slot-names - initarg-names - reader-names))) - (make-function-name - (make-from-pointer-function-name struct-lisp-name)) - (make-defun-form - ;; this function is then used as a constructor for this class. - `(defun ,make-function-name (pointer) - (cffi:with-foreign-slots - (,slot-names pointer ,struct-lisp-name) - (make-instance ',struct-lisp-name - ,@(loop for slot-name in slot-names - for initarg-name in initarg-names - for slot-decoder in slot-decoders - collect initarg-name - if slot-decoder - collect `(,slot-decoder ,slot-name) - else collect slot-name)))))) - (c-export out make-function-name) - (dolist (reader-name reader-names) - (c-export out reader-name)) - (c-write out defclass-form) - (c-write out make-defun-form)))) - -(define-grovel-syntax cstruct (struct-lisp-name struct-c-name &rest slots) - (let ((documentation (when (stringp (car slots)) (pop slots)))) - (c-section-header out "cstruct" struct-lisp-name) - (c-export out struct-lisp-name) - (dolist (slot slots) - (let ((slot-lisp-name (car slot))) - (c-export out slot-lisp-name))) - (c-format out "(cffi:defcstruct (") - (c-print-symbol out struct-lisp-name t) - (c-printf out " :size %llu)" - (format nil "(long long unsigned) sizeof(~A)" struct-c-name)) - (when documentation - (c-format out "~% ~S" documentation)) - (dolist (slot slots) - (destructuring-bind (slot-lisp-name slot-c-name &key type count) - slot - (c-format out "~% (") - (c-print-symbol out slot-lisp-name t) - (c-format out " ") - (etypecase type - ((eql :auto) - (format out "~& SLOT_SIGNED_P(autotype_tmp, ~A, ~A~@[[0]~]);~@*~%~ - ~& type_name(output, autotype_tmp, sizeofslot(~A, ~A~@[[0]~]));~%" - struct-c-name - slot-c-name - (not (null count)))) - ((or cons symbol) - (c-write out type)) - (string - (c-format out "~A" type))) - (etypecase count - (null t) - (integer - (c-format out " :count ~D" count)) - ((eql :auto) - (c-printf out " :count %llu" - (format nil "(long long unsigned) countofslot(~A, ~A)" - struct-c-name - slot-c-name))) - ((or symbol string) - (format out "~&#ifdef ~A~%" count) - (c-printf out " :count %llu" - (format nil "(long long unsigned) (~A)" count)) - (format out "~&#endif~%"))) - (c-printf out " :offset %lli)" - (format nil "(long long signed) offsetof(~A, ~A)" - struct-c-name - slot-c-name)))) - (c-format out ")~%") - (let ((size-of-constant-name - (symbolicate '#:size-of- struct-lisp-name))) - (c-export out size-of-constant-name) - (c-format out "(cl:defconstant " - size-of-constant-name struct-lisp-name) - (c-print-symbol out size-of-constant-name) - (c-format out " (cffi:foreign-type-size '(:struct ") - (c-print-symbol out struct-lisp-name) - (c-format out ")))~%")))) - -(defmacro define-pseudo-cvar (str name type &key read-only) - (let ((c-parse (let ((*read-eval* nil) - (*readtable* (copy-readtable nil))) - (setf (readtable-case *readtable*) :preserve) - (read-from-string str)))) - (typecase c-parse - (symbol `(cffi:defcvar (,(symbol-name c-parse) ,name - :read-only ,read-only) - ,type)) - (list (unless (and (= (length c-parse) 2) - (null (second c-parse)) - (symbolp (first c-parse)) - (eql #\* (char (symbol-name (first c-parse)) 0))) - (grovel-error "Unable to parse c-string ~s." str)) - (let ((func-name (symbolicate "%" name '#:-accessor))) - `(progn - (declaim (inline ,func-name)) - (cffi:defcfun (,(string-trim "*" (symbol-name (first c-parse))) - ,func-name) :pointer) - (define-symbol-macro ,name - (cffi:mem-ref (,func-name) ',type))))) - (t (grovel-error "Unable to parse c-string ~s." str))))) - -(defun foreign-name-to-symbol (s) - (intern (substitute #\- #\_ (string-upcase s)))) - -(defun choose-lisp-and-foreign-names (string-or-list) - (etypecase string-or-list - (string (values string-or-list (foreign-name-to-symbol string-or-list))) - (list (destructuring-bind (fname lname &rest args) string-or-list - (declare (ignore args)) - (assert (and (stringp fname) (symbolp lname))) - (values fname lname))))) - -(define-grovel-syntax cvar (name type &key read-only) - (multiple-value-bind (c-name lisp-name) - (choose-lisp-and-foreign-names name) - (c-section-header out "cvar" lisp-name) - (c-export out lisp-name) - (c-printf out "(cffi-grovel::define-pseudo-cvar \"%s\" " - (format nil "indirect_stringify(~A)" c-name)) - (c-print-symbol out lisp-name t) - (c-format out " ") - (c-write out type) - (when read-only - (c-format out " :read-only t")) - (c-format out ")~%"))) - -;;; FIXME: where would docs on enum elements go? -(define-grovel-syntax cenum (name &rest enum-list) - (destructuring-bind (name &key base-type define-constants) - (ensure-list name) - (c-section-header out "cenum" name) - (c-export out name) - (c-format out "(cffi:defcenum (") - (c-print-symbol out name t) - (when base-type - (c-printf out " ") - (c-print-symbol out base-type t)) - (c-format out ")") - (dolist (enum enum-list) - (destructuring-bind ((lisp-name &rest c-names) &key documentation) - enum - (declare (ignore documentation)) - (check-type lisp-name keyword) - (loop for c-name in c-names do - (check-type c-name string) - (c-format out " (") - (c-print-symbol out lisp-name) - (c-format out " ") - (c-print-integer-constant out c-name base-type) - (c-format out ")~%")))) - (c-format out ")~%") - (when define-constants - (define-constants-from-enum out enum-list)))) - -(define-grovel-syntax constantenum (name &rest enum-list) - (destructuring-bind (name &key base-type define-constants) - (ensure-list name) - (c-section-header out "constantenum" name) - (c-export out name) - (c-format out "(cffi:defcenum (") - (c-print-symbol out name t) - (when base-type - (c-printf out " ") - (c-print-symbol out base-type t)) - (c-format out ")") - (dolist (enum enum-list) - (destructuring-bind ((lisp-name &rest c-names) - &key optional documentation) enum - (declare (ignore documentation)) - (check-type lisp-name keyword) - (c-format out "~% (") - (c-print-symbol out lisp-name) - (loop for c-name in c-names do - (check-type c-name string) - (format out "~&#ifdef ~A~%" c-name) - (c-format out " ") - (c-print-integer-constant out c-name base-type) - (format out "~&#else~%")) - (unless optional - (c-format out - "~% #.(cl:progn ~ - (cl:warn 'cffi-grovel:missing-definition :name '~A) ~ - -1)" - lisp-name)) - (dotimes (i (length c-names)) - (format out "~&#endif~%")) - (c-format out ")"))) - (c-format out ")~%") - (when define-constants - (define-constants-from-enum out enum-list)))) - -(defun define-constants-from-enum (out enum-list) - (dolist (enum enum-list) - (destructuring-bind ((lisp-name &rest c-names) &rest options) - enum - (%process-grovel-form - 'constant out - `((,(intern (string lisp-name)) ,(car c-names)) - ,@options))))) - -(defun convert-intmax-constant (constant base-type) - "Convert the C CONSTANT to an integer of BASE-TYPE. The constant is -assumed to be an integer printed using the PRIiMAX printf(3) format -string." - ;; | C Constant | Type | Return Value | Notes | - ;; |------------+---------+--------------+---------------------------------------| - ;; | -1 | :int32 | -1 | | - ;; | 0xffffffff | :int32 | -1 | CONSTANT may be a positive integer if | - ;; | | | | sizeof(intmax_t) > sizeof(int32_t) | - ;; | 0xffffffff | :uint32 | 4294967295 | | - ;; | -1 | :uint32 | 4294967295 | | - ;; |------------+---------+--------------+---------------------------------------| - (let* ((canonical-type (cffi::canonicalize-foreign-type base-type)) - (type-bits (* 8 (cffi:foreign-type-size canonical-type))) - (2^n (ash 1 type-bits))) - (ecase canonical-type - ((:unsigned-char :unsigned-short :unsigned-int - :unsigned-long :unsigned-long-long) - (mod constant 2^n)) - ((:char :short :int :long :long-long) - (let ((v (mod constant 2^n))) - (if (logbitp (1- type-bits) v) - (- (mask-field (byte (1- type-bits) 0) v) - (ash 1 (1- type-bits))) - v)))))) - -(defun foreign-type-to-printf-specification (type) - "Return the printf specification associated with the foreign type TYPE." - (ecase (cffi::canonicalize-foreign-type type) - (:char "\"%hhd\"") - (:unsigned-char "\"%hhu\"") - (:short "\"%hd\"") - (:unsigned-short "\"%hu\"") - (:int "\"%d\"") - (:unsigned-int "\"%u\"") - (:long "\"%ld\"") - (:unsigned-long "\"%lu\"") - (:long-long "\"%lld\"") - (:unsigned-long-long "\"%llu\""))) - -;; Defines a bitfield, with elements specified as ((LISP-NAME C-NAME) -;; &key DOCUMENTATION). NAME-AND-OPTS can be either a symbol as name, -;; or a list (NAME &key BASE-TYPE). -(define-grovel-syntax bitfield (name-and-opts &rest masks) - (destructuring-bind (name &key base-type) - (ensure-list name-and-opts) - (c-section-header out "bitfield" name) - (c-export out name) - (c-format out "(cffi:defbitfield (") - (c-print-symbol out name t) - (when base-type - (c-printf out " ") - (c-print-symbol out base-type t)) - (c-format out ")") - (dolist (mask masks) - (destructuring-bind ((lisp-name &rest c-names) - &key optional documentation) mask - (declare (ignore documentation)) - (check-type lisp-name symbol) - (c-format out "~% (") - (c-print-symbol out lisp-name) - (c-format out " ") - (dolist (c-name c-names) - (check-type c-name string) - (format out "~&#ifdef ~A~%" c-name) - (format out "~& fprintf(output, ~A, ~A);~%" - (foreign-type-to-printf-specification (or base-type :int)) - c-name) - (format out "~&#else~%")) - (unless optional - (c-format out - "~% #.(cl:progn ~ - (cl:warn 'cffi-grovel:missing-definition :name '~A) ~ - -1)" - lisp-name)) - (dotimes (i (length c-names)) - (format out "~&#endif~%")) - (c-format out ")"))) - (c-format out ")~%"))) - - -;;;# Wrapper Generation -;;; -;;; Here we generate a C file from a s-exp specification but instead -;;; of compiling and running it, we compile it as a shared library -;;; that can be subsequently loaded with LOAD-FOREIGN-LIBRARY. -;;; -;;; Useful to get at macro functionality, errno, system calls, -;;; functions that handle structures by value, etc... -;;; -;;; Matching CFFI bindings are generated along with said C file. - -(defun process-wrapper-form (out form) - (%process-wrapper-form (form-kind form) out (cdr form))) - -;;; The various operators push Lisp forms onto this list which will be -;;; written out by PROCESS-WRAPPER-FILE once everything is processed. -(defvar *lisp-forms*) - -(defun generate-c-lib-file (input-file output-defaults) - (let ((*lisp-forms* nil) - (c-file (make-c-file-name output-defaults "__wrapper"))) - (with-open-file (out c-file :direction :output :if-exists :supersede) - (with-open-file (in input-file :direction :input) - (write-string *header* out) - (loop for form = (read in nil nil) while form - do (process-wrapper-form out form)))) - (values c-file (nreverse *lisp-forms*)))) - -(defun make-soname (lib-soname output-defaults) - (make-pathname :name lib-soname - :defaults output-defaults)) - -(defun generate-bindings-file (lib-file lib-soname lisp-forms output-defaults) - (with-standard-io-syntax - (let ((lisp-file (tmp-lisp-file-name output-defaults)) - (*print-readably* nil) - (*print-escape* t)) - (with-open-file (out lisp-file :direction :output :if-exists :supersede) - (format out ";;;; This file was automatically generated by cffi-grovel.~%~ - ;;;; Do not edit by hand.~%") - (let ((*package* (find-package '#:cl)) - (named-library-name - (let ((*package* (find-package :keyword)) - (*read-eval* nil)) - (read-from-string lib-soname)))) - (pprint `(progn - (cffi:define-foreign-library - (,named-library-name - :type :grovel-wrapper - :search-path ,(directory-namestring lib-file)) - (t ,(namestring (make-so-file-name lib-soname)))) - (cffi:use-foreign-library ,named-library-name)) - out) - (fresh-line out)) - (dolist (form lisp-forms) - (print form out)) - (terpri out)) - lisp-file))) - -(defun cc-include-grovel-argument () - (format nil "-I~A" (truename (system-source-directory :cffi-grovel)))) - -;;; *PACKAGE* is rebound so that the IN-PACKAGE form can set it during -;;; *the extent of a given wrapper file. -(defun process-wrapper-file (input-file - &key - (output-defaults (make-pathname :defaults input-file :type "processed")) - lib-soname) - (with-standard-io-syntax - (multiple-value-bind (c-file lisp-forms) - (generate-c-lib-file input-file output-defaults) - (let ((lib-file (make-so-file-name (make-soname lib-soname output-defaults))) - (o-file (make-o-file-name output-defaults "__wrapper"))) - (cc-compile o-file (list (cc-include-grovel-argument) c-file)) - (link-shared-library lib-file (list o-file)) - ;; FIXME: hardcoded library path. - (values (generate-bindings-file lib-file lib-soname lisp-forms output-defaults) - lib-file))))) - -(defgeneric %process-wrapper-form (name out arguments) - (:method (name out arguments) - (declare (ignore out arguments)) - (grovel-error "Unknown Grovel syntax: ~S" name))) - -;;; OUT is lexically bound to the output stream within BODY. -(defmacro define-wrapper-syntax (name lambda-list &body body) - (with-unique-names (name-var args) - `(defmethod %process-wrapper-form ((,name-var (eql ',name)) out ,args) - (declare (ignorable out)) - (destructuring-bind ,lambda-list ,args - ,@body)))) - -(define-wrapper-syntax progn (&rest forms) - (dolist (form forms) - (process-wrapper-form out form))) - -(define-wrapper-syntax in-package (name) - (assert (find-package name) (name) - "Wrapper file specified (in-package ~s)~%~ - however that does not name a known package." - name) - (setq *package* (find-package name)) - (push `(in-package ,name) *lisp-forms*)) - -(define-wrapper-syntax c (&rest strings) - (dolist (string strings) - (write-line string out))) - -(define-wrapper-syntax flag (&rest flags) - (appendf *cc-flags* (parse-command-flags-list flags))) - -(define-wrapper-syntax proclaim (&rest proclamations) - (push `(proclaim ,@proclamations) *lisp-forms*)) - -(define-wrapper-syntax declaim (&rest declamations) - (push `(declaim ,@declamations) *lisp-forms*)) - -(define-wrapper-syntax define (name &optional value) - (format out "#define ~A~@[ ~A~]~%" name value)) - -(define-wrapper-syntax include (&rest includes) - (format out "~{#include <~A>~%~}" includes)) - -;;; FIXME: this function is not complete. Should probably follow -;;; typedefs? Should definitely understand pointer types. -(defun c-type-name (typespec) - (let ((spec (ensure-list typespec))) - (if (stringp (car spec)) - (car spec) - (case (car spec) - ((:uchar :unsigned-char) "unsigned char") - ((:unsigned-short :ushort) "unsigned short") - ((:unsigned-int :uint) "unsigned int") - ((:unsigned-long :ulong) "unsigned long") - ((:long-long :llong) "long long") - ((:unsigned-long-long :ullong) "unsigned long long") - (:pointer "void*") - (:string "char*") - (t (cffi::foreign-name (car spec) nil)))))) - -(defun cffi-type (typespec) - (if (and (listp typespec) (stringp (car typespec))) - (second typespec) - typespec)) - -(defun symbol* (s) - (check-type s (and symbol (not null))) - s) - -(define-wrapper-syntax defwrapper (name-and-options rettype &rest args) - (multiple-value-bind (lisp-name foreign-name options) - (cffi::parse-name-and-options name-and-options) - (let* ((foreign-name-wrap (strcat foreign-name "_cffi_wrap")) - (fargs (mapcar (lambda (arg) - (list (c-type-name (second arg)) - (cffi::foreign-name (first arg) nil))) - args)) - (fargnames (mapcar #'second fargs))) - ;; output C code - (format out "~A ~A" (c-type-name rettype) foreign-name-wrap) - (format out "(~{~{~A ~A~}~^, ~})~%" fargs) - (format out "{~% return ~A(~{~A~^, ~});~%}~%~%" foreign-name fargnames) - ;; matching bindings - (push `(cffi:defcfun (,foreign-name-wrap ,lisp-name ,@options) - ,(cffi-type rettype) - ,@(mapcar (lambda (arg) - (list (symbol* (first arg)) - (cffi-type (second arg)))) - args)) - *lisp-forms*)))) - -(define-wrapper-syntax defwrapper* (name-and-options rettype args &rest c-lines) - ;; output C code - (multiple-value-bind (lisp-name foreign-name options) - (cffi::parse-name-and-options name-and-options) - (let ((foreign-name-wrap (strcat foreign-name "_cffi_wrap")) - (fargs (mapcar (lambda (arg) - (list (c-type-name (second arg)) - (cffi::foreign-name (first arg) nil))) - args))) - (format out "~A ~A" (c-type-name rettype) - foreign-name-wrap) - (format out "(~{~{~A ~A~}~^, ~})~%" fargs) - (format out "{~%~{ ~A~%~}}~%~%" c-lines) - ;; matching bindings - (push `(cffi:defcfun (,foreign-name-wrap ,lisp-name ,@options) - ,(cffi-type rettype) - ,@(mapcar (lambda (arg) - (list (symbol* (first arg)) - (cffi-type (second arg)))) - args)) - *lisp-forms*)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/package.lisp deleted file mode 100644 index c5c692e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/package.lisp +++ /dev/null @@ -1,36 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; package.lisp --- Groveler DEFPACKAGE. -;;; -;;; 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. -;;; - -(uiop:define-package #:cffi-grovel - (:mix #:cffi-toolchain #:asdf #:uiop #:alexandria #:common-lisp) - (:export - ;; Class name - #:grovel-file - #:process-grovel-file - #:wrapper-file - #:process-wrapper-file - ;; Error conditions - #:grovel-error - #:missing-definition)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/funcall.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/funcall.lisp deleted file mode 100644 index 75e0e75..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/funcall.lisp +++ /dev/null @@ -1,132 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; funcall.lisp -- FOREIGN-FUNCALL implementation using libffi -;;; -;;; Copyright (C) 2009, 2010, 2011 Liam M. Healy -;;; -;;; 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. -;;; - -(in-package #:cffi) - -(define-condition libffi-error (cffi-error) - ((function-name - :initarg :function-name :reader function-name))) - -(define-condition simple-libffi-error (simple-error libffi-error) - ()) - -(defun libffi-error (function-name format-control &rest format-arguments) - (error 'simple-libffi-error - :function-name function-name - :format-control format-control - :format-arguments format-arguments)) - -(defun make-libffi-cif (function-name return-type argument-types - &optional (abi :default-abi)) - "Generate or retrieve the Call InterFace needed to call the function through libffi." - (let* ((argument-count (length argument-types)) - (cif (foreign-alloc '(:struct ffi-cif))) - (ffi-argtypes (foreign-alloc :pointer :count argument-count))) - (loop - :for type :in argument-types - :for index :from 0 - :do (setf (mem-aref ffi-argtypes :pointer index) - (make-libffi-type-descriptor (parse-type type)))) - (unless (eql :ok (libffi/prep-cif cif abi argument-count - (make-libffi-type-descriptor (parse-type return-type)) - ffi-argtypes)) - (libffi-error function-name - "The 'ffi_prep_cif' libffi call failed for function ~S." - function-name)) - cif)) - -(defun free-libffi-cif (ptr) - (foreign-free (foreign-slot-value ptr '(:struct ffi-cif) 'argument-types)) - (foreign-free ptr)) - -(defun translate-objects-ret (symbols function-arguments types return-type call-form) - (translate-objects - symbols - function-arguments - types - return-type - (if (or (eql return-type :void) - (typep (parse-type return-type) 'translatable-foreign-type)) - call-form - ;; built-in types won't be translated by - ;; expand-from-foreign, we have to do it here - `(mem-ref - ,call-form - ',(canonicalize-foreign-type return-type))) - t)) - -(defun foreign-funcall-form/fsbv-with-libffi (function function-arguments symbols types - return-type argument-types - &optional pointerp (abi :default-abi)) - "A body of foreign-funcall calling the libffi function #'call (ffi_call)." - (let ((argument-count (length argument-types))) - `(with-foreign-objects ((argument-values :pointer ,argument-count) - ,@(unless (eql return-type :void) - `((result ',return-type)))) - ,(translate-objects-ret - symbols function-arguments types return-type - ;; NOTE: We must delay the cif creation until the first call - ;; because it's FOREIGN-ALLOC'd, i.e. it gets corrupted by an - ;; image save/restore cycle. This way a lib will remain usable - ;; through a save/restore cycle if the save happens before any - ;; FFI calls will have been made, i.e. nothing is malloc'd yet. - `(progn - (loop - :for arg :in (list ,@symbols) - :for count :from 0 - :do (setf (mem-aref argument-values :pointer count) arg)) - (let* ((libffi-cif-cache (load-time-value (cons 'libffi-cif-cache nil))) - (libffi-cif (or (cdr libffi-cif-cache) - (setf (cdr libffi-cif-cache) - ;; FIXME ideally we should install a finalizer on the cons - ;; that calls FREE-LIBFFI-CIF on the cif (when the function - ;; gets redefined, and the cif becomes unreachable). but a - ;; finite world is full of compromises... - attila - (make-libffi-cif ,function ',return-type - ',argument-types ',abi))))) - (libffi/call libffi-cif - ,(if pointerp - function - `(foreign-symbol-pointer ,function)) - ,(if (eql return-type :void) '(null-pointer) 'result) - argument-values) - ,(if (eql return-type :void) - '(values) - 'result))))))) - -(setf *foreign-structures-by-value* 'foreign-funcall-form/fsbv-with-libffi) - -;; DEPRECATED Its presence encourages the use of #+fsbv which may lead to the -;; situation where a fasl was produced by an image that has fsbv feature -;; and then ends up being loaded into an image later that has no fsbv support -;; loaded. Use explicit ASDF dependencies instead and assume the presence -;; of the feature accordingly. -(pushnew :fsbv *features*) - -;; DEPRECATED This is here only for backwards compatibility until its fate is -;; decided. See the mailing list discussion for details. -(defctype :sizet size-t) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-functions.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-functions.lisp deleted file mode 100644 index 0c5bd60..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-functions.lisp +++ /dev/null @@ -1,43 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; init.lisp --- Load libffi and define basics -;;; -;;; Copyright (C) 2009, 2010, 2011 Liam Healy -;;; -;;; 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. -;;; - -(in-package #:cffi) - -;;; See file:///usr/share/doc/libffi-dev/html/The-Basics.html#The-Basics - -(defcfun ("ffi_prep_cif" libffi/prep-cif) status - (ffi-cif :pointer) - (ffi-abi abi) - (nargs :uint) - (rtype :pointer) - (argtypes :pointer)) - -(defcfun ("ffi_call" libffi/call) :void - (ffi-cif :pointer) - (function :pointer) - (rvalue :pointer) - (avalues :pointer)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-types.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-types.lisp deleted file mode 100644 index b2ec1dd..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-types.lisp +++ /dev/null @@ -1,110 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; libffi-types.lisp -- CFFI-Grovel definitions for libffi -;;; -;;; Copyright (C) 2009, 2010, 2011, 2017 Liam M. Healy -;;; -;;; 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. -;;; - -(in-package #:cffi) - -#+linux -(define "_GNU_SOURCE") - -;; When installed through Mac Ports, libffi include files -;; will be found in /opt/local/include. -#+darwin -(cc-flags "-I/opt/local/include/") - -#+openbsd -(cc-flags "-I/usr/local/include") - -#+freebsd -(cc-flags "-I/usr/local/include") - -(pkg-config-cflags "libffi" :optional t) - -#+darwin -(include "ffi/ffi.h") -#-darwin -(include "ffi.h") - -(cenum status - ((:ok "FFI_OK")) - ((:bad-typedef "FFI_BAD_TYPEDEF")) - ((:bad-abi "FFI_BAD_ABI"))) - -#+freebsd -(cenum abi - ((:default-abi "FFI_DEFAULT_ABI"))) - -#+(and windows x86-64) -(cenum abi - ((:default-abi "FFI_DEFAULT_ABI")) - ((:win64 "FFI_WIN64"))) - -#+(and windows (not x86-64)) -(cenum abi - ((:default-abi "FFI_DEFAULT_ABI")) - ((:sysv "FFI_SYSV")) - ((:stdcall "FFI_STDCALL"))) - -#-(or freebsd windows) -(cenum abi - ((:default-abi "FFI_DEFAULT_ABI")) - #-x86-64 - ((:sysv "FFI_SYSV")) - ((:unix64 "FFI_UNIX64"))) - -(ctype ffi-abi "ffi_abi") - -(ctype size-t "size_t") - -(cstruct ffi-type "struct _ffi_type" - (size "size" :type size-t) - (alignment "alignment" :type :unsigned-short) - (type "type" :type :unsigned-short) - (elements "elements" :type :pointer)) - -(cstruct ffi-cif "ffi_cif" - (abi "abi" :type ffi-abi) - (argument-count "nargs" :type :unsigned-int) - (argument-types "arg_types" :type :pointer) - (return-type "rtype" :type :pointer) - (bytes "bytes" :type :unsigned-int) - (flags "flags" :type :unsigned-int)) - -(constant (+type-void+ "FFI_TYPE_VOID")) -(constant (+type-int+ "FFI_TYPE_INT")) -(constant (+type-float+ "FFI_TYPE_FLOAT")) -(constant (+type-double+ "FFI_TYPE_DOUBLE")) -(constant (+type-longdouble+ "FFI_TYPE_LONGDOUBLE")) -(constant (+type-uint8+ "FFI_TYPE_UINT8")) -(constant (+type-sint8+ "FFI_TYPE_SINT8")) -(constant (+type-uint16+ "FFI_TYPE_UINT16")) -(constant (+type-sint16+ "FFI_TYPE_SINT16")) -(constant (+type-uint32+ "FFI_TYPE_UINT32")) -(constant (+type-sint32+ "FFI_TYPE_SINT32")) -(constant (+type-uint64+ "FFI_TYPE_UINT64")) -(constant (+type-sint64+ "FFI_TYPE_SINT64")) -(constant (+type-struct+ "FFI_TYPE_STRUCT")) -(constant (+type-pointer+ "FFI_TYPE_POINTER")) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi.lisp deleted file mode 100644 index 0dd2a54..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi.lisp +++ /dev/null @@ -1,38 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; libffi.lisp --- Load libffi -;;; -;;; Copyright (C) 2009, 2011 Liam M. Healy -;;; -;;; 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. -;;; - -(in-package #:cffi) - -(define-foreign-library (libffi) - (:darwin (:or "libffi.dylib" "libffi32.dylib" "/usr/lib/libffi.dylib")) - (:solaris (:or "/usr/lib/amd64/libffi.so" "/usr/lib/libffi.so")) - (:openbsd "libffi.so") - (:unix (:or "libffi.so.7" "libffi32.so.7" "libffi.so.6" "libffi32.so.6" "libffi.so.5" "libffi32.so.5")) - (:windows (:or "libffi-7.dll" "libffi-6.dll" "libffi-5.dll" "libffi.dll")) - (t (:default "libffi"))) - -(load-foreign-library 'libffi) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/type-descriptors.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/type-descriptors.lisp deleted file mode 100644 index 6e67e31..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/type-descriptors.lisp +++ /dev/null @@ -1,106 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; type-descriptors.lisp --- Build malloc'd libffi type descriptors -;;; -;;; Copyright (C) 2009, 2011 Liam M. Healy -;;; -;;; 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. -;;; - -(in-package #:cffi) - -(defmacro type-descriptor-ptr (type) - `(foreign-symbol-pointer ,(format nil "ffi_type_~(~A~)" type))) - -(defmacro type-descriptor-ptr/integer (type) - `(foreign-symbol-pointer - ,(format nil "ffi_type_~Aint~D" - (if (string-equal type "unsigned" - :end1 (min 8 (length (string type)))) - "u" "s") - (* 8 (foreign-type-size type))))) - -(defun %make-libffi-type-descriptor/struct (type) - (labels - ((slot-multiplicity (slot) - (if (typep slot 'aggregate-struct-slot) - (slot-count slot) - 1)) - (number-of-items (structure-type) - "Total number of items in the foreign structure." - (loop for val being the hash-value of (structure-slots structure-type) - sum (slot-multiplicity val)))) - (let* ((ptr (foreign-alloc '(:struct ffi-type))) - (nitems (number-of-items type)) - (type-pointer-array - (foreign-alloc :pointer :count (1+ nitems)))) - (loop for slot in (slots-in-order type) - for ltp = (make-libffi-type-descriptor - (parse-type (slot-type slot))) - with slot-counter = 0 - do (if ltp - (loop - repeat (slot-multiplicity slot) - do (setf - (mem-aref - type-pointer-array :pointer slot-counter) - ltp) - (incf slot-counter)) - (libffi-error nil - "Slot type ~A in foreign structure is unknown to libffi." - (unparse-type (slot-type slot))))) - (setf (mem-aref type-pointer-array :pointer nitems) - (null-pointer)) - (macrolet ((store (slot value) - `(setf (foreign-slot-value ptr '(:struct ffi-type) ',slot) ,value))) - (store size 0) - (store alignment 0) - (store type +type-struct+) - (store elements type-pointer-array)) - ptr))) - -(defgeneric make-libffi-type-descriptor (object) - (:documentation "Build a libffi struct that describes the type for libffi. This will be used as a cached static read-only argument when the actual call happens.") - (:method ((object foreign-built-in-type)) - (let ((type-keyword (type-keyword object))) - #.`(case type-keyword - ,@(loop - :for type :in (append *built-in-float-types* - *other-builtin-types*) - :collect `(,type (type-descriptor-ptr ,type))) - ,@(loop - :for type :in *built-in-integer-types* - :collect `(,type (type-descriptor-ptr/integer ,type))) - ;; there's a generic error report in an :around method - ))) - (:method ((type foreign-pointer-type)) - ;; simplify all pointer types into a void* - (type-descriptor-ptr :pointer)) - (:method ((type foreign-struct-type)) - (%make-libffi-type-descriptor/struct type)) - (:method :around (object) - (let ((result (call-next-method))) - (assert result () "~S failed on ~S. That's bad." - 'make-libffi-type-descriptor object) - result)) - (:method ((type foreign-type-alias)) - ;; Set the type pointer on demand for alias types (e.g. typedef, enum, etc) - (make-libffi-type-descriptor (actual-type type)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/scripts/release.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/scripts/release.lisp deleted file mode 100644 index ee2c094..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/scripts/release.lisp +++ /dev/null @@ -1,248 +0,0 @@ -#!/usr/bin/env clisp -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- - -(defpackage :release-script (:use #:cl #:regexp)) -(in-package :release-script) - -;;;; Configuration ------------------------------------------------------------ - -(defparameter *project-name* "cffi") -(defparameter *asdf-file* (format nil "~A.asd" *project-name*)) - -(defparameter *host* "common-lisp.net") -(defparameter *release-dir* - (format nil "/project/~A/public_html/releases" *project-name*)) - -(defparameter *version-file* "VERSION") -(defparameter *version-file-dir* - (format nil "/project/~A/public_html" *project-name*)) - -;;;; -------------------------------------------------------------------------- - -;;;; Utilities - -(defun ensure-list (x) - (if (listp x) x (list x))) - -(defmacro string-case (expression &body clauses) - `(let ((it ,expression)) ; yes, anaphoric, deal with it. - (cond - ,@(loop for clause in clauses collect - `((or ,@(loop for alternative in (ensure-list (first clause)) - collect (or (eq t alternative) - `(string= it ,alternative)))) - ,@(rest clause)))))) - -(defparameter *development-mode* nil) - -(defun die (format-control &rest format-args) - (format *error-output* "~?" format-control format-args) - (if *development-mode* - (cerror "continue" "die") - (ext:quit 1))) - -(defun numeric-split (string) - (if (digit-char-p (char string 0)) - (multiple-value-bind (number next-position) - (parse-integer string :junk-allowed t) - (cons number (when (< next-position (length string)) - (numeric-split (subseq string next-position))))) - (let ((next-digit-position (position-if #'digit-char-p string))) - (if next-digit-position - (cons (subseq string 0 next-digit-position) - (numeric-split (subseq string next-digit-position))) - (list string))))) - -(defun natural-string-< (s1 s2) - (labels ((aux< (l1 l2) - (cond ((null l1) (not (null l2))) - ((null l2) nil) - (t (destructuring-bind (x . xs) l1 - (destructuring-bind (y . ys) l2 - (cond ((and (numberp x) (stringp y)) - t) - ((and (numberp y) (stringp x)) - nil) - ((and (numberp x) (numberp y)) - (or (< x y) (and (= x y) (aux< xs ys)))) - (t - (or (string-lessp x y) - (and (string-equal x y) - (aux< xs ys))))))))))) - (aux< (numeric-split s1) - (numeric-split s2)))) - -;;;; Running commands - -(defparameter *dry-run* nil) - -(defun cmd? (format-control &rest format-args) - (let ((cmd (format nil "~?" format-control format-args))) - (with-open-stream (s1 (ext:run-shell-command cmd :output :stream)) - (loop for line = (read-line s1 nil nil) - while line - collect line)))) - -;; XXX: quote arguments. -(defun cmd (format-control &rest format-args) - (when *development-mode* - (format *debug-io* "CMD: ~?~%" format-control format-args)) - (let ((ret (ext:run-shell-command (format nil "~?" format-control format-args)))) - (or (null ret) - (zerop ret)))) - -(defun cmd! (format-control &rest format-args) - (or (apply #'cmd format-control format-args) - (die "cmd '~?' failed." format-control format-args))) - -(defun maybe-cmd! (format-control &rest format-args) - (if *dry-run* - (format t "SUPPRESSING: ~?~%" format-control format-args) - (apply #'cmd! format-control format-args))) - -;;;; - -(defun find-current-version () - (subseq (reduce (lambda (x y) (if (natural-string-< x y) y x)) - (or (cmd? "git tag -l v\\*") - (die "no version tags found. Please specify initial version."))) - 1)) - -(defun parse-version (string) - (mapcar (lambda (x) - (parse-integer x :junk-allowed t)) - (loop repeat 3 ; XXX: parameterize - for el in (regexp-split "\\." (find-current-version)) - collect el))) - -(defun check-for-unrecorded-changes (&optional force) - (unless (cmd "git diff --exit-code") - (write-line "Unrecorded changes.") - (if force - (write-line "Continuing anyway.") - (die "Aborting.~@ - Use -f or --force if you want to make a release anyway.")))) - -(defun new-version-number-candidates (current-version) - (labels ((alternatives (before after) - (when after - (cons (append before - (list (1+ (first after))) - (mapcar (constantly 0) (rest after))) - (alternatives (append before (list (first after))) - (rest after)))))) - (loop for alt in (alternatives nil (parse-version current-version)) - collect (format nil "~{~d~^.~}" alt)))) - -(defun ask-user-for-version (current-version next-versions) - (format *query-io* "Current version is ~A. Which will be the next one?~%" - current-version) - (loop for i from 1 and version in next-versions - do (format *query-io* "~T~A) ~A~%" i version)) - (format *query-io* "? ") - (finish-output *query-io*) - (nth (1- (parse-integer (read-line) :junk-allowed t)) - next-versions)) - -(defun git-tag-tree (version) - (write-line "Tagging the tree...") - (maybe-cmd! "git tag \"v~A\"" version)) - -(defun add-version-to-system-file (version path-in path-out) - (let ((defsystem-line (format nil "(defsystem :~A" *project-name*))) - (with-open-file (in path-in :direction :input) - (with-open-file (out path-out :direction :output) - (loop for line = (read-line in nil nil) while line - do (write-line line out) - when (string= defsystem-line line) - do (format out " :version ~s~%" version)))))) - -(defun create-dist (version distname) - (write-line "Creating distribution...") - (cmd! "mkdir \"~a\"" distname) - (cmd! "git archive master | tar xC \"~A\"" distname) - (format t "Updating ~A with new version: ~A~%" *asdf-file* version) - (let* ((asdf-file-path (format nil "~A/~A" distname *asdf-file*)) - (tmp-asdf-file-path (format nil "~a.tmp" asdf-file-path))) - (add-version-to-system-file version asdf-file-path tmp-asdf-file-path) - (cmd! "mv \"~a\" \"~a\"" tmp-asdf-file-path asdf-file-path))) - -(defun tar-and-sign (distname tarball) - (write-line "Creating and signing tarball...") - (cmd! "tar czf \"~a\" \"~a\"" tarball distname) - (cmd! "gpg -b -a \"~a\"" tarball)) - -(defparameter *remote-directory* (format nil "~A:~A" *host* *release-dir*)) - -(defun upload-tarball (tarball signature remote-directory) - (write-line "Copying tarball to web server...") - (maybe-cmd! "scp \"~A\" \"~A\" \"~A\"" tarball signature remote-directory) - (format t "Uploaded ~A and ~A.~%" tarball signature)) - -(defun update-remote-links (tarball signature host release-dir project-name) - (format t "Updating ~A_latest links...~%" project-name) - (maybe-cmd! "ssh \"~A\" ln -sf \"~A\" \"~A/~A_latest.tar.gz\"" - host tarball release-dir project-name) - (maybe-cmd! "ssh \"~A\" ln -sf \"~A\" \"~A/~A_latest.tar.gz.asc\"" - host signature release-dir project-name)) - -(defun upload-version-file (version version-file host version-file-dir) - (format t "Uploading ~A...~%" version-file) - (with-open-file (out version-file :direction :output) - (write-string version out)) - (maybe-cmd! "scp \"~A\" \"~A\":\"~A\"" version-file host version-file-dir) - (maybe-cmd! "rm \"~A\"" version-file)) - -(defun maybe-clean-things-up (tarball signature) - (when (y-or-n-p "Clean local tarball and signature?") - (cmd! "rm \"~A\" \"~A\"" tarball signature))) - -(defun run (force version) - (check-for-unrecorded-changes force) - ;; figure out what version we'll be preparing. - (unless version - (let* ((current-version (find-current-version)) - (next-versions (new-version-number-candidates current-version))) - (setf version (or (ask-user-for-version current-version next-versions) - (die "invalid selection."))))) - (git-tag-tree version) - (let* ((distname (format nil "~A_~A" *project-name* version)) - (tarball (format nil "~A.tar.gz" distname)) - (signature (format nil "~A.asc" tarball))) - ;; package things up. - (create-dist version distname) - (tar-and-sign distname tarball) - ;; upload. - (upload-tarball tarball signature *remote-directory*) - (update-remote-links tarball signature *host* *release-dir* *project-name*) - (when *version-file* - (upload-version-file version *version-file* *host* *version-file-dir*)) - ;; clean up. - (maybe-clean-things-up tarball signature) - ;; documentation. - (write-line "Building and uploading documentation...") - (maybe-cmd! "make -C doc upload-docs") - ;; push tags and any outstanding changes. - (write-line "Pushing tags and changes...") - (maybe-cmd! "git push --tags origin master"))) - - -;;;; Do it to it - -(let ((force nil) - (version nil) - (args ext:*args*)) - (loop while args - do (string-case (pop args) - (("-h" "--help") - (write-line "No help, sorry. Read the source.") - (ext:quit 0)) - (("-f" "--force") - (setf force t)) - (("-v" "--version") - (setf version (pop args))) - (("-n" "--dry-run") - (setf *dry-run* t)) - (t - (die "Unrecognized argument '~a'" it)))) - (run force version)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/asdf.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/asdf.lisp deleted file mode 100644 index 6f7d207..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/asdf.lisp +++ /dev/null @@ -1,211 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; asdf.lisp --- ASDF components for cffi/c2ffi. -;;; -;;; Copyright (C) 2015, Attila Lendvai -;;; -;;; 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. -;;; - -(in-package #:cffi/c2ffi) - -(defclass c2ffi-file (cl-source-file) - ((package :initarg :package - :initform nil - :accessor c2ffi-file/package) - (c2ffi-executable :initarg :c2ffi-executable - :accessor c2ffi-file/c2ffi-executable) - (trace-c2ffi :initarg :trace-c2ffi - :accessor c2ffi-file/trace-c2ffi) - (prelude :initform nil - :initarg :prelude - :accessor c2ffi-file/prelude) - (sys-include-paths :initarg :sys-include-paths - :initform nil - :accessor c2ffi-file/sys-include-paths) - (exclude-archs :initarg :exclude-archs - :initform nil - :accessor c2ffi-file/exclude-archs) - ;; The following slots correspond to an arg of the same name for - ;; the generator function. No accessors are needed, they just hold - ;; the data until it gets delegated to the generator function using - ;; SLOT-VALUE and a LOOP. - (ffi-name-transformer :initarg :ffi-name-transformer - :initform 'default-ffi-name-transformer) - (ffi-name-export-predicate :initarg :ffi-name-export-predicate - :initform 'default-ffi-name-export-predicate) - (ffi-type-transformer :initarg :ffi-type-transformer - :initform 'default-ffi-type-transformer) - (callback-factory :initarg :callback-factory - :initform 'default-callback-factory) - (foreign-library-name :initarg :foreign-library-name - :initform nil) - (foreign-library-spec :initarg :foreign-library-spec - :initform nil) - (emit-generated-name-mappings :initarg :emit-generated-name-mappings - :initform :t) - (include-sources :initarg :include-sources - :initform :all) - (exclude-sources :initarg :exclude-sources - :initform nil) - (include-definitions :initarg :include-definitions - :initform :all) - (exclude-definitions :initarg :exclude-definitions - :initform nil)) - (:default-initargs - :type nil) - (:documentation - "The input of this ASDF component is a C header file and the configuration for -the binding generation process. This header file will define the initial scope of -the generation process, which can be further filtered by other configuration -parameters. - -A clang/llvm based external program called 'c2ffi' is used to process this header -file and generate a json spec file for each supported architecture triplet. Normally -these .spec files are only (re)generated by the author of the lib and are checked into -the corresponding source repository. It needs to be done manually by invoking the -following command: - -(cffi/c2ffi:generate-spec :your-system) - -which is a shorthand for: - -(asdf:operate 'cffi/c2ffi::generate-spec-op :your-system) - -The generation of the underlying platform's json file must succeed, but the -generation for the other arch's is allowed to fail -\(see ENSURE-SPEC-FILE-IS-UP-TO-DATE for details). - -During the normal build process the json file is used as the input to generate -a lisp file containing the CFFI definitions (see PROCESS-C2FFI-SPEC-FILE). -This file will be placed next to the .spec file, and will be compiled as any -other lisp file. This process requires loading the ASDF system called -\"cffi/c2ffi-generator\" that has more dependencies than CFFI itself. If you -want to avoid those extra dependencies in your project, then you can check in -these generated lisp files into your source repository, but keep in mind that -you'll need to manually force their regeneration if CFFI/C2FFI itself gets -updated (by e.g. deleting them from the filesystem) .")) - -(defun input-file (operation component) - (let ((files (input-files operation component))) - (assert (length=n-p files 1)) - (first files))) - -(defclass generate-spec-op (downward-operation) - ()) - -(defun generate-spec (system) - (asdf:operate 'generate-spec-op system)) - -(defmethod input-files ((op generate-spec-op) (c c2ffi-file)) - (list (component-pathname c))) - -(defmethod component-depends-on ((op generate-spec-op) (c c2ffi-file)) - `((prepare-op ,c) ,@(call-next-method))) - -(defmethod output-files ((op generate-spec-op) (c c2ffi-file)) - (let* ((input-file (input-file op c)) - (spec-file (spec-path input-file))) - (values - (list spec-file) - ;; Tell ASDF not to apply output translation. - t))) - -(defmethod perform ((op generate-spec-op) (c asdf:component)) - (values)) - -(defmethod perform ((op generate-spec-op) (c c2ffi-file)) - (let ((input-file (input-file op c)) - (*c2ffi-executable* (if (slot-boundp c 'c2ffi-executable) - (c2ffi-file/c2ffi-executable c) - *c2ffi-executable*)) - (*trace-c2ffi* (if (slot-boundp c 'trace-c2ffi) - (c2ffi-file/trace-c2ffi c) - *trace-c2ffi*))) - ;; NOTE: we don't call OUTPUT-FILE here, which may be a violation - ;; of the ASDF contract, that promises that OUTPUT-FILE can be - ;; customized by users. - (ensure-spec-file-is-up-to-date - input-file - :exclude-archs (c2ffi-file/exclude-archs c) - :sys-include-paths (c2ffi-file/sys-include-paths c)))) - -(defclass generate-lisp-op (downward-operation) - ()) - -(defmethod component-depends-on ((op generate-lisp-op) (c c2ffi-file)) - `((load-op ,(find-system "cffi/c2ffi-generator")) - ,@(call-next-method))) - -(defmethod component-depends-on ((op compile-op) (c c2ffi-file)) - `((generate-lisp-op ,c) ,@(call-next-method))) - -(defmethod component-depends-on ((op load-source-op) (c c2ffi-file)) - `((generate-lisp-op ,c) ,@(call-next-method))) - -(defmethod input-files ((op generate-lisp-op) (c c2ffi-file)) - (list (output-file 'generate-spec-op c))) - -(defmethod input-files ((op compile-op) (c c2ffi-file)) - (list (output-file 'generate-lisp-op c))) - -(defmethod output-files ((op generate-lisp-op) (c c2ffi-file)) - (let* ((spec-file (input-file op c)) - (generated-lisp-file (make-pathname :type "lisp" - :defaults spec-file))) - (values - (list generated-lisp-file) - ;; Tell ASDF not to apply output translation. - t))) - -(defmethod perform ((op generate-lisp-op) (c c2ffi-file)) - (let ((spec-file (input-file op c)) - (generated-lisp-file (output-file op c))) - (with-staging-pathname (tmp-output generated-lisp-file) - (format *debug-io* "~&; CFFI/C2FFI is generating the file ~S~%" generated-lisp-file) - (apply 'process-c2ffi-spec-file - spec-file (c2ffi-file/package c) - :output tmp-output - :output-encoding (asdf:component-encoding c) - :prelude (let ((prelude (c2ffi-file/prelude c))) - (if (and (pathnamep prelude) - (not (absolute-pathname-p prelude))) - (merge-pathnames* prelude (component-pathname c)) - prelude)) - ;; The following slots and keyword args have the same name in the ASDF - ;; component and in PROCESS-C2FFI-SPEC-FILE, and this loop copies them. - (loop - :for arg :in '(ffi-name-transformer - ffi-name-export-predicate - ffi-type-transformer - callback-factory - foreign-library-name - foreign-library-spec - emit-generated-name-mappings - include-sources - exclude-sources - include-definitions - exclude-definitions) - :append (list (make-keyword arg) - (slot-value c arg))))))) - -;; Allow for naked :cffi/c2ffi-file in asdf definitions. -(setf (find-class 'asdf::cffi/c2ffi-file) (find-class 'c2ffi-file)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/c2ffi.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/c2ffi.lisp deleted file mode 100644 index c3a88fa..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/c2ffi.lisp +++ /dev/null @@ -1,194 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; c2ffi.lisp --- c2ffi related code -;;; -;;; Copyright (C) 2013, Ryan Pavlik -;;; Copyright (C) 2015, Attila Lendvai -;;; -;;; 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. -;;; - -(in-package #:cffi/c2ffi) - -;;; NOTE: Most of this has been taken over from cl-autowrap. - -;;; Note this is rather untested and not very extensive at the moment; -;;; it should probably work on linux/win/osx though. Patches welcome. - -(defun local-cpu () - #+x86-64 "x86_64" - #+(and (not (or x86-64 freebsd)) x86) "i686" - #+(and (not x86-64) x86 freebsd) "i386" - #+arm "arm") - -(defun local-vendor () - #+(or linux windows) "-pc" - #+darwin "-apple" - #+(not (or linux windows darwin)) "-unknown") - -(defun local-os () - #+linux "-linux" - #+windows "-windows-msvc" - #+darwin "-darwin9" - #+freebsd "-freebsd") - -(defun local-environment () - #+linux "-gnu" - #-linux "") - -(defun local-arch () - (strcat (local-cpu) (local-vendor) (local-os) (local-environment))) - -(defparameter *known-archs* - '("i686-pc-linux-gnu" - "x86_64-pc-linux-gnu" - "i686-pc-windows-msvc" - "x86_64-pc-windows-msvc" - "i686-apple-darwin9" - "x86_64-apple-darwin9" - "i386-unknown-freebsd" - "x86_64-unknown-freebsd")) - -(defvar *c2ffi-executable* "c2ffi") - -(defvar *trace-c2ffi* nil) - -(defun c2ffi-executable-available? () - ;; This is a hack to determine if c2ffi exists; it assumes if it - ;; doesn't exist, we will get a return code other than 0. - (zerop (nth-value 2 (uiop:run-program `(,*c2ffi-executable* "-h") - :ignore-error-status t)))) - -(defun run-program* (program args &key (output (if *trace-c2ffi* *standard-output* nil)) - (error-output (if *trace-c2ffi* *error-output* nil)) - ignore-error-status) - (when *trace-c2ffi* - (format *debug-io* "~&; Invoking: ~A~{ ~A~}~%" program args)) - (zerop (nth-value 2 (uiop:run-program (list* program args) :output output - :error-output error-output - :ignore-error-status ignore-error-status)))) - -(defun generate-spec-with-c2ffi (input-header-file output-spec-path - &key arch sys-include-paths ignore-error-status) - "Run c2ffi on `INPUT-HEADER-FILE`, outputting to `OUTPUT-FILE` and -`MACRO-OUTPUT-FILE`, optionally specifying a target triple `ARCH`." - (uiop:with-temporary-file (:pathname tmp-macro-file - :keep *trace-c2ffi*) - nil ; workaround for an UIOP bug; delme eventually (attila, 2016-01-27). - :close-stream - (let* ((arch (when arch (list "--arch" arch))) - (sys-include-paths (loop - :for dir :in sys-include-paths - :append (list "--sys-include" dir)))) - ;; Invoke c2ffi to first emit C #define's into TMP-MACRO-FILE. We ask c2ffi - ;; to first generate a file of C global variables that are assigned the - ;; value of the corresponding #define's, so that in the second pass below - ;; the C compiler evaluates for us their right hand side and thus we can - ;; get hold of their value. This is a kludge and eventually we could/should - ;; support generating cffi-grovel files, and in grovel mode not rely - ;; on this kludge anymore. - (when (run-program* *c2ffi-executable* (list* (namestring input-header-file) - "--driver" "null" - "--macro-file" (namestring tmp-macro-file) - (append arch sys-include-paths)) - :output *standard-output* - :ignore-error-status ignore-error-status) - ;; Write a tmp header file that #include's the original input file and - ;; the above generated macros file which will form the input for our - ;; final, second pass. - (uiop:with-temporary-file (:stream tmp-include-file-stream - :pathname tmp-include-file - :keep *trace-c2ffi*) - (format tmp-include-file-stream "#include \"~A\"~%" input-header-file) - (format tmp-include-file-stream "#include \"~A\"~%" tmp-macro-file) - :close-stream - ;; Invoke c2ffi again to generate the final output. - (run-program* *c2ffi-executable* (list* (namestring tmp-include-file) - "--output" (namestring output-spec-path) - (append arch sys-include-paths)) - :output *standard-output* - :ignore-error-status ignore-error-status)))))) - -(defun spec-path (base-name &key version (arch (local-arch))) - (check-type base-name pathname) - (make-pathname :defaults base-name - :name (strcat (pathname-name base-name) - (if version - (strcat "-" version) - "") - "." - arch) - :type "spec")) - -(defun find-local-spec (base-name &optional (errorp t)) - (let* ((spec-path (spec-path base-name)) - (probed (probe-file spec-path))) - (if probed - spec-path - (when errorp - (error "c2ffi spec file not found for base name ~S" base-name))))) - -(defun ensure-spec-file-is-up-to-date (header-file-path - &key exclude-archs sys-include-paths version) - (let ((spec-path (find-local-spec header-file-path nil))) - (flet ((regenerate-spec-file () - (let ((local-arch (local-arch))) - (unless (c2ffi-executable-available?) - (error "No spec found for ~S on arch '~A' and c2ffi not found" - header-file-path local-arch)) - (generate-spec-with-c2ffi header-file-path - (spec-path header-file-path - :arch local-arch - :version version) - :arch local-arch - :sys-include-paths sys-include-paths) - ;; Try to run c2ffi for other architectures, but tolerate failure - (dolist (arch *known-archs*) - (unless (or (string= local-arch arch) - (member arch exclude-archs :test #'string=)) - (unless (generate-spec-with-c2ffi header-file-path - (spec-path header-file-path - :arch arch - :version version) - :arch arch - :sys-include-paths sys-include-paths - :ignore-error-status t) - (warn "Failed to generate spec for other arch: ~S" arch)))) - (find-local-spec header-file-path)))) - (if (and spec-path - (uiop:timestamp< (file-write-date header-file-path) - (file-write-date spec-path))) - spec-path ; it's up to date, just return it as is - (restart-case - (regenerate-spec-file) - (touch-old-copy () - :report (lambda (stream) - (format stream "Update the modification time of the out-of-date copy ~S" spec-path)) - ;; Make it only be visible when the spec file exists (but it's out of date) - :test (lambda (condition) - (declare (ignore condition)) - (not (null spec-path))) - ;; Update the last modification time. Yes, it's convoluted and wasteful, - ;; but I can't see any other way. - (with-staging-pathname (tmp-file spec-path) - (copy-file spec-path tmp-file)) - ;; The return value of RESTART-CASE - spec-path)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/generator.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/generator.lisp deleted file mode 100644 index 6010957..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/generator.lisp +++ /dev/null @@ -1,838 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; generator.lisp --- Generate CFFI bindings for a c2ffi output. -;;; -;;; Copyright (C) 2015, Attila Lendvai -;;; -;;; 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. -;;; - -(in-package #:cffi/c2ffi) - -;;; Output generation happens in one phase, straight into the output -;;; stream. There's minimal look-ahead (for source-location and name) -;;; which is needed to apply user specified filters in time. -;;; -;;; Each CFFI form is also EVAL'd during generation because the CFFI -;;; type lookup/parsing mechanism is used while generating the output. -;;; -;;; Nomenclature: -;;; -;;; - variable names in this file are to be interpreted in the -;;; C,c2ffi,json context, and 'cffi' is added to names that denote -;;; the cffi name. -;;; -;;; Possible improvments: -;;; -;;; - generate an additional grovel file for C inline function -;;; declarations found in header files -;;; -;;; - generate struct-by-value DEFCFUN's into a separate file so that -;;; users can decide whether to depend on libffi, or they can make do -;;; without those definitions - -(defvar *allow-pointer-type-simplification* t) -(defvar *allow-skipping-struct-fields* t) -(defvar *assume-struct-by-value-support* t) -;; Called on the json name and may return a symbol to be used, or a string. -(defvar *ffi-name-transformer* 'default-ffi-name-transformer) -;; Called on the already transformed name to decide whether to export it -(defvar *ffi-name-export-predicate* 'default-ffi-name-export-predicate) -;; Called on the CFFI type, e.g. to turn (:pointer :char) into a :string. -(defvar *ffi-type-transformer* 'default-ffi-type-transformer) -;; May return up to two closures using VALUES. The first one will be called -;; with each emitted form, and the second one once, at the end. They both may -;; return a list of forms that will be emitted using OUTPUT/CODE. -(defvar *callback-factory* 'default-callback-factory) - -(define-constant +generated-file-header+ - ";;; -*- Mode: lisp -*-~%~ - ;;;~%~ - ;;; This file has been automatically generated by cffi/c2ffi. Editing it by hand is not wise.~%~ - ;;;~%~%" - :test 'equal) - -(defvar *c2ffi-output-stream*) - -(defun output/export (names package) - (let ((names (uiop:ensure-list names))) - ;; Make sure we have something PRINT-READABLY as a package name, - ;; i.e. not a SIMPLE-BASE-STRING on SBCL. - (output/code `(export ',names ',(make-symbol (package-name package)))))) - -(defun output/code (form) - (check-type form cons) - (format *c2ffi-output-stream* "~&") - (write form - :stream *c2ffi-output-stream* - :circle t - :pretty t - :escape t - :readably t) - (format *c2ffi-output-stream* "~%~%") - (unless (member (first form) '(cffi:defcfun alexandria:define-constant) :test 'eq) - (eval form))) - -(defun output/string (message-control &rest message-arguments) - (apply 'format *c2ffi-output-stream* message-control message-arguments)) - -;; NOTE: as per c2ffi json output. A notable difference to -;; CFFI::*BUILT-IN-FOREIGN-TYPES* is the presence of :SIGNED-CHAR. -(define-constant +c-builtin-types+ '(":void" ":_Bool" ":char" ":signed-char" ":unsigned-char" ":short" - ":unsigned-short" ":int" ":unsigned-int" ":long" ":unsigned-long" - ":long-long" ":unsigned-long-long" ":float" ":double" ":long-double") - :test 'equal) - -(define-condition unsupported-type (cffi::foreign-type-error) - ((json-definition :initarg :json-definition - :accessor json-definition-of))) - -(defun unsupported-type (json-entry) - (error 'unsupported-type :type-name nil :json-definition json-entry)) - -;;;;;; -;;; Utilities - -(defun compile-rules (rules) - (case rules - (:all rules) - (t (mapcar (lambda (pattern) - (check-type pattern string "Patterns in the inclusion/exclusion rules must be strings.") - (let ((scanner (cl-ppcre:create-scanner pattern))) - (named-lambda cffi/c2ffi/cl-ppcre-rule-matcher - (string) - (funcall scanner string 0 (length string))))) - rules)))) - -(defun include-definition? (name source-location - include-definitions exclude-definitions - include-sources exclude-sources) - (labels - ((covered-by-a-rule? (name rules) - (or (eq rules :all) - (not (null (some (rcurry #'funcall name) rules))))) - (weak? (rules) - (eq :all rules)) - (strong? (name rules) - (and name - (not (weak? rules)) - (covered-by-a-rule? name rules)))) - (let* ((excl-def/weak (weak? exclude-definitions)) - (excl-def/strong (strong? name exclude-definitions)) - (incl-def/weak (weak? include-definitions)) - (incl-def/strong (strong? name include-definitions)) - (excl-src/weak (weak? exclude-sources)) - (excl-src/strong (strong? source-location exclude-sources)) - (incl-src/weak (weak? include-sources)) - (incl-src/strong (strong? source-location include-sources)) - (incl/strong (or incl-def/strong - incl-src/strong)) - (excl/strong (or excl-def/strong - excl-src/strong)) - (incl/weak (or incl-def/weak - incl-src/weak)) - (excl/weak (or excl-def/weak - excl-src/weak))) - (or incl-def/strong - (and (not excl/strong) - (or incl/strong - (and incl/weak - ;; we want src exclude rules to be stronger - (not excl-src/weak)) - (not excl/weak))))))) - -(defun coerce-to-byte-size (bit-size) - (let ((byte-size (/ bit-size 8))) - (unless (integerp byte-size) - (error "Non-byte size encountered where it wasn't expected (~A bits)" bit-size)) - byte-size)) - -(defmacro assume (condition &optional format-control &rest format-arguments) - "Similar to ASSERT, but WARN's only." - `(unless ,condition - ,(if format-control - `(warn ,format-control ,@format-arguments) - `(warn "ASSUME failed: ~S" ',condition)))) - -(defun canonicalize-transformer-hook (hook) - (etypecase hook - ((and (or function symbol) - (not null)) - hook) - (string - (the symbol (safe-read-from-string hook))))) - -;;;;;; -;;; Json access - -(defun json-value (alist key &key (otherwise nil otherwise?)) - (check-type alist list) - (check-type key (and symbol (not null))) - (let* ((entry (assoc key alist)) - (result (cond - (entry - (cdr entry)) - (otherwise? - otherwise) - (t (error "Key ~S not found in json entry ~S." key alist))))) - (if (equal result "") - nil - result))) - -(defmacro with-json-values ((json-entry &rest args) &body body) - (if (null args) - `(progn - ,@body) - (once-only (json-entry) - `(let (,@(loop - :for entry :in args - :collect (let* ((args (ensure-list entry)) - (name (pop args)) - (key (or (pop args) - (make-keyword (symbol-name name))))) - (destructuring-bind - ;; using &optional would trigger a warning (on SBCL) - (&key (otherwise nil otherwise?)) - args - `(,name - (json-value ,json-entry ,key ,@(when otherwise? - `(:otherwise ,otherwise)))))))) - ,@body)))) - -(defun expected-json-keys (alist &rest keys) - (let* ((keys (list* :location keys)) - (outliers (remove-if (lambda (el) - (member (car el) keys :test 'eq)) - alist))) - (when outliers - (warn "Unexpected key(s) in json entry ~S: ~S" alist outliers)))) - -;;;;;; -;;; Namespaces, names and conversions - -;; an alist of (name . hashtable) -(defvar *generated-names*) -(defvar *anon-name-counter*) -(defvar *anon-entities*) - -(defun register-anon-entity (id name) - (check-type id integer) - (check-type name string) - (assert (not (zerop (length name)))) - (setf (gethash id *anon-entities*) name) - name) - -(defun lookup-anon-entity (id) - (or (gethash id *anon-entities*) - (error "Could not find anonymous entity with id ~S." id))) - -(defun generate-anon-name (base-name) - (format nil "~A" - (strcat (symbol-name base-name) - (princ-to-string (incf *anon-name-counter*))))) - -(defun valid-name-or-die (name) - ;; checks for valid json names (*not* CFFI names) - (etypecase name - (string - (assert (not (zerop (length name))))) - (cons - (assert (= 2 (length name))) - (assert (member (first name) '(:struct :union :enum))) - (valid-name-or-die (second name))))) - -(defun call-hook (hook &rest args) - (apply hook - ;; indiscriminately add one keyword arg entry to warn - (append args '(just-a-warning "Make sure your transformer hook has &key &allow-other-keys for future extendability.")))) - -(defun find-cffi-type-or-die (type-name &optional (namespace :default)) - (when (eq namespace :enum) - ;; TODO FIXME this should be cleaned up in CFFI. more about namespace confusion at: - ;; https://bugs.launchpad.net/cffi/+bug/1527947 - (setf namespace :default)) - (cffi::find-type-parser type-name namespace)) - -(define-constant +name-kinds+ '(:struct :union :function :variable :type - :constant :field :argument :enum :member) - :test 'equal) - -(deftype ffi-name-kind () - '#.(list* 'member +name-kinds+)) - -(defun json-name-to-cffi-name (name kind &optional anonymous) - (check-type name string) - (check-type kind ffi-name-kind) - (when *ffi-name-transformer* - (setf name (call-hook *ffi-name-transformer* name kind)) - (unless (or (and (symbolp name) - (not (null name))) - (stringp name)) - (error "The FFI-NAME-TRANSFORMER ~S returned with ~S which is not a valid name." - *ffi-name-transformer* name))) - (let ((cffi-name (if (symbolp name) - name - (intern name)))) - (when (and (not anonymous) - (boundp '*generated-names*)) - ;; TODO FIXME this function also gets called for e.g. argument types of a function. and - ;; if the function ends up *not* getting emitted, e.g. because of a missing type, then - ;; we wrongly record here the missing type in the *generated-names* registry. - (setf (gethash name (cdr (assoc kind *generated-names*))) - cffi-name)) - cffi-name)) - -(defun default-callback-factory (&key &allow-other-keys) - (values)) - -(defun default-ffi-name-transformer (name kind &key &allow-other-keys) - (check-type name string) - (case kind - #+nil - ((:constant :member) - (assert (not (symbolp name))) - (format nil "+~A+" name)) - (t name))) - -(defun change-case-to-readtable-case (name &optional (reatable *readtable*)) - (ecase (readtable-case reatable) - (:upcase (string-upcase name)) - (:downcase (string-downcase name)) - (:preserve name) - ;; (:invert no, you don't) - )) - -(defun camelcased? (name) - (and (>= (length name) 3) - (let ((lower 0) - (upper 0)) - (loop - :for char :across name - :do (cond - ((upper-case-p char) - (incf upper)) - ((lower-case-p char) - (incf lower)))) - (unless (or (zerop lower) - (zerop upper)) - (let ((ratio (/ upper lower))) - (and (<= 0.05 ratio 0.5))))))) - -(defun camelcase-to-dash-separated (name) - (coerce (loop - :for char :across name - :for index :from 0 - :when (and (upper-case-p char) - (not (zerop index))) - :collect #\- - :collect (char-downcase char)) - 'string)) - -(defun maybe-camelcase-to-dash-separated (name) - (if (camelcased? name) - (camelcase-to-dash-separated name) - name)) - -(defun default-ffi-name-export-predicate (symbol &key &allow-other-keys) - (declare (ignore symbol)) - nil) - -(defun default-ffi-type-transformer (type context &key &allow-other-keys) - (declare (ignore context)) - (cond - ((and (consp type) - (eq :pointer (first type))) - (let ((pointed-to-type (second type))) - (if (eq pointed-to-type :char) - :string - type))) - (t - type))) - -(defun function-pointer-type-name () - (symbolicate '#:function-pointer)) - -(defmacro with-allowed-foreign-type-errors ((on-failure-form &key (enabled t)) &body body) - (with-unique-names (type-block) - `(block ,type-block - (handler-bind - ((cffi::foreign-type-error - (lambda (_) - (declare (ignore _)) - (when ,enabled - (return-from ,type-block ,on-failure-form))))) - ,@body)))) - -(defun %json-type-to-cffi-type (json-entry) - (with-json-values (json-entry tag) - (let ((cffi-type - (cond - ((switch (tag :test 'equal) - (":void" :void) - (":_Bool" :bool) - ;; regarding :signed-char see https://stackoverflow.com/questions/436513/char-signed-char-char-unsigned-char - (":char" :char) - (":signed-char" :char) - (":unsigned-char" :unsigned-char) - (":short" :short) - (":unsigned-short" :unsigned-short) - (":int" :int) - (":unsigned-int" :unsigned-int) - (":long" :long) - (":unsigned-long" :unsigned-long) - (":long-long" :long-long) - (":unsigned-long-long" :unsigned-long-long) - (":float" :float) - (":double" :double) - ;; TODO FIXME - ;;(":long-double" :long-double) - ) - ;; return the result of the condition expression - ) - ((or (progn - (assert (not (member tag +c-builtin-types+ :test 'equal)) () - "Not all C basic types are covered! The outlier is: ~S" tag) - nil) - (equal tag ":struct") - (equal tag ":union")) - ;; ":struct" is a "struct foo-struct var" kind of reference - (expected-json-keys json-entry :name :tag :id) - (with-json-values (json-entry name id) - (let* ((kind (if (equal tag ":struct") - :struct - :union)) - (cffi-name (if name - (json-name-to-cffi-name name kind) - (lookup-anon-entity id)))) - (find-cffi-type-or-die cffi-name kind) - `(,kind ,cffi-name)))) - ((or (equal tag "struct") - (equal tag "union")) - ;; "struct" denotes a "struct {} var", or "typedef struct {} my_type" - ;; kind of inline anonymous declaration. Let's call PROCESS-C2FFI-ENTRY - ;; to emit it for us, and return with the generated name (first value) - ;; as if it was a standalone toplevel struct definition. - ;; TODO is it a problem that we don't invoke the CALLBACK-FACTORY stuff here? - (let ((form (process-c2ffi-entry json-entry)) - (kind (if (equal tag "struct") - :struct - :union))) - (assert (and (consp form) - (member (first form) '(cffi:defcstruct cffi:defcunion)))) - `(,kind ,(first (ensure-list (second form)))))) - ((equal tag ":enum") - ;; ":enum" is an "enum foo var" kind of reference - (expected-json-keys json-entry :name :tag :id) - (with-json-values (json-entry name id) - (let ((cffi-name (json-name-to-cffi-name (or name - (lookup-anon-entity id)) - :enum))) - (find-cffi-type-or-die cffi-name :enum) - ;; TODO FIXME this would be the proper one, but CFFI is broken: `(:enum ,cffi-name) - cffi-name))) - ((equal tag "enum") - ;; "enum" is an inline "typedef enum {m1, m2} var" kind of inline declaration - (expected-json-keys json-entry :name :tag :id) - ;; TODO FIXME similarly to struct, but it would be nice to see an example - (error "not yet implemented")) - ((equal tag ":array") - (expected-json-keys json-entry :tag :type :size) - (with-json-values (json-entry type size) - (check-type size integer) - `(:array ,(json-type-to-cffi-type type) ,size))) - ((equal tag ":pointer") - (expected-json-keys json-entry :tag :type :id) - (with-json-values (json-entry type) - `(:pointer ,(with-allowed-foreign-type-errors - (:void :enabled *allow-pointer-type-simplification*) - (json-type-to-cffi-type type))))) - ((equal tag ":function-pointer") - (expected-json-keys json-entry :tag) - (function-pointer-type-name)) - ((equal tag ":function") - (unsupported-type json-entry)) - (t - (assert (not (starts-with #\: tag))) - (let ((cffi-name (json-name-to-cffi-name tag :type))) - ;; TODO FIXME json-name-to-cffi-name collects the mentioned - ;; types to later emit +TYPE-NAMES+, but if this next - ;; find-cffi-type-or-die dies then the entire function is - ;; skipped. - (find-cffi-type-or-die cffi-name) - cffi-name))))) - (assert cffi-type () "Failed to map ~S to a cffi type" json-entry) - cffi-type))) - -(defun should-export-p (symbol) - (and symbol - (symbolp symbol) - (not (keywordp symbol)) - *ffi-name-export-predicate* - (call-hook *ffi-name-export-predicate* symbol))) - -(defun json-type-to-cffi-type (json-entry &optional (context nil context?)) - (let ((cffi-type (%json-type-to-cffi-type json-entry))) - (if context? - (call-hook *ffi-type-transformer* cffi-type context) - cffi-type))) - -;;;;;; -;;; Entry point, the "API" - -(defun process-c2ffi-spec-file (c2ffi-spec-file package-name - &key - (allow-pointer-type-simplification *allow-pointer-type-simplification*) - (allow-skipping-struct-fields *allow-skipping-struct-fields*) - (assume-struct-by-value-support *assume-struct-by-value-support*) - ;; either a pathname or a string (will be copied as is), - ;; or a function that will be funcall'd with one argument - ;; to emit a form (i.e. OUTPUT/CODE). - prelude - (output (make-pathname :name (strcat (pathname-name c2ffi-spec-file) ".cffi-tmp") - :type "lisp" :defaults c2ffi-spec-file)) - (output-encoding asdf:*default-encoding*) - ;; The args following this point are mirrored in the ASDF - ;; component on the same name. - (ffi-name-transformer *ffi-name-transformer*) - (ffi-name-export-predicate *ffi-name-export-predicate*) - ;; as per CFFI:DEFINE-FOREIGN-LIBRARY and CFFI:LOAD-FOREIGN-LIBRARY - (ffi-type-transformer *ffi-type-transformer*) - (callback-factory *callback-factory*) - foreign-library-name - foreign-library-spec - (emit-generated-name-mappings t) - (include-sources :all) - exclude-sources - (include-definitions :all) - exclude-definitions) - "Generates a lisp file with CFFI definitions from C2FFI-SPEC-FILE. -PACKAGE-NAME will be overwritten, it assumes full control over the -target package." - (check-type c2ffi-spec-file (or pathname string)) - (macrolet ((@ (var) - `(setf ,var (compile-rules ,var)))) - (@ include-sources) - (@ exclude-sources) - (@ include-definitions) - (@ exclude-definitions)) - (with-standard-io-syntax - (with-input-from-file (in c2ffi-spec-file :external-format (asdf/driver:encoding-external-format :utf-8)) - (with-output-to-file (*c2ffi-output-stream* output :if-exists :supersede - :external-format (asdf/driver:encoding-external-format output-encoding)) - (let* ((*package* (or (find-package package-name) - (make-package package-name))) - ;; Make sure we use an uninterned symbol, so that it's neutral to READTABLE-CASE. - (package-name (make-symbol (package-name *package*))) - ;; Let's rebind a copy, so that when we are done with - ;; the generation (which also EVAL's the forms) then - ;; the CFFI type repository is also reverted back to - ;; the previous state. This avoids redefinition warning - ;; when the generated file gets compiled and loaded - ;; later. - (cffi::*type-parsers* (copy-hash-table cffi::*type-parsers*)) - (*anon-name-counter* 0) - (*anon-entities* (make-hash-table)) - (*generated-names* (mapcar (lambda (key) - `(,key . ,(make-hash-table :test 'equal))) - +name-kinds+)) - (*allow-pointer-type-simplification* allow-pointer-type-simplification) - (*allow-skipping-struct-fields* allow-skipping-struct-fields) - (*assume-struct-by-value-support* assume-struct-by-value-support) - (*ffi-name-transformer* (canonicalize-transformer-hook ffi-name-transformer)) - (*ffi-name-export-predicate* (canonicalize-transformer-hook ffi-name-export-predicate)) - (*ffi-type-transformer* (canonicalize-transformer-hook ffi-type-transformer)) - (*callback-factory* (canonicalize-transformer-hook callback-factory)) - (*read-default-float-format* 'double-float) - (json (json:decode-json in))) - (output/string +generated-file-header+) - ;; some forms that are always emitted - (mapc 'output/code - ;; Make sure the package exists. We don't even want to :use COMMON-LISP here, - ;; to avoid any possible name clashes. - `((uiop:define-package ,package-name (:use)) - (in-package ,package-name) - (cffi:defctype ,(function-pointer-type-name) :pointer))) - (when (and foreign-library-name - foreign-library-spec) - (when (stringp foreign-library-name) - (setf foreign-library-name (safe-read-from-string foreign-library-name))) - (output/code `(cffi:define-foreign-library ,foreign-library-name - ,@foreign-library-spec)) - ;; TODO: Unconditionally emitting a USE-FOREIGN-LIBRARY may not be smart. - ;; For details see: https://bugs.launchpad.net/cffi/+bug/1593635 - (output/code `(cffi:use-foreign-library ,foreign-library-name))) - (etypecase prelude - (null) - (string - (output/string prelude)) - (pathname - (with-input-from-file (prelude-stream prelude) - (alexandria:copy-stream prelude-stream *c2ffi-output-stream* - :element-type 'character))) - ((or symbol function) - (funcall prelude 'output/code))) - ;; - ;; Let's enumerate the entries - (multiple-value-bind (form-callback epilogue-callback) - (funcall *callback-factory*) - (dolist (json-entry json) - (with-json-values (json-entry name location) - (let ((source-location-file (subseq location - 0 - (or (position #\: location) - 0)))) - (if (include-definition? - name source-location-file - include-definitions exclude-definitions - include-sources exclude-sources) - (progn - (output/string "~&~%;; ~S" location) - (let ((emitted-definition (process-c2ffi-entry json-entry))) - ;; - ;; Call the plugin to let the user emit a form after the given - ;; definition - (when (and emitted-definition - form-callback) - (map nil 'output/code (call-hook form-callback emitted-definition))))) - (output/string "~&;; Skipped ~S due to filters" name))))) - ;; - ;; Call the plugin to let the user append multiple forms after the - ;; emitted definitions - (when epilogue-callback - (map nil 'output/code (call-hook epilogue-callback)))) - ;; - ;; emit optional exports - (maphash - (lambda (package-name symbols) - (output/export (sort (remove-if-not #'should-export-p symbols) #'string<) - package-name)) - (get-all-names-by-package *generated-names*)) - - ;; - ;; emit optional mappings - (when emit-generated-name-mappings - (mapcar (lambda (entry) - (destructuring-bind (kind variable-name) entry - (output/code `(defparameter - ,(intern (symbol-name variable-name)) - ',(hash-table-alist (cdr (assoc kind *generated-names*))))))) - `((:function #:+function-names+) - (:struct #:+struct-names+) - (:union #:+union-names+) - (:variable #:+variable-names+) - (:type #:+type-names+) - (:constant #:+constant-names+) - (:argument #:+argument-names+) - (:field #:+field-names+)))))))) - output) - -(defun get-all-names-by-package (name-collection) - (let ((tables (mapcar #'cdr name-collection)) - all - (grouped (make-hash-table))) - (loop :for table :in tables :do - (loop :for s :being :the :hash-values :of table :do - (push s all))) - (remove-duplicates all :test #'eq) - (loop :for name :in all - :for package-name := (package-name (symbol-package name)) - :do (setf (gethash package-name grouped) - (cons name (gethash package-name grouped)))) - grouped)) - -;;;;;; -;;; Processors for various definitions - -(defvar *c2ffi-entry-processors* (make-hash-table :test 'equal)) - -(defun process-c2ffi-entry (json-entry) - (let* ((kind (json-value json-entry :tag)) - (processor (gethash kind *c2ffi-entry-processors*))) - (if processor - (let ((definition-form - (handler-bind - ((unsupported-type - (lambda (e) - (warn "Skip definition because cannot map ~S to any CFFI type. The definition is ~S" - (json-definition-of e) json-entry) - (return-from process-c2ffi-entry (values)))) - (cffi::undefined-foreign-type-error - (lambda (e) - (output/string "~&;; Skipping definition ~S because of missing type ~S" - json-entry (cffi::foreign-type-error/compound-name e)) - (return-from process-c2ffi-entry (values))))) - (funcall processor json-entry)))) - (when definition-form - (output/code definition-form) - definition-form)) - (progn - (warn "No cffi/c2ffi processor defined for ~A" json-entry) - (values))))) - -(defmacro define-processor (kind args &body body) - `(setf (gethash ,(string-downcase kind) *c2ffi-entry-processors*) - (named-lambda ,(symbolicate 'c2ffi-processor/ kind) (-json-entry-) - (with-json-values (-json-entry- ,@args) - ,@body)))) - -(defun %process-struct-like (json-entry kind definer anon-base-name) - (expected-json-keys json-entry :tag :ns :name :id :bit-size :bit-alignment :fields) - (with-json-values (json-entry tag (struct-name :name) fields bit-size id) - (assert (member tag '(":struct" "struct" ":union" "union") :test 'equal)) - (flet ((process-field (json-entry) - (with-json-values (json-entry (field-name :name) bit-offset type) - (let ((cffi-type (with-allowed-foreign-type-errors - ('failed :enabled *allow-skipping-struct-fields*) - (json-type-to-cffi-type type `(,kind ,struct-name ,field-name))))) - (if (eq cffi-type 'failed) - (output/string "~&;; skipping field due to missing type ~S, full json entry: ~S" type json-entry) - `(,(json-name-to-cffi-name field-name :field) - ,cffi-type - ,@(unless (eq kind :union) - `(:offset ,(coerce-to-byte-size bit-offset))))))))) - `(,definer (,(json-name-to-cffi-name (or struct-name - (register-anon-entity - id - (generate-anon-name anon-base-name))) - kind - (null struct-name)) - :size ,(coerce-to-byte-size bit-size)) - ,@(remove nil (mapcar #'process-field fields)))))) - -(define-processor struct () - (%process-struct-like -json-entry- :struct 'cffi:defcstruct '#:anon-struct-)) - -(define-processor union () - (%process-struct-like -json-entry- :union 'cffi:defcunion '#:anon-union-)) - -(define-processor typedef (name type) - (expected-json-keys -json-entry- :tag :name :ns :type) - `(cffi:defctype ,(json-name-to-cffi-name name :type) - ,(json-type-to-cffi-type type `(:typedef ,name)))) - -(define-processor function (return-type (function-name :name) parameters inline variadic storage-class) - (declare (ignore storage-class)) - ;; TODO does storage-class matter for FFI accessibility? - #+nil - (assume (equal "extern" storage-class) - "Unexpected function STORAGE-CLASS: ~S for function ~S" storage-class function-name) - (expected-json-keys -json-entry- :tag :name :return-type :parameters :variadic :inline :storage-class :ns) - (let ((uses-struct-by-value? nil)) - (flet ((process-arg (json-entry index) - (expected-json-keys json-entry :tag :name :type) - (with-json-values (json-entry tag (argument-name :name) type) - (assert (equal tag "parameter")) - (let* ((cffi-type (json-type-to-cffi-type type `(:function ,function-name ,argument-name))) - (canonicalized-type (cffi::canonicalize-foreign-type cffi-type))) - (when (and (consp canonicalized-type) - (member (first canonicalized-type) '(:struct :union))) - (setf uses-struct-by-value? t)) - `(,(if argument-name - (json-name-to-cffi-name argument-name :argument) - (symbolicate '#:arg (princ-to-string index))) - ,cffi-type))))) - (let ((cffi-args (loop - :for arg :in parameters - :for index :upfrom 1 - :collect (process-arg arg index)))) - (cond - ((and uses-struct-by-value? - (not *assume-struct-by-value-support*)) - (values)) - (inline - ;; TODO inline functions should go into a separate grovel file? - (output/string "~&;; Skipping inline function ~S" function-name) - (values)) - (t `(cffi:defcfun (,function-name ,(json-name-to-cffi-name function-name :function)) - ,(json-type-to-cffi-type return-type `(:function ,function-name :return-type)) - ,@(append cffi-args - (when variadic - '(&rest)))))))))) - -(define-processor extern (name type) - (expected-json-keys -json-entry- :tag :name :type) - `(cffi:defcvar (,name ,(json-name-to-cffi-name name :variable)) - ,(json-type-to-cffi-type type `(:variable ,name)))) - -;; ((TAG . enum) (NS . 0) (NAME . ) (ID . 3) (LOCATION . /usr/include/bits/confname.h:24:1) (FIELDS ((TAG . field) (NAME . _PC_LINK_MAX) (VALUE . 0)) ((TAG . field) (NAME . _PC_MAX_CANON) (VALUE . 1)) ((TAG . field) (NAME . _PC_MAX_INPUT) (VALUE . 2)) ((TAG . field) (NAME . _PC_NAME_MAX) (VALUE . 3)) ((TAG . field) (NAME . _PC_PATH_MAX) (VALUE . 4)) ((TAG . field) (NAME . _PC_PIPE_BUF) (VALUE . 5)) ((TAG . field) (NAME . _PC_CHOWN_RESTRICTED) (VALUE . 6)) ((TAG . field) (NAME . _PC_NO_TRUNC) (VALUE . 7)) ((TAG . field) (NAME . _PC_VDISABLE) (VALUE . 8)) ((TAG . field) (NAME . _PC_SYNC_IO) (VALUE . 9)) ((TAG . field) (NAME . _PC_ASYNC_IO) (VALUE . 10)) ((TAG . field) (NAME . _PC_PRIO_IO) (VALUE . 11)) ((TAG . field) (NAME . _PC_SOCK_MAXBUF) (VALUE . 12)) ((TAG . field) (NAME . _PC_FILESIZEBITS) (VALUE . 13)) ((TAG . field) (NAME . _PC_REC_INCR_XFER_SIZE) (VALUE . 14)) ((TAG . field) (NAME . _PC_REC_MAX_XFER_SIZE) (VALUE . 15)) ((TAG . field) (NAME . _PC_REC_MIN_XFER_SIZE) (VALUE . 16)) ((TAG . field) (NAME . _PC_REC_XFER_ALIGN) (VALUE . 17)) ((TAG . field) (NAME . _PC_ALLOC_SIZE_MIN) (VALUE . 18)) ((TAG . field) (NAME . _PC_SYMLINK_MAX) (VALUE . 19)) ((TAG . field) (NAME . _PC_2_SYMLINKS) (VALUE . 20)))) -(define-processor enum (name fields id) - (let ((bitmasks 0) - (non-bitmasks 0)) - (labels - ((for-bitmask-statistics (name value) - (declare (ignore name)) - (if (cffi::single-bit-p value) - (incf bitmasks) - (incf non-bitmasks))) - (for-enum-body (name value) - `(,(json-name-to-cffi-name name :member) - ,value)) - (process-fields (visitor) - (loop - :for json-entry :in fields - :do (expected-json-keys json-entry :tag :name :value) - :collect - (with-json-values (json-entry tag name value) - (assert (equal tag "field")) - (check-type value integer) - (funcall visitor name value))))) - (process-fields #'for-bitmask-statistics) - `(,(if (> (/ bitmasks - (+ non-bitmasks bitmasks)) - 0.8) - 'cffi:defbitfield - 'cffi:defcenum) - ,(json-name-to-cffi-name (or name - (register-anon-entity - id - (generate-anon-name '#:anon-enum-))) - :enum - (null name)) - ,@(process-fields #'for-enum-body))))) - -(defun make-define-constant-form (name value) - (valid-name-or-die name) - (let ((test-fn (typecase value - (number) - (t 'equal)))) - `(alexandria:define-constant ,(json-name-to-cffi-name name :constant) - ,value ,@(when test-fn `(:test ',test-fn))))) - -(define-processor const (name type (value :value :otherwise nil)) - (expected-json-keys -json-entry- :tag :name :type :value :ns) - (let ((cffi-type (json-type-to-cffi-type type `(:contant ,name)))) - (cond - ((not value) - ;; #define __FOO_H and friends... just ignore them. - (values)) - ((and (member cffi-type '(:int :unsigned-int - :long :unsigned-long - :long-long :unsigned-long-long)) - (integerp value)) - (make-define-constant-form name value)) - ((and (member cffi-type '(:float :double)) - (floatp value)) - (make-define-constant-form name value)) - ((member cffi-type '(:string (:pointer :char)) :test 'equal) - (make-define-constant-form name value)) - (t - (warn "Don't know how to emit a constant of CFFI type ~S, with value ~S (json type is ~S)." cffi-type value type) - (values))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/package.lisp deleted file mode 100644 index 8881465..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/package.lisp +++ /dev/null @@ -1,54 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; Copyright (C) 2015, Attila Lendvai -;;; -;;; 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. -;;; - -(uiop:define-package #:cffi/c2ffi - (:mix #:uiop - #:alexandria - #:common-lisp) - (:import-from :asdf - #:cl-source-file - #:find-system - #:output-file - #:output-files - #:input-files - #:perform - #:compile-op - #:load-op - #:load-source-op - #:prepare-op - #:component-pathname - #:component-depends-on - #:downward-operation - #:load-system - #:component-loaded-p) - (:export - #:c2ffi-file - #:camelcased? - #:camelcase-to-dash-separated - #:change-case-to-readtable-case - #:default-ffi-name-transformer - #:default-ffi-type-transformer - #:generate-spec - #:maybe-camelcase-to-dash-separated)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-abcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-abcl.lisp deleted file mode 100644 index b999915..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-abcl.lisp +++ /dev/null @@ -1,664 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-abcl.lisp --- CFFI-SYS implementation for ABCL/JNA. -;;; -;;; Copyright (C) 2009, Luis Oliveira -;;; Copyright (C) 2012, Mark Evenson -;;; -;;; 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. -;;; - -;;; This implementation requires the Java Native Access (JNA) library. -;;; -;;; -;;; JNA may be automatically loaded into the current JVM process from -;;; abcl-1.1.0-dev via the contrib mechanism. - -(eval-when (:compile-toplevel :load-toplevel :execute) - (require :abcl-contrib) - (require :jna) - (require :jss)) - -;;; This is a preliminary version that will have to be cleaned up, -;;; optimized, etc. Nevertheless, it passes all of the relevant CFFI -;;; tests except MAKE-POINTER.HIGH. Shareable Vectors are not -;;; implemented yet. - -;;;# Administrivia - -(defpackage #:cffi-sys - (:use #:cl #:java) - (:import-from #:alexandria #:hash-table-values #:length= #:format-symbol) - (:export - #:canonicalize-symbol-name-case - #:foreign-pointer - #:pointerp - #:pointer-eq - #:null-pointer - #:null-pointer-p - #:inc-pointer - #:make-pointer - #:pointer-address - #:%foreign-alloc - #:foreign-free - #:with-foreign-pointer - #:%foreign-funcall - #:%foreign-funcall-pointer - #:%foreign-type-alignment - #:%foreign-type-size - #:%load-foreign-library - #:%close-foreign-library - #:native-namestring - #:%mem-ref - #:%mem-set - ;; #:make-shareable-byte-vector - ;; #:with-pointer-to-vector-data - #:%foreign-symbol-pointer - #:%defcallback - #:%callback - #:with-pointer-to-vector-data - #:make-shareable-byte-vector)) - -(in-package #:cffi-sys) - -;;;# Loading and Closing Foreign Libraries - -(defparameter *loaded-libraries* (make-hash-table)) - -(defun %load-foreign-library (name path) - "Load a foreign library, signals a simple error on failure." - (flet ((load-and-register (name path) - (let ((lib (jstatic "getInstance" "com.sun.jna.NativeLibrary" path))) - (setf (gethash name *loaded-libraries*) lib) - lib)) - (foreign-library-type-p (type) - (find type '("so" "dll" "dylib") :test #'string=)) - (java-error (e) - (error (jcall (jmethod "java.lang.Exception" "getMessage") - (java-exception-cause e))))) - (handler-case - (load-and-register name path) - (java-exception (e) - ;; From JNA http://jna.java.net/javadoc/com/sun/jna/NativeLibrary.html - ;; ``[The name] can be short form (e.g. "c"), an explicit - ;; version (e.g. "libc.so.6"), or the full path to the library - ;; (e.g. "/lib/libc.so.6")'' - ;; - ;; Try to deal with the occurance "libXXX" and "libXXX.so" as - ;; "libXXX.so.6" and "XXX" should have succesfully loaded. - (let ((p (pathname path))) - (if (and (not (pathname-directory p)) - (= (search "lib" (pathname-name p)) 0)) - (let ((short-name (if (foreign-library-type-p (pathname-type p)) - (subseq (pathname-name p) 3) - (pathname-name p)))) - (handler-case - (load-and-register name short-name) - (java-exception (e) (java-error e)))) - (java-error e))))))) - -;;; FIXME. Should remove libraries from the hash table. -(defun %close-foreign-library (handle) - "Closes a foreign library." - #+#:ignore (setf *loaded-libraries* (remove handle *loaded-libraries*)) - (jcall-raw (jmethod "com.sun.jna.NativeLibrary" "dispose") handle)) - -;;; - -;;; FIXME! We should probably define a private-jfield-accessor that does the hard work once! -(let ((get-declared-fields-jmethod (jmethod "java.lang.Class" "getDeclaredFields"))) - (defun private-jfield (class-name field-name instance) - (let ((field (find field-name - (jcall get-declared-fields-jmethod - (jclass class-name)) - :key #'jfield-name - :test #'string=))) - (jcall (jmethod "java.lang.reflect.Field" "setAccessible" "boolean") - field +true+) - (jcall (jmethod "java.lang.reflect.Field" "get" "java.lang.Object") - field instance)))) - -;;; XXX: doesn't match jmethod-arguments. - -(let ((get-declared-methods-jmethod (jmethod "java.lang.Class" "getDeclaredMethods"))) - (defun private-jmethod (class-name method-name) - (let ((method (find method-name - (jcall get-declared-methods-jmethod - (jclass class-name)) - :key #'jmethod-name - :test #'string=))) - (jcall (jmethod "java.lang.reflect.Method" "setAccessible" "boolean") - method +true+) - method))) - -(let ((get-declared-constructors-jmethod (jmethod "java.lang.Class" - "getDeclaredConstructors")) - (set-accessible-jmethod (jmethod "java.lang.reflect.Constructor" "setAccessible" "boolean"))) - (defun private-jconstructor (class-name &rest params) - (let* ((param-classes (mapcar #'jclass params)) - (cons (find-if (lambda (x &aux (cons-params (jconstructor-params x))) - (and (length= param-classes cons-params) - (loop for param in param-classes - and param-x across cons-params - always (string= (jclass-name param) - (jclass-name param-x))))) - (jcall get-declared-constructors-jmethod (jclass class-name))))) - (jcall set-accessible-jmethod cons +true+) - cons))) - -;;;# Symbol Case - -(defun canonicalize-symbol-name-case (name) - (string-upcase name)) - -;;;# Pointers - -(deftype foreign-pointer () - '(satisfies pointerp)) - -(defun pointerp (ptr) - "Return true if PTR is a foreign pointer." - (let ((jclass (jclass-of ptr))) - (when jclass - (jclass-superclass-p (jclass "com.sun.jna.Pointer") jclass)))) - -(let ((jconstructor (private-jconstructor "com.sun.jna.Pointer" "long"))) - (defun make-pointer (address) - "Return a pointer pointing to ADDRESS." - (jnew jconstructor address))) - -(defun make-private-jfield-accessor (class-name field-name) - (let ((field (find field-name - (jcall (jmethod "java.lang.Class" "getDeclaredFields") - (jclass class-name)) - :key #'jfield-name - :test #'string=))) - (jcall (jmethod "java.lang.reflect.Field" "setAccessible" "boolean") - field +true+) - (let ((get-jmethod (jmethod "java.lang.reflect.Field" "get" "java.lang.Object"))) - (lambda (instance) - (jcall get-jmethod field instance))))) - -(let ((accessor (make-private-jfield-accessor "com.sun.jna.Pointer" "peer"))) - (defun %pointer-address (pointer) - (funcall accessor pointer))) - -(defun pointer-address (pointer) - "Return the address pointed to by PTR." - (let ((peer (%pointer-address pointer))) - (if (< peer 0) - (+ #.(ash 1 64) peer) - peer))) - -(defun pointer-eq (ptr1 ptr2) - "Return true if PTR1 and PTR2 point to the same address." - (= (%pointer-address ptr1) (%pointer-address ptr2))) - -(defun null-pointer () - "Construct and return a null pointer." - (make-pointer 0)) - -(defun null-pointer-p (ptr) - "Return true if PTR is a null pointer." - (zerop (%pointer-address ptr))) - -(defun inc-pointer (ptr offset) - "Return a fresh pointer pointing OFFSET bytes past PTR." - (make-pointer (+ (%pointer-address ptr) offset))) - -;;;# Allocation - -(let ((malloc-jmethod (private-jmethod "com.sun.jna.Memory" "malloc"))) - (defun %foreign-alloc (size) - "Allocate SIZE bytes on the heap and return a pointer." - (make-pointer - (jstatic-raw malloc-jmethod nil size)))) - -(let ((free-jmethod (private-jmethod "com.sun.jna.Memory" "free"))) - (defun foreign-free (ptr) - "Free a PTR allocated by FOREIGN-ALLOC." - (jstatic-raw free-jmethod nil (%pointer-address ptr)) - nil)) - -;;; TODO: stack allocation. -(defmacro with-foreign-pointer ((var size &optional size-var) &body body) - "Bind VAR to SIZE bytes of foreign memory during BODY. The pointer -in VAR is invalid beyond the dynamic extent of BODY, and may be -stack-allocated if supported by the implementation. If SIZE-VAR is -supplied, it will be bound to SIZE during BODY." - (unless size-var - (setf size-var (gensym "SIZE"))) - `(let* ((,size-var ,size) - (,var (%foreign-alloc ,size-var))) - (unwind-protect - (progn ,@body) - (foreign-free ,var)))) - -;;;# Shareable Vectors -;;; -;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA -;;; should be defined to perform a copy-in/copy-out if the Lisp -;;; implementation can't do this. - -(defun jna-setter (type) - (ecase type - ((:char :unsigned-char) "setByte") - (:double "setDouble") - (:float "setFloat") - ((:int :unsigned-int) "setInt") - ((:long :unsigned-long) "setNativeLong") - ((:long-long :unsigned-long-long) "setLong") - (:pointer "setPointer") - ((:short :unsigned-short) "setShort"))) - -(defun jna-setter-arg-type (type) - (ecase type - ((:char :unsigned-char) "byte") - (:double "double") - (:float "float") - ((:int :unsigned-int) "int") - ((:long :unsigned-long) "com.sun.jna.NativeLong") - ((:long-long :unsigned-long-long) "long") - (:pointer "com.sun.jna.Pointer") - ((:short :unsigned-short) "short"))) - -(defun jna-getter (type) - (ecase type - ((:char :unsigned-char) "getByte") - (:double "getDouble") - (:float "getFloat") - ((:int :unsigned-int) "getInt") - ((:long :unsigned-long) "getNativeLong") - ((:long-long :unsigned-long-long) "getLong") - (:pointer "getPointer") - ((:short :unsigned-short) "getShort"))) - -(defun make-shareable-byte-vector (size) - "Create a Lisp vector of SIZE bytes can passed to -WITH-POINTER-TO-VECTOR-DATA." - (make-array size :element-type '(unsigned-byte 8))) - -(let ((method (jmethod "com.sun.jna.Pointer" - (jna-setter :char) "long" (jna-setter-arg-type :char)))) - (defun copy-to-foreign-vector (vector foreign-pointer) - (loop for i below (length vector) - do - (jcall-raw method - foreign-pointer i - (aref vector i))))) - -;; hand-roll the jna-getter method instead of calling %mem-ref every time through -(let ((method (jmethod "com.sun.jna.Pointer" (jna-getter :char) "long"))) - (defun copy-from-foreign-vector (vector foreign-pointer) - (loop for i below (length vector) - do (setf (aref vector i) - (java:jobject-lisp-value (jcall-raw method foreign-pointer i)))))) - -(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) - "Bind PTR-VAR to a foreign pointer to the data in VECTOR." - (let ((vector-sym (gensym "VECTOR"))) - `(let ((,vector-sym ,vector)) - (with-foreign-pointer (,ptr-var (length ,vector-sym)) - (copy-to-foreign-vector ,vector-sym ,ptr-var) - (unwind-protect - (progn ,@body) - (copy-from-foreign-vector ,vector-sym ,ptr-var)))))) - -;;;# Dereferencing - -(defun foreign-type-to-java-class (type) - (jclass - (ecase type - ((:int :unsigned-int) "java.lang.Integer") - ((:long :unsigned-long) "com.sun.jna.NativeLong") - ((:long-long :unsigned-long-long) "java.lang.Long") - (:pointer "com.sun.jna.Pointer") ;; void * is pointer? - (:float "java.lang.Float") - (:double "java.lang.Double") - ((:char :unsigned-char) "java.lang.Byte") - ((:short :unsigned-short) "java.lang.Short")))) - -(defun %foreign-type-size (type) - "Return the size in bytes of a foreign type." - (jstatic "getNativeSize" "com.sun.jna.Native" - (foreign-type-to-java-class type))) - -;;; FIXME. -(defun %foreign-type-alignment (type) - "Return the alignment in bytes of a foreign type." - (%foreign-type-size type)) - -(defun unsigned-type-p (type) - (case type - ((:unsigned-char - :unsigned-int - :unsigned-short - :unsigned-long - :unsigned-long-long) t) - (t nil))) - -(defun lispify-value (value type) - (when (and (eq type :pointer) (or (null (java:jobject-lisp-value value)) - (eq +null+ (java:jobject-lisp-value value)))) - (return-from lispify-value (null-pointer))) - (when (or (eq type :long) (eq type :unsigned-long)) - (setq value (jcall-raw (jmethod "com.sun.jna.NativeLong" "longValue") - (java:jobject-lisp-value value)))) - (let ((bit-size (* 8 (%foreign-type-size type)))) - (let ((lisp-value (java:jobject-lisp-value value))) - (if (and (unsigned-type-p type) - (logbitp (1- bit-size) lisp-value)) - (lognot (logxor lisp-value (1- (expt 2 bit-size)))) - lisp-value)))) - -(defun %mem-ref (ptr type &optional (offset 0)) - (lispify-value - (jcall-raw (jmethod "com.sun.jna.Pointer" (jna-getter type) "long") - ptr offset) - type)) - -(defun %mem-set (value ptr type &optional (offset 0)) - (let* ((bit-size (* 8 (%foreign-type-size type))) - (val (if (and (unsigned-type-p type) (logbitp (1- bit-size) value)) - (lognot (logxor value (1- (expt 2 bit-size)))) - value))) - (jcall-raw (jmethod "com.sun.jna.Pointer" - (jna-setter type) "long" (jna-setter-arg-type type)) - ptr - offset - (if (or (eq type :long) (eq type :unsigned-long)) - (jnew (jconstructor "com.sun.jna.NativeLong" "long") val) - val))) - value) - -;;;# Foreign Globals -(let ((get-symbol-address-jmethod (private-jmethod "com.sun.jna.NativeLibrary" "getSymbolAddress"))) - (defun %foreign-symbol-pointer (name library) - "Returns a pointer to a foreign symbol NAME." - (flet ((find-it (library) - (ignore-errors - (make-pointer - (jcall-raw get-symbol-address-jmethod library name))))) - (if (eq library :default) - (or (find-it - (jstatic "getProcess" "com.sun.jna.NativeLibrary")) - ;; The above should find it, but I'm not exactly sure, so - ;; let's still do it manually just in case. - (loop for lib being the hash-values of *loaded-libraries* - thereis (find-it lib))) - (find-it library))))) - -;;;# Calling Foreign Functions - -(defun find-foreign-function (name library) - (flet ((find-it (library) - (ignore-errors - (jcall-raw (jmethod "com.sun.jna.NativeLibrary" "getFunction" - "java.lang.String") - library name)))) - (if (eq library :default) - (or (find-it - (jstatic "getProcess" "com.sun.jna.NativeLibrary")) - ;; The above should find it, but I'm not exactly sure, so - ;; let's still do it manually just in case. - (loop for lib being the hash-values of *loaded-libraries* - thereis (find-it lib))) - (find-it (gethash library *loaded-libraries*))))) - -(defun convert-calling-convention (convention) - (ecase convention - (:stdcall "ALT_CONVENTION") - (:cdecl "C_CONVENTION"))) - -(defparameter *jna-string-encoding* "UTF-8" - "Encoding for conversion between Java and native strings that occurs within JNA. - -Used with jna-4.0.0 or later.") - -;;; c.f. -(defvar *jna-4.0.0-or-later-p* - (ignore-errors (private-jconstructor "com.sun.jna.Function" - "com.sun.jna.Pointer" "int" "java.lang.String"))) - -(let ((jconstructor - (if *jna-4.0.0-or-later-p* - (private-jconstructor "com.sun.jna.Function" - "com.sun.jna.Pointer" "int" "java.lang.String") - (private-jconstructor "com.sun.jna.Function" - "com.sun.jna.Pointer" "int")))) - (defun make-function-pointer (pointer convention) - (apply - #'jnew jconstructor pointer - (jfield "com.sun.jna.Function" (convert-calling-convention convention)) - (when *jna-4.0.0-or-later-p* - (list *jna-string-encoding*))))) - -(defun lisp-value-to-java (value foreign-type) - (case foreign-type - (:pointer value) - (:void nil) - (t (jnew (ecase foreign-type - ((:int :unsigned-int) (jconstructor "java.lang.Integer" "int")) - ((:long-long :unsigned-long-long) - (jconstructor "java.lang.Long" "long")) - ((:long :unsigned-long) - (jconstructor "com.sun.jna.NativeLong" "long")) - ((:short :unsigned-short) (jconstructor "java.lang.Short" "short")) - ((:char :unsigned-char) (jconstructor "java.lang.Byte" "byte")) - (:float (jconstructor "java.lang.Float" "float")) - (:double (jconstructor "java.lang.Double" "double"))) - value)))) - -(defun %%foreign-funcall (function args arg-types return-type) - (let ((jargs (jnew-array "java.lang.Object" (length args)))) - (loop for arg in args and type in arg-types and i from 0 - do (setf (jarray-ref jargs i) - (lisp-value-to-java arg type))) - (if (eq return-type :void) - (progn - (jcall-raw (jmethod "com.sun.jna.Function" "invoke" "[Ljava.lang.Object;") - function jargs) - (values)) - (lispify-value - (jcall-raw (jmethod "com.sun.jna.Function" "invoke" - "java.lang.Class" "[Ljava.lang.Object;") - function - (foreign-type-to-java-class return-type) - jargs) - return-type)))) - -(defun foreign-funcall-type-and-args (args) - (let ((return-type :void)) - (loop for (type arg) on args by #'cddr - if arg collect type into types - and collect arg into fargs - else do (setf return-type type) - finally (return (values types fargs return-type))))) - -(defmacro %foreign-funcall (name args &key library convention) - (declare (ignore convention)) - (multiple-value-bind (types fargs rettype) - (foreign-funcall-type-and-args args) - `(%%foreign-funcall (find-foreign-function ',name ',library) - (list ,@fargs) ',types ',rettype))) - -(defmacro %foreign-funcall-pointer (ptr args &key convention) - (multiple-value-bind (types fargs rettype) - (foreign-funcall-type-and-args args) - `(%%foreign-funcall (make-function-pointer ,ptr ',convention) - (list ,@fargs) ',types ',rettype))) - -;;;# Callbacks - -(defun foreign-to-callback-type (type) - (ecase type - ((:int :unsigned-int) - :int) - ((:long :unsigned-long) - (jvm::make-jvm-class-name "com.sun.jna.NativeLong")) - ((:long-long :unsigned-long-long) - (jvm::make-jvm-class-name "java.lang.Long")) - (:pointer - (jvm::make-jvm-class-name "com.sun.jna.Pointer")) - (:float - :float) - (:double - :double) - ((:char :unsigned-char) - :byte) - ((:short :unsigned-short) - :short) - (:wchar_t - :int) - (:void - :void))) - -(defvar *callbacks* (make-hash-table)) - -(defmacro convert-args-to-lisp-values (arg-names arg-types &body body) - (let ((gensym-args (loop for name in arg-names - collect (format-symbol t '#:callback-arg-~a- name)))) - `(lambda (,@gensym-args) - (let ,(loop for arg in arg-names - for type in arg-types - for gensym-arg in gensym-args - collecting `(,arg (if (typep ,gensym-arg 'java:java-object) - (lispify-value ,gensym-arg ,type) - ,gensym-arg))) - ,@body)))) - -(defmacro %defcallback (name return-type arg-names arg-types body - &key convention) - (declare (ignore convention)) ;; I'm always up for ignoring convention, but this is probably wrong. - `(setf (gethash ',name *callbacks*) - (jinterface-implementation - (ensure-callback-interface ',return-type ',arg-types) - "callback" - (convert-args-to-lisp-values ,arg-names ,arg-types (lisp-value-to-java ,body ',return-type))))) -;; (lambda (,@arg-names) ,body)))) - -(jvm::define-class-name +callback-object+ "com.sun.jna.Callback") -(defconstant - +dynamic-callback-package+ - "org/armedbear/jna/dynamic/callbacks" - "The slash-delimited Java package in which we create classes dynamically to specify callback interfaces.") - -(defun ensure-callback-interface (returns args) - "Ensure that the jvm interface for the callback exists in the current JVM. - -Returns the fully dot qualified name of the interface." - (let* ((jvm-returns (foreign-to-callback-type returns)) - (jvm-args (mapcar #'foreign-to-callback-type args)) - (interface-name (qualified-callback-interface-classname jvm-returns jvm-args))) - (handler-case - (jss:find-java-class interface-name) - (java-exception (e) - (when (jinstance-of-p (java:java-exception-cause e) - "java.lang.ClassNotFoundException") - (let ((interface-class-bytes (%define-jna-callback-interface jvm-returns jvm-args)) - (simple-interface-name (callback-interface-classname jvm-returns jvm-args))) - (load-class interface-name interface-class-bytes))))) - interface-name)) - -(defun qualified-callback-interface-classname (returns args) - (format nil "~A.~A" - (substitute #\. #\/ +dynamic-callback-package+) - (callback-interface-classname returns args))) - -(defun callback-interface-classname (returns args) - (flet ((stringify (thing) - (typecase thing - (jvm::jvm-class-name - (substitute #\_ #\/ - (jvm::class-name-internal thing))) - (t (string thing))))) - (format nil "~A__~{~A~^__~}" - (stringify returns) - (mapcar #'stringify args)))) - -(defun %define-jna-callback-interface (returns args) - "Returns the Java byte[] array of a class representing a Java - interface descending form +CALLBACK-OBJECT+ which contains the - single function 'callback' which takes ARGS returning RETURNS. - -The fully qualified dotted name of the generated class is returned as -the second value." - (let ((name (callback-interface-classname returns args))) - (values - (define-java-interface name +dynamic-callback-package+ - `(("callback" ,returns ,args)) - `(,+callback-object+)) - (qualified-callback-interface-classname returns args)))) - -(defun define-java-interface (name package methods - &optional (superinterfaces nil)) -"Returns the bytes of the Java class interface called NAME in PACKAGE with METHODS. - -METHODS is a list of (NAME RETURN-TYPE (ARG-TYPES)) entries. NAME is -a string. The values of RETURN-TYPE and the list of ARG-TYPES for the -defined method follow the are either references to Java objects as -created by JVM::MAKE-JVM-CLASS-NAME, or keywords representing Java -primtive types as contained in JVM::MAP-PRIMITIVE-TYPE. - -SUPERINTERFACES optionally contains a list of interfaces that this -interface extends specified as fully qualifed dotted Java names." - (let* ((class-name-string (format nil "~A/~A" package name)) - (class-name (jvm::make-jvm-class-name class-name-string)) - (class (jvm::make-class-interface-file class-name))) - (dolist (superinterface superinterfaces) - (jvm::class-add-superinterface - class - (if (typep superinterface 'jvm::jvm-class-name) - superinterface - (jvm::make-jvm-class-name superinterface)))) - (dolist (method methods) - (let ((name (first method)) - (returns (second method)) - (args (third method))) - (jvm::class-add-method - class - (jvm::make-jvm-method name returns args - :flags '(:public :abstract))))) - (jvm::finalize-class-file class) - (let ((s (sys::%make-byte-array-output-stream))) - (jvm::write-class-file class s) - (sys::%get-output-stream-bytes s)))) - -(defun load-class (name bytes) - "Load the byte[] array BYTES as a Java class called NAME." - (#"loadClassFromByteArray" java::*classloader* name bytes)) - -;;; Test function: unused in CFFI -(defun write-class (class-bytes pathname) - "Write the Java byte[] array CLASS-BYTES to PATHNAME." - (with-open-file (stream pathname - :direction :output - :element-type '(signed-byte 8)) - (dotimes (i (jarray-length class-bytes)) - (write-byte (jarray-ref class-bytes i) stream)))) - -(defun %callback (name) - (or (#"getFunctionPointer" 'com.sun.jna.CallbackReference - (gethash name *callbacks*)) - (error "Undefined callback: ~S" name))) - -(defun native-namestring (pathname) - (namestring pathname)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-allegro.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-allegro.lisp deleted file mode 100644 index d3d79fe..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-allegro.lisp +++ /dev/null @@ -1,446 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-allegro.lisp --- CFFI-SYS implementation for Allegro CL. -;;; -;;; Copyright (C) 2005-2009, Luis Oliveira -;;; -;;; 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. -;;; - -;;;# Administrivia - -(defpackage #:cffi-sys - (:use #:common-lisp) - (:import-from #:alexandria #:if-let #:with-unique-names #:once-only) - (:export - #:canonicalize-symbol-name-case - #:foreign-pointer - #:pointerp - #:pointer-eq - #:null-pointer - #:null-pointer-p - #:inc-pointer - #:make-pointer - #:pointer-address - #:%foreign-alloc - #:foreign-free - #:with-foreign-pointer - #:%foreign-funcall - #:%foreign-funcall-pointer - #:%foreign-type-alignment - #:%foreign-type-size - #:%load-foreign-library - #:%close-foreign-library - #:native-namestring - #:%mem-ref - #:%mem-set - #:make-shareable-byte-vector - #:with-pointer-to-vector-data - #:%foreign-symbol-pointer - #:defcfun-helper-forms - #:%defcallback - #:%callback)) - -(in-package #:cffi-sys) - -;;;# Mis-features - -#-64bit (pushnew 'no-long-long *features*) -(pushnew 'flat-namespace *features*) - -;;;# Symbol Case - -(defun canonicalize-symbol-name-case (name) - (declare (string name)) - (if (eq excl:*current-case-mode* :case-sensitive-lower) - (string-downcase name) - (string-upcase name))) - -;;;# Basic Pointer Operations - -(deftype foreign-pointer () - 'ff:foreign-address) - -(defun pointerp (ptr) - "Return true if PTR is a foreign pointer." - (ff:foreign-address-p ptr)) - -(defun pointer-eq (ptr1 ptr2) - "Return true if PTR1 and PTR2 point to the same address." - (eql ptr1 ptr2)) - -(defun null-pointer () - "Return a null pointer." - 0) - -(defun null-pointer-p (ptr) - "Return true if PTR is a null pointer." - (zerop ptr)) - -(defun inc-pointer (ptr offset) - "Return a pointer pointing OFFSET bytes past PTR." - (+ ptr offset)) - -(defun make-pointer (address) - "Return a pointer pointing to ADDRESS." - (check-type address ff:foreign-address) - address) - -(defun pointer-address (ptr) - "Return the address pointed to by PTR." - (check-type ptr ff:foreign-address) - ptr) - -;;;# Allocation -;;; -;;; Functions and macros for allocating foreign memory on the stack -;;; and on the heap. The main CFFI package defines macros that wrap -;;; FOREIGN-ALLOC and FOREIGN-FREE in UNWIND-PROTECT for the common usage -;;; when the memory has dynamic extent. - -(defun %foreign-alloc (size) - "Allocate SIZE bytes on the heap and return a pointer." - (ff:allocate-fobject :char :c size)) - -(defun foreign-free (ptr) - "Free a PTR allocated by FOREIGN-ALLOC." - (ff:free-fobject ptr)) - -(defmacro with-foreign-pointer ((var size &optional size-var) &body body) - "Bind VAR to SIZE bytes of foreign memory during BODY. The -pointer in VAR is invalid beyond the dynamic extent of BODY, and -may be stack-allocated if supported by the implementation. If -SIZE-VAR is supplied, it will be bound to SIZE during BODY." - (unless size-var - (setf size-var (gensym "SIZE"))) - #+(version>= 8 1) - (when (and (constantp size) (<= (eval size) ff:*max-stack-fobject-bytes*)) - (return-from with-foreign-pointer - `(let ((,size-var ,(eval size))) - (declare (ignorable ,size-var)) - (ff:with-static-fobject (,var '(:array :char ,(eval size)) - :allocation :foreign-static-gc) - ;; (excl::stack-allocated-p var) => T - (let ((,var (ff:fslot-address ,var))) - ,@body))))) - `(let* ((,size-var ,size) - (,var (ff:allocate-fobject :char :c ,size-var))) - (unwind-protect - (progn ,@body) - (ff:free-fobject ,var)))) - -;;;# Shareable Vectors -;;; -;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA -;;; should be defined to perform a copy-in/copy-out if the Lisp -;;; implementation can't do this. - -(defun make-shareable-byte-vector (size) - "Create a Lisp vector of SIZE bytes can passed to -WITH-POINTER-TO-VECTOR-DATA." - (make-array size :element-type '(unsigned-byte 8) - :allocation :static-reclaimable)) - -(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) - "Bind PTR-VAR to a foreign pointer to the data in VECTOR." - ;; An array allocated in static-reclamable is a non-simple array in - ;; the normal Lisp allocation area, pointing to a simple array in - ;; the static-reclaimable allocation area. Therefore we have to get - ;; out the simple-array to find the pointer to the actual contents. - (with-unique-names (simple-vec) - `(excl:with-underlying-simple-vector (,vector ,simple-vec) - (let ((,ptr-var (ff:fslot-address-typed :unsigned-char :lisp - ,simple-vec))) - ,@body)))) - -;;;# Dereferencing - -(defun convert-foreign-type (type-keyword) - "Convert a CFFI type keyword to an Allegro type." - (ecase type-keyword - (:char :char) - (:unsigned-char :unsigned-char) - (:short :short) - (:unsigned-short :unsigned-short) - (:int :int) - (:unsigned-int :unsigned-int) - (:long :long) - (:unsigned-long :unsigned-long) - (:long-long - #+64bit :nat - #-64bit (error "this platform does not support :long-long.")) - (:unsigned-long-long - #+64bit :unsigned-nat - #-64bit (error "this platform does not support :unsigned-long-long")) - (:float :float) - (:double :double) - (:pointer :unsigned-nat) - (:void :void))) - -(defun %mem-ref (ptr type &optional (offset 0)) - "Dereference an object of TYPE at OFFSET bytes from PTR." - (unless (zerop offset) - (setf ptr (inc-pointer ptr offset))) - (ff:fslot-value-typed (convert-foreign-type type) :c ptr)) - -;;; Compiler macro to open-code the call to FSLOT-VALUE-TYPED when the -;;; CFFI type is constant. Allegro does its own transformation on the -;;; call that results in efficient code. -(define-compiler-macro %mem-ref (&whole form ptr type &optional (off 0)) - (if (constantp type) - (let ((ptr-form (if (eql off 0) ptr `(+ ,ptr ,off)))) - `(ff:fslot-value-typed ',(convert-foreign-type (eval type)) - :c ,ptr-form)) - form)) - -(defun %mem-set (value ptr type &optional (offset 0)) - "Set the object of TYPE at OFFSET bytes from PTR." - (unless (zerop offset) - (setf ptr (inc-pointer ptr offset))) - (setf (ff:fslot-value-typed (convert-foreign-type type) :c ptr) value)) - -;;; Compiler macro to open-code the call to (SETF FSLOT-VALUE-TYPED) -;;; when the CFFI type is constant. Allegro does its own -;;; transformation on the call that results in efficient code. -(define-compiler-macro %mem-set (&whole form val ptr type &optional (off 0)) - (if (constantp type) - (once-only (val) - (let ((ptr-form (if (eql off 0) ptr `(+ ,ptr ,off)))) - `(setf (ff:fslot-value-typed ',(convert-foreign-type (eval type)) - :c ,ptr-form) ,val))) - form)) - -;;;# Calling Foreign Functions - -(defun %foreign-type-size (type-keyword) - "Return the size in bytes of a foreign type." - (ff:sizeof-fobject (convert-foreign-type type-keyword))) - -(defun %foreign-type-alignment (type-keyword) - "Returns the alignment in bytes of a foreign type." - #+(and powerpc macosx32) - (when (eq type-keyword :double) - (return-from %foreign-type-alignment 8)) - ;; No override necessary for the remaining types.... - (ff::sized-ftype-prim-align - (ff::iforeign-type-sftype - (ff:get-foreign-type - (convert-foreign-type type-keyword))))) - -(defun foreign-funcall-type-and-args (args) - "Returns a list of types, list of args and return type." - (let ((return-type :void)) - (loop for (type arg) on args by #'cddr - if arg collect type into types - and collect arg into fargs - else do (setf return-type type) - finally (return (values types fargs return-type))))) - -(defun convert-to-lisp-type (type) - (ecase type - ((:char :short :int :long :nat) - `(signed-byte ,(* 8 (ff:sizeof-fobject type)))) - ((:unsigned-char :unsigned-short :unsigned-int :unsigned-long :unsigned-nat) - `(unsigned-byte ,(* 8 (ff:sizeof-fobject type)))) - (:float 'single-float) - (:double 'double-float) - (:void 'null))) - -(defun allegro-type-pair (cffi-type) - ;; the :FOREIGN-ADDRESS pseudo-type accepts both pointers and - ;; arrays. We need the latter for shareable byte vector support. - (if (eq cffi-type :pointer) - (list :foreign-address) - (let ((ftype (convert-foreign-type cffi-type))) - (list ftype (convert-to-lisp-type ftype))))) - -#+ignore -(defun note-named-foreign-function (symbol name types rettype) - "Give Allegro's compiler a hint to perform a direct call." - `(eval-when (:compile-toplevel :load-toplevel :execute) - (setf (get ',symbol 'system::direct-ff-call) - (list '(,name :language :c) - t ; callback - :c ; convention - ;; return type '(:c-type lisp-type) - ',(allegro-type-pair rettype) - ;; arg types '({(:c-type lisp-type)}*) - '(,@(mapcar #'allegro-type-pair types)) - nil ; arg-checking - ff::ep-flag-never-release)))) - -(defmacro %foreign-funcall (name args &key convention library) - (declare (ignore convention library)) - (multiple-value-bind (types fargs rettype) - (foreign-funcall-type-and-args args) - `(system::ff-funcall - (load-time-value (excl::determine-foreign-address - '(,name :language :c) - #-(version>= 8 1) ff::ep-flag-never-release - #+(version>= 8 1) ff::ep-flag-always-release - nil ; method-index - )) - ;; arg types {'(:c-type lisp-type) argN}* - ,@(mapcan (lambda (type arg) - `(',(allegro-type-pair type) ,arg)) - types fargs) - ;; return type '(:c-type lisp-type) - ',(allegro-type-pair rettype)))) - -(defun defcfun-helper-forms (name lisp-name rettype args types options) - "Return 2 values for DEFCFUN. A prelude form and a caller form." - (declare (ignore options)) - (let ((ff-name (intern (format nil "%cffi-foreign-function/~A" lisp-name)))) - (values - `(ff:def-foreign-call (,ff-name ,name) - ,(loop for type in types - collect (list* (gensym) (allegro-type-pair type))) - :returning ,(allegro-type-pair rettype) - ;; Don't use call-direct when there are no arguments. - ,@(unless (null args) '(:call-direct t)) - :arg-checking nil - :strings-convert nil - #+(version>= 8 1) ,@'(:release-heap :when-ok - :release-heap-ignorable t) - #+smp ,@'(:release-heap-implies-allow-gc t)) - `(,ff-name ,@args)))) - -;;; See doc/allegro-internals.txt for a clue about entry-vec. -(defmacro %foreign-funcall-pointer (ptr args &key convention) - (declare (ignore convention)) - (multiple-value-bind (types fargs rettype) - (foreign-funcall-type-and-args args) - (with-unique-names (entry-vec) - `(let ((,entry-vec (excl::make-entry-vec-boa))) - (setf (aref ,entry-vec 1) ,ptr) ; set jump address - (system::ff-funcall - ,entry-vec - ;; arg types {'(:c-type lisp-type) argN}* - ,@(mapcan (lambda (type arg) - `(',(allegro-type-pair type) ,arg)) - types fargs) - ;; return type '(:c-type lisp-type) - ',(allegro-type-pair rettype)))))) - -;;;# Callbacks - -;;; The *CALLBACKS* hash table contains information about a callback -;;; for the Allegro FFI. The key is the name of the CFFI callback, -;;; and the value is a cons, the car containing the symbol the -;;; callback was defined on in the CFFI-CALLBACKS package, the cdr -;;; being an Allegro FFI pointer (a fixnum) that can be passed to C -;;; functions. -;;; -;;; These pointers must be restored when a saved Lisp image is loaded. -;;; The RESTORE-CALLBACKS function is added to *RESTART-ACTIONS* to -;;; re-register the callbacks during Lisp startup. -(defvar *callbacks* (make-hash-table)) - -;;; Register a callback in the *CALLBACKS* hash table. -(defun register-callback (cffi-name callback-name) - (setf (gethash cffi-name *callbacks*) - (cons callback-name (ff:register-foreign-callable - callback-name :reuse t)))) - -;;; Restore the saved pointers in *CALLBACKS* when loading an image. -(defun restore-callbacks () - (maphash (lambda (key value) - (register-callback key (car value))) - *callbacks*)) - -;;; Arrange for RESTORE-CALLBACKS to run when a saved image containing -;;; CFFI is restarted. -(eval-when (:load-toplevel :execute) - (pushnew 'restore-callbacks excl:*restart-actions*)) - -;;; Create a package to contain the symbols for callback functions. -(defpackage #:cffi-callbacks - (:use)) - -(defun intern-callback (name) - (intern (format nil "~A::~A" - (if-let (package (symbol-package name)) - (package-name package) - "#") - (symbol-name name)) - '#:cffi-callbacks)) - -(defun convert-calling-convention (convention) - (ecase convention - (:cdecl :c) - (:stdcall :stdcall))) - -(defmacro %defcallback (name rettype arg-names arg-types body - &key convention) - (declare (ignore rettype)) - (let ((cb-name (intern-callback name))) - `(progn - (ff:defun-foreign-callable ,cb-name - ,(mapcar (lambda (sym type) (list sym (convert-foreign-type type))) - arg-names arg-types) - (declare (:convention ,(convert-calling-convention convention))) - ,body) - (register-callback ',name ',cb-name)))) - -;;; Return the saved Lisp callback pointer from *CALLBACKS* for the -;;; CFFI callback named NAME. -(defun %callback (name) - (or (cdr (gethash name *callbacks*)) - (error "Undefined callback: ~S" name))) - -;;;# Loading and Closing Foreign Libraries - -(defun %load-foreign-library (name path) - "Load a foreign library." - ;; ACL 8.0 honors the :FOREIGN option and always tries to foreign load - ;; the argument. However, previous versions do not and will only - ;; foreign load the argument if its type is a member of the - ;; EXCL::*LOAD-FOREIGN-TYPES* list. Therefore, we bind that special - ;; to a list containing whatever type NAME has. - (declare (ignore name)) - (let ((excl::*load-foreign-types* - (list (pathname-type (parse-namestring path))))) - (handler-case - (progn - #+(version>= 7) (load path :foreign t) - #-(version>= 7) (load path)) - (file-error (fe) - (error (change-class fe 'simple-error)))) - path)) - -(defun %close-foreign-library (name) - "Close the foreign library NAME." - (ff:unload-foreign-library name)) - -(defun native-namestring (pathname) - (namestring pathname)) - -;;;# Foreign Globals - -(defun convert-external-name (name) - "Add an underscore to NAME if necessary for the ABI." - #+macosx (concatenate 'string "_" name) - #-macosx name) - -(defun %foreign-symbol-pointer (name library) - "Returns a pointer to a foreign symbol NAME." - (declare (ignore library)) - (prog1 (ff:get-entry-point (convert-external-name name)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-clasp.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-clasp.lisp deleted file mode 100644 index 5591bf1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-clasp.lisp +++ /dev/null @@ -1,201 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-clasp.lisp --- CFFI-SYS implementation for Clasp. -;;; -;;; Copyright (C) 2017 Frank Goenninger -;;; -;;; 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. -;;; - -;;;# Administrivia - -(defpackage #:cffi-sys - (:use #:common-lisp #:alexandria) - (:export - #:canonicalize-symbol-name-case - #:foreign-pointer - #:pointerp - #:pointer-eq - #:%foreign-alloc - #:foreign-free - #:with-foreign-pointer - #:null-pointer - #:null-pointer-p - #:inc-pointer - #:make-pointer - #:pointer-address - #:%mem-ref - #:%mem-set - #:%foreign-funcall - #:%foreign-funcall-pointer - #:%foreign-type-alignment - #:%foreign-type-size - #:%load-foreign-library - #:%close-foreign-library - #:native-namestring - #:make-shareable-byte-vector - #:with-pointer-to-vector-data - #:%defcallback - #:%callback - #:%foreign-symbol-pointer)) - -(in-package #:cffi-sys) - -;;;# Mis-features - -(pushnew 'flat-namespace cl:*features*) - -;;;# Symbol Case - -(defun canonicalize-symbol-name-case (name) - (declare (string name)) - (string-upcase name)) - -;;;# Allocation - -(defun %foreign-alloc (size) - "Allocate SIZE bytes of foreign-addressable memory." - (clasp-ffi:%foreign-alloc size)) - -(defun foreign-free (ptr) - "Free a pointer PTR allocated by FOREIGN-ALLOC." - (clasp-ffi:%foreign-free ptr)) - -(defmacro with-foreign-pointer ((var size &optional size-var) &body body) - "Bind VAR to SIZE bytes of foreign memory during BODY. The -pointer in VAR is invalid beyond the dynamic extent of BODY, and -may be stack-allocated if supported by the implementation. If -SIZE-VAR is supplied, it will be bound to SIZE during BODY." - (unless size-var - (setf size-var (gensym "SIZE"))) - `(let* ((,size-var ,size) - (,var (%foreign-alloc ,size-var))) - (unwind-protect - (progn ,@body) - (foreign-free ,var)))) - -;;;# Misc. Pointer Operations - -(deftype foreign-pointer () - 'clasp-ffi:foreign-data) - -(defun null-pointer-p (ptr) - "Test if PTR is a null pointer." - (clasp-ffi:%null-pointer-p ptr)) - -(defun null-pointer () - "Construct and return a null pointer." - (clasp-ffi:%make-nullpointer)) - -(defun make-pointer (address) - "Return a pointer pointing to ADDRESS." - (clasp-ffi:%make-pointer address)) - -(defun inc-pointer (ptr offset) - "Return a pointer OFFSET bytes past PTR." - (clasp-ffi:%inc-pointer ptr offset)) - -(defun pointer-address (ptr) - "Return the address pointed to by PTR." - (clasp-ffi:%foreign-data-address ptr)) - -(defun pointerp (ptr) - "Return true if PTR is a foreign pointer." - (typep ptr 'clasp-ffi:foreign-data)) - -(defun pointer-eq (ptr1 ptr2) - "Return true if PTR1 and PTR2 point to the same address." - (check-type ptr1 clasp-ffi:foreign-data) - (check-type ptr2 clasp-ffi:foreign-data) - (eql (pointer-address ptr1) (pointer-address ptr2))) - - -;;;# Shareable Vectors -;;; -;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA -;;; should be defined to perform a copy-in/copy-out if the Lisp -;;; implementation can't do this. - -(defun make-shareable-byte-vector (size) - "Create a Lisp vector of SIZE bytes that can passed to -WITH-POINTER-TO-VECTOR-DATA." - (make-array size :element-type '(unsigned-byte 8))) - -;; frgo, 2016-07-02: TODO: Implemenent! -;; (defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) -;; "Bind PTR-VAR to a foreign pointer to the data in VECTOR." -;; `(let ((,ptr-var (si:make-foreign-data-from-array ,vector))) -;; ,@body)) - -(defun %foreign-type-size (type-keyword) - "Return the size in bytes of a foreign type." - (clasp-ffi:%foreign-type-size type-keyword)) - -(defun %foreign-type-alignment (type-keyword) - "Return the alignment in bytes of a foreign type." - (clasp-ffi:%foreign-type-alignment type-keyword)) - -;;;# Dereferencing - -(defun %mem-ref (ptr type &optional (offset 0)) - "Dereference an object of TYPE at OFFSET bytes from PTR." - (clasp-ffi:%mem-ref ptr type offset)) - -(defun %mem-set (value ptr type &optional (offset 0)) - "Set an object of TYPE at OFFSET bytes from PTR." - (clasp-ffi:%mem-set ptr type value offset)) - -(defmacro %foreign-funcall (name args &key library convention) - "Call a foreign function." - (declare (ignore library convention)) - `(clasp-ffi:%foreign-funcall ,name ,@args)) - -(defmacro %foreign-funcall-pointer (ptr args &key convention) - "Funcall a pointer to a foreign function." - (declare (ignore convention)) - `(clasp-ffi:%foreign-funcall-pointer ,ptr ,@args)) - -;;;# Foreign Libraries - -(defun %load-foreign-library (name path) - "Load a foreign library." - (clasp-ffi:%load-foreign-library name path)) - -(defun %close-foreign-library (handle) - "Close a foreign library." - (clasp-ffi:%close-foreign-library handle)) - -(defun %foreign-symbol-pointer (name library) - "Returns a pointer to a foreign symbol NAME." - (clasp-ffi:%foreign-symbol-pointer name library)) - -(defun native-namestring (pathname) - (namestring pathname)) - -;;;# Callbacks - -(defmacro %defcallback (name rettype arg-names arg-types body - &key convention) - `(clasp-ffi:%defcallback (,name ,@(when convention `(:convention ,convention))) - ,rettype ,arg-names ,arg-types ,body)) - -(defun %callback (name) - (clasp-ffi:%get-callback name)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-clisp.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-clisp.lisp deleted file mode 100644 index 9b92799..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-clisp.lisp +++ /dev/null @@ -1,432 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-clisp.lisp --- CFFI-SYS implementation for CLISP. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; Copyright (C) 2005-2006, Joerg Hoehle -;;; -;;; 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. -;;; - -;;;# Administrivia - -(defpackage #:cffi-sys - (:use #:common-lisp #:alexandria) - (:export - #:canonicalize-symbol-name-case - #:foreign-pointer - #:pointerp - #:pointer-eq - #:null-pointer - #:null-pointer-p - #:inc-pointer - #:make-pointer - #:pointer-address - #:%foreign-alloc - #:foreign-free - #:with-foreign-pointer - #:%foreign-funcall - #:%foreign-funcall-pointer - #:%foreign-type-alignment - #:%foreign-type-size - #:%load-foreign-library - #:%close-foreign-library - #:native-namestring - #:%mem-ref - #:%mem-set - #:make-shareable-byte-vector - #:with-pointer-to-vector-data - #:%foreign-symbol-pointer - #:%defcallback - #:%callback)) - -(in-package #:cffi-sys) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (unless (find-package :ffi) - (error "CFFI requires CLISP compiled with dynamic FFI support."))) - -;;;# Symbol Case - -(defun canonicalize-symbol-name-case (name) - (declare (string name)) - (string-upcase name)) - -;;;# Built-In Foreign Types - -(defun convert-foreign-type (type) - "Convert a CFFI built-in type keyword to a CLisp FFI type." - (ecase type - (:char 'ffi:char) - (:unsigned-char 'ffi:uchar) - (:short 'ffi:short) - (:unsigned-short 'ffi:ushort) - (:int 'ffi:int) - (:unsigned-int 'ffi:uint) - (:long 'ffi:long) - (:unsigned-long 'ffi:ulong) - (:long-long 'ffi:sint64) - (:unsigned-long-long 'ffi:uint64) - (:float 'ffi:single-float) - (:double 'ffi:double-float) - ;; Clisp's FFI:C-POINTER converts NULL to NIL. For now - ;; we have a workaround in the pointer operations... - (:pointer 'ffi:c-pointer) - (:void nil))) - -(defun %foreign-type-size (type) - "Return the size in bytes of objects having foreign type TYPE." - (nth-value 0 (ffi:sizeof (convert-foreign-type type)))) - -;; Remind me to buy a beer for whoever made getting the alignment -;; of foreign types part of the public interface in CLisp. :-) -(defun %foreign-type-alignment (type) - "Return the structure alignment in bytes of foreign TYPE." - #+(and darwin ppc) - (case type - ((:double :long-long :unsigned-long-long) - (return-from %foreign-type-alignment 8))) - ;; Override not necessary for the remaining types... - (nth-value 1 (ffi:sizeof (convert-foreign-type type)))) - -;;;# Basic Pointer Operations - -(deftype foreign-pointer () - 'ffi:foreign-address) - -(defun pointerp (ptr) - "Return true if PTR is a foreign pointer." - (typep ptr 'ffi:foreign-address)) - -(defun pointer-eq (ptr1 ptr2) - "Return true if PTR1 and PTR2 point to the same address." - (eql (ffi:foreign-address-unsigned ptr1) - (ffi:foreign-address-unsigned ptr2))) - -(defun null-pointer () - "Return a null foreign pointer." - (ffi:unsigned-foreign-address 0)) - -(defun null-pointer-p (ptr) - "Return true if PTR is a null foreign pointer." - (zerop (ffi:foreign-address-unsigned ptr))) - -(defun inc-pointer (ptr offset) - "Return a pointer pointing OFFSET bytes past PTR." - (ffi:unsigned-foreign-address - (+ offset (ffi:foreign-address-unsigned ptr)))) - -(defun make-pointer (address) - "Return a pointer pointing to ADDRESS." - (ffi:unsigned-foreign-address address)) - -(defun pointer-address (ptr) - "Return the address pointed to by PTR." - (ffi:foreign-address-unsigned ptr)) - -;;;# Foreign Memory Allocation - -(defun %foreign-alloc (size) - "Allocate SIZE bytes of foreign-addressable memory and return a -pointer to the allocated block. An implementation-specific error -is signalled if the memory cannot be allocated." - (ffi:foreign-address - (ffi:allocate-shallow 'ffi:uint8 :count (if (zerop size) 1 size)))) - -(defun foreign-free (ptr) - "Free a pointer PTR allocated by FOREIGN-ALLOC. The results -are undefined if PTR is used after being freed." - (ffi:foreign-free ptr)) - -(defmacro with-foreign-pointer ((var size &optional size-var) &body body) - "Bind VAR to a pointer to SIZE bytes of foreign-addressable -memory during BODY. Both PTR and the memory block pointed to -have dynamic extent and may be stack allocated if supported by -the implementation. If SIZE-VAR is supplied, it will be bound to -SIZE during BODY." - (unless size-var - (setf size-var (gensym "SIZE"))) - (let ((obj-var (gensym))) - `(let ((,size-var ,size)) - (ffi:with-foreign-object - (,obj-var `(ffi:c-array ffi:uint8 ,,size-var)) - (let ((,var (ffi:foreign-address ,obj-var))) - ,@body))))) - -;;;# Memory Access - -;;; %MEM-REF and its compiler macro work around CLISP's FFI:C-POINTER -;;; type and convert NILs back to null pointers. -(defun %mem-ref (ptr type &optional (offset 0)) - "Dereference a pointer OFFSET bytes from PTR to an object of -built-in foreign TYPE. Returns the object as a foreign pointer -or Lisp number." - (let ((value (ffi:memory-as ptr (convert-foreign-type type) offset))) - (if (eq type :pointer) - (or value (null-pointer)) - value))) - -(define-compiler-macro %mem-ref (&whole form ptr type &optional (offset 0)) - "Compiler macro to open-code when TYPE is constant." - (if (constantp type) - (let* ((ftype (convert-foreign-type (eval type))) - (form `(ffi:memory-as ,ptr ',ftype ,offset))) - (if (eq type :pointer) - `(or ,form (null-pointer)) - form)) - form)) - -(defun %mem-set (value ptr type &optional (offset 0)) - "Set a pointer OFFSET bytes from PTR to an object of built-in -foreign TYPE to VALUE." - (setf (ffi:memory-as ptr (convert-foreign-type type) offset) value)) - -(define-compiler-macro %mem-set - (&whole form value ptr type &optional (offset 0)) - (if (constantp type) - ;; (setf (ffi:memory-as) value) is exported, but not so nice - ;; w.r.t. the left to right evaluation rule - `(ffi::write-memory-as - ,value ,ptr ',(convert-foreign-type (eval type)) ,offset) - form)) - -;;;# Shareable Vectors -;;; -;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA -;;; should be defined to perform a copy-in/copy-out if the Lisp -;;; implementation can't do this. - -(declaim (inline make-shareable-byte-vector)) -(defun make-shareable-byte-vector (size) - "Create a Lisp vector of SIZE bytes can passed to -WITH-POINTER-TO-VECTOR-DATA." - (make-array size :element-type '(unsigned-byte 8))) - -(deftype shareable-byte-vector () - `(vector (unsigned-byte 8))) - -(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) - "Bind PTR-VAR to a foreign pointer to the data in VECTOR." - (with-unique-names (vector-var size-var) - `(let ((,vector-var ,vector)) - (check-type ,vector-var shareable-byte-vector) - (with-foreign-pointer (,ptr-var (length ,vector-var) ,size-var) - ;; copy-in - (loop for i below ,size-var do - (%mem-set (aref ,vector-var i) ,ptr-var :unsigned-char i)) - (unwind-protect (progn ,@body) - ;; copy-out - (loop for i below ,size-var do - (setf (aref ,vector-var i) - (%mem-ref ,ptr-var :unsigned-char i)))))))) - -;;;# Foreign Function Calling - -(defun parse-foreign-funcall-args (args) - "Return three values, a list of CLISP FFI types, a list of -values to pass to the function, and the CLISP FFI return type." - (let ((return-type nil)) - (loop for (type arg) on args by #'cddr - if arg collect (list (gensym) (convert-foreign-type type)) into types - and collect arg into fargs - else do (setf return-type (convert-foreign-type type)) - finally (return (values types fargs return-type))))) - -(defun convert-calling-convention (convention) - (ecase convention - (:stdcall :stdc-stdcall) - (:cdecl :stdc))) - -(defun c-function-type (arg-types rettype convention) - "Generate the apropriate CLISP foreign type specification. Also -takes care of converting the calling convention names." - `(ffi:c-function (:arguments ,@arg-types) - (:return-type ,rettype) - (:language ,(convert-calling-convention convention)))) - -;;; Quick hack around the fact that the CFFI package is not yet -;;; defined when this file is loaded. I suppose we could arrange for -;;; the CFFI package to be defined a bit earlier, though. -(defun library-handle-form (name) - (flet ((find-cffi-symbol (symbol) - (find-symbol (symbol-name symbol) '#:cffi))) - `(,(find-cffi-symbol '#:foreign-library-handle) - (,(find-cffi-symbol '#:get-foreign-library) ',name)))) - -(eval-when (:compile-toplevel :load-toplevel :execute) - ;; version 2.40 (CVS 2006-09-03, to be more precise) added a - ;; PROPERTIES argument to FFI::FOREIGN-LIBRARY-FUNCTION. - (defun post-2.40-ffi-interface-p () - (let ((f-l-f (find-symbol (string '#:foreign-library-function) '#:ffi))) - (if (and f-l-f (= (length (ext:arglist f-l-f)) 5)) - '(:and) - '(:or)))) - ;; FFI::FOREIGN-LIBRARY-FUNCTION and FFI::FOREIGN-LIBRARY-VARIABLE - ;; were deprecated in 2.41 and removed in 2.45. - (defun post-2.45-ffi-interface-p () - (if (find-symbol (string '#:foreign-library-function) '#:ffi) - '(:or) - '(:and)))) - -#+#.(cffi-sys::post-2.45-ffi-interface-p) -(defun %foreign-funcall-aux (name type library) - `(ffi::find-foreign-function ,name ,type nil ,library nil nil)) - -#-#.(cffi-sys::post-2.45-ffi-interface-p) -(defun %foreign-funcall-aux (name type library) - `(ffi::foreign-library-function - ,name ,library nil - #+#.(cffi-sys::post-2.40-ffi-interface-p) - nil - ,type)) - -(defmacro %foreign-funcall (name args &key library convention) - "Invoke a foreign function called NAME, taking pairs of -foreign-type/value pairs from ARGS. If a single element is left -over at the end of ARGS, it specifies the foreign return type of -the function call." - (multiple-value-bind (types fargs rettype) - (parse-foreign-funcall-args args) - (let* ((fn (%foreign-funcall-aux - name - `(ffi:parse-c-type - ',(c-function-type types rettype convention)) - (if (eq library :default) - :default - (library-handle-form library)))) - (form `(funcall - (load-time-value - (handler-case ,fn - (error (err) - (warn "~A" err)))) - ,@fargs))) - (if (eq rettype 'ffi:c-pointer) - `(or ,form (null-pointer)) - form)))) - -(defmacro %foreign-funcall-pointer (ptr args &key convention) - "Similar to %foreign-funcall but takes a pointer instead of a string." - (multiple-value-bind (types fargs rettype) - (parse-foreign-funcall-args args) - `(funcall (ffi:foreign-function - ,ptr (load-time-value - (ffi:parse-c-type ',(c-function-type - types rettype convention)))) - ,@fargs))) - -;;;# Callbacks - -;;; *CALLBACKS* contains the callbacks defined by the CFFI DEFCALLBACK -;;; macro. The symbol naming the callback is the key, and the value -;;; is a list containing a Lisp function, the parsed CLISP FFI type of -;;; the callback, and a saved pointer that should not persist across -;;; saved images. -(defvar *callbacks* (make-hash-table)) - -;;; Return a CLISP FFI function type for a CFFI callback function -;;; given a return type and list of argument names and types. -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun callback-type (rettype arg-names arg-types convention) - (ffi:parse-c-type - `(ffi:c-function - (:arguments ,@(mapcar (lambda (sym type) - (list sym (convert-foreign-type type))) - arg-names arg-types)) - (:return-type ,(convert-foreign-type rettype)) - (:language ,(convert-calling-convention convention)))))) - -;;; Register and create a callback function. -(defun register-callback (name function parsed-type) - (setf (gethash name *callbacks*) - (list function parsed-type - (ffi:with-foreign-object (ptr 'ffi:c-pointer) - ;; Create callback by converting Lisp function to foreign - (setf (ffi:memory-as ptr parsed-type) function) - (ffi:foreign-value ptr))))) - -;;; Restore all saved callback pointers when restarting the Lisp -;;; image. This is pushed onto CUSTOM:*INIT-HOOKS*. -;;; Needs clisp > 2.35, bugfix 2005-09-29 -(defun restore-callback-pointers () - (maphash - (lambda (name list) - (register-callback name (first list) (second list))) - *callbacks*)) - -;;; Add RESTORE-CALLBACK-POINTERS to the lists of functions to run -;;; when an image is restarted. -(eval-when (:load-toplevel :execute) - (pushnew 'restore-callback-pointers custom:*init-hooks*)) - -;;; Define a callback function NAME to run BODY with arguments -;;; ARG-NAMES translated according to ARG-TYPES and the return type -;;; translated according to RETTYPE. Obtain a pointer that can be -;;; passed to C code for this callback by calling %CALLBACK. -(defmacro %defcallback (name rettype arg-names arg-types body - &key convention) - `(register-callback - ',name - (lambda ,arg-names - ;; Work around CLISP's FFI:C-POINTER type and convert NIL values - ;; back into a null pointers. - (let (,@(loop for name in arg-names - and type in arg-types - when (eq type :pointer) - collect `(,name (or ,name (null-pointer))))) - ,body)) - ,(callback-type rettype arg-names arg-types convention))) - -;;; Look up the name of a callback and return a pointer that can be -;;; passed to a C function. Signals an error if no callback is -;;; defined called NAME. -(defun %callback (name) - (multiple-value-bind (list winp) (gethash name *callbacks*) - (unless winp - (error "Undefined callback: ~S" name)) - (third list))) - -;;;# Loading and Closing Foreign Libraries - -(defun %load-foreign-library (name path) - "Load a foreign library from PATH." - (declare (ignore name)) - #+#.(cffi-sys::post-2.45-ffi-interface-p) - (ffi:open-foreign-library path) - #-#.(cffi-sys::post-2.45-ffi-interface-p) - (ffi::foreign-library path)) - -(defun %close-foreign-library (handle) - "Close a foreign library." - (ffi:close-foreign-library handle)) - -(defun native-namestring (pathname) - (namestring pathname)) - -;;;# Foreign Globals - -(defun %foreign-symbol-pointer (name library) - "Returns a pointer to a foreign symbol NAME." - (prog1 (ignore-errors - (ffi:foreign-address - #+#.(cffi-sys::post-2.45-ffi-interface-p) - (ffi::find-foreign-variable name nil library nil nil) - #-#.(cffi-sys::post-2.45-ffi-interface-p) - (ffi::foreign-library-variable name library nil nil))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-cmucl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-cmucl.lisp deleted file mode 100644 index 210bb2a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-cmucl.lisp +++ /dev/null @@ -1,384 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-cmucl.lisp --- CFFI-SYS implementation for CMU CL. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -;;;# Administrivia - -(defpackage #:cffi-sys - (:use #:common-lisp #:alien #:c-call) - (:import-from #:alexandria #:once-only #:with-unique-names #:if-let) - (:export - #:canonicalize-symbol-name-case - #:foreign-pointer - #:pointerp - #:pointer-eq - #:null-pointer - #:null-pointer-p - #:inc-pointer - #:make-pointer - #:pointer-address - #:%foreign-alloc - #:foreign-free - #:with-foreign-pointer - #:%foreign-funcall - #:%foreign-funcall-pointer - #:%foreign-type-alignment - #:%foreign-type-size - #:%load-foreign-library - #:%close-foreign-library - #:native-namestring - #:%mem-ref - #:%mem-set - #:make-shareable-byte-vector - #:with-pointer-to-vector-data - #:%foreign-symbol-pointer - #:%defcallback - #:%callback)) - -(in-package #:cffi-sys) - -;;;# Misfeatures - -(pushnew 'flat-namespace *features*) - -;;;# Symbol Case - -(defun canonicalize-symbol-name-case (name) - (declare (string name)) - (string-upcase name)) - -;;;# Basic Pointer Operations - -(deftype foreign-pointer () - 'sys:system-area-pointer) - -(declaim (inline pointerp)) -(defun pointerp (ptr) - "Return true if PTR is a foreign pointer." - (sys:system-area-pointer-p ptr)) - -(declaim (inline pointer-eq)) -(defun pointer-eq (ptr1 ptr2) - "Return true if PTR1 and PTR2 point to the same address." - (sys:sap= ptr1 ptr2)) - -(declaim (inline null-pointer)) -(defun null-pointer () - "Construct and return a null pointer." - (sys:int-sap 0)) - -(declaim (inline null-pointer-p)) -(defun null-pointer-p (ptr) - "Return true if PTR is a null pointer." - (zerop (sys:sap-int ptr))) - -(declaim (inline inc-pointer)) -(defun inc-pointer (ptr offset) - "Return a pointer pointing OFFSET bytes past PTR." - (sys:sap+ ptr offset)) - -(declaim (inline make-pointer)) -(defun make-pointer (address) - "Return a pointer pointing to ADDRESS." - (sys:int-sap address)) - -(declaim (inline pointer-address)) -(defun pointer-address (ptr) - "Return the address pointed to by PTR." - (sys:sap-int ptr)) - -(defmacro with-foreign-pointer ((var size &optional size-var) &body body) - "Bind VAR to SIZE bytes of foreign memory during BODY. The -pointer in VAR is invalid beyond the dynamic extent of BODY, and -may be stack-allocated if supported by the implementation. If -SIZE-VAR is supplied, it will be bound to SIZE during BODY." - (unless size-var - (setf size-var (gensym "SIZE"))) - ;; If the size is constant we can stack-allocate. - (if (constantp size) - (let ((alien-var (gensym "ALIEN"))) - `(with-alien ((,alien-var (array (unsigned 8) ,(eval size)))) - (let ((,size-var ,(eval size)) - (,var (alien-sap ,alien-var))) - (declare (ignorable ,size-var)) - ,@body))) - `(let* ((,size-var ,size) - (,var (%foreign-alloc ,size-var))) - (unwind-protect - (progn ,@body) - (foreign-free ,var))))) - -;;;# Allocation -;;; -;;; Functions and macros for allocating foreign memory on the stack -;;; and on the heap. The main CFFI package defines macros that wrap -;;; FOREIGN-ALLOC and FOREIGN-FREE in UNWIND-PROTECT for the common usage -;;; when the memory has dynamic extent. - -(defun %foreign-alloc (size) - "Allocate SIZE bytes on the heap and return a pointer." - (declare (type (unsigned-byte 32) size)) - (alien-funcall - (extern-alien - "malloc" - (function system-area-pointer unsigned)) - size)) - -(defun foreign-free (ptr) - "Free a PTR allocated by FOREIGN-ALLOC." - (declare (type system-area-pointer ptr)) - (alien-funcall - (extern-alien - "free" - (function (values) system-area-pointer)) - ptr)) - -;;;# Shareable Vectors -;;; -;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA -;;; should be defined to perform a copy-in/copy-out if the Lisp -;;; implementation can't do this. - -(defun make-shareable-byte-vector (size) - "Create a Lisp vector of SIZE bytes that can passed to -WITH-POINTER-TO-VECTOR-DATA." - (make-array size :element-type '(unsigned-byte 8))) - -(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) - "Bind PTR-VAR to a foreign pointer to the data in VECTOR." - `(sys:without-gcing - (let ((,ptr-var (sys:vector-sap ,vector))) - ,@body))) - -;;;# Dereferencing - -;;; Define the %MEM-REF and %MEM-SET functions, as well as compiler -;;; macros that optimize the case where the type keyword is constant -;;; at compile-time. -(defmacro define-mem-accessors (&body pairs) - `(progn - (defun %mem-ref (ptr type &optional (offset 0)) - (ecase type - ,@(loop for (keyword fn) in pairs - collect `(,keyword (,fn ptr offset))))) - (defun %mem-set (value ptr type &optional (offset 0)) - (ecase type - ,@(loop for (keyword fn) in pairs - collect `(,keyword (setf (,fn ptr offset) value))))) - (define-compiler-macro %mem-ref - (&whole form ptr type &optional (offset 0)) - (if (constantp type) - (ecase (eval type) - ,@(loop for (keyword fn) in pairs - collect `(,keyword `(,',fn ,ptr ,offset)))) - form)) - (define-compiler-macro %mem-set - (&whole form value ptr type &optional (offset 0)) - (if (constantp type) - (once-only (value) - (ecase (eval type) - ,@(loop for (keyword fn) in pairs - collect `(,keyword `(setf (,',fn ,ptr ,offset) - ,value))))) - form)))) - -(define-mem-accessors - (:char sys:signed-sap-ref-8) - (:unsigned-char sys:sap-ref-8) - (:short sys:signed-sap-ref-16) - (:unsigned-short sys:sap-ref-16) - (:int sys:signed-sap-ref-32) - (:unsigned-int sys:sap-ref-32) - (:long sys:signed-sap-ref-32) - (:unsigned-long sys:sap-ref-32) - (:long-long sys:signed-sap-ref-64) - (:unsigned-long-long sys:sap-ref-64) - (:float sys:sap-ref-single) - (:double sys:sap-ref-double) - (:pointer sys:sap-ref-sap)) - -;;;# Calling Foreign Functions - -(defun convert-foreign-type (type-keyword) - "Convert a CFFI type keyword to an ALIEN type." - (ecase type-keyword - (:char 'char) - (:unsigned-char 'unsigned-char) - (:short 'short) - (:unsigned-short 'unsigned-short) - (:int 'int) - (:unsigned-int 'unsigned-int) - (:long 'long) - (:unsigned-long 'unsigned-long) - (:long-long '(signed 64)) - (:unsigned-long-long '(unsigned 64)) - (:float 'single-float) - (:double 'double-float) - (:pointer 'system-area-pointer) - (:void 'void))) - -(defun %foreign-type-size (type-keyword) - "Return the size in bytes of a foreign type." - (/ (alien-internals:alien-type-bits - (alien-internals:parse-alien-type - (convert-foreign-type type-keyword))) 8)) - -(defun %foreign-type-alignment (type-keyword) - "Return the alignment in bytes of a foreign type." - (/ (alien-internals:alien-type-alignment - (alien-internals:parse-alien-type - (convert-foreign-type type-keyword))) 8)) - -(defun foreign-funcall-type-and-args (args) - "Return an ALIEN function type for ARGS." - (let ((return-type nil)) - (loop for (type arg) on args by #'cddr - if arg collect (convert-foreign-type type) into types - and collect arg into fargs - else do (setf return-type (convert-foreign-type type)) - finally (return (values types fargs return-type))))) - -(defmacro %%foreign-funcall (name types fargs rettype) - "Internal guts of %FOREIGN-FUNCALL." - `(alien-funcall - (extern-alien ,name (function ,rettype ,@types)) - ,@fargs)) - -(defmacro %foreign-funcall (name args &key library convention) - "Perform a foreign function call, document it more later." - (declare (ignore library convention)) - (multiple-value-bind (types fargs rettype) - (foreign-funcall-type-and-args args) - `(%%foreign-funcall ,name ,types ,fargs ,rettype))) - -(defmacro %foreign-funcall-pointer (ptr args &key convention) - "Funcall a pointer to a foreign function." - (declare (ignore convention)) - (multiple-value-bind (types fargs rettype) - (foreign-funcall-type-and-args args) - (with-unique-names (function) - `(with-alien ((,function (* (function ,rettype ,@types)) ,ptr)) - (alien-funcall ,function ,@fargs))))) - -;;;# Callbacks - -(defvar *callbacks* (make-hash-table)) - -;;; Create a package to contain the symbols for callback functions. We -;;; want to redefine callbacks with the same symbol so the internal data -;;; structures are reused. -(defpackage #:cffi-callbacks - (:use)) - -;;; Intern a symbol in the CFFI-CALLBACKS package used to name the internal -;;; callback for NAME. -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun intern-callback (name) - (intern (format nil "~A::~A" - (if-let (package (symbol-package name)) - (package-name package) - name) - (symbol-name name)) - '#:cffi-callbacks))) - -(defmacro %defcallback (name rettype arg-names arg-types body - &key convention) - (declare (ignore convention)) - (let ((cb-name (intern-callback name))) - `(progn - (def-callback ,cb-name - (,(convert-foreign-type rettype) - ,@(mapcar (lambda (sym type) - (list sym (convert-foreign-type type))) - arg-names arg-types)) - ,body) - (setf (gethash ',name *callbacks*) (callback ,cb-name))))) - -(defun %callback (name) - (multiple-value-bind (pointer winp) - (gethash name *callbacks*) - (unless winp - (error "Undefined callback: ~S" name)) - pointer)) - -;;; CMUCL makes new callback trampolines when it reloads, so we need -;;; to update CFFI's copies. -(defun reset-callbacks () - (loop for k being the hash-keys of *callbacks* - do (setf (gethash k *callbacks*) - (alien::symbol-trampoline (intern-callback k))))) - -;; Needs to be after cmucl's restore-callbacks, so put at the end... -(unless (member 'reset-callbacks ext:*after-save-initializations*) - (setf ext:*after-save-initializations* - (append ext:*after-save-initializations* (list 'reset-callbacks)))) - -;;;# Loading and Closing Foreign Libraries - -;;; Work-around for compiling ffi code without loading the -;;; respective library at compile-time. -(setf c::top-level-lambda-max 0) - -(defun %load-foreign-library (name path) - "Load the foreign library NAME." - ;; On some platforms SYS::LOAD-OBJECT-FILE signals an error when - ;; loading fails, but on others (Linux for instance) it returns - ;; two values: NIL and an error string. - (declare (ignore name)) - (multiple-value-bind (ret message) - (sys::load-object-file path) - (cond - ;; Loading failed. - ((stringp message) (error "~A" message)) - ;; The library was already loaded. - ((null ret) (cdr (rassoc path sys::*global-table* :test #'string=))) - ;; The library has been loaded, but since SYS::LOAD-OBJECT-FILE - ;; returns an alist of *all* loaded libraries along with their addresses - ;; we return only the handler associated with the library just loaded. - (t (cdr (rassoc path ret :test #'string=)))))) - -;;; XXX: doesn't work on Darwin; does not check for errors. I suppose we'd -;;; want something like SBCL's dlclose-or-lose in foreign-load.lisp:66 -(defun %close-foreign-library (handler) - "Closes a foreign library." - (let ((lib (rassoc (ext:unix-namestring handler) sys::*global-table* - :test #'string=))) - (sys::dlclose (car lib)) - (setf (car lib) (sys:int-sap 0)))) - -(defun native-namestring (pathname) - (ext:unix-namestring pathname nil)) - -;;;# Foreign Globals - -(defun %foreign-symbol-pointer (name library) - "Returns a pointer to a foreign symbol NAME." - (declare (ignore library)) - (let ((address (sys:alternate-get-global-address - (vm:extern-alien-name name)))) - (if (zerop address) - nil - (sys:int-sap address)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-corman.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-corman.lisp deleted file mode 100644 index 14e7d61..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-corman.lisp +++ /dev/null @@ -1,331 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-corman.lisp --- CFFI-SYS implementation for Corman Lisp. -;;; -;;; Copyright (C) 2005-2008, Luis Oliveira -;;; -;;; 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. -;;; - -;;; This port is suffering from bitrot as of 2007-03-29. Corman Lisp -;;; is too funky with ASDF, crashes easily, makes it very painful to -;;; do any testing. -- luis - -;;;# Administrivia - -(defpackage #:cffi-sys - (:use #:common-lisp #:c-types) - (:import-from #:alexandria #:with-unique-names) - (:export - #:canonicalize-symbol-name-case - #:foreign-pointer - #:pointerp - #:pointer-eq - #:null-pointer - #:null-pointer-p - #:inc-pointer - #:make-pointer - #:pointer-address - #:%foreign-alloc - #:foreign-free - #:with-foreign-pointer - #:%foreign-funcall - #:%foreign-type-alignment - #:%foreign-type-size - #:%load-foreign-library - #:native-namestring - #:%mem-ref - #:%mem-set - ;#:make-shareable-byte-vector - ;#:with-pointer-to-vector-data - #:foreign-symbol-pointer - #:defcfun-helper-forms - #:%defcallback - #:%callback)) - -(in-package #:cffi-sys) - -;;;# Misfeatures - -(pushnew 'no-long-long *features*) -(pushnew 'no-foreign-funcall *features*) - -;;;$ Symbol Case - -(defun canonicalize-symbol-name-case (name) - (declare (string name)) - (string-upcase name)) - -;;;# Basic Pointer Operations - -(deftype foreign-pointer () - 'cl::foreign) - -(defun pointerp (ptr) - "Return true if PTR is a foreign pointer." - (cpointerp ptr)) - -(defun pointer-eq (ptr1 ptr2) - "Return true if PTR1 and PTR2 point to the same address." - (cpointer= ptr1 ptr2)) - -(defun null-pointer () - "Return a null pointer." - (create-foreign-ptr)) - -(defun null-pointer-p (ptr) - "Return true if PTR is a null pointer." - (cpointer-null ptr)) - -(defun inc-pointer (ptr offset) - "Return a pointer pointing OFFSET bytes past PTR." - (let ((new-ptr (create-foreign-ptr))) - (setf (cpointer-value new-ptr) - (+ (cpointer-value ptr) offset)) - new-ptr)) - -(defun make-pointer (address) - "Return a pointer pointing to ADDRESS." - (int-to-foreign-ptr address)) - -(defun pointer-address (ptr) - "Return the address pointed to by PTR." - (foreign-ptr-to-int ptr)) - -;;;# Allocation -;;; -;;; Functions and macros for allocating foreign memory on the stack -;;; and on the heap. The main CFFI package defines macros that wrap -;;; FOREIGN-ALLOC and FOREIGN-FREE in UNWIND-PROTECT for the common usage -;;; when the memory has dynamic extent. - -(defun %foreign-alloc (size) - "Allocate SIZE bytes on the heap and return a pointer." - (malloc size)) - -(defun foreign-free (ptr) - "Free a PTR allocated by FOREIGN-ALLOC." - (free ptr)) - -(defmacro with-foreign-pointer ((var size &optional size-var) &body body) - "Bind VAR to SIZE bytes of foreign memory during BODY. The -pointer in VAR is invalid beyond the dynamic extent of BODY, and -may be stack-allocated if supported by the implementation. If -SIZE-VAR is supplied, it will be bound to SIZE during BODY." - (unless size-var - (setf size-var (gensym "SIZE"))) - `(let* ((,size-var ,size) - (,var (malloc ,size-var))) - (unwind-protect - (progn ,@body) - (free ,var)))) - -;;;# Shareable Vectors -;;; -;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA -;;; should be defined to perform a copy-in/copy-out if the Lisp -;;; implementation can't do this. - -;(defun make-shareable-byte-vector (size) -; "Create a Lisp vector of SIZE bytes can passed to -;WITH-POINTER-TO-VECTOR-DATA." -; (make-array size :element-type '(unsigned-byte 8))) -; -;(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) -; "Bind PTR-VAR to a foreign pointer to the data in VECTOR." -; `(sb-sys:without-gcing -; (let ((,ptr-var (sb-sys:vector-sap ,vector))) -; ,@body))) - -;;;# Dereferencing - -;;; According to the docs, Corman's C Function Definition Parser -;;; converts int to long, so we'll assume that. -(defun convert-foreign-type (type-keyword) - "Convert a CFFI type keyword to a CormanCL type." - (ecase type-keyword - (:char :char) - (:unsigned-char :unsigned-char) - (:short :short) - (:unsigned-short :unsigned-short) - (:int :long) - (:unsigned-int :unsigned-long) - (:long :long) - (:unsigned-long :unsigned-long) - (:float :single-float) - (:double :double-float) - (:pointer :handle) - (:void :void))) - -(defun %mem-ref (ptr type &optional (offset 0)) - "Dereference an object of TYPE at OFFSET bytes from PTR." - (unless (eql offset 0) - (setq ptr (inc-pointer ptr offset))) - (ecase type - (:char (cref (:char *) ptr 0)) - (:unsigned-char (cref (:unsigned-char *) ptr 0)) - (:short (cref (:short *) ptr 0)) - (:unsigned-short (cref (:unsigned-short *) ptr 0)) - (:int (cref (:long *) ptr 0)) - (:unsigned-int (cref (:unsigned-long *) ptr 0)) - (:long (cref (:long *) ptr 0)) - (:unsigned-long (cref (:unsigned-long *) ptr 0)) - (:float (cref (:single-float *) ptr 0)) - (:double (cref (:double-float *) ptr 0)) - (:pointer (cref (:handle *) ptr 0)))) - -;(define-compiler-macro %mem-ref (&whole form ptr type &optional (offset 0)) -; (if (constantp type) -; `(cref (,(convert-foreign-type type) *) ,ptr ,offset) -; form)) - -(defun %mem-set (value ptr type &optional (offset 0)) - "Set the object of TYPE at OFFSET bytes from PTR." - (unless (eql offset 0) - (setq ptr (inc-pointer ptr offset))) - (ecase type - (:char (setf (cref (:char *) ptr 0) value)) - (:unsigned-char (setf (cref (:unsigned-char *) ptr 0) value)) - (:short (setf (cref (:short *) ptr 0) value)) - (:unsigned-short (setf (cref (:unsigned-short *) ptr 0) value)) - (:int (setf (cref (:long *) ptr 0) value)) - (:unsigned-int (setf (cref (:unsigned-long *) ptr 0) value)) - (:long (setf (cref (:long *) ptr 0) value)) - (:unsigned-long (setf (cref (:unsigned-long *) ptr 0) value)) - (:float (setf (cref (:single-float *) ptr 0) value)) - (:double (setf (cref (:double-float *) ptr 0) value)) - (:pointer (setf (cref (:handle *) ptr 0) value)))) - -;;;# Calling Foreign Functions - -(defun %foreign-type-size (type-keyword) - "Return the size in bytes of a foreign type." - (sizeof (convert-foreign-type type-keyword))) - -;;; Couldn't find anything in sys/ffi.lisp and the C declaration parser -;;; doesn't seem to care about alignment so we'll assume that it's the -;;; same as its size. -(defun %foreign-type-alignment (type-keyword) - (sizeof (convert-foreign-type type-keyword))) - -(defun find-dll-containing-function (name) - "Searches for NAME in the loaded DLLs. If found, returns -the DLL's name (a string), else returns NIL." - (dolist (dll ct::*dlls-loaded*) - (when (ignore-errors - (ct::get-dll-proc-address name (ct::dll-record-handle dll))) - (return (ct::dll-record-name dll))))) - -;;; This won't work at all... -#|| -(defmacro %foreign-funcall (name &rest args) - (let ((sym (gensym))) - `(let (,sym) - (ct::install-dll-function ,(find-dll-containing-function name) - ,name ,sym) - (funcall ,sym ,@(loop for (type arg) on args by #'cddr - if arg collect arg))))) -||# - -;;; It *might* be possible to implement by copying most of the code -;;; from Corman's DEFUN-DLL. Alternatively, it could implemented the -;;; same way as Lispworks' foreign-funcall. In practice, nobody uses -;;; Corman with CFFI, apparently. :) -(defmacro %foreign-funcall (name &rest args) - "Call a foreign function NAME passing arguments ARGS." - `(format t "~&;; Calling ~A with args ~S.~%" ,name ',args)) - -(defun defcfun-helper-forms (name lisp-name rettype args types) - "Return 2 values for DEFCFUN. A prelude form and a caller form." - (let ((ff-name (intern (format nil "%cffi-foreign-function/~A" lisp-name))) - ;; XXX This will only work if the dll is already loaded, fix this. - (dll (find-dll-containing-function name))) - (values - `(defun-dll ,ff-name - ,(mapcar (lambda (type) - (list (gensym) (convert-foreign-type type))) - types) - :return-type ,(convert-foreign-type rettype) - :library-name ,dll - :entry-name ,name - ;; we want also :pascal linkage type to access - ;; the win32 api for instance.. - :linkage-type :c) - `(,ff-name ,@args)))) - -;;;# Callbacks - -;;; defun-c-callback vs. defun-direct-c-callback? -;;; same issue as Allegro, no return type declaration, should we coerce? -(defmacro %defcallback (name rettype arg-names arg-types body-form) - (declare (ignore rettype)) - (with-unique-names (cb-sym) - `(progn - (defun-c-callback ,cb-sym - ,(mapcar (lambda (sym type) (list sym (convert-foreign-type type))) - arg-names arg-types) - ,body-form) - (setf (get ',name 'callback-ptr) - (get-callback-procinst ',cb-sym))))) - -;;; Just continue to use the plist for now even though this really -;;; should use a *CALLBACKS* hash table and not define the callbacks -;;; as gensyms. Someone with access to Corman should update this. -(defun %callback (name) - (get name 'callback-ptr)) - -;;;# Loading Foreign Libraries - -(defun %load-foreign-library (name) - "Load the foreign library NAME." - (ct::get-dll-record name)) - -(defun %close-foreign-library (name) - "Close the foreign library NAME." - (error "Not implemented.")) - -(defun native-namestring (pathname) - (namestring pathname)) ; TODO: confirm - -;;;# Foreign Globals - -;;; FFI to GetProcAddress from the Win32 API. -;;; "The GetProcAddress function retrieves the address of an exported -;;; function or variable from the specified dynamic-link library (DLL)." -(defun-dll get-proc-address - ((module HMODULE) - (name LPCSTR)) - :return-type FARPROC - :library-name "Kernel32.dll" - :entry-name "GetProcAddress" - :linkage-type :pascal) - -(defun foreign-symbol-pointer (name) - "Returns a pointer to a foreign symbol NAME." - (let ((str (lisp-string-to-c-string name))) - (unwind-protect - (dolist (dll ct::*dlls-loaded*) - (let ((ptr (get-proc-address - (int-to-foreign-ptr (ct::dll-record-handle dll)) - str))) - (when (not (cpointer-null ptr)) - (return ptr)))) - (free str)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-ecl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-ecl.lisp deleted file mode 100644 index 0b595ef..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-ecl.lisp +++ /dev/null @@ -1,454 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-ecl.lisp --- ECL backend for CFFI. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -;;;# Administrivia - -(defpackage #:cffi-sys - (:use #:common-lisp #:alexandria) - (:import-from #:si #:null-pointer-p) - (:export - #:*cffi-ecl-method* - #:canonicalize-symbol-name-case - #:foreign-pointer - #:pointerp - #:pointer-eq - #:%foreign-alloc - #:foreign-free - #:with-foreign-pointer - #:null-pointer - #:null-pointer-p - #:inc-pointer - #:make-pointer - #:pointer-address - #:%mem-ref - #:%mem-set - #:%foreign-funcall - #:%foreign-funcall-pointer - #:%foreign-funcall-varargs - #:%foreign-funcall-pointer-varargs - #:%foreign-type-alignment - #:%foreign-type-size - #:%load-foreign-library - #:%close-foreign-library - #:native-namestring - #:make-shareable-byte-vector - #:with-pointer-to-vector-data - #:%defcallback - #:%callback - #:%foreign-symbol-pointer)) - -(in-package #:cffi-sys) - -;;; -;;; ECL allows many ways of calling a foreign function, and also many -;;; ways of finding the pointer associated to a function name. They -;;; depend on whether the FFI relies on libffi or on the C/C++ compiler, -;;; and whether they use the shared library loader to locate symbols -;;; or they are linked by the linker. -;;; -;;; :DFFI -;;; -;;; ECL uses libffi to call foreign functions. The only way to find out -;;; foreign symbols is by loading shared libraries and using dlopen() -;;; or similar. -;;; -;;; :DLOPEN -;;; -;;; ECL compiles FFI code as C/C++ statements. The names are resolved -;;; at run time by the shared library loader every time the function -;;; is called -;;; -;;; :C/C++ -;;; -;;; ECL compiles FFI code as C/C++ statements, but the name resolution -;;; happens at link time. In this case you have to tell the ECL -;;; compiler which are the right ld-flags (c:*ld-flags*) to link in -;;; the library. -;;; -(defvar *cffi-ecl-method* - #+dffi :dffi - #+(and dlopen (not dffi)) :dlopen - #-(or dffi dlopen) :c/c++ - "The type of code that CFFI generates for ECL: :DFFI when using the -dynamical foreign function interface; :DLOPEN when using C code and -dynamical references to symbols; :C/C++ for C/C++ code with static -references to symbols.") - -;;;# Mis-features - -#-long-long -(pushnew 'no-long-long *features*) -(pushnew 'flat-namespace *features*) - -;;;# Symbol Case - -(defun canonicalize-symbol-name-case (name) - (declare (string name)) - (string-upcase name)) - -;;;# Allocation - -(defun %foreign-alloc (size) - "Allocate SIZE bytes of foreign-addressable memory." - (si:allocate-foreign-data :void size)) - -(defun foreign-free (ptr) - "Free a pointer PTR allocated by FOREIGN-ALLOC." - (si:free-foreign-data ptr)) - -(defmacro with-foreign-pointer ((var size &optional size-var) &body body) - "Bind VAR to SIZE bytes of foreign memory during BODY. The -pointer in VAR is invalid beyond the dynamic extent of BODY, and -may be stack-allocated if supported by the implementation. If -SIZE-VAR is supplied, it will be bound to SIZE during BODY." - (unless size-var - (setf size-var (gensym "SIZE"))) - `(let* ((,size-var ,size) - (,var (%foreign-alloc ,size-var))) - (unwind-protect - (progn ,@body) - (foreign-free ,var)))) - -;;;# Misc. Pointer Operations - -(deftype foreign-pointer () - 'si:foreign-data) - -(defun null-pointer () - "Construct and return a null pointer." - (si:allocate-foreign-data :void 0)) - -(defun inc-pointer (ptr offset) - "Return a pointer OFFSET bytes past PTR." - (ffi:make-pointer (+ (ffi:pointer-address ptr) offset) :void)) - -(defun pointerp (ptr) - "Return true if PTR is a foreign pointer." - (typep ptr 'si:foreign-data)) - -(defun pointer-eq (ptr1 ptr2) - "Return true if PTR1 and PTR2 point to the same address." - (= (ffi:pointer-address ptr1) (ffi:pointer-address ptr2))) - -(defun make-pointer (address) - "Return a pointer pointing to ADDRESS." - (ffi:make-pointer address :void)) - -(defun pointer-address (ptr) - "Return the address pointed to by PTR." - (ffi:pointer-address ptr)) - -;;;# Shareable Vectors -;;; -;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA -;;; should be defined to perform a copy-in/copy-out if the Lisp -;;; implementation can't do this. - -(defun make-shareable-byte-vector (size) - "Create a Lisp vector of SIZE bytes that can passed to -WITH-POINTER-TO-VECTOR-DATA." - (make-array size :element-type '(unsigned-byte 8))) - -(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) - "Bind PTR-VAR to a foreign pointer to the data in VECTOR." - `(let ((,ptr-var (si:make-foreign-data-from-array ,vector))) - ,@body)) - -;;;# Type Operations - -(defconstant +translation-table+ - '((:char :byte "char") - (:unsigned-char :unsigned-byte "unsigned char") - (:short :short "short") - (:unsigned-short :unsigned-short "unsigned short") - (:int :int "int") - (:unsigned-int :unsigned-int "unsigned int") - (:long :long "long") - (:unsigned-long :unsigned-long "unsigned long") - #+long-long - (:long-long :long-long "long long") - #+long-long - (:unsigned-long-long :unsigned-long-long "unsigned long long") - (:float :float "float") - (:double :double "double") - (:pointer :pointer-void "void*") - (:void :void "void"))) - -(defun cffi-type->ecl-type (type-keyword) - "Convert a CFFI type keyword to an ECL type keyword." - (or (second (find type-keyword +translation-table+ :key #'first)) - (error "~S is not a valid CFFI type" type-keyword))) - -(defun ecl-type->c-type (type-keyword) - "Convert a CFFI type keyword to an valid C type keyword." - (or (third (find type-keyword +translation-table+ :key #'second)) - (error "~S is not a valid CFFI type" type-keyword))) - -(defun %foreign-type-size (type-keyword) - "Return the size in bytes of a foreign type." - (nth-value 0 (ffi:size-of-foreign-type - (cffi-type->ecl-type type-keyword)))) - -(defun %foreign-type-alignment (type-keyword) - "Return the alignment in bytes of a foreign type." - (nth-value 1 (ffi:size-of-foreign-type - (cffi-type->ecl-type type-keyword)))) - -;;;# Dereferencing - -(defun %mem-ref (ptr type &optional (offset 0)) - "Dereference an object of TYPE at OFFSET bytes from PTR." - (let* ((type (cffi-type->ecl-type type)) - (type-size (ffi:size-of-foreign-type type))) - (si:foreign-data-ref-elt - (si:foreign-data-recast ptr (+ offset type-size) :void) offset type))) - -(defun %mem-set (value ptr type &optional (offset 0)) - "Set an object of TYPE at OFFSET bytes from PTR." - (let* ((type (cffi-type->ecl-type type)) - (type-size (ffi:size-of-foreign-type type))) - (si:foreign-data-set-elt - (si:foreign-data-recast ptr (+ offset type-size) :void) - offset type value))) - -;;; Inline versions that use C expressions instead of function calls. - -(defparameter +mem-ref-strings+ - (loop for (cffi-type ecl-type c-string) in +translation-table+ - for string = (format nil "*((~A *)(((char*)#0)+#1))" c-string) - collect (list cffi-type ecl-type string))) - -(defparameter +mem-set-strings+ - (loop for (cffi-type ecl-type c-string) in +translation-table+ - for string = (format nil "*((~A *)(((char*)#0)+#1))=#2" c-string) - collect (list cffi-type ecl-type string))) - -(define-compiler-macro %mem-ref (&whole whole ptr type &optional (offset 0)) - (if (and (constantp type) (constantp offset)) - (let ((record (assoc (eval type) +mem-ref-strings+))) - `(ffi:c-inline (,ptr ,offset) - (:pointer-void :cl-index) ; argument types - ,(second record) ; return type - ,(third record) ; the precomputed expansion - :one-liner t)) - whole)) - -(define-compiler-macro %mem-set (&whole whole value ptr type &optional (offset 0)) - (if (and (constantp type) (constantp offset)) - (let ((record (assoc (eval type) +mem-set-strings+))) - `(ffi:c-inline (,ptr ,offset ,value) ; arguments with type translated - (:pointer-void :cl-index ,(second record)) - :void ; does not return anything - ,(third record) ; precomputed expansion - :one-liner t)) - whole)) - -;;;# Calling Foreign Functions - -(defconstant +ecl-inline-codes+ "#0,#1,#2,#3,#4,#5,#6,#7,#8,#9,#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") - -(defun c-inline-function-call (thing fixed-types types values return-type dynamic-call variadic) - (when dynamic-call - (when (stringp thing) - (setf thing `(%foreign-symbol-pointer ,thing nil))) - (push thing values) - (push :pointer-void types)) - (let* ((decl-args - (format nil "~{~A~^, ~}~A" - (mapcar #'ecl-type->c-type fixed-types) (if (null variadic) "" ", ..."))) - (call-args - (if dynamic-call - ;; #0 is already used in a cast (it is a function pointer) - (subseq +ecl-inline-codes+ 3 (max 3 (1- (* (length values) 3)))) - ;; #0 is not used, so we start from the beginning - (subseq +ecl-inline-codes+ 0 (max 0 (1- (* (length values) 3)))))) - (clines - (if dynamic-call - nil - (format nil "extern ~A ~A(~A);" - (ecl-type->c-type return-type) thing decl-args))) - (call-code - (if dynamic-call - (format nil "((~A (*)(~A))(#0))(~A)" - (ecl-type->c-type return-type) decl-args call-args) - (format nil "~A(~A)" thing call-args)))) - `(progn - (ffi:clines ,@(ensure-list clines)) - (ffi:c-inline ,values ,types ,return-type ,call-code :one-liner t :side-effects t)))) - -(defun dffi-function-pointer-call (pointer types values return-type) - (when (stringp pointer) - (setf pointer `(%foreign-symbol-pointer ,pointer nil))) - #-dffi - `(error "In interpreted code, attempted to call a foreign function~% ~A~%~ - but ECL was built without support for that." ,pointer) - #+dffi - `(si::call-cfun ,pointer ,return-type (list ,@types) (list ,@values))) - -(defun foreign-funcall-parse-args (args) - "Return three values, lists of arg types, values, and result type." - (let ((return-type :void)) - (loop for (type arg) on args by #'cddr - if arg collect (cffi-type->ecl-type type) into types - and collect arg into values - else do (setf return-type (cffi-type->ecl-type type)) - finally (return (values types values return-type))))) - -(defmacro %foreign-funcall (name args &key library convention) - "Call a foreign function." - (declare (ignore library convention)) - (multiple-value-bind (types values return-type) - (foreign-funcall-parse-args args) - `(ext:with-backend - :bytecodes - ,(dffi-function-pointer-call name types values return-type) - :c/c++ - ,(ecase *cffi-ecl-method* - (:dffi (dffi-function-pointer-call name types values return-type)) - (:dlopen (c-inline-function-call name types types values return-type t nil)) - (:c/c++ (c-inline-function-call name types types values return-type nil nil)))))) - -(defmacro %foreign-funcall-pointer (pointer args &key convention) - "Funcall a pointer to a foreign function." - (declare (ignore convention)) - (multiple-value-bind (types values return-type) - (foreign-funcall-parse-args args) - `(ext:with-backend - :bytecodes - ,(dffi-function-pointer-call pointer types values return-type) - :c/c++ - ,(if (eq *cffi-ecl-method* :dffi) - (dffi-function-pointer-call pointer types values return-type) - (c-inline-function-call pointer types types values return-type t nil))))) - -(defmacro %foreign-funcall-varargs (name args varargs &key library convention) - (declare (ignore library convention)) - (multiple-value-bind (fixed-types fixed-values) - (foreign-funcall-parse-args args) - (multiple-value-bind (varargs-types varargs-values return-type) - (foreign-funcall-parse-args varargs) - (let ((all-types (append fixed-types varargs-types)) - (values (append fixed-values varargs-values))) - `(ext:with-backend - :bytecodes - ,(dffi-function-pointer-call name all-types values return-type) - :c/c++ - ,(ecase *cffi-ecl-method* - (:dffi (dffi-function-pointer-call name all-types values return-type)) - (:dlopen (c-inline-function-call name fixed-types all-types values return-type t t)) - (:c/c++ (c-inline-function-call name fixed-types all-types values return-type nil t)))))))) - -(defmacro %foreign-funcall-pointer-varargs (pointer args varargs &key convention) - (declare (ignore convention)) - (multiple-value-bind (fixed-types fixed-values) - (foreign-funcall-parse-args args) - (multiple-value-bind (varargs-types varargs-values return-type) - (foreign-funcall-parse-args varargs) - (let ((all-types (append fixed-types varargs-types)) - (values (append fixed-values varargs-values))) - `(ext:with-backend - :bytecodes - ,(dffi-function-pointer-call pointer all-types values return-type) - :c/c++ - ,(if (eq *cffi-ecl-method* :dffi) - (dffi-function-pointer-call pointer all-types values return-type) - (c-inline-function-call pointer fixed-types all-types values return-type t t))))))) - -;;;# Foreign Libraries - -(defun %load-foreign-library (name path) - "Load a foreign library." - (declare (ignore name)) - #-dffi (error "LOAD-FOREIGN-LIBRARY requires ECL's DFFI support. Use ~ - FFI:LOAD-FOREIGN-LIBRARY with a constant argument instead.") - #+dffi - (handler-case (si:load-foreign-module path) - (file-error () - (error "file error while trying to load `~A'" path)))) - -(defun %close-foreign-library (handle) - "Close a foreign library." - (handler-case (si::unload-foreign-module handle) - (undefined-function () - (restart-case (error "Detected ECL prior to version 15.2.21. ~ - Function CFFI:CLOSE-FOREIGN-LIBRARY isn't implemented yet.") - (ignore () :report "Continue anyway (foreign library will remain opened)."))))) - -(defun native-namestring (pathname) - (namestring pathname)) - -;;;# Callbacks - -;;; Create a package to contain the symbols for callback functions. -;;; We want to redefine callbacks with the same symbol so the internal -;;; data structures are reused. -(defpackage #:cffi-callbacks - (:use)) - -(defvar *callbacks* (make-hash-table)) - -;;; Intern a symbol in the CFFI-CALLBACKS package used to name the -;;; internal callback for NAME. -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun intern-callback (name) - (intern (format nil "~A::~A" - (if-let (package (symbol-package name)) - (package-name package) - "#") - (symbol-name name)) - '#:cffi-callbacks))) - -(defmacro %defcallback (name rettype arg-names arg-types body - &key convention) - (declare (ignore convention)) - (let ((cb-name (intern-callback name)) - (cb-type #.(if (> ext:+ecl-version-number+ 160102) - :default :cdecl))) - `(progn - (ffi:defcallback (,cb-name ,cb-type) - ,(cffi-type->ecl-type rettype) - ,(mapcar #'list arg-names - (mapcar #'cffi-type->ecl-type arg-types)) - ,body) - (setf (gethash ',name *callbacks*) ',cb-name)))) - -(defun %callback (name) - (multiple-value-bind (symbol winp) - (gethash name *callbacks*) - (unless winp - (error "Undefined callback: ~S" name)) - (ffi:callback symbol))) - -;;;# Foreign Globals - -(defun %foreign-symbol-pointer (name library) - "Returns a pointer to a foreign symbol NAME." - (declare (ignore library)) - (handler-case - (si:find-foreign-symbol (coerce name 'base-string) - :default :pointer-void 0) - (error (c) nil))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-gcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-gcl.lisp deleted file mode 100644 index 4a6bd04..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-gcl.lisp +++ /dev/null @@ -1,313 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-gcl.lisp --- CFFI-SYS implementation for GNU Common Lisp. -;;; -;;; Copyright (C) 2005-2006, Luis Oliveira -;;; -;;; 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. -;;; - -;;; GCL specific notes: -;;; -;;; On ELF systems, a library can be loaded with the help of this: -;;; http://www.copyleft.de/lisp/gcl-elf-loader.html -;;; -;;; Another way is to link the library when creating a new image: -;;; (compiler::link nil "new_image" "" "-lfoo") -;;; -;;; As GCL's FFI is not dynamic, CFFI declarations will only work -;;; after compiled and loaded. - -;;; *** this port is broken *** -;;; gcl doesn't compile the rest of CFFI anyway.. - -;;;# Administrivia - -(defpackage #:cffi-sys - (:use #:common-lisp #:alexandria) - (:export - #:canonicalize-symbol-name-case - #:pointerp - #:%foreign-alloc - #:foreign-free - #:with-foreign-ptr - #:null-ptr - #:null-ptr-p - #:inc-ptr - #:%mem-ref - #:%mem-set - #:%foreign-funcall - #:%foreign-type-alignment - #:%foreign-type-size - #:%load-foreign-library - ;#:make-shareable-byte-vector - ;#:with-pointer-to-vector-data - #:foreign-var-ptr - #:make-callback)) - -(in-package #:cffi-sys) - -;;;# Mis-*features* -(eval-when (:compile-toplevel :load-toplevel :execute) - (pushnew :cffi/no-foreign-funcall *features*)) - -;;; Symbol case. - -(defun canonicalize-symbol-name-case (name) - (declare (string name)) - (string-upcase name)) - -;;;# Allocation -;;; -;;; Functions and macros for allocating foreign memory on the stack -;;; and on the heap. The main CFFI package defines macros that wrap -;;; FOREIGN-ALLOC and FOREIGN-FREE in UNWIND-PROTECT for the common -;;; usage when the memory has dynamic extent. - -(defentry %foreign-alloc (int) (int "malloc")) - -;(defun foreign-alloc (size) -; "Allocate SIZE bytes on the heap and return a pointer." -; (%foreign-alloc size)) - -(defentry foreign-free (int) (void "free")) - -;(defun foreign-free (ptr) -; "Free a PTR allocated by FOREIGN-ALLOC." -; (%free ptr)) - -(defmacro with-foreign-ptr ((var size &optional size-var) &body body) - "Bind VAR to SIZE bytes of foreign memory during BODY. The -pointer in VAR is invalid beyond the dynamic extent of BODY, and -may be stack-allocated if supported by the implementation. If -SIZE-VAR is supplied, it will be bound to SIZE during BODY." - (unless size-var - (setf size-var (gensym "SIZE"))) - `(let* ((,size-var ,size) - (,var (foreign-alloc ,size-var))) - (unwind-protect - (progn ,@body) - (foreign-free ,var)))) - -;;;# Misc. Pointer Operations - -(defun pointerp (ptr) - "Return true if PTR is a foreign pointer." - (integerp ptr)) - -(defun null-ptr () - "Construct and return a null pointer." - 0) - -(defun null-ptr-p (ptr) - "Return true if PTR is a null pointer." - (= ptr 0)) - -(defun inc-ptr (ptr offset) - "Return a pointer OFFSET bytes past PTR." - (+ ptr offset)) - -;;;# Shareable Vectors -;;; -;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA -;;; should be defined to perform a copy-in/copy-out if the Lisp -;;; implementation can't do this. - -;(defun make-shareable-byte-vector (size) -; "Create a Lisp vector of SIZE bytes that can passed to -;WITH-POINTER-TO-VECTOR-DATA." -; (make-array size :element-type '(unsigned-byte 8))) - -;(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) -; "Bind PTR-VAR to a foreign pointer to the data in VECTOR." -; `(ccl:with-pointer-to-ivector (,ptr-var ,vector) -; ,@body)) - -;;;# Dereferencing - -(defmacro define-mem-ref/set (type gcl-type &optional c-name) - (unless c-name - (setq c-name (substitute #\_ #\Space type))) - (let ((ref-fn (concatenate 'string "ref_" c-name)) - (set-fn (concatenate 'string "set_" c-name))) - `(progn - ;; ref - (defcfun ,(format nil "~A ~A(~A *ptr)" type ref-fn type) - 0 "return *ptr;") - (defentry ,(intern (string-upcase (substitute #\- #\_ ref-fn))) - (int) (,gcl-type ,ref-fn)) - ;; set - (defcfun ,(format nil "void ~A(~A *ptr, ~A value)" set-fn type type) - 0 "*ptr = value;") - (defentry ,(intern (string-upcase (substitute #\- #\_ set-fn))) - (int ,gcl-type) (void ,set-fn))))) - -(define-mem-ref/set "char" char) -(define-mem-ref/set "unsigned char" char) -(define-mem-ref/set "short" int) -(define-mem-ref/set "unsigned short" int) -(define-mem-ref/set "int" int) -(define-mem-ref/set "unsigned int" int) -(define-mem-ref/set "long" int) -(define-mem-ref/set "unsigned long" int) -(define-mem-ref/set "float" float) -(define-mem-ref/set "double" double) -(define-mem-ref/set "void *" int "ptr") - -(defun %mem-ref (ptr type &optional (offset 0)) - "Dereference an object of TYPE at OFFSET bytes from PTR." - (unless (zerop offset) - (incf ptr offset)) - (ecase type - (:char (ref-char ptr)) - (:unsigned-char (ref-unsigned-char ptr)) - (:short (ref-short ptr)) - (:unsigned-short (ref-unsigned-short ptr)) - (:int (ref-int ptr)) - (:unsigned-int (ref-unsigned-int ptr)) - (:long (ref-long ptr)) - (:unsigned-long (ref-unsigned-long ptr)) - (:float (ref-float ptr)) - (:double (ref-double ptr)) - (:pointer (ref-ptr ptr)))) - -(defun %mem-set (value ptr type &optional (offset 0)) - (unless (zerop offset) - (incf ptr offset)) - (ecase type - (:char (set-char ptr value)) - (:unsigned-char (set-unsigned-char ptr value)) - (:short (set-short ptr value)) - (:unsigned-short (set-unsigned-short ptr value)) - (:int (set-int ptr value)) - (:unsigned-int (set-unsigned-int ptr value)) - (:long (set-long ptr value)) - (:unsigned-long (set-unsigned-long ptr value)) - (:float (set-float ptr value)) - (:double (set-double ptr value)) - (:pointer (set-ptr ptr value))) - value) - -;;;# Calling Foreign Functions - -;; TODO: figure out if these type conversions make any sense... -(defun convert-foreign-type (type-keyword) - "Convert a CFFI type keyword to a GCL type." - (ecase type-keyword - (:char 'char) - (:unsigned-char 'char) - (:short 'int) - (:unsigned-short 'int) - (:int 'int) - (:unsigned-int 'int) - (:long 'int) - (:unsigned-long 'int) - (:float 'float) - (:double 'double) - (:pointer 'int) - (:void 'void))) - -(defparameter +cffi-types+ - '(:char :unsigned-char :short :unsigned-short :int :unsigned-int - :long :unsigned-long :float :double :pointer)) - -(defcfun "int size_of(int type)" 0 - "switch (type) { - case 0: return sizeof(char); - case 1: return sizeof(unsigned char); - case 2: return sizeof(short); - case 3: return sizeof(unsigned short); - case 4: return sizeof(int); - case 5: return sizeof(unsigned int); - case 6: return sizeof(long); - case 7: return sizeof(unsigned long); - case 8: return sizeof(float); - case 9: return sizeof(double); - case 10: return sizeof(void *); - default: return -1; - }") - -(defentry size-of (int) (int "size_of")) - -;; TODO: all this is doable inside the defcfun; figure that out.. -(defun %foreign-type-size (type-keyword) - "Return the size in bytes of a foreign type." - (size-of (position type-keyword +cffi-types+))) - -(defcfun "int align_of(int type)" 0 - "switch (type) { - case 0: return __alignof__(char); - case 1: return __alignof__(unsigned char); - case 2: return __alignof__(short); - case 3: return __alignof__(unsigned short); - case 4: return __alignof__(int); - case 5: return __alignof__(unsigned int); - case 6: return __alignof__(long); - case 7: return __alignof__(unsigned long); - case 8: return __alignof__(float); - case 9: return __alignof__(double); - case 10: return __alignof__(void *); - default: return -1; - }") - -(defentry align-of (int) (int "align_of")) - -;; TODO: like %foreign-type-size -(defun %foreign-type-alignment (type-keyword) - "Return the alignment in bytes of a foreign type." - (align-of (position type-keyword +cffi-types+))) - -#+ignore -(defun convert-external-name (name) - "Add an underscore to NAME if necessary for the ABI." - #+darwinppc-target (concatenate 'string "_" name) - #-darwinppc-target name) - -(defmacro %foreign-funcall (function-name &rest args) - "Perform a foreign function all, document it more later." - `(format t "~&;; Calling ~A with args ~S.~%" ,name ',args)) - -(defun defcfun-helper-forms (name rettype args types) - "Return 2 values for DEFCFUN. A prelude form and a caller form." - (let ((ff-name (intern (format nil "%foreign-function/TildeA:~A" name)))) - (values - `(defentry ,ff-name ,(mapcar #'convert-foreign-type types) - (,(convert-foreign-type rettype) ,name)) - `(,ff-name ,@args)))) - -;;;# Callbacks - -;;; XXX unimplemented -(defmacro make-callback (name rettype arg-names arg-types body-form) - 0) - -;;;# Loading Foreign Libraries - -(defun %load-foreign-library (name) - "_Won't_ load the foreign library NAME." - (declare (ignore name))) - -;;;# Foreign Globals - -;;; XXX unimplemented -(defmacro foreign-var-ptr (name) - "Return a pointer pointing to the foreign symbol NAME." - 0) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-lispworks.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-lispworks.lisp deleted file mode 100644 index d0932b8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-lispworks.lisp +++ /dev/null @@ -1,417 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-lispworks.lisp --- Lispworks CFFI-SYS implementation. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -;;;# Administrivia - -(defpackage #:cffi-sys - (:use #:cl #:alexandria) - (:export - #:canonicalize-symbol-name-case - #:foreign-pointer - #:pointerp - #:pointer-eq - #:null-pointer - #:null-pointer-p - #:inc-pointer - #:make-pointer - #:pointer-address - #:%foreign-alloc - #:foreign-free - #:with-foreign-pointer - #:%foreign-funcall - #:%foreign-funcall-pointer - #:%foreign-type-alignment - #:%foreign-type-size - #:%load-foreign-library - #:%close-foreign-library - #:native-namestring - #:%mem-ref - #:%mem-set - #:make-shareable-byte-vector - #:with-pointer-to-vector-data - #:%foreign-symbol-pointer - #:defcfun-helper-forms - #:%defcallback - #:%callback)) - -(in-package #:cffi-sys) - -;;;# Misfeatures - -#-lispworks-64bit (pushnew 'no-long-long *features*) - -;;;# Symbol Case - -(defun canonicalize-symbol-name-case (name) - (declare (string name)) - (string-upcase name)) - -;;;# Basic Pointer Operations - -(deftype foreign-pointer () - 'fli::pointer) - -(defun pointerp (ptr) - "Return true if PTR is a foreign pointer." - (fli:pointerp ptr)) - -(defun pointer-eq (ptr1 ptr2) - "Return true if PTR1 and PTR2 point to the same address." - (fli:pointer-eq ptr1 ptr2)) - -;; We use FLI:MAKE-POINTER here instead of FLI:*NULL-POINTER* since old -;; versions of Lispworks don't seem to have it. -(defun null-pointer () - "Return a null foreign pointer." - (fli:make-pointer :address 0 :type :void)) - -(defun null-pointer-p (ptr) - "Return true if PTR is a null pointer." - (check-type ptr fli::pointer) - (fli:null-pointer-p ptr)) - -;; FLI:INCF-POINTER won't work on FLI pointers to :void so we -;; increment "manually." -(defun inc-pointer (ptr offset) - "Return a pointer OFFSET bytes past PTR." - (fli:make-pointer :type :void :address (+ (fli:pointer-address ptr) offset))) - -(defun make-pointer (address) - "Return a pointer pointing to ADDRESS." - (fli:make-pointer :type :void :address address)) - -(defun pointer-address (ptr) - "Return the address pointed to by PTR." - (fli:pointer-address ptr)) - -;;;# Allocation - -(defun %foreign-alloc (size) - "Allocate SIZE bytes of memory and return a pointer." - (fli:allocate-foreign-object :type :byte :nelems size)) - -(defun foreign-free (ptr) - "Free a pointer PTR allocated by FOREIGN-ALLOC." - (fli:free-foreign-object ptr)) - -(defmacro with-foreign-pointer ((var size &optional size-var) &body body) - "Bind VAR to SIZE bytes of foreign memory during BODY. Both the -pointer in VAR and the memory it points to have dynamic extent and may -be stack allocated if supported by the implementation." - (unless size-var - (setf size-var (gensym "SIZE"))) - `(fli:with-dynamic-foreign-objects () - (let* ((,size-var ,size) - (,var (fli:alloca :type :byte :nelems ,size-var))) - ,@body))) - -;;;# Shareable Vectors - -(defun make-shareable-byte-vector (size) - "Create a shareable byte vector." - #+(or lispworks3 lispworks4 lispworks5.0) - (sys:in-static-area - (make-array size :element-type '(unsigned-byte 8))) - #-(or lispworks3 lispworks4 lispworks5.0) - (make-array size :element-type '(unsigned-byte 8) :allocation :static)) - -(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) - "Bind PTR-VAR to a pointer at the data in VECTOR." - `(fli:with-dynamic-lisp-array-pointer (,ptr-var ,vector) - ,@body)) - -;;;# Dereferencing - -(defun convert-foreign-type (cffi-type) - "Convert a CFFI type keyword to an FLI type." - (ecase cffi-type - (:char :byte) - (:unsigned-char '(:unsigned :byte)) - (:short :short) - (:unsigned-short '(:unsigned :short)) - (:int :int) - (:unsigned-int '(:unsigned :int)) - (:long :long) - (:unsigned-long '(:unsigned :long)) - ;; On 32-bit platforms, Lispworks 5.0+ supports long-long for - ;; DEFCFUN and FOREIGN-FUNCALL. - (:long-long '(:long :long)) - (:unsigned-long-long '(:unsigned :long :long)) - (:float :float) - (:double :double) - (:pointer :pointer) - (:void :void))) - -;;; Convert a CFFI type keyword to a symbol suitable for passing to -;;; FLI:FOREIGN-TYPED-AREF. -#+#.(cl:if (cl:find-symbol "FOREIGN-TYPED-AREF" "FLI") '(and) '(or)) -(defun convert-foreign-typed-aref-type (cffi-type) - (ecase cffi-type - ((:char :short :int :long #+lispworks-64bit :long-long) - `(signed-byte ,(* 8 (%foreign-type-size cffi-type)))) - ((:unsigned-char :unsigned-short :unsigned-int :unsigned-long - #+lispworks-64bit :unsigned-long-long) - `(unsigned-byte ,(* 8 (%foreign-type-size cffi-type)))) - (:float 'single-float) - (:double 'double-float))) - -(defun %mem-ref (ptr type &optional (offset 0)) - "Dereference an object of type TYPE OFFSET bytes from PTR." - (unless (zerop offset) - (setf ptr (inc-pointer ptr offset))) - (fli:dereference ptr :type (convert-foreign-type type))) - -;; Lispworks 5.0 on 64-bit platforms doesn't have [u]int64 support in -;; FOREIGN-TYPED-AREF. That was implemented in 5.1. -#+(and lispworks-64bit lispworks5.0) -(defun 64-bit-type-p (type) - (member type '(:long :unsigned-long :long-long :unsigned-long-long))) - -;;; In LispWorks versions where FLI:FOREIGN-TYPED-AREF is fbound, use -;;; it instead of FLI:DEREFERENCE in the optimizer for %MEM-REF. -#+#.(cl:if (cl:find-symbol "FOREIGN-TYPED-AREF" "FLI") '(and) '(or)) -(define-compiler-macro %mem-ref (&whole form ptr type &optional (off 0)) - (if (constantp type) - (let ((type (eval type))) - (if (or #+(and lispworks-64bit lispworks5.0) (64-bit-type-p type) - (eql type :pointer)) - (let ((fli-type (convert-foreign-type type)) - (ptr-form (if (eql off 0) ptr `(inc-pointer ,ptr ,off)))) - `(fli:dereference ,ptr-form :type ',fli-type)) - (let ((lisp-type (convert-foreign-typed-aref-type type))) - `(locally - (declare (optimize (speed 3) (safety 0))) - (fli:foreign-typed-aref ',lisp-type ,ptr (the fixnum ,off)))))) - form)) - -;;; Open-code the call to FLI:DEREFERENCE when TYPE is constant at -;;; macroexpansion time, when FLI:FOREIGN-TYPED-AREF is not available. -#-#.(cl:if (cl:find-symbol "FOREIGN-TYPED-AREF" "FLI") '(and) '(or)) -(define-compiler-macro %mem-ref (&whole form ptr type &optional (off 0)) - (if (constantp type) - (let ((ptr-form (if (eql off 0) ptr `(inc-pointer ,ptr ,off))) - (type (convert-foreign-type (eval type)))) - `(fli:dereference ,ptr-form :type ',type)) - form)) - -(defun %mem-set (value ptr type &optional (offset 0)) - "Set the object of TYPE at OFFSET bytes from PTR." - (unless (zerop offset) - (setf ptr (inc-pointer ptr offset))) - (setf (fli:dereference ptr :type (convert-foreign-type type)) value)) - -;;; In LispWorks versions where FLI:FOREIGN-TYPED-AREF is fbound, use -;;; it instead of FLI:DEREFERENCE in the optimizer for %MEM-SET. -#+#.(cl:if (cl:find-symbol "FOREIGN-TYPED-AREF" "FLI") '(and) '(or)) -(define-compiler-macro %mem-set (&whole form val ptr type &optional (off 0)) - (if (constantp type) - (once-only (val) - (let ((type (eval type))) - (if (or #+(and lispworks-64bit lispworks5.0) (64-bit-type-p type) - (eql type :pointer)) - (let ((fli-type (convert-foreign-type type)) - (ptr-form (if (eql off 0) ptr `(inc-pointer ,ptr ,off)))) - `(setf (fli:dereference ,ptr-form :type ',fli-type) ,val)) - (let ((lisp-type (convert-foreign-typed-aref-type type))) - `(locally - (declare (optimize (speed 3) (safety 0))) - (setf (fli:foreign-typed-aref ',lisp-type ,ptr - (the fixnum ,off)) - ,val)))))) - form)) - -;;; Open-code the call to (SETF FLI:DEREFERENCE) when TYPE is constant -;;; at macroexpansion time. -#-#.(cl:if (cl:find-symbol "FOREIGN-TYPED-AREF" "FLI") '(and) '(or)) -(define-compiler-macro %mem-set (&whole form val ptr type &optional (off 0)) - (if (constantp type) - (once-only (val) - (let ((ptr-form (if (eql off 0) ptr `(inc-pointer ,ptr ,off))) - (type (convert-foreign-type (eval type)))) - `(setf (fli:dereference ,ptr-form :type ',type) ,val))) - form)) - -;;;# Foreign Type Operations - -(defun %foreign-type-size (type) - "Return the size in bytes of a foreign type." - (fli:size-of (convert-foreign-type type))) - -(defun %foreign-type-alignment (type) - "Return the structure alignment in bytes of foreign type." - #+(and darwin harp::powerpc) - (when (eq type :double) - (return-from %foreign-type-alignment 8)) - ;; Override not necessary for the remaining types... - (fli:align-of (convert-foreign-type type))) - -;;;# Calling Foreign Functions - -(defvar *foreign-funcallable-cache* (make-hash-table :test 'equal) - "Caches foreign funcallables created by %FOREIGN-FUNCALL or -%FOREIGN-FUNCALL-POINTER. We only need to have one per each -signature.") - -(defun foreign-funcall-type-and-args (args) - "Returns a list of types, list of args and return type." - (let ((return-type :void)) - (loop for (type arg) on args by #'cddr - if arg collect (convert-foreign-type type) into types - and collect arg into fargs - else do (setf return-type (convert-foreign-type type)) - finally (return (values types fargs return-type))))) - -(defun create-foreign-funcallable (types rettype convention) - "Creates a foreign funcallable for the signature TYPES -> RETTYPE." - #+mac (declare (ignore convention)) - (format t "~&Creating foreign funcallable for signature ~S -> ~S~%" - types rettype) - ;; yes, ugly, this most likely wants to be a top-level form... - (let ((internal-name (gensym))) - (funcall - (compile nil - `(lambda () - (fli:define-foreign-funcallable ,internal-name - ,(loop for type in types - collect (list (gensym) type)) - :result-type ,rettype - :language :ansi-c - ;; avoid warning about cdecl not being supported on mac - #-mac ,@(list :calling-convention convention))))) - internal-name)) - -(defun get-foreign-funcallable (types rettype convention) - "Returns a foreign funcallable for the signature TYPES -> RETTYPE - -either from the cache or newly created." - (let ((signature (cons rettype types))) - (or (gethash signature *foreign-funcallable-cache*) - ;; (SETF GETHASH) is supposed to be thread-safe - (setf (gethash signature *foreign-funcallable-cache*) - (create-foreign-funcallable types rettype convention))))) - -(defmacro %%foreign-funcall (foreign-function args convention) - "Does the actual work for %FOREIGN-FUNCALL-POINTER and %FOREIGN-FUNCALL. -Checks if a foreign funcallable which fits ARGS already exists and creates -and caches it if necessary. Finally calls it." - (multiple-value-bind (types fargs rettype) - (foreign-funcall-type-and-args args) - `(funcall (load-time-value - (get-foreign-funcallable ',types ',rettype ',convention)) - ,foreign-function ,@fargs))) - -(defmacro %foreign-funcall (name args &key library convention) - "Calls a foreign function named NAME passing arguments ARGS." - `(%%foreign-funcall - (fli:make-pointer :symbol-name ,name - :module ',(if (eq library :default) nil library)) - ,args ,convention)) - -(defmacro %foreign-funcall-pointer (ptr args &key convention) - "Calls a foreign function pointed at by PTR passing arguments ARGS." - `(%%foreign-funcall ,ptr ,args ,convention)) - -(defun defcfun-helper-forms (name lisp-name rettype args types options) - "Return 2 values for DEFCFUN. A prelude form and a caller form." - (let ((ff-name (intern (format nil "%cffi-foreign-function/~A" lisp-name)))) - (values - `(fli:define-foreign-function (,ff-name ,name :source) - ,(mapcar (lambda (ty) (list (gensym) (convert-foreign-type ty))) - types) - :result-type ,(convert-foreign-type rettype) - :language :ansi-c - :module ',(let ((lib (getf options :library))) - (if (eq lib :default) nil lib)) - ;; avoid warning about cdecl not being supported on mac platforms - #-mac ,@(list :calling-convention (getf options :convention))) - `(,ff-name ,@args)))) - -;;;# Callbacks - -(defvar *callbacks* (make-hash-table)) - -;;; Create a package to contain the symbols for callback functions. We -;;; want to redefine callbacks with the same symbol so the internal data -;;; structures are reused. -(defpackage #:cffi-callbacks - (:use)) - -;;; Intern a symbol in the CFFI-CALLBACKS package used to name the internal -;;; callback for NAME. -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun intern-callback (name) - (intern (format nil "~A::~A" - (if-let (package (symbol-package name)) - (package-name package) - "#") - (symbol-name name)) - '#:cffi-callbacks))) - -(defmacro %defcallback (name rettype arg-names arg-types body - &key convention) - (let ((cb-name (intern-callback name))) - `(progn - (fli:define-foreign-callable - (,cb-name :encode :lisp - :result-type ,(convert-foreign-type rettype) - :calling-convention ,convention - :language :ansi-c - :no-check nil) - ,(mapcar (lambda (sym type) - (list sym (convert-foreign-type type))) - arg-names arg-types) - ,body) - (setf (gethash ',name *callbacks*) ',cb-name)))) - -(defun %callback (name) - (multiple-value-bind (symbol winp) - (gethash name *callbacks*) - (unless winp - (error "Undefined callback: ~S" name)) - (fli:make-pointer :symbol-name symbol :module :callbacks))) - -;;;# Loading Foreign Libraries - -(defun %load-foreign-library (name path) - "Load the foreign library NAME." - (fli:register-module (or name path) :connection-style :immediate - :real-name path)) - -(defun %close-foreign-library (name) - "Close the foreign library NAME." - (fli:disconnect-module name :remove t)) - -(defun native-namestring (pathname) - (namestring pathname)) - -;;;# Foreign Globals - -(defun %foreign-symbol-pointer (name library) - "Returns a pointer to a foreign symbol NAME." - (values - (ignore-errors - (fli:make-pointer :symbol-name name :type :void - :module (if (eq library :default) nil library))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-mcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-mcl.lisp deleted file mode 100644 index cf61eb3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-mcl.lisp +++ /dev/null @@ -1,396 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-mcl.lisp --- CFFI-SYS implementation for Digitool MCL. -;;; -;;; Copyright 2010 james.anderson@setf.de -;;; Copyright 2005-2006, James Bielman -;;; -;;; 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. -;;; - -;;; this is a stop-gap emulation. (at least) three things are not right -;;; - integer vector arguments are copied -;;; - return values are not typed -;;; - a shared library must be packaged as a framework and statically loaded -;;; -;;; on the topic of shared libraries, see -;;; http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/MachOTopics/1-Articles/loading_code.html -;;; which describes how to package a shared library as a framework. -;;; once a framework exists, load it as, eg. -;;; (ccl::add-framework-bundle "fftw.framework" :pathname "ccl:frameworks;" ) - -;;;# Administrivia - -(defpackage #:cffi-sys - (:use #:common-lisp #:ccl) - (:import-from #:alexandria #:once-only #:if-let) - (:export - #:canonicalize-symbol-name-case - #:foreign-pointer - #:pointerp ; ccl:pointerp - #:pointer-eq - #:%foreign-alloc - #:foreign-free - #:with-foreign-pointer - #:null-pointer - #:null-pointer-p - #:inc-pointer - #:make-pointer - #:pointer-address - #:%mem-ref - #:%mem-set - #:%foreign-funcall - #:%foreign-funcall-pointer - #:%foreign-type-alignment - #:%foreign-type-size - #:%load-foreign-library - #:%close-foreign-library - #:native-namestring - #:make-shareable-byte-vector - #:with-pointer-to-vector-data - #:%foreign-symbol-pointer - #:%defcallback - #:%callback)) - -(in-package #:cffi-sys) - -;;;# Misfeatures - -(pushnew 'flat-namespace *features*) - -;;;# Symbol Case - -(defun canonicalize-symbol-name-case (name) - (declare (string name)) - (string-upcase name)) - -;;;# Allocation -;;; -;;; Functions and macros for allocating foreign memory on the stack -;;; and on the heap. The main CFFI package defines macros that wrap -;;; FOREIGN-ALLOC and FOREIGN-FREE in UNWIND-PROTECT for the common -;;; usage when the memory has dynamic extent. - -(defun %foreign-alloc (size) - "Allocate SIZE bytes on the heap and return a pointer." - (#_newPtr size)) - -(defun foreign-free (ptr) - "Free a PTR allocated by FOREIGN-ALLOC." - ;; TODO: Should we make this a dead macptr? - (#_disposePtr ptr)) - -(defmacro with-foreign-pointer ((var size &optional size-var) &body body) - "Bind VAR to SIZE bytes of foreign memory during BODY. The -pointer in VAR is invalid beyond the dynamic extent of BODY, and -may be stack-allocated if supported by the implementation. If -SIZE-VAR is supplied, it will be bound to SIZE during BODY." - (unless size-var - (setf size-var (gensym "SIZE"))) - `(let ((,size-var ,size)) - (ccl:%stack-block ((,var ,size-var)) - ,@body))) - -;;;# Misc. Pointer Operations - -(deftype foreign-pointer () - 'ccl:macptr) - -(defun null-pointer () - "Construct and return a null pointer." - (ccl:%null-ptr)) - -(defun null-pointer-p (ptr) - "Return true if PTR is a null pointer." - (ccl:%null-ptr-p ptr)) - -(defun inc-pointer (ptr offset) - "Return a pointer OFFSET bytes past PTR." - (ccl:%inc-ptr ptr offset)) - -(defun pointer-eq (ptr1 ptr2) - "Return true if PTR1 and PTR2 point to the same address." - (ccl:%ptr-eql ptr1 ptr2)) - -(defun make-pointer (address) - "Return a pointer pointing to ADDRESS." - (ccl:%int-to-ptr address)) - -(defun pointer-address (ptr) - "Return the address pointed to by PTR." - (ccl:%ptr-to-int ptr)) - -;;;# Shareable Vectors -;;; -;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA -;;; should be defined to perform a copy-in/copy-out if the Lisp -;;; implementation can't do this. - -(defun make-shareable-byte-vector (size) - "Create a Lisp vector of SIZE bytes that can passed to -WITH-POINTER-TO-VECTOR-DATA." - (make-array size :element-type '(unsigned-byte 8))) - -;;; from openmcl::macros.lisp - -(defmacro with-pointer-to-vector-data ((ptr ivector) &body body) - "Bind PTR-VAR to a foreign pointer to the data in VECTOR." - (let* ((v (gensym)) - (l (gensym))) - `(let* ((,v ,ivector) - (,l (length ,v))) - (unless (typep ,v 'ccl::ivector) (ccl::report-bad-arg ,v 'ccl::ivector)) - ;;;!!! this, unless it's possible to suppress gc - (let ((,ptr (#_newPtr ,l))) - (unwind-protect (progn (ccl::%copy-ivector-to-ptr ,v 0 ,ptr 0 ,l) - (mutliple-value-prog1 - (locally ,@body) - (ccl::%copy-ptr-to-ivector ,ptr 0 ,v 0 ,l))) - (#_disposePtr ,ptr)))))) - -;;;# Dereferencing - -;;; Define the %MEM-REF and %MEM-SET functions, as well as compiler -;;; macros that optimize the case where the type keyword is constant -;;; at compile-time. -(defmacro define-mem-accessors (&body pairs) - `(progn - (defun %mem-ref (ptr type &optional (offset 0)) - (ecase type - ,@(loop for (keyword fn) in pairs - collect `(,keyword (,fn ptr offset))))) - (defun %mem-set (value ptr type &optional (offset 0)) - (ecase type - ,@(loop for (keyword fn) in pairs - collect `(,keyword (setf (,fn ptr offset) value))))) - (define-compiler-macro %mem-ref - (&whole form ptr type &optional (offset 0)) - (if (constantp type) - (ecase (eval type) - ,@(loop for (keyword fn) in pairs - collect `(,keyword `(,',fn ,ptr ,offset)))) - form)) - (define-compiler-macro %mem-set - (&whole form value ptr type &optional (offset 0)) - (if (constantp type) - (once-only (value) - (ecase (eval type) - ,@(loop for (keyword fn) in pairs - collect `(,keyword `(setf (,',fn ,ptr ,offset) - ,value))))) - form)))) - -(define-mem-accessors - (:char %get-signed-byte) - (:unsigned-char %get-unsigned-byte) - (:short %get-signed-word) - (:unsigned-short %get-unsigned-word) - (:int %get-signed-long) - (:unsigned-int %get-unsigned-long) - (:long %get-signed-long) - (:unsigned-long %get-unsigned-long) - (:long-long ccl::%get-signed-long-long) - (:unsigned-long-long ccl::%get-unsigned-long-long) - (:float %get-single-float) - (:double %get-double-float) - (:pointer %get-ptr)) - - -(defun ccl::%get-unsigned-long-long (ptr offset) - (let ((value 0) (bit 0)) - (dotimes (i 8) - (setf (ldb (byte 8 (shiftf bit (+ bit 8))) value) - (ccl:%get-unsigned-byte ptr (+ offset i)))) - value)) - -(setf (fdefinition 'ccl::%get-signed-long-long) - (fdefinition 'ccl::%get-unsigned-long-long)) - -(defun (setf ccl::%get-unsigned-long-long) (value ptr offset) - (let ((bit 0)) - (dotimes (i 8) - (setf (ccl:%get-unsigned-byte ptr (+ offset i)) - (ldb (byte 8 (shiftf bit (+ bit 8))) value)))) - ptr) - -(setf (fdefinition '(setf ccl::%get-signed-long-long)) - (fdefinition '(setf ccl::%get-unsigned-long-long))) - - -;;;# Calling Foreign Functions - -(defun convert-foreign-type (type-keyword) - "Convert a CFFI type keyword to a ppc-ff-call type." - (ecase type-keyword - (:char :signed-byte) - (:unsigned-char :unsigned-byte) - (:short :signed-short) - (:unsigned-short :unsigned-short) - (:int :signed-fullword) - (:unsigned-int :unsigned-fullword) - (:long :signed-fullword) - (:unsigned-long :unsigned-fullword) - (:long-long :signed-doubleword) - (:unsigned-long-long :unsigned-doubleword) - (:float :single-float) - (:double :double-float) - (:pointer :address) - (:void :void))) - -(defun ppc-ff-call-type=>mactype-name (type-keyword) - (ecase type-keyword - (:signed-byte :sint8) - (:unsigned-byte :uint8) - (:signed-short :sint16) - (:unsigned-short :uint16) - (:signed-halfword :sint16) - (:unsigned-halfword :uint16) - (:signed-fullword :sint32) - (:unsigned-fullword :uint32) - ;(:signed-doubleword :long-long) - ;(:unsigned-doubleword :unsigned-long-long) - (:single-float :single-float) - (:double-float :double-float) - (:address :pointer) - (:void :void))) - - - -(defun %foreign-type-size (type-keyword) - "Return the size in bytes of a foreign type." - (case type-keyword - ((:long-long :unsigned-long-long) 8) - (t (ccl::mactype-record-size - (ccl::find-mactype - (ppc-ff-call-type=>mactype-name (convert-foreign-type type-keyword))))))) - -;; There be dragons here. See the following thread for details: -;; http://clozure.com/pipermail/openmcl-devel/2005-June/002777.html -(defun %foreign-type-alignment (type-keyword) - "Return the alignment in bytes of a foreign type." - (case type-keyword - ((:long-long :unsigned-long-long) 4) - (t (ccl::mactype-record-size - (ccl::find-mactype - (ppc-ff-call-type=>mactype-name (convert-foreign-type type-keyword))))))) - -(defun convert-foreign-funcall-types (args) - "Convert foreign types for a call to FOREIGN-FUNCALL." - (loop for (type arg) on args by #'cddr - collect (convert-foreign-type type) - if arg collect arg)) - -(defun convert-external-name (name) - "no '_' is necessary here, the internal lookup operators handle it" - name) - -(defmacro %foreign-funcall (function-name args &key library convention) - "Perform a foreign function call, document it more later." - (declare (ignore library convention)) - `(ccl::ppc-ff-call - (ccl::macho-address ,(ccl::get-macho-entry-point (convert-external-name function-name))) - ,@(convert-foreign-funcall-types args))) - -(defmacro %foreign-funcall-pointer (ptr args &key convention) - (declare (ignore convention)) - `(ccl::ppc-ff-call ,ptr ,@(convert-foreign-funcall-types args))) - -;;;# Callbacks - -;;; The *CALLBACKS* hash table maps CFFI callback names to OpenMCL "macptr" -;;; entry points. It is safe to store the pointers directly because -;;; OpenMCL will update the address of these pointers when a saved image -;;; is loaded (see CCL::RESTORE-PASCAL-FUNCTIONS). -(defvar *callbacks* (make-hash-table)) - -;;; Create a package to contain the symbols for callback functions. We -;;; want to redefine callbacks with the same symbol so the internal data -;;; structures are reused. -(defpackage #:cffi-callbacks - (:use)) - -;;; Intern a symbol in the CFFI-CALLBACKS package used to name the internal -;;; callback for NAME. -(defun intern-callback (name) - (intern (format nil "~A::~A" - (if-let (package (symbol-package name)) - (package-name package) - "#") - (symbol-name name)) - '#:cffi-callbacks)) - -(defmacro %defcallback (name rettype arg-names arg-types body - &key convention) - (declare (ignore convention)) - (let ((cb-name (intern-callback name))) - `(progn - (ccl::ppc-defpascal ,cb-name - (;; ? ,@(when (eq convention :stdcall) '(:discard-stack-args)) - ,@(mapcan (lambda (sym type) - (list (ppc-ff-call-type=>mactype-name (convert-foreign-type type)) sym)) - arg-names arg-types) - ,(ppc-ff-call-type=>mactype-name (convert-foreign-type rettype))) - ,body) - (setf (gethash ',name *callbacks*) (symbol-value ',cb-name))))) - -(defun %callback (name) - (or (gethash name *callbacks*) - (error "Undefined callback: ~S" name))) - -;;;# Loading Foreign Libraries - -(defun %load-foreign-library (name path) - "Load the foreign library NAME." - (declare (ignore path)) - (setf name (string name)) - ;; for mcl emulate this wrt frameworks - (unless (and (> (length name) 10) - (string-equal name ".framework" :start1 (- (length name) 10))) - (setf name (concatenate 'string name ".framework"))) - ;; if the framework was not registered, add it - (unless (gethash name ccl::*framework-descriptors*) - (ccl::add-framework-bundle name :pathname "ccl:frameworks;" )) - (ccl::load-framework-bundle name)) - -(defun %close-foreign-library (name) - "Close the foreign library NAME." - ;; for mcl do nothing - (declare (ignore name)) - nil) - -(defun native-namestring (pathname) - (ccl::posix-namestring (ccl:full-pathname pathname))) - - -;;;# Foreign Globals - -(deftrap-inline "_findsymbol" - ((map :pointer) - (name :pointer)) - :pointer - ()) - - -(defun %foreign-symbol-pointer (name library) - "Returns a pointer to a foreign symbol NAME." - (declare (ignore library)) - (ccl::macho-address - (ccl::get-macho-entry-point (convert-external-name name)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-mkcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-mkcl.lisp deleted file mode 100644 index 0e46503..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-mkcl.lisp +++ /dev/null @@ -1,342 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-mkcl.lisp --- MKCL backend for CFFI. -;;; -;;; Copyright (C) 2010-2012, Jean-Claude Beaudoin -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -;;;# Administrivia - -(defpackage #:cffi-sys - (:use #:common-lisp #:alexandria) - (:export - #:canonicalize-symbol-name-case - #:foreign-pointer - #:pointerp - #:pointer-eq - #:null-pointer - #:null-pointer-p - #:inc-pointer - #:make-pointer - #:pointer-address - #:%foreign-alloc - #:foreign-free - #:with-foreign-pointer - #:%foreign-funcall - #:%foreign-funcall-pointer - #:%foreign-type-alignment - #:%foreign-type-size - #:%load-foreign-library - #:%close-foreign-library - #:native-namestring - #:%mem-ref - #:%mem-set - #:make-shareable-byte-vector - #:with-pointer-to-vector-data - #:%foreign-symbol-pointer - #:%defcallback - #:%callback)) - -(in-package #:cffi-sys) - -;;;# Mis-features - -(pushnew 'flat-namespace *features*) - -;;;# Symbol Case - -(defun canonicalize-symbol-name-case (name) - (declare (string name)) - (string-upcase name)) - -;;;# Allocation - -(defun %foreign-alloc (size) - "Allocate SIZE bytes of foreign-addressable memory." - (si:allocate-foreign-data :void size)) - -(defun foreign-free (ptr) - "Free a pointer PTR allocated by FOREIGN-ALLOC." - (si:free-foreign-data ptr) - nil) - -(defmacro with-foreign-pointer ((var size &optional size-var) &body body) - "Bind VAR to SIZE bytes of foreign memory during BODY. The -pointer in VAR is invalid beyond the dynamic extent of BODY, and -may be stack-allocated if supported by the implementation. If -SIZE-VAR is supplied, it will be bound to SIZE during BODY." - (unless size-var - (setf size-var (gensym "SIZE"))) - `(let* ((,size-var ,size) - (,var (%foreign-alloc ,size-var))) - (unwind-protect - (progn ,@body) - (foreign-free ,var)))) - -;;;# Misc. Pointer Operations - -(deftype foreign-pointer () - 'si:foreign) - -(defun null-pointer () - "Construct and return a null pointer." - (si:make-foreign-null-pointer)) - -(defun null-pointer-p (ptr) - "Return true if PTR is a null pointer." - (si:null-pointer-p ptr)) - -(defun inc-pointer (ptr offset) - "Return a pointer OFFSET bytes past PTR." - (ffi:make-pointer (+ (ffi:pointer-address ptr) offset) :void)) - -(defun pointerp (ptr) - "Return true if PTR is a foreign pointer." - ;;(typep ptr 'si:foreign) - (si:foreignp ptr)) - -(defun pointer-eq (ptr1 ptr2) - "Return true if PTR1 and PTR2 point to the same address." - (= (ffi:pointer-address ptr1) (ffi:pointer-address ptr2))) - -(defun make-pointer (address) - "Return a pointer pointing to ADDRESS." - (ffi:make-pointer address :void)) - -(defun pointer-address (ptr) - "Return the address pointed to by PTR." - (ffi:pointer-address ptr)) - -;;;# Shareable Vectors -;;; -;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA -;;; should be defined to perform a copy-in/copy-out if the Lisp -;;; implementation can't do this. - -(defun make-shareable-byte-vector (size) - "Create a Lisp vector of SIZE bytes that can passed to -WITH-POINTER-TO-VECTOR-DATA." - (make-array size :element-type '(unsigned-byte 8))) - -;;; MKCL, built with the Boehm GC never moves allocated data, so this -;;; isn't nearly as hard to do. -(defun %vector-address (vector) - "Return the address of VECTOR's data." - (check-type vector (vector (unsigned-byte 8))) - #-mingw64 - (ffi:c-inline (vector) (object) - :unsigned-long - "(uintptr_t) #0->vector.self.b8" - :side-effects nil - :one-liner t) - #+mingw64 - (ffi:c-inline (vector) (object) - :unsigned-long-long - "(uintptr_t) #0->vector.self.b8" - :side-effects nil - :one-liner t)) - -(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) - "Bind PTR-VAR to a foreign pointer to the data in VECTOR." - `(let ((,ptr-var (make-pointer (%vector-address ,vector)))) - ,@body)) - -;;;# Dereferencing - -(defun %mem-ref (ptr type &optional (offset 0)) - "Dereference an object of TYPE at OFFSET bytes from PTR." - (let* ((type (cffi-type->mkcl-type type)) - (type-size (ffi:size-of-foreign-type type))) - (si:foreign-ref-elt - (si:foreign-recast ptr (+ offset type-size) :void) offset type))) - -(defun %mem-set (value ptr type &optional (offset 0)) - "Set an object of TYPE at OFFSET bytes from PTR." - (let* ((type (cffi-type->mkcl-type type)) - (type-size (ffi:size-of-foreign-type type))) - (si:foreign-set-elt - (si:foreign-recast ptr (+ offset type-size) :void) - offset type value))) - -;;;# Type Operations - -(defconstant +translation-table+ - '((:char :byte "char") - (:unsigned-char :unsigned-byte "unsigned char") - (:short :short "short") - (:unsigned-short :unsigned-short "unsigned short") - (:int :int "int") - (:unsigned-int :unsigned-int "unsigned int") - (:long :long "long") - (:unsigned-long :unsigned-long "unsigned long") - (:long-long :long-long "long long") - (:unsigned-long-long :unsigned-long-long "unsigned long long") - (:float :float "float") - (:double :double "double") - (:pointer :pointer-void "void*") - (:void :void "void"))) - -(defun cffi-type->mkcl-type (type-keyword) - "Convert a CFFI type keyword to an MKCL type keyword." - (or (second (find type-keyword +translation-table+ :key #'first)) - (error "~S is not a valid CFFI type" type-keyword))) - -(defun mkcl-type->c-type (type-keyword) - "Convert a CFFI type keyword to an valid C type keyword." - (or (third (find type-keyword +translation-table+ :key #'second)) - (error "~S is not a valid CFFI type" type-keyword))) - -(defun %foreign-type-size (type-keyword) - "Return the size in bytes of a foreign type." - (nth-value 0 (ffi:size-of-foreign-type - (cffi-type->mkcl-type type-keyword)))) - -(defun %foreign-type-alignment (type-keyword) - "Return the alignment in bytes of a foreign type." - (nth-value 1 (ffi:size-of-foreign-type - (cffi-type->mkcl-type type-keyword)))) - -;;;# Calling Foreign Functions - -#| -(defconstant +mkcl-inline-codes+ "#0,#1,#2,#3,#4,#5,#6,#7,#8,#9,#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") -|# - -(defun produce-function-pointer-call (pointer types values return-type) -#| - (if (stringp pointer) - (produce-function-pointer-call - `(%foreign-symbol-pointer ,pointer nil) types values return-type) - `(ffi:c-inline - ,(list* pointer values) - ,(list* :pointer-void types) ,return-type - ,(with-output-to-string (s) - (let ((types (mapcar #'mkcl-type->c-type types))) - ;; On AMD64, the following code only works with the extra - ;; argument ",...". If this is not present, functions - ;; like sprintf do not work - (format s "((~A (*)(~@[~{~A,~}...~]))(#0))(~A)" - (mkcl-type->c-type return-type) types - (subseq +mkcl-inline-codes+ 3 - (max 3 (+ 2 (* (length values) 3))))))) - :one-liner t :side-effects t)) -|# - ;; The version here below is definitely not as efficient as the one above - ;; but it has the great vertue of working in all cases, (contrary to the - ;; silent and unsafe limitations of the one above). JCB - ;; I should re-optimize this one day, when I get time... JCB - (progn - (when (stringp pointer) - (setf pointer `(%foreign-symbol-pointer ,pointer nil))) - `(si:call-cfun ,pointer ,return-type (list ,@types) (list ,@values)))) - - -(defun foreign-funcall-parse-args (args) - "Return three values, lists of arg types, values, and result type." - (let ((return-type :void)) - (loop for (type arg) on args by #'cddr - if arg collect (cffi-type->mkcl-type type) into types - and collect arg into values - else do (setf return-type (cffi-type->mkcl-type type)) - finally (return (values types values return-type))))) - -(defmacro %foreign-funcall (name args &key library convention) - "Call a foreign function." - (declare (ignore library convention)) - (multiple-value-bind (types values return-type) - (foreign-funcall-parse-args args) - (produce-function-pointer-call name types values return-type))) - -(defmacro %foreign-funcall-pointer (ptr args &key convention) - "Funcall a pointer to a foreign function." - (declare (ignore convention)) - (multiple-value-bind (types values return-type) - (foreign-funcall-parse-args args) - (produce-function-pointer-call ptr types values return-type))) - -;;;# Foreign Libraries - -(defun %load-foreign-library (name path) - "Load a foreign library." - (declare (ignore name)) - (handler-case (si:load-foreign-module path) - (file-error () - (error "file error while trying to load `~A'" path)))) - -(defun %close-foreign-library (handle) - ;;(declare (ignore handle)) - ;;(error "%CLOSE-FOREIGN-LIBRARY unimplemented.") - (si:unload-foreign-module handle)) - -(defun native-namestring (pathname) - (namestring pathname)) - -;;;# Callbacks - -;;; Create a package to contain the symbols for callback functions. -;;; We want to redefine callbacks with the same symbol so the internal -;;; data structures are reused. -(defpackage #:cffi-callbacks - (:use)) - -(defvar *callbacks* (make-hash-table)) - -;;; Intern a symbol in the CFFI-CALLBACKS package used to name the -;;; internal callback for NAME. -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun intern-callback (name) - (intern (format nil "~A::~A" - (if-let (package (symbol-package name)) - (package-name package) - "#") - (symbol-name name)) - '#:cffi-callbacks))) - -(defmacro %defcallback (name rettype arg-names arg-types body - &key convention) - (declare (ignore convention)) - (let ((cb-name (intern-callback name))) - `(progn - (ffi:defcallback (,cb-name :cdecl) - ,(cffi-type->mkcl-type rettype) - ,(mapcar #'list arg-names - (mapcar #'cffi-type->mkcl-type arg-types)) - ;;(block ,cb-name ,@body) - (block ,cb-name ,body)) - (setf (gethash ',name *callbacks*) ',cb-name)))) - -(defun %callback (name) - (multiple-value-bind (symbol winp) - (gethash name *callbacks*) - (unless winp - (error "Undefined callback: ~S" name)) - (ffi:callback symbol))) - -;;;# Foreign Globals - -(defun %foreign-symbol-pointer (name library) - "Returns a pointer to a foreign symbol NAME." - (declare (ignore library)) - (values (ignore-errors (si:find-foreign-symbol name :default :pointer-void 0)))) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-openmcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-openmcl.lisp deleted file mode 100644 index 5a53ad0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-openmcl.lisp +++ /dev/null @@ -1,314 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-openmcl.lisp --- CFFI-SYS implementation for OpenMCL. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -;;;# Administrivia - -(defpackage #:cffi-sys - (:use #:common-lisp #:ccl) - (:import-from #:alexandria #:once-only #:if-let) - (:export - #:canonicalize-symbol-name-case - #:foreign-pointer - #:pointerp ; ccl:pointerp - #:pointer-eq - #:%foreign-alloc - #:foreign-free - #:with-foreign-pointer - #:null-pointer - #:null-pointer-p - #:inc-pointer - #:make-pointer - #:pointer-address - #:%mem-ref - #:%mem-set - #:%foreign-funcall - #:%foreign-funcall-pointer - #:%foreign-type-alignment - #:%foreign-type-size - #:%load-foreign-library - #:%close-foreign-library - #:native-namestring - #:make-shareable-byte-vector - #:with-pointer-to-vector-data - #:%foreign-symbol-pointer - #:%defcallback - #:%callback)) - -(in-package #:cffi-sys) - -;;;# Misfeatures - -(pushnew 'flat-namespace *features*) - -;;;# Symbol Case - -(defun canonicalize-symbol-name-case (name) - (declare (string name)) - (string-upcase name)) - -;;;# Allocation -;;; -;;; Functions and macros for allocating foreign memory on the stack -;;; and on the heap. The main CFFI package defines macros that wrap -;;; FOREIGN-ALLOC and FOREIGN-FREE in UNWIND-PROTECT for the common -;;; usage when the memory has dynamic extent. - -(defun %foreign-alloc (size) - "Allocate SIZE bytes on the heap and return a pointer." - (ccl::malloc size)) - -(defun foreign-free (ptr) - "Free a PTR allocated by FOREIGN-ALLOC." - ;; TODO: Should we make this a dead macptr? - (ccl::free ptr)) - -(defmacro with-foreign-pointer ((var size &optional size-var) &body body) - "Bind VAR to SIZE bytes of foreign memory during BODY. The -pointer in VAR is invalid beyond the dynamic extent of BODY, and -may be stack-allocated if supported by the implementation. If -SIZE-VAR is supplied, it will be bound to SIZE during BODY." - (unless size-var - (setf size-var (gensym "SIZE"))) - `(let ((,size-var ,size)) - (%stack-block ((,var ,size-var)) - ,@body))) - -;;;# Misc. Pointer Operations - -(deftype foreign-pointer () - 'ccl:macptr) - -(defun null-pointer () - "Construct and return a null pointer." - (ccl:%null-ptr)) - -(defun null-pointer-p (ptr) - "Return true if PTR is a null pointer." - (ccl:%null-ptr-p ptr)) - -(defun inc-pointer (ptr offset) - "Return a pointer OFFSET bytes past PTR." - (ccl:%inc-ptr ptr offset)) - -(defun pointer-eq (ptr1 ptr2) - "Return true if PTR1 and PTR2 point to the same address." - (ccl:%ptr-eql ptr1 ptr2)) - -(defun make-pointer (address) - "Return a pointer pointing to ADDRESS." - (ccl:%int-to-ptr address)) - -(defun pointer-address (ptr) - "Return the address pointed to by PTR." - (ccl:%ptr-to-int ptr)) - -;;;# Shareable Vectors -;;; -;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA -;;; should be defined to perform a copy-in/copy-out if the Lisp -;;; implementation can't do this. - -(defun make-shareable-byte-vector (size) - "Create a Lisp vector of SIZE bytes that can passed to -WITH-POINTER-TO-VECTOR-DATA." - (make-array size :element-type '(unsigned-byte 8))) - -(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) - "Bind PTR-VAR to a foreign pointer to the data in VECTOR." - `(ccl:with-pointer-to-ivector (,ptr-var ,vector) - ,@body)) - -;;;# Dereferencing - -;;; Define the %MEM-REF and %MEM-SET functions, as well as compiler -;;; macros that optimize the case where the type keyword is constant -;;; at compile-time. -(defmacro define-mem-accessors (&body pairs) - `(progn - (defun %mem-ref (ptr type &optional (offset 0)) - (ecase type - ,@(loop for (keyword fn) in pairs - collect `(,keyword (,fn ptr offset))))) - (defun %mem-set (value ptr type &optional (offset 0)) - (ecase type - ,@(loop for (keyword fn) in pairs - collect `(,keyword (setf (,fn ptr offset) value))))) - (define-compiler-macro %mem-ref - (&whole form ptr type &optional (offset 0)) - (if (constantp type) - (ecase (eval type) - ,@(loop for (keyword fn) in pairs - collect `(,keyword `(,',fn ,ptr ,offset)))) - form)) - (define-compiler-macro %mem-set - (&whole form value ptr type &optional (offset 0)) - (if (constantp type) - (once-only (value) - (ecase (eval type) - ,@(loop for (keyword fn) in pairs - collect `(,keyword `(setf (,',fn ,ptr ,offset) - ,value))))) - form)))) - -(define-mem-accessors - (:char %get-signed-byte) - (:unsigned-char %get-unsigned-byte) - (:short %get-signed-word) - (:unsigned-short %get-unsigned-word) - (:int %get-signed-long) - (:unsigned-int %get-unsigned-long) - #+(or 32-bit-target windows-target) (:long %get-signed-long) - #+(and (not windows-target) 64-bit-target) (:long ccl::%%get-signed-longlong) - #+(or 32-bit-target windows-target) (:unsigned-long %get-unsigned-long) - #+(and 64-bit-target (not windows-target)) (:unsigned-long ccl::%%get-unsigned-longlong) - (:long-long ccl::%get-signed-long-long) - (:unsigned-long-long ccl::%get-unsigned-long-long) - (:float %get-single-float) - (:double %get-double-float) - (:pointer %get-ptr)) - -;;;# Calling Foreign Functions - -(defun convert-foreign-type (type-keyword) - "Convert a CFFI type keyword to an OpenMCL type." - (ecase type-keyword - (:char :signed-byte) - (:unsigned-char :unsigned-byte) - (:short :signed-short) - (:unsigned-short :unsigned-short) - (:int :signed-int) - (:unsigned-int :unsigned-int) - (:long :signed-long) - (:unsigned-long :unsigned-long) - (:long-long :signed-doubleword) - (:unsigned-long-long :unsigned-doubleword) - (:float :single-float) - (:double :double-float) - (:pointer :address) - (:void :void))) - -(defun %foreign-type-size (type-keyword) - "Return the size in bytes of a foreign type." - (/ (ccl::foreign-type-bits - (ccl::parse-foreign-type - (convert-foreign-type type-keyword))) - 8)) - -;; There be dragons here. See the following thread for details: -;; http://clozure.com/pipermail/openmcl-devel/2005-June/002777.html -(defun %foreign-type-alignment (type-keyword) - "Return the alignment in bytes of a foreign type." - (/ (ccl::foreign-type-alignment - (ccl::parse-foreign-type - (convert-foreign-type type-keyword))) 8)) - -(defun convert-foreign-funcall-types (args) - "Convert foreign types for a call to FOREIGN-FUNCALL." - (loop for (type arg) on args by #'cddr - collect (convert-foreign-type type) - if arg collect arg)) - -(defun convert-external-name (name) - "Add an underscore to NAME if necessary for the ABI." - #+darwin (concatenate 'string "_" name) - #-darwin name) - -(defmacro %foreign-funcall (function-name args &key library convention) - "Perform a foreign function call, document it more later." - (declare (ignore library convention)) - `(external-call - ,(convert-external-name function-name) - ,@(convert-foreign-funcall-types args))) - -(defmacro %foreign-funcall-pointer (ptr args &key convention) - (declare (ignore convention)) - `(ff-call ,ptr ,@(convert-foreign-funcall-types args))) - -;;;# Callbacks - -;;; The *CALLBACKS* hash table maps CFFI callback names to OpenMCL "macptr" -;;; entry points. It is safe to store the pointers directly because -;;; OpenMCL will update the address of these pointers when a saved image -;;; is loaded (see CCL::RESTORE-PASCAL-FUNCTIONS). -(defvar *callbacks* (make-hash-table)) - -;;; Create a package to contain the symbols for callback functions. We -;;; want to redefine callbacks with the same symbol so the internal data -;;; structures are reused. -(defpackage #:cffi-callbacks - (:use)) - -;;; Intern a symbol in the CFFI-CALLBACKS package used to name the internal -;;; callback for NAME. -(defun intern-callback (name) - (intern (format nil "~A::~A" - (if-let (package (symbol-package name)) - (package-name package) - "#") - (symbol-name name)) - '#:cffi-callbacks)) - -(defmacro %defcallback (name rettype arg-names arg-types body - &key convention) - (let ((cb-name (intern-callback name))) - `(progn - (defcallback ,cb-name - (,@(when (eq convention :stdcall) - '(:discard-stack-args)) - ,@(mapcan (lambda (sym type) - (list (convert-foreign-type type) sym)) - arg-names arg-types) - ,(convert-foreign-type rettype)) - ,body) - (setf (gethash ',name *callbacks*) (symbol-value ',cb-name))))) - -(defun %callback (name) - (or (gethash name *callbacks*) - (error "Undefined callback: ~S" name))) - -;;;# Loading Foreign Libraries - -(defun %load-foreign-library (name path) - "Load the foreign library NAME." - (declare (ignore name)) - (open-shared-library path)) - -(defun %close-foreign-library (name) - "Close the foreign library NAME." - ;; C-S-L sometimes ends in an endless loop - ;; with :COMPLETELY T - (close-shared-library name :completely nil)) - -(defun native-namestring (pathname) - (ccl::native-translated-namestring pathname)) - -;;;# Foreign Globals - -(defun %foreign-symbol-pointer (name library) - "Returns a pointer to a foreign symbol NAME." - (declare (ignore library)) - (foreign-symbol-address (convert-external-name name))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-sbcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-sbcl.lisp deleted file mode 100644 index 63cdce5..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-sbcl.lisp +++ /dev/null @@ -1,408 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-sbcl.lisp --- CFFI-SYS implementation for SBCL. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -;;;# Administrivia - -(defpackage #:cffi-sys - (:use #:common-lisp #:sb-alien) - (:import-from #:alexandria - #:once-only #:with-unique-names #:when-let #:removef) - (:export - #:canonicalize-symbol-name-case - #:foreign-pointer - #:pointerp - #:pointer-eq - #:null-pointer - #:null-pointer-p - #:inc-pointer - #:make-pointer - #:pointer-address - #:%foreign-alloc - #:foreign-free - #:with-foreign-pointer - #:%foreign-funcall - #:%foreign-funcall-pointer - #:%foreign-type-alignment - #:%foreign-type-size - #:%load-foreign-library - #:%close-foreign-library - #:native-namestring - #:%mem-ref - #:%mem-set - #:make-shareable-byte-vector - #:with-pointer-to-vector-data - #:%foreign-symbol-pointer - #:%defcallback - #:%callback)) - -(in-package #:cffi-sys) - -;;;# Misfeatures - -(pushnew 'flat-namespace *features*) - -;;;# Symbol Case - -(declaim (inline canonicalize-symbol-name-case)) -(defun canonicalize-symbol-name-case (name) - (declare (string name)) - (string-upcase name)) - -;;;# Basic Pointer Operations - -(deftype foreign-pointer () - 'sb-sys:system-area-pointer) - -(declaim (inline pointerp)) -(defun pointerp (ptr) - "Return true if PTR is a foreign pointer." - (sb-sys:system-area-pointer-p ptr)) - -(declaim (inline pointer-eq)) -(defun pointer-eq (ptr1 ptr2) - "Return true if PTR1 and PTR2 point to the same address." - (declare (type system-area-pointer ptr1 ptr2)) - (sb-sys:sap= ptr1 ptr2)) - -(declaim (inline null-pointer)) -(defun null-pointer () - "Construct and return a null pointer." - (sb-sys:int-sap 0)) - -(declaim (inline null-pointer-p)) -(defun null-pointer-p (ptr) - "Return true if PTR is a null pointer." - (declare (type system-area-pointer ptr)) - (zerop (sb-sys:sap-int ptr))) - -(declaim (inline inc-pointer)) -(defun inc-pointer (ptr offset) - "Return a pointer pointing OFFSET bytes past PTR." - (declare (type system-area-pointer ptr) - (type integer offset)) - (sb-sys:sap+ ptr offset)) - -(declaim (inline make-pointer)) -(defun make-pointer (address) - "Return a pointer pointing to ADDRESS." - ;; (declare (type (unsigned-byte 32) address)) - (sb-sys:int-sap address)) - -(declaim (inline pointer-address)) -(defun pointer-address (ptr) - "Return the address pointed to by PTR." - (declare (type system-area-pointer ptr)) - (sb-sys:sap-int ptr)) - -;;;# Allocation -;;; -;;; Functions and macros for allocating foreign memory on the stack -;;; and on the heap. The main CFFI package defines macros that wrap -;;; FOREIGN-ALLOC and FOREIGN-FREE in UNWIND-PROTECT for the common usage -;;; when the memory has dynamic extent. - -(declaim (inline %foreign-alloc)) -(defun %foreign-alloc (size) - "Allocate SIZE bytes on the heap and return a pointer." - ;; (declare (type (unsigned-byte 32) size)) - (alien-sap (make-alien (unsigned 8) size))) - -(declaim (inline foreign-free)) -(defun foreign-free (ptr) - "Free a PTR allocated by FOREIGN-ALLOC." - (declare (type system-area-pointer ptr) - (optimize speed)) - (free-alien (sap-alien ptr (* (unsigned 8))))) - -(defmacro with-foreign-pointer ((var size &optional size-var) &body body) - "Bind VAR to SIZE bytes of foreign memory during BODY. The -pointer in VAR is invalid beyond the dynamic extent of BODY, and -may be stack-allocated if supported by the implementation. If -SIZE-VAR is supplied, it will be bound to SIZE during BODY." - (unless size-var - (setf size-var (gensym "SIZE"))) - ;; If the size is constant we can stack-allocate. - (if (constantp size) - (let ((alien-var (gensym "ALIEN"))) - `(with-alien ((,alien-var (array (unsigned 8) ,(eval size)))) - (let ((,size-var ,(eval size)) - (,var (alien-sap ,alien-var))) - (declare (ignorable ,size-var)) - ,@body))) - `(let* ((,size-var ,size) - (,var (%foreign-alloc ,size-var))) - (unwind-protect - (progn ,@body) - (foreign-free ,var))))) - -;;;# Shareable Vectors -;;; -;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA -;;; should be defined to perform a copy-in/copy-out if the Lisp -;;; implementation can't do this. - -(declaim (inline make-shareable-byte-vector)) -(defun make-shareable-byte-vector (size) - "Create a Lisp vector of SIZE bytes can passed to -WITH-POINTER-TO-VECTOR-DATA." - ; (declare (type sb-int:index size)) - (make-array size :element-type '(unsigned-byte 8))) - -(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) - "Bind PTR-VAR to a foreign pointer to the data in VECTOR." - (let ((vector-var (gensym "VECTOR"))) - `(let ((,vector-var ,vector)) - (declare (type (sb-kernel:simple-unboxed-array (*)) ,vector-var)) - (sb-sys:with-pinned-objects (,vector-var) - (let ((,ptr-var (sb-sys:vector-sap ,vector-var))) - ,@body))))) - -;;;# Dereferencing - -;;; Define the %MEM-REF and %MEM-SET functions, as well as compiler -;;; macros that optimize the case where the type keyword is constant -;;; at compile-time. -(defmacro define-mem-accessors (&body pairs) - `(progn - (defun %mem-ref (ptr type &optional (offset 0)) - (ecase type - ,@(loop for (keyword fn) in pairs - collect `(,keyword (,fn ptr offset))))) - (defun %mem-set (value ptr type &optional (offset 0)) - (ecase type - ,@(loop for (keyword fn) in pairs - collect `(,keyword (setf (,fn ptr offset) value))))) - (define-compiler-macro %mem-ref - (&whole form ptr type &optional (offset 0)) - (if (constantp type) - (ecase (eval type) - ,@(loop for (keyword fn) in pairs - collect `(,keyword `(,',fn ,ptr ,offset)))) - form)) - (define-compiler-macro %mem-set - (&whole form value ptr type &optional (offset 0)) - (if (constantp type) - (once-only (value) - (ecase (eval type) - ,@(loop for (keyword fn) in pairs - collect `(,keyword `(setf (,',fn ,ptr ,offset) - ,value))))) - form)))) - -;;; Look up alien type information and build both define-mem-accessors form -;;; and convert-foreign-type function definition. -(defmacro define-type-mapping (accessor-table alien-table) - (let* ((accessible-types - (remove 'void alien-table :key #'second)) - (size-and-signedp-forms - (mapcar (lambda (name) - (list (eval `(alien-size ,(second name))) - (typep -1 `(alien ,(second name))))) - accessible-types))) - `(progn - (define-mem-accessors - ,@(loop for (cffi-keyword alien-type fixed-accessor) - in accessible-types - and (alien-size signedp) - in size-and-signedp-forms - for (signed-ref unsigned-ref) - = (cdr (assoc alien-size accessor-table)) - collect - `(,cffi-keyword - ,(or fixed-accessor - (if signedp signed-ref unsigned-ref) - (error "No accessor found for ~S" - alien-type))))) - (defun convert-foreign-type (type-keyword) - (ecase type-keyword - ,@(loop for (cffi-keyword alien-type) in alien-table - collect `(,cffi-keyword (quote ,alien-type)))))))) - -(define-type-mapping - ((8 sb-sys:signed-sap-ref-8 sb-sys:sap-ref-8) - (16 sb-sys:signed-sap-ref-16 sb-sys:sap-ref-16) - (32 sb-sys:signed-sap-ref-32 sb-sys:sap-ref-32) - (64 sb-sys:signed-sap-ref-64 sb-sys:sap-ref-64)) - ((:char char) - (:unsigned-char unsigned-char) - (:short short) - (:unsigned-short unsigned-short) - (:int int) - (:unsigned-int unsigned-int) - (:long long) - (:unsigned-long unsigned-long) - (:long-long long-long) - (:unsigned-long-long unsigned-long-long) - (:float single-float - sb-sys:sap-ref-single) - (:double double-float - sb-sys:sap-ref-double) - (:pointer system-area-pointer - sb-sys:sap-ref-sap) - (:void void))) - -;;;# Calling Foreign Functions - -(defun %foreign-type-size (type-keyword) - "Return the size in bytes of a foreign type." - (/ (sb-alien-internals:alien-type-bits - (sb-alien-internals:parse-alien-type - (convert-foreign-type type-keyword) nil)) 8)) - -(defun %foreign-type-alignment (type-keyword) - "Return the alignment in bytes of a foreign type." - #+(and darwin ppc (not ppc64)) - (case type-keyword - ((:double :long-long :unsigned-long-long) - (return-from %foreign-type-alignment 8))) - ;; No override necessary for other types... - (/ (sb-alien-internals:alien-type-alignment - (sb-alien-internals:parse-alien-type - (convert-foreign-type type-keyword) nil)) 8)) - -(defun foreign-funcall-type-and-args (args) - "Return an SB-ALIEN function type for ARGS." - (let ((return-type 'void)) - (loop for (type arg) on args by #'cddr - if arg collect (convert-foreign-type type) into types - and collect arg into fargs - else do (setf return-type (convert-foreign-type type)) - finally (return (values types fargs return-type))))) - -(defmacro %%foreign-funcall (name types fargs rettype) - "Internal guts of %FOREIGN-FUNCALL." - `(alien-funcall - (extern-alien ,name (function ,rettype ,@types)) - ,@fargs)) - -(defmacro %foreign-funcall (name args &key library convention) - "Perform a foreign function call, document it more later." - (declare (ignore library convention)) - (multiple-value-bind (types fargs rettype) - (foreign-funcall-type-and-args args) - `(%%foreign-funcall ,name ,types ,fargs ,rettype))) - -(defmacro %foreign-funcall-pointer (ptr args &key convention) - "Funcall a pointer to a foreign function." - (declare (ignore convention)) - (multiple-value-bind (types fargs rettype) - (foreign-funcall-type-and-args args) - (with-unique-names (function) - `(with-alien ((,function (* (function ,rettype ,@types)) ,ptr)) - (alien-funcall ,function ,@fargs))))) - -;;;# Callbacks - -;;; The *CALLBACKS* hash table contains a direct mapping of CFFI -;;; callback names to SYSTEM-AREA-POINTERs obtained by ALIEN-LAMBDA. -;;; SBCL will maintain the addresses of the callbacks across saved -;;; images, so it is safe to store the pointers directly. -(defvar *callbacks* (make-hash-table)) - -(defmacro %defcallback (name rettype arg-names arg-types body - &key convention) - (check-type convention (member :stdcall :cdecl)) - `(setf (gethash ',name *callbacks*) - (alien-sap - (sb-alien::alien-lambda - #+alien-callback-conventions - (,convention ,(convert-foreign-type rettype)) - #-alien-callback-conventions - ,(convert-foreign-type rettype) - ,(mapcar (lambda (sym type) - (list sym (convert-foreign-type type))) - arg-names arg-types) - ,body)))) - -(defun %callback (name) - (or (gethash name *callbacks*) - (error "Undefined callback: ~S" name))) - -;;;# Loading and Closing Foreign Libraries - -#+darwin -(defun call-within-initial-thread (fn &rest args) - (let (result - error - (sem (sb-thread:make-semaphore))) - (sb-thread:interrupt-thread - ;; KLUDGE: find a better way to get the initial thread. - (car (last (sb-thread:list-all-threads))) - (lambda () - (multiple-value-setq (result error) - (ignore-errors (apply fn args))) - (sb-thread:signal-semaphore sem))) - (sb-thread:wait-on-semaphore sem) - (if error - (signal error) - result))) - -(declaim (inline %load-foreign-library)) -(defun %load-foreign-library (name path) - "Load a foreign library." - (declare (ignore name)) - ;; As of MacOS X 10.6.6, loading things like CoreFoundation from a - ;; thread other than the initial one results in a crash. - #+darwin (call-within-initial-thread 'load-shared-object path) - #-darwin (load-shared-object path)) - -;;; SBCL 1.0.21.15 renamed SB-ALIEN::SHARED-OBJECT-FILE but introduced -;;; SB-ALIEN:UNLOAD-SHARED-OBJECT which we can use instead. -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun unload-shared-object-present-p () - (multiple-value-bind (foundp kind) - (find-symbol "UNLOAD-SHARED-OBJECT" "SB-ALIEN") - (if (and foundp (eq kind :external)) - '(:and) - '(:or))))) - -(defun %close-foreign-library (handle) - "Closes a foreign library." - #+#.(cffi-sys::unload-shared-object-present-p) - (sb-alien:unload-shared-object handle) - #-#.(cffi-sys::unload-shared-object-present-p) - (sb-thread:with-mutex (sb-alien::*shared-objects-lock*) - (let ((obj (find (sb-ext:native-namestring handle) - sb-alien::*shared-objects* - :key #'sb-alien::shared-object-file - :test #'string=))) - (when obj - (sb-alien::dlclose-or-lose obj) - (removef sb-alien::*shared-objects* obj) - #+(and linkage-table (not win32)) - (sb-alien::update-linkage-table))))) - -(defun native-namestring (pathname) - (sb-ext:native-namestring pathname)) - -;;;# Foreign Globals - -(defun %foreign-symbol-pointer (name library) - "Returns a pointer to a foreign symbol NAME." - (declare (ignore library)) - (when-let (address (sb-sys:find-foreign-symbol-address name)) - (sb-sys:int-sap address))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-scl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-scl.lisp deleted file mode 100644 index fe2fdb1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-scl.lisp +++ /dev/null @@ -1,322 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; cffi-scl.lisp --- CFFI-SYS implementation for the Scieneer Common Lisp. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; Copyright (C) 2006-2007, Scieneer Pty Ltd. -;;; -;;; 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. -;;; - -;;;# Administrivia - -(defpackage #:cffi-sys - (:use #:common-lisp #:alien #:c-call) - (:import-from #:alexandria #:once-only #:with-unique-names) - (:export - #:canonicalize-symbol-name-case - #:foreign-pointer - #:pointerp - #:pointer-eq - #:null-pointer - #:null-pointer-p - #:inc-pointer - #:make-pointer - #:pointer-address - #:%foreign-alloc - #:foreign-free - #:with-foreign-pointer - #:%foreign-funcall - #:%foreign-funcall-pointer - #:%foreign-type-alignment - #:%foreign-type-size - #:%load-foreign-library - #:%close-foreign-library - #:native-namestring - #:%mem-ref - #:%mem-set - #:make-shareable-byte-vector - #:with-pointer-to-vector-data - #:%foreign-symbol-pointer - #:%defcallback - #:%callback)) - -(in-package #:cffi-sys) - -;;;# Mis-features - -(pushnew 'flat-namespace *features*) - -;;;# Symbol Case - -(defun canonicalize-symbol-name-case (name) - (declare (string name)) - (if (eq ext:*case-mode* :upper) - (string-upcase name) - (string-downcase name))) - -;;;# Basic Pointer Operations - -(deftype foreign-pointer () - 'sys:system-area-pointer) - -(declaim (inline pointerp)) -(defun pointerp (ptr) - "Return true if 'ptr is a foreign pointer." - (sys:system-area-pointer-p ptr)) - -(declaim (inline pointer-eq)) -(defun pointer-eq (ptr1 ptr2) - "Return true if 'ptr1 and 'ptr2 point to the same address." - (sys:sap= ptr1 ptr2)) - -(declaim (inline null-pointer)) -(defun null-pointer () - "Construct and return a null pointer." - (sys:int-sap 0)) - -(declaim (inline null-pointer-p)) -(defun null-pointer-p (ptr) - "Return true if 'ptr is a null pointer." - (zerop (sys:sap-int ptr))) - -(declaim (inline inc-pointer)) -(defun inc-pointer (ptr offset) - "Return a pointer pointing 'offset bytes past 'ptr." - (sys:sap+ ptr offset)) - -(declaim (inline make-pointer)) -(defun make-pointer (address) - "Return a pointer pointing to 'address." - (sys:int-sap address)) - -(declaim (inline pointer-address)) -(defun pointer-address (ptr) - "Return the address pointed to by 'ptr." - (sys:sap-int ptr)) - -(defmacro with-foreign-pointer ((var size &optional size-var) &body body) - "Bind 'var to 'size bytes of foreign memory during 'body. The - pointer in 'var is invalid beyond the dynamic extent of 'body, and - may be stack-allocated if supported by the implementation. If - 'size-var is supplied, it will be bound to 'size during 'body." - (unless size-var - (setf size-var (gensym (symbol-name '#:size)))) - ;; If the size is constant we can stack-allocate. - (cond ((constantp size) - (let ((alien-var (gensym (symbol-name '#:alien)))) - `(with-alien ((,alien-var (array (unsigned 8) ,(eval size)))) - (let ((,size-var ,size) - (,var (alien-sap ,alien-var))) - (declare (ignorable ,size-var)) - ,@body)))) - (t - `(let ((,size-var ,size)) - (alien:with-bytes (,var ,size-var) - ,@body))))) - -;;;# Allocation -;;; -;;; Functions and macros for allocating foreign memory on the stack and on the -;;; heap. The main CFFI package defines macros that wrap 'foreign-alloc and -;;; 'foreign-free in 'unwind-protect for the common usage when the memory has -;;; dynamic extent. - -(defun %foreign-alloc (size) - "Allocate 'size bytes on the heap and return a pointer." - (declare (type (unsigned-byte #-64bit 32 #+64bit 64) size)) - (alien-funcall (extern-alien "malloc" - (function system-area-pointer unsigned)) - size)) - -(defun foreign-free (ptr) - "Free a 'ptr allocated by 'foreign-alloc." - (declare (type system-area-pointer ptr)) - (alien-funcall (extern-alien "free" - (function (values) system-area-pointer)) - ptr)) - -;;;# Shareable Vectors - -(defun make-shareable-byte-vector (size) - "Create a Lisp vector of 'size bytes that can passed to - 'with-pointer-to-vector-data." - (make-array size :element-type '(unsigned-byte 8))) - -(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) - "Bind 'ptr-var to a foreign pointer to the data in 'vector." - (let ((vector-var (gensym (symbol-name '#:vector)))) - `(let ((,vector-var ,vector)) - (ext:with-pinned-object (,vector-var) - (let ((,ptr-var (sys:vector-sap ,vector-var))) - ,@body))))) - -;;;# Dereferencing - -;;; Define the %MEM-REF and %MEM-SET functions, as well as compiler -;;; macros that optimize the case where the type keyword is constant -;;; at compile-time. -(defmacro define-mem-accessors (&body pairs) - `(progn - (defun %mem-ref (ptr type &optional (offset 0)) - (ecase type - ,@(loop for (keyword fn) in pairs - collect `(,keyword (,fn ptr offset))))) - (defun %mem-set (value ptr type &optional (offset 0)) - (ecase type - ,@(loop for (keyword fn) in pairs - collect `(,keyword (setf (,fn ptr offset) value))))) - (define-compiler-macro %mem-ref - (&whole form ptr type &optional (offset 0)) - (if (constantp type) - (ecase (eval type) - ,@(loop for (keyword fn) in pairs - collect `(,keyword `(,',fn ,ptr ,offset)))) - form)) - (define-compiler-macro %mem-set - (&whole form value ptr type &optional (offset 0)) - (if (constantp type) - (once-only (value) - (ecase (eval type) - ,@(loop for (keyword fn) in pairs - collect `(,keyword `(setf (,',fn ,ptr ,offset) - ,value))))) - form)))) - -(define-mem-accessors - (:char sys:signed-sap-ref-8) - (:unsigned-char sys:sap-ref-8) - (:short sys:signed-sap-ref-16) - (:unsigned-short sys:sap-ref-16) - (:int sys:signed-sap-ref-32) - (:unsigned-int sys:sap-ref-32) - (:long #-64bit sys:signed-sap-ref-32 #+64bit sys:signed-sap-ref-64) - (:unsigned-long #-64bit sys:sap-ref-32 #+64bit sys:sap-ref-64) - (:long-long sys:signed-sap-ref-64) - (:unsigned-long-long sys:sap-ref-64) - (:float sys:sap-ref-single) - (:double sys:sap-ref-double) - #+long-float (:long-double sys:sap-ref-long) - (:pointer sys:sap-ref-sap)) - -;;;# Calling Foreign Functions - -(defun convert-foreign-type (type-keyword) - "Convert a CFFI type keyword to an ALIEN type." - (ecase type-keyword - (:char 'char) - (:unsigned-char 'unsigned-char) - (:short 'short) - (:unsigned-short 'unsigned-short) - (:int 'int) - (:unsigned-int 'unsigned-int) - (:long 'long) - (:unsigned-long 'unsigned-long) - (:long-long '(signed 64)) - (:unsigned-long-long '(unsigned 64)) - (:float 'single-float) - (:double 'double-float) - #+long-float - (:long-double 'long-float) - (:pointer 'system-area-pointer) - (:void 'void))) - -(defun %foreign-type-size (type-keyword) - "Return the size in bytes of a foreign type." - (values (truncate (alien-internals:alien-type-bits - (alien-internals:parse-alien-type - (convert-foreign-type type-keyword))) - 8))) - -(defun %foreign-type-alignment (type-keyword) - "Return the alignment in bytes of a foreign type." - (values (truncate (alien-internals:alien-type-alignment - (alien-internals:parse-alien-type - (convert-foreign-type type-keyword))) - 8))) - -(defun foreign-funcall-type-and-args (args) - "Return an 'alien function type for 'args." - (let ((return-type nil)) - (loop for (type arg) on args by #'cddr - if arg collect (convert-foreign-type type) into types - and collect arg into fargs - else do (setf return-type (convert-foreign-type type)) - finally (return (values types fargs return-type))))) - -(defmacro %%foreign-funcall (name types fargs rettype) - "Internal guts of '%foreign-funcall." - `(alien-funcall (extern-alien ,name (function ,rettype ,@types)) - ,@fargs)) - -(defmacro %foreign-funcall (name args &key library convention) - "Perform a foreign function call, document it more later." - (declare (ignore library convention)) - (multiple-value-bind (types fargs rettype) - (foreign-funcall-type-and-args args) - `(%%foreign-funcall ,name ,types ,fargs ,rettype))) - -(defmacro %foreign-funcall-pointer (ptr args &key convention) - "Funcall a pointer to a foreign function." - (declare (ignore convention)) - (multiple-value-bind (types fargs rettype) - (foreign-funcall-type-and-args args) - (with-unique-names (function) - `(with-alien ((,function (* (function ,rettype ,@types)) ,ptr)) - (alien-funcall ,function ,@fargs))))) - -;;; Callbacks - -(defmacro %defcallback (name rettype arg-names arg-types body - &key convention) - (declare (ignore convention)) - `(alien:defcallback ,name - (,(convert-foreign-type rettype) - ,@(mapcar (lambda (sym type) - (list sym (convert-foreign-type type))) - arg-names arg-types)) - ,body)) - -(declaim (inline %callback)) -(defun %callback (name) - (alien:callback-sap name)) - -;;;# Loading and Closing Foreign Libraries - -(defun %load-foreign-library (name path) - "Load the foreign library 'name." - (declare (ignore name)) - (ext:load-dynamic-object path)) - -(defun %close-foreign-library (name) - "Closes the foreign library 'name." - (ext:close-dynamic-object name)) - -(defun native-namestring (pathname) - (ext:unix-namestring pathname nil)) - -;;;# Foreign Globals - -(defun %foreign-symbol-pointer (name library) - "Returns a pointer to a foreign symbol 'name." - (declare (ignore library)) - (let ((sap (sys:foreign-symbol-address name))) - (if (zerop (sys:sap-int sap)) nil sap))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/early-types.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/early-types.lisp deleted file mode 100644 index 9920042..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/early-types.lisp +++ /dev/null @@ -1,713 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; early-types.lisp --- Low-level foreign type operations. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; Copyright (C) 2005-2007, Luis Oliveira -;;; -;;; 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. -;;; - -;;;# Early Type Definitions -;;; -;;; This module contains basic operations on foreign types. These -;;; definitions are in a separate file because they may be used in -;;; compiler macros defined later on. - -(in-package #:cffi) - -;;;# Foreign Types -;;; -;;; Type specifications are of the form (type {args}*). The type -;;; parser can specify how its arguments should look like through a -;;; lambda list. -;;; -;;; "type" is a shortcut for "(type)", ie, no args were specified. -;;; -;;; Examples of such types: boolean, (boolean), (boolean :int) If the -;;; boolean type parser specifies the lambda list: &optional -;;; (base-type :int), then all of the above three type specs would be -;;; parsed to an identical type. -;;; -;;; Type parsers, defined with DEFINE-PARSE-METHOD should return a -;;; subtype of the foreign-type class. - -(defvar *type-parsers* (make-hash-table :test 'equal) - "Hash table of defined type parsers.") - -(define-condition cffi-error (error) - ()) - -(define-condition foreign-type-error (cffi-error) - ((type-name :initarg :type-name - :initform (error "Must specify TYPE-NAME.") - :accessor foreign-type-error/type-name) - (namespace :initarg :namespace - :initform :default - :accessor foreign-type-error/namespace))) - -(defun foreign-type-error/compound-name (e) - (let ((name (foreign-type-error/type-name e)) - (namespace (foreign-type-error/namespace e))) - (if (eq namespace :default) - name - `(,namespace ,name)))) - -(define-condition simple-foreign-type-error (simple-error foreign-type-error) - ()) - -(defun simple-foreign-type-error (type-name namespace format-control &rest format-arguments) - (error 'simple-foreign-type-error - :type-name type-name :namespace namespace - :format-control format-control :format-arguments format-arguments)) - -(define-condition undefined-foreign-type-error (foreign-type-error) - () - (:report (lambda (e stream) - (format stream "Unknown CFFI type ~S" (foreign-type-error/compound-name e))))) - -(defun undefined-foreign-type-error (type-name &optional (namespace :default)) - (error 'undefined-foreign-type-error :type-name type-name :namespace namespace)) - -;; TODO this is not according to the C namespace rules, -;; see bug: https://bugs.launchpad.net/cffi/+bug/1527947 -(deftype c-namespace-name () - '(member :default :struct :union)) - -;; for C namespaces read: https://stackoverflow.com/questions/12579142/type-namespace-in-c -;; (section 6.2.3 Name spaces of identifiers) -;; NOTE: :struct is probably an unfortunate name for the tagged (?) namespace -(defun find-type-parser (symbol &optional (namespace :default)) - "Return the type parser for SYMBOL. NAMESPACE is either :DEFAULT (for -variables, functions, and typedefs) or :STRUCT (for structs, unions, and enums)." - (check-type symbol (and symbol (not null))) - (check-type namespace c-namespace-name) - (or (gethash (cons namespace symbol) *type-parsers*) - (undefined-foreign-type-error symbol namespace))) - -(defun (setf find-type-parser) (func symbol &optional (namespace :default)) - "Set the type parser for SYMBOL." - (check-type symbol (and symbol (not null))) - (check-type namespace c-namespace-name) - ;; TODO Shall we signal a redefinition warning here? - (setf (gethash (cons namespace symbol) *type-parsers*) func)) - -(defun undefine-foreign-type (symbol &optional (namespace :default)) - (remhash (cons namespace symbol) *type-parsers*) - (values)) - -;;; Using a generic function would have been nicer but generates lots -;;; of style warnings in SBCL. (Silly reason, yes.) -(defmacro define-parse-method (name lambda-list &body body) - "Define a type parser on NAME and lists whose CAR is NAME." - (discard-docstring body) - (warn-if-kw-or-belongs-to-cl name) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (setf (find-type-parser ',name) - (lambda ,lambda-list ,@body)) - ',name)) - -;;; Utility function for the simple case where the type takes no -;;; arguments. -(defun notice-foreign-type (name type &optional (namespace :default)) - (setf (find-type-parser name namespace) (lambda () type)) - name) - -;;;# Generic Functions on Types - -(defgeneric canonicalize (foreign-type) - (:documentation - "Return the most primitive foreign type for FOREIGN-TYPE, either a built-in -type--a keyword--or a struct/union type--a list of the form (:STRUCT/:UNION name). -Signals an error if FOREIGN-TYPE is undefined.")) - -(defgeneric aggregatep (foreign-type) - (:documentation - "Return true if FOREIGN-TYPE is an aggregate type.")) - -(defgeneric foreign-type-alignment (foreign-type) - (:documentation - "Return the structure alignment in bytes of a foreign type.")) - -(defgeneric foreign-type-size (foreign-type) - (:documentation - "Return the size in bytes of a foreign type.")) - -(defgeneric unparse-type (foreign-type) - (:documentation - "Unparse FOREIGN-TYPE to a type specification (symbol or list).")) - -;;;# Foreign Types - -(defclass foreign-type () - () - (:documentation "Base class for all foreign types.")) - -(defmethod make-load-form ((type foreign-type) &optional env) - "Return the form used to dump types to a FASL file." - (declare (ignore env)) - `(parse-type ',(unparse-type type))) - -(defmethod foreign-type-size (type) - "Return the size in bytes of a foreign type." - (foreign-type-size (parse-type type))) - -(defclass named-foreign-type (foreign-type) - ((name - ;; Name of this foreign type, a symbol. - :initform (error "Must specify a NAME.") - :initarg :name - :accessor name))) - -(defmethod print-object ((type named-foreign-type) stream) - "Print a FOREIGN-TYPEDEF instance to STREAM unreadably." - (print-unreadable-object (type stream :type t :identity nil) - (format stream "~S" (name type)))) - -;;; Return the type's name which can be passed to PARSE-TYPE. If -;;; that's not the case for some subclass of NAMED-FOREIGN-TYPE then -;;; it should specialize UNPARSE-TYPE. -(defmethod unparse-type ((type named-foreign-type)) - (name type)) - -;;;# Built-In Foreign Types - -(defclass foreign-built-in-type (foreign-type) - ((type-keyword - ;; Keyword in CFFI-SYS representing this type. - :initform (error "A type keyword is required.") - :initarg :type-keyword - :accessor type-keyword)) - (:documentation "A built-in foreign type.")) - -(defmethod canonicalize ((type foreign-built-in-type)) - "Return the built-in type keyword for TYPE." - (type-keyword type)) - -(defmethod aggregatep ((type foreign-built-in-type)) - "Returns false, built-in types are never aggregate types." - nil) - -(defmethod foreign-type-alignment ((type foreign-built-in-type)) - "Return the alignment of a built-in type." - (%foreign-type-alignment (type-keyword type))) - -(defmethod foreign-type-size ((type foreign-built-in-type)) - "Return the size of a built-in type." - (%foreign-type-size (type-keyword type))) - -(defmethod unparse-type ((type foreign-built-in-type)) - "Returns the symbolic representation of a built-in type." - (type-keyword type)) - -(defmethod print-object ((type foreign-built-in-type) stream) - "Print a FOREIGN-TYPE instance to STREAM unreadably." - (print-unreadable-object (type stream :type t :identity nil) - (format stream "~S" (type-keyword type)))) - -(defvar *built-in-foreign-types* nil) - -(defmacro define-built-in-foreign-type (keyword) - "Defines a built-in foreign-type." - `(eval-when (:compile-toplevel :load-toplevel :execute) - (pushnew ,keyword *built-in-foreign-types*) - (notice-foreign-type - ,keyword (make-instance 'foreign-built-in-type :type-keyword ,keyword)))) - -;;;# Foreign Pointer Types - -(defclass foreign-pointer-type (foreign-built-in-type) - ((pointer-type - ;; Type of object pointed at by this pointer, or nil for an - ;; untyped (void) pointer. - :initform nil - :initarg :pointer-type - :accessor pointer-type)) - (:default-initargs :type-keyword :pointer)) - -;;; Define the type parser for the :POINTER type. If no type argument -;;; is provided, a void pointer will be created. -(let ((void-pointer (make-instance 'foreign-pointer-type))) - (define-parse-method :pointer (&optional type) - (if type - (make-instance 'foreign-pointer-type :pointer-type (parse-type type)) - ;; A bit of premature optimization here. - void-pointer))) - -;;; Unparse a foreign pointer type when dumping to a fasl. -(defmethod unparse-type ((type foreign-pointer-type)) - (if (pointer-type type) - `(:pointer ,(unparse-type (pointer-type type))) - :pointer)) - -;;; Print a foreign pointer type unreadably in unparsed form. -(defmethod print-object ((type foreign-pointer-type) stream) - (print-unreadable-object (type stream :type t :identity nil) - (format stream "~S" (unparse-type type)))) - -;;;# Structure Type - -(defgeneric bare-struct-type-p (foreign-type) - (:documentation - "Return true if FOREIGN-TYPE is a bare struct type or an alias of a bare struct type. ")) - -(defmethod bare-struct-type-p ((type foreign-type)) - "Return true if FOREIGN-TYPE is a bare struct type or an alias of a bare struct type. " - nil) - -(defclass foreign-struct-type (named-foreign-type) - ((slots - ;; Hash table of slots in this structure, keyed by name. - :initform (make-hash-table) - :initarg :slots - :accessor slots) - (size - ;; Cached size in bytes of this structure. - :initarg :size - :accessor size) - (alignment - ;; This struct's alignment requirements - :initarg :alignment - :accessor alignment) - (bare - ;; we use this flag to support the (old, deprecated) semantics of - ;; bare struct types. FOO means (:POINTER (:STRUCT FOO) in - ;; functions declarations whereas FOO in a structure definition is - ;; a proper aggregate type: (:STRUCT FOO), etc. - :initform nil - :initarg :bare - :reader bare-struct-type-p))) - -(defun slots-in-order (structure-type) - "A list of the structure's slots in order." - (sort (loop for slots being the hash-value of (structure-slots structure-type) - collect slots) - #'< - :key 'slot-offset)) - -(defmethod canonicalize ((type foreign-struct-type)) - (if (bare-struct-type-p type) - :pointer - `(:struct ,(name type)))) - -(defmethod unparse-type ((type foreign-struct-type)) - (if (bare-struct-type-p type) - (name type) - (canonicalize type))) - -(defmethod aggregatep ((type foreign-struct-type)) - "Returns true, structure types are aggregate." - t) - -(defmethod foreign-type-size ((type foreign-struct-type)) - "Return the size in bytes of a foreign structure type." - (size type)) - -(defmethod foreign-type-alignment ((type foreign-struct-type)) - "Return the alignment requirements for this struct." - (alignment type)) - -(defclass foreign-union-type (foreign-struct-type) ()) - -(defmethod canonicalize ((type foreign-union-type)) - (if (bare-struct-type-p type) - :pointer - `(:union ,(name type)))) - -;;;# Foreign Typedefs - -(defclass foreign-type-alias (foreign-type) - ((actual-type - ;; The FOREIGN-TYPE instance this type is an alias for. - :initarg :actual-type - :accessor actual-type - :initform (error "Must specify an ACTUAL-TYPE."))) - (:documentation "A type that aliases another type.")) - -(defmethod canonicalize ((type foreign-type-alias)) - "Return the built-in type keyword for TYPE." - (canonicalize (actual-type type))) - -(defmethod aggregatep ((type foreign-type-alias)) - "Return true if TYPE's actual type is aggregate." - (aggregatep (actual-type type))) - -(defmethod foreign-type-alignment ((type foreign-type-alias)) - "Return the alignment of a foreign typedef." - (foreign-type-alignment (actual-type type))) - -(defmethod foreign-type-size ((type foreign-type-alias)) - "Return the size in bytes of a foreign typedef." - (foreign-type-size (actual-type type))) - -(defclass foreign-typedef (foreign-type-alias named-foreign-type) - ()) - -(defun follow-typedefs (type) - (if (typep type 'foreign-typedef) - (follow-typedefs (actual-type type)) - type)) - -(defmethod bare-struct-type-p ((type foreign-typedef)) - (bare-struct-type-p (follow-typedefs type))) - -(defun structure-slots (type) - "The hash table of slots for the structure type." - (slots (follow-typedefs type))) - -;;;# Type Translators -;;; -;;; Type translation is done with generic functions at runtime for -;;; subclasses of TRANSLATABLE-FOREIGN-TYPE. -;;; -;;; The main interface for defining type translations is through the -;;; generic functions TRANSLATE-{TO,FROM}-FOREIGN and -;;; FREE-TRANSLATED-OBJECT. - -(defclass translatable-foreign-type (foreign-type) ()) - -;;; ENHANCED-FOREIGN-TYPE is used to define translations on top of -;;; previously defined foreign types. -(defclass enhanced-foreign-type (translatable-foreign-type - foreign-type-alias) - ((unparsed-type :accessor unparsed-type))) - -;;; If actual-type isn't parsed already, let's parse it. This way we -;;; don't have to export PARSE-TYPE and users don't have to worry -;;; about this in DEFINE-FOREIGN-TYPE or DEFINE-PARSE-METHOD. -(defmethod initialize-instance :after ((type enhanced-foreign-type) &key) - (unless (typep (actual-type type) 'foreign-type) - (setf (actual-type type) (parse-type (actual-type type))))) - -(defmethod unparse-type ((type enhanced-foreign-type)) - (unparsed-type type)) - -;;; Checks NAMEs, not object identity. -(defun check-for-typedef-cycles (type) - (let ((seen (make-hash-table :test 'eq))) - (labels ((%check (cur-type) - (when (typep cur-type 'foreign-typedef) - (when (gethash (name cur-type) seen) - (simple-foreign-type-error type :default - "Detected cycle in type ~S." type)) - (setf (gethash (name cur-type) seen) t) - (%check (actual-type cur-type))))) - (%check type)))) - -;;; Only now we define PARSE-TYPE because it needs to do some extra -;;; work for ENHANCED-FOREIGN-TYPES. -(defun parse-type (type) - (let* ((spec (ensure-list type)) - (ptype (apply (find-type-parser (car spec)) (cdr spec)))) - (when (typep ptype 'foreign-typedef) - (check-for-typedef-cycles ptype)) - (when (typep ptype 'enhanced-foreign-type) - (setf (unparsed-type ptype) type)) - ptype)) - -(defun ensure-parsed-base-type (type) - (follow-typedefs - (if (typep type 'foreign-type) - type - (parse-type type)))) - -(defun canonicalize-foreign-type (type) - "Convert TYPE to a built-in type by following aliases. -Signals an error if the type cannot be resolved." - (canonicalize (parse-type type))) - -;;; Translate VALUE to a foreign object of the type represented by -;;; TYPE, which will be a subclass of TRANSLATABLE-FOREIGN-TYPE. -;;; Returns the foreign value and an optional second value which will -;;; be passed to FREE-TRANSLATED-OBJECT as the PARAM argument. -(defgeneric translate-to-foreign (value type) - (:method (value type) - (declare (ignore type)) - value)) - -(defgeneric translate-into-foreign-memory (value type pointer) - (:documentation - "Translate the Lisp value into the foreign memory location given by pointer. Return value is not used.") - (:argument-precedence-order type value pointer)) - -;;; Similar to TRANSLATE-TO-FOREIGN, used exclusively by -;;; (SETF FOREIGN-STRUCT-SLOT-VALUE). -(defgeneric translate-aggregate-to-foreign (ptr value type)) - -;;; Translate the foreign object VALUE from the type repsented by -;;; TYPE, which will be a subclass of TRANSLATABLE-FOREIGN-TYPE. -;;; Returns the converted Lisp value. -(defgeneric translate-from-foreign (value type) - (:argument-precedence-order type value) - (:method (value type) - (declare (ignore type)) - value)) - -;;; Free an object allocated by TRANSLATE-TO-FOREIGN. VALUE is a -;;; foreign object of the type represented by TYPE, which will be a -;;; TRANSLATABLE-FOREIGN-TYPE subclass. PARAM, if present, contains -;;; the second value returned by TRANSLATE-TO-FOREIGN, and is used to -;;; communicate between the two functions. -;;; -;;; FIXME: I don't think this PARAM argument is necessary anymore -;;; because the TYPE object can contain that information. [2008-12-31 LO] -(defgeneric free-translated-object (value type param) - (:method (value type param) - (declare (ignore value type param)))) - -;;;## Macroexpansion Time Translation -;;; -;;; The following EXPAND-* generic functions are similar to their -;;; TRANSLATE-* counterparts but are usually called at macroexpansion -;;; time. They offer a way to optimize the runtime translators. - -;;; This special variable is bound by the various :around methods -;;; below to the respective form generated by the above %EXPAND-* -;;; functions. This way, an expander can "bail out" by calling the -;;; next method. All 6 of the below-defined GFs have a default method -;;; that simply answers the rtf bound by the default :around method. -(defvar *runtime-translator-form*) - -;;; EXPAND-FROM-FOREIGN - -(defgeneric expand-from-foreign (value type) - (:method (value type) - (declare (ignore type)) - value)) - -(defmethod expand-from-foreign :around (value (type translatable-foreign-type)) - (let ((*runtime-translator-form* `(translate-from-foreign ,value ,type))) - (call-next-method))) - -(defmethod expand-from-foreign (value (type translatable-foreign-type)) - (declare (ignore value)) - *runtime-translator-form*) - -;;; EXPAND-TO-FOREIGN - -;; The second return value is used to tell EXPAND-TO-FOREIGN-DYN that -;; an unspecialized method was called. -(defgeneric expand-to-foreign (value type) - (:method (value type) - (declare (ignore type)) - (values value t))) - -(defmethod expand-to-foreign :around (value (type translatable-foreign-type)) - (let ((*runtime-translator-form* `(translate-to-foreign ,value ,type))) - (call-next-method))) - -(defmethod expand-to-foreign (value (type translatable-foreign-type)) - (declare (ignore value)) - (values *runtime-translator-form* t)) - -;;; EXPAND-INTO-FOREIGN-MEMORY - -(defgeneric expand-into-foreign-memory (value type ptr) - (:method (value type ptr) - (declare (ignore type)) - value)) - -(defmethod expand-into-foreign-memory :around - (value (type translatable-foreign-type) ptr) - (let ((*runtime-translator-form* - `(translate-into-foreign-memory ,value ,type ,ptr))) - (call-next-method))) - -(defmethod expand-into-foreign-memory (value (type translatable-foreign-type) ptr) - (declare (ignore value)) - *runtime-translator-form*) - -;;; EXPAND-TO-FOREIGN-DYN - -(defgeneric expand-to-foreign-dyn (value var body type) - (:method (value var body type) - (declare (ignore type)) - `(let ((,var ,value)) ,@body))) - -(defmethod expand-to-foreign-dyn :around - (value var body (type enhanced-foreign-type)) - (let ((*runtime-translator-form* - (with-unique-names (param) - `(multiple-value-bind (,var ,param) - (translate-to-foreign ,value ,type) - (unwind-protect - (progn ,@body) - (free-translated-object ,var ,type ,param)))))) - (call-next-method))) - -;;; If this method is called it means the user hasn't defined a -;;; to-foreign-dyn expansion, so we use the to-foreign expansion. -;;; -;;; However, we do so *only* if there's a specialized -;;; EXPAND-TO-FOREIGN for TYPE because otherwise we want to use the -;;; above *RUNTIME-TRANSLATOR-FORM* which includes a call to -;;; FREE-TRANSLATED-OBJECT. (Or else there would occur no translation -;;; at all.) -(defun foreign-expand-runtime-translator-or-binding (value var body type) - (multiple-value-bind (expansion default-etp-p) - (expand-to-foreign value type) - (if default-etp-p - *runtime-translator-form* - `(let ((,var ,expansion)) - ,@body)))) - -(defmethod expand-to-foreign-dyn (value var body (type enhanced-foreign-type)) - (foreign-expand-runtime-translator-or-binding value var body type)) - -;;; EXPAND-TO-FOREIGN-DYN-INDIRECT -;;; Like expand-to-foreign-dyn, but always give form that returns a -;;; pointer to the object, even if it's directly representable in -;;; CL, e.g. numbers. - -(defgeneric expand-to-foreign-dyn-indirect (value var body type) - (:method (value var body type) - (declare (ignore type)) - `(let ((,var ,value)) ,@body))) - -(defmethod expand-to-foreign-dyn-indirect :around - (value var body (type translatable-foreign-type)) - (let ((*runtime-translator-form* - `(with-foreign-object (,var ',(unparse-type type)) - (translate-into-foreign-memory ,value ,type ,var) - ,@body))) - (call-next-method))) - -(defmethod expand-to-foreign-dyn-indirect - (value var body (type foreign-pointer-type)) - `(with-foreign-object (,var :pointer) - (translate-into-foreign-memory ,value ,type ,var) - ,@body)) - -(defmethod expand-to-foreign-dyn-indirect - (value var body (type foreign-built-in-type)) - `(with-foreign-object (,var ,type) - (translate-into-foreign-memory ,value ,type ,var) - ,@body)) - -(defmethod expand-to-foreign-dyn-indirect - (value var body (type translatable-foreign-type)) - (foreign-expand-runtime-translator-or-binding value var body type)) - -(defmethod expand-to-foreign-dyn-indirect (value var body (type foreign-type-alias)) - (expand-to-foreign-dyn-indirect value var body (actual-type type))) - -;;; User interface for converting values from/to foreign using the -;;; type translators. The compiler macros use the expanders when -;;; possible. - -(defun convert-to-foreign (value type) - (translate-to-foreign value (parse-type type))) - -(define-compiler-macro convert-to-foreign (value type) - (if (constantp type) - (expand-to-foreign value (parse-type (eval type))) - `(translate-to-foreign ,value (parse-type ,type)))) - -(defun convert-from-foreign (value type) - (translate-from-foreign value (parse-type type))) - -(define-compiler-macro convert-from-foreign (value type) - (if (constantp type) - (expand-from-foreign value (parse-type (eval type))) - `(translate-from-foreign ,value (parse-type ,type)))) - -(defun convert-into-foreign-memory (value type ptr) - (translate-into-foreign-memory value (parse-type type) ptr)) - -(define-compiler-macro convert-into-foreign-memory (value type ptr) - (if (constantp type) - (expand-into-foreign-memory value (parse-type (eval type)) ptr) - `(translate-into-foreign-memory ,value (parse-type ,type) ,ptr))) - -(defun free-converted-object (value type param) - (free-translated-object value (parse-type type) param)) - -;;;# Enhanced typedefs - -(defclass enhanced-typedef (foreign-typedef) - ()) - -(defmethod translate-to-foreign (value (type enhanced-typedef)) - (translate-to-foreign value (actual-type type))) - -(defmethod translate-into-foreign-memory (value (type enhanced-typedef) pointer) - (translate-into-foreign-memory value (actual-type type) pointer)) - -(defmethod translate-from-foreign (value (type enhanced-typedef)) - (translate-from-foreign value (actual-type type))) - -(defmethod free-translated-object (value (type enhanced-typedef) param) - (free-translated-object value (actual-type type) param)) - -(defmethod expand-from-foreign (value (type enhanced-typedef)) - (expand-from-foreign value (actual-type type))) - -(defmethod expand-to-foreign (value (type enhanced-typedef)) - (expand-to-foreign value (actual-type type))) - -(defmethod expand-to-foreign-dyn (value var body (type enhanced-typedef)) - (expand-to-foreign-dyn value var body (actual-type type))) - -(defmethod expand-into-foreign-memory (value (type enhanced-typedef) ptr) - (expand-into-foreign-memory value (actual-type type) ptr)) - -;;;# User-defined Types and Translations. - -(defmacro define-foreign-type (name supers slots &rest options) - (multiple-value-bind (new-options simple-parser actual-type initargs) - (let ((keywords '(:simple-parser :actual-type :default-initargs))) - (apply #'values - (remove-if (lambda (opt) (member (car opt) keywords)) options) - (mapcar (lambda (kw) (cdr (assoc kw options))) keywords))) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (defclass ,name ,(or supers '(enhanced-foreign-type)) - ,slots - (:default-initargs ,@(when actual-type `(:actual-type ',actual-type)) - ,@initargs) - ,@new-options) - ,(when simple-parser - `(define-parse-method ,(car simple-parser) (&rest args) - (apply #'make-instance ',name args))) - ',name))) - -(defmacro defctype (name base-type &optional documentation) - "Utility macro for simple C-like typedefs." - (declare (ignore documentation)) - (warn-if-kw-or-belongs-to-cl name) - (let* ((btype (parse-type base-type)) - (dtype (if (typep btype 'enhanced-foreign-type) - 'enhanced-typedef - 'foreign-typedef))) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (notice-foreign-type - ',name (make-instance ',dtype :name ',name :actual-type ,btype))))) - -;;; For Verrazano. We memoize the type this way to help detect cycles. -(defmacro defctype* (name base-type) - "Like DEFCTYPE but defers instantiation until parse-time." - `(eval-when (:compile-toplevel :load-toplevel :execute) - (let (memoized-type) - (define-parse-method ,name () - (unless memoized-type - (setf memoized-type (make-instance 'foreign-typedef :name ',name - :actual-type nil) - (actual-type memoized-type) (parse-type ',base-type))) - memoized-type)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/enum.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/enum.lisp deleted file mode 100644 index d5ada97..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/enum.lisp +++ /dev/null @@ -1,369 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; enum.lisp --- Defining foreign constants as Lisp keywords. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -(in-package #:cffi) - -;; TODO the accessors names are rather inconsistent: -;; FOREIGN-ENUM-VALUE FOREIGN-BITFIELD-VALUE -;; FOREIGN-ENUM-KEYWORD FOREIGN-BITFIELD-SYMBOLS -;; FOREIGN-ENUM-KEYWORD-LIST FOREIGN-BITFIELD-SYMBOL-LIST -;; I'd rename them to: FOREIGN-*-KEY(S) and FOREIGN-*-ALL-KEYS -- attila - -;; TODO bitfield is a confusing name, because the C standard calls -;; the "int foo : 3" type as a bitfield. Maybe rename to defbitmask? -;; -- attila - -;;;# Foreign Constants as Lisp Keywords -;;; -;;; This module defines the DEFCENUM macro, which provides an -;;; interface for defining a type and associating a set of integer -;;; constants with keyword symbols for that type. -;;; -;;; The keywords are automatically translated to the appropriate -;;; constant for the type by a type translator when passed as -;;; arguments or a return value to a foreign function. - -(defclass foreign-enum (named-foreign-type enhanced-foreign-type) - ((keyword-values - :initform (error "Must specify KEYWORD-VALUES.") - :initarg :keyword-values - :reader keyword-values) - (value-keywords - :initform (error "Must specify VALUE-KEYWORDS.") - :initarg :value-keywords - :reader value-keywords)) - (:documentation "Describes a foreign enumerated type.")) - -(deftype enum-key () - '(and symbol (not null))) - -(defparameter +valid-enum-base-types+ *built-in-integer-types*) - -(defun parse-foreign-enum-like (type-name base-type values - &optional field-mode-p) - (let ((keyword-values (make-hash-table :test 'eq)) - (value-keywords (make-hash-table)) - (field-keywords (list)) - (bit-index->keyword (make-array 0 :adjustable t - :element-type t)) - (default-value (if field-mode-p 1 0)) - (most-extreme-value 0) - (has-negative-value? nil)) - (dolist (pair values) - (destructuring-bind (keyword &optional (value default-value valuep)) - (ensure-list pair) - (check-type keyword enum-key) - ;;(check-type value integer) - (when (> (abs value) (abs most-extreme-value)) - (setf most-extreme-value value)) - (when (minusp value) - (setf has-negative-value? t)) - (if field-mode-p - (if valuep - (when (and (>= value default-value) - (single-bit-p value)) - (setf default-value (ash value 1))) - (setf default-value (ash default-value 1))) - (setf default-value (1+ value))) - (if (gethash keyword keyword-values) - (error "A foreign enum cannot contain duplicate keywords: ~S." - keyword) - (setf (gethash keyword keyword-values) value)) - ;; This is completely arbitrary behaviour: we keep the last - ;; value->keyword mapping. I suppose the opposite would be - ;; just as good (keeping the first). Returning a list with all - ;; the keywords might be a solution too? Suggestions - ;; welcome. --luis - (setf (gethash value value-keywords) keyword) - (when (and field-mode-p - (single-bit-p value)) - (let ((bit-index (1- (integer-length value)))) - (push keyword field-keywords) - (when (<= (array-dimension bit-index->keyword 0) - bit-index) - (setf bit-index->keyword - (adjust-array bit-index->keyword (1+ bit-index) - :initial-element nil))) - (setf (aref bit-index->keyword bit-index) - keyword))))) - (if base-type - (progn - (setf base-type (canonicalize-foreign-type base-type)) - ;; I guess we don't lose much by not strictly adhering to - ;; the C standard here, and some libs out in the wild are - ;; already using e.g. :double. - #+nil - (assert (member base-type +valid-enum-base-types+ :test 'eq) () - "Invalid base type ~S for enum type ~S. Must be one of ~S." - base-type type-name +valid-enum-base-types+)) - ;; details: https://stackoverflow.com/questions/1122096/what-is-the-underlying-type-of-a-c-enum - (let ((bits (integer-length most-extreme-value))) - (setf base-type - (let ((most-uint-bits (load-time-value (* (foreign-type-size :unsigned-int) 8))) - (most-ulong-bits (load-time-value (* (foreign-type-size :unsigned-long) 8))) - (most-ulonglong-bits (load-time-value (* (foreign-type-size :unsigned-long-long) 8)))) - (or (if has-negative-value? - (cond - ((<= (1+ bits) most-uint-bits) - :int) - ((<= (1+ bits) most-ulong-bits) - :long) - ((<= (1+ bits) most-ulonglong-bits) - :long-long)) - (cond - ((<= bits most-uint-bits) - :unsigned-int) - ((<= bits most-ulong-bits) - :unsigned-long) - ((<= bits most-ulonglong-bits) - :unsigned-long-long))) - (error "Enum value ~S of enum ~S is too large to store." - most-extreme-value type-name)))))) - (values base-type keyword-values value-keywords - field-keywords (when field-mode-p - (alexandria:copy-array - bit-index->keyword :adjustable nil - :fill-pointer nil))))) - -(defun make-foreign-enum (type-name base-type values) - "Makes a new instance of the foreign-enum class." - (multiple-value-bind - (base-type keyword-values value-keywords) - (parse-foreign-enum-like type-name base-type values) - (make-instance 'foreign-enum - :name type-name - :actual-type (parse-type base-type) - :keyword-values keyword-values - :value-keywords value-keywords))) - -(defun %defcenum-like (name-and-options enum-list type-factory) - (discard-docstring enum-list) - (destructuring-bind (name &optional base-type) - (ensure-list name-and-options) - (let ((type (funcall type-factory name base-type enum-list))) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (notice-foreign-type ',name - ;; ,type is not enough here, someone needs to - ;; define it when we're being loaded from a fasl. - (,type-factory ',name ',base-type ',enum-list)) - ,@(remove nil - (mapcar (lambda (key) - (unless (keywordp key) - `(defconstant ,key ,(foreign-enum-value type key)))) - (foreign-enum-keyword-list type))))))) - -(defmacro defcenum (name-and-options &body enum-list) - "Define an foreign enumerated type." - (%defcenum-like name-and-options enum-list 'make-foreign-enum)) - -(defun hash-keys-to-list (ht) - (loop for k being the hash-keys in ht collect k)) - -(defun foreign-enum-keyword-list (enum-type) - "Return a list of KEYWORDS defined in ENUM-TYPE." - (hash-keys-to-list (keyword-values (ensure-parsed-base-type enum-type)))) - -;;; These [four] functions could be good canditates for compiler macros -;;; when the value or keyword is constant. I am not going to bother -;;; until someone has a serious performance need to do so though. --jamesjb -(defun %foreign-enum-value (type keyword &key errorp) - (check-type keyword enum-key) - (or (gethash keyword (keyword-values type)) - (when errorp - (error "~S is not defined as a keyword for enum type ~S." - keyword type)))) - -(defun foreign-enum-value (type keyword &key (errorp t)) - "Convert a KEYWORD into an integer according to the enum TYPE." - (let ((type-obj (ensure-parsed-base-type type))) - (if (not (typep type-obj 'foreign-enum)) - (error "~S is not a foreign enum type." type) - (%foreign-enum-value type-obj keyword :errorp errorp)))) - -(defun %foreign-enum-keyword (type value &key errorp) - (check-type value integer) - (or (gethash value (value-keywords type)) - (when errorp - (error "~S is not defined as a value for enum type ~S." - value type)))) - -(defun foreign-enum-keyword (type value &key (errorp t)) - "Convert an integer VALUE into a keyword according to the enum TYPE." - (let ((type-obj (ensure-parsed-base-type type))) - (if (not (typep type-obj 'foreign-enum)) - (error "~S is not a foreign enum type." type) - (%foreign-enum-keyword type-obj value :errorp errorp)))) - -(defmethod translate-to-foreign (value (type foreign-enum)) - (if (typep value 'enum-key) - (%foreign-enum-value type value :errorp t) - value)) - -(defmethod translate-into-foreign-memory - (value (type foreign-enum) pointer) - (setf (mem-aref pointer (unparse-type (actual-type type))) - (translate-to-foreign value type))) - -(defmethod translate-from-foreign (value (type foreign-enum)) - (%foreign-enum-keyword type value :errorp t)) - -(defmethod expand-to-foreign (value (type foreign-enum)) - (once-only (value) - `(if (typep ,value 'enum-key) - (%foreign-enum-value ,type ,value :errorp t) - ,value))) - -;;; There are two expansions necessary for an enum: first, the enum -;;; keyword needs to be translated to an int, and then the int needs -;;; to be made indirect. -(defmethod expand-to-foreign-dyn-indirect (value var body (type foreign-enum)) - (expand-to-foreign-dyn-indirect ; Make the integer indirect - (with-unique-names (feint) - (call-next-method value feint (list feint) type)) ; TRANSLATABLE-FOREIGN-TYPE method - var - body - (actual-type type))) - -;;;# Foreign Bitfields as Lisp keywords -;;; -;;; DEFBITFIELD is an abstraction similar to the one provided by DEFCENUM. -;;; With some changes to DEFCENUM, this could certainly be implemented on -;;; top of it. - -(defclass foreign-bitfield (foreign-enum) - ((field-keywords - :initform (error "Must specify FIELD-KEYWORDS.") - :initarg :field-keywords - :reader field-keywords) - (bit-index->keyword - :initform (error "Must specify BIT-INDEX->KEYWORD") - :initarg :bit-index->keyword - :reader bit-index->keyword)) - (:documentation "Describes a foreign bitfield type.")) - -(defun make-foreign-bitfield (type-name base-type values) - "Makes a new instance of the foreign-bitfield class." - (multiple-value-bind - (base-type keyword-values value-keywords - field-keywords bit-index->keyword) - (parse-foreign-enum-like type-name base-type values t) - (make-instance 'foreign-bitfield - :name type-name - :actual-type (parse-type base-type) - :keyword-values keyword-values - :value-keywords value-keywords - :field-keywords field-keywords - :bit-index->keyword bit-index->keyword))) - -(defmacro defbitfield (name-and-options &body masks) - "Define an foreign enumerated type." - (%defcenum-like name-and-options masks 'make-foreign-bitfield)) - -(defun foreign-bitfield-symbol-list (bitfield-type) - "Return a list of SYMBOLS defined in BITFIELD-TYPE." - (field-keywords (ensure-parsed-base-type bitfield-type))) - -(defun %foreign-bitfield-value (type symbols) - (declare (optimize speed)) - (labels ((process-one (symbol) - (check-type symbol symbol) - (or (gethash symbol (keyword-values type)) - (error "~S is not a valid symbol for bitfield type ~S." - symbol type)))) - (declare (dynamic-extent #'process-one)) - (cond - ((consp symbols) - (reduce #'logior symbols :key #'process-one)) - ((null symbols) - 0) - (t - (process-one symbols))))) - -(defun foreign-bitfield-value (type symbols) - "Convert a list of symbols into an integer according to the TYPE bitfield." - (let ((type-obj (ensure-parsed-base-type type))) - (assert (typep type-obj 'foreign-bitfield) () - "~S is not a foreign bitfield type." type) - (%foreign-bitfield-value type-obj symbols))) - -(define-compiler-macro foreign-bitfield-value (&whole form type symbols) - "Optimize for when TYPE and SYMBOLS are constant." - (declare (notinline foreign-bitfield-value)) - (if (and (constantp type) (constantp symbols)) - (foreign-bitfield-value (eval type) (eval symbols)) - form)) - -(defun %foreign-bitfield-symbols (type value) - (check-type value integer) - (check-type type foreign-bitfield) - (loop - :with bit-index->keyword = (bit-index->keyword type) - :for bit-index :from 0 :below (array-dimension bit-index->keyword 0) - :for mask = 1 :then (ash mask 1) - :for key = (aref bit-index->keyword bit-index) - :when (and key - (= (logand value mask) mask)) - :collect key)) - -(defun foreign-bitfield-symbols (type value) - "Convert an integer VALUE into a list of matching symbols according to -the bitfield TYPE." - (let ((type-obj (ensure-parsed-base-type type))) - (if (not (typep type-obj 'foreign-bitfield)) - (error "~S is not a foreign bitfield type." type) - (%foreign-bitfield-symbols type-obj value)))) - -(define-compiler-macro foreign-bitfield-symbols (&whole form type value) - "Optimize for when TYPE and SYMBOLS are constant." - (declare (notinline foreign-bitfield-symbols)) - (if (and (constantp type) (constantp value)) - `(quote ,(foreign-bitfield-symbols (eval type) (eval value))) - form)) - -(defmethod translate-to-foreign (value (type foreign-bitfield)) - (if (integerp value) - value - (%foreign-bitfield-value type (ensure-list value)))) - -(defmethod translate-from-foreign (value (type foreign-bitfield)) - (%foreign-bitfield-symbols type value)) - -(defmethod expand-to-foreign (value (type foreign-bitfield)) - (flet ((expander (value type) - `(if (integerp ,value) - ,value - (%foreign-bitfield-value ,type (ensure-list ,value))))) - (if (constantp value) - (eval (expander value type)) - (expander value type)))) - -(defmethod expand-from-foreign (value (type foreign-bitfield)) - (flet ((expander (value type) - `(%foreign-bitfield-symbols ,type ,value))) - (if (constantp value) - (eval (expander value type)) - (expander value type)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/features.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/features.lisp deleted file mode 100644 index 0cdc6ca..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/features.lisp +++ /dev/null @@ -1,111 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; features.lisp --- CFFI-specific features (DEPRECATED). -;;; -;;; Copyright (C) 2006-2007, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cl-user) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (pushnew :cffi *features*)) - -;;; CFFI-SYS backends take care of pushing the appropriate features to -;;; *features*. See each cffi-*.lisp file. -;;; -;;; Not anymore, I think we should use TRIVIAL-FEATURES for the -;;; platform features instead. Less pain. CFFI-FEATURES is now -;;; deprecated and this code will stay here for a while for backwards -;;; compatibility purposes, to be removed in a future release. - -(defpackage #:cffi-features - (:use #:cl) - (:export - #:cffi-feature-p - - ;; Features related to the CFFI-SYS backend. Why no-*? This - ;; reflects the hope that these symbols will go away completely - ;; meaning that at some point all lisps will support long-longs, - ;; the foreign-funcall primitive, etc... - #:no-long-long - #:no-foreign-funcall - #:no-stdcall - #:flat-namespace - - ;; Only SCL supports long-double... - ;;#:no-long-double - - ;; Features related to the operating system. - ;; More should be added. - #:darwin - #:unix - #:windows - - ;; Features related to the processor. - ;; More should be added. - #:ppc32 - #:x86 - #:x86-64 - #:sparc - #:sparc64 - #:hppa - #:hppa64)) - -(in-package #:cffi-features) - -(defun cffi-feature-p (feature-expression) - "Matches a FEATURE-EXPRESSION against those symbols in *FEATURES* -that belong to the CFFI-FEATURES package." - (when (eql feature-expression t) - (return-from cffi-feature-p t)) - (let ((features-package (find-package '#:cffi-features))) - (flet ((cffi-feature-eq (name feature-symbol) - (and (eq (symbol-package feature-symbol) features-package) - (string= name (symbol-name feature-symbol))))) - (etypecase feature-expression - (symbol - (not (null (member (symbol-name feature-expression) *features* - :test #'cffi-feature-eq)))) - (cons - (ecase (first feature-expression) - (:and (every #'cffi-feature-p (rest feature-expression))) - (:or (some #'cffi-feature-p (rest feature-expression))) - (:not (not (cffi-feature-p (cadr feature-expression)))))))))) - -;;; for backwards compatibility -(mapc (lambda (sym) (pushnew sym *features*)) - '(#+darwin darwin - #+unix unix - #+windows windows - #+ppc ppc32 - #+x86 x86 - #+x86-64 x86-64 - #+sparc sparc - #+sparc64 sparc64 - #+hppa hppa - #+hppa64 hppa64 - #+cffi-sys::no-long-long no-long-long - #+cffi-sys::flat-namespace flat-namespace - #+cffi-sys::no-foreign-funcall no-foreign-funcall - #+cffi-sys::no-stdcall no-stdcall - )) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/foreign-vars.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/foreign-vars.lisp deleted file mode 100644 index 4b6ba3b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/foreign-vars.lisp +++ /dev/null @@ -1,90 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; foreign-vars.lisp --- High-level interface to foreign globals. -;;; -;;; Copyright (C) 2005-2008, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi) - -;;;# Accessing Foreign Globals - -;;; Called by FOREIGN-OPTIONS in functions.lisp. -(defun parse-defcvar-options (options) - (destructuring-bind (&key (library :default) read-only) options - (list :library library :read-only read-only))) - -(defun get-var-pointer (symbol) - "Return a pointer to the foreign global variable relative to SYMBOL." - (foreign-symbol-pointer (get symbol 'foreign-var-name) - :library (get symbol 'foreign-var-library))) - -;;; Note: this will lookup not only variables but also functions. -(defun foreign-symbol-pointer (name &key (library :default)) - (check-type name string) - (%foreign-symbol-pointer - name (if (eq library :default) - :default - (foreign-library-handle - (get-foreign-library library))))) - -(defun fs-pointer-or-lose (foreign-name library) - "Like foreign-symbol-ptr but throws an error instead of -returning nil when foreign-name is not found." - (or (foreign-symbol-pointer foreign-name :library library) - (error "Trying to access undefined foreign variable ~S." foreign-name))) - -(defmacro defcvar (name-and-options type &optional documentation) - "Define a foreign global variable." - (multiple-value-bind (lisp-name foreign-name options) - (parse-name-and-options name-and-options t) - (let ((fn (symbolicate '#:%var-accessor- lisp-name)) - (read-only (getf options :read-only)) - (library (getf options :library))) - ;; We can't really setf an aggregate type. - (when (aggregatep (parse-type type)) - (setq read-only t)) - `(progn - (setf (documentation ',lisp-name 'variable) ,documentation) - ;; Save foreign-name and library for posterior access by - ;; GET-VAR-POINTER. - (setf (get ',lisp-name 'foreign-var-name) ,foreign-name) - (setf (get ',lisp-name 'foreign-var-library) ',library) - ;; Getter - (defun ,fn () - (mem-ref (fs-pointer-or-lose ,foreign-name ',library) ',type)) - ;; Setter - (defun (setf ,fn) (value) - ,(if read-only '(declare (ignore value)) (values)) - ,(if read-only - `(error ,(format nil - "Trying to modify read-only foreign var: ~A." - lisp-name)) - `(setf (mem-ref (fs-pointer-or-lose ,foreign-name ',library) - ',type) - value))) - ;; While most Lisps already expand DEFINE-SYMBOL-MACRO to an - ;; EVAL-WHEN form like this, that is not required by the - ;; standard so we do it ourselves. - (eval-when (:compile-toplevel :load-toplevel :execute) - (define-symbol-macro ,lisp-name (,fn))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/functions.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/functions.lisp deleted file mode 100644 index 5499b68..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/functions.lisp +++ /dev/null @@ -1,441 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; functions.lisp --- High-level interface to foreign functions. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; Copyright (C) 2005-2007, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi) - -;;;# Calling Foreign Functions -;;; -;;; FOREIGN-FUNCALL is the main primitive for calling foreign -;;; functions. It converts each argument based on the installed -;;; translators for its type, then passes the resulting list to -;;; CFFI-SYS:%FOREIGN-FUNCALL. -;;; -;;; For implementation-specific reasons, DEFCFUN doesn't use -;;; FOREIGN-FUNCALL directly and might use something else (passed to -;;; TRANSLATE-OBJECTS as the CALL-FORM argument) instead of -;;; CFFI-SYS:%FOREIGN-FUNCALL to call the foreign-function. - -(defun translate-objects (syms args types rettype call-form &optional indirect) - "Helper function for FOREIGN-FUNCALL and DEFCFUN. If 'indirect is T, all arguments are represented by foreign pointers, even those that can be represented by CL objects." - (if (null args) - (expand-from-foreign call-form (parse-type rettype)) - (funcall - (if indirect - #'expand-to-foreign-dyn-indirect - #'expand-to-foreign-dyn) - (car args) (car syms) - (list (translate-objects (cdr syms) (cdr args) - (cdr types) rettype call-form indirect)) - (parse-type (car types))))) - -(defun parse-args-and-types (args) - "Returns 4 values: types, canonicalized types, args and return type." - (let* ((len (length args)) - (return-type (if (oddp len) (lastcar args) :void))) - (loop repeat (floor len 2) - for (type arg) on args by #'cddr - collect type into types - collect (canonicalize-foreign-type type) into ctypes - collect arg into fargs - finally (return (values types ctypes fargs return-type))))) - -;;; While the options passed directly to DEFCFUN/FOREIGN-FUNCALL have -;;; precedence, we also grab its library's options, if possible. -(defun parse-function-options (options &key pointer) - (destructuring-bind (&key (library :default libraryp) - (cconv nil cconv-p) - (calling-convention cconv calling-convention-p) - (convention calling-convention)) - options - (when cconv-p - (warn-obsolete-argument :cconv :convention)) - (when calling-convention-p - (warn-obsolete-argument :calling-convention :convention)) - (list* :convention - (or convention - (when libraryp - (let ((lib-options (foreign-library-options - (get-foreign-library library)))) - (getf lib-options :convention))) - :cdecl) - ;; Don't pass the library option if we're dealing with - ;; FOREIGN-FUNCALL-POINTER. - (unless pointer - (list :library library))))) - -(defun structure-by-value-p (ctype) - "A structure or union is to be called or returned by value." - (let ((actual-type (ensure-parsed-base-type ctype))) - (or (and (typep actual-type 'foreign-struct-type) - (not (bare-struct-type-p actual-type))) - #+cffi::no-long-long (typep actual-type 'emulated-llong-type)))) - -(defun fn-call-by-value-p (argument-types return-type) - "One or more structures in the arguments or return from the function are called by value." - (or (some 'structure-by-value-p argument-types) - (structure-by-value-p return-type))) - -(defvar *foreign-structures-by-value* - (lambda (&rest args) - (declare (ignore args)) - (restart-case - (error "Unable to call structures by value without cffi-libffi loaded.") - (load-cffi-libffi () :report "Load cffi-libffi." - (asdf:operate 'asdf:load-op 'cffi-libffi)))) - "A function that produces a form suitable for calling structures by value.") - -(defun foreign-funcall-form (thing options args pointerp) - (multiple-value-bind (types ctypes fargs rettype) - (parse-args-and-types args) - (let ((syms (make-gensym-list (length fargs))) - (fsbvp (fn-call-by-value-p ctypes rettype))) - (if fsbvp - ;; Structures by value call through *foreign-structures-by-value* - (funcall *foreign-structures-by-value* - thing - fargs - syms - types - rettype - ctypes - pointerp) - (translate-objects - syms fargs types rettype - `(,(if pointerp '%foreign-funcall-pointer '%foreign-funcall) - ;; No structures by value, direct call - ,thing - (,@(mapcan #'list ctypes syms) - ,(canonicalize-foreign-type rettype)) - ,@(parse-function-options options :pointer pointerp))))))) - -(defmacro foreign-funcall (name-and-options &rest args) - "Wrapper around %FOREIGN-FUNCALL that translates its arguments." - (let ((name (car (ensure-list name-and-options))) - (options (cdr (ensure-list name-and-options)))) - (foreign-funcall-form name options args nil))) - -(defmacro foreign-funcall-pointer (pointer options &rest args) - (foreign-funcall-form pointer options args t)) - -(defun promote-varargs-type (builtin-type) - "Default argument promotions." - (case builtin-type - (:float :double) - ((:char :short) :int) - ((:unsigned-char :unsigned-short) :unsigned-int) - (t builtin-type))) - -;; If cffi-sys doesn't provide a %foreign-funcall-varargs macros we -;; define one that use %foreign-funcall. -(eval-when (:compile-toplevel :load-toplevel :execute) - (unless (fboundp '%foreign-funcall-varargs) - (defmacro %foreign-funcall-varargs (name fixed-args varargs - &rest args &key convention library) - (declare (ignore convention library)) - `(%foreign-funcall ,name ,(append fixed-args varargs) ,@args))) - (unless (fboundp '%foreign-funcall-pointer-varargs) - (defmacro %foreign-funcall-pointer-varargs (pointer fixed-args varargs - &rest args &key convention) - (declare (ignore convention)) - `(%foreign-funcall-pointer ,pointer ,(append fixed-args varargs) ,@args)))) - -(defun foreign-funcall-varargs-form (thing options fixed-args varargs pointerp) - (multiple-value-bind (fixed-types fixed-ctypes fixed-fargs) - (parse-args-and-types fixed-args) - (multiple-value-bind (varargs-types varargs-ctypes varargs-fargs rettype) - (parse-args-and-types varargs) - (let ((fixed-syms (make-gensym-list (length fixed-fargs))) - (varargs-syms (make-gensym-list (length varargs-fargs)))) - (translate-objects - (append fixed-syms varargs-syms) - (append fixed-fargs varargs-fargs) - (append fixed-types varargs-types) - rettype - `(,(if pointerp '%foreign-funcall-pointer-varargs '%foreign-funcall-varargs) - ,thing - ,(mapcan #'list fixed-ctypes fixed-syms) - ,(append - (mapcan #'list - (mapcar #'promote-varargs-type varargs-ctypes) - (loop for sym in varargs-syms - and type in varargs-ctypes - if (eq type :float) - collect `(float ,sym 1.0d0) - else collect sym)) - (list (canonicalize-foreign-type rettype))) - ,@options)))))) - -(defmacro foreign-funcall-varargs (name-and-options fixed-args - &rest varargs) - "Wrapper around %FOREIGN-FUNCALL that translates its arguments -and does type promotion for the variadic arguments." - (let ((name (car (ensure-list name-and-options))) - (options (cdr (ensure-list name-and-options)))) - (foreign-funcall-varargs-form name options fixed-args varargs nil))) - -(defmacro foreign-funcall-pointer-varargs (pointer options fixed-args - &rest varargs) - "Wrapper around %FOREIGN-FUNCALL-POINTER that translates its -arguments and does type promotion for the variadic arguments." - (foreign-funcall-varargs-form pointer options fixed-args varargs t)) - -;;;# Defining Foreign Functions -;;; -;;; The DEFCFUN macro provides a declarative interface for defining -;;; Lisp functions that call foreign functions. - -;; If cffi-sys doesn't provide a defcfun-helper-forms, -;; we define one that uses %foreign-funcall. -(eval-when (:compile-toplevel :load-toplevel :execute) - (unless (fboundp 'defcfun-helper-forms) - (defun defcfun-helper-forms (name lisp-name rettype args types options) - (declare (ignore lisp-name)) - (values - '() - `(%foreign-funcall ,name ,(append (mapcan #'list types args) - (list rettype)) - ,@options))))) - -(defun %defcfun (lisp-name foreign-name return-type args options docstring) - (let* ((arg-names (mapcar #'first args)) - (arg-types (mapcar #'second args)) - (syms (make-gensym-list (length args))) - (call-by-value (fn-call-by-value-p arg-types return-type))) - (multiple-value-bind (prelude caller) - (if call-by-value - (values nil nil) - (defcfun-helper-forms - foreign-name lisp-name (canonicalize-foreign-type return-type) - syms (mapcar #'canonicalize-foreign-type arg-types) options)) - `(progn - ,prelude - (defun ,lisp-name ,arg-names - ,@(ensure-list docstring) - ,(if call-by-value - `(foreign-funcall - ,(cons foreign-name options) - ,@(append (mapcan #'list arg-types arg-names) - (list return-type))) - (translate-objects - syms arg-names arg-types return-type caller))))))) - -(defun %defcfun-varargs (lisp-name foreign-name return-type args options doc) - (with-unique-names (varargs) - (let ((arg-names (mapcar #'car args))) - `(defmacro ,lisp-name (,@arg-names &rest ,varargs) - ,@(ensure-list doc) - `(foreign-funcall-varargs - ,'(,foreign-name ,@options) - ,,`(list ,@(loop for (name type) in args - collect `',type collect name)) - ,@,varargs - ,',return-type))))) - -(defgeneric translate-underscore-separated-name (name) - (:method ((name string)) - (values (intern (canonicalize-symbol-name-case (substitute #\- #\_ name))))) - (:method ((name symbol)) - (substitute #\_ #\- (string-downcase (symbol-name name))))) - -(defun collapse-prefix (l special-words) - (unless (null l) - (multiple-value-bind (newpre skip) (check-prefix l special-words) - (cons newpre (collapse-prefix (nthcdr skip l) special-words))))) - -(defun check-prefix (l special-words) - (let ((pl (loop for i from (1- (length l)) downto 0 - collect (apply #'concatenate 'simple-string (butlast l i))))) - (loop for w in special-words - for p = (position-if #'(lambda (s) (string= s w)) pl) - when p do (return-from check-prefix (values (nth p pl) (1+ p)))) - (values (first l) 1))) - -(defgeneric translate-camelcase-name (name &key upper-initial-p special-words) - (:method ((name string) &key upper-initial-p special-words) - (declare (ignore upper-initial-p)) - (values (intern (reduce #'(lambda (s1 s2) - (concatenate 'simple-string s1 "-" s2)) - (mapcar #'string-upcase - (collapse-prefix - (split-if #'(lambda (ch) - (or (upper-case-p ch) - (digit-char-p ch))) - name) - special-words)))))) - (:method ((name symbol) &key upper-initial-p special-words) - (apply #'concatenate - 'string - (loop for str in (split-if #'(lambda (ch) (eq ch #\-)) - (string name) - :elide) - for first-word-p = t then nil - for e = (member str special-words - :test #'equal :key #'string-upcase) - collect (cond - ((and first-word-p (not upper-initial-p)) - (string-downcase str)) - (e (first e)) - (t (string-capitalize str))))))) - -(defgeneric translate-name-from-foreign (foreign-name package &optional varp) - (:method (foreign-name package &optional varp) - (declare (ignore package)) - (let ((sym (translate-underscore-separated-name foreign-name))) - (if varp - (values (intern (format nil "*~A*" - (canonicalize-symbol-name-case - (symbol-name sym))))) - sym)))) - -(defgeneric translate-name-to-foreign (lisp-name package &optional varp) - (:method (lisp-name package &optional varp) - (declare (ignore package)) - (let ((name (translate-underscore-separated-name lisp-name))) - (if varp - (string-trim '(#\*) name) - name)))) - -(defun lisp-name (spec varp) - (check-type spec string) - (translate-name-from-foreign spec *package* varp)) - -(defun foreign-name (spec varp) - (check-type spec (and symbol (not null))) - (translate-name-to-foreign spec *package* varp)) - -(defun foreign-options (opts varp) - (if varp - (funcall 'parse-defcvar-options opts) - (parse-function-options opts))) - -(defun lisp-name-p (name) - (and name (symbolp name) (not (keywordp name)))) - -(defun %parse-name-and-options (spec varp) - (cond - ((stringp spec) - (values (lisp-name spec varp) spec nil)) - ((symbolp spec) - (assert (not (null spec))) - (values spec (foreign-name spec varp) nil)) - ((and (consp spec) (stringp (first spec))) - (destructuring-bind (foreign-name &rest options) - spec - (cond - ((or (null options) - (keywordp (first options))) - (values (lisp-name foreign-name varp) foreign-name options)) - (t - (assert (lisp-name-p (first options))) - (values (first options) foreign-name (rest options)))))) - ((and (consp spec) (lisp-name-p (first spec))) - (destructuring-bind (lisp-name &rest options) - spec - (cond - ((or (null options) - (keywordp (first options))) - (values lisp-name (foreign-name spec varp) options)) - (t - (assert (stringp (first options))) - (values lisp-name (first options) (rest options)))))) - (t - (error "Not a valid foreign function specifier: ~A" spec)))) - -;;; DEFCFUN's first argument has can have the following syntax: -;;; -;;; 1. string -;;; 2. symbol -;;; 3. \( string [symbol] options* ) -;;; 4. \( symbol [string] options* ) -;;; -;;; The string argument denotes the foreign function's name. The -;;; symbol argument is used to name the Lisp function. If one isn't -;;; present, its name is derived from the other. See the user -;;; documentation for an explanation of the derivation rules. -(defun parse-name-and-options (spec &optional varp) - (multiple-value-bind (lisp-name foreign-name options) - (%parse-name-and-options spec varp) - (values lisp-name foreign-name (foreign-options options varp)))) - -;;; If we find a &REST token at the end of ARGS, it means this is a -;;; varargs foreign function therefore we define a lisp macro using -;;; %DEFCFUN-VARARGS. Otherwise, a lisp function is defined with -;;; %DEFCFUN. -(defmacro defcfun (name-and-options return-type &body args) - "Defines a Lisp function that calls a foreign function." - (let ((docstring (when (stringp (car args)) (pop args)))) - (multiple-value-bind (lisp-name foreign-name options) - (parse-name-and-options name-and-options) - (if (eq (lastcar args) '&rest) - (%defcfun-varargs lisp-name foreign-name return-type - (butlast args) options docstring) - (%defcfun lisp-name foreign-name return-type args options - docstring))))) - -;;;# Defining Callbacks - -(defun inverse-translate-objects (args types declarations rettype call) - `(let (,@(loop for arg in args and type in types - collect (list arg (expand-from-foreign - arg (parse-type type))))) - ,@declarations - ,(expand-to-foreign call (parse-type rettype)))) - -(defun parse-defcallback-options (options) - (destructuring-bind (&key (cconv :cdecl cconv-p) - (calling-convention cconv calling-convention-p) - (convention calling-convention)) - options - (when cconv-p - (warn-obsolete-argument :cconv :convention)) - (when calling-convention-p - (warn-obsolete-argument :calling-convention :convention)) - (list :convention convention))) - -(defmacro defcallback (name-and-options return-type args &body body) - (multiple-value-bind (body declarations) - (parse-body body :documentation t) - (let ((arg-names (mapcar #'car args)) - (arg-types (mapcar #'cadr args)) - (name (car (ensure-list name-and-options))) - (options (cdr (ensure-list name-and-options)))) - `(progn - (%defcallback ,name ,(canonicalize-foreign-type return-type) - ,arg-names ,(mapcar #'canonicalize-foreign-type arg-types) - ,(inverse-translate-objects - arg-names arg-types declarations return-type - `(block ,name ,@body)) - ,@(parse-defcallback-options options)) - ',name)))) - -(declaim (inline get-callback)) -(defun get-callback (symbol) - (%callback symbol)) - -(defmacro callback (name) - `(%callback ',name)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/libraries.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/libraries.lisp deleted file mode 100644 index 7a554d1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/libraries.lisp +++ /dev/null @@ -1,458 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; libraries.lisp --- Finding and loading foreign libraries. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; Copyright (C) 2006-2007, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi) - -;;;# Finding Foreign Libraries -;;; -;;; We offer two ways for the user of a CFFI library to define -;;; his/her own library directories: *FOREIGN-LIBRARY-DIRECTORIES* -;;; for regular libraries and *DARWIN-FRAMEWORK-DIRECTORIES* for -;;; Darwin frameworks. -;;; -;;; These two special variables behave similarly to -;;; ASDF:*CENTRAL-REGISTRY* as its arguments are evaluated before -;;; being used. We used our MINI-EVAL instead of the full-blown EVAL -;;; and the evaluated form should yield a single pathname or a list of -;;; pathnames. -;;; -;;; Only after failing to find a library through the normal ways -;;; (eg: on Linux LD_LIBRARY_PATH, /etc/ld.so.cache, /usr/lib/, /lib) -;;; do we try to find the library ourselves. - -(defun explode-path-environment-variable (name) - (mapcar #'uiop:ensure-directory-pathname - (split-if (lambda (c) (eql #\: c)) - (uiop:getenv name) - :elide))) - -(defun darwin-fallback-library-path () - (or (explode-path-environment-variable "DYLD_FALLBACK_LIBRARY_PATH") - (list (merge-pathnames #p"lib/" (user-homedir-pathname)) - #p"/opt/local/lib/" - #p"/usr/local/lib/" - #p"/usr/lib/"))) - -(defvar *foreign-library-directories* - (if (featurep :darwin) - '((explode-path-environment-variable "LD_LIBRARY_PATH") - (explode-path-environment-variable "DYLD_LIBRARY_PATH") - (uiop:getcwd) - (darwin-fallback-library-path)) - '()) - "List onto which user-defined library paths can be pushed.") - -(defun fallback-darwin-framework-directories () - (or (explode-path-environment-variable "DYLD_FALLBACK_FRAMEWORK_PATH") - (list (uiop:getcwd) - (merge-pathnames #p"Library/Frameworks/" (user-homedir-pathname)) - #p"/Library/Frameworks/" - #p"/System/Library/Frameworks/"))) - -(defvar *darwin-framework-directories* - '((explode-path-environment-variable "DYLD_FRAMEWORK_PATH") - (fallback-darwin-framework-directories)) - "List of directories where Frameworks are searched for.") - -(defun mini-eval (form) - "Simple EVAL-like function to evaluate the elements of -*FOREIGN-LIBRARY-DIRECTORIES* and *DARWIN-FRAMEWORK-DIRECTORIES*." - (typecase form - (cons (apply (car form) (mapcar #'mini-eval (cdr form)))) - (symbol (symbol-value form)) - (t form))) - -(defun parse-directories (list) - (mappend (compose #'ensure-list #'mini-eval) list)) - -(defun find-file (path directories) - "Searches for PATH in a list of DIRECTORIES and returns the first it finds." - (some (lambda (directory) (probe-file (merge-pathnames path directory))) - directories)) - -(defun find-darwin-framework (framework-name) - "Searches for FRAMEWORK-NAME in *DARWIN-FRAMEWORK-DIRECTORIES*." - (dolist (directory (parse-directories *darwin-framework-directories*)) - (let ((path (make-pathname - :name framework-name - :directory - (append (pathname-directory directory) - (list (format nil "~A.framework" framework-name)))))) - (when (probe-file path) - (return-from find-darwin-framework path))))) - -;;;# Defining Foreign Libraries -;;; -;;; Foreign libraries can be defined using the -;;; DEFINE-FOREIGN-LIBRARY macro. Example usage: -;;; -;;; (define-foreign-library opengl -;;; (:darwin (:framework "OpenGL")) -;;; (:unix (:or "libGL.so" "libGL.so.1" -;;; #p"/myhome/mylibGL.so")) -;;; (:windows "opengl32.dll") -;;; ;; an hypothetical example of a particular platform -;;; ((:and :some-system :some-cpu) "libGL-support.lib") -;;; ;; if no other clauses apply, this one will and a type will be -;;; ;; automagically appended to the name passed to :default -;;; (t (:default "libGL"))) -;;; -;;; This information is stored in the *FOREIGN-LIBRARIES* hashtable -;;; and when the library is loaded through LOAD-FOREIGN-LIBRARY (or -;;; USE-FOREIGN-LIBRARY) the first clause matched by FEATUREP is -;;; processed. - -(defvar *foreign-libraries* (make-hash-table :test 'eq) - "Hashtable of defined libraries.") - -(defclass foreign-library () - ((name :initform nil :initarg :name :accessor foreign-library-name) - (type :initform :system :initarg :type) - (spec :initarg :spec) - (options :initform nil :initarg :options) - (handle :initform nil :initarg :handle :accessor foreign-library-handle) - (pathname :initform nil))) - -(defmethod print-object ((library foreign-library) stream) - (with-slots (name pathname) library - (print-unreadable-object (library stream :type t) - (when name - (format stream "~A" name)) - (when pathname - (format stream " ~S" (file-namestring pathname)))))) - -(define-condition foreign-library-undefined-error (error) - ((name :initarg :name :reader fl-name)) - (:report (lambda (c s) - (format s "Undefined foreign library: ~S" - (fl-name c))))) - -(defun get-foreign-library (lib) - "Look up a library by NAME, signalling an error if not found." - (if (typep lib 'foreign-library) - lib - (or (gethash lib *foreign-libraries*) - (error 'foreign-library-undefined-error :name lib)))) - -(defun (setf get-foreign-library) (value name) - (setf (gethash name *foreign-libraries*) value)) - -(defun foreign-library-type (lib) - (slot-value (get-foreign-library lib) 'type)) - -(defun foreign-library-pathname (lib) - (slot-value (get-foreign-library lib) 'pathname)) - -(defun %foreign-library-spec (lib) - (assoc-if (lambda (feature) - (or (eq feature t) - (featurep feature))) - (slot-value lib 'spec))) - -(defun foreign-library-spec (lib) - (second (%foreign-library-spec lib))) - -(defun foreign-library-options (lib) - (append (cddr (%foreign-library-spec lib)) - (slot-value lib 'options))) - -(defun foreign-library-search-path (lib) - (loop for (opt val) on (foreign-library-options lib) by #'cddr - when (eql opt :search-path) - append (ensure-list val) into search-path - finally (return (mapcar #'pathname search-path)))) - -(defun foreign-library-loaded-p (lib) - (not (null (foreign-library-handle (get-foreign-library lib))))) - -(defun list-foreign-libraries (&key (loaded-only t) type) - "Return a list of defined foreign libraries. -If LOADED-ONLY is non-null only loaded libraries are returned. -TYPE restricts the output to a specific library type: if NIL -all libraries are returned." - (let ((libs (hash-table-values *foreign-libraries*))) - (remove-if (lambda (lib) - (or (and type - (not (eql type (foreign-library-type lib)))) - (and loaded-only - (not (foreign-library-loaded-p lib))))) - libs))) - -;; :CONVENTION, :CALLING-CONVENTION and :CCONV are coalesced, -;; the former taking priority -;; options with NULL values are removed -(defun clean-spec-up (spec) - (mapcar (lambda (x) - (list* (first x) (second x) - (let* ((opts (cddr x)) - (cconv (getf opts :cconv)) - (calling-convention (getf opts :calling-convention)) - (convention (getf opts :convention)) - (search-path (getf opts :search-path))) - (remf opts :cconv) (remf opts :calling-convention) - (when cconv - (warn-obsolete-argument :cconv :convention)) - (when calling-convention - (warn-obsolete-argument :calling-convention - :convention)) - (setf (getf opts :convention) - (or convention calling-convention cconv)) - (setf (getf opts :search-path) - (mapcar #'pathname (ensure-list search-path))) - (loop for (opt val) on opts by #'cddr - when val append (list opt val) into new-opts - finally (return new-opts))))) - spec)) - -(defmethod initialize-instance :after - ((lib foreign-library) &key search-path - (cconv :cdecl cconv-p) - (calling-convention cconv calling-convention-p) - (convention calling-convention)) - (with-slots (type options spec) lib - (check-type type (member :system :test :grovel-wrapper)) - (setf spec (clean-spec-up spec)) - (let ((all-options - (apply #'append options (mapcar #'cddr spec)))) - (assert (subsetp (loop for (key . nil) on all-options by #'cddr - collect key) - '(:convention :search-path))) - (when cconv-p - (warn-obsolete-argument :cconv :convention)) - (when calling-convention-p - (warn-obsolete-argument :calling-convention :convention)) - (flet ((set-option (key value) - (when value (setf (getf options key) value)))) - (set-option :convention convention) - (set-option :search-path - (mapcar #'pathname (ensure-list search-path))))))) - -(defun register-foreign-library (name spec &rest options) - (let ((old-handle - (when-let ((old-lib (gethash name *foreign-libraries*))) - (foreign-library-handle old-lib)))) - (setf (get-foreign-library name) - (apply #'make-instance 'foreign-library - :name name - :spec spec - :handle old-handle - options)) - name)) - -(defmacro define-foreign-library (name-and-options &body pairs) - "Defines a foreign library NAME that can be posteriorly used with -the USE-FOREIGN-LIBRARY macro." - (destructuring-bind (name . options) - (ensure-list name-and-options) - (check-type name symbol) - `(register-foreign-library ',name ',pairs ,@options))) - -;;;# LOAD-FOREIGN-LIBRARY-ERROR condition -;;; -;;; The various helper functions that load foreign libraries can -;;; signal this error when something goes wrong. We ignore the host's -;;; error. We should probably reuse its error message. - -(define-condition load-foreign-library-error (simple-error) - ()) - -(defun read-new-value () - (format *query-io* "~&Enter a new value (unevaluated): ") - (force-output *query-io*) - (read *query-io*)) - -(defun fl-error (control &rest arguments) - (error 'load-foreign-library-error - :format-control control - :format-arguments arguments)) - -;;;# Loading Foreign Libraries - -(defun load-darwin-framework (name framework-name) - "Tries to find and load a darwin framework in one of the directories -in *DARWIN-FRAMEWORK-DIRECTORIES*. If unable to find FRAMEWORK-NAME, -it signals a LOAD-FOREIGN-LIBRARY-ERROR." - (let ((framework (find-darwin-framework framework-name))) - (if framework - (load-foreign-library-path name (native-namestring framework)) - (fl-error "Unable to find framework ~A" framework-name)))) - -(defun report-simple-error (name error) - (fl-error "Unable to load foreign library (~A).~% ~A" - name - (format nil "~?" (simple-condition-format-control error) - (simple-condition-format-arguments error)))) - -;;; FIXME: haven't double checked whether all Lisps signal a -;;; SIMPLE-ERROR on %load-foreign-library failure. In any case they -;;; should be throwing a more specific error. -(defun load-foreign-library-path (name path &optional search-path) - "Tries to load PATH using %LOAD-FOREIGN-LIBRARY which should try and -find it using the OS's usual methods. If that fails we try to find it -ourselves." - (handler-case - (values (%load-foreign-library name path) - (pathname path)) - (simple-error (error) - (let ((dirs (parse-directories *foreign-library-directories*))) - (if-let (file (find-file path (append search-path dirs))) - (handler-case - (values (%load-foreign-library name (native-namestring file)) - file) - (simple-error (error) - (report-simple-error name error))) - (report-simple-error name error)))))) - -(defun try-foreign-library-alternatives (name library-list &optional search-path) - "Goes through a list of alternatives and only signals an error when -none of alternatives were successfully loaded." - (dolist (lib library-list) - (multiple-value-bind (handle pathname) - (ignore-errors (load-foreign-library-helper name lib search-path)) - (when handle - (return-from try-foreign-library-alternatives - (values handle pathname))))) - ;; Perhaps we should show the error messages we got for each - ;; alternative if we can figure out a nice way to do that. - (fl-error "Unable to load any of the alternatives:~% ~S" library-list)) - -(defparameter *cffi-feature-suffix-map* - '((:windows . ".dll") - (:darwin . ".dylib") - (:unix . ".so") - (t . ".so")) - "Mapping of OS feature keywords to shared library suffixes.") - -(defun default-library-suffix () - "Return a string to use as default library suffix based on the -operating system. This is used to implement the :DEFAULT option. -This will need to be extended as we test on more OSes." - (or (cdr (assoc-if #'featurep *cffi-feature-suffix-map*)) - (fl-error "Unable to determine the default library suffix on this OS."))) - -(defun load-foreign-library-helper (name thing &optional search-path) - (etypecase thing - ((or pathname string) - (load-foreign-library-path name (filter-pathname thing) search-path)) - (cons - (ecase (first thing) - (:framework (load-darwin-framework name (second thing))) - (:default - (unless (stringp (second thing)) - (fl-error "Argument to :DEFAULT must be a string.")) - (let ((library-path - (concatenate 'string - (second thing) - (default-library-suffix)))) - (load-foreign-library-path name library-path search-path))) - (:or (try-foreign-library-alternatives name (rest thing) search-path)))))) - -(defun %do-load-foreign-library (library search-path) - (flet ((%do-load (lib name spec) - (when (foreign-library-spec lib) - (with-slots (handle pathname) lib - (setf (values handle pathname) - (load-foreign-library-helper - name spec (foreign-library-search-path lib))))) - lib)) - (etypecase library - (symbol - (let* ((lib (get-foreign-library library)) - (spec (foreign-library-spec lib))) - (%do-load lib library spec))) - ((or string list) - (let* ((lib-name (gensym - (format nil "~:@(~A~)-" - (if (listp library) - (first library) - (file-namestring library))))) - (lib (make-instance 'foreign-library - :type :system - :name lib-name - :spec `((t ,library)) - :search-path search-path))) - ;; first try to load the anonymous library - ;; and register it only if that worked - (%do-load lib lib-name library) - (setf (get-foreign-library lib-name) lib)))))) - -(defun filter-pathname (thing) - (typecase thing - (pathname (namestring thing)) - (t thing))) - -(defun load-foreign-library (library &key search-path) - "Loads a foreign LIBRARY which can be a symbol denoting a library defined -through DEFINE-FOREIGN-LIBRARY; a pathname or string in which case we try to -load it directly first then search for it in *FOREIGN-LIBRARY-DIRECTORIES*; -or finally list: either (:or lib1 lib2) or (:framework )." - (let ((library (filter-pathname library))) - (restart-case - (progn - ;; dlopen/dlclose does reference counting, but the CFFI-SYS - ;; API has no infrastructure to track that. Therefore if we - ;; want to avoid increasing the internal dlopen reference - ;; counter, and thus thwarting dlclose, then we need to try - ;; to call CLOSE-FOREIGN-LIBRARY and ignore any signaled - ;; errors. - (ignore-some-conditions (foreign-library-undefined-error) - (close-foreign-library library)) - (%do-load-foreign-library library search-path)) - ;; Offer these restarts that will retry the call to - ;; %LOAD-FOREIGN-LIBRARY. - (retry () - :report "Try loading the foreign library again." - (load-foreign-library library :search-path search-path)) - (use-value (new-library) - :report "Use another library instead." - :interactive read-new-value - (load-foreign-library new-library :search-path search-path))))) - -(defmacro use-foreign-library (name) - `(load-foreign-library ',name)) - -;;;# Closing Foreign Libraries - -(defun close-foreign-library (library) - "Closes a foreign library." - (let* ((library (filter-pathname library)) - (lib (get-foreign-library library)) - (handle (foreign-library-handle lib))) - (when handle - (%close-foreign-library handle) - (setf (foreign-library-handle lib) nil) - t))) - -(defun reload-foreign-libraries (&key (test #'foreign-library-loaded-p)) - "(Re)load all currently loaded foreign libraries." - (let ((libs (list-foreign-libraries))) - (loop for l in libs - for name = (foreign-library-name l) - when (funcall test name) - do (load-foreign-library name)) - libs)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/package.lisp deleted file mode 100644 index 01f9ac4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/package.lisp +++ /dev/null @@ -1,181 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; package.lisp --- Package definition for CFFI. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -(in-package #:cl-user) - -(defpackage #:cffi - (:use #:common-lisp #:cffi-sys #:babel-encodings) - (:import-from #:alexandria - #:compose - #:ensure-list - #:featurep - #:format-symbol - #:hash-table-values - #:if-let - #:ignore-some-conditions - #:lastcar - #:make-gensym-list - #:make-keyword - #:mappend - #:once-only - #:parse-body - #:simple-style-warning - #:symbolicate - #:unwind-protect-case - #:when-let - #:with-unique-names) - (:export - ;; Types. - #:foreign-pointer - - ;; FIXME: the following types are undocumented. They should - ;; probably be replaced with a proper type introspection API - ;; though. - #:*built-in-foreign-types* - #:*other-builtin-types* - #:*built-in-integer-types* - #:*built-in-float-types* - - ;; Primitive pointer operations. - #:foreign-free - #:foreign-alloc - #:mem-aptr - #:mem-aref - #:mem-ref - #:pointerp - #:pointer-eq - #:null-pointer - #:null-pointer-p - #:inc-pointer - #:incf-pointer - #:with-foreign-pointer - #:make-pointer - #:pointer-address - - ;; Shareable vectors. - #:make-shareable-byte-vector - #:with-pointer-to-vector-data - - ;; Foreign string operations. - #:*default-foreign-encoding* - #:foreign-string-alloc - #:foreign-string-free - #:foreign-string-to-lisp - #:lisp-string-to-foreign - #:with-foreign-string - #:with-foreign-strings - #:with-foreign-pointer-as-string - - ;; Foreign array operations. - ;; TODO: document these - #:foreign-array-alloc - #:foreign-array-free - #:foreign-array-to-lisp - #:lisp-array-to-foreign - #:with-foreign-array - #:foreign-aref - - ;; Foreign function operations. - #:defcfun - #:foreign-funcall - #:foreign-funcall-pointer - #:foreign-funcall-varargs - #:foreign-funcall-pointer-varargs - #:translate-camelcase-name - #:translate-name-from-foreign - #:translate-name-to-foreign - #:translate-underscore-separated-name - - ;; Foreign library operations. - #:*foreign-library-directories* - #:*darwin-framework-directories* - #:foreign-library - #:foreign-library-name - #:foreign-library-pathname - #:foreign-library-type - #:foreign-library-loaded-p - #:list-foreign-libraries - #:define-foreign-library - #:load-foreign-library - #:load-foreign-library-error - #:use-foreign-library - #:close-foreign-library - #:reload-foreign-libraries - - ;; Callbacks. - #:callback - #:get-callback - #:defcallback - - ;; Foreign type operations. - #:defcstruct - #:defcunion - #:defctype - #:defcenum - #:defbitfield - #:define-foreign-type - #:define-parse-method - #:define-c-struct-wrapper - #:foreign-enum-keyword - #:foreign-enum-keyword-list - #:foreign-enum-value - #:foreign-bitfield-symbol-list - #:foreign-bitfield-symbols - #:foreign-bitfield-value - #:foreign-slot-pointer - #:foreign-slot-value - #:foreign-slot-type - #:foreign-slot-offset - #:foreign-slot-count - #:foreign-slot-names - #:foreign-type-alignment - #:foreign-type-size - #:with-foreign-object - #:with-foreign-objects - #:with-foreign-slots - #:convert-to-foreign - #:convert-from-foreign - #:convert-into-foreign-memory - #:free-converted-object - #:translation-forms-for-class - - ;; Extensible foreign type operations. - #:define-translation-method ; FIXME: undocumented - #:translate-to-foreign - #:translate-from-foreign - #:translate-into-foreign-memory - #:free-translated-object - #:expand-to-foreign-dyn - #:expand-to-foreign - #:expand-from-foreign - #:expand-into-foreign-memory - - ;; Foreign globals. - #:defcvar - #:get-var-pointer - #:foreign-symbol-pointer - )) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/strings.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/strings.lisp deleted file mode 100644 index d56f1f9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/strings.lisp +++ /dev/null @@ -1,305 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; strings.lisp --- Operations on foreign strings. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; Copyright (C) 2005-2007, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi) - -;;;# Foreign String Conversion -;;; -;;; Functions for converting NULL-terminated C-strings to Lisp strings -;;; and vice versa. The string functions accept an ENCODING keyword -;;; argument which is used to specify the encoding to use when -;;; converting to/from foreign strings. - -(defvar *default-foreign-encoding* :utf-8 - "Default foreign encoding.") - -;;; TODO: refactor, sigh. Also, this should probably be a function. -(defmacro bget (ptr off &optional (bytes 1) (endianness :ne)) - (let ((big-endian (member endianness - '(:be #+big-endian :ne #+little-endian :re)))) - (once-only (ptr off) - (ecase bytes - (1 `(mem-ref ,ptr :uint8 ,off)) - (2 (if big-endian - #+big-endian - `(mem-ref ,ptr :uint16 ,off) - #-big-endian - `(dpb (mem-ref ,ptr :uint8 ,off) (byte 8 8) - (mem-ref ,ptr :uint8 (1+ ,off))) - #+little-endian - `(mem-ref ,ptr :uint16 ,off) - #-little-endian - `(dpb (mem-ref ,ptr :uint8 (1+ ,off)) (byte 8 8) - (mem-ref ,ptr :uint8 ,off)))) - (4 (if big-endian - #+big-endian - `(mem-ref ,ptr :uint32 ,off) - #-big-endian - `(dpb (mem-ref ,ptr :uint8 ,off) (byte 8 24) - (dpb (mem-ref ,ptr :uint8 (1+ ,off)) (byte 8 16) - (dpb (mem-ref ,ptr :uint8 (+ ,off 2)) (byte 8 8) - (mem-ref ,ptr :uint8 (+ ,off 3))))) - #+little-endian - `(mem-ref ,ptr :uint32 ,off) - #-little-endian - `(dpb (mem-ref ,ptr :uint8 (+ ,off 3)) (byte 8 24) - (dpb (mem-ref ,ptr :uint8 (+ ,off 2)) (byte 8 16) - (dpb (mem-ref ,ptr :uint8 (1+ ,off)) (byte 8 8) - (mem-ref ,ptr :uint8 ,off)))))))))) - -(defmacro bset (val ptr off &optional (bytes 1) (endianness :ne)) - (let ((big-endian (member endianness - '(:be #+big-endian :ne #+little-endian :re)))) - (ecase bytes - (1 `(setf (mem-ref ,ptr :uint8 ,off) ,val)) - (2 (if big-endian - #+big-endian - `(setf (mem-ref ,ptr :uint16 ,off) ,val) - #-big-endian - `(setf (mem-ref ,ptr :uint8 (1+ ,off)) (ldb (byte 8 0) ,val) - (mem-ref ,ptr :uint8 ,off) (ldb (byte 8 8) ,val)) - #+little-endian - `(setf (mem-ref ,ptr :uint16 ,off) ,val) - #-little-endian - `(setf (mem-ref ,ptr :uint8 ,off) (ldb (byte 8 0) ,val) - (mem-ref ,ptr :uint8 (1+ ,off)) (ldb (byte 8 8) ,val)))) - (4 (if big-endian - #+big-endian - `(setf (mem-ref ,ptr :uint32 ,off) ,val) - #-big-endian - `(setf (mem-ref ,ptr :uint8 (+ 3 ,off)) (ldb (byte 8 0) ,val) - (mem-ref ,ptr :uint8 (+ 2 ,off)) (ldb (byte 8 8) ,val) - (mem-ref ,ptr :uint8 (1+ ,off)) (ldb (byte 8 16) ,val) - (mem-ref ,ptr :uint8 ,off) (ldb (byte 8 24) ,val)) - #+little-endian - `(setf (mem-ref ,ptr :uint32 ,off) ,val) - #-little-endian - `(setf (mem-ref ,ptr :uint8 ,off) (ldb (byte 8 0) ,val) - (mem-ref ,ptr :uint8 (1+ ,off)) (ldb (byte 8 8) ,val) - (mem-ref ,ptr :uint8 (+ ,off 2)) (ldb (byte 8 16) ,val) - (mem-ref ,ptr :uint8 (+ ,off 3)) (ldb (byte 8 24) ,val))))))) - -;;; TODO: tackle optimization notes. -(defparameter *foreign-string-mappings* - (instantiate-concrete-mappings - ;; :optimize ((speed 3) (debug 0) (compilation-speed 0) (safety 0)) - :octet-seq-getter bget - :octet-seq-setter bset - :octet-seq-type foreign-pointer - :code-point-seq-getter babel::string-get - :code-point-seq-setter babel::string-set - :code-point-seq-type babel:simple-unicode-string)) - -(defun null-terminator-len (encoding) - (length (enc-nul-encoding (get-character-encoding encoding)))) - -(defun lisp-string-to-foreign (string buffer bufsize &key (start 0) end offset - (encoding *default-foreign-encoding*)) - (check-type string string) - (when offset - (setq buffer (inc-pointer buffer offset))) - (with-checked-simple-vector ((string (coerce string 'babel:unicode-string)) - (start start) (end end)) - (declare (type simple-string string)) - (let ((mapping (lookup-mapping *foreign-string-mappings* encoding)) - (nul-len (null-terminator-len encoding))) - (assert (plusp bufsize)) - (multiple-value-bind (size end) - (funcall (octet-counter mapping) string start end (- bufsize nul-len)) - (funcall (encoder mapping) string start end buffer 0) - (dotimes (i nul-len) - (setf (mem-ref buffer :char (+ size i)) 0)))) - buffer)) - -;;; Expands into a loop that calculates the length of the foreign -;;; string at PTR plus OFFSET, using ACCESSOR and looking for a null -;;; terminator of LENGTH bytes. -(defmacro %foreign-string-length (ptr offset type length) - (once-only (ptr offset) - `(do ((i 0 (+ i ,length))) - ((zerop (mem-ref ,ptr ,type (+ ,offset i))) i) - (declare (fixnum i))))) - -;;; Return the length in octets of the null terminated foreign string -;;; at POINTER plus OFFSET octets, assumed to be encoded in ENCODING, -;;; a CFFI encoding. This should be smart enough to look for 8-bit vs -;;; 16-bit null terminators, as appropriate for the encoding. -(defun foreign-string-length (pointer &key (encoding *default-foreign-encoding*) - (offset 0)) - (ecase (null-terminator-len encoding) - (1 (%foreign-string-length pointer offset :uint8 1)) - (2 (%foreign-string-length pointer offset :uint16 2)) - (4 (%foreign-string-length pointer offset :uint32 4)))) - -(defun foreign-string-to-lisp (pointer &key (offset 0) count - (max-chars (1- array-total-size-limit)) - (encoding *default-foreign-encoding*)) - "Copy at most COUNT bytes from POINTER plus OFFSET encoded in -ENCODING into a Lisp string and return it. If POINTER is a null -pointer, NIL is returned." - (unless (null-pointer-p pointer) - (let ((count (or count - (foreign-string-length - pointer :encoding encoding :offset offset))) - (mapping (lookup-mapping *foreign-string-mappings* encoding))) - (assert (plusp max-chars)) - (multiple-value-bind (size new-end) - (funcall (code-point-counter mapping) - pointer offset (+ offset count) max-chars) - (let ((string (make-string size :element-type 'babel:unicode-char))) - (funcall (decoder mapping) pointer offset new-end string 0) - (values string (- new-end offset))))))) - -;;;# Using Foreign Strings - -(defun foreign-string-alloc (string &key (encoding *default-foreign-encoding*) - (null-terminated-p t) (start 0) end) - "Allocate a foreign string containing Lisp string STRING. -The string must be freed with FOREIGN-STRING-FREE." - (check-type string string) - (with-checked-simple-vector ((string (coerce string 'babel:unicode-string)) - (start start) (end end)) - (declare (type simple-string string)) - (let* ((mapping (lookup-mapping *foreign-string-mappings* encoding)) - (count (funcall (octet-counter mapping) string start end 0)) - (nul-length (if null-terminated-p - (null-terminator-len encoding) - 0)) - (length (+ count nul-length)) - (ptr (foreign-alloc :char :count length))) - (funcall (encoder mapping) string start end ptr 0) - (dotimes (i nul-length) - (setf (mem-ref ptr :char (+ count i)) 0)) - (values ptr length)))) - -(defun foreign-string-free (ptr) - "Free a foreign string allocated by FOREIGN-STRING-ALLOC." - (foreign-free ptr)) - -(defmacro with-foreign-string ((var-or-vars lisp-string &rest args) &body body) - "VAR-OR-VARS is not evaluated and should be a list of the form -\(VAR &OPTIONAL BYTE-SIZE-VAR) or just a VAR symbol. VAR is -bound to a foreign string containing LISP-STRING in BODY. When -BYTE-SIZE-VAR is specified then bind the C buffer size -\(including the possible null terminator\(s)) to this variable." - (destructuring-bind (var &optional size-var) - (ensure-list var-or-vars) - `(multiple-value-bind (,var ,@(when size-var (list size-var))) - (foreign-string-alloc ,lisp-string ,@args) - (unwind-protect - (progn ,@body) - (foreign-string-free ,var))))) - -(defmacro with-foreign-strings (bindings &body body) - "See WITH-FOREIGN-STRING's documentation." - (if bindings - `(with-foreign-string ,(first bindings) - (with-foreign-strings ,(rest bindings) - ,@body)) - `(progn ,@body))) - -(defmacro with-foreign-pointer-as-string - ((var-or-vars size &rest args) &body body) - "VAR-OR-VARS is not evaluated and should be a list of the form -\(VAR &OPTIONAL SIZE-VAR) or just a VAR symbol. VAR is bound to -a foreign buffer of size SIZE within BODY. The return value is -constructed by calling FOREIGN-STRING-TO-LISP on the foreign -buffer along with ARGS." ; fix wording, sigh - (destructuring-bind (var &optional size-var) - (ensure-list var-or-vars) - `(with-foreign-pointer (,var ,size ,size-var) - (progn - ,@body - (values (foreign-string-to-lisp ,var ,@args)))))) - -;;;# Automatic Conversion of Foreign Strings - -(define-foreign-type foreign-string-type () - (;; CFFI encoding of this string. - (encoding :initform nil :initarg :encoding :reader encoding) - ;; Should we free after translating from foreign? - (free-from-foreign :initarg :free-from-foreign - :reader fst-free-from-foreign-p - :initform nil :type boolean) - ;; Should we free after translating to foreign? - (free-to-foreign :initarg :free-to-foreign - :reader fst-free-to-foreign-p - :initform t :type boolean)) - (:actual-type :pointer) - (:simple-parser :string)) - -;;; describe me -(defun fst-encoding (type) - (or (encoding type) *default-foreign-encoding*)) - -;;; Display the encoding when printing a FOREIGN-STRING-TYPE instance. -(defmethod print-object ((type foreign-string-type) stream) - (print-unreadable-object (type stream :type t) - (format stream "~S" (fst-encoding type)))) - -(defmethod translate-to-foreign ((s string) (type foreign-string-type)) - (values (foreign-string-alloc s :encoding (fst-encoding type)) - (fst-free-to-foreign-p type))) - -(defmethod translate-to-foreign (obj (type foreign-string-type)) - (cond - ((pointerp obj) - (values obj nil)) - ;; FIXME: we used to support UB8 vectors but not anymore. - ;; ((typep obj '(array (unsigned-byte 8))) - ;; (values (foreign-string-alloc obj) t)) - (t (error "~A is not a Lisp string or pointer." obj)))) - -(defmethod translate-from-foreign (ptr (type foreign-string-type)) - (unwind-protect - (values (foreign-string-to-lisp ptr :encoding (fst-encoding type))) - (when (fst-free-from-foreign-p type) - (foreign-free ptr)))) - -(defmethod free-translated-object (ptr (type foreign-string-type) free-p) - (when free-p - (foreign-string-free ptr))) - -(defmethod expand-to-foreign-dyn-indirect - (value var body (type foreign-string-type)) - (alexandria:with-gensyms (str) - (expand-to-foreign-dyn - value - str - (list - (expand-to-foreign-dyn-indirect str var body (parse-type :pointer))) - type))) - -;;;# STRING+PTR - -(define-foreign-type foreign-string+ptr-type (foreign-string-type) - () - (:simple-parser :string+ptr)) - -(defmethod translate-from-foreign (value (type foreign-string+ptr-type)) - (list (call-next-method) value)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/structures.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/structures.lisp deleted file mode 100644 index 315d4b6..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/structures.lisp +++ /dev/null @@ -1,133 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; structures.lisp --- Methods for translating foreign structures. -;;; -;;; Copyright (C) 2011, Liam M. Healy -;;; -;;; 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. -;;; - -(in-package #:cffi) - -;;; Definitions for conversion of foreign structures. - -(defmethod translate-into-foreign-memory ((object list) - (type foreign-struct-type) - p) - (unless (bare-struct-type-p type) - (loop for (name value) on object by #'cddr - do (setf (foreign-slot-value p (unparse-type type) name) - (let ((slot (gethash name (structure-slots type)))) - (convert-to-foreign value (slot-type slot))))))) - -(defmethod translate-to-foreign (value (type foreign-struct-type)) - (let ((ptr (foreign-alloc type))) - (translate-into-foreign-memory value type ptr) - ptr)) - -(defmethod translate-from-foreign (p (type foreign-struct-type)) - ;; Iterate over slots, make plist - (if (bare-struct-type-p type) - p - (let ((plist (list))) - (loop for slot being the hash-value of (structure-slots type) - for name = (slot-name slot) - do (setf (getf plist name) - (foreign-struct-slot-value p slot))) - plist))) - -(defmethod free-translated-object (ptr (type foreign-struct-type) freep) - (unless (bare-struct-type-p type) - ;; Look for any pointer slots and free them first - (loop for slot being the hash-value of (structure-slots type) - when (and (listp (slot-type slot)) (eq (first (slot-type slot)) :pointer)) - do - ;; Free if the pointer is to a specific type, not generic :pointer - (free-translated-object - (foreign-slot-value ptr type (slot-name slot)) - (rest (slot-type slot)) - freep)) - (foreign-free ptr))) - -(defmacro define-translation-method ((object type method) &body body) - "Define a translation method for the foreign structure type; 'method is one of :into, :from, or :to, meaning relation to foreign memory. If :into, the variable 'pointer is the foreign pointer. Note: type must be defined and loaded before this macro is expanded, and just the bare name (without :struct) should be specified." - (let ((tclass (class-name (class-of (cffi::parse-type `(:struct ,type)))))) - (when (eq tclass 'foreign-struct-type) - (error "Won't replace existing translation method for foreign-struct-type")) - `(defmethod - ,(case method - (:into 'translate-into-foreign-memory) - (:from 'translate-from-foreign) - (:to 'translate-to-foreign)) - ;; Arguments to the method - (,object - (type ,tclass) - ,@(when (eq method :into) '(pointer))) ; is intentional variable capture a good idea? - ;; The body - (declare (ignorable type)) ; I can't think of a reason why you'd want to use this - ,@body))) - -(defmacro translation-forms-for-class (class type-class) - "Make forms for translation of foreign structures to and from a standard class. The class slots are assumed to have the same name as the foreign structure." - ;; Possible improvement: optional argument to map structure slot names to/from class slot names. - `(progn - (defmethod translate-from-foreign (pointer (type ,type-class)) - ;; Make the instance from the plist - (apply 'make-instance ',class (call-next-method))) - (defmethod translate-into-foreign-memory ((object ,class) (type ,type-class) pointer) - (call-next-method - ;; Translate into a plist and call the general method - (loop for slot being the hash-value of (structure-slots type) - for name = (slot-name slot) - append (list slot-name (slot-value object slot-name))) - type - pointer)))) - -;;; For a class already defined and loaded, and a defcstruct already defined, use -;;; (translation-forms-for-class class type-class) -;;; to connnect the two. It would be nice to have a macro to do all three simultaneously. -;;; (defmacro define-foreign-structure (class )) - -#| -(defmacro define-structure-conversion - (value-symbol type lisp-class slot-names to-form from-form &optional (struct-name type)) - "Define the functions necessary to convert to and from a foreign structure. The to-form sets each of the foreign slots in succession, assume the foreign object exists. The from-form creates the Lisp object, making it with the correct value by reference to foreign slots." - `(flet ((map-slots (fn val) - (maphash - (lambda (name slot-struct) - (funcall fn (foreign-slot-value val ',type name) (slot-type slot-struct))) - (slots (follow-typedefs (parse-type ',type)))))) - ;; Convert this to a separate function so it doesn't have to be recomputed on the fly each time. - (defmethod translate-to-foreign ((,value-symbol ,lisp-class) (type ,type)) - (let ((p (foreign-alloc ',struct-name))) - ;;(map-slots #'translate-to-foreign ,value-symbol) ; recursive translation of slots - (with-foreign-slots (,slot-names p ,struct-name) - ,to-form) - (values p t))) ; second value is passed to FREE-TRANSLATED-OBJECT - (defmethod free-translated-object (,value-symbol (p ,type) freep) - (when freep - ;; Is this redundant? - (map-slots #'free-translated-object value) ; recursively free slots - (foreign-free ,value-symbol))) - (defmethod translate-from-foreign (,value-symbol (type ,type)) - (with-foreign-slots (,slot-names ,value-symbol ,struct-name) - ,from-form)))) -|# diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/types.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/types.lisp deleted file mode 100644 index 6863958..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/types.lisp +++ /dev/null @@ -1,1051 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; types.lisp --- User-defined CFFI types. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; Copyright (C) 2005-2007, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi) - -;;;# Built-In Types - -;; NOTE: In the C standard there's a "signed-char": -;; https://stackoverflow.com/questions/436513/char-signed-char-char-unsigned-char -;; and "char" may be either signed or unsigned, i.e. treating it as a small int -;; is not wise. At the level of CFFI we can safely ignore this and assume that -;; :char is mapped to "signed-char" by the CL implementation under us. -(define-built-in-foreign-type :char) -(define-built-in-foreign-type :unsigned-char) -(define-built-in-foreign-type :short) -(define-built-in-foreign-type :unsigned-short) -(define-built-in-foreign-type :int) -(define-built-in-foreign-type :unsigned-int) -(define-built-in-foreign-type :long) -(define-built-in-foreign-type :unsigned-long) -(define-built-in-foreign-type :float) -(define-built-in-foreign-type :double) -(define-built-in-foreign-type :void) - -#-cffi-sys::no-long-long -(progn - (define-built-in-foreign-type :long-long) - (define-built-in-foreign-type :unsigned-long-long)) - -;;; Define emulated LONG-LONG types. Needs checking whether we're -;;; using the right sizes on various platforms. -;;; -;;; A possibly better, certainly faster though more intrusive, -;;; alternative is available here: -;;; -#+cffi-sys::no-long-long -(eval-when (:compile-toplevel :load-toplevel :execute) - (defclass emulated-llong-type (foreign-type) ()) - (defmethod foreign-type-size ((tp emulated-llong-type)) 8) - (defmethod foreign-type-alignment ((tp emulated-llong-type)) - ;; better than assuming that the alignment is 8 - (foreign-type-alignment :long)) - (defmethod aggregatep ((tp emulated-llong-type)) nil) - - (define-foreign-type emulated-llong (emulated-llong-type) - () - (:simple-parser :long-long)) - - (define-foreign-type emulated-ullong (emulated-llong-type) - () - (:simple-parser :unsigned-long-long)) - - (defmethod canonicalize ((tp emulated-llong)) :long-long) - (defmethod unparse-type ((tp emulated-llong)) :long-long) - (defmethod canonicalize ((tp emulated-ullong)) :unsigned-long-long) - (defmethod unparse-type ((tp emulated-ullong)) :unsigned-long-long) - - (defun %emulated-mem-ref-64 (ptr type offset) - (let ((value #+big-endian - (+ (ash (mem-ref ptr :unsigned-long offset) 32) - (mem-ref ptr :unsigned-long (+ offset 4))) - #+little-endian - (+ (mem-ref ptr :unsigned-long offset) - (ash (mem-ref ptr :unsigned-long (+ offset 4)) 32)))) - (if (and (eq type :long-long) (logbitp 63 value)) - (lognot (logxor value #xFFFFFFFFFFFFFFFF)) - value))) - - (defun %emulated-mem-set-64 (value ptr type offset) - (when (and (eq type :long-long) (minusp value)) - (setq value (lognot (logxor value #xFFFFFFFFFFFFFFFF)))) - (%mem-set (ldb (byte 32 0) value) ptr :unsigned-long - #+big-endian (+ offset 4) #+little-endian offset) - (%mem-set (ldb (byte 32 32) value) ptr :unsigned-long - #+big-endian offset #+little-endian (+ offset 4)) - value)) - -;;; When some lisp other than SCL supports :long-double we should -;;; use #-cffi-sys::no-long-double here instead. -#+(and scl long-float) (define-built-in-foreign-type :long-double) - -(defparameter *possible-float-types* '(:float :double :long-double)) - -(defparameter *other-builtin-types* '(:pointer :void) - "List of types other than integer or float built in to CFFI.") - -(defparameter *built-in-integer-types* - (set-difference - cffi:*built-in-foreign-types* - (append *possible-float-types* *other-builtin-types*)) - "List of integer types supported by CFFI.") - -(defparameter *built-in-float-types* - (set-difference - cffi:*built-in-foreign-types* - (append *built-in-integer-types* *other-builtin-types*)) - "List of real float types supported by CFFI.") - -;;;# Foreign Pointers - -(define-modify-macro incf-pointer (&optional (offset 1)) inc-pointer) - -(defun mem-ref (ptr type &optional (offset 0)) - "Return the value of TYPE at OFFSET bytes from PTR. If TYPE is aggregate, -we don't return its 'value' but a pointer to it, which is PTR itself." - (let* ((parsed-type (parse-type type)) - (ctype (canonicalize parsed-type))) - #+cffi-sys::no-long-long - (when (member ctype '(:long-long :unsigned-long-long)) - (return-from mem-ref - (translate-from-foreign (%emulated-mem-ref-64 ptr ctype offset) - parsed-type))) - ;; normal branch - (if (aggregatep parsed-type) - (if (bare-struct-type-p parsed-type) - (inc-pointer ptr offset) - (translate-from-foreign (inc-pointer ptr offset) parsed-type)) - (translate-from-foreign (%mem-ref ptr ctype offset) parsed-type)))) - -(define-compiler-macro mem-ref (&whole form ptr type &optional (offset 0)) - "Compiler macro to open-code MEM-REF when TYPE is constant." - (if (constantp type) - (let* ((parsed-type (parse-type (eval type))) - (ctype (canonicalize parsed-type))) - ;; Bail out when using emulated long long types. - #+cffi-sys::no-long-long - (when (member ctype '(:long-long :unsigned-long-long)) - (return-from mem-ref form)) - (if (aggregatep parsed-type) - (if (bare-struct-type-p parsed-type) - `(inc-pointer ,ptr ,offset) - (expand-from-foreign `(inc-pointer ,ptr ,offset) parsed-type)) - (expand-from-foreign `(%mem-ref ,ptr ,ctype ,offset) parsed-type))) - form)) - -(defun mem-set (value ptr type &optional (offset 0)) - "Set the value of TYPE at OFFSET bytes from PTR to VALUE." - (let* ((ptype (parse-type type)) - (ctype (canonicalize ptype))) - #+cffi-sys::no-long-long - (when (or (eq ctype :long-long) (eq ctype :unsigned-long-long)) - (return-from mem-set - (%emulated-mem-set-64 (translate-to-foreign value ptype) - ptr ctype offset))) - (if (aggregatep ptype) ; XXX: backwards incompatible? - (translate-into-foreign-memory value ptype (inc-pointer ptr offset)) - (%mem-set (translate-to-foreign value ptype) ptr ctype offset)))) - -(define-setf-expander mem-ref (ptr type &optional (offset 0) &environment env) - "SETF expander for MEM-REF that doesn't rebind TYPE. -This is necessary for the compiler macro on MEM-SET to be able -to open-code (SETF MEM-REF) forms." - (multiple-value-bind (dummies vals newval setter getter) - (get-setf-expansion ptr env) - (declare (ignore setter newval)) - ;; if either TYPE or OFFSET are constant, we avoid rebinding them - ;; so that the compiler macros on MEM-SET and %MEM-SET work. - (with-unique-names (store type-tmp offset-tmp) - (values - (append (unless (constantp type) (list type-tmp)) - (unless (constantp offset) (list offset-tmp)) - dummies) - (append (unless (constantp type) (list type)) - (unless (constantp offset) (list offset)) - vals) - (list store) - `(progn - (mem-set ,store ,getter - ,@(if (constantp type) (list type) (list type-tmp)) - ,@(if (constantp offset) (list offset) (list offset-tmp))) - ,store) - `(mem-ref ,getter - ,@(if (constantp type) (list type) (list type-tmp)) - ,@(if (constantp offset) (list offset) (list offset-tmp))))))) - -(define-compiler-macro mem-set - (&whole form value ptr type &optional (offset 0)) - "Compiler macro to open-code (SETF MEM-REF) when type is constant." - (if (constantp type) - (let* ((parsed-type (parse-type (eval type))) - (ctype (canonicalize parsed-type))) - ;; Bail out when using emulated long long types. - #+cffi-sys::no-long-long - (when (member ctype '(:long-long :unsigned-long-long)) - (return-from mem-set form)) - (if (aggregatep parsed-type) - (expand-into-foreign-memory - value parsed-type `(inc-pointer ,ptr ,offset)) - `(%mem-set ,(expand-to-foreign value parsed-type) - ,ptr ,ctype ,offset))) - form)) - -;;;# Dereferencing Foreign Arrays - -;;; Maybe this should be named MEM-SVREF? [2007-02-28 LO] -(defun mem-aref (ptr type &optional (index 0)) - "Like MEM-REF except for accessing 1d arrays." - (mem-ref ptr type (* index (foreign-type-size type)))) - -(define-compiler-macro mem-aref (&whole form ptr type &optional (index 0)) - "Compiler macro to open-code MEM-AREF when TYPE (and eventually INDEX)." - (if (constantp type) - (if (constantp index) - `(mem-ref ,ptr ,type - ,(* (eval index) (foreign-type-size (eval type)))) - `(mem-ref ,ptr ,type (* ,index ,(foreign-type-size (eval type))))) - form)) - -(define-setf-expander mem-aref (ptr type &optional (index 0) &environment env) - "SETF expander for MEM-AREF." - (multiple-value-bind (dummies vals newval setter getter) - (get-setf-expansion ptr env) - (declare (ignore setter newval)) - ;; we avoid rebinding type and index, if possible (and if type is not - ;; constant, we don't bother about the index), so that the compiler macros - ;; on MEM-SET or %MEM-SET can work. - (with-unique-names (store type-tmp index-tmp) - (values - (append (unless (constantp type) - (list type-tmp)) - (unless (and (constantp type) (constantp index)) - (list index-tmp)) - dummies) - (append (unless (constantp type) - (list type)) - (unless (and (constantp type) (constantp index)) - (list index)) - vals) - (list store) - ;; Here we'll try to calculate the offset from the type and index, - ;; or if not possible at least get the type size early. - `(progn - ,(if (constantp type) - (if (constantp index) - `(mem-set ,store ,getter ,type - ,(* (eval index) (foreign-type-size (eval type)))) - `(mem-set ,store ,getter ,type - (* ,index-tmp ,(foreign-type-size (eval type))))) - `(mem-set ,store ,getter ,type-tmp - (* ,index-tmp (foreign-type-size ,type-tmp)))) - ,store) - `(mem-aref ,getter - ,@(if (constantp type) - (list type) - (list type-tmp)) - ,@(if (and (constantp type) (constantp index)) - (list index) - (list index-tmp))))))) - -(defmethod translate-into-foreign-memory - (value (type foreign-pointer-type) pointer) - (setf (mem-aref pointer :pointer) value)) - -(defmethod translate-into-foreign-memory - (value (type foreign-built-in-type) pointer) - (setf (mem-aref pointer (unparse-type type)) value)) - -(defun mem-aptr (ptr type &optional (index 0)) - "The pointer to the element." - (inc-pointer ptr (* index (foreign-type-size type)))) - -(define-compiler-macro mem-aptr (&whole form ptr type &optional (index 0)) - "The pointer to the element." - (cond ((not (constantp type)) - form) - ((not (constantp index)) - `(inc-pointer ,ptr (* ,index ,(foreign-type-size (eval type))))) - ((zerop (eval index)) - ptr) - (t - `(inc-pointer ,ptr ,(* (eval index) - (foreign-type-size (eval type))))))) - -(define-foreign-type foreign-array-type () - ((dimensions :reader dimensions :initarg :dimensions) - (element-type :reader element-type :initarg :element-type)) - (:actual-type :pointer)) - -(defmethod aggregatep ((type foreign-array-type)) - t) - -(defmethod print-object ((type foreign-array-type) stream) - "Print a FOREIGN-ARRAY-TYPE instance to STREAM unreadably." - (print-unreadable-object (type stream :type t :identity nil) - (format stream "~S ~S" (element-type type) (dimensions type)))) - -(defun array-element-size (array-type) - (foreign-type-size (element-type array-type))) - -(defmethod foreign-type-size ((type foreign-array-type)) - (* (array-element-size type) (reduce #'* (dimensions type)))) - -(defmethod foreign-type-alignment ((type foreign-array-type)) - (foreign-type-alignment (element-type type))) - -(define-parse-method :array (element-type &rest dimensions) - (assert (plusp (length dimensions))) - (make-instance 'foreign-array-type - :element-type element-type - :dimensions dimensions)) - -(defun indexes-to-row-major-index (dimensions &rest subscripts) - (apply #'+ (maplist (lambda (x y) - (* (car x) (apply #'* (cdr y)))) - subscripts - dimensions))) - -(defun row-major-index-to-indexes (index dimensions) - (loop with idx = index - with rank = (length dimensions) - with indexes = (make-list rank) - for dim-index from (- rank 1) downto 0 do - (setf (values idx (nth dim-index indexes)) - (floor idx (nth dim-index dimensions))) - finally (return indexes))) - -(defun foreign-alloc (type &key (initial-element nil initial-element-p) - (initial-contents nil initial-contents-p) - (count 1 count-p) null-terminated-p) - "Allocate enough memory to hold COUNT objects of type TYPE. If -INITIAL-ELEMENT is supplied, each element of the newly allocated -memory is initialized with its value. If INITIAL-CONTENTS is supplied, -each of its elements will be used to initialize the contents of the -newly allocated memory." - (let (contents-length) - ;; Some error checking, etc... - (when (and null-terminated-p - (not (eq (canonicalize-foreign-type type) :pointer))) - (error "Cannot use :NULL-TERMINATED-P with non-pointer types.")) - (when (and initial-element-p initial-contents-p) - (error "Cannot specify both :INITIAL-ELEMENT and :INITIAL-CONTENTS")) - (when initial-contents-p - (setq contents-length (length initial-contents)) - (if count-p - (assert (>= count contents-length)) - (setq count contents-length))) - ;; Everything looks good. - (let ((ptr (%foreign-alloc (* (foreign-type-size type) - (if null-terminated-p (1+ count) count))))) - (when initial-element-p - (dotimes (i count) - (setf (mem-aref ptr type i) initial-element))) - (when initial-contents-p - (dotimes (i contents-length) - (setf (mem-aref ptr type i) (elt initial-contents i)))) - (when null-terminated-p - (setf (mem-aref ptr :pointer count) (null-pointer))) - ptr))) - -;;; Simple compiler macro that kicks in when TYPE is constant and only -;;; the COUNT argument is passed. (Note: hard-coding the type's size -;;; into the fasl will likely break CLISP fasl cross-platform -;;; compatibilty.) -(define-compiler-macro foreign-alloc (&whole form type &rest args - &key (count 1 count-p) &allow-other-keys) - (if (or (and count-p (<= (length args) 2)) (null args)) - (cond - ((and (constantp type) (constantp count)) - `(%foreign-alloc ,(* (eval count) (foreign-type-size (eval type))))) - ((constantp type) - `(%foreign-alloc (* ,count ,(foreign-type-size (eval type))))) - (t form)) - form)) - -(defun lisp-array-to-foreign (array pointer array-type) - "Copy elements from a Lisp array to POINTER. ARRAY-TYPE must be a CFFI array -type." - (let* ((type (ensure-parsed-base-type array-type)) - (el-type (element-type type)) - (dimensions (dimensions type))) - (loop with foreign-type-size = (array-element-size type) - with size = (reduce #'* dimensions) - for i from 0 below size - for offset = (* i foreign-type-size) - for element = (apply #'aref array - (row-major-index-to-indexes i dimensions)) - do (setf (mem-ref pointer el-type offset) element)))) - -(defun foreign-array-to-lisp (pointer array-type &rest make-array-args) - "Copy elements from pointer into a Lisp array. ARRAY-TYPE must be a CFFI array -type; the type of the resulting Lisp array can be defined in MAKE-ARRAY-ARGS -that are then passed to MAKE-ARRAY. If POINTER is a null pointer, returns NIL." - (unless (null-pointer-p pointer) - (let* ((type (ensure-parsed-base-type array-type)) - (el-type (element-type type)) - (dimensions (dimensions type)) - (array (apply #'make-array dimensions make-array-args))) - (loop with foreign-type-size = (array-element-size type) - with size = (reduce #'* dimensions) - for i from 0 below size - for offset = (* i foreign-type-size) - for element = (mem-ref pointer el-type offset) - do (setf (apply #'aref array - (row-major-index-to-indexes i dimensions)) - element)) - array))) - -(defun foreign-array-alloc (array array-type) - "Allocate a foreign array containing the elements of lisp array. -The foreign array must be freed with foreign-array-free." - (check-type array array) - (let* ((type (ensure-parsed-base-type array-type)) - (ptr (foreign-alloc (element-type type) - :count (reduce #'* (dimensions type))))) - (lisp-array-to-foreign array ptr array-type) - ptr)) - -(defun foreign-array-free (ptr) - "Free a foreign array allocated by foreign-array-alloc." - (foreign-free ptr)) - -(defmacro with-foreign-array ((var lisp-array array-type) &body body) - "Bind var to a foreign array containing lisp-array elements in body." - (with-unique-names (type) - `(let ((,type (ensure-parsed-base-type ,array-type))) - (with-foreign-pointer (,var (* (reduce #'* (dimensions ,type)) - (array-element-size ,type))) - (lisp-array-to-foreign ,lisp-array ,var ,array-type) - ,@body)))) - -(defun foreign-aref (ptr array-type &rest indexes) - (let* ((type (ensure-parsed-base-type array-type)) - (offset (* (array-element-size type) - (apply #'indexes-to-row-major-index - (dimensions type) indexes)))) - (mem-ref ptr (element-type type) offset))) - -(defun (setf foreign-aref) (value ptr array-type &rest indexes) - (let* ((type (ensure-parsed-base-type array-type)) - (offset (* (array-element-size type) - (apply #'indexes-to-row-major-index - (dimensions type) indexes)))) - (setf (mem-ref ptr (element-type type) offset) value))) - -;;; Automatic translations for the :ARRAY type. Notice that these -;;; translators will also invoke the appropriate translators for for -;;; each of the array's elements since that's the normal behaviour of -;;; the FOREIGN-ARRAY-* operators, but there's a FIXME: **it doesn't -;;; free them yet** - -;;; This used to be in a separate type but let's experiment with just -;;; one type for a while. [2008-12-30 LO] - -;;; FIXME: those ugly invocations of UNPARSE-TYPE suggest that these -;;; foreign array operators should take the type and dimention -;;; arguments "unboxed". [2008-12-31 LO] - -(defmethod translate-to-foreign (array (type foreign-array-type)) - (foreign-array-alloc array (unparse-type type))) - -(defmethod translate-aggregate-to-foreign (ptr value (type foreign-array-type)) - (lisp-array-to-foreign value ptr (unparse-type type))) - -(defmethod translate-from-foreign (pointer (type foreign-array-type)) - (foreign-array-to-lisp pointer (unparse-type type))) - -(defmethod free-translated-object (pointer (type foreign-array-type) param) - (declare (ignore param)) - (foreign-array-free pointer)) - -;;;# Foreign Structures - -;;;## Foreign Structure Slots - -(defgeneric foreign-struct-slot-pointer (ptr slot) - (:documentation - "Get the address of SLOT relative to PTR.")) - -(defgeneric foreign-struct-slot-pointer-form (ptr slot) - (:documentation - "Return a form to get the address of SLOT in PTR.")) - -(defgeneric foreign-struct-slot-value (ptr slot) - (:documentation - "Return the value of SLOT in structure PTR.")) - -(defgeneric (setf foreign-struct-slot-value) (value ptr slot) - (:documentation - "Set the value of a SLOT in structure PTR.")) - -(defgeneric foreign-struct-slot-value-form (ptr slot) - (:documentation - "Return a form to get the value of SLOT in struct PTR.")) - -(defgeneric foreign-struct-slot-set-form (value ptr slot) - (:documentation - "Return a form to set the value of SLOT in struct PTR.")) - -(defclass foreign-struct-slot () - ((name :initarg :name :reader slot-name) - (offset :initarg :offset :accessor slot-offset) - ;; FIXME: the type should probably be parsed? - (type :initarg :type :accessor slot-type)) - (:documentation "Base class for simple and aggregate slots.")) - -(defmethod foreign-struct-slot-pointer (ptr (slot foreign-struct-slot)) - "Return the address of SLOT relative to PTR." - (inc-pointer ptr (slot-offset slot))) - -(defmethod foreign-struct-slot-pointer-form (ptr (slot foreign-struct-slot)) - "Return a form to get the address of SLOT relative to PTR." - (let ((offset (slot-offset slot))) - (if (zerop offset) - ptr - `(inc-pointer ,ptr ,offset)))) - -(defun foreign-slot-names (type) - "Returns a list of TYPE's slot names in no particular order." - (loop for value being the hash-values - in (slots (ensure-parsed-base-type type)) - collect (slot-name value))) - -;;;### Simple Slots - -(defclass simple-struct-slot (foreign-struct-slot) - () - (:documentation "Non-aggregate structure slots.")) - -(defmethod foreign-struct-slot-value (ptr (slot simple-struct-slot)) - "Return the value of a simple SLOT from a struct at PTR." - (mem-ref ptr (slot-type slot) (slot-offset slot))) - -(defmethod foreign-struct-slot-value-form (ptr (slot simple-struct-slot)) - "Return a form to get the value of a slot from PTR." - `(mem-ref ,ptr ',(slot-type slot) ,(slot-offset slot))) - -(defmethod (setf foreign-struct-slot-value) (value ptr (slot simple-struct-slot)) - "Set the value of a simple SLOT to VALUE in PTR." - (setf (mem-ref ptr (slot-type slot) (slot-offset slot)) value)) - -(defmethod foreign-struct-slot-set-form (value ptr (slot simple-struct-slot)) - "Return a form to set the value of a simple structure slot." - `(setf (mem-ref ,ptr ',(slot-type slot) ,(slot-offset slot)) ,value)) - -;;;### Aggregate Slots - -(defclass aggregate-struct-slot (foreign-struct-slot) - ((count :initarg :count :accessor slot-count)) - (:documentation "Aggregate structure slots.")) - -;;; Since MEM-REF returns a pointer for struct types we are able to -;;; chain together slot names when accessing slot values in nested -;;; structures. -(defmethod foreign-struct-slot-value (ptr (slot aggregate-struct-slot)) - "Return a pointer to SLOT relative to PTR." - (convert-from-foreign (inc-pointer ptr (slot-offset slot)) - (slot-type slot))) - -(defmethod foreign-struct-slot-value-form (ptr (slot aggregate-struct-slot)) - "Return a form to get the value of SLOT relative to PTR." - `(convert-from-foreign (inc-pointer ,ptr ,(slot-offset slot)) - ',(slot-type slot))) - -(defmethod translate-aggregate-to-foreign (ptr value (type foreign-struct-type)) - ;;; FIXME: use the block memory interface instead. - (loop for i below (foreign-type-size type) - do (%mem-set (%mem-ref value :char i) ptr :char i))) - -(defmethod (setf foreign-struct-slot-value) - (value ptr (slot aggregate-struct-slot)) - "Set the value of an aggregate SLOT to VALUE in PTR." - (translate-aggregate-to-foreign (inc-pointer ptr (slot-offset slot)) - value - (parse-type (slot-type slot)))) - -(defmethod foreign-struct-slot-set-form (value ptr (slot aggregate-struct-slot)) - "Return a form to get the value of an aggregate SLOT relative to PTR." - `(translate-aggregate-to-foreign (inc-pointer ,ptr ,(slot-offset slot)) - ,value - ,(parse-type (slot-type slot)))) - -;;;## Defining Foreign Structures - -(defun make-struct-slot (name offset type count) - "Make the appropriate type of structure slot." - ;; If TYPE is an aggregate type or COUNT is >1, create an - ;; AGGREGATE-STRUCT-SLOT, otherwise a SIMPLE-STRUCT-SLOT. - (if (or (> count 1) (aggregatep (parse-type type))) - (make-instance 'aggregate-struct-slot :offset offset :type type - :name name :count count) - (make-instance 'simple-struct-slot :offset offset :type type - :name name))) - -(defun parse-deprecated-struct-type (name struct-or-union) - (check-type struct-or-union (member :struct :union)) - (let* ((struct-type-name `(,struct-or-union ,name)) - (struct-type (parse-type struct-type-name))) - (simple-style-warning - "bare references to struct types are deprecated. ~ - Please use ~S or ~S instead." - `(:pointer ,struct-type-name) struct-type-name) - (make-instance (class-of struct-type) - :alignment (alignment struct-type) - :size (size struct-type) - :slots (slots struct-type) - :name (name struct-type) - :bare t))) - -;;; Regarding structure alignment, the following ABIs were checked: -;;; - System-V ABI: x86, x86-64, ppc, arm, mips and itanium. (more?) -;;; - Mac OS X ABI Function Call Guide: ppc32, ppc64 and x86. -;;; -;;; Rules used here: -;;; -;;; 1. "An entire structure or union object is aligned on the same -;;; boundary as its most strictly aligned member." -;;; -;;; 2. "Each member is assigned to the lowest available offset with -;;; the appropriate alignment. This may require internal -;;; padding, depending on the previous member." -;;; -;;; 3. "A structure's size is increased, if necessary, to make it a -;;; multiple of the alignment. This may require tail padding, -;;; depending on the last member." -;;; -;;; Special cases from darwin/ppc32's ABI: -;;; http://developer.apple.com/documentation/DeveloperTools/Conceptual/LowLevelABI/index.html -;;; -;;; 4. "The embedding alignment of the first element in a data -;;; structure is equal to the element's natural alignment." -;;; -;;; 5. "For subsequent elements that have a natural alignment -;;; greater than 4 bytes, the embedding alignment is 4, unless -;;; the element is a vector." (note: this applies for -;;; structures too) - -;; FIXME: get a better name for this. --luis -(defun get-alignment (type alignment-type firstp) - "Return alignment for TYPE according to ALIGNMENT-TYPE." - (declare (ignorable firstp)) - (ecase alignment-type - (:normal #-(and darwin ppc) - (foreign-type-alignment type) - #+(and darwin ppc) - (if firstp - (foreign-type-alignment type) - (min 4 (foreign-type-alignment type)))))) - -(defun adjust-for-alignment (type offset alignment-type firstp) - "Return OFFSET aligned properly for TYPE according to ALIGNMENT-TYPE." - (let* ((align (get-alignment type alignment-type firstp)) - (rem (mod offset align))) - (if (zerop rem) - offset - (+ offset (- align rem))))) - -(defmacro with-tentative-type-definition ((name value namespace) &body body) - (once-only (name namespace) - `(unwind-protect-case () - (progn - (notice-foreign-type ,name ,value ,namespace) - ,@body) - (:abort (undefine-foreign-type ,name ,namespace))))) - -(defun notice-foreign-struct-definition (name options slots) - "Parse and install a foreign structure definition." - (destructuring-bind (&key size (class 'foreign-struct-type)) - options - (let ((struct (make-instance class :name name)) - (current-offset 0) - (max-align 1) - (firstp t)) - (with-tentative-type-definition (name struct :struct) - ;; determine offsets - (dolist (slotdef slots) - (destructuring-bind (slotname type &key (count 1) offset) slotdef - (when (eq (canonicalize-foreign-type type) :void) - (simple-foreign-type-error type :struct - "In struct ~S: void type not allowed in field ~S" - name slotdef)) - (setq current-offset - (or offset - (adjust-for-alignment type current-offset :normal firstp))) - (let* ((slot (make-struct-slot slotname current-offset type count)) - (align (get-alignment (slot-type slot) :normal firstp))) - (setf (gethash slotname (slots struct)) slot) - (when (> align max-align) - (setq max-align align))) - (incf current-offset (* count (foreign-type-size type)))) - (setq firstp nil)) - ;; calculate padding and alignment - (setf (alignment struct) max-align) ; See point 1 above. - (let ((tail-padding (- max-align (rem current-offset max-align)))) - (unless (= tail-padding max-align) ; See point 3 above. - (incf current-offset tail-padding))) - (setf (size struct) (or size current-offset)))))) - -(defun generate-struct-accessors (name conc-name slot-names) - (loop with pointer-arg = (symbolicate '#:pointer-to- name) - for slot in slot-names - for accessor = (symbolicate conc-name slot) - collect `(defun ,accessor (,pointer-arg) - (foreign-slot-value ,pointer-arg '(:struct ,name) ',slot)) - collect `(defun (setf ,accessor) (value ,pointer-arg) - (foreign-slot-set value ,pointer-arg '(:struct ,name) ',slot)))) - -(define-parse-method :struct (name) - (funcall (find-type-parser name :struct))) - -(defvar *defcstruct-hook* nil) - -(defmacro defcstruct (name-and-options &body fields) - "Define the layout of a foreign structure." - (discard-docstring fields) - (destructuring-bind (name . options) - (ensure-list name-and-options) - (let ((conc-name (getf options :conc-name))) - (remf options :conc-name) - (unless (getf options :class) (setf (getf options :class) (symbolicate name '-tclass))) - `(eval-when (:compile-toplevel :load-toplevel :execute) - ;; m-f-s-t could do with this with mop:ensure-class. - ,(when-let (class (getf options :class)) - `(defclass ,class (foreign-struct-type - translatable-foreign-type) - ())) - (notice-foreign-struct-definition ',name ',options ',fields) - ,@(when conc-name - (generate-struct-accessors name conc-name - (mapcar #'car fields))) - ,@(when *defcstruct-hook* - ;; If non-nil, *defcstruct-hook* should be a function - ;; of the arguments that returns NIL or a list of - ;; forms to include in the expansion. - (apply *defcstruct-hook* name-and-options fields)) - (define-parse-method ,name () - (parse-deprecated-struct-type ',name :struct)) - '(:struct ,name))))) - -;;;## Accessing Foreign Structure Slots - -(defun get-slot-info (type slot-name) - "Return the slot info for SLOT-NAME or raise an error." - (let* ((struct (ensure-parsed-base-type type)) - (info (gethash slot-name (slots struct)))) - (unless info - (simple-foreign-type-error type :struct - "Undefined slot ~A in foreign type ~A." - slot-name type)) - info)) - -(defun foreign-slot-pointer (ptr type slot-name) - "Return the address of SLOT-NAME in the structure at PTR." - (foreign-struct-slot-pointer ptr (get-slot-info type slot-name))) - -(define-compiler-macro foreign-slot-pointer (&whole whole ptr type slot-name) - (if (and (constantp type) (constantp slot-name)) - (foreign-struct-slot-pointer-form - ptr (get-slot-info (eval type) (eval slot-name))) - whole)) - -(defun foreign-slot-type (type slot-name) - "Return the type of SLOT in a struct TYPE." - (slot-type (get-slot-info type slot-name))) - -(defun foreign-slot-offset (type slot-name) - "Return the offset of SLOT in a struct TYPE." - (slot-offset (get-slot-info type slot-name))) - -(defun foreign-slot-count (type slot-name) - "Return the number of items in SLOT in a struct TYPE." - (slot-count (get-slot-info type slot-name))) - -(defun foreign-slot-value (ptr type slot-name) - "Return the value of SLOT-NAME in the foreign structure at PTR." - (foreign-struct-slot-value ptr (get-slot-info type slot-name))) - -(define-compiler-macro foreign-slot-value (&whole form ptr type slot-name) - "Optimizer for FOREIGN-SLOT-VALUE when TYPE is constant." - (if (and (constantp type) (constantp slot-name)) - (foreign-struct-slot-value-form - ptr (get-slot-info (eval type) (eval slot-name))) - form)) - -(define-setf-expander foreign-slot-value (ptr type slot-name &environment env) - "SETF expander for FOREIGN-SLOT-VALUE." - (multiple-value-bind (dummies vals newval setter getter) - (get-setf-expansion ptr env) - (declare (ignore setter newval)) - (if (and (constantp type) (constantp slot-name)) - ;; if TYPE and SLOT-NAME are constant we avoid rebinding them - ;; so that the compiler macro on FOREIGN-SLOT-SET works. - (with-unique-names (store) - (values - dummies - vals - (list store) - `(progn - (foreign-slot-set ,store ,getter ,type ,slot-name) - ,store) - `(foreign-slot-value ,getter ,type ,slot-name))) - ;; if not... - (with-unique-names (store slot-name-tmp type-tmp) - (values - (list* type-tmp slot-name-tmp dummies) - (list* type slot-name vals) - (list store) - `(progn - (foreign-slot-set ,store ,getter ,type-tmp ,slot-name-tmp) - ,store) - `(foreign-slot-value ,getter ,type-tmp ,slot-name-tmp)))))) - -(defun foreign-slot-set (value ptr type slot-name) - "Set the value of SLOT-NAME in a foreign structure." - (setf (foreign-struct-slot-value ptr (get-slot-info type slot-name)) value)) - -(define-compiler-macro foreign-slot-set - (&whole form value ptr type slot-name) - "Optimizer when TYPE and SLOT-NAME are constant." - (if (and (constantp type) (constantp slot-name)) - (foreign-struct-slot-set-form - value ptr (get-slot-info (eval type) (eval slot-name))) - form)) - -(defmacro with-foreign-slots ((vars ptr type) &body body) - "Create local symbol macros for each var in VARS to reference -foreign slots in PTR of TYPE. Similar to WITH-SLOTS. -Each var can be of the form: slot-name - in which case slot-name will -be bound to the value of the slot or: (:pointer slot-name) - in which -case slot-name will be bound to the pointer to that slot." - (let ((ptr-var (gensym "PTR"))) - `(let ((,ptr-var ,ptr)) - (symbol-macrolet - ,(loop :for var :in vars - :collect - (if (listp var) - (if (eq (first var) :pointer) - `(,(second var) (foreign-slot-pointer - ,ptr-var ',type ',(second var))) - (error - "Malformed slot specification ~a; must be:`name' or `(:pointer name)'" - var)) - `(,var (foreign-slot-value ,ptr-var ',type ',var)))) - ,@body)))) - -;;; We could add an option to define a struct instead of a class, in -;;; the unlikely event someone needs something like that. -(defmacro define-c-struct-wrapper (class-and-type supers &optional slots) - "Define a new class with CLOS slots matching those of a foreign -struct type. An INITIALIZE-INSTANCE method is defined which -takes a :POINTER initarg that is used to store the slots of a -foreign object. This pointer is only used for initialization and -it is not retained. - -CLASS-AND-TYPE is either a list of the form (class-name -struct-type) or a single symbol naming both. The class will -inherit SUPERS. If a list of SLOTS is specified, only those -slots will be defined and stored." - (destructuring-bind (class-name &optional (struct-type (list :struct class-name))) - (ensure-list class-and-type) - (let ((slots (or slots (foreign-slot-names struct-type)))) - `(progn - (defclass ,class-name ,supers - ,(loop for slot in slots collect - `(,slot :reader ,(format-symbol t "~A-~A" class-name slot)))) - ;; This could be done in a parent class by using - ;; FOREIGN-SLOT-NAMES when instantiating but then the compiler - ;; macros wouldn't kick in. - (defmethod initialize-instance :after ((inst ,class-name) &key pointer) - (with-foreign-slots (,slots pointer ,struct-type) - ,@(loop for slot in slots collect - `(setf (slot-value inst ',slot) ,slot)))) - ',class-name)))) - -;;;# Foreign Unions -;;; -;;; A union is a subclass of FOREIGN-STRUCT-TYPE in which all slots -;;; have an offset of zero. - -;;; See also the notes regarding ABI requirements in -;;; NOTICE-FOREIGN-STRUCT-DEFINITION -(defun notice-foreign-union-definition (name-and-options slots) - "Parse and install a foreign union definition." - (destructuring-bind (name &key size) - (ensure-list name-and-options) - (let ((union (make-instance 'foreign-union-type :name name)) - (max-size 0) - (max-align 0)) - (with-tentative-type-definition (name union :union) - (dolist (slotdef slots) - (destructuring-bind (slotname type &key (count 1)) slotdef - (when (eq (canonicalize-foreign-type type) :void) - (simple-foreign-type-error name :struct - "In union ~S: void type not allowed in field ~S" - name slotdef)) - (let* ((slot (make-struct-slot slotname 0 type count)) - (size (* count (foreign-type-size type))) - (align (foreign-type-alignment (slot-type slot)))) - (setf (gethash slotname (slots union)) slot) - (when (> size max-size) - (setf max-size size)) - (when (> align max-align) - (setf max-align align))))) - (setf (size union) (or size max-size)) - (setf (alignment union) max-align))))) - -(define-parse-method :union (name) - (funcall (find-type-parser name :union))) - -(defmacro defcunion (name-and-options &body fields) - "Define the layout of a foreign union." - (discard-docstring fields) - (destructuring-bind (name &key size) - (ensure-list name-and-options) - (declare (ignore size)) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (notice-foreign-union-definition ',name-and-options ',fields) - (define-parse-method ,name () - (parse-deprecated-struct-type ',name :union)) - '(:union ,name)))) - -;;;# Operations on Types - -(defmethod foreign-type-alignment (type) - "Return the alignment in bytes of a foreign type." - (foreign-type-alignment (parse-type type))) - -(defmacro with-foreign-object ((var type &optional (count 1)) &body body) - "Bind VAR to a pointer to COUNT objects of TYPE during BODY. -The buffer has dynamic extent and may be stack allocated." - `(with-foreign-pointer - (,var ,(if (constantp type) - ;; with-foreign-pointer may benefit from constant folding: - (if (constantp count) - (* (eval count) (foreign-type-size (eval type))) - `(* ,count ,(foreign-type-size (eval type)))) - `(* ,count (foreign-type-size ,type)))) - ,@body)) - -(defmacro with-foreign-objects (bindings &body body) - (if bindings - `(with-foreign-object ,(car bindings) - (with-foreign-objects ,(cdr bindings) - ,@body)) - `(progn ,@body))) - -;;;## Anonymous Type Translators -;;; -;;; (:wrapper :to-c some-function :from-c another-function) -;;; -;;; TODO: We will need to add a FREE function to this as well I think. -;;; --james - -(define-foreign-type foreign-type-wrapper () - ((to-c :initarg :to-c :reader wrapper-to-c) - (from-c :initarg :from-c :reader wrapper-from-c)) - (:documentation "Wrapper type.")) - -(define-parse-method :wrapper (base-type &key to-c from-c) - (make-instance 'foreign-type-wrapper - :actual-type (parse-type base-type) - :to-c (or to-c 'identity) - :from-c (or from-c 'identity))) - -(defmethod translate-to-foreign (value (type foreign-type-wrapper)) - (translate-to-foreign - (funcall (slot-value type 'to-c) value) (actual-type type))) - -(defmethod translate-from-foreign (value (type foreign-type-wrapper)) - (funcall (slot-value type 'from-c) - (translate-from-foreign value (actual-type type)))) - -;;;# Other types - -;;; Boolean type. Maps to an :int by default. Only accepts integer types. -(define-foreign-type foreign-boolean-type () - ()) - -(define-parse-method :boolean (&optional (base-type :int)) - (make-instance - 'foreign-boolean-type :actual-type - (ecase (canonicalize-foreign-type base-type) - ((:char :unsigned-char :int :unsigned-int :long :unsigned-long - #-cffi-sys::no-long-long :long-long - #-cffi-sys::no-long-long :unsigned-long-long) base-type)))) - -(defmethod translate-to-foreign (value (type foreign-boolean-type)) - (if value 1 0)) - -(defmethod translate-from-foreign (value (type foreign-boolean-type)) - (not (zerop value))) - -(defmethod expand-to-foreign (value (type foreign-boolean-type)) - "Optimization for the :boolean type." - (if (constantp value) - (if (eval value) 1 0) - `(if ,value 1 0))) - -(defmethod expand-from-foreign (value (type foreign-boolean-type)) - "Optimization for the :boolean type." - (if (constantp value) ; very unlikely, heh - (not (zerop (eval value))) - `(not (zerop ,value)))) - -;;; Boolean type that represents C99 _Bool -(defctype :bool (:boolean :char)) - -;;;# Typedefs for built-in types. - -(defctype :uchar :unsigned-char) -(defctype :ushort :unsigned-short) -(defctype :uint :unsigned-int) -(defctype :ulong :unsigned-long) -(defctype :llong :long-long) -(defctype :ullong :unsigned-long-long) - -;;; We try to define the :[u]int{8,16,32,64} types by looking at -;;; the sizes of the built-in integer types and defining typedefs. -(eval-when (:compile-toplevel :load-toplevel :execute) - (macrolet - ((match-types (sized-types mtypes) - `(progn - ,@(loop for (type . size-or-type) in sized-types - for m = (car (member (if (keywordp size-or-type) - (foreign-type-size size-or-type) - size-or-type) - mtypes :key #'foreign-type-size)) - when m collect `(defctype ,type ,m))))) - ;; signed - (match-types ((:int8 . 1) (:int16 . 2) (:int32 . 4) (:int64 . 8) - (:intptr . :pointer)) - (:char :short :int :long :long-long)) - ;; unsigned - (match-types ((:uint8 . 1) (:uint16 . 2) (:uint32 . 4) (:uint64 . 8) - (:uintptr . :pointer)) - (:unsigned-char :unsigned-short :unsigned-int :unsigned-long - :unsigned-long-long)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/utils.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/utils.lisp deleted file mode 100644 index 6376196..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/utils.lisp +++ /dev/null @@ -1,84 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; utils.lisp --- Various utilities. -;;; -;;; Copyright (C) 2005-2008, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi) - -(defmacro discard-docstring (body-var &optional force) - "Discards the first element of the list in body-var if it's a -string and the only element (or if FORCE is T)." - `(when (and (stringp (car ,body-var)) (or ,force (cdr ,body-var))) - (pop ,body-var))) - -(defun single-bit-p (integer) - "Answer whether INTEGER, which must be an integer, is a single -set twos-complement bit." - (if (<= integer 0) - nil ; infinite set bits for negatives - (loop until (logbitp 0 integer) - do (setf integer (ash integer -1)) - finally (return (zerop (ash integer -1)))))) - -;;; This function is here because it needs to be defined early. It's -;;; used by DEFINE-PARSE-METHOD and DEFCTYPE to warn users when -;;; they're defining types whose names belongs to the KEYWORD or CL -;;; packages. CFFI itself gets to use keywords without a warning. -(defun warn-if-kw-or-belongs-to-cl (name) - (let ((package (symbol-package name))) - (when (and (not (eq *package* (find-package '#:cffi))) - (member package '(#:common-lisp #:keyword) - :key #'find-package)) - (warn "Defining a foreign type named ~S. This symbol belongs to the ~A ~ - package and that may interfere with other code using CFFI." - name (package-name package))))) - -(define-condition obsolete-argument-warning (style-warning) - ((old-arg :initarg :old-arg :reader old-arg) - (new-arg :initarg :new-arg :reader new-arg)) - (:report (lambda (c s) - (format s "Keyword ~S is obsolete, please use ~S" - (old-arg c) (new-arg c))))) - -(defun warn-obsolete-argument (old-arg new-arg) - (warn 'obsolete-argument-warning - :old-arg old-arg :new-arg new-arg)) - -(defun split-if (test seq &optional (dir :before)) - (remove-if #'(lambda (x) (equal x (subseq seq 0 0))) - (loop for start fixnum = 0 - then (if (eq dir :before) - stop - (the fixnum (1+ (the fixnum stop)))) - while (< start (length seq)) - for stop = (position-if test seq - :start (if (eq dir :elide) - start - (the fixnum (1+ start)))) - collect (subseq seq start - (if (and stop (eq dir :after)) - (the fixnum (1+ (the fixnum stop))) - stop)) - while stop))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/GNUmakefile b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/GNUmakefile deleted file mode 100644 index 0776a19..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/GNUmakefile +++ /dev/null @@ -1,98 +0,0 @@ -# -*- Mode: Makefile; tab-width: 3; indent-tabs-mode: t -*- -# -# Makefile --- Make targets for various tasks. -# -# Copyright (C) 2005, James Bielman -# -# 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. -# - -OSTYPE = $(shell uname) -ARCH = $(shell uname -m) - -CC := gcc -CFLAGS := -Wall -std=c99 -pedantic -SHLIB_CFLAGS := -shared -SHLIB_EXT := .so - -ifneq ($(if $(filter Linux %BSD,$(OSTYPE)),OK), OK) -ifeq ($(OSTYPE), Darwin) -SHLIB_CFLAGS := -dynamiclib -SHLIB_EXT := .dylib -ifeq ($(shell sysctl -n hw.optional.x86_64), 1) -ARCH := x86_64 -CFLAGS_64 := -m64 -endif -else -ifeq ($(OSTYPE), SunOS) -CFLAGS := -m64 -fPIC -c -Wall -std=c99 -pedantic -else -# Let's assume this is win32 -SHLIB_EXT := .dll -endif -endif -endif - -ifneq ($(ARCH), x86_64) -CFLAGS += -lm -endif - -ifeq ($(ARCH), x86_64) -CFLAGS_64 += -fPIC -endif - -# Are all G5s ppc970s? -ifeq ($(ARCH), ppc970) -CFLAGS_64 += -m64 -endif - -SHLIBS = libtest$(SHLIB_EXT) libtest2$(SHLIB_EXT) libfsbv$(SHLIB_EXT) - -ifeq ($(ARCH), x86_64) -SHLIBS += libtest32$(SHLIB_EXT) libtest2_32$(SHLIB_EXT) libfsbv_32$(SHLIB_EXT) -endif - -shlibs: $(SHLIBS) - -libtest$(SHLIB_EXT): libtest.c - $(CC) -o $@ $(SHLIB_CFLAGS) $(CFLAGS) $(CFLAGS_64) $< - -libtest2$(SHLIB_EXT): libtest2.c - $(CC) -o $@ $(SHLIB_CFLAGS) $(CFLAGS) $(CFLAGS_64) $< - -libfsbv$(SHLIB_EXT): libfsbv.c - $(CC) -o $@ $(SHLIB_CFLAGS) $(CFLAGS) $(CFLAGS_64) $< - -ifeq ($(ARCH), x86_64) -libtest32$(SHLIB_EXT): libtest.c - -$(CC) -m32 -o $@ $(SHLIB_CFLAGS) $(CFLAGS) $< - -libtest2_32$(SHLIB_EXT): libtest2.c - -$(CC) -m32 -o $@ $(SHLIB_CFLAGS) $(CFLAGS) $< - -libfsbv_32$(SHLIB_EXT): libfsbv.c - -$(CC) -m32 -o $@ $(SHLIB_CFLAGS) $(CFLAGS) $< -endif - -clean: - rm -f *.so *.dylib *.dll *.bundle - -# vim: ft=make ts=3 noet diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/Makefile b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/Makefile deleted file mode 100644 index 88bb7e9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -shlibs clean: - gmake $@ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/arrays.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/arrays.lisp deleted file mode 100644 index 1e96514..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/arrays.lisp +++ /dev/null @@ -1,71 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; arrays.lisp --- Tests for foreign arrays. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; Copyright (C) 2005-2007, Luis Oliveira -;;; -;;; 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. -;;; - -;;;#Foreign Array Conversion Tests -;;; - -(in-package #:cffi-tests) - -(deftest array.foreign-to-lisp.basic - (with-foreign-array (ptr #(1 2 3 4 5) '(:array :int32 5)) - (foreign-array-to-lisp ptr '(:array :int32 5))) - #(1 2 3 4 5)) - -(deftest array.foreign-to-lisp.adjustable - (with-foreign-array (ptr #(1 2 3 4 5) '(:array :int32 5)) - (let ((array (foreign-array-to-lisp ptr '(:array :int32 5) - :adjustable t))) - (adjustable-array-p array))) - t) - -(deftest array.foreign-to-lisp.displaced - (let ((array (make-array 10 :initial-contents '(1 2 3 4 5 6 7 8 9 0)))) - (with-foreign-array (ptr #(10 20 30 40 50) '(:array :int32 5)) - (let ((displaced (foreign-array-to-lisp ptr '(:array :int32 5) - :displaced-to array - :displaced-index-offset 5))) - array))) - #(1 2 3 4 5 10 20 30 40 50)) - -;;; Implementation detail: 15.1.2.2 of the CL standard states that the only -;;; truly portable array specializations are for bits (bit-vectors) and -;;; characters (strings). Since char-codes are implementation-dependent, it -;;; would be tricky to write a portable test for them without generating -;;; characters at runtime. So, for a truly portable test, we are only left with -;;; bits, which are luckily numeric, and equal to (UNSIGNED-BYTE 1). -;;; This is why the below test is so terribly wasteful, spending a whole byte -;;; for a single bit - CFFI has no capabilities for dealing with single bits, -;;; and this test is only meant to check correctness of the :ELEMENT-TYPE -;;; argument to MAKE-ARRAY. In actual use cases of specialized -;;; FOREIGN-ARRAY-TO-LISP, capable implementations will be able to make -;;; specialized arrays of types that are commonly optimized for and/or -;;; representable in hardware, such as (UNSIGNED-BYTE 8) on x86 architectures. -(deftest array.foreign-to-lisp.specialized - (with-foreign-array (ptr #(1 0 1 0 1 1 1 0) '(:array :int8 8)) - (foreign-array-to-lisp ptr '(:array :int8 8) :element-type 'bit)) - #*10101110) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/bindings.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/bindings.lisp deleted file mode 100644 index b0d62d6..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/bindings.lisp +++ /dev/null @@ -1,148 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; libtest.lisp --- Setup CFFI bindings for libtest. -;;; -;;; Copyright (C) 2005-2007, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi-tests) - -(define-foreign-library (libtest :type :test) - (:darwin (:or "libtest.dylib" "libtest32.dylib")) - (:unix (:or "libtest.so" "libtest32.so")) - (:windows "libtest.dll") - (t (:default "libtest"))) - -(define-foreign-library (libtest2 :type :test) - (:darwin (:or "libtest2.dylib" "libtest2_32.dylib")) - (:unix (:or "libtest2.so" "libtest2_32.so")) - (t (:default "libtest2"))) - -(define-foreign-library (libfsbv :type :test) - (:darwin (:or "libfsbv.dylib" "libfsbv32.dylib")) - (:unix (:or "libfsbv.so" "libfsbv_32.so")) - (:windows "libfsbv.dll") - (t (:default "libfsbv"))) - -(define-foreign-library libc - (:windows "msvcrt.dll")) - -(define-foreign-library libm - #+(and lispworks darwin) ; not sure why the full path is necessary - (:darwin "/usr/lib/libm.dylib") - (t (:default "libm"))) - -(defmacro deftest (name &rest body) - (destructuring-bind (name &key expected-to-fail) - (alexandria:ensure-list name) - (let ((result `(rt:deftest ,name ,@body))) - (when expected-to-fail - (setf result `(progn - (when ,expected-to-fail - (pushnew ',name rt::*expected-failures*)) - ,result))) - result))) - -(defun call-within-new-thread (fn &rest args) - (let (result - error - (cv (bordeaux-threads:make-condition-variable)) - (lock (bordeaux-threads:make-lock))) - (bordeaux-threads:with-lock-held (lock) - (bordeaux-threads:make-thread - (lambda () - (multiple-value-setq (result error) - (ignore-errors (apply fn args))) - (bordeaux-threads:with-lock-held (lock) - (bordeaux-threads:condition-notify cv)))) - (bordeaux-threads:condition-wait cv lock) - (values result error)))) - -;;; As of OSX 10.6.6, loading CoreFoundation on something other than -;;; the initial thread results in a crash. -(deftest load-core-foundation - (progn - #+bordeaux-threads - (call-within-new-thread 'load-foreign-library - '(:framework "CoreFoundation")) - t) - t) - -;;; Return the directory containing the source when compiling or -;;; loading this file. We don't use *LOAD-TRUENAME* because the fasl -;;; file may be in a different directory than the source with certain -;;; ASDF extensions loaded. -(defun load-directory () - (let ((here #.(or *compile-file-truename* *load-truename*))) - (make-pathname :name nil :type nil :version nil - :defaults here))) - -(defun load-test-libraries () - (let ((*foreign-library-directories* (list (load-directory)))) - (load-foreign-library 'libtest) - (load-foreign-library 'libtest2) - (load-foreign-library 'libfsbv) - (load-foreign-library 'libc) - #+(or abcl lispworks) (load-foreign-library 'libm))) - -#-(:and :ecl (:not :dffi)) -(load-test-libraries) - -#+(:and :ecl (:not :dffi)) -(ffi:load-foreign-library - #.(make-pathname :name "libtest" :type "so" - :defaults (or *compile-file-truename* *load-truename*))) - -;;; check libtest version -(defparameter *required-dll-version* "20120107") - -(defcvar "dll_version" :string) - -(unless (string= *dll-version* *required-dll-version*) - (error "version check failed: expected ~s but libtest reports ~s" - *required-dll-version* - *dll-version*)) - -;;; The maximum and minimum values for single and double precision C -;;; floating point values, which may be quite different from the -;;; corresponding Lisp versions. -(defcvar "float_max" :float) -(defcvar "float_min" :float) -(defcvar "double_max" :double) -(defcvar "double_min" :double) - -(defun run-cffi-tests (&key (compiled nil)) - (let ((regression-test::*compile-tests* compiled) - (*package* (find-package '#:cffi-tests))) - (format t "~&;;; running tests (~Acompiled)" (if compiled "" "un")) - (do-tests) - (set-difference (regression-test:pending-tests) - regression-test::*expected-failures*))) - -(defun run-all-cffi-tests () - (append (run-cffi-tests :compiled nil) - (run-cffi-tests :compiled t))) - -(defmacro expecting-error (&body body) - `(handler-case (progn ,@body :no-error) - (error () :error))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/callbacks.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/callbacks.lisp deleted file mode 100644 index cd11fcc..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/callbacks.lisp +++ /dev/null @@ -1,526 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; callbacks.lisp --- Tests on callbacks. -;;; -;;; Copyright (C) 2005-2006, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi-tests) - -(defcfun "expect_char_sum" :int (f :pointer)) -(defcfun "expect_unsigned_char_sum" :int (f :pointer)) -(defcfun "expect_short_sum" :int (f :pointer)) -(defcfun "expect_unsigned_short_sum" :int (f :pointer)) -(defcfun "expect_int_sum" :int (f :pointer)) -(defcfun "expect_unsigned_int_sum" :int (f :pointer)) -(defcfun "expect_long_sum" :int (f :pointer)) -(defcfun "expect_unsigned_long_sum" :int (f :pointer)) -(defcfun "expect_float_sum" :int (f :pointer)) -(defcfun "expect_double_sum" :int (f :pointer)) -(defcfun "expect_pointer_sum" :int (f :pointer)) -(defcfun "expect_strcat" :int (f :pointer)) - -#-cffi-sys::no-long-long -(progn - (defcfun "expect_long_long_sum" :int (f :pointer)) - (defcfun "expect_unsigned_long_long_sum" :int (f :pointer))) - -#+(and scl long-float) -(defcfun "expect_long_double_sum" :int (f :pointer)) - -(defcallback sum-char :char ((a :char) (b :char)) - "Test if the named block is present and the docstring too." - ;(format t "~%}}} a: ~A, b: ~A {{{~%" a b) - (return-from sum-char (+ a b))) - -(defcallback sum-unsigned-char :unsigned-char - ((a :unsigned-char) (b :unsigned-char)) - ;(format t "~%}}} a: ~A, b: ~A {{{~%" a b) - (+ a b)) - -(defcallback sum-short :short ((a :short) (b :short)) - ;(format t "~%}}} a: ~A, b: ~A {{{~%" a b) - (+ a b)) - -(defcallback sum-unsigned-short :unsigned-short - ((a :unsigned-short) (b :unsigned-short)) - ;(format t "~%}}} a: ~A, b: ~A {{{~%" a b) - (+ a b)) - -(defcallback sum-int :int ((a :int) (b :int)) - (+ a b)) - -(defcallback sum-unsigned-int :unsigned-int - ((a :unsigned-int) (b :unsigned-int)) - (+ a b)) - -(defcallback sum-long :long ((a :long) (b :long)) - (+ a b)) - -(defcallback sum-unsigned-long :unsigned-long - ((a :unsigned-long) (b :unsigned-long)) - (+ a b)) - -#-cffi-sys::no-long-long -(progn - (defcallback sum-long-long :long-long - ((a :long-long) (b :long-long)) - (+ a b)) - - (defcallback sum-unsigned-long-long :unsigned-long-long - ((a :unsigned-long-long) (b :unsigned-long-long)) - (+ a b))) - -(defcallback sum-float :float ((a :float) (b :float)) - ;(format t "~%}}} a: ~A, b: ~A {{{~%" a b) - (+ a b)) - -(defcallback sum-double :double ((a :double) (b :double)) - ;(format t "~%}}} a: ~A, b: ~A {{{~%" a b) - (+ a b)) - -#+(and scl long-float) -(defcallback sum-long-double :long-double ((a :long-double) (b :long-double)) - ;(format t "~%}}} a: ~A, b: ~A {{{~%" a b) - (+ a b)) - -(defcallback sum-pointer :pointer ((ptr :pointer) (offset :int)) - (inc-pointer ptr offset)) - -(defcallback lisp-strcat :string ((a :string) (b :string)) - (concatenate 'string a b)) - -(deftest callbacks.char - (expect-char-sum (get-callback 'sum-char)) - 1) - -(deftest callbacks.unsigned-char - (expect-unsigned-char-sum (get-callback 'sum-unsigned-char)) - 1) - -(deftest callbacks.short - (expect-short-sum (callback sum-short)) - 1) - -(deftest callbacks.unsigned-short - (expect-unsigned-short-sum (callback sum-unsigned-short)) - 1) - -(deftest callbacks.int - (expect-int-sum (callback sum-int)) - 1) - -(deftest callbacks.unsigned-int - (expect-unsigned-int-sum (callback sum-unsigned-int)) - 1) - -(deftest callbacks.long - (expect-long-sum (callback sum-long)) - 1) - -(deftest callbacks.unsigned-long - (expect-unsigned-long-sum (callback sum-unsigned-long)) - 1) - -#-cffi-sys::no-long-long -(progn - (deftest (callbacks.long-long :expected-to-fail (alexandria:featurep :openmcl)) - (expect-long-long-sum (callback sum-long-long)) - 1) - - (deftest callbacks.unsigned-long-long - (expect-unsigned-long-long-sum (callback sum-unsigned-long-long)) - 1)) - -(deftest callbacks.float - (expect-float-sum (callback sum-float)) - 1) - -(deftest callbacks.double - (expect-double-sum (callback sum-double)) - 1) - -#+(and scl long-float) -(deftest callbacks.long-double - (expect-long-double-sum (callback sum-long-double)) - 1) - -(deftest callbacks.pointer - (expect-pointer-sum (callback sum-pointer)) - 1) - -(deftest callbacks.string - (expect-strcat (callback lisp-strcat)) - 1) - -#-cffi-sys::no-foreign-funcall -(defcallback return-a-string-not-nil :string () - "abc") - -#-cffi-sys::no-foreign-funcall -(deftest callbacks.string-not-docstring - (foreign-funcall-pointer (callback return-a-string-not-nil) () :string) - "abc") - -(defcallback check-for-nil :boolean ((pointer :pointer)) - (null pointer)) - -#-cffi-sys::no-foreign-funcall -(deftest callbacks.nil-for-null - (foreign-funcall-pointer (callback check-for-nil) nil - :pointer (null-pointer) :boolean) - nil) - -;;; This one tests mem-aref too. -(defcfun "qsort" :void - (base :pointer) - (nmemb :int) - (size :int) - (fun-compar :pointer)) - -(defcallback < :int ((a :pointer) (b :pointer)) - (let ((x (mem-ref a :int)) - (y (mem-ref b :int))) - (cond ((> x y) 1) - ((< x y) -1) - (t 0)))) - -(deftest callbacks.qsort - (with-foreign-object (array :int 10) - ;; Initialize array. - (loop for i from 0 and n in '(7 2 10 4 3 5 1 6 9 8) - do (setf (mem-aref array :int i) n)) - ;; Sort it. - (qsort array 10 (foreign-type-size :int) (callback <)) - ;; Return it as a list. - (loop for i from 0 below 10 - collect (mem-aref array :int i))) - (1 2 3 4 5 6 7 8 9 10)) - -;;; void callback -(defparameter *int* -1) - -(defcfun "pass_int_ref" :void (f :pointer)) - -;;; CMUCL chokes on this one for some reason. -#-(and darwin cmucl) -(defcallback read-int-from-pointer :void ((a :pointer)) - (setq *int* (mem-ref a :int))) - -#+(and darwin cmucl) -(pushnew 'callbacks.void rt::*expected-failures*) - -(deftest callbacks.void - (progn - (pass-int-ref (callback read-int-from-pointer)) - *int*) - 1984) - -;;; test funcalling of a callback and also declarations inside -;;; callbacks. - -#-cffi-sys::no-foreign-funcall -(progn - (defcallback sum-2 :int ((a :int) (b :int) (c :int)) - (declare (ignore c)) - (+ a b)) - - (deftest callbacks.funcall.1 - (foreign-funcall-pointer (callback sum-2) () :int 2 :int 3 :int 1 :int) - 5) - - (defctype foo-float :float) - - (defcallback sum-2f foo-float - ((a foo-float) (b foo-float) (c foo-float) (d foo-float) (e foo-float)) - "This one ignores the middle 3 arguments." - (declare (ignore b c)) - (declare (ignore d)) - (+ a e)) - - (deftest callbacks.funcall.2 - (foreign-funcall-pointer (callback sum-2f) () foo-float 1.0 foo-float 2.0 - foo-float 3.0 foo-float 4.0 foo-float 5.0 - foo-float) - 6.0)) - -;;; (cb-test :no-long-long t) - -(defcfun "call_sum_127_no_ll" :long (cb :pointer)) - -;;; CMUCL and CCL choke on this one. -#-(or cmucl clozure - #.(cl:if (cl:>= cl:lambda-parameters-limit 127) '(:or) '(:and))) -(defcallback sum-127-no-ll :long - ((a1 :unsigned-long) (a2 :pointer) (a3 :long) (a4 :double) - (a5 :unsigned-long) (a6 :float) (a7 :float) (a8 :int) (a9 :unsigned-int) - (a10 :double) (a11 :double) (a12 :double) (a13 :pointer) - (a14 :unsigned-short) (a15 :unsigned-short) (a16 :pointer) (a17 :long) - (a18 :long) (a19 :int) (a20 :short) (a21 :unsigned-short) - (a22 :unsigned-short) (a23 :char) (a24 :long) (a25 :pointer) (a26 :pointer) - (a27 :char) (a28 :unsigned-char) (a29 :unsigned-long) (a30 :short) - (a31 :int) (a32 :int) (a33 :unsigned-char) (a34 :short) (a35 :long) - (a36 :long) (a37 :pointer) (a38 :unsigned-short) (a39 :char) (a40 :double) - (a41 :unsigned-short) (a42 :pointer) (a43 :short) (a44 :unsigned-long) - (a45 :unsigned-short) (a46 :float) (a47 :unsigned-char) (a48 :short) - (a49 :float) (a50 :short) (a51 :char) (a52 :unsigned-long) - (a53 :unsigned-long) (a54 :char) (a55 :float) (a56 :long) (a57 :pointer) - (a58 :short) (a59 :float) (a60 :unsigned-int) (a61 :float) - (a62 :unsigned-int) (a63 :double) (a64 :unsigned-int) (a65 :unsigned-char) - (a66 :int) (a67 :long) (a68 :char) (a69 :short) (a70 :double) (a71 :int) - (a72 :pointer) (a73 :char) (a74 :unsigned-short) (a75 :pointer) - (a76 :unsigned-short) (a77 :pointer) (a78 :unsigned-long) (a79 :double) - (a80 :pointer) (a81 :long) (a82 :float) (a83 :unsigned-short) - (a84 :unsigned-short) (a85 :pointer) (a86 :float) (a87 :int) - (a88 :unsigned-int) (a89 :double) (a90 :float) (a91 :long) (a92 :pointer) - (a93 :unsigned-short) (a94 :float) (a95 :unsigned-char) (a96 :unsigned-char) - (a97 :float) (a98 :unsigned-int) (a99 :float) (a100 :unsigned-short) - (a101 :double) (a102 :unsigned-short) (a103 :unsigned-long) - (a104 :unsigned-int) (a105 :unsigned-long) (a106 :pointer) - (a107 :unsigned-char) (a108 :char) (a109 :char) (a110 :unsigned-short) - (a111 :unsigned-long) (a112 :float) (a113 :short) (a114 :pointer) - (a115 :long) (a116 :unsigned-short) (a117 :short) (a118 :double) - (a119 :short) (a120 :int) (a121 :char) (a122 :unsigned-long) (a123 :long) - (a124 :int) (a125 :pointer) (a126 :double) (a127 :unsigned-char)) - (let ((args (list a1 (pointer-address a2) a3 (floor a4) a5 (floor a6) - (floor a7) a8 a9 (floor a10) (floor a11) (floor a12) - (pointer-address a13) a14 a15 (pointer-address a16) a17 a18 - a19 a20 a21 a22 a23 a24 (pointer-address a25) - (pointer-address a26) a27 a28 a29 a30 a31 a32 a33 a34 a35 - a36 (pointer-address a37) a38 a39 (floor a40) a41 - (pointer-address a42) a43 a44 a45 (floor a46) a47 a48 - (floor a49) a50 a51 a52 a53 a54 (floor a55) a56 - (pointer-address a57) a58 (floor a59) a60 (floor a61) a62 - (floor a63) a64 a65 a66 a67 a68 a69 (floor a70) a71 - (pointer-address a72) a73 a74 (pointer-address a75) a76 - (pointer-address a77) a78 (floor a79) (pointer-address a80) - a81 (floor a82) a83 a84 (pointer-address a85) (floor a86) - a87 a88 (floor a89) (floor a90) a91 (pointer-address a92) - a93 (floor a94) a95 a96 (floor a97) a98 (floor a99) a100 - (floor a101) a102 a103 a104 a105 (pointer-address a106) a107 - a108 a109 a110 a111 (floor a112) a113 (pointer-address a114) - a115 a116 a117 (floor a118) a119 a120 a121 a122 a123 a124 - (pointer-address a125) (floor a126) a127))) - #-(and) - (loop for i from 1 and arg in args do - (format t "a~A: ~A~%" i arg)) - (reduce #'+ args))) - -#+(or openmcl cmucl (and darwin (or allegro lispworks))) -(push 'callbacks.bff.1 regression-test::*expected-failures*) - -#+#.(cl:if (cl:>= cl:lambda-parameters-limit 127) '(:and) '(:or)) -(deftest callbacks.bff.1 - (call-sum-127-no-ll (callback sum-127-no-ll)) - 2008547941) - -;;; (cb-test) - -#-(or cffi-sys::no-long-long - #.(cl:if (cl:>= cl:lambda-parameters-limit 127) '(or) '(and))) -(progn - (defcfun "call_sum_127" :long-long (cb :pointer)) - - ;;; CMUCL and CCL choke on this one. - #-(or cmucl clozure) - (defcallback sum-127 :long-long - ((a1 :short) (a2 :char) (a3 :pointer) (a4 :float) (a5 :long) (a6 :double) - (a7 :unsigned-long-long) (a8 :unsigned-short) (a9 :unsigned-char) - (a10 :char) (a11 :char) (a12 :unsigned-short) (a13 :unsigned-long-long) - (a14 :unsigned-short) (a15 :long-long) (a16 :unsigned-short) - (a17 :unsigned-long-long) (a18 :unsigned-char) (a19 :unsigned-char) - (a20 :unsigned-long-long) (a21 :long-long) (a22 :char) (a23 :float) - (a24 :unsigned-int) (a25 :float) (a26 :float) (a27 :unsigned-int) - (a28 :float) (a29 :char) (a30 :unsigned-char) (a31 :long) (a32 :long-long) - (a33 :unsigned-char) (a34 :double) (a35 :long) (a36 :double) - (a37 :unsigned-int) (a38 :unsigned-short) (a39 :long-long) - (a40 :unsigned-int) (a41 :int) (a42 :unsigned-long-long) (a43 :long) - (a44 :short) (a45 :unsigned-int) (a46 :unsigned-int) - (a47 :unsigned-long-long) (a48 :unsigned-int) (a49 :long) (a50 :pointer) - (a51 :unsigned-char) (a52 :char) (a53 :long-long) (a54 :unsigned-short) - (a55 :unsigned-int) (a56 :float) (a57 :unsigned-char) (a58 :unsigned-long) - (a59 :long-long) (a60 :float) (a61 :long) (a62 :float) (a63 :int) - (a64 :float) (a65 :unsigned-short) (a66 :unsigned-long-long) (a67 :short) - (a68 :unsigned-long) (a69 :long) (a70 :char) (a71 :unsigned-short) - (a72 :long-long) (a73 :short) (a74 :double) (a75 :pointer) - (a76 :unsigned-int) (a77 :char) (a78 :unsigned-int) (a79 :pointer) - (a80 :pointer) (a81 :unsigned-char) (a82 :pointer) (a83 :unsigned-short) - (a84 :unsigned-char) (a85 :long) (a86 :pointer) (a87 :char) (a88 :long) - (a89 :unsigned-short) (a90 :unsigned-char) (a91 :double) - (a92 :unsigned-long-long) (a93 :unsigned-short) (a94 :unsigned-short) - (a95 :unsigned-int) (a96 :long) (a97 :char) (a98 :long) (a99 :char) - (a100 :short) (a101 :unsigned-short) (a102 :unsigned-long) - (a103 :unsigned-long) (a104 :short) (a105 :long-long) (a106 :long-long) - (a107 :long-long) (a108 :double) (a109 :unsigned-short) - (a110 :unsigned-char) (a111 :short) (a112 :unsigned-char) (a113 :long) - (a114 :long-long) (a115 :unsigned-long-long) (a116 :unsigned-int) - (a117 :unsigned-long) (a118 :unsigned-char) (a119 :long-long) - (a120 :unsigned-char) (a121 :unsigned-long-long) (a122 :double) - (a123 :unsigned-char) (a124 :long-long) (a125 :unsigned-char) - (a126 :char) (a127 :long-long)) - (+ a1 a2 (pointer-address a3) (values (floor a4)) a5 (values (floor a6)) - a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 - (values (floor a23)) a24 (values (floor a25)) (values (floor a26)) - a27 (values (floor a28)) a29 a30 a31 a32 a33 (values (floor a34)) - a35 (values (floor a36)) a37 a38 a39 a40 a41 a42 a43 a44 a45 a46 a47 - a48 a49 (pointer-address a50) a51 a52 a53 a54 a55 (values (floor a56)) - a57 a58 a59 (values (floor a60)) a61 (values (floor a62)) a63 - (values (floor a64)) a65 a66 a67 a68 a69 a70 a71 a72 a73 - (values (floor a74)) (pointer-address a75) a76 a77 a78 - (pointer-address a79) (pointer-address a80) a81 (pointer-address a82) - a83 a84 a85 (pointer-address a86) a87 a88 a89 a90 (values (floor a91)) - a92 a93 a94 a95 a96 a97 a98 a99 a100 a101 a102 a103 a104 a105 a106 a107 - (values (floor a108)) a109 a110 a111 a112 a113 a114 a115 a116 a117 a118 - a119 a120 a121 (values (floor a122)) a123 a124 a125 a126 a127)) - - #+(or openmcl cmucl) - (push 'callbacks.bff.2 rt::*expected-failures*) - - (deftest callbacks.bff.2 - (call-sum-127 (callback sum-127)) - 8166570665645582011)) - -;;; regression test: (callback non-existant-callback) should throw an error -(deftest callbacks.non-existant - (not (null (nth-value 1 (ignore-errors (callback doesnt-exist))))) - t) - -;;; Handling many arguments of type double. Many lisps (used to) fail -;;; this one on darwin/ppc. This test might be bogus due to floating -;;; point arithmetic rounding errors. -;;; -;;; CMUCL chokes on this one. -#-(and darwin cmucl) -(defcallback double26 :double - ((a1 :double) (a2 :double) (a3 :double) (a4 :double) (a5 :double) - (a6 :double) (a7 :double) (a8 :double) (a9 :double) (a10 :double) - (a11 :double) (a12 :double) (a13 :double) (a14 :double) (a15 :double) - (a16 :double) (a17 :double) (a18 :double) (a19 :double) (a20 :double) - (a21 :double) (a22 :double) (a23 :double) (a24 :double) (a25 :double) - (a26 :double)) - (let ((args (list a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 - a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26))) - #-(and) - (loop for i from 1 and arg in args do - (format t "a~A: ~A~%" i arg)) - (reduce #'+ args))) - -(defcfun "call_double26" :double (f :pointer)) - -#+(and darwin (or allegro cmucl)) -(pushnew 'callbacks.double26 rt::*expected-failures*) - -(deftest callbacks.double26 - (call-double26 (callback double26)) - 81.64d0) - -#+(and darwin cmucl) -(pushnew 'callbacks.double26.funcall rt::*expected-failures*) - -#-cffi-sys::no-foreign-funcall -(deftest callbacks.double26.funcall - (foreign-funcall-pointer - (callback double26) () :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double) - 81.64d0) - -;;; Same as above, for floats. -#-(and darwin cmucl) -(defcallback float26 :float - ((a1 :float) (a2 :float) (a3 :float) (a4 :float) (a5 :float) - (a6 :float) (a7 :float) (a8 :float) (a9 :float) (a10 :float) - (a11 :float) (a12 :float) (a13 :float) (a14 :float) (a15 :float) - (a16 :float) (a17 :float) (a18 :float) (a19 :float) (a20 :float) - (a21 :float) (a22 :float) (a23 :float) (a24 :float) (a25 :float) - (a26 :float)) - (let ((args (list a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 - a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26))) - #-(and) - (loop for i from 1 and arg in args do - (format t "a~A: ~A~%" i arg)) - (reduce #'+ args))) - -(defcfun "call_float26" :float (f :pointer)) - -#+(and darwin (or lispworks openmcl cmucl)) -(pushnew 'callbacks.float26 regression-test::*expected-failures*) - -(deftest callbacks.float26 - (call-float26 (callback float26)) - 130.0) - -#+(and darwin (or lispworks openmcl cmucl)) -(pushnew 'callbacks.float26.funcall regression-test::*expected-failures*) - -#-cffi-sys::no-foreign-funcall -(deftest callbacks.float26.funcall - (foreign-funcall-pointer - (callback float26) () :float 5.0 :float 5.0 - :float 5.0 :float 5.0 :float 5.0 :float 5.0 - :float 5.0 :float 5.0 :float 5.0 :float 5.0 - :float 5.0 :float 5.0 :float 5.0 :float 5.0 - :float 5.0 :float 5.0 :float 5.0 :float 5.0 - :float 5.0 :float 5.0 :float 5.0 :float 5.0 - :float 5.0 :float 5.0 :float 5.0 :float 5.0 - :float) - 130.0) - -;;; Defining a callback as a non-toplevel form. Not portable. Doesn't -;;; work for CMUCL or Allegro. -#-(and) -(let ((n 42)) - (defcallback non-toplevel-cb :int () - n)) - -#-(and) -(deftest callbacks.non-toplevel - (foreign-funcall (callback non-toplevel-cb) :int) - 42) - -;;;# Stdcall - -#+(and x86 (not cffi-sys::no-stdcall)) -(progn - (defcallback (stdcall-cb :convention :stdcall) :int - ((a :int) (b :int) (c :int)) - (+ a b c)) - - (defcfun "call_stdcall_fun" :int - (f :pointer)) - - (deftest callbacks.stdcall.1 - (call-stdcall-fun (callback stdcall-cb)) - 42)) - -;;; RT: many of the %DEFCALLBACK implementations wouldn't handle -;;; uninterned symbols. -(deftest callbacks.uninterned - (values (defcallback #1=#:foo :void ()) - (pointerp (callback #1#))) - #1# t) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/compile.bat b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/compile.bat deleted file mode 100644 index 1f89eea..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/compile.bat +++ /dev/null @@ -1,9 +0,0 @@ -rem -rem script for compiling the test lib with the free MSVC++ toolkit. -rem - -cl /LD /DWIN32=1 /Tc libtest.c -del libtest.obj libtest.exp - -cl /LD /DWIN32=1 /Tc libtest2.c -del libtest2.obj libtest2.exp diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/defcfun.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/defcfun.lisp deleted file mode 100644 index 97e9b98..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/defcfun.lisp +++ /dev/null @@ -1,536 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; defcfun.lisp --- Tests function definition and calling. -;;; -;;; Copyright (C) 2005-2007, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi-tests) - -(deftest defcfun.parse-name-and-options.1 - (multiple-value-bind (lisp-name foreign-name) - (let ((*package* (find-package '#:cffi-tests))) - (cffi::parse-name-and-options "foo_bar")) - (list lisp-name foreign-name)) - (foo-bar "foo_bar")) - -(deftest defcfun.parse-name-and-options.2 - (multiple-value-bind (lisp-name foreign-name) - (let ((*package* (find-package '#:cffi-tests))) - (cffi::parse-name-and-options "foo_bar" t)) - (list lisp-name foreign-name)) - (*foo-bar* "foo_bar")) - -(deftest defcfun.parse-name-and-options.3 - (multiple-value-bind (lisp-name foreign-name) - (cffi::parse-name-and-options 'foo-bar) - (list lisp-name foreign-name)) - (foo-bar "foo_bar")) - -(deftest defcfun.parse-name-and-options.4 - (multiple-value-bind (lisp-name foreign-name) - (cffi::parse-name-and-options '*foo-bar* t) - (list lisp-name foreign-name)) - (*foo-bar* "foo_bar")) - -(deftest defcfun.parse-name-and-options.5 - (multiple-value-bind (lisp-name foreign-name) - (cffi::parse-name-and-options '("foo_bar" foo-baz)) - (list lisp-name foreign-name)) - (foo-baz "foo_bar")) - -(deftest defcfun.parse-name-and-options.6 - (multiple-value-bind (lisp-name foreign-name) - (cffi::parse-name-and-options '("foo_bar" *foo-baz*) t) - (list lisp-name foreign-name)) - (*foo-baz* "foo_bar")) - -(deftest defcfun.parse-name-and-options.7 - (multiple-value-bind (lisp-name foreign-name) - (cffi::parse-name-and-options '(foo-baz "foo_bar")) - (list lisp-name foreign-name)) - (foo-baz "foo_bar")) - -(deftest defcfun.parse-name-and-options.8 - (multiple-value-bind (lisp-name foreign-name) - (cffi::parse-name-and-options '(*foo-baz* "foo_bar") t) - (list lisp-name foreign-name)) - (*foo-baz* "foo_bar")) - -;;;# Name translation - -(deftest translate-underscore-separated-name.to-symbol - (let ((*package* (find-package '#:cffi-tests))) - (translate-underscore-separated-name "some_name_with_underscores")) - some-name-with-underscores) - -(deftest translate-underscore-separated-name.to-string - (translate-underscore-separated-name 'some-name-with-underscores) - "some_name_with_underscores") - -(deftest translate-camelcase-name.to-symbol - (let ((*package* (find-package '#:cffi-tests))) - (translate-camelcase-name "someXmlFunction")) - some-xml-function) - -(deftest translate-camelcase-name.to-string - (translate-camelcase-name 'some-xml-function) - "someXmlFunction") - -(deftest translate-camelcase-name.to-string-upper - (translate-camelcase-name 'some-xml-function :upper-initial-p t) - "SomeXmlFunction") - -(deftest translate-camelcase-name.to-symbol-special - (let ((*package* (find-package '#:cffi-tests))) - (translate-camelcase-name "someXMLFunction" :special-words '("XML"))) - some-xml-function) - -(deftest translate-camelcase-name.to-string-special - (translate-camelcase-name 'some-xml-function :special-words '("XML")) - "someXMLFunction") - -(deftest translate-name-from-foreign.function - (let ((*package* (find-package '#:cffi-tests))) - (translate-name-from-foreign "some_xml_name" *package*)) - some-xml-name) - -(deftest translate-name-from-foreign.var - (let ((*package* (find-package '#:cffi-tests))) - (translate-name-from-foreign "some_xml_name" *package* t)) - *some-xml-name*) - -(deftest translate-name-to-foreign.function - (translate-name-to-foreign 'some-xml-name *package*) - "some_xml_name") - -(deftest translate-name-to-foreign.var - (translate-name-to-foreign '*some-xml-name* *package* t) - "some_xml_name") - -;;;# Calling with built-in c types -;;; -;;; Tests calling standard C library functions both passing -;;; and returning each built-in type. (adapted from funcall.lisp) - -(defcfun "toupper" :char - "toupper docstring" - (char :char)) - -(deftest defcfun.char - (toupper (char-code #\a)) - #.(char-code #\A)) - -(deftest defcfun.docstring - (documentation 'toupper 'function) - "toupper docstring") - - -(defcfun ("abs" c-abs) :int - (n :int)) - -(deftest defcfun.int - (c-abs -100) - 100) - - -(defcfun "labs" :long - (n :long)) - -(deftest defcfun.long - (labs -131072) - 131072) - - -#-cffi-features:no-long-long -(progn - (defcfun "my_llabs" :long-long - (n :long-long)) - - (deftest defcfun.long-long - (my-llabs -9223372036854775807) - 9223372036854775807) - - (defcfun "ullong" :unsigned-long-long - (n :unsigned-long-long)) - - #+allegro ; lp#914500 - (pushnew 'defcfun.unsigned-long-long rt::*expected-failures*) - - (deftest defcfun.unsigned-long-long - (let ((ullong-max (1- (expt 2 (* 8 (foreign-type-size :unsigned-long-long)))))) - (eql ullong-max (ullong ullong-max))) - t)) - - -(defcfun "my_sqrtf" :float - (n :float)) - -(deftest defcfun.float - (my-sqrtf 16.0) - 4.0) - - -(defcfun ("sqrt" c-sqrt) :double - (n :double)) - -(deftest defcfun.double - (c-sqrt 36.0d0) - 6.0d0) - - -#+(and scl long-float) -(defcfun ("sqrtl" c-sqrtl) :long-double - (n :long-double)) - -#+(and scl long-float) -(deftest defcfun.long-double - (c-sqrtl 36.0l0) - 6.0l0) - - -(defcfun "strlen" :int - (n :string)) - -(deftest defcfun.string.1 - (strlen "Hello") - 5) - - -(defcfun "strcpy" (:pointer :char) - (dest (:pointer :char)) - (src :string)) - -(defcfun "strcat" (:pointer :char) - (dest (:pointer :char)) - (src :string)) - -(deftest defcfun.string.2 - (with-foreign-pointer-as-string (s 100) - (setf (mem-ref s :char) 0) - (strcpy s "Hello") - (strcat s ", world!")) - "Hello, world!") - -(defcfun "strerror" :string - (n :int)) - -(deftest defcfun.string.3 - (typep (strerror 1) 'string) - t) - - -;;; Regression test. Allegro would warn on direct calls to -;;; functions with no arguments. -;;; -;;; Also, let's check if void functions will return NIL. -;;; -;;; Check if a docstring without arguments doesn't cause problems. - -(defcfun "noargs" :int - "docstring") - -(deftest defcfun.noargs - (noargs) - 42) - -(defcfun "noop" :void) - -#+(or allegro openmcl ecl) (pushnew 'defcfun.noop rt::*expected-failures*) - -(deftest defcfun.noop - (noop) - #|no values|#) - -;;;# Calling varargs functions - -(defcfun "sum_double_arbitrary" :double (n :int) &rest) - -(deftest defcfun.varargs.nostdlib - (sum-double-arbitrary - 26 - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0) - 81.64d0) - -(defcfun "sprintf" :int - "sprintf docstring" - (str (:pointer :char)) - (control :string) - &rest) - -;;; CLISP and ABCL discard macro docstrings. -#+(or clisp abcl) -(pushnew 'defcfun.varargs.docstrings rt::*expected-failures*) - -(deftest defcfun.varargs.docstrings - (documentation 'sprintf 'function) - "sprintf docstring") - -(deftest defcfun.varargs.char - (with-foreign-pointer-as-string (s 100) - (sprintf s "%c" :char 65)) - "A") - -(deftest defcfun.varargs.short - (with-foreign-pointer-as-string (s 100) - (sprintf s "%d" :short 42)) - "42") - -(deftest defcfun.varargs.int - (with-foreign-pointer-as-string (s 100) - (sprintf s "%d" :int 1000)) - "1000") - -(deftest defcfun.varargs.long - (with-foreign-pointer-as-string (s 100) - (sprintf s "%ld" :long 131072)) - "131072") - -(deftest defcfun.varargs.float - (with-foreign-pointer-as-string (s 100) - (sprintf s "%.2f" :float (float pi))) - "3.14") - -(deftest defcfun.varargs.double - (with-foreign-pointer-as-string (s 100) - (sprintf s "%.2f" :double (float pi 1.0d0))) - "3.14") - -#+(and scl long-float) -(deftest defcfun.varargs.long-double - (with-foreign-pointer-as-string (s 100) - (setf (mem-ref s :char) 0) - (sprintf s "%.2Lf" :long-double pi)) - "3.14") - -(deftest defcfun.varargs.string - (with-foreign-pointer-as-string (s 100) - (sprintf s "%s, %s!" :string "Hello" :string "world")) - "Hello, world!") - -;;; (let ((rettype (find-type :long)) -;;; (arg-types (n-random-types-no-ll 127))) -;;; (c-function rettype arg-types) -;;; (gen-function-test rettype arg-types)) - -#+(and (not ecl) - #.(cl:if (cl:>= cl:lambda-parameters-limit 127) '(:and) '(:or))) -(progn - (defcfun "sum_127_no_ll" :long - (a1 :long) (a2 :unsigned-long) (a3 :short) (a4 :unsigned-short) (a5 :float) - (a6 :double) (a7 :unsigned-long) (a8 :float) (a9 :unsigned-char) - (a10 :unsigned-short) (a11 :short) (a12 :unsigned-long) (a13 :double) - (a14 :long) (a15 :unsigned-int) (a16 :pointer) (a17 :unsigned-int) - (a18 :unsigned-short) (a19 :long) (a20 :float) (a21 :pointer) (a22 :float) - (a23 :int) (a24 :int) (a25 :unsigned-short) (a26 :long) (a27 :long) - (a28 :double) (a29 :unsigned-char) (a30 :unsigned-int) (a31 :unsigned-int) - (a32 :int) (a33 :unsigned-short) (a34 :unsigned-int) (a35 :pointer) - (a36 :double) (a37 :double) (a38 :long) (a39 :short) (a40 :unsigned-short) - (a41 :long) (a42 :char) (a43 :long) (a44 :unsigned-short) (a45 :pointer) - (a46 :int) (a47 :unsigned-int) (a48 :double) (a49 :unsigned-char) - (a50 :unsigned-char) (a51 :float) (a52 :int) (a53 :unsigned-short) - (a54 :double) (a55 :short) (a56 :unsigned-char) (a57 :unsigned-long) - (a58 :float) (a59 :float) (a60 :float) (a61 :pointer) (a62 :pointer) - (a63 :unsigned-int) (a64 :unsigned-long) (a65 :char) (a66 :short) - (a67 :unsigned-short) (a68 :unsigned-long) (a69 :pointer) (a70 :float) - (a71 :double) (a72 :long) (a73 :unsigned-long) (a74 :short) - (a75 :unsigned-int) (a76 :unsigned-short) (a77 :int) (a78 :unsigned-short) - (a79 :char) (a80 :double) (a81 :short) (a82 :unsigned-char) (a83 :float) - (a84 :char) (a85 :int) (a86 :double) (a87 :unsigned-char) (a88 :int) - (a89 :unsigned-long) (a90 :double) (a91 :short) (a92 :short) - (a93 :unsigned-int) (a94 :unsigned-char) (a95 :float) (a96 :long) - (a97 :float) (a98 :long) (a99 :long) (a100 :int) (a101 :int) - (a102 :unsigned-int) (a103 :char) (a104 :char) (a105 :unsigned-short) - (a106 :unsigned-int) (a107 :unsigned-short) (a108 :unsigned-short) - (a109 :int) (a110 :long) (a111 :char) (a112 :double) (a113 :unsigned-int) - (a114 :char) (a115 :short) (a116 :unsigned-long) (a117 :unsigned-int) - (a118 :short) (a119 :unsigned-char) (a120 :float) (a121 :pointer) - (a122 :double) (a123 :int) (a124 :long) (a125 :char) (a126 :unsigned-short) - (a127 :float)) - - (deftest defcfun.bff.1 - (sum-127-no-ll - 1442906394 520035521 -4715 50335 -13557.0 -30892.0d0 24061483 -23737.0 - 22 2348 4986 104895680 8073.0d0 -571698147 102484400 - (make-pointer 507907275) 12733353 7824 -1275845284 13602.0 - (make-pointer 286958390) -8042.0 -773681663 -1289932452 31199 -154985357 - -170994216 16845.0d0 177 218969221 2794350893 6068863 26327 127699339 - (make-pointer 184352771) 18512.0d0 -12345.0d0 -179853040 -19981 37268 - -792845398 116 -1084653028 50494 (make-pointer 2105239646) -1710519651 - 1557813312 2839.0d0 90 180 30580.0 -532698978 8623 9537.0d0 -10882 54 - 184357206 14929.0 -8190.0 -25615.0 (make-pointer 235310526) - (make-pointer 220476977) 7476055 1576685 -117 -11781 31479 23282640 - (make-pointer 8627281) -17834.0 10391.0d0 -1904504370 114393659 -17062 - 637873619 16078 -891210259 8107 0 760.0d0 -21268 104 14133.0 10 - 588598141 310.0d0 20 1351785456 16159552 -10121.0d0 -25866 24821 - 68232851 60 -24132.0 -1660411658 13387.0 -786516668 -499825680 - -1128144619 111849719 2746091587 -2 95 14488 326328135 64781 18204 - 150716680 -703859275 103 16809.0d0 852235610 -43 21088 242356110 - 324325428 -22380 23 24814.0 (make-pointer 40362014) -14322.0d0 - -1864262539 523684371 -21 49995 -29175.0) - 796447501)) - -;;; (let ((rettype (find-type :long-long)) -;;; (arg-types (n-random-types 127))) -;;; (c-function rettype arg-types) -;;; (gen-function-test rettype arg-types)) - -#-(or ecl cffi-sys::no-long-long - #.(cl:if (cl:>= cl:lambda-parameters-limit 127) '(:or) '(:and))) -(progn - (defcfun "sum_127" :long-long - (a1 :pointer) (a2 :pointer) (a3 :float) (a4 :unsigned-long) (a5 :pointer) - (a6 :long-long) (a7 :double) (a8 :double) (a9 :unsigned-short) (a10 :int) - (a11 :long-long) (a12 :long) (a13 :short) (a14 :unsigned-int) (a15 :long) - (a16 :unsigned-char) (a17 :int) (a18 :double) (a19 :short) (a20 :short) - (a21 :long-long) (a22 :unsigned-int) (a23 :unsigned-short) (a24 :short) - (a25 :pointer) (a26 :short) (a27 :unsigned-short) (a28 :unsigned-short) - (a29 :int) (a30 :long-long) (a31 :pointer) (a32 :int) (a33 :unsigned-long) - (a34 :unsigned-long) (a35 :pointer) (a36 :unsigned-long-long) (a37 :float) - (a38 :int) (a39 :short) (a40 :pointer) (a41 :unsigned-long-long) - (a42 :long-long) (a43 :unsigned-long) (a44 :unsigned-long) - (a45 :unsigned-long-long) (a46 :unsigned-long) (a47 :char) (a48 :double) - (a49 :long) (a50 :unsigned-int) (a51 :int) (a52 :short) (a53 :pointer) - (a54 :long) (a55 :unsigned-long-long) (a56 :int) (a57 :unsigned-short) - (a58 :unsigned-long-long) (a59 :float) (a60 :pointer) (a61 :float) - (a62 :unsigned-short) (a63 :unsigned-long) (a64 :float) (a65 :unsigned-int) - (a66 :unsigned-long-long) (a67 :pointer) (a68 :double) - (a69 :unsigned-long-long) (a70 :double) (a71 :double) (a72 :long-long) - (a73 :pointer) (a74 :unsigned-short) (a75 :long) (a76 :pointer) (a77 :short) - (a78 :double) (a79 :long) (a80 :unsigned-char) (a81 :pointer) - (a82 :unsigned-char) (a83 :long) (a84 :double) (a85 :pointer) (a86 :int) - (a87 :double) (a88 :unsigned-char) (a89 :double) (a90 :short) (a91 :long) - (a92 :int) (a93 :long) (a94 :double) (a95 :unsigned-short) - (a96 :unsigned-int) (a97 :int) (a98 :char) (a99 :long-long) (a100 :double) - (a101 :float) (a102 :unsigned-long) (a103 :short) (a104 :pointer) - (a105 :float) (a106 :long-long) (a107 :int) (a108 :long-long) - (a109 :long-long) (a110 :double) (a111 :unsigned-long-long) (a112 :double) - (a113 :unsigned-long) (a114 :char) (a115 :char) (a116 :unsigned-long) - (a117 :short) (a118 :unsigned-char) (a119 :unsigned-char) (a120 :int) - (a121 :int) (a122 :float) (a123 :unsigned-char) (a124 :unsigned-char) - (a125 :double) (a126 :unsigned-long-long) (a127 :char)) - - #+(and sbcl x86) (push 'defcfun.bff.2 rtest::*expected-failures*) - - (deftest defcfun.bff.2 - (sum-127 - (make-pointer 2746181372) (make-pointer 177623060) -32334.0 3158055028 - (make-pointer 242315091) 4288001754991016425 -21047.0d0 287.0d0 18722 - 243379286 -8677366518541007140 581399424 -13872 4240394881 1353358999 - 226 969197676 -26207.0d0 6484 11150 1241680089902988480 106068320 61865 - 2253 (make-pointer 866809333) -31613 35616 11715 1393601698 - 8940888681199591845 (make-pointer 1524606024) 805638893 3315410736 - 3432596795 (make-pointer 1490355706) 696175657106383698 -25438.0 - 1294381547 26724 (make-pointer 3196569545) 2506913373410783697 - -4405955718732597856 4075932032 3224670123 2183829215657835866 - 1318320964 -22 -3786.0d0 -2017024146 1579225515 -626617701 -1456 - (make-pointer 3561444187) 395687791 1968033632506257320 -1847773261 - 48853 142937735275669133 -17974.0 (make-pointer 2791749948) -14140.0 - 2707 3691328585 3306.0 1132012981 303633191773289330 - (make-pointer 981183954) 9114.0d0 8664374572369470 -19013.0d0 - -10288.0d0 -3679345119891954339 (make-pointer 3538786709) 23761 - -154264605 (make-pointer 2694396308) 7023 997.0d0 1009561368 241 - (make-pointer 2612292671) 48 1431872408 -32675.0d0 - (make-pointer 1587599336) 958916472 -9857.0d0 111 -14370.0d0 -7308 - -967514912 488790941 2146978095 -24111.0d0 13711 86681861 717987770 - 111 1013402998690933877 17234.0d0 -8772.0 3959216275 -8711 - (make-pointer 3142780851) 9480.0 -3820453146461186120 1616574376 - -3336232268263990050 -1906114671562979758 -27925.0d0 9695970875869913114 - 27033.0d0 1096518219 -12 104 3392025403 -27911 60 89 509297051 - -533066551 29158.0 110 54 -9802.0d0 593950442165910888 -79) - 7758614658402721936)) - -;;; regression test: defining an undefined foreign function should only -;;; throw some sort of warning, not signal an error. - -#+(or cmucl (and sbcl (or (not linkage-table) win32))) -(pushnew 'defcfun.undefined rt::*expected-failures*) - -(deftest defcfun.undefined - (progn - (eval '(defcfun ("undefined_foreign_function" undefined-foreign-function) :void)) - (compile 'undefined-foreign-function) - t) - t) - -;;; Test whether all doubles are passed correctly. On some platforms, eg. -;;; darwin/ppc, some are passed on registers others on the stack. -(defcfun "sum_double26" :double - (a1 :double) (a2 :double) (a3 :double) (a4 :double) (a5 :double) - (a6 :double) (a7 :double) (a8 :double) (a9 :double) (a10 :double) - (a11 :double) (a12 :double) (a13 :double) (a14 :double) (a15 :double) - (a16 :double) (a17 :double) (a18 :double) (a19 :double) (a20 :double) - (a21 :double) (a22 :double) (a23 :double) (a24 :double) (a25 :double) - (a26 :double)) - -(deftest defcfun.double26 - (sum-double26 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 - 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 - 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 - 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0) - 81.64d0) - -;;; Same as above for floats. -(defcfun "sum_float26" :float - (a1 :float) (a2 :float) (a3 :float) (a4 :float) (a5 :float) - (a6 :float) (a7 :float) (a8 :float) (a9 :float) (a10 :float) - (a11 :float) (a12 :float) (a13 :float) (a14 :float) (a15 :float) - (a16 :float) (a17 :float) (a18 :float) (a19 :float) (a20 :float) - (a21 :float) (a22 :float) (a23 :float) (a24 :float) (a25 :float) - (a26 :float)) - -(deftest defcfun.float26 - (sum-float26 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 - 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0) - 130.0) - -;;;# Namespaces - -#-cffi-sys::flat-namespace -(progn - (defcfun ("ns_function" ns-fun1 :library libtest) :boolean) - (defcfun ("ns_function" ns-fun2 :library libtest2) :boolean) - - (deftest defcfun.namespace.1 - (values (ns-fun1) (ns-fun2)) - t nil)) - -;;;# stdcall - -#+(and x86 windows (not cffi-sys::no-stdcall)) -(progn - (defcfun ("stdcall_fun@12" stdcall-fun :convention :stdcall) :int - (a :int) - (b :int) - (c :int)) - - (deftest defcfun.stdcall.1 - (loop repeat 100 do (stdcall-fun 1 2 3) - finally (return (stdcall-fun 1 2 3))) - 6)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/enum.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/enum.lisp deleted file mode 100644 index 85c2f2f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/enum.lisp +++ /dev/null @@ -1,231 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; enum.lisp --- Tests on C enums. -;;; -;;; Copyright (C) 2005-2006, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi-tests) - -(defctype numeros-base-type :int) - -(defcenum (numeros numeros-base-type) - (:one 1) - :two - :three - :four - (:forty-one 41) - :forty-two) - -(defcfun "check_enums" :int - (%one numeros) - (%two numeros) - (%three numeros) - (%four numeros) - (%forty-one numeros) - (%forty-two numeros)) - -(deftest enum.1 - (check-enums :one :two :three 4 :forty-one :forty-two) - 1) - -(defcenum another-boolean :false :true) -(defcfun "return_enum" another-boolean (x :uint)) - -(deftest enum.2 - (and (eq :false (return-enum 0)) - (eq :true (return-enum 1))) - t) - -(defctype yet-another-boolean another-boolean) -(defcfun ("return_enum" return-enum2) yet-another-boolean - (x yet-another-boolean)) - -(deftest enum.3 - (and (eq :false (return-enum2 :false)) - (eq :true (return-enum2 :true))) - t) - -(defctype numeros-typedef numeros) - -(deftest enum.typedef.1 - (eq (foreign-enum-keyword 'numeros-typedef 1) - (foreign-enum-keyword 'numeros 1)) - t) - -(deftest enum.typedef.2 - (eql (foreign-enum-value 'numeros-typedef :four) - (foreign-enum-value 'numeros :four)) - t) - -(defcenum enum-size.int - (:one 1) - (enum-size-int #.(1- (expt 2 (1- (* (foreign-type-size :unsigned-int) 8))))) - (enum-size-negative-int #.(- (1- (expt 2 (1- (* (foreign-type-size :unsigned-int) 8)))))) - (:two 2)) - -(defcenum enum-size.uint - (:one 1) - (enum-size-uint #.(1- (expt 2 (* (foreign-type-size :unsigned-int) 8)))) - (:two 2)) - -(deftest enum.size - (mapcar (alexandria:compose 'cffi::unparse-type - 'cffi::actual-type - 'cffi::parse-type) - (list 'enum-size.int - 'enum-size.uint)) - ;; The C standard only has weak constraints on the size of integer types, so - ;; we cannot really test more than one type in a platform independent way due - ;; to the possible overlaps. - (:int - :unsigned-int)) - -(deftest enum.size.members - (mapcar (alexandria:conjoin 'boundp 'constantp) - '(enum-size-int enum-size-negative-int enum-size-uint)) - (t t t)) - -(deftest enum.size.error-when-too-large - (expecting-error - (eval '(defcenum enum-size-too-large - (:too-long #.(expt 2 129))))) - :error) - -;; There are some projects that use non-integer base type. It's not in -;; adherence with the C standard, but we also don't lose much by -;; allowing it. -(defcenum (enum.double :double) - (:one 1) - (:two 2d0) - (:three 3.42) - :four) - -(deftest enum.double - (values-list - (mapcar (alexandria:curry 'foreign-enum-value 'enum.double) - '(:one :two :three :four))) - 1 - 2.0d0 - 3.42 - 4.42) - -;;;# Bitfield tests - -;;; Regression test: defbitfield was misbehaving when the first value -;;; was provided. -(deftest bitfield.1 - (eval '(defbitfield (bf1 :long) - (:foo 0))) - bf1) - -(defbitfield bf2 - one - two - four - eight - sixteen - (bf2.outlier 42) - thirty-two - sixty-four) - -(deftest bitfield.2 - (mapcar (lambda (symbol) - (foreign-bitfield-value 'bf2 (list symbol))) - '(one two four eight sixteen thirty-two sixty-four)) - (1 2 4 8 16 32 64)) - -(deftest bitfield.2.outlier - (mapcar (lambda (symbol) - (foreign-bitfield-value 'bf2 (list symbol))) - '(one two four eight sixteen thirty-two sixty-four)) - (1 2 4 8 16 32 64)) - -(defbitfield (bf3 :int) - (three 3) - one - (seven 7) - two - (eight 8) - sixteen) - -;;; Non-single-bit numbers must not influence the progression of -;;; implicit values. Single bits larger than any before *must* -;;; influence said progression. -(deftest bitfield.3 - (mapcar (lambda (symbol) - (foreign-bitfield-value 'bf3 (list symbol))) - '(one two sixteen)) - (1 2 16)) - -(defbitfield bf4 - ;; zero will be a simple enum member because it's not a valid mask - (zero 0) - one - two - four - (three 3) - (sixteen 16)) - -;;; Yet another edge case with the 0... -(deftest bitfield.4 - ;; These should macroexpand to the literals in Slime - ;; due to the compiler macros. Same below. - (values (foreign-bitfield-value 'bf4 ()) - (foreign-bitfield-value 'bf4 'one) - (foreign-bitfield-value 'bf4 '(one two)) - (foreign-bitfield-value 'bf4 '(three)) ; or should it signal an error? - (foreign-bitfield-value 'bf4 '(sixteen))) - 0 - 1 - 3 - 3 - 16) - -(deftest bitfield.4b - (values (foreign-bitfield-symbols 'bf4 0) - (foreign-bitfield-symbols 'bf4 1) - (foreign-bitfield-symbols 'bf4 3) - (foreign-bitfield-symbols 'bf4 8) - (foreign-bitfield-symbols 'bf4 16)) - nil - (one) - (one two) - nil - (sixteen)) - -(deftest bitfield.translators - (with-foreign-object (bf 'bf4 2) - (setf (mem-aref bf 'bf4 0) 1) - (setf (mem-aref bf 'bf4 1) 3) - (values (mem-aref bf 'bf4 0) - (mem-aref bf 'bf4 1))) - (one) - (one two)) - -#+nil -(deftest bitfield.base-type-error - (expecting-error - (eval '(defbitfield (bf1 :float) - (:foo 0)))) - :error) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/foreign-globals.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/foreign-globals.lisp deleted file mode 100644 index 8527cdf..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/foreign-globals.lisp +++ /dev/null @@ -1,309 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; foreign-globals.lisp --- Tests on foreign globals. -;;; -;;; Copyright (C) 2005-2007, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi-tests) - -(defcvar ("var_char" *char-var*) :char) -(defcvar "var_unsigned_char" :unsigned-char) -(defcvar "var_short" :short) -(defcvar "var_unsigned_short" :unsigned-short) -(defcvar "var_int" :int) -(defcvar "var_unsigned_int" :unsigned-int) -(defcvar "var_long" :long) -(defcvar "var_unsigned_long" :unsigned-long) -(defcvar "var_float" :float) -(defcvar "var_double" :double) -(defcvar "var_pointer" :pointer) -(defcvar "var_string" :string) -(defcvar "var_long_long" :long-long) -(defcvar "var_unsigned_long_long" :unsigned-long-long) - -;;; The expected failures marked below result from this odd behaviour: -;;; -;;; (foreign-symbol-pointer "var_char") => NIL -;;; -;;; (foreign-symbol-pointer "var_char" :library 'libtest) -;;; => # -;;; -;;; Why is this happening? --luis -#+lispworks -(mapc (lambda (x) (pushnew x rtest::*expected-failures*)) - '(foreign-globals.ref.char foreign-globals.get-var-pointer.1 - foreign-globals.get-var-pointer.2 foreign-globals.symbol-name - foreign-globals.read-only.1 )) - -(deftest foreign-globals.ref.char - *char-var* - -127) - -(deftest foreign-globals.ref.unsigned-char - *var-unsigned-char* - 255) - -(deftest foreign-globals.ref.short - *var-short* - -32767) - -(deftest foreign-globals.ref.unsigned-short - *var-unsigned-short* - 65535) - -(deftest foreign-globals.ref.int - *var-int* - -32767) - -(deftest foreign-globals.ref.unsigned-int - *var-unsigned-int* - 65535) - -(deftest foreign-globals.ref.long - *var-long* - -2147483647) - -(deftest foreign-globals.ref.unsigned-long - *var-unsigned-long* - 4294967295) - -(deftest foreign-globals.ref.float - *var-float* - 42.0) - -(deftest foreign-globals.ref.double - *var-double* - 42.0d0) - -(deftest foreign-globals.ref.pointer - (null-pointer-p *var-pointer*) - t) - -(deftest foreign-globals.ref.string - *var-string* - "Hello, foreign world!") - -#+openmcl (push 'foreign-globals.set.long-long rt::*expected-failures*) - -(deftest foreign-globals.ref.long-long - *var-long-long* - -9223372036854775807) - -(deftest foreign-globals.ref.unsigned-long-long - *var-unsigned-long-long* - 18446744073709551615) - -;; The *.set.* tests restore the old values so that the *.ref.* -;; don't fail when re-run. -(defmacro with-old-value-restored ((place) &body body) - (let ((old (gensym))) - `(let ((,old ,place)) - (prog1 - (progn ,@body) - (setq ,place ,old))))) - -(deftest foreign-globals.set.int - (with-old-value-restored (*var-int*) - (setq *var-int* 42) - *var-int*) - 42) - -(deftest foreign-globals.set.string - (with-old-value-restored (*var-string*) - (setq *var-string* "Ehxosxangxo") - (prog1 - *var-string* - ;; free the string we just allocated - (foreign-free (mem-ref (get-var-pointer '*var-string*) :pointer)))) - "Ehxosxangxo") - -(deftest foreign-globals.set.long-long - (with-old-value-restored (*var-long-long*) - (setq *var-long-long* -9223000000000005808) - *var-long-long*) - -9223000000000005808) - -(deftest foreign-globals.get-var-pointer.1 - (pointerp (get-var-pointer '*char-var*)) - t) - -(deftest foreign-globals.get-var-pointer.2 - (mem-ref (get-var-pointer '*char-var*) :char) - -127) - -;;; Symbol case. - -(defcvar "UPPERCASEINT1" :int) -(defcvar "UPPER_CASE_INT1" :int) -(defcvar "MiXeDCaSeInT1" :int) -(defcvar "MiXeD_CaSe_InT1" :int) - -(deftest foreign-globals.ref.uppercaseint1 - *uppercaseint1* - 12345) - -(deftest foreign-globals.ref.upper-case-int1 - *upper-case-int1* - 23456) - -(deftest foreign-globals.ref.mixedcaseint1 - *mixedcaseint1* - 34567) - -(deftest foreign-globals.ref.mixed-case-int1 - *mixed-case-int1* - 45678) - -(when (string= (symbol-name 'nil) "NIL") - (let ((*readtable* (copy-readtable))) - (setf (readtable-case *readtable*) :invert) - (eval (read-from-string "(defcvar \"UPPERCASEINT2\" :int)")) - (eval (read-from-string "(defcvar \"UPPER_CASE_INT2\" :int)")) - (eval (read-from-string "(defcvar \"MiXeDCaSeInT2\" :int)")) - (eval (read-from-string "(defcvar \"MiXeD_CaSe_InT2\" :int)")) - (setf (readtable-case *readtable*) :preserve) - (eval (read-from-string "(DEFCVAR \"UPPERCASEINT3\" :INT)")) - (eval (read-from-string "(DEFCVAR \"UPPER_CASE_INT3\" :INT)")) - (eval (read-from-string "(DEFCVAR \"MiXeDCaSeInT3\" :INT)")) - (eval (read-from-string "(DEFCVAR \"MiXeD_CaSe_InT3\" :INT)")))) - - -;;; EVAL gets rid of SBCL's unreachable code warnings. -(when (string= (symbol-name (eval nil)) "nil") - (let ((*readtable* (copy-readtable))) - (setf (readtable-case *readtable*) :invert) - (eval (read-from-string "(DEFCVAR \"UPPERCASEINT2\" :INT)")) - (eval (read-from-string "(DEFCVAR \"UPPER_CASE_INT2\" :INT)")) - (eval (read-from-string "(DEFCVAR \"MiXeDCaSeInT2\" :INT)")) - (eval (read-from-string "(DEFCVAR \"MiXeD_CaSe_InT2\" :INT)")) - (setf (readtable-case *readtable*) :downcase) - (eval (read-from-string "(defcvar \"UPPERCASEINT3\" :int)")) - (eval (read-from-string "(defcvar \"UPPER_CASE_INT3\" :int)")) - (eval (read-from-string "(defcvar \"MiXeDCaSeInT3\" :int)")) - (eval (read-from-string "(defcvar \"MiXeD_CaSe_InT3\" :int)")))) - -(deftest foreign-globals.ref.uppercaseint2 - *uppercaseint2* - 12345) - -(deftest foreign-globals.ref.upper-case-int2 - *upper-case-int2* - 23456) - -(deftest foreign-globals.ref.mixedcaseint2 - *mixedcaseint2* - 34567) - -(deftest foreign-globals.ref.mixed-case-int2 - *mixed-case-int2* - 45678) - -(deftest foreign-globals.ref.uppercaseint3 - *uppercaseint3* - 12345) - -(deftest foreign-globals.ref.upper-case-int3 - *upper-case-int3* - 23456) - -(deftest foreign-globals.ref.mixedcaseint3 - *mixedcaseint3* - 34567) - -(deftest foreign-globals.ref.mixed-case-int3 - *mixed-case-int3* - 45678) - -;;; regression test: -;;; gracefully accept symbols in defcvar - -(defcvar *var-char* :char) -(defcvar var-char :char) - -(deftest foreign-globals.symbol-name - (values *var-char* var-char) - -127 -127) - -;;;# Namespace - -#-cffi-sys::flat-namespace -(progn - (deftest foreign-globals.namespace.1 - (values - (mem-ref (foreign-symbol-pointer "var_char" :library 'libtest) :char) - (foreign-symbol-pointer "var_char" :library 'libtest2)) - -127 nil) - - (deftest foreign-globals.namespace.2 - (values - (mem-ref (foreign-symbol-pointer "ns_var" :library 'libtest) :boolean) - (mem-ref (foreign-symbol-pointer "ns_var" :library 'libtest2) :boolean)) - t nil) - - ;; For its "default" module, Lispworks seems to cache lookups from - ;; the newest module tried. If a lookup happens to have failed - ;; subsequent lookups will fail even the symbol exists in other - ;; modules. So this test fails. - #+lispworks - (pushnew 'foreign-globals.namespace.3 regression-test::*expected-failures*) - - (deftest foreign-globals.namespace.3 - (values - (foreign-symbol-pointer "var_char" :library 'libtest2) - (mem-ref (foreign-symbol-pointer "var_char") :char)) - nil -127) - - (defcvar ("ns_var" *ns-var1* :library libtest) :boolean) - (defcvar ("ns_var" *ns-var2* :library libtest2) :boolean) - - (deftest foreign-globals.namespace.4 - (values *ns-var1* *ns-var2*) - t nil)) - -;;;# Read-only - -(defcvar ("var_char" *var-char-ro* :read-only t) :char - "docstring") - -(deftest foreign-globals.read-only.1 - (values *var-char-ro* - (ignore-errors (setf *var-char-ro* 12))) - -127 nil) - -(deftest defcvar.docstring - (documentation '*var-char-ro* 'variable) - "docstring") - -;;;# Other tests - -;;; RT: FOREIGN-SYMBOL-POINTER shouldn't signal an error when passed -;;; an undefined variable. -(deftest foreign-globals.undefined.1 - (foreign-symbol-pointer "surely-undefined?") - nil) - -(deftest foreign-globals.error.1 - (handler-case (foreign-symbol-pointer 'not-a-string) - (type-error () t)) - t) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/fsbv.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/fsbv.lisp deleted file mode 100644 index 85681fc..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/fsbv.lisp +++ /dev/null @@ -1,199 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; fsbv.lisp --- Tests of foreign structure by value calls. -;;; -;;; Copyright (C) 2011, Liam M. Healy -;;; -;;; 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. -;;; - -(in-package #:cffi-tests) - -;; Requires struct.lisp - -(defcfun "sumpair" :int - (p (:struct struct-pair))) - -(defcfun "makepair" (:struct struct-pair) - (condition :bool)) - -(defcfun "doublepair" (:struct struct-pair) - (p (:struct struct-pair))) - -(defcfun "prodsumpair" :double - (p (:struct struct-pair+double))) - -(defcfun "doublepairdouble" (:struct struct-pair+double) - (p (:struct struct-pair+double))) - -;;; Call struct by value -(deftest fsbv.1 - (sumpair '(1 . 2)) - 3) - -;;; See lp#1528719 -(deftest (fsbv.wfo :expected-to-fail t) - (with-foreign-object (arg '(:struct struct-pair)) - (convert-into-foreign-memory '(40 . 2) '(:struct struct-pair) arg) - (sumpair arg)) - 42) - -;;; Call and return struct by value -(deftest fsbv.2 - (doublepair '(1 . 2)) - (2 . 4)) - -;;; return struct by value -(deftest (fsbv.makepair.1 :expected-to-fail t) - (makepair nil) - (-127 . 43)) - -(deftest (fsbv.makepair.2 :expected-to-fail t) - (makepair t) - (-127 . 42)) - -;;; Call recursive structure by value -(deftest fsbv.3 - (prodsumpair '(pr (a 4 b 5) dbl 2.5d0)) - 22.5d0) - -;;; Call and return recursive structure by value -(deftest fsbv.4 - (let ((ans (doublepairdouble '(pr (a 4 b 5) dbl 2.5d0)))) - (values (getf (getf ans 'pr) 'a) - (getf (getf ans 'pr) 'b) - (getf ans 'dbl))) - 8 - 10 - 5.0d0) - -(defcstruct (struct-with-array :size 6) - (s1 (:array :char 6))) - -(defcfun "zork" :void - (p (:struct struct-with-array))) - -;;; Typedef fsbv test - -(defcfun ("sumpair" sumpair2) :int - (p struct-pair-typedef1)) - -(deftest fsbv.5 - (sumpair2 '(1 . 2)) - 3) - -(defcfun "returnpairpointer" (:pointer (:struct struct-pair)) - (ignored (:struct struct-pair))) - -(deftest fsbv.return-a-pointer - (let ((ptr (returnpairpointer '(1 . 2)))) - (+ (foreign-slot-value ptr '(:struct struct-pair) 'a) - (foreign-slot-value ptr '(:struct struct-pair) 'b))) - 42) - -;;; Test ulonglong on no-long-long implementations. - -(defcfun "ullsum" :unsigned-long-long - (a :unsigned-long-long) (b :unsigned-long-long)) - -(deftest fsbv.6 - (ullsum #x10DEADBEEF #x2300000000) - #x33DEADBEEF) - -;;; Combine structures by value with a string argument -(defcfun "stringlenpair" (:struct struct-pair) - (s :string) - (p (:struct struct-pair))) - -(deftest fsbv.7 - (stringlenpair "abc" '(1 . 2)) - (3 . 6)) - -;;; Combine structures by value with an enum argument -(defcfun "enumpair" (:int) - (e numeros) - (p (:struct struct-pair))) - -(deftest fsbv.8 - (enumpair :two '(1 . 2)) - 5) - -;;; returning struct with bitfield member (bug #1474631) -(defbitfield (struct-bitfield :unsigned-int) - (:a 1) - (:b 2)) - -(defcstruct bitfield-struct - (b struct-bitfield)) - -(defcfun "structbitfield" (:struct bitfield-struct) - (x :unsigned-int)) - -(defctype struct-bitfield-typedef struct-bitfield) - -(defcstruct bitfield-struct.2 - (b struct-bitfield-typedef)) - -(defcfun ("structbitfield" structbitfield.2) (:struct bitfield-struct.2) - (x :unsigned-int)) - -;; these would get stuck in an infinite loop previously -(deftest fsbv.struct-bitfield.0 - (structbitfield 0) - (b nil)) - -(deftest fsbv.struct-bitfield.1 - (structbitfield 1) - (b (:a))) - -(deftest fsbv.struct-bitfield.2 - (structbitfield 2) - (b (:b))) - -(deftest fsbv.struct-bitfield.3 - (structbitfield.2 2) - (b (:b))) - -;;; Test for a discrepancy between normal and fsbv return values -(cffi:define-foreign-type int-return-code (cffi::foreign-type-alias) - () - (:default-initargs :actual-type (cffi::parse-type :int)) - (:simple-parser int-return-code)) - -(defmethod cffi:expand-from-foreign (value (type int-return-code)) - ;; NOTE: strictly speaking it should be - ;; (cffi:convert-from-foreign ,value :int), but it's irrelevant in this case - `(let ((return-code ,value)) - (check-type return-code integer) - return-code)) - -(defcfun (noargs-with-typedef "noargs") int-return-code) - -(deftest fsbv.noargs-with-typedef ; for reference, not an FSBV call - (noargs-with-typedef) - 42) - -(defcfun (sumpair-with-typedef "sumpair") int-return-code - (p (:struct struct-pair))) - -(deftest (fsbv.return-value-typedef) - (sumpair-with-typedef '(40 . 2)) - 42) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/funcall.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/funcall.lisp deleted file mode 100644 index f971bfa..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/funcall.lisp +++ /dev/null @@ -1,245 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; funcall.lisp --- Tests function calling. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; Copyright (C) 2005-2007, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi-tests) - -;;;# Calling with Built-In C Types -;;; -;;; Tests calling standard C library functions both passing and -;;; returning each built-in type. - -;;; Don't run these tests if the implementation does not support -;;; foreign-funcall. -#-cffi-sys::no-foreign-funcall -(progn - -(deftest funcall.char - (foreign-funcall "toupper" :char (char-code #\a) :char) - #.(char-code #\A)) - -(deftest funcall.int.1 - (foreign-funcall "abs" :int -100 :int) - 100) - -(defun funcall-abs (n) - (foreign-funcall "abs" :int n :int)) - -;;; regression test: lispworks's %foreign-funcall based on creating -;;; and caching foreign-funcallables at macro-expansion time. -(deftest funcall.int.2 - (funcall-abs -42) - 42) - -(deftest funcall.long - (foreign-funcall "labs" :long -131072 :long) - 131072) - -#-cffi-sys::no-long-long -(deftest funcall.long-long - (foreign-funcall "my_llabs" :long-long -9223372036854775807 :long-long) - 9223372036854775807) - -#-cffi-sys::no-long-long -(deftest funcall.unsigned-long-long - (let ((ullong-max (1- (expt 2 (* 8 (foreign-type-size :unsigned-long-long)))))) - (eql ullong-max - (foreign-funcall "ullong" :unsigned-long-long ullong-max - :unsigned-long-long))) - t) - -(deftest funcall.float - (foreign-funcall "my_sqrtf" :float 16.0 :float) - 4.0) - -(deftest funcall.double - (foreign-funcall "sqrt" :double 36.0d0 :double) - 6.0d0) - -#+(and scl long-float) -(deftest funcall.long-double - (foreign-funcall "sqrtl" :long-double 36.0l0 :long-double) - 6.0l0) - -(deftest funcall.string.1 - (foreign-funcall "strlen" :string "Hello" :int) - 5) - -(deftest funcall.string.2 - (with-foreign-pointer-as-string (s 100) - (setf (mem-ref s :char) 0) - (foreign-funcall "strcpy" :pointer s :string "Hello" :pointer) - (foreign-funcall "strcat" :pointer s :string ", world!" :pointer)) - "Hello, world!") - -(deftest funcall.string.3 - (with-foreign-pointer (ptr 100) - (lisp-string-to-foreign "Hello, " ptr 8) - (foreign-funcall "strcat" :pointer ptr :string "world!" :string)) - "Hello, world!") - -;;;# Calling Varargs Functions - -(deftest funcall.varargs.nostdlib - (foreign-funcall-varargs - "sum_double_arbitrary" (:int 26) - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 - :double) - 81.64d0) - -;; The CHAR argument must be passed as :INT because chars are promoted -;; to ints when passed as variable arguments. -(deftest funcall.varargs.char - (with-foreign-pointer-as-string (s 100) - (setf (mem-ref s :char) 0) - (foreign-funcall-varargs - "sprintf" (:pointer s :string "%c") :int 65 :int)) - "A") - -(deftest funcall.varargs.int - (with-foreign-pointer-as-string (s 100) - (setf (mem-ref s :char) 0) - (foreign-funcall-varargs - "sprintf" (:pointer s :string "%d") :int 1000 :int)) - "1000") - -(deftest funcall.varargs.long - (with-foreign-pointer-as-string (s 100) - (setf (mem-ref s :char) 0) - (foreign-funcall-varargs - "sprintf" (:pointer s :string "%ld") - :long 131072 :int)) - "131072") - -;;; There is no FUNCALL.VARARGS.FLOAT as floats are promoted to double -;;; when passed as variable arguments. Currently this fails in SBCL -;;; and CMU CL on Darwin/ppc. -(deftest funcall.varargs.double - (with-foreign-pointer-as-string (s 100) - (setf (mem-ref s :char) 0) - (foreign-funcall-varargs - "sprintf" (:pointer s :string "%.2f") :double (coerce pi 'double-float) :int)) - "3.14") - -#+(and scl long-float) -(deftest funcall.varargs.long-double - (with-foreign-pointer-as-string (s 100) - (setf (mem-ref s :char) 0) - (foreign-funcall-varargs - "sprintf" :pointer s :string "%.2Lf" :long-double pi :int)) - "3.14") - -(deftest funcall.varargs.string - (with-foreign-pointer-as-string (s 100) - (setf (mem-ref s :char) 0) - (foreign-funcall-varargs - "sprintf" (:pointer s :string "%s, %s!") :string "Hello" :string "world" :int)) - "Hello, world!") - -;;; See DEFCFUN.DOUBLE26. -(deftest funcall.double26 - (foreign-funcall "sum_double26" - :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double 3.14d0 - :double 3.14d0 :double 3.14d0 :double) - 81.64d0) - -;;; See DEFCFUN.FLOAT26. -(deftest funcall.float26 - (foreign-funcall "sum_float26" - :float 5.0 :float 5.0 :float 5.0 :float 5.0 :float 5.0 - :float 5.0 :float 5.0 :float 5.0 :float 5.0 :float 5.0 - :float 5.0 :float 5.0 :float 5.0 :float 5.0 :float 5.0 - :float 5.0 :float 5.0 :float 5.0 :float 5.0 :float 5.0 - :float 5.0 :float 5.0 :float 5.0 :float 5.0 :float 5.0 - :float 5.0 :float) - 130.0) - -;;; Funcalling a pointer. -(deftest funcall.f-s-p.1 - (foreign-funcall-pointer (foreign-symbol-pointer "abs") nil :int -42 :int) - 42) - -;;;# Namespaces - -#-cffi-sys::flat-namespace -(deftest funcall.namespace.1 - (values (foreign-funcall ("ns_function" :library libtest) :boolean) - (foreign-funcall ("ns_function" :library libtest2) :boolean)) - t nil) - -;;;# stdcall - -#+(and x86 windows (not cffi-sys::no-stdcall)) -(deftest funcall.stdcall.1 - (flet ((fun () - (foreign-funcall ("stdcall_fun@12" :convention :stdcall) - :int 1 :int 2 :int 3 :int))) - (loop repeat 100 do (fun) - finally (return (fun)))) - 6) - -;;; RT: NIL arguments are skipped - -(defvar *nil-skipped*) - -(define-foreign-type check-nil-skip-type () - () - (:actual-type :pointer) - (:simple-parser check-nil-skip-type)) - -(defmethod expand-to-foreign (val (type check-nil-skip-type)) - (declare (ignore val)) - (setf *nil-skipped* nil) - (null-pointer)) - -(deftest funcall.nil-skip - (let ((*nil-skipped* t)) - (compile nil '(lambda () - (foreign-funcall "abs" check-nil-skip-type nil))) - *nil-skipped*) - nil) - -;;; RT: CLISP returns NIL instead of a null-pointer - -(deftest funcall.pointer-not-nil - (not (null (foreign-funcall "strchr" :string "" :int 1 :pointer))) - t) - -) ;; #-cffi-sys::no-foreign-funcall diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/grovel.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/grovel.lisp deleted file mode 100644 index 97cad59..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/grovel.lisp +++ /dev/null @@ -1,96 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; grovel.lisp --- CFFI-Grovel tests. -;;; -;;; Copyright (C) 2014, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi-tests) - -(deftest %invoke - (cffi-grovel::invoke "echo" "test") - nil nil 0) - -(defun grovel-forms (forms &key (quiet t)) - (uiop:with-temporary-file (:stream grovel-stream :pathname grovel-file) - (with-standard-io-syntax - (with-open-stream (*standard-output* grovel-stream) - (let ((*package* (find-package :keyword))) - (mapc #'write forms)))) - (let ((lisp-file (let ((*debug-io* (if quiet (make-broadcast-stream) *debug-io*))) - (cffi-grovel:process-grovel-file grovel-file)))) - (unwind-protect - (load lisp-file) - (uiop:delete-file-if-exists lisp-file))))) - -(defun bug-1395242-helper (enum-type base-type constant-name) - (check-type enum-type (member constantenum cenum)) - (check-type base-type string) - (check-type constant-name string) - (let ((enum-name (intern (symbol-name (gensym)))) - (base-type-name (intern (symbol-name (gensym))))) - (grovel-forms `((ctype ,base-type-name ,base-type) - (,enum-type (,enum-name :base-type ,base-type-name) - ((:value ,constant-name))))) - (cffi:foreign-enum-value enum-name :value))) - -(deftest bug-1395242 - (labels - ((process-expression (expression) - (loop for enum-type in '(constantenum cenum) - always (destructuring-bind (base-type &rest evaluations) expression - (loop for (name expected-value) in evaluations - for actual-value = (bug-1395242-helper enum-type base-type name) - always (or (= expected-value actual-value) - (progn - (format *error-output* - "Test failed for case: ~A, ~A, ~A (expected ~A, actual ~A)~%" - enum-type base-type name expected-value actual-value) - nil))))))) - (every #'process-expression - '(("uint8_t" ("UINT8_MAX" 255) ("INT8_MAX" 127) ("INT8_MIN" 128)) - ("int8_t" ("INT8_MIN" -128) ("INT8_MAX" 127) ("UINT8_MAX" -1)) - ("uint16_t" ("UINT16_MAX" 65535) ("INT8_MIN" 65408)) - ("int16_t" ("INT16_MIN" -32768) ("INT16_MAX" 32767) ("UINT16_MAX" -1)) - ("uint32_t" ("UINT32_MAX" 4294967295) ("INT8_MIN" 4294967168)) - ("int32_t" ("INT32_MIN" -2147483648) ("INT32_MAX" 2147483647))))) - t) - -(defvar *grovelled-features*) - -(deftest grovel-feature - (let ((*grovelled-features* nil)) - (grovel-forms `((in-package :cffi-tests) - (include "limits.h") - (feature grovel-test-feature "CHAR_BIT") - (feature :char-bit "CHAR_BIT" - :feature-list *grovelled-features*) - (feature :inexistent-grovel-feature - "INEXISTENT_CFFI_GROVEL_FEATURE" - :feature-list *grovelled-features*))) - (unwind-protect - (values (and (member 'grovel-test-feature *features*) t) - (and (member :char-bit *grovelled-features*) t) - (member :inexistent-grovel-feature *grovelled-features*)) - (alexandria:removef *features* 'grovel-test-feature))) - t t nil) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libfsbv.c b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libfsbv.c deleted file mode 100644 index 8df645e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libfsbv.c +++ /dev/null @@ -1,179 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- - * - * libfsbv.c --- auxiliary C lib for testing foreign structure by value calls - * - * Copyright (C) 2011, 2015 Liam M. Healy - * - * 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. - */ - -#ifdef WIN32 -#define DLLEXPORT __declspec(dllexport) -#else -#define DLLEXPORT -#endif - -#include -#include -#include -#include -#include -#include -#include - -/* MSVC doesn't have stdint.h and uses a different syntax for stdcall */ -#ifndef _MSC_VER -#include -#endif - -#ifdef WIN32 -#ifdef _MSC_VER -#define STDCALL __stdcall -#else -#define STDCALL __attribute__((stdcall)) -#endif -#else -#define STDCALL -#endif - -struct struct_pair { - int a; - int b; -}; - -struct struct_pair_double { - struct struct_pair pr; - double dbl; -}; - -typedef enum { - ONE = 1, - TWO, - THREE, - FOUR, - FORTY_ONE = 41, - FORTY_TWO -} numeros; - -int sumpair (struct struct_pair sp); -int enumpair (numeros mynum, struct struct_pair sp); -struct struct_pair doublepair (struct struct_pair dp); -double prodsumpair (struct struct_pair_double spd); -struct struct_pair_double doublepairdouble (struct struct_pair_double pd); - -DLLEXPORT -int sumpair (struct struct_pair sp) -{ - return sp.a + sp.b; -} - -DLLEXPORT -int enumpair (numeros mynum, struct struct_pair sp) -{ - if ( mynum == ONE ) - { - return sp.a + sp.b; - } - else if ( mynum == TWO ) - { - return sp.a + 2*sp.b; - } - else if ( mynum == THREE ) - { - return 2*sp.a + sp.b; - } - else if ( mynum == FOUR ) - { - return 2*sp.a + 2*sp.b; - } - else - { - return 41*sp.a + 42*sp.b; - } -} - -DLLEXPORT -struct struct_pair makepair (bool cond) -{ - struct struct_pair ret; - ret.a = -127; - ret.b = cond ? 42 : 43; - return ret; -} - -const struct struct_pair static_pair = { 40, 2}; - -DLLEXPORT -struct struct_pair * returnpairpointer (struct struct_pair ignored) -{ - return &static_pair; -} - -DLLEXPORT -struct struct_pair doublepair (struct struct_pair dp) -{ - struct struct_pair ret; - ret.a = 2*dp.a; - ret.b = 2*dp.b; - return ret; -} - -DLLEXPORT -double prodsumpair (struct struct_pair_double pd) -{ - return pd.dbl * sumpair(pd.pr); -} - -DLLEXPORT -struct struct_pair_double doublepairdouble (struct struct_pair_double pd) -{ - struct struct_pair_double ret; - ret.pr = doublepair(pd.pr); - ret.dbl = 2*pd.dbl; - return ret; -} - -DLLEXPORT -unsigned long long ullsum (unsigned long long a, unsigned long long b) -{ - return a + b; -} - -DLLEXPORT -struct struct_pair stringlenpair (char *string, struct struct_pair dp) -{ - struct struct_pair ret; - int len = strlen(string); - ret.a = len*dp.a; - ret.b = len*dp.b; - return ret; -} - -struct bitfield_struct { - unsigned int b; -}; - -DLLEXPORT -struct bitfield_struct structbitfield (unsigned int x) { - struct bitfield_struct ret; - ret.b = x; - return ret; -} diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libtest.c b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libtest.c deleted file mode 100644 index a7123d3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libtest.c +++ /dev/null @@ -1,985 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- - * - * libtest.c --- auxiliary C lib for testing purposes - * - * Copyright (C) 2005-2007, Luis Oliveira - * - * 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. - */ - -#ifdef WIN32 -#define DLLEXPORT __declspec(dllexport) -#else -#define DLLEXPORT -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -/* MSVC doesn't have stdint.h and uses a different syntax for stdcall */ -#ifndef _MSC_VER -#include -#endif - -#ifdef WIN32 -#ifdef _MSC_VER -#define STDCALL __stdcall -#else -#define STDCALL __attribute__((stdcall)) -#endif -#else -#define STDCALL -#endif - -/* - * Some functions that aren't available on WIN32 - */ - -DLLEXPORT -float my_sqrtf(float n) -{ - return (float) sqrt((double) n); -} - -DLLEXPORT -char *my_strdup(const char *str) -{ - char *p = malloc(strlen(str) + 1); - strcpy(p, str); - return p; -} - -DLLEXPORT -void my_strfree(char *str) -{ - free(str); -} - -DLLEXPORT -long long my_llabs(long long n) -{ - return n < 0 ? -n : n; -} - - -DLLEXPORT -unsigned long long ullong(unsigned long long n) -{ - return n == ULLONG_MAX ? n : 42; -} - -/* - * Foreign Globals - * - * (var_int is used in MISC-TYPES.EXPAND.3 as well) - */ - -DLLEXPORT char * dll_version = "20120107"; - -/* TODO: look into signed char vs. unsigned char issue */ -DLLEXPORT char var_char = -127; -DLLEXPORT unsigned char var_unsigned_char = 255; -DLLEXPORT short var_short = -32767; -DLLEXPORT unsigned short var_unsigned_short = 65535; -DLLEXPORT int var_int = -32767; -DLLEXPORT unsigned int var_unsigned_int = 65535; -DLLEXPORT long var_long = -2147483647L; -DLLEXPORT unsigned long var_unsigned_long = 4294967295UL; -DLLEXPORT float var_float = 42.0f; -DLLEXPORT double var_double = 42.0; -DLLEXPORT void * var_pointer = NULL; -DLLEXPORT char * var_string = "Hello, foreign world!"; - -DLLEXPORT long long var_long_long = -9223372036854775807LL; -DLLEXPORT unsigned long long var_unsigned_long_long = 18446744073709551615ULL; - -DLLEXPORT float float_max = FLT_MAX; -DLLEXPORT float float_min = FLT_MIN; -DLLEXPORT double double_max = DBL_MAX; -DLLEXPORT double double_min = DBL_MIN; - -/* - * Callbacks - */ - -DLLEXPORT -int expect_char_sum(char (*f)(char, char)) -{ - return f('a', 3) == 'd'; -} - -DLLEXPORT -int expect_unsigned_char_sum(unsigned char (*f)(unsigned char, unsigned char)) -{ - return f(UCHAR_MAX-1, 1) == UCHAR_MAX; -} - -DLLEXPORT -int expect_short_sum(short (*f)(short a, short b)) -{ - return f(SHRT_MIN+1, -1) == SHRT_MIN; -} - -DLLEXPORT -int expect_unsigned_short_sum(unsigned short (*f)(unsigned short, - unsigned short)) -{ - return f(USHRT_MAX-1, 1) == USHRT_MAX; -} - -/* used in MISC-TYPES.EXPAND.4 as well */ -DLLEXPORT -int expect_int_sum(int (*f)(int, int)) -{ - return f(INT_MIN+1, -1) == INT_MIN; -} - -DLLEXPORT -int expect_unsigned_int_sum(unsigned int (*f)(unsigned int, unsigned int)) -{ - return f(UINT_MAX-1, 1) == UINT_MAX; -} - -DLLEXPORT -int expect_long_sum(long (*f)(long, long)) -{ - return f(LONG_MIN+1, -1) == LONG_MIN; -} - -DLLEXPORT -int expect_unsigned_long_sum(unsigned long (*f)(unsigned long, unsigned long)) -{ - return f(ULONG_MAX-1, 1) == ULONG_MAX; -} - -DLLEXPORT -int expect_long_long_sum(long long (*f)(long long, long long)) -{ - return f(LLONG_MIN+1, -1) == LLONG_MIN; -} - -DLLEXPORT -int expect_unsigned_long_long_sum (unsigned long long - (*f)(unsigned long long, unsigned long long)) -{ - return f(ULLONG_MAX-1, 1) == ULLONG_MAX; -} - -DLLEXPORT -int expect_float_sum(float (*f)(float, float)) -{ - /*printf("\n>>> FLOAT: %f <<<\n", f(20.0f, 22.0f));*/ - return f(20.0f, 22.0f) == 42.0f; -} - -DLLEXPORT -int expect_double_sum(double (*f)(double, double)) -{ - /*printf("\n>>> DOUBLE: %f<<<\n", f(-20.0, -22.0));*/ - return f(-20.0, -22.0) == -42.0; -} - -DLLEXPORT -int expect_long_double_sum(long double (*f)(long double, long double)) -{ - /*printf("\n>>> DOUBLE: %f<<<\n", f(-20.0, -22.0));*/ - return f(-20.0, -22.0) == -42.0; -} - -DLLEXPORT -int expect_pointer_sum(void* (*f)(void*, int)) -{ - return f(NULL, 0xDEAD) == (void *) 0xDEAD; -} - -DLLEXPORT -int expect_strcat(char* (*f)(char*, char*)) -{ - char *ret = f("Hello, ", "C world!"); - int res = strcmp(ret, "Hello, C world!") == 0; - /* commented out as a quick fix on platforms that don't - foreign allocate in C malloc space. */ - /*free(ret);*/ /* is this allowed? */ - return res; -} - -DLLEXPORT -void pass_int_ref(void (*f)(int*)) -{ - int x = 1984; - f(&x); -} - -/* - * Enums - */ - -typedef enum { - ONE = 1, - TWO, - THREE, - FOUR, - FORTY_ONE = 41, - FORTY_TWO -} numeros; - -DLLEXPORT -int check_enums(numeros one, numeros two, numeros three, numeros four, - numeros forty_one, numeros forty_two) -{ - if (one == ONE && two == TWO && three == THREE && four == FOUR && - forty_one == FORTY_ONE && forty_two == FORTY_TWO) - return 1; - - return 0; -} - -typedef enum { FALSE, TRUE } another_boolean; - -DLLEXPORT -another_boolean return_enum(int x) -{ - if (x == 0) - return FALSE; - else - return TRUE; -} - -/* - * Booleans - */ - -DLLEXPORT -int equalequal(int a, unsigned int b) -{ - return ((unsigned int) a) == b; -} - -DLLEXPORT -char bool_and(unsigned char a, char b) -{ - return a && b; -} - -DLLEXPORT -unsigned long bool_xor(long a, unsigned long b) -{ - return (a && !b) || (!a && b); -} - -DLLEXPORT -unsigned sizeof_bool(void) -{ - return (unsigned) sizeof(_Bool); -} - -DLLEXPORT -unsigned bool_to_unsigned(_Bool b) -{ - return (unsigned) b; -} - -DLLEXPORT -_Bool unsigned_to_bool(unsigned u) -{ - return (_Bool) u; -} - -/* - * Test struct alignment issues. These comments assume the x86 gABI. - * Hopefully these tests will spot alignment issues in others archs - * too. - */ - -/* - * STRUCT.ALIGNMENT.1 - */ - -struct s_ch { - char a_char; -}; - -/* This struct's size should be 2 bytes */ -struct s_s_ch { - char another_char; - struct s_ch a_s_ch; -}; - -DLLEXPORT -struct s_s_ch the_s_s_ch = { 2, { 1 } }; - -/* - * STRUCT.ALIGNMENT.2 - */ - -/* This one should be alignment should be the same as short's alignment. */ -struct s_short { - char a_char; - char another_char; - short a_short; -}; - -struct s_s_short { - char yet_another_char; - struct s_short a_s_short; /* so this should be 2-byte aligned */ -}; /* size: 6 bytes */ - -DLLEXPORT -struct s_s_short the_s_s_short = { 4, { 1, 2, 3 } }; - -/* - * STRUCT.ALIGNMENT.3 - */ - -/* This test will, among other things, check for the existence tail padding. */ - -struct s_double { - char a_char; /* 1 byte */ - /* padding: 3 bytes */ - double a_double; /* 8 bytes */ - char another_char; /* 1 byte */ - /* padding: 3 bytes */ -}; /* total size: 16 bytes */ - -struct s_s_double { - char yet_another_char; /* 1 byte */ - /* 3 bytes padding */ - struct s_double a_s_double; /* 16 bytes */ - short a_short; /* 2 byte */ - /* 2 bytes padding */ -}; /* total size: 24 bytes */ - -DLLEXPORT -struct s_s_double the_s_s_double = { 4, { 1, 2.0, 3 }, 5 }; - -/* - * STRUCT.ALIGNMENT.4 - */ -struct s_s_s_double { - short another_short; /* 2 bytes */ - /* 2 bytes padding */ - struct s_s_double a_s_s_double; /* 24 bytes */ - char last_char; /* 1 byte */ - /* 3 bytes padding */ -}; /* total size: 32 */ - -DLLEXPORT -struct s_s_s_double the_s_s_s_double = { 6, { 4, { 1, 2.0, 3 }, 5 }, 7 }; - -/* - * STRUCT.ALIGNMENT.5 - */ - -/* MacOSX ABI says: "The embedding alignment of the first element in a data - structure is equal to the element's natural alignment." and "For subsequent - elements that have a natural alignment greater than 4 bytes, the embedding - alignment is 4, unless the element is a vector." */ - -/* note: these rules will apply to the structure itself. So, unless it is - the first element of another structure, its alignment will be 4. */ - -/* the following offsets and sizes are specific to darwin/ppc32 */ - -struct s_double2 { - double a_double; /* 8 bytes (alignment 8) */ - short a_short; /* 2 bytes */ - /* 6 bytes padding */ -}; /* total size: 16 */ - -struct s_s_double2 { - char a_char; /* 1 byte */ - /* 3 bytes padding */ - struct s_double2 a_s_double2; /* 16 bytes, alignment 4 */ - short another_short; /* 2 bytes */ - /* 2 bytes padding */ -}; /* total size: 24 bytes */ - /* alignment: 4 */ - -DLLEXPORT -struct s_s_double2 the_s_s_double2 = { 3, { 1.0, 2 }, 4 }; - -/* - * STRUCT.ALIGNMENT.6 - */ - -/* Same as STRUCT.ALIGNMENT.5 but with long long. */ - -struct s_long_long { - long long a_long_long; /* 8 bytes (alignment 8) */ - short a_short; /* 2 bytes */ - /* 6 bytes padding */ -}; /* total size: 16 */ - -struct s_s_long_long { - char a_char; /* 1 byte */ - /* 3 bytes padding */ - struct s_long_long a_s_long_long; /* 16 bytes, alignment 4 */ - short a_short; /* 2 bytes */ - /* 2 bytes padding */ -}; /* total size: 24 bytes */ - /* alignment: 4 */ - -DLLEXPORT -struct s_s_long_long the_s_s_long_long = { 3, { 1, 2 }, 4 }; - -/* - * STRUCT.ALIGNMENT.7 - */ - -/* Another test for Darwin's PPC32 ABI. */ - -struct s_s_double3 { - struct s_double2 a_s_double2; /* 16 bytes, alignment 8*/ - short another_short; /* 2 bytes */ - /* 6 bytes padding */ -}; /* total size: 24 */ - -struct s_s_s_double3 { - struct s_s_double3 a_s_s_double3; /* 24 bytes */ - char a_char; /* 1 byte */ - /* 7 bytes padding */ -}; /* total size: 32 */ - -DLLEXPORT -struct s_s_s_double3 the_s_s_s_double3 = { { { 1.0, 2 }, 3 }, 4 }; - -/* - * STRUCT.ALIGNMENT.8 - */ - -/* Same as STRUCT.ALIGNMENT.[56] but with unsigned long long. */ - -struct s_unsigned_long_long { - unsigned long long an_unsigned_long_long; /* 8 bytes (alignment 8) */ - short a_short; /* 2 bytes */ - /* 6 bytes padding */ -}; /* total size: 16 */ - -struct s_s_unsigned_long_long { - char a_char; /* 1 byte */ - /* 3 bytes padding */ - struct s_unsigned_long_long a_s_unsigned_long_long; /* 16 bytes, align 4 */ - short a_short; /* 2 bytes */ - /* 2 bytes padding */ -}; /* total size: 24 bytes */ - /* alignment: 4 */ - -DLLEXPORT -struct s_s_unsigned_long_long the_s_s_unsigned_long_long = { 3, { 1, 2 }, 4 }; - -/* STRUCT.ALIGNMENT.x */ - -/* commented this test out because this is not standard C - and MSVC++ (or some versions of it at least) won't compile it. */ - -/* -struct empty_struct {}; - -struct with_empty_struct { - struct empty_struct foo; - int an_int; -}; - -DLLEXPORT -struct with_empty_struct the_with_empty_struct = { {}, 42 }; -*/ - -/* - * STRUCT-VALUES.* - */ - -struct pair { int a, b; }; - -DLLEXPORT -int pair_sum(struct pair p) -{ - return p.a + p.b; -} - -DLLEXPORT -int pair_pointer_sum(struct pair *p) -{ - return p->a + p->b; -} - -DLLEXPORT -struct pair make_pair(int a, int b) -{ - return (struct pair) { a, b }; -} - -DLLEXPORT -struct pair *alloc_pair(int a, int b) -{ - struct pair *p = malloc(sizeof(struct pair)); - p->a = a; - p->b = b; - return p; -} - -struct pair_plus_one { - struct pair p; - int c; -}; - -DLLEXPORT -int pair_plus_one_sum(struct pair_plus_one p) -{ - return p.p.a + p.p.b + p.c; -} - -DLLEXPORT -int pair_plus_one_pointer_sum(struct pair_plus_one *p) -{ - return p->p.a + p->p.b + p->c; -} - -DLLEXPORT -struct pair_plus_one make_pair_plus_one(int a, int b, int c) -{ - return (struct pair_plus_one) { { a, b }, c }; -} - -DLLEXPORT -struct pair_plus_one *alloc_pair_plus_one(int a, int b, int c) -{ - struct pair_plus_one *p = malloc(sizeof(struct pair_plus_one)); - p->p.a = a; - p->p.b = b; - p->c = c; - return p; -} - -/* - * DEFCFUN.NOARGS and DEFCFUN.NOOP - */ - -DLLEXPORT -int noargs() -{ - return 42; -} - -DLLEXPORT -void noop() -{ - return; -} - -/* - * DEFCFUN.BFF.1 - * - * (let ((rettype (find-type :long)) - * (arg-types (n-random-types-no-ll 127))) - * (c-function rettype arg-types) - * (gen-function-test rettype arg-types)) - */ - -DLLEXPORT long sum_127_no_ll - (long a1, unsigned long a2, short a3, unsigned short a4, float a5, - double a6, unsigned long a7, float a8, unsigned char a9, unsigned - short a10, short a11, unsigned long a12, double a13, long a14, - unsigned int a15, void* a16, unsigned int a17, unsigned short a18, - long a19, float a20, void* a21, float a22, int a23, int a24, unsigned - short a25, long a26, long a27, double a28, unsigned char a29, unsigned - int a30, unsigned int a31, int a32, unsigned short a33, unsigned int - a34, void* a35, double a36, double a37, long a38, short a39, unsigned - short a40, long a41, char a42, long a43, unsigned short a44, void* - a45, int a46, unsigned int a47, double a48, unsigned char a49, - unsigned char a50, float a51, int a52, unsigned short a53, double a54, - short a55, unsigned char a56, unsigned long a57, float a58, float a59, - float a60, void* a61, void* a62, unsigned int a63, unsigned long a64, - char a65, short a66, unsigned short a67, unsigned long a68, void* a69, - float a70, double a71, long a72, unsigned long a73, short a74, - unsigned int a75, unsigned short a76, int a77, unsigned short a78, - char a79, double a80, short a81, unsigned char a82, float a83, char - a84, int a85, double a86, unsigned char a87, int a88, unsigned long - a89, double a90, short a91, short a92, unsigned int a93, unsigned char - a94, float a95, long a96, float a97, long a98, long a99, int a100, int - a101, unsigned int a102, char a103, char a104, unsigned short a105, - unsigned int a106, unsigned short a107, unsigned short a108, int a109, - long a110, char a111, double a112, unsigned int a113, char a114, short - a115, unsigned long a116, unsigned int a117, short a118, unsigned char - a119, float a120, void* a121, double a122, int a123, long a124, char - a125, unsigned short a126, float a127) -{ - return (long) a1 + a2 + a3 + a4 + ((long) a5) + ((long) a6) + a7 + - ((long) a8) + a9 + a10 + a11 + a12 + ((long) a13) + a14 + a15 + - ((intptr_t) a16) + a17 + a18 + a19 + ((long) a20) + - ((intptr_t) a21) + ((long) a22) + a23 + a24 + a25 + a26 + a27 + - ((long) a28) + a29 + a30 + a31 + a32 + a33 + a34 + ((intptr_t) a35) + - ((long) a36) + ((long) a37) + a38 + a39 + a40 + a41 + a42 + a43 + a44 + - ((intptr_t) a45) + a46 + a47 + ((long) a48) + a49 + a50 + - ((long) a51) + a52 + a53 + ((long) a54) + a55 + a56 + a57 + ((long) a58) + - ((long) a59) + ((long) a60) + ((intptr_t) a61) + - ((intptr_t) a62) + a63 + a64 + a65 + a66 + a67 + a68 + - ((intptr_t) a69) + ((long) a70) + ((long) a71) + a72 + a73 + a74 + - a75 + a76 + a77 + a78 + a79 + ((long) a80) + a81 + a82 + ((long) a83) + - a84 + a85 + ((long) a86) + a87 + a88 + a89 + ((long) a90) + a91 + a92 + - a93 + a94 + ((long) a95) + a96 + ((long) a97) + a98 + a99 + a100 + a101 + - a102 + a103 + a104 + a105 + a106 + a107 + a108 + a109 + a110 + a111 + - ((long) a112) + a113 + a114 + a115 + a116 + a117 + a118 + a119 + - ((long) a120) + ((intptr_t) a121) + ((long) a122) + a123 + a124 + - a125 + a126 + ((long) a127); -} - -/* - * DEFCFUN.BFF.2 - * - * (let ((rettype (find-type :long-long)) - * (arg-types (n-random-types 127))) - * (c-function rettype arg-types) - * (gen-function-test rettype arg-types)) - */ - -DLLEXPORT long long sum_127 - (void* a1, void* a2, float a3, unsigned long a4, void* a5, long long - a6, double a7, double a8, unsigned short a9, int a10, long long a11, - long a12, short a13, unsigned int a14, long a15, unsigned char a16, - int a17, double a18, short a19, short a20, long long a21, unsigned - int a22, unsigned short a23, short a24, void* a25, short a26, - unsigned short a27, unsigned short a28, int a29, long long a30, - void* a31, int a32, unsigned long a33, unsigned long a34, void* a35, - unsigned long long a36, float a37, int a38, short a39, void* a40, - unsigned long long a41, long long a42, unsigned long a43, unsigned - long a44, unsigned long long a45, unsigned long a46, char a47, - double a48, long a49, unsigned int a50, int a51, short a52, void* - a53, long a54, unsigned long long a55, int a56, unsigned short a57, - unsigned long long a58, float a59, void* a60, float a61, unsigned - short a62, unsigned long a63, float a64, unsigned int a65, unsigned - long long a66, void* a67, double a68, unsigned long long a69, double - a70, double a71, long long a72, void* a73, unsigned short a74, long - a75, void* a76, short a77, double a78, long a79, unsigned char a80, - void* a81, unsigned char a82, long a83, double a84, void* a85, int - a86, double a87, unsigned char a88, double a89, short a90, long a91, - int a92, long a93, double a94, unsigned short a95, unsigned int a96, - int a97, char a98, long long a99, double a100, float a101, unsigned - long a102, short a103, void* a104, float a105, long long a106, int - a107, long long a108, long long a109, double a110, unsigned long - long a111, double a112, unsigned long a113, char a114, char a115, - unsigned long a116, short a117, unsigned char a118, unsigned char - a119, int a120, int a121, float a122, unsigned char a123, unsigned - char a124, double a125, unsigned long long a126, char a127) -{ - return (long long) ((intptr_t) a1) + ((intptr_t) a2) + ((long) a3) + - a4 + ((intptr_t) a5) + a6 + ((long) a7) + ((long) a8) + a9 + a10 + - a11 + a12 + a13 + a14 + a15 + a16 + a17 + ((long) a18) + a19 + a20 + - a21 + a22 + a23 + a24 + ((intptr_t) a25) + a26 + a27 + a28 + a29 + - a30 + ((intptr_t) a31) + a32 + a33 + a34 + ((intptr_t) a35) + - a36 + ((long) a37) + a38 + a39 + ((intptr_t) a40) + a41 + a42 + a43 + - a44 + a45 + a46 + a47 + ((long) a48) + a49 + a50 + a51 + a52 + - ((intptr_t) a53) + a54 + a55 + a56 + a57 + a58 + ((long) a59) + - ((intptr_t) a60) + ((long) a61) + a62 + a63 + ((long) a64) + a65 + a66 - + ((intptr_t) a67) + ((long) a68) + a69 + ((long) a70) + ((long) a71) + - a72 + ((intptr_t) a73) + a74 + a75 + ((intptr_t) a76) + a77 + - ((long) a78) + a79 + a80 + ((intptr_t) a81) + a82 + a83 + ((long) a84) - + ((intptr_t) a85) + a86 + ((long) a87) + a88 + ((long) a89) + a90 + - a91 + a92 + a93 + ((long) a94) + a95 + a96 + a97 + a98 + a99 + - ((long) a100) + ((long) a101) + a102 + a103 + ((intptr_t) a104) + - ((long) a105) + a106 + a107 + a108 + a109 + ((long) a110) + a111 + - ((long) a112) + a113 + a114 + a115 + a116 + a117 + a118 + a119 + a120 + - a121 + ((long) a122) + a123 + a124 + ((long) a125) + a126 + a127; -} - -/* - * CALLBACKS.BFF.1 (cb-test :no-long-long t) - */ - -DLLEXPORT long call_sum_127_no_ll - (long (*func) - (unsigned long, void*, long, double, unsigned long, float, float, - int, unsigned int, double, double, double, void*, unsigned short, - unsigned short, void*, long, long, int, short, unsigned short, - unsigned short, char, long, void*, void*, char, unsigned char, - unsigned long, short, int, int, unsigned char, short, long, long, - void*, unsigned short, char, double, unsigned short, void*, short, - unsigned long, unsigned short, float, unsigned char, short, float, - short, char, unsigned long, unsigned long, char, float, long, void*, - short, float, unsigned int, float, unsigned int, double, unsigned int, - unsigned char, int, long, char, short, double, int, void*, char, - unsigned short, void*, unsigned short, void*, unsigned long, double, - void*, long, float, unsigned short, unsigned short, void*, float, int, - unsigned int, double, float, long, void*, unsigned short, float, - unsigned char, unsigned char, float, unsigned int, float, unsigned - short, double, unsigned short, unsigned long, unsigned int, unsigned - long, void*, unsigned char, char, char, unsigned short, unsigned long, - float, short, void*, long, unsigned short, short, double, short, int, - char, unsigned long, long, int, void*, double, unsigned char)) -{ - return - func(948223085, (void *) 803308438, -465723152, 20385, - 219679466, -10035, 13915, -1193455756, 1265303699, 27935, -18478, - -10508, (void *) 215389089, 55561, 55472, (void *) 146070433, - -1040819989, -17851453, -1622662247, -19473, 20837, 30216, 79, - 986800400, (void *) 390281604, (void *) 1178532858, 19, 117, - 78337699, -5718, -991300738, 872160910, 184, 926, -1487245383, - 1633973783, (void *) 33738609, 53985, -116, 31645, 27196, (void *) - 145569903, -6960, 17252220, 47404, -10491, 88, -30438, -21212, - -1982, -16, 1175270, 7949380, -121, 8559, -432968526, (void *) - 293455312, 11894, -8394, 142421516, -25758, 3422998, 4004, - 15758212, 198, -1071899743, -1284904617, -11, -17219, -30039, - 311589092, (void *) 541468577, 123, 63517, (void *) 1252504506, - 39368, (void *) 10057868, 134781408, -7143, (void *) 72825877, - -1190798667, -30862, 63757, 14965, (void *) 802391252, 22008, - -517289619, 806091099, 1125, 451, -498145176, (void *) 55960931, - 15379, 4629, 184, 254, 22532, 465856451, -1669, 49416, -16546, - 2983, 4337541, 65292495, 39253529, (void *) 669025, 211, 85, -19, - 24298, 65358, 16776, -29957, (void *) 124311, -163231228, 2610, - -7806, 26434, -21913, -753615541, 120, 358697932, -1198889034, - -2131350926, (void *) 3749492036, -13413, 17); -} - -/* - * CALLBACKS.BFF.2 (cb-test) - */ - -DLLEXPORT long long call_sum_127 - (long long (*func) - (short, char, void*, float, long, double, unsigned long long, - unsigned short, unsigned char, char, char, unsigned short, unsigned - long long, unsigned short, long long, unsigned short, unsigned long - long, unsigned char, unsigned char, unsigned long long, long long, - char, float, unsigned int, float, float, unsigned int, float, char, - unsigned char, long, long long, unsigned char, double, long, - double, unsigned int, unsigned short, long long, unsigned int, int, - unsigned long long, long, short, unsigned int, unsigned int, - unsigned long long, unsigned int, long, void*, unsigned char, char, - long long, unsigned short, unsigned int, float, unsigned char, - unsigned long, long long, float, long, float, int, float, unsigned - short, unsigned long long, short, unsigned long, long, char, - unsigned short, long long, short, double, void*, unsigned int, - char, unsigned int, void*, void*, unsigned char, void*, unsigned - short, unsigned char, long, void*, char, long, unsigned short, - unsigned char, double, unsigned long long, unsigned short, unsigned - short, unsigned int, long, char, long, char, short, unsigned short, - unsigned long, unsigned long, short, long long, long long, long - long, double, unsigned short, unsigned char, short, unsigned char, - long, long long, unsigned long long, unsigned int, unsigned long, - unsigned char, long long, unsigned char, unsigned long long, - double, unsigned char, long long, unsigned char, char, long long)) -{ - return - func(-8573, 14, (void *) 832601021, -32334, -1532040888, - -18478, 2793023182591311826, 2740, 230, 103, 97, 13121, - 5112369026351511084, 7763, -8134147951003417418, 34348, - 5776613699556468853, 19, 122, 1431603726926527625, - 439503521880490337, -112, -21557, 1578969190, -22008, -4953, - 2127745975, -7262, -6, 180, 226352974, -3928775366167459219, 134, - -17730, -1175042526, 23868, 3494181009, 57364, - 3134876875147518682, 104531655, -1286882727, 803577887579693487, - 1349268803, 24912, 3313099419, 3907347884, 1738833249233805034, - 2794230885, 1008818752, (void *) 1820044575, 189, 61, - -931654560961745071, 57531, 3096859985, 10405, 220, 3631311224, - -8531370353478907668, 31258, 678896693, -32150, -1869057813, - -19877, 62841, 4161660185772906873, -23869, 4016251006, 610353435, - 105, 47315, -1051054492535331660, 6846, -15163, (void *) - 736672359, 2123928476, -122, 3859258652, (void *) 3923394833, - (void *) 1265031970, 161, (void *) 1993867800, 55056, 122, - 1562112760, (void *) 866615125, -79, -1261399547, 31737, 254, - -31279, 5462649659172897980, 5202, 7644, 174224940, -337854382, - -45, -583502442, -37, -13266, 24520, 2198606699, 2890453969, - -8282, -2295716637858246075, -1905178488651598878, - -6384652209316714643, 14841, 35443, 132, 15524, 187, 2138878229, - -5153032566879951000, 9056545530140684207, 4124632010, 276167701, - 56, -2307310370663738730, 66, 9113015627153789746, -9618, 167, - 755753399701306200, 119, -28, -990561962725435433); -} - -/* - * CALLBACKS.DOUBLE26 - */ - -DLLEXPORT double call_double26 - (double (*f)(double, double, double, double, double, double, double, double, - double, double, double, double, double, double, double, double, - double, double, double, double, double, double, double, double, - double, double)) -{ - return f(3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, - 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, - 3.14, 3.14, 3.14, 3.14); -} - -/* - * DEFCFUN.DOUBLE26 and FUNCALL.DOUBLE26 - */ - -DLLEXPORT -double sum_double26(double a1, double a2, double a3, double a4, double a5, - double a6, double a7, double a8, double a9, double a10, - double a11, double a12, double a13, double a14, double a15, - double a16, double a17, double a18, double a19, double a20, - double a21, double a22, double a23, double a24, double a25, - double a26) -{ - return a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12 + a13 + - a14 + a15 + a16 + a17 + a18 + a19 + a20 + a21 + a22 + a23 + a24 + a25 + - a26; -} - -/* - * DEFCFUN.VARARGS.NOSTDLIB and FUNCALL.VARARGS.NOSTDLIB - */ -DLLEXPORT -double sum_double_arbitrary(int n, ...) -{ - va_list ap; - double sum = 0; - va_start(ap, n); - for(int j=0; j - * - * 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. - */ - -#ifdef WIN32 -#define DLLEXPORT __declspec(dllexport) -#else -#define DLLEXPORT -#endif - -/* - * [DEFCFUN|FOREIGN].NAMESPACE.1 - */ - -DLLEXPORT int ns_function() -{ - return 0; -} - -/* - * FOREIGN-GLOBALS.NAMESPACE.* - */ - -DLLEXPORT int ns_var = 0; - -/* vim: ts=4 et -*/ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/memory.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/memory.lisp deleted file mode 100644 index 3b3cbea..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/memory.lisp +++ /dev/null @@ -1,657 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; memory.lisp --- Tests for memory referencing. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -(in-package #:cffi-tests) - -(deftest deref.char - (with-foreign-object (p :char) - (setf (mem-ref p :char) -127) - (mem-ref p :char)) - -127) - -(deftest deref.unsigned-char - (with-foreign-object (p :unsigned-char) - (setf (mem-ref p :unsigned-char) 255) - (mem-ref p :unsigned-char)) - 255) - -(deftest deref.short - (with-foreign-object (p :short) - (setf (mem-ref p :short) -32767) - (mem-ref p :short)) - -32767) - -(deftest deref.unsigned-short - (with-foreign-object (p :unsigned-short) - (setf (mem-ref p :unsigned-short) 65535) - (mem-ref p :unsigned-short)) - 65535) - -(deftest deref.int - (with-foreign-object (p :int) - (setf (mem-ref p :int) -131072) - (mem-ref p :int)) - -131072) - -(deftest deref.unsigned-int - (with-foreign-object (p :unsigned-int) - (setf (mem-ref p :unsigned-int) 262144) - (mem-ref p :unsigned-int)) - 262144) - -(deftest deref.long - (with-foreign-object (p :long) - (setf (mem-ref p :long) -536870911) - (mem-ref p :long)) - -536870911) - -(deftest deref.unsigned-long - (with-foreign-object (p :unsigned-long) - (setf (mem-ref p :unsigned-long) 536870912) - (mem-ref p :unsigned-long)) - 536870912) - -#+(and darwin openmcl) -(pushnew 'deref.long-long rt::*expected-failures*) - -(deftest deref.long-long - (with-foreign-object (p :long-long) - (setf (mem-ref p :long-long) -9223372036854775807) - (mem-ref p :long-long)) - -9223372036854775807) - -(deftest deref.unsigned-long-long - (with-foreign-object (p :unsigned-long-long) - (setf (mem-ref p :unsigned-long-long) 18446744073709551615) - (mem-ref p :unsigned-long-long)) - 18446744073709551615) - -(deftest deref.float.1 - (with-foreign-object (p :float) - (setf (mem-ref p :float) 0.0) - (mem-ref p :float)) - 0.0) - -(deftest deref.float.2 - (with-foreign-object (p :float) - (setf (mem-ref p :float) *float-max*) - (mem-ref p :float)) - #.*float-max*) - -(deftest deref.float.3 - (with-foreign-object (p :float) - (setf (mem-ref p :float) *float-min*) - (mem-ref p :float)) - #.*float-min*) - -(deftest deref.double.1 - (with-foreign-object (p :double) - (setf (mem-ref p :double) 0.0d0) - (mem-ref p :double)) - 0.0d0) - -(deftest deref.double.2 - (with-foreign-object (p :double) - (setf (mem-ref p :double) *double-max*) - (mem-ref p :double)) - #.*double-max*) - -(deftest deref.double.3 - (with-foreign-object (p :double) - (setf (mem-ref p :double) *double-min*) - (mem-ref p :double)) - #.*double-min*) - -;;; TODO: use something like *DOUBLE-MIN/MAX* above once we actually -;;; have an available lisp that supports long double. -;#-cffi-sys::no-long-float -#+(and scl long-double) -(progn - (deftest deref.long-double.1 - (with-foreign-object (p :long-double) - (setf (mem-ref p :long-double) 0.0l0) - (mem-ref p :long-double)) - 0.0l0) - - (deftest deref.long-double.2 - (with-foreign-object (p :long-double) - (setf (mem-ref p :long-double) most-positive-long-float) - (mem-ref p :long-double)) - #.most-positive-long-float) - - (deftest deref.long-double.3 - (with-foreign-object (p :long-double) - (setf (mem-ref p :long-double) least-positive-long-float) - (mem-ref p :long-double)) - #.least-positive-long-float)) - -;;; make sure the lisp doesn't convert NULL to NIL -(deftest deref.pointer.null - (with-foreign-object (p :pointer) - (setf (mem-ref p :pointer) (null-pointer)) - (null-pointer-p (mem-ref p :pointer))) - t) - -;;; regression test. lisp-string-to-foreign should handle empty strings -(deftest lisp-string-to-foreign.empty - (with-foreign-pointer (str 2) - (setf (mem-ref str :unsigned-char) 42) - (lisp-string-to-foreign "" str 1) - (mem-ref str :unsigned-char)) - 0) - -;;; regression test. with-foreign-pointer shouldn't evaluate -;;; the size argument twice. -(deftest with-foreign-pointer.evalx2 - (let ((count 0)) - (with-foreign-pointer (x (incf count) size-var) - (values count size-var))) - 1 1) - -(defconstant +two+ 2) - -;;; regression test. cffi-allegro's with-foreign-pointer wasn't -;;; handling constants properly. -(deftest with-foreign-pointer.constant-size - (with-foreign-pointer (p +two+ size) - size) - 2) - -(deftest mem-ref.left-to-right - (let ((i 0)) - (with-foreign-object (p :char 3) - (setf (mem-ref p :char 0) 66 (mem-ref p :char 1) 92) - (setf (mem-ref p :char (incf i)) (incf i)) - (values (mem-ref p :char 0) (mem-ref p :char 1) i))) - 66 2 2) - -;;; This needs to be in a real function for at least Allegro CL or the -;;; compiler macro on %MEM-REF is not expanded and the test doesn't -;;; actually test anything! -(defun %mem-ref-left-to-right () - (let ((result nil)) - (with-foreign-object (p :char) - (%mem-set 42 p :char) - (%mem-ref (progn (push 1 result) p) :char (progn (push 2 result) 0)) - (nreverse result)))) - -;;; Test left-to-right evaluation of the arguments to %MEM-REF when -;;; optimized by the compiler macro. -(deftest %mem-ref.left-to-right - (%mem-ref-left-to-right) - (1 2)) - -;;; This needs to be in a top-level function for at least Allegro CL -;;; or the compiler macro on %MEM-SET is not expanded and the test -;;; doesn't actually test anything! -(defun %mem-set-left-to-right () - (let ((result nil)) - (with-foreign-object (p :char) - (%mem-set (progn (push 1 result) 0) - (progn (push 2 result) p) - :char - (progn (push 3 result) 0)) - (nreverse result)))) - -;;; Test left-to-right evaluation of the arguments to %MEM-SET when -;;; optimized by the compiler macro. -(deftest %mem-set.left-to-right - (%mem-set-left-to-right) - (1 2 3)) - -;; regression test. mem-aref's setf expansion evaluated its type argument twice. -(deftest mem-aref.eval-type-x2 - (let ((count 0)) - (with-foreign-pointer (p 1) - (setf (mem-aref p (progn (incf count) :char) 0) 127)) - count) - 1) - -(deftest mem-aref.left-to-right - (let ((count -1)) - (with-foreign-pointer (p 2) - (values - (setf (mem-aref p (progn (incf count) :char) (incf count)) (incf count)) - (setq count -1) - (mem-aref (progn (incf count) p) :char (incf count)) - count))) - 2 -1 2 1) - -;; regression tests. nested mem-ref's and mem-aref's had bogus getters -(deftest mem-ref.nested - (with-foreign-object (p :pointer) - (with-foreign-object (i :int) - (setf (mem-ref p :pointer) i) - (setf (mem-ref i :int) 42) - (setf (mem-ref (mem-ref p :pointer) :int) 1984) - (mem-ref i :int))) - 1984) - -(deftest mem-aref.nested - (with-foreign-object (p :pointer) - (with-foreign-object (i :int 2) - (setf (mem-aref p :pointer 0) i) - (setf (mem-aref i :int 1) 42) - (setf (mem-aref (mem-ref p :pointer 0) :int 1) 1984) - (mem-aref i :int 1))) - 1984) - -(cffi:defcstruct mem-aref.bare-struct - (a :uint8)) - -;;; regression test: although mem-aref was dealing with bare struct -;;; types as though they were pointers, it wasn't calculating the -;;; proper offsets. The offsets for bare structs types should be -;;; calculated as aggregate types. -(deftest mem-aref.bare-struct - (with-foreign-object (a 'mem-aref.bare-struct 2) - (eql (- (pointer-address (cffi:mem-aref a 'mem-aref.bare-struct 1)) - (pointer-address (cffi:mem-aref a 'mem-aref.bare-struct 0))) - (foreign-type-size '(:struct mem-aref.bare-struct)))) - t) - -;;; regression tests. dereferencing an aggregate type. dereferencing a -;;; struct should return a pointer to the struct itself, not return the -;;; first 4 bytes (or whatever the size of :pointer is) as a pointer. -;;; -;;; This important for accessing an array of structs, which is -;;; what the deref.array-of-aggregates test does. -(defcstruct some-struct (x :int)) - -(deftest deref.aggregate - (with-foreign-object (s 'some-struct) - (pointer-eq s (mem-ref s 'some-struct))) - t) - -(deftest deref.array-of-aggregates - (with-foreign-object (arr 'some-struct 3) - (loop for i below 3 - do (setf (foreign-slot-value (mem-aref arr 'some-struct i) - 'some-struct 'x) - 112)) - (loop for i below 3 - collect (foreign-slot-value (mem-aref arr 'some-struct i) - 'some-struct 'x))) - (112 112 112)) - -;;; pointer operations -(deftest pointer.1 - (pointer-address (make-pointer 42)) - 42) - -;;; I suppose this test is not very good. --luis -(deftest pointer.2 - (pointer-address (null-pointer)) - 0) - -(deftest pointer.null - (nth-value 0 (ignore-errors (null-pointer-p nil))) - nil) - -(deftest foreign-pointer-type.nil - (typep nil 'foreign-pointer) - nil) - -;;; Ensure that a pointer to the highest possible address can be -;;; created using MAKE-POINTER. Regression test for CLISP/X86-64. -(deftest make-pointer.high - (let* ((pointer-length (foreign-type-size :pointer)) - (high-address (1- (expt 2 (* pointer-length 8)))) - (pointer (make-pointer high-address))) - (- high-address (pointer-address pointer))) - 0) - -;;; Ensure that incrementing a pointer by zero bytes returns an -;;; equivalent pointer. -(deftest inc-pointer.zero - (with-foreign-object (x :int) - (pointer-eq x (inc-pointer x 0))) - t) - -;;; Test the INITIAL-ELEMENT keyword argument to FOREIGN-ALLOC. -(deftest foreign-alloc.1 - (let ((ptr (foreign-alloc :int :initial-element 42))) - (unwind-protect - (mem-ref ptr :int) - (foreign-free ptr))) - 42) - -;;; Test the INITIAL-ELEMENT and COUNT arguments to FOREIGN-ALLOC. -(deftest foreign-alloc.2 - (let ((ptr (foreign-alloc :int :count 4 :initial-element 100))) - (unwind-protect - (loop for i from 0 below 4 - collect (mem-aref ptr :int i)) - (foreign-free ptr))) - (100 100 100 100)) - -;;; Test the INITIAL-CONTENTS and COUNT arguments to FOREIGN-ALLOC, -;;; passing a list of initial values. -(deftest foreign-alloc.3 - (let ((ptr (foreign-alloc :int :count 4 :initial-contents '(4 3 2 1)))) - (unwind-protect - (loop for i from 0 below 4 - collect (mem-aref ptr :int i)) - (foreign-free ptr))) - (4 3 2 1)) - -;;; Test INITIAL-CONTENTS and COUNT with FOREIGN-ALLOC passing a -;;; vector of initial values. -(deftest foreign-alloc.4 - (let ((ptr (foreign-alloc :int :count 4 :initial-contents #(10 20 30 40)))) - (unwind-protect - (loop for i from 0 below 4 - collect (mem-aref ptr :int i)) - (foreign-free ptr))) - (10 20 30 40)) - -;;; Ensure calling FOREIGN-ALLOC with both INITIAL-ELEMENT and -;;; INITIAL-CONTENTS signals an error. -(deftest foreign-alloc.5 - (values - (ignore-errors - (let ((ptr (foreign-alloc :int :initial-element 1 - :initial-contents '(1)))) - (foreign-free ptr)) - t)) - nil) - -;;; Regression test: FOREIGN-ALLOC shouldn't actually perform translation -;;; on initial-element/initial-contents since MEM-AREF will do that already. -(define-foreign-type not-an-int () - () - (:actual-type :int) - (:simple-parser not-an-int)) - -(defmethod translate-to-foreign (value (type not-an-int)) - (assert (not (integerp value))) - 0) - -(deftest foreign-alloc.6 - (let ((ptr (foreign-alloc 'not-an-int :initial-element 'foooo))) - (foreign-free ptr) - t) - t) - -;;; Ensure calling FOREIGN-ALLOC with NULL-TERMINATED-P and a non-pointer -;;; type signals an error. -(deftest foreign-alloc.7 - (values - (ignore-errors - (let ((ptr (foreign-alloc :int :null-terminated-p t))) - (foreign-free ptr)) - t)) - nil) - -;;; The opposite of the above test. -(defctype pointer-alias :pointer) - -(deftest foreign-alloc.8 - (progn - (foreign-free (foreign-alloc 'pointer-alias :count 0 :null-terminated-p t)) - t) - t) - -;;; Ensure calling FOREIGN-ALLOC with NULL-TERMINATED-P actually places -;;; a null pointer at the end. Not a very reliable test apparently. -(deftest foreign-alloc.9 - (let ((ptr (foreign-alloc :pointer :count 0 :null-terminated-p t))) - (unwind-protect - (null-pointer-p (mem-ref ptr :pointer)) - (foreign-free ptr))) - t) - -;;; RT: FOREIGN-ALLOC with :COUNT 0 on CLISP signalled an error. -(deftest foreign-alloc.10 - (null (foreign-free (foreign-alloc :char :count 0))) - t) - -;;; Tests for mem-ref with a non-constant type. This is a way to test -;;; the functional interface (without compiler macros). - -(deftest deref.nonconst.char - (let ((type :char)) - (with-foreign-object (p type) - (setf (mem-ref p type) -127) - (mem-ref p type))) - -127) - -(deftest deref.nonconst.unsigned-char - (let ((type :unsigned-char)) - (with-foreign-object (p type) - (setf (mem-ref p type) 255) - (mem-ref p type))) - 255) - -(deftest deref.nonconst.short - (let ((type :short)) - (with-foreign-object (p type) - (setf (mem-ref p type) -32767) - (mem-ref p type))) - -32767) - -(deftest deref.nonconst.unsigned-short - (let ((type :unsigned-short)) - (with-foreign-object (p type) - (setf (mem-ref p type) 65535) - (mem-ref p type))) - 65535) - -(deftest deref.nonconst.int - (let ((type :int)) - (with-foreign-object (p type) - (setf (mem-ref p type) -131072) - (mem-ref p type))) - -131072) - -(deftest deref.nonconst.unsigned-int - (let ((type :unsigned-int)) - (with-foreign-object (p type) - (setf (mem-ref p type) 262144) - (mem-ref p type))) - 262144) - -(deftest deref.nonconst.long - (let ((type :long)) - (with-foreign-object (p type) - (setf (mem-ref p type) -536870911) - (mem-ref p type))) - -536870911) - -(deftest deref.nonconst.unsigned-long - (let ((type :unsigned-long)) - (with-foreign-object (p type) - (setf (mem-ref p type) 536870912) - (mem-ref p type))) - 536870912) - -#+(and darwin openmcl) -(pushnew 'deref.nonconst.long-long rt::*expected-failures*) - -(deftest deref.nonconst.long-long - (let ((type :long-long)) - (with-foreign-object (p type) - (setf (mem-ref p type) -9223372036854775807) - (mem-ref p type))) - -9223372036854775807) - -(deftest deref.nonconst.unsigned-long-long - (let ((type :unsigned-long-long)) - (with-foreign-object (p type) - (setf (mem-ref p type) 18446744073709551615) - (mem-ref p type))) - 18446744073709551615) - -(deftest deref.nonconst.float.1 - (let ((type :float)) - (with-foreign-object (p type) - (setf (mem-ref p type) 0.0) - (mem-ref p type))) - 0.0) - -(deftest deref.nonconst.float.2 - (let ((type :float)) - (with-foreign-object (p type) - (setf (mem-ref p type) *float-max*) - (mem-ref p type))) - #.*float-max*) - -(deftest deref.nonconst.float.3 - (let ((type :float)) - (with-foreign-object (p type) - (setf (mem-ref p type) *float-min*) - (mem-ref p type))) - #.*float-min*) - -(deftest deref.nonconst.double.1 - (let ((type :double)) - (with-foreign-object (p type) - (setf (mem-ref p type) 0.0d0) - (mem-ref p type))) - 0.0d0) - -(deftest deref.nonconst.double.2 - (let ((type :double)) - (with-foreign-object (p type) - (setf (mem-ref p type) *double-max*) - (mem-ref p type))) - #.*double-max*) - -(deftest deref.nonconst.double.3 - (let ((type :double)) - (with-foreign-object (p type) - (setf (mem-ref p type) *double-min*) - (mem-ref p type))) - #.*double-min*) - -;;; regression tests: lispworks's %mem-ref and %mem-set compiler -;;; macros were misbehaving. - -(defun mem-ref-rt-1 () - (with-foreign-object (a :int 2) - (setf (mem-aref a :int 0) 123 - (mem-aref a :int 1) 456) - (values (mem-aref a :int 0) (mem-aref a :int 1)))) - -(deftest mem-ref.rt.1 - (mem-ref-rt-1) - 123 456) - -(defun mem-ref-rt-2 () - (with-foreign-object (a :double 2) - (setf (mem-aref a :double 0) 123.0d0 - (mem-aref a :double 1) 456.0d0) - (values (mem-aref a :double 0) (mem-aref a :double 1)))) - -(deftest mem-ref.rt.2 - (mem-ref-rt-2) - 123.0d0 456.0d0) - -(deftest incf-pointer.1 - (let ((ptr (null-pointer))) - (incf-pointer ptr) - (pointer-address ptr)) - 1) - -(deftest incf-pointer.2 - (let ((ptr (null-pointer))) - (incf-pointer ptr 42) - (pointer-address ptr)) - 42) - -(deftest pointerp.1 - (values - (pointerp (null-pointer)) - (null-pointer-p (null-pointer)) - (typep (null-pointer) 'foreign-pointer)) - t t t) - -(deftest pointerp.2 - (let ((p (make-pointer #xFEFF))) - (values - (pointerp p) - (typep p 'foreign-pointer))) - t t) - -(deftest pointerp.3 - (pointerp 'not-a-pointer) - nil) - -(deftest pointerp.4 - (pointerp 42) - nil) - -(deftest pointerp.5 - (pointerp 0) - nil) - -(deftest pointerp.6 - (pointerp nil) - nil) - -(deftest mem-ref.setf.1 - (with-foreign-object (p :char) - (setf (mem-ref p :char) 42)) - 42) - -(define-foreign-type int+1 () - () - (:actual-type :int) - (:simple-parser int+1)) - -(defmethod translate-to-foreign (value (type int+1)) - (1+ value)) - -(defmethod translate-from-foreign (value (type int+1)) - (1+ value)) - -(deftest mem-ref.setf.2 - (with-foreign-object (p 'int+1) - (values (setf (mem-ref p 'int+1) 42) - (mem-ref p 'int+1))) - 42 ; should this be 43? - 44) - -(deftest pointer-eq.non-pointers.1 - (expecting-error (pointer-eq 1 2)) - :error) - -(deftest pointer-eq.non-pointers.2 - (expecting-error (pointer-eq 'a 'b)) - :error) - -(deftest null-pointer-p.non-pointer.1 - (expecting-error (null-pointer-p 'not-a-pointer)) - :error) - -(deftest null-pointer-p.non-pointer.2 - (expecting-error (null-pointer-p 0)) - :error) - -(deftest null-pointer-p.non-pointer.3 - (expecting-error (null-pointer-p nil)) - :error) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/misc-types.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/misc-types.lisp deleted file mode 100644 index ab1231e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/misc-types.lisp +++ /dev/null @@ -1,296 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; misc-types.lisp --- Various tests on the type system. -;;; -;;; Copyright (C) 2005-2006, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi-tests) - -(defcfun ("my_strdup" strdup) :string+ptr (str :string)) - -(defcfun ("my_strfree" strfree) :void (str :pointer)) - -(deftest misc-types.string+ptr - (destructuring-bind (string pointer) - (strdup "foo") - (strfree pointer) - string) - "foo") - -#-(and) -(deftest misc-types.string+ptr.ub8 - (destructuring-bind (string pointer) - (strdup (make-array 3 :element-type '(unsigned-byte 8) - :initial-contents (map 'list #'char-code "foo"))) - (strfree pointer) - string) - "foo") - -#-(and) -(deftest misc-types.string.ub8.1 - (let ((array (make-array 7 :element-type '(unsigned-byte 8) - :initial-contents '(84 117 114 97 110 103 97)))) - (with-foreign-string (foreign-string array) - (foreign-string-to-lisp foreign-string))) - "Turanga") - -#-(and) -(deftest misc-types.string.ub8.2 - (let ((str (foreign-string-alloc - (make-array 7 :element-type '(unsigned-byte 8) - :initial-contents '(84 117 114 97 110 103 97))))) - (prog1 (foreign-string-to-lisp str) - (foreign-string-free str))) - "Turanga") - -(defcfun "equalequal" :boolean - (a (:boolean :int)) - (b (:boolean :unsigned-int))) - -(defcfun "bool_and" (:boolean :char) - (a (:boolean :unsigned-char)) - (b (:boolean :char))) - -(defcfun "bool_xor" (:boolean :unsigned-long) - (a (:boolean :long)) - (b (:boolean :unsigned-long))) - -(deftest misc-types.boolean.1 - (list (equalequal nil nil) - (equalequal t t) - (equalequal t 23) - (bool-and 'a 'b) - (bool-and "foo" nil) - (bool-xor t nil) - (bool-xor nil nil)) - (t t t t nil t nil)) - -(defcfun "sizeof_bool" :unsigned-int) - -(deftest misc-types.sizeof.bool - (eql (sizeof-bool) (foreign-type-size :bool)) - t) - -(defcfun "bool_to_unsigned" :unsigned-int - (b :bool)) - -(defcfun "unsigned_to_bool" :bool - (u :unsigned-int)) - -(deftest misc-types.bool.convert-to-foreign.mem - (loop for v in '(nil t) - collect - (with-foreign-object (b :bool) - (setf (mem-ref b :bool) v) - (mem-ref b #.(cffi::canonicalize-foreign-type :bool)))) - (0 1)) - -(deftest misc-types.bool.convert-to-foreign.call - (mapcar #'bool-to-unsigned '(nil t)) - (0 1)) - -(deftest misc-types.bool.convert-from-foreign.mem - (loop for v in '(0 1 42) - collect - (with-foreign-object (b :bool) - (setf (mem-ref b #.(cffi::canonicalize-foreign-type :bool)) v) - (mem-ref b :bool))) - (nil t t)) - -(deftest misc-types.bool.convert-from-foreign.call - (mapcar #'unsigned-to-bool '(0 1 42)) - (nil t t)) - -;;; Regression test: boolean type only worked with canonicalized -;;; built-in integer types. Should work for any type that canonicalizes -;;; to a built-in integer type. -(defctype int-for-bool :int) -(defcfun ("equalequal" equalequal2) :boolean - (a (:boolean int-for-bool)) - (b (:boolean :uint))) - -(deftest misc-types.boolean.2 - (equalequal2 nil t) - nil) - -(defctype my-string :string+ptr) - -(defun funkify (str) - (concatenate 'string "MORE " (string-upcase str))) - -(defun 3rd-person (value) - (list (concatenate 'string "Strdup says: " (first value)) - (second value))) - -;; (defctype funky-string -;; (:wrapper my-string -;; :to-c #'funkify -;; :from-c (lambda (value) -;; (list -;; (concatenate 'string "Strdup says: " -;; (first value)) -;; (second value)))) -;; "A useful type.") - -(defctype funky-string (:wrapper my-string :to-c funkify :from-c 3rd-person)) - -(defcfun ("my_strdup" funky-strdup) funky-string - (str funky-string)) - -(deftest misc-types.wrapper - (destructuring-bind (string ptr) - (funky-strdup "code") - (strfree ptr) - string) - "Strdup says: MORE CODE") - -(deftest misc-types.sized-ints - (mapcar #'foreign-type-size - '(:int8 :uint8 :int16 :uint16 :int32 :uint32 :int64 :uint64)) - (1 1 2 2 4 4 8 8)) - -(define-foreign-type error-error () - () - (:actual-type :int) - (:simple-parser error-error)) - -(defmethod translate-to-foreign (value (type error-error)) - (declare (ignore value)) - (error "translate-to-foreign invoked.")) - -(defmethod translate-from-foreign (value (type error-error)) - (declare (ignore value)) - (error "translate-from-foreign invoked.")) - -(eval-when (:load-toplevel :compile-toplevel :execute) - (defmethod expand-to-foreign (value (type error-error)) - value) - - (defmethod expand-from-foreign (value (type error-error)) - value)) - -(defcfun ("abs" expand-abs) error-error - (n error-error)) - -(defcvar ("var_int" *expand-var-int*) error-error) - -(defcfun ("expect_int_sum" expand-expect-int-sum) :boolean - (cb :pointer)) - -(defcallback expand-int-sum error-error ((x error-error) (y error-error)) - (+ x y)) - -;;; Ensure that macroexpansion-time translators are called where this -;;; is guaranteed (defcfun, defcvar, foreign-funcall and defcallback) -(deftest misc-types.expand.1 - (expand-abs -1) - 1) - -#-cffi-sys::no-foreign-funcall -(deftest misc-types.expand.2 - (foreign-funcall "abs" error-error -1 error-error) - 1) - -(deftest misc-types.expand.3 - (let ((old (mem-ref (get-var-pointer '*expand-var-int*) :int))) - (unwind-protect - (progn - (setf *expand-var-int* 42) - *expand-var-int*) - (setf (mem-ref (get-var-pointer '*expand-var-int*) :int) old))) - 42) - -(deftest misc-types.expand.4 - (expand-expect-int-sum (callback expand-int-sum)) - t) - -(define-foreign-type translate-tracker () - () - (:actual-type :int) - (:simple-parser translate-tracker)) - -(declaim (special .fto-called.)) - -(defmethod free-translated-object (value (type translate-tracker) param) - (declare (ignore value param)) - (setf .fto-called. t)) - -(define-foreign-type expand-tracker () - () - (:actual-type :int) - (:simple-parser expand-tracker)) - -(defmethod free-translated-object (value (type expand-tracker) param) - (declare (ignore value param)) - (setf .fto-called. t)) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defmethod expand-to-foreign (value (type expand-tracker)) - (declare (ignore value)) - (call-next-method))) - -(defcfun ("abs" ttracker-abs) :int - (n translate-tracker)) - -(defcfun ("abs" etracker-abs) :int - (n expand-tracker)) - -;; free-translated-object must be called when there is no etf -(deftest misc-types.expand.5 - (let ((.fto-called. nil)) - (ttracker-abs -1) - .fto-called.) - t) - -;; free-translated-object must be called when there is an etf, but -;; they answer *runtime-translator-form* -(deftest misc-types.expand.6 - (let ((.fto-called. nil)) - (etracker-abs -1) - .fto-called.) - t) - -(define-foreign-type misc-type.expand.7 () - () - (:actual-type :int) - (:simple-parser misc-type.expand.7)) - -(defmethod translate-to-foreign (value (type misc-type.expand.7)) - (values value 'second-value)) - -;; Auxiliary function to test CONVERT-TO-FOREIGN's compiler macro. -(defun misc-type.expand.7-aux () - (convert-to-foreign "foo" 'misc-type.expand.7)) - -;; Checking that expand-to-foreign doesn't ignore the second value of -;; translate-to-foreign. -(deftest misc-type.expand.7 - (misc-type.expand.7-aux) - "foo" second-value) - -;; Like MISC-TYPE.EXPAND.7 but doesn't depend on compiler macros -;; kicking in. -(deftest misc-type.expand.8 - (eval (expand-to-foreign "foo" (cffi::parse-type 'misc-type.expand.7))) - "foo" second-value) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/misc.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/misc.lisp deleted file mode 100644 index 5f5fdb6..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/misc.lisp +++ /dev/null @@ -1,132 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; misc.lisp --- Miscellaneous tests. -;;; -;;; Copyright (C) 2006, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi-tests) - -;;;# foreign-symbol-pointer tests - -;;; This might be useful for some libraries that compare function -;;; pointers. http://thread.gmane.org/gmane.lisp.cffi.devel/694 -(defcfun "compare_against_abs" :boolean (p :pointer)) - -(deftest foreign-symbol-pointer.1 - (compare-against-abs (foreign-symbol-pointer "abs")) - t) - -(defcfun "compare_against_xpto_fun" :boolean (p :pointer)) - -(deftest foreign-symbol-pointer.2 - (compare-against-xpto-fun (foreign-symbol-pointer "xpto_fun")) - t) - -;;;# Library tests -;;; -;;; Need to figure out a way to test this. CLISP, for instance, will -;;; automatically reopen the foreign-library when we call a foreign -;;; function so we can't test CLOSE-FOREIGN-LIBRARY this way. -;;; -;;; IIRC, GCC has some extensions to have code run when a library is -;;; loaded and stuff like that. That could work. - -#|| -#-(and ecl (not dffi)) -(deftest library.close.2 - (unwind-protect - (progn - (close-foreign-library 'libtest) - (ignore-errors (my-sqrtf 16.0))) - (load-test-libraries)) - nil) - -#-(or (and ecl (not dffi)) - cffi-sys::flat-namespace - cffi-sys::no-foreign-funcall) -(deftest library.close.2 - (unwind-protect - (values - (foreign-funcall ("ns_function" :library libtest) :boolean) - (close-foreign-library 'libtest) - (foreign-funcall "ns_function" :boolean) - (close-foreign-library 'libtest2) - (close-foreign-library 'libtest2) - (ignore-errors (foreign-funcall "ns_function" :boolean))) - (load-test-libraries)) - t t nil t nil nil) -||# - -(deftest library.error.1 - (handler-case (load-foreign-library "libdoesnotexistimsure") - (load-foreign-library-error () 'error)) - error) - -(define-foreign-library pseudo-library - (t pseudo-library-spec)) - -;;; RT: T clause was being handled as :T by FEATUREP. -;;; -;;; We might want to export (and clean up) the API used in this test -;;; when the need arises. -(deftest library.t-clause - (eq (cffi::foreign-library-spec - (cffi::get-foreign-library 'pseudo-library)) - 'pseudo-library-spec) - t) - -(define-foreign-library library-with-pathname - (t #p"libdoesnotexistimsure")) - -;;; RT: we were mishandling pathnames within libraries. (lp#1720626) -(deftest library.error.2 - (handler-case (load-foreign-library 'library-with-pathname) - (load-foreign-library-error () 'error)) - error) - -(deftest library.error.3 - (handler-case (load-foreign-library #p"libdoesnotexistimsure") - (load-foreign-library-error () 'error)) - error) - -;;;# Shareable Byte Vector Tests - -#+ecl -(mapc (lambda (x) (pushnew x rt::*expected-failures*)) - '(shareable-vector.1 shareable-vector.2)) - -(deftest shareable-vector.1 - (let ((vector (cffi-sys::make-shareable-byte-vector 5))) - (cffi::with-pointer-to-vector-data (pointer vector) - (strcpy pointer "xpto")) - vector) - #(120 112 116 111 0)) - -(deftest shareable-vector.2 - (block nil - (let ((vector (cffi-sys::make-shareable-byte-vector 5))) - (cffi::with-pointer-to-vector-data (pointer vector) - (strcpy pointer "xpto") - (return vector)))) - #(120 112 116 111 0)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/package.lisp deleted file mode 100644 index 00cb54c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/package.lisp +++ /dev/null @@ -1,33 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; package.lisp --- CFFI-TESTS package definition. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -(in-package #:cl-user) - -(defpackage #:cffi-tests - (:use #:cl #:cffi #:cffi-sys #:regression-test) - (:export #:do-tests #:run-cffi-tests #:run-all-cffi-tests) - (:shadow #:deftest)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/random-tester.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/random-tester.lisp deleted file mode 100644 index d720a08..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/random-tester.lisp +++ /dev/null @@ -1,246 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; random-tester.lisp --- Random test generator. -;;; -;;; Copyright (C) 2006, Luis Oliveira -;;; -;;; 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. -;;; - -;;; This code was used to generate the C and Lisp source code for -;;; the CALLBACKS.BFF.[12] and DEFCFUN.BFF.[12] tests. -;;; -;;; The original idea was to test all combinations of argument types -;;; but obviously as soon as you do the maths that it's not quite -;;; feasable for more that 4 or 5 arguments. -;;; -;;; TODO: actually run random tests, ie compile/load/run the tests -;;; this code can generate. - -(defpackage #:cffi-random-tester - (:use #:cl #:cffi #:alexandria #:regression-test)) -(in-package #:cffi-random-tester) - -(defstruct (c-type (:conc-name type-)) - keyword - name - abbrev - min - max) - -(defparameter +types+ - (mapcar (lambda (type) - (let ((keyword (first type)) - (name (second type))) - (multiple-value-bind (min max) - ;; assume we can represent an integer in the range - ;; [-2^16 2^16-1] in a float/double without causing - ;; rounding errors (probably a lame assumption) - (let ((type-size (if (or (eq keyword :float) - (eq keyword :double)) - 16 - (* 8 (foreign-type-size keyword))))) - (if (or (eql (char name 0) #\u) (eq keyword :pointer)) - (values 0 (1- (expt 2 type-size))) - (values (- (expt 2 (1- type-size))) - (1- (expt 2 (1- type-size)))))) - (make-c-type :keyword keyword :name name :abbrev (third type) - :min min :max max)))) - '((:char "char" "c") - (:unsigned-char "unsigned char" "uc") - (:short "short" "s") - (:unsigned-short "unsigned short" "us") - (:int "int" "i") - (:unsigned-int "unsigned int" "ui") - (:long "long" "l") - (:unsigned-long "unsigned long" "ul") - (:float "float" "f") - (:double "double" "d") - (:pointer "void*" "p") - (:long-long "long long" "ll") - (:unsigned-long-long "unsigned long long" "ull")))) - -(defun find-type (keyword) - (find keyword +types+ :key #'type-keyword)) - -(defun n-random-types (n) - (loop repeat n collect (nth (random (length +types+)) +types+))) - -;;; same as above, without the long long types -(defun n-random-types-no-ll (n) - (loop repeat n collect (nth (random (- (length +types+) 2)) +types+))) - -(defun random-range (x y) - (+ x (random (+ (- y x) 2)))) - -(defun random-sum (rettype arg-types) - "Returns a list of integers that fit in the respective types in the -ARG-TYPES list and whose sum fits in RETTYPE." - (loop with sum = 0 - for type in arg-types - for x = (random-range (max (- (type-min rettype) sum) (type-min type)) - (min (- (type-max rettype) sum) (type-max type))) - do (incf sum x) - collect x)) - -(defun combinations (n items) - (let ((combs '())) - (labels ((rec (n accum) - (if (= n 0) - (push accum combs) - (loop for item in items - do (rec (1- n) (cons item accum)))))) - (rec n '()) - combs))) - -(defun function-name (rettype arg-types) - (format nil "sum_~A_~{_~A~}" - (type-abbrev rettype) - (mapcar #'type-abbrev arg-types))) - -(defun c-function (rettype arg-types) - (let ((args (loop for type in arg-types and i from 1 - collect (list (type-name type) (format nil "a~A" i))))) - (format t "DLLEXPORT ~A ~A(~{~{~A ~A~}~^, ~})~%~ - { return ~A(~A) ~{~A~^ + ~}~A; }" - (type-name rettype) (function-name rettype arg-types) args - (if (eq (type-keyword rettype) :pointer) - "(void *)((unsigned int)(" - "") - (type-name rettype) - (loop for arg-pair in args collect - (format nil "~A~A~A" - (cond ((string= (first arg-pair) "void*") - "(unsigned int) ") - ((or (string= (first arg-pair) "double") - (string= (first arg-pair) "float")) - "((int) ") - (t "")) - (second arg-pair) - (if (member (first arg-pair) - '("void*" "double" "float") - :test #'string=) - ")" - ""))) - (if (eq (type-keyword rettype) :pointer) "))" "")))) - -(defun c-callback (rettype arg-types args) - (format t "DLLEXPORT ~A call_~A(~A (*func)(~{~A~^, ~}~^))~%~ - { return func(~{~A~^, ~}); }" - (type-name rettype) (function-name rettype arg-types) - (type-name rettype) (mapcar #'type-name arg-types) - (loop for type in arg-types and value in args collect - (format nil "~A~A" - (if (eq (type-keyword type) :pointer) - "(void *) " - "") - value)))) - -;;; (output-c-code #p"generated.c" 3 5) -(defun output-c-code (file min max) - (with-open-file (stream file :direction :output :if-exists :error) - (let ((*standard-output* stream)) - (format t "/* automatically generated functions and callbacks */~%~%") - (loop for n from min upto max do - (format t "/* ~A args */" (1- n)) - (loop for comb in (combinations n +types+) do - (terpri) (c-function (car comb) (cdr comb)) - (terpri) (c-callback (car comb) (cdr comb))))))) - -(defmacro with-conversion (type form) - (case type - (:double `(float ,form 1.0d0)) - (:float `(float ,form)) - (:pointer `(make-pointer ,form)) - (t form))) - -(defun integer-conversion (type form) - (case type - ((:double :float) `(values (floor ,form))) - (:pointer `(pointer-address ,form)) - (t form))) - -(defun gen-arg-values (rettype arg-types) - (let ((numbers (random-sum rettype arg-types))) - (values - (reduce #'+ numbers) - (loop for type in arg-types and n in numbers - collect (case (type-keyword type) - (:double (float n 1.0d0)) - (:float (float n)) - (:pointer `(make-pointer ,n)) - (t n)))))) - -(defun gen-function-test (rettype arg-types) - (let* ((fun-name (function-name rettype arg-types)) - (fun-sym (cffi::lisp-function-name fun-name))) - (multiple-value-bind (sum value-forms) - (gen-arg-values rettype arg-types) - `(progn - (defcfun (,fun-name ,fun-sym) ,(type-keyword rettype) - ,@(loop for type in arg-types and i from 1 collect - (list (symbolicate '#:a (format nil "~A" i)) - (type-keyword type)))) - (deftest ,(symbolicate '#:defcfun. fun-sym) - ,(integer-conversion (type-keyword rettype) - `(,fun-sym ,@value-forms)) - ,sum))))) - -(defun gen-callback-test (rettype arg-types sum) - (let* ((fname (function-name rettype arg-types)) - (cb-sym (cffi::lisp-function-name fname)) - (fun-name (concatenate 'string "call_" fname)) - (fun-sym (cffi::lisp-function-name fun-name)) - (arg-names (loop for i from 1 upto (length arg-types) collect - (symbolicate '#:a (format nil "~A" i))))) - `(progn - (defcfun (,fun-name ,fun-sym) ,(type-keyword rettype) (cb :pointer)) - (defcallback ,cb-sym ,(type-keyword rettype) - ,(loop for type in arg-types and name in arg-names - collect (list name (type-keyword type))) - ,(integer-conversion - (type-keyword rettype) - `(+ ,@(mapcar (lambda (tp n) - (integer-conversion (type-keyword tp) n)) - arg-types arg-names)))) - (deftest ,(symbolicate '#:callbacks. cb-sym) - ,(integer-conversion (type-keyword rettype) - `(,fun-sym (callback ,cb-sym))) - ,sum)))) - -(defun cb-test (&key no-long-long) - (let* ((rettype (find-type (if no-long-long :long :long-long))) - (arg-types (if no-long-long - (n-random-types-no-ll 127) - (n-random-types 127))) - (args (random-sum rettype arg-types)) - (sum (reduce #'+ args))) - (c-callback rettype arg-types args) - (gen-callback-test rettype arg-types sum))) - -;; (defmacro define-function-and-callback-tests (min max) -;; `(progn -;; ,@(loop for n from min upto max appending -;; (loop for comb in (combinations n +types+) -;; collect (gen-function-test (car comb) (cdr comb)) -;; collect (gen-callback-test (car comb) (cdr comb)))))) - -;; (define-function-and-callback-tests 3 5) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/run-tests.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/run-tests.lisp deleted file mode 100644 index 109b7fe..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/run-tests.lisp +++ /dev/null @@ -1,44 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; run-tests.lisp --- Simple script to run the unit tests. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -(in-package #:cl-user) - -(setf *load-verbose* nil *compile-verbose* nil *compile-print* nil) -#+cmucl (setf ext:*gc-verbose* nil) - -(require "asdf") - -(format t "~&;;; -------- Running tests in ~A --------~%" - (uiop:implementation-identifier)) - -(asdf:load-system "cffi-tests" :verbose nil) -(asdf:test-system "cffi-tests") - -(terpri) -(force-output) - -(uiop:quit) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/strings.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/strings.lisp deleted file mode 100644 index 1877754..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/strings.lisp +++ /dev/null @@ -1,150 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; strings.lisp --- Tests for foreign string conversion. -;;; -;;; Copyright (C) 2005, James Bielman -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi-tests) - -;;;# Foreign String Conversion Tests -;;; -;;; With the implementation of encoding support, there are a lot of -;;; things that can go wrong with foreign string conversions. This is -;;; a start at defining tests for strings and encoding conversion, but -;;; there needs to be a lot more. - -(babel:enable-sharp-backslash-syntax) - -;;; *ASCII-TEST-STRING* contains the characters in the ASCII character -;;; set that we will convert to a foreign string and check against -;;; *ASCII-TEST-BYTES*. We don't bother with control characters. -;;; -;;; FIXME: It would probably be good to move these tables into files -;;; in "tests/", especially if we ever want to get fancier and have -;;; tests for more encodings. -(eval-when (:compile-toplevel :load-toplevel :execute) - (defparameter *ascii-test-string* - (concatenate 'string " !\"#$%&'()*+,-./0123456789:;" - "<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]" - "^_`abcdefghijklmnopqrstuvwxyz{|}~"))) - -;;; *ASCII-TEST-BYTES* contains the expected ASCII encoded values -;;; for each character in *ASCII-TEST-STRING*. -(eval-when (:compile-toplevel :load-toplevel :execute) - (defparameter *ascii-test-bytes* - (let ((vector (make-array 95 :element-type '(unsigned-byte 8)))) - (loop for i from 0 - for code from 32 below 127 - do (setf (aref vector i) code) - finally (return vector))))) - -;;; Test basic consistency converting a string to and from Lisp using -;;; the default encoding. -(deftest string.conversion.basic - (with-foreign-string (s *ascii-test-string*) - (foreign-string-to-lisp s)) - #.*ascii-test-string* 95) - -(deftest string.conversion.basic.2 - (with-foreign-string ((ptr size) "123" :null-terminated-p nil) - (values (foreign-string-to-lisp ptr :count 3) size)) - "123" 3) - -;;; Ensure that conversion of *ASCII-TEST-STRING* to a foreign buffer -;;; and back preserves ASCII encoding. -(deftest string.encoding.ascii - (with-foreign-string (s *ascii-test-string* :encoding :ascii) - (let ((vector (make-array 95 :element-type '(unsigned-byte 8)))) - (loop for i from 0 below (length vector) - do (setf (aref vector i) (mem-ref s :unsigned-char i))) - vector)) - #.*ascii-test-bytes*) - -;;; FIXME: bogus test. We need support for BOM or UTF-16{BE,LE}. -(pushnew 'string.encoding.utf-16.basic rtest::*expected-failures*) - -;;; Test UTF-16 conversion of a string back and forth. Tests proper -;;; null terminator handling for wide character strings and ensures no -;;; byte order marks are added. (Why no BOM? --luis) -;;; -;;; FIXME: an identical test using :UTF-16 wouldn't work because on -;;; little-endian architectures, :UTF-16 defaults to little-endian -;;; when writing and big-endian on reading because the BOM is -;;; suppressed. -#-babel::8-bit-chars -(progn - (deftest string.encoding.utf-16le.basic - (with-foreign-string (s *ascii-test-string* :encoding :utf-16le) - (foreign-string-to-lisp s :encoding :utf-16le)) - #.*ascii-test-string* 190) - - (deftest string.encoding.utf-16be.basic - (with-foreign-string (s *ascii-test-string* :encoding :utf-16be) - (foreign-string-to-lisp s :encoding :utf-16be)) - #.*ascii-test-string* 190)) - -;;; Ensure that writing a long string into a short buffer does not -;;; attempt to write beyond the edge of the buffer, and that the -;;; resulting string is still null terminated. -(deftest string.short-write.1 - (with-foreign-pointer (buf 6) - (setf (mem-ref buf :unsigned-char 5) 70) - (lisp-string-to-foreign "ABCDE" buf 5 :encoding :ascii) - (values (mem-ref buf :unsigned-char 4) - (mem-ref buf :unsigned-char 5))) - 0 70) - -#-babel::8-bit-chars -(deftest string.encoding.utf-8.basic - (with-foreign-pointer (buf 7 size) - (let ((string (concatenate 'babel:unicode-string - '(#\u03bb #\u00e3 #\u03bb)))) - (lisp-string-to-foreign string buf size :encoding :utf-8) - (loop for i from 0 below size - collect (mem-ref buf :unsigned-char i)))) - (206 187 195 163 206 187 0)) - -(defparameter *basic-latin-alphabet* "abcdefghijklmnopqrstuvwxyz") - -(deftest string.encodings.all.basic - (let (failed) - ;;; FIXME: UTF-{32,16} and friends fail due to lack of BOM. See - ;;; STRING.ENCODING.UTF-16.BASIC for more details. - (dolist (encoding (remove-if (lambda (x) - (member x '(:utf-32 :utf-16 :ucs-2))) - (babel:list-character-encodings))) - ;; (format t "Testing ~S~%" encoding) - (with-foreign-string (ptr *basic-latin-alphabet* :encoding encoding) - (let ((string (foreign-string-to-lisp ptr :encoding encoding))) - ;; (format t " got ~S~%" string) - (unless (string= *basic-latin-alphabet* string) - (push encoding failed))))) - failed) - nil) - -;;; rt: make sure *default-foreign-enconding* binds to a keyword -(deftest string.encodings.default - (keywordp *default-foreign-encoding*) - t) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/struct.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/struct.lisp deleted file mode 100644 index 38be042..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/struct.lisp +++ /dev/null @@ -1,705 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; struct.lisp --- Foreign structure type tests. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; Copyright (C) 2005-2011, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi-tests) - -(defcstruct timeval - (tv-secs :long) - (tv-usecs :long)) - -(defparameter *timeval-size* (* 2 (max (foreign-type-size :long) - (foreign-type-alignment :long)))) - -;;;# Basic Structure Tests - -(deftest struct.1 - (- (foreign-type-size 'timeval) *timeval-size*) - 0) - -(deftest struct.2 - (with-foreign-object (tv 'timeval) - (setf (foreign-slot-value tv 'timeval 'tv-secs) 0) - (setf (foreign-slot-value tv 'timeval 'tv-usecs) 1) - (values (foreign-slot-value tv 'timeval 'tv-secs) - (foreign-slot-value tv 'timeval 'tv-usecs))) - 0 1) - -(deftest struct.3 - (with-foreign-object (tv 'timeval) - (with-foreign-slots ((tv-secs tv-usecs) tv timeval) - (setf tv-secs 100 tv-usecs 200) - (values tv-secs tv-usecs))) - 100 200) - -;; regression test: accessing a struct through a typedef - -(defctype xpto (:struct timeval)) - -(deftest struct.4 - (with-foreign-object (tv 'xpto) - (setf (foreign-slot-value tv 'xpto 'tv-usecs) 1) - (values (foreign-slot-value tv 'xpto 'tv-usecs) - (foreign-slot-value tv 'timeval 'tv-usecs))) - 1 1) - -(deftest struct.names - (sort (foreign-slot-names 'xpto) #'< - :key (lambda (x) (foreign-slot-offset 'xpto x))) - (tv-secs tv-usecs)) - -;; regression test: compiler macro not quoting the type in the -;; resulting mem-ref form. The compiler macro on foreign-slot-value -;; is not guaranteed to be expanded though. - -(defctype my-int :int) -(defcstruct s5 (a my-int)) - -(deftest struct.5 - (with-foreign-object (s 's5) - (setf (foreign-slot-value s 's5 'a) 42) - (foreign-slot-value s 's5 'a)) - 42) - -;;;# Structs with type translators - -(defcstruct struct-string - (s :string)) - -(deftest struct.string.1 - (with-foreign-object (ptr 'struct-string) - (with-foreign-slots ((s) ptr struct-string) - (setf s "So long and thanks for all the fish!") - s)) - "So long and thanks for all the fish!") - -(deftest struct.string.2 - (with-foreign-object (ptr 'struct-string) - (setf (foreign-slot-value ptr 'struct-string 's) "Cha") - (foreign-slot-value ptr 'struct-string 's)) - "Cha") - -;;;# Structure Alignment Tests -;;; -;;; See libtest.c and types.lisp for some comments about alignments. - -(defcstruct s-ch - (a-char :char)) - -(defctype s-ch (:struct s-ch)) - -(defcstruct s-s-ch - (another-char :char) - (a-s-ch s-ch)) - -(defctype s-s-ch (:struct s-s-ch)) - -(defcvar "the_s_s_ch" s-s-ch) - -(deftest struct.alignment.1 - (list 'a-char (foreign-slot-value - (foreign-slot-pointer *the-s-s-ch* 's-s-ch 'a-s-ch) - 's-ch 'a-char) - 'another-char (foreign-slot-value *the-s-s-ch* 's-s-ch 'another-char)) - (a-char 1 another-char 2)) - - -(defcstruct s-short - (a-char :char) - (another-char :char) - (a-short :short)) - -(defctype s-short (:struct s-short)) - -(defcstruct s-s-short - (yet-another-char :char) - (a-s-short s-short)) - -(defctype s-s-short (:struct s-s-short)) - -(defcvar "the_s_s_short" s-s-short) - -(deftest struct.alignment.2 - (with-foreign-slots ((yet-another-char a-s-short) *the-s-s-short* s-s-short) - (with-foreign-slots ((a-char another-char a-short) a-s-short s-short) - (list 'a-char a-char - 'another-char another-char - 'a-short a-short - 'yet-another-char yet-another-char))) - (a-char 1 another-char 2 a-short 3 yet-another-char 4)) - - -(defcstruct s-double - (a-char :char) - (a-double :double) - (another-char :char)) - -(defctype s-double (:struct s-double)) - -(defcstruct s-s-double - (yet-another-char :char) - (a-s-double s-double) - (a-short :short)) - -(defctype s-s-double (:struct s-s-double)) - -(defcvar "the_s_s_double" s-s-double) - -(deftest struct.alignment.3 - (with-foreign-slots - ((yet-another-char a-s-double a-short) *the-s-s-double* s-s-double) - (with-foreign-slots ((a-char a-double another-char) a-s-double s-double) - (list 'a-char a-char - 'a-double a-double - 'another-char another-char - 'yet-another-char yet-another-char - 'a-short a-short))) - (a-char 1 a-double 2.0d0 another-char 3 yet-another-char 4 a-short 5)) - - -(defcstruct s-s-s-double - (another-short :short) - (a-s-s-double s-s-double) - (last-char :char)) - -(defctype s-s-s-double (:struct s-s-s-double)) - -(defcvar "the_s_s_s_double" s-s-s-double) - -(deftest struct.alignment.4 - (with-foreign-slots - ((another-short a-s-s-double last-char) *the-s-s-s-double* s-s-s-double) - (with-foreign-slots - ((yet-another-char a-s-double a-short) a-s-s-double s-s-double) - (with-foreign-slots ((a-char a-double another-char) a-s-double s-double) - (list 'a-char a-char - 'a-double a-double - 'another-char another-char - 'yet-another-char yet-another-char - 'a-short a-short - 'another-short another-short - 'last-char last-char)))) - (a-char 1 a-double 2.0d0 another-char 3 yet-another-char 4 a-short 5 - another-short 6 last-char 7)) - - -(defcstruct s-double2 - (a-double :double) - (a-short :short)) - -(defctype s-double2 (:struct s-double2)) - -(defcstruct s-s-double2 - (a-char :char) - (a-s-double2 s-double2) - (another-short :short)) - -(defctype s-s-double2 (:struct s-s-double2)) - -(defcvar "the_s_s_double2" s-s-double2) - -(deftest struct.alignment.5 - (with-foreign-slots - ((a-char a-s-double2 another-short) *the-s-s-double2* s-s-double2) - (with-foreign-slots ((a-double a-short) a-s-double2 s-double2) - (list 'a-double a-double - 'a-short a-short - 'a-char a-char - 'another-short another-short))) - (a-double 1.0d0 a-short 2 a-char 3 another-short 4)) - -(defcstruct s-long-long - (a-long-long :long-long) - (a-short :short)) - -(defctype s-long-long (:struct s-long-long)) - -(defcstruct s-s-long-long - (a-char :char) - (a-s-long-long s-long-long) - (another-short :short)) - -(defctype s-s-long-long (:struct s-s-long-long)) - -(defcvar "the_s_s_long_long" s-s-long-long) - -(deftest struct.alignment.6 - (with-foreign-slots - ((a-char a-s-long-long another-short) *the-s-s-long-long* s-s-long-long) - (with-foreign-slots ((a-long-long a-short) a-s-long-long s-long-long) - (list 'a-long-long a-long-long - 'a-short a-short - 'a-char a-char - 'another-short another-short))) - (a-long-long 1 a-short 2 a-char 3 another-short 4)) - -(defcstruct s-s-double3 - (a-s-double2 s-double2) - (another-short :short)) - -(defctype s-s-double3 (:struct s-s-double3)) - -(defcstruct s-s-s-double3 - (a-s-s-double3 s-s-double3) - (a-char :char)) - -(defctype s-s-s-double3 (:struct s-s-s-double3)) - -(defcvar "the_s_s_s_double3" s-s-s-double3) - -(deftest struct.alignment.7 - (with-foreign-slots ((a-s-s-double3 a-char) *the-s-s-s-double3* s-s-s-double3) - (with-foreign-slots ((a-s-double2 another-short) a-s-s-double3 s-s-double3) - (with-foreign-slots ((a-double a-short) a-s-double2 s-double2) - (list 'a-double a-double - 'a-short a-short - 'another-short another-short - 'a-char a-char)))) - (a-double 1.0d0 a-short 2 another-short 3 a-char 4)) - - -(defcstruct empty-struct) - -(defctype empty-struct (:struct empty-struct)) - -(defcstruct with-empty-struct - (foo empty-struct) - (an-int :int)) - -;; commented out this test because an empty struct is not valid/standard C -;; left the struct declarations anyway because they should be handled -;; gracefuly anyway. - -; (defcvar "the_with_empty_struct" with-empty-struct) -; -; (deftest struct.alignment.5 -; (with-foreign-slots ((foo an-int) *the-with-empty-struct* with-empty-struct) -; an-int) -; 42) - - -;; regression test, setf-ing nested foreign-slot-value forms -;; the setf expander used to return a bogus getter - -(defcstruct s1 - (an-int :int)) - -(defctype s1 (:struct s1)) - -(defcstruct s2 - (an-s1 s1)) - -(defctype s2 (:struct s2)) - -(deftest struct.nested-setf - (with-foreign-object (an-s2 's2) - (setf (foreign-slot-value (foreign-slot-value an-s2 's2 'an-s1) - 's1 'an-int) - 1984) - (foreign-slot-value (foreign-slot-value an-s2 's2 'an-s1) - 's1 'an-int)) - 1984) - -;; regression test, some Lisps were returning 4 instead of 8 for -;; (foreign-type-alignment :unsigned-long-long) on darwin/ppc32 - -(defcstruct s-unsigned-long-long - (an-unsigned-long-long :unsigned-long-long) - (a-short :short)) - -(defctype s-unsigned-long-long (:struct s-unsigned-long-long)) - -(defcstruct s-s-unsigned-long-long - (a-char :char) - (a-s-unsigned-long-long s-unsigned-long-long) - (another-short :short)) - -(defctype s-s-unsigned-long-long (:struct s-s-unsigned-long-long)) - -(defcvar "the_s_s_unsigned_long_long" s-s-unsigned-long-long) - -(deftest struct.alignment.8 - (with-foreign-slots - ((a-char a-s-unsigned-long-long another-short) - *the-s-s-unsigned-long-long* s-s-unsigned-long-long) - (with-foreign-slots ((an-unsigned-long-long a-short) - a-s-unsigned-long-long s-unsigned-long-long) - (list 'an-unsigned-long-long an-unsigned-long-long - 'a-short a-short - 'a-char a-char - 'another-short another-short))) - (an-unsigned-long-long 1 a-short 2 a-char 3 another-short 4)) - -;;;# C Struct Wrappers - -(define-c-struct-wrapper timeval ()) - -(define-c-struct-wrapper (timeval2 (:struct timeval)) () - (tv-secs)) - -(defmacro with-example-timeval (var &body body) - `(with-foreign-object (,var 'timeval) - (with-foreign-slots ((tv-secs tv-usecs) ,var timeval) - (setf tv-secs 42 tv-usecs 1984) - ,@body))) - -(deftest struct-wrapper.1 - (with-example-timeval ptr - (let ((obj (make-instance 'timeval :pointer ptr))) - (values (timeval-tv-secs obj) - (timeval-tv-usecs obj)))) - 42 1984) - -(deftest struct-wrapper.2 - (with-example-timeval ptr - (let ((obj (make-instance 'timeval2 :pointer ptr))) - (timeval2-tv-secs obj))) - 42) - -;;;# Structures as Values - -(defcstruct (struct-pair :class pair) - (a :int) - (b :int)) - -(defctype struct-pair-typedef1 (:struct struct-pair)) -(defctype struct-pair-typedef2 (:pointer (:struct struct-pair))) - -(deftest struct.unparse.1 - (mapcar (alexandria:compose #'cffi::unparse-type #'cffi::parse-type) - '(struct-pair - (:struct struct-pair) - struct-pair-typedef1 - struct-pair-typedef2)) - (struct-pair - (:struct struct-pair) - struct-pair-typedef1 - struct-pair-typedef2)) - -(deftest struct.canonicalize.1 - (mapcar #'cffi::canonicalize-foreign-type - '(struct-pair - (:struct struct-pair) - struct-pair-typedef1 - struct-pair-typedef2)) - (:pointer - (:struct struct-pair) - (:struct struct-pair) - :pointer)) - -(deftest struct.canonicalize.2 - (mapcar #'cffi::canonicalize-foreign-type - '(struct-pair - (:struct struct-pair) - struct-pair-typedef1 - struct-pair-typedef2)) - (:pointer - (:struct struct-pair) - (:struct struct-pair) - :pointer)) - -(defmethod translate-from-foreign (pointer (type pair)) - (with-foreign-slots ((a b) pointer (:struct struct-pair)) - (cons a b))) - -(defmethod translate-into-foreign-memory (object (type pair) pointer) - (with-foreign-slots ((a b) pointer (:struct struct-pair)) - (setf a (car object) - b (cdr object)))) - -(defmethod translate-to-foreign (object (type pair)) - (let ((p (foreign-alloc '(:struct struct-pair)))) - (translate-into-foreign-memory object type p) - (values p t))) - -(defmethod free-translated-object (pointer (type pair) freep) - (when freep - (foreign-free pointer))) - -(deftest struct-values.translation.1 - (multiple-value-bind (p freep) - (convert-to-foreign '(1 . 2) 'struct-pair) - (assert freep) - (unwind-protect - (convert-from-foreign p 'struct-pair) - (free-converted-object p 'struct-pair freep))) - (1 . 2)) - -(defcfun "pair_pointer_sum" :int - (p (:pointer (:struct struct-pair)))) - -#+#:pointer-translation-not-yet-implemented -(deftest struct-values.translation.2 - (pair-pointer-sum '(1 . 2)) - 3) - -;;; should the return type be something along the lines of -;;; (:pointer (:struct pair) :free t)? -;;; LMH: error on ":free t" option? -(defcfun "alloc_pair" (:pointer (:struct struct-pair)) - (a :int) - (b :int)) - -;; bogus: doesn't free() pointer. -#+#:pointer-translation-not-yet-implemented -(deftest struct-values.translation.3 - (alloc-pair 1 2) - (1 . 2)) - -(deftest struct-values.translation.mem-ref.1 - (with-foreign-object (p '(:struct struct-pair)) - (setf (mem-ref p '(:struct struct-pair)) '(1 . 2)) - (with-foreign-slots ((a b) p (:struct struct-pair)) - (values (mem-ref p '(:struct struct-pair)) - a - b))) - (1 . 2) - 1 - 2) - -(deftest struct-values.translation.mem-aref.1 - (with-foreign-object (p '(:struct struct-pair) 2) - (setf (mem-aref p '(:struct struct-pair) 0) '(1 . 2) - (mem-aref p '(:struct struct-pair) 1) '(3 . 4)) - (values (mem-aref p '(:struct struct-pair) 0) - (mem-aref p '(:struct struct-pair) 1))) - (1 . 2) - (3 . 4)) - -(defcstruct (struct-pair-default-translate :class pair-default) - (a :int) - (b :int)) - -(deftest struct-values-default.translation.mem-ref.1 - (with-foreign-object (p '(:struct struct-pair-default-translate)) - (setf (mem-ref p '(:struct struct-pair-default-translate)) '(a 1 b 2)) - (with-foreign-slots ((a b) p (:struct struct-pair-default-translate)) - (let ((plist (mem-ref p '(:struct struct-pair-default-translate)))) - (values (getf plist 'a) - (getf plist 'b) - a - b)))) - 1 - 2 - 1 - 2) - -(defcstruct (struct-pair+double :class pair+double) - (pr (:struct struct-pair-default-translate)) - (dbl :double)) - -(deftest struct-values-default.translation.mem-ref.2 - (with-foreign-object (p '(:struct struct-pair+double)) - (setf (mem-ref p '(:struct struct-pair+double)) '(pr (a 4 b 5) dbl 2.5d0)) - (with-foreign-slots ((pr dbl) p (:struct struct-pair+double)) - (let ((plist (mem-ref p '(:struct struct-pair+double)))) - (values (getf (getf plist 'pr) 'a) - (getf (getf plist 'pr) 'b) - (getf plist 'dbl))))) - 4 - 5 - 2.5d0) - -(defcstruct (struct-pair+1 :class pair+1) - (p (:pointer (:struct struct-pair))) - (c :int)) - -(defctype struct-pair+1 (:struct struct-pair+1)) - -(defmethod translate-from-foreign (pointer (type pair+1)) - (with-foreign-slots ((p c) pointer struct-pair+1) - (cons p c))) - -(defmethod translate-into-foreign-memory (object (type pair+1) pointer) - (with-foreign-slots ((c) pointer struct-pair+1) - (convert-into-foreign-memory (car object) - 'struct-pair - (foreign-slot-pointer pointer - 'struct-pair+1 - 'p)) - (setf c (cdr object)))) - -(defmethod translate-to-foreign (object (type pair+1)) - (let ((p (foreign-alloc 'struct-pair+1))) - (translate-into-foreign-memory object type p) - (values p t))) - -(defmethod free-translated-object (pointer (type pair+1) freep) - (when freep - (foreign-free pointer))) - -#+#:pointer-translation-not-yet-implemented -(deftest struct-values.translation.ppo.1 - (multiple-value-bind (p freep) - (convert-to-foreign '((1 . 2) . 3) 'struct-pair+1) - (assert freep) - (unwind-protect - (convert-from-foreign p 'struct-pair+1) - (free-converted-object p 'struct-pair+1 freep))) - ((1 . 2) . 3)) - -#+#:unimplemented -(defcfun "pair_plus_one_sum" :int - (p (:struct pair+1))) - -(defcfun "pair_plus_one_pointer_sum" :int - (p (:pointer (:struct struct-pair+1)))) - -#+#:pointer-translation-not-yet-implemented -(deftest struct-values.translation.ppo.2 - (pair-plus-one-pointer-sum '((1 . 2) . 3)) - 6) - -#+#:unimplemented -(defcfun "make_pair_plus_one" (:struct pair+1) - (a :int) - (b :int) - (c :int)) - -(defcfun "alloc_pair_plus_one" struct-pair+1 - (a :int) - (b :int) - (c :int)) - -;; bogus: doesn't free() pointer. -#+#:pointer-translation-not-yet-implemented -(deftest struct-values.translation.ppo.3 - (alloc-pair-plus-one 1 2 3) - ((1 . 2) . 3)) - -#+#:unimplemented -(defcfun "pair_sum" :int - (p (:struct pair))) - -#+#:unimplemented -(defcfun "make_pair" (:struct pair) - (a :int) - (b :int)) - -#|| ; TODO: load cffi-libffi for these tests to work. -(deftest struct-values.fn.1 - (with-foreign-object (p '(:struct pair)) - (with-foreign-slots ((a b) p (:struct pair)) - (setf a -1 b 2) - (pair-sum p))) - 1) - -(deftest struct-values.fn.2 - (pair-sum '(3 . 5)) - 8) - -(deftest struct-values.fn.3 - (with-foreign-object (p '(:struct pair)) - (make-pair 7 11 :result-pointer p) - (with-foreign-slots ((a b) p (:struct pair)) - (cons a b))) - (7 . 11)) - -(deftest struct-values.fn.4 - (make-pair 13 17) - (13 . 17)) -||# - -(defcstruct single-byte-struct - (a :uint8)) - -(deftest bare-struct-types.1 - (eql (foreign-type-size 'single-byte-struct) - (foreign-type-size '(:struct single-byte-struct))) - t) - -(defctype single-byte-struct-alias (:struct single-byte-struct)) - -(deftest bare-struct-types.2 - (eql (foreign-type-size 'single-byte-struct-alias) - (foreign-type-size '(:struct single-byte-struct))) - t) - -;;; Old-style access to inner structure fields. - -(defcstruct inner-struct (x :int)) -(defcstruct old-style-outer (inner inner-struct)) -(defcstruct new-style-outer (inner (:struct inner-struct))) - -(deftest old-style-struct-access - (with-foreign-object (s '(:struct old-style-outer)) - (let ((inner-ptr (foreign-slot-pointer s 'old-style-outer 'inner))) - (setf (foreign-slot-value inner-ptr 'inner-struct 'x) 42)) - (assert (pointerp (foreign-slot-value s 'old-style-outer 'inner))) - (foreign-slot-value (foreign-slot-value s 'old-style-outer 'inner) - 'inner-struct 'x)) - 42) - -(deftest new-style-struct-access - (with-foreign-object (s '(:struct new-style-outer)) - (let ((inner-ptr (foreign-slot-pointer s 'new-style-outer 'inner))) - (setf (foreign-slot-value inner-ptr 'inner-struct 'x) 42)) - (foreign-slot-value s 'new-style-outer 'inner)) - (x 42)) - -;;; regression test: setting the value of aggregate slots. - -(defcstruct aggregate-struct - (x :int) - (pair (:struct struct-pair)) - (y :int)) - -(deftest set-aggregate-struct-slot - (with-foreign-objects ((pair-struct '(:struct struct-pair)) - (aggregate-struct '(:struct aggregate-struct))) - (with-foreign-slots ((a b) pair-struct (:struct struct-pair)) - (setf a 1 b 2) - (with-foreign-slots ((x pair y) aggregate-struct (:struct aggregate-struct)) - (setf x 42 y 42) - (setf pair pair-struct) - (values x pair y)))) - 42 - (1 . 2) - 42) - -;; TODO this needs to go through compile-file to exhibit the error -;; ("don't know how to dump #"), but -;; there's no support for that, so let's leave it at toplevel here. -(defcstruct (aggregate-struct.acc :conc-name acc-) - (x :int) - (pair (:struct struct-pair)) - (y :int)) - -(deftest set-aggregate-struct-slot.acc - (with-foreign-objects ((pair-struct '(:struct struct-pair)) - (aggregate-struct '(:struct aggregate-struct))) - (with-foreign-slots ((a b) pair-struct (:struct struct-pair)) - (setf a 1 b 2) - (setf (acc-x aggregate-struct) 42) - (setf (acc-y aggregate-struct) 42) - (setf (acc-pair aggregate-struct) pair-struct) - (values (acc-x aggregate-struct) - (acc-pair aggregate-struct) - (acc-y aggregate-struct)))) - 42 - (1 . 2) - 42) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/test-asdf.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/test-asdf.lisp deleted file mode 100644 index f823390..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/test-asdf.lisp +++ /dev/null @@ -1,42 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; asdf.lisp --- CFFI-Grovel asdf support tests. -;;; -;;; Copyright (C) 2015, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi-tests) - -#.(when (cffi-toolchain::static-ops-enabled-p) - '(deftest test-static-program - (progn - (asdf:operate :static-program-op :cffi-tests/example) - (let ((program (asdf:output-file :static-program-op :cffi-tests/example))) - (uiop:run-program `(,(native-namestring program) "1" "2 3") :output :lines))) - ("Arguments: 1 \"2 3\"" "hello, world!") nil 0)) - -(deftest test-asdf-load - (progn - (asdf:load-system :cffi-tests/example) - (uiop:symbol-call :cffi-example :check-groveller)) - nil) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/test-static-link.sh b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/test-static-link.sh deleted file mode 100644 index ce8d9fa..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/test-static-link.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -eux - -for l in sbcl ; do # mkcl ecl clisp sbcl - EX="$(cl-launch -l $l -sp cffi-toolchain -ip "(output-file :static-program-op :cffi-tests/example)")" - rm -f $EX ; : - cl-launch -l $l -sp cffi-toolchain -i "(operate :static-program-op :cffi-tests/example)" - [ -f $EX ] - [ "$($EX)" = "hello, world!" ] -done diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/union.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/union.lisp deleted file mode 100644 index 091751b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/union.lisp +++ /dev/null @@ -1,52 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; union.lisp --- Tests on C unions. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; -;;; 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. -;;; - -(in-package #:cffi-tests) - -(defcunion uint32-bytes - (int-value :unsigned-int) - (bytes :unsigned-char :count 4)) - -(defctype uint32-bytes (:union uint32-bytes)) - -(defun int-to-bytes (n) - "Convert N to a list of bytes using a union." - (with-foreign-object (obj 'uint32-bytes) - (setf (foreign-slot-value obj 'uint32-bytes 'int-value) n) - (loop for i from 0 below 4 - collect (mem-aref - (foreign-slot-value obj 'uint32-bytes 'bytes) - :unsigned-char i)))) - -(deftest union.1 - (let ((bytes (int-to-bytes #x12345678))) - (cond ((equal bytes '(#x12 #x34 #x56 #x78)) - t) - ((equal bytes '(#x78 #x56 #x34 #x12)) - t) - (t bytes))) - t) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/bundle.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/bundle.lisp deleted file mode 100644 index d85bdb4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/bundle.lisp +++ /dev/null @@ -1,565 +0,0 @@ -;;;; ------------------------------------------------------------------------- -;;;; ASDF-Bundle - -(uiop/package:define-package :asdf/bundle - (:recycle :asdf/bundle :asdf) - (:use :uiop/common-lisp :uiop :asdf/upgrade - :asdf/component :asdf/system :asdf/find-system :asdf/find-component :asdf/operation - :asdf/action :asdf/lisp-action :asdf/plan :asdf/operate :asdf/defsystem) - (:export - #:bundle-op #:bundle-type #:program-system - #:bundle-system #:bundle-pathname-type #:direct-dependency-files - #:monolithic-op #:monolithic-bundle-op #:operation-monolithic-p - #:basic-compile-bundle-op #:prepare-bundle-op - #:compile-bundle-op #:load-bundle-op #:monolithic-compile-bundle-op #:monolithic-load-bundle-op - #:lib-op #:monolithic-lib-op - #:dll-op #:monolithic-dll-op - #:deliver-asd-op #:monolithic-deliver-asd-op - #:program-op #:image-op #:compiled-file #:precompiled-system #:prebuilt-system - #:user-system-p #:user-system #:trivial-system-p - #:prologue-code #:epilogue-code #:static-library)) -(in-package :asdf/bundle) - -(with-upgradability () - (defclass bundle-op (basic-compile-op) - ;; NB: use of instance-allocated slots for operations is DEPRECATED - ;; and only supported in a temporary fashion for backward compatibility. - ;; Supported replacement: Define slots on program-system instead. - ((bundle-type :initform :no-output-file :reader bundle-type :allocation :class)) - (:documentation "base class for operations that bundle outputs from multiple components")) - - (defclass monolithic-op (operation) () - (:documentation "A MONOLITHIC operation operates on a system *and all of its -dependencies*. So, for example, a monolithic concatenate operation will -concatenate together a system's components and all of its dependencies, but a -simple concatenate operation will concatenate only the components of the system -itself.")) - - (defclass monolithic-bundle-op (bundle-op monolithic-op) - ;; Old style way of specifying prologue and epilogue on ECL: in the monolithic operation. - ;; DEPRECATED. Supported replacement: Define slots on program-system instead. - ((prologue-code :initform nil :accessor prologue-code) - (epilogue-code :initform nil :accessor epilogue-code)) - (:documentation "operations that are both monolithic-op and bundle-op")) - - (defclass program-system (system) - ;; New style (ASDF3.1) way of specifying prologue and epilogue on ECL: in the system - ((prologue-code :initform nil :initarg :prologue-code :reader prologue-code) - (epilogue-code :initform nil :initarg :epilogue-code :reader epilogue-code) - (no-uiop :initform nil :initarg :no-uiop :reader no-uiop) - (prefix-lisp-object-files :initarg :prefix-lisp-object-files - :initform nil :accessor prefix-lisp-object-files) - (postfix-lisp-object-files :initarg :postfix-lisp-object-files - :initform nil :accessor postfix-lisp-object-files) - (extra-object-files :initarg :extra-object-files - :initform nil :accessor extra-object-files) - (extra-build-args :initarg :extra-build-args - :initform nil :accessor extra-build-args))) - - (defmethod prologue-code ((x system)) nil) - (defmethod epilogue-code ((x system)) nil) - (defmethod no-uiop ((x system)) nil) - (defmethod prefix-lisp-object-files ((x system)) nil) - (defmethod postfix-lisp-object-files ((x system)) nil) - (defmethod extra-object-files ((x system)) nil) - (defmethod extra-build-args ((x system)) nil) - - (defclass link-op (bundle-op) () - (:documentation "Abstract operation for linking files together")) - - (defclass gather-operation (bundle-op) - ((gather-operation :initform nil :allocation :class :reader gather-operation) - (gather-type :initform :no-output-file :allocation :class :reader gather-type)) - (:documentation "Abstract operation for gathering many input files from a system")) - - (defun operation-monolithic-p (op) - (typep op 'monolithic-op)) - - ;; Dependencies of a gather-op are the actions of the dependent operation - ;; for all the (sorted) required components for loading the system. - ;; Monolithic operations typically use lib-op as the dependent operation, - ;; and all system-level dependencies as required components. - ;; Non-monolithic operations typically use compile-op as the dependent operation, - ;; and all transitive sub-components as required components (excluding other systems). - (defmethod component-depends-on ((o gather-operation) (s system)) - (let* ((mono (operation-monolithic-p o)) - (go (make-operation (or (gather-operation o) 'compile-op))) - (bundle-p (typep go 'bundle-op)) - ;; In a non-mono operation, don't recurse to other systems. - ;; In a mono operation gathering bundles, don't recurse inside systems. - (component-type (if mono (if bundle-p 'system t) '(not system))) - ;; In the end, only keep system bundles or non-system bundles, depending. - (keep-component (if bundle-p 'system '(not system))) - (deps - ;; Required-components only looks at the dependencies of an action, excluding the action - ;; itself, so it may be safely used by an action recursing on its dependencies (which - ;; may or may not be an overdesigned API, since in practice we never use it that way). - ;; Therefore, if we use :goal-operation 'load-op :keep-operation 'load-op, which looks - ;; cleaner, we will miss the load-op on the requested system itself, which doesn't - ;; matter for a regular system, but matters, a lot, for a package-inferred-system. - ;; Using load-op as the goal operation and basic-compile-op as the keep-operation works - ;; for our needs of gathering all the files we want to include in a bundle. - ;; Note that we use basic-compile-op rather than compile-op so it will still work on - ;; systems when *load-system-operation* is load-bundle-op. - (required-components - s :other-systems mono :component-type component-type :keep-component keep-component - :goal-operation 'load-op :keep-operation 'basic-compile-op))) - `((,go ,@deps) ,@(call-next-method)))) - - ;; Create a single fasl for the entire library - (defclass basic-compile-bundle-op (bundle-op) - ((gather-type :initform #-(or clasp ecl mkcl) :fasl #+(or clasp ecl mkcl) :object - :allocation :class) - (bundle-type :initform :fasl :allocation :class)) - (:documentation "Base class for compiling into a bundle")) - - ;; Analog to prepare-op, for load-bundle-op and compile-bundle-op - (defclass prepare-bundle-op (sideway-operation) - ((sideway-operation - :initform #+(or clasp ecl mkcl) 'load-bundle-op #-(or clasp ecl mkcl) 'load-op - :allocation :class)) - (:documentation "Operation class for loading the bundles of a system's dependencies")) - - (defclass lib-op (link-op gather-operation non-propagating-operation) - ((gather-type :initform :object :allocation :class) - (bundle-type :initform :lib :allocation :class)) - (:documentation "Compile the system and produce a linkable static library (.a/.lib) -for all the linkable object files associated with the system. Compare with DLL-OP. - -On most implementations, these object files only include extensions to the runtime -written in C or another language with a compiler producing linkable object files. -On CLASP, ECL, MKCL, these object files _also_ include the contents of Lisp files -themselves. In any case, this operation will produce what you need to further build -a static runtime for your system, or a dynamic library to load in an existing runtime.")) - - ;; What works: on ECL, CLASP(?), MKCL, we link the many .o files from the system into the .so; - ;; on other implementations, we combine (usually concatenate) the .fasl files into one. - (defclass compile-bundle-op (basic-compile-bundle-op selfward-operation gather-operation - #+(or clasp ecl mkcl) link-op) - ((selfward-operation :initform '(prepare-bundle-op) :allocation :class)) - (:documentation "This operator is an alternative to COMPILE-OP. Build a system -and all of its dependencies, but build only a single (\"monolithic\") FASL, instead -of one per source file, which may be more resource efficient. That monolithic -FASL should be loaded with LOAD-BUNDLE-OP, rather than LOAD-OP.")) - - (defclass load-bundle-op (basic-load-op selfward-operation) - ((selfward-operation :initform '(prepare-bundle-op compile-bundle-op) :allocation :class)) - (:documentation "This operator is an alternative to LOAD-OP. Build a system -and all of its dependencies, using COMPILE-BUNDLE-OP. The difference with -respect to LOAD-OP is that it builds only a single FASL, which may be -faster and more resource efficient.")) - - ;; NB: since the monolithic-op's can't be sideway-operation's, - ;; if we wanted lib-op, dll-op, deliver-asd-op to be sideway-operation's, - ;; we'd have to have the monolithic-op not inherit from the main op, - ;; but instead inherit from a basic-FOO-op as with basic-compile-bundle-op above. - - (defclass dll-op (link-op gather-operation non-propagating-operation) - ((gather-type :initform :object :allocation :class) - (bundle-type :initform :dll :allocation :class)) - (:documentation "Compile the system and produce a dynamic loadable library (.so/.dll) -for all the linkable object files associated with the system. Compare with LIB-OP.")) - - (defclass deliver-asd-op (basic-compile-op selfward-operation) - ((selfward-operation - ;; TODO: implement link-op on all implementations, and make that - ;; '(compile-bundle-op lib-op #-(or clasp ecl mkcl) dll-op) - :initform '(compile-bundle-op #+(or clasp ecl mkcl) lib-op) - :allocation :class)) - (:documentation "produce an asd file for delivering the system as a single fasl")) - - - (defclass monolithic-deliver-asd-op (deliver-asd-op monolithic-bundle-op) - ((selfward-operation - ;; TODO: implement link-op on all implementations, and make that - ;; '(monolithic-compile-bundle-op monolithic-lib-op #-(or clasp ecl mkcl) monolithic-dll-op) - :initform '(monolithic-compile-bundle-op #+(or clasp ecl mkcl) monolithic-lib-op) - :allocation :class)) - (:documentation "produce fasl and asd files for combined system and dependencies.")) - - (defclass monolithic-compile-bundle-op - (basic-compile-bundle-op monolithic-bundle-op - #+(or clasp ecl mkcl) link-op gather-operation non-propagating-operation) - () - (:documentation "Create a single fasl for the system and its dependencies.")) - - (defclass monolithic-load-bundle-op (load-bundle-op monolithic-bundle-op) - ((selfward-operation :initform 'monolithic-compile-bundle-op :allocation :class)) - (:documentation "Load a single fasl for the system and its dependencies.")) - - (defclass monolithic-lib-op (lib-op monolithic-bundle-op non-propagating-operation) - ((gather-type :initform :object :allocation :class)) - (:documentation "Compile the system and produce a linkable static library (.a/.lib) -for all the linkable object files associated with the system or its dependencies. See LIB-OP.")) - - (defclass monolithic-dll-op (dll-op monolithic-bundle-op non-propagating-operation) - ((gather-type :initform :object :allocation :class)) - (:documentation "Compile the system and produce a dynamic loadable library (.so/.dll) -for all the linkable object files associated with the system or its dependencies. See LIB-OP")) - - (defclass image-op (monolithic-bundle-op selfward-operation - #+(or clasp ecl mkcl) link-op #+(or clasp ecl mkcl) gather-operation) - ((bundle-type :initform :image :allocation :class) - (gather-operation :initform 'lib-op :allocation :class) - #+(or clasp ecl mkcl) (gather-type :initform :static-library :allocation :class) - (selfward-operation :initform '(#-(or clasp ecl mkcl) load-op) :allocation :class)) - (:documentation "create an image file from the system and its dependencies")) - - (defclass program-op (image-op) - ((bundle-type :initform :program :allocation :class)) - (:documentation "create an executable file from the system and its dependencies")) - - ;; From the ASDF-internal bundle-type identifier, get a filesystem-usable pathname type. - (defun bundle-pathname-type (bundle-type) - (etypecase bundle-type - ((or null string) ;; pass through nil or string literal - bundle-type) - ((eql :no-output-file) ;; marker for a bundle-type that has NO output file - (error "No output file, therefore no pathname type")) - ((eql :fasl) ;; the type of a fasl - #-(or clasp ecl mkcl) (compile-file-type) ; on image-based platforms, used as input and output - #+(or clasp ecl mkcl) "fasb") ; on C-linking platforms, only used as output for system bundles - ((member :image) - #+allegro "dxl" - #+(and clisp os-windows) "exe" - #-(or allegro (and clisp os-windows)) "image") - ;; NB: on CLASP and ECL these implementations, we better agree with - ;; (compile-file-type :type bundle-type)) - ((eql :object) ;; the type of a linkable object file - (os-cond ((os-unix-p) "o") - ((os-windows-p) (if (featurep '(:or :mingw32 :mingw64)) "o" "obj")))) - ((member :lib :static-library) ;; the type of a linkable library - (os-cond ((os-unix-p) "a") - ((os-windows-p) (if (featurep '(:or :mingw32 :mingw64)) "a" "lib")))) - ((member :dll :shared-library) ;; the type of a shared library - (os-cond ((os-macosx-p) "dylib") ((os-unix-p) "so") ((os-windows-p) "dll"))) - ((eql :program) ;; the type of an executable program - (os-cond ((os-unix-p) nil) ((os-windows-p) "exe"))))) - - ;; Compute the output-files for a given bundle action - (defun bundle-output-files (o c) - (let ((bundle-type (bundle-type o))) - (unless (or (eq bundle-type :no-output-file) ;; NIL already means something regarding type. - (and (null (input-files o c)) (not (member bundle-type '(:image :program))))) - (let ((name (or (component-build-pathname c) - (let ((suffix - (unless (typep o 'program-op) - ;; "." is no good separator for Logical Pathnames, so we use "--" - (if (operation-monolithic-p o) - "--all-systems" - ;; These use a different type .fasb or .a instead of .fasl - #-(or clasp ecl mkcl) "--system")))) - (format nil "~A~@[~A~]" (component-name c) suffix)))) - (type (bundle-pathname-type bundle-type))) - (values (list (subpathname (component-pathname c) name :type type)) - (eq (class-of o) (coerce-class (component-build-operation c) - :package :asdf/interface - :super 'operation - :error nil))))))) - - (defmethod output-files ((o bundle-op) (c system)) - (bundle-output-files o c)) - - #-(or clasp ecl mkcl) - (progn - (defmethod perform ((o image-op) (c system)) - (dump-image (output-file o c) :executable (typep o 'program-op))) - (defmethod perform :before ((o program-op) (c system)) - (setf *image-entry-point* (ensure-function (component-entry-point c))))) - - (defclass compiled-file (file-component) - ((type :initform #-(or clasp ecl mkcl) (compile-file-type) #+(or clasp ecl mkcl) "fasb")) - (:documentation "Class for a file that is already compiled, -e.g. as part of the implementation, of an outer build system that calls into ASDF, -or of opaque libraries shipped along the source code.")) - - (defclass precompiled-system (system) - ((build-pathname :initarg :fasl)) - (:documentation "Class For a system that is delivered as a precompiled fasl")) - - (defclass prebuilt-system (system) - ((build-pathname :initarg :static-library :initarg :lib - :accessor prebuilt-system-static-library)) - (:documentation "Class for a system delivered with a linkable static library (.a/.lib)"))) - - -;;; -;;; BUNDLE-OP -;;; -;;; This operation takes all components from one or more systems and -;;; creates a single output file, which may be -;;; a FASL, a statically linked library, a shared library, etc. -;;; The different targets are defined by specialization. -;;; -(when-upgrading (:version "3.2.0") - ;; Cancel any previously defined method - (defmethod initialize-instance :after ((instance bundle-op) &rest initargs &key &allow-other-keys) - (declare (ignore initargs)))) - -(with-upgradability () - (defgeneric trivial-system-p (component)) - - (defun user-system-p (s) - (and (typep s 'system) - (not (builtin-system-p s)) - (not (trivial-system-p s))))) - -(eval-when (#-lispworks :compile-toplevel :load-toplevel :execute) - (deftype user-system () '(and system (satisfies user-system-p)))) - -;;; -;;; First we handle monolithic bundles. -;;; These are standalone systems which contain everything, -;;; including other ASDF systems required by the current one. -;;; A PROGRAM is always monolithic. -;;; -;;; MONOLITHIC SHARED LIBRARIES, PROGRAMS, FASL -;;; -(with-upgradability () - (defun direct-dependency-files (o c &key (test 'identity) (key 'output-files) &allow-other-keys) - ;; This function selects output files from direct dependencies; - ;; your component-depends-on method must gather the correct dependencies in the correct order. - (while-collecting (collect) - (map-direct-dependencies - t o c #'(lambda (sub-o sub-c) - (loop :for f :in (funcall key sub-o sub-c) - :when (funcall test f) :do (collect f)))))) - - (defun pathname-type-equal-function (type) - #'(lambda (p) (equalp (pathname-type p) type))) - - (defmethod input-files ((o gather-operation) (c system)) - (unless (eq (bundle-type o) :no-output-file) - (direct-dependency-files - o c :key 'output-files - :test (pathname-type-equal-function (bundle-pathname-type (gather-type o)))))) - - ;; Find the operation that produces a given bundle-type - (defun select-bundle-operation (type &optional monolithic) - (ecase type - ((:dll :shared-library) - (if monolithic 'monolithic-dll-op 'dll-op)) - ((:lib :static-library) - (if monolithic 'monolithic-lib-op 'lib-op)) - ((:fasl) - (if monolithic 'monolithic-compile-bundle-op 'compile-bundle-op)) - ((:image) - 'image-op) - ((:program) - 'program-op)))) - -;;; -;;; LOAD-BUNDLE-OP -;;; -;;; This is like ASDF's LOAD-OP, but using bundle fasl files. -;;; -(with-upgradability () - (defmethod component-depends-on ((o load-bundle-op) (c system)) - `((,o ,@(component-sideway-dependencies c)) - (,(if (user-system-p c) 'compile-bundle-op 'load-op) ,c) - ,@(call-next-method))) - - (defmethod input-files ((o load-bundle-op) (c system)) - (when (user-system-p c) - (output-files (find-operation o 'compile-bundle-op) c))) - - (defmethod perform ((o load-bundle-op) (c system)) - (when (input-files o c) - (perform-lisp-load-fasl o c))) - - (defmethod mark-operation-done :after ((o load-bundle-op) (c system)) - (mark-operation-done (find-operation o 'load-op) c))) - -;;; -;;; PRECOMPILED FILES -;;; -;;; This component can be used to distribute ASDF systems in precompiled form. -;;; Only useful when the dependencies have also been precompiled. -;;; -(with-upgradability () - (defmethod trivial-system-p ((s system)) - (every #'(lambda (c) (typep c 'compiled-file)) (component-children s))) - - (defmethod input-files ((o operation) (c compiled-file)) - (list (component-pathname c))) - (defmethod perform ((o load-op) (c compiled-file)) - (perform-lisp-load-fasl o c)) - (defmethod perform ((o load-source-op) (c compiled-file)) - (perform (find-operation o 'load-op) c)) - (defmethod perform ((o operation) (c compiled-file)) - nil)) - -;;; -;;; Pre-built systems -;;; -(with-upgradability () - (defmethod trivial-system-p ((s prebuilt-system)) - t) - - (defmethod perform ((o link-op) (c prebuilt-system)) - nil) - - (defmethod perform ((o basic-compile-bundle-op) (c prebuilt-system)) - nil) - - (defmethod perform ((o lib-op) (c prebuilt-system)) - nil) - - (defmethod perform ((o dll-op) (c prebuilt-system)) - nil) - - (defmethod component-depends-on ((o gather-operation) (c prebuilt-system)) - nil) - - (defmethod output-files ((o lib-op) (c prebuilt-system)) - (values (list (prebuilt-system-static-library c)) t))) - - -;;; -;;; PREBUILT SYSTEM CREATOR -;;; -(with-upgradability () - (defmethod output-files ((o deliver-asd-op) (s system)) - (list (make-pathname :name (component-name s) :type "asd" - :defaults (component-pathname s)))) - - (defmethod perform ((o deliver-asd-op) (s system)) - (let* ((inputs (input-files o s)) - (fasl (first inputs)) - (library (second inputs)) - (asd (first (output-files o s))) - (name (if (and fasl asd) (pathname-name asd) (return-from perform))) - (version (component-version s)) - (dependencies - (if (operation-monolithic-p o) - ;; We want only dependencies, and we use basic-load-op rather than load-op so that - ;; this will keep working on systems when *load-system-operation* is load-bundle-op - (remove-if-not 'builtin-system-p - (required-components s :component-type 'system - :keep-operation 'basic-load-op)) - (while-collecting (x) ;; resolve the sideway-dependencies of s - (map-direct-dependencies - t 'load-op s - #'(lambda (o c) - (when (and (typep o 'load-op) (typep c 'system)) - (x c))))))) - (depends-on (mapcar 'coerce-name dependencies))) - (when (pathname-equal asd (system-source-file s)) - (cerror "overwrite the asd file" - "~/asdf-action:format-action/ is going to overwrite the system definition file ~S ~ -which is probably not what you want; you probably need to tweak your output translations." - (cons o s) asd)) - (with-open-file (s asd :direction :output :if-exists :supersede - :if-does-not-exist :create) - (format s ";;; Prebuilt~:[~; monolithic~] ASDF definition for system ~A~%" - (operation-monolithic-p o) name) - (format s ";;; Built for ~A ~A on a ~A/~A ~A~%" - (lisp-implementation-type) - (lisp-implementation-version) - (software-type) - (machine-type) - (software-version)) - (let ((*package* (find-package :asdf-user))) - (pprint `(defsystem ,name - :class prebuilt-system - :version ,version - :depends-on ,depends-on - :components ((:compiled-file ,(pathname-name fasl))) - ,@(when library `(:lib ,(file-namestring library)))) - s) - (terpri s))))) - - #-(or clasp ecl mkcl) - (defmethod perform ((o basic-compile-bundle-op) (c system)) - (let* ((input-files (input-files o c)) - (fasl-files (remove (compile-file-type) input-files :key #'pathname-type :test-not #'equalp)) - (non-fasl-files (remove (compile-file-type) input-files :key #'pathname-type :test #'equalp)) - (output-files (output-files o c)) - (output-file (first output-files))) - (assert (eq (not input-files) (not output-files))) - (when input-files - (when non-fasl-files - (error "On ~A, asdf/bundle can only bundle FASL files, but these were also produced: ~S" - (implementation-type) non-fasl-files)) - (when (or (prologue-code c) (epilogue-code c)) - (error "prologue-code and epilogue-code are not supported on ~A" - (implementation-type))) - (with-staging-pathname (output-file) - (combine-fasls fasl-files output-file))))) - - (defmethod input-files ((o load-op) (s precompiled-system)) - (bundle-output-files (find-operation o 'compile-bundle-op) s)) - - (defmethod perform ((o load-op) (s precompiled-system)) - (perform-lisp-load-fasl o s)) - - (defmethod component-depends-on ((o load-bundle-op) (s precompiled-system)) - #+xcl (declare (ignorable o)) - `((load-op ,s) ,@(call-next-method)))) - -#| ;; Example use: -(asdf:defsystem :precompiled-asdf-utils :class asdf::precompiled-system :fasl (asdf:apply-output-translations (asdf:system-relative-pathname :asdf-utils "asdf-utils.system.fasl"))) -(asdf:load-system :precompiled-asdf-utils) -|# - -#+(or clasp ecl mkcl) -(with-upgradability () - - #+ecl ;; doesn't work on clasp or mkcl (yet?). - (unless (use-ecl-byte-compiler-p) - (setf *load-system-operation* 'load-bundle-op)) - - (defun system-module-pathname (module) - (let ((name (coerce-name module))) - (some - 'file-exists-p - (list - #+clasp (compile-file-pathname (make-pathname :name name :defaults "sys:") :output-type :object) - #+ecl (compile-file-pathname (make-pathname :name name :defaults "sys:") :type :lib) - #+ecl (compile-file-pathname (make-pathname :name name :defaults "sys:") :type :object) - #+mkcl (make-pathname :name name :type (bundle-pathname-type :lib) :defaults #p"sys:") - #+mkcl (make-pathname :name name :type (bundle-pathname-type :lib) :defaults #p"sys:contrib;"))))) - - (defun make-prebuilt-system (name &optional (pathname (system-module-pathname name))) - "Creates a prebuilt-system if PATHNAME isn't NIL." - (when pathname - (make-instance 'prebuilt-system - :name (coerce-name name) - :static-library (resolve-symlinks* pathname)))) - - (defmethod component-depends-on :around ((o image-op) (c system)) - (destructuring-bind ((lib-op . deps)) (call-next-method) - (labels ((has-it-p (x) (find x deps :test 'equal :key 'coerce-name)) - (ensure-linkable-system (x) - (unless (has-it-p x) - (or (if-let (s (find-system x)) - (and (system-source-directory x) - (list s))) - (if-let (p (system-module-pathname x)) - (list (make-prebuilt-system x p))))))) - `((,lib-op - ,@(unless (no-uiop c) - (append (ensure-linkable-system "cmp") - (or (ensure-linkable-system "uiop") - (ensure-linkable-system "asdf")))) - ,@deps))))) - - (defmethod perform ((o link-op) (c system)) - (let* ((object-files (input-files o c)) - (output (output-files o c)) - (bundle (first output)) - (programp (typep o 'program-op)) - (kind (bundle-type o))) - (when output - (apply 'create-image - bundle (append - (when programp (prefix-lisp-object-files c)) - object-files - (when programp (postfix-lisp-object-files c))) - :kind kind - :prologue-code (when programp (prologue-code c)) - :epilogue-code (when programp (epilogue-code c)) - :build-args (when programp (extra-build-args c)) - :extra-object-files (when programp (extra-object-files c)) - :no-uiop (no-uiop c) - (when programp `(:entry-point ,(component-entry-point c)))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/c-toolchain.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/c-toolchain.lisp deleted file mode 100644 index 8e70227..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/c-toolchain.lisp +++ /dev/null @@ -1,392 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; c-toolchain.lisp --- Generic support compiling and linking C code. -;;; -;;; Copyright (C) 2005-2006, Dan Knap -;;; Copyright (C) 2005-2006, Emily Backes -;;; Copyright (C) 2007, Stelian Ionescu -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. -;;; - -(in-package #:cffi-toolchain) - -;;; Utils - -(defun parse-command-flags (flags) - (let ((separators '(#\Space #\Tab #\Newline #\Return))) - (remove-if 'emptyp (split-string flags :separator separators)))) - -(defun parse-command-flags-list (strings) - (loop for flags in strings append (parse-command-flags flags))) - -(defun program-argument (x) - (etypecase x - (string x) - (pathname (native-namestring x)))) - -(defun invoke (command &rest args) - (when (pathnamep command) - (setf command (native-namestring command)) - #+os-unix - (unless (absolute-pathname-p command) - (setf command (strcat "./" command)))) - (let ((cmd (cons command (mapcar 'program-argument args)))) - (safe-format! *debug-io* "; ~A~%" (escape-command cmd)) - (run-program cmd :output :interactive :error-output :interactive))) - - -;;; C support - -(defparameter *cc* nil "C compiler") -(defparameter *cc-flags* nil "flags for the C compiler") -(defparameter *ld* nil "object linker") ;; NB: can actually be the same as *cc* -(defparameter *ld-exe-flags* nil "flags for linking executables via *ld*") -(defparameter *ld-dll-flags* nil "flags for linking shared library via *ld*") -(defparameter *linkkit-start* nil "flags for the implementation linkkit, start") -(defparameter *linkkit-end* nil "flags for the implementation linkkit, end") - -(defun link-all-library (lib) - ;; Flags to provide to cc to link a whole library into an executable - (when lib - (if (featurep :darwin) ;; actually, LLVM ld vs GNU ld - `("-Wl,-force_load" ,lib) - `("-Wl,--whole-archive" ,lib "-Wl,--no-whole-archive")))) - -(defun normalize-flags (directory flags) - (loop for val in (parse-command-flags flags) collect - (cond - ((find (first-char val) "-+/") val) - ((probe-file* (subpathname directory val))) - (t val)))) - -(defun implementation-file (file &optional type) - (subpathname (lisp-implementation-directory) file - :type (bundle-pathname-type type))) - -;; TODO: on CCL, extract data from -;; (pathname (strcat "ccl:lisp-kernel/" (ccl::kernel-build-directory) "/Makefile")) ? - -#+clisp -(progn - (defparameter *clisp-toolchain-parameters* - '(("CC" *cc*) - ("CFLAGS" *cc-flags* t) - ("CLFLAGS" *cc-exe-flags* t) - ("LIBS" *linkkit-start* t) - ("X_LIBS" *linkkit-end* t))) - (defun clisp-toolchain-parameters (&optional linkset) - (nest - (let* ((linkset (ensure-pathname - (or linkset "base") - :defaults (lisp-implementation-directory) - :ensure-absolute t - :ensure-directory t - :want-existing t)) - (makevars (subpathname linkset "makevars")))) - (with-input-file (params makevars :if-does-not-exist nil)) - (when params) - (loop for l = (read-line params nil nil) while l - finally (appendf *linkkit-start* (normalize-flags linkset "modules.o")) do) - (if-let (p (position #\= l))) - (let ((var (subseq l 0 p)) - ;; strip the start and end quote characters - (val (subseq l (+ p 2) (- (length l) 1))))) - (if-let (param (cdr (assoc var *clisp-toolchain-parameters* :test 'equal)))) - (destructuring-bind (sym &optional normalizep) param - (setf (symbol-value sym) - (if normalizep (normalize-flags linkset val) val)))) - (setf *ld* *cc* - *ld-exe-flags* `(,@*cc-flags* #-darwin "-Wl,--export-dynamic") - *ld-dll-flags* (list* #+darwin "-dynamiclib" ;; -bundle ? - #-darwin "-shared" - *cc-flags*)))) - -;; TODO: for CMUCL, see whatever uses its linker.sh, -;; and teach it to accept additional objects / libraries -;; as it links a runtime plus a core into an executable - -#+ecl -(defun ecl-toolchain-parameters () - (setf *cc* c:*cc* - *cc-flags* `(,@(parse-command-flags c::*cc-flags*) - ,@(parse-command-flags c:*user-cc-flags*)) - ;; For the below, we just use c::build-FOO - *ld* *cc* - *ld-exe-flags* *cc-flags* - *ld-dll-flags* *cc-flags* - *linkkit-start* nil - *linkkit-end* nil)) - -#+mkcl -(defun mkcl-toolchain-parameters () - (setf *cc* compiler::*cc* - *cc-flags* (parse-command-flags compiler::*cc-flags*) - ;; For the below, we just use compiler::build-FOO - *ld* *cc* - *ld-exe-flags* *cc-flags* - *ld-dll-flags* *cc-flags* - *linkkit-start* nil - *linkkit-end* nil)) - -#+sbcl -(progn - (defparameter *sbcl-toolchain-parameters* - '(("CC" *cc*) - ("CFLAGS" *cc-flags* t) - ("LINKFLAGS" *ld-exe-flags* t) - ("USE_LIBSBCL" *linkkit-start* t) - ("LIBS" *linkkit-end* t))) - (defun sbcl-toolchain-parameters () - (nest - (let* ((sbcl-home (lisp-implementation-directory)) - (sbcl.mk (subpathname sbcl-home "sbcl.mk")))) - (with-input-file (params sbcl.mk :if-does-not-exist nil)) - (when params) - (loop for l = (read-line params nil nil) while l - finally (appendf *linkkit-end* '("-lm")) do) - (if-let (p (position #\= l))) - (let ((var (subseq l 0 p)) - (val (subseq l (1+ p))))) - (if-let (param (cdr (assoc var *sbcl-toolchain-parameters* :test 'equal)))) - (destructuring-bind (sym &optional normalizep) param - (setf (symbol-value sym) - (if normalizep (normalize-flags sbcl-home val) val)))) - (unless (featurep :sb-linkable-runtime) - (setf *linkkit-start* nil *linkkit-end* nil)) - (setf *ld* *cc* ;; ! - *ld-dll-flags* (list* #+darwin "-dynamiclib" #-darwin "-shared" - *cc-flags*)))) - -;;; Taken from sb-grovel -(defun split-cflags (string) - (remove-if (lambda (flag) - (zerop (length flag))) - (loop - for start = 0 then (if end (1+ end) nil) - for end = (and start (position #\Space string :start start)) - while start - collect (subseq string start end)))) - -(defun default-toolchain-parameters () - ;; The values below are legacy guesses from previous versions of CFFI. - ;; It would be nice to clean them up, remove unneeded guesses, - ;; annotate every guess with some comment explaining the context. - ;; TODO: have proper implementation-provided linkkit parameters - ;; for all implementations as above, and delete the below altogether. - (let ((arch-flags - ;; Former *cpu-word-size-flags* - #+arm '("-marm") - #+arm64 '() - #-(or arm arm64) - (ecase (cffi:foreign-type-size :pointer) - (4 '("-m32")) - (8 '("-m64"))))) - (setf *cc* - (or (getenvp "CC") - #+(or cygwin (not windows)) "cc" - "gcc") - *cc-flags* - (append - arch-flags - ;; For MacPorts - #+darwin (list "-I" "/opt/local/include/") - ;; ECL internal flags - #+ecl (parse-command-flags c::*cc-flags*) - ;; FreeBSD non-base header files - #+freebsd (list "-I" "/usr/local/include/") - (split-cflags (getenv "CFLAGS"))) - *ld* *cc* - *ld-exe-flags* `(,@arch-flags #-darwin "-Wl,--export-dynamic") - *ld-dll-flags* (list* #+darwin "-dynamiclib" ;; -bundle ? - #-darwin "-shared" - *cc-flags*) - *linkkit-start* nil - *linkkit-end* nil))) - -(defun ensure-toolchain-parameters () - #+clisp (unless *cc* (clisp-toolchain-parameters)) - #+ecl (unless *cc* (ecl-toolchain-parameters)) - #+mkcl (unless *cc* (mkcl-toolchain-parameters)) - #+sbcl (unless *cc* (sbcl-toolchain-parameters)) - (unless *cc* (default-toolchain-parameters))) - -;; Actually initialize toolchain parameters -(ignore-errors (ensure-toolchain-parameters)) - - -(defun call-with-temporary-output (output-file fun) - (let ((output-file (ensure-pathname output-file :want-file t :ensure-absolute t :truenamize t))) - (with-temporary-file - (:pathname tmp :direction :output - :prefix (strcat (native-namestring (pathname-directory-pathname output-file)) - (pathname-name output-file) "-tmp") - :suffix "" - :type (pathname-type output-file)) - (funcall fun tmp) - (rename-file-overwriting-target tmp output-file)))) - -(defmacro with-temporary-output ((output-file-var &optional (output-file-val output-file-var)) - &body body) - "Create an output file atomically, by executing the BODY while OUTPUT-FILE-VAR -is bound to a temporary file name, then atomically renaming that temporary file to OUTPUT-FILE-VAL." - `(call-with-temporary-output ,output-file-val (lambda (,output-file-var) ,@body))) - -(defun invoke-builder (builder output-file &rest args) - "Invoke the C Compiler with given OUTPUT-FILE and arguments ARGS" - (with-temporary-output (output-file) - (apply 'invoke `(,@builder ,output-file ,@args)))) - -(defun cc-compile (output-file inputs) - (apply 'invoke-builder (list *cc* "-o") output-file - "-c" (append *cc-flags* #-windows '("-fPIC") inputs))) - -(defun link-executable (output-file inputs) - (apply 'invoke-builder (list *ld* "-o") output-file - (append *ld-exe-flags* inputs))) - -(defun link-lisp-executable (output-file inputs) - #+ecl - (let ((c::*ld-flags* - (format nil "-Wl,--export-dynamic ~@[ ~A~]" - c::*ld-flags*))) - (c::build-program output-file :lisp-files inputs)) - #+mkcl (compiler::build-program - output-file :lisp-object-files (mapcar 'program-argument inputs) - :on-missing-lisp-object-initializer nil) - #+(and sbcl (not sb-linkable-runtime)) (error "Your SBCL doesn't support :SB-LINKABLE-RUNTIME") - #-(or ecl mkcl) - (link-executable output-file `(,@*linkkit-start* ,@inputs ,@*linkkit-end*))) - -(defun link-static-library (output-file inputs) - #+ecl (c::build-static-library output-file :lisp-files inputs) - #+mkcl (compiler::build-static-library - output-file :lisp-object-files (mapcar 'program-argument inputs) - :on-missing-lisp-object-initializer nil) - #-(or ecl mkcl) - (with-temporary-output (output-file) - (delete-file-if-exists output-file) - #+(or bsd linux windows) - (apply 'invoke - `(;; TODO: make it portable to BSD. - ;; ar D is also on FreeBSD, but not on OpenBSD or Darwin, dunno about NetBSD; - ;; ar T seems to only be on Linux (means something different on Darwin). Sigh. - ;; A MRI script might be more portable... not, only supported by GNU binutils. - ;; I couldn't get libtool to work, and it's not ubiquitous anyway. - ;; ,@`("libtool" "--mode=link" ,*cc* ,@*cc-flags* "-static" "-o" ,output-file) - ;; "Solution": never link .a's into further .a's, only link .o's into .a's, - ;; which implied changes that are now the case in ASDF 3.2.0. - #+bsd ,@`("ar" "rcs" ,output-file) ;; NB: includes darwin - #+linux ,@`("ar" "rcsDT" ,output-file) - #+windows ,@`("lib" "-nologo" ,(strcat "-out:" (native-namestring output-file))) - ,@inputs)) - #-(or bsd linux windows) - (error "Not implemented on your system"))) - -(defun link-shared-library (output-file inputs) - ;; remove the library so we won't possibly be overwriting - ;; the code of any existing process - (delete-file-if-exists output-file) - #+ecl (c::build-shared-library output-file :lisp-files inputs) - #+mkcl (compiler::build-shared-library - output-file :lisp-object-files (mapcar 'program-argument inputs) - :on-missing-lisp-object-initializer nil) - #-(or ecl mkcl) - ;; Don't use a temporary file, because linking is sensitive to the output file name :-/ (or put it in a temporary directory?) - (apply 'invoke *ld* "-o" output-file - (append *ld-dll-flags* inputs))) - - -;;; Computing file names - -(defun make-c-file-name (output-defaults &optional suffix) - (make-pathname :type "c" - :name (strcat (pathname-name output-defaults) suffix) - :defaults output-defaults)) - -(defun make-o-file-name (output-defaults &optional suffix) - (make-pathname :type (bundle-pathname-type :object) - :name (format nil "~A~@[~A~]" (pathname-name output-defaults) suffix) - :defaults output-defaults)) - -(defun make-so-file-name (defaults) - (make-pathname :type (bundle-pathname-type :shared-library) - :defaults defaults)) - -(defun make-exe-file-name (defaults) - (make-pathname :type (bundle-pathname-type :program) - :defaults defaults)) - - -;;; Implement link-op on image-based platforms. -#-(or clasp ecl mkcl) -(defmethod perform ((o link-op) (c system)) - (let* ((inputs (input-files o c)) - (output (first (output-files o c))) - (kind (bundle-type o))) - (when output ;; some operations skip any output when there is no input - (ecase kind - (:program (link-executable output inputs)) - ((:lib :static-library) (link-static-library output inputs)) - ((:dll :shared-library) (link-shared-library output inputs)))))) - -(defclass c-file (source-file) - ((cflags :initarg :cflags :initform :default) - (type :initform "c"))) - -(defmethod output-files ((o compile-op) (c c-file)) - (let* ((i (first (input-files o c))) - (base (format nil "~(~{~a~^__~}~)" - (mapcar (lambda (x) (substitute-if #\_ (complement #'alphanumericp) x)) - (component-find-path c)))) - (path (make-pathname :defaults i :name base))) - (list (make-o-file-name path) - (make-so-file-name path)))) - -(defmethod perform ((o compile-op) (c c-file)) - (let ((i (first (input-files o c)))) - (destructuring-bind (.o .so) (output-files o c) - (cc-compile .o (list i)) - (link-shared-library .so (list .o))))) - -(defmethod perform ((o load-op) (c c-file)) - (let ((o (second (input-files o c)))) - (cffi:load-foreign-library (file-namestring o) :search-path (list (pathname-directory-pathname o))))) - -(setf (find-class 'asdf::c-file) (find-class 'c-file)) - -(defclass o-file (source-file) - ((cflags :initarg :cflags :initform :default) - (type :initform (bundle-pathname-type :object))) - (:documentation "class for pre-compile object components")) - -(defmethod output-files ((op compile-op) (c o-file)) - (let* ((o (first (input-files op c))) - (so (apply-output-translations (make-so-file-name o)))) - (values (list o so) t))) - -(defmethod perform ((o load-op) (c o-file)) - (let ((so (second (input-files o c)))) - (cffi:load-foreign-library (file-namestring so) :search-path (list (pathname-directory-pathname so))))) - -(setf (find-class 'asdf::o-file) (find-class 'o-file)) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/package.lisp deleted file mode 100644 index 3c3d4ed..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/package.lisp +++ /dev/null @@ -1,46 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; package.lisp --- Toolchain DEFPACKAGE. -;;; -;;; 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. -;;; - -(uiop:define-package #:cffi-toolchain - (:mix #:asdf #:uiop #:common-lisp) - (:import-from #:asdf/bundle - #:link-op #:bundle-pathname-type #:bundle-type - #:gather-operation #:gather-type) - (:export - ;; Variables - #:*cc* #:*cc-flags* - #:*ld* #:*ld-exe-flags* #:*ld-dll-flags* - #:*linkkit-start* #:*linkkit-end* - ;; Functions from c-toolchain - #:make-c-file-name #:make-o-file-name - #:make-so-file-name #:make-exe-file-name - #:parse-command-flags #:parse-command-flags-list - #:invoke #:invoke-build #:cc-compile - #:link-static-library #:link-shared-library - #:link-executable #:link-lisp-executable - ;; ASDF classes - #:c-file #:o-file - #:static-runtime-op #:static-image-op #:static-program-op - )) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/static-link.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/static-link.lisp deleted file mode 100644 index 020ab0d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/static-link.lisp +++ /dev/null @@ -1,95 +0,0 @@ -;; FIXME: arrange packages so that this can be moved in ASDF some time later? - -(in-package #:cffi-toolchain) - -(defun static-ops-enabled-p () - (ensure-toolchain-parameters) - (and (or *linkkit-start* *linkkit-end*) t)) - -(defclass static-runtime-op (monolithic-bundle-op link-op selfward-operation) () - (:documentation "Create a Lisp runtime linkable library for the system and its dependencies.")) -(defmethod bundle-type ((o static-runtime-op)) :program) -(defmethod selfward-operation ((o static-runtime-op)) 'monolithic-lib-op) - -(defmethod output-files ((o static-runtime-op) (s system)) - #-(or ecl mkcl) - (list (subpathname (component-pathname s) - (strcat (coerce-name s) "-runtime") - :type (bundle-pathname-type :program)))) - -(defmethod perform ((o static-runtime-op) (s system)) - (link-lisp-executable - (output-file o s) - (link-all-library (first (input-files o s))))) - -(defclass static-image-op (image-op) () - (:documentation "Create a statically linked standalone image for the system.")) -#-(or ecl mkcl) (defmethod selfward-operation ((o static-image-op)) '(load-op static-runtime-op)) -#+(or ecl mkcl) (defmethod gather-operation ((o static-image-op)) 'compile-op) -#+(or ecl mkcl) (defmethod gather-operation ((o static-image-op)) :object) - -(defclass static-program-op (program-op static-image-op) () - (:documentation "Create a statically linked standalone executable for the system.")) - -;; Problem? Its output may conflict with the program-op output :-/ - -#-(or ecl mkcl) -(defmethod perform ((o static-image-op) (s system)) - #-(or clisp sbcl) (error "Not implemented yet") - #+(or clisp sbcl) - (let* ((name (coerce-name s)) - (runtime (output-file 'static-runtime-op s)) - (image - #+clisp (implementation-file "base/lispinit.mem") - #+sbcl (subpathname (lisp-implementation-directory) "sbcl.core")) - (output (output-file o s)) - (child-op (if (typep o 'program-op) 'program-op 'image-op))) - (with-temporary-output (tmp output) - (apply 'invoke runtime - #+clisp "-M" #+sbcl "--core" image - `(#+clisp ,@'("--silent" "-ansi" "-norc" "-x") - #+sbcl ,@'("--noinform" "--non-interactive" "--no-sysinit" "--no-userinit" "--eval") - ,(with-safe-io-syntax (:package :asdf) - (let ((*print-pretty* nil) - (*print-case* :downcase)) - (format - ;; This clever staging allows to put things in a single form, - ;; as required for CLISP not to print output for the first form, - ;; yet allow subsequent forms to rely on packages defined by former forms. - nil "'(~@{#.~S~^ ~})" - '(require "asdf") - '(in-package :asdf) - `(progn - (setf asdf:*central-registry* ',asdf:*central-registry*) - (initialize-source-registry ',asdf::*source-registry-parameter*) - (initialize-output-translations ',asdf::*output-translations-parameter*) - (upgrade-asdf) - ,@(if-let (ql-home - (symbol-value (find-symbol* '*quicklisp-home* 'ql-setup nil))) - `((load ,(subpathname ql-home "setup.lisp")))) - (load-system "cffi-grovel") - ;; We force the (final step of the) operation to take place - (defmethod operation-done-p - ((operation ,child-op) (system (eql (find-system ,name)))) - nil) - ;; Some implementations (notably SBCL) die as part of dumping an image, - ;; so redirect output-files to desired destination, for this processs might - ;; never otherwise get a chance to move the file to destination. - (defmethod output-files - ((operation ,child-op) (system (eql (find-system ,name)))) - (values (list ,tmp) t)) - (operate ',child-op ,name) - (quit)))))))))) - -#+(or ecl mkcl) -(defmethod perform ((o static-image-op) (s system)) - (let (#+ecl - (c::*ld-flags* - (format nil "-Wl,--export-dynamic ~@[ ~A~]" - c::*ld-flags*))) - (call-next-method))) - -;; Allow for :static-FOO-op in ASDF definitions. -(setf (find-class 'asdf::static-runtime-op) (find-class 'static-runtime-op) - (find-class 'asdf::static-image-op) (find-class 'static-image-op) - (find-class 'asdf::static-program-op) (find-class 'static-program-op)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/uffi-compat/uffi-compat.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/uffi-compat/uffi-compat.lisp deleted file mode 100644 index ca67aa8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/uffi-compat/uffi-compat.lisp +++ /dev/null @@ -1,664 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; uffi-compat.lisp --- UFFI compatibility layer for CFFI. -;;; -;;; Copyright (C) 2005-2006, James Bielman -;;; Copyright (C) 2005-2007, Luis Oliveira -;;; -;;; 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. -;;; - -;;; Code borrowed from UFFI is Copyright (c) Kevin M. Rosenberg. - -(defpackage #:cffi-uffi-compat - (:nicknames #:uffi) ;; is this a good idea? - (:use #:cl) - (:export - - ;; immediate types - #:def-constant - #:def-foreign-type - #:def-type - #:null-char-p - - ;; aggregate types - #:def-enum - #:def-struct - #:get-slot-value - #:get-slot-pointer - #:def-array-pointer - #:deref-array - #:def-union - - ;; objects - #:allocate-foreign-object - #:free-foreign-object - #:with-foreign-object - #:with-foreign-objects - #:size-of-foreign-type - #:pointer-address - #:deref-pointer - #:ensure-char-character - #:ensure-char-integer - #:ensure-char-storable - #:null-pointer-p - #:make-null-pointer - #:make-pointer - #:+null-cstring-pointer+ - #:char-array-to-pointer - #:with-cast-pointer - #:def-foreign-var - #:convert-from-foreign-usb8 - #:def-pointer-var - - ;; string functions - #:convert-from-cstring - #:convert-to-cstring - #:free-cstring - #:with-cstring - #:with-cstrings - #:convert-from-foreign-string - #:convert-to-foreign-string - #:allocate-foreign-string - #:with-foreign-string - #:with-foreign-strings - #:foreign-string-length ; not implemented - #:string-to-octets - #:octets-to-string - #:foreign-encoded-octet-count - - ;; function call - #:def-function - - ;; libraries - #:find-foreign-library - #:load-foreign-library - #:default-foreign-library-type - #:foreign-library-types - - ;; os - #:getenv - #:run-shell-command - )) - -(in-package #:cffi-uffi-compat) - -#+clisp -(eval-when (:compile-toplevel :load-toplevel :execute) - (when (equal (machine-type) "POWER MACINTOSH") - (pushnew :ppc *features*))) - -(defun convert-uffi-type (uffi-type) - "Convert a UFFI primitive type to a CFFI type." - ;; Many CFFI types are the same as UFFI. This list handles the - ;; exceptions only. - (case uffi-type - (:cstring :pointer) - (:pointer-void :pointer) - (:pointer-self :pointer) - ;; Although UFFI's documentation claims dereferencing :CHAR and - ;; :UNSIGNED-CHAR returns characters, it actually returns - ;; integers. - (:char :char) - (:unsigned-char :unsigned-char) - (:byte :char) - (:unsigned-byte :unsigned-char) - (t - (if (listp uffi-type) - (case (car uffi-type) - ;; this is imho gross but it is what uffi does - (quote (convert-uffi-type (second uffi-type))) - (* :pointer) - (:array `(uffi-array ,(convert-uffi-type (second uffi-type)) - ,(third uffi-type))) - (:union (second uffi-type)) - (:struct (convert-uffi-type (second uffi-type))) - (:struct-pointer :pointer)) - uffi-type)))) - -(cffi:define-foreign-type uffi-array-type () - ;; ELEMENT-TYPE should be /unparsed/, suitable for passing to mem-aref. - ((element-type :initform (error "An element-type is required.") - :accessor element-type :initarg :element-type) - (nelems :initform (error "nelems is required.") - :accessor nelems :initarg :nelems)) - (:actual-type :pointer) - (:documentation "UFFI's :array type.")) - -(cffi:define-parse-method uffi-array (element-type count) - (make-instance 'uffi-array-type :element-type element-type - :nelems (or count 1))) - -(defmethod cffi:foreign-type-size ((type uffi-array-type)) - (* (cffi:foreign-type-size (element-type type)) (nelems type))) - -(defmethod cffi::aggregatep ((type uffi-array-type)) - t) - -;; UFFI's :(unsigned-)char -#+#:ignore -(cffi:define-foreign-type uffi-char () - ()) - -#+#:ignore -(cffi:define-parse-method uffi-char (base-type) - (make-instance 'uffi-char :actual-type base-type)) - -#+#:ignore -(defmethod cffi:translate-to-foreign ((value character) (type uffi-char)) - (char-code value)) - -#+#:ignore -(defmethod cffi:translate-from-foreign (obj (type uffi-char)) - (code-char obj)) - -(defmacro def-type (name type) - "Define a Common Lisp type NAME for UFFI type TYPE." - (declare (ignore type)) - `(deftype ,name () t)) - -(defmacro def-foreign-type (name type) - "Define a new foreign type." - `(cffi:defctype ,name ,(convert-uffi-type type))) - -(defmacro def-constant (name value &key export) - "Define a constant and conditionally export it." - `(eval-when (:compile-toplevel :load-toplevel :execute) - (defconstant ,name ,value) - ,@(when export `((export ',name))) - ',name)) - -(defmacro null-char-p (val) - "Return true if character is null." - `(zerop (char-code ,val))) - -(defmacro def-enum (enum-name args &key (separator-string "#")) - "Creates a constants for a C type enum list, symbols are -created in the created in the current package. The symbol is the -concatenation of the enum-name name, separator-string, and -field-name" - (let ((counter 0) - (cmds nil) - (constants nil)) - (declare (fixnum counter)) - (dolist (arg args) - (let ((name (if (listp arg) (car arg) arg)) - (value (if (listp arg) - (prog1 - (setq counter (cadr arg)) - (incf counter)) - (prog1 - counter - (incf counter))))) - (setq name (intern (concatenate 'string - (symbol-name enum-name) - separator-string - (symbol-name name)))) - (push `(def-constant ,name ,value) constants))) - (setf cmds (append '(progn) `((cffi:defctype ,enum-name :int)) - (nreverse constants))) - cmds)) - -(defmacro def-struct (name &body fields) - "Define a C structure." - `(cffi:defcstruct ,name - ,@(loop for (name uffi-type) in fields - for cffi-type = (convert-uffi-type uffi-type) - collect (list name cffi-type)))) - -;; TODO: figure out why the compiler macro is kicking in before -;; the setf expander. -(defun %foreign-slot-value (obj type field) - (cffi:foreign-slot-value obj `(:struct ,type) field)) - -(defun (setf %foreign-slot-value) (value obj type field) - (setf (cffi:foreign-slot-value obj `(:struct ,type) field) value)) - -(defmacro get-slot-value (obj type field) - "Access a slot value from a structure." - `(%foreign-slot-value ,obj ,type ,field)) - -;; UFFI uses a different function when accessing a slot whose -;; type is a pointer. We don't need that in CFFI so we use -;; foreign-slot-value too. -(defmacro get-slot-pointer (obj type field) - "Access a pointer slot value from a structure." - `(cffi:foreign-slot-value ,obj ,type ,field)) - -(defmacro def-array-pointer (name type) - "Define a foreign array type." - `(cffi:defctype ,name (uffi-array ,(convert-uffi-type type) 1))) - -(defmacro deref-array (array type position) - "Dereference an array." - `(cffi:mem-aref ,array - ,(if (constantp type) - `',(element-type (cffi::parse-type - (convert-uffi-type (eval type)))) - `(element-type (cffi::parse-type - (convert-uffi-type ,type)))) - ,position)) - -;; UFFI's documentation on DEF-UNION is a bit scarce, I'm not sure -;; if DEFCUNION and DEF-UNION are strictly compatible. -(defmacro def-union (name &body fields) - "Define a foreign union type." - `(cffi:defcunion ,name - ,@(loop for (name uffi-type) in fields - for cffi-type = (convert-uffi-type uffi-type) - collect (list name cffi-type)))) - -(defmacro allocate-foreign-object (type &optional (size 1)) - "Allocate one or more instance of a foreign type." - `(cffi:foreign-alloc ,(if (constantp type) - `',(convert-uffi-type (eval type)) - `(convert-uffi-type ,type)) - :count ,size)) - -(defmacro free-foreign-object (ptr) - "Free a foreign object allocated by ALLOCATE-FOREIGN-OBJECT." - `(cffi:foreign-free ,ptr)) - -(defmacro with-foreign-object ((var type) &body body) - "Wrap the allocation of a foreign object around BODY." - `(cffi:with-foreign-object (,var (convert-uffi-type ,type)) - ,@body)) - -;; Taken from UFFI's src/objects.lisp -(defmacro with-foreign-objects (bindings &rest body) - (if bindings - `(with-foreign-object ,(car bindings) - (with-foreign-objects ,(cdr bindings) - ,@body)) - `(progn ,@body))) - -(defmacro size-of-foreign-type (type) - "Return the size in bytes of a foreign type." - `(cffi:foreign-type-size (convert-uffi-type ,type))) - -(defmacro pointer-address (ptr) - "Return the address of a pointer." - `(cffi:pointer-address ,ptr)) - -(defmacro deref-pointer (ptr type) - "Dereference a pointer." - `(cffi:mem-ref ,ptr (convert-uffi-type ,type))) - -(defsetf deref-pointer (ptr type) (value) - `(setf (cffi:mem-ref ,ptr (convert-uffi-type ,type)) ,value)) - -(defmacro ensure-char-character (obj &environment env) - "Convert OBJ to a character if it is an integer." - (if (constantp obj env) - (if (characterp obj) obj (code-char obj)) - (let ((obj-var (gensym))) - `(let ((,obj-var ,obj)) - (if (characterp ,obj-var) - ,obj-var - (code-char ,obj-var)))))) - -(defmacro ensure-char-integer (obj &environment env) - "Convert OBJ to an integer if it is a character." - (if (constantp obj env) - (let ((the-obj (eval obj))) - (if (characterp the-obj) (char-code the-obj) the-obj)) - (let ((obj-var (gensym))) - `(let ((,obj-var ,obj)) - (if (characterp ,obj-var) - (char-code ,obj-var) - ,obj-var))))) - -(defmacro ensure-char-storable (obj) - "Ensure OBJ is storable as a character." - `(ensure-char-integer ,obj)) - -(defmacro make-null-pointer (type) - "Create a NULL pointer." - (declare (ignore type)) - `(cffi:null-pointer)) - -(defmacro make-pointer (address type) - "Create a pointer to ADDRESS." - (declare (ignore type)) - `(cffi:make-pointer ,address)) - -(defmacro null-pointer-p (ptr) - "Return true if PTR is a null pointer." - `(cffi:null-pointer-p ,ptr)) - -(defparameter +null-cstring-pointer+ (cffi:null-pointer) - "A constant NULL string pointer.") - -(defmacro char-array-to-pointer (obj) - obj) - -(defmacro with-cast-pointer ((var ptr type) &body body) - "Cast a pointer, does nothing in CFFI." - (declare (ignore type)) - `(let ((,var ,ptr)) - ,@body)) - -(defmacro def-foreign-var (name type module) - "Define a symbol macro to access a foreign variable." - (declare (ignore module)) - (flet ((lisp-name (name) - (intern (cffi-sys:canonicalize-symbol-name-case - (substitute #\- #\_ name))))) - `(cffi:defcvar ,(if (listp name) - name - (list name (lisp-name name))) - ,(convert-uffi-type type)))) - -(defmacro def-pointer-var (name value &optional doc) - #-openmcl `(defvar ,name ,value ,@(if doc (list doc))) - #+openmcl `(ccl::defloadvar ,name ,value ,doc)) - -(defmacro convert-from-cstring (s) - "Convert a cstring to a Lisp string." - (let ((ret (gensym))) - `(let ((,ret (cffi:foreign-string-to-lisp ,s))) - (if (equal ,ret "") - nil - ,ret)))) - -(defmacro convert-to-cstring (obj) - "Convert a Lisp string to a cstring." - (let ((str (gensym))) - `(let ((,str ,obj)) - (if (null ,str) - (cffi:null-pointer) - (cffi:foreign-string-alloc ,str))))) - -(defmacro free-cstring (ptr) - "Free a cstring." - `(cffi:foreign-string-free ,ptr)) - -(defmacro with-cstring ((foreign-string lisp-string) &body body) - "Binds a newly creating string." - (let ((str (gensym)) (body-proc (gensym))) - `(flet ((,body-proc (,foreign-string) ,@body)) - (let ((,str ,lisp-string)) - (if (null ,str) - (,body-proc (cffi:null-pointer)) - (cffi:with-foreign-string (,foreign-string ,str) - (,body-proc ,foreign-string))))))) - -;; Taken from UFFI's src/strings.lisp -(defmacro with-cstrings (bindings &rest body) - (if bindings - `(with-cstring ,(car bindings) - (with-cstrings ,(cdr bindings) - ,@body)) - `(progn ,@body))) - -(defmacro def-function (name args &key module (returning :void)) - "Define a foreign function." - (declare (ignore module)) - `(cffi:defcfun ,name ,(convert-uffi-type returning) - ,@(loop for (name type) in args - collect `(,name ,(convert-uffi-type type))))) - -;;; Taken from UFFI's src/libraries.lisp - -(defvar *loaded-libraries* nil - "List of foreign libraries loaded. Used to prevent reloading a library") - -(defun default-foreign-library-type () - "Returns string naming default library type for platform" - #+(or win32 cygwin mswindows) "dll" - #+(or macos macosx darwin ccl-5.0) "dylib" - #-(or win32 cygwin mswindows macos macosx darwin ccl-5.0) "so") - -(defun foreign-library-types () - "Returns list of string naming possible library types for platform, -sorted by preference" - #+(or win32 cygwin mswindows) '("dll" "lib" "so") - #+(or macos macosx darwin ccl-5.0) '("dylib" "bundle") - #-(or win32 cygwin mswindows macos macosx darwin ccl-5.0) '("so" "a" "o")) - -(defun find-foreign-library (names directories &key types drive-letters) - "Looks for a foreign library. directories can be a single -string or a list of strings of candidate directories. Use default -library type if type is not specified." - (unless types - (setq types (foreign-library-types))) - (unless (listp types) - (setq types (list types))) - (unless (listp names) - (setq names (list names))) - (unless (listp directories) - (setq directories (list directories))) - #+(or win32 mswindows) - (unless (listp drive-letters) - (setq drive-letters (list drive-letters))) - #-(or win32 mswindows) - (setq drive-letters '(nil)) - (dolist (drive-letter drive-letters) - (dolist (name names) - (dolist (dir directories) - (dolist (type types) - (let ((path (make-pathname - #+lispworks :host - #+lispworks (when drive-letter drive-letter) - #-lispworks :device - #-lispworks (when drive-letter drive-letter) - :name name - :type type - :directory - (etypecase dir - (pathname - (pathname-directory dir)) - (list - dir) - (string - (pathname-directory - (parse-namestring dir))))))) - (when (probe-file path) - (return-from find-foreign-library path))))))) - nil) - -(defun convert-supporting-libraries-to-string (libs) - (let (lib-load-list) - (dolist (lib libs) - (push (format nil "-l~A" lib) lib-load-list)) - (nreverse lib-load-list))) - -(defun load-foreign-library (filename &key module supporting-libraries - force-load) - #+(or allegro mcl sbcl clisp) (declare (ignore module supporting-libraries)) - #+(or cmucl scl sbcl) (declare (ignore module)) - - (when (and filename (or (null (pathname-directory filename)) - (probe-file filename))) - (if (pathnamep filename) ;; ensure filename is a string to check if - (setq filename (namestring filename))) ; already loaded - - (if (and (not force-load) - (find filename *loaded-libraries* :test #'string-equal)) - t ;; return T, but don't reload library - (progn - ;; FIXME: Hmm, what are these two for? - #+cmucl - (let ((type (pathname-type (parse-namestring filename)))) - (if (string-equal type "so") - (sys::load-object-file filename) - (alien:load-foreign filename - :libraries - (convert-supporting-libraries-to-string - supporting-libraries)))) - #+scl - (let ((type (pathname-type (parse-namestring filename)))) - (if (string-equal type "so") - (sys::load-dynamic-object filename) - (alien:load-foreign filename - :libraries - (convert-supporting-libraries-to-string - supporting-libraries)))) - - #-(or cmucl scl) - (cffi:load-foreign-library filename) - (push filename *loaded-libraries*) - t)))) - -;; Taken from UFFI's src/os.lisp -(defun getenv (var) - "Return the value of the environment variable." - #+allegro (sys::getenv (string var)) - #+clisp (sys::getenv (string var)) - #+(or cmucl scl) (cdr (assoc (string var) ext:*environment-list* :test #'equalp - :key #'string)) - #+(or ecl gcl) (si:getenv (string var)) - #+lispworks (lw:environment-variable (string var)) - #+lucid (lcl:environment-variable (string var)) - #+(or mcl ccl) (ccl::getenv var) - #+sbcl (sb-ext:posix-getenv var) - #-(or allegro clisp cmucl ecl scl gcl lispworks lucid mcl ccl sbcl) - (error 'not-implemented :proc (list 'getenv var))) - -;; Taken from UFFI's src/os.lisp -;; modified from function ASDF -- Copyright Dan Barlow and Contributors -(defun run-shell-command (control-string &rest args) - "Interpolate ARGS into CONTROL-STRING as if by FORMAT, and -synchronously execute the result using a Bourne-compatible shell, with -output to *trace-output*. Returns the shell's exit code." - (let ((command (apply #'format nil control-string args)) - (output *trace-output*)) - #+sbcl - (sb-impl::process-exit-code - (sb-ext:run-program - "/bin/sh" - (list "-c" command) - :input nil :output output)) - - #+(or cmucl scl) - (ext:process-exit-code - (ext:run-program - "/bin/sh" - (list "-c" command) - :input nil :output output)) - - #+allegro - (excl:run-shell-command command :input nil :output output) - - #+lispworks - (system:call-system-showing-output - command - :shell-type "/bin/sh" - :output-stream output) - - #+clisp ;XXX not exactly *trace-output*, I know - (ext:run-shell-command command :output :terminal :wait t) - - #+openmcl - (nth-value 1 - (ccl:external-process-status - (ccl:run-program "/bin/sh" (list "-c" command) - :input nil :output output - :wait t))) - - #+ecl - (nth-value 1 - (ext:run-program - "/bin/sh" (list "-c" command) - :input nil :output output :error nil :wait t)) - - #-(or openmcl ecl clisp lispworks allegro scl cmucl sbcl) - (error "RUN-SHELL-PROGRAM not implemented for this Lisp") - )) - -;;; Some undocumented UFFI operators... - -(defmacro convert-from-foreign-string - (obj &key length (locale :default) - (encoding 'cffi:*default-foreign-encoding*) - (null-terminated-p t)) - ;; in effect, (eq NULL-TERMINATED-P (null LENGTH)). Hopefully, - ;; that's compatible with the intended semantics, which are - ;; undocumented. If that's not the case, we can implement - ;; NULL-TERMINATED-P in CFFI:FOREIGN-STRING-TO-LISP. - (declare (ignore locale null-terminated-p)) - (let ((ret (gensym))) - `(let ((,ret (cffi:foreign-string-to-lisp ,obj - :count ,length - :encoding ,encoding))) - (if (equal ,ret "") - nil - ,ret)))) - -;; What's the difference between this and convert-to-cstring? -(defmacro convert-to-foreign-string - (obj &optional (encoding 'cffi:*default-foreign-encoding*)) - (let ((str (gensym))) - `(let ((,str ,obj)) - (if (null ,str) - (cffi:null-pointer) - (cffi:foreign-string-alloc ,str :encoding ,encoding))))) - -(defmacro allocate-foreign-string (size &key unsigned) - (declare (ignore unsigned)) - `(cffi:foreign-alloc :char :count ,size)) - -;; Ditto. -(defmacro with-foreign-string ((foreign-string lisp-string) &body body) - (let ((str (gensym))) - `(let ((,str ,lisp-string)) - (if (null ,str) - (let ((,foreign-string (cffi:null-pointer))) - ,@body) - (cffi:with-foreign-string (,foreign-string ,str) - ,@body))))) - -(defmacro with-foreign-strings (bindings &body body) - `(with-foreign-string ,(car bindings) - ,@(if (cdr bindings) - `((with-foreign-strings ,(cdr bindings) ,@body)) - body))) - -;; This function returns a form? Where is this used in user-code? -(defun foreign-string-length (foreign-string) - (declare (ignore foreign-string)) - (error "FOREIGN-STRING-LENGTH not implemented.")) - -;; This should be optimized. -(defun convert-from-foreign-usb8 (s len) - (let ((a (make-array len :element-type '(unsigned-byte 8)))) - (dotimes (i len a) - (setf (aref a i) (cffi:mem-ref s :unsigned-char i))))) - -;;;; String Encodings - -(defmacro string-to-octets (str &key encoding null-terminate) - `(babel:concatenate-strings-to-octets - (or ,encoding cffi:*default-foreign-encoding*) - ,str - (if ,null-terminate - #.(string #\Nul) - ""))) - -(defmacro octets-to-string (octets &key encoding) - `(babel:octets-to-string ,octets - :encoding (or ,encoding - cffi:*default-foreign-encoding*))) - -(defun foreign-encoded-octet-count (str &key encoding) - (babel:string-size-in-octets str - :encoding (or encoding - cffi:*default-foreign-encoding*))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/uffi-compat/uffi.asd b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/uffi-compat/uffi.asd deleted file mode 100644 index 4d31c50..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/uffi-compat/uffi.asd +++ /dev/null @@ -1,3 +0,0 @@ -;;;; uffi.asd -*- Mode: Lisp -*- - -(defsystem uffi :depends-on (cffi-uffi-compat)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/.travis.yml b/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/.travis.yml deleted file mode 100644 index 033c340..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -before_script: - - curl -O -L http://prdownloads.sourceforge.net/sbcl/sbcl-1.2.6-x86-64-linux-binary.tar.bz2 - - tar xjf sbcl-1.2.6-x86-64-linux-binary.tar.bz2 - - pushd sbcl-1.2.6-x86-64-linux/ && sudo bash install.sh && popd - - curl -O -L http://beta.quicklisp.org/quicklisp.lisp - - sbcl --load quicklisp.lisp --eval '(quicklisp-quickstart:install)' --eval '(quit)' - - curl -OL http://ccl.clozure.com/ftp/pub/release/1.10/ccl-1.10-linuxx86.tar.gz - - tar xzf ccl-1.10-linuxx86.tar.gz - - export PATH=`pwd`/ccl:$PATH -# - lx86cl64 -b --load quicklisp.lisp --eval '(progn (quicklisp-quickstart:install) (quit))' - -script: - - ./ci-test-run.sh \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/README.md b/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/README.md deleted file mode 100644 index 45fad05..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/README.md +++ /dev/null @@ -1,140 +0,0 @@ -# cl-ansi-text - -Because color in your terminal is nice. -[![Build Status](https://travis-ci.org/pnathan/cl-ansi-text.svg?branch=master)](https://travis-ci.org/pnathan/cl-ansi-text) - -## Usage example - -```lisp -* (ql:quickload :cl-ansi-text) -;To load "cl-ansi-text": -; Load 1 ASDF system: -; cl-ansi-text -;; Loading "cl-ansi-text" -; => (:CL-ANSI-TEXT) -``` - -The main macro is called `with-color`, which creates an enviroment where everything that is put on `stream` gets colored according to `color`. Color options are `:black`, `:red`, `:green`, `:yellow`, `:blue`, `:magenta`, `:cyan` and `:white`. You can also use a color structure from `CL-COLORS`, like `cl-colors:+red+`. - -```lisp -* (import 'cl-ansi-text:with-color) -; => T -* (with-color (:red) - (princ "Gets printed red...") - (princ "and this too!")) -; Gets printed red...and this too! -; => "and this too!" -``` - -There are also functions with the name of the colors, that return the string, colored: -```lisp -* (import 'cl-ansi-text:yellow) -; => T -* (yellow "Yellow string") -; => "Yellow string" -* (princ (yellow "String with yellow background" :style :background)) -; "String with yellow background" -; => "String with yellow background" -* (import 'cl-ansi-text:red) -; => T -* (princ - (concatenate - 'string - (yellow "Five") " test results went " (red "terribly wrong") "!")) -; Five test results went terribly wrong! -; => "Five test results went terribly wrong!" -``` -At any point, you can bind the `*enabled*` special variable to `nil`, and anything inside that binding will not be printed colorfully: -```lisp -* (let (cl-ansi-text:*enabled*) - (princ (red "This string is printed normally"))) -``` - -# API - - -## BLUE - -Returns a string with the `blue'string denotation preppended and the `reset' string denotation appended. - -*enabled* dynamically controls the function. - -## MAGENTA - -Returns a string with the `magenta'string denotation preppended and the `reset' string denotation appended. - -*enabled* dynamically controls the function. - -## CYAN - -Returns a string with the `cyan'string denotation preppended and the `reset' string denotation appended. - -*enabled* dynamically controls the function. - -## GREEN - -Returns a string with the `green'string denotation preppended and the `reset' string denotation appended. - -*enabled* dynamically controls the function. - -## WITH-COLOR - -Writes out the string denoting a switch to `color`, executes body, -then writes out the string denoting a `reset`. - -*enabled* dynamically controls expansion.. - -## YELLOW - -Returns a string with the `yellow'string denotation preppended and the `reset' string denotation appended. - -*enabled* dynamically controls the function. - -## BLACK - -Returns a string with the `black'string denotation preppended and the `reset' string denotation appended. - -*enabled* dynamically controls the function. - -## *ENABLED* - -Turns on/off the colorization of functions - -## MAKE-COLOR-STRING - -Takes either a cl-color or a list denoting the ANSI colors and -returns a string sufficient to change to the given color. - -Will be dynamically controlled by *enabled* unless manually specified -otherwise - -## RED - -Returns a string with the `red'string denotation preppended and the `reset' string denotation appended. - -*enabled* dynamically controls the function. - -## WHITE - -Returns a string with the `white'string denotation preppended and the `reset' string denotation appended. - -*enabled* dynamically controls the function. - -## +RESET-COLOR-STRING+ - -This string will reset ANSI colors - - -# Note - -Note that your terminal MUST be ANSI-compliant to show these -colors. My SLIME REPL (as of Feb 2013) does not display these -colors. I have to use a typical Linux/OSX terminal to see them. - -This has been tested to work on a Linux system with SBCL, CLISP and -CCL. CCL may not work quite perfectly, some level of conniptions were -encountered in testing. The interested reader is advised to check the -MAKE-LOAD-FORM defmethod in cl-ansi-text.lisp. - -An earlier variant was tested on OSX 10.6 with SBCL. - -License: LLGPL diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/ci-test-run.sh b/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/ci-test-run.sh deleted file mode 100644 index 25e8107..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/ci-test-run.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -error=0 -if which sbcl; then - echo "CI run using SBCL" - sbcl --script run-tests.lisp - error=$? -fi - -if which lx86cl64; then - echo "CI run using CCL" - lx86cl64 -b --load run-tests.lisp - error=$(($error+$?)) -fi - -exit $error diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/cl-ansi-text-test.asd b/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/cl-ansi-text-test.asd deleted file mode 100644 index 73cee9c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/cl-ansi-text-test.asd +++ /dev/null @@ -1,11 +0,0 @@ -(asdf:defsystem #:cl-ansi-text-test - :depends-on ( #:cl-colors #:alexandria #:cl-ansi-text #:fiveam) - :components ((:module "test" - :components - ((:file "cl-ansi-text-test")))) - :name "cl-ansi-text-test" - :version "1.0" - :maintainer "Paul Nathan" - :author "Paul Nathan" - :licence "LLGPL" - :description "Test system for cl-ansi-text") diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/cl-ansi-text.asd b/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/cl-ansi-text.asd deleted file mode 100644 index a29781f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/cl-ansi-text.asd +++ /dev/null @@ -1,11 +0,0 @@ -(asdf:defsystem #:cl-ansi-text - :depends-on ( #:cl-colors #:alexandria) - :components ((:file "cl-ansi-text")) - :name "cl-ansi-text" - :version "1.0" - :maintainer "Paul Nathan" - :author "Paul Nathan" - :licence "LLGPL" - :description "ANSI control string characters, focused on color" - :long-description "ANSI control string management, specializing in - colors. Sometimes it is nice to have text output in colors") diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/cl-ansi-text.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/cl-ansi-text.lisp deleted file mode 100644 index 7cba11c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/cl-ansi-text.lisp +++ /dev/null @@ -1,285 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Paul Nathan 2013 -;;;; cl-ansi-text.lisp -;;;; -;;;; Portions of this code were written by taksatou under the -;;;; cl-rainbow name. -;;;; -;;;; A library to produce ANSI escape sequences. Particularly, -;;;; produces colorized text on terminals - -(defpackage :cl-ansi-text - (:use :common-lisp) - (:export - #:with-color - #:make-color-string - #:+reset-color-string+ - #:*enabled* - #:black - #:red - #:green - #:yellow - #:blue - #:magenta - #:cyan - #:white)) -(in-package :cl-ansi-text) - -;;; !!! NOTE TO CCL USERS !!! -;;; -;;; This seems to be *required* to make this compile in CCL. The -;;; reason is that CCL expects to be able to inline on compile, but -;;; structs don't set up that infrastructure by default. -;;; -;;; At least from the thread "Compiler problem, MCL 3.9" by Arthur -;;; Cater around '96. -#+ccl(common-lisp:eval-when (:compile-toplevel :load-toplevel :execute) - (defmethod make-load-form ((obj cl-colors:rgb ) &optional env) - (make-load-form-saving-slots obj))) - -(defparameter *enabled* t - "Turns on/off the colorization of functions") - -(defparameter +reset-color-string+ - (concatenate 'string (list (code-char 27) #\[ #\0 #\m)) - "This string will reset ANSI colors") - -(defvar +cl-colors+ - (vector - cl-colors:+black+ - cl-colors:+red+ - cl-colors:+green+ - cl-colors:+yellow+ - cl-colors:+blue+ - cl-colors:+magenta+ - cl-colors:+cyan+ - cl-colors:+white+) - "CL-COLORS colors") - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defparameter +term-colors+ - (vector - :black - :red - :green - :yellow - :blue - :magenta - :cyan - :white) - "Basic colors")) - -(defparameter +text-style+ - '((:foreground . 30) - (:background . 40)) - "One or the other. Not an ANSI effect") - -(defparameter +term-effects+ - '((:unset . t) - (:reset . 0) - (:bright . 1) - (:italic . 3) - (:underline . 4) - (:blink . 5) - (:inverse . 7) - (:hide . 8) - (:normal . 22) - (:framed . 51) - (:encircled . 52) - (:overlined . 53) - (:not-framed-or-circled . 54) - (:not-overlined . 55)) - "ANSI terminal effects") - -(defun eq-colors (a b) - "Equality for cl-colors" - - ;; CL-COLORS LIB! - - ;; eql, equal doesn't quite work for compiled cl-colors on CCL - (and - (= (cl-colors:rgb-red a) - (cl-colors:rgb-red b)) - (= (cl-colors:rgb-green a) - (cl-colors:rgb-green b)) - (= (cl-colors:rgb-blue a) - (cl-colors:rgb-blue b)))) - -(defun cl-colors-to-ansi (color) - (position color +cl-colors+ :test #'eq-colors)) - -(defun term-colors-to-ansi (color) - (position color +term-colors+)) - - - -;; Find-X-code is the top-level interface for code-finding - -(defun find-color-code (color) - "Find the list denoting the color" - (typecase color - ;; Did we get a cl-color that we know about? - (cl-colors:rgb (cl-colors-to-ansi color)) - (symbol (term-colors-to-ansi color)))) - -(defun find-effect-code (effect) - "Returns the number for the text effect OR -t if no effect should be used OR -nil if the effect is unknown. - -effect should be a member of +term-effects+" - (cdr (assoc effect +term-effects+))) - -(defun find-style-code (style) - (cdr (assoc style +text-style+))) - -(defun rgb-code-p (color) - (typecase color - (list t) - (integer t))) - -(defun generate-control-string (code) - "General ANSI code" - (format nil "~c[~a" (code-char #o33) code)) - -(defun generate-color-string (code) - ;; m is the action character for color - (format nil "~am" (generate-control-string code))) - -(defun build-control-string (color - &optional - (effect :unset) - (style :foreground)) - "Color (cl-color or term-color) -Effect -Style" - (let ((effect-code (find-effect-code effect)) - (color-code (find-color-code color)) - (style-code (find-style-code style))) - - ;; Nil here indicates an error - (assert effect-code) - (assert style-code) - - ;; Returns a list for inspection; next layer turns it back into a - ;; string. - (concatenate - 'list - ;; We split between RGB and 32-color here; this preserves the - ;; interface without cluttering the 32-color code up. - ;; - (let ((codes nil)) - (unless (eq effect-code t) - (setf codes (cons effect-code codes))) - (if (rgb-code-p color) - (setf codes (cons (rgb-color-code color style) codes)) - (setf codes (cons (+ style-code color-code) codes))) - - (generate-color-string (format nil "~{~A~^;~}" codes)))))) - -;; Public callables. - -(defun make-color-string (color &key - (effect :unset) - (style :foreground) - ((enabled *enabled*) *enabled*)) - "Takes either a cl-color or a list denoting the ANSI colors and -returns a string sufficient to change to the given color. - -Will be dynamically controlled by *enabled* unless manually specified -otherwise" - (when *enabled* - (concatenate 'string - (build-control-string color effect style)))) - -(defmacro with-color ((color &key - (stream t) - (effect :unset) - (style :foreground)) - &body body) - "Writes out the string denoting a switch to `color`, executes body, -then writes out the string denoting a `reset`. - -*enabled* dynamically controls expansion.." - `(progn - (when *enabled* - (format ,stream "~a" (make-color-string ,color - :effect ,effect - :style ,style))) - (unwind-protect - (progn - ,@body) - (when *enabled* - (format ,stream "~a" +reset-color-string+))))) - -(defmacro gen-color-functions (color-names-vector) - `(progn - ,@(map 'list - (lambda (color) - `(defun ,(intern (symbol-name color)) (string &key - (effect :unset) - (style :foreground)) - ,(concatenate - 'string - "Returns a string with the `" (string-downcase color) - "'string denotation preppended and the `reset' string denotation appended. - -*enabled* dynamically controls the function." ) - (concatenate - 'string - (when *enabled* - (format nil "~a" (make-color-string ,color - :effect effect - :style style))) - string - (when *enabled* - (format nil "~a" +reset-color-string+))))) - color-names-vector))) - -(gen-color-functions #.(coerce +term-colors+ 'list)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; RGB color codes for some enhanced terminals - -;;; http://www.frexx.de/xterm-256-notes/ -(defun rgb-to-ansi (red green blue) - (let ((ansi-domain (mapcar #'(lambda (x) - (floor (* 6 (/ x 256.0)))) - (list red green blue)))) - (+ 16 - (* 36 (first ansi-domain)) - (* 6 (second ansi-domain)) - (third ansi-domain)))) - -(defun code-from-rgb (style red green blue) - (format nil "~d;5;~d" - (if (eql style :foreground) 38 48) - (rgb-to-ansi red green blue))) - - -(defgeneric rgb-color-code (color &optional style) - (:documentation - "Returns the 256-color code suitable for rendering on the Linux -extensions to xterm")) - -(defmethod rgb-color-code ((color list) &optional (style :foreground)) - (unless (consp color) - (error "~a must be a three-integer list" color)) - - (unless (and (integerp (first color)) - (integerp (second color)) - (integerp (second color))) - (error "~a must have three integers" color)) - - (code-from-rgb style - (first color) - (second color) - (third color))) - -(defmethod rgb-color-code ((color integer) &optional (style :foreground)) - ;; Takes RGB integer ala Web integers - (code-from-rgb style - ;; classic bitmask - (ash (logand color #xff0000) -16) - (ash (logand color #x00ff00) -8) - (logand color #x0000ff))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/run-tests.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/run-tests.lisp deleted file mode 100644 index f369b89..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/run-tests.lisp +++ /dev/null @@ -1,29 +0,0 @@ -#-quicklisp -(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp" - (user-homedir-pathname)))) - (when (probe-file quicklisp-init) - (load quicklisp-init))) - -#+sbcl(require "sb-posix") - -(defparameter *pwd* - (concatenate 'string - (progn #+sbcl(sb-posix:getcwd) - #+ccl(ccl::current-directory-name)) - "/")) - -(push *pwd* asdf:*central-registry*) - - -(ql:quickload '(:cl-colors - :alexandria - :fiveam - - :cl-ansi-text - :cl-ansi-text-test)) - -(let ((result-status (cl-ansi-text-test::ci-run))) - (let ((posix-status - (if result-status 0 1))) - #+sbcl(sb-posix:exit posix-status) - #+ccl (quit posix-status))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/test/cl-ansi-text-test.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/test/cl-ansi-text-test.lisp deleted file mode 100644 index 20cfc04..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ansi-text-20150804-git/test/cl-ansi-text-test.lisp +++ /dev/null @@ -1,123 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; test suite for cl-ansi-text - -(defpackage :cl-ansi-text-test - (:use :common-lisp - :cl-user - :cl-ansi-text - :fiveam)) - -(in-package :cl-ansi-text-test) -(use-package :fiveam) -(use-package :cl-ansi-text) - -(def-suite test-suite - :description "test suite.") - -(in-suite test-suite) - - -(test basic-color-strings - "Test the basic stuff" - (is (equal '(#\Esc #\[ #\3 #\1 #\m) - (cl-ansi-text::build-control-string :red :unset :foreground))) - (is (equal '(#\Esc #\[ #\4 #\1 #\m) - (cl-ansi-text::build-control-string :red :unset :background))) - (is (equal '(#\Esc #\[ #\4 #\2 #\; #\1 #\m) - (cl-ansi-text::build-control-string :green :bright :background)))) - -(test enabled-connectivity - "Test *enabled*'s capability" - (is (equal '(#\Esc #\[ #\3 #\1 #\m) - (let ((*enabled* t)) - (concatenate - 'list - (cl-ansi-text:make-color-string :red))))) - (is (equal '() - (let ((*enabled* nil)) - (concatenate - 'list - (cl-ansi-text:make-color-string :red))))) - (is (equal "hi" - (let ((*enabled* nil)) - (with-output-to-string (s) - (with-color (:red :stream s) (format s "hi")))))) - (is (equal '(#\Esc #\[ #\3 #\1 #\m #\T #\e #\s #\t #\! #\Esc #\[ #\0 #\m) - (concatenate - 'list - (with-output-to-string (s) - (with-color (:red :stream s) - (format s "Test!"))))))) - -(test rgb-suite - "Test RGB colors" - (is (equal '(#\Esc #\[ #\3 #\8 #\; #\5 #\; #\2 #\1 #\4 #\m) - (cl-ansi-text::build-control-string #xFFAA00 - :unset :foreground))) - (is (equal '(#\Esc #\[ #\4 #\8 #\; #\5 #\; #\2 #\1 #\4 #\m) - (cl-ansi-text::build-control-string #xFFAA00 - :unset :background))) - (is (equal '(#\Esc #\[ #\4 #\8 #\; #\5 #\; #\1 #\6 #\m) - (cl-ansi-text::build-control-string #x000000 - :unset :background))) - (is (equal '(#\Esc #\[ #\4 #\8 #\; #\5 #\; #\2 #\3 #\1 #\m) - (cl-ansi-text::build-control-string #xFFFFFF - :unset :background)))) - -(test color-named-functions - (let ((str "Test string.")) - (is (equal (black str) - (with-output-to-string (s) - (with-color (:black :stream s) - (format s str))))) - (is (equal (red str) - (with-output-to-string (s) - (with-color (:red :stream s) - (format s str))))) - - (is (equal (green str) - (with-output-to-string (s) - (with-color (:green :stream s) - (format s str))))) - - (is (equal (yellow str) - (with-output-to-string (s) - (with-color (:yellow :stream s) - (format s str))))) - (is (equal (blue str) - (with-output-to-string (s) - (with-color (:blue :stream s) - (format s str))))) - (is (equal (magenta str) - (with-output-to-string (s) - (with-color (:magenta :stream s) - (format s str))))) - (is (equal (cyan str) - (with-output-to-string (s) - (with-color (:cyan :stream s) - (format s str))))) - (is (equal (white str) - (with-output-to-string (s) - (with-color (:white :stream s) - (format s str))))))) - -(test color-named-functions-*enabled* - (let ((str "Other test string.") - (*enabled* nil)) - (is - (equal str - (white (cyan (magenta (blue (yellow (green (red (black str)))))))))))) - -(defun run-tests () - (let ((results (run 'test-suite))) - (explain! results) - (if (position-if #'(lambda (e) - (eq (type-of e) - 'IT.BESE.FIVEAM::TEST-FAILURE - )) - results) - nil - t))) - -(defun ci-run () - (run-tests)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/Makefile b/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/Makefile deleted file mode 100644 index 1bdcd80..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -## note: this works on my system, you don't need to run it because the -## distribution contains the generated file - -SBCL=/usr/bin/sbcl - -colornames.lisp: /usr/share/X11/rgb.txt parse-x11-colors.lisp - rm -f colornames.lisp - $(SBCL) --load parse-x11-colors.lisp --eval '(quit)' diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/README.org b/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/README.org deleted file mode 100644 index d87c1ed..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/README.org +++ /dev/null @@ -1,43 +0,0 @@ -*IMPORTANT* This library is [[https://tpapp.github.io/post/orphaned-lisp-libraries/][unsupported]]. - -* cl-colors: a simple color library for Common Lisp - -This is a very simple color library for Common Lisp, providing - -1. Types for representing colors in HSV and RGB spaces. -2. Simple conversion functions between the above types (and also hexadecimal representation for RGB). -3. Some predefined colors (currently X11 color names -- of course the library does not depend on X11). - -** Examples - -#+BEGIN_SRC lisp -(let ((color1 (hsv 107 62/100 52/100)) ; greenish - (color2 (rgb 14/15 26/51 14/15)) ; = violet from X11 - (color3 (as-rgb "ff9e00"))) ; from hexadecimal - (list ; - (as-rgb color1) ; converting to RGB - (rgb-combination color1 +blue+ 0.4) ; HSV autoconverted to RGB - (hsv-combination color2 +blue+ 0.4) ; RGB autoconverted to HSV - color3)) -#+END_SRC -evaluates to -#+BEGIN_EXAMPLE -'(#S(RGB :RED 20059/75000 :GREEN 13/25 :BLUE 247/1250) - #S(RGB :RED 0.160472 :GREEN 0.312 :BLUE 0.51856) ; observe float contagion - #S(HSV :HUE 60.0 :SATURATION 0.6722689 :VALUE 0.96000004) - #S(RGB :RED 1 :GREEN 158/255 :BLUE 0)) -#+END_EXAMPLE - -Observe the float contagion: =cl-colors= functions don't care about the type of the numbers as long as they are a subtype of =real= and within the right range. - -** Documentation - -This library is so simple that it does not need a lot of documentation --- just look at the docsstrings in =colors.lisp=. - -** Regeneration of the X11 color names - -Normally you should not need to do this, the sources already contain the autogenerated file =colornames.lisp=. However, if for some reason you need to regenerate this, you can use =make=. Even though the library itself does not depend on X11, regenerating this file will require the appropriate file in X11. - -** Bugs and issues - -Please report them on [[https://github.com/tpapp/cl-colors/issues][Github]]. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/cl-colors.asd b/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/cl-colors.asd deleted file mode 100644 index e603937..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/cl-colors.asd +++ /dev/null @@ -1,19 +0,0 @@ -(defsystem #:cl-colors - :description "Simple color library for Common Lisp" - :version "0.2" - :author "Tamas K Papp " - :license "Boost Software License - Version 1.0" - :serial t - :components ((:file "package") - (:file "colors") - (:file "colornames") - (:file "hexcolors")) - :depends-on (#:alexandria #:let-plus)) - -(defsystem #:cl-colors-tests - :description "Unit tests for CL-COLORS." - :author "Tamas K Papp " - :license "Boost Software License - Version 1.0" - :serial t - :components ((:file "test")) - :depends-on (#:cl-colors #:lift)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/colornames.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/colornames.lisp deleted file mode 100644 index 2d65136..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/colornames.lisp +++ /dev/null @@ -1,663 +0,0 @@ -;;;; This file was generated automatically by parse-x11.lisp -;;;; Please do not edit directly, just run make if necessary (but should not be). - -(in-package #:cl-colors) - -(define-rgb-color snow 1 50/51 50/51) -(define-rgb-color ghostwhite 248/255 248/255 1) -(define-rgb-color whitesmoke 49/51 49/51 49/51) -(define-rgb-color gainsboro 44/51 44/51 44/51) -(define-rgb-color floralwhite 1 50/51 16/17) -(define-rgb-color oldlace 253/255 49/51 46/51) -(define-rgb-color linen 50/51 16/17 46/51) -(define-rgb-color antiquewhite 50/51 47/51 43/51) -(define-rgb-color papayawhip 1 239/255 71/85) -(define-rgb-color blanchedalmond 1 47/51 41/51) -(define-rgb-color bisque 1 76/85 196/255) -(define-rgb-color peachpuff 1 218/255 37/51) -(define-rgb-color navajowhite 1 74/85 173/255) -(define-rgb-color moccasin 1 76/85 181/255) -(define-rgb-color cornsilk 1 248/255 44/51) -(define-rgb-color ivory 1 1 16/17) -(define-rgb-color lemonchiffon 1 50/51 41/51) -(define-rgb-color seashell 1 49/51 14/15) -(define-rgb-color honeydew 16/17 1 16/17) -(define-rgb-color mintcream 49/51 1 50/51) -(define-rgb-color azure 16/17 1 1) -(define-rgb-color aliceblue 16/17 248/255 1) -(define-rgb-color lavender 46/51 46/51 50/51) -(define-rgb-color lavenderblush 1 16/17 49/51) -(define-rgb-color mistyrose 1 76/85 15/17) -(define-rgb-color white 1 1 1) -(define-rgb-color black 0 0 0) -(define-rgb-color darkslategray 47/255 79/255 79/255) -(define-rgb-color darkslategrey 47/255 79/255 79/255) -(define-rgb-color dimgray 7/17 7/17 7/17) -(define-rgb-color dimgrey 7/17 7/17 7/17) -(define-rgb-color slategray 112/255 128/255 48/85) -(define-rgb-color slategrey 112/255 128/255 48/85) -(define-rgb-color lightslategray 7/15 8/15 3/5) -(define-rgb-color lightslategrey 7/15 8/15 3/5) -(define-rgb-color gray 38/51 38/51 38/51) -(define-rgb-color grey 38/51 38/51 38/51) -(define-rgb-color lightgrey 211/255 211/255 211/255) -(define-rgb-color lightgray 211/255 211/255 211/255) -(define-rgb-color midnightblue 5/51 5/51 112/255) -(define-rgb-color navy 0 0 128/255) -(define-rgb-color navyblue 0 0 128/255) -(define-rgb-color cornflowerblue 20/51 149/255 79/85) -(define-rgb-color darkslateblue 24/85 61/255 139/255) -(define-rgb-color slateblue 106/255 6/17 41/51) -(define-rgb-color mediumslateblue 41/85 104/255 14/15) -(define-rgb-color lightslateblue 44/85 112/255 1) -(define-rgb-color mediumblue 0 0 41/51) -(define-rgb-color royalblue 13/51 7/17 15/17) -(define-rgb-color blue 0 0 1) -(define-rgb-color dodgerblue 2/17 48/85 1) -(define-rgb-color deepskyblue 0 191/255 1) -(define-rgb-color skyblue 9/17 206/255 47/51) -(define-rgb-color lightskyblue 9/17 206/255 50/51) -(define-rgb-color steelblue 14/51 26/51 12/17) -(define-rgb-color lightsteelblue 176/255 196/255 74/85) -(define-rgb-color lightblue 173/255 72/85 46/51) -(define-rgb-color powderblue 176/255 224/255 46/51) -(define-rgb-color paleturquoise 35/51 14/15 14/15) -(define-rgb-color darkturquoise 0 206/255 209/255) -(define-rgb-color mediumturquoise 24/85 209/255 4/5) -(define-rgb-color turquoise 64/255 224/255 208/255) -(define-rgb-color cyan 0 1 1) -(define-rgb-color lightcyan 224/255 1 1) -(define-rgb-color cadetblue 19/51 158/255 32/51) -(define-rgb-color mediumaquamarine 2/5 41/51 2/3) -(define-rgb-color aquamarine 127/255 1 212/255) -(define-rgb-color darkgreen 0 20/51 0) -(define-rgb-color darkolivegreen 1/3 107/255 47/255) -(define-rgb-color darkseagreen 143/255 188/255 143/255) -(define-rgb-color seagreen 46/255 139/255 29/85) -(define-rgb-color mediumseagreen 4/17 179/255 113/255) -(define-rgb-color lightseagreen 32/255 178/255 2/3) -(define-rgb-color palegreen 152/255 251/255 152/255) -(define-rgb-color springgreen 0 1 127/255) -(define-rgb-color lawngreen 124/255 84/85 0) -(define-rgb-color green 0 1 0) -(define-rgb-color chartreuse 127/255 1 0) -(define-rgb-color mediumspringgreen 0 50/51 154/255) -(define-rgb-color greenyellow 173/255 1 47/255) -(define-rgb-color limegreen 10/51 41/51 10/51) -(define-rgb-color yellowgreen 154/255 41/51 10/51) -(define-rgb-color forestgreen 2/15 139/255 2/15) -(define-rgb-color olivedrab 107/255 142/255 7/51) -(define-rgb-color darkkhaki 63/85 61/85 107/255) -(define-rgb-color khaki 16/17 46/51 28/51) -(define-rgb-color palegoldenrod 14/15 232/255 2/3) -(define-rgb-color lightgoldenrodyellow 50/51 50/51 14/17) -(define-rgb-color lightyellow 1 1 224/255) -(define-rgb-color yellow 1 1 0) -(define-rgb-color gold 1 43/51 0) -(define-rgb-color lightgoldenrod 14/15 13/15 26/51) -(define-rgb-color goldenrod 218/255 11/17 32/255) -(define-rgb-color darkgoldenrod 184/255 134/255 11/255) -(define-rgb-color rosybrown 188/255 143/255 143/255) -(define-rgb-color indianred 41/51 92/255 92/255) -(define-rgb-color saddlebrown 139/255 23/85 19/255) -(define-rgb-color sienna 32/51 82/255 3/17) -(define-rgb-color peru 41/51 133/255 21/85) -(define-rgb-color burlywood 74/85 184/255 9/17) -(define-rgb-color beige 49/51 49/51 44/51) -(define-rgb-color wheat 49/51 74/85 179/255) -(define-rgb-color sandybrown 244/255 164/255 32/85) -(define-rgb-color tan 14/17 12/17 28/51) -(define-rgb-color chocolate 14/17 7/17 2/17) -(define-rgb-color firebrick 178/255 2/15 2/15) -(define-rgb-color brown 11/17 14/85 14/85) -(define-rgb-color darksalmon 233/255 10/17 122/255) -(define-rgb-color salmon 50/51 128/255 38/85) -(define-rgb-color lightsalmon 1 32/51 122/255) -(define-rgb-color orange 1 11/17 0) -(define-rgb-color darkorange 1 28/51 0) -(define-rgb-color coral 1 127/255 16/51) -(define-rgb-color lightcoral 16/17 128/255 128/255) -(define-rgb-color tomato 1 33/85 71/255) -(define-rgb-color orangered 1 23/85 0) -(define-rgb-color red 1 0 0) -(define-rgb-color hotpink 1 7/17 12/17) -(define-rgb-color deeppink 1 4/51 49/85) -(define-rgb-color pink 1 64/85 203/255) -(define-rgb-color lightpink 1 182/255 193/255) -(define-rgb-color palevioletred 73/85 112/255 49/85) -(define-rgb-color maroon 176/255 16/85 32/85) -(define-rgb-color mediumvioletred 199/255 7/85 133/255) -(define-rgb-color violetred 208/255 32/255 48/85) -(define-rgb-color magenta 1 0 1) -(define-rgb-color violet 14/15 26/51 14/15) -(define-rgb-color plum 13/15 32/51 13/15) -(define-rgb-color orchid 218/255 112/255 214/255) -(define-rgb-color mediumorchid 62/85 1/3 211/255) -(define-rgb-color darkorchid 3/5 10/51 4/5) -(define-rgb-color darkviolet 148/255 0 211/255) -(define-rgb-color blueviolet 46/85 43/255 226/255) -(define-rgb-color purple 32/51 32/255 16/17) -(define-rgb-color mediumpurple 49/85 112/255 73/85) -(define-rgb-color thistle 72/85 191/255 72/85) -(define-rgb-color snow1 1 50/51 50/51) -(define-rgb-color snow2 14/15 233/255 233/255) -(define-rgb-color snow3 41/51 67/85 67/85) -(define-rgb-color snow4 139/255 137/255 137/255) -(define-rgb-color seashell1 1 49/51 14/15) -(define-rgb-color seashell2 14/15 229/255 74/85) -(define-rgb-color seashell3 41/51 197/255 191/255) -(define-rgb-color seashell4 139/255 134/255 26/51) -(define-rgb-color antiquewhite1 1 239/255 73/85) -(define-rgb-color antiquewhite2 14/15 223/255 4/5) -(define-rgb-color antiquewhite3 41/51 64/85 176/255) -(define-rgb-color antiquewhite4 139/255 131/255 8/17) -(define-rgb-color bisque1 1 76/85 196/255) -(define-rgb-color bisque2 14/15 71/85 61/85) -(define-rgb-color bisque3 41/51 61/85 158/255) -(define-rgb-color bisque4 139/255 25/51 107/255) -(define-rgb-color peachpuff1 1 218/255 37/51) -(define-rgb-color peachpuff2 14/15 203/255 173/255) -(define-rgb-color peachpuff3 41/51 35/51 149/255) -(define-rgb-color peachpuff4 139/255 7/15 101/255) -(define-rgb-color navajowhite1 1 74/85 173/255) -(define-rgb-color navajowhite2 14/15 69/85 161/255) -(define-rgb-color navajowhite3 41/51 179/255 139/255) -(define-rgb-color navajowhite4 139/255 121/255 94/255) -(define-rgb-color lemonchiffon1 1 50/51 41/51) -(define-rgb-color lemonchiffon2 14/15 233/255 191/255) -(define-rgb-color lemonchiffon3 41/51 67/85 11/17) -(define-rgb-color lemonchiffon4 139/255 137/255 112/255) -(define-rgb-color cornsilk1 1 248/255 44/51) -(define-rgb-color cornsilk2 14/15 232/255 41/51) -(define-rgb-color cornsilk3 41/51 40/51 59/85) -(define-rgb-color cornsilk4 139/255 8/15 8/17) -(define-rgb-color ivory1 1 1 16/17) -(define-rgb-color ivory2 14/15 14/15 224/255) -(define-rgb-color ivory3 41/51 41/51 193/255) -(define-rgb-color ivory4 139/255 139/255 131/255) -(define-rgb-color honeydew1 16/17 1 16/17) -(define-rgb-color honeydew2 224/255 14/15 224/255) -(define-rgb-color honeydew3 193/255 41/51 193/255) -(define-rgb-color honeydew4 131/255 139/255 131/255) -(define-rgb-color lavenderblush1 1 16/17 49/51) -(define-rgb-color lavenderblush2 14/15 224/255 229/255) -(define-rgb-color lavenderblush3 41/51 193/255 197/255) -(define-rgb-color lavenderblush4 139/255 131/255 134/255) -(define-rgb-color mistyrose1 1 76/85 15/17) -(define-rgb-color mistyrose2 14/15 71/85 14/17) -(define-rgb-color mistyrose3 41/51 61/85 181/255) -(define-rgb-color mistyrose4 139/255 25/51 41/85) -(define-rgb-color azure1 16/17 1 1) -(define-rgb-color azure2 224/255 14/15 14/15) -(define-rgb-color azure3 193/255 41/51 41/51) -(define-rgb-color azure4 131/255 139/255 139/255) -(define-rgb-color slateblue1 131/255 37/85 1) -(define-rgb-color slateblue2 122/255 103/255 14/15) -(define-rgb-color slateblue3 7/17 89/255 41/51) -(define-rgb-color slateblue4 71/255 4/17 139/255) -(define-rgb-color royalblue1 24/85 118/255 1) -(define-rgb-color royalblue2 67/255 22/51 14/15) -(define-rgb-color royalblue3 58/255 19/51 41/51) -(define-rgb-color royalblue4 13/85 64/255 139/255) -(define-rgb-color blue1 0 0 1) -(define-rgb-color blue2 0 0 14/15) -(define-rgb-color blue3 0 0 41/51) -(define-rgb-color blue4 0 0 139/255) -(define-rgb-color dodgerblue1 2/17 48/85 1) -(define-rgb-color dodgerblue2 28/255 134/255 14/15) -(define-rgb-color dodgerblue3 8/85 116/255 41/51) -(define-rgb-color dodgerblue4 16/255 26/85 139/255) -(define-rgb-color steelblue1 33/85 184/255 1) -(define-rgb-color steelblue2 92/255 172/255 14/15) -(define-rgb-color steelblue3 79/255 148/255 41/51) -(define-rgb-color steelblue4 18/85 20/51 139/255) -(define-rgb-color deepskyblue1 0 191/255 1) -(define-rgb-color deepskyblue2 0 178/255 14/15) -(define-rgb-color deepskyblue3 0 154/255 41/51) -(define-rgb-color deepskyblue4 0 104/255 139/255) -(define-rgb-color skyblue1 9/17 206/255 1) -(define-rgb-color skyblue2 42/85 64/85 14/15) -(define-rgb-color skyblue3 36/85 166/255 41/51) -(define-rgb-color skyblue4 74/255 112/255 139/255) -(define-rgb-color lightskyblue1 176/255 226/255 1) -(define-rgb-color lightskyblue2 164/255 211/255 14/15) -(define-rgb-color lightskyblue3 47/85 182/255 41/51) -(define-rgb-color lightskyblue4 32/85 41/85 139/255) -(define-rgb-color slategray1 66/85 226/255 1) -(define-rgb-color slategray2 37/51 211/255 14/15) -(define-rgb-color slategray3 53/85 182/255 41/51) -(define-rgb-color slategray4 36/85 41/85 139/255) -(define-rgb-color lightsteelblue1 202/255 15/17 1) -(define-rgb-color lightsteelblue2 188/255 14/17 14/15) -(define-rgb-color lightsteelblue3 54/85 181/255 41/51) -(define-rgb-color lightsteelblue4 22/51 41/85 139/255) -(define-rgb-color lightblue1 191/255 239/255 1) -(define-rgb-color lightblue2 178/255 223/255 14/15) -(define-rgb-color lightblue3 154/255 64/85 41/51) -(define-rgb-color lightblue4 104/255 131/255 139/255) -(define-rgb-color lightcyan1 224/255 1 1) -(define-rgb-color lightcyan2 209/255 14/15 14/15) -(define-rgb-color lightcyan3 12/17 41/51 41/51) -(define-rgb-color lightcyan4 122/255 139/255 139/255) -(define-rgb-color paleturquoise1 11/15 1 1) -(define-rgb-color paleturquoise2 58/85 14/15 14/15) -(define-rgb-color paleturquoise3 10/17 41/51 41/51) -(define-rgb-color paleturquoise4 2/5 139/255 139/255) -(define-rgb-color cadetblue1 152/255 49/51 1) -(define-rgb-color cadetblue2 142/255 229/255 14/15) -(define-rgb-color cadetblue3 122/255 197/255 41/51) -(define-rgb-color cadetblue4 83/255 134/255 139/255) -(define-rgb-color turquoise1 0 49/51 1) -(define-rgb-color turquoise2 0 229/255 14/15) -(define-rgb-color turquoise3 0 197/255 41/51) -(define-rgb-color turquoise4 0 134/255 139/255) -(define-rgb-color cyan1 0 1 1) -(define-rgb-color cyan2 0 14/15 14/15) -(define-rgb-color cyan3 0 41/51 41/51) -(define-rgb-color cyan4 0 139/255 139/255) -(define-rgb-color darkslategray1 151/255 1 1) -(define-rgb-color darkslategray2 47/85 14/15 14/15) -(define-rgb-color darkslategray3 121/255 41/51 41/51) -(define-rgb-color darkslategray4 82/255 139/255 139/255) -(define-rgb-color aquamarine1 127/255 1 212/255) -(define-rgb-color aquamarine2 118/255 14/15 66/85) -(define-rgb-color aquamarine3 2/5 41/51 2/3) -(define-rgb-color aquamarine4 23/85 139/255 116/255) -(define-rgb-color darkseagreen1 193/255 1 193/255) -(define-rgb-color darkseagreen2 12/17 14/15 12/17) -(define-rgb-color darkseagreen3 31/51 41/51 31/51) -(define-rgb-color darkseagreen4 7/17 139/255 7/17) -(define-rgb-color seagreen1 28/85 1 53/85) -(define-rgb-color seagreen2 26/85 14/15 148/255) -(define-rgb-color seagreen3 67/255 41/51 128/255) -(define-rgb-color seagreen4 46/255 139/255 29/85) -(define-rgb-color palegreen1 154/255 1 154/255) -(define-rgb-color palegreen2 48/85 14/15 48/85) -(define-rgb-color palegreen3 124/255 41/51 124/255) -(define-rgb-color palegreen4 28/85 139/255 28/85) -(define-rgb-color springgreen1 0 1 127/255) -(define-rgb-color springgreen2 0 14/15 118/255) -(define-rgb-color springgreen3 0 41/51 2/5) -(define-rgb-color springgreen4 0 139/255 23/85) -(define-rgb-color green1 0 1 0) -(define-rgb-color green2 0 14/15 0) -(define-rgb-color green3 0 41/51 0) -(define-rgb-color green4 0 139/255 0) -(define-rgb-color chartreuse1 127/255 1 0) -(define-rgb-color chartreuse2 118/255 14/15 0) -(define-rgb-color chartreuse3 2/5 41/51 0) -(define-rgb-color chartreuse4 23/85 139/255 0) -(define-rgb-color olivedrab1 64/85 1 62/255) -(define-rgb-color olivedrab2 179/255 14/15 58/255) -(define-rgb-color olivedrab3 154/255 41/51 10/51) -(define-rgb-color olivedrab4 7/17 139/255 2/15) -(define-rgb-color darkolivegreen1 202/255 1 112/255) -(define-rgb-color darkolivegreen2 188/255 14/15 104/255) -(define-rgb-color darkolivegreen3 54/85 41/51 6/17) -(define-rgb-color darkolivegreen4 22/51 139/255 61/255) -(define-rgb-color khaki1 1 82/85 143/255) -(define-rgb-color khaki2 14/15 46/51 133/255) -(define-rgb-color khaki3 41/51 66/85 23/51) -(define-rgb-color khaki4 139/255 134/255 26/85) -(define-rgb-color lightgoldenrod1 1 236/255 139/255) -(define-rgb-color lightgoldenrod2 14/15 44/51 26/51) -(define-rgb-color lightgoldenrod3 41/51 38/51 112/255) -(define-rgb-color lightgoldenrod4 139/255 43/85 76/255) -(define-rgb-color lightyellow1 1 1 224/255) -(define-rgb-color lightyellow2 14/15 14/15 209/255) -(define-rgb-color lightyellow3 41/51 41/51 12/17) -(define-rgb-color lightyellow4 139/255 139/255 122/255) -(define-rgb-color yellow1 1 1 0) -(define-rgb-color yellow2 14/15 14/15 0) -(define-rgb-color yellow3 41/51 41/51 0) -(define-rgb-color yellow4 139/255 139/255 0) -(define-rgb-color gold1 1 43/51 0) -(define-rgb-color gold2 14/15 67/85 0) -(define-rgb-color gold3 41/51 173/255 0) -(define-rgb-color gold4 139/255 39/85 0) -(define-rgb-color goldenrod1 1 193/255 37/255) -(define-rgb-color goldenrod2 14/15 12/17 2/15) -(define-rgb-color goldenrod3 41/51 31/51 29/255) -(define-rgb-color goldenrod4 139/255 7/17 4/51) -(define-rgb-color darkgoldenrod1 1 37/51 1/17) -(define-rgb-color darkgoldenrod2 14/15 173/255 14/255) -(define-rgb-color darkgoldenrod3 41/51 149/255 4/85) -(define-rgb-color darkgoldenrod4 139/255 101/255 8/255) -(define-rgb-color rosybrown1 1 193/255 193/255) -(define-rgb-color rosybrown2 14/15 12/17 12/17) -(define-rgb-color rosybrown3 41/51 31/51 31/51) -(define-rgb-color rosybrown4 139/255 7/17 7/17) -(define-rgb-color indianred1 1 106/255 106/255) -(define-rgb-color indianred2 14/15 33/85 33/85) -(define-rgb-color indianred3 41/51 1/3 1/3) -(define-rgb-color indianred4 139/255 58/255 58/255) -(define-rgb-color sienna1 1 26/51 71/255) -(define-rgb-color sienna2 14/15 121/255 22/85) -(define-rgb-color sienna3 41/51 104/255 19/85) -(define-rgb-color sienna4 139/255 71/255 38/255) -(define-rgb-color burlywood1 1 211/255 31/51) -(define-rgb-color burlywood2 14/15 197/255 29/51) -(define-rgb-color burlywood3 41/51 2/3 25/51) -(define-rgb-color burlywood4 139/255 23/51 1/3) -(define-rgb-color wheat1 1 77/85 62/85) -(define-rgb-color wheat2 14/15 72/85 58/85) -(define-rgb-color wheat3 41/51 62/85 10/17) -(define-rgb-color wheat4 139/255 42/85 2/5) -(define-rgb-color tan1 1 11/17 79/255) -(define-rgb-color tan2 14/15 154/255 73/255) -(define-rgb-color tan3 41/51 133/255 21/85) -(define-rgb-color tan4 139/255 6/17 43/255) -(define-rgb-color chocolate1 1 127/255 12/85) -(define-rgb-color chocolate2 14/15 118/255 11/85) -(define-rgb-color chocolate3 41/51 2/5 29/255) -(define-rgb-color chocolate4 139/255 23/85 19/255) -(define-rgb-color firebrick1 1 16/85 16/85) -(define-rgb-color firebrick2 14/15 44/255 44/255) -(define-rgb-color firebrick3 41/51 38/255 38/255) -(define-rgb-color firebrick4 139/255 26/255 26/255) -(define-rgb-color brown1 1 64/255 64/255) -(define-rgb-color brown2 14/15 59/255 59/255) -(define-rgb-color brown3 41/51 1/5 1/5) -(define-rgb-color brown4 139/255 7/51 7/51) -(define-rgb-color salmon1 1 28/51 7/17) -(define-rgb-color salmon2 14/15 26/51 98/255) -(define-rgb-color salmon3 41/51 112/255 28/85) -(define-rgb-color salmon4 139/255 76/255 19/85) -(define-rgb-color lightsalmon1 1 32/51 122/255) -(define-rgb-color lightsalmon2 14/15 149/255 38/85) -(define-rgb-color lightsalmon3 41/51 43/85 98/255) -(define-rgb-color lightsalmon4 139/255 29/85 22/85) -(define-rgb-color orange1 1 11/17 0) -(define-rgb-color orange2 14/15 154/255 0) -(define-rgb-color orange3 41/51 133/255 0) -(define-rgb-color orange4 139/255 6/17 0) -(define-rgb-color darkorange1 1 127/255 0) -(define-rgb-color darkorange2 14/15 118/255 0) -(define-rgb-color darkorange3 41/51 2/5 0) -(define-rgb-color darkorange4 139/255 23/85 0) -(define-rgb-color coral1 1 38/85 86/255) -(define-rgb-color coral2 14/15 106/255 16/51) -(define-rgb-color coral3 41/51 91/255 23/85) -(define-rgb-color coral4 139/255 62/255 47/255) -(define-rgb-color tomato1 1 33/85 71/255) -(define-rgb-color tomato2 14/15 92/255 22/85) -(define-rgb-color tomato3 41/51 79/255 19/85) -(define-rgb-color tomato4 139/255 18/85 38/255) -(define-rgb-color orangered1 1 23/85 0) -(define-rgb-color orangered2 14/15 64/255 0) -(define-rgb-color orangered3 41/51 11/51 0) -(define-rgb-color orangered4 139/255 37/255 0) -(define-rgb-color red1 1 0 0) -(define-rgb-color red2 14/15 0 0) -(define-rgb-color red3 41/51 0 0) -(define-rgb-color red4 139/255 0 0) -(define-rgb-color debianred 43/51 7/255 27/85) -(define-rgb-color deeppink1 1 4/51 49/85) -(define-rgb-color deeppink2 14/15 6/85 137/255) -(define-rgb-color deeppink3 41/51 16/255 118/255) -(define-rgb-color deeppink4 139/255 2/51 16/51) -(define-rgb-color hotpink1 1 22/51 12/17) -(define-rgb-color hotpink2 14/15 106/255 167/255) -(define-rgb-color hotpink3 41/51 32/85 48/85) -(define-rgb-color hotpink4 139/255 58/255 98/255) -(define-rgb-color pink1 1 181/255 197/255) -(define-rgb-color pink2 14/15 169/255 184/255) -(define-rgb-color pink3 41/51 29/51 158/255) -(define-rgb-color pink4 139/255 33/85 36/85) -(define-rgb-color lightpink1 1 58/85 37/51) -(define-rgb-color lightpink2 14/15 54/85 173/255) -(define-rgb-color lightpink3 41/51 28/51 149/255) -(define-rgb-color lightpink4 139/255 19/51 101/255) -(define-rgb-color palevioletred1 1 26/51 57/85) -(define-rgb-color palevioletred2 14/15 121/255 53/85) -(define-rgb-color palevioletred3 41/51 104/255 137/255) -(define-rgb-color palevioletred4 139/255 71/255 31/85) -(define-rgb-color maroon1 1 52/255 179/255) -(define-rgb-color maroon2 14/15 16/85 167/255) -(define-rgb-color maroon3 41/51 41/255 48/85) -(define-rgb-color maroon4 139/255 28/255 98/255) -(define-rgb-color violetred1 1 62/255 10/17) -(define-rgb-color violetred2 14/15 58/255 28/51) -(define-rgb-color violetred3 41/51 10/51 8/17) -(define-rgb-color violetred4 139/255 2/15 82/255) -(define-rgb-color magenta1 1 0 1) -(define-rgb-color magenta2 14/15 0 14/15) -(define-rgb-color magenta3 41/51 0 41/51) -(define-rgb-color magenta4 139/255 0 139/255) -(define-rgb-color orchid1 1 131/255 50/51) -(define-rgb-color orchid2 14/15 122/255 233/255) -(define-rgb-color orchid3 41/51 7/17 67/85) -(define-rgb-color orchid4 139/255 71/255 137/255) -(define-rgb-color plum1 1 11/15 1) -(define-rgb-color plum2 14/15 58/85 14/15) -(define-rgb-color plum3 41/51 10/17 41/51) -(define-rgb-color plum4 139/255 2/5 139/255) -(define-rgb-color mediumorchid1 224/255 2/5 1) -(define-rgb-color mediumorchid2 209/255 19/51 14/15) -(define-rgb-color mediumorchid3 12/17 82/255 41/51) -(define-rgb-color mediumorchid4 122/255 11/51 139/255) -(define-rgb-color darkorchid1 191/255 62/255 1) -(define-rgb-color darkorchid2 178/255 58/255 14/15) -(define-rgb-color darkorchid3 154/255 10/51 41/51) -(define-rgb-color darkorchid4 104/255 2/15 139/255) -(define-rgb-color purple1 31/51 16/85 1) -(define-rgb-color purple2 29/51 44/255 14/15) -(define-rgb-color purple3 25/51 38/255 41/51) -(define-rgb-color purple4 1/3 26/255 139/255) -(define-rgb-color mediumpurple1 57/85 26/51 1) -(define-rgb-color mediumpurple2 53/85 121/255 14/15) -(define-rgb-color mediumpurple3 137/255 104/255 41/51) -(define-rgb-color mediumpurple4 31/85 71/255 139/255) -(define-rgb-color thistle1 1 15/17 1) -(define-rgb-color thistle2 14/15 14/17 14/15) -(define-rgb-color thistle3 41/51 181/255 41/51) -(define-rgb-color thistle4 139/255 41/85 139/255) -(define-rgb-color gray0 0 0 0) -(define-rgb-color grey0 0 0 0) -(define-rgb-color gray1 1/85 1/85 1/85) -(define-rgb-color grey1 1/85 1/85 1/85) -(define-rgb-color gray2 1/51 1/51 1/51) -(define-rgb-color grey2 1/51 1/51 1/51) -(define-rgb-color gray3 8/255 8/255 8/255) -(define-rgb-color grey3 8/255 8/255 8/255) -(define-rgb-color gray4 2/51 2/51 2/51) -(define-rgb-color grey4 2/51 2/51 2/51) -(define-rgb-color gray5 13/255 13/255 13/255) -(define-rgb-color grey5 13/255 13/255 13/255) -(define-rgb-color gray6 1/17 1/17 1/17) -(define-rgb-color grey6 1/17 1/17 1/17) -(define-rgb-color gray7 6/85 6/85 6/85) -(define-rgb-color grey7 6/85 6/85 6/85) -(define-rgb-color gray8 4/51 4/51 4/51) -(define-rgb-color grey8 4/51 4/51 4/51) -(define-rgb-color gray9 23/255 23/255 23/255) -(define-rgb-color grey9 23/255 23/255 23/255) -(define-rgb-color gray10 26/255 26/255 26/255) -(define-rgb-color grey10 26/255 26/255 26/255) -(define-rgb-color gray11 28/255 28/255 28/255) -(define-rgb-color grey11 28/255 28/255 28/255) -(define-rgb-color gray12 31/255 31/255 31/255) -(define-rgb-color grey12 31/255 31/255 31/255) -(define-rgb-color gray13 11/85 11/85 11/85) -(define-rgb-color grey13 11/85 11/85 11/85) -(define-rgb-color gray14 12/85 12/85 12/85) -(define-rgb-color grey14 12/85 12/85 12/85) -(define-rgb-color gray15 38/255 38/255 38/255) -(define-rgb-color grey15 38/255 38/255 38/255) -(define-rgb-color gray16 41/255 41/255 41/255) -(define-rgb-color grey16 41/255 41/255 41/255) -(define-rgb-color gray17 43/255 43/255 43/255) -(define-rgb-color grey17 43/255 43/255 43/255) -(define-rgb-color gray18 46/255 46/255 46/255) -(define-rgb-color grey18 46/255 46/255 46/255) -(define-rgb-color gray19 16/85 16/85 16/85) -(define-rgb-color grey19 16/85 16/85 16/85) -(define-rgb-color gray20 1/5 1/5 1/5) -(define-rgb-color grey20 1/5 1/5 1/5) -(define-rgb-color gray21 18/85 18/85 18/85) -(define-rgb-color grey21 18/85 18/85 18/85) -(define-rgb-color gray22 56/255 56/255 56/255) -(define-rgb-color grey22 56/255 56/255 56/255) -(define-rgb-color gray23 59/255 59/255 59/255) -(define-rgb-color grey23 59/255 59/255 59/255) -(define-rgb-color gray24 61/255 61/255 61/255) -(define-rgb-color grey24 61/255 61/255 61/255) -(define-rgb-color gray25 64/255 64/255 64/255) -(define-rgb-color grey25 64/255 64/255 64/255) -(define-rgb-color gray26 22/85 22/85 22/85) -(define-rgb-color grey26 22/85 22/85 22/85) -(define-rgb-color gray27 23/85 23/85 23/85) -(define-rgb-color grey27 23/85 23/85 23/85) -(define-rgb-color gray28 71/255 71/255 71/255) -(define-rgb-color grey28 71/255 71/255 71/255) -(define-rgb-color gray29 74/255 74/255 74/255) -(define-rgb-color grey29 74/255 74/255 74/255) -(define-rgb-color gray30 77/255 77/255 77/255) -(define-rgb-color grey30 77/255 77/255 77/255) -(define-rgb-color gray31 79/255 79/255 79/255) -(define-rgb-color grey31 79/255 79/255 79/255) -(define-rgb-color gray32 82/255 82/255 82/255) -(define-rgb-color grey32 82/255 82/255 82/255) -(define-rgb-color gray33 28/85 28/85 28/85) -(define-rgb-color grey33 28/85 28/85 28/85) -(define-rgb-color gray34 29/85 29/85 29/85) -(define-rgb-color grey34 29/85 29/85 29/85) -(define-rgb-color gray35 89/255 89/255 89/255) -(define-rgb-color grey35 89/255 89/255 89/255) -(define-rgb-color gray36 92/255 92/255 92/255) -(define-rgb-color grey36 92/255 92/255 92/255) -(define-rgb-color gray37 94/255 94/255 94/255) -(define-rgb-color grey37 94/255 94/255 94/255) -(define-rgb-color gray38 97/255 97/255 97/255) -(define-rgb-color grey38 97/255 97/255 97/255) -(define-rgb-color gray39 33/85 33/85 33/85) -(define-rgb-color grey39 33/85 33/85 33/85) -(define-rgb-color gray40 2/5 2/5 2/5) -(define-rgb-color grey40 2/5 2/5 2/5) -(define-rgb-color gray41 7/17 7/17 7/17) -(define-rgb-color grey41 7/17 7/17 7/17) -(define-rgb-color gray42 107/255 107/255 107/255) -(define-rgb-color grey42 107/255 107/255 107/255) -(define-rgb-color gray43 22/51 22/51 22/51) -(define-rgb-color grey43 22/51 22/51 22/51) -(define-rgb-color gray44 112/255 112/255 112/255) -(define-rgb-color grey44 112/255 112/255 112/255) -(define-rgb-color gray45 23/51 23/51 23/51) -(define-rgb-color grey45 23/51 23/51 23/51) -(define-rgb-color gray46 39/85 39/85 39/85) -(define-rgb-color grey46 39/85 39/85 39/85) -(define-rgb-color gray47 8/17 8/17 8/17) -(define-rgb-color grey47 8/17 8/17 8/17) -(define-rgb-color gray48 122/255 122/255 122/255) -(define-rgb-color grey48 122/255 122/255 122/255) -(define-rgb-color gray49 25/51 25/51 25/51) -(define-rgb-color grey49 25/51 25/51 25/51) -(define-rgb-color gray50 127/255 127/255 127/255) -(define-rgb-color grey50 127/255 127/255 127/255) -(define-rgb-color gray51 26/51 26/51 26/51) -(define-rgb-color grey51 26/51 26/51 26/51) -(define-rgb-color gray52 133/255 133/255 133/255) -(define-rgb-color grey52 133/255 133/255 133/255) -(define-rgb-color gray53 9/17 9/17 9/17) -(define-rgb-color grey53 9/17 9/17 9/17) -(define-rgb-color gray54 46/85 46/85 46/85) -(define-rgb-color grey54 46/85 46/85 46/85) -(define-rgb-color gray55 28/51 28/51 28/51) -(define-rgb-color grey55 28/51 28/51 28/51) -(define-rgb-color gray56 143/255 143/255 143/255) -(define-rgb-color grey56 143/255 143/255 143/255) -(define-rgb-color gray57 29/51 29/51 29/51) -(define-rgb-color grey57 29/51 29/51 29/51) -(define-rgb-color gray58 148/255 148/255 148/255) -(define-rgb-color grey58 148/255 148/255 148/255) -(define-rgb-color gray59 10/17 10/17 10/17) -(define-rgb-color grey59 10/17 10/17 10/17) -(define-rgb-color gray60 3/5 3/5 3/5) -(define-rgb-color grey60 3/5 3/5 3/5) -(define-rgb-color gray61 52/85 52/85 52/85) -(define-rgb-color grey61 52/85 52/85 52/85) -(define-rgb-color gray62 158/255 158/255 158/255) -(define-rgb-color grey62 158/255 158/255 158/255) -(define-rgb-color gray63 161/255 161/255 161/255) -(define-rgb-color grey63 161/255 161/255 161/255) -(define-rgb-color gray64 163/255 163/255 163/255) -(define-rgb-color grey64 163/255 163/255 163/255) -(define-rgb-color gray65 166/255 166/255 166/255) -(define-rgb-color grey65 166/255 166/255 166/255) -(define-rgb-color gray66 56/85 56/85 56/85) -(define-rgb-color grey66 56/85 56/85 56/85) -(define-rgb-color gray67 57/85 57/85 57/85) -(define-rgb-color grey67 57/85 57/85 57/85) -(define-rgb-color gray68 173/255 173/255 173/255) -(define-rgb-color grey68 173/255 173/255 173/255) -(define-rgb-color gray69 176/255 176/255 176/255) -(define-rgb-color grey69 176/255 176/255 176/255) -(define-rgb-color gray70 179/255 179/255 179/255) -(define-rgb-color grey70 179/255 179/255 179/255) -(define-rgb-color gray71 181/255 181/255 181/255) -(define-rgb-color grey71 181/255 181/255 181/255) -(define-rgb-color gray72 184/255 184/255 184/255) -(define-rgb-color grey72 184/255 184/255 184/255) -(define-rgb-color gray73 62/85 62/85 62/85) -(define-rgb-color grey73 62/85 62/85 62/85) -(define-rgb-color gray74 63/85 63/85 63/85) -(define-rgb-color grey74 63/85 63/85 63/85) -(define-rgb-color gray75 191/255 191/255 191/255) -(define-rgb-color grey75 191/255 191/255 191/255) -(define-rgb-color gray76 194/255 194/255 194/255) -(define-rgb-color grey76 194/255 194/255 194/255) -(define-rgb-color gray77 196/255 196/255 196/255) -(define-rgb-color grey77 196/255 196/255 196/255) -(define-rgb-color gray78 199/255 199/255 199/255) -(define-rgb-color grey78 199/255 199/255 199/255) -(define-rgb-color gray79 67/85 67/85 67/85) -(define-rgb-color grey79 67/85 67/85 67/85) -(define-rgb-color gray80 4/5 4/5 4/5) -(define-rgb-color grey80 4/5 4/5 4/5) -(define-rgb-color gray81 69/85 69/85 69/85) -(define-rgb-color grey81 69/85 69/85 69/85) -(define-rgb-color gray82 209/255 209/255 209/255) -(define-rgb-color grey82 209/255 209/255 209/255) -(define-rgb-color gray83 212/255 212/255 212/255) -(define-rgb-color grey83 212/255 212/255 212/255) -(define-rgb-color gray84 214/255 214/255 214/255) -(define-rgb-color grey84 214/255 214/255 214/255) -(define-rgb-color gray85 217/255 217/255 217/255) -(define-rgb-color grey85 217/255 217/255 217/255) -(define-rgb-color gray86 73/85 73/85 73/85) -(define-rgb-color grey86 73/85 73/85 73/85) -(define-rgb-color gray87 74/85 74/85 74/85) -(define-rgb-color grey87 74/85 74/85 74/85) -(define-rgb-color gray88 224/255 224/255 224/255) -(define-rgb-color grey88 224/255 224/255 224/255) -(define-rgb-color gray89 227/255 227/255 227/255) -(define-rgb-color grey89 227/255 227/255 227/255) -(define-rgb-color gray90 229/255 229/255 229/255) -(define-rgb-color grey90 229/255 229/255 229/255) -(define-rgb-color gray91 232/255 232/255 232/255) -(define-rgb-color grey91 232/255 232/255 232/255) -(define-rgb-color gray92 47/51 47/51 47/51) -(define-rgb-color grey92 47/51 47/51 47/51) -(define-rgb-color gray93 79/85 79/85 79/85) -(define-rgb-color grey93 79/85 79/85 79/85) -(define-rgb-color gray94 16/17 16/17 16/17) -(define-rgb-color grey94 16/17 16/17 16/17) -(define-rgb-color gray95 242/255 242/255 242/255) -(define-rgb-color grey95 242/255 242/255 242/255) -(define-rgb-color gray96 49/51 49/51 49/51) -(define-rgb-color grey96 49/51 49/51 49/51) -(define-rgb-color gray97 247/255 247/255 247/255) -(define-rgb-color grey97 247/255 247/255 247/255) -(define-rgb-color gray98 50/51 50/51 50/51) -(define-rgb-color grey98 50/51 50/51 50/51) -(define-rgb-color gray99 84/85 84/85 84/85) -(define-rgb-color grey99 84/85 84/85 84/85) -(define-rgb-color gray100 1 1 1) -(define-rgb-color grey100 1 1 1) -(define-rgb-color darkgrey 169/255 169/255 169/255) -(define-rgb-color darkgray 169/255 169/255 169/255) -(define-rgb-color darkblue 0 0 139/255) -(define-rgb-color darkcyan 0 139/255 139/255) -(define-rgb-color darkmagenta 139/255 0 139/255) -(define-rgb-color darkred 139/255 0 0) -(define-rgb-color lightgreen 48/85 14/15 48/85) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/colors.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/colors.lisp deleted file mode 100644 index c0f3e47..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/colors.lisp +++ /dev/null @@ -1,167 +0,0 @@ -(in-package :cl-colors) - -;;; color representations - -(deftype unit-real () - "Real number in [0,1]." - '(real 0 1)) - -(defstruct (rgb (:constructor rgb (red green blue))) - "RGB color." - (red nil :type unit-real :read-only t) - (green nil :type unit-real :read-only t) - (blue nil :type unit-real :read-only t)) - -(defmethod make-load-form ((p rgb) &optional env) - (declare (ignore env)) - (make-load-form-saving-slots p)) - -(defun gray (value) - "Create an RGB representation of a gray color (value in [0,1)." - (rgb value value value)) - -(define-structure-let+ (rgb) red green blue) - -(defstruct (hsv (:constructor hsv (hue saturation value))) - "HSV color." - (hue nil :type (real 0 360) :read-only t) - (saturation nil :type unit-real :read-only t) - (value nil :type unit-real :read-only t)) - -(defmethod make-load-form ((p hsv) &optional env) - (declare (ignore env)) - (make-load-form-saving-slots p)) - -(define-structure-let+ (hsv) hue saturation value) - -(defun normalize-hue (hue) - "Normalize hue to the interval [0,360)." - (mod hue 360)) - -;;; conversions - -(defun rgb-to-hsv (rgb &optional (undefined-hue 0)) - "Convert RGB to HSV representation. When hue is undefined (saturation is -zero), UNDEFINED-HUE will be assigned." - (let+ (((&rgb red green blue) rgb) - (value (max red green blue)) - (delta (- value (min red green blue))) - (saturation (if (plusp value) - (/ delta value) - 0)) - ((&flet normalize (constant right left) - (let ((hue (+ constant (/ (* 60 (- right left)) delta)))) - (if (minusp hue) - (+ hue 360) - hue))))) - (hsv (cond - ((zerop saturation) undefined-hue) ; undefined - ((= red value) (normalize 0 green blue)) ; dominant red - ((= green value) (normalize 120 blue red)) ; dominant green - (t (normalize 240 red green))) - saturation - value))) - -(defun hsv-to-rgb (hsv) - "Convert HSV to RGB representation. When SATURATION is zero, HUE is -ignored." - (let+ (((&hsv hue saturation value) hsv)) - ;; if saturation=0, color is on the gray line - (when (zerop saturation) - (return-from hsv-to-rgb (gray value))) - ;; nonzero saturation: normalize hue to [0,6) - (let+ ((h (/ (normalize-hue hue) 60)) - ((&values quotient remainder) (floor h)) - (p (* value (- 1 saturation))) - (q (* value (- 1 (* saturation remainder)))) - (r (* value (- 1 (* saturation (- 1 remainder))))) - ((&values red green blue) (case quotient - (0 (values value r p)) - (1 (values q value p)) - (2 (values p value r)) - (3 (values p q value)) - (4 (values r p value)) - (t (values value p q))))) - (rgb red green blue)))) - -(defun hex-to-rgb (string) - "Parse hexadecimal notation (eg ff0000 or f00 for red) into an RGB color." - (let+ (((&values width max) - (case (length string) - (3 (values 1 15)) - (6 (values 2 255)) - (t (error "string ~A doesn't have length 3 or 6, can't parse as ~ - RGB specification" string)))) - ((&flet parse (index) - (/ (parse-integer string :start (* index width) - :end (* (1+ index) width) - :radix 16) - max)))) - (rgb (parse 0) (parse 1) (parse 2)))) - - - -;;; conversion with generic functions - -(defgeneric as-hsv (color &optional undefined-hue) - (:method ((color rgb) &optional (undefined-hue 0)) - (rgb-to-hsv color undefined-hue)) - (:method ((color hsv) &optional undefined-hue) - (declare (ignore undefined-hue)) - color)) - -(defgeneric as-rgb (color) - (:method ((rgb rgb)) - rgb) - (:method ((hsv hsv)) - (hsv-to-rgb hsv)) - (:method ((string string)) - ;; TODO in the long run this should recognize color names too - (hex-to-rgb string))) - - - -;;; combinations - -;;; internal functions - -(declaim (inline cc)) -(defun cc (a b alpha) - "Convex combination (1-ALPHA)*A+ALPHA*B, ie ALPHA is the weight of A." - (declare (type (real 0 1) alpha)) - (+ (* (- 1 alpha) a) (* alpha b))) - -(defun rgb-combination (color1 color2 alpha) - "Color combination in RGB space." - (let+ (((&rgb red1 green1 blue1) (as-rgb color1)) - ((&rgb red2 green2 blue2) (as-rgb color2)) - ((&flet c (c1 c2) (cc c1 c2 alpha)))) - (rgb (c red1 red2) - (c green1 green2) - (c blue1 blue2)))) - -(defun hsv-combination (hsv1 hsv2 alpha &optional (positive? t)) - "Color combination in HSV space. POSITIVE? determines whether the hue -combination is in the positive or negative direction on the color wheel." - (let+ (((&hsv hue1 saturation1 value1) (as-hsv hsv1)) - ((&hsv hue2 saturation2 value2) (as-hsv hsv2)) - ((&flet c (c1 c2) (cc c1 c2 alpha)))) - (hsv (cond - ((and positive? (> hue1 hue2)) - (normalize-hue (c hue1 (+ hue2 360)))) - ((and (not positive?) (< hue1 hue2)) - (normalize-hue (c (+ hue1 360) hue2))) - (t (c hue1 hue2))) - (c saturation1 saturation2) - (c value1 value2)))) - - - -;;; macros used by the autogenerated files - -(defmacro define-rgb-color (name red green blue) - "Macro for defining color constants. Used by the automatically generated color file." - (let ((constant-name (symbolicate #\+ name #\+))) - `(progn - (define-constant ,constant-name (rgb ,red ,green ,blue) - :test #'equalp :documentation ,(format nil "X11 color ~A." name))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/hexcolors.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/hexcolors.lisp deleted file mode 100644 index 289f8fd..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/hexcolors.lisp +++ /dev/null @@ -1,69 +0,0 @@ -(in-package #:cl-colors) - -;;; parsing and printing of CSS-like colors - -(defun print-hex-rgb (color &key short (hash T) alpha destination) - "Converts a COLOR to its hexadecimal RGB string representation. If -SHORT is specified each component gets just one character. - -A hash character (#) is prepended if HASH is true (default). - -If ALPHA is set it is included as an ALPHA component. - -DESTINATION is the first argument to FORMAT, by default NIL." - (let+ (((&rgb red green blue) (as-rgb color)) - (factor (if short 15 255)) - ((&flet c (x) (round (* x factor))))) - (format destination (if short - "~@[~C~]~X~X~X~@[~X~]" - "~@[~C~]~2,'0X~2,'0X~2,'0X~@[~X~]") - (and hash #\#) - (c red) (c green) (c blue) - (and alpha (c alpha))))) - -;; TODO: a JUNK-ALLOWED parameter, like for PARSE-INTEGER, would be nice -(defun parse-hex-rgb (string &key (start 0) end) - "Parses a hexadecimal RGB(A) color string. Returns a new RGB color value -and an alpha component if present." - (let* ((length (length string)) - (end (or end length)) - (sub-length (- end start))) - (cond - ;; check for valid range, we need at least three and accept at most - ;; nine characters - ((and (<= #.(length "fff") sub-length) - (<= sub-length #.(length "#ffffff00"))) - (when (char= (char string start) #\#) - (incf start) - (decf sub-length)) - (labels ((parse (string index offset) - (parse-integer string :start index :end (+ offset index) - :radix 16)) - (short (string index) - (/ (parse string index 1) 15)) - (long (string index) - (/ (parse string index 2) 255))) - ;; recognize possible combinations of alpha component and length - ;; of the rest of the encoded color - (multiple-value-bind (shortp alphap) - (case sub-length - (#.(length "fff") (values T NIL)) - (#.(length "fff0") (values T T)) - (#.(length "ffffff") (values NIL NIL)) - (#.(length "ffffff00") (values NIL T))) - (if shortp - (values - (rgb - (short string start) - (short string (+ 1 start)) - (short string (+ 2 start))) - (and alphap (short string (+ 3 start)))) - (values - (rgb - (long string start) - (long string (+ 2 start)) - (long string (+ 4 start))) - (and alphap (long string (+ 6 start)))))))) - (T - (error "not enough or too many characters in indicated sequence: ~A" - (subseq string start end)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/introduction.txt b/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/introduction.txt deleted file mode 100644 index 88d1764..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/introduction.txt +++ /dev/null @@ -1,52 +0,0 @@ -Color classes -------------- - -The two main color classes are rgb and hsv, which have slots red, -green, blue and hue, saturation, value respectively. There is also an -rgb class with an alpha channel (slot alpha) called rgba. In the rgb -class, valid slot values are from 0 to 1, while in the hsv class, -saturation and value are in the interval [0,1], but hue is in [0,360). - -You can convert between rgb and hsv using rgb->hsv and hsv->rgb. Note -that for the former, you need to specify what happens when the hue is -undefined (ie the color is gray). By default, the hue of red (0) is -assigned. - -Generic functions which find the appropriate conversion method are -available with names ->rgb and ->hsv. Use these if you want your -functions to handle various different color representations but -eventually you need to work with a single one. - - - -Named colors ------------- - -Named colors, parsed from the X11 colors file, are loaded from -colornames.lisp. As they are constants, names are between +'s. All -named colors are rgb. - - - -Convex combinations -------------------- - -Use hsv-combination or rgb-combination for taking convex combinations -in the respective color space. Note that in the HSV space, you need -to specify the direction on the color wheel, the default is positive. - - -Example session ---------------- - -CL-COLORS> +blue+ -# -CL-COLORS> (->hsv +blue+) -# -CL-COLORS> (rgb-combination +blue+ +green+ 0.5) -# -CL-COLORS> (->rgb (hsv-combination (->hsv +blue+) (->hsv +green+) 0.5)) -# -CL-COLORS> (->rgb (hsv-combination (->hsv +blue+) (->hsv +green+) 0.5 nil)) -# - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/package-template.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/package-template.lisp deleted file mode 100644 index 7306fde..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/package-template.lisp +++ /dev/null @@ -1,17 +0,0 @@ -;;; -*- Mode:Lisp; Syntax:ANSI-Common-Lisp; -*- - -(in-package #:common-lisp-user) - -(defpackage #:cl-colors - (:use #:alexandria - #:common-lisp - #:let-plus) - (:export - #:rgb #:rgb-red #:rgb-green #:rgb-blue #:gray #:&rgb - #:hsv #:hsv-hue #:hsv-saturation #:hsv-value #:&hsv - #:rgb-to-hsv #:hsv-to-rgb #:hex-to-rgb #:as-hsv #:as-rgb - #:rgb-combination #:hsv-combination - #:parse-hex-rgb #:print-hex-rgb - - ;; predefined color names -~A)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/package.lisp deleted file mode 100644 index d96740b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/package.lisp +++ /dev/null @@ -1,674 +0,0 @@ -;;; -*- Mode:Lisp; Syntax:ANSI-Common-Lisp; -*- - -(in-package #:common-lisp-user) - -(defpackage #:cl-colors - (:use #:alexandria - #:common-lisp - #:let-plus) - (:export - #:rgb #:rgb-red #:rgb-green #:rgb-blue #:gray #:&rgb - #:hsv #:hsv-hue #:hsv-saturation #:hsv-value #:&hsv - #:rgb-to-hsv #:hsv-to-rgb #:hex-to-rgb #:as-hsv #:as-rgb - #:rgb-combination #:hsv-combination - #:parse-hex-rgb #:print-hex-rgb - - ;; predefined color names - #:+snow+ - #:+ghostwhite+ - #:+whitesmoke+ - #:+gainsboro+ - #:+floralwhite+ - #:+oldlace+ - #:+linen+ - #:+antiquewhite+ - #:+papayawhip+ - #:+blanchedalmond+ - #:+bisque+ - #:+peachpuff+ - #:+navajowhite+ - #:+moccasin+ - #:+cornsilk+ - #:+ivory+ - #:+lemonchiffon+ - #:+seashell+ - #:+honeydew+ - #:+mintcream+ - #:+azure+ - #:+aliceblue+ - #:+lavender+ - #:+lavenderblush+ - #:+mistyrose+ - #:+white+ - #:+black+ - #:+darkslategray+ - #:+darkslategrey+ - #:+dimgray+ - #:+dimgrey+ - #:+slategray+ - #:+slategrey+ - #:+lightslategray+ - #:+lightslategrey+ - #:+gray+ - #:+grey+ - #:+lightgrey+ - #:+lightgray+ - #:+midnightblue+ - #:+navy+ - #:+navyblue+ - #:+cornflowerblue+ - #:+darkslateblue+ - #:+slateblue+ - #:+mediumslateblue+ - #:+lightslateblue+ - #:+mediumblue+ - #:+royalblue+ - #:+blue+ - #:+dodgerblue+ - #:+deepskyblue+ - #:+skyblue+ - #:+lightskyblue+ - #:+steelblue+ - #:+lightsteelblue+ - #:+lightblue+ - #:+powderblue+ - #:+paleturquoise+ - #:+darkturquoise+ - #:+mediumturquoise+ - #:+turquoise+ - #:+cyan+ - #:+lightcyan+ - #:+cadetblue+ - #:+mediumaquamarine+ - #:+aquamarine+ - #:+darkgreen+ - #:+darkolivegreen+ - #:+darkseagreen+ - #:+seagreen+ - #:+mediumseagreen+ - #:+lightseagreen+ - #:+palegreen+ - #:+springgreen+ - #:+lawngreen+ - #:+green+ - #:+chartreuse+ - #:+mediumspringgreen+ - #:+greenyellow+ - #:+limegreen+ - #:+yellowgreen+ - #:+forestgreen+ - #:+olivedrab+ - #:+darkkhaki+ - #:+khaki+ - #:+palegoldenrod+ - #:+lightgoldenrodyellow+ - #:+lightyellow+ - #:+yellow+ - #:+gold+ - #:+lightgoldenrod+ - #:+goldenrod+ - #:+darkgoldenrod+ - #:+rosybrown+ - #:+indianred+ - #:+saddlebrown+ - #:+sienna+ - #:+peru+ - #:+burlywood+ - #:+beige+ - #:+wheat+ - #:+sandybrown+ - #:+tan+ - #:+chocolate+ - #:+firebrick+ - #:+brown+ - #:+darksalmon+ - #:+salmon+ - #:+lightsalmon+ - #:+orange+ - #:+darkorange+ - #:+coral+ - #:+lightcoral+ - #:+tomato+ - #:+orangered+ - #:+red+ - #:+hotpink+ - #:+deeppink+ - #:+pink+ - #:+lightpink+ - #:+palevioletred+ - #:+maroon+ - #:+mediumvioletred+ - #:+violetred+ - #:+magenta+ - #:+violet+ - #:+plum+ - #:+orchid+ - #:+mediumorchid+ - #:+darkorchid+ - #:+darkviolet+ - #:+blueviolet+ - #:+purple+ - #:+mediumpurple+ - #:+thistle+ - #:+snow1+ - #:+snow2+ - #:+snow3+ - #:+snow4+ - #:+seashell1+ - #:+seashell2+ - #:+seashell3+ - #:+seashell4+ - #:+antiquewhite1+ - #:+antiquewhite2+ - #:+antiquewhite3+ - #:+antiquewhite4+ - #:+bisque1+ - #:+bisque2+ - #:+bisque3+ - #:+bisque4+ - #:+peachpuff1+ - #:+peachpuff2+ - #:+peachpuff3+ - #:+peachpuff4+ - #:+navajowhite1+ - #:+navajowhite2+ - #:+navajowhite3+ - #:+navajowhite4+ - #:+lemonchiffon1+ - #:+lemonchiffon2+ - #:+lemonchiffon3+ - #:+lemonchiffon4+ - #:+cornsilk1+ - #:+cornsilk2+ - #:+cornsilk3+ - #:+cornsilk4+ - #:+ivory1+ - #:+ivory2+ - #:+ivory3+ - #:+ivory4+ - #:+honeydew1+ - #:+honeydew2+ - #:+honeydew3+ - #:+honeydew4+ - #:+lavenderblush1+ - #:+lavenderblush2+ - #:+lavenderblush3+ - #:+lavenderblush4+ - #:+mistyrose1+ - #:+mistyrose2+ - #:+mistyrose3+ - #:+mistyrose4+ - #:+azure1+ - #:+azure2+ - #:+azure3+ - #:+azure4+ - #:+slateblue1+ - #:+slateblue2+ - #:+slateblue3+ - #:+slateblue4+ - #:+royalblue1+ - #:+royalblue2+ - #:+royalblue3+ - #:+royalblue4+ - #:+blue1+ - #:+blue2+ - #:+blue3+ - #:+blue4+ - #:+dodgerblue1+ - #:+dodgerblue2+ - #:+dodgerblue3+ - #:+dodgerblue4+ - #:+steelblue1+ - #:+steelblue2+ - #:+steelblue3+ - #:+steelblue4+ - #:+deepskyblue1+ - #:+deepskyblue2+ - #:+deepskyblue3+ - #:+deepskyblue4+ - #:+skyblue1+ - #:+skyblue2+ - #:+skyblue3+ - #:+skyblue4+ - #:+lightskyblue1+ - #:+lightskyblue2+ - #:+lightskyblue3+ - #:+lightskyblue4+ - #:+slategray1+ - #:+slategray2+ - #:+slategray3+ - #:+slategray4+ - #:+lightsteelblue1+ - #:+lightsteelblue2+ - #:+lightsteelblue3+ - #:+lightsteelblue4+ - #:+lightblue1+ - #:+lightblue2+ - #:+lightblue3+ - #:+lightblue4+ - #:+lightcyan1+ - #:+lightcyan2+ - #:+lightcyan3+ - #:+lightcyan4+ - #:+paleturquoise1+ - #:+paleturquoise2+ - #:+paleturquoise3+ - #:+paleturquoise4+ - #:+cadetblue1+ - #:+cadetblue2+ - #:+cadetblue3+ - #:+cadetblue4+ - #:+turquoise1+ - #:+turquoise2+ - #:+turquoise3+ - #:+turquoise4+ - #:+cyan1+ - #:+cyan2+ - #:+cyan3+ - #:+cyan4+ - #:+darkslategray1+ - #:+darkslategray2+ - #:+darkslategray3+ - #:+darkslategray4+ - #:+aquamarine1+ - #:+aquamarine2+ - #:+aquamarine3+ - #:+aquamarine4+ - #:+darkseagreen1+ - #:+darkseagreen2+ - #:+darkseagreen3+ - #:+darkseagreen4+ - #:+seagreen1+ - #:+seagreen2+ - #:+seagreen3+ - #:+seagreen4+ - #:+palegreen1+ - #:+palegreen2+ - #:+palegreen3+ - #:+palegreen4+ - #:+springgreen1+ - #:+springgreen2+ - #:+springgreen3+ - #:+springgreen4+ - #:+green1+ - #:+green2+ - #:+green3+ - #:+green4+ - #:+chartreuse1+ - #:+chartreuse2+ - #:+chartreuse3+ - #:+chartreuse4+ - #:+olivedrab1+ - #:+olivedrab2+ - #:+olivedrab3+ - #:+olivedrab4+ - #:+darkolivegreen1+ - #:+darkolivegreen2+ - #:+darkolivegreen3+ - #:+darkolivegreen4+ - #:+khaki1+ - #:+khaki2+ - #:+khaki3+ - #:+khaki4+ - #:+lightgoldenrod1+ - #:+lightgoldenrod2+ - #:+lightgoldenrod3+ - #:+lightgoldenrod4+ - #:+lightyellow1+ - #:+lightyellow2+ - #:+lightyellow3+ - #:+lightyellow4+ - #:+yellow1+ - #:+yellow2+ - #:+yellow3+ - #:+yellow4+ - #:+gold1+ - #:+gold2+ - #:+gold3+ - #:+gold4+ - #:+goldenrod1+ - #:+goldenrod2+ - #:+goldenrod3+ - #:+goldenrod4+ - #:+darkgoldenrod1+ - #:+darkgoldenrod2+ - #:+darkgoldenrod3+ - #:+darkgoldenrod4+ - #:+rosybrown1+ - #:+rosybrown2+ - #:+rosybrown3+ - #:+rosybrown4+ - #:+indianred1+ - #:+indianred2+ - #:+indianred3+ - #:+indianred4+ - #:+sienna1+ - #:+sienna2+ - #:+sienna3+ - #:+sienna4+ - #:+burlywood1+ - #:+burlywood2+ - #:+burlywood3+ - #:+burlywood4+ - #:+wheat1+ - #:+wheat2+ - #:+wheat3+ - #:+wheat4+ - #:+tan1+ - #:+tan2+ - #:+tan3+ - #:+tan4+ - #:+chocolate1+ - #:+chocolate2+ - #:+chocolate3+ - #:+chocolate4+ - #:+firebrick1+ - #:+firebrick2+ - #:+firebrick3+ - #:+firebrick4+ - #:+brown1+ - #:+brown2+ - #:+brown3+ - #:+brown4+ - #:+salmon1+ - #:+salmon2+ - #:+salmon3+ - #:+salmon4+ - #:+lightsalmon1+ - #:+lightsalmon2+ - #:+lightsalmon3+ - #:+lightsalmon4+ - #:+orange1+ - #:+orange2+ - #:+orange3+ - #:+orange4+ - #:+darkorange1+ - #:+darkorange2+ - #:+darkorange3+ - #:+darkorange4+ - #:+coral1+ - #:+coral2+ - #:+coral3+ - #:+coral4+ - #:+tomato1+ - #:+tomato2+ - #:+tomato3+ - #:+tomato4+ - #:+orangered1+ - #:+orangered2+ - #:+orangered3+ - #:+orangered4+ - #:+red1+ - #:+red2+ - #:+red3+ - #:+red4+ - #:+debianred+ - #:+deeppink1+ - #:+deeppink2+ - #:+deeppink3+ - #:+deeppink4+ - #:+hotpink1+ - #:+hotpink2+ - #:+hotpink3+ - #:+hotpink4+ - #:+pink1+ - #:+pink2+ - #:+pink3+ - #:+pink4+ - #:+lightpink1+ - #:+lightpink2+ - #:+lightpink3+ - #:+lightpink4+ - #:+palevioletred1+ - #:+palevioletred2+ - #:+palevioletred3+ - #:+palevioletred4+ - #:+maroon1+ - #:+maroon2+ - #:+maroon3+ - #:+maroon4+ - #:+violetred1+ - #:+violetred2+ - #:+violetred3+ - #:+violetred4+ - #:+magenta1+ - #:+magenta2+ - #:+magenta3+ - #:+magenta4+ - #:+orchid1+ - #:+orchid2+ - #:+orchid3+ - #:+orchid4+ - #:+plum1+ - #:+plum2+ - #:+plum3+ - #:+plum4+ - #:+mediumorchid1+ - #:+mediumorchid2+ - #:+mediumorchid3+ - #:+mediumorchid4+ - #:+darkorchid1+ - #:+darkorchid2+ - #:+darkorchid3+ - #:+darkorchid4+ - #:+purple1+ - #:+purple2+ - #:+purple3+ - #:+purple4+ - #:+mediumpurple1+ - #:+mediumpurple2+ - #:+mediumpurple3+ - #:+mediumpurple4+ - #:+thistle1+ - #:+thistle2+ - #:+thistle3+ - #:+thistle4+ - #:+gray0+ - #:+grey0+ - #:+gray1+ - #:+grey1+ - #:+gray2+ - #:+grey2+ - #:+gray3+ - #:+grey3+ - #:+gray4+ - #:+grey4+ - #:+gray5+ - #:+grey5+ - #:+gray6+ - #:+grey6+ - #:+gray7+ - #:+grey7+ - #:+gray8+ - #:+grey8+ - #:+gray9+ - #:+grey9+ - #:+gray10+ - #:+grey10+ - #:+gray11+ - #:+grey11+ - #:+gray12+ - #:+grey12+ - #:+gray13+ - #:+grey13+ - #:+gray14+ - #:+grey14+ - #:+gray15+ - #:+grey15+ - #:+gray16+ - #:+grey16+ - #:+gray17+ - #:+grey17+ - #:+gray18+ - #:+grey18+ - #:+gray19+ - #:+grey19+ - #:+gray20+ - #:+grey20+ - #:+gray21+ - #:+grey21+ - #:+gray22+ - #:+grey22+ - #:+gray23+ - #:+grey23+ - #:+gray24+ - #:+grey24+ - #:+gray25+ - #:+grey25+ - #:+gray26+ - #:+grey26+ - #:+gray27+ - #:+grey27+ - #:+gray28+ - #:+grey28+ - #:+gray29+ - #:+grey29+ - #:+gray30+ - #:+grey30+ - #:+gray31+ - #:+grey31+ - #:+gray32+ - #:+grey32+ - #:+gray33+ - #:+grey33+ - #:+gray34+ - #:+grey34+ - #:+gray35+ - #:+grey35+ - #:+gray36+ - #:+grey36+ - #:+gray37+ - #:+grey37+ - #:+gray38+ - #:+grey38+ - #:+gray39+ - #:+grey39+ - #:+gray40+ - #:+grey40+ - #:+gray41+ - #:+grey41+ - #:+gray42+ - #:+grey42+ - #:+gray43+ - #:+grey43+ - #:+gray44+ - #:+grey44+ - #:+gray45+ - #:+grey45+ - #:+gray46+ - #:+grey46+ - #:+gray47+ - #:+grey47+ - #:+gray48+ - #:+grey48+ - #:+gray49+ - #:+grey49+ - #:+gray50+ - #:+grey50+ - #:+gray51+ - #:+grey51+ - #:+gray52+ - #:+grey52+ - #:+gray53+ - #:+grey53+ - #:+gray54+ - #:+grey54+ - #:+gray55+ - #:+grey55+ - #:+gray56+ - #:+grey56+ - #:+gray57+ - #:+grey57+ - #:+gray58+ - #:+grey58+ - #:+gray59+ - #:+grey59+ - #:+gray60+ - #:+grey60+ - #:+gray61+ - #:+grey61+ - #:+gray62+ - #:+grey62+ - #:+gray63+ - #:+grey63+ - #:+gray64+ - #:+grey64+ - #:+gray65+ - #:+grey65+ - #:+gray66+ - #:+grey66+ - #:+gray67+ - #:+grey67+ - #:+gray68+ - #:+grey68+ - #:+gray69+ - #:+grey69+ - #:+gray70+ - #:+grey70+ - #:+gray71+ - #:+grey71+ - #:+gray72+ - #:+grey72+ - #:+gray73+ - #:+grey73+ - #:+gray74+ - #:+grey74+ - #:+gray75+ - #:+grey75+ - #:+gray76+ - #:+grey76+ - #:+gray77+ - #:+grey77+ - #:+gray78+ - #:+grey78+ - #:+gray79+ - #:+grey79+ - #:+gray80+ - #:+grey80+ - #:+gray81+ - #:+grey81+ - #:+gray82+ - #:+grey82+ - #:+gray83+ - #:+grey83+ - #:+gray84+ - #:+grey84+ - #:+gray85+ - #:+grey85+ - #:+gray86+ - #:+grey86+ - #:+gray87+ - #:+grey87+ - #:+gray88+ - #:+grey88+ - #:+gray89+ - #:+grey89+ - #:+gray90+ - #:+grey90+ - #:+gray91+ - #:+grey91+ - #:+gray92+ - #:+grey92+ - #:+gray93+ - #:+grey93+ - #:+gray94+ - #:+grey94+ - #:+gray95+ - #:+grey95+ - #:+gray96+ - #:+grey96+ - #:+gray97+ - #:+grey97+ - #:+gray98+ - #:+grey98+ - #:+gray99+ - #:+grey99+ - #:+gray100+ - #:+grey100+ - #:+darkgrey+ - #:+darkgray+ - #:+darkblue+ - #:+darkcyan+ - #:+darkmagenta+ - #:+darkred+ - #:+lightgreen+)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/parse-x11-colors.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/parse-x11-colors.lisp deleted file mode 100644 index 4735c20..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/parse-x11-colors.lisp +++ /dev/null @@ -1,68 +0,0 @@ -;;; parse X11's rgb.txt -;;; -;;; no packages defined as this should just be run as a script. - -(require :cl-ppcre) -(require :alexandria) - -(defun write-package-file (colornames - &key (package-template-path "package-template.lisp") - (package-file-path "package.lisp")) - "Write a package definition file, exporting COLORNAMES, using the given template." - (let* ((package-template (alexandria:read-file-into-string package-template-path)) - (colornames-export - (reduce (lambda (a b) (format nil "~A~%~A" a b)) - colornames - :key (lambda (colorname) - (format nil " #:+~A+" colorname))))) - (with-open-file (package-file package-file-path - :direction :output - :if-exists :supersede - :if-does-not-exist :create) - (format package-file package-template colornames-export)) - (values))) - -(defun parse-and-write-color-definitions (&key - (source-path "/usr/share/X11/rgb.txt") - (destination-path "colornames.lisp")) - "Parse color definitions and write them into a file. Return the list of colors (for exporting)." - (let ((color-scanner ; will only take names w/o spaces - (cl-ppcre:create-scanner - "^\\s*(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+([\\s\\w]+\?)\\s*$" - :extended-mode t)) - (comment-scanner (cl-ppcre:create-scanner "^\\s*!")) - colornames) - (with-open-file (source source-path - :direction :input - :if-does-not-exist :error) - (with-open-file (colordefs destination-path - :direction :output - :if-exists :supersede - :if-does-not-exist :create) - (format colordefs ";;;; This file was generated automatically ~ -by parse-x11.lisp~%~ -;;;; Please do not edit directly, just run make if necessary (but should not be).~2%~ - (in-package #:cl-colors)~2%") - (labels ((parse-channel (string) - (let ((i (read-from-string string))) - (assert (and (typep i 'integer) (<= i 255))) - (/ i 255)))) - (do ((line (read-line source nil nil) (read-line source nil nil))) - ((not line)) - (unless (cl-ppcre:scan-to-strings comment-scanner line) - (multiple-value-bind (match registers) - (cl-ppcre:scan-to-strings color-scanner line) - (if (and match (not (find #\space (aref registers 3)))) - (let ((colorname (string-downcase (aref registers 3)))) - (format colordefs - "(define-rgb-color ~A ~A ~A ~A)~%" - colorname - (parse-channel (aref registers 0)) - (parse-channel (aref registers 1)) - (parse-channel (aref registers 2))) - (push colorname colornames)) - (format t "ignoring line ~A~%" line))))))) - (nreverse colornames)))) - -(let ((colornames (parse-and-write-color-definitions))) - (write-package-file colornames)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/test.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/test.lisp deleted file mode 100644 index f44ce78..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-colors-20180328-git/test.lisp +++ /dev/null @@ -1,82 +0,0 @@ -(in-package #:cl-user) - -(defpackage #:cl-colors-tests - (:use #:alexandria #:common-lisp #:cl-colors #:let-plus #:lift) - (:export #:run)) - -(in-package #:cl-colors-tests) - -(deftestsuite cl-colors-tests () ()) - -(defun run () - "Run all the tests for CL-COLORS-TESTS." - (run-tests :suite 'cl-colors-tests)) - -(defun eps= (a b &optional (epsilon 1e-10)) - (<= (abs (- a b)) epsilon)) - -(defun rgb= (rgb1 rgb2 &optional (epsilon 1e-10)) - "Compare RGB colors for (numerical) equality." - (let+ (((&rgb red1 green1 blue1) rgb1) - ((&rgb red2 green2 blue2) rgb2)) - (and (eps= red1 red2 epsilon) - (eps= green1 green2 epsilon) - (eps= blue1 blue2 epsilon)))) - -(defun random-rgb () - (rgb (random 1d0) (random 1d0) (random 1d0))) - -(addtest (cl-colors-tests) - rgb<->hsv - (loop repeat 100 do - (let ((rgb (random-rgb))) - (ensure-same rgb (as-rgb (as-hsv rgb)) :test #'rgb=)))) - -;; (defun test-hue-combination (from to positivep) -;; (dotimes (i 21) -;; (format t "~a " (hue-combination from to (/ i 20) positivep)))) - -(addtest (cl-colors-tests) - print-hex-rgb - (let ((rgb (rgb 0.070 0.203 0.337))) - (ensure-same "#123456" (print-hex-rgb rgb)) - (ensure-same "123456" (print-hex-rgb rgb :hash nil)) - (ensure-same "#135" (print-hex-rgb rgb :short t)) - (ensure-same "135" (print-hex-rgb rgb :hash nil :short t)) - (ensure-same "#12345678" (print-hex-rgb rgb :alpha 0.47)) - (ensure-same "12345678" (print-hex-rgb rgb :alpha 0.47 :hash nil)) - (ensure-same "#1357" (print-hex-rgb rgb :alpha 0.47 :short t)) - (ensure-same "1357" (print-hex-rgb rgb :alpha 0.47 :hash nil :short t)))) - -(addtest (cl-colors-tests) - parse-hex-rgb - (let ((rgb (rgb 0.070 0.203 0.337))) - (ensure-same rgb (parse-hex-rgb "#123456") :test (rcurry #'rgb= 0.01)) - (ensure-same rgb (parse-hex-rgb "123456") :test (rcurry #'rgb= 0.01)) - (ensure-same rgb (parse-hex-rgb "#135") :test (rcurry #'rgb= 0.01)) - (ensure-same rgb (parse-hex-rgb "135") :test (rcurry #'rgb= 0.01)) - - (flet ((aux (list1 list2) - (and (rgb= (car list1) (car list2) 0.01) - (eps= (cadr list1) (cadr list2) 0.01)))) - (ensure-same (list rgb 0.47) (multiple-value-list (parse-hex-rgb "#12345678")) :test #'aux) - (ensure-same (list rgb 0.47) (multiple-value-list (parse-hex-rgb "12345678")) :test #'aux) - (ensure-same (list rgb 0.47) (multiple-value-list (parse-hex-rgb "#1357")) :test #'aux) - (ensure-same (list rgb 0.47) (multiple-value-list (parse-hex-rgb "1357")) :test #'aux)))) - -(addtest (cl-colors-tests) - print-hex-rgb/format - (ensure-same "#123456" (with-output-to-string (*standard-output*) - (print-hex-rgb (rgb 0.070 0.203 0.337) - :destination T)))) - -(addtest (cl-colors-tests) - hex<->rgb - (loop repeat 100 do - (let ((rgb (random-rgb))) - (ensure-same rgb (parse-hex-rgb (print-hex-rgb rgb)) :test (rcurry #'rgb= 0.01))))) - -(addtest (cl-colors-tests) - parse-hex-rgb-ranges - (ensure-same (rgb 0.070 0.203 0.337) (parse-hex-rgb "foo#123456zzz" :start 3 :end 10) - :test (rcurry #'rgb= 0.001))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/LICENSE.txt b/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/LICENSE.txt deleted file mode 100644 index 5eaf87c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/LICENSE.txt +++ /dev/null @@ -1,14 +0,0 @@ -CL-EMB has fixes by current maintainer, Michael Raskin <38a938c2@rambler.ru> -This fixes are Copyright (c) 2009 by Moscow Center of Continious -Mathematical Education. - -CL-EMB is written and Copyright (c) 2004, 2005, 2006 by Stefan Scholl. -Parts of the source are taken from LSP, written by -John Wiseman and copyright 2001, 2002 I/NET Inc. -See lsp-LICENSE.txt - -CL-EMB is licensed under the terms of the Lisp Lesser GNU -Public License (http://opensource.franz.com/preamble.html), known as -the LLGPL. The LLGPL consists of a preamble (see above URL) and the -LGPL. Where these conflict, the preamble takes precedence. -CL-EMB is referenced in the preamble as the "LIBRARY." diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/README.md b/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/README.md deleted file mode 100644 index 70d91e1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/README.md +++ /dev/null @@ -1,339 +0,0 @@ -# cl-emb: Embedded Common Lisp - -A mixture of features from eRuby and HTML::Template. You could name it "Yet -Another LSP" (LispServer Pages) but it's a bit more than that and not limited to -a certain server or text format. - -This is a mirror of http://mtn-host.prjek.net/projects/cl-emb - -The primary development repository is in Monotone, this repository will receive -just the automated snapshots. - -# License - -[LLGPL](http://opensource.franz.com/preamble.html) - -# Installing - -```lisp -(ql:quickload :cl-emb) -``` - -CL-EMB can also be installed manually with [ASDF-INSTALL](http://weitz.de/asdf-install/). - -# Usage - -## [generic function] `EXECUTE-EMB name &key env generator-maker => string` - -`NAME` can be a registered (with `REGISTER-EMB`) emb code or a pathname (type -`PATHNAME`) of a file containing the code. Returns a string. Keyword parameter -ENV to pass objects to the code. `ENV` must be a plist. `ENV` can be accessed -within your emb code. The `GENERATOR-MAKER` is a function which gets called -with a key and value from the given `ENV` and should return a generator function -like described -[here](http://www.cs.northwestern.edu/academics/courses/325/readings/graham/generators.html). - - -## [generic function] `REGISTER-EMB name code => emb-function` - -Internally registeres given `CODE` with `NAME` to be called with -`EXECUTE-EMB`. `CODE` can be a string or a pathname (type `PATHNAME`) of a file -containing the code. - -## [function] `PPRINT-EMB-FUNCTION name` - -`DEBUG` function. Pretty prints function form, if `*DEBUG*` was `T` when the -function was registered. - -## [function] `CLEAR-EMB name` - -Remove named emb code. - -## [function] `CLEAR-EMB-ALL` - -Remove all registered emb code. - -## [function] `CLEAR-EMB-ALL-FILES` - -Remove all registered file emb code (registered/executed by a pathname). - -## [special variable] `*EMB-START-MARKER*` (default `"<%"`) - -Start of scriptlet or expression. Remember that a following `#\=` indicates an -expression. - -## [special variable] `*EMB-END-MARKER*` (default `"%>"`) - -End of scriptlet or expression. - -## [special variable] `*ESCAPE-TYPE*` - -Default value for escaping `@var` output is `:RAW` Can be changed to `:XML`, -`:HTML`, `:URI`, `:URL`, `:URL-ENCODE`, `:LATEX`. - -## [special variable] `*FUNCTION-PACKAGE*` - -Package the emb function body gets interned to. - -Default: `(find-package :cl-emb-intern)`. - -## [special variable] `*DEBUG*` - -Debugging mode if `T`. Default: `NIL`. - -## [special variable] `*LOCKING-FUNCTION*` - -Function to call to lock access to an internal hash table. Must accept a -function designator which must be called with the lock hold. - -**IMPORTANT:** The locking function must return the value of the function it -calls! - -Example: - -```lisp -(defvar *emb-lock* (kmrcl::make-lock "emb-lock") - "Lock for CL-EMB.") - -(defun emb-lock-function (func) - "Lock function for CL-EMB." - (kmrcl::with-lock-held (*emb-lock*) - (funcall func))) - -(setf emb:*locking-function* 'emb-lock-function) -``` - -Files get cached and reread when they change. - -The emb code consists of normal text (HTML, XML, or any other text format) and -special tags you know from eRuby or JSP (JavaServer Pages) which can hold Common -Lisp or CL-EMB's template tags, perhaps comparable to JSP's taglib. - -- `<% ... %>` is a scriptlet tag, and wraps Common Lisp code. -- `<%= ... %>` is an expression tag. Its content gets evaluated and fed as a - parameter to `(FORMAT T "~A" ...)`. -- `<%# ... #%>` is a comment. Everything within will be removed/ignored. Can't - be nested! - -## Examples - -```lisp -CL-USER> (asdf:oos 'asdf:load-op :cl-emb) -CL-USER> (cl-emb:register-emb "test1" - "10 stars: <% (dotimes (i 10) %>*<% ) %>") -# -CL-USER> (cl-emb:execute-emb "test1") -"10 stars: **********" - -CL-USER> (cl-emb:register-emb "test2" "2 + 2 = <%= (+ 2 2) %>") -# -CL-USER> (cl-emb:execute-emb "test2") -"2 + 2 = 4" - -CL-USER> (let ((emb:*emb-start-marker* "")) - (emb:register-emb "marker-test" - "42 + 42 = ")) -# -CL-USER> (emb:execute-emb "marker-test") -"42 + 42 = 84" -``` - -# Template Tags - -You can use special template tags instead of Common Lisp code between `<%` and -`%>`. This will be translated to Common Lisp and serves as a simple shortcut for -you. - -And more important: It's easier to use for non-programmers. A designer can work -on HTML code and insert these simple template tags. - -Template tags start with `@`. - -Currently supported: `@if`, `@else`, `@endif`, `@ifnotempty`, `@unless`, -`@endunless`, `@var`, `@repeat`, `@endrepeat`, `@loop`, `@endloop`, `@include`, -`@includevar`, `@call`, `@with`, `@endwith`, `@set`, `@genloop`, `@endgenloop`, -`@insert`. - -`@if` and `@unless` check if the given parameter is set in the supplied -environment (parameter ENV of `EXECUTE-EMB`). The environment is a plist with -keyword + value pairs. Must be terminated with `@endif` or `@endunless`. - -`@ifnotempty` works like `@if` but considers the empty string false. - -`@ifequal` accepts two parameters interpreted as variable names. It works like -`@if` but checks whether the values of two variables are equal. Variable names -are intepreted as in `@var`. - -Note that `@ifnotempty` and `@ifequal` are supposed to be used together with -`@else` and `@endif`. - -`@var` emits the corresponding value from the environment. Uses the escape type -defined in `*ESCAPE-TYPE*` (Default `:raw`, no escaping) or with -escape -modifier. E.g. `<% @var foo -escape xml %>` or without modifier `<% @var foo -%>` Supported escaping: `raw`, `xml` (aka `html`), `uri` (aka `url` or -`url-encode`), `latex`. - -`@insert` inserts a given (text) file. Parameter from the environment. E.g. `<% -@insert textfile %>`. - -`@repeat` repeats everything between it and `@endrepeat` the given -times. Parameter can be a number or a name. The name will be used to lookup the -corresponding value from the environment. - -`@loop` loops over a named list in the environment. Environment gets set to -current plist inside this list. Must be terminated with `@endloop`. - -`@include` includes a given file. Relative to current template. `@includevar` -does the same, but the parameter is treated like a variable name containing the -path to the file. Variable name is treated like in `@var`. - -`@call` calls a given emb-function, which was registered with `REGISTER-EMB`. - -`@with` is similar to `@loop` as it sets the current environment to the named -plist. `@loop` needs a list of plists and `@with` just a plist associated to the -given name. Block ends in `@endwith`. - -`@set` is used to set special variables like `*ESCAPE-TYPE*` from within a emb -code. This way a default for a file can be specified in the file itself. The -variables are changed for the current and called/included code. Changes to the -variables in called/included code don't effect the caller/ includer. E.g. `<% -@set escape=uri %>`. Currently supported: `escape` (`raw`, `xml`, `html`, `url`, -`uri`, `url-encode`, `latex`). - -`@genloop` starts a special kind of loop: a generator loop. It must be -terminated by `@endgenloop` and operates on a generator returned by the given -`GENERATOR-MAKER` (see `EXECUTE-EMB`). The `GENERATOR-MAKER` gets called with -two parameters: the key (which is the argument to `@genloop`) and the -corresponding value in the plist. Each time in the loop the generator is called -first with the parameter `:TEST` to see if there's data left. The generator -must return a plist on `:NEXT`, which will be the current `ENV` (like `@with` or -within a normal `@loop`). - -The parameters which access the environment can just be the name of a keyword -symbol in the plist. `foo` -> :FOO in `(:FOO "bar")` Or you can provide a path -within a nested plist structure by dividing the parts of the path with a -slash. `foo/bar` -> Value of `:BAR` inside the plist at `:FOO`. `(:FOO (:BAR -"yeah"))` -> `"yeah"` Starting the parameter with a slash lets it traverse the -nested plists from the top. That way you can access top values inside loops. - -Writing `<% @var foo/bar/quux %>` can be translated to `(GETF (GETF (GETF ENV -:FOO) :BAR) :QUUX)`. - -## Examples - -```lisp -CL-USER> (cl-emb:register-emb "test1" - "Foo: <% @if foo %>Yes!<% @else %>No!<% @endif %>") -# -CL-USER> (cl-emb:execute-emb "test1" :env '(:foo t)) -"Foo: Yes!" -CL-USER> (cl-emb:execute-emb "test1") -"Foo: No!" -CL-USER> (cl-emb:execute-emb "test1" :env '(:foo nil)) -"Foo: No!" - -CL-USER> (cl-emb:register-emb "test2" - "What is set? -> <% @call test1 %>") -# -CL-USER> (cl-emb:execute-emb "test2" :env '(:foo t)) -"What is set? -> Foo: Yes!" - -CL-USER> (cl-emb:register-emb "test3" - "10 stars: <% @repeat 10 %>*<% @endrepeat %>") -# -CL-USER> (cl-emb:execute-emb "test3") -"10 stars: **********" - -CL-USER> (cl-emb:register-emb "test4" - "<% @loop numbers %>[<% @var de %>,<% @var en %>]<% @endloop %>") -# -CL-USER> (cl-emb:execute-emb "test4" - :env '(:numbers ((:de "EINS" :en "ONE") - (:de "ZWEI" :en "TWO")))) -"[EINS,ONE][ZWEI,TWO]" - -CL-USER> (emb:register-emb "test5" - "\"><% @var foo %>") -# -CL-USER> (let ((emb:*escape-type* :html)) - (emb:execute-emb "test5" :env '(:foo "10 > 7"))) -"10 > 7" - -CL-USER> (emb:register-emb "test6" "1. <% @with one %>BAZ: <% @var baz %><% @endwith%> -2. <% @with two %>BAZ: <% @var baz %><% @endwith%>") -# -CL-USER> (emb:execute-emb "test6" :env '(:one (:baz "first") - :two (:baz "second"))) -"1. BAZ: first -2. BAZ: second" - -CL-USER> (emb:register-emb "test7" " - <% @var foo -escape uri %> - ") -# -CL-USER> (emb:pprint-emb-function "test7") - -(LAMBDA (&OPTIONAL CL-EMB-INTERN::ENV) - (WITH-OUTPUT-TO-STRING (*STANDARD-OUTPUT*) - (PROGN - (WRITE-STRING " - ") - (FORMAT T "~A" (CL-EMB::ECHO (GETF CL-EMB-INTERN::ENV :FOO) :ESCAPE :URI)) - (WRITE-STRING " - ")))) -; No value - -CL-USER> (emb:register-emb "test8" "<% @set escape=xml %>--<% @var hey %>--") -# -CL-USER> (emb:register-emb "test9" "--<% @var hey %>--<% @call test8 %>--<% @var hey %>--") -# -CL-USER> (emb:execute-emb "test9" :env '(:hey "5>2")) -"--5>2----5>2----5>2--" - -CL-USER> (emb:register-emb "test10" "Square root from 1 to <% @var numbers %>: <% @genloop numbers %>sqrt(<% @var number %>) = <% @var sqrt %> <% @endgenloop %>") -# -CL-USER> (defun make-sqrt-1-to-n-gen (key n) - (declare (ignore key)) - (let ((i 1)) - #'(lambda (cmd) - (ecase cmd - (:test (> i n)) - (:get `(:number ,i :sqrt ,(sqrt i))) - (:next (prog1 `(:number ,i :sqrt ,(sqrt i)) - (unless (> i n) - (incf i)))))))) -MAKE-SQRT-1-TO-N-GEN -CL-USER> (emb:execute-emb "test10" :env '(:numbers 10) :generator-maker 'make-sqrt-1-to-n-gen) -"Square root from 1 to 10: sqrt(1) = 1.0 sqrt(2) = 1.4142135 sqrt(3) = 1.7320508 sqrt(4) = 2.0 sqrt(5) = 2.236068 sqrt(6) = 2.4494898 sqrt(7) = 2.6457512 sqrt(8) = 2.828427 sqrt(9) = 3.0 sqrt(10) = 3.1622777 " - -CL-USER> (emb:register-emb "test11" "<% @loop bands %>Band: <% @var band %> (Genre: <% @var /genre %>)
<% @endloop %>") -# -CL-USER> (emb:execute-emb "test11" :env '(:genre "Rock" :bands ((:band "Queen") (:band "The Rolling Stones") (:band "ZZ Top")))) -"Band: Queen (Genre: Rock)
Band: The Rolling Stones (Genre: Rock)
Band: ZZ Top (Genre: Rock)
" - -CL-USER> (emb:register-emb "test12" "<% @repeat /foo/bar/count %>*<% @endrepeat %>") -# -CL-USER> (emb:execute-emb "test12" :env '(:foo (:bar (:count 42)))) -"******************************************" - -CL-USER> (emb:register-emb "test13" "The file:
<% @insert textfile %>
") -# -CL-USER> (emb:execute-emb "test13" :env '(:textfile "/etc/gentoo-release")) -"The file:
Gentoo Base System version 1.6.14
-
" -``` - -# Credits - -Uses code from John Wiseman. See http://lemonodor.com/archives/000128.html and -lsp-LICENSE.txt Thanks to Edi Weitz for letting me use his code for -`ESCAPE-FOR-XML`. - -Thanks to Eitarow Fukamachi for the whitespace-trimming patch. - -Thanks to Christoph Finkensiep for making `getf*` a generic function. - -# Author - -Stefan Scholl - -# Current Maintainer - -Michael Raskin <38a938c2@rambler.ru> diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/TODO b/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/TODO deleted file mode 100644 index f8a1418..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/TODO +++ /dev/null @@ -1,14 +0,0 @@ - -- Documentation - -- More examples - -- Tests - -- Writing own escape functions? - -- Better error handling - -- Examples for generator loop in the examples.html - -- Export GETF-EMB diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/cl-emb.asd b/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/cl-emb.asd deleted file mode 100644 index 695e8b6..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/cl-emb.asd +++ /dev/null @@ -1,26 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- - -;;; This software is Copyright (c) Stefan Scholl, 2004. -;;; Stefan Scholl grants you the rights to distribute -;;; and use this software as governed by the terms -;;; of the Lisp Lesser GNU Public License -;;; (http://opensource.franz.com/preamble.html), -;;; known as the LLGPL. - - -(in-package #:cl-user) - -(defpackage #:cl-emb.system - (:use #:cl - #:asdf)) - -(in-package #:cl-emb.system) - -(defsystem #:cl-emb - :version "0.4.3" - :author "Stefan Scholl " - :licence "Lesser Lisp General Public License" - :description "A templating system for Common Lisp" - :depends-on (#:cl-ppcre) - :components ((:file "packages") - (:file "emb" :depends-on ("packages")))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/emb.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/emb.lisp deleted file mode 100644 index bcf3a3b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/emb.lisp +++ /dev/null @@ -1,523 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- - -;;; This file contains some fixes by Michael Raskin -;;; They are Copyright (c) Moscow Center of Continious Mathematical -;;; Education, 2009 - -;;; This software is Copyright (c) Stefan Scholl, 2004. -;;; Stefan Scholl grants you the rights to distribute -;;; and use this software as governed by the terms -;;; of the Lisp Lesser GNU Public License -;;; (http://opensource.franz.com/preamble.html), -;;; known as the LLGPL. - -;;; Parts of the source are taken from LSP, written by -;;; John Wiseman and copyright 2001, 2002 I/NET Inc. -;;; (http://www.inetmi.com/) -;;; See lsp-LICENSE.txt - - -(in-package :cl-emb) - -(defpackage :cl-emb-intern (:use :cl)) - -(defvar *function-package* (find-package :cl-emb-intern) - "Package the emb function body gets interned to.") - -(defvar *debug* nil - "Debugging for CL-EMB.") - -(defvar *locking-function* nil - "Function to call to lock access to an internal hash table. Must accept -a function designator which must be called with the lock hold.") - - -(defmacro with-lock (&body body) - "Locking all accesses to *functions*" - `(cond (*locking-function* - (funcall *locking-function* #'(lambda () ,@body))) - (t ,@body))) - -(defgeneric execute-emb (name &key env generator-maker) - (:documentation "Execute named emb code. Returns a string. Keyword parameter ENV -to pass objects to the code. ENV must be a plist.")) - -(defmethod execute-emb ((name t) &key env generator-maker) - (funcall (get-emb-function name) :env env :generator-maker generator-maker :name name)) - -(defmethod execute-emb ((name pathname) &key env generator-maker) - (let ((fun (or (get-emb-function name) - (emb-function-function (register-emb name name))))) - (funcall fun :env env :generator-maker generator-maker :name name))) - -(defvar *functions* (make-hash-table :test #'equal) - "Table mapping names to emb-function instances.") - -(defclass emb-function () - ((path :initarg :path - :accessor emb-function-path) - (time :initarg :time - :accessor emb-function-time) - (function :initarg :function - :accessor emb-function-function) - (form :initarg :form - :initform nil - :accessor emb-function-form))) - -(defun make-emb-function (path time function &optional form) - "Constructor for class EMB-FUNCTION." - (make-instance 'emb-function - :path path - :time time - :function function - :form form)) - - -(defun pprint-emb-function (name) - "DEBUG function. Pretty prints function form, if *DEBUG* was t -when the function was registered." - (with-lock - (pprint (emb-function-form (gethash name *functions*))))) - - -(defun clear-emb-all () - "Remove all registered emb code." - (with-lock - (clrhash *functions*))) - -(defun clear-emb (name) - "Remove named emb code." - (with-lock - (remhash name *functions*))) - -(defun clear-emb-all-files () - "Remove all registered file emb code (registered/executed by a pathname)." - (with-lock - (maphash (lambda (key value) (declare (ignore value)) - (when (typep key 'pathname) (remhash key *functions*))) - *functions*))) - -(defun get-emb-function (name) - "Returns the named function implementing a registered emb code. -Rebuilds it when text template was a file which has been modified." - (with-lock - (let* ((emb-function (gethash name *functions*)) - (path (when emb-function (emb-function-path emb-function)))) - (cond ((and (not (typep name 'pathname)) (null emb-function)) - (error "Function ~S not found." name)) - ((null emb-function) - (return-from get-emb-function)) - ((and path - (> (file-write-date path) (emb-function-time emb-function))) - ;; Update when file is newer - (multiple-value-bind (function form) - (construct-emb-function (contents-of-file path)) - (setf (emb-function-time emb-function) (file-write-date path) - (emb-function-function emb-function) function - (emb-function-form emb-function) form)))) - (emb-function-function emb-function)))) - - -(defgeneric register-emb (name code) - (:documentation "Register given CODE as NAME.")) - -(defmethod register-emb (name (code pathname)) - (multiple-value-bind (function form) - (construct-emb-function (contents-of-file code)) - (with-lock - (setf (gethash name *functions*) - (make-emb-function code - (file-write-date code) - function - form))))) - -(defmethod register-emb (name (code string)) - (multiple-value-bind (function form) - (construct-emb-function code) - (with-lock - (setf (gethash name *functions*) - (make-emb-function nil - (get-universal-time) - function - form))))) - -(defvar *emb-start-marker* "<%" - "Start of scriptlet or expression. Remember that a following #\= -indicates an expression.") - -(defvar *emb-end-marker* "%>" - "End of scriptlet or expression.") - - -(defparameter *set-special-list* - '(("escape" . "cl-emb:*escape-type*") - ("case-sensitivity" . "cl-emb:*case-sensitivity*"))) - -(defparameter *set-parameter-list* - '(("xml" . ":xml") - ("html" . ":html") - ("url" . ":url") - ("uri" . ":uri") - ("url-encode" . ":url-encode") - ("raw" . ":raw") - ("latex" . ":latex") - ("t" . "t") - ("nil" . "nil"))) - -;; TODO: Refactor! Looks a bit clumsy. -(defun set-specials (match &rest registers) - "Parse parameter(s) of @set and set special variables -like e. g. *ESCAPE-TYPE*." - ;; <% @set escape=xml schnuffel=poe %> - (declare (ignore match)) - (let ((setf-pairs - (let ((setf-list nil)) - (dolist (pair (cl-ppcre:split "\\s+" (first registers)) - (when (first setf-list) - (format nil "~{ ~A~}" (reverse setf-list)))) - (destructuring-bind (left right) - (cl-ppcre:split "=" pair) - (let ((place (rest (assoc left *set-special-list* :test #'equalp))) - (value (rest (assoc right *set-parameter-list* :test #'equalp)))) - (when (and place value) - (push (concatenate 'string place " " value) setf-list)))))))) - (if setf-pairs - (format nil "(setf ~A)" setf-pairs) - ""))) - -(defparameter *template-tag-expand* - `(("\\s+@if\\s+(\\S+)\\s*" . " (cond ((cl-emb::autofuncall (cl-emb::getf-emb \"\\1\")) ") - ("\\s+@ifnotempty\\s+(\\S+)\\s*" . " (cond ((let* ((value (cl-emb::autofuncall (cl-emb::getf-emb \"\\1\")))) (or (numberp value) (> (length value) 0))) ") - ("\\s+@ifequal\\s+(\\S+)\\s+(\\S+)\\s*" . " (cond ((equal (format nil \"~a\" (cl-emb::autofuncall (cl-emb::getf-emb \"\\1\"))) (format nil \"~a\" (cl-emb::autofuncall (cl-emb::getf-emb \"\\2\")))) ") - ("\\s+@else\\s*" . " ) (t ") - ("\\s+@endif\\s*" . " )) ") - ("\\s+@unless\\s+(\\S+)\\s*" . " (cond ((not (cl-emb::autofuncall (cl-emb::getf-emb \"\\1\"))) ") - ("\\s+@endunless\\s*" . " )) ") - ("=?\\s+@var\\s+(\\S+)\\s+-(\\S+)\\s+(\\S+)\\s*" - . "= (cl-emb::echo (cl-emb::getf-emb \"\\1\") :\\2 :\\3) ") - ("=?\\s+@var\\s+(\\S+)\\s*" . "= (cl-emb::echo (cl-emb::getf-emb \"\\1\")) ") - ("\\s+@repeat\\s+(\\d+)\\s*" . " (dotimes (i \\1) ") - ("\\s+@repeat\\s+(\\S+)\\s*" . " (dotimes (i (or (cl-emb::autofuncall (cl-emb::getf-emb \"\\1\")) 0)) ") - ("\\s+@endrepeat\\s*" . " ) ") - ("\\s+@loop\\s+(\\S+)\\s*" . " (dolist (env (cl-emb::autofuncall (cl-emb::getf-emb \"\\1\"))) ") - ("\\s+@endloop\\s*" . " ) ") - ("\\s+@genloop\\s+(\\S+)\\s*" . " (let ((env) - (%gen (funcall generator-maker :\\1 - (cl-emb::getf-emb \"\\1\")))) - (loop - (when (funcall %gen :test) (return)) - (setq env (funcall %gen :next)) - (progn ") - ("\\s+@endgenloop\\s*" . " ))) ") - ("\\s+@with\\s+(\\S+)\\s*" . " (let ((env (cl-emb::autofuncall (cl-emb::getf-emb \"\\1\")))) ") - ("\\s+@endwith\\s*" . " ) ") - ("\\s+@include\\s+(\\S+)\\s*" . "= (let ((cl-emb:*escape-type* cl-emb:*escape-type*)) - (cl-emb:execute-emb (merge-pathnames \"\\1\" template-path-default) :env env :generator-maker generator-maker)) ") - ("\\s+@includevar\\s+(\\S+)\\s*" . "= (let* ((cl-emb:*escape-type* cl-emb:*escape-type*) - (parameter (cl-emb::autofuncall (cl-emb::getf-emb \"\\1\")))) - (unless parameter (error \"use of @includevar on undefined parameter ~s\" \"\\1\")) - (cl-emb:execute-emb (merge-pathnames parameter template-path-default) :env env :generator-maker generator-maker)) ") - ("\\s+@call\\s+(\\S+)\\s*" . "= (let ((cl-emb:*escape-type* cl-emb:*escape-type*)) - (cl-emb:execute-emb \"\\1\" :env env :generator-maker generator-maker)) ") - ("\\s+@insert\\s+(\\S+)\\s*" . "= (cl-emb::contents-of-file (merge-pathnames (cl-emb::autofuncall (cl-emb::getf-emb \"\\1\")) template-path-default)) ") - ("\\s+@set\\s+(.*?)\\s*" . ,(function set-specials)) - ("#.*" . "") - ) - "List of conses. FIRST is regex, REST replacement (STRING or FUNCTION). -Functions get called with two parameters: match and list of registers.") - -;; Code from Edi Weitz's TBNL -(defun escape-for-xml (string) - (with-output-to-string (out) - (with-input-from-string (in string) - (loop for char = (read-char in nil nil) - while char - do (case char - ((#\<) (write-string "<" out)) - ((#\>) (write-string ">" out)) - ((#\") (write-string """ out)) - ((#\') (write-string "'" out)) - ((#\&) (write-string "&" out)) - (otherwise (write-char char out))))))) - -(defun escape-by-table (string replacements) - (with-output-to-string (out) - (with-input-from-string (in string) - (loop for char = (read-char in nil nil) - while char - do (let ((new (find char replacements - :test 'equal - :key 'car))) - (if new - (write-string (cdr new) out) - (write-char char out)) - ))))) - -(defvar *latex-replacements*) -(setf *latex-replacements* - (mapcar - (lambda (x) `(,(character (car x)) . ,(cdr x))) - `( - ("#" . "\\#") - ("$" . "\\$") - ("%" . "\\%") - ("&" . "\\&") - ("_" . "\\_") - ("{" . "\\{") - ("}" . "\\}") - ("<" . "{$<$}") - (">" . "{$>$}") - ("\\" . "{$\\backslash{}$}") - ("|" . "{$\\vert{}$}") - ("~" . "{\\,$\\tilde{}$\\,}") - ("^" . "{\\,$\\hat{}$\\,}") - (,(string #\Return) . "~\\\\") - (,(string #\NewLine) . "~\\\\") - ("\"" . "{'{}'}") - (,(string (code-char 173)) . "\\-") ; Soft hyphen - (,(string (code-char 160)) . "~") ; No-break space - (,(string (code-char 8209)) . "-") ; Non-breaking hyphen - (,(string (code-char 8211)) . "--") ; En-dash - (,(string (code-char 8212)) . "---") ; Em-dash - (,(string (code-char 8470)) . "{\\textnumero}") ; Number sign - ))) - -(defun escape-for-latex (string) - (escape-by-table string - *latex-replacements*)) - -;; Inspired by Edi Weitz' ESCAPE-FOR-HTML -(defun url-encode (string) - "URL-encode a string." - (with-output-to-string (out) - (with-input-from-string (in string) - (loop for char = (read-char in nil nil) - while char - if (find char "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-.") - do (write-char char out) - else if (char= char #\Space) - do (write-char #\+ out) - else - do (format out "%~2,'0x" (char-code char)))))) - - -(defvar *case-sensitivity* nil - "Whether use case-sensitive mode (the default) or case-insensitive mode. If this is set NIL, the case of keys in ENV will be ignored.") - -(defun string-to-keyword (string) - "Interns a given STRING uppercased in the keyword package." - (nth-value 0 (intern - (if *case-sensitivity* - string - (string-upcase string)) :keyword))) - -(defgeneric getf* (thing key &optional default) - (:documentation "Returns a value by a key")) - -(defmethod getf* ((plist list) key &optional default) - "Uses getf to get a value from a plist" - (if *case-sensitivity* - (getf plist key default) - (loop for (k v) on plist by #'cddr - when (string-equal k key) - do (return v) - finally (return default)))) - -(defmethod getf* ((table hash-table) key &optional default) - "Uses gethash to get a value from a hash-table" - (gethash key table default)) - -(defmethod getf* ((object standard-object) key &optional default) - "Uses slot-value to get a value from a standard object, where the slot name is derived from key" - (let ((slot-name (intern (princ-to-string key) - (symbol-package (class-name (class-of object)))))) - (if (and (slot-exists-p object slot-name) - (slot-boundp object slot-name)) - (slot-value object slot-name) - default))) - -(defmacro getf-emb (key) - "Search either plist TOPENV or ENV according to the search path in KEY. KEY -is a string." - (let ((plist (if (char= (char key 0) #\/) - (find-symbol "TOPENV" emb:*function-package*) - (find-symbol "ENV" emb:*function-package*))) - (path-parts (cl-ppcre:split "/" key :sharedp t))) - (labels ((dig-plist (plist keys) - (if (null keys) - plist - (dig-plist - (if (zerop (length (first keys))) - plist - `(getf* ,plist ,(string-to-keyword (first keys)))) - (rest keys))))) - (dig-plist plist path-parts)))) - -(defvar *escape-type* :raw - "Default value for escaping @var output.") - -(defun autofuncall (v) - (if (functionp v) - (autofuncall (funcall v)) - v)) - -(defun echo (string &key (escape *escape-type*)) - "Emit given STRING. Escape if wanted (global or via ESCAPE keyword). -STRING can be NIL." - (let ((str (cond - ((stringp string) string) - ((null string) "") - ((functionp string) - (format nil "~a" (or (autofuncall string) ""))) - (t (format nil "~a" string)) - ))) - (case escape - ((:html :xml) - (escape-for-xml str)) - ((:latex) - (escape-for-latex str)) - ((:url :uri :url-encode) - (url-encode str)) - (otherwise ; incl. :raw - str)))) - -(defun insert-file (filename) - "Get given file FILENAME." - (contents-of-file filename)) - -(let ((scanner-hash (make-hash-table :test #'equal))) - (defun scanner-for-expand-template-tag (tag) - "Returns a CL-PPCRE scanner which matches a template tag expanded by EXPAND-TEMPLATE-TAGS. -Scanners are memoized in SCANNER-HASH once they are created." - (or (gethash tag scanner-hash) - (setf (gethash tag scanner-hash) - (ppcre:create-scanner tag)))) - (defun clear-expand-template-tag-hash () - "Removes all scanners for template tags from cache." - (clrhash scanner-hash))) - -(defun expand-template-tags (string) - "Expand template-tags (@if, @else, ...) to Common Lisp. -Replacement and regex in *TEMPLATE-TAG-EXPAND*" - (labels ((expand-tags (string &optional (expands *template-tag-expand*)) - (let ((regex (scanner-for-expand-template-tag - (concatenate 'string "(?is)" - "^" (first (first expands)) "$"))) - (replacement (rest (first expands)))) - (if (null (rest expands)) - (ppcre:regex-replace-all regex string replacement :simple-calls t) - (expand-tags - (ppcre:regex-replace-all regex string replacement :simple-calls t) - (rest expands)))))) - (ppcre:regex-replace-all (format nil "(?is)(~A\\-?)(.+?)(\\-?~A)" - (ppcre:quote-meta-chars *emb-start-marker*) - (ppcre:quote-meta-chars *emb-end-marker*)) - string - (lambda (match start-tag string end-tag) - (declare (ignore match)) - (if (ppcre:scan "(?is)^#.+#$" string) - "" - (concatenate 'string - start-tag - (expand-tags string) - end-tag))) - :simple-calls t))) - -(defvar *emb-stream-redirection* "with-output-to-string (*standard-output*)") - -(defun construct-emb-function (code) - "Builds and compiles the emb-function out of template code." - (let ((form - `,(let ((*package* *function-package*)) - (read-from-string - (format nil "(lambda (&key env generator-maker name)(declare (ignorable env generator-maker)) - (let ((topenv env) - (template-path-default (if (typep name 'pathname) name *default-pathname-defaults*))) - (declare (ignorable topenv template-path-default)) - (~a - (progn ~A))))" - *emb-stream-redirection* - (construct-emb-body-string - (expand-template-tags code))))))) - (values (compile nil form) - (when *debug* form)))) - -(defun contents-of-file (pathname) - "Returns a string with the entire contents of the specified file." - (with-open-file (in pathname :direction :input) - ;; See http://www.emmett.ca/~sabet/licensets/slurp.html - (let* ((file-length (file-length in)) - (seq (make-string file-length)) - (pos (read-sequence seq in))) - (if (< pos file-length) - (subseq seq 0 pos) - seq)))) - -(defun string-right-trim-spaces-until-newline (string) - (remove #\Newline (string-right-trim '(#\Space #\Tab) string) - :from-end t - :count 1)) - -;; (i) Converts text outside <% ... %> tags into calls -;; to WRITE-STRING, (ii) Text inside <% ... %> -;; ("scriptlets") is straight lisp code, (iii) Text inside <%= ... %> -;; ("expressions") becomes the argument to (FORMAT t "~A" ...) -;; The markers <% and %> can be overridden by setting -;; *emb-start-marker* and *emb-end-marker* -(defun construct-emb-body-string (code &optional (start 0)) - "Takes a string containing an emb code and returns a string -containing the lisp code that implements that emb code." - (multiple-value-bind (start-tag start-code tag-type trim-start-whitespaces) - (next-code code start) - (if (not start-tag) - (format nil "(write-string ~S)" (subseq code start)) - (let* ((end-code (search *emb-end-marker* code :start2 start-code)) - (trim-end-whitespaces (char= (char code (1- end-code)) #\-))) - (if (not end-code) - (error "EOF reached in EMB inside open '~A' tag." *emb-start-marker*) - (format nil "(write-string ~S) ~A ~A" - (if trim-start-whitespaces - (string-right-trim-spaces-until-newline (subseq code start start-tag)) - (subseq code start start-tag)) - (format nil (tag-template tag-type) - (subseq code start-code (if trim-end-whitespaces - (1- end-code) - end-code))) - (construct-emb-body-string - code - (if trim-end-whitespaces - (let ((next-pos (cl-ppcre:scan "(?:\\S|\\n)" code :start (+ end-code (length *emb-end-marker*))))) - (cond - ((null next-pos) (length code)) - ((char= (elt code next-pos) #\Newline) - (1+ next-pos)) - (t next-pos))) - (+ end-code (length *emb-end-marker*)))))))))) - - -;; Finds the next scriptlet or expression tag in EMB source. Returns -;; nil if none are found, otherwise returns 3 values: -;; 1. The position of the first character of the start tag. -;; 2. The position of the contents of the tag. -;; 3. The type of tag (:scriptlet or :expression). -;; 4. Whether trim whitespaces before the start tag. -(defun next-code (string start) - (let ((start-tag (search *emb-start-marker* string :start2 start))) - (if (not start-tag) - nil - (let ((start-code (+ start-tag (length *emb-start-marker*)))) - (case (and (> (length string) start-code) - (char string start-code)) - (#\= (values start-tag (1+ start-code) :expression nil)) - (#\- (values start-tag (1+ start-code) :scriptlet t)) - (otherwise (values start-tag start-code :scriptlet nil))))))) - - -;; Given a tag type (:scriptlet or :expression), returns a format -;; string to be used to generate source code from the contents of the -;; tag. -(defun tag-template (tag-type) - (ecase tag-type - ((:scriptlet) "~A") - ((:expression) "(format t \"~~A\" ~A)"))) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/examples.css b/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/examples.css deleted file mode 100644 index 1f644ae..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/examples.css +++ /dev/null @@ -1,18 +0,0 @@ - -body { font-family: sans-serif; - background-color: #fff; - color: #000; } - -pre { margin-top: 0; - margin-bottom: 0; } - -table { width: 100%; } - -th, td { text-align: left; - vertical-align: top; } - -th { background-color: #eee; } - -caption { font-weight: bold; } - -table, ol { margin-bottom: 2em; } diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/examples.html b/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/examples.html deleted file mode 100644 index 311cb33..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/examples.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - CL-EMB: Examples - - -

Some examples of CL-EMB usage

-
    -
  1. Combining CL-EMB with CL-WHO
  2. -
  3. A simple loop
  4. -
  5. Build a dropdown
  6. -
  7. Mark invalid form fields
  8. -
  9. Using generic templates
  10. -
- - - - - - - - - - - - - - - - - -
Combining CL-EMB with CL-WHO
- Description - - You can mix several methods of HTML generating together. Think of Lisp Markup Languages like CL-WHO. (Example code from the CL-WHO documentation.) -
- ENV - - NIL -
- Dependencies - - CL-WHO -
-
<h1>Music links</h1>
-<%
-(cl-who:with-html-output (*standard-output*)
-  (loop for (link . title) in 
-        '(("http://zappa.com/" . "Frank Zappa")
-          ("http://marcusmiller.com/" . "Marcus Miller")
-          ("http://www.milesdavis.com/" . "Miles Davis"))
-        do (cl-who:htm (:a :href link
-                           (:b (cl-who:str title)))
-                       :br)))
-%>
-
- - - - - - - - - - - - - - - - - - -
A simple loop
- Description - - The "Music links" example with template tags and a loop. This example isn't meant to prove anything! Use the method which fits your problem!
- The output of the title gets escaped by CL-EMB ("-escape html"). Depending on the situation you'd rather escape the output yourself and don't want to use any complicated modifiers in the template code itself. -
- ENV - -
'(:music-list
-  ((:link "http://zappa.com/" :title "Frank Zappa")
-   (:link "http://marcusmiller.com/" :title "Marcus Miller")
-   (:link "http://www.milesdavis.com/" :title "Miles Davis")))
-
- Dependencies - - - -
-
<h1>Music links</h1>
-<% @loop music-list %>
-<a href="<% @var link %>"><b><% @var title -escape html%></b></a><br />
-<% @endloop %>
-
- - - - - - - - - - - - - - - - - - -
Build a dropdown
- Description - - You can mix template style with embedded Common Lisp style. This example shows how to access the plist ENV. Within the loop (@loop) ENV gets bound to every plist in the list.
- TBNL is used to access a submitted parameter "product" and compare it to the current value attribute of the option element.
- Remember the escaping! Set cl-emb:*escape-type* to :html and all output of @var will be escaped correctly. -
- ENV - -
'(:products
-  ((:value "foo1" :text "Super Foo")
-   (:value "fooxl" :text "Super Foo XL")
-   (:value "bar2000" :text "Ultra Bar 2000")
-   (:value "hl2" :text "Half-Life 2")
-   (:value "dn4e4" :text "Vaporware")))
-
- Dependencies - - TBNL -
-
<select name="product">
-  <% @loop products %>
-    <option value="<% @var value %>"<%
-      (when (equal (getf env :value) (tbnl:parameter "product")) 
-    %> selected="selected"<% ) %>><% @var text %></option>
-  <% @endloop %>
-</select>
-
- - - - - - - - - - - - - - - - - - -
Mark invalid form fields
- Description - - Validate a form and mark the errors in the ENV plist.
- Again: Remember the escaping! -
- ENV - -
'(:email "stesch@home" :email-error t)
-
- Dependencies - - - -
-
<% @if email-error %>
-  <span class="error">Please provide valid e-mail address</span><br />
-<% @endif %>
-<input type="text" name="email" value="<% @var email %>"/>
-
- - - - - - - - - - - - - - - - - - -
Using generic templates
- Description - - You want to use generic templates which can be called with a defined set of parameters? Then @with and @endwith is what you are looking for. It sets the current ENV to the one accessed by a given name. See the example below, which calls a template for textinput fields. -
- ENV - -
'(:name (:name "name"
-         :length 40)
-  :e-mail (:name "email"
-           :value "no@no"
-           :error t
-           :length 120))
-
- Dependencies - - - -
-
Please enter your name:<br />
-<% @with name %>
-  <% @include "includes/textinput.tmpl" %>
-<% @endwith %>
-<br />
-Please enter your e-mail address:<br />
-<small>(Use the TLD <em>.invalid</em>
-if you don't want to receive mail</small>
-<% @with e-mail %>
-  <% @include "includes/textinput.tmpl" %>
-<% @endwith %>
-
- - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/lsp-LICENSE.txt b/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/lsp-LICENSE.txt deleted file mode 100644 index 776174f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/lsp-LICENSE.txt +++ /dev/null @@ -1,27 +0,0 @@ - -CL-EMB uses parts of LSP, written by John Wiseman. - -See the copyright notice and license for LSP: - ----8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<--- - -Copyright (c) 2001, 2002 I/NET Inc. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/packages.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/packages.lisp deleted file mode 100644 index 33285e3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-emb-20190521-git/packages.lisp +++ /dev/null @@ -1,31 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- - -;;; This software is Copyright (c) Stefan Scholl, 2004. -;;; Stefan Scholl grants you the rights to distribute -;;; and use this software as governed by the terms -;;; of the Lisp Lesser GNU Public License -;;; (http://opensource.franz.com/preamble.html), -;;; known as the LLGPL. - - -(in-package #:cl-user) - -(defpackage #:cl-emb - (:nicknames #:emb) - (:use #:cl) - (:export #:execute-emb - #:register-emb - #:pprint-emb-function - #:clear-emb - #:clear-emb-all - #:clear-emb-all-files - #:clear-expand-template-tag-hash - #:*debug* - #:*emb-start-marker* - #:*emb-end-marker* - #:*escape-type* - #:*case-sensitivity* - #:*locking-function* - #:*function-package* - #:getf* - #:construct-emb-function )) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/CHANGELOG b/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/CHANGELOG deleted file mode 100644 index 56cda02..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/CHANGELOG +++ /dev/null @@ -1,121 +0,0 @@ -Version 0.7.6 -2019-07-28 -Clisp has renamed ext:delete-dir to ext:delete-directory. -Fix get-default-temporary-directory on lispworks. - -Version 0.7.5 -2017-12-10 -Fix FILE-EXISTS-P to return directory truename in CLISP (chaitanyagupta) -Added support for Common Lisp implementation CLASP. (dg1sbg) - -Version 0.7.4 -2016-07-10 -Merge pull request #13 from vibs29/master (Hans Hübner) -Make copy-stream work for CMUCL Gray Streams (vibs29) - -Version 0.7.3 -2014-11-28 -remove version from cl-fad-test system (Hans Huebner) -update support information (Hans Huebner) - -Version 0.7.2 -2013-07-03 -Fix documentation glitch (inconsistent download link) (Luís Oliveira) - -Version 0.7.1 -2013-02-18 -Fix for LispWorks (R. Wilker) -Add :description to .asd file - -Version 0.7.0 -2013-01-23 -Tests, pathname manipulation functions (Marco Baringer) -Temporary files (merged by Marco Baringer) -Fix symlink behaviour for some platforms (Mihai Bazon and Janis Dzerins) - -Version 0.6.4 -2010-11-18 -Adapt to newer ClozureCL version (patch from Zach Beane, thanks to Chun Tian and Ralph Moritz as well) - -Version 0.6.3 -2009-09-30 -Removed dependency on :SB-EXECUTABLE (thanks to Attila Lendvai and Tobias Rittweiler) - -Version 0.6.2 -2008-03-12 -Never version of OpenMCL have %RMDIR (thanks to Dmitri Hrapof) - -Version 0.6.1 -2007-12-29 -Integrated CLISP patch for LIST-DIRECTORY sent by Dan Muller - -Version 0.6.0 -2007-05-28 -Support for Scieneer CL (patch from Douglas Crosher) - -Version 0.5.2 -2007-05-15 -Fix for (newer versions of) ECL (patch from Dustin Long) - -Version 0.5.1 -2006-08-11 -Added CHECKP to COPY-STREAM - -Version 0.5.0 -2006-04-21 -Added :BREADTH-FIRST option to WALK-DIRECTORY (thanks to Mac Chan) - -Version 0.4.3 -2006-03-15 -For CMUCL use TRUENAME with UNIX-RMDIR to cope with search lists (reported by Pawel Ostrowski) - -Version 0.4.2 -2006-01-04 -WALK-DIRECTORY now catches circular symbolic links (thanks to Gary King) - -Version 0.4.1 -2006-01-03 -Be more careful in DIRECTORY-WILDCARD (thanks to Gary King) -Patches for MCL (thanks to Gary King) - -Version 0.4.0 -2005-12-10 -Exported COPY-STREAM (suggested by Chris Dean) - -Version 0.3.3 -2005-11-14 -Fixed %RMDIR for newer versions of OpenMCL (thanks to James Bielman) - -Version 0.3.2 -2005-09-11 -Fixed docs (correct name DELETE-DIRECTORY-AND-FILES) -Fixed docs (OVERWRITE was missing in COPY-FILE signature) -Added Debian link - -Version 0.3.1 -2005-06-02 -Fixed typo in fad.lisp (thanks to Jack D. Unrue) - -Version 0.3.0 -2005-06-01 -Support for ABCL (thanks to Jack D. Unrue) - -Version 0.2.0 -2005-05-29 -Support for ECL (thanks to Maciek Pasternacki) - -Version 0.1.3 -2005-04-27 -Changed implementation of DIRECTORY-EXISTS-P for LispWorks - -Version 0.1.2 -2005-03-17 -Fixed typo in cl-fad.system (tanks to Andrew Philpot) - -Version 0.1.1 -2005-01-22 -Fixed typos and versioning - -Version 0.1.0 -2005-01-22 -Initial release diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/LICENSE b/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/LICENSE deleted file mode 100644 index 1ca070d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -;;; Copyright (c) 2004, Peter Seibel. All rights reserved. -;;; Copyright (c) 2004-2010, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHORS 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/README b/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/README deleted file mode 100644 index 3cb156f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/README +++ /dev/null @@ -1,38 +0,0 @@ -Complete documentation for CL-FAD can be found in the 'docs' -directory or at . - -CL-FAD also supports Nikodemus Siivola's HYPERDOC, see - and -. - -1. Installation - -1.1. Probably the easiest way is - - (load "/path/to/cl-fad/load.lisp") - - This should compile and load CL-FAD on most Common Lisp - implementations. - -1.2. With MK:DEFSYSTEM you can make a symbolic link from - 'cl-fad.system' and 'cl-fad-test.system' to your central registry - (which by default is in '/usr/local/lisp/Registry/') and then issue - the command - - (mk:compile-system "cl-fad") - - Note that this relies on TRUENAME returning the original file a - symbolic link is pointing to. This will only work with AllegroCL - 6.2 if you've applied all patches with (SYS:UPDATE-ALLEGRO). - -1.3. You can also use ASDF instead of MK:DEFSYSTEM in a similar way - (use the .asd files instead of the .system files). - -1.4. Via QuickLisp: - - (ql:quickload :cl-fad) - -2. Test - -CL-FAD comes with a small test suite. To start it just load the file -"test.lisp" and evaluate (CL-FAD-TEST:TEST). diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/cl-fad.asd b/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/cl-fad.asd deleted file mode 100644 index c6f43a8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/cl-fad.asd +++ /dev/null @@ -1,50 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-fad/cl-fad.asd,v 1.21 2009/09/30 14:23:09 edi Exp $ - -;;; Copyright (c) 2004-2010, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#+:allegro (cl:require :osi) - -(asdf:defsystem #:cl-fad - :version "0.7.6" - :description "Portable pathname library" - :serial t - :license "BSD-2-Clause" - :components ((:file "packages") - #+:cormanlisp (:file "corman") - #+:openmcl (:file "openmcl") - (:file "fad") - (:file "path" :depends-on ("fad")) - (:file "temporary-files" :depends-on ("fad"))) - :depends-on (#+sbcl :sb-posix :bordeaux-threads :alexandria)) - -(asdf:defsystem #:cl-fad-test - :serial t - :components ((:file "packages.test") - (:file "fad.test" :depends-on ("packages.test")) - (:file "temporary-files.test" :depends-on ("packages.test"))) - :depends-on (:cl-fad :unit-test :cl-ppcre)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/cl-fad.system b/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/cl-fad.system deleted file mode 100644 index de147f8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/cl-fad.system +++ /dev/null @@ -1,48 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-fad/cl-fad.system,v 1.8 2008/03/12 00:10:43 edi Exp $ - -;;; Copyright (c) 2005-2008, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package #:cl-user) - -(defparameter *cl-fad-base-directory* - (make-pathname :name nil :type nil :version nil - :defaults (parse-namestring *load-truename*))) - -#+:allegro (require :osi) -#+:sbcl (require :sb-executable) -#+:sbcl (require :sb-posix) - -(mk:defsystem #:cl-fad - :source-pathname *cl-fad-base-directory* - :source-extension "lisp" - :components ((:file "packages") - #+:cormanlisp (:file "corman" :depends-on ("packages")) - #+:openmcl (:file "openmcl" :depends-on ("packages")) - (:file "fad" :depends-on ("packages" - #+:cormanlisp "corman" - #+:openmcl "openmcl")))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/corman.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/corman.lisp deleted file mode 100644 index fa9e90d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/corman.lisp +++ /dev/null @@ -1,86 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-fad/corman.lisp,v 1.5 2009/09/30 14:23:09 edi Exp $ - -;;; Copyright (c) 2004-2010, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHORS 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl) - -(defun wild-pathname-p (pathspec &optional field) - (unless (pathnamep pathspec) - (setq pathspec (pathname pathspec))) - (labels ((name-wild-p (name) - (or (eq :wild name) - (and (stringp name) - (string= "*" name)))) - (dir-wild-p (dir) - (or (find :wild dir) - (find :wild-inferiors dir) - (find "*" dir :test #'string=)))) - (case field - ((:name) - (name-wild-p (pathname-name pathspec))) - ((:type) - (name-wild-p (pathname-type pathspec))) - ((:directory) - (dir-wild-p (pathname-directory pathspec))) - ((nil) - (or (name-wild-p (pathname-name pathspec)) - (name-wild-p (pathname-type pathspec)) - (dir-wild-p (pathname-directory pathspec)))) - (t nil)))) - -(defun file-namestring (pathspec) - (flet ((string-list-for-component (component) - (cond ((eq component :wild) - (list "*")) - (component - (list component)) - (t nil)))) - (let* ((pathname (pathname pathspec)) - (name (pathnames::pathname-internal-name pathname)) - (type (pathnames::pathname-internal-type pathname))) - (format nil "~{~A~}~{.~A~}" - (string-list-for-component name) - (string-list-for-component type))))) - -(in-package :win32) - -(defwinapi RemoveDirectory - ((lpPathName LPCSTR)) - :return-type BOOL - :library-name "Kernel32" - :entry-name "RemoveDirectoryA" - :linkage-type :pascal) - -(defun delete-directory (pathspec) - "Deletes the empty directory denoted by the pathname designator -PATHSPEC. Returns true if successful, NIL otherwise." - (win:RemoveDirectory - (ct:lisp-string-to-c-string - (namestring (pathname pathspec))))) - -(export 'delete-directory) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/docs/index.html b/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/docs/index.html deleted file mode 100644 index 22afad5..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/docs/index.html +++ /dev/null @@ -1,700 +0,0 @@ - - - - - - CL-FAD - A portable pathname library for Common Lisp - - - - - -

CL-FAD - A portable pathname library for Common Lisp

- -
-
 

Abstract

- -CL-FAD (for "Files and -Directories") is a thin layer atop Common -Lisp's standard pathname functions. It is intended to provide some -unification between current CL implementations on Windows, OS X, -Linux, and Unix. Most of the code was written by Peter Seibel for his book Practical Common Lisp. - -

- -CL-FAD comes with a BSD-style -license so you can basically do with it whatever you want. - -

-Download shortcut: http://weitz.de/files/cl-fad.tar.gz. -

- -
 

Contents

-
    -
  1. Download and installation -
  2. Supported Lisp implementations -
  3. The CL-FAD dictionary -
      -
    1. Querying files, directories and pathnames -
        -
      1. directory-exists-p [function] -
      2. directory-pathname-p [function] -
      3. file-exists-p [function] -
      4. pathname-absolute-p [function] -
      5. pathname-equal [function] -
      6. pathname-relative-p [function] -
      7. pathname-root-p [function] -
    2. -
    3. Manipulating pathnames -
        -
      1. canonical-pathname [function] -
      2. merge-pathnames-as-directory [function] -
      3. merge-pathnames-as-file [function] -
      4. pathname-as-directory [function] -
      5. pathname-as-file [function] -
      6. pathname-directory-pathname [function] -
      7. pathname-parent-directory [function] -
    4. -
    5. Traversing directories -
        -
      1. list-directory [function] -
      2. walk-directory [function] -
    6. -
    7. Temporary Files -
        -
      1. open-temporary [function] -
      2. with-output-to-temporary-file [macro] -
      3. with-open-temporary-file [macro] -
      4. *default-template* [variable] -
      5. cannot-create-temporary-file [condition] -
      6. invalid-temporary-pathname-template [condition] -
      7. missing-temp-environment-variable [condition] -
      8. temporary-files [logical pathname host] -
      -
    8. -
    9. Modifying the file system -
        -
      1. copy-file [function] -
      2. copy-stream [function] -
      3. delete-directory-and-files [function] -
    10. -
    11. path [package] -
    -
  4. Acknowledgements -
- - - -
 

Download and installation

- -CL-FAD together with this documentation can be downloaded from https://github.com/edicl/cl-fad/releases/latest. The -current version is 0.7.6. -

-CL-FAD comes with simple system definitions for MK:DEFSYSTEM and asdf so you can either adapt it -to your needs or just unpack the archive and from within the CL-FAD -directory start your Lisp image and evaluate the form -(mk:compile-system "cl-fad") - or (asdf:oos 'asdf:load-op :cl-fad) for asdf - which should compile and load the whole -system. -Installation via asdf-install should as well -be possible. Plus, there are ports -for Gentoo Linux thanks to Matthew Kennedy -and for Debian Linux thanks to René van Bevern. -

-If for some reason you can't or don't want to use MK:DEFSYSTEM or asdf you -can just LOAD the file load.lisp. -

-The latest version of the source code lives in the github repository edicl/cl-fad. - -If you want to send patches, -please read this first. -Please submit your changes -as GitHub pull -request". - -
 

Supported Lisp implementations

- -

-The following Common Lisp implementations are currently supported: -

- -I'll gladly accepts patches to make CL-FAD work on other platforms. - - -
 

The CL-FAD dictionary

- -

Querying files, directories and pathnames

- -


[Function] -
directory-exists-p pathspec => generalized-boolean - -


-Checks whether the file named by the pathname designator pathspec -exists and if it is a directory. Returns its truename if this is the -case, NIL otherwise. The truename is returned in directory form as if -by PATHNAME-AS-DIRECTORY. -
- -


[Function] -
directory-pathname-p pathspec => generalized-boolean - -


-Returns NIL if pathspec (a pathname designator) does not designate -a directory, pathspec otherwise. It is irrelevant whether the file or -directory designated by pathspec does actually exist. -
- -


[Function] -
file-exists-p pathspec => generalized-boolean - -


-Checks whether the file named by the pathname designator pathspec -exists and returns its truename if this is the case, NIL otherwise. -The truename is returned in "canonical" form, i.e. the truename of a -directory is returned in directory form as if by PATHNAME-AS-DIRECTORY. -
- -


[Function]
pathname-absolute-p a => result -

-

Returns true if a is an absolute pathname. This simply -tests if a's directory list starts with :ABSOLUTE

-
- -


[Function]
pathname-equal a b => result -

- -

Returns true if a and b -represent the same pathname. This function does not access the -filesystem, it only looks at the components of the two pathnames to -test if they are the same (though by passing both a -and b to probe-file one can make this function test for -file 'sameness'.

- -

Equality is defined as:

- -
    -
  • strings that are string= -
  • symbols (including nil and keywords) which are eql -
  • lists of the same length with equal (as per these rules) elements. -
- -

If any of these tree conditions is false for any of the components in -a and b then a -and b are different, otherwise they are the same.

- -

NB: This function does not convert name strings to pathnames. So -"foo.txt" and #P"foo.txt" are different pathnames.

- -
- -


[Function]
pathname-relative-p a => result -

-

Returns true if a is a relative pathname. This simply -tests if a's directory starts -with :RELATIVE.

-
- -


[Function]
pathname-root-p a => result -

-

Returns true if pathname is the root -directory (in other words, a directory which is its own parent).

-
- -

Manipulating pathnames

- -


[Function]
canonical-pathname pathname => result -

-

Remove redundant information from PATHNAME.

- -

This simply walks down PATHNAME's -pathname-directory and drops "." directories, removes :back -and its preceding element.

- -

NB: This function does not access the filesystem, it only looks at the -values in the pathname and works on their known (or assumed) -meanings.

- -

NB: Since this function does not access the filesystem it will only -remove :BACK elements from the path (not :UP -elements). Since some lisps, ccl/sbcl/clisp convert ".." in -pathnames to :UP, and not :BACK, the actual -utility of the function is limited.

-
- -


[Function]
merge-pathnames-as-directory &rest pathnames => result -

-

Given a list of (probably relative) pathnames, this returns a single -directory pathname containing the logical concatenation of them all.

- -

The returned value is the current directory if one were to cd into -each of pathnames in order. For this reason an -absolute pathname will, effectively, cancel the affect of any previous -relative pathnames.

- -

The returned value's defaults are taken from the first element of -pathnames (host, version and device).

- -

NB: Since this function only looks at directory names the name and -type of the elements of pathnames are ignored. Make sure to properly -use either trailing #\/s, or pathname-as-directory, to get the -expected results.

- -

Examples:

- -
-  (merge-pathnames-as-directory #P"foo/" #P"bar/") == #P"foo/bar/"
-
-  (merge-pathnames-as-directory #P"foo/" #P"./bar/") == #P"foo/./bar/"
-
-  (merge-pathnames-as-directory #P"foo/" #P"/bar/") == #P"/bar/"
-
-  (merge-pathnames-as-directory #P"foo/" #P"/bar/" #P'quux/file.txt) == #P"/bar/quux/"
-
- -
- -


[Function]
merge-pathnames-as-file &rest pathnames => result -

-

Given a list of, probably relative, pathnames returns a single -filename pathname containing the logical concatenation of them all.

- -

The returned value's defaults are taken from the first element of -pathnames (host, version and device). The returned -values's name, type and version are taken from the last element -of pathnames. The intervening elements are used only for -their pathname-directory values.

- -Examples: - -
-  (merge-pathnames-as-file #P"foo/" #P"bar.txt") == #P"foo/bar.txt"
-
-  (merge-pathnames-as-file #P"foo/" #P"./bar.txt") == #P"foo/./bar.txt"
-
-  (merge-pathnames-as-file #P"foo/" #P"/bar/README") == #P"/bar/README"
-
-  (merge-pathnames-as-file #P"/foo/" #P"/bar/" #P'quux/file.txt) == #P"/bar/quux/file.txt"
-
- -
- -


[Function] -
pathname-as-directory pathspec => pathname -


-Converts the non-wild pathname designator pathspec to directory form, i.e. it returns a pathname which would return a true value if fed to DIRECTORY-PATHNAME-P. -
- -


[Function] -
pathname-as-file pathspec => pathname - -


-Converts the non-wild pathname designator pathspec to file form, i.e. it returns a pathname which would return a NIL value if fed to DIRECTORY-PATHNAME-P. -
- -


[Function]
pathname-directory-pathname pathname => result -

-

Returns a complete pathname representing the directory of -pathname. If pathname is -already a directory pathname -(name nil, type -nil) returns a pathname equal (as -per pathname-equal) to it.

-
- -


[Function]
pathname-parent-directory pathname => result -

- -

Returns a pathname which would, by name at least, -contain pathname as one of its direct -children. Symlinks can make the parent/child relationship a like -opaque, but generally speaking the value returned by this function is -a directory name which contains pathname.

- -

The root directory, #P"/", is its own parent. The parent -directory of a filename is the parent of the filename's -dirname.

- -
- -

Traversing directories

- -


[Function] -
list-directory dirname &key follow-symlinks => list - -


-

-Returns a fresh list of pathnames corresponding to -all files within the directory named by the non-wild pathname designator dirname. The pathnames of sub-directories are returned in -directory form - see PATHNAME-AS-DIRECTORY. -

-

- If follow-symlinks is true (which is the - default), then the returned list contains truenames (symlinks will - be resolved) which essentially means that it might also return files - from outside the directory. This works on all platforms. -

-

- When follow-symlinks is NIL, it should return the actual directory - contents, which might include symlinks. (This is currently implemented only on SBCL and CCL.) -

-
- -


[Function] -
walk-directory dirname fn &key directories if-does-not-exist test follow-symlinks => | - -


-

- Recursively applies the function designated by the function - designator fn to all files within the directory named - by the non-wild pathname - designator dirname and all of its sub-directories. fn - will only be applied to files for which the function test - returns a true value. (The default value for test - always returns true.) If directories is not NIL, - fn and test are applied to directories - as well. If directories is :DEPTH-FIRST, fn - will be applied to the directory's contents first. If directories - is :BREADTH-FIRST and test returns NIL, the - directory's content will be skipped. if-does-not-exist must - be one of :ERROR or :IGNORE where :ERROR - (the default) means that an error will be signaled if the directory dirname - does not exist. -

-

- If follow-symlinks is true (which is - the default), then your callback will receive truenames. Otherwise - you should get the actual directory contents, which might include - symlinks. This might not be supported on all platforms. See - LIST-DIRECTORY. -

-
- -

Temporary Files

- -
Synopsis
- -

- Create a temporary file and return its name: -

CL-USER> (temporary-file:with-output-to-temporary-file (foo)
-           (print "hello" foo))
-#P"/var/folders/Yu/YuNMNBNPGoqs9G-1Wmj1dk+++TI/-Tmp-/temp-yjck024x"
-

-

- Create a temporary file, read and write it, have it be deleted - automatically: -

CL-USER> (temporary-file:with-open-temporary-file (foo :direction :io)
-           (print "hello" foo)
-           (file-position foo 0)
-           (read foo))
-"hello"
-

- -
Default temporary file directory
- By default, temporary files are created in a system specific - directory that defaults based on operating system conventions. On - Unix and Unix-like systems, the directory /tmp/ is used - by default. It can be overridden by setting the TMPDIR - environment variable. On Windows, the value of the environment - variable TEMP is used. If it is not set, temporary file - creation will fail. - -
Defining the temporary file directory
-

- The Lisp application can set the default directory in which - temporary files are created by the way of the - temporary-files logical pathname host: - -

(setf (logical-pathname-translations "temporary-files") '(("*.*.*" "/var/tmp/")))
- - This would set the directory for temporary files to - /var/tmp/. For more information about logical - pathnames, please refer to Common - Lisp the Language, 2nd Edition and the Common Lisp - HyperSpec. -

-

- Physical path names have restrictions regarding the permitted - character in file names. If these restrictions conflict with - your desired naming scheme, you can pass a physical pathname as - TEMPLATE parameter to the temporary file generation function. -

-

- Here are a few examples: -

CL-USER> (logical-pathname-translations "temporary-files")
-(("*.*.*" #P"/var/folders/Yu/YuNMNBNPGoqs9G-1Wmj1dk+++TI/-Tmp-/"))
-CL-USER> (temporary-file:with-open-temporary-file (foo)
-           (pathname foo))
-#P"/var/folders/Yu/YuNMNBNPGoqs9G-1Wmj1dk+++TI/-Tmp-/temp-6rdqdkd1"
- - This used the temporary directory established in the TMPDIR - environment variable, by the way of the definition of the - temporary-files logical host definition. - -
CL-USER> (temporary-file:with-open-temporary-file (foo :template "/tmp/file.with.dots.in.name.%.txt")
-           (pathname foo))
-#P"/tmp/file.with.dots.in.name.2EF04KUJ.txt"
- - Here, a physical pathname was used for the - :template keyword argument so that a - filename containing multiple dots could be generated. - -
CL-USER> (temporary-file:with-open-temporary-file (foo :template "temporary-files:blah-%.txt")
-           (pathname foo))
-#P"/var/folders/Yu/YuNMNBNPGoqs9G-1Wmj1dk+++TI/-Tmp-/blah-72mj450d.txt"
- - This used the temporary-files logical pathname host, but changed - the filename slightly. - -
CL-USER> *default-pathname-defaults*
-#P"/Users/hans/"
-CL-USER> (temporary-file:with-open-temporary-file (foo :template "blah-%.txt")
-           (pathname foo))
-#P"/Users/hans/blah-5OEJELG2.txt"
- - Here, a relative pathname was used in the template, which - caused the file to be generated in the directory established - by *default-pathname-defaults*. -

-

- Alternatively, the *default-template* - special variable can be set to define a custom default template - for generating names. -

- -
Security
- The TEMPORARY-FILE library does not directly address security - issues. The application that uses it needs to take additional - measures if it is important that files created by one process - cannot be accessed by other, unrelated processes. This can be - done by using the system dependent security mechanisms like - default file permissions or access control lists. - -
Dictionary
- - -

[Function]
open-temporary &rest open-arguments &key template generate-random-string max-tries &allow-other-keys - => - stream

-

- Create a file with a randomly generated name and return the - opened stream. The resulting pathname is generated from - template, which is a string - representing a pathname template. A percent sign (%) in - that string is replaced by a randomly generated string to - make the filename unique. The default for - template places temporary files in the - temporary-files logical pathname host, - which is automatically set up in a system specific manner. - The file name generated from template - is merged with *default-pathname-defaults*, - so random pathnames relative to that directory can be - generated by not specifying a directory in - template. -

-

- generate-random-string can be passed to - override the default function that generates the random name - component. It should return a random string consisting of - characters that are permitted in a pathname (logical or - physical, depending on template). -

-

- The name of the temporary file can be accessed calling the - pathname - function on stream. For convenience, - the temporary file is opened on the physical pathname, - i.e. if the template designate a - logical pathname the translation to a physical pathname is - performed before opening the stream. -

-

- In order to create a unique file name, - open-temporary may loop internally up - to max-tries times before giving up and - signalling a - cannot-create-temporary-file condition. -

-

- Any unrecognized keyword arguments are passed to the call to - open. -

-

-

[Macro]
with-output-to-temporary-file (stream &rest args) &body body - => - pathname

- Create a temporary file using - open-temporary with - args and run body - with stream bound to the temporary file - stream. Returns the pathname of the file that has been - created. See open-temporary for - permitted options. -

-

[Macro]
with-open-temporary-file (stream &rest args &key keep &allow-other-keys) &body body - => - values

- Create a temporary file using - open-temporary with - args and run body - with stream bound to the temporary file - stream. Returns the values returned by - body. By default, the file is deleted - when body is exited. If a true value is - passed in keep, the file is not deleted - when the body is exited. See - open-temporary for more permitted - options. -

-

- [Special variable]
*default-template*

- This variable can be set to a string representing the desired - default template for temporary file name generation. See - open-temporary for a description of the - template string format. -

-

- [Condition type]
cannot-create-temporary-file

- Signalled when an attempt to create unique temporary file name - failed after the established number of retries. -

-

- [Condition type]
invalid-temporary-pathname-template

- Signalled when the template argument to - open-temporary does not contain a valid - template string. The template string must contain a percent - sign, which is replaced by the generated random string to - yield the filename. -

-

- [Condition type]
missing-temp-environment-variable

- (Windows only) Signalled when the TEMP environment variable is - not set. -

-

- [Logical Pathname Host]
temporary-files

- This logical pathname host defines where temporary files are - stored by default. It is initialized in a suitable system - specific fashion: On Unix and Unix-like systems, the directory - specified in the TMPDIR environment variable is used. If that - variable is not set, /tmp is used as the default. On Windows, - the directory specified in the TEMP environment variable is - used. If it is not set, a - missing-temp-environment-variable error - is signalled. -

- - -

Modifying the file system

- -


[Function] -
copy-file from to &key overwrite => | - -


-Copies the file designated by the non-wild pathname designator from to the -file designated by the non-wild pathname designator to. If overwrite is true (the default is NIL) -overwrites the file designated by to if it exists. -
- -


[Function] -
copy-stream from to &optional checkp => | - -


Copies into to (a stream) -from from (also a stream) until the end -of from is reached. The streams should have the -same element -type unless they are bivalent. If checkp is -true (which is the default), the function will signal an error if the -element types aren't the same. -
-


[Function] -
delete-directory-and-files dirname &key if-does-not-exist => | - -


-

-Recursively deletes all files and directories within the directory -designated by the non-wild pathname designator dirname including -dirname itself. if-does-not-exist must be one of :ERROR or :IGNORE -where :ERROR (the default) means that an error will be signaled if the directory -dirname does not exist. -

-

- Warning: this function might remove files from outside the - directory, if the directory that you are deleting contains links to - external files. This is currently fixed for SBCL and CCL. -

-
- -

The PATH package

- -


[Package] -
(defpackage path) - -

-Provides a set of short names for commonly used pathname manipulation -functions (these are all functions from the cl-fad -package which are being exported under different names): -
-
dirname
pathname-as-directory
-
basename
cl:file-namestring
-
-e
file-exists-p
-
-d
directory-exists-p
-
catfile
merge-pathnames-as-file
-
catdir
merge-pathnames-as-directory
-
rm-r
delete-directory-and-files
-
=
pathname-equal
-
absolute-p
pathname-absolute-p
-
relative-p
pathname-relative-p
-
root-p
pathname-root-p
-
-
- - -
 

Acknowledgements

- -The original code for this library was written by Peter Seibel for his -book Practical Common -Lisp. I added some stuff and made sure it worked properly on -Windows, specifically with CCL. Thanks to James Bielman, Maciek -Pasternacki, Jack D. Unrue, Gary King, and Douglas Crosher who sent -patches for OpenMCL, ECL, ABCL, MCL, and Scieneer CL. - -

-$Header: /usr/local/cvsrep/cl-fad/doc/index.html,v 1.33 2009/09/30 14:23:12 edi Exp $ -

BACK TO MY HOMEPAGE - - - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/fad.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/fad.lisp deleted file mode 100644 index e00c686..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/fad.lisp +++ /dev/null @@ -1,570 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-FAD; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-fad/fad.lisp,v 1.35 2009/09/30 14:23:10 edi Exp $ - -;;; Copyright (c) 2004, Peter Seibel. All rights reserved. -;;; Copyright (c) 2004-2010, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHORS 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-fad) - -(defun component-present-p (value) - "Helper function for DIRECTORY-PATHNAME-P which checks whether VALUE - is neither NIL nor the keyword :UNSPECIFIC." - (and value (not (eql value :unspecific)))) - -(defun directory-pathname-p (pathspec) - "Returns NIL if PATHSPEC \(a pathname designator) does not designate -a directory, PATHSPEC otherwise. It is irrelevant whether file or -directory designated by PATHSPEC does actually exist." - (and - (not (component-present-p (pathname-name pathspec))) - (not (component-present-p (pathname-type pathspec))) - pathspec)) - -(defun pathname-as-directory (pathspec) - "Converts the non-wild pathname designator PATHSPEC to directory -form." - (let ((pathname (pathname pathspec))) - (when (wild-pathname-p pathname) - (error "Can't reliably convert wild pathnames.")) - (cond ((not (directory-pathname-p pathspec)) - (make-pathname :directory (append (or (pathname-directory pathname) - (list :relative)) - (list (file-namestring pathname))) - :name nil - :type nil - :defaults pathname)) - (t pathname)))) - -(defun directory-wildcard (dirname) - "Returns a wild pathname designator that designates all files within -the directory named by the non-wild pathname designator DIRNAME." - (when (wild-pathname-p dirname) - (error "Can only make wildcard directories from non-wildcard directories.")) - (make-pathname :name #-:cormanlisp :wild #+:cormanlisp "*" - :type #-(or :clisp :cormanlisp) :wild - #+:clisp nil - #+:cormanlisp "*" - :defaults (pathname-as-directory dirname))) - -#+:clisp -(defun clisp-subdirectories-wildcard (wildcard) - "Creates a wild pathname specifically for CLISP such that -sub-directories are returned by DIRECTORY." - (make-pathname :directory (append (pathname-directory wildcard) - (list :wild)) - :name nil - :type nil - :defaults wildcard)) - -(defun list-directory (dirname &key (follow-symlinks t)) - "Returns a fresh list of pathnames corresponding to all files within - the directory named by the non-wild pathname designator DIRNAME. - The pathnames of sub-directories are returned in directory form - - see PATHNAME-AS-DIRECTORY. - - If FOLLOW-SYMLINKS is true, then the returned list contains -truenames (symlinks will be resolved) which essentially means that it -might also return files from *outside* the directory. This works on -all platforms. - - When FOLLOW-SYMLINKS is NIL, it should return the actual directory -contents, which might include symlinks. Currently this works on SBCL -and CCL." - (declare (ignorable follow-symlinks)) - (when (wild-pathname-p dirname) - (error "Can only list concrete directory names.")) - #+(or :ecl :clasp) - (let ((dir (pathname-as-directory dirname))) - (concatenate 'list - (directory (merge-pathnames (pathname "*/") dir)) - (directory (merge-pathnames (pathname "*.*") dir)))) - #-(or :ecl :clasp) - (let ((wildcard (directory-wildcard dirname))) - #+:abcl (system::list-directory dirname) - #+:sbcl (directory wildcard :resolve-symlinks follow-symlinks) - #+(or :cmu :scl :lispworks) (directory wildcard) - #+(or :openmcl :digitool) (directory wildcard :directories t :follow-links follow-symlinks) - #+:allegro (directory wildcard :directories-are-files nil) - #+:clisp (nconc (directory wildcard :if-does-not-exist :keep) - (directory (clisp-subdirectories-wildcard wildcard))) - #+:cormanlisp (nconc (directory wildcard) - (cl::directory-subdirs dirname))) - #-(or :sbcl :cmu :scl :lispworks :openmcl :allegro :clisp :cormanlisp :ecl :abcl :digitool :clasp) - (error "LIST-DIRECTORY not implemented")) - -(defun pathname-as-file (pathspec) - "Converts the non-wild pathname designator PATHSPEC to file form." - (let ((pathname (pathname pathspec))) - (when (wild-pathname-p pathname) - (error "Can't reliably convert wild pathnames.")) - (cond ((directory-pathname-p pathspec) - (let* ((directory (pathname-directory pathname)) - (name-and-type (pathname (first (last directory))))) - (make-pathname :directory (butlast directory) - :name (pathname-name name-and-type) - :type (pathname-type name-and-type) - :defaults pathname))) - (t pathname)))) - -(defun file-exists-p (pathspec) - "Checks whether the file named by the pathname designator PATHSPEC -exists and returns its truename if this is the case, NIL otherwise. -The truename is returned in `canonical' form, i.e. the truename of a -directory is returned as if by PATHNAME-AS-DIRECTORY." - #+(or :sbcl :lispworks :openmcl :ecl :digitool clasp) (probe-file pathspec) - #+:allegro (or (excl:probe-directory (pathname-as-directory pathspec)) - (probe-file pathspec)) - #+(or :cmu :scl :abcl) (or (probe-file (pathname-as-directory pathspec)) - (probe-file pathspec)) - #+:cormanlisp (or (and (ccl:directory-p pathspec) - (pathname-as-directory pathspec)) - (probe-file pathspec)) - #+:clisp (or (ignore-errors - (let ((directory-form (pathname-as-directory pathspec))) - (when (ext:probe-directory directory-form) - (truename directory-form)))) - (ignore-errors - (probe-file (pathname-as-file pathspec)))) - #-(or :sbcl :cmu :scl :lispworks :openmcl :allegro :clisp :cormanlisp :ecl :abcl :digitool :clasp) - (error "FILE-EXISTS-P not implemented")) - -(defun directory-exists-p (pathspec) - "Checks whether the file named by the pathname designator PATHSPEC -exists and if it is a directory. Returns its truename if this is the -case, NIL otherwise. The truename is returned in directory form as if -by PATHNAME-AS-DIRECTORY." - #+:allegro - (and (excl:probe-directory pathspec) - (pathname-as-directory (truename pathspec))) - #+:lispworks - (and (lw:file-directory-p pathspec) - (pathname-as-directory (truename pathspec))) - #-(or :allegro :lispworks) - (let ((result (file-exists-p pathspec))) - (and result - (directory-pathname-p result) - result))) - -(defun walk-directory (dirname fn &key directories - (if-does-not-exist :error) - (test (constantly t)) - (follow-symlinks t)) - "Recursively applies the function FN to all files within the -directory named by the non-wild pathname designator DIRNAME and all of -its sub-directories. FN will only be applied to files for which the -function TEST returns a true value. If DIRECTORIES is not NIL, FN and -TEST are applied to directories as well. If DIRECTORIES -is :DEPTH-FIRST, FN will be applied to the directory's contents first. -If DIRECTORIES is :BREADTH-FIRST and TEST returns NIL, the directory's -content will be skipped. IF-DOES-NOT-EXIST must be one of :ERROR -or :IGNORE where :ERROR means that an error will be signaled if the -directory DIRNAME does not exist. If FOLLOW-SYMLINKS is T, then your -callback will receive truenames. Otherwise you should get the actual -directory contents, which might include symlinks. This might not be -supported on all platforms. See LIST-DIRECTORY." - (labels ((walk (name) - (cond - ((directory-pathname-p name) - ;; the code is written in a slightly awkward way for - ;; backward compatibility - (cond ((not directories) - (dolist (file (list-directory name :follow-symlinks follow-symlinks)) - (walk file))) - ((eql directories :breadth-first) - (when (funcall test name) - (funcall fn name) - (dolist (file (list-directory name :follow-symlinks follow-symlinks)) - (walk file)))) - ;; :DEPTH-FIRST is implicit - (t (dolist (file (list-directory name :follow-symlinks follow-symlinks)) - (walk file)) - (when (funcall test name) - (funcall fn name))))) - ((funcall test name) - (funcall fn name))))) - (let ((pathname-as-directory (pathname-as-directory dirname))) - (case if-does-not-exist - ((:error) - (cond ((not (file-exists-p pathname-as-directory)) - (error "File ~S does not exist." - pathname-as-directory)) - (t (walk pathname-as-directory)))) - ((:ignore) - (when (file-exists-p pathname-as-directory) - (walk pathname-as-directory))) - (otherwise - (error "IF-DOES-NOT-EXIST must be one of :ERROR or :IGNORE.")))) - (values))) - -(defvar *stream-buffer-size* 8192) - -(defun copy-stream (from to &optional (checkp t)) - "Copies into TO \(a stream) from FROM \(also a stream) until the end -of FROM is reached, in blocks of *stream-buffer-size*. The streams -should have the same element type. If CHECKP is true, the streams are -checked for compatibility of their types." - (when checkp - (unless (subtypep (stream-element-type to) (stream-element-type from)) - (error "Incompatible streams ~A and ~A." from to))) - (let ((buf (make-array *stream-buffer-size* - :element-type (stream-element-type from)))) - (loop - (let ((pos #-:clisp (read-sequence buf from) - #+:clisp (ext:read-byte-sequence buf from :no-hang nil))) - (when (zerop pos) (return)) - (write-sequence buf to :end pos)))) - (values)) - -(defun copy-file (from to &key overwrite) - "Copies the file designated by the non-wild pathname designator FROM -to the file designated by the non-wild pathname designator TO. If -OVERWRITE is true overwrites the file designated by TO if it exists." - #+:allegro (excl.osi:copy-file from to :overwrite overwrite) - #-:allegro - (let ((element-type #-:cormanlisp '(unsigned-byte 8) - #+:cormanlisp 'unsigned-byte)) - (with-open-file (in from :element-type element-type) - (with-open-file (out to :element-type element-type - :direction :output - :if-exists (if overwrite - :supersede - #-:cormanlisp :error - #+:cormanlisp nil)) - #+:cormanlisp - (unless out - (error (make-condition 'file-error - :pathname to - :format-control "File already exists."))) - (copy-stream in out)))) - (values)) - -(defun delete-directory-and-files (dirname &key (if-does-not-exist :error)) - "Recursively deletes all files and directories within the directory -designated by the non-wild pathname designator DIRNAME including -DIRNAME itself. IF-DOES-NOT-EXIST must be one of :ERROR or :IGNORE -where :ERROR means that an error will be signaled if the directory -DIRNAME does not exist. - -NOTE: this function is dangerous if the directory that you are -removing contains symlinks to files outside of it - the target files -might be removed instead! This is currently fixed for SBCL and CCL." - - #+:allegro (excl.osi:delete-directory-and-files dirname - :if-does-not-exist if-does-not-exist) - - #+:sbcl - (if (directory-exists-p dirname) - (sb-ext:delete-directory dirname :recursive t) - (ecase if-does-not-exist - (:error (error "~S is not a directory" dirname)) - (:ignore nil))) - - #+:ccl-has-delete-directory - (if (directory-exists-p dirname) - (ccl:delete-directory dirname) - (ecase if-does-not-exist - (:error (error "~S is not a directory" dirname)) - (:ignore nil))) - - #-(or :allegro :sbcl :ccl-has-delete-directory) - (walk-directory dirname - (lambda (file) - (cond ((directory-pathname-p file) - #+:lispworks (lw:delete-directory file) - #+:cmu (multiple-value-bind (ok err-number) - (unix:unix-rmdir (namestring (truename file))) - (unless ok - (error "Error number ~A when trying to delete ~A" - err-number file))) - #+:scl (multiple-value-bind (ok errno) - (unix:unix-rmdir (ext:unix-namestring (truename file))) - (unless ok - (error "~@" - file (unix:get-unix-error-msg errno)))) - #+:clisp (ext:delete-directory file) - #+:openmcl (cl-fad-ccl:delete-directory file) - #+:cormanlisp (win32:delete-directory file) - #+:ecl (si:rmdir file) - #+:clasp (core:rmdir file) - #+(or :abcl :digitool) (delete-file file)) - (t (delete-file file)))) - :follow-symlinks nil - :directories t - :if-does-not-exist if-does-not-exist) - (values)) - -(defun pathname-directory-pathname (pathname) - "Returns a complete pathname representing the directory of -PATHNAME. If PATHNAME is already a directory pathname (name NIL, type -NIL) returns a pathname equal (as per pathname=) to it." - (make-pathname :defaults pathname - :name nil :type nil)) - -(defun pathname-parent-directory (pathname) - "Returns a pathname which would, by name at least, contain PATHNAME -as one of its direct children. Symlinks can make the parent/child -relationship a like opaque, but generally speaking the value returned -by this function is a directory name which contains PATHNAME. - -The root directory, #P\"/\", is its own parent. The parent directory -of a filename is the parent of the filename's dirname." - (canonical-pathname - (make-pathname :defaults pathname - :directory (if (pathname-root-p pathname) - (list :absolute) - (append (or (pathname-directory pathname) - (list :relative)) - (list :back)))))) - -(defun canonical-pathname (pathname) - "Remove redundant information from PATHNAME. - -This simply walks down PATHNAME's pathname-directory and drops \".\" -directories, removes :back and its preceding element. - -NB: This function does not access the filesystem, it only looks at the -values in the pathname and works on their known (or assumed) -meanings. - -NB: Since this function does not access the filesystem it will only -remove :BACK elements from the path (not :UP elements). Since some -lisps, ccl/sbcl/clisp convert \"..\" in pathnames to :UP, and -not :BACK, the actual utility of the function is limited." - (let ((pathname (pathname pathname))) ;; just make sure to get a pathname object - (loop - with full-dir = (or (pathname-directory pathname) - (list :relative)) - with canon-dir = (if (member (first full-dir) '(:relative :absolute)) - (list (pop full-dir)) - (list :relative)) - while full-dir - do (cond - ((string= "." (first full-dir)) - (pop full-dir)) - ((eql :back (second full-dir)) - (pop full-dir) - (pop full-dir)) - (t (push (pop full-dir) canon-dir))) - finally (return (make-pathname :defaults pathname :directory (nreverse canon-dir)))))) - -(defun merge-pathnames-as-directory (&rest pathnames) - "Given a list of (probably relative) pathnames, this returns a single -directory pathname containing the logical concatenation of them all. - -The returned value is the current directory if one were to cd into -each of PATHNAMES in order. For this reason an absolute pathname will, -effectively, cancel the affect of any previous relative pathnames. - -The returned value's defaults are taken from the first element of -PATHNAMES (host, version and device). - -NB: Since this function only looks at directory names the name and -type of the elements of PATHNAMES are ignored. Make sure to properly -use either trailing #\\/s, or pathname-as-directory, to get the -expected results. - -Examples: - - (merge-pathnames-as-directory #P\"foo/\" #P\"bar/\") == #P\"foo/bar/\" - (merge-pathnames-as-directory #P\"foo/\" #P\"./bar/\") == #P\"foo/./bar/\" - (merge-pathnames-as-directory #P\"foo/\" #P\"/bar/\") == #P\"/bar/\" - (merge-pathnames-as-directory #P\"foo/\" #P\"/bar/\" #P\"quux/file.txt\") == #P\"/bar/quux/\" -" - (if pathnames - (let* ((pathnames (mapcar #'pathname pathnames)) - (defaults (first pathnames)) - (dir (pathname-directory defaults))) - (loop for pathname in (rest pathnames) - for directory = (pathname-directory pathname) - do (ecase (first directory) - ;; this is equivalent to (:relative) == ".", so, - ;; for this function, just do nothing. - ((nil)) - (:absolute - (setf dir directory)) - (:relative - (setf dir (append dir (rest directory)))))) - (make-pathname :defaults defaults :directory dir :name nil :type nil)) - (make-pathname))) - -(defun merge-pathnames-as-file (&rest pathnames) - "Given a list of, probably relative, pathnames returns a single -filename pathname containing the logical concatenation of them all. - -The returned value's defaults are taken from the first element of -PATHNAMES (host, version and device). The returned values's name, type -and version are taken from the last element of PATHNAMES. The -intervening elements are used only for their pathname-directory -values. - -Examples: - - (merge-pathnames-as-file #P\"foo/\" #P\"bar.txt\") == #P\"foo/bar.txt\" - (merge-pathnames-as-file #P\"foo/\" #P\"./bar.txt\") == #P\"foo/./bar.txt\" - (merge-pathnames-as-file #P\"foo/\" #P\"/bar/README\") == #P\"/bar/README\" - (merge-pathnames-as-file #P\"/foo/\" #P\"/bar/\" #P\"quux/file.txt\") == #P\"/bar/quux/file.txt\" -" - (cond ((null pathnames) - (make-pathname)) - ((null (cdr pathnames)) - (pathname-as-file (first pathnames))) - (t - (let ((file-name-part (first (last pathnames)))) - (make-pathname :defaults (apply #'merge-pathnames-as-directory pathnames) - :name (pathname-name file-name-part) - :type (pathname-type file-name-part) - :version (pathname-version file-name-part)))))) - -(defmacro with-component-testers ((a b key) &body body) - (let ((k (gensym))) - `(let* ((,k ,key) - (,a (funcall ,k ,a)) - (,b (funcall ,k ,b))) - (labels ((components-are (test) - (and (funcall test ,a) (funcall test ,b))) - (components-are-member (values) - (and (member ,a values :test #'eql) - (member ,b values :test #'eql) - (eql ,a ,b))) - (components-are-string= () - (and (stringp ,a) (stringp ,b) (string= ,a ,b))) - (components-are-every (test) - (and (consp ,a) - (consp ,b) - (every test ,a ,b)))) - (declare (ignorable #'components-are #'components-are-member - #'components-are-string= #'components-are-every)) - (if (or ,@body) - (values t ,a ,b) - nil))))) - -(defun pathname-host-equal (a b) - (with-component-testers (a b #'pathname-host) - (eq a b) - (components-are-member '(nil :unspecific)) - (components-are-string=) - (components-are-every #'string=))) - -(defun pathname-device-equal (a b) - (with-component-testers (a b #'pathname-device) - (components-are-member '(nil :unspecific)) - (components-are-string=))) - -(defun pathname-directory-equal (a b) - (with-component-testers (a b #'pathname-directory) - (and (null a) (null b)) - (and (= (length a) (length b)) - (every (lambda (a b) - (or (and (stringp a) (stringp b) (string= a b)) - (and (null a) (null b)) - (and (keywordp a) (keywordp b) (eql a b)))) - a b)))) - -(defun pathname-name-equal (a b) - (with-component-testers (a b #'pathname-name) - (components-are-member '(nil :wild :unspecific)) - (components-are-string=))) - -(defun pathname-type-equal (a b) - (with-component-testers (a b #'pathname-type) - (components-are-member '(nil :wild :unspecific)) - (components-are-string=))) - -(defun pathname-version-equal (a b) - (with-component-testers (a b #'pathname-version) - (and (null a) (null b)) - (components-are-member '(:wild :newest :unspecific)) - (and (integerp a) (integerp b) (= a b)))) - -(defun pathname-equal (a b) - "Returns T if A and B represent the same pathname. This function -does not access the filesystem, it only looks at the components of the -two pathnames to test if they are the same (though by -passing both A and B to probe-file one can make this function test for file 'sameness'. - -Equality is defined as: - - - strings that are string equal - - symbol (including nil) or keywords which are eql - - lists of the same length with equal (as per these rules) elements. - -if any of these tree conditions is false for any of the components in -A and B then A and B are different, otherwise they are the same. - -NB: This function does not convert name strings to pathnames. So -\"foo.txt\" and #P\"foo.txt\" are different pathnames." - (if (and a b) - (if (and (pathname-host-equal a b) - (pathname-device-equal a b) - (pathname-directory-equal a b) - (pathname-name-equal a b) - (pathname-type-equal a b) - (pathname-version-equal a b)) - (values t a b) - (values nil)) - (values nil))) - -(defun pathname-absolute-p (a) - "Returns true if A is an absolute pathname. - -This simply tests if A's directory list starts with :ABSOLUTE" - (eql :absolute (first (pathname-directory (pathname a))))) - -(defun pathname-relative-p (a) - "Returns true if A is a relative pathname. - -This simply tests if A's directory starts with :RELATIVE." - (let ((dir (pathname-directory (pathname a)))) - (or (null dir) (eql :relative (first dir))))) - -(defun pathname-root-p (a) - (let ((dir (pathname-directory (pathname a)))) - (and (eql :absolute (first dir)) - (= 1 (length dir))))) - -(pushnew :cl-fad *features*) - -;; stuff for Nikodemus Siivola's HYPERDOC -;; see -;; and -;; also used by LW-ADD-ONS - -#-:abcl -(defvar *hyperdoc-base-uri* "http://weitz.de/cl-fad/") - -#-:abcl -(let ((exported-symbols-alist - (loop for symbol being the external-symbols of :cl-fad - collect (cons symbol - (concatenate 'string - "#" - (string-downcase symbol)))))) - (defun hyperdoc-lookup (symbol type) - (declare (ignore type)) - (cdr (assoc symbol - exported-symbols-alist - :test #'eq)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/fad.test.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/fad.test.lisp deleted file mode 100644 index 8f547e1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/fad.test.lisp +++ /dev/null @@ -1,157 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-FAD-TEST; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-fad/test.lisp,v 1.12 2009/09/30 14:23:10 edi Exp $ - -;;; Copyright (c) 2004-2010, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package #:cl-fad-test) - -(defparameter *tmp-dir* - #+(or :win32 :mswindows :windows) "c:\\tmp\\" - #-(or :win32 :mswindows :windows) "/tmp/") - -(defvar *test-counter* 0) - -(defmacro assert* (form) - `(progn - (format t "Trying to assert ~A~%" ',form) - (assert ,form) - (format t "Test ~A passed.~%" (incf *test-counter*)))) - -(defun test () - (setq *test-counter* 0) - - (assert* (path:= (path:catdir) #P"")) - (assert* (path:= (path:catdir #P"/") #P"/")) - (assert* (path:= (path:catdir #P"a/" #P"b/") #P"a/b/")) - (assert* (path:= (path:catdir #P"/a/" #P"/b/" #P"c/" #P"./d/" #P"e" #P"f/") #P"/b/c/./d/f/")) - - (assert* (path:= (path:catfile) #P"")) - (assert* (path:= (path:catfile #P"R.txt") #P"R.txt")) - (assert* (path:= (path:catfile #P"a/" #P"/b/" #P"R.txt") #P"/b/R.txt")) - - - (let ((fad-dir (merge-pathnames (pathname-as-directory "fad-test") - *tmp-dir*))) - (delete-directory-and-files fad-dir :if-does-not-exist :ignore) - (assert* (directory-pathname-p fad-dir)) - (assert* (directory-pathname-p (pathname *tmp-dir*))) - (let ((foo-file (merge-pathnames "foo.lisp" - fad-dir))) - (assert* (not (directory-pathname-p foo-file))) - (assert* (not (file-exists-p foo-file))) - (assert* (not (file-exists-p fad-dir))) - (with-open-file (out (ensure-directories-exist foo-file) - :direction :output - :if-does-not-exist :create) - (write-string "NIL" out)) - (assert* (file-exists-p foo-file)) - (assert* (not (directory-exists-p foo-file))) - (assert* (file-exists-p fad-dir)) - (assert* (directory-exists-p fad-dir)) - (assert* (equal fad-dir - (pathname-as-directory fad-dir))) - (assert* (equal foo-file - (pathname-as-file foo-file))) - (assert* (not (equal fad-dir - (pathname-as-file fad-dir)))) - (assert* (not (equal foo-file - (pathname-as-directory foo-file)))) - (dolist (name '("bar" "baz")) - (let ((dir (merge-pathnames (pathname-as-directory name) - fad-dir))) - (dolist (name '("foo.text" "bar.lisp")) - (let ((file (merge-pathnames name dir))) - (with-open-file (out (ensure-directories-exist file) - :direction :output - :if-does-not-exist :create) - (write-string "NIL" out)))))) - ;; /tmp/fad-test/foo.lisp - ;; /tmp/fad-test/bar/bar.lisp - ;; /tmp/fad-test/bar/foo.text - ;; /tmp/fad-test/baz/bar.lisp - ;; /tmp/fad-test/baz/foo.text - ;; files : 5 - ;; dirs : 3 - (let ((file-counter 0) - (file-and-dir-counter 0) - (bar-counter 0)) - (walk-directory fad-dir - (lambda (file) - (declare (ignore file)) - (incf file-counter))) - ;; file-counter => 5 - (walk-directory fad-dir - (lambda (file) - (declare (ignore file)) - (incf file-and-dir-counter)) - :directories t) - ;; file-and-dir-counter => 5 + 3 - (walk-directory fad-dir - (lambda (file) - (declare (ignore file)) - (incf bar-counter)) - :test (lambda (file) - (string= (pathname-name file) - "bar")) - :directories t) - ;; do not traverse the baz directory - (walk-directory fad-dir - (lambda (file) - (declare (ignore file)) - (incf file-and-dir-counter)) - :test (lambda (file) - (not (and (directory-pathname-p file) - (string= (first (last (pathname-directory file))) - "baz")))) - :directories :breadth-first) - ;; file-and-dir-counter => 5 + 3 + 2 dirs + 3 files - (assert* (= 5 file-counter)) - (assert* (= 13 file-and-dir-counter)) - (assert* (= 2 bar-counter))) - (let ((bar-file (merge-pathnames "bar.lisp" fad-dir))) - (copy-file foo-file bar-file) - (assert* (file-exists-p bar-file)) - (with-open-file (foo-stream foo-file :element-type '(unsigned-byte 8)) - (with-open-file (bar-stream bar-file :element-type '(unsigned-byte 8)) - (assert* (= (file-length foo-stream) - (file-length bar-stream))) - (loop for foo-byte = (read-byte foo-stream nil nil) - for bar-byte = (read-byte bar-stream nil nil) - while (and foo-byte bar-byte) - do (assert* (eql foo-byte bar-byte)))))) - (let ((baz-dir (merge-pathnames (pathname-as-directory "baz") - fad-dir)) - (list (mapcar #'namestring (list-directory fad-dir)))) - (assert* (find (namestring (truename foo-file)) list :test #'string=)) - (assert* (find (namestring (truename baz-dir)) list :test #'string=)) - (assert* (not (find (namestring (pathname-as-file baz-dir)) - list - :test #'string=))))) - (delete-directory-and-files fad-dir :if-does-not-exist :error) - (assert* (not (file-exists-p fad-dir))) - (assert* (not (directory-exists-p fad-dir)))) - (format t "All tests passed.~%")) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/load.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/load.lisp deleted file mode 100644 index 0fd1a15..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/load.lisp +++ /dev/null @@ -1,62 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-fad/load.lisp,v 1.9 2009/09/30 14:23:10 edi Exp $ - -;;; Copyright (c) 2004-2010, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-user) - -(defparameter *cl-fad-base-directory* - (make-pathname :name nil :type nil :version nil - :defaults (parse-namestring *load-truename*))) - -#+:allegro (require :osi) -#+:sbcl (require :sb-executable) -#+:sbcl (require :sb-posix) - -(let ((cl-fad-base-directory - (make-pathname :name nil :type nil :version nil - :defaults (parse-namestring *load-truename*)))) - (let (must-compile) - #+:cormanlisp (declare (ignore must-compile)) - (dolist (file '("packages" - #+:cormanlisp "corman" - #+:openmcl "openmcl" - "fad")) - (let ((pathname (make-pathname :name file :type "lisp" :version nil - :defaults cl-fad-base-directory))) - ;; don't use COMPILE-FILE in Corman Lisp, it's broken - LOAD - ;; will yield compiled functions anyway - #-:cormanlisp - (let ((compiled-pathname (compile-file-pathname pathname))) - (unless (and (not must-compile) - (probe-file compiled-pathname) - (< (file-write-date pathname) - (file-write-date compiled-pathname))) - (setq must-compile t) - (compile-file pathname)) - (setq pathname compiled-pathname)) - (load pathname))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/openmcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/openmcl.lisp deleted file mode 100644 index ae99f77..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/openmcl.lisp +++ /dev/null @@ -1,72 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CCL; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-fad/openmcl.lisp,v 1.6 2009/09/30 14:23:10 edi Exp $ - -;;; Copyright (c) 2004-2010, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHORS 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-fad) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (flet ((ccl-function-feature (symbol-name feature) - (let ((symbol (find-symbol symbol-name :ccl))) - (when (and symbol (fboundp symbol)) - (pushnew feature *features*))))) - (ccl-function-feature "%RMDIR" :ccl-has-%rmdir) - (ccl-function-feature "DELETE-DIRECTORY" :ccl-has-delete-directory))) - -(defpackage :cl-fad-ccl - (:use :cl) - (:export delete-directory) - (:import-from :ccl - :%realpath - :signal-file-error - :native-translated-namestring - :with-cstrs) - #+ccl-has-%rmdir - (:import-from :ccl :%rmdir) - #+ccl-has-delete-directory - (:import-from :ccl :delete-directory)) - -(in-package :cl-fad-ccl) - -#-ccl-has-%rmdir -(defun %rmdir (name) - (with-cstrs ((n name)) - (#_rmdir n))) - -;;; ClozureCL 1.6 introduced ccl:delete-directory with semantics that -;;; are acceptably similar to this "legacy" definition. -;;; -;;; Except this legacy definition is not recursive, hence this function is -;;; used only if there is no :CCL-HAS-DELETE-DIRECTORY feature. - -#-ccl-has-delete-directory -(defun delete-directory (path) - (let* ((namestring (native-translated-namestring path))) - (when (%realpath namestring) - (let* ((err (%rmdir namestring))) - (or (eql 0 err) (signal-file-error err path)))))) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/packages.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/packages.lisp deleted file mode 100644 index 1514c99..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/packages.lisp +++ /dev/null @@ -1,87 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-fad/packages.lisp,v 1.12 2009/09/30 14:23:10 edi Exp $ - -;;; Copyright (c) 2004-2010, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package #:cl-user) - -(defpackage :cl-fad - (:nicknames :fad) - (:use :cl) - #+:allegro - (:shadow :copy-file - :delete-directory-and-files) - #+:abcl - (:shadow :list-directory) - (:export :copy-file - :copy-stream - :delete-directory-and-files - :directory-exists-p - :directory-pathname-p - :file-exists-p - :list-directory - :pathname-as-directory - :pathname-as-file - :pathname-directory-pathname - :pathname-equal - :pathname-parent-directory - :pathname-absolute-p - :pathname-relative-p - :pathname-root-p - - :canonical-pathname - :merge-pathnames-as-directory - :merge-pathnames-as-file - - :walk-directory - - :open-temporary - :with-output-to-temporary-file - :with-open-temporary-file - :*default-template* - :invalid-temporary-pathname-template - :cannot-create-temporary-file - #+win32 #:missing-temp-environment-variable)) - -(defpackage :path - (:use) - (:documentation "Rexporting certain functions from the cl-fad package with shorter names. - -This package provides no functionality, it serves only to make file -system intensive code easier to read (for unix people at least).") - (:export #:dirname - #:basename - #:-e - #:-d - #:catfile - #:catdir - #:rm-r - #:= - - #:absolute-p - #:relative-p - #:root-p)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/packages.test.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/packages.test.lisp deleted file mode 100644 index 90736df..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/packages.test.lisp +++ /dev/null @@ -1,5 +0,0 @@ -(in-package :common-lisp-user) - -(defpackage :cl-fad-test - (:use :cl :cl-fad :unit-test) - (:export :test)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/path.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/path.lisp deleted file mode 100644 index c94a0c2..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/path.lisp +++ /dev/null @@ -1,32 +0,0 @@ -(in-package :cl-fad) - -(defmacro defalias (name args realname) - `(progn - (defun ,name ,args - ,(if (eql '&rest (first args)) - `(apply #',realname ,(second args)) - `(,realname ,@args))) - (define-compiler-macro ,name (&rest args) - (list* ',realname args)))) - -(defalias path:dirname (pathname) cl-fad:pathname-directory-pathname) - -(defun path:basename (pathname) (pathname (file-namestring pathname))) - -(defalias path:-e (pathname) cl-fad:file-exists-p) - -(defalias path:-d (directory) cl-fad:directory-exists-p) - -(defalias path:catfile (&rest pathnames) cl-fad:merge-pathnames-as-file) - -(defalias path:catdir (&rest pathnames) cl-fad:merge-pathnames-as-directory) - -(defalias path:= (a b) cl-fad:pathname-equal) - -(defalias path:absolute-p (pathname) cl-fad:pathname-absolute-p) - -(defalias path:relative-p (pathname) cl-fad:pathname-relative-p) - -(defalias path:root-p (pathname) cl-fad:pathname-root-p) - -(defalias path:rm-r (pathname) cl-fad:delete-directory-and-files) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/temporary-files.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/temporary-files.lisp deleted file mode 100644 index 7e8e7f1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/temporary-files.lisp +++ /dev/null @@ -1,173 +0,0 @@ -(in-package :cl-fad) - -(defparameter *default-template* "TEMPORARY-FILES:TEMP-%") - -(defparameter *max-tries* 10000) - -(defvar *name-random-state* (make-random-state t)) - -;; from XCVB -(eval-when (:load-toplevel :execute) - (defun getenv (x) - "Query the libc runtime environment. See getenv(3)." - (declare (ignorable x)) - #+(or abcl clisp xcl) (ext:getenv x) - #+allegro (sys:getenv x) - #+clozure (ccl:getenv x) - #+(or cmu scl) (cdr (assoc x ext:*environment-list* :test #'string=)) - #+cormanlisp - (let* ((buffer (ct:malloc 1)) - (cname (ct:lisp-string-to-c-string x)) - (needed-size (win:getenvironmentvariable cname buffer 0)) - (buffer1 (ct:malloc (1+ needed-size)))) - (prog1 (if (zerop (win:getenvironmentvariable cname buffer1 needed-size)) - nil - (ct:c-string-to-lisp-string buffer1)) - (ct:free buffer) - (ct:free buffer1))) - #+ecl (si:getenv x) - #+gcl (system:getenv x) - #+lispworks (lispworks:environment-variable x) - #+mcl (ccl:with-cstrs ((name x)) - (let ((value (_getenv name))) - (unless (ccl:%null-ptr-p value) - (ccl:%get-cstring value)))) - #+sbcl (sb-ext:posix-getenv x) - #+clasp (ext:getenv x) - #-(or abcl allegro clisp clozure cmu cormanlisp ecl gcl lispworks mcl sbcl scl xcl clasp) - (error "~S is not supported on your implementation" 'getenv)) - - (defun directory-from-environment (environment-variable-name) - (let ((string (getenv environment-variable-name))) - (when (plusp (length string)) - (pathname-as-directory string)))) - - #+win32 - (define-condition missing-temp-environment-variable (error) - () - (:report (lambda (condition stream) - (declare (ignore condition)) - (format stream "the TEMP environment variable has not been found, cannot continue")))) - - #+win32 - (defun get-default-temporary-directory () - (or (directory-from-environment "TEMP") - (error 'missing-temp-environment-variable))) - - #-win32 - (defun get-default-temporary-directory () - (or (directory-from-environment "TMPDIR") - (and #-clisp (probe-file #P"/tmp/") - #+clisp (ext:probe-directory #P"/tmp/") - #P"/tmp/"))) - - (handler-case - (logical-pathname-translations "TEMPORARY-FILES") - (error () - (alexandria:if-let (default-temporary-directory (get-default-temporary-directory)) - (setf (logical-pathname-translations "TEMPORARY-FILES") `(("*.*.*" ,default-temporary-directory))) - (warn "could not automatically determine a default mapping for TEMPORARY-FILES"))))) - -;; locking for multi-threaded operation with unsafe random function - -(defvar *create-file-name-lock* (bordeaux-threads:make-lock "Temporary File Name Creation Lock")) - -(defmacro with-file-name-lock-held (() &body body) - `(bordeaux-threads:with-lock-held (*create-file-name-lock*) - ,@body)) - -(defun generate-random-string () - (with-file-name-lock-held () - (format nil "~:@(~36,8,'0R~)" (random (expt 36 8) *name-random-state*)))) - -(define-condition invalid-temporary-pathname-template (error) - ((string :initarg :string)) - (:report (lambda (condition stream) - (with-slots (string) condition - (format stream "invalid temporary file name template ~S, must contain a percent sign that is to be replaced by a random string" string))))) - -(defun generate-random-pathname (template random-string-generator) - (let ((percent-position (or (position #\% template) - (error 'invalid-temporary-pathname-template :string template)))) - (merge-pathnames (concatenate 'string - (subseq template 0 percent-position) - (funcall random-string-generator) - (subseq template (1+ percent-position)))))) - -(define-condition cannot-create-temporary-file (error) - ((template :initarg :template) - (max-tries :initarg :max-tries)) - (:report (lambda (condition stream) - (with-slots (template max-tries) condition - (format stream "cannot create temporary file with template ~A, giving up after ~D attempt~:P" - template max-tries))))) - -(defun open-temporary (&rest open-arguments - &key - (template *default-template*) - (generate-random-string 'generate-random-string) - (max-tries *max-tries*) - (direction :output) - &allow-other-keys) - "Create a file with a randomly generated name and return the opened - stream. The resulting pathname is generated from TEMPLATE, which - is a string representing a pathname template. A percent sign (%) - in that string is replaced by a randomly generated string to make - the filename unique. The default for TEMPLATE places temporary - files in the TEMPORARY-FILES logical pathname host, which is - automatically set up in a system specific manner. The file name - generated from TEMPLATE is merged with *DEFAULT-PATHNAME-DEFAULTS*, - so random pathnames relative to that directory can be generated by - not specifying a directory in TEMPLATE. - - GENERATE-RANDOM-STRING can be passed to override the default - function that generates the random name component. It should - return a random string consisting of characters that are permitted - in a pathname (logical or physical, depending on TEMPLATE). - - The name of the temporary file can be accessed calling the PATHNAME - function on STREAM. For convenience, the temporary file is opened - on the physical pathname, i.e. if the TEMPLATE designate a logical - pathname the translation to a physical pathname is performed before - opening the stream. - - In order to create a unique file name, OPEN-TEMPORARY may loop - internally up to MAX-TRIES times before giving up and signalling a - CANNOT-CREATE-TEMPORARY-FILE condition." - (loop thereis (apply #'open - (translate-logical-pathname (generate-random-pathname template generate-random-string)) - :direction direction - :if-exists nil - (alexandria:remove-from-plist open-arguments :template :generate-random-string :max-tries)) - repeat max-tries - finally (error 'cannot-create-temporary-file - :template template - :max-tries max-tries))) - -(defmacro with-output-to-temporary-file ((stream &rest args) &body body) - "Create a temporary file using OPEN-TEMPORARY with ARGS and run BODY - with STREAM bound to the temporary file stream. Returns the - pathname of the file that has been created. See OPEN-TEMPORARY for - permitted options." - `(with-open-stream (,stream (open-temporary ,@args)) - ,@body - (pathname ,stream))) - -(defmacro with-open-temporary-file ((stream &rest args &key keep &allow-other-keys) &body body) - "Create a temporary file using OPEN-TEMPORARY with ARGS and run BODY - with STREAM bound to the temporary file stream. Returns the values - returned by BODY. By default, the file is deleted when BODY is - exited. If a true value is passed in KEEP, the file is not deleted - when the body is exited. See OPEN-TEMPORARY for more permitted - options." - `(with-open-stream (,stream (open-temporary ,@(alexandria:remove-from-plist args :keep))) - #+sbcl - (declare (sb-ext:muffle-conditions sb-ext:code-deletion-note)) - ,(if (and (constantp keep) - keep) - `(progn ,@body) - `(unwind-protect - (progn ,@body) - (unless ,keep - (close ,stream) - (delete-file (pathname ,stream))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/temporary-files.test.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/temporary-files.test.lisp deleted file mode 100644 index 80d4403..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-fad-20190813-git/temporary-files.test.lisp +++ /dev/null @@ -1,49 +0,0 @@ -(in-package :cl-fad-test) - -(deftest 'temporary-file 'with-output-to-temporary-file () - (let ((pathname (with-output-to-temporary-file (f) - (write-string "hello" f)))) - (test-assert (probe-file pathname)) - (test-equal (alexandria:read-file-into-string pathname) "hello") - (delete-file pathname))) - -(deftest 'temporary-file 'with-open-temporary-file-keep () - - (let ((pathname (with-open-temporary-file (f :keep nil) - (pathname f)))) - (test-assert (null (probe-file pathname)))) - (let ((pathname (with-open-temporary-file (f :keep t) - (pathname f)))) - (test-assert (probe-file pathname)) - (delete-file pathname)) - - (let* ((keep nil) - (pathname (with-open-temporary-file (f :keep keep) - (pathname f)))) - (test-assert (null (probe-file pathname)))) - (let* ((keep t) - (pathname (with-open-temporary-file (f :keep keep) - (pathname f)))) - (test-assert (probe-file pathname)) - (delete-file pathname))) - -(deftest 'temporary-file 'template-tests () - ;; error is signalled when template does not contain a percent sign. - (let ((*default-template* "foo")) - (test-condition (with-open-temporary-file (f :keep nil)) - 'invalid-temporary-pathname-template)) - ;; file name template occurs in generated file name (for logical path name) - (let* ((*default-template* "temporary-files:bla%.txt") - (pathname (with-open-temporary-file (f :keep nil) - (pathname f)))) - (test-assert (cl-ppcre:scan "(?i)bla.*\\.txt$" (namestring pathname)))) - ;; file name template occurs in generated file name (for pysical path name) - (let* ((*default-template* (concatenate 'string - (namestring (translate-logical-pathname "temporary-files:")) - "bla%.txt")) - (pathname (with-open-temporary-file (f :keep nil) - (pathname f)))) - (test-assert (cl-ppcre:scan "(?i)bla.*\\.txt$" (namestring pathname))))) - - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/CHANGELOG b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/CHANGELOG deleted file mode 100644 index fbd8333..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/CHANGELOG +++ /dev/null @@ -1,400 +0,0 @@ -Version 2.1.1 -2019-04-07 -Version 2.0.11 -2015-08-26 -Fix for type checks in LispWorks 7 (Martin Simmons) - -Version 2.0.10 -2015-05-28 -Add :author/:license/:description fields to .asd files (Hans Huebner) -Move inlined definitions before they are used. (Stas Boukarev) - -Version 2.0.9 -2014-11-28 -Merge branch 'master' of github.com:edicl/cl-ppcre (Hans Huebner) -Merge pull request #20 from billitch/master (Hans Huebner) -Typo in CREATE-SCANNER documentation. (Thomas de Grivel) - -Version 2.0.8 -2014-11-28 -Update support info (Hans Huebner) - -Version 2.0.7 -2014-01-23 -Doc: Update repository location, remove the darcs mirror. (Stas Boukarev) - -Version 2.0.6 -2015-01-05 -Fix failing tests and spurious compiler warnings - -Version 2.0.5 -2014-01-05 -Fix spurious test failures (Edi Weitz) - -Version 2.0.4 -2013-04-13 -Rewrite SEQ without using recursion (Stas Boukarev) -:property and :invert-property scanning bug fix (Cyrus Harmon) -Improve documentation (David Lindes) - -Version 2.0.3 -2009-10-28 -Use LW:SIMPLE-TEXT-STRING throughout for LispWorks - -Version 2.0.2 -2009-09-17 -Fixed typo in chartest.lisp (caught by Peter Seibel) -Appease CCL (thanks to Hans Hübner) - -Version 2.0.1 -2008-09-02 -Fixed faulty declaration (caught by Brent Fulgham) - -Version 2.0.0 -2008-07-24 -Added named properties (\p{foo}) -Added Unicode support -Introduced test functions for character classes -Added optional test function optimization -Cleaned up test suite, removed performance cruft -Removed the various alternative system definitions (too much maintenance work) -Exported PARSE-STRING -Changed default value of *USE-BMH-MATCHERS* -General cleanup -Lots of documentation additions - -Version 1.4.1 -2008-07-03 -Skip non-characters in CREATE-RANGES-FROM-SET - -Version 1.4.0 -2008-07-03 -Replaced hash tables with charsets (by Nikodemus Siivola) -Get rid of duplicates in REGEX-APROPOS(-LIST) - -Version 1.3.3 -2008-06-25 -Let the Lisp decide how it wants to enlarge its hash tables -Fixed anchors for special variables in docs -Fixed typo in docs (thanks to Jason S. Cornez) - -Version 1.3.2 -2007-09-13 -Updated docs and ChangeLog to be really in sync with 1.3.1 changes (thanks to Sébastien Saint-Sevin) - -Version 1.3.1 -2007-08-24 -Second return value for REGEX-REPLACE and REGEX-REPLACE-ALL (patch by Matthew Sachs) - -Version 1.3.0 -2007-03-24 -Optional support for named registers (patch by Ondrej Svitek) - -Version 1.2.19 -2007-01-16 -Fixed behaviour of look-behind in repeated scans (caught by RegexCoach user Hans Jud) - -Version 1.2.18 -2006-10-12 -Changed default element type for LispWorks -Fixed documentation for REGEX-REPLACE-ALL - -Version 1.2.17 -2006-10-11 -Fixed bug in DO-SCANS which affected anchors (caught by RegexCoach user Laurent Taupiac) -Update link for 'man perlre' (thanks to Ricardo Boccato Alves) - -Version 1.2.16 -2006-07-16 -Added :ELEMENT-TYPE to REGEX-REPLACE(-ALL) - -Version 1.2.15 -2006-07-03 -Added :REGEX tag to parse tree syntax (thanks to Frédéric Jolliton) - -Version 1.2.14 -2006-05-24 -Added missing tag in docs (thanks to Wojciech Kaczmarek) -Fixed IMPORT statement for LW - -Version 1.2.13 -2005-12-06 -Fixed bug involving *REAL-START-POS* (caught by "tichy") - -Version 1.2.12 -2005-11-01 -REGEX-APROPOS-AUX now also uses :INHERITED -Fixed typo in parser.lisp (thanks to Derek Peschel) -Fixed value of *REGEX-CHAR-CODE-LIMIT* in docs and test (thanks to Christophe Rhodes) - -Version 1.2.11 -2005-08-01 -Added external format for SBCL in ppcre-tests.lisp (thanks to Christophe Rhodes) - -Version 1.2.10 -2005-07-20 -Fixed bug in CHAR-SEARCHER-AUX (caught by Peter Schuller) -Don't redefine what's already there (for LispWorks) - -Version 1.2.9 -2005-06-27 -Hide compiler macros from CCL (thanks to Karsten Poeck) - -Version 1.2.8 -2005-06-10 -Change EQ to EQL in REGEX-LENGTH for ANSI conformance and ABCL compatibility (thanks to Peter Graves) - -Version 1.2.7 -2005-05-16 -Added lispworks-defsystem.lisp (thanks to Wade Humeniuk) -Fixed bug in WORD-BOUNDARY-P - -Version 1.2.6 -2005-04-13 -Added some DEFGENERICs to appease SBCL (thanks to Alan Shields) -Removed wrong FTYPE declaration for STR (thanks to Alan Shields) - -Version 1.2.5 -2005-03-09 -Customizable optimize qualities (thanks to Damien Kick) - -Version 1.2.4 -2005-03-07 -Changed DEBUG optimize quality from 0 to 1 - -Version 1.2.3 -2005-02-02 -Wrapped WITH-COMPILATION-UNIT around loop in load.lisp - -Version 1.2.2 -2005-02-02 -Fixed bug in hash table optimization (introduced in 1.1.0) - -Version 1.2.1 -2005-01-25 -There was a wrong read-time conditional in api.lisp, sorry - -Version 1.2.0 -2005-01-24 -AllegroCL compatibility mode -Fixed broken load.lisp file (caught by Jim Prewett and Zach Beane) - -Version 1.1.0 -2005-01-23 -Cleaned up load.lisp and cl-ppcre.asd -Make large hash tables smaller, if possible -Correct treatment of constant regular expressions in DO-SCANS - -Version 1.0.0 -2004-12-22 -Special anniversary release... :) - -Version 0.9.4 -2004-12-18 -Fixed bug in NORMALIZE-VAR-LIST (caught by Dave Roberts) - -Version 0.9.3 -2004-12-09 -Fixed bug in CREATE-SCANNER-AUX (caught by Allan Ruttenberg and Gary Byers) - -Version 0.9.2 -2004-12-06 -More compiler macros (thanks to Allan Ruttenberg) - -Version 0.9.1 -2004-11-29 -Shortcuts for REGISTER-GROUPS-BIND and DO-REGISTER-GROUPS (suggested by Alexander Kjeldaas) - -Version 0.9.0 -2004-10-14 -Experimental support for "filters" -Bugfix for standalone regular expressions (ACCUMULATE-START-P wasn't set to NIL) - -Version 0.8.1 -2004-09-30 -Patches for Genera 8.5 (thanks to Patrick O'Donnell) - -Version 0.8.0 -2004-09-16 -Added parse tree synonyms (thanks to Patrick O'Donnell) - -Version 0.7.9 -2004-07-13 -Fixed bug in DO-SCANS (caught by Jan Rychter) - -Version 0.7.8 -2004-07-13 -New SIMPLE-CALLS keyword argument for REGEX-REPLACE(-ALL) -Added environment parameter to compiler macros (thanks to c.l.l article by Joe Marshall) -Added compiler macros for SCAN-TO-STRINGS and REGEX-REPLACE(-ALL) (they somehow got lost) - -Version 0.7.7 -2004-05-19 -Fixed bug in NEWLINE-SKIPPER (caught by RegexCoach user Thomas-Paz Hartman) -Added doc strings for PPCRE-SYNTAX-ERROR and friends (after playing with slime-apropos-package) -Added hyperdoc support - -Version 0.7.6 -2004-04-20 -The closures created by CREATE-BMH-MATCHER now cleanly cope with negative arguments (bug caught by Damien Kick) - -Version 0.7.5 -2004-04-19 -Fixed a bug with constant-length repetitions of . (dot) in single-line mode (caught by RegexCoach user Lee Gold) - -Version 0.7.4 -2004-02-16 -Fixed wrong call to SIGNAL-PPCRE-SIGNAL-ERROR in lexer.lisp (caught by Peter Graves) -Added :CL-PPCRE to *FEATURES* (for CL-INTERPOL) -Compiler macro for SPLIT - -Version 0.7.3 -2004-01-28 -Fixed bug in CURRENT-MIN-REST for lookaheads (reported by RegexCoach user Thomas-Paz Hartman) -Added tests for this bug - -Version 0.7.2 -2004-01-27 -Fixed typo (SUBSEQ/NSUBSEQ) in SPLIT (thanks to Alan Ruttenberg) -Updated docs with respect to ECL (thanks to Alex Mizrahi) -Mention FreeBSD port in docs - -Version 0.7.1 -2003-10-24 -Fixed version numbers in docs (thanks to Sébastien Saint-Sevin) - -Version 0.7.0 -2003-10-23 -New macros REGISTER-GROUPS-BIND and DO-REGISTER-GROUPS -Added SHAREP keyword argument to most API functions and macros -Mention CL-INTERPOL in docs -Partial code cleanup (using WITH-UNIQUE-NAMES and REBINDING) - -Version 0.6.1 -2003-10-11 -Added EXTERNAL-FORMAT keyword args to CL-PPCRE-TEST:TEST for some CLs (thanks to JP Massar and Scott D. Kalter) -Fixed bug with REGEX-REPLACE and REGEX-REPLACE-ALL when (= START END) was true -Added doc sections for quoting problems and backslash confusions (thanks to conversations with Peter Seibel) -Disable quoting in definition of QUOTE-SECTIONS so you can always safely rebuild CL-PPCRE - -Version 0.6.0 -2003-10-07 -CL-PPCRE now has its own condition types -Added support for Perl's \Q and \E (Peter Seibel convinced me to do it) - see QUOTE-META-CHARS and *ALLOW-QUOTING* -Added tests for this new feature -Threaded tests are more verbose now and use only keyword args - -Version 0.5.9 -2003-10-03 -Changed "^" optimizations with respect to constant end strings with offsets (bug caught by Yexuan Gui) -Added tests for this bug -Removed *.dos files from CL-PPCRE-TEST tests (thanks to JP Massar) -Added threaded tests for SBCL (thanks to Christophe Rhodes) - -Version 0.5.8 -2003-09-17 -Optimizations for ".*" were too optimistic when look-behinds were involved -Added tests for this bug -Removed *.dos files - -Version 0.5.7 -2003-08-20 -Fixed (CL-PPCRE:SCAN "(.)X$" "ABCX" :START 4) bug (spotted by Tibor Simko) -Forgot to export *REGEX-CHAR-CODE-LIMIT* in Corman version of DEFPACKAGE -Removed Emacs local variables from source code (finally...) -Mention Gentoo in docs - -Version 0.5.6 -2003-06-30 -Replaced wrong COPY-REGEX code for WORD-BOUNDARY objects (detected by Max Goldberg) -Added info about possible TRUENAME problems with ACL in README (thanks to Kevin Layer for providing a patch for this) - -Version 0.5.5 -2003-06-09 -Patch for SBCL/Debian compatibility by Kevin Rosenberg -Simpler version of compiler macro -Availability through asdf-install - -Version 0.5.4 -2003-04-09 -Added DESTRUCTIVE keyword to CREATE-SCANNER - -Version 0.5.3 -2003-03-31 -Fixed bug in REGEX-REPLACE (replacement string couldn't contain literal backslash) -Fixed bug in definition of CHAR-CLASS (since 0.5.0 the hash slot may be NIL - CMUCL's new PCL detects this) -Micro-optimization in INSERT-CHAR-CLASS-TESTER: CHAR-NOT-GREATERP instead of CHAR-DOWNCASE - -Version 0.5.2 -2003-03-28 -Better compiler macro (thanks to Kent M. Pitman) - -Version 0.5.1 -2003-03-27 -Removed compiler macro - -Version 0.5.0 -2003-03-27 -Lexer, parser, and converter mostly re-written to reduce consing and increase speed -Get rid of FIX-POS in lexer and parser, "ism" flags are handled after parsing now -Smaller test suite (again) due to literal embedding of line breaks -Seperate test files for DOS line endings -Replaced constant +REGEX-CHAR-CODE-LIMIT+ with special variable *REGEX-CHAR-CODE-LIMIT* - -Version 0.4.1 -2003-03-19 -Added compiler macro for SCAN -Changed test suite to be nicer to Corman Lisp and ECL (see docs for new syntax) -Incorporated visual feedback (dots) in test suite (thanks to JP Massar) -Added README file -Replaced STRING-LIST-TO-SIMPLE-STRING with a much improved version by JP Massar - -Version 0.4.0 -2003-02-27 -Added *USE-BMH-MATCHER* - -Version 0.3.2 -2003-02-21 -Added load.lisp -Various minor changes for Corman Lisp compatibility (thanks to Karsten Poeck and JP Massar) - -Version 0.3.1 -2003-01-18 -Bugfix in CREATE-SCANNER (didn't work if flags were given and arg was a parse-tree) - -Version 0.3.0 -2003-01-12 -Added new features to REGEX-REPLACE and REGEX-REPLACE-ALL - -Version 0.2.0 -2003-01-11 -Make SPLIT more Perl-compatible, including new keyword parameters - -Version 0.1.4 -2003-01-10 -Don't move "^" and "\A" while iterating with DO-SCANS -Added link to Debian package - -Version 0.1.3 -2002-12-25 -More usable MK:DEFSYSTEM files (courtesy of Hannu Koivisto) -Fixed typo in documentation - -Version 0.1.2 -2002-12-22 -Added version numbers for Debian packaging -Be friendly to case-sensitive ACL images (courtesy of Kevin Rosenberg and Douglas Crosher) -"Fixed" two cases where declarations came after docstrings (because of bugs in Corman Lisp and older CMUCL versions) -Added #-cormanlisp to hide (INCF (THE FIXNUM POS)) from Corman Lisp -Added file doc/benchmarks.2002-12-22.txt - -Version 0.1.1 -2002-12-21 -Added asdf system definitions by Marco Baringer -Small additions to documentation -Correct (Emacs) local variables list in closures.lisp and api.lisp -Added this CHANGELOG - -Version 0.1.0 -2002-12-20 -Initial release diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/README.md b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/README.md deleted file mode 100644 index f20b767..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# CL-PPCRE - Portable Perl-compatible regular expressions for Common Lisp - -## Abstract - -CL-PPCRE is a portable regular expression library for Common Lisp -which has the following features: - -* It is **compatible with Perl** (especially when used in conjunction - with [cl-interpol](http://weitz.de/cl-interpol/), to allow - compatible parsing of regexp strings). -* It is pretty **fast**. -* It is **portable** between ANSI-compliant Common Lisp - implementations. -* It is **thread-safe**. -* In addition to specifying regular expressions as strings like in - Perl you can also use **S-expressions**. -* It comes with a - **[BSD-style license](http://www.opensource.org/licenses/bsd-license.php)** - so you can basically do with it whatever you want. - -CL-PPCRE has been used successfully in various applications like -[BioBike](http://nostoc.stanford.edu/Docs/), -[clutu](http://clutu.com/), -[LoGS](http://www.hpc.unm.edu/~download/LoGS/), -[CafeSpot](http://cafespot.net/), -[Eboy](http://www.eboy.com/), or -[The Regex Coach](http://weitz.de/regex-coach/). - -Further documentation can be found in `docs/index.html`, or on -[the cl-ppcre homepage](https://edicl.github.io/cl-ppcre/). diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/api.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/api.lisp deleted file mode 100644 index f440361..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/api.lisp +++ /dev/null @@ -1,1278 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/api.lisp,v 1.85 2009/09/17 19:17:30 edi Exp $ - -;;; The external API for creating and using scanners. - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre) - -(defvar *look-ahead-for-suffix* t - "Controls whether scanners will optimistically look ahead for a - constant suffix of a regular expression, if there is one.") - -(defgeneric create-scanner (regex &key case-insensitive-mode - multi-line-mode - single-line-mode - extended-mode - destructive) - (:documentation "Accepts a regular expression - either as a -parse-tree or as a string - and returns a scan closure which will scan -strings for this regular expression and a list mapping registers to -their names \(NIL stands for unnamed ones). The \"mode\" keyword -arguments are equivalent to the imsx modifiers in Perl. If -DESTRUCTIVE is not NIL, the function is allowed to destructively -modify its first argument \(but only if it's a parse tree).")) - -#-:use-acl-regexp2-engine -(defmethod create-scanner ((regex-string string) &key case-insensitive-mode - multi-line-mode - single-line-mode - extended-mode - destructive) - (declare #.*standard-optimize-settings*) - (declare (ignore destructive)) - ;; parse the string into a parse-tree and then call CREATE-SCANNER - ;; again - (let* ((*extended-mode-p* extended-mode) - (quoted-regex-string (if *allow-quoting* - (quote-sections (clean-comments regex-string extended-mode)) - regex-string)) - (*syntax-error-string* (copy-seq quoted-regex-string))) - ;; wrap the result with :GROUP to avoid infinite loops for - ;; constant strings - (create-scanner (cons :group (list (parse-string quoted-regex-string))) - :case-insensitive-mode case-insensitive-mode - :multi-line-mode multi-line-mode - :single-line-mode single-line-mode - :destructive t))) - -#-:use-acl-regexp2-engine -(defmethod create-scanner ((scanner function) &key case-insensitive-mode - multi-line-mode - single-line-mode - extended-mode - destructive) - (declare #.*standard-optimize-settings*) - (declare (ignore destructive)) - (when (or case-insensitive-mode multi-line-mode single-line-mode extended-mode) - (signal-invocation-error "You can't use the keyword arguments to modify an existing scanner.")) - scanner) - -#-:use-acl-regexp2-engine -(defmethod create-scanner ((parse-tree t) &key case-insensitive-mode - multi-line-mode - single-line-mode - extended-mode - destructive) - (declare #.*standard-optimize-settings*) - (when extended-mode - (signal-invocation-error "Extended mode doesn't make sense in parse trees.")) - ;; convert parse-tree into internal representation REGEX and at the - ;; same time compute the number of registers and the constant string - ;; (or anchor) the regex starts with (if any) - (unless destructive - (setq parse-tree (copy-tree parse-tree))) - (let (flags) - (if single-line-mode - (push :single-line-mode-p flags)) - (if multi-line-mode - (push :multi-line-mode-p flags)) - (if case-insensitive-mode - (push :case-insensitive-p flags)) - (when flags - (setq parse-tree (list :group (cons :flags flags) parse-tree)))) - (let ((*syntax-error-string* nil)) - (multiple-value-bind (regex reg-num starts-with reg-names) - (convert parse-tree) - ;; simplify REGEX by flattening nested SEQ and ALTERNATION - ;; constructs and gathering STR objects - (let ((regex (gather-strings (flatten regex)))) - ;; set the MIN-REST slots of the REPETITION objects - (compute-min-rest regex 0) - ;; set the OFFSET slots of the STR objects - (compute-offsets regex 0) - (let* (end-string-offset - end-anchored-p - ;; compute the constant string the regex ends with (if - ;; any) and at the same time set the special variables - ;; END-STRING-OFFSET and END-ANCHORED-P - (end-string (end-string regex)) - ;; if we found a non-zero-length end-string we create an - ;; efficient search function for it - (end-string-test (and *look-ahead-for-suffix* - end-string - (plusp (len end-string)) - (if (= 1 (len end-string)) - (create-char-searcher - (schar (str end-string) 0) - (case-insensitive-p end-string)) - (create-bmh-matcher - (str end-string) - (case-insensitive-p end-string))))) - ;; initialize the counters for CREATE-MATCHER-AUX - (*rep-num* 0) - (*zero-length-num* 0) - ;; create the actual matcher function (which does all the - ;; work of matching the regular expression) corresponding - ;; to REGEX and at the same time set the special - ;; variables *REP-NUM* and *ZERO-LENGTH-NUM* - (match-fn (create-matcher-aux regex #'identity)) - ;; if the regex starts with a string we create an - ;; efficient search function for it - (start-string-test (and (typep starts-with 'str) - (plusp (len starts-with)) - (if (= 1 (len starts-with)) - (create-char-searcher - (schar (str starts-with) 0) - (case-insensitive-p starts-with)) - (create-bmh-matcher - (str starts-with) - (case-insensitive-p starts-with)))))) - (declare (special end-string-offset end-anchored-p end-string)) - ;; now create the scanner and return it - (values (create-scanner-aux match-fn - (regex-min-length regex) - (or (start-anchored-p regex) - ;; a dot in single-line-mode also - ;; implicitly anchors the regex at - ;; the start, i.e. if we can't match - ;; from the first position we won't - ;; match at all - (and (typep starts-with 'everything) - (single-line-p starts-with))) - starts-with - start-string-test - ;; only mark regex as end-anchored if we - ;; found a non-zero-length string before - ;; the anchor - (and end-string-test end-anchored-p) - end-string-test - (if end-string-test - (len end-string) - nil) - end-string-offset - *rep-num* - *zero-length-num* - reg-num) - reg-names)))))) - -#+:use-acl-regexp2-engine -(declaim (inline create-scanner)) -#+:use-acl-regexp2-engine -(defmethod create-scanner ((scanner regexp::regular-expression) &key case-insensitive-mode - multi-line-mode - single-line-mode - extended-mode - destructive) - (declare #.*standard-optimize-settings*) - (declare (ignore destructive)) - (when (or case-insensitive-mode multi-line-mode single-line-mode extended-mode) - (signal-invocation-error "You can't use the keyword arguments to modify an existing scanner.")) - scanner) - -#+:use-acl-regexp2-engine -(defmethod create-scanner ((parse-tree t) &key case-insensitive-mode - multi-line-mode - single-line-mode - extended-mode - destructive) - (declare #.*standard-optimize-settings*) - (declare (ignore destructive)) - (excl:compile-re parse-tree - :case-fold case-insensitive-mode - :ignore-whitespace extended-mode - :multiple-lines multi-line-mode - :single-line single-line-mode - :return :index)) - -(defgeneric scan (regex target-string &key start end real-start-pos) - (:documentation "Searches TARGET-STRING from START to END and tries -to match REGEX. On success returns four values - the start of the -match, the end of the match, and two arrays denoting the beginnings -and ends of register matches. On failure returns NIL. REGEX can be a -string which will be parsed according to Perl syntax, a parse tree, or -a pre-compiled scanner created by CREATE-SCANNER. TARGET-STRING will -be coerced to a simple string if it isn't one already. The -REAL-START-POS parameter should be ignored - it exists only for -internal purposes.")) - -#-:use-acl-regexp2-engine -(defmethod scan ((regex-string string) target-string - &key (start 0) - (end (length target-string)) - ((:real-start-pos *real-start-pos*) nil)) - (declare #.*standard-optimize-settings*) - ;; note that the scanners are optimized for simple strings so we - ;; have to coerce TARGET-STRING into one if it isn't already - (funcall (create-scanner regex-string) - (maybe-coerce-to-simple-string target-string) - start end)) - -#-:use-acl-regexp2-engine -(defmethod scan ((scanner function) target-string - &key (start 0) - (end (length target-string)) - ((:real-start-pos *real-start-pos*) nil)) - (declare #.*standard-optimize-settings*) - (funcall scanner - (maybe-coerce-to-simple-string target-string) - start end)) - -#-:use-acl-regexp2-engine -(defmethod scan ((parse-tree t) target-string - &key (start 0) - (end (length target-string)) - ((:real-start-pos *real-start-pos*) nil)) - (declare #.*standard-optimize-settings*) - (funcall (create-scanner parse-tree) - (maybe-coerce-to-simple-string target-string) - start end)) - -#+:use-acl-regexp2-engine -(declaim (inline scan)) -#+:use-acl-regexp2-engine -(defmethod scan ((parse-tree t) target-string - &key (start 0) - (end (length target-string)) - ((:real-start-pos *real-start-pos*) nil)) - (declare #.*standard-optimize-settings*) - (when (< end start) - (return-from scan nil)) - (let ((results (multiple-value-list (excl:match-re parse-tree target-string - :start start - :end end - :return :index)))) - (declare (dynamic-extent results)) - (cond ((null (first results)) nil) - (t (let* ((no-of-regs (- (length results) 2)) - (reg-starts (make-array no-of-regs - :element-type '(or null fixnum))) - (reg-ends (make-array no-of-regs - :element-type '(or null fixnum))) - (match (second results))) - (loop for (start . end) in (cddr results) - for i from 0 - do (setf (aref reg-starts i) start - (aref reg-ends i) end)) - (values (car match) (cdr match) reg-starts reg-ends)))))) - -#-:cormanlisp -(define-compiler-macro scan (&whole form regex target-string &rest rest) - "Make sure that constant forms are compiled into scanners at compile time." - ;; Don't pass &environment to CONSTANTP, it may not be digestable by - ;; LOAD-TIME-VALUE, e.g., MACROLETs. - (cond ((constantp regex) - `(scan (load-time-value (create-scanner ,regex)) - ,target-string ,@rest)) - (t form))) - -(defun scan-to-strings (regex target-string &key (start 0) - (end (length target-string)) - sharedp) - "Like SCAN but returns substrings of TARGET-STRING instead of -positions, i.e. this function returns two values on success: the whole -match as a string plus an array of substrings (or NILs) corresponding -to the matched registers. If SHAREDP is true, the substrings may -share structure with TARGET-STRING." - (declare #.*standard-optimize-settings*) - (multiple-value-bind (match-start match-end reg-starts reg-ends) - (scan regex target-string :start start :end end) - (unless match-start - (return-from scan-to-strings nil)) - (let ((substr-fn (if sharedp #'nsubseq #'subseq))) - (values (funcall substr-fn - target-string match-start match-end) - (map 'vector - (lambda (reg-start reg-end) - (if reg-start - (funcall substr-fn - target-string reg-start reg-end) - nil)) - reg-starts - reg-ends))))) - -#-:cormanlisp -(define-compiler-macro scan-to-strings - (&whole form regex target-string &rest rest) - "Make sure that constant forms are compiled into scanners at compile time." - (cond ((constantp regex) - `(scan-to-strings (load-time-value (create-scanner ,regex)) - ,target-string ,@rest)) - (t form))) - -(defmacro register-groups-bind (var-list (regex target-string - &key start end sharedp) - &body body) - "Executes BODY with the variables in VAR-LIST bound to the -corresponding register groups after TARGET-STRING has been matched -against REGEX, i.e. each variable is either bound to a string or to -NIL. If there is no match, BODY is _not_ executed. For each element -of VAR-LIST which is NIL there's no binding to the corresponding -register group. The number of variables in VAR-LIST must not be -greater than the number of register groups. If SHAREDP is true, the -substrings may share structure with TARGET-STRING." - (with-rebinding (target-string) - (with-unique-names (match-start match-end reg-starts reg-ends - start-index substr-fn) - (let ((var-bindings - (loop for (function var) in (normalize-var-list var-list) - for counter from 0 - when var - collect `(,var (let ((,start-index - (aref ,reg-starts ,counter))) - (if ,start-index - (funcall ,function - (funcall ,substr-fn - ,target-string - ,start-index - (aref ,reg-ends ,counter))) - nil)))))) - `(multiple-value-bind (,match-start ,match-end ,reg-starts ,reg-ends) - (scan ,regex ,target-string :start (or ,start 0) - :end (or ,end (length ,target-string))) - (declare (ignore ,match-end)) - ,@(unless var-bindings - `((declare (ignore ,reg-starts ,reg-ends)))) - (when ,match-start - ,@(if var-bindings - `((let* ,(list* - `(,substr-fn (if ,sharedp #'nsubseq #'subseq)) - var-bindings) - ,@body)) - body))))))) - -(defmacro do-scans ((match-start match-end reg-starts reg-ends regex - target-string - &optional result-form - &key start end) - &body body - &environment env) - "Iterates over TARGET-STRING and tries to match REGEX as often as -possible evaluating BODY with MATCH-START, MATCH-END, REG-STARTS, and -REG-ENDS bound to the four return values of each match in turn. After -the last match, returns RESULT-FORM if provided or NIL otherwise. An -implicit block named NIL surrounds DO-SCANS; RETURN may be used to -terminate the loop immediately. If REGEX matches an empty string the -scan is continued one position behind this match. BODY may start with -declarations." - (with-rebinding (target-string) - (with-unique-names (%start %end %regex scanner) - (declare (ignorable %regex scanner)) - ;; the NIL BLOCK to enable exits via (RETURN ...) - `(block nil - (let* ((,%start (or ,start 0)) - (,%end (or ,end (length ,target-string))) - ,@(unless (constantp regex env) - ;; leave constant regular expressions as they are - - ;; SCAN's compiler macro will take care of them; - ;; otherwise create a scanner unless the regex is - ;; already a function (otherwise SCAN will do this - ;; on each iteration) - `((,%regex ,regex) - (,scanner (typecase ,%regex - (function ,%regex) - (t (create-scanner ,%regex))))))) - ;; coerce TARGET-STRING to a simple string unless it is one - ;; already (otherwise SCAN will do this on each iteration) - (setq ,target-string - (maybe-coerce-to-simple-string ,target-string)) - (loop - ;; invoke SCAN and bind the returned values to the - ;; provided variables - (multiple-value-bind - (,match-start ,match-end ,reg-starts ,reg-ends) - (scan ,(cond ((constantp regex env) regex) - (t scanner)) - ,target-string :start ,%start :end ,%end - :real-start-pos (or ,start 0)) - ;; declare the variables to be IGNORABLE to prevent the - ;; compiler from issuing warnings - (declare - (ignorable ,match-start ,match-end ,reg-starts ,reg-ends)) - (unless ,match-start - ;; stop iteration on first failure - (return ,result-form)) - ;; execute BODY (wrapped in LOCALLY so it can start with - ;; declarations) - (locally - ,@body) - ;; advance by one position if we had a zero-length match - (setq ,%start (if (= ,match-start ,match-end) - (1+ ,match-end) - ,match-end))))))))) - -(defmacro do-matches ((match-start match-end regex - target-string - &optional result-form - &key start end) - &body body) - "Iterates over TARGET-STRING and tries to match REGEX as often as -possible evaluating BODY with MATCH-START and MATCH-END bound to the -start/end positions of each match in turn. After the last match, -returns RESULT-FORM if provided or NIL otherwise. An implicit block -named NIL surrounds DO-MATCHES; RETURN may be used to terminate the -loop immediately. If REGEX matches an empty string the scan is -continued one position behind this match. BODY may start with -declarations." - ;; this is a simplified form of DO-SCANS - we just provide two dummy - ;; vars and ignore them - (with-unique-names (reg-starts reg-ends) - `(do-scans (,match-start ,match-end - ,reg-starts ,reg-ends - ,regex ,target-string - ,result-form - :start ,start :end ,end) - ,@body))) - -(defmacro do-matches-as-strings ((match-var regex - target-string - &optional result-form - &key start end sharedp) - &body body) - "Iterates over TARGET-STRING and tries to match REGEX as often as -possible evaluating BODY with MATCH-VAR bound to the substring of -TARGET-STRING corresponding to each match in turn. After the last -match, returns RESULT-FORM if provided or NIL otherwise. An implicit -block named NIL surrounds DO-MATCHES-AS-STRINGS; RETURN may be used to -terminate the loop immediately. If REGEX matches an empty string the -scan is continued one position behind this match. If SHAREDP is true, -the substrings may share structure with TARGET-STRING. BODY may start -with declarations." - (with-rebinding (target-string) - (with-unique-names (match-start match-end substr-fn) - `(let ((,substr-fn (if ,sharedp #'nsubseq #'subseq))) - ;; simple use DO-MATCHES to extract the substrings - (do-matches (,match-start ,match-end ,regex ,target-string - ,result-form :start ,start :end ,end) - (let ((,match-var - (funcall ,substr-fn - ,target-string ,match-start ,match-end))) - ,@body)))))) - -(defmacro do-register-groups (var-list (regex target-string - &optional result-form - &key start end sharedp) - &body body) - "Iterates over TARGET-STRING and tries to match REGEX as often as -possible evaluating BODY with the variables in VAR-LIST bound to the -corresponding register groups for each match in turn, i.e. each -variable is either bound to a string or to NIL. For each element of -VAR-LIST which is NIL there's no binding to the corresponding register -group. The number of variables in VAR-LIST must not be greater than -the number of register groups. After the last match, returns -RESULT-FORM if provided or NIL otherwise. An implicit block named NIL -surrounds DO-REGISTER-GROUPS; RETURN may be used to terminate the loop -immediately. If REGEX matches an empty string the scan is continued -one position behind this match. If SHAREDP is true, the substrings -may share structure with TARGET-STRING. BODY may start with -declarations." - (with-rebinding (target-string) - (with-unique-names (substr-fn match-start match-end - reg-starts reg-ends start-index) - `(let ((,substr-fn (if ,sharedp - #'nsubseq - #'subseq))) - (do-scans (,match-start ,match-end ,reg-starts ,reg-ends - ,regex ,target-string - ,result-form :start ,start :end ,end) - (let ,(loop for (function var) in (normalize-var-list var-list) - for counter from 0 - when var - collect `(,var (let ((,start-index - (aref ,reg-starts ,counter))) - (if ,start-index - (funcall ,function - (funcall ,substr-fn - ,target-string - ,start-index - (aref ,reg-ends ,counter))) - nil)))) - ,@body)))))) - -(defun all-matches (regex target-string - &key (start 0) - (end (length target-string))) - "Returns a list containing the start and end positions of all -matches of REGEX against TARGET-STRING, i.e. if there are N matches -the list contains (* 2 N) elements. If REGEX matches an empty string -the scan is continued one position behind this match." - (declare #.*standard-optimize-settings*) - (let (result-list) - (do-matches (match-start match-end - regex target-string - (nreverse result-list) - :start start :end end) - (push match-start result-list) - (push match-end result-list)))) - -#-:cormanlisp -(define-compiler-macro all-matches (&whole form regex &rest rest) - "Make sure that constant forms are compiled into scanners at -compile time." - (cond ((constantp regex) - `(all-matches (load-time-value (create-scanner ,regex)) - ,@rest)) - (t form))) - -(defun all-matches-as-strings (regex target-string - &key (start 0) - (end (length target-string)) - sharedp) - "Returns a list containing all substrings of TARGET-STRING which -match REGEX. If REGEX matches an empty string the scan is continued -one position behind this match. If SHAREDP is true, the substrings may -share structure with TARGET-STRING." - (declare #.*standard-optimize-settings*) - (let (result-list) - (do-matches-as-strings (match regex target-string (nreverse result-list) - :start start :end end :sharedp sharedp) - (push match result-list)))) - -#-:cormanlisp -(define-compiler-macro all-matches-as-strings (&whole form regex &rest rest) - "Make sure that constant forms are compiled into scanners at -compile time." - (cond ((constantp regex) - `(all-matches-as-strings - (load-time-value (create-scanner ,regex)) - ,@rest)) - (t form))) - -(defun split (regex target-string - &key (start 0) - (end (length target-string)) - limit - with-registers-p - omit-unmatched-p - sharedp) - "Matches REGEX against TARGET-STRING as often as possible and -returns a list of the substrings between the matches. If -WITH-REGISTERS-P is true, substrings corresponding to matched -registers are inserted into the list as well. If OMIT-UNMATCHED-P is -true, unmatched registers will simply be left out, otherwise they will -show up as NIL. LIMIT limits the number of elements returned - -registers aren't counted. If LIMIT is NIL \(or 0 which is -equivalent), trailing empty strings are removed from the result list. -If REGEX matches an empty string the scan is continued one position -behind this match. If SHAREDP is true, the substrings may share -structure with TARGET-STRING." - (declare #.*standard-optimize-settings*) - ;; initialize list of positions POS-LIST to extract substrings with - ;; START so that the start of the next match will mark the end of - ;; the first substring - (let ((pos-list (list start)) - (counter 0)) - ;; how would Larry Wall do it? - (when (eql limit 0) - (setq limit nil)) - (do-scans (match-start match-end - reg-starts reg-ends - regex target-string nil - :start start :end end) - (unless (and (= match-start match-end) - (= match-start (car pos-list))) - ;; push start of match on list unless this would be an empty - ;; string adjacent to the last element pushed onto the list - (when (and limit - ;; perlfunc(1) says - ;; If LIMIT is negative, it is treated as if - ;; it were instead arbitrarily large; - ;; as many fields as possible are produced. - (plusp limit) - (>= (incf counter) limit)) - (return)) - (push match-start pos-list) - (when with-registers-p - ;; optionally insert matched registers - (loop for reg-start across reg-starts - for reg-end across reg-ends - if reg-start - ;; but only if they've matched - do (push reg-start pos-list) - (push reg-end pos-list) - else unless omit-unmatched-p - ;; or if we're allowed to insert NIL instead - do (push nil pos-list) - (push nil pos-list))) - ;; now end of match - (push match-end pos-list))) - ;; end of whole string - (push end pos-list) - ;; now collect substrings - (nreverse - (loop with substr-fn = (if sharedp #'nsubseq #'subseq) - with string-seen = nil - for (this-end this-start) on pos-list by #'cddr - ;; skip empty strings from end of list - if (or limit - (setq string-seen - (or string-seen - (and this-start - (> this-end this-start))))) - collect (if this-start - (funcall substr-fn - target-string this-start this-end) - nil))))) - -#-:cormanlisp -(define-compiler-macro split (&whole form regex target-string &rest rest) - "Make sure that constant forms are compiled into scanners at compile time." - (cond ((constantp regex) - `(split (load-time-value (create-scanner ,regex)) - ,target-string ,@rest)) - (t form))) - -(defun string-case-modifier (str from to start end) - (declare #.*standard-optimize-settings*) - (declare (fixnum from to start end)) - "Checks whether all words in STR between FROM and TO are upcased, -downcased or capitalized and returns a function which applies a -corresponding case modification to strings. Returns #'IDENTITY -otherwise, especially if words in the target area extend beyond FROM -or TO. STR is supposed to be bounded by START and END. It is assumed -that \(<= START FROM TO END)." - (case - (if (or (<= to from) - (and (< start from) - (alphanumericp (char str (1- from))) - (alphanumericp (char str from))) - (and (< to end) - (alphanumericp (char str to)) - (alphanumericp (char str (1- to))))) - ;; if it's a zero-length string or if words extend beyond FROM - ;; or TO we return NIL, i.e. #'IDENTITY - nil - ;; otherwise we loop through STR from FROM to TO - (loop with last-char-both-case - with current-result - for index of-type fixnum from from below to - for chr = (char str index) - do (cond ((not #-:cormanlisp (both-case-p chr) - #+:cormanlisp (or (upper-case-p chr) - (lower-case-p chr))) - ;; this character doesn't have a case so we - ;; consider it as a word boundary (note that - ;; this differs from how \b works in Perl) - (setq last-char-both-case nil)) - ((upper-case-p chr) - ;; an uppercase character - (setq current-result - (if last-char-both-case - ;; not the first character in a - (case current-result - ((:undecided) :upcase) - ((:downcase :capitalize) (return nil)) - ((:upcase) current-result)) - (case current-result - ((nil) :undecided) - ((:downcase) (return nil)) - ((:capitalize :upcase) current-result))) - last-char-both-case t)) - (t - ;; a lowercase character - (setq current-result - (case current-result - ((nil) :downcase) - ((:undecided) :capitalize) - ((:downcase) current-result) - ((:capitalize) (if last-char-both-case - current-result - (return nil))) - ((:upcase) (return nil))) - last-char-both-case t))) - finally (return current-result))) - ((nil) #'identity) - ((:undecided :upcase) #'string-upcase) - ((:downcase) #'string-downcase) - ((:capitalize) #'string-capitalize))) - -;; first create a scanner to identify the special parts of the -;; replacement string (eat your own dog food...) - -(defgeneric build-replacement-template (replacement-string) - (declare #.*standard-optimize-settings*) - (:documentation "Converts a replacement string for REGEX-REPLACE or -REGEX-REPLACE-ALL into a replacement template which is an -S-expression.")) - -#-:cormanlisp -(let* ((*use-bmh-matchers* nil) - (reg-scanner (create-scanner "\\\\(?:\\\\|\\{\\d+\\}|\\d+|&|`|')"))) - (defmethod build-replacement-template ((replacement-string string)) - (declare #.*standard-optimize-settings*) - (let ((from 0) - ;; COLLECTOR will hold the (reversed) template - (collector '())) - ;; scan through all special parts of the replacement string - (do-matches (match-start match-end reg-scanner replacement-string) - (when (< from match-start) - ;; strings between matches are copied verbatim - (push (subseq replacement-string from match-start) collector)) - ;; PARSE-START is true if the pattern matched a number which - ;; refers to a register - (let* ((parse-start (position-if #'digit-char-p - replacement-string - :start match-start - :end match-end)) - (token (if parse-start - (1- (parse-integer replacement-string - :start parse-start - :junk-allowed t)) - ;; if we didn't match a number we convert the - ;; character to a symbol - (case (char replacement-string (1+ match-start)) - ((#\&) :match) - ((#\`) :before-match) - ((#\') :after-match) - ((#\\) :backslash))))) - (when (and (numberp token) (< token 0)) - ;; make sure we don't accept something like "\\0" - (signal-invocation-error "Illegal substring ~S in replacement string." - (subseq replacement-string match-start match-end))) - (push token collector)) - ;; remember where the match ended - (setq from match-end)) - (when (< from (length replacement-string)) - ;; push the rest of the replacement string onto the list - (push (subseq replacement-string from) collector)) - (nreverse collector)))) - -#-:cormanlisp -(defmethod build-replacement-template ((replacement-function function)) - (declare #.*standard-optimize-settings*) - (list replacement-function)) - -#-:cormanlisp -(defmethod build-replacement-template ((replacement-function-symbol symbol)) - (declare #.*standard-optimize-settings*) - (list replacement-function-symbol)) - -#-:cormanlisp -(defmethod build-replacement-template ((replacement-list list)) - (declare #.*standard-optimize-settings*) - replacement-list) - -;;; Corman Lisp's methods can't be closures... :( -#+:cormanlisp -(let* ((*use-bmh-matchers* nil) - (reg-scanner (create-scanner "\\\\(?:\\\\|\\{\\d+\\}|\\d+|&|`|')"))) - (defun build-replacement-template (replacement) - (declare #.*standard-optimize-settings*) - (typecase replacement - (string - (let ((from 0) - ;; COLLECTOR will hold the (reversed) template - (collector '())) - ;; scan through all special parts of the replacement string - (do-matches (match-start match-end reg-scanner replacement) - (when (< from match-start) - ;; strings between matches are copied verbatim - (push (subseq replacement from match-start) collector)) - ;; PARSE-START is true if the pattern matched a number which - ;; refers to a register - (let* ((parse-start (position-if #'digit-char-p - replacement - :start match-start - :end match-end)) - (token (if parse-start - (1- (parse-integer replacement - :start parse-start - :junk-allowed t)) - ;; if we didn't match a number we convert the - ;; character to a symbol - (case (char replacement (1+ match-start)) - ((#\&) :match) - ((#\`) :before-match) - ((#\') :after-match) - ((#\\) :backslash))))) - (when (and (numberp token) (< token 0)) - ;; make sure we don't accept something like "\\0" - (signal-invocation-error "Illegal substring ~S in replacement string." - (subseq replacement match-start match-end))) - (push token collector)) - ;; remember where the match ended - (setq from match-end)) - (when (< from (length replacement)) - ;; push the rest of the replacement string onto the list - (push (nsubseq replacement from) collector)) - (nreverse collector))) - (list - replacement) - (t - (list replacement))))) - -(defun build-replacement (replacement-template - target-string - start end - match-start match-end - reg-starts reg-ends - simple-calls - element-type) - (declare #.*standard-optimize-settings*) - "Accepts a replacement template and the current values from the -matching process in REGEX-REPLACE or REGEX-REPLACE-ALL and returns the -corresponding string." - ;; the upper exclusive bound of the register numbers in the regular - ;; expression - (let ((reg-bound (if reg-starts - (array-dimension reg-starts 0) - 0))) - (with-output-to-string (s nil :element-type element-type) - (loop for token in replacement-template - do (typecase token - (string - ;; transfer string parts verbatim - (write-string token s)) - (integer - ;; replace numbers with the corresponding registers - (when (>= token reg-bound) - ;; but only if the register was referenced in the - ;; regular expression - (signal-invocation-error "Reference to non-existent register ~A in replacement string." - (1+ token))) - (when (svref reg-starts token) - ;; and only if it matched, i.e. no match results - ;; in an empty string - (write-string target-string s - :start (svref reg-starts token) - :end (svref reg-ends token)))) - (function - (write-string - (cond (simple-calls - (apply token - (nsubseq target-string match-start match-end) - (map 'list - (lambda (reg-start reg-end) - (and reg-start - (nsubseq target-string reg-start reg-end))) - reg-starts reg-ends))) - (t - (funcall token - target-string - start end - match-start match-end - reg-starts reg-ends))) - s)) - (symbol - (case token - ((:backslash) - ;; just a backslash - (write-char #\\ s)) - ((:match) - ;; the whole match - (write-string target-string s - :start match-start - :end match-end)) - ((:before-match) - ;; the part of the target string before the match - (write-string target-string s - :start start - :end match-start)) - ((:after-match) - ;; the part of the target string after the match - (write-string target-string s - :start match-end - :end end)) - (otherwise - (write-string - (cond (simple-calls - (apply token - (nsubseq target-string match-start match-end) - (map 'list - (lambda (reg-start reg-end) - (and reg-start - (nsubseq target-string reg-start reg-end))) - reg-starts reg-ends))) - (t - (funcall token - target-string - start end - match-start match-end - reg-starts reg-ends))) - s))))))))) - -(defun replace-aux (target-string replacement pos-list reg-list start end - preserve-case simple-calls element-type) - "Auxiliary function used by REGEX-REPLACE and REGEX-REPLACE-ALL. -POS-LIST contains a list with the start and end positions of all -matches while REG-LIST contains a list of arrays representing the -corresponding register start and end positions." - (declare #.*standard-optimize-settings*) - ;; build the template once before we start the loop - (let ((replacement-template (build-replacement-template replacement))) - (with-output-to-string (s nil :element-type element-type) - ;; loop through all matches and take the start and end of the - ;; whole string into account - (loop for (from to) on (append (list start) pos-list (list end)) - ;; alternate between replacement and no replacement - for replace = nil then (and (not replace) to) - for reg-starts = (if replace (pop reg-list) nil) - for reg-ends = (if replace (pop reg-list) nil) - for curr-replacement = (if replace - ;; build the replacement string - (build-replacement replacement-template - target-string - start end - from to - reg-starts reg-ends - simple-calls - element-type) - nil) - while to - if replace - do (write-string (if preserve-case - ;; modify the case of the replacement - ;; string if necessary - (funcall (string-case-modifier target-string - from to - start end) - curr-replacement) - curr-replacement) - s) - else - ;; no replacement - do (write-string target-string s :start from :end to))))) - -(defun regex-replace (regex target-string replacement &key - (start 0) - (end (length target-string)) - preserve-case - simple-calls - (element-type #+:lispworks 'lw:simple-char #-:lispworks 'character)) - "Try to match TARGET-STRING between START and END against REGEX and -replace the first match with REPLACEMENT. Two values are returned; -the modified string, and T if REGEX matched or NIL otherwise. - - REPLACEMENT can be a string which may contain the special substrings -\"\\&\" for the whole match, \"\\`\" for the part of TARGET-STRING -before the match, \"\\'\" for the part of TARGET-STRING after the -match, \"\\N\" or \"\\{N}\" for the Nth register where N is a positive -integer. - - REPLACEMENT can also be a function designator in which case the -match will be replaced with the result of calling the function -designated by REPLACEMENT with the arguments TARGET-STRING, START, -END, MATCH-START, MATCH-END, REG-STARTS, and REG-ENDS. (REG-STARTS and -REG-ENDS are arrays holding the start and end positions of matched -registers or NIL - the meaning of the other arguments should be -obvious.) - - Finally, REPLACEMENT can be a list where each element is a string, -one of the symbols :MATCH, :BEFORE-MATCH, or :AFTER-MATCH - -corresponding to \"\\&\", \"\\`\", and \"\\'\" above -, an integer N - -representing register (1+ N) -, or a function designator. - - If PRESERVE-CASE is true, the replacement will try to preserve the -case (all upper case, all lower case, or capitalized) of the -match. The result will always be a fresh string, even if REGEX doesn't -match. - - ELEMENT-TYPE is the element type of the resulting string." - (declare #.*standard-optimize-settings*) - (multiple-value-bind (match-start match-end reg-starts reg-ends) - (scan regex target-string :start start :end end) - (if match-start - (values (replace-aux target-string replacement - (list match-start match-end) - (list reg-starts reg-ends) - start end preserve-case - simple-calls element-type) - t) - (values (subseq target-string start end) - nil)))) - -#-:cormanlisp -(define-compiler-macro regex-replace - (&whole form regex target-string replacement &rest rest) - "Make sure that constant forms are compiled into scanners at compile time." - (cond ((constantp regex) - `(regex-replace (load-time-value (create-scanner ,regex)) - ,target-string ,replacement ,@rest)) - (t form))) - -(defun regex-replace-all (regex target-string replacement &key - (start 0) - (end (length target-string)) - preserve-case - simple-calls - (element-type #+:lispworks 'lw:simple-char #-:lispworks 'character)) - "Try to match TARGET-STRING between START and END against REGEX and -replace all matches with REPLACEMENT. Two values are returned; the -modified string, and T if REGEX matched or NIL otherwise. - - REPLACEMENT can be a string which may contain the special substrings -\"\\&\" for the whole match, \"\\`\" for the part of TARGET-STRING -before the match, \"\\'\" for the part of TARGET-STRING after the -match, \"\\N\" or \"\\{N}\" for the Nth register where N is a positive -integer. - - REPLACEMENT can also be a function designator in which case the -match will be replaced with the result of calling the function -designated by REPLACEMENT with the arguments TARGET-STRING, START, -END, MATCH-START, MATCH-END, REG-STARTS, and REG-ENDS. (REG-STARTS and -REG-ENDS are arrays holding the start and end positions of matched -registers or NIL - the meaning of the other arguments should be -obvious.) - - Finally, REPLACEMENT can be a list where each element is a string, -one of the symbols :MATCH, :BEFORE-MATCH, or :AFTER-MATCH - -corresponding to \"\\&\", \"\\`\", and \"\\'\" above -, an integer N - -representing register (1+ N) -, or a function designator. - - If PRESERVE-CASE is true, the replacement will try to preserve the -case (all upper case, all lower case, or capitalized) of the -match. The result will always be a fresh string, even if REGEX doesn't -match. - - ELEMENT-TYPE is the element type of the resulting string." - (declare #.*standard-optimize-settings*) - (let ((pos-list '()) - (reg-list '())) - (do-scans (match-start match-end reg-starts reg-ends regex target-string - nil - :start start :end end) - (push match-start pos-list) - (push match-end pos-list) - (push reg-starts reg-list) - (push reg-ends reg-list)) - (if pos-list - (values (replace-aux target-string replacement - (nreverse pos-list) - (nreverse reg-list) - start end preserve-case - simple-calls element-type) - t) - (values (subseq target-string start end) - nil)))) - -#-:cormanlisp -(define-compiler-macro regex-replace-all - (&whole form regex target-string replacement &rest rest) - "Make sure that constant forms are compiled into scanners at compile time." - (cond ((constantp regex) - `(regex-replace-all (load-time-value (create-scanner ,regex)) - ,target-string ,replacement ,@rest)) - (t form))) - -#-:cormanlisp -(defmacro regex-apropos-aux ((regex packages case-insensitive &optional return-form) - &body body) - "Auxiliary macro used by REGEX-APROPOS and REGEX-APROPOS-LIST. Loops -through PACKAGES and executes BODY with SYMBOL bound to each symbol -which matches REGEX. Optionally evaluates and returns RETURN-FORM at -the end. If CASE-INSENSITIVE is true and REGEX isn't already a -scanner, a case-insensitive scanner is used." - (with-rebinding (regex) - (with-unique-names (scanner %packages next morep hash) - `(let* ((,scanner (create-scanner ,regex - :case-insensitive-mode - (and ,case-insensitive - (not (functionp ,regex))))) - (,%packages (or ,packages - (list-all-packages))) - (,hash (make-hash-table :test #'eq))) - (with-package-iterator (,next ,%packages :external :internal :inherited) - (loop - (multiple-value-bind (,morep symbol) - (,next) - (unless ,morep - (return ,return-form)) - (unless (gethash symbol ,hash) - (when (scan ,scanner (symbol-name symbol)) - (setf (gethash symbol ,hash) t) - ,@body))))))))) - -;;; The following two functions were provided by Karsten Poeck - -#+:cormanlisp -(defmacro do-with-all-symbols ((variable package-or-packagelist) &body body) - "Executes BODY with VARIABLE bound to each symbol in -PACKAGE-OR-PACKAGELIST \(a designator for a list of packages) in -turn." - (with-unique-names (pack-var) - `(if (listp ,package-or-packagelist) - (dolist (,pack-var ,package-or-packagelist) - (do-symbols (,variable ,pack-var) - ,@body)) - (do-symbols (,variable ,package-or-packagelist) - ,@body)))) - -#+:cormanlisp -(defmacro regex-apropos-aux ((regex packages case-insensitive &optional return-form) - &body body) - "Auxiliary macro used by REGEX-APROPOS and REGEX-APROPOS-LIST. -Loops through PACKAGES and executes BODY with SYMBOL bound to each -symbol which matches REGEX. Optionally evaluates and returns -RETURN-FORM at the end. If CASE-INSENSITIVE is true and REGEX isn't -already a scanner, a case-insensitive scanner is used." - (with-rebinding (regex) - (with-unique-names (scanner %packages hash) - `(let* ((,scanner (create-scanner ,regex - :case-insensitive-mode - (and ,case-insensitive - (not (functionp ,regex))))) - (,%packages (or ,packages - (list-all-packages))) - (,hash (make-hash-table :test #'eq))) - (do-with-all-symbols (symbol ,%packages) - (unless (gethash symbol ,hash) - (when (scan ,scanner (symbol-name symbol)) - (setf (gethash symbol ,hash) t) - ,@body))) - ,return-form)))) - -(defun regex-apropos-list (regex &optional packages &key (case-insensitive t)) - (declare #.*standard-optimize-settings*) - "Similar to the standard function APROPOS-LIST but returns a list of -all symbols which match the regular expression REGEX. If -CASE-INSENSITIVE is true and REGEX isn't already a scanner, a -case-insensitive scanner is used." - (let ((collector '())) - (regex-apropos-aux (regex packages case-insensitive collector) - (push symbol collector)))) - -(defun print-symbol-info (symbol) - "Auxiliary function used by REGEX-APROPOS. Tries to print some -meaningful information about a symbol." - (declare #.*standard-optimize-settings*) - (handler-case - (let ((output-list '())) - (cond ((special-operator-p symbol) - (push "[special operator]" output-list)) - ((macro-function symbol) - (push "[macro]" output-list)) - ((fboundp symbol) - (let* ((function (symbol-function symbol)) - (compiledp (compiled-function-p function))) - (multiple-value-bind (lambda-expr closurep) - (function-lambda-expression function) - (push - (format nil - "[~:[~;compiled ~]~:[function~;closure~]]~:[~; ~A~]" - compiledp closurep lambda-expr (cadr lambda-expr)) - output-list))))) - (let ((class (find-class symbol nil))) - (when class - (push (format nil "[class] ~S" class) output-list))) - (cond ((keywordp symbol) - (push "[keyword]" output-list)) - ((constantp symbol) - (push (format nil "[constant]~:[~; value: ~S~]" - (boundp symbol) (symbol-value symbol)) output-list)) - ((boundp symbol) - (push #+(or :lispworks :clisp) "[variable]" - #-(or :lispworks :clisp) (format nil "[variable] value: ~S" - (symbol-value symbol)) - output-list))) - #-(or :cormanlisp :clisp) - (format t "~&~S ~<~;~^~A~@{~:@_~A~}~;~:>" symbol output-list) - #+(or :cormanlisp :clisp) - (loop for line in output-list - do (format t "~&~S ~A" symbol line))) - (condition () - ;; this seems to be necessary due to some errors I encountered - ;; with LispWorks - (format t "~&~S [an error occurred while trying to print more info]" symbol)))) - -(defun regex-apropos (regex &optional packages &key (case-insensitive t)) - "Similar to the standard function APROPOS but returns a list of all -symbols which match the regular expression REGEX. If CASE-INSENSITIVE -is true and REGEX isn't already a scanner, a case-insensitive scanner -is used." - (declare #.*standard-optimize-settings*) - (regex-apropos-aux (regex packages case-insensitive) - (print-symbol-info symbol)) - (values)) - -(let* ((*use-bmh-matchers* nil) - (non-word-char-scanner (create-scanner "[^a-zA-Z_0-9]"))) - (defun quote-meta-chars (string &key (start 0) (end (length string))) - "Quote, i.e. prefix with #\\\\, all non-word characters in STRING." - (regex-replace-all non-word-char-scanner string "\\\\\\&" - :start start :end end))) - -(let* ((*use-bmh-matchers* nil) - (*allow-quoting* nil) - (quote-char-scanner (create-scanner "\\\\Q")) - (section-scanner (create-scanner "\\\\Q((?:[^\\\\]|\\\\(?!Q))*?)(?:\\\\E|$)"))) - (defun quote-sections (string) - "Replace sections inside of STRING which are enclosed by \\Q and -\\E with the quoted equivalent of these sections \(see -QUOTE-META-CHARS). Repeat this as long as there are such -sections. These sections may nest." - (flet ((quote-substring (target-string start end match-start - match-end reg-starts reg-ends) - (declare (ignore start end match-start match-end)) - (quote-meta-chars target-string - :start (svref reg-starts 0) - :end (svref reg-ends 0)))) - (loop for result = string then (regex-replace-all section-scanner - result - #'quote-substring) - while (scan quote-char-scanner result) - finally (return result))))) - -(let* ((*use-bmh-matchers* nil) - (comment-scanner (create-scanner "(?s)\\(\\?#.*?\\)")) - (extended-comment-scanner (create-scanner "(?m:#.*?$)|(?s:\\(\\?#.*?\\))")) - (quote-token-scanner (create-scanner "\\\\[QE]")) - (quote-token-replace-scanner (create-scanner "\\\\([QE])"))) - (defun clean-comments (string &optional extended-mode) - "Clean \(?#...) comments within STRING for quoting, i.e. convert -\\Q to Q and \\E to E. If EXTENDED-MODE is true, also clean -end-of-line comments, i.e. those starting with #\\# and ending with -#\\Newline." - (flet ((remove-tokens (target-string start end match-start - match-end reg-starts reg-ends) - (declare (ignore start end reg-starts reg-ends)) - (loop for result = (nsubseq target-string match-start match-end) - then (regex-replace-all quote-token-replace-scanner result "\\1") - ;; we must probably repeat this because the comment - ;; can contain substrings like \\Q - while (scan quote-token-scanner result) - finally (return result)))) - (regex-replace-all (if extended-mode - extended-comment-scanner - comment-scanner) - string - #'remove-tokens)))) - -(defun parse-tree-synonym (symbol) - "Returns the parse tree the SYMBOL symbol is a synonym for. Returns -NIL is SYMBOL wasn't yet defined to be a synonym." - (get symbol 'parse-tree-synonym)) - -(defun (setf parse-tree-synonym) (new-parse-tree symbol) - "Defines SYMBOL to be a synonm for the parse tree NEW-PARSE-TREE." - (setf (get symbol 'parse-tree-synonym) new-parse-tree)) - -(defmacro define-parse-tree-synonym (name parse-tree) - "Defines the symbol NAME to be a synonym for the parse tree -PARSE-TREE. Both arguments are quoted." - `(eval-when (:compile-toplevel :load-toplevel :execute) - (setf (parse-tree-synonym ',name) ',parse-tree))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/charmap.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/charmap.lisp deleted file mode 100644 index 844594a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/charmap.lisp +++ /dev/null @@ -1,152 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/charmap.lisp,v 1.19 2009/09/17 19:17:30 edi Exp $ - -;;; An optimized representation of sets of characters. - -;;; Copyright (c) 2008-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre) - -(defstruct (charmap (:constructor make-charmap%)) - ;; a bit vector mapping char codes to "booleans" (1 for set members, - ;; 0 for others) - (vector #*0 :type simple-bit-vector) - ;; the smallest character code of all characters in the set - (start 0 :type fixnum) - ;; the upper (exclusive) bound of all character codes in the set - (end 0 :type fixnum) - ;; the number of characters in the set, or NIL if this is unknown - (count nil :type (or fixnum null)) - ;; whether the charmap actually represents the complement of the set - (complementp nil :type boolean)) - -;; seems to be necessary for some Lisps like ClozureCL -(defmethod make-load-form ((map charmap) &optional environment) - (make-load-form-saving-slots map :environment environment)) - -(declaim (inline in-charmap-p)) -(defun in-charmap-p (char charmap) - "Tests whether the character CHAR belongs to the set represented by CHARMAP." - (declare #.*standard-optimize-settings*) - (declare (character char) (charmap charmap)) - (let* ((char-code (char-code char)) - (char-in-vector-p - (let ((charmap-start (charmap-start charmap))) - (declare (fixnum charmap-start)) - (and (<= charmap-start char-code) - (< char-code (the fixnum (charmap-end charmap))) - (= 1 (sbit (the simple-bit-vector (charmap-vector charmap)) - (- char-code charmap-start))))))) - (cond ((charmap-complementp charmap) (not char-in-vector-p)) - (t char-in-vector-p)))) - -(defun charmap-contents (charmap) - "Returns a list of all characters belonging to a character map. -Only works for non-complement charmaps." - (declare #.*standard-optimize-settings*) - (declare (charmap charmap)) - (and (not (charmap-complementp charmap)) - (loop for code of-type fixnum from (charmap-start charmap) to (charmap-end charmap) - for i across (the simple-bit-vector (charmap-vector charmap)) - when (= i 1) - collect (code-char code)))) - -(defun make-charmap (start end test-function &optional complementp) - "Creates and returns a charmap representing all characters with -character codes in the interval [start end) that satisfy -TEST-FUNCTION. The COMPLEMENTP slot of the charmap is set to the -value of the optional argument, but this argument doesn't have an -effect on how TEST-FUNCTION is used." - (declare #.*standard-optimize-settings*) - (declare (fixnum start end)) - (let ((vector (make-array (- end start) :element-type 'bit)) - (count 0)) - (declare (fixnum count)) - (loop for code from start below end - for char = (code-char code) - for index from 0 - when char do - (incf count) - (setf (sbit vector index) (if (funcall test-function char) 1 0))) - (make-charmap% :vector vector - :start start - :end end - ;; we don't know for sure if COMPLEMENTP is true as - ;; there isn't a necessary a character for each - ;; integer below *REGEX-CHAR-CODE-LIMIT* - :count (and (not complementp) count) - ;; make sure it's boolean - :complementp (not (not complementp))))) - -(defun create-charmap-from-test-function (test-function start end) - "Creates and returns a charmap representing all characters with -character codes between START and END which satisfy TEST-FUNCTION. -Tries to find the smallest interval which is necessary to represent -the character set and uses the complement representation if that -helps." - (declare #.*standard-optimize-settings*) - (let (start-in end-in start-out end-out) - ;; determine the smallest intervals containing the set and its - ;; complement, [start-in, end-in) and [start-out, end-out) - first - ;; the lower bound - (loop for code from start below end - for char = (code-char code) - until (and start-in start-out) - when (and char - (not start-in) - (funcall test-function char)) - do (setq start-in code) - when (and char - (not start-out) - (not (funcall test-function char))) - do (setq start-out code)) - (unless start-in - ;; no character satisfied the test, so return a "pseudo" charmap - ;; where IN-CHARMAP-P is always false - (return-from create-charmap-from-test-function - (make-charmap% :count 0))) - (unless start-out - ;; no character failed the test, so return a "pseudo" charmap - ;; where IN-CHARMAP-P is always true - (return-from create-charmap-from-test-function - (make-charmap% :complementp t))) - ;; now determine upper bound - (loop for code from (1- end) downto start - for char = (code-char code) - until (and end-in end-out) - when (and char - (not end-in) - (funcall test-function char)) - do (setq end-in (1+ code)) - when (and char - (not end-out) - (not (funcall test-function char))) - do (setq end-out (1+ code))) - ;; use the smaller interval - (cond ((<= (- end-in start-in) (- end-out start-out)) - (make-charmap start-in end-in test-function)) - (t (make-charmap start-out end-out (complement* test-function) t))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/charset.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/charset.lisp deleted file mode 100644 index 4343291..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/charset.lisp +++ /dev/null @@ -1,242 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/charset.lisp,v 1.10 2009/09/17 19:17:30 edi Exp $ - -;;; A specialized set implementation for characters by Nikodemus Siivola. - -;;; Copyright (c) 2008, Nikodemus Siivola. All rights reserved. -;;; Copyright (c) 2008-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre) - -(defconstant +probe-depth+ 3 - "Maximum number of collisions \(for any element) we accept before we -allocate more storage. This is now fixed, but could be made to vary -depending on the size of the storage vector \(e.g. in the range of -1-4). Larger probe-depths mean more collisions are tolerated before -the table grows, but increase the constant factor.") - -(defun make-char-vector (size) - "Returns a vector of size SIZE to hold characters. All elements are -initialized to #\Null except for the first one which is initialized to -#\?." - (declare #.*standard-optimize-settings*) - (declare (type (integer 2 #.(1- array-total-size-limit)) size)) - ;; since #\Null always hashes to 0, store something else there - ;; initially, and #\Null everywhere else - (let ((result (make-array size - :element-type #-:lispworks 'character #+:lispworks 'lw:simple-char - :initial-element (code-char 0)))) - (setf (char result 0) #\?) - result)) - -(defstruct (charset (:constructor make-charset ())) - ;; this is set to 0 when we stop hashing and just use a CHAR-CODE - ;; indexed vector - (depth +probe-depth+ :type fixnum) - ;; the number of characters in this set - (count 0 :type fixnum) - ;; the storage vector - (vector (make-char-vector 12) :type (simple-array character (*)))) - -;; seems to be necessary for some Lisps like ClozureCL -(defmethod make-load-form ((set charset) &optional environment) - (make-load-form-saving-slots set :environment environment)) - -(declaim (inline mix)) -(defun mix (code hash) - "Given a character code CODE and a hash code HASH, computes and -returns the \"next\" hash code. See comments below." - (declare #.*standard-optimize-settings*) - ;; mixing the CHAR-CODE back in at each step makes sure that if two - ;; characters collide (their hashes end up pointing in the same - ;; storage vector index) on one round, they should (hopefully!) not - ;; collide on the next - (sxhash (logand most-positive-fixnum (+ code hash)))) - -(declaim (inline compute-index)) -(defun compute-index (hash vector) - "Computes and returns the index into the vector VECTOR corresponding -to the hash code HASH." - (declare #.*standard-optimize-settings*) - (1+ (mod hash (1- (length vector))))) - -(defun in-charset-p (char set) - "Checks whether the character CHAR is in the charset SET." - (declare #.*standard-optimize-settings*) - (declare (character char) (charset set)) - (let ((vector (charset-vector set)) - (depth (charset-depth set)) - (code (char-code char))) - (declare (fixnum depth)) - ;; as long as the set remains reasonably small, we use non-linear - ;; hashing - the first hash of any character is its CHAR-CODE, and - ;; subsequent hashes are computed by MIX above - (cond ((or - ;; depth 0 is special - each char maps only to its code, - ;; nothing else - (zerop depth) - ;; index 0 is special - only #\Null maps to it, no matter - ;; what the depth is - (zerop code)) - (eq char (char vector code))) - (t - ;; otherwise hash starts out as the character code, but - ;; maps to indexes 1-N - (let ((hash code)) - (tagbody - :retry - (let* ((index (compute-index hash vector)) - (x (char vector index))) - (cond ((eq x (code-char 0)) - ;; empty, no need to probe further - (return-from in-charset-p nil)) - ((eq x char) - ;; got it - (return-from in-charset-p t)) - ((zerop (decf depth)) - ;; max probe depth reached, nothing found - (return-from in-charset-p nil)) - (t - ;; nothing yet, try next place - (setf hash (mix code hash)) - (go :retry)))))))))) - -(defun add-to-charset (char set) - "Adds the character CHAR to the charset SET, extending SET if -necessary. Returns CHAR." - (declare #.*standard-optimize-settings*) - (or (%add-to-charset char set t) - (%add-to-charset/expand char set) - (error "Oops, this should not happen...")) - char) - -(defun %add-to-charset (char set count) - "Tries to add the character CHAR to the charset SET without -extending it. Returns NIL if this fails. Counts CHAR as new -if COUNT is true and it is added to SET." - (declare #.*standard-optimize-settings*) - (declare (character char) (charset set)) - (let ((vector (charset-vector set)) - (depth (charset-depth set)) - (code (char-code char))) - (declare (fixnum depth)) - ;; see comments in IN-CHARSET-P for algorithm - (cond ((or (zerop depth) (zerop code)) - (unless (eq char (char vector code)) - (setf (char vector code) char) - (when count - (incf (charset-count set)))) - char) - (t - (let ((hash code)) - (tagbody - :retry - (let* ((index (compute-index hash vector)) - (x (char vector index))) - (cond ((eq x (code-char 0)) - (setf (char vector index) char) - (when count - (incf (charset-count set))) - (return-from %add-to-charset char)) - ((eq x char) - (return-from %add-to-charset char)) - ((zerop (decf depth)) - ;; need to expand the table - (return-from %add-to-charset nil)) - (t - (setf hash (mix code hash)) - (go :retry)))))))))) - -(defun %add-to-charset/expand (char set) - "Extends the charset SET and then adds the character CHAR to it." - (declare #.*standard-optimize-settings*) - (declare (character char) (charset set)) - (let* ((old-vector (charset-vector set)) - (new-size (* 2 (length old-vector)))) - (tagbody - :retry - ;; when the table grows large (currently over 1/3 of - ;; CHAR-CODE-LIMIT), we dispense with hashing and just allocate a - ;; storage vector with space for all characters, so that each - ;; character always uses only the CHAR-CODE - (multiple-value-bind (new-depth new-vector) - (if (>= new-size #.(truncate char-code-limit 3)) - (values 0 (make-char-vector char-code-limit)) - (values +probe-depth+ (make-char-vector new-size))) - (setf (charset-depth set) new-depth - (charset-vector set) new-vector) - (flet ((try-add (x) - ;; don't count - old characters are already accounted - ;; for, and might count the new one multiple times as - ;; well - (unless (%add-to-charset x set nil) - (assert (not (zerop new-depth))) - (setf new-size (* 2 new-size)) - (go :retry)))) - (try-add char) - (dotimes (i (length old-vector)) - (let ((x (char old-vector i))) - (if (eq x (code-char 0)) - (when (zerop i) - (try-add x)) - (unless (zerop i) - (try-add x)))))))) - ;; added and expanded, /now/ count the new character. - (incf (charset-count set)) - t)) - -(defun map-charset (function charset) - "Calls FUNCTION with all characters in SET. Returns NIL." - (declare #.*standard-optimize-settings*) - (declare (function function)) - (let* ((n (charset-count charset)) - (vector (charset-vector charset)) - (size (length vector))) - ;; see comments in IN-CHARSET-P for algorithm - (when (eq (code-char 0) (char vector 0)) - (funcall function (code-char 0)) - (decf n)) - (loop for i from 1 below size - for char = (char vector i) - unless (eq (code-char 0) char) do - (funcall function char) - ;; this early termination test should be worth it when - ;; mapping across depth 0 charsets. - (when (zerop (decf n)) - (return-from map-charset nil)))) - nil) - -(defun create-charset-from-test-function (test-function start end) - "Creates and returns a charset representing all characters with -character codes between START and END which satisfy TEST-FUNCTION." - (declare #.*standard-optimize-settings*) - (loop with charset = (make-charset) - for code from start below end - for char = (code-char code) - when (and char (funcall test-function char)) - do (add-to-charset char charset) - finally (return charset))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/chartest.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/chartest.lisp deleted file mode 100644 index b302c1f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/chartest.lisp +++ /dev/null @@ -1,98 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/chartest.lisp,v 1.5 2009/09/17 19:17:30 edi Exp $ - -;;; Copyright (c) 2008-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre) - -(defun create-hash-table-from-test-function (test-function start end) - "Creates and returns a hash table representing all characters with -character codes between START and END which satisfy TEST-FUNCTION." - (declare #.*standard-optimize-settings*) - (loop with hash-table = (make-hash-table) - for code from start below end - for char = (code-char code) - when (and char (funcall test-function char)) - do (setf (gethash char hash-table) t) - finally (return hash-table))) - -(defun create-optimized-test-function (test-function &key - (start 0) - (end *regex-char-code-limit*) - (kind *optimize-char-classes*)) - "Given a unary test function which is applicable to characters -returns a function which yields the same boolean results for all -characters with character codes from START to \(excluding) END. If -KIND is NIL, TEST-FUNCTION will simply be returned. Otherwise, KIND -should be one of: - -* :HASH-TABLE - builds a hash table representing all characters which - satisfy the test and returns a closure which checks if - a character is in that hash table - -* :CHARSET - instead of a hash table uses a \"charset\" which is a - data structure using non-linear hashing and optimized to - represent \(sparse) sets of characters in a fast and - space-efficient way \(contributed by Nikodemus Siivola) - -* :CHARMAP - instead of a hash table uses a bit vector to represent - the set of characters - -You can also use :HASH-TABLE* or :CHARSET* which are like :HASH-TABLE -and :CHARSET but use the complement of the set if the set contains -more than half of all characters between START and END. This saves -space but needs an additional pass across all characters to create the -data structure. There is no corresponding :CHARMAP* kind as the bit -vectors are already created to cover the smallest possible interval -which contains either the set or its complement." - (declare #.*standard-optimize-settings*) - (ecase kind - ((nil) test-function) - (:charmap - (let ((charmap (create-charmap-from-test-function test-function start end))) - (lambda (char) - (in-charmap-p char charmap)))) - ((:charset :charset*) - (let ((charset (create-charset-from-test-function test-function start end))) - (cond ((or (eq kind :charset) - (<= (charset-count charset) (ceiling (- end start) 2))) - (lambda (char) - (in-charset-p char charset))) - (t (setq charset (create-charset-from-test-function (complement* test-function) - start end)) - (lambda (char) - (not (in-charset-p char charset))))))) - ((:hash-table :hash-table*) - (let ((hash-table (create-hash-table-from-test-function test-function start end))) - (cond ((or (eq kind :hash-table) - (<= (hash-table-count hash-table) (ceiling (- end start) 2))) - (lambda (char) - (gethash char hash-table))) - (t (setq hash-table (create-hash-table-from-test-function (complement* test-function) - start end)) - (lambda (char) - (not (gethash char hash-table))))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre-unicode.asd b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre-unicode.asd deleted file mode 100644 index 19fb827..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre-unicode.asd +++ /dev/null @@ -1,64 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre-unicode.asd,v 1.15 2009/09/17 19:17:30 edi Exp $ - -;;; This ASDF system definition was kindly provided by Marco Baringer. - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-user) - -(defpackage :cl-ppcre-unicode-asd - (:use :cl :asdf)) - -(in-package :cl-ppcre-unicode-asd) - -(defsystem :cl-ppcre-unicode - :description "Perl-compatible regular expression library (Unicode)" - :author "Dr. Edi Weitz" - :license "BSD" - :components ((:module "cl-ppcre-unicode" - :serial t - :components ((:file "packages") - (:file "resolver")))) - :depends-on (:cl-ppcre :cl-unicode)) - -(defsystem :cl-ppcre-unicode-test - :description "Perl-compatible regular expression library tests (Unicode)" - :author "Dr. Edi Weitz" - :license "BSD" - :depends-on (:cl-ppcre-unicode :cl-ppcre-test) - :components ((:module "test" - :serial t - :components ((:file "unicode-tests"))))) - -(defmethod perform ((o test-op) (c (eql (find-system :cl-ppcre-unicode)))) - ;; we must load CL-PPCRE explicitly so that the CL-PPCRE-TEST system - ;; will be found - (operate 'load-op :cl-ppcre) - (operate 'load-op :cl-ppcre-unicode-test) - (funcall (intern (symbol-name :run-all-tests) (find-package :cl-ppcre-test)) - :more-tests (intern (symbol-name :unicode-test) (find-package :cl-ppcre-test)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre-unicode/packages.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre-unicode/packages.lisp deleted file mode 100644 index 6c9bb7b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre-unicode/packages.lisp +++ /dev/null @@ -1,38 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre-unicode/packages.lisp,v 1.3 2009/09/17 19:17:34 edi Exp $ - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-user) - -(defpackage :cl-ppcre-unicode - #+:genera - (:shadowing-import-from :common-lisp :lambda :string) - (:use #-:genera :cl #+:genera :future-common-lisp - :cl-ppcre :cl-unicode) - (:import-from :cl-ppcre :signal-syntax-error) - (:export :unicode-property-resolver)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre-unicode/resolver.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre-unicode/resolver.lisp deleted file mode 100644 index 5c73628..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre-unicode/resolver.lisp +++ /dev/null @@ -1,61 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre-unicode/resolver.lisp,v 1.5 2008/07/23 02:14:08 edi Exp $ - -;;; Copyright (c) 2008, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre-unicode) - -(defun unicode-property-resolver (property-name) - "A property resolver which understands Unicode properties using -CL-UNICODE's PROPERTY-TEST function. This resolver is automatically -installed in *PROPERTY-RESOLVER* when the CL-PPCRE-UNICODE system is -loaded." - (or (property-test property-name :errorp nil) - (signal-syntax-error "There is no property named ~S." property-name))) - -(setq *property-resolver* 'unicode-property-resolver) - -(pushnew :cl-ppcre-unicode *features*) - -;; stuff for Nikodemus Siivola's HYPERDOC -;; see -;; and -;; also used by LW-ADD-ONS - -(defvar *hyperdoc-base-uri* "http://weitz.de/cl-ppcre/") - -(let ((exported-symbols-alist - (loop for symbol being the external-symbols of :cl-ppcre-unicode - collect (cons symbol - (concatenate 'string - "#" - (string-downcase symbol)))))) - (defun hyperdoc-lookup (symbol type) - (declare (ignore type)) - (cdr (assoc symbol - exported-symbols-alist - :test #'eq)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre.asd b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre.asd deleted file mode 100644 index 433ad49..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/cl-ppcre.asd +++ /dev/null @@ -1,85 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre.asd,v 1.49 2009/10/28 07:36:15 edi Exp $ - -;;; This ASDF system definition was kindly provided by Marco Baringer. - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-user) - -(defpackage :cl-ppcre-asd - (:use :cl :asdf)) - -(in-package :cl-ppcre-asd) - -(defsystem :cl-ppcre - :version "2.1.1" - :description "Perl-compatible regular expression library" - :author "Dr. Edi Weitz" - :license "BSD" - :serial t - :components ((:file "packages") - (:file "specials") - (:file "util") - (:file "errors") - (:file "charset") - (:file "charmap") - (:file "chartest") - #-:use-acl-regexp2-engine - (:file "lexer") - #-:use-acl-regexp2-engine - (:file "parser") - #-:use-acl-regexp2-engine - (:file "regex-class") - #-:use-acl-regexp2-engine - (:file "regex-class-util") - #-:use-acl-regexp2-engine - (:file "convert") - #-:use-acl-regexp2-engine - (:file "optimize") - #-:use-acl-regexp2-engine - (:file "closures") - #-:use-acl-regexp2-engine - (:file "repetition-closures") - #-:use-acl-regexp2-engine - (:file "scanner") - (:file "api"))) - -(defsystem :cl-ppcre-test - :description "Perl-compatible regular expression library tests" - :author "Dr. Edi Weitz" - :license "BSD" - :depends-on (:cl-ppcre :flexi-streams) - :components ((:module "test" - :serial t - :components ((:file "packages") - (:file "tests") - (:file "perl-tests"))))) - -(defmethod perform ((o test-op) (c (eql (find-system :cl-ppcre)))) - (operate 'load-op :cl-ppcre-test) - (funcall (intern (symbol-name :run-all-tests) (find-package :cl-ppcre-test)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/closures.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/closures.lisp deleted file mode 100644 index a275078..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/closures.lisp +++ /dev/null @@ -1,471 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/closures.lisp,v 1.45 2009/09/17 19:17:30 edi Exp $ - -;;; Here we create the closures which together build the final -;;; scanner. - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre) - -(declaim (inline *string*= *string*-equal)) -(defun *string*= (string2 start1 end1 start2 end2) - "Like STRING=, i.e. compares the special string *STRING* from START1 -to END1 with STRING2 from START2 to END2. Note that there's no -boundary check - this has to be implemented by the caller." - (declare #.*standard-optimize-settings*) - (declare (fixnum start1 end1 start2 end2)) - (loop for string1-idx of-type fixnum from start1 below end1 - for string2-idx of-type fixnum from start2 below end2 - always (char= (schar *string* string1-idx) - (schar string2 string2-idx)))) - -(defun *string*-equal (string2 start1 end1 start2 end2) - "Like STRING-EQUAL, i.e. compares the special string *STRING* from -START1 to END1 with STRING2 from START2 to END2. Note that there's no -boundary check - this has to be implemented by the caller." - (declare #.*standard-optimize-settings*) - (declare (fixnum start1 end1 start2 end2)) - (loop for string1-idx of-type fixnum from start1 below end1 - for string2-idx of-type fixnum from start2 below end2 - always (char-equal (schar *string* string1-idx) - (schar string2 string2-idx)))) - -(defgeneric create-matcher-aux (regex next-fn) - (declare #.*standard-optimize-settings*) - (:documentation "Creates a closure which takes one parameter, -START-POS, and tests whether REGEX can match *STRING* at START-POS -such that the call to NEXT-FN after the match would succeed.")) - -(defmethod create-matcher-aux ((seq seq) next-fn) - (declare #.*standard-optimize-settings*) - ;; the closure for a SEQ is a chain of closures for the elements of - ;; this sequence which call each other in turn; the last closure - ;; calls NEXT-FN - (loop for element in (reverse (elements seq)) - for curr-matcher = next-fn then next-matcher - for next-matcher = (create-matcher-aux element curr-matcher) - finally (return next-matcher))) - -(defmethod create-matcher-aux ((alternation alternation) next-fn) - (declare #.*standard-optimize-settings*) - ;; first create closures for all alternations of ALTERNATION - (let ((all-matchers (mapcar #'(lambda (choice) - (create-matcher-aux choice next-fn)) - (choices alternation)))) - ;; now create a closure which checks if one of the closures - ;; created above can succeed - (lambda (start-pos) - (declare (fixnum start-pos)) - (loop for matcher in all-matchers - thereis (funcall (the function matcher) start-pos))))) - -(defmethod create-matcher-aux ((register register) next-fn) - (declare #.*standard-optimize-settings*) - ;; the position of this REGISTER within the whole regex; we start to - ;; count at 0 - (let ((num (num register))) - (declare (fixnum num)) - ;; STORE-END-OF-REG is a thin wrapper around NEXT-FN which will - ;; update the corresponding values of *REGS-START* and *REGS-END* - ;; after the inner matcher has succeeded - (flet ((store-end-of-reg (start-pos) - (declare (fixnum start-pos) - (function next-fn)) - (setf (svref *reg-starts* num) (svref *regs-maybe-start* num) - (svref *reg-ends* num) start-pos) - (funcall next-fn start-pos))) - ;; the inner matcher is a closure corresponding to the regex - ;; wrapped by this REGISTER - (let ((inner-matcher (create-matcher-aux (regex register) - #'store-end-of-reg))) - (declare (function inner-matcher)) - ;; here comes the actual closure for REGISTER - (lambda (start-pos) - (declare (fixnum start-pos)) - ;; remember the old values of *REGS-START* and friends in - ;; case we cannot match - (let ((old-*reg-starts* (svref *reg-starts* num)) - (old-*regs-maybe-start* (svref *regs-maybe-start* num)) - (old-*reg-ends* (svref *reg-ends* num))) - ;; we cannot use *REGS-START* here because Perl allows - ;; regular expressions like /(a|\1x)*/ - (setf (svref *regs-maybe-start* num) start-pos) - (let ((next-pos (funcall inner-matcher start-pos))) - (unless next-pos - ;; restore old values on failure - (setf (svref *reg-starts* num) old-*reg-starts* - (svref *regs-maybe-start* num) old-*regs-maybe-start* - (svref *reg-ends* num) old-*reg-ends*)) - next-pos))))))) - -(defmethod create-matcher-aux ((lookahead lookahead) next-fn) - (declare #.*standard-optimize-settings*) - ;; create a closure which just checks for the inner regex and - ;; doesn't care about NEXT-FN - (let ((test-matcher (create-matcher-aux (regex lookahead) #'identity))) - (declare (function next-fn test-matcher)) - (if (positivep lookahead) - ;; positive look-ahead: check success of inner regex, then call - ;; NEXT-FN - (lambda (start-pos) - (and (funcall test-matcher start-pos) - (funcall next-fn start-pos))) - ;; negative look-ahead: check failure of inner regex, then call - ;; NEXT-FN - (lambda (start-pos) - (and (not (funcall test-matcher start-pos)) - (funcall next-fn start-pos)))))) - -(defmethod create-matcher-aux ((lookbehind lookbehind) next-fn) - (declare #.*standard-optimize-settings*) - (let ((len (len lookbehind)) - ;; create a closure which just checks for the inner regex and - ;; doesn't care about NEXT-FN - (test-matcher (create-matcher-aux (regex lookbehind) #'identity))) - (declare (function next-fn test-matcher) - (fixnum len)) - (if (positivep lookbehind) - ;; positive look-behind: check success of inner regex (if we're - ;; far enough from the start of *STRING*), then call NEXT-FN - (lambda (start-pos) - (declare (fixnum start-pos)) - (and (>= (- start-pos (or *real-start-pos* *start-pos*)) len) - (funcall test-matcher (- start-pos len)) - (funcall next-fn start-pos))) - ;; negative look-behind: check failure of inner regex (if we're - ;; far enough from the start of *STRING*), then call NEXT-FN - (lambda (start-pos) - (declare (fixnum start-pos)) - (and (or (< (- start-pos (or *real-start-pos* *start-pos*)) len) - (not (funcall test-matcher (- start-pos len)))) - (funcall next-fn start-pos)))))) - -(defmacro insert-char-class-tester ((char-class chr-expr) &body body) - "Utility macro to replace each occurence of '\(CHAR-CLASS-TEST) -within BODY with the correct test (corresponding to CHAR-CLASS) -against CHR-EXPR." - (with-rebinding (char-class) - (with-unique-names (test-function) - (flet ((substitute-char-class-tester (new) - (subst new '(char-class-test) body - :test #'equalp))) - `(let ((,test-function (test-function ,char-class))) - ,@(substitute-char-class-tester - `(funcall ,test-function ,chr-expr))))))) - -(defmethod create-matcher-aux ((char-class char-class) next-fn) - (declare #.*standard-optimize-settings*) - (declare (function next-fn)) - ;; insert a test against the current character within *STRING* - (insert-char-class-tester (char-class (schar *string* start-pos)) - (lambda (start-pos) - (declare (fixnum start-pos)) - (and (< start-pos *end-pos*) - (char-class-test) - (funcall next-fn (1+ start-pos)))))) - -(defmethod create-matcher-aux ((str str) next-fn) - (declare #.*standard-optimize-settings*) - (declare (fixnum *end-string-pos*) - (function next-fn) - ;; this special value is set by CREATE-SCANNER when the - ;; closures are built - (special end-string)) - (let* ((len (len str)) - (case-insensitive-p (case-insensitive-p str)) - (start-of-end-string-p (start-of-end-string-p str)) - (skip (skip str)) - (str (str str)) - (chr (schar str 0)) - (end-string (and end-string (str end-string))) - (end-string-len (if end-string - (length end-string) - nil))) - (declare (fixnum len)) - (cond ((and start-of-end-string-p case-insensitive-p) - ;; closure for the first STR which belongs to the constant - ;; string at the end of the regular expression; - ;; case-insensitive version - (lambda (start-pos) - (declare (fixnum start-pos end-string-len)) - (let ((test-end-pos (+ start-pos end-string-len))) - (declare (fixnum test-end-pos)) - ;; either we're at *END-STRING-POS* (which means that - ;; it has already been confirmed that end-string - ;; starts here) or we really have to test - (and (or (= start-pos *end-string-pos*) - (and (<= test-end-pos *end-pos*) - (*string*-equal end-string start-pos test-end-pos - 0 end-string-len))) - (funcall next-fn (+ start-pos len)))))) - (start-of-end-string-p - ;; closure for the first STR which belongs to the constant - ;; string at the end of the regular expression; - ;; case-sensitive version - (lambda (start-pos) - (declare (fixnum start-pos end-string-len)) - (let ((test-end-pos (+ start-pos end-string-len))) - (declare (fixnum test-end-pos)) - ;; either we're at *END-STRING-POS* (which means that - ;; it has already been confirmed that end-string - ;; starts here) or we really have to test - (and (or (= start-pos *end-string-pos*) - (and (<= test-end-pos *end-pos*) - (*string*= end-string start-pos test-end-pos - 0 end-string-len))) - (funcall next-fn (+ start-pos len)))))) - (skip - ;; a STR which can be skipped because some other function - ;; has already confirmed that it matches - (lambda (start-pos) - (declare (fixnum start-pos)) - (funcall next-fn (+ start-pos len)))) - ((and (= len 1) case-insensitive-p) - ;; STR represent exactly one character; case-insensitive - ;; version - (lambda (start-pos) - (declare (fixnum start-pos)) - (and (< start-pos *end-pos*) - (char-equal (schar *string* start-pos) chr) - (funcall next-fn (1+ start-pos))))) - ((= len 1) - ;; STR represent exactly one character; case-sensitive - ;; version - (lambda (start-pos) - (declare (fixnum start-pos)) - (and (< start-pos *end-pos*) - (char= (schar *string* start-pos) chr) - (funcall next-fn (1+ start-pos))))) - (case-insensitive-p - ;; general case, case-insensitive version - (lambda (start-pos) - (declare (fixnum start-pos)) - (let ((next-pos (+ start-pos len))) - (declare (fixnum next-pos)) - (and (<= next-pos *end-pos*) - (*string*-equal str start-pos next-pos 0 len) - (funcall next-fn next-pos))))) - (t - ;; general case, case-sensitive version - (lambda (start-pos) - (declare (fixnum start-pos)) - (let ((next-pos (+ start-pos len))) - (declare (fixnum next-pos)) - (and (<= next-pos *end-pos*) - (*string*= str start-pos next-pos 0 len) - (funcall next-fn next-pos)))))))) - -(declaim (inline word-boundary-p)) -(defun word-boundary-p (start-pos) - "Check whether START-POS is a word-boundary within *STRING*." - (declare #.*standard-optimize-settings*) - (declare (fixnum start-pos)) - (let ((1-start-pos (1- start-pos)) - (*start-pos* (or *real-start-pos* *start-pos*))) - ;; either the character before START-POS is a word-constituent and - ;; the character at START-POS isn't... - (or (and (or (= start-pos *end-pos*) - (and (< start-pos *end-pos*) - (not (word-char-p (schar *string* start-pos))))) - (and (< 1-start-pos *end-pos*) - (<= *start-pos* 1-start-pos) - (word-char-p (schar *string* 1-start-pos)))) - ;; ...or vice versa - (and (or (= start-pos *start-pos*) - (and (< 1-start-pos *end-pos*) - (<= *start-pos* 1-start-pos) - (not (word-char-p (schar *string* 1-start-pos))))) - (and (< start-pos *end-pos*) - (word-char-p (schar *string* start-pos))))))) - -(defmethod create-matcher-aux ((word-boundary word-boundary) next-fn) - (declare #.*standard-optimize-settings*) - (declare (function next-fn)) - (if (negatedp word-boundary) - (lambda (start-pos) - (and (not (word-boundary-p start-pos)) - (funcall next-fn start-pos))) - (lambda (start-pos) - (and (word-boundary-p start-pos) - (funcall next-fn start-pos))))) - -(defmethod create-matcher-aux ((everything everything) next-fn) - (declare #.*standard-optimize-settings*) - (declare (function next-fn)) - (if (single-line-p everything) - ;; closure for single-line-mode: we really match everything, so we - ;; just advance the index into *STRING* by one and carry on - (lambda (start-pos) - (declare (fixnum start-pos)) - (and (< start-pos *end-pos*) - (funcall next-fn (1+ start-pos)))) - ;; not single-line-mode, so we have to make sure we don't match - ;; #\Newline - (lambda (start-pos) - (declare (fixnum start-pos)) - (and (< start-pos *end-pos*) - (char/= (schar *string* start-pos) #\Newline) - (funcall next-fn (1+ start-pos)))))) - -(defmethod create-matcher-aux ((anchor anchor) next-fn) - (declare #.*standard-optimize-settings*) - (declare (function next-fn)) - (let ((startp (startp anchor)) - (multi-line-p (multi-line-p anchor))) - (cond ((no-newline-p anchor) - ;; this must be an end-anchor and it must be modeless, so - ;; we just have to check whether START-POS equals - ;; *END-POS* - (lambda (start-pos) - (declare (fixnum start-pos)) - (and (= start-pos *end-pos*) - (funcall next-fn start-pos)))) - ((and startp multi-line-p) - ;; a start-anchor in multi-line-mode: check if we're at - ;; *START-POS* or if the last character was #\Newline - (lambda (start-pos) - (declare (fixnum start-pos)) - (let ((*start-pos* (or *real-start-pos* *start-pos*))) - (and (or (= start-pos *start-pos*) - (and (<= start-pos *end-pos*) - (> start-pos *start-pos*) - (char= #\Newline - (schar *string* (1- start-pos))))) - (funcall next-fn start-pos))))) - (startp - ;; a start-anchor which is not in multi-line-mode, so just - ;; check whether we're at *START-POS* - (lambda (start-pos) - (declare (fixnum start-pos)) - (and (= start-pos (or *real-start-pos* *start-pos*)) - (funcall next-fn start-pos)))) - (multi-line-p - ;; an end-anchor in multi-line-mode: check if we're at - ;; *END-POS* or if the character we're looking at is - ;; #\Newline - (lambda (start-pos) - (declare (fixnum start-pos)) - (and (or (= start-pos *end-pos*) - (and (< start-pos *end-pos*) - (char= #\Newline - (schar *string* start-pos)))) - (funcall next-fn start-pos)))) - (t - ;; an end-anchor which is not in multi-line-mode, so just - ;; check if we're at *END-POS* or if we're looking at - ;; #\Newline and there's nothing behind it - (lambda (start-pos) - (declare (fixnum start-pos)) - (and (or (= start-pos *end-pos*) - (and (= start-pos (1- *end-pos*)) - (char= #\Newline - (schar *string* start-pos)))) - (funcall next-fn start-pos))))))) - -(defmethod create-matcher-aux ((back-reference back-reference) next-fn) - (declare #.*standard-optimize-settings*) - (declare (function next-fn)) - ;; the position of the corresponding REGISTER within the whole - ;; regex; we start to count at 0 - (let ((num (num back-reference))) - (if (case-insensitive-p back-reference) - ;; the case-insensitive version - (lambda (start-pos) - (declare (fixnum start-pos)) - (let ((reg-start (svref *reg-starts* num)) - (reg-end (svref *reg-ends* num))) - ;; only bother to check if the corresponding REGISTER as - ;; matched successfully already - (and reg-start - (let ((next-pos (+ start-pos (- (the fixnum reg-end) - (the fixnum reg-start))))) - (declare (fixnum next-pos)) - (and - (<= next-pos *end-pos*) - (*string*-equal *string* start-pos next-pos - reg-start reg-end) - (funcall next-fn next-pos)))))) - ;; the case-sensitive version - (lambda (start-pos) - (declare (fixnum start-pos)) - (let ((reg-start (svref *reg-starts* num)) - (reg-end (svref *reg-ends* num))) - ;; only bother to check if the corresponding REGISTER as - ;; matched successfully already - (and reg-start - (let ((next-pos (+ start-pos (- (the fixnum reg-end) - (the fixnum reg-start))))) - (declare (fixnum next-pos)) - (and - (<= next-pos *end-pos*) - (*string*= *string* start-pos next-pos - reg-start reg-end) - (funcall next-fn next-pos))))))))) - -(defmethod create-matcher-aux ((branch branch) next-fn) - (declare #.*standard-optimize-settings*) - (let* ((test (test branch)) - (then-matcher (create-matcher-aux (then-regex branch) next-fn)) - (else-matcher (create-matcher-aux (else-regex branch) next-fn))) - (declare (function then-matcher else-matcher)) - (cond ((numberp test) - (lambda (start-pos) - (declare (fixnum test)) - (if (and (< test (length *reg-starts*)) - (svref *reg-starts* test)) - (funcall then-matcher start-pos) - (funcall else-matcher start-pos)))) - (t - (let ((test-matcher (create-matcher-aux test #'identity))) - (declare (function test-matcher)) - (lambda (start-pos) - (if (funcall test-matcher start-pos) - (funcall then-matcher start-pos) - (funcall else-matcher start-pos)))))))) - -(defmethod create-matcher-aux ((standalone standalone) next-fn) - (declare #.*standard-optimize-settings*) - (let ((inner-matcher (create-matcher-aux (regex standalone) #'identity))) - (declare (function next-fn inner-matcher)) - (lambda (start-pos) - (let ((next-pos (funcall inner-matcher start-pos))) - (and next-pos - (funcall next-fn next-pos)))))) - -(defmethod create-matcher-aux ((filter filter) next-fn) - (declare #.*standard-optimize-settings*) - (let ((fn (fn filter))) - (lambda (start-pos) - (let ((next-pos (funcall fn start-pos))) - (and next-pos - (funcall next-fn next-pos)))))) - -(defmethod create-matcher-aux ((void void) next-fn) - (declare #.*standard-optimize-settings*) - ;; optimize away VOIDs: don't create a closure, just return NEXT-FN - next-fn) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/convert.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/convert.lisp deleted file mode 100644 index c2683ae..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/convert.lisp +++ /dev/null @@ -1,879 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/convert.lisp,v 1.57 2009/09/17 19:17:31 edi Exp $ - -;;; Here the parse tree is converted into its internal representation -;;; using REGEX objects. At the same time some optimizations are -;;; already applied. - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre) - -;;; The flags that represent the "ism" modifiers are always kept -;;; together in a three-element list. We use the following macros to -;;; access individual elements. - -(defmacro case-insensitive-mode-p (flags) - "Accessor macro to extract the first flag out of a three-element flag list." - `(first ,flags)) - -(defmacro multi-line-mode-p (flags) - "Accessor macro to extract the second flag out of a three-element flag list." - `(second ,flags)) - -(defmacro single-line-mode-p (flags) - "Accessor macro to extract the third flag out of a three-element flag list." - `(third ,flags)) - -(defun set-flag (token) - "Reads a flag token and sets or unsets the corresponding entry in -the special FLAGS list." - (declare #.*standard-optimize-settings*) - (declare (special flags)) - (case token - ((:case-insensitive-p) - (setf (case-insensitive-mode-p flags) t)) - ((:case-sensitive-p) - (setf (case-insensitive-mode-p flags) nil)) - ((:multi-line-mode-p) - (setf (multi-line-mode-p flags) t)) - ((:not-multi-line-mode-p) - (setf (multi-line-mode-p flags) nil)) - ((:single-line-mode-p) - (setf (single-line-mode-p flags) t)) - ((:not-single-line-mode-p) - (setf (single-line-mode-p flags) nil)) - (otherwise - (signal-syntax-error "Unknown flag token ~A." token)))) - -(defgeneric resolve-property (property) - (:documentation "Resolves PROPERTY to a unary character test -function. PROPERTY can either be a function designator or it can be a -string which is resolved using *PROPERTY-RESOLVER*.") - (:method ((property-name string)) - (funcall *property-resolver* property-name)) - (:method ((function-name symbol)) - function-name) - (:method ((test-function function)) - test-function)) - -(defun convert-char-class-to-test-function (list invertedp case-insensitive-p) - "Combines all items in LIST into test function and returns a -logical-OR combination of these functions. Items can be single -characters, character ranges like \(:RANGE #\\A #\\E), or special -character classes like :DIGIT-CLASS. Does the right thing with -respect to case-\(in)sensitivity as specified by the special variable -FLAGS." - (declare #.*standard-optimize-settings*) - (declare (special flags)) - (let ((test-functions - (loop for item in list - collect (cond ((characterp item) - ;; rebind so closure captures the right one - (let ((this-char item)) - (lambda (char) - (declare (character char this-char)) - (char= char this-char)))) - ((symbolp item) - (case item - ((:digit-class) #'digit-char-p) - ((:non-digit-class) (complement* #'digit-char-p)) - ((:whitespace-char-class) #'whitespacep) - ((:non-whitespace-char-class) (complement* #'whitespacep)) - ((:word-char-class) #'word-char-p) - ((:non-word-char-class) (complement* #'word-char-p)) - (otherwise - (signal-syntax-error "Unknown symbol ~A in character class." item)))) - ((and (consp item) - (eq (first item) :property)) - (resolve-property (second item))) - ((and (consp item) - (eq (first item) :inverted-property)) - (complement* (resolve-property (second item)))) - ((and (consp item) - (eq (first item) :range)) - (let ((from (second item)) - (to (third item))) - (when (char> from to) - (signal-syntax-error "Invalid range from ~S to ~S in char-class." from to)) - (lambda (char) - (declare (character char from to)) - (char<= from char to)))) - (t (signal-syntax-error "Unknown item ~A in char-class list." item)))))) - (unless test-functions - (signal-syntax-error "Empty character class.")) - (cond ((cdr test-functions) - (cond ((and invertedp case-insensitive-p) - (lambda (char) - (declare (character char)) - (loop with both-case-p = (both-case-p char) - with char-down = (if both-case-p (char-downcase char) char) - with char-up = (if both-case-p (char-upcase char) nil) - for test-function in test-functions - never (or (funcall test-function char-down) - (and char-up (funcall test-function char-up)))))) - (case-insensitive-p - (lambda (char) - (declare (character char)) - (loop with both-case-p = (both-case-p char) - with char-down = (if both-case-p (char-downcase char) char) - with char-up = (if both-case-p (char-upcase char) nil) - for test-function in test-functions - thereis (or (funcall test-function char-down) - (and char-up (funcall test-function char-up)))))) - (invertedp - (lambda (char) - (loop for test-function in test-functions - never (funcall test-function char)))) - (t - (lambda (char) - (loop for test-function in test-functions - thereis (funcall test-function char)))))) - ;; there's only one test-function - (t (let ((test-function (first test-functions))) - (cond ((and invertedp case-insensitive-p) - (lambda (char) - (declare (character char)) - (not (or (funcall test-function (char-downcase char)) - (and (both-case-p char) - (funcall test-function (char-upcase char))))))) - (case-insensitive-p - (lambda (char) - (declare (character char)) - (or (funcall test-function (char-downcase char)) - (and (both-case-p char) - (funcall test-function (char-upcase char)))))) - (invertedp (complement* test-function)) - (t test-function))))))) - -(defun maybe-split-repetition (regex - greedyp - minimum - maximum - min-len - length - reg-seen) - "Splits a REPETITION object into a constant and a varying part if -applicable, i.e. something like - a{3,} -> a{3}a* -The arguments to this function correspond to the REPETITION slots of -the same name." - (declare #.*standard-optimize-settings*) - (declare (fixnum minimum) - (type (or fixnum null) maximum)) - ;; note the usage of COPY-REGEX here; we can't use the same REGEX - ;; object in both REPETITIONS because they will have different - ;; offsets - (when maximum - (when (zerop maximum) - ;; trivial case: don't repeat at all - (return-from maybe-split-repetition - (make-instance 'void))) - (when (= 1 minimum maximum) - ;; another trivial case: "repeat" exactly once - (return-from maybe-split-repetition - regex))) - ;; first set up the constant part of the repetition - ;; maybe that's all we need - (let ((constant-repetition (if (plusp minimum) - (make-instance 'repetition - :regex (copy-regex regex) - :greedyp greedyp - :minimum minimum - :maximum minimum - :min-len min-len - :len length - :contains-register-p reg-seen) - ;; don't create garbage if minimum is 0 - nil))) - (when (and maximum - (= maximum minimum)) - (return-from maybe-split-repetition - ;; no varying part needed because min = max - constant-repetition)) - ;; now construct the varying part - (let ((varying-repetition - (make-instance 'repetition - :regex regex - :greedyp greedyp - :minimum 0 - :maximum (if maximum (- maximum minimum) nil) - :min-len min-len - :len length - :contains-register-p reg-seen))) - (cond ((zerop minimum) - ;; min = 0, no constant part needed - varying-repetition) - ((= 1 minimum) - ;; min = 1, constant part needs no REPETITION wrapped around - (make-instance 'seq - :elements (list (copy-regex regex) - varying-repetition))) - (t - ;; general case - (make-instance 'seq - :elements (list constant-repetition - varying-repetition))))))) - -;; During the conversion of the parse tree we keep track of the start -;; of the parse tree in the special variable STARTS-WITH which'll -;; either hold a STR object or an EVERYTHING object. The latter is the -;; case if the regex starts with ".*" which implicitly anchors the -;; regex at the start (perhaps modulo #\Newline). - -(defun maybe-accumulate (str) - "Accumulate STR into the special variable STARTS-WITH if -ACCUMULATE-START-P (also special) is true and STARTS-WITH is either -NIL or a STR object of the same case mode. Always returns NIL." - (declare #.*standard-optimize-settings*) - (declare (special accumulate-start-p starts-with)) - (declare (ftype (function (t) fixnum) len)) - (when accumulate-start-p - (etypecase starts-with - (str - ;; STARTS-WITH already holds a STR, so we check if we can - ;; concatenate - (cond ((eq (case-insensitive-p starts-with) - (case-insensitive-p str)) - ;; we modify STARTS-WITH in place - (setf (len starts-with) - (+ (len starts-with) (len str))) - ;; note that we use SLOT-VALUE because the accessor - ;; STR has a declared FTYPE which doesn't fit here - (adjust-array (slot-value starts-with 'str) - (len starts-with) - :fill-pointer t) - (setf (subseq (slot-value starts-with 'str) - (- (len starts-with) (len str))) - (str str) - ;; STR objects that are parts of STARTS-WITH - ;; always have their SKIP slot set to true - ;; because the SCAN function will take care of - ;; them, i.e. the matcher can ignore them - (skip str) t)) - (t (setq accumulate-start-p nil)))) - (null - ;; STARTS-WITH is still empty, so we create a new STR object - (setf starts-with - (make-instance 'str - :str "" - :case-insensitive-p (case-insensitive-p str)) - ;; INITIALIZE-INSTANCE will coerce the STR to a simple - ;; string, so we have to fill it afterwards - (slot-value starts-with 'str) - (make-array (len str) - :initial-contents (str str) - :element-type 'character - :fill-pointer t - :adjustable t) - (len starts-with) - (len str) - ;; see remark about SKIP above - (skip str) t)) - (everything - ;; STARTS-WITH already holds an EVERYTHING object - we can't - ;; concatenate - (setq accumulate-start-p nil)))) - nil) - -(declaim (inline convert-aux)) -(defun convert-aux (parse-tree) - "Converts the parse tree PARSE-TREE into a REGEX object and returns -it. Will also - - - split and optimize repetitions, - - accumulate strings or EVERYTHING objects into the special variable - STARTS-WITH, - - keep track of all registers seen in the special variable REG-NUM, - - keep track of all named registers seen in the special variable REG-NAMES - - keep track of the highest backreference seen in the special - variable MAX-BACK-REF, - - maintain and adher to the currently applicable modifiers in the special - variable FLAGS, and - - maybe even wash your car..." - (declare #.*standard-optimize-settings*) - (if (consp parse-tree) - (convert-compound-parse-tree (first parse-tree) parse-tree) - (convert-simple-parse-tree parse-tree))) - -(defgeneric convert-compound-parse-tree (token parse-tree &key) - (declare #.*standard-optimize-settings*) - (:documentation "Helper function for CONVERT-AUX which converts -parse trees which are conses and dispatches on TOKEN which is the -first element of the parse tree.") - (:method ((token t) (parse-tree t) &key) - (signal-syntax-error "Unknown token ~A in parse-tree." token))) - -(defmethod convert-compound-parse-tree ((token (eql :sequence)) parse-tree &key) - "The case for parse trees like \(:SEQUENCE {}*)." - (declare #.*standard-optimize-settings*) - (cond ((cddr parse-tree) - ;; this is essentially like - ;; (MAPCAR 'CONVERT-AUX (REST PARSE-TREE)) - ;; but we don't cons a new list - (loop for parse-tree-rest on (rest parse-tree) - while parse-tree-rest - do (setf (car parse-tree-rest) - (convert-aux (car parse-tree-rest)))) - (make-instance 'seq :elements (rest parse-tree))) - (t (convert-aux (second parse-tree))))) - -(defmethod convert-compound-parse-tree ((token (eql :group)) parse-tree &key) - "The case for parse trees like \(:GROUP {}*). - -This is a syntactical construct equivalent to :SEQUENCE intended to -keep the effect of modifiers local." - (declare #.*standard-optimize-settings*) - (declare (special flags)) - ;; make a local copy of FLAGS and shadow the global value while we - ;; descend into the enclosed regexes - (let ((flags (copy-list flags))) - (declare (special flags)) - (cond ((cddr parse-tree) - (loop for parse-tree-rest on (rest parse-tree) - while parse-tree-rest - do (setf (car parse-tree-rest) - (convert-aux (car parse-tree-rest)))) - (make-instance 'seq :elements (rest parse-tree))) - (t (convert-aux (second parse-tree)))))) - -(defmethod convert-compound-parse-tree ((token (eql :alternation)) parse-tree &key) - "The case for \(:ALTERNATION {}*)." - (declare #.*standard-optimize-settings*) - (declare (special accumulate-start-p)) - ;; we must stop accumulating objects into STARTS-WITH once we reach - ;; an alternation - (setq accumulate-start-p nil) - (loop for parse-tree-rest on (rest parse-tree) - while parse-tree-rest - do (setf (car parse-tree-rest) - (convert-aux (car parse-tree-rest)))) - (make-instance 'alternation :choices (rest parse-tree))) - -(defmethod convert-compound-parse-tree ((token (eql :branch)) parse-tree &key) - "The case for \(:BRANCH ). - -Here, must be look-ahead, look-behind or number; if is -an alternation it must have one or two choices." - (declare #.*standard-optimize-settings*) - (declare (special accumulate-start-p)) - (setq accumulate-start-p nil) - (let* ((test-candidate (second parse-tree)) - (test (cond ((numberp test-candidate) - (when (zerop (the fixnum test-candidate)) - (signal-syntax-error "Register 0 doesn't exist: ~S." parse-tree)) - (1- (the fixnum test-candidate))) - (t (convert-aux test-candidate)))) - (alternations (convert-aux (third parse-tree)))) - (when (and (not (numberp test)) - (not (typep test 'lookahead)) - (not (typep test 'lookbehind))) - (signal-syntax-error "Branch test must be look-ahead, look-behind or number: ~S." parse-tree)) - (typecase alternations - (alternation - (case (length (choices alternations)) - ((0) - (signal-syntax-error "No choices in branch: ~S." parse-tree)) - ((1) - (make-instance 'branch - :test test - :then-regex (first - (choices alternations)))) - ((2) - (make-instance 'branch - :test test - :then-regex (first - (choices alternations)) - :else-regex (second - (choices alternations)))) - (otherwise - (signal-syntax-error "Too much choices in branch: ~S." parse-tree)))) - (t - (make-instance 'branch - :test test - :then-regex alternations))))) - -(defmethod convert-compound-parse-tree ((token (eql :positive-lookahead)) parse-tree &key) - "The case for \(:POSITIVE-LOOKAHEAD )." - (declare #.*standard-optimize-settings*) - (declare (special flags accumulate-start-p)) - ;; keep the effect of modifiers local to the enclosed regex and stop - ;; accumulating into STARTS-WITH - (setq accumulate-start-p nil) - (let ((flags (copy-list flags))) - (declare (special flags)) - (make-instance 'lookahead - :regex (convert-aux (second parse-tree)) - :positivep t))) - -(defmethod convert-compound-parse-tree ((token (eql :negative-lookahead)) parse-tree &key) - "The case for \(:NEGATIVE-LOOKAHEAD )." - (declare #.*standard-optimize-settings*) - ;; do the same as for positive look-aheads and just switch afterwards - (let ((regex (convert-compound-parse-tree :positive-lookahead parse-tree))) - (setf (slot-value regex 'positivep) nil) - regex)) - -(defmethod convert-compound-parse-tree ((token (eql :positive-lookbehind)) parse-tree &key) - "The case for \(:POSITIVE-LOOKBEHIND )." - (declare #.*standard-optimize-settings*) - (declare (special flags accumulate-start-p)) - ;; keep the effect of modifiers local to the enclosed regex and stop - ;; accumulating into STARTS-WITH - (setq accumulate-start-p nil) - (let* ((flags (copy-list flags)) - (regex (convert-aux (second parse-tree))) - (len (regex-length regex))) - (declare (special flags)) - ;; lookbehind assertions must be of fixed length - (unless len - (signal-syntax-error "Variable length look-behind not implemented \(yet): ~S." parse-tree)) - (make-instance 'lookbehind - :regex regex - :positivep t - :len len))) - -(defmethod convert-compound-parse-tree ((token (eql :negative-lookbehind)) parse-tree &key) - "The case for \(:NEGATIVE-LOOKBEHIND )." - (declare #.*standard-optimize-settings*) - ;; do the same as for positive look-behinds and just switch afterwards - (let ((regex (convert-compound-parse-tree :positive-lookbehind parse-tree))) - (setf (slot-value regex 'positivep) nil) - regex)) - -(defmethod convert-compound-parse-tree ((token (eql :greedy-repetition)) parse-tree &key (greedyp t)) - "The case for \(:GREEDY-REPETITION|:NON-GREEDY-REPETITION ). - -This function is also used for the non-greedy case in which case it is -called with GREEDYP set to NIL as you would expect." - (declare #.*standard-optimize-settings*) - (declare (special accumulate-start-p starts-with)) - ;; remember the value of ACCUMULATE-START-P upon entering - (let ((local-accumulate-start-p accumulate-start-p)) - (let ((minimum (second parse-tree)) - (maximum (third parse-tree))) - (declare (fixnum minimum)) - (declare (type (or null fixnum) maximum)) - (unless (and maximum - (= 1 minimum maximum)) - ;; set ACCUMULATE-START-P to NIL for the rest of - ;; the conversion because we can't continue to - ;; accumulate inside as well as after a proper - ;; repetition - (setq accumulate-start-p nil)) - (let* (reg-seen - (regex (convert-aux (fourth parse-tree))) - (min-len (regex-min-length regex)) - (length (regex-length regex))) - ;; note that this declaration already applies to - ;; the call to CONVERT-AUX above - (declare (special reg-seen)) - (when (and local-accumulate-start-p - (not starts-with) - (zerop minimum) - (not maximum)) - ;; if this repetition is (equivalent to) ".*" - ;; and if we're at the start of the regex we - ;; remember it for ADVANCE-FN (see the SCAN - ;; function) - (setq starts-with (everythingp regex))) - (if (or (not reg-seen) - (not greedyp) - (not length) - (zerop length) - (and maximum (= minimum maximum))) - ;; the repetition doesn't enclose a register, or - ;; it's not greedy, or we can't determine it's - ;; (inner) length, or the length is zero, or the - ;; number of repetitions is fixed; in all of - ;; these cases we don't bother to optimize - (maybe-split-repetition regex - greedyp - minimum - maximum - min-len - length - reg-seen) - ;; otherwise we make a transformation that looks - ;; roughly like one of - ;; * -> (?:*)? - ;; + -> * - ;; where the trick is that as much as possible - ;; registers from are removed in - ;; - (let* (reg-seen ; new instance for REMOVE-REGISTERS - (remove-registers-p t) - (inner-regex (remove-registers regex)) - (inner-repetition - ;; this is the "" part - (maybe-split-repetition inner-regex - ;; always greedy - t - ;; reduce minimum by 1 - ;; unless it's already 0 - (if (zerop minimum) - 0 - (1- minimum)) - ;; reduce maximum by 1 - ;; unless it's NIL - (and maximum - (1- maximum)) - min-len - length - reg-seen)) - (inner-seq - ;; this is the "*" part - (make-instance 'seq - :elements (list inner-repetition - regex)))) - ;; note that this declaration already applies - ;; to the call to REMOVE-REGISTERS above - (declare (special remove-registers-p reg-seen)) - ;; wrap INNER-SEQ with a greedy - ;; {0,1}-repetition (i.e. "?") if necessary - (if (plusp minimum) - inner-seq - (maybe-split-repetition inner-seq - t - 0 - 1 - min-len - nil - t)))))))) - -(defmethod convert-compound-parse-tree ((token (eql :non-greedy-repetition)) parse-tree &key) - "The case for \(:NON-GREEDY-REPETITION )." - (declare #.*standard-optimize-settings*) - ;; just dispatch to the method above with GREEDYP explicitly set to NIL - (convert-compound-parse-tree :greedy-repetition parse-tree :greedyp nil)) - -(defmethod convert-compound-parse-tree ((token (eql :register)) parse-tree &key name) - "The case for \(:REGISTER ). Also used for named registers -when NAME is not NIL." - (declare #.*standard-optimize-settings*) - (declare (special flags reg-num reg-names)) - ;; keep the effect of modifiers local to the enclosed regex; also, - ;; assign the current value of REG-NUM to the corresponding slot of - ;; the REGISTER object and increase this counter afterwards; for - ;; named register update REG-NAMES and set the corresponding name - ;; slot of the REGISTER object too - (let ((flags (copy-list flags)) - (stored-reg-num reg-num)) - (declare (special flags reg-seen named-reg-seen)) - (setq reg-seen t) - (when name (setq named-reg-seen t)) - (incf (the fixnum reg-num)) - (push name reg-names) - (make-instance 'register - :regex (convert-aux (if name (third parse-tree) (second parse-tree))) - :num stored-reg-num - :name name))) - -(defmethod convert-compound-parse-tree ((token (eql :named-register)) parse-tree &key) - "The case for \(:NAMED-REGISTER )." - (declare #.*standard-optimize-settings*) - ;; call the method above and use the :NAME keyword argument - (convert-compound-parse-tree :register parse-tree :name (copy-seq (second parse-tree)))) - -(defmethod convert-compound-parse-tree ((token (eql :filter)) parse-tree &key) - "The case for \(:FILTER &optional )." - (declare #.*standard-optimize-settings*) - (declare (special accumulate-start-p)) - ;; stop accumulating into STARTS-WITH - (setq accumulate-start-p nil) - (make-instance 'filter - :fn (second parse-tree) - :len (third parse-tree))) - -(defmethod convert-compound-parse-tree ((token (eql :standalone)) parse-tree &key) - "The case for \(:STANDALONE )." - (declare #.*standard-optimize-settings*) - (declare (special flags accumulate-start-p)) - ;; stop accumulating into STARTS-WITH - (setq accumulate-start-p nil) - ;; keep the effect of modifiers local to the enclosed regex - (let ((flags (copy-list flags))) - (declare (special flags)) - (make-instance 'standalone :regex (convert-aux (second parse-tree))))) - -(defmethod convert-compound-parse-tree ((token (eql :back-reference)) parse-tree &key) - "The case for \(:BACK-REFERENCE |)." - (declare #.*standard-optimize-settings*) - (declare (special flags accumulate-start-p reg-num reg-names max-back-ref)) - (let* ((backref-name (and (stringp (second parse-tree)) - (second parse-tree))) - (referred-regs - (when backref-name - ;; find which register corresponds to the given name - ;; we have to deal with case where several registers share - ;; the same name and collect their respective numbers - (loop for name in reg-names - for reg-index from 0 - when (string= name backref-name) - ;; NOTE: REG-NAMES stores register names in reversed - ;; order REG-NUM contains number of (any) registers - ;; seen so far; 1- will be done later - collect (- reg-num reg-index)))) - ;; store the register number for the simple case - (backref-number (or (first referred-regs) (second parse-tree)))) - (declare (type (or fixnum null) backref-number)) - (when (or (not (typep backref-number 'fixnum)) - (<= backref-number 0)) - (signal-syntax-error "Illegal back-reference: ~S." parse-tree)) - ;; stop accumulating into STARTS-WITH and increase MAX-BACK-REF if - ;; necessary - (setq accumulate-start-p nil - max-back-ref (max (the fixnum max-back-ref) - backref-number)) - (flet ((make-back-ref (backref-number) - (make-instance 'back-reference - ;; we start counting from 0 internally - :num (1- backref-number) - :case-insensitive-p (case-insensitive-mode-p flags) - ;; backref-name is NIL or string, safe to copy - :name (copy-seq backref-name)))) - (cond - ((cdr referred-regs) - ;; several registers share the same name we will try to match - ;; any of them, starting with the most recent first - ;; alternation is used to accomplish matching - (make-instance 'alternation - :choices (loop - for reg-index in referred-regs - collect (make-back-ref reg-index)))) - ;; simple case - backref corresponds to only one register - (t - (make-back-ref backref-number)))))) - -(defmethod convert-compound-parse-tree ((token (eql :regex)) parse-tree &key) - "The case for \(:REGEX )." - (declare #.*standard-optimize-settings*) - (convert-aux (parse-string (second parse-tree)))) - -(defmethod convert-compound-parse-tree ((token (eql :char-class)) parse-tree &key invertedp) - "The case for \(:CHAR-CLASS {}*) where item is one of - -- a character, -- a character range: \(:RANGE ), or -- a special char class symbol like :DIGIT-CHAR-CLASS. - -Also used for inverted char classes when INVERTEDP is true." - (declare #.*standard-optimize-settings*) - (declare (special flags accumulate-start-p)) - (let ((test-function - (create-optimized-test-function - (convert-char-class-to-test-function (rest parse-tree) - invertedp - (case-insensitive-mode-p flags))))) - (setq accumulate-start-p nil) - (make-instance 'char-class :test-function test-function))) - -(defmethod convert-compound-parse-tree ((token (eql :inverted-char-class)) parse-tree &key) - "The case for \(:INVERTED-CHAR-CLASS {}*)." - (declare #.*standard-optimize-settings*) - ;; just dispatch to the "real" method - (convert-compound-parse-tree :char-class parse-tree :invertedp t)) - -(defmethod convert-compound-parse-tree ((token (eql :property)) parse-tree &key) - "The case for \(:PROPERTY ) where is a string." - (declare #.*standard-optimize-settings*) - (declare (special accumulate-start-p)) - (setq accumulate-start-p nil) - (make-instance 'char-class :test-function (resolve-property (second parse-tree)))) - -(defmethod convert-compound-parse-tree ((token (eql :inverted-property)) parse-tree &key) - "The case for \(:INVERTED-PROPERTY ) where is a string." - (declare #.*standard-optimize-settings*) - (declare (special accumulate-start-p)) - (setq accumulate-start-p nil) - (make-instance 'char-class :test-function (complement* (resolve-property (second parse-tree))))) - -(defmethod convert-compound-parse-tree ((token (eql :flags)) parse-tree &key) - "The case for \(:FLAGS {}*) where flag is a modifier symbol -like :CASE-INSENSITIVE-P." - (declare #.*standard-optimize-settings*) - ;; set/unset the flags corresponding to the symbols - ;; following :FLAGS - (mapc #'set-flag (rest parse-tree)) - ;; we're only interested in the side effect of - ;; setting/unsetting the flags and turn this syntactical - ;; construct into a VOID object which'll be optimized - ;; away when creating the matcher - (make-instance 'void)) - -(defgeneric convert-simple-parse-tree (parse-tree) - (declare #.*standard-optimize-settings*) - (:documentation "Helper function for CONVERT-AUX which converts -parse trees which are atoms.") - (:method ((parse-tree (eql :void))) - (declare #.*standard-optimize-settings*) - (make-instance 'void)) - (:method ((parse-tree (eql :word-boundary))) - (declare #.*standard-optimize-settings*) - (make-instance 'word-boundary :negatedp nil)) - (:method ((parse-tree (eql :non-word-boundary))) - (declare #.*standard-optimize-settings*) - (make-instance 'word-boundary :negatedp t)) - (:method ((parse-tree (eql :everything))) - (declare #.*standard-optimize-settings*) - (declare (special flags accumulate-start-p)) - (setq accumulate-start-p nil) - (make-instance 'everything :single-line-p (single-line-mode-p flags))) - (:method ((parse-tree (eql :digit-class))) - (declare #.*standard-optimize-settings*) - (declare (special accumulate-start-p)) - (setq accumulate-start-p nil) - (make-instance 'char-class :test-function #'digit-char-p)) - (:method ((parse-tree (eql :word-char-class))) - (declare #.*standard-optimize-settings*) - (declare (special accumulate-start-p)) - (setq accumulate-start-p nil) - (make-instance 'char-class :test-function #'word-char-p)) - (:method ((parse-tree (eql :whitespace-char-class))) - (declare #.*standard-optimize-settings*) - (declare (special accumulate-start-p)) - (setq accumulate-start-p nil) - (make-instance 'char-class :test-function #'whitespacep)) - (:method ((parse-tree (eql :non-digit-class))) - (declare #.*standard-optimize-settings*) - (declare (special accumulate-start-p)) - (setq accumulate-start-p nil) - (make-instance 'char-class :test-function (complement* #'digit-char-p))) - (:method ((parse-tree (eql :non-word-char-class))) - (declare #.*standard-optimize-settings*) - (declare (special accumulate-start-p)) - (setq accumulate-start-p nil) - (make-instance 'char-class :test-function (complement* #'word-char-p))) - (:method ((parse-tree (eql :non-whitespace-char-class))) - (declare #.*standard-optimize-settings*) - (declare (special accumulate-start-p)) - (setq accumulate-start-p nil) - (make-instance 'char-class :test-function (complement* #'whitespacep))) - (:method ((parse-tree (eql :start-anchor))) - ;; Perl's "^" - (declare #.*standard-optimize-settings*) - (declare (special flags)) - (make-instance 'anchor :startp t :multi-line-p (multi-line-mode-p flags))) - (:method ((parse-tree (eql :end-anchor))) - ;; Perl's "$" - (declare #.*standard-optimize-settings*) - (declare (special flags)) - (make-instance 'anchor :startp nil :multi-line-p (multi-line-mode-p flags))) - (:method ((parse-tree (eql :modeless-start-anchor))) - ;; Perl's "\A" - (declare #.*standard-optimize-settings*) - (make-instance 'anchor :startp t)) - (:method ((parse-tree (eql :modeless-end-anchor))) - ;; Perl's "$\Z" - (declare #.*standard-optimize-settings*) - (make-instance 'anchor :startp nil)) - (:method ((parse-tree (eql :modeless-end-anchor-no-newline))) - ;; Perl's "$\z" - (declare #.*standard-optimize-settings*) - (make-instance 'anchor :startp nil :no-newline-p t)) - (:method ((parse-tree (eql :case-insensitive-p))) - (declare #.*standard-optimize-settings*) - (set-flag parse-tree) - (make-instance 'void)) - (:method ((parse-tree (eql :case-sensitive-p))) - (declare #.*standard-optimize-settings*) - (set-flag parse-tree) - (make-instance 'void)) - (:method ((parse-tree (eql :multi-line-mode-p))) - (declare #.*standard-optimize-settings*) - (set-flag parse-tree) - (make-instance 'void)) - (:method ((parse-tree (eql :not-multi-line-mode-p))) - (declare #.*standard-optimize-settings*) - (set-flag parse-tree) - (make-instance 'void)) - (:method ((parse-tree (eql :single-line-mode-p))) - (declare #.*standard-optimize-settings*) - (set-flag parse-tree) - (make-instance 'void)) - (:method ((parse-tree (eql :not-single-line-mode-p))) - (declare #.*standard-optimize-settings*) - (set-flag parse-tree) - (make-instance 'void))) - -(defmethod convert-simple-parse-tree ((parse-tree string)) - (declare #.*standard-optimize-settings*) - (declare (special flags)) - ;; turn strings into STR objects and try to accumulate into - ;; STARTS-WITH - (let ((str (make-instance 'str - :str parse-tree - :case-insensitive-p (case-insensitive-mode-p flags)))) - (maybe-accumulate str) - str)) - -(defmethod convert-simple-parse-tree ((parse-tree character)) - (declare #.*standard-optimize-settings*) - ;; dispatch to the method for strings - (convert-simple-parse-tree (string parse-tree))) - -(defmethod convert-simple-parse-tree (parse-tree) - "The default method - check if there's a translation." - (declare #.*standard-optimize-settings*) - (let ((translation (and (symbolp parse-tree) (parse-tree-synonym parse-tree)))) - (if translation - (convert-aux (copy-tree translation)) - (signal-syntax-error "Unknown token ~A in parse tree." parse-tree)))) - -(defun convert (parse-tree) - "Converts the parse tree PARSE-TREE into an equivalent REGEX object -and returns three values: the REGEX object, the number of registers -seen and an object the regex starts with which is either a STR object -or an EVERYTHING object \(if the regex starts with something like -\".*\") or NIL." - (declare #.*standard-optimize-settings*) - ;; this function basically just initializes the special variables - ;; and then calls CONVERT-AUX to do all the work - (let* ((flags (list nil nil nil)) - (reg-num 0) - reg-names - named-reg-seen - (accumulate-start-p t) - starts-with - (max-back-ref 0) - (converted-parse-tree (convert-aux parse-tree))) - (declare (special flags reg-num reg-names named-reg-seen - accumulate-start-p starts-with max-back-ref)) - ;; make sure we don't reference registers which aren't there - (when (> (the fixnum max-back-ref) - (the fixnum reg-num)) - (signal-syntax-error "Backreference to register ~A which has not been defined." max-back-ref)) - (when (typep starts-with 'str) - (setf (slot-value starts-with 'str) - (coerce (slot-value starts-with 'str) - #+:lispworks 'lw:simple-text-string - #-:lispworks 'simple-string))) - (values converted-parse-tree reg-num starts-with - ;; we can't simply use *ALLOW-NAMED-REGISTERS* - ;; since parse-tree syntax ignores it - (when named-reg-seen - (nreverse reg-names))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/docs/index.html b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/docs/index.html deleted file mode 100644 index 6da6a15..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/docs/index.html +++ /dev/null @@ -1,2231 +0,0 @@ - - - - - CL-PPCRE - Portable Perl-compatible regular expressions for Common Lisp - - - - - - - -

CL-PPCRE - Portable Perl-compatible regular expressions for Common Lisp

- -
-
 

Abstract

- -CL-PPCRE is a portable regular expression library for Common Lisp -which has the following features: - -
    - -
  • It is compatible with Perl. - -
  • It is pretty fast. - -
  • It is portable between ANSI-compliant Common Lisp -implementations. - -
  • It is thread-safe. - -
  • In addition to specifying regular expressions as strings like in -Perl you can also use S-expressions. - -
  • It comes with a BSD-style -license so you can basically do with it whatever you want. - -
- -CL-PPCRE has been used successfully in various applications like BioBike, -clutu, -LoGS, CafeSpot, Eboy, or The Regex Coach. - -

-Download current version or visit the project on Github. - -

- -
 

Contents

-
    -
  1. Download and installation -
  2. Support -
  3. The CL-PPCRE dictionary -
      -
    1. Scanning -
        -
      1. create-scanner (for Perl regex strings) -
      2. create-scanner (for parse trees) -
      3. scan -
      4. scan-to-strings -
      5. register-groups-bind -
      6. do-scans -
      7. do-matches -
      8. do-matches-as-strings -
      9. do-register-groups -
      10. all-matches -
      11. all-matches-as-strings -
      -
    2. Splitting and replacing -
        -
      1. split -
      2. regex-replace -
      3. regex-replace-all -
      -
    3. Modifying scanner behaviour -
        -
      1. *property-resolver* -
      2. parse-tree-synonym -
      3. define-parse-tree-synonym -
      4. *regex-char-code-limit* -
      5. *use-bmh-matchers* -
      6. *optimize-char-classes* -
      7. *allow-quoting* -
      8. *allow-named-registers* -
      9. *look-ahead-for-suffix* -
      -
    4. Miscellaneous -
        -
      1. parse-string -
      2. create-optimized-test-function -
      3. quote-meta-chars -
      4. regex-apropos -
      5. regex-apropos-list -
      -
    5. Conditions -
        -
      1. ppcre-error -
      2. ppcre-invocation-error -
      3. ppcre-syntax-error -
      4. ppcre-syntax-error-string -
      5. ppcre-syntax-error-pos -
      -
    -
  4. Unicode properties -
      -
    1. unicode-property-resolver -
    -
  5. Filters -
  6. Compatibility with Perl -
      -
    1. Empty strings instead of undef in $1, $2, etc. -
    2. Strange scoping of embedded modifiers -
    3. Inconsistent capturing of $1, $2, etc. -
    4. Captured groups not available outside of look-aheads and look-behinds -
    5. Alternations don't always work from left to right -
    6. Different names for Unicode properties -
    7. "\r" doesn't work with MCL -
    8. What about "\w"? -
    -
  7. Bugs and problems -
      -
    1. "\Q" doesn't work, or does it? -
    2. Backslashes may confuse you... -
    -
  8. AllegroCL compatibility mode -
  9. Hints, comments, performance considerations -
  10. Acknowledgements -
- -
 

Download and installation

- -CL-PPCRE together with this documentation can be downloaded from Github. The -current version is 2.0.11. -

-CL-PPCRE comes with a system definition -for ASDF and you compile and -load it in the usual way. There are no dependencies (except that the -test suite which is not needed for normal operation depends -on FLEXI-STREAMS). -

- The preferred way to install CL-PPCRE is -through Quicklisp: -

(ql:quickload :cl-ppcre)
-

-

-You can run a test suite which tests most aspects of the library with -

-(asdf:oos 'asdf:test-op :cl-ppcre)
-
-

-The current development version of CL-PPCRE can be found -at https://github.com/edicl/cl-ppcre. If you want to send patches, please fork the github repository and send pull requests. -

- -
 

Support

- -The development version of cl-ppcre can be -found on -github. Please use the github issue tracking system to submit bug -reports. Patches are welcome, please -use GitHub pull -requests. If you want to make a change, -please read this -first. - -
 

The CL-PPCRE dictionary

- -

Scanning

- -


[Method] -
create-scanner (string string)&key case-insensitive-mode multi-line-mode single-line-mode extended-mode destructive => scanner, register-names - -


Accepts a string which is a regular expression in -Perl syntax and returns a closure which will scan strings for this -regular expression. The second value is only returned if *ALLOW-NAMED-REGISTERS* is true. It represents a list of strings mapping registers to their respective names - the first element stands for first register, the second element for second register, etc. You have to store this value if you want to map a register number to its name later as scanner doesn't capture any information about register names. If a register isn't named, it has NIL as its name. -

-The mode keyword arguments are equivalent to the -"imsx" modifiers in Perl. The -destructive keyword will be ignored. -

-The function accepts most of the regex syntax of Perl 5.8 as described -in man -perlre including extended features like non-greedy -repetitions, positive and negative look-ahead and look-behind -assertions, "standalone" subexpressions, and conditional -subpatterns. The following Perl features are (currently) not -supported: - -

    - -
  • (?{ code }) and (??{ code }) because -they obviously don't make sense in Lisp. - -
  • \N{name} (named characters), \x{263a} -(wide hex characters), \l, \u, -\L, and \U -because they're actually not part of Perl's regex syntax - but see CL-INTERPOL. - -
  • \X (extended Unicode), and \C (single -character). But you can of course use all characters -supported by your CL implementation. - -
  • Posix character classes like [[:alpha]]. -Use Unicode properties instead. - -
  • \G for Perl's pos() because we don't have it. - -
- -Note, however, that \t, \n, \r, -\f, \a, \e, \033 -(octal character codes), \x1B (hexadecimal character -codes), \c[ (control characters), \w, -\W, \s, \S, \d, -\D, \b, \B, \A, -\Z, and \z are supported. -

-Since version 0.6.0, CL-PPCRE also supports Perl's \Q and \E - see *ALLOW-QUOTING* below. Make sure you also read the relevant section in "Bugs and problems." -

-Since version 1.3.0, CL-PPCRE offers support for AllegroCL's (?<name>"<regex>") named registers and \k<name> back-references syntax, have a look at *ALLOW-NAMED-REGISTERS* for details. -

-Since version 2.0.0, CL-PPCRE -supports named properties -(\p and \P), but only the long form with -braces is supported, i.e. \p{Letter} -and \p{L} will work while \pL won't. -

-The keyword arguments are just for your -convenience. You can always use embedded modifiers like -"(?i-s)" instead.

- -


[Method] -
create-scanner (function function)&key case-insensitive-mode multi-line-mode single-line-mode extended-mode destructive => scanner -


In this case function should be a -scanner returned by another invocation -of CREATE-SCANNER. It will be returned as is. You can't -use any of the keyword arguments because the scanner has already been -created and is immutable. -
- -


[Method] -
create-scanner (parse-tree t)&key case-insensitive-mode multi-line-mode single-line-mode extended-mode destructive => scanner, register-names -


-This is similar to CREATE-SCANNER for regex strings above but -accepts a parse tree as its first argument. A parse tree is an S-expression -conforming to the following syntax: - -
    - -
  • Every string and character is a parse tree and is treated -literally as a part of the regular expression, -i.e. parentheses, brackets, asterisks and such aren't special. - -
  • The symbol :VOID is equivalent to the empty string. - -
  • The symbol :EVERYTHING is equivalent to Perl's dot, -i.e it matches everything (except maybe a newline character depending -on the mode). - -
  • The symbols :WORD-BOUNDARY and -:NON-WORD-BOUNDARY are equivalent to Perl's -"\b" and "\B". - -
  • The symbols :DIGIT-CLASS, -:NON-DIGIT-CLASS, :WORD-CHAR-CLASS, -:NON-WORD-CHAR-CLASS, -:WHITESPACE-CHAR-CLASS, and -:NON-WHITESPACE-CHAR-CLASS are equivalent to Perl's -special character classes "\d", -"\D", "\w", -"\W", "\s", and -"\S" respectively. - -
  • The symbols :START-ANCHOR, :END-ANCHOR, -:MODELESS-START-ANCHOR, -:MODELESS-END-ANCHOR, and -:MODELESS-END-ANCHOR-NO-NEWLINE are equivalent to Perl's -"^", "$", -"\A", "\Z", and -"\z" respectively. - -
  • The symbols :CASE-INSENSITIVE-P, -:CASE-SENSITIVE-P, :MULTI-LINE-MODE-P, -:NOT-MULTI-LINE-MODE-P, :SINGLE-LINE-MODE-P, -and :NOT-SINGLE-LINE-MODE-P are equivalent to Perl's -embedded modifiers "(?i)", -"(?-i)", "(?m)", -"(?-m)", "(?s)", and -"(?-s)". As usual, changes applied to modes are -kept local to the innermost enclosing grouping or clustering -construct. - -
  • All other symbols will signal an error of type PPCRE-SYNTAX-ERROR -unless they are defined to be parse tree synonyms. - -
  • (:FLAGS {<modifier>}*) where -<modifier> is one of the modifier symbols from -above is used to group modifier symbols. The modifiers are applied -from left to right. (This construct is obviously redundant. It is only -there because it's used by the parser.) - -
  • (:SEQUENCE {<parse-tree>}*) means a -sequence of parse trees, i.e. the parse trees must match one after -another. Example: (:SEQUENCE #\f #\o #\o) is equivalent -to the parse tree "foo". - -
  • (:GROUP {<parse-tree>}*) is like -:SEQUENCE but changes applied to modifier flags (see -above) are kept local to the parse trees enclosed by this -construct. Think of it as the S-expression variant of Perl's -"(?:<pattern>)" construct. - -
  • (:ALTERNATION {<parse-tree>}*) means an -alternation of parse trees, i.e. one of the parse trees must -match. Example: (:ALTERNATION #\b #\a #\z) is equivalent -to the Perl regex string "b|a|z". - -
  • (:BRANCH <test> -<parse-tree>) is for conditional regular -expressions. <test> is either a number which -stands for a register or a parse tree which is a look-ahead or -look-behind assertion. See the entry for -(?(<condition>)<yes-pattern>|<no-pattern>) -in man -perlre for the semantics of this construct. If -<parse-tree> is an alternation is -must enclose exactly one or two parse trees where the second -one (if present) will be treated as the "no-pattern" - in -all other cases <parse-tree> will be treated -as the "yes-pattern". - -
  • (:POSITIVE-LOOKAHEAD|:NEGATIVE-LOOKAHEAD|:POSITIVE-LOOKBEHIND|:NEGATIVE-LOOKBEHIND -<parse-tree>) should be pretty obvious... - -
  • (:GREEDY-REPETITION|:NON-GREEDY-REPETITION -<min> <max> -<parse-tree>) where -<min> is a non-negative integer and -<max> is either a non-negative integer not -smaller than <min> or NIL will -result in a regular expression which tries to match -<parse-tree> at least -<min> times and at most -<max> times (or as often as possible if -<max> is NIL). So, e.g., -(:NON-GREEDY-REPETITION 0 1 "ab") is equivalent -to the Perl regex string "(?:ab)??". - -
  • (:STANDALONE <parse-tree>) is an -"independent" subexpression, i.e. (:STANDALONE -"bar") is equivalent to the Perl regex string -"(?>bar)". - -
  • (:REGISTER <parse-tree>) is a capturing -register group. As usual, registers are counted from left to right -beginning with 1. - -
  • (:NAMED-REGISTER <name> <parse-tree>) is a named capturing -register group. Acts as :REGISTER, but assigns <name> to a register too. This <name> can be later referred to via :BACK-REFERENCE. Names are case-sensitive and don't need to be unique. See *ALLOW-NAMED-REGISTERS* for details. - - -
  • (:BACK-REFERENCE <ref>) is a -back-reference to a register group. <ref> is -a positive integer or a string denoting a register name. If there are -several registers with the same name, the regex engine tries to -successfully match at least of them, starting with the most recently -seen register continuing to the least recently seen one, until a match -is found. See *ALLOW-NAMED-REGISTERS* -for more information. - -
  • (:PROPERTY|:INVERTED-PROPERTY <property>) is -a named property (or its inverse) with -<property> being a function designator or a -string which must be resolved -by *PROPERTY-RESOLVER*. - -
  • (:FILTER <function> &optional -<length>) where -<function> is a function -designator and <length> is a -non-negative integer or NIL is a user-defined filter. - -
  • (:REGEX <string>) where -<string> is an -embedded regular expression in Perl -syntax. - -
  • (:CHAR-CLASS|:INVERTED-CHAR-CLASS -{<item>}*) where <item> -is either a character, a character range, a named property -(see above), or a symbol for a special character class (see above) -will be translated into a (one character wide) character -class. A character range looks like -(:RANGE <char1> <char2>) where -<char1> and -<char2> are characters such that -(CHAR<= <char1> <char2>) is -true. Example: (:INVERTED-CHAR-CLASS #\a (:RANGE #\D #\G) -:DIGIT-CLASS) is equivalent to the Perl regex string -"[^aD-G\d]". - -
- -Because CREATE-SCANNER is defined as a generic function -which dispatches on its first argument there's a certain ambiguity: -Although strings are valid parse trees they will be interpreted as -Perl regex strings when given to CREATE-SCANNER. To -circumvent this you can always use the equivalent parse tree (:GROUP -<string>) instead. -

-Note that CREATE-SCANNER doesn't always check -for the well-formedness of its first argument, i.e. you are expected -to provide correct parse trees. - -

-The usage of the keyword argument extended-mode obviously -doesn't make sense if CREATE-SCANNER is applied to parse -trees and will signal an error. -

-If destructive is not NIL (the default is -NIL), the function is allowed to destructively modify -parse-tree while creating the scanner. -

-If you want to find out how parse trees are related to Perl regex -strings, you should play around with -PARSE-STRING: - -

-* (parse-string "(ab)*")
-(:GREEDY-REPETITION 0 NIL (:REGISTER "ab"))
-
-* (parse-string "(a(b))")
-(:REGISTER (:SEQUENCE #\a (:REGISTER #\b)))
-
-* (parse-string "(?:abc){3,5}")
-(:GREEDY-REPETITION 3 5 (:GROUP "abc"))
-;; (:GREEDY-REPETITION 3 5 "abc") would also be OK
-
-* (parse-string "a(?i)b(?-i)c")
-(:SEQUENCE #\a
- (:SEQUENCE (:FLAGS :CASE-INSENSITIVE-P)
-  (:SEQUENCE #\b (:SEQUENCE (:FLAGS :CASE-SENSITIVE-P) #\c))))
-;; same as (:SEQUENCE #\a :CASE-INSENSITIVE-P #\b :CASE-SENSITIVE-P #\c)
-
-* (parse-string "(?=a)b")
-(:SEQUENCE (:POSITIVE-LOOKAHEAD #\a) #\b)
-
- -


-For the rest of the dictionary, regex can -always be a string (which is interpreted as a Perl regular -expression), a parse tree, or a scanner created by -CREATE-SCANNER. The -start and end -keyword parameters are always used as in SCAN. - - - - -


[Generic Function] -
scan regex target-string &key start end => match-start, match-end, reg-starts, reg-ends - -


-Searches the string target-string -from start (which defaults to 0) to -end (which default to the length of -target-string) and tries to match -regex. On success returns four values - the start -of the match, the end of the match, and two arrays denoting the -beginnings and ends of register matches. On failure returns -NIL. target-string will be coerced -to a simple string if it isn't one already. (There's another keyword -parameter real-start-pos. This one should -never be set from user code - it is only used internally.) -

-SCAN acts as if the part of -target-string between start -and end were a standalone string, i.e. look-aheads -and look-behinds can't look beyond these boundaries. -

-* (scan "(a)*b" "xaaabd")
-1
-5
-#(3)
-#(4)
-
-* (scan "(a)*b" "xaaabd" :start 1)
-1
-5
-#(3)
-#(4)
-
-* (scan "(a)*b" "xaaabd" :start 2)
-2
-5
-#(3)
-#(4)
-
-* (scan "(a)*b" "xaaabd" :end 4)
-NIL
-
-* (scan '(:greedy-repetition 0 nil #\b) "bbbc")
-0
-3
-#()
-#()
-
-* (scan '(:greedy-repetition 4 6 #\b) "bbbc")
-NIL
-
-* (let ((s (create-scanner "(([a-c])+)x")))
-    (scan s "abcxy"))
-0
-4
-#(0 2)
-#(3 3)
-
- - - -


[Function] -
scan-to-strings regex target-string &key start end sharedp => match, regs - -


-Like SCAN but returns substrings of -target-string instead of positions, i.e. this -function returns two values on success: the whole match as a string -plus an array of substrings (or NILs) corresponding to -the matched registers. If sharedp is true, the substrings may share structure with -target-string. -
-* (scan-to-strings "[^b]*b" "aaabd")
-"aaab"
-#()
-
-* (scan-to-strings "([^b])*b" "aaabd")
-"aaab"
-#("a")
-
-* (scan-to-strings "(([^b])*)b" "aaabd")
-"aaab"
-#("aaa" "a")
-
- - -


[Macro] -
register-groups-bind var-list (regex target-string &key start end sharedp) declaration* statement* => result* - -


-Evaluates statement* with the variables in var-list bound to the -corresponding register groups after target-string has been matched -against regex, i.e. each variable is either -bound to a string or to NIL. -As a shortcut, the elements of var-list can also be lists of the form (FN VAR) where VAR is the variable symbol -and FN is a function -designator (which is evaluated) denoting a function which is to be applied to the string before the result is bound to VAR. -To make this even more convenient the form (FN VAR1 ...VARn) can be used as an abbreviation for -(FN VAR1) ... (FN VARn). -

-If there is no match, the statement* forms are not -executed. For each element of -var-list which is NIL there's no binding to the corresponding register -group. The number of variables in var-list must not be greater than -the number of register groups. If sharedp is true, the substrings may -share structure with target-string. -

-* (register-groups-bind (first second third fourth)
-      ("((a)|(b)|(c))+" "abababc" :sharedp t)
-    (list first second third fourth))
-("c" "a" "b" "c")
-
-* (register-groups-bind (nil second third fourth)
-      ;; note that we don't bind the first and fifth register group
-      ("((a)|(b)|(c))()+" "abababc" :start 6)
-    (list second third fourth))
-(NIL NIL "c")
-
-* (register-groups-bind (first)
-      ("(a|b)+" "accc" :start 1)
-    (format t "This will not be printed: ~A" first))
-NIL
-
-* (register-groups-bind (fname lname (#'parse-integer date month year))
-      ("(\\w+)\\s+(\\w+)\\s+(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})" "Frank Zappa 21.12.1940")
-    (list fname lname (encode-universal-time 0 0 0 date month year 0)))
-("Frank" "Zappa" 1292889600)
-
-
- -


[Macro] -
do-scans (match-start match-end reg-starts reg-ends regex target-string &optional result-form &key start end) declaration* statement* => result* - -


-A macro which iterates over target-string and -tries to match regex as often as possible -evaluating statement* with -match-start, match-end, -reg-starts, and reg-ends bound -to the four return values of each match (see SCAN) in turn. After the last match, -returns result-form if provided or -NIL otherwise. An implicit block named NIL -surrounds DO-SCANS; RETURN may be used to -terminate the loop immediately. If regex matches -an empty string, the scan is continued one position behind this match. -

-This is the most general macro to iterate over all matches in a target -string. See the source code of DO-MATCHES, ALL-MATCHES, SPLIT, or REGEX-REPLACE-ALL for examples of its -usage.

- - - - -


[Macro] -
do-matches (match-start match-end regex target-string &optional result-form &key start end) declaration* statement* => result* - -


-Like DO-SCANS but doesn't bind -variables to the register arrays. -
-* (defun foo (regex target-string &key (start 0) (end (length target-string)))
-    (let ((sum 0))
-      (do-matches (s e regex target-string nil :start start :end end)
-        (incf sum (- e s)))
-      (format t "~,2F% of the string was inside of a match~%"
-                ;; note: doesn't check for division by zero
-                (float (* 100 (/ sum (- end start)))))))
-
-FOO
-
-* (foo "a" "abcabcabc")
-33.33% of the string was inside of a match
-NIL
-* (foo "aa|b" "aacabcbbc")
-55.56% of the string was inside of a match
-NIL
-
- - - - -


[Macro] -
do-matches-as-strings (match-var regex target-string &optional result-form &key start end sharedp) declaration* statement* => result* - -


-Like DO-MATCHES but binds -match-var to the substring of -target-string corresponding to each match in turn. If sharedp is true, the substrings may share structure with -target-string. -
-* (defun crossfoot (target-string &key (start 0) (end (length target-string)))
-    (let ((sum 0))
-      (do-matches-as-strings (m :digit-class
-                                         target-string nil
-                                         :start start :end end)
-        (incf sum (parse-integer m)))
-      (if (< sum 10)
-        sum
-        (crossfoot (format nil "~A" sum)))))
-
-CROSSFOOT
-
-* (crossfoot "bar")
-0
-
-* (crossfoot "a3x")
-3
-
-* (crossfoot "12345")
-6
-
- -Of course, in real life you would do this with DO-MATCHES and use the start and end keyword parameters of PARSE-INTEGER.
- -


[Macro] -
do-register-groups var-list (regex target-string &optional result-form &key start end sharedp) declaration* statement* => result* - -


-Iterates over target-string and tries to match regex as often as -possible evaluating statement* with the variables in var-list bound to the -corresponding register groups for each match in turn, i.e. each -variable is either bound to a string or to NIL. You can use the same shortcuts and abbreviations as in REGISTER-GROUPS-BIND. The number of -variables in var-list must not be greater than the number of register -groups. For each element of -var-list which is NIL there's no binding to the corresponding register -group. After the last match, returns result-form if provided or NIL -otherwise. An implicit block named NIL surrounds DO-REGISTER-GROUPS; -RETURN may be used to terminate the loop immediately. If regex matches -an empty string, the scan is continued one position behind this -match. If sharedp is true, the substrings may share structure with -target-string. -
-* (do-register-groups (first second third fourth)
-      ("((a)|(b)|(c))" "abababc" nil :start 2 :sharedp t)
-    (print (list first second third fourth)))
-("a" "a" NIL NIL)
-("b" NIL "b" NIL)
-("a" "a" NIL NIL)
-("b" NIL "b" NIL)
-("c" NIL NIL "c")
-NIL
-
-* (let (result)
-    (do-register-groups ((#'parse-integer n) (#'intern sign) whitespace)
-        ("(\\d+)|(\\+|-|\\*|/)|(\\s+)" "12*15 - 42/3")
-      (unless whitespace
-        (push (or n sign) result)))
-    (nreverse result))
-(12 * 15 - 42 / 3)
-
-
- - -


[Function] -
all-matches regex target-string &key start end => list - -


-Returns a list containing the start and end positions of all matches -of regex against -target-string, i.e. if there are N -matches the list contains (* 2 N) elements. If -regex matches an empty string the scan is -continued one position behind this match. -
-* (all-matches "a" "foo bar baz")
-(5 6 9 10)
-
-* (all-matches "\\w*" "foo bar baz")
-(0 3 3 3 4 7 7 7 8 11 11 11)
-
- - - - -


[Function] -
all-matches-as-strings regex target-string &key start end sharedp => list - -


-Like ALL-MATCHES but -returns a list of substrings instead. If sharedp is true, the substrings may share structure with -target-string. -
-* (all-matches-as-strings "a" "foo bar baz")
-("a" "a")
-
-* (all-matches-as-strings "\\w*" "foo bar baz")
-("foo" "" "bar" "" "baz" "")
-
- - - - -

Splitting and replacing

- - -


[Function] -
split regex target-string &key start end limit with-registers-p omit-unmatched-p sharedp => list - -


-Matches regex against -target-string as often as possible and returns a -list of the substrings between the matches. If -with-registers-p is true, substrings corresponding -to matched registers are inserted into the list as well. If -omit-unmatched-p is true, unmatched registers will -simply be left out, otherwise they will show up as -NIL. limit limits the number of -elements returned - registers aren't counted. If -limit is NIL (or 0 which is -equivalent), trailing empty strings are removed from the result list. -If regex matches an empty string, the scan is -continued one position behind this match. If sharedp is true, the substrings may share structure with -target-string. -

-This function also tries hard to be -Perl-compatible - thus the somewhat peculiar behaviour. -

-* (split "\\s+" "foo   bar baz
-frob")
-("foo" "bar" "baz" "frob")
-
-* (split "\\s*" "foo bar   baz")
-("f" "o" "o" "b" "a" "r" "b" "a" "z")
-
-* (split "(\\s+)" "foo bar   baz")
-("foo" "bar" "baz")
-
-* (split "(\\s+)" "foo bar   baz" :with-registers-p t)
-("foo" " " "bar" "   " "baz")
-
-* (split "(\\s)(\\s*)" "foo bar   baz" :with-registers-p t)
-("foo" " " "" "bar" " " "  " "baz")
-
-* (split "(,)|(;)" "foo,bar;baz" :with-registers-p t)
-("foo" "," NIL "bar" NIL ";" "baz")
-
-* (split "(,)|(;)" "foo,bar;baz" :with-registers-p t :omit-unmatched-p t)
-("foo" "," "bar" ";" "baz")
-
-* (split ":" "a:b:c:d:e:f:g::")
-("a" "b" "c" "d" "e" "f" "g")
-
-* (split ":" "a:b:c:d:e:f:g::" :limit 1)
-("a:b:c:d:e:f:g::")
-
-* (split ":" "a:b:c:d:e:f:g::" :limit 2)
-("a" "b:c:d:e:f:g::")
-
-* (split ":" "a:b:c:d:e:f:g::" :limit 3)
-("a" "b" "c:d:e:f:g::")
-
-* (split ":" "a:b:c:d:e:f:g::" :limit 1000)
-("a" "b" "c" "d" "e" "f" "g" "" "")
-
- - - - - -


[Function] -
regex-replace regex target-string replacement &key start end preserve-case simple-calls element-type => string, matchp - -


Try to match target-string -between start and end against -regex and replace the first match with -replacement. Two values are returned; the modified -string, and T if regex matched or -NIL otherwise. -

-replacement can be a string which may contain the -special substrings "\&" for the whole -match, "\`" for the part of -target-string before the match, -"\'" for the part of -target-string after the match, -"\N" or "\{N}" for the -Nth register where N is a positive integer. -

-replacement can also be a function -designator in which case the match will be replaced with the -result of calling the function designated by -replacement with the arguments -target-string, start, -end, match-start, -match-end, reg-starts, and -reg-ends. (reg-starts and -reg-ends are arrays holding the start and end -positions of matched registers (or NIL) - the meaning of -the other arguments should be obvious.) -

-If simple-calls is true, a function designated by -replacement will instead be called with the -arguments match, register-1, -..., register-n where match is -the whole match as a string and register-1 to -register-n are the matched registers, also as -strings (or NIL). Note that these strings share structure with -target-string so you must not modify them. -

-Finally, replacement can be a list where each -element is a string (which will be inserted verbatim), one of the -symbols :match, :before-match, or -:after-match (corresponding to -"\&", "\`", and -"\'" above), an integer N -(representing register (1+ N)), or a function -designator. -

-If preserve-case is true (default is -NIL), the replacement will try to preserve the case (all -upper case, all lower case, or capitalized) of the match. The result -will always be a fresh -string, even if regex doesn't match. -

-element-type specifies -the array -element type of the string which is returned, the default -is LW:SIMPLE-CHAR -for LispWorks -and CHARACTER -for other Lisps. -

-* (regex-replace "fo+" "foo bar" "frob")
-"frob bar"
-T
-
-* (regex-replace "fo+" "FOO bar" "frob")
-"FOO bar"
-NIL
-
-* (regex-replace "(?i)fo+" "FOO bar" "frob")
-"frob bar"
-T
-
-* (regex-replace "(?i)fo+" "FOO bar" "frob" :preserve-case t)
-"FROB bar"
-T
-
-* (regex-replace "(?i)fo+" "Foo bar" "frob" :preserve-case t)
-"Frob bar"
-T
-
-* (regex-replace "bar" "foo bar baz" "[frob (was '\\&' between '\\`' and '\\'')]")
-"foo [frob (was 'bar' between 'foo ' and ' baz')] baz"
-T
-
-* (regex-replace "bar" "foo bar baz"
-                          '("[frob (was '" :match "' between '" :before-match "' and '" :after-match "')]"))
-"foo [frob (was 'bar' between 'foo ' and ' baz')] baz"
-T
-
-* (regex-replace "(be)(nev)(o)(lent)"
-                          "benevolent: adj. generous, kind"
-                          #'(lambda (match &rest registers)
-                              (format nil "~A [~{~A~^.~}]" match registers))
-                          :simple-calls t)
-"benevolent [be.nev.o.lent]: adj. generous, kind"
-T
-
- - -


[Function] -
regex-replace-all regex target-string replacement &key start end preserve-case simple-calls element-type => string, matchp - -


-Like REGEX-REPLACE but replaces all matches. -
-* (regex-replace-all "(?i)fo+" "foo Fooo FOOOO bar" "frob" :preserve-case t)
-"frob Frob FROB bar"
-T
-
-* (regex-replace-all "(?i)f(o+)" "foo Fooo FOOOO bar" "fr\\1b" :preserve-case t)
-"froob Frooob FROOOOB bar"
-T
-
-* (let ((qp-regex (create-scanner "[\\x80-\\xff]")))
-    (defun encode-quoted-printable (string)
-      "Converts 8-bit string to quoted-printable representation."
-      ;; won't work for Corman Lisp because non-ASCII characters aren't 8-bit there
-      (flet ((convert (target-string start end match-start match-end reg-starts reg-ends)
-             (declare (ignore start end match-end reg-starts reg-ends))
-             (format nil "=~2,'0x" (char-code (char target-string match-start)))))
-        (regex-replace-all qp-regex string #'convert))))
-Converted ENCODE-QUOTED-PRINTABLE.
-ENCODE-QUOTED-PRINTABLE
-
-* (encode-quoted-printable "Fête Sørensen naïve Hühner Straße")
-"F=EAte S=F8rensen na=EFve H=FChner Stra=DFe"
-T
-
-* (let ((url-regex (create-scanner "[^a-zA-Z0-9_\\-.]")))
-    (defun url-encode (string)
-      "URL-encodes a string."
-      ;; won't work for Corman Lisp because non-ASCII characters aren't 8-bit there
-      (flet ((convert (target-string start end match-start match-end reg-starts reg-ends)
-             (declare (ignore start end match-end reg-starts reg-ends))
-             (format nil "%~2,'0x" (char-code (char target-string match-start)))))
-        (regex-replace-all url-regex string #'convert))))
-Converted URL-ENCODE.
-URL-ENCODE
-
-* (url-encode "Fête Sørensen naïve Hühner Straße")
-"F%EAte%20S%F8rensen%20na%EFve%20H%FChner%20Stra%DFe"
-T
-
-* (defun how-many (target-string start end match-start match-end reg-starts reg-ends)
-    (declare (ignore start end match-start match-end))
-    (format nil "~A" (- (svref reg-ends 0)
-                        (svref reg-starts 0))))
-HOW-MANY
-
-* (regex-replace-all "{(.+?)}"
-                              "foo{...}bar{.....}{..}baz{....}frob"
-                              (list "[" 'how-many " dots]"))
-"foo[3 dots]bar[5 dots][2 dots]baz[4 dots]frob"
-T
-
-* (let ((qp-regex (create-scanner "[\\x80-\\xff]")))
-    (defun encode-quoted-printable (string)
-      "Converts 8-bit string to quoted-printable representation.
-Version using SIMPLE-CALLS keyword argument."
-      ;; ;; won't work for Corman Lisp because non-ASCII characters aren't 8-bit there
-      (flet ((convert (match)
-               (format nil "=~2,'0x" (char-code (char match 0)))))
-        (regex-replace-all qp-regex string #'convert
-                                    :simple-calls t))))
-
-Converted ENCODE-QUOTED-PRINTABLE.
-ENCODE-QUOTED-PRINTABLE
-
-* (encode-quoted-printable "Fête Sørensen naïve Hühner Straße")
-"F=EAte S=F8rensen na=EFve H=FChner Stra=DFe"
-T
-
-* (defun how-many (match first-register)
-    (declare (ignore match))
-    (format nil "~A" (length first-register)))
-HOW-MANY
-
-* (regex-replace-all "{(.+?)}"
-                              "foo{...}bar{.....}{..}baz{....}frob"
-                              (list "[" 'how-many " dots]")
-                              :simple-calls t)
-
-"foo[3 dots]bar[5 dots][2 dots]baz[4 dots]frob"
-T
-
- -

Modifying scanner behaviour

- -


[Special variable] -
*property-resolver* - -


This is the designator for a function responsible -for resolving named properties like \p{Number}. If -CL-PPCRE encounters a \p or a \P it expects -to see an opening curly brace immediately afterwards and will then -read everything following that brace until it sees a closing curly -brace. The resolver function will be called with this string and must -return a corresponding unary test function which accepts a character -as its argument and returns a true value if and only if the character -has the named property. If the resolver returns NIL -instead, it signals that a property of that name is unknown. -
-* (labels ((char-code-odd-p (char)
-             (oddp (char-code char)))
-           (char-code-even-p (char)
-             (evenp (char-code char)))
-           (resolver (name)
-             (cond ((string= name "odd") #'char-code-odd-p)
-                   ((string= name "even") #'char-code-even-p)
-                   ((string= name "true") (constantly t))
-                   (t (error "Can't resolve ~S." name)))))
-    (let ((*property-resolver* #'resolver))
-      ;; quiz question - why do we need CREATE-SCANNER here?
-      (list (regex-replace-all (create-scanner "\\p{odd}") "abcd" "+")
-            (regex-replace-all (create-scanner "\\p{even}") "abcd" "+")
-            (regex-replace-all (create-scanner "\\p{true}") "abcd" "+"))))
-("+b+d" "a+c+" "++++")
-
-If the value -of *PROPERTY-RESOLVER* -is NIL (which is the default), \p and \P in regex -strings will simply be treated like p or P -as in CL-PPCRE 1.4.1 and earlier. Note that this does not affect -the validity of (:PROPERTY <name>) -parts in S-expression syntax. -
- - -


[Accessor] -
parse-tree-synonym symbol => parse-tree -
(setf (parse-tree-synonym symbol) new-parse-tree)
- -


-Any symbol (unless it's a keyword with a special meaning in parse -trees) can be made a "synonym", i.e. an abbreviation, for another parse -tree by this accessor. PARSE-TREE-SYNONYM returns NIL if symbol isn't a synonym yet. -
-* (parse-string "a*b+")
-(:SEQUENCE (:GREEDY-REPETITION 0 NIL #\a) (:GREEDY-REPETITION 1 NIL #\b))
-
-* (defun my-repetition (char min)
-    `(:greedy-repetition ,min nil ,char))
-MY-REPETITION
-
-* (setf (parse-tree-synonym 'a*) (my-repetition #\a 0))
-(:GREEDY-REPETITION 0 NIL #\a)
-
-* (setf (parse-tree-synonym 'b+) (my-repetition #\b 1))
-(:GREEDY-REPETITION 1 NIL #\b)
-
-* (let ((scanner (create-scanner '(:sequence a* b+))))
-    (dolist (string '("ab" "b" "aab" "a" "x"))
-      (print (scan scanner string)))
-    (values))
-0
-0
-0
-NIL
-NIL
-
-* (parse-tree-synonym 'a*)
-(:GREEDY-REPETITION 0 NIL #\a)
-
-* (parse-tree-synonym 'a+)
-NIL
-
- -


[Macro] -
define-parse-tree-synonym name parse-tree => parse-tree - -


-This is a convenience macro for parse tree synonyms defined as - -
-(defmacro define-parse-tree-synonym (name parse-tree)
-  `(eval-when (:compile-toplevel :load-toplevel :execute)
-     (setf (parse-tree-synonym ',name) ',parse-tree)))
-
- -so you can write code like this: - -
-(define-parse-tree-synonym a-z
-  (:char-class (:range #\a #\z) (:range #\A #\Z)))
-
-(define-parse-tree-synonym a-z*
-  (:greedy-repetition 0 nil a-z))
-
-(defun ascii-char-tester (string)
-  (scan '(:sequence :start-anchor a-z* :end-anchor)
-        string))
-
- -


[Special variable] -
*regex-char-code-limit* - -


This variable controls whether scanners take into -account all characters of your CL implementation or only those -the CHAR-CODE -of which is not larger than its value. The default is -CHAR-CODE-LIMIT, -and you might see significant speed and space improvements during -scanner creation if, say, your target strings only -contain ISO-8859-1 -characters and you're using a Lisp implementation -where CHAR-CODE-LIMIT has a value much higher -than 256. The test suite will automatically -set *REGEX-CHAR-CODE-LIMIT* to 256 while you're running -the default test. -

-Note: Due to the nature of LOAD-TIME-VALUE and the compiler macro for SCAN and other functions, some -scanners might be created in a null -lexical environment at load time or at compile time so be careful -to which value *REGEX-CHAR-CODE-LIMIT* is bound at that -time. The default value should always yield correct results unless you -play dirty tricks with implementation-dependent behaviour, though.

- -


[Special variable] -
*use-bmh-matchers* - -


Usually, the scanners created -by CREATE-SCANNER (or -implicitly by other functions and macros) will use the standard -function SEARCH -to check for constant strings at the start or end of the regular -expression. If *USE-BMH-MATCHERS* is true (the default -is NIL), -fast Boyer-Moore-Horspool -matchers will be used instead. This will usually be faster but -can make the scanners considerably bigger. Per BMH matcher - there -can be up to two per scanner - a fixnum array of -size *REGEX-CHAR-CODE-LIMIT* -is allocated and closed over. -

-Note: Due to the nature of LOAD-TIME-VALUE and the compiler macro for SCAN and other functions, some -scanners might be created in a null -lexical environment at load time or at compile time so be careful -to which value *USE-BMH-MATCHERS* is bound at that -time.

- -


[Special variable]
*optimize-char-classes* -


-Whether character classes should be compiled into look-ups into O(1) -data structures. This is usually fast but will be costly in terms of -scanner creation time and might be costly in terms of size if -*REGEX-CHAR-CODE-LIMIT* -is high. This value will be used as the kind -keyword argument -to CREATE-OPTIMIZED-TEST-FUNCTION -- see there for the possible non-NIL values. The default -value (NIL) should usually be fine unless you're sure -that you absolutely have to optimize some character classes for speed. -

-Note: Due to the nature -of LOAD-TIME-VALUE -and the compiler macro for SCAN -and other functions, some scanners might be created in -a null -lexical environment at load time or at compile time so be careful -to which value *OPTIMIZE-CHAR-CLASSES* is bound at that -time. -

- -


[Special variable] -
*allow-quoting* - -


-If this value is true (the default is NIL), -CL-PPCRE will support \Q and \E in regex -strings to quote (disable) metacharacters. Note that this entails a -slight performance penalty when creating scanners because (a copy of) the regex -string is modified (probably more than once) before it -is fed to the parser. Also, the parser's syntax error messages will complain -about the converted string and not about the original regex string. - -
-* (scan "^a+$" "a+")
-NIL
-
-* (let ((*allow-quoting* t))
-    ;;we use CREATE-SCANNER because of Lisps like SBCL that don't have an interpreter
-    (scan (create-scanner "^\\Qa+\\E$") "a+"))
-0
-2
-#()
-#()
-
-* (let ((*allow-quoting* t))
-    (scan (create-scanner "\\Qa()\\E(?#comment\\Q)a**b") "()ab"))
-
-Quantifier '*' not allowed at position 19 in string "a\\(\\)(?#commentQ)a**b"
-
- -Note how in the last example the regex string in the error message is -different from the first argument to the SCAN -function. Also note that the second example might be easier to -understand (and Lisp-ier) if you write it like this: - -
-* (scan '(:sequence :start-anchor
-                    "a+" ;; no quoting necessary
-                    :end-anchor)
-        "a+")
-0
-2
-#()
-#()
-
- -Make sure you also read the relevant section in "Bugs and problems." -

-Note: Due to the nature of LOAD-TIME-VALUE and the compiler macro for SCAN and other functions, some -scanners might be created in a null -lexical environment at load time or at compile time so be careful -to which value *ALLOW-QUOTING* is bound at that -time.

- - - -


[Special variable] -
*allow-named-registers* - -


-If this value is true (the default is NIL), -CL-PPCRE will support (?<name>"<regex>") and \k<name> in regex -strings to provide named registers and back-references as in AllegroCL. name is has to start with a letter and can contain only alphanumeric characters or minus sign. Names of registers are matched case-sensitively. -The parse tree syntax is not affected by the *ALLOW-NAMED-REGISTERS* switch, :NAMED-REGISTER and :BACK-REFERENCE forms are always resolved as expected. There are also no restrictions on register names in this syntax except that they have to be strings. - -
-;; Perl compatible mode (*ALLOW-NAMED-REGISTERS* is NIL)
-* (create-scanner "(?<reg>.*)")
-Character 'r' may not follow '(?<' at position 3 in string "(?<reg>)"
-
-;; just unescapes "\\k"
-* (parse-string "\\k<reg>")
-"k<reg>"
-
-* (setq *allow-named-registers* t)
-T
-
-* (create-scanner "((?<small>[a-z]*)(?<big>[A-Z]*))")
-#<CLOSURE (LAMBDA (STRING CL-PPCRE::START CL-PPCRE::END)) {AD75BFD}>
-(NIL "small" "big")
-
-;; the scanner doesn't capture any information about named groups -
-;; you have to store the second value returned from CREATE-SCANNER yourself
-* (scan * "aaaBBB")
-0
-6
-#(0 0 3)
-#(6 3 6)
-
-;; parse tree syntax
-* (parse-string "((?<small>[a-z]*)(?<big>[A-Z]*))")
-(:REGISTER
- (:SEQUENCE
-  (:NAMED-REGISTER "small"
-   (:GREEDY-REPETITION 0 NIL (:CHAR-CLASS (:RANGE #\a #\z))))
-  (:NAMED-REGISTER "big"
-   (:GREEDY-REPETITION 0 NIL (:CHAR-CLASS (:RANGE #\A #\Z))))))
-
-* (create-scanner *)
-#<CLOSURE (LAMBDA (STRING CL-PPCRE::START CL-PPCRE::END)) {B158E3D}>
-(NIL "small" "big")
-
-;; multiple-choice back-reference
-* (scan "^(?<reg>[ab])(?<reg>[12])\\k<reg>\\k<reg>$" "a1aa")
-0
-4
-#(0 1)
-#(1 2)
-
-* (scan "^(?<reg>[ab])(?<reg>[12])\\k<reg>\\k<reg>$" "a22a")
-0
-4
-#(0 1)
-#(1 2)
-
-;; demonstrating most-recently-seen-register-first property of back-reference;
-;; "greedy" regex (analogous to "aa?")
-* (scan "^(?<reg>)(?<reg>a)(\\k<reg>)" "a")
-0
-1
-#(0 0 1)
-#(0 1 1)
-
-* (scan "^(?<reg>)(?<reg>a)(\\k<reg>)" "aa")
-0
-2
-#(0 0 1)
-#(0 1 2)
-
-;; switched groups
-;; "lazy" regex (analogous to "aa??")
-* (scan "^(?<reg>a)(?<reg>)(\\k<reg>)" "a")
-0
-1
-#(0 1 1)
-#(1 1 1)
-
-;; scanner ignores the second "a"
-* (scan "^(?<reg>a)(?<reg>)(\\k<reg>)" "aa")
-0
-1
-#(0 1 1)
-#(1 1 1)
-
-;; "aa" will be matched only when forced by adding "$" at the end
-* (scan "^(?<reg>a)(?<reg>)(\\k<reg>)$" "aa")
-0
-2
-#(0 1 1)
-#(1 1 2)
-
-Note: Due to the nature of LOAD-TIME-VALUE and the compiler macro for SCAN and other functions, some -scanners might be created in a null -lexical environment at load time or at compile time so be careful -to which value *ALLOW-NAMED-REGISTERS* is bound at that -time.
- - -


[Special variable] -
*look-ahead-for-suffix* - -


Given a regular expression which has a constant -suffix, such as (a|b)+x whose constant suffix -is x, the scanners created -by CREATE-SCANNER will -attempt to optimize by searching for the position of the suffix prior -to performing the full match. In many cases, this is an optimization, -especially when backtracking is involved on small strings. However, in -other cases, such as incremental parsing of a very large string, this -can cause a degradation in performance, because the entire string is -searched for the suffix before an otherwise easy prefix match failure -can occur. The variable *LOOK-AHEAD-FOR-SUFFIX*, whose -default is T, can be used to selectively control this -behavior. -

-Note: Due to the nature of LOAD-TIME-VALUE and the compiler macro for SCAN and other functions, some -scanners might be created in a null -lexical environment at load time or at compile time so be careful -to which value *LOOK-AHEAD-FOR-SUFFIX* is bound at that -time.

- -

Miscellaneous

- -


[Function] -
parse-string string => parse-tree - -


Converts the regex -string string into a parse tree. -Note that the result is usually one possible way of creating an -equivalent parse tree and not necessarily the "canonical" one. -Specifically, the parse tree might contain redundant parts which are -supposed to be excised when a scanner is created. -
- -


[Function]
create-optimized-test-function test-function &key start end kind => function -


- -Given a unary test function test-function which is -applicable to characters returns a function which yields the same -boolean results for all characters with character codes -from start to (excluding) end. -If kind -is NIL, test-function will simply be -returned. Otherwise, kind should be one of: -
-
:HASH-TABLE
-
The function builds a hash table representing all characters which -satisfy the test and returns a closure which checks if a character is -in that hash table.
-
:CHARSET
-
Instead of a hash table the function uses a "charset" -which is a data structure using non-linear hashing and optimized to -represent (sparse) sets of characters in a fast and space-efficient -way (contributed by Nikodemus Siivola).
-
:CHARMAP
-
Instead of a hash table the function uses a bit vector to -represent the set of characters.
-
-You can also use :HASH-TABLE* or :CHARSET* -which are like :HASH-TABLE and :CHARSET but -use the complement of the set if the set contains more than half of -all characters between start -and end. This saves space but needs an additional -pass across all characters to create the data structure. There is no -corresponding :CHARMAP* kind as the bit vectors are -already created to cover the smallest possible interval which contains -either the set or its complement. -

-See also *OPTIMIZE-CHAR-CLASSES*. -

- -


[Function] -
quote-meta-chars string => string' - -


-This is a simple utility function used when *ALLOW-QUOTING* is -true. It returns a string STRING' where all -non-word characters (everything except ASCII characters, digits and -underline) of STRING are quoted by prepending a -backslash similar to Perl's quotemeta function. It always returns a fresh -string. -
-* (quote-meta-chars "[a-z]*")
-"\\[a\\-z\\]\\*"
-
- -


[Function] -
regex-apropos regex &optional packages &key case-insensitive => list - -


-Like APROPOS -but searches for interned symbols which match the regular expression -regex. The output is implementation-dependent. If -case-insensitive is true (which is the default) -and regex isn't already a scanner, a -case-insensitive scanner is used. -

-Here are examples for CMUCL: - -

-* *package*
-#<The COMMON-LISP-USER package, 16/21 internal, 0/9 external>
-
-* (defun foo (n &optional (k 0)) (+ 3 n k))
-FOO
-
-* (defparameter foo "bar")
-FOO
-
-* (defparameter |foobar| 42)
-|foobar|
-
-* (defparameter fooboo 43)
-FOOBOO
-
-* (defclass frobar () ())
-#<STANDARD-CLASS FROBAR {4874E625}>
-
-* (regex-apropos "foo(?:bar)?")
-FOO [variable] value: "bar"
-    [compiled function] (N &OPTIONAL (K 0))
-FOOBOO [variable] value: 43
-|foobar| [variable] value: 42
-
-* (regex-apropos "(?:foo|fro)bar")
-PCL::|COMMON-LISP-USER::FROBAR class predicate| [compiled closure]
-FROBAR [class] #<STANDARD-CLASS FROBAR {4874E625}>
-|foobar| [variable] value: 42
-
-* (regex-apropos "(?:foo|fro)bar" 'cl-user)
-FROBAR [class] #<STANDARD-CLASS FROBAR {4874E625}>
-|foobar| [variable] value: 42
-
-* (regex-apropos "(?:foo|fro)bar" '(pcl ext))
-PCL::|COMMON-LISP-USER::FROBAR class predicate| [compiled closure]
-
-* (regex-apropos "foo")
-FOO [variable] value: "bar"
-    [compiled function] (N &OPTIONAL (K 0))
-FOOBOO [variable] value: 43
-|foobar| [variable] value: 42
-
-* (regex-apropos "foo" nil :case-insensitive nil)
-|foobar| [variable] value: 42
-
- - - - -


[Function] -
regex-apropos-list regex &optional packages &key upcase => list - -


-Like APROPOS-LIST -but searches for interned symbols which match the regular expression -regex. If case-insensitive is -true (which is the default) and regex isn't -already a scanner, a case-insensitive scanner is used. -

-Example (continued from above): - -

-* (regex-apropos-list "foo(?:bar)?")
-(|foobar| FOOBOO FOO)
-
- -

Conditions

- -


[Condition type] -
ppcre-error - -


-Every error signaled by CL-PPCRE is of type -PPCRE-ERROR. This is a direct subtype of SIMPLE-ERROR -without any additional slots or options. -
- -


[Condition type] -
ppcre-invocation-error - -


-Errors of type PPCRE-INVOCATION-ERROR -are signaled if one of the exported functions of CL-PPCRE is called with wrong or -inconsistent arguments. This is a direct subtype of PPCRE-ERROR without any -additional slots or options. -
- -


[Condition type] -
ppcre-syntax-error - -


-An error of type PPCRE-SYNTAX-ERROR is signaled if -CL-PPCRE's parser encounters an error when trying to parse a regex -string or to convert a parse tree into its internal representation. -This is a direct subtype of PPCRE-ERROR with two additional -slots. These denote the regex string which HTML-PPCRE was parsing and -the position within the string where the error occurred. If the error -happens while CL-PPCRE is converting a parse tree, both of these slots -contain NIL. (See the next two entries on how to access -these slots.) -

-As many syntax errors can't be detected before the parser is at the -end of the stream, the row and column usually denote the last position -where the parser was happy and not the position where it gave up. - -

-* (handler-case
-    (scan "foo**x" "fooox")
-    (ppcre-syntax-error (condition)
-      (format t "Houston, we've got a problem with the string ~S:~%~
-                 Looks like something went wrong at position ~A.~%~
-                 The last message we received was \"~?\"."
-              (ppcre-syntax-error-string condition)
-              (ppcre-syntax-error-pos condition)
-              (simple-condition-format-control condition)
-              (simple-condition-format-arguments condition))
-      (values)))
-Houston, we've got a problem with the string "foo**x":
-Looks like something went wrong at position 4.
-The last message we received was "Quantifier '*' not allowed.".
-
-
- -


[Function] -
ppcre-syntax-error-string condition => string - -


-If condition is a condition of type PPCRE-SYNTAX-ERROR, this -function will return the string the parser was parsing when the error was -encountered (or NIL if the error happened while trying to -convert a parse tree). This might be particularly useful when *ALLOW-QUOTING* is -true because in this case the offending string might not be the one you gave to the CREATE-SCANNER function. -
- -


[Function] -
ppcre-syntax-error-pos condition => number - -


-If condition is a condition of type PPCRE-SYNTAX-ERROR, this -function will return the position within the string where the error -occurred (or NIL if the error happened while trying to -convert a parse tree). -
- -
 

Unicode properties

- -You can add support for Unicode properties to CL-PPCRE by loading -the CL-PPCRE-UNICODE system (which depends on CL-UNICODE): -
-(asdf:oos 'asdf:load-op :cl-ppcre-unicode)
-
-This will automatically -install UNICODE-PROPERTY-RESOLVER -as your property resolver. -

-See the CL-UNICODE -documentation for information about the supported Unicode properties -and how they are named. - -


[Function]
unicode-property-resolver property-name => function-or-nil -


-A property -resolver which understands Unicode properties using -CL-UNICODE's PROPERTY-TEST -function. This resolver is automatically installed -in *PROPERTY-RESOLVER* -when the CL-PPCRE-UNICODE system is loaded. -
-* (scan-to-strings "\\p{Script:Latin}+" "0+AB_*")
-"AB"
-#()
-
-Note that this symbol is exported from -the CL-PPCRE-UNICODE package and not from -the CL-PPCRE package. -
- - -
 

Filters

- -Because several users have asked for it, CL-PPCRE now offers -"filters" (see above for syntax) -which are basically arbitrary, user-defined functions that can act as -regex building blocks. Filters can only be used within parse trees, not within Perl regex -strings. -

-A filter is defined by its filter function which must be a -function of one argument. During the parsing process this function -might be called once or several times or it might not be called at -all. If it's called, its argument is an integer pos -which is the current position within the target string. The filter can -either return NIL (which means that the subexpression -represented by this filter didn't match) or an integer not smaller -than pos for success. A zero-length assertion -should return pos itself while a filter which -wants to consume N characters should return -(+ POS N). -

-If you supply the optional value length and it is -not NIL, then this is a promise to the regex engine that -your filter will always consume exactly -length characters. The regex engine might use this -information for optimization purposes but it is otherwise irrelevant -to the outcome of the matching process. -

-The filter function can access the following special variables from -its code body: -

- -
CL-PPCRE::*STRING*
-
The target (a string) of the current matching process.
- -
CL-PPCRE::*START-POS* and -CL-PPCRE::*END-POS*
-
The start and end (integers) indices -of the current matching process. These correspond to the -START and END keyword parameters -of SCAN.
- -
CL-PPCRE::*REAL-START-POS*
-
The initial starting -position. This is only relevant for repeated scans (as in DO-SCANS) where -CL-PPCRE::*START-POS* will be moved forward while -CL-PPCRE::*REAL-START-POS* won't. For normal scans the -value of this variable is NIL.
- -
CL-PPCRE::*REG-STARTS* and -CL-PPCRE::*REG-ENDS*
-
Two simple vectors which denote the -start and end indices of registers within the regular expression. The -first register is indexed by 0. If a register hasn't matched yet, -then its corresponding entry in CL-PPCRE::*REG-STARTS* is -NIL.
- -
- -These variables should be considered read-only. Do not change -these values unless you really know what you're doing! -

-Note that the names of the variables are not exported from the -CL-PPCRE package because there's no explicit guarantee -that they will be available in future releases. (Although after so -many years it is very unlikely that they'll go away...) -

-* (defun my-info-filter (pos)
-    "Show some info about the matching process."
-    (format t "Called at position ~A~%" pos)
-    (loop with dim = (array-dimension cl-ppcre::*reg-starts* 0)
-          for i below dim
-          for reg-start = (aref cl-ppcre::*reg-starts* i)
-          for reg-end = (aref cl-ppcre::*reg-ends* i)
-          do (format t "Register ~A is currently " (1+ i))
-          when reg-start
-               (write-string cl-ppcre::*string* nil
-            do (write-char #\')
-               (write-string cl-ppcre::*string* nil
-                     :start reg-start :end reg-end)
-               (write-char #\')
-          else
-            do (write-string "unbound")
-          do (terpri))
-    (terpri)
-    pos)
-MY-INFO-FILTER
-
-* (scan '(:sequence
-           (:register
-             (:greedy-repetition 0 nil
-                                 (:char-class (:range #\a #\z))))
-           (:filter my-info-filter 0) "X")
-        "bYcdeX")
-Called at position 1
-Register 1 is currently 'b'
-
-Called at position 0
-Register 1 is currently ''
-
-Called at position 1
-Register 1 is currently ''
-
-Called at position 5
-Register 1 is currently 'cde'
-
-2
-6
-#(2)
-#(5)
-
-* (scan '(:sequence
-           (:register
-             (:greedy-repetition 0 nil
-                                 (:char-class (:range #\a #\z))))
-           (:filter my-info-filter 0) "X")
-        "bYcdeZ")
-NIL
-
-* (defun my-weird-filter (pos)
-    "Only match at this point if either pos is odd and the character
-  we're looking at is lowercase or if pos is even and the next two
-  characters we're looking at are uppercase. Consume these characters if
-  there's a match."
-    (format t "Trying at position ~A~%" pos)
-    (cond ((and (oddp pos)
-                (< pos cl-ppcre::*end-pos*)
-                (lower-case-p (char cl-ppcre::*string* pos)))
-           (1+ pos))
-          ((and (evenp pos)
-                (< (1+ pos) cl-ppcre::*end-pos*)
-                (upper-case-p (char cl-ppcre::*string* pos))
-                (upper-case-p (char cl-ppcre::*string* (1+ pos))))
-           (+ pos 2))
-          (t nil)))
-MY-WEIRD-FILTER
-
-* (defparameter *weird-regex*
-                `(:sequence "+" (:filter ,#'my-weird-filter) "+"))
-*WEIRD-REGEX*
-
-* (scan *weird-regex* "+A++a+AA+")
-Trying at position 1
-Trying at position 3
-Trying at position 4
-Trying at position 6
-5
-9
-#()
-#()
-
-* (fmakunbound 'my-weird-filter)
-MY-WEIRD-FILTER
-
-* (scan *weird-regex* "+A++a+AA+")
-Trying at position 1
-Trying at position 3
-Trying at position 4
-Trying at position 6
-5
-9
-#()
-#()
-
- -Note that in the second call to SCAN our filter wasn't -invoked at all - it was optimized away by the regex engine because it -knew that it couldn't match. Also note that *WEIRD-REGEX* -still worked after we removed the global function definition of -MY-WEIRD-FILTER because the regular expression had -captured the original definition. - -

- -For more ideas about what you can do with filters see this -thread on the mailing list. - -
 

Compatibility with Perl

- -Depending on your Perl version you might encounter a couple of small -incompatibilities with Perl most of which aren't due to CL-PPCRE: - -

Empty strings instead of undef in $1, $2, etc.

- -(Cf. case #629 of perltestdata.) -This is a -bug in Perl 5.6.1 and earlier which has been fixed in 5.8.0. - -

Strange scoping of embedded modifiers

- -(Cf. case #430 of perltestdata.) -This is a -bug in Perl 5.6.1 and earlier which has been fixed in 5.8.0. - -

Inconsistent capturing of $1, $2, etc.

- -(Cf. case #662 of perltestdata.) -This is a -bug in Perl which hasn't been fixed yet. - -

Captured groups not available outside of look-aheads and look-behinds

- -(Cf. case #1439 of perltestdata.) -Well, OK, this ain't a Perl bug. I just can't quite understand why -captured groups should only be seen within the scope of a look-ahead -or look-behind. For the moment, CL-PPCRE and Perl agree to -disagree... :) - -

Alternations don't always work from left to right

- -(Cf. case #790 of perltestdata.) I -also think this a Perl bug but I currently have lost the drive to -report it. - -

Different names for Unicode properties

- -The names of Unicode properties are derived -from CL-UNICODE and might -differ slightly from the names in Perl. Most of them should be -identical, though. -Also, CL-UNICODE is based on -Unicode 5.1 while your installed Perl version might be not. - -

"\r" doesn't work with MCL

- -(Cf. case #9 of perltestdata.) For -some strange reason that I don't understand MCL translates -#\Return to (CODE-CHAR 10) while MacPerl -translates "\r" to (CODE-CHAR -13). Hmmm... - -

What about "\w"?

- -CL-PPCRE uses ALPHANUMERICP -to decide whether a character matches Perl's -"\w", so depending on your CL implementation -you might encounter differences between Perl and CL-PPCRE when -matching non-ASCII characters. - -
 

Bugs and problems

- -

"\Q" doesn't work, or does it?

- -In Perl the following code works as expected, i.e. it prints 1. -
-#!/usr/bin/perl -l
-
-$a = '\E*';
-print 1
-  if '\E*\E*' =~ /(?:\Q$a\E){2}/;
-
- -If you try to do something similar in CL-PPCRE, you get an error: - -
-* (let ((*allow-quoting* t)
-        (a "\\E*"))
-    (scan (concatenate 'string "(?:\\Q" a "\\E){2}") "\\E*\\E*"))
-Quantifier '*' not allowed at position 3 in string "(?:*\\E){2}"
-
- -The error message might give you a hint as to why this happens: -Because *ALLOW-QUOTING* -was true the concatenated string was pre-processed before it -was fed to CL-PPCRE's parser - the result of this pre-processing is -"(?:*\\E){2}" because the -"\\E" in the string A was taken to -be the end of the quoted section started by -"\\Q". This cannot happen in Perl due to its -complicated interpolation rules - see man perlop for -the scary details. It can happen in CL-PPCRE, though. -Bummer! -

-What gives? "\\Q...\\E" in CL-PPCRE should only -be used in literal strings. If you want to quote arbitrary strings, -try CL-INTERPOL or use QUOTE-META-CHARS: -

-* (let ((a "\\E*"))
-    (scan (concatenate 'string "(?:" (quote-meta-chars a) "){2}") "\\E*\\E*"))
-0
-6
-#()
-#()
-
-Or, even better and Lisp-ier, use the S-expression syntax instead - no need for quoting in this case: -
-* (let ((a "\\E*"))
-    (scan `(:greedy-repetition 2 2 ,a) "\\E*\\E*"))
-0
-6
-#()
-#()
-
- -

Backslashes may confuse you...

- -
-* (let ((a "y\\y"))
-    (scan a a))
-NIL
-
- -You didn't expect this to yield NIL, did you? Shouldn't something like (SCAN A A) always return a true value? No, because the first and the second argument to SCAN are handled differently: The first argument is fed to CL-PPCRE's parser and is treated like a Perl regular expression. In particular, the parser "sees" \y and converts it to y because \y has no special meaning in regular expressions. So, the regular expression is the constant string "yy". But the second argument isn't converted - it is left as is, i.e. it's equivalent to Perl's 'y\y'. In other words, this example would be equivalent to the Perl code - -
-'y\y' =~ /y\y/;
-
- -or to - -
-$a = 'y\y';
-$a =~ /$a/;
-
- -which should explain why it doesn't match. -

-Still confused? You might want to try CL-INTERPOL. - -
 

AllegroCL compatibility mode

- -Since autumn 2004 AllegroCL offers -a -new regular expression API with a syntax very similar to -CL-PPCRE. Although CL-PPCRE is quite fast already, AllegroCL's engine will -most likely be even faster (but only on AllegroCL, of course). However, you might want to -stick to CL-PPCRE because you have a "legacy" application or because -you want your code to be portable to other Lisp implementations. -Therefore, beginning from version 1.2.0, CL-PPCRE offers a -"compatibility mode" where you can continue using the CL-PPCRE API as -described above but deploy the AllegroCL regex -engine under the hood. (The details are: Calls to CREATE-SCANNER and SCAN are dispatched to their AllegroCL -counterparts EXCL:COMPILE-RE -and EXCL:MATCH-RE -while everything else is left as is.) -

-The advantage of this mode is that you'll get a much smaller image and -most likely faster code. (But note that CL-PPCRE needs to do a small amount of work to massage AllegroCL's output into the format expected by CL-PPCRE.) The downside is that your code won't be -fully compatible with CL-PPCRE anymore. Here are some of the -differences (most of which probably don't matter very often): -

-For more details about the AllegroCL engine and possible deviations from CL-PPCRE see the documentation at the Franz Inc. website. -

-To use the AllegroCL compatibility mode you have to -

-(push :use-acl-regexp2-engine *features*)
-
-before you compile CL-PPCRE. - -
 

Hints, comments, performance considerations

- -Here are, in no particular order, a couple of things about CL-PPCRE -and regular expressions in general that you might or might not want to -read. - -
    -
  • A lot of hackers (especially users of Perl and other scripting - languages) think that regular expressions are the greatest thing - since sliced bread and use it for almost everything. That is just - plain wrong. Other hackers (especially Lispers) tend to think that - regular expressions are the work of the devil and try to avoid them - at all cost. That's also wrong. Regular expressions are a handy - and useful addition to your toolkit which you should use when - appropriate - you should just try to figure out first if - they're appropriate for the task at hand. - -
  • If you're concerned about the string syntax of regular - expressions which can look like line noise and is really hard to - read for long expressions, consider using - CL-PPCRE's S-expression syntax - instead. It is less error-prone and you don't have to worry about - escaping characters. It is also easier to manipulate - programmatically. - -
  • For alternations, order is important. The general rule is that - the regex engine tries from left to right and tries to match as much - as possible. -
    -CL-USER 1 > (scan-to-strings "<=|<" "<=")
    -"<="
    -#()
    -
    -CL-USER 2 > (scan-to-strings "<|<=" "<=")
    -"<"
    -#()
    -
    - -
  • CL-PPCRE - uses compiler - macros to pre-compile scanners - at load - time if possible. This happens if the compiler can determine - that the regular expression (no matter if it's a string or an - S-expression) - is constant - at compile - time and is intended to save the time for creating scanners - at execution - time (probably creating the same scanner over and over in a - loop). Make sure you don't prevent the compiler from helping you. - For example, a definition like this one is usually not a good idea: -
    -(defun regex-match (regex target)
    -  ;; don't do that!
    -  (scan regex target))
    -
    - -
  • If you want to search for a substring in a large string or if - you search for the same string very - often, SCAN will usually be faster - than Common - Lisp's SEARCH - if you use BMH matchers. However, - this only makes sense if scanner creation time is not the - limiting factor, i.e. if the search target is very large or - if you're using the same scanner very often. - -
  • Complementary to the last hint, don't use regular - expressions for one-time searches for constant strings. That's a - terrible waste of resources. - -
  • *USE-BMH-MATCHERS* together with a large value for - *REGEX-CHAR-CODE-LIMIT* - can lead to huge scanners. - -
  • A character class is by default translated into a sequence of - tests exactly as you might expect. For - example, "[af-l\\d]" means to test if the character is - equal to #\a, then to test if it's - between #\f and #\l, then if it's a digit. - There's by default no attempt to remove redundancy (as - in "[a-ge-kf]") or to otherwise optimize these tests - for speed. However, you can play - with *OPTIMIZE-CHAR-CLASSES* - if you've identified character classes as a bottleneck and want to - make sure that you have O(1) test functions. - -
  • If you know that the expression you're looking for is anchored, - use anchors in your regex. This can help the engine a lot to make - your scanners more efficient. - -
  • In addition to anchors, constant strings at the start or end of a - regular expression can help the engine to quickly scan a string. - Note that for example "(a-d|aebf)" - and "ab(cd|ef)" are equivalent, but only the second - form has a constant start the regex engine can recognize. - -
  • Try to avoid alternations if possible or at least factor them - out as in the example above. - -
  • If neither anchors nor constant strings are in sight, maybe - "standalone" (sometimes also called "possessive") regular - expressions can be helpful. Try the following: -
    -(let ((target (make-string 10000 :initial-element #\a))
    -      (scanner-1 (create-scanner "a*\\d"))
    -      (scanner-2 (create-scanner "(?>a*)\\d")))
    -  (time (scan scanner-1 target))
    -  (time (scan scanner-2 target)))
    -
    - -
  • Consider using "single-line mode" - if it makes sense for your task. By default (following Perl's - practice), a dot means to search for any character except - line breaks. In single-line mode a dot searches for any - character which in some cases means that large parts of the target - can actually be skipped. This can be vastly more efficient for - large targets. - -
  • Don't use capturing register groups where a non-capturing group - would do, i.e. only use registers if you need to refer to - them later. If you use a register, each scan process needs to - allocate space for it and update its contents (possibly many times) - until it's finished. (In Perl parlance - use "(?:foo)" instead of - "(foo)" whenever possible.) - -
  • In addition to what has been said in the last hint, note that - Perl semantics force the regex engine to report the last - match for each register. This implies for example - that "([a-c])+" and "[a-c]*([a-c])" have - exactly the same semantics but completely different performance - characteristics. (Actually, in some cases CL-PPCRE automatically - converts expressions from the first type into the second type. - That's not always possible, though, and you shouldn't rely on it.) - -
  • By default, repetitions are "greedy" in Perl (and thus in - CL-PPCRE). This has an impact on performance and also on the actual - outcome of a scan. Look at your repetitions and ponder if a greedy - repetition is really what you want. -
- -
 

Acknowledgements

- -Although I didn't use their code, I was heavily inspired by looking at -the Scheme/CL regex implementations of Dorai -Sitaram and Michael -Parker. Also, the nice folks from CMUCL's mailing list as well -as the output of Perl's use re "debug" pragma -have been very helpful in optimizing the scanners created by CL-PPCRE. - -

The list of people who participated in this project in one way or -the other has grown too long to maintain it here. See the ChangeLog -for all the people who helped with patches, bug reports, or in other -ways. Thanks to all of them! - -

-Thanks to the guys at -"Café -Olé" -in Hamburg where I -wrote most of the 0.1.0 release and thanks to my wife for lending -me her PowerBook to test early versions of CL-PPCRE with MCL and -OpenMCL. - -

-$Header: /usr/local/cvsrep/cl-ppcre/doc/index.html,v 1.200 2009/10/28 07:36:31 edi Exp $ -

BACK TO THE HOMEPAGE - - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/errors.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/errors.lisp deleted file mode 100644 index edb7858..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/errors.lisp +++ /dev/null @@ -1,84 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/errors.lisp,v 1.22 2009/09/17 19:17:31 edi Exp $ - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre) - -(defvar *syntax-error-string* nil - "The string which caused the syntax error.") - -(define-condition ppcre-error (simple-error) - () - (:documentation "All errors signaled by CL-PPCRE are of -this type.")) - -(define-condition ppcre-syntax-error (ppcre-error) - ((string :initarg :string - :reader ppcre-syntax-error-string) - (pos :initarg :pos - :reader ppcre-syntax-error-pos)) - (:default-initargs - :pos nil - :string *syntax-error-string*) - (:report (lambda (condition stream) - (format stream "~?~@[ at position ~A~]~@[ in string ~S~]" - (simple-condition-format-control condition) - (simple-condition-format-arguments condition) - (ppcre-syntax-error-pos condition) - (ppcre-syntax-error-string condition)))) - (:documentation "Signaled if CL-PPCRE's parser encounters an error -when trying to parse a regex string or to convert a parse tree into -its internal representation.")) - -(setf (documentation 'ppcre-syntax-error-string 'function) - "Returns the string the parser was parsing when the error was -encountered \(or NIL if the error happened while trying to convert a -parse tree).") - -(setf (documentation 'ppcre-syntax-error-pos 'function) - "Returns the position within the string where the error occurred -\(or NIL if the error happened while trying to convert a parse tree") - -(define-condition ppcre-invocation-error (ppcre-error) - () - (:documentation "Signaled when CL-PPCRE functions are -invoked with wrong arguments.")) - -(defmacro signal-syntax-error* (pos format-control &rest format-arguments) - `(error 'ppcre-syntax-error - :pos ,pos - :format-control ,format-control - :format-arguments (list ,@format-arguments))) - -(defmacro signal-syntax-error (format-control &rest format-arguments) - `(signal-syntax-error* nil ,format-control ,@format-arguments)) - -(defmacro signal-invocation-error (format-control &rest format-arguments) - `(error 'ppcre-invocation-error - :format-control ,format-control - :format-arguments (list ,@format-arguments))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/lexer.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/lexer.lisp deleted file mode 100644 index 3cdc343..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/lexer.lisp +++ /dev/null @@ -1,738 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/lexer.lisp,v 1.35 2009/09/17 19:17:31 edi Exp $ - -;;; The lexer's responsibility is to convert the regex string into a -;;; sequence of tokens which are in turn consumed by the parser. -;;; -;;; The lexer is aware of Perl's 'extended mode' and it also 'knows' -;;; (with a little help from the parser) how many register groups it -;;; has opened so far. (The latter is necessary for interpreting -;;; strings like "\\10" correctly.) - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre) - -(declaim (inline map-char-to-special-class)) -(defun map-char-to-special-char-class (chr) - (declare #.*standard-optimize-settings*) - "Maps escaped characters like \"\\d\" to the tokens which represent -their associated character classes." - (case chr - ((#\d) - :digit-class) - ((#\D) - :non-digit-class) - ((#\w) - :word-char-class) - ((#\W) - :non-word-char-class) - ((#\s) - :whitespace-char-class) - ((#\S) - :non-whitespace-char-class))) - -(declaim (inline make-lexer-internal)) -(defstruct (lexer (:constructor make-lexer-internal)) - "LEXER structures are used to hold the regex string which is -currently lexed and to keep track of the lexer's state." - (str "" :type string :read-only t) - (len 0 :type fixnum :read-only t) - (reg 0 :type fixnum) - (pos 0 :type fixnum) - (last-pos nil :type list)) - -(defun make-lexer (string) - (declare #-:genera (string string)) - (make-lexer-internal :str (maybe-coerce-to-simple-string string) - :len (length string))) - -(declaim (inline end-of-string-p)) -(defun end-of-string-p (lexer) - (declare #.*standard-optimize-settings*) - "Tests whether we're at the end of the regex string." - (<= (lexer-len lexer) - (lexer-pos lexer))) - -(declaim (inline looking-at-p)) -(defun looking-at-p (lexer chr) - (declare #.*standard-optimize-settings*) - "Tests whether the next character the lexer would see is CHR. -Does not respect extended mode." - (and (not (end-of-string-p lexer)) - (char= (schar (lexer-str lexer) (lexer-pos lexer)) - chr))) - -(declaim (inline next-char-non-extended)) -(defun next-char-non-extended (lexer) - (declare #.*standard-optimize-settings*) - "Returns the next character which is to be examined and updates the -POS slot. Does not respect extended mode." - (cond ((end-of-string-p lexer) nil) - (t (prog1 - (schar (lexer-str lexer) (lexer-pos lexer)) - (incf (lexer-pos lexer)))))) - -(defun next-char (lexer) - (declare #.*standard-optimize-settings*) - "Returns the next character which is to be examined and updates the -POS slot. Respects extended mode, i.e. whitespace, comments, and also -nested comments are skipped if applicable." - (let ((next-char (next-char-non-extended lexer)) - last-loop-pos) - (loop - ;; remember where we started - (setq last-loop-pos (lexer-pos lexer)) - ;; first we look for nested comments like (?#foo) - (when (and next-char - (char= next-char #\() - (looking-at-p lexer #\?)) - (incf (lexer-pos lexer)) - (cond ((looking-at-p lexer #\#) - ;; must be a nested comment - so we have to search for - ;; the closing parenthesis - (let ((error-pos (- (lexer-pos lexer) 2))) - (unless - ;; loop 'til ')' or end of regex string and - ;; return NIL if ')' wasn't encountered - (loop for skip-char = next-char - then (next-char-non-extended lexer) - while (and skip-char - (char/= skip-char #\))) - finally (return skip-char)) - (signal-syntax-error* error-pos "Comment group not closed."))) - (setq next-char (next-char-non-extended lexer))) - (t - ;; undo effect of previous INCF if we didn't see a # - (decf (lexer-pos lexer))))) - (when *extended-mode-p* - ;; now - if we're in extended mode - we skip whitespace and - ;; comments; repeat the following loop while we look at - ;; whitespace or #\# - (loop while (and next-char - (or (char= next-char #\#) - (whitespacep next-char))) - do (setq next-char - (if (char= next-char #\#) - ;; if we saw a comment marker skip until - ;; we're behind #\Newline... - (loop for skip-char = next-char - then (next-char-non-extended lexer) - while (and skip-char - (char/= skip-char #\Newline)) - finally (return (next-char-non-extended lexer))) - ;; ...otherwise (whitespace) skip until we - ;; see the next non-whitespace character - (loop for skip-char = next-char - then (next-char-non-extended lexer) - while (and skip-char - (whitespacep skip-char)) - finally (return skip-char)))))) - ;; if the position has moved we have to repeat our tests - ;; because of cases like /^a (?#xxx) (?#yyy) {3}c/x which - ;; would be equivalent to /^a{3}c/ in Perl - (unless (> (lexer-pos lexer) last-loop-pos) - (return next-char))))) - -(declaim (inline fail)) -(defun fail (lexer) - (declare #.*standard-optimize-settings*) - "Moves (LEXER-POS LEXER) back to the last position stored in -\(LEXER-LAST-POS LEXER) and pops the LAST-POS stack." - (unless (lexer-last-pos lexer) - (signal-syntax-error "LAST-POS stack of LEXER ~A is empty." lexer)) - (setf (lexer-pos lexer) (pop (lexer-last-pos lexer))) - nil) - -(defun get-number (lexer &key (radix 10) max-length no-whitespace-p) - (declare #.*standard-optimize-settings*) - "Read and consume the number the lexer is currently looking at and -return it. Returns NIL if no number could be identified. -RADIX is used as in PARSE-INTEGER. If MAX-LENGTH is not NIL we'll read -at most the next MAX-LENGTH characters. If NO-WHITESPACE-P is not NIL -we don't tolerate whitespace in front of the number." - (when (or (end-of-string-p lexer) - (and no-whitespace-p - (whitespacep (schar (lexer-str lexer) (lexer-pos lexer))))) - (return-from get-number nil)) - (multiple-value-bind (integer new-pos) - (parse-integer (lexer-str lexer) - :start (lexer-pos lexer) - :end (if max-length - (let ((end-pos (+ (lexer-pos lexer) - (the fixnum max-length))) - (lexer-len (lexer-len lexer))) - (if (< end-pos lexer-len) - end-pos - lexer-len)) - (lexer-len lexer)) - :radix radix - :junk-allowed t) - (cond ((and integer (>= (the fixnum integer) 0)) - (setf (lexer-pos lexer) new-pos) - integer) - (t nil)))) - -(declaim (inline try-number)) -(defun try-number (lexer &key (radix 10) max-length no-whitespace-p) - (declare #.*standard-optimize-settings*) - "Like GET-NUMBER but won't consume anything if no number is seen." - ;; remember current position - (push (lexer-pos lexer) (lexer-last-pos lexer)) - (let ((number (get-number lexer - :radix radix - :max-length max-length - :no-whitespace-p no-whitespace-p))) - (or number (fail lexer)))) - -(declaim (inline make-char-from-code)) -(defun make-char-from-code (number error-pos) - (declare #.*standard-optimize-settings*) - "Create character from char-code NUMBER. NUMBER can be NIL -which is interpreted as 0. ERROR-POS is the position where -the corresponding number started within the regex string." - ;; only look at rightmost eight bits in compliance with Perl - (let ((code (logand #o377 (the fixnum (or number 0))))) - (or (and (< code char-code-limit) - (code-char code)) - (signal-syntax-error* error-pos "No character for hex-code ~X." number)))) - -(defun unescape-char (lexer) - (declare #.*standard-optimize-settings*) - "Convert the characters\(s) following a backslash into a token -which is returned. This function is to be called when the backslash -has already been consumed. Special character classes like \\W are -handled elsewhere." - (when (end-of-string-p lexer) - (signal-syntax-error "String ends with backslash.")) - (let ((chr (next-char-non-extended lexer))) - (case chr - ((#\E) - ;; if \Q quoting is on this is ignored, otherwise it's just an - ;; #\E - (if *allow-quoting* - :void - #\E)) - ((#\c) - ;; \cx means control-x in Perl - (let ((next-char (next-char-non-extended lexer))) - (unless next-char - (signal-syntax-error* (lexer-pos lexer) "Character missing after '\\c'")) - (code-char (logxor #x40 (char-code (char-upcase next-char)))))) - ((#\x) - ;; \x should be followed by a hexadecimal char code, - ;; two digits or less - (let* ((error-pos (lexer-pos lexer)) - (number (get-number lexer :radix 16 :max-length 2 :no-whitespace-p t))) - ;; note that it is OK if \x is followed by zero digits - (make-char-from-code number error-pos))) - ((#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) - ;; \x should be followed by an octal char code, - ;; three digits or less - (let* ((error-pos (decf (lexer-pos lexer))) - (number (get-number lexer :radix 8 :max-length 3))) - (make-char-from-code number error-pos))) - ;; the following five character names are 'semi-standard' - ;; according to the CLHS but I'm not aware of any implementation - ;; that doesn't implement them - ((#\t) - #\Tab) - ((#\n) - #\Newline) - ((#\r) - #\Return) - ((#\f) - #\Page) - ((#\b) - #\Backspace) - ((#\a) - (code-char 7)) ; ASCII bell - ((#\e) - (code-char 27)) ; ASCII escape - (otherwise - ;; all other characters aren't affected by a backslash - chr)))) - -(defun read-char-property (lexer first-char) - (declare #.*standard-optimize-settings*) - (unless (eql (next-char-non-extended lexer) #\{) - (signal-syntax-error* (lexer-pos lexer) "Expected left brace after \\~A." first-char)) - (let ((name (with-output-to-string (out nil :element-type - #+:lispworks 'lw:simple-char #-:lispworks 'character) - (loop - (let ((char (or (next-char-non-extended lexer) - (signal-syntax-error "Unexpected EOF after \\~A{." first-char)))) - (when (char= char #\}) - (return)) - (write-char char out)))))) - (list (if (char= first-char #\p) :property :inverted-property) - name))) - -(defun collect-char-class (lexer) - "Reads and consumes characters from regex string until a right -bracket is seen. Assembles them into a list \(which is returned) of -characters, character ranges, like \(:RANGE #\\A #\\E) for a-e, and -tokens representing special character classes." - (declare #.*standard-optimize-settings*) - (let ((start-pos (lexer-pos lexer)) ; remember start for error message - hyphen-seen - last-char - list) - (flet ((handle-char (c) - "Do the right thing with character C depending on whether -we're inside a range or not." - (cond ((and hyphen-seen last-char) - (setf (car list) (list :range last-char c) - last-char nil)) - (t - (push c list) - (setq last-char c))) - (setq hyphen-seen nil))) - (loop for first = t then nil - for c = (next-char-non-extended lexer) - ;; leave loop if at end of string - while c - do (cond - ((char= c #\\) - ;; we've seen a backslash - (let ((next-char (next-char-non-extended lexer))) - (case next-char - ((#\d #\D #\w #\W #\s #\S) - ;; a special character class - (push (map-char-to-special-char-class next-char) list) - ;; if the last character was a hyphen - ;; just collect it literally - (when hyphen-seen - (push #\- list)) - ;; if the next character is a hyphen do the same - (when (looking-at-p lexer #\-) - (push #\- list) - (incf (lexer-pos lexer))) - (setq hyphen-seen nil)) - ((#\P #\p) - ;; maybe a character property - (cond ((null *property-resolver*) - (handle-char next-char)) - (t - (push (read-char-property lexer next-char) list) - ;; if the last character was a hyphen - ;; just collect it literally - (when hyphen-seen - (push #\- list)) - ;; if the next character is a hyphen do the same - (when (looking-at-p lexer #\-) - (push #\- list) - (incf (lexer-pos lexer))) - (setq hyphen-seen nil)))) - ((#\E) - ;; if \Q quoting is on we ignore \E, - ;; otherwise it's just a plain #\E - (unless *allow-quoting* - (handle-char #\E))) - (otherwise - ;; otherwise unescape the following character(s) - (decf (lexer-pos lexer)) - (handle-char (unescape-char lexer)))))) - (first - ;; the first character must not be a right bracket - ;; and isn't treated specially if it's a hyphen - (handle-char c)) - ((char= c #\]) - ;; end of character class - ;; make sure we collect a pending hyphen - (when hyphen-seen - (setq hyphen-seen nil) - (handle-char #\-)) - ;; reverse the list to preserve the order intended - ;; by the author of the regex string - (return-from collect-char-class (nreverse list))) - ((and (char= c #\-) - last-char - (not hyphen-seen)) - ;; if the last character was 'just a character' - ;; we expect to be in the middle of a range - (setq hyphen-seen t)) - ((char= c #\-) - ;; otherwise this is just an ordinary hyphen - (handle-char #\-)) - (t - ;; default case - just collect the character - (handle-char c)))) - ;; we can only exit the loop normally if we've reached the end - ;; of the regex string without seeing a right bracket - (signal-syntax-error* start-pos "Missing right bracket to close character class.")))) - -(defun maybe-parse-flags (lexer) - (declare #.*standard-optimize-settings*) - "Reads a sequence of modifiers \(including #\\- to reverse their -meaning) and returns a corresponding list of \"flag\" tokens. The -\"x\" modifier is treated specially in that it dynamically modifies -the behaviour of the lexer itself via the special variable -*EXTENDED-MODE-P*." - (prog1 - (loop with set = t - for chr = (next-char-non-extended lexer) - unless chr - do (signal-syntax-error "Unexpected end of string.") - while (find chr "-imsx" :test #'char=) - ;; the first #\- will invert the meaning of all modifiers - ;; following it - if (char= chr #\-) - do (setq set nil) - else if (char= chr #\x) - do (setq *extended-mode-p* set) - else collect (if set - (case chr - ((#\i) - :case-insensitive-p) - ((#\m) - :multi-line-mode-p) - ((#\s) - :single-line-mode-p)) - (case chr - ((#\i) - :case-sensitive-p) - ((#\m) - :not-multi-line-mode-p) - ((#\s) - :not-single-line-mode-p)))) - (decf (lexer-pos lexer)))) - -(defun get-quantifier (lexer) - (declare #.*standard-optimize-settings*) - "Returns a list of two values (min max) if what the lexer is looking -at can be interpreted as a quantifier. Otherwise returns NIL and -resets the lexer to its old position." - ;; remember starting position for FAIL and UNGET-TOKEN functions - (push (lexer-pos lexer) (lexer-last-pos lexer)) - (let ((next-char (next-char lexer))) - (case next-char - ((#\*) - ;; * (Kleene star): match 0 or more times - '(0 nil)) - ((#\+) - ;; +: match 1 or more times - '(1 nil)) - ((#\?) - ;; ?: match 0 or 1 times - '(0 1)) - ((#\{) - ;; one of - ;; {n}: match exactly n times - ;; {n,}: match at least n times - ;; {n,m}: match at least n but not more than m times - ;; note that anything not matching one of these patterns will - ;; be interpreted literally - even whitespace isn't allowed - (let ((num1 (get-number lexer :no-whitespace-p t))) - (if num1 - (let ((next-char (next-char-non-extended lexer))) - (case next-char - ((#\,) - (let* ((num2 (get-number lexer :no-whitespace-p t)) - (next-char (next-char-non-extended lexer))) - (case next-char - ((#\}) - ;; this is the case {n,} (NUM2 is NIL) or {n,m} - (list num1 num2)) - (otherwise - (fail lexer))))) - ((#\}) - ;; this is the case {n} - (list num1 num1)) - (otherwise - (fail lexer)))) - ;; no number following left curly brace, so we treat it - ;; like a normal character - (fail lexer)))) - ;; cannot be a quantifier - (otherwise - (fail lexer))))) - -(defun parse-register-name-aux (lexer) - "Reads and returns the name in a named register group. It is -assumed that the starting #\< character has already been read. The -closing #\> will also be consumed." - ;; we have to look for an ending > character now - (let ((end-name (position #\> - (lexer-str lexer) - :start (lexer-pos lexer) - :test #'char=))) - (unless end-name - ;; there has to be > somewhere, syntax error otherwise - (signal-syntax-error* (1- (lexer-pos lexer)) "Opening #\< in named group has no closing #\>.")) - (let ((name (subseq (lexer-str lexer) - (lexer-pos lexer) - end-name))) - (unless (every #'(lambda (char) - (or (alphanumericp char) - (char= #\- char))) - name) - ;; register name can contain only alphanumeric characters or #\- - (signal-syntax-error* (lexer-pos lexer) "Invalid character in named register group.")) - ;; advance lexer beyond "" part - (setf (lexer-pos lexer) (1+ end-name)) - name))) - -(declaim (inline unget-token)) -(defun unget-token (lexer) - (declare #.*standard-optimize-settings*) - "Moves the lexer back to the last position stored in the LAST-POS stack." - (if (lexer-last-pos lexer) - (setf (lexer-pos lexer) - (pop (lexer-last-pos lexer))) - (error "No token to unget \(this should not happen)"))) - -(defun get-token (lexer) - (declare #.*standard-optimize-settings*) - "Returns and consumes the next token from the regex string \(or NIL)." - ;; remember starting position for UNGET-TOKEN function - (push (lexer-pos lexer) - (lexer-last-pos lexer)) - (let ((next-char (next-char lexer))) - (cond (next-char - (case next-char - ;; the easy cases first - the following six characters - ;; always have a special meaning and get translated - ;; into tokens immediately - ((#\)) - :close-paren) - ((#\|) - :vertical-bar) - ((#\?) - :question-mark) - ((#\.) - :everything) - ((#\^) - :start-anchor) - ((#\$) - :end-anchor) - ((#\+ #\*) - ;; quantifiers will always be consumend by - ;; GET-QUANTIFIER, they must not appear here - (signal-syntax-error* (1- (lexer-pos lexer)) "Quantifier '~A' not allowed." next-char)) - ((#\{) - ;; left brace isn't a special character in it's own - ;; right but we must check if what follows might - ;; look like a quantifier - (let ((this-pos (lexer-pos lexer)) - (this-last-pos (lexer-last-pos lexer))) - (unget-token lexer) - (when (get-quantifier lexer) - (signal-syntax-error* (car this-last-pos) - "Quantifier '~A' not allowed." - (subseq (lexer-str lexer) - (car this-last-pos) - (lexer-pos lexer)))) - (setf (lexer-pos lexer) this-pos - (lexer-last-pos lexer) this-last-pos) - next-char)) - ((#\[) - ;; left bracket always starts a character class - (cons (cond ((looking-at-p lexer #\^) - (incf (lexer-pos lexer)) - :inverted-char-class) - (t - :char-class)) - (collect-char-class lexer))) - ((#\\) - ;; backslash might mean different things so we have - ;; to peek one char ahead: - (let ((next-char (next-char-non-extended lexer))) - (case next-char - ((#\A) - :modeless-start-anchor) - ((#\Z) - :modeless-end-anchor) - ((#\z) - :modeless-end-anchor-no-newline) - ((#\b) - :word-boundary) - ((#\B) - :non-word-boundary) - ((#\k) - (cond ((and *allow-named-registers* - (looking-at-p lexer #\<)) - ;; back-referencing a named register - (incf (lexer-pos lexer)) - (list :back-reference - (parse-register-name-aux lexer))) - (t - ;; false alarm, just unescape \k - #\k))) - ((#\d #\D #\w #\W #\s #\S) - ;; these will be treated like character classes - (map-char-to-special-char-class next-char)) - ((#\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) - ;; uh, a digit... - (let* ((old-pos (decf (lexer-pos lexer))) - ;; ...so let's get the whole number first - (backref-number (get-number lexer))) - (declare (fixnum backref-number)) - (cond ((and (> backref-number (lexer-reg lexer)) - (<= 10 backref-number)) - ;; \10 and higher are treated as octal - ;; character codes if we haven't - ;; opened that much register groups - ;; yet - (setf (lexer-pos lexer) old-pos) - ;; re-read the number from the old - ;; position and convert it to its - ;; corresponding character - (make-char-from-code (get-number lexer :radix 8 :max-length 3) - old-pos)) - (t - ;; otherwise this must refer to a - ;; backreference - (list :back-reference backref-number))))) - ((#\0) - ;; this always means an octal character code - ;; (at most three digits) - (let ((old-pos (decf (lexer-pos lexer)))) - (make-char-from-code (get-number lexer :radix 8 :max-length 3) - old-pos))) - ((#\P #\p) - ;; might be a named property - (cond (*property-resolver* (read-char-property lexer next-char)) - (t next-char))) - (otherwise - ;; in all other cases just unescape the - ;; character - (decf (lexer-pos lexer)) - (unescape-char lexer))))) - ((#\() - ;; an open parenthesis might mean different things - ;; depending on what follows... - (cond ((looking-at-p lexer #\?) - ;; this is the case '(?' (and probably more behind) - (incf (lexer-pos lexer)) - ;; we have to check for modifiers first - ;; because a colon might follow - (let* ((flags (maybe-parse-flags lexer)) - (next-char (next-char-non-extended lexer))) - ;; modifiers are only allowed if a colon - ;; or a closing parenthesis are following - (when (and flags - (not (find next-char ":)" :test #'char=))) - (signal-syntax-error* (car (lexer-last-pos lexer)) - "Sequence '~A' not recognized." - (subseq (lexer-str lexer) - (car (lexer-last-pos lexer)) - (lexer-pos lexer)))) - (case next-char - ((nil) - ;; syntax error - (signal-syntax-error "End of string following '(?'.")) - ((#\)) - ;; an empty group except for the flags - ;; (if there are any) - (or (and flags - (cons :flags flags)) - :void)) - ((#\() - ;; branch - :open-paren-paren) - ((#\>) - ;; standalone - :open-paren-greater) - ((#\=) - ;; positive look-ahead - :open-paren-equal) - ((#\!) - ;; negative look-ahead - :open-paren-exclamation) - ((#\:) - ;; non-capturing group - return flags as - ;; second value - (values :open-paren-colon flags)) - ((#\<) - ;; might be a look-behind assertion or a named group, so - ;; check next character - (let ((next-char (next-char-non-extended lexer))) - (cond ((and next-char - (alpha-char-p next-char)) - ;; we have encountered a named group - ;; are we supporting register naming? - (unless *allow-named-registers* - (signal-syntax-error* (1- (lexer-pos lexer)) - "Character '~A' may not follow '(?<' (because ~a = NIL)" - next-char - '*allow-named-registers*)) - ;; put the letter back - (decf (lexer-pos lexer)) - ;; named group - :open-paren-less-letter) - (t - (case next-char - ((#\=) - ;; positive look-behind - :open-paren-less-equal) - ((#\!) - ;; negative look-behind - :open-paren-less-exclamation) - ((#\)) - ;; Perl allows "(?<)" and treats - ;; it like a null string - :void) - ((nil) - ;; syntax error - (signal-syntax-error "End of string following '(?<'.")) - (t - ;; also syntax error - (signal-syntax-error* (1- (lexer-pos lexer)) - "Character '~A' may not follow '(?<'." - next-char ))))))) - (otherwise - (signal-syntax-error* (1- (lexer-pos lexer)) - "Character '~A' may not follow '(?'." - next-char))))) - (t - ;; if next-char was not #\? (this is within - ;; the first COND), we've just seen an opening - ;; parenthesis and leave it like that - :open-paren))) - (otherwise - ;; all other characters are their own tokens - next-char))) - ;; we didn't get a character (this if the "else" branch from - ;; the first IF), so we don't return a token but NIL - (t - (pop (lexer-last-pos lexer)) - nil)))) - -(declaim (inline start-of-subexpr-p)) -(defun start-of-subexpr-p (lexer) - (declare #.*standard-optimize-settings*) - "Tests whether the next token can start a valid sub-expression, i.e. -a stand-alone regex." - (let* ((pos (lexer-pos lexer)) - (next-char (next-char lexer))) - (not (or (null next-char) - (prog1 - (member (the character next-char) - '(#\) #\|) - :test #'char=) - (setf (lexer-pos lexer) pos)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/optimize.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/optimize.lisp deleted file mode 100644 index d538733..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/optimize.lisp +++ /dev/null @@ -1,578 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/optimize.lisp,v 1.36 2009/09/17 19:17:31 edi Exp $ - -;;; This file contains optimizations which can be applied to converted -;;; parse trees. - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre) - -(defgeneric flatten (regex) - (declare #.*standard-optimize-settings*) - (:documentation "Merges adjacent sequences and alternations, i.e. it -transforms # # #>> to -# # #>. This is a destructive -operation on REGEX.")) - -(defmethod flatten ((seq seq)) - (declare #.*standard-optimize-settings*) - ;; this looks more complicated than it is because we modify SEQ in - ;; place to avoid unnecessary consing - (let ((elements-rest (elements seq))) - (loop - (unless elements-rest - (return)) - (let ((flattened-element (flatten (car elements-rest))) - (next-elements-rest (cdr elements-rest))) - (cond ((typep flattened-element 'seq) - ;; FLATTENED-ELEMENT is a SEQ object, so we "splice" - ;; it into out list of elements - (let ((flattened-element-elements - (elements flattened-element))) - (setf (car elements-rest) - (car flattened-element-elements) - (cdr elements-rest) - (nconc (cdr flattened-element-elements) - (cdr elements-rest))))) - (t - ;; otherwise we just replace the current element with - ;; its flattened counterpart - (setf (car elements-rest) flattened-element))) - (setq elements-rest next-elements-rest)))) - (let ((elements (elements seq))) - (cond ((cadr elements) - seq) - ((cdr elements) - (first elements)) - (t (make-instance 'void))))) - -(defmethod flatten ((alternation alternation)) - (declare #.*standard-optimize-settings*) - ;; same algorithm as above - (let ((choices-rest (choices alternation))) - (loop - (unless choices-rest - (return)) - (let ((flattened-choice (flatten (car choices-rest))) - (next-choices-rest (cdr choices-rest))) - (cond ((typep flattened-choice 'alternation) - (let ((flattened-choice-choices - (choices flattened-choice))) - (setf (car choices-rest) - (car flattened-choice-choices) - (cdr choices-rest) - (nconc (cdr flattened-choice-choices) - (cdr choices-rest))))) - (t - (setf (car choices-rest) flattened-choice))) - (setq choices-rest next-choices-rest)))) - (let ((choices (choices alternation))) - (cond ((cadr choices) - alternation) - ((cdr choices) - (first choices)) - (t (signal-syntax-error "Encountered alternation without choices."))))) - -(defmethod flatten ((branch branch)) - (declare #.*standard-optimize-settings*) - (with-slots (test then-regex else-regex) - branch - (setq test - (if (numberp test) - test - (flatten test)) - then-regex (flatten then-regex) - else-regex (flatten else-regex)) - branch)) - -(defmethod flatten ((regex regex)) - (declare #.*standard-optimize-settings*) - (typecase regex - ((or repetition register lookahead lookbehind standalone) - ;; if REGEX contains exactly one inner REGEX object flatten it - (setf (regex regex) - (flatten (regex regex))) - regex) - (t - ;; otherwise (ANCHOR, BACK-REFERENCE, CHAR-CLASS, EVERYTHING, - ;; LOOKAHEAD, LOOKBEHIND, STR, VOID, FILTER, and WORD-BOUNDARY) - ;; do nothing - regex))) - -(defgeneric gather-strings (regex) - (declare #.*standard-optimize-settings*) - (:documentation "Collects adjacent strings or characters into one -string provided they have the same case mode. This is a destructive -operation on REGEX.")) - -(defmethod gather-strings ((seq seq)) - (declare #.*standard-optimize-settings*) - ;; note that GATHER-STRINGS is to be applied after FLATTEN, i.e. it - ;; expects SEQ to be flattened already; in particular, SEQ cannot be - ;; empty and cannot contain embedded SEQ objects - (let* ((start-point (cons nil (elements seq))) - (curr-point start-point) - old-case-mode - collector - collector-start - (collector-length 0) - skip) - (declare (fixnum collector-length)) - (loop - (let ((elements-rest (cdr curr-point))) - (unless elements-rest - (return)) - (let* ((element (car elements-rest)) - (case-mode (case-mode element old-case-mode))) - (cond ((and case-mode - (eq case-mode old-case-mode)) - ;; if ELEMENT is a STR and we have collected a STR of - ;; the same case mode in the last iteration we - ;; concatenate ELEMENT onto COLLECTOR and remember the - ;; value of its SKIP slot - (let ((old-collector-length collector-length)) - (unless (and (adjustable-array-p collector) - (array-has-fill-pointer-p collector)) - (setq collector - (make-array collector-length - :initial-contents collector - :element-type 'character - :fill-pointer t - :adjustable t) - collector-start nil)) - (adjust-array collector - (incf collector-length (len element)) - :fill-pointer t) - (setf (subseq collector - old-collector-length) - (str element) - ;; it suffices to remember the last SKIP slot - ;; because due to the way MAYBE-ACCUMULATE - ;; works adjacent STR objects have the same - ;; SKIP value - skip (skip element))) - (setf (cdr curr-point) (cdr elements-rest))) - (t - (let ((collected-string - (cond (collector-start - collector-start) - (collector - ;; if we have collected something already - ;; we convert it into a STR - (make-instance 'str - :skip skip - :str collector - :case-insensitive-p - (eq old-case-mode - :case-insensitive))) - (t nil)))) - (cond (case-mode - ;; if ELEMENT is a string with a different case - ;; mode than the last one we have either just - ;; converted COLLECTOR into a STR or COLLECTOR - ;; is still empty; in both cases we can now - ;; begin to fill it anew - (setq collector (str element) - collector-start element - ;; and we remember the SKIP value as above - skip (skip element) - collector-length (len element)) - (cond (collected-string - (setf (car elements-rest) - collected-string - curr-point - (cdr curr-point))) - (t - (setf (cdr curr-point) - (cdr elements-rest))))) - (t - ;; otherwise this is not a STR so we apply - ;; GATHER-STRINGS to it and collect it directly - ;; into RESULT - (cond (collected-string - (setf (car elements-rest) - collected-string - curr-point - (cdr curr-point) - (cdr curr-point) - (cons (gather-strings element) - (cdr curr-point)) - curr-point - (cdr curr-point))) - (t - (setf (car elements-rest) - (gather-strings element) - curr-point - (cdr curr-point)))) - ;; we also have to empty COLLECTOR here in case - ;; it was still filled from the last iteration - (setq collector nil - collector-start nil)))))) - (setq old-case-mode case-mode)))) - (when collector - (setf (cdr curr-point) - (cons - (make-instance 'str - :skip skip - :str collector - :case-insensitive-p - (eq old-case-mode - :case-insensitive)) - nil))) - (setf (elements seq) (cdr start-point)) - seq)) - -(defmethod gather-strings ((alternation alternation)) - (declare #.*standard-optimize-settings*) - ;; loop ON the choices of ALTERNATION so we can modify them directly - (loop for choices-rest on (choices alternation) - while choices-rest - do (setf (car choices-rest) - (gather-strings (car choices-rest)))) - alternation) - -(defmethod gather-strings ((branch branch)) - (declare #.*standard-optimize-settings*) - (with-slots (test then-regex else-regex) - branch - (setq test - (if (numberp test) - test - (gather-strings test)) - then-regex (gather-strings then-regex) - else-regex (gather-strings else-regex)) - branch)) - -(defmethod gather-strings ((regex regex)) - (declare #.*standard-optimize-settings*) - (typecase regex - ((or repetition register lookahead lookbehind standalone) - ;; if REGEX contains exactly one inner REGEX object apply - ;; GATHER-STRINGS to it - (setf (regex regex) - (gather-strings (regex regex))) - regex) - (t - ;; otherwise (ANCHOR, BACK-REFERENCE, CHAR-CLASS, EVERYTHING, - ;; LOOKAHEAD, LOOKBEHIND, STR, VOID, FILTER, and WORD-BOUNDARY) - ;; do nothing - regex))) - -;; Note that START-ANCHORED-P will be called after FLATTEN and GATHER-STRINGS. - -(defgeneric start-anchored-p (regex &optional in-seq-p) - (declare #.*standard-optimize-settings*) - (:documentation "Returns T if REGEX starts with a \"real\" start -anchor, i.e. one that's not in multi-line mode, NIL otherwise. If -IN-SEQ-P is true the function will return :ZERO-LENGTH if REGEX is a -zero-length assertion.")) - -(defmethod start-anchored-p ((seq seq) &optional in-seq-p) - (declare (ignore in-seq-p)) - ;; note that START-ANCHORED-P is to be applied after FLATTEN and - ;; GATHER-STRINGS, i.e. SEQ cannot be empty and cannot contain - ;; embedded SEQ objects - (loop for element in (elements seq) - for anchored-p = (start-anchored-p element t) - ;; skip zero-length elements because they won't affect the - ;; "anchoredness" of the sequence - while (eq anchored-p :zero-length) - finally (return (and anchored-p (not (eq anchored-p :zero-length)))))) - -(defmethod start-anchored-p ((alternation alternation) &optional in-seq-p) - (declare #.*standard-optimize-settings*) - (declare (ignore in-seq-p)) - ;; clearly an alternation can only be start-anchored if all of its - ;; choices are start-anchored - (loop for choice in (choices alternation) - always (start-anchored-p choice))) - -(defmethod start-anchored-p ((branch branch) &optional in-seq-p) - (declare #.*standard-optimize-settings*) - (declare (ignore in-seq-p)) - (and (start-anchored-p (then-regex branch)) - (start-anchored-p (else-regex branch)))) - -(defmethod start-anchored-p ((repetition repetition) &optional in-seq-p) - (declare #.*standard-optimize-settings*) - (declare (ignore in-seq-p)) - ;; well, this wouldn't make much sense, but anyway... - (and (plusp (minimum repetition)) - (start-anchored-p (regex repetition)))) - -(defmethod start-anchored-p ((register register) &optional in-seq-p) - (declare #.*standard-optimize-settings*) - (declare (ignore in-seq-p)) - (start-anchored-p (regex register))) - -(defmethod start-anchored-p ((standalone standalone) &optional in-seq-p) - (declare #.*standard-optimize-settings*) - (declare (ignore in-seq-p)) - (start-anchored-p (regex standalone))) - -(defmethod start-anchored-p ((anchor anchor) &optional in-seq-p) - (declare #.*standard-optimize-settings*) - (declare (ignore in-seq-p)) - (and (startp anchor) - (not (multi-line-p anchor)))) - -(defmethod start-anchored-p ((regex regex) &optional in-seq-p) - (declare #.*standard-optimize-settings*) - (typecase regex - ((or lookahead lookbehind word-boundary void) - ;; zero-length assertions - (if in-seq-p - :zero-length - nil)) - (filter - (if (and in-seq-p - (len regex) - (zerop (len regex))) - :zero-length - nil)) - (t - ;; BACK-REFERENCE, CHAR-CLASS, EVERYTHING, and STR - nil))) - -;; Note that END-STRING-AUX will be called after FLATTEN and GATHER-STRINGS. - -(defgeneric end-string-aux (regex &optional old-case-insensitive-p) - (declare #.*standard-optimize-settings*) - (:documentation "Returns the constant string (if it exists) REGEX -ends with wrapped into a STR object, otherwise NIL. -OLD-CASE-INSENSITIVE-P is the CASE-INSENSITIVE-P slot of the last STR -collected or :VOID if no STR has been collected yet. (This is a helper -function called by END-STRING.)")) - -(defmethod end-string-aux ((str str) - &optional (old-case-insensitive-p :void)) - (declare #.*standard-optimize-settings*) - (declare (special last-str)) - (cond ((and (not (skip str)) ; avoid constituents of STARTS-WITH - ;; only use STR if nothing has been collected yet or if - ;; the collected string has the same value for - ;; CASE-INSENSITIVE-P - (or (eq old-case-insensitive-p :void) - (eq (case-insensitive-p str) old-case-insensitive-p))) - (setf last-str str - ;; set the SKIP property of this STR - (skip str) t) - str) - (t nil))) - -(defmethod end-string-aux ((seq seq) - &optional (old-case-insensitive-p :void)) - (declare #.*standard-optimize-settings*) - (declare (special continuep)) - (let (case-insensitive-p - concatenated-string - concatenated-start - (concatenated-length 0)) - (declare (fixnum concatenated-length)) - (loop for element in (reverse (elements seq)) - ;; remember the case-(in)sensitivity of the last relevant - ;; STR object - for loop-old-case-insensitive-p = old-case-insensitive-p - then (if skip - loop-old-case-insensitive-p - (case-insensitive-p element-end)) - ;; the end-string of the current element - for element-end = (end-string-aux element - loop-old-case-insensitive-p) - ;; whether we encountered a zero-length element - for skip = (if element-end - (zerop (len element-end)) - nil) - ;; set CONTINUEP to NIL if we have to stop collecting to - ;; alert END-STRING-AUX methods on enclosing SEQ objects - unless element-end - do (setq continuep nil) - ;; end loop if we neither got a STR nor a zero-length - ;; element - while element-end - ;; only collect if not zero-length - unless skip - do (cond (concatenated-string - (when concatenated-start - (setf concatenated-string - (make-array concatenated-length - :initial-contents (reverse (str concatenated-start)) - :element-type 'character - :fill-pointer t - :adjustable t) - concatenated-start nil)) - (let ((len (len element-end)) - (str (str element-end))) - (declare (fixnum len)) - (incf concatenated-length len) - (loop for i of-type fixnum downfrom (1- len) to 0 - do (vector-push-extend (char str i) - concatenated-string)))) - (t - (setf concatenated-string - t - concatenated-start - element-end - concatenated-length - (len element-end) - case-insensitive-p - (case-insensitive-p element-end)))) - ;; stop collecting if END-STRING-AUX on inner SEQ has said so - while continuep) - (cond ((zerop concatenated-length) - ;; don't bother to return zero-length strings - nil) - (concatenated-start - concatenated-start) - (t - (make-instance 'str - :str (nreverse concatenated-string) - :case-insensitive-p case-insensitive-p))))) - -(defmethod end-string-aux ((register register) - &optional (old-case-insensitive-p :void)) - (declare #.*standard-optimize-settings*) - (end-string-aux (regex register) old-case-insensitive-p)) - -(defmethod end-string-aux ((standalone standalone) - &optional (old-case-insensitive-p :void)) - (declare #.*standard-optimize-settings*) - (end-string-aux (regex standalone) old-case-insensitive-p)) - -(defmethod end-string-aux ((regex regex) - &optional (old-case-insensitive-p :void)) - (declare #.*standard-optimize-settings*) - (declare (special last-str end-anchored-p continuep)) - (typecase regex - ((or anchor lookahead lookbehind word-boundary void) - ;; a zero-length REGEX object - for the sake of END-STRING-AUX - ;; this is a zero-length string - (when (and (typep regex 'anchor) - (not (startp regex)) - (or (no-newline-p regex) - (not (multi-line-p regex))) - (eq old-case-insensitive-p :void)) - ;; if this is a "real" end-anchor and we haven't collected - ;; anything so far we can set END-ANCHORED-P (where 1 or 0 - ;; indicate whether we accept a #\Newline at the end or not) - (setq end-anchored-p (if (no-newline-p regex) 0 1))) - (make-instance 'str - :str "" - :case-insensitive-p :void)) - (t - ;; (ALTERNATION, BACK-REFERENCE, BRANCH, CHAR-CLASS, EVERYTHING, - ;; REPETITION, FILTER) - nil))) - -(defun end-string (regex) - (declare (special end-string-offset)) - (declare #.*standard-optimize-settings*) - "Returns the constant string (if it exists) REGEX ends with wrapped -into a STR object, otherwise NIL." - ;; LAST-STR points to the last STR object (seen from the end) that's - ;; part of END-STRING; CONTINUEP is set to T if we stop collecting - ;; in the middle of a SEQ - (let ((continuep t) - last-str) - (declare (special continuep last-str)) - (prog1 - (end-string-aux regex) - (when last-str - ;; if we've found something set the START-OF-END-STRING-P of - ;; the leftmost STR collected accordingly and remember the - ;; OFFSET of this STR (in a special variable provided by the - ;; caller of this function) - (setf (start-of-end-string-p last-str) t - end-string-offset (offset last-str)))))) - -(defgeneric compute-min-rest (regex current-min-rest) - (declare #.*standard-optimize-settings*) - (:documentation "Returns the minimal length of REGEX plus -CURRENT-MIN-REST. This is similar to REGEX-MIN-LENGTH except that it -recurses down into REGEX and sets the MIN-REST slots of REPETITION -objects.")) - -(defmethod compute-min-rest ((seq seq) current-min-rest) - (declare #.*standard-optimize-settings*) - (loop for element in (reverse (elements seq)) - for last-min-rest = current-min-rest then this-min-rest - for this-min-rest = (compute-min-rest element last-min-rest) - finally (return this-min-rest))) - -(defmethod compute-min-rest ((alternation alternation) current-min-rest) - (declare #.*standard-optimize-settings*) - (loop for choice in (choices alternation) - minimize (compute-min-rest choice current-min-rest))) - -(defmethod compute-min-rest ((branch branch) current-min-rest) - (declare #.*standard-optimize-settings*) - (min (compute-min-rest (then-regex branch) current-min-rest) - (compute-min-rest (else-regex branch) current-min-rest))) - -(defmethod compute-min-rest ((str str) current-min-rest) - (declare #.*standard-optimize-settings*) - (+ current-min-rest (len str))) - -(defmethod compute-min-rest ((filter filter) current-min-rest) - (declare #.*standard-optimize-settings*) - (+ current-min-rest (or (len filter) 0))) - -(defmethod compute-min-rest ((repetition repetition) current-min-rest) - (declare #.*standard-optimize-settings*) - (setf (min-rest repetition) current-min-rest) - (compute-min-rest (regex repetition) current-min-rest) - (+ current-min-rest (* (minimum repetition) (min-len repetition)))) - -(defmethod compute-min-rest ((register register) current-min-rest) - (declare #.*standard-optimize-settings*) - (compute-min-rest (regex register) current-min-rest)) - -(defmethod compute-min-rest ((standalone standalone) current-min-rest) - (declare #.*standard-optimize-settings*) - (declare (ignore current-min-rest)) - (compute-min-rest (regex standalone) 0)) - -(defmethod compute-min-rest ((lookahead lookahead) current-min-rest) - (declare #.*standard-optimize-settings*) - (compute-min-rest (regex lookahead) 0) - current-min-rest) - -(defmethod compute-min-rest ((lookbehind lookbehind) current-min-rest) - (declare #.*standard-optimize-settings*) - (compute-min-rest (regex lookbehind) (+ current-min-rest (len lookbehind))) - current-min-rest) - -(defmethod compute-min-rest ((regex regex) current-min-rest) - (declare #.*standard-optimize-settings*) - (typecase regex - ((or char-class everything) - (1+ current-min-rest)) - (t - ;; zero min-len and no embedded regexes (ANCHOR, - ;; BACK-REFERENCE, VOID, and WORD-BOUNDARY) - current-min-rest))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/packages.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/packages.lisp deleted file mode 100644 index 74faa44..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/packages.lisp +++ /dev/null @@ -1,69 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/packages.lisp,v 1.39 2009/09/17 19:17:31 edi Exp $ - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-user) - -(defpackage :cl-ppcre - (:nicknames :ppcre) - #+:genera - (:shadowing-import-from :common-lisp :lambda :simple-string :string) - (:use #-:genera :cl #+:genera :future-common-lisp) - (:shadow :digit-char-p :defconstant) - (:export :parse-string - :create-scanner - :create-optimized-test-function - :parse-tree-synonym - :define-parse-tree-synonym - :scan - :scan-to-strings - :do-scans - :do-matches - :do-matches-as-strings - :all-matches - :all-matches-as-strings - :split - :regex-replace - :regex-replace-all - :regex-apropos - :regex-apropos-list - :quote-meta-chars - :*regex-char-code-limit* - :*use-bmh-matchers* - :*allow-quoting* - :*allow-named-registers* - :*optimize-char-classes* - :*property-resolver* - :*look-ahead-for-suffix* - :ppcre-error - :ppcre-invocation-error - :ppcre-syntax-error - :ppcre-syntax-error-string - :ppcre-syntax-error-pos - :register-groups-bind - :do-register-groups)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/parser.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/parser.lisp deleted file mode 100644 index 72e39e9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/parser.lisp +++ /dev/null @@ -1,290 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/parser.lisp,v 1.31 2009/09/17 19:17:31 edi Exp $ - -;;; The parser will - with the help of the lexer - parse a regex -;;; string and convert it into a "parse tree" (see docs for details -;;; about the syntax of these trees). Note that the lexer might -;;; return illegal parse trees. It is assumed that the conversion -;;; process later on will track them down. - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre) - -(defun group (lexer) - "Parses and consumes a . -The productions are: -> \"\(\"\")\" - \"\(?:\"\")\" - \"\(?>\"\")\" - \"\(?:\"\")\" - \"\(?=\"\")\" - \"\(?!\"\")\" - \"\(?<=\"\")\" - \"\(?\")\" - \"\(?\(\"\")\"\")\" - \"\(?\(\"\")\"\")\" - \"\(?\"\")\" \(when *ALLOW-NAMED-REGISTERS* is T) - -where is parsed by the lexer function MAYBE-PARSE-FLAGS. -Will return or \( ) where - is one of six keywords - see source for details." - (declare #.*standard-optimize-settings*) - (multiple-value-bind (open-token flags) - (get-token lexer) - (cond ((eq open-token :open-paren-paren) - ;; special case for conditional regular expressions; note - ;; that at this point we accept a couple of illegal - ;; combinations which'll be sorted out later by the - ;; converter - (let* ((open-paren-pos (car (lexer-last-pos lexer))) - ;; check if what follows "(?(" is a number - (number (try-number lexer :no-whitespace-p t)) - ;; make changes to extended-mode-p local - (*extended-mode-p* *extended-mode-p*)) - (declare (fixnum open-paren-pos)) - (cond (number - ;; condition is a number (i.e. refers to a - ;; back-reference) - (let* ((inner-close-token (get-token lexer)) - (reg-expr (reg-expr lexer)) - (close-token (get-token lexer))) - (unless (eq inner-close-token :close-paren) - (signal-syntax-error* (+ open-paren-pos 2) - "Opening paren has no matching closing paren.")) - (unless (eq close-token :close-paren) - (signal-syntax-error* open-paren-pos - "Opening paren has no matching closing paren.")) - (list :branch number reg-expr))) - (t - ;; condition must be a full regex (actually a - ;; look-behind or look-ahead); and here comes a - ;; terrible kludge: instead of being cleanly - ;; separated from the lexer, the parser pushes - ;; back the lexer by one position, thereby - ;; landing in the middle of the 'token' "(?(" - - ;; yuck!! - (decf (lexer-pos lexer)) - (let* ((inner-reg-expr (group lexer)) - (reg-expr (reg-expr lexer)) - (close-token (get-token lexer))) - (unless (eq close-token :close-paren) - (signal-syntax-error* open-paren-pos - "Opening paren has no matching closing paren.")) - (list :branch inner-reg-expr reg-expr)))))) - ((member open-token '(:open-paren - :open-paren-colon - :open-paren-greater - :open-paren-equal - :open-paren-exclamation - :open-paren-less-equal - :open-paren-less-exclamation - :open-paren-less-letter) - :test #'eq) - ;; make changes to extended-mode-p local - (let ((*extended-mode-p* *extended-mode-p*)) - ;; we saw one of the six token representing opening - ;; parentheses - (let* ((open-paren-pos (car (lexer-last-pos lexer))) - (register-name (when (eq open-token :open-paren-less-letter) - (parse-register-name-aux lexer))) - (reg-expr (reg-expr lexer)) - (close-token (get-token lexer))) - (when (or (eq open-token :open-paren) - (eq open-token :open-paren-less-letter)) - ;; if this is the "("")" or "(?"""")" production we have to - ;; increment the register counter of the lexer - (incf (lexer-reg lexer))) - (unless (eq close-token :close-paren) - ;; the token following must be the closing - ;; parenthesis or this is a syntax error - (signal-syntax-error* open-paren-pos - "Opening paren has no matching closing paren.")) - (if flags - ;; if the lexer has returned a list of flags this must - ;; have been the "(?:"")" production - (cons :group (nconc flags (list reg-expr))) - (if (eq open-token :open-paren-less-letter) - (list :named-register register-name - reg-expr) - (list (case open-token - ((:open-paren) - :register) - ((:open-paren-colon) - :group) - ((:open-paren-greater) - :standalone) - ((:open-paren-equal) - :positive-lookahead) - ((:open-paren-exclamation) - :negative-lookahead) - ((:open-paren-less-equal) - :positive-lookbehind) - ((:open-paren-less-exclamation) - :negative-lookbehind)) - reg-expr)))))) - (t - ;; this is the production; is - ;; any token which passes START-OF-SUBEXPR-P (otherwise - ;; parsing had already stopped in the SEQ method) - open-token)))) - -(defun greedy-quant (lexer) - "Parses and consumes a . -The productions are: -> | -where is parsed by the lexer function GET-QUANTIFIER. -Will return or (:GREEDY-REPETITION )." - (declare #.*standard-optimize-settings*) - (let* ((group (group lexer)) - (token (get-quantifier lexer))) - (if token - ;; if GET-QUANTIFIER returned a non-NIL value it's the - ;; two-element list ( ) - (list :greedy-repetition (first token) (second token) group) - group))) - -(defun quant (lexer) - "Parses and consumes a . -The productions are: -> | \"?\". -Will return the returned by GREEDY-QUANT and optionally -change :GREEDY-REPETITION to :NON-GREEDY-REPETITION." - (declare #.*standard-optimize-settings*) - (let* ((greedy-quant (greedy-quant lexer)) - (pos (lexer-pos lexer)) - (next-char (next-char lexer))) - (when next-char - (if (char= next-char #\?) - (setf (car greedy-quant) :non-greedy-repetition) - (setf (lexer-pos lexer) pos))) - greedy-quant)) - -(defun seq (lexer) - "Parses and consumes a . -The productions are: -> | . -Will return or (:SEQUENCE )." - (declare #.*standard-optimize-settings*) - (flet ((make-array-from-two-chars (char1 char2) - (let ((string (make-array 2 - :element-type 'character - :fill-pointer t - :adjustable t))) - (setf (aref string 0) char1) - (setf (aref string 1) char2) - string))) - ;; Note that we're calling START-OF-SUBEXPR-P before we actually try - ;; to parse a or in order to catch empty regular - ;; expressions - (if (start-of-subexpr-p lexer) - (loop with seq-is-sequence-p = nil - with last-cdr - for quant = (quant lexer) - for quant-is-char-p = (characterp quant) - for seq = quant - then - (cond ((and quant-is-char-p (characterp seq)) - (make-array-from-two-chars seq quant)) - ((and quant-is-char-p (stringp seq)) - (vector-push-extend quant seq) - seq) - ((not seq-is-sequence-p) - (setf last-cdr (list quant) - seq-is-sequence-p t) - (list* :sequence seq last-cdr)) - ((and quant-is-char-p - (characterp (car last-cdr))) - (setf (car last-cdr) - (make-array-from-two-chars (car last-cdr) - quant)) - seq) - ((and quant-is-char-p - (stringp (car last-cdr))) - (vector-push-extend quant (car last-cdr)) - seq) - (t - ;; if is also a :SEQUENCE parse tree we merge - ;; both lists into one - (let ((cons (list quant))) - (psetf last-cdr cons - (cdr last-cdr) cons)) - seq)) - while (start-of-subexpr-p lexer) - finally (return seq)) - :void))) - -(defun reg-expr (lexer) - "Parses and consumes a , a complete regular expression. -The productions are: -> | \"|\". -Will return or (:ALTERNATION )." - (declare #.*standard-optimize-settings*) - (let ((pos (lexer-pos lexer))) - (case (next-char lexer) - ((nil) - ;; if we didn't get any token we return :VOID which stands for - ;; "empty regular expression" - :void) - ((#\|) - ;; now check whether the expression started with a vertical - ;; bar, i.e. - the left alternation - is empty - (list :alternation :void (reg-expr lexer))) - (otherwise - ;; otherwise un-read the character we just saw and parse a - ;; plus the character following it - (setf (lexer-pos lexer) pos) - (let* ((seq (seq lexer)) - (pos (lexer-pos lexer))) - (case (next-char lexer) - ((nil) - ;; no further character, just a - seq) - ((#\|) - ;; if the character was a vertical bar, this is an - ;; alternation and we have the second production - (let ((reg-expr (reg-expr lexer))) - (cond ((and (consp reg-expr) - (eq (first reg-expr) :alternation)) - ;; again we try to merge as above in SEQ - (setf (cdr reg-expr) - (cons seq (cdr reg-expr))) - reg-expr) - (t (list :alternation seq reg-expr))))) - (otherwise - ;; a character which is not a vertical bar - this is - ;; either a syntax error or we're inside of a group and - ;; the next character is a closing parenthesis; so we - ;; just un-read the character and let another function - ;; take care of it - (setf (lexer-pos lexer) pos) - seq))))))) - -(defun parse-string (string) - "Translate the regex string STRING into a parse tree." - (declare #.*standard-optimize-settings*) - (let* ((lexer (make-lexer string)) - (parse-tree (reg-expr lexer))) - ;; check whether we've consumed the whole regex string - (if (end-of-string-p lexer) - parse-tree - (signal-syntax-error* (lexer-pos lexer) "Expected end of string.")))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/regex-class-util.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/regex-class-util.lisp deleted file mode 100644 index b737378..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/regex-class-util.lisp +++ /dev/null @@ -1,555 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/regex-class-util.lisp,v 1.9 2009/09/17 19:17:31 edi Exp $ - -;;; This file contains some utility methods for REGEX objects. - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre) - -;;; The following four methods allow a VOID object to behave like a -;;; zero-length STR object (only readers needed) - -(defmethod len ((void void)) - (declare #.*standard-optimize-settings*) - 0) - -(defmethod str ((void void)) - (declare #.*standard-optimize-settings*) - "") - -(defmethod skip ((void void)) - (declare #.*standard-optimize-settings*) - nil) - -(defmethod start-of-end-string-p ((void void)) - (declare #.*standard-optimize-settings*) - nil) - -(defgeneric case-mode (regex old-case-mode) - (declare #.*standard-optimize-settings*) - (:documentation "Utility function used by the optimizer (see GATHER-STRINGS). -Returns a keyword denoting the case-(in)sensitivity of a STR or its -second argument if the STR has length 0. Returns NIL for REGEX objects -which are not of type STR.")) - -(defmethod case-mode ((str str) old-case-mode) - (declare #.*standard-optimize-settings*) - (cond ((zerop (len str)) - old-case-mode) - ((case-insensitive-p str) - :case-insensitive) - (t - :case-sensitive))) - -(defmethod case-mode ((regex regex) old-case-mode) - (declare #.*standard-optimize-settings*) - (declare (ignore old-case-mode)) - nil) - -(defgeneric copy-regex (regex) - (declare #.*standard-optimize-settings*) - (:documentation "Implements a deep copy of a REGEX object.")) - -(defmethod copy-regex ((anchor anchor)) - (declare #.*standard-optimize-settings*) - (make-instance 'anchor - :startp (startp anchor) - :multi-line-p (multi-line-p anchor) - :no-newline-p (no-newline-p anchor))) - -(defmethod copy-regex ((everything everything)) - (declare #.*standard-optimize-settings*) - (make-instance 'everything - :single-line-p (single-line-p everything))) - -(defmethod copy-regex ((word-boundary word-boundary)) - (declare #.*standard-optimize-settings*) - (make-instance 'word-boundary - :negatedp (negatedp word-boundary))) - -(defmethod copy-regex ((void void)) - (declare #.*standard-optimize-settings*) - (make-instance 'void)) - -(defmethod copy-regex ((lookahead lookahead)) - (declare #.*standard-optimize-settings*) - (make-instance 'lookahead - :regex (copy-regex (regex lookahead)) - :positivep (positivep lookahead))) - -(defmethod copy-regex ((seq seq)) - (declare #.*standard-optimize-settings*) - (make-instance 'seq - :elements (mapcar #'copy-regex (elements seq)))) - -(defmethod copy-regex ((alternation alternation)) - (declare #.*standard-optimize-settings*) - (make-instance 'alternation - :choices (mapcar #'copy-regex (choices alternation)))) - -(defmethod copy-regex ((branch branch)) - (declare #.*standard-optimize-settings*) - (with-slots (test) - branch - (make-instance 'branch - :test (if (typep test 'regex) - (copy-regex test) - test) - :then-regex (copy-regex (then-regex branch)) - :else-regex (copy-regex (else-regex branch))))) - -(defmethod copy-regex ((lookbehind lookbehind)) - (declare #.*standard-optimize-settings*) - (make-instance 'lookbehind - :regex (copy-regex (regex lookbehind)) - :positivep (positivep lookbehind) - :len (len lookbehind))) - -(defmethod copy-regex ((repetition repetition)) - (declare #.*standard-optimize-settings*) - (make-instance 'repetition - :regex (copy-regex (regex repetition)) - :greedyp (greedyp repetition) - :minimum (minimum repetition) - :maximum (maximum repetition) - :min-len (min-len repetition) - :len (len repetition) - :contains-register-p (contains-register-p repetition))) - -(defmethod copy-regex ((register register)) - (declare #.*standard-optimize-settings*) - (make-instance 'register - :regex (copy-regex (regex register)) - :num (num register) - :name (name register))) - -(defmethod copy-regex ((standalone standalone)) - (declare #.*standard-optimize-settings*) - (make-instance 'standalone - :regex (copy-regex (regex standalone)))) - -(defmethod copy-regex ((back-reference back-reference)) - (declare #.*standard-optimize-settings*) - (make-instance 'back-reference - :num (num back-reference) - :case-insensitive-p (case-insensitive-p back-reference))) - -(defmethod copy-regex ((char-class char-class)) - (declare #.*standard-optimize-settings*) - (make-instance 'char-class - :test-function (test-function char-class))) - -(defmethod copy-regex ((str str)) - (declare #.*standard-optimize-settings*) - (make-instance 'str - :str (str str) - :case-insensitive-p (case-insensitive-p str))) - -(defmethod copy-regex ((filter filter)) - (declare #.*standard-optimize-settings*) - (make-instance 'filter - :fn (fn filter) - :len (len filter))) - -;;; Note that COPY-REGEX and REMOVE-REGISTERS could have easily been -;;; wrapped into one function. Maybe in the next release... - -;;; Further note that this function is used by CONVERT to factor out -;;; complicated repetitions, i.e. cases like -;;; (a)* -> (?:a*(a))? -;;; This won't work for, say, -;;; ((a)|(b))* -> (?:(?:a|b)*((a)|(b)))? -;;; and therefore we stop REGISTER removal once we see an ALTERNATION. - -(defgeneric remove-registers (regex) - (declare #.*standard-optimize-settings*) - (:documentation "Returns a deep copy of a REGEX (see COPY-REGEX) and -optionally removes embedded REGISTER objects if possible and if the -special variable REMOVE-REGISTERS-P is true.")) - -(defmethod remove-registers ((register register)) - (declare #.*standard-optimize-settings*) - (declare (special remove-registers-p reg-seen)) - (cond (remove-registers-p - (remove-registers (regex register))) - (t - ;; mark REG-SEEN as true so enclosing REPETITION objects - ;; (see method below) know if they contain a register or not - (setq reg-seen t) - (copy-regex register)))) - -(defmethod remove-registers ((repetition repetition)) - (declare #.*standard-optimize-settings*) - (let* (reg-seen - (inner-regex (remove-registers (regex repetition)))) - ;; REMOVE-REGISTERS will set REG-SEEN (see method above) if - ;; (REGEX REPETITION) contains a REGISTER - (declare (special reg-seen)) - (make-instance 'repetition - :regex inner-regex - :greedyp (greedyp repetition) - :minimum (minimum repetition) - :maximum (maximum repetition) - :min-len (min-len repetition) - :len (len repetition) - :contains-register-p reg-seen))) - -(defmethod remove-registers ((standalone standalone)) - (declare #.*standard-optimize-settings*) - (make-instance 'standalone - :regex (remove-registers (regex standalone)))) - -(defmethod remove-registers ((lookahead lookahead)) - (declare #.*standard-optimize-settings*) - (make-instance 'lookahead - :regex (remove-registers (regex lookahead)) - :positivep (positivep lookahead))) - -(defmethod remove-registers ((lookbehind lookbehind)) - (declare #.*standard-optimize-settings*) - (make-instance 'lookbehind - :regex (remove-registers (regex lookbehind)) - :positivep (positivep lookbehind) - :len (len lookbehind))) - -(defmethod remove-registers ((branch branch)) - (declare #.*standard-optimize-settings*) - (with-slots (test) - branch - (make-instance 'branch - :test (if (typep test 'regex) - (remove-registers test) - test) - :then-regex (remove-registers (then-regex branch)) - :else-regex (remove-registers (else-regex branch))))) - -(defmethod remove-registers ((alternation alternation)) - (declare #.*standard-optimize-settings*) - (declare (special remove-registers-p)) - ;; an ALTERNATION, so we can't remove REGISTER objects further down - (setq remove-registers-p nil) - (copy-regex alternation)) - -(defmethod remove-registers ((regex regex)) - (declare #.*standard-optimize-settings*) - (copy-regex regex)) - -(defmethod remove-registers ((seq seq)) - (declare #.*standard-optimize-settings*) - (make-instance 'seq - :elements (mapcar #'remove-registers (elements seq)))) - -(defgeneric everythingp (regex) - (declare #.*standard-optimize-settings*) - (:documentation "Returns an EVERYTHING object if REGEX is equivalent -to this object, otherwise NIL. So, \"(.){1}\" would return true -\(i.e. the object corresponding to \".\", for example.")) - -(defmethod everythingp ((seq seq)) - (declare #.*standard-optimize-settings*) - ;; we might have degenerate cases like (:SEQUENCE :VOID ...) - ;; due to the parsing process - (let ((cleaned-elements (remove-if #'(lambda (element) - (typep element 'void)) - (elements seq)))) - (and (= 1 (length cleaned-elements)) - (everythingp (first cleaned-elements))))) - -(defmethod everythingp ((alternation alternation)) - (declare #.*standard-optimize-settings*) - (with-slots (choices) - alternation - (and (= 1 (length choices)) - ;; this is unlikely to happen for human-generated regexes, - ;; but machine-generated ones might look like this - (everythingp (first choices))))) - -(defmethod everythingp ((repetition repetition)) - (declare #.*standard-optimize-settings*) - (with-slots (maximum minimum regex) - repetition - (and maximum - (= 1 minimum maximum) - ;; treat "{1,1}" like "" - (everythingp regex)))) - -(defmethod everythingp ((register register)) - (declare #.*standard-optimize-settings*) - (everythingp (regex register))) - -(defmethod everythingp ((standalone standalone)) - (declare #.*standard-optimize-settings*) - (everythingp (regex standalone))) - -(defmethod everythingp ((everything everything)) - (declare #.*standard-optimize-settings*) - everything) - -(defmethod everythingp ((regex regex)) - (declare #.*standard-optimize-settings*) - ;; the general case for ANCHOR, BACK-REFERENCE, BRANCH, CHAR-CLASS, - ;; LOOKAHEAD, LOOKBEHIND, STR, VOID, FILTER, and WORD-BOUNDARY - nil) - -(defgeneric regex-length (regex) - (declare #.*standard-optimize-settings*) - (:documentation "Return the length of REGEX if it is fixed, NIL otherwise.")) - -(defmethod regex-length ((seq seq)) - (declare #.*standard-optimize-settings*) - ;; simply add all inner lengths unless one of them is NIL - (loop for sub-regex in (elements seq) - for len = (regex-length sub-regex) - if (not len) do (return nil) - sum len)) - -(defmethod regex-length ((alternation alternation)) - (declare #.*standard-optimize-settings*) - ;; only return a true value if all inner lengths are non-NIL and - ;; mutually equal - (loop for sub-regex in (choices alternation) - for old-len = nil then len - for len = (regex-length sub-regex) - if (or (not len) - (and old-len (/= len old-len))) do (return nil) - finally (return len))) - -(defmethod regex-length ((branch branch)) - (declare #.*standard-optimize-settings*) - ;; only return a true value if both alternations have a length and - ;; if they're equal - (let ((then-length (regex-length (then-regex branch)))) - (and then-length - (eql then-length (regex-length (else-regex branch))) - then-length))) - -(defmethod regex-length ((repetition repetition)) - (declare #.*standard-optimize-settings*) - ;; we can only compute the length of a REPETITION object if the - ;; number of repetitions is fixed; note that we don't call - ;; REGEX-LENGTH for the inner regex, we assume that the LEN slot is - ;; always set correctly - (with-slots (len minimum maximum) - repetition - (if (and len - (eql minimum maximum)) - (* minimum len) - nil))) - -(defmethod regex-length ((register register)) - (declare #.*standard-optimize-settings*) - (regex-length (regex register))) - -(defmethod regex-length ((standalone standalone)) - (declare #.*standard-optimize-settings*) - (regex-length (regex standalone))) - -(defmethod regex-length ((back-reference back-reference)) - (declare #.*standard-optimize-settings*) - ;; with enough effort we could possibly do better here, but - ;; currently we just give up and return NIL - nil) - -(defmethod regex-length ((char-class char-class)) - (declare #.*standard-optimize-settings*) - 1) - -(defmethod regex-length ((everything everything)) - (declare #.*standard-optimize-settings*) - 1) - -(defmethod regex-length ((str str)) - (declare #.*standard-optimize-settings*) - (len str)) - -(defmethod regex-length ((filter filter)) - (declare #.*standard-optimize-settings*) - (len filter)) - -(defmethod regex-length ((regex regex)) - (declare #.*standard-optimize-settings*) - ;; the general case for ANCHOR, LOOKAHEAD, LOOKBEHIND, VOID, and - ;; WORD-BOUNDARY (which all have zero-length) - 0) - -(defgeneric regex-min-length (regex) - (declare #.*standard-optimize-settings*) - (:documentation "Returns the minimal length of REGEX.")) - -(defmethod regex-min-length ((seq seq)) - (declare #.*standard-optimize-settings*) - ;; simply add all inner minimal lengths - (loop for sub-regex in (elements seq) - for len = (regex-min-length sub-regex) - sum len)) - -(defmethod regex-min-length ((alternation alternation)) - (declare #.*standard-optimize-settings*) - ;; minimal length of an alternation is the minimal length of the - ;; "shortest" element - (loop for sub-regex in (choices alternation) - for len = (regex-min-length sub-regex) - minimize len)) - -(defmethod regex-min-length ((branch branch)) - (declare #.*standard-optimize-settings*) - ;; minimal length of both alternations - (min (regex-min-length (then-regex branch)) - (regex-min-length (else-regex branch)))) - -(defmethod regex-min-length ((repetition repetition)) - (declare #.*standard-optimize-settings*) - ;; obviously the product of the inner minimal length and the minimal - ;; number of repetitions - (* (minimum repetition) (min-len repetition))) - -(defmethod regex-min-length ((register register)) - (declare #.*standard-optimize-settings*) - (regex-min-length (regex register))) - -(defmethod regex-min-length ((standalone standalone)) - (declare #.*standard-optimize-settings*) - (regex-min-length (regex standalone))) - -(defmethod regex-min-length ((char-class char-class)) - (declare #.*standard-optimize-settings*) - 1) - -(defmethod regex-min-length ((everything everything)) - (declare #.*standard-optimize-settings*) - 1) - -(defmethod regex-min-length ((str str)) - (declare #.*standard-optimize-settings*) - (len str)) - -(defmethod regex-min-length ((filter filter)) - (declare #.*standard-optimize-settings*) - (or (len filter) - 0)) - -(defmethod regex-min-length ((regex regex)) - (declare #.*standard-optimize-settings*) - ;; the general case for ANCHOR, BACK-REFERENCE, LOOKAHEAD, - ;; LOOKBEHIND, VOID, and WORD-BOUNDARY - 0) - -(defgeneric compute-offsets (regex start-pos) - (declare #.*standard-optimize-settings*) - (:documentation "Returns the offset the following regex would have -relative to START-POS or NIL if we can't compute it. Sets the OFFSET -slot of REGEX to START-POS if REGEX is a STR. May also affect OFFSET -slots of STR objects further down the tree.")) - -;; note that we're actually only interested in the offset of -;; "top-level" STR objects (see ADVANCE-FN in the SCAN function) so we -;; can stop at variable-length alternations and don't need to descend -;; into repetitions - -(defmethod compute-offsets ((seq seq) start-pos) - (declare #.*standard-optimize-settings*) - (loop for element in (elements seq) - ;; advance offset argument for next call while looping through - ;; the elements - for pos = start-pos then curr-offset - for curr-offset = (compute-offsets element pos) - while curr-offset - finally (return curr-offset))) - -(defmethod compute-offsets ((alternation alternation) start-pos) - (declare #.*standard-optimize-settings*) - (loop for choice in (choices alternation) - for old-offset = nil then curr-offset - for curr-offset = (compute-offsets choice start-pos) - ;; we stop immediately if two alternations don't result in the - ;; same offset - if (or (not curr-offset) - (and old-offset (/= curr-offset old-offset))) - do (return nil) - finally (return curr-offset))) - -(defmethod compute-offsets ((branch branch) start-pos) - (declare #.*standard-optimize-settings*) - ;; only return offset if both alternations have equal value - (let ((then-offset (compute-offsets (then-regex branch) start-pos))) - (and then-offset - (eql then-offset (compute-offsets (else-regex branch) start-pos)) - then-offset))) - -(defmethod compute-offsets ((repetition repetition) start-pos) - (declare #.*standard-optimize-settings*) - ;; no need to descend into the inner regex - (with-slots (len minimum maximum) - repetition - (if (and len - (eq minimum maximum)) - ;; fixed number of repetitions, so we know how to proceed - (+ start-pos (* minimum len)) - ;; otherwise return NIL - nil))) - -(defmethod compute-offsets ((register register) start-pos) - (declare #.*standard-optimize-settings*) - (compute-offsets (regex register) start-pos)) - -(defmethod compute-offsets ((standalone standalone) start-pos) - (declare #.*standard-optimize-settings*) - (compute-offsets (regex standalone) start-pos)) - -(defmethod compute-offsets ((char-class char-class) start-pos) - (declare #.*standard-optimize-settings*) - (1+ start-pos)) - -(defmethod compute-offsets ((everything everything) start-pos) - (declare #.*standard-optimize-settings*) - (1+ start-pos)) - -(defmethod compute-offsets ((str str) start-pos) - (declare #.*standard-optimize-settings*) - (setf (offset str) start-pos) - (+ start-pos (len str))) - -(defmethod compute-offsets ((back-reference back-reference) start-pos) - (declare #.*standard-optimize-settings*) - ;; with enough effort we could possibly do better here, but - ;; currently we just give up and return NIL - (declare (ignore start-pos)) - nil) - -(defmethod compute-offsets ((filter filter) start-pos) - (declare #.*standard-optimize-settings*) - (let ((len (len filter))) - (if len - (+ start-pos len) - nil))) - -(defmethod compute-offsets ((regex regex) start-pos) - (declare #.*standard-optimize-settings*) - ;; the general case for ANCHOR, LOOKAHEAD, LOOKBEHIND, VOID, and - ;; WORD-BOUNDARY (which all have zero-length) - start-pos) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/regex-class.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/regex-class.lisp deleted file mode 100644 index 43c36e5..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/regex-class.lisp +++ /dev/null @@ -1,271 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/regex-class.lisp,v 1.44 2009/10/28 07:36:15 edi Exp $ - -;;; This file defines the REGEX class. REGEX objects are used to -;;; represent the (transformed) parse trees internally - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre) - -(defclass regex () - () - (:documentation "The REGEX base class. All other classes inherit -from this one.")) - -(defclass seq (regex) - ((elements :initarg :elements - :accessor elements - :type cons - :documentation "A list of REGEX objects.")) - (:documentation "SEQ objects represents sequences of regexes. -\(Like \"ab\" is the sequence of \"a\" and \"b\".)")) - -(defclass alternation (regex) - ((choices :initarg :choices - :accessor choices - :type cons - :documentation "A list of REGEX objects")) - (:documentation "ALTERNATION objects represent alternations of -regexes. \(Like \"a|b\" ist the alternation of \"a\" or \"b\".)")) - -(defclass lookahead (regex) - ((regex :initarg :regex - :accessor regex - :documentation "The REGEX object we're checking.") - (positivep :initarg :positivep - :reader positivep - :documentation "Whether this assertion is positive.")) - (:documentation "LOOKAHEAD objects represent look-ahead assertions.")) - -(defclass lookbehind (regex) - ((regex :initarg :regex - :accessor regex - :documentation "The REGEX object we're checking.") - (positivep :initarg :positivep - :reader positivep - :documentation "Whether this assertion is positive.") - (len :initarg :len - :accessor len - :type fixnum - :documentation "The \(fixed) length of the enclosed regex.")) - (:documentation "LOOKBEHIND objects represent look-behind assertions.")) - -(defclass repetition (regex) - ((regex :initarg :regex - :accessor regex - :documentation "The REGEX that's repeated.") - (greedyp :initarg :greedyp - :reader greedyp - :documentation "Whether the repetition is greedy.") - (minimum :initarg :minimum - :accessor minimum - :type fixnum - :documentation "The minimal number of repetitions.") - (maximum :initarg :maximum - :accessor maximum - :documentation "The maximal number of repetitions. -Can be NIL for unbounded.") - (min-len :initarg :min-len - :reader min-len - :documentation "The minimal length of the enclosed regex.") - (len :initarg :len - :reader len - :documentation "The length of the enclosed regex. NIL if -unknown.") - (min-rest :initform 0 - :accessor min-rest - :type fixnum - :documentation "The minimal number of characters which -must appear after this repetition.") - (contains-register-p :initarg :contains-register-p - :reader contains-register-p - :documentation "Whether the regex contains a -register.")) - (:documentation "REPETITION objects represent repetitions of regexes.")) - -(defmethod print-object ((repetition repetition) stream) - (print-unreadable-object (repetition stream :type t :identity t) - (princ (regex repetition) stream))) - -(defclass register (regex) - ((regex :initarg :regex - :accessor regex - :documentation "The inner regex.") - (num :initarg :num - :reader num - :type fixnum - :documentation "The number of this register, starting from 0. -This is the index into *REGS-START* and *REGS-END*.") - (name :initarg :name - :reader name - :documentation "Name of this register or NIL.")) - (:documentation "REGISTER objects represent register groups.")) - -(defmethod print-object ((register register) stream) - (print-unreadable-object (register stream :type t :identity t) - (princ (regex register) stream))) - -(defclass standalone (regex) - ((regex :initarg :regex - :accessor regex - :documentation "The inner regex.")) - (:documentation "A standalone regular expression.")) - -(defclass back-reference (regex) - ((num :initarg :num - :accessor num - :type fixnum - :documentation "The number of the register this -reference refers to.") - (name :initarg :name - :accessor name - :documentation "The name of the register this -reference refers to or NIL.") - (case-insensitive-p :initarg :case-insensitive-p - :reader case-insensitive-p - :documentation "Whether we check -case-insensitively.")) - (:documentation "BACK-REFERENCE objects represent backreferences.")) - -(defclass char-class (regex) - ((test-function :initarg :test-function - :reader test-function - :type (or function symbol nil) - :documentation "A unary function \(accepting a -character) which stands in for the character class and does the work -of checking whether a character belongs to the class.")) - (:documentation "CHAR-CLASS objects represent character classes.")) - -(defclass str (regex) - ((str :initarg :str - :accessor str - :type string - :documentation "The actual string.") - (len :initform 0 - :accessor len - :type fixnum - :documentation "The length of the string.") - (case-insensitive-p :initarg :case-insensitive-p - :reader case-insensitive-p - :documentation "If we match case-insensitively.") - (offset :initform nil - :accessor offset - :documentation "Offset from the left of the whole -parse tree. The first regex has offset 0. NIL if unknown, i.e. behind -a variable-length regex.") - (skip :initform nil - :initarg :skip - :accessor skip - :documentation "If we can avoid testing for this -string because the SCAN function has done this already.") - (start-of-end-string-p :initform nil - :accessor start-of-end-string-p - :documentation "If this is the unique -STR which starts END-STRING (a slot of MATCHER).")) - (:documentation "STR objects represent string.")) - -(defmethod print-object ((str str) stream) - (print-unreadable-object (str stream :type t :identity t) - (princ (str str) stream))) - -(defclass anchor (regex) - ((startp :initarg :startp - :reader startp - :documentation "Whether this is a \"start anchor\".") - (multi-line-p :initarg :multi-line-p - :initform nil - :reader multi-line-p - :documentation "Whether we're in multi-line mode, -i.e. whether each #\\Newline is surrounded by anchors.") - (no-newline-p :initarg :no-newline-p - :initform nil - :reader no-newline-p - :documentation "Whether we ignore #\\Newline at the end.")) - (:documentation "ANCHOR objects represent anchors like \"^\" or \"$\".")) - -(defclass everything (regex) - ((single-line-p :initarg :single-line-p - :reader single-line-p - :documentation "Whether we're in single-line mode, -i.e. whether we also match #\\Newline.")) - (:documentation "EVERYTHING objects represent regexes matching -\"everything\", i.e. dots.")) - -(defclass word-boundary (regex) - ((negatedp :initarg :negatedp - :reader negatedp - :documentation "Whether we mean the opposite, -i.e. no word-boundary.")) - (:documentation "WORD-BOUNDARY objects represent word-boundary assertions.")) - -(defclass branch (regex) - ((test :initarg :test - :accessor test - :documentation "The test of this branch, one of -LOOKAHEAD, LOOKBEHIND, or a number.") - (then-regex :initarg :then-regex - :accessor then-regex - :documentation "The regex that's to be matched if the -test succeeds.") - (else-regex :initarg :else-regex - :initform (make-instance 'void) - :accessor else-regex - :documentation "The regex that's to be matched if the -test fails.")) - (:documentation "BRANCH objects represent Perl's conditional regular -expressions.")) - -(defclass filter (regex) - ((fn :initarg :fn - :accessor fn - :type (or function symbol) - :documentation "The user-defined function.") - (len :initarg :len - :reader len - :documentation "The fixed length of this filter or NIL.")) - (:documentation "FILTER objects represent arbitrary functions -defined by the user.")) - -(defclass void (regex) - () - (:documentation "VOID objects represent empty regular expressions.")) - -(defmethod initialize-instance :after ((str str) &rest init-args) - (declare #.*standard-optimize-settings*) - (declare (ignore init-args)) - "Automatically computes the length of a STR after initialization." - (let ((str-slot (slot-value str 'str))) - (unless (typep str-slot - #-:lispworks 'simple-string - #+:lispworks 'lw:simple-text-string) - (setf (slot-value str 'str) - (coerce str-slot - #-:lispworks 'simple-string - #+:lispworks 'lw:simple-text-string)))) - (setf (len str) (length (str str)))) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/repetition-closures.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/repetition-closures.lisp deleted file mode 100644 index 1bcb08b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/repetition-closures.lisp +++ /dev/null @@ -1,833 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/repetition-closures.lisp,v 1.34 2009/09/17 19:17:31 edi Exp $ - -;;; This is actually a part of closures.lisp which we put into a -;;; separate file because it is rather complex. We only deal with -;;; REPETITIONs here. Note that this part of the code contains some -;;; rather crazy micro-optimizations which were introduced to be as -;;; competitive with Perl as possible in tight loops. - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre) - -(defmacro incf-after (place &optional (delta 1) &environment env) - "Utility macro inspired by C's \"place++\", i.e. first return the -value of PLACE and afterwards increment it by DELTA." - (with-unique-names (%temp) - (multiple-value-bind (vars vals store-vars writer-form reader-form) - (get-setf-expansion place env) - `(let* (,@(mapcar #'list vars vals) - (,%temp ,reader-form) - (,(car store-vars) (+ ,%temp ,delta))) - ,writer-form - ,%temp)))) - -;; code for greedy repetitions with minimum zero - -(defmacro greedy-constant-length-closure (check-curr-pos) - "This is the template for simple greedy repetitions (where simple -means that the minimum number of repetitions is zero, that the inner -regex to be checked is of fixed length LEN, and that it doesn't -contain registers, i.e. there's no need for backtracking). -CHECK-CURR-POS is a form which checks whether the inner regex of the -repetition matches at CURR-POS." - `(if maximum - (lambda (start-pos) - (declare (fixnum start-pos maximum)) - ;; because we know LEN we know in advance where to stop at the - ;; latest; we also take into consideration MIN-REST, i.e. the - ;; minimal length of the part behind the repetition - (let ((target-end-pos (min (1+ (- *end-pos* len min-rest)) - ;; don't go further than MAXIMUM - ;; repetitions, of course - (+ start-pos - (the fixnum (* len maximum))))) - (curr-pos start-pos)) - (declare (fixnum target-end-pos curr-pos)) - (block greedy-constant-length-matcher - ;; we use an ugly TAGBODY construct because this might be a - ;; tight loop and this version is a bit faster than our LOOP - ;; version (at least in CMUCL) - (tagbody - forward-loop - ;; first go forward as far as possible, i.e. while - ;; the inner regex matches - (when (>= curr-pos target-end-pos) - (go backward-loop)) - (when ,check-curr-pos - (incf curr-pos len) - (go forward-loop)) - backward-loop - ;; now go back LEN steps each until we're able to match - ;; the rest of the regex - (when (< curr-pos start-pos) - (return-from greedy-constant-length-matcher nil)) - (let ((result (funcall next-fn curr-pos))) - (when result - (return-from greedy-constant-length-matcher result))) - (decf curr-pos len) - (go backward-loop))))) - ;; basically the same code; it's just a bit easier because we're - ;; not bounded by MAXIMUM - (lambda (start-pos) - (declare (fixnum start-pos)) - (let ((target-end-pos (1+ (- *end-pos* len min-rest))) - (curr-pos start-pos)) - (declare (fixnum target-end-pos curr-pos)) - (block greedy-constant-length-matcher - (tagbody - forward-loop - (when (>= curr-pos target-end-pos) - (go backward-loop)) - (when ,check-curr-pos - (incf curr-pos len) - (go forward-loop)) - backward-loop - (when (< curr-pos start-pos) - (return-from greedy-constant-length-matcher nil)) - (let ((result (funcall next-fn curr-pos))) - (when result - (return-from greedy-constant-length-matcher result))) - (decf curr-pos len) - (go backward-loop))))))) - -(defun create-greedy-everything-matcher (maximum min-rest next-fn) - "Creates a closure which just matches as far ahead as possible, -i.e. a closure for a dot in single-line mode." - (declare #.*standard-optimize-settings*) - (declare (fixnum min-rest) (function next-fn)) - (if maximum - (lambda (start-pos) - (declare (fixnum start-pos maximum)) - ;; because we know LEN we know in advance where to stop at the - ;; latest; we also take into consideration MIN-REST, i.e. the - ;; minimal length of the part behind the repetition - (let ((target-end-pos (min (+ start-pos maximum) - (- *end-pos* min-rest)))) - (declare (fixnum target-end-pos)) - ;; start from the highest possible position and go backward - ;; until we're able to match the rest of the regex - (loop for curr-pos of-type fixnum from target-end-pos downto start-pos - thereis (funcall next-fn curr-pos)))) - ;; basically the same code; it's just a bit easier because we're - ;; not bounded by MAXIMUM - (lambda (start-pos) - (declare (fixnum start-pos)) - (let ((target-end-pos (- *end-pos* min-rest))) - (declare (fixnum target-end-pos)) - (loop for curr-pos of-type fixnum from target-end-pos downto start-pos - thereis (funcall next-fn curr-pos)))))) - -(defgeneric create-greedy-constant-length-matcher (repetition next-fn) - (declare #.*standard-optimize-settings*) - (:documentation "Creates a closure which tries to match REPETITION. -It is assumed that REPETITION is greedy and the minimal number of -repetitions is zero. It is furthermore assumed that the inner regex -of REPETITION is of fixed length and doesn't contain registers.")) - -(defmethod create-greedy-constant-length-matcher ((repetition repetition) - next-fn) - (declare #.*standard-optimize-settings*) - (let ((len (len repetition)) - (maximum (maximum repetition)) - (regex (regex repetition)) - (min-rest (min-rest repetition))) - (declare (fixnum len min-rest) - (function next-fn)) - (cond ((zerop len) - ;; inner regex has zero-length, so we can discard it - ;; completely - next-fn) - (t - ;; now first try to optimize for a couple of common cases - (typecase regex - (str - (let ((str (str regex))) - (if (= 1 len) - ;; a single character - (let ((chr (schar str 0))) - (if (case-insensitive-p regex) - (greedy-constant-length-closure - (char-equal chr (schar *string* curr-pos))) - (greedy-constant-length-closure - (char= chr (schar *string* curr-pos))))) - ;; a string - (if (case-insensitive-p regex) - (greedy-constant-length-closure - (*string*-equal str curr-pos (+ curr-pos len) 0 len)) - (greedy-constant-length-closure - (*string*= str curr-pos (+ curr-pos len) 0 len)))))) - (char-class - ;; a character class - (insert-char-class-tester (regex (schar *string* curr-pos)) - (greedy-constant-length-closure - (char-class-test)))) - (everything - ;; an EVERYTHING object, i.e. a dot - (if (single-line-p regex) - (create-greedy-everything-matcher maximum min-rest next-fn) - (greedy-constant-length-closure - (char/= #\Newline (schar *string* curr-pos))))) - (t - ;; the general case - we build an inner matcher which - ;; just checks for immediate success, i.e. NEXT-FN is - ;; #'IDENTITY - (let ((inner-matcher (create-matcher-aux regex #'identity))) - (declare (function inner-matcher)) - (greedy-constant-length-closure - (funcall inner-matcher curr-pos))))))))) - -(defgeneric create-greedy-no-zero-matcher (repetition next-fn) - (declare #.*standard-optimize-settings*) - (:documentation "Creates a closure which tries to match REPETITION. -It is assumed that REPETITION is greedy and the minimal number of -repetitions is zero. It is furthermore assumed that the inner regex -of REPETITION can never match a zero-length string \(or instead the -maximal number of repetitions is 1).")) - -(defmethod create-greedy-no-zero-matcher ((repetition repetition) next-fn) - (declare #.*standard-optimize-settings*) - (let ((maximum (maximum repetition)) - ;; REPEAT-MATCHER is part of the closure's environment but it - ;; can only be defined after GREEDY-AUX is defined - repeat-matcher) - (declare (function next-fn)) - (cond - ((eql maximum 1) - ;; this is essentially like the next case but with a known - ;; MAXIMUM of 1 we can get away without a counter; note that - ;; we always arrive here if CONVERT optimizes * to - ;; (?:*)? - (setq repeat-matcher - (create-matcher-aux (regex repetition) next-fn)) - (lambda (start-pos) - (declare (function repeat-matcher)) - (or (funcall repeat-matcher start-pos) - (funcall next-fn start-pos)))) - (maximum - ;; we make a reservation for our slot in *REPEAT-COUNTERS* - ;; because we need to keep track whether we've reached MAXIMUM - ;; repetitions - (let ((rep-num (incf-after *rep-num*))) - (flet ((greedy-aux (start-pos) - (declare (fixnum start-pos maximum rep-num) - (function repeat-matcher)) - ;; the actual matcher which first tries to match the - ;; inner regex of REPETITION (if we haven't done so - ;; too often) and on failure calls NEXT-FN - (or (and (< (aref *repeat-counters* rep-num) maximum) - (incf (aref *repeat-counters* rep-num)) - ;; note that REPEAT-MATCHER will call - ;; GREEDY-AUX again recursively - (prog1 - (funcall repeat-matcher start-pos) - (decf (aref *repeat-counters* rep-num)))) - (funcall next-fn start-pos)))) - ;; create a closure to match the inner regex and to - ;; implement backtracking via GREEDY-AUX - (setq repeat-matcher - (create-matcher-aux (regex repetition) #'greedy-aux)) - ;; the closure we return is just a thin wrapper around - ;; GREEDY-AUX to initialize the repetition counter - (lambda (start-pos) - (declare (fixnum start-pos)) - (setf (aref *repeat-counters* rep-num) 0) - (greedy-aux start-pos))))) - (t - ;; easier code because we're not bounded by MAXIMUM, but - ;; basically the same - (flet ((greedy-aux (start-pos) - (declare (fixnum start-pos) - (function repeat-matcher)) - (or (funcall repeat-matcher start-pos) - (funcall next-fn start-pos)))) - (setq repeat-matcher - (create-matcher-aux (regex repetition) #'greedy-aux)) - #'greedy-aux))))) - -(defgeneric create-greedy-matcher (repetition next-fn) - (declare #.*standard-optimize-settings*) - (:documentation "Creates a closure which tries to match REPETITION. -It is assumed that REPETITION is greedy and the minimal number of -repetitions is zero.")) - -(defmethod create-greedy-matcher ((repetition repetition) next-fn) - (declare #.*standard-optimize-settings*) - (let ((maximum (maximum repetition)) - ;; we make a reservation for our slot in *LAST-POS-STORES* because - ;; we have to watch out for endless loops as the inner regex might - ;; match zero-length strings - (zero-length-num (incf-after *zero-length-num*)) - ;; REPEAT-MATCHER is part of the closure's environment but it - ;; can only be defined after GREEDY-AUX is defined - repeat-matcher) - (declare (fixnum zero-length-num) - (function next-fn)) - (cond - (maximum - ;; we make a reservation for our slot in *REPEAT-COUNTERS* - ;; because we need to keep track whether we've reached MAXIMUM - ;; repetitions - (let ((rep-num (incf-after *rep-num*))) - (flet ((greedy-aux (start-pos) - ;; the actual matcher which first tries to match the - ;; inner regex of REPETITION (if we haven't done so - ;; too often) and on failure calls NEXT-FN - (declare (fixnum start-pos maximum rep-num) - (function repeat-matcher)) - (let ((old-last-pos - (svref *last-pos-stores* zero-length-num))) - (when (and old-last-pos - (= (the fixnum old-last-pos) start-pos)) - ;; stop immediately if we've been here before, - ;; i.e. if the last attempt matched a zero-length - ;; string - (return-from greedy-aux (funcall next-fn start-pos))) - ;; otherwise remember this position for the next - ;; repetition - (setf (svref *last-pos-stores* zero-length-num) start-pos) - (or (and (< (aref *repeat-counters* rep-num) maximum) - (incf (aref *repeat-counters* rep-num)) - ;; note that REPEAT-MATCHER will call - ;; GREEDY-AUX again recursively - (prog1 - (funcall repeat-matcher start-pos) - (decf (aref *repeat-counters* rep-num)) - (setf (svref *last-pos-stores* zero-length-num) - old-last-pos))) - (funcall next-fn start-pos))))) - ;; create a closure to match the inner regex and to - ;; implement backtracking via GREEDY-AUX - (setq repeat-matcher - (create-matcher-aux (regex repetition) #'greedy-aux)) - ;; the closure we return is just a thin wrapper around - ;; GREEDY-AUX to initialize the repetition counter and our - ;; slot in *LAST-POS-STORES* - (lambda (start-pos) - (declare (fixnum start-pos)) - (setf (aref *repeat-counters* rep-num) 0 - (svref *last-pos-stores* zero-length-num) nil) - (greedy-aux start-pos))))) - (t - ;; easier code because we're not bounded by MAXIMUM, but - ;; basically the same - (flet ((greedy-aux (start-pos) - (declare (fixnum start-pos) - (function repeat-matcher)) - (let ((old-last-pos - (svref *last-pos-stores* zero-length-num))) - (when (and old-last-pos - (= (the fixnum old-last-pos) start-pos)) - (return-from greedy-aux (funcall next-fn start-pos))) - (setf (svref *last-pos-stores* zero-length-num) start-pos) - (or (prog1 - (funcall repeat-matcher start-pos) - (setf (svref *last-pos-stores* zero-length-num) old-last-pos)) - (funcall next-fn start-pos))))) - (setq repeat-matcher - (create-matcher-aux (regex repetition) #'greedy-aux)) - (lambda (start-pos) - (declare (fixnum start-pos)) - (setf (svref *last-pos-stores* zero-length-num) nil) - (greedy-aux start-pos))))))) - -;; code for non-greedy repetitions with minimum zero - -(defmacro non-greedy-constant-length-closure (check-curr-pos) - "This is the template for simple non-greedy repetitions \(where -simple means that the minimum number of repetitions is zero, that the -inner regex to be checked is of fixed length LEN, and that it doesn't -contain registers, i.e. there's no need for backtracking). -CHECK-CURR-POS is a form which checks whether the inner regex of the -repetition matches at CURR-POS." - `(if maximum - (lambda (start-pos) - (declare (fixnum start-pos maximum)) - ;; because we know LEN we know in advance where to stop at the - ;; latest; we also take into consideration MIN-REST, i.e. the - ;; minimal length of the part behind the repetition - (let ((target-end-pos (min (1+ (- *end-pos* len min-rest)) - (+ start-pos - (the fixnum (* len maximum)))))) - ;; move forward by LEN and always try NEXT-FN first, then - ;; CHECK-CUR-POS - (loop for curr-pos of-type fixnum from start-pos - below target-end-pos - by len - thereis (funcall next-fn curr-pos) - while ,check-curr-pos - finally (return (funcall next-fn curr-pos))))) - ;; basically the same code; it's just a bit easier because we're - ;; not bounded by MAXIMUM - (lambda (start-pos) - (declare (fixnum start-pos)) - (let ((target-end-pos (1+ (- *end-pos* len min-rest)))) - (loop for curr-pos of-type fixnum from start-pos - below target-end-pos - by len - thereis (funcall next-fn curr-pos) - while ,check-curr-pos - finally (return (funcall next-fn curr-pos))))))) - -(defgeneric create-non-greedy-constant-length-matcher (repetition next-fn) - (declare #.*standard-optimize-settings*) - (:documentation "Creates a closure which tries to match REPETITION. -It is assumed that REPETITION is non-greedy and the minimal number of -repetitions is zero. It is furthermore assumed that the inner regex -of REPETITION is of fixed length and doesn't contain registers.")) - -(defmethod create-non-greedy-constant-length-matcher ((repetition repetition) next-fn) - (declare #.*standard-optimize-settings*) - (let ((len (len repetition)) - (maximum (maximum repetition)) - (regex (regex repetition)) - (min-rest (min-rest repetition))) - (declare (fixnum len min-rest) - (function next-fn)) - (cond ((zerop len) - ;; inner regex has zero-length, so we can discard it - ;; completely - next-fn) - (t - ;; now first try to optimize for a couple of common cases - (typecase regex - (str - (let ((str (str regex))) - (if (= 1 len) - ;; a single character - (let ((chr (schar str 0))) - (if (case-insensitive-p regex) - (non-greedy-constant-length-closure - (char-equal chr (schar *string* curr-pos))) - (non-greedy-constant-length-closure - (char= chr (schar *string* curr-pos))))) - ;; a string - (if (case-insensitive-p regex) - (non-greedy-constant-length-closure - (*string*-equal str curr-pos (+ curr-pos len) 0 len)) - (non-greedy-constant-length-closure - (*string*= str curr-pos (+ curr-pos len) 0 len)))))) - (char-class - ;; a character class - (insert-char-class-tester (regex (schar *string* curr-pos)) - (non-greedy-constant-length-closure - (char-class-test)))) - (everything - (if (single-line-p regex) - ;; a dot which really can match everything; we rely - ;; on the compiler to optimize this away - (non-greedy-constant-length-closure - t) - ;; a dot which has to watch out for #\Newline - (non-greedy-constant-length-closure - (char/= #\Newline (schar *string* curr-pos))))) - (t - ;; the general case - we build an inner matcher which - ;; just checks for immediate success, i.e. NEXT-FN is - ;; #'IDENTITY - (let ((inner-matcher (create-matcher-aux regex #'identity))) - (declare (function inner-matcher)) - (non-greedy-constant-length-closure - (funcall inner-matcher curr-pos))))))))) - -(defgeneric create-non-greedy-no-zero-matcher (repetition next-fn) - (declare #.*standard-optimize-settings*) - (:documentation "Creates a closure which tries to match REPETITION. -It is assumed that REPETITION is non-greedy and the minimal number of -repetitions is zero. It is furthermore assumed that the inner regex -of REPETITION can never match a zero-length string \(or instead the -maximal number of repetitions is 1).")) - -(defmethod create-non-greedy-no-zero-matcher ((repetition repetition) next-fn) - (declare #.*standard-optimize-settings*) - (let ((maximum (maximum repetition)) - ;; REPEAT-MATCHER is part of the closure's environment but it - ;; can only be defined after NON-GREEDY-AUX is defined - repeat-matcher) - (declare (function next-fn)) - (cond - ((eql maximum 1) - ;; this is essentially like the next case but with a known - ;; MAXIMUM of 1 we can get away without a counter - (setq repeat-matcher - (create-matcher-aux (regex repetition) next-fn)) - (lambda (start-pos) - (declare (function repeat-matcher)) - (or (funcall next-fn start-pos) - (funcall repeat-matcher start-pos)))) - (maximum - ;; we make a reservation for our slot in *REPEAT-COUNTERS* - ;; because we need to keep track whether we've reached MAXIMUM - ;; repetitions - (let ((rep-num (incf-after *rep-num*))) - (flet ((non-greedy-aux (start-pos) - ;; the actual matcher which first calls NEXT-FN and - ;; on failure tries to match the inner regex of - ;; REPETITION (if we haven't done so too often) - (declare (fixnum start-pos maximum rep-num) - (function repeat-matcher)) - (or (funcall next-fn start-pos) - (and (< (aref *repeat-counters* rep-num) maximum) - (incf (aref *repeat-counters* rep-num)) - ;; note that REPEAT-MATCHER will call - ;; NON-GREEDY-AUX again recursively - (prog1 - (funcall repeat-matcher start-pos) - (decf (aref *repeat-counters* rep-num))))))) - ;; create a closure to match the inner regex and to - ;; implement backtracking via NON-GREEDY-AUX - (setq repeat-matcher - (create-matcher-aux (regex repetition) #'non-greedy-aux)) - ;; the closure we return is just a thin wrapper around - ;; NON-GREEDY-AUX to initialize the repetition counter - (lambda (start-pos) - (declare (fixnum start-pos)) - (setf (aref *repeat-counters* rep-num) 0) - (non-greedy-aux start-pos))))) - (t - ;; easier code because we're not bounded by MAXIMUM, but - ;; basically the same - (flet ((non-greedy-aux (start-pos) - (declare (fixnum start-pos) - (function repeat-matcher)) - (or (funcall next-fn start-pos) - (funcall repeat-matcher start-pos)))) - (setq repeat-matcher - (create-matcher-aux (regex repetition) #'non-greedy-aux)) - #'non-greedy-aux))))) - -(defgeneric create-non-greedy-matcher (repetition next-fn) - (declare #.*standard-optimize-settings*) - (:documentation "Creates a closure which tries to match REPETITION. -It is assumed that REPETITION is non-greedy and the minimal number of -repetitions is zero.")) - -(defmethod create-non-greedy-matcher ((repetition repetition) next-fn) - (declare #.*standard-optimize-settings*) - ;; we make a reservation for our slot in *LAST-POS-STORES* because - ;; we have to watch out for endless loops as the inner regex might - ;; match zero-length strings - (let ((zero-length-num (incf-after *zero-length-num*)) - (maximum (maximum repetition)) - ;; REPEAT-MATCHER is part of the closure's environment but it - ;; can only be defined after NON-GREEDY-AUX is defined - repeat-matcher) - (declare (fixnum zero-length-num) - (function next-fn)) - (cond - (maximum - ;; we make a reservation for our slot in *REPEAT-COUNTERS* - ;; because we need to keep track whether we've reached MAXIMUM - ;; repetitions - (let ((rep-num (incf-after *rep-num*))) - (flet ((non-greedy-aux (start-pos) - ;; the actual matcher which first calls NEXT-FN and - ;; on failure tries to match the inner regex of - ;; REPETITION (if we haven't done so too often) - (declare (fixnum start-pos maximum rep-num) - (function repeat-matcher)) - (let ((old-last-pos - (svref *last-pos-stores* zero-length-num))) - (when (and old-last-pos - (= (the fixnum old-last-pos) start-pos)) - ;; stop immediately if we've been here before, - ;; i.e. if the last attempt matched a zero-length - ;; string - (return-from non-greedy-aux (funcall next-fn start-pos))) - ;; otherwise remember this position for the next - ;; repetition - (setf (svref *last-pos-stores* zero-length-num) start-pos) - (or (funcall next-fn start-pos) - (and (< (aref *repeat-counters* rep-num) maximum) - (incf (aref *repeat-counters* rep-num)) - ;; note that REPEAT-MATCHER will call - ;; NON-GREEDY-AUX again recursively - (prog1 - (funcall repeat-matcher start-pos) - (decf (aref *repeat-counters* rep-num)) - (setf (svref *last-pos-stores* zero-length-num) - old-last-pos))))))) - ;; create a closure to match the inner regex and to - ;; implement backtracking via NON-GREEDY-AUX - (setq repeat-matcher - (create-matcher-aux (regex repetition) #'non-greedy-aux)) - ;; the closure we return is just a thin wrapper around - ;; NON-GREEDY-AUX to initialize the repetition counter and our - ;; slot in *LAST-POS-STORES* - (lambda (start-pos) - (declare (fixnum start-pos)) - (setf (aref *repeat-counters* rep-num) 0 - (svref *last-pos-stores* zero-length-num) nil) - (non-greedy-aux start-pos))))) - (t - ;; easier code because we're not bounded by MAXIMUM, but - ;; basically the same - (flet ((non-greedy-aux (start-pos) - (declare (fixnum start-pos) - (function repeat-matcher)) - (let ((old-last-pos - (svref *last-pos-stores* zero-length-num))) - (when (and old-last-pos - (= (the fixnum old-last-pos) start-pos)) - (return-from non-greedy-aux (funcall next-fn start-pos))) - (setf (svref *last-pos-stores* zero-length-num) start-pos) - (or (funcall next-fn start-pos) - (prog1 - (funcall repeat-matcher start-pos) - (setf (svref *last-pos-stores* zero-length-num) - old-last-pos)))))) - (setq repeat-matcher - (create-matcher-aux (regex repetition) #'non-greedy-aux)) - (lambda (start-pos) - (declare (fixnum start-pos)) - (setf (svref *last-pos-stores* zero-length-num) nil) - (non-greedy-aux start-pos))))))) - -;; code for constant repetitions, i.e. those with a fixed number of repetitions - -(defmacro constant-repetition-constant-length-closure (check-curr-pos) - "This is the template for simple constant repetitions (where simple -means that the inner regex to be checked is of fixed length LEN, and -that it doesn't contain registers, i.e. there's no need for -backtracking) and where constant means that MINIMUM is equal to -MAXIMUM. CHECK-CURR-POS is a form which checks whether the inner -regex of the repetition matches at CURR-POS." - `(lambda (start-pos) - (declare (fixnum start-pos)) - (let ((target-end-pos (+ start-pos - (the fixnum (* len repetitions))))) - (declare (fixnum target-end-pos)) - ;; first check if we won't go beyond the end of the string - (and (>= *end-pos* target-end-pos) - ;; then loop through all repetitions step by step - (loop for curr-pos of-type fixnum from start-pos - below target-end-pos - by len - always ,check-curr-pos) - ;; finally call NEXT-FN if we made it that far - (funcall next-fn target-end-pos))))) - -(defgeneric create-constant-repetition-constant-length-matcher - (repetition next-fn) - (declare #.*standard-optimize-settings*) - (:documentation "Creates a closure which tries to match REPETITION. -It is assumed that REPETITION has a constant number of repetitions. -It is furthermore assumed that the inner regex of REPETITION is of -fixed length and doesn't contain registers.")) - -(defmethod create-constant-repetition-constant-length-matcher - ((repetition repetition) next-fn) - (declare #.*standard-optimize-settings*) - (let ((len (len repetition)) - (repetitions (minimum repetition)) - (regex (regex repetition))) - (declare (fixnum len repetitions) - (function next-fn)) - (if (zerop len) - ;; if the length is zero it suffices to try once - (create-matcher-aux regex next-fn) - ;; otherwise try to optimize for a couple of common cases - (typecase regex - (str - (let ((str (str regex))) - (if (= 1 len) - ;; a single character - (let ((chr (schar str 0))) - (if (case-insensitive-p regex) - (constant-repetition-constant-length-closure - (and (char-equal chr (schar *string* curr-pos)) - (1+ curr-pos))) - (constant-repetition-constant-length-closure - (and (char= chr (schar *string* curr-pos)) - (1+ curr-pos))))) - ;; a string - (if (case-insensitive-p regex) - (constant-repetition-constant-length-closure - (let ((next-pos (+ curr-pos len))) - (declare (fixnum next-pos)) - (and (*string*-equal str curr-pos next-pos 0 len) - next-pos))) - (constant-repetition-constant-length-closure - (let ((next-pos (+ curr-pos len))) - (declare (fixnum next-pos)) - (and (*string*= str curr-pos next-pos 0 len) - next-pos))))))) - (char-class - ;; a character class - (insert-char-class-tester (regex (schar *string* curr-pos)) - (constant-repetition-constant-length-closure - (and (char-class-test) - (1+ curr-pos))))) - (everything - (if (single-line-p regex) - ;; a dot which really matches everything - we just have to - ;; advance the index into *STRING* accordingly and check - ;; if we didn't go past the end - (lambda (start-pos) - (declare (fixnum start-pos)) - (let ((next-pos (+ start-pos repetitions))) - (declare (fixnum next-pos)) - (and (<= next-pos *end-pos*) - (funcall next-fn next-pos)))) - ;; a dot which is not in single-line-mode - make sure we - ;; don't match #\Newline - (constant-repetition-constant-length-closure - (and (char/= #\Newline (schar *string* curr-pos)) - (1+ curr-pos))))) - (t - ;; the general case - we build an inner matcher which just - ;; checks for immediate success, i.e. NEXT-FN is #'IDENTITY - (let ((inner-matcher (create-matcher-aux regex #'identity))) - (declare (function inner-matcher)) - (constant-repetition-constant-length-closure - (funcall inner-matcher curr-pos)))))))) - -(defgeneric create-constant-repetition-matcher (repetition next-fn) - (declare #.*standard-optimize-settings*) - (:documentation "Creates a closure which tries to match REPETITION. -It is assumed that REPETITION has a constant number of repetitions.")) - -(defmethod create-constant-repetition-matcher ((repetition repetition) next-fn) - (declare #.*standard-optimize-settings*) - (let ((repetitions (minimum repetition)) - ;; we make a reservation for our slot in *REPEAT-COUNTERS* - ;; because we need to keep track of the number of repetitions - (rep-num (incf-after *rep-num*)) - ;; REPEAT-MATCHER is part of the closure's environment but it - ;; can only be defined after NON-GREEDY-AUX is defined - repeat-matcher) - (declare (fixnum repetitions rep-num) - (function next-fn)) - (if (zerop (min-len repetition)) - ;; we make a reservation for our slot in *LAST-POS-STORES* - ;; because we have to watch out for needless loops as the inner - ;; regex might match zero-length strings - (let ((zero-length-num (incf-after *zero-length-num*))) - (declare (fixnum zero-length-num)) - (flet ((constant-aux (start-pos) - ;; the actual matcher which first calls NEXT-FN and - ;; on failure tries to match the inner regex of - ;; REPETITION (if we haven't done so too often) - (declare (fixnum start-pos) - (function repeat-matcher)) - (let ((old-last-pos - (svref *last-pos-stores* zero-length-num))) - (when (and old-last-pos - (= (the fixnum old-last-pos) start-pos)) - ;; if we've been here before we matched a - ;; zero-length string the last time, so we can - ;; just carry on because we will definitely be - ;; able to do this again often enough - (return-from constant-aux (funcall next-fn start-pos))) - ;; otherwise remember this position for the next - ;; repetition - (setf (svref *last-pos-stores* zero-length-num) start-pos) - (cond ((< (aref *repeat-counters* rep-num) repetitions) - ;; not enough repetitions yet, try it again - (incf (aref *repeat-counters* rep-num)) - ;; note that REPEAT-MATCHER will call - ;; CONSTANT-AUX again recursively - (prog1 - (funcall repeat-matcher start-pos) - (decf (aref *repeat-counters* rep-num)) - (setf (svref *last-pos-stores* zero-length-num) - old-last-pos))) - (t - ;; we're done - call NEXT-FN - (funcall next-fn start-pos)))))) - ;; create a closure to match the inner regex and to - ;; implement backtracking via CONSTANT-AUX - (setq repeat-matcher - (create-matcher-aux (regex repetition) #'constant-aux)) - ;; the closure we return is just a thin wrapper around - ;; CONSTANT-AUX to initialize the repetition counter - (lambda (start-pos) - (declare (fixnum start-pos)) - (setf (aref *repeat-counters* rep-num) 0 - (aref *last-pos-stores* zero-length-num) nil) - (constant-aux start-pos)))) - ;; easier code because we don't have to care about zero-length - ;; matches but basically the same - (flet ((constant-aux (start-pos) - (declare (fixnum start-pos) - (function repeat-matcher)) - (cond ((< (aref *repeat-counters* rep-num) repetitions) - (incf (aref *repeat-counters* rep-num)) - (prog1 - (funcall repeat-matcher start-pos) - (decf (aref *repeat-counters* rep-num)))) - (t (funcall next-fn start-pos))))) - (setq repeat-matcher - (create-matcher-aux (regex repetition) #'constant-aux)) - (lambda (start-pos) - (declare (fixnum start-pos)) - (setf (aref *repeat-counters* rep-num) 0) - (constant-aux start-pos)))))) - -;; the actual CREATE-MATCHER-AUX method for REPETITION objects which -;; utilizes all the functions and macros defined above - -(defmethod create-matcher-aux ((repetition repetition) next-fn) - (declare #.*standard-optimize-settings*) - (with-slots (minimum maximum len min-len greedyp contains-register-p) - repetition - (cond ((and maximum - (zerop maximum)) - ;; this should have been optimized away by CONVERT but just - ;; in case... - (error "Got REPETITION with MAXIMUM 0 \(should not happen)")) - ((and maximum - (= minimum maximum 1)) - ;; this should have been optimized away by CONVERT but just - ;; in case... - (error "Got REPETITION with MAXIMUM 1 and MINIMUM 1 \(should not happen)")) - ((and (eql minimum maximum) - len - (not contains-register-p)) - (create-constant-repetition-constant-length-matcher repetition next-fn)) - ((eql minimum maximum) - (create-constant-repetition-matcher repetition next-fn)) - ((and greedyp - len - (not contains-register-p)) - (create-greedy-constant-length-matcher repetition next-fn)) - ((and greedyp - (or (plusp min-len) - (eql maximum 1))) - (create-greedy-no-zero-matcher repetition next-fn)) - (greedyp - (create-greedy-matcher repetition next-fn)) - ((and len - (plusp len) - (not contains-register-p)) - (create-non-greedy-constant-length-matcher repetition next-fn)) - ((or (plusp min-len) - (eql maximum 1)) - (create-non-greedy-no-zero-matcher repetition next-fn)) - (t - (create-non-greedy-matcher repetition next-fn))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/scanner.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/scanner.lisp deleted file mode 100644 index ea43443..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/scanner.lisp +++ /dev/null @@ -1,506 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/scanner.lisp,v 1.36 2009/09/17 19:17:31 edi Exp $ - -;;; Here the scanner for the actual regex as well as utility scanners -;;; for the constant start and end strings are created. - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre) - -(defmacro bmh-matcher-aux (&key case-insensitive-p) - "Auxiliary macro used by CREATE-BMH-MATCHER." - (let ((char-compare (if case-insensitive-p 'char-equal 'char=))) - `(lambda (start-pos) - (declare (fixnum start-pos)) - (if (or (minusp start-pos) - (> (the fixnum (+ start-pos m)) *end-pos*)) - nil - (loop named bmh-matcher - for k of-type fixnum = (+ start-pos m -1) - then (+ k (max 1 (aref skip (char-code (schar *string* k))))) - while (< k *end-pos*) - do (loop for j of-type fixnum downfrom (1- m) - for i of-type fixnum downfrom k - while (and (>= j 0) - (,char-compare (schar *string* i) - (schar pattern j))) - finally (if (minusp j) - (return-from bmh-matcher (1+ i))))))))) - -(defun create-bmh-matcher (pattern case-insensitive-p) - "Returns a Boyer-Moore-Horspool matcher which searches the (special) -simple-string *STRING* for the first occurence of the substring -PATTERN. The search starts at the position START-POS within *STRING* -and stops before *END-POS* is reached. Depending on the second -argument the search is case-insensitive or not. If the special -variable *USE-BMH-MATCHERS* is NIL, use the standard SEARCH function -instead. \(BMH matchers are faster but need much more space.)" - (declare #.*standard-optimize-settings*) - ;; see for - ;; details - (unless *use-bmh-matchers* - (let ((test (if case-insensitive-p #'char-equal #'char=))) - (return-from create-bmh-matcher - (lambda (start-pos) - (declare (fixnum start-pos)) - (and (not (minusp start-pos)) - (search pattern - *string* - :start2 start-pos - :end2 *end-pos* - :test test)))))) - (let* ((m (length pattern)) - (skip (make-array *regex-char-code-limit* - :element-type 'fixnum - :initial-element m))) - (declare (fixnum m)) - (loop for k of-type fixnum below m - if case-insensitive-p - do (setf (aref skip (char-code (char-upcase (schar pattern k)))) (- m k 1) - (aref skip (char-code (char-downcase (schar pattern k)))) (- m k 1)) - else - do (setf (aref skip (char-code (schar pattern k))) (- m k 1))) - (if case-insensitive-p - (bmh-matcher-aux :case-insensitive-p t) - (bmh-matcher-aux)))) - -(defmacro char-searcher-aux (&key case-insensitive-p) - "Auxiliary macro used by CREATE-CHAR-SEARCHER." - (let ((char-compare (if case-insensitive-p 'char-equal 'char=))) - `(lambda (start-pos) - (declare (fixnum start-pos)) - (and (not (minusp start-pos)) - (loop for i of-type fixnum from start-pos below *end-pos* - thereis (and (,char-compare (schar *string* i) chr) i)))))) - -(defun create-char-searcher (chr case-insensitive-p) - "Returns a function which searches the (special) simple-string -*STRING* for the first occurence of the character CHR. The search -starts at the position START-POS within *STRING* and stops before -*END-POS* is reached. Depending on the second argument the search is -case-insensitive or not." - (declare #.*standard-optimize-settings*) - (if case-insensitive-p - (char-searcher-aux :case-insensitive-p t) - (char-searcher-aux))) - -(declaim (inline newline-skipper)) -(defun newline-skipper (start-pos) - "Finds the next occurence of a character in *STRING* which is behind -a #\Newline." - (declare #.*standard-optimize-settings*) - (declare (fixnum start-pos)) - ;; we can start with (1- START-POS) without testing for (PLUSP - ;; START-POS) because we know we'll never call NEWLINE-SKIPPER on - ;; the first iteration - (loop for i of-type fixnum from (1- start-pos) below *end-pos* - thereis (and (char= (schar *string* i) - #\Newline) - (1+ i)))) - -(defmacro insert-advance-fn (advance-fn) - "Creates the actual closure returned by CREATE-SCANNER-AUX by -replacing '(ADVANCE-FN-DEFINITION) with a suitable definition for -ADVANCE-FN. This is a utility macro used by CREATE-SCANNER-AUX." - (subst - advance-fn '(advance-fn-definition) - '(lambda (string start end) - (block scan - ;; initialize a couple of special variables used by the - ;; matchers (see file specials.lisp) - (let* ((*string* string) - (*start-pos* start) - (*end-pos* end) - ;; we will search forward for END-STRING if this value - ;; isn't at least as big as POS (see ADVANCE-FN), so it - ;; is safe to start to the left of *START-POS*; note - ;; that this value will _never_ be decremented - this - ;; is crucial to the scanning process - (*end-string-pos* (1- *start-pos*)) - ;; the next five will shadow the variables defined by - ;; DEFPARAMETER; at this point, we don't know if we'll - ;; actually use them, though - (*repeat-counters* *repeat-counters*) - (*last-pos-stores* *last-pos-stores*) - (*reg-starts* *reg-starts*) - (*regs-maybe-start* *regs-maybe-start*) - (*reg-ends* *reg-ends*) - ;; we might be able to optimize the scanning process by - ;; (virtually) shifting *START-POS* to the right - (scan-start-pos *start-pos*) - (starts-with-str (if start-string-test - (str starts-with) - nil)) - ;; we don't need to try further than MAX-END-POS - (max-end-pos (- *end-pos* min-len))) - (declare (fixnum scan-start-pos) - (function match-fn)) - ;; definition of ADVANCE-FN will be inserted here by macrology - (labels ((advance-fn-definition)) - (declare (inline advance-fn)) - (when (plusp rep-num) - ;; we have at least one REPETITION which needs to count - ;; the number of repetitions - (setq *repeat-counters* (make-array rep-num - :initial-element 0 - :element-type 'fixnum))) - (when (plusp zero-length-num) - ;; we have at least one REPETITION which needs to watch - ;; out for zero-length repetitions - (setq *last-pos-stores* (make-array zero-length-num - :initial-element nil))) - (when (plusp reg-num) - ;; we have registers in our regular expression - (setq *reg-starts* (make-array reg-num :initial-element nil) - *regs-maybe-start* (make-array reg-num :initial-element nil) - *reg-ends* (make-array reg-num :initial-element nil))) - (when end-anchored-p - ;; the regular expression has a constant end string which - ;; is anchored at the very end of the target string - ;; (perhaps modulo a #\Newline) - (let ((end-test-pos (- *end-pos* (the fixnum end-string-len)))) - (declare (fixnum end-test-pos) - (function end-string-test)) - (unless (setq *end-string-pos* (funcall end-string-test - end-test-pos)) - (when (and (= 1 (the fixnum end-anchored-p)) - (> *end-pos* scan-start-pos) - (char= #\Newline (schar *string* (1- *end-pos*)))) - ;; if we didn't find an end string candidate from - ;; END-TEST-POS and if a #\Newline at the end is - ;; allowed we try it again from one position to the - ;; left - (setq *end-string-pos* (funcall end-string-test - (1- end-test-pos)))))) - (unless (and *end-string-pos* - (<= *start-pos* *end-string-pos*)) - ;; no end string candidate found, so give up - (return-from scan nil)) - (when end-string-offset - ;; if the offset of the constant end string from the - ;; left of the regular expression is known we can start - ;; scanning further to the right; this is similar to - ;; what we might do in ADVANCE-FN - (setq scan-start-pos (max scan-start-pos - (- (the fixnum *end-string-pos*) - (the fixnum end-string-offset)))))) - (cond - (start-anchored-p - ;; we're anchored at the start of the target string, - ;; so no need to try again after first failure - (when (or (/= *start-pos* scan-start-pos) - (< max-end-pos *start-pos*)) - ;; if END-STRING-OFFSET has proven that we don't - ;; need to bother to scan from *START-POS* or if the - ;; minimal length of the regular expression is - ;; longer than the target string we give up - (return-from scan nil)) - (when starts-with-str - (locally - (declare (fixnum starts-with-len)) - (cond ((and (case-insensitive-p starts-with) - (not (*string*-equal starts-with-str - *start-pos* - (+ *start-pos* - starts-with-len) - 0 starts-with-len))) - ;; the regular expression has a - ;; case-insensitive constant start string - ;; and we didn't find it - (return-from scan nil)) - ((and (not (case-insensitive-p starts-with)) - (not (*string*= starts-with-str - *start-pos* - (+ *start-pos* starts-with-len) - 0 starts-with-len))) - ;; the regular expression has a - ;; case-sensitive constant start string - ;; and we didn't find it - (return-from scan nil)) - (t nil)))) - (when (and end-string-test - (not end-anchored-p)) - ;; the regular expression has a constant end string - ;; which isn't anchored so we didn't check for it - ;; already - (block end-string-loop - ;; we temporarily use *END-STRING-POS* as our - ;; starting position to look for end string - ;; candidates - (setq *end-string-pos* *start-pos*) - (loop - (unless (setq *end-string-pos* - (funcall (the function end-string-test) - *end-string-pos*)) - ;; no end string candidate found, so give up - (return-from scan nil)) - (unless end-string-offset - ;; end string doesn't have an offset so we - ;; can start scanning now - (return-from end-string-loop)) - (let ((maybe-start-pos (- (the fixnum *end-string-pos*) - (the fixnum end-string-offset)))) - (cond ((= maybe-start-pos *start-pos*) - ;; offset of end string into regular - ;; expression matches start anchor - - ;; fine... - (return-from end-string-loop)) - ((and (< maybe-start-pos *start-pos*) - (< (+ *end-string-pos* end-string-len) *end-pos*)) - ;; no match but maybe we find another - ;; one to the right - try again - (incf *end-string-pos*)) - (t - ;; otherwise give up - (return-from scan nil))))))) - ;; if we got here we scan exactly once - (let ((next-pos (funcall match-fn *start-pos*))) - (when next-pos - (values (if next-pos *start-pos* nil) - next-pos - *reg-starts* - *reg-ends*)))) - (t - (loop for pos = (if starts-with-everything - ;; don't jump to the next - ;; #\Newline on the first - ;; iteration - scan-start-pos - (advance-fn scan-start-pos)) - then (advance-fn pos) - ;; give up if the regular expression can't fit - ;; into the rest of the target string - while (and pos - (<= (the fixnum pos) max-end-pos)) - do (let ((next-pos (funcall match-fn pos))) - (when next-pos - (return-from scan (values pos - next-pos - *reg-starts* - *reg-ends*))) - ;; not yet found, increment POS - #-cormanlisp (incf (the fixnum pos)) - #+cormanlisp (incf pos))))))))) - :test #'equalp)) - -(defun create-scanner-aux (match-fn - min-len - start-anchored-p - starts-with - start-string-test - end-anchored-p - end-string-test - end-string-len - end-string-offset - rep-num - zero-length-num - reg-num) - "Auxiliary function to create and return a scanner \(which is -actually a closure). Used by CREATE-SCANNER." - (declare #.*standard-optimize-settings*) - (declare (fixnum min-len zero-length-num rep-num reg-num)) - (let ((starts-with-len (if (typep starts-with 'str) - (len starts-with))) - (starts-with-everything (typep starts-with 'everything))) - (cond - ;; this COND statement dispatches on the different versions we - ;; have for ADVANCE-FN and creates different closures for each; - ;; note that you see only the bodies of ADVANCE-FN below - the - ;; actual scanner is defined in INSERT-ADVANCE-FN above; (we - ;; could have done this with closures instead of macrology but - ;; would have consed a lot more) - ((and start-string-test end-string-test end-string-offset) - ;; we know that the regular expression has constant start and - ;; end strings and we know the end string's offset (from the - ;; left) - (insert-advance-fn - (advance-fn (pos) - (declare (fixnum end-string-offset starts-with-len) - (function start-string-test end-string-test)) - (loop - (unless (setq pos (funcall start-string-test pos)) - ;; give up completely if we can't find a start string - ;; candidate - (return-from scan nil)) - (locally - ;; from here we know that POS is a FIXNUM - (declare (fixnum pos)) - (when (= pos (- (the fixnum *end-string-pos*) end-string-offset)) - ;; if we already found an end string candidate the - ;; position of which matches the start string - ;; candidate we're done - (return-from advance-fn pos)) - (let ((try-pos (+ pos starts-with-len))) - ;; otherwise try (again) to find an end string - ;; candidate which starts behind the start string - ;; candidate - (loop - (unless (setq *end-string-pos* - (funcall end-string-test try-pos)) - ;; no end string candidate found, so give up - (return-from scan nil)) - ;; NEW-POS is where we should start scanning - ;; according to the end string candidate - (let ((new-pos (- (the fixnum *end-string-pos*) - end-string-offset))) - (declare (fixnum new-pos *end-string-pos*)) - (cond ((= new-pos pos) - ;; if POS and NEW-POS are equal then the - ;; two candidates agree so we're fine - (return-from advance-fn pos)) - ((> new-pos pos) - ;; if NEW-POS is further to the right we - ;; advance POS and try again, i.e. we go - ;; back to the start of the outer LOOP - (setq pos new-pos) - ;; this means "return from inner LOOP" - (return)) - (t - ;; otherwise NEW-POS is smaller than POS, - ;; so we have to redo the inner LOOP to - ;; find another end string candidate - ;; further to the right - (setq try-pos (1+ *end-string-pos*)))))))))))) - ((and starts-with-everything end-string-test end-string-offset) - ;; we know that the regular expression starts with ".*" (which - ;; is not in single-line-mode, see CREATE-SCANNER-AUX) and ends - ;; with a constant end string and we know the end string's - ;; offset (from the left) - (insert-advance-fn - (advance-fn (pos) - (declare (fixnum end-string-offset) - (function end-string-test)) - (loop - (unless (setq pos (newline-skipper pos)) - ;; if we can't find a #\Newline we give up immediately - (return-from scan nil)) - (locally - ;; from here we know that POS is a FIXNUM - (declare (fixnum pos)) - (when (= pos (- (the fixnum *end-string-pos*) end-string-offset)) - ;; if we already found an end string candidate the - ;; position of which matches the place behind the - ;; #\Newline we're done - (return-from advance-fn pos)) - (let ((try-pos pos)) - ;; otherwise try (again) to find an end string - ;; candidate which starts behind the #\Newline - (loop - (unless (setq *end-string-pos* - (funcall end-string-test try-pos)) - ;; no end string candidate found, so we give up - (return-from scan nil)) - ;; NEW-POS is where we should start scanning - ;; according to the end string candidate - (let ((new-pos (- (the fixnum *end-string-pos*) - end-string-offset))) - (declare (fixnum new-pos *end-string-pos*)) - (cond ((= new-pos pos) - ;; if POS and NEW-POS are equal then the - ;; the end string candidate agrees with - ;; the #\Newline so we're fine - (return-from advance-fn pos)) - ((> new-pos pos) - ;; if NEW-POS is further to the right we - ;; advance POS and try again, i.e. we go - ;; back to the start of the outer LOOP - (setq pos new-pos) - ;; this means "return from inner LOOP" - (return)) - (t - ;; otherwise NEW-POS is smaller than POS, - ;; so we have to redo the inner LOOP to - ;; find another end string candidate - ;; further to the right - (setq try-pos (1+ *end-string-pos*)))))))))))) - ((and start-string-test end-string-test) - ;; we know that the regular expression has constant start and - ;; end strings; similar to the first case but we only need to - ;; check for the end string, it doesn't provide enough - ;; information to advance POS - (insert-advance-fn - (advance-fn (pos) - (declare (function start-string-test end-string-test)) - (unless (setq pos (funcall start-string-test pos)) - (return-from scan nil)) - (if (<= (the fixnum pos) - (the fixnum *end-string-pos*)) - (return-from advance-fn pos)) - (unless (setq *end-string-pos* (funcall end-string-test pos)) - (return-from scan nil)) - pos))) - ((and starts-with-everything end-string-test) - ;; we know that the regular expression starts with ".*" (which - ;; is not in single-line-mode, see CREATE-SCANNER-AUX) and ends - ;; with a constant end string; similar to the second case but we - ;; only need to check for the end string, it doesn't provide - ;; enough information to advance POS - (insert-advance-fn - (advance-fn (pos) - (declare (function end-string-test)) - (unless (setq pos (newline-skipper pos)) - (return-from scan nil)) - (if (<= (the fixnum pos) - (the fixnum *end-string-pos*)) - (return-from advance-fn pos)) - (unless (setq *end-string-pos* (funcall end-string-test pos)) - (return-from scan nil)) - pos))) - (start-string-test - ;; just check for constant start string candidate - (insert-advance-fn - (advance-fn (pos) - (declare (function start-string-test)) - (unless (setq pos (funcall start-string-test pos)) - (return-from scan nil)) - pos))) - (starts-with-everything - ;; just advance POS with NEWLINE-SKIPPER - (insert-advance-fn - (advance-fn (pos) - (unless (setq pos (newline-skipper pos)) - (return-from scan nil)) - pos))) - (end-string-test - ;; just check for the next end string candidate if POS has - ;; advanced beyond the last one - (insert-advance-fn - (advance-fn (pos) - (declare (function end-string-test)) - (if (<= (the fixnum pos) - (the fixnum *end-string-pos*)) - (return-from advance-fn pos)) - (unless (setq *end-string-pos* (funcall end-string-test pos)) - (return-from scan nil)) - pos))) - (t - ;; not enough optimization information about the regular - ;; expression to optimize so we just return POS - (insert-advance-fn - (advance-fn (pos) - pos)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/specials.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/specials.lisp deleted file mode 100644 index b03c42c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/specials.lisp +++ /dev/null @@ -1,172 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/specials.lisp,v 1.43 2009/10/28 07:36:15 edi Exp $ - -;;; globally declared special variables - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre) - -;;; special variables used to effect declarations - -(defvar *standard-optimize-settings* - '(optimize - speed - (space 0) - (debug 1) - (compilation-speed 0)) - "The standard optimize settings used by most declaration expressions.") - -(defvar *special-optimize-settings* - '(optimize speed space) - "Special optimize settings used only by a few declaration expressions.") - -;;; special variables used by the lexer/parser combo - -(defvar *extended-mode-p* nil - "Whether the parser will start in extended mode.") -(declaim (boolean *extended-mode-p*)) - -;;; special variables used by the SCAN function and the matchers - -(defvar *regex-char-code-limit* char-code-limit - "The upper exclusive bound on the char-codes of characters which can -occur in character classes. Change this value BEFORE creating -scanners if you don't need the \(full) Unicode support of -implementations like AllegroCL, CLISP, LispWorks, or SBCL.") -(declaim (fixnum *regex-char-code-limit*)) - -(defvar *string* (make-sequence #+:lispworks 'lw:simple-text-string - #-:lispworks 'simple-string - 0) - "The string which is currently scanned by SCAN. -Will always be coerced to a SIMPLE-STRING.") -#+:lispworks -(declaim (lw:simple-text-string *string*)) -#-:lispworks -(declaim (simple-string *string*)) - -(defvar *start-pos* 0 - "Where to start scanning within *STRING*.") -(declaim (fixnum *start-pos*)) - -(defvar *real-start-pos* nil - "The real start of *STRING*. This is for repeated scans and is only used internally.") -(declaim (type (or null fixnum) *real-start-pos*)) - -(defvar *end-pos* 0 - "Where to stop scanning within *STRING*.") -(declaim (fixnum *end-pos*)) - -(defvar *reg-starts* (make-array 0) - "An array which holds the start positions -of the current register candidates.") -(declaim (simple-vector *reg-starts*)) - -(defvar *regs-maybe-start* (make-array 0) - "An array which holds the next start positions -of the current register candidates.") -(declaim (simple-vector *regs-maybe-start*)) - -(defvar *reg-ends* (make-array 0) - "An array which holds the end positions -of the current register candidates.") -(declaim (simple-vector *reg-ends*)) - -(defvar *end-string-pos* nil - "Start of the next possible end-string candidate.") - -(defvar *rep-num* 0 - "Counts the number of \"complicated\" repetitions while the matchers -are built.") -(declaim (fixnum *rep-num*)) - -(defvar *zero-length-num* 0 - "Counts the number of repetitions the inner regexes of which may -have zero-length while the matchers are built.") -(declaim (fixnum *zero-length-num*)) - -(defvar *repeat-counters* (make-array 0 - :initial-element 0 - :element-type 'fixnum) - "An array to keep track of how often -repetitive patterns have been tested already.") -(declaim (type (array fixnum (*)) *repeat-counters*)) - -(defvar *last-pos-stores* (make-array 0) - "An array to keep track of the last positions -where we saw repetitive patterns. -Only used for patterns which might have zero length.") -(declaim (simple-vector *last-pos-stores*)) - -(defvar *use-bmh-matchers* nil - "Whether the scanners created by CREATE-SCANNER should use the \(fast -but large) Boyer-Moore-Horspool matchers.") - -(defvar *optimize-char-classes* nil - "Whether character classes should be compiled into look-ups into -O\(1) data structures. This is usually fast but will be costly in -terms of scanner creation time and might be costly in terms of size if -*REGEX-CHAR-CODE-LIMIT* is high. This value will be used as the :KIND -keyword argument to CREATE-OPTIMIZED-TEST-FUNCTION - see there for the -possible non-NIL values.") - -(defvar *property-resolver* nil - "Should be NIL or a designator for a function which accepts strings -and returns unary character test functions or NIL. This 'resolver' is -intended to handle `character properties' like \\p{IsAlpha}. If -*PROPERTY-RESOLVER* is NIL, then the parser will simply treat \\p and -\\P as #\\p and #\\P as in older versions of CL-PPCRE.") - -(defvar *allow-quoting* nil - "Whether the parser should support Perl's \\Q and \\E.") - -(defvar *allow-named-registers* nil - "Whether the parser should support AllegroCL's named registers -\(?\"\") and back-reference \\k syntax.") - -(pushnew :cl-ppcre *features*) - -;; stuff for Nikodemus Siivola's HYPERDOC -;; see -;; and -;; also used by LW-ADD-ONS - -(defvar *hyperdoc-base-uri* "http://weitz.de/cl-ppcre/") - -(let ((exported-symbols-alist - (loop for symbol being the external-symbols of :cl-ppcre - collect (cons symbol - (concatenate 'string - "#" - (string-downcase symbol)))))) - (defun hyperdoc-lookup (symbol type) - (declare (ignore type)) - (cdr (assoc symbol - exported-symbols-alist - :test #'eq)))) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/packages.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/packages.lisp deleted file mode 100644 index 6337071..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/packages.lisp +++ /dev/null @@ -1,37 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/test/packages.lisp,v 1.4 2009/09/17 19:17:36 edi Exp $ - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-user) - -(defpackage :cl-ppcre-test - #+genera (:shadowing-import-from :common-lisp :lambda) - (:use #-:genera :cl #+:genera :future-common-lisp :cl-ppcre) - (:import-from :cl-ppcre :*standard-optimize-settings* - :string-list-to-simple-string) - (:export :run-all-tests :unicode-test)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/perl-tests.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/perl-tests.lisp deleted file mode 100644 index f714c8c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/perl-tests.lisp +++ /dev/null @@ -1,150 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE-TEST; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/test/perl-tests.lisp,v 1.8 2009/09/17 19:17:36 edi Exp $ - -;;; The tests in this file test CL-PPCRE against testdata generated by -;;; the Perl program `perltest.pl' from the input file `testinput' in -;;; order to check compatibility with Perl and correctness of the -;;; regex engine. - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre-test) - -(defvar *tests-to-skip* '(636 638 662 790 1439) - "Some tests we skip because the testdata is generated by a Perl -program and CL-PPCRE differs from Perl for these tests - on purpose.") - -(defun create-string-from-input (input) - "Converts INPUT to a string which can be used in TEST below. The -input file `testdata' encodes strings containing non-printable -characters as lists where those characters are represented by their -character code." - (etypecase input - ((or null string) input) - (list (string-list-to-simple-string - (loop for element in input - if (stringp element) - collect element - else - collect (string (code-char element))))))) - -(defun perl-test (&key (file-name - (make-pathname :name "perltestdata" - :type nil :version nil - :defaults *this-file*) - file-name-provided-p) - (external-format '(:latin-1 :eol-style :lf)) - verbose) - "Loops through all test cases in FILE-NAME and prints a report if -VERBOSE is true. EXTERNAL-FORMAT is the FLEXI-STREAMS external format -which is used to read the file. Returns a true value if all tests -succeeded. - -For the syntax of the tests in FILE-NAME refer to the source code of -this function and to the Perl script perltest.pl which generates such -test files." - (declare #.*standard-optimize-settings*) - (with-open-file (binary-stream file-name :element-type 'flex:octet) - (let ((stream (flex:make-flexi-stream binary-stream :external-format external-format)) - ;; the standard Perl tests don't need full Unicode support - (*regex-char-code-limit* (if file-name-provided-p *regex-char-code-limit* 256)) - ;; we need this for the standard test suite or otherwise we - ;; might get stack overflows - (*optimize-char-classes* (if file-name-provided-p *optimize-char-classes* :charmap)) - ;; we only check for correctness and don't care about speed - ;; that match (but rather about space constraints of the - ;; trial versions) - (*use-bmh-matchers* (if file-name-provided-p *use-bmh-matchers* nil)) - ;; some tests in the Perl suite explicitly check for this - (*allow-quoting* (if file-name-provided-p *allow-quoting* t))) - (do-tests ((format nil "Running tests in file ~S" (file-namestring file-name)) - (not verbose)) - (let ((input-line (or (read stream nil) (done))) - errors) - (destructuring-bind (counter - info-string% - regex% - case-insensitive-mode - multi-line-mode - single-line-mode - extended-mode - target% - perl-error - expected-result% - expected-registers) - input-line - (destructuring-bind (info-string regex target expected-result) - (mapcar 'create-string-from-input - (list info-string% regex% target% expected-result%)) - (setq expected-registers (mapcar 'create-string-from-input expected-registers)) - (unless (find counter *tests-to-skip* :test #'=) - (when verbose - (format t "~&~4D: ~S" counter info-string)) - (block inner-test-block - (let ((scanner - (handler-bind ((error (lambda (condition) - (declare (ignore condition)) - (when perl-error - ;; we expected an - ;; error, so we can - ;; signal success - (return-from inner-test-block))))) - (create-scanner regex - :case-insensitive-mode case-insensitive-mode - :multi-line-mode multi-line-mode - :single-line-mode single-line-mode - :extended-mode extended-mode)))) - (multiple-value-bind (start end reg-starts reg-ends) - (scan scanner target) - (cond (perl-error - (push (format nil "expected an error but got a result.") - errors)) - (t - (when (not (eq start expected-result)) - (if start - (let ((result (subseq target start end))) - (unless (string= result expected-result) - (push (format nil "expected ~S but got ~S." - expected-result result) - errors)) - (setq reg-starts (coerce reg-starts 'list) - reg-ends (coerce reg-ends 'list)) - (loop for i from 0 - for expected-register in expected-registers - for reg-start = (nth i reg-starts) - for reg-end = (nth i reg-ends) - for register = (if (and reg-start reg-end) - (subseq target reg-start reg-end) - nil) - unless (string= expected-register register) - do (push (format nil "\\~A: expected ~S but got ~S." - (1+ i) expected-register register) - errors))) - (push (format nil "expected ~S but got ~S." - expected-result start) - errors)))))) - errors)))))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/perltest.pl b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/perltest.pl deleted file mode 100644 index b49d973..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/perltest.pl +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/perl -# $Header: /usr/local/cvsrep/cl-ppcre/test/perltest.pl,v 1.1 2008/07/06 21:24:39 edi Exp $ - -# This is a heavily modified version of the file 'perltest' which -# comes with the PCRE library package, which is open source software, -# written by Philip Hazel, and copyright by the University of -# Cambridge, England. - -# The PCRE library package is available from -# - -sub string_for_lisp { - my(@a, $t, $in_string, $switch); - - my $string = shift; - $string =~ s/\\/\\\\/g; - $string =~ s/"/\\"/g; - - return "\"$string\"" - if $string =~ /^[\n\x20-\x7f]*$/; - - $in_string = 1; - foreach $c (split(//, $string)) { - if (ord $c >= 32 and ord $c < 127) { - if ($in_string) { - $t .= $c; - } else { - $in_string = 1; - $t = $c; - } - } else { - if ($in_string) { - push @a, "\"$t\""; - $in_string = 0; - $switch = 1; - } - push @a, ord $c; - } - } - if ($switch) { - if ($in_string) { - push @a, "\"$t\""; - } - '(' . (join ' ', @a) . ')'; - } else { - "\"$t\""; - } -} - -NEXT_RE: while (1) { - last - if !($_ = <>); - next - if $_ eq ""; - - $pattern = $_; - - while ($pattern !~ /^\s*(.).*\1/s) { - last - if !($_ = <>); - $pattern .= $_; - } - - chomp($pattern); - $pattern =~ s/\s+$//; - $pattern =~ s/\+(?=[a-z]*$)//; - - $multi_line_mode = ($pattern =~ /m[a-z]*$/) ? 't' : 'nil'; - $single_line_mode = ($pattern =~ /s[a-z]*$/) ? 't' : 'nil'; - $extended_mode = ($pattern =~ /x[a-z]*$/) ? 't' : 'nil'; - $case_insensitive_mode = ($pattern =~ /i[a-z]*$/) ? 't' : 'nil'; - $pattern =~ s/^(.*)g([a-z]*)$/\1\2/; - - $pattern_for_lisp = $pattern; - $pattern_for_lisp =~ s/[a-z]*$//; - $pattern_for_lisp =~ s/^\s*(.)(.*)\1/$2/s; - $pattern_for_lisp =~ s/\\/\\\\/g; - $pattern_for_lisp =~ s/"/\\"/g; - - $pattern = "/(?#)/$2" - if ($pattern =~ /^(.)\1(.*)$/); - - while (1) { - last NEXT_RE - if !($_ = <>); - - chomp; - - s/\s+$//; - s/^\s+//; - - last - if ($_ eq ""); - - $info_string = string_for_lisp "\"$_\" =~ $pattern"; - $x = eval "\"$_\""; - - @subs = (); - - eval <<"END"; -if (\$x =~ ${pattern}) { - push \@subs,\$&; - push \@subs,\$1; - push \@subs,\$2; - push \@subs,\$3; - push \@subs,\$4; - push \@subs,\$5; - push \@subs,\$6; - push \@subs,\$7; - push \@subs,\$8; - push \@subs,\$9; - push \@subs,\$10; - push \@subs,\$11; - push \@subs,\$12; - push \@subs,\$13; - push \@subs,\$14; - push \@subs,\$15; - push \@subs,\$16; -} - -\$test = sub { - my \$times = shift; - - my \$start = time; - for (my \$i = 0; \$i < \$times; \$i++) { - \$x =~ ${pattern}; - } - return time - \$start; -}; -END - - $counter++; - print STDERR "$counter\n"; - - if ($@) { - $error = 't'; - } else { - $error = 'nil'; - } - - print "($counter $info_string \"$pattern_for_lisp\" $case_insensitive_mode $multi_line_mode $single_line_mode $extended_mode " . string_for_lisp($x) . " $error "; - if (!@subs) { - print 'nil nil'; - } else { - print string_for_lisp($subs[0]) . ' ('; - undef $not_first; - for ($i = 1; $i <= 16; $i++) { - print ' ' - unless $i == 1; - if (defined $subs[$i]) { - print string_for_lisp $subs[$i]; - } else { - print 'nil'; - } - } - print ')'; - } - print ")\n"; - } -} diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/perltestdata b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/perltestdata deleted file mode 100644 index 1b52320..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/perltestdata +++ /dev/null @@ -1,14292 +0,0 @@ -(1 "\"the quick brown fox\" =~ /the quick brown fox/" "the quick brown fox" nil nil nil nil "the quick brown fox" nil "the quick brown fox" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(2 "\"The quick brown FOX\" =~ /the quick brown fox/" "the quick brown fox" nil nil nil nil "The quick brown FOX" nil nil nil) -(3 "\"What do you know about the quick brown fox?\" =~ /the quick brown fox/" "the quick brown fox" nil nil nil nil "What do you know about the quick brown fox?" nil "the quick brown fox" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(4 "\"What do you know about THE QUICK BROWN FOX?\" =~ /the quick brown fox/" "the quick brown fox" nil nil nil nil "What do you know about THE QUICK BROWN FOX?" nil nil nil) -(5 "\"the quick brown fox\" =~ /The quick brown fox/i" "The quick brown fox" t nil nil nil "the quick brown fox" nil "the quick brown fox" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(6 "\"The quick brown FOX\" =~ /The quick brown fox/i" "The quick brown fox" t nil nil nil "The quick brown FOX" nil "The quick brown FOX" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(7 "\"What do you know about the quick brown fox?\" =~ /The quick brown fox/i" "The quick brown fox" t nil nil nil "What do you know about the quick brown fox?" nil "the quick brown fox" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(8 "\"What do you know about THE QUICK BROWN FOX?\" =~ /The quick brown fox/i" "The quick brown fox" t nil nil nil "What do you know about THE QUICK BROWN FOX?" nil "THE QUICK BROWN FOX" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(9 "\"abcd\\t\\n\\r\\f\\a\\e9;\\$\\\\?caxyz\" =~ /abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz/" "abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz" nil nil nil nil ("abcd" 9 10 13 12 7 27 "9;$\\?caxyz") nil ("abcd" 9 10 13 12 7 27 "9;$\\?caxyz") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(10 "\"abxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrrabbxyyyypqAzz" nil "abxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(11 "\"abxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrrabbxyyyypqAzz" nil "abxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(12 "\"aabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aabxyzpqrrrabbxyyyypqAzz" nil "aabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(13 "\"aaabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabxyzpqrrrabbxyyyypqAzz" nil "aaabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(14 "\"aaaabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabxyzpqrrrabbxyyyypqAzz" nil "aaaabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(15 "\"abcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abcxyzpqrrrabbxyyyypqAzz" nil "abcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(16 "\"aabcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aabcxyzpqrrrabbxyyyypqAzz" nil "aabcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(17 "\"aaabcxyzpqrrrabbxyyyypAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypAzz" nil "aaabcxyzpqrrrabbxyyyypAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(18 "\"aaabcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqAzz" nil "aaabcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(19 "\"aaabcxyzpqrrrabbxyyyypqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqAzz" nil "aaabcxyzpqrrrabbxyyyypqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(20 "\"aaabcxyzpqrrrabbxyyyypqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqAzz" nil "aaabcxyzpqrrrabbxyyyypqqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(21 "\"aaabcxyzpqrrrabbxyyyypqqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqqAzz" nil "aaabcxyzpqrrrabbxyyyypqqqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(22 "\"aaabcxyzpqrrrabbxyyyypqqqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqqqAzz" nil "aaabcxyzpqrrrabbxyyyypqqqqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(23 "\"aaabcxyzpqrrrabbxyyyypqqqqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqqqqAzz" nil "aaabcxyzpqrrrabbxyyyypqqqqqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(24 "\"aaaabcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzpqrrrabbxyyyypqAzz" nil "aaaabcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(25 "\"abxyzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzzpqrrrabbxyyyypqAzz" nil "abxyzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(26 "\"aabxyzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aabxyzzzpqrrrabbxyyyypqAzz" nil "aabxyzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(27 "\"aaabxyzzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabxyzzzzpqrrrabbxyyyypqAzz" nil "aaabxyzzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(28 "\"aaaabxyzzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabxyzzzzpqrrrabbxyyyypqAzz" nil "aaaabxyzzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(29 "\"abcxyzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abcxyzzpqrrrabbxyyyypqAzz" nil "abcxyzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(30 "\"aabcxyzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aabcxyzzzpqrrrabbxyyyypqAzz" nil "aabcxyzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(31 "\"aaabcxyzzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzzzzpqrrrabbxyyyypqAzz" nil "aaabcxyzzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(32 "\"aaaabcxyzzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbxyyyypqAzz" nil "aaaabcxyzzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(33 "\"aaaabcxyzzzzpqrrrabbbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbbxyyyypqAzz" nil "aaaabcxyzzzzpqrrrabbbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(34 "\"aaaabcxyzzzzpqrrrabbbxyyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbbxyyyyypqAzz" nil "aaaabcxyzzzzpqrrrabbbxyyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(35 "\"aaabcxyzpqrrrabbxyyyypABzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypABzz" nil "aaabcxyzpqrrrabbxyyyypABzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(36 "\"aaabcxyzpqrrrabbxyyyypABBzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypABBzz" nil "aaabcxyzpqrrrabbxyyyypABBzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(37 "\">>>aaabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil ">>>aaabxyzpqrrrabbxyyyypqAzz" nil "aaabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(38 "\">aaaabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil ">aaaabxyzpqrrrabbxyyyypqAzz" nil "aaaabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(39 "\">>>>abcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil ">>>>abcxyzpqrrrabbxyyyypqAzz" nil "abcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(40 "\"abxyzpqrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrabbxyyyypqAzz" nil nil nil) -(41 "\"abxyzpqrrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrrrabbxyyyypqAzz" nil nil nil) -(42 "\"abxyzpqrrrabxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrrabxyyyypqAzz" nil nil nil) -(43 "\"aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz" nil nil nil) -(44 "\"aaaabcxyzzzzpqrrrabbbxyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbbxyyypqAzz" nil nil nil) -(45 "\"aaabcxyzpqrrrabbxyyyypqqqqqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqqqqqAzz" nil nil nil) -(46 "\"abczz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil "abczz" nil "abczz" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(47 "\"abcabczz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil "abcabczz" nil "abcabczz" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(48 "\"zz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil "zz" nil nil nil) -(49 "\"abcabcabczz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil "abcabcabczz" nil nil nil) -(50 "\">>abczz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil ">>abczz" nil nil nil) -(51 "\"bc\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bc" nil "bc" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(52 "\"bbc\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbc" nil "bbc" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(53 "\"bbbc\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbc" nil "bbbc" ("bb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(54 "\"bac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bac" nil "bac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(55 "\"bbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbac" nil "bbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(56 "\"aac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "aac" nil "aac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(57 "\"abbbbbbbbbbbc\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "abbbbbbbbbbbc" nil "abbbbbbbbbbbc" ("bbbbbbbbbbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(58 "\"bbbbbbbbbbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbbbbbbbbbac" nil "bbbbbbbbbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(59 "\"aaac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "aaac" nil nil nil) -(60 "\"abbbbbbbbbbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "abbbbbbbbbbbac" nil nil nil) -(61 "\"bc\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bc" nil "bc" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(62 "\"bbc\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bbc" nil "bbc" ("bb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(63 "\"bbbc\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bbbc" nil "bbbc" ("bbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(64 "\"bac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bac" nil "bac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(65 "\"bbac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bbac" nil "bbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(66 "\"aac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "aac" nil "aac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(67 "\"abbbbbbbbbbbc\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "abbbbbbbbbbbc" nil "abbbbbbbbbbbc" ("bbbbbbbbbbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(68 "\"bbbbbbbbbbbac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bbbbbbbbbbbac" nil "bbbbbbbbbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(69 "\"aaac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "aaac" nil nil nil) -(70 "\"abbbbbbbbbbbac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "abbbbbbbbbbbac" nil nil nil) -(71 "\"bbc\" =~ /^(b+|a){1,2}?bc/" "^(b+|a){1,2}?bc" nil nil nil nil "bbc" nil "bbc" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(72 "\"babc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "babc" nil "babc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(73 "\"bbabc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "bbabc" nil "bbabc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(74 "\"bababc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "bababc" nil "bababc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(75 "\"bababbc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "bababbc" nil nil nil) -(76 "\"babababc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "babababc" nil nil nil) -(77 "\"babc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "babc" nil "babc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(78 "\"bbabc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "bbabc" nil "bbabc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(79 "\"bababc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "bababc" nil "bababc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(80 "\"bababbc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "bababbc" nil nil nil) -(81 "\"babababc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "babababc" nil nil nil) -(82 "\"\\x01\\x01\\e;z\" =~ /^\\ca\\cA\\c[\\c{\\c:/" "^\\ca\\cA\\c[\\c{\\c:" nil nil nil nil ("" 1 1 27 ";z") nil ("" 1 1 27 ";z") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(83 "\"athing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "athing" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(84 "\"bthing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "bthing" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(85 "\"]thing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "]thing" nil "]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(86 "\"cthing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "cthing" nil "c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(87 "\"dthing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "dthing" nil "d" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(88 "\"ething\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "ething" nil "e" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(89 "\"fthing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "fthing" nil nil nil) -(90 "\"[thing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "[thing" nil nil nil) -(91 "\"\\\\thing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "\\thing" nil nil nil) -(92 "\"]thing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "]thing" nil "]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(93 "\"cthing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "cthing" nil "c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(94 "\"dthing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "dthing" nil "d" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(95 "\"ething\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "ething" nil "e" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(96 "\"athing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "athing" nil nil nil) -(97 "\"fthing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "fthing" nil nil nil) -(98 "\"fthing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "fthing" nil "f" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(99 "\"[thing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "[thing" nil "[" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(100 "\"\\\\thing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "\\thing" nil "\\" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(101 "\"athing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "athing" nil nil nil) -(102 "\"bthing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "bthing" nil nil nil) -(103 "\"]thing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "]thing" nil nil nil) -(104 "\"cthing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "cthing" nil nil nil) -(105 "\"dthing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "dthing" nil nil nil) -(106 "\"ething\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "ething" nil nil nil) -(107 "\"athing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "athing" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(108 "\"fthing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "fthing" nil "f" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(109 "\"]thing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "]thing" nil nil nil) -(110 "\"cthing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "cthing" nil nil nil) -(111 "\"dthing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "dthing" nil nil nil) -(112 "\"ething\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "ething" nil nil nil) -(113 ("\"" 129 "\" =~ /^\\" 129 "/") "^\\" nil nil nil nil ("" 129) nil ("" 129) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(114 ("\"" 255 "\" =~ /^" 255 "/") "^ÿ" nil nil nil nil ("" 255) nil ("" 255) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(115 "\"0\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "0" nil "0" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(116 "\"1\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "1" nil "1" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(117 "\"2\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "2" nil "2" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(118 "\"3\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "3" nil "3" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(119 "\"4\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "4" nil "4" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(120 "\"5\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "5" nil "5" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(121 "\"6\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "6" nil "6" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(122 "\"7\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "7" nil "7" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(123 "\"8\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "8" nil "8" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(124 "\"9\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "9" nil "9" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(125 "\"10\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "10" nil "10" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(126 "\"100\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "100" nil "100" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(127 "\"abc\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "abc" nil nil nil) -(128 "\"enter\" =~ /^.*nter/" "^.*nter" nil nil nil nil "enter" nil "enter" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(129 "\"inter\" =~ /^.*nter/" "^.*nter" nil nil nil nil "inter" nil "inter" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(130 "\"uponter\" =~ /^.*nter/" "^.*nter" nil nil nil nil "uponter" nil "uponter" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(131 "\"xxx0\" =~ /^xxx[0-9]+$/" "^xxx[0-9]+$" nil nil nil nil "xxx0" nil "xxx0" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(132 "\"xxx1234\" =~ /^xxx[0-9]+$/" "^xxx[0-9]+$" nil nil nil nil "xxx1234" nil "xxx1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(133 "\"xxx\" =~ /^xxx[0-9]+$/" "^xxx[0-9]+$" nil nil nil nil "xxx" nil nil nil) -(134 "\"x123\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "x123" nil "x123" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(135 "\"xx123\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "xx123" nil "xx123" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(136 "\"123456\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "123456" nil "123456" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(137 "\"123\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "123" nil nil nil) -(138 "\"x1234\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "x1234" nil "x1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(139 "\"x123\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "x123" nil "x123" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(140 "\"xx123\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "xx123" nil "xx123" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(141 "\"123456\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "123456" nil "123456" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(142 "\"123\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "123" nil nil nil) -(143 "\"x1234\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "x1234" nil "x1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(144 "\"abc!pqr=apquxz.ixr.zzz.ac.uk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "abc!pqr=apquxz.ixr.zzz.ac.uk" nil "abc!pqr=apquxz.ixr.zzz.ac.uk" ("abc" "pqr" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(145 "\"!pqr=apquxz.ixr.zzz.ac.uk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "!pqr=apquxz.ixr.zzz.ac.uk" nil nil nil) -(146 "\"abc!=apquxz.ixr.zzz.ac.uk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "abc!=apquxz.ixr.zzz.ac.uk" nil nil nil) -(147 "\"abc!pqr=apquxz:ixr.zzz.ac.uk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "abc!pqr=apquxz:ixr.zzz.ac.uk" nil nil nil) -(148 "\"abc!pqr=apquxz.ixr.zzz.ac.ukk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "abc!pqr=apquxz.ixr.zzz.ac.ukk" nil nil nil) -(149 "\"Well, we need a colon: somewhere\" =~ /:/" ":" nil nil nil nil "Well, we need a colon: somewhere" nil ":" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(150 "\"Fail if we don't\" =~ /:/" ":" nil nil nil nil "Fail if we don't" nil nil nil) -(151 "\"0abc\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "0abc" nil "0abc" ("0abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(152 "\"abc\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "abc" nil "abc" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(153 "\"fed\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "fed" nil "fed" ("fed" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(154 "\"E\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "E" nil "E" ("E" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(155 "\"::\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "::" nil "::" ("::" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(156 "\"5f03:12C0::932e\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "5f03:12C0::932e" nil "5f03:12C0::932e" ("5f03:12C0::932e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(157 "\"fed def\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "fed def" nil "def" ("def" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(158 "\"Any old stuff\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "Any old stuff" nil "ff" ("ff" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(159 "\"0zzz\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "0zzz" nil nil nil) -(160 "\"gzzz\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "gzzz" nil nil nil) -(161 "\"fed\\x20\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "fed " nil nil nil) -(162 "\"Any old rubbish\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "Any old rubbish" nil nil nil) -(163 "\".1.2.3\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil ".1.2.3" nil ".1.2.3" ("1" "2" "3" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(164 "\"A.12.123.0\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil "A.12.123.0" nil "A.12.123.0" ("12" "123" "0" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(165 "\".1.2.3333\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil ".1.2.3333" nil nil nil) -(166 "\"1.2.3\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil "1.2.3" nil nil nil) -(167 "\"1234.2.3\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil "1234.2.3" nil nil nil) -(168 "\"1 IN SOA non-sp1 non-sp2(\" =~ /^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/" "^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$" nil nil nil nil "1 IN SOA non-sp1 non-sp2(" nil "1 IN SOA non-sp1 non-sp2(" ("1" "non-sp1" "non-sp2" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(169 "\"1 IN SOA non-sp1 non-sp2 (\" =~ /^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/" "^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$" nil nil nil nil "1 IN SOA non-sp1 non-sp2 (" nil "1 IN SOA non-sp1 non-sp2 (" ("1" "non-sp1" "non-sp2" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(170 "\"1IN SOA non-sp1 non-sp2(\" =~ /^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/" "^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$" nil nil nil nil "1IN SOA non-sp1 non-sp2(" nil nil nil) -(171 "\"a.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "a." nil "a." (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(172 "\"Z.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "Z." nil "Z." (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(173 "\"2.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "2." nil "2." (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(174 "\"ab-c.pq-r.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "ab-c.pq-r." nil "ab-c.pq-r." (".pq-r" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(175 "\"sxk.zzz.ac.uk.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "sxk.zzz.ac.uk." nil "sxk.zzz.ac.uk." (".uk" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(176 "\"x-.y-.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "x-.y-." nil "x-.y-." (".y-" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(177 "\"-abc.peq.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "-abc.peq." nil nil nil) -(178 "\"*.a\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.a" nil "*.a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(179 "\"*.b0-a\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.b0-a" nil "*.b0-a" ("0-a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(180 "\"*.c3-b.c\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.c3-b.c" nil "*.c3-b.c" ("3-b" ".c" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(181 "\"*.c-a.b-c\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.c-a.b-c" nil "*.c-a.b-c" ("-a" ".b-c" "-c" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(182 "\"*.0\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.0" nil nil nil) -(183 "\"*.a-\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.a-" nil nil nil) -(184 "\"*.a-b.c-\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.a-b.c-" nil nil nil) -(185 "\"*.c-a.0-c\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.c-a.0-c" nil nil nil) -(186 "\"abde\" =~ /^(?=ab(de))(abd)(e)/" "^(?=ab(de))(abd)(e)" nil nil nil nil "abde" nil "abde" ("de" "abd" "e" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(187 "\"abdf\" =~ /^(?!(ab)de|x)(abd)(f)/" "^(?!(ab)de|x)(abd)(f)" nil nil nil nil "abdf" nil "abdf" (nil "abd" "f" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(188 "\"abcd\" =~ /^(?=(ab(cd)))(ab)/" "^(?=(ab(cd)))(ab)" nil nil nil nil "abcd" nil "ab" ("abcd" "cd" "ab" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(189 "\"a.b.c.d\" =~ /^[\\da-f](\\.[\\da-f])*$/i" "^[\\da-f](\\.[\\da-f])*$" t nil nil nil "a.b.c.d" nil "a.b.c.d" (".d" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(190 "\"A.B.C.D\" =~ /^[\\da-f](\\.[\\da-f])*$/i" "^[\\da-f](\\.[\\da-f])*$" t nil nil nil "A.B.C.D" nil "A.B.C.D" (".D" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(191 "\"a.b.c.1.2.3.C\" =~ /^[\\da-f](\\.[\\da-f])*$/i" "^[\\da-f](\\.[\\da-f])*$" t nil nil nil "a.b.c.1.2.3.C" nil "a.b.c.1.2.3.C" (".C" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(192 "\"\\\"1234\\\"\" =~ /^\\\".*\\\"\\s*(;.*)?$/" "^\\\".*\\\"\\s*(;.*)?$" nil nil nil nil "\"1234\"" nil "\"1234\"" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(193 "\"\\\"abcd\\\" ;\" =~ /^\\\".*\\\"\\s*(;.*)?$/" "^\\\".*\\\"\\s*(;.*)?$" nil nil nil nil "\"abcd\" ;" nil "\"abcd\" ;" (";" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(194 "\"\\\"\\\" ; rhubarb\" =~ /^\\\".*\\\"\\s*(;.*)?$/" "^\\\".*\\\"\\s*(;.*)?$" nil nil nil nil "\"\" ; rhubarb" nil "\"\" ; rhubarb" ("; rhubarb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(195 "\"\\\"1234\\\" : things\" =~ /^\\\".*\\\"\\s*(;.*)?$/" "^\\\".*\\\"\\s*(;.*)?$" nil nil nil nil "\"1234\" : things" nil nil nil) -(196 "\"\\\" =~ /^$/" "^$" nil nil nil nil "" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(197 "\"ab c\" =~ / ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/x" " ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil t "ab c" nil "ab c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(198 "\"abc\" =~ / ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/x" " ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil t "abc" nil nil nil) -(199 "\"ab cde\" =~ / ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/x" " ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil t "ab cde" nil nil nil) -(200 "\"ab c\" =~ /(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/" "(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil nil "ab c" nil "ab c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(201 "\"abc\" =~ /(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/" "(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil nil "abc" nil nil nil) -(202 "\"ab cde\" =~ /(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/" "(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil nil "ab cde" nil nil nil) -(203 "\"a bcd\" =~ /^ a\\ b[c ]d $/x" "^ a\\ b[c ]d $" nil nil nil t "a bcd" nil "a bcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(204 "\"a b d\" =~ /^ a\\ b[c ]d $/x" "^ a\\ b[c ]d $" nil nil nil t "a b d" nil "a b d" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(205 "\"abcd\" =~ /^ a\\ b[c ]d $/x" "^ a\\ b[c ]d $" nil nil nil t "abcd" nil nil nil) -(206 "\"ab d\" =~ /^ a\\ b[c ]d $/x" "^ a\\ b[c ]d $" nil nil nil t "ab d" nil nil nil) -(207 "\"abcdefhijklm\" =~ /^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/" "^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$" nil nil nil nil "abcdefhijklm" nil "abcdefhijklm" ("abc" "bc" "c" "def" "ef" "f" "hij" "ij" "j" "klm" "lm" "m" nil nil nil nil)) -(208 "\"abcdefhijklm\" =~ /^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/" "^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$" nil nil nil nil "abcdefhijklm" nil "abcdefhijklm" ("bc" "c" "ef" "f" "ij" "j" "lm" "m" nil nil nil nil nil nil nil nil)) -(209 "\"a+ Z0+\\x08\\n\\x1d\\x12\" =~ /^[\\w][\\W][\\s][\\S][\\d][\\D][\\b][\\n][\\c]][\\022]/" "^[\\w][\\W][\\s][\\S][\\d][\\D][\\b][\\n][\\c]][\\022]" nil nil nil nil ("a+ Z0+" 8 10 29 18) nil ("a+ Z0+" 8 10 29 18) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(210 "\".^\\$(*+)|{?,?}\" =~ /^[.^$|()*+?{,}]+/" "^[.^$|()*+?{,}]+" nil nil nil nil ".^$(*+)|{?,?}" nil ".^$(*+)|{?,?}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(211 "\"z\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "z" nil "z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(212 "\"az\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "az" nil "az" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(213 "\"aaaz\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "aaaz" nil "aaaz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(214 "\"a\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(215 "\"aa\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(216 "\"aaaa\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "aaaa" nil "aaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(217 "\"a+\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "a+" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(218 "\"aa+\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "aa+" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(219 "\"z\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "z" nil "z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(220 "\"az\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "az" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(221 "\"aaaz\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "aaaz" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(222 "\"a\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(223 "\"aa\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "aa" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(224 "\"aaaa\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "aaaa" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(225 "\"a+\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "a+" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(226 "\"aa+\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "aa+" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(227 "\"az\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "az" nil "az" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(228 "\"aaaz\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "aaaz" nil "aaaz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(229 "\"aa\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(230 "\"aaaa\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "aaaa" nil "aaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(231 "\"aa+\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "aa+" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(232 "\"az\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "az" nil "az" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(233 "\"aaaz\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "aaaz" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(234 "\"aa\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(235 "\"aaaa\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "aaaa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(236 "\"aa+\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "aa+" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(237 "\"1234567890\" =~ /^\\d{8}\\w{2,}/" "^\\d{8}\\w{2,}" nil nil nil nil "1234567890" nil "1234567890" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(238 "\"12345678ab\" =~ /^\\d{8}\\w{2,}/" "^\\d{8}\\w{2,}" nil nil nil nil "12345678ab" nil "12345678ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(239 "\"12345678__\" =~ /^\\d{8}\\w{2,}/" "^\\d{8}\\w{2,}" nil nil nil nil "12345678__" nil "12345678__" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(240 "\"1234567\" =~ /^\\d{8}\\w{2,}/" "^\\d{8}\\w{2,}" nil nil nil nil "1234567" nil nil nil) -(241 "\"uoie\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "uoie" nil "uoie" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(242 "\"1234\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "1234" nil "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(243 "\"12345\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "12345" nil "12345" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(244 "\"aaaaa\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "aaaaa" nil "aaaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(245 "\"123456\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "123456" nil nil nil) -(246 "\"uoie\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "uoie" nil "uoie" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(247 "\"1234\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "1234" nil "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(248 "\"12345\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "12345" nil "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(249 "\"aaaaa\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "aaaaa" nil "aaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(250 "\"123456\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "123456" nil "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(251 "\"abc=abcabc\" =~ /\\A(abc|def)=(\\1){2,3}\\Z/" "\\A(abc|def)=(\\1){2,3}\\Z" nil nil nil nil "abc=abcabc" nil "abc=abcabc" ("abc" "abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(252 "\"def=defdefdef\" =~ /\\A(abc|def)=(\\1){2,3}\\Z/" "\\A(abc|def)=(\\1){2,3}\\Z" nil nil nil nil "def=defdefdef" nil "def=defdefdef" ("def" "def" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(253 "\"abc=defdef\" =~ /\\A(abc|def)=(\\1){2,3}\\Z/" "\\A(abc|def)=(\\1){2,3}\\Z" nil nil nil nil "abc=defdef" nil nil nil) -(254 "\"abcdefghijkcda2\" =~ /^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$/" "^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$" nil nil nil nil "abcdefghijkcda2" nil "abcdefghijkcda2" ("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "cd" nil nil nil nil)) -(255 "\"abcdefghijkkkkcda2\" =~ /^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$/" "^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$" nil nil nil nil "abcdefghijkkkkcda2" nil "abcdefghijkkkkcda2" ("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "cd" nil nil nil nil)) -(256 "\"cataract cataract23\" =~ /(cat(a(ract|tonic)|erpillar)) \\1()2(3)/" "(cat(a(ract|tonic)|erpillar)) \\1()2(3)" nil nil nil nil "cataract cataract23" nil "cataract cataract23" ("cataract" "aract" "ract" "" "3" nil nil nil nil nil nil nil nil nil nil nil)) -(257 "\"catatonic catatonic23\" =~ /(cat(a(ract|tonic)|erpillar)) \\1()2(3)/" "(cat(a(ract|tonic)|erpillar)) \\1()2(3)" nil nil nil nil "catatonic catatonic23" nil "catatonic catatonic23" ("catatonic" "atonic" "tonic" "" "3" nil nil nil nil nil nil nil nil nil nil nil)) -(258 "\"caterpillar caterpillar23\" =~ /(cat(a(ract|tonic)|erpillar)) \\1()2(3)/" "(cat(a(ract|tonic)|erpillar)) \\1()2(3)" nil nil nil nil "caterpillar caterpillar23" nil "caterpillar caterpillar23" ("caterpillar" "erpillar" nil "" "3" nil nil nil nil nil nil nil nil nil nil nil)) -(259 "\"From abcd Mon Sep 01 12:33:02 1997\" =~ -/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/" "^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]" nil nil nil nil "From abcd Mon Sep 01 12:33:02 1997" nil "From abcd Mon Sep 01 12:33" ("abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(260 "\"From abcd Mon Sep 01 12:33:02 1997\" =~ /^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d/" "^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d" nil nil nil nil "From abcd Mon Sep 01 12:33:02 1997" nil "From abcd Mon Sep 01 12:33" ("Sep " nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(261 "\"From abcd Mon Sep 1 12:33:02 1997\" =~ /^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d/" "^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d" nil nil nil nil "From abcd Mon Sep 1 12:33:02 1997" nil "From abcd Mon Sep 1 12:33" ("Sep " nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(262 "\"From abcd Sep 01 12:33:02 1997\" =~ /^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d/" "^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d" nil nil nil nil "From abcd Sep 01 12:33:02 1997" nil nil nil) -(263 "\"12\\n34\" =~ /^12.34/s" "^12.34" nil nil t nil "12 -34" nil "12 -34" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(264 "\"12\\r34\" =~ /^12.34/s" "^12.34" nil nil t nil ("12" 13 "34") nil ("12" 13 "34") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(265 "\"the quick brown\\t fox\" =~ /\\w+(?=\\t)/" "\\w+(?=\\t)" nil nil nil nil ("the quick brown" 9 " fox") nil "brown" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(266 "\"foobar is foolish see?\" =~ /foo(?!bar)(.*)/" "foo(?!bar)(.*)" nil nil nil nil "foobar is foolish see?" nil "foolish see?" ("lish see?" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(267 "\"foobar crowbar etc\" =~ /(?:(?!foo)...|^.{0,2})bar(.*)/" "(?:(?!foo)...|^.{0,2})bar(.*)" nil nil nil nil "foobar crowbar etc" nil "rowbar etc" (" etc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(268 "\"barrel\" =~ /(?:(?!foo)...|^.{0,2})bar(.*)/" "(?:(?!foo)...|^.{0,2})bar(.*)" nil nil nil nil "barrel" nil "barrel" ("rel" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(269 "\"2barrel\" =~ /(?:(?!foo)...|^.{0,2})bar(.*)/" "(?:(?!foo)...|^.{0,2})bar(.*)" nil nil nil nil "2barrel" nil "2barrel" ("rel" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(270 "\"A barrel\" =~ /(?:(?!foo)...|^.{0,2})bar(.*)/" "(?:(?!foo)...|^.{0,2})bar(.*)" nil nil nil nil "A barrel" nil "A barrel" ("rel" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(271 "\"abc456\" =~ /^(\\D*)(?=\\d)(?!123)/" "^(\\D*)(?=\\d)(?!123)" nil nil nil nil "abc456" nil "abc" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(272 "\"abc123\" =~ /^(\\D*)(?=\\d)(?!123)/" "^(\\D*)(?=\\d)(?!123)" nil nil nil nil "abc123" nil nil nil) -(273 "\"1234\" =~ /^1234(?# test newlines - inside)/" "^1234(?# test newlines - inside)" nil nil nil nil "1234" nil "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(274 "\"1234\" =~ /^1234 #comment in extended re - /x" "^1234 #comment in extended re - " nil nil nil t "1234" nil "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(275 "\"abcd\" =~ /#rhubarb - abcd/x" "#rhubarb - abcd" nil nil nil t "abcd" nil "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(276 "\"abcd\" =~ /^abcd#rhubarb/x" "^abcd#rhubarb" nil nil nil t "abcd" nil "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(277 "\"aaab\" =~ /^(a)\\1{2,3}(.)/" "^(a)\\1{2,3}(.)" nil nil nil nil "aaab" nil "aaab" ("a" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(278 "\"aaaab\" =~ /^(a)\\1{2,3}(.)/" "^(a)\\1{2,3}(.)" nil nil nil nil "aaaab" nil "aaaab" ("a" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(279 "\"aaaaab\" =~ /^(a)\\1{2,3}(.)/" "^(a)\\1{2,3}(.)" nil nil nil nil "aaaaab" nil "aaaaa" ("a" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(280 "\"aaaaaab\" =~ /^(a)\\1{2,3}(.)/" "^(a)\\1{2,3}(.)" nil nil nil nil "aaaaaab" nil "aaaaa" ("a" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(281 "\"the abc\" =~ /(?!^)abc/" "(?!^)abc" nil nil nil nil "the abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(282 "\"abc\" =~ /(?!^)abc/" "(?!^)abc" nil nil nil nil "abc" nil nil nil) -(283 "\"abc\" =~ /(?=^)abc/" "(?=^)abc" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(284 "\"the abc\" =~ /(?=^)abc/" "(?=^)abc" nil nil nil nil "the abc" nil nil nil) -(285 "\"aabbbbb\" =~ /^[ab]{1,3}(ab*|b)/" "^[ab]{1,3}(ab*|b)" nil nil nil nil "aabbbbb" nil "aabb" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(286 "\"aabbbbb\" =~ /^[ab]{1,3}?(ab*|b)/" "^[ab]{1,3}?(ab*|b)" nil nil nil nil "aabbbbb" nil "aabbbbb" ("abbbbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(287 "\"aabbbbb\" =~ /^[ab]{1,3}?(ab*?|b)/" "^[ab]{1,3}?(ab*?|b)" nil nil nil nil "aabbbbb" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(288 "\"aabbbbb\" =~ /^[ab]{1,3}(ab*?|b)/" "^[ab]{1,3}(ab*?|b)" nil nil nil nil "aabbbbb" nil "aabb" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(289 "\"Alan Other \" =~ / (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional leading comment -(?: (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # one word, optionally followed by.... -(?: -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... -\\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) | # comments, or... - -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -# quoted strings -)* -< (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # leading < -(?: @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* - -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* , (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -)* # further okay, if led by comma -: # closing colon -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* )? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address spec -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* > # trailing > -# name and address -) (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional trailing comment -/x" " (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional leading comment -(?: (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # one word, optionally followed by.... -(?: -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... -\\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) | # comments, or... - -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -# quoted strings -)* -< (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # leading < -(?: @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* - -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* , (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -)* # further okay, if led by comma -: # closing colon -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* )? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address spec -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* > # trailing > -# name and address -) (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional trailing comment -" nil nil nil t "Alan Other " nil "Alan Other " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(290 "\"\" =~ / (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional leading comment -(?: (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # one word, optionally followed by.... -(?: -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... -\\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) | # comments, or... - -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -# quoted strings -)* -< (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # leading < -(?: @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* - -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* , (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -)* # further okay, if led by comma -: # closing colon -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* )? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address spec -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* > # trailing > -# name and address -) (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional trailing comment -/x" " (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional leading comment -(?: (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # one word, optionally followed by.... -(?: -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... -\\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) | # comments, or... - -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -# quoted strings -)* -< (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # leading < -(?: @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* - -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* , (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -)* # further okay, if led by comma -: # closing colon -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* )? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address spec -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* > # trailing > -# name and address -) (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional trailing comment -" nil nil nil t "" nil "user@dom.ain" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(291 "\"user\\@dom.ain\" =~ / (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional leading comment -(?: (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # one word, optionally followed by.... -(?: -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... -\\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) | # comments, or... - -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -# quoted strings -)* -< (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # leading < -(?: @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* - -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* , (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -)* # further okay, if led by comma -: # closing colon -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* )? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address spec -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* > # trailing > -# name and address -) (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional trailing comment -/x" " (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional leading comment -(?: (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # one word, optionally followed by.... -(?: -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... -\\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) | # comments, or... - -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -# quoted strings -)* -< (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # leading < -(?: @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* - -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* , (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -)* # further okay, if led by comma -: # closing colon -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* )? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address spec -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* > # trailing > -# name and address -) (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional trailing comment -" nil nil nil t "user@dom.ain" nil "user@dom.ain" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(292 "\"\\\"A. Other\\\" (a comment)\" =~ / (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional leading comment -(?: (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # one word, optionally followed by.... -(?: -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... -\\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) | # comments, or... - -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -# quoted strings -)* -< (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # leading < -(?: @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* - -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* , (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -)* # further okay, if led by comma -: # closing colon -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* )? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address spec -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* > # trailing > -# name and address -) (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional trailing comment -/x" " (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional leading comment -(?: (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # one word, optionally followed by.... -(?: -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... -\\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) | # comments, or... - -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -# quoted strings -)* -< (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # leading < -(?: @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* - -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* , (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -)* # further okay, if led by comma -: # closing colon -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* )? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address spec -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* > # trailing > -# name and address -) (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional trailing comment -" nil nil nil t "\"A. Other\" (a comment)" nil "\"A. Other\" (a comment)" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(293 "\"A. Other (a comment)\" =~ / (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional leading comment -(?: (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # one word, optionally followed by.... -(?: -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... -\\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) | # comments, or... - -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -# quoted strings -)* -< (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # leading < -(?: @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* - -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* , (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -)* # further okay, if led by comma -: # closing colon -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* )? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address spec -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* > # trailing > -# name and address -) (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional trailing comment -/x" " (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional leading comment -(?: (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # one word, optionally followed by.... -(?: -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... -\\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) | # comments, or... - -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -# quoted strings -)* -< (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # leading < -(?: @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* - -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* , (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -)* # further okay, if led by comma -: # closing colon -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* )? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address spec -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* > # trailing > -# name and address -) (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional trailing comment -" nil nil nil t "A. Other (a comment)" nil " Other (a comment)" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(294 "\"\\\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\\\"\\@x400-re.lay\" =~ / (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional leading comment -(?: (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # one word, optionally followed by.... -(?: -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... -\\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) | # comments, or... - -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -# quoted strings -)* -< (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # leading < -(?: @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* - -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* , (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -)* # further okay, if led by comma -: # closing colon -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* )? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address spec -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* > # trailing > -# name and address -) (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional trailing comment -/x" " (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional leading comment -(?: (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # one word, optionally followed by.... -(?: -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... -\\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) | # comments, or... - -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -# quoted strings -)* -< (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # leading < -(?: @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* - -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* , (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -)* # further okay, if led by comma -: # closing colon -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* )? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address spec -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* > # trailing > -# name and address -) (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional trailing comment -" nil nil nil t "\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay" nil "\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(295 "\"A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # one word, optionally followed by.... -(?: -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... -\\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) | # comments, or... - -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -# quoted strings -)* -< (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # leading < -(?: @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* - -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* , (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -)* # further okay, if led by comma -: # closing colon -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* )? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address spec -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* > # trailing > -# name and address -) (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional trailing comment -/x" " (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional leading comment -(?: (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # one word, optionally followed by.... -(?: -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... -\\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) | # comments, or... - -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -# quoted strings -)* -< (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # leading < -(?: @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* - -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* , (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -)* # further okay, if led by comma -: # closing colon -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* )? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address spec -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* > # trailing > -# name and address -) (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional trailing comment -" nil nil nil t "A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # one word, optionally followed by.... -(?: -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... -\\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) | # comments, or... - -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -# quoted strings -)* -< (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # leading < -(?: @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* - -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* , (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -)* # further okay, if led by comma -: # closing colon -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* )? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address spec -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* > # trailing > -# name and address -) (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional trailing comment -/x" " (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional leading comment -(?: (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # one word, optionally followed by.... -(?: -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... -\\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) | # comments, or... - -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -# quoted strings -)* -< (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # leading < -(?: @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* - -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* , (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -)* # further okay, if led by comma -: # closing colon -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* )? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) # initial word -(?: (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\" (?: # opening quote... -[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote -| # or -\\\\ [^\\x80-\\xff] # Escaped something (something != CR) -)* \" # closing quote -) )* # further okay, if led by a period -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* @ (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # initial subdomain -(?: # -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* \\. # if led by a period... -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* (?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| \\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) # ...further okay -)* -# address spec -(?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* > # trailing > -# name and address -) (?: [\\040\\t] | \\( -(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* -\\) )* # optional trailing comment -" nil nil nil t "The quick brown fox" nil nil nil) -(297 "\"Alan Other \" =~ /[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional leading comment -(?: -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -# leading word -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces -(?: -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -| -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -) # \"special\" comment or quoted string -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" -)* -< -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# < -(?: -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -(?: , -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -)* # additional domains -: -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address spec -> # > -# name and address -) -/x" "[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional leading comment -(?: -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -# leading word -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces -(?: -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -| -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -) # \"special\" comment or quoted string -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" -)* -< -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# < -(?: -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -(?: , -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -)* # additional domains -: -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address spec -> # > -# name and address -) -" nil nil nil t "Alan Other " nil "Alan Other " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(298 "\"\" =~ /[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional leading comment -(?: -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -# leading word -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces -(?: -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -| -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -) # \"special\" comment or quoted string -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" -)* -< -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# < -(?: -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -(?: , -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -)* # additional domains -: -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address spec -> # > -# name and address -) -/x" "[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional leading comment -(?: -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -# leading word -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces -(?: -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -| -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -) # \"special\" comment or quoted string -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" -)* -< -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# < -(?: -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -(?: , -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -)* # additional domains -: -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address spec -> # > -# name and address -) -" nil nil nil t "" nil "user@dom.ain" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(299 "\"user\\@dom.ain\" =~ /[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional leading comment -(?: -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -# leading word -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces -(?: -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -| -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -) # \"special\" comment or quoted string -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" -)* -< -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# < -(?: -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -(?: , -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -)* # additional domains -: -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address spec -> # > -# name and address -) -/x" "[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional leading comment -(?: -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -# leading word -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces -(?: -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -| -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -) # \"special\" comment or quoted string -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" -)* -< -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# < -(?: -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -(?: , -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -)* # additional domains -: -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address spec -> # > -# name and address -) -" nil nil nil t "user@dom.ain" nil "user@dom.ain" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(300 "\"\\\"A. Other\\\" (a comment)\" =~ /[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional leading comment -(?: -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -# leading word -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces -(?: -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -| -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -) # \"special\" comment or quoted string -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" -)* -< -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# < -(?: -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -(?: , -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -)* # additional domains -: -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address spec -> # > -# name and address -) -/x" "[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional leading comment -(?: -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -# leading word -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces -(?: -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -| -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -) # \"special\" comment or quoted string -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" -)* -< -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# < -(?: -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -(?: , -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -)* # additional domains -: -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address spec -> # > -# name and address -) -" nil nil nil t "\"A. Other\" (a comment)" nil "\"A. Other\" " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(301 "\"A. Other (a comment)\" =~ /[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional leading comment -(?: -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -# leading word -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces -(?: -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -| -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -) # \"special\" comment or quoted string -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" -)* -< -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# < -(?: -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -(?: , -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -)* # additional domains -: -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address spec -> # > -# name and address -) -/x" "[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional leading comment -(?: -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -# leading word -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces -(?: -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -| -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -) # \"special\" comment or quoted string -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" -)* -< -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# < -(?: -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -(?: , -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -)* # additional domains -: -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address spec -> # > -# name and address -) -" nil nil nil t "A. Other (a comment)" nil " Other " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(302 "\"\\\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\\\"\\@x400-re.lay\" =~ /[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional leading comment -(?: -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -# leading word -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces -(?: -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -| -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -) # \"special\" comment or quoted string -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" -)* -< -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# < -(?: -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -(?: , -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -)* # additional domains -: -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address spec -> # > -# name and address -) -/x" "[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional leading comment -(?: -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -# leading word -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces -(?: -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -| -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -) # \"special\" comment or quoted string -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" -)* -< -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# < -(?: -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -(?: , -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -)* # additional domains -: -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address spec -> # > -# name and address -) -" nil nil nil t "\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay" nil "\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(303 "\"A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -# leading word -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces -(?: -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -| -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -) # \"special\" comment or quoted string -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" -)* -< -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# < -(?: -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -(?: , -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -)* # additional domains -: -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address spec -> # > -# name and address -) -/x" "[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional leading comment -(?: -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -# leading word -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces -(?: -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -| -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -) # \"special\" comment or quoted string -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" -)* -< -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# < -(?: -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -(?: , -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -)* # additional domains -: -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address spec -> # > -# name and address -) -" nil nil nil t "A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -# leading word -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces -(?: -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -| -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -) # \"special\" comment or quoted string -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" -)* -< -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# < -(?: -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -(?: , -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -)* # additional domains -: -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address spec -> # > -# name and address -) -/x" "[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional leading comment -(?: -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address -| # or -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -# leading word -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces -(?: -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -| -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -) # \"special\" comment or quoted string -[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" -)* -< -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# < -(?: -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -(?: , -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -)* # additional domains -: -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)? # optional route -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -\" # \" -[^\\\\\\x80-\\xff\\n\\015\"] * # normal -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* -\" # \" -# Quoted string -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\\. -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -(?: -[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... -(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom -| -\\[ # [ -(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff -\\] # ] -) -[\\040\\t]* # Nab whitespace. -(?: -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: # ( -(?: \\\\ [^\\x80-\\xff] | -\\( # ( -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* -\\) # ) -) # special -[^\\\\\\x80-\\xff\\n\\015()] * # normal* -)* # )* -\\) # ) -[\\040\\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address spec -> # > -# name and address -) -" nil nil nil t "The quick brown fox" nil nil nil) -(305 "\"abc\\0def\\00pqr\\000xyz\\0000AB\" =~ /abc\\0def\\00pqr\\000xyz\\0000AB/" "abc\\0def\\00pqr\\000xyz\\0000AB" nil nil nil nil ("abc" 0 "def" 0 "pqr" 0 "xyz" 0 "0AB") nil ("abc" 0 "def" 0 "pqr" 0 "xyz" 0 "0AB") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(306 "\"abc456 abc\\0def\\00pqr\\000xyz\\0000ABCDE\" =~ /abc\\0def\\00pqr\\000xyz\\0000AB/" "abc\\0def\\00pqr\\000xyz\\0000AB" nil nil nil nil ("abc456 abc" 0 "def" 0 "pqr" 0 "xyz" 0 "0ABCDE") nil ("abc" 0 "def" 0 "pqr" 0 "xyz" 0 "0AB") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(307 "\"abc\\x0def\\x00pqr\\x000xyz\\x0000AB\" =~ /abc\\x0def\\x00pqr\\x000xyz\\x0000AB/" "abc\\x0def\\x00pqr\\x000xyz\\x0000AB" nil nil nil nil ("abc" 13 "ef" 0 "pqr" 0 "0xyz" 0 "00AB") nil ("abc" 13 "ef" 0 "pqr" 0 "0xyz" 0 "00AB") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(308 "\"abc456 abc\\x0def\\x00pqr\\x000xyz\\x0000ABCDE\" =~ /abc\\x0def\\x00pqr\\x000xyz\\x0000AB/" "abc\\x0def\\x00pqr\\x000xyz\\x0000AB" nil nil nil nil ("abc456 abc" 13 "ef" 0 "pqr" 0 "0xyz" 0 "00ABCDE") nil ("abc" 13 "ef" 0 "pqr" 0 "0xyz" 0 "00AB") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(309 "\"\\0A\" =~ /^[\\000-\\037]/" "^[\\000-\\037]" nil nil nil nil ("" 0 "A") nil ("" 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(310 "\"\\01B\" =~ /^[\\000-\\037]/" "^[\\000-\\037]" nil nil nil nil ("" 1 "B") nil ("" 1) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(311 "\"\\037C\" =~ /^[\\000-\\037]/" "^[\\000-\\037]" nil nil nil nil ("" 31 "C") nil ("" 31) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(312 "\"\\0\\0\\0\\0\" =~ /\\0*/" "\\0*" nil nil nil nil ("" 0 0 0 0) nil ("" 0 0 0 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(313 "\"The A\\x0\\x0Z\" =~ /A\\x0{2,3}Z/" "A\\x0{2,3}Z" nil nil nil nil ("The A" 0 0 "Z") nil ("A" 0 0 "Z") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(314 "\"An A\\0\\x0\\0Z\" =~ /A\\x0{2,3}Z/" "A\\x0{2,3}Z" nil nil nil nil ("An A" 0 0 0 "Z") nil ("A" 0 0 0 "Z") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(315 "\"A\\0Z\" =~ /A\\x0{2,3}Z/" "A\\x0{2,3}Z" nil nil nil nil ("A" 0 "Z") nil nil nil) -(316 "\"A\\0\\x0\\0\\x0Z\" =~ /A\\x0{2,3}Z/" "A\\x0{2,3}Z" nil nil nil nil ("A" 0 0 0 0 "Z") nil nil nil) -(317 "\"cowcowbell\" =~ /^(cow|)\\1(bell)/" "^(cow|)\\1(bell)" nil nil nil nil "cowcowbell" nil "cowcowbell" ("cow" "bell" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(318 "\"bell\" =~ /^(cow|)\\1(bell)/" "^(cow|)\\1(bell)" nil nil nil nil "bell" nil "bell" ("" "bell" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(319 "\"cowbell\" =~ /^(cow|)\\1(bell)/" "^(cow|)\\1(bell)" nil nil nil nil "cowbell" nil nil nil) -(320 "\"\\040abc\" =~ /^\\s/" "^\\s" nil nil nil nil " abc" nil " " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(321 "\"\\x0cabc\" =~ /^\\s/" "^\\s" nil nil nil nil ("" 12 "abc") nil ("" 12) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(322 "\"\\nabc\" =~ /^\\s/" "^\\s" nil nil nil nil " -abc" nil " -" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(323 "\"\\rabc\" =~ /^\\s/" "^\\s" nil nil nil nil ("" 13 "abc") nil ("" 13) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(324 "\"\\tabc\" =~ /^\\s/" "^\\s" nil nil nil nil ("" 9 "abc") nil ("" 9) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(325 "\"abc\" =~ /^\\s/" "^\\s" nil nil nil nil "abc" nil nil nil) -(326 ("\"abc\" =~ /^a" 9 "b" 10 " " 13 " " 12 " c/x") "^a b - c" nil nil nil t "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(327 "\"ab\" =~ /^(a|)\\1*b/" "^(a|)\\1*b" nil nil nil nil "ab" nil "ab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(328 "\"aaaab\" =~ /^(a|)\\1*b/" "^(a|)\\1*b" nil nil nil nil "aaaab" nil "aaaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(329 "\"b\" =~ /^(a|)\\1*b/" "^(a|)\\1*b" nil nil nil nil "b" nil "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(330 "\"acb\" =~ /^(a|)\\1*b/" "^(a|)\\1*b" nil nil nil nil "acb" nil nil nil) -(331 "\"aab\" =~ /^(a|)\\1+b/" "^(a|)\\1+b" nil nil nil nil "aab" nil "aab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(332 "\"aaaab\" =~ /^(a|)\\1+b/" "^(a|)\\1+b" nil nil nil nil "aaaab" nil "aaaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(333 "\"b\" =~ /^(a|)\\1+b/" "^(a|)\\1+b" nil nil nil nil "b" nil "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(334 "\"ab\" =~ /^(a|)\\1+b/" "^(a|)\\1+b" nil nil nil nil "ab" nil nil nil) -(335 "\"ab\" =~ /^(a|)\\1?b/" "^(a|)\\1?b" nil nil nil nil "ab" nil "ab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(336 "\"aab\" =~ /^(a|)\\1?b/" "^(a|)\\1?b" nil nil nil nil "aab" nil "aab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(337 "\"b\" =~ /^(a|)\\1?b/" "^(a|)\\1?b" nil nil nil nil "b" nil "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(338 "\"acb\" =~ /^(a|)\\1?b/" "^(a|)\\1?b" nil nil nil nil "acb" nil nil nil) -(339 "\"aaab\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "aaab" nil "aaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(340 "\"b\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "b" nil "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(341 "\"ab\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "ab" nil nil nil) -(342 "\"aab\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "aab" nil nil nil) -(343 "\"aaaab\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "aaaab" nil nil nil) -(344 "\"aaab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "aaab" nil "aaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(345 "\"aaaab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "aaaab" nil "aaaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(346 "\"b\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "b" nil "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(347 "\"ab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "ab" nil nil nil) -(348 "\"aab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "aab" nil nil nil) -(349 "\"aaaaab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "aaaaab" nil nil nil) -(350 "\"abbbbc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abbbbc" nil "abbbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(351 "\"abbbc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abbbc" nil "abbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(352 "\"abbc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abbc" nil "abbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(353 "\"abc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abc" nil nil nil) -(354 "\"abbbbbc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abbbbbc" nil nil nil) -(355 "\"track1.title:TBlah blah blah\" =~ /([^.]*)\\.([^:]*):[T ]+(.*)/" "([^.]*)\\.([^:]*):[T ]+(.*)" nil nil nil nil "track1.title:TBlah blah blah" nil "track1.title:TBlah blah blah" ("track1" "title" "Blah blah blah" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(356 "\"track1.title:TBlah blah blah\" =~ /([^.]*)\\.([^:]*):[T ]+(.*)/i" "([^.]*)\\.([^:]*):[T ]+(.*)" t nil nil nil "track1.title:TBlah blah blah" nil "track1.title:TBlah blah blah" ("track1" "title" "Blah blah blah" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(357 "\"track1.title:TBlah blah blah\" =~ /([^.]*)\\.([^:]*):[t ]+(.*)/i" "([^.]*)\\.([^:]*):[t ]+(.*)" t nil nil nil "track1.title:TBlah blah blah" nil "track1.title:TBlah blah blah" ("track1" "title" "Blah blah blah" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(358 "\"WXY_^abc\" =~ /^[W-c]+$/" "^[W-c]+$" nil nil nil nil "WXY_^abc" nil "WXY_^abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(359 "\"wxy\" =~ /^[W-c]+$/" "^[W-c]+$" nil nil nil nil "wxy" nil nil nil) -(360 "\"WXY_^abc\" =~ /^[W-c]+$/i" "^[W-c]+$" t nil nil nil "WXY_^abc" nil "WXY_^abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(361 "\"wxy_^ABC\" =~ /^[W-c]+$/i" "^[W-c]+$" t nil nil nil "wxy_^ABC" nil "wxy_^ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(362 "\"WXY_^abc\" =~ /^[\\x3f-\\x5F]+$/i" "^[\\x3f-\\x5F]+$" t nil nil nil "WXY_^abc" nil "WXY_^abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(363 "\"wxy_^ABC\" =~ /^[\\x3f-\\x5F]+$/i" "^[\\x3f-\\x5F]+$" t nil nil nil "wxy_^ABC" nil "wxy_^ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(364 "\"abc\" =~ /^abc$/m" "^abc$" nil t nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(365 "\"qqq\\nabc\" =~ /^abc$/m" "^abc$" nil t nil nil "qqq -abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(366 "\"abc\\nzzz\" =~ /^abc$/m" "^abc$" nil t nil nil "abc -zzz" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(367 "\"qqq\\nabc\\nzzz\" =~ /^abc$/m" "^abc$" nil t nil nil "qqq -abc -zzz" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(368 "\"abc\" =~ /^abc$/" "^abc$" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(369 "\"qqq\\nabc\" =~ /^abc$/" "^abc$" nil nil nil nil "qqq -abc" nil nil nil) -(370 "\"abc\\nzzz\" =~ /^abc$/" "^abc$" nil nil nil nil "abc -zzz" nil nil nil) -(371 "\"qqq\\nabc\\nzzz\" =~ /^abc$/" "^abc$" nil nil nil nil "qqq -abc -zzz" nil nil nil) -(372 "\"abc\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(373 "\"abc\\n\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "abc -" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(374 "\"qqq\\nabc\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "qqq -abc" nil nil nil) -(375 "\"abc\\nzzz\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "abc -zzz" nil nil nil) -(376 "\"qqq\\nabc\\nzzz\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "qqq -abc -zzz" nil nil nil) -(377 "\"abc\\ndef\" =~ /\\A(.)*\\Z/s" "\\A(.)*\\Z" nil nil t nil "abc -def" nil "abc -def" ("f" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(378 "\"abc\\ndef\" =~ /\\A(.)*\\Z/m" "\\A(.)*\\Z" nil t nil nil "abc -def" nil nil nil) -(379 "\"b::c\" =~ /(?:b)|(?::+)/" "(?:b)|(?::+)" nil nil nil nil "b::c" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(380 "\"c::b\" =~ /(?:b)|(?::+)/" "(?:b)|(?::+)" nil nil nil nil "c::b" nil "::" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(381 "\"az-\" =~ /[-az]+/" "[-az]+" nil nil nil nil "az-" nil "az-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(382 "\"b\" =~ /[-az]+/" "[-az]+" nil nil nil nil "b" nil nil nil) -(383 "\"za-\" =~ /[az-]+/" "[az-]+" nil nil nil nil "za-" nil "za-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(384 "\"b\" =~ /[az-]+/" "[az-]+" nil nil nil nil "b" nil nil nil) -(385 "\"a-z\" =~ /[a\\-z]+/" "[a\\-z]+" nil nil nil nil "a-z" nil "a-z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(386 "\"b\" =~ /[a\\-z]+/" "[a\\-z]+" nil nil nil nil "b" nil nil nil) -(387 "\"abcdxyz\" =~ /[a-z]+/" "[a-z]+" nil nil nil nil "abcdxyz" nil "abcdxyz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(388 "\"12-34\" =~ /[\\d-]+/" "[\\d-]+" nil nil nil nil "12-34" nil "12-34" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(389 "\"aaa\" =~ /[\\d-]+/" "[\\d-]+" nil nil nil nil "aaa" nil nil nil) -(390 "\"12-34z\" =~ /[\\d-z]+/" "[\\d-z]+" nil nil nil nil "12-34z" nil "12-34z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(391 "\"aaa\" =~ /[\\d-z]+/" "[\\d-z]+" nil nil nil nil "aaa" nil nil nil) -(392 "\"\\\\\" =~ /\\x5c/" "\\x5c" nil nil nil nil "\\" nil "\\" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(393 "\"the Zoo\" =~ /\\x20Z/" "\\x20Z" nil nil nil nil "the Zoo" nil " Z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(394 "\"Zulu\" =~ /\\x20Z/" "\\x20Z" nil nil nil nil "Zulu" nil nil nil) -(395 "\"abcabc\" =~ /(abc)\\1/i" "(abc)\\1" t nil nil nil "abcabc" nil "abcabc" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(396 "\"ABCabc\" =~ /(abc)\\1/i" "(abc)\\1" t nil nil nil "ABCabc" nil "ABCabc" ("ABC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(397 "\"abcABC\" =~ /(abc)\\1/i" "(abc)\\1" t nil nil nil "abcABC" nil "abcABC" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(398 "\"ab{3cd\" =~ /ab{3cd/" "ab{3cd" nil nil nil nil "ab{3cd" nil "ab{3cd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(399 "\"ab{3,cd\" =~ /ab{3,cd/" "ab{3,cd" nil nil nil nil "ab{3,cd" nil "ab{3,cd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(400 "\"ab{3,4a}cd\" =~ /ab{3,4a}cd/" "ab{3,4a}cd" nil nil nil nil "ab{3,4a}cd" nil "ab{3,4a}cd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(401 "\"{4,5a}bc\" =~ /{4,5a}bc/" "{4,5a}bc" nil nil nil nil "{4,5a}bc" nil "{4,5a}bc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(402 "\"a\\rb\" =~ /^a.b/" "^a.b" nil nil nil nil ("a" 13 "b") nil ("a" 13 "b") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(403 "\"a\\nb\" =~ /^a.b/" "^a.b" nil nil nil nil "a -b" nil nil nil) -(404 "\"abc\" =~ /abc$/" "abc$" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(405 "\"abc\\n\" =~ /abc$/" "abc$" nil nil nil nil "abc -" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(406 "\"abc\\ndef\" =~ /abc$/" "abc$" nil nil nil nil "abc -def" nil nil nil) -(407 "\"abc\\x53\" =~ /(abc)\\123/" "(abc)\\123" nil nil nil nil "abcS" nil "abcS" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(408 "\"abc\\x93\" =~ /(abc)\\223/" "(abc)\\223" nil nil nil nil ("abc" 147) nil ("abc" 147) ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(409 "\"abc\\xd3\" =~ /(abc)\\323/" "(abc)\\323" nil nil nil nil ("abc" 211) nil ("abc" 211) ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(410 "\"abc\\x40\" =~ /(abc)\\500/" "(abc)\\500" nil nil nil nil "abc@" nil "abc@" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(411 "\"abc\\100\" =~ /(abc)\\500/" "(abc)\\500" nil nil nil nil "abc@" nil "abc@" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(412 "\"abc\\x400\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(413 "\"abc\\x40\\x30\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(414 "\"abc\\1000\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(415 "\"abc\\100\\x30\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(416 "\"abc\\100\\060\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(417 "\"abc\\100\\60\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(418 "\"abc\\081\" =~ /abc\\81/" "abc\\81" nil nil nil nil ("abc" 0 "81") nil ("abc" 0 "81") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(419 "\"abc\\0\\x38\\x31\" =~ /abc\\81/" "abc\\81" nil nil nil nil ("abc" 0 "81") nil ("abc" 0 "81") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(420 "\"abc\\091\" =~ /abc\\91/" "abc\\91" nil nil nil nil ("abc" 0 "91") nil ("abc" 0 "91") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(421 "\"abc\\0\\x39\\x31\" =~ /abc\\91/" "abc\\91" nil nil nil nil ("abc" 0 "91") nil ("abc" 0 "91") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(422 "\"abcdefghijkllS\" =~ /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\12\\123/" "(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\12\\123" nil nil nil nil "abcdefghijkllS" nil "abcdefghijkllS" ("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" nil nil nil nil)) -(423 "\"abcdefghijk\\12S\" =~ /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\12\\123/" "(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\12\\123" nil nil nil nil "abcdefghijk -S" nil "abcdefghijk -S" ("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" nil nil nil nil nil)) -(424 "\"abgdef\" =~ /ab\\gdef/" "ab\\gdef" nil nil nil nil "abgdef" nil "abgdef" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(425 "\"bc\" =~ /a{0}bc/" "a{0}bc" nil nil nil nil "bc" nil "bc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(426 "\"xyz\" =~ /(a|(bc)){0,0}?xyz/" "(a|(bc)){0,0}?xyz" nil nil nil nil "xyz" nil "xyz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(427 "\"abc\\010de\" =~ /abc[\\10]de/" "abc[\\10]de" nil nil nil nil ("abc" 8 "de") nil ("abc" 8 "de") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(428 "\"abc\\1de\" =~ /abc[\\1]de/" "abc[\\1]de" nil nil nil nil ("abc" 1 "de") nil ("abc" 1 "de") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(429 "\"abc\\1de\" =~ /(abc)[\\1]de/" "(abc)[\\1]de" nil nil nil nil ("abc" 1 "de") nil ("abc" 1 "de") ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(430 "\"a\\nb\" =~ /a.b(?s)/" "a.b(?s)" nil nil nil nil "a -b" nil nil nil) -(431 "\"baNOTccccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "baNOTccccd" nil "baNOTcccc" ("b" "a" "NOT" "cccc" nil nil nil nil nil nil nil nil nil nil nil nil)) -(432 "\"baNOTcccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "baNOTcccd" nil "baNOTccc" ("b" "a" "NOT" "ccc" nil nil nil nil nil nil nil nil nil nil nil nil)) -(433 "\"baNOTccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "baNOTccd" nil "baNOTcc" ("b" "a" "NO" "Tcc" nil nil nil nil nil nil nil nil nil nil nil nil)) -(434 "\"bacccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "bacccd" nil "baccc" ("b" "a" "" "ccc" nil nil nil nil nil nil nil nil nil nil nil nil)) -(435 "\"anything\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "anything" nil nil nil) -(436 "\"b\\bc\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil ("b" 8 "c") nil nil nil) -(437 "\"baccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "baccd" nil nil nil) -(438 "\"Abc\" =~ /[^a]/" "[^a]" nil nil nil nil "Abc" nil "A" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(439 "\"Abc\" =~ /[^a]/i" "[^a]" t nil nil nil "Abc" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(440 "\"AAAaAbc\" =~ /[^a]+/" "[^a]+" nil nil nil nil "AAAaAbc" nil "AAA" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(441 "\"AAAaAbc\" =~ /[^a]+/i" "[^a]+" t nil nil nil "AAAaAbc" nil "bc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(442 "\"bbb\\nccc\" =~ /[^a]+/" "[^a]+" nil nil nil nil "bbb -ccc" nil "bbb -ccc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(443 "\"abc\" =~ /[^k]$/" "[^k]$" nil nil nil nil "abc" nil "c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(444 "\"abk\" =~ /[^k]$/" "[^k]$" nil nil nil nil "abk" nil nil nil) -(445 "\"abc\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(446 "\"kbc\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "kbc" nil "bc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(447 "\"kabc\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "kabc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(448 "\"abk\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "abk" nil nil nil) -(449 "\"akb\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "akb" nil nil nil) -(450 "\"akk\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "akk" nil nil nil) -(451 "\"12345678\\@a.b.c.d\" =~ /^\\d{8,}\\@.+[^k]$/" "^\\d{8,}\\@.+[^k]$" nil nil nil nil "12345678@a.b.c.d" nil "12345678@a.b.c.d" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(452 "\"123456789\\@x.y.z\" =~ /^\\d{8,}\\@.+[^k]$/" "^\\d{8,}\\@.+[^k]$" nil nil nil nil "123456789@x.y.z" nil "123456789@x.y.z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(453 "\"12345678\\@x.y.uk\" =~ /^\\d{8,}\\@.+[^k]$/" "^\\d{8,}\\@.+[^k]$" nil nil nil nil "12345678@x.y.uk" nil nil nil) -(454 "\"1234567\\@a.b.c.d\" =~ /^\\d{8,}\\@.+[^k]$/" "^\\d{8,}\\@.+[^k]$" nil nil nil nil "1234567@a.b.c.d" nil nil nil) -(455 "\"aaaaaaaaa\" =~ /(a)\\1{8,}/" "(a)\\1{8,}" nil nil nil nil "aaaaaaaaa" nil "aaaaaaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(456 "\"aaaaaaaaaa\" =~ /(a)\\1{8,}/" "(a)\\1{8,}" nil nil nil nil "aaaaaaaaaa" nil "aaaaaaaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(457 "\"aaaaaaa\" =~ /(a)\\1{8,}/" "(a)\\1{8,}" nil nil nil nil "aaaaaaa" nil nil nil) -(458 "\"aaaabcd\" =~ /[^a]/" "[^a]" nil nil nil nil "aaaabcd" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(459 "\"aaAabcd\" =~ /[^a]/" "[^a]" nil nil nil nil "aaAabcd" nil "A" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(460 "\"aaaabcd\" =~ /[^a]/i" "[^a]" t nil nil nil "aaaabcd" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(461 "\"aaAabcd\" =~ /[^a]/i" "[^a]" t nil nil nil "aaAabcd" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(462 "\"aaaabcd\" =~ /[^az]/" "[^az]" nil nil nil nil "aaaabcd" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(463 "\"aaAabcd\" =~ /[^az]/" "[^az]" nil nil nil nil "aaAabcd" nil "A" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(464 "\"aaaabcd\" =~ /[^az]/i" "[^az]" t nil nil nil "aaaabcd" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(465 "\"aaAabcd\" =~ /[^az]/i" "[^az]" t nil nil nil "aaAabcd" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(466 "\"\\000\\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\\040\\041\\042\\043\\044\\045\\046\\047\\050\\051\\052\\053\\054\\055\\056\\057\\060\\061\\062\\063\\064\\065\\066\\067\\070\\071\\072\\073\\074\\075\\076\\077\\100\\101\\102\\103\\104\\105\\106\\107\\110\\111\\112\\113\\114\\115\\116\\117\\120\\121\\122\\123\\124\\125\\126\\127\\130\\131\\132\\133\\134\\135\\136\\137\\140\\141\\142\\143\\144\\145\\146\\147\\150\\151\\152\\153\\154\\155\\156\\157\\160\\161\\162\\163\\164\\165\\166\\167\\170\\171\\172\\173\\174\\175\\176\\177\\200\\201\\202\\203\\204\\205\\206\\207\\210\\211\\212\\213\\214\\215\\216\\217\\220\\221\\222\\223\\224\\225\\226\\227\\230\\231\\232\\233\\234\\235\\236\\237\\240\\241\\242\\243\\244\\245\\246\\247\\250\\251\\252\\253\\254\\255\\256\\257\\260\\261\\262\\263\\264\\265\\266\\267\\270\\271\\272\\273\\274\\275\\276\\277\\300\\301\\302\\303\\304\\305\\306\\307\\310\\311\\312\\313\\314\\315\\316\\317\\320\\321\\322\\323\\324\\325\\326\\327\\330\\331\\332\\333\\334\\335\\336\\337\\340\\341\\342\\343\\344\\345\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\\360\\361\\362\\363\\364\\365\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377\" =~ /\\000\\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\\040\\041\\042\\043\\044\\045\\046\\047\\050\\051\\052\\053\\054\\055\\056\\057\\060\\061\\062\\063\\064\\065\\066\\067\\070\\071\\072\\073\\074\\075\\076\\077\\100\\101\\102\\103\\104\\105\\106\\107\\110\\111\\112\\113\\114\\115\\116\\117\\120\\121\\122\\123\\124\\125\\126\\127\\130\\131\\132\\133\\134\\135\\136\\137\\140\\141\\142\\143\\144\\145\\146\\147\\150\\151\\152\\153\\154\\155\\156\\157\\160\\161\\162\\163\\164\\165\\166\\167\\170\\171\\172\\173\\174\\175\\176\\177\\200\\201\\202\\203\\204\\205\\206\\207\\210\\211\\212\\213\\214\\215\\216\\217\\220\\221\\222\\223\\224\\225\\226\\227\\230\\231\\232\\233\\234\\235\\236\\237\\240\\241\\242\\243\\244\\245\\246\\247\\250\\251\\252\\253\\254\\255\\256\\257\\260\\261\\262\\263\\264\\265\\266\\267\\270\\271\\272\\273\\274\\275\\276\\277\\300\\301\\302\\303\\304\\305\\306\\307\\310\\311\\312\\313\\314\\315\\316\\317\\320\\321\\322\\323\\324\\325\\326\\327\\330\\331\\332\\333\\334\\335\\336\\337\\340\\341\\342\\343\\344\\345\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\\360\\361\\362\\363\\364\\365\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377/" "\\000\\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\\040\\041\\042\\043\\044\\045\\046\\047\\050\\051\\052\\053\\054\\055\\056\\057\\060\\061\\062\\063\\064\\065\\066\\067\\070\\071\\072\\073\\074\\075\\076\\077\\100\\101\\102\\103\\104\\105\\106\\107\\110\\111\\112\\113\\114\\115\\116\\117\\120\\121\\122\\123\\124\\125\\126\\127\\130\\131\\132\\133\\134\\135\\136\\137\\140\\141\\142\\143\\144\\145\\146\\147\\150\\151\\152\\153\\154\\155\\156\\157\\160\\161\\162\\163\\164\\165\\166\\167\\170\\171\\172\\173\\174\\175\\176\\177\\200\\201\\202\\203\\204\\205\\206\\207\\210\\211\\212\\213\\214\\215\\216\\217\\220\\221\\222\\223\\224\\225\\226\\227\\230\\231\\232\\233\\234\\235\\236\\237\\240\\241\\242\\243\\244\\245\\246\\247\\250\\251\\252\\253\\254\\255\\256\\257\\260\\261\\262\\263\\264\\265\\266\\267\\270\\271\\272\\273\\274\\275\\276\\277\\300\\301\\302\\303\\304\\305\\306\\307\\310\\311\\312\\313\\314\\315\\316\\317\\320\\321\\322\\323\\324\\325\\326\\327\\330\\331\\332\\333\\334\\335\\336\\337\\340\\341\\342\\343\\344\\345\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\\360\\361\\362\\363\\364\\365\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377" nil nil nil nil ("" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255) nil ("" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(467 "\"xxxxxxxxxxxPSTAIREISLLxxxxxxxxx\" =~ /P[^*]TAIRE[^*]{1,6}?LL/" "P[^*]TAIRE[^*]{1,6}?LL" nil nil nil nil "xxxxxxxxxxxPSTAIREISLLxxxxxxxxx" nil "PSTAIREISLL" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(468 "\"xxxxxxxxxxxPSTAIREISLLxxxxxxxxx\" =~ /P[^*]TAIRE[^*]{1,}?LL/" "P[^*]TAIRE[^*]{1,}?LL" nil nil nil nil "xxxxxxxxxxxPSTAIREISLLxxxxxxxxx" nil "PSTAIREISLL" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(469 "\"1.230003938\" =~ /(\\.\\d\\d[1-9]?)\\d+/" "(\\.\\d\\d[1-9]?)\\d+" nil nil nil nil "1.230003938" nil ".230003938" (".23" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(470 "\"1.875000282\" =~ /(\\.\\d\\d[1-9]?)\\d+/" "(\\.\\d\\d[1-9]?)\\d+" nil nil nil nil "1.875000282" nil ".875000282" (".875" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(471 "\"1.235\" =~ /(\\.\\d\\d[1-9]?)\\d+/" "(\\.\\d\\d[1-9]?)\\d+" nil nil nil nil "1.235" nil ".235" (".23" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(472 "\"1.230003938\" =~ /(\\.\\d\\d((?=0)|\\d(?=\\d)))/" "(\\.\\d\\d((?=0)|\\d(?=\\d)))" nil nil nil nil "1.230003938" nil ".23" (".23" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(473 "\"1.875000282\" =~ /(\\.\\d\\d((?=0)|\\d(?=\\d)))/" "(\\.\\d\\d((?=0)|\\d(?=\\d)))" nil nil nil nil "1.875000282" nil ".875" (".875" "5" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(474 "\"1.235\" =~ /(\\.\\d\\d((?=0)|\\d(?=\\d)))/" "(\\.\\d\\d((?=0)|\\d(?=\\d)))" nil nil nil nil "1.235" nil nil nil) -(475 "\"ab\" =~ /a(?)b/" "a(?)b" nil nil nil nil "ab" nil "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(476 "\"Food is on the foo table\" =~ /\\b(foo)\\s+(\\w+)/i" "\\b(foo)\\s+(\\w+)" t nil nil nil "Food is on the foo table" nil "foo table" ("foo" "table" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(477 "\"The food is under the bar in the barn.\" =~ /foo(.*)bar/" "foo(.*)bar" nil nil nil nil "The food is under the bar in the barn." nil "food is under the bar in the bar" ("d is under the bar in the " nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(478 "\"The food is under the bar in the barn.\" =~ /foo(.*?)bar/" "foo(.*?)bar" nil nil nil nil "The food is under the bar in the barn." nil "food is under the bar" ("d is under the " nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(479 "\"I have 2 numbers: 53147\" =~ /(.*)(\\d*)/" "(.*)(\\d*)" nil nil nil nil "I have 2 numbers: 53147" nil "I have 2 numbers: 53147" ("I have 2 numbers: 53147" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(480 "\"I have 2 numbers: 53147\" =~ /(.*)(\\d+)/" "(.*)(\\d+)" nil nil nil nil "I have 2 numbers: 53147" nil "I have 2 numbers: 53147" ("I have 2 numbers: 5314" "7" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(481 "\"I have 2 numbers: 53147\" =~ /(.*?)(\\d*)/" "(.*?)(\\d*)" nil nil nil nil "I have 2 numbers: 53147" nil "" ("" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(482 "\"I have 2 numbers: 53147\" =~ /(.*?)(\\d+)/" "(.*?)(\\d+)" nil nil nil nil "I have 2 numbers: 53147" nil "I have 2" ("I have " "2" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(483 "\"I have 2 numbers: 53147\" =~ /(.*)(\\d+)$/" "(.*)(\\d+)$" nil nil nil nil "I have 2 numbers: 53147" nil "I have 2 numbers: 53147" ("I have 2 numbers: 5314" "7" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(484 "\"I have 2 numbers: 53147\" =~ /(.*?)(\\d+)$/" "(.*?)(\\d+)$" nil nil nil nil "I have 2 numbers: 53147" nil "I have 2 numbers: 53147" ("I have 2 numbers: " "53147" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(485 "\"I have 2 numbers: 53147\" =~ /(.*)\\b(\\d+)$/" "(.*)\\b(\\d+)$" nil nil nil nil "I have 2 numbers: 53147" nil "I have 2 numbers: 53147" ("I have 2 numbers: " "53147" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(486 "\"I have 2 numbers: 53147\" =~ /(.*\\D)(\\d+)$/" "(.*\\D)(\\d+)$" nil nil nil nil "I have 2 numbers: 53147" nil "I have 2 numbers: 53147" ("I have 2 numbers: " "53147" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(487 "\"ABC123\" =~ /^\\D*(?!123)/" "^\\D*(?!123)" nil nil nil nil "ABC123" nil "AB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(488 "\"ABC445\" =~ /^(\\D*)(?=\\d)(?!123)/" "^(\\D*)(?=\\d)(?!123)" nil nil nil nil "ABC445" nil "ABC" ("ABC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(489 "\"ABC123\" =~ /^(\\D*)(?=\\d)(?!123)/" "^(\\D*)(?=\\d)(?!123)" nil nil nil nil "ABC123" nil nil nil) -(490 "\"W46]789\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "W46]789" nil "W46]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(491 "\"-46]789\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "-46]789" nil "-46]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(492 "\"Wall\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "Wall" nil nil nil) -(493 "\"Zebra\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "Zebra" nil nil nil) -(494 "\"42\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "42" nil nil nil) -(495 "\"[abcd]\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "[abcd]" nil nil nil) -(496 "\"]abcd[\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "]abcd[" nil nil nil) -(497 "\"W46]789\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "W46]789" nil "W" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(498 "\"Wall\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "Wall" nil "W" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(499 "\"Zebra\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "Zebra" nil "Z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(500 "\"Xylophone\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "Xylophone" nil "X" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(501 "\"42\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "42" nil "4" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(502 "\"[abcd]\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "[abcd]" nil "[" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(503 "\"]abcd[\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "]abcd[" nil "]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(504 "\"\\\\backslash\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "\\backslash" nil "\\" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(505 "\"-46]789\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "-46]789" nil nil nil) -(506 "\"well\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "well" nil nil nil) -(507 "\"01/01/2000\" =~ /\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d/" "\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d" nil nil nil nil "01/01/2000" nil "01/01/2000" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(508 "\"word cat dog elephant mussel cow horse canary baboon snake shark otherword\" =~ /word (?:[a-zA-Z0-9]+ ){0,10}otherword/" "word (?:[a-zA-Z0-9]+ ){0,10}otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark otherword" nil "word cat dog elephant mussel cow horse canary baboon snake shark otherword" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(509 "\"word cat dog elephant mussel cow horse canary baboon snake shark\" =~ /word (?:[a-zA-Z0-9]+ ){0,10}otherword/" "word (?:[a-zA-Z0-9]+ ){0,10}otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark" nil nil nil) -(510 "\"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope\" =~ /word (?:[a-zA-Z0-9]+ ){0,300}otherword/" "word (?:[a-zA-Z0-9]+ ){0,300}otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope" nil nil nil) -(511 "\"bcd\" =~ /^(a){0,0}/" "^(a){0,0}" nil nil nil nil "bcd" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(512 "\"abc\" =~ /^(a){0,0}/" "^(a){0,0}" nil nil nil nil "abc" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(513 "\"aab\" =~ /^(a){0,0}/" "^(a){0,0}" nil nil nil nil "aab" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(514 "\"bcd\" =~ /^(a){0,1}/" "^(a){0,1}" nil nil nil nil "bcd" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(515 "\"abc\" =~ /^(a){0,1}/" "^(a){0,1}" nil nil nil nil "abc" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(516 "\"aab\" =~ /^(a){0,1}/" "^(a){0,1}" nil nil nil nil "aab" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(517 "\"bcd\" =~ /^(a){0,2}/" "^(a){0,2}" nil nil nil nil "bcd" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(518 "\"abc\" =~ /^(a){0,2}/" "^(a){0,2}" nil nil nil nil "abc" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(519 "\"aab\" =~ /^(a){0,2}/" "^(a){0,2}" nil nil nil nil "aab" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(520 "\"bcd\" =~ /^(a){0,3}/" "^(a){0,3}" nil nil nil nil "bcd" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(521 "\"abc\" =~ /^(a){0,3}/" "^(a){0,3}" nil nil nil nil "abc" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(522 "\"aab\" =~ /^(a){0,3}/" "^(a){0,3}" nil nil nil nil "aab" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(523 "\"aaa\" =~ /^(a){0,3}/" "^(a){0,3}" nil nil nil nil "aaa" nil "aaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(524 "\"bcd\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "bcd" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(525 "\"abc\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "abc" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(526 "\"aab\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "aab" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(527 "\"aaa\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "aaa" nil "aaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(528 "\"aaaaaaaa\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "aaaaaaaa" nil "aaaaaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(529 "\"bcd\" =~ /^(a){1,1}/" "^(a){1,1}" nil nil nil nil "bcd" nil nil nil) -(530 "\"abc\" =~ /^(a){1,1}/" "^(a){1,1}" nil nil nil nil "abc" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(531 "\"aab\" =~ /^(a){1,1}/" "^(a){1,1}" nil nil nil nil "aab" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(532 "\"bcd\" =~ /^(a){1,2}/" "^(a){1,2}" nil nil nil nil "bcd" nil nil nil) -(533 "\"abc\" =~ /^(a){1,2}/" "^(a){1,2}" nil nil nil nil "abc" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(534 "\"aab\" =~ /^(a){1,2}/" "^(a){1,2}" nil nil nil nil "aab" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(535 "\"bcd\" =~ /^(a){1,3}/" "^(a){1,3}" nil nil nil nil "bcd" nil nil nil) -(536 "\"abc\" =~ /^(a){1,3}/" "^(a){1,3}" nil nil nil nil "abc" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(537 "\"aab\" =~ /^(a){1,3}/" "^(a){1,3}" nil nil nil nil "aab" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(538 "\"aaa\" =~ /^(a){1,3}/" "^(a){1,3}" nil nil nil nil "aaa" nil "aaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(539 "\"bcd\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "bcd" nil nil nil) -(540 "\"abc\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "abc" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(541 "\"aab\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "aab" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(542 "\"aaa\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "aaa" nil "aaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(543 "\"aaaaaaaa\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "aaaaaaaa" nil "aaaaaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(544 "\"borfle\\nbib.gif\\nno\" =~ /.*\\.gif/" ".*\\.gif" nil nil nil nil "borfle -bib.gif -no" nil "bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(545 "\"borfle\\nbib.gif\\nno\" =~ /.{0,}\\.gif/" ".{0,}\\.gif" nil nil nil nil "borfle -bib.gif -no" nil "bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(546 "\"borfle\\nbib.gif\\nno\" =~ /.*\\.gif/m" ".*\\.gif" nil t nil nil "borfle -bib.gif -no" nil "bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(547 "\"borfle\\nbib.gif\\nno\" =~ /.*\\.gif/s" ".*\\.gif" nil nil t nil "borfle -bib.gif -no" nil "borfle -bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(548 "\"borfle\\nbib.gif\\nno\" =~ /.*\\.gif/ms" ".*\\.gif" nil t t nil "borfle -bib.gif -no" nil "borfle -bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(549 "\"borfle\\nbib.gif\\nno\" =~ /.*$/" ".*$" nil nil nil nil "borfle -bib.gif -no" nil "no" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(550 "\"borfle\\nbib.gif\\nno\" =~ /.*$/m" ".*$" nil t nil nil "borfle -bib.gif -no" nil "borfle" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(551 "\"borfle\\nbib.gif\\nno\" =~ /.*$/s" ".*$" nil nil t nil "borfle -bib.gif -no" nil "borfle -bib.gif -no" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(552 "\"borfle\\nbib.gif\\nno\" =~ /.*$/ms" ".*$" nil t t nil "borfle -bib.gif -no" nil "borfle -bib.gif -no" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(553 "\"borfle\\nbib.gif\\nno\\n\" =~ /.*$/" ".*$" nil nil nil nil "borfle -bib.gif -no -" nil "no" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(554 "\"borfle\\nbib.gif\\nno\\n\" =~ /.*$/m" ".*$" nil t nil nil "borfle -bib.gif -no -" nil "borfle" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(555 "\"borfle\\nbib.gif\\nno\\n\" =~ /.*$/s" ".*$" nil nil t nil "borfle -bib.gif -no -" nil "borfle -bib.gif -no -" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(556 "\"borfle\\nbib.gif\\nno\\n\" =~ /.*$/ms" ".*$" nil t t nil "borfle -bib.gif -no -" nil "borfle -bib.gif -no -" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(557 "\"abcde\\n1234Xyz\" =~ /(.*X|^B)/" "(.*X|^B)" nil nil nil nil "abcde -1234Xyz" nil "1234X" ("1234X" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(558 "\"BarFoo\" =~ /(.*X|^B)/" "(.*X|^B)" nil nil nil nil "BarFoo" nil "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(559 "\"abcde\\nBar\" =~ /(.*X|^B)/" "(.*X|^B)" nil nil nil nil "abcde -Bar" nil nil nil) -(560 "\"abcde\\n1234Xyz\" =~ /(.*X|^B)/m" "(.*X|^B)" nil t nil nil "abcde -1234Xyz" nil "1234X" ("1234X" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(561 "\"BarFoo\" =~ /(.*X|^B)/m" "(.*X|^B)" nil t nil nil "BarFoo" nil "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(562 "\"abcde\\nBar\" =~ /(.*X|^B)/m" "(.*X|^B)" nil t nil nil "abcde -Bar" nil "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(563 "\"abcde\\n1234Xyz\" =~ /(.*X|^B)/s" "(.*X|^B)" nil nil t nil "abcde -1234Xyz" nil "abcde -1234X" ("abcde -1234X" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(564 "\"BarFoo\" =~ /(.*X|^B)/s" "(.*X|^B)" nil nil t nil "BarFoo" nil "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(565 "\"abcde\\nBar\" =~ /(.*X|^B)/s" "(.*X|^B)" nil nil t nil "abcde -Bar" nil nil nil) -(566 "\"abcde\\n1234Xyz\" =~ /(.*X|^B)/ms" "(.*X|^B)" nil t t nil "abcde -1234Xyz" nil "abcde -1234X" ("abcde -1234X" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(567 "\"BarFoo\" =~ /(.*X|^B)/ms" "(.*X|^B)" nil t t nil "BarFoo" nil "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(568 "\"abcde\\nBar\" =~ /(.*X|^B)/ms" "(.*X|^B)" nil t t nil "abcde -Bar" nil "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(569 "\"abcde\\n1234Xyz\" =~ /(?s)(.*X|^B)/" "(?s)(.*X|^B)" nil nil nil nil "abcde -1234Xyz" nil "abcde -1234X" ("abcde -1234X" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(570 "\"BarFoo\" =~ /(?s)(.*X|^B)/" "(?s)(.*X|^B)" nil nil nil nil "BarFoo" nil "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(571 "\"abcde\\nBar\" =~ /(?s)(.*X|^B)/" "(?s)(.*X|^B)" nil nil nil nil "abcde -Bar" nil nil nil) -(572 "\"abcde\\n1234Xyz\" =~ /(?s:.*X|^B)/" "(?s:.*X|^B)" nil nil nil nil "abcde -1234Xyz" nil "abcde -1234X" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(573 "\"BarFoo\" =~ /(?s:.*X|^B)/" "(?s:.*X|^B)" nil nil nil nil "BarFoo" nil "B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(574 "\"abcde\\nBar\" =~ /(?s:.*X|^B)/" "(?s:.*X|^B)" nil nil nil nil "abcde -Bar" nil nil nil) -(575 "\"abc\\nB\" =~ /^.*B/" "^.*B" nil nil nil nil "abc -B" nil nil nil) -(576 "\"abc\\nB\" =~ /(?s)^.*B/" "(?s)^.*B" nil nil nil nil "abc -B" nil "abc -B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(577 "\"abc\\nB\" =~ /(?m)^.*B/" "(?m)^.*B" nil nil nil nil "abc -B" nil "B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(578 "\"abc\\nB\" =~ /(?ms)^.*B/" "(?ms)^.*B" nil nil nil nil "abc -B" nil "abc -B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(579 "\"abc\\nB\" =~ /(?ms)^B/" "(?ms)^B" nil nil nil nil "abc -B" nil "B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(580 "\"B\\n\" =~ /(?s)B$/" "(?s)B$" nil nil nil nil "B -" nil "B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(581 "\"123456654321\" =~ /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/" "^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]" nil nil nil nil "123456654321" nil "123456654321" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(582 "\"123456654321\" =~ /^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d/" "^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d" nil nil nil nil "123456654321" nil "123456654321" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(583 "\"123456654321\" =~ /^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]/" "^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]" nil nil nil nil "123456654321" nil "123456654321" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(584 "\"abcabcabcabc\" =~ /^[abc]{12}/" "^[abc]{12}" nil nil nil nil "abcabcabcabc" nil "abcabcabcabc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(585 "\"abcabcabcabc\" =~ /^[a-c]{12}/" "^[a-c]{12}" nil nil nil nil "abcabcabcabc" nil "abcabcabcabc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(586 "\"abcabcabcabc\" =~ /^(a|b|c){12}/" "^(a|b|c){12}" nil nil nil nil "abcabcabcabc" nil "abcabcabcabc" ("c" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(587 "\"n\" =~ /^[abcdefghijklmnopqrstuvwxy0123456789]/" "^[abcdefghijklmnopqrstuvwxy0123456789]" nil nil nil nil "n" nil "n" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(588 "\"z\" =~ /^[abcdefghijklmnopqrstuvwxy0123456789]/" "^[abcdefghijklmnopqrstuvwxy0123456789]" nil nil nil nil "z" nil nil nil) -(589 "\"abcd\" =~ /abcde{0,0}/" "abcde{0,0}" nil nil nil nil "abcd" nil "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(590 "\"abce\" =~ /abcde{0,0}/" "abcde{0,0}" nil nil nil nil "abce" nil nil nil) -(591 "\"abe\" =~ /ab[cd]{0,0}e/" "ab[cd]{0,0}e" nil nil nil nil "abe" nil "abe" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(592 "\"abcde\" =~ /ab[cd]{0,0}e/" "ab[cd]{0,0}e" nil nil nil nil "abcde" nil nil nil) -(593 "\"abd\" =~ /ab(c){0,0}d/" "ab(c){0,0}d" nil nil nil nil "abd" nil "abd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(594 "\"abcd\" =~ /ab(c){0,0}d/" "ab(c){0,0}d" nil nil nil nil "abcd" nil nil nil) -(595 "\"a\" =~ /a(b*)/" "a(b*)" nil nil nil nil "a" nil "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(596 "\"ab\" =~ /a(b*)/" "a(b*)" nil nil nil nil "ab" nil "ab" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(597 "\"abbbb\" =~ /a(b*)/" "a(b*)" nil nil nil nil "abbbb" nil "abbbb" ("bbbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(598 "\"bbbbb\" =~ /a(b*)/" "a(b*)" nil nil nil nil "bbbbb" nil nil nil) -(599 "\"abe\" =~ /ab\\d{0}e/" "ab\\d{0}e" nil nil nil nil "abe" nil "abe" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(600 "\"ab1e\" =~ /ab\\d{0}e/" "ab\\d{0}e" nil nil nil nil "ab1e" nil nil nil) -(601 "\"the \\\"quick\\\" brown fox\" =~ /\"([^\\\\\"]+|\\\\.)*\"/" "\"([^\\\\\"]+|\\\\.)*\"" nil nil nil nil "the \"quick\" brown fox" nil "\"quick\"" ("quick" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(602 "\"\\\"the \\\\\\\"quick\\\\\\\" brown fox\\\"\" =~ /\"([^\\\\\"]+|\\\\.)*\"/" "\"([^\\\\\"]+|\\\\.)*\"" nil nil nil nil "\"the \\\"quick\\\" brown fox\"" nil "\"the \\\"quick\\\" brown fox\"" (" brown fox" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(603 "\"abc\" =~ /.*?/" ".*?" nil nil nil nil "abc" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(604 "\"abc\" =~ /\\b/" "\\b" nil nil nil nil "abc" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(605 "\"abc\" =~ /\\b/" "\\b" nil nil nil nil "abc" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(606 "\"abc\" =~ /(?#)/" "" nil nil nil nil "abc" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(607 "\"43.Word Processor
(N-1286)
Lega lstaff.comCA - Statewide\" =~ /]{0,})>]{0,})>([\\d]{0,}\\.)(.*)((
([\\w\\W\\s\\d][^<>]{0,})|[\\s]{0,}))<\\/a><\\/TD>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><\\/TR>/is" "]{0,})>]{0,})>([\\d]{0,}\\.)(.*)((
([\\w\\W\\s\\d][^<>]{0,})|[\\s]{0,}))<\\/a><\\/TD>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><\\/TR>" t nil t nil "43.Word Processor
(N-1286)
Lega lstaff.comCA - Statewide" nil "43.Word Processor
(N-1286)
Lega lstaff.comCA - Statewide" (" BGCOLOR='#DBE9E9'" " align=left valign=top" "43." "Word Processor
(N-1286)" "" "" nil " align=left valign=top" "Lega lstaff.com" " align=left valign=top" "CA - Statewide" nil nil nil nil nil)) -(608 "\"acb\" =~ /a[^a]b/" "a[^a]b" nil nil nil nil "acb" nil "acb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(609 "\"a\\nb\" =~ /a[^a]b/" "a[^a]b" nil nil nil nil "a -b" nil "a -b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(610 "\"acb\" =~ /a.b/" "a.b" nil nil nil nil "acb" nil "acb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(611 "\"a\\nb\" =~ /a.b/" "a.b" nil nil nil nil "a -b" nil nil nil) -(612 "\"acb\" =~ /a[^a]b/s" "a[^a]b" nil nil t nil "acb" nil "acb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(613 "\"a\\nb\" =~ /a[^a]b/s" "a[^a]b" nil nil t nil "a -b" nil "a -b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(614 "\"acb\" =~ /a.b/s" "a.b" nil nil t nil "acb" nil "acb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(615 "\"a\\nb\" =~ /a.b/s" "a.b" nil nil t nil "a -b" nil "a -b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(616 "\"bac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bac" nil "bac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(617 "\"bbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbac" nil "bbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(618 "\"bbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbac" nil "bbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(619 "\"bbbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbbac" nil "bbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(620 "\"bbbbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbbbac" nil "bbbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(621 "\"bac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bac" nil "bac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(622 "\"bbac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bbac" nil "bbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(623 "\"bbbac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bbbac" nil "bbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(624 "\"bbbbac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bbbbac" nil "bbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(625 "\"bbbbbac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bbbbbac" nil "bbbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(626 "\"x\\nb\\n\" =~ /(?!\\A)x/m" "(?!\\A)x" nil t nil nil "x -b -" nil nil nil) -(627 "\"a\\bx\\n\" =~ /(?!\\A)x/m" "(?!\\A)x" nil t nil nil ("a" 8 "x" 10) nil "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(628 "\"\\0{ab}\" =~ /\\x0{ab}/" "\\x0{ab}" nil nil nil nil ("" 0 "{ab}") nil ("" 0 "{ab}") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(629 "\"CD\" =~ /(A|B)*?CD/" "(A|B)*?CD" nil nil nil nil "CD" nil "CD" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(630 "\"CD\" =~ /(A|B)*CD/" "(A|B)*CD" nil nil nil nil "CD" nil "CD" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(631 "\"ABABAB\" =~ /(AB)*?\\1/" "(AB)*?\\1" nil nil nil nil "ABABAB" nil "ABAB" ("AB" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(632 "\"ABABAB\" =~ /(AB)*\\1/" "(AB)*\\1" nil nil nil nil "ABABAB" nil "ABABAB" ("AB" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(633 "\"doesn't matter\" =~ /(/" "(" nil nil nil nil "doesn't matter" t nil nil) -(634 "\"doesn't matter\" =~ /(x)\\2/" "(x)\\2" nil nil nil nil "doesn't matter" t nil nil) -(635 "\"aaaaaaaaaac\" =~ /((a{0,5}){0,5}){0,5}[c]/" "((a{0,5}){0,5}){0,5}[c]" nil nil nil nil "aaaaaaaaaac" nil "aaaaaaaaaac" ("" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(636 "\"aaaaaaaaaa\" =~ /((a{0,5}){0,5}){0,5}[c]/" "((a{0,5}){0,5}){0,5}[c]" nil nil nil nil "aaaaaaaaaa" nil nil nil) -(637 "\"aaaaaaaaaac\" =~ /((a{0,5}){0,5})*[c]/" "((a{0,5}){0,5})*[c]" nil nil nil nil "aaaaaaaaaac" nil "aaaaaaaaaac" ("" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(638 "\"aaaaaaaaaa\" =~ /((a{0,5}){0,5})*[c]/" "((a{0,5}){0,5})*[c]" nil nil nil nil "aaaaaaaaaa" nil nil nil) -(639 "\"a\" =~ /(\\b)*a/" "(\\b)*a" nil nil nil nil "a" nil "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(640 "\"ab\" =~ /(a)*b/" "(a)*b" nil nil nil nil "ab" nil "ab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(641 "\"ab\" =~ /(a|)*b/" "(a|)*b" nil nil nil nil "ab" nil "ab" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(642 "\"b\" =~ /(a|)*b/" "(a|)*b" nil nil nil nil "b" nil "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(643 "\"x\" =~ /(a|)*b/" "(a|)*b" nil nil nil nil "x" nil nil nil) -(644 "\"abab\" =~ /^(?:(a)|(b))*\\1\\2$/" "^(?:(a)|(b))*\\1\\2$" nil nil nil nil "abab" nil "abab" ("a" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(645 "\"abcxabcydef\" =~ /abc[^x]def/" "abc[^x]def" nil nil nil nil "abcxabcydef" nil "abcydef" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(646 "\"aax\" =~ /^(a|\\1x)*$/" "^(a|\\1x)*$" nil nil nil nil "aax" nil "aax" ("ax" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(647 "\"aaxa\" =~ /^(a|\\1x)*$/" "^(a|\\1x)*$" nil nil nil nil "aaxa" nil "aaxa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(648 "\"@{['']}\" =~ /(?#)/" "" nil nil nil nil "" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(649 "\"ab\" =~ /^(?:(a)|(b))*$/" "^(?:(a)|(b))*$" nil nil nil nil "ab" nil "ab" ("a" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(650 "\"a\" =~ /[\\0]/" "[\\0]" nil nil nil nil "a" nil nil nil) -(651 "\"\\0\" =~ /[\\0]/" "[\\0]" nil nil nil nil ("" 0) nil ("" 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(652 "\"a\" =~ /[\\1]/" "[\\1]" nil nil nil nil "a" nil nil nil) -(653 "\"\\1\" =~ /[\\1]/" "[\\1]" nil nil nil nil ("" 1) nil ("" 1) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(654 "\"doesn't matter\" =~ /\\10()()()()()()()()()/" "\\10()()()()()()()()()" nil nil nil nil "doesn't matter" nil nil nil) -(655 "\"a\" =~ /\\10()()()()()()()()()()/" "\\10()()()()()()()()()()" nil nil nil nil "a" nil nil nil) -(656 "\"ab\" =~ /a(?<)b/" "a(?<)b" nil nil nil nil "ab" nil "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(657 "\"doesn't matter\" =~ /[]/" "[]" nil nil nil nil "doesn't matter" t nil nil) -(658 "\"doesn't matter\" =~ /[\\]/" "[\\]" nil nil nil nil "doesn't matter" t nil nil) -(659 "\"a\" =~ /()/" "()" nil nil nil nil "a" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(660 "\"x\" =~ /[\\x]/" "[\\x]" nil nil nil nil "x" nil nil nil) -(661 "\"\\0\" =~ /[\\x]/" "[\\x]" nil nil nil nil ("" 0) nil ("" 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(662 "\"a\" =~ /((a)*)*/" "((a)*)*" nil nil nil nil "a" nil "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(663 "\"a\" =~ /()a\\1/" "()a\\1" nil nil nil nil "a" nil "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(664 "\"a\" =~ /a\\1()/" "a\\1()" nil nil nil nil "a" nil nil nil) -(665 "\"aaa\" =~ /a(?i)a(?-i)a/" "a(?i)a(?-i)a" nil nil nil nil "aaa" nil "aaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(666 "\"aAa\" =~ /a(?i)a(?-i)a/" "a(?i)a(?-i)a" nil nil nil nil "aAa" nil "aAa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(667 "\"aAA\" =~ /a(?i)a(?-i)a/" "a(?i)a(?-i)a" nil nil nil nil "aAA" nil nil nil) -(668 "\"aaaaa\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "aaaaa" nil "aaaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(669 "\"aAaAa\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "aAaAa" nil "aAaAa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(670 "\"AaAaA\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "AaAaA" nil nil nil) -(671 "\"aAAAa\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "aAAAa" nil nil nil) -(672 "\"AaaaA\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "AaaaA" nil nil nil) -(673 "\"AAAAA\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "AAAAA" nil nil nil) -(674 "\"aaAAA\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "aaAAA" nil nil nil) -(675 "\"AAaaa\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "AAaaa" nil nil nil) -(676 "\"a\" =~ /\\x/" "\\x" nil nil nil nil "a" nil nil nil) -(677 "\"X\" =~ /\\x/" "\\x" nil nil nil nil "X" nil nil nil) -(678 "\"\\0\" =~ /\\x/" "\\x" nil nil nil nil ("" 0) nil ("" 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(679 "\"a\" =~ /[a-c-e]/" "[a-c-e]" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(680 "\"b\" =~ /[a-c-e]/" "[a-c-e]" nil nil nil nil "b" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(681 "\"d\" =~ /[a-c-e]/" "[a-c-e]" nil nil nil nil "d" nil nil nil) -(682 "\"-\" =~ /[a-c-e]/" "[a-c-e]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(683 "\"b\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "b" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(684 "\"c\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "c" nil nil nil) -(685 "\"d\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "d" nil nil nil) -(686 "\"-\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(687 "\"1\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "1" nil "1" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(688 "\"d\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "d" nil nil nil) -(689 "\"e\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "e" nil nil nil) -(690 "\"f\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "f" nil "f" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(691 "\"-\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(692 "\"1\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "1" nil "1" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(693 "\"doesn't matter\" =~ /[/" "[" nil nil nil nil "doesn't matter" t nil nil) -(694 "\"]\" =~ /]/" "]" nil nil nil nil "]" nil "]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(695 "\"a\" =~ /]/" "]" nil nil nil nil "a" nil nil nil) -(696 "\"doesn't matter\" =~ /[]/" "[]" nil nil nil nil "doesn't matter" t nil nil) -(697 "\"-\" =~ /[-a-c]/" "[-a-c]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(698 "\"a\" =~ /[-a-c]/" "[-a-c]" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(699 "\"b\" =~ /[-a-c]/" "[-a-c]" nil nil nil nil "b" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(700 "\"d\" =~ /[-a-c]/" "[-a-c]" nil nil nil nil "d" nil nil nil) -(701 "\"-\" =~ /[a-c-]/" "[a-c-]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(702 "\"a\" =~ /[a-c-]/" "[a-c-]" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(703 "\"b\" =~ /[a-c-]/" "[a-c-]" nil nil nil nil "b" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(704 "\"d\" =~ /[a-c-]/" "[a-c-]" nil nil nil nil "d" nil nil nil) -(705 "\"a\" =~ /[-]/" "[-]" nil nil nil nil "a" nil nil nil) -(706 "\"-\" =~ /[-]/" "[-]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(707 "\"a\" =~ /[--]/" "[--]" nil nil nil nil "a" nil nil nil) -(708 "\"-\" =~ /[--]/" "[--]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(709 "\"a\" =~ /[---]/" "[---]" nil nil nil nil "a" nil nil nil) -(710 "\"-\" =~ /[---]/" "[---]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(711 "\"-\" =~ /[--b]/" "[--b]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(712 "\"a\" =~ /[--b]/" "[--b]" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(713 "\"c\" =~ /[--b]/" "[--b]" nil nil nil nil "c" nil nil nil) -(714 "\"doesn't matter\" =~ /[b--]/" "[b--]" nil nil nil nil "doesn't matter" t nil nil) -(715 "\"a{\" =~ /a{/" "a{" nil nil nil nil "a{" nil "a{" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(716 "\"a{}\" =~ /a{}/" "a{}" nil nil nil nil "a{}" nil "a{}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(717 "\"a{3\" =~ /a{3/" "a{3" nil nil nil nil "a{3" nil "a{3" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(718 "\"a{3,\" =~ /a{3,/" "a{3," nil nil nil nil "a{3," nil "a{3," (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(719 "\"a{3,3}\" =~ /a{3, 3}/" "a{3, 3}" nil nil nil nil "a{3,3}" nil nil nil) -(720 "\"a{3, 3}\" =~ /a{3, 3}/" "a{3, 3}" nil nil nil nil "a{3, 3}" nil "a{3, 3}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(721 "\"aaa\" =~ /a{3, 3}/" "a{3, 3}" nil nil nil nil "aaa" nil nil nil) -(722 "\"a{3,3}\" =~ /a{3, 3}/x" "a{3, 3}" nil nil nil t "a{3,3}" nil "a{3,3}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(723 "\"a{3, 3}\" =~ /a{3, 3}/x" "a{3, 3}" nil nil nil t "a{3, 3}" nil nil nil) -(724 "\"aaa\" =~ /a{3, 3}/x" "a{3, 3}" nil nil nil t "aaa" nil nil nil) -(725 "\"a{3,}\" =~ /a{3, }/" "a{3, }" nil nil nil nil "a{3,}" nil nil nil) -(726 "\"a{3, }\" =~ /a{3, }/" "a{3, }" nil nil nil nil "a{3, }" nil "a{3, }" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(727 "\"aaa\" =~ /a{3, }/" "a{3, }" nil nil nil nil "aaa" nil nil nil) -(728 "\"a{3,}\" =~ /a{3, }/x" "a{3, }" nil nil nil t "a{3,}" nil "a{3,}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(729 "\"a{3, }\" =~ /a{3, }/x" "a{3, }" nil nil nil t "a{3, }" nil nil nil) -(730 "\"aaa\" =~ /a{3, }/x" "a{3, }" nil nil nil t "aaa" nil nil nil) -(731 "\"\\0 x\" =~ /\\x x/" "\\x x" nil nil nil nil ("" 0 " x") nil ("" 0 " x") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(732 "\"\\0x\" =~ /\\x x/" "\\x x" nil nil nil nil ("" 0 "x") nil nil nil) -(733 "\"\\0 x\" =~ /\\x x/x" "\\x x" nil nil nil t ("" 0 " x") nil nil nil) -(734 "\"\\0x\" =~ /\\x x/x" "\\x x" nil nil nil t ("" 0 "x") nil ("" 0 "x") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(735 "\"\\0003\" =~ /\\x 3/" "\\x 3" nil nil nil nil ("" 0 "3") nil nil nil) -(736 "\"\\000 3\" =~ /\\x 3/" "\\x 3" nil nil nil nil ("" 0 " 3") nil ("" 0 " 3") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(737 "\"x3\" =~ /\\x 3/" "\\x 3" nil nil nil nil "x3" nil nil nil) -(738 "\"x 3\" =~ /\\x 3/" "\\x 3" nil nil nil nil "x 3" nil nil nil) -(739 "\"\\0003\" =~ /\\x 3/x" "\\x 3" nil nil nil t ("" 0 "3") nil ("" 0 "3") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(740 "\"\\000 3\" =~ /\\x 3/x" "\\x 3" nil nil nil t ("" 0 " 3") nil nil nil) -(741 "\"x3\" =~ /\\x 3/x" "\\x 3" nil nil nil t "x3" nil nil nil) -(742 "\"x 3\" =~ /\\x 3/x" "\\x 3" nil nil nil t "x 3" nil nil nil) -(743 "\"a\" =~ /^a{ 1}$/" "^a{ 1}$" nil nil nil nil "a" nil nil nil) -(744 "\"a{ 1}\" =~ /^a{ 1}$/" "^a{ 1}$" nil nil nil nil "a{ 1}" nil "a{ 1}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(745 "\"a{1}\" =~ /^a{ 1}$/" "^a{ 1}$" nil nil nil nil "a{1}" nil nil nil) -(746 "\"a\" =~ /^a{ 1}$/x" "^a{ 1}$" nil nil nil t "a" nil nil nil) -(747 "\"a{ 1}\" =~ /^a{ 1}$/x" "^a{ 1}$" nil nil nil t "a{ 1}" nil nil nil) -(748 "\"a{1}\" =~ /^a{ 1}$/x" "^a{ 1}$" nil nil nil t "a{1}" nil "a{1}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(749 "\"{}\" =~ /{}/" "{}" nil nil nil nil "{}" nil "{}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(750 "\"a\" =~ /{}/" "{}" nil nil nil nil "a" nil nil nil) -(751 "\"doesn't matter\" =~ /{1}/" "{1}" nil nil nil nil "doesn't matter" t nil nil) -(752 "\"doesn't matter\" =~ /*/" "*" nil nil nil nil "doesn't matter" t nil nil) -(753 "\"x\" =~ /|/" "|" nil nil nil nil "x" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(754 "\"\\0000\" =~ /\\0000/" "\\0000" nil nil nil nil ("" 0 "0") nil ("" 0 "0") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(755 "\"ab\" =~ /a(?<)b/" "a(?<)b" nil nil nil nil "ab" nil "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(756 "\"ab\" =~ /a(?i)b/" "a(?i)b" nil nil nil nil "ab" nil "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(757 "\"aB\" =~ /a(?i)b/" "a(?i)b" nil nil nil nil "aB" nil "aB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(758 "\"Ab\" =~ /a(?i)b/" "a(?i)b" nil nil nil nil "Ab" nil nil nil) -(759 "\"doesn't matter\" =~ /a(?i=a)/" "a(?i=a)" nil nil nil nil "doesn't matter" t nil nil) -(760 "\"aa\" =~ /a(?<=a){3000}a/" "a(?<=a){3000}a" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(761 "\"xa\" =~ /a(?<=a){3000}a/" "a(?<=a){3000}a" nil nil nil nil "xa" nil nil nil) -(762 "\"ax\" =~ /a(?<=a){3000}a/" "a(?<=a){3000}a" nil nil nil nil "ax" nil nil nil) -(763 "\"aa\" =~ /a(?!=a){3000}a/" "a(?!=a){3000}a" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(764 "\"ax\" =~ /a(?!=a){3000}a/" "a(?!=a){3000}a" nil nil nil nil "ax" nil nil nil) -(765 "\"xa\" =~ /a(?!=a){3000}a/" "a(?!=a){3000}a" nil nil nil nil "xa" nil nil nil) -(766 "\"aa\" =~ /a(){3000}a/" "a(){3000}a" nil nil nil nil "aa" nil "aa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(767 "\"ax\" =~ /a(){3000}a/" "a(){3000}a" nil nil nil nil "ax" nil nil nil) -(768 "\"xa\" =~ /a(){3000}a/" "a(){3000}a" nil nil nil nil "xa" nil nil nil) -(769 "\"aa\" =~ /a(?:){3000}a/" "a(?:){3000}a" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(770 "\"ax\" =~ /a(?:){3000}a/" "a(?:){3000}a" nil nil nil nil "ax" nil nil nil) -(771 "\"aa\" =~ /a(?<=a)*a/" "a(?<=a)*a" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(772 "\"ax\" =~ /a(?<=a)*a/" "a(?<=a)*a" nil nil nil nil "ax" nil nil nil) -(773 "\"xa\" =~ /a(?<=a)*a/" "a(?<=a)*a" nil nil nil nil "xa" nil nil nil) -(774 "\"aa\" =~ /a(?!=a)*a/" "a(?!=a)*a" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(775 "\"ax\" =~ /a(?!=a)*a/" "a(?!=a)*a" nil nil nil nil "ax" nil nil nil) -(776 "\"xa\" =~ /a(?!=a)*a/" "a(?!=a)*a" nil nil nil nil "xa" nil nil nil) -(777 "\"aa\" =~ /a()*a/" "a()*a" nil nil nil nil "aa" nil "aa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(778 "\"ax\" =~ /a()*a/" "a()*a" nil nil nil nil "ax" nil nil nil) -(779 "\"xa\" =~ /a()*a/" "a()*a" nil nil nil nil "xa" nil nil nil) -(780 "\"aa\" =~ /a(?:)*a/" "a(?:)*a" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(781 "\"ax\" =~ /a(?:)*a/" "a(?:)*a" nil nil nil nil "ax" nil nil nil) -(782 "\"xa\" =~ /a(?:)*a/" "a(?:)*a" nil nil nil nil "xa" nil nil nil) -(783 "\"aa\" =~ /x(?<=a)*a/" "x(?<=a)*a" nil nil nil nil "aa" nil nil nil) -(784 "\"xa\" =~ /x(?<=a)*a/" "x(?<=a)*a" nil nil nil nil "xa" nil "xa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(785 "\"ax\" =~ /x(?<=a)*a/" "x(?<=a)*a" nil nil nil nil "ax" nil nil nil) -(786 "\"aa\" =~ /a(?<=(a))*\\1/" "a(?<=(a))*\\1" nil nil nil nil "aa" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(787 "\"aa\" =~ /a(?<=(a))*?\\1/" "a(?<=(a))*?\\1" nil nil nil nil "aa" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(788 "\"aa\" =~ /(?=(a)\\1)*aa/" "(?=(a)\\1)*aa" nil nil nil nil "aa" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(789 "\"aaaaabbbbb\" =~ /^((a|b){2,5}){2}$/" "^((a|b){2,5}){2}$" nil nil nil nil "aaaaabbbbb" nil "aaaaabbbbb" ("bbbbb" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(790 "\"babc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "babc" nil "babc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(791 "\"bbabc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "bbabc" nil "bbabc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(792 "\"bababc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "bababc" nil "bababc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(793 "\"bababbc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "bababbc" nil nil nil) -(794 "\"babababc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "babababc" nil nil nil) -(795 "\"aaaaac\" =~ /^a{4,5}(?:c|a)c$/" "^a{4,5}(?:c|a)c$" nil nil nil nil "aaaaac" nil "aaaaac" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(796 "\"aaaaaac\" =~ /^a{4,5}(?:c|a)c$/" "^a{4,5}(?:c|a)c$" nil nil nil nil "aaaaaac" nil "aaaaaac" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(797 "\"aaaaac\" =~ /^(a|){4,5}(?:c|a)c$/" "^(a|){4,5}(?:c|a)c$" nil nil nil nil "aaaaac" nil "aaaaac" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(798 "\"aaaaaac\" =~ /^(a|){4,5}(?:c|a)c$/" "^(a|){4,5}(?:c|a)c$" nil nil nil nil "aaaaaac" nil "aaaaaac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(799 "\"eeexabc\" =~ /(?m:^).abc$/" "(?m:^).abc$" nil nil nil nil "eeexabc" nil nil nil) -(800 "\"eee\\nxabc\" =~ /(?m:^).abc$/" "(?m:^).abc$" nil nil nil nil "eee -xabc" nil "xabc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(801 "\"abc\" =~ /(?m:^)abc/" "(?m:^)abc" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(802 "\"\\nabc\" =~ /(?m:^)abc/" "(?m:^)abc" nil nil nil nil " -abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(803 "\"abc\" =~ -/^abc/" "^abc" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(804 "\"\\nabc\" =~ -/^abc/" "^abc" nil nil nil nil " -abc" nil nil nil) -(805 "\"abc\" =~ /\\Aabc/" "\\Aabc" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(806 "\"\\nabc\" =~ /\\Aabc/" "\\Aabc" nil nil nil nil " -abc" nil nil nil) -(807 "\"foo\" =~ /(?.*/)foo\"" "(?>.*/)foo" nil nil nil nil "/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/" nil nil nil) -(826 "\"/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo\" =~ \"(?>.*/)foo\"" "(?>.*/)foo" nil nil nil nil "/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo" nil "/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(827 "\"1.230003938\" =~ /(?>(\\.\\d\\d[1-9]?))\\d+/" "(?>(\\.\\d\\d[1-9]?))\\d+" nil nil nil nil "1.230003938" nil ".230003938" (".23" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(828 "\"1.875000282\" =~ /(?>(\\.\\d\\d[1-9]?))\\d+/" "(?>(\\.\\d\\d[1-9]?))\\d+" nil nil nil nil "1.875000282" nil ".875000282" (".875" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(829 "\"1.235\" =~ /(?>(\\.\\d\\d[1-9]?))\\d+/" "(?>(\\.\\d\\d[1-9]?))\\d+" nil nil nil nil "1.235" nil nil nil) -(830 "\"now is the time for all good men to come to the aid of the party\" =~ /^((?>\\w+)|(?>\\s+))*$/" "^((?>\\w+)|(?>\\s+))*$" nil nil nil nil "now is the time for all good men to come to the aid of the party" nil "now is the time for all good men to come to the aid of the party" ("party" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(831 "\"this is not a line with only words and spaces!\" =~ /^((?>\\w+)|(?>\\s+))*$/" "^((?>\\w+)|(?>\\s+))*$" nil nil nil nil "this is not a line with only words and spaces!" nil nil nil) -(832 "\"12345a\" =~ /(\\d+)(\\w)/" "(\\d+)(\\w)" nil nil nil nil "12345a" nil "12345a" ("12345" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(833 "\"12345+\" =~ /(\\d+)(\\w)/" "(\\d+)(\\w)" nil nil nil nil "12345+" nil "12345" ("1234" "5" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(834 "\"12345a\" =~ /((?>\\d+))(\\w)/" "((?>\\d+))(\\w)" nil nil nil nil "12345a" nil "12345a" ("12345" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(835 "\"12345+\" =~ /((?>\\d+))(\\w)/" "((?>\\d+))(\\w)" nil nil nil nil "12345+" nil nil nil) -(836 "\"aaab\" =~ /(?>a+)b/" "(?>a+)b" nil nil nil nil "aaab" nil "aaab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(837 "\"aaab\" =~ /((?>a+)b)/" "((?>a+)b)" nil nil nil nil "aaab" nil "aaab" ("aaab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(838 "\"aaab\" =~ /(?>(a+))b/" "(?>(a+))b" nil nil nil nil "aaab" nil "aaab" ("aaa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(839 "\"aaabbbccc\" =~ /(?>b)+/" "(?>b)+" nil nil nil nil "aaabbbccc" nil "bbb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(840 "\"aaabbbbccccd\" =~ /(?>a+|b+|c+)*c/" "(?>a+|b+|c+)*c" nil nil nil nil "aaabbbbccccd" nil "aaabbbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(841 "\"((abc(ade)ufh()()x\" =~ /((?>[^()]+)|\\([^()]*\\))+/" "((?>[^()]+)|\\([^()]*\\))+" nil nil nil nil "((abc(ade)ufh()()x" nil "abc(ade)ufh()()x" ("x" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(842 "\"(abc)\" =~ /\\(((?>[^()]+)|\\([^()]+\\))+\\)/" "\\(((?>[^()]+)|\\([^()]+\\))+\\)" nil nil nil nil "(abc)" nil "(abc)" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(843 "\"(abc(def)xyz)\" =~ /\\(((?>[^()]+)|\\([^()]+\\))+\\)/" "\\(((?>[^()]+)|\\([^()]+\\))+\\)" nil nil nil nil "(abc(def)xyz)" nil "(abc(def)xyz)" ("xyz" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(844 "\"((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" =~ /\\(((?>[^()]+)|\\([^()]+\\))+\\)/" "\\(((?>[^()]+)|\\([^()]+\\))+\\)" nil nil nil nil "((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" nil nil nil) -(845 "\"ab\" =~ /a(?-i)b/i" "a(?-i)b" t nil nil nil "ab" nil "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(846 "\"Ab\" =~ /a(?-i)b/i" "a(?-i)b" t nil nil nil "Ab" nil "Ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(847 "\"aB\" =~ /a(?-i)b/i" "a(?-i)b" t nil nil nil "aB" nil nil nil) -(848 "\"AB\" =~ /a(?-i)b/i" "a(?-i)b" t nil nil nil "AB" nil nil nil) -(849 "\"a bcd e\" =~ /(a (?x)b c)d e/" "(a (?x)b c)d e" nil nil nil nil "a bcd e" nil "a bcd e" ("a bc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(850 "\"a b cd e\" =~ /(a (?x)b c)d e/" "(a (?x)b c)d e" nil nil nil nil "a b cd e" nil nil nil) -(851 "\"abcd e\" =~ /(a (?x)b c)d e/" "(a (?x)b c)d e" nil nil nil nil "abcd e" nil nil nil) -(852 "\"a bcde\" =~ /(a (?x)b c)d e/" "(a (?x)b c)d e" nil nil nil nil "a bcde" nil nil nil) -(853 "\"a bcde f\" =~ /(a b(?x)c d (?-x)e f)/" "(a b(?x)c d (?-x)e f)" nil nil nil nil "a bcde f" nil "a bcde f" ("a bcde f" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(854 "\"abcdef\" =~ /(a b(?x)c d (?-x)e f)/" "(a b(?x)c d (?-x)e f)" nil nil nil nil "abcdef" nil nil nil) -(855 "\"abc\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "abc" nil "abc" ("ab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(856 "\"aBc\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "aBc" nil "aBc" ("aB" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(857 "\"abC\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "abC" nil nil nil) -(858 "\"aBC\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "aBC" nil nil nil) -(859 "\"Abc\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "Abc" nil nil nil) -(860 "\"ABc\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "ABc" nil nil nil) -(861 "\"ABC\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "ABC" nil nil nil) -(862 "\"AbC\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "AbC" nil nil nil) -(863 "\"abc\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(864 "\"aBc\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "aBc" nil "aBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(865 "\"ABC\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "ABC" nil nil nil) -(866 "\"abC\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "abC" nil nil nil) -(867 "\"aBC\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "aBC" nil nil nil) -(868 "\"aBc\" =~ /a(?i:b)*c/" "a(?i:b)*c" nil nil nil nil "aBc" nil "aBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(869 "\"aBBc\" =~ /a(?i:b)*c/" "a(?i:b)*c" nil nil nil nil "aBBc" nil "aBBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(870 "\"aBC\" =~ /a(?i:b)*c/" "a(?i:b)*c" nil nil nil nil "aBC" nil nil nil) -(871 "\"aBBC\" =~ /a(?i:b)*c/" "a(?i:b)*c" nil nil nil nil "aBBC" nil nil nil) -(872 "\"abcd\" =~ /a(?=b(?i)c)\\w\\wd/" "a(?=b(?i)c)\\w\\wd" nil nil nil nil "abcd" nil "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(873 "\"abCd\" =~ /a(?=b(?i)c)\\w\\wd/" "a(?=b(?i)c)\\w\\wd" nil nil nil nil "abCd" nil "abCd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(874 "\"aBCd\" =~ /a(?=b(?i)c)\\w\\wd/" "a(?=b(?i)c)\\w\\wd" nil nil nil nil "aBCd" nil nil nil) -(875 "\"abcD\" =~ /a(?=b(?i)c)\\w\\wd/" "a(?=b(?i)c)\\w\\wd" nil nil nil nil "abcD" nil nil nil) -(876 "\"more than million\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "more than million" nil "more than million" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(877 "\"more than MILLION\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "more than MILLION" nil "more than MILLION" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(878 "\"more \\n than Million\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "more - than Million" nil "more - than Million" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(879 "\"MORE THAN MILLION\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "MORE THAN MILLION" nil nil nil) -(880 "\"more \\n than \\n million\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "more - than - million" nil nil nil) -(881 "\"more than million\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "more than million" nil "more than million" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(882 "\"more than MILLION\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "more than MILLION" nil "more than MILLION" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(883 "\"more \\n than Million\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "more - than Million" nil "more - than Million" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(884 "\"MORE THAN MILLION\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "MORE THAN MILLION" nil nil nil) -(885 "\"more \\n than \\n million\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "more - than - million" nil nil nil) -(886 "\"abc\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(887 "\"aBbc\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "aBbc" nil "aBbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(888 "\"aBBc\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "aBBc" nil "aBBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(889 "\"Abc\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "Abc" nil nil nil) -(890 "\"abAb\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "abAb" nil nil nil) -(891 "\"abbC\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "abbC" nil nil nil) -(892 "\"abc\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(893 "\"aBc\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "aBc" nil "aBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(894 "\"Ab\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "Ab" nil nil nil) -(895 "\"abC\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "abC" nil nil nil) -(896 "\"aBC\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "aBC" nil nil nil) -(897 "\"abxxc\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "abxxc" nil "xxc" ("xx" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(898 "\"aBxxc\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "aBxxc" nil "xxc" ("xx" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(899 "\"Abxxc\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "Abxxc" nil nil nil) -(900 "\"ABxxc\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "ABxxc" nil nil nil) -(901 "\"abxxC\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "abxxC" nil nil nil) -(902 "\"aA\" =~ /(?:(a)|b)(?(1)A|B)/" "(?:(a)|b)(?(1)A|B)" nil nil nil nil "aA" nil "aA" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(903 "\"bB\" =~ /(?:(a)|b)(?(1)A|B)/" "(?:(a)|b)(?(1)A|B)" nil nil nil nil "bB" nil "bB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(904 "\"aB\" =~ /(?:(a)|b)(?(1)A|B)/" "(?:(a)|b)(?(1)A|B)" nil nil nil nil "aB" nil nil nil) -(905 "\"bA\" =~ /(?:(a)|b)(?(1)A|B)/" "(?:(a)|b)(?(1)A|B)" nil nil nil nil "bA" nil nil nil) -(906 "\"aa\" =~ /^(a)?(?(1)a|b)+$/" "^(a)?(?(1)a|b)+$" nil nil nil nil "aa" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(907 "\"b\" =~ /^(a)?(?(1)a|b)+$/" "^(a)?(?(1)a|b)+$" nil nil nil nil "b" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(908 "\"bb\" =~ /^(a)?(?(1)a|b)+$/" "^(a)?(?(1)a|b)+$" nil nil nil nil "bb" nil "bb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(909 "\"ab\" =~ /^(a)?(?(1)a|b)+$/" "^(a)?(?(1)a|b)+$" nil nil nil nil "ab" nil nil nil) -(910 "\"abc:\" =~ /^(?(?=abc)\\w{3}:|\\d\\d)$/" "^(?(?=abc)\\w{3}:|\\d\\d)$" nil nil nil nil "abc:" nil "abc:" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(911 "\"12\" =~ /^(?(?=abc)\\w{3}:|\\d\\d)$/" "^(?(?=abc)\\w{3}:|\\d\\d)$" nil nil nil nil "12" nil "12" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(912 "\"123\" =~ /^(?(?=abc)\\w{3}:|\\d\\d)$/" "^(?(?=abc)\\w{3}:|\\d\\d)$" nil nil nil nil "123" nil nil nil) -(913 "\"xyz\" =~ /^(?(?=abc)\\w{3}:|\\d\\d)$/" "^(?(?=abc)\\w{3}:|\\d\\d)$" nil nil nil nil "xyz" nil nil nil) -(914 "\"abc:\" =~ /^(?(?!abc)\\d\\d|\\w{3}:)$/" "^(?(?!abc)\\d\\d|\\w{3}:)$" nil nil nil nil "abc:" nil "abc:" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(915 "\"12\" =~ /^(?(?!abc)\\d\\d|\\w{3}:)$/" "^(?(?!abc)\\d\\d|\\w{3}:)$" nil nil nil nil "12" nil "12" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(916 "\"123\" =~ /^(?(?!abc)\\d\\d|\\w{3}:)$/" "^(?(?!abc)\\d\\d|\\w{3}:)$" nil nil nil nil "123" nil nil nil) -(917 "\"xyz\" =~ /^(?(?!abc)\\d\\d|\\w{3}:)$/" "^(?(?!abc)\\d\\d|\\w{3}:)$" nil nil nil nil "xyz" nil nil nil) -(918 "\"foobar\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "foobar" nil "bar" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(919 "\"cat\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "cat" nil "cat" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(920 "\"fcat\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "fcat" nil "cat" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(921 "\"focat\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "focat" nil "cat" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(922 "\"foocat\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "foocat" nil nil nil) -(923 "\"foobar\" =~ /(?(?a*)*/" "(?>a*)*" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(955 "\"aa\" =~ /(?>a*)*/" "(?>a*)*" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(956 "\"aaaa\" =~ /(?>a*)*/" "(?>a*)*" nil nil nil nil "aaaa" nil "aaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(957 "\"abc\" =~ /(abc|)+/" "(abc|)+" nil nil nil nil "abc" nil "abc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(958 "\"abcabc\" =~ /(abc|)+/" "(abc|)+" nil nil nil nil "abcabc" nil "abcabc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(959 "\"abcabcabc\" =~ /(abc|)+/" "(abc|)+" nil nil nil nil "abcabcabc" nil "abcabcabc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(960 "\"xyz\" =~ /(abc|)+/" "(abc|)+" nil nil nil nil "xyz" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(961 "\"a\" =~ /([a]*)*/" "([a]*)*" nil nil nil nil "a" nil "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(962 "\"aaaaa\" =~ /([a]*)*/" "([a]*)*" nil nil nil nil "aaaaa" nil "aaaaa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(963 "\"a\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "a" nil "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(964 "\"b\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "b" nil "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(965 "\"ababab\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "ababab" nil "ababab" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(966 "\"aaaabcde\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "aaaabcde" nil "aaaab" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(967 "\"bbbb\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "bbbb" nil "bbbb" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(968 "\"b\" =~ /([^a]*)*/" "([^a]*)*" nil nil nil nil "b" nil "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(969 "\"bbbb\" =~ /([^a]*)*/" "([^a]*)*" nil nil nil nil "bbbb" nil "bbbb" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(970 "\"aaa\" =~ /([^a]*)*/" "([^a]*)*" nil nil nil nil "aaa" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(971 "\"cccc\" =~ /([^ab]*)*/" "([^ab]*)*" nil nil nil nil "cccc" nil "cccc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(972 "\"abab\" =~ /([^ab]*)*/" "([^ab]*)*" nil nil nil nil "abab" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(973 "\"a\" =~ /([a]*?)*/" "([a]*?)*" nil nil nil nil "a" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(974 "\"aaaa\" =~ /([a]*?)*/" "([a]*?)*" nil nil nil nil "aaaa" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(975 "\"a\" =~ /([ab]*?)*/" "([ab]*?)*" nil nil nil nil "a" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(976 "\"b\" =~ /([ab]*?)*/" "([ab]*?)*" nil nil nil nil "b" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(977 "\"abab\" =~ /([ab]*?)*/" "([ab]*?)*" nil nil nil nil "abab" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(978 "\"baba\" =~ /([ab]*?)*/" "([ab]*?)*" nil nil nil nil "baba" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(979 "\"b\" =~ /([^a]*?)*/" "([^a]*?)*" nil nil nil nil "b" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(980 "\"bbbb\" =~ /([^a]*?)*/" "([^a]*?)*" nil nil nil nil "bbbb" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(981 "\"aaa\" =~ /([^a]*?)*/" "([^a]*?)*" nil nil nil nil "aaa" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(982 "\"c\" =~ /([^ab]*?)*/" "([^ab]*?)*" nil nil nil nil "c" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(983 "\"cccc\" =~ /([^ab]*?)*/" "([^ab]*?)*" nil nil nil nil "cccc" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(984 "\"baba\" =~ /([^ab]*?)*/" "([^ab]*?)*" nil nil nil nil "baba" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(985 "\"a\" =~ /(?>a*)*/" "(?>a*)*" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(986 "\"aaabcde\" =~ /(?>a*)*/" "(?>a*)*" nil nil nil nil "aaabcde" nil "aaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(987 "\"aaaaa\" =~ /((?>a*))*/" "((?>a*))*" nil nil nil nil "aaaaa" nil "aaaaa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(988 "\"aabbaa\" =~ /((?>a*))*/" "((?>a*))*" nil nil nil nil "aabbaa" nil "aa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(989 "\"aaaaa\" =~ /((?>a*?))*/" "((?>a*?))*" nil nil nil nil "aaaaa" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(990 "\"aabbaa\" =~ /((?>a*?))*/" "((?>a*?))*" nil nil nil nil "aabbaa" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(991 "\"12-sep-98\" =~ /(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) /x" "(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) " nil nil nil t "12-sep-98" nil "12-sep-98" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(992 "\"12-09-98\" =~ /(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) /x" "(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) " nil nil nil t "12-09-98" nil "12-09-98" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(993 "\"sep-12-98\" =~ /(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) /x" "(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) " nil nil nil t "sep-12-98" nil nil nil) -(994 "\"foobarfoo\" =~ /(?<=(foo))bar\\1/" "(?<=(foo))bar\\1" nil nil nil nil "foobarfoo" nil "barfoo" ("foo" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(995 "\"foobarfootling\" =~ /(?<=(foo))bar\\1/" "(?<=(foo))bar\\1" nil nil nil nil "foobarfootling" nil "barfoo" ("foo" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(996 "\"foobar\" =~ /(?<=(foo))bar\\1/" "(?<=(foo))bar\\1" nil nil nil nil "foobar" nil nil nil) -(997 "\"barfoo\" =~ /(?<=(foo))bar\\1/" "(?<=(foo))bar\\1" nil nil nil nil "barfoo" nil nil nil) -(998 "\"saturday\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "saturday" nil "saturday" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(999 "\"sunday\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "sunday" nil "sunday" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1000 "\"Saturday\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "Saturday" nil "Saturday" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1001 "\"Sunday\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "Sunday" nil "Sunday" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1002 "\"SATURDAY\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "SATURDAY" nil "SATURDAY" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1003 "\"SUNDAY\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "SUNDAY" nil "SUNDAY" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1004 "\"SunDay\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "SunDay" nil "SunDay" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1005 "\"abcx\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "abcx" nil "abcx" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1006 "\"aBCx\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "aBCx" nil "aBCx" ("aBC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1007 "\"bbx\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "bbx" nil "bbx" ("bb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1008 "\"BBx\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "BBx" nil "BBx" ("BB" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1009 "\"abcX\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "abcX" nil nil nil) -(1010 "\"aBCX\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "aBCX" nil nil nil) -(1011 "\"bbX\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "bbX" nil nil nil) -(1012 "\"BBX\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "BBX" nil nil nil) -(1013 "\"ac\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "ac" nil "ac" ("ac" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1014 "\"aC\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "aC" nil "aC" ("aC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1015 "\"bD\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "bD" nil "bD" ("bD" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1016 "\"elephant\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "elephant" nil "e" ("e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1017 "\"Europe\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "Europe" nil "E" ("E" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1018 "\"frog\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "frog" nil "f" ("f" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1019 "\"France\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "France" nil "F" ("F" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1020 "\"Africa\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "Africa" nil nil nil) -(1021 "\"ab\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "ab" nil "ab" ("ab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1022 "\"aBd\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "aBd" nil "aBd" ("aBd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1023 "\"xy\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "xy" nil "xy" ("xy" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1024 "\"xY\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "xY" nil "xY" ("xY" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1025 "\"zebra\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "zebra" nil "z" ("z" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1026 "\"Zambesi\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "Zambesi" nil "Z" ("Z" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1027 "\"aCD\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "aCD" nil nil nil) -(1028 "\"XY\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "XY" nil nil nil) -(1029 "\"foo\\nbar\" =~ /(?<=foo\\n)^bar/m" "(?<=foo\\n)^bar" nil t nil nil "foo -bar" nil "bar" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1030 "\"bar\" =~ /(?<=foo\\n)^bar/m" "(?<=foo\\n)^bar" nil t nil nil "bar" nil nil nil) -(1031 "\"baz\\nbar\" =~ /(?<=foo\\n)^bar/m" "(?<=foo\\n)^bar" nil t nil nil "baz -bar" nil nil nil) -(1032 "\"barbaz\" =~ /(?<=(?]&/" "^[<>]&" nil nil nil nil "<&OUT" nil "<&" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1369 "\"aaaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaaa" nil "aaaaaaaaaa" ("aaaa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1370 "\"AB\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "AB" nil nil nil) -(1371 "\"aaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaa" nil nil nil) -(1372 "\"aaaaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaaaa" nil nil nil) -(1373 "\"aaaaaaaaaa\" =~ /^(a(?(1)\\1)){4}$/" "^(a(?(1)\\1)){4}$" nil nil nil nil "aaaaaaaaaa" nil "aaaaaaaaaa" ("aaaa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1374 "\"aaaaaaaaa\" =~ /^(a(?(1)\\1)){4}$/" "^(a(?(1)\\1)){4}$" nil nil nil nil "aaaaaaaaa" nil nil nil) -(1375 "\"aaaaaaaaaaa\" =~ /^(a(?(1)\\1)){4}$/" "^(a(?(1)\\1)){4}$" nil nil nil nil "aaaaaaaaaaa" nil nil nil) -(1376 "\"foobar\" =~ /(?:(f)(o)(o)|(b)(a)(r))*/" "(?:(f)(o)(o)|(b)(a)(r))*" nil nil nil nil "foobar" nil "foobar" ("f" "o" "o" "b" "a" "r" nil nil nil nil nil nil nil nil nil nil)) -(1377 "\"ab\" =~ /(?<=a)b/" "(?<=a)b" nil nil nil nil "ab" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1378 "\"cb\" =~ /(?<=a)b/" "(?<=a)b" nil nil nil nil "cb" nil nil nil) -(1379 "\"b\" =~ /(?<=a)b/" "(?<=a)b" nil nil nil nil "b" nil nil nil) -(1380 "\"ab\" =~ /(?a+)b/" "(?>a+)b" nil nil nil nil "aaab" nil "aaab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1491 "\"a:[b]:\" =~ /([[:]+)/" "([[:]+)" nil nil nil nil "a:[b]:" nil ":[" (":[" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1492 "\"a=[b]=\" =~ /([[=]+)/" "([[=]+)" nil nil nil nil "a=[b]=" nil "=[" ("=[" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1493 "\"a.[b].\" =~ /([[.]+)/" "([[.]+)" nil nil nil nil "a.[b]." nil ".[" (".[" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1494 "\"aaab\" =~ /((?>a+)b)/" "((?>a+)b)" nil nil nil nil "aaab" nil "aaab" ("aaab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1495 "\"aaab\" =~ /(?>(a+))b/" "(?>(a+))b" nil nil nil nil "aaab" nil "aaab" ("aaa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1496 "\"((abc(ade)ufh()()x\" =~ /((?>[^()]+)|\\([^()]*\\))+/" "((?>[^()]+)|\\([^()]*\\))+" nil nil nil nil "((abc(ade)ufh()()x" nil "abc(ade)ufh()()x" ("x" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1497 "\"aaab\" =~ /a\\Z/" "a\\Z" nil nil nil nil "aaab" nil nil nil) -(1498 "\"a\\nb\\n\" =~ /a\\Z/" "a\\Z" nil nil nil nil "a -b -" nil nil nil) -(1499 "\"a\\nb\\n\" =~ /b\\Z/" "b\\Z" nil nil nil nil "a -b -" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1500 "\"a\\nb\" =~ /b\\Z/" "b\\Z" nil nil nil nil "a -b" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1501 "\"a\\nb\" =~ /b\\z/" "b\\z" nil nil nil nil "a -b" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1502 "\"a\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a" nil "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1503 "\"abc\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "abc" nil "abc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1504 "\"a-b\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a-b" nil "a-b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1505 "\"0-9\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "0-9" nil "0-9" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1506 "\"a.b\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a.b" nil "a.b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1507 "\"5.6.7\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "5.6.7" nil "5.6.7" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1508 "\"the.quick.brown.fox\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox" nil "the.quick.brown.fox" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1509 "\"a100.b200.300c\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a100.b200.300c" nil "a100.b200.300c" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1510 "\"12-ab.1245\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "12-ab.1245" nil "12-ab.1245" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1511 "\"\\\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "" nil nil nil) -(1512 "\".a\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil ".a" nil nil nil) -(1513 "\"-a\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "-a" nil nil nil) -(1514 "\"a-\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a-" nil nil nil) -(1515 "\"a.\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a." nil nil nil) -(1516 "\"a_b\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a_b" nil nil nil) -(1517 "\"a.-\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a.-" nil nil nil) -(1518 "\"a..\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a.." nil nil nil) -(1519 "\"ab..bc\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "ab..bc" nil nil nil) -(1520 "\"the.quick.brown.fox-\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox-" nil nil nil) -(1521 "\"the.quick.brown.fox.\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox." nil nil nil) -(1522 "\"the.quick.brown.fox_\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox_" nil nil nil) -(1523 "\"the.quick.brown.fox+\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox+" nil nil nil) -(1524 "\"alphabetabcd\" =~ /(?>.*)(?<=(abcd|wxyz))/" "(?>.*)(?<=(abcd|wxyz))" nil nil nil nil "alphabetabcd" nil "alphabetabcd" ("abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1525 "\"endingwxyz\" =~ /(?>.*)(?<=(abcd|wxyz))/" "(?>.*)(?<=(abcd|wxyz))" nil nil nil nil "endingwxyz" nil "endingwxyz" ("wxyz" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1526 "\"a rather long string that doesn't end with one of them\" =~ /(?>.*)(?<=(abcd|wxyz))/" "(?>.*)(?<=(abcd|wxyz))" nil nil nil nil "a rather long string that doesn't end with one of them" nil nil nil) -(1527 "\"word cat dog elephant mussel cow horse canary baboon snake shark otherword\" =~ /word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/" "word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark otherword" nil "word cat dog elephant mussel cow horse canary baboon snake shark otherword" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1528 "\"word cat dog elephant mussel cow horse canary baboon snake shark\" =~ /word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/" "word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark" nil nil nil) -(1529 "\"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope\" =~ /word (?>[a-zA-Z0-9]+ ){0,30}otherword/" "word (?>[a-zA-Z0-9]+ ){0,30}otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope" nil nil nil) -(1530 "\"999foo\" =~ /(?<=\\d{3}(?!999))foo/" "(?<=\\d{3}(?!999))foo" nil nil nil nil "999foo" nil "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1531 "\"123999foo\" =~ /(?<=\\d{3}(?!999))foo/" "(?<=\\d{3}(?!999))foo" nil nil nil nil "123999foo" nil "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1532 "\"123abcfoo\" =~ /(?<=\\d{3}(?!999))foo/" "(?<=\\d{3}(?!999))foo" nil nil nil nil "123abcfoo" nil nil nil) -(1533 "\"999foo\" =~ /(?<=(?!...999)\\d{3})foo/" "(?<=(?!...999)\\d{3})foo" nil nil nil nil "999foo" nil "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1534 "\"123999foo\" =~ /(?<=(?!...999)\\d{3})foo/" "(?<=(?!...999)\\d{3})foo" nil nil nil nil "123999foo" nil "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1535 "\"123abcfoo\" =~ /(?<=(?!...999)\\d{3})foo/" "(?<=(?!...999)\\d{3})foo" nil nil nil nil "123abcfoo" nil nil nil) -(1536 "\"123abcfoo\" =~ /(?<=\\d{3}(?!999)...)foo/" "(?<=\\d{3}(?!999)...)foo" nil nil nil nil "123abcfoo" nil "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1537 "\"123456foo\" =~ /(?<=\\d{3}(?!999)...)foo/" "(?<=\\d{3}(?!999)...)foo" nil nil nil nil "123456foo" nil "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1538 "\"123999foo\" =~ /(?<=\\d{3}(?!999)...)foo/" "(?<=\\d{3}(?!999)...)foo" nil nil nil nil "123999foo" nil nil nil) -(1539 "\"123abcfoo\" =~ /(?<=\\d{3}...)(?\\s*)=(?>\\s*) # find
\\s*)=(?>\\s*) # find \\s*)=(?>\\s*) # find \\s*)=(?>\\s*) # find \\s*)=(?>\\s*) # find \\s*)=(?>\\s*) # find Z)+|A)*/" "((?>Z)+|A)*" nil nil nil nil "ZABCDEFG" nil "ZA" ("A" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1555 "\"ZABCDEFG\" =~ /((?>)+|A)*/" "((?>)+|A)*" nil nil nil nil "ZABCDEFG" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1556 "\"abbab\" =~ /a*/" "a*" nil nil nil nil "abbab" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1557 "\"abcde\" =~ /^[a-\\d]/" "^[a-\\d]" nil nil nil nil "abcde" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1558 "\"-things\" =~ /^[a-\\d]/" "^[a-\\d]" nil nil nil nil "-things" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1559 "\"0digit\" =~ /^[a-\\d]/" "^[a-\\d]" nil nil nil nil "0digit" nil "0" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1560 "\"bcdef\" =~ /^[a-\\d]/" "^[a-\\d]" nil nil nil nil "bcdef" nil nil nil) -(1561 "\"abcde\" =~ /^[\\d-a]/" "^[\\d-a]" nil nil nil nil "abcde" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1562 "\"-things\" =~ /^[\\d-a]/" "^[\\d-a]" nil nil nil nil "-things" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1563 "\"0digit\" =~ /^[\\d-a]/" "^[\\d-a]" nil nil nil nil "0digit" nil "0" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1564 "\"bcdef\" =~ /^[\\d-a]/" "^[\\d-a]" nil nil nil nil "bcdef" nil nil nil) -(1565 "\"abcdef\" =~ /(?<=abc).*(?=def)/" "(?<=abc).*(?=def)" nil nil nil nil "abcdef" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1566 "\"abcxdef\" =~ /(?<=abc).*(?=def)/" "(?<=abc).*(?=def)" nil nil nil nil "abcxdef" nil "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1567 "\"abcxdefxdef\" =~ /(?<=abc).*(?=def)/" "(?<=abc).*(?=def)" nil nil nil nil "abcxdefxdef" nil "xdefx" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1568 "\"abcdef\" =~ /(?<=abc).*?(?=def)/" "(?<=abc).*?(?=def)" nil nil nil nil "abcdef" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1569 "\"abcxdef\" =~ /(?<=abc).*?(?=def)/" "(?<=abc).*?(?=def)" nil nil nil nil "abcxdef" nil "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1570 "\"abcxdefxdef\" =~ /(?<=abc).*?(?=def)/" "(?<=abc).*?(?=def)" nil nil nil nil "abcxdefxdef" nil "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1571 "\"abcdef\" =~ /(?<=abc).+(?=def)/" "(?<=abc).+(?=def)" nil nil nil nil "abcdef" nil nil nil) -(1572 "\"abcxdef\" =~ /(?<=abc).+(?=def)/" "(?<=abc).+(?=def)" nil nil nil nil "abcxdef" nil "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1573 "\"abcxdefxdef\" =~ /(?<=abc).+(?=def)/" "(?<=abc).+(?=def)" nil nil nil nil "abcxdefxdef" nil "xdefx" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1574 "\"abcdef\" =~ /(?<=abc).+?(?=def)/" "(?<=abc).+?(?=def)" nil nil nil nil "abcdef" nil nil nil) -(1575 "\"abcxdef\" =~ /(?<=abc).+?(?=def)/" "(?<=abc).+?(?=def)" nil nil nil nil "abcxdef" nil "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1576 "\"abcxdefxdef\" =~ /(?<=abc).+?(?=def)/" "(?<=abc).+?(?=def)" nil nil nil nil "abcxdefxdef" nil "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1577 "\"-abcdef\" =~ /(?<=\\b)(.*)/" "(?<=\\b)(.*)" nil nil nil nil "-abcdef" nil "abcdef" ("abcdef" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1578 "\"abcdef\" =~ /(?<=\\b)(.*)/" "(?<=\\b)(.*)" nil nil nil nil "abcdef" nil "abcdef" ("abcdef" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1579 "\"-abcdef\" =~ /(?<=\\B)(.*)/" "(?<=\\B)(.*)" nil nil nil nil "-abcdef" nil "-abcdef" ("-abcdef" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1580 "\"abcdef\" =~ /(?<=\\B)(.*)/" "(?<=\\B)(.*)" nil nil nil nil "abcdef" nil "bcdef" ("bcdef" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1581 "\"'a'\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "'a'" nil "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1582 "\"'b'\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "'b'" nil "'b'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1583 "\"x'a'\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "x'a'" nil nil nil) -(1584 "\"'a'x\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "'a'x" nil "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1585 "\"'ab'\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "'ab'" nil nil nil) -(1586 "\"'a'\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "'a'" nil "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1587 "\"'b'\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "'b'" nil "'b'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1588 "\"x'a'\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "x'a'" nil nil nil) -(1589 "\"'a'x\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "'a'x" nil nil nil) -(1590 "\"'ab'\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "'ab'" nil nil nil) -(1591 "\"'a'\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "'a'" nil "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1592 "\"'b'\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "'b'" nil "'b'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1593 "\"x'a'\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "x'a'" nil "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1594 "\"'a'x\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "'a'x" nil nil nil) -(1595 "\"'ab'\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "'ab'" nil nil nil) -(1596 "\"'a'\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "'a'" nil "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1597 "\"'b'\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "'b'" nil "'b'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1598 "\"x'a'\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "x'a'" nil "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1599 "\"'a'x\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "'a'x" nil "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1600 "\"'ab'\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "'ab'" nil nil nil) -(1601 "\"abc\" =~ /abc\\E/" "abc\\E" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1602 "\"abcE\" =~ /abc\\E/" "abc\\E" nil nil nil nil "abcE" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1603 "\"abcx\" =~ /abc[\\Ex]/" "abc[\\Ex]" nil nil nil nil "abcx" nil "abcx" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1604 "\"abcE\" =~ /abc[\\Ex]/" "abc[\\Ex]" nil nil nil nil "abcE" nil nil nil) -(1605 "\"a*\" =~ /^\\Qa*\\E$/" "^\\Qa*\\E$" nil nil nil nil "a*" nil "a*" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1606 "\"a\" =~ /^\\Qa*\\E$/" "^\\Qa*\\E$" nil nil nil nil "a" nil nil nil) -(1607 "\"a*x\" =~ /\\Qa*x\\E/" "\\Qa*x\\E" nil nil nil nil "a*x" nil "a*x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1608 "\"a*\" =~ /\\Qa*x\\E/" "\\Qa*x\\E" nil nil nil nil "a*" nil nil nil) -(1609 "\"a*x\" =~ /\\Qa*x/" "\\Qa*x" nil nil nil nil "a*x" nil "a*x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1610 "\"a*\" =~ /\\Qa*x/" "\\Qa*x" nil nil nil nil "a*" nil nil nil) -(1611 "\"a*x\" =~ /\\Q\\Qa*x\\E\\E/" "\\Q\\Qa*x\\E\\E" nil nil nil nil "a*x" nil nil nil) -(1612 "\"a\\\\*x\" =~ /\\Q\\Qa*x\\E\\E/" "\\Q\\Qa*x\\E\\E" nil nil nil nil "a\\*x" nil "a\\*x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1613 "\"a*x\" =~ /\\Q\\Qa*x\\E/" "\\Q\\Qa*x\\E" nil nil nil nil "a*x" nil nil nil) -(1614 "\"a\\\\*x\" =~ /\\Q\\Qa*x\\E/" "\\Q\\Qa*x\\E" nil nil nil nil "a\\*x" nil "a\\*x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1615 "\"a[x]\" =~ /a\\Q[x\\E]/" "a\\Q[x\\E]" nil nil nil nil "a[x]" nil "a[x]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1616 "\"ax\" =~ /a\\Q[x\\E]/" "a\\Q[x\\E]" nil nil nil nil "ax" nil nil nil) -(1617 "\"a\" =~ /a#comment\\Q... -{2}/x" "a#comment\\Q... -{2}" nil nil nil t "a" nil nil nil) -(1618 "\"aa\" =~ /a#comment\\Q... -{2}/x" "a#comment\\Q... -{2}" nil nil nil t "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1619 "\"a\" =~ /a(?#comment\\Q... -){2}/x" "a(?#comment\\Q... -){2}" nil nil nil t "a" nil nil nil) -(1620 "\"aa\" =~ /a(?#comment\\Q... -){2}/x" "a(?#comment\\Q... -){2}" nil nil nil t "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1621 "\"a.\" =~ /(?x)a#\\Q -./" "(?x)a#\\Q -." nil nil nil nil "a." nil "a." (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1622 "\"aa\" =~ /(?x)a#\\Q -./" "(?x)a#\\Q -." nil nil nil nil "aa" nil nil nil) -(1623 "\"abcdxklqj\" =~ /ab(?=.*q)cd/" "ab(?=.*q)cd" nil nil nil nil "abcdxklqj" nil "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1624 "\"ab\" =~ /a(?!.*$)b/" "a(?!.*$)b" nil nil nil nil "ab" nil nil nil) -(1625 "\"Axi\" =~ /.{2}[a-z]/" ".{2}[a-z]" nil nil nil nil "Axi" nil "Axi" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1626 "\"aaaaaaaaaac\" =~ /((a{0,5}){0,5}){0,5}c/" "((a{0,5}){0,5}){0,5}c" nil nil nil nil "aaaaaaaaaac" nil "aaaaaaaaaac" ("" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1627 "\"aaaaaaaaaa\" =~ /((a{0,5}){0,5}){0,5}c/" "((a{0,5}){0,5}){0,5}c" nil nil nil nil "aaaaaaaaaa" nil nil nil) -(1628 "\"aaaaaaaaaac\" =~ /((a{0,5}){0,5})*c/" "((a{0,5}){0,5})*c" nil nil nil nil "aaaaaaaaaac" nil "aaaaaaaaaac" ("" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1629 "\"aaaaaaaaaa\" =~ /((a{0,5}){0,5})*c/" "((a{0,5}){0,5})*c" nil nil nil nil "aaaaaaaaaa" nil nil nil) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/perltestinput b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/perltestinput deleted file mode 100644 index 1425493..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/perltestinput +++ /dev/null @@ -1,3956 +0,0 @@ -/the quick brown fox/ - the quick brown fox - The quick brown FOX - What do you know about the quick brown fox? - What do you know about THE QUICK BROWN FOX? - -/The quick brown fox/i - the quick brown fox - The quick brown FOX - What do you know about the quick brown fox? - What do you know about THE QUICK BROWN FOX? - -/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/ - abcd\t\n\r\f\a\e9;\$\\?caxyz - -/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/ - abxyzpqrrrabbxyyyypqAzz - abxyzpqrrrabbxyyyypqAzz - aabxyzpqrrrabbxyyyypqAzz - aaabxyzpqrrrabbxyyyypqAzz - aaaabxyzpqrrrabbxyyyypqAzz - abcxyzpqrrrabbxyyyypqAzz - aabcxyzpqrrrabbxyyyypqAzz - aaabcxyzpqrrrabbxyyyypAzz - aaabcxyzpqrrrabbxyyyypqAzz - aaabcxyzpqrrrabbxyyyypqqAzz - aaabcxyzpqrrrabbxyyyypqqqAzz - aaabcxyzpqrrrabbxyyyypqqqqAzz - aaabcxyzpqrrrabbxyyyypqqqqqAzz - aaabcxyzpqrrrabbxyyyypqqqqqqAzz - aaaabcxyzpqrrrabbxyyyypqAzz - abxyzzpqrrrabbxyyyypqAzz - aabxyzzzpqrrrabbxyyyypqAzz - aaabxyzzzzpqrrrabbxyyyypqAzz - aaaabxyzzzzpqrrrabbxyyyypqAzz - abcxyzzpqrrrabbxyyyypqAzz - aabcxyzzzpqrrrabbxyyyypqAzz - aaabcxyzzzzpqrrrabbxyyyypqAzz - aaaabcxyzzzzpqrrrabbxyyyypqAzz - aaaabcxyzzzzpqrrrabbbxyyyypqAzz - aaaabcxyzzzzpqrrrabbbxyyyyypqAzz - aaabcxyzpqrrrabbxyyyypABzz - aaabcxyzpqrrrabbxyyyypABBzz - >>>aaabxyzpqrrrabbxyyyypqAzz - >aaaabxyzpqrrrabbxyyyypqAzz - >>>>abcxyzpqrrrabbxyyyypqAzz - abxyzpqrrabbxyyyypqAzz - abxyzpqrrrrabbxyyyypqAzz - abxyzpqrrrabxyyyypqAzz - aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz - aaaabcxyzzzzpqrrrabbbxyyypqAzz - aaabcxyzpqrrrabbxyyyypqqqqqqqAzz - -/^(abc){1,2}zz/ - abczz - abcabczz - zz - abcabcabczz - >>abczz - -/^(b+?|a){1,2}?c/ - bc - bbc - bbbc - bac - bbac - aac - abbbbbbbbbbbc - bbbbbbbbbbbac - aaac - abbbbbbbbbbbac - -/^(b+|a){1,2}c/ - bc - bbc - bbbc - bac - bbac - aac - abbbbbbbbbbbc - bbbbbbbbbbbac - aaac - abbbbbbbbbbbac - -/^(b+|a){1,2}?bc/ - bbc - -/^(b*|ba){1,2}?bc/ - babc - bbabc - bababc - bababbc - babababc - -/^(ba|b*){1,2}?bc/ - babc - bbabc - bababc - bababbc - babababc - -/^\ca\cA\c[\c{\c:/ - \x01\x01\e;z - -/^[ab\]cde]/ - athing - bthing - ]thing - cthing - dthing - ething - fthing - [thing - \\thing - -/^[]cde]/ - ]thing - cthing - dthing - ething - athing - fthing - -/^[^ab\]cde]/ - fthing - [thing - \\thing - athing - bthing - ]thing - cthing - dthing - ething - -/^[^]cde]/ - athing - fthing - ]thing - cthing - dthing - ething - -/^\/ - - -/^ÿ/ - ÿ - -/^[0-9]+$/ - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 100 - abc - -/^.*nter/ - enter - inter - uponter - -/^xxx[0-9]+$/ - xxx0 - xxx1234 - xxx - -/^.+[0-9][0-9][0-9]$/ - x123 - xx123 - 123456 - 123 - x1234 - -/^.+?[0-9][0-9][0-9]$/ - x123 - xx123 - 123456 - 123 - x1234 - -/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/ - abc!pqr=apquxz.ixr.zzz.ac.uk - !pqr=apquxz.ixr.zzz.ac.uk - abc!=apquxz.ixr.zzz.ac.uk - abc!pqr=apquxz:ixr.zzz.ac.uk - abc!pqr=apquxz.ixr.zzz.ac.ukk - -/:/ - Well, we need a colon: somewhere - Fail if we don't - -/([\da-f:]+)$/i - 0abc - abc - fed - E - :: - 5f03:12C0::932e - fed def - Any old stuff - 0zzz - gzzz - fed\x20 - Any old rubbish - -/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ - .1.2.3 - A.12.123.0 - .1.2.3333 - 1.2.3 - 1234.2.3 - -/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ - 1 IN SOA non-sp1 non-sp2( - 1 IN SOA non-sp1 non-sp2 ( - 1IN SOA non-sp1 non-sp2( - -/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/ - a. - Z. - 2. - ab-c.pq-r. - sxk.zzz.ac.uk. - x-.y-. - -abc.peq. - -/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/ - *.a - *.b0-a - *.c3-b.c - *.c-a.b-c - *.0 - *.a- - *.a-b.c- - *.c-a.0-c - -/^(?=ab(de))(abd)(e)/ - abde - -/^(?!(ab)de|x)(abd)(f)/ - abdf - -/^(?=(ab(cd)))(ab)/ - abcd - -/^[\da-f](\.[\da-f])*$/i - a.b.c.d - A.B.C.D - a.b.c.1.2.3.C - -/^\".*\"\s*(;.*)?$/ - \"1234\" - \"abcd\" ; - \"\" ; rhubarb - \"1234\" : things - -/^$/ - \ - -/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x - ab c - abc - ab cde - -/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/ - ab c - abc - ab cde - -/^ a\ b[c ]d $/x - a bcd - a b d - abcd - ab d - -/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/ - abcdefhijklm - -/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/ - abcdefhijklm - -/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/ - a+ Z0+\x08\n\x1d\x12 - -/^[.^$|()*+?{,}]+/ - .^\$(*+)|{?,?} - -/^a*\w/ - z - az - aaaz - a - aa - aaaa - a+ - aa+ - -/^a*?\w/ - z - az - aaaz - a - aa - aaaa - a+ - aa+ - -/^a+\w/ - az - aaaz - aa - aaaa - aa+ - -/^a+?\w/ - az - aaaz - aa - aaaa - aa+ - -/^\d{8}\w{2,}/ - 1234567890 - 12345678ab - 12345678__ - 1234567 - -/^[aeiou\d]{4,5}$/ - uoie - 1234 - 12345 - aaaaa - 123456 - -/^[aeiou\d]{4,5}?/ - uoie - 1234 - 12345 - aaaaa - 123456 - -/\A(abc|def)=(\1){2,3}\Z/ - abc=abcabc - def=defdefdef - abc=defdef - -/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/ - abcdefghijkcda2 - abcdefghijkkkkcda2 - -/(cat(a(ract|tonic)|erpillar)) \1()2(3)/ - cataract cataract23 - catatonic catatonic23 - caterpillar caterpillar23 - - -/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/ - From abcd Mon Sep 01 12:33:02 1997 - -/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/ - From abcd Mon Sep 01 12:33:02 1997 - From abcd Mon Sep 1 12:33:02 1997 - From abcd Sep 01 12:33:02 1997 - -/^12.34/s - 12\n34 - 12\r34 - -/\w+(?=\t)/ - the quick brown\t fox - -/foo(?!bar)(.*)/ - foobar is foolish see? - -/(?:(?!foo)...|^.{0,2})bar(.*)/ - foobar crowbar etc - barrel - 2barrel - A barrel - -/^(\D*)(?=\d)(?!123)/ - abc456 - abc123 - -/^1234(?# test newlines - inside)/ - 1234 - -/^1234 #comment in extended re - /x - 1234 - -/#rhubarb - abcd/x - abcd - -/^abcd#rhubarb/x - abcd - -/^(a)\1{2,3}(.)/ - aaab - aaaab - aaaaab - aaaaaab - -/(?!^)abc/ - the abc - abc - -/(?=^)abc/ - abc - the abc - -/^[ab]{1,3}(ab*|b)/ - aabbbbb - -/^[ab]{1,3}?(ab*|b)/ - aabbbbb - -/^[ab]{1,3}?(ab*?|b)/ - aabbbbb - -/^[ab]{1,3}(ab*?|b)/ - aabbbbb - -/ (?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* # optional leading comment -(?: (?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| -" (?: # opening quote... -[^\\\x80-\xff\n\015"] # Anything except backslash and quote -| # or -\\ [^\x80-\xff] # Escaped something (something != CR) -)* " # closing quote -) # initial word -(?: (?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* \. (?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* (?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| -" (?: # opening quote... -[^\\\x80-\xff\n\015"] # Anything except backslash and quote -| # or -\\ [^\x80-\xff] # Escaped something (something != CR) -)* " # closing quote -) )* # further okay, if led by a period -(?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* @ (?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* (?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| \[ # [ -(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff -\] # ] -) # initial subdomain -(?: # -(?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* \. # if led by a period... -(?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* (?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| \[ # [ -(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff -\] # ] -) # ...further okay -)* -# address -| # or -(?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| -" (?: # opening quote... -[^\\\x80-\xff\n\015"] # Anything except backslash and quote -| # or -\\ [^\x80-\xff] # Escaped something (something != CR) -)* " # closing quote -) # one word, optionally followed by.... -(?: -[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... -\( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) | # comments, or... - -" (?: # opening quote... -[^\\\x80-\xff\n\015"] # Anything except backslash and quote -| # or -\\ [^\x80-\xff] # Escaped something (something != CR) -)* " # closing quote -# quoted strings -)* -< (?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* # leading < -(?: @ (?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* (?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| \[ # [ -(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff -\] # ] -) # initial subdomain -(?: # -(?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* \. # if led by a period... -(?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* (?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| \[ # [ -(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff -\] # ] -) # ...further okay -)* - -(?: (?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* , (?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* @ (?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* (?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| \[ # [ -(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff -\] # ] -) # initial subdomain -(?: # -(?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* \. # if led by a period... -(?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* (?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| \[ # [ -(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff -\] # ] -) # ...further okay -)* -)* # further okay, if led by comma -: # closing colon -(?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* )? # optional route -(?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| -" (?: # opening quote... -[^\\\x80-\xff\n\015"] # Anything except backslash and quote -| # or -\\ [^\x80-\xff] # Escaped something (something != CR) -)* " # closing quote -) # initial word -(?: (?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* \. (?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* (?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| -" (?: # opening quote... -[^\\\x80-\xff\n\015"] # Anything except backslash and quote -| # or -\\ [^\x80-\xff] # Escaped something (something != CR) -)* " # closing quote -) )* # further okay, if led by a period -(?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* @ (?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* (?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| \[ # [ -(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff -\] # ] -) # initial subdomain -(?: # -(?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* \. # if led by a period... -(?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* (?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| \[ # [ -(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff -\] # ] -) # ...further okay -)* -# address spec -(?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* > # trailing > -# name and address -) (?: [\040\t] | \( -(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* -\) )* # optional trailing comment -/x - Alan Other - - user\@dom.ain - \"A. Other\" (a comment) - A. Other (a comment) - \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay - A missing angle @,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -" # " -[^\\\x80-\xff\n\015"] * # normal -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* -" # " -# Quoted string -) -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -(?: -\. -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -(?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -" # " -[^\\\x80-\xff\n\015"] * # normal -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* -" # " -# Quoted string -) -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -(?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| -\[ # [ -(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff -\] # ] -) -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\. -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -(?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| -\[ # [ -(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff -\] # ] -) -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address -| # or -(?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -" # " -[^\\\x80-\xff\n\015"] * # normal -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* -" # " -# Quoted string -) -# leading word -[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces -(?: -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -| -" # " -[^\\\x80-\xff\n\015"] * # normal -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* -" # " -) # "special" comment or quoted string -[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal" -)* -< -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -# < -(?: -@ -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -(?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| -\[ # [ -(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff -\] # ] -) -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\. -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -(?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| -\[ # [ -(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff -\] # ] -) -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -(?: , -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -@ -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -(?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| -\[ # [ -(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff -\] # ] -) -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\. -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -(?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| -\[ # [ -(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff -\] # ] -) -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -)* # additional domains -: -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)? # optional route -(?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -" # " -[^\\\x80-\xff\n\015"] * # normal -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* -" # " -# Quoted string -) -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -(?: -\. -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -(?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -# Atom -| # or -" # " -[^\\\x80-\xff\n\015"] * # normal -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* -" # " -# Quoted string -) -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -# additional words -)* -@ -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -(?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| -\[ # [ -(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff -\] # ] -) -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -# optional trailing comments -(?: -\. -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -(?: -[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... -(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom -| -\[ # [ -(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff -\] # ] -) -[\040\t]* # Nab whitespace. -(?: -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: # ( -(?: \\ [^\x80-\xff] | -\( # ( -[^\\\x80-\xff\n\015()] * # normal* -(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* -\) # ) -) # special -[^\\\x80-\xff\n\015()] * # normal* -)* # )* -\) # ) -[\040\t]* )* # If comment found, allow more spaces. -# optional trailing comments -)* -# address spec -> # > -# name and address -) -/x - Alan Other - - user\@dom.ain - \"A. Other\" (a comment) - A. Other (a comment) - \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay - A missing angle ]{0,})>]{0,})>([\d]{0,}\.)(.*)((
([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is - 43.
Word Processor
(N-1286)
Lega lstaff.comCA - Statewide - -/a[^a]b/ - acb - a\nb - -/a.b/ - acb - a\nb - -/a[^a]b/s - acb - a\nb - -/a.b/s - acb - a\nb - -/^(b+?|a){1,2}?c/ - bac - bbac - bbbac - bbbbac - bbbbbac - -/^(b+|a){1,2}?c/ - bac - bbac - bbbac - bbbbac - bbbbbac - -/(?!\A)x/m - x\nb\n - a\bx\n - -/\x0{ab}/ - \0{ab} - -/(A|B)*?CD/ - CD - -/(A|B)*CD/ - CD - -/(AB)*?\1/ - ABABAB - -/(AB)*\1/ - ABABAB - -/(/ - doesn't matter - -/(x)\2/ - doesn't matter - -/((a{0,5}){0,5}){0,5}[c]/ - aaaaaaaaaac - aaaaaaaaaa - -/((a{0,5}){0,5})*[c]/ - aaaaaaaaaac - aaaaaaaaaa - -/(\b)*a/ - a - -/(a)*b/ - ab - -/(a|)*b/ - ab - b - x - -/^(?:(a)|(b))*\1\2$/ - abab - -/abc[^x]def/ - abcxabcydef - -/^(a|\1x)*$/ - aax - aaxa - -// - @{['']} - -/^(?:(a)|(b))*$/ - ab - -/[\0]/ - a - \0 - -/[\1]/ - a - \1 - -/\10()()()()()()()()()/ - doesn't matter - -/\10()()()()()()()()()()/ - a - -/a(?<)b/ - ab - -/[]/ - doesn't matter - -/[\]/ - doesn't matter - -/()/ - a - -/[\x]/ - x - \0 - -/((a)*)*/ - a - -/()a\1/ - a - -/a\1()/ - a - -/a(?i)a(?-i)a/ - aaa - aAa - aAA - -/a(?i)a(?-i)a(?i)a(?-i)a/ - aaaaa - aAaAa - AaAaA - aAAAa - AaaaA - AAAAA - aaAAA - AAaaa - -/\x/ - a - X - \0 - -/[a-c-e]/ - a - b - d - - - -/[b-\d]/ - b - c - d - - - 1 - -/[\d-f]/ - d - e - f - - - 1 - -/[/ - doesn't matter - -/]/ - ] - a - -/[]/ - doesn't matter - -/[-a-c]/ - - - a - b - d - -/[a-c-]/ - - - a - b - d - -/[-]/ - a - - - -/[--]/ - a - - - -/[---]/ - a - - - -/[--b]/ - - - a - c - -/[b--]/ - doesn't matter - -/a{/ - a{ - -/a{}/ - a{} - -/a{3/ - a{3 - -/a{3,/ - a{3, - -/a{3, 3}/ - a{3,3} - a{3, 3} - aaa - -/a{3, 3}/x - a{3,3} - a{3, 3} - aaa - -/a{3, }/ - a{3,} - a{3, } - aaa - -/a{3, }/x - a{3,} - a{3, } - aaa - -/\x x/ - \0 x - \0x - -/\x x/x - \0 x - \0x - -/\x 3/ - \0003 - \000 3 - x3 - x 3 - -/\x 3/x - \0003 - \000 3 - x3 - x 3 - -/^a{ 1}$/ - a - a{ 1} - a{1} - -/^a{ 1}$/x - a - a{ 1} - a{1} - -/{}/ - {} - a - -/{1}/ - doesn't matter - -/*/ - doesn't matter - -/|/ - x - -/\0000/ - \0000 - -/a(?<)b/ - ab - -/a(?i)b/ - ab - aB - Ab - -/a(?i=a)/ - doesn't matter - -/a(?<=a){3000}a/ - aa - xa - ax - -/a(?!=a){3000}a/ - aa - ax - xa - -/a(){3000}a/ - aa - ax - xa - -/a(?:){3000}a/ - aa - ax - -/a(?<=a)*a/ - aa - ax - xa - -/a(?!=a)*a/ - aa - ax - xa - -/a()*a/ - aa - ax - xa - -/a(?:)*a/ - aa - ax - xa - -/x(?<=a)*a/ - aa - xa - ax - -/a(?<=(a))*\1/ - aa - -/a(?<=(a))*?\1/ - aa - -/(?=(a)\1)*aa/ - aa - -/^((a|b){2,5}){2}$/ - aaaaabbbbb - -/^(b*|ba){1,2}bc/ - babc - bbabc - bababc - bababbc - babababc - -/^a{4,5}(?:c|a)c$/ - aaaaac - aaaaaac - -/^(a|){4,5}(?:c|a)c$/ - aaaaac - aaaaaac - -/(?m:^).abc$/ - eeexabc - eee\nxabc - -/(?m:^)abc/ - abc - \nabc - - -/^abc/ - abc - \nabc - -/\Aabc/ - abc - \nabc - -/(?.*/)foo" - /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/ - -"(?>.*/)foo" - /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo - -/(?>(\.\d\d[1-9]?))\d+/ - 1.230003938 - 1.875000282 - 1.235 - -/^((?>\w+)|(?>\s+))*$/ - now is the time for all good men to come to the aid of the party - this is not a line with only words and spaces! - -/(\d+)(\w)/ - 12345a - 12345+ - -/((?>\d+))(\w)/ - 12345a - 12345+ - -/(?>a+)b/ - aaab - -/((?>a+)b)/ - aaab - -/(?>(a+))b/ - aaab - -/(?>b)+/ - aaabbbccc - -/(?>a+|b+|c+)*c/ - aaabbbbccccd - -/((?>[^()]+)|\([^()]*\))+/ - ((abc(ade)ufh()()x - -/\(((?>[^()]+)|\([^()]+\))+\)/ - (abc) - (abc(def)xyz) - ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - -/a(?-i)b/i - ab - Ab - aB - AB - -/(a (?x)b c)d e/ - a bcd e - a b cd e - abcd e - a bcde - -/(a b(?x)c d (?-x)e f)/ - a bcde f - abcdef - -/(a(?i)b)c/ - abc - aBc - abC - aBC - Abc - ABc - ABC - AbC - -/a(?i:b)c/ - abc - aBc - ABC - abC - aBC - -/a(?i:b)*c/ - aBc - aBBc - aBC - aBBC - -/a(?=b(?i)c)\w\wd/ - abcd - abCd - aBCd - abcD - -/(?s-i:more.*than).*million/i - more than million - more than MILLION - more \n than Million - MORE THAN MILLION - more \n than \n million - -/(?:(?s-i)more.*than).*million/i - more than million - more than MILLION - more \n than Million - MORE THAN MILLION - more \n than \n million - -/(?>a(?i)b+)+c/ - abc - aBbc - aBBc - Abc - abAb - abbC - -/(?=a(?i)b)\w\wc/ - abc - aBc - Ab - abC - aBC - -/(?<=a(?i)b)(\w\w)c/ - abxxc - aBxxc - Abxxc - ABxxc - abxxC - -/(?:(a)|b)(?(1)A|B)/ - aA - bB - aB - bA - -/^(a)?(?(1)a|b)+$/ - aa - b - bb - ab - -/^(?(?=abc)\w{3}:|\d\d)$/ - abc: - 12 - 123 - xyz - -/^(?(?!abc)\d\d|\w{3}:)$/ - abc: - 12 - 123 - xyz - -/(?(?<=foo)bar|cat)/ - foobar - cat - fcat - focat - foocat - -/(?(?a*)*/ - a - aa - aaaa - -/(abc|)+/ - abc - abcabc - abcabcabc - xyz - -/([a]*)*/ - a - aaaaa - -/([ab]*)*/ - a - b - ababab - aaaabcde - bbbb - -/([^a]*)*/ - b - bbbb - aaa - -/([^ab]*)*/ - cccc - abab - -/([a]*?)*/ - a - aaaa - -/([ab]*?)*/ - a - b - abab - baba - -/([^a]*?)*/ - b - bbbb - aaa - -/([^ab]*?)*/ - c - cccc - baba - -/(?>a*)*/ - a - aaabcde - -/((?>a*))*/ - aaaaa - aabbaa - -/((?>a*?))*/ - aaaaa - aabbaa - -/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x - 12-sep-98 - 12-09-98 - sep-12-98 - -/(?<=(foo))bar\1/ - foobarfoo - foobarfootling - foobar - barfoo - -/(?i:saturday|sunday)/ - saturday - sunday - Saturday - Sunday - SATURDAY - SUNDAY - SunDay - -/(a(?i)bc|BB)x/ - abcx - aBCx - bbx - BBx - abcX - aBCX - bbX - BBX - -/^([ab](?i)[cd]|[ef])/ - ac - aC - bD - elephant - Europe - frog - France - Africa - -/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/ - ab - aBd - xy - xY - zebra - Zambesi - aCD - XY - -/(?<=foo\n)^bar/m - foo\nbar - bar - baz\nbar - -/(?<=(?]&/ - <&OUT - -/^(a\1?){4}$/ - aaaaaaaaaa - AB - aaaaaaaaa - aaaaaaaaaaa - -/^(a(?(1)\1)){4}$/ - aaaaaaaaaa - aaaaaaaaa - aaaaaaaaaaa - -/(?:(f)(o)(o)|(b)(a)(r))*/ - foobar - -/(?<=a)b/ - ab - cb - b - -/(?a+)ab/ - -/(?>a+)b/ - aaab - -/([[:]+)/ - a:[b]: - -/([[=]+)/ - a=[b]= - -/([[.]+)/ - a.[b]. - -/((?>a+)b)/ - aaab - -/(?>(a+))b/ - aaab - -/((?>[^()]+)|\([^()]*\))+/ - ((abc(ade)ufh()()x - -/a\Z/ - aaab - a\nb\n - -/b\Z/ - a\nb\n - -/b\z/ - -/b\Z/ - a\nb - -/b\z/ - a\nb - -/^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/ - a - abc - a-b - 0-9 - a.b - 5.6.7 - the.quick.brown.fox - a100.b200.300c - 12-ab.1245 - \ - .a - -a - a- - a. - a_b - a.- - a.. - ab..bc - the.quick.brown.fox- - the.quick.brown.fox. - the.quick.brown.fox_ - the.quick.brown.fox+ - -/(?>.*)(?<=(abcd|wxyz))/ - alphabetabcd - endingwxyz - a rather long string that doesn't end with one of them - -/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/ - word cat dog elephant mussel cow horse canary baboon snake shark otherword - word cat dog elephant mussel cow horse canary baboon snake shark - -/word (?>[a-zA-Z0-9]+ ){0,30}otherword/ - word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope - -/(?<=\d{3}(?!999))foo/ - 999foo - 123999foo - 123abcfoo - -/(?<=(?!...999)\d{3})foo/ - 999foo - 123999foo - 123abcfoo - -/(?<=\d{3}(?!999)...)foo/ - 123abcfoo - 123456foo - 123999foo - -/(?<=\d{3}...)(?\s*)=(?>\s*) # find Z)+|A)*/ - ZABCDEFG - -/((?>)+|A)*/ - ZABCDEFG - -/a*/g - abbab - -/^[a-\d]/ - abcde - -things - 0digit - bcdef - -/^[\d-a]/ - abcde - -things - 0digit - bcdef - -/(?<=abc).*(?=def)/ - abcdef - abcxdef - abcxdefxdef - -/(?<=abc).*?(?=def)/ - abcdef - abcxdef - abcxdefxdef - -/(?<=abc).+(?=def)/ - abcdef - abcxdef - abcxdefxdef - -/(?<=abc).+?(?=def)/ - abcdef - abcxdef - abcxdefxdef - -/(?<=\b)(.*)/ - -abcdef - abcdef - -/(?<=\B)(.*)/ - -abcdef - abcdef - -/^'[ab]'/ - 'a' - 'b' - x'a' - 'a'x - 'ab' - -/^'[ab]'$/ - 'a' - 'b' - x'a' - 'a'x - 'ab' - -/'[ab]'$/ - 'a' - 'b' - x'a' - 'a'x - 'ab' - -/'[ab]'/ - 'a' - 'b' - x'a' - 'a'x - 'ab' - -/abc\E/ - abc - abcE - -/abc[\Ex]/ - abcx - abcE - -/^\Qa*\E$/ - a* - a - -/\Qa*x\E/ - a*x - a* - -/\Qa*x/ - a*x - a* - -/\Q\Qa*x\E\E/ - a*x - a\\*x - -/\Q\Qa*x\E/ - a*x - a\\*x - -/a\Q[x\E]/ - a[x] - ax - -/a#comment\Q... -{2}/x - a - aa - -/a(?#comment\Q... -){2}/x - a - aa - -/(?x)a#\Q -./ - a. - aa - -/ab(?=.*q)cd/ - abcdxklqj - -/a(?!.*$)b/ - ab - -/.{2}[a-z]/ - Axi - -/((a{0,5}){0,5}){0,5}c/ - aaaaaaaaaac - aaaaaaaaaa - -/((a{0,5}){0,5})*c/ - aaaaaaaaaac - aaaaaaaaaa diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/simple b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/simple deleted file mode 100644 index 2aa1446..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/simple +++ /dev/null @@ -1,377 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE-TEST; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/test/simple,v 1.9 2008/07/23 00:48:00 edi Exp $ - -;;; some simple tests for CL-PPCRE - entered manually and to be read -;;; in the CL-PPCRE-TEST package; all forms are expected to return a -;;; true value on success when EVALuated - -(equalp (multiple-value-list (scan "(a)*b" "xaaabd")) - (list 1 5 #(3) #(4))) - -(equalp (multiple-value-list (scan "(a)*b" "xaaabd" :start 1)) - (list 1 5 #(3) #(4))) - -(equalp (multiple-value-list (scan "(a)*b" "xaaabd" :start 2)) - (list 2 5 #(3) #(4))) - -(null (scan "(a)*b" "xaaabd" :end 4)) - -(equalp (multiple-value-list (scan '(:greedy-repetition 0 nil #\b) "bbbc")) - (list 0 3 #() #())) - -(null (scan '(:greedy-repetition 4 6 #\b) "bbbc")) - -(let ((s (create-scanner "(([a-c])+)x"))) - (equalp (multiple-value-list (scan s "abcxy")) - (list 0 4 #(0 2) #(3 3)))) - -(equalp (multiple-value-list (scan-to-strings "[^b]*b" "aaabd")) - (list "aaab" #())) - -(equalp (multiple-value-list (scan-to-strings "([^b])*b" "aaabd")) - (list "aaab" #("a"))) - -(equalp (multiple-value-list (scan-to-strings "(([^b])*)b" "aaabd")) - (list "aaab" #("aaa" "a"))) - -(equalp (register-groups-bind (first second third fourth) - ("((a)|(b)|(c))+" "abababc" :sharedp t) - (list first second third fourth)) - (list "c" "a" "b" "c")) - -(equalp (register-groups-bind (nil second third fourth) - ("((a)|(b)|(c))()+" "abababc" :start 6) - (list second third fourth)) - (list nil nil "c")) - -(null (register-groups-bind (first) - ("(a|b)+" "accc" :start 1) - first)) - -(equalp (register-groups-bind (fname lname (#'parse-integer date month year)) - ("(\\w+)\\s+(\\w+)\\s+(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})" "Frank Zappa 21.12.1940") - (list fname lname (encode-universal-time 0 0 0 date month year 0))) - (list "Frank" "Zappa" 1292889600)) - -(flet ((foo (regex target-string &key (start 0) (end (length target-string))) - (let ((sum 0)) - (do-matches (s e regex target-string nil :start start :end end) - (incf sum (- e s))) - (/ sum (- end start))))) - (and (= 1/3 (foo "a" "abcabcabc")) - (= 5/9 (foo "aa|b" "aacabcbbc")))) - -(labels ((crossfoot (target-string &key (start 0) (end (length target-string))) - (let ((sum 0)) - (do-matches-as-strings (m :digit-class - target-string nil - :start start :end end) - (incf sum (parse-integer m))) - (if (< sum 10) - sum - (crossfoot (format nil "~A" sum)))))) - (and (zerop (crossfoot "bar")) - (= 3 (crossfoot "a3x")) - (= 6 (crossfoot "12345")))) - -(let (result) - (do-register-groups (first second third fourth) - ("((a)|(b)|(c))" "abababc" nil :start 2 :sharedp t) - (push (list first second third fourth) result)) - (equal (nreverse result) - '(("a" "a" nil nil) - ("b" nil "b" nil) - ("a" "a" nil nil) - ("b" nil "b" nil) - ("c" nil nil "c")))) - -(let (result) - (do-register-groups ((#'parse-integer n) (#'intern sign) whitespace) - ("(\\d+)|(\\+|-|\\*|/)|(\\s+)" "12*15 - 42/3") - (unless whitespace - (push (or n sign) result))) - (equal (nreverse result) - '(12 * 15 - 42 / 3))) - -(equal (all-matches "a" "foo bar baz") - (list 5 6 9 10)) - -(equal (all-matches "\\w*" "foo bar baz") - (list 0 3 3 3 4 7 7 7 8 11 11 11)) - -(equal (all-matches-as-strings "a" "foo bar baz") - (list "a" "a")) - -(equal (all-matches-as-strings "\\w*" "foo bar baz") - (list "foo" "" "bar" "" "baz" "")) - -(equal (split "\\s+" "foo bar baz -frob") - '("foo" "bar" "baz" "frob")) - -(equal (split "\\s*" "foo bar baz") - '("f" "o" "o" "b" "a" "r" "b" "a" "z")) - -(equal (split "(\\s+)" "foo bar baz") - '("foo" "bar" "baz")) - -(equal (split "(\\s+)" "foo bar baz" :with-registers-p t) - '("foo" " " "bar" " " "baz")) - -(equal (split "(\\s)(\\s*)" "foo bar baz" :with-registers-p t) - '("foo" " " "" "bar" " " " " "baz")) - -(equal (split "(,)|(;)" "foo,bar;baz" :with-registers-p t) - '("foo" "," nil "bar" nil ";" "baz")) - -(equal (split "(,)|(;)" "foo,bar;baz" :with-registers-p t :omit-unmatched-p t) - '("foo" "," "bar" ";" "baz")) - -(equal (split ":" "a:b:c:d:e:f:g::") - '("a" "b" "c" "d" "e" "f" "g")) - -(equal (split ":" "a:b:c:d:e:f:g::" :limit 1) - '("a:b:c:d:e:f:g::")) - -(equal (split ":" "a:b:c:d:e:f:g::" :limit 2) - '("a" "b:c:d:e:f:g::")) - -(equal (split ":" "a:b:c:d:e:f:g::" :limit 3) - '("a" "b" "c:d:e:f:g::")) - -(equal (split ":" "a:b:c:d:e:f:g::" :limit 1000) - '("a" "b" "c" "d" "e" "f" "g" "" "")) - -(equal (split ":" "a:b:c:d:e:f:g::" :limit -1) - '("a" "b" "c" "d" "e" "f" "g" "" "")) - -(equal (multiple-value-list (regex-replace "fo+" "foo bar" "frob")) - (list "frob bar" t)) - -(equal (multiple-value-list (regex-replace "fo+" "FOO bar" "frob")) - (list "FOO bar" nil)) - -(equal (multiple-value-list (regex-replace "(?i)fo+" "FOO bar" "frob")) - (list "frob bar" t)) - -(equal (multiple-value-list (regex-replace "(?i)fo+" "FOO bar" "frob" :preserve-case t)) - (list "FROB bar" t)) - -(equal (multiple-value-list (regex-replace "(?i)fo+" "Foo bar" "frob" :preserve-case t)) - (list "Frob bar" t)) - -(equal (multiple-value-list (regex-replace "bar" "foo bar baz" "[frob (was '\\&' between '\\`' and '\\'')]")) - (list "foo [frob (was 'bar' between 'foo ' and ' baz')] baz" t)) - -(equal (multiple-value-list - (regex-replace "bar" "foo bar baz" - '("[frob (was '" :match "' between '" :before-match "' and '" :after-match "')]"))) - (list "foo [frob (was 'bar' between 'foo ' and ' baz')] baz" t)) - -(equal (multiple-value-list (regex-replace "(be)(nev)(o)(lent)" - "benevolent: adj. generous, kind" - (lambda (match &rest registers) - (format nil "~A [~{~A~^.~}]" match registers)) - :simple-calls t)) - (list "benevolent [be.nev.o.lent]: adj. generous, kind" t)) - -(equal (multiple-value-list (regex-replace-all "(?i)fo+" "foo Fooo FOOOO bar" "frob" :preserve-case t)) - (list "frob Frob FROB bar" t)) - -(string= (regex-replace-all "(?i)f(o+)" "foo Fooo FOOOO bar" "fr\\1b" :preserve-case t) - "froob Frooob FROOOOB bar") - -(let ((qp-regex (create-scanner "[\\x80-\\xff]"))) - (flet ((encode-quoted-printable (string) - "Converts 8-bit string to quoted-printable representation." - ;; won't work for Corman Lisp because non-ASCII characters aren't 8-bit there - (flet ((convert (target-string start end match-start match-end reg-starts reg-ends) - (declare (ignore start end match-end reg-starts reg-ends)) - (format nil "=~:@(~2,'0x~)" (char-code (char target-string match-start))))) - (regex-replace-all qp-regex string #'convert)))) - (string= (encode-quoted-printable "Fête Sørensen naïve Hühner Straße") - "F=EAte S=F8rensen na=EFve H=FChner Stra=DFe"))) - -(let ((url-regex (create-scanner "[^a-zA-Z0-9_\\-.]"))) - (flet ((url-encode (string) - "URL-encodes a string." - ;; won't work for Corman Lisp because non-ASCII characters aren't 8-bit there - (flet ((convert (target-string start end match-start match-end reg-starts reg-ends) - (declare (ignore start end match-end reg-starts reg-ends)) - (format nil "%~:@(~2,'0x~)" (char-code (char target-string match-start))))) - (regex-replace-all url-regex string #'convert)))) - (string= (url-encode "Fête Sørensen naïve Hühner Straße") - "F%EAte%20S%F8rensen%20na%EFve%20H%FChner%20Stra%DFe"))) - -(flet ((how-many (target-string start end match-start match-end reg-starts reg-ends) - (declare (ignore target-string start end match-start match-end)) - (format nil "~A" (- (svref reg-ends 0) - (svref reg-starts 0))))) - (string= (regex-replace-all "{(.+?)}" - "foo{...}bar{.....}{..}baz{....}frob" - (list "[" #'how-many " dots]")) - "foo[3 dots]bar[5 dots][2 dots]baz[4 dots]frob")) - -(let ((qp-regex (create-scanner "[\\x80-\\xff]"))) - (flet ((encode-quoted-printable (string) - "Converts 8-bit string to quoted-printable representation. -Version using SIMPLE-CALLS keyword argument." - ;; ;; won't work for Corman Lisp because non-ASCII characters aren't 8-bit there - (flet ((convert (match) - (format nil "=~:@(~2,'0x~)" (char-code (char match 0))))) - (regex-replace-all qp-regex string #'convert - :simple-calls t)))) - (string= (encode-quoted-printable "Fête Sørensen naïve Hühner Straße") - "F=EAte S=F8rensen na=EFve H=FChner Stra=DFe"))) - -(flet ((how-many (match first-register) - (declare (ignore match)) - (format nil "~A" (length first-register)))) - (string= (regex-replace-all "{(.+?)}" - "foo{...}bar{.....}{..}baz{....}frob" - (list "[" #'how-many " dots]") - :simple-calls t) - "foo[3 dots]bar[5 dots][2 dots]baz[4 dots]frob")) - -(flet ((my-repetition (char min) - `(:greedy-repetition ,min nil ,char))) - (setf (parse-tree-synonym 'a*) (my-repetition #\a 0) - (parse-tree-synonym 'b+) (my-repetition #\b 1)) - (unwind-protect - (let ((scanner (create-scanner '(:sequence a* b+)))) - (equal (mapcar (lambda (target) - (scan scanner target)) - '("ab" "b" "aab" "a" "x")) - (list 0 0 0 nil nil))) - (setf (parse-tree-synonym 'a*) nil - (parse-tree-synonym 'b+) nil))) - -(null (scan "^a+$" "a+")) - -(let ((*allow-quoting* t)) - ;;we use CREATE-SCANNER because of Lisps like SBCL that don't have an interpreter - (equalp (multiple-value-list (scan (create-scanner "^\\Qa+\\E$") "a+")) - (list 0 2 #() #()))) - -(string= (parse-string "\\k") "k") - -(let ((*allow-named-registers* t)) - (equal (nth-value 1 (create-scanner "((?[a-z]*)(?[A-Z]*))")) - (list nil "small" "big"))) - -(let ((*allow-named-registers* t)) - (equal (nth-value 1 (create-scanner '(:register - (:sequence - (:named-register "small" - (:greedy-repetition 0 nil (:char-class (:range #\a #\z)))) - (:named-register "big" - (:greedy-repetition 0 nil (:char-class (:range #\a #\z)))))))) - (list nil "small" "big"))) - -(let ((*allow-named-registers* t)) - (equalp (multiple-value-list (scan (create-scanner "((?[a-z]*)(?[A-Z]*))") "aaaBBB")) - (list 0 6 #(0 0 3) #(6 3 6)))) - -(let ((*allow-named-registers* t)) - ;; multiple-choice back-reference - (equalp (multiple-value-list (scan (create-scanner "^(?[ab])(?[12])\\k\\k$") "a1aa")) - (list 0 4 #(0 1) #(1 2)))) - -(let ((*allow-named-registers* t)) - (equalp (multiple-value-list (scan (create-scanner "^(?[ab])(?[12])\\k\\k$") "a22a")) - (list 0 4 #(0 1) #(1 2)))) - -(let ((*allow-named-registers* t)) - ;; demonstrating most-recently-seen-register-first property of back-reference; - ;; "greedy" regex (analogous to "aa?") - (equalp (multiple-value-list (scan (create-scanner "^(?)(?a)(\\k)") "a")) - (list 0 1 #(0 0 1) #(0 1 1)))) - -(let ((*allow-named-registers* t)) - (equalp (multiple-value-list (scan (create-scanner "^(?)(?a)(\\k)") "aa")) - (list 0 2 #(0 0 1) #(0 1 2)))) - -(let ((*allow-named-registers* t)) - ;; switched groups - ;; "lazy" regex (analogous to "aa??") - (equalp (multiple-value-list (scan (create-scanner "^(?a)(?)(\\k)") "a")) - (list 0 1 #(0 1 1) #(1 1 1)))) - -(let ((*allow-named-registers* t)) - ;; scanner ignores the second "a" - (equalp (multiple-value-list (scan (create-scanner "^(?a)(?)(\\k)") "aa")) - (list 0 1 #(0 1 1) #(1 1 1)))) - -(let ((*allow-named-registers* t)) - ;; "aa" will be matched only when forced by adding "$" at the end - (equalp (multiple-value-list (scan (create-scanner "^(?a)(?)(\\k)$") "aa")) - (list 0 2 #(0 1 1) #(1 1 2)))) - -(string= (quote-meta-chars "[a-z]*") "\\[a\\-z\\]\\*") - -(string= (handler-case - (create-scanner "foo**x") - (ppcre-syntax-error (condition) - (with-standard-io-syntax - (format nil "Houston, we've got a problem with the string ~S: Looks like something went wrong at position ~A. The last message we received was \"~?\"." - (ppcre-syntax-error-string condition) - (ppcre-syntax-error-pos condition) - (simple-condition-format-control condition) - (simple-condition-format-arguments condition))))) - "Houston, we've got a problem with the string \"foo**x\": Looks like something went wrong at position 4. The last message we received was \"Quantifier '*' not allowed.\".") - -(flet ((my-weird-filter (pos) - "Only match at this point if either pos is odd and the -character we're looking at is lowercase or if pos is even and the next -two characters we're looking at are uppercase. Consume these -characters if there's a match." - (cond ((and (oddp pos) - (< pos cl-ppcre::*end-pos*) - (lower-case-p (char cl-ppcre::*string* pos))) - (1+ pos)) - ((and (evenp pos) - (< (1+ pos) cl-ppcre::*end-pos*) - (upper-case-p (char cl-ppcre::*string* pos)) - (upper-case-p (char cl-ppcre::*string* (1+ pos)))) - (+ pos 2)) - (t nil)))) - (let ((weird-regex `(:sequence "+" (:filter ,#'my-weird-filter) "+"))) - (equalp (multiple-value-list (scan weird-regex "+A++a+AA+")) - (list 5 9 #() #())))) - -(let ((a "\\E*")) - (equalp (multiple-value-list (scan (concatenate 'string "(?:" (quote-meta-chars a) "){2}") "\\E*\\E*")) - (list 0 6 #() #()))) - -(let ((a "\\E*")) - (equalp (multiple-value-list (scan `(:greedy-repetition 2 2 ,a) "\\E*\\E*")) - (list 0 6 #() #()))) - -(loop for *optimize-char-classes* in '(:hash-table :hash-table* :charset :charset* :charmap) - for s = (create-scanner "(([a-c])+)x") - always (equalp (multiple-value-list (scan s "abcxy")) - (list 0 4 #(0 2) #(3 3)))) - -(labels ((char-code-odd-p (char) - (oddp (char-code char))) - (char-code-even-p (char) - (evenp (char-code char))) - (resolver (name) - (cond ((string= name "odd") #'char-code-odd-p) - ((string= name "even") #'char-code-even-p) - ((string= name "true") (constantly t)) - (t (error "Can't resolve ~S." name))))) - (equalp - (let ((*property-resolver* #'resolver)) - (list (regex-replace-all (create-scanner "\\p{odd}") "abcd" "+") - (regex-replace-all (create-scanner "\\p{even}") "abcd" "+") - (regex-replace-all (create-scanner "\\p{true}") "abcd" "+"))) - '("+b+d" "a+c+" "++++"))) - -(macrolet ((z () "(a)*b")) - (equalp (multiple-value-list (scan (z) "xaaabd")) - (list 1 5 #(3) #(4)))) - -(macrolet ((z () "[^b]*b")) - (equalp (multiple-value-list (scan-to-strings (z) "aaabd")) - (list "aaab" #()))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/tests.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/tests.lisp deleted file mode 100644 index ae8ec04..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/tests.lisp +++ /dev/null @@ -1,159 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE-TEST; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/test/tests.lisp,v 1.13 2009/09/17 19:17:36 edi Exp $ - -;;; The tests in this file test CL-PPCRE against testdata generated by -;;; the Perl program `perltest.pl' from the input file `testinput' in -;;; order to check compatibility with Perl and correctness of the -;;; regex engine. - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre-test) - -(defvar *this-file* (load-time-value - (or #.*compile-file-pathname* *load-pathname*)) - "The location of this source file.") - -(defmacro do-tests ((name &optional show-progress-p) &body body) - "Helper macro which repeatedly executes BODY until the code in body -calls the function DONE. It is assumed that each invocation of BODY -will be the execution of one test which returns NIL in case of success -and list of string describing errors otherwise. - -The macro prints a simple progress indicator \(one dots for ten tests) -to *STANDARD-OUTPUT* unless SHOW-PROGRESS-P is NIL and returns a true -value iff all tests succeeded. Errors in BODY are caught and reported -\(and counted as failures)." - `(let ((successp t) - (testcount 1)) - (block test-block - (flet ((done () - (return-from test-block successp))) - (format t "~&Test: ~A~%" ,name) - (loop - (when (and ,show-progress-p (zerop (mod testcount 10))) - (format t ".") - (when (zerop (mod testcount 100)) - (terpri)) - (force-output)) - (let ((errors - (handler-case - (progn ,@body) - (error (msg) - (list (format nil "~&got an unexpected error: ~A" msg)))))) - (setq successp (and successp (null errors))) - (when errors - (format t "~&~4@A:~{~& ~A~}~%" testcount errors)) - (incf testcount))))) - successp)) - -(defun simple-tests (&key (file-name - (make-pathname :name "simple" - :type nil :version nil - :defaults *this-file*)) - (external-format '(:latin-1 :eol-style :lf)) - verbose) - "Loops through all the forms in the file FILE-NAME and executes each -of them using EVAL. It is assumed that each FORM specifies a test -which returns a true value iff it succeeds. Prints each test form to -*STANDARD-OUTPUT* if VERBOSE is true and shows a simple progress -indicator otherwise. EXTERNAL-FORMAT is the FLEXI-STREAMS external -format which is used to read the file. Returns a true value iff all -tests succeeded." - (with-open-file (binary-stream file-name :element-type 'flex:octet) - (let ((stream (flex:make-flexi-stream binary-stream :external-format external-format)) - (*package* (find-package :cl-ppcre-test))) - (do-tests ((format nil "Simple tests from file ~S" (file-namestring file-name)) - (not verbose)) - (let ((form (or (read stream nil) (done)))) - (when verbose - (format t "~&~S" form)) - (cond ((eval form) nil) - (t (list (format nil "~S returned NIL" form))))))))) - -(defun random-test-function (probability) - "Returns a random character test function which contains each -character with probability PROBABILITY." - (let ((hash-table (make-hash-table))) - (dotimes (code char-code-limit) - (let ((char (code-char code))) - (when (and char (< (random 1.0d0) probability)) - (setf (gethash (code-char code) hash-table) t)))) - (lambda (char) - (gethash char hash-table)))) - -(defun test-optimized-test-functions% (probability) - "Creates a random test function with probability PROBABILITY and six -\(one for each possible \"kind\") corresponding optimized test -functions, then checks for each character in turn that all functions -agree on it." - (let* ((test-function (random-test-function probability)) - (optimized-functions (loop for kind in '(nil - :hash-table - :hash-table* - :charset - :charset* - :charmap) - collect (create-optimized-test-function test-function :kind kind)))) - (loop for code below char-code-limit - for char = (code-char code) - for expected-result = (and char (funcall test-function char)) - always (or (null char) - (loop for optimized-function in optimized-functions - always (eq (not (funcall optimized-function char)) - (not expected-result))))))) - -(defun test-optimized-test-functions (&key verbose) - "Runs TEST-OPTIMIZED-TEST-FUNCTIONS% with different probabilities." - (let ((probabilities '(0 .001 .01 .1 1))) - (do-tests ("Optimized test functions - this might take some time..." (not verbose)) - (let ((probability (or (pop probabilities) (done)))) - (when verbose - (format t "~&Probability is ~A" probability)) - (not (test-optimized-test-functions% probability)))))) - -(defun run-all-tests (&key more-tests verbose) - "Runs all tests for CL-PPCRE and returns a true value iff all tests -succeeded. VERBOSE is interpreted by the individual test suites. -MORE-TESTS can be a list of function designators designating -additional tests to run. This facility is used by the tests for -CL-PPCRE-UNICODE." - (let ((successp t)) - (macrolet ((run-test-suite (&body body) - `(unless (progn ,@body) - (setq successp nil)))) - ;; run the automatically generated Perl tests - (run-test-suite (perl-test :verbose verbose)) - (run-test-suite (test-optimized-test-functions :verbose verbose)) - (run-test-suite (simple-tests :verbose verbose)) - (when more-tests - (unless (listp more-tests) - (setq more-tests (list more-tests)) - (dolist (test more-tests) - (run-test-suite (funcall test :verbose verbose)))))) - (format t "~2&~:[Some tests failed~;All tests passed~]." successp) - successp)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/unicode-tests.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/unicode-tests.lisp deleted file mode 100644 index 7058405..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/unicode-tests.lisp +++ /dev/null @@ -1,80 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE-TEST; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/test/unicode-tests.lisp,v 1.8 2008/07/23 00:17:53 edi Exp $ - -;;; Copyright (c) 2008, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre-test) - -(defun unicode-test (&key (file-name - (make-pathname :name "unicodetestdata" - :type nil :version nil - :defaults *this-file*) - file-name-provided-p) - verbose) - "Loops through all test cases in FILE-NAME and prints a report if -VERBOSE is true. Returns a true value if all tests succeeded. - -For the syntax of the tests in FILE-NAME refer to CL-UNICODE." - (with-open-file (stream file-name) - (let ((*regex-char-code-limit* (if file-name-provided-p *regex-char-code-limit* char-code-limit)) - (*optimize-char-classes* (if file-name-provided-p *optimize-char-classes* nil)) - ;; we only check for correctness and don't care about speed - ;; that match (but rather about space constraints of the - ;; trial versions) - (*use-bmh-matchers* (if file-name-provided-p *use-bmh-matchers* nil))) - (do-tests ((format nil "Running Unicode tests in file ~S" (file-namestring file-name)) - (not verbose)) - (let ((input-line (or (read stream nil) (done))) - errors) - (destructuring-bind (char-code property-name expected-result) - input-line - (let ((char (and (< char-code char-code-limit) (code-char char-code)))) - (when char - (when verbose - (format t "~&~A: #x~X" property-name char-code)) - (let* ((string (string char)) - (result-1 (scan (format nil "\\p{~A}" property-name) string)) - (result-2 (scan (format nil "[\\p{~A}]" property-name) string)) - (inverted-result-1 (scan (format nil "\\P{~A}" property-name) string)) - (inverted-result-2 (scan (format nil "[\\P{~A}]" property-name) string))) - (unless (eq expected-result (not (not result-1))) - (push (format nil "\(code-char #x~X) should ~:[not ~;~]have matched \"\\p{~A}\"" - char-code expected-result property-name) - errors)) - (unless (eq expected-result (not (not result-2))) - (push (format nil "\(code-char #x~X) should ~:[not ~;~]have matched \"[\\p{~A}]\"" - char-code expected-result property-name) - errors)) - (unless (eq expected-result (not inverted-result-1)) - (push (format nil "\(code-char #x~X) should ~:[~;not ~]have matched \"\\P{~A}\"" - char-code expected-result property-name) - errors)) - (unless (eq expected-result (not inverted-result-2)) - (push (format nil "\(code-char #x~X) should ~:[~;not ~]have matched \"[\\P{~A}]\"" - char-code expected-result property-name) - errors))) - errors)))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/unicodetestdata b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/unicodetestdata deleted file mode 100644 index 6db1f25..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/test/unicodetestdata +++ /dev/null @@ -1,107 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/test/unicodetestdata,v 1.10 2008/07/22 14:00:35 edi Exp $ - -;;; some arbitrary test data for Unicode properties - stolen from CL-UNICODE - -(#x0001 "ASCII" t) -(#x0100 "ASCII" nil) -(#x000A "Alphabetic" nil) -(#x0061 "Alphabetic" t) -(#x0061 "Ll" t) -(#x0041 "Alphabetic" t) -(#x0041 "alphabetic" t) -(#x0041 "IsAlphabetic" t) -(#x02E4 "Alphabetic" t) -(#x0970 "Alphabetic" nil) -(#x030D "BidiClass:NonspacingMark" t) -(#x030D "NonspacingMark" t) -(#x030D "nonspacing mark" t) -(#xE0146 "BidiClass:NonspacingMark" t) -(#x000D "BidiClass:WhiteSpace" nil) -(#x0020 "BidiClass:WhiteSpace" t) -(#x2006 "BidiClass:WhiteSpace" t) -(#x12470 "Cuneiform" t) -(#x12470 "IsCuneiform" t) -(#x12470 "CuneiformNumbersAndPunctuation" t) -(#x12470 "Block:CuneiformNumbersAndPunctuation" t) -(#x12470 "InCuneiformNumbersAndPunctuation" t) -(#x12470 "Script:Cuneiform" t) -(#x0041 "Block:Hebrew" nil) -(#x0593 "Block:Hebrew" t) -(#x0593 "InHebrew" t) -(#x040D "Block:Cyrillic" t) -(#x040D "InCyrillic" t) -(#x0042 "Block:Cyrillic" nil) -(#x2011 "Dash" t) -(#x2011 "IsDash" t) -(#xFF0D "Dash" t) -(#x003D "Dash" nil) -(#x00F0 "Lowercase" t) -(#x00F0 "IsLowercase" t) -(#x00F0 "lowercase" t) -(#x00F0 "Ll" t) -(#x0067 "Lowercase" t) -(#x010A "Lowercase" nil) -(#x1D6C1 "Lowercase" nil) -(#x0023 "CurrencySymbol" nil) -(#x0024 "CurrencySymbol" t) -(#x0024 "IsCurrencySymbol" t) -(#x0024 "currency symbol" t) -(#x20AC "CurrencySymbol" t) -(#xFFE6 "CurrencySymbol" t) -(#x002B "Sm" t) -(#x002B "Math" t) -(#x002B "IsMath" t) -(#x002B "math" t) -(#x211C "Math" t) -(#x1D7D2 "Math" t) -(#x002A "Math" nil) -(#x25C9 "Math" nil) -(#x0000 "NonCharacterCodePoint" nil) -(#xFDD0 "NonCharacterCodePoint" t) -(#xFDD0 "Non-Character-Code-Point" t) -(#xFDD0 "non-character-code-point" t) -(#xFFFFF "NonCharacterCodePoint" t) -(#x0043 "Arabic" nil) -(#x0606 "Arabic" t) -(#x0606 "arabic" t) -(#x0606 "IsArabic" t) -(#x0606 "Script:Arabic" t) -(#x0044 "IsVariationSelector" nil) -(#x0044 "VariationSelector" nil) -(#x180B "VariationSelector" t) -(#x180B "Variation_Selector" t) -(#x180B "Variation-Selector" t) -(#x180B "variationselector" t) -(#x180B "variation selector" t) -(#x180B "IsVariationSelector" t) -(#x00B5 "XIDContinue" t) -(#x00B5 "IsXIDContinue" t) -(#x00B5 "IsXID_Continue" t) -(#x00B5 "Is_XID_Continue" t) -(#x00B5 "XID_Continue" t) -(#x33FF "Unified_Ideograph" nil) -(#x33FF "Ideographic" nil) -(#x3400 "Unified_Ideograph" t) -(#x3400 "Ideographic" t) -(#x3400 "Han" t) -(#x3400 "OtherLetter" t) -(#x3400 "Alphabetic" t) -(#x3400 "Common" nil) -(#x3400 "Assigned" t) -(#x3400 "Any" t) -(#x0378 "Cn" t) -(#x0378 "Unassigned" t) -(#x0377 "Cn" nil) -(#x0377 "Unassigned" nil) -(#x2800 "Braille" t) -(#x2800 "Script:Braille" t) -(#x2800 "OtherSymbol" t) -(#x0027 "QuotationMark" t) -(#x201C "QuotationMark" t) -(#x201C "OtherNeutral" t) -(#x201C "PatternSyntax" t) -(#x0028 "Bidi_Mirrored" t) -(#x0028 "BidiMirrored" t) -(#x0028 "IsBidiMirrored" t) -(#x0027 "Bidi_Mirrored" nil) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/util.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/util.lisp deleted file mode 100644 index 8dd5fd2..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-ppcre-20190521-git/util.lisp +++ /dev/null @@ -1,201 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/util.lisp,v 1.48 2009/10/28 07:36:15 edi Exp $ - -;;; Utility functions and constants dealing with the character sets we -;;; use to encode character classes - -;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-ppcre) - -(defmacro defconstant (name value &optional doc) - "Make sure VALUE is evaluated only once \(to appease SBCL)." - `(cl:defconstant ,name (if (boundp ',name) (symbol-value ',name) ,value) - ,@(when doc (list doc)))) - -#+:lispworks -(eval-when (:compile-toplevel :load-toplevel :execute) - (import 'lw:with-unique-names)) - -#-:lispworks -(defmacro with-unique-names ((&rest bindings) &body body) - "Syntax: WITH-UNIQUE-NAMES ( { var | (var x) }* ) declaration* form* - -Executes a series of forms with each VAR bound to a fresh, -uninterned symbol. The uninterned symbol is as if returned by a call -to GENSYM with the string denoted by X - or, if X is not supplied, the -string denoted by VAR - as argument. - -The variable bindings created are lexical unless special declarations -are specified. The scopes of the name bindings and declarations do not -include the Xs. - -The forms are evaluated in order, and the values of all but the last -are discarded \(that is, the body is an implicit PROGN)." - ;; reference implementation posted to comp.lang.lisp as - ;; by Vebjorn Ljosa - see also - ;; - `(let ,(mapcar #'(lambda (binding) - (check-type binding (or cons symbol)) - (if (consp binding) - (destructuring-bind (var x) binding - (check-type var symbol) - `(,var (gensym ,(etypecase x - (symbol (symbol-name x)) - (character (string x)) - (string x))))) - `(,binding (gensym ,(symbol-name binding))))) - bindings) - ,@body)) - -#+:lispworks -(eval-when (:compile-toplevel :load-toplevel :execute) - (setf (macro-function 'with-rebinding) - (macro-function 'lw:rebinding))) - -#-:lispworks -(defmacro with-rebinding (bindings &body body) - "WITH-REBINDING ( { var | (var prefix) }* ) form* - -Evaluates a series of forms in the lexical environment that is -formed by adding the binding of each VAR to a fresh, uninterned -symbol, and the binding of that fresh, uninterned symbol to VAR's -original value, i.e., its value in the current lexical environment. - -The uninterned symbol is created as if by a call to GENSYM with the -string denoted by PREFIX - or, if PREFIX is not supplied, the string -denoted by VAR - as argument. - -The forms are evaluated in order, and the values of all but the last -are discarded \(that is, the body is an implicit PROGN)." - ;; reference implementation posted to comp.lang.lisp as - ;; by Vebjorn Ljosa - see also - ;; - (loop for binding in bindings - for var = (if (consp binding) (car binding) binding) - for name = (gensym) - collect `(,name ,var) into renames - collect ``(,,var ,,name) into temps - finally (return `(let ,renames - (with-unique-names ,bindings - `(let (,,@temps) - ,,@body)))))) - -(declaim (inline digit-char-p)) -(defun digit-char-p (chr) - (declare #.*standard-optimize-settings*) - "Tests whether a character is a decimal digit, i.e. the same as -Perl's [\\d]. Note that this function shadows the standard Common -Lisp function CL:DIGIT-CHAR-P." - (char<= #\0 chr #\9)) - -(declaim (inline word-char-p)) -(defun word-char-p (chr) - (declare #.*standard-optimize-settings*) - "Tests whether a character is a \"word\" character. In the ASCII -charset this is equivalent to a-z, A-Z, 0-9, or _, i.e. the same as -Perl's [\\w]." - (or (alphanumericp chr) - (char= chr #\_))) - -(defconstant +whitespace-char-string+ - (coerce '(#\Space #\Tab #\Linefeed #\Return #\Page) 'string) - "A string of all characters which are considered to be whitespace. -Same as Perl's [\\s].") - -(defun whitespacep (chr) - (declare #.*special-optimize-settings*) - "Tests whether a character is whitespace, i.e. whether it would -match [\\s] in Perl." - (find chr +whitespace-char-string+ :test #'char=)) - -(defmacro maybe-coerce-to-simple-string (string) - "Coerces STRING to a simple STRING unless it already is one." - (with-unique-names (=string=) - `(let ((,=string= ,string)) - (cond (#+:lispworks - (lw:simple-text-string-p ,=string=) - #-:lispworks - (simple-string-p ,=string=) - ,=string=) - (t - (coerce ,=string= - #+:lispworks 'lw:simple-text-string - #-:lispworks 'simple-string)))))) - -(declaim (inline nsubseq)) -(defun nsubseq (sequence start &optional (end (length sequence))) - "Returns a subsequence by pointing to location in original sequence." - (make-array (- end start) - :element-type (array-element-type sequence) - :displaced-to sequence - :displaced-index-offset start)) - -(defun normalize-var-list (var-list) - "Utility function for REGISTER-GROUPS-BIND and DO-REGISTER-GROUPS. -Creates the long form \(a list of \(FUNCTION VAR) entries) out of the -short form of VAR-LIST." - (loop for element in var-list - if (consp element) - nconc (loop for var in (rest element) - collect (list (first element) var)) - else - collect (list '(function identity) element))) - -(defun string-list-to-simple-string (string-list) - "Concatenates a list of strings to one simple-string." - (declare #.*standard-optimize-settings*) - ;; this function provided by JP Massar; note that we can't use APPLY - ;; with CONCATENATE here because of CALL-ARGUMENTS-LIMIT - (let ((total-size 0)) - (declare (fixnum total-size)) - (dolist (string string-list) - #-:genera (declare (string string)) - (incf total-size (length string))) - (let ((result-string (make-sequence #-:lispworks 'simple-string - #+:lispworks 'lw:simple-text-string - total-size)) - (curr-pos 0)) - (declare (fixnum curr-pos)) - (dolist (string string-list) - #-:genera (declare (string string)) - (replace result-string string :start1 curr-pos) - (incf curr-pos (length string))) - result-string))) - -(defun complement* (test-function) - "Like COMPLEMENT but optimized for unary functions." - (declare #.*standard-optimize-settings*) - (typecase test-function - (function - (lambda (char) - (declare (character char)) - (not (funcall (the function test-function) char)))) - (otherwise - (lambda (char) - (declare (character char)) - (not (funcall test-function char)))))) \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/.gitignore b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/.gitignore deleted file mode 100644 index 7b4ffca..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -*.fasl -*.dx32fsl -*.dx64fsl -*.lx32fsl -*.lx64fsl -*.x86f - -t/cl-project-sample -t/cl-project-caveman diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/.travis.yml b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/.travis.yml deleted file mode 100644 index d8216c5..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -language: common-lisp -sudo: false - -env: - global: - - PATH=~/.roswell/bin:$PATH - - ROSWELL_INSTALL_DIR=$HOME/.roswell - matrix: - - LISP=sbcl-bin - - LISP=ccl-bin - -install: - # Install Roswell - - curl -L https://raw.githubusercontent.com/roswell/roswell/release/scripts/install-for-ci.sh | sh - - ros install prove - -script: - - run-prove cl-project-test.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/README.markdown b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/README.markdown deleted file mode 100644 index 0c4dc37..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/README.markdown +++ /dev/null @@ -1,61 +0,0 @@ -# CL-Project - Generate modern project skeletons - -[![Build Status](https://travis-ci.org/fukamachi/cl-project.svg?branch=master)](https://travis-ci.org/fukamachi/cl-project) -[![Quicklisp dist](http://quickdocs.org/badge/cl-project.svg)](http://quickdocs.org/cl-project/) - -## Usage - -```common-lisp -(cl-project:make-project #p"lib/cl-sample/" - :author "Eitaro Fukamachi" - :email "e.arrows@gmail.com" - :license "LLGPL" - :depends-on '(:clack :cl-annot)) -;-> writing /Users/fukamachi/Programs/lib/cl-sample/.gitignore -; writing /Users/fukamachi/Programs/lib/cl-sample/README.markdown -; writing /Users/fukamachi/Programs/lib/cl-sample/cl-sample-test.asd -; writing /Users/fukamachi/Programs/lib/cl-sample/cl-sample.asd -; writing /Users/fukamachi/Programs/lib/cl-sample/src/hogehoge.lisp -; writing /Users/fukamachi/Programs/lib/cl-sample/t/hogehoge.lisp -;=> T -``` - -## What's the difference from other generators? - -### 1. Flexible templates - -CL-Project supports more parameters to embed, by using [CL-EMB](http://common-lisp.net/project/cl-emb/) to represent the skeleton files (See "cl-project/skeleton/"). - -### 2. One package per file style (Modern) - -A modern CL project should be in accordance with [some rules](http://labs.ariel-networks.com/cl-style-guide.html). For instance, one file must have one package in it. - -### 3. Recommends unit testing - -Modern projects should have some unit tests. CL-Project generates a system for unit testing, so you can begin writing unit tests as soon as the project is generated. - -## Parameters - -All parameters are optional. - -* `:name`: Project name. If this key isn't specified, the directory name will be used. -* `:description`: Short description for the new project. -* `:author`: Your name. -* `:email`: Your e-mail address. -* `:license`: License of the new project. -* `:depends-on`: A list of dependencies. - -## See Also -- [Rove](https://github.com/fukamachi/rove) - Testing framework - -## Author - -* Eitaro Fukamachi (e.arrows@gmail.com) - -## Copyright - -Copyright (c) 2011 Eitaro Fukamachi (e.arrows@gmail.com) - -## License - -Licensed under the LLGPL License. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/cl-project-test.asd b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/cl-project-test.asd deleted file mode 100644 index 6daee8f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/cl-project-test.asd +++ /dev/null @@ -1,17 +0,0 @@ -#| - This file is a part of CL-Project project. - Copyright (c) 2011 Eitaro Fukamachi (e.arrows@gmail.com) -|# - -(defsystem "cl-project-test" - :defsystem-depends-on ("prove-asdf") - :author "Eitaro Fukamachi" - :license "LLGPL" - :depends-on ("cl-project" - "prove" - "caveman2" - "uiop") - :components ((:module "tests" - :components - ((:test-file "cl-project")))) - :perform (test-op (op c) (symbol-call :prove-asdf :run-test-system c))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/cl-project.asd b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/cl-project.asd deleted file mode 100644 index ab18ba7..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/cl-project.asd +++ /dev/null @@ -1,33 +0,0 @@ -#| - This file is a part of CL-Project package. - URL: http://github.com/fukamachi/cl-project - Copyright (c) 2011 Eitaro Fukamachi - - CL-Project is freely distributable under the LLGPL License. -|# - -#| - Generate a skeleton for modern project - - Author: Eitaro Fukamachi (e.arrows@gmail.com) -|# - -(defsystem "cl-project" - :version "0.3.1" - :author "Eitaro Fukamachi" - :license "LLGPL" - :depends-on ("cl-emb" - "uiop" - "cl-ppcre" - "local-time" - "prove") - :components ((:module "src" - :components - ((:file "cl-project" :depends-on ("specials" "file" "skeleton")) - (:file "file" :depends-on ("specials" "io")) - (:file "skeleton" :depends-on ("specials" "file" "middleware")) - (:file "io" :depends-on ("specials")) - (:file "middleware" :depends-on ("file")) - (:file "specials")))) - :description "Generate a skeleton for modern project" - :in-order-to ((test-op (test-op "cl-project-test")))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/roswell/make-project.ros b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/roswell/make-project.ros deleted file mode 100644 index 996b91a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/roswell/make-project.ros +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/sh -#|-*- mode:lisp -*-|# -#| -exec ros -Q -- $0 "$@" -|# - -#| -A command-line interface for cl-project:make-project. -|# - -(ql:quickload '(:uiop :alexandria) :silent t) - -(import 'alexandria:starts-with-subseq) -(import 'alexandria:ensure-list) - -(defun help () - (format t "~&Usage: - make-project /home/user/common-lisp/sample --name sample --description \"sample project.\" --author \"Your name\" --license LLGPL --depends-on alexandria split-sequence~%")) - -(defun terminate (&optional message args) - (when message - (format *error-output* "~&Error: ~A~%" - (apply #'format nil (princ-to-string message) (ensure-list args)))) - (uiop:quit -1)) - -(defun parse-args (args) - (flet ((keyp (string) - (starts-with-subseq "--" string)) - (parse-value (value) - (or (ignore-errors - (let ((read-value (read-from-string value))) - (if (and (symbolp read-value) - (not (keywordp read-value))) - value - read-value))) - value))) - (let ((path (pop args))) - (when (starts-with-subseq "--" path) - (terminate "No path given.")) - (cons (pathname path) - (loop for index from 0 below (length args) - for first = (elt args index) - for rest = (subseq args (incf index)) - for key = (or (when (not (keyp first)) - (terminate "Invalid option: ~S" first)) - (intern (string-upcase (subseq first 2)) :keyword)) - for value = (if (eql key :depends-on) - (loop for (item . rest) on rest - collecting item - until (keyp (car rest)) - do (incf index)) - (parse-value (car rest))) - nconc (list key (parse-value value))))))) - -(defun main (&rest args) - (unless args - (help) - (terminate)) - - (ql:quickload :cl-project :silent t) - - (apply (intern (string :make-project) :cl-project) (parse-args args))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/.gitignore b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/.gitignore deleted file mode 100644 index 86123b5..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -*.fasl -*.dx32fsl -*.dx64fsl -*.lx32fsl -*.lx64fsl -*.x86f -*~ -.#* diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/README.markdown b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/README.markdown deleted file mode 100644 index 6038b8e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/README.markdown +++ /dev/null @@ -1,21 +0,0 @@ -# <%= (string-capitalize (getf env :name)) %><% @if description %> - <% @var description %><% @endif %> - -## Usage - -## Installation -<%- @if author %> - -## Author - -* <% @var author %><% @if email %> (<% @var email %>)<% @endif %> - -## Copyright - -Copyright (c) <%= (local-time:timestamp-year (local-time:now)) %> <% @var author %><% @if email %> (<% @var email %>)<% @endif %> -<%- @endif %> -<%- @if license %> - -## License - -Licensed under the <% @var license %> License. -<%- @endif %> diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/README.org b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/README.org deleted file mode 100644 index 3fc0b09..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/README.org +++ /dev/null @@ -1,21 +0,0 @@ -* <%= (string-capitalize (getf env :name)) %> <% @if description %> - <% @var description %><% @endif %> - -** Usage - -** Installation -<%- @if author %> - -** Author - -+ <% @var author %><% @if email %> (<% @var email %>)<% @endif %> - -** Copyright - -Copyright (c) <%= (local-time:timestamp-year (local-time:now)) %> <% @var author %><% @if email %> (<% @var email %>)<% @endif %> -<%- @endif %> -<%- @if license %> - -** License - -Licensed under the <% @var license %> License. -<%- @endif %> diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/skeleton.asd b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/skeleton.asd deleted file mode 100644 index 92ddf85..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/skeleton.asd +++ /dev/null @@ -1,24 +0,0 @@ -(defsystem "<% @var name %>" - :version "0.1.0" - :author "<% @var author %>" - :license "<% @var license %>" - :depends-on (<% (format t "~{\"~(~A~)\"~^~% ~}" - (getf env :depends-on)) %>) - :components ((:module "src" - :components - ((:file "main")))) - :description "<% @var description %>" - <%- @unless without-tests %> - :in-order-to ((test-op (test-op "<% @var name %>/tests"))) - <%- @endunless %>) - -(defsystem "<% @var name %>/tests" - :author "<% @var author %>" - :license "<% @var license %>" - :depends-on ("<% @var name %>" - "rove") - :components ((:module "tests" - :components - ((:file "main")))) - :description "Test system for <% @var name %>" - :perform (test-op (op c) (symbol-call :rove :run c))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/src/main.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/src/main.lisp deleted file mode 100644 index 377e4ae..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/src/main.lisp +++ /dev/null @@ -1,5 +0,0 @@ -(defpackage <% @var name %> - (:use :cl)) -(in-package :<% @var name %>) - -;; blah blah blah. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/tests/main.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/tests/main.lisp deleted file mode 100644 index 6d73ac4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/skeleton/tests/main.lisp +++ /dev/null @@ -1,11 +0,0 @@ -(defpackage <% @var name %>/tests/main - (:use :cl - :<% @var name %> - :rove)) -(in-package :<% @var name %>/tests/main) - -;; NOTE: To run this test file, execute `(asdf:test-system :<% @var name %>)' in your Lisp. - -(deftest test-target-1 - (testing "should (= 1 1) to be true" - (ok (= 1 1)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/cl-project.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/cl-project.lisp deleted file mode 100644 index af8645b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/cl-project.lisp +++ /dev/null @@ -1,40 +0,0 @@ -(in-package :cl-user) -(defpackage cl-project - (:use #:cl) - (:import-from #:cl-project.specials - #:*skeleton-directory* - #:*skeleton-parameters*) - (:import-from #:cl-project.skeleton - #:make-skeleton-from-directory) - (:import-from #:cl-project.file - #:generate) - (:export #:*skeleton-directory* - #:make-project - #:generate-skeleton)) -(in-package :cl-project) - -(defun make-project (path &rest params &key name description author email license depends-on (without-tests nil) &allow-other-keys) - "Generate a skeleton." - (declare (ignore name description author email license depends-on without-tests)) - (check-type path pathname) - - ;; Ensure `path' ends with a slash(/). - (setf path (uiop:ensure-directory-pathname path)) - - (unless (getf params :name) - (setf (getf params :name) - (car (last (pathname-directory path))))) - (let ((files (generate-skeleton - *skeleton-directory* - path - :env params))) - (dolist (file files) - (when (string= (pathname-type file) "asd") - (let ((dir (make-pathname :name nil :type nil :defaults file))) - (push dir asdf:*central-registry*))))) - t) - -(defun generate-skeleton (source-dir target-dir &key env) - "General skeleton generator." - (let ((*skeleton-parameters* env)) - (generate (make-skeleton-from-directory source-dir) target-dir))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/file.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/file.lisp deleted file mode 100644 index 1502cd7..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/file.lisp +++ /dev/null @@ -1,37 +0,0 @@ -(in-package :cl-user) -(defpackage cl-project.file - (:use #:cl - #:cl-project.specials) - (:import-from #:cl-project.io - #:copy-file-to-file) - (:import-from #:cl-ppcre - #:regex-replace-all) - (:export #:template-file - #:template-file-path - #:make-template-file - #:generate)) -(in-package :cl-project.file) - -(defclass template-file () - ((path :type pathname - :initarg :path - :accessor template-file-path))) - -(defun make-template-file (path) - (make-instance 'template-file :path path)) - -(defgeneric generate (file target-dir) - (:method ((file template-file) target-dir) - (let ((target-path - (merge-pathnames (template-file-path file) target-dir))) - (when (search "skeleton" (pathname-name target-path)) - (setf target-path - (make-pathname :name - (regex-replace-all "skeleton" - (pathname-name target-path) - (getf *skeleton-parameters* :name)) - :defaults target-path))) - (copy-file-to-file (merge-pathnames (template-file-path file) - *skeleton-directory*) - target-path) - (list target-path)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/io.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/io.lisp deleted file mode 100644 index 71e4f18..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/io.lisp +++ /dev/null @@ -1,17 +0,0 @@ -(in-package :cl-user) -(defpackage cl-project.io - (:use #:cl - #:cl-project.specials) - (:import-from #:cl-emb - #:execute-emb) - (:export #:copy-file-to-file)) -(in-package :cl-project.io) - -(defun copy-file-to-file (source-path target-path) - "Copy a file `source-path` to the `target-path`." - (format t "~&writing ~A~%" target-path) - (ensure-directories-exist target-path) - (with-open-file (stream target-path :direction :output :if-exists :supersede) - (write-sequence - (cl-emb:execute-emb source-path :env *skeleton-parameters*) - stream))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/middleware.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/middleware.lisp deleted file mode 100644 index f7dac0e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/middleware.lisp +++ /dev/null @@ -1,21 +0,0 @@ -(in-package :cl-user) -(defpackage cl-project.middleware - (:use #:cl) - (:import-from #:cl-project.file - #:template-file-path) - (:export #:*without-tests*)) -(in-package :cl-project.middleware) - -(defparameter *without-tests* - (lambda (app &key - (test-asd "skeleton-test.asd") - (test-directory #P"t/")) - (lambda (file) - (unless (or - ;; Skip test ASD file - (string= (file-namestring (template-file-path file)) - test-asd) - ;; Skip test files - (eql 0 (search (namestring test-directory) - (namestring (template-file-path file))))) - (funcall app file))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/skeleton.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/skeleton.lisp deleted file mode 100644 index 1ba90e1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/skeleton.lisp +++ /dev/null @@ -1,63 +0,0 @@ -(in-package :cl-user) -(defpackage cl-project.skeleton - (:use #:cl - #:cl-project.specials) - (:import-from #:cl-project.file - #:make-template-file - #:template-file-path - #:generate) - (:export #:skeleton - #:make-skeleton - #:make-skeleton-from-directory)) -(in-package :cl-project.skeleton) - -(defclass skeleton () - ((path :type pathname - :initarg :path - :accessor skeleton-path) - (children :type list - :initarg :children - :initform '() - :accessor skeleton-children))) - -(defun make-skeleton (path children) - (make-instance 'skeleton :path path :children children)) - -(defmethod generate ((skeleton skeleton) target-dir) - (let ((app (lambda (file) - (generate file target-dir)))) - (when (getf *skeleton-parameters* :without-tests) - (setf app - (funcall cl-project.middleware:*without-tests* - app))) - (mapcan app (skeleton-children skeleton)))) - -(defun maptree (fn path) - (flet ((directory-files (path) - ;; Older ASDF/UIOP's uiop:directory-files returns also directories on Linux. - ;; The bug had been fixed at ASDF 3.1.0.64 (https://bugs.launchpad.net/asdf/+bug/1276748), however, it's safe to filter directories anyway. - ;; ref. https://github.com/fukamachi/cl-project/pull/17 - (set-difference (uiop:directory-files path) - (uiop:subdirectories path) - :test #'equal))) - (if (uiop:file-pathname-p path) - ;; file - (list (funcall fn path)) - ;; directory - (append - (mapcar fn (directory-files path)) - (mapcan (lambda (subdir) - (maptree fn subdir)) - (uiop:subdirectories path)))))) - -(defun make-skeleton-from-directory (directory) - (flet ((relative-path (path) - (pathname - (subseq - (namestring path) - (length (namestring directory)))))) - (make-skeleton - directory - (maptree (lambda (file) - (make-template-file (relative-path file))) - directory)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/specials.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/specials.lisp deleted file mode 100644 index 8187601..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/src/specials.lisp +++ /dev/null @@ -1,15 +0,0 @@ -(in-package :cl-user) -(defpackage cl-project.specials - (:use #:cl) - (:export #:*default-skeleton-directory* - #:*skeleton-directory* - #:*skeleton-parameters*)) -(in-package :cl-project.specials) - -(defparameter *default-skeleton-directory* - (asdf:system-relative-pathname :cl-project #P"skeleton/")) - -(defvar *skeleton-directory* - *default-skeleton-directory*) - -(defvar *skeleton-parameters* nil) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/tests/cl-project.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/tests/cl-project.lisp deleted file mode 100644 index 5987f89..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/cl-project-20190521-git/tests/cl-project.lisp +++ /dev/null @@ -1,46 +0,0 @@ -#| - This file is a part of CL-Project project. - Copyright (c) 2011 Eitaro Fukamachi (e.arrows@gmail.com) -|# - -(in-package :cl-user) -(defpackage cl-project-test - (:use :cl - :cl-project - :prove)) -(in-package :cl-project-test) - -(plan 2) - -(defvar *sample-project-directory* - (asdf:system-relative-pathname - :cl-project - #p"t/cl-project-sample/")) - -(uiop:delete-directory-tree *sample-project-directory* :validate t :if-does-not-exist :ignore) - -(subtest "normal case" - (cl-project:make-project *sample-project-directory*) - (ok (uiop:directory-exists-p *sample-project-directory*) - "Sample project was generated") - (ok (asdf:load-system :cl-project-sample) - "Can load the new project")) - -(defvar *sample-caveman-directory* - (asdf:system-relative-pathname - :cl-project - #P"t/cl-project-caveman/")) - -(uiop:delete-directory-tree *sample-caveman-directory* :validate t :if-does-not-exist :ignore) - -(subtest "Caveman2" - (caveman2:make-project *sample-caveman-directory*) - (ok (uiop:directory-exists-p *sample-caveman-directory*) - "Sample project was generated") - #+quicklisp - (ok (ql:quickload :cl-project-caveman) - "Can load the new project") - #-quicklisp - (skip 1 "Can load the new project")) - -(finalize) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/LICENSE b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/LICENSE deleted file mode 100644 index dbeb15f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2012-2018,2019 Anton Vidovic - -Portions Copyright (c) 2018 Daniel Vedder -Portions Copyright (c) 2019 D4ryus - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/README b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/README deleted file mode 100644 index eacd3fe..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/README +++ /dev/null @@ -1,40 +0,0 @@ -croatoan is a set of bindings to the ncurses terminal library for -Common Lisp. - -It is inspired by, but not derived from, cl-ncurses and cl-charms. - -Its main goal is to provide a higher-level, lispy/CLOSy interface, -whereas the existing bindings clone the cryptic C API. - -As of now, the library is in an early, but hopefully usable stage. -Ncurses is old and huge and it will take a while to cover completely. - -The API is not yet stable. - -It is developed and tested on Ubuntu 16.04 x86_64 and SBCL 1.5.7. - -The only supported ncurses version is 6.x --with-abi-version=6. -Version 5.9 mostly works, but I will focus new efforts on 6.x. - -Since many popular distributions ship ncurses --with-abi-version=5, -for full compatibility (wide characters, 256 colors and extended -mouse support), you will have to manually build ncurses 6.x. - -The documentation is currently provided by the commented examples. - -You are welcome to contribute and any form of help would be greatly -appreciated. - --- - -Since ncurses is not thread-safe, all IO has to occur in the main -thread of the REPL running in a terminal. - -This makes it difficult to interact with ncurses from the Emacs SLIME -REPL which runs in its own thread. - -A workaround is to pass all ncurses IO to the main thread via a -thread-safe queue. Basic support for this has been implemented. - -A tutorial on interacting with ncurses from swank/slime is available -in docs/slime.md diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/croatoan-test.asd b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/croatoan-test.asd deleted file mode 100644 index 5434688..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/croatoan-test.asd +++ /dev/null @@ -1,19 +0,0 @@ -(asdf:defsystem :croatoan-test - :description "Tests and examples for the croatoan CLOS API and the low-level ncurses CFFI bindings." - :author "Anton Vidovic " - :licence "MIT" - :version "0.0.1" - :depends-on (:croatoan) - :components - ((:module "test" - :serial t - :components ((:file "package") - - ;; base %ncurses tests - (:file "ncurses") - (:file "unicode") - - ;; high-level clos api - (:file "clos") - (:file "tetris") - (:file "evolution"))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/croatoan.asd b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/croatoan.asd deleted file mode 100644 index 090f0ef..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/croatoan.asd +++ /dev/null @@ -1,116 +0,0 @@ -(asdf:defsystem :croatoan - :description "Common Lisp bindings for the ncurses terminal library." - :author "Anton Vidovic " - :licence "MIT" - :version "0.0.1" - :depends-on (:cffi :trivial-gray-streams :bordeaux-threads) - :components - - ;; Basic CFFI wrapper for libncursesw and libncurses - ((:module "ncurses" - :components - ((:file "package") - (:file "ncurses") - - ;; complete - (:file "addch") ; add a character (with attributes) to a curses window, then advance the cursor - (:file "add_wch") ; add a complex character and rendition to a curses window, then advance the cursor - (:file "addstr") ; add a string of characters to a curses window and advance cursor - (:file "attr") ; curses character and window attribute control routines - (:file "beep") ; curses bell and screen flash routines - (:file "bkgd") ; curses window background manipulation routines - (:file "bkgrnd") ; window complex background manipulation routines - (:file "border") ; create curses borders, horizontal and vertical lines - (:file "border_set") ; create curses borders or lines using complex characters and renditions - (:file "clear") ; clear all or part of a curses window - (:file "color") ; curses color manipulation routines - (:file "default_colors") ; use terminal's default colors - (:file "define_key") ; define a keycode - (:file "delch") ; delete character under the cursor in a curses window - (:file "deleteln") ; delete and insert lines in a curses window - (:file "extend") ; curses window properties - (:file "getch") ; get (or push back) characters from curses terminal keyboard - (:file "get_wch") ; get (or push back) a wide (multi-byte) character from curses terminal keyboard - (:file "getcchar") ; Get a wide character string and rendition from a cchar_t or set a cchar_t from a wide-character string - (:file "getstr") ; accept character strings from curses terminal keyboard - (:file "getyx") ; get curses cursor and window coordinates - (:file "inch") ; get a character and attributes from a curses window - (:file "in_wch") ; extract a wide (multi-byte) character and rendition from a window - (:file "insch") ; insert a character before cursor in a curses window - (:file "ins_wch") ; insert a complex character and rendition into a window - (:file "instr") ; get a string of characters from a curses window - (:file "inwstr") ; extract a string of wchar_t characters from a curses window - (:file "inchstr") ; get a string of characters (and attributes) from a curses window - (:file "insstr") ; insert string before cursor in a curses window - (:file "initscr") ; screen initialization and manipulation routines - (:file "inopts") ; curses input options - (:file "kernel") ; low-level curses routines - (:file "keybound") ; return definition of keycode - (:file "key_defined") ; check if a keycode is defined - (:file "legacy") ; get curses cursor and window coordinates, attributes - (:file "legacy_coding") ; legacy coding - (:file "mouse") ; mouse interface through curses - (:file "move") ; move curses window cursor - (:file "opaque") ; curses window properties - (:file "outopts") ; curses output options - (:file "pad") ; create and display curses pads - (:file "refresh") ; refresh curses windows and lines - (:file "resizeterm") ; change the curses terminal size - (:file "scroll") ; scroll a curses window - (:file "slk") ; curses soft label routines - (:file "termattrs") ; environment query routines - (:file "touch") ; curses refresh control routines - (:file "util") ; miscellaneous curses utility routines - (:file "variables") ; curses global variables - (:file "window") ; create curses windows - (:file "wresize"))) ; resize a curses window - - ;; CLOS api on top of CFFI ncurses. - (:module "src" - :depends-on ("ncurses") - :components - ((:file "package") - (:file "classes") - (:file "queue") - (:file "croatoan") - (:file "gray_streams") - (:file "utf8") - - (:file "addch") - (:file "add_wch") - (:file "addstr") - (:file "attr") - (:file "beep") - (:file "bkgd") - (:file "bkgrnd") ; window complex background manipulation routines - (:file "border") - (:file "border_set") ; create curses borders or lines using complex characters and renditions - (:file "clear") - (:file "color") - (:file "delch") - (:file "deleteln") - (:file "getch") - (:file "get_wch") - (:file "getstr") - (:file "initscr") - (:file "inopts") - (:file "inch") - (:file "in_wch") - (:file "inwstr") ; get a string of wide (multi-byte) characters from a curses window - (:file "inchstr") - (:file "insch") - (:file "ins_wch") ; insert a complex character and rendition into a window - (:file "insstr") - (:file "instr") - (:file "kernel") - (:file "mouse") - (:file "move") - (:file "panel") - (:file "refresh") - (:file "touch") - (:file "wresize") - - ;; Extension libraries - (:file "form") ; curses extension for programming forms - (:file "menu") ; curses extension for programming menus - (:file "shape"))))) ; curses extension for plotting shapes diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/doc/slime.md b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/doc/slime.md deleted file mode 100644 index 3e66d7e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/doc/slime.md +++ /dev/null @@ -1,137 +0,0 @@ -# Working with swank/slime - -Since ncurses is single threaded, it is only ever allowed to call -ncurses functions from the thread that initialized the screen. As this -thread must be the one controlling the terminal, ncurses must only -be called from the REPL prompt directly. With a recent enough croatoan -version, slime/swank does work though, but it requires a bit of extra -work. The following is an example of how one would work with croatoan -using slime/swank. First, a bit of boiler plate: - -``` -;; load croatoan and swank -(eval-when (:compile-toplevel :execute :load-toplevel) - (ql:quickload '(:croatoan :swank))) - -;; Defining a package is always a good idea -(defpackage #:scratch - (:use #:cl) - (:export #:main)) - -(in-package #:scratch) - -;; The main screen, we need a global so that we can access it from -;; slime -(defparameter *scr* nil) - -;; Main entry point, to be called from the terminal thread, it will -;; initialize the screen and enter the event loop -(defun main () - (croatoan:with-screen (scr - ;; Set input blocking to 100 ms. This _must_ - ;; be set for swank to work, otherwise - ;; get-event will block and croatoan only - ;; polls the job queue when a key is pressed. - :input-blocking 100 - ;; Do not override the swank debugger hook, - ;; as we want to enter the slime debugger in - ;; emacs when a error occurs. - :bind-debugger-hook nil) - ;; Set *scr* to the initilized scr so that we can access it form - ;; the swank thread and then enter the event-loop. - (croatoan:run-event-loop (setf *scr* scr)))) - -;; Initialize swank, setting dont-close will prevent the server from -;; shutting down in case slime disconnects. The default port is 4005, -;; one can specify a different one with :port. -(swank:create-server :dont-close t) - -;; Initialize screen and enter the event loop -(main) -``` - -This should be saved in a file and then loaded directly from sbcl (or -any other CL Implementation known to work with croatoan). For sbcl -this would be (when saved to `scratch.lisp`): - -``` -sbcl --load scratch.lisp -``` - -The user should now see a blank terminal window with the cursor placed -at the top left corner. Time to connect to it from slime, form within -emacs run: - -``` -M-x slime-connect -``` - -Once started, we need to change into the right package, do this by -entering (inside the SLIME repl): - -``` -CL-USER> (in-package :scratch) -``` - -To now run something inside the terminal thread one must use -`CROATOAN:SUBMIT`: - -``` -SCRATCH> (croatoan:submit (croatoan:add-string *scr* "Hey!")) -``` - -And voila, thats the basics of working with croatoan from slime! -The next thing one might want to do is set some keybindings, for -example, bind `c` to clear the screen: - -``` -SCRATCH> (croatoan:submit - (croatoan:bind *scr* #\c (lambda (win event) - (croatoan:clear *scr*)))) -``` - -And `q` to quit the event loop: - -``` -SCRATCH> (croatoan:submit - (croatoan:bind *scr* #\q 'croatoan:exit-event-loop)) -``` - -There is one caveat though, `*STANDARD-OUTPUT*` differs between the -swank and the terminal thread. It is set to the swank output stream -(which prints everything to the slime repl) inside the swank thread, -and bound to the terminal stdin/stdout inside the terminal -thread. Hence doing the following, would mess up the terminal screen -instead of printing to the slime repl: - -``` -SCRATCH> (croatoan:submit (format t "Hellou!~%")) -``` - -What we need is a way to refer to the swank stream, which can be easily -achieved by setting another global to whatever stream -`*STANDARD-OUTPUT*` points to inside the slime repl: - -``` -SCRATCH> (defparameter *swank-output* *standard-output*) -``` - -If we now run: - -``` -SCRATCH> (croatoan:submit (format *swank-output* "Hellou!~%")) -``` - -We should see `Hellou!` printed in the slime repl. - -This is quite helpful, especially when debugging something within the -terminal thread: - -``` -SCRATCH> (croatoan:submit - (croatoan:bind *scr* :resize - (lambda (win event) - (format *swank-output* "Terminal resized to width: ~a, height: ~a~%" - (croatoan:width win) - (croatoan:height win))))) -``` diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/add_wch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/add_wch.lisp deleted file mode 100644 index 746861e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/add_wch.lisp +++ /dev/null @@ -1,24 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; add_wch -;;; add a complex character and rendition to a curses window, then advance the cursor -;;; http://invisible-island.net/ncurses/man/curs_add_wch.3x.html - -;;; C prototypes - -;;; int add_wch(const cchar_t *wch); -;;; int wadd_wch(WINDOW *win, const cchar_t *wch); -;;; int mvadd_wch(int y, int x, const cchar_t *wch); -;;; int mvwadd_wch( WINDOW *win, int y, int x, const cchar_t *wch); -;;; int echo_wchar(const cchar_t *wch); -;;; int wecho_wchar(WINDOW *win, const cchar_t *wch); - -;;; Low-level CFFI wrappers - -(defcfun ("add_wch" %add-wch) :int (wch (:pointer (:struct cchar_t)))) -(defcfun ("wadd_wch" %wadd-wch) :int (win window) (wch (:pointer (:struct cchar_t)))) -(defcfun ("mvadd_wch" %mvadd-wch) :int (y :int) (x :int) (wch (:pointer (:struct cchar_t)))) -(defcfun ("mvwadd_wch" %mvwadd-wch) :int (win window) (y :int) (x :int) (wch (:pointer (:struct cchar_t)))) - -(defcfun ("echo_wchar" %echo-wchar) :int (wch (:pointer (:struct cchar_t)))) -(defcfun ("wecho_wchar" %wecho-wchar) :int (win window) (wch (:pointer (:struct cchar_t)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/addch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/addch.lisp deleted file mode 100644 index c265a4f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/addch.lisp +++ /dev/null @@ -1,25 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; addch -;;; add a character (with attributes) to a curses window, then advance the cursor -;;; http://invisible-island.net/ncurses/man/curs_addch.3x.html - -;;; C prototypes - -;; int addch(const chtype ch); -;; int waddch(WINDOW *win, const chtype ch); -;; int mvaddch(int y, int x, const chtype ch); -;; int mvwaddch(WINDOW *win, int y, int x, const chtype ch); -;; int echochar(const chtype ch); -;; int wechochar(WINDOW *win, const chtype ch); - -;;; Low-level CFFI wrappers - -(defcfun ("addch" %addch) :int (ch chtype)) -(defcfun ("waddch" %waddch) :int (win window) (ch chtype)) - -(defcfun ("mvaddch" %mvaddch) :int (y :int) (x :int) (ch chtype)) -(defcfun ("mvwaddch" %mvwaddch) :int (win window) (y :int) (x :int) (ch chtype)) - -(defcfun ("echochar" %echochar) :int (ch chtype)) -(defcfun ("wechochar" %wechochar) :int (win window) (ch chtype)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/addstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/addstr.lisp deleted file mode 100644 index 55036ba..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/addstr.lisp +++ /dev/null @@ -1,31 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; addstr -;;; add a string of characters to a curses window and advance cursor -;;; http://invisible-island.net/ncurses/man/curs_addstr.3x.html -;;; http://www.manpagez.com/man/3/curs_addstr/ - -;;; C prototypes - -;; int addstr(const char *str); -;; int addnstr(const char *str, int n); -;; int waddstr(WINDOW *win, const char *str); -;; int waddnstr(WINDOW *win, const char *str, int n); -;; int mvaddstr(int y, int x, const char *str); -;; int mvaddnstr(int y, int x, const char *str, int n); -;; int mvwaddstr(WINDOW *win, int y, int x, const char *str); -;; int mvwaddnstr(WINDOW *win, int y, int x, const char *str, int n); - -;;; Low-level CFFI wrappers - -(defcfun ("addstr" %addstr) :int (str :string)) -(defcfun ("addnstr" %addnstr) :int (str :string) (n :int)) - -(defcfun ("waddstr" %waddstr) :int (win window) (str :string)) -(defcfun ("waddnstr" %waddnstr) :int (win window) (str :string) (n :int)) - -(defcfun ("mvaddstr" %mvaddstr) :int (y :int) (x :int) (str :string)) -(defcfun ("mvaddnstr" %mvaddnstr) :int (y :int) (x :int) (str :string) (n :int)) - -(defcfun ("mvwaddstr" %mvwaddstr) :int (win window) (y :int) (x :int) (str :string)) -(defcfun ("mvwaddnstr" %mvwaddnstr) :int (win window) (y :int) (x :int) (str :string) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/attr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/attr.lisp deleted file mode 100644 index d1504ac..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/attr.lisp +++ /dev/null @@ -1,72 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; attr -;;; curses character and window attribute control routines -;;; http://invisible-island.net/ncurses/man/curs_attr.3x.html -;;; http://publib.boulder.ibm.com/infocenter/pseries/v5r3/topic/com.ibm.aix.genprogc/doc/genprogc/manip_video_attrs.htm - -;;; C prototypes - -;; int attroff(int attrs); -;; int wattroff(WINDOW *win, int attrs); -;; int attron(int attrs); -;; int wattron(WINDOW *win, int attrs); -;; int attrset(int attrs); -;; int wattrset(WINDOW *win, int attrs); - -;; int color_set(short color_pair_number, void* opts); -;; int wcolor_set(WINDOW *win, short color_pair_number, void* opts); - -;; int standend(void); -;; int wstandend(WINDOW *win); -;; int standout(void); -;; int wstandout(WINDOW *win); - -;; int attr_get(attr_t *attrs, short *pair, void *opts); -;; int wattr_get(WINDOW *win, attr_t *attrs, short *pair, void *opts); - -;; int attr_off(attr_t attrs, void *opts); -;; int wattr_off(WINDOW *win, attr_t attrs, void *opts); -;; int attr_on(attr_t attrs, void *opts); -;; int wattr_on(WINDOW *win, attr_t attrs, void *opts); - -;; int attr_set(attr_t attrs, short pair, void *opts); -;; int wattr_set(WINDOW *win, attr_t attrs, short pair, void *opts); - -;; int chgat(int n, attr_t attr, short color, const void *opts) -;; int wchgat(WINDOW *win, int n, attr_t attr, short color, const void *opts) -;; int mvchgat(int y, int x, int n, attr_t attr, short color, const void *opts) -;; int mvwchgat(WINDOW *win, int y, int x, int n, attr_t attr, short color, const void *opts) - -;;; Low-level CFFI wrappers - -;; :unsigned-int should be the same size as :uint32, 4 bytes, the size of a chtype. -(defcfun ("attroff" %attroff) :int (attrs :unsigned-int)) -(defcfun ("wattroff" %wattroff) :int (win window) (attrs :unsigned-int)) -(defcfun ("attron" %attron) :int (attrs :unsigned-int)) -(defcfun ("wattron" %wattron) :int (win window) (attrs :unsigned-int)) -(defcfun ("attrset" %attrset) :int (attrs :unsigned-int)) -(defcfun ("wattrset" %wattrset) :int (win window) (attrs :unsigned-int)) - -(defcfun ("color_set" %color-set) :int (color-pair-number :short) (opts (:pointer :void))) -(defcfun ("wcolor_set" %wcolor-set) :int (win window) (color-pair-number :short) (opts (:pointer :void))) - -(defcfun ("standend" %standend) :int) -(defcfun ("wstandend" %wstandend) :int (win window)) -(defcfun ("standout" %standout) :int) -(defcfun ("wstandout" %wstandout) :int (win window)) - -(defcfun ("attr_get" %attr-get) :int (attrs (:pointer attr)) (pair (:pointer :short)) (opts (:pointer :void))) -(defcfun ("wattr_get" %wattr-get) :int (win window) (attrs (:pointer attr)) (pair (:pointer :short)) (opts (:pointer :void))) - -(defcfun ("attr_off" %attr-off) :int (attrs attr) (opts (:pointer :void))) -(defcfun ("wattr_off" %wattr-off) :int (win window) (attrs attr) (opts (:pointer :void))) -(defcfun ("attr_on" %attr-on) :int (attrs attr) (opts (:pointer :void))) -(defcfun ("wattr_on" %wattr-on) :int (win window) (attrs attr) (opts (:pointer :void))) -(defcfun ("attr_set" %attr-set) :int (attrs attr) (pair :short) (opts (:pointer :void))) -(defcfun ("wattr_set" %wattr-set) :int (win window) (attrs attr) (pair :short) (opts (:pointer :void))) - -(defcfun ("chgat" %chgat) :int (n :int) (attr attr) (color :short) (opts (:pointer :void))) -(defcfun ("wchgat" %wchgat) :int (win window) (n :int) (attr attr) (color :short) (opts (:pointer :void))) -(defcfun ("mvchgat" %mvchgat) :int (y :int) (x :int) (n :int) (attr attr) (color :short) (opts (:pointer :void))) -(defcfun ("mvwchgat" %mvwchgat) :int (win window) (y :int) (x :int) (n :int) (attr attr) (color :short) (opts (:pointer :void))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/beep.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/beep.lisp deleted file mode 100644 index 96951cd..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/beep.lisp +++ /dev/null @@ -1,15 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; beep -;;; curses bell and screen flash routines -;;; http://invisible-island.net/ncurses/man/curs_beep.3x.html - -;;; C prototypes - -;; int beep(void); -;; int flash(void); - -;;; Low-level CFFI wrappers - -(defcfun ("beep" %beep) :int) -(defcfun ("flash" %flash) :int) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/bkgd.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/bkgd.lisp deleted file mode 100644 index 81c359a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/bkgd.lisp +++ /dev/null @@ -1,21 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; bkgd -;;; curses window background manipulation routines -;;; http://invisible-island.net/ncurses/man/curs_bkgd.3x.html - -;;; C prototypes - -;; void bkgdset(chtype ch); -;; void wbkgdset(WINDOW *win, chtype ch); -;; int bkgd(chtype ch); -;; int wbkgd(WINDOW *win, chtype ch); -;; chtype getbkgd(WINDOW *win); - -;;; Low-level CFFI wrappers - -(defcfun ("bkgdset" %bkgdset) :void (ch chtype)) -(defcfun ("wbkgdset" %wbkgdset) :void (win window) (ch chtype)) -(defcfun ("bkgd" %bkgd) :int (ch chtype)) -(defcfun ("wbkgd" %wbkgd) :int (win window) (ch chtype)) -(defcfun ("getbkgd" %getbkgd) chtype (win window)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/bkgrnd.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/bkgrnd.lisp deleted file mode 100644 index 66cd926..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/bkgrnd.lisp +++ /dev/null @@ -1,23 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; bkgrnd -;;; window complex background manipulation routines -;;; http://invisible-island.net/ncurses/man/curs_bkgrnd.3x.html - -;;; C prototypes - -;; int bkgrnd( const cchar_t *wch); -;; int wbkgrnd( WINDOW *win, const cchar_t *wch); -;; void bkgrndset(const cchar_t *wch ); -;; void wbkgrndset(WINDOW *win, const cchar_t *wch); -;; int getbkgrnd(cchar_t *wch); -;; int wgetbkgrnd(WINDOW *win, cchar_t *wch); - -;;; Low-level CFFI wrappers - -(defcfun ("bkgrnd" %bkgrnd) :int (wch (:pointer (:struct cchar_t)))) -(defcfun ("wbkgrnd" %wbkgrnd) :int (win window) (wch (:pointer (:struct cchar_t)))) -(defcfun ("bkgrndset" %bkgrndset) :void (wch (:pointer (:struct cchar_t)))) -(defcfun ("wbkgrndset" %wbkgrndset) :void (win window) (wch (:pointer (:struct cchar_t)))) -(defcfun ("getbkgrnd" %getbkgrnd) :int (wch (:pointer (:struct cchar_t)))) -(defcfun ("wgetbkgrnd" %wgetbkgrnd) :int (win window) (wch (:pointer (:struct cchar_t)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/border.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/border.lisp deleted file mode 100644 index fb76fd8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/border.lisp +++ /dev/null @@ -1,57 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; border -;;; create curses borders, horizontal and vertical lines -;;; http://invisible-island.net/ncurses/man/curs_border.3x.html -;;; http://linux.die.net/man/3/box - -;;; C prototypes - -;; int border(chtype ls, chtype rs, chtype ts, chtype bs, chtype tl, chtype tr, chtype bl, chtype br); -;; int wborder(WINDOW *win, chtype ls, chtype rs, chtype ts, chtype bs, chtype tl, chtype tr, chtype bl, chtype br); -;; int box(WINDOW *win, chtype verch, chtype horch); - -;; int hline(chtype ch, int n); -;; int whline(WINDOW *win, chtype ch, int n); -;; int vline(chtype ch, int n); -;; int wvline(WINDOW *win, chtype ch, int n); - -;; int mvhline(int y, int x, chtype ch, int n); -;; int mvwhline(WINDOW *, int y, int x, chtype ch, int n); -;; int mvvline(int y, int x, chtype ch, int n); -;; int mvwvline(WINDOW *, int y, int x, chtype ch, int n); - -;;; Low-level CFFI wrappers - -(defcfun ("border" %border) :int - (ls chtype) - (rs chtype) - (ts chtype) - (bs chtype) - (tl chtype) - (tr chtype) - (bl chtype) - (br chtype)) - -(defcfun ("wborder" %wborder) :int - (win window) - (ls chtype) - (rs chtype) - (ts chtype) - (bs chtype) - (tl chtype) - (tr chtype) - (bl chtype) - (br chtype)) - -(defcfun ("box" %box) :int (win window) (verch chtype) (horch chtype)) - -(defcfun ("hline" %hline) :int (ch chtype) (n :int)) -(defcfun ("whline" %whline) :int (win window) (ch chtype) (n :int)) -(defcfun ("vline" %vline) :int (ch chtype) (n :int)) -(defcfun ("wvline" %wvline) :int (win window) (ch chtype) (n :int)) - -(defcfun ("mvhline" %mvhline) :int (y :int) (x :int) (ch chtype) (n :int)) -(defcfun ("mvwhline" %mvwhline) :int (win window) (y :int) (x :int) (ch chtype) (n :int)) -(defcfun ("mvvline" %mvvline) :int (y :int) (x :int) (ch chtype) (n :int)) -(defcfun ("mvwvline" %mvwvline) :int (win window) (y :int) (x :int) (ch chtype) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/border_set.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/border_set.lisp deleted file mode 100644 index eac057b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/border_set.lisp +++ /dev/null @@ -1,60 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; border_set -;;; create curses borders or lines using complex characters and renditions -;;; http://invisible-island.net/ncurses/man/curs_border_set.3x.html - -;;; C prototypes - -;; int border_set(const cchar_t *ls, const cchar_t *rs, const cchar_t *ts, const cchar_t *bs, const cchar_t *tl, const cchar_t *tr, const cchar_t *bl, const cchar_t *br); -;; int wborder_set(WINDOW *win, const cchar_t *ls, const cchar_t *rs, const cchar_t *ts, const cchar_t *bs, const cchar_t *tl, const cchar_t *tr, const cchar_t *bl, const cchar_t *br); - -;; int box_set(WINDOW *win, const cchar_t *verch, const cchar_t *horch); - -;; int hline_set(const cchar_t *wch, int n); -;; int whline_set(WINDOW *win, const cchar_t *wch, int n); -;; int mvhline_set(int y, int x, const cchar_t *wch, int n); -;; int mvwhline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n); - -;; int vline_set(const cchar_t *wch, int n); -;; int wvline_set(WINDOW *win, const cchar_t *wch, int n); -;; int mvvline_set(int y, int x, const cchar_t *wch, int n); -;; int mvwvline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n); - -;;; Low-level CFFI wrappers - -(defcfun ("border_set" %border-set) :int - (ls (:pointer (:struct cchar_t))) - (rs (:pointer (:struct cchar_t))) - (ts (:pointer (:struct cchar_t))) - (bs (:pointer (:struct cchar_t))) - (tl (:pointer (:struct cchar_t))) - (tr (:pointer (:struct cchar_t))) - (bl (:pointer (:struct cchar_t))) - (br (:pointer (:struct cchar_t)))) - -(defcfun ("wborder_set" %wborder-set) :int - (win window) - (ls (:pointer (:struct cchar_t))) - (rs (:pointer (:struct cchar_t))) - (ts (:pointer (:struct cchar_t))) - (bs (:pointer (:struct cchar_t))) - (tl (:pointer (:struct cchar_t))) - (tr (:pointer (:struct cchar_t))) - (bl (:pointer (:struct cchar_t))) - (br (:pointer (:struct cchar_t)))) - -(defcfun ("box_set" %box-set) :int - (win window) - (verch (:pointer (:struct cchar_t))) - (horch (:pointer (:struct cchar_t)))) - -(defcfun ("hline_set" %hline-set) :int (wch (:pointer (:struct cchar_t))) (n :int)) -(defcfun ("whline_set" %whline-set) :int (win window) (wch (:pointer (:struct cchar_t))) (n :int)) -(defcfun ("mvhline_set" %mvhline-set) :int (y :int) (x :int) (wch (:pointer (:struct cchar_t))) (n :int)) -(defcfun ("mvwhline_set" %mvwhline-set) :int (win window) (y :int) (x :int) (wch (:pointer (:struct cchar_t))) (n :int)) - -(defcfun ("vline_set" %vline-set) :int (wch (:pointer (:struct cchar_t))) (n :int)) -(defcfun ("wvline_set" %wvline-set) :int (win window) (wch (:pointer (:struct cchar_t))) (n :int)) -(defcfun ("mvvline_set" %mvvline-set) :int (y :int) (x :int) (wch (:pointer (:struct cchar_t))) (n :int)) -(defcfun ("mvwvline_set" %mvwvline-set) :int (win window) (y :int) (x :int) (wch (:pointer (:struct cchar_t))) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/clear.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/clear.lisp deleted file mode 100644 index db9fc00..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/clear.lisp +++ /dev/null @@ -1,29 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; clear -;;; clear all or part of a curses window -;;; http://invisible-island.net/ncurses/man/curs_clear.3x.html -;;; http://linux.die.net/man/3/erase - -;;; C prototypes - -;; int erase(void); -;; int werase(WINDOW *win); -;; int clear(void); -;; int wclear(WINDOW *win); -;; int clrtobot(void); -;; int wclrtobot(WINDOW *win); -;; int clrtoeol(void); -;; int wclrtoeol(WINDOW *win); - -;;; Low-level CFFI wrappers - -(defcfun ("erase" %erase) :int) -(defcfun ("werase" %werase) :int (win window)) -(defcfun ("clear" %clear) :int) -(defcfun ("wclear" %wclear) :int (win window)) - -(defcfun ("clrtobot" %clrtobot) :int) -(defcfun ("wclrtobot" %wclrtobot) :int (win window)) -(defcfun ("clrtoeol" %clrtoeol) :int) -(defcfun ("wclrtoeol" %wclrtoeol) :int (win window)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/color.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/color.lisp deleted file mode 100644 index 35a2630..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/color.lisp +++ /dev/null @@ -1,56 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; color -;;; curses color manipulation routines -;;; http://invisible-island.net/ncurses/man/curs_color.3x.html -;;; http://linux.die.net/man/3/init_color - -;;; C prototypes - -;; int start_color(void); - -;; bool has_colors(void); -;; bool can_change_color(void); - -;; int init_pair(short pair, short f, short b); -;; int init_color(short color, short r, short g, short b); -;; int pair_content(short pair, short *f, short *b); -;; int color_content(short color, short *r, short *g, short *b); - -;; int init_extended_pair(int pair, int f, int b); -;; int init_extended_color(int color, int r, int g, int b); -;; int extended_pair_content(int pair, int *f, int *b); -;; int extended_color_content(int color, int *r, int *g, int *b); - -;;; C macros - -;; COLOR_PAIR(int n) -;; PAIR_NUMBER(attrs); - -;;; Low-level CFFI wrappers - -(defcfun ("start_color" %start-color) :int) -(defcfun ("has_colors" %has-colors) :boolean) -(defcfun ("can_change_color" %can-change-color) :boolean) - -(defcfun ("init_pair" %init-pair) :int (pair :short) (f :short) (b :short)) -(defcfun ("init_color" %init-color) :int (color :short) (r :short) (g :short) (b :short)) -(defcfun ("pair_content" %pair-content) :int (pair :short) (f (:pointer :short)) (b (:pointer :short))) -(defcfun ("color_content" %color-content) :int (color :short) (r (:pointer :short)) (g (:pointer :short)) (b (:pointer :short))) - -(defcfun ("init_extended_pair" %init-extended-pair) :int (pair :int) (f :int) (b :int)) -(defcfun ("init_extended_color" %init-extended-color) :int (color :int) (r :int) (g :int) (b :int)) -(defcfun ("extended_pair_content" %pair-extended-content) :int (pair :int) (f (:pointer :int)) (b (:pointer :int))) -(defcfun ("extended_color_content" %color-extended-content) :int (color :int) (r (:pointer :int)) (g (:pointer :int)) (b (:pointer :int))) - -(defcfun ("COLOR_PAIR" %color-pair) :int (n :int)) -(defcfun ("PAIR_NUMBER" %pair-number) :int (attrs :int)) - -(defconstant %COLOR-BLACK 0) -(defconstant %COLOR-RED 1) -(defconstant %COLOR-GREEN 2) -(defconstant %COLOR-YELLOW 3) -(defconstant %COLOR-BLUE 4) -(defconstant %COLOR-MAGENTA 5) -(defconstant %COLOR-CYAN 6) -(defconstant %COLOR-WHITE 7) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/default_colors.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/default_colors.lisp deleted file mode 100644 index 2ff96f1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/default_colors.lisp +++ /dev/null @@ -1,15 +0,0 @@ -(in-package :de.anvi.ncurses) - -;; default_colors -;; use terminal's default colors -;; http://invisible-island.net/ncurses/man/default_colors.3x.html - -;;; C prototypes - -;; int use_default_colors(void); -;; int assume_default_colors(int fg, int bg); - -;;; Low-level CFFI wrappers - -(defcfun ("use_default_colors" %use-default-colors) :int) -(defcfun ("assume_default_colors" %assume-default-colors) :int (fg :int) (bg :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/define_key.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/define_key.lisp deleted file mode 100644 index c09e495..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/define_key.lisp +++ /dev/null @@ -1,13 +0,0 @@ -(in-package :de.anvi.ncurses) - -;; define_key -;; define a keycode -;; http://invisible-island.net/ncurses/man/define_key.3x.html - -;;; C prototypes - -;; int define_key(const char *definition, int keycode); - -;;; Low-level CFFI wrappers - -(defcfun ("define_key" %define-key) :int (definition :string) (keycode :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/delch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/delch.lisp deleted file mode 100644 index 399c535..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/delch.lisp +++ /dev/null @@ -1,19 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; delch -;;; delete character under the cursor in a curses window -;;; http://invisible-island.net/ncurses/man/curs_delch.3x.html - -;;; C prototypes - -;; int delch(void); -;; int wdelch(WINDOW *win); -;; int mvdelch(int y, int x); -;; int mvwdelch(WINDOW *win, int y, int x); - -;;; Low-level CFFI wrappers - -(defcfun ("delch" %delch) :int) -(defcfun ("wdelch" %wdelch) :int (win window)) -(defcfun ("mvdelch" %mvdelch) :int (y :int) (x :int)) -(defcfun ("mvwdelch" %mvwdelch) :int (win window) (y :int) (x :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/deleteln.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/deleteln.lisp deleted file mode 100644 index a54903d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/deleteln.lisp +++ /dev/null @@ -1,23 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; deleteln -;;; delete and insert lines in a curses window -;;; http://invisible-island.net/ncurses/man/curs_deleteln.3x.html - -;;; C prototypes - -;; int deleteln(void); -;; int wdeleteln(WINDOW *win); -;; int insdelln(int n); -;; int winsdelln(WINDOW *win, int n); -;; int insertln(void); -;; int winsertln(WINDOW *win); - -;;; Low-level CFFI wrappers - -(defcfun ("deleteln" %deleteln) :int) -(defcfun ("wdeleteln" %wdeleteln) :int (win window)) -(defcfun ("insdelln" %insdelln) :int (n :int)) -(defcfun ("winsdelln" %winsdelln) :int (win window) (n :int)) -(defcfun ("insertln" %insertln) :int) -(defcfun ("winsertln" %winsertln) :int (win window)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/extend.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/extend.lisp deleted file mode 100644 index f98a599..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/extend.lisp +++ /dev/null @@ -1,15 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; extend -;;; miscellaneous curses extensions -;;; http://invisible-island.net/ncurses/man/curs_extend.3x.html - -;;; C prototypes - -;; const char * curses_version(void); -;; int use_extended_names(bool enable); - -;;; Low-level CFFI wrappers - -(defcfun ("curses_version" %curses-version) :string) -(defcfun ("use_extended_names" %use-extended-names) :int (enable :boolean)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/get_wch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/get_wch.lisp deleted file mode 100644 index e2b4432..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/get_wch.lisp +++ /dev/null @@ -1,21 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; get_wch -;;; get (or push back) a wide (multi-byte) character from curses terminal keyboard -;;; http://invisible-island.net/ncurses/man/curs_get_wch.3x.html - -;;; C prototypes - -;; int get_wch(wint_t *wch); -;; int wget_wch(WINDOW *win, wint_t *wch); -;; int mvget_wch(int y, int x, wint_t *wch); -;; int mvwget_wch(WINDOW *win, int y, int x, wint_t *wch); -;; int unget_wch(const wchar_t wch); - -;;; Low-level CFFI wrappers - -(defcfun ("get_wch" %get-wch) :int (wch (:pointer wint_t))) -(defcfun ("wget_wch" %wget-wch) :int (win window) (wch (:pointer wint_t))) -(defcfun ("mvget_wch" %mvget-wch) :int (y :int) (x :int) (wch (:pointer wint_t))) -(defcfun ("mvwget_wch" %mvwget-wch) :int (win window) (y :int) (x :int) (wch (:pointer wint_t))) -(defcfun ("unget_wch" %unget-wch) :int (wch wchar_t)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getcchar.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getcchar.lisp deleted file mode 100644 index dd637e3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getcchar.lisp +++ /dev/null @@ -1,26 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; getcchar -;;; Get a wide character string and rendition from a cchar_t or set a cchar_t from a wide-character string -;;; http://invisible-island.net/ncurses/man/curs_getcchar.3x.html - -;;; C prototypes - -;; int getcchar(const cchar_t *wcval, wchar_t *wch, attr_t *attrs, short *color_pair, void *opts); -;; int setcchar(cchar_t *wcval, const wchar_t *wch, const attr_t attrs, short color_pair, void *opts); - -;;; Low-level CFFI wrappers - -(defcfun ("getcchar" %getcchar) :int - (wcval (:pointer (:struct cchar_t))) - (wch (:pointer wchar_t)) - (attrs (:pointer attr)) - (color_pair (:pointer :short)) - (opts (:pointer :void))) - -(defcfun ("setcchar" %setcchar) :int - (wcval (:pointer (:struct cchar_t))) - (wch (:pointer wchar_t)) - (attrs attr) - (color_pair :short) - (opts (:pointer :void))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getch.lisp deleted file mode 100644 index 2de0e30..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getch.lisp +++ /dev/null @@ -1,25 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; getch -;;; get (or push back) characters from curses terminal keyboard -;;; http://invisible-island.net/ncurses/man/curs_getch.3x.html -;;; http://www.manpagez.com/man/3/curs_getch/ - -;;; C prototypes - -;; int getch(void); -;; int wgetch(WINDOW *win); -;; int mvgetch(int y, int x); -;; int mvwgetch(WINDOW *win, int y, int x); -;; int ungetch(int ch); -;; int has_key(int ch); - -;;; Low-level CFFI wrappers - -(defcfun ("getch" %getch) :int) -(defcfun ("wgetch" %wgetch) :int (win window)) -(defcfun ("mvgetch" %mvgetch) :int (y :int) (x :int)) -(defcfun ("mvwgetch" %mvwgetch) :int (win window) (y :int) (x :int)) - -(defcfun ("ungetch" %ungetch) :int (ch :int)) -(defcfun ("has_key" %has-key) :int (ch :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getstr.lisp deleted file mode 100644 index 973f64e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getstr.lisp +++ /dev/null @@ -1,27 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; getstr -;;; accept character strings from curses terminal keyboard -;;; http://invisible-island.net/ncurses/man/curs_getstr.3x.html - -;;; C prototypes - -;; int getstr(char *str); -;; int getnstr(char *str, int n); -;; int wgetstr(WINDOW *win, char *str); -;; int wgetnstr(WINDOW *win, char *str, int n); -;; int mvgetstr(int y, int x, char *str); -;; int mvgetnstr(int y, int x, char *str, int n); -;; int mvwgetstr(WINDOW *win, int y, int x, char *str); -;; int mvwgetnstr(WINDOW *, int y, int x, char *str, int n); - -;;; Low-level CFFI wrappers - -(defcfun ("getstr" %getstr) :int (str :string)) -(defcfun ("getnstr" %getnstr) :int (str :string) (n :int)) -(defcfun ("wgetstr" %wgetstr) :int (win window) (str :string)) -(defcfun ("wgetnstr" %wgetnstr) :int (win window) (str :string) (n :int)) -(defcfun ("mvgetstr" %mvgetstr) :int (y :int) (x :int) (str :string)) -(defcfun ("mvgetnstr" %mvgetnstr) :int (y :int) (x :int) (str :string) (n :int)) -(defcfun ("mvwgetstr" %mvwgetstr) :int (win window) (y :int) (x :int) (str :string)) -(defcfun ("mvwgetnstr" %mvwgetnstr) :int (win window) (y :int) (x :int) (str :string) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getyx.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getyx.lisp deleted file mode 100644 index 933e0ff..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getyx.lisp +++ /dev/null @@ -1,42 +0,0 @@ -;; (in-package :de.anvi.ncurses) - -;;; getyx -;;; get curses cursor and window coordinates -;;; http://invisible-island.net/ncurses/man/curs_getyx.3x.html - -;;; C prototypes - -;; void getyx(WINDOW *win, int y, int x); -;; void getparyx(WINDOW *win, int y, int x); -;; void getbegyx(WINDOW *win, int y, int x); -;; void getmaxyx(WINDOW *win, int y, int x); - -;;; Low-level CFFI wrappers - -;; see legacy.lisp - -;;; NOTES - -#| - -These four C macros are defined in terms of other, simpler macros: - -#define getyx(win,y,x) (y = getcury(win), x = getcurx(win)) -#define getbegyx(win,y,x) (y = getbegy(win), x = getbegx(win)) -#define getmaxyx(win,y,x) (y = getmaxy(win), x = getmaxx(win)) -#define getparyx(win,y,x) (y = getpary(win), x = getparx(win)) - -And those simpler macros are just accessing the window struct. - -#define getcurx(win) ((win) ? (win)->_curx : ERR) -#define getcury(win) ((win) ? (win)->_cury : ERR) -#define getbegx(win) ((win) ? (win)->_begx : ERR) -#define getbegy(win) ((win) ? (win)->_begy : ERR) -#define getmaxx(win) ((win) ? ((win)->_maxx + 1) : ERR) -#define getmaxy(win) ((win) ? ((win)->_maxy + 1) : ERR) -#define getparx(win) ((win) ? (win)->_parx : ERR) -#define getpary(win) ((win) ? (win)->_pary : ERR) - -Those are defined as low-level functions in legacy.lisp. - -|# diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/in_wch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/in_wch.lisp deleted file mode 100644 index 82d0ba7..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/in_wch.lisp +++ /dev/null @@ -1,19 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; in_wch -;;; extract a wide (multi-byte) character and rendition from a window -;;; http://invisible-island.net/ncurses/man/curs_in_wch.3x.html - -;;; C prototypes - -;; int in_wch(cchar_t *wcval); -;; int mvin_wch(int y, int x, cchar_t *wcval); -;; int win_wch(WINDOW *win, cchar_t *wcval); -;; int mvwin_wch(WINDOW *win, int y, int x, cchar_t *wcval); - -;;; Low-level CFFI wrappers - -(defcfun ("in_wch" %in-wch) :int (wcval (:pointer (:struct cchar_t)))) -(defcfun ("mvin_wch" %mvin-wch) :int (y :int) (x :int) (wcval (:pointer (:struct cchar_t)))) -(defcfun ("win_wch" %win-wch) :int (win window) (wcval (:pointer (:struct cchar_t)))) -(defcfun ("mvwin_wch" %mvwin-wch) :int (win window) (y :int) (x :int) (wcval (:pointer (:struct cchar_t)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inch.lisp deleted file mode 100644 index 5604677..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inch.lisp +++ /dev/null @@ -1,19 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; inch -;;; get a character and attributes from a curses window -;;; http://invisible-island.net/ncurses/man/curs_inch.3x.html - -;;; C prototypes - -;; chtype inch(void); -;; chtype winch(WINDOW *win); -;; chtype mvinch(int y, int x); -;; chtype mvwinch(WINDOW *win, int y, int x); - -;;; Low-level CFFI wrappers - -(defcfun ("inch" %inch) chtype) -(defcfun ("winch" %winch) chtype (win window)) -(defcfun ("mvinch" %mvinch) chtype (y :int) (x :int)) -(defcfun ("mvwinch" %mvwinch) chtype (win window) (y :int) (x :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inchstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inchstr.lisp deleted file mode 100644 index 8be601c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inchstr.lisp +++ /dev/null @@ -1,27 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; inchstr -;;; get a string of characters (and attributes) from a curses window -;;; http://invisible-island.net/ncurses/man/curs_inchstr.3x.html - -;;; C prototypes - -;; int inchstr(chtype *chstr); -;; int inchnstr(chtype *chstr, int n); -;; int winchstr(WINDOW *win, chtype *chstr); -;; int winchnstr(WINDOW *win, chtype *chstr, int n); -;; int mvinchstr(int y, int x, chtype *chstr); -;; int mvinchnstr(int y, int x, chtype *chstr, int n); -;; int mvwinchstr(WINDOW *win, int y, int x, chtype *chstr); -;; int mvwinchnstr(WINDOW *win, int y, int x, chtype *chstr, int n); - -;;; Low-level CFFI wrappers - -(defcfun ("inchstr" %inchstr) :int (chstr (:pointer chtype))) -(defcfun ("inchnstr" %inchnstr) :int (chstr (:pointer chtype)) (n :int)) -(defcfun ("winchstr" %winchstr) :int (win window) (chstr (:pointer chtype))) -(defcfun ("winchnstr" %winchnstr) :int (win window) (chstr (:pointer chtype)) (n :int)) -(defcfun ("mvinchstr" %mvinchstr) :int (y :int) (x :int) (chstr (:pointer chtype))) -(defcfun ("mvinchnstr" %mvinchnstr) :int (y :int) (x :int) (chstr (:pointer chtype)) (n :int)) -(defcfun ("mvwinchstr" %mvwinchstr) :int (win window) (y :int) (x :int) (chstr (:pointer chtype))) -(defcfun ("mvwinchnstr" %mvwinchnstr) :int (win window) (y :int) (x :int) (chstr (:pointer chtype)) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/initscr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/initscr.lisp deleted file mode 100644 index 23ceeb2..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/initscr.lisp +++ /dev/null @@ -1,24 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; initscr -;;; screen initialization and manipulation routines -;;; http://invisible-island.net/ncurses/man/curs_initscr.3x.html -;;; http://www.manpagez.com/man/3/curs_initscr/ - -;;; C prototypes - -;; WINDOW *initscr(void); -;; int endwin(void); -;; bool isendwin(void); -;; SCREEN *newterm(char *type, FILE *outfd, FILE *infd); -;; SCREEN *set_term(SCREEN *new); -;; void delscreen(SCREEN *sp); - -;;; Low-level CFFI wrappers - -(defcfun ("initscr" %initscr) window) -(defcfun ("endwin" %endwin) :int) -(defcfun ("isendwin" %isendwin) :boolean) -(defcfun ("newterm" %newterm) screen (type :string) (outfd file) (infd file)) -(defcfun ("set_term" %set-term) screen (new screen)) -(defcfun ("delscreen" %delscreen) :void (sp screen)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inopts.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inopts.lisp deleted file mode 100644 index 2cfb420..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inopts.lisp +++ /dev/null @@ -1,45 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; inopts -;;; curses input options -;;; http://invisible-island.net/ncurses/man/curs_inopts.3x.html - -;;; C prototypes - -;; int cbreak(void); -;; int nocbreak(void); -;; int echo(void); -;; int noecho(void); -;; int halfdelay(int tenths); -;; int intrflush(WINDOW *win, bool bf); -;; int keypad(WINDOW *win, bool bf); -;; int meta(WINDOW *win, bool bf); -;; int nodelay(WINDOW *win, bool bf); -;; int raw(void); -;; int noraw(void); -;; void noqiflush(void); -;; void qiflush(void); -;; int notimeout(WINDOW *win, bool bf); -;; void timeout(int delay); -;; void wtimeout(WINDOW *win, int delay); -;; int typeahead(int fd); - -;;; Low-level CFFI wrappers - -(defcfun ("cbreak" %cbreak) :int) -(defcfun ("nocbreak" %nocbreak) :int) -(defcfun ("echo" %echo) :int) -(defcfun ("noecho" %noecho) :int) -(defcfun ("halfdelay" %halfdelay) :int (tenths :int)) -(defcfun ("intrflush" %intrflush) :int (win window) (bf :boolean)) -(defcfun ("keypad" %keypad) :int (win window) (bf :boolean)) -(defcfun ("meta" %meta) :int (win window) (bf :boolean)) -(defcfun ("nodelay" %nodelay) :int (win window) (bf :boolean)) -(defcfun ("raw" %raw) :int) -(defcfun ("noraw" %noraw) :int) -(defcfun ("noqiflush" %noqiflush) :void) -(defcfun ("qiflush" %qiflush) :void) -(defcfun ("notimeout" %notimeout) :int (win window) (bf :boolean)) -(defcfun ("timeout" %timeout) :void (delay :int)) -(defcfun ("wtimeout" %wtimeout) :void (win window) (delay :int)) -(defcfun ("typeahead" %typeahead) :int (fd :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/ins_wch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/ins_wch.lisp deleted file mode 100644 index b9b5b5c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/ins_wch.lisp +++ /dev/null @@ -1,19 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; ins_wch -;;; insert a complex character and rendition into a window -;;; http://invisible-island.net/ncurses/man/curs_ins_wch.3x.html - -;;; C prototypes - -;; int ins_wch(const cchar_t *wch); -;; int wins_wch(WINDOW *win, const cchar_t *wch); -;; int mvins_wch(int y, int x, const cchar_t *wch); -;; int mvwins_wch(WINDOW *win, int y, int x, const cchar_t *wch); - -;;; Low-level CFFI wrappers - -(defcfun ("ins_wch" %ins-wch) :int (wch (:pointer (:struct cchar_t)))) -(defcfun ("wins_wch" %wins-wch) :int (win window) (wch (:pointer (:struct cchar_t)))) -(defcfun ("mvins_wch" %mvins-wch) :int (y :int) (x :int) (wch (:pointer (:struct cchar_t)))) -(defcfun ("mvwins_wch" %mvwins-wch) :int (win window) (y :int) (x :int) (wch (:pointer (:struct cchar_t)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/insch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/insch.lisp deleted file mode 100644 index d966828..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/insch.lisp +++ /dev/null @@ -1,19 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; insch -;;; insert a character before cursor in a curses window -;;; http://invisible-island.net/ncurses/man/curs_insch.3x.html - -;;; C prototypes - -;; int insch(chtype ch); -;; int winsch(WINDOW *win, chtype ch); -;; int mvinsch(int y, int x, chtype ch); -;; int mvwinsch(WINDOW *win, int y, int x, chtype ch); - -;;; Low-level CFFI wrappers - -(defcfun ("insch" %insch) :int (ch chtype)) -(defcfun ("winsch" %winsch) :int (win window) (ch chtype)) -(defcfun ("mvinsch" %mvinsch) :int (y :int) (x :int) (ch chtype)) -(defcfun ("mvwinsch" %mvwinsch) :int (win window) (y :int) (x :int) (ch chtype)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/insstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/insstr.lisp deleted file mode 100644 index c0f3f18..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/insstr.lisp +++ /dev/null @@ -1,27 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; insstr -;;; insert string before cursor in a curses window -;;; http://invisible-island.net/ncurses/man/curs_insstr.3x.html - -;;; C prototypes - -;; int insstr(const char *str); -;; int insnstr(const char *str, int n); -;; int winsstr(WINDOW *win, const char *str); -;; int winsnstr(WINDOW *win, const char *str, int n); -;; int mvinsstr(int y, int x, const char *str); -;; int mvinsnstr(int y, int x, const char *str, int n); -;; int mvwinsstr(WINDOW *win, int y, int x, const char *str); -;; int mvwinsnstr(WINDOW *win, int y, int x, const char *str, int n); - -;;; Low-level CFFI wrappers - -(defcfun ("insstr" %insstr) :int (str :string)) -(defcfun ("insnstr" %insnstr) :int (str :string) (n :int)) -(defcfun ("winsstr" %winsstr) :int (win window) (str :string)) -(defcfun ("winsnstr" %winsnstr) :int (win window) (str :string) (n :int)) -(defcfun ("mvinsstr" %mvinsstr) :int (y :int) (x :int) (str :string)) -(defcfun ("mvinsnstr" %mvinsnstr) :int (y :int) (x :int) (str :string) (n :int)) -(defcfun ("mvwinsstr" %mvwinsstr) :int (win window) (y :int) (x :int) (str :string)) -(defcfun ("mvwinsnstr" %mvwinsnstr) :int (win window) (y :int) (x :int) (str :string) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/instr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/instr.lisp deleted file mode 100644 index e15b7b9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/instr.lisp +++ /dev/null @@ -1,27 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; instr -;;; get a string of characters from a curses window -;;; http://invisible-island.net/ncurses/man/curs_instr.3x.html - -;;; C prototypes - -;; int instr(char *str); -;; int innstr(char *str, int n); -;; int winstr(WINDOW *win, char *str); -;; int winnstr(WINDOW *win, char *str, int n); -;; int mvinstr(int y, int x, char *str); -;; int mvinnstr(int y, int x, char *str, int n); -;; int mvwinstr(WINDOW *win, int y, int x, char *str); -;; int mvwinnstr(WINDOW *win, int y, int x, char *str, int n); - -;;; Low-level CFFI wrappers - -(defcfun ("instr" %instr) :int (str :string)) -(defcfun ("innstr" %innstr) :int (str :string) (n :int)) -(defcfun ("winstr" %winstr) :int (win window) (str :string)) -(defcfun ("winnstr" %winnstr) :int (win window) (str :string) (n :int)) -(defcfun ("mvinstr" %mvinstr) :int (y :int) (x :int) (str :string)) -(defcfun ("mvinnstr" %mvinnstr) :int (y :int) (x :int) (str :string) (n :int)) -(defcfun ("mvwinstr" %mvwinstr) :int (win window) (y :int) (x :int) (str :string)) -(defcfun ("mvwinnstr" %mvwinnstr) :int (win window) (y :int) (x :int) (str :string) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inwstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inwstr.lisp deleted file mode 100644 index 856ec34..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inwstr.lisp +++ /dev/null @@ -1,27 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; inwstr -;;; extract a string of wchar_t characters from a curses window -;;; http://invisible-island.net/ncurses/man/curs_inwstr.3x.html - -;;; C prototypes - -;; int inwstr(wchar_t *str); -;; int innwstr(wchar_t *str, int n); -;; int winwstr(WINDOW *win, wchar_t *str); -;; int winnwstr(WINDOW *win, wchar_t *str, int n); -;; int mvinwstr(int y, int x, wchar_t *str); -;; int mvinnwstr(int y, int x, wchar_t *str, int n); -;; int mvwinwstr(WINDOW *win, int y, int x, wchar_t *str); -;; int mvwinnwstr(WINDOW *win, int y, int x, wchar_t *str, int n); - -;;; Low-level CFFI wrappers - -(defcfun ("inwstr" %inwstr) :int (str (:pointer wchar_t))) -(defcfun ("innwstr" %innwstr) :int (str (:pointer wchar_t)) (n :int)) -(defcfun ("winwstr" %winwstr) :int (win window) (str (:pointer wchar_t))) -(defcfun ("winnwstr" %winnwstr) :int (win window) (str (:pointer wchar_t)) (n :int)) -(defcfun ("mvinwstr" %mvinwstr) :int (y :int) (x :int) (str (:pointer wchar_t))) -(defcfun ("mvinnwstr" %mvinnwstr) :int (y :int) (x :int) (str (:pointer wchar_t)) (n :int)) -(defcfun ("mvwinwstr" %mvwinwstr) :int (win window) (y :int) (x :int) (str (:pointer wchar_t))) -(defcfun ("mvwinnwstr" %mvwinnwstr) :int (win window) (y :int) (x :int) (str (:pointer wchar_t)) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/kernel.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/kernel.lisp deleted file mode 100644 index 3cf8fdc..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/kernel.lisp +++ /dev/null @@ -1,33 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; kernel -;;; low-level curses routines -;;; http://invisible-island.net/ncurses/man/curs_kernel.3x.html - -;;; C prototypes - -;; int def_prog_mode(void); -;; int def_shell_mode(void); -;; int reset_prog_mode(void); -;; int reset_shell_mode(void); -;; int resetty(void); -;; int savetty(void); -;; void getsyx(int y, int x); -;; void setsyx(int y, int x); -;; int ripoffline(int line, int (*init)(WINDOW *, int)); -;; int curs_set(int visibility); -;; int napms(int ms); - -;;; Low-level CFFI wrappers - -(defcfun ("def_prog_mode" %def-prog-mode) :int) -(defcfun ("def_shell_mode" %def-shell-mode) :int) -(defcfun ("reset_prog_mode" %reset-prog-mode) :int) -(defcfun ("reset_shell_mode" %reset-shell-mode) :int) -(defcfun ("resetty" %resetty) :int) -(defcfun ("savetty" %savetty) :int) -(defcfun ("getsyx" %getsyx) :void (y :int) (x :int)) -(defcfun ("setsyx" %setsyx) :void (y :int) (x :int)) -(defcfun ("ripoffline" %ripoffline) :int (line :int) (init :pointer)) -(defcfun ("curs_set" %curs-set) :int (visibility :int)) -(defcfun ("napms" %napms) :int (ms :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/key_defined.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/key_defined.lisp deleted file mode 100644 index 485bfef..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/key_defined.lisp +++ /dev/null @@ -1,13 +0,0 @@ -(in-package :de.anvi.ncurses) - -;; key_defined -;; check if a keycode is defined -;; http://invisible-island.net/ncurses/man/key_defined.3x.html - -;;; C prototypes - -;; int key_defined(const char *definition); - -;;; Low-level CFFI wrappers - -(defcfun ("key_defined" %key-defined) :int (definition :string)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/keybound.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/keybound.lisp deleted file mode 100644 index 95c1788..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/keybound.lisp +++ /dev/null @@ -1,13 +0,0 @@ -(in-package :de.anvi.ncurses) - -;; keybound -;; return definition of keycode -;; http://invisible-island.net/ncurses/man/keybound.3x.html - -;;; C prototypes - -;; char *keybound(int keycode, int count); - -;;; Low-level CFFI wrappers - -(defcfun ("keybound" %keybound) :string (keycode :int) (count :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/legacy.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/legacy.lisp deleted file mode 100644 index bf66e31..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/legacy.lisp +++ /dev/null @@ -1,28 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; legacy -;;; get curses cursor and window coordinates, attributes -;;; http://invisible-island.net/ncurses/man/curs_legacy.3x.html - -;;; C prototypes - -;; int getattrs(WINDOW *win); -;; int getbegx(WINDOW *win); -;; int getbegy(WINDOW *win); -;; int getcurx(WINDOW *win); -;; int getcury(WINDOW *win); -;; int getmaxx(WINDOW *win); -;; int getmaxy(WINDOW *win); -;; int getparx(WINDOW *win); -;; int getpary(WINDOW *win); - -;;; Low-level CFFI wrappers - -(defcfun ("getbegx" %getbegx) :int (win window)) -(defcfun ("getbegy" %getbegy) :int (win window)) -(defcfun ("getcurx" %getcurx) :int (win window)) -(defcfun ("getcury" %getcury) :int (win window)) -(defcfun ("getmaxx" %getmaxx) :int (win window)) -(defcfun ("getmaxy" %getmaxy) :int (win window)) -(defcfun ("getparx" %getparx) :int (win window)) -(defcfun ("getpary" %getpary) :int (win window)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/legacy_coding.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/legacy_coding.lisp deleted file mode 100644 index 9348165..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/legacy_coding.lisp +++ /dev/null @@ -1,12 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; legacy coding -;;; http://invisible-island.net/ncurses/man/legacy_coding.3x.html - -;;; C prototypes - -;; int use_legacy_coding(int level); - -;;; Low-level CFFI wrappers - -(defcfun ("use_legacy_coding" %use-legacy-coding) :int (level :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/mouse.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/mouse.lisp deleted file mode 100644 index 1dec87e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/mouse.lisp +++ /dev/null @@ -1,24 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; mouse -;;; mouse interface through curses -;;; http://invisible-island.net/ncurses/man/curs_mouse.3x.html - -;;; C prototypes - -;;; bool has_mouse(void); -;;; int getmouse(MEVENT *event); -;;; int ungetmouse(MEVENT *event); -;;; mmask_t mousemask(mmask_t newmask, mmask_t *oldmask); -;;; bool wenclose(const WINDOW *win, int y, int x); -;;; bool mouse_trafo(int* pY, int* pX, bool to_screen); -;;; bool wmouse_trafo(const WINDOW* win, int* pY, int* pX, bool to_screen); -;;; int mouseinterval(int erval); - -;;; Low-level CFFI wrappers - -(defcfun ("getmouse" %getmouse) :int (event (:pointer (:struct mevent)))) -(defcfun ("mousemask" %mousemask) mmask_t (newmask mmask_t) (oldmask (:pointer mmask_t))) - -(defcfun ("has_mouse" %has-mouse) :boolean) -(defcfun ("ungetmouse" %ungetmouse) :int (event (:pointer (:struct mevent)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/move.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/move.lisp deleted file mode 100644 index e8fe418..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/move.lisp +++ /dev/null @@ -1,16 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; move -;;; move curses window cursor -;;; http://invisible-island.net/ncurses/man/curs_move.3x.html -;;; http://www.manpagez.com/man/3/curs_move/ - -;;; C prototypes - -;; int move(int y, int x); -;; int wmove(WINDOW *win, int y, int x); - -;;; Low-level CFFI wrappers - -(defcfun ("move" %move) :int (y :int) (x :int)) -(defcfun ("wmove" %wmove) :int (win window) (y :int) (x :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/ncurses.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/ncurses.lisp deleted file mode 100644 index 24e7d9b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/ncurses.lisp +++ /dev/null @@ -1,213 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; ncurses -;;; CRT screen handling and optimization package -;;; http://invisible-island.net/ncurses/man/ncurses.3x.html - -;; The wide multi-byte library is preferred and will be loaded when the underlying lisp system supports unicode. -#+(or sb-unicode unicode openmcl-unicode-strings) -(define-foreign-library libncursesw - (:darwin (:or "libncursesw.6.dylib" "libncursesw.5.dylib" "libncursesw.dylib" "libcurses.dylib")) - (:unix (:or "libncursesw.so.6.1" "libncursesw.so.6.0" "libncursesw.so.6" "libncursesw.so.5.9" "libncursesw.so.5" "libncursesw.so")) - (t (:default "libncursesw"))) - -#+(or sb-unicode unicode openmcl-unicode-strings) -(use-foreign-library libncursesw) - -;; Attempt to use the legacy single-byte library only when the lisp implementation doesnt support unicode. -#-(or sb-unicode unicode openmcl-unicode-strings) -(define-foreign-library libncurses - (:darwin (:or "libncurses.6.dylib" "libncurses.5.dylib" "libncurses.dylib" "libcurses.dylib")) - (:unix (:or "libncurses.so.6.1" "libncurses.so.6.0" "libncurses.so.6" "libncurses.so.5.9" "libncurses.so.5" "libncurses.so")) - (t (:default "libncurses"))) - -#-(or sb-unicode unicode openmcl-unicode-strings) -(use-foreign-library libncurses) - -;;; ------------------------------------------------------------------ - -;; Every function that can take a win, should take a win. -;; We dont want functions that implicitly operate on a global stdscr. - -;; Function should return lisp-style bools, not C type int 0 or 1. -;; cffi automatically does this conversion. - -;;; ------------------------------------------------------------------ - -;; General ncurses library implementation info: - -;; data types: - -;; http://pubs.opengroup.org/onlinepubs/7908799/xcurses/curses.h.html -;; http://pubs.opengroup.org/onlinepubs/7908799/xcurses/implement.html -;; http://pubs.opengroup.org/onlinepubs/7908799/cursesix.html - -;; http://refspecs.linuxbase.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/libncurses.html -;; http://refspecs.linuxbase.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/libncurses-ddefs.html - -;; http://h71000.www7.hp.com/doc/83final/5763/5763pro_016.html - -;; http://docs.python.org/release/2.4.3/lib/curses-window-objects.html - -;; http://web.ist.utl.pt/tiago.dionizio/lua/lcurses.html - -;;; ------------------------------------------------------------------ - -;;; Types - -;; Basic types as seen in the ncurses function prototypes. -;; These will only be used inside cffi wrappers. - -;; not used, cffi automatically translates a boolean type -;; typedef unsigned char bool; -(defctype bool :unsigned-char) - -#| ---enable-lp64 -Allows an application to define _LP64 to declare chtype and mmask_t as -simply unsigned rather than the configured types -using the --with-chtype and --with-mmask_t options. - -#if 1 && defined(_LP64) -typedef unsigned chtype; -typedef unsigned mmask_t; -#else -typedef uint32_t chtype; -typedef uint32_t mmask_t; -#endif -|# - -;; default ubuntu build options, they build for API5. -;; --disable-lp64 --with-chtype='long' --with-mmask-t='long' - -;; the default type on ubuntu isnt "unsigned int" but "long", which means signed long. - -;; We will use the ABI6 default uint32_t instead of long. - -;; TODO: use ABI6 values for chtype, cchar_t and mmask: --with-chtype=uint32_t -;;(defctype chtype :unsigned-int) -(defctype chtype :uint32) - -;; wide character type, defined in: -;; /usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h -;; it has to be able to contain the 21-bit 10FFFF, which is the max allowed unicode point. -(defctype wchar_t :int32) - -;; typedef unsigned int wint_t; -;; used in get_wch.lisp -;; wint_t needs to be a signed int to represent a negative WEOF value. -(defctype wint_t :int32) - -;; typedef chtype attr_t; -;; TODO: rename this to attr_t -(defctype attr :uint32 - "The 32 bit integral type attr_t holds an OR-ed set of attributes.") -(defctype attr_t :uint32 - "The 32 bit integral type attr_t holds an OR-ed set of attributes.") - -;; winptr = *WINDOW -;; TODO: define window struct -;; (defctype ptr-window (:pointer (:struct window))) -(defctype window :pointer) - -;; scrptr = *SCREEN -(defctype screen :pointer) - -;; fileptr = *FILE -(defctype file :pointer) - -;;; C structures - -#| - -Excerpt from /usr/include/ncurses.h - -/* - * cchar_t stores an array of CCHARW_MAX wide characters. The first is - * normally a spacing character. The others are non-spacing. If those - * (spacing and nonspacing) do not fill the array, a null L'\0' follows. - * Otherwise, a null is assumed to follow when extracting via getcchar(). - */ -#define CCHARW_MAX 5 -typedef struct -{ - attr_t attr; - wchar_t chars[CCHARW_MAX]; -#if 0 -#undef NCURSES_EXT_COLORS -#define NCURSES_EXT_COLORS 20110404 - int ext_color; /* color pair, must be more than 16-bits */ -#endif -} -cchar_t; - -|# - -;; For non-extended colors, the color pair is OR-ed into the attr value, like it has been done -;; with color pairs in chtypes. This is ABI5. - -;;(defcstruct cchar_t -;; "A C struct containing contains a wide char and an integer containing the color pair and attributes." -;; (cchar-attr attr) -;; (cchar-chars wchar_t :count 5)) - -;; For extended colors, we get a new struct slot. This is ABI6, which is the default since ncurses 6.0, 20150808. - -;; Intended to be used with setcchar. -;; TODO: write meaningsful docstrings here. -(defcstruct cchar_t - "C struct containing a wide char, a color pair and attributes." - (cchar-attr attr_t) - (cchar-chars wchar_t :count 5) - (cchar-colors :int)) - -(defctype ptr-cchar_t (:pointer (:struct cchar_t))) - -;; Intended to be used with convert-to-foreign plist translation. -;; For some reasons, plists with pointers dont work, so we have to pass by value. -;; TODO: we dont need this any more, everything works now with the cchar_t struct. -(defcstruct cchar - "C struct containing a wide char, a color pair and attributes." - (cchar-attr attr_t) - (cchar-chars wchar_t) - (cchar-colors :int)) - -;; the default on ubuntu 12.04, 16.04 is --enable-ext-colors, -;; so is probably on debian, so we need to include "int ext_color" by default in -;; the cchar struct. - -;; convert-to-foreign and convert-from-foreign do not return structs, -;; but pointers to structs. - -;;; mouse.lisp - -;; typedef unsigned long mmask_t; -;; -;; typedef struct { -;; short id; /* ID to distinguish multiple devices */ -;; int x, y, z; /* event coordinates */ -;; mmask_t bstate; /* button state bits */ -;; } MEVENT; - -;; TODO: ABI6: --with-mmask_t=uint32_t -;;(defctype mmask_t :unsigned-int) -(defctype mmask_t :uint32) - -(defcstruct mevent - "C struct containing mouse coordinates and button state." - (id :short) - (x :int) - (y :int) - (z :int) - (bstate mmask_t)) - -;;; ------------------------------------------------------------------ - -;;; Constants - -;; #defines taken from ncurses.h, should not be user visible. -;; wherever cffi defines a boolean, we can use t and nil instead of TRUE and FALSE. -;;(defconstant TRUE 1) -;;(defconstant FALSE 0) -;;(defconstant ERROR -1) -;;(defconstant OK 0) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/opaque.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/opaque.lisp deleted file mode 100644 index b7468a9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/opaque.lisp +++ /dev/null @@ -1,40 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; opaque -;;; curses window properties -;;; http://invisible-island.net/ncurses/man/curs_opaque.3x.html - -;;; C prototypes - -;; bool is_cleared(const WINDOW *win); -;; bool is_idcok(const WINDOW *win); -;; bool is_idlok(const WINDOW *win); -;; bool is_immedok(const WINDOW *win); -;; bool is_keypad(const WINDOW *win); -;; bool is_leaveok(const WINDOW *win); -;; bool is_nodelay(const WINDOW *win); -;; bool is_notimeout(const WINDOW *win); -;; bool is_pad(const WINDOW *win); -;; bool is_scrollok(const WINDOW *win); -;; bool is_subwin(const WINDOW *win); -;; bool is_syncok(const WINDOW *win); -;; WINDOW *wgetparent(const WINDOW *win); -;; int wgetscrreg(const WINDOW *win, int *top, int *bottom); - -;;; Low-level CFFI wrappers - -(defcfun ("is_cleared" %is-cleared) :boolean (win window)) -(defcfun ("is_idcok" %is-idcok) :boolean (win window)) -(defcfun ("is_idlok" %is-idlok) :boolean (win window)) -(defcfun ("is_immedok" %is-immedok) :boolean (win window)) -(defcfun ("is_keypad" %is-keypad) :boolean (win window)) -(defcfun ("is_leaveok" %is-leaveok) :boolean (win window)) -(defcfun ("is_nodelay" %is-nodelay) :boolean (win window)) -(defcfun ("is_notimeout" %is-notimeout) :boolean (win window)) -(defcfun ("is_pad" %is-pad) :boolean (win window)) -(defcfun ("is_scrollok" %is-scrollok) :boolean (win window)) -(defcfun ("is_subwin" %is-subwin) :boolean (win window)) -(defcfun ("is_syncok" %is-syncok) :boolean (win window)) - -(defcfun ("wgetparent" %wgetparent) window (win window)) -(defcfun ("wgetscrreg" %wgetscrreg) :int (win window) (top (:pointer :int)) (bottom (:pointer :int))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/outopts.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/outopts.lisp deleted file mode 100644 index 1862c24..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/outopts.lisp +++ /dev/null @@ -1,35 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; outopts -;;; curses output options -;;; http://invisible-island.net/ncurses/man/curs_outopts.3x.html - -;;; C prototypes - -;; int clearok(WINDOW *win, bool bf); -;; int idlok(WINDOW *win, bool bf); -;; void idcok(WINDOW *win, bool bf); -;; void immedok(WINDOW *win, bool bf); -;; int leaveok(WINDOW *win, bool bf); -;; int scrollok(WINDOW *win, bool bf); - -;; int setscrreg(int top, int bot); -;; int wsetscrreg(WINDOW *win, int top, int bot); - -;; int nl(void); -;; int nonl(void); - -;;; Low-level CFFI wrappers - -(defcfun ("clearok" %clearok) :int (win window) (bf :boolean)) -(defcfun ("idlok" %idlok) :int (win window) (bf :boolean)) -(defcfun ("idcok" %idcok) :void (win window) (bf :boolean)) -(defcfun ("immedok" %immedok) :void (win window) (bf :boolean)) -(defcfun ("leaveok" %leaveok) :int (win window) (bf :boolean)) -(defcfun ("scrollok" %scrollok) :int (win window) (bf :boolean)) - -(defcfun ("setscrreg" %setscrreg) :int (top :int) (bot :int)) -(defcfun ("wsetscrreg" %wsetscrreg) :int (win window) (top :int) (bot :int)) - -(defcfun ("nl" %nl) :void) -(defcfun ("nonl" %nonl) :void) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/package.lisp deleted file mode 100644 index 32d78fe..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/package.lisp +++ /dev/null @@ -1,467 +0,0 @@ -(defpackage #:de.anvi.ncurses - (:documentation "Low-level CFFI bindings to the Ncurses C API. Not meant to be used directly.") - (:use #:common-lisp #:cffi) - (:export - - ;; addch / add a character (with attributes) to a curses window, then advance the cursor - %addch - %waddch - %mvaddch - %mvwaddch - %echochar - %wechochar - - ;; add_wch / add a complex character and rendition to a curses window, then advance the cursor - %add-wch - %wadd-wch - %mvadd-wch - %mvwadd-wch - %echo-wchar - %wecho-wchar - - ;; addstr / add a string of characters to a curses window and advance cursor - %addstr - %addnstr - %waddstr - %waddnstr - %mvaddstr - %mvaddnstr - %mvwaddstr - %mvwaddnstr - - ;; attr / curses character and window attribute control routines - %attroff - %wattroff - %attron - %wattron - %attrset - %wattrset - %color-set - %wcolor-set - %standend - %wstandend - %standout - %wstandout - %attr-get - %wattr-get - %attr-off - %wattr-off - %attr-on - %wattr-on - %attr-set - %wattr-set - %chgat - %wchgat - %mvchgat - %mvwchgat - - ;; beep / curses bell and screen flash routines - %beep - %flash - - ;; bkgd / curses window background manipulation routines - %bkgdset - %wbkgdset - %bkgd - %wbkgd - %getbkgd - - ;; bkgrnd / window complex background manipulation routines - %bkgrnd - %wbkgrnd - %bkgrndset - %wbkgrndset - %getbkgrnd - %wgetbkgrnd - - ;; border / create curses borders, horizontal and vertical lines - %border - %wborder - %box - %hline - %whline - %vline - %wvline - %mvhline - %mvwhline - %mvvline - %mvwvline - - ;; border_set / create curses borders or lines using complex characters and renditions - %border-set - %wborder-set - %box-set - %hline-set - %whline-set - %mvhline-set - %mvwhline-set - %vline-set - %wvline-set - %mvvline-set - %mvwvline-set - - ;; clear / clear all or part of a curses window - %erase - %werase - %clear - %wclear - %clrtobot - %wclrtobot - %clrtoeol - %wclrtoeol - - ;; color / curses color manipulation routines - %start-color - %has-colors - %can-change-color - %init-pair - %init-color - %pair-content - %color-content - %init-extended-pair - %init-extended-color - %pair-extended-content - %color-extended-content - %color-pair - %pair-number - %COLOR-BLACK - %COLOR-RED - %COLOR-GREEN - %COLOR-YELLOW - %COLOR-BLUE - %COLOR-MAGENTA - %COLOR-CYAN - %COLOR-WHITE - - ;; default_colors / use terminal's default colors - %use-default-colors - %assume-default-colors - - ;; define_key / define a keycode - %define-key - - ;; delch / delete character under the cursor in a curses window - %delch - %wdelch - %mvdelch - %mvwdelch - - ;; deleteln / delete and insert lines in a curses window - %deleteln - %wdeleteln - %insdelln - %winsdelln - %insertln - %winsertln - - ;; extend / miscellaneous curses extensions - %curses-version - %use-extended-names - - ;; getcchar / Get a wide character string and rendition from a cchar_t or set a cchar_t from a wide-character string - %getcchar - %setcchar - - ;; getch / get (or push back) characters from curses terminal keyboard - %getch - %wgetch - %mvgetch - %mvwgetch - %ungetch - %has-key - - ;; get_wch / get (or push back) a wide (multi-byte) character from curses terminal keyboard - %get-wch - %wget-wch - %mvget-wch - %mvwget-wch - %unget-wch - wint_t - - ;; getstr / accept character strings from curses terminal keyboard - %getstr - %getnstr - %wgetstr - %wgetnstr - %mvgetstr - %mvgetnstr - %mvwgetstr - %mvwgetnstr - - ;; getyx / get curses cursor and window coordinates - ;; --> legacy - - ;; inch / get a character and attributes from a curses window - %inch - %winch - %mvinch - %mvwinch - - ;; in_wch / extract a wide character and rendition from a window - %in-wch - %mvin-wch - %win-wch - %mvwin-wch - - ;; inchstr / get a string of characters (and attributes) from a curses window - %inchstr - %inchnstr - %winchstr - %winchnstr - %mvinchstr - %mvinchnstr - %mvwinchstr - %mvwinchnstr - - ;; initscr / Screen initialization and manipulation routines - %initscr - %endwin - %isendwin - %newterm - %set-term - %delscreen - - ;; inopts / Input options. - %cbreak - %nocbreak - %echo - %noecho - %halfdelay - %intrflush - %keypad - %meta - %nodelay - %raw - %noraw - %noqiflush - %qiflush - %notimeout - %timeout - %wtimeout - %typeahead - - ;; insch / insert a character before cursor in a curses window - %insch - %winsch - %mvinsch - %mvwinsch - - ;; ins_wch / insert a complex character and rendition into a window - %ins-wch - %wins-wch - %mvins-wch - %mvwins-wch - - ;; insstr / insert string before cursor in a curses window - %insstr - %insnstr - %winsstr - %winsnstr - %mvinsstr - %mvinsnstr - %mvwinsstr - %mvwinsnstr - - ;; instr / get a string of characters from a curses window - %instr - %innstr - %winstr - %winnstr - %mvinstr - %mvinnstr - %mvwinstr - %mvwinnstr - - ;; inwstr / extract a string of wchar_t characters from a curses window - %inwstr - %innwstr - %winwstr - %winnwstr - %mvinwstr - %mvinnwstr - %mvwinwstr - %mvwinnwstr - - ;; kernel / low-level curses routines - %def-prog-mode - %def-shell-mode - %reset-prog-mode - %reset-shell-mode - %resetty - %savetty - %getsyx - %setsyx - %ripoffline - %curs-set - %napms - - ;; keybound / return definition of keycode - %keybound - - ;; key_defined / check if a keycode is defined - %key-defined - - ;; legacy / get curses cursor and window coordinates, attributes - %getbegx - %getbegy - %getcurx - %getcury - %getmaxx - %getmaxy - %getparx - %getpary - - ;; legacy_coding - %use-legacy-coding - - ;; mouse interface through curses - %getmouse - %mousemask - - ;; move / move curses window cursor - %move - %wmove - - ;; ncurses / CRT screen handling and optimization package - chtype - wchar_t - wint_t - attr_t - cchar - cchar_t - ptr-cchar_t - cchar-attr - cchar-chars - cchar-colors - mmask_t - mevent - %ERROR - %OK - - ;; opaque / curses window properties - %is-cleared - %is-idcok - %is-idlok - %is-immedok - %is-keypad - %is-leaveok - %is-nodelay - %is-notimeout - %is-pad - %is-scrollok - %is-subwin - %is-syncok - %wgetparent - %wgetscrreg - - ;; outopts / curses output options - %clearok - %idlok - %idcok - %immedok - %leaveok - %scrollok - %setscrreg - %wsetscrreg - %nl - %nonl - - ;; pad / create and display curses pads - %newpad - %subpad - %prefresh - %pnoutrefresh - %pechochar - %pecho-wchar - - ;; refresh / refresh curses windows and lines - %refresh - %wrefresh - %wnoutrefresh - %doupdate - %redrawwin - %wredrawln - - ;; resizeterm / change the curses terminal size - %is-term-resized - %resize-term - %resizeterm - - ;; scroll / scroll a curses window - %scroll - %scrl - %wscrl - - ;; slk / curses soft label routines - %slk-init - %slk-set - %slk-refresh - %slk-noutrefresh - %slk-label - %slk-clear - %slk-restore - %slk-touch - %slk-attron - %slk-attroff - %slk-attrset - %slk-attr-on - %slk-attr-off - %slk-attr-set - %slk-attr - %slk-color - - ;; termattrs / environment query routines - %baudrate - %erasechar - %has-ic - %has-il - %killchar - %longname - %term-attrs - %termattrs - %termname - - ;; touch / curses refresh control routines - %touchwin - %touchline - %untouchwin - %wtouchln - %is-linetouched - %is-wintouched - - ;; util / miscellaneous curses utility routines - %unctrl - %keyname - %filter - %nofilter - %use-env - %putwin - %getwin - %delay-output - %flushinp - - ;; variables / curses global variables - %COLOR-PAIRS - %COLORS - %COLS - %ESCDELAY - %LINES - %TABSIZE - - ;; window / create curses windows - %newwin - %delwin - %mvwin - %subwin - %derwin - %mvderwin - %dupwin - %wsyncup - %syncok - %wcursyncup - %wsyncdown - - ;; wresize / resize a curses window - %wresize - - )) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/pad.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/pad.lisp deleted file mode 100644 index 95b6674..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/pad.lisp +++ /dev/null @@ -1,45 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; pad -;;; create and display curses pads -;;; http://invisible-island.net/ncurses/man/curs_pad.3x.html -;;; http://pic.dhe.ibm.com/infocenter/aix/v7r1/topic/com.ibm.aix.basetechref/doc/basetrf2/newpad.htm -;;; http://www.gnu.org/software/guile-ncurses/manual/html_node/Create-and-display-pads.html - -;;; C prototypes - -;; WINDOW *newpad(int nlines, int ncols); -;; WINDOW *subpad(WINDOW *orig, int nlines, int ncols, int begin_y, int begin_x); - -;; int prefresh(WINDOW *pad, int pminrow, int pmincol, int sminrow, int smincol, int smaxrow, int smaxcol); -;; int pnoutrefresh(WINDOW *pad, int pminrow, int pmincol, int sminrow, int smincol, int smaxrow, int smaxcol); - -;; int pechochar(WINDOW *pad, chtype ch); -;; int pecho_wchar(WINDOW *pad, const cchar_t *wch); - -;;; Low-level CFFI wrappers - -(defcfun ("newpad" %newpad) window (nlines :int) (ncols :int)) -(defcfun ("subpad" %subpad) window (orig window) (nlines :int) (ncols :int) (begin_y :int) (begin_x :int)) - -(defcfun ("prefresh" %prefresh) :int - (pad window) - (pminrow :int) - (pmincol :int) - (sminrow :int) - (smincol :int) - (smaxrow :int) - (smaxcol :int)) - -(defcfun ("pnoutrefresh" %pnoutrefresh) :int - (pad window) - (pminrow :int) - (pmincol :int) - (sminrow :int) - (smincol :int) - (smaxrow :int) - (smaxcol :int)) - -(defcfun ("pechochar" %pechochar) :int (pad window) (ch chtype)) - -(defcfun ("pecho_wchar" %pecho-wchar) :int (pad window) (wch (:pointer (:struct cchar_t)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/refresh.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/refresh.lisp deleted file mode 100644 index b63eb79..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/refresh.lisp +++ /dev/null @@ -1,23 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; refresh -;;; refresh curses windows and lines -;;; http://www.manpagez.com/man/3/curs_refresh/ - -;;; C prototypes - -;; int refresh(void); -;; int wrefresh(WINDOW *win); -;; int wnoutrefresh(WINDOW *win); -;; int doupdate(void); -;; int redrawwin(WINDOW *win); -;; int wredrawln(WINDOW *win, int beg_line, int num_lines); - -;;; Low-level CFFI wrappers - -(defcfun ("refresh" %refresh) :int) -(defcfun ("wrefresh" %wrefresh) :int (win window)) -(defcfun ("wnoutrefresh" %wnoutrefresh) :int (win window)) -(defcfun ("doupdate" %doupdate) :int) -(defcfun ("redrawwin" %redrawwin) :int (win window)) -(defcfun ("wredrawln" %wredrawln) :int (win window) (beg-line :int) (num-lines :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/resizeterm.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/resizeterm.lisp deleted file mode 100644 index 601ef36..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/resizeterm.lisp +++ /dev/null @@ -1,17 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; resizeterm -;;; change the curses terminal size -;;; http://invisible-island.net/ncurses/man/resizeterm.3x.html - -;;; C prototypes - -;; bool is_term_resized(int lines, int columns); -;; int resize_term(int lines, int columns); -;; int resizeterm(int lines, int columns); - -;;; Low-level CFFI wrappers - -(defcfun ("is_term_resized" %is-term-resized) :boolean (lines :int) (columns :int)) -(defcfun ("resize_term" %resize-term) :int (lines :int) (columns :int)) -(defcfun ("resizeterm" %resizeterm) :int (lines :int) (columns :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/scroll.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/scroll.lisp deleted file mode 100644 index b989005..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/scroll.lisp +++ /dev/null @@ -1,17 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; scroll -;;; scroll a curses window -;;; http://invisible-island.net/ncurses/man/curs_scroll.3x.html - -;;; C prototypes - -;; int scroll(WINDOW *win); -;; int scrl(int n); -;; int wscrl(WINDOW *win, int n); - -;;; Low-level CFFI wrappers - -(defcfun ("scroll" %scroll) :int (win window)) -(defcfun ("scrl" %scrl) :int (n :int)) -(defcfun ("wscrl" %wscrl) :int (win window) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/slk.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/slk.lisp deleted file mode 100644 index b1fb316..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/slk.lisp +++ /dev/null @@ -1,47 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; slk -;;; curses soft label routines -;;; http://invisible-island.net/ncurses/man/curs_slk.3x.html - -;;; C prototypes - -;; int slk_init(int fmt); -;; int slk_set(int labnum, const char *label, int fmt); -;; int slk_refresh(void); -;; int slk_noutrefresh(void); -;; char *slk_label(int labnum); -;; int slk_clear(void); -;; int slk_restore(void); -;; int slk_touch(void); -;; int slk_attron(const chtype attrs); -;; int slk_attroff(const chtype attrs); -;; int slk_attrset(const chtype attrs); -;; int slk_attr_on(attr_t attrs, void *opts); -;; int slk_attr_off(const attr_t attrs, void *opts); -;; int slk_attr_set(const attr_t attrs, short color_pair, void *opts); -;; attr_t slk_attr(void); -;; int slk_color(short color_pair); -;; int slk_wset(int labnum, const wchar_t *label, int fmt); - -;;; Low-level CFFI wrappers - -(defcfun ("slk_init" %slk-init) :int (fmt :int)) -(defcfun ("slk_set" %slk-set) :int (labnum :int) (label :string) (fmt :int)) -(defcfun ("slk_refresh" %slk-refresh) :int) -(defcfun ("slk_noutrefresh" %slk-noutrefresh) :int) -(defcfun ("slk_label" %slk-label) :string (labnum :int)) -(defcfun ("slk_clear" %slk-clear) :int) -(defcfun ("slk_restore" %slk-restore) :int) -(defcfun ("slk_touch" %slk-touch) :int) - -(defcfun ("slk_attron" %slk-attron) :int (attrs chtype)) -(defcfun ("slk_attroff" %slk-attroff) :int (attrs chtype)) -(defcfun ("slk_attrset" %slk-attrset) :int (attrs chtype)) - -(defcfun ("slk_attr_on" %slk-attr-on) :int (attrs attr) (opts (:pointer :void))) -(defcfun ("slk_attr_off" %slk-attr-off) :int (attrs attr) (opts (:pointer :void))) -(defcfun ("slk_attr_set" %slk-attr-set) :int (attrs attr) (color-pair :short) (opts (:pointer :void))) - -(defcfun ("slk_attr" %slk-attr) attr) -(defcfun ("slk_color" %slk-color) :int (color-pair :short)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/termattrs.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/termattrs.lisp deleted file mode 100644 index 3cba63c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/termattrs.lisp +++ /dev/null @@ -1,31 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; termattrs -;;; environment query routines -;;; http://invisible-island.net/ncurses/man/curs_termattrs.3x.html - -;;; C prototypes - -;; int baudrate(void); -;; char erasechar(void); -;; int erasewchar(wchar_t *ch); -;; bool has_ic(void); -;; bool has_il(void); -;; char killchar(void); -;; int killwchar(wchar_t *ch); -;; char *longname(void); -;; attr_t term_attrs(void); -;; chtype termattrs(void); -;; char *termname(void); - -;;; Low-level CFFI wrappers - -(defcfun ("baudrate" %baudrate) :int) -(defcfun ("erasechar" %erasechar) :char) -(defcfun ("has_ic" %has-ic) :boolean) -(defcfun ("has_il" %has-il) :boolean) -(defcfun ("killchar" %killchar) :char) -(defcfun ("longname" %longname) :string) -(defcfun ("term_attrs" %term-attrs) attr) -(defcfun ("termattrs" %termattrs) chtype) -(defcfun ("termname" %termname) :string) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/touch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/touch.lisp deleted file mode 100644 index acc4d9d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/touch.lisp +++ /dev/null @@ -1,25 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; touch -;;; curses refresh control routines -;;; http://invisible-island.net/ncurses/man/curs_touch.3x.html -;;; http://www-01.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.basetrf2/touchwin.htm - -;;; C prototypes - -;; int touchwin(WINDOW *win); -;; int touchline(WINDOW *win, int start, int count); -;; int untouchwin(WINDOW *win); -;; int wtouchln(WINDOW *win, int y, int n, int changed); -;; bool is_linetouched(WINDOW *win, int line); -;; bool is_wintouched(WINDOW *win); - -;;; Low-level CFFI wrappers - -(defcfun ("touchwin" %touchwin) :int (win window)) -(defcfun ("touchline" %touchline) :int (win window) (start :int) (count :int)) -(defcfun ("untouchwin" %untouchwin) :int (win window)) -(defcfun ("wtouchln" %wtouchln) :int (win window) (y :int) (n :int) (changed :int)) - -(defcfun ("is_linetouched" %is-linetouched) :boolean (win window) (line :int)) -(defcfun ("is_wintouched" %is-wintouched) :boolean (win window)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/util.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/util.lisp deleted file mode 100644 index 3fe2d41..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/util.lisp +++ /dev/null @@ -1,33 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; util -;;; miscellaneous curses utility routines -;;; http://invisible-island.net/ncurses/man/curs_util.3x.html - -;;; C prototypes - -;; char *unctrl(chtype c); -;; wchar_t *wunctrl(cchar_t *c); -;; char *keyname(int c); -;; char *key_name(wchar_t w); -;; void filter(void); -;; void nofilter(void); -;; void use_env(bool f); -;; int putwin(WINDOW *win, FILE *filep); -;; WINDOW *getwin(FILE *filep); -;; int delay_output(int ms); -;; int flushinp(void); - -;;; Low-level CFFI wrappers - -(defcfun ("unctrl" %unctrl) :string (c chtype)) -(defcfun ("wunctrl" %wunctrl) :string (c (:pointer (:struct cchar_t)))) -(defcfun ("keyname" %keyname) :string (c :int)) -(defcfun ("key_name" %key_name) :string (w wchar_t)) -(defcfun ("filter" %filter) :void) -(defcfun ("nofilter" %nofilter) :void) -(defcfun ("use_env" %use-env) :void (f :boolean)) -(defcfun ("putwin" %putwin) :int (win window) (filep :pointer)) -(defcfun ("getwin" %getwin) window (filep :pointer)) -(defcfun ("delay_output" %delay-output) :int (ms :int)) -(defcfun ("flushinp" %flushinp) :int) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/variables.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/variables.lisp deleted file mode 100644 index 3ce3621..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/variables.lisp +++ /dev/null @@ -1,27 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; variables -;;; curses global variables -;;; http://invisible-island.net/ncurses/man/curs_variables.3x.html -;;; http://h71000.www7.hp.com/doc/83final/5763/5763pro_016.html - -;;; Low-level C global variables - -;; int COLOR_PAIRS; -;; int COLORS; -;; int COLS; -;; int ESCDELAY; -;; int LINES; -;; int TABSIZE; -;; WINDOW * curscr; -;; WINDOW * newscr; -;; WINDOW * stdscr; - -;;; Lisp read-only global constants. - -(defcvar ("COLOR_PAIRS" %COLOR-PAIRS :read-only t) :int) -(defcvar ("COLORS" %COLORS :read-only t) :int) -(defcvar ("COLS" %COLS :read-only t) :int) -(defcvar ("ESCDELAY" %ESCDELAY :read-only t) :int) -(defcvar ("LINES" %LINES :read-only t) :int) -(defcvar ("TABSIZE" %TABSIZE :read-only t) :int) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/window.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/window.lisp deleted file mode 100644 index 1b8bc62..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/window.lisp +++ /dev/null @@ -1,36 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; window -;;; create curses windows -;;; http://invisible-island.net/ncurses/man/curs_window.3x.html -;;; http://www.manpagez.com/man/3/newwin/ - -;;; C prototypes - -;; WINDOW *newwin(int nlines, int ncols, int begin_y, int begin_x); -;; int delwin(WINDOW *win); -;; int mvwin(WINDOW *win, int y, int x); -;; WINDOW *subwin(WINDOW *orig, int nlines, int ncols, int begin_y, int begin_x); -;; WINDOW *derwin(WINDOW *orig, int nlines, int ncols, int begin_y, int begin_x); -;; int mvderwin(WINDOW *win, int par_y, int par_x); -;; WINDOW *dupwin(WINDOW *win); - -;; void wsyncup(WINDOW *win); -;; int syncok(WINDOW *win, bool bf); -;; void wcursyncup(WINDOW *win); -;; void wsyncdown(WINDOW *win); - -;;; Low-level CFFI wrappers - -(defcfun ("newwin" %newwin) window (nlines :int) (ncols :int) (begin_y :int) (begin_x :int)) -(defcfun ("delwin" %delwin) :int (win window)) -(defcfun ("mvwin" %mvwin) :int (win window) (y :int) (x :int)) -(defcfun ("subwin" %subwin) window (orig window) (nlines :int) (ncols :int) (begin_y :int) (begin_x :int)) -(defcfun ("derwin" %derwin) window (orig window) (nlines :int) (ncols :int) (begin_y :int) (begin_x :int)) -(defcfun ("mvderwin" %mvderwin) :int (win window) (par_y :int) (par_x :int)) -(defcfun ("dupwin" %dupwin) window (win window)) - -(defcfun ("wsyncup" %wsyncup) :void (win window)) -(defcfun ("syncok" %syncok) :int (win window) (bf :boolean)) -(defcfun ("wcursyncup" %wcursyncup) :void (win window)) -(defcfun ("wsyncdown" %wsyncdown) :void (win window)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/wresize.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/wresize.lisp deleted file mode 100644 index b12c5a8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/wresize.lisp +++ /dev/null @@ -1,13 +0,0 @@ -(in-package :de.anvi.ncurses) - -;;; wresize -;;; resize a curses window -;;; http://invisible-island.net/ncurses/man/wresize.3x.html - -;;; C prototypes - -;; int wresize(WINDOW *win, int lines, int columns); - -;;; Low-level CFFI wrappers - -(defcfun ("wresize" %wresize) :int (win window) (lines :int) (columns :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/add_wch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/add_wch.lisp deleted file mode 100644 index 3eba6bb..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/add_wch.lisp +++ /dev/null @@ -1,239 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun add-wide-char-utf-8 (window char &key attributes color-pair y x position n) - "Add the wide (multi-byte) char to the window, then advance the cursor. - -If the position coordinates y (row) and x (column) are given, move the -cursor to the position first and then add the character. - -The position can also be passed in form of a two-element list. - -If n is given, write n chars. If n is -1, as many chars will be added -as will fit on the line." - (when (and y x) (move window y x)) - (when position (apply #'move window position)) - (let ((count (if n - (if (= n -1) - (distance-to-eol window) - n) - 1)) - (code-point (typecase char - (integer char) - (character (char-code char))))) - (typecase char - (complex-char - ;; if we have a complex char, use its own attributes and colors. - (loop repeat count do - (mapc #'(lambda (ch) (add-char window ch :attributes (attributes char) :color-pair (color-pair char))) - (unicode-to-utf-8 (char-code (simple-char char)))))) - ;; if we have a lisp char or an integer, use the attributes and colors passed as arguments. - (t - (loop repeat count do - (mapc #'(lambda (ch) (add-char window ch :attributes attributes :color-pair color-pair)) - (unicode-to-utf-8 code-point))))))) - -;; we can use this for add-wide-char, echo-wide-char, insert-wide-char, set-wide-background-char -(defun funcall-make-cchar_t-ptr (fn winptr char attr_t color-pair-number count) - "Create a cchar_t and apply function fn count times to winptr and cchar_t. - -cchar_t is a C struct representing a wide complex-char in ncurses. - -This function is a wrapper around %setcchar and should not be used elsewhere." - (with-foreign-objects ((ptr '(:struct cchar_t)) - (wch 'wchar_t 5)) - (dotimes (i 5) (setf (mem-aref wch 'wchar_t i) 0)) - (setf (mem-aref wch 'wchar_t) char) - (%setcchar ptr wch attr_t color-pair-number (null-pointer)) - (if (= count 1) - (funcall fn winptr ptr) - (dotimes (i count) (funcall fn winptr ptr)) ))) - -(defun funcall-make-cchar_t (fn window char attributes color-pair n) - "Assemble a cchar_t out of a char, attributes and a color-pair. - -Then apply the fn to window and the assembled cchar_t. - -char can be a lisp character, an ACS keyword, an integer code point or -a complex char. - -attributes should be a list of valid attribute keywords. - -color-pair should be a list of a foreground and background color keyword. - -attributes and color-pair can be nil. - -If char is a complex char, attributes and color-pair are ignored." - (let ((winptr (winptr window)) - (ch - (typecase char - ;; if we have a lisp char or an integer, use the attributes and colors passed as arguments. - (integer char) - (character (char-code char)) - (keyword (wacs char)) - ;; if we have a complex char, use its own attributes and colors. - (complex-char (if (simple-char char) - (let ((sch (simple-char char))) - (typecase sch - (integer sch) - (character (char-code sch)) - (keyword (wacs sch)) - (otherwise (error "unknown character type")))) - ;; this means that the default simple char is space, otherwise - ;; we can not set complex background chars. - ;; TODO: set this here or as initform for complex-char? - 32)) - (otherwise (error "unknown character type")))) - (attr_t - (typecase char - (complex-char (attrs2chtype (attributes char))) - (otherwise (attrs2chtype attributes)))) - ;; we just need the pair number here, NOT the bit-shifted color attribute. - ;; we need the color attribute for chtypes. - (color-pair-number - (if (or (eq fn #'%wbkgrnd) - (eq fn #'%wbkgrndset)) - ;; when setting the background, do not complete using the windows color pair and background - ;; just complete from the default pair - (pair-to-number (complete-default-pair (typecase char - (complex-char (color-pair char)) - (otherwise color-pair)))) - ;; for every other function, complete from the full sequence - (pair-to-number (complete-pair window (typecase char - (complex-char (color-pair char)) - (otherwise color-pair)))))) - (count (if n - (if (= n -1) - (distance-to-eol window) - n) - 1))) - ;; After the parameters are assembled, call the lower-level function that actually - ;; uses %setcchar to create a cchar_t pointer and passes it to fn. - (funcall-make-cchar_t-ptr fn winptr ch attr_t color-pair-number count))) - -(defun add-wide-char (window char &key attributes fgcolor bgcolor color-pair style y x position n) - "Add the wide (multi-byte) char to the window, then advance the cursor. - -If the position coordinates y (row) and x (column) are given, move the -cursor to the position first and then add the character. - -The position can also be passed in form of a two-element list. - -If n is given for a char, write n chars. If n is -1, add as many chars -as will fit on the line. - -If char is a complex-char, its own style overrides any style parameters. - -If a style is passed, it overrides attributes and color-pair." - (when (and y x) (move window y x)) - (when position (apply #'move window position)) - (let ((attributes (if style - (getf style :attributes) - attributes)) - (color-pair (cond (style - (list (getf style :fgcolor) (getf style :bgcolor))) - ((or fgcolor bgcolor) - (list fgcolor bgcolor)) - (t color-pair)))) - (funcall-make-cchar_t #'%wadd-wch window char attributes color-pair n))) - -(defun echo-wide-char (window char &key attributes fgcolor bgcolor color-pair style y x position) - "Add one wide (multi-byte) character to the window, then refresh the window. - -If the position coordinates y (row) and x (column) are given, move the -cursor to the position first and then add the character. - -The position can also be passed in form of a two-element list. - -The only difference to add-wide-char and a subsequent refresh is a -performance gain if we know that we only need to output a single -character." - (when (and y x) (move window y x)) - (when position (apply #'move window position)) - (let ((count 1) - ;; for some reason, there is a special echo function for pads. - (fn (typecase window - (pad #'%pecho-wchar) - (window #'%wecho-wchar))) - (attributes (if style - (getf style :attributes) - attributes)) - (color-pair (cond (style - (list (getf style :fgcolor) (getf style :bgcolor))) - ((or fgcolor bgcolor) - (list fgcolor bgcolor)) - (t color-pair)))) - (funcall-make-cchar_t fn window char attributes color-pair count))) - -;; wide-char equivalents of the ACS chars. -;; since reading _nc_wacs doesnt work like it worked with acs_map, -;; plan B is a direct translation from ACS names to unicode code points. -;; source for the codes is ncurses/widechar/lib_wacs.c -(defparameter wide-acs-alist - ;; VT100 symbols - '(( :upper-left-corner . #x250C ) ; #\BOX_DRAWINGS_LIGHT_DOWN_AND_RIGHT / 0xE2 0x94 0x8C - ( :lower-left-corner . #x2514 ) ; #\BOX_DRAWINGS_LIGHT_UP_AND_RIGHT / 0xE2 0x94 0x94 - ( :upper-right-corner . #x2510 ) ; #\BOX_DRAWINGS_LIGHT_DOWN_AND_LEFT / 0xE2 0x94 0x90 - ( :lower-right-corner . #x2518 ) ; #\BOX_DRAWINGS_LIGHT_UP_AND_LEFT / 0xE2 0x94 0x98 - ( :tee-pointing-left . #x2524 ) ; #\BOX_DRAWINGS_LIGHT_VERTICAL_AND_LEFT / 0xE2 0x94 0xA5 - ( :tee-pointing-right . #x251C ) ; #\BOX_DRAWINGS_LIGHT_VERTICAL_AND_RIGHT / 0xE2 0x94 0x9C - ( :tee-pointing-up . #x2534 ) ; #\BOX_DRAWINGS_LIGHT_UP_AND_HORIZONTAL / 0xE2 0x94 0xB4 - ( :tee-pointing-down . #x252C ) ; #\BOX_DRAWINGS_LIGHT_DOWN_AND_HORIZONTAL / 0xE2 0x94 0xAC - ( :horizontal-line . #x2500 ) ; #\BOX_DRAWINGS_LIGHT_HORIZONTAL / 0xE2 0x94 0x80 - ( :vertical-line . #x2502 ) ; #\BOX_DRAWINGS_LIGHT_VERTICAL / 0xE2 0x94 0x82 - ( :crossover-plus . #x253C ) ; #\BOX_DRAWINGS_LIGHT_VERTICAL_AND_HORIZONTAL / 0xE2 0x94 0xBC - - ( :scan-line-1 . #x23BA ) ; #\HORIZONTAL_SCAN_LINE-1 / 0xE2 0x8E 0xBA - ( :scan-line-9 . #x23BD ) ; #\HORIZONTAL_SCAN_LINE-9 / 0xE2 0x8E 0xBD - ( :diamond-symbol . #x25C6 ) ; #\BLACK_DIAMOND / 0xE2 0x97 0x86 - ( :checker-board . #x2592 ) ; #\MEDIUM_SHADE / 0xE2 0x96 0x92 - ( :degree-symbol . #x00B0 ) ; #\DEGREE_SIGN / 0xC2 0xB0 - ( :plus-minus . #x00B1 ) ; #\PLUS-MINUS_SIGN / 0xC2 0xB1 - ( :bullet-symbol . #x00B7 ) ; #\MIDDLE_DOT / 0xC2 0xB7 - - ;; Teletype 5410v1 symbols - ( :arrow-pointing-left . #x2190 ) ; #\LEFTWARDS_ARROW / 0xE2 0x86 0x90 - ( :arrow-pointing-right . #x2192 ) ; #\RIGHTWARDS_ARROW / 0xE2 0x86 0x92 - ( :arrow-pointing-down . #x2193 ) ; #\DOWNWARDS_ARROW / 0xE2 0x86 0x93 - ( :arrow-pointing-up . #x2191 ) ; #\UPWARDS_ARROW / 0xE2 0x86 0x91 - ( :board . #x2592 ) ; #\MEDIUM_SHADE / 0xE2 0x96 0x92 - ( :lantern-symbol . #x2603 ) ; #\SNOWMAN / 0xE2 0x98 0x83 - ( :solid-square-block . #x25AE ) ; #\BLACK_VERTICAL_RECTANGLE / 0xE2 0x96 0xAE - - ;; ncurses characters - ( :scan-line-3 . #x23BB ) ; #\HORIZONTAL_SCAN_LINE-3 / 0xE2 0x8E 0xBB - ( :scan-line-7 . #x23BC ) ; #\HORIZONTAL_SCAN_LINE-7 / 0xE2 0x8E 0xBC - ( :less-than-or-equal . #x2264 ) ; #\LESS-THAN_OR_EQUAL_TO / 0xE2 0x89 0xA4 - ( :greater-than-or-equal . #x2265 ) ; #\GREATER-THAN_OR_EQUAL_TO / 0xE2 0x89 0xA5 - ( :pi . #x03C0 ) ; #\GREEK_SMALL_LETTER_PI / 0xCF 0x80 - ( :not-equal . #x2260 ) ; #\NOT_EQUAL_TO / 0xE2 0x89 0xA0 - ( :uk-pound-sterling . #x00A3 ) ; #\POUND_SIGN / 0xC2 0xA3 - - ;; thick line drawing characters - ( :thick-upper-left-corner . #x250F ) ; #\BOX_DRAWINGS_HEAVY_DOWN_AND_RIGHT / 0xE2 0x94 0x8F - ( :thick-lower-left-corner . #x2517 ) ; #\BOX_DRAWINGS_HEAVY_UP_AND_RIGHT / 0xE2 0x94 0x97 - ( :thick-upper-right-corner . #x2513 ) ; #\BOX_DRAWINGS_HEAVY_DOWN_AND_LEFT / 0xE2 0x94 0x93 - ( :thick-lower-right-corner . #x251B ) ; #\BOX_DRAWINGS_HEAVY_UP_AND_LEFT / 0xE2 0x94 0x9B - ( :thick-tee-pointing-left . #x2523 ) ; #\BOX_DRAWINGS_HEAVY_VERTICAL_AND_LEFT / 0xE2 0x94 0xA3 - ( :thick-tee-pointing-right . #x252B ) ; #\BOX_DRAWINGS_HEAVY_VERTICAL_AND_RIGHT / 0xE2 0x94 0xAB - ( :thick-tee-pointing-up . #x253B ) ; #\BOX_DRAWINGS_HEAVY_UP_AND_HORIZONTAL / 0xE2 0x94 0xBB - ( :thick-tee-pointing-down . #x2533 ) ; #\BOX_DRAWINGS_HEAVY_DOWN_AND_HORIZONTAL / 0xE2 0x94 0xB3 - ( :thick-horizontal-line . #x2501 ) ; #\BOX_DRAWINGS_HEAVY_HORIZONTAL / 0xE2 0x94 0x81 - ( :thick-vertical-line . #x2503 ) ; #\BOX_DRAWINGS_HEAVY_VERTICAL / 0xE2 0x94 0x83 - ( :thick-crossover-plus . #x254B ) ; #\BOX_DRAWINGS_HEAVY_VERTICAL_AND_HORIZONTAL / 0xE2 0x95 0x8B - - ;; double-line drawing characters - ( :double-upper-left-corner . #x2554 ) ; #\BOX_DRAWINGS_DOUBLE_DOWN_AND_RIGHT / 0xE2 0x95 0x94 - ( :double-lower-left-corner . #x255A ) ; #\BOX_DRAWINGS_DOUBLE_UP_AND_RIGHT / 0xE2 0x95 0x9A - ( :double-upper-right-corner . #x2557 ) ; #\BOX_DRAWINGS_DOUBLE_DOWN_AND_LEFT / 0xE2 0x95 0x97 - ( :double-lower-right-corner . #x255D ) ; #\BOX_DRAWINGS_DOUBLE_UP_AND_LEFT / 0xE2 0x95 0x9D - ( :double-tee-pointing-left . #x2563 ) ; #\BOX_DRAWINGS_DOUBLE_VERTICAL_AND_LEFT / 0xE2 0x95 0xA3 - ( :double-tee-pointing-right . #x2560 ) ; #\BOX_DRAWINGS_DOUBLE_VERTICAL_AND_RIGHT / 0xE2 0x95 0xA0 - ( :double-tee-pointing-up . #x2569 ) ; #\BOX_DRAWINGS_DOUBLE_UP_AND_HORIZONTAL / 0xE2 0x95 0xA9 - ( :double-tee-pointing-down . #x2566 ) ; #\BOX_DRAWINGS_DOUBLE_DOWN_AND_HORIZONTAL / 0xE2 0x95 0xA6 - ( :double-horizontal-line . #x2550 ) ; #\BOX_DRAWINGS_DOUBLE_HORIZONTAL / 0xE2 0x95 0x90 - ( :double-vertical-line . #x2551 ) ; #\BOX_DRAWINGS_DOUBLE_VERTICAL / 0xE2 0x95 0x91 - ( :double-crossover-plus . #x256C ))) ; #\BOX_DRAWINGS_DOUBLE_VERTICAL_AND_HORIZONTAL / 0xE2 0x95 0xAC - -(defun wacs (char-name) - "Take a keyword symbol, return the wide unicode integer representing the ACS char." - (cdr (assoc char-name wide-acs-alist))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/addch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/addch.lisp deleted file mode 100644 index a237026..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/addch.lisp +++ /dev/null @@ -1,230 +0,0 @@ -(in-package :de.anvi.croatoan) - -;; (add scr #\a :y 10 :x 10) -;; (add scr "b" :y 11 :x 10) -;; (add scr #\a :y 10 :x 10 :attributes '(:underline) :color-pair '(:yellow :red)) -;; (add scr "bat" :y 11 :x 10 :attributes '(:underline :bold) :color-pair '(:black :green)) -;; (add scr #\a :position (list 10 10)) - -(defun add (window object &rest keys &key &allow-other-keys) - "Add the text object to the window, then advance the cursor. - -Currently supported text objects are characters (simple and complex), -characters given by integer codes or keywords, and strings -(simple and complex). - -If the position coordinates y (row) and x (column) are given, move the -cursor to the position first and then add the object. - -The position can also be passed in form of a two-element list. - -If n is given for a char, write n chars. If n is -1, add as many chars -as will fit on the line. - -If n is given for a string, add at most n chars from the string. -If n is -1, add as many chars from the string as will fit on the line." - (let ((fn (typecase object - ((or string complex-string) - #'add-string) - ((or integer keyword character complex-char) - #'add-wide-char)))) - (apply fn window object keys))) - -(defun distance-to-eol (window) - "Return the number of columns from the cursor position to the end of the line in the window." - (- (width window) (cadr (cursor-position window)))) - -(defun distance-to-bottom (window) - "Return the number of lines from the cursor position to the bottom of the window." - (- (height window) (car (cursor-position window)))) - -(defun add-char (window char &key attributes fgcolor bgcolor color-pair style y x position n) - "Add the narrow (single-byte) char to the window, then advance the cursor. - -If the position coordinates y (row) and x (column) are given, move the -cursor to the position first and then add the character. - -The position can also be passed in form of a two-element list. - -If n is given for a char, write n chars. If n is -1, add as many chars -as will fit on the line. - -Example: (add-char scr #\a :attributes '(:bold) :color-pair '(:red :yellow))" - (when (and y x) (move window y x)) - (when position (apply #'move window position)) - (let ((attributes (if style - (getf style :attributes) - attributes)) - (color-pair (cond (style - (list (getf style :fgcolor) (getf style :bgcolor))) - ((or fgcolor bgcolor) - (list fgcolor bgcolor)) - (t color-pair)))) - (funcall-make-chtype #'%waddch window char attributes color-pair n))) - -;; At the moment, echo is just a wrapper for echo-wide-char. -(defun echo (window char &rest keys &key &allow-other-keys) - "Add one character to the window, then advance the cursor. - -If the position coordinates y (row) and x (column) are given, move the -cursor to the position first and then add the character. - -The position can also be passed in form of a two-element list. - -If n is given for a char, write n chars. If n is -1, add as many chars -as will fit on the line. - -If char is a complex-char, its own style overrides any style parameters. - -If a style is passed, it overrides attributes and color-pair." - (apply #'echo-wide-char window char keys)) - -(defun echo-char (window char &key attributes fgcolor bgcolor color-pair style y x position) - "Add one narrow (single-byte) character to the window, then refresh the window. - -If the position coordinates y (row) and x (column) are given, move the -cursor to the position first and then echo the character. - -The position can also be passed in form of a two-element list. - -The only difference to add-char and a subsequent refresh is a -performance gain if we know that we only need to output a single -character." - (when (and y x) (move window y x)) - (when position (apply #'move window position)) - (let ((count 1) - (fn (typecase window - ;; a pad is a subclass of window, therefore we have to check pad first. - (pad #'%pechochar) - (window #'%wechochar))) - (attributes (if style - (getf style :attributes) - attributes)) - (color-pair (cond (style - (list (getf style :fgcolor) (getf style :bgcolor))) - ((or fgcolor bgcolor) - (list fgcolor bgcolor)) - (t color-pair)))) - (funcall-make-chtype fn window char attributes color-pair count))) - -;; just an utility function if you dont want to use (format nil "bla -;; bla ~%") to insert newlines. in C you can simply insert \n. -(defun new-line (window &optional (count 1)) - "Insert count newline characters into window." - (loop repeat count do (add-char window (char-code #\newline)))) - -;; pointer to the global/external c acs array, acs_map[]. -;; also see defcvar + get-var-pointer -(defparameter acs-map-array (foreign-symbol-pointer "acs_map")) - -;; ncurses maps those standard chars at runtime to the acs characters. -;; here we use it in the function acs. -(defparameter acs-alist - ;; VT100 symbols - '(( :upper-left-corner . #\l ) - ( :lower-left-corner . #\m ) - ( :upper-right-corner . #\k ) - ( :lower-right-corner . #\j ) - ( :tee-pointing-left . #\u ) - ( :tee-pointing-right . #\t ) - ( :tee-pointing-up . #\v ) - ( :tee-pointing-down . #\w ) - ( :horizontal-line . #\q ) - ( :vertical-line . #\x ) - ( :crossover-plus . #\n ) - - ( :scan-line-1 . #\o ) - ( :scan-line-9 . #\s ) - ( :diamond-symbol . #\` ) - ( :checker-board . #\a ) - ( :degree-symbol . #\f ) - ( :plus-minus . #\g ) - ( :bullet-symbol . #\~ ) - - ;; Teletype 5410v1 symbols - ( :arrow-pointing-left . #\, ) - ( :arrow-pointing-right . #\+ ) - ( :arrow-pointing-down . #\. ) - ( :arrow-pointing-up . #\- ) - ( :board . #\h ) - ( :lantern-symbol . #\i ) - ( :solid-square-block . #\0 ) - - ;; ncurses characters - ( :scan-line-3 . #\p ) - ( :scan-line-7 . #\r ) - ( :less-than-or-equal . #\y ) - ( :greater-than-or-equal . #\z ) - ( :pi . #\{ ) - ( :not-equal . #\| ) - ( :uk-pound-sterling . #\} ) - - ;; thick line drawing characters - ( :thick-upper-left-corner . #\L ) - ( :thick-lower-left-corner . #\M ) - ( :thick-upper-right-corner . #\K ) - ( :thick-lower-right-corner . #\J ) - ( :thick-tee-pointing-left . #\U ) - ( :thick-tee-pointing-right . #\T ) - ( :thick-tee-pointing-up . #\V ) - ( :thick-tee-pointing-down . #\W ) - ( :thick-horizontal-line . #\Q ) - ( :thick-vertical-line . #\X ) - ( :thick-crossover-plus . #\N ) - - ;; double-line drawing characters - ( :double-upper-left-corner . #\C ) - ( :double-lower-left-corner . #\D ) - ( :double-upper-right-corner . #\B ) - ( :double-lower-right-corner . #\A ) - ( :double-tee-pointing-left . #\G ) - ( :double-tee-pointing-right . #\F ) - ( :double-tee-pointing-up . #\H ) - ( :double-tee-pointing-down . #\I ) - ( :double-horizontal-line . #\R ) - ( :double-vertical-line . #\Y ) - ( :double-crossover-plus . #\E ))) - -#| - -For 64bit builds of ncurses 6.0, chtype is an unsigned int: - -#if 1 && defined(_LP64) -typedef unsigned chtype; -typedef unsigned mmask_t; -#else -typedef uint32_t chtype; -typedef uint32_t mmask_t; -#endif - -For 64bit builds of ncurses 5.9, chtype is an unsigned long: - -#if 0 && defined(_LP64) -typedef unsigned chtype; -typedef unsigned mmask_t; -#else -typedef unsigned long chtype; -typedef unsigned long mmask_t; -#endif - -acs_map[] is an chtype array: - -#if 0 || NCURSES_REENTRANT -NCURSES_WRAPPED_VAR(chtype*, acs_map); -#define acs_map NCURSES_PUBLIC_VAR(acs_map()) -#else -extern NCURSES_EXPORT_VAR(chtype) acs_map[]; -#endif - -|# - -;; ACS, the alternative/extended character set for line drawing. -;; Used by functions: add-char, box and border. -;; -;; * http://www.melvilletheatre.com/articles/ncurses-extended-characters/index.html -;; * http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/misc.html -;; -;; Example: (acs 'ULCORNER) -(defun acs (char-name) - "Take a symbol, return the integer representing the acs char." - (mem-aref acs-map-array 'chtype (char-code (cdr (assoc char-name acs-alist))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/addstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/addstr.lisp deleted file mode 100644 index c87ce31..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/addstr.lisp +++ /dev/null @@ -1,42 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun add-string (window string &key attributes fgcolor bgcolor color-pair style y x position n) - "Add the unrendered string to the window. - -If n is given, add at most n chars from the string. If n is -1, as -many chars will be added that will fit on the line. - -If the position coordinates y (row) and x (column) are given, move the -cursor to the position first and then add the object. - -The position can also be passed in form of a two-element list." - (when (and y x) (move window y x)) - (when position (apply #'move window position)) - (let ((count (if n - (if (= n -1) - (- (width window) (cadr (cursor-position window))) - n) - ;; we cant use length to determine the length of a complex string - ;; because it is not a sequence. - (typecase string - (string (length string)) - (complex-string (length (complex-char-array string))))))) - (typecase string - (string - ;;(if (or attributes fgcolor bgcolor color-pair style) - ;; lisp string combined with attributes and colors - (loop - repeat count - for ch across string - do (add-wide-char window ch :attributes attributes :fgcolor fgcolor :bgcolor bgcolor - :color-pair color-pair :style style)) ) - ;; simple lisp string, no attributes or colors - ;; TODO 190826 we dont want to use this because we want to force color-set and bkgd to use separate colors - ;;(if n - ;; (%waddnstr (winptr window) string n) - ;; (%waddstr (winptr window) string)))) - (complex-string - (loop - repeat count - for ch across (complex-char-array string) - do (add-wide-char window ch)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/attr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/attr.lisp deleted file mode 100644 index 8d0f460..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/attr.lisp +++ /dev/null @@ -1,501 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defparameter *ansi-color-list* - '(:black :red :green :yellow :blue :magenta :cyan :white)) - -;; this list should be in color.lisp, not here. -;; but attr.lisp is loaded before color.lisp. -(defparameter *xterm-color-name-list* - '(:black :maroon :green :olive :navy :purple :teal :silver - :gray :red :lime :yellow :blue :magenta :cyan :white)) - -(defparameter *default-color-pair* nil) - -;; do not use the color alist but the two color lists, for 8 and 256 colors -;; in the 256 colors mode, only the first 16 colors are named. -;; the terminal default colors are only available when -;; the screen is initialized with :use-terminal-colors t -;; the :terminal color number is -1. -(defun color-name-to-number (color-name) - "Take a keyword denoting a color name, return the color number." - (let* ((name (cond ((eq color-name :default-fg) - (car *default-color-pair*)) - ((eq color-name :default-bg) - (cadr *default-color-pair*)) - (t color-name))) - ;; generate an alist of colors in the form ((:terminal . -1) (:black . 0) ...) - ;; depending on whether we use 8 or 256 colors, we have different names for the same color numbers. - (alist (if (<= %colors 8) - (loop - for i from -1 to 7 - for j in (cons :terminal *ansi-color-list*) - collect (cons j i)) - (loop - for i from -1 to 15 - for j in (cons :terminal *xterm-color-name-list*) - collect (cons j i)))) - (number (cdr (assoc name alist)))) - (if number - number - (error "color-name-to-number: color name ~A does not exist." name)))) - -;; address a color by: -;; integer: color number 0-255, so we can cycle through all available colors -;; keyword: it doesnt exist for all 256 colors -;; string: "#ff00ff" hex triplet in web-notation. string-length = 7, first char = # - -;; a color can also be given as a list, where the first element is a keyword -;; denoting the coding scheme. - -;; (:number 255) -;; (:name :black) -;; (:hex #xff00ff) -;; TODO: (:hex "#ff00ff") -;; TODO: (:rgb 255 00 255) -;; TODO: (:hsv 10 15 245) - -;; TODO: naming conflict with color->number -;; after we can convert everything to a color number, add this function to -;; pair-to-number, so we can generate a color pair out of every color notation. -(defun color-to-number (color) - "Takes a color in various notations, converts that notation to the exact or most appropriate color number." - (typecase color - ;; hex rgb code - ;; we cant use hex codes when in 8-color ansi mode, because the 8 ansi colors - ;; are only defined by names, not by rgb color contents. - (integer (hex-to-sgr color)) - ;; color name, for now ONLY the first 8 ansi colors and 16 web colors - ;; TODO: expand to all x11 color names - (keyword (color-name-to-number color)) - ;; a list in the form of (:type value). - (list - (let ((type (car color)) - (val (cadr color))) - (case type - ;; direct input of the color number, just return it. - (:number val) - ;; keyword denoting the color name - (:name (color-name-to-number color)) - (:hex - (typecase val - ;; hex rgb notation, for example (:hex #x00ff00) - (integer (hex-to-sgr color))))))))) - -;; keys are 2 element lists of the form: (:fgcolor :bgcolor) -;; fgcolor and bgcolor are keyword symbols -;; vals are integers that represent ncurses color pairs. -;; only one color pair, 0, is predefined: (:default :default), -;; which is identical to (:white :black) if use-terminal-colors is nil. -;; if use-terminal-colors is t, it is whatever color pair the terminal -;; used before the ncurses init. -;; TODO: this also could be a hashmap -;; TODO: move this to be a screen variable, so it gets reset on every screen init -;; for now it is reset to nil on evey screen init by set-default-color-pair -(defparameter *color-pair-alist* nil) - -(defun use-terminal-colors-p (screen) - (slot-value screen 'use-terminal-colors-p)) - -(defun (setf use-terminal-colors-p) (flag screen) - (setf (slot-value screen 'use-terminal-colors-p) flag) - (if flag - (progn - (%use-default-colors) - (setf (default-color-pair screen) (list :terminal :terminal))) - (setf (default-color-pair screen) (list :white :black)))) - -(defun default-color-pair (screen) - (declare (ignore screen)) - *default-color-pair*) - -(defun (setf default-color-pair) (color-pair screen) - "Set the colors which will comprise the default color pair 0. - -The default color pair is used when no other colors are specified. - -The ncurses default color pair is white on black. - -If the terminal can set its own colors, they are named :terminal." - (setf *default-color-pair* color-pair) - (%assume-default-colors (color-name-to-number (car color-pair)) - (color-name-to-number (cadr color-pair)))) - -;; called from initialize-instance :after ((scr screen) -;; test with t09a -(defun set-default-color-pair (use-terminal-colors-p) - ;; reset the color pair alist on every screen init - (setf *color-pair-alist* nil) - (if use-terminal-colors-p - (progn - (%use-default-colors) - (setf *default-color-pair* (list :terminal :terminal))) - (setf *default-color-pair* (list :white :black))) - ;; we cant make :white :black be pair 0, because pair 0 is ignored on several occasions - ;; Example: when color-pair of a window is set to pair 1 - ;; adding a char with 0 is ignored and the char is added with pair 1. - ;; we have to add white on black as a number bigger than 0. - (setf *color-pair-alist* (acons '(:default-fg :default-bg) 0 *color-pair-alist*))) - -(defun pair-to-number (pair) - "Take a two-element list of colors, return the ncurses pair number. - -The colors can be keywords or numbers -1:255. - --1 is the :terminal default color when use-terminal-colors-p is t. - -If it is a new color pair, add it to ncurses, then return the new pair number. - -If the pair already exists, return its pair number. - -If pair is nil, return the default color number, 0. - -Example: - -(pair-to-number '(:white :black)) => 0" - (if pair - (let ((result (assoc pair *color-pair-alist* :test #'equal))) - (if result - ;; if the entry already exists, just return the pair number. - (cdr result) - ;; if the pair doesnt exist, create a new pair number - (let ((new-pair-number (list-length *color-pair-alist*))) - ;; add it to the alist first. - (setf *color-pair-alist* (acons pair new-pair-number *color-pair-alist*)) - ;; then add it to ncurses. - (let ((fg (car pair)) - (bg (cadr pair))) - (%init-pair new-pair-number (color-to-number fg) (color-to-number bg))) - ;; return the newly added pair number. - new-pair-number))) - ;; If pair is nil, return the default color number, 0. - 0)) - -;; TODO: cross check with the ncurses primitives that we get the same result. -;; TODO: number-to-pair -(defun number-to-pair (number) - "Take a pair number, return a color pair in a 2 element list of keywords." - (car (rassoc number *color-pair-alist*))) - -;; We cant run complete-pair here, because we dont have the window. -;; we have to run complete-pair within add-char, add-wide-char, etc. -(defun complete-default-pair (color-pair) - "Take a color pair possibly containing nil, return a pair completed from the default color pair 0." - (let ((fg (car color-pair)) - (bg (cadr color-pair)) - (default-pair (number-to-pair 0))) - (cond - ;; when both colors are given, just return the original pair - ((and color-pair fg bg) color-pair) - - ;; when the pair is nil or when both colors are missing - ((or (null color-pair) - (and (null fg) (null bg))) - ;; just return the default pair - default-pair) - - ;; when only the bg is missing, complete the bg - ((null bg) - (list fg (cadr default-pair))) - - ;; when only the fg is missing, complete the fg - ((null fg) - (list (car default-pair) bg))))) - -(defun complete-pair (window pair) - "If either the foreground or background color is nil, complete the pair for the given window. - -Return the completed pair. - -Try to complete the missing colors in the following order: - -1. window color pair. -2. window background character color pair. -3. ncurses default color pair 0 (white on black or the terminal default color pair)." - (let ((fg (car pair)) - (bg (cadr pair))) - (cond - ;; when both colors are given, just return the original pair - ((and pair fg bg) pair) - - ;; when the pair is nil or when both colors are missing - ((or (null pair) - (and (null fg) (null bg))) - (cond - ((color-pair window) - ;; if color pair exists, but is not complete, complete it recursively in a second step. - ;; if we have fg from color pair, and a bg from background, they will be combined. - (complete-pair window (color-pair window))) - ((and (background window) - (color-pair (background window))) - (complete-pair window (color-pair (background window)))) - (t (number-to-pair 0)))) - - ;; when only the bg is missing, complete the bg - ((null bg) - (cond - ((cadr (color-pair window)) - (list fg (cadr (color-pair window)))) - ((and (background window) - (cadr (color-pair (background window)))) - (list fg (cadr (color-pair (background window))))) - (t - (list fg (cadr (number-to-pair 0)))))) - - ;; when only the fg is missing, complete the fg - ((null fg) - (cond - ((car (color-pair window)) - (list (car (color-pair window)) bg)) - ((and (background window) - (car (color-pair (background window)))) - (list (car (color-pair (background window))) bg)) - (t - (list (car (number-to-pair 0)) bg)))) ))) - -;; TODO: use %wattr_on instead of %wattron, also for get and set -(defun add-attributes (win attributes) - "Takes a list of keywords and turns the appropriate attributes on." - (dolist (i attributes) - (setf (attributes win) (adjoin i (attributes win))) - (%wattron (winptr win) (get-bitmask i)))) - -(defun remove-attributes (win attributes) - "Takes a list of keywords and turns the appropriate attributes off." - (dolist (i attributes) - (setf (attributes win) (remove i (attributes win))) - (%wattroff (winptr win) (get-bitmask i)))) - -;; (set-attributes scr '(:bold :underline)) -;; set-attributes overwrites color settings because it treats color as an attribute. -;; thats why we wont use it directly. -(defun set-attributes (winptr attributes) - "Takes a list of keywords and sets the appropriate attributes. - -Overwrites any previous attribute settings including the color." - (%wattrset winptr - (apply #'logior (loop for i in attributes collect (get-bitmask i))))) - -;; (%wchgat (winptr win) 9 #x00040000 0 (null-pointer)) -(defun change-attributes (win n attributes &key color-pair y x position) - "Change the attributes of n chars starting at the current cursor position. - -If n is -1, as many chars will be added as will fit on the line. - -If the destination coordinates y and x are given, the attributes are changed -from the given point without moving the cursor position." - (when (and y x) (move win y x)) - (when position (apply #'move win position)) - (let ((attrs (attrs2chtype attributes)) - (pair-number (pair-to-number (complete-pair win color-pair)))) - (%wchgat (winptr win) n attrs pair-number (null-pointer)))) - -(defun set-color-pair (winptr color-pair) - "Sets the color attribute of the window only." - (%wcolor-set winptr - (pair-to-number (complete-default-pair color-pair)) - (null-pointer))) - -(defparameter *bitmask-alist* - ;; the first four are not attributes, but bitmasks used to extract parts of the chtype. - '((:normal . #x00000000) - (:attributes . #xffffff00) - (:chartext . #x000000ff) - (:color . #x0000ff00) - ;; we have 16 attributes that can be set. - ;; In general, only underline, bold and reverse are widely supported by terminals. - (:standout . #x00010000) - (:underline . #x00020000) - (:reverse . #x00040000) - (:blink . #x00080000) - (:dim . #x00100000) - (:bold . #x00200000) - (:altcharset . #x00400000) - (:invis . #x00800000) - (:protect . #x01000000) - (:horizontal . #x02000000) - (:left . #x04000000) - (:low . #x08000000) - (:right . #x10000000) - (:top . #x20000000) - (:vertical . #x40000000) - (:italic . #x80000000))) - -;; TODO: signal an error if passed an invalid attribute. -(defun get-bitmask (attribute) - "Returns an ncurses attr/chtype representing the attribute keyword." - (cdr (assoc attribute *bitmask-alist*))) - -(defparameter *valid-attributes* - '(:standout - :underline - :reverse - :blink - :dim - :bold - :altcharset - :invis - :protect - :horizontal - :left - :low - :right - :top - :vertical - :italic)) - -(defun chtype2attrs (ch) - "Take a chtype, return a list of used attribute keywords." - (loop - for i in *valid-attributes* - if (logtest ch (get-bitmask i)) collect i)) - -;; used in: make-chtype, change-attributes -(defun attrs2chtype (attrs) - "Take a list of attribute keywords, return a chtype with the attribute bits set." - (if attrs - ;; the attribute bitmasks already are bit-shifted to the correct position in the chtype - ;; we just need to OR them all together - (apply #'logior (mapcar #'get-bitmask attrs)) - ;; if the attribute list is nil, logior returns 0. - ;; but to emphasize intent, we explicitely return 0 if the attribute list is nil. - 0)) - -(defun colors2chtype (color-pair) - "Take a list of a color pair, return a chtype with the color attribute set." - (if color-pair - ;; convert the pair to an integer, then bit shift it by 8 - ;; right shift by 8 to get the color bits at their proper place in a chtype. - ;; you cannot simply logior the pair number because that would overwrite the char. - (ash (pair-to-number color-pair) 8) - 0)) - -;; usage: c2x, extract wide char, everywhere where number-to-pair is used. -;; first get the color attribute bits by log-AND-ing them with the ch. -;; then right shift them by 8 to extract the color pair short int from them. -;; then get the color pair (:white :black) associated with that number. -(defun chtype2colors (ch) - "Take a chtype or attr_t integer, return a list of two keywords denoting a color pair." - (number-to-pair (ash (logand ch (get-bitmask :color)) -8))) - -(defun char2chtype (char) - "Take a character in different forms, return a chtype containing that character." - (if char - (typecase char - ;; if the char is already an integer from char-code. - (integer char) - ;; alternative chars are given as keywords - ;; we use acs only when we produce chtypes, for cchar_t, we need wacs. - (keyword (acs char)) - ;; if it is a lisp char, convert it to an integer first - (character (char-code char)) - ;; if char is any other type, we dont handle it for now. - (otherwise (error "char2chtype: char is not integer, keyword or character."))) - 0)) - -;;; ------------------------------------------------------------------ - -(defun make-chtype (char attributes color-pair) - "Assemble a chtype out of a char, attributes and a color-pair. - -char can be a lisp character, an ACS keyword, or an integer code point. - -attributes should be a list of valid attribute keywords. - -color-pair should be a list of a foreground and background color keyword. - -attributes and color-pair can be nil. - -If char is a complex char, and the attributes and color-pair are passed, -they override the attributes and the color-of the complex char." - (typecase char - ;; x2c itself calls make-chtype - (complex-char (xchar2chtype char)) - ;; we first convert all three parameters to separate integers, - ;; then OR them together to create the chtype. - (otherwise (logior (char2chtype char) - (attrs2chtype attributes) - (colors2chtype color-pair))))) - -;; factor out count calculation and complete-pair -(defun funcall-make-chtype (fn window char attributes color-pair n) - "Assemble a chtype out of a char, attributes and a color-pair. - -Apply low-level ncurses function fn count times to window and chtype. - -chtype is a 32-bit integer representing a non-wide complex-char in ncurses. - -char can be a lisp character, an ACS keyword, an integer code point or -a complex char. - -attributes should be a list of valid attribute keywords. - -color-pair should be a list of a foreground and background color keyword. - -attributes and color-pair can be nil. - -If char is a complex char, attributes and color-pair are ignored." - (let ((winptr (winptr window)) - (count (if n - (if (= n -1) - (distance-to-eol window) - n) - 1)) - (chtype (make-chtype char attributes (complete-pair window color-pair)))) - (case count - (0 nil) - (1 (funcall fn winptr chtype)) - (otherwise (dotimes (i count) - (funcall fn winptr chtype)))))) - -;; Example: (xchar2chtype (chtype2xchar 2490466)) => 2490466 - -(defun xchar2chtype (ch) - "Convert a croatoan complex char to an integral ncurses chtype." - (make-chtype (simple-char ch) - (attributes ch) - (color-pair ch))) - -(defun chtype2xchar (ch) - "Converts a ncurses chtype to croatoan complex-char." - (make-instance 'complex-char - :simple-char (code-char (logand ch (get-bitmask :chartext))) - :attributes (loop for i in *valid-attributes* - if (logtest ch (get-bitmask i)) collect i) - ;; first get the color attribute bits by log-AND-ing them with ch. - ;; then right shift them by 8 to extract the color int from them. - ;; then get the color pair (:white :black) associated with that number. - :color-pair (number-to-pair (ash (logand ch (get-bitmask :color)) -8)))) - -(defgeneric convert-char (char result-type) - (:documentation "Take a char and convert it to a char of result-type.")) - -;; The lisp class representing chtype is complex-char. -(defmethod convert-char ((char complex-char) result-type) - (case result-type - (:simple-char (simple-char char)) - (:chtype (xchar2chtype char)))) - -;; Lisps character object is here called "simple-char". -(defmethod convert-char ((char character) result-type) - (case result-type - (:complex-char (make-instance 'complex-char :simple-char char :attributes nil)) - (:chtype (char-code char)))) - -;; chtype is a ncurses unsigned long, an integer. -(defmethod convert-char ((char integer) result-type) - (case result-type - (:simple-char (code-char (logand char (get-bitmask :chartext)))) - (:complex-char (chtype2xchar char)))) - - -;;; TODOs - -;; todo: convert-char -> convert - -;; [ ] add type asserts. -;; what is an attr_t? get all ncurses types definitions. - -;; make it clear which routines use xchars and which use chtypes. -;; make all user visible apis use xchars and only internally convert to chtypes. -;; functions to manipulate attributes and colors of xchars. -;; the char part of an xchar should not be changeable. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/beep.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/beep.lisp deleted file mode 100644 index f56d8ba..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/beep.lisp +++ /dev/null @@ -1,11 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun alert (&optional (type :beep)) - (case type - (:beep (%beep)) - (:flash (%flash)) - (otherwise (error "Available alert types: :beep :flash")))) - -;;; TODOs - -;; [ ] Return values, errors. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/bkgd.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/bkgd.lisp deleted file mode 100644 index 8b9a0d1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/bkgd.lisp +++ /dev/null @@ -1,32 +0,0 @@ -(in-package :de.anvi.croatoan) - -;; bkgd applies to every cell in the window. -;; bkgdset applies only to new chars inserted after the call to bkgdset. -;; i.e. with bkgd we manipulate the existing text, with bkgdset the new text. - -;; the attribute part of the background char is combined with any chars added. -;; because of that, we cant use alternate chars as background chars, since -;; :altcharset is an attribute. - -(defun set-background-char (winptr xchar &optional (apply t)) - "Set a complex single-byte character as the background of a window. - -The attribute part of the background character is combined with -simple characters in the window. - -If apply is t, the background setting is immediately applied to all cells -in the window. - -Otherwise, it is applied only to newly added simple characters." - (let ((chtype (xchar2chtype xchar))) - (if apply - ;; the background char is applied to every cell in the window by default. - (%wbkgd winptr chtype) - ;; if apply is nil, the background is combined only with new characters. - (%wbkgdset winptr chtype)))) - -(defun get-background-char (window) - "Return the complex char that is the background character of the window." - (let* ((winptr (winptr window)) - (chtype (%getbkgd winptr))) - (chtype2xchar chtype))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/bkgrnd.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/bkgrnd.lisp deleted file mode 100644 index 461d039..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/bkgrnd.lisp +++ /dev/null @@ -1,51 +0,0 @@ -(in-package :de.anvi.croatoan) - -;; bkgrnd applies to every char in the window. -;; bkgrndset applies only to new chars inserted after the call to bkgdset. -;; i.e. with bkgrnd we manipulate the existing text, with bkgrndset the new text. - -;; the attribute part of the background char is combined with any chars added. -;; because of that, we cant use alternate chars as background chars, since -;; :altcharset is an attribute. - -(defun set-background-cchar_t (window char &optional (apply t)) - "Set a wide complex character as the background of a window. - -The attribute part of the background character is combined with -simple characters added to the window. - -If apply is t, the background setting is immediately applied to all cells -in the window. - -Otherwise, it is applied only to newly added simple characters." - (let ((fn (if apply #'%wbkgrnd #'%wbkgrndset)) - (count 1)) - (if char - (funcall-make-cchar_t fn window char nil nil count) - ;; setting char to nil means to unset the background - ;; unset the background means set space as char and the default color pair 0 - (funcall-make-cchar_t fn window #\space nil (number-to-pair 0) count)))) - -;; used in: get-background-cchar_t, extract-wide-char -(defun funcall-get-cchar_t (fn window) - "Call function fn to read a cchar_t from window and return it as a wide complex char." - (with-foreign-object (ptr '(:struct cchar_t)) - ;; read a struct cchar_t into the space allocated with ptr - (funcall fn (winptr window) ptr) - ;; the slot cchar-chars is a a pointer to the wchar_t array. - (let* ((char (mem-aref (foreign-slot-pointer ptr '(:struct cchar_t) 'cchar-chars) 'wchar_t 0)) - ;; ABI6 - (col (foreign-slot-value ptr '(:struct cchar_t) 'cchar-colors)) - (attr (foreign-slot-value ptr '(:struct cchar_t) 'cchar-attr))) - (make-instance 'complex-char - :simple-char (code-char char) - :attributes (chtype2attrs attr) - ;; ABI6 - ;;:color-pair (number->pair col) - ;; ABI5 - ;; the color pair is not placed into the cchar_t slot, but ORed into the attribute int. - :color-pair (chtype2colors attr))))) - -(defun get-background-cchar_t (window) - "Return the wide complex char that is the background character of the window." - (funcall-get-cchar_t #'%wgetbkgrnd window)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/border.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/border.lisp deleted file mode 100644 index 8ca4ee7..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/border.lisp +++ /dev/null @@ -1,23 +0,0 @@ -(in-package :de.anvi.croatoan) - -;; (box win hline vline) = (draw-border win vline vline hline hline nil nil nil nil) -(defun box (window &optional (hline-char 0) (vline-char 0)) - "Draw a border around the window. - -If any parameter is nil or zero, the default ACS char will be used." - (let ((winptr (winptr window))) - (%box winptr hline-char vline-char))) - -(defun draw-border (window &key left right top bottom ;; lines - top-left top-right bottom-left bottom-right) ;; corners - "Draw a border around the window using single-byte line-drawing characters. - -If no border chars are given, the default ncurses ACS chars will be used." - (let ((winptr (winptr window))) - (apply #'%wborder - winptr - ;; if the argument is not nil, convert it to chtype first, the pass it to wborder. - ;; if the argument is nil, pass 0 to wborder, then the default ACS char will be used. - (mapcar #'(lambda (i) (if i (make-chtype i nil nil) 0)) - (list left right top bottom ;; lines - top-left top-right bottom-left bottom-right))))) ;; corners diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/border_set.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/border_set.lisp deleted file mode 100644 index e1dff1f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/border_set.lisp +++ /dev/null @@ -1,39 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun draw-wide-border (window &key left right top bottom - top-left top-right bottom-left bottom-right) - "Draw a border around the window using (wide) unicode line-drawing characters. - -If no border chars are given, the default ncurses WACS chars will be used." - (with-foreign-objects ((ls '(:struct cchar_t)) - (rs '(:struct cchar_t)) - (ts '(:struct cchar_t)) - (bs '(:struct cchar_t)) - (tl '(:struct cchar_t)) - (tr '(:struct cchar_t)) - (bl '(:struct cchar_t)) - (br '(:struct cchar_t)) - (wch 'wchar_t 5)) - (apply #'%wborder-set - (winptr window) - - ;; take a list of (wide) character codes and empty cchar_t pointers, return a list of cchar_t pointers or null pointers. - (mapcar #'(lambda (char ptr) - (if char - ;; if nil, then null-pointer, then the default wacs will be used - ;; if not nil, pointer to cchar_t - (progn - ;; blank the wch array in the struct - (dotimes (ii 5) (setf (mem-aref wch 'wchar_t ii) 0)) - ;; copy the char code to the wch array - (setf (mem-aref wch 'wchar_t) char) - ;; assemble the cchar_t using %setcchar - (%setcchar ptr wch 0 0 (null-pointer)) - ;; return the pointer to the cchar_t - ptr) - ;; if the char is not passed, return a null-pointer. - (null-pointer))) - ;; list of passed character codes - (list left right top bottom top-left top-right bottom-left bottom-right) - ;; list of pointers to allocated cchar_t structs - (list ls rs ts bs tl tr bl br))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/classes.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/classes.lisp deleted file mode 100644 index ada06ff..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/classes.lisp +++ /dev/null @@ -1,1564 +0,0 @@ -(in-package :de.anvi.croatoan) - -;; (defclass name (superclasses) (slots) class-options) - -;;; data types - -;; will be abbreviated as "xchar" or "xch" in function parameters. -(defclass complex-char () - ((simple-char - :initarg :simple-char - :initform nil - :type (or null integer character keyword) - :accessor simple-char - :documentation "Lisp primitive character type, like #\a.") - - (attributes - :initarg :attributes - :initform '() - :type (or null cons) - :accessor attributes - :documentation "List of keywords denoting attributes.") - - (fgcolor - :initarg :fgcolor - :initform nil - :type (or null keyword integer list) - :accessor fgcolor - :documentation "A keyword denoting the foreground color of the complex character.") - - (bgcolor - :initarg :bgcolor - :initform nil - :type (or null keyword integer list) - :accessor bgcolor - :documentation "A keyword denoting the background color of the complex character.")) - - (:documentation - "A complex char consists of a simple char, a list of attribute keywords and a pair of color keywords.")) - -(defmethod initialize-instance :after ((xch complex-char) &key color-pair) - "If color-pair is passed as a keyword, set fgcolor and bgcolor." - (when color-pair - (with-slots (fgcolor bgcolor) xch - (setf fgcolor (car color-pair) - bgcolor (cadr color-pair))))) - -(defun set-equal (list-a list-b &key (test #'eq) (key #'identity)) - "Compare if every element of list-a is contained in list-b. - -The order of elements in lists does not matter, so the lists are actually treated as sets. - -The items of the set are extracted using function 'key' and compared using predicate 'test'." - (and (= (length list-a) (length list-b)) - (null (set-exclusive-or list-a list-b :test test :key key)))) - -(defun complex-char= (a b) - "Return t if the simple-char, the color pair and the attribute list of a complex-char are equal. - -The initial purpose of this function is to be used as the equality test for alexandria:define-constant." - (with-accessors ((simple-char-a simple-char) - (bgcolor-a bgcolor) - (fgcolor-a fgcolor) - (attributes-a attributes)) a - (with-accessors ((simple-char-b simple-char) - (bgcolor-b bgcolor) - (fgcolor-b fgcolor) - (attributes-b attributes)) b - (let* ((simple-char-equals-p (cond - ((null simple-char-a) - (null simple-char-b)) - ((and (characterp simple-char-a) - (characterp simple-char-b)) - (char= simple-char-a - simple-char-b)) - ((and (integerp simple-char-a) - (integerp simple-char-b)) - (= simple-char-a - simple-char-b)) - (t ; mixed type or keyword - (equalp simple-char-a - simple-char-b))))) - (and simple-char-equals-p - (equalp fgcolor-a fgcolor-b) - (equalp bgcolor-a bgcolor-b) - (set-equal attributes-a attributes-b)))))) - -(defmethod make-load-form ((object complex-char) &optional environment) - "Describe how complex-char objects can be serialized and loaded by the compiler." - (make-load-form-saving-slots object - :slot-names '(simple-char attributes color-pair) - :environment environment)) - -(defclass complex-string () - ((complex-char-array - :initarg :complex-char-array - :initform (make-array 0 :element-type 'complex-char :fill-pointer 0 :adjustable t) - :type vector - :accessor complex-char-array - :documentation "Lisp primitive string type.")) - - (:documentation - "A complex string consists of an array of complex characters.")) - -;; TODO: what to do when there is no init string, when we start empty and build the string char by char, -;; for example when extracting a complex string. -(defmethod initialize-instance :after ((cstr complex-string) &key string attributes fgcolor bgcolor color-pair) - (with-slots (complex-char-array) cstr - (when string - (loop for char across string - do (vector-push-extend - (make-instance 'complex-char :simple-char char :attributes attributes - :fgcolor fgcolor :bgcolor bgcolor :color-pair color-pair) - complex-char-array))))) - -(defclass keymap () - ((bindings - :initarg :bindings - :initform nil - :type (or null cons) - :accessor bindings - :documentation "Alist of events and handler functions.")) - - (:documentation "A keymap contains an alist of events as keys and event handlers or chained keymaps as values.")) - -;; initialize instance takes a plist initarg and converts it to an alist. -(defmethod initialize-instance :after ((keymap keymap) &key bindings-plist) - (with-slots (bindings) keymap - (when (and (null bindings) bindings-plist) - (setf bindings (plist2alist bindings-plist))))) - -(defclass window (fundamental-character-input-stream fundamental-character-output-stream) - ((location - :initarg :location - :initform '(0 0) - :type cons - :documentation "The (y=row x=column) coordinate of the top left corner of the window.") - - (width - :initarg :width - :initform nil - :type (or null integer) - :documentation "The width (second, horizontal, x dimension) of the window.") - - (height - :initarg :height - :initform nil - :type (or null integer) - :documentation "The height (first, vertical, y dimension) of the window.") - - ;; has to be a 2el-list so we can use 1 arg with setf. - (cursor-position - :type cons - :documentation "The current cursor position coordinates in the form (y x).") - - (input-blocking - :initarg :input-blocking - :initform t - :type (or boolean integer) - :documentation "Input mode: blocking (t), non-blocking (nil) or blocking duration in (positive integer) miliseconds.") - - (frame-rate - :initarg :frame-rate - :initform nil - :type (or null integer) - :accessor frame-rate - :documentation "Set the frame rate in fps (frames per second). When input-blocking is nil, sleep for 1/frame-rate seconds between event loop cycles. Has the same effect as setting input-blocking duration, and should thus not be used simultaneously.") - - (function-keys-enabled-p - :initarg :enable-function-keys - :initform nil - :type boolean - :documentation "Enable (t) or disable (nil) support for function keys.") - - (scrolling-enabled-p - :initarg :enable-scrolling - :initform nil - :type boolean - :documentation "Enable (t) or disable (nil) support for window scrolling.") - - (scrolling-region - :initarg :scrolling-region - :initform nil - :type (or null cons) - :documentation "When scrolling is enabled, only scroll the window region from line y1 to y2 given as the list (y1 y2).") - - ;; IC / INS / Insert / Einfg key - ;; this will only apply to lisps standard output functions. - ;; ncurses functions add-char and insert-char can be used explicitely. - (insert-mode-p - :initarg :insert-mode - :initform nil - :type boolean - :accessor insert-mode-p - :documentation "Printing a new char will insert (t) it before the character under the cursor instead of overwriting it (nil, default).") - - ;; we need instance-local bindings so we dont have to create a keymap for every window and every program - (bindings - :initarg :bindings - :initform nil - :type (or null cons) - :accessor bindings - :documentation - "Alist of events (characters, keywords or integers) as keys and handler functions as values. - Used by the run-event-loop function.") - - ;; if using an instance-local binding isnt sufficient, we can create a keymap and reference it in the object. - (keymap - :initarg :keymap - :initform nil - :type (or null symbol keyword keymap) - :accessor keymap - :documentation "Keymap containing the key bindings to be used by run-event-loop instead of the object's own bindings.") - - (background - :initarg :background - :initform nil - :type (or null complex-char) - :documentation - "Sets a complex char with its attributes and colors as the default style of unrendered text and empty cells of the window. - Complex chars with pre-existing attributes and colors are not changed.") - - (attributes - :initarg :attributes - :initform nil - :type (or null cons) - :documentation "A list of keywords denoting attributes of new characters added to a window.") - - (fgcolor - :initarg :fgcolor - :initform nil - :type (or null keyword integer list) - :documentation "A keyword denoting the foreground color of new characters added to the window.") - - (bgcolor - :initarg :bgcolor - :initform nil - :type (or null keyword integer list) - :documentation "A keyword denoting the background color of new characters added to the window.") - - (draw-border-p - :initarg :draw-border - :initform nil - :type boolean - :reader draw-border-p - :documentation "Draw (t) or don't draw (nil, default) an initial border around a window. Not redrawn automatically.") - - (stackedp - :initarg :stacked - :initform nil - :type boolean - :documentation "If stacked is t, the window is added to the global window stack, so overlapping windows can be refreshed in the stacking order.") - - (visiblep - :initarg :visible - :initform t - :type boolean - :accessor visiblep - :documentation "If visible is nil, do not refresh the stacked window when refreshing the window stack.") - - (winptr - :initform nil - :reader winptr - :documentation "Pointer to a C/ncurses WINDOW structure after the window is created.")) - - (:documentation "A curses window object as returned by newwin.")) - -;; also see source/panel.lisp -(defparameter *window-stack* nil) - -;; ":stacked t" or "(setf (stackedp win) t)" adds a new window to the stack -;; "(setf (hidden win) t)" prevents the window from being refreshed. -(defmethod stackedp ((win window)) - (slot-value win 'stackedp)) -(defmethod (setf stackedp) (stackedp (win window)) - (if stackedp - ;; t: check if in stack, if not, add to stack, if yes, error - (if (member win *window-stack* :test #'eq) - (error "setf stackedp t: window already on stack") - (progn - (push win *window-stack*) - (setf (slot-value win 'stackedp) t))) - ;; nil: check if in stack, if yes, remove from stack, if not, error - (if (member win *window-stack* :test #'eq) - (progn - (setf *window-stack* (remove win *window-stack* :test #'eq)) - (setf (slot-value win 'stackedp) t)) - (error "setf stackedp nil: window not on stack")))) - -(defclass screen (window) - ((colors-enabled-p - :initarg :enable-colors - :initform nil - :type boolean - :documentation "Enable (t) or disable (nil) display of colors, if the terminal supports it.") - - (use-terminal-colors-p - :initarg :use-terminal-colors - :initform nil - :type boolean - :documentation - "Use (t) colors set by the terminal (named :terminal) as the default instead of the ncurses default white on black.") - - (cursor-visible-p - :initarg :cursor-visible - :initform t - :type boolean - :documentation "Enable (t) or disable (nil) the display of a visible cursor.") - - (input-echoing-p - :initarg :input-echoing - :initform t - :type boolean - :documentation "Enable (t) or disable (nil) echoing of chars during keyboard input.") - - (input-buffering-p - :initarg :input-buffering - :initform nil - :type boolean - :documentation - "Set whether typed characters will be returned immediately when they are typed (nil, default) - or buffered until Return is typed (t).") - - (process-control-chars-p - :initarg :process-control-chars - :initform t - :type boolean - :documentation - "If input-buffering is nil, set whether some control characters like ^C, ^S, ^Q, ^D will be processed (t, default) - or passed directly to the program (nil). - When input-buffering is t, control chars are always processed and this option has no effect.") - - (newline-translation-enabled-p - :initarg :enable-newline-translation - :initform t - :type boolean - :documentation - "If t (default), the #\return character (CR ^M \r) is automatically translated to newline (NL) on input, - and NL is translated to CR LF on output. - NL is the standard, system independent, portable way to end a line. - It can be either #\linefeed (LF ^J \n) on Linux, carriage #\return on MacOS, CRLF \r\n on Windows. - Setting newline translation to nil is necessary to be able to detect the #\return key.") - - (closed-p - :type boolean - :documentation "Check whether the screen has been closed, without a subsequent call to refresh to reactivate it.")) - - (:documentation "Represents the main window created upon screen initialisation.")) - -(defclass sub-window (window) - ((parent - :initarg :parent - :initform nil - :type (or null window) - :documentation "The parent window which will contain the sub-window.") - - (relativep - :initarg :relative - :initform nil - :type boolean - :documentation "The location of the sub-window is relative to the parent window (t) or to the screen (nil, default).") - - (source-location - :initarg :source-location - :initform nil - :type (or null cons) - :documentation - "Location (y x) of the area of the parent window, which is mapped to the subwindow. - By default it is identical to the location of the subwindow.")) - - (:documentation "A sub-window shares the memory and the display with and has to be contained within a parent window.")) - -(defclass decorated-window (window) - ((sub-window - :initarg :sub-window - :initform nil - :type (or null sub-window) - :reader sub-window - :documentation "Active content window, for example for menu items.") - - (title - :initarg :title - :initform nil - :accessor title - :type (or boolean string) - :documentation "If t, a title of the window will be displayed over the top border.")) - - (:documentation "A decorated-window is a window consisting of a background window for a border, a title and a content sub-window.")) - -(defclass menu-item () - ((name - :initarg :name - :initform nil - :reader name - :type (or null string symbol) - :documentation "Short name of a menu item displayed in the menu.") - - (checkedp - :initarg :checked - :initform nil - :accessor checkedp - :type boolean - :documentation "t if the item has been checked, nil if it hasn't.") - - (value - :initarg :value - :initform nil - :reader value - :type (or symbol string menu menu-window function) - :documentation "Object associated with and returned upon selection of the item.")) - - (:documentation "A menu consists of a list of menu items.")) - -;; default size of ncurses menus is 16 rows, 1 col. -(defclass menu (element) - ((name - :initarg :name - :initform nil - :reader name - :type (or null string symbol) - :documentation "Name of the menu. (For example for setting the menu-window title, if title is t.)") - - (items - :initarg :items - :initform nil - :accessor items - :type (or null cons) - :documentation "List of menu items. Item types can be strings, symbols, other menus or callback functions.") - - (menu-type - :initarg :menu-type - :initform :selection - :accessor menu-type - :type keyword - :documentation "Types of menus: :selection (default, can contain strings, symbols, menus) or :checklist.") - - (menu-location - :initarg :menu-location - :initform nil - :accessor menu-location - :type (or null cons) - :documentation "Relative location of the menu within its associated window.") - - (current-item-number - :initform 0 - :accessor current-item-number - :type integer - :documentation "Number of the currently selected item.") - - (current-item - :initform nil - :type (or null string symbol menu-item) - :accessor current-item - :documentation "Pointer to the currently selected item object. The first item is initialized as the current item.") - - (current-item-location - :initarg :current-item-location - :initform nil - :accessor current-item-location - :type (or null cons) - :documentation - "Location of the current item in the window. - This information is useful for positioning the cursor on the current item after displaying the menu.") - - (current-item-mark - :initarg :current-item-mark - :initform "" - :reader current-item-mark - :type string - :documentation "A string prefixed to the current item in the menu.") - - (cyclic-selection-p - :initarg :cyclic-selection - :initform nil - :accessor cyclic-selection-p - :type boolean - :documentation "Wrap around when the end of a non-scrolled menu is reached.") - - (max-item-length - :initarg :max-item-length - :initform 15 - :accessor max-item-length - :type integer - :documentation "Max number of characters displayed for a single item.") - - (layout - :initarg :layout - :initform nil - :accessor layout - :type (or null cons) - :documentation "Layout (no-of-rows no-of-columns) of the items in the menu. If nil, we have a vertical list.") - - (scrolled-layout - :initarg :scrolled-layout - :initform nil - :accessor scrolled-layout - :type (or null cons) - :documentation "Layout (no-of-rows no-of-columns) of the menu items actually displayed on screen.") - - (scrolled-region-start - :initform (list 0 0) - :accessor scrolled-region-start - :type (or null cons) - :documentation "A 2-element list tracking the starting row/y and column/x of the displayed menu region.") - - ;; we need instance-local bindings so we dont have to create a keymap for every window and every program - (bindings - :initarg :bindings - :initform nil - :type (or null cons) - :accessor bindings - :documentation - "Alist of events (characters, keywords or integers) as keys and handler functions as values. - Used by the run-event-loop function.") - - ;; if using an instance-local binding isnt sufficient, we can create a keymap and reference it in the object. - (keymap - :initarg :keymap - :initform 'menu-map - :type (or null symbol keyword keymap) - :accessor keymap - :documentation "Keymap containing the key bindings to be used by run-event-loop instead of the object's own bindings.") - - (window - :initarg :window - :initform nil - :type (or null window) - :accessor window - :documentation "Window created separately and then associated with the menu.")) - - (:documentation "A menu is a list of items that can be selected by the user.")) - -(defclass menu-window (menu decorated-window) - () - (:documentation "A menu-window is decorated-window providing a list of items to be selected by the user.")) - -;; init for menus which aren't menu windows -(defmethod initialize-instance :after ((menu menu) &key) - (with-slots (type items current-item layout) menu - ;; Convert strings and symbols to item objects - (setf items (mapcar (lambda (x) - (if (typep x 'menu-item) - ;; if an item object is given, just return it - x - ;; if we have strings, symbols or menus, convert them to menu-items - (make-instance 'menu-item - :name (typecase x - (string x) - (symbol (symbol-name x)) - (menu-window (name x)) - (menu (name x))) - :value x))) - ;; apply the function to the init arg passed to make-instance. - items)) - - ;; Initialize the current item as the first item from the items list. - (setf current-item (car items)) - - ;; if the layout wasnt passed as an argument, initialize it as a single one-column menu. - (unless layout (setf layout (list (length items) 1))) )) - -(defmethod initialize-instance :after ((win menu-window) &key color-pair) - (with-slots (winptr items type height width location sub-window draw-border-p layout scrolled-layout max-item-length - current-item-mark fgcolor bgcolor) win - ;; only for menu windows - (when (eq (type-of win) 'menu-window) - (let ((padding (if draw-border-p 1 0))) - ;; if no layout was given, use a vertical list (n 1) - (unless layout (setf layout (list (length items) 1))) - ;; if height and width are not given as initargs, they will be calculated, - ;; according to no of rows +/- border, and _not_ maximized like normal windows. - (unless height (setf height (+ (* 2 padding) (car (or scrolled-layout layout))))) - (unless width (setf width (+ (* 2 padding) (* (cadr (or scrolled-layout layout)) - (+ (length current-item-mark) max-item-length))))) - (setf winptr (%newwin height width (car location) (cadr location))) - (setf sub-window - (make-instance 'sub-window - :parent win :height (car (or scrolled-layout layout)) - :width (* (cadr (or scrolled-layout layout)) (+ (length current-item-mark) max-item-length)) - :location (list padding padding) :relative t)) - (cond ((or fgcolor bgcolor) - (set-color-pair winptr (color-pair win)) - (setf (color-pair sub-window) (color-pair win) - (background win) (make-instance 'complex-char :color-pair (color-pair win)) - (background sub-window) (make-instance 'complex-char :color-pair (color-pair win)) )) - ;; when a color-pair is passed as a keyword - (color-pair - ;; set fg and bg, pass to ncurses - (setf (color-pair win) color-pair - (color-pair sub-window) color-pair - (background win) (make-instance 'complex-char :color-pair color-pair) - (background sub-window) (make-instance 'complex-char :color-pair color-pair)))) )))) - -(defclass dialog-window (menu-window) - ;; this has to be a pad, so we can scroll it if the message is large. - ;; TODO: check how scrolling would work with a subwindow. - ((message-pad - :initform nil - :type (or null pad) - :reader message-pad - :documentation "Passive content window, for example for menu descriptions.") - - ;; check how message is called in the dialog program. - (message-text - :initarg :message-text - :initform nil - :accessor message-text - :type (or null string) - :documentation "Optional message text to describe the choices in the menu below.") - ;; make shorter slot names - (message-height - :initarg :message-height - :initform 0 - :reader message-height - :type integer - :documentation "Max number of lines reserved for the optional message text.") - - (message-pad-coordinates - :initform nil - :reader message-pad-coordinates - :type (or null cons) - :documentation "List of four coordinates where to refresh/display the message pad: min-y min-x max-y max-x.")) - - (:documentation "A dialog is a decorated menu with a title, a message and items.")) - -(defmethod initialize-instance :after ((win dialog-window) &key color-pair center) - (with-slots (winptr items height width location sub-window draw-border-p layout max-item-length current-item-mark - fgcolor bgcolor message-pad message-text message-height message-pad-coordinates) win - ;; only for dialog windows - (when (eq (type-of win) 'dialog-window) - - ;; dialog windows should always have borders - (let ((padding 1)) - ;; if no layout was given, use a vertical list (n 1) - (unless layout (setf layout (list (length items) 1))) - - ;; if height and width are not given as initargs, they will be calculated, - ;; according to no of rows +/- border, and _not_ maximized like normal windows. - (unless height (setf height (+ 2 message-height (* 2 padding) (car layout)))) - (unless width (setf width (+ (* 2 padding) (* (cadr layout) (+ (length current-item-mark) max-item-length))))) - - ;; if the key center was given, calculate location automatically, even if it was explicitely given. - (when center (setf location (list (- (round (/ %LINES 2)) (round (/ height 2))) - (- (round (/ %COLS 2)) (round (/ width 2)))))) - - (setf winptr (%newwin height width (car location) (cadr location))) - (setf sub-window - (make-instance 'sub-window - :parent win :height (car layout) - :width (* (cadr layout) (+ (length current-item-mark) max-item-length)) - :location (list (+ 2 message-height padding) (+ padding 1)) :relative t)) - - ;; if there is space reserved for a message, and the message is provided, - ;; initialize a pad and set the background color. - (when (and message-text (> message-height 0)) - (setf message-pad (make-instance 'pad :height message-height :width (- width 4))) - (setf message-pad-coordinates - (list (+ 2 (car location)) ;screen-min-y - (+ 2 (cadr location)) ;screen-min-x - (+ (+ 2 (car location)) message-height) ;screen-max-y - (+ (+ 2 (cadr location) (- width 4))))) ;screen-max-x - (when color-pair - (setf (background message-pad) (make-instance 'complex-char :color-pair color-pair))) - (format message-pad message-text)) - - ;; TODO: do this once for all menus and dialogs, at the moment it is duplicated - (cond ((or fgcolor bgcolor) - (set-color-pair winptr (color-pair win)) - (setf (color-pair sub-window) (color-pair win) - (background win) (make-instance 'complex-char :color-pair (color-pair win)) - (background sub-window) (make-instance 'complex-char :color-pair (color-pair win)) )) - ;; when a color-pair is passed as a keyword - (color-pair - ;; set fg and bg, pass to ncurses - (setf (color-pair win) color-pair - (color-pair sub-window) color-pair - (background win) (make-instance 'complex-char :color-pair color-pair) - (background sub-window) (make-instance 'complex-char :color-pair color-pair)))) )))) - -(defclass element () - ((name - :initarg :name - :initform nil - :reader name - :type (or null symbol keyword string) - :documentation "Optional unique name by which the element can be identified and accessed.") - - (title - :initarg :title - :initform nil - :accessor title - :type (or null string) - :documentation "Title of the element to be displayed at an location depending on the element type.") - - (value - :initarg :value - :initform nil - :accessor value - :type (or symbol keyword string number) - :documentation "Value of the element, mostly the result of the form editing.") - - (location - :initarg :location - :initform nil - :type (or null cons) - :accessor location - :documentation "A two-element list (y=row x=column) containing the coordinate of the top left corner of the element.") - - (bindings - :initarg :bindings - :initform nil - :type (or null cons) - :accessor bindings - :documentation - "Alist of events (characters, keywords or integers) as keys and handler functions as values. - Used by the run-event-loop function.") - - (keymap - :initarg :keymap - :initform nil - :type (or null symbol keyword keymap) - :accessor keymap - :documentation "Keymap containing the key bindings to be used by run-event-loop instead of the object's own bindings.") - - ;; we need this to draw selected and other elements with different styles. - ;; this has to be toggled at the same time as current-element of a form - (selectedp - :initform nil - :type boolean - :accessor selectedp - :documentation "Flag denoting whether the element is currently selected in a form.") - - (activep - :initform t - :type boolean - :accessor activep - :documentation "If t (default), the element can be selected. Used to prevent labels from being selected.") - - (parent-form - :initform nil - :type (or null form) - :accessor parent-form - :documentation "Parent form of the element. Added to every element upon the initialization of the form.") - - ;; elements do not necessarily have to have an associated window, only when they are used stand-alone. - ;; when they are part of a form, we can reference the window associated with the parent form. - (window - :initarg :window - :initform nil - :type (or null window) - :documentation "If the element is not part of a form, a window can also be associated with the stand-alone element.")) - - (:documentation "An element of a form, like a field or button.")) - -;; (window (if (window field) (window field) (window (parent-form field)))) -(defmethod window ((element element)) - "Return the window associated with an element, which can optionally be part of a form. - -If there is no window asociated with the element, return the window associated with the parent form." - (with-slots (window parent-form) element - (if window - window - (if parent-form - (if (slot-value parent-form 'window) - (slot-value parent-form 'window) - (error "(window element) ERROR: No window is associated with the parent form.")) - (error "(window element) ERROR: Neither a window nor a parent form are associated with the element."))))) - -(defmethod (setf window) (window (element element)) - (setf (slot-value element 'window) window)) - -(defmethod style ((element element)) - "If the element's style slot is empty, check whether a default style has been defined in the parent form." - (with-slots (style parent-form) element - (if style - style - (if (slot-value parent-form 'style) - ;; get the default element style from the form style slot. - (getf (slot-value parent-form 'style) (type-of element)) - nil)))) - -(defmethod (setf style) (style (element element)) - (setf (slot-value element 'style) style)) - -(defclass label (element) - ((reference - :initarg :reference - :initform nil - :accessor reference - :type (or null symbol keyword string) - :documentation - "If the name of a reference element is specified, the element's title will be displayed instead of the label's. - If a title for the label is explicitely provided, it overrides the title of the reference element.") - - (width - :initarg :width - :initform nil - :type (or null integer) - :accessor width - :documentation "The width of the label.") - - (style - :initarg :style - :initform nil - :type (or null cons) - :documentation "") - - (activep - :initform nil - :documentation "Labels are by default not active and can not be selected when cycling through the elements.")) - - (:documentation "A string displayed at the specified location.")) - -(defclass button (element) - ((callback - :initarg :callback - :initform nil - :accessor callback - :type (or null symbol function) - :documentation "Callback function called when the button is activated.") - - (style - :initarg :style - :initform nil - :type (or null cons) - :documentation "A plist of two complex-chars (or nil): :foreground and :selected-foreground.") - - (bindings - :initarg :bindings - :initform nil - :type (or null cons) - :accessor bindings - :documentation - "Alist of events (characters, keywords or integers) as keys and handler functions as values. - Used by the run-event-loop function.") - - (keymap - :initarg :keymap - :initform 'button-map - :type (or null symbol keyword keymap) - :accessor keymap - :documentation "Keymap containing the key bindings to be used by run-event-loop instead of the object's own bindings.")) - - (:documentation "An element that can call a function by pressing enter (or in future, with a mouse click).")) - -(defclass checkbox (element) - ((style - :initarg :style - :initform nil - :type (or null cons) - :documentation "A plist containing :foreground and :selected-foreground.") - - (checkedp - :initarg :checked - :initform nil - :accessor checkedp - :type boolean - :documentation "t if the checkbox has been checked, nil if it hasn't.") - - (bindings - :initarg :bindings - :initform nil - :type (or null cons) - :accessor bindings - :documentation - "Alist of events (characters, keywords or integers) as keys and handler functions as values. - Used by the run-event-loop function.") - - (keymap - :initarg :keymap - :initform 'checkbox-map - :type (or null symbol keyword keymap) - :accessor keymap - :documentation "Keymap containing the key bindings to be used by run-event-loop instead of the object's own bindings.")) - - (:documentation "A boolean element that can be checked (t) or unchecked (nil)")) - -(defclass checklist (menu) - ((menu-type - :initarg :menu-type - :initform :checklist - :type keyword - :documentation "The type of the menu is set to :checklist")) - - (:documentation "A checklist is a multi-selection menu with checkable items.")) - -(defclass field (element) - ((width - :initarg :width - :initform nil - :type (or null integer) - :accessor width - :documentation "The width of the field. The default buffer length is equal the width.") - - (style - :initarg :style - :initform nil - :type (or null cons) - :documentation "A plist of four complex-chars (or nil): :foreground, :background, :selected-foreground, :selected-background.") - - (bindings - :initarg :bindings - :initform nil - :type (or null cons) - :accessor bindings - :documentation - "Alist of events (characters, keywords or integers) as keys and handler functions as values. - Used by the run-event-loop function.") - - (keymap - :initarg :keymap - :initform 'field-map - :type (or null symbol keyword keymap) - :accessor keymap - :documentation "Keymap containing the key bindings to be used by run-event-loop instead of the object's own bindings.") - - (buffer - :initform nil - :type (or null list) - :accessor buffer - :documentation "List containing the characters in the field.") - - (max-buffer-length - :initarg :max-buffer-length - :initform nil - :type (or null integer) - :accessor max-buffer-length - :documentation - "Max length of the field buffer. If nil, it will be initialized to field width. - Horizontal scrolling is then disabled.") - - (display-pointer - :initform 0 - :type (or null integer) - :accessor display-pointer - :documentation - "Position in the input buffer from which n=width characters are displayed. - When max-buffer-length is greater than width, display-pointer can be greater than zero. - Horizontal scrolling is then enabled.") - - (input-pointer - :initform 0 - :type integer - :accessor input-pointer - :documentation "The position in the input buffer to which the next character will be written.")) - - (:documentation "A field is an editable part of the screen for user input. Can be part of a form.")) - -(defmethod initialize-instance :after ((field field) &key) - (with-slots (max-buffer-length width bindings keymap) field - ;; If unspecified, the default max-buffer-length should be equal to the visible field width. - (unless max-buffer-length - (setf max-buffer-length width)))) - -(defmethod value ((field field)) - "If the field buffer is empty, return nil, otherwise return the buffer as a string." - (when (slot-value field 'buffer) - (coerce (reverse (slot-value field 'buffer)) 'string))) - -(defmethod (setf value) (new-value (field field)) - (setf (slot-value field 'buffer) (reverse (coerce new-value 'list)))) - -(defclass form () - ((name - :initarg :name - :initform nil - :reader name - :type (or null symbol keyword string) - :documentation "Name of the form.") - - (elements - :initarg :elements - ;; Make sure we already have fields when we initialize a form. - :initform nil - :type (or null cons) - :accessor elements - :documentation "List of elements. The first element will be initialized as the current element.") - - ;; if init is 0, what if we have no fields yet? - (current-element-number - :initform 0 - :type integer - :accessor current-element-number - :documentation "Number of the currently selected element.") - - ;; has to be updated every time the current element number is updated. - (current-element - :initform nil - :type (or null field button label checkbox menu checklist) - :accessor current-element - :documentation "Currently selected element object.") - - (style - :initarg :style - :initform nil - :type (or null cons) - :accessor style - :documentation "A plist of default styles for each form element type.") - - (bindings - :initarg :bindings - :initform nil - :type (or null cons) - :accessor bindings - :documentation - "Alist of events (characters, keywords or integers) as keys and handler functions as values. - Used by the run-event-loop function.") - - (keymap - :initarg :keymap - :initform 'form-map - :type (or null symbol keyword keymap) - :accessor keymap - :documentation "Keymap containing the key bindings to be used by run-event-loop instead of the object's own bindings.") - - (window - :initarg :window - :initform nil - :type (or null window) - :accessor window - :documentation "Window created separately and then associated with the form.")) - - (:documentation "A form is a list of fields.")) - -(defmethod initialize-instance :after ((form form) &key) - (with-slots (elements current-element bindings keymap) form - (if elements - (progn - ;; Initialize the current element as the first element from the passed elements list. - ;; we have to set the current element before we can change it with select-previous-element and select-next-element - (setf current-element (car elements)) - ;; set the selected option of the initial current element. - (setf (slot-value current-element 'selectedp) t) - ;; set the parent form slot of every element. - (loop for element in elements - do (setf (slot-value element 'parent-form) form))) - - ;; if a list of elements was not passed, signal an error. - (error "A list of elements is required to initialize a form.")))) - -(defclass form-window (form decorated-window) - () - (:documentation "")) - -(defmethod initialize-instance :after ((win form-window) &key) - (with-slots (winptr height width location sub-window draw-border-p window) win - ;; only for form windows - (when (eq (type-of win) 'form-window) - (setf winptr (%newwin height width (car location) (cadr location))) - (setf sub-window (make-instance 'sub-window :parent win :height (- height 2) :width (- width 2) - :location (list 1 1) :relative t :enable-function-keys t)) - ;; set the sub of the decorated window to be the associated window of the form - ;; the form will be drawn to the associated window, i.e. to the sub - (setf window sub-window) ))) - -;; if a window-location is given during make-instance, it can be simply ignored. -;; or we can check for location and signal an error. -(defclass pad (window) - () - (:documentation "A pad is a window without a specified location on screen, which is specified dynamically during refresh.")) - -(defmethod initialize-instance :after ((win pad) &key) - (with-slots (winptr height width) win - ;; just for a pad window - (when (eq (type-of win) 'pad) - (setf winptr (%newpad height width))))) - -(defclass sub-pad (pad) - ((parent - :initarg :parent - :initform nil - :type (or null pad) - :documentation "The parent pad which will contain the sub-pad.")) - (:documentation "A sub-pad shares the memory and the display with a parent pad and has to be contained within it.")) - -;; sub-pads always use locations relative to parent pads -(defmethod initialize-instance :after ((win sub-pad) &key) - (with-slots (winptr parent height width location) win - ;; just for a sub-pad window - (when (eq (type-of win) 'sub-pad) - (setf winptr (%subpad (slot-value parent 'winptr) height width (car location) (cadr location)))))) - -#| -;; this will be called for both window and screen. -;; create a curses window when an instance is created. -(defmethod initialize-instance :after ((win window) &key) - (with-slots (winptr cursor-visible-p colors-enabled-p input-echoing-p input-reading - input-blocking function-keys-enabled-p scrolling-enabled-p height width location) win - - ;; different initialisations depending on the window type. - ;; %initscr initializes a screen, %newwin initializes a window. - ;; TODO: subwin, derwin, pad... - ;; CAUTION: these initializations have to be done _before_ any other commands. - ;; because of that we cant use call-next-method. - (case (type-of win) - ;; a screen is initialized when we start ncurses. - (screen (progn - (setf winptr (%initscr)) - (when colors-enabled-p (%start-color)) - (if input-echoing-p (%echo) (%noecho)) - (set-input-reading winptr input-reading) - (set-cursor-visibility cursor-visible-p))) ;kernel.lisp - ;; a window is initialized when we create a new window. - (window (setf winptr (%newwin height width (car location) (cadr location))))) - - ;; the following settings have to be executed for all window types. - (set-input-blocking winptr input-blocking) - (%scrollok winptr scrolling-enabled-p) - (%keypad winptr function-keys-enabled-p))) -|# - -;; We cant do this because _all_ auxiliary methods are always used and combined. - -(defmethod initialize-instance :after ((win window) &key color-pair) - (with-slots (winptr height width location fgcolor bgcolor background) win - ;; just for WINDOW types - (when (eq (type-of win) 'window) - (unless width (setf width 0)) - (unless height (setf height 0)) - (setf winptr (%newwin height width (car location) (cadr location))) - - ;; fg/bg should not be passed together with the color-pair keyword. - (cond ((or fgcolor bgcolor) - (set-color-pair winptr (color-pair win))) - (color-pair - ;; set fg and bg, pass to ncurses - (setf (color-pair win) color-pair))) - - (when background (setf (background win) background)) ))) - -(defmethod initialize-instance :after ((scr screen) &key color-pair) - (with-slots (winptr colors-enabled-p use-terminal-colors-p cursor-visible-p input-echoing-p input-blocking - function-keys-enabled-p newline-translation-enabled-p fgcolor bgcolor - scrolling-enabled-p background input-buffering-p process-control-chars-p) scr - ;; just for screen window types. - (when (eq (type-of scr) 'screen) - (setf winptr (%initscr)) - (when colors-enabled-p - (if (%has-colors) - (progn - (%start-color) - (set-default-color-pair use-terminal-colors-p)) - (error "initialize-instance screen: This terminal does not support colors."))) - - (cond ((or fgcolor bgcolor) - (set-color-pair winptr (color-pair scr))) - (color-pair - ;; set fg and bg, pass to ncurses - (setf (color-pair scr) color-pair))) - - (when background (setf (background scr) background)) - (if newline-translation-enabled-p (%nl) (%nonl)) - (if input-echoing-p (%echo) (%noecho)) - (set-input-mode input-buffering-p process-control-chars-p) - (set-cursor-visibility cursor-visible-p)))) - -;; sub-window has to be contained within a parent window -;; touch parent before refreshing a subwindow -;; move also needs a method for subwindows. -;; Subwindows must be deleted before the main window can be deleted. -(defmethod initialize-instance :after ((win sub-window) &key) - (with-slots (winptr parent height width location relativep) win - ;; leaving out the size of a window maxes it out to the right and to the bottom - (unless width (setf width 0)) - (unless height (setf height 0)) - ;; just for SUB-WINDOW types - (when (eq (type-of win) 'sub-window) - (if relativep - ;;(setf winptr (%derwin (slot-value parent 'winptr) height width (car location) (cadr location))) - (setf winptr (let ((val (%derwin (slot-value parent 'winptr) height width (car location) (cadr location)))) - (if (null-pointer-p val) - ;; may also be null if the parent window passed is null - (error "Subwindow could not be created. Probably too big and not contained in the parent window.") - val))) - (setf winptr (%subwin (slot-value parent 'winptr) height width (car location) (cadr location))))))) - -(defmethod initialize-instance :after ((win decorated-window) &key) - (with-slots (winptr width height location sub-window) win - ;; only for decorated window types - (when (eq (type-of win) 'decorated-window) - (setf winptr (%newwin height width (car location) (cadr location))) - (setf sub-window - (make-instance 'sub-window :parent win :height (- height 2) :width (- width 2) :location (list 1 1) :relative t))))) - -;; called after _all_ :after aux methods. -;; for all window types in the hierarchy. -(defmethod initialize-instance :around ((win window) &key) - ;; before :before, :after and primary. - (let ((result (call-next-method))) - ;; after :before, :after and primary. - (with-slots (winptr input-blocking function-keys-enabled-p scrolling-enabled-p draw-border-p stackedp) win - (set-input-blocking winptr input-blocking) - (%scrollok winptr scrolling-enabled-p) - (when draw-border-p (%box winptr 0 0)) - (%keypad winptr function-keys-enabled-p) - (when stackedp (push win *window-stack*))) - - ;; why do we have to return the result in :around aux methods? - result)) - -;; Accessors - -(defgeneric location (window)) -(defmethod location ((window window)) - (list (%getbegy (slot-value window 'winptr)) (%getbegx (slot-value window 'winptr)))) -(defmethod location ((win sub-window)) - (with-slots (winptr relativep) win - (if relativep - (list (%getpary winptr) (%getparx winptr)) - (list (%getbegy winptr) (%getbegx winptr))))) -(defgeneric (setf location) (coordinates window)) -(defmethod (setf location) (coordinates (w window)) - (setf (slot-value w 'location) coordinates) - (%mvwin (slot-value w 'winptr) (car coordinates) (cadr coordinates))) - -;; The slots location-y and location-x dont exist, these accessors exist for convenience. - -(defgeneric location-y (window)) -(defmethod location-y ((win window)) - (%getbegy (slot-value win 'winptr))) -(defmethod location-y ((win sub-window)) - (with-slots (winptr relativep) win - (if relativep - (%getpary winptr) - (%getbegy winptr)))) - -(defgeneric location-x (window)) -(defmethod location-x ((win window)) - (%getbegx (slot-value win 'winptr))) -(defmethod location-x ((win sub-window)) - (with-slots (winptr relativep) win - (if relativep - (%getparx winptr) - (%getbegx winptr)))) - -(defgeneric (setf location-y) (y window)) -(defmethod (setf location-y) (y (win window)) - (let ((x (cadr (slot-value win 'location)))) - (setf (slot-value win 'location) (list y x)) - (%mvwin (slot-value win 'winptr) y x))) - -(defgeneric (setf location-x) (x window)) -(defmethod (setf location-x) (x (win window)) - (let ((y (car (slot-value win 'location)))) - (setf (slot-value win 'location) (list y x)) - (%mvwin (slot-value win 'winptr) y x))) - -;; "The screen-relative parameters of the window are not changed. -;; This routine is used to display different parts of the parent -;; window at the same physical location on the screen." -;; -;; "The mvderwin() function specifies a mapping of characters. -;; The function identifies a mapped area of the parent of the specified window" - -;; TODO: rename to source-location -(defgeneric (setf source-location) (coordinates sub-window)) -(defmethod (setf source-location) (coordinates (w sub-window)) - (setf (slot-value w 'source-location) coordinates) - (%mvderwin (slot-value w 'winptr) (car coordinates) (cadr coordinates))) - -(defgeneric width (window)) -(defmethod width ((window window)) - (%getmaxx (slot-value window 'winptr))) - -(defgeneric height (window)) -(defmethod height ((window window)) - (%getmaxy (slot-value window 'winptr))) - -(defgeneric cursor-position (window)) -(defmethod cursor-position ((window window)) - (list (%getcury (slot-value window 'winptr)) (%getcurx (slot-value window 'winptr)))) - -;; we can move the cursor by doing this, or by calling "move". -;; both will use %wmove in the background. -;; note that incd and decf dont work. -(defgeneric (setf cursor-position) (coordinates window)) -(defmethod (setf cursor-position) (coordinates (w window)) - (setf (slot-value w 'cursor-position) coordinates) - (%wmove (slot-value w 'winptr) (car coordinates) (cadr coordinates))) - -;; The slots location-y and location-x dont exist, but the pseudo accessors -;; exist for convenience. - -(defgeneric cursor-position-y (window)) -(defmethod cursor-position-y ((win window)) - (%getcury (slot-value win 'winptr))) - -(defgeneric cursor-position-x (window)) -(defmethod cursor-position-x ((win window)) - (%getcurx (slot-value win 'winptr))) - -(defgeneric (setf cursor-position-y) (y window)) -(defmethod (setf cursor-position-y) (y (win window)) - (let ((x (cadr (slot-value win 'cursor-position)))) - (setf (slot-value win 'cursor-position) (list y x)) - (%wmove (slot-value win 'winptr) y x))) - -(defgeneric (setf cursor-position-x) (x window)) -(defmethod (setf cursor-position-x) (x (win window)) - (let ((y (car (slot-value win 'cursor-position)))) - (setf (slot-value win 'cursor-position) (list y x)) - (%wmove (slot-value win 'winptr) y x))) - -(defgeneric cursor-visible-p (window)) -(defmethod cursor-visible-p ((screen screen)) - (slot-value screen 'cursor-visible-p)) -(defgeneric (setf cursor-visible-p) (status screen)) -(defmethod (setf cursor-visible-p) (status (screen screen)) - (setf (slot-value screen 'cursor-visible-p) status) - (set-cursor-visibility status)) - -(defgeneric input-blocking (window)) -(defmethod input-blocking ((window window)) - (slot-value window 'input-blocking)) -(defgeneric (setf input-blocking) (status window)) -(defmethod (setf input-blocking) (status (window window)) - (setf (slot-value window 'input-blocking) status) - (set-input-blocking (slot-value window 'winptr) status)) - -(defgeneric function-keys-enabled-p (window)) -(defmethod function-keys-enabled-p ((window window)) - (slot-value window 'function-keys-enabled-p)) -(defgeneric (setf function-keys-enabled-p) (status window)) -(defmethod (setf function-keys-enabled-p) (status (window window)) - (setf (slot-value window 'function-keys-enabled-p) status) - (%keypad (slot-value window 'winptr) status)) - -(defgeneric scrolling-enabled-p (window)) -(defmethod scrolling-enabled-p ((window window)) - (slot-value window 'scrolling-enabled-p)) -(defgeneric (setf scrolling-enabled-p) (status window)) -(defmethod (setf scrolling-enabled-p) (status (window window)) - (setf (slot-value window 'scrolling-enabled-p) status) - (%scrollok (slot-value window 'winptr) status)) - -(defgeneric scrolling-region (window)) -(defmethod scrolling-region ((window window)) - (slot-value window 'scrolling-region)) -(defgeneric (setf scrolling-region) (list window)) -(defmethod (setf scrolling-region) (list (window window)) - (setf (slot-value window 'scrolling-region) list) - (%wsetscrreg (slot-value window 'winptr) - (first (slot-value window 'scrolling-region)) - (second (slot-value window 'scrolling-region)))) -;; TODO: setf only when scrolling is enabled. - -(defgeneric input-echoing-p (screen)) -(defmethod input-echoing-p ((screen screen)) - (slot-value screen 'input-echoing-p)) -(defgeneric (setf input-echoing-p) (status screen)) -(defmethod (setf input-echoing-p) (status (screen screen)) - (setf (slot-value screen 'input-echoing-p) status) - ;;(set-input-echoing status)) - (if status (%echo) (%noecho))) - -(defgeneric input-buffering-p (screen)) -(defmethod input-buffering-p ((screen screen)) - (slot-value screen 'input-buffering-p)) -(defgeneric (setf input-buffering-p) (status screen)) -(defmethod (setf input-buffering-p) (status (screen screen)) - (setf (slot-value screen 'input-buffering-p) status) - (set-input-mode (slot-value screen 'input-buffering-p) - (slot-value screen 'process-control-chars-p))) - -(defgeneric process-control-chars-p (screen)) -(defmethod process-control-chars-p ((screen screen)) - (slot-value screen 'process-control-chars-p)) -(defgeneric (setf process-control-chars-p) (status screen)) -(defmethod (setf process-control-chars-p) (status (screen screen)) - (with-slots (input-buffering-p process-control-chars-p) screen - ;; only make a change when the status changed. - (when (not (eq process-control-chars-p status)) - ;; only call ncurses when buffering is nil. - (unless input-buffering-p - ;; before we switch the unbuffered mode, we switch to the default cooked mode. - (if process-control-chars-p (%nocbreak) (%noraw)) - ;; then make a "clean" switch back to the new unbuffered mode. - (set-input-mode input-buffering-p status)) - ;; then save the new status. - (setf process-control-chars-p status) ))) - -(defgeneric newline-translation-enabled-p (screen)) -(defmethod newline-translation-enabled-p ((screen screen)) - (slot-value screen 'newline-translation-enabled-p)) -(defgeneric (setf newline-translation-enabled-p) (status screen)) -(defmethod (setf newline-translation-enabled-p) (status (screen screen)) - (setf (slot-value screen 'newline-translation-enabled-p) status) - (if status (%nl) (%nonl))) - -(defgeneric background (window)) -(defmethod background ((win window)) - (slot-value win 'background)) - -(defgeneric (setf background) (char window &optional apply)) -(defmethod (setf background) (char (window window) &optional (apply t)) - (setf (slot-value window 'background) char) - ;; ncurses - ;;(set-background-char (slot-value window 'winptr) char apply)) - ;; ncursesw - (set-background-cchar_t window char apply)) - -;(defgeneric attributes (window)) -(defmethod attributes ((window window)) - (slot-value window 'attributes)) - -;;(defgeneric (setf attributes) (attributes window)) -#| -(defmethod (setf attributes) (attributes (window window)) - (let ((added (set-difference attributes (slot-value window 'attributes))) - (removed (set-difference (slot-value window 'attributes) attributes))) - (setf (slot-value window 'attributes) attributes) - (add-attributes window added) - (remove-attributes window removed))) -|# -;; TODO use %wattron and %wattroff here. - -(defmethod (setf attributes) (attributes (win window)) - (with-slots ((win-attributes attributes)) win - (let ((added (set-difference attributes win-attributes)) - (removed (set-difference win-attributes attributes))) - ;; set the list of attributes to the window slot - (setf win-attributes attributes) - ;; pass the attrbutes to add and remove to ncurses - (add-attributes win added) - (remove-attributes win removed)))) - -;; we dont want to use set-attributes because it also overwrites the color attribute. -;; we want the attributes function to just handle attributes and leave the color alone. -;; to do that, we have to treat the attributes as a set and ignore set-attributes. - -;; (defmethod (setf attributes) (attributes (window window)) -;; (setf (slot-value window 'attributes) attributes) -;; (set-attributes window attributes)) - -(defmethod color-pair ((win window)) - (with-slots (fgcolor bgcolor) win - (if (or fgcolor bgcolor) - (list fgcolor bgcolor) - ;; when both colors are nil, do not return (nil nil) but nil - nil))) - -(defmethod (setf color-pair) (color-pair (win window)) - (with-slots (fgcolor bgcolor) win - (if color-pair - (setf fgcolor (car color-pair) - bgcolor (cadr color-pair)) - ;; when color-pair is nil, both fg and bg are set to nil - (setf fgcolor nil - bgcolor nil))) - ;; after the slots are set, pass the new pair to ncurses - (set-color-pair (slot-value win 'winptr) (color-pair win))) - -(defmethod color-pair ((xch complex-char)) - (with-slots (fgcolor bgcolor) xch - (if (or fgcolor bgcolor) - (list fgcolor bgcolor) - ;; when both colors are nil, do not return (nil nil) but nil - nil))) - -(defmethod (setf color-pair) (color-pair (xch complex-char)) - (with-slots (fgcolor bgcolor) xch - (if color-pair - (setf fgcolor (car color-pair) - bgcolor (cadr color-pair)) - ;; when color-pair is nil, both fg and bg are set to nil - (setf fgcolor nil - bgcolor nil)))) - -(defmethod fgcolor ((win window)) - (slot-value win 'fgcolor)) - -(defmethod bgcolor ((win window)) - (slot-value win 'bgcolor)) - -(defmethod (setf fgcolor) (fgcolor (win window)) - (setf (slot-value win 'fgcolor) fgcolor) - ;; set the color pair in the underlying ncurses lib. - (set-color-pair (slot-value win 'winptr) (color-pair win))) - -(defmethod (setf bgcolor) (bgcolor (win window)) - (setf (slot-value win 'bgcolor) bgcolor) - ;; set the color pair in the underlying ncurses lib. - (set-color-pair (slot-value win 'winptr) (color-pair win))) - - -;;; print, prin1, princ, format ~A, ~S - -;; print a wide but simple lisp character to a window -;; TODO: add check for insert-mode -(defmethod print-object ((ch character) (stream window)) - (add-wide-char stream ch)) - -;; TODO: add check for insert-mode -(defmethod print-object ((ch complex-char) (stream window)) - (add-wide-char stream ch)) - -;; print only simple chars to the lisp repl. -(defmethod print-object ((ch complex-char) stream) - (princ (simple-char ch) stream)) - -;; print simple strings to a ncurses widow. -(defmethod print-object ((str string) (stream window)) - (%waddstr (winptr stream) str)) - -;; print complex strings to a ncurses window. -(defmethod print-object ((cstr complex-string) (stream window)) - (loop for ch across (complex-char-array cstr) - do (add-wide-char stream ch))) - -;; print only simple chars to the lisp repl. -(defmethod print-object ((cstr complex-string) stream) - (loop for ch across (complex-char-array cstr) - do (princ (simple-char ch) stream))) - -;; methods to close streams, and thus screen _and_ windows, since they are now gray streams. -;; end-screen = %endwin -;; delete-window = %delwin -;; see t07a -;; remember we cant use open to open a window. it works only for file streams. -;; we have to make-instance of a window or a screen. - -(defmethod close ((stream window) &key abort) - (declare (ignore abort)) - ;; if by time of closing, the window is still on the stack, remove it first. - (if (member stream *window-stack* :test #'eq) - (setf *window-stack* (remove stream *window-stack* :test #'eq))) - (%delwin (winptr stream)) - ;; The default method provided by class FUNDAMENTAL-STREAM sets a flag for OPEN-STREAM-P. - (call-next-method)) - -(defmethod close ((stream sub-window) &key abort) - (declare (ignore abort)) - (%delwin (winptr stream))) - -(defmethod close ((stream screen) &key abort) - (declare (ignore abort)) - (%endwin)) - -(defmethod close ((stream decorated-window) &key abort) - (declare (ignore abort)) - (%delwin (winptr (sub-window stream))) - (%delwin (winptr stream))) - -;; although it is not a stream, we will abuse close to close a menu's window and subwindow, which _are_ streams. -(defmethod close ((stream menu-window) &key abort) - (declare (ignore abort)) - (%delwin (winptr (sub-window stream))) - (%delwin (winptr stream))) - -(defmethod close ((stream dialog-window) &key abort) - (declare (ignore abort)) - (%delwin (winptr (message-pad stream))) - (%delwin (winptr (sub-window stream))) - (%delwin (winptr stream))) - -(defmethod close ((stream form-window) &key abort) - (declare (ignore abort)) - (%delwin (winptr (sub-window stream))) - (%delwin (winptr stream))) - -;; SBCL bug when specializing close on gray streams: -;; STYLE-WARNING: -;; Generic function CLOSE clobbers an earlier FTYPE proclamation -;; (FUNCTION (STREAM &KEY (:ABORT T)) (VALUES (MEMBER T) &OPTIONAL)) for the -;; same name with (FUNCTION (T &KEY (:ABORT T)) *). diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/clear.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/clear.lisp deleted file mode 100644 index 5f72584..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/clear.lisp +++ /dev/null @@ -1,27 +0,0 @@ -(in-package :de.anvi.croatoan) - -;; (clear scr :redraw t) -;; (clear scr :target :whole-screen :redraw t) - -;; (clear scr :target :end-of-line) -;; (clear scr :target :bottom) - -(defgeneric clear (object &key)) - -(defmethod clear ((window window) &key redraw (target :whole-window)) - "Clear the window by overwriting it with blanks. - -If the keyword redraw is t, first copy blanks to every position in the -window, then set the clear-redraw-flag to have the window redrawn from -scratch on the next refresh. - -If target is :end-of-line, clear the window from the cursor to the end -of the current line. - -If target is :bottom, clear the window from the cursor to the end of -the current line and all lines below." - (let ((winptr (winptr window))) - (case target - (:whole-window (if redraw (%wclear winptr) (%werase winptr))) - (:end-of-line (%wclrtoeol winptr)) - (:bottom (%wclrtobot winptr))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/color.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/color.lisp deleted file mode 100644 index b5fd161..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/color.lisp +++ /dev/null @@ -1,160 +0,0 @@ -(in-package :de.anvi.croatoan) - -;; 1000 -> 255 (ff) -(defun color-1k-to-8bit (integer) - "Convert the ncurses color intensity 0-1000 to the 8bit range 0-255." - (values (round (* integer 0.255)))) - -;; 255 (ff) -> 1000 -(defun color-8bit-to-1k (integer) - "Convert the 8bit range 0-255 to the ncurses color intensity 0-1000." - (values (round (* integer (/ 1 0.255))))) - -;; https://www.w3schools.com/colors/colors_rgb.asp -;; 255 255 255 -> ffffff -;; the hex triplet is a 6 digit, 3 byte (24 bit) hexadecimal number -;; 255 192 203 :pink -(defun rgb-to-hex (rgb-list) - "Take a list of three 8bit (0-255) RGB values, return a 24bit integer (RGB hex triplet)." - (let ((r (nth 0 rgb-list)) - (g (nth 1 rgb-list)) - (b (nth 2 rgb-list))) - (logior (ash r 16) - (ash g 8) - (ash b 0)))) -;; test: (format t "~x" (rgb-to-hex (list 255 255 0))) - -;; (hex-to-rgb #xffffff) => (255 255 255) -(defun hex-to-rgb (hex) - "Take a 24bit integer (RGB hex triplet), return a list of three 8bit (0-255) RGB values." - (let ((r (ldb (byte 8 16) hex)) - (g (ldb (byte 8 8) hex)) - (b (ldb (byte 8 0) hex))) - (list r g b))) - -;;(defun hex-to-string (hex) -;; (format nil "~6,'0x" hex)) - -;; SGR = select graphc rendition, vt100 attribute sequences - -;; xterm sources: -;; https://github.com/joejulian/xterm/blob/master/256colres.pl -;; https://github.com/joejulian/xterm/blob/master/256colres.h -;; https://gist.github.com/clairvy/566623#file-256colors2-pl - -;; scale rgb values from 0-255 down to 0-5, corresponding to colors in the xterm 6x6x6 RGB cube. -(defun rgb-to-rgb6 (rgb-list) - "Take a list of three RGB integers 0-255, return a list of three RGB integers 0-5." - (mapcar (lambda (x) - (if (< x 55) - 0 - (floor (/ (- x 55) 40)))) - rgb-list)) - -;; scale rgb values from 0-5 to 0-255, from the xterm 6x6x6 RGB color cube to 3x8bit=24bit. -(defun rgb6-to-rgb (rgb6-list) - "Take a list of three RGB integers 0-5, return a list of three RGB integers 0-255 of the xterm color palette." - (mapcar (lambda (x) (if (> x 0) - (+ 55 (* 40 x)) - 0)) - rgb6-list)) - -(defun rgb6-to-sgr (rgb6-list) - "Take a list of three RGB integers 0-5, return an 8bit SGR color code 16-231." - (let ((r (nth 0 rgb6-list)) - (g (nth 1 rgb6-list)) - (b (nth 2 rgb6-list))) - (+ (* r 36) - (* g 6) - (* b 1) - 16))) - -;; only returns values from the color cube, not from the grayscale ramp 232-255. -(defun sgr-to-rgb6 (sgr) - "Take a 8bit SGR color code 16-231, return a list of three RGB integers 0-5." - (let* ((rgb (- sgr 16)) - (r (floor rgb 36)) - (r-rem (- rgb (* 36 r))) - (g (floor r-rem 6)) - (b (- r-rem (* 6 g)))) - (list r g b))) - -;; the rgb values of the first 8 ansi colors arent defined, they only have names. -;; the first 16 colors of the 256-color palette have names ("web colors") and rgb values. -;; https://en.wikipedia.org/wiki/Web_colors - -;; TODO: this list is also defined in attr.lisp, but it should only be here -;;(defparameter *xterm-color-name-list* -;; '(:black :maroon :green :olive :navy :purple :teal :silver -;; :gray :red :lime :yellow :blue :magenta :cyan :white)) - -(defparameter *xterm-color-hex-list* - '(#x000000 ;black - #x800000 ;web maroon - #x008000 ;web green - #x808000 ;olive - #x000080 ;navy blue - #x800080 ;web purple - #x008080 ;teal - #xc0c0c0 ;silver - - #x808080 ;web gray - #xff0000 ;red - #x00ff00 ;lime, x11: green - #xffff00 ;yellow - #x0000ff ;blue - #xff00ff ;magenta, x11: fuchsia - #x00ffff ;cyan, x11: aqua - #xffffff)) ;white - -(defun gray-to-rgb (sgr) - "Take a sgr gray color number 232-255, return a list of three RGB integers 0-255." - (let ((val (+ 8 (* 10 (- sgr 232))))) - (list val val val))) - -(defun closest-gray (rgb) - "Take an integer 0-255 denoting a gray color intensity, return the closest gray from the xterm palette." - (let* ((allowed-gray-values (loop for i from 0 to 23 collect (+ 8 (* 10 i)))) - (delta-list (mapcar (lambda (x) (abs (- rgb x))) allowed-gray-values)) - (delta-min (apply #'min delta-list)) - (pos (position delta-min delta-list))) - (+ 232 pos))) - ;;(nth pos allowed-gray-values))) - -;; otherwise return the closest short-rgb color. -;; TODO: we do not want the approximated and the exact color returned by the same function. -;; we need to check whether the hex is in the palette and return that -;; and if it is NOT in the palette, then either init a new color or return the closest color -;; from the palette. -(defun hex-to-sgr (hex) - "Takes a RGB hex triplet, returns the exact or most appropriate SGR color code 0-255." - (let ((rgb-list (hex-to-rgb hex))) - ;; TODO: check whether we use 8 or 256 colors, limit the hex codes to the first 8 if necessary. - (cond - ;; is the hex value one of the 16 basic ansi colors? - ((member hex *xterm-color-hex-list*) - (position hex *xterm-color-hex-list*)) - ;; if all three rgb values are equal, return the closest shade of gray. - ;; TODO: what if they are almost equal, for example (243 242 244)? - ((apply #'= rgb-list) - (closest-gray (car rgb-list))) - ;; if they arent equal, return the closest value from the 6x6x6 rgb cube. - (t (rgb6-to-sgr (rgb-to-rgb6 rgb-list)))))) - -;; handles all three xterm-256color color spaces -;; we need this to list the rgb values of all 256 xterm colors to compare them to the x11 color list. -;; TODO: use this to make a list containing all 256 SGR hex codes. -(defun sgr-to-hex (sgr) - "Take a SGR color code 0-255, return a 24bit hex triplet." - (cond - ;; 8 ansi colors (8 normal and 8 bright or bold) 0-15 - ;; just return the hex integer from the list - ((< sgr 16) - ;;(cdr (assoc sgr *ansi-color-sgr-hex-alist*))) - (nth sgr *xterm-color-hex-list*)) - ;; 216 colors from a 6x6x6 RGB color cube, 16-231 - ((< sgr 232) - (rgb-to-hex (rgb6-to-rgb (sgr-to-rgb6 sgr)))) - ;; 24 gray colors without black and white, which are contained in both 1. and 2. - ((< sgr 256) - (rgb-to-hex (gray-to-rgb sgr))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/croatoan.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/croatoan.lisp deleted file mode 100644 index 0aa39a3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/croatoan.lisp +++ /dev/null @@ -1,297 +0,0 @@ -(in-package :de.anvi.croatoan) - -;;; Define all macros here centrally. - -(defmacro with-screen ((screen &key - (bind-debugger-hook t) - (input-buffering nil) - (process-control-chars t) - (enable-newline-translation t) - (input-blocking t) - (input-echoing t) - (enable-function-keys t) - (enable-scrolling nil) - (insert-mode nil) - (enable-colors t) - (use-terminal-colors nil) - (cursor-visible t) - (stacked nil) - (fgcolor nil) - (bgcolor nil) - (color-pair nil) - (background nil)) - &body body) - "Create a screen, evaluate the forms in the body, then cleanly close the screen. - -Pass any arguments besides BIND-DEBUGGER-HOOK to the initialisation of the -screen object. The screen is cleared immediately after initialisation. - -This macro will bind *DEBUGGER-HOOK* so that END-SCREEN gets called before the -condition is printed. This will interfere with SWANK as it also binds *DEBUGGER-HOOK*. -To prevent WITH-SCREEN from binding *DEBUGGER-HOOK*, set BIND-DEBUGGER-HOOK to NIL. - -This macro is the main entry point for writing ncurses programs with the croatoan -library. Do not run more than one screen at the same time." - `(unwind-protect - (let ((,screen (make-instance 'screen - :input-buffering ,input-buffering - :process-control-chars ,process-control-chars - :enable-newline-translation ,enable-newline-translation - :input-blocking ,input-blocking - :input-echoing ,input-echoing - :enable-function-keys ,enable-function-keys - :enable-scrolling ,enable-scrolling - :insert-mode ,insert-mode - :enable-colors ,enable-colors - :use-terminal-colors ,use-terminal-colors - :cursor-visible ,cursor-visible - :stacked ,stacked - :fgcolor ,fgcolor - :bgcolor ,bgcolor - :color-pair ,color-pair - :background ,background)) - - ;; when an error is signaled and not handled, cleanly end ncurses, print the condition text - ;; into the repl and get out of the debugger into the repl. - ;; the debugger is annoying with ncurses apps. - ;; add (abort) to automatically get out of the debugger. - ;; this binding is added by default. call with-screen with :bind-debugger-hook nil to remove. - ,@(if bind-debugger-hook - '((*debugger-hook* #'(lambda (c h) - (declare (ignore h)) - (end-screen) - (print c)))) - nil)) - - ;; clear the display when starting up. - (clear ,screen) - - ,@body) - - ;; cleanly exit ncurses whatever happens. - (end-screen))) - -(defmacro with-window ((win &rest options) &body body) - "Create a window, evaluate the forms in the body, then cleanly close the window. - -Pass any arguments to the initialisation of the window object. - -Example: - -(with-window (win :input-echoing t - body)" - `(let ((,win (make-instance 'window ,@options))) - (unwind-protect - (progn - ,@body) - (close ,win)))) - -;; see similar macro cffi:with-foreign-objects. -(defmacro with-windows (bindings &body body) - "Create one or more windows, evaluate the forms in the body, then cleanly close the windows. - -Pass any arguments to the initialisation of the window objects. - -Example: - -(with-windows ((win1 :input-echoing t) - (win2 :input-echoing t)) - body)" - (if bindings - ;; execute the bindings recursively - `(with-window ,(car bindings) - ;; the cdr is the body - (with-windows ,(cdr bindings) - ,@body)) - ;; finally, execute the body. - `(progn - ,@body))) - -(defmacro event-case ((window event &optional mouse-y mouse-x) &body body) - "Window event loop, events are handled by an implicit case form. - -For now, it is limited to events generated in a single window. So events -from multiple windows have to be handled separately. - -In order for event handling to work, input-buffering has to be nil. -Several control character events can only be handled when -process-control-chars is also nil. - -If input-blocking is nil, we can handle the (nil) event, i.e. what -happens between key presses. - -If input-blocking is t, the (nil) event is never returned. - -The main window event loop name is hard coded to event-case to be -used with return-from. - -Instead of ((nil) nil), which eats 100% CPU, use input-blocking t." - (if (and mouse-y mouse-x) - `(loop :named event-case do - (multiple-value-bind (,event ,mouse-y ,mouse-x) - ;; depending on which version of ncurses is loaded, decide which event reader to use. - #+(or sb-unicode unicode openmcl-unicode-strings) (get-wide-event ,window) - #-(or sb-unicode unicode openmcl-unicode-strings) (get-event ,window) - ;;(print (list ,event mouse-y mouse-x) ,window) - (when (null ,event) - ;; process the contents of the job queue (ncurses access from other threads) - (process)) - (case ,event - ,@body))) - `(loop :named event-case do - ;; depending on which version of ncurses is loaded, decide which event reader to use. - (let ((,event #+(or sb-unicode unicode openmcl-unicode-strings) (get-wide-event ,window) - #-(or sb-unicode unicode openmcl-unicode-strings) (get-event ,window))) - (when (null ,event) - ;; process the contents of the job queue (ncurses access from other threads) - (process)) - (case ,event - ,@body))))) - -(defun bind (object event handler) - "Bind the handler function to the event in the bindings alist of the object. - -The handlers will be called by the run-event-loop when keyboard or mouse events occur. - -The handler functions have two mandatory arguments, window and event. - -For every event-loop, at least an event to exit the event loop should be assigned, -by associating it with the predefined function exit-event-loop. - -If a handler for the default event t is defined, it will handle all events for which -no specific event handler has been defined. - -If input-blocking of the window is set to nil, a handler for the nil event -can be defined, which will be called at a specified frame-rate between keypresses. -Here the main application state can be updated. - -Alternatively, to achieve the same effect, input-blocking can be set to a specific -delay in miliseconds. - -Example use: (bind scr #\q (lambda (win event) (throw 'event-loop :quit)))" - (setf (bindings object) - (acons event handler (bindings object)))) - -(defun unbind (object event) - "Remove the event and the handler function from object's bindings alist." - (setf (slot-value object 'bindings) - (remove event (slot-value object 'bindings) :key #'car))) - -(defparameter *keymaps* nil "An alist of available keymaps.") - -(defun define-keymap (name plist) - "Register a keymap given by a name and a plist of keys and functions." - (let ((keymap (make-instance 'keymap :bindings-plist plist))) - (setf *keymaps* (acons name keymap *keymaps*)))) - -(defun find-keymap (keymap-name) - "Return a keymap given by its name from the global keymap alist." - (cdr (assoc keymap-name *keymaps*))) - -;; source: alexandria -(defun plist2alist (plist) - "Take a plist in the form (k1 v1 k2 v2 ...), return an alist ((k1 . v1) (k2 . v2) ...)" - (let (alist) - (do ((lst plist (cddr lst))) - ((endp lst) (nreverse alist)) - (push (cons (car lst) (cadr lst)) alist)))) - -(defun get-event-handler (object event) - "Take an object and an event, return the object's handler for that event. - -The key bindings alist is stored in the bindings slot of the object. - -If no handler is defined for the event, the default event handler t is tried. -If not even a default handler is defined, the event is ignored. - -If input-blocking is nil, we receive nil events in case no real events occur. -In that case, the handler for the nil event is returned, if defined. - -The event pairs are added by the bind function as conses: (event . #'handler). - -An event should be bound to the pre-defined function exit-event-loop." - (flet ((ev (event) - (let ((keymap (typecase (keymap object) - (keymap (keymap object)) - (symbol (find-keymap (keymap object)))))) - ;; object-local bindings override the external keymap - ;; an event is checked in the bindings first, then in the external keymap. - (if (bindings object) - (if (assoc event (bindings object)) - (assoc event (bindings object)) - (if (and keymap (bindings keymap)) - (assoc event (bindings keymap)) - nil)) - ;; if there are no local bindings, check the external keymap - (if (and keymap (bindings keymap)) - (assoc event (bindings keymap)) - nil))))) - (cond - ;; Event occured and event handler is defined. - ((and event (ev event)) (cdr (ev event))) - ;; Event occured and a default event handler is defined. - ;; If not even the default handler is defined, the event is ignored. - ((and event (ev t)) (cdr (ev t))) - ;; If no event occured and the idle handler is defined. - ;; The event is only nil when input input-blocking is nil. - ((and (null event) (ev nil)) (cdr (ev nil))) - ;; If no event occured and the idle handler is not defined. - (t nil)))) - -(defun run-event-loop (object &rest args) - "Read events from the window, then call predefined event handler functions on the events. - -The handlers can be added by the bind function, or by directly setting a predefined keymap -to the window's bindings slot. - -Args is one or more additional arguments passed to the handlers. - -Provide a non-local exit point so we can exit the loop from an event handler. - -One of the events must provide a way to exit the event loop by throwing 'event-loop. - -The function exit-event-loop is pre-defined to perform this non-local exit." - (catch object - (loop - (let* ((window (typecase object - (form-window (sub-window object)) - ;; if the object is a window - (window object) - ;; if the object isnt a window, it should have an associated window. - (otherwise (window object)))) - (event (get-wide-event window))) - (handle-event object event args) - ;; process the contents of the job queue (ncurses access from other threads) - (process) - ;; should a frame rate be a property of the window or of the object? - (when (and (null event) (frame-rate window)) - (sleep (/ 1.0 (frame-rate window)))) )))) - -(defgeneric handle-event (object event args) - ;; the default method applies to window, field, button, menu. - (:method (object event args) - "Default method for all objects without a specialized method." - (let ((handler (get-event-handler object event))) - (when handler - ;; if args is nil, apply will call the handler with just object and event - ;; this means that if we dont need args, we can define most handlers as two-argument functions. - (apply handler object event args))))) - -(defmethod handle-event ((form form) event args) - "If a form can't handle an event, let the current form element try to handle it." - (let ((handler (get-event-handler form event))) - (if handler - (apply handler form event args) - (handle-event (current-element form) event args)))) - -(defun exit-event-loop (object event &rest args) - "Associate this function with an event to exit the event loop." - (declare (ignore win event args)) - (throw object :exit-event-loop)) - -(defmacro save-excursion (window &body body) - "After executing body, return the cursor in window to its initial position." - (let ((pos (gensym))) - `(let ((,pos (cursor-position ,window))) - ,@body - (move ,window (car ,pos) (cadr ,pos))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/default_colors.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/default_colors.lisp deleted file mode 100644 index ac5e7e5..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/default_colors.lisp +++ /dev/null @@ -1,30 +0,0 @@ -(in-package :croatoan) - -;; default_colors -;; use terminal's default colors -;; http://invisible-island.net/ncurses/man/default_colors.3x.html - -;;; C prototypes - -;; int use_default_colors(void); -;; int assume_default_colors(int fg, int bg); - -;;; Low-level C functions - -(defcfun ("use_default_colors" %use-default-colors) :int) -(defcfun ("assume_default_colors" %assume-default-colors) :int (fg :int) (bg :int)) - -;;; High-level Lisp wrappers - -(defun use-default-colors (flag) - "Assign the terminal default colors to the color number -1." - (when flag - (%use-default-colors))) - -(defun assume-default-colors (fg bg) - "Modify the default color pair 0 to use the color numbers fg and bg. - -Ncurses otherwise will use white on black." - (%assume-default-colors fg bg)) - -;;; NOTICE diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/define_key.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/define_key.lisp deleted file mode 100644 index e6ef7b7..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/define_key.lisp +++ /dev/null @@ -1,24 +0,0 @@ -(in-package :croatoan) - -;; define_key -;; define a keycode -;; http://invisible-island.net/ncurses/man/define_key.3x.html - -;;; C prototypes - -;; int define_key(const char *definition, int keycode); - -;;; Low-level C functions - -(defcfun ("define_key" %define-key) :int (definition :string) (keycode :int)) - -;;; High-level Lisp wrappers - -(defun define-key (definition code) - "Define a new keycode with its definition string. - -If the string is empty, or the code zero or negative, the existing -definition is removed." - (%define-key definition code)) - -;;; TODOs diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/delch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/delch.lisp deleted file mode 100644 index 83f09c6..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/delch.lisp +++ /dev/null @@ -1,14 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun delete-char (window &key y x) - "Delete the character under the cursor. - -All characters to the right of the cursor on the same line are moved -to the left one position and the last character on the line is filled -with a blank. The cursor position does not change after moving -to (y,x), if specified." - (let ((winptr (winptr window))) - (cond ((and y x) - (%mvwdelch winptr y x)) - (t - (%wdelch winptr))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/deleteln.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/deleteln.lisp deleted file mode 100644 index 4958872..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/deleteln.lisp +++ /dev/null @@ -1,18 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun delete-line (window &key (n 1)) - "Delete n lines starting with the one under the cursor. - -The remaining lines are moved up. The bottom n lines are cleared. - -The current cursor position does not change." - (%winsdelln (winptr window) (- n))) - -(defun insert-line (window &key (n 1)) - "Insert n lines above the current line. - -The current line and the lines below are moved down. The n bottom -lines are lost. - -The current cursor position does not change." - (%winsdelln (winptr window) n)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/extend.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/extend.lisp deleted file mode 100644 index 082b28e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/extend.lisp +++ /dev/null @@ -1,19 +0,0 @@ -(in-package :croatoan) - -;;; extend -;;; miscellaneous curses extensions -;;; http://invisible-island.net/ncurses/man/curs_extend.3x.html - -;;; C prototypes - -;; const char * curses_version(void); -;; int use_extended_names(bool enable); - -;;; Low-level C functions - -(defcfun ("curses_version" %curses-version) :string) -(defcfun ("use_extended_names" %use-extended-names) :int (enable :boolean)) - -;;; High-level Lisp wrappers - -;;; NOTES diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/form.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/form.lisp deleted file mode 100644 index b7d4abb..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/form.lisp +++ /dev/null @@ -1,484 +0,0 @@ -(in-package :de.anvi.croatoan) - -;; form -;; curses extension for programming forms -;; https://invisible-island.net/ncurses/man/form.3x.html - -(defun remove-nth (n list) - "Remove element at nth place from the list, decreasing the length of the list. - -Example: (remove-nth 3 '(a b c d e)) => (A B C E)" - (declare - (type (integer 0) n) - (type list list)) - (assert (>= n 0)) - (assert (> (length list) n)) - (if (or (zerop n) (null list)) - (cdr list) - (cons (car list) (remove-nth (1- n) (cdr list))))) - -(defun insert-nth (n element list) - "Insert element into list at nth place, increasing the length of the list. - -Example: (insert-nth 3 'x '(a b c d e)) => (A B C X D E)" - (declare - (type (integer 0) n) - (type list list)) - (assert (>= n 0)) - (assert (>= (length list) n)) - (if (or (zerop n) (null list)) - (cons element list) - (cons (car list) (insert-nth (1- n) element (cdr list))))) - -(defun replace-nth (n element list) - "Replaces element of list at nth place, not increasing the length of the list. - -Example: (replace-nth 3 'x '(a b c d e)) => (A B C X E)" - (declare - (type (integer 0) n) - (type list list)) - (assert (>= n 0)) - (assert (>= (length list) n)) - (if (or (zerop n) (null list)) - (cons element (cdr list)) - (cons (car list) (replace-nth (1- n) element (cdr list))))) - -(defun find-element (form element-name &key (test #'eql) (key #'name)) - "Return from the given form the element given by its name. - -The name should be a keyword, symbol or integer, the default test is eql. - -If the name is a string, equal should be used as the test. - -Instead of the name, another key can be provided to identify the element." - (find element-name (elements form) :test test :key key)) - -;; this is the only place we set the background style for the field -;; TODO: how to access the default fg and bg of a form, -;; if the field is not part of a form? by having a form slot in the field. - -(defmethod clear ((field field) &key) - "Clear the field by overwriting it with the background char. - -The default background char is #\space." - (with-accessors ((pos location) (width width) (selected selectedp) (win window) (style style)) field - (let* ((bg-style (if selected (getf style :selected-background) (getf style :background))) - (bg-char (if (getf bg-style :simple-char) (getf bg-style :simple-char) #\space))) - (setf (cursor-position win) pos) - (add win bg-char :style bg-style :n width) - (setf (cursor-position win) pos)))) - -(defgeneric update-cursor-position (object) - (:documentation "Update the cursor position of the element of a form.") - (:method (object) - "The default method puts the cursor at the start position of the element." - (setf (cursor-position (window object)) (location object)) - (refresh (window object)))) - -;; when the form element is an embedded selection menu or checklist -;; will not work for menu-windows, which arent yet embedded in forms. -;; we need a separate update-cursor-position for menu-window. -;; used in menu.lisp/(draw menu) - -(defmethod update-cursor-position ((object menu)) - "Update the cursor position of a menu after it is drawn. - -Place the cursor, when it is visible, on the first char of the current item." - (setf (cursor-position (window object)) (current-item-location object)) - (refresh (window object))) - -(defmethod update-cursor-position ((object checklist)) - "Update the cursor position of a checklist after it is drawn. - -Place the cursor between the brackets [_] of the current item." - (with-accessors ((pos current-item-location) (win window)) object - (move win - (car pos) - (1+ (cadr pos))) ;; put the cursor after the [ - (refresh win))) - -(defmethod update-cursor-position ((checkbox checkbox)) - "Update the cursor position of a checkbox." - (with-accessors ((pos location) (win window)) checkbox - (move win - (car pos) - (1+ (cadr pos))) ;; put the cursor after the [ - (refresh win) )) - -(defmethod update-cursor-position ((field field)) - "Update the cursor position of a field." - (with-accessors ((pos location) (inptr input-pointer) (dptr display-pointer) (win window)) field - (move win - ;; TODO: assumes a single-line field. - (car pos) - (+ (cadr pos) ; beginning of the field - (- inptr dptr) )) ; position in the field starting with dptr - (refresh win))) - -(defmethod update-cursor-position ((form form)) - "Move the cursor to the correct position in current element of the form." - (update-cursor-position (current-element form))) - -(defgeneric draw (object) - (:documentation "Draw objects (form, field, menu) to their associated window.")) - -(defmethod draw ((label label)) - (with-accessors ((pos location) (win window) (name name) (title title) (width width) (style style) (reference reference) - (parent-form parent-form)) label - ;; pick the string to write in the following order - ;; title of the label - ;; title of the referenced element - ;; name of the referenced element - ;; name of the label - (let* ((text (or title - (title (find-element parent-form reference)) - (name (find-element parent-form reference)) - name)) - (string (when text (format nil "~A" text))) - (fg-style (getf style :foreground)) - (bg-style (getf style :background)) - (bg-char (if (getf bg-style :simple-char) (getf bg-style :simple-char) #\space))) - (when string - ;; first draw the background, but only if width > string - (when width - (apply #'move win pos) - (add win bg-char :style bg-style :n width)) - ;; then the label over the background - (apply #'move win pos) - (add-string win string :style fg-style))))) - -(defmethod draw ((button button)) - (with-accessors ((pos location) (name name) (title title) (win window) (selected selectedp) (style style)) button - (apply #'move win pos) - (let* ((fg-style (if selected (getf style :selected-foreground) (getf style :foreground)))) - (add-string win (format nil "<~A>" (if title title name)) :style fg-style)))) - -(defmethod draw ((checkbox checkbox)) - (with-accessors ((pos location) (name name) (win window) (selected selectedp) (style style) - (checkedp checkedp)) checkbox - (apply #'move win pos) - (let* ((fg-style (if selected (getf style :selected-foreground) (getf style :foreground)))) - (add-string win (format nil "[~A]" (if checkedp "X" "_")) :style fg-style) - (update-cursor-position checkbox)))) - -(defmethod draw ((field field)) - "Clear and redraw the field and its contents and background." - (with-accessors ((pos location) (width width) (inbuf buffer) (inptr input-pointer) (dptr display-pointer) - (selected selectedp) (win window) (title title) (style style)) field - (let* ((fg-style (if selected (getf style :selected-foreground) (getf style :foreground))) - (len (length inbuf)) - (val (value field)) - (str (if (< len width) - ;; if the buffer is shorter than the field, just display it. - val - ;; otherwise display a substring starting with dptr. - ;; display only max width chars starting from dptr - (subseq val dptr (if (< width (- len dptr)) - ;; if the remaining substring is longer than width, display just width chars. - (+ dptr width) - ;; if the remaining substring is shorter than width, just display it. - len) )))) - (clear field) - (apply #'move win pos) - (add-string win str :style fg-style) - (update-cursor-position field)))) - -(defmethod draw ((form form)) - "Draw the form by drawing the elements, then moving the cursor to the current element." - (with-accessors ((elements elements) (window window)) form - (loop for element in elements do - (draw element)) - ;; after drawing the elements, reposition the cursor to the current element - (update-cursor-position form))) - -(defmethod draw ((form form-window)) - "Draw the form by drawing the elements, then moving the cursor to the current element." - ;; update cursor position only refreshes the window associated with the form, which is the sub-window - ;; in order to see the border, we have to touch and refresh the parent border window. - ;; refreshing the parent window has to be done before refreshing the cursor position in the sub - ;; or the cursor will be moved to 0,0 of the parent window. - (touch form) - (refresh form) - ;; draw the form contents, the superclass of form-window is form (and decorated-window). - (call-next-method)) - -;; previous-element and next-element are the only two elements where the current-element-number is changed. -;; here also current-element and selected has to be set. -(defun select-previous-element (form event &rest args) - "Select the previous element in a form's element list." - ;;(declare (special form)) - (with-accessors ((elements elements) (current-element-number current-element-number) (current-element current-element) (win window)) form - (setf (selectedp current-element) nil) - - ;; use mod to cycle the element list. - (setf current-element-number (mod (- current-element-number 1) (length elements))) - (setf current-element (nth current-element-number elements)) - - ;; ignore inactive elements like labels. - (if (activep current-element) - (progn - (setf (selectedp current-element) t) - ;; after we switched the element number, we also have to redraw the form. - (draw form)) - (select-previous-element form event)))) - -(defun select-next-element (form event &rest args) - "Select the next element in a form's element list." - ;;(declare (special form)) - (with-accessors ((elements elements) (current-element-number current-element-number) (current-element current-element) (win window)) form - (setf (selectedp current-element) nil) - - ;; use mod to cycle the element list. - (setf current-element-number (mod (+ current-element-number 1) (length elements))) - (setf current-element (nth current-element-number elements)) - - ;; ignore inactive elements like labels. - (if (activep current-element) - (progn - (setf (selectedp current-element) t) - ;; after we switched the element number, we also have to redraw the form. - (draw form)) - (select-next-element form event)))) - -(defun move-previous-char (field event &rest args) - "Move the cursor to the previous char in the field." - (with-accessors ((inptr input-pointer) (dptr display-pointer) (win window)) field - (when (> inptr 0) - (decf inptr)) - ;; when the inptr moves left past the dptr, simultaneously decf the dptr. - (when (< inptr dptr) - (decf dptr)) - (draw field))) - -(defun move-next-char (field event &rest args) - "Move the cursor to the next char in the field." - (with-accessors ((width width) (inbuf buffer) (inptr input-pointer) (dptr display-pointer) (mlen max-buffer-length) - (win window)) field - (when (and (< inptr (length inbuf)) - (not (= (1+ inptr) mlen width))) - (incf inptr)) - ;; when the inptr moves right past the width, simultaneously incf the dptr. - (when (and (>= inptr (+ dptr width)) - (not (= inptr mlen width))) - (incf dptr)) - (draw field))) - -(defun delete-previous-char (field event &rest args) - "Delete the previous char in the field, moving the cursor to the left." - (with-accessors ((inbuf buffer) (inptr input-pointer) (dptr display-pointer) (win window)) field - (when (> inptr 0) - (decf inptr) - (when (> dptr 0) - (decf dptr)) - (setf inbuf (remove-nth (- (length inbuf) 1 inptr) inbuf))) - ;; we dont have to redraw the complete form, just the changed field. - (draw field))) - -(defun delete-next-char (field event &rest args) - "Delete the next char (char under the cursor) in the field, not moving the cursor." - (with-accessors ((inbuf buffer) (inptr input-pointer) (dptr display-pointer) (win window)) field - ;; we can only delete to the right if the inptr is not at the end of the inbuf. - (when (> (length inbuf) inptr) - (when (> dptr 0) - ;; when a part of the string is hidden on the left side, shift it to the right. - (decf dptr)) - (setf inbuf (remove-nth (- (length inbuf) (1+ inptr)) inbuf))) - (draw field))) - -(defun field-add-char (field char &rest args) - "Add char to the current cursor position in the field. - -The buffer can be longer than the displayed field width, horizontal scrolling is enabled." - (if (and (characterp char) (graphic-char-p char)) - (progn - (with-accessors ((width width) (inbuf buffer) (mlen max-buffer-length) (inptr input-pointer) - (dptr display-pointer) (win window)) field - (let ((len (length inbuf))) - (if (insert-mode-p win) - - ;; insert mode - (progn - ;; only add new chars until we've reached the max-buffer-length - (unless (>= len mlen) - ;; if we're at the end of the inbuf - (if (= inptr len) - ;; just add another char to the inbuf - (setf inbuf (cons char inbuf)) - ;; if we're in the middle of the buffer, either insert or replace - (setf inbuf (insert-nth (- len inptr) char inbuf)) ) - ;; we need special cases when mlen is exactly equal to width. - (if (= mlen width) - ;; advance the cursor if it is not already at the end - ;; if scrolling is disabled, do not move past the last char in the field. - (unless (>= inptr (- mlen 1)) - (incf inptr)) - (unless (> inptr (- mlen 1)) - (incf inptr)))) - ;; after updating the fill-pointer, update the display-pointer - (if (< inptr dptr) (decf dptr)) - (if (> inptr (+ dptr (1- width))) (incf dptr))) - ;; default overwrite mode - (progn - ;; only add new chars until we've reached the max-buffer-length then only overwrite. - (if (>= len mlen) - (if (< inptr mlen) - ;; even when the inbuf is full, when inptr is not at the end, overwrite. - (setf inbuf (replace-nth (- len (1+ inptr)) char inbuf)) - nil) - ;; if we're at the end of the inbuf - (if (= inptr len) - ;; just add another char to the inbuf - (setf inbuf (cons char inbuf)) - ;; if we're in the middle of the buffer, either insert or replace - (setf inbuf (replace-nth (- len (1+ inptr)) char inbuf)))) - ;; we need special cases when mlen is exactly equal to width. - (if (= mlen width) - ;; advance the cursor if it is not already at the end - ;; if scrolling is disabled, do not move past the last char in the field. - (unless (>= inptr (- mlen 1)) - (incf inptr)) - (unless (> inptr (- mlen 1)) - (incf inptr))) - ;; after updating the fill-pointer, update the display-pointer - (when (< inptr dptr) (decf dptr)) - (if (<= mlen width) - ;; if scrolling is disabled, do not move past the last char in the field. - (when (> inptr (+ dptr width)) - (incf dptr)) - (when (> inptr (+ dptr (1- width))) - (incf dptr))) )))) - (draw field)) - ;; if the char isnt graphic, do nothing. - ;; TODO: this doesnt work with acs chars, which are keywords. - nil)) - -(defun debug-print-field-buffer (object event &rest args) - (declare (ignore event)) - (typecase object - (field - (with-accessors ((inbuf buffer) (inptr input-pointer) (dptr display-pointer) (win window)) object - (when (> (length inbuf) 0) - (clear win) - (format win "~A ~%" (value object)) - (setf inbuf nil inptr 0 dptr 0)))) - ;; when we want to debug the whole form. - (form - (debug-print-field-buffer (current-element object) event))) - (draw object)) - -(defun cancel (object event &rest args) - "Associate this function with an event (key binding or button) to exit the event loop of a form or form element. - -The first return value is nil, emphasizing that the user has canceled the form. - -The second value is a list containing the object, the event that called the exit and the args passed. - -This allows to specify why the form was canceled." - ;; TODO: should this be done by the routine or explicitely by the user? - (when (eq (type-of object) 'form) - (reset-form object event)) - (throw (if (eq (type-of object) 'form) - object - (if (parent-form object) - (parent-form object) - object)) - (values nil (list object event args)))) - -(defun accept (object event &rest args) - "Associate this function with an event (key binding or button) to exit the event loop of a form or form element. - -The first return value is t, emphasizing that the user has accepted the form. - -The second value is a list containing the object, the event that called the exit and the args passed. - -This allows to specify by which button or event the form was accepted." - ;; if the object has a parent-form, do not throw the object, throw its parent form, otherwise throw the object. - (throw (if (eq (type-of object) 'form) - object - (if (parent-form object) - (parent-form object) - object)) - (values t (list object event args)))) - -(defun reset-field (field event &rest args) - "Clear the field and reset its internal buffers and pointers." - (with-accessors ((inbuf buffer) (inptr input-pointer) (dptr display-pointer) (win window)) field - (clear field) - (setf inbuf nil inptr 0 dptr 0))) - -(defun reset-form (object event &rest args) - (declare (ignore event)) - (let ((form (typecase object - (form object) - (t (parent-form object))))) - (loop for element in (elements form) - do (when (and (typep element 'field) (activep element)) - (with-accessors ((inbuf buffer) (inptr input-pointer) (dptr display-pointer) (win window)) element - (setf inbuf nil - inptr 0 - dptr 0)))) - (draw form))) - -(define-keymap 'form-map - (list - ;; C-a = ^A = #\soh = 1 = start of heading - ;; exit the edit loop, return t - #\soh 'accept - ;; C-x = cancel = CAN = #\can - ;; exit the edit loop, return nil - #\can 'cancel - ;; C-r = reset = DC2 = #\dc2 - ;; reset editable elements of the form (fields, checkboxes) - #\dc2 'reset-form - - :btab 'select-previous-element - #\tab 'select-next-element)) - -(define-keymap 'field-map - (list - ;; C-a = ^A = #\soh = 1 = start of heading - ;; exit the edit loop, return t - #\soh 'accept - ;; C-x = cancel = CAN = #\can - ;; exit the edit loop, return nil - #\can 'cancel - ;; C-r = reset = DC2 = #\dc2 - ;; reset the field - #\dc2 'reset-field - - :left 'move-previous-char - :right 'move-next-char - :backspace 'delete-previous-char - :dc 'delete-next-char - :ic (lambda (field event &rest args) - (setf (insert-mode-p (window field)) (not (insert-mode-p (window field))))) - t 'field-add-char)) - -(defun call-button-function (button event &rest args) - (declare (ignore event)) - (when (callback button) - (funcall (callback button) button event))) - -(defun toggle-checkbox (checkbox event &rest args) - (declare (ignore event)) - (setf (checkedp checkbox) (not (checkedp checkbox))) - (draw checkbox)) - -;; How to automatically bind a hotkey to every button? -;; that hotkey would have to be added to the form keymap, not to that of a button. -;; that would be like a global keymap, in contrast to an elements local keymap. -(define-keymap 'button-map - (list - #\space 'call-button-function - #\newline 'call-button-function)) - -(define-keymap 'checkbox-map - (list - #\space 'toggle-checkbox - #\x 'toggle-checkbox)) - -(defun edit (object &rest args) - (draw object) - ;; since we have args passed to run-event-loop, all handler functions have to accept - ;; a &rest args argument. - (apply #'run-event-loop object args)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/get_wch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/get_wch.lisp deleted file mode 100644 index 611f277..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/get_wch.lisp +++ /dev/null @@ -1,36 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun get-wide-char (window &key y x) - "Read in a wide C wchar_t (multi-byte) from the keyboard and return it. - -If the destination coordinates y (row) and x (column) are given, move -the cursor to the destination first and then read a multi-byte char. - -The window from which the char is read is automatically refreshed." - (when (and y x) (move window y x)) - - (with-foreign-object (ptr 'wint_t) - ;; #define KEY_CODE_YES 0400 /* A wchar_t contains a key code */ - ;; if the char is a function key, return t as a second value, otherwise nil. - (if (= 256 (%wget-wch (winptr window) ptr)) - (values (mem-ref ptr 'wint_t) t) - (values (mem-ref ptr 'wint_t) nil)))) - -(defun get-wide-event (window) - "Return a single user input event. - -An event can be a lisp character or a keyword representing a function or mouse key. - -If input-blocking is nil for the window, return nil if no key was typed." - (multiple-value-bind (ch function-key-p) (get-wide-char window) - (cond - ;; for wide chars, if no input is waiting in non-blocking mode, ERR=0 is returned. - ;; for normal chars, ERR=-1. - ((= ch 0) nil) - (function-key-p - (let ((ev (function-key ch))) - (if (eq ev :mouse) - (multiple-value-bind (mev y x) (get-mouse-event) - (values mev y x)) ; returns 3 values, see mouse.lisp - ev))) - (t (code-char ch))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getch.lisp deleted file mode 100644 index 66fbc82..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getch.lisp +++ /dev/null @@ -1,520 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun get-char (window &key y x) - "Read in a C char (single byte) from the keyboard and return it. - -If the destination coordinates y (row) and x (column) are given, move -the cursor to the destination first and then read a single byte. - -The window from which the char is read is automatically refreshed." - (let ((winptr (winptr window))) - (cond ((and y x) - (%mvwgetch winptr y x)) - (t - (%wgetch winptr))))) - -;; takes a simple C chtype and puts it back into the read buffer. -;; it will be read with the next get-char. -(defun unget-char (chtype) - (%ungetch chtype)) - -;; takes an C int denoting a key. returns t or nil. -;; checks whether a function key is supported by the current terminal. -(defun key-supported-p (key-char) - (%has-key key-char)) - -;;; NOTES - -;; All those return a simple C char (or int), not a rendered chtype (unsigned long int). -;; you can use code-char to convert this simple char/int to a lisp char. -;; but you cannot use this to convert a chtype to a lisp char. - -;;; TODOs - -;; [ ] Escape sequences. They are neither function keys nor chars. - - - -;; keys above the first 0-255 chars. cannot fit in a char variable any more. -;; http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/keys.html -(defparameter *key-alist* - '((:code_yes . 256) - (:min . 257) - (:break . 257) - (:down . 258) - (:up . 259) - (:left . 260) - (:right . 261) - (:home . 262) ; Pos1 - (:backspace . 263) - (:f0 . 264) - - (:f1 . 265) - (:f2 . 266) - (:f3 . 267) - (:f4 . 268) - (:f5 . 269) - (:f6 . 270) - (:f7 . 271) - (:f8 . 272) - (:f9 . 273) - (:f10 . 274) - (:f11 . 275) - (:f12 . 276) - (:f13 . 277) - (:f14 . 278) - (:f15 . 279) - (:f16 . 280) - (:f17 . 281) - (:f18 . 282) - (:f19 . 283) - (:f20 . 284) - (:f21 . 285) - (:f22 . 286) - (:f23 . 287) - (:f24 . 288) - (:f25 . 289) - (:f26 . 290) - (:f27 . 291) - (:f28 . 292) - (:f29 . 293) - (:f30 . 294) - (:f31 . 295) - (:f32 . 296) - (:f33 . 297) - (:f34 . 298) - (:f35 . 299) - (:f36 . 300) - (:f37 . 301) - (:f38 . 302) - (:f39 . 303) - (:f40 . 304) - (:f41 . 305) - (:f42 . 306) - (:f43 . 307) - (:f44 . 308) - (:f45 . 309) - (:f46 . 310) - (:f47 . 311) - (:f48 . 312) - (:f49 . 313) - (:f50 . 314) - (:f51 . 315) - (:f52 . 316) - (:f53 . 317) - (:f54 . 318) - (:f55 . 319) - (:f56 . 320) - (:f57 . 321) - (:f58 . 322) - (:f59 . 323) - (:f60 . 324) - (:f61 . 325) - (:f62 . 326) - (:f63 . 327) - - (:dl . 328) - (:il . 329) - (:dc . 330) - (:ic . 331) - (:eic . 332) - (:clear . 333) - (:eos . 334) - (:eol . 335) - (:sf . 336) ; :shift-down - (:sr . 337) ; :shift-up - (:npage . 338) - (:ppage . 339) - (:stab . 340) - (:ctab . 341) - (:catab . 342) - (:enter . 343) - (:sreset . 344) - (:reset . 345) - (:print . 346) - (:ll . 347) - (:a1 . 348) - (:a3 . 349) - (:b2 . 350) - (:c1 . 351) - (:c3 . 352) - (:btab . 353) ; Shift + TAB = #\LATIN_SMALL_LETTER_S_WITH_CARON = sch - (:beg . 354) - (:cancel . 355) - (:close . 356) - (:command . 357) - (:copy . 358) - (:create . 359) - (:end . 360) ; Ende - (:exit . 361) - (:find . 362) - (:help . 363) - (:mark . 364) - (:message . 365) - (:move . 366) - (:next . 367) - (:open . 368) - (:options . 369) - (:previous . 370) - (:redo . 371) - (:reference . 372) - (:refresh . 373) - (:replace . 374) - (:restart . 375) - (:resume . 376) - (:save . 377) - (:sbeg . 378) - (:scancel . 379) - (:scommand . 380) - (:scopy . 381) - (:screate . 382) - (:sdc . 383) - (:sdl . 384) - (:select . 385) - (:send . 386) ; Shift-End - (:seol . 387) - (:sexit . 388) - (:sfind . 389) - (:shelp . 390) - (:shome . 391) ; Shift-Home, Shift-Pos1 - (:sic . 392) - (:sleft . 393) - (:smessage . 394) - (:smove . 395) - (:snext . 396) - (:soptions . 397) - (:sprevious . 398) - (:sprint . 399) - (:sredo . 400) - (:sreplace . 401) - (:sright . 402) - (:srsume . 403) - (:ssave . 404) - (:ssuspend . 405) - (:sundo . 406) - (:suspend . 407) - (:undo . 408) - (:mouse . 409) - (:resize . 410) - (:event . 411) - (:max . 511) ; Alt-Delete - - ;; The following codes are not part of ncurses because they are not portable, i.e. they do not - ;; exist on all terminals. - ;; These are tested on xterm / gnome-terminal - - ;; :shift-delete = :sdc - (:shift-alt-delete . 512) - (:ctrl-delete . 513) ; Ctrl-Delete - (:shift-ctrl-delete . 514) ; Shift-Control-Delete - - ;; :shift-down = :sf = 336 - (:alt-down . 517) - (:shift-alt-down . 518) - (:ctrl-down . 519) - (:shift-ctrl-down . 520) - ;; (:shift-alt-ctrl-down . xxx) ;; hijacked by the ubuntu unity wm. - - (:alt-end . 522) - (:shift-alt-end . 523) - (:ctrl-end . 524) - (:shift-ctrl-end . 525) - (:ctrl-alt-end . 526) - ;; :shift-ctrl-alt-end . xxx - - (:alt-home . 527) - (:shift-alt-home . 528) - (:ctrl-home . 529) - (:shift-ctrl-home . 530) - (:ctrl-alt-home . 531) - - (:alt-insert . 532) ; Alt-Insert - ;; :shift-insert = middle mouse button paste, probably 513, hijacked by xterm. - (:ctrl-insert . 534) ; Ctrl-Insert - (:ctrl-alt-insert . 536) ; Ctrl-Alt-Insert - - ;; Shift-Ctrl-Alt-Insert = ^[ [ 3 ; 8 ~ - - (:alt-left . 537) - (:shift-alt-right . 538) - (:ctrl-left . 539) - (:shift-ctrl-left . 540) - - ;; npage - ;; :shift-npage - (:alt-npage . 542) - (:ctrl-npage . 544) - (:ctrl-alt-npage . 546) - - ;; :ppage - ;; :shift-ppage activates an xterm ppage function - (:alt-ppage . 547) - (:ctrl-ppage . 549) - (:ctrl-alt-ppage . 551) - - (:alt-right . 552) - (:shift-alt-right . 553) - (:ctrl-right . 554) - (:shift-ctrl-left . 555) - - ;; :shift-up = :sr = 337 - (:alt-up . 558) - (:shift-alt-up . 559) - (:ctrl-up . 560) - (:shift-ctrl-up . 561))) - ;; (:shift-alt-ctrl-up . xxx) - -;; Takes a short int returned by get-char, -;; returns a keyword represeting the function key. -;; returns nil if number is not in the list. -(defun function-key (number) - (car (rassoc number *key-alist*))) - -;; Returns t if the number is a key, nil if it is a char. -(defun function-key-p (number) - (if (and (> number 255) - (rassoc number *key-alist*)) - t - nil)) - -;; http://rosettacode.org/wiki/Keyboard_input/Keypress_check -;; Returns t if a key has been pressed and a char can be read by get-char. -;; Requires input-blocking for window to be set to nil. -(defun key-pressed-p (window) - (let ((ch (get-char window))) - ;; ncurses get-char returns -1 when no key was pressed. - (unless (= ch -1) - ;; if a key was pressed, put it back into the input buffer so it can be rad by the next call to get-char. - (unget-char ch) - ;; Return t. - t))) - -;; works only when input-blocking is set to nil. enable-fkeys should also be t. -;; events can be handled with case. -;; events can be nil (no key pressed), characters #\a and function keys like :up, :down, etc. -;; todo: mouse, resizekey -(defun get-event (window) - ;; doesnt really get a "char", but a single byte, which can be a char. - (let ((ch (get-char window))) - (cond - ;; -1 means no key has been pressed. - ((= ch -1) nil) - ;; 0-255 are regular chars, whch can be converted to lisp chars with code-char. - ((and (>= ch 0) (<= ch 255)) (code-char ch)) - ;; if the code belongs to a known function key, return a keyword symbol. - ((function-key-p ch) - (let ((ev (function-key ch))) - (if (eq ev :mouse) - (multiple-value-bind (mev y x) (get-mouse-event) - (values mev y x)) ; returns 3 values, see mouse.lisp - ev))) - ;; todo: unknown codes, like mouse, resize and unknown function keys. - (t - ;;(error "invalid value of char received from ncurses.") - (princ ch window))))) - -#| - ;; I dont want them defined as octal literals. - '((:code_yes . #o400) - (:min . #o401) - - (:break . #o401) - (:down . #o402) - (:up . #o403) - (:left . #o404) - (:right . #o405) - (:home . #o406) - (:backspace . #o407) - (:f0 . #o410) - - ;; how to handle this??? - ;; F(n) (KEY_F0+(n)) /* Value of function key n */ - ;; (loop for i from 1 to 63 do (format t "(:f~A . ~A)~%" i (+ F0 i))) - - (:dl . #o510) - (:il . #o511) - (:dc . #o512) - (:ic . #o513) - (:eic . #o514) - (:clear . #o515) - (:eos . #o516) - (:eol . #o517) - (:sf . #o520) - (:sr . #o521) - (:npage . #o522) - (:ppage . #o523) - (:stab . #o524) - (:ctab . #o525) - (:catab . #o526) - (:enter . #o527) - (:sreset . #o530) - (:reset . #o531) - (:print . #o532) - (:ll . #o533) - (:a1 . #o534) - (:a3 . #o535) - (:b2 . #o536) - (:c1 . #o537) - (:c3 . #o540) - (:btab . #o541) - (:beg . #o542) - (:cancel . #o543) - (:close . #o544) - (:command . #o545) - (:copy . #o546) - (:create . #o547) - (:end . #o550) - (:exit . #o551) - (:find . #o552) - (:help . #o553) - (:mark . #o554) - (:message . #o555) - (:move . #o556) - (:next . #o557) - (:open . #o560) - (:options . #o561) - (:previous . #o562) - (:redo . #o563) - (:reference . #o564) - (:refresh . #o565) - (:replace . #o566) - (:restart . #o567) - (:resume . #o570) - (:save . #o571) - (:sbeg . #o572) - (:scancel . #o573) - (:scommand . #o574) - (:scopy . #o575) - (:screate . #o576) - (:sdc . #o577) - (:sdl . #o600) - (:select . #o601) - (:send . #o602) - (:seol . #o603) - (:sexit . #o604) - (:sfind . #o605) - (:shelp . #o606) - (:shome . #o607) - (:sic . #o610) - (:sleft . #o611) - (:smessage . #o612) - (:smove . #o613) - (:snext . #o614) - (:soptions . #o615) - (:sprevious . #o616) - (:sprint . #o617) - (:sredo . #o620) - (:sreplace . #o621) - (:sright . #o622) - (:srsume . #o623) - (:ssave . #o624) - (:ssuspend . #o625) - (:sundo . #o626) - (:suspend . #o627) - (:undo . #o630) - (:mouse . #o631) - (:resize . #o632) - (:event . #o633) - - (:max . #o777))) - -#define KEY_CODE_YES 0400 /* A wchar_t contains a key code */ -#define KEY_MIN 0401 /* Minimum curses key */ - -#define KEY_BREAK 0401 /* Break key (unreliable) */ -#define KEY_DOWN 0402 /* down-arrow key */ -#define KEY_UP 0403 /* up-arrow key */ -#define KEY_LEFT 0404 /* left-arrow key */ -#define KEY_RIGHT 0405 /* right-arrow key */ -#define KEY_HOME 0406 /* home key */ -#define KEY_BACKSPACE 0407 /* backspace key */ -#define KEY_F0 0410 /* Function keys. Space for 64 */ -#define KEY_F(n) (KEY_F0+(n)) /* Value of function key n */ -#define KEY_DL 0510 /* delete-line key */ -#define KEY_IL 0511 /* insert-line key */ -#define KEY_DC 0512 /* delete-character key */ -#define KEY_IC 0513 /* insert-character key */ -#define KEY_EIC 0514 /* sent by rmir or smir in insert mode */ -#define KEY_CLEAR 0515 /* clear-screen or erase key */ -#define KEY_EOS 0516 /* clear-to-end-of-screen key */ -#define KEY_EOL 0517 /* clear-to-end-of-line key */ -#define KEY_SF 0520 /* scroll-forward key */ -#define KEY_SR 0521 /* scroll-backward key */ -#define KEY_NPAGE 0522 /* next-page key */ -#define KEY_PPAGE 0523 /* previous-page key */ -#define KEY_STAB 0524 /* set-tab key */ -#define KEY_CTAB 0525 /* clear-tab key */ -#define KEY_CATAB 0526 /* clear-all-tabs key */ -#define KEY_ENTER 0527 /* enter/send key */ -#define KEY_SRESET 0530 /* Soft (partial) reset (unreliable) */ -#define KEY_RESET 0531 /* Reset or hard reset (unreliable) */ -#define KEY_PRINT 0532 /* print key */ -#define KEY_LL 0533 /* lower-left key (home down) */ -#define KEY_A1 0534 /* upper left of keypad */ -#define KEY_A3 0535 /* upper right of keypad */ -#define KEY_B2 0536 /* center of keypad */ -#define KEY_C1 0537 /* lower left of keypad */ -#define KEY_C3 0540 /* lower right of keypad */ -#define KEY_BTAB 0541 /* back-tab key */ -#define KEY_BEG 0542 /* begin key */ -#define KEY_CANCEL 0543 /* cancel key */ -#define KEY_CLOSE 0544 /* close key */ -#define KEY_COMMAND 0545 /* command key */ -#define KEY_COPY 0546 /* copy key */ -#define KEY_CREATE 0547 /* create key */ -#define KEY_END 0550 /* end key */ -#define KEY_EXIT 0551 /* exit key */ -#define KEY_FIND 0552 /* find key */ -#define KEY_HELP 0553 /* help key */ -#define KEY_MARK 0554 /* mark key */ -#define KEY_MESSAGE 0555 /* message key */ -#define KEY_MOVE 0556 /* move key */ -#define KEY_NEXT 0557 /* next key */ -#define KEY_OPEN 0560 /* open key */ -#define KEY_OPTIONS 0561 /* options key */ -#define KEY_PREVIOUS 0562 /* previous key */ -#define KEY_REDO 0563 /* redo key */ -#define KEY_REFERENCE 0564 /* reference key */ -#define KEY_REFRESH 0565 /* refresh key */ -#define KEY_REPLACE 0566 /* replace key */ -#define KEY_RESTART 0567 /* restart key */ -#define KEY_RESUME 0570 /* resume key */ -#define KEY_SAVE 0571 /* save key */ -#define KEY_SBEG 0572 /* shifted begin key */ -#define KEY_SCANCEL 0573 /* shifted cancel key */ -#define KEY_SCOMMAND 0574 /* shifted command key */ -#define KEY_SCOPY 0575 /* shifted copy key */ -#define KEY_SCREATE 0576 /* shifted create key */ -#define KEY_SDC 0577 /* shifted delete-character key */ -#define KEY_SDL 0600 /* shifted delete-line key */ -#define KEY_SELECT 0601 /* select key */ -#define KEY_SEND 0602 /* shifted end key */ -#define KEY_SEOL 0603 /* shifted clear-to-end-of-line key */ -#define KEY_SEXIT 0604 /* shifted exit key */ -#define KEY_SFIND 0605 /* shifted find key */ -#define KEY_SHELP 0606 /* shifted help key */ -#define KEY_SHOME 0607 /* shifted home key */ -#define KEY_SIC 0610 /* shifted insert-character key */ -#define KEY_SLEFT 0611 /* shifted left-arrow key */ -#define KEY_SMESSAGE 0612 /* shifted message key */ -#define KEY_SMOVE 0613 /* shifted move key */ -#define KEY_SNEXT 0614 /* shifted next key */ -#define KEY_SOPTIONS 0615 /* shifted options key */ -#define KEY_SPREVIOUS 0616 /* shifted previous key */ -#define KEY_SPRINT 0617 /* shifted print key */ -#define KEY_SREDO 0620 /* shifted redo key */ -#define KEY_SREPLACE 0621 /* shifted replace key */ -#define KEY_SRIGHT 0622 /* shifted right-arrow key */ -#define KEY_SRSUME 0623 /* shifted resume key */ -#define KEY_SSAVE 0624 /* shifted save key */ -#define KEY_SSUSPEND 0625 /* shifted suspend key */ -#define KEY_SUNDO 0626 /* shifted undo key */ -#define KEY_SUSPEND 0627 /* suspend key */ -#define KEY_UNDO 0630 /* undo key */ -#define KEY_MOUSE 0631 /* Mouse event has occurred */ -#define KEY_RESIZE 0632 /* Terminal resize event */ -#define KEY_EVENT 0633 /* We were interrupted by an event */ - -#define KEY_MAX 0777 /* Maximum key value is 0633 */ - -|# diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getstr.lisp deleted file mode 100644 index 7fb8063..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getstr.lisp +++ /dev/null @@ -1,19 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun get-string (window n &key y x) - "Read a string from the keyboard and return it. - -Reading is performed until a newline or carriage return is received. -The terminating character is not included in the returned string. - -If n is given, read at most n chars, to prevent a possible input -buffer overflow. - -If the destination coordinates y and x are given, move the cursor -there first." - (let ((winptr (winptr window))) - (with-foreign-pointer-as-string (string n) - (cond ((and y x) - (%mvwgetnstr winptr y x string n)) - (t - (%wgetnstr winptr string n)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getyx.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getyx.lisp deleted file mode 100644 index 4e52bb0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getyx.lisp +++ /dev/null @@ -1,54 +0,0 @@ -(in-package :de.anvi.croatoan) - -;; TODO: window auf winpter umstellen. - -(defun cursor-position (window) - "Returns a cons pair of the current cursor coordinates (line-y . column-x) in window." - (cons (%getcury window) - (%getcurx window))) - -(defun window-begin (window) - "Returns a cons pair of the top left beginning coordinates (y . x) of window." - (cons (%getbegy window) - (%getbegx window))) - -(defun subwindow-relative-begin (subwindow) - "Returns a cons pair (y . x) of beginning coordinates of a subwindow relative to the parent window." - (cons (%getpary subwindow) - (%getparx subwindow))) - -(defun window-size (window) - "Returns window size as a cons pair (height . width)." - (cons (%getmaxy window) - (%getmaxx window))) - -;;; NOTES - -#| - -Those 4 C macros are defined in terms of other, simpler macros: - -#define getyx(win,y,x) (y = getcury(win), x = getcurx(win)) -#define getbegyx(win,y,x) (y = getbegy(win), x = getbegx(win)) -#define getmaxyx(win,y,x) (y = getmaxy(win), x = getmaxx(win)) -#define getparyx(win,y,x) (y = getpary(win), x = getparx(win)) - -And those simpler macros are just accessing the window struct. - -#define getcurx(win) ((win) ? (win)->_curx : ERR) -#define getcury(win) ((win) ? (win)->_cury : ERR) -#define getbegx(win) ((win) ? (win)->_begx : ERR) -#define getbegy(win) ((win) ? (win)->_begy : ERR) -#define getmaxx(win) ((win) ? ((win)->_maxx + 1) : ERR) -#define getmaxy(win) ((win) ? ((win)->_maxy + 1) : ERR) -#define getparx(win) ((win) ? (win)->_parx : ERR) -#define getpary(win) ((win) ? (win)->_pary : ERR) - -Those are defined as low-level functions in legacy.lisp. - -|# - -;;; TODOs - -;; combine the 2 win and subwin functions into one by using opaque/is_subwin. - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/gray_streams.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/gray_streams.lisp deleted file mode 100644 index 651b145..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/gray_streams.lisp +++ /dev/null @@ -1,162 +0,0 @@ -(in-package :de.anvi.croatoan) - -#| - -classes and methods for the gray stream interface. - -http://www.nhplace.com/kent/CL/Issues/stream-definition-by-user.html -http://www.gnu.org/software/clisp/impnotes/gray-gf-char-out.html - -before including this, add trivial-gray-streams to asd or use the sb-gray stream package. - -Up to now, window and screen had no superclasses, thus they were subclasses of standard-object. -Now, they will become bi-directional character streams. - -That means that we dont need separate classes for defining streams, and that windows will have -a stream as a feature, windows now will _be_ specialized streams. - -fundamental-character-output-stream -fundamental-character-input-stream - window - screen - subwin - -For the existing code, nothing will change. we will still be able to use all ncurses and croatoan -functions. - -Actually, we still _need_ those functions to define the gray stream functions. But once defined, -we will not need add-char and add-string any more, we will simply use Lisp's format, read, print, etc. - -|# - -;;;; libncursesw, wide IO - -;;; Character Output stream - -;;; Mandatory methods - -;; write-char, format ~C -(defmethod stream-write-char ((stream window) (ch character)) - (if (insert-mode-p stream) - (progn - (insert-wide-char stream ch) - ;; move the cursor after the inserted character. - (move-direction stream :right)) - (add-wide-char stream ch))) - -;; 170830: #sbcl, according to stassats we can not specialize on the second argument, -;; so no complex chars or complex strings with the ~C directive. -;; use ~/xyz/ instead of ~C. -;; ~A uses print-object underneath, not gray streams, so it probably can be used. -#| -; SLIME 2.19 -CL-USER> (defun xxx (&rest args) - (print (second args))) -XXX -CL-USER> xxx -; Evaluation aborted on #. -CL-USER> (xxx 1 2 3 4) - -2 -2 -CL-USER> (format t "~/xxx/") -; Evaluation aborted on #. -CL-USER> (format t "~/xxx/" 1) - -1 -NIL -CL-USER> (format t "~/xxx/" 11) - -11 -NIL -CL-USER> -|# -(defmethod stream-write-char ((stream window) (ch complex-char)) - (add-wide-char stream ch)) - -;; Returns the column number where the next character would be written, i.e. the current x position -(defmethod stream-line-column ((stream window)) - (%getcurx (winptr stream))) - -;;; Non-mandatory methods - -;; Default method uses repeated calls to stream-write-char -;; We can not specialize stream-write-string on complex-strings. - -#| -(defmethod stream-write-string ((stream window) (str-orig string) &optional (start 0) (end nil)) - ;; TODO: either do something with start and end, or (declare (ignore start end)) - (let ((str (subseq str-orig start end))) - ;; TODO: we can not combine %wadd-wch and %waddstr - ;; TODO: writing a normal string waddstr on a wide cchar background causes an SB-KERNEL::CONTROL-STACK-EXHAUSTED-ERROR - (%waddstr (winptr stream) str))) -|# - -;;; Character Input Stream - -;;; Mandatory methods: stream-read-char, stream-unread-char - -(defmethod stream-read-char ((stream window)) - (code-char (get-wide-char stream))) - -(defmethod stream-unread-char ((stream window) (ch character)) - (%unget-wch (char-code ch))) - -;;;; libncurses, non-wide IO - -;;; Character Output stream - -;;; Mandatory methods: stream-write-char, stream-line-column - -;; write-char, format ~C -;;(defmethod stream-write-char ((stream window) (ch character)) -;; (let ((code (char-code ch)) -;; (winptr (winptr stream))) -;; (if (insert-mode-p stream) -;; (progn -;; (%winsch winptr code) -;; ;; move the cursor after the inserted character. -;; (move-to stream :right)) -;; (%waddch winptr code)))) - -;; write-char, format ~C -;;(defmethod stream-write-char ((stream window) (ch complex-char)) -;; (%waddch (winptr stream) (x2c ch))) - -;; print, prin1, princ, format ~A, ~S -;;(defmethod print-object ((ch complex-char) (stream window)) -;; (%waddch (winptr stream) (x2c ch))) -;; -;;(defmethod print-object ((cstr complex-string) stream) -;; (loop for ch across (complex-char-array cstr) -;; do (princ (simple-char ch)))) -;; -;;(defmethod print-object ((cstr complex-string) (stream window)) -;; (loop for ch across (complex-char-array cstr) -;; do (add-char stream ch))) - -;; Returns the column number where the next character would be written, i.e. the current y position -;;(defmethod stream-line-column ((stream window)) -;; (%getcurx (winptr stream))) - -;;; Non-mandatory methods - -;; Default method uses repeated calls to stream-write-char -;;(defmethod stream-write-string ((stream window) (str string) &optional (start 0) (end nil)) -;; ;; TODO: either do something with start and end, or (declare (ignore start end)) -;; (%waddstr (winptr stream) str)) - -;;; Character Input Stream - -;;(defmethod stream-read-char ((stream window)) -;; (code-char (%wgetch (winptr stream)))) - -;;(defmethod stream-read-char-no-hang ((stream window)) -;; %wgetch wie bei read-char, nur muss input-blocking nil sein. - -;;(defmethod stream-unread-char ((stream window) (ch character)) -;; (%ungetch (char-code ch))) - -;; listen = read-char-no-hang + unread -;;(defmethod stream-listen ((stream window)) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/in_wch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/in_wch.lisp deleted file mode 100644 index 16ab056..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/in_wch.lisp +++ /dev/null @@ -1,14 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun extract-wide-char (window &key y x position) - "Extract and return a single wide (complex) character from the window. - -This includes wide characters (code > 255), and requires the ncursesw library. - -If the position coordinates y (row) and x (column) are given, move the -cursor to the position first and then add the character. - -The position can also be passed in form of a two-element list." - (when (and y x) (move window y x)) - (when position (apply #'move window position)) - (funcall-get-cchar_t #'%win-wch window)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inch.lisp deleted file mode 100644 index 9845332..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inch.lisp +++ /dev/null @@ -1,14 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun extract-char (window &key y x position) - "Extract and return the single-byte complex char from the window. - -If the position coordinates y (row) and x (column) are given, move the -cursor to the position first and then add the character. - -The position can also be passed in form of a two-element list." - (when (and y x) (move window y x)) - (when position (apply #'move window position)) - (let* ((winptr (winptr window)) - (chtype (%winch winptr))) - (chtype2xchar chtype))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inchstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inchstr.lisp deleted file mode 100644 index 7526f2a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inchstr.lisp +++ /dev/null @@ -1,21 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun extract-complex-string (window &key y x position n) - "Extract and return a complex string from the window. - -Start at the current cursor position and end at the right margin of window. - -If the position coordinates y (row) and x (column) are given, move the -cursor to the position first and then add the character. - -The position can also be passed in form of a two-element list. - -If n is given, read at most n chars." - (when (and y x) (move window y x)) - (when position (apply #'move window position)) - (let* ((count (if n n (- (width window) (cadr (cursor-position window))))) - (complex-string (make-instance 'complex-string))) - (loop for i from 0 to (1- count) do - (vector-push-extend (extract-wide-char window) (complex-char-array complex-string)) - (move-direction window :right)) - complex-string)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/initscr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/initscr.lisp deleted file mode 100644 index cf2e9d9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/initscr.lisp +++ /dev/null @@ -1,31 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun init-screen () - "Initializes the curses mode. Returns the main window." - (%initscr)) - -(defun end-screen () - "Clean shutdown of the curses display." - (%endwin)) - -(defgeneric closed-p (s) - (:documentation "Check whether the screen has been closed without a subsequent call to refresh to reactivate it.")) - -(defmethod closed-p ((s screen)) - (declare (ignore s)) - (%isendwin)) - -(defun new-terminal (type out-fd in-fd) - "Use instead of init-screen when you want more than one terminal." - (%newterm type out-fd in-fd)) - -(defun set-current-terminal (new-screen) - "Sets new-screen as the current terminal. Returns the old screen." - (%set-term new-screen)) - - -;;; TODOs - -;; [ ] are files in lisp in newterm correctly represented by fd-s? -;; [ ] add type info either to the docs or in asserts. -;; [ ] document all possible return values and check for them. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inopts.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inopts.lisp deleted file mode 100644 index 71a0f05..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inopts.lisp +++ /dev/null @@ -1,82 +0,0 @@ -(in-package :de.anvi.croatoan) - -;; nodelay FALSE = getch blocking -;; nodelay TRUE = getch non-blocking. -;; halfdelay 5 = waits for 5/10 seconds. - -;; halfdelay is turned off by nocbreak. - -;; terminal input modes: -;; -;; canonical non canonical -;; line buffered character based -;; ctrl chars processed ^C,^S,^Q,^D processed no ctrl chars processed -;; cooked cbreak raw -;; -;; buffering t nil nil -;; control t t nil - -;; | cooked | cbreak | raw -;; ----------+--------+--------+----- -;; buffering | t | nil | nil -;; ----------+--------+--------+----- -;; control | t | t | nil - -;; The combination echo+getch should not be used during buffered input -(defun set-input-mode (input-buffering process-control-chars) - (if input-buffering - ;; to turn on buffering, turn off cbreak or raw - (if process-control-chars (%nocbreak) (%noraw)) - ;; to turn off buffering, turn on cbreak or raw - (if process-control-chars (%cbreak) (%raw)))) - -;; Ported to clos, used in clos. -(defun set-input-blocking (window status) - "Set window input blocking behavior. - -Possible values are t, nil and a blocking duration in (positive integer) miliseconds." - (cond ((eq status t) (%wtimeout window -1)) - ((eq status nil) (%wtimeout window 0)) - ((and (typep status 'integer) (plusp status)) - (%wtimeout window status)) - (t (error "possible blocking states: t, nil, delay in miliseconds")))) - -;; Not used in clos because too simple. obsolete. -(defun set-input-echoing (flag) - "Set whether chars will be echoed on input." - (if flag - (%echo) - (%noecho))) - -;; Not used in clos because too simple. obsolete. -(defun set-enable-fkeys (window flag) - "If flag is t, bind function keys to known codes when returned by get-char. - -If flag is nil, F keys will be system-dependent multi-character escape codes." - (%keypad (winptr window) flag)) - -;; Obscure functions I never used before: - -(defun flush-on-interrupt (window flag) - (%intrflush window flag)) - -(defun enable-8bit-char-input (window flag) - (%meta window flag)) - -(defun io-queue-flush (flag) - (if flag - (%qiflush) - (%noqiflush))) - -;; if it would work at all, which it doesnt, -;; it would work only for (function-keys win t) -(defun escape-sequence-delay (window flag) - (%notimeout window flag)) - -(defun type-ahead-fd (fd) - (%typeahead fd)) - -;;; TODOs - -;; [X] do not mix cbreak and raw. use either the one or the other. -;; [ ] for now, we consider only global optins. work in a window parameter as well. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/ins_wch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/ins_wch.lisp deleted file mode 100644 index f231c63..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/ins_wch.lisp +++ /dev/null @@ -1,56 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun insert-wide-char (window char &key attributes fgcolor bgcolor color-pair style y x position n) - "Insert char into window before the character currently under the cursor. - -Chars right of the cursor are moved one position to the right. -The rightmost character on the line may be lost. The position of the -cursor is not changed. - -char can be a simple character or a complex-char with attributes and colors. - -If the position coordinates y (row) and x (column) are given, move the -cursor to the position first and then add the object. - -The position can also be passed in form of a two-element list. - -If n is given, insert n chars." - (when (and y x) (move window y x)) - (when position (apply #'move window position)) - (let ((attributes (if style - (getf style :attributes) - attributes)) - (color-pair (cond (style - (list (getf style :fgcolor) (getf style :bgcolor))) - ((or fgcolor bgcolor) - (list fgcolor bgcolor)) - (t color-pair)))) - (funcall-make-cchar_t #'%wins-wch window char attributes color-pair n))) - -;; TODO: (defmethod insert (obj character)) -;; (defmethod insert (obj string)) etc. -;; the same for echo (only chars) and add. - -;; :x t :y t => keep the current row or column - -(defun insert (window object &rest keys &key &allow-other-keys) - "Insert char or string into window before the char currently under the cursor. - -Currently supported text objects are characters (simple and complex), -characters given by integer codes or keywords, and strings -(simple and complex). - -If the position coordinates y (row) and x (column) are given, move the -cursor to the position first and then insert the object. - -The position can also be passed in form of a two-element list. - -If n is given for a char, insert n chars. - -If n is given for a string, add at most n chars from the string." - (let ((fn (typecase object - ((or string complex-string) - #'insert-string) - ((or integer keyword character complex-char) - #'insert-wide-char)))) - (apply fn window object keys))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/insch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/insch.lisp deleted file mode 100644 index e4e8ebb..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/insch.lisp +++ /dev/null @@ -1,28 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun insert-char (window char &key attributes fgcolor bgcolor color-pair style y x position n) - "Insert char into window before the character currently under the cursor. - -Chars right of the cursor are moved one position to the right. -The rightmost character on the line may be lost. The position of the -cursor is not changed. - -char can be a simple character or a complex-char with attributes and colors. - -If the position coordinates y (row) and x (column) are given, move the -cursor to the position first and then add the object. - -The position can also be passed in form of a two-element list. - -If n is given, insert n chars." - (when (and y x) (move window y x)) - (when position (apply #'move window position)) - (let ((attributes (if style - (getf style :attributes) - attributes)) - (color-pair (cond (style - (list (getf style :fgcolor) (getf style :bgcolor))) - ((or fgcolor bgcolor) - (list fgcolor bgcolor)) - (t color-pair)))) - (funcall-make-chtype #'%winsch window char attributes color-pair n))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/insstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/insstr.lisp deleted file mode 100644 index c7a37be..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/insstr.lisp +++ /dev/null @@ -1,42 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun insert-string (window string &key attributes fgcolor bgcolor color-pair style y x position n) - "Insert string before the current position in window. - -Chars right of the cursor are moved to the right. The rightmost chars -on the line may be lost. The cursor position is not changed. - -If n is given, insert at most n chars from the string. - -If the position coordinates y (row) and x (column) are given, move the -cursor to the position first and then add the object. - -The position can also be passed in form of a two-element list." - (when (and y x) (move window y x)) - (when position (apply #'move window position)) - (let ((count (if n - n - ;; we cant use length to determine the length of a complex string - ;; because it is not a sequence. - (typecase string - (string (length string)) - (complex-string (length (complex-char-array string))))))) - (typecase string - (string - ;;(if (or attributes fgcolor bgcolor color-pair style) - ;; lisp string combined with attributes and colors - (loop - repeat count - for ch across (reverse string) - do (insert-wide-char window ch :attributes attributes :fgcolor fgcolor :bgcolor bgcolor - :color-pair color-pair :style style)) ) - ;; simple lisp string, no attributes or colors - ;; TODO 190826 we dont want to use this because we want to force color-set and bkgd to use separate colors - ;;(if n - ;; (%winsnstr (winptr window) string n) - ;; (%winsstr (winptr window) string)))) - (complex-string - (loop - repeat count - for ch across (reverse (complex-char-array string)) - do (insert-wide-char window ch)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/instr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/instr.lisp deleted file mode 100644 index aea54bc..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/instr.lisp +++ /dev/null @@ -1,28 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun extract-string (window &key y x position n) - "Extract and return a string from window. - -Any attributes are stripped from the characters before the string is returned. - -Start at the current cursor position and end at the right margin of window. - -If the position coordinates y (row) and x (column) are given, move the -cursor to the position first and then add the character. - -The position can also be passed in form of a two-element list. - -If n is given, read at most n chars." - (when (and y x) (move window y x)) - (when position (apply #'move window position)) - (let ((len (if n n (distance-to-eol window)))) - (with-foreign-pointer (string len) - ;; zero the allocated foreign string first. - (setf (mem-ref string :char (1- len)) 0) - ;; populate the foreign string with chars. - ;; the c routines return ERR (-1) or the number of chars extracted. - (let ((retval (%winnstr (winptr window) string len))) - (if (= retval -1) - nil - ;; convert the char pointer to a lisp string. - (foreign-string-to-lisp string)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inwstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inwstr.lisp deleted file mode 100644 index 97de23a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inwstr.lisp +++ /dev/null @@ -1,25 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun extract-wide-string (window &key y x position n) - "Extract and return a string from window. - -Any attributes are stripped from the characters before the string is returned. - -Start at the current cursor position and end at the right margin of window. - -If the position coordinates y (row) and x (column) are given, move the -cursor to the position first and then add the character. - -The position can also be passed in form of a two-element list. - -If n is given, read at most n chars." - (when (and y x) (move window y x)) - (when position (apply #'move window position)) - (let ((count (if n n (distance-to-eol window))) - ;; start with an empty string as buffer - (str (make-array '(0) :element-type 'character :fill-pointer 0 :adjustable t))) - (loop for i from 0 to (1- count) do - (vector-push-extend (simple-char (extract-wide-char window)) str) - (move-direction window :right)) - ;; return string buffer containing i chars - str)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/kernel.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/kernel.lisp deleted file mode 100644 index fa17259..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/kernel.lisp +++ /dev/null @@ -1,9 +0,0 @@ -(in-package :de.anvi.croatoan) - -;; 0 invisible, 1 visible, 2 very visible. -(defun set-cursor-visibility (status) - (case status - ((nil :invisible) (%curs-set 0)) - ((t :visible) (%curs-set 1)) - (:very-visible (%curs-set 2)) - (otherwise (error "Valid status arguments: nil, t, :very-visible")))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/key_defined.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/key_defined.lisp deleted file mode 100644 index eb6e4b3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/key_defined.lisp +++ /dev/null @@ -1,27 +0,0 @@ -(in-package :croatoan) - -;; key_defined -;; check if a keycode is defined -;; http://invisible-island.net/ncurses/man/key_defined.3x.html - -;;; C prototypes - -;; int key_defined(const char *definition); - -;;; Low-level C functions - -(defcfun ("key_defined" %key-defined) :int (definition :string)) - -;;; High-level Lisp wrappers - -(defun key-defined-p (key-name) - "If keycode is defined, return the keycode." - (let ((retval (%key-defined key-name))) - (cond ((= retval 0) nil) - ((= retval -1) nil) - (t retval)))) - -;;; TODOs - -;; [ ] dont return any numeric codes, do something with keywords. -;; [ ] somehow handle the -1 error case. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/keybound.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/keybound.lisp deleted file mode 100644 index 132857c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/keybound.lisp +++ /dev/null @@ -1,24 +0,0 @@ -(in-package :croatoan) - -;; keybound -;; return definition of keycode -;; http://invisible-island.net/ncurses/man/keybound.3x.html - -;;; C prototypes - -;; char *keybound(int keycode, int count); - -;;; Low-level C functions - -(defcfun ("keybound" %keybound) :string (keycode :int) (count :int)) - -;;; High-level Lisp wrappers - -(defun key-description (code n) - "Return the n-th description of key stored in the terminfo database." - (%keybound code n)) - -;;; TODOs - -;; [ ] dont return any numeric codes, do something with keywords. -;; [ ] somehow handle the -1 error case. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/legacy.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/legacy.lisp deleted file mode 100644 index c4c556b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/legacy.lisp +++ /dev/null @@ -1,39 +0,0 @@ -(in-package :croatoan) - -;;; legacy -;;; get curses cursor and window coordinates, attributes -;;; http://invisible-island.net/ncurses/man/curs_legacy.3x.html - -;;; C prototypes - -;; int getattrs(WINDOW *win); -;; int getbegx(WINDOW *win); -;; int getbegy(WINDOW *win); -;; int getcurx(WINDOW *win); -;; int getcury(WINDOW *win); -;; int getmaxx(WINDOW *win); -;; int getmaxy(WINDOW *win); -;; int getparx(WINDOW *win); -;; int getpary(WINDOW *win); - -;;; Low-level C functions - -(defcfun ("getbegx" %getbegx) :int (win window)) -(defcfun ("getbegy" %getbegy) :int (win window)) -(defcfun ("getcurx" %getcurx) :int (win window)) -(defcfun ("getcury" %getcury) :int (win window)) -(defcfun ("getmaxx" %getmaxx) :int (win window)) -(defcfun ("getmaxy" %getmaxy) :int (win window)) -(defcfun ("getparx" %getparx) :int (win window)) -(defcfun ("getpary" %getpary) :int (win window)) - -;;; High-level Lisp wrappers - -;; See getyx.lisp. - -;;; NOTES - -;;; TODOs - -;; getattrs compare with attr_get - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/legacy_coding.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/legacy_coding.lisp deleted file mode 100644 index 38caca9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/legacy_coding.lisp +++ /dev/null @@ -1,26 +0,0 @@ -(in-package :croatoan) - -;;; legacy coding -;;; http://invisible-island.net/ncurses/man/legacy_coding.3x.html - -;;; C prototypes - -;; int use_legacy_coding(int level); - -;;; Low-level C functions - -(defcfun ("use_legacy_coding" %use-legacy-coding) :int (level :int)) - -;;; High-level Lisp wrappers - -;; Possible values: 0 (default), 1 and 2. -(defun set-char-representation (level) - "Set how char-to-string will represent a char." - (%use-legacy-coding level)) - -;;; NOTES - -;; This affects %unctrl/char-to-string. See util.lisp and the manpage. - -;;; TODOs - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/menu.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/menu.lisp deleted file mode 100644 index 786942f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/menu.lisp +++ /dev/null @@ -1,344 +0,0 @@ -(in-package :de.anvi.croatoan) - -;; menu -;; curses extension for programming menus -;; http://invisible-island.net/ncurses/man/menu.3x.html - -(defun list2array (list dimensions) - "Example: (list2array '(a b c d e f) '(3 2)) => #2A((A B) (C D) (E F))" - (let ((m (car dimensions)) - (n (cadr dimensions))) - (assert (= (length list) (* m n))) - (let ((array (make-array dimensions :initial-element nil))) - (loop for i from 0 to (- m 1) - do (loop for j from 0 to (- n 1) - do (setf (aref array i j) (nth (+ (* i n) j) list)))) - array))) - -;; TODO: see menu_format -(defun rmi2sub (layout rmi) - "Take array dimensions and an index in row-major order, return two subscripts. - -Example: (rmi2sub '(2 3) 5) => (1 2)" - (let ((m (car layout)) - (n (cadr layout))) - (assert (< rmi (* m n))) - (multiple-value-bind (q r) (floor rmi n) - (list q r)))) - -(defun sub2rmi (layout subs) - "Take array dimensions and two subscripts, return an index in row-major order. - -Example: (sub2rmi '(2 3) '(1 2)) => 5" - (let ((m (car layout)) - (n (cadr layout)) - (i (car subs)) - (j (cadr subs))) - (assert (and (< i m) (< j n))) - (+ (* i n) j))) - -(defun update-menu (menu event) - "Take a menu and an event, update in-place the current item of the menu." - ;; we need to make menu special in order to setf i in the passed menu object. - (declare (special menu)) - (with-accessors ((current-item-number current-item-number) (current-item current-item) (items items) - (cyclic-selection cyclic-selection-p) (layout layout) (scrolled-layout scrolled-layout) - (scrolled-region-start scrolled-region-start)) menu - (let ((i (car (rmi2sub layout current-item-number))) - (j (cadr (rmi2sub layout current-item-number))) - (m (car layout)) - (n (cadr layout)) - (m0 (car scrolled-region-start)) - (n0 (cadr scrolled-region-start)) - (m1 (car scrolled-layout)) - (n1 (cadr scrolled-layout))) - (if scrolled-layout - ;; when scrolling is on, the menu is not cycled. - (progn - (case event - (:up (when (> i 0) (decf i)) ; when not in first row, move one row up - (when (< i m0) (decf m0))) ; when above region, move region one row up - (:down (when (< i (1- m)) (incf i)) ; when not in last row, move one row down - (when (>= i (+ m0 m1)) (incf m0))) ; when below region, move region one row down - (:left (when (> j 0) (decf j)) ; when not in first column, move one column left - (when (< j n0) (decf n0))) ; when left of region, move region one column left - (:right (when (< j (1- n)) (incf j)) ; when not in last column, move one column right - (when (>= j (+ n0 n1)) (incf n0)))) ; when right of region, move region one column right - - ;; set new scrolled-region coordinates - (setf scrolled-region-start (list m0 n0))) - - ;; when scrolling is off, the menu can be cycled. - (if cyclic-selection - ;; do cycle through the items - (case event - (:up (setf i (mod (1- i) m))) - (:down (setf i (mod (1+ i) m))) - (:left (setf j (mod (1- j) n))) - (:right (setf j (mod (1+ j) n)))) - ;; dont cycle through the items - (case event - (:up (setf i (max (1- i) 0))) - (:down (setf i (min (1+ i) (1- m)))) - (:left (setf j (max (1- j) 0))) - (:right (setf j (min (1+ j) (1- n))))))) - - ;; after updating i,j, update the current-item-number - (setf current-item-number (sub2rmi layout (list i j))) - ;; after updating the current-item-number, update the pointer to the current-item. - (setf current-item (nth current-item-number items)) ))) - -(defun format-menu-item (menu item-number) - "Take a menu and return item item-number as a properly formatted string. - -If the menu is a checklist, return [ ] or [X] at the first position. - -If a mark is set for the current item, display the mark at the second position. -Display the same number of spaces for other items. - -At the third position, display the item given by item-number." - (with-accessors ((items items) - (type menu-type) - (current-item-number current-item-number) - (current-item-mark current-item-mark)) menu - ;; return as string - (format nil "~A~A~A" - ;; two types of menus: :selection or :checklist - ;; show the checkbox before the item in checklists - (if (eq type :checklist) - (if (checkedp (nth item-number items)) "[X] " "[ ] ") - "") - - ;; for the current item, draw the current-item-mark - ;; for all other items, draw a space - (if (= current-item-number item-number) - current-item-mark - (make-string (length current-item-mark) :initial-element #\space)) - - ;; then add the item name - (name (nth item-number items)) ))) - -(defun draw-menu-item (win menu item-number i j) - "Draw the item given by item-number at item position (i j) in the window." - (with-accessors ((current-item-number current-item-number) - (current-item-location current-item-location) - (max-item-length max-item-length) - (menu-location menu-location)) menu - (let (pos-y - pos-x) - (if menu-location - ;; add an offset when menu-location is given - (setq pos-y (+ i (car menu-location)) - pos-x (+ (* j max-item-length) (cadr menu-location))) - ;; if a location is not given, display the menu starting at 0,0 - (setq pos-y i - pos-x (* j max-item-length))) - (move win pos-y pos-x) - ;; save the location of the current item, to be used in update-cursor-position. - (when (= item-number current-item-number) - (setf current-item-location (list pos-y pos-x)))) - - ;; if the item is the current item, change its attributes - (let ((attr (if (= item-number current-item-number) - (list :reverse) - nil))) - ;; delete the item by overwriting it with an empty string. - (save-excursion win (add win #\space :n max-item-length)) - (change-attributes win max-item-length attr) - ;; format the item text - ;; display it in the window associated with the menu - (add win (format-menu-item menu item-number) :attributes attr)))) - -;; draws to any window, not just to a sub-window of a menu-window. -(defun draw-menu (window menu) - "Draw the menu to the window." - (with-accessors ((layout layout) (scrolled-layout scrolled-layout) (scrolled-region-start scrolled-region-start)) menu - (let ((m (car layout)) - (n (cadr layout)) - (m0 (car scrolled-region-start)) - (n0 (cadr scrolled-region-start)) - (m1 (car scrolled-layout)) - (n1 (cadr scrolled-layout))) - (if scrolled-layout - ;; when the menu is too big to be displayed at once, only a part - ;; is displayed, and the menu can be scrolled - (loop for i from 0 to (1- m1) - do (loop for j from 0 to (1- n1) - do (let ((item-number (sub2rmi layout (list (+ m0 i) (+ n0 j))))) - ;; the menu is given as a flat list, so we have to access it as a 2d array in row major order - (draw-menu-item window menu item-number i j)))) - ;; when there is no scrolling, and the whole menu is displayed at once - (loop for i from 0 to (1- m) - do (loop for j from 0 to (1- n) - do (let ((item-number (sub2rmi layout (list i j)))) - (draw-menu-item window menu item-number i j)))) )) - (refresh window))) - -(defmethod draw ((menu menu)) - "Draw the menu to its associated window." - (draw-menu (window menu) menu) - ;; when menu is a part of a form: - ;; update-cursor-position = place the cursor on the current item - ;; if the menu is a checklist, place the cursor inside the [_], like it is done with a single checkbox. - (update-cursor-position menu)) - -(defmethod draw ((menu menu-window)) - "Draw the menu-window." - (with-accessors ((title title) (name name) (border draw-border-p) (sub-win sub-window)) menu - ;; draw the menu to the sub-window - (draw-menu sub-win menu) - ;; we have to explicitely touch the background win, because otherwise it wont get refreshed. - (touch menu) - ;; draw the title only when we also have a border, because we draw the title on top of the border. - (when (and border title) - ;; make a format template depending on the length of the title. - ;; "|~12:@<~A~>|" - (flet ((make-title-string (len) - (concatenate 'string "|~" (write-to-string (+ len 2)) ":@<~A~>|"))) - ;; If there is a title string, take it, otherwise take the name. - ;; The name is displayed only if title is t. - (let* ((str (if (typep title 'string) title name)) - (n (length str))) - (add menu (format nil (make-title-string n) str) :y 0 :x 2)))) - ;; todo: when we refresh a window with a subwin, we shouldnt have to refresh the subwin separately. - ;; make refresh specialize on menu and decorated window in a way to do both. - (refresh menu))) - -(defmethod draw ((menu dialog-window)) - ;; first draw a menu - ;; TODO: describe what exactly is drawn here and what in the parent method. - (call-next-method) - - ;; then draw the message in the reserved space above the menu. - (with-accessors ((message-text message-text) (message-height message-height) - (message-pad message-pad) (coords message-pad-coordinates)) menu - ;; if there is text, and there is space reserved for the text, draw the text - (when (and message-text (> message-height 0)) - (refresh message-pad - 0 ;pad-min-y - 0 ;pad-min-x - (first coords) ;screen-min-y - (second coords) ;screen-min-x - (third coords) ;screen-max-y - (fourth coords))))) ;screen-max-x - -(defun reset-menu (menu) - "After the menu is closed reset it to its initial state." - (with-slots (items current-item-number current-item scrolled-region-start menu-type) menu - (setf current-item-number 0 - current-item (car items) - scrolled-region-start (list 0 0)) - (when (eq menu-type :checklist) - (loop for i in items if (checkedp i) do (setf (checkedp i) nil))))) - -(defun return-from-menu (menu return-value) - "Set menu window to invisible, refresh the window stack, return the value from select." - (when *window-stack* - ;; change visibility only when there is an active stack. - (typecase menu - (menu-window (setf (visiblep menu) nil)) - (menu (setf (visiblep (window menu)) nil))) - (refresh-stack)) - (reset-menu menu) - (throw menu return-value)) - -(defun exit-menu-event-loop (menu event) - "Associate this function with an event to exit the menu event loop." - (declare (ignore event)) - (return-from-menu menu nil)) - -(defun checked-items (menu) - "Take a menu, return a list of checked menu items." - (loop for i in (items menu) if (checkedp i) collect i)) - -(defmethod value ((menu menu)) - "Return the value of the selected item." - (value (current-item menu))) - -(defmethod value ((checklist checklist)) - "Return the list of values of the checked items." - (mapcar #'value (checked-items checklist))) - -(defun accept-selection (menu event) - "Return the value of the currently selected item or all checked items." - (declare (ignore event)) - - (case (menu-type menu) - (:checklist - ;; return all checked items (not their values) in the item list. - (return-from-menu menu (checked-items menu))) - - (:selection - (let ((val (value (current-item menu)))) - (cond - ;; if the item is a string or symbol, just return it. - ((or (typep val 'string) - (typep val 'symbol)) - (return-from-menu menu val)) - - ;; if the item is a function object, call it. - ((typep val 'function) - (funcall val) - (return-from-menu menu (name (current-item menu)))) - - ;; if the item is a menu (and thus also a menu-window), recursively select an item from that submenu - ((or (typep val 'menu) - (typep val 'menu-window)) - (let ((selected-item (select val))) - - ;; when we have more than menu in one window, redraw the parent menu when we return from the submenu. - (when (eq (type-of val) 'menu) - (draw menu)) - - (when selected-item - (return-from-menu menu selected-item)))) ))))) - -(defun update-redraw-menu (menu event) - "Update the menu after an event, the redraw the menu." - (update-menu menu event) - (draw menu)) - -(defun toggle-item-checkbox (menu event) - "Toggle the checked state of the current item, used in checkbox menus." - (declare (ignore event)) - (setf (checkedp (current-item menu)) (not (checkedp (current-item menu)))) - (draw menu)) - -;; all of these take two arguments: menu event -(define-keymap 'menu-map - (list - ;; q doesnt return a value, just nil, i.e. in the case of a checklist, an empty list. - #\q 'exit-menu-event-loop - #\x 'toggle-item-checkbox - - :up 'update-redraw-menu - :down 'update-redraw-menu - :left 'update-redraw-menu - :right 'update-redraw-menu - - ;; there is no :default action, all other events are ignored for menus. - - ;; return the selected item or all checked items, then exit the menu like q. - #\newline 'accept-selection)) - -(defun select (menu) - "Display the menu, let the user select an item, return the selected item. - -If the item is a menu object, recursively display the sub menu." - (typecase menu - - (menu-window - (when *window-stack* - (setf (visiblep menu) t) - (refresh-stack)) - (draw menu) - - ;; here we can pass the menu to run-event-loop because it is a menu-window. - ;; all handler functions have to accept window and event as arguments. - ;; the return value of select is the return value of run-event-loop - ;; is the value thrown to the catch tag 'event-loop. - (run-event-loop menu)) - - (menu - (draw menu) - (run-event-loop menu)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/mouse.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/mouse.lisp deleted file mode 100644 index 51c52bc..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/mouse.lisp +++ /dev/null @@ -1,89 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defparameter *mouse-button-event-bitmask-alist* - '((:released . #o01) - (:pressed . #o02) - (:clicked . #o04) - (:double-clicked . #o10) - (:triple-clicked . #o20) - (:reserved-event . #o40))) - -(defmacro mouse-bitmask (button event) - (let ((*mouse-button-event-bitmask-alist* - '((:released . #o01) - (:pressed . #o02) - (:clicked . #o04) - (:double-clicked . #o10) - (:triple-clicked . #o20) - (:reserved-event . #o40)))) - (cond ((integerp event) `(ash ,event (* 6 (- ,button 1)))) - ((symbolp event) - (let ((mask (cdr (assoc event *mouse-button-event-bitmask-alist*)))) - `(ash ,mask (* 6 (- ,button 1)))))))) - -(defparameter *mouse-event-bitmask-alist* - `((:button-1-released . ,(mouse-bitmask 1 :released)) - (:button-1-pressed . ,(mouse-bitmask 1 :pressed)) - (:button-1-clicked . ,(mouse-bitmask 1 :clicked)) - (:button-1-double-clicked . ,(mouse-bitmask 1 :double-clicked)) - (:button-1-triple-clicked . ,(mouse-bitmask 1 :triple-clicked)) - (:button-1-reserved-event . ,(mouse-bitmask 1 :reserved-event)) - (:button-2-released . ,(mouse-bitmask 2 :released)) - (:button-2-pressed . ,(mouse-bitmask 2 :pressed)) - (:button-2-clicked . ,(mouse-bitmask 2 :clicked)) - (:button-2-double-clicked . ,(mouse-bitmask 2 :double-clicked)) - (:button-2-triple-clicked . ,(mouse-bitmask 2 :triple-clicked)) - (:button-2-reserved-event . ,(mouse-bitmask 2 :reserved-event)) - (:button-3-released . ,(mouse-bitmask 3 :released)) - (:button-3-pressed . ,(mouse-bitmask 3 :pressed)) - (:button-3-clicked . ,(mouse-bitmask 3 :clicked)) - (:button-3-double-clicked . ,(mouse-bitmask 3 :double-clicked)) - (:button-3-triple-clicked . ,(mouse-bitmask 3 :triple-clicked)) - (:button-3-reserved-event . ,(mouse-bitmask 3 :reserved-event)) - (:button-4-released . ,(mouse-bitmask 4 :released)) - (:button-4-pressed . ,(mouse-bitmask 4 :pressed)) - (:button-4-clicked . ,(mouse-bitmask 4 :clicked)) - (:button-4-double-clicked . ,(mouse-bitmask 4 :double-clicked)) - (:button-4-triple-clicked . ,(mouse-bitmask 4 :triple-clicked)) - (:button-4-reserved-event . ,(mouse-bitmask 4 :reserved-event)) - (:button-ctrl . ,(mouse-bitmask 5 #o01)) - (:button-shift . ,(mouse-bitmask 5 #o02)) - (:button-alt . ,(mouse-bitmask 5 #o04)) - (:report-mouse-position . ,(mouse-bitmask 5 #o10)))) - -;; (:all-mouse-events . ,(- (mouse-bitmask 5 #o10) 1) - -;; take a unsigned long integer representing a bitmask of mouse events, -;; return a list of mouse event keywords. -(defun bitmask-to-keyword (bitmask) - (loop for i in (mapcar #'car *mouse-event-bitmask-alist*) - if (logtest bitmask (cdr (assoc i *mouse-event-bitmask-alist*))) return i)) -;; use collect to catch more than 1 event at once. -;; (format scr "~32,'0b" bitmask) - -(defun keyword-to-bitmask (keys) - "Take a list of mouse event keywords, return a logiored bitmask." - (apply #'logior (mapcar #'(lambda (x) (cdr (assoc x *mouse-event-bitmask-alist*))) - keys))) - -(defun set-mouse-event (keyword-list) - "Take a list of mouse events, activate tracking of those events. - -Returns an integer bitmask. An empty list turns off mouse tracking." - (%mousemask (keyword-to-bitmask keyword-list) (null-pointer))) - -;; decode and return the mouse event struct as multiple values: -;; mouse event keyword, y coordinate integer, x coordinate integer -(defun get-mouse-event () - (flet ((plist-symbols-to-keywords (plist) - ;; mem-ref returns a struct as a symbol plist. - ;; we have to convert the symbols to keywords to transport them across packages. - (loop for i in plist collect (if (symbolp i) (values (intern (symbol-name i) "KEYWORD")) i)))) - (with-foreign-object (ptr '(:struct mevent)) - (%getmouse ptr) - (let* ((struct (plist-symbols-to-keywords (mem-ref ptr '(:struct mevent)))) - (x (getf struct :x)) - (y (getf struct :y)) - (b (getf struct :bstate)) - (mouse-event (bitmask-to-keyword b))) - (values mouse-event y x))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/move.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/move.lisp deleted file mode 100644 index 41da3f6..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/move.lisp +++ /dev/null @@ -1,32 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun move (window y x &key relative) - "Move cursor to the position given by row y and column x. - -If relative is t, move the cursor by y rows and x columns." - (let ((winptr (winptr window))) - (if relative - (let ((pos-y (car (cursor-position window))) - (pos-x (cadr (cursor-position window)))) - (%wmove winptr (+ pos-y y) (+ pos-x x))) - (%wmove winptr y x)))) - -(defun move-direction (window direction &optional (n 1)) - "Move cursor in the given direction by n cells." - (case direction - (:left (move window 0 (* n -1) :relative t)) - (:right (move window 0 (* n 1) :relative t)) - (:up (move window (* n -1) 0 :relative t)) - (:down (move window (* n 1) 0 :relative t)) - (otherwise (error "Valid cursor movement directions: :left, :right, :up, :down")))) - -(defun move-window (window y x &key relative) - "Move top left corner of the window to row y and column x. - -If relative is t, move the window by y rows and x columns." - (let ((winptr (winptr window))) - (if relative - (let ((pos-y (car (location window))) - (pos-x (cadr (location window)))) - (%mvwin winptr (+ pos-y y) (+ pos-x x))) - (%mvwin winptr y x)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/opaque.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/opaque.lisp deleted file mode 100644 index 281cb55..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/opaque.lisp +++ /dev/null @@ -1,118 +0,0 @@ -(in-package :croatoan) - -;;; opaque -;;; curses window properties -;;; http://invisible-island.net/ncurses/man/curs_opaque.3x.html - -;;; C prototypes - -;; bool is_cleared(const WINDOW *win); -;; bool is_idcok(const WINDOW *win); -;; bool is_idlok(const WINDOW *win); -;; bool is_immedok(const WINDOW *win); -;; bool is_keypad(const WINDOW *win); -;; bool is_leaveok(const WINDOW *win); -;; bool is_nodelay(const WINDOW *win); -;; bool is_notimeout(const WINDOW *win); -;; bool is_pad(const WINDOW *win); -;; bool is_scrollok(const WINDOW *win); -;; bool is_subwin(const WINDOW *win); -;; bool is_syncok(const WINDOW *win); -;; WINDOW *wgetparent(const WINDOW *win); -;; int wgetscrreg(const WINDOW *win, int *top, int *bottom); - -;;; Low-level C functions - -(defcfun ("is_cleared" %is_cleared) :boolean (win window)) -(defcfun ("is_idcok" %is_idcok) :boolean (win window)) -(defcfun ("is_idlok" %is_idlok) :boolean (win window)) -(defcfun ("is_immedok" %is_immedok) :boolean (win window)) -(defcfun ("is_keypad" %is_keypad) :boolean (win window)) -(defcfun ("is_leaveok" %is_leaveok) :boolean (win window)) -(defcfun ("is_nodelay" %is_nodelay) :boolean (win window)) -(defcfun ("is_notimeout" %is_notimeout) :boolean (win window)) -(defcfun ("is_pad" %is_pad) :boolean (win window)) -(defcfun ("is_scrollok" %is_scrollok) :boolean (win window)) -(defcfun ("is_subwin" %is_subwin) :boolean (win window)) -(defcfun ("is_syncok" %is_syncok) :boolean (win window)) - -(defcfun ("wgetparent" %wgetparent) window (win window)) -(defcfun ("wgetscrreg" %wgetscrreg) :int (win window) (top (:pointer :int)) (bottom (:pointer :int))) - -;;; High-level Lisp wrappers - -(defun redraw-on-clear-p (window) - "If t, the next refresh will redraw the screen from scratch." - (%is_cleared window)) - -(defun insert-delete-char-p (window) - "If t, the hardware insert/delete char feature of a terminal will be used, if the terminal supports it." - (%is_idcok window)) - -(defun insert-delete-line-p (window) - "If t, the hardware insert/delete line feature of a terminal will be used, if the terminal supports it." - (is_idlok window)) - -(defun immediately-refresh-p (window) - "If t, any change to a window will automatically call refresh." - (%is_immedok window)) - -(defun function-keys-p (window) - "If t, function keys will be recognized when returned by get-char." - (%is_keypad window)) - -(defun leave-cursor-on-refresh-p (window) - "If t, don't move the cursor back to the position before refresh." - (%is_leaveok window)) - -;; Vorsicht: we don't use %nodelay for blocking settings. But maybe it still works somehow. -(defun input-blocking-p (window) - "If t, reading is blocking." - (not (%is_nodelay window))) - -;; Hint: doesnt seem to work. -(defun escape-sequence-delay (window) - "If t, do not set a delay after the escape key." - (%is_notimeout window)) - -(defun pad-p (window) - "If t, the window is a pad." - (%is_pad window)) - -(defun enable-scrolling-p (window) - "If t, scrolling is enabled." - (%is_scrollok window)) - -(defun subwindow-p (window) - "If t, the window is a subwindow." - (%is_subwin window)) - -(defun touch-parent-windows-p (window) - "If t, areas in parent windows will be touched when window is changed." - (%is_syncok window)) - -(defun get-parent-window (window) - "If window is a subwindow, return its parent window." - (%wgetparent window)) - -(defun get-scrolling-region (window) - "Return a cons pair with the top and bottom margin of the scrolling region." - (let ((t-ptr (foreign-alloc :int)) - (b-ptr (foreign-alloc :int))) - ;; populate the pointers with values. - (%wgetscrreg window t-ptr b-ptr) - ;; dereference the int pointers. - (let ((top (mem-ref t-ptr :int)) - (bottom (mem-ref t-ptr :int))) - ;; free the allocated memory. - (foreign-free t-ptr) - (foreign-free b-ptr) - ;; return two color integers as a cons pair. - (cons top bottom)))) - -;;; TODOs - -;;; NOTES - -;; These functions which return properties set in the WINDOW -;; structure, allowing it to be compiled as opaque. \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/outopts.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/outopts.lisp deleted file mode 100644 index 44dda46..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/outopts.lisp +++ /dev/null @@ -1,57 +0,0 @@ -(in-package :croatoan) - -;;; High-level Lisp wrappers - -;; old bindings not yet replaced, deprecated, not exported, not loaded, do not use. - -;; all defaults are FALSE - -(defun redraw-on-clear (window flag) - "If flag is t, when refresh is called after clear, it will redraw the screen from scratch." - (%clearok window flag)) -;; for now, to use clearok with curscr, use %clearok directly. - -(defun insert-delete-line (window flag) - "If flag is t, use the hardware insert/delete line feature of a terminal, if the terminal supports it. - -It is disabled by default." - (%idlok window flag)) - -(defun insert-delete-char (window flag) - "If flag is t, use the hardware insert/delete char feature of a terminal, if the terminal supports it. - -It is enabled by default." - (%idcok window flag)) - -(defun immediately-refresh (window flag) - "If flag is t, any change to a window will automatically call refresh. - -It is disabled by default, since it can degrade performance." - (%immedok window flag)) - -(defun leave-cursor-on-refresh (window flag) - "If flag is t, don't move the cursor back to the position before refresh. - -It is disabled by default." - (%leaveok window flag)) - -(defun enable-scrolling (window flag) - "Enables and disables window scrolling. - -If flag is t, when the curses moves below the bottom line of a window -or scrolling region, the window/region is scrolled. - -If flag is nil, the cursor is left on the bottom line." - (%scrollok window flag)) - -(defun set-scrolling-region (window top-margin bottom-margin) - "Set the margins of a scrolling region for a window if scrolling is enabled for that window." - (%wsetscrreg window top-margin bottom-margin)) - -(defun newline-translation (flag) - "If status is t, enable translation of RET to NL on input, and NL to RET and LF on output. - -It is enabled by default." - (if flag - (%nl) - (%nonl))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/package.lisp deleted file mode 100644 index aa91a7d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/package.lisp +++ /dev/null @@ -1,321 +0,0 @@ -(defpackage #:de.anvi.croatoan - (:documentation "High-level Lisp interface to the basic CFFI Ncurses API.") - (:use #:common-lisp #:cffi #:de.anvi.ncurses #:trivial-gray-streams) - (:shadow callback) - (:nicknames #:croatoan #:crt) - (:export - - ;; croatoan.lisp - with-screen - with-window - with-windows - event-case - keymap - define-keymap - find-keymap - run-event-loop - exit-event-loop - bind - unbind - save-excursion - - ;; classes - complex-char - complex-string - window - screen - sub-window - decorated-window - menu - checklist - menu-window - menu-item - dialog-window - pad - sub-pad - field - form - form-window - button - label - checkbox - shape - - ;; accessors - simple-char - attributes - color-pair - default-color-pair - fgcolor - bgcolor - complex-char-array - width - height - location - location-y - location-x - cursor-position - cursor-position-y - cursor-position-x - draw-border-p - stackedp - visiblep - winptr - input-blocking - frame-rate - function-keys-enabled-p - scrolling-enabled-p - scrolling-region - insert-mode-p - bindings - background - input-echoing-p - input-buffering-p - process-control-chars-p - newline-translation-enabled-p - cursor-visible-p - source-location - - ;; Predicates - closed-p - complex-char= - - ;; menu - items - menu-type - menu-location - current-item-number - current-item - current-item-mark - cyclic-selection-p - max-item-length - name - value - message-pad - message-text - message-height - message-pad-coordinates - menu-map - - ;; form - buffer - elements - style - max-buffer-length - callback - title - find-element - field-map - form-map - button-map - accept - cancel - reset-field - reset-form - checkedp - - ;; queue - submit - process - queue - job-error - enqueue - dequeue - - ;; shape - origin-x - origin-y - coordinates - plot-char - - ;; addch / add a character (with attributes) to a curses window, then advance the cursor - add - add-char - echo - echo-char - new-line - acs - wacs - - ;; add_wch / add a wide complex character to a curses window, then advance the cursor - add-wide-char - add-wide-char-utf-8 - echo-wide-char - - ;; addstr / add a string of characters to a curses window and advance cursor - add-string - - ;; attr / curses character and window attribute control routines - *ansi-color-list* - convert-char - change-attributes - add-attributes - remove-attributes - - ;; beep / curses bell and screen flash routines - alert - - ;; bkgd / curses window background manipulation routines - - ;; border / create curses borders, horizontal and vertical lines - box - draw-border - - ;; border_set / create curses borders or lines using complex characters and renditions - draw-wide-border - - ;; clear / clear all or part of a curses window - clear - - ;; color / curses color manipulation routines - - ;; default_colors / use terminal's default colors - use-terminal-colors-p - - ;; define_key / define a keycode - - ;; delch / delete character under the cursor in a curses window - delete-char - - ;; deleteln / delete and insert lines in a curses window - delete-line - insert-line - - ;; form / curses extension for programming forms - remove-nth - replace-nth - insert-nth - edit - field-buffer-to-string - - ;; getch / get (or push back) characters from curses terminal keyboard - get-char - unget-char - key-supported-p - function-key - function-key-p - key-pressed-p - get-event - - ;; get_wch / get (or push back) a wide (multi-byte) character from curses terminal keyboard - get-wide-char - get-wide-event - - ;; getstr / accept character strings from curses terminal keyboard - get-string - - ;; getyx / get curses cursor and window coordinates - - ;; inch / get a character and attributes from a curses window - extract-char - - ;; in_wch / extract a wide character and rendition from a window - extract-wide-char - - ;; insch / insert a character before cursor in a curses window - insert - insert-char - - ;; ins_wch / insert a complex character and rendition into a window - insert-wide-char - - ;; instr / get a string of characters from a curses window - extract-string - - ;; inwstr / get a string of wide (multi-byte) characters from a curses window - extract-wide-string - - ;; inchstr / get a string of characters (and attributes) from a curses window - extract-complex-string - - ;; insstr / insert string before cursor in a curses window - insert-string - - ;; initscr / Screen initialization and manipulation routines - end-screen - - ;; inopts / Input options. - - ;; kernel / low-level curses routines - - ;; keybound / return definition of keycode - - ;; key_defined / check if a keycode is defined - - ;; legacy / get curses cursor and window coordinates, attributes - - ;; legacy_coding - - ;; menu / curses extension for programming menus - draw-menu - update-menu - select - return-from-menu - exit-menu-event-loop - accept-selection - update-redraw-menu - toggle-item-checkbox - - ;; mouse / mouse interface through curses - set-mouse-event - get-mouse-event - - ;; move / move curses window cursor - move - move-direction - move-window - - ;; opaque / curses window properties - - ;; outopts / curses output options - - ;; pad / create and display curses pads - - ;; panel / panel stack extension for curses - raise - raise-to-top - lower - lower-to-bottom - empty-stack - refresh-stack - - ;; refresh / refresh curses windows and lines - refresh - refresh-marked - mark-for-refresh - mark-for-redraw - - ;; resizeterm / change the curses terminal size - - ;; scroll / scroll a curses window - - ;; shape / shape plotting extension for ncurses - draw-shape - shape-extent - merge-shapes - fill-shape - line - angle-line - polygon - triangle - quadrilateral - rectangle - circle - - ;; slk / curses soft label routines - - ;; termattrs / environment query routines - - ;; touch / curses refresh control routines - touch - - ;; util / miscellaneous curses utility routines - - ;; variables / curses global variables - - ;; window / create curses windows - - ;; wresize / resize a curses window - resize - - )) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/panel.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/panel.lisp deleted file mode 100644 index 2683c15..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/panel.lisp +++ /dev/null @@ -1,54 +0,0 @@ -(in-package :de.anvi.croatoan) - -;; panel -;; panel stack extension for curses -;; http://invisible-island.net/ncurses/man/panel.3x.html - -;; defined in source/classes.lisp -;; (defparameter *window-stack* nil) - -(defun raise (win) - "Raise window one position in the stack." - (when (not (eq win (car *window-stack*))) - (let ((pos (position win *window-stack*))) - (rotatef (nth (1- pos) *window-stack*) - (nth pos *window-stack*))))) - -(defun raise-to-top (win) - "Raise window to the top of the window stack." - (setf *window-stack* (cons win (remove win *window-stack*)))) - -(defun lower (win) - "Lower window one position in the stack." - (when (not (eq win (car (last *window-stack*)))) - (let ((pos (position win *window-stack*))) - (rotatef (nth (1+ pos) *window-stack*) - (nth pos *window-stack*))))) - -(defun lower-to-bottom (win) - "Lower window to the bottom of the window stack." - (when (not (eq win (car (last *window-stack*)))) - (setf *window-stack* (append (remove win *window-stack*) (list win))))) - -(defun empty-stack () - "Remove all windows from the stack." - (setf *window-stack* nil)) - -(defun refresh-stack () - "Touch and refresh visible windows in the window stack." - (if *window-stack* - (progn - (mapc #'(lambda (w) - (when (visiblep w) - (touch w) - (mark-for-refresh w))) - (reverse *window-stack*)) - (refresh-marked)) - (error "refresh stack: stack empty"))) - -;; https://www.informatimago.com/develop/lisp/l99/p19.lisp -;; todo: what if count is longer than a list? use mod -(defun rotate (list count) - (if (minusp count) - (rotate list (+ (length list) count)) - (nconc (subseq list count) (subseq list 0 count)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/queue.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/queue.lisp deleted file mode 100644 index ec2ebf0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/queue.lisp +++ /dev/null @@ -1,107 +0,0 @@ -(in-package :de.anvi.croatoan) - -;; queue -;; support for cross-thread evaluation -;; authors: d4ryus , -;; Anton Vidovic - -(defclass queue () - ((head - :documentation "Pointer to the first cons of the elements list.") - (tail - :documentation "Pointer to the last cons of the elements list.") - (lock - :documentation "A mutex that ensures thread-safe access to the queue from multiple threads.")) - (:documentation "A thread-safe FIFO queue.")) - -(defmethod initialize-instance :after ((queue queue) &key) - (with-slots (head tail lock) queue - (setf head (cons nil nil) - tail (last head) - lock (bt:make-lock)))) - -(define-condition job-error (error) - ((form - :initarg :form - :initform (error "Form required") - :documentation "The form that failed to execute") - - (error - :initarg :error - :initform (error "Error required") - :documentation "The error that was signaled when form was executed"))) - -(defmethod print-object ((obj queue) stream) - (with-slots (head lock) obj - (bt:with-lock-held (lock) - (print-unreadable-object (obj stream :type t) - (format stream "~:[~;~:*~a~]" (cdr head)))))) - -(defmethod print-object ((obj job-error) stream) - (print-unreadable-object (obj stream :type t :identity t) - (with-slots (form error) obj - (format stream "form: ~a ~_error: ~a" form error)))) - -(defun enqueue (item queue) - "Push a new item onto the tail of the queue, return the new item." - (with-slots (tail lock) queue - (bt:with-lock-held (lock) - (car (setf tail (cdr (rplacd tail (list item)))))))) - -(defun dequeue (queue) - "Pop of the first element of queue and return it, returns NIL when queue is empty" - (with-slots (head lock) queue - (bt:with-lock-held (lock) - (when (cdr head) - (car (setf head (cdr head))))))) - -(defparameter *job-queue* (make-instance 'queue) - "A queue of functions (consed to their form for debugging purposes) -to be processed by the main thread to interface with ncurses.") - -(defmacro submit (&body body) - "Submit BODY from a producer thread to a job queue to be processed by the main thread. - -The main thread should be the only one interfacing ncurses directly, -and should be running in a terminal. - -SUBMIT uses a thread-safe FIFO queue to queue up jobs which should be -evaluated inside the terminal thread. - -For this to work PROCESS has to be called from inside the terminal -thread to pop requests from the FIFO queue and evaluate them. - -When a condition is signaled while the body of SUBMIT is evaluated, it -is handled by PROCESS and put inside a JOB-ERROR which also contains -the failed form. - -The condition is then signaled again from within a restart which -allows skipping the failed form and continue evaluating requests. - -In practice, this allows for calls to ncurses forms from SLIME to be -performed without IO glitches that tend to occur when ncurses code is -called from the SLIME repl thread directly." - `(enqueue - (cons (lambda () ,@body) - ;; the failed form is included for debugging. - ',body) - *job-queue*)) - -(defun process () - "Process the contents of the job queue in the current thread, then exit. - -Process should be called from the main thread, which should be the only thread -interfacing ncurses directly, and should be running in a terminal." - (loop :for (fn . form) := (dequeue *job-queue*) - :while fn - ;; We want to be able to see what form failed, for this we - ;; need to wrap the signaled condition in a job-error - ;; which contains the failed form and the signaled condition. - :do (handler-case (funcall fn) - (error (e) - (restart-case (error 'job-error - :form form - :error e) - (skip-job-form () - :report (lambda (stream) - (format stream "Skip job form")))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/refresh.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/refresh.lisp deleted file mode 100644 index f6b9d9d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/refresh.lisp +++ /dev/null @@ -1,56 +0,0 @@ -(in-package :de.anvi.croatoan) - -;; refresh windows _and_ pads -(defun refresh (win &optional pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x) - "Redisplay the window after changes have been made to it. - -Copies a window to the virtual screen, then updates the visible -physical screen by the contents of the virtual screen. - -Only updates the changed parts of the window. In order to redraw the -whole window, it has to be explicitely touched or marked for redraw." - (let ((winptr (winptr win))) - ;; typease whether window or pad - ;; if window, signal error if any parameters are provided. - ;; if pad, signal error if not all parameters are provided. - ;; typecase uses type-of or typep internally. - ;; if typep, a pad will be recognized as a window, since it is a subclass. - ;; the pad type has to be checked first. - (typecase win - (pad (progn - ;; all 6 arguments have to be given, we dont have default arguments. - (unless (and pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x) - (error "One of the arguments for pad refreshing is missing.")) - (%prefresh winptr pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x))) - (window (%wrefresh winptr))))) - -;; call refresh-marked after this. -(defun mark-for-refresh (win &optional pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x) - "Mark a window for a later batch-refresh. - -Copy a window to the virtual screen, but do not display it on the -visible physical screen. Call batch-refresh to display all marked -refreshes." - (let ((winptr (winptr win))) - ;; typecase uses typep internally, so pad has to be checked first because it is a subclass of window. - (typecase win - (pad (progn - (unless (and pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x) - (error "One of the arguments for pad refreshing is missing.")) - (%prefresh winptr pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x))) - (window (%wnoutrefresh winptr))))) - -;; call this after several windows have been marked for refresh. -(defun refresh-marked () - "Refresh windows marked for refresh." - (%doupdate)) - -;; does not redraw, only marks for redrawing by refresh. -;; It assumes that the display on the terminal has been corrupted. -;; It is unclear how redrawwin differs from touchwin. -(defun mark-for-redraw (window &key first-line no-of-lines) - "Mark a whole window or a number of lines to be completely redrawn on the next refresh." - (let ((winptr (winptr window))) - (if (and first-line no-of-lines) - (%wredrawln winptr first-line no-of-lines) - (%redrawwin winptr)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/resizeterm.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/resizeterm.lisp deleted file mode 100644 index 0fbd859..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/resizeterm.lisp +++ /dev/null @@ -1,41 +0,0 @@ -(in-package :croatoan) - -;;; resizeterm -;;; change the curses terminal size -;;; http://invisible-island.net/ncurses/man/resizeterm.3x.html - -;;; C prototypes - -;; bool is_term_resized(int lines, int columns); -;; int resize_term(int lines, int columns); -;; int resizeterm(int lines, int columns); - -;;; Low-level C functions - -(defcfun ("is_term_resized" %is-term-resized) :boolean (lines :int) (columns :int)) -(defcfun ("resize_term" %resize-term) :int (lines :int) (columns :int)) -(defcfun ("resizeterm" %is-term-resized) :int (lines :int) (columns :int)) - -;;; High-level Lisp wrappers - -(defun terminal-resized-p (height width) - "Returns t if resize-terminal would modify a window, and nil otherwise." - (%is-term-resized height width)) - -(defun resize-terminal (height width &key use-sigwinch-handler) - "Resizes the current window to the specified dimensions. - -The function attempts to resize all windows. The areas that are -extended are filled with blanks. - -It is not possible to resize pads without additional interaction with -the application. - -If use-sigwinch-handler is t, add bookkeeping for the SIGWINCH -handler." - (if use-sigwinch-handler - (%resizeterm height width) - (%resize-term height width))) - -;;; TODOs - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/scroll.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/scroll.lisp deleted file mode 100644 index 372f6cb..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/scroll.lisp +++ /dev/null @@ -1,30 +0,0 @@ -(in-package :croatoan) - -;;; scroll -;;; scroll a curses window -;;; http://invisible-island.net/ncurses/man/curs_scroll.3x.html - -;;; C prototypes - -;; int scroll(WINDOW *win); -;; int scrl(int n); -;; int wscrl(WINDOW *win, int n); - -;;; Low-level C functions - -(defcfun ("scroll" %scroll) :int (win window)) -(defcfun ("scrl" %scrl) :int (n :int)) -(defcfun ("wscrl" %wscrl) :int (win window) (n :int)) - -;;; High-level Lisp wrappers - -(defun scroll (window &optional (n 1)) - "Scroll the window for n lines. - -If n is positive, scroll the window down. If n is negative, scroll the -window up. The cursor position is not changed." - (%wscrl n)) - -;;; TODOs - -;; [ ] what about return values? diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/shape.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/shape.lisp deleted file mode 100644 index 177a7a6..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/shape.lisp +++ /dev/null @@ -1,193 +0,0 @@ -(in-package :de.anvi.croatoan) - -;; shapes -;; curses extension for plotting shapes -;; author: Daniel Vedder - -(defclass shape () - (;; TODO: merge -x and -y into one location in form of a list to correspond to the position/location slot of other elements. - (origin-x - :initform 0 - :initarg :x0 - :type integer - :accessor origin-x - :documentation "The x coordinate of this shape's point of origin.") - - (origin-y - :initform 0 - :initarg :y0 - :type integer - :accessor origin-y - :documentation "The y coordinate of this shape's point of origin.") - - ;; Coordinates are stored as '(y x) pairs (note the order!) - (coordinates - :initform nil - :type (or null cons) - :accessor coordinates - :documentation "A list of coordinates relative to the origin that form this shape.") - - (plot-char - :initform (make-instance 'complex-char :simple-char #\X :color-pair '(:white :black) :attributes nil) - :initarg :char - :type (or null character keyword complex-char) - :accessor plot-char - :documentation "The character to use for plotting.")) - - (:documentation "A shape is a list of coordinates, relative to an origin, that can be plotted in a window.")) - -;;; General shape methods - -(defun shape-extent (shape) - "Return min-y, min-x, max-y, and max-x of a shape's coordinates as multiple values." - (let ((y-vals (mapcar #'first (coordinates shape))) - (x-vals (mapcar #'second (coordinates shape)))) - (values (apply #'min y-vals) (apply #'min x-vals) - (apply #'max y-vals) (apply #'max x-vals)))) - -(defun fill-shape (shape) - "Take a shape that only shows the borders and 'color it out'." - ;; Every point inside a shape has, on the same axis, a point larger and one smaller than itself. - (flet ((inside-p (pt shape) - (and (member pt (coordinates shape) - :test #'(lambda (p c) (and (= (first p) (first c)) - (> (second p) (second c))))) - (member pt (coordinates shape) - :test #'(lambda (p c) (and (= (first p) (first c)) - (< (second p) (second c))))) - (member pt (coordinates shape) - :test #'(lambda (p c) (and (= (second p) (second c)) - (> (first p) (first c))))) - (member pt (coordinates shape) - :test #'(lambda (p c) (and (= (second p) (second c)) - (< (first p) (first c)))))))) - ;; Iterate over the rectangle that encloses the shape, adding any - ;; points inside the shape's borders to its coordinates - (do* ((extent (multiple-value-list (shape-extent shape))) - (min-y (first extent)) (min-x (second extent)) - (max-y (third extent)) (max-x (fourth extent)) - (y min-y (1+ y))) - ((> y max-y) shape) - (do ((x min-x (1+ x))) - ((> x max-x)) - (when (inside-p (list y x) shape) - (setf (coordinates shape) - (append (coordinates shape) (list (list y x))))))))) - -(defun merge-shapes (&rest shapes) - "Create a new shape object by merging the coordinates of a given list of shapes." - ;; This keeps the first shape's point of origin and plot-char. - ;; A completely new object is created and new lists consed up. - (let ((shp (make-instance 'shape - :char (plot-char (first shapes)) - :y0 (origin-y (first shapes)) - :x0 (origin-x (first shapes))))) - (dolist (s shapes shp) - (dolist (c (coordinates s)) - (unless (member c (coordinates shp) :test #'equal) - (setf (coordinates shp) - (append (coordinates shp) - (list (list (first c) (second c)))))))))) - -;;; Create various basic shapes - -(defun line (y0 x0 y1 x1 &key char) - "Return a straight line between two points" - ;;make sure we're moving from left to right - (let (zx zy) - (when (or (> x0 x1) (and (= x0 x1) (> y0 y1))) - (setf zx x1 zy y1) - (setf x1 x0 y1 y0) - (setf x0 zx y0 zy))) - ;;increment x from x0 to x1, building a list of coordinates as we go - (do* ((l (make-instance 'shape)) (coords nil) - (slope (if (= x0 x1) (abs (- y0 y1)) ;;prevent division-by-zero - (/ (- y1 y0) (- x1 x0)))) - (x 0 (1+ x)) (y (round (* x slope)) (round (* x slope)))) - ((< x1 (+ x0 x)) ;;finalise the shape object and return it - (setf (coordinates l) coords) - (when char (setf (plot-char l) char)) - l) - ;;for each x value, figure out how many characters we need to print - ;; in the y direction (depends on the slope gradient) - (do* ((next-x (+ x0 x)) (dy 0 (1+ dy)) - (next-y (+ y0 y (if (plusp slope) dy (* -1 dy))) - (+ y0 y (if (plusp slope) dy (* -1 dy))))) - ;;stop when we have stacked sufficient vertical coordinates - ((or (and (>= 1 (abs slope)) (= dy 1)) ;;shallow slopes - (and (< 1 (abs slope)) (= dy (ceiling (abs slope)))) ;;steep - (if (plusp slope) ;;don't overshoot the end - (or (> next-y y1) (> next-x x1)) - (or (< next-y y1) (> next-x x1))))) - ;;append the next pair of coordinates - (setf coords (append coords (list (list next-y next-x))))))) - -(defun angle-line (y0 x0 theta length &key char) - "Draw a line of the given length in the bearing theta from the origin." - ;; theta = 0 -> vertically up; theta = 90 -> horizontally right - (let* ((radians (* pi (/ (- theta 90) 180.0))) - (y1 (+ y0 (* length (sin radians)))) - (x1 (+ x0 (* length (cos radians))))) - (line y0 x0 (round y1) (round x1) :char char))) - -(defun polygon (corners &key filled char) - "Return a polygon along a list of corners, optionally filled" - (do* ((pol (make-instance 'shape)) - (i 0 (1+ i)) (j (1+ i) (1+ i))) - ((= i (length corners)) - (when char (setf (plot-char pol) char)) - (if filled (fill-shape pol) pol)) - (when (= j (length corners)) (setf j 0)) - (setf pol (merge-shapes pol - (line (first (nth i corners)) (second (nth i corners)) - (first (nth j corners)) (second (nth j corners)) - :char char))))) - -(defun triangle (y0 x0 y1 x1 y2 x2 &key filled char) - "Return a triangle (utility wrapper around `polygon')." - (polygon (list (list y0 x0) (list y1 x1) (list y2 x2)) - :filled filled :char char)) - -(defun quadrilateral (y0 x0 y1 x1 y2 x2 y3 x3 &key filled char) - "Return a quadrilateral (utility wrapper around `polygon')." - (polygon (list (list y0 x0) (list y1 x1) (list y2 x2) (list y3 x3)) - :filled filled :char char)) - -(defun rectangle (y0 x0 height width &key filled char) - "Return a rectangle (utility wrapper around `polygon')." - (polygon (list (list y0 x0) (list y0 (+ x0 (1- width))) - (list (+ y0 (1- height)) (+ x0 (1- width))) - (list (+ y0 (1- height)) x0)) - :filled filled :char char)) - -(defun circle (y0 x0 radius &key filled char) - "Return a circle with a given radius, optionally filled." - (do* ((shp (make-instance 'shape)) (coords nil) (deg 0 (1+ deg)) - (radians (* pi (/ deg 180.0)) (* pi (/ deg 180.0))) - (y (+ y0 (round (* radius (sin radians)))) - (+ y0 (round (* radius (sin radians))))) - (x (+ x0 (round (* radius (cos radians)))) - (+ x0 (round (* radius (cos radians))))) - (last-coord nil coord) (coord (list y x) (list y x))) - ((= deg 360) - (setf (coordinates shp) coords) - (when char (setf (plot-char shp) char)) - (if filled (fill-shape shp) shp)) - (unless (equal coord last-coord) - (setf coords (append coords (list coord)))))) - -;;; Integrate shapes with the rest of croatoan - -(defun draw-shape (window shape &optional squarify) - "Draw a shape in the given window." - ;; If squarify is on, draw-shape doubles the width of the shape to compensate - ;; for the fact that terminal fonts are higher than they are wide - (do* ((y0 (origin-y shape)) (x0 (origin-x shape)) (c (plot-char shape)) - (coords (coordinates shape) (cdr coords)) - (y (first (car coords)) (first (car coords))) - (x (second (car coords)) (second (car coords)))) - ((null coords)) - (setf y (+ y0 y) x (+ x0 x)) - (when squarify (setf x (* 2 x))) - (unless (or (minusp y) (minusp x) (>= y (height window)) (>= x (width window))) - (add window (simple-char c) :y y :x x :attributes (attributes c) :color-pair (color-pair c))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/slk.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/slk.lisp deleted file mode 100644 index c657fbd..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/slk.lisp +++ /dev/null @@ -1,53 +0,0 @@ -(in-package :croatoan) - -;;; slk -;;; curses soft label routines -;;; http://invisible-island.net/ncurses/man/curs_slk.3x.html - -;;; C prototypes - -;; int slk_init(int fmt); -;; int slk_set(int labnum, const char *label, int fmt); -;; int slk_refresh(void); -;; int slk_noutrefresh(void); -;; char *slk_label(int labnum); -;; int slk_clear(void); -;; int slk_restore(void); -;; int slk_touch(void); -;; int slk_attron(const chtype attrs); -;; int slk_attroff(const chtype attrs); -;; int slk_attrset(const chtype attrs); -;; int slk_attr_on(attr_t attrs, void *opts); -;; int slk_attr_off(const attr_t attrs, void *opts); -;; int slk_attr_set(const attr_t attrs, short color_pair, void *opts); -;; attr_t slk_attr(void); -;; int slk_color(short color_pair); -;; int slk_wset(int labnum, const wchar_t *label, int fmt); - -;;; Low-level C functions - -(defcfun ("slk_init" %slk-init) :int (fmt :int)) -(defcfun ("slk_set" %slk-set) :int (labnum :int) (label :string) (fmt :int)) -(defcfun ("slk_refresh" %slk-refresh) :int) -(defcfun ("slk_noutrefresh" %slk-noutrefresh) :int) -(defcfun ("slk_label" %slk-label) :string (labnum :int)) -(defcfun ("slk_clear" %slk-clear) :int) -(defcfun ("slk_restore" %slk-restore) :int) -(defcfun ("slk_touch" %slk-touch) :int) - -(defcfun ("slk_attron" %slk-attron) :int (attrs chtype)) -(defcfun ("slk_attroff" %slk-attroff) :int (attrs chtype)) -(defcfun ("slk_attrset" %slk-attrset) :int (attrs chtype)) - -(defcfun ("slk_attr_on" %slk-attr-on) :int (attrs attr) (opts (:pointer :void))) -(defcfun ("slk_attr_off" %slk-attr-off) :int (attrs attr) (opts (:pointer :void))) -(defcfun ("slk_attr_set" %slk-attr-set) :int (attrs attr) (color-pair :short) (opts (:pointer :void))) - -(defcfun ("slk_attr" %slk-attr) attr) -(defcfun ("slk_color" %slk-color) :int (color-pair :short)) - -;;; High-level Lisp wrappers - -;;; NOTES - -;;; TODOs diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/termattrs.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/termattrs.lisp deleted file mode 100644 index 929fd30..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/termattrs.lisp +++ /dev/null @@ -1,37 +0,0 @@ -(in-package :croatoan) - -;;; termattrs -;;; environment query routines -;;; http://invisible-island.net/ncurses/man/curs_termattrs.3x.html - -;;; C prototypes - -;; int baudrate(void); -;; char erasechar(void); -;; int erasewchar(wchar_t *ch); -;; bool has_ic(void); -;; bool has_il(void); -;; char killchar(void); -;; int killwchar(wchar_t *ch); -;; char *longname(void); -;; attr_t term_attrs(void); -;; chtype termattrs(void); -;; char *termname(void); - -;;; Low-level C functions - -(defcfun ("baudrate" %baudrate) :void) -(defcfun ("erasechar" %erasechar) :char) -(defcfun ("has_ic" %has_ic) :boolean) -(defcfun ("has_il" %has_il) :boolean) -(defcfun ("killchar" %killchar) :char) -(defcfun ("longname" %longname) :string) -(defcfun ("term_attrs" %term-attrs) attr) -(defcfun ("termattrs" %termattrs) chtype) -(defcfun ("termname" %termname) :string) - -;;; High-level Lisp wrappers - -;;; NOTES - -;;; TODOs diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/touch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/touch.lisp deleted file mode 100644 index 2d9314e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/touch.lisp +++ /dev/null @@ -1,13 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun touch (window) - "Make the next call to refresh rewrite whe whole window by marking the whole window as changed. - -Makes it possible to raise unchanged overlapping windows by refreshing." - (let ((winptr (winptr window))) - (%touchwin winptr))) - -;;; TODOs - -;; [ ] Return values, errors. -;; [ ] Difference to redrawwin. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/utf8.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/utf8.lisp deleted file mode 100644 index f883f2f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/utf8.lisp +++ /dev/null @@ -1,350 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun ascii-byte-p (octet) - "Return t if octet is a single-byte 7-bit ASCII char. - -The most significant bit is 0, so the allowed pattern is 0xxx xxxx." - (assert (typep octet 'integer)) - (assert (<= (integer-length octet) 8)) - (let ((bitmask #b10000000) - (template #b00000000)) - ;; bitwise and the with the bitmask #b11000000 to extract the first two bits. - ;; check if the first two bits are equal to the template #b10000000. - (= (logand bitmask octet) template))) - -(defun multi-byte-p (octet) - "Return t if octet is a part of a multi-byte UTF-8 sequence. - -The multibyte pattern is 1xxx xxxx. - -A multi-byte can be either a lead byte or a trail byte." - (assert (typep octet 'integer)) - (assert (<= (integer-length octet) 8)) - (let ((bitmask #b10000000) - (template #b10000000)) - ;; bitwise and the with the bitmask #b11000000 to extract the first two bits. - ;; check if the first two bits are equal to the template #b10000000. - (= (logand bitmask octet) template))) - -(defun lead-byte-p (octet) - "Return t if octet is one of the leading bytes of an UTF-8 sequence, nil otherwise. - -Allowed leading byte patterns are 0xxx xxxx, 110x xxxx, 1110 xxxx and 1111 0xxx." - (assert (typep octet 'integer)) - (assert (<= (integer-length octet) 8)) - (let ((bitmasks (list #b10000000 #b11100000 #b11110000 #b11111000)) - (templates (list #b00000000 #b11000000 #b11100000 #b11110000))) - (some #'(lambda (a b) (= (logand a octet) b)) bitmasks templates))) - -;; http://stackoverflow.com/questions/14380143/matching-binary-patterns-in-c -(defun n-trail-bytes (octet) - "Take a leading utf-8 byte, return the number of continuation bytes 1-3." - (assert (typep octet 'integer)) - (assert (<= (integer-length octet) 8)) - (let ((bitmasks (list #b10000000 #b11100000 #b11110000 #b11111000)) - (templates (list #b00000000 #b11000000 #b11100000 #b11110000))) - (loop for i from 0 to 3 - when (= (nth i templates) (logand (nth i bitmasks) octet)) - return i))) - -(defun trail-byte-p (octet) - "Return t if octet is the continuation byte of an UTF-8 sequence. - -The allowed continuation byte pattern is 10xx xxxx." - (assert (typep octet 'integer)) - (assert (<= (integer-length octet) 8)) - (let ((bitmask #b11000000) - (template #b10000000)) - ;; bitwise and the with the bitmask #b11000000 to extract the first two bits. - ;; check if the first two bits are equal to the template #b10000000. - (= (logand bitmask octet) template))) - -#| - -Lower Upper Binary -bound bound Pattern ----------------------------------------------------- -0x00000 0x00007F 0xxxxxxx -0x00080 0x0007FF 110xxxxx 10xxxxxx -0x00800 0x00FFFF 1110xxxx 10xxxxxx 10xxxxxx -0x10000 0x10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - -Unicode code points Range Encoding Binary value ------------------- -------- -------------------------- -U+000000-U+00007f 0xxxxxxx 0xxxxxxx - -U+000080-U+0007ff 110yyyxx 00000yyy xxxxxxxx - 10xxxxxx - -U+000800-U+00ffff 1110yyyy yyyyyyyy xxxxxxxx - 10yyyyxx - 10xxxxxx - -U+010000-U+10ffff 11110zzz 000zzzzz yyyyyyyy xxxxxxxx - 10zzyyyy - 10yyyyxx - 10xxxxxx -|# - -;; two helper functions from the internal to the external format. -;; inside the app, we use lisp chars, we only convert from utf-8 on input and -;; to utf-8 on output. - -(defun utf-8-to-unicode (byte-list) - "Take a list of one to four utf-8 encoded bytes (octets), return a code point. - -Since this decoder will only used for reading keyboard input, the sequences are -not checked for illegal bytes. - -Since security is not considered, this decoder should not be used for anything -else." - (let ((b1 (car byte-list))) - (cond ((ascii-byte-p b1) b1) ; if a single byte, just return it. - ((multi-byte-p b1) - (if (lead-byte-p b1) - (let ((n (n-trail-bytes b1)) - ;; Content bits we want to extract from each lead byte. - (lead-templates (list #b01111111 #b00011111 #b00001111 #b00000111)) - ;; Content bits we want to extract from each trail byte. - (trail-template #b00111111)) - (if (= n (1- (list-length byte-list))) - ;; add lead byte - (+ (ash (logand (nth 0 byte-list) (nth n lead-templates)) (* 6 n)) - ;; and the trail bytes - (loop for i from 1 to n sum - (ash (logand (nth i byte-list) trail-template) (* 6 (- n i))))) - (error "calculated number of bytes doesnt match the length of the byte list"))) - (error "first byte in the list isnt a lead byte")))))) - -#| -(defun utf-8-to-unicode (byte-list) - "Take a list of one to four utf-8 encoded bytes (octets), return the shortest possible unicode code point." - (let ((b1 (car byte-list))) - (if (lead-byte-p b1) - (let ((n (n-trail-bytes b1))) - (if (= n (1- (list-length byte-list))) - - (case n - ;; if 0, we have simple ascii, so just get the char. - (0 b1) - ;; if 1, we have to convert 110yyyxx 10xxxxxx to 00000yyyxxxxxxxx - (1 (+ (ash (logand (nth 0 byte-list) #b00011111) 6) - (ash (logand (nth 1 byte-list) #b00111111) 0))) - ;; if 2, we have to convert 1110yyyy 10yyyyxx 10xxxxxx to yyyyyyyyxxxxxxxx - (2 (+ (ash (logand (nth 0 byte-list) #b00001111) 12) - (ash (logand (nth 1 byte-list) #b00111111) 6) - (ash (logand (nth 2 byte-list) #b00111111) 0))) - ;; if 3, we have to convert 11110zzz 10zzyyyy 10yyyyxx 10xxxxxx to 000zzzzz yyyyyyyy xxxxxxxx - (3 (+ (ash (logand (nth 0 byte-list) #b00000111) 18) - (ash (logand (nth 1 byte-list) #b00111111) 12) - (ash (logand (nth 2 byte-list) #b00111111) 6) - (ash (logand (nth 3 byte-list) #b00111111) 0)))) - - (error "calculated number of bytes doesnt match the length of the byte list"))) - (error "first byte in the list isnt a lead byte")))) -|# - -#| -;; we also can determine the number of required bytes by the bit-length of the code point. -(n-bits (integer-length int)) - (n-trail-bytes (cond ( (<= n-bits 7) 0) - ((and (> n-bits 7) (<= n-bits 11)) 1) - ((and (> n-bits 11) (<= n-bits 16)) 2) - ((and (> n-bits 16) (<= n-bits 21)) 3))) -|# - -;; we can also just print the char to a string, and output the string. -;; this is easier than utf-8 single char input. -(defun unicode-to-utf-8 (int) - "Take a unicode code point, return a list of one to four UTF-8 encoded bytes (octets)." - (assert (<= (integer-length int) 21)) - (let ((n-trail-bytes (cond ((<= #x00000 int #x00007F) 0) - ((<= #x00080 int #x0007FF) 1) - ((<= #x00800 int #x00FFFF) 2) - ((<= #x10000 int #x10FFFF) 3))) - (lead-templates (list #b00000000 #b11000000 #b11100000 #b11110000)) - (trail-template #b10000000) - ;; number of content bits in the lead byte. - (n-lead-bits (list 7 5 4 3)) - ;; number of content bits in the trail byte. - (n-trail-bits 6) - ;; list to put the UTF-8 encoded bytes in. - (byte-list nil)) - (if (= n-trail-bytes 0) - ;; if we need 0 trail bytes, ist just an ascii single byte. - (push int byte-list) - (progn - ;; if we need more than one byte, first fill the trail bytes with 6 bits each. - (loop for i from 0 to (1- n-trail-bytes) - do (push (+ trail-template - (ldb (byte n-trail-bits (* i n-trail-bits)) int)) - byte-list)) - ;; then copy the remaining content bytes to the lead byte. - (push (+ (nth n-trail-bytes lead-templates) - (ldb (byte (nth n-trail-bytes n-lead-bits) (* n-trail-bytes n-trail-bits)) int)) - byte-list))) - ;; return the list of UTF-8 encoded bytes. - byte-list)) - -#| - -;; %wgetch returns chars <255 and keycodes >255. -;; %wget_wch returns wide chars <255 and >255, and keycodes >255. -;; it also returns KEY_CODE_YES to designate that a >255 char is a keycode. -(defun get-char- (window &key y x) - "" - (let* ((winptr (winptr window)) - (byte-list nil) - ;; get the first byte - (b1 (%wgetch winptr))) - ;; -1 means "no event", >255 means function key. - ;; TODO: problem, when we return b1>255, how do we know that it is a function key and not a unicode code point?? - ;; we have to return function keywords _before_ we assemble a code point from utf-8. - ;; we have to merge get-char and get-event. - (when (= b1 -1) (return-from get-char- (values b1 nil))) - (when (> b1 255) (return-from get-char- (values b1 t))) - ;; normal 8-bit octets in the range 0-255. - (if (lead-byte-p b1) - (progn - (push b1 byte-list) - ;;(princ b1 window) - (let ((n (n-trail-bytes b1))) - (loop repeat n do - (let ((ch (%wgetch winptr))) - ;;(princ ch window) - (push ch byte-list))))) - (error "First byte isnt a lead byte.")) - ;;(princ (utf-8-to-unicode (reverse byte-list)) window) - (values (utf-8-to-unicode (reverse byte-list)) nil))) - -(defun get-event- (window) - (multiple-value-bind (code-point function-key-p) (get-char window) - (cond - ;; -1 means no key has been pressed. - ((= code-point -1) nil) - ;; 0-255 are regular chars, whch can be converted to lisp chars with code-char. - ((and (>= code-point 0) (not function-key-p)) (code-char code-point)) - ;; if the code belongs to a known function key, return a keyword symbol. - ((and (>= code-point 0) function-key-p) - (let ((ev (function-key code-point))) - (if (eq ev :mouse) - (multiple-value-bind (mev y x) (get-mouse-event) - (values mev y x)) ; returns 3 values, see mouse.lisp - ev))) - ;; todo: unknown codes, like mose, resize and unknown function keys. - (t (error "invalid value of char received from ncurses."))))) - -|# - -;; return t if the chosen unicode points are encoded and decoded correctly. -(defun test-utf-8 () - (let* ((unicodes-orig (list 65 246 1046 8364 119070)) - (unicodes-test (mapcar #'(lambda (x) (utf-8-to-unicode (unicode-to-utf-8 x))) - unicodes-orig))) - (mapcar #'(lambda (x) - (format t - "code point: ~A, character ~A, utf8 ~A, correct enc-dec ~A~%" - x - (code-char x) - (unicode-to-utf-8 x) - (= x (utf-8-to-unicode (unicode-to-utf-8 x))))) - unicodes-orig) - ;; return t if all are t - (every #'= unicodes-orig unicodes-test))) - -;; reading utf-8 chars from the keyboard works. -;; tested in t03. -;; to make t16c work too, we have to similarly be able to extract utf-8 from a window. -;; characters are saved by ncurses as wchar_t or wint_t. - -;; instead of get-char, use read-byte and gray streams - -;; part 2 will be correctly implementing get_wch und winwch. -;; then we do not need utf-8 conversion. - -;; read one (first) char from the stream -;; check how many chars we have to read if it is an utf8 char -;; read additional n (0-3) octets. -;; combine 1-4 octets into one lisp utf-8 char and return that char. - -;; all bytes here are octets. - -#| -(defun get-utf-8-char (byte-list) - "Take a list of chars, return the first UTF-8 encoded char. - -Signal an error if there are malformatted octets before the first char -is successfully read." - (let ((one-char-list nil) - (b1 (car byte-list))) - (if (lead-byte-p b1) - (progn - (push b1 one-char-list) - (let ((n (n-trail-bytes b1))) - (loop for i from 1 to n do (push (nth i byte-list) one-char-list)))) - (error "First byte isnt a lead byte.")) - (reverse one-char-list))) -|# - -;; (code-char (utf-8-to-unicode (bytes))) => #\a - -;; char-code and code-char translate between lisp chars and unicode code points. -;; so we have to return wchar_t compatible 32-bit integers. - -#| -;; instead of stream, we have to use window as an argument here. -(defun get-utf-8-char (stream) - (let ((bytes nil) - (ch (get-char window))) - ;; check whether single-byte or multi-byte. - ;; if single-byte: return ch - ;; if multi-byte: read continuation bytes, combine bytes, return ch - (if (lead-byte-p ch) - (let ((n (n-trail-bytes ch))) - (if (= n 0) - (push ch bytes) - (loop repeat n do (push (get-char window))))) - (error "trail byte without lead byte")))) -|# - -#| -(defun utf-8-number-of-bytes (first-byte) - "returns the length of the utf-8 code in number of bytes, based on the first byte. -The length can be a number between 1 and 4." - (declare (fixnum first-byte)) - (cond ((= 0 (ldb (byte 1 7) first-byte)) 1) - ((= #b110 (ldb (byte 3 5) first-byte)) 2) - ((= #b1110 (ldb (byte 4 4) first-byte)) 3) - ((= #b11110 (ldb (byte 5 3) first-byte)) 4) - (t (error "unknown number of utf-8 bytes for ~a" first-byte)))) - -(defun utf-8-decode-unicode-character-code-from-stream (stream) - "Decodes byte values, from a binary byte stream, which describe a character -encoded using UTF-8. -Returns the character code and the number of bytes read." - (let* ((first-byte (read-byte stream)) - (number-of-bytes (utf-8-number-of-bytes first-byte))) - (declare (fixnum first-byte number-of-bytes)) - (ecase number-of-bytes - (1 (values (ldb (byte 7 0) first-byte) - 1)) - (2 (values (logior (ash (ldb (byte 5 0) first-byte) 6) - (ldb (byte 6 0) (read-byte stream))) - 2)) - (3 (values (logior (ash (ldb (byte 5 0) first-byte) 12) - (ash (ldb (byte 6 0) (read-byte stream)) 6) - (ldb (byte 6 0) (read-byte stream))) - 3)) - (4 (values (logior (ash (ldb (byte 3 0) first-byte) 18) - (ash (ldb (byte 6 0) (read-byte stream)) 12) - (ash (ldb (byte 6 0) (read-byte stream)) 6) - (ldb (byte 6 0) (read-byte stream))) - 4)) - (t (error "wrong UTF-8 encoding for file position ~a of stream ~s" - (file-position stream) - stream))))) - -(mapcar #'(lambda (x) (princ (code-char (utf-8-to-unicode (unicode-to-utf-8 x))))) (list 65 246 1046 8364 119070)) - -=> (#\A #\LATIN_SMALL_LETTER_O_WITH_DIAERESIS #\CYRILLIC_CAPITAL_LETTER_ZHE #\EURO_SIGN #\MUSICAL_SYMBOL_G_CLEF) -|# diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/util.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/util.lisp deleted file mode 100644 index 73dcadf..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/util.lisp +++ /dev/null @@ -1,52 +0,0 @@ -(in-package :croatoan) - -;;; util -;;; miscellaneous curses utility routines -;;; http://invisible-island.net/ncurses/man/curs_util.3x.html - -;;; C prototypes - -;; char *unctrl(chtype c); -;; wchar_t *wunctrl(cchar_t *c); -;; char *keyname(int c); -;; char *key_name(wchar_t w); -;; void filter(void); -;; void nofilter(void); -;; void use_env(bool f); -;; int putwin(WINDOW *win, FILE *filep); -;; WINDOW *getwin(FILE *filep); -;; int delay_output(int ms); -;; int flushinp(void); - -;;; Low-level C functions - -(defcfun ("unctrl" %unctrl) :string (c chtype)) -(defcfun ("keyname" %keyname) :string (c :int)) - -(defcfun ("filter" %filter) :void) -(defcfun ("nofilter" %nofilter) :void) - -(defcfun ("use-env" %use-env) :void (f :boolean)) - -(defcfun ("delay_output" %delay-output) :int (ms :int)) -(defcfun ("flushinp" %flushinp) :int) - -;;; High-level Lisp wrappers - -(defun char-to-string (char) - "Return a string representing the char." - (%unctrl char)) - -(defun key-to-string (key) - "Return a string representing they key." - (%keyname key)) - -;;; NOTES - -;; Also see %use-legacy-coding in legacy_coding.lisp. - -;;; TODOs - -;; [ ] putwin, getwin, FILE pointer. -;; [ ] wunctrl, key_name, for wide chars. - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/variables.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/variables.lisp deleted file mode 100644 index 4f7f143..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/variables.lisp +++ /dev/null @@ -1,62 +0,0 @@ -(in-package :croatoan) - -;;; variables -;;; curses global variables -;;; http://invisible-island.net/ncurses/man/curs_variables.3x.html -;;; http://h71000.www7.hp.com/doc/83final/5763/5763pro_016.html - -;;; Low-level C global variables - -;; int COLOR_PAIRS; -;; int COLORS; -;; int COLS; -;; int ESCDELAY; -;; int LINES; -;; int TABSIZE; -;; WINDOW * curscr; -;; WINDOW * newscr; -;; WINDOW * stdscr; - -;;; Lisp read-only global constants. - -(defcvar ("COLOR_PAIRS" +color-pairs+ :read-only t) :int - "Number of color pairs which the terminal can support.") - -(defcvar ("COLORS" +colors+ :read-only t) :int - "Number of colors which the terminal can support.") - -(defcvar ("COLS" +screen-columns+ :read-only t) :int - "Width of the screen, the number of columns.") - -(defcvar ("ESCDELAY" +esc-delay+ :read-only t) :int - "Number of miliseconds to wait after reading an escape character, -to distinguish between an individual escape character entered on the -keyboard from escape sequences sent by cursor- and function-keys.") - -(defcvar ("LINES" +screen-lines+ :read-only t) :int - "Height of the screen, the number of lines.") - -(defcvar ("TABSIZE" +tab-size+ :read-only t) :int - "Number of columns to convert a tab character to spaces when -displaying the tab in a window.") - -#| - -curscr is the contents of the physical display screen, so it naturally -includes the ripped-off lines. - -6.3.1 Predefined Windows (stdscr and curscr) - -Initially, two windows the size of the terminal screen are predefined -by Curses. These windows are called stdscr and curscr . The stdscr -window is defined for your use. Many Curses macros default to this -window. - -The second predefined window, curscr , is designed for internal Curses -work; it is an image of what is currently displayed on the terminal -screen. The only HP C for OpenVMS Curses function that will accept -this window as an argument is clearok . Do not write to or read from -curscr . Use stdscr and user-defined windows for all your Curses -applications. - -|# diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/window.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/window.lisp deleted file mode 100644 index 9aac143..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/window.lisp +++ /dev/null @@ -1,39 +0,0 @@ -(in-package :de.anvi.croatoan) - -;; takes integers and returns a winptr. -(defun new-window (&key height width begin-y begin-x) - (%newwin height width begin-y begin-x)) -;; Example: (new-window :height 18 :width 17 :begin-y 4 :begin-x 19) - -;; TODO: one single command to delete a window and to end screen, or better a method that specializes on window type. -;; takes a window object. -;; TODO: look up what delwin returns. -(defun delete-window (window) - (%delwin (winptr window))) - -;; takes a winptr. -(defun move-window (window y x) - (%mvwin window y x)) - -;; takes a winptr, returns a winptr. -(defun new-subwindow (parent-window &key height width begin-y begin-x relative) - (if relative - (%derwin parent-window height width begin-y begin-x) - (%subwin parent-window height width begin-y begin-x))) - -;; This is NOT a move function, despite the name. You still move a subwindow with mvwin. -;; "Moving subwindows is allowed, but should be avoided." -;; mvderwin changes the source area of a subwin, but not the output area. -;; "This routine is used to display different parts of the parent window at the same physical position on the screen." -(defun move-subwindow (window parent-y parent-x) - (%mvderwin window parent-y parent-x)) - -(defun duplicate-window (window) - (%dupwin window)) - -;;; TODOs - -;; Do something with wsyncup, syncok, wcursyncup, wsyncdown. -;; For now, I wont wrap them, because I have no idea how to test them. -;; I doubt anybody will ever use them. - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/wresize.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/wresize.lisp deleted file mode 100644 index bc56353..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/wresize.lisp +++ /dev/null @@ -1,5 +0,0 @@ -(in-package :de.anvi.croatoan) - -(defun resize (window height width) - (let ((winptr (winptr window))) - (%wresize winptr height width))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/clos.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/clos.lisp deleted file mode 100644 index 56acc42..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/clos.lisp +++ /dev/null @@ -1,2878 +0,0 @@ -(in-package :de.anvi.croatoan.test) - -(defun snake () - (labels ((display-snake (scr body) - (mapc #'(lambda (pair) (add-char scr (char-code #\*) :y (car pair) :x (cadr pair))) body))) - (with-screen (scr :input-echoing nil :input-blocking nil :enable-function-keys t :cursor-visible nil) - (let* ((body '((0 7) (0 6) (0 5) (0 4) (0 3) (0 2) (0 1) (0 0))) - (xpos (cadar body)) - (ypos (caar body)) - (dir #c(1 0))) - - (clear scr) - (display-snake scr body) - (refresh scr) - - (loop - (let ((event (get-event scr))) - (if event - (case event - (:up (setf dir #c( 0 1))) - (:down (setf dir #c( 0 -1))) - (:right (setf dir #c( 1 0))) - (:left (setf dir #c(-1 0))) - (#\q (return))) - (progn - (sleep 0.1) - (add-char scr (char-code #\space) :y (caar (last body)) :x (cadar (last body))) - (setf body (cons (list (incf ypos (- (imagpart dir))) - (incf xpos (realpart dir))) - (butlast body))) - (display-snake scr body) - (refresh scr))))))))) - -(defun snake2 () - "Use bind and run-event-loop for event handling. Use lists instead of complex numbers for directions." - (with-screen (scr :input-echoing nil :input-blocking nil :enable-function-keys t :cursor-visible nil) - (let* ((body '((0 7) (0 6) (0 5) (0 4) (0 3) (0 2) (0 1) (0 0))) - (head (car body)) - (tail (car (last body))) - ;; initial direction = right - (dir '(0 1))) - (flet ((draw-snake (win body) - (mapc (lambda (pos) (add win #\* :position pos)) body))) - (bind scr #\q 'exit-event-loop) - (bind scr :right (lambda (w e) (setq dir '( 0 1)))) - (bind scr :left (lambda (w e) (setq dir '( 0 -1)))) - (bind scr :down (lambda (w e) (setq dir '( 1 0)))) - (bind scr :up (lambda (w e) (setq dir '(-1 0)))) - (bind scr nil (lambda (w e) - ;; snake moves = erase last body pair by overwriting it with space - (add scr #\space :position tail) - (setq body (cons (mapcar #'+ head dir) (butlast body))) - (setq head (car body)) - (setq tail (car (last body))) - (draw-snake scr body) - (refresh scr))) - (clear scr) - (setf (frame-rate scr) 20) - (run-event-loop scr))))) - -;; https://github.com/skydrome/random/blob/master/shell/screensaver.sh -;; https://github.com/pipeseroni/pipes.sh/blob/master/pipes.sh -;; https://www.youtube.com/watch?v=T4n87IIa--U -(defun pipes () - (with-screen (scr :input-echoing nil :input-blocking nil :enable-function-keys t :cursor-visible nil) - (let* ((pos (list (round (/ (height scr) 2)) (round (/ (width scr) 2)))) - (dirs '((1 0) (-1 0) (0 -1) (0 1))) - (dir (nth (random 4) dirs)) - (dir-prev dir) - ch - (i 0)) - (clear scr) - (box scr) - (refresh scr) - (event-case (scr event) - (#\q (return-from event-case)) - ((nil) - (sleep 0.1) - (move scr (car pos) (cadr pos)) - (setf ch (cond ((equal dir dir-prev) (if (= (car dir) 0) :horizontal-line :vertical-line)) - ((and (equal dir-prev '(1 0)) (equal dir '(0 -1))) :lower-right-corner) - ((and (equal dir-prev '(1 0)) (equal dir '(0 1))) :lower-left-corner) - ((and (equal dir-prev '(0 1)) (equal dir '(-1 0))) :lower-right-corner) - ((and (equal dir-prev '(0 1)) (equal dir '(1 0))) :upper-right-corner) - ((and (equal dir-prev '(-1 0)) (equal dir '(0 -1))) :upper-right-corner) - ((and (equal dir-prev '(-1 0)) (equal dir '(0 1))) :upper-left-corner) - ((and (equal dir-prev '(0 -1)) (equal dir '(-1 0))) :lower-left-corner) - ((and (equal dir-prev '(0 -1)) (equal dir '(1 0))) :upper-left-corner))) - (add-char scr ch) - (let ((pos-trial (list (+ (car pos) (car dir)) (+ (cadr pos) (cadr dir))))) - (if (or (= (car pos-trial) 0) - (= (cadr pos-trial) 0) - (= (car pos-trial) (1- (height scr))) - (= (cadr pos-trial) (1- (width scr)))) - (setf pos (list (round (/ (height scr) 2)) (round (/ (width scr) 2)))) - (setf pos pos-trial))) - (if (> i (random 5)) - (progn (setf i 0) - (setf dir-prev dir) - (setf dir (nth (random 3) (remove (list (- (car dir)) (- (cadr dir))) dirs :test #'equal)))) - (progn (incf i) - (setf dir-prev dir))) - (refresh scr)))))) - -(defun matrix () - (with-screen (scr :input-echoing nil :input-blocking nil :cursor-visible nil) - (let* ((width (width scr)) - (height (height scr)) - (positions (loop repeat width collect (random height))) - (speeds (loop repeat width collect (random 4)))) - (event-case (scr event) - (#\q (return-from event-case)) - ((nil) - (sleep 0.05) - (loop for column from 0 to (1- width) do - (loop repeat (nth column speeds) do - (setf (attributes scr) '(:bold)) - (setf (color-pair scr) '(:white :black)) - (add-char scr (+ 64 (random 58)) :y (mod (nth column positions) height) :x column) - (setf (color-pair scr) '(:green :black)) - (add-char scr (+ 64 (random 58)) :y (mod (- (nth column positions) 1) height) :x column) - (add-char scr (+ 64 (random 58)) :y (mod (- (nth column positions) 2) height) :x column) - (setf (attributes scr) '()) - (add-char scr (+ 64 (random 58)) :y (mod (- (nth column positions) 3) height) :x column) - (add-char scr (char-code #\space) :y (mod (- (nth column positions) (floor height 2)) height) :x column) - (refresh scr) - (setf (nth column positions) (mod (1+ (nth column positions)) height))))))))) - -(defun matrix2 () - (with-screen (scr :input-echoing nil :input-blocking nil :cursor-visible nil) - (let* ((width (width scr)) - (height (height scr)) - ;; start at a random height in each column. - (positions (loop repeat width collect (random height))) - ;; run each column at a random speed. - (speeds (loop repeat width collect (random 4)))) - (flet ((randch () (+ 64 (random 58)))) - ;; hit the q key to exit the main loop. - (bind scr #\q 'exit-event-loop) - (bind scr nil - (lambda (win event) - ;; generate a random ascii char - (loop for column from 0 to (1- width) do - (loop repeat (nth column speeds) do - ;; position of the first point in the current column - (let ((pos (nth column positions))) - (setf (attributes win) '(:bold)) - (setf (color-pair win) '(:white :black)) - (add win (randch) :y (mod pos height) :x column) - (setf (color-pair win) '(:green :black)) - (add win (randch) :y (mod (- pos 1) height) :x column) - (add win (randch) :y (mod (- pos 2) height) :x column) - (setf (attributes win) '()) - (add win (randch) :y (mod (- pos 3) height) :x column) - ;; overwrite the last char with a space - (add win #\space :y (mod (- pos (floor height 3)) height) :x column) - (refresh win) - ;; increment the column positions - (setf (nth column positions) (mod (1+ pos) height))))))))) - ;; after the handlers have been defined, run the main event loop at 20 fps. - (setf (frame-rate scr) 20) - (run-event-loop scr))) - -(defun matrix3 () - "Test character styles and color pair completion." - (with-screen (scr :input-echoing nil :input-blocking nil :cursor-visible nil) - (let* ((width (width scr)) - (height (height scr)) - (positions (loop repeat width collect (random height))) - (speeds (loop repeat width collect (random 4))) - (s1 (list :attributes '(:bold) :fgcolor :white)) - (s2 (list :attributes '(:bold) :fgcolor :green :bgcolor nil)) - (s3 (list :attributes nil :fgcolor :green :bgcolor :black))) - (flet ((randch () (+ 64 (random 58)))) - (bind scr #\q 'exit-event-loop) - (bind scr #\r - (lambda (win event) - (setf (getf s2 :fgcolor) :red - (getf s3 :fgcolor) :red))) - (bind scr nil - (lambda (win event) - (loop for column from 0 to (1- width) do - (loop repeat (nth column speeds) do - (let ((pos (nth column positions))) - (add win (randch) :y (mod pos height) :x column :style s1) - (add win (randch) :y (mod (- pos 1) height) :x column :style s2) - (add win (randch) :y (mod (- pos 2) height) :x column :style s2) - (add win (randch) :y (mod (- pos 3) height) :x column :style s3) - (add win #\space :y (mod (- pos (floor height 3)) height) :x column :style s3) - (refresh win) - (setf (nth column positions) (mod (1+ pos) height))))))))) - (setf (frame-rate scr) 20) - (run-event-loop scr))) - -(defun matrix4 () - "Test passing colors with fgcolor without passing them as pairs." - (with-screen (scr :input-echoing nil :input-blocking nil :cursor-visible nil) - (let* ((width (width scr)) - (height (height scr)) - (positions (loop repeat width collect (random height))) - (speeds (loop repeat width collect (random 4)))) - (flet ((randch () (+ 64 (random 58)))) - (bind scr #\q 'exit-event-loop) - (bind scr nil - (lambda (win event) - (loop for column from 0 to (1- width) do - (loop repeat (nth column speeds) do - (let ((pos (nth column positions))) - (setf (attributes win) '(:bold)) - (setf (fgcolor win) :green) - (add win (randch) :y (mod pos height) :fgcolor :white :x column) - (add win (randch) :y (mod (- pos 1) height) :x column) - (add win (randch) :y (mod (- pos 2) height) :x column) - (setf (attributes win) '()) - (add win (randch) :y (mod (- pos 3) height) :x column) - (add win #\space :y (mod (- pos (floor height 3)) height) :x column) - (refresh win) - (setf (nth column positions) (mod (1+ pos) height))))))))) - (setf (frame-rate scr) 20) - (run-event-loop scr))) - -;; initialize ncurses, deinitialize ncurses -;; tests initialize-instance -(defun t00 () - (let ((scr (make-instance 'screen))) - (unwind-protect - nil - (close scr)))) - -;; clos screen, accessors, unwind-protect. -(defun t01 () - (unwind-protect - (let ((scr (make-instance 'screen :enable-colors t))) - - (clear scr) - (move scr 0 0) - (add-string scr "hello there!") - - ;; the text will be red on yellow. - ;; this affects only new characters, not the whole window. - (setf (color-pair scr) '(:red :yellow)) - - (move scr 5 5) - (add-string scr "dear john!") - (refresh scr) - - ;; wait for keypress, works only in blocking mode, which is the default. - (get-char scr) - - ;; set the background character for new characters - ;; the optional argument nil prevents it from being applied to every window cell. - ;; a newline sets the background till the end of the line. - (setf (background scr nil) (make-instance 'complex-char :simple-char #\- :color-pair '(:white :green))) - (format scr "~%Hello again!~%") - (refresh scr) - (get-char scr) - - ;; finally, set the background for the whole window. - ;; the change is applied only to empty cells and to - ;; characters that have no already set attributes or colors. - (setf (background scr) (make-instance 'complex-char :simple-char #\. :color-pair '(:green :white))) - (refresh scr) - (get-char scr) - (setf (background scr) (make-instance 'complex-char :simple-char #\- :color-pair '(:red :white))) - (refresh scr) - - ;; wait for the next keypress, then end. - (get-char scr)) - - ;; unwind protect makes sure that ncurses is ended at all cost. - (end-screen))) - -;; the same as t01, but hides the window creation and ncurses ending by utilizing the with-screen macro. -(defun t02 () - (with-screen (scr :color-pair (list :yellow :red)) - (clear scr) - (move scr 0 0) - (add-string scr "hello there!") - (move scr 3 6) - (add-string scr "dear john!") - (setf (color-pair scr) '(:red :yellow)) - (move scr 3 3 :relative t) - (add-string scr "call me maybe!") - ;; setting the cursor position directly instead of using move - (setf (cursor-position scr) (list 9 12)) - (add-string scr "welcome to tijuana") - (refresh scr) - (get-char scr) - - (setf (background scr) (make-instance 'complex-char :simple-char #\. :color-pair '(:green :white))) - (refresh scr) - (get-char scr) - - (setf (background scr) (make-instance 'complex-char :simple-char #\, :color-pair '(:white :green))) - (refresh scr) - (get-char scr) )) - -(defun t02a () - "Separately set the window foreground and background color pairs." - (with-screen (scr :fgcolor :yellow :bgcolor :red) - (clear scr) - (move scr 0 0) - (add-string scr "hello there!") - - (setf (color-pair scr) '(:red :yellow)) - (move scr 3 6) - (add-string scr "dear john!") - - (setf (fgcolor scr) :yellow - (bgcolor scr) :red) - (move scr 3 3 :relative t) - (add-string scr "call me maybe!") - - ;; setting the cursor position directly instead of using move - (setf (cursor-position scr) (list 9 12)) - (add-string scr "welcome to tijuana") - (refresh scr) - (get-char scr) - - ;; setting fg to green, will set the bg to the default black - (setf (background scr) (make-instance 'complex-char :simple-char #\. :fgcolor :green)) - (refresh scr) - (get-char scr) - ;; setting bg to green will set the fg to the default white - (setf (background scr) (make-instance 'complex-char :simple-char #\, :bgcolor :green)) - - ;; text will still use the window color pair - (move scr 3 3 :relative t) - (add scr "hasta siempre") - - (refresh scr) - (get-char scr) )) - -(defun t02b () - "Set and get a wide character background." - (with-screen (scr) - ;;(de.anvi.croatoan::funcall-make-cchar_t-ptr #'%wbkgrnd (winptr scr) 0 0 0 1) - - ;; if we set char 0 as background, ncurses sets char 32 (space), which is obviously the default char. - ;; also setting 0 leads to the color pair not being accepted. - ;; TODO: check that only graphic chars are set. - (setf (background scr) (make-instance 'complex-char :simple-char #x2592 :color-pair '(:yellow :red))) - (get-char scr) - - (move scr 0 0) - ;; the low-level function returns the code. - (let ((ch (de.anvi.croatoan::get-background-cchar_t scr))) - (format scr "ch: ~A~%" ch) - (format scr "~A ~A ~A" (char-code (simple-char ch)) (attributes ch) (color-pair ch))) - - (move scr 2 0) - ;; the high level interface returns what was set by the high-level setf. - ;; TODO: when we set background to :board, should it return :board or the numeric code point? - (let ((ch (background scr))) - (if ch - (format scr "~A ~A ~A" (simple-char ch) (attributes ch) (color-pair ch)) - (format scr "ch: ~A" ch))) - - (refresh scr) - (get-char scr))) - -(defun t02c () - (with-screen (scr :input-blocking t :input-echoing nil :enable-colors t :use-terminal-colors t) - ;; simple chars added to a window without a rendered style. - (add-string scr "Hello there!") - (fresh-line scr) (refresh scr) (get-char scr) - - ;; color-pair applies to newly added text. - (setf (color-pair scr) '(:red :yellow)) - (add-string scr "Dear John!") - (fresh-line scr) (refresh scr) (get-char scr) - - ;; removing the color pair puts back the outut into the default state. - (setf (color-pair scr) '()) - (add-string scr "Open the pod bay door.") - (fresh-line scr) (refresh scr) (get-char scr) - - ;; the background style renders simple text, but it doesnt change the text with a set color pair - (setf (background scr) (make-instance 'complex-char :simple-char #\. :fgcolor :black :bgcolor :magenta)) - (add-string scr "I can feel it.") - (fresh-line scr) (refresh scr) (get-char scr) - - ;; remove the background char, set back to the default state. - (setf (background scr) nil) - (add-string scr "My mind is going.") - (fresh-line scr) (refresh scr) (get-char scr) - - ;; the empty cells of the last foreground will be overwritten by the next background call. - (setf (background scr) (make-instance 'complex-char :simple-char #\_ :color-pair '(:black :yellow))) - (format scr "I'm sorry, Dave.") - (fresh-line scr) (refresh scr) (get-char scr))) - -;; read and display chars until a q is pressed, blocking version. -(defun t03 () - (with-screen (scr :input-echoing nil :input-blocking t) - (clear scr) - (add-string scr "Type chars. Type q to quit. ") - (refresh scr) - - (loop for ch = (get-char scr) - while (not (equal (code-char ch) #\q)) - do (add-char scr ch)) - - (add-string scr "You pressed q. Now press any char to quit.") - (get-char scr))) - -;; read and display chars until a q is pressed, non-blocking version (leads to 100% CPU usage). -;; wait for keyboard using get-char makes no sense in non-blocking code because it doesnt wait. -(defun t03a () - (with-screen (scr :input-echoing nil :input-blocking nil) - (clear scr) - (add-string scr "Type chars. Type q to quit. ") - (refresh scr) - - (loop for ch = (get-char scr) - while (or (= ch -1) (not (equal (code-char ch) #\q))) - do (unless (= ch -1) (add-char scr ch))))) - -;; test which integer is returned by ncurses on a non-blocking nil event. -;; when get-char is used, -1 is returned, -;; when get-wide-char is used, 0 is returned. -(defun t03a2 () - (with-screen (scr :input-echoing nil :input-blocking nil) - (clear scr) - (add-string scr "Type chars. Type q to quit. ") - (refresh scr) - (loop for ch = (get-char scr) - while (not (equal ch 113)) ; 113 = q - do (princ ch scr)))) - -;; read and display chars until a q is pressed, non-blocking version (leads to 100% CPU usage). -;; uses get-event for event handling. -(defun t03b () - (with-screen (scr :input-echoing nil :input-blocking nil) - (clear scr) - (add-string scr "Type chars. Type q to quit. ") - (refresh scr) - - ;; TODO: should get-event only return single bytes, or should we merge it with get-wide-event? - (loop (let ((event (get-event scr))) - (when event - (case event - (#\q (return)) - (otherwise (add-char scr (char-code event))))))))) - -;; using the event-case macro to simplify the event loop. -;; do not use ((nil) nil) with input-blocking nil, it leads to 100% CPU usage. -;; if nothing happens in the nil case anyway, we can use blocking. -(defun t03b2 () - (with-screen (scr :input-echoing nil :input-blocking t) - (clear scr) - (add-string scr "Type chars. Type q to quit. ") - (refresh scr) - (event-case (scr event) - ;; ((nil) nil) - (#\q (return-from event-case)) - (otherwise (add-char scr (char-code event)))))) - -;; slightly improved t03b2 pasted as an example to the cliki croatoan page -(defun t03b3 () - (with-screen (scr :input-echoing nil :input-blocking t :enable-colors t) - (clear scr) - (move scr 2 0) - (format scr "Type chars. Type q to quit.~%~%") - (refresh scr) - (setf (color-pair scr) '(:yellow :red) - (attributes scr) '(:bold)) - (event-case (scr event) - (#\q (return-from event-case)) - (otherwise (princ event scr) - (refresh scr))))) - -;; read and display chars until a q is pressed, blocking + gray stream version. -;; the stream reading function wont work in non-blocking mode and with non-char keys. -(defun t03c () - (with-screen (scr :input-echoing nil :input-blocking t) - (clear scr) - (princ "Type chars. Type q to quit." scr) - (refresh scr) - - (loop for ch = (read-char scr) - while (not (equal ch #\q)) - do (princ ch scr)) - - (princ "You pressed q. Now press any char to quit." scr) - (read-char scr))) - -(defun t03d () - "Read and display wide (multi-byte) characters until q is pressed." - (with-screen (scr :input-echoing nil :input-blocking t :enable-colors t :cursor-visible nil) - (clear scr) - (refresh scr) - (loop for ch = (get-wide-char scr) - while (not (equal (code-char ch) #\q)) - do - (clear scr) - ;; display the human-readable version of a wide char. - (add-wide-char scr ch :attributes (list :underline) :fgcolor :yellow :bgcolor :red :y 0 :x 0) - (add-wide-char scr (code-char ch) :attributes (list :bold) :color-pair (list :yellow :red) :y 0 :x 2) - ;; extract the wide char again. - (let ((ch2 (extract-wide-char scr :y 0 :x 0))) - ;; display the lisp-readable version of the extracted complex wide char - (move scr 1 0) - ;; TODO: prin1, print and ~S should print unreadable #<..> - ;; only princ and ~A should render complex chars - (prin1 (simple-char ch2) scr) - ;; print the slots of the extracted complex wide char - (princ (attributes ch2) scr) - (princ (color-pair ch2) scr) - ;; display the rendered complex wide char again - (add-wide-char scr ch2 :y 3 :x 0) )))) - -;; gray stream version of t03d -;; we can not use ~C and write-char to write complex-chars, but it works for wide chars, which are normal lisp chars. -;; princ and ~A should work, because they rely on specialized print-object. -;; also see t08c -(defun t03d2 () - "Use gray stream functions to read and display wide (multi-byte) characters until q is pressed." - (with-screen (scr :input-echoing nil :input-blocking t :enable-colors t :cursor-visible nil) - (clear scr) - (refresh scr) - (loop for ch = (read-char scr) - while (not (equal ch #\q)) - do - (clear scr) - (move scr 0 0) - ;; we only can write-char if it is a lisp character. - (write-char ch scr) - ;; the extracted "char" is not a lisp character any more, but a complex-char - (let ((ch2 (extract-wide-char scr :y 0 :x 0)) - (*standard-output* scr)) - ;; this soon will not work with sbcl and complex chars. - ;; write-char only takes characters, no other objects. - ;; even if we specialize stream-write-char to complex-chars - ;;(move scr 1 0) - ;;(write-char ch2 scr) - ;; this will work because it uses print-objectm, since print-object can be - ;; specialized on complex-chars. - (move scr 1 0) - (princ ch scr) - (princ ch) - (move scr 2 0) - (princ ch2 scr) - (princ ch2) - ;; aestethic ~A can be used, since it uses princ underneath - ;; standard ~S can not because it cant be read back in - ;; character ~C can not be used because it requires characters. - (move scr 3 0) - (format scr "~A ~A" ch ch2) - (move scr 4 0) - (format t "~A ~A" ch ch2) - (refresh scr) )))) - -;; | cooked | cbreak | raw -;; ----------+--------+--------+----- -;; buffering | t | nil | nil -;; ----------+--------+--------+----- -;; control | t | t | nil -;; -(defun t03e () - "Test switching between input modes and control char processing." - (with-screen (scr :input-echoing nil :input-blocking t :input-buffering nil :process-control-chars nil) - (with-accessors ((input-buffering input-buffering-p) (process-control-chars process-control-chars-p)) scr - (clear scr) - (format scr "buffering ~A process-control-chars ~A (raw)~%" input-buffering process-control-chars) - (format scr "ch1: ~A~%" (get-char scr)) - (setf (process-control-chars-p scr) t) - (format scr "buffering ~A process-control-chars ~A (cbreak)~%" input-buffering process-control-chars) - (format scr "ch2: ~A~%" (get-char scr)) - (setf (input-buffering-p scr) t) - (format scr "buffering ~A process-control-chars ~A (cooked)~%" input-buffering process-control-chars) - (format scr "ch3: ~A~%" (get-char scr)) - ;; ignore the typed enter key - (get-char scr) - ;; wait for one keypress before exiting. - (get-char scr)))) - -;; take a function given as symbol name and display its docstring. press q to exit. -;; Example: (a:t04 'cdr) -(defun t04 (&optional (name 'car)) - (unwind-protect - (let ((scr (make-instance 'screen))) - (clear scr) - (refresh scr) - - (setf (attributes scr) '(:bold :reverse)) - (add-string scr "Docstring") - - (setf (attributes scr) '()) - (add-string scr " --> ") - - (setf (attributes scr) '(:bold :underline)) - (add-string scr (format nil "~A~%~%" name)) - - (setf (attributes scr) '()) - (add-string scr (documentation name 'function)) - - (refresh scr) - (get-char scr)) - (end-screen))) - -;; adding and removing attributes. -(defun t04a () - (unwind-protect - (let ((scr (make-instance 'screen :enable-colors t))) - (clear scr) - (refresh scr) - - (add-string scr (write-to-string (attributes scr))) - (add-char scr (char-code #\newline)) - - (pushnew :bold (attributes scr)) - (add-string scr (write-to-string (attributes scr))) - (add-char scr (char-code #\newline)) - - (pushnew :underline (attributes scr)) - (add-string scr (write-to-string (attributes scr))) - (add-char scr (char-code #\newline)) - - (pushnew :reverse (attributes scr)) - (add-string scr (write-to-string (attributes scr))) - (add-char scr (char-code #\newline)) - - (setf (attributes scr) (remove :reverse (attributes scr))) - (add-string scr (write-to-string (attributes scr))) - (add-char scr (char-code #\newline)) - - (setf (attributes scr) (remove :underline (attributes scr))) - (add-string scr (write-to-string (attributes scr))) - (add-char scr (char-code #\newline)) - - (setf (attributes scr) (remove :bold (attributes scr))) - (add-string scr (write-to-string (attributes scr))) - (add-char scr (char-code #\newline)) - - (refresh scr) - (get-char scr)) - (end-screen))) - -;; a more concise way to write t04a -(defun t04b () - (with-screen (scr :enable-colors t :cursor-visible nil) - (clear scr) - - (print (attributes scr) scr) - - (add-attributes scr '(:bold)) - (print (attributes scr) scr) - - (add-attributes scr '(:underline)) - (print (attributes scr) scr) - - (add-attributes scr '(:reverse)) - (print (attributes scr) scr) - - (remove-attributes scr '(:bold :underline :reverse)) - (print (attributes scr) scr) - - (add-attributes scr '(:bold :underline :reverse)) - (print (attributes scr) scr) - - (setf (attributes scr) nil) - (print (attributes scr) scr) - (print "test" scr) - - (move scr 6 10) - (change-attributes scr 10 '()) - - (refresh scr) - (get-char scr))) - -;; Make sure we shut down ncurses and dont mess up the terminal when an error is signaled. -(defun t05 () - (unwind-protect - (let ((scr (make-instance 'screen))) - (add-string scr "press any char to signal an error and go to the debugger in a messed up screen!") - (refresh scr) - (get-char scr) - (error "zu huelf!")) - ;; this will be executed after we somehow return from the debugger. - (end-screen))) - -;; End ncurses cleanly _before_ getting into the debugger when an error is signalled. -;; do get into the debugger, but only after we are back to the repl. -(defun t06 () - (let ((*debugger-hook* #'(lambda (c h) (declare (ignore c)) (declare (ignore h)) (end-screen)))) - (unwind-protect - (let ((scr (make-instance 'screen))) - (add-string scr "hello there! press a char to signal an error and go to the debugger without messung up the screen!") - (refresh scr) - (get-char scr) - (error "zu huelf!")) - (end-screen)))) - -;; The debugger hook is added now to with-screen. -;; When an error is signalled in a ncurses app, we cleanly exit ncurses first, we dont get -;; into the debugger and we merely print the signalled condition to the REPL. -(defun t06a () - (with-screen (scr) - (add-string scr "hello there! press a char to signal an error. the app will be ended without going to the debugger.") - (refresh scr) - (get-char scr) - (error "zu huelf!"))) - -;; display a new window on the stadard screen. -;; problem: deleting different windows is not standardized. (problem solved, example obsolete) -(defun t07 () - (unwind-protect - (let ((scr (make-instance 'screen :enable-colors t))) - (clear scr) - (add-string scr "Standard screen") - (refresh scr) - (get-char scr) - - (let ((win (make-instance 'window :height 15 :width 50 :location '(5 5)))) - (setf (background win) (make-instance 'complex-char :color-pair '(:red :blue))) - (add-string win "Window 1") - (refresh win) - (get-char win))) - ;(delete-window win) ; this is missing, we have to properly delete windows manually. - - ;; this will be executed after we somhow return from the debugger. - (end-screen))) - -;; close now closes both windows and the main screen. -;; but the creation of a window/screen now has to be outside the unwind-protect form. -(defun t07a () - (let ((scr (make-instance 'screen :enable-colors t :cursor-visible nil))) - ;; since windows are streams now, we can use close on tem too. - ;; in order to be able to close scr, as compared to end-screen without arguments in t07, - ;; we have to move unwind-protect inside the let scope. - (unwind-protect - (progn - (clear scr) - (add-string scr "Standard screen") - (refresh scr) - (get-char scr) - - (let ((win (make-instance 'window :height 15 :width 50 :location '(5 5) :draw-border t))) - (setf (background win) (make-instance 'complex-char :simple-char #\: :color-pair '(nil :blue))) - (add-string win "Window 1" :y 2 :x 4 :fgcolor :red :bgcolor :yellow) - (refresh win) - (get-char win) - (close win)) - - (clear scr) - (refresh scr) - (get-char scr)) - ;; close is defined by the gray stream interface. - (close scr)))) - -;; test the gray streams interface. -(defun t08 () - (unwind-protect - (let ((scr (make-instance 'screen))) - (clear scr) - - (write-char #\a) ; writes a to the repl. wont be visible until we quit ncurses. - - (write-char #\b scr) ; writes b to scr. - (terpri scr) - - (princ "hello") ; writes to the repl. wont be visible until we quit ncurses. - - (princ "hello" scr) - (terpri scr) ; 3 calls, 3 new lines will be added. - (terpri scr) - (terpri scr) - - (princ "there" scr) - - (terpri scr) - (write-string "dear john" scr :start 0 :end 4) - (terpri scr) - (write-string "dear john" scr :start 5) - - (fresh-line scr) ; we call it 3 times, but only one newline will be added. - (fresh-line scr) - (fresh-line scr) - - (format scr "--~%~r~%--" 1234) ; each % will add a newline. - - (write-char #\newline scr) ; this is the char that actually gets displayed each time terpri is called. - - (refresh scr) - (get-char scr)) - (end-screen))) - -;; when we define windows as streams, we can rebind the *standard-output* to print to a ncurses window. -;; this only works with standard lisp output functions, format, write-char, terpri, print, etc. -;; we still have to explicitely ncurses functions clear, close, refresh, etc. though. -(defun t08a () - (let ((scr (make-instance 'screen))) - (unwind-protect - (progn - (clear scr) - - ;; writes explicitely to scr - (write-char #\a scr) - (terpri scr) - (princ "hello" scr) - (terpri scr) - (format scr "~r" 1234) - (terpri scr) - - ;; writes to *standard-output*, which here is scr. - (let ((*standard-output* scr)) - (write-char #\b) - (terpri) - (princ "there") - (terpri) - (format t "~r" 5678) - (terpri)) - - (refresh scr) - (get-char scr)) - (close scr)))) - -(defun t08b () - "Use colors on *standard-output* with standard lisp printing functions. - -Test whether a window (stream) was closed." - (let* ((scr (make-instance 'screen :enable-colors t)) - (*standard-output* scr)) - (unwind-protect - (progn - (clear scr) - (setf (background scr) (make-instance 'complex-char :color-pair '(:black :white))) - (format t "~r" 1984) - (refresh scr) - (get-char scr) - - ;; temporarily bind *standard-output* to a window. - (let* ((win (make-instance 'window :height 15 :width 50 :location '(5 5))) - (*standard-output* win)) - (setf (background win) (make-instance 'complex-char :color-pair '(:white :black))) - (format t "~r" 1985) - (refresh win) - (get-char win) - (format t "~%before close: streamp: ~A open-stream-p: ~A" (streamp win) (open-stream-p win)) - (refresh win) - (get-char win) - (format scr "~%after close: close: ~A streamp: ~A open-stream-p: ~A" (close win) (streamp win) (open-stream-p win)) - (refresh scr) - (get-char scr)) - - ;; *standard-output*is now again scr. - (setf (background scr) (make-instance 'complex-char :color-pair '(:black :white))) - (terpri) - (format t "~r" 1984) - (refresh scr) - (get-char scr)) - (close scr)))) - -;; Write complex chars to standard output using standard lisp output functions + gray streams. -;; According to SBCL devs, write-char and ~C are not supposed to work, because according to the -;; standard, only lisp characters should be accepted s arguments by write-char, and any other -;; object like a complex-char should signal an error. -(defun t08c () - (with-screen (scr) - (let ((*standard-output* scr) - (ch (make-instance 'complex-char :simple-char #\a :attributes '(:bold :underline) :color-pair '(:green :black)))) - (write-char #\a) - (terpri) - ;;(write-char ch) - (terpri) - (princ ch) - (terpri) - (print ch) - (terpri) - (format t "~%Format:~%~S~%~A" ch ch) - (terpri)) - (refresh scr) - (get-char scr))) - -;; box, move -(defun t09 () - (let* ((scr (make-instance 'screen :enable-colors t))) - (unwind-protect - (progn - (clear scr) - - (setf (background scr) (make-instance 'complex-char :color-pair '(:black :white))) - (box scr) - (move scr 1 1) - (princ 0 scr) - - (refresh scr) - - (let ((w1 (make-instance 'window :height 10 :width 30 :location '(3 5))) - (w2 (make-instance 'window :height 10 :width 30 :location '(6 10))) - (w3 (make-instance 'window :height 10 :width 30 :location '(9 15)))) - - (setf (background w1) (make-instance 'complex-char :color-pair '(:white :black))) - (setf (background w2) (make-instance 'complex-char :color-pair '(:black :white))) - (setf (background w3) (make-instance 'complex-char :color-pair '(:white :black))) - - (box w1) - (box w2) - (box w3) - - (move w1 1 1) - (princ 1 w1) - (move w2 1 1) - (princ 2 w2) - (move w3 1 1) - (princ 3 w3) - - (refresh w1) - (refresh w2) - (refresh w3) - - (get-char w1) - - ;; todo: before we can refresh w2 to raise it, we have to "touch" it. - ;; if we dont touch it, only the changed parts of it will be redrawn. - (touch w2) - (refresh w2) - - (get-char w1) - - ;; move the whole window 3. note that this doesnt refresh the windows below, - ;; they have to be refreshed separately. - (setf (location w3) '(9 20)) - (refresh w3) - (get-char w3) - - (close w1) - (close w2) - (close w3)) - - (setf (background scr) (make-instance 'complex-char :color-pair '(:black :white))) - - (refresh scr) - (get-char scr)) - - (close scr)))) - -;; the same as t09, but we can now raise the overlapping windows by hitting 1, 2 or 3. -(defun t09a () - (let* ((scr (make-instance 'screen :enable-colors t :input-blocking t :input-echoing nil ;;:use-terminal-colors t - :cursor-visible nil))) - (unwind-protect - (progn - (clear scr) - - (box scr) - (refresh scr) - - ;; the default value for width or height is "to the end of the screen". - (let ((w1 (make-instance 'window :height 10 :width 30 :location '(3 5))) - (w2 (make-instance 'window :width 30 :location '(6 10))) - (w3 (make-instance 'window :height 10 :location '(9 15)))) - - (box w1) - (box w2) - (box w3) - - ;; after we define a default pair, :terminal -1 refers to these colors. - (setf (use-terminal-colors-p scr) t) - ;;(setf (default-color-pair scr) (list :yellow :red)) - - (setf (background w1) (make-instance 'complex-char :color-pair '(:default-fg :yellow))) - ;; window w2 uses the :default fg and bg color of the terminal, because use-terminal-colors is t. - (setf (background w3) (make-instance 'complex-char :color-pair '(:yellow :terminal))) - - ;; print currently active color pairs to w3 - (format w3 "~A" de.anvi.croatoan::*color-pair-alist*) - - ;; TODO: clear, refresh, etc, should take one or more windows as arguments. - ;; so we can do (refresh w1 w2 w3) instead of: - (refresh w1) - (refresh w2) - (refresh w3) - - (loop (let ((event (get-event scr))) - (when event - (case event - (#\1 (touch w1) (refresh w1)) - (#\2 (touch w2) (refresh w2)) - (#\3 (touch w3) (refresh w3)) - (#\q (return)) - (otherwise nil))))) - - (close w1) - (close w2) - (close w3))) - - (close scr)))) - -(defun t09b () - "Use with-screen, event-case and mapc to simplify t09a." - (with-screen (scr :input-blocking t :input-echoing nil :enable-colors t :cursor-visible nil) - (box scr) - (refresh scr) - - (let ((w1 (make-instance 'window :height 10 :width 30 :location '(3 5) :draw-border t)) - (w2 (make-instance 'window :width 30 :location '(6 10) :draw-border t)) - (w3 (make-instance 'window :height 10 :location '(9 15) :draw-border t))) - - (setf (background w1) (make-instance 'complex-char :simple-char #\space :color-pair '(:white :black)) - (background w3) (make-instance 'complex-char :simple-char #\space :color-pair '(:white :black))) - - (mapc #'refresh (list w1 w2 w3)) - - (event-case (scr event) - (#\1 (touch w1) (refresh w1)) - (#\2 (touch w2) (refresh w2)) - (#\3 (touch w3) (refresh w3)) - (#\q (return-from event-case)) - (otherwise nil)) - - (mapc #'close (list w1 w2 w3)) - - ;; return nil explicitely, so it doesnt return the window list. - nil))) - -;; https://www.gnu.org/software/guile-ncurses/manual/html_node/Panels-Basics.html#Panels-Basics -;; https://www.gnu.org/software/guile-ncurses/manual/html_node/The-curses-panel-library.html -(defun t09c () - "Use a window stack to manage overlapping windows." - (with-screen (scr :input-blocking t :input-echoing nil :enable-colors t :enable-function-keys t :cursor-visible nil :stacked t) - (box scr) - (setf (background scr) (make-instance 'complex-char :simple-char #\space :color-pair '(:black :white))) - ;; we have to stack scr because the event loop runs on scr, and this refreshes scr implicitely every time - ;; and overlaps the other windows - ;;(setf (stackedp scr) t) - - (let ((winlst nil) - (n 0)) - ;; create 8 windows (with 8 different background colors), - ;; add them to the local winlist and to the global stack - (loop for i from 0 to 7 do - (push (make-instance 'window :height 10 :width 30 :location (list (+ 3 (* i 1)) (+ 3 (* i 3))) :draw-border t :stacked t) - winlst)) - ;; number them and set the background colors - (loop for i from 0 to 7 do - (setf (attributes (nth i winlst)) (list :reverse)) - (format (nth i winlst) "~A" i) - (setf (background (nth i winlst)) - (make-instance 'complex-char :simple-char #\space :color-pair (list :black (nth i *ansi-color-list*))))) - ;;(setf (stackedp (nth i winlst)) t) - (refresh-stack) - - (event-case (scr event) - ;; type 0-7 to pick a window - ((#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7) - ;; show the picked window number in the upper right screen corner - (add-char scr event :y 1 :x 78 :color-pair (list :white :black)) - (setf n (- (char-code event) 48))) - ;; to raise a window to the top of the stack - (#\t - (raise-to-top (nth n winlst)) - (refresh-stack)) - (#\r - (raise (nth n winlst)) - (refresh-stack)) - (#\l - (lower (nth n winlst)) - (refresh-stack)) - (#\b - (lower-to-bottom (nth n winlst)) - (refresh-stack)) - ;; type v to toggle window visibility - (#\v - ;; toggle visibility for window n - (setf (visiblep (nth n winlst)) (not (visiblep (nth n winlst)))) - (refresh-stack)) - (#\q (return-from event-case)) - (otherwise nil)) - - ;; before closing them, remove all windows from the stack, so they can be GCd. - (empty-stack) - (mapc #'close winlst) - ;; return nil explicitely, so it doesnt return the window list. - nil))) - -;; port of kletva/test05. -;; print the screen size. -;; print the keys and key codes of any key pressed. -;; TODO: when we reach the end of the screen, the ~% doesnt print newlines any more and the screen doesnt scroll. -;; see scroll.lisp. a lot of window options, including scrolling, arent closified yet. -;; enable-function-keys t: fkeys have codes 255+ -;; enable-function-keys nil: fkeys are multi-char escape codes. -(defun t10 () - (let ((scr (make-instance 'screen :input-echoing nil :enable-function-keys t))) - (unwind-protect - (progn - (clear scr) - - (format scr "~A lines high, ~A columns wide.~%~%" (height scr) (width scr)) - (refresh scr) - - (loop - ;; act only on events, do nothing on non-events. - (when (key-pressed-p scr) - (let ((ch (get-char scr))) - ;; quit on q, print everything else including function keys. - (cond ((equal (code-char ch) #\q) (return)) - (t (format scr "Code: ~A, Char: ~A~%" ch (code-char ch)))))))) - (close scr)))) - -;; cleaner key printing. -;; prints key names instead of numeric char codes. -(defun t10a () - (with-screen (scr :input-echoing nil :input-blocking t :enable-function-keys t - :input-buffering nil :process-control-chars nil :enable-newline-translation t) - (setf (scrolling-enabled-p scr) t) - (format scr "~A lines high, ~A columns wide.~%~%" (height scr) (width scr)) - (loop (let ((event (get-event scr))) - (when event - (case event - (#\q (return)) - - ;; non-printable ascii chars. (#\space and #\newline are standard, all others non-standard) - (#\escape (format scr "escape char ESC ^[ \e~%")) - (#\tab (format scr "horizontal tab char HT \t~%")) - (#\space (format scr "space char~%")) - - ;; NL can be either LF \n,CR \r,or CRLF \r\n, depending on the system. it is LF on ubuntu. - ;; NL is the standard, system independent, portable way. - (#\linefeed (format scr "enter/linefeed LF ^J \n char~%")) - (#\return (format scr "enter/return CR ^M \r char~%")) - (#\newline (format scr "enter/newline char~%")) ; = #\linefeed, code 10. - - ;; use %nonl to prevent ^M (CR) from automatically being translated to ^J (LF) - (#\n (setf (newline-translation-enabled-p scr) - (not (newline-translation-enabled-p scr))) - (if (newline-translation-enabled-p scr) - (format scr "%nl newline translation enabled: RET => NL (= LF)~%") - (format scr "%nonl newline translation disabled: RET => CR~%"))) - - (#\rubout (format scr "rubout char ^?~%")) ;; DEL, ^?, delete char 127 - (#\backspace (format scr "backspace char ^H~%")) ;; BS, \b, ^H, code 8, not the same as the :backspace key - - (:backspace (format scr "backspace key <--~%")) - (otherwise (format scr "Event: ~A~%" event)))))))) - -;; demonstrate scrolling and scrolling regions. -(defun t11 () - (let ((scr (make-instance 'screen))) - (unwind-protect - (progn - (clear scr) - (refresh scr) - - ;; (move scr 5 5) - (setf (cursor-position scr) '(5 5)) - - ;; see inopts. - (setf - - ;; this is sufficient to make the whole window scroll. - ;;(scrolling-enabled-p scr t) - ;;(%scrollok (winptr scr) t) - (scrolling-enabled-p scr) t - - ;; to make only a few lines (5 to 10) scroll, we have to set a line-based region. - ;;(set-scrolling-region scr 5 10) - ;;(%wsetscrreg (winptr scr) 5 10) - (scrolling-region scr) '(5 10)) - - (loop for i from 0 to 30 do - (format scr "~A~%" i) - (refresh scr) - (sleep 0.2))) - - (close scr)))) - -;; Display available ACS (alternative character set) pseudo-graphical characters. -(defun t12 () - (let ((scr (make-instance 'screen))) - (unwind-protect - (progn - -(add-string scr "ACS_ULCORNER ") (add-char scr (acs :upper-left-corner )) (add-string scr " upper left corner") (new-line scr) -(add-string scr "ACS_LLCORNER ") (add-char scr (acs :lower-left-corner )) (add-string scr " lower left corner ") (new-line scr) -(add-string scr "ACS_URCORNER ") (add-char scr (acs :upper-right-corner )) (add-string scr " upper right corner ") (new-line scr) -(add-string scr "ACS_LRCORNER ") (add-char scr (acs :lower-right-corner )) (add-string scr " lower right corner ") (new-line scr) -(add-string scr "ACS_LTEE ") (add-char scr (acs :tee-pointing-right )) (add-string scr " tee pointing right ") (new-line scr) -(add-string scr "ACS_RTEE ") (add-char scr (acs :tee-pointing-left )) (add-string scr " tee pointing left ") (new-line scr) -(add-string scr "ACS_BTEE ") (add-char scr (acs :tee-pointing-up )) (add-string scr " tee pointing up ") (new-line scr) -(add-string scr "ACS_TTEE ") (add-char scr (acs :tee-pointing-down )) (add-string scr " tee pointing down ") (new-line scr) -(add-string scr "ACS_HLINE ") (add-char scr (acs :horizontal-line )) (add-string scr " horizontal line ") (new-line scr) -(add-string scr "ACS_VLINE ") (add-char scr (acs :vertical-line )) (add-string scr " vertical line ") (new-line scr) -(add-string scr "ACS_PLUS ") (add-char scr (acs :crossover-plus )) (add-string scr " large plus or crossover ") (new-line scr) -(add-string scr "ACS_S1 ") (add-char scr (acs :scan-line-1 )) (add-string scr " scan line 1 ") (new-line scr) -(add-string scr "ACS_S3 ") (add-char scr (acs :scan-line-3 )) (add-string scr " scan line 3 ") (new-line scr) -(add-string scr "ACS_S7 ") (add-char scr (acs :scan-line-7 )) (add-string scr " scan line 7 ") (new-line scr) -(add-string scr "ACS_S9 ") (add-char scr (acs :scan-line-9 )) (add-string scr " scan line 9 ") (new-line scr) -(add-string scr "ACS_DIAMOND ") (add-char scr (acs :diamond-symbol )) (add-string scr " diamond ") (new-line scr) -(add-string scr "ACS_BOARD ") (add-char scr (acs :board )) (add-string scr " board of squares ") (new-line scr) -(add-string scr "ACS_CKBOARD ") (add-char scr (acs :checker-board )) (add-string scr " checker board (stipple) ") (new-line scr) -(add-string scr "ACS_DEGREE ") (add-char scr (acs :degree-symbol )) (add-string scr " degree symbol ") (new-line scr) -(add-string scr "ACS_PLMINUS ") (add-char scr (acs :plus-minus )) (add-string scr " plus/minus ") (new-line scr) -(add-string scr "ACS_BULLET ") (add-char scr (acs :bullet-symbol )) (add-string scr " bullet ") (new-line scr) -(add-string scr "ACS_LARROW ") (add-char scr (acs :arrow-pointing-left )) (add-string scr " arrow pointing left ") (new-line scr) -(add-string scr "ACS_RARROW ") (add-char scr (acs :arrow-pointing-right )) (add-string scr " arrow pointing right ") (new-line scr) -(add-string scr "ACS_DARROW ") (add-char scr (acs :arrow-pointing-down )) (add-string scr " arrow pointing down ") (new-line scr) -(add-string scr "ACS_UARROW ") (add-char scr (acs :arrow-pointing-up )) (add-string scr " arrow pointing up ") (new-line scr) -(add-string scr "ACS_LANTERN ") (add-char scr (acs :lantern-symbol )) (add-string scr " lantern symbol ") (new-line scr) -(add-string scr "ACS_BLOCK ") (add-char scr (acs :solid-square-block )) (add-string scr " solid square block ") (new-line scr) -(add-string scr "ACS_LEQUAL ") (add-char scr (acs :less-than-or-equal )) (add-string scr " less/equal ") (new-line scr) -(add-string scr "ACS_GEQUAL ") (add-char scr (acs :greater-than-or-equal)) (add-string scr " greater/equal ") (new-line scr) -(add-string scr "ACS_PI ") (add-char scr (acs :pi )) (add-string scr " Pi ") (new-line scr) -(add-string scr "ACS_NEQUAL ") (add-char scr (acs :not-equal )) (add-string scr " not equal ") (new-line scr) -(add-string scr "ACS_STERLING ") (add-char scr (acs :uk-pound-sterling )) (add-string scr " UK pound sign") (new-line scr) - - (get-char scr)) - (close scr)))) - -;; after adding gray streams and adding acs to add-char. -;; http://melvilletheatre.com/articles/ncurses-extended-characters/index.html -(defun t12a () - (with-screen (scr) - (add-char scr :upper-left-corner ) (format scr " ACS_ULCORNER / upper left corner ~%") - (add-char scr :lower-left-corner ) (format scr " ACS_LLCORNER / lower left corner ~%") - (add-char scr :upper-right-corner ) (format scr " ACS_URCORNER / upper right corner ~%") - (add-char scr :lower-right-corner ) (format scr " ACS_LRCORNER / lower right corner ~%") - (add-char scr :tee-pointing-right ) (format scr " ACS_LTEE / tee pointing right ~%") - (add-char scr :tee-pointing-left ) (format scr " ACS_RTEE / tee pointing left ~%") - (add-char scr :tee-pointing-up ) (format scr " ACS_BTEE / tee pointing up ~%") - (add-char scr :tee-pointing-down ) (format scr " ACS_TTEE / tee pointing down ~%") - (add-char scr :horizontal-line ) (format scr " ACS_HLINE / horizontal line ~%") - (add-char scr :vertical-line ) (format scr " ACS_VLINE / vertical line ~%") - (add-char scr :crossover-plus ) (format scr " ACS_PLUS / large plus or crossover~%") - (add-char scr :scan-line-1 ) (format scr " ACS_S1 / scan line 1 ~%") - (add-char scr :scan-line-3 ) (format scr " ACS_S3 / scan line 3 ~%") - (add-char scr :scan-line-7 ) (format scr " ACS_S7 / scan line 7 ~%") - (add-char scr :scan-line-9 ) (format scr " ACS_S9 / scan line 9 ~%") - (add-char scr :diamond-symbol ) (format scr " ACS_DIAMOND / diamond ~%") - (add-char scr :board ) (format scr " ACS_BOARD / board of squares ~%") - (add-char scr :checker-board ) (format scr " ACS_CKBOARD / checker board (stipple)~%") - (add-char scr :degree-symbol ) (format scr " ACS_DEGREE / degree symbol ~%") - (add-char scr :plus-minus ) (format scr " ACS_PLMINUS / plus/minus ~%") - (add-char scr :bullet-symbol ) (format scr " ACS_BULLET / bullet ~%") - (add-char scr :arrow-pointing-left ) (format scr " ACS_LARROW / arrow pointing left ~%") - (add-char scr :arrow-pointing-right ) (format scr " ACS_RARROW / arrow pointing right ~%") - (add-char scr :arrow-pointing-down ) (format scr " ACS_DARROW / arrow pointing down ~%") - (add-char scr :arrow-pointing-up ) (format scr " ACS_UARROW / arrow pointing up ~%") - (add-char scr :lantern-symbol ) (format scr " ACS_LANTERN / lantern symbol ~%") - (add-char scr :solid-square-block ) (format scr " ACS_BLOCK / solid square block ~%") - (add-char scr :less-than-or-equal ) (format scr " ACS_LEQUAL / less/equal ~%") - (add-char scr :greater-than-or-equal) (format scr " ACS_GEQUAL / greater/equal ~%") - (add-char scr :pi ) (format scr " ACS_PI / Pi ~%") - (add-char scr :not-equal ) (format scr " ACS_NEQUAL / not equal ~%") - (add-char scr :uk-pound-sterling ) (format scr " ACS_STERLING / UK pound sign ~%") - - (refresh scr) - (get-char scr))) - -;; Smaller ACS example to explain how the ACS system works. -(defun t12b () - (with-screen (scr) - ;; acs takes a keyword :ulcorner, translates it to a char #\l, - ;; ncurses translates it at run-time to a terminal-dependent - ;; integer value that doesnt correspond to a char code. - (format scr "~A ~A ~A " #\l (char-code #\l) (acs :upper-left-corner)) - ;; We cant output it in a string, but have to use add-char. - (add-char scr 4194412) - (terpri scr) - (refresh scr) - (get-char scr))) - -;; Show the longer symbol names next to the ACS chars in a more readable table view. -(defun t12c () - (with-screen (scr) - (loop for i from 0 for symbol in - '(:upper-left-corner - :lower-left-corner - :upper-right-corner - :lower-right-corner - :tee-pointing-right - :tee-pointing-left - :tee-pointing-up - :tee-pointing-down - :horizontal-line - :vertical-line) - do (progn (move scr (+ 2 (* i 2)) 2) - (add-char scr symbol) - (format scr " ~S~%~%" symbol))) - - (loop for i from 0 for symbol in - '(:crossover-plus - :scan-line-1 - :scan-line-3 - :scan-line-7 - :scan-line-9 - :diamond-symbol - :board - :checker-board - :degree-symbol - :plus-minus - :bullet-symbol) - do (progn (move scr (+ 2 (* i 2)) 30) - (add-char scr symbol) - (format scr " ~S~%~%" symbol))) - - (loop for i from 0 for symbol in - '(:arrow-pointing-left - :arrow-pointing-right - :arrow-pointing-down - :arrow-pointing-up - :lantern-symbol - :solid-square-block - :less-than-or-equal - :greater-than-or-equal - :pi - :not-equal - :uk-pound-sterling) - do (progn (move scr (+ 2 (* i 2)) 55) - (add-char scr symbol) - (format scr " ~S~%~%" symbol))) - (refresh scr) - (get-char scr))) - -(defun t12c2 () - "ACS chars not available on all terminals: thick and double line drawing characters. - -Tested with xterm, gnome-terminal, st. Doesn't work in the linux console, aterm, eterm." - (with-screen (scr) - (loop for i from 0 for symbol in - '(:thick-upper-left-corner - :thick-lower-left-corner - :thick-upper-right-corner - :thick-lower-right-corner - :thick-tee-pointing-right - :thick-tee-pointing-left - :thick-tee-pointing-up - :thick-tee-pointing-down - :thick-horizontal-line - :thick-vertical-line - :thick-crossover-plus) - do (progn (move scr (+ 1 (* i 2)) 2) - (add-char scr symbol) - (format scr " ~S~%~%" symbol))) - - (loop for i from 0 for symbol in - '(:double-upper-left-corner - :double-lower-left-corner - :double-upper-right-corner - :double-lower-right-corner - :double-tee-pointing-right - :double-tee-pointing-left - :double-tee-pointing-up - :double-tee-pointing-down - :double-horizontal-line - :double-vertical-line - :double-crossover-plus) - do (progn (move scr (+ 1 (* i 2)) 40) - (add-char scr symbol) - (format scr " ~S~%~%" symbol))) - (refresh scr) - (get-char scr))) - -(defun t12d () - "Print all graphic alternative chars supported by the non-wide acs_map[128] array. - -Only the chars 33 to 126 are graphic, and not all are accessible through the -keywords provided by ncurses, and the supported chars are terminal dependent." - (with-screen (scr) - (let* ((ptr (foreign-symbol-pointer "acs_map")) - (code (mem-aref ptr :unsigned-int (char-code #\l)))) - (format scr "~A ~A ~A ~A " #\l (char-code #\l) (acs :upper-left-corner) code) - ;; l 108 4194412 4194412 *** - ;; 4194412 is nothing more than 108 with the A_ALTCHARSET bit turned on. - (add-char scr code) - (add-char scr (acs :upper-left-corner)) - (add-char scr #\l :attributes (list :altcharset)) - (terpri scr) - ;; so we do not really need to access acs_map, like acs is doing. - ;; we just need to translate chars like #\l to :upper-left-corner - (loop for i from 33 to 126 do - (add-char scr (code-char i)) - (add-char scr #\space)) - (terpri scr) - (loop for i from 33 to 126 do - (add-char scr (mem-aref ptr :unsigned-int i)) - (add-char scr #\space)) - (refresh scr) - (get-char scr)))) - -;; Demonstrate flash and beep alerts. -;; It depends on the terminal emulator whether they will work for you. -;; They both worked in xterm for me. -(defun t13 () - (with-screen (scr :input-echoing nil :input-blocking nil :enable-function-keys t :cursor-visible nil) - (loop - (let ((event (get-event scr))) - (if event - (case event - (#\b (alert :beep)) - (#\f (alert :flash)) - (#\q (return))) - (sleep 0.1)))))) - -;; minimal setting to get the mouse working. -;; reads and prints a single mouse event. -(defun t14 () - (let ((scr (make-instance 'screen :input-echoing nil :input-blocking t :enable-function-keys t))) - (unwind-protect - (progn - (%mousemask #b00000111111111111111111111111111 (null-pointer)) ; activate all mouse events. - (get-char scr) ; here you have to click to generate a mouse event. - (with-foreign-object (me '(:struct mevent)) ; create a pointer to the struct mevent. - (%getmouse me) ; save the mouse event struct to the pointed position. - (princ (mem-ref me '(:struct mevent)) scr) ; dereference the pointer, return a plist of the struct. - (get-char scr))) - (close scr)))) - -;; (cffi:convert-to-foreign '(id 1 x 1 y 2 z 3 bstate 2) '(:struct mevent)) -;; (setf ev (convert-from-foreign (mem-ref bstate '(:struct mevent)) '(:struct mevent))) - -;; mouse events are now detected in the event loop. -;; print the y x coordinates and the detected event. -(defun t14a () - (with-screen (scr :input-echoing nil :input-blocking t :enable-function-keys t :cursor-visible nil) - (set-mouse-event '(:button-1-clicked :button-2-clicked :button-3-clicked)) - (event-case (scr event y x) - ((:button-1-clicked :button-2-clicked :button-3-clicked) (format scr "~3A ~3A ~A~%" y x event)) - (#\q (return-from event-case))))) - -;; left click prints a 1, right click prints a 3. -(defun t14b () - (with-screen (scr :input-echoing nil :input-blocking t :enable-function-keys t :cursor-visible nil) - (set-mouse-event '(:button-1-clicked :button-3-clicked)) - (event-case (scr event mouse-y mouse-x) - (:button-1-clicked (move scr mouse-y mouse-x) (princ "1" scr)) - (:button-3-clicked (move scr mouse-y mouse-x) (princ "3" scr)) - (#\q (return-from event-case))))) - -(defun t14c () - "Print all mouse events." - (with-screen (scr :input-echoing nil :input-blocking t :enable-function-keys t :cursor-visible nil) - (%mousemask #b00000111111111111111111111111111 (null-pointer)) - (event-case (scr event y x) - (#\q (return-from event-case)) - (t (format scr "~3A ~3A ~A~%" y x event)) ))) - -;; resize event: the standard screen size is resized automatically. -(defun t15 () - (with-screen (scr :input-echoing nil :input-blocking nil :enable-function-keys t :cursor-visible nil :enable-colors t) - (add-string scr "Current standard screen geometry (Y x X):" :y 0 :x 0) - (loop - (let ((event (get-event scr))) - (if event - (case event - (:resize (move scr 1 0) - (format scr "~A Y lines x ~A X columns." (height scr) (width scr)) - ;; the environment variables get updated on a resize event too. - (format scr "~%~A Y lines x ~A X cols." %LINES %COLS) - (refresh scr)) - (#\q (return))) - (progn - (sleep 0.1))))))) - -;; resize event: arrange window _locations_ relative to the screen size. -(defun t15a () - (with-screen (scr :input-echoing nil :input-blocking nil :enable-function-keys t :cursor-visible nil :enable-colors t) - (add-string scr "Current standard screen geometry (Y x X):" :y 0 :x 0) - (setf (background scr) (make-instance 'complex-char :simple-char #\. :color-pair '(:green :white))) - (let ((time 0) - ;; place a window in the center of the screen. - (win (make-instance 'window :height 5 :width 10 :location (list (round (/ (height scr) 2)) - (round (/ (width scr) 2)))))) - (loop - (let ((event (get-event scr))) - (if event - (case event - (:resize ;; if the scren is resized, relocate the window to the new center. - (move-window win (round (/ (height scr) 2)) (round (/ (width scr) 2))) - ;; better differentiation of types with methods. - (move win 0 0) - (format win "Y:~A X:~A" (height scr) (width scr)) - ;; repaint all windows completely by touching them before refreshing. - ;; overlapping windows have to be refreshed in reverse stacking order. - (mapc #'(lambda (w) (touch w) (refresh w)) - (list scr win))) - (#\q (return))) - (progn - (sleep 0.01) - (move win 1 0) - (incf time 0.01) - (format win "~A" time) - (mapc #'(lambda (w) (touch w) (refresh w)) - (list scr win)) )))) - (close win)))) - -;; resize event: arrange window _sizes_ relative to the screen size. -(defun t15b () - (with-screen (scr :input-echoing nil :input-blocking nil :enable-function-keys t :cursor-visible nil :enable-colors t) - (add-string scr "Current standard screen geometry (Y x X):" :y 0 :x 0) - (setf (background scr) (make-instance 'complex-char :color-pair '(:black :white))) - (let ((time 0) - ;; make the window slightly smaller than the standard screen. - (win (make-instance 'window :height (- (height scr) 4) :width (- (width scr) 6) :location '(2 3)))) - (loop - (let ((event (get-event scr))) - (if event - (case event - (:resize ;; resize the window on every termina resize. - (resize win (- (height scr) 4) (- (width scr) 6)) - (move win 0 0) - (format win "Y:~A X:~A" (height scr) (width scr)) - ;; when updating several overlapping windows, using mark-for-refresh and - ;; batch-refresh instead of several calls to refresh prevents flickering. - (mapc #'(lambda (w) (touch w) (mark-for-refresh w)) (list scr win)) - (refresh-marked)) - (#\q (return))) - (progn - (sleep 0.01) - (move win 1 0) - (incf time 0.01) - (format win "~A" time) - (mapc #'(lambda (w) (touch w) (mark-for-refresh w)) (list scr win)) - (refresh-marked) )))) - (close win)))) - -;; test get-string: read a string, then output it. -;; the only function key we can use during input is backspace. -(defun t16 () - (unwind-protect - (let ((scr (make-instance 'screen))) - (clear scr) - (move scr 0 0) - (add-string scr "Type your name: ") - (refresh scr) - (let ((str (get-string scr 10))) - (add-string scr "Your name is: ") - (add-string scr str)) - (refresh scr) - (get-char scr)) - (end-screen))) - -;; read a single line of Lisp input (30 chars max) from the last line, -;; evaluate it and print the result to the output window above. -(defun t16a () - (with-screen (scr :input-echoing t :input-blocking t :enable-function-keys t :cursor-visible nil :enable-colors nil) - (let ((out (make-instance 'window :height (1- (height scr)) :width (width scr) :location '(0 0))) - (in (make-instance 'window :height 1 :width (width scr) :location (list (1- (height scr)) 0)))) - - (print (eval (read-from-string (get-string in 30))) out) - (refresh out) - - ;; blocking is t, so wait till the next keypress before exiting. - (get-char in) - - ;; close windows and window streams. - (close in) - (close out)))) - -;; add a loop to the input, making it a simple repl. -(defun t16b () - (with-screen (scr :input-echoing t :input-blocking t :enable-function-keys t :cursor-visible t :enable-colors nil) - (let ((out (make-instance 'window :height (1- (height scr)) :width (width scr) :location '(0 0))) - (in (make-instance 'window :height 1 :width (width scr) :location (list (1- (height scr)) 0)))) - (loop - (let ((str (get-string in 30))) - ;; if the input line is empty (length = 0), do nothing. - (when (> (length str) 0) - ;; a single blocking q exits the loop. - (when (string= str "q") (return)) - ;; after the input is read, clear the input line. - (clear in) - (print (eval (read-from-string str)) out) - (refresh out)))) - (close in) - (close out)))) - -;; ncurses' get-string only allows the backspace key. -;; extend the functionality of the input line of the simple repl. -(defun t16c () - (with-screen (scr :input-echoing nil :cursor-visible t :enable-colors t) - (let* ((wout (make-instance 'window :height (1- (height scr)) :width (width scr) :location '(0 0) :enable-scrolling t)) - ;; input blocking is a property of every single window, not just of the global screen. - (win (make-instance 'window :height 1 :width (width scr) :location (list (1- (height scr)) 0) - :enable-function-keys t :input-blocking t)) - (*standard-output* wout) - (n 0)) ; no of chars in the input line. - (event-case (win event) - (:left - (when (> (cadr (cursor-position win)) 0) - (move win 0 -1 :relative t))) - (:right - (when (< (cadr (cursor-position win)) n) - (move win 0 1 :relative t))) - (#\newline ; RET key, C-j, C-m - (when (> n 0) ; only print when the line is not empty. - (let* ((strin (extract-wide-string win :n n :y 0 :x 0)) - (strout (eval (read-from-string strin)))) - (print (length strin)) - (princ strin) - (terpri) - (add-string wout (format nil "=> ~A~%~%" strout))) - (setf n 0) - (clear win) ; empty the input line after evaluation. - (refresh wout))) - (:dc ; DEL key - (when (> n (cadr (cursor-position win))) - (decf n) - (delete-char win))) - (:ic ; INS / Einfg key - (format t "(insert-mode-p win) => ~A~%" (insert-mode-p win)) - (setf (insert-mode-p win) (not (insert-mode-p win))) - (format t "(insert-mode-p win) => ~A~%" (insert-mode-p win)) - (refresh wout)) - (:backspace ; BS key - (when (> (cadr (cursor-position win)) 0) - (decf n) - (move win 0 -1 :relative t) - (delete-char win))) - (#\q (return-from event-case)) - ((nil) ; when no key is hit at all - ;; when there is no event, get-event will return nil. - ;; this is the place for no-event code. - ;; instead of doing nothing, set blocking to t. - nil) - ;; non-function keys, i.e. normal character keys - (otherwise - (when (and (characterp event) - (< (cadr (cursor-position win)) (1- (width win)))) - (incf n) - ;; insert-mode-p does not insert if we do not use gray stream functions - ;;(add-wide-char win event)))) - (write-char event win)))) ; calls stream-write-char - ;; (princ event win) ; calls print-object - (close win) - (close wout)))) - -;; buffer: (3 2 1) -;; screen: 123 -;; in the buffer, elements are added to the left and counted from the left. -;; on the screen, the list is displayed in reverse. -(defun t16d () - "Use an input buffer instead of extracting the string from the window. Create windows using the with-windows macro." - (with-screen (scr :input-echoing nil :cursor-visible t :enable-colors t) - (with-windows ((wout :height (1- (height scr)) :width (width scr) :location '(0 0) :enable-scrolling t) - (win :height 1 :width (width scr) :location (list (1- (height scr)) 0) :enable-function-keys t :input-blocking t)) - (let ((*standard-output* wout) - (inbuf nil) ; input buffer character list - (inptr 0)) ; position of the next character in the buffer - (event-case (win event) - (#\q (return-from event-case)) - (:left - (when (> inptr 0) (decf inptr)) - (move win 0 inptr)) - (:right - (when (< inptr (length inbuf)) (incf inptr)) - (move win 0 inptr)) - (#\newline - (when (> (length inbuf) 0) - (format t "~A~%" (coerce (reverse inbuf) 'string)) (refresh wout) - (setf inbuf nil inptr 0) - (clear win) - (move win 0 inptr) - (refresh win))) - (:dc - (when (> (length inbuf) inptr) - (setf inbuf (remove-nth (- (length inbuf) (1+ inptr)) inbuf)) - (clear win) - (add-string win (coerce (reverse inbuf) 'string)) - (move win 0 inptr) - (refresh win))) - (:backspace - (when (> inptr 0) - (decf inptr) - (setf inbuf (remove-nth (- (length inbuf) 1 inptr) inbuf)) - (clear win) - (add-string win (coerce (reverse inbuf) 'string)) - (move win 0 inptr) - (refresh win))) - (:ic - (format t "(insert-mode-p win) => ~A~%" (insert-mode-p win)) - (setf (insert-mode-p win) (not (insert-mode-p win))) - (format t "(insert-mode-p win) => ~A~%" (insert-mode-p win)) - (refresh wout)) - (otherwise - (if (= inptr (length inbuf)) - (setf inbuf (cons event inbuf)) - (if (insert-mode-p win) - (setf inbuf (insert-nth (- (length inbuf) inptr) event inbuf)) - (setf inbuf (replace-nth (- (length inbuf) (1+ inptr)) event inbuf)))) - (incf inptr) - (clear win) - (add-string win (coerce (reverse inbuf) 'string)) - (move win 0 inptr) - (refresh win))))))) - -(defun t16e () - "Edit a single input field, not part of a form." - (with-screen (scr :input-echoing nil :cursor-visible t :enable-colors t :enable-function-keys t :input-blocking t) - (let ((*standard-output* scr) - (s1 (list :attributes '(:underline))) - (s2 (list :simple-char #\.)) - (field (make-instance 'field :location (list 3 20) :width 10 :window scr))) - - (setf (style field) (list :foreground s1 :background s2)) - - (bind field #\newline 'de.anvi.croatoan::debug-print-field-buffer) - - ;; pressing ^A (for "accept") exits the edit mode (for now) - ;; the field variables are not reset when edit is exited, we can access them after the edit. - (if (edit field) - ;; accept returns t - (progn - (clear scr) - ;; display the contents of the input buffer of the field - (format t "buffer: ~A~%" (buffer field)) - (format t "string: ~A" (value field))) - ;; when cancel returns nil - (progn - (clear scr) - (format t "field edit canceled."))) - - (refresh scr) - - ;; wait for keypress, then exit - (get-char scr) ))) - -(defun t16f () - "Group several input fields and buttons to a form." - (with-screen (scr :input-echoing nil :cursor-visible t :enable-colors t :enable-function-keys t :input-blocking t) - (let* ((s1 (list :fgcolor nil :bgcolor nil :attributes nil)) - (s2 (list :simple-char #\_)) - (s3 (list :fgcolor :yellow :bgcolor :red :attributes '(:underline :bold :italic))) - (s4 (list :fgcolor :blue :bgcolor :white :attributes nil)) - - ;; a style is a plist interpreted by the element drawing functions. - (s5 (list :foreground s1 :background s2 :selected-foreground s3 :selected-background s4)) - - (field1 (make-instance 'field :location (list 3 20) :width 10 :style s5 :max-buffer-length 5)) - (field2 (make-instance 'field :location (list 5 20) :width 10 :style s5)) - (field3 (make-instance 'field :location (list 7 20) :width 10 :style s5 :max-buffer-length 15)) - - (s6 (list :foreground s1 :selected-foreground s4)) - - (button1 (make-instance 'button :location (list 10 10) :name "Hello" :style s6)) - (button2 (make-instance 'button :location (list 10 20) :name "Accept" :style s6)) - (button3 (make-instance 'button :location (list 10 30) :name "Cancel" :style s6)) - - ;; a window is associated with the parent form, and can be accessed by the elements. - (form (make-instance 'form :elements (list field1 field2 field3 button1 button2 button3) :window scr))) - - ;; for debugging, return prints the content of the buffer and then deletes the buffer - (bind form :f4 'de.anvi.croatoan::debug-print-field-buffer) - (bind (find-keymap 'field-map) :f3 'de.anvi.croatoan::debug-print-field-buffer) - - ;; Functions to be called when the button is activated by #\newline or #\space. - (setf (callback button1) (lambda (b e) (save-excursion scr (move scr 0 0) (format scr "Hello there")))) - (setf (callback button2) 'accept) - (setf (callback button3) 'cancel) - - ;; pressing ^A or C-a (for "accept") exits the edit mode - ;; TAB, up and down cycles the fields and buttons - (if (prog1 (edit form) (clear scr)) - ;; display the contents of the input buffer of all fields of the form - ;; use field-buffer-to-string to get the contents of the field buffer as a string instead of a list of chars. - (loop for el in (elements form) - do (when (typep el 'field) - (format scr "~A ~A ~%" (buffer el) (value el)))) - ;; user did not accept the form (default) or called cancel-form. - (format scr "nil")) - - (refresh scr) - ;; wait for keypress, then exit - (get-char scr) ))) - -(defun t16g () - "Use the element default style of the form." - (with-screen (scr :input-echoing nil :cursor-visible t :enable-colors t :enable-function-keys t :input-blocking t) - (let* (;; character styles that can be referenced in element styles - (ch1 (list :fgcolor :blue :bgcolor :black)) - (ch2 (list :simple-char #\_)) - (ch3 (list :fgcolor :yellow :bgcolor :red :attributes '(:bold :italic))) - (ch4 (list :simple-char #\_ :fgcolor :white :bgcolor :blue)) - (ch5 (list :fgcolor :yellow :simple-char #\.)) - - ;; element styles reference previousy defined character styles. - (s1 (list :foreground ch1 :background ch2 :selected-foreground ch3 :selected-background ch4)) - (s2 (list :foreground ch4 :selected-foreground ch3)) - (s3 (list :foreground ch1 :background ch5)) - - ;; the form style consists of default styles of form elements. - (sf1 (list 'field s1 'button s2 'label s3 'checkbox s1)) - - (field1 (make-instance 'field :name :f1 :title "Forename" :location (list 3 20) :width 15 :max-buffer-length 5)) - (field2 (make-instance 'field :name :f2 :title "Surname" :location (list 5 20) :width 15)) - (field3 (make-instance 'field :name :f3 :location (list 7 20) :width 15 :max-buffer-length 20)) - - (cb1 (make-instance 'checkbox :name :c1 :title "Employed" :location (list 9 20))) - - (m1 (make-instance 'checklist :name :m1 :title "checklist" :items (list 'a 'b 'c 'd 'e 'f) :layout (list 2 3) - :max-item-length 6 :menu-location (list 11 20) :window scr)) - - (label1 (make-instance 'label :name :l1 :reference :f1 :width 18 :location (list 3 1))) - (label2 (make-instance 'label :name :l2 :reference :f2 :width 18 :location (list 5 1))) - (label3 (make-instance 'label :name :l3 :title "Age" :location (list 7 1))) - (label4 (make-instance 'label :name :l4 :reference :c1 :width 18 :location (list 9 1))) - (label5 (make-instance 'label :name :l5 :reference :m1 :width 18 :location (list 11 1))) - - (button1 (make-instance 'button :name :b1 :title "Hello" :location (list 14 10))) - (button2 (make-instance 'button :name :b2 :title "Accept" :location (list 14 20))) - (button3 (make-instance 'button :name :b3 :title "Cancel" :location (list 14 30))) - - (form (make-instance 'form - :elements (list field1 field2 field3 cb1 label1 label2 label3 label4 label5 - m1 button1 button2 button3) - :style sf1 :window scr))) - - ;; for debugging, return prints the content of the buffer and then deletes the buffer - (bind form :f4 'crt::debug-print-field-buffer) - - ;; Functions to be called when the button is activated by #\newline or #\space. - (setf (callback button1) (lambda (b e) (save-excursion scr (move scr 0 0) (format scr "Hello there")))) - (setf (callback button2) 'accept) - (setf (callback button3) 'cancel) - - ;; The set value shouldnt be longer than the max-buffer-length - (setf (value field2) "hello" - (value field3) "dear john") - - ;; Access fields by their name instead of looping through the elements list. - (if (edit form) - ;; edit returned t, which means the user accepted the form - (progn - (clear scr) - (mapc #'(lambda (name) - (let ((element (find-element form name))) - (format scr "~5A ~10A ~20A~%" name (title element) (value element)))) - (list :f1 :f2 :f3)) - ;; display the state of the checkbox - (format scr "~5A ~10A ~20A~%" (name cb1) (title cb1) (checkedp cb1)) - (format scr "~5A ~10A ~20A~%" (name m1) (title m1) (value m1))) - - ;; edit returned nil, which means the user canceled the form - (progn - (clear scr) - (format scr "nil"))) - - (refresh scr) - ;; wait for keypress, then exit - (get-char scr) ))) - -(defun t16h () - "Create a form window." - (with-screen (scr :input-echoing nil :cursor-visible t :enable-colors t :enable-function-keys t :input-blocking t) - (let* ((ch1 (list :fgcolor :black :bgcolor :white)) - (ch2 (list :simple-char #\_ :fgcolor :black :bgcolor :white)) - (ch3 (list :fgcolor :yellow :bgcolor :red :attributes '(:underline :bold :italic))) - (ch4 (list :simple-char #\_ :fgcolor :white :bgcolor :blue)) - - (style1 (list :foreground ch1 :background ch2 :selected-foreground ch3 :selected-background ch4)) - (style2 (list :foreground ch4 :selected-foreground ch3)) - (style3 (list 'field style1 'button style2)) - - (field1 (make-instance 'field :name :f1 :title "Forename" :location (list 3 3) :width 20 :max-buffer-length 5)) - (field2 (make-instance 'field :name :f2 :title "Surname" :location (list 5 3) :width 20)) - (field3 (make-instance 'field :name :f3 :title "Age" :location (list 7 3) :width 20 :max-buffer-length 20)) - - (button1 (make-instance 'button :name :b1 :title "Say Hello" :location (list 10 7))) - (button2 (make-instance 'button :name :b1 :title "Cancel" :location (list 10 20))) - (button3 (make-instance 'button :name :b2 :title "Accept" :location (list 10 30))) - - (form (make-instance 'form-window :elements (list field1 field2 field3 button1 button2 button3) - :style style3 :enable-function-keys t :input-blocking t :title "form window" - :draw-border t :height 15 :width 50 :location (list 5 15)))) - - (setf (background scr) (make-instance 'complex-char :simple-char #\space)) - (setf (background form) (make-instance 'complex-char :simple-char #\space :color-pair '(:black :white))) - (refresh scr) - - ;; Functions to be called when the button is activated by #\newline or #\space. - (setf (callback button1) (lambda (b e) (save-excursion scr (move scr 0 0) (format scr "Hello there") (refresh scr)))) - (setf (callback button2) 'cancel) - (setf (callback button3) 'accept) - - ;; The set value shouldnt be longer than the max-buffer-length (not checked yet) - (setf (value field1) "hello" - (value field2) "there" - (value field3) "dear john") - - (event-case (scr event) - (#\q (return-from event-case)) - ;; display the form window input box by pressing a. - (#\a - (if (edit form) - ;; edit returns t if the form is accepted - (progn - (clear scr) - ;; Access fields by their name instead of looping through the elements list. - (mapc #'(lambda (name) - (let ((field (find-element form name))) - (format scr "~5A ~10A ~20A~%" name (title field) (value field)))) - (list :f1 :f2 :f3)) - (refresh scr)) - - ;; and nil if it is cancelled. - (progn - (clear scr) - (princ nil scr) - (refresh scr))))) - - ;; close the ncurses windows before exiting. - (close form)))) - -(defun t16i () - "A simple input form window." - (let ((value nil)) - (with-screen (scr :input-echoing nil :cursor-visible t :enable-colors t :enable-function-keys t :input-blocking t) - (let* ((ch1 (list :fgcolor :black :bgcolor :white)) - (ch2 (list :simple-char #\_ :fgcolor :black :bgcolor :white)) - (ch3 (list :fgcolor :yellow :bgcolor :red :attributes '(:underline :bold :italic))) - (ch4 (list :simple-char #\_ :fgcolor :white :bgcolor :blue)) - (ch5 (list :simple-char #\. :fgcolor :black :bgcolor :white)) - - (style1 (list :foreground ch1 :background ch2 :selected-foreground ch3 :selected-background ch4)) - (style2 (list :foreground ch1 :selected-foreground ch4)) - (style3 (list :foreground ch1 :background ch5)) - - ;; form element default styles - (style4 (list 'field style1 'button style2 'label style3)) - - (label1 (make-instance 'label :name :l1 :reference :f1 :width 20 :location (list 2 1))) - (field1 (make-instance 'field :name :f1 :title "Forename" :location (list 2 22) :width 20 :max-buffer-length 25)) - - (label2 (make-instance 'label :name :l2 :reference :f2 :width 20 :location (list 4 1))) - (field2 (make-instance 'field :name :f2 :title "Surname" :location (list 4 22) :width 20 :max-buffer-length 25)) - - (button1 (make-instance 'button :name :b3 :title "Reset" :location (list 6 15))) - (button2 (make-instance 'button :name :b2 :title "Cancel" :location (list 6 25))) - (button3 (make-instance 'button :name :b2 :title "Accept" :location (list 6 34))) - - (form (make-instance 'form-window :elements (list field1 field2 label1 label2 button1 button2 button3) - :style style4 :enable-function-keys t :input-blocking t :title "form window" - :draw-border t :height 10 :width 50 :location (list 5 15)))) - - (setf (background form) (make-instance 'complex-char :simple-char #\space :color-pair '(:black :white))) - (refresh scr) - - (setf (callback button1) 'reset-form) - (setf (callback button2) 'cancel) - (setf (callback button3) 'accept) - - (if (edit form) - (setq value (pairlis (list (title field1) (title field2)) - (list (value field1) (value field2)))) - (setq value nil)) - (close form))) - - ;; return the input values - value)) - -;; creating sub-windows and how they share memory with the parent window. -;; leaving out the size of a window maxes it out to the right (win1) and to the bottom (win1, win3) -(defun t17 () - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) - (let* ((win1 (make-instance 'window :location '(2 2) :draw-border t)) - (win2 (make-instance 'sub-window :parent win1 :height 5 :width 20 :location '(4 4) :draw-border t)) - (win3 (make-instance 'sub-window :parent win1 :width 20 :location '(4 4) :draw-border t :relative t))) - (princ "win1" win1) - (princ "win2" win2) - (princ "win3 relative" win3) - (mapc #'(lambda (w) (refresh w)) (list win1 win2 win3)) - (get-char win3) - (mapc #'(lambda (w) (close w)) (list win2 win3)) - (refresh win1) - ;; observe that the content from win 2 and 3 is still in win1 after they have been closed. - (get-char win1) - (close win1) ))) - -;; by default, the sub-window displays the part of the parent window it overlaps with. -;; we can change which part of the parent is displayed by changing the sub-windows source-location -;; we can change where it is displayed by changing the sub-windows location. -(defun t17a () - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) - (let ((win (make-instance 'sub-window :parent scr :height 5 :width 20 :location '(2 2) :draw-border t :relative t))) - ;; initial content written to subwin and thus to scr. - (move win 1 1) (princ "subwin" win) - - ;; create two content areas in the parent window. - (move scr 2 25) (princ "area1" scr) - (move scr 3 29) (princ "area1" scr) - (move scr 4 33) (princ "area1" scr) - (move scr 5 37) (princ "area1" scr) - (move scr 6 41) (princ "area1" scr) - - (move scr 2 50) (princ "area2" scr) - (move scr 3 54) (princ "area2" scr) - (move scr 4 58) (princ "area2" scr) - (move scr 5 62) (princ "area2" scr) - (move scr 6 66) (princ "area2" scr) - - (mapc #'(lambda (w) (touch w) (refresh w)) (list scr win)) - (get-char scr) - - ;; map area1 to subwin location - ;; the mapping only _displays_ the content from the source area. - ;; the mapping it doesnt _write_ it onto the displayed area of scr. - (setf (source-location win) '(2 25)) ; (%mvderwin (winptr win) 2 25) - (mapc #'(lambda (w) (touch w) (refresh w)) (list scr win)) - (get-char scr) - - ;; map area2 to subwin location - (setf (source-location win) '(2 50)) - (mapc #'(lambda (w) (touch w) (refresh w)) (list scr win)) - (get-char scr) - - ;;; now move subwin location - ;; it still maps area2, but now to the new location. - ;; the original content written to the subwin (and thus to scr because they share memory) - ;; is now visible in scr, since the subwin overlay has moved. - (setf (location win) '(10 2)) - (mapc #'(lambda (w) (touch w) (refresh w)) (list scr win)) - (get-char scr) - - ;; map area1 again, but now to the new location. - (setf (source-location win) '(2 25)) - (mapc #'(lambda (w) (touch w) (refresh w)) (list scr win)) - (get-char scr) - - ;; writing to a sub-window writes to the _mapped_ location of the parent window - ;; _not_ to the parent location below the subwindow. - (clear win) - (move win 0 0) (princ "writing to sub-win" win) - (move win 1 0) (princ "writes to parent win" win) - (mapc #'(lambda (w) (touch w) (refresh w)) (list scr win)) - (get-char scr) - - ;; delete the subwindow win - ;; the mapped content isnt displayed any more. - ;; now the content before the mapping should be displayed again. - (mapc #'(lambda (w) (close w)) (list win)) - (refresh scr) - (get-char scr) ))) - -;; Display misc system information -;; https://github.com/rudolfochrist/dotfiles/blob/master/.rc.lisp -(defun t18 () - (with-screen (scr) - (format scr "Lisp implementation type: ~A~%" (lisp-implementation-type)) - (format scr "Lisp implementation version: ~A~%" (lisp-implementation-version)) - (format scr "Machine type (Arch) ~A~%" (machine-type)) - (format scr "Machine version (CPU) ~A~%" (machine-version)) - (format scr "Software type (OS) ~A~%" (software-type)) - (format scr "Software version (OS) ~A~%" (software-version)) - (format scr "Machine instance (hostname) ~A~%" (machine-instance)) - (format scr "User HOME ~A~%" (user-homedir-pathname)) - (format scr "Ncurses version: ~A~%" (de.anvi.ncurses:%curses-version)) - (format scr "Terminal: ~A~%" (%termname)) - (format scr "Colors supported: ~A~%" (%has-colors)) - (format scr "Color change supported: ~A~%" (%can-change-color)) - (format scr "No of supported colors: ~A~%" %colors) - (format scr "No of supported color pairs ~A~%" %color-pairs) - (format scr "Can insert/delete chars: ~A~%" (%has-ic)) - (format scr "Can insert/delete lines: ~A~%" (%has-il)) - #+sbcl - (progn - (format scr "Terminal: ~A~%" (sb-ext:posix-getenv "TERM")) - (format scr "Locale: ~A~%" (sb-ext:posix-getenv "LANG")) - (format scr "Hostname: ~A~%" (sb-ext:posix-getenv "HOSTNAME")) - (format scr "Username: ~A~%" (sb-ext:posix-getenv "USER")) - (format scr "Operating system: ~A~%" (sb-ext:posix-getenv "OSTYPE")) - (format scr "CPU Type: ~A~%" (sb-ext:posix-getenv "MACHTYPE"))) - (format scr "uname -a:~%~A" (uiop:run-program "uname -a" :output :string)) - (refresh scr) - (get-char scr))) - -;; http://stackoverflow.com/questions/38684906/how-to-get-package-documentation-in-quicklisp -(defun t18a () - "Display misc quicklisp information." - #+quicklisp - (with-screen (scr) - (let* ((dist (ql-dist:dist "quicklisp")) ; current dist - ;; output to an empty broadcast stream is discraded like redirecting to /dev/null - (*standard-output* (make-broadcast-stream)) - ;; Quicklisp prints its "Fetching xyz" messages to *trace-output* - (*trace-output* *standard-output*) - (*error-output* *standard-output*) - (installed-systems (mapcar #'ql-dist:name (ql-dist:installed-systems dist)))) - (format scr "Quicklisp dist name ~A~%" (ql-dist:name dist)) - (format scr "Quicklisp dist version ~A~%" (ql-dist:version dist)) - (format scr "Quicklisp available version ~A~%" (caar (ql-dist:available-versions dist))) - (format scr "~%Quicklisp installed releases ~{~A, ~}~%" (mapcar #'ql-dist:name (ql-dist:installed-releases dist))) - (format scr "~%Quicklisp installed systems ~{~A, ~}~%~%" installed-systems) - (loop - for i in installed-systems - for sys = (asdf:find-system i nil) - do - (when sys - (format scr "~27@A | ~A~%" - i - (remove #\newline (asdf:system-description sys)))))) - (refresh scr) - (get-char scr)) - #-quicklisp - (princ "Quicklisp not installed.")) - -;; print a simple menu, let the user choose an item by arrow keys, return the chosen item. -;; https://www.gnu.org/software/guile-ncurses/manual/html_node/A-simple-key-usage-example.html -(defun t19 () - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) - (flet ((draw-menu (win choices i) - (clear win) - (loop for j from 0 to (1- (length choices)) do - (move win j 0) - (format win "~A~A" (nth j choices) (if (= i j) "*" "")) - (when (= i j) - (move win j 0) - (change-attributes win 9 '(:reverse))) - (refresh win)))) - (let* ((choices '("Choice 0" "Choice 1" "Choice 2" "Choice 3" "Choice 4" "Choice 5" "Choice 6")) - (n (length choices)) - (i 0)) ; current choice - (draw-menu scr choices i) - (event-case (scr event) - (:up (setf i (mod (1- i) n)) (draw-menu scr choices i)) - (:down (setf i (mod (1+ i) n)) (draw-menu scr choices i)) - (#\newline (return-from event-case (nth i choices))) - (#\q (return-from event-case))))))) - -;; an even simpler 2-item menu is a yes-no-dialog. -(defun t19a () - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) - (flet ((draw-menu (win choices i) - (move win 2 0) (clear win :target :end-of-line) - (loop for j from 0 to (1- (length choices)) do - (move win 2 (* 10 j)) - (format win "~A~A" (car (nth j choices)) (if (= i j) "*" "")) - (refresh win)))) - (let* ((choices '(("Yes" . t) ("No" . nil))) - (n (length choices)) - (i 0)) ; current choice - (move scr 0 0) (format scr "User, do you want?") (refresh scr) - (draw-menu scr choices i) - (event-case (scr event) - ((:up :down :left :right #\tab) (setf i (mod (1+ i) n)) (draw-menu scr choices i)) - (#\newline (return-from event-case (cdr (nth i choices))))))))) - -(defun t19b () - "Use the menu class, draw-menu and select functions." - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) - (let* ((choices '("Choice 0" "Choice 11" "Choice 222" "Choice 3333" "Choice 44444" "Choice 555555" "Choice 6666666")) - (menu (make-instance 'menu-window :items choices :location (list 0 20) :title "t19b" - :cyclic-selection t :draw-border t :enable-function-keys t))) - (let ((result (select menu))) - (format scr "You chose ~A" result) - (touch scr) - (refresh scr) - (get-char scr)) - (close menu)))) - -(defun t19b2 () - "Use the select function with independent windows and menus" - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) - (let* ((items1 '("Choice 0" "Choice 11" :choice22 "Choice 3333" "Choice 44444" "Choice 555555" - "Choice 6666666" "Choice 7" "Choice 88" "Choice 999")) - (menu1 (make-instance 'menu :items items1 :name "sub-menu 1" :max-item-length 50 :menu-location (list 5 10))) - (items2 (list "Item 0" menu1 "Item 1" "Item 2" "Item 3" "Item 4" "Item 5" "Item 6" "Item 7" "Item 8" "Item 9")) - (menu2 (make-instance 'menu :items items2 :name "sub-menu 2" :max-item-length 50 :menu-location (list 5 10))) - (items3 (list "Item 00" menu2 "Item 01" "Item 02" "Item 03" "Item 04" "Item 5" "Item 6" "Item 7" "Item 8" "Item 9")) - (menu3 (make-instance 'menu :items items3 :name "t19b2b" :max-item-length 50 :menu-location (list 5 10)))) - ;; associate the same window with all three menus. - (setf (window menu1) scr - (window menu2) scr - (window menu3) scr) - ;; select an item and return it. - (select menu3)))) - -(defun t19c () - "Improved t19b, the menu can be called repeatedly with the key a." - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) - (let* ((choices '("Choice 0" "Choice 11" "Choice 222" "Choice 3333" "Choice 44444" "Choice 555555" - "Choice 6666666" "Choice 7" "Choice 88" "Choice 999")) - (menu (make-instance 'menu-window :items choices :location (list 0 25) :scrolled-layout (list 6 1) - :title "t19c" :draw-border t :enable-function-keys t))) - (event-case (scr event) - ;; "a" draws the menu and enters a new menu-only event loop - (#\a (let ((result (select menu))) - (format scr "You chose ~A~%" result) - ;; we have to touch scr in order to make the menu disappear. - (touch scr) - (refresh scr))) - (#\q (return-from event-case))) - (close menu)))) - -(defun t19c2 () - "Test the menu-item class for submenus." - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) - (let* ((fun1 (make-instance 'menu-item :name "fun1" :value (lambda () (clear scr)))) - (choices (list "Choice 0" 'choice11 fun1 "Choice 222" "Choice 3333" "Choice 44444" "Choice 555555" - "Choice 6666666" "Choice 7" "Choice 88" "Choice 999")) - ;; First, create a menu - ;; TODO: how to determine the location of the sub-menu depending on the parent menu? - (sub-menu2 (make-instance 'menu-window - :items choices ;; here we only have strings - :location (list 2 57) :scrolled-layout (list 6 1) - ;; for hex triplets to work, we need to start sbcl with:TERM=xterm-256color lisp.sh - ;;:color-pair (list :black #x666666) - :bgcolor :red - :name "submenu2" :title t :draw-border t :enable-function-keys t :visible nil)) - ;; then add that sub-menu menu as an item to the next menu, and so on. - (sub-menu1 (make-instance 'menu-window - :items (cons sub-menu2 choices) ;; first item is a submenu - :location (list 1 41) :scrolled-layout (list 6 1) - ;;:color-pair (list :black #x999999) - :fgcolor :green - :name "submenu1" :title nil :draw-border t :enable-function-keys t :visible nil)) - ;; finally, create the main menu containing sub-menu1 as an item - (menu (make-instance 'menu-window - :items (cons sub-menu1 choices) ;; first item is a submenu - :location (list 0 25) :scrolled-layout (list 6 1) - ;;:color-pair (list :black #xcccccc) - :fgcolor :blue :bgcolor :yellow - :name "menu" :title nil :draw-border nil :enable-function-keys t :visible nil))) - ;; add the menus and submenus to a window stack - ;; scr has to be stacked too so we can make the menus disappear. - (setf (stackedp scr) t - (stackedp menu) t - (stackedp sub-menu1) t - (stackedp sub-menu2) t) - - (setf (background scr) (make-instance 'complex-char :simple-char :board :color-pair (list :black :white))) - - (refresh-stack) - (event-case (scr event) - ;; "a" draws the menu and enters a new menu-only event loop by calling select - (#\a (let ((result (select menu))) - (format scr "You chose ~A~%" result) - (format scr "~A~%" (color-pair menu)) - (format scr "Stack ~A~%" (length de.anvi.croatoan::*window-stack*)) - (refresh-stack) )) - ;; TODO: doesnt repaint the border, because the border already has attributes. - ;; setting a background doesnt change existing attributes, only existing backgrounds. - (#\b (setf (color-pair menu) (list :red :black))) - ;; "q" exits the function and all menus and submenus. - (#\q (return-from event-case))) - (close menu) - (close sub-menu1) - (close sub-menu2)))) - -(defun t19c3 () - "Menu with checkbox items." - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) - (let* ((choices '("Choice 0" "Choice 11" "Choice 222" "Choice 3333" "Choice 44444" "Choice 555555" - "Choice 6666666" "Choice 7" "Choice 88" "Choice 999")) - (menu (make-instance 'menu-window :items choices :location (list 0 25) :scrolled-layout (list 6 1) - :title "t19c" :draw-border t :enable-function-keys t - :menu-type :checklist - :max-item-length 20 - :color-pair (list :yellow :red) ))) - (event-case (scr event) - ;; "a" draws the menu and enters a new menu-only event loop - (#\a (let ((result (select menu))) - (format scr "You chose ~A~%" (mapcar #'value result)) - ;; we have to touch scr in order to make the menu disappear. - (touch scr) - (refresh scr))) - (#\q (return-from event-case))) - (close menu)))) - -(defun t19d () - "Use the arrow keys to pick a value from an 2D array menu, given as a layout parameter." - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) - (let* ((items (loop for i below 200 collect (format nil "Item ~A" i))) - (menu (make-instance 'menu-window - :items items :location (list 0 0) :layout (list 20 10) :scrolled-layout (list 10 4) - :cyclic-selection nil :max-item-length 9 :title "t19d" :draw-border t :enable-function-keys t))) - (event-case (scr event) - ;; "a" draws the menu and enters a new menu-only event loop - (#\a (let ((result (select menu))) - (format scr "You chose ~A~%" result) - ;; we have to touch scr in order to make the menu disappear. - (touch scr) - (refresh scr))) - (#\q (return-from event-case))) - (close menu)))) - -(defun t19e () - "A one-line menu without a title and border resembling a menu bar." - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) - (let* ((items '("Item 0" "Item 1" "Item 2" "Item 3" "Item 4" "Item 5" "Item 6" "Item 7" "Item 8" "Item 9")) - (menu (make-instance 'menu-window :input-blocking t :items items :location (list 0 0) - :layout (list 1 (length items)) - :scrolled-layout (list 1 6) - ;;:color-pair (list :black :yellow) - :max-item-length 10 :width (width scr) :draw-border t :enable-function-keys t))) - ;; start the output below the menu - (move scr 4 0) - ;; exit the infinite loop by exiting the menu with q. - (loop named menu-case - do - (let ((result (select menu))) - (unless result (return-from menu-case)) - (format scr "You chose ~A~%" result) - (refresh scr))) - (close menu)))) - -(defun t19e2 () - "A menu bar and submenus." - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) - (let* ((items1 (list "Choice 0" "Choice11" "Choice 222" "Choice 3333" "Choice 44444" "Choice 555555" - "Choice 6666666" "Choice 7" "Choice 88" "Choice 999")) - (sub-menu1 (make-instance 'menu-window :items items1 :location (list 2 30) :scrolled-layout (list 6 1) - :title nil :name "submenu1" :draw-border t :enable-function-keys t :visible nil :menu-type :selection)) - (sub-menu2 (make-instance 'menu-window :items items1 :location (list 2 45) :scrolled-layout (list 6 1) - :title nil :name "submenu2" :draw-border t :enable-function-keys t :visible nil :menu-type :checklist)) - (fun1 (make-instance 'menu-item :name "fun1" :value (lambda () (clear scr)))) - (items2 (list "Item 0" fun1 sub-menu1 sub-menu2)) - (menu (make-instance 'menu-window :input-blocking t :items items2 :location (list 0 0) :layout (list 1 (length items2)) - :max-item-length 15 :width (width scr) :draw-border t :enable-function-keys t))) - (setf (stackedp scr) t - (stackedp menu) t - (stackedp sub-menu1) t - (stackedp sub-menu2) t) - (move scr 4 0) ;; start the output at line 4, below the menu bar. - (refresh-stack) - (loop named menu-case - do (let ((result (select menu))) - (unless result (return-from menu-case)) - (format scr "You chose ~A~%" result) - (refresh-stack))) - (close menu) - (close sub-menu1) - (close sub-menu2) ))) - -(defun t19f () - "A more fancy version of t19a, a yes-no dialog using the class dialog-window." - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) - (let* ((items (list "Yes" "No" "OK" 'cancel)) - (menu (make-instance 'dialog-window - :input-blocking t - :items items - ;; when center is t for a dialog window, we do not need to pass the location explicitely. - ;;:location (list 5 15) - :center t - :layout (list 1 4) - :max-item-length 12 - :current-item-mark "> " - :color-pair (list :yellow :red) - :width 60 - :draw-border t - :enable-function-keys t - :name "t19f" - :title t - ;; if the title is given as a string, it overrides the default title = name - ;; :title "this is a selection dialog" - :message-height 2 - :message-text "Press <- or -> to choose. Enter to confirm choice.~%Press q to exit."))) - - (setf (background scr) (make-instance 'complex-char :simple-char :board :color-pair (list :black :white))) - - (refresh scr) - (loop named menu-case - do (let ((result (select menu))) - (unless result (return-from menu-case)) - (format scr "You chose ~A~%" result) - (refresh scr))) - (close menu)))) - -(defun t19g () - "A checkbox dialog." - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t :use-terminal-colors t) - (let* ((items (list "Yes" "No" "OK" 'cancel "Maybe")) - (menu (make-instance 'dialog-window - :input-blocking t - :items items - ;; when a menu or dialog type is a checklist, items can be checked and unchecked with x/space. - :menu-type :checklist - ;; a dialog window can be automatically centered in the terminal window. - :center t - :layout (list 5 1) - ;; TODO: the size of the dialog window should depend on scrolled layout when it is defined. - ;;:scrolled-layout (list 3 1) - :max-item-length 56 - :color-pair (list :yellow :red) - ;; we do not need an item mark in a checklist - :current-item-mark "" - :width 60 :draw-border t :enable-function-keys t - :title "this is a checkbox dialog" - :message-height 2 - :message-text "Press <- or -> to choose. Enter to confirm choice.~%Press q to exit."))) - ;; #x2592 = :board - (setf (background scr) (make-instance 'complex-char :simple-char #x2592 :color-pair (list :white :black))) - - (refresh scr) - (loop named menu-case - do (let ((result (select menu))) - ;; TODO: returning an empty list exits the loop. - (unless result (return-from menu-case)) - (format scr "You chose ~A~%" (mapcar #'value result)) - (refresh scr))) - (close menu)))) - -;; Passing the color attribute directly to a character. -(defun t20 () - "Display a randomly created carpet of the seven default ANSI colors, except for black." - (with-screen (scr :input-echoing nil :input-blocking nil :enable-colors t :cursor-visible nil) - (let ((colors '(:red :green :yellow :blue :magenta :cyan :white))) - (event-case (scr event) - (#\q (return-from event-case)) - ((nil) - (sleep 0.01) - (echo scr #\space - :y (random (height scr)) - :x (random (width scr)) - :color-pair (list nil (nth (random 7) colors)))))))) - -(defun t20a () - "Display a randomly created carpet of the 16 default xterm colors, except for black. - -This only works with TERM=xterm-256color in xterm and gnome-terminal." - (with-screen (scr :input-echoing nil :input-blocking nil :enable-colors t :cursor-visible nil) - (let ((colors '( :maroon :green :olive :navy :purple :teal :silver - :gray :red :lime :yellow :blue :magenta :cyan :white))) - (bind scr #\q 'exit-event-loop) - (bind scr nil - (lambda (win e) - (echo win #\space - :y (random (height win)) - :x (random (width win)) - :bgcolor (nth (random 15) colors)))) - (setf (frame-rate scr) 1000) - (run-event-loop scr)))) - -;; it is just a coincidence that "echo-char" works here. -;; echo-char is a chtype-function, and chtype allows only 1 byte for color pairs, which means 256 color pairs. -;; it works only because the foreground color is always black in the example. -;; echo-wide-char has to be used. -(defun t20b () - "Display the 256 supported colors. This only works with TERM=xterm-256color in xterm and gnome-terminal." - (with-screen (scr :input-echoing nil :input-blocking t :enable-colors t :cursor-visible nil) - ;; 0-15: 8 ANSI colors and 8 bold ANSI colors - ;; only those first 16 colors are named. - ;; note that the naming of the first 8 ANSI colors is not the same as the first 8 xterm colors. - (loop for i from 0 to 7 do - (loop for j from 0 to 1 do - (loop for k from 0 to 2 do - (echo scr #\space - :y j - :x (+ (* i 3) k) - :color-pair (list :black - (list :number (+ i (* j 8))))) ))) - ;; 16-231: 6x6x6 color cube - (loop for n from 0 to 1 do - (loop - for m from 0 to 2 - for a1 = (+ 16 (* m 36)) - for a2 = (+ 16 (* m 36) 5) - for a3 = (* m 19) - do (loop for i from a1 to a2 do - (loop for j from 0 to 5 do - (loop for k from 0 to 2 do - (echo scr #\space - :y (+ 3 j (* n 7)) - :x (+ (* (- i a1) 3) k a3) - :color-pair (list :black - (list :number (+ (* n 108) i (* j 6)))) )))))) - ;; 232-255: 24 shades of gray, without black and white - (loop for i from 232 to 255 do - (loop for k from 0 to 2 do - (echo scr #\space - :y 17 - :x (+ (* (- i 232) 3) k) - :color-pair (list :black - (list :number i))))) - (get-char scr))) - -(defun t20c () - "Display the 256 supported colors. This only works with TERM=xterm-256color in xterm and gnome-terminal." - (with-screen (scr :input-echoing nil :input-blocking t :enable-colors t :cursor-visible nil) - ;; 0-15: 8 ANSI colors and 8 bold ANSI colors - (loop for i from 0 to 7 do - (loop for j from 0 to 1 do - (loop for k from 0 to 2 do - (add scr #\space - :y j - :x (+ (* i 3) k) - :bgcolor (list :number (+ i (* j 8))))) )) - ;; 16-231: 6x6x6 color cube - (loop for n from 0 to 1 do - (loop - for m from 0 to 2 - for a1 = (+ 16 (* m 36)) - for a2 = (+ 16 (* m 36) 5) - for a3 = (* m 19) - do (loop for i from a1 to a2 do - (loop for j from 0 to 5 do - (loop for k from 0 to 2 do - (add scr #\space - :y (+ 3 j (* n 7)) - :x (+ (* (- i a1) 3) k a3) - :bgcolor (list :number (+ (* n 108) i (* j 6)))) ))))) - ;; 232-255: 24 shades of gray, without black and white - (loop for i from 232 to 255 do - (loop for k from 0 to 2 do - (add scr #\space - :y 17 - :x (+ (* (- i 232) 3) k) - :bgcolor (list :number i)))) - (refresh scr) - (get-char scr))) - -;; Tests for insert-char, insert-string, extract-char. -(defun t21 () - (with-screen (scr :cursor-visible nil) - (move scr 0 0) (add-char scr #\a) - ;; overwrite b over a - (move scr 0 0) - (add-char scr - (make-instance 'complex-char :simple-char #\b :attributes (list :bold :underline) :color-pair '(:blue :yellow))) - (echo scr - (make-instance 'complex-char :simple-char #\e :attributes (list :underline) :color-pair '(:blue :yellow))) - ;; insert pi before b - (move scr 0 0) (insert-char scr :pi :color-pair '(:yellow :red)) - ;; insert d before pi - (move scr 0 0) (insert-string scr "d ") - ;; change the attributes of the d - (move scr 0 0) (change-attributes scr 1 '(:underline) :color-pair '(:green :black)) - ;; extract the complex d from the window, then print its properties. - (let ((e (extract-char scr))) - (move scr 1 0) - ;; format uses print-object specialized on complex-chars - (format scr "~S~%~S ~S ~S" e (simple-char e) (attributes e) (color-pair e)) - ;; print back the extracted char - (move scr 3 0) - (add-char scr (simple-char e) :attributes (attributes e) :color-pair (color-pair e)) - ;; directly print the complex char - (add-char scr e :y 5 :x 10 :n -1) - ;; print strings with attributes and colors - ;; attributes dont work (yet) when a long string gets wrapped around the last column. - (add-string scr "string with attributes" :y 11 :x 10 :attributes '(:underline) :color-pair '(:black :green)) - ;; test adding both chars and strings with a single wrapper routine. - (add scr #\a :y 13 :x 0 :attributes '(:underline) :color-pair '(:yellow :red) :n -1) - (add scr "string with attributes" :y 15 :x 0 :n 11 :attributes '(:underline :bold) :color-pair '(:yellow :green))) - ;; test print-object specialisation on complex-string - (let ((str (make-instance 'complex-string :string "complex-string" :color-pair '(:blue :white) :attributes '(:underline)))) - (format scr "~%~S~%" str) - (add-string scr str :y 18 :x 73 :n -1) - (add scr str :y 19 :x 70 :n -1)) - ;; extract the first line as a complex-string, then reprint it at line 22 - (let ((str (extract-complex-string scr :y 0 :x 0 :n 4))) - (move scr 22 1) - (add scr str :n -1)) - ;; extract the first line as a simple string, then reprint it at line 23 - (let ((str (extract-string scr :y 0 :x 0 :n 5))) - (move scr 23 1) - (add scr str)) - (refresh scr) - (get-char scr))) - -;; temporarily end the main screen, write something to the repl, and then return to the screen. -;; the predicate closed-p can be used to check whether the screen has been temporarily closed. -(defun t22 () - (let ((scr (make-instance 'screen :input-blocking t :input-echoing nil))) - (unwind-protect - (progn - (clear scr) - ;; should yield NIL, since we didnt endwin yet - (format scr "1. screen before ending: ~A~%" (closed-p scr)) - (get-char scr) - - (close scr) - - ;; this shouldnt be visible, but it is visible after the later refresh - ;; obviously ncurses doesnt destroy the screen window after it is closed - (format scr "2. screen after ending, we dont see it till after the refresh: ~A~%" (closed-p scr)) - - ;; should yield T, because we closed the screen - (format t "3. in the repl, after ending the screen: ~A~%" (closed-p scr)) - (force-output *standard-output*) - (sleep 5) - - (refresh scr) - ;; should yield NIL, since we refreshed - (format scr "4. screen after refreshing: ~A~%" (closed-p scr)) - - (get-char scr)) - (close scr)))) - -(defun t23 () - "Use save-excursion to return the cursor to its initial location." - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible t :enable-colors t) - (move scr 0 0) - (princ "1. hello" scr) - (save-excursion scr - (move scr 5 5) - (princ "2. there" scr)) - (princ "3. dear john" scr) - (get-char scr))) - -(defun t24 () - "Test usage of insert-line and delete-line." - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible t :enable-colors t) - (loop for i from 0 to (- (height scr) 1) - do - (move scr i 0) - (format scr "~A" i)) - (refresh scr) - (event-case (scr event) - ((:up :down) (move-direction scr event) (refresh scr)) - (#\d (delete-line scr) (refresh scr)) - (#\i (insert-line scr) (refresh scr)) - (#\q (return-from event-case))) - (get-char scr))) - -(defun t25 () - "Test initialisation and refreshing of pads and sub-pads." - (with-screen (scr :input-blocking t :cursor-visible nil :enable-colors t) - (let* ((p (make-instance 'pad :height 100 :width 100)) - (sp (make-instance 'sub-pad :parent p :height 5 :width 10 :location (list 10 10)))) - - ;; populate the pad with numbers. - (loop for j from 0 to 99 - do (loop for i from 0 to 99 - do - (move p j i) - (format p "~D" (mod (* i j) 10)))) - - ;; populate the sub-pad with letters. - (loop for j from 0 to 4 - do (loop for i from 0 to 9 - do - (move sp j i) - (add-char sp #\X) )) - - ;; we have to modify the sub-window attributes first because apparently once - ;; chars have attributes, they can not be changed by subsequent background changes. - (setf (background sp) (make-instance 'complex-char :color-pair '(:white :red)) - (background p) (make-instance 'complex-char :color-pair '(:green :white))) - - (let ((pad-min-y 0) - (pad-min-x 0) - (screen-min-y 0) - (screen-min-x 0) - (screen-max-y 5) - (screen-max-x 10)) - - ;; the background screen has to be touched and refreshed on every move, - ;; otherwise we will see parts of the previously displayed pad still there. - (touch scr) - (refresh scr) - (refresh p pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x) - - (event-case (scr event) - (:up (decf pad-min-y) (decf screen-min-y) (decf screen-max-y) (touch scr) (refresh scr) - (refresh p pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x)) - (:down (incf pad-min-y) (incf screen-min-y) (incf screen-max-y) (touch scr) (refresh scr) - (refresh p pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x)) - (:left (decf pad-min-x) (decf screen-min-x) (decf screen-max-x) (touch scr) (refresh scr) - (refresh p pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x)) - (:right (incf pad-min-x) (incf screen-min-x) (incf screen-max-x) (touch scr) (refresh scr) - (refresh p pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x)) - (#\q (return-from event-case)) - (otherwise nil))) - - (close p) - (close sp)))) - -(defun t26 () - "Test accessors of window and cursor locations." - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible t :enable-colors t :stacked t) - (let ((win (make-instance 'window :height 5 :width 20 :location (list 0 0) :stacked t))) - - (setf (background scr) (make-instance 'complex-char :color-pair '(:white :red)) - (background win) (make-instance 'complex-char :color-pair '(:black :yellow))) - - (refresh-stack) - (get-char scr) - - (setf (location win) (list 2 4)) - (refresh-stack) - (get-char scr) - - (setf (location-y win) 4) - (refresh-stack) - (get-char scr) - - (setf (location-x win) 8) - (refresh-stack) - (get-char scr) - - (setf (cursor-position win) (list 0 0)) - (princ "a" win) - (refresh-stack) - (get-char scr) - - (setf (cursor-position-y win) 2) - (princ "b" win) - (refresh-stack) - (get-char scr) - - (setf (cursor-position-x win) 4) - (princ "c" win) - (refresh-stack) - (get-char scr)))) - -(defun t27 () - "Use run-event-loop and bind instead of event-case to handle keyboard events." - (with-screen (scr :input-echoing nil :input-blocking t) - - ;; q ends the loop. - (bind scr #\q 'exit-event-loop) - - ;; The event handler function has to take two arguments, the window and the event. - - ;; a and s add a string to the window. - (bind scr #\a (lambda (win event) (format win "Hello there.~%"))) - (bind scr #\s (lambda (win event) (format win "Dear John.~%"))) - - ;; d clears the window. - (bind scr #\d (lambda (win event) (clear win))) - - ;; u unbinds a - (bind scr #\u (lambda (win event) (unbind scr #\a))) - - (clear scr) - (add-string scr "Type a, s or d. Type q to quit.") - (refresh scr) - - (run-event-loop scr))) - -(defun t28-hello (win event) - (format win "Hello there ~A.~%" event)) - -(defun t28-clear (win event) - (declare (ignore event)) - (clear win)) - -(defparameter *t28-map* - (make-instance 'keymap :bindings-plist - (list - #\q 'exit-event-loop - #\a 't28-hello - #\d 't28-clear)) - "Define a keymap separately and then set it as a window's event handlers before running the event loop.") - -(defun t28 () - "Use run-event-loop and a pre-defined event handler alist. Use a default handler." - (with-screen (scr :input-echoing nil :input-blocking t) - ;; add the separately defined keymap to the window object. - (setf (keymap scr) *t28-map*) - - ;; add another event handler - (bind scr #\s (lambda (win event) (format win "Dear John ~A~%" event))) - - ;; t is the default handler for all events without defined handlers. - ;; The default event handler should not be used to handle the nil event when input-blocking is nil - (bind *t28-map* t (lambda (win event) (format win "Default event handler ~A~%" event))) - - (clear scr) - (add-string scr "Type a, s or d. Type q to quit.") - (refresh scr) - - (run-event-loop scr))) - -(defun t28a () - "Test the use of the run-event-loop with non-blocking events." - (with-screen (scr :input-echoing nil :input-blocking nil) - - (setf (keymap scr) *t28-map*) - - (bind scr #\s (lambda (win event) (format win "Dear John ~A~%" event))) - - ;; The handler function for the nil event will be called between keyboard events. - (bind scr nil (lambda (win event) (format win "sleep ~A " event))) - - (clear scr) - (add-string scr "Type a, s or d. Type q to quit.") - (refresh scr) - - ;; Set the rate at which the nil event will be handled in fps (frames per second). - ;; For the same effect as frame-rate of 1, you can set :input-blocking to 1000 ms. - (setf (frame-rate scr) 1) - - (run-event-loop scr))) - -(defun draw-t29-shapes (window shapes &optional squarify) - "Draw a list of shapes to window." - (clear window) - (unless (listp shapes) (setf shapes (list shapes))) - (dolist (s shapes) - (draw-shape window s squarify))) - -;; Assumes an 80x24 terminal -(defun t29 () - "Draw an ASCII-art tree to illustrate the use of shapes." - (with-screen (scr :input-blocking t :enable-colors t :input-echoing nil :cursor-visible nil :input-buffering nil) - (let* ((leaf-char (make-instance 'complex-char :simple-char #\O :color-pair '(:green :black))) - (trunk-char (make-instance 'complex-char :simple-char #\H :color-pair '(:white :black))) - (ground-char (make-instance 'complex-char :simple-char #\i :color-pair '(:green :black))) - (sun-char (make-instance 'complex-char :simple-char #\o :color-pair '(:yellow :black))) - - (tree-trunk (rectangle 19 27 5 4 :filled t :char trunk-char)) - (upper-crown (triangle 4 29 12 22 12 35 :filled t :char leaf-char)) - (lower-crown (triangle 8 29 18 20 18 37 :filled t :char leaf-char)) - (tree-crown (merge-shapes upper-crown lower-crown)) - (ground (line 23 0 23 80 :char ground-char)) - (sun (circle 5 6 2 :char sun-char :filled t))) - - (draw-t29-shapes scr (list tree-trunk tree-crown ground sun) t) - ;; wait for a keypress - (get-char scr) - - ;; redraw with squarify nil - (draw-t29-shapes scr (list tree-trunk tree-crown ground sun) nil) - (get-char scr) ))) - -(defun t30 () - "Test color pair completion for style parameters." - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) - (with-windows ((w1 :height 5 :width 5 :location '(0 0)) - (w2 :height 5 :width 5 :location '(0 5)) - (w3 :height 5 :width 5 :location '(0 10))) - (setf (background w1) (make-instance 'complex-char :color-pair '(:black :cyan)) - (background w2) (make-instance 'complex-char :color-pair '(:black :magenta)) - (background w3) (make-instance 'complex-char :color-pair '(:black :white))) - ;; the character style contains only one color - ;; the fg/bg of the target window is used to complete the color pair. - (let ((s1 (list :attributes '(:bold) :fgcolor :red)) - (s2 (list :attributes '(:bold) :bgcolor :yellow))) - (add w1 #\a :y 2 :x 2 :style s1) - (add w2 #\b :y 2 :x 2 :style s1) - (add w3 #\c :y 2 :x 2 :style s2)) - (refresh w1) - (refresh w2) - (refresh w3) - (get-char w1)))) - -;; the ncurses window background property and the color-pair apparently set the same internal variable -;; setting one to nil sets the other to nil. -;; croatoan does not do that. here, the window color if it is set overrides the background property. -;; if a color parameter is directly passed, it overrides both the window color-pair and background. -(defun t31 () - "Test color pair completion for fgcolor and bgcolor parameters." - (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) - (add-string scr "default colors" :y 0 :x 0) (refresh scr) (get-char scr) - - (setf (color-pair scr) '(:yellow :blue)) - (add-string scr "color-pair yellow on blue" :y 1 :x 0) (refresh scr) (get-char scr) - - ;; text is not printed red on white because the color-pair overrides the background color. - (setf (background scr nil) (make-instance 'complex-char :simple-char #\- :color-pair '(:red :white))) - (add-string scr " background red on white" :y 2 :x 0) (refresh scr) (get-char scr) - - (setf (color-pair scr) '(:blue :yellow)) - (add-string scr "color-pair blue on yellow" :y 3 :x 0) (refresh scr) (get-char scr) - - ;; text is not printed red on white because the color-pair overrides the background color. - (setf (background scr nil) (make-instance 'complex-char :simple-char #\space :color-pair '(:white :red))) - (add-string scr " background white on red" :y 4 :x 0) (refresh scr) (get-char scr) - - ;; now when we set the color-pair to nil, the text is printed in background colors. - (setf (color-pair scr) nil) - (add-string scr "color-pair nil" :y 5 :x 0) (refresh scr) (get-char scr) - - ;; when we then also set the background to nil, the text is displayed in default white on black. - (setf (background scr nil) nil) - (add-string scr " background nil" :y 6 :x 0) (refresh scr) (get-char scr) - - (add-string scr "fgcolor red bgcolor cyan" :y 7 :x 0 :fgcolor :red :bgcolor :cyan) (refresh scr) (get-char scr) - (add-string scr "fgcolor red (bgcolor default)" :y 8 :x 0 :fgcolor :red) (refresh scr) (get-char scr) - (add-string scr "(fgcolor default) bgcolor cyan" :y 9 :x 0 :bgcolor :cyan) (refresh scr) (get-char scr) - - (setf (color-pair scr) '(:yellow :blue)) - ;; the color parameters override the color-pair window property - (add-string scr "color pair yellow on blue, then fgcolor red" :y 10 :x 0 :fgcolor :red) (refresh scr) (get-char scr) - (add-string scr "color pair yellow on blue, then bgcolor cyan" :y 11 :x 0 :bgcolor :cyan) (refresh scr) (get-char scr) - - ;; the background is ignored because color-pair is set - (setf (background scr nil) (make-instance 'complex-char :simple-char #\. :color-pair '(:white :red))) - (add-string scr "fgcolor red" :y 12 :x 0 :fgcolor :red) (refresh scr) (get-char scr) - (add-string scr "bgcolor cyan" :y 13 :x 0 :bgcolor :cyan) (refresh scr) (get-char scr) - - ;; when the pair is set to nil, the background is used again. - (setf (color-pair scr) nil) - (add-string scr "fgcolor magenta" :y 14 :x 0 :fgcolor :magenta) (refresh scr) (get-char scr) - (add-string scr "bgcolor cyan" :y 15 :x 0 :bgcolor :cyan) (refresh scr) (get-char scr) )) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/evolution.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/evolution.lisp deleted file mode 100644 index ee688e0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/evolution.lisp +++ /dev/null @@ -1,311 +0,0 @@ -(in-package :de.anvi.croatoan.test) - -;; Example from "Land of Lisp", Copyright by Conrad Barski. -;; Source: http://landoflisp.com/evolution.lisp -;; Unknown licence. - -(defparameter *width* 100) -(defparameter *height* 30) -(defparameter *jungle* '(45 10 10 10)) -(defparameter *plant-energy* 80) -(defparameter *plants* (make-hash-table :test #'equal)) -(defparameter *reproduction-energy* 200) - -(defstruct animal x y energy dir genes) - - -(defun random-plant (left top width height) - (let ((pos (cons (+ left (random width)) - (+ top (random height))))) - (setf (gethash pos *plants*) t))) - -(defun add-plants () - ;; First one in the jungle. - (apply #'random-plant *jungle*) - ;; Then one in the rest of the world. - (random-plant 0 0 *width* *height*)) - -;; Define one starting animal. -(defparameter *animals* - (list (make-animal :x (ash *width* -1) - :y (ash *height* -1) - :energy 1000 - :dir 0 - :genes (loop repeat 8 collect (1+ (random 10)))))) - -(defun move- (animal) - (let ((dir (animal-dir animal)) - (x (animal-x animal)) - (y (animal-y animal))) - - ;; If x>width, wrap around the world border with the mod function. - (setf (animal-x animal) - (mod (+ x (cond ((and (>= dir 2) (< dir 5)) 1) - ((or (= dir 1) (= dir 5)) 0) - (t -1)) - *width*) - *width*)) - - ;; Down is +1, up is -1. - (setf (animal-y animal) - (mod (+ y (cond ((and (>= dir 0) (< dir 3)) -1) - ((and (>= dir 4) (< dir 7)) 1) - (t 0)) - *height*) - *height*)) - - (decf (animal-energy animal)))) - -(defun turn (animal) - (let ((x (random (apply #'+ (animal-genes animal))))) - (labels ((angle (genes x) - (let ((xnu (- x (car genes)))) - (if (< xnu 0) - 0 - (1+ (angle (cdr genes) xnu)))))) - - (setf (animal-dir animal) - (mod (+ (animal-dir animal) - (angle (animal-genes animal) x)) - 8))))) - -(defun eat (animal) - (let ((pos (cons (animal-x animal) (animal-y animal)))) - (when (gethash pos *plants*) - (incf (animal-energy animal) *plant-energy*) - (remhash pos *plants*)))) - -(defun reproduce (animal) - (let ((e (animal-energy animal))) - (when (>= e *reproduction-energy*) - (setf (animal-energy animal) (ash e -1)) - (let ((animal-nu (copy-structure animal)) - (genes (copy-list (animal-genes animal))) - (mutation (random 8))) - ;; mutate a random gene by +1 or -1. - (setf (nth mutation genes) - (max 1 (+ (nth mutation genes) (random 3) -1))) - ;; deep copy of the gene list. - (setf (animal-genes animal-nu) genes) - ;; push the new animal to the list. - (push animal-nu *animals*))))) - -(defun update-world () - ;; Remove dead animals. - (setf *animals* - (remove-if (lambda (animal) (<= (animal-energy animal) 0)) - *animals*)) - ;; Do what animals do. - (mapc (lambda (animal) - (turn animal) - (move- animal) - (eat animal) - (reproduce animal)) - *animals*) - ;; Grow plants. - (add-plants)) - -;;; simple non-ncurses version from LOL, prints to REPL. -(defun draw-world () - (loop for y - below *height* - do (progn (fresh-line) - ;; beginning of the line. - (princ "|") - (loop for x - below *width* - do (princ (cond - ;; if there is one or more animals, print a M. - ((some (lambda (animal) (and (= (animal-x animal) x) - (= (animal-y animal) y))) - *animals*) - #\M) - ;; if there is a plant, print * - ((gethash (cons x y) *plants*) #\*) - ;; if there is neithe a plant nor an animal, print a space. - (t #\space)))) - ;; end of the line. - (princ "|")))) - -;; enter a recursive infinite loop as the programs main loop. -(defun evolution () - (draw-world) - ;; add an empty line between worlds. - (fresh-line) - (let ((str (read-line))) - (cond ((equal str "quit") ()) - (t (let ((x (parse-integer str :junk-allowed t))) - (if x - (loop for i - below x - do (update-world) - if (zerop (mod i 1000)) - do (princ #\.)) - (update-world)) - (evolution)))))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;; instead of using princ to draw to stdout, use add-string to draw to the curses screen. -;; the screen has to be initialized first in the main function evolve. -(defun draw-world-croatoan (scr) - (loop - for y - from 0 - below *height* - do (loop - for x - from 0 - below *width* - do (add-string scr - (format nil "~A" - (cond - ;; if there is one or more animals, print a M. - ((some (lambda (animal) (and (= (animal-x animal) x) - (= (animal-y animal) y))) - *animals*) - #\M) - ;; if there is a plant, print * - ((gethash (cons x y) *plants*) #\*) - ;; if there is neithe a plant nor an animal, print a space. - (t #\space))) - :y y - :x x))) - ;; refresh the physical screen to dsplay the drawn changes. - (refresh scr)) - -;; enter a recursive infinite loop as the programs main loop. -(defun evolve () - (with-screen (scr :input-blocking nil :input-echoing nil :cursor-visible nil) - (clear scr) - (setf (background scr) (make-instance 'complex-char :color-pair '(:green :white))) - - (setq *width* (width scr)) - (setq *height* (height scr)) - - (loop - initially - (draw-world-croatoan scr) - - for ch = (get-char scr) - - while (or (= ch -1) (not (equal (code-char ch) #\q))) - do - (update-world) - (sleep 0.001) - (draw-world-croatoan scr)))) - -;; uses tagbody to separate between event handling and body. -(defun evolve2 () - (with-screen (scr :input-blocking nil :input-echoing nil :cursor-visible nil) - (clear scr) - (setf (background scr) (make-instance 'complex-char :color-pair '(:green :white))) - - (setq *width* (width scr)) - (setq *height* (height scr)) - - (draw-world-croatoan scr) - (refresh scr) - - (loop - (tagbody - - ;; read a char. - (let ((ch (get-char scr))) - - ;; if it is -1, just execute the body. - ;; this is a special event when there is no event. - (cond ((= ch -1) (go evolution-body)) - - ;; And from here we have real key/character events. - ((equal (code-char ch) #\q) (return)))) - - evolution-body - - (update-world) - (sleep 0.001) - (draw-world-croatoan scr) - (refresh scr))))) - -;; uses key-pressed-p to separate between events and the body, instead of loop and tagbody used in 1 and 2. -(defun evolve3 () - (with-screen (scr :input-blocking nil :input-echoing nil :cursor-visible nil) - (clear scr) - ;(setf (background scr) (make-instance 'complex-char :color-pair '(:green :white))) - - (setq *width* (width scr)) - (setq *height* (height scr)) - - (draw-world-croatoan scr) - - (loop - (if (key-pressed-p scr) - (let ((ch (get-char scr))) - (cond ((equal (code-char ch) #\q) (return)))) - (progn - (update-world) - (sleep 0.001) - (draw-world-croatoan scr) ))))) - -(defun evolve4 () - "Uses get-event to separate between events and the body, instead of key-pressed-p." - (with-screen (scr :input-blocking nil :input-echoing nil :cursor-visible nil) - (clear scr) - ;(setf (background scr) (make-instance 'complex-char :color-pair '(:green :white))) - - (setq *width* (width scr)) - (setq *height* (height scr)) - - (draw-world-croatoan scr) - - (loop - (let ((event (get-event scr))) - (if event - (case event - (#\q (return))) - (progn - (update-world) - (sleep 0.001) - (draw-world-croatoan scr) )))))) - -(defun evolve5 () - "Use the event-case macro for event handling." - (with-screen (scr :input-blocking nil :input-echoing nil :cursor-visible nil) - (clear scr) - - (setq *width* (width scr)) - (setq *height* (height scr)) - - (draw-world-croatoan scr) - - (event-case (scr event) - (#\q (return-from event-case)) - ((nil) - (update-world) - (sleep 0.001) - (draw-world-croatoan scr))))) - -(defun update-game-state (win event) - "Main game state update function for evolve6, called during the nil event handling." - (declare (ignore event)) - (update-world) - (draw-world-croatoan win)) - -(defun evolve6 () - "Use the run-event-loop for event handling." - (with-screen (scr :input-blocking nil :input-echoing nil :cursor-visible nil) - (clear scr) - - (setq *width* (width scr)) - (setq *height* (height scr)) - - (bind scr #\q 'exit-event-loop) - (bind scr nil 'update-game-state) - - ;; For the same effect, set :input-blocking to 1 milisecond. - (setf (frame-rate scr) 1000) - - ;; Draw the world once before entering the main loop. - (draw-world-croatoan scr) - - (run-event-loop scr))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/ncurses.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/ncurses.lisp deleted file mode 100644 index 39effcb..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/ncurses.lisp +++ /dev/null @@ -1,137 +0,0 @@ -(in-package :de.anvi.croatoan.test) - -;; here the ncurses primitive bindings should be tested. - -(defun nctest () - (%initscr) - (%mvaddstr 0 0 "hello there") - (%mvaddstr 7 7 "hello there") - (%mvaddstr 15 15 "hello there") - (%refresh) - (%getch) - (%endwin)) - -(defun nctest2 () - (let ((scr (%initscr))) - (%mvaddstr 0 0 "hello there") - - (%wattron scr #x00020000) - (%mvaddstr 7 7 "hello there") - (%wattroff scr #x00020000) - - (%wattron scr #x80000000) - (%mvaddstr 15 15 "hello there") - (%wattroff scr #x80000000) - - (%wrefresh scr) - (%wgetch scr) - (%endwin))) - -(defun nctest3 () - (%initscr) - (%start-color) - (%init-pair 1 1 3) ; red(1) on yellow(3) - - ;; extract and display the foreground and background color numbers from the pair number - (with-foreign-objects ((ptr-f :short) - (ptr-b :short)) - (%pair-content 1 ptr-f ptr-b) - (%mvaddstr 0 0 (format nil "1 ~A, 3 ~A" (mem-aref ptr-f :short) (mem-aref ptr-b :short)))) - - ;; extract and display the RGB contents of predefined color no. 3 (yellow). - (with-foreign-objects ((ptr-r :short) - (ptr-g :short) - (ptr-b :short)) - (%color-content 3 ptr-r ptr-g ptr-b) - (%mvaddstr 1 0 (format nil "~3A ~3A ~3A" - (mem-aref ptr-r :short) - (mem-aref ptr-g :short) - (mem-aref ptr-b :short)))) - (%refresh) - (%getch) - (%endwin)) - -(defun nctest4 () - "Test low-level cchar_t reading and writing. - -The output is: - -a rendered cchar_t -97 code of character #\a -1 color pair 1 -00020100 attribute underline #x00020000 OR-ed with bit-shifted color pair 1 - -We see that the attr_t slot contains _both_ the attribute _and_ the -bit-shifted color pair, as if it were a chtype in ABI5. - -When ABI6 is used, the separate color-pair slot contains the same color -pair number. - -The goal is obviously to make the cchar_t usable under both ABI5 and ABI6." - (let ((scr (%initscr))) - (%start-color) - (%init-pair 1 1 3) ; red(1) on yellow(3) - - (with-foreign-objects ((ptr '(:struct cchar_t)) - (wch 'wchar_t 5)) - (dotimes (i 5) (setf (mem-aref wch 'wchar_t i) 0)) - (setf (mem-aref wch 'wchar_t) (char-code #\a)) - ;;(%setcchar ptr wch attr_t color-pair-number (null-pointer)) - (%setcchar ptr wch #x00020000 1 (null-pointer)) - (%wadd-wch scr ptr)) - - ;; access the struct slots directly using slot pointers - (with-foreign-object (ptr '(:struct cchar_t)) - (%mvwin-wch scr 0 0 ptr) - (let* ((char (mem-aref (foreign-slot-pointer ptr '(:struct cchar_t) 'cchar-chars) 'wchar_t 0)) - (col (foreign-slot-value ptr '(:struct cchar_t) 'cchar-colors)) - (attr (foreign-slot-value ptr '(:struct cchar_t) 'cchar-attr))) - ;; char code - (%mvaddstr 1 0 (format nil "~A" char)) - ;; color pair number - (%mvaddstr 2 0 (format nil "~A" col)) - ;; attr_t in hex. - (%mvaddstr 3 0 (format nil "~8,'0x" attr)))) - - ;; deconstruct cchar_t using getcchar - (with-foreign-objects ((wcval '(:struct cchar_t)) - (wch 'wchar_t 5) - (attrs 'attr_t) - (color-pair :short)) - (dotimes (i 5) (setf (mem-aref wch 'wchar_t i) 0)) - (%mvwin-wch scr 0 0 wcval) - (%getcchar wcval wch attrs color-pair (null-pointer)) - - (%mvaddstr 5 0 (format nil "~A" (mem-aref wch 'wchar_t 0))) - (%mvaddstr 6 0 (format nil "~A" (mem-aref color-pair :short))) - (%mvaddstr 7 0 (format nil "~8,'0x" (mem-aref attrs 'attr_t)))) - - (%refresh) - (%getch) - (%endwin))) - -;; 190302 -(defun nctest5 () - (let ((scr (%initscr))) - (%addstr (format nil "~A~%" "no background ")) - (%wgetch scr) - - (%wbkgd scr (char-code #\-)) - (%addstr (format nil "~A~%" "background minus ")) - (%wgetch scr) - - (%wbkgd scr (char-code #\*)) - (%addstr (format nil "~A~%" "background star ")) - (%wgetch scr) - - (%wbkgd scr (char-code #\-)) - (%addstr (format nil "~A~%" "background minus ")) - (%wgetch scr) - - (%wbkgd scr (char-code #\+)) - (%addstr (format nil "~A~%" "background plus ")) - (%wgetch scr) - - (%wrefresh scr) - (%wgetch scr) - (%endwin))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/package.lisp deleted file mode 100644 index 48cb087..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/package.lisp +++ /dev/null @@ -1,127 +0,0 @@ -(defpackage #:de.anvi.croatoan.test - (:documentation "Tests and examples demonstrating the use of the croatoan API.") - (:use #:common-lisp #:cffi #:de.anvi.ncurses #:de.anvi.croatoan) - (:shadowing-import-from #:de.anvi.croatoan callback) - (:export - - ;; ncurses.lisp - #:nctest - #:nctest2 - #:nctest3 - #:nctest4 - #:nctest5 - - ;; unicode.lisp - #:ut01 - #:ut02 - #:ut02b - #:ut03 - #:ut04 - - ;; clos.lisp - #:t00 - #:t01 - #:t02 - #:t02a - #:t02b - #:t02c - #:t03 - #:t03a - #:t03a2 - #:t03b - #:t03b2 - #:t03b3 - #:t03c - #:t03d - #:t03d2 - #:t03e - #:t04 - #:t04a - #:t04b - #:t05 - #:t06 - #:t06a - #:t07 - #:t07a - #:t08 - #:t08a - #:t08b - #:t08c - #:t09 - #:t09a - #:t09b - #:t09c - #:t10 - #:t10a - #:t11 - #:t11a - #:t12 - #:t12a - #:t12b - #:t12c - #:t12c2 - #:t12d - #:t13 - #:t14 - #:t14a - #:t14b - #:t14c - #:t15 - #:t15a - #:t15b - #:t16 - #:t16a - #:t16b - #:t16c - #:t16d - #:t16e - #:t16f - #:t16g - #:t16h - #:t16i - #:t17 - #:t17a - #:t18 - #:t18a - #:t19 - #:t19a - #:t19b - #:t19b2 - #:t19c - #:t19c2 - #:t19c3 - #:t19d - #:t19e - #:t19e2 - #:t19f - #:t19g - #:t20 - #:t20a - #:t20b - #:t20c - #:t21 - #:t22 - #:t23 - #:t24 - #:t25 - #:t26 - #:t27 - #:t28 - #:t28a - #:t29 - #:t30 - #:t31 - - ;; clos.lisp - #:matrix - #:matrix2 - #:matrix3 - #:matrix4 - #:snake - #:snake2 - #:tetris - #:pipes - - ;; evolution.lisp - #:evolve5 - #:evolve6)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/tetris.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/tetris.lisp deleted file mode 100644 index 15e1d34..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/tetris.lisp +++ /dev/null @@ -1,148 +0,0 @@ -(in-package :de.anvi.croatoan.test) - -(defun tetris () - (let ((scr (make-instance 'screen :input-echoing nil :input-blocking nil :enable-function-keys t :cursor-visible nil))) - (unwind-protect - - (let* ((board (make-array '(20 10) :initial-element nil)) - (pieces - -'((((0 0) (0 1) (0 2) (1 1)) ((0 1) (1 0) (2 1) (1 1)) ((1 0) (0 1) (1 2) (1 1)) ((0 0) (1 0) (2 0) (1 1))) ;T - (((0 0) (0 1) (0 2) (1 0)) ((0 0) (0 1) (2 1) (1 1)) ((1 0) (1 1) (1 2) (0 2)) ((0 0) (1 0) (2 0) (2 1))) ;L - (((0 0) (0 1) (0 2) (1 2)) ((0 1) (1 1) (2 1) (2 0)) ((0 0) (1 0) (1 2) (1 1)) ((0 0) (0 1) (1 0) (2 0))) ;J - (((1 0) (0 1) (0 2) (1 1)) ((0 0) (1 0) (2 1) (1 1)) ((1 0) (0 1) (0 2) (1 1)) ((0 0) (1 0) (2 1) (1 1))) ;S - (((0 0) (0 1) (1 2) (1 1)) ((1 0) (0 1) (2 0) (1 1)) ((0 0) (0 1) (1 2) (1 1)) ((1 0) (0 1) (2 0) (1 1))) ;Z - (((0 0) (0 1) (1 0) (1 1)) ((0 0) (0 1) (1 0) (1 1)) ((0 0) (0 1) (1 0) (1 1)) ((0 0) (0 1) (1 0) (1 1))) ;O - (((0 0) (0 1) (0 2) (0 3)) ((0 0) (1 0) (2 0) (3 0)) ((0 0) (0 1) (0 2) (0 3)) ((0 0) (1 0) (2 0) (3 0)))));I - - (position '(0 3)) - (orientation 0) - (style 0) - (piece (nth orientation (nth style pieces)))) - - (labels (;; check whether we left the board. - (boundary-crossed-p (piece position) - (loop - for i in piece - for j = (mapcar #'+ i position) - do - (when (or (> (cadr j) 9) (< (cadr j) 0)) - (return t)))) - - (bottom-reached-p (piece position) - (loop - for i in piece - for j = (mapcar #'+ i position) - do - (when (> (car j) 19) - (return t)))) - - ;; check whether the piece coordinates are non-nil on the board. - (collision-occured-p (board piece position) - (loop - for i in piece - for j = (mapcar #'+ i position) - do - (when (aref board (car j) (cadr j)) - (return t)))) - - (move-permissible-p (board piece next-position) - (not (or (boundary-crossed-p piece next-position) - (bottom-reached-p piece next-position) - (collision-occured-p board piece next-position)))) - - (add-new-piece () - (setf style (random 7)) - (setf orientation 0) - (setf piece (elt (elt pieces style) 0)) - (setf position '(0 3))) - - ;; add piece to board. - (update-board () - (loop - for i in piece - for j = (mapcar #'+ i position) - do - (setf (aref board (car j) (cadr j)) t))) - - (remove-line (board m) - (loop for i from m above 0 do - (loop for j from 0 to 9 do - (setf (aref board i j) (aref board (1- i) j))))) - - ;; find geht nicht, wir muessen checken ob _alle_ t sind. - (remove-complete-lines () - (loop for i from 0 to 19 do - (when (every #'identity (loop for j from 0 to 9 for y = (aref board i j) collect y)) - (remove-line board i)))) - - (draw-board-and-piece () - ;; first, draw the board - (loop for line from 0 to 19 do - (loop for column from 0 to 9 do - (move scr line column) - (if (aref board line column) - (princ "x" scr) - (princ "_" scr)))) - ;; add coord of position to every coord of piece - ;; then draw the piece - (loop - for i in piece - for j = (mapcar #'+ i position) - do - (move scr (car j) (cadr j)) - (princ "x" scr)) - (refresh scr)) - - ;; down #c(-1 0), left #c(-1 0), right #c(1 0) - (move-piece (direction) - (let ((next-position (list (- (car position) (imagpart direction)) - (+ (cadr position) (realpart direction))))) - (if (move-permissible-p board piece next-position) - (setf position next-position) - ;; when sideways move not permissible: do nothing. - ;; when downwards move not permissible: add piece to board, start new piece. - (unless (zerop (imagpart direction)) - (update-board) - (remove-complete-lines) - (add-new-piece)))) - (draw-board-and-piece)) - - (rotate-piece () - (let ((next-piece (elt (elt pieces style) (mod (+ orientation 1) 4)))) - (when (move-permissible-p board next-piece position) - (setf orientation (mod (+ orientation 1) 4)) - (setf piece (elt (elt pieces style) orientation)) - (draw-board-and-piece)))) - - (drop-piece () - (loop - (let ((next-position (list (1+ (car position)) (cadr position)))) - (if (move-permissible-p board piece next-position) - (setf position next-position) - (return)))) - (update-board) - (remove-complete-lines) - (add-new-piece) - (draw-board-and-piece))) - - ;; clear screen before starting. - (clear scr) - (refresh scr) - - ;; navigate with the arrow keys, q to quit. - (loop - (let ((event (get-event scr))) - (if event - (case event - (:up (rotate-piece)) - (:down (drop-piece)) - (:right (move-piece #c(1 0))) - (:left (move-piece #c(-1 0))) - (#\q (return))) - (progn - (move-piece #c(0 -1)) - (sleep 0.3))))))) - - ;; cleanly close ncurses at the end. - (close scr)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/unicode.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/unicode.lisp deleted file mode 100644 index decbb04..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/unicode.lisp +++ /dev/null @@ -1,116 +0,0 @@ -(in-package :de.anvi.croatoan.test) - -;; Tested in xterm and Gnome Terminal. -;; Doesn't work in the Linux console and aterm. - -;; Unicode strings are supported by the default non-unicode ncurses API (addstr) as long as libncursesw is used. -;; Special wide-char string functions (addwstr, add_wchstr) do not have to be used. -(defun ut01 () - (%initscr) - - (%mvaddstr 2 2 "ÄÄććššđđžž") - (%mvaddstr 4 6 "öäüüüßß") - (%mvaddstr 6 8 "Без муки нет науки - no pain, no gain") - (%mvaddstr 8 10 "指鹿為馬 - point deer, make horse") - (%mvaddstr 10 12 "μολὼν λαβέ / ΜΟΛΩΠΛΑΒΕ - come and get it") - - (%refresh) - (%getch) - (%endwin)) - -;; For displaying single unicode chars, addch functions do not work, and we have to use add_wch explicitly. -;; The data type also changes, from the integral chtype for addch, to the cchar_t struct for add_wch. -;; Use the cchar type for convert-to-foreign via a plist. -;; cchar-chars isnt a pointer to an integer array here, but an integer. -(defun ut02 () - (let ((scr (%initscr))) - - ;; %add-wch - ;; Add #\CYRILLIC_SMALL_LETTER_SHA = #\ш to the stdscr. - (with-foreign-object (ptr '(:struct cchar)) - (setf ptr (convert-to-foreign (list 'cchar-attr 0 'cchar-chars (char-code #\ш)) - '(:struct cchar))) - (%add-wch ptr)) - - ;; %wadd-wch - ;; #\CYRILLIC_CAPITAL_LETTER_LJE = #\Љ - (with-foreign-object (ptr '(:struct cchar)) - (setf ptr (convert-to-foreign (list 'cchar-attr #x00020000 'cchar-chars (char-code #\Љ)) - '(:struct cchar))) - (%wadd-wch scr ptr)) - - (%wrefresh scr) - (%wgetch scr) - (%endwin))) - -(defun ut02b () - (let ((scr (%initscr))) - (%start-color) - (%init-pair 1 1 3) ; red(1) on yellow(3) - - ;; %wadd-wch - ;; #\CYRILLIC_CAPITAL_LETTER_LJE = #\Љ - (with-foreign-object (ptr '(:struct cchar_t)) - ;; 2 is the attribute, 1 is the color pair, the color doesnt work with convert-to-foreign - ;;(setf ptr (convert-to-foreign (list 'cchar-attr #x00020100 'cchar-chars (char-code #\Љ) 'cchar-colors 1) - ;; '(:struct cchar_t))) - - ;; we have to set each slot manually in order to make the extended colors work. - (setf (foreign-slot-value ptr '(:struct cchar_t) 'cchar-attr) #x00020100) - (setf (foreign-slot-value ptr '(:struct cchar_t) 'cchar-colors) 1) - ;; also with cchar_t, we can not use convert to foreign at all, but have to manually add the char - ;; at the first place in the char array. - (setf (mem-aref - (foreign-slot-pointer ptr '(:struct cchar_t) 'cchar-chars) - 'wchar_t - 0) - (char-code #\Љ)) - (%wadd-wch scr ptr)) - - (%wrefresh scr) - (%wgetch scr) - (%endwin))) - -;; We do not need special "wide character" functions for displaying single UTF-8 characters. -;; We can just use the string output function %waddstr. -;; Here, the underlying %waddstr powers the gray stream interface displaying UTF-8. -(defun ut03 () - (with-screen (scr) - ;; Even though we have a control STRING, format still writes the char - ;; arguments char by char with write-char. - (format scr "~C ~A" #\Љ #\ш) - (terpri scr) - (format scr "Без муки нет науки") - (terpri scr) - (format scr "指鹿為馬") - (terpri scr) - (format scr "μολὼν λαβέ / ΜΟΛΩΠΛΑΒΕ") - (terpri scr) - (refresh scr) - (get-char scr))) - -;; Use the cchar_t type for setcchar. -;; cchar-chars is a pointer to an integer array here, like the C prototype requires. -(defun ut04 () - (let ((scr (%initscr))) - (%start-color) - ;; Initialize color pair 1, yellow 3 on red 1. - (%init-pair 1 3 1) - - (with-foreign-objects ((ptr '(:struct cchar_t)) - (wch 'wchar_t 5)) - ;; Reset the wch array to zero. - (dotimes (i 5) (setf (mem-aref wch 'wchar_t i) 0)) - (setf (mem-aref wch 'wchar_t) (char-code #\ш)) - ;; Create a cchar_t containing #\ш, attribute underline, color pair yellow on red. - (%setcchar ptr wch #x00020000 1 (null-pointer)) - (%wadd-wch scr ptr) - (%waddch scr (char-code #\newline)) - ;; Take a look at the plist convert-from-foreign returns from cchar_t. - ;; Sadly that plist cant be read back because it contains a pointer. - ;; As of now, the convert-to-foreign function requires foreign values, not pointers. - (%waddstr scr (princ-to-string (convert-from-foreign ptr '(:struct cchar))))) - - (%wrefresh scr) - (%wgetch scr) - (%endwin))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/CHANGELOG b/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/CHANGELOG deleted file mode 100644 index ed86844..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/CHANGELOG +++ /dev/null @@ -1,71 +0,0 @@ -Version 0.9.2 -2015-05-21 -Fixed bug in READ-UNTIL (thanks to Michael Malis) -Fixed typo in documentation (thanks to Atif Haider) - -Version 0.9.1 -2007-11-16 -Fixed bug in SKIP-LEADING-WHITESPACE (thanks to Chaitanya Gupta) - -Version 0.9.0 -2007-03-09 -Hand down external format to included files (suggested by Igor Plekhov) - -Version 0.8.0 -2006-12-12 -Added TMPL_CALL (thanks to Marijn Haverbeke) - -Version 0.7.0 -2006-09-30 -Added TMPL_REPEAT - -Version 0.6.0 -2006-09-14 -Changed default for *VALUE-ACCESS-FUNCTION* -Added *STRING-MODIFIER* -Added ESCAPE-xxx functions (from CL-WHO) -Fixed docs for hyperdoc support -General documentation enhancements -Fixed test.lisp w.r.t. *FORMAT-NON-STRINGS* - -Version 0.5.0 -2006-09-08 -Added *FORMAT-NON-STRINGS* - -Version 0.4.0 -2006-04-03 -Added TMPL_UNLESS (requested by Igor Plekhov) - -Version 0.3.1 -2005-08-05 -Introduced *FORCE-DEFAULT* - -Version 0.3.0 -2005-07-03 -Introduced *TEMPLATE-OUTPUT* so template printers don't interfer with *STANDARD-OUTPUT* (proposed by Norman Werner) -Small enhancements to docs - -Version 0.2.0 -2005-06-09 -Added :DO-NOT-CACHE option to CREATE-TEMPLATE-PRINTER -Added clever DEFMETHOD trick by Peter Seibel -Fixed bug in READ-UNTIL which doesn't affect HTML-TEMPLATE -Better example in docs inspired by Bruce R. Lewis' critique on lisp-web -Mention asdf-install in docs -Added hyperdoc support -Added :HTML-TEMPLATE to *FEATURES* - -Version 0.1.2 -2003-07-15 -Argh, typo in index.html... :( - -Version 0.1.1 -2003-07-15 -Cleaner use of restarts thanks to James Anderson and Kent M. Pitman -Updated docs accordingly (removed stuff about OTHER-VALUE) -Removed ECL specific stuff (no longer necessary due to recent ECL fixes by Juan Jose Garcia Ripoll) -Corrected date of 0.1.0 release in CHANGELOG (don't laugh!) - -Version 0.1.0 -2003-07-15 -Initial release diff --git a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/INSTALLATION b/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/INSTALLATION deleted file mode 100644 index a3ca80b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/INSTALLATION +++ /dev/null @@ -1,33 +0,0 @@ -Installation of HTML-TEMPLATE - -1. Probably the easiest way is - - (load "/path/to/html-template/load.lisp") - - This should compile and load HTML-TEMPLATE on most Common Lisp - implementations. - -2. With MK:DEFSYSTEM you can make a symlink from 'html-template.system' - to your central registry and then issue the command - - (mk:compile-system "html-template") - - Note that this relies on TRUENAME returning the original file a - symbolic link is pointing to. With AllegroCL 6.2 this will only - work if you've applied all patches with (SYS:UPDATE-ALLEGRO). - -3. You can also use ASDF instead of MK:DEFSYSTEM in a similar way: - - (asdf:operate 'asdf:compile-op :html-template) - (asdf:operate 'asdf:load-op :html-template) - -After installing HTML-TEMPLATE you can LOAD the file "test.lisp" to -check if everything works as expected. - -Complete documentation for HTML-TEMPLATE can be found in the 'doc' -directory. - -HTML-TEMPLATE also supports Nikodemus Siivola's HYPERDOC, see - and -. - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/README.md b/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/README.md deleted file mode 100644 index 5b193e1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/README.md +++ /dev/null @@ -1,21 +0,0 @@ ---------------------------------------------------- -HTML-TEMPLATE - Use HTML templates from Common Lisp ---------------------------------------------------- - -HTML-TEMPLATE is a portable library for Common Lisp which can be used -to fill templates with arbitrary (string) values at runtime. -(Actually, it doesn't matter whether the result is HTML. It's just -very likely that this will be what the library is mostly used for.) - -It is loosely modeled after the Perl module HTML::Template and -partially compatible with a its syntax, though both libraries contain -some extensions that the other does not support. - -HTML-TEMPLATE translates templates into efficient closures which can -be re-used as often as needed. It uses an intelligent cache mechanism -so you can nevertheless update templates while your program is running -and have the changes take effect immediately. - -Complete documentation for HTML-TEMPLATE can be found in the `docs` -directory or at the [project documentation -site](https://edicl.github.io/html-template/). \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/api.lisp b/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/api.lisp deleted file mode 100644 index 4f52ce4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/api.lisp +++ /dev/null @@ -1,160 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: HTML-TEMPLATE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/html-template/api.lisp,v 1.22 2007-03-09 13:09:16 edi Exp $ - -;;; Copyright (c) 2003-2007, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package #:html-template) - -(defgeneric create-template-printer (template - &key force - element-type - if-does-not-exist - external-format) - (:documentation "Creates a template printer from TEMPLATE which is -an open input stream, a string, or a pathname. If FORCE is true a -printer will be newly created no matter what the state of the cache -is. If FORCE is :DO-NOT-CACHE the newly created printer won't be -cached. Other keyword arguments will be given to WITH-OPEN-FILE. -Keyword arguments will only be accepted if TEMPLATE is a PATHNAME.")) - -(defmethod create-template-printer ((input-stream stream) &rest rest) - (when rest - (signal-template-invocation-error - "This method doesn't accept keyword arguments")) - (let ((*standard-input* input-stream)) - (%create-template-printer-aux nil nil))) - -(defmethod create-template-printer ((string string) &rest rest) - (when rest - (signal-template-invocation-error - "This method doesn't accept keyword arguments")) - (with-input-from-string (*standard-input* string) - (%create-template-printer-aux nil nil))) - -(defmethod create-template-printer ((pathname pathname) - &key (force *force-default*) - (element-type #-:lispworks 'character - #+:lispworks 'lw:simple-char) - (if-does-not-exist :error) - (external-format *external-format*)) - (let* ((merged-pathname (merge-pathnames pathname - *default-template-pathname*)) - (file-write-date (or *no-cache-check* - (file-write-date merged-pathname)))) - (destructuring-bind (hashed-printer . creation-date) - ;; see if a printer for this pathname is in the cache - (or (gethash merged-pathname *printer-hash*) - '(nil . nil)) - (when (and hashed-printer - ;; and if we may use it - (not force) - ;; and if it's not too old (or maybe we don't have to - ;; check) - (or *no-cache-check* - (and file-write-date - (<= file-write-date creation-date)))) - (return-from create-template-printer hashed-printer)) - (let ((new-printer - ;; push this pathname onto stack of included files (so - ;; to say) to make sure a file can't include itself - ;; recursively - (let ((*included-files* (cons merged-pathname - *included-files*)) - (*external-format* external-format)) - (with-open-file (*standard-input* merged-pathname - :direction :input - :if-does-not-exist if-does-not-exist - :element-type element-type - :external-format external-format) - (%create-template-printer-aux nil nil))))) - ;; cache newly created printer (together with current time) - (unless (eq force :do-not-cache) - (setf (gethash merged-pathname *printer-hash*) - (cons new-printer (get-universal-time)))) - ;; optionally issue a warning - (when *warn-on-creation* - (warn "New template printer for ~S created" merged-pathname)) - new-printer)))) - -(defgeneric fill-and-print-template (template/printer values - &key stream - &allow-other-keys) - (:documentation "Fills the template denoted by TEMPLATE/PRINTER with -VALUES and print it to STREAM. If TEMPLATE/PRINTER is a function uses -it as if it were a template printer, otherwise creates a printer \(or -pull one out of the cache) with CREATE-TEMPLATE-PRINTER. Optional -keyword arguments are given to CREATE-TEMPLATE printer and can only be -used if TEMPLATE/PRINTER is a pathname.")) - -(defmethod fill-and-print-template ((function function) values - &rest rest - &key (stream *default-template-output*)) - (remf rest :stream) - (when rest - (signal-template-invocation-error - "This method doesn't accept keyword arguments other than STREAM")) - (let ((*template-output* stream)) - (funcall function values))) - -(defmethod fill-and-print-template ((string string) values - &rest rest - &key (stream *default-template-output*)) - (remf rest :stream) - (when rest - (signal-template-invocation-error - "This method doesn't accept keyword arguments other than STREAM")) - (let ((*template-output* stream)) - (funcall (create-template-printer string) values))) - -(defmethod fill-and-print-template ((input-stream stream) values - &rest rest - &key (stream *default-template-output*)) - (remf rest :stream) - (when rest - (signal-template-invocation-error - "This method doesn't accept keyword arguments other than STREAM")) - (let ((*template-output* stream)) - (funcall (create-template-printer input-stream) values))) - -(defmethod fill-and-print-template ((pathname pathname) values - &rest rest - &key (stream *default-template-output*)) - (remf rest :stream) - (let ((*template-output* stream)) - (funcall (apply #'create-template-printer pathname rest) values))) - -(defun clear-template-cache () - "Complete clears all template printers from the cache." - (clrhash *printer-hash*) - (values)) - -(defun delete-from-template-cache (pathname) - "Deletes the template printer denoted by PATHNAME from the -cache. Returns true if such a printer existed, false otherwise." - (remhash (merge-pathnames pathname - *default-template-pathname*) - *printer-hash*)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/docs/index.html b/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/docs/index.html deleted file mode 100644 index a4344ae..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/docs/index.html +++ /dev/null @@ -1,1472 +0,0 @@ - - - - - - HTML-TEMPLATE - Use HTML templates from Common Lisp - - - - - -

HTML-TEMPLATE - Use HTML templates from Common Lisp

- -
-
 

Abstract

- -HTML-TEMPLATE is a portable library for Common Lisp which can be used -to fill templates with arbitrary (string) values at runtime. -(Actually, it doesn't matter whether the result is HTML. It's just -very likely that this will be what the library is mostly used -for.) -

-It is loosely modeled after the Perl module HTML::Template and partially -compatible with a its syntax, though both libraries contain some -extensions that the other does not support. -

-HTML-TEMPLATE translates templates into efficient closures which -can be re-used as often as needed. It uses an intelligent cache -mechanism so you can nevertheless update templates while your program -is running and have the changes take effect immediately. -

-The rationale behind something like HTML-TEMPLATE or HTML::Template is -that you want to separate code and layout (I think in Newspeak these -are called the "Business Layer" and the "Presentation -Layer") as much as possible when generating HTML, especially if -you work with graphical artists who are responsible for the visual -appearance of your site but aren't programmers. Matter of fact, you -can't separate code and layout completely. I've worked (or -had to work) with several different approaches over the years, -including emitting HTML from CGI scripts directly, using tools like Embperl, Mason, PHP (yuk!), or Java/XML/XLST stuff, or -employing different Lisp markup -languages but found that HTML::Template's approach usually works -best for me: The graphical designers only need to learn a minimal set -of new tags and can update their templates independently from the work -done on the backend. It is simple and it just works. YMMV, of -course... -

-HTML-TEMPLATE is intended to be portable and should work with all -conforming Common Lisp implementations but is mainly tested and -deployed with LispWorks. Let us know if you encounter any -problems. -

-It comes with a BSD-style -license so you can basically do with it whatever you want. -

-HTML-TEMPLATE is used by Planet Lisp, Booble, and Heike Stephan. -

-Download shortcut: http://weitz.de/files/html-template.tar.gz. -

- -
 

Contents

-
    -
  1. Simple example -
  2. Download and installation -
  3. Support and mailing lists -
  4. Syntax -
  5. Semantics -
  6. The HTML-TEMPLATE dictionary -
      -
    1. Creating and using printers -
        -
      1. create-template-printer -
      2. fill-and-print-template -
      -
    2. The template cache -
        -
      1. clear-template-cache -
      2. delete-from-template-cache -
      3. *no-cache-check* -
      -
    3. Customization -
        -
      1. *template-start-marker* -
      2. *template-end-marker* -
      3. *default-template-pathname* -
      4. *default-template-output* -
      5. *convert-nil-to-empty-string* -
      6. *format-non-strings* -
      7. *sequences-are-lists* -
      8. *upcase-attribute-strings* -
      9. *string-modifier* -
      10. *template-symbol-package* -
      11. *force-default* -
      12. *value-access-function* -
      13. *call-template-access-function* -
      14. *call-value-access-function* -
      15. *ignore-empty-lines* -
      16. *warn-on-creation* -
      -
    4. Conditions -
        -
      1. template-error -
      2. template-invocation-error -
      3. template-missing-value-error -
      4. template-not-a-string-error -
      5. template-not-a-string-error-value -
      6. template-syntax-error -
      7. template-syntax-error-stream -
      8. template-syntax-error-line -
      9. template-syntax-error-col -
      -
    5. Escaping -
        -
      1. escape-string -
      2. *escape-char-p* -
      3. escape-string-minimal -
      4. escape-string-minimal-plus-quotes -
      5. escape-string-iso-8859-1 -
      6. escape-string-all -
      -
    -
  7. Acknowledgements -
- -
 

Simple example

- -Although there's a wealth of functions, special variables, condition -types, and restarts listed below, most of -the time you'll just have to deal with one function and the syntax of the -templates should be quite easy to grasp. -Here's a small example. -

-If you have a text file -#p"/tmp/foo.tmpl" like this - -

-<table border=1>
-  <!-- TMPL_LOOP rows -->
-    <tr>
-      <!-- TMPL_LOOP cols -->
-        <!-- TMPL_IF colorful-style -->
-          <td align="right" bgcolor="pink"><!-- TMPL_VAR content --></td>
-        <!-- TMPL_ELSE -->
-          <td align="right" ><!-- TMPL_VAR content --></td>
-        <!-- /TMPL_IF -->
-      <!-- /TMPL_LOOP -->
-    </tr>
-  <!-- /TMPL_LOOP -->
-</table>
-
- -then the following code - -
-(let* ((rows (loop for i below 49 by 7
-                   collect (list :cols
-                                 (loop for j from i below (+ i 7)
-                                       for string = (format nil "~R" j)
-                                       collect (list :content string
-                                                     :colorful-style (oddp j))))))
-       (values (list :rows rows)))
-  (fill-and-print-template #p"/tmp/foo.tmpl" values))
-
- -will produce this HTML table: - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
zeroonetwothreefourfivesix
seveneightnineteneleventwelvethirteen
fourteenfifteensixteenseventeeneighteennineteentwenty
twenty-onetwenty-twotwenty-threetwenty-fourtwenty-fivetwenty-sixtwenty-seven
twenty-eighttwenty-ninethirtythirty-onethirty-twothirty-threethirty-four
thirty-fivethirty-sixthirty-seventhirty-eightthirty-ninefortyforty-one
forty-twoforty-threeforty-fourforty-fiveforty-sixforty-sevenforty-eight
- -
 

Download and installation

- -HTML-TEMPLATE together with this documentation can be downloaded from http://weitz.de/files/html-template.tar.gz. The -current version is 0.9.2. -

-If you're on Debian you should -probably use the cl-html-template -Debian package which is available thanks to Peter van Eynde and Kevin -Rosenberg. There's also a port -for Gentoo Linux thanks to Matthew Kennedy. -

-HTML-TEMPLATE comes with simple system definitions for MK:DEFSYSTEM and ASDF so you can either adapt it -to your needs or just unpack the archive and from within the HTML-TEMPLATE -directory start your Lisp image and evaluate the form -(mk:compile-system "html-template") (or the -equivalent one for asdf) which should compile and load the whole -system. Installation via asdf-install should also -be possible. -

-If for some reason you don't want to use MK:DEFSYSTEM or asdf you -can just LOAD the file load.lisp or you -can also get away with something like this: - -

-(loop for name in '("packages" "specials" "errors" "util" "template" "api")
-      do (compile-file (make-pathname :name name
-                                      :type "lisp"))
-         (load name))
-
- -Note that on CL implementations which use the Python compiler -(i.e. CMUCL, SBCL, SCL) you can concatenate the compiled object files -to create one single object file which you can load afterwards: - -
-cat {packages,specials,errors,util,template,api}.x86f > html-template.x86f
-
- -(Replace ".x86f" with the correct suffix for -your platform.) -

-The distribution includes a test file -"test.lisp" which you can LOAD -after loading HTML-TEMPLATE itself to check if everything works as -intended. If all is well you should just see these two messages: - -

-Please wait a couple of seconds.
-All tests passed...
-
- -Some of the tests assume the existence of a directory -#p"/tmp/" where you can create files. If you're on -Windows you should probably change this - see the variable -TMP-DIR in test.lisp. - -

-Note that there is no public CVS repository for HTML-TEMPLATE - the repository at common-lisp.net is out of date and not in sync with the (current) version distributed from weitz.de. -

-Luís Oliveira maintains a darcs -repository of HTML-TEMPLATE -at http://common-lisp.net/~loliveira/ediware/. - -
 

Support and mailing lists

- -For questions, bug reports, feature requests, improvements, or patches -please use the html-template-devel -mailing list. If you want to be notified about future releases -subscribe to the html-template-announce -mailing list. These mailing lists were made available thanks to -the services of common-lisp.net. -

-If you want to send patches, please read this first. - -
 

Syntax

- -A template is just ordinary text (a file or a string) interspersed -with template tags. A template tag looks like - -
-  <!-- name [attribute] -->
-
- -where name is one of TMPL_VAR, -TMPL_LOOP, TMPL_REPEAT, TMPL_CALL, TMPL_IF, TMPL_UNLESS, -TMPL_INCLUDE, /TMPL_LOOP, /TMPL_REPEAT, -/TMPL_IF, /TMPL_UNLESS, or TMPL_ELSE. Case doesn't matter, -i.e. tmpl_var or Tmpl_Var would also be -legal names. -

-If name is one of the first seven listed above then -attribute must follow, otherwise it must not follow where -attribute is any sequence of characters delimited by -", ', or by whitespace. There's -currently no way to escape the delimiters, i.e. if the attribute -starts with " then the next " (and -nothing else) will end it. -

-Any amount (including the empty string) of whitespace directly after -'<!--' and directly before '-->' is -optional and will be ignored. However, at least one whitespace -character between name and attribute (if present) is -mandatory. But note that if attribute is not delimited by -" or ' then there must be whitespace to -separate attribute from the closing '-->'. -

-The following are examples for legal template tags - -

-  <!-- TMPL_VAR foo -->
-  <!--TMPL_LOOP 'foo'-->
-  <!-- tmpl_include "/tmp/foo.html" -->
-  <!-- Tmpl_Else -->
-  <!-- /TMPL_LOOP -->
-  <!-- TMPL_LOOP foo--><!-- -->
-
- -But note that in the last example the attribute is 'foo--><!--' which is probably not what you expected... -

-These are not legal: - -

-  <!-- TMPL_VAR -->
-  <!-- Tmpl_Else baz -->
-  <!-- TMPL_VARfoo -->
-  <!--TMPL_LOOP 'foo\'bar'-->
-  <tmpl_include "/tmp/foo.html">
-  <!-- TMPL_VAR NAME="foo" -->
-
- -TMPL_VAR must always be followed by an attribute (1st -example) while TMPL_ELSE must not (2nd example). The -third one isn't recognized as a template tag because of the missing -whitespace behind TMPL_VAR. The tag will simply be -ignored and the parser will look for the next occurence of -'<!--'. -

-The fourth example doesn't work because the second apostrophe -isn't escaped by the backslash as you might have thought. Instead, the -parser will think the attribute ends there and will complain about the -string "bar'" following it. The next example -fails because, other than with HTML::Template, the HTML comment -markers are mandatory. (But note that you can change that by setting -the variables *TEMPLATE-START-MARKER* -and *TEMPLATE-END-MARKER*.) -The last example uses HTML::Template's optional -"NAME=" notation which is not supported by -HTML-TEMPLATE. -

-The TMPL_VAR, TMPL_INCLUDE, and -TMPL_CALL tags can appear anywhere and as often as you -like in your templates while the other tags must obey certain rules - -they must follow one of these patterns - -

-  <!-- TMPL_IF attribute --> text <!-- /TMPL_IF -->
-  <!-- TMPL_IF attribute --> text <!-- TMPL_ELSE --> text' <!-- /TMPL_IF -->
-  <!-- TMPL_LOOP attribute --> text <!-- /TMPL_LOOP -->
-  <!-- TMPL_REPEAT attribute --> text <!-- /TMPL_REPEAT -->
-
- -where text and text' themselves must be valid -templates. In other words: These constructs must nest properly. -

-Note that, despite of its name, HTML-TEMPLATE knows absolutely nothing -about HTML syntax so you can use it for other texts as well. Also, -because the templates are filled in before they're sent to the -browser, you can use template tags anywhere you like and not only in -places where HTML comments would be legal. These two examples, e.g., will work: - -

-  <!-- Start of comment <!-- TMPL_VAR foo --> End of comment -->
-  <A HREF="<!-- TMPL_VAR link -->">foobar</A>
-
- - -
 

Semantics

-The generic function CREATE-TEMPLATE-PRINTER -will convert a template into a template printer. A -template printer is a function which accepts one argument - a -template structure - which describes how the template should -be filled and prints the filled template to the stream bound to the -internal variable *TEMPLATE-OUTPUT*. You can -FUNCALL a template printer, but the preferred way to use -it is to invoke it with FILL-AND-PRINT-TEMPLATE -(which can also create template printers as needed). Note that -template printers are compiled closures but although you'll usually -create them at runtime the Lisp compiler isn't invoked for this task -so you can safely excise it from your image if you so wish. -

-For the rest of this document we will make a distinction between -generation time which is the time the template printer is -created (either explicitly by CREATE-TEMPLATE-PRINTER -or implicitly by FILL-AND-PRINT-TEMPLATE) -and invocation time which is the time the printer is used (by -FUNCALL or FILL-AND-PRINT-TEMPLATE) -to fill and print a template. -

-Each of the template tags TMPL_VAR, TMPL_IF, TMPL_UNLESS, -TMPL_LOOP, TMPL_CALL, and TMPL_REPEAT is associated with a particular symbol at -generation time. This symbol is the result of INTERNing -the tag's attribute string into the package *TEMPLATE-SYMBOL-PACKAGE*. The -template structure - the argument given to the template -printer - associates these symbols with values. By default this is -done by means of a property list but this can be changed at template invocation -time by changing the contents of the variable *VALUE-ACCESS-FUNCTION*. (Note -that the name structure doesn't imply that template structures are structures in -the sense of Common Lisp. Usually they aren't.) -

-The template tags work as follows: -


<!-- TMPL_VAR symbol --> - -

-This tag will be replaced by the value associated with symbol -which should be (see *FORMAT-NON-STRINGS*) a string (or maybe NIL - see *CONVERT-NIL-TO-EMPTY-STRING*). *STRING-MODIFIER* is applied to the string before it is output. - -
-* (let ((tp (create-template-printer "Hello <!-- TMPL_VAR foo -->!")))
-    (fill-and-print-template tp '(:foo "World"))
-    (terpri)
-    (fill-and-print-template tp '(:foo "Folks"))
-    (terpri)
-    (fill-and-print-template tp '(:foo symbol)))
-Hello World!
-Hello Folks!
-Hello SYMBOL!
-
-
- -

<!-- TMPL_IF symbol -->text<!-- /TMPL_IF --> -
<!-- TMPL_UNLESS symbol -->text<!-- /TMPL_UNLESS --> - -

-In the first case, if the value associated with -symbol is not NIL the (sub-)template -text will be filled and printed. Otherwise, the whole -construct will be replaced by an empty string. In the second case, -it's the other way around. - -
-* (let ((tp (create-template-printer "The <!-- TMPL_IF fast -->quick <!-- /TMPL_IF -->brown fox")))
-    (fill-and-print-template tp '(:fast t))
-    (terpri)
-    (fill-and-print-template tp '(:fast nil)))
-The quick brown fox
-The brown fox
-
-
- -

<!-- TMPL_IF symbol -->text<!-- TMPL_ELSE -->text'<!-- /TMPL_IF --> -
<!-- TMPL_UNLESS symbol -->text<!-- TMPL_ELSE -->text'<!-- /TMPL_UNLESS --> - -

-In the first case, if the value associated with symbol is -not NIL, the (sub-)template text will be filled -and printed. Otherwise, -text' is used instead. In the second case, it's the other -way around. - -
-* (let ((tp (create-template-printer "The <!-- TMPL_IF fast -->quick<!-- TMPL_ELSE -->slow<!-- /TMPL_IF --> brown fox")))
-    (fill-and-print-template tp '(:fast t))
-    (terpri)
-    (fill-and-print-template tp '(:fast nil)))
-The quick brown fox
-The slow brown fox
-
-
- -

<!-- TMPL_LOOP symbol -->text<!-- /TMPL_LOOP --> - -

-The value associated with symbol should be -a sequence (see *SEQUENCES-ARE-LISTS*) of -template structures. For each element of this sequence the -(sub-)template text is filled and printed using the -corresponding template structure. -

-Note that each template (sub-)structure which is used to fill -text introduces a new set of associations between symbols and -their values. While the template printer is within text the -outer template structure is temporarily "forgotten" -unless *VALUE-ACCESS-FUNCTION* -(note the in-loop-p paramter in particular) takes -care of that. - -

-* (defparameter *tp*
-    (create-template-printer
-     "<!-- TMPL_LOOP foo -->[<!-- TMPL_VAR bar -->,<!-- TMPL_VAR baz -->]<!-- /TMPL_LOOP -->"))
-
-*TP*
-* (fill-and-print-template *tp*
-                           '(:foo ((:bar "EINS" :baz "ONE")
-                                   (:bar "ZWEI" :baz "TWO"))))
-[EINS,ONE][ZWEI,TWO]
-* (let ((*value-access-function*
-         (lambda (symbol values &optional in-loop-p)
-           (declare (ignore in-loop-p))
-           (getf values symbol))))
-    (fill-and-print-template *tp* '(:baz "ONE"
-                                    :foo ((:bar "EINS")
-                                          (:bar "UNO")))))
-[EINS,][UNO,]
-* (fill-and-print-template *tp* '(:baz "ONE"
-                                  :foo ((:bar "EINS")
-                                        (:bar "UNO"))))
-[EINS,ONE][UNO,ONE]
-
-
- -

<!-- TMPL_REPEAT symbol -->text<!-- /TMPL_REPEAT --> - -

-If the value associated with symbol is a positive integer N, then the (sub-)template text will be filled and printed N times. Otherwise, the whole construct will be replace with an empty string. - -
-* (let ((tp (create-template-printer "The <!-- TMPL_REPEAT three -->very <!-- /TMPL_REPEAT -->fast brown fox")))
-    (fill-and-print-template tp '(:three 3))
-    (terpri)
-    (fill-and-print-template tp '(:three "3")))
-The very very very fast brown fox
-The fast brown fox
-
- -Note that the original HTML::Template library doesn't have the TMPL_REPEAT tag - if that matters to you. - -
- -

<!-- TMPL_INCLUDE pathname --> - -

-The string pathname -should be a valid pathname for an existing textfile. This textfile is -implicitly converted into a template printer at generation -time as if it were explicitly converted by a call to CREATE-TEMPLATE-PRINTER. At -invocation time the tag will be replaced by the result -of FUNCALLing this template printer with the current -template structure. (Note that this implies that the included file has -to be a valid template, i.e. you can't, say, have a -TMPL_IF tag in your main file and put the closing -/TMPL_IF into the included file.) - -
-* (with-open-file (s "/tmp/foo" :direction :output :if-exists :supersede)
-    (write-string "The <!-- TMPL_IF fast -->quick <!-- /TMPL_IF -->brown fox" s))
-"The <!-- TMPL_IF fast -->quick <!-- /TMPL_IF -->brown fox"
-* (fill-and-print-template "<!-- TMPL_INCLUDE '/tmp/foo' --> jumps over the lazy dog" '(:fast t))
-Warning:  New template printer for #p"/tmp/foo" created
-The quick brown fox jumps over the lazy dog
-* (fill-and-print-template "<!-- TMPL_INCLUDE '/tmp/foo' --> jumps over the lazy dog" '(:fast nil))
-The brown fox jumps over the lazy dog
-
-

-These tags can be nested, i.e. included files can themselves include -other files. Included template printers are always taken from the cache at -invocation time which means you can update them seperately from the -including printer. -

- -

<!-- TMPL_CALL symbol --> - -

-The value associated with symbol should be a sequence (as -specified by *SEQUENCES-ARE-LISTS*) -of template calls, each of which specifies a substructure and a -template to apply to that. By default, calls are just lists, with the -car specifying the template name and the cdr containing the -substructure. (See *CALL-TEMPLATE-ACCESS-FUNCTION* -and *CALL-VALUE-ACCESS-FUNCTION* -for ways to customize what calls look like.) -

-TMPL_CALL combines aspects of TMPL_LOOP and -TMPL_INCLUDE - it iterates over a sequence of values the -way loops do, but instead of using part of the current template to -print the values each value contains its own information about which -subtemplate should be applied to it. - -

-* (with-open-file (s "/tmp/paragraph" :direction :output :if-exists :supersede)
-    (write-string "<p class='fancy'><!-- TMPL_VAR text --></p>" s))
-"<p class='fancy'><!-- TMPL_VAR text --></p>"
-* (with-open-file (s "/tmp/header" :direction :output :if-exists :supersede)
-    (write-string "<h1><!-- TMPL_VAR text --></h1>" s))
-"<h1><!-- TMPL_VAR text --></h1>"
-* (fill-and-print-template "<body><!-- TMPL_CALL parts --></body>"
-                           '(:parts ((#P"/tmp/header" :text "Chapter 1")
-                                     (#P"/tmp/paragraph" :text "There once was a platypus...")
-                                     (#P"/tmp/header" :text "Chapter 5")
-                                     (#P"/tmp/paragraph" :text "And lived happily ever after."))))
-<h1>Chapter 1</h1><p class='fancy'>There once was a platypus...</p><h1>Chapter 5</h1><p class='fancy'>And lived happily ever after.</p></body>
-
-

-Note that you do not have to include full pathnames in the call -structures. You can use *DEFAULT-TEMPLATE-PATHNAME* -to specify most of it, or set *CALL-TEMPLATE-ACCESS-FUNCTION* -to a function that creates pathnames any way you like. -

-

-Also note that the original HTML::Template library doesn't have the TMPL_CALL tag - if that matters to you. - -
 

The HTML-TEMPLATE dictionary

- -HTML-TEMPLATE exports the following symbols (some of which are also -exported by CL-WHO, by the way, -so beware if you're using both libraries): - -

Creating and using template printers

- -If you're OK with the default settings you will probably only use the -two functions described in this section. - -


[Generic function] -
create-template-printer template &key force element-type if-does-not-exist external-format => printer - -


-This function will create and return a template printer printer created from the template denoted by -template. The behaviour of this function depends on the -type of template. -
    -
  • If template is a stream, it should be an open character input stream which is read character by character with READ-CHAR and the resulting text is used as the template. -
  • If template is a string, it is converted into a string stream which is again fed into CREATE-TEMPLATE-PRINTER. -
  • If template is a pathname, it should denote an existing text file. The file is opened by WITH-OPEN-FILE and the resulting stream is again fed into CREATE-TEMPLATE-PRINTER. All keyword arguments except force are used as keyword arguments for WITH-OPEN-FILE. The pathname will be merged with *DEFAULT-TEMPLATE-PATHNAME* before it is used. -

    HTML-TEMPLATE maintains a cache of previously created template printers. If the (merged) pathname can be found in this cache and the file denoted by this pathname hasn't changed since the associated cached template printer was created (which is tested by FILE-WRITE-DATE) the cached value will be used and no new template printer will be created. This can be overriden by the keyword argument force, i.e. when force is true a new template printer will unconditionally be created (and cached unless force is the keyword :DO-NOT-CACHE). The default value for force is the value of *FORCE-DEFAULT*. (See also *NO-CACHE-CHECK*.) Note that you may have to use force if you've changed one of the customization variables described below and want to create a template printer based on these new settings although the template file itself hasn't changed. Also note that FILE-WRITE-DATE might not be able to see a difference if the newer version of a file is only fractions of a second newer than the older one. -

- -This function will signal an error of type TEMPLATE-INVOCATION-ERROR if template is not a pathname and one of the keyword arguments is provided. - -
-* (with-input-from-string (stream "The <!-- TMPL_VAR speed --> brown fox")
-    (funcall (create-template-printer stream) '(:speed "quick")))
-The quick brown fox
-* (funcall (create-template-printer "The <!-- TMPL_VAR speed --> brown fox") '(:speed "slow"))
-The slow brown fox
-* (with-open-file (stream "/tmp/foo.tmpl" :direction :output)
-    (write-string "The <!-- TMPL_VAR speed --> brown fox" stream))
-
-"The <!-- TMPL_VAR speed --> brown fox"
-* (funcall (create-template-printer #p"/tmp/foo.tmpl") '(:speed "fast"))
-Warning:  New template printer for #p"/tmp/foo.tmpl" created
-The fast brown fox
-* (funcall (create-template-printer #p"/tmp/foo.tmpl") '(:speed "extremely fast"))
-The extremely fast brown fox
-* (funcall (create-template-printer #p"/tmp/foo.tmpl" :force t) '(:speed "very fast"))
-Warning:  New template printer for #p"/tmp/foo.tmpl" created
-The very fast brown fox
-* (probe-file "/tmp/bar.tmpl")
-
-NIL
-* (funcall (create-template-printer #p"/tmp/bar.tmpl" :if-does-not-exist :create) '(:foo "foo"))
-Warning:  New template printer for #p"/tmp/bar.tmpl" created
-
-* (probe-file "/tmp/bar.tmpl")
-
-#p"/tmp/bar.tmpl"
-
- -
- -


[Generic function] -
fill-and-print-template template/printer values &key stream &allow-other-keys => | - -


-This function will fill the template denoted by template/printer with the values provided by values and print the resulting text to stream which defaults to *DEFAULT-TEMPLATE-OUTPUT*. The value of values should be a template structure matching the current value of *VALUE-ACCESS-FUNCTION*. -

-If template/printer is a function, it will be used as if it were a template printer. Otherwise, template/printer will first be fed into CREATE-TEMPLATE-PRINTER and the resulting template printer will be used. Note that this implies that the caching mechanism described above is in effect here as well. -

-If template/printer is a pathname, all keyword arguments except for stream will be used as keyword arguments for CREATE-TEMPLATE-PRINTER. If it is not a pathname, keyword arguments other than stream will result in an error of type TEMPLATE-INVOCATION-ERROR. - -

-* (fill-and-print-template "The <!-- TMPL_VAR speed --> brown fox" '(:speed "slow"))
-The slow brown fox
-* (with-input-from-string (stream "The <!-- TMPL_VAR speed --> brown fox")
-    (fill-and-print-template stream '(:speed "quick")))
-The quick brown fox
-* (with-open-file (stream "/tmp/foo.tmpl" :direction :output :if-exists :supersede)
-    (write-string "The <!-- TMPL_VAR speed --> brown fox" stream))
-
-"The <!-- TMPL_VAR speed --> brown fox"
-* (fill-and-print-template #p"/tmp/foo.tmpl" '(:speed "fast"))
-Warning:  New template printer for #p"/tmp/foo.tmpl" created
-The fast brown fox
-* (fill-and-print-template #p"/tmp/foo.tmpl" '(:speed "very fast"))
-The very fast brown fox
-* (let ((tp (create-template-printer "The <!-- TMPL_VAR speed --> brown fox")))
-    (fill-and-print-template tp '(:speed "tardy")))
-The tardy brown fox
-
-
- -

Template cache

- -The functions and variables in this section are related to the cache mechanism described in the entry for CREATE-TEMPLATE-PRINTER. - -


[Function] -
clear-template-cache => | - -


-This function will completely clear the cache used by HTML-TEMPLATE. -
- -


[Function] -
delete-from-template-cache pathname => result - -


-This function will remove the template printer associated with pathname from HTML-TEMPLATE's cache. result is true if there was such a template printer, or NIL otherwise. -
- -


[Special variable] -
*no-cache-check* - -


-If the value of this variable is true (the default is -NIL) CREATE-TEMPLATE-PRINTER -and FILL-AND-PRINT-TEMPLATE -won't check whether a template file has changed since it has been -cached, but instead will always use the cached template printer if there is -one, i.e. there will be no more disk I/O once all template printers -are generated. This option is intended to be used for sites with heavy -traffic when you don't expect your templates to change anymore. -
- -

Customizations

- -This section assembles more than a -dozen special -variables which can be used to customize HTML-TEMPLATE's behaviour. - -


[Special variable] -
*template-start-marker* - -


-This should be a string (the default is "<!--") which is used at generation time to determine the start of a template tag. -
- -


[Special variable] -
*template-end-marker* - -


-This should be a string (the default is -"-->") which is used at generation time to determine the end of -a template tag. - -
-* (let ((*template-start-marker* "<")
-        (*template-end-marker* ">"))
-    (fill-and-print-template "The <TMPL_VAR 'speed'> <brown> fox" '(:speed "quick")))
-The quick <brown> fox
-
-
- -


[Special variable] -
*default-template-pathname* - -


-This should be a pathname (the default is the result of calling MAKE-PATHNAME -with no arguments) which is merged with the sole argument of CREATE-TEMPLATE-PRINTER -if this argument is a pathname. - -
-* (with-open-file (stream "/tmp/foo.tmpl" :direction :output :if-exists :supersede)
-    (write-string "The <!-- TMPL_VAR speed --> brown fox" stream))
-
-"The <!-- TMPL_VAR speed --> brown fox"
-* (setq *default-template-pathname* #p"/tmp/")
-
-#p"/tmp/"
-* (fill-and-print-template #p"foo.tmpl" '(:speed "very fast"))
-Warning:  New template printer for #p"/tmp/foo.tmpl" created
-The very fast brown fox
-
-
- -


[Special variable] -
*default-template-output* - -


-This should be a stream (the default is the value of -*STANDARD-OUTPUT* -when HTML-TEMPLATE is loaded) which is used as the output stream of -FILL-AND-PRINT-TEMPLATE -if no stream keyword argument was provided. - -
-* (fill-and-print-template "The <!-- TMPL_VAR speed --> brown fox" '(:speed "slow"))
-The slow brown fox
-* (with-output-to-string (*default-template-output*)
-    (fill-and-print-template "The <!-- TMPL_VAR speed --> brown fox" '(:speed "slow")))
-
-"The slow brown fox"
-
-
- -


[Special variable] -
*convert-nil-to-empty-string* - -


-If the values of this variable is true (which is the default), TMPL_VAR -tags will be replaced by the empty string if the associated value is -NIL, otherwise an error of type TEMPLATE-MISSING-VALUE-ERROR -is signaled. This variable takes -effect at invocation time. - -
-* (let ((tp (create-template-printer "The <!-- TMPL_VAR speed --> brown fox")))
-    (handler-bind
-      ((template-missing-value-error (lambda (condition)
-                                       (declare (ignore condition))
-                                       (use-value "slow"))))
-      (let ((*convert-nil-to-empty-string* nil))
-        (fill-and-print-template tp '(:foo "bar")))))
-The slow brown fox
-
-
- -


[Special variable] -
*format-non-strings* - -


If the value of this variable is true (which -is the default), TMPL_VAR will accept non-string values -and convert them to strings -using (FORMAT NIL "~A" ...). Note that -the check -for *CONVERT-NIL-TO-EMPTY-STRING* -will happen first, though. -This variable takes effect at invocation time. - -
-* (fill-and-print-template "The <!-- TMPL_VAR speed --> brown fox" '(:speed :tardy))
-The TARDY brown fox
-
-
- -


[Special variable] -
*sequences-are-lists* - -


-If the values of this variable is true (which is the default) -the code generated by a TMPL_LOOP tag expects its -associated value to be a list, otherwise it expects it to be a -vector. This variable takes effect at generation time. - -
-* (fill-and-print-template "<!-- TMPL_LOOP list -->[<!-- TMPL_VAR item -->]<!-- /TMPL_LOOP -->"
-                           '(:list ((:item "1")
-                                    (:item "2")
-                                    (:item "3"))))
-[1][2][3]
-* (let ((*sequences-are-lists* nil))
-    (fill-and-print-template "<!-- TMPL_LOOP vector -->[<!-- TMPL_VAR item -->]<!-- /TMPL_LOOP -->"
-                             '(:vector #((:item "1")
-                                         (:item "2")
-                                         (:item "3")))))
-[1][2][3]
-
-
- -


[Special variable] -
*upcase-attribute-strings* - -


-If the values of this variable is true (which is the default) -attribute strings are fed to -STRING-UPCASE before they are interned. This variable -takes effect at generation time. - -
-* (let ((*upcase-attribute-strings* nil))
-    (fill-and-print-template "The <!-- TMPL_VAR speed --> brown fox" '(:speed "quick" :|speed| "slow")))
-The slow brown fox
-
-
- -


[Special variable] -
*string-modifier* - -


A designator for the function which is applied to strings which -replace TMPL_VAR tags. The default -is #'ESCAPE-STRING-ISO-8859-1. Use #'CL:IDENTITY if you want to leave the string as is. - -
-* (fill-and-print-template "The <!-- TMPL_VAR speed --> brown fox" '(:speed "<quick>"))
-The &lt;quick&gt; brown fox
-
-* (let ((*string-modifier* #'identity))
-    (fill-and-print-template "The <!-- TMPL_VAR speed --> brown fox" '(:speed "<quick>")))
-The <quick> brown fox
-
-
- -


[Special variable] -
*template-symbol-package* - -


The value of this variable should be -a package -designator designating the package attribute -strings are interned into. The default is the KEYWORD -package. This variable takes effect at generation -time. - -
-* *package*
-
-#<The COMMON-LISP-USER package, 20/21 internal, 0/9 external>
-* (let ((*template-symbol-package* (find-package :common-lisp-user)))
-    (fill-and-print-template "The <!-- TMPL_VAR speed --> brown fox" '(:speed "quick" speed "slow")))
-The slow brown fox
-
-
- -


[Special variable] -
*force-default* - -


-The default value for the force keyword argument to -CREATE-TEMPLATE-PRINTER. Its initial value is NIL. -
- -


[Special variable] -
*value-access-function* - -


The value of this variable should be -a designator -for a function with -the lambda -list (symbol values &optional in-loop-p) which is -used to associate symbols with their values when a template printer is -invoked. in-loop-p is true whenever this -function is called from within a TMPL_LOOP or TMPL_CALL tag. -

-The default -value is -

-(lambda (symbol values &optional in-loop-p)
-  (let ((result (getf values symbol)))
-    (cond (in-loop-p
-           (loop for element in result
-                 when (listp element)
-                   ;; keep values from upper levels
-                   collect (append element values)
-                 else
-                   collect element))
-          (t result))))
-
-This variable takes effect at invocation -time. - -
-* (let ((tp (create-template-printer "The <!-- TMPL_VAR speed --> brown fox"))
-        ;; for brevity, we'll ignore the third argument here
-        (*value-access-function* #'gethash)
-        (hash (make-hash-table :test #'eq)))
-    (setf (gethash :speed hash) "fast")
-    (fill-and-print-template tp hash))
-The fast brown fox
-
-
- -


[Special variable] -
*call-template-access-function* - -


The value of this variable should be a designator -for a function which takes one argument (the call structure) and -returns either a template printer or a value that can be used as the -first argument to create-template-printer. -This function will be used to determine the template that should be -used for a call in a TMPL_CALL tag. -

The default value -is #'CAR. -This variable takes effect at invocation -time.

- -


[Special variable] -
*call-value-access-function* - -


The value of this variable should be a designator -for a function which takes one argument (the call structure) and -returns a structure to use as the value for a call in a -TMPL_CALL tag.

The default value is #'CDR. -This variable takes effect at invocation -time.

- -


[Special variable] -
*ignore-empty-lines* - -


-If the value of this variable is true (the default is -NIL), template printers will suppress any whitespace in -front of template tags up to (but excluding) the first -#\Newline and any whitespace behind template tags up to -(and including) the first #\Newline. This holds for all -tags except TMPL_VAR. The idea is that you might want to -put tags like TMPL_LOOP on lines of their own in order to -increase the legibility of your template files without creating -unnecessary empty lines in your output. This variable takes effect at -generation time. - -
-* (with-open-file (s "/tmp/foo.tmpl" :direction :input)
-    (loop for line = (read-line s nil nil)
-          while line
-          do (print line))
-    (values))
-
-"<table>"
-"  <!-- TMPL_LOOP row-loop -->"
-"  <tr>"
-"    <!-- TMPL_LOOP col-loop -->"
-"    <td><!-- TMPL_VAR item --></td>"
-"    <!-- /TMPL_LOOP -->"
-"  </tr>"
-"  <!-- /TMPL_LOOP -->"
-"</table>"
-* (let ((values (list :row-loop
-                      (loop for row in '((1 2 3 4) (2 3 4 5) (3 4 5 6))
-                            collect (list :col-loop
-                                          (loop for col in row
-                                                collect (list :item
-                                                              (format nil "~A" col)))))))
-      (*ignore-empty-lines* t))
-  (fill-and-print-template #p"/tmp/foo.tmpl" values :force t))
-Warning:  New template printer for #p"/tmp/foo.tmpl" created
-<table>
-  <tr>
-    <td>1</td>
-    <td>2</td>
-    <td>3</td>
-    <td>4</td>
-  </tr>
-  <tr>
-    <td>2</td>
-    <td>3</td>
-    <td>4</td>
-    <td>5</td>
-  </tr>
-  <tr>
-    <td>3</td>
-    <td>4</td>
-    <td>5</td>
-    <td>6</td>
-  </tr>
-</table>
-
-
- -


[Special variable] -
*warn-on-creation* - -


- -If this variable is true (which is the default), CREATE-TEMPLATE-PRINTER -will warn -you whenever a template printer is newly created from a pathname -argument instead of being taken from the cache. -
- -

Conditions

- -This section lists -the conditions -signaled by HTML-TEMPLATE and the corresponding accessors. - -


[Condition type] -
template-error - -


-Every error signaled by HTML-TEMPLATE is of type -TEMPLATE-ERROR. This is a direct subtype of SIMPLE-ERROR -without any additional slots or options. -
- -


[Condition type] -
template-invocation-error - -


-Errors of type TEMPLATE-INVOCATION-ERROR are signaled if -CREATE-TEMPLATE-PRINTER -or FILL-AND-PRINT-TEMPLATE -are called with wrong keyword arguments. This is a direct subtype of -TEMPLATE-ERROR without any -additional slots or options. -
- -


[Condition type] -
template-missing-value-error - -


-An error of type TEMPLATE-MISSING-VALUE-ERROR is signaled -if a template printer for TMPL_VAR is provided with a -NIL value although *CONVERT-NIL-TO-EMPTY-STRING* -is false. This is a direct subtype of TEMPLATE-ERROR without any -additional slots or options. Whenever a -TEMPLATE-MISSING-VALUE-ERROR is signaled, an associated -USE-VALUE restart is available. -
- -


[Condition type] -
template-not-a-string-error - -


-An error of type TEMPLATE-NOT-A-STRING-ERROR is signaled -if a template printer for TMPL_VAR is provided with a -value which is neither a string nor NIL and *FORMAT-NON-STRINGS* is false. This is a -direct subtype of TEMPLATE-ERROR with one -additional slot for the value which can be read by TEMPLATE-NOT-A-STRING-ERROR-VALUE. -Whenever a TEMPLATE-NOT-A-STRING-ERROR is signaled, an -associated USE-VALUE restart is available. -
- -


[Generic function] -
template-not-a-string-error-value condition => value - -


-If condition is a condition of type TEMPLATE-NOT-A-STRING-ERROR, -this function will return the (non-string) value causing the error. - -
-* (let ((tp (create-template-printer "A square has <!-- TMPL_VAR number --> corners")))
-    (handler-bind
-      ((template-not-a-string-error (lambda (condition)
-                                      (use-value
-                                        (format nil "~R"
-                                                (template-not-a-string-error-value condition))))))
-      (let ((*format-non-strings* nil))
-        (fill-and-print-template tp '(:number 4)))))
-A square has four corners
-
-
- -


[Condition type] -
template-syntax-error - -


-An error of type TEMPLATE-SYNTAX-ERROR is signaled at generation time when HTML-TEMPLATE is -not able to create a template printer due to syntax errors in the -template. This is a direct subtype of TEMPLATE-ERROR with three -additional slots. These denote the stream from which HTML-TEMPLATE was -reading when it encountered the error and a line and column within -this stream. (See the next three entries on how to access these -slots.) -

-As many syntax errors can't be detected before the parser is at the -end of the stream, the row and column usually denote the last position -where the parser was happy and not the position where it gave up. - -

-* (handler-case
-    (fill-and-print-template "A square has <!-- TMPL_VAR number--> corners"
-                             '(:number "four"))
-    (template-syntax-error (condition)
-      (format t "Houston, we've got a problem on stream ~A:~%~
-                 Looks like something went wrong after line ~A, column ~A.~%~
-                 The last message we received was '~?'."
-              (template-syntax-error-stream condition)
-              (template-syntax-error-line condition)
-              (template-syntax-error-col condition)
-              (simple-condition-format-control condition)
-              (simple-condition-format-arguments condition))
-      (values)))
-Houston, we've got a problem on stream #<String-Input Stream>:
-Looks like something went wrong after line 1, column 26.
-The last message we received was 'Unexpected EOF'.
-
- -Note that column 26 is the position directly behind "TMPL_VAR". -
- -


[Generic function] -
template-syntax-error-stream condition => stream - -


-If condition is a condition of type TEMPLATE-SYNTAX-ERROR, -this function will return the stream the parser was reading from when -the error was encountered. -
- -


[Generic function] -
template-syntax-error-line condition => number - -


-If condition is a condition of type TEMPLATE-SYNTAX-ERROR, -this function will return the line number which was associated with -this error. As in Emacs, lines are counted beginning -with 1. HTML-TEMPLATE increases the line counter whenever it reads a #\Newline from its input stream. -
- -


[Generic function] -
template-syntax-error-col condition => number - -


-If condition is a condition of type TEMPLATE-SYNTAX-ERROR, -this function will return the column number which was associated with -this error. As in Emacs, columns are counted beginning -with 0. -
- -

Escaping

- -Functions and variables which can be used to encode characters for -HTML documents - -see *STRING-MODIFIER*. - -


[Function] -
escape-string string &key test => escaped-string - -


-This function will accept a string string and will replace every character for which test returns true with its (decimal) character entity. test must be a designator for a function of one argument which accepts a character and returns a generalized boolean. The default is the value of *ESCAPE-CHAR-P*. -
-* (escape-string "<Hühner> 'naïve'")
-"&lt;H&#252;hner&gt; &#039;na&#239;ve&#039;"
-
-
- -


[Special variable] -
*escape-char-p* - -


-This is the default for the test keyword argument to ESCAPE-STRING. Its initial value is - -
-#'(lambda (char)
-    (or (find char "<>&'\"")
-        (> (char-code char) 127)))
-
-
- -


[Function] -
escape-string-minimal string => escaped-string -
[Function] -
escape-string-minimal-plus-quotes string => escaped-string -
[Function] -
escape-string-iso-8859-1 string => escaped-string -
[Function] -
escape-string-all string => escaped-string - -


-These are convenience function based on ESCAPE-STRING. They are defined as follows: - -
-(defun escape-string-minimal (string)
-  "Escape only #\<, #\>, and #\& in STRING."
-  (escape-string string :test #'(lambda (char) (find char "<>&"))))
-
-(defun escape-string-minimal-plus-quotes (string)
-  "Like ESCAPE-STRING-MINIMAL but also escapes quotes."
-  (escape-string string :test #'(lambda (char) (find char "<>&'\""))))
-
-(defun escape-string-iso-8859-1 (string)
-  "Escapes all characters in STRING which aren't defined in ISO-8859-1."
-  (escape-string string :test #'(lambda (char)
-                                  (or (find char "<>&'\"")
-                                      (> (char-code char) 255)))))
-
-(defun escape-string-all (string)
-  "Escapes all characters in STRING which aren't in the 7-bit ASCII
-character set."
-  (escape-string string :test #'(lambda (char)
-                                  (or (find char "<>&'\"")
-                                      (> (char-code char) 127)))))
-
-
- -
 

Acknowledgements

- -Thanks to Sam Tregar for HTML::Template which I've used -successfully for many years together with mod_perl and which inspired -me to write HTML-TEMPLATE. -

-Thanks to James Anderson and Kent M. Pitman who helped to de-confuse -me about restarts. -

-Thanks to Marijn Haverbeke for a very clean and comprehensive patch -for the TMPL_CALL code. -

-$Header: /usr/local/cvsrep/html-template/doc/index.html,v 1.59 2015-05-21 21:00:01 edi Exp $ -

BACK TO MY HOMEPAGE - - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/errors.lisp b/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/errors.lisp deleted file mode 100644 index 0464229..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/errors.lisp +++ /dev/null @@ -1,106 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: HTML-TEMPLATE-LISP; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/html-template/errors.lisp,v 1.8 2007-01-01 23:49:16 edi Exp $ - -;;; Copyright (c) 2003-2007, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package #:html-template) - -(defstruct syntax-error-location - "Structure to store parser locations consisting of a stream, a line -number, and a column number." - line col stream) - -(defvar *syntax-error-location* (make-syntax-error-location) - "Used internally to remember the last position which made sense to -the parser.") - -(define-condition template-error (simple-error) - () - (:documentation "All errors signaled by HTML-TEMPLATE are of -this type.")) - -(define-condition template-invocation-error (template-error) - () - (:documentation "Signaled when HTML-TEMPLATE functions are -invoked with wrong arguments.")) - -(define-condition template-missing-value-error (template-error) - () - (:documentation "Signaled when a TMPL_VAR printer is provided -with a NIL value and *CONVERT-NIL-TO-EMPTY-STRING* is false.")) - -(define-condition template-not-a-string-error (template-error) - ((value :initarg :value - :reader template-not-a-string-error-value)) - (:documentation "Signaled when a TMPL_VAR printer is provided -with a non-string value.")) - -(define-condition template-syntax-error (template-error) - ((line :initarg :line - :reader template-syntax-error-line) - (col :initarg :col - :reader template-syntax-error-col) - (stream :initarg :stream - :reader template-syntax-error-stream)) - (:default-initargs - :line (syntax-error-location-line *syntax-error-location*) - :col (syntax-error-location-col *syntax-error-location*) - :stream (syntax-error-location-stream *syntax-error-location*)) - (:report (lambda (condition stream) - (format stream "~?~%[Line ~A, column ~A, stream ~A]" - (simple-condition-format-control condition) - (simple-condition-format-arguments condition) - (template-syntax-error-line condition) - (template-syntax-error-col condition) - (template-syntax-error-stream condition)))) - (:documentation "Signaled when a syntax error occurs while -parsing a template.")) - -(defmacro signal-template-invocation-error (format-control &rest format-arguments) - `(error 'template-invocation-error - :format-control ,format-control - :format-arguments (list ,@format-arguments))) - -(defmacro signal-template-missing-value-error (format-control &rest format-arguments) - `(error 'template-missing-value-error - :format-control ,format-control - :format-arguments (list ,@format-arguments))) - -(defmacro signal-template-syntax-error (format-control &rest format-arguments) - `(error 'template-syntax-error - :format-control ,format-control - :format-arguments (list ,@format-arguments))) - -(defmacro with-syntax-error-location ((&rest rest) &body body) - "This is wrapped around forms in order to remember a meaningful -position within the stream in case an error has to be signaled." - (declare (ignore rest)) - `(let ((*syntax-error-location* (make-syntax-error-location - :line *current-line* - :col *current-column* - :stream *standard-input*))) - ,@body)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/html-template.asd b/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/html-template.asd deleted file mode 100644 index 0134de0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/html-template.asd +++ /dev/null @@ -1,38 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/html-template/html-template.asd,v 1.16 2015-05-21 20:59:59 edi Exp $ - -;;; Copyright (c) 2003-2007, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(asdf:defsystem :html-template - :version "0.9.2" - :serial t - :components ((:file "packages") - (:file "specials") - (:file "errors") - (:file "util") - (:file "template") - (:file "api"))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/html-template.system b/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/html-template.system deleted file mode 100644 index 979efe9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/html-template.system +++ /dev/null @@ -1,44 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/html-template/html-template.system,v 1.5 2007-01-01 23:49:16 edi Exp $ - -;;; Copyright (c) 2003-2007, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package #:cl-user) - -(defparameter *html-template-base-directory* - (make-pathname :name nil :type nil :version nil - :defaults (parse-namestring *load-truename*))) - -(mk:defsystem #:html-template - :source-pathname *html-template-base-directory* - :source-extension "lisp" - :components ((:file "packages") - (:file "specials" :depends-on ("packages")) - (:file "errors" :depends-on ("specials")) - (:file "util" :depends-on ("errors")) - (:file "template" :depends-on ("util")) - (:file "api" :depends-on ("template")))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/load.lisp b/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/load.lisp deleted file mode 100644 index f315dbf..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/load.lisp +++ /dev/null @@ -1,54 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/html-template/load.lisp,v 1.7 2007-01-01 23:49:16 edi Exp $ - -;;; Copyright (c) 2003-2007, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package #:cl-user) - -(let ((html-template-base-directory - (make-pathname :name nil :type nil :version nil - :defaults (parse-namestring *load-truename*))) - must-compile) - (with-compilation-unit () - (loop for file in '("packages" - "specials" - "errors" - "util" - "template" - "api") - do (let ((pathname (make-pathname :name file :type "lisp" :version nil - :defaults html-template-base-directory))) - #-:cormanlisp - (let ((compiled-pathname (compile-file-pathname pathname))) - (unless (and (not must-compile) - (probe-file compiled-pathname) - (< (file-write-date pathname) - (file-write-date compiled-pathname))) - (setq must-compile t) - (compile-file pathname)) - (setq pathname compiled-pathname)) - (load pathname))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/packages.lisp b/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/packages.lisp deleted file mode 100644 index c3a4a54..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/packages.lisp +++ /dev/null @@ -1,72 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/html-template/packages.lisp,v 1.19 2007-01-01 23:49:16 edi Exp $ - -;;; Copyright (c) 2003-2007, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-user) - -(defpackage :html-template - (:nicknames :template) - (:use :cl) - (:export :*call-template-access-function* - :*call-values-access-function* - :*convert-nil-to-empty-string* - :*default-template-output* - :*default-template-pathname* - :*escape-char-p* - :*force-default* - :*format-non-strings* - :*ignore-empty-lines* - :*no-cache-check* - :*sequences-are-lists* - :*string-modifier* - :*template-end-marker* - :*template-start-marker* - :*template-symbol-package* - :*upcase-attribute-strings* - :*value-access-function* - :*warn-on-creation* - :clear-template-cache - :create-template-printer - :delete-from-template-cache - :escape-string - :escape-string-all - :escape-string-iso-8859-1 - :escape-string-minimal - :escape-string-minimal-plus-quotes - :fill-and-print-template - :template-error - :template-invocation-error - :template-missing-value-error - :template-not-a-string-error - :template-not-a-string-error-value - :template-syntax-error - :template-syntax-error-col - :template-syntax-error-line - :template-syntax-error-stream)) - -(pushnew :html-template *features*) \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/specials.lisp b/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/specials.lisp deleted file mode 100644 index 1422d77..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/specials.lisp +++ /dev/null @@ -1,151 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: HTML-TEMPLATE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/html-template/specials.lisp,v 1.24 2007-03-09 13:09:16 edi Exp $ - -;;; Copyright (c) 2003-2007, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package #:html-template) - -(defvar *find-string-hash* (make-hash-table :test #'equal) - "Hash tables used internally by READ-UNTIL to cache offset arrays.") - -(defvar *template-start-marker* "" - "The string template tags must end with") - -(defvar *printer-hash* (make-hash-table :test #'equal) - "The cache for template printers. -Each entry is of the form (PRINTER . WRITE-DATE).") - -(defvar *default-template-pathname* (make-pathname) - "Each pathname is merged with this value before it is used by -CREATE-TEMPLATE-PRINTER.") - -(defvar *default-template-output* *standard-output* - "The output stream used by FILL-AND-PRINT-TEMPLATE when no STREAM -keyword was provided.") - -(defvar *template-output* nil - "The output stream that's used internally.") - -(defvar *convert-nil-to-empty-string* t - "Controls whether NIL values should resolve to empty strings or -raise an error.") - -(defvar *format-non-strings* t - "Controls whether TMPL_VAR will accept values which aren't -strings and convert them using \(FORMAT NIL \"~A\" ...).") - -(defvar *sequences-are-lists* t - "Controls whether TMPL_LOOP printers expect lists or vectors.") - -(defvar *upcase-attribute-strings* t - "Controls whether attribute strings associated with template tags -are upcased before they are interned.") - -(defvar *no-cache-check* nil - "Controls whether the FILE-WRITE-DATE check will be circumvented -when using FILL-AND-PRINT-TEMPLATE.") - -(defvar *template-symbol-package* (find-package '#:keyword) - "The package symbols are interned into.") - -(defvar *ignore-empty-lines* nil - "Controls whether template tags on their own lines produce empty -lines or not.") - -(defvar *warn-on-creation* t - "Controls whether a warning should be signaled if a new template -printer is created from a pathname argument.") - -(defvar *current-line* 1 - "Internal line counter of the parser.") -(defvar *current-column* 0 - "Internal column counter of the parser.") - -(defvar *included-files* nil - "Internally used by CREATE-TEMPLATE-PRINTER-AUX to avoid infinite -TMPL_INCLUDE loops.") - -(defvar *external-format* :default - "The external format used when opening files.") - -(defvar *value-access-function* - (lambda (symbol values &optional in-loop-p) - (let ((result (getf values symbol))) - (cond ((and in-loop-p *sequences-are-lists*) - (loop for element in result - when (and element (listp element)) - ;; keep values from upper levels - collect (append element values) - else - collect element)) - (t result)))) - "The function which associates \(attribute) symbols with their -values.") - -(defvar *call-template-access-function* #'car - "Accessor function for extracting the called template from a -TMPL_CALL form.") - -(defvar *call-value-access-function* #'cdr - "Accessor function for extracting the values from a TMPL_CALL -form.") - -(defvar *force-default* nil - "The default value for the FORCE keyword argument to -CREATE-TEMPLATE-PRINTER.") - -(defvar *string-modifier* 'escape-string-iso-8859-1 - "The function which is applied to strings which replace -TMPL_VAR tags. Use #'CL:IDENTITY if you don't want to change the -strings.") - -(defparameter *escape-char-p* - #'(lambda (char) - (or (find char "<>&'\"") - (> (char-code char) 127))) - "Used by ESCAPE-STRING to test whether a character should be escaped.") - -;; stuff for Nikodemus Siivola's HYPERDOC -;; see -;; and -;; also used by LW-ADD-ONS - -(defvar *hyperdoc-base-uri* "http://weitz.de/html-template/") - -(let ((exported-symbols-alist - (loop for symbol being the external-symbols of :html-template - collect (cons symbol - (concatenate 'string - "#" - (string-downcase symbol)))))) - (defun hyperdoc-lookup (symbol type) - (declare (ignore type)) - (cdr (assoc symbol - exported-symbols-alist - :test #'eq)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/template.lisp b/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/template.lisp deleted file mode 100644 index dd58aa8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/template.lisp +++ /dev/null @@ -1,474 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: HTML-TEMPLATE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/html-template/template.lisp,v 1.24 2007-01-01 23:49:16 edi Exp $ - -;;; Copyright (c) 2003-2007, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package #:html-template) - -(defmacro with-use-value-restart ((symbol) error-form) - "Provide a USE-VALUE restart for ERROR-FORM in case the value -associated with SYMBOL isn't to our liking." - `(restart-case - ,error-form - (use-value (other-value) - :report (lambda (stream) - (format stream - "Use another value for symbol ~S: " - ,symbol)) - :interactive (lambda () - (format t - "Enter another value for symbol ~S: " - ,symbol) - (multiple-value-list (eval (read)))) - other-value))) - -;; indentation for LispWorks editor -#+:lispworks -(editor:setup-indent "with-use-value-restart" 1 2 4) - -(defun create-simple-printer (string-list &optional (next-fn #'no-values)) - "Used internally to create template printers for strings which don't -include template tags. NEXT-FN is the next function to be called in -the chain of closures. STRING-LIST is a list of strings in reverse -order to be printed first." - (let ((string (list-to-string string-list))) - (lambda (values) - (write-string string *template-output*) - (funcall next-fn values)))) - -(defun create-var-printer (string-list symbol next-fn) - "Used internally to create template printers for TMPL_VAR. SYMBOL is -the symbol associated with the tag. NEXT-FN is the next function to be -called in the chain of closures. STRING-LIST is a list of strings in -reverse order to be printed first." - (let ((string (list-to-string string-list))) - (lambda (values) - (write-string string *template-output*) - (let* ((value (funcall *value-access-function* symbol values)) - (string (typecase value - (null - (if *convert-nil-to-empty-string* - "" - (with-use-value-restart (symbol) - (signal-template-missing-value-error - "Value for symbol ~S is NIL" - symbol)))) - (string value) - (otherwise - (cond (*format-non-strings* (format nil "~A" value)) - (t (with-use-value-restart (symbol) - (error 'template-not-a-string-error - :value value - :format-control "Value ~S for symbol ~S is not a string" - :format-arguments (list value symbol))))))))) - (write-string (funcall *string-modifier* string) *template-output*)) - (funcall next-fn values)))) - -(defun create-include-printer (string-list pathname next-fn) - "Used internally to create template printers for TMPL_INCLUDE. -PATHNAME is the pathname associated with the tag. NEXT-FN is the next -function to be called in the chain of closures. STRING-LIST is a list -of strings in reverse order to be printed first." - (let ((string (list-to-string string-list))) - (lambda (values) - (write-string string *template-output*) - (funcall (car (gethash pathname *printer-hash*)) values) - (funcall next-fn values)))) - -(defun create-if-printer (string-list symbol if-fn else-fn next-fn unlessp) - "Used internally to create template printers for TMPL_IF and -TMPL_UNLESS tags. SYMBOL is the symbol associated with the tag. IF-FN -is the printer for the IF branch, ELSE-FN is the printer for the ELSE -branch. NEXT-FN is the next function to be called in the chain of -closures. STRING-LIST is a list of strings in reverse order to be -printed first. If UNLESSP is true, IF-FN and ELSE-FN are switched." - (let ((string (list-to-string string-list))) - (when unlessp - (rotatef if-fn else-fn)) - (lambda (values) - (write-string string *template-output*) - (if (funcall *value-access-function* symbol values) - (funcall if-fn values) - (funcall else-fn values)) - (funcall next-fn values)))) - -(defun create-loop-printer (string-list symbol body-fn next-fn) - "Used internally to create template printers for TMPL_LOOP -tags. SYMBOL is the symbol associated with the tag. BODY-FN is the -template printer for the body of the loop. NEXT-FN is the next -function to be called in the chain of closures. STRING-LIST is a list -of strings in reverse order to be printed first." - (let ((string (list-to-string string-list))) - (cond (*sequences-are-lists* - (lambda (values) - (write-string string *template-output*) - (dolist (value (funcall *value-access-function* - symbol values t)) - (funcall body-fn value)) - (funcall next-fn values))) - (t - (lambda (values) - (write-string string *template-output*) - (loop for value across (funcall *value-access-function* - symbol values t) - do (funcall body-fn value)) - (funcall next-fn values)))))) - -(defun create-repeat-printer (string-list symbol body-fn next-fn) - "Used internally to create template printers for TMPL_REPEAT -tags. SYMBOL is the symbol associated with the tag. BODY-FN is the -template printer for the body of the loop. NEXT-FN is the next -function to be called in the chain of closures. STRING-LIST is a list -of strings in reverse order to be printed first." - (let ((string (list-to-string string-list))) - (lambda (values) - (write-string string *template-output*) - (let ((factor (funcall *value-access-function* symbol values))) - (when (and (integerp factor) (plusp factor)) - (loop repeat factor - do (funcall body-fn values)))) - (funcall next-fn values)))) - -(defun create-call-printer (string-list symbol next-fn) - "Used internally to create template printers for TMPL_CALL tags. -SYMBOL is the symbol associated with the tag. BODY-FN is the template -printer for the body of the loop. NEXT-FN is the next function to be -called in the chain of closures. STRING-LIST is a list of strings in -reverse order to be printed first." - (let ((string (list-to-string string-list))) - (cond (*sequences-are-lists* - (lambda (values) - (write-string string *template-output*) - (dolist (call (funcall *value-access-function* - symbol values t)) - (fill-and-print-template - (funcall *call-template-access-function* call) - (funcall *call-value-access-function* call) - :stream *template-output*)) - (funcall next-fn values))) - (t - (lambda (values) - (write-string string *template-output*) - (loop for call across (funcall *value-access-function* - symbol values t) - do (fill-and-print-template - (funcall *call-template-access-function* call) - (funcall *call-value-access-function* call) - :stream *template-output*)) - (funcall next-fn values)))))) - -(defun create-template-printer-aux (string-stack end-token) - "Reads from *STANDARD-INPUT* and returns a template printer from -what it reads. When this function is entered the stream pointer must -not be inside a template tag. STRING-STACK is a list of strings (in -reverse order) read so far which haven't been used to build a template -printer. END-TOKEN is either NIL or one of :LOOP, :REPEAT, :IF, -:IF-ELSE, or :UNLESS-ELSE denoting that we expect certain tags to -close open TMPL_LOOP, TMPL_REPEAT, TMPL_IF, or TMPL_UNLESS tags. This -function returns a second value which is true if, after reading -TMPL_IF or TMPL_UNLESS, a corresponding TMPL_ELSE was seen." - (let* ((string - ;; read text up to the next template start marker - (read-until *template-start-marker* - ;; don't skip it, return it - :skip nil - :eof-action (lambda (collector) - (when end-token - ;; make sure we don't accept - ;; EOF if there are still tags - ;; waiting to be closed - (signal-template-syntax-error - "Unexpected EOF, ~A tag is missing" - (case end-token - ((:loop) "") - ((:repeat) "") - ((:if :if-else) "") - ((:unless :unless-else) "")))) - ;; otherwise (EOF before another - ;; start marker was seen) just - ;; return a template printer - ;; which unconditionally prints - ;; the rest of the stream - (return-from create-template-printer-aux - (create-simple-printer - (cons collector string-stack)))))) - (whitespace - ;; skip whitespace but keep it in case this turns out not - ;; to be a template tag - (skip-whitespace :skip nil)) - (token - ;; read what could be a template token's name - (with-syntax-error-location () - (read-while (lambda (c) - (or (alpha-char-p c) - (char= c #\_) - (char= c #\/))) - :skip nil - :eof-action (lambda (collector) - (declare (ignore collector)) - ;; complain about tags which - ;; haven't been closed - (signal-template-syntax-error - "EOF while inside of tag starting with ~S" - *template-start-marker*)))))) - (cond ((string-equal token "TMPL_INCLUDE") - ;; TMPL_INCLUDE tag - first read the pathname which has to - ;; follow and merge it with *DEFAULT-TEMPLATE-PATHNAME* - (let* ((pathname (read-tag-rest :read-attribute t :intern nil)) - (merged-pathname - (merge-pathnames pathname - *default-template-pathname*))) - (when (member merged-pathname *included-files* - :test #'equal) - ;; raise an error if this file has been included - ;; before - infinite recursion ahead! - (with-syntax-error-location () - (signal-template-syntax-error - "Infinite recursion - file ~S includes itself" - merged-pathname))) - ;; otherwise create (and cache) a template printer - (create-template-printer merged-pathname) - (multiple-value-bind (next-fn else-follows) - ;; first we recursively create the template printer - ;; for the rest of the stream - (create-template-printer-aux (skip-trailing-whitespace) - end-token) - ;; then we combine it with the strings before the tag - ;; to create a template printer for TMPL_INCLUDE - (values - (create-include-printer (cons (skip-leading-whitespace string) - string-stack) - merged-pathname - next-fn) - else-follows)))) - ((string-equal token "TMPL_VAR") - ;; TMPL_VAR tag - first read the symbol which has to - ;; follow and intern it - (let ((symbol (read-tag-rest :read-attribute t))) - (multiple-value-bind (next-fn else-follows) - ;; first we recursively create the template printer - ;; for the rest of the stream - (create-template-printer-aux nil end-token) - (values - ;; then we combine it with the strings before the tag - ;; to create a template printer for TMPL_VAR - note - ;; that we don't skip leading and trailing whitespace - ;; here - (create-var-printer (cons string string-stack) - symbol - next-fn) - else-follows)))) - ((or (string-equal token "TMPL_LOOP") - (string-equal token "TMPL_REPEAT")) - ;; TMPL_LOOP or TMPL_REPEAT tag - first read the symbol - ;; which has to follow and intern it - (let* ((kind (if (string-equal token "TMPL_LOOP") :loop :repeat)) - (symbol (read-tag-rest :read-attribute t)) - ;; then read the stream up to the corresponding - ;; end tag and create a template printer for the - ;; loop body - (body-fn (with-syntax-error-location () - (create-template-printer-aux - (skip-trailing-whitespace) - ;; this argument denotes that we expect - ;; to see /TMPL_LOOP or /TMPL_REPEAT and - ;; want to stop there - kind)))) - (multiple-value-bind (next-fn else-follows) - ;; now we recursively create the template printer - ;; for the rest of the stream - (create-template-printer-aux (skip-trailing-whitespace) - end-token) - (values - ;; then we combine it with the strings before the tag - ;; and the body printer to create a template printer - ;; for TMPL_LOOP - (funcall (case kind - (:loop #'create-loop-printer) - (:repeat #'create-repeat-printer)) - (cons (skip-leading-whitespace string) - string-stack) - symbol - body-fn - next-fn) - else-follows)))) - ((string-equal token "TMPL_CALL") - ;; TMPL_CALL tag - first read the symbol which has to - ;; follow and intern it - (let ((symbol (read-tag-rest :read-attribute t))) - (multiple-value-bind (next-fn else-follows) - ;; recursively create the template printer for the - ;; rest of the stream - (create-template-printer-aux (skip-trailing-whitespace) - end-token) - ;; create the printer that will output the strings - ;; before this tag and call the templates stored under - ;; SYMBOL - (values (funcall #'create-call-printer - (cons (skip-leading-whitespace string) - string-stack) - symbol - next-fn) - else-follows)))) - ((string-equal token "/TMPL_LOOP") - (unless (eq end-token :loop) - ;; check if we expected /TMPL_LOOP here, i.e. if an open - ;; TMPL_LOOP was pending - (with-syntax-error-location () - (signal-template-syntax-error "Unexpected /TMPL_LOOP"))) - ;; read the rest of the tag but ignore it - no attributes - ;; expected - (read-tag-rest) - ;; just create a simple template printer for strings - - ;; this is the end of some TMPL_LOOP body - (create-simple-printer (cons (skip-leading-whitespace string) - string-stack))) - ((string-equal token "/TMPL_REPEAT") - (unless (eq end-token :repeat) - ;; check if we expected /TMPL_REPEAT here, i.e. if an open - ;; TMPL_REPEAT was pending - (with-syntax-error-location () - (signal-template-syntax-error "Unexpected /TMPL_REPEAT"))) - ;; read the rest of the tag but ignore it - no attributes - ;; expected - (read-tag-rest) - ;; just create a simple template printer for strings - - ;; this is the end of some TMPL_REPEAT body - (create-simple-printer (cons (skip-leading-whitespace string) - string-stack))) - ((or (string-equal token "TMPL_IF") - (string-equal token "TMPL_UNLESS")) - ;; TMPL_IF or TMPL_UNLESS tag - first read the symbol - ;; which has to follow and intern it - (let ((symbol (read-tag-rest :read-attribute t)) - (unlessp (string-equal token "TMPL_UNLESS"))) - (multiple-value-bind (if-fn else-follows) - (with-syntax-error-location () - ;; then read the stream up to the corresponding - ;; TMPL_ELSE, /TMPL_IF, or /TMPL_UNLESS and create - ;; a template printer for the "if" (or "unless") part - (create-template-printer-aux - (skip-trailing-whitespace) - ;; this argument denotes that we expect to see - ;; TMPL_ELSE _or_ one of /TMPL_IF, /TMPL_UNLESS and, - ;; in the second case, want to stop there - (if unlessp :unless-else :if-else))) - (let ((else-fn (if else-follows - ;; if we encountered TMPL_ELSE read - ;; the stream up to the corresponding - ;; /TMPL_IF or /TMPL_UNLESS and - ;; create a template printer for the "else" part - (with-syntax-error-location () - (create-template-printer-aux - (skip-trailing-whitespace) - ;; this argument denotes that we - ;; expect to see /TMPL_IF or /TMPL_UNLESS - ;; (but not TMPL_ELSE) and want to stop - ;; there - (if unlessp :unless :if))) - ;; use a dummy printer for the "else" - ;; part if we didn't see TMPL_ELSE - #'no-values))) - (multiple-value-bind (next-fn else-follows) - ;; now we recursively create the template printer - ;; for the rest of the stream - (create-template-printer-aux (skip-trailing-whitespace) - end-token) - (values - ;; then we combine it with the strings before the - ;; tag and the "if" and "else" parts to create a - ;; template printer for TMPL_IF or TMPL_UNLESS - (create-if-printer (cons (skip-leading-whitespace string) - string-stack) - symbol - if-fn - else-fn - next-fn - unlessp) - else-follows)))))) - ((string-equal token "TMPL_ELSE") - (unless (member end-token '(:if-else :unless-else)) - ;; check if we expected /TMPL_ELSE here, i.e. if an open - ;; TMPL_IF or TMPL_UNLESS was pending and we haven't - ;; seen TMPL_ELSE before - (with-syntax-error-location () - (signal-template-syntax-error "Unexpected TMPL_ELSE"))) - ;; read the rest of the tag but ignore it - no attributes - ;; expected - (read-tag-rest) - ;; just create a simple template printer for strings - - ;; this is the end of some "if" part - (values - (create-simple-printer (cons (skip-leading-whitespace string) - string-stack)) - ;; return a true second value to denote that we've seen - ;; TMPL_ELSE - t)) - ((string-equal token "/TMPL_IF") - (unless (or (eq end-token :if) (eq end-token :if-else)) - ;; check if we expected /TMPL_IF here, i.e. if an open - ;; TMPL_IF was pending - (with-syntax-error-location () - (signal-template-syntax-error "Unexpected /TMPL_IF"))) - ;; read the rest of the tag but ignore it - no attributes - ;; expected - (read-tag-rest) - ;; just create a simple template printer for strings - - ;; this is the end of some "if" or "else" part - (create-simple-printer (cons (skip-leading-whitespace string) - string-stack))) - ((string-equal token "/TMPL_UNLESS") - (unless (or (eq end-token :unless) (eq end-token :unless-else)) - ;; check if we expected /TMPL_UNLESS here, i.e. if an open - ;; TMPL_UNLESS was pending - (with-syntax-error-location () - (signal-template-syntax-error "Unexpected /TMPL_UNLESS"))) - ;; read the rest of the tag but ignore it - no attributes - ;; expected - (read-tag-rest) - ;; just create a simple template printer for strings - - ;; this is the end of some "unless" or "else" part - (create-simple-printer (cons (skip-leading-whitespace string) - string-stack))) - (t - ;; we couldn't identify a valid tag, so we treat - ;; everything we've read so far as a literal string and - ;; carry on - if we're lucky our CL implementation will - ;; optimize this tail call into an iterative loop - (create-template-printer-aux - (cons token - (cons whitespace - (cons *template-start-marker* - (cons string string-stack)))) - end-token))))) - -(defun %create-template-printer-aux (&rest args) - "Wrapper for CREATE-TEMPLATE-PRINTER-AUX to initialize -*CURRENT-COLUMN* and *CURRENT-LINE*." - (let ((*current-column* 0) - (*current-line* 1)) - (apply #'create-template-printer-aux args))) \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/test.lisp b/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/test.lisp deleted file mode 100644 index 4389c30..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/test.lisp +++ /dev/null @@ -1,291 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: HTML-TEMPLATE-TEST; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/html-template/test.lisp,v 1.13 2007-01-01 23:49:16 edi Exp $ - -;;; Copyright (c) 2003-2007, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package #:cl-user) - -#-:cormanlisp -(defpackage #:html-template-test - (:use #:cl #:html-template)) - -#+:cormanlisp -(defpackage "HTML-TEMPLATE-TEST" - (:use "CL" "HTML-TEMPLATE")) - -(in-package #:html-template-test) - -(format t "~&Please wait a couple of seconds.") -(force-output) - -(defvar tmp-dir #p"/tmp/") - -(defmacro failedp (&body body) - `(handler-case - (progn ,@body nil) - (condition () t))) - -(defmacro warnedp (&body body) - `(handler-case - (progn ,@body nil) - (warning () t))) - -(defmacro test (result &rest args) - (cond (result - `(assert (string= ,result - (with-output-to-string (*default-template-output*) - (fill-and-print-template ,@args))))) - (`(assert (failedp (fill-and-print-template ,@args)))))) - -(test "abc" "" '(:foo "abc")) -(test "abc" "" '(:foo "abc")) -(test "" "" '(:foo "abc")) -(test "xabcy" "xy" '(:foo "abc")) -(test "" "" nil) -(test "" "" '(foo "abc")) -(test "" "" '(:bar "abc")) -(test "abc" "" '(:foo "abc")) -(test "abc" "" '(:foo "abc")) -(test nil "" '(:foo "abc")) -(test "" "abc" nil) -(test "" "abc" '(:foo nil)) -(test "abc" "abc" '(:foo t)) -(test "abc" "abc" '(:foo t :bar 42)) -(test nil "abc" nil) -(test nil "abc" nil) -(test "def" "abcdef" nil) -(test nil "abcdef" nil) -(test "def" "abcdef" '(:foo nil)) -(test "abc" "abcdef" '(:foo t)) -(test "abc" "abcdef" '(:foo nil)) -(test "def" "abcdef" '(:foo t)) -(test nil "abcdef" '(:foo t)) -(test "abc" "def" '(:foo "abc")) -(test "def" "def" '(:foo nil)) -(test "abcabcabc" "abcdef" '(:foo "abc")) -(test "defdefdef" "abcdef" '(:bar "def")) -(test "[]" "[[x]]" '(:foo nil)) -(test "[xxx]" "[x]" '(:foo 3)) -(test "[]" "[x]" '(:foo 0)) -(test "[]" "[x]" '(:foo "foo")) -(test nil "[x]" '(:foo 3)) -(test nil "[x]" '(:foo 3)) -(test "[[x][x][x]]" "[[x]]" '(:foo (1 2 3))) -(test "[[1][2][3]]" "[[]]" '(:foo ((:bar "1") (:bar "2") (:bar "3")))) -(test "[[][][]]" "[[]]" '(:foo (() () ()))) -(test "[[1][2][3]]" "[[]]" '(:foo ((:bar "1") (:bar "2") (:bar "3")))) -(test "[[1][][3]]" "[[]]" '(:foo ((:bar "1") () (:bar "3")))) -(test "[[1][2][3]]" "[[2]]" '(:foo ((:bar "1") () (:bar "3")))) -(test "[[123][456][789]]" "[[]]" '(:foo ((:bar ((:bar "1") (:bar "2") (:bar "3"))) - (:bar ((:bar "4") (:bar "5") (:bar "6"))) - (:bar ((:bar "7") (:bar "8") (:bar "9")))))) -(test "[[123][baz][789]]" "[[baz]]" '(:foo ((:baz ((:bar "1") (:bar "2") (:bar "3"))) - () - (:baz ((:bar "7") (:bar "8") (:bar "9")))))) -(test nil "" nil) -(test "" "" nil) -(test nil "" nil) -(test nil "" nil) -(test nil "" nil) -(test nil "" nil) -(test nil "" nil) -(test nil "" nil) -(test nil "" nil) -(test nil "" nil) -(test nil "1234" nil) -(test "1" "1234" '(:foo t :bar t)) -(test "2" "1234" '(:foo t :bar nil)) -(test "3" "1234" '(:foo nil :baz t)) -(test "4" "1234" '(:foo nil :baz nil)) -(test "X" "" '(:foo (("X")))) -(test "QUUX" "" '(:baz "Q" - :foo (("" :bar "U") - ("X" :bar "U")))) -(test "" "" '(:foo (("---")))) -(test nil "" '(:foo 57)) - -(let ((temp-name (make-pathname :name (format nil "template-test-~A" (random 1000000)) - :defaults tmp-dir))) - (with-open-file (stream temp-name :direction :output :if-exists :error) - (write-string "" stream)) - (let ((*warn-on-creation* nil)) - (test "abc" temp-name '(:foo "abc"))) - (with-open-file (stream temp-name :direction :input) - (test "def" stream '(:foo "def"))) - (with-open-file (stream temp-name :direction :input) - (let ((tp (create-template-printer stream))) - (test "ghi" tp '(:foo "ghi")))) - (let ((tp (create-template-printer temp-name))) - (test "jkl" tp '(:foo "jkl"))) - (let ((tp (create-template-printer ""))) - (test "mno" tp '(:foo "mno"))) - (delete-file temp-name) - ;; sleep because of FILE-WRITE-DATE - (sleep 2) - (with-open-file (stream temp-name :direction :output :if-exists :error) - (write-string "" stream)) - (assert (warnedp (create-template-printer temp-name))) - (assert (not (warnedp (create-template-printer temp-name)))) - (assert (warnedp (create-template-printer temp-name :force t))) - (delete-from-template-cache temp-name) - (assert (warnedp (create-template-printer temp-name))) - (clear-template-cache) - (assert (warnedp (create-template-printer temp-name))) - (delete-file temp-name)) - -(let ((*template-start-marker* "<") - (*template-end-marker* ">")) - (test "The quick fox" "The fox" - '(:speed "quick"))) - -(let* ((random-string (format nil "template-test-~A" (random 1000000))) - (temp-name (merge-pathnames random-string tmp-dir)) - (*default-template-pathname* tmp-dir)) - (with-open-file (stream temp-name :direction :output :if-exists :error) - (write-string "The brown fox" stream)) - (let ((*warn-on-creation* nil)) - (test "The very fast brown fox" - (make-pathname :name random-string) - '(:speed "very fast"))) - (delete-file temp-name) - ;; sleep because of FILE-WRITE-DATE - (sleep 2) - (with-open-file (stream temp-name :direction :output :if-exists :error) - (write-string "The brown fox" stream)) - (let ((*warn-on-creation* nil)) - (test "The very fast brown fox" - (format nil "" random-string) - '(:speed "very fast"))) - (delete-file temp-name)) - -(let* ((random-string (format nil "template-test-~A" (random 1000000))) - (temp-name (merge-pathnames random-string tmp-dir)) - (random-string-2 (format nil "template-test-2-~A" (random 1000000))) - (temp-name-2 (merge-pathnames random-string-2 tmp-dir)) - (*default-template-pathname* tmp-dir)) - (with-open-file (stream temp-name :direction :output :if-exists :error) - (format stream "" random-string-2)) - (with-open-file (stream temp-name-2 :direction :output :if-exists :error) - (format stream "" random-string)) - (test nil (format nil "" random-string) nil) - (delete-file temp-name) - (delete-file temp-name-2)) - -(assert (string= "The slow brown fox" - (with-output-to-string (stream) - (let ((*default-template-output* stream)) - (fill-and-print-template "The brown fox" - '(:speed "slow")))))) - -(let* ((tp (create-template-printer "The brown fox")) - (*convert-nil-to-empty-string* nil)) - (with-output-to-string (*default-template-output*) - (test nil tp '(:foo "bar")))) - -(let ((tp (create-template-printer "The brown fox"))) - (handler-bind - ((template-missing-value-error (lambda (condition) - (declare (ignore condition)) - (use-value "slow")))) - (let ((*convert-nil-to-empty-string* nil)) - (test "The slow brown fox" tp '(:foo "bar"))))) - -(let ((*sequences-are-lists* nil)) - (test "[1][2][3]" - "[]" - '(:vector #((:item "1") - (:item "2") - (:item "3")))) - (test "QUUX" "" - '(:baz "Q" - :foo #(("" :bar "U") - ("X" :bar "U"))))) - -(let ((*upcase-attribute-strings* nil)) - (test "The slow brown fox" - "The brown fox" - '(:speed "quick" :|speed| "slow"))) - -(let ((*template-symbol-package* *package*)) - (test "The slow brown fox" - "The brown fox" - '(:speed "quick" speed "slow"))) - -(let ((tp (create-template-printer "The brown fox")) - (*value-access-function* #'gethash) - (hash (make-hash-table :test #'eq))) - (setf (gethash :speed hash) "fast") - (test "The fast brown fox" tp hash)) - -(let ((values (list :row-loop - (loop for row in '((1 2 3 4) (2 3 4 5) (3 4 5 6)) - collect (list :col-loop - (loop for col in row - collect (list :item - (format nil "~A" col))))))) - (template " - - - - - - - -
") - (result " - - - - - - - - - - - - - - - - - - -
1234
2345
3456
") - (*ignore-empty-lines* t)) - (test result template values)) - -(let ((tp (create-template-printer "A square has corners")) - (*format-non-strings* nil)) - (handler-bind - ((template-not-a-string-error (lambda (condition) - (use-value - (format nil "~R" - (template-not-a-string-error-value condition)))))) - (test "A square has four corners" tp '(:number 4)))) - -(format t "~&All tests passed...") \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/util.lisp b/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/util.lisp deleted file mode 100644 index c4ad4c9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/html-template-20171227-git/util.lisp +++ /dev/null @@ -1,342 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: HTML-TEMPLATE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/html-template/util.lisp,v 1.21 2015-05-21 20:59:59 edi Exp $ - -;;; Copyright (c) 2003-2007, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package #:html-template) - -(defun no-values (&rest rest) - "A function which does not return any values. This is always the -last function in a chain of template printer closures." - (declare (ignore rest)) - (values)) - -(defun list-to-string (string-list) - "Concatenates a list of strings to one string in reverse order. The -list is destructively modified." - ;; note that we can't use APPLY with CONCATENATE here because of - ;; CALL-ARGUMENTS-LIMIT - (let ((total-size 0)) - (dolist (string string-list) - (incf total-size (length string))) - (let ((result-string (make-string total-size - #+:lispworks #+:lispworks - :element-type 'lw:simple-char)) - (curr-pos 0)) - (dolist (string (nreverse string-list)) - (replace result-string string :start1 curr-pos) - (incf curr-pos (length string))) - result-string))) - -(defun %read-char () - "Like READ-CHAR but updates the line and column counters." - (let ((char (read-char))) - (cond ((char= char #\Newline) - (setf *current-column* 0) - (incf *current-line*)) - (t (incf *current-column*))) - char)) - -(defmacro whitespacep (char) - "Checks whether CHAR is whitespace." - `(find ,char - '(#\Space #\Tab #\Newline #\Linefeed #\Return #\Page))) - -(defun read-while (predicate &key (skip t) (eof-action t)) - "Reads characters from *STANDARD-INPUT* while PREDICATE returns a -true value for each character. Returns the string which was read -unless SKIP is true. On reading EOF an error is signaled if -EOF-ACTION is T, NIL is silently returned if EOF-ACTION is NIL, or the -function EOF-ACTION is called with one argument - the string read so -far." - (let ((collector (or skip - (make-array 0 - :element-type 'character - :fill-pointer t - :adjustable t)))) - (handler-case - (loop for c = (peek-char) - while (funcall predicate c) - do (cond (skip (%read-char)) - (t (vector-push-extend (%read-char) collector))) - finally (return collector)) - (end-of-file () - (cond ((eq eof-action t) - (signal-template-syntax-error "Unexpected EOF")) - ((null eof-action) - nil) - (t (funcall eof-action collector))))))) - -(defun read-delimited-string (&key (eof-action t)) - "Reads and returns a string from *STANDARD-INPUT*. The string is -either delimited by ' or \" in which case the delimiters aren't -returned or it is assumed to extend to the next whitespace -character. See READ-WHILE's docstring for EOF-ACTION." - (handler-case - (let* ((peek-char (peek-char)) - (delimiter (find peek-char '(#\' #\")))) - (when delimiter - (%read-char)) - (prog1 - (read-while (if delimiter - (lambda (c) (char/= c delimiter)) - (lambda (c) (not (whitespacep c)))) - :skip nil - :eof-action eof-action) - (when delimiter - (%read-char)))) - (end-of-file () - (cond ((eq eof-action t) - (signal-template-syntax-error - "Unexpected EOF while reading (delimited) string")) - ((null eof-action) - nil) - (t (funcall eof-action "")))))) - -(defun skip-whitespace (&key assert (skip t) (eof-action t)) - "Read characters from *STANDARD-INPUT* as long as they are -whitespace. Signals an error if the first character read isn't -whitespace and ASSERT is true. Return the string which was read unless -SKIP is true. See READ-WHILE's docstring for EOF-ACTION." - (handler-case - (progn - (when assert - (with-syntax-error-location () - (unless (whitespacep (peek-char)) - (signal-template-syntax-error "Whitespace expected but read ~S" (peek-char))))) - (read-while (lambda (c) - (whitespacep c)) - :skip skip - :eof-action eof-action)) - (end-of-file () - (cond ((eq eof-action t) - (signal-template-syntax-error "EOF while skipping whitespace")) - ((null eof-action) - nil) - (t (funcall eof-action "")))))) - -(defun skip-trailing-whitespace () - "Reads and skips whitespace from *STANDARD-INPUT* until a #\Newline -characters is seen if *IGNORE-EMPTY-LINES* is true. If there is no -#\Newline before the first non-whitespace character the string read so -far is returned \(wrapped in a list)." - (cond (*ignore-empty-lines* - (let ((string (read-while (lambda (c) - (and (whitespacep c) - (char/= #\Newline c))) - :skip nil - :eof-action nil))) - (case (peek-char nil nil nil nil) - ((#\Newline) - nil) - (otherwise - (list string))))) - (t nil))) - -(defun read-until (string &key (skip t) (eof-action t)) - "Reads characters from *STANDARD-INPUT* up to and including STRING. -Returns the string which was read \(excluding STRING) unless SKIP is -true. See READ-WHILE's docstring for EOF-ACTION." - (let* ((length (length string)) - (offsets - ;; we first check whether some substring which starts - ;; STRING can be found again later in STRING - this is - ;; necessary because we only peek one character ahead - (cond ((gethash string *find-string-hash*)) - (t (setf (gethash string *find-string-hash*) - ;; the resulting array of offsets is - ;; cached in *FIND-STRING-HASH* so we can - ;; use it again in case READ-UNTIL is - ;; called with the same STRING argument - (loop with offsets = (make-array length - :initial-element nil) - for i from 1 below length - ;; check if STRING starting from 0 - ;; has something in common with - ;; STRING starting from I - for mismatch = (mismatch string string - :start1 i :test #'char=) - when (> mismatch i) - ;; if this is the case remember the - ;; length of the match plus the - ;; character which must follow in - ;; OFFSETS - do (push (cons (char string (- mismatch i)) - (1+ (- mismatch i))) - (svref offsets mismatch)) - finally (return offsets)))))) - (collector (or skip - (make-array 0 - :element-type 'character - :fill-pointer t - :adjustable t)))) - (handler-case - (loop for i = 0 then (cond (match (1+ i)) - ;; if there is an offset (see above) - ;; we don't have to start from the - ;; beginning of STRING - ((cdr (assoc c (svref offsets i)))) - (t 0)) - for c = (peek-char) - for match = (char= c (char string i)) - while (or (not match) - (< (1+ i) length)) - do (cond (skip (%read-char)) - (t (vector-push-extend (%read-char) collector))) - finally (%read-char) - (unless skip - ;; decrement the fill pointer because collector now also - ;; contains STRING itself - (decf (fill-pointer collector) (1- length))) - (return collector)) - (end-of-file () - (cond ((eq eof-action t) - (signal-template-syntax-error "Unexpected EOF")) - ((null eof-action) - nil) - (t (funcall eof-action collector))))))) - -(defun skip-leading-whitespace (string) - "Removes whitespace from the end of STRING up to and including a -#\Newline. If there is no #\Newline before the first non-whitespace -character is seen nothing is removed. STRING must have a fill -pointer." - (when *ignore-empty-lines* - (let ((old-fill-pointer (fill-pointer string))) - (loop for fill-pointer = (fill-pointer string) - for char = (and (plusp fill-pointer) - (char string (1- fill-pointer))) - while (and char - (whitespacep char) - (char/= #\Newline char)) - do (decf (fill-pointer string))) - (cond ((let ((fill-pointer (fill-pointer string))) - (and (plusp fill-pointer) - (char= #\Newline (char string (1- fill-pointer))))) - (decf (fill-pointer string))) - (t - (setf (fill-pointer string) - old-fill-pointer))))) - string) - -(defun read-tag-rest (&key read-attribute (intern t) (eof-action t)) - "Reads the rest of a template tag from *STANDARD-INPUT* after the -name of the tag has been read. Reads and returns the tag's attribute -if READ-ATTRIBUTE is true. Optionally also interns the attribute -string if INTERN is true. See READ-WHILE's docstring for EOF-ACTION." - (with-syntax-error-location () - (let (rest) - (handler-case - (let ((attribute (and read-attribute - (progn - (skip-whitespace :assert t) - (let ((string (with-syntax-error-location () - (read-delimited-string :eof-action - (lambda (collector) - (declare (ignore collector)) - (signal-template-syntax-error - "EOF while reading tag attribute")))))) - (if intern - (intern - (funcall (if *upcase-attribute-strings* - #'string-upcase - #'identity) - string) - *template-symbol-package*) - string)))))) - (skip-whitespace) - (setq rest (read-until *template-end-marker* - :skip nil - :eof-action eof-action)) - (when (plusp (length rest)) - (signal-template-syntax-error "Expected ~S but read ~S" - *template-end-marker* - rest)) - attribute) - (end-of-file () - (cond ((eq eof-action t) - (signal-template-syntax-error "Unexpected EOF")) - ((null eof-action) - nil) - (t (funcall eof-action rest)))))))) - -(defun escape-string (string &key (test *escape-char-p*)) - (declare (optimize speed)) - "Escape all characters in STRING which pass TEST. This function is -not guaranteed to return a fresh string. Note that you can pass NIL -for STRING which'll just be returned." - (let ((first-pos (position-if test string))) - (if (not first-pos) - ;; nothing to do, just return STRING - string - (with-output-to-string (s) - (loop with len = (length string) - for old-pos = 0 then (1+ pos) - for pos = first-pos - then (position-if test string :start old-pos) - ;; now the characters from OLD-POS to (excluding) POS - ;; don't have to be escaped while the next character has to - for char = (and pos (char string pos)) - while pos - do (write-sequence string s :start old-pos :end pos) - (case char - ((#\<) - (write-sequence "<" s)) - ((#\>) - (write-sequence ">" s)) - ((#\&) - (write-sequence "&" s)) - ((#\') - (write-sequence "'" s)) - ((#\") - (write-sequence """ s)) - (otherwise - (format s "&#~d;" (char-code char)))) - while (< (1+ pos) len) - finally (unless pos - (write-sequence string s :start old-pos))))))) - -(defun escape-string-minimal (string) - "Escape only #\<, #\>, and #\& in STRING." - (escape-string string :test #'(lambda (char) (find char "<>&")))) - -(defun escape-string-minimal-plus-quotes (string) - "Like ESCAPE-STRING-MINIMAL but also escapes quotes." - (escape-string string :test #'(lambda (char) (find char "<>&'\"")))) - -(defun escape-string-iso-8859-1 (string) - "Escapes all characters in STRING which aren't defined in ISO-8859-1." - (escape-string string :test #'(lambda (char) - (or (find char "<>&'\"") - (> (char-code char) 255))))) - -(defun escape-string-all (string) - "Escapes all characters in STRING which aren't in the 7-bit ASCII -character set." - (escape-string string :test #'(lambda (char) - (or (find char "<>&'\"") - (> (char-code char) 127))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/.gitignore b/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/.gitignore deleted file mode 100644 index b997f75..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -*.fasl -*~ -unit-tests/test-results/ -README.html diff --git a/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/LICENSE_1_0.txt b/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/LICENSE_1_0.txt deleted file mode 100644 index 36b7cd9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/LICENSE_1_0.txt +++ /dev/null @@ -1,23 +0,0 @@ -Boost Software License - Version 1.0 - August 17th, 2003 - -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -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, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/README.org b/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/README.org deleted file mode 100644 index c6c5b8f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/README.org +++ /dev/null @@ -1,194 +0,0 @@ -#+TITLE: =let+=: destructuring extension of =let*= -#+AUTHOR: Tamás K. Papp - -This library implements the =let+= macro, which is a dectructuring -extension of =let*=. - -* Highlights - -- clean, consistent syntax and small implementation (less than 300 LOC, not counting tests) - -- placeholder macros allow editor hints and syntax highlighting - -- =&ign= for ignored values (in forms where that makes sense) - -- very easy to extend - -* Similar libraries - -This library was inspired by Gary King's excellent [[http://common-lisp.net/project/metabang-bind/][metabang-bind]]. I -have been using the latter for years now, but at some point I decided -to write a library of my own, aiming for a cleaner syntax, more -concise implementation and a more consistent interface (whether I have -succeeded is of course a matter of judgement --- try [[http://common-lisp.net/project/metabang-bind/][metabang-bind]] to -see if you like it better). - -In my opinion the main advantages of this library, compared to -[[http://common-lisp.net/project/metabang-bind/][metabang-bind]], are the placeholder macros which provide editor hints -and the more consistent syntax of destructuring forms. In particular, -when both read-write and read-only forms are available the latter -always have the =-r/o= suffix, =&flet= and =&labels= resemble the -Common Lisp syntax more closely, and the library should be easier to -extend. - -You can find other pattern matching libraries on [[http://www.cliki.net/pattern%20matching][cliki]]. - -* Syntax - -#+BEGIN_SRC lisp -let+ ({binding}*) body* -#+END_SRC -where -#+BEGIN_SRC lisp -binding ::= symbol || (form [init-form]) -#+END_SRC - -=LET+= is recursive: each binding is in the scope of the previous -ones. Forms ignore =&ign= variables (where applicable). - -** Built-in forms - -Forms which provide both read-write and read-only access are available as =&form= and =&form-r/o=. The first one always uses symbol macros, so you can use =setf=. The second one reads the values at the beginning of the list from value: you can change these variables after that without having any effect on the original value. Read-only forms may also provide a slight increase in speed, and promote good style --- you can use them to signal that you will not change the original structure. - -The following forms are defined: - -- =var=, =(var)=, =(var value)= :: These behave just like they do in =let*=. - -- =(list value)= :: When =list= is not recognized as any of the forms below, it is simply destructured using =destructuring-bind=. =&ign= are ignored. Example: -#+BEGIN_SRC lisp -(let+ (((a (b &optional (c 3)) &ign &key (d 1 d?)) '(1 (2) 7 :d 4))) - (list a b c d d?)) ; => (1 2 3 4 T) -#+END_SRC - -- =((&slots slot*) value)=, also =&slots-r/o= :: Similarly to =with-slots=, each =slot= has the syntax =variable= or =(variable)= (for these, the variable name is also used for the slot name) or =(variable slot-name)=. =&slots-r/o= provides read-only bindings. - - Example: -#+BEGIN_SRC lisp -(defclass foo-class () - ((a :accessor a :initarg :a) - (b :accessor b-accessor :initarg :b))) - -(let+ (((&slots a (my-b b)) (make-instance 'foo-class :a 1 :b 2))) - (list a my-b)) ; => (1 2) -#+END_SRC - -- =((&accessors accessor*) value)=, also =&accessors-r/o= :: Syntax similar to =&slots=, but uses accessors. Continuing the example above: -#+BEGIN_SRC lisp -(let+ (((&accessors a (b b-accessor)) (make-instance 'foo-class :a 1 :b 2))) - (list a b)) ; => (1 2) -#+END_SRC - -- =((&structure conc-name slot*) value)=, also =&structure-r/o= :: Slot access for structures. =Conc-name= is prepended to the accessors (you need to include the =-= if there is one). Example: -#+BEGIN_SRC lisp -(defstruct foo-struct c d) -(let+ (((&structure foo-struct- c (my-d d)) (make-foo-struct :c 3 :d 4))) - (list c my-d)) ; => (3 4) -#+END_SRC - -- =((&values value*) form)= :: Similar to =multiple-value-bind=. =&ign= are ignored. Example: -#+BEGIN_SRC lisp -(let+ (((&values a &ign b) (values 1 2 3))) - (list a b)) ; => (1 3) -#+END_SRC - -- =(array value)= (only read-only version) :: The array is - destructured to the given elements, =&ign= are ignored. Indexes - use row-major access, determined at macroexpansion time. - Example: -#+BEGIN_SRC lisp -(let+ ((#(a &ign b) (vector 1 2 3))) - (list a b)) ; => (1 3) -#+END_SRC - -- =((&array-elements (variable subscript*)*) value)=, also =&array-elements-r/o= :: Array elements with given subscripts are assigned to the variables. Example: -#+BEGIN_SRC lisp -(let+ (((&array-elements (a 0 1) - (b 2 0)) - #2A((0 1) - (2 3) - (4 5)))) - (list a b)) ; => (1 4) -#+END_SRC - -- =((&flet name lambda-list forms*))=, also =&labels= :: Function bindings. These have no value form. =&labels= allows the function to refer to itself -- note that since =let+= is always recursive, this is the only difference between the two forms. Example: -#+BEGIN_SRC lisp -(let+ (((&flet add2 (x) - (+ x 2)))) - (add2 5)) ; => 7 -#+END_SRC - -- =((&plist (variable key [default])*)=, also =&plist-r/o= :: Access to property lists. When =key= is not given, =variable= is used instead, and =default= is used if the element does not exist in the value (note that default may be evaluated multiple times when using the read-write form which uses =symbol-macrolet=). Example: -#+BEGIN_SRC lisp -(let+ (((&plist a (my-b b) (c nil 3)) '(a 1 b 2))) - (list a my-b c)) ; => (1 2 3) -#+END_SRC - -- =(((&hash-table (variable key [default])*)=, also =&hash-table-r/o= :: Access to the elements of hash tables, the semantics is the same as =&plist=. - -- =(&complex real imaginary)= :: Destructures complex numbers. - -** Nesting - -You can nest =let+= expressions when it makes sense (it doesn't always, especially for read/write slots, the read only form should work). For example, -#+BEGIN_SRC lisp -(let+ ((#((&complex a b)) (vector (complex 1 2)))) - (list a b)) -#+END_SRC -should destructure the complex number that is the single element in the vector. - -If you find that =let+= does not nest properly, please report it as a bug. - -** Convenience macros - -- =(defun+ name (argument*) form*)=, also =(lambda (argument*) form*)= :: Work like =defun= and =lambda=, but arguments are destructured using =let+=. Example: -#+BEGIN_SRC lisp -(defun+ foo ((&plist a b c) #(d e)) - (list a b c d e)) - -(foo '(a 1 b 2 c 3) #(4 5)) ; => (1 2 3 4 5) -#+END_SRC -See also =&labels+= and =&lambda+=. - -- =define-structure-let+= :: Can be used to provide destructuring forms for structures. - -** Other forms - -- =(&once-only symbols ...)= and =(&with-gensyms symbols)= are useful for writing macros. - -* Extensions - -Extending =let-plus= is very easy: if you want to use a form that -resembles a list, you just have to define a method for -=let+-expansion-for-list=. There is a macro that helps you with that, -called =define-let+-expansion=. If the library didn't have -=&complex=, we could define destructuring for the form like this: - -#+BEGIN_SRC lisp -(define-let+-expansion (&complex (x y)) - "Access real and imaginary part of the value. Read-only." - `(let ((,x (realpart ,value)) - (,y (imagpart ,value))) - ,@body)) -#+END_SRC -Some highlights: - -- this macro defines a "placeholder" macro =&complex= that should - help with editor hints, but has no other purpose (it is not used in - the expansion), -- the macro is anaphoric, capturing =value= (the value form) and - =body= (the body inside the =let+= form), you can customize both of - this using keyword arguments, -- unless required otherwise, =value= is wrapped in =once-only= - preventing multiple evaluations of the same form. See the arguments =:uses-value?= and =:once-only?= for =define-let+-expansion=. - -If you want to extend =let+= with forms that are not lists (eg like -the array syntax above), have a look at =let+-expansion=. - -* Reporting bugs - -Please open an [[https://github.com/sharplispers/let-plus/issues][issue]] on Github for bugs. Extensions are also welcome, -either as forks or small code snippets submitted as issues. Wishlist -items are also welcome! - -I ask you not to report bugs via e-mail if you can avoid it. Tracking -bugs on Github makes it less likely that they get lost. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/extensions.lisp b/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/extensions.lisp deleted file mode 100644 index b53be6f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/extensions.lisp +++ /dev/null @@ -1,90 +0,0 @@ -;;; -*- Mode:Lisp; Syntax:ANSI-Common-Lisp; Coding:utf-8 -*- - -(in-package #:let-plus) - -(defun destructured-lambda-list-forms (lambda-list body) - "Return a list that can be spliced into function definitions (eg DEFUN, LAMBDA, FLET, LABELS). - -The list starts with a lambda list, and is followed by a docstring (when provided), then a LET+ form that wraps declarations (when provided) and BODY. - -Used internally, not exported." - (let+ (((&values body declarations documentation) - (parse-body body :documentation t)) - ((&values arguments bindings ignores) - (loop :for parameter :in lambda-list - :for argument = (gensym) - :collect argument :into arguments - :if (eq parameter '&ign) :collect argument :into ignores - :else :collect (list parameter argument) :into bindings - :finally (return (values arguments bindings ignores))))) - `(,arguments - ,@(when documentation `(,documentation)) - ,@(when ignores `((declare (ignore ,@ignores)))) - (let+ ,bindings - ,@declarations - ,@body)))) - -(define-let+-expansion (&flet+ (function-name lambda-list - &body function-body) - :uses-value? nil) - "&FLET that destructures its arguments using LET+." - `(let+ (((&flet ,function-name - ,@(destructured-lambda-list-forms lambda-list function-body)))) - ,@body)) - -(define-let+-expansion (&labels+ (function-name lambda-list - &body function-body) - :uses-value? nil) - "&LABELS that destructures its arguments using LET+." - `(let+ (((&labels ,function-name - ,@(destructured-lambda-list-forms lambda-list function-body)))) - ,@body)) - -(defmacro lambda+ (lambda-list &body body) - "LAMBDA that destructures its arguments using LET+." - `(lambda ,@(destructured-lambda-list-forms lambda-list body))) - -(defmacro defun+ (name lambda-list &body body) - "DEFUN that destructures its arguments using LET+." - `(defun ,name ,@(destructured-lambda-list-forms lambda-list body))) - -(defmacro define-structure-let+ ((name - &key (conc-name (symbolicate name #\-)) - (r/w (symbolicate #\& name)) - (r/o (symbolicate #\& name '#:-r/o))) - &rest slot-names) - "Define a LET+ expansion for accessing slots of a structure in a fixed order." - (let ((variable-name-pairs - (loop for slot-name in slot-names collect - ``(,,slot-name ,',slot-name)))) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (define-let+-expansion (,r/w (,@slot-names)) - ,(format nil "LET+ form for slots of the structure ~A." name) - `(let+ (((&structure ,',conc-name ,,@variable-name-pairs) ,value)) - ,@body)) - (define-let+-expansion (,r/o (,@slot-names)) - ,(format nil "LET+ form for slots of the structure ~A. Read-only." - name) - `(let+ (((&structure-r/o ,',conc-name ,,@variable-name-pairs) - ,value)) - ,@body))))) - -(define-let+-expansion (&fwrap (name)) - "Wrap closure in the local function NAME. Calls to NAME will call the closure." - `(let+ (((&flet ,name (&rest arguments) - (apply ,value arguments)))) - ,@body)) - -(define-let+-expansion (&once-only specs :uses-value? nil) - "Expand to (ONCE-ONLY SPECS ...)." - `(once-only ,specs ,@body)) - -(define-let+-expansion (&with-gensyms names :uses-value? nil) - "Expand to (WITH-GENSYMS NAMES ...)." - `(with-gensyms ,names ,@body)) - -(define-let+-expansion (&complex (x y)) - "Access real and imaginary part of the value. Read-only." - `(let ((,x (realpart ,value)) - (,y (imagpart ,value))) - ,@body)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/let-plus.asd b/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/let-plus.asd deleted file mode 100644 index fc4ed95..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/let-plus.asd +++ /dev/null @@ -1,25 +0,0 @@ -(defsystem "let-plus" - :description "Destructuring extension of LET*." - :author "Tamas K. Papp ." - :maintainer "Sharp Lispers " - :license "Boost Software License - Version 1.0" - :version "0.2" - :serial t - :components ((:file "package") - (:file "let-plus") - (:file "extensions")) - :depends-on ("alexandria" - "anaphora") - :in-order-to ((test-op (test-op "let-plus/tests")))) - -(defsystem "let-plus/tests" - :description "Tests for the LET-PLUS library." - :author "Tamas K. Papp ." - :maintainer "Sharp Lispers " - :license "Same as LET-PLUS -- this is part of the latter." - :serial t - :components ((:file "tests")) - :depends-on ("lift" - "let-plus") - :perform (test-op (operation component) - (uiop:symbol-call '#:let-plus-tests '#:run))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/let-plus.lisp b/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/let-plus.lisp deleted file mode 100644 index f6104f4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/let-plus.lisp +++ /dev/null @@ -1,336 +0,0 @@ -;;;; let-plus.lisp - -(in-package #:let-plus) - -;;; LET+ recognizes three general kinds of syntax for accessing elements in -;;; some structure (in the abstract sense): -;;; -;;; 1. "slots", of the form (VARIABLE &optional (SLOT VARIABLE)) SLOT is used -;;; in the general sense, it can also be an accessor. This is similar to -;;; the syntax of WITH-SLOTS etc. -;;; -;;; 2. "entries", of the form (VARIABLE &optional (KEY VARIABLE) DEFAULT), -;;; which allows a default value. This is used for hash tables, property -;;; lists, etc. If KEY is NIL, VARIABLE is used instead, if another -;;; symbol, it is quoted. -;;; -;;; 3. array-like reference (VARIABLE &rest SUBSCRIPTS). This is used for -;;; array elements. -;;; -;;; If a single symbol is given, it is used as a variable for entries and -;;; slots. - -;;; Ignored variables -;;; -;;; The preferred method is expanding into LET+ forms which handle ignored -;;; values automatically -- LET+ just ignores these variables. Use -;;; REPLACE-IGNORED only when this is not feasible or desirable (eg using -;;; destructuring provided by CL). - -(defun ignored? (symbol) - "Return a boolean determining if a variable is to be ignored. - -NOTE: It is unlikely that you need to used this function, see the note above its definition." - (eq symbol '&ign)) - -(defun replace-ignored (tree) - "Replace ignored variables in TREE with a gensym, return a list of these as the second value. - -NOTE: It is unlikely that you need to used this function, see the note above its definition." - (let (ignored) - (labels ((traverse (tree) - (if (atom tree) - (if (ignored? tree) - (aprog1 (gensym) - (push it ignored)) - tree) - (cons (traverse (car tree)) - (awhen (cdr tree) (traverse it)))))) - (values (traverse tree) (nreverse ignored))))) - -;;; LET+ uses generic functions for expansion. They are dispatched on the -;;; FORM, and further on the first element if it is a list. LET+-EXPANSION -;;; should wrap BODY in the desired forms, implementing the expansion. The -;;; recursive expansion of multiple forms is done by the LET+ macro. -;;; -;;; LET+ forms start with & (except for those expanding into LET(*) and -;;; DESTRUCTURING-BIND), although this convention is not enfored. - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun &-symbol? (symbol) - "Test whether the symbol's name starts with a & character." - (char= (aref (symbol-name symbol) 0) #\&))) - -(defgeneric let+-expansion (form value body) - (:documentation "Return an expansion for a LET+ form.") - (:method (form value body) - (declare (ignore value body)) - (error "LET+ could not recognize ~A." form)) - (:method ((variable null) value body) - `(destructuring-bind nil ,value - ,@body)) - (:method ((variable symbol) value body) - (cond - ((ignored? variable) `(locally ,@body)) - ((&-symbol? variable) - (warn "Possibly left out one level of nesting in LET+ form (~A ~A)." - variable value)) - (t `(let ((,variable ,@(when value `(,value)))) - ,@body)))) - (:method ((form list) value body) - (let+-expansion-for-list (first form) (rest form) value body))) - -(defgeneric let+-expansion-for-list (first rest value body) - (:documentation "LET+-EXPANSION calls this for lists, see the latter for semantics of returned values.") - (:method (first rest value body) - ;; forms not recognized as anything else are destructured - (when (and (symbolp first) (not (ignored? first)) (&-symbol? first) - (not (find first lambda-list-keywords))) - (warn "~A looks like a LET+ keyword, but it has no expansion method defined. Treating it as a lambda list." first)) - (let ((form (cons first rest))) - (multiple-value-bind (form ignored) (replace-ignored form) - `(destructuring-bind ,form ,value - (declare (ignore ,@ignored)) - ,@body))))) - -(defmacro let+ (bindings &body body) - "Destructuring bindings. See the documentation of the LET-PLUS library. Most accepted forms start with &." - (labels ((expand (bindings) - (destructuring-bind (binding &rest other-bindings) bindings - (destructuring-bind (form &optional value) - (ensure-list binding) - (let+-expansion form value (aif other-bindings - (list (expand it)) - body)))))) - (if bindings - (expand bindings) - `(locally ,@body)))) - -(defmacro define-let+-expansion ((name arguments &key - (value-var 'value) - (body-var 'body) - (uses-value? t) - (once-only? uses-value?)) - &body body) - "Define an expansion for LET+ forms which are lists, starting with NAME. ARGUMENTS is destructured if a list. A placeholder macro is defined with NAME, using DOCSTRING and ARGUMENTS. The value form is bound to VALUE-VAR (wrapped in ONCE-ONLY when ONCE-ONLY?), while the body is bound to BODY-VAR. USES-VALUE? determines if the form uses a value, and generates the appropriate checks." - (let ((arguments-var (gensym "ARGUMENTS")) - (arguments (if (listp arguments) - arguments - `(&rest ,arguments))) - (whole (gensym "WHOLE"))) - (multiple-value-bind (remaining-forms declarations docstring) - (parse-body body :documentation t) - (sunless docstring (setf it (format nil "LET+ form ~A." name))) - `(progn - (defmacro ,name (&whole ,whole ,@arguments) - ,docstring - (declare (ignore - ,@(remove-if (lambda (symbol) - (or (not symbol) - (not (symbolp symbol)) - (keywordp symbol) - (find symbol lambda-list-keywords) - (&-symbol? symbol))) - (flatten arguments)))) - ,@declarations - ,whole) - (defmethod let+-expansion-for-list ((first (eql ',name)) - ,arguments-var ,value-var - ,body-var) - ,(if uses-value? - `(assert ,value-var () "Missing value form in ~A." ',name) - `(assert (not ,value-var) () - "~A forms don't take a value." ',name)) - ,(let ((core `(destructuring-bind ,arguments ,arguments-var - ,@declarations - ,@remaining-forms))) - (if once-only? ; basically once-only, with ignorable value - (with-unique-names (value-once-var) - `(let ((,value-once-var (gensym "VALUE"))) - `(let ((,,value-once-var ,,value-var)) - (declare (ignorable ,,value-once-var)) - ,(let ((,value-var ,value-once-var)) - ,core)))) - core))))))) - -;;; Definitions for particular LET+ forms. -;;; -;;; When both read only and read/write forms make sense, the former should -;;; have the suffix -r/o and the latter should be without the suffix in order -;;; to maintain a consistent naming scheme. - -;;; helper functions - -(defun expand-slot-forms (slots accessor-generator) - "Return a list of expanded bindings, calling (ACCESSOR-GENERATOR KEY)" - (let (bindings) - (loop for entry :in slots do - (destructuring-bind (variable &optional (key variable)) - (ensure-list entry) - (when variable - (push `(,variable ,(funcall accessor-generator key)) bindings)))) - (nreverse bindings))) - - -(defun expand-entry-forms (entries accessor-generator) - "Return a list of expanded bindings from ENTRIES, calling (ACESSOR-GENERATOR KEY DEFAULT). Each entry is (VARIABLE &OPTIONAL KEY DEFAULT). When KEY is NIL, VARIABLE is used." - (mapcar (lambda (entry) - (destructuring-bind (variable &optional key default) - (ensure-list entry) - `(,variable ,(funcall accessor-generator - (typecase key - (null `',variable) - (symbol `',key) - (t key)) - default)))) - entries)) - -(defun expand-array-elements (value array-elements &optional (accessor 'aref)) - "Expand a list of (BINDING &REST SUBSCRIPTS) forms to a list of bindings of the form (ACCESSOR VALUE SUBSCRIPTS)." - (mapcar (lambda (array-element) - `(,(first array-element) - (,accessor ,value ,@(rest array-element)))) - array-elements)) - -(define-let+-expansion (&accessors accessors) - "LET+ form, similar to WITH-ACCESSORS." - `(symbol-macrolet ,(expand-slot-forms accessors (lambda (accessor) - `(,accessor ,value))) - ,@body)) - -(define-let+-expansion (&accessors-r/o accessors) - "LET+ form, similar to WITH-ACCESSORS, but read-only." - `(let+ ,(expand-slot-forms accessors (lambda (accessor) - `(,accessor ,value))) - ,@body)) - -(define-let+-expansion (&slots slots :once-only? nil) - "LET+ form, similar to WITH-SLOTS." - `(with-slots ,slots ,value - ,@body)) - -(define-let+-expansion (&slots-r/o slots) - "LET+ form, similar to WITH-SLOTS but read-only." - `(let+ ,(expand-slot-forms slots - (lambda (slot) `(slot-value ,value ',slot))) - ,@body)) - -(define-let+-expansion (&structure (conc-name &rest slots)) - "LET+ form for slots of a structure, with accessors generated using CONC-NAME." - (check-type conc-name symbol) - `(symbol-macrolet - ,(expand-slot-forms slots - (lambda (slot) `(,(symbolicate conc-name slot) - ,value))) - ,@body)) - -(define-let+-expansion (&structure-r/o (conc-name &rest slots)) - "LET+ form for slots of a structure, with accessors generated using CONC-NAME. Read-only version." - (check-type conc-name symbol) - `(let+ ,(expand-slot-forms slots - (lambda (slot) - `(,(symbolicate conc-name slot) ,value))) - ,@body)) - -(define-let+-expansion (&values values :once-only? nil) - "LET+ form for multiple values." - (let ((values-and-temps (mapcar (lambda (v) (list v (gensym))) values))) - `(multiple-value-bind ,(mapcar #'second values-and-temps) ,value - (declare (ignore ,@(loop for (v g) in values-and-temps - when (ignored? v) - collect g))) - (let+ ,(remove-if (compose #'ignored? #'car) values-and-temps) - ,@body)))) - -(defmethod let+-expansion ((array array) value body) - "LET+ expansion for mapping array elements to variables." - (let (bindings - (value-var (gensym "VALUE"))) - (dotimes (row-major-index (array-total-size array)) - (let ((variable (row-major-aref array row-major-index))) - (unless (ignored? variable) - (push `(,variable - (row-major-aref ,value-var ,row-major-index)) - bindings)))) - `(let ((,value-var ,value)) - (assert (equal (array-dimensions ,value-var) - ',(array-dimensions array))) - (let+ ,(nreverse bindings) - ,@body)))) - - - -(define-let+-expansion (&array-elements array-elements) - "LET+ form, mapping (variable &rest subscripts) specifications to array-elements. VARIABLE is an accessor, which can be used for reading and writing array elements." - `(symbol-macrolet ,(expand-array-elements value array-elements) - ,@body)) - -(define-let+-expansion (&array-elements-r/o array-elements) - "LET+ form, mapping (variable &rest subscripts) specifications to array-elements. Read-only accessor, values assigned to VARIABLEs." - (once-only (value) - `(let+ ,(expand-array-elements value array-elements) - ,@body))) - -(define-let+-expansion (&flet (function-name lambda-list - &body function-body) - :uses-value? nil) - "LET+ form for function definitions. Expands into an FLET." - `(flet ((,function-name ,lambda-list ,@function-body)) - ,@body)) - -(defmacro mergable-labels (bindings &body body) - `(labels ,bindings ,@body)) - -(define-let+-expansion (&labels (function-name lambda-list - &body function-body) - :uses-value? nil) - "LET+ form for function definitions. Expands into an LABELS, thus allowing recursive functions." - (if (typep (first body) '(cons (eql mergable-labels))) - (destructuring-bind (bindings &rest first-body) (rest (first body)) - (assert (null (rest body))) - `(mergable-labels ((,function-name ,lambda-list ,@function-body) - ,@bindings) - ,@first-body - ,@(rest body))) - `(mergable-labels ((,function-name ,lambda-list ,@function-body)) - ,@body))) - -(define-let+-expansion (¯olet (macro-name lambda-list &body macro-body) - :uses-value? nil) - "LET+ form for local macro definitions. Expands into an MACROLET." - `(macrolet ((,macro-name ,lambda-list ,@macro-body)) - ,@body)) - -(define-let+-expansion (&symbol-macrolet (symbol expansion) :uses-value? nil) - "LET+ form for local symbol macros. Expands into a SYMBOL-MACROLET." - `(symbol-macrolet ((,symbol ,expansion)) - ,@body)) - -(define-let+-expansion (&plist entries) - "LET+ form for property lists. Each entry is (variable &optional key default)." - `(symbol-macrolet - ,(expand-entry-forms entries - (lambda (key default) - `(getf ,value ,key ,default))) - ,@body)) - -(define-let+-expansion (&plist-r/o entries) - "LET+ form for property lists, read only version. Each entry is (variable &optional key default)." - `(let* ,(expand-entry-forms entries - (lambda (key default) - `(getf ,value ,key ,default))) - ,@body)) - -(define-let+-expansion (&hash-table entries) - "LET+ form for hash tables. Each entry is (variable &optional key default)." - `(symbol-macrolet - ,(expand-entry-forms entries - (lambda (key default) - `(gethash ,key ,value ,default))) - ,@body)) - -(define-let+-expansion (&hash-table-r/o entries) - "LET+ form for hash tables. Each entry is (variable &optional key default). Read only version." - `(let+ ,(expand-entry-forms entries - (lambda (key default) `(gethash ,key ,value ,default))) - ,@body)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/package.lisp deleted file mode 100644 index ef06bed..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/package.lisp +++ /dev/null @@ -1,37 +0,0 @@ -;;;; package.lisp - -(defpackage #:let-plus - (:use #:cl #:alexandria #:anaphora) - (:export ; basic user interface - #:let+ - #:&ign - #:&accessors - #:&accessors-r/o - #:&slots - #:&slots-r/o - #:&structure - #:&structure-r/o - #:&values - #:&array-elements - #:&array-elements-r/o - #:&flet #:&labels - #:¯olet - #:&symbol-macrolet - #:&plist - #:&plist-r/o - #:&hash-table - #:&hash-table-r/o) - (:export ; defining new forms - #:let+-expansion - #:let+-expansion-for-list - #:define-let+-expansion) - (:export ; extensions - #:&flet+ - #:&labels+ - #:lambda+ - #:defun+ - #:define-structure-let+ - #:&fwrap - #:&once-only - #:&with-gensyms - #:&complex)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/tests.lisp b/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/tests.lisp deleted file mode 100644 index 65f6005..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/let-plus-20191130-git/tests.lisp +++ /dev/null @@ -1,290 +0,0 @@ -;;; -*- Mode:Lisp; Syntax:ANSI-Common-Lisp; Coding:utf-8 -*- - -(defpackage #:let-plus-tests - (:use #:cl #:alexandria #:lift #:let-plus) - (:export #:run)) - -(in-package #:let-plus-tests) - -(deftestsuite let-plus-tests () ()) - -(defun run () - "Run all the tests for LET-PLUS." - (run-tests :suite 'let-plus-tests)) - -(defmacro test-r/o-and-r/w (init-form bindings r/o-form r/w-form - &key (add 7) - (modified-variable (caar bindings))) - "Macro for autogenerating tests for testing read-only and read-write access. -INIT-FORM is evaluated and bound to a value, which is then bound using LET+ -with r/o-form (for read only access) and r/w-form for (read and write access). -Values are compared to bindings (which are of the form (VARIABLE VALUE), where -value should be numeric. MODIFIED-VARIABLE is modified, by adding ADD and -checked for consistency (r/o form should not modify value, while r/w form -should)." - (with-unique-names (object) - (once-only (add) - `(let ((,object ,init-form)) - (let+ ((,r/o-form ,object)) - ,@(loop for (var value) in bindings - collect `(ensure-same ,var ,value)) - (incf ,modified-variable ,add)) - (let+ ((,r/w-form ,object)) - ,@(loop for (var value) in bindings - collect `(ensure-same ,var ,value)) - (incf ,modified-variable ,add)) - (let+ ((,r/o-form ,object)) - (ensure-same ,(caar bindings) (+ ,add ,(cadar bindings)))))))) - -(addtest (let-plus-tests) - test-let*-compatibility - (let+ (a - (b 1) - (c (+ b 3))) - (ensure-same a nil) - (ensure-same b 1) - (ensure-same c 4))) - -(addtest (let-plus-tests) - test-unrecognized-form - (ensure-warning (macroexpand '(let+ (((&does-not-exist a b) '(1 2 3))))))) - -(defclass foo () - ((bar :accessor bar :initarg :bar) - (baz :accessor baz-acc :initarg :baz)) - (:documentation "Class for testing purposes.")) - -(addtest (let-plus-tests) - test-slots - (test-r/o-and-r/w (make-instance 'foo :bar 1 :baz 2) - ((bar 1) (baz2 2)) - (&slots-r/o bar (baz2 baz)) - (&slots bar (baz2 baz)))) - -(addtest (let-plus-tests) - test-accessors - (test-r/o-and-r/w (make-instance 'foo :bar 1 :baz 2) - ((bar 1) (baz 2)) - (&accessors-r/o bar (baz baz-acc)) - (&accessors bar (baz baz-acc)))) - -(defstruct foo2 - "Structure for testing purposes." - bar baz) - -(addtest (let-plus-tests) - test-structure - (test-r/o-and-r/w (make-foo2 :bar 1 :baz 2) - ((bar 1) (baz 2)) - (&structure-r/o foo2- bar (baz baz)) - (&structure foo2- bar (baz baz)))) - -(addtest (let-plus-tests) - test-values - (let+ (((&values a &ign c) (values 1 2 3))) - (ensure-same a 1) - (ensure-same c 3))) - -(addtest (let-plus-tests) - test-values-recursive - (let+ (((&values (a b) &ign c) (values '(1 4) 2 3))) - (ensure-same a 1) - (ensure-same b 4) - (ensure-same c 3))) - -(declaim (notinline two-element-vector)) -(defun two-element-vector () - #(1 2)) - -(addtest (let-plus-tests) - test-array - (let+ ((#2A((a &ign) (b c)) #2A((1 2) (3 4)))) - (ensure-same a 1) - (ensure-same b 3) - (ensure-same c 4)) - (ensure-error (let+ ((#(a b c) (two-element-vector)))))) - -(addtest (let-plus-tests) - test-array-elements - (test-r/o-and-r/w (make-array '(2 2) :initial-contents '((1 2) (3 4))) - ((a 1) (b 3) (c 4)) - (&array-elements-r/o (a 0 0) - (b 1 0) - (c 1 1)) - (&array-elements (a 0 0) - (b 1 0) - (c 1 1)))) - -(addtest (let-plus-tests) - test-flet - (let+ (((&flet add1 (x) - (1+ x)) )) - (ensure-same (add1 2) 3))) - -(addtest (let-plus-tests) - test-labels - (let+ (((&labels my-factorial (x) - (if (<= 2 x) - (* x (my-factorial (1- x))) - 1)))) - (ensure-same (my-factorial 4) 24))) - -(addtest (let-plus-tests) - test-labels/mutual-recursion - (let+ (((&labels my-even? (x) - (cond - ((zerop x) - t) - ((plusp x) - (my-odd? (1- x))) - (t - nil)))) - ((&labels my-odd? (x) - (my-even? (1- x))))) - (ensure-same (my-odd? 4) nil) - (ensure-same (my-even? 4) t) - (ensure-same (my-odd? 5) t) - (ensure-same (my-even? 5) nil))) - -(defun labels-test-function () - 10) - -(addtest (let-plus-tests) - test-labels/dont-splice - (ensure-same (let+ (((&labels foo () (labels-test-function)))) - (labels ((labels-test-function () 5)) - (labels-test-function)) - (foo)) - 10) - (ensure-same (let+ (((&labels foo () (labels-test-function)))) - (labels ((labels-test-function () 5)) - (values (foo) (labels-test-function)))) - (values 10 5)) - (ensure-same (let+ (((&labels foo () (labels-test-function)))) - (let+ (((&labels labels-test-function () 5))) - (values (foo) (labels-test-function)))) - (values 10 5))) - -(addtest (let-plus-tests) - test-plist - (test-r/o-and-r/w (list 'a 1 :b 2 'c '3) - ((a 1) (b 2) (c 3) (d 4)) - (&plist-r/o a (b :b) (c nil) (d nil 4)) - (&plist a (b :b) (c nil) (d nil 4)))) - -(addtest (let-plus-tests) - test-hash-table - (test-r/o-and-r/w (let ((table (make-hash-table))) - (setf (gethash 'a table) 1 - (gethash :b table) 2 - (gethash 'c table) 3) - table) - ((a 1) (b 2) (c 3) (d 4)) - (&hash-table-r/o a (b :b) (c nil) (d nil 4)) - (&hash-table a (b :b) (c nil) (d nil 4)))) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defstruct ab - "A structure for testing defstruct+." - a b) - (define-structure-let+ (ab) a b)) - -(addtest (let-plus-tests) - test-defstruct+ - (test-r/o-and-r/w (make-ab :a 3 :b 7) - ((aa 3) (bb 7)) - (&ab-r/o aa bb) - (&ab aa bb))) - -(addtest (let-plus-tests) - test-fwrap - (let+ (((&fwrap add) (lambda (a b &key (c 0)) (+ a b c)))) - (ensure-same (add 1 2) 3) - (ensure-same (add 1 2 :c 3) 6))) - -(addtest (let-plus-tests) - test-flet+ - (ensure-same (let+ (((&flet+ add3 (#(a b c)) - (+ a b c)))) - (add3 #(1 2 3))) - 6)) - -(addtest (let-plus-tests) - test-labels+ - (let+ (((&labels+ foo ((a . b)) - (if a - (foo (cons (cdr a) (cons (car a) b))) - b)))) - (ensure-same (foo '((1 2 3) . nil)) '(3 2 1))) - - (ensure-no-warning - (compile nil '(lambda (x) - (let+ (((&labels+ foo (&ign)))) (foo x)))))) - -(addtest (let-plus-tests) - test-defun+ - (defun+ foo ((a . b)) - "bar" - (+ a b)) - (ensure-same (foo '(1 . 2)) 3) - (ensure-same (documentation 'foo 'function) "bar" :test #'string=) - (let ((expansion (macroexpand-1 - '(defun+ foo ((a . b)) - "foo docstring" - (declare (type integer a b)) - (+ a b))))) - (ensure-same 'defun (first expansion)) - (ensure-same 'foo (second expansion)) - (ensure-same "foo docstring" (fourth expansion)) - (let ((let+-expansion (fifth expansion))) - (ensure-same 'let+ (first let+-expansion)) - (ensure-same '(declare (type integer a b)) (third let+-expansion)) - (ensure-same '(+ a b) (fourth let+-expansion))))) - -(addtest (let-plus-tests) - test-&warning - (ensure-warning - (macroexpand '(let+ ((&foo 1)) &foo))) - (ensure-warning - (macroexpand '(let+ ((&foo)) &foo))) - (ensure-warning - (macroexpand '(let+ (&foo) &foo)))) - -(addtest (let-plus-tests) - test-empty-let+ - (ensure-same (let+ nil 1) 1 :test #'eql)) - -(addtest (let-plus-tests) - test-recursive-let+ - (ensure-same (let+ ((#((a . b)) (vector (cons 1 2)))) - (values a b)) - (values 1 2)) - ;; (ensure-same (let+ (((#(a) #(b c)) (cons #(1) #(2 3)))) - ;; (values a b c)) - ;; (values 1 2 3)) - ) - -(addtest (let-plus-tests) - test-complex - (let ((c #C(3 5))) - (let+ (((&complex x y) c)) - (ensure-same x 3) - (ensure-same y 5)))) - -(addtest (let-plus-tests) - test-nil - (ensure (let+ ((() '())) t)) - (ensure-error (let+ ((() '(1))))) - ;; (ensure-error (let+ ((() 1)))) -) - -(addtest (let-plus-tests) - test-empty-let+-with-declaration - (ensure-same (let+ () - (declare (optimize speed)) - t) - t) - (ensure-same (let+ ((&ign 1)) - (declare (optimize speed)) - t) - t)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/.gitignore b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/.gitignore deleted file mode 100644 index 0cd96de..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -*.*fas* -*.fasl -*.dfsl -*.ppcf -*.x86f -*.fas -*.lib -doc/manual/ -doc/*.vr -doc/*.tp -doc/*.tps -doc/*.toc -doc/*.pg -doc/*.log -doc/*.ky -doc/*.it -doc/*.info -doc/*.fn -doc/*.fns -doc/*.cp -doc/*.cps -doc/*.aux diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/COPYING b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/COPYING deleted file mode 100644 index 63a1be3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/COPYING +++ /dev/null @@ -1,20 +0,0 @@ -local-time Copyright (c) 2005-2012 by Daniel Lowe - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/CREDITS b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/CREDITS deleted file mode 100644 index 99575f8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/CREDITS +++ /dev/null @@ -1,17 +0,0 @@ -Thanks to those of you who have helped me make LOCAL-TIME an engaging -and worthwhile project! - - * Matthew Danish - * The #lisp crew on irc.freenode.net - * Vladimir Sekissov - * Attila Lendvai - * Tomi Borbely - * Denys Rtveliashvili - * Levente Meszaros - * Arjan Wekking - ------------------------------------------------------------------------- -Apologies to anyone I didn't mention (please let me know). - -Daniel Lowe - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/INSTALL b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/INSTALL deleted file mode 100644 index 2363580..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/INSTALL +++ /dev/null @@ -1,40 +0,0 @@ -# Installation - -## Using Quicklisp - -1. Install quicklisp -2. Use quicklisp to install local-time - - (ql:quickload :local-time) - -## Manual Installation - -1. Make sure the ASDF library is loaded. In SBCL, this involves: - - (require :asdf) - -2. Add the path to the directory containing local-time.asd to - asdf:*central-registry*. If you've installed this package using - asdf-install, this shouldn't be necessary. - - (push "/my/local-time/directory/" asdf:*central-registry*) - -3. Load local-time using ASDF: - - (asdf:oos 'asdf:load-op 'local-time) - -4. In your own projects, you can direct asdf to automatically load - LOCAL-TIME with the :depends-on asdf:defsystem directive. - - (defsystem myproject - :depends-on (local-time) - ...) - -## Testing - -local-time uses Stefil for testing. To run the Stefil test suite, do -the following:- - - (ql:quickload :local-time.test) - (in-suite test) - (test) \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/README b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/README deleted file mode 100644 index c5e6c4b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/README +++ /dev/null @@ -1,18 +0,0 @@ - LOCAL-TIME - -See the "COPYING" file for information about legal issues of copying -and using this library. - -See the "INSTALL" file for information about building and installing -this library. - -The LOCAL-TIME library is a Common Lisp library for the manipulation -of dates and times. It is based almost entirely upon Erik Naggum's -paper "The Long Painful History of Time". - -Related projects of interest: - * https://github.com/enaeher/local-time-duration - * http://common-lisp.net/projects/cl-l10n/ - -See the manual/ directory for more information and/or the website at -http://common-lisp.net/project/local-time/ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/TODO b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/TODO deleted file mode 100644 index e5b0f42..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/TODO +++ /dev/null @@ -1,104 +0,0 @@ --*- mode: org; coding: utf-8-unix -*- - -* Basic Outline -** A more human friendly parser - - PARSE-TIMESTRING works fine, but we need a more human-friendly parser that - can handle stuff like "08/03/2006 1:54pm CST". or maybe not? see - http://chaitanyagupta.com/lisp/chronicity/ - -** Support for other notational systems than the Gregorian - -** Ideally, local-time should have everything that the ruby Date class does - - Also, the time functions in the venerable and honored clsql library. - This may be a tall order. - -** Integrate local-time with http://common-lisp.net/project/cl-l10n/ - Also drop time/timezone related functionality from cl-l10n. - -** Make local-time work with olson timezone rules - http://www.twinsun.com/tz/tz-link.htm - Right now, we're using zic compiled files, which have a limited - scope. They may also be larger than the corresponding rule files. - -* Attila: -Many of the operations currently defined on timestamps should not -really be defined on timestamps at all. i think this is due to some -heritage from the times when a timestamp value also had a timezone -value attached to it. - -Examples of such bogus operations are timestamp+, timestamp-, all -adjust-timestamp variants that operate on the components of a date -value, etc. - -* Nomenclature -** timestamp: a sharp cut on the continuous t axis (as in physics) of time - It is mostly unrelated to timezones and different calendar systems - (e.g. Julian, Gregorian), which are just ways to denote a timestamp in - a way humans can easily deal with. - -** interval: a range on the time axis denoted by two timestamps - -** date-time: contains the fields defined by the calendar system - Some date-time fields may be left undefined. - -** calendar: a converter to and from a particular date-time type - A method defining how to denote a timestamp using a set of numbers - (called year, month, day, etc). there are various such encodings - like the Gregorian calendar, or the Julian calendar (which was in - effect in Russia until 1922!). wikipedia has loads of info about - these. We'll default to a naive Gregorian calendar - -** duration: a value representing a delta between date-times - - -* Timestamp Operations -** basic arithmetic - essentially arithmetic on numbers denoting seconds. operations that - would expose the epoch chosen by the implementation are not allowed - (e.g. adding two timestamps), but things like adding/subbing - literals and substracting two timestamps are valid. - -** convert to/from date - (only in the mandatory context of a calendar system, which most of - the time includes a timezone, too.) - -** create an interval given two timestamps - -** comparison predicates - -* Interval Operations - There's a project implementing intervals at: - https://github.com/enaeher/local-time-duration - -** Arithmetic with timestamps -** Arithmetic with intervals -** convert to a duration with a calendar -** Intersection with a timestamp -** Overlap with another intervals - -* Date-time operations -** parse from string representation - , e.g. an rfc3339 string. note that such a date-time does not - necessarily describe a timestamp completely. it only does so when - it contains all the components needed by the calendar system to - denote a sharp cut on the t axis. - -** set/offset any component of it, - although what those operations mean potentially depend on the - calendar system and its parameters (e.g. the optional timezone - value in it). also note that some operations are potentially - undefined and signal an error with certain illegal values - (e.g. instantiating a date using an illegal or contradictory - combination of its parameters; setting a field to an illegal value - like february 29 in leap years...) - -** convert to/from a timestamp - (strictly in the context of a calendar system and a timezone) - -** comparison functions - -* Duration operations -** Arithmetic with date-times -** Arithmetic with durations diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/cl-postgres+local-time.asd b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/cl-postgres+local-time.asd deleted file mode 100644 index 80b1913..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/cl-postgres+local-time.asd +++ /dev/null @@ -1,9 +0,0 @@ -(defsystem #:cl-postgres+local-time - :name "cl-postgres+local-time" - :version "1.0.6" - :author "Daniel Lowe " - :description "Integration between cl-postgres and local-time" - :depends-on (:cl-postgres :local-time) - :components ((:module "src" - :components ((:module "integration" - :components ((:file "cl-postgres"))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/Makefile b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/Makefile deleted file mode 100644 index 72cf5e9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -# -*- Mode: Makefile; tab-width: 4; indent-tabs-mode: t -*- - -all: docs - -docs: - sh gendocs.sh -o manual --html "--css-include=style.css" local-time "The local-time Manual" - -clean: - find . \( -name "*.info" -o -name "*.it" -o -name "*.aux" -o -name "*.cp" -o -name "*.fn" -o -name "*.fns" -o -name "*.ky" -o -name "*.log" -o -name "*.pg" -o -name "*.toc" -o -name "*.tp" -o -name "*.vr" -o -name "*.dvi" -o -name "*.cps" -o -name "*.vrs" \) -exec rm {} \; - rm -rf manual - -upload-docs: - rsync -av --delete -e ssh manual common-lisp.net:/project/local-time/public_html/ -# scp -r manual spec common-lisp.net:/project/local-time/public_html/ - -# vim: ft=make ts=4 noet diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/gendocs.sh b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/gendocs.sh deleted file mode 100644 index d27da69..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/gendocs.sh +++ /dev/null @@ -1,285 +0,0 @@ -#!/bin/sh -# gendocs.sh -- generate a GNU manual in many formats. This script is -# mentioned in maintain.texi. See the help message below for usage details. -# $Id: gendocs.sh,v 1.17 2006/05/19 00:07:52 karl Exp $ -# -# Copyright (C) 2003, 2004, 2005, 2006 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, 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, you can either send email to this -# program's maintainer or write to: The Free Software Foundation, -# Inc.; 51 Franklin Street, Fifth Floor; Boston, MA 02110-1301, USA. -# -# Original author: Mohit Agarwal. -# Send bug reports and any other correspondence to bug-texinfo@gnu.org. - -prog=`basename "$0"` -srcdir=`pwd` - -scripturl="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs.sh" -templateurl="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs_template" - -: ${MAKEINFO="makeinfo"} -: ${TEXI2DVI="texi2dvi -t @finalout"} -: ${DVIPS="dvips"} -: ${DOCBOOK2TXT="docbook2txt"} -: ${DOCBOOK2HTML="docbook2html"} -: ${DOCBOOK2PDF="docbook2pdf"} -: ${DOCBOOK2PS="docbook2ps"} -: ${GENDOCS_TEMPLATE_DIR="."} -unset CDPATH - -rcs_revision='$Revision: 1.17 $' -rcs_version=`set - $rcs_revision; echo $2` -program=`echo "$0" | sed -e 's!.*/!!'` -version="gendocs.sh $rcs_version - -Copyright (C) 2006 Free Software Foundation, Inc. -There is NO warranty. You may redistribute this software -under the terms of the GNU General Public License. -For more information about these matters, see the files named COPYING." - -usage="Usage: $prog [OPTION]... PACKAGE MANUAL-TITLE - -Generate various output formats from PACKAGE.texinfo (or .texi or .txi) source. -See the GNU Maintainers document for a more extensive discussion: - http://www.gnu.org/prep/maintain_toc.html - -Options: - -o OUTDIR write files into OUTDIR, instead of manual/. - --docbook convert to DocBook too (xml, txt, html, pdf and ps). - --html ARG pass indicated ARG to makeinfo for HTML targets. - --help display this help and exit successfully. - --version display version information and exit successfully. - -Simple example: $prog emacs \"GNU Emacs Manual\" - -Typical sequence: - cd YOURPACKAGESOURCE/doc - wget \"$scripturl\" - wget \"$templateurl\" - $prog YOURMANUAL \"GNU YOURMANUAL - One-line description\" - -Output will be in a new subdirectory \"manual\" (by default, use -o OUTDIR -to override). Move all the new files into your web CVS tree, as -explained in the Web Pages node of maintain.texi. - -MANUAL-TITLE is included as part of the HTML of the overall -manual/index.html file. It should include the name of the package being -documented. manual/index.html is created by substitution from the file -$GENDOCS_TEMPLATE_DIR/gendocs_template. (Feel free to modify the -generic template for your own purposes.) - -If you have several manuals, you'll need to run this script several -times with different YOURMANUAL values, specifying a different output -directory with -o each time. Then write (by hand) an overall index.html -with links to them all. - -You can set the environment variables MAKEINFO, TEXI2DVI, and DVIPS to -control the programs that get executed, and GENDOCS_TEMPLATE_DIR to -control where the gendocs_template file is looked for. - -Email bug reports or enhancement requests to bug-texinfo@gnu.org. -" - -calcsize() -{ - size=`ls -ksl $1 | awk '{print $1}'` - echo $size -} - -outdir=manual -html= -PACKAGE= -MANUAL_TITLE= - -while test $# -gt 0; do - case $1 in - --help) echo "$usage"; exit 0;; - --version) echo "$version"; exit 0;; - -o) shift; outdir=$1;; - --docbook) docbook=yes;; - --html) shift; html=$1;; - -*) - echo "$0: Unknown or ambiguous option \`$1'." >&2 - echo "$0: Try \`--help' for more information." >&2 - exit 1;; - *) - if test -z "$PACKAGE"; then - PACKAGE=$1 - elif test -z "$MANUAL_TITLE"; then - MANUAL_TITLE=$1 - else - echo "$0: extra non-option argument \`$1'." >&2 - exit 1 - fi;; - esac - shift -done - -if test -s "$srcdir/$PACKAGE.texinfo"; then - srcfile=$srcdir/$PACKAGE.texinfo -elif test -s "$srcdir/$PACKAGE.texi"; then - srcfile=$srcdir/$PACKAGE.texi -elif test -s "$srcdir/$PACKAGE.txi"; then - srcfile=$srcdir/$PACKAGE.txi -else - echo "$0: cannot find .texinfo or .texi or .txi for $PACKAGE in $srcdir." >&2 - exit 1 -fi - -if test ! -r $GENDOCS_TEMPLATE_DIR/gendocs_template; then - echo "$0: cannot read $GENDOCS_TEMPLATE_DIR/gendocs_template." >&2 - echo "$0: it is available from $templateurl." >&2 - exit 1 -fi - -echo Generating output formats for $srcfile - -cmd="${MAKEINFO} -o $PACKAGE.info \"$srcfile\"" -echo "Generating info files... ($cmd)" -eval "$cmd" -mkdir -p $outdir/ -tar czf $outdir/$PACKAGE.info.tar.gz $PACKAGE.info* -info_tgz_size=`calcsize $outdir/$PACKAGE.info.tar.gz` -# do not mv the info files, there's no point in having them available -# separately on the web. - -cmd="${TEXI2DVI} \"$srcfile\"" -echo "Generating dvi ... ($cmd)" -eval "$cmd" - -# now, before we compress dvi: -echo Generating postscript... -${DVIPS} $PACKAGE -o -gzip -f -9 $PACKAGE.ps -ps_gz_size=`calcsize $PACKAGE.ps.gz` -mv $PACKAGE.ps.gz $outdir/ - -# compress/finish dvi: -gzip -f -9 $PACKAGE.dvi -dvi_gz_size=`calcsize $PACKAGE.dvi.gz` -mv $PACKAGE.dvi.gz $outdir/ - -cmd="${TEXI2DVI} --pdf \"$srcfile\"" -echo "Generating pdf ... ($cmd)" -eval "$cmd" -pdf_size=`calcsize $PACKAGE.pdf` -mv $PACKAGE.pdf $outdir/ - -cmd="${MAKEINFO} -o $PACKAGE.txt --no-split --no-headers \"$srcfile\"" -echo "Generating ASCII... ($cmd)" -eval "$cmd" -ascii_size=`calcsize $PACKAGE.txt` -gzip -f -9 -c $PACKAGE.txt >$outdir/$PACKAGE.txt.gz -ascii_gz_size=`calcsize $outdir/$PACKAGE.txt.gz` -mv $PACKAGE.txt $outdir/ - -cmd="${MAKEINFO} --no-split --html -o $PACKAGE.html $html \"$srcfile\"" -echo "Generating monolithic html... ($cmd)" -rm -rf $PACKAGE.html # in case a directory is left over -eval "$cmd" -html_mono_size=`calcsize $PACKAGE.html` -gzip -f -9 -c $PACKAGE.html >$outdir/$PACKAGE.html.gz -html_mono_gz_size=`calcsize $outdir/$PACKAGE.html.gz` -mv $PACKAGE.html $outdir/ - -cmd="${MAKEINFO} --html -o $PACKAGE.html $html \"$srcfile\"" -echo "Generating html by node... ($cmd)" -eval "$cmd" -split_html_dir=$PACKAGE.html -( - cd ${split_html_dir} || exit 1 - tar -czf ../$outdir/${PACKAGE}.html_node.tar.gz -- *.html -) -html_node_tgz_size=`calcsize $outdir/${PACKAGE}.html_node.tar.gz` -rm -f $outdir/html_node/*.html -mkdir -p $outdir/html_node/ -mv ${split_html_dir}/*.html $outdir/html_node/ -rmdir ${split_html_dir} - -echo Making .tar.gz for sources... -srcfiles=`ls *.texinfo *.texi *.txi *.eps 2>/dev/null` -tar cvzfh $outdir/$PACKAGE.texi.tar.gz $srcfiles -texi_tgz_size=`calcsize $outdir/$PACKAGE.texi.tar.gz` - -if test -n "$docbook"; then - cmd="${MAKEINFO} -o - --docbook \"$srcfile\" > ${srcdir}/$PACKAGE-db.xml" - echo "Generating docbook XML... $(cmd)" - eval "$cmd" - docbook_xml_size=`calcsize $PACKAGE-db.xml` - gzip -f -9 -c $PACKAGE-db.xml >$outdir/$PACKAGE-db.xml.gz - docbook_xml_gz_size=`calcsize $outdir/$PACKAGE-db.xml.gz` - mv $PACKAGE-db.xml $outdir/ - - cmd="${DOCBOOK2HTML} -o $split_html_db_dir ${outdir}/$PACKAGE-db.xml" - echo "Generating docbook HTML... ($cmd)" - eval "$cmd" - split_html_db_dir=html_node_db - ( - cd ${split_html_db_dir} || exit 1 - tar -czf ../$outdir/${PACKAGE}.html_node_db.tar.gz -- *.html - ) - html_node_db_tgz_size=`calcsize $outdir/${PACKAGE}.html_node_db.tar.gz` - rm -f $outdir/html_node_db/*.html - mkdir -p $outdir/html_node_db - mv ${split_html_db_dir}/*.html $outdir/html_node_db/ - rmdir ${split_html_db_dir} - - cmd="${DOCBOOK2TXT} ${outdir}/$PACKAGE-db.xml" - echo "Generating docbook ASCII... ($cmd)" - eval "$cmd" - docbook_ascii_size=`calcsize $PACKAGE-db.txt` - mv $PACKAGE-db.txt $outdir/ - - cmd="${DOCBOOK2PS} ${outdir}/$PACKAGE-db.xml" - echo "Generating docbook PS... $(cmd)" - eval "$cmd" - gzip -f -9 -c $PACKAGE-db.ps >$outdir/$PACKAGE-db.ps.gz - docbook_ps_gz_size=`calcsize $outdir/$PACKAGE-db.ps.gz` - mv $PACKAGE-db.ps $outdir/ - - cmd="${DOCBOOK2PDF} ${outdir}/$PACKAGE-db.xml" - echo "Generating docbook PDF... ($cmd)" - eval "$cmd" - docbook_pdf_size=`calcsize $PACKAGE-db.pdf` - mv $PACKAGE-db.pdf $outdir/ -fi - -echo Writing index file... -curdate=`date '+%B %d, %Y'` -sed \ - -e "s!%%TITLE%%!$MANUAL_TITLE!g" \ - -e "s!%%DATE%%!$curdate!g" \ - -e "s!%%PACKAGE%%!$PACKAGE!g" \ - -e "s!%%HTML_MONO_SIZE%%!$html_mono_size!g" \ - -e "s!%%HTML_MONO_GZ_SIZE%%!$html_mono_gz_size!g" \ - -e "s!%%HTML_NODE_TGZ_SIZE%%!$html_node_tgz_size!g" \ - -e "s!%%INFO_TGZ_SIZE%%!$info_tgz_size!g" \ - -e "s!%%DVI_GZ_SIZE%%!$dvi_gz_size!g" \ - -e "s!%%PDF_SIZE%%!$pdf_size!g" \ - -e "s!%%PS_GZ_SIZE%%!$ps_gz_size!g" \ - -e "s!%%ASCII_SIZE%%!$ascii_size!g" \ - -e "s!%%ASCII_GZ_SIZE%%!$ascii_gz_size!g" \ - -e "s!%%TEXI_TGZ_SIZE%%!$texi_tgz_size!g" \ - -e "s!%%DOCBOOK_HTML_NODE_TGZ_SIZE%%!$html_node_db_tgz_size!g" \ - -e "s!%%DOCBOOK_ASCII_SIZE%%!$docbook_ascii_size!g" \ - -e "s!%%DOCBOOK_PS_GZ_SIZE%%!$docbook_ps_gz_size!g" \ - -e "s!%%DOCBOOK_PDF_SIZE%%!$docbook_pdf_size!g" \ - -e "s!%%DOCBOOK_XML_SIZE%%!$docbook_xml_size!g" \ - -e "s!%%DOCBOOK_XML_GZ_SIZE%%!$docbook_xml_gz_size!g" \ - -e "s,%%SCRIPTURL%%,$scripturl,g" \ - -e "s!%%SCRIPTNAME%%!$prog!g" \ -$GENDOCS_TEMPLATE_DIR/gendocs_template >$outdir/index.html - -echo "Done! See $outdir/ subdirectory for new files." diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/gendocs_template b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/gendocs_template deleted file mode 100644 index e08a2cc..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/gendocs_template +++ /dev/null @@ -1,260 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<!-- $Id: gendocs_template,v 1.7 2005/05/15 00:00:08 karl Exp $ --> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> - -<!-- - - This template was adapted from Texinfo: - http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs_template - ---> - - -<head> -<title>%%TITLE%% - - - - - - - - - - - - - - -

%%TITLE%%

- - -
last updated %%DATE%%
- - - -
- -

This document is available in the following formats:

- - - -

(This page was generated by the %%SCRIPTNAME%% -script.)

- - - - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/local-time.texinfo b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/local-time.texinfo deleted file mode 100644 index 37eda5f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/local-time.texinfo +++ /dev/null @@ -1,774 +0,0 @@ -\input texinfo @c -*- Mode: Texinfo; Mode: auto-fill -*- -@c %**start of header -@setfilename local-time.info -@settitle The local-time Manual -@exampleindent 2 - -@c @documentencoding utf-8 - -@macro name {} -@code{local-time} -@end macro - -@macro mathx {tex, non-tex} -@iftex -@math{\tex\} -@end iftex -@ifnottex -@emph{\non-tex\} -@end ifnottex -@end macro - -@macro impnote {text} -@quotation Implementor's note -@emph{\text\} -@end quotation -@end macro - -@c Set ROMANCOMMENTS to get comments in roman font. -@ifset ROMANCOMMENTS -@alias lispcmt = r -@end ifset -@ifclear ROMANCOMMENTS -@alias lispcmt = asis -@end ifclear - -@c Index for public api. -@defindex it - -@macro pub {name} -@itindex \name\ -@c -@end macro - -@macro k {what} -@code{\what\} -@end macro - -@iftex -@alias v = asis -@alias cl = code -@end iftex - -@ifnottex -@alias v = var -@alias cl = strong -@end ifnottex - -@c Show variables, clauses, and concepts in the same index. -@syncodeindex it cp -@syncodeindex vr cp - -@copying -Copyright @copyright{} 2012 Daniel Lowe @* -Copyright @copyright{} 2012 Attila Lendvai @* - -@quotation -This manual describes the @name{} Common Lisp library which is -based on Erik Naggum's @emph{The Long, Painful History of Time} -[NaggumPaper] paper. - -@end quotation -@end copying -@c %**end of header - -@titlepage -@title The @name{} Manual -@subtitle Version 1.0.0 -@author Daniel Lowe -@author Attila Lendvai - -@page -@vskip 0pt plus 1filll -@insertcopying -@end titlepage - -@contents - -@ifnottex -@node Top -@top @name{} -@insertcopying -@end ifnottex - -@menu -* Introduction:: -* Public API:: -* Other Features:: -* References:: -* Comprehensive Index:: -@end menu - -@c =================================================================== -@node Introduction -@chapter Introduction - -@menu -* Portability:: -@end menu - -The @name{} library is a Common Lisp library for the manipulation of -dates, times and intervals. It was originally based almost entirely -upon Erik Naggum's paper @emph{The Long Painful History of Time} -[NaggumPaper]. Many of the core concepts originated from this paper, -such as the seperation of days and seconds, the choice of 2000-03-01 -as the standard epoch, and the timestring format. - -@c =================================================================== -@node Portability -@section Portability - -This implementation assumes that time zone information is stored in -the tzfile format. The default timezone is loaded from -/etc/localtime. On non-POSIX systems, this will certainly give -different results than the system time handling. - -local-time currently supports sub-second precision clocks with ABCL, -Allegro, CMUCL, CCL, SBCL, and LispWorks for Linux or Darwin. All -others will be able to retrieve the time with second precision using -@code{get-universal-time}. You may add support for your own -implementation by implementing the clock generic protocol documented -here. - -@c =================================================================== -@node Public API -@chapter Public API - -@menu -* Types:: -* Timezones:: -* Creating timestamp Objects:: -* Querying timestamp Objects:: -* Manipulating Date and Time Values:: -* Parsing and Formatting:: -* Clocks:: -@end menu - -@c =================================================================== -@node Types -@section Types - -It's a good idea to treat all values as immutable objects. @name{} -will not modify any object it was given unless explicitly asked to by -the @code{:into} keyword argument. - -@itindex timestamp -@deftp Class timestamp day sec nsec - -@code{timestamp} values can represent either a @emph{date}, -a @emph{daytime} or a @emph{time} value. It has the following slots: - -@lisp -(defclass timestamp () - ((day :type integer) - (sec :type integer) - (nsec :type (integer 0 999999999)))) -@end lisp - -The following constraints apply to the specific types: -@itemize - -@item -@emph{date}: must have a @var{+utc-zone+} timezone and the @var{sec} -slot must be the first second of a day; In other words, the time -elements of the @code{timestamp} value must have their least possible -values. - -@item -@emph{time}: the @var{day} slot must be zero. - -@end itemize -@end deftp - -@deftp Struct timezone path name loaded - -@code{timezone} objects represent timezones - local and political -modifications to the time representation. Timezones are responsible -for storing offsets from GMT, abbreviations for different -sub-timezones, and the times each sub-timezone is to be in effect. - -@end deftp - -@c =================================================================== -@node Timezones -@section Timezones - -@itindex *default-timezone* -@defvr Default *default-timezone* - -The variable @var{*default-timezone*} contains the timezone that will -be used by default if none is specified. It is loaded from -@emph{/etc/localtime} when the library is loaded. If -@emph{/etc/localtime} is not present, it will default to UTC. - -@end defvr - -@itindex +utc-zone+ -@defvr Constant +utc-zone+ - -The variable @var{+utc-zone+} contains a timezone corresponding to -UTC. - -@end defvr - - -@itindex define-timezone -@defmac define-timezone zone-name zone-file &key (load nil) - -Define @var{zone-name} (a symbol or a string) as a new timezone, -lazy-loaded from @var{zone-file} (a pathname designator relative to -the zoneinfo directory on this system. If @var{load} is true, load -immediately. - -@end defmac - -@itindex find-timezone-by-location-name -@defun find-timezone-by-location-name name - -Returns the timezone found at the location name (such as -@code{US/Eastern}). @code{reread-timezone-repository} must be called -before this function is used. - -@end defun - -@itindex reread-timezone-repository -@defun reread-timezone-repository &key (timezone-repository *default-timezone-repository-path*) - -Walks the current repository, reading all tzinfo files updating -indexes. The default timezone repository is set to the zoneinfo/ -directory of the local-time system. - -@end defun - -@c =================================================================== -@node Creating timestamp Objects -@section Creating @code{timestamp} Objects - -@itindex universal-to-timestamp -@defun universal-to-timestamp universal &key (nsec 0) - -Produces a @code{timestamp} instance from the provided universal time -@var{universal}. Universal time is defined in the Common Lisp -Specification as the number of seconds since 1900-01-01T00:00:00Z. -@end defun - - -@itindex unix-to-timestamp -@defun unix-to-timestamp unix &key (nsec 0) - -Produces a @code{timestamp} instance from the provided unix time -@var{unix}. Unix time is defined by POSIX as the number of seconds -since 1970-01-01T00:00:00Z. -@end defun - - -@itindex now -@defun now - -Produces a @code{timestamp} instance with the current time. With -Allegro, CMUCL, CCL, SBCL, and LispWorks for Linux or Darwin, the new -timestamp will be precise to the microsecond (usec); with ABCL, to the -millisecond (ms). Otherwise, the precision is limited to the second. -@end defun - - -@itindex today -@defun today - -Produces a @code{timestamp} instance that corresponds to today's -date, which is the midnight of the current day in the UTC zone. -@end defun - - -@itindex encode-timestamp -@defun encode-timestamp nsec sec minute hour day month year &key timezone offset into - -Returns a new @code{timestamp} instance corresponding to the specified -time elements. The @var{offset} is the number of seconds offset from -UTC of the locale. If @var{offset} is not specified, the offset will -be guessed from the @var{timezone}. If a @code{timestamp} is passed -as the @var{into} argument, its value will be set and that -@code{timestamp} will be returned. Otherwise, a new @code{timestamp} -is created. -@end defun - - -@itindex make-timestamp -@defmac make-timestamp &key :day :sec :nsec - -Expands to an expression that creates an instance of a -@code{timestamp} exactly as specified. -@end defmac - - -@itindex clone-timestamp -@defmac clone-timestamp timestamp - -Expands to an expression that creates another copy of @var{timestamp} -that is @code{timestamp=} to it. -@end defmac - - -@c =================================================================== -@node Querying timestamp Objects -@section Querying @code{timestamp} Objects - -@itindex day-of -@defun day-of timestamp - -Returns the day component of @var{timestamp}. Although Naggum's paper -specifies that the day should be a signed fixnum, it is left unbounded -for flexibility reasons. -@end defun - -@itindex sec-of -@defun sec-of timestamp - -Returns the 'seconds' component of the time. Valid values for the -seconds range from 0 to 86399. -@end defun - -@itindex nsec-of -@defun nsec-of timestamp - -Returns the 'microseconds' component of the time. Valid values for -the nanoseconds range from 0 to 999999999. -@end defun - -@itindex timestamp-to-universal -@defun timestamp-to-universal timestamp - -This returns the date/time specified in @var{timestamp} encoded as -the number of seconds since January 1st, 1900 12:00am UTC. -@end defun - -@itindex timestamp-to-unix -@defun timestamp-to-unix timestamp - -This returns the date/time specified in @var{timestamp} encoded as -the number of seconds since January 1st, 1970 12:00am UTC. It -corresponds with the time received from the POSIX call @code{time()}. -@end defun - -@itindex timestamp-subtimezone -@defun timestamp-subtimezone timestamp timezone - -Returns as multiple values the time zone applicable at the given time -as the number of seconds east of UTC, a boolean daylight-saving-p, and -the customary abbreviation of the timezone. -@end defun - - -@itindex with-decoded-timestamp -@defmac with-decoded-timestamp (&key nsec sec minute hour day month year day-of-week daylight-p timezone) timestamp &body body - -This macro binds variables to the decoded elements of @var{timestamp}. -The timezone argument is used for decoding the timestamp, and is not -bound by the macro. The value of @var{day-of-week} starts from 0 which -means Sunday. -@end defmac - - -@itindex decode-timestamp -@defun decode-timestamp timestamp - -Returns the decoded time as @code{(values ns ss mm hh day month -year day-of-week daylight-saving-time-p timezone-offset timezone-abbreviation)}. -@end defun - - -@itindex timestamp< -@itindex timestamp<= -@itindex timestamp> -@itindex timestamp>= -@itindex timestamp= -@itindex timestamp/= -@defun timestamp< time-a time-b -@defunx timestamp<= time-a time-b -@defunx timestamp> time-a time-b -@defunx timestamp>= time-a time-b -@defunx timestamp= time-a time-b -@defunx timestamp/= time-a time-b - -These comparison functions act like their string and char counterparts. -@end defun - - -@itindex timestamp-minimum -@defun timestamp-minimum timestamp &rest timestamps - -Returns the earliest timestamp passed to it. -@end defun - - -@itindex timestamp-maximum -@defun timestamp-maximum timestamp &rest timestamps - -Returns the latest timestamp passed to it. -@end defun - - -@itindex timestamp-day-of-week -@defun timestamp-day-of-week timestamp - -This returns the index of the day of the week, -starting at 0 which means Sunday. -@quotation Note -''Day of the week'' is ambigous and locale dependent. -@end quotation -@end defun - - -@itindex universal-to-timestamp -@defun universal-to-timestamp timestamp - -Returns the UNIVERSAL-TIME corresponding to @var{timestamp}. -@quotation Note -Subsecond precision is not preserved. -@end quotation -@end defun - - -@itindex timestamp-millennium -@itindex timestamp-century -@itindex timestamp-decade -@defun timestamp-millennium timestamp &key timezone -@defunx timestamp-century timestamp &key timezone -@defunx timestamp-decade timestamp &key timezone - -Returns the ordinal millennium, century or decade upon which the -timestamp falls. Ordinal time values start at 1, so the -(timestamp-century (now)) will return 21. - -@end defun - -@itindex timestamp-year -@itindex timestamp-month -@itindex timestamp-day -@itindex timestamp-hour -@itindex timestamp-minute -@itindex timestamp-second -@itindex timestamp-millisecond -@itindex timestamp-microsecond -@defun timestamp-year timestamp &key timezone -@defunx timestamp-month timestamp &key timezone -@defunx timestamp-day timestamp &key timezone -@defunx timestamp-hour timestamp &key timezone -@defunx timestamp-minute timestamp &key timezone -@defunx timestamp-second timestamp &key timezone -@defunx timestamp-millisecond timestamp &key timezone -@defunx timestamp-microsecond timestamp &key timezone -@defunx timestamp-microsecond timestamp &key timezone - -Returns the decoded part of the timestamp. -@end defun - - -@c =================================================================== -@node Manipulating Date and Time Values -@section Manipulating Date and Time Values - -@itindex timestamp+ -@itindex timestamp- -@defun timestamp+ time amount unit -@defunx timestamp- time amount unit - -Add or subtract the @var{amount} to the @var{time} using the specified -@var{unit}. @var{unit} may be one of ( @code{:nsec} @code{:sec} -@code{:minute} @code{:hour} @code{:day} @code{:month} @code{:year}). -The value of the parts of the timestamp of higher resolution than the -UNIT will never be touched. If you want a precise number of seconds -from a time, you should specify the offset in seconds. -@end defun - -@itindex timestamp-maximize-part -@defun timestamp-maximize-part timestamp part &key offset timezone into - -Returns a timestamp with its parts maximized up to @var{part}. @var{part} can be -any of (:nsec :sec :min :hour :day :month). If @var{into} is specified, it -will be modified and returned, otherwise a new timestamp will be -created. -@end defun - - -@itindex timestamp-minimize-part -@defun timestamp-minimize-part timestamp part &key offset timezone into - -Returns a timestamp with its parts minimized up to @var{part}. @var{part} can be -any of (:nsec :sec :min :hour :day :month). If @var{into} is specified, it -will be modified and returned, otherwise a new timestamp will be -created. -@end defun - - -@itindex adjust-timestamp -@defmac adjust-timestamp timestamp &body changes - -Alters various parts of @var{timestamp}, given a list of changes. The -changes are in the format @code{(offset part value)} and @code{(set -part value)}. - -@lisp -;; Return a new @code{timestamp} value that points to the Monday in -;; the week of @code{(today)} -(adjust-timestamp (today) (offset :day-of-week :monday)) - -;; Return a new @code{timestamp} value that points three days ahead from now -(adjust-timestamp (today) (offset :day 3)) -@end lisp - -Keep in mind that @code{adjust-timestamp} is not a mere setter for -fields but instead it handles overflows and timezone conversions as -expected. Also note that it's possible to specify multiple commands. - -The list of possible places to manipulate are: @code{:nsec} -@code{:sec} @code{:sec-of-day} @code{:minute} @code{:hour} -@code{:day} @code{:day-of-month} @code{:month} @code{:year}. -@end defmac - - -@itindex adjust-timestamp! -@defmac adjust-timestamp! timestamp &body changes - -Just like @code{adjust-timestamp}, but instead of returning a freshly -constructed value, it alters the provided @var{timestamp} value (and -returns it). -@end defmac - - -@itindex timestamp-whole-year-difference -@defun timestamp-whole-year-difference time-a time-b - -Returns the number of whole years elapsed between @var{time-a} and @var{time-b}. -@quotation Note -This is useful for calculating anniversaries and birthdays. -@end quotation -@end defun - - -@itindex days-in-month -@defun days-in-month month year - -Returns the number of days in a given month of the specified year. -@end defun - - -@c =================================================================== -@node Parsing and Formatting -@section Parsing and Formatting - - -@itindex +iso-8601-format+ -@defvr Constant +iso-8601-format+ - -The constant @var{+iso-8601-format+} is bound to a description of the ISO 8601 format. An output with this format will look like this: @samp{2008-03-01T19:42:34.608506+01:00}. This is the default format for the @code{format-timestring} function. - -@end defvr - -@itindex +asctime-format+ -@defvr Constant +asctime-format+ - -The constant @var{+asctime-format+} is bound to a format mirroring the output of the POSIX asctime() function. An output with this format will look like this: @samp{Sat Mar 1 19:42:34 2008}. - -@end defvr - -@itindex +rfc-1123-format+ -@defvr Constant +rfc-1123-format+ - -The constant @var{+rfc-1123-format+} is bound to a description of the format defined in RFC 1123 for Internet timestamps. An output with this format will look like this: @samp{Sat, 01 Mar 2008 19:42:34 -0500}. - -@end defvr - -@itindex +iso-week-date-format+ -@defvr Constant +iso-week-date-format+ - -The constant @var{+iso-week-date-format+} is bound to a description of the ISO 8601 Week Date format. An output with this format will look like this: @samp{2009-W53-5}. - -@end defvr - -@itindex parse-timestring -@defun parse-timestring timestring &key (start 0) end (fail-on-error t) (offset 0) - -Parses a timestring and returns the corresponding @code{timestamp}. -Parsing begins at @var{start} and stops at the @var{end} -position. If there are invalid characters within @code{timestring} -and @var{fail-on-error} is @code{T}, then an @code{invalid-timestring} -error is signaled, otherwise @code{NIL} is returned. - -If there is no timezone specified in @code{timestring} then -@var{offset} is used as the default timezone offset (in seconds). -@end defun - - -@itindex format-timestring -@defun format-timestring (destination timestamp &key (format +iso-8601-format+) (timezone *default-timezone*)) - -Constructs a string representation of TIMESTAMP according to FORMAT and returns it. If destination is @code{T}, the string is written to @code{*standard-output*}. If destination is a stream, the string is written to the stream. - -FORMAT is a list containing one or more of strings, characters, and keywords. Strings and characters are output literally, while keywords are replaced by the values here: - -@table @code -@item :year -*year -@item :month -*numeric month -@item :day -*day of month -@item :weekday -*numeric day of week, starting from 0 which means Sunday -@item :hour -*hour -@item :min -*minutes -@item :sec -*seconds -@item :msec -*milliseconds -@item :usec -*microseconds -@item :nsec -*nanoseconds -@item :iso-week-year -*year for ISO week date (can be different from regular calendar year) -@item :iso-week-number -*ISO week number (i.e. 1 through 53) -@item :iso-week-day -*ISO compatible weekday number (i.e. monday=1, sunday=7) -@item :ordinal-day -day of month as an ordinal (e.g. 1st, 23rd) -@item :long-weekday -long form of weekday (e.g. Sunday, Monday) -@item :short-weekday -short form of weekday (e.g. Sun, Mon) -@item :minimal-weekday -minimal form of weekday (e.g. Su, Mo) -@item :short-year -short form of year (last 2 digits, e.g. 41, 42 instead of 2041, 2042) -@item :long-month -long form of month (e.g. January, February) -@item :short-month -short form of month (e.g. Jan, Feb) -@item :hour12 -hour on a 12-hour clock -@item :ampm -am/pm marker in lowercase -@item :gmt-offset -the gmt-offset of the time, in +00:00 form -@item :gmt-offset-or-z -like :gmt-offset, but is Z when UTC -@item :gmt-offset-hhmm -like :gmt-offset, but in +0000 form -@item :timezone -timezone abbrevation for the time -@end table - -Elements marked by * can be placed in a list in the form: -@lisp -(:keyword padding &optional (padchar #\0)) -@end lisp -The string representation of the value will be padded with the padchar. - -You can see examples by examining the values in @var{+iso-8601-format+}, @var{+asctime-format+}, and @var{+rfc-1123-format+}. - -Produces on @var{stream} the timestring corresponding to the @var{timestamp} with -the given options. If @var{stream} is @code{nil}, only returns a string containing what -would have been the output. If @var{stream} is @code{t}, prints the string to -@var{*standard-output*}. - -Example output: -@lisp -LOCAL-TIME> (format-timestring nil (now)) -"2008-03-01T19:42:34.608506+01:00" -@end lisp -@end defun - - -@itindex format-rfc3339-timestring -@defun format-rfc3339-timestring (destination timestamp &key omit-date-part omit-time-part omit-timezone-part (use-zulu t)) - -Formats the time like format-timestring, but in RFC 3339 format. The options control valid options in the RFC. -@end defun - - -@itindex format-rfc1123-timestring -@defun format-rfc1123-timestring (destination timestamp &key (timezone *default-timezone*)) - -Formats the time like format-timestring, but in RFC 1123 format. -@end defun - -@c =================================================================== -@node Clocks -@section Clocks - -@defvr Default *clock* - -The *clock* special variable and the following generic functions are -exposed so that applications may re-define the current time or date as -required. This can be used for testing or to support alternate clocks. - -The currently supported values are: - -@itemize -@item @code{t} - Use the standard system clock with no adjustments -@item @code{leap-second-adjusted} - The system clock, adjusted for leap seconds using the information in *default-timezone*. -@end itemize - -@end defvr - -@defun clock-now (clock) - -Specialize this generic function to re-define the present moment -@end defun - -@defun clock-today (clock) - -Specialize this generic function to re-define the present day -@end defun - -@c =================================================================== -@node Other Features -@chapter Other Features - -@section Reader Macros - -@itindex enable-read-macros -@defun enable-read-macros - -Adds @@TIMESTRING and #@@UNIVERSAL-TIME as reader macros. -@end defun - - -@section Support for non-Gregorian Calendars - -@itindex astronomical-julian-date -@defun astronomical-julian-date timestamp - -Returns the julian date of the date portion of @var{timestamp}. -@end defun - - -@itindex modified-julian-date -@defun astronomical-julian-date timestamp - -Returns the modified julian date of the date portion of @var{timestamp}. -@end defun - -@c =================================================================== -@node References -@chapter References - -@itemize - -@item -[NaggumPaper] Erik Naggum. @emph{The Long Painful History of Time} -@url{http://naggum.no/lugm-time.html}, 1999. - -@end itemize - - -@c =================================================================== -@node Comprehensive Index -@unnumbered Index -@printindex cp - -@bye diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/style.css b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/style.css deleted file mode 100644 index 1499f5f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/doc/style.css +++ /dev/null @@ -1,48 +0,0 @@ -body {font-family: century schoolbook, serif; - line-height: 1.3; - padding-left: 5em; padding-right: 1em; - padding-bottom: 1em; max-width: 60em;} -table {border-collapse: collapse} -span.roman { font-family: century schoolbook, serif; font-weight: normal; } -h1, h2, h3, h4, h5, h6 {font-family: Helvetica, sans-serif} -/*h4 {padding-top: 0.75em;}*/ -dfn {font-family: inherit; font-variant: italic; font-weight: bolder } -kbd {font-family: monospace; text-decoration: underline} -/*var {font-family: Helvetica, sans-serif; font-variant: slanted}*/ -var {font-variant: slanted;} -td {padding-right: 1em; padding-left: 1em} -sub {font-size: smaller} -.node {padding: 0; margin: 0} - -.lisp { font-family: monospace; - background-color: #F4F4F4; border: 1px solid #AAA; - padding-top: 0.5em; padding-bottom: 0.5em; } - -/* coloring */ - -.lisp-bg { background-color: #F4F4F4 ; color: black; } -.lisp-bg:hover { background-color: #F4F4F4 ; color: black; } - -.symbol { font-weight: bold; color: #770055; background-color : transparent; border: 0px; margin: 0px;} -a.symbol:link { font-weight: bold; color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } -a.symbol:active { font-weight: bold; color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } -a.symbol:visited { font-weight: bold; color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } -a.symbol:hover { font-weight: bold; color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } -.special { font-weight: bold; color: #FF5000; background-color: inherit; } -.keyword { font-weight: bold; color: #770000; background-color: inherit; } -.comment { font-weight: normal; color: #007777; background-color: inherit; } -.string { font-weight: bold; color: #777777; background-color: inherit; } -.character { font-weight: bold; color: #0055AA; background-color: inherit; } -.syntaxerror { font-weight: bold; color: #FF0000; background-color: inherit; } -span.paren1 { font-weight: bold; color: #777777; } -span.paren1:hover { color: #777777; background-color: #BAFFFF; } -span.paren2 { color: #777777; } -span.paren2:hover { color: #777777; background-color: #FFCACA; } -span.paren3 { color: #777777; } -span.paren3:hover { color: #777777; background-color: #FFFFBA; } -span.paren4 { color: #777777; } -span.paren4:hover { color: #777777; background-color: #CACAFF; } -span.paren5 { color: #777777; } -span.paren5:hover { color: #777777; background-color: #CAFFCA; } -span.paren6 { color: #777777; } -span.paren6:hover { color: #777777; background-color: #FFBAFF; } diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/local-time.asd b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/local-time.asd deleted file mode 100644 index 922f583..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/local-time.asd +++ /dev/null @@ -1,29 +0,0 @@ -(defsystem "local-time" - :version "1.0.6" - :license "BSD" - :author "Daniel Lowe " - :description "A library for manipulating dates and times, based on a paper by Erik Naggum" - :depends-on (:cl-fad) - :in-order-to ((test-op (test-op "local-time/test"))) - :components ((:module "src" - :serial t - :components ((:file "package") - (:file "local-time"))))) - -(defsystem "local-time/test" - :version "1.0.6" - :author "Daniel Lowe " - :description "Testing code for the local-time library" - :depends-on (:stefil - :local-time) - :perform (test-op (o s) (uiop:symbol-call '#:stefil - '#:funcall-test-with-feedback-message - (uiop:find-symbol* '#:test '#:local-time.test))) - :components ((:module "test" - :serial t - :components ((:file "package") - (:file "simple") - (:file "comparison") - (:file "formatting") - (:file "parsing") - (:file "timezone"))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/src/integration/cl-postgres.lisp b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/src/integration/cl-postgres.lisp deleted file mode 100644 index 972709f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/src/integration/cl-postgres.lisp +++ /dev/null @@ -1,46 +0,0 @@ -(in-package :local-time) - -(export 'set-local-time-cl-postgres-readers :local-time) - -;; Postgresql days are measured from 2000-01-01, whereas local-time -;; uses 2000-03-01. We expect the database server to be in the UTC timezone. -(defconstant +postgres-day-offset-to-local-time+ -60) - -(defun set-local-time-cl-postgres-readers (&optional (table cl-postgres:*sql-readtable*)) - (flet ((timestamp-reader (usecs) - (multiple-value-bind (days usecs) - (floor usecs +usecs-per-day+) - (multiple-value-bind (secs usecs) - (floor usecs 1000000) - (local-time:make-timestamp :nsec (* usecs 1000) - :sec secs - :day (+ days +postgres-day-offset-to-local-time+)))))) - (cl-postgres:set-sql-datetime-readers - :table table - :date (lambda (days) - (local-time:make-timestamp - :nsec 0 :sec 0 - :day (+ days +postgres-day-offset-to-local-time+))) - :timestamp #'timestamp-reader - :timestamp-with-timezone #'timestamp-reader - :interval - (lambda (months days usecs) - (declare (ignore months days usecs)) - (error "Intervals are not yet supported")) - :time - (lambda (usecs) - (multiple-value-bind (days usecs) - (floor usecs +usecs-per-day+) - (assert (= days 0)) - (multiple-value-bind (secs usecs) - (floor usecs 1000000) - (let ((time-of-day (local-time:make-timestamp - :nsec (* usecs 1000) - :sec secs - :day 0))) - (check-type time-of-day time-of-day) - time-of-day))))))) - -(defmethod cl-postgres:to-sql-string ((arg local-time:timestamp)) - (format nil "'~a'" - (local-time:format-rfc3339-timestring nil arg :timezone +utc-zone+))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/src/local-time.lisp b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/src/local-time.lisp deleted file mode 100644 index 99b9af0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/src/local-time.lisp +++ /dev/null @@ -1,1906 +0,0 @@ -(in-package #:local-time) - -;;; Types - -(defclass timestamp () - ((day :accessor day-of :initarg :day :initform 0 :type integer) - (sec :accessor sec-of :initarg :sec :initform 0 :type integer) - (nsec :accessor nsec-of :initarg :nsec :initform 0 :type (integer 0 999999999)))) - -(defstruct subzone - (abbrev nil) - (offset nil) - (daylight-p nil)) - -(defstruct timezone - (transitions #(0) :type simple-vector) - (indexes #(0) :type simple-vector) - (subzones #() :type simple-vector) - (leap-seconds nil :type list) - (path nil) - (name "anonymous" :type string) - (loaded nil :type boolean)) - -(deftype timezone-offset () - '(integer -43200 50400)) - -(defun %valid-time-of-day? (timestamp) - (zerop (day-of timestamp))) - -(deftype time-of-day () - '(and timestamp - (satisfies %valid-time-of-day?))) - -(defun %valid-date? (timestamp) - (and (zerop (sec-of timestamp)) - (zerop (nsec-of timestamp)))) - -(deftype date () - '(and timestamp - (satisfies %valid-date?))) - -(define-condition invalid-timezone-file (error) - ((path :accessor path-of :initarg :path)) - (:report (lambda (condition stream) - (format stream "The file at ~a is not a timezone file." - (path-of condition))))) - -(define-condition invalid-time-specification (error) - () - (:report "The time specification is invalid")) - -(define-condition invalid-timestring (error) - ((timestring :accessor timestring-of :initarg :timestring) - (failure :accessor failure-of :initarg :failure)) - (:report (lambda (condition stream) - (format stream "Failed to parse ~S as an rfc3339 time: ~S" - (timestring-of condition) - (failure-of condition))))) - -(defmethod make-load-form ((self timestamp) &optional environment) - (make-load-form-saving-slots self :environment environment)) - -;;; Declaims - -(declaim (inline now format-timestring %get-current-time - format-rfc3339-timestring to-rfc3339-timestring - format-rfc1123-timestring to-rfc1123-timestring) - (ftype (function (&rest t) string) format-rfc3339-timestring) - (ftype (function (&rest t) string) format-timestring) - (ftype (function (&rest t) fixnum) local-timezone) - (ftype (function (&rest t) (values - timezone-offset - boolean - string)) timestamp-subzone) - (ftype (function (timestamp &key (:timezone timezone) (:offset (or null integer))) - (values (integer 0 999999999) - (integer 0 59) - (integer 0 59) - (integer 0 23) - (integer 1 31) - (integer 1 12) - (integer -1000000 1000000) - (integer 0 6) - t - timezone-offset - simple-string)) - decode-timestamp)) - -;;; Variables - -(defvar *default-timezone*) - -(defparameter *default-timezone-repository-path* - (flet ((try (project-home-directory) - (when project-home-directory - (ignore-errors - (truename - (merge-pathnames "zoneinfo/" - (make-pathname :directory (pathname-directory project-home-directory)))))))) - (or (when (find-package "ASDF") - (let ((path (eval (read-from-string - "(let ((system (asdf:find-system :local-time nil))) - (when system - (asdf:component-pathname system)))")))) - (try path))) - (let ((path (or #.*compile-file-truename* - *load-truename*))) - (when path - (try (merge-pathnames "../" path))))))) - -;;; Month information -(defparameter +month-names+ - #("" "January" "February" "March" "April" "May" "June" "July" "August" - "September" "October" "November" "December")) -(defparameter +short-month-names+ - #("" "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" - "Dec")) -(defparameter +day-names+ - #("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday")) -(defparameter +day-names-as-keywords+ - #(:sunday :monday :tuesday :wednesday :thursday :friday :saturday)) -(defparameter +short-day-names+ - #("Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat")) -(defparameter +minimal-day-names+ - #("Su" "Mo" "Tu" "We" "Th" "Fr" "Sa")) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defconstant +months-per-year+ 12) - (defconstant +days-per-week+ 7) - (defconstant +hours-per-day+ 24) - (defconstant +minutes-per-day+ 1440) - (defconstant +minutes-per-hour+ 60) - (defconstant +seconds-per-day+ 86400) - (defconstant +seconds-per-hour+ 3600) - (defconstant +seconds-per-minute+ 60) - (defconstant +usecs-per-day+ 86400000000)) - -(defparameter +iso-8601-date-format+ - '((:year 4) #\- (:month 2) #\- (:day 2))) - -(defparameter +iso-8601-time-format+ - '((:hour 2) #\: (:min 2) #\: (:sec 2) #\. (:usec 6))) - -(defparameter +iso-8601-format+ - ;; 2008-11-18T02:32:00.586931+01:00 - (append +iso-8601-date-format+ (list #\T) +iso-8601-time-format+ (list :gmt-offset-or-z))) - -(defparameter +rfc3339-format+ +iso-8601-format+) - -(defparameter +rfc3339-format/date-only+ - '((:year 4) #\- (:month 2) #\- (:day 2))) - -(defparameter +asctime-format+ - '(:short-weekday #\space :short-month #\space (:day 2 #\space) #\space - (:hour 2) #\: (:min 2) #\: (:sec 2) #\space - (:year 4))) - -(defparameter +rfc-1123-format+ - ;; Sun, 06 Nov 1994 08:49:37 GMT - '(:short-weekday ", " (:day 2) #\space :short-month #\space (:year 4) #\space - (:hour 2) #\: (:min 2) #\: (:sec 2) #\space :gmt-offset-hhmm) - "See the RFC 1123 for the details about the possible values of the timezone field.") - -(defparameter +iso-week-date-format+ - ;; 2009-W53-5 - '((:iso-week-year 4) #\- #\W (:iso-week-number 2) #\- (:iso-week-day 1))) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defparameter +rotated-month-days-without-leap-day+ - #.(coerce #(31 30 31 30 31 31 30 31 30 31 31 28) - '(simple-array fixnum (*)))) - - (defparameter +rotated-month-offsets-without-leap-day+ - (coerce - (cons 0 - (loop with sum = 0 - for days :across +rotated-month-days-without-leap-day+ - collect (incf sum days))) - '(simple-array fixnum (*))))) - -;; The astronomical julian date offset is the number of days between -;; the current date and -4713-01-01T00:00:00+00:00 -(defparameter +astronomical-julian-date-offset+ -2451605) - -;; The modified julian date is the number of days between the current -;; date and 1858-11-17T12:00:00+00:00. TODO: For the sake of simplicity, -;; we currently just do the date arithmetic and don't adjust for the -;; time of day. -(defparameter +modified-julian-date-offset+ -51604) - -(defun %guess-offset (seconds days &optional timezone) - ;; try converting the local time to a timestamp using each available - ;; subtimezone, until we find one where the offset matches the offset that - ;; applies at that time (according to the transition table). - ;; - ;; Consequence for ambiguous cases: - ;; Whichever subtimezone is listed first in the tzinfo database will be - ;; the one that we pick to resolve ambiguous local time representations. - (let* ((zone (%realize-timezone (or timezone *default-timezone*))) - (unix-time (timestamp-values-to-unix seconds days)) - (subzone-idx (if (zerop (length (timezone-indexes zone))) - 0 - (elt (timezone-indexes zone) - (transition-position unix-time - (timezone-transitions zone))))) - (subzone (elt (timezone-subzones zone) subzone-idx))) - (subzone-offset subzone))) - -(defun %read-binary-integer (stream byte-count &optional (signed nil)) - "Read BYTE-COUNT bytes from the binary stream STREAM, and return an integer which is its representation in network byte order (MSB). If SIGNED is true, interprets the most significant bit as a sign indicator." - (loop - :with result = 0 - :for offset :from (* (1- byte-count) 8) :downto 0 :by 8 - :do (setf (ldb (byte 8 offset) result) (read-byte stream)) - :finally (if signed - (let ((high-bit (* byte-count 8))) - (if (logbitp (1- high-bit) result) - (return (- result (ash 1 high-bit))) - (return result))) - (return result)))) - -(defun %string-from-unsigned-byte-vector (vector offset) - "Returns a string created from the vector of unsigned bytes VECTOR starting at OFFSET which is terminated by a 0." - (declare (type (vector (unsigned-byte 8)) vector)) - (let* ((null-pos (or (position 0 vector :start offset) (length vector))) - (result (make-string (- null-pos offset)))) - (loop for input-index :from offset :upto (1- null-pos) - for output-index :upfrom 0 - do (setf (aref result output-index) (code-char (aref vector input-index)))) - result)) - -(defun %find-first-std-offset (timezone-indexes timestamp-info) - (let ((subzone-idx (find-if 'subzone-daylight-p - timezone-indexes - :key (lambda (x) (aref timestamp-info x))))) - (subzone-offset (aref timestamp-info (or subzone-idx 0))))) - -(defun %tz-verify-magic-number (inf zone) - ;; read and verify magic number - (let ((magic-buf (make-array 4 :element-type 'unsigned-byte))) - (read-sequence magic-buf inf :start 0 :end 4) - (when (string/= (map 'string #'code-char magic-buf) "TZif" :end1 4) - (error 'invalid-timezone-file :path (timezone-path zone)))) - ;; skip 16 bytes for "future use" - (let ((ignore-buf (make-array 16 :element-type 'unsigned-byte))) - (read-sequence ignore-buf inf :start 0 :end 16))) - -(defun %tz-read-header (inf) - `(:utc-count ,(%read-binary-integer inf 4) - :wall-count ,(%read-binary-integer inf 4) - :leap-count ,(%read-binary-integer inf 4) - :transition-count ,(%read-binary-integer inf 4) - :type-count ,(%read-binary-integer inf 4) - :abbrev-length ,(%read-binary-integer inf 4))) - -(defun %tz-read-transitions (inf count) - (make-array count - :initial-contents - (loop for idx from 1 upto count - collect (%read-binary-integer inf 4 t)))) - -(defun %tz-read-indexes (inf count) - (make-array count - :initial-contents - (loop for idx from 1 upto count - collect (%read-binary-integer inf 1)))) - -(defun %tz-read-subzone (inf count) - (loop for idx from 1 upto count - collect (list (%read-binary-integer inf 4 t) - (%read-binary-integer inf 1) - (%read-binary-integer inf 1)))) - -(defun leap-seconds-sec (leap-seconds) - (car leap-seconds)) -(defun leap-seconds-adjustment (leap-seconds) - (cdr leap-seconds)) - -(defun %tz-read-leap-seconds (inf count) - (when (plusp count) - (loop for idx from 1 upto count - collect (%read-binary-integer inf 4) into sec - collect (%read-binary-integer inf 4) into adjustment - finally (return (cons (make-array count :initial-contents sec) - (make-array count :initial-contents adjustment)))))) - -(defun %tz-read-abbrevs (inf length) - (let ((a (make-array length :element-type '(unsigned-byte 8)))) - (read-sequence a inf - :start 0 - :end length) - a)) - -(defun %tz-read-indicators (inf length) - ;; read standard/wall indicators - (let ((buf (make-array length :element-type '(unsigned-byte 8)))) - (read-sequence buf inf - :start 0 - :end length) - (make-array length - :element-type 'bit - :initial-contents buf))) - -(defun %tz-make-subzones (raw-info abbrevs gmt-indicators std-indicators) - (declare (ignore gmt-indicators std-indicators)) - ;; TODO: handle TZ environment variables, which use the gmt and std - ;; indicators - (make-array (length raw-info) - :element-type 'subzone - :initial-contents - (loop for info in raw-info collect - (make-subzone - :offset (first info) - :daylight-p (/= (second info) 0) - :abbrev (%string-from-unsigned-byte-vector abbrevs (third info)))))) - -(defun %realize-timezone (zone &optional reload) - "If timezone has not already been loaded or RELOAD is non-NIL, loads the timezone information from its associated unix file. If the file is not a valid timezone file, the condition INVALID-TIMEZONE-FILE will be signaled." - (when (or reload (not (timezone-loaded zone))) - (with-open-file (inf (timezone-path zone) - :direction :input - :element-type 'unsigned-byte) - (%tz-verify-magic-number inf zone) - - ;; read header values - (let* ((header (%tz-read-header inf)) - (timezone-transitions (%tz-read-transitions inf (getf header :transition-count))) - (subzone-indexes (%tz-read-indexes inf (getf header :transition-count))) - (subzone-raw-info (%tz-read-subzone inf (getf header :type-count))) - (abbreviation-buf (%tz-read-abbrevs inf (getf header :abbrev-length))) - (leap-second-info (%tz-read-leap-seconds inf (getf header :leap-count))) - (std-indicators (%tz-read-indicators inf (getf header :wall-count))) - (gmt-indicators (%tz-read-indicators inf (getf header :utc-count))) - (subzone-info (%tz-make-subzones subzone-raw-info - abbreviation-buf - gmt-indicators - std-indicators))) - - (setf (timezone-transitions zone) timezone-transitions) - (setf (timezone-indexes zone) subzone-indexes) - (setf (timezone-subzones zone) subzone-info) - (setf (timezone-leap-seconds zone) leap-second-info)) - (setf (timezone-loaded zone) t))) - zone) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun %make-simple-timezone (name abbrev offset) - (let ((subzone (local-time::make-subzone :offset offset - :daylight-p nil - :abbrev abbrev))) - (local-time::make-timezone - :subzones (make-array 1 :initial-contents (list subzone)) - :path nil - :name name - :loaded t))) - - ;; to be used as #+#.(local-time::package-with-symbol? "SB-EXT" "GET-TIME-OF-DAY") - (defun package-with-symbol? (package name) - (if (and (find-package package) - (find-symbol name package)) - '(:and) - '(:or)))) - -(defparameter +utc-zone+ (%make-simple-timezone "Coordinated Universal Time" "UTC" 0)) - -(defparameter +gmt-zone+ (%make-simple-timezone "Greenwich Mean Time" "GMT" 0)) - -(defparameter +none-zone+ (%make-simple-timezone "Explicit Offset Given" "NONE" 0)) - -(defmacro define-timezone (zone-name zone-file &key (load nil)) - "Define zone-name (a symbol or a string) as a new timezone, lazy-loaded from zone-file (a pathname designator relative to the zoneinfo directory on this system. If load is true, load immediately." - (declare (type (or string symbol) zone-name)) - (let ((zone-sym (if (symbolp zone-name) zone-name (intern zone-name)))) - `(prog1 - (defparameter ,zone-sym (make-timezone :path ,zone-file - :name ,(if (symbolp zone-name) - (string-downcase (symbol-name zone-name)) - zone-name))) - ,@(when load - `((%realize-timezone ,zone-sym)))))) - -(eval-when (:load-toplevel :execute) - (let ((default-timezone-file #p"/etc/localtime")) - (handler-case - (define-timezone *default-timezone* default-timezone-file :load t) - (t () - (setf *default-timezone* +utc-zone+))))) - -(defparameter *location-name->timezone* (make-hash-table :test 'equal) - "A hashtable with entries like \"Europe/Budapest\" -> timezone-instance") - -(defparameter *abbreviated-subzone-name->timezone-list* (make-hash-table :test 'equal) - "A hashtable of \"CEST\" -> list of timezones with \"CEST\" subzone") - -(defun find-timezone-by-location-name (name) - (when (zerop (hash-table-count *location-name->timezone*)) - (error "Seems like the timezone repository has not yet been loaded. Hint: see REREAD-TIMEZONE-REPOSITORY.")) - (gethash name *location-name->timezone*)) - -(defun timezone= (timezone-1 timezone-2) - "Return two values indicating the relationship between timezone-1 and timezone-2. The first value is whether the two timezones are equal and the second value indicates whether it is sure or not. - -In other words: -\(values t t) means timezone-1 and timezone-2 are definitely equal. -\(values nil t) means timezone-1 and timezone-2 are definitely different. -\(values nil nil) means that it couldn't be determined." - (if (or (eq timezone-1 timezone-2) - (equalp timezone-1 timezone-2)) - (values t t) - (values nil nil))) - -(defun reread-timezone-repository (&key (timezone-repository *default-timezone-repository-path*)) - (check-type timezone-repository (or pathname string)) - (let ((root-directory (fad:directory-exists-p timezone-repository))) - (unless root-directory - (error "REREAD-TIMEZONE-REPOSITORY was called with invalid PROJECT-DIRECTORY (~A)." - timezone-repository)) - (let ((cutoff-position (length (princ-to-string root-directory)))) - (flet ((visitor (file) - (handler-case - (let* ((full-name (subseq (princ-to-string file) cutoff-position)) - (name (pathname-name file)) - (timezone (%realize-timezone (make-timezone :path file :name name)))) - (setf (gethash full-name *location-name->timezone*) timezone) - (map nil (lambda (subzone) - (push timezone (gethash (subzone-abbrev subzone) - *abbreviated-subzone-name->timezone-list*))) - (timezone-subzones timezone))) - (invalid-timezone-file () nil)))) - (setf *location-name->timezone* (make-hash-table :test 'equal)) - (setf *abbreviated-subzone-name->timezone-list* (make-hash-table :test 'equal)) - (cl-fad:walk-directory root-directory #'visitor :directories nil - :test (lambda (file) - (not (find "Etc" (pathname-directory file) :test #'string=))) - :follow-symlinks nil) - (cl-fad:walk-directory (merge-pathnames "Etc/" root-directory) #'visitor :directories nil))))) - -(defmacro make-timestamp (&rest args) - `(make-instance 'timestamp ,@args)) - -(defun clone-timestamp (timestamp) - (make-instance 'timestamp - :nsec (nsec-of timestamp) - :sec (sec-of timestamp) - :day (day-of timestamp))) - -(defun transition-position (needle haystack) - (declare (type integer needle) - (type (simple-array integer (*)) haystack)) - (loop - with start = 0 - with end = (1- (length haystack)) - for middle = (floor (+ end start) 2) - while (and (< start end) - (/= needle (elt haystack middle))) - do (cond - ((> needle (elt haystack middle)) - (setf start (1+ middle))) - (t - (setf end (1- middle)))) - finally - (return (max 0 (cond - ((minusp end) - 0) - ((= needle (elt haystack middle)) - middle) - ((>= needle (elt haystack end)) - end) - (t - (1- end))))))) - -(defun timestamp-subtimezone (timestamp timezone) - "Return as multiple values the time zone as the number of seconds east of UTC, a boolean daylight-saving-p, and the customary abbreviation of the timezone." - (declare (type timestamp timestamp) - (type (or null timezone) timezone)) - (let* ((zone (%realize-timezone (or timezone *default-timezone*))) - (unix-time (timestamp-to-unix timestamp)) - (subzone-idx (if (zerop (length (timezone-indexes zone))) - 0 - (elt (timezone-indexes zone) - (transition-position unix-time - (timezone-transitions zone))))) - (subzone (elt (timezone-subzones zone) subzone-idx))) - (values - (subzone-offset subzone) - (subzone-daylight-p subzone) - (subzone-abbrev subzone)))) - -(defun %adjust-to-offset (sec day offset) - "Returns two values, the values of new DAY and SEC slots of the timestamp adjusted to the given timezone." - (declare (type integer sec day offset)) - (multiple-value-bind (offset-day offset-sec) - (truncate offset +seconds-per-day+) - (let* ((new-sec (+ sec offset-sec)) - (new-day (+ day offset-day))) - (cond ((minusp new-sec) - (incf new-sec +seconds-per-day+) - (decf new-day)) - ((>= new-sec +seconds-per-day+) - (incf new-day) - (decf new-sec +seconds-per-day+))) - (values new-sec new-day)))) - -(defun %adjust-to-timezone (source timezone &optional offset) - (%adjust-to-offset (sec-of source) - (day-of source) - (or offset - (timestamp-subtimezone source timezone)))) - -(defun timestamp-minimize-part (timestamp part &key - (timezone *default-timezone*) - into) - (let* ((timestamp-parts '(:nsec :sec :min :hour :day :month)) - (part-count (position part timestamp-parts))) - (assert part-count nil - "timestamp-minimize-part called with invalid part ~a (expected one of ~a)" - part - timestamp-parts) - (multiple-value-bind (nsec sec min hour day month year day-of-week daylight-saving-time-p offset) - (decode-timestamp timestamp :timezone timezone) - (declare (ignore nsec day-of-week daylight-saving-time-p)) - (encode-timestamp 0 - (if (> part-count 0) 0 sec) - (if (> part-count 1) 0 min) - (if (> part-count 2) 0 hour) - (if (> part-count 3) 1 day) - (if (> part-count 4) 1 month) - year - :offset (if timezone nil offset) - :timezone timezone - :into into)))) - -(defun timestamp-maximize-part (timestamp part &key - (timezone *default-timezone*) - into) - (let* ((timestamp-parts '(:nsec :sec :min :hour :day :month)) - (part-count (position part timestamp-parts))) - (assert part-count nil - "timestamp-maximize-part called with invalid part ~a (expected one of ~a)" - part - timestamp-parts) - (multiple-value-bind (nsec sec min hour day month year day-of-week daylight-saving-time-p offset) - (decode-timestamp timestamp :timezone timezone) - (declare (ignore nsec day-of-week daylight-saving-time-p)) - (let ((month (if (> part-count 4) 12 month))) - (encode-timestamp 999999999 - (if (> part-count 0) 59 sec) - (if (> part-count 1) 59 min) - (if (> part-count 2) 23 hour) - (if (> part-count 3) (days-in-month month year) day) - month - year - :offset (if timezone nil offset) - :timezone timezone - :into into))))) - -(defmacro with-decoded-timestamp ((&key nsec sec minute hour day month year day-of-week daylight-p timezone offset) - timestamp &body forms) - "This macro binds variables to the decoded elements of TIMESTAMP. The TIMEZONE argument is used for decoding the timestamp, and is not bound by the macro. The value of DAY-OF-WEEK starts from 0 which means Sunday." - (let ((ignores) - (types) - (variables)) - (macrolet ((initialize (&rest vars) - `(progn - ,@(loop - :for var :in vars - :collect `(progn - (unless ,var - (setf ,var (gensym)) - (push ,var ignores)) - (push ,var variables))) - (setf ignores (nreverse ignores)) - (setf variables (nreverse variables)))) - (declare-fixnum-type (&rest vars) - `(progn - ,@(loop - :for var :in vars - :collect `(when ,var - (push `(type fixnum ,,var) types))) - (setf types (nreverse types))))) - (when nsec - (push `(type (integer 0 999999999) ,nsec) types)) - (declare-fixnum-type sec minute hour day month year) - (initialize nsec sec minute hour day month year day-of-week daylight-p)) - `(multiple-value-bind (,@variables) - (decode-timestamp ,timestamp :timezone ,(or timezone '*default-timezone*) :offset ,offset) - (declare (ignore ,@ignores) ,@types) - ,@forms))) - -(defun %normalize-month-year-pair (month year) - "Normalizes the month/year pair: in case month is < 1 or > 12 the month and year are corrected to handle the overflow." - (multiple-value-bind (year-offset month-minus-one) - (floor (1- month) 12) - (values (1+ month-minus-one) - (+ year year-offset)))) - -(defun days-in-month (month year) - "Returns the number of days in the given month of the specified year." - (let ((normal-days (aref +rotated-month-days-without-leap-day+ - (mod (+ month 9) 12)))) - (if (and (= month 2) - (or (and (zerop (mod year 4)) - (plusp (mod year 100))) - (zerop (mod year 400)))) - (1+ normal-days) ; February on a leap year - normal-days))) - -;; TODO scan all uses of FIX-OVERFLOW-IN-DAYS and decide where it's ok to silently fix and where should be and error reported -(defun %fix-overflow-in-days (day month year) - "In case the day number is higher than the maximal possible for the given month/year pair, returns the last day of the month." - (let ((max-day (days-in-month month year))) - (if (> day max-day) - max-day - day))) - -(eval-when (:compile-toplevel :load-toplevel) - (defun %list-length= (num list) - "Tests for a list of length NUM without traversing the entire list to get the length." - (let ((c (nthcdr (1- num) list))) - (and c (endp (cdr c))))) - - (defun %expand-adjust-timestamp-changes (timestamp changes visitor) - (loop - :with params = () - :with functions = () - :for change in changes - :do - (progn - (assert (or - (%list-length= 3 change) - (and (%list-length= 2 change) - (symbolp (first change)) - (or (string= (first change) :timezone) - (string= (first change) :utc-offset))) - (and (%list-length= 4 change) - (symbolp (third change)) - (or (string= (third change) :to) - (string= (third change) :by)))) - nil "Syntax error in expression ~S" change) - (let ((operation (first change)) - (part (second change)) - (value (if (%list-length= 3 change) - (third change) - (fourth change)))) - (cond - ((string= operation :set) - (push `(%set-timestamp-part ,part ,value) functions)) - ((string= operation :offset) - (push `(%offset-timestamp-part ,part ,value) functions)) - ((string= operation :utc-offset) - (push part params) - (push :utc-offset params)) - ((string= operation :timezone) - (push part params) - (push :timezone params)) - (t (error "Unexpected operation ~S" operation))))) - :finally - (loop - :for (function part value) in functions - :do - (funcall visitor `(,function ,timestamp ,part ,value ,@params))))) - - (defun %expand-adjust-timestamp (timestamp changes &key functional) - (let* ((old (gensym "OLD")) - (new (if functional - (gensym "NEW") - old)) - (forms (list))) - (%expand-adjust-timestamp-changes old changes - (lambda (change) - (push - `(progn - (multiple-value-bind (nsec sec day) - ,change - (setf (nsec-of ,new) nsec) - (setf (sec-of ,new) sec) - (setf (day-of ,new) day)) - ,@(when functional - `((setf ,old ,new)))) - forms))) - (setf forms (nreverse forms)) - `(let* ((,old ,timestamp) - ,@(when functional - `((,new (clone-timestamp ,old))))) - ,@forms - ,old))) - ) ; eval-when - -(defmacro adjust-timestamp (timestamp &body changes) - (%expand-adjust-timestamp timestamp changes :functional t)) - -(defmacro adjust-timestamp! (timestamp &body changes) - (%expand-adjust-timestamp timestamp changes :functional nil)) - -(defun %set-timestamp-part (time part new-value &key (timezone *default-timezone*) utc-offset) - ;; TODO think about error signalling. when, how to disable if it makes sense, ... - (case part - ((:nsec :sec-of-day :day) - (let ((nsec (nsec-of time)) - (sec (sec-of time)) - (day (day-of time))) - (case part - (:nsec (setf nsec (coerce new-value '(integer 0 999999999)))) - (:sec-of-day (setf sec (coerce new-value `(integer 0 ,+seconds-per-day+)))) - (:day (setf day new-value))) - (values nsec sec day))) - (otherwise - (with-decoded-timestamp (:nsec nsec :sec sec :minute minute :hour hour - :day day :month month :year year :timezone timezone :offset utc-offset) - time - (ecase part - (:sec (setf sec new-value)) - (:minute (setf minute new-value)) - (:hour (setf hour new-value)) - (:day-of-month (setf day new-value)) - (:month (setf month new-value) - (setf day (%fix-overflow-in-days day month year))) - (:year (setf year new-value) - (setf day (%fix-overflow-in-days day month year)))) - (encode-timestamp-into-values nsec sec minute hour day month year :timezone timezone :offset utc-offset))))) - -(defun %offset-timestamp-part (time part offset &key (timezone *default-timezone*) utc-offset) - "Returns a time adjusted by the specified OFFSET. Takes care of -different kinds of overflows. The setting :day-of-week is possible -using a keyword symbol name of a week-day (see -+DAY-NAMES-AS-KEYWORDS+) as value. In that case point the result to -day given by OFFSET in the week that contains TIME." - (labels ((direct-adjust (part offset nsec sec day) - (cond ((eq part :day-of-week) - (with-decoded-timestamp (:day-of-week day-of-week - :nsec nsec :sec sec :minute minute :hour hour - :day day :month month :year year - :timezone timezone :offset utc-offset) - time - (let ((position (position offset +day-names-as-keywords+ :test #'eq))) - (assert position (position) "~S is not a valid day name" offset) - (let ((offset (+ (- (if (zerop day-of-week) - 7 - day-of-week)) - position))) - (incf day offset) - (cond - ((< day 1) - (decf month) - (when (< month 1) - (setf month 12) - (decf year)) - (setf day (+ (days-in-month month year) day))) - ((let ((days-in-month (days-in-month month year))) - (when (< days-in-month day) - (incf month) - (when (= month 13) - (setf month 1) - (incf year)) - (decf day days-in-month))))) - (encode-timestamp-into-values nsec sec minute hour day month year - :timezone timezone :offset utc-offset))))) - ((zerop offset) - ;; The offset is zero, so just return the parts of the timestamp object - (values nsec sec day)) - (t - (let ((old-utc-offset (or utc-offset - (timestamp-subtimezone time timezone))) - new-utc-offset) - (tagbody - top - (ecase part - (:nsec - (multiple-value-bind (sec-offset new-nsec) - (floor (+ offset nsec) 1000000000) - ;; the time might need to be adjusted a bit more if q != 0 - (setf part :sec - offset sec-offset - nsec new-nsec) - (go top))) - ((:sec :minute :hour) - (multiple-value-bind (days-offset new-sec) - (floor (+ sec (* offset (ecase part - (:sec 1) - (:minute +seconds-per-minute+) - (:hour +seconds-per-hour+)))) - +seconds-per-day+) - (return-from direct-adjust (values nsec new-sec (+ day days-offset))))) - (:day - (incf day offset) - (setf new-utc-offset (or utc-offset - (timestamp-subtimezone (make-timestamp :nsec nsec :sec sec :day day) - timezone))) - (when (not (= old-utc-offset - new-utc-offset)) - ;; We hit the DST boundary. We need to restart again - ;; with :sec, but this time we know both old and new - ;; UTC offset will be the same, so it's safe to do - (setf part :sec - offset (- old-utc-offset - new-utc-offset) - old-utc-offset new-utc-offset) - (go top)) - (return-from direct-adjust (values nsec sec day))))))))) - - (safe-adjust (part offset time) - (with-decoded-timestamp (:nsec nsec :sec sec :minute minute :hour hour :day day - :month month :year year :timezone timezone :offset utc-offset) - time - (multiple-value-bind (month-new year-new) - (%normalize-month-year-pair - (+ (ecase part - (:month offset) - (:year (* 12 offset))) - month) - year) - ;; Almost there. However, it is necessary to check for - ;; overflows first - (encode-timestamp-into-values nsec sec minute hour - (%fix-overflow-in-days day month-new year-new) - month-new year-new - :timezone timezone :offset utc-offset))))) - (ecase part - ((:nsec :sec :minute :hour :day :day-of-week) - (direct-adjust part offset - (nsec-of time) - (sec-of time) - (day-of time))) - ((:month :year) (safe-adjust part offset time))))) - -;; TODO merge this functionality into timestamp-difference -(defun timestamp-whole-year-difference (time-a time-b) - "Returns the number of whole years elapsed between time-a and time-b (hint: anniversaries)." - (declare (type timestamp time-b time-a)) - (multiple-value-bind (nsec-b sec-b minute-b hour-b day-b month-b year-b day-of-week-b daylight-p-b offset-b) - (decode-timestamp time-b) - (declare (ignore day-of-week-b daylight-p-b)) - (multiple-value-bind (nsec-a sec-a minute-a hour-a day-a month-a year-a) - (decode-timestamp time-a) - (declare (ignore nsec-a sec-a minute-a hour-a day-a month-a)) - (let ((year-difference (- year-a year-b))) - (if (timestamp<= (encode-timestamp nsec-b sec-b minute-b hour-b - (if (= month-b 2) - (min 28 day-b) - day-b) - month-b - (+ year-difference year-b) - :offset offset-b) - time-a) - year-difference - (1- year-difference)))))) - -(defun timestamp-difference (time-a time-b) - "Returns the difference between TIME-A and TIME-B in seconds" - (let ((nsec (- (nsec-of time-a) (nsec-of time-b))) - (second (- (sec-of time-a) (sec-of time-b))) - (day (- (day-of time-a) (day-of time-b)))) - (when (minusp nsec) - (decf second) - (incf nsec 1000000000)) - (when (minusp second) - (decf day) - (incf second +seconds-per-day+)) - (let ((result (+ (* day +seconds-per-day+) - second))) - (unless (zerop nsec) - ;; this incf turns the result into a float, so only do this when necessary - (incf result (/ nsec 1000000000d0))) - result))) - -(defun timestamp+ (time amount unit &optional (timezone *default-timezone*) offset) - (multiple-value-bind (nsec sec day) - (%offset-timestamp-part time unit amount :timezone timezone :utc-offset offset) - (make-timestamp :nsec nsec - :sec sec - :day day))) - -(defun timestamp- (time amount unit &optional (timezone *default-timezone*) offset) - (timestamp+ time (- amount) unit timezone offset)) - -(defun timestamp-day-of-week (timestamp &key (timezone *default-timezone*) offset) - (mod (+ 3 (nth-value 1 (%adjust-to-timezone timestamp timezone offset))) 7)) - -;; TODO read -;; http://java.sun.com/j2se/1.4.2/docs/api/java/util/GregorianCalendar.html -;; (or something else, sorry :) this scheme only works back until -;; 1582, the start of the gregorian calendar. see also -;; DECODE-TIMESTAMP when fixing if fixing is desired at all. -(defun valid-timestamp-p (nsec sec minute hour day month year) - "Returns T if the time values refer to a valid time, otherwise returns NIL." - (and (<= 0 nsec 999999999) - (<= 0 sec 59) - (<= 0 minute 59) - (<= 0 hour 23) - (<= 1 month 12) - (<= 1 day (days-in-month month year)) - (/= year 0))) - -(defun encode-timestamp-into-values (nsec sec minute hour day month year - &key (timezone *default-timezone*) offset) - "Returns (VALUES NSEC SEC DAY ZONE) ready to be used for -instantiating a new timestamp object. If the specified time is -invalid, the condition INVALID-TIME-SPECIFICATION is raised." - ;; If the user provided an explicit offset, we use that. Otherwise, - (declare (type integer nsec sec minute hour day month year) - (type (or integer null) offset)) - (unless (valid-timestamp-p nsec sec minute hour day month year) - (error 'invalid-time-specification)) - (let* ((0-based-rotated-month (if (>= month 3) - (- month 3) - (+ month 9))) - (internal-year (if (< month 3) - (- year 2001) - (- year 2000))) - (years-as-days (years-to-days internal-year)) - (sec (+ (* hour +seconds-per-hour+) - (* minute +seconds-per-minute+) - sec)) - (days-from-zero-point (+ years-as-days - (aref +rotated-month-offsets-without-leap-day+ 0-based-rotated-month) - (1- day))) - (used-offset (or offset - (%guess-offset sec - days-from-zero-point - timezone)))) - (multiple-value-bind (utc-sec utc-day) - (%adjust-to-offset sec days-from-zero-point (- used-offset)) - (values nsec utc-sec utc-day)))) - -(defun encode-timestamp (nsec sec minute hour day month year - &key (timezone *default-timezone*) offset into) - "Return a new TIMESTAMP instance corresponding to the specified time -elements." - (declare (type integer nsec sec minute hour day month year)) - (multiple-value-bind (nsec sec day) - (encode-timestamp-into-values nsec sec minute hour day month year - :timezone timezone :offset offset) - (if into - (progn - (setf (nsec-of into) nsec) - (setf (sec-of into) sec) - (setf (day-of into) day) - into) - (make-timestamp - :nsec nsec - :sec sec - :day day)))) - -(defun universal-to-timestamp (universal &key (nsec 0)) - "Returns a timestamp corresponding to the given universal time." - ;; universal time is seconds from 1900-01-01T00:00:00Z. - (let ((adjusted-universal (- universal #.(encode-universal-time 0 0 0 1 3 2000 0)))) - (multiple-value-bind (day second) - (floor adjusted-universal +seconds-per-day+) - (make-timestamp :day day :sec second :nsec nsec)))) - -(defun timestamp-to-universal (timestamp) - "Return the UNIVERSAL-TIME corresponding to the TIMESTAMP" - ;; universal time is seconds from 1900-01-01T00:00:00Z - (+ (* (day-of timestamp) +seconds-per-day+) - (sec-of timestamp) - #.(encode-universal-time 0 0 0 1 3 2000 0))) - -(defun unix-to-timestamp (unix &key (nsec 0)) - "Return a TIMESTAMP corresponding to UNIX, which is the number of seconds since the unix epoch, 1970-01-01T00:00:00Z." - (multiple-value-bind (days secs) - (floor unix +seconds-per-day+) - (make-timestamp :day (- days 11017) :sec secs :nsec nsec))) - -(defun timestamp-values-to-unix (seconds day) - "Return the Unix time correspondint to the values used to encode a TIMESTAMP" - (+ (* (+ day 11017) +seconds-per-day+) seconds)) - -(defun timestamp-to-unix (timestamp) - "Return the Unix time corresponding to the TIMESTAMP" - (declare (type timestamp timestamp)) - (timestamp-values-to-unix (sec-of timestamp) (day-of timestamp))) - -#+(and allegro (not os-windows)) -(eval-when (:compile-toplevel :load-toplevel :execute) - ;; Allegro common lisp requires some toplevel hoops through which to - ;; jump in order to call unix's gettimeofday properly. - (ff:def-foreign-type timeval - (:struct (tv_sec :long) - (tv_usec :long))) - - (ff:def-foreign-call - (allegro-ffi-gettimeofday "gettimeofday") - ((timeval (* timeval)) - ;; and do this to allow a 0 for NULL - (timezone :foreign-address)) - :returning (:int fixnum))) - -#+(and allegro os-windows) -(eval-when (:compile-toplevel :load-toplevel :execute) - ;; Allegro common lisp requires some toplevel hoops through which to - ;; jump in order to call unix's gettimeofday properly. - (ff:def-foreign-type filetime - (:struct (|dwLowDateTime| :int) - (|dwHighDateTime| :int))) - - (ff:def-foreign-call - (allegro-ffi-get-system-time-as-file-time "GetSystemTimeAsFileTime") - ((filetime (* filetime))) - :returning :void)) - -#+(or (and allegro os-windows) - (and ccl windows)) -(defun filetime-to-current-time (low high) - "Convert a Windows time into (values sec nano-sec)." - (let* ((unix-epoch-filetime 116444736000000000) - (filetime (logior low (ash high 32))) - (filetime (- filetime unix-epoch-filetime))) - (multiple-value-bind (secs 100ns-periods) - (floor filetime #.(round 1e7)) - (values secs (* 100ns-periods 100))))) - -#+(and lispworks (or linux darwin)) -(progn - (fli:define-c-typedef time-t :long) - (fli:define-c-typedef suseconds-t #+linux :long - #+darwin :int) - - (fli:define-c-struct timeval - (tv-sec time-t) - (tv-usec suseconds-t)) - - (fli:define-foreign-function (gettimeofday/ffi "gettimeofday") - ((tv (:pointer (:struct timeval))) - (tz :pointer)) - :result-type :int) - - (defun lispworks-gettimeofday () - (declare (optimize speed (safety 1))) - (fli:with-dynamic-foreign-objects ((tv (:struct timeval))) - (let ((ret (gettimeofday/ffi tv fli:*null-pointer*))) - (assert (zerop ret) nil "gettimeofday failed") - (let ((secs - (fli:foreign-slot-value tv 'tv-sec - :type 'time-t - :object-type '(:struct timeval))) - (usecs - (fli:foreign-slot-value tv 'tv-usec - :type 'suseconds-t - :object-type '(:struct timeval)))) - (values secs (* 1000 usecs))))))) - -(defun %get-current-time () - "Cross-implementation abstraction to get the current time measured from the unix epoch (1/1/1970). Should return (values sec nano-sec)." - #+(and allegro (not os-windows)) - (flet ((allegro-gettimeofday () - (let ((tv (ff:allocate-fobject 'timeval :c))) - (allegro-ffi-gettimeofday tv 0) - (let ((sec (ff:fslot-value-typed 'timeval :c tv 'tv_sec)) - (usec (ff:fslot-value-typed 'timeval :c tv 'tv_usec))) - (ff:free-fobject tv) - (values sec usec))))) - (multiple-value-bind (sec usec) (allegro-gettimeofday) - (values sec (* 1000 usec)))) - #+(and allegro os-windows) - (let* ((ft (ff:allocate-fobject 'filetime :c))) - (allegro-ffi-get-system-time-as-file-time ft) - (let* ((low (ff:fslot-value-typed 'filetime :c ft '|dwLowDateTime|)) - (high (ff:fslot-value-typed 'filetime :c ft '|dwHighDateTime|))) - (filetime-to-current-time low high))) - #+cmu - (multiple-value-bind (success? sec usec) (unix:unix-gettimeofday) - (assert success? () "unix:unix-gettimeofday reported failure?!") - (values sec (* 1000 usec))) - #+sbcl - (progn - #+#.(local-time::package-with-symbol? "SB-EXT" "GET-TIME-OF-DAY") ; available from sbcl 1.0.28.66 - (multiple-value-bind (sec nsec) (sb-ext:get-time-of-day) - (values sec (* 1000 nsec))) - #-#.(local-time::package-with-symbol? "SB-EXT" "GET-TIME-OF-DAY") ; obsolete, scheduled to be deleted at the end of 2009 - (multiple-value-bind (success? sec nsec) (sb-unix:unix-gettimeofday) - (assert success? () "sb-unix:unix-gettimeofday reported failure?!") - (values sec (* 1000 nsec)))) - #+(and ccl (not windows)) - (ccl:rlet ((tv :timeval)) - (let ((err (ccl:external-call "gettimeofday" :address tv :address (ccl:%null-ptr) :int))) - (assert (zerop err) nil "gettimeofday failed") - (values (ccl:pref tv :timeval.tv_sec) (* 1000 (ccl:pref tv :timeval.tv_usec))))) - #+(and ccl windows) - (ccl:rlet ((time :)) - (ccl:external-call "GetSystemTimeAsFileTime" : time :void) - (let* ((low (ccl:%get-unsigned-long time (/ 0 8))) - (high (ccl:%get-unsigned-long time (/ 32 8)))) - (filetime-to-current-time low high))) - #+abcl - (multiple-value-bind (sec millis) - (truncate (java:jstatic "currentTimeMillis" "java.lang.System") 1000) - (values sec (* millis 1000000))) - #+(and lispworks (or linux darwin)) - (lispworks-gettimeofday) - #-(or allegro cmu sbcl abcl ccl (and lispworks (or linux darwin))) - (values (- (get-universal-time) - ;; CL's get-universal-time uses an epoch of 1/1/1900, so adjust the result to the Unix epoch - #.(encode-universal-time 0 0 0 1 1 1970 0)) - 0)) - -(defvar *clock* t - "Use the `*clock*' special variable if you need to define your own idea of the current time. - -The value of this variable should have the methods `local-time::clock-now', and -`local-time::clock-today'. The currently supported values in local-time are: - t - use the standard clock - local-time:leap-second-adjusted - use a clock which adjusts for leap seconds using the information in *default-timezone*.") - -(defun now () - "Returns a timestamp representing the present moment." - (clock-now *clock*)) - -(defun today () - "Returns a timestamp representing the present day." - (clock-today *clock*)) - -(defgeneric clock-now (clock) - (:documentation "Returns a timestamp for the current time given a clock.")) - -(defgeneric clock-today (clock) - (:documentation "Returns a timestamp for the current date given a - clock. The date is encoded by convention as a timestamp with the - time set to 00:00:00UTC.")) - -(defun %leap-seconds-offset (leap-seconds sec) - "Find the latest leap second adjustment effective at SEC system time." - (elt (leap-seconds-adjustment leap-seconds) - (transition-position sec (leap-seconds-sec leap-seconds)))) - -(defun %adjust-sec-for-leap-seconds (sec) - "Ajdust SEC from system time to Unix time (on systems those clock does not jump back over leap seconds)." - (let ((leap-seconds (timezone-leap-seconds (%realize-timezone *default-timezone*)))) - (when leap-seconds - (decf sec (%leap-seconds-offset leap-seconds sec)))) - sec) - -(defmethod clock-now ((clock (eql 'leap-second-adjusted))) - (multiple-value-bind (sec nsec) (%get-current-time) - (unix-to-timestamp (%adjust-sec-for-leap-seconds sec) - :nsec nsec))) - -(defmethod clock-now (clock) - (declare (ignore clock)) - (multiple-value-bind (sec nsec) (%get-current-time) - (unix-to-timestamp sec :nsec nsec))) - -(defmethod clock-today (clock) - (declare (ignore clock)) - ;; TODO should return a date value, anyhow we will decide to represent it eventually - (let ((result (now))) - (setf (sec-of result) 0) - (setf (nsec-of result) 0) - result)) - -(defmacro %defcomparator (name &body body) - (let ((pair-comparator-name (intern (concatenate 'string "%" (string name))))) - `(progn - (declaim (inline ,pair-comparator-name)) - (defun ,pair-comparator-name (time-a time-b) - (assert (typep time-a 'timestamp) - nil - 'type-error - :datum time-a - :expected-type 'timestamp) - (assert (typep time-b 'timestamp) - nil - 'type-error - :datum time-b - :expected-type 'timestamp) - ,@body) - (defun ,name (&rest times) - (declare (dynamic-extent times)) - (loop for head on times - while (cdr head) - always (,pair-comparator-name (first head) (second head)))) - (define-compiler-macro ,name (&rest times) - (let ((vars (loop - :for i :upfrom 0 :below (length times) - :collect (gensym (concatenate 'string "TIME-" (princ-to-string i) "-"))))) - `(let (,@(loop - :for var :in vars - :for time :in times - :collect (list var time))) - ;; we could evaluate comparisons of timestamp literals here - (and ,@(loop - :for (time-a time-b) :on vars - :while time-b - :collect `(,',pair-comparator-name ,time-a ,time-b))))))))) - -(defun %timestamp-compare (time-a time-b) - "Returns the symbols <, >, or =, describing the relationship between TIME-A and TIME-b." - (declare (type timestamp time-a time-b)) - (cond - ((< (day-of time-a) (day-of time-b)) '<) - ((> (day-of time-a) (day-of time-b)) '>) - ((< (sec-of time-a) (sec-of time-b)) '<) - ((> (sec-of time-a) (sec-of time-b)) '>) - ((< (nsec-of time-a) (nsec-of time-b)) '<) - ((> (nsec-of time-a) (nsec-of time-b)) '>) - (t '=))) - -(%defcomparator timestamp< - (eql (%timestamp-compare time-a time-b) '<)) - -(%defcomparator timestamp<= - (not (null (member (%timestamp-compare time-a time-b) '(< =))))) - -(%defcomparator timestamp> - (eql (%timestamp-compare time-a time-b) '>)) - -(%defcomparator timestamp>= - (not (null (member (%timestamp-compare time-a time-b) '(> =))))) - -(%defcomparator timestamp= - (eql (%timestamp-compare time-a time-b) '=)) - -(defun timestamp/= (&rest timestamps) - "Returns T if no pair of timestamps is equal. Otherwise return NIL." - (declare (dynamic-extent timestamps)) - (loop for ts-head on timestamps do - (loop for ts in (rest ts-head) do - (when (timestamp= (car ts-head) ts) - (return-from timestamp/= nil)))) - t) - -(defun contest (test list) - "Applies TEST to pairs of elements in list, keeping the element which last tested T. Returns the winning element." - (reduce (lambda (a b) (if (funcall test a b) a b)) list)) - -(defun timestamp-minimum (time &rest times) - "Returns the earliest timestamp" - (contest #'timestamp< (cons time times))) - -(defun timestamp-maximum (time &rest times) - "Returns the latest timestamp" - (contest #'timestamp> (cons time times))) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun years-to-days (years) - "Given a number of years, returns the number of days in those years." - (let* ((days (* years 365)) - (l1 (floor years 4)) - (l2 (floor years 100)) - (l3 (floor years 400))) - (+ days l1 (- l2) l3)))) - -(defun days-to-years (days) - "Given a number of days, returns the number of years and the remaining days in that year." - (let ((remaining-days days)) - (multiple-value-bind (400-years remaining-days) - (floor remaining-days #.(years-to-days 400)) - (let* ((100-years (min (floor remaining-days #.(years-to-days 100)) 3)) - (remaining-days (- remaining-days - (* 100-years #.(years-to-days 100))))) - (multiple-value-bind (4-years remaining-days) - (floor remaining-days #.(years-to-days 4)) - (let ((years (min 3 (floor remaining-days #.(years-to-days 1))))) - (values (+ (* 400-years 400) - (* 100-years 100) - (* 4-years 4) - years) - (- remaining-days (* years 365)))))))) - ;; the above is the macroexpansion of the following. uses metabang BIND, but kept for clarity because the expansion is unreadable. - #+nil - (bind ((remaining-days days) - ((values 400-years remaining-days) (floor remaining-days #.(years-to-days 400))) - (100-years (min (floor remaining-days #.(years-to-days 100)) - 3)) - (remaining-days (- remaining-days - (* 100-years - #.(years-to-days 100)))) - ((values 4-years remaining-days) (floor remaining-days #.(years-to-days 4))) - (years (min (floor remaining-days 365) - 3))) - (values (+ (* 400-years 400) - (* 100-years 100) - (* 4-years 4) - years) - (- remaining-days (* years 365))))) - -(defun %timestamp-decode-date (days) - "Returns the year, month, and day, given the number of days from the epoch." - (declare (type integer days)) - (multiple-value-bind (years remaining-days) - (days-to-years days) - (let* ((leap-day-p (= remaining-days 365)) - (rotated-1-based-month (if leap-day-p - 12 ; march is the first month and february is the last - (position remaining-days +rotated-month-offsets-without-leap-day+ :test #'<))) - (1-based-month (if (>= rotated-1-based-month 11) - (- rotated-1-based-month 10) - (+ rotated-1-based-month 2))) - (1-based-day (if leap-day-p - 29 - (1+ (- remaining-days (aref +rotated-month-offsets-without-leap-day+ - (1- rotated-1-based-month))))))) - (values - (+ years - (if (>= rotated-1-based-month 11) ; january is in the next year - 2001 - 2000)) - 1-based-month - 1-based-day)))) - -(defun %timestamp-decode-iso-week (timestamp) - "Returns the year, week number, and day of week components of an ISO week date." - ;; Algorithm from http://en.wikipedia.org/wiki/Talk:ISO_week_date#Algorithms - (let* ((dn (timestamp-day-of-week timestamp)) - (day-of-week (if (zerop dn) 7 dn)) ; ISO weekdays are Monday=1 and Sunday=7 - (nearest-thursday (timestamp+ timestamp (- 4 day-of-week) :day)) - (year (timestamp-year nearest-thursday)) - (month (timestamp-month nearest-thursday)) - (day (timestamp-day nearest-thursday)) - (ordinal-day (- (day-of (encode-timestamp 0 0 0 0 day month year :timezone +utc-zone+)) - (day-of (encode-timestamp 0 0 0 0 1 1 year :timezone +utc-zone+))))) - (values year - (1+ (floor ordinal-day 7)) - day-of-week))) - -(defun %timestamp-decode-time (seconds) - "Returns the hours, minutes, and seconds, given the number of seconds since midnight." - (declare (type integer seconds)) - (multiple-value-bind (hours hour-remainder) - (floor seconds +seconds-per-hour+) - (multiple-value-bind (minutes seconds) - (floor hour-remainder +seconds-per-minute+) - (values - hours - minutes - seconds)))) - -(defun decode-timestamp (timestamp &key (timezone *default-timezone*) offset) - "Returns the decoded time as multiple values: nsec, ss, mm, hh, day, month, year, day-of-week" - (declare (type timestamp timestamp)) - (let ((timezone (if offset (the timezone +none-zone+) timezone))) - (multiple-value-bind (offset* daylight-p abbreviation) - (timestamp-subtimezone timestamp timezone) - (multiple-value-bind (adjusted-secs adjusted-days) - (%adjust-to-timezone timestamp timezone offset) - (multiple-value-bind (hours minutes seconds) - (%timestamp-decode-time adjusted-secs) - (multiple-value-bind (year month day) - (%timestamp-decode-date adjusted-days) - (values - (nsec-of timestamp) - seconds minutes hours - day month year - (timestamp-day-of-week timestamp :timezone timezone :offset offset) - daylight-p - (or offset offset*) - abbreviation))))))) - -(defun timestamp-year (timestamp &key (timezone *default-timezone*)) - "Returns the cardinal year upon which the timestamp falls." - (nth-value 0 - (%timestamp-decode-date - (nth-value 1 (%adjust-to-timezone timestamp timezone))))) - -(defun timestamp-century (timestamp &key (timezone *default-timezone*)) - "Returns the ordinal century upon which the timestamp falls." - (let* ((year (timestamp-year timestamp :timezone timezone)) - (sign (signum year))) - (+ sign - (* sign - (truncate (1- (abs year)) 100))))) - -(defun timestamp-millennium (timestamp &key (timezone *default-timezone*)) - "Returns the ordinal millennium upon which the timestamp falls." - (let* ((year (timestamp-year timestamp :timezone timezone)) - (sign (signum year))) - (+ sign - (* sign - (truncate (1- (abs year)) 1000))))) - -(defun timestamp-decade (timestamp &key (timezone *default-timezone*)) - "Returns the cardinal decade upon which the timestamp falls." - (truncate (timestamp-year timestamp :timezone timezone) 10)) - -(defun timestamp-month (timestamp &key (timezone *default-timezone*)) - "Returns the month upon which the timestamp falls." - (nth-value 1 - (%timestamp-decode-date - (nth-value 1 (%adjust-to-timezone timestamp timezone))))) - -(defun timestamp-day (timestamp &key (timezone *default-timezone*)) - "Returns the day of the month upon which the timestamp falls." - (nth-value 2 - (%timestamp-decode-date - (nth-value 1 (%adjust-to-timezone timestamp timezone))))) - -(defun timestamp-hour (timestamp &key (timezone *default-timezone*)) - (nth-value 0 - (%timestamp-decode-time - (nth-value 0 (%adjust-to-timezone timestamp timezone))))) - -(defun timestamp-minute (timestamp &key (timezone *default-timezone*)) - (nth-value 1 - (%timestamp-decode-time - (nth-value 0 (%adjust-to-timezone timestamp timezone))))) - -(defun timestamp-second (timestamp &key (timezone *default-timezone*)) - (nth-value 2 - (%timestamp-decode-time - (nth-value 0 (%adjust-to-timezone timestamp timezone))))) - -(defun timestamp-microsecond (timestamp) - (floor (nsec-of timestamp) 1000)) - -(defun timestamp-millisecond (timestamp) - (floor (nsec-of timestamp) 1000000)) - -(defun split-timestring (str &rest args) - (declare (inline)) - (apply #'%split-timestring (coerce str 'simple-string) args)) - -(defun %split-timestring (time-string &key - (start 0) - (end (length time-string)) - (fail-on-error t) (time-separator #\:) - (date-separator #\-) - (date-time-separator #\T) - (allow-missing-elements t) - (allow-missing-date-part allow-missing-elements) - (allow-missing-time-part allow-missing-elements) - (allow-missing-timezone-part allow-missing-time-part)) - "Based on http://www.ietf.org/rfc/rfc3339.txt including the function names used. Returns (values year month day hour minute second nsec offset-hour offset-minute). On parsing failure, signals INVALID-TIMESTRING if FAIL-ON-ERROR is NIL, otherwise returns NIL." - (declare (type character date-time-separator time-separator date-separator) - (type simple-string time-string) - (optimize (speed 3))) - (the list - (let (year month day hour minute second nsec offset-hour offset-minute) - (declare (type (or null fixnum) start end year month day hour minute second offset-hour offset-minute) - (type (or null (signed-byte 32)) nsec)) - (macrolet ((passert (expression) - `(unless ,expression - (parse-error ',expression))) - (parse-integer-into (start-end place &optional low-limit high-limit) - (let ((entry (gensym "ENTRY")) - (value (gensym "VALUE")) - (pos (gensym "POS")) - (start (gensym "START")) - (end (gensym "END"))) - `(let ((,entry ,start-end)) - (if ,entry - (let ((,start (car ,entry)) - (,end (cdr ,entry))) - (multiple-value-bind (,value ,pos) (parse-integer time-string :start ,start :end ,end :junk-allowed t) - (passert (= ,pos ,end)) - (setf ,place ,value) - ,(if (and low-limit high-limit) - `(passert (<= ,low-limit ,place ,high-limit)) - (values)) - (values))) - (progn - (passert allow-missing-elements) - (values)))))) - (with-parts-and-count ((start end split-chars) &body body) - `(multiple-value-bind (parts count) (split ,start ,end ,split-chars) - (declare (ignorable count) (type fixnum count) - ;;(type #1=(cons (cons fixnum fixnum) (or null #1#)) parts) - (type list parts)) - ,@body))) - (labels ((split (start end chars) - (declare (type fixnum start end)) - (unless (consp chars) - (setf chars (list chars))) - (loop with last-match = start - with match-count of-type (integer 0 #.most-positive-fixnum) = 0 - for index of-type fixnum upfrom start - while (< index end) - when (member (aref time-string index) chars :test #'char-equal) - collect (prog1 (if (< last-match index) - (cons last-match index) - nil) - (incf match-count) - (setf last-match (1+ index))) - into result - finally (return (values (if (zerop (- index last-match)) - result - (prog1 - (nconc result (list (cons last-match index))) - (incf match-count))) - match-count)))) - (parse () - (with-parts-and-count (start end date-time-separator) - (cond ((= count 2) - (if (first parts) - (full-date (first parts)) - (passert allow-missing-date-part)) - (if (second parts) - (full-time (second parts)) - (passert allow-missing-time-part)) - (done)) - ((and (= count 1) - allow-missing-date-part - (find time-separator time-string - :start (car (first parts)) - :end (cdr (first parts)))) - (full-time (first parts)) - (done)) - ((and (= count 1) - allow-missing-time-part - (find date-separator time-string - :start (car (first parts)) - :end (cdr (first parts)))) - (full-date (first parts)) - (done))) - (parse-error nil))) - (full-date (start-end) - (let ((parts (split (car start-end) (cdr start-end) date-separator))) - (passert (%list-length= 3 parts)) - (date-fullyear (first parts)) - (date-month (second parts)) - (date-mday (third parts)))) - (date-fullyear (start-end) - (parse-integer-into start-end year)) - (date-month (start-end) - (parse-integer-into start-end month 1 12)) - (date-mday (start-end) - (parse-integer-into start-end day 1 31)) - (full-time (start-end) - (let ((start (car start-end)) - (end (cdr start-end))) - (with-parts-and-count (start end (list #\Z #\- #\+)) - (let* ((zulup (find #\Z time-string :test #'char-equal :start start :end end)) - (sign (unless zulup - (if (find #\+ time-string :test #'char-equal :start start :end end) - 1 - -1)))) - (passert (<= 1 count 2)) - (unless (and (eq (first parts) nil) - (not (rest parts))) - ;; not a single #\Z - (partial-time (first parts))) - (when zulup - (setf offset-hour 0 - offset-minute 0)) - (if (= count 1) - (passert (or zulup allow-missing-timezone-part)) - (let* ((entry (second parts)) - (start (car entry)) - (end (cdr entry))) - (declare (type fixnum start end)) - (passert (or zulup - (not (zerop (- end start))))) - (unless zulup - (time-offset (second parts) sign)))))))) - (partial-time (start-end) - (with-parts-and-count ((car start-end) (cdr start-end) time-separator) - (passert (eql count 3)) - (time-hour (first parts)) - (time-minute (second parts)) - (time-second (third parts)))) - (time-hour (start-end) - (parse-integer-into start-end hour 0 23)) - (time-minute (start-end) - (parse-integer-into start-end minute 0 59)) - (time-second (start-end) - (with-parts-and-count ((car start-end) (cdr start-end) '(#\. #\,)) - (passert (<= 1 count 2)) - (let ((*read-eval* nil)) - (parse-integer-into (first parts) second 0 59) - (if (> count 1) - (let* ((start (car (second parts))) - (end (cdr (second parts)))) - (declare (type (integer 0 #.array-dimension-limit) start end)) - (passert (<= (- end start) 9)) - (let ((new-end (position #\0 time-string - :test-not #'eql - :start start - :end end - :from-end t))) - (when new-end - (setf end (min (1+ new-end))))) - (setf nsec (* (the (integer 0 999999999) (parse-integer time-string :start start :end end)) - (aref #.(coerce #(1000000000 100000000 10000000 - 1000000 100000 10000 1000 100 10 1) - '(simple-array (signed-byte 32) (10))) - (- end start))))) - (setf nsec 0))))) - (time-offset (start-end sign) - (with-parts-and-count ((car start-end) (cdr start-end) time-separator) - (passert (or (and allow-missing-timezone-part (zerop count)) - (= count 1) - (= count 2))) - - (cond - ((= count 2) - ;; hh:mm offset - (parse-integer-into (first parts) offset-hour 0 23) - (parse-integer-into (second parts) offset-minute 0 59)) - ((= (- (cdar parts) (caar parts)) 4) - ;; hhmm offset - (parse-integer-into (cons (caar parts) - (+ (caar parts) 2)) - offset-hour 0 23) - (parse-integer-into (cons (+ (caar parts) 2) - (+ (caar parts) 4)) - offset-minute 0 59)) - ((= (- (cdar parts) (caar parts)) 2) - ;; hh offset - (parse-integer-into (cons (caar parts) - (+ (caar parts) 2)) - offset-hour 0 23) - (setf offset-minute 0))) - - (setf offset-hour (* offset-hour sign) - offset-minute (* offset-minute sign)))) - (parse-error (failure) - (if fail-on-error - (error 'invalid-timestring :timestring time-string :failure failure) - (return-from %split-timestring nil))) - (done () - (return-from %split-timestring (list year month day hour minute second nsec offset-hour offset-minute)))) - (parse)))))) - -(defun parse-rfc3339-timestring (timestring &key (fail-on-error t) - (allow-missing-time-part nil)) - (parse-timestring timestring :fail-on-error fail-on-error - :allow-missing-timezone-part nil - :allow-missing-time-part allow-missing-time-part - :allow-missing-date-part nil)) - -(defun parse-timestring (timestring &key - start - end - (fail-on-error t) - (time-separator #\:) - (date-separator #\-) - (date-time-separator #\T) - (allow-missing-elements t) - (allow-missing-date-part allow-missing-elements) - (allow-missing-time-part allow-missing-elements) - (allow-missing-timezone-part allow-missing-elements) - (offset 0)) - "Parse a timestring and return the corresponding TIMESTAMP. -See split-timestring for details. Unspecified fields in the -timestring are initialized to their lowest possible value, -and timezone offset is 0 (UTC) unless explicitly specified -in the input string." - (let ((parts (%split-timestring (coerce timestring 'simple-string) - :start (or start 0) - :end (or end (length timestring)) - :fail-on-error fail-on-error - :time-separator time-separator - :date-separator date-separator - :date-time-separator date-time-separator - :allow-missing-elements allow-missing-elements - :allow-missing-date-part allow-missing-date-part - :allow-missing-time-part allow-missing-time-part - :allow-missing-timezone-part allow-missing-timezone-part))) - (when parts - (destructuring-bind (year month day hour minute second nsec offset-hour offset-minute) - parts - (encode-timestamp - (or nsec 0) - (or second 0) - (or minute 0) - (or hour 0) - (or day 1) - (or month 3) - (or year 2000) - :offset (if offset-hour - (+ (* offset-hour 3600) - (* (or offset-minute 0) 60)) - offset)))))) - -(defun ordinalize (day) - "Return an ordinal string representing the position -of DAY in a sequence (1st, 2nd, 3rd, 4th, etc)." - (declare (type (integer 1 31) day)) - (format nil "~d~a" day - (if (<= 11 day 13) - "th" - (case (mod day 10) - (1 "st") - (2 "nd") - (3 "rd") - (t "th"))))) - -(defun %construct-timestring (timestamp format timezone) - "Constructs a string representing TIMESTAMP given the FORMAT -of the string and the TIMEZONE. -See the documentation of FORMAT-TIMESTRING for the structure of FORMAT." - (declare (type timestamp timestamp) - (optimize (speed 3))) - (multiple-value-bind (nsec sec minute hour day month year weekday daylight-p offset abbrev) - (decode-timestamp timestamp :timezone timezone) - (declare (ignore daylight-p)) - (multiple-value-bind (iso-year iso-week iso-weekday) - (%timestamp-decode-iso-week timestamp) - (let ((*print-pretty* nil) - (*print-circle* nil)) - (with-output-to-string (result nil) - (dolist (fmt format) - (cond - ((member fmt '(:gmt-offset :gmt-offset-or-z :gmt-offset-hhmm)) - (multiple-value-bind (offset-hours offset-secs) - (floor offset +seconds-per-hour+) - (declare (fixnum offset-hours offset-secs)) - (if (and (eql fmt :gmt-offset-or-z) (zerop offset)) - (princ #\Z result) - (format result "~c~2,'0d~:[:~;~]~2,'0d" - (if (minusp offset-hours) #\- #\+) - (abs offset-hours) - (eql fmt :gmt-offset-hhmm) - (truncate (abs offset-secs) - +seconds-per-minute+))))) - ((eql fmt :short-year) - (princ (mod year 100) result)) - ((eql fmt :long-month) - (princ (aref +month-names+ month) result)) - ((eql fmt :short-month) - (princ (aref +short-month-names+ month) result)) - ((eql fmt :long-weekday) - (princ (aref +day-names+ weekday) result)) - ((eql fmt :short-weekday) - (princ (aref +short-day-names+ weekday) result)) - ((eql fmt :minimal-weekday) - (princ (aref +minimal-day-names+ weekday) result)) - ((eql fmt :timezone) - (princ abbrev result)) - ((eql fmt :ampm) - (princ (if (< hour 12) "am" "pm") result)) - ((eql fmt :ordinal-day) - (princ (ordinalize day) result)) - ((or (stringp fmt) (characterp fmt)) - (princ fmt result)) - (t - (let ((val (ecase (if (consp fmt) (car fmt) fmt) - (:nsec nsec) - (:usec (floor nsec 1000)) - (:msec (floor nsec 1000000)) - (:sec sec) - (:min minute) - (:hour hour) - (:hour12 (1+ (mod (1- hour) 12))) - (:day day) - (:weekday weekday) - (:month month) - (:year year) - (:iso-week-year iso-year) - (:iso-week-number iso-week) - (:iso-week-day iso-weekday)))) - (cond - ((atom fmt) - (princ val result)) - ((minusp val) - (format result "-~v,vd" - (second fmt) - (or (third fmt) #\0) - (abs val))) - (t - (format result "~v,vd" - (second fmt) - (or (third fmt) #\0) - val)))))))))))) - -(defun format-timestring (destination timestamp &key - (format +iso-8601-format+) - (timezone *default-timezone*)) - "Constructs a string representation of TIMESTAMP according -to FORMAT and returns it. -If destination is T, the string is written to *standard-output*. -If destination is a stream, the string is written to the stream. - -FORMAT is a list containing one or more of strings, characters, -and keywords. Strings and characters are output literally, -while keywords are replaced by the values here: - - :YEAR *year - :MONTH *numeric month - :DAY *day of month - :HOUR *hour - :MIN *minutes - :SEC *seconds - :WEEKDAY *numeric day of week starting from index 0, which means Sunday - :MSEC *milliseconds - :USEC *microseconds - :NSEC *nanoseconds - :ISO-WEEK-YEAR *year for ISO week date (can be different from regular calendar year) - :ISO-WEEK-NUMBER *ISO week number (i.e. 1 through 53) - :ISO-WEEK-DAY *ISO compatible weekday number (monday=1, sunday=7) - :LONG-WEEKDAY long form of weekday (e.g. Sunday, Monday) - :SHORT-WEEKDAY short form of weekday (e.g. Sun, Mon) - :MINIMAL-WEEKDAY minimal form of weekday (e.g. Su, Mo) - :SHORT-YEAR short form of year (last 2 digits, e.g. 41, 42 instead of 2041, 2042) - :LONG-MONTH long form of month (e.g. January, February) - :SHORT-MONTH short form of month (e.g. Jan, Feb) - :HOUR12 *hour on a 12-hour clock - :AMPM am/pm marker in lowercase - :GMT-OFFSET the gmt-offset of the time, in +00:00 form - :GMT-OFFSET-OR-Z like :GMT-OFFSET, but is Z when UTC - :GMT-OFFSET-HHMM like :GMT-OFFSET, but in +0000 form - :TIMEZONE timezone abbrevation for the time - -Elements marked by * can be placed in a list in the form - \(:keyword padding &optional \(padchar #\\0)) - -The string representation of the value will be padded with the padchar. - -You can see examples in +ISO-8601-FORMAT+, +ASCTIME-FORMAT+, and +RFC-1123-FORMAT+." - (declare (type (or boolean stream) destination)) - (let ((result (%construct-timestring timestamp format timezone))) - (when destination - (write-string result (if (eq t destination) *standard-output* destination))) - result)) - -(defun format-rfc1123-timestring (destination timestamp &key - (timezone *default-timezone*)) - (format-timestring destination timestamp - :format +rfc-1123-format+ - :timezone timezone)) - -(defun to-rfc1123-timestring (timestamp) - (format-rfc1123-timestring nil timestamp)) - -(defun format-rfc3339-timestring (destination timestamp &key - omit-date-part - omit-time-part - (omit-timezone-part omit-time-part) - (use-zulu t) - (timezone *default-timezone*)) - "Formats a timestring in the RFC 3339 format, a restricted form of the ISO-8601 timestring specification for Internet timestamps." - (let ((rfc3339-format - (if (and use-zulu - (not omit-date-part) - (not omit-time-part) - (not omit-timezone-part)) - +rfc3339-format+ ; micro optimization - (append - (unless omit-date-part - '((:year 4) #\- - (:month 2) #\- - (:day 2))) - (unless (or omit-date-part - omit-time-part) - '(#\T)) - (unless omit-time-part - '((:hour 2) #\: - (:min 2) #\: - (:sec 2) #\. - (:usec 6))) - (unless omit-timezone-part - (if use-zulu - '(:gmt-offset-or-z) - '(:gmt-offset))))))) - (format-timestring destination timestamp :format rfc3339-format :timezone timezone))) - -(defun to-rfc3339-timestring (timestamp) - (format-rfc3339-timestring nil timestamp)) - -(defun %read-timestring (stream char) - (declare (ignore char)) - (parse-timestring - (with-output-to-string (str) - (loop for c = (read-char stream nil) - while (and c (or (digit-char-p c) (member c '(#\: #\T #\t #\: #\- #\+ #\Z #\.)))) - do (princ c str) - finally (when c (unread-char c stream)))) - :allow-missing-elements t)) - -(defun %read-universal-time (stream char arg) - (declare (ignore char arg)) - (universal-to-timestamp - (parse-integer - (with-output-to-string (str) - (loop for c = (read-char stream nil) - while (and c (digit-char-p c)) - do (princ c str) - finally (when c (unread-char c stream))))))) - -(defun enable-read-macros () - "Enables the local-time reader macros for literal timestamps and universal time." - (set-macro-character #\@ '%read-timestring) - (set-dispatch-macro-character #\# #\@ '%read-universal-time) - (values)) - -(defvar *debug-timestamp* nil) - -(defmethod print-object ((object timestamp) stream) - "Print the TIMESTAMP object using the standard reader notation" - (cond - (*debug-timestamp* - (print-unreadable-object (object stream :type t) - (format stream "~d/~d/~d" - (day-of object) - (sec-of object) - (nsec-of object)))) - (t - (when *print-escape* - (write-char #\@ stream)) - (format-rfc3339-timestring stream object)))) - -(defmethod print-object ((object timezone) stream) - "Print the TIMEZONE object in a reader-rejected manner." - (print-unreadable-object (object stream :type t) - (format stream "~:[UNLOADED~;~{~a~^ ~}~]" - (timezone-loaded object) - (map 'list #'subzone-abbrev (timezone-subzones object))))) - -(defun astronomical-julian-date (timestamp) - "Returns the astronomical julian date referred to by the timestamp." - (- (day-of timestamp) +astronomical-julian-date-offset+)) - -(defun modified-julian-date (timestamp) - "Returns the modified julian date referred to by the timestamp." - (- (day-of timestamp) +modified-julian-date-offset+)) - -(declaim (notinline format-timestring)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/src/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/src/package.lisp deleted file mode 100644 index ee03a97..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/src/package.lisp +++ /dev/null @@ -1,91 +0,0 @@ -(defpackage #:local-time - (:use #:cl) - (:export #:timestamp - #:date - #:time-of-day - #:make-timestamp - #:clone-timestamp - #:day-of - #:sec-of - #:nsec-of - #:timestamp< - #:timestamp<= - #:timestamp> - #:timestamp>= - #:timestamp= - #:timestamp/= - #:timestamp-maximum - #:timestamp-minimum - #:adjust-timestamp - #:adjust-timestamp! - #:timestamp-whole-year-difference - #:days-in-month - #:timestamp- - #:timestamp+ - #:timestamp-difference - #:timestamp-minimize-part - #:timestamp-maximize-part - #:with-decoded-timestamp - #:decode-timestamp - #:timestamp-century - #:timestamp-day - #:timestamp-day-of-week - #:timestamp-decade - #:timestamp-hour - #:timestamp-microsecond - #:timestamp-millennium - #:timestamp-millisecond - #:timestamp-minute - #:timestamp-month - #:timestamp-second - #:timestamp-week - #:timestamp-year - #:parse-timestring - #:format-timestring - #:format-rfc1123-timestring - #:to-rfc1123-timestring - #:format-rfc3339-timestring - #:to-rfc3339-timestring - #:encode-timestamp - #:parse-rfc3339-timestring - #:universal-to-timestamp - #:timestamp-to-universal - #:unix-to-timestamp - #:timestamp-to-unix - #:timestamp-subtimezone - #:define-timezone - #:*default-timezone* - #:*clock* - #:leap-second-adjusted - #:clock-now - #:clock-today - #:find-timezone-by-location-name - #:reread-timezone-repository - #:now - #:today - #:enable-read-macros - #:+utc-zone+ - #:+gmt-zone+ - #:+month-names+ - #:+short-month-names+ - #:+day-names+ - #:+short-day-names+ - #:+seconds-per-day+ - #:+seconds-per-hour+ - #:+seconds-per-minute+ - #:+minutes-per-day+ - #:+minutes-per-hour+ - #:+hours-per-day+ - #:+days-per-week+ - #:+months-per-year+ - #:+iso-8601-format+ - #:+iso-8601-date-format+ - #:+iso-8601-time-format+ - #:+rfc3339-format+ - #:+rfc3339-format/date-only+ - #:+asctime-format+ - #:+rfc-1123-format+ - #:+iso-week-date-format+ - #:astronomical-julian-date - #:modified-julian-date - #:astronomical-modified-julian-date)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/comparison.lisp b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/comparison.lisp deleted file mode 100644 index 4aa89c9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/comparison.lisp +++ /dev/null @@ -1,128 +0,0 @@ -(in-package #:local-time.test) - -(defsuite* (comparison :in simple)) - -(defmacro defcmptest (comparator-name &body args) - `(deftest ,(symbolicate 'test/simple/comparison/ comparator-name) () - (flet ((make (day &optional (sec 0) (nsec 0)) - (make-timestamp :day day :sec sec :nsec nsec))) - ,@(loop - :for entry :in args - :when (= (length entry) 1) - :do (push 'is entry) - :else - :do (if (member (car entry) '(t true is) :test #'eq) - 'is - 'is) - collect (let ((body `(,comparator-name (make ,@(second entry)) - (make ,@(third entry))))) - (cond - ((eq (car entry) 'true) - `(is ,body)) - ((eq (car entry) 'false) - `(is (not ,body))) - (t (error "Don't know how to interpret ~S" entry)))))))) - -(defcmptest timestamp< - (true (1 0 0) - (2 0 0)) - (true (0 1 0) - (0 2 0)) - (true (0 0 1) - (0 0 2)) - - (false (2 0 0) - (1 0 0)) - (false (0 2 0) - (0 1 0)) - (false (0 0 2) - (0 0 1))) - -(defcmptest timestamp<= - (true (1 0 0) - (2 0 0)) - (true (0 1 0) - (0 2 0)) - (true (0 0 1) - (0 0 2)) - (true (1 0 0) - (1 0 0)) - (true (1 1 0) - (1 1 0)) - (true (1 1 1) - (1 1 1)) - - (false (2 0 0) - (1 0 0)) - (false (0 2 0) - (0 1 0)) - (false (0 0 2) - (0 0 1))) - -(defcmptest timestamp> - (true (2 0 0) - (1 0 0)) - (true (0 2 0) - (0 1 0)) - (true (0 0 2) - (0 0 1)) - - (false (1 0 0) - (2 0 0)) - (false (0 1 0) - (0 2 0)) - (false (0 0 1) - (0 0 2))) - -(defcmptest timestamp>= - (true (2 0 0) - (1 0 0)) - (true (0 2 0) - (0 1 0)) - (true (0 0 2) - (0 0 1)) - (true (1 0 0) - (1 0 0)) - (true (1 1 0) - (1 1 0)) - (true (1 1 1) - (1 1 1)) - - (false (1 0 0) - (2 0 0)) - (false (0 1 0) - (0 2 0)) - (false (0 0 1) - (0 0 2))) - -(defcmptest timestamp= - (true (1 0 0) - (1 0 0)) - (true (1 1 0) - (1 1 0)) - (true (1 1 1) - (1 1 1)) - - (false (1 0 0) - (2 0 0)) - (false (0 1 0) - (0 2 0)) - (false (0 0 1) - (0 0 2))) - -(deftest test/simple/comparison/timestamp=/2 () - (is (timestamp= (make-timestamp) (make-timestamp))) - (is (not (timestamp= (make-timestamp) (make-timestamp :nsec 1))))) - -(deftest test/simple/comparison/timestamp=/3 () - (is (eql (handler-case - (timestamp= (make-timestamp) nil) - (type-error () - :correct-error)) - :correct-error))) - -(deftest test/simple/comparison/timestamp/= () - (is (timestamp/= (make-timestamp :nsec 1) (make-timestamp :nsec 2))) - (is (timestamp/= (make-timestamp :nsec 1) (make-timestamp :nsec 2) (make-timestamp :nsec 3))) - (is (not (timestamp/= (make-timestamp :nsec 1) (make-timestamp :nsec 2) (make-timestamp :nsec 1)))) - (is (not (timestamp/= (make-timestamp) (make-timestamp))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/formatting.lisp b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/formatting.lisp deleted file mode 100644 index e4c3bb4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/formatting.lisp +++ /dev/null @@ -1,97 +0,0 @@ -(in-package #:local-time.test) - -(defsuite* (formatting :in test)) - -(deftest test/formatting/format-timestring/1 () - (let ((*default-timezone* local-time:+utc-zone+) - (test-timestamp (encode-timestamp 1000 2 3 4 5 6 2008 :offset 0))) - (macrolet ((frob (&rest args) - `(progn - ,@(loop - :for (a b) :on args :by #'cddr - :collect `(is (string= ,a ,b)))))) - (frob - "2008-06-05T04:03:02.000001Z" - (format-timestring nil test-timestamp) - - "2008-06-05T04:03:02.000001-05:00" - (let ((utc-5 (local-time::%make-simple-timezone "UTC-5" "UTC-5" -18000))) - (format-timestring nil (encode-timestamp 1000 2 3 4 5 6 2008 - :offset (* 3600 -5)) - :timezone utc-5)) - - "Thu Jun 5 04:03:02 2008" - (format-timestring nil test-timestamp :format +asctime-format+) - - "Thu, 05 Jun 2008 04:03:02 +0000" - (format-timestring nil test-timestamp :format +rfc-1123-format+) - - "" - (format-timestring nil test-timestamp - :format nil) - - "04" - (format-timestring nil test-timestamp - :format '((:hour 2))) - - "04:03" - (format-timestring nil test-timestamp - :format '((:hour 2) #\: (:min 2))) - - "5th" - (format-timestring nil test-timestamp - :format '(:ordinal-day)) - - "2004-W53-6" - (format-timestring nil (encode-timestamp 0 0 0 0 1 1 2005) - :format +iso-week-date-format+) - - "2004-W53-7" - (format-timestring nil (encode-timestamp 0 0 0 0 2 1 2005) - :format +iso-week-date-format+) - - "2005-W52-6" - (format-timestring nil (encode-timestamp 0 0 0 0 31 12 2005) - :format +iso-week-date-format+) - - "2007-W01-1" - (format-timestring nil (encode-timestamp 0 0 0 0 1 1 2007) - :format +iso-week-date-format+) - - "2007-W52-7" - (format-timestring nil (encode-timestamp 0 0 0 0 30 12 2007) - :format +iso-week-date-format+) - - "2008-W01-1" - (format-timestring nil (encode-timestamp 0 0 0 0 31 12 2007) - :format +iso-week-date-format+) - - "2009-W53-5" - (format-timestring nil (encode-timestamp 0 0 0 0 1 1 2010) - :format +iso-week-date-format+) - - "2009-W01-3" - (format-timestring nil (encode-timestamp 0 0 0 0 31 12 2008) - :format +iso-week-date-format+))))) - -(deftest test/formatting/format-timestring/2 () - (with-output-to-string (*standard-output*) - (let ((*default-timezone* (find-timezone-by-location-name "UTC"))) - (finishes (print (now)))))) - -(deftest test/formatting/ordinals () - (flet ((format-ordinal (day) - (format-timestring nil (encode-timestamp 0 0 0 0 day 1 2008) - :format '(:ordinal-day)))) - (string= "31st" (format-ordinal 31)) - (string= "11th" (format-ordinal 11)) - (string= "22nd" (format-ordinal 22)) - (string= "3rd" (format-ordinal 3)))) - -(deftest test/formatting/bug/1 () - (let ((*default-timezone* (find-timezone-by-location-name "Pacific/Auckland"))) - (finishes (format-timestring nil (now))))) - -(deftest test/formatting/leap-year () - (let ((timestamp (parse-timestring "2004-02-29"))) - (is (timestamp= timestamp (parse-timestring (format-timestring nil timestamp)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/package.lisp deleted file mode 100644 index 88a1f87..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/package.lisp +++ /dev/null @@ -1,13 +0,0 @@ -(cl:in-package :cl-user) - -(defpackage :local-time.test - (:use :alexandria - :common-lisp - :stefil - :local-time)) - -(in-package :local-time.test) - -(defsuite* (test :in root-suite) () - (local-time::reread-timezone-repository) - (run-child-tests)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/parsing.lisp b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/parsing.lisp deleted file mode 100644 index 2473367..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/parsing.lisp +++ /dev/null @@ -1,79 +0,0 @@ -(in-package #:local-time.test) - -(defsuite* (parsing :in test)) - -(deftest test/parsing/parse-format-consistency/range (&key (start-day -100000) (end-day 100000)) - (declare (optimize debug)) - (without-test-progress-printing - (loop - :with time = (make-timestamp) - :for day :from start-day :upto end-day - :for index :upfrom 0 :do - (setf (day-of time) day) - (when (zerop (mod index 10000)) - (print time)) - (let ((parsed (parse-timestring (format-timestring nil time)))) - (is (timestamp= parsed time)))))) - -(deftest test/parsing/parse-format-consistency () - (flet ((compare (nsec sec min hour day mon year str - &key start end offset - (allow-missing-elements t)) - (let* ((timestamp-a (encode-timestamp nsec sec min hour - day mon year :offset offset)) - (used-offset (or offset - (local-time::%guess-offset (sec-of timestamp-a) - (day-of timestamp-a)))) - (timestamp-b (parse-timestring str - :start start - :end end - :allow-missing-elements - allow-missing-elements - :offset used-offset))) - (is (timestamp= timestamp-a timestamp-b))))) - (let ((timestamp (now))) - (is (timestamp= timestamp - (parse-timestring - (format-timestring nil timestamp))))) - - (let* ((*default-timezone* (find-timezone-by-location-name "Europe/Budapest"))) - (compare 0 0 0 0 1 1 1 "0001-01-01T00:00:00,0")) - - (compare 0 0 0 0 1 1 1 "0001-01-01T00:00:00Z" :offset 0) - - (compare 0 0 0 0 1 1 2006 "2006-01-01T00:00:00,0") - (compare 0 0 0 0 1 1 2006 "xxxx 2006-01-01T00:00:00,0 xxxx" - :start 5 - :end 15) - - (is (eql (day-of (parse-timestring "2006-06-06TZ")) 2288)) - - (compare 20000000 3 4 5 6 7 2008 "2008-07-06T05:04:03,02") - (compare 0 2 0 0 23 3 2000 "--23T::02" :allow-missing-elements t) - (compare 80000000 7 6 5 1 3 2000 "T05:06:07,08" :allow-missing-elements t) - (compare 940703000 28 56 16 20 2 2008 "2008-02-20T16:56:28.940703Z" - :offset 0))) - -(deftest test/parsing/split () - (is (equal (local-time::%split-timestring "2006-01-02T03:04:05,6-05") - '(2006 1 2 3 4 5 600000000 -5 0))) - (is (equal (local-time::%split-timestring "2006-01-02T03:04:05,6-0515") - '(2006 1 2 3 4 5 600000000 -5 -15))) - (is (equal (local-time::%split-timestring "2006-01-02T03:04:05,6-05:15") - '(2006 1 2 3 4 5 600000000 -5 -15)))) - - -(deftest test/parsing/reader () - (let ((now (now))) - (setf (nsec-of now) 123456000) - (is (timestamp= now - (with-input-from-string (ins (format-timestring nil now)) - (local-time::%read-timestring ins #\@)))))) - -(deftest test/parsing/read-universal-time () - (let ((now (now))) - (setf (nsec-of now) 0) - (is (timestamp= now - (with-input-from-string (ins (princ-to-string (timestamp-to-universal now))) - (local-time::%read-universal-time ins #\@ nil)))))) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/simple.lisp b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/simple.lisp deleted file mode 100644 index 89b38a9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/simple.lisp +++ /dev/null @@ -1,284 +0,0 @@ -(in-package #:local-time.test) - -(defsuite* (simple :in test)) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (local-time::define-timezone eastern-tz - (merge-pathnames #p"US/Eastern" local-time::*default-timezone-repository-path*)) - (local-time::define-timezone amsterdam-tz - (merge-pathnames #p"Europe/Amsterdam" local-time::*default-timezone-repository-path*))) - -(deftest test/simple/make-timestamp () - (let ((timestamp (make-timestamp :nsec 1 :sec 2 :day 3))) - (is (= (nsec-of timestamp) 1)) - (is (= (sec-of timestamp) 2)) - (is (= (day-of timestamp) 3)))) - -(deftest test/simple/read-binary-integer () - (let ((tmp-file-path #p"/tmp/local-time-test")) - (with-open-file (ouf tmp-file-path - :direction :output - :element-type 'unsigned-byte - :if-exists :supersede) - (dotimes (i 14) - (write-byte 200 ouf))) - (with-open-file (inf tmp-file-path :element-type 'unsigned-byte) - (is (eql (local-time::%read-binary-integer inf 1) 200)) - (is (eql (local-time::%read-binary-integer inf 1 t) -56)) - (is (eql (local-time::%read-binary-integer inf 2) 51400)) - (is (eql (local-time::%read-binary-integer inf 2 t) -14136)) - (is (eql (local-time::%read-binary-integer inf 4) 3368601800)) - (is (eql (local-time::%read-binary-integer inf 4 t) -926365496))))) - -(deftest test/simple/encode-timestamp () - (macrolet ((entry ((&rest encode-timestamp-args) - day sec nsec) - `(let ((timestamp (encode-timestamp ,@encode-timestamp-args))) - (is (= (day-of timestamp) ,day)) - (is (= (sec-of timestamp) ,sec)) - (is (= (nsec-of timestamp) ,nsec))))) - (entry (0 0 0 0 1 3 2000 :offset 0) - 0 0 0) - (entry (0 0 0 0 29 2 2000 :offset 0) - -1 0 0) - (entry (0 0 0 0 2 3 2000 :offset 0) - 1 0 0) - (entry (0 0 0 0 1 1 2000 :offset 0) - -60 0 0) - (entry (0 0 0 0 1 3 2001 :offset 0) - 365 0 0))) - -(defmacro encode-decode-test (args &body body) - `(let ((timestamp (encode-timestamp ,@(subseq args 0 7) :offset 0))) - (is (equal '(,@args ,@(let ((stars nil)) - (dotimes (n (- 7 (length args))) - (push '* stars)) - stars)) - (multiple-value-list - (decode-timestamp timestamp :timezone local-time:+utc-zone+)))) - ,@body)) - -(deftest test/simple/encode-decode-consistency/1 () - (encode-decode-test (5 5 5 5 5 5 1990 6 nil 0 "UTC")) - (encode-decode-test (0 0 0 0 1 3 2001 4 nil 0 "UTC")) - (encode-decode-test (0 0 0 0 1 3 1998 0 nil 0 "UTC")) - (encode-decode-test (1 2 3 4 5 6 2008 4 nil 0 "UTC")) - (encode-decode-test (0 0 0 0 1 1 1 1 nil 0 "UTC"))) - -(deftest test/simple/encode-decode-consistency/random () - (loop :repeat 1000 :do - (let ((timestamp (make-timestamp :day (- (random 65535) 36767) - :sec (random 86400) - :nsec (random 1000000000)))) - (multiple-value-bind (ns ss mm hh day month year) - (decode-timestamp timestamp :timezone local-time:+utc-zone+) - (is (timestamp= timestamp - (encode-timestamp ns ss mm hh day month year :offset 0))))))) - -;;;;;; -;;; TODO the rest is uncategorized, just simply converted from the old 5am suite - -(deftest test/timestamp-conversions () - (is (eql 0 (timestamp-to-unix - (encode-timestamp 0 0 0 0 1 1 1970 :offset 0)))) - (is (equal (values 2 3 4 5 6 2008 3 * *) - (decode-universal-time - (timestamp-to-universal - (encode-timestamp 1 2 3 4 5 6 2008 :offset 0)) 0))) - (let ((now (now))) - (setf (nsec-of now) 0) - (is (timestamp= now - (unix-to-timestamp (timestamp-to-unix now))))) - (let ((now (get-universal-time))) - (is (equal now - (timestamp-to-universal (universal-to-timestamp now)))))) - -(deftest test/year-difference () - (let ((a (parse-timestring "2006-01-01T00:00:00")) - (b (parse-timestring "2001-01-01T00:00:00"))) - (is (= 5 (timestamp-whole-year-difference a b)))) - - (let ((a (parse-timestring "2006-01-01T00:00:00")) - (b (parse-timestring "2001-01-02T00:00:00"))) - (is (= 4 (timestamp-whole-year-difference a b)))) - - (let* ((local-time::*default-timezone* amsterdam-tz) - (a (parse-timestring "1978-10-01"))) - (is (= 0 (timestamp-whole-year-difference a a))))) - -(deftest test/adjust-timestamp/day-of-week/basic () - (let ((sunday (parse-timestring "2020-09-13T00:00:00")) - (saturday (parse-timestring "2020-09-19T00:00:00")) - (base (parse-timestring "2020-09-15T00:00:00"))) - (loop for dow in '(:sunday :monday :tuesday) - do (let ((modified (adjust-timestamp base (timezone +utc-zone+) (offset :day-of-week dow)))) - (is (and (timestamp>= modified sunday) (timestamp<= modified base))))) - (loop for dow in '(:wednesday :thursday :friday :saturday) - do (let ((modified (adjust-timestamp base (timezone +utc-zone+) (offset :day-of-week dow)))) - (is (and (timestamp> modified base) (timestamp<= modified saturday))))))) - -(deftest test/adjust-timestamp/bug1 () - (let* ((timestamp (parse-timestring "2006-01-01T00:00:00Z")) - (modified-timestamp (adjust-timestamp timestamp (timezone +utc-zone+) (offset :year 1)))) - (is (timestamp= (parse-timestring "2007-01-01T00:00:00Z") modified-timestamp)))) - -(deftest test/adjust-timestamp/bug2 () - (let* ((timestamp (parse-timestring "2009-03-01T01:00:00.000000+00:00")) - (modified-timestamp (adjust-timestamp timestamp (timezone +utc-zone+) (offset :month 1)))) - (is (timestamp= (parse-timestring "2009-04-01T01:00:00.000000+00:00") modified-timestamp)))) - -(deftest test/adjust-timestamp/bug3 () - (let* ((timestamp (parse-timestring "2009-03-01T01:00:00.000000+00:00")) - (modified-timestamp (adjust-timestamp timestamp (timezone +utc-zone+) (offset :day-of-week :monday)))) - (is (timestamp= (parse-timestring "2009-02-23T01:00:00.000000+00:00") modified-timestamp))) - (let* ((timestamp (parse-timestring "2009-03-04T01:00:00.000000+00:00")) - (modified-timestamp (adjust-timestamp timestamp (timezone +utc-zone+) (offset :day-of-week :monday)))) - (is (timestamp= (parse-timestring "2009-03-02T01:00:00.000000+00:00") modified-timestamp)))) - -(deftest test/adjust-timestamp/bug4 () - (let* ((timestamp (parse-timestring "2013-04-30T00:00:00.000000+00:00")) - (modified-timestamp (adjust-timestamp timestamp (timezone +utc-zone+) (offset :day-of-week :wednesday)))) - (is (timestamp= (parse-timestring "2013-05-01T00:00:00.000000+00:00") modified-timestamp))) - (let* ((timestamp (parse-timestring "2013-12-31T00:00:00.000000+00:00")) - (modified-timestamp (adjust-timestamp timestamp (timezone +utc-zone+) (offset :day-of-week :wednesday)))) - (is (timestamp= (parse-timestring "2014-01-01T00:00:00.000000+00:00") modified-timestamp)))) - -#+nil -(deftest test/adjust-days () - (let ((sunday (parse-timestring "2006-12-17T01:02:03Z"))) - (is (timestamp= (parse-timestring "2006-12-11T01:02:03Z") - (adjust-timestamp sunday (offset :day-of-week :monday)))) - (is (timestamp= (parse-timestring "2006-12-20T01:02:03Z") - (adjust-timestamp sunday (offset :day 3)))))) - -(deftest test/decode-date () - (loop - :for (total-day year month day) :in '((-1 2000 02 29) - (0 2000 03 01) - (1 2000 03 02) - (364 2001 02 28) - (365 2001 03 01) - (366 2001 03 02) - (#.(* 2 365) 2002 03 01) - (#.(* 4 365) 2004 02 29) - (#.(1+ (* 4 365)) 2004 03 01)) - :do (multiple-value-bind (year* month* day*) - (local-time::%timestamp-decode-date total-day) - (is (= year year*)) - (is (= month month*)) - (is (= day day*))))) - -(deftest test/timestamp-decoding-readers () - (let ((*default-timezone* +utc-zone+)) - (dolist (year '(1900 1975 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010)) - (dolist (month '(1 2 3 4 5 6 7 8 9 10 11 12)) - (dolist (day '(1 2 3 27 28 29 30 31)) - (when (valid-date-tuple? year month day) - (let ((hour (random 24)) - (min (random 60)) - (sec (random 60)) - (nsec (random 1000000000))) - (let ((time (encode-timestamp nsec sec min hour day month year :offset 0))) - (is (= (floor year 10) (timestamp-decade time))) - (is (= year (timestamp-year time))) - (is (= month (timestamp-month time))) - (is (= day (timestamp-day time))) - (is (= hour (timestamp-hour time))) - (is (= min (timestamp-minute time))) - (is (= sec (timestamp-second time))) - (is (= (floor nsec 1000000) - (timestamp-millisecond time))) - (is (= (floor nsec 1000) - (timestamp-microsecond time))))))))))) - -(deftest test/timestamp-century () - (let ((*default-timezone* +utc-zone+)) - (dolist (year-data '((-101 -2) - (-100 -1) - (-1 -1) - (1 1) - (100 1) - (101 2) - (1999 20) - (2000 20) - (2001 21))) - (let ((time (encode-timestamp 0 0 0 0 1 1 (first year-data) :offset 0))) - (is (= (second year-data) (timestamp-century time))))))) - -(deftest test/timestamp-millennium () - (let ((*default-timezone* +utc-zone+)) - (dolist (year-data '((-101 -1) - (-100 -1) - (-1 -1) - (1 1) - (100 1) - (101 1) - (1001 2) - (1999 2) - (2000 2) - (2001 3))) - (let ((time (encode-timestamp 0 0 0 0 1 1 (first year-data) :offset 0))) - (is (= (second year-data) (timestamp-millennium time))))))) - -(defun valid-date-tuple? (year month day) - ;; it works only on the gregorian calendar - (let ((month-days #(31 28 31 30 31 30 31 31 30 31 30 31))) - (and (<= 1 month 12) - (<= 1 day (+ (aref month-days (1- month)) - (if (and (= month 2) - (zerop (mod year 4)) - (not (zerop (mod year 100))) - (zerop (mod year 400))) - 1 - 0)))))) - -(deftest test/encode-decode-timestamp () - (let ((*default-timezone* +utc-zone+)) - (loop for year :in '(1900 1975 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010) do - (loop for month :from 1 :to 12 do - (loop for day :in '(1 2 3 27 28 29 30 31) do - (when (valid-date-tuple? year month day) - (multiple-value-bind (nsec sec minute hour day* month* year* day-of-week) - (decode-timestamp (encode-timestamp 0 0 0 0 day month year :offset 0)) - (declare (ignore nsec sec minute day-of-week)) - (is (= hour 0)) - (is (= year year*)) - (is (= month month*)) - (is (= day day*))))))))) - -(deftest test/timestamp-maximize-part () - (timestamp= (timestamp-maximize-part - (encode-timestamp 0 49 26 13 9 12 2010 :offset -18000) - :min) - (encode-timestamp 999999999 59 59 13 9 12 2010 :offset -18000))) - -(deftest test/timestamp-minimize-part () - (timestamp= (timestamp-minimize-part - (encode-timestamp 0 49 26 13 9 12 2010 :offset -18000) - :min) - (encode-timestamp 0 0 0 13 9 12 2010 :offset -18000))) - -(deftest test/decode-iso-week () - (dolist (*default-timezone* (list eastern-tz +utc-zone+ amsterdam-tz)) - (dolist (testcase '((2005 01 01 2004 53 6) - (2005 01 02 2004 53 7) - (2005 12 31 2005 52 6) - (2007 01 01 2007 1 1) - (2007 12 30 2007 52 7) - (2007 12 31 2008 1 1) - (2008 01 01 2008 1 2) - (2008 12 28 2008 52 7) - (2008 12 29 2009 1 1) - (2008 12 30 2009 1 2) - (2008 12 31 2009 1 3) - (2009 01 01 2009 1 4) - (2009 12 31 2009 53 4) - (2010 01 01 2009 53 5) - (2010 01 02 2009 53 6) - (2010 01 03 2009 53 7) - (2016 01 04 2016 1 1))) - (destructuring-bind (year month day iso-year iso-week iso-dow) - testcase - (let ((ts (encode-timestamp 0 0 0 12 day month year))) - (is (equal (list iso-year iso-week iso-dow) - (multiple-value-list (local-time::%timestamp-decode-iso-week ts))))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/timezone.lisp b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/timezone.lisp deleted file mode 100644 index f2a1c68..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/test/timezone.lisp +++ /dev/null @@ -1,106 +0,0 @@ -(in-package #:local-time.test) - -(defsuite* (timezone :in test)) -(eval-when (:compile-toplevel :load-toplevel :execute) - (local-time::define-timezone eastern-tz - (merge-pathnames #p"EST5EDT" local-time::*default-timezone-repository-path*)) - (local-time::define-timezone utc-leaps - (merge-pathnames #p"../zoneinfo-leaps/UTC" local-time::*default-timezone-repository-path*))) - - - -(deftest transition-position/correct-position () - (let ((cases '((0 #(1 2 3 4 5) 0) - (1 #(1 2 3 4 5) 0) - (2 #(1 2 3 4 5) 1) - (3 #(1 2 3 4 5) 2) - (4 #(1 2 3 4 5) 3) - (5 #(1 2 3 4 5) 4) - (1 #(1 3 5) 0) - (2 #(1 3 5) 0) - (3 #(1 3 5) 1) - (4 #(1 3 5) 1) - (5 #(1 3 5) 2) - (6 #(1 3 5) 2) - (1 #(1 3 5 7) 0) - (2 #(1 3 5 7) 0) - (3 #(1 3 5 7) 1) - (4 #(1 3 5 7) 1) - (5 #(1 3 5 7) 2) - (6 #(1 3 5 7) 2) - (7 #(1 3 5 7) 3) - (8 #(1 3 5 7) 3) - ))) - (dolist (case cases) - (destructuring-bind (needle haystack want) - case - (let ((got (local-time::transition-position needle haystack))) - (is (= got want) - "(transition-position ~a ~a) got ~a, want ~a" - needle haystack got want)))))) - -(deftest test/timezone/decode-timestamp-dst () - ;; Testing DST calculation with a known timezone - (let ((test-cases '( - ;; Spring forward - ((2008 3 9 6 58) (2008 3 9 1 58)) - ((2008 3 9 6 59) (2008 3 9 1 59)) - ((2008 3 9 7 0) (2008 3 9 3 0)) - ((2008 3 9 7 1) (2008 3 9 3 1)) - ;; Fall back - ((2008 11 2 5 59) (2008 11 2 1 59)) - ((2008 11 2 6 0) (2008 11 2 1 0)) - ((2008 11 2 6 1) (2008 11 2 1 1))))) - (dolist (test-case test-cases) - (is (equal - (let ((timestamp - (apply 'local-time:encode-timestamp - `(0 0 ,@(reverse (first test-case)) :offset 0)))) - (local-time:decode-timestamp timestamp :timezone eastern-tz)) - (apply 'values `(0 0 ,@(reverse (second test-case))))))))) - -(deftest test/timezone/adjust-across-dst-by-days () - (let* ((old (parse-timestring "2014-03-09T01:00:00.000000-05:00")) - (new (timestamp+ old 1 :day eastern-tz))) - (is (= (* 23 60 60) (timestamp-difference new old))))) - -(deftest test/timezone/adjust-across-dst-by-hours () - (let* ((old (parse-timestring "2014-03-09T01:00:00.000000-05:00")) - (new (timestamp+ old 24 :hour eastern-tz))) - (is (= (* 24 60 60) (timestamp-difference new old))))) - -(deftest test/timezone/timestamp-minimize-part () - (is (timestamp= - (timestamp-minimize-part - (encode-timestamp 999999999 59 59 1 14 3 2010 :timezone eastern-tz) - :month - :timezone eastern-tz) - (encode-timestamp 0 0 0 0 1 1 2010 :timezone eastern-tz))) - (is (timestamp= - (timestamp-minimize-part - (encode-timestamp 0 0 0 2 14 3 2010 :timezone eastern-tz) - :month - :timezone eastern-tz) - (encode-timestamp 0 0 0 0 1 1 2010 :timezone eastern-tz)))) - -(deftest test/timezone/timestamp-maximize-part () - (is (timestamp= - (timestamp-maximize-part - (encode-timestamp 999999999 59 59 1 7 11 2010 :timezone eastern-tz) - :month - :timezone eastern-tz) - (encode-timestamp 999999999 59 59 23 31 12 2010 :timezone eastern-tz))) - (is (timestamp= - (timestamp-maximize-part - (encode-timestamp 0 0 0 2 7 11 2010 :timezone eastern-tz) - :month - :timezone eastern-tz) - (encode-timestamp 999999999 59 59 23 31 12 2010 :timezone eastern-tz)))) - -(deftest test/leaps/tai-to-utc () - (let ((*default-timezone* utc-leaps)) - (is (= 1435708799 - (local-time::%adjust-sec-for-leap-seconds 1435708824) - (local-time::%adjust-sec-for-leap-seconds 1435708825))) - (is (= 1435708800 - (local-time::%adjust-sec-for-leap-seconds 1435708826))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo-leaps/UTC b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo-leaps/UTC deleted file mode 100644 index 009856a49b418f9a7825946c4684f476076addc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 647 zcmWHE%1kq2zyOR43=AMF1(gA@Ss?7t5N8IKO%WgtBkPhkAQ>k1Hu)w71_ox%^k8NN z1_l;xkG2*D1_oAMZSGbE1_m~M9(y(h1_pM4w?*v?3=AAX=az9WFfee6&Og=3z`(#I z-tdo$fq{WrGRd%;fq{WXR`nGR0|NuE;;pB=3=9l>s`KXdF)%RjtJh!TXJB9u&mQy3T+M9q2xL>U+u#GJQFPh((U z5ciB>pU%L*AmRUhvIGMIgJkGr-I)vw3{ngXM1%v#ry$Jo1LSuE1_cO+2MZJs8x}Ai zHY{*JY*+w+*swqXv0(uPV#5Lp#D)bJhz$!g5E~Y7AT})UKx|k5g4nP?1hHWO31Y(n z6U2rED2NRUR1g~$upl-pa6xQX0E5`DKnAg40S#iq0vp7J1vrQe3v>`05%650AgeJd!r^M_|JB)_%QprPQjc#6AR`Z@c1yV^IyUI1zH~# zBrN@~uz}~pB0ZrGi>rJ-EHQ2Tuw(~Y!Lk2r1;-HRnATuiqD+?<#D>EY#8;HTi%*w#PWC(IKp8z8Zh-Tn~kunO5ybKI{0t`YR zl946AH-sVFH5f#MFgSx4&aNR042+Cm4G;oH@Nh6NFn};fkrI?G_5c6>|Jf%zAAo33 zP=RPraDnOTIt3sa6l@?G6m%dO6nr2W6oeoe6pSDm6qFzu6r3O$6r>;;6s%x+2OHQt zQ1F8Ipdbd*w>TGoXi!jtXi#v2Xi$)YXi%_&Xi(6DXi)HjXiyY@JOhdb5Dkh75DkhB z5DkhF5DkhJ5DkhN5DkhR5DkhV5DkhZ5DkhdMiwS!B*?ER zFx>&EW-?@80mlg>OnE_K47>~sG75}>AaMpU5Xs2l;~T<&Bi2x(je*PAHAL5t3jiRc B^O67n diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Asmara b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Asmara deleted file mode 100644 index d1e876e2ff93d4ca4aaff51a12d8dfae9e232bac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmWHE%1kq2zyM4P3=AL)l3;|gIS;J=G=q_WK_vqus%5~y>geJd!rgeJd!rl%roiPG=@Esb~L;bY!_f;V*LOAM*~Qnfq{YL|NoC4 q7&v@Ks3l25KV$rT<*Rh23!El{xMGg diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Bangui b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Bangui deleted file mode 100644 index 883e597eb0f3200e78929bb034821cdef1392afa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWHE%1kq2zyM4P3=AL)l3;|gIVL@;6=7sx5X=FI@(D1o`1pn}ggb_SxD2Ei^#A|= P|9B1K3U>_AHRJ*Se{m7p diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Banjul b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Banjul deleted file mode 100644 index a85a7d87261f7728c30f9579a2580bdfc86f5b83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232 zcmWHE%1kq2zyK@^3=AL)l3<3i1tvY4C$mpWea@F{W&(^%%>Vy?NMT?AlPv%LfBe9} y0aDGtPx! P|M42e0ssd>4<7&k diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Cairo b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Cairo deleted file mode 100644 index 39caffbe4ebdb6179a441ddd0e0c6fce4ac0ad2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9307 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 wsK299I7AGlxeFz_V0f8af7-@w=Rseu1- zV1t1A;sUAd%NXQ(CJ4yaGzuu>6bUHCBnv3{ga|0xxC*G~mF2I!{pl zYBE9Nsp*XB6E zezwd6hcx90jxCk~PHwCdoKvI)TvVS=aCQDG;Kq7#g1hp40rz*$1U#7!3V5D7A>j3R zv4HowRRTU|_D}Hb>k;rG#0!3-!0>y@M0wu0L1xf`O1j_V9CzO47Bv8TkeL}^BBLbE0 zZceD$uuP!(-0lfAGY?IuT{m|^UFDJq^?mgd7#WzDA&`L)4p~^)=mSAX5QO;z7+Dw? zAS8$nVl!|uFvut{@XfM`&D0MVd40ir?q0z`xI z2AF<0u>nMb@(7qd^u7ROIVi7y>0`McKr|@NfM`&@0nwnm1EN9s2SkJN5QqllBM=SB zOCTDQpFlJyPl0Gqz5>ypyal2``3ppY@)(E)83Zg;z6hwpaDu@Q< zR}c-#vtasfy#R;?bhz6A%VEVfOI6gpS z2#60VM?f^FECJD=@&rVK$`lX{Dpx=>sB8hzpz;MogUT2X4Jv0qG^nfr(V+4MM1#s4 z5DhAKKs2cA0nwoH2SkI)ATa%6I@mp+vIxWnl}8{NR3?FFP`L!6L1hz&29-}B8dOGs zXizx?qCsU9hz6BcAR1I=foM><1)@P^7l;OxUmzM(hJoo1kHGN(D$788Pp(+B?l|CVBffrol34+8Kczt|9MIH#F7JHyVkC72#5+fs*vulX1p|fjnh>owZo~fRJ Nj<2Bsh}Jje0sy=g1RMYW diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Conakry b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Conakry deleted file mode 100644 index 45bcce1cf654a19c12fb8b5eff6b644aa523ae5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmWHE%1kq2zyQn)3=AL)k^s>l%roiP?3g{1b~L;-5Szfr#Q6XJXBCh<0|Nug|NkF9 qFmU+zhA_DMhA@OXhCn4qG5-Jm|NlW&fM}34AescLxZHh147dRO^D(Ia diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Dakar b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Dakar deleted file mode 100644 index 31104133c293ab4358a8b52e7b6f66cd22150d6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmWHE%1kq2zyQn)3=AL)l3;?ec_uxZcjJ_`zywC7|Nq~wU|{(F|KkS+7LXDK4jl%(rdvPx! P|M42e`z*6$M! diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Douala b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Douala deleted file mode 100644 index 8627f2e05e95e60f75766d0100db6224616289bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWHE%1kq2zyM4P3=AL)l3;|gIVL@8&0u6;;FJJ~@(D1o`1pn}ggb_SxD2Ei^#A|= P|9B1K3U>_AHRJ*Sg9#Da diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/El_Aaiun b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/El_Aaiun deleted file mode 100644 index 3275161b17a180e7788b534f24c65df108549a34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmWHE%1kq2zyQn)3=AL)l3;?edG>gGc))#e!vsdA|NlQPU|{(F|KkS+7LXDK4jp1~Oz7lAW-1vfnJsS$V)+|cmi z%$|Z*CR-R@t$qLDjp*}+H~q>5Z-3-8yenK$@c!lkh7UovKYZMEx#5!ue*qIC8f0Z= zLBRk2KTly``2YWR03*x){~tdva56CP2{5vNoX)@tCOO@FLl}a6f9YYx0eM7*a zFak#qurn|)fG|jzJd`c^|NsC0QB^D6fM`%~fM`&VfM`&#fM`(AfM`(gfM`$0foM>WfoM>$foM?Bf$3kXHh^eQ5Q6F3_Y6QZC@8`7UO})tC`dtkP_TmO zGkXd^G$?q%^xF3yKr|?r!F0beSRNGIAU-I_K{P1XK{P1nK{P1%K{O}|7@3*SAR7xS s0>a|p^ArXaa7=K3V}chP6C9urWDo?Cygt4m40vOMfq~22H^hJo0HcyF*#H0l diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Gaborone b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Gaborone deleted file mode 100644 index ffc77950e1dcd6f5a117786228ab9fdbdf92f08f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmWHE%1kq2zyM4P3=AL)k^s>l%z3Uaui<=MU;!fo1A~kLNJ`6qk;U0Dgu&S{I0VFJ zz+oIS0|NsHgVca%5a#{=|Ns94`2rIV4Kf-;gNV(67#O&m9Yb`DxByu@AvFL1 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Harare b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Harare deleted file mode 100644 index 258b393637294912a6d6c78973c09424136ed50e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWHE%1kq2zyM4P3=AL)l3;|gIhx##r!X=w$jX33WfT}#e0)O~oE<|zTn17M`v3p` Pf4qiqIXi~v8gT&tQx_2^ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Johannesburg b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Johannesburg deleted file mode 100644 index d1bec7381574ba1932725e3462430f89903e6d5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245 zcmWHE%1kq2zyQn)3=AL)l3<0hS)1I>XPjBr({OfPe!;oEyoU32fdx#AOpHtn45AVs zm0AXj3=9l13JeUvj=>=y5e5bZ95%2pFff2HNEI8D&H4ZT|Nptwjt(FiWE+SE*$ARR ywt{Go%^(_NJ0mj_GZQldgOmfv7*Pq3iCPAXEMP~l`1pn(JA{FO3*;lEWGjEeVHwXW?i^8x9!IB9`|HMCT2zk2DucFA}s@u zdSwj;4h9CbxeUBMz99^*jv)+AP$D!0qza5lvGV`_|NlYOf@qM{AR1&nh^D{^T&|8G Hy2e}p@Lo1= diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Khartoum b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Khartoum deleted file mode 100644 index 6f62fd764cef89254550b1e8204ffc6c98932605..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 669 zcmWHE%1kq2zyK@^3=AL)l2C%O1-C7}#lSF6`~hQ?NdQyr&j-xW=@(cM>K?G#zPZ5W zknn(AULk-(!RY}fL+}MI29*a~58DH{AFw^(Il>dbyZ^-lzNPjT_*b$f2(%Rk2zESA z5K3QmK{(@Nf{2&)1yPUH31Zsu0pc3H2@*V$E=Y3ZCrG|M79jPp`+@WY?*N&LxesJF z)?Kh@a8+PpBmkKi7~~p2PS-MEWMN>CQDER?V9+vP;PvqhVQ_W~1`#0)u8tufHDF9i zF#P}j|35e=Ksx7%KLAmnAOX>!U;)vfpaIdK-~rK~AOg{#U;@#gpaRjL-~!R0AOq2$ zU<1<++XFx}DEL4$CTLBC@4WRC^$hhC`dsxC|E%>C}=@6D0o3MD2PEcD40Ps yD5ya+D7Zm1D9AxHDA>XD+hbt+LBS8=gQ5ULgQ5XMgQ5aN($|x|f`1pn}I6H=bxD2Ei^#A|= P|9B1Ka&`>SHR1vQZX6MU diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Kinshasa b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Kinshasa deleted file mode 100644 index e8481f3476aad980237ac04c0f1aecd46e947e2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 zcmWHE%1kq2zyOR43=AL)lK`<<7#R2j7#PAGLl_tsaOh)VU|;}YkUo$e5S!!w|Ns9h he05eZGBEH(fMoat7+8FKL!d@6FmQ!ChUgk{0RY$u4b%Vt diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Lagos b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Lagos deleted file mode 100644 index cbdc0450fc3b97bc436f6d90798a30ebe0ac30b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWHE%1kq2zyM4P3=AL)l3;|gITi+f4q#+pU^W1W@(D1o`1pn}ggb_SxD2Ei^#A|= P|9B1K3U>_AHRJ*SaA^^r diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Libreville b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Libreville deleted file mode 100644 index d7691ae56f56a0c15e753bf3c5e64b3b2b577d93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWHE%1kq2zyM4P3=AL)l3;|gIVL@8UBbw~z;Op8$|u0U;^P~_5bhWP;xdq8(EtDc P|Kl}`E8HF c3=E7aAQ=V*1{NRR5C(`*3=CZEz99x&0JxbAKmY&$ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Luanda b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Luanda deleted file mode 100644 index 576b2043cfb39ae472ea29d99d76150342f9cf06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmWHE%1kq2zyM4P3=AL)l3;|gIVK*d@L^-ebAq>doGca(4JBH{Q GasdFYSr_5} diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Lubumbashi b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Lubumbashi deleted file mode 100644 index d3fab52a6ce769f80420b5ec8e95c645c14b97d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 zcmWHE%1kq2zyOR43=AL)lK`<<7#L&}7#N%#Ll_tsaOh)VU|;}YkUo$e5S!!w|Ns9h hd=(uS85krFfMjG87+8FKL!d@6FmO3LhUgk`0RY;z4b=bu diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Lusaka b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Lusaka deleted file mode 100644 index 87d7a95fc7f19a45ba90bb27009c65616a0b521d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWHE%1kq2zyM4P3=AL)l3;|gIhx!~{$XTbkZJ*m$|x|f`1pn}I6H=bxD2Ei^#A|= P|9B1Ka&`>SHR1vQ-INn1 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Malabo b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Malabo deleted file mode 100644 index c70de1f99d9f6c8af5e8f6691ddeb3ac822fdd74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmWHE%1kq2zyQn)3=AL)l3;?ec_uw;bNMoVUjri(0|SQ*NQ!}hfrWvAPk@2L$2Ww* h-8Y0G+%W_yL5j)$|Ns9FG95${Zv$7jV~DOH7XW}j9c=&r diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Maputo b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Maputo deleted file mode 100644 index 31cfad771a5c7c609e495da650e3ffbcf07c974d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWHE%1kq2zyM4P3=AL)l3;|gIhx##eqm%_km~`7$|x|f`1pn}I6H=bxD2Ei^#A|= P|9B1Ka&`>SHR1vQ-5e7p diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Maseru b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Maseru deleted file mode 100644 index 117006eead2af9510ba7adc56f1d49398c9c4cb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmWHE%1kq2zyQn)3=AL)k^s>l%-Q62YR9?0yoU32fd!0Aj0_BtCqVKt3Jfd^3|a<^ pEIz&=48e}UAs|r(1_n~h{{R2~e~|eg8e|8ECe|JU$HR1vQq~j7( diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Mogadishu b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Mogadishu deleted file mode 100644 index 9ce97a66765a652f4a6b0902d9748b607821851f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmWHE%1kq2zyM4P3=AL)k^s>l%(-pxxq#9@(I6UZJQE`WgH{Jft(E};3j>3)1_OtWZwLd( Q61Yta3|y{`A-cv~08M@*RR910 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Monrovia b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Monrovia deleted file mode 100644 index bd2fa4e6318ad3316214e0131b9d0d6c1aefffba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215 zcmWHE%1kq2zyQn)3=AL)l3;?ec^1Uy%wb9V_KuP1|NpN~7#RNl|2m0*1*C+5!`C;2 z!6zt$!QD3mEWp5k!(@lEWGjEtv_21&AM=WqWg`v`VSv7GBGnUFetTv6locN z)GKQ+a4;~a&1K;A@eN^cbqrx}f)b%2AXQ*Yik1KW|NjrN7DR)r2GJnvK{N$U;Bs{g I(KY4*0C5sIKL7v# diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Ndjamena b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Ndjamena deleted file mode 100644 index 8779590e04a66e4287cabe801aee9c8d2d793892..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmWHE%1kq2zyQn)3=AL)k^s>l%sc5>LyAyZVS%vPy#z)kMg|5x8IU}m00RpHgNy1*9!QD3mq#cY&vF88(|NlW&foPC*Aesy-xxyVobPc%x#11Yi diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Nouakchott b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Nouakchott deleted file mode 100644 index 10ca86690c430f77e23f1a6cdb4f92f412611978..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmWHE%1kq2zyQn)3=AL)k^s>l%roiP+>$+$b~Ll%roiPG=@Esb~L;bY!_f;V*LOAM*~Qnfq{YL|NoC4 q7&v@Ks3l25KV$rT<*Rh23!El{xMGg diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Tripoli b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Tripoli deleted file mode 100644 index 943f9a36b1200450ac52d022b40f3a3594323958..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 599 zcmWHE%1kq2zyK@^3=AL)l8}Y61s8rgsB(ArMuB_EYZD$;ToQQrJoUj-efxr^E6+T5 z?RV^h*d(U}agOf=;=i;XNW9YeAbC4JLF&x<57K*|B*<*3`XD=B{DItL?gIIycL@pw zUImJYbq|z+&KD@VFh5W+Vfvt|YM!9xu>FIP-^T=F7qbEr)2s(fj9|zNCLwGH$;`ya z%)r1C19G8^0wW6p1D^l`Cj*0w0t2s)ZwQ04YcPliVQ_T~0jU9FQhfXW|Ns9WAA@L+ zuR%1(=O7y7docYx^#O6tNP^f_EU)m2qG$?dHG$@2XG$@on zG$^D%G$^z{G$_PCG$_R-G$>?2 TG$?dIH1$K6%hfeR*N6)M7a5*1 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Tunis b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Africa/Tunis deleted file mode 100644 index 94d01dac4de6bc5fb32396f6a9cabb85cb38ad97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1517 zcmWHE%1kq2zyPca3=AL)l8A<~c_$_W_#dJt9pS`3GWAIn+66K)#npjo&O5Bv7VgZu6$p>{oOMG zPv(OHp65;ocs*V$;Jt2@fX|uz6MXx61pL-4oZz3AClJunJRvZ=YeG;?>V#nPoCzU5 z?h``A{U(IzXif(L7S;SVW5pbQJT0wv7wwmiR({+Qb7iRGJVkrWgi|1 zRPcSDP;udiK;^re6RI{W6R1A7dqU03LlbJ(&7DwJxnx3pU;PATMkYpP7C2;Nq8?;m zU@`>7tBe983j+h600SqC1c?OrhA=q027`zY1_nk(kV*yy1{~>xje&sygh8replrea z|NsAwbQAspqCsf}M1#@|hz6w{FnwF;0f+{rArK8pM<5!MmOwNpJ%Q;%VhmvV%mx7v z4N6-e8kD|3G$@UMXiz!>(V(;jattWFfoM>g1JRckh~4@85~ABYB}K@bf}haei1 z7C|&9J%VUZngr3HbP1wCX%j?)(kF-prBM(KN~a(ilvcs?yJrF*8kAB+rFk%YT?otvrF{?|l>R|9C=Y;WP(A?Bpu7O0LHPkhgYpE32IUJ74ayrJ8k9dk zG$@aNXiz=@(V)BnqCxouM1%4Sn0_%GY(FUPfcT*N1EN8B2t)-U88}`~{*xc??8@@)?K*2jx8wAC&(( zXiz=`(V)BtqCxo)M1%4qhz8|L5Dm(kj4VvdOf0N$$iz%N$iTqa1G0z7kb#APK}La* u1DrW|VI)Yz$2WulHJc*xDFc_YYlyBPCYXPjBr({OfPet{a>@&~$eUp>&vlo8OceaT?p z@lU`oowdP83^ED~Tp*H>kAZ5P4N7Vt8kF2XG$_e|Xi%~P(;x3m0MVf22c|C`0P{h~5X1*1MGy^2jvyM8BtbMN zS%PR#(ge|<XEgR%;U z24xoz4azbg8kB87G$`wUXi)Y6)1PmF!ylB5KzvYE0@0xC1foG%3Pgjl6^I69Ef5XL zULYEj#XvMDn}KLhRs+$X>;|GiSq?;lvK@#9WjzoL%6=dklm$UFC>w(5r;cFvfU+Zq z56Y4t8k8+TG$?C=Xi)Y9(V#2}qCwddM1!&_hz4a>5Dm$)%uFn7th9j)3<4Y=i$o-bvg8R{A6_?mzyE&%2r BTuA@` diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Adak b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Adak deleted file mode 100644 index 391ec98ec0f31cd595ed05a9b91a41c4cdb25d31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2353 zcmWHE%1kq2zyKT!3=AL)lIVxBl}~rNT)3qCrQlLxfWxm#p&S0~C=B?&BE*4VMsNUQ zhnWLYg=qkDVbB4V#J~%zfhGso9E~rq8;TuZ@6ElyDe&U}=h~M6Tpw;7;C^uP0?*Cw z4!j3;U*Ow$(}92GjR1j}yB!2OcLfMl&UFyZoD(1tS??g~Sr;H?ndl&{nGhhMRC_>@ z(r+@>}kBm3STrxT!dq{MH+$NC&@(aIjP$+YEP;9)pK`BhrK{@N2 zfr=TogR0jJ12xgN4(eLF4AlQ~9?;~PW1xBO^#QF{bq3n|&K}UYJZppQy!8k4HrH&> zubX(lU~=3B!}N6yM#T;rjNKav9`M_ivB5uP@_~S9UK;{!N)H5; z>1+s=2|o}L#Apc zP-bywL)m@y0~HecHdO3;d7$#gf(=#kP9Lbg(X^qaZta2E9Vr{?;`$HN&v4to$i%?R zf)BE?v(XX$|DPJb!0`WnaRMU?nB)M9@POF@Ad*4k|Nq7UMoBPR&M!EG!7n_7!7m_$ z!6`U|!O10r!O;#9l>#6dR1$z_P-y_7K_vo+29*jR8dNfXXi(_@qCq7Dhz6AsAR1Is zfM`%@0jB?Rg6#v98X!KX_h9=#r51<}D!D*3 zsPqEUn>T~yL8Tao4=Tw(G^jKK(V!9yM1x8-5DhBXKs2ay1JR%o4n%`WIS>sh=|D87 zv;)(BEWzOqD)m5oP{{|PL8Tv!>1<{~V6-0wdRuBy;T|qRcgay%{QWivmN?H&NDs4eDsKf=)pi&o1|5pW@4=Q~@ zd{7AtqCurFnBMmiEDtJ;L3~h&45C4$GKdD1%pe+6I)i9X2@Rqlr8F}O6Du1&$j-?@ zN65gi`XQ*Cj!FWNsR0b|(z-Z-kq2C6gG*~h5pX#z0WPy;!E7ZT-w+0(%56l+4P$Y6 cI0lCp8h{FS9baQTBRvBhUqeGZLp=j70DftCkN^Mx diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Anchorage b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Anchorage deleted file mode 100644 index d14735026a09cff0104e479fa6543301d482deed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2358 zcmWHE%1kq2zyKT!3=AL)lIVxB)lPSs9k`_YrQlMclfkb`?hF3yNOt(Y!p(qThN}Z( zhlT-Dg}MWCq00uAMCSvnfodDr990jn8**%5?~OmeDe!6o=i1v2Tp!MC;C^uW0ME^r z2D}H>9^l(~+JJxMDF=a>YYhZD*Ek4O_8SOi_Bn_|78;0p7C4Am1{;WL202J5{mmsB>$9%5f0w~1|o{KA(D6v`|O6dO-3PzsYaP|kXx zpkn&hK-KG%f|}@k19h!63hMuUZ_woGQ_#G3cZ1fe0tM}T`#0!Z?pdHaZ{Y^L&3Oy- z>zX$hOb%FJn7+WksMu(Mv3rw&NwCNQQ}q-BGox<{%-P)xEM$ZgES_r^SpNR1V0E0! z!20%e1)B|O8*F#)RIr=CvB7@!Yz2q>R~sB#wl8qyxztrc+WYw!RK1V0^gd&8~nCKE%1+N-4HO%WLC?=zphBXeMb;lz%~?SoF6+iT@^rlKan+X+hPzy&I};lq{&Jo4=uUN7#b8xW*0jGb|P`GBGf- z;DfB}Y;=VG{}(4PF#P}DSir~vCON?(d|;M1%|LqSv-~iFJ z?T#KG8kFHc^d;pl1zG^nry(VzkoM1u-V5Dh9g!SvfnVE2FuP!Jzfh=OQPK?4Ju?oG^n5j(V)T>M1u-k5DhAHK{Tk~1=Ih-DyoYsz+?ggq`>9?70ish;9^?{%oYcc3^L$iTLH{g_3;Ij*dR=}=tdOY fFcuf6P`7mSb_vn(HP$oIGtluhG}JTHGvERM@GWVC diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Anguilla b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Anguilla deleted file mode 100644 index 20bc9464b8dc49f9e814f26dafca1e779f763b6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmWHE%1kq2zyM4P3=AL)l3;|gIVPK%Dlq>4f8+rJ!~g%s4=}L!_=Yez28VzYF_2== R|NsC0<28)SF*wA83ji-D9O(c6 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Antigua b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Antigua deleted file mode 100644 index 608b635977bde87ab1e17875905d25b8fe1245a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmWHE%1kq2zyQn)3=AL)l3;?ec_y11f4JjxCxDUZ|NmnG3=IGO@7%z^^8f$w0}LEK nz99^*!66Ke!66_$3=9mUnEe0$|NkJ(Yi_D}F5a{f5opPj~GC*^_++auwGX$S*M6pkRD{fnsB(ffDzL14RSqdf=AqFNt4l0-_$QziQ&sbpo?brs39jywM_a7Tr z_3JFKKJkBpO+McO+anVV?EF3~U}7W@{{MgJ0t3VU|BoLqvi$#l^#TK@k8cQrQ&2F7 z2myr;0|Nsoq4@v*|No$n1ks?-1k-;V7Jz6_sDfxv$bx84=z{6jzYIV$D3rnU&PW9i z4GL`#4GM7(4GMJ-4GMV>4GMh_4T=E}4T=R24T=d64T=pgef%icJW#BF_@I~p(V*A? z(V!Rtc@-2(AQ}`?AQ}`~AQ}{7AQ}{FAQ}{NAQ}{VVER#k0*D61BAC8%9LxvBCWsG; zQ4kG^RS*q|Sr841T`>LQAXq&pmO*?_OoM1pY=dY}jDu)Utb=G!%!6o9?1N}f3INfd QQ~;uBmlC*~f3;c^6IUH`rDk6d3FhuRXA9>*5W& ze{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9pO(RK zNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^Q%nCM?U~^U=HHHOu-LD) z!M&VwgZrI&1&bM}F;DbS+tMY=N zfJ+9!s;mn_47M1AvOHf9CNRw)>>Z0j_=gIEh_lZWA}>T4M6Erc5WTZ(Lrm`~h1i)9 z8{%?%6yhtbHY9|tSdbVgvmwc>YeBNbzYQs3ISW!H9&AYc=C>f7@vlMpHG>5i5APdf zZWCINb?~4;_I!PXoP~=Ga_a>Z@)}zW^5Z@$6l5*jP-u5mp~$OwL$Ta;g%YjQ4W;at z7nE_iZzy}dbwT+n%?%aDr!S~H#l4|wdF6uY%^C(Z?a>QrCvzFprQ0s3FM4CZ$V4P$ zVMc;XNNi+rBH91{AHKlA@c;ku0}L$x|6jep$npRG;|Cz}>IDWCXWtM8#~=_64gsY< zD8`Xe*%%lYKp3Q|49XV#|NsC0qB$#kKr|@Tf@o061<|0?3!*_O7))O&FaXh@lnkb~ zF5Up5K`9zUgHkn!2BmBe4NBc08kE98G$@sWXi!QA(V)~0qCqJhM1xX2hz6y6F#S&p zY#%5GfcT(X0HQ%T0Yrmx1DJl-b^t_!as`;)@D|JmvfoO290x^0_96*5#%3UBD zl*2$YD3^g~P)-BUpxg$gKa?#1(V$!hrY}T*`Jmhf;)8M^hz8|C5Dm(SAR3e#K{O~w zf@n~#1k-ow6+kp7cYX#k=@B?5>Bl?q_`n;$s*K&1nS4=N!*G^msS z(V&t7M1x8T5Dh9ZKs2b-0MVe514M&L4-gG1K|nO96amqok_1G9N)r$bDp5c*s8j*b zpppedgGv`L{d_CfJ)lws#0Ql$AR1KKfM`&O1EN8t4u}SoJRllW`haLq2?U}cr4Ta{ zagdb-2{I$Gk;RE*|Nno|1XK(iz5ptQjvrv)02f9);KGOp#Ae{|@eN_XQ6Moea5)Br b7&`_9hv@hk8t5778R#46_!{dOgBV-@X9~Ad diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Catamarca b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Catamarca deleted file mode 100644 index e46272f251a7c9b6edc7b384e7116e48719069ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1936 zcmWHE%1kq2zyNFv3=AL)k|>9=g%(ZfH`rDk6d3FhuRXA9>*5W& ze{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9pO(RK zNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QVY++ejp>%nCM?U~^U=HHHOu-LD) z!D07D1Ba{J2i(g!H@M%aSMYeDyTNl$qJq~6{tezsYZv$||G2@oHGY9#`{fP(sg4T* z3O*PFx+*US3bZ2x)vl`{M(Qsma`yL;=zX0Z+;8X8UGrj zUo%*c@$kMu<~E@PSqBdqWY5=E$XU49Ah%vnA+NF3AV2Q2LP6HT4TW}B6^gu?Hx$cl zS18d+-B8MYc|jSM`-ZaTTNjkS(%evSeENdQQ`{S>mRByQ-mGCz(;mH`b~2YiUApap z`l2@mj7&sA7G?-!1<_0_tPmc#0f@YM0VHz# z00XbHZwP~95C{i{Foc6xpi~LNI1(^B0|NsHgOpW3*<%0y|Nmb!XT1)H1|?(%=_>^WAR3gw!SvR}8$dKDp@V2pVh7Qn1P`J?i5^6Q5lACx&jG$@0BXiz2r)9>02fM`%=0n;1ag886K z1LA`+4u}S29xy%s8(1Eci9mc%Mgr5%=7aqM%1|IaC{uxGP{sn$pv(oLK^Y80gEAS2 z24yr54bE&JMvsXDD3C#!4n%`89*72IJ`fGcfFK%_3BmM-vIQU-lo`SFg$OVolqo@c zP{st&pv(!PK^YW8gEA?I24z$b4a%%w`YQJU5Dm(-VERtI0*D4>UJwn+z#tlwi9s|d zBZFvAW(Luq3=N_|nHofcGB$_?Wo{4+%HSXxl*vIfD5HaDP-X|wpbQV9L75&*zheR0 z56b)?KBxcy(V#*AM1u+f5Dh8}Ks2a80MVdA0Yrle1`rJ@96&UvfB?~;LIOmC3JMSn zDl9-WsK5Zxph5#ofAa%}C#diM@j(R$hz1oRAR1JVfM`%*0-`|$3Wx?3Dj*tEuz+Y# z;R2#T1q_G=6*3?iRM3EEP+y4}A`Y^$Kp-24W@crB@W>_q|34H0Dy0s? z$|MeOS;Ye`t9U?c1`co;Cg|fE!hpZLVqoBM3<@!J3@ijEiGt@KCH_-7l)-wh% FxB&4n$yERV diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/ComodRivadavia b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/ComodRivadavia deleted file mode 100644 index e46272f251a7c9b6edc7b384e7116e48719069ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1936 zcmWHE%1kq2zyNFv3=AL)k|>9=g%(ZfH`rDk6d3FhuRXA9>*5W& ze{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9pO(RK zNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QVY++ejp>%nCM?U~^U=HHHOu-LD) z!D07D1Ba{J2i(g!H@M%aSMYeDyTNl$qJq~6{tezsYZv$||G2@oHGY9#`{fP(sg4T* z3O*PFx+*US3bZ2x)vl`{M(Qsma`yL;=zX0Z+;8X8UGrj zUo%*c@$kMu<~E@PSqBdqWY5=E$XU49Ah%vnA+NF3AV2Q2LP6HT4TW}B6^gu?Hx$cl zS18d+-B8MYc|jSM`-ZaTTNjkS(%evSeENdQQ`{S>mRByQ-mGCz(;mH`b~2YiUApap z`l2@mj7&sA7G?-!1<_0_tPmc#0f@YM0VHz# z00XbHZwP~95C{i{Foc6xpi~LNI1(^B0|NsHgOpW3*<%0y|Nmb!XT1)H1|?(%=_>^WAR3gw!SvR}8$dKDp@V2pVh7Qn1P`J?i5^6Q5lACx&jG$@0BXiz2r)9>02fM`%=0n;1ag886K z1LA`+4u}S29xy%s8(1Eci9mc%Mgr5%=7aqM%1|IaC{uxGP{sn$pv(oLK^Y80gEAS2 z24yr54bE&JMvsXDD3C#!4n%`89*72IJ`fGcfFK%_3BmM-vIQU-lo`SFg$OVolqo@c zP{st&pv(!PK^YW8gEA?I24z$b4a%%w`YQJU5Dm(-VERtI0*D4>UJwn+z#tlwi9s|d zBZFvAW(Luq3=N_|nHofcGB$_?Wo{4+%HSXxl*vIfD5HaDP-X|wpbQV9L75&*zheR0 z56b)?KBxcy(V#*AM1u+f5Dh8}Ks2a80MVdA0Yrle1`rJ@96&UvfB?~;LIOmC3JMSn zDl9-WsK5Zxph5#ofAa%}C#diM@j(R$hz1oRAR1JVfM`%*0-`|$3Wx?3Dj*tEuz+Y# z;R2#T1q_G=6*3?iRM3EEP+y4}A`Y^$Kp-24W@crB@W>_q|34H0Dy0s? z$|MeOS;Ye`t9U?c1`co;Cg|fE!hpZLVqoBM3<@!J3@ijEiGt@KCH_-7l)-wh% FxB&4n$yERV diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Cordoba b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Cordoba deleted file mode 100644 index 1a335d43688394d001fbe287999c9bbf1fc1e1fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1908 zcmWHE%1kq2zyNFv3=AL)k|>3;g%(ZfH`rDk6d3FhuRXA9>*5W& ze{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9pO(RK zNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QVY++ejp>%nCM?U~^U=HHHOu-LD) z!M&VwgZrI&1&bM}F;DbS+tMY=N zfJ+9!s;mn_47M1AvOHf9CNRw)>>Z0j_=gIEh_lZWA}>T4M6Erc5WTZ(Lrm`~h1i)9 z8{%?%6yhtbHY9|tSdbVgvmwc>YeBNbzYQs3ISW!H9&AYc=C>f7@vlMpHG>5i5APdf zZWCINb?~4;_I!PXoP~=Ga_a>Z@)}zW^5Z@$6l5*jP-u5mp~$OwL$Ta;g%YjQ4W;at z7nE_iZzy}dbwT+n%?%aDr!S~H#l4|wdF6uY%^C(Z?a>QrCvzFprQ0s3FM4CZ$V4P$ zVTM3f5X}T(lS}^pfA|6e!~g%s4=}L&|9|xYBgg;$j~{@@s~12b#}6>@I{St&I0k`m za0o*@fM`(G0MqZ<4uEJ-76H>6-h%m{tODYLvI~d?Wf?F% z{~K5ylyyLSQ1$`S&*p>u1Ik7qJ}4`JXi#hz4a(5Dm(rVERtI0*D4>RS*rzt{@teWkED3+k$9N)&3;B^FKUH`rDk6d3FhuRXA9>*5W& ze{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9pO(RK zNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^Q3P4QHZa!+K>>oVnJf0%!VYht_8^!|2CwE}Y+4J=kauzN&$gLMt$ZKph$dCK1P>{87L!sSOg(9!!4aIWX6-u;HHIFuQ|NkF90FhTOfJBZTVBiId3px9S zFgON*aBv7iIEWSQ7!(`=N|s0%M>wJH;6XGf(SvAE!Uxfy#1EoD8306sG69GN zWdsln$_yYHlp#PgC{uvxe_CMsK$!!?2W1ct4ay`S8kAAM^t-kLAR3fm!1RWpo|8h zL75FigEJh6(PQEO3S>~m1JR(&2ckh45JZDAA&3TLL@@oKYypS{Wk@jn==KH>4a%4x z8k9LfG$@0DXiz2v(V&b9qCuGzM1wLcn7&i50HQ$|7es?HFNg+ZU=R(;#2^}!kwG*l zGlOVQh6d4~Obwzz85=}{GB=0@WpEG;%H$v#l+i&nD6@lTP=*K7?^wY0gEBsd56b)? z8dLy)Xiy;lqCo`#hz1n~AR1I4fM`&m0HQ$!1BeC{4j>v-K!9jaApxR61qFx(6&4^G zRA7MVZ+_tL1Qi@0KB({j(VzkZM1u+u5Dh9wKs2Z@0nwlW1w?}i6%Y+7SU@zWZ~@Vv z0tQ5b3KCVXrO1PXP|GO<7=#E3}SEr02W%% A>;M1& diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/La_Rioja b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/La_Rioja deleted file mode 100644 index 7546d5faf1ecf3284ed7183f06c99543a7e78bc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1950 zcmWHE%1kq2zyNFv3=AL)lBj^Pg%(ZfH`rDk6d3FhuRXA9>*5W& ze{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9pO(RK zNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^Q(!F5OMaILga-ggQ&G9 z6ry*QZHVbzr4TzaVnbYRk3xK<)rN$y6$=t0Wi}+4buCD?__rZNEN4Ng#Dfi~-~1M& zGyXM5zh!404NB!;dh6m1AR3g~K{P1EgJ@8y2hpIE528V-A4G$4 z0EhcluJM~D5rqwcWnniG$_Y_ z=?!ned{E8-@j_AU-HJf$3-S!Ttf|Di9x(vp_T`cY$b74g=Ak zTn3^+ISoXEavO*S=Qt3f$HV~?$e^4DqCvS2M1yi5hz8|C5Dm(SVERMZ0uT+#kzo4l zRxlrwGeLY%?gY~ttia-+TngfYaw>=hgGwY24JwsDG^k_((V)@^M1x8w5DhA&Ks2bN0@0AtikXQx$jSnNY+#C+6+%M= z!D1w_|NlQ20xGT!!wM%3aG}KmF0^<+Yz7W+VJ7I~8^VCU;9_9latsPFb_@y*(eX7j S&@9=B^FKUH`rDk6d3FhuRXA9>*5W& ze{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9pO(RK zNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^Q(!F5OMaILga-ggQ&G96ry*Q zZHVbzr4TzaVnbYRk3xK<)rN$y6$=t0Wi}+4buCD?__rZNEN4Ng#Dfi~-~1M&GyXM5 zzh2N-z4;zG{8Aq6|NsA@ zIh$BOG$?6MC@X+yP<8;(pezBRLD>RCgR%yQ24xR0{Z9*QA1IrE_@Jx;qCwdOM1!&nn10uG z07Qeb4w&BX7R(1_ArK#wjX*RgD}m|x-@x*qECu3&vK5$qHXrOCQ1$}xL0Jq$gR&Wj z24yu64a#mH8kFTgG$`AFXmHj8F?viKK!FU(f*=}{4M8+0D}rcHb_CI&ED5GRlq~?! zpsWd|&mP_YqCr^{M1!&^hz4a<5Dm(%AR3fqK{P1af@o0I1<|1F3!*_;7);-(R{+tV ztPG+-*%?HGvNVVWWor-(%Gw|rl)XVTD2sz=P&NnApsWs}LD?NdgR(q`24#B?4a)i; z8kGG(G^hvw)9+Zo_JfK75Fb<=fM`&W0HQ&~0*D3`4Imm+Jb-9W5doq>#RP~36%`;F zR9t{)P>}(mLB$4$1{ED38dQ9MXiyOXroZ`t!xvPPfcT)|1Vn?16c7z6RzNhUXaUin z;sr#5iWm?LDrP`5sHg$apyCEZgNhsw4Jvj(G^pqS(V*f7M1zVT5DhAZKs2Z*0@Kg8 zg53iul0bY=u>_()MH7ey6;B`;RhI$7220FgRdd46I7XU+0)+GP{ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Rio_Gallegos b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Rio_Gallegos deleted file mode 100644 index d95ae41e2bf37eb960d475fb2f7ec2bc556917a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1936 zcmWHE%1kq2zyNFv3=AL)k|>9=g%(ZfH`rDk6d3FhuRXA9>*5W& ze{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9pO(RK zNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^Q%nCM?U~^U=HHHOu-LD) z!D07D1Ba{J2i(g!H@M%aSMYeDyTNl$qJq~6{tezsYZv$||G2@oHGY9#`{fP(sg4T* z3O*PFx+*US3bZ2x)vl`{M(Qsma`yL;=zX0Z+;8X8UGrj zUo%*c@$kMu<~E@PSqBdqWY5=E$XU49Ah%vnA+NF3AV2Q2LP6HT4TW}B6^gu?Hx$cl zS18d+-B8MYc|jSM`-ZaTTNjkS(%evSeENdQQ`{S>mRByQ-mGCz(;mH`b~2YiUApap z`l2@mj7&sA7G@;K#KMZiLzW?u{r~^r3k(eZ{~tfV!1Dk9)eDRq|NlRJ03xqm0Erww zz`*P58^Yii1j4}~4B;RaC{@BRjs(okz`y{)AY~O$w%Gsw|Nj@w*^~mJL5UeegAz1| z1|@0`4NBNx`bvQThz2EaFuis01`rKO=pY)D*g-TX!GmZ}q6g8Sgb$)Yi62CRG60AM zWdaZl$_OADlo>!YC_{khe_CMsKp6wX2W1Wr4ay)O8k9-E^t-kLAR3fe!1RW~G1JR(22ckil4@849AczKKLNNWIYypS{WkxW4Ap*!MP=N!YL4^*81{FLY8dUgz>E~O)?g14-AU>!d0@0wt z2t4EW0{1_mz2pb%rnpx_W4Uqb^uLp=k1107#uJ!24q F3jo5S$rk_s diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/San_Juan b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/San_Juan deleted file mode 100644 index 37f7b5df5972bae95493f4d5e3735655dde80171..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1950 zcmWHE%1kq2zyNFv3=AL)lBj^Pg%(ZfH`rDk6d3FhuRXA9>*5W& ze{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9pO(RK zNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QZ2x)vl`{M(Qsma`yL;=zX0Z+;8X z8UGrjUo%*c@$kMu<~E@PSqBdqWY5=E$XU49Ah%vnA+NF3AV2Q2LP6HT4TW}B6^gu? zHx$clS18d+-B8MYc|jSM`-ZaTTNjkS(%evSeENdQQ`{S>mRByQ-mGCz(;mH`b~2Yi zUApap`l2@mj7&sA7G?-!1yf8c5E?2779)xM|Nr3&3=IGOA3wmr^8f$U3yd89|37{J zBClQmi5x$`!0YTA!r&ML!oeX7;UE?$X~Hm$RLsu6zyQJ^WtC92*#H0k{};{KxCcao zQZ$GLrD_ljO4%S9l)Az6l>!404NB!;dh6m1AR3g~K{P1EgJ@8y2hpIE528V-A4G$4 z0EhcluJM~D5rqwcWnniG$_Y_ z=?!ned{E8-@j_AU-HJf$3-S!Ttf|Di9x(vp_T`cY$b74g=Ak zTn3^+ISoXEavO*S=Qt3f$HV~?$e^4DqCvS2M1yi5hz8|C5Dm(SVERMZ0uT+#kzo4l zRxlrwGeLY%?gY~ttia-+TngfYaw>=hwucB@l=Pl|o?pIV7Gz zr4fh^Dv>}ms8j;cpppqhgGwh54Jx5PG^msU(V&tFL_g&fhlHI2n`hk zi;=|s|9}4xP;qq_Ryc8h3oRaSp~VAYGjM6d3FhuRXA9>*5W& ze{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9pO(RK zNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QD{QrOT z0wc%&|BoMl$g3AXBF7If@H+d3FgON*aBv7iIEV!ba~Q@EJ?sn&3?K|rW(Q@9{r~^} zf6<)vTR=1@sz5X-x4T@3_ z4T@F}4T@S24T@e64T@qA4T@$E4T@?I4T^3s{Z9*QA1K;Ed{ESbXi)TnXiyRW)9>02 zfM`%s0Mi@Zg885%0pf#_1&9VE4KO|b8(1EcL_mB{G6B=i=7aqMN-iKiD9M0mP_hBh zpriw$LCFV1gOU)41|=g94NgiRMvsXDD3C!(3PgjF6^I5UEf5V#ULYEj#K822vIQU- zl+?iV*{xtcD9M5NpkxQ8H&}tiLCFuq2PHue4N8U}8k7`4G$=WOXi$;_(V%1rrol;* znTa^a$^wCGV2YU)MF0PP@C+zz9)_hv4sZ(P0jE$N5SxJmoN@(yd_x%Ur&0z6F2|q{ GV=e%GFzg)w diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Tucuman b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Tucuman deleted file mode 100644 index 93dc0dc3235f5817cfdaaeb94393243587de96b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1936 zcmWHE%1kq2zyNFv3=AL)k|>9=g%(ZfH`rDk6d3FhuRXA9>*5W& ze{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9pO(RK zNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QVY++ejp>%nCM?U~^U=HHHOu-LD) z!D07D1BcTW9o)+~H@M%aSMYeDyTNl$qJq~6{tezsYZv$||G2@oHGY9#`{fP(sg4T* z3O*PFx+*US3bZ2x)vl`{M(Qsma`yL;=zX0Z+;8X8UGrj zUo%*c@$kMu<~E@PSqBdqWY5=E$XU49Ah%vnA+NF3AV2Q2LP6HT4TW}B6^gu?Hx$cl zS18d+-B8MYc|jSM`-ZaTTNjkS(%evSeENdQQ`{S>mRByQ-mGCz(;mH`b~2YiUApap z`l2@mj7&sA7G?-!1<_0_tPmc#0f@YM0VHz# z00XbHZwP~95C{i{Foc6xpi~LNI1(^B0|NsHgOpW3*<%0y|Nmb!XWbGI4NA-)8kC?x zG$>JnXi&li(^m=%Kr|?UgXyh{H-KnRLI=^H#15iC2_8g)5AJ}7g5Xix?L(V$EMrr)(40MVe#0;V^-1@l3f z2E+$t91so4JYahMH?TY?6M^`kj0C2i%?JAjl%YU;P^JRWpo|5gL759ggEAP124yl3 z4a#UB8l2fcj2;sQP#}Xc9f$^HJP-}ad>|T>0YNk<6N2dvWeY$wC^LfT3lU&GC{u#? zpo|HkL75XogEA8kAYV^y!OW`$3r�O6*eFmRN#PUP@w~&K?M(p1{FSF`uSF{dq9N{hz}}=Ks2Z@ z0@0uX2}FYmB@hiNm_RhBa01bw0t!S!3MpnL;vg#v1hRo>W>z)`k6iNq|3h~`rPN_q znZyAut9Za=6%UBbzyU791buu%81R=@3=CY3K_SMDLBSz9zJ>;RhI$7220FgRdd46I F7XW*|%FF-& diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Ushuaia b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Argentina/Ushuaia deleted file mode 100644 index 5222e4c15e9b6b3172a173be8265b84a22f9dbc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1936 zcmWHE%1kq2zyNFv3=AL)k|>9=g%(ZfH`rDk6d3FhuRXA9>*5W& ze{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9pO(RK zNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^Q%nCM?U~^U=HHHOu-LD) z!C|MLfx}hq1McOV8{F^ID|o!n-Qc+=QNim3{|4`+wF`Wff85~P8o$7={qhF?RL2DY z1s@CoU6mIE1za)+R%KlfVz9*^l;!z?Fo9_XVeeQJ!ar0PM4Wx55P2cWAZqOih3K7S z8)AA_Da6i<*btZ7qYz(dwILyF#e&30nGH#1T?>*e{%uGR%UO^r@nA#hH@^kxjDHQ% zuNf@JczE9+bDPkDtb+#)vghk7O=EK7B#uDeetb%PSXDZ`LrVX^&n|JDJO%F5PxP zebE~OMkXR53o{aAVqrz%AIFuQ|NkF90FhTOfJBZT zVBmH34PkH$0^#5ghHwxIlqz8uM*?PNU|;}Ykg^IWTkQY;|No2TZ0rEhpu`NKK?xc} zgAz4}1|@7TeWkzvM1vAInBKa01BeDCbPx?n>>wJH;6XGf(SvAE!Uxfy#1EoD8306s zG69GNWdsln$_yYHlp( zpo|8h!I=%j=rM5s1u`hpfoM?11JR(&2ckh45JZDAA(;M9wg5zfG9#G25CP_cG9`!) z%9tP;lsQ2(D1(A%P$mV@po|KlL75dyU*$dkqCuG!Oy8+j0MVe#3!*_87(|0IF^C3b zWDpI?%pe++p+Ph#Q-f$w#s<-#%nhPJ85~4|GC7C_Wpoe?%IqK-l;J@%DAR-KcPwE0 zL75-K2NeJy8dL~?Xiz}_qCtfLhz1o1AR1ICfM`&`0HQ&K1BeC{5Fi>?yc zg$0NP6&N5IRA_+dZ+_tL1Qi}2KBxcz(V#*EM1u+v5Dh9!Ks2a80nwmB1w?}i77z_8 zTtGCafC15kg9;uH4Jv%V^z*G?_kao^5FbV1r&&e6jIDg#6eaTB*@IlhQvdbA(H+7|NbAKQtB|Q zOyU5SRXpIbiU-7I-~g9lf4EW0{1_mz2pb%rnpx_W4Uqb^uLp=k1107#uJ!24q F3jnwD$jkr$ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Aruba b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Aruba deleted file mode 100644 index 73bb7eaa81662d3d6a36c187d6be8a4dce232161..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmWHE%1kq2zyQn)3=AL)l3;?ec_z#0TYQ`G#)FaR|Nng+3=IGOAK1ab^8f$w0}LEK nz99^bejyBw!66_$3=9mUnEe0$|NkJmVUUpClX5XOf65*g?Vr`)6XzidT znzuonZNG#1w?zgT@46f`H+XE&I=}aT_D)U%oz<%ybPISk==Iz?pzr@~gF&844e8*Bi{gT{&QJ@azW5YugT3EnL6BdjDkyoAuia zYzrqGu~*C!6CoOz_IY1gOl-^4bFiV99)F^Hn?%3nTVrhCH!JLbe~hR>Ky$G}p!IiypyW`8VCkC%AwA%f|*L&TAt8zLXwb%Bbo(dp90P;dL-b)lNQ;`c}yxU8KPw{VaQ zk_07m5DiM~AR3h5K{P1QgJ@8~2hpI!528UC07Qc_0f+`=1P~3%3?LemAwV=JQ-Ekt z#sJZv%mJc783aUwG6|Ue)!+c4L74?agE9<=24xx$4aztm8kBiJG$;dsXiz2s(V&b3 zqCuGnM1wLEhz4aU5Dm&$AR3gpKr|?WfoM=B1JR(22ByC)G62z_3&eV~jA;)60P zhz4a?5Dm(-AR3f$K{P1yf@n|%2GO8Q45C398AO9JGl&LdXb=s`)F2v^u|YH_bAxD5 z1_#lgOb((!868Z2F4zE~K^Y!QUk(EEK^Y&!2W5T`4JrUYG^h{&(V&6=M1u+g5Dh92 zKs2aO0MVd=0Yrle2M`S^AV4&zkO0x3f&xtc-VF{9P=NvBg9;504JtUm^pTxl_kaoz z5Fb>CfM`%b0-`~M35W(2C?FbCsDNlt!2+T|g$sxV6)+$gRLFp6P(cHtL4^&71{FA9 z`mGY!J)nXI#0M2VAR1HvfoM=61foF&5r_sAMj#qgAc1I5p#-8q1rvw{6;2=;R6v1f zP$31PK?N0v1{GEy8dP9`>3_??_Jay85Fb={foMEWHWFQ(;n1N_efd-;M zg&K$k6>K0HRJeg?NCC&p#4?Z&R>Gb904m##A7J1Bmvdl}k;lh3gaK<=$H2f95E)_; a5E&ez<7;T3XRK$SZ=mCAtY-vbZ~*|n^#%0+ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Atikokan b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Atikokan deleted file mode 100644 index c63a32a2a171ec749221a5dfdb2b64c61cc89285..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 319 zcmWHE%1kq2zyPca3=AL)l3;_fMds~T*f9TqeZh$z;R&ZZ{xw`u{!(x$k@EusBLfpN z%m4p7H!w2%|G#vJAq>vpAq>s|Aq=j;At19EAp{OrfNTa~ zkRo;l1_lsY;{X5u|BK$Wq=0CUi$FBURUjJVG7t@N9f$_G5KJd>eqdr`Vq|7v{r`WJ p3)AmZa2!hplU3}6>CFfwqt28Wn(0RXw2ZqEP! diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Atka b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Atka deleted file mode 100644 index 391ec98ec0f31cd595ed05a9b91a41c4cdb25d31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2353 zcmWHE%1kq2zyKT!3=AL)lIVxBl}~rNT)3qCrQlLxfWxm#p&S0~C=B?&BE*4VMsNUQ zhnWLYg=qkDVbB4V#J~%zfhGso9E~rq8;TuZ@6ElyDe&U}=h~M6Tpw;7;C^uP0?*Cw z4!j3;U*Ow$(}92GjR1j}yB!2OcLfMl&UFyZoD(1tS??g~Sr;H?ndl&{nGhhMRC_>@ z(r+@>}kBm3STrxT!dq{MH+$NC&@(aIjP$+YEP;9)pK`BhrK{@N2 zfr=TogR0jJ12xgN4(eLF4AlQ~9?;~PW1xBO^#QF{bq3n|&K}UYJZppQy!8k4HrH&> zubX(lU~=3B!}N6yM#T;rjNKav9`M_ivB5uP@_~S9UK;{!N)H5; z>1+s=2|o}L#Apc zP-bywL)m@y0~HecHdO3;d7$#gf(=#kP9Lbg(X^qaZta2E9Vr{?;`$HN&v4to$i%?R zf)BE?v(XX$|DPJb!0`WnaRMU?nB)M9@POF@Ad*4k|Nq7UMoBPR&M!EG!7n_7!7m_$ z!6`U|!O10r!O;#9l>#6dR1$z_P-y_7K_vo+29*jR8dNfXXi(_@qCq7Dhz6AsAR1Is zfM`%@0jB?Rg6#v98X!KX_h9=#r51<}D!D*3 zsPqEUn>T~yL8Tao4=Tw(G^jKK(V!9yM1x8-5DhBXKs2ay1JR%o4n%`WIS>sh=|D87 zv;)(BEWzOqD)m5oP{{|PL8Tv!>1<{~V6-0wdRuBy;T|qRcgay%{QWivmN?H&NDs4eDsKf=)pi&o1|5pW@4=Q~@ zd{7AtqCurFnBMmiEDtJ;L3~h&45C4$GKdD1%pe+6I)i9X2@Rqlr8F}O6Du1&$j-?@ zN65gi`XQ*Cj!FWNsR0b|(z-Z-kq2C6gG*~h5pX#z0WPy;!E7ZT-w+0(%56l+4P$Y6 cI0lCp8h{FS9baQTBRvBhUqeGZLp=j70DftCkN^Mx diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Bahia b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Bahia deleted file mode 100644 index 34b2d7a304b984060f5cf032d6d789b32098bfb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 994 zcmWHE%1kq2zyQn)3=AL)lCXxdd8e()mf6AY`C!LihXp%7ni%Z5SE6vsVx7UQ*S`$z zNIu+fXJ@3s-QS`H_h#QyxPNz+!GjQEg)h_pZ}`d@r||7Sioth2xdlH0bqszSKdSJH z>(Yi_D}F5a{f5opPj~GC*^_++auwGX$S*M6pkRD{fnsB(ffDzL1gZ5DkhKFugNU0Yro12SkJ72ti#V?2k#W9Em#WRQo#Wjcq#W$FKRG*r# diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Barbados b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Barbados deleted file mode 100644 index 63ca138ee46998bf4ee62b00024430ea16c7b060..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 330 zcmWHE%1kq2zyK@^3=AL)lHh`}1y)w7JlWBj{DhC;(*wRKJs0?=GdvI|$-5v}_UM67 zNWcZ*`2Pta26h3A%uG=D|NjXY1_m(6^8f$U3yd89{~tfVz~kc^!r(Yi_D}F5a{f5opPj~GC*^_++auwGX$S*M6pkRD{fnsB(ffDzL1x$>1;Q#-ZdKeh~ z|9|{|k>&sYs}~qJeSAY0oPvTuLQy zYY+|cIhcO^%K$`!LI6zfj8p*8ppXF3pwIx(pb!DkpilwPppXI4pwI!)pb!GlpilzQ zppXL7$B%-|1BDof4+=F94GK9B4GKMwS3w~NqCueuqCp`EqCuevqCp`FqNx+ATuwnD G##{hE-1&k4 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Belize b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Belize deleted file mode 100644 index a18cd39058fa03214b8c2af911a08bb3c9ed4ea8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 962 zcmWHE%1kq2zyK@^3=AL)k}!v|1t-Vd+%SK>^@9bjfj1V`%RX47mlv@(?*D@&d;t+l z?H)c@`pzg~x%$6^<>y2qR`(ay0PZ?l7zKoUv8{h-j=XF?AnbD z?HLIh&34?_RM7HZv)HT~TLRJ^Z24AmW1E4;gKhU`M(hyKdaz@Eb;QmOJP&rwkB!)U zQ!`;ty?w;qo!klg;uRzI&v=_~z@9ncV8!`_LmKio4o7TEIKshr i4TuJ%9Z*Dq(hr#4c_9EqgVGV0rej*-at;nL;{pI}AnDWq diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Blanc-Sablon b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Blanc-Sablon deleted file mode 100644 index 8526259c7a5a657160dc9abc7389044365b3c6b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmWHE%1kq2zyK@^3=AL)l3<0h1?KH&O_+Z`IpB21ql8P!UkWZIyuHA{$i&R}|Nqqs zj12$(A3wmr0%mi7NghX+5C+HK5C+Ha5C+G95RhSv3=9m6I4lKO1i~P7YzzzxAhyW= z|NsBT*;?{|XpjRyG{_Mk8srcV4RQ>aPI!BPiIIt!h3WtQQzZ-xU{|n!-34_KSVX|b VH-rI;+ZaHOV_@WR3=T2j0sxWVUHt$6 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Boa_Vista b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Boa_Vista deleted file mode 100644 index cb15afbf5c30b621cca99a112062791449a959e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 630 zcmWHE%1kq2zyQn)3=AL)l2C-Qd8e(af3Sl;{KJmFej9dvbaL2rugTz+#U6)SZ#W$8 zNWMRCXJ@*>-QUU%_h!E_xPNzr!-EhRt`UoUpDx~ z_29s-m24Y+zY%fx)7`y6_T(G~xr(P7%M4p{7%Y+!l+ zql4v3*$qsL1mOSw#}ybD{{O#vfsy6^|KkT3IDLFW7#w|rK|~11KMV{Er1<*(|Ns9% zJ_pet--GGDej7kEC=@_6C?r5MC^W$I8x98$4GI-7y))eaM1w*HM1w*IM1w*JM1w*K zM1w*LM1w*MM1w*NM1w*OM1w*POdr1tHV+hvAU-H0K{O~dK{O~tL0$!gDu@P!EQkh$ oE{Fz&Fo*_)GKdC+G>8U;Hi!m=IEV&?I+&(f$a6XRhL~^x02fsX{r~^~ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Bogota b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Bogota deleted file mode 100644 index 9df037ee3c442c8b0a1cab29b0c5e45c30864826..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231 zcmWHE%1kq2zyQn)3=AL)k^s>l%sV3@v_y-!I6!+}tOFAx)BpdwdKeh~|37|!k>&sY zof{Z9oqR(Woc)7ALyq*&FkYE!hpqk1_mx?{}59y025m_3jhEB diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Boise b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Boise deleted file mode 100644 index 441afe55c4130c024b3375695f6137a0334c65bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2377 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 b7&`_9hv@hk8t5778R#46_!{dOgBV-@X9~Ad diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Cambridge_Bay b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Cambridge_Bay deleted file mode 100644 index 9aa642b954e73ae10d828b43caca72d99410399b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2052 zcmWHE%1kq2zyO>K3=AL)lBkBVRTq9b+i<#*XTl}rF9nwpB^bWzM-}|gX#F6ZnIa$( z>CPbP=_Vj%smUO&sUaYt=G2!r;% z#S?Tc7c}V3Yn`CCIjBLuE`5T*WRnKN^cDf5VzCBe_cQ^MpdSsU>K+1SMz$56Sl`~wV6%a1g6;0P40io*CfLueXK=_rH^H%Gc7v1u zh6&CowGA%%lP0*j#5cHpJ}Tg@Tf^XfdAWcmZybZ?=1u{xw+;;6bCyoHW5A2L-q>Hq)#|NlXG07QfG0f+|W1u&f`!2qH`c>+X(@&(8$P~HI1B9ZPO3YBgYp@O2IVyn4a#p|`rm!9eV}{?;)C)Yhz8|95Dm(MAR3ep zK{O~Yf@n~F1ks>838F#y5=4XYCWr>*PY?~tqaYfTPeC*&uYzb$eg)B>JPV>h`4&t+ z`v;=H`4_|hz#Xi(k;(V+YdqCt5aM1%4ahz6AzVEPX~I37S{2Z#?UKR`673<1+e`M~yr$`TMC zRGxrnP?-XvLFEdF29+%!8dSc3XiymgqCw>hhz6B4AR1KOfM`&e1EN9Y4u}SoJz)B6 z8Q49bG6=*6l|vvJR2G5hwN_wxP?-ecgUTfk4Jw;JG^l(6(V#L4M1#sH5DhA;Ks2bl z0?|eJTR;@J+yXH`Wfz$K_Zw_Js0;(~LFE{T29;%Cdf$GqJg7_q@j>Mphz6ByAR1J@ qfoM<}2ckjc9EcuCWgVAqaEQ6DONfrIv7V8hfsU`Cp`M|h0T%$?90KP6 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Campo_Grande b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Campo_Grande deleted file mode 100644 index 4d95b68a8df1d313cade59eeff2dbe205e936470..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1983 zcmWHE%1kq2zyQn)3=AL)l4yXkd8e(aGTFf&{$a;ozYRM-IyvmR*JNd$Zpd+`qfR;X#O_!Iv4l2fniA7<@ZWF(YjdvcD0T*cE3@(Y{~C>Y<}px9XMpu~M`gK~u20p&+^2C5be z2UM?IHBeWSbx_~?af2qqe+SJeGYzy}NgvS8cG#eE;IM;k+9dmZqvpG14|21$9yx`#c{l0;#Z{h*h2fsJC3r=xx-@e$u z<71hF=k!(suZs~5-VF;k_-wRt@J(pm;5Sjm!QUZuLqL_qfj|ZK4M9;-2Z9+iH-uRJ zIS}%IdqbGyy#rw$3y*`i|WonSub@o8MmAFAc@hgWy$)5&A!Dk$be%>}HF<$3Ta&xaineYUMvO_mF zlz%RAs93anL*?ZVhpMKz8>;sd9H>dE-%vXz=s=xQ;)ePflLJhQ0}KEEKXZnG;s5`u z7Z_Ro|37|!fz!t~gu&4_7(|4Ck}3lO11Smm|NsC0L5UhfgAz8F{_D2^M1vAIhz2Ec z5DiM`VEPS*1BeDCcrd*)-2g;`5u=_@GPzqCpu2M1wL5$g7|X1EN8h21J804u}S29uN)6Kp+~Fi9j?c zBZ28hbp{|Bl%c@%m8)PrC}V;6pv(oLK^Y88Pnijp2W2!6AC%cZG$_M?Xi%mD(V&b6 zqCuGtM1wLQhz4as5Dm(RAR3ezK{O~sg6SXU!RCW9CWsHpoFE#MK|wSqlY(eaMg`HJ z%nG7G85Tr?GA)P(Wn2&q%Df;Nlz~AsC=-KdP(}vPpv(-SK^YoMf4>j5AC$2{d{E{F z(Vz?trnfH!%Y!mHh!4u_AR3h6K{P1SgJ@932hpI+528T@0Eh+^0w6k|%HjZs1{DS% z8dM;FXi%X5qC+hIfaO7j1BeeQAi(rV4Y2*;KM#QAL4^fK98_R{Xi%X6qCo`*hz1oN zAR1JFfM`%50-`|$35W(2CLkJApnzylp#q{o1q+z|IAH^b1{E-1`eG574=QLtd{AKn zqCo`?hz1opAR1KgfM`(R1EN6%5Qxr=G6lOIR1ksqpuz}5g9;=NT`2hzEDtJ}KzvZ) z1foF&6qvrb7c37ds6c#BVFjW=1r~?~6C}D*XE@ssAv&ud z;=%fc$ged8Q3obAL|=_7h*`OgA$F@nL0snqhWM#U1qqo&42gAiACf#n7?R@@KBQ=x zF{IiteMl1uYDkxT@*(|`NkhipV;?dvi8W;1UGX7%}O zL0e}*Vbo2AqO|OSVyoQ@C2qb2rBZVl%Jefol>Mq_sNnbhP;o1fq4K@%hpJu94AtlP zKh!LaZ>U}O@k3p+V?%x4}@7%z^ z10op(e0)O~oP$FcTwOvKT!TXxoLxdd5e~(qB#r<7|NjRi50F++5&_YmWCEf=Nd-iM zk_(6iB^eM6N;Y8n2txvh1|=U54N5{F8kCH{^s|2;3Y?rk3{a8+(V%1nqCrUuM1ztS zhz2Dw5DiLZAR3g^Kr|@1foM>Y1JR&l2ckhq4@85KABYAeK@bf}hG6ba54okKuHxugOV$V1|?Y#4NA5k8kBTFG${FkXiyRc z(V%1uqCrU+M1ztun0~On0Yrn6HHZc!Z4eDg-XI#3#6dJDnS*FhQU}qXwxiP*woZpzHvqKbe5-2W1NoACxsfG$?z3Xiydb(V%Ps zqCr^&M1!&mhz4aD5Dm&UAR3f)Kr|@(fM`$_0@0vs1foG%2}Fak6PW&052C=?3d8_q zEf5XLULYEj#XvMDn}KLhRs+$X>;|GiSq?-G(rm}&92{ci>=L5mYoceUXQ1P2XrO1R HXTSvja{qpE diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Caracas b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Caracas deleted file mode 100644 index a2144137a2543e15645cf95de96b92a36f08205a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmWHE%1kq2zyQn)3=AL)k^s>l%rRL`$L8CNHy-ZMlL{D_82|r2=)%D8|Nns<3@rcu zA3wmr;_Ms35at>J(!{{PfWv4O1_lNY2B`wkAk6ds|NsA)?NSaP8e|QK23ZAC1hI~p o>Hq(O4j}sux`6CEu!DgEY%7P4ZwLdb%?u1&VXh%2R>lTg0A_AERR910 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Catamarca b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Catamarca deleted file mode 100644 index e46272f251a7c9b6edc7b384e7116e48719069ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1936 zcmWHE%1kq2zyNFv3=AL)k|>9=g%(ZfH`rDk6d3FhuRXA9>*5W& ze{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9pO(RK zNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QVY++ejp>%nCM?U~^U=HHHOu-LD) z!D07D1Ba{J2i(g!H@M%aSMYeDyTNl$qJq~6{tezsYZv$||G2@oHGY9#`{fP(sg4T* z3O*PFx+*US3bZ2x)vl`{M(Qsma`yL;=zX0Z+;8X8UGrj zUo%*c@$kMu<~E@PSqBdqWY5=E$XU49Ah%vnA+NF3AV2Q2LP6HT4TW}B6^gu?Hx$cl zS18d+-B8MYc|jSM`-ZaTTNjkS(%evSeENdQQ`{S>mRByQ-mGCz(;mH`b~2YiUApap z`l2@mj7&sA7G?-!1<_0_tPmc#0f@YM0VHz# z00XbHZwP~95C{i{Foc6xpi~LNI1(^B0|NsHgOpW3*<%0y|Nmb!XT1)H1|?(%=_>^WAR3gw!SvR}8$dKDp@V2pVh7Qn1P`J?i5^6Q5lACx&jG$@0BXiz2r)9>02fM`%=0n;1ag886K z1LA`+4u}S29xy%s8(1Eci9mc%Mgr5%=7aqM%1|IaC{uxGP{sn$pv(oLK^Y80gEAS2 z24yr54bE&JMvsXDD3C#!4n%`89*72IJ`fGcfFK%_3BmM-vIQU-lo`SFg$OVolqo@c zP{st&pv(!PK^YW8gEA?I24z$b4a%%w`YQJU5Dm(-VERtI0*D4>UJwn+z#tlwi9s|d zBZFvAW(Luq3=N_|nHofcGB$_?Wo{4+%HSXxl*vIfD5HaDP-X|wpbQV9L75&*zheR0 z56b)?KBxcy(V#*AM1u+f5Dh8}Ks2a80MVdA0Yrle1`rJ@96&UvfB?~;LIOmC3JMSn zDl9-WsK5Zxph5#ofAa%}C#diM@j(R$hz1oRAR1JVfM`%*0-`|$3Wx?3Dj*tEuz+Y# z;R2#T1q_G=6*3?iRM3EEP+y4}A`Y^$Kp-24W@crB@W>_q|34H0Dy0s? z$|MeOS;Ye`t9U?c1`co;Cg|fE!hpZLVqoBM3<@!J3@ijEiGt@KCH_-7l)-wh% FxB&4n$yERV diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Cayenne b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Cayenne deleted file mode 100644 index 7109a98ec5cecf1c930240d6d67aedc82548a9cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186 zcmWHE%1kq2zyQn)3=AL)l3;?eIVOJ5p78sy=>bNj|NqZ@U|{(F|M&q0mjC~+USMGH j@eN^ccMAcjXJB9;#nk`*|NjS>45EoMoy*-V#Fz^Jp6f6L diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Cayman b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Cayman deleted file mode 100644 index a4095d38633409baf9fb0cdafddffde48851d554..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177 zcmWHE%1kq2zyM4P3=AL)l3;|gIVSUOWnldOe+L5t!~g#~H!!ex`-U*M28VzYG2k$W znSp@;gh6UR27=f;|NsC0pV_W{21J7mW%~br^A?b)I~W*Pz-Dv!_=Yebo6o?&SQd<_d{-7Z*kx`bhI^Y;%+TrV{& zO}_bIS@2DU<)YIIRv7PQSn+T3hgHIJ8CKn!`eF6wdWJRo%0H~VoXD_lUgU@Mo1Gap z)LDPnI48bgQ+hwmKm6qPYWT&G z{^8e;bcWwAJU{%o;mPp#g!YGjJG2@8ui*W_FoTzYvHkrArt6rNH}Krt@PYS0X#?NRNgw!EPGS(4S@J=! zvxGsYGVFtJW*CD=q{RnOPYVVyOQ{dynoSqpisuopxC&uKq>SigL2m14=SdY8C1RIe^3+M%Al^*_(A>O#Rg5T zmnNrCaV<~rk61o6>}6AyGJmX1idOS zRkva=GdfdX&Mw1XA^qZm#j}45mcLJZusZgD!TR=^4>s%nG}!L$`(W39ufcwH!3T%@ z0}YNXy#-GGiyE9$@(Wz_TN+$l0t;L}Z)b4V&Hdnhc_xD=um10K13~f#1MUN#)p`eBMhV z-nNERciV#0w;2uT>hcBYXT2IS*%=Em*XlH6J$qb`JgdCuC$?chfYCVTzEtM488&eM#7K@Newd#5{IzX!KC8<|D78c8UFuYy?}uQ#Ae_C zk&HZGQoz|IguyvDguyj9guyvHguyu=1XQRoFoH-%9K|0S0|NsHgVel%vL*ii|NlRZ z`QHK%4JryjG^jWP(V!v`M1zV&5Dh9CK{Tj%1ks=(5=4WFNe~SxDnT@;xCGIlA`?vi z+x!7UgNjZteQzq54=O@Id{8k8qCrI|hz1p>AR1Jpf@n~&3Zg+pD~JXauOJ#!#DZv0 zF$N8dP+H=^v?J`#?oFhz}~p zK{Ti+2hpJ7984#2g2M?^tb_QVq8&toigyqVD&j#jsF(-QprRf`gNl1F{a_+kKd9IT z@j*pDhz1q^AR1H!fM`%P0HQ%v0f+`w2Ot_$C4gv9wE&_)RRf3yRSzHpehDLgQ^)24XSEDG^n}((V!{^M1!gw5Dlt&!1RxF1`z%Gg(uiOplS%j z|9e6k%>M_fjz9vSDhZTZX7GYYaMc82fT|}D4XUC*G^m;a(V(gdM1!g;5Y29Ip#V(x zsyBdWPJvBeKB)Qv@j+D>hz3<-AR1JafoM>52BJY#8i)o}Yakj_wSj0*^#-CrRUC*0 zRdXO3RMmlKP<02QK~)}z2330?8dUXxXi)VBqCr(4nEoUIb|0uJ1o1)DA&3T5i69zO zErMuJ)d-?N)gy=oRgoYXR84|tP*n+{LDeOQ2346L8dPn9Xi(J&rvF_8+Xt#bL3~g( z3Zg+(DToGDryv?srGjWswF;s^RV#=FRj(i#RKeia%?}U_YJ!02e{aF&gPI~BKBzeYqCrg(FuiXhSRT|g z0r5f26A%q*qJU^nGX+G0nkpa~)La44pe73wBN31pNev4t5{DSggGbH(|7))>Fo0Vq zEZ~+4xXr=-Ak7yBMlR>z5Hn|&5FKA*JtI8>9bZF3JwrVME&zQG BX;}aO diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Chihuahua b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Chihuahua deleted file mode 100644 index 8758bab11149e8e079224ee7cbfa4ecd03dbfe7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1492 zcmWHE%1kq2zyPca3=AL)l8Az`MV4-RQLz3~-h*vvVF}xvFD2~YF-zF-x9x*rdKrUJ zF-L*1djx|?(5nJdbq@hEqgxH;>{S{4TX3Q2*0o@We!iKY{Ra!xP=JBm*T@ma+Xs_=6{ zm`)EvIK%A;5uz&^A|C9W5c##MA?m>V3DH+`8e&%N5s2OD*AUk^PauA(K|?}jgFs@P zFGG@Nl0b5tK0}J8i$JQKAVZo^!i03$&kX6GoF-)ay~>bzNo7LT-R%t7o7g7g9J}0* zJMqPYyk%P(@(WK*C}^ABP#E=GpeU`fq1fuAK#5y)L#fnifinFHhO%G10u}sG3>CNX z1uEa$FjVad6sSHg$5694cS7xY28Oz3{|WVdj~E!4K#-Y>gRn~ogRe^nDE^_Cl$7%S|NsA>)B>VG zDF#G?QVoa(r5q3qNrGaQrY6H=r6bGU~sSZSgQXYr~r9Kc1N`W96lnOyKC?$euP-+CxpcDzB zL8%f%gHk4l2Bl6A4N9S4`o~1D{h*Wz;)7Bvhz6xt5DiMTAR3f%K{P1!f@n|*2GO8Y z45C3P8AO9pGl&MIXb=rb)gT&_vOzQ`b%SV73J1}kR1Ts+DIH8d*gFA4gHk+*2Bmrs z4NCbS8kG7$G$;pvXizQy(V(0FqCvRgK`>}{?!YP4^WN+@jvJAq>vpAq>s|Aq=j;At19EAp{OrfNTa~ zkRo;l1_lsY;{X5u|BK$Wq=0CUi$FBURUjJVG7t@N9f$_G5KJd>eqdr`Vq|7v{r`WJ p3)AmZa2!hplU3}6>CFfwqt28Wn(0RXw2ZqEP! diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Cordoba b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Cordoba deleted file mode 100644 index 1a335d43688394d001fbe287999c9bbf1fc1e1fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1908 zcmWHE%1kq2zyNFv3=AL)k|>3;g%(ZfH`rDk6d3FhuRXA9>*5W& ze{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9pO(RK zNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QVY++ejp>%nCM?U~^U=HHHOu-LD) z!M&VwgZrI&1&bM}F;DbS+tMY=N zfJ+9!s;mn_47M1AvOHf9CNRw)>>Z0j_=gIEh_lZWA}>T4M6Erc5WTZ(Lrm`~h1i)9 z8{%?%6yhtbHY9|tSdbVgvmwc>YeBNbzYQs3ISW!H9&AYc=C>f7@vlMpHG>5i5APdf zZWCINb?~4;_I!PXoP~=Ga_a>Z@)}zW^5Z@$6l5*jP-u5mp~$OwL$Ta;g%YjQ4W;at z7nE_iZzy}dbwT+n%?%aDr!S~H#l4|wdF6uY%^C(Z?a>QrCvzFprQ0s3FM4CZ$V4P$ zVTM3f5X}T(lS}^pfA|6e!~g%s4=}L&|9|xYBgg;$j~{@@s~12b#}6>@I{St&I0k`m za0o*@fM`(G0MqZ<4uEJ-76H>6-h%m{tODYLvI~d?Wf?F% z{~K5ylyyLSQ1$`S&*p>u1Ik7qJ}4`JXi#hz4a(5Dm(rVERtI0*D4>RS*rzt{@teWkED3+k$9N)&AdD@c;kL4UDY+|F2%az!~i28^Yl162jmd90D?zfq?;s?JNuo z3?K|r#RX*x{{R2~e`dQ@2#5x`1SAP^4Vd1Z7XYF`t^(831HgQc>p*;v3qdrP8&~7O;ak!4Bs2@eN_X;%Ej2F6ZD7GcEw|Zb>Bo diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Cuiaba b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Cuiaba deleted file mode 100644 index 0b122462bd86668241848e82f277a35e04759df3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1955 zcmWHE%1kq2zyQn)3=AL)lBk2Sd8e(ap0a~K{KJmFej9dvbaL2rugTz+#U6)SZ#W$8 zNWMRCXJ@*>-QUU%_h!E_xPNzr!-EhRt`UoUpDx~ z_29s-m24Y+zY%fx)7`y6_T(G~xr(P7!7~(;|5KJ{|=f{W*TU{l0KlF?XW@Tz+ng7v`Yqh3zj~Rvaw=XvE_*mxPIla}u z>tck1cf-OBJ{zqZd=r{C_)U~?@OMbv5Kv`tAW*@5Lr|2|fnWyB4I!3)4um}5-Vi2v z??Bi|4TJEX2M$E6MC@X+yP<8;*$1j7; z17!;kACxsfG$?z3Xiydbc@>mRKr|?;fM`&50nwl=1EN9M21J9h4u}S2A29u>&HzM% zvJsfRauv)6WhW3Hl%+s4C|iN)DKo+HpzHI?8s0aYjA(nr@@}Qys z#0M1zVEUv6*#7XJ2f*^6q5&ihDjq;IsE7d3pke|u?Wlu6)PY7;n2NgpgKBy=H(V*f8OyArKmIoC}AU>#Q z0@0x22}Fa6C=d-Qra&~Pr~=WT;tE8AiYyQfDz-p0sOSRGL!|iPa`X)`0TpRFzJ>;R RMtTPN20Fe*dd46I7XTX7TuJ}{ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Curacao b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Curacao deleted file mode 100644 index 6733d2413e3ba3e802c3a720ff09f30a5383a802..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmWHE%1kq2zyQn)3=AL)l3;?ec_z#0DSVsp#)FaR|Ns373=IGOAK1ab^8f$w0}LEK nz99^bejyBw!66_$3=9mUnEe0$|NkJk&hoRa{T`fB0-*F;PvqhVF-5z;ouMk zci#{O1_nk(kQ9g{C0PFd|NkEpG$6g8-~rK~AOg{#U;@#gpaRjL-~!X1_e}uNpkM>h zpr8ZMpx^`1pdbX%pkM^ipr8cNpx^}2pdba&pkM{jpr8fOpx_13pdbd(pkM~kpr8iP zpx_44pdbg+UroU700ljW4+?$|4T=H~4T=U34T=g74T=sB4T=&F4T=^J4T>5tO`quD Ka`z1}-~s?w>YgP4 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Dawson b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Dawson deleted file mode 100644 index fab060999850a62ccd916fc80d216c94daad8d2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2067 zcmWHE%1kq2zyRzF3=AL)lBk2SW#{cUyCsR z1er@>3uF)eoFKRH#{&6Kg z5(SfBwh5-{VG3qOFD96?TPRq_unJf_mr}6&{anE6*dGP!+b0EVHb^Y6-Mw1CuK(8p z``Nt$4*7Q$IJT^u;N-t=fpbdt1Q-1U3tU}tC%AsTtl+NOCE$K}tAZzQj)3Rp=?Y$N z{RF({Y+m4VEo*{r&C~^c+k7VY$CNJ!n5H)&&?a(0P?^AlU>WNLA)%ipg#3|R5N3L1 zLfBI)g$TKi0ue`L6e9m!7KmE%Pa*o=R)Lt72MV$KrVGTS98!p%S1FL-dv8Hv`_u_Z zx(5~{rf4qD>FU-K($A(X$YhtDkh#`lLDsYX6SAkJD&$;{5y&lb zSIArcPar=`Q=y>$fk2@dw?a|=A%SAiw+bcxO9V>(b1o>eI545?-s=Sw5{o8O>^r-l z@<+>rs(I@dRNqLOP*XQ?LG2EY33YMB3+iWRO<-VTU}R!uWMO1w8vywKe}4lb!~g${ z1q>`;HV2sG`Tu|J1V#Z6n?V%JmW*@>VTcS4VTcS5VTcR}VTg2b31J8b4q*sz2>~T! zMi9Zk0HSatdkzK$1`q}*tcS7{|NsC0zqYM!3y20~0T2z!1|S-g6+kp7JAi0VmH^S9 zYyqYdO%y;hD0_ftP!<6h4$3AV8kAK)G$^}(Xi$~`(V%PtqCr^)M1!&qhz4aL5Dm&k zVEU8E0uT+#P9PeTr9d<&TY+d$)&kL>>;hz4a(5Dm(rAR3fSK{P0< zf@n~71<{}^3!*{U7DR)xE{FzYUl0w-!XO%yjluMDDFqM>%FZAfl%+v5C|iSQP}T;~ zpzIBzL0KF`gR(h@24!^+4a)8y8kFThG$`AHXi(M%(V*-PraxZ>+XpHJKzvY90HQ&~ z0hr!A9V`zj7C?MZ(Ey@B#RG^26%imBR7`+qP*DM*LB$1#1{E0~8dPk6Xi(7sqCv$6 znEoRR4u4QF0^);;5)ch4PQdh08L<7JVgDI6-&wFcsCWbMK}8&h1{HH48dTJQXi#wnqCrI-hz1pVOpHv7Ow24ytW0d| z0|5X3uk~SI0F`fyEa1`)UhefbfXcnO6BtE6vJ8^o(ofdM7gXZmF9E@2AIN{8GLS1E aIK(2rB}B*9SkFk$K*!h6P|r}$fC~WY<0rQO diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Dawson_Creek b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Dawson_Creek deleted file mode 100644 index 01ed5354f840f60cfcbe9663a89d8b47d527a0ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1033 zcmWHE%1kq2zyPca3=AL)lCXrbMdt0;yI}r-=n1Dgr50RL{!(x$QBB}#=tqTX3aKM!R-SR1n%71yx{K2H52abo4VkBXWxVe^U4=I%q*Dj zs4jBBW6z)oPvWc>Jk>Or@XS3z;ki(tzzcONg%_WU1zxesD7?BPD)9Q*KZQ3NzYDxQ z_CVp?#G3-|*Z*1Yp>Vgr$NqZ@KGh$b@Hzj$f-mulCw%o^wBVb4>xA$6Een2VEE4$1 zpSIu^M~lF(AI%ECU!)2Axsj^y_k@SQza8!h|5s=UFwD?YVC>)#V5;C&U@p{{z>=uG zfR*vX1O`SXW=00mA3ULO?VqQb05)Vn8$~a=>(=ngECf zMG}YxMHGkzMHYw#MHq+%MH-lXunw#q6nP*%C;~w=C=x+5C?Y{LC^A7bC_+IrC{jT* zC}Kf0C~`qGD1t#WD3U=mD560$D6&B`D8fNBDAK|7Cu6YvpvVXDK?wjvgAxIV1|JkXi&lc(V)ZuqCp7+M1v9uhz2DT5DiK!AR3flKr|@PfM`&{0nwnu z1EN6*2u%NIRshkUgao2Ni3vo55)_CACn^vFl(0atHA7PYM1c|*hz2Dx5DiLbAR3g| zKr|@9F)=bRvoJA|4q5;I@AqI}0HrTR7I3;lN^y(=AaMo}AKwrL9BGdMocI_R8Mu6d HL(I7V;?VYK diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Denver b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Denver deleted file mode 100644 index f8908febf220f27b3efa68bcc119633c8efee299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2427 zcmWHE%1kq2zyK@^3=AL)l9&r+3(Q+)HDUg4_J##*G7}cgdfBij_1}cWEo=-+TpvtW z(!Z?XbSKY*OUhpgE+tAZeAh3V@Izw?!%zN*3BNeX7=HaI75M!kg5l4NaDl%ktQh|7 zuoU>eLWY51hO_`<`#%Pz^1lMig;EVHiINjo1O7CyIsBf$Zg8)Gz1MUCr@(;*&b1o_ zxIQdu;C`@h0?*C;47>-LC-CiD$iTmHfq=lwW(L8|CIO+!R0iS96akS)cLq^UHvutA zO$KpI4FL%y*9J*WE&(Yf^#-X=Y7?X%aW=?Y;+Pjb^cK@IwK=@Seln=}}vw+I*&i!~U#rwNz@{b(>%_Yg2My47ILt|ee0{hh($Igfzl z@0$!($KDB8-`>q&vw>@Z?e4h@cKvTA*w3zKaL7M5!Lem_gOmS;3C=0C4KDhVCb+u9 zH@JR2D&VeL!{B~-xqv5c9E0cPP64mC4h-INmQL`w7SrHc(>}p(n_Yu{Oy-1uX$lR2 zHr^A0%9t90WppQmgg$8q`NKaU%=B18*i#*W2)V}$5l8t1BL5v_h+6VNAo|{NhM1O1 z0BmQ6@k*KJ5Y8!;i1 zoxdS-t<{9AXCE7~r-cjTT;OBKEwdEJTmOL}KTKMnp#Ks>q3K_NqWmok#iI8GO8loW zl>GZWq0C}aL)pE%6DlO8G*s-{KcVtRSwq#lg%hf8L^RaYHBYGBVbxFBh6mGY zH-gOrWqc4Hl=(q4r~m-bph5sdg9-u=4Jr&kG^juT(V#*BM1u+j5Dh9EK(t7tJBR`o z5+H_{r6!017ZxA}sK5Zxph5#gg9;8X{Yee%K2QMy;)4ni5Dh9wKs2Z@0nwlW1w?}i z6%Y+7SU@zWZ~@Vv0tQ5b3K|GN*i4^;4g_@KfEM1u+-5DhAX zKs2Zz0@0wt2tcCJRKS5~P$37R zK?NO%1{HQ78dTtc>CZ>O_JImM5Fb?dfoMrR z3PunODjY#HsDK2~ph6Nvg9=Iz4Js@_G^oG?(|`EE;SVY}L3~i*38Fy-D40IV2euzn zkb?N2!W2Y<3RDmcDpWx4Ju?oG^n5j(V)T>M1u-k5DhAHK{Tk~ z1=DZK!0rJRz#u-T5C+kpf*4G%wF1k73SIb1pj|ak;?jJ-VwH}CiYJL#2j$^Ah>Ni#u`aM+{SYS@(VX6D3mdLP;8u>pcMM(gL2mT2P&pVKB#(4e4r+}?1Q>i z@dNdLhYK{hLLX?}TUwy?%KU-$zV-s0%OMH6^D+zcHk&2r*LfEhOqNJ6Oi%w{RP-ys z*xmDkNzk1HQ+4eRW=8uG%-MNASV-S`VDaqz2g~1k9#|c__`&-2yazVx-xb*IZg^nV zf1$vBcG3ff{7nUpE%gab{!yL2|lpLJDt1L8`lcLh9S7f^>Dkg!HpE1(|H06EfGz6=XfTnvgxs>O;=?j}LOo zWIp7rzx*IS^xubq{;dxRO&@$H%AfwASoF|`6938vCI9XhlvzwmD7$yCphBV|p<>_S zg32FJ303o23#xC}B-GTU7u4>MOQ?(UEU2Hskif{q%)-PvDB%D9n^YMX{{LUSfPv-z z|D78cIR5`Xet?k&ObUQW5g*?W2It@q23HUc4`FZ(2w`w_2>~U421Y1JN>=&*|Nnnb zb^+0#ECZrJ*#<;|vJRL|`27GxgR&5a24y1<4a!Pj`i1oakkz0p1)@RO3QYG(7Jz6_ z_5#tMEC!}Ov?YLOP*wxcpzH>sL0Jw&gR&in24y`E4a$BX8k7Y=G$w;)d_65

$*0nwo12SkI4AP@~I zhCno^C<4)-;s`{8iX;#XDwaSrsAvMwpyCNk|NaaPe^4<6;)9AR5DhA>!1R%iVEaME z7KjfjxiZKukD#}1Ks5k@Bpdt-KgNii}4Jz6|G^lt3(V!v@M1zVs zF#R?P>>f~Y2jYW@JP-{k_Q3R7Ij}sa_yh4lMIeX<6@wreR1|_}P;m&NK}8~n1{I4S z8dNlbXi)J8qCrI@hz1ptVEW&Eu=$|k62u1;nIIZeY=Y^1i^1}s;uFLN6`>#+RE&aX sP*Dn^LB%PE1{J9wdYBfgT&}?(rmij_I=;qwMtTN1zJ`W+hI$5E0Pe|sod5s; diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Dominica b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Dominica deleted file mode 100644 index 7783831b49c45cbfbe46393045b31a374e37c07d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmWHE%1kq2zyM4P3=AL)l3;|gIVOHF@nQV`|5yP7!~g%s4=}L!_=Yez28VzYF_2== R|NsC0<28)SF*wA83jla_9oYZ? diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Edmonton b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Edmonton deleted file mode 100644 index ba6dbb46cfabf01e9890972ad699d3c96d0e982c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2388 zcmWHE%1kq2zyPca3=AL)l9&Z$i*(#O_h8<0H5I27(q;1oE}z{RkC0@sH{4creFPT;w@ zpMm#4^8~(~3mN!VE)Woy*~}o=*(4xTnaUuXnIa$(>CPbP=_Vj%smUO&sUaYt=G2!r;%#S?Tc7c}V3Yn`CCIjBLuE`5T* zWRnKN^cDf5VzCBe_cQ^MpdSsU>K+1SMzexF0>)X2- zY&LLBu-!eE!LI+!1pC?b3=a9{COEdtZgBG7Fu^&cw!uYz(gatR_y*U{M+Mw|2z#m{5Fz)NA>t^XK;*xp3{guy2t?mo&JfdbNg#G#CqrDy7J>MA z*$fH37bYaOw>Ko|Zkmvsp4pJXJ7q$uyLUtC+p-Di>bec-XCo$Lvhz1&uCmP?W!gp;+|3K#Bh}hLV53CzM%iYACyR zcS424l!l6Z`zKWXC~K&iw{SxBjfjSty5EJz$=iGg7M z|37sB1H=FSs~0e`{Qp090s{w_%>yO{e0)O~d|g5qe1k(6e8WQ+d;>y2`G!1JR(I2c|EzHh^eQ4g}GlTnM5;IT1vIawCWa%9S7* zlrzEfze5Zl8k9ppG$@yX=|l;zI4HM*_@EpMqCvS9M1yiJhz93g5MzZ5$baBm3}S$C zGKdD{W)Ka^(I6U>t3fmr2Z#ohARro4ihyWPNdlrlr3r`zl_($@RH}ezP{{(O z|J?`M2P$Ded{8L^qCq7Mhz6B5AR1KSfM`&u1EN7C4~PbpJ|G%Y0)c2yDFmWHB@u`Q zl|~>MR3d?BP^ko>K_wH229-`A8dO4o>E}EGAR1IsfoM=^1)@PE7KjFwS|A!!a)D@2 z=>?)eB^ZbXm0}CZ>O_JK+`5Fb>^foM=k2c|c7 zg5^Oa9*7Sr^*}VJgGy2m4Ju7R zG^j)c(V$WlM1x9J5Dh9_K{Tj@1=DZK!0rK+v>-mHv<1lXi#YmqK9vZ&gB~%V(#k_qT_3RB0|Iv4o8WNE;#9z`H(~*I zB>!Hxv$NFU?r+0@d$WHz+`qdm;6aGL!cEdckANS?A3FTv zdUxU1N|6J<-zWwA>7IE&_T;Jnxr)yRcSa3JWm3v(y1ZgTe$vgTe(wgTe+xgTe#_s}ek3CR$H}R$b_k;Bdcy68*;5{&L0pHH`0{ko2DG1D*C?ME5 zK|!dpSU@(}yCJUq=iBFKZB(^~I z;Lizi8-Fa2UwC_hLYcOLV&mQkN@2VT%2~GrR7~G1sCw-YP!qkVpsqDfK>gp_1)5w9 z0-E>EFVK3GB%r--;{u(_brW>wO8NEwG>6E8viS zXMtnO$_Y;X`xZE-bWd>6U$DT{C3k`wf71eY75@qDKjtfVvKUVAywRxO^+b4r_l{%* zpR)!6zB61E{MHHy_*bYa1oV6n2uyTd5R`LGAlOlLL5R-|flx*E1z|d~1i~3!E{G7_ zHX-7{=>?HrXH1AXuy#T8)v5_GD^DrJZjG4`*SSU^eyZJsgv>sL#JXsKB+mkc2iz$>7N1?Wc+#jRR}%J*IZRlDL9 zs?X~P)GV%EP`jQ_psqP~L4Dr`0Y)Z9CT1oURwm{_1poh^s1JR(22ckil4@}S8RRE$vnGi&SG9riuWkwJU%8(!$lqo?p zC}V(V#*PM1u-G5DhB)Ks2ZT1ks>E5JZCtLNNW{G&p`h1tN$KDilF9s9*%qpu!PE zg9=Cx4Jsr-G^n5i(V)T-M1u-U5Dh9cK{Tk~1ks?v6GVdwP!J6&L_svDAO+K(0>Jiz z3RDmuRH%YzP{9hKL4_-b1{JU%8dS)FXiz~5qCtf%hz1q7AR1KYf@n~|3!*`VFNg*e zz#tk_2!m))K@6sU%?8H@s6YnsL4`7i1{KU88dNxgXixzSqCtf;hz1qZAR1IygXm#j eU~>fohgbx-gy{I1=o#u6==d5M=$YynZ~*|kq@0BS diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Fort_Wayne b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Fort_Wayne deleted file mode 100644 index aa3dfc43730ed25bde9c967039951f5c2fc15cc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1649 zcmWHE%1kq2zyNFv3=AL)l1PHGCFU*DX_&w3XTgFtzJ`UfZWo*iS86zQ!@b~i$G?V4 z%3lgDC31eaT>6>eio@#_-#{4@Q?8=2$;r_5NM-c5LEgsAy`JRASCoeLdfsW1!1PE62hMHe~6Gf_8{WO z#}ASJRy>GWa`{8_y{-o_En7dt?#p=)mooiB{5-!03BFqj65F#Al60pPB&Yi(r0`Z0 zq`K=Tq`r+RNLLq3NIz>+kjeHrA#<%k(vU>*$DkLfrD)ucdsQeL?P&Kc$p!$YQ zLQP$ILG2E?gt|D-g8CT@2@H%N$ixh$KuiQ?VPs*Y0{s7f=LSZG|NmDnU|<2WIlv?j zh-47>|Nr;_MiFP15C-Sq5C-S)5C-Rf5C+%a5C&J55KxL?1Q8633=B9@7drz30|C7DR(mErcluJM~D5rpEP;LRypd16DLAeG@|NdM6qCvR_Oh4rZ+Xu=;AU-H3foM=}0@0ux z1)@Q@3Pgi)7KjGrE)WgMVIUfm%Rn?Jr-5itZUfPv90#I7xei2wavq2V zP%Z@VK{*jbgK{I7UMmNd2jxl-ACxmeG$?n1XiyFX(V$!kqCq(oM1yiGhz8|Y5Dm(; zAR3f&K{P1$g6V(v!RCW(Yi_D}F5a{f5opPj~GC*^_++auwGX$S*M6pkRD{fnsB(ffDzL1R=a|KEPW!0`Y7;|Gi^|NmdT zz`*I_8^Yie6bvFlK)z*QU?3$-{{R2~9~3Si8Wc8Q`me(R5Df|=5Df|^5Df||F#YQbVGE{@9|fBS z3S$r-6wV+T6xJXb6y6}Og2Eg`gTfs|gTfv}gTfy~gW>>0gW>^1gW>{AKPpfF(V#d1 m(^rmz`JlJ~@j>weqCs&4rayUs@bVj~l&7S zsOU|AvAgvHlb~|}rs}c}%#1b!n6v$VU?F|xg2l6k4=jJLyI^(f@B{1H6E4`Se~@6i zyXb;l|Dgo?*&!Dk@|PqywiE_9`L`uFrvwMM=w~Fjx|jyIexCKfT{rN8`{kMkp1j5v zJU7QZ@OmqH!Fx`1g3mRh0NEhd>sB@)3vzb3As0;wnpmG32gUSLB4Jr>nG^k7f(V%hxM1#r(5Dh9H zKs2a~0MpMNJ^<06vI0bd$_o$;DlXizx>qCsU5hz6BMAR1IAfoM><1foG@6PW(}6deAbG77{8l~W)ZR91oMBagxM zgUT!rA5?CEXi(V&qCw>shz6BmAR1JTfoM=!2BJab8HfgzX&@R@u7PM!*#@FP9qo2c~IF0;)BXR5Dh8=K{Tiw1ks?f5JZE@Ll6xr z6G1enTm;devJpgs%100lDkH)4zl&h=L1iU~4=OJ~G^or3)BC1^DpR=}gF{RlT|#txjrEN540L=A4fPE547dQ)d1AHz diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Godthab b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Godthab deleted file mode 100644 index 85623ce7a7df5783167f26c2191b4f5ab1973088..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8296 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 B+>ihO diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Goose_Bay b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Goose_Bay deleted file mode 100644 index 07c88e593ea792d5cb5e7ac42dd87a135c0af629..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3187 zcmWHE%1kq2zyO>K3=AL)k~j@z%g)P4lV8bq|gkH#m=b+*E&cF@Dio<+pNOhb=Hby5+JJ%v4<#QuqRs`1t1nY+Y|=R$%fUa0-L@#5p>6R+6r+<0~I z>WSCS_T6~1ar=q4#}?dpw|}3<`}KPxKFnX>@v(n?#HacukI(sy5ntj{JihuTM|`t) z^Z2gs8u3FT>BNs)*%3ea^%8z@cwhMS!|TEC7rGbz+|YUO_XPiie>?ad{9pd@0>ktV z4;b4oUtlV~^nkhGLjX&{`vlg2O95;S7ZcbGwghk}Y);@5m=?grFg1beLq!1hgYpEP zn^P|E9*9if+gWyje`V6V;%_`RJN@x`^Ye}OocJ1_YhpRRHI6lYTYu#E$0*kXOudy8Xv10)RJtc8 zSo(QQNa(zrkl!b3!b}@-!k#?+6CpR}O~jGoeQPvuR5Z&yuXyJJq0Zca^dx^hkmuU}27J8MqrTZ5W(wdXnMXN77q*-qwUuK7}v z^=x%c_B4S%Ip>eR$u0f#CvW}AH~FDg{uK0gzbQ1`_NOR6_f4_rj6Ws*{%=bDZLKM@ z$jK?YH@&7p!Y`*{Uu8|@4}+YldC@i1H-vI(>TGLjw|~j0i<7UZpMEWek%5UB39_;v zagZf2+3aj2Kn@brl435h+W-I0O<`d8|NqVsMwb8o&z%6XZ-Cf$ZZLBE|9|HOBhUZ; zS1&LM{QrOa0E5W?|BoLqO85nbF!;HIF!%+8F!+UsFgUt|FgON-XqOOBslvbrCK(tY z3>@VU7Xt$W2!qs~fwC3<|Ns9#&elc+M1#sC5DhAqKs2aq0@0xI2}Fa+C=d-Qr$98Q ztOC)X@(M(Q$}A8KDz`v1sO$pKpz;eugUT=v4JyaL^rI;nAR1JjfoM>f2Bs69odD6G zvJFIo$~O=VD&s&jsGI}Qpt24`gUUM)4Jz}%^vjhVAR1Kmf$2*}!RCR=KoB2P4uWV< zSqP#*+pz;$$gUV144Jt=LG^i{E(V+4aM1#sy5Dh94Wii%wgiA^Q27m_IR&PH z`CJTB6F_`WSq`E>z#({sFrOR40J=pn3sB%N{%kb}y)Y0P#U} z1c(OJ6CfH?SAb|xeF36Dbq0tA)f*rhRCj=AQ2ha-L3Ie2{x`D*M1$%QFnzBY%m>ve zAU>#G0nwnk1w@1D7Z44qV?Z>ho&nLIx&}mp>KhOZs&hazsNMn5pt=V{gX$j;4XT4c zG^ic|(V)5rOg}sN2SkJFBoGa%mq0YAZUWJu`UymX>L?Hms;59SsICIhp!y0#gX%00 z4XU?5G^p+Z(V+SZM1$%uF#Wj>Y#*pD1Mxxi8HfheX<&M@6IdQpw}JSe`VB;b>NpS$ zs^>s7sICLip!yC(gX%mG4XXD*G^p+a(V+SdM1$%;F#Y=^IJ`l1A&3vE4?#4jP6X3O zj)Uz7)r}xNsD1>|pgIyngX&2T4XP_aG^oA=(V#jLM1$&05Dlt3K{TlT1ks>66hwpS zQ4kHPOTqM81F(BQbt;Gts#ifYsBQ(*YrcTxL3J#M52|NDG^nlx(V+SkM1$&F5Dlt# zK{TlD1<|1T7es^VU=R(ehe0%`E(X*8wt~$E)yW_}s9pxqpt>1M@2dpMgX(AyA5>3+ zXi!}ZqCxdFhz8Z!AR1I}gJ^Kw&BVyef&|%EkvPZ_m~0Mq5+ElDYDqB{S?&M-$74Vh z_PHqxEZ{1f16+lJ*hrQ4og1La`|1To5pWeQ0j|Pje0)O~2v*~e>Khbv5EhqXaEOVc bONfrIv7V8hfxdy2fuWACp`o53l*0u8f7iZ8 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Grand_Turk b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Grand_Turk deleted file mode 100644 index 733c17984b411c5a7bfdd87bd550a1db2d34388f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1871 zcmWHE%1kq2zyQn)3=AL)k|>9=c_#C3Wf1I4{UB87@jy7!{ewuP)&o&b%@1OhJP*V* zxj#rKX(mW=y!{}>#GN4ZiK{^R;oAh6i*E{K51vnu+jy=(e&NOhg))W@ij9*KltLeU zP|jNaK*jXP2UV|$57b1LeNfjbexUyEaDgUQ=mX7rOAEAKnLp6p*IuA=IV3@MUS@&b zX0rtSI`0C5$r1^M>FFPgihd;+yL)~x3A&SDs;>RP%xGVNIXmwM3+Y=AES|mpVEKE` z1FK^fKUm+M_rPZTy8_$Y4G--4FBI6%PI};wzp22nr9Q#Qe@cOKN@9YGep!L5i*thO z=M^8^b>knnU+((g$?N#Qb92rIueZt%yytWl_*`>H@U6)%@Y|-8;2+~#5HO7;A<#y@ zAgJ_NLa>ZrK}hI{gpl8#3&KoSC4@cY{}3T}>_Nnlj~^oct#}Z%4OhN`O_a1iyrz=;$Qio zK+l)OPSD2an;P%;P6prj6>LCGCNgOWUm1|@qC4NCeT8kGD&G$;#zXizo) z(V(mVqCwdKO#eF!whxpoKzvZv0MVfA0ir=!1Vn?f35W(|6%Y-|E+86|Wk572+kj|L z)&bF=>;s}fSqMafvJr>|WhD>|%1$5}l%+s4C|iN)XYW6NXi)Y7(V#2_qCwdVM1!&# zhz4ah5Dm(5AR3hIKr|@pfoM?n1JR%?2%gR(D(24!Io4a&wK8kChmG$=cR z>EEBh;Sb8zAU-H-gJ@9p2Gd7Ag6#)oa}Xbt)j>2UyMt&@mIu+GY!9MASsz4$vOkCh z6#*a`R1AP9q60*OiVqMCDndXss2Bm!prQmsgNhRn4JuMVG^khs)Bo;+%?A}PAU>#w z0nwmh22Af;43-BKHy}Q!$N|xyVh2QniXIRRDtKZJp&zILqk17Jp(QP$rSkF diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Grenada b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Grenada deleted file mode 100644 index df1b6895f9c1f38580293eddad9f74af2e87751e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmWHE%1kq2zyM4P3=AL)l3;|gIVOHFNn!l||CkH|!~g%s4=}L!_=Yez28VzYF_2== R|NsC0<28)SF*wA83jkWO9bo_f diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Guadeloupe b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Guadeloupe deleted file mode 100644 index 15c0f1f7450c27dcc5971c9769455758f1606817..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmWHE%1kq2zyM4P3=AL)l3;|gIVN6xxPkHi|6>6R4FCThKfu7^;~T=@7#spp#6XHc R|NsC0kJm6R$KVhXE&%R6AAJA- diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Guatemala b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Guatemala deleted file mode 100644 index 6118b5ce2d95b66dc88cc40c7470a53105dbd6c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmWHE%1kq2zyQn)3=AL)lHi20dFIc3b%#B4O#=JbX%{4QDiS2mKM7EO_3nYjiI@v6 zAwdbQ^4gM}~lmf?`rE{r~^}e~`r>8e}=h2#^Cn OG)0c!a*qr#;Q|2r`$PQz diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Halifax b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Halifax deleted file mode 100644 index b98c3a77340fe1d504a65a3cc4022e8760575cf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3424 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Hermosillo b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Hermosillo deleted file mode 100644 index 08ce31c7cccaa3dc0842a3628dc0820268215032..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 424 zcmWHE%1kq2zyPca3=AL)lHiB3MV4-RQLz3~-h*vvVF}xvFD2~YF-zF-x9!8}SA_{T zCT{t_z);X&nBF2_R4mqD?4BlI67-|NRNX_s%;;7FBNG@hGqQl;|Nql}Ffjc8KX(EH z%m4qY7cg-A|KH!hzyo443i$YjF!%0H$gPWt00=n M-sSQQ4l(Bf0L?&%Pyhe` diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Indianapolis b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Indianapolis deleted file mode 100644 index aa3dfc43730ed25bde9c967039951f5c2fc15cc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1649 zcmWHE%1kq2zyNFv3=AL)l1PHGCFU*DX_&w3XTgFtzJ`UfZWo*iS86zQ!@b~i$G?V4 z%3lgDC31eaT>6>eio@#_-#{4@Q?8=2$;r_5NM-c5LEgsAy`JRASCoeLdfsW1!1PE62hMHe~6Gf_8{WO z#}ASJRy>GWa`{8_y{-o_En7dt?#p=)mooiB{5-!03BFqj65F#Al60pPB&Yi(r0`Z0 zq`K=Tq`r+RNLLq3NIz>+kjeHrA#<%k(vU>*$DkLfrD)ucdsQeL?P&Kc$p!$YQ zLQP$ILG2E?gt|D-g8CT@2@H%N$ixh$KuiQ?VPs*Y0{s7f=LSZG|NmDnU|<2WIlv?j zh-47>|Nr;_MiFP15C-Sq5C-S)5C-Rf5C+%a5C&J55KxL?1Q8633=B9@7drz30|C7DR(mErcluJM~D5rpEP;LRypd16DLAeG@|NdM6qCvR_Oh4rZ+Xu=;AU-H3foM=}0@0ux z1)@Q@3Pgi)7KjGrE)WgMVIUfm%Rn?Jr-5itZUfPv90#I7xei2wavq2V zP%Z@VK{*jbgK{I7UMmNd2jxl-ACxmeG$?n1XiyFX(V$!kqCq(oM1yiGhz8|Y5Dm(; zAR3f&K{P1$g6V(v!RCWSQd<_d{-7YxY@vq^M@|S{3iJTv< zhF)d3rf~Mdb<^z(HyGA`xG6f5;pT&hA8!5I+Hm_o@rOJ2rZ?POIicX*zRHICokax? z=0!I=%nT`bRA<}p*wd`wNt}Gc({P&)&)jVoo}0^kc%d%G@Zyu$hga+j46iQ!`0)DK zBZfEEj(m7~>yAzyH8g{+@xkkf(qpk-LF4;9UWm!`lXSg9`=hz3L5|0-Fjr*Dhw@ z`Y@${`@!S}o|_v!@E#~_;M+Or1OLiN3<5JtJ_vS}FbGwKeGtwJV-Sh7_#o%J>-+8y6NR zg??mE&f5Dy#q=_Rs@MDvYNA^i)U_HvsQ5hW1r*aGta#ub?9A#jL{I~5x)RIRG(f4M2h-o>(5WBDHLtM%-hWL3g z9};{IH6*rI79{B|X-H0wE=b{RYe;psEl7Qv(U7h#Uyy#*t09w}u^@A;PD9qS#|7Eb zJQ;G%|NoF%rp=JI{^5uGFkXg&{=**%P2V#VogL7~QgL8NYgL6O#gKKaIDC;mn z2ppM=je&sygh7gCLD>@j|Ns9V$NX;rhz4ai5Dm(7AR3hMKr|@xfoM<$1ks>O2&NM` zKY(aZW(3io3<;t^nG!^UGA4)yWlk{tU?NyOD3gNtpo|KlL75dqgEB0L24z|h4a&G6 z8kBiKG$;duXiz2w(V&bBqCuG%M1wLkhz4b95Dm)MAR3gp!Sp9Fu>GJ+4&s9{I*0~k zb`TB9@E{tL=|MCoMPo z^L7vgF5o~6P$37RK?NO{-dqi$zy%(N0V?!BG^pSM(V)T)M1u-I5Dh8>K{Ti!1ks?v z5JZCtL=X)s6hSnoUjD4JyDvG^h{<(V&7HM1u-*5DhBO znHZTEnV4C?6o`o(vl5WUqKg%a7)hr5|G(}O0|Ti1W@G`E>qsR!qX0;pLBz*5gaJp{ j&Hygl85kM3oP$HmoLxe6e2w*t^bB--4Gr}S^$fTG$E87V diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Marengo b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Marengo deleted file mode 100644 index 255b739718d2b92211495e027e57a79dfa47b63b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1705 zcmWHE%1kq2zyNFv3=AL)l1PKHCFU*DX_&w3XTgFtzJ`UfZWo;H_}6er`Afm2M9vR) z?oDsFyK+LoqdMD$$DU>dPvYboo@z=IJae~UcrIk};f1;!!;4R1A6~IDFuc0>-G8{9pe60mJlv9~j#oK42<;@PWDDUjj?Q-vZWv z2MKHr_Y2q!4kfVnN)~VmY%1VfJLLn{hqeS4{jvgA7v}`m&nrH->&8EDzufh~lh^Tq z=jNObUT>8jc+cr9@VVxY;9HYj;I~aF!9T{gAYd9xLZFR)K~U+lgkTxLf{@S?2_e5f z7lfIvN(g(({~k5x_qra$v~2wlyD#TKT*~wh@$>v1B=~MA zNNmqeNYb5Fkeu$DkiuJ0km|0Vkoq>NAYENBA^ogPK_=Vhgv_;a1zFFoCS*^u`jB(} zgEPKqP~}|NqAiFp4<4gfKV47L3~gu2GO9D45C4)8AO9pG>8VJY7h-d*&rI6x$~ zatMeI$|WEglvBX;<{Yp*D93>Kpj-o@K{*FRgK`gu2IU|S4a!9z8kCbjG$=QLXi$y< z(V$!fqCq(eO#l82b}uN0f%u?Y2BJYZ4NM>T2(}-T<3M~+t^?7aoCl&oxer8xav+EX z5P_6{gpqvS!LAet|gK{XCej5dL4=AUC_@LYhqCq(pOs|y# z%Y$+*h!4uWAR3f|K{O~AgJ@7r2GOA045C3f8bpI~HHZe~Y!D5~-5?s2!@=~w`(X1y zIUU3Y<#rGa%JE=&-(s*lDCdLtpxh6lK_vi)29*LJ8dMU1Xi#YYqCq7B6C)EN6Eh2# z0x@Bjl?@IV;Vgt0sjUD1*Yh$kfC>Oc7I49UR3tD8fW#R@zy*VZk8cPAp27iCE`Z$5 f$iTqm8XRKk>Jp;kYpiFaXQ1P2XsBnXXTSvjvxr(l diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Petersburg b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Petersburg deleted file mode 100644 index c611106d57e4adfe4bb396fb120fecff84d9fa70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1887 zcmWHE%1kq2zyNFv3=AL)k|>6%-e)M;P8s-1Fi6 z`Uedk<{vKj*ng#Tpy+sa6g#bz;koM2i^mv4SYK%eQ?n)D{yrQEO7n2oxxo<_k;W8t`DBP zjt@LH=X~&btNg%wPG^D7HHQS>n(P9(^wJ$ZS)I*N}nYJ%Lo>Pgq}zU z`Te;d%yd;k*i-%w5pu^KL>&3}A@bjf2T@Bde~7-<^&qBY>xbBVIS=AerhkZ^=l3AN zcS}KHdv-#S?zDpBbl-#&-im@$cm0Iaw^0S@>VgUBXKe~H**+&^u9YjudUiD-dz#gU zobw+a?_fcN zL`6cyzQqNVKcW(<=Cu}7->^xjsY@@Y-65Ay7w1_}KZ7BGfsuiciJ1{Zp<@=Tq6{ny zj0`NS6u|%gcWz*0`2T`|NoC4U=(q731M&!4q~TTMi9Zk$iRRj$+9yrFn};fSqYRa^Z)<<|8dO!7Jz6_@&(bLBn+ZK$rwa~ zk}`+}C1(%~O449Dk@EwH1|@9}4NBf18kEFAG$@&aXi!oI)1Sn^>On~!#0MpN5DiND zAR3hXK{O}}fM`%Q0MVeV0HQ(J0Yrnc1c(M@3lI&;8Xy{!JwP-li-2fQHUZI~tOBAz z*#%7hNM``izh8KQ-2=)xApYMI+F<@aP!<9SfU*%Nv}W*vNN{!nF+f=gM1!&whz4aX z5Dm&+AR3g#Ks39-g#s|$tKI;jIR!R>`JgNZ;)Ajshz4an5Dm(HAR3efK{O~Ef@n}y z1ks@E2&O-82T|Z`31Wb<^+rMF5Bf6$2m|R1|<{P;mgFK}7vws3-x^pyC8X zgNhUo4JuZ^^uPOH^FhT6hz}}aKs2bB0n_^ygXKZR4TujaazHew*a6X?q6b8SiXRXS zDuO^Xs2E~mWMX7uW&u+mCNgHlD$2;p$i&FXMgjc)f1NG^1E|ztWC52(NaYZt07#rc v1Y8c^7+!o5`|ygL zf#KD~A0J*nd&KZ&9VC1)uYmG<=C~FZk-; z*6?qK%!mKW|36@u{_g{0`@;t=`eg;KE`bHEpSLr(>*juNzdVz{lh^-)=jLh#ueXLD zyyr}B@VVw!;9FDK;J3}7z&|FsAz+$NL7hLF%}1tEVJ8^TO?6ofsM zV~CKu@*(0V14HD$Z6BhRJYtBxH{(N0%MpgyeN`XgQkF5q&x`qx;CrYcvAwb&Nq0#@ za(Z+@3U6COs=IAL>f4NlbanZH^s`4##`iwq_H?H@}1y=^G7SW-}S?|egrL|Z|{zKso)KQaoc z=1p#>zTs6+Q&-whyF;g-E-t*Geg|PW;QRq% zfbs~42IUhF4azGZ8kAo^G$_x2Xi&ZZ(V)BoqCxowM1%4Whz8{&F#U(I0YroH6PSJ~ z2cp3F3d8{AEf5XLUmzNk$3QeFpMhvlUIWpf{05>yc@9K_@*Ri<TDbS?U4EKfBF9h4AcL8U~GT*fT{e!2j+r*2`mYJ3s?glB)I686}Y-MC%ArI@xfg; z{(<}Dt`DBPjt@LH=X~&btNg%wPG^D7HHQS>n(P9(^wJ$ZS)I*N}nYJ z%Lo>Pgq}zU`Te;d%yd;k*i-%w5pu^KL>&3}A@bjf2T@Bde~7-<^&qBY>xbBVIS=Ae zrhkZ^=l3ANcS}KHdv-#S?zDpBbl-#&-im@$cm0Iaw^0S@>VgUBXKe~H**+&^u9Yju zdUiD-dz#gUobw+a?_fcNL`6cyzQqNVKcW(<=Cu}7->^xjsY@@Y-65Ay7w1_}KZ7BGfsuiciJ6gw zl}hmc|D78c8UFuYy?}uQ%;o@-JRp)m;Q#;Q2N*@1T|yX~gF_gc!$TOH140;FgF_fx zT|z+d$_OGD7#SFFqycsY1_lrYDGP+MW&Z#F|38lT-vST~N)I3!lqNtlC|!VPP}%^| zp!5NvL1_d`CvtuO(V(;fqQU6}!~mrkkS){yeE?CQv;(3+=?6rE(h!ISr6UjxN=qOb zl%7B|C{2Os&nv+CL1_!b2c<6%4N7BRdUFm~9+cKVd{BA=(V#R3qCx2nM1#^Ehz6xU z5DiL$AR3eoK{O~Wf@n~B1ks>038sI4E&$P>vzR&@&kwlFSlsCZizx!bGL3sqk2jvqG4azHEdf#HOJSfkA_@I0PqCt5FM1%4Vhz8{$5Dm&l zAR3gHm>8KDnV4CaSlOrq|Nr0Mz`y{?I*csfEQOSr7zIG$3?kqxCE?>6!hk1RfpQec gm5dAwT&}?(rmij_I=;qwMtTN1zJ`W+hI$5E0P&~1XaE2J diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Vincennes b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Vincennes deleted file mode 100644 index b79f6725b62a3c16ef4abecf92a92b67b33d5579..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1677 zcmWHE%1kq2zyNFv3=AL)l1PEFCFU*DX_&w3XTgFtzJ`UfZWo;H_}6er`Afm2M9vSF zOFuJQad`dV!Mx~(hnXP-kLqk29($Sc^7+!o5`|ygL zf#KD~A0J*nd&KZ&9VC1)uYmG<=C~FZk-; z*6?qK%!mKW|36@u{_g{0`@;t=`eg;KE`bHEpSLr(>*juNzufh~lh^Tq=jNObUT>8j zc+cr9@VVxY;9HYj;I~aF!9T{gAYd9xLZFR)K~U+lgkTxLf{@S?2_e5f7lfIvN(g(( z{~k5x_qra$v~2wlyD#TKT*~wh@$>v1B=~MANNmqeNYb5F zkeu$DkiuJ0km|0Vkoq>NAYENBA^ogPK_=Vhgv_;a1zFFoCS*^u`jB(}x(VQ>x)VQ>xzVQ>u&VQ_T`0i_*A z5W&F6zmVAG-a#}t&4U=AbPo!p>Hj`}C{X$b(V#p4qCxopOn=@EqQLn9!~o?95Dm%~V0v>7 zSU)I#fcT(10-{0r1Vn@K3Wx^f7Z44~Gawq2Z$LCC?|^7f{sGaTJOrXa`3Ow^{#*c} zLHP+xKjjD82g+9c@so~@+X*HD+iVbzJlvhDCD8GVe zP@V3{dZ=7aJzh!4u!AR3gv!Suex zV0lnJ2k}999YlljJBSA5c@PcC_aGXS_dzr$|1&W%F)}f;fGH3Y9ka5rvavEUF@k9j zn;iWA|JsiX44~}J$O0|~kO}}s0gyO@2)G!K@bL{{z*7`}N&%3|85tP3T!TYQU0p(S Te2w*t^bB--4Gr}S^$fTGY_oq| diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Winamac b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Indiana/Winamac deleted file mode 100644 index b2611e75ee8b16039112e267428017cbf1176eb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1761 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 RJtI8>9bZF3JwrVME&yd-HMIZ$ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Jamaica b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Jamaica deleted file mode 100644 index 09e3eb93996d4498012f7fd8dfebfad416ebf102..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 481 zcmWHE%1kq2zyQn)3=AL)k`RTmc_#C3W#CXaSimW;B!P47ln-1V+7h@Qv=;E(T=anV zKzae+&Xx!KE1N$E%uIVA*qQo4sM6zsaHjhQkw~ovqMn)`#4LFph--3xkWkW0kmPv# zL5hhxfsqLd{QrLk0|UeV|2sD@u>Ajj`~V||w{Hl8Yj6mIt4j#TNem1OI2_Kxz`y{) zAXQ>ew!r`Y|Nm#UD>r~>kS9QrAdi4(kY~X3+9@AEG{{pR8ssq$4e}g_26+%fgFFeM zK^_IsAkTtmkcUAu$kQMi0S+4;AKwrL%3;B^FKUH`rDk6d3FhuRXA9>*5W& ze{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9pO(RK zNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^Q3P4QHZa!+K>>oVnJf0%!VYht_8^!|2CwE}Y+4J=kauzN&$gLMt$ZKph$dCK1P>{87L!sSOg(9!!4aIWX6-u;HHIFuQ|NkF90FhTOfJBZTVBiId3px9S zFgON*aBv7iIEWSQ7!(`=N|s0%M>wJH;6XGf(SvAE!Uxfy#1EoD8306sG69GN zWdsln$_yYHlp#PgC{uvxe_CMsK$!!?2W1ct4ay`S8kAAM^t-kLAR3fm!1RWpo|8h zL75FigEJh6(PQEO3S>~m1JR(&2ckh45JZDAA&3TLL@@oKYypS{Wk@jn==KH>4a%4x z8k9LfG$@0DXiz2v(V&b9qCuGzM1wLcn7&i50HQ$|7es?HFNg+ZU=R(;#2^}!kwG*l zGlOVQh6d4~Obwzz85=}{GB=0@WpEG;%H$v#l+i&nD6@lTP=*K7?^wY0gEBsd56b)? z8dLy)Xiy;lqCo`#hz1n~AR1I4fM`&m0HQ$!1BeC{4j>v-K!9jaApxR61qFx(6&4^G zRA7MVZ+_tL1Qi@0KB({j(VzkZM1u+u5Dh9wKs2Z@0nwlW1w?}i6%Y+7SU@zWZ~@Vv z0tQ5b3KCVXrO1PXP|GO<7=#E3}SEr02W%% A>;M1& diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Juneau b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Juneau deleted file mode 100644 index 7ca47f638aee97a357edbec89621162738e9ec0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2324 zcmWHE%1kq2zyRzF3=AL)lIVl7Ex4rorQlMcn!vvu?h5}`XbCXP&{SaT;1OV| z;8tKR)R@4MsJ?(TkZS^)Bj*BkgEte{dz}|>3Y?q3xpuz-*M|)gxF4)vz;pAg0Plf` z3;1@f7vNvHPC;PiL;=Ch2?|1$#R9^aMG7L3p#q|wAqrxa<^tlHW(pEY!4o7oB^0EX zOeaWbiwH=4a@rvMNOghCC6x`bhu9a$ZDQLXzwqS(g)&P6#m3VMl)|J9l(SwasF?mW zQ1v>cpeB0XKwWE%g8IMT8#KB46g2PM-JtcVKtX%o{tY^pdlu-&{Sc zzkJxhlebF2bMsOIueUJ@-g6Fa@VQp8z_(`c2ET1l3;bhRHv~+xSrBNGz9FbgZb7h& z=Z26lh6N#iv^RvAK3Wj=)WaY`?!Q9BQ7wbWe-9O+mhu=x-#e@j)AG(BcHdHkxReV9 z@$=dh5`5omNNiucAW8S!hUE0t1u486Hl(_zFGzhmX+yfY=YsUJB^xr?wHIWr4cn0Q zoOeO?v|@vt3t9@fWuXRn8+a7*!^{l|`rj!Onn@ZI3G z!O`0VLdhz6A*LR33q7P?-dxLFE#d{`?SZAE2C8dRQwXi%97qCw>SQd<_d{-7Z*C{GDN`m|(#vUcZJ@ zH{1(Ocl>L(r2M7eQX=PvOSh*dTwcOia5eNQ!|embAMV_n-f(y2go1nfDjV*178N|0 z7v1nMGo;{Aoo&NoPqTt2aql>|I7bBV3_{z17rKc2TbJ; zJ}?*jOJGU(TfiFdAc4){egV6|p#=6`$pTJ+O$D55r+nc0(3ZgcptXSK=As9@2ht1p zcD6j=U)lUYU}o9_!OqkVLX{p5gfrbgh(u~V5cSmjAZE$)KwOjigM^Z1f+WY=4^m9r z2~wZ93Zx&tO^~_xra<=K`2@L*=L+N(ZcI=pWB8!hI5|Nn^w9_9to096Opkm}^_uuV zO?24@b*i-TGXmW)<(7d;_Kn(P9(^wJ$ZS)I*N}nYJ%Lo>Pgq}zU z`Te;d%yd;k*i-%w5pu^KL>&3}A@bjf2T@Bde~7-<^&qBY>xbBVIS=AerhkZ^=l3AN zcS}KHdv-#S?zDpBbl-#&-im@$cm0Iaw^0S@>VgUBXKe~H**+&^u9YjudUiD-dz#gU zobw+a?_fcN zL`6cyzQqNVKcW(<=Cu}7->^xjsY@@Y-65Ay7w1_}KZ7BGfe`|kn4t^^7lmYDMS=`S zY-DkIvH$BtSH%pa9XJ!U9Bt z3JeepDl|YesNew6puz)0g9;E34Jt%HG^ii}(V)TvM1u+x5Dh9+Ks2ae0nwns1w?}i z7!VCAWI!~ipaIk09)aBlDsVu2P@w~&K?M(p1{FRa8dLy*Xiy;pqCo`_hz1o#AR1gC zff%4d2^6~1|9t>apu!16g9<1R4JxESG^n5g(V)T#M1u+}5DhA{z;v%<0f+__USN9d z6tH=qLJY(Q6=Wb9RG5KiP=N-bL4_KK1{G`|8dSJ}XixzMqCtfmhz1pOAR1KIfoM>H z2ckiR9*71Nd>|TB_&z#07RAs4xWaK?Nd+1{I1R8dNZXXi(t@qCo{D zhz1psAR1Iqf@n}-38Fy-CWr8Tj)F2vESc7O#feoTT zg*J!=72F^iRCt5w&nv+8feLXDA5@ToXi#AerZ?w+P(sPG5VzdwV+A5;l|_@IgaM1v{=Fn#1B*nUu@ z0OErx1`rLZ96&Uvf&kH=N&-ZKDhdz{sw_Y>sKNlzph^QogDMUX4XQjqG^hdr(V$8M zOuvl+y9ZR6fcT&a1w?}?6)?S44lECN?>~5Vz4}@asu%|6%>dDRZ<`t zR8fIwP-O+8K@}E=231;2j8MqT0%gDikZ4vmB*=)wMi!?R`~Uy-vltjabrd5Dxb8x# zwHO6J;tV3-x=X^xH-rIC{ROJJK*7Msz`*4i9AfI~5~Aa4tY@TWpyO+3sAs5Wzy$z6 CPq>}{ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Kentucky/Monticello b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Kentucky/Monticello deleted file mode 100644 index fc2f1b0df86ece6228927ba6062f03ad43bac2cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2335 zcmWHE%1kq2zyNFv3=AL)l9&u-OUzrQ(=dP6&w>SQd<_d{-7YxY@vq^M@|S{3iJTw) z-0)=hdqVreza82P|5xySV3@(nz}Wu&15^2X2IfMZ0+vMX2G)Rg1#Av)8`upl6tMTI zH*gAUD&SnZn1SoVlmhMtlN)$$Zur1^ptON+=cEt(Du{YW$%7?_z@{SMmqVdz%}yUb%kI z-Z!;D=WHcZFlU!x zu#kT7!Q$CJ2Fu^4K3E;Q_`&-2yazVx-xb*IZg^nVf1$vBcG3ff{7nUpE%gab{!yL2|lpLJDt1L8`lcLh9S7 zf^>Dkg!HpE1(|H06EfGz6=XfTnvgxs>O;=?j}LOoWIp7rzx*IS^xubq{;dxRO&@$H z%AfwASoF|`6938vCI9XhlvzwmD7$yCphBV|p<>_Sg32FJ303o23#xC}B-GTU7u4>M zOQ?(UEU2Hskifvmz{teR2%;#$tSnT6|NrmYz{v3b|LO${EMPVVnB@8Y|M&q$0T7!( z#Mvc;!8tgD!8tsH!8ss=!PO;%!8JGpluZ~x1Op=j1CA`k&cMI`!XRZ+plq4{|NsAw zWB#`QM1!&yhz4ab5Dm&^AR3g_Kr|@3foM>c1Jj9|A3!uH>w)OMC$z!*f1oS~5&&gG zkZm(~K_oakf*7DI38F#S5=4WtCWr=QPY?~tq97WSO~G`pdIN~&6xdV%rq?b8QQ&L~ zVt}$Phz4a}5Dm)0AR3g7K{O~UgJ@882GO7_4WdEW8bpJ#Hi!mgZx9X2;vgE7%|SFM ztAl7zb_da*EDxeV*&a-Pk^s98l>I?`P!Ry4LB#-w1{DP$8dMyBXi$*=qCv$1hz1o6 zAR1IWfM`$=0ir?01c(L|6(AZ^T!86+7s2*{iVYASRCIu7Q1JnxK}86N1{EV98dQ{k zXi#wiqCrIphz1oaAR1J(fM`(h0-`}h42T95GawpN)PQJEaRZ`3MGlAt6+2-1**_2k zE`C4^P!R;8LB$Y=1{Fmh8dMyCXi$*^qCv$Hhz1o+AR1IWfoM<>1)@R46o>{DRUjHv zT!HD&D?Wf|P_YH3FL#0YpyCU}2Nhu;8dQvdXi!lGqCv$Ohz1pDAR1JxfoM?C2BJa5 z8;AxKaUdF0%zpn-2*BHL3~hA2%98f@n}N3Z~b}f#pHPDTog$Qb9DRSOw9bq7_7gidPT~Dq=x2sF(%OprRH;gNj=a z4JvX$G^p4G)Bo;+%?A~~AU>!F2GO8m7)KZJp&zILqk17Jp(QPN}`q? diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Knox_IN b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Knox_IN deleted file mode 100644 index 6e66a418902dba837dc0dca0f9c4a3ffa06e526d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2395 zcmWHE%1kq2zyPca3=AL)l9&l)i_BZ5(=dP6&w>SQd<_d{-7YxY@vq^M@|S{3iJTv< zhF)d3rf~Mdb<^z(HyGA`xG6f5;pT&hA8!5I+Hm_o@rOJ2rZ?POIicX*zRHICokax? z=0!I=%nT`bRA<}p*wd`wNt}Gc({P&)&)jVoo}0^kc%d%G@Zyu$hga+j46iQ!`0)DK zBZfEEj(m7~>yAzyH8g{+@xkkf(qpk-LF4;9UWm!`lXSg9`=hz3L5|0-Fjr*Dhw@ z`Y@${`@!S}o|_v!@E#~_;M+Or1OLiN3<5JtJ_vS}FbGwKeGtwJV-Sh7_#o%J>-+8y6NR zg??mE&f5Dy#q=_Rs@MDvYNA^i)U_HvsQ5hW1r*aGta#ub?9A#jL{I~5x)RIRG(f4M2h-o>(5WBDHLtM%-hWL3g z9};{IH6*rI79{B|X-H0wE=b{RYe;psEl7Qv(U7h#Uyy#*t09w}u^@A;PD9qS#|7Eb zJQ;G%|NoF%rp=JI{^5uGFkXg&{=**%P2V#VogL7~QgL8NYgL6O#gKKaIDC;mn z2ppM=je&sygh7gCLD>@j|Ns9V$NX;rhz4ai5Dm(7AR3hMKr|@xfoM<$1ks>O2&NM` zKY(aZW(3io3<;t^nG!^UGA4)yWlk{tU?NyOD3gNtpo|KlL75dqgEB0L24z|h4a&G6 z8kBiKG$;duXiz2w(V&bBqCuG%M1wLkhz4b95Dm)MAR3gp!Sp9Fu>GJ+4&s9{I*0~k zb`TB9@E{tL=|MCoMPo z^L7vgF5o~6P$37RK?NO{-dqi$zy%(N0V?!BG^pSM(V)T)M1u-I5Dh8>K{Ti!1ks?v z5JZCtL=X)s6hSnoUjD4JyDvG^h{<(V&7HM1u-*5DhBO znHZTEnV4C?6o`o(vl5WUqKg%a7)hr5|G(}O0|Ti1W@G`E>qsR!qX0;pLBz*5gaJp{ j&Hygl85kM3oP$HmoLxe6e2w*t^bB--4Gr}S^$fTG$E87V diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/La_Paz b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/La_Paz deleted file mode 100644 index 2a5a15e4c4f03d57dad3c821a9127d1b58a9b197..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmWHE%1kq2zyQn)3=AL)l3;?ed3VT7d$Qx*)hmol|NkG5VPN?G|C|mZ%m4q!4=`{# z`-U($`3HlD5RfJY1_m5PvoJ6)fG|iE$O;f!@c;k+|1;aAQ$RGx8ZZsEiWz3t0T~7s Zu#FsG8+m5- diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Lima b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Lima deleted file mode 100644 index a37eeff7de59cabb56b583eec024d09e7ee6e2c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395 zcmWHE%1kq2zyQn)3=AL)lHiB3d3#D6t{gt^6>!A$vBOb)uM5ZIbq^fp*ST=~KmP$a zi6a4W{jm=6Kfhm4D41|Sb>8C(YN9m YOepaG|LsRW9wfq>3=CWWt|6ve0Mws-mjD0& diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Los_Angeles b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Los_Angeles deleted file mode 100644 index 3b7ce1dceebf9fa9db859068da1fa7eba6df1cfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2819 zcmWHE%1kq2zyK@^3=AL)lGq7l3(Q;Qv0(mg(FqIMv=%I!^?kzWPN@Z#l)n^QN>mfL z_OC?YM#I_(xBgvRaQnanfjjp$FSxsM&4hdVrY^YO**D?Ayz&JPGYcj>s*7Ck*fVIt zlQ`=IPc=;@JadmwcrFwu@Iu{6;l(FofmiG@3a>7S3cP;yPvOnR?*ea+Jy3Wz@utB0 z^?w$8DBLaZvH#wJPxS{Ue9k|x;7k1C319seE%;{NI^ny1%Yq*oiv)i1r!Dx!(IW8c zN3+837ij{2Zlo&wJ>ennZ-=|W{}oyS3^Ozp7&~|bm@2pxmlg6cJS)I^VB!M4o$CeoSFTeKm^o2EuycZf zP-U@zaAuK$NMxvhsAq_Rn5DUZxTcwcgi`PXNlpm`DJIhiQlCr~NIw#vAahAyH^X?_5WI6Kf71JA^*+- z$Ci~7oc#AKa8Bu-;G(}^fvZdI1lP}(72I{Z1l%ugRq*7^5%AnRUBTKkbjYU(B~sNLZ)p)Rg?LH!J^2@H%3j7-doAZlpg|NrMsU}X6JzrTTj1Xi(t>qCo{5hz1pMV7k|N0f+__c3^t#ez19Z zSb}I!feE5Pg(jH(WCC^{sPF{wK?Nv?1{I;M4Jzb8G^n5l(V)T} zOn<%%whvV3gZQ9=A4G!+e=xmyI#?c534r*ZiU34|DgzJ=st`als8RsYpo#%RgDM9Q z4XPkOG^mmQ(V&U~M1v{|F#Sgs9R8q61H=ba93UE0d4TDoGGO~bl?aFrsz^XIs4@Z3 zpb7;HzbzO!I?P-O<8KDnV4C?6o@%=@c;i4)fgDSH5&`Ku7lQcU=aZy-w*~Y^&JDK!ee0M3J4Cd Y2yh9}@io>n(lgNUH8j*S)HC1$0Ot0U(f|Me diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Louisville b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Louisville deleted file mode 100644 index 65e7e190495160865526ee670ff86ae4df373875..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2755 zcmWHE%1kq2zyNFv3=AL)lGq4kOUzrQ(=dP6&w>SQd<_d{-7Z*C{GDN`m|(#vUcZJ@ zH{1(Ocl>L(r2M7eQX=PvOSh*dTwcOia5eNQ!|embAMV_n-f(y2go1nfDjV*178N|0 z7v1nMGo;{Aoo&NoPqTt2aql>|I7bBV3_{z17rKc2TbJ; zJ}?*jOJGU(TfiFdAc4){egV6|p#=6`$pTJ+O$D55r+nc0(3ZgcptXSK=As9@2ht1p zcD6j=U)lUYU}o9_!OqkVLX{p5gfrbgh(u~V5cSmjAZE$)KwOjigM^Z1f+WY=4^m9r z2~wZ93Zx&tO^~_xra<=K`2@L*=L+N(ZcI=pWB8!hI5|Nn^w9_9to096Opkm}^_uuV zO?24@b*i-TGXmW)<(7d;_Kn(P9(^wJ$ZS)I*N}nYJ%Lo>Pgq}zU z`Te;d%yd;k*i-%w5pu^KL>&3}A@bjf2T@Bde~7-<^&qBY>xbBVIS=AerhkZ^=l3AN zcS}KHdv-#S?zDpBbl-#&-im@$cm0Iaw^0S@>VgUBXKe~H**+&^u9YjudUiD-dz#gU zobw+a?_fcN zL`6cyzQqNVKcW(<=Cu}7->^xjsY@@Y-65Ay7w1_}KZ7BGfe`|kn4t^^7lmYDMS=`S zY-DkIvH$BtSH%pa9XJ!U9Bt z3JeepDl|YesNew6puz)0g9;E34Jt%HG^ii}(V)TvM1u+x5Dh9+Ks2ae0nwns1w?}i z7!VCAWI!~ipaIk09)aBlDsVu2P@w~&K?M(p1{FRa8dLy*Xiy;pqCo`_hz1o#AR1gC zff%4d2^6~1|9t>apu!16g9<1R4JxESG^n5g(V)T#M1u+}5DhA{z;v%<0f+__USN9d z6tH=qLJY(Q6=Wb9RG5KiP=N-bL4_KK1{G`|8dSJ}XixzMqCtfmhz1pOAR1KIfoM>H z2ckiR9*71Nd>|TB_&z#07RAs4xWaK?Nd+1{I1R8dNZXXi(t@qCo{D zhz1psAR1Iqf@n}-38Fy-CWr8Tj)F2vESc7O#feoTT zg*J!=72F^iRCt5w&nv+8feLXDA5@ToXi#AerZ?w+P(sPG5VzdwV+A5;l|_@IgaM1v{=Fn#1B*nUu@ z0OErx1`rLZ96&Uvf&kH=N&-ZKDhdz{sw_Y>sKNlzph^QogDMUX4XQjqG^hdr(V$8M zOuvl+y9ZR6fcT&a1w?}?6)?S44lECN?>~5Vz4}@asu%|6%>dDRZ<`t zR8fIwP-O+8K@}E=231;2j8MqT0%gDikZ4vmB*=)wMi!?R`~Uy-vltjabrd5Dxb8x# zwHO6J;tV3-x=X^xH-rIC{ROJJK*7Msz`*4i9AfI~5~Aa4tY@TWpyO+3sAs5Wzy$z6 CPq>}{ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Maceio b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Maceio deleted file mode 100644 index b5201e81d42f9256adcb7125469509a08d77ba41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 742 zcmWHE%1kq2zyQn)3=AL)lF)>*d8e()sM*2q`C!LihXp%7ni%Z5SE6vsVx7UQ*S`$z zNIu+fXJ@3s-QS`H_h#QyxPNz+!GjQEg)h_pZ}`d@r||7Sioth2xdlH0bqszSKdSJH z>(Yi_D}F5a{f5opPj~GC*^_++auwGX$S*M6pkRD{fnsB(ffDzL1lW6U?3%Q{{R2~9~43$8Wc)k`me(R5Df|~5Df}3 z5Df}7F#YEp$VcvAqt{Fp$eiwAq%2Gp$noxAq=8H zp$w*v9|fBS3T+S{6yhKn6zU)v6!IXifKqCv3*qCqhRqCv3+rayUs)q`RW#HW4?aybQs7;^yt DdXpqq diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Managua b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Managua deleted file mode 100644 index 54c8237f3d49fec893fc57a1c8c2adf71161a1e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 421 zcmWHE%1kq2zyK@^3=AL)lHiB31@`KCykK)KN#I;!7a$n;Hq)NOE56}|G#t#TGT`vLh>*@s%zcTQEeJtSP8^VCg*9;6?&cPvO FTmXEVWrF|! diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Manaus b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Manaus deleted file mode 100644 index 1129211841393d0423797f2afee0ac6c696a405f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 602 zcmWHE%1kq2zyQn)3=AL)l8}e8d8e(aciF)o{$a;ozYRM-IyvmR*JNd$Zpd+`qfR;X#O_!Iv4l2fniA7<@ZWF(YjdvcD0T*cE3@(Y{~C>Y<}px9XMpu~M`gU*4&4!UWV444@4 z!vFt|?_ps0|NrU*Mwb8oj~`&*^zjX0aP$oZ5g{O7FfcHX;@AKG|NjU17es^n45t73 zZ2-|Azk_Iy|3Ne;48Zgo4hIko3JWm3Gu;40gTe$vgTe(wgTe+xgTe6R4FCThKfu7^;~T=@7#spp#6XHc R|NsC0kJm6R$KVhXE&%R6AAJA- diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Martinique b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Martinique deleted file mode 100644 index c223ef5c2011dfe531514dba8262ba3be5552625..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231 zcmWHE%1kq2zyQn)3=AL)k^s>l%sX-M2^V4CJO>dIu?>t&jQ{^1+rz-{|Nrp=46OhE zU%kM{>E`Ae!r&Mj!rR7R`dG!hA?2Uo`HeOF*wA83jm9-HxK{- diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Mazatlan b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Mazatlan deleted file mode 100644 index 6486aa1a64e8b5a22ff66067c4b86c80831fa74e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1534 zcmWHE%1kq2zyPca3=AL)l8A+}MV4-RQLz3~-h*vvVF}xvFD2~YF-zF-x9!8}SA_{T zCT{t_z);X&nBF2_R4mqD?4BlI67-|NRNX_s%;;8wIlGpCh4gm@i|0H7mcMT@SbY_m zV7=`kgUtr63AVfEGT8OMnP5M=p1~pi+yuv#*$qzq8zwlX)Hb;2PnzKB65rs)Uoyd6 z#j(Nt$3y{77Uc%d8^r=%PgongcZ3S~oK<4*onbEEx0Z#$zd}+VpywGwV4~@Spqvv7 z!H(h+LVQ*+gev@;5T?_^5YBLWLWJmwhKL7yCq#bjYKS^8e?s)toQ9Z{djw*)`ZdIL z&J&2AYS567*&vWu=gW}fnIw=Lr_Ye0=^~J7C&-W{lrSM(_A^8JC#MM+f3GrRUQ(Hm zb$2^M_9nIoIma$H5rSw?LIlyE#0a862@*tu5+#TR zB}@1|?h&4NAOV`o~1D{h&k);)4=0 zhz2EQ5DiMuAR3gYK{O~~gJ@9V2GO7d4x&Mc97KZ>I*0}(b`T9p@E{tL=s`3n;e%*U z;s?>73;?1*nE*^b*gFA4gE9k%24x5k4ayWC8k8|WG$?a`Xix?L(V$EMqCpu2M1wL5 zhz4aC5Dm&SAR3f$Kr|@xfM`$#0@0vM1g1YZf$axnCJ-N#p+Gb!Q-Nqu#sblx%mt!B z84N^&G8u>lWi${C%4{GSl;J=$DAR#xP{sq%pv(uNK^YK4gEAqQ{?!YP4^U9=B^FKUH`rDk6d3FhuRXA9>*5W& ze{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9pO(RK zNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^Q(!F5OMaILga-ggQ&G96ry*Q zZHVbzr4TzaVnbYRk3xK<)rN$y6$=t0Wi}+4buCD?__rZNEN4Ng#Dfi~-~1M&GyXM5 zzh2N-z4;zG{8Aq6|NsA@ zIh$BOG$?6MC@X+yP<8;(pezBRLD>RCgR%yQ24xR0{Z9*QA1IrE_@Jx;qCwdOM1!&nn10uG z07Qeb4w&BX7R(1_ArK#wjX*RgD}m|x-@x*qECu3&vK5$qHXrOCQ1$}xL0Jq$gR&Wj z24yu64a#mH8kFTgG$`AFXmHj8F?viKK!FU(f*=}{4M8+0D}rcHb_CI&ED5GRlq~?! zpsWd|&mP_YqCr^{M1!&^hz4a<5Dm(%AR3fqK{P1af@o0I1<|1F3!*_;7);-(R{+tV ztPG+-*%?HGvNVVWWor-(%Gw|rl)XVTD2sz=P&NnApsWs}LD?NdgR(q`24#B?4a)i; z8kGG(G^hvw)9+Zo_JfK75Fb<=fM`&W0HQ&~0*D3`4Imm+Jb-9W5doq>#RP~36%`;F zR9t{)P>}(mLB$4$1{ED38dQ9MXiyOXroZ`t!xvPPfcT)|1Vn?16c7z6RzNhUXaUin z;sr#5iWm?LDrP`5sHg$apyCEZgNhsw4Jvj(G^pqS(V*f7M1zVT5DhAZKs2Z*0@Kg8 zg53iul0bY=u>_()MH7ey6;B`;RhI$7220FgRdd46I7XU+0)+GP{ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Menominee b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Menominee deleted file mode 100644 index c07a950c7489bd66e065af7a9a90a64f01e7eb60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2241 zcmWHE%1kq2zyPca3=AL)lIVl7MdmHjX_&w3XTgFtzJ`UfZWo;H_}6er`Afm2M9vSF zOFuJQad`dVC%;$2FOKvN|8{6IusPf>U^lo>z}~Cgz$vh)fOG9)2CffN3b-FkZs57O z;REl1(gwbrlRogToWvk7v*d$dX9g^U53aHoFw)*F`oM zOjau}OfO?FD&{CKc8_2%33^pvs&2(#W^|^&oLz>&Li)uAi)a5BEPtQ+V0G*PgZ1q- zA8gkDX|Ubh_rb3JUW5JYf)5V)2O1n(dJCNV7d1GiCpu#yloAs?zRP~Z!;Rw)#VG)&w4dvvNINBuGMMCdiJ;= zdzvRh&iVfza?7+C^4356kRQg&P|$z)L!s$=hNAqXABsgUGL-nYe<=C)wxP^oNkQ4Y z^9>aeZ3PwkHa1lL$SA0qH@TtuhF3vNU1>w@4xNI!xbTMh8GHo{j0}uS%#0w41w;%i z{{MgH21bVe|5qMhJl;x3DoV zFn};fQ9qO|@&Et-|B25P_6{gpqvS!LAet|gK{W{2IW!^4a%t?8kAc>G$_Y{Xi%;N(V(0Q zqCvSAOn;I9yAPC$L3~h72GOA045C3f8bpI~HHZe~Y!D5~-5?s2!$CACmxE|fP6yGT z+zz5aIUYoVay^*-cM)tKDEEW-pb`K?gGvDq4JrvhG^jKH(V!9mM1x8N5Dh9BKs2ay z0MVcl0z`vK2@nk`DL^!+v;fhd5(7koN(~SVDmg$jsPq8S&;EfZa47;}fJzb&4Ju7Q zG^j)Y(V$WVM1x8e5Dh9_Ks2a?0nwmR21J8O8W0UCZ9p`r!~xNuQU^?b-VUO`r4NV! zDuF;Ws1yRzo2x+-xHJMWKqV5029-)68dNfYXi(_{qCq7Thz6BXAR1IsfoM=^1)@PE z7KjFwT44GQBRKp)r5A_~D#1WBs1yU!M?oZ{Gy}0fB^rnZm1-awRI-6+Q0WGuK_wiB z29ebsZzEV9RH}mbppq3tgGyHr4Ju(lG^msX(V&tRM1x9OCPpSkCT12e z#R_5%EdKw0?Og^2P~pnR0xoosid#kjkT`>gk8cPAj)Io~T=Ft7GH^KuhnP9Lgy{Gh S>lx`8==d5M>KW=8Z~*}3S#LK0 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Merida b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Merida deleted file mode 100644 index 38c794c65994cd8bbd3e0c046a1aa1df14b729b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1426 zcmWHE%1kq2zyK@^3=AL)k_d;g1(t5Rl_1u3H9^A1JHRl#jKQdwqrlibg25!{Re`Cx z6@!`4nF4cm83qgK7auI1{bR8Fed>eNSC$6rZHGSCtpC$sySwj$UH`oX``HB_9P$q| zIJWc_IQcJXa8AiDaM5pRaCHeRaN|#Fa91%daR1TF;K?Fd;CUmJ!Rzt&0`DE}3_fRt zKlskjWbj+_^@D!}H$yJ33TJ3jEFn@VX&Pr}jfQ!`X%i(OCr% z57swCeyu5pIxw*z`f6N3%*u5Pv0EJq;yNcV#7|W!NXRT=NUXE_kmMP{kQ}G*Aw|=S zA=QrQLz+-fL%Qsf59yyw8Z!PK`;d7_tRd^}iVxWve>CJAJ6e!C@m53LvgHN&g?kzb z+Bypgqi!-3rDYcsTkU2jaq}%Gm72>?rl0wt>{mTQ1;6))id%^cmG5;wRPAzRs6NmC zp=NP>L+!ecAL^PN8|wQme_&){WTpZ9|9|x#28RFtS1({-`Tu|C1_llg$;jj58^Yim z9Kzrl9Kzu25(0{5FeW8A{Qv*|KPX9nG=h=^hz2DM5DiKmAR3fJKr|?sfM`%s0nwo3 z0-`}l21J9B4TuIM9WeduABX}cArJ$Uj6gIfDS>EEasttyBn6^D$qGb+k`{;tB`**S zN@5@yl*~XhD5-&HP;vv&pd<&PLCFq8gOVPY{?QDgz)29q03|~Z4N8h28k8JCG$=`e zXx|x{APSr`K@3px1ks=*3Zg;D6hwoPDu@OpR}c+KvLG6iY(X?A>4Iob@&(bLBn+k> ztZx9(prj0X>Wfu?)$}%7tlx;vXDC>Y|Q1$`QpezKYf7OF1a8?2_K-mdIgR&He24yP{4a!;| t8kD_2G$@OKXizo-(Ss;E*^?(X|w*MG0Ues;kJhx`K#jxD_f zPX3D;oKx}(T=ZKSTwMYS-1yTP+*OPV+{f?@xXuX-@l%xw5;BVz66@?fBzcA~B*!UyNYON7NVQ}7 zkR}w=kS_b=L;5F^hK#?*K4e}JYsk90;zRbv9}PLjjuzxjyw#AmY1Tc@`&G|S!SDT{;#ML<<$K)^RlA%Ss?YO(s97A} zP`mEqhq`9RhWftC9~hZHkeP{@iG>M7QXl{SznF)C;s5`+6BtH^WA6b7O}sSHg2 zZTkSCL8%QygHjxb2BkVM{pxN2hz6xTFugqt%m<}H5FeBhK~4mvMi323ksunBDnT?T zWrAo>>IBiC6bhn2sT4$mQYx5!_76mXQ!I!9O0^&wlyX5dDD{G9Pznaopi~T^K`9wT zgHkhy2Bl~a4NBD@8kDj@G$?h0Xiy3V(V$cgqCqJgO#f&GQQ#C0Vt`UThz6y65DiNG zAR3edK(y}+O%Mgn2_Ob2H-KnRjsVf1Tmhm%IRiw4atDY8uo957sw;Xi&}p(V*M|qCq(bM1yh>hz8{(5Dm&rAR3gTKr|>uxA zpj-)}K{*pdgK{T`2IWu?4a%h;8kAE(G$^-%Xi$y?)4%FL6gcOC7@*t>qCq(rM1yiM xhz8|k5Dm)BAR3gTK{O~=gXqDZv$>puL(H6ALUeph^bGY3bbJjB^i1^(xB&az;@AKH diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Miquelon b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Miquelon deleted file mode 100644 index 52cd391ebb47d355fbd854acf204050d6336d51d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1670 zcmWHE%1kq2zyK@^3=AL)lE{Fvg(hyZSRtI3d_bY}$pyv6atEc*V;7XOCLd5SU2#Fx ztMq`HXx9aGt?&ct|CR@6a#SoKsvKT=b&?TwT;1TtD|*aMyJ{;C?yp zf+w%)0ng0=7rfrGAMl=&8{l(I#lg46KfrGrn}dIhVL-st7Y>0o!T~|0ryPQ%zXpVa zu5k$YeLWz|w9g^z$>$3Za;pwR9JzWS@?Xz^s3qGkMBmFh5YsaALhQbP192(U7vkp` z9Z2w<5s=vK?~tTh6_A{6=#au26OigI?2!7_E+Ad)t3&!(g@8=9>kgS~nF6w&?R3bV zCU+s{{M7@wWegYc)^9(MANuG*LI2DHg{DU?6y;YRC>C9Ip~OG-K*_(u0c93d4rTY2 z22@DII8^Lw52*ZM=TJ2-Gobp0f-GKV(PaGJTnCSxl|34kU!0`Y7 z@dFGj|NmdTz`*hU|KkUYygt4m435De3<17i!X*Thdcc^JRQCV>|No$r2GR&hZ6F$y z;y^Sg)q!YG$^+4$)CZzLDG)@1QXz;2r9==7N{wLp-|_$u4N8?@`d%lP4@#XNJ}8BP zXizEz(V&zHqCu$@M1xW+hz6xv5DiMXAR3f8VJ zYB2rm@&ynLO5GqDl)^zYD3ya~P)Y~UpwtecK`9e2%BZvm&NDvLmm0(iD93_mP_6~hpqvY$LAe)1gK{v42IXQ94a&(N8kCzs zG$==dXi%;O)Bg^G%?IUf5FeDoK{P0rgXw+kV0ln(2k}8U9z=t3J%|S7d=L%F{U91t j0)XhjT?%l43I^iKZJp&zILqk17Jp(QP1?#PV diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Moncton b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Moncton deleted file mode 100644 index 33125756544b29ad3c1d80c9835a8780931e4c40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3137 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Montevideo b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Montevideo deleted file mode 100644 index 40fc865b014760a9dd714c95f8b7c2c1bd037062..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2118 zcmWHE%1kq2zyRzF3=AL)l4ypqg%?d~U$c@?b;rt&{2Nw1inLgL$=P7d;hr69Hs%C$_)qSPO~@^AHCslZH2`Vd)p01W1}pN$;)pz zZfj$4g2Tq(q^z99$ro}4r@H4`oDTKfa8~ZD#o4Lx3U9buH@x|zr|{O*Ys1^tYYN|m zi#B}!C9Uw|bI68YoW%;iE}L!m{c72QKmY6u{(etd@$Y`&hW|IFX)qjEYQVVj+g|-<8=eaLXJRD-6WNo)VdEt`{Dw5|F zRK3zSsD3D0psvVopnf4@fhL#s2F(pt3$z|wHqf3Rv%t~kn}L&?{sCu?#TQ(J=NxdA z_YQFVTz9~oBmIK=<%9zsFFY@JZgx80bwc}s_ndeKpB20pd}|yX{Mz4N@Q+b;2q@$U z2()2!2nu)?5G?)NA;jQ9K*;Zt4q*bD0>Yj=JrMq3N)uOUXSDUm12G!MDpHG1B5fl5UPevZd686kb1vREa+qQr{Xlq%%ndq@NXX z$awfWAal(ZhpdBl1G1+H9LQO?KOndC(}BFkg#r1YR}K_p?Y&TFy6r%b*Zd2`qB9PZ zXf<9a`M1@fj4Sy<*}drw<*!^XRP3vCs63^9p=w^VL-l5tfSNj6huX<%0d;Zm4)w(x z0Zfb#$jk_W5H^@(WkEnT77%1*VM7Q}k@f%o=@15n|NpOEU}X9K|J(@%E*N?B0*L+i z0VCi4|95UMviSOjFoZ^W1cOKr4h{jOYeoAs`x*OF%Rzr+{csZUNDt90Q_3xdudoat??F5Dm(WVEUIdSRRxsL3~io1k;zzz~KPO zp&&jemxAcO-;-8=XmD-?F+e#M6uJkN8h|KJ&IQq++zY1P9$x^WLAe-2gK{#62IXcD z4a(6V8kDO+G$?0-Xi)A3(V!d-qCvSFM1yiVhz8|$5Dm)lVERKD*d9>M2k}9yQ2|#>MX#k=@B?5>Bl?oslR5E~Q7vVVvKs2a?0MnoAzv-(tznFPr>d1l{g?isMG<`pppkfgGwI|4Jv^^G^i8;(V&tDM1x8r5DhAk zKs2aS0@0w72}FZRClC!Pp+GdKlmgM9k_t?}H2}K@RAPbnpi&D&gGw$C4Jy4rG^hjv z(V$WcM1x8)5DhBLKs2aC1JR&T4Mc-VHV_Re-9R*`gagsVqBFq$1(kFlKB%+<(V!9! zOy8Rhb`PlJ1MxwnABYB(fFK%F3W8`*NeH4rr6Gt0m53l3R4RgKP|3*1%mjffOdtqh zgGn}41Y~CgK{i%)gb)>3u%hvF2m=eafaCxdjeIcj>IDYA|NkF9U=#uukQ_d~Aq?0H jNd}}+l7TBUGQ>DEGB`xX*U&)EP|rZe*I3U;&wvX6BSQ9E diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Montreal b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Montreal deleted file mode 100644 index 0ddffb2f299ab9101af2189da58961d549f80f5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3477 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 U_!{dO=^5zw8XD>u>KSkW0CRzqhX4Qo diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Montserrat b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Montserrat deleted file mode 100644 index ee5043a8e3f98481fc2657cf5685c37854386b14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmWHE%1kq2zyM4P3=AL)l3;|gIVOHF6=3}T|L7V9hX4PMA7Ehd@eN^c3=RP)Vj#t! R|NsC0$7>juV{nKG7XWrB9oYZ? diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Nassau b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Nassau deleted file mode 100644 index aff956c8ec7e7a045c4f1069529577827da63ae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2270 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/North_Dakota/Center b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/North_Dakota/Center deleted file mode 100644 index 786ba1778acb3787701c32d0797fd85ea6039cd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2363 zcmWHE%1kq2zyNFv3=AL)l9&o*OUzqlHDUg4_J##*G7}cgdf9NglV`#uuy6v;&HW6#2bw4F?Oe#fzjA?qz|3X_!OkWD zp~_SS;mi~Pkw|w2QBOAkF-uJbaZL>Y2_@GCNlq>SDJJy>sZVMXq#toM$Xw!>Abaq2 zgWSef6XX}3ZBQta6;Nzk-=GxwUqCtQ41JFmP!Z?j8*eqCgP!DO`p!}Kx+qhgK%WA_LKlb}}xrs`G< zW=3ZU%-LlaETmt2uz2>5!SeU14_3z>Fj(JS^TB5Qp9b6AeIM-l?={%ZF8JV(f1ts! zrMJMze^G;TN`8TheoKR^OJITP=j{ycy15_RFVAG~#gAj?>W;Oe6INw z_|{Z5_-!*N@Q;aZ2$&{R5NKoD5LEi5AXrAeAtdx#LC7D*hA`6|1z}I+7$W4Ze26&8 zz!3Rw+lQznj~Jrw&G-=0a)cpvU)6`Wlw}O@^I|?E_#SFVY_BXx(p}P!oE}|}!rRu6 z>TX+*`Zl8>U0uE){j66*COcz6=31SGtY?o4vZr}6YzyQJ^Wz(Q+ zng9R)|Bqwg*#M$J84W~(G8>2nWjGKG%5)$al<`0`DD#2oLw)C5uB%nxFK3IGrdDg;0@s2~8-pVYwa0~H7$KB!Ot(V&6>M1u+k5Dh9I zKs2b30MVd=0z`uf3lI$|FhDe@&;Ze(f&)Z@3J(wsDnP*Wzx!bOKm`ei4=PMRG^juU z(V#*FM1u+z5Dh9^Ks2a;0nwmB21J7j8W0UCY(O-qzyZ;qLI*^H3LX#*DttgRr~m@d zph5^lg9;)r{p=rz0vAXi2B=U1(V&6}M1u+^5DhAzKs2b30@0v?3PghnD-aDTus}4Z z&;rq*f(t~03NH{1D!{<>=j|X0T#$hnpu!A9g9H2ckiR9*71Nd>|TB_C2A5uy6v;&HW6#2bw4F?Oe#fzjA?qz|3X_!OkWD zp~_SS;mi~Pkw|w2QBOAkF-uJbaZL>Y2_@GCNlq>SDJJy>sZVMXq#toM$Xw!>Abaq2 zgWSef6XX}3ZBQta6;Nzk-=GxwUqCtQ41EYl7|WxeRvwZzkB!u4iz_KhWUV z(p%uUTuj)fw$})!dc`+Xnd=E7wwpSJ;=`LwVPLD1~;caV3 zb+;`@eVfsct}b7Ye%7lYlbx|3bFEH8*0aY2+0#53a?bz%kXxqBkhlKfhx{;JhJyaX z9|}$1GZf`7{ZK4=k)g!D{X@yWw+&?$OA5;Foo}d+Xe+4Lx3Qt}M@B)_yvYsKH@pgJ z>Pj1Gcjy$<#f3N2&)_RyU}RuqVrB$URKct)RDl2guU^2&@c;kZ2@EV?HV2sG`Tu|C z21Wr8n?c0aC4|8@IE2ABJcPkFAcVo$C4|8_I0Teo7(oOBBLf4D%*D>YzyQJ^Wz(Q+ zng9R)|Bqwg*#M$J84W~(G8>2nWjGKG%5)$al<`0`DD#2oLw)C5uB%nxFK3IGrdDg;0@s2~8-pVYwa0~H7$KB!Ot(V&6>M1u+k5Dh9I zKs2b30MVd=0z`uf3lI$|FhDe@&;Ze(f&)Z@3J(wsDnP*Wzx!bOKm`ei4=PMRG^juU z(V#*FM1u+z5Dh9^Ks2a;0nwmB21J7j8W0UCY(O-qzyZ;qLI*^H3LX#*DttgRr~m@d zph5^lg9;)r{hS9JAD{vW#0M2hAR1IKfoM?S1foF&6o>{DQXm>sP=RPrVFjW=1r~?~ z66W{qHT#nHZUvS-=#CNik+)r2_o_f5BS@22csj$O10E;U)L# z1)!39=LSX*kSv3Qk8cPAo-!O%e1p8o$iTqm92{ci>=L5mYpiFaXQ1P2XsBnXXTSvj Dt7C7m diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Panama b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Panama deleted file mode 100644 index 3a4ff2aecf898647d8f22a8c9021bd83ce5d0003..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177 zcmWHE%1kq2zyM4P3=AL)l3;|gIl8|jzF_?Sf2#xo!~g#~H!!d``-U*M28VzYG2k$W znSp@;gh6UR27=f;|NsC0pV_V^0HVQ$GX4L*wE$%5RtW|cu-P0wz99_A<})yGxdw-r GasdDgKPQj? diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Pangnirtung b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Pangnirtung deleted file mode 100644 index bb428471d71a8a69a616de9bbd032bcd6f356905..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2062 zcmWHE%1kq2zyMqf3=AL)lBj~RH5XqEYB=5TDB+Uwmx4?nxYQCT*I^%)5R_X=ye_InYx!f;k-kYAF^-A-C z_P)vloy%?ky7QtF^fqe*=-1gM7)+K(FicPXU{v%g!PwpNgGtbx1XFeG4`xRD63p3o zKUhfLdSLPFAA{xZQy;93UHo8ud)@<^_3sL7cQ-t+>%UN7KRfAxL;j`$$Cmm8C;ur0 z&MAorF8XB!t}f0AuAf(YaMz80;C{L5gD0=!1JBJlAH3cwKk%N@S>SWcA;GsMyTEUo zQi6YsZ$ZE`mV`hX{eqyYFf(0R=ClW$_e=Z0!U6l~_l>bA7+_47{M?QXt{I}vk z)RM~|qVIJ*h-umSA$DKRgSeFGAL8fvJxK7~Qjpl5osgtEtsptwHz9?$q9D~>KOyyP zR6)ABU_$y?n}STX&k31p*ANub@LI2hVg{BWa z6y;BUP%L`rLy3RogOY#u3(72}C6wJeSWqERkx;R3aY5yesD!F{tp(LLY!Yhf(hF*L z$R*Upc^1^qU`SwQWMXDvX2lEH*rAYv6UL$f4N7hd4FCUMy}-xM#=yGcWz*i{r`XU0tQ78n^Co@s*1reJcPk9AcVm&IE2B`#RWu!Fu1ye zFt`SXFgSy-O9%r410%#9Bo-;z;Q#;s|3O&+M1!&ehz4Z|FrD!B0*D4>4G;~=9w5s= zSp-CbvI&R=Wfc$&$}S)plx09PDBFN&P}Tv_pzH&tKmJJo(V%PuqCr^+M1!&uhz4aT z5Dm&!AR3glKr|?OfoM<`1JR&t2BJY(4Mc;o8;AyFIS>uXc3}G7R<8k5vLJ{C zWkV1R%8DQwlpR4dC`*E9P__iopsWd^LD>^TgR&@y24zza4a%w@8kAi@G$_l0Xi&BV z(V(mgqCwdgOh5YvqQKc0!~kVw5Dm)CAR3gVK{O~^gJ@9J2GOAG4WdC=97Kb%Ifw>j zbr228?jRbJ$NlUFmU|;f9?bW@BjZ-FEH@>_=Ye9_=Yg}xw?li1P6tHOon4p jT=D<^|NkJDfM}3wKs3ljAj3ee0@2iS8CP&nh%pxcx_VOk diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Phoenix b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Phoenix deleted file mode 100644 index 67589026c21c6bcb83587d25342c93f10570bc24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 327 zcmWHE%1kq2zyQn)3=AL)lHh`}dFCy%nlOJid&7b@nF$MLy=*w$$ur@+_`2T{u4C!#Tig9v|Nj2295@FmU+>hnRB# E0Gj1`V*mgE diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Port-au-Prince b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Port-au-Prince deleted file mode 100644 index cd104790f9cdecc8698894e395cd7c23be7acbc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 711 zcmWHE%1kq2zyPca3=AL)l2C@SdFSL6{*jb+yCB8*-a+c)y8!8j7ae3SUI>sqxYa#h zPtba0{y=+QWrEJ-kObX%(FuB+%@XwMY!eJ7OC%VkM?Nqr`juepZvDU{=uU!@e?@?E zimQW*epG;~i@F07BOEfbU_y}W|Nnbj7#RNlKYoCb_5c5!8yGl|*#QB*Aq=iAAq=j; zAs}BeGJ;439O1#nz`y{)AT=sbw&4H&|Nm#U%LjmHP}qPZLE!_UL16@@KfVh9(V(yb z(V*}G(V#E`(V%bx(V(yc(V*}H(V#E{(V%by(V(yd(V*}I(V#E|(V%bz(V(ye)Bm<6 zfM`${gXw$I!F*6ygZQBE2GO7}2hpH#2hpIg2hpJL2hpH70MVd$0MVeh0MVfM0MVd0 z0nwm%0nwni0nwoN0nwm1Vq|85Ll#y{2$KE(e~$qulJ>YTuz;h76C72%$ZQ|q5C-(< PVt~dM1D9)Xh$$BUCx)^v diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Port_of_Spain b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Port_of_Spain deleted file mode 100644 index bdedd1bd9bc85cbcf8259b6eee3aaa5ab041e954..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmWHE%1kq2zyM4P3=AL)l3;|gIVPJMuVMWE|5ykE!~g%s4=}L!_=Yez28VzYF_2== R|NsC0<28)SF*wA83jj2X9O(c6 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Porto_Acre b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Porto_Acre deleted file mode 100644 index edd9a57202e1e7f5121c8585444b234d990d4a0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 574 zcmWHE%1kq2zyQn)3=AL)l8}Y6d8e&vo3MjFjbX>%m;*aM1_bQ7H^JeS#i@W>Z^Q!b zNdCQWXJ@Iy-QR`*_h$ccxPNzBz=IHfhc7dvFMMUKa`<+jA>cco)qx*@9sxg&KXmxT z_3py2l_CdzzflVK(>?Qm?8#LDauuHs$S(-IpkVy^fMR27fD-qU15Au~;Q#*z3K$sv z|37|!k>&sYof{Z9eSAY09G!zfLQy zYY+|cIhcMU7676_ApoX#mO6lFP)LAiP-uW?P>6tNP^f@tP{@F2Q0RbYPzZr&P$+?D zP)LF4;}5~+fkF(#2Zb7l28A4m28ABTtDq1B(V$QS(V&n7(V)--(V!3o(bNf5E=T7O GQ!W5e0R3zL diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Porto_Velho b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Porto_Velho deleted file mode 100644 index 12774792326b5bb730494e6d2139c30d98eafb71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 574 zcmWHE%1kq2zyQn)3=AL)l8}Y6d8e&vda;8){KJmFej9dvbaL2rugTz+#U6)SZ#W$8 zNWMRCXJ@*>-QUU%_h!E_xPNzr!-EhRt`UoUpDx~ z_29s-m24Y+zY%fx)7`y6_T(G~xr(P7l%yasi(Sb|KUkWZIyuHB0$ngLF@dFGD|NmdTz{mn7 zIUIvS7#ssa7#zbx7#J8q2#4`33=9k)3^E=>gRsE=|NsA2J)61{M1!mX(ID%zD`K1?a#elWR#=jMhFya!4f_;ybEz`t@5gTTy^4}zT~3__J*AA~c*7(^m1 zK8Si+Fo;=7eGu1_VvtZWFOcN;!yv^ZSs?XEqCxuM?*f^NzZzr@-Yt;Zc&9;r;r;@J zGJXcd#)Sn+p&uEPv-W;aF}=*7>NWp^n&?&rb*;t^>i;e_XmTZg(7d;~LF<+42km`R z8+0xw73j_@Z_wN9QlMWK*eNu?Gy+x7U2IS^uZOc6Z+gyZ(C(_OlBI= zFGxS@)sV@~Sdh6^ry=XvQ28UHplaUahUyz$1vPc04YfOT3hLs* z8|r896)-R|FflVS3^4rvf9D29hX4OpFJNE+vpK*dkF!e%gL7~QgL8NYgL6O#C`B_e zFfcIUNcpS`3=AL)Qr8Y;i~Rrp|9{cDb`1~>$^{@AloLQSC^vv;P>ul6pj-i_6FEPC z3<2d15Dm&9AR3fQ!1RYH1t1!fTR=1@$AD;1t^v`YoCBgkxd%jpauA3HepqvGwLAeV=gK`*%2IVpk4a#X?`jbQhhz8|25Dm(8AR3hOKr|@# zfoM<;1ks>e2%BZvm&NDvLml^`0FGeI;ccYX#k=@B?5>B zl?oslR5E~QQ0V}oK_vv3{=6MTflCSy15{doXi$j(rZ-oEC~(OEVt`5y5Dh9pKs2Zn z0nwn61Vn>M6A%q5Q9v}PQ~}YTk_AMAN*53fDq+C%A4YKagGw3@A5_|aXi$j*rjLS1 zNXY|Yfl40`4Jv^^G^i8;(V&tDM1x8r5DhAkKs2aS0@0w72}FZRClC!Pp+GdKlmgM9 zk_t?}%>cUxRAPbnpi&D&gGw$iy;cV-4=TYxd{8L{qCq7Yhz6BrAR1JnfoM>v2BJYF z8;Ay#ZXg;|!hvW|DF>oKB^{Xl_ZDnEsKf*DL8Tsu29^`7S2_ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Rankin_Inlet b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Rankin_Inlet deleted file mode 100644 index cbc34996980251e1a3c14c8bcbe20184fee616a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1900 zcmWHE%1kq2zyPca3=AL)k|>9=MW6TNF?`qeN%)~r{y;c0j6o#Q;)AHC1%sHS)CX}* zDFz88^8!hZKMYb#k_A$qBpRe2{w|QY_^Uzo;N1ebjdvR47w#`mDC1{PY+P8N6#9`t zIcx6+71PTMs$TOysEKZ6P}gewp#JY-gC)l zE(Q8^kqriu)d~#L%NUG`ISP#3BN$AAUKNjh9A7=OmFbH=2zfbQ`z9R&7i6e0F8Tp2g&}#)De;6CWOm`H7J(XjKkh}6B;wS?{l*j49+etAq>vJAq>tgAq=j; zArKv4l9aUj|NsC0p!5r(L1`F7gVHg`AW&Kc(V+AUqCsgIM1#^bhz6x?5DiM-AR3g$ zK{P0xgXvEa4Imnn-a#}d&4XxAx(Csqv=5>|=^sRc@&JeiH zfoM=(0@0xS1foHC3PgkQ6^I7qEf5XLUmzNk$3QeFpMmLT|3DNtzkwK_JO`pd`3^*b z@*ao=CM$33Y>323{c($(V+YbqJ3*B!QltW#~?l^FN0`Meg@H?JPo2j`5Hun@-~PD zs0cR1Sb>P+0(?LFEC6 z29*gQ8dNTTXi(VzqCw>Yhz6ArAR1Iofa$jxVE2H^3lJYvW`Jl=xdEov>VV}z`ha(eX9b RGtx8A@ijEmGt@KS0s#K9<2wKV diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Recife b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Recife deleted file mode 100644 index 0903a77195358dee8d7cc3baca3ecd4ecdd7218f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 714 zcmWHE%1kq2zyQn)3=AL)l2C`Td8e&P-?4+=^TCe44hwdEG%?t9uSDUN#X5squYVcb zk$kw}&dx}MyT3&Z?#;fZaR2Tsg9jnT3SXxG-|&?+PT|{u6oc=4atnS0>KObuepKNX z*QE`=R{U7-`wg4HpYGZPvM2it#Em110Vg3zQ=SHYh(TP*64h zv_bXCaRu{l$2M5(XjQPh|JcCtCI15J6aP2ZTV9fPBlqz(7iv{Qv*|KPX&4G$?Gq^k0VsAQ}`#AQ}`-AQ}`_VEXkh z0}u@gGcdg~QUOGR!VW}(!Vg4)!VpA*!VyG+!V*M-!V^S;!W2YA;w$)E@~g0 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Regina b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Regina deleted file mode 100644 index fa9c6eec2fcd0657018bb99e86a84ec6ebcb6a01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 980 zcmWHE%1kq2zyNFv3=AL)k}!p`CEET@mYKI>{e<}kd>gi=`hVDF;PGI)tKo+o0$LAt zstSMD`GM!bZa#y8-RIvu*z-=PVDC=ughNFf9}XwJesCo4)rX@NlM{{^p80TGas7i6 zQZEZma-B&y`RjDSsaNX~PIvN5xTO50;8LOl!{y{2fh)oJ3|B)R3tUsU!*Jd7sK5<| zeGE56mkZo{uz=y#zrz!5A82B@b8qQ{yDR54+}qba;eKaB!-IL56CP$JH9V^Gp77Yy zrQu1O?u4hBY7Niay#$^MIWxRa*AaN}NtNOCvkwAqu3ct$d+d?`6C+m0%z{-IqL}sn z|G7^X8221O)@21O=_21O{C{&l(lM1vw0 zM1vw1M1vw2Oeab(fM`%egJ@7>gJ@8MgJ@8sgJ@91gJ@9XgJ@6!0Mic^fc1kC0*DVv z3?LemAV4%IQGjSr!T`~r!~vo~2?Rug5($U~B@_@1N-Q86lwd$KDA9muP{IMxpu_{B eK?w*a}*f6M=+QKy(%zOw_-3eI#XcIF2i6U{o;egvwsYhzfXOz zI`)9U`u3U+HtYX1*zWH8VAp@I!G3nZ2Z#Iv4UR3n1y25p8k|$|3taSD8eClh3z!(0 zn2CifNGe%CA;rM(|Nrp=j4c2EuU^2w`TzgU4UD`Xl0mSls*1tc#U+HnIXHyD*(HR* zH8=#K15A<<3;+NB{||}@5DkhA5DkhEkU^kW0nwnC0nwn?0nwls0@0vY0@0wD0@0w@ z0@0ut1Jj=*8bCBC=0G$k_CPc!20=6^7C|&9CP6ePHbFEfMnN8kAZ1Y2y6gcI87@*VxqCqJLM1xWh whz6x35DiLAAR3gSKr|>-foM?50@0w<1)@PI3`B!c8HgUZl*Z*69Ae4^0At%m;*aM1_bQ7H^JeS#i@W>Z^Q!b zNdCQWXJ@Iy-QR`*_h$ccxPNzBz=IHfhc7dvFMMUKa`<+jA>cco)qx*@9sxg&KXmxT z_3py2l_CdzzflVK(>?Qm?8#LDauuHs$S(-IpkVy^fMR27fD-qU15Au~;Q#*z3K$sv z|37|!k>&sYof{Z9eSAY09G!zfLQy zYY+|cIhcMU7676_ApoX#mO6lFP)LAiP-uW?P>6tNP^f@tP{@F2Q0RbYPzZr&P$+?D zP)LF4;}5~+fkF(#2Zb7l28A4m28ABTtDq1B(V$QS(V&n7(V)--(V!3o(bNf5E=T7O GQ!W5e0R3zL diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Rosario b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Rosario deleted file mode 100644 index 1a335d43688394d001fbe287999c9bbf1fc1e1fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1908 zcmWHE%1kq2zyNFv3=AL)k|>3;g%(ZfH`rDk6d3FhuRXA9>*5W& ze{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9pO(RK zNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QVY++ejp>%nCM?U~^U=HHHOu-LD) z!M&VwgZrI&1&bM}F;DbS+tMY=N zfJ+9!s;mn_47M1AvOHf9CNRw)>>Z0j_=gIEh_lZWA}>T4M6Erc5WTZ(Lrm`~h1i)9 z8{%?%6yhtbHY9|tSdbVgvmwc>YeBNbzYQs3ISW!H9&AYc=C>f7@vlMpHG>5i5APdf zZWCINb?~4;_I!PXoP~=Ga_a>Z@)}zW^5Z@$6l5*jP-u5mp~$OwL$Ta;g%YjQ4W;at z7nE_iZzy}dbwT+n%?%aDr!S~H#l4|wdF6uY%^C(Z?a>QrCvzFprQ0s3FM4CZ$V4P$ zVTM3f5X}T(lS}^pfA|6e!~g%s4=}L&|9|xYBgg;$j~{@@s~12b#}6>@I{St&I0k`m za0o*@fM`(G0MqZ<4uEJ-76H>6-h%m{tODYLvI~d?Wf?F% z{~K5ylyyLSQ1$`S&*p>u1Ik7qJ}4`JXi#hz4a(5Dm(rVERtI0*D4>RS*rzt{@teWkED3+k$9N)&LcK1p$9A z+Bp21^lQWaGiMJl6y4dtSQ>DE$-#32bEwe)76t7MtaknmYz({`*tz#Ou-|{bf#aXB z1LyvW8@TR%b>Lp{&VXm{bqCkH01cRKKAY%&mNyLv#-V~T-L+V%s&8f69|ZZi*v z3QpP}rdEAG>|@CW3AWe+5*NcZNItVaAhpqAgY@|r2bqad8)VnpImi|K*&yGq;Gj^? zY@nFWfNoRc2EFN72lSJYHyAXuI~Y2-ZZJy7bTGEPZeZfz?O@97VqnI*!@->G>IMr2 zeg})w90ryzwGUXWdSzgJlJ|g3*BJxb74Hw&Wvw%?@3?rtA^6k=$BfMfoQ&6OaQ2vb zz(u%kgR9{t2iMO98{7q_IJm!OGVu6V=HR&}-@xl)goF2-Km(tRRt~;3#s+>9WgPrt zL=6I}EDi)(e>VtGcZg}J-4MHIp+j8mEQ9!_W`_jd8iT~7REH$pID=#-cZU>S2ZL1Y9k zT@R$6WiiNjt$rYLo5F^y)0_vgr!j5FS@rrrZt0T^c~dwX@eFv)M`5IL3DL7D5r*BX@C+I+3 zy7z|q8j}Nz3``8njBv=p%EH9PK4{?o|9f{aF#P|&a{~j*|NqAiKuAUogb0Xz^#X_l z$p-s|FgW{waBv7HdoeIFGBSb~AR0$@CfsAvGupyB~UgNg_c4Jsx;G^nTm(V*f2 zM1zV95Dh9eKs2c60MSBe+Yf+fP!R&6LB$A&1{EbB8dRKs>5nB~`$5GDhz}}SKs2a$ z0nwl$21J9384wLBYCtroxB=0iA_qi+iX9LQDtbUPsQ3ZVpdtuFgNh*#4JwL2G^jWN z(V!v;On>?Tb}y)C0`Wn`6Nm;CQ6L&rOo3=nQ3aww#TAGK6~0sLB$@31{HlE8dUs&XiyOdqCv$Vhz1pfAR1I0f@n~Y2%P1B!g&Bu?(U?MKg#770+P$tr9r=LB%wP4=SobG^n@+(V!w5 zM1zWL5DhB2K{TlN2GO7*97KbPaS#nE%0V=!I0w<7A{|77iggeTD%wFbsCWm{|CWR8 z2Nm-mKB%Y%(V*fUM1zWa5DhB!K{Tl72hpJ7A4G$y01yqT20%2ZDge=->HtJHxa)$$ zw=qTxoc^2C`N8~VYe;@*VfzT?x2lRdfYi4>yA0;HvwR2h+mCGp^E;m01oJ!BUjn&R{}zq@}6nBTKxE|}k&KMl<9>)i>quiw7{%%6}u8_b`m9|h)5@~s8)Crgxp&7Yzh z59Uw#5dr2;<8=h{r`@mu^QXU62J>g^kOA{&UULB3H*5MoFn{(oB`|+Z`2#S2?lcxK ze_q00uzmAOpMm)c9PWep3qwzU`HK_|g87T>o`B6?!mt?3Un+MD%wPJT70h4uZv~jY z{6IRGzv5mOn7?vmGuXaW`*Ohi)t#we{+fAyVE)=ncQAildp6j<^`4qw{)Tj4Fn^;a zH<-W4T_4QfETjQ8e~Y>xn7`!{7nr||?K7Ca?cy6SfBUnmVE&Gc=fM1(=Rbn&+cj|m zn7@1dWiWqF;UqABZ~s;>e_zx(uzmaUr-S(itR{f@2mLF-{6kVjVE$o?X<+jY{|W)~ zk4jX4`A2V=f%(UNM1lFo4+n$IKXJnb%s;u<6wE)hLk`S8-7F5~pP9h`=ATXa3Fe<` zlmXj!-sv`&e<9%?n14}eFPMMH;Q^R`nfoT#zAFlc!2Bz(cZ2!Y7?yzf*G|s`^RK@= z2sZ!5>UuE$=E=oi{;lprF#q<-RxtlgwlkQ2w=*5gzZa4Kw(owXCz$`h#0kuQ=&23n zKN3*^^B)_zgYA3#g$>MqDx?YKKfU|{%zyTY8_a*cmj!J8i;Hi;{Fif{f%&gCo(J<^ z*PHAvnEz2G56u5$H3`iB%-RjM?~7CknE&Nz zE|~xIR~VT8?WjMP|NWK)nEzv`A(;R3a0uAGU#-Gm{_n+RVE&(!uVDV)W(hF=pPwMu zzW+(TKzv39-OnICBcszDFrSI{Dwxl#v=7W@e!CsaXXU;PvX7DV>`XA9?e$(TpM7mL zn9p%~KA6urZ3f6bMy}P3U_N(Q6`0S{oebvlhQ)ySd?oc@^ZCu}zM_|6>UN*3OQguhbeCata zz0!dU%NmX%-3lZ0rPbOc)@(VJVUU3`ugDZ z9HW7sFqm)1e-SKir27@jH~R4oY`zKabui!L#sx6n^zBYC-)zSwFyH*_Y%t$q#uPB$ zavQik$7oei2IgB&n+dkxCL#jNw=Js%^X(kL?KwvKuvjqPK`{($zoVHwnD4}B0p>f) z$AHauekcXzyZpBU^IZ@80rTDND}ed#t0ckZd+cWd^F2F%gZW3l7uvz*M@(`B^CLH8g85NJ>R^8K1aB}uCWsTvk1fyz^W&`5!1l!l@PqjY(%|+S zW1{{?FhB9vE3kaBBrn*$!Ti)+>%jc98yCU+^u?#Z=4b5K4CZGxuL1M3 zW=sY1vy=P4{G5t%FhAEB+@531OPm6>FJCzbEMMSQ2Idzsn}GR6iVGrlImVUc;PxEjs%~(5j&XGuxIM?XrWD+sV_a(n zZqG5U3jw$17}tw|+jEQ?Ou+3q#tq-5gWbPL1l*ou+;kt@o@3nn1>Bxv+_E3so@3m4 zr5^0wZS%qHImYc<62bf(_2Bj#Lch`d3bBufJ<-q*CvEcR`<30^= zdya9xEx0|$cz^@ko?|>H%L?}2!RO%i9OGd&aC?sN@NsZ^j`7GdaC?sN=<-8g_Z~Y6 zZqG3up8#&pF`ifoZqG5EEC9FX7*DmX0=w^Y0JuHJcqX+6%s*=YZqG5E^8>f%7|#oU z+jEQ;^uX;o#tR=j!S21p2X4WJddvBM6+jER}EY5@Zcf-K#ImUa6;PxEjeKT--j`0B_ zxIM@CP;5Kcy$>IP+jESM{)5|djE@h3+jERh?t|NNj87Mq7%(s}Fh1K4ZqG43?*g~y z7+=f>x91pNW)*?$dsQC|cJFI1aC?sNO}s6b|5gj!o@0FH0dCJRzUPtvtN)+@ZqG4( zc=-#=|HJ`q&oO?w3~tXcetrRN&oO@41a8kUem(vO?A~va!0kE4?;F7FImRDF;PxEj z&k5l69OJK``C#|{E&#XZ82?y<+jES61HkP$#(&b__8jAXgEp}H{{IHI=a?7;GC+JL z#@pcb923(|aC?r4c{jK{$Ha0I+@51%ovjLTFB98NaC?r4y#?H!W8#&hj>&upxIM>Ykp^zhFCn};qA5t+@51{F9)~hm^^yG?KvjTaBzE$$t$M->|SqkaC?r)CluVCWAYUTx96Dr zOu_9rCcp3C_8e1yD7Zbx6z~Ato?{C93U1Fa1swpl=a_=8g4=UUAq&9mIi}Dp-@xf3 ztRCE+V+x-KZqG4A#Dm*&Op&$V_8e1`{bsOxqhrDCIi?s5aC?p^))w5JV~XPdx96DR zWx?$^ruY}&_8e0p8@N5klz0N%o?}XS25!$WC9eRt=a^ECf!lLTsT0BNIi|E_;PxC- zdLg(y$CS|qZqG4g27=pjOj&7)VE1Mlg4=UUIsV}G98<0UxIM>|rw?w=G39-@2X=1( zKe#=|RB+({m|yq~+@519+6ivYF%_Q!x96BjW`f&uOr`5qfWy1265O6+DxVH+&oNa* zg4=UUmF3{}98;BLDmZ;qhlAU5Of^d2_8e2KIk-K?RL2Bv&oR}D`+(hB{|MZkV`})W z2j({(0=MUwnjV1Lb4<;P!0kDvmIL7S98+uKYp{FU7J%DxOzqj=_8e13J-9u`)aeCo z&oOnyUk1CkTMOKtW9sn$x96C8xxno?raldDdyc8^)daA6Cvbq2%V_I507tCKa6WpF-TAl)K&oQm21h?myR=R-Ob4;ruTfpvJtpaY( zF|Ba|x96DFvVhxjOzV`u?K!4(PaMJS-M|EH&oON{3vSObZF~f7&oOOU3vSObZ9b$4 zcHfp>aC?qv>mqJ2e_JlNJ;$`Y8{D2_+TjCk&oS-H2Dj&!cIlh|yLY!2xIM?TM-<$i zW7?|)ZqG68{R(c+G41DC4|ebVtKjw=(}B<6_8il}t>E??)1k}Y_8imUsX1Wx9@z|T z&oLb>^#k*dO$N8;n2yJR+jC4OioxwUrjvHy_8ilxU^B3LPs@SZb4+J!!0kDvGylNt zIi_n-5+9McUqaC?sFW(v4H$8<}r671gFF5vbY(;a?rdyeU@3b;MTboV{D zJ;!vP1>Bxvx_=(ro@09O7Tlg=dbl3ko@07+7Tlg=dfX3g&oMn&3vSObJ*@z@=a`=L zg4=UU&m+L?Ii?r6;PxETOLK60j_H-pbFh0~i-X&9OmEDr24yeg75Qo@4rO0NkEq`gj%Go@4s70NkEq`n(m~o@4sb0B+AQeVqqx&oO;V0JrCu zzSn`N$T zo?{l+1#ZtV3!VqJ=a_|Nf!lM;!t259IcAY6aC?qfbOyLR$1D~FZqG4`SAg4d%o3L1 z_8hZh1h_rNETs%?&oN6|fZKD-GECt19J8!AxIM=#`v}~gW0w1V1ngeud z&oOIxg4=V<+T7sw9J7ulxIM?L^BUZqW7gvYx96DkPP2p32ebZ5aC?r~U<Wn#pxBscpu~M*fpUbv2IWTu3aaLx zHmF`XuAr{SZ=k;S@d8bTj|Q4kx)rou@ov!0Hd>%_V5@;{+7Si41=9`m-IggBG*lWG z%K9!a3Rl=*%$B8KVi96s^5dX_nS#85+4+nG=HHHOu-MV6V0r(sfmOfG0_zk1H`wI! zEwDW@(ZJ5{!vgz>{|p@TE-i3u`(fZD{$9a3@Q{J?_lpXyzQG$@AG}@QF4$(^zJ02K z$Hxo<&*|j~UKhO#yc;Gj@Y$$i;G0moz;7a-fxkoef`BTm4S@=l3xc9}HUu+BF9@-G zw;|;I-vwck7dC{Qlu`))xoJbhia!dGH>Yff>bR#6eQ2XWOvV9)*hP~K;ye~9#5a{1 zBpB{nkeC#1kR-TZL9&yjLGs6@1*uBX2B{ZQ7Nm2VZ%E(hwjkrRh6ZzD0PLruKgSGtvD45itiW{O1@So3f^Z>^z*DjiSYu1lAG%l%7mK?$_|}g zQ2sf^pkmS51(lcG462&?7gX;_+E9~JxS)29%Z56q;05(HY8#js2NwSSf5nG^;s5`~ z4;Weg|G#>Hfz!t~guy8&7(|4Ck}3lO11Smm|NsC0L5UhfgAz8F{_C&+M1vAIhz2Ec z5DiM`VEXkh0}u^L@L+mpqymTrC43MKO8g)ilmS3AC=-BaP(}dJpv(ZGK^X!>gE9q( z24xH|ef%icJWvJ!@j;mcM1wL4hz4aAkXJz&21J804TuJ191so4JRlmBfj~4U6M<+@ zMgr513KT%Js`;l4VEW2&Fdvk$KzvZ<0@0uh2BxQUgXKXP4a5g!HV_TUa3C6#=|D6n zU<^$273<#n@nGi&SG9riuWkwJU%8+3C$3d|9po|IPgEA+G24zqX4a%e-8kA8% zG$^xzXi$a)(V$EVqCpuKM1wLfhz4a~5Dm)2AR3gBL9~Wo$70 z;Ozns4a(qPdizwcdQe6O@j;m#M1wLshz4bP5Dm)sAR3hUK{TiU0MVdA07M5=X@SEV zR2YExpaKCzg9-%@9b)+oEDtIiKzvXE0j5t%f$b0fxd|)}Dl93;#b!77NC^ApIf$6391vChxj;<#&IEDhvlGNW@0%d; zc>M&)%L^t*9iBKrde2?~nKkPKWarEmkn5QsAYaocppa7}pcs=ZpyU%GplstRprT_Y zpemy-pvEI1pw8+%LH(=A1dXSv6Ev@iP0%{ZK0$lSj|nLF3SV&KqU~xB5!18z51gpKy0@k-9 zCfF>CpJ2P&YJy#x;{^NJG7}uqlqWd0SPD3~u}*MKkrr@KeLlg}`LBQ*>&Xf3%J&7_ z-#ruXWIib1dG3UO*W<+k-s@Hg_?+24!MCqRz;DgM3I2I`0s%eE69U7#CIscAP6#&7 znGoXRJ|R@xZ$g-k=7g~C1`{Gg-2@`83r&dpsv!`y?aPGdt6Tyx3j_sXx4aREtN$zz zKjoZ2Li|;M#M)OAlI*t&B*&hakRm@*Ak}u=gfxz=6VhcTOh|t*eL}|Hq6wKNDko&! z4VjR=B6>p3u|k2|4%-QN%Yp^+Gvp@}w3!MN2HFS|rHKm^8_Efkxc(F<6=V=7(-)mk z_TiC01>g4x6&H>ORKB}8p=!f2f$DR+C)CV5G@*9g+zEA+OD5F!)lXn#VrFAur8E5h z|8)if!~g$}A26`||Nrp=BL{-bzza%qjDir-$2Ww**&T#~Ll|7$K{z;sfq{XMk&zLk zf`O5dfs`ct|NsC0pkxfv3rfl$8kC$tG$=`fXi%~S(V(Oara$kS0HQ%j97KbXIfw=& zbr20o?jRbJ#IJ}9ezXi#TfoM>6 z0@0u>1)@RO3Pgjl7KjFAFEIVLUI0XcvKg4Zn+WEEvKxpG%5oqYlb}Q1%1S zpezWYLD>*QgR&xs24zPO4a$-r8k8+TG$?C=Xi)Y9(V#2}qCwddOuu^uwjY#TL3~h_ z1<{~v3!*_;7es@yFNg+ZVGs?<#vmG$l|eKpJA-IYmIl$FYz?A8SsO%yvNwnZWpNM< z%I0ADy8$>pK-nF{2W5E>4a)W)8kF@xG${LnXiyOVqCv#~hz1n}AR1I0fM`&W0HQ&~ z0*D3`4Imm+Jb-9W5doq>#RP~36%`;FR9t}R7t_J+0Tmk{KB(vb(V*f3M1zVD5Dh9u zKs2Z*0nwo11Vn?16c7z6RzNhUXaUin;sr#5iWm?LDrP`5sHg$apyCEhe|Q9r4^XiK z;)9AF5DhARKs2Zb0@0vi2tn)icmH M(D5}i0J99a00ob~vj6}9 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Shiprock b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Shiprock deleted file mode 100644 index f8908febf220f27b3efa68bcc119633c8efee299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2427 zcmWHE%1kq2zyK@^3=AL)l9&r+3(Q+)HDUg4_J##*G7}cgdfBij_1}cWEo=-+TpvtW z(!Z?XbSKY*OUhpgE+tAZeAh3V@Izw?!%zN*3BNeX7=HaI75M!kg5l4NaDl%ktQh|7 zuoU>eLWY51hO_`<`#%Pz^1lMig;EVHiINjo1O7CyIsBf$Zg8)Gz1MUCr@(;*&b1o_ zxIQdu;C`@h0?*C;47>-LC-CiD$iTmHfq=lwW(L8|CIO+!R0iS96akS)cLq^UHvutA zO$KpI4FL%y*9J*WE&(Yf^#-X=Y7?X%aW=?Y;+Pjb^cK@IwK=@Seln=}}vw+I*&i!~U#rwNz@{b(>%_Yg2My47ILt|ee0{hh($Igfzl z@0$!($KDB8-`>q&vw>@Z?e4h@cKvTA*w3zKaL7M5!Lem_gOmS;3C=0C4KDhVCb+u9 zH@JR2D&VeL!{B~-xqv5c9E0cPP64mC4h-INmQL`w7SrHc(>}p(n_Yu{Oy-1uX$lR2 zHr^A0%9t90WppQmgg$8q`NKaU%=B18*i#*W2)V}$5l8t1BL5v_h+6VNAo|{NhM1O1 z0BmQ6@k*KJ5Y8!;i1 zoxdS-t<{9AXCE7~r-cjTT;OBKEwdEJTmOL}KTKMnp#Ks>q3K_NqWmok#iI8GO8loW zl>GZWq0C}aL)pE%6DlO8G*s-{KcVtRSwq#lg%hf8L^RaYHBYGBVbxFBh6mGY zH-gOrWqc4Hl=(q4r~m-bph5sdg9-u=4Jr&kG^juT(V#*BM1u+j5Dh9EK(t7tJBR`o z5+H_{r6!017ZxA}sK5Zxph5#gg9;8X{Yee%K2QMy;)4ni5Dh9wKs2Z@0nwlW1w?}i z6%Y+7SU@zWZ~@Vv0tQ5b3K|GN*i4^;4g_@KfEM1u+-5DhAX zKs2Zz0@0wt2tcCJRKS5~P$37R zK?NO%1{HQ78dTtc>CZ>O_JImM5Fb?dfoMrR z3PunODjY#HsDK2~ph6Nvg9=Iz4Js@_G^oG?(|`EE;SVY}L3~i*38Fy-D40IV2euzn zkb?N2!W2Y<3RDmcDpWx4Ju?oG^n5j(V)T>M1u-k5DhAHK{Tk~ z1=DZK!0rJRz#u-T5C+kpf*4G%wF1k73S6R4FCThKfu7^;~T=@7#spp#6XHc R|NsC0kJm6R$KVhXE&%R6AAJA- diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/St_Johns b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/St_Johns deleted file mode 100644 index 48428744e5a6434bd2322a3fc3401d1dad34255e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3632 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Tegucigalpa b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Tegucigalpa deleted file mode 100644 index 477e93950c2f09b8c338033c07a53d4ef5c01912..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 264 zcmWHE%1kq2zyQn)3=AL)l3<6jd6xKiyC}@M^FT3Xc7RgVz6Z)SwE-@%Jr7*2ow&fn z2!{Xvud`ub`2Tx(0U5@?z(9(X|NsC053&}d6=XGt fR*ab)0HQ%o0MQ_4fM}3Yz%*&j;c^ZRG2;RNA&ESX diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Thule b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Thule deleted file mode 100644 index 2969ebe59bd26701a6dcf6f71a42b0b427072e58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1514 zcmWHE%1kq2zyQn)3=AL)l8A@0d1g11|55*1^+4lk>;=uMF%Ptk+F#J#SDB!5*)2eK zUUY)qW{m*-I@<(;$y@=3>5&hNirxemyIVgn2|5>GsxJG$%xFV^IotmS7Sd-fSUh|9 z!1DLH3s%PtKd`<%;eyTj2MM;ji!RvpA4;&F9df}Te@TL4OJRVMe_MicN^pRSenx_; zi)n!C=UETjbptQBU#@xJ$!mPUb93ASueYKXyysLW_*^pz@U4kW@Y^O5;2&e35HR&y zK%k9cLQv_AfM6Nsgpkl(0U^JiCWM*J2?%@2_#i@V$AyR^j~_(-n{^>-$B(}!}Bt3W=>foM?D0@0x41)@Po z3`B#H8HffYH4qI-ZXg%j4N8(A z8k8(SG$?6;Xi)M5(V!#>qCv?NM1ztlhz2EBF#UNJ*gjCQ1@S>i7es@SFPPpO2bKpV zV-O#dltDBoIfH0Wk_OSBWDTN0NgG6ik~fG3C28Fff`#{Mb#0O;o5Dm%(AR3evKr|>jfM`&b0MVdq0ir=!14M(e2Z#n`5fBZ^CLkJ= zRX{W-yMSm=mI2YAYy+m>`heX7%03`IC<}pTP&NY7YX!japzH+VgR&He24yP{4a!;| z8kD_2G$@OKXizo-(V(mbqCwdWM1!&%hz4alF#Yc$*nCj-1Mxvw5JZErA(-Ab6)X?R zjvziLOM+-nwgl0jtO=q)*%L&AvM7iiB-xb9F*wA;(IrI3*I3U;&p^l5&`{4%&wvX6 DX&sYk diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Thunder_Bay b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Thunder_Bay deleted file mode 100644 index 34f750b4df72db9977cdcef0921cdd5eff95b799..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2185 zcmWHE%1kq2zyPca3=AL)lIVi6Mfz2$ADr&^P;g24OTndt-wzn3|NFq${_p`)`GXJ4 z1^*IQ68;vj20TdMP&in?DX=7gi(zpA*N3(Q?gy;}JU16T;60FDz_+vI0sqS84+1mO z9td`(eh{kkcp#kV{y`*C>w&1J<_9rLo(JNZ+#e*AG!rB_-hPl`;!cqI#8n{u@NI(3 z#Ww}A2hS(SZ9G>Xzi?xMLK(vc#m31AN}-QFC}*vIpkjLDgR0lW2Wq0rKB#LIKT!X7 zxImLD^nvERr3G5A%pYj)YcJ5b9Fm|rFS9^zvsr?Eop*u3WQhdB^z;u#MZXe^-90~; z1l>t6RoDJtX0$KCoSpZBh4ifl7SG;)u>8H}fz`2#AFOZBdtkHvU4iZHh6i^27YgiW zCp~b;-&Ek(QlH@DKc&DqB{9K8zpTL3#W}(C^NJ7dy73R(FL!_-#{4@Q?8=2$;r_5NM-c5LEgsAy`JRASCoeLdfsW1!1PE62hMH ze~6Gf_8{WO#}ASJRy>GWa`{8_y{-o_En7dt?#p=)mooiB{5-!03BFqj65F#Al60pP zB&Yi(r0`Z0q`K=Tq`r+RNLLq3NIz>+kjeHrA#<%k(vU>*$DkLfrD)ucdsQeL? zP&Kc$p!$YQLQP$ILG2E?gt|D-g8CT@35-n4j4Xo!{{O#v0RzMT|2sD@u>Ajj`~V{d znB)PI0?xr946Yy?9>U-n5W?W<5&}x^j1U4x&R}C;U;tr|qHZW#;{X5u|BK!=>40cZ zE&Mfg zP)-EVpxg+eK{*mcgK{N^2IWjJ{fVmpM1yiDhz8|S5Dm(yAR3fgK{P1Gf@n~#1<|0K z3!*`}7es?{Fo*`_Vh|0=$sih(n?W=vM}z5qhr#xNayEz$%H1Ful*2(ZD3^n1P)-NY zpxh3kK{*~ogK|BH2IYJZ4a)r>8dL&+XizBtqCq7Ahz6AgAR1I6fM`&u0HQ%91DJmH z9vq*b5(2~rl@cHtR8oLwP-y|8K_v!=29+8h8dP$CXi(_^qCq7Hhz6A+AR1JXfM`%@ z0-`}B3Yh-90&E|sWC8I(r3;7#l`vp>a}HP@RMLR>pwb3JgGw9_4Jvg&G^peO(V)@? zM1x8o5DhAYKs2Z%0@0w-2t7bDxE+ysDuL3M?Qk>2bEMHKB%+; z(V!9wM1x8#5DhB1Ks2cI0@0un3`B!UF%S(Z$v`xyGy~C~5)DLyN;MD-D%rsF+bFPm zKqVZA4=UwAG^nHl(`)6x@}LqA#0QmnAR1KifoM?a2ckhGAczK)f*=}H5`t(@X$Yc0 zB_fChm5Lx5R5F6;fA_)WgGxvcA5=<$Xi!NBruQud%Y#Zx5Fb=(f@o0538F!zCx`}> zpdcDlih^ipNy@^+Iw;`(|7$`(Md|7VprUl=1_qR(6kMQ+`1pn};3!lXz@;h!BLkOf aaEPg^ONfrIv7V8hfsU`Cp`M|h0T%$a$!GNd diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Tijuana b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Tijuana deleted file mode 100644 index 1bf00cdec51a29245d6d56ba83beeaa34b8ba29f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2342 zcmWHE%1kq2zyNFv3=AL)l9&o*ODx^?tzl)Qf5G}sH6OO6r4($J7GT)H_36XuSG^6F zl)n^Qnz^gsx^yJNjfq=6JgSRa@YpkG!jm}b1y40iCOmVGP#_s}ek3CR$H}R$b_k;Bdcy68*;5{&L0pHH`0{ko2DG1D*C?ME5 zK|!dpSU@(}yCJUq=iBFKZB(^~I z;Lizi8-Fa2UwC_hLYcOLV&mQkN@2VT%2~GrR7~G1sCw-YP!qkVpsqDfK>gp_1)5w9 z0-E>EFVK3GB%r--;{u(_brW>wO8NEwG>6E8viS zXMtnO$_Y;X`xZE-bWd>6U$DT{C3k`wf71eY75@qDKjtfVvKUVAywRxO^+b4r_l{%* zpR)!6zB61E{MHHy_*bYa1oV6n2uyTd5R`LGAlOlLL5R-|flx*E1z|d~1i~3!E{G7_ zHX-7{=>?HrXH1AXuy#T8)v5_GD^DrJZjG4`*SSU^eyZJsgv>sL#JXsKB+mkc2iz$>7N1?Wc+#jRR}%J*IZRlDL9 zs?X~P)GV%EP`jQ_psqP~L4Dr`0Y)Z9CT1oURwm{_1poh^s1JR(22ckil4@}S8RRE$vnGi&SG9riuWkwJU%8(!$lqo?p zC}V(V#*PM1u-G5DhB)Ks2ZT1ks>E5JZCtLNNW{G&p`h1tN$KDilF9s9*%qpu!PE zg9=Cx4Jsr-G^n5i(V)T-M1u-U5Dh9cK{Tk~1ks?v6GVdwP!J6&L_svDAO+K(0>Jiz z3RDmuRH%YzP{9hKL4_-b1{JU%8dS)FXiz~5qCtf%hz1q7AR1KYf@n~|3!*`VFNg*e zz#tk_2!m))K@6sU%?8H@s6YnsL4`7i1{KU88dNxgXixzSqCtf;hz1qZAR1IygXm#j eU~>fohgbx-gy{I1=o#u6==d5M=$YynZ~*|kq@0BS diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Toronto b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Toronto deleted file mode 100644 index b126bc641119caf0dad771d7ba2d248d6c44f086..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3477 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 A1^@s6 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Virgin b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Virgin deleted file mode 100644 index 482f0b549fb8e2bb7e8ce74c8b51798a45662a38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmWHE%1kq2zyM4P3=AL)l3;|gIVOHFPhkB2|F8lB!~g%s4=}L!_=Yez28VzYF_2== R|NsC0<28)SF*wA83jkWE9bo_f diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Whitehorse b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Whitehorse deleted file mode 100644 index 15216d55ff54fa59031ae33e898950fed4ff15e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2067 zcmWHE%1kq2zyRzF3=AL)lBk2SW#{cUyCsR z1er@>3uF)eoFKRH#{&6Kg z5(SfBwh5-{VG3qOFD96?TPRq_unJf_mr}6&{anE6*dGP!+b0EVHb^Y6-Mw1CuK(8p z``Nt$4*7Q$IJT^u;N-t=fpbdt1Q-1U3tU}tC%AsTtl+NOCE$K}tAZzQj)3Rp=?Y$N z{RF({Y+m4VEo*{r&C~^c+k7VY$CNJ!n5H)&&?a(0P?^AlU>WNLA)%ipg#3|R5N3L1 zLfBI)g$TKi0ue`L6e9m!7KmE%Pa*o=R)Lt72MV$KrVGTS98!p%S1FL-dv8Hv`_u_Z zx(5~{rf4qD>FU-K($A(X$YhtDkh#`lLDsYX6SAkJD&$;{5y&lb zSIArcPar=`Q=y>$fk2@dw?a|=A%SAiw+bcxO9V>(b1o>eI545?-s=Sw5{o8O>^r-l z@<+>rs(I@dRNqLOP*XQ?LG2EY33YMB3+iWRO<-VTU}R!uWMO1w8vywKe}4lb!~g${ z1q>`;HV2sG`Tu|J1V#Z6n?V%JmW*@>VTcS4VTcS5VTcR}VTg2b31J8b4q*sz2>~T! zMi9Zk0HSatdkzK$1`q}*tcS7{|NsC0zqYMw4u}S20T2z!1|S-g6+kp7JAi0VmH^S9 zYyqYdO%y;hD0_ftP!<8vplkxN1e8@kG$^}(Xi$~`(V%PtqCr^)M1!&qhz4aL5Dm&k zVEU8E0uT+#P9PeTr9d<&TY+d$)&kL>>;hz4a(5Dm(rAR3fSK{P0< zf@n~71<{}^3!*{U7DR)xE{FzYUl0w-!XO%yjluMDDFqM>%FZAfl%+v5C|iSQP}T;~ zpzIBzL0KF`gR(h@24!^+4a)8y8kFThG$`AHXi(M%(V*-PraxZ>+XpHJKzvY90HQ&~ z0hr!A9V`zj7C?MZ(Ey@B#RG^26%imBR7`+qP*DM*LB$1#1{E0~8dPk6Xi(7sqCv$6 znEoRR4u4QF0^);;5)ch4PQdh08L<7JVgDI6-&wFcsCWbMK}8&h1{HH48dTJQXi#wnqCrI-hz1pVOpHv7Ow24ytW0d| z0|5X3Z%koe0F`fyEa1`)UhefbfXcnO6BtE6vJ8^o(ofdM7gXZmF9E@2AIN{8GLS1E aIK(2rB}B*9SkFk$K*!h6P|r}$fC~V#IxM9C diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Winnipeg b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Winnipeg deleted file mode 100644 index 5f9e35c391b53a98e4434412f51fffcd2e475d48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2865 zcmWHE%1kq2zyNFv3=AL)lGp`h3(RKx{b2UtT>L( zr2M7eQX=Pv%N-dESAr8hTn)X-a82RthwG->8E!DF|8P@uCd17K6F=N$U}v~}BId)L zd(#{4uAESCZ(n7@{m!C-2lJvE9%hCVJgT#8ciA6}@- zF}(OB_Td#f1H-F}KR&#E_K4xlwId(i9y`MDZsMK~pYxYAd@)S=@RQ%G;TK04!>=Fd z48LDQF#NgU$?*4t6~n(B+6@0!$S^R>;ALQJ|Hr^o{+@xkP^y6?k-LF4;7Gw$`mm^h`@!S}o}2p_cn_2|@aqC21$-T3{p($4N{*Z8l)d_HppE3)gXKDb%Wf- zI}P#+&o(HO@iQnku5VBZ{m7u4b%sI3^fH60*E$9@(X9;XS`!%5|6Od*s1JY_P(hNI+qI?bmx^f=xq*a(65VZFqmx8V3=OUU{oyDVC){jU=sAB!BpLf!OZAZ zgE_klgN5{W28(C^7%YF^WUxB+fWi9qZU&q6e;RCe&t_6@>g@YzQ;mQ4sc2jv+$s%7=)f z3=EO~wta|N@`xe&-i!}1Ek_t)_f>s}OIgMcKQHD(g72Y*#P-U9B;6$q$?4GrDZFhB zsqVG~sc$nH($(b)($9J|WU@0BWUkd|$a?m;AbXl8L(cjCA9BmI8S>UY{E#2U%TUmN z_(P%TdxoO?r5}n#FEW()w|^-4_qL(TVo5>Sz4Hwf5^V()`!+UI{>Uh(nm4(j`i56Q zO&5(R6>AgP$>bTK_vx<29*{d8dPF{Xi%vErV}|ofM`(Z0ir=A z2#5xiA|M)6l7MJXX#%1_B?^cJl`3HR!9=irQ0W5VgGv|>4Ju_oG^nHj(V)@>M1x8k z5DhAIKs2c20nwn+2SkHPAP@~Ig+Mf@Bm&W((g;L@N+b{sDwV+WCo!=7pwbD%2bEAD z8dOSwXi!N7qCuqBYj z|A9(15Cc@QfnsL{FNg$}a3BV#lmpSAk`6?JN;?n@D)B%xsMG_|ppp+ngGxUT4JrXa zG^i8=(;pT!fM`%@2%xV8dU0nXi&)uqCurEhz6CwVEW%huzjGC7{mva#vmG0B7JjP$>L8U#229@|A8dU0o zXi&)yrnl!m0MVct07Qdo0Wke}JBR|;1|SBgMgY;ES^-RNt_D%y+5yA>)es;WR7-$p zP)z}%LA3>l2GtlK8dPh5Xi&`oqCvF>hz8XlAR1JQfayPs;CKMlCLlhjMgh^FS_MoW z1(A^21;hf?Fd!OK%YbN5O#`AqwGD^{)i@v;RO^6fP|X9PLA4Kv2Gu|y8dM8`Xi!ZA zqCvG0n0}i9b`Pjl0`WmL6Nm=YPGEYi4p<&kOM&>HnhHdNYAX;8s(V&_PM1yKGF#Yc>*nCi}2I7NiHV_S}-N5v|jbM3DEeGO*YB~@N zs_j5DsKx`)pjr<^gK9ny4XXW^7{QR41x!IW*hyA4>Oz7RVs{2Y^#A`QZx|TBl^qMX x5=5^41dzpjd_x$pRD=wWnh;bKaybWwm^r(I==d7z8R;45_!=7O8R{8u0RXDGshR)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Yakutat b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Yakutat deleted file mode 100644 index 80716027731ebb0d504165e7012ac4a3464664a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2288 zcmWHE%1kq2zyNFv3=AL)lIVl7rA~KhY`CQSrQlMciNe1fp$7j~SST>eFgIZAkWyf( zkThT}G+V%uXu5$lP+|d_qxc4PgI^2SdjmIc3fx)1x%R99*N1%zxF77@z;pAq0`GzO z8~AqaRp4K_$3S4_dcpeB0XKwWE%g8IMT8#KB46g2PM-JtcVKtX%o{tY^pdlu-&{Sc zzkJxhlebF2bMsOIueUJ@-g6Fa@VQp8z_(`c2ET1l3;bhRHv~+xSrBNGz9FbgZb7h& z=Z26lh6N#iv^RvAK3Wj=)WaY`?!Q9BQ7wbWe-9O+mhu=x-#e@j)AG(BcHdHkxReV9 z@$=dh5`5omNNiucAW8S!hUE0t1u486Hl(_zFGzhmX+yfY=YsUJB^xr?wHIWr4cn0Q zoOeO?v|@vt3t9@fWuXRn8+a7*!^{l|`rj!Onn@ZIMc>kpUqLkuD(&j^1D*ID~ zL3tQNgYq$m2IXZC4a(18T3bW_On-6$yAzbRL3~jD2GO8A4x&N%97KciI*114cMuKA z^B@|O??E&u?}KPi{s+;ZG5|z_$^j4!Dht5$zu#c{KxG1m4=NWxG^lI<(V+4HM1#r* z5Dh9PKs2bV0MVfG0z`w#3=j<}H$XI~>;TcA@&iPJ$`B9@Dn~#xs4M}|pz;JngUS>z z{agbaFQBpo#0QlxAlmx&bp;R&DrZ16sH_3epz;PpgUTEb4Jvm)G^p$W(V+4NM1#s8 z5DhAaKs2Z<0@I%#g6#v9NgzI`TmsRcvI$IYUJ8~6l~Eu*sGI`Ppt1@?gUTxq4Jxxh zG^pGH(V(&mL11cLqd{FraqCsUOm|hzOmIsxUAU>$P1ks=}6GVf`O%M$#J3%z4`~=aUG89CE z%25yvDoa5$s5}MHpfVLq{}%_F4=P(hd{FrcqCsUWnBI3AEDtJcL3~ho3!*_~E{Fz| zyC51=_JU|o`3s^UWiT@f6DwZG&PGSbz;Lb+R0`KJg2=`K2CQXqe*>ckxI~up@eN_X jS1QBGWeCmX=p7tl2`aU9e2w*t^bB--4Gr}S^$fTG*T_f$ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Yellowknife b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/America/Yellowknife deleted file mode 100644 index 947bec914be3721c864580ae1ad150aebafcc957..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1966 zcmWHE%1kq2zyNFv3=AL)lBj~RCHHAbFr4n>nQ%$@OTnc?35M_bQ3XFVT0aP9rU-~c zx-*D+x(SF`YBGpxY6wUuxi(00atTN=sW(V{Qkx+Ch_gZF62}DDgRdLpHolr5zwm5> zLYb_9V&nP-rO^KZ%2{U^R7@WVsCunqP!l~YpsqE6LH*zT37T9*44U^2PSAQ4!l1ox z@dTaA1r56MS|{jj4rF*2{&v^taf8S)VI`&S$`u1)Hn+;qOY@JuO@y=K>!?ZkeS(-ue#=`C-xm1^t&83QhkC6yFghP~tz0q2%B131t?W8p`h7olqe$rJ-Wq{t1;o${MQXEu2t&Bch?Eu6aW34y%T` zxYP;tGh`Z=8JU<_m{|t^f|45p!~g%Q7cjDbNsj;j=T2bY`Tu|C21Ws}h-g(+6@zbh z2!n4x2!n5M2!pSS3y26|U|?Vb>j#mfBO(fEb``0HQ%z0Yrnc1DO7#HUUI~vIU3+WepGw z${rvZltn-^D4T$2P*wrapzH#oL0JYwgR%{X24x)(4az3{dZ_JOh! zh!4tAAR3gdKr|?8foM?n0@0u>2BJaP3`B#n8i)pEHxLcVav&O%?Lagr>w#!c_5;zN zEC`}O*$_m7vLc8EWk)dmoJRmegR&)v24zhU4a%M%8k9vrG$@;bXi!!K(V*-KqCr^} zM1!&|hz4a{5Dm({AR3f~K{O~EgXzyl!S;c&Gl&n$(jXd?t-POv;EdxQ9(EDoYU z*&IZJvO0(cWp@w_%JLu@li0Q1%DWpdtW7gNgw#{f8eM{-ELj#0M1#AR1IG zfa#-rVEaME1BeeQB0w~#m;lkBq5?#NiVF}8Dl$McsMr9}prQjrgNhFj4JtxFG^iK> z(V(IPM1zVGF#Wa+>>g0D0^);;77z_8UcmHPE3iDMm;v!YMGc4s6*nLnROEnYP_YA| zK}8RU1{FUb8dL;}_qLB$q`1{GZ(dYBYnT)x2}=Dsc=I=;qwMtTN1zJ`W+hI$5E05X%_ A7ytkO diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Casey b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Casey deleted file mode 100644 index 19bc8962852673eea1389c53dbdece3e93d91f46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWHE%1kq2zyM4P3=AL)l3;|gIsVC=X#jCRf(!)>3@lYuRSe<5Az(f!2L1p4|36;C LxWa=&bS=057*!O4 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Davis b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Davis deleted file mode 100644 index 79932d3c9e509e4a4dc2f13ce88f3b68afeda175..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmWHE%1kq2zyM4P3=AL)l3<3iIiJsQVEE>KU*MnnY6eCIMvxo`ClxTTR8>_mxHyJ| efcOlgnEC(z|NkI!K{Uv05KYK@E|5*S=3D@8=Oe}d diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/DumontDUrville b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/DumontDUrville deleted file mode 100644 index 5ea18e6e776a126cbf395230c282edaa4a30551d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213 zcmWHE%1kq2zyQn)3=AL)k^s>l%zI@|S;IY(goNidObv_-OdvTB?peUV!obk8fPtf` ss)`}NH-y2(B{T#i!@$5miuwQl|NjrN14M)D0nwz`#Ralg*U*3q092YOKmY&$ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Mawson b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Mawson deleted file mode 100644 index bda4421f79f88f343a79f2c518cfe01a71c437da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmWHE%1kq2zyM4P3=AL)l3;|gIUgw)HGnuEL57e729~O-Dh6N2@DPXq2`2sj|NlRJ M)3`w9>Y8x@0N8;OQvd(} diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/McMurdo b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/McMurdo deleted file mode 100644 index 62ac42f078d52d6c24f5e0b0acd243cd1bfbb8cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2001 zcmWHE%1kq2zyK@^3=AL)l4yXk`JS$P$-pV`_W|dcr4P8?FHPW{_vZo6je`$(>+U_^ z+p+iof82ow0yA142-+=rAXJh5Kv=Hjfk=es1Cf7e55z3AABa6~PLNRaNRT+5njpof zl_0g;Jwf^*Pl8OlW`gX2cL{Ro+zIjvE+i zn4BJ{^FB^cf28t2d@`3p`{s$J9yB}Cy{rJFYbM6D{{d@^Fll>pq z&ijyHS8VvezV1?jLyTX7W89VmCmVwVXS-<$E;2$1u5uL#uD`z|xc!StaR1)=z~i1x zg6H-02VVQ+61=y2KJb~xkl;IA`+;BWqXhqQ-Uk6`{~iP;Xe9)>J$Ml8z>^T7cIZK< z{JVrOwj~e3{$EH4f7bRO;{K+D$YU7~qV`Woh+f~C5VK;#gV_G`gt(4L590GZ6B05? z9who}CnR}5Dm&*AR3gz!1N;(u=_wc4a5iKHV_TUaUdF$>p(Op=YeQY?gP=F90;O8 zxe!Eyaw3QZXi$y?(V$!l zqCq(qM1yiKhz8|g5Dm)3AR3gDK{O~ggJ@8W2GO8g4WdCg8$^S0H;4x1a4`M*3pl(% zIUU3Y<#rGa%JCo?lDCdJ{Q0@oOpb`K?gGvDq4JrvhG^jKH(V!9mM1x8N5Dh9B zKs2ay0MVcl0z`vK2@nk`DZupq3t;zvN(>MmRBC`|P{{$JL8S+X29+Qn8dQpaXi!N4 zqCuqzhz6A?AR1JvfM`(30-`~s3y21lFd!OK%7AE4Nduxmr45+=!3~ZVP^kmrgGwF{ z4Jv&=G^hju(V$WYM1x8q5DhAgKs2aC0@0vS2}FZRCJ+rOoj^3GgaXl^QVK+aN-7Wy zDy={?sKf%(KO4dB0F_)IKB)8p(V!9xM1x8(5DhBHKs2Z{1JR%o4Mc-VH4r`YN;WP~ cIj3uA1S<1%d@c1%^$c`;P4o=)4D^k;05f+1)c^nh diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Palmer b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Palmer deleted file mode 100644 index 614c9b97b40da921c3fefbeb80047306149eabfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8546 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 y+jGns3E=h|v!*t diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Rothera b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Rothera deleted file mode 100644 index b5dc735639dfd75c1cb177a8f12464585cbff9fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmWHE%1kq2zyM4P3=AL)l3;|gIeD3M89*Ec28RFtuU=qasj8}C2=WgJ0jXjj#Uzjh M{HAe%%r)i$0Lh>dMF0Q* diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/South_Pole b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/South_Pole deleted file mode 100644 index 62ac42f078d52d6c24f5e0b0acd243cd1bfbb8cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2001 zcmWHE%1kq2zyK@^3=AL)l4yXk`JS$P$-pV`_W|dcr4P8?FHPW{_vZo6je`$(>+U_^ z+p+iof82ow0yA142-+=rAXJh5Kv=Hjfk=es1Cf7e55z3AABa6~PLNRaNRT+5njpof zl_0g;Jwf^*Pl8OlW`gX2cL{Ro+zIjvE+i zn4BJ{^FB^cf28t2d@`3p`{s$J9yB}Cy{rJFYbM6D{{d@^Fll>pq z&ijyHS8VvezV1?jLyTX7W89VmCmVwVXS-<$E;2$1u5uL#uD`z|xc!StaR1)=z~i1x zg6H-02VVQ+61=y2KJb~xkl;IA`+;BWqXhqQ-Uk6`{~iP;Xe9)>J$Ml8z>^T7cIZK< z{JVrOwj~e3{$EH4f7bRO;{K+D$YU7~qV`Woh+f~C5VK;#gV_G`gt(4L590GZ6B05? z9who}CnR}5Dm&*AR3gz!1N;(u=_wc4a5iKHV_TUaUdF$>p(Op=YeQY?gP=F90;O8 zxe!Eyaw3QZXi$y?(V$!l zqCq(qM1yiKhz8|g5Dm)3AR3gDK{O~ggJ@8W2GO8g4WdCg8$^S0H;4x1a4`M*3pl(% zIUU3Y<#rGa%JCo?lDCdJ{Q0@oOpb`K?gGvDq4JrvhG^jKH(V!9mM1x8N5Dh9B zKs2ay0MVcl0z`vK2@nk`DZupq3t;zvN(>MmRBC`|P{{$JL8S+X29+Qn8dQpaXi!N4 zqCuqzhz6A?AR1JvfM`(30-`~s3y21lFd!OK%7AE4Nduxmr45+=!3~ZVP^kmrgGwF{ z4Jv&=G^hju(V$WYM1x8q5DhAgKs2aC0@0vS2}FZRCJ+rOoj^3GgaXl^QVK+aN-7Wy zDy={?sKf%(KO4dB0F_)IKB)8p(V!9xM1x8(5DhBHKs2Z{1JR%o4Mc-VH4r`YN;WP~ cIj3uA1S<1%d@c1%^$c`;P4o=)4D^k;05f+1)c^nh diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Syowa b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Syowa deleted file mode 100644 index ba6e5f38877944730ce397d7ca1608cb2a9623f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmWHE%1kq2zyM4P3=AL)l3;|gIiGKgU;uGIf(%*)3@lYuRSdzA{vluiQcU{)|Nnpd Mrg4GH)ive<0NYy=RsaA1 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Vostok b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Antarctica/Vostok deleted file mode 100644 index e19e2b7cdb553f02f48be8454bd0170f4c311e6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmWHE%1kq2zyM4P3=AL)l3;|gIbTL}Hh?%FL57e729~O-Duyus;1Gxa2`2sj|NlRJ M)3`w9>Y8x@06D`HxBvhE diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Arctic/Longyearbyen b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Arctic/Longyearbyen deleted file mode 100644 index 6326961453f404a4a886362ee8b684b56fd5b4f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2225 zcmWHE%1kq2zyNFv3=AL)lIVr9IcKXsW|)1YI^o22--I*Iy#>y$6rXTzk+Z=0NhSgp znp6cY7KsU5N@5pyyxYvk83vaA|_jx#=H-eO&}ZjDJlKRen7|O!&?OaptoV#6RzwAn|zp z1j)+_CP*EgI6->PUICdk>jY%y%omXBnIIrv(jQzW1mlPsX*6C$8&<0_z{VO4XHtH}h7r>YY)uZm63I?6sld&`drI!j(o(4BH?f?mt%3Hl{_CK#lw zonRPyQ^2Tbi-581ZUK{^X#%FQa|O(dDg?~_)(cojPnlqGH&MXyci9B1z0LyGw<9Ll zEQ_CDyW47lU7OD~~ z6Yyj{DByYSgn-xM#RA^zRtfl=*+0RzuSdXd&B6)(d3gc>J3ltm536!}06etyB5Gd0Zoly4S zkw69C_X!mjjtEq~yE&n1!!m*DbGs+h%se!qcHP_wb(Kpd)c4g-U|?imV#Wd)Sy<^0 z85m>~7#SEC_yibOVI)KZLW0DdU4ugyoLxg07#J8C89}NU7#VTo5_Sd#1`r12l0GP# z_y7O@|BK$K8V}Y7h;|*&rH}yFoN4hl6NPE(g(|oDQbH zntQh@2d^#ULoRAPYXyNO^vsN?|gL8S+X29+Qn8dQpaXi!N4qCuqz zhz6A?AR1JvfM`(30-`~s3y21lFd!OK%7AE4Nduxmr45J%l{jGf-7~QLpppl~2bDe` z8dL&-XizBxqCq7Qhz6BLAR1I6foM>v1foGD6NmD(OHpsI&vopb`&6gGxOR4J!G-^o!|W_kc=35Fb#29=l~8dPe6Xi&)srawFa#|Nkc z1@S?pD2N7?q#znpnu2Ihi3*}Yr7DO9m8>8dRJwv_PzlS#$i&FZf(0_Mve6$hFmQ>0 zTqdKy$O0~6IbkG31VZu&FmU?#g34KVVGA#985kM4oLxh74M8Qbj<2zvsh)w3ub}~m I);Hz?01}o~xBvhE diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Aden b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Aden deleted file mode 100644 index 5aa5a324a4caf4776d57fde3d4f24094c73f0f7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWHE%1kq2zyM4P3=AL)l3;|gIc_CdC@?ZGXeEF|wG0?oe0)O~9D_qZTn17M`v3p` Pf4qiqIR=O58gl^vUMdlH diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Almaty b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Almaty deleted file mode 100644 index 52f941e266a97069cc0c5ffba74808ee2acfa560..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 922 zcmWHE%1kq2zyNFv3=AL)k^o7A*!-&`tM6=G{N6xRy>@|^#3li8j*SZ9Kc7yJc==?3 z-j_w`_9IS+dwccghq8y_Qx7{gN^VgOqd!!`Mj& zjEZs(7~7T{FbVQMU@9ASz|6?-fZ1P*0~XSL4i-b-L4gf20TkdM8WiXt z8Wiwg`sdRLAQ}__AQ}`2AQ}`AAQ}`IAQ}`QAQ}`YAQ}`gAQ}`oAQ}`wAQ}`&AQ}`= zAQ}`|AQ}{5AQ}{DAQ}{LAQ}{TV7k6$0f+`gB8Ub>B!~t@CWr<_D2N6{Du@O}EQkh0 zE{Fz2Fo*_4GKdC6G>8U8Hi!mAIEV&CI*0~EJedA#aR5Yv5&)RKD+T6*5(0=1N(>+x qlpsJfC{ciDP{IJwpu_>9K?wvzgAxgd1|<{_Js^pN3zUd-&A0#prpep@ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Amman b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Amman deleted file mode 100644 index befc1e238947c9b91d69546d72998332926f14f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1890 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 Fxd8C2?4JMt diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Aqtobe b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Aqtobe deleted file mode 100644 index 3683be2db87b36a072090d2a32622182d23c9b5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1038 zcmWHE%1kq2zyRC~3=AL)k}!s{rB+GyWo%vi*FjXhdxMz70R?f6jSAvFKQEAY`DugX zZFL2yGvynk_q1G)SyOsJc23#_xt{O~@--e86ml#tD8^`AQ1X$!plri)K}GxT1y$*H z7u2}#Ur=Y|4p6V}+MwyZ%s}(X76q*%(*?A*90<@^vN1q+%Ax?hmdOG7B`pC4DWw61 zu?sF36;)p_wr#p#5)^yER5s;;nUVbkv%hW^ETm%sEbeMtu>5ToV6~U)g7s~M0Gnm% z0k*rD0_@s21MFu#32;b#9pKo)aKXv+z5yc>GYc~lGZQl_8xmyVVCUfE!VWnY7))n? z!o$LWfrWv=EdWG@BrtL^FoYz4*r+0m{9rYrAXymO$2Ww*(K`f81cxv<28KY$5RkD9 z42+Br4B;^_Fpv^C|NsC04~ifV4T>a?A)tr?(V)lz(Vz$e(?35i0MVd`1JR(!1JR%e z1ks>K1ks>~1ks?#1ks=f1<{~L1<|001<|0$1<{}g2GO8M2GO912GO9%2GO7h2hpHN z2h;Uk8$dKD^1<|#EeaqSln6jHC?SAoP+|blpacP;L5TuHgAxXa1|<#<4N4#&8k9&t zG$^5fXi#DS(VzqaqCtrUO#gMe0HQ&O2Tb490P{hK2*d{^BoGZsOduMRpg=SzQGsYs f!UEBt#08>32@FJo5*dgdG6{{#F)$=V*OUtYY_Qnj diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Ashgabat b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Ashgabat deleted file mode 100644 index 589dbc18ea2d733aa736b32ab888abda675118ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 657 zcmWHE%1kq2zyMqf3=AL)l8}P3g;z=Tx@=wi*FjXhdxMz70R?f6{RZMcKQEAY`DugX zZFL2yGvynk_q1G)SyOsJc23#_xt{O~@--e86ml#tD8^`AQ1X$!plri)K}GxT1y$*H z7u2}#Ur=Y|4p9H{CqU!L?*vWGlMb2{ixU``nIMpb6$!Gjb8s>+nC$^M$-;qwg@GX? zfsvDe!7Tv9hLA83kT^t*g#!aWSPj3AZwP~9um_k34q*uK4FQ?Nz{tqR2xdSDQUc`v z|Ns9%fdZmI0Ru7u6gVIn6hI&v6i8tD=jR0=8WdO{8Wdn4TIx*s1`rJjI1mjAJP-{E zKoAWIL=X)MNDvJQOb`tUP!J6YR1ggcSP%^gTo4TkU=R%oWDpGsXfXZdPXLGp1vrQX S1v;1>=z!-6@eR>63_BW diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Ashkhabad b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Ashkhabad deleted file mode 100644 index 589dbc18ea2d733aa736b32ab888abda675118ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 657 zcmWHE%1kq2zyMqf3=AL)l8}P3g;z=Tx@=wi*FjXhdxMz70R?f6{RZMcKQEAY`DugX zZFL2yGvynk_q1G)SyOsJc23#_xt{O~@--e86ml#tD8^`AQ1X$!plri)K}GxT1y$*H z7u2}#Ur=Y|4p9H{CqU!L?*vWGlMb2{ixU``nIMpb6$!Gjb8s>+nC$^M$-;qwg@GX? zfsvDe!7Tv9hLA83kT^t*g#!aWSPj3AZwP~9um_k34q*uK4FQ?Nz{tqR2xdSDQUc`v z|Ns9%fdZmI0Ru7u6gVIn6hI&v6i8tD=jR0=8WdO{8Wdn4TIx*s1`rJjI1mjAJP-{E zKoAWIL=X)MNDvJQOb`tUP!J6YR1ggcSP%^gTo4TkU=R%oWDpGsXfXZdPXLGp1vrQX S1v;1>=z!-6@eR>63_BW diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Baghdad b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Baghdad deleted file mode 100644 index 3ad361495ce53b051219d0043eba265ef81130ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 962 zcmWHE%1kq2zyPca3=AL)k}!p`dFC0|JPz57-R83$w%{nvW?UO6&>yes?vWRsByo2pw23pp#H6b zLF4(Z2F)9P8MIE>H)!uNXwX?*%%D3vg+Z@pS%ZGf^ag|6TMUNrG7Uxn@eIZe0SqRF zlNwAFn;Xo8jxm@sZD%n5{IkL0sSShWwYmnYWBCo%+cz=TEMLrEJL74CUB|Ts`zlEW zhwSJE$C!BxPCoq%&bAjDTyzgLxXQCKxbb~saA&Y+U}S141B2!QP{?Q*Ft9K% zSU50pFfbt4PQD=wj=>=ejxHe}MU0Ffk^x6RvoSC*fG|jn8I&#X|NsC0nQa^IfM`&l zgCs!#52kLq=INr#DZv0 zgo9{Mq=RTs#Di#1Q+Q`W1A~4JNXo*2frWuV%YcEy$2Ww* kJvfBHF*pPy!N9;kipl@~|Njp%9i)|b8@L>ULv)R~0Ie$-tpET3 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Baku b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Baku deleted file mode 100644 index 72ae96e9cc952d2aad5ffdf5284b9a62c24f2154..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1942 zcmWHE%1kq2zyQ1q3=AL)k|=<(C00pJb$Nb^CqPtv<^eH@a|YrZXC1_UF>a7}#c)9K zwyA;Cnbrf+dnP@QS=0PLc23Cyxt`Pq@-<-(6mr}jD8^VkQ1a1ypll=cKt+f9fvWVM z2Ws4JAE>iRCa8bqO3>IF4Cvq1C81qZDon+*(OZweR{Z4od!S#ZGEb}fTRPzQsl zY(ImUQ5J*Q-$Dip>9z)oyTJ^WzcU)F_L?$S-}Y*-Sr*t}yIZHhuFbf?el}l&Lz-xV zV~aL}lk4{e=M-KB7uA~$uFmfn+*o%vxGP^|aDR7$!IOD2gXg(j3|^0?GI+0>!{Bpf zV}oyB9fRMR$qoK_2@C-}r451MH4Q;I;SIs&aSb6pmJOle4h>;C(hXtXl^P;MEf^xM zvou70m12n6_N*cL${&W91R;N$+7zyQslcC zQf(JBq;V{7NSAGDNPp4UknuOAA@f9bL)KllhU^u-4LQe>8FD-H8}gR9GUR6nHWaj} zGZY5uF%+e7G87vMFqF8yW+)Z-#89Ts-ca`83PT0o%Z7>z+ZZa}oo=YwFoU7`+}ehk znOhoa*Y!8lRZeTD?<;IzWM+au7FHz4#=*|P$;HjdLv_f&ptlEYzPSx0f}oFFz|z98HGV4i0u}D%J%UMVQ_Nv1{1*{431GC92^3&fPs;bk&%G` zguz@8!N|x!O4|Pa|Nnnb`UcUUG!8NXl+HmkD6NBNP%fM`&@0MVel0ir?q14M)J2#5yd6A%r`DXfoM>E0@Ei84uEJ-z5>ypyal2``3ppY z@)(%@TL_}Sc@4w>Pc^yoDS84#!pga$zud{&p zpu7*_gYrL!29*II8dMH|Xi!-IqCw>Whz6AjAR1IIfM`(J0HQ(V1BeEd5g-~=PJn1o zSplL!hoB`3GvIazh${P?3Ds#Z}hbtfoT=sw%pz;SqgUTQf4JwB~G^i{B w(V+4OM1#sC5DhAqK=eo~o46dKLUc_Wqk=X-foC^S| C`Wuk| diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Beirut b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Beirut deleted file mode 100644 index c1270bc1adce9bd9407a7427992036de8accfcaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2149 zcmWHE%1kq2zyM4P3=AL)lIVf5ITxiSKUiGd6tKjvAz`WgmJ7>N)gLTZufMQD^Yeoh zuQvs}&}x0~;)`y;EAE{MudXIsc>U(hgE!lz1iU?8_~6}4$$p49;yD&`3sZ|_~;V$FKMbzUfd`}z9^JR7G6@Sapo;G1;n0{=?Z1c9P8 z7o@)EJ&?XQ=Yq`Dqy*Vb7XswAO?@Cgh53TQ^pgpSrRD)ji*+6-hwlkcNsmuZwRnF) z&1P$Yx|DK&hU|+68o$FXXffnI&^pI?L3_)&1f3-t19YcsNYHDU9H3t^DZwD6G{7)+ z-2)@vi5HA*Cp<9GExuqXTlBz;H}rzp-;f6u(lG%Rcg-GH{;h zDz1_cru{J>>^oaRgedQYh-)trBEP)95Vh@8LiCl37h>i=dl0*2^M$zj6A$92Oudj0 zzv@9^?WTYv`<@5Mu~Pz4#j^d_6oy< zoMRRjayx_*@|HVq=9y8&e%wm+!g z+aFMIVdjI%cMAimHdH^TKGz&jGjm2l?Yh)}y2`4A`absn2F5`I8MF)-85kI36c|`t zU4ugyTwOyziJJjO24H4jU;tr|nqDZI_y7O@|HHN&+5w_LnE^zDG6aYQWeN}t$`~LT zlsP~&D1(4#P$mJ>uQvsNXi#PW(_eJKd{CwV@j)2}M1wL9hz4aK5Dm&iAR3gBKr|>b zfoM>M0yz?tsX#O+V}WQ;<^s{63nG8(7y>|gbgEAYKJ}(piqCuGsM1wLOhz4ao z5Dm(JAR3ejK{O~Mf@n}?1ks=j38F!n5=4VCCWr=QP7n>spdcEQNkKFyqk?EqW(Cop z3=5(`nHEHYGA@V)WnK^s%D^BRl!?Lg?=Z0YL75rE2W4mw4a(FY8kDg?G$?a}Xix?R z(V$EYqCpuQM1wLrhz4bN5Dm)oAR3hMK{P1ygJ@6z0H*(jJOI(4f&fh4H3RcO1p2SkGk9}o>HfIu{;5CYMlf(T51XG;LlpaKa@UwZ-Og9;`PA5=JjXixzKqCtfe zhz1o@AR1IyfoM>H1)@QP7KjEFTp$`$c!6k80S2N$g&2qi6=Wb9RG5KiP=N-fU*v-A z2Ni4}KB#a5(VzkjM1u-B5DhBmKs2bZ1JR%Y4@83sJrE5l_&_wM@B`7H0uV%l3PBJJ zDhNR|s4xW4paKz0f7lL=4^Y7f;)4oD5Dh9IK{Tk41ks>^5=4UvOArkzFhMk^&;-$- zf|H4H5J3h8MGug}vfx-0y zC{Wx27+4q>k_s3(85lwmKx_yJ6M={`@-r~F1u%$!)PUF_2@E1Wz99^5L7`wGIE2C5 z9ZZCP3}s+sWMl+0-~=i0^Z)<<|DZSm(V%z&83Kwc5Dkhi5DkhmF#YrC1P~31I}iZGmV|`U26QGzOwU=?p}J(i)f^BI%9G+dV|rj0*sFlipqc diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Brunei b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Brunei deleted file mode 100644 index d6e713d436fb05ccf2112eecda9943acfb86ccf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187 zcmWHE%1kq2zyQn)3=AL)l3;?eIo5VDx$H`J?_gwNV94GBlFF=LU}0b=XkcLR@eN^c g@(Te8GB7ZZV(S0@|Nnzb2GPWs&gJA6qHDng0MRlXTmS$7 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Calcutta b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Calcutta deleted file mode 100644 index bc909c92c14d0e35a1733204663dda841d768b19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265 zcmWHE%1kq2zyK@^3=AL)k^s>l%zNr~+lDi&g%W3`8m+igA~b`MiJ6IkA?N}~QFI1K zy>A2qCj&!t1|z43ZwP}^Xix})XK)Be9*l8V#>&9J0Ky=s@h-w+0@?qOiy@(d2q KHMKG}-~s^svO7fp diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Choibalsan b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Choibalsan deleted file mode 100644 index 043b7ed5c2d721900d8f45f7a7ab122096d7ccb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 890 zcmWHE%1kq2zyNFv3=AL)lF)~;McOVu*Wl;AGeP3zi3Z7A?;c2&i3EKbv|NjRCFGw>eh(RlXDC@MiTC^|tjC`v&zC|W@@C~848D0)FOD2hQe zD4IbuD5^m;D7ry3D9S-JDB3|ZDC$8pDEdJ(C<%aQP%;3~prinzLCFC`gOUV@9-w5w K1xhZu7F+-X2fe5O diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Chongqing b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Chongqing deleted file mode 100644 index 8a7a28a480a405b75fd1684d757b0db5646b8eb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 389 zcmWHE%1kq2zyK@^3=AL)lHh}~1vmU#F-17{q=4KmGY0w0`T~Wzj0Q!|!~&%_uLfmJ z=K>Y?bOu$S_z!C8o(yWA96xBVYcptEQvSfm%!C9P7?R(Bj7=&4*-$ruk&}U;pn-wc z$2Ww*$KNl6!PzB*!8tetqy~&hapM2~|Nn!W3DO91Du@O-7es@c45C5K2GJm=gJ_WR oK{UtY?bOu$S_z!C8o(yWA96xBVYcptEQvSfm%!C9P7?R(Bj7=&4*-$ruk&}U;pn-wc z$2Ww*$KNl6!PzB*!8tetqy~&hapM2~|Nn!W3DO91Du@O-7es@c45C5K2GJm=gJ_WR oK{Ut5KDl{pb5e8mg-w+1R;1C8+kKhmnAMX&5 zdN{`69*`SA7^IGafq?+3axaL6 zx|xNEm5qsk!Rro4%@_-x-@c@G$NQ6Pq$2Wuluk#rgxIBYHbWN>{ G4Y&Y{utjtL diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Dacca b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Dacca deleted file mode 100644 index 2e4ce78b0022aeb2873c52950d45156094e38ad8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmWHE%1kq2zyPca3=AL)k^s>lEOzR4+lDi&g%W3`8m+jy;?fKz|G5f`OpMGd3=BaR zKq{j%7+4q>d?Oe*85lwm7?kcV#wgHvcw2!m&E2!o5Ga|nZzO9)6g6ytCL8v_Fa z2!m9CXb_hA|NsC0%(k{YAR6Qx5Djt?n4W610z`wH2GRs^9y1dQD+5Ew5s*mG1(5rq gGZ;9)u7tQx5bR1ZAKwrLLM~-s;Bs;a(KX`&0B9{li~s-t diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Damascus b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Damascus deleted file mode 100644 index d7e1bb25e759f4ce7fc2a71df819d628f47b7515..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2303 zcmWHE%1kq2zyQn)3=AL)l9&!<^Dg|fx?)kIe#7FpxdlrS1sj&y)fX&t_}s8uF0o*R z!qtYA?6n_0_6IS1ik?&Oxmcs&i*;SW*U+^M-{eC+d^dZ@@cqBpho5}67=Aw7{o&V7 z4~E}|-WUA2eU{y&7K_9pEFoyGANbZ5Ii(CeuQ(66aZFvwkh!7!d7!6?Awg0bDB z1QWxI08_am31&jGFPJmUdSL$fe1OGM`3IKQLISLg1t(Z#j48h0-t=i|(=nSE0WFZaiiW+_mfi+`k4Vcs!aM;Ca-%x5WUedAZA%zLhPiR3vq1;3GpQ#FC?TnB_xKa1|+$u zBqWVvJN;=w zUZcT<{PN=o1xYCZh2bj`ikzokC^qj-C{Z~bP%56AP{tk*Q1;zFq5MVjg^CB+4=PV? z52!le`=EN&s|z&?^dHpr=3l655PVRdw>W@_aZo}A1|<$q9?&viWMN>CQDETo@eN^c zbqxj)As`tB1_n~{(EtDc|AX=ohz8{)5Dm&tAR3gXKr|>{foM?P0@0xS1)@QD3`B$S z8HfhuH4qKTZy*|!=Rhh`4&Wj@-B!5ynEpE#93P-^55xzReIOcC{()#v83>|5(hz6CFAR1I&f@n~g38sGwg5v{Jc7phz@)JaZ%1{suDn~&ys4NB1 zpz;(%gUVD84JubbG^lI^(V+4bM1#s$5DhA4K{TkW1<|1L7DR)}To4T^cfs^`e{g(& z%3ly4R0e}+P&o{uL1i(B29?Jk8dN5OXi&KfqCsUdh#ulEOzR4+lDi&g%W3`8m+jy;?fKz|G5f`OpMGd3=BaR zKq{j%7+4q>d?Oe*85lwm7?kcV#wgHvcw2!m&E2!o5Ga|nZzO9)6g6ytCL8v_Fa z2!m9CXb_hA|NsC0%(k{YAR6Qx5Djt?n4W610z`wH2GRs^9y1dQD+5Ew5s*mG1(5rq gGZ;9)u7tQx5bR1ZAKwrLLM~-s;Bs;a(KX`&0B9{li~s-t diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Dili b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Dili deleted file mode 100644 index b7ac96e9bf6dd96a6302622b3c46d6f70ea1e157..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 277 zcmWHE%1kq2zyPca3=AL)k^s>lEHLSr#F5i8jXqoodso2y%AmmV@Jt3qCT13928Pl- zAe99T3@i)`brTpkz$6O;LqP)rkB@H%Lx@iZgI90}gR^G{NFfxHV)_67|Nny=0HQ&T Y0MQ_afQ$k;21HZrAg&Of5M4_y0BMCdEdT%j diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Dubai b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Dubai deleted file mode 100644 index 53f70d57a15a664efcc942a4e1644b0fd0b31c9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWHE%1kq2zyM4P3=AL)l3;|gITn7Jxq^{_!T1J9)WU&*#m6^ P|Ho?>mwRxCt_c?aXF(N8 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Dushanbe b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Dushanbe deleted file mode 100644 index c65ff2a7b3e5020f2427309c65caa2e950565690..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 597 zcmWHE%1kq2zyKT!3=AL)l8}J1g;z;7H*8(}-au5nc7d40CINAdjSAvFpH7f?`DB6Q zZAk&CGnosd_mmxwS(AQ1c22|rxgO60@-3Oc2PziUir%85kTIKn`&WU|?ZjNGf3DWMBwM0I?w? zOavtE7Qn#o;~T=@5*iF9f_85kKE8Nmz&1_n~R{r~^}{~)h}Xpr|oW`KeK zM1z6>M1z6?O#gg30Yrm>1Vn>^1w?~_21J8`2SkH{2t&_tgO6nu_fWb zrLL0&ms2-1T*-cL;e}ap!iz7u0k61sCcL_uaN+fvUmxCV&1HCdzW&3z>7N+hZ`fS$ zp;EQsEXwQw+a;T7LMg z?i9dL)BS+s?}iJU-(DqfEi=9#v+u_P+0Ks_d z3o20t391bC0czZDAE;e>c0v91`3D*Ym;*Ggyh+enDSttGcj^P3PR0wmv)v!)#jgy| zuhx8E;BoYV!E^QphAD0dMvjLPj9oMmOca+Sn5u9km@&2`n00@CU@n%JV8P}RVDZ29 zf#v&z3s(2zA6TDvx?r>4@qz7nl?!(Bl^@vmvt4kgXMNxp)A+zC?)d{}$L$|nbeAQ# z3jGamxW>=rwJhf*FS_xOFRhuu=7LM-?gS_X^^3=A>~pk%IPz{mm?;RK8Df=LEf*ANC* z*WeHaPnQq|&)^V{N(KgyE(Qh$9GQomfq?;pL24&L*`ojd|NmdR*J}fa24y4=4a!U) z8kC_xG$>PnXi&xi(V)x)qCpu9M1wLJhz4ae5Dm&~AR3h6!1Nd001yqzcwqW!!UYfw z%77pmlnFsJC?kSsP-X2SkGk9}o>HfIu{;5CYMlf(S%|3L_8=Dv-eRi~Ir*4Jw#GG^lU_(VzkfM1u+` z5DhA*Ks2bZ0@0uX3q*qoEf5VVxIi?h@B-1G0t`fh3Na83D#$=Is4xT3paKm{f7tl} zM1u-85DhBaKs2a;1JR&D4n%_rIuH#i>_9ZAzyr~sLJvfP3O*1GD*Qk+r~m}fph6Ht zg9<_r4Jr&lG^juX(V#*RM1u-OF#SjY>>f}73F3naNe~SxC_yx+umsVd0uw}o3QZ6V zDmXzjsPF{QpaK*`g9=d)4Jt@MG^j8I(VzkqM1u-d5Dh9=!St(aaD0FYSP&mn$bx84 zK?|ZQH)n#~2P$wud{ChaqCo{Ohz1qDAR1HvgJ@78j8yP4GhuKW;oZ~*`t`R_*n diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Harbin b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Harbin deleted file mode 100644 index 292bcb2c7ee4ade8a1ab2b38cc2ea721bb5dbb5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 447 zcmWHE%1kq2zyPca3=AL)k`RQl1vmVgx@X7ba}~!Y{A&0qKJ|le?&cqIyUZBmGwTZ! z>M|M>JrfI*;=CG^HJuAo+|wCUh2lS`se3Z0eRBMu!LH4qaY^|DBNHl%+rzY)G#sr-G#}m8z*dc+{3`g#LUFNkOES}ko*Ru zKB<6#gMp!-fq}!vH-sVBH-y2{IRq>ZB1p08|NsC0LH2=YkewhJWG{#&$8Ii9=MY_U FE&x9vGHU<; diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Hong_Kong b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Hong_Kong deleted file mode 100644 index 426f8c064fe55ae6e38e7f24bab86620b15eba93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1135 zcmWHE%1kq2zyQn)3=AL)l5mBxd0R81{#?%5ZgFL@*NUr78!WEP+PUJoo#T!hdMYb! z{IuM0i;r!^t(($2Zohr8;?9o0JMNx6wc_3)DU17S*Q|KZ_{ZYmw38Z-{4*^cm#x-# zqVH|-H2(OCXZ*Sr&+S*Pc>cq4$4mL{6)$gS?|Ah;cg5=+ygT09_h0dL`uiR4PUL93 zFTc3s!wNr*kKvnleCjaJ`0Q}O;!B2*##e<+7T?^zXna?#v-lyJsPU6E!Q$svXN_M^ zoh*Lei(m2QT-=Vo`y5yNTj#Lj|2*Xt41G#F80%P9Fy*oAV2*vhg2ngQ4pw&-4K{OT z3wE_<8XRIzEjZauXmEZzZo&0zl?L~h5dNg>qbzAT)%hM2?ZD}EtpR+=^TG~Ry z-){vIBNZS6LpBR2r0XUyvM?|dG%#@b_=Yfecn5=s5ReQ50|O~B_5c6>|Df0c(V!Ru z(V$oZ(V&VB0w}KRe)$v z$^g-z)B&PFDFj4=QVEC#r4$eiN-ZE7lwv?MDAj;yP|5+(pwt7RK`97CgHjQQ2Bjnr z4N6TQ8kC~I^jBvM5DiLMAo};c_!S`f&$&3Td;jip1oOcu4I}|dZJ@a8Q`!NdK&cKy zgHj%d2Bkg_4N8F^8k7n_G$4 zISLJOJ@OOeYnU1oau_ElMn7p#@_sx)+4@+6iuTb7s?sYO)VP;VP-i*Hp#J5EfX0*M z44PM#31}VZWYFHyA)vD)n?ZLehk=RU5ReKmCM5v>|Ns9V z6o?>={M@e=fM`%)f@n~Hf@n~nf@n~{f@o0Sf@n|xgJ@77gJ@7dgJ@7-gJ@8IgJ@8o zgJ@8|gJ@9TgJ@6$fM`%8fM`%efaxzs1VA(>LO?VqQb05)Vn8$~azHdFf3;`4wGxc8<*gxgOmG@-=b`6ms|%D8?`>Q1bq`K-v1y0u}Ac3sj|# zEKuX#xHMH|BAs;vsH&a)P{v8F4yE7vS= zf7iUglR0jI=eg7cUXL9Xc&~F`;BzKc!M9Iyf!`W?1^+zm1pz&Z3W4Do3PCx{3c==F z3L)N46+*?{D1>PrR|xxdP9Z|%@q&nJ8x$hH99XRv z@l&!FB*YgjNUZHpNU{%EkQ|$(kRorkAl24KA&nzgAzfBaA^nA^LdIVKh0GJ;3R!nP zDP%AIsgQGwZ$WPRZH2t09~R`N?^P&hy|kb(;O2s&)GZ5&4R$XmahY0Le&Q61=Z&w6>4TCDAcaAR;a6VQmF5fRbXUhf1!86DkOazC3bTTk9 zGBSc03=9l7(l93j0|N+yl$Al*!vFvO{~xxk$pA!y(ldw#rD>2NP`U=uptKF5LFpSz z|2$a$qCx2#M1#^ghz6y15DiN6AR3hJK{P1sgJ@9t2hpHB0HQ(p07QfG0*D6X2M`U) z6CfItFF-UXZ-8h}{s7USJOZY_Tv7nhpu7U2LHPwtU+Me+qCxovM1%4Uhz8{!5Dm&h zAR3g9Kr|>XfoM>E0@0v61)@Ru3PgkQ7KjGrFAxpNV;~xo&%pFwnFSykl;6Pgoqu3H zDBpqjpu7j7LHQ3vgYqDV2IWH#4a$ok8k8SFG$>DkXi&Zc(V)BuqCxo+M1%4uhz8|T z5Dm(!AR3fk!SuUku>GKX3*v+FE{F!@Ul0w-!yp=zk3lpjFN0`Meg@H?JPo2j`5Hun z@-~PD!J0@0vy2t_&miyM5FKA*JySgc9bZEO5Up>_1pwRe!wdib diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Istanbul b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Istanbul deleted file mode 100644 index a7c16e76d1743ccdf5f8b7e6f8ef761e23456cb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2721 zcmWHE%1kq2zyO>K3=AL)l2{F8i%sbMI%77Ec*5+f`z|a>O@6Srx+!3ZUqixD`z;ri zsj5F%u3mp(m4-&bs)v6stp3^gV9jB}fD`ra5>EU-c;Tei*Mw8&8UjwAUYBs@>A`@D zg|8o6%H|BXyvQ=)iZfHdRUh65*EFjyT-Sd8;09;xg_}&%6K=k=zi{jQiiF#jVgl}5 zxsY&obN_{pUv?&ZO4)VcYX)1wH+hQ-3=4KWV9efpfvI8617`237g#cPCa{`p3Si5d zT)=L*qJjN)DFdhEvIU&CtsZcFV86g4a4v!8rb+WfKGVTci^N+KK~&(q|kH z_BCS=aj!Zcs(iOWOg-j+IP?An33j^!lATimB=1Z)Aam^U1=-o60dhS}4DvO_3<^0Z z42m(K3`#z349Yg<3@SPr45~7c3~D@F4C<_=4eDPd3N)T_7HD4iRiJg`b%FMlI|VvR z&KBrS*;k;~vc5pSWI=&J%ESW0*gYSNil%=sww?FEB&hO(scgdsGo$DaW`C1DSV&hC zSlo5_VEH?$z-q7B2kYB51vbl^3v74G71*_@7TC{bC~!z)FK}#;`QYUGvcNg{-v<}f z(*>^14?eigFnZv|dUArh@_hmKch3YonGXtho;xAn^?0#>_qtUAK4IU(%3!Gs7=H-U)jLK7mtY6wJa z`!XT=Dwjaa0zrY;EpG(k>OTv_PdO)$5Pwx5vG&!3B>U|G$+2f9q{z<{NVQ!zA&q0} zgml>n6VhKypOEplXhPeRw2L!S{Va#f2jRmG5p&sM@ehp!(eI2{khhO{iTr zcS2p|k_q*F^%IyF$$`u)Fv!Tn%0?_?V&|X)GB8MIfbyA^0V4|ogNy>wJH;lcFPeHTD9DC2`@Q052GpaK9yg9-r<4JrsgG^j8D(VzkW zOh5b!)(EWHWFT7D*9=5~3p5Y| zRH%VyP{9VGL4_NL1{H818dS)E={r*nfM`%*2ckg*9*71NdLSB9@PTMh;Rm8Y1t5q9 z6@nldR1kt_P+8}z6AR1Iaf@n}738Fy-C5Q$UmLM8bV1j5+ zp$Vcv1t*9G6`mj(RDgnLP$3GUK?Ny@1{J0t8dRWyXi%XFqCo{KnEspe0YrleSTKFp z1-mHum#be0vAMs3SAHlDtJLOsPF~RpaK{~g9>2~4JwF1G^j8J(VzkuM1u-t z5DhAr!SoCxaJm5%&>%jjkOtH5o(X_xP+<+G&z%7CL4`Jm4=T7pG^p?f(VzkxM1u-( z5DhBGK{Ti^2hpGc9Yli)br20I*g-U?a0k(#0v<$z3VAU7-CzQU1{L;T`nnL94=VIQ zd{Ds;qCtf}hz3;vAR1H&fM`%f0HQ&a0f+`w2p}3%DS&8D#Q>r~l>>+dRS+N=R7rqn zP(=ZvL6rrVelZ_hz3<2AR1JGfM`%90-`|`35W(&CLkJAp@3*mr2?Ws z6$^+4RW2YJRKb8~P$dJRK@|;%230m-`okk|_=74P5Fb?WfM`(V1EN6{5QqjWdx!@6%vRBRZ5J^OyocoRv2VrW@9H7GIMZJ0vQ;jH9+o`&R}2x*FhZMx`~&8 z!NP%25G2AN1|k{Z;#vkUwvTTJ1D^T`xq@O~WaM&n4be3M)nz)q#(JiD2KvT2zJ>;1 HmI)UCu)-`e diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Jakarta b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Jakarta deleted file mode 100644 index a4cbe0c576a103f280aa5982e95456a71c4c537e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344 zcmWHE%1kq2zyNFv3=AL)l3<6j1y@$IKG-F8FX8n5=8j8Y?+UKl9OJn4Uyb3*)_om} zOw3FyOsotHDGDGx=?V-i3=EkS44e!MbrTqP85jy0KlD&kzQ$ z;1G~{IL6@~kQ+c4q>h7ufdRx8{r~^}fBQ7g1P~2!8;AzE4@8692%l%(F}E;EW3qJ3oBcx+sH@iIIV!`2|S6ZUO@f14HW! u1`Z$J5C&Jz5C-Sq5Re1|0|P0>|NsC0KgbFY4YCGAlVBB>t7nL=B^LmcgDm#| diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Jerusalem b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Jerusalem deleted file mode 100644 index f64f3afde5f00bff3ba085220ab71312b9784322..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2197 zcmWHE%1kq2zyK@^3=AL)lIVl71?L&KcASXZ^x(|Xg8^sP{9`zG?8}Ao{b>&_tgO6n zu_fWbrLL0&ms2-1T*-cL;d+!v!u9*|2X5$ZEx0M?_TZMlix0P6Z+>uliwVP>oeB@` zKImn*x8+>J{U!Sw9(0#6JPfO4c(l(e;jx*?g(q{qGdvX&yYQ^!@`LAsml|HE|7Upd z!v6wCP4@$izZ))aetVU`waoZ}%)TEFWII1zkUR4~K|Wz-fI`#81VzuS7nEXs6O`q- zFQ`NrB&agj2dHtseV}&j*#-62=O1VsU=Gl{@+LuRrThi$-Kh_BIvFqM&USyG7r!z< zzgqKwfydDch91)%7}?|n7#nU*Fp>Iq!BlW+g6YR)0p=_m4d&+=3oO3HH(1{J`M~PJ z+XCx#(Frz-7Zlho*py(`+*Dv+Gyj1@u~~s*z>)+fpMC~s5B~xeok9jzxo;obc!C++ z-Xwo;e`Ctv@%(Fn=NWMZuYGeqc(4A+;M2qT!FQ@?gJ1jX0{@cl4FPdZ9|A*eHUw#} z{}61lyCFo~u^?1rZbRtb7azj@?qUf4Syd2mcMe13vF8O*d+QjY=k|SwnVY~6J5!+` zuGWbmKL7ZKgjf}ZL|c;&Np21e$ri^7Qq+_hQu%W~q_MFyq%$7*kpA>pL&lAqg3O~Q z8nV_4f5=|Csv&39(t_N+;|zHfLIwGGD;Wy>c77=I>t-nO@-8UW%Vj7L-%(J?=g(03 zF8)K=_w0u9mmdo%uKPArZjURd+OFSFz3Kgjn(2ZKwVl%o>dHPh)Q7VaFfqa*GlDr# zECvRJAE0EdWx&Y7z#yZ*z`?*^;lRk_|8D-aFJT44IV`~eUR%3>fIl+8diD64_#*P9=JXi$~|(V%PxqCr^?M1!&)hz4ar z5Dm(PAR3evK{O~kf@n~d1ks>u38Fz+6GVfuCx`}RQ4kHvreOMo{{>K>fU+x?{<{Ip z2W49jACz@LG${LmXiydg(V%P$qCr_1M1!(3hz4b85Dm)KAR3glK{P0PgJ@6|2hpHx z4yLa?1KS76?jSxW%Y$f8wg=ImtPi3=*&jrMiU1G|Dh5C_s3-u@pyB{TgNg(Y4JsBu zG^l6*(V*f1M1zV55Dh9O!1Tvu0U#PwT!88Gj0GSXRBV7~P|*RRLB$7%1{EP78dQvc zXi!lCqCv$8hz1oYAR1JxfM`(B0-{013y204F(4XL%z$W6Q3Iku#SNH#ll%chgNhvx z4Jvv-G^qFi(V!v-M1zVU5DhAdKs2a00@0u%2}Fa6B@hiNnm{zDcmmNu+UvpQgNi8- zA5>IEWHV;~w-l!0haaR#D6MH+|(6>A_G zRJ4I;Q1J$$K}8&h1{HH48dTJQXi#wnqCrI-hz1pVAR1Kkf$68u8bCCt2n5lfVh}`w zib4<#Dh@$3s7M6Spkfh3gNjBF4JsZ%G^mIK(V$`yM1zV-5Dh9WK{Tky1ks>k6HLF0 z2Zsl!_yqAmMJR{{6{8>;RFr~fP;m;PK}9Nv1{JFy8dS7`Xi)JAqCrJ0BQp~mvLKiP n#bRJk diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kabul b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kabul deleted file mode 100644 index 7392c0497a75a943ee6ffeb9b3eb19b2fd17d22f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmWHE%1kq2zyM4P3=AL)l3;|gSuXs%?!d^vVBr7~wfA6PaC8d+F&S_e!py+H0KyEkxJE%GiJl E07q6E7ytkO diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kamchatka b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kamchatka deleted file mode 100644 index 4e53daafd442ddb79e4bc354b5119a94607708b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1915 zcmWHE%1kq2zyKT!3=AL)k|>3;`IiSxJF<20tP7&*nhs(Tu^YrWVh)J^oM<5Na)N{8 zts@(x&WJil?@>ySStFbvJBKAfuKR0(eD$*gh3xAIiqR($l)QH)C|j>eP|=>9peo&y zpvGOBpw6=5f%=!34>X?4_@G(g@ImuR;0CQDCJVH;#6Hkj;`cyziv0t<7J~=+C5jIW zQiL8D#@Zzq6-g!-+bSfO1pZDim1RmWGrXH%_UB20h1Aan7I%&%SpK^Gz-rHm1nXOS zAJ{BC^1yc2{0DZe%O2RzYJA|3+VQ}#d0v8(Yt{qjJw>vDW`VlD$kqa;)Kl6uEy1skXuo(m13Zq|1DLkpBG7gN#4dA7mcC_aN)e z&Ij4c4?M^@dMzQhebIxwr8^Sx(_0=Cw9ZN>3|N>@lv_#;nfU-jgYpQ72IUhleI;-Mhz8{s5Dm&RAR3f!Kr|@tfM`(u0nwm51foIt2t(Xiz=`(V)BtqCxo)M1%4qhz8|L5Dm(kAR3fEK{P0jf@n}a1=H`m!S;jl zD~J!uvmhFjZ$UID?}BJh{sqyXJPe{i`4~il@-m19&?vw)BsfIJ T*I3U~&p^l5&;Ug18*>2wWQXt# diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Karachi b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Karachi deleted file mode 100644 index 5b8ecedacd6632fc17cf4a87929bce1f3d4c53db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 361 zcmWHE%1kq2zyNFv3=AL)lHi20#X9T$EIBjPXvL)xp&55qJXpcxzuLfNz3Us>`5JdT z92XdP?7E}C$i&FZ%EHRR%D`ZE2c+9Kf`NsBAv%MRg@M5>fPsU7AtZs37t9v&@eN_{ z3=U!Nb_@z(2=ERD5g{N=a7>Ex{{R2~ALK+34RR)k200Z(gPaR86y#(O4RSV!200x> SgPaehsqY1@0Phf8Q!W6N;7zmu diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kashgar b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kashgar deleted file mode 100644 index 25e64945cffaa986df97c9b87293c6737e7103d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmWHE%1kq2zyPca3=AL)lHiB31vmUV>T-Od>kAa>G8z;;6AP5$ zyc(1>oeNal(-~BS;yn1RAGB6Z0F!1{LhA?>yM!<}2Zw-ELNO`s{r~^}e~_C&G|1f`BS3Bk(IEGO zXpkR3G{_$y8srxc4e}3&2Kfm@gZu@eL4E_#Ape2sPmUizG{~P|nu>nqat;pBwcr8( D;DSgd diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Katmandu b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Katmandu deleted file mode 100644 index 65c7b63258337e69f9262e0f1aad23fe384bc60d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198 zcmWHE%1kq2zyQn)3=AL)l3;?ec@}=EZIP2OSi#7|z~KJ}B;^~yz{0=~aEF1z$2Ww* nGdP67FCYXY!N9;kipl@~|Njp%9i)|b8@T)eLUc{7OiZ}|!0sH( diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kolkata b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kolkata deleted file mode 100644 index bc909c92c14d0e35a1733204663dda841d768b19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265 zcmWHE%1kq2zyK@^3=AL)k^s>l%zNr~+lDi&g%W3`8m+igA~b`MiJ6IkA?N}~QFI1K zy>A2qCj&!t1|z43ZwP}^Xix})XK)Be9*l8V#>&9J0Ky=s@h-w+0@?qOiy@(d2q KHMKG}-~s^svO7fp diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Krasnoyarsk b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Krasnoyarsk deleted file mode 100644 index 9b2fb8eb2f453badfceda7198db7a10ba296f326..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1914 zcmWHE%1kq2zyKT!3=AL)k|>3;`4|4={jqiNLj_Uw{0U+bOBlpC77K{~yxt)3^4bK+ z+uRINXQC%a@5$I8vnFzb>>RHRay`}?kW*pyd63gR=F94Jz6XH>gTq z+MvdLc!N62djs_^4-7P(+;`BdXm`-OGJ`?uNYw}JElUh^mP|F!oziBY*HUhvUy@;9 zkP>NN7~8VJs3?Aev2EH0lOV?prm`Lz%#4&bnEln-U?J^bU~!jcgXM1}1FJpnHdx*)yW2~&MP*!v6dRRD|c;h ze>ZW1Cv(mQ&vV5aydL{)@Lm_X!RJi2fp4Gr2ER4F2L5@H8v=Ut4Fbc>41#h54T8-j z3_`p=8-$AeG6>VYY7qAAjzNUT#|;tJ_8CNexx682+X92=D_b|j%-^#icFXh)arN^y z#80W*kPzRnA+dIvL6UvahUC}^gA{p}4XL(K25B6L2I;ak2I()H4Kn`98DySNHORWl zV356n-5}?f%!b_dmj-!D|82-mKW$LZ`d~w0!1E17sfRWc8=Txw;<{u*sle(DWqJn< z%0BdNsNh>{P;nuDL*=_xgQ^XI8>-Kx8`R9qGpJqXX;4=gU{K$uZNSLP1c5B9NRW-4 zg^3wifVyl3hH!A=3Q1sKVPGg|VB}{a0%Phz8{|FnyN?%m?K+5FeE1Kr|@dfoM?P1JR)T z2ckiF5JZFWA&3U$MGy_jk02V9CqXnQUxH{*-UQL0{0X8#c@#v0@+p{pHxX<;CeR2G0}Pghz6B0AR1K8fM`%z1EN9Y4VeDW3yu#^ zxdY;Z${r96Dt|yUs0;$ppmGRAgUTWh4Jwa7G^k7h(Zi)&;sTXfy5`>1zQ%f{ PdImbah6W&7-lEZ)}Kx_DQ*--H8PPZCaTewuK4Vm!wskK7Mp6TfmW zGBLBTvam5QB*udDBo#2QFfgPmFmi%O5IeI1MAl7U;AdbcXkZWy_6=e1b@Txf!66J@ z!66L3ks%}I4Dn$gvBX%AgOdtCHl-^t@`63W!N8DN0TQX3z#t6vh`5h$2m?`` OVPN3$jSSJX-~s?zP+1WG diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kuching b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kuching deleted file mode 100644 index 272f46546e9dbfeef15e9f6db0ebcecf6de73360..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 505 zcmWHE%1kq2zyNFv3=AL)k`RWnCDwMaP1u$0-m$-0y41Z=YZ?w-T@Y~C?g7K$ zZI>?`RS<4CI)gpnIHNnm@k*-;Cmx?+I2pbF!l@(w8&2DN4mdqAg5i=!?gz1n?-&@F znNT1LGb;l_dI8A3%nAk;28L1tMotEXf(8(~ZUTbTIAC@4TQC^$egC`iEc#0Ulu4GJ2NCukfzT)vSZx)xjjX1BEB diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kuwait b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Kuwait deleted file mode 100644 index 1dab31cba01d73f62cf595984cca284cdf2ae0bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWHE%1kq2zyM4P3=AL)l3;|gIc_DIwlFd<===eRY8f!F`1pn}I0lD+xD2Ei^#A|= P|9B1Katsd9HRb{U=4}&o diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Macao b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Macao deleted file mode 100644 index 7c937795787238ba47b51ad3cd4722f3a484074f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 781 zcmWHE%1kq2zyK@^3=AL)lF)*(1t&dIVR>JEamR-hei|RcH}Ck=VW9EZJf-1FhLFZr zg-sUU+`njiXGmuFp}yq9Pu2vBpI@Cdem!-v_nU-wlfOYbf-74t8MwfA-08qlkJ2C=eOe)T+dc%a9>+# z!E>xfgLhlE1>dqf4gP613<7O(9|X(f7=-ez3xwmX8bthM3oK$88JHM}gv<;KSv4Rp z)=gk!VPGg|VBiFkygt4m48H!sAR>gpIXDEQ28>AwuK)l4{|5ybhz124hz126hz128 zhz12Ahz12Chz12Ehz12Ghz12Ihz12Khz12Mhz12OnEvXl0ir>{45C3n4WdE84Wj?< zb6f$U!NCqagQ5^bgQ5{cgQ5~dgQ62egQ65f O(>PkWoP$GjEw}&xd-K!) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Macau b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Macau deleted file mode 100644 index 7c937795787238ba47b51ad3cd4722f3a484074f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 781 zcmWHE%1kq2zyK@^3=AL)lF)*(1t&dIVR>JEamR-hei|RcH}Ck=VW9EZJf-1FhLFZr zg-sUU+`njiXGmuFp}yq9Pu2vBpI@Cdem!-v_nU-wlfOYbf-74t8MwfA-08qlkJ2C=eOe)T+dc%a9>+# z!E>xfgLhlE1>dqf4gP613<7O(9|X(f7=-ez3xwmX8bthM3oK$88JHM}gv<;KSv4Rp z)=gk!VPGg|VBiFkygt4m48H!sAR>gpIXDEQ28>AwuK)l4{|5ybhz124hz126hz128 zhz12Ahz12Chz12Ehz12Ghz12Ihz12Khz12Mhz12OnEvXl0ir>{45C3n4WdE84Wj?< zb6f$U!NCqagQ5^bgQ5{cgQ5~dgQ62egQ65f O(>PkWoP$GjEw}&xd-K!) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Magadan b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Magadan deleted file mode 100644 index 7b3d505e35fcca0f2f141f2e225647ffbc8f6168..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1915 zcmWHE%1kq2zyKT!3=AL)k|>3;`BzDrE!etv#RE}w^8hi4>;vK)Sr^2A&UcV_IWIu+ z)};edXOsh^_ZSq&tWhkGog-8r*TY;OU;U*(A^T~8V)V5FCGX<}%GNsyRJ2zXs7lW& zP~+|{P-ofpLH*0}4;oLFGiX-$GiY9kKcIEQX@mBb><>CiVm|0j@%^CJV)sG6ME`?9 zioyrOSf2u;BJ~1eTfG94AkG3)S%CsG!`B67e?AphNV9*ixO1hz^4H4`R(rM;Sl>GR z!Di{D54OA3ez0rZ^1*&q{|ATEX&)S$*AzIpR(x zU1WhLvq^#HIqL$i$6^KE>tqXj&KQ00?fqZiw?^cHf9}JAfbMS}0>l1(2+F?kA=vEx zhY;^wA40_rehAZ^^C9fp;tvrbI}0MNwSI{FGP@vZTl$CSE42kN^IHmHx5O93)u$E2 zPjM_ri1#Q+td0GUWUp0_9Bcm}MV_Z1)mHIC8i&S*bXn#P=`XlGWc+#hA@lf~4_SAP zf5={b?nBPeCk46f8$RSMJywvPKIub2>xzQHfb|7Msa*xd1``WPTyqLa1&RyG^g2G2 zeF!b6;LG|@alyQx@}19zstu9_)#vm+)XX&fP`ggxLtUl#hx*=69~haLAdrO>39_-X zFfk(wP?ycX(3=2CSv?CFSQr>q9AM;RV3@T5#D11GJ zWMl+07#J8xNyGpD|Njq4#~>P%mO*BK(ldw#rD+fiO4nfe=X?hc4NBi28kELCG$@^e zXi!=Q(V+AWqCsgMM1#^jhz6y75DiNIAR3ehKr|>HfM`%&0MVfQ0HQ&80z`xI1&9Xa z4KV#>`3DdU$|E2eluy9)mG}c78kAo^G$_x2Xi&ZZ(V)BoqCxowM1%4Whz8{&5Dm&p zAR3gPKr|>%foM>^0@0wn1)@Ru3rzp{Q~;tu`3y|oxdP^c@*9W`%5xwZl838F#y5=4XYCWr>*PY?~tqaYfTPr>xNNU;5& z{0icO@+^o3*LR33q7P?-dxhfBG{1uC<24Gn!A-Gf7P Te2w)?^$c`;4GloFzA+a7nDzGd diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Makassar b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Makassar deleted file mode 100644 index 736a25b4a0a77882b15bb200e31feb4df6d738b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmWHE%1kq2zyK@^3=AL)k^s>lEU@rX?1WunS0|kAkZrgW_O5`DiJ6IkA^!tNQT_*z z`ho@q4hDw02@E_wz99_0z99_Go*@ig!66_eU`&dA|NsC053&}S8xc(NCpN592T=OFn~0H z6>&k?g8%>j|1a|JjsS?Rmbae(qCt)U(I5wbXpo~oG{|8f8ss=IeRa_XkZB-Cf@qLK y8JU@wS(uranVA3omj}xh7J%gHCNQ#qoy`e$Hm{E_$kiB52Px$W@Cebh-~s@NXj_#4 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Muscat b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Muscat deleted file mode 100644 index 729d95e1c083dfb41481c3257ea1cb3cef4c1e7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWHE%1kq2zyM4P3=AL)l3;|gITn7JHieOa!R!r4)WU&*#m6^ P|Ho?>mwRxCt_c?aW?L0X diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Nicosia b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Nicosia deleted file mode 100644 index f7f10ab7665e94ca44fd8cd98a362cd4b304eff1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2002 zcmWHE%1kq2zyPca3=AL)lBkEWd6$;U?cjX7{sGtBNf)?(r99x-cPxN+iDd#`*TW0^ zEz$`BrT!NLlm8|N1wRN7_LY1fVtgn-RQX_nnDCMSapuJd;-A|BBp$aWNM6nekUE^6 zAibyMg3Oxc2eNb0F39zyK9H~RxS){Z{y;HC>w=Px<^yFLo(n2E+z(Wx-(67Se)~Y3 zl{-NFD_4TXleYnySKcIO9XTJMz2#hj&XSD*x>GhJ=(S7^&@Y*kV31N8U>LjZfsyaT z3&yq+9+>DBUoe#|dSGT$Az=2mUcf?n$^?tMi2|0t%O+Uubr!I`9WlXXS^Nas-BuIq z+8ig?&z70skfuDrvBgrr$&Gb_bBeTpi|X?UuFii2+*nUea96%B;QsEJfG6`o0nc+M z1iT(E7VuuTO2FsL{t3Q)Jpz7f7EbWb%M%FbX`T=m-Zdd8Cv`%wdCr6oANL8N;(imt zbTlV~eK(j8A?hX&ab0La+L|^3+h*=;g5WD4#KwSN2f%qxs1QOz}3MAIP znvi6_T_8F3%!CyAnF6V{>n5aeY@LuUJ7Gfli|G?G{uWKhJW)9z>u$(|>=n@ya*h=W zuK$*Vigt8Bh1S*h|Vt6VanzOQ})6C-JmnT4v5fkEB_loquN7+Dw? zWE2=UVI)Yz$2Ww*)ioGIgn(2rGBPkQFfx*ow*UYC{~wgTLE1rS97KcCIfw?Obr20o z?;skK=0P+l-GgXQ+6U2~^bevzc>qL%@&SkjS3ooC_jN{ zP@V$OpnL_QL3s;AgYp-c{>lZmAC%8Pd{ABk(V+YWqCt5MM1%4jhz8|75Dm(IAR3eh zK{O~If@n})1ks@U2%L3tQNgYq$m2IXZC4a(0T8kDC&G$>z#Xi(k;(V+YdqCt5aM1%4< zn11&RY(FT!gZQ94528W&9z=ukK8Ob8e-I5S13)yW901XvvH(Pb$^#G$Dic67s9XTi zpt1o(gUSaG4Jso*G^m^a)87pyfM`&80j94Df%%|v1H=cF9UvN1et>9D83Lj~hhz6B4AR1KOfaw?0!S;j79S|Q> z_JC+m`2(UsWe|u4l|vvJR2G3~P91*Shd0>=la+ye1IWfzDBm0utlREB|QP&o#oL1h_;29;+Z8dRo%=%HG!ak;vN a=o*0vJRM(SJySgcePbP8Ljy3&gbM%&q|NOB diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Novosibirsk b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Novosibirsk deleted file mode 100644 index 806ca1ae7e76e3c04d95b2d919b486015bbfe489..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1944 zcmWHE%1kq2zyO>K3=AL)k|=|+`4`@nRN1=tp@OJ-{sb|JB@E&miv`4gUT=_id2NE^ zZEgmsGtm>I_hf94SrfTIc8=EuxgP5c@-;de6mn!YD8}$@Q1br2LD~Al1{Ljx8&st) zZBXMryg{Aiy@C3d2L>8X?mK8!v^!{CnZclSr0RqAmL&$-|NIzqmMnJAoifEiucg&N zzog8;ASKI zIbeNT$iZfrq=W6QFAjFCza8vnU2||qz3brE{ON#`>wX94fcLuO13qUe9en#-5BRN#cJR+rKM>Gk>kt_3;t-T0 z?+|RR<`Ck;=nyK-;Si?%*dgrOD~AY?{|6$jopFf#^6)^^wsj8CR}LSDnSbg)?3Sem z;_BBNh@aAaAR)f*Kw|9@ha~%g1Ie*%4k_|M2U2Y_9MU-Q9nxjJ9MWF|I%NFSamYMj z?2vVr&mnt-s6);%tpmC3-yQOn@f^rczv)oW`tCqsz}EvssTU3u8(cq7;=1WTsld(y zWqRiw%0A3KP{Fs+q2faAfy#H29jZ3OAE-W8>QFPY#-VmyxIiz);Y@$jQKvQ~+W_NSFvn9HJ(vfRWS3H-y2@ zKMYI+hk*1mFfuYSf*D|flmz|%|NsA>L=B=r2^(YpC~<>mPyz?hphOO)e_n3@(V)Z* zqCp8BM1vANhz2Em5DiNFAR3ebKr|>5fM`%g0MVe#0HQ$|0z`u{1&9V^3=j><93UE$ zK|nMplYnSYMgh}b9vFaVP=*1~piBd%ugm~Z;LHPJfHDx6{^tjxz!?d|0A(f+4a!g; z8kDI(G$><%Xi(+?(Vz?lqCuGqM1wLKhz4ag5Dm(3VEV7c0T2z!cwqXj6qpanfFM37 z6M|?^Mg-BI%m|`E84^T;G9`!xWlRta%A6n?ltDo>D3gL{P(}sOpv(%QK^YcAgEB3M z24!3@{cb+keozJm@j;mwM1wLihz4b55Dm)EAR3gZK{P01gJ@9Z2GO7l4x&Ms97KaM zI*0~kb`TB9@E{tL=|MCon1qX-*6&@fORDgi#7lB~=K?Mnj z4=PMRG^juU(V#*FM1u+z5Dh9^Ks2a;0nwmB21J7j8W0UCY(O-qzyZ;qLI*^H3LX#* zDttgRr~m@fA7+E&15^-!_@KfFM1u+>5DhAnKs2ae0@0wt2}FYmC=d-Qq(JnrE2y|Y d#h9*{pMO|zh>owZo~fRJj<2Bsh}Jje0swGa*T?_> diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Omsk b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Omsk deleted file mode 100644 index 77b82ed0fcd4295adaf7152ee2b97d5c83e5b760..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1914 zcmWHE%1kq2zyKT!3=AL)k|>3;`4?_>*syi+djnDR+67_~n*_u;HY$k!d^$nm<&y=H zwQsYWto81kxmBfEt?#4mMnJAoifEiucg&Nzog8; zASKIIbeNT z$iZfrq=W6QFAjFCza8vnU2||qz3brE{ON#`>wX94fcLuO13qUe9en#-5BRN#cJR+rKM>Gk>kt_3;t-T0?+|RR z<`Ck;=nyK-;Si?%*dgrOD~AY?{|6$jopFf#^6)^^wsj8CR}LSDnSbg)?3Sem;_BBN zh@aAaAR)f*Kw|9@ha~%g1Ie*%4k_|M2U2Y_9MU-Q9nxjJ9MWF|I%NFSamYMj?2vVr z&mnt-s6);%tpmC3-yQOn@f^rczv)oW`tCqsz}EvssTU3u8(cq7;=1WTsld(yWqRiw z%0A3KP{Fs+q2faAfy#H29jZ3OAE-W8>QFPY#-VmyxI)8Xw;f27ljRFcBOA(#gQc z$jAt0FfcHXl7|2P|NkG9jzKgiErZMerDqTgO4A@3l&-<_&!-bWG$?(8Xiypl(V%n= zqCsgLM1#^hhz6y35DiNAAR3hRK{P1+gJ@750MVd)0HQ&80YroH1BeFY2@nm+7a$sx zH^B6lcMc#Llt(}`D4&4oE6W5xG$_A-Xi%O3(V%<-qCt5FM1%4Vhz8{$5Dm&lAR3gH zKr|>nfoM>k0@0v+1)@QD3q*tR7nuHQaR5Yv@)?-ED+T6*@*9W`%5xwZlP%mq9crKZ9sco(9pNd<~*Oc^gE7@;8VE z<#7-V%I9GE+beLqfbu(t56bf(8kFxrG$`+bXi)wK(V#K_M1#r!5Dh8|Ks2a40MVc_ z0Yrn!1rQA?8$dLud;rm)G6F<{$_Wq+Dl0%VsJsBvF9N~t0hJpdKB(*f(V+4JM1#r@ z5Dh9vKs2Z<0nwoH1Vn?%6c7z6S3oqVYyr`r@&!bL$`}w0DrZ16sH_3epz;Pxf0zx9 z4^X)S;)BW_5DhASKs2Zf0@0vy2tn93GCFf;OfVD>lUfrWHdg2i342bRBm60G)0Jg~m4mteEZ zG{JVaK!RPHc!K?`PYDjGKNB2V_#QZ!zI9+^VrF4xVrF7yWrIR?4t5SkE>13P9_)~p zfx$op6do213@i)`ZUG=NB!Q8WfgvOT#6}iz3jm43R5J22FjzP+h=Oz>vl&Evd_x#Q zgB-y`a0r8ckRyZ)0a?Vrz{tqR2qGaoI7v#R{r~^}KPcirG$`^whJYdvM1vv`M1vv{ zO#l4607Qc#6hwm}6-0v~7DR(07es?17(|028AO938bpI48$^R597Ka69Ylj79z=s8 zA4G!^0Eh-90uT*K2p}4i7{GM>i~}GVlqkUTl|u#~8k9IdG$?_9Xiy>n(V&C^qCtrT zM1v9xhz2DZ5DiK=AR3f-Kr|=;foM=70@0v^1foHS2~7VDc>tn8i3&{LH3RcOi3`LB wB`^>TN@O4!l+ZvlD6xTPP=W)|phO3vK?x5;gAyNz9`Xs0%Rk65MAwuH0OL60r2qf` diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Phnom_Penh b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Phnom_Penh deleted file mode 100644 index b9768b1c2929ee5b82803278de3c384d3ad2c766..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmWHE%1kq2zyK@^3=AL)k^s>l%+rzYqB1f5-G#}m8z*dc+{3`g#LUFNkQ4(_l>7#y zKB<6#gMp!-fq}!vH-sVBH-y2{IRqpP#-!Nw|NsC0Ap1Zx$W9OqvKK^?V>g$lbBL}v F7XU2TGHU<; diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Pontianak b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Pontianak deleted file mode 100644 index 3e882dc3570532a0afbbc73deb6fe15c38f37286..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 359 zcmWHE%1kq2zyRzF3=AL)lHh={MY{j@G3*k%&v3eO3CE?dcLmpNj&a=jug36Y>%I=f zTO|#QOw3FyOss4S3~3D@jcE-GEDQ{p6$~5<40RJ2co-N88bIuV1_l8JhNJ=p4j39{>OV diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Qatar b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Qatar deleted file mode 100644 index 49668c2583c83ca4db7f304af8e4155711d39bfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmWHE%1kq2zyQn)3=AL)l3;?ec@}<}YrxVq=>Q`W1A{>TNXo*2frWuV%YcEy$2Ww* kJvfBHF*pPy!N9;kipl@~|Njp%9i)|b8@L>ULv)R~0I#zdtpET3 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Qyzylorda b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Qyzylorda deleted file mode 100644 index fc3bf46bccc52f5b437d94424b6a55446b65a961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1068 zcmWHE%1kq2zyLf93=AL)k}!d?rB+F{E!evFuY;(1_XaVE0}A3C8x_QVeqJE)^3w*% z+v*BZXUaE7?`gRpv!?Wd?3}aj*KpyVTcLD`1qf{OOv3#!uZ zE~s(ezo5>_9iU#{wL#N+nSo}-)Bw#Z%LKHJbTVjf+2o+JWU+(plqn8+Ev*jvC1nl< zDd`S|v6BuM73Cf5V{V72GZ0qfgB z4mQgq9c*`faj|3~m7+G9-bKlYt>50mMcYaSLGJXJAMwU=#t%qOg5@Lm0e0qrgOP z2t#0G6qpDO0U6G~z{tn|B_MnT1_n}M>i_@$|3R?@qCqhRG6WQBAQ}{NAQ}{VVEX6h z1t1y}iy#^llOP%tn;;q#qaYd-s~{Q_vmhE2yC51A!ypmV8w^B@`&`yd*W0>E^A*9H&`N(o@PVrl@GzOqaJM1xWVhz6w$5DiKlAR3fHKr|?o zfM`%k0nwn;0-`}F21J8W4TuJ%91smkJs=vCfC$NR6z3486c%~6Bsxd z7@{*6c!PXH7@R_bLKwV)Ll}I0LqKZ47>8Y~3=9k)3{nHK6T}w%|NsC0ux*_;Ks3l+ z5Dl^$L__UoVPJ^T0BMR+0XZN#gMovAp>6^LFW4D^KE5FgIGw`4z~$>3qHAVlY`_Ho DM`Snk diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Riyadh b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Riyadh deleted file mode 100644 index 6ebe393d0b866580e22349b749152995c6ebcaa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWHE%1kq2zyM4P3=AL)l3;|gIc_DIZDC|!&^`ka)iPjU@$n5|a10IsaT!Q4=>Px! P|M42e`z=vNbU diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Riyadh87 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Riyadh87 deleted file mode 100644 index 2edb566e5404a1c5bbb9ac31cc1684fa6ef8700e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8669 zcmWHE%1kq2zyKc^7#Kj9fq{WB0Lo^O|D|sr|GVLw{GUtd^8Zv=<^Pw?Q(!o5qrfC_ zRe?DxPl06*y8;{U0tNPXO9hS%mlU{|(iFIZ|10n;ovgt7U0s3SW4D69EPn;T*N+v1 zZOauz`q>mjAIwq^H_}v)Xx^b9dDUG(TJ4&GOhtl%?8)~E^3s(G3c1V*iu-yMlm)~U zR1)VXsBTtMP-j`Kpb=)Ept*djg4Rzf1>HIJ3Z|`A3Kkls3YL`{6s%5bE7-^^Q?Sib zRIuAWUBN+6NWn3wL&0hDKLr=o5(U?=R|;+`5)|BjUQ_V&_EGSfvsc0Uow0(i{SpPg ziJ}VrkGd5CjsGYFwdN`WU%RIes^PB?R=Hat{Irfjq|97}s60M}=>1g+u>!9Z;*!D@ z;y0gANMtopND5o3ki0@rA?0V2LYmh*h4eX53K?%tD`eT5D`ZbttdR3aL?O?(K_S28 zqe8*8ScM|>lM2O^RthDjmMN6Uh%1!mHY-%@`=U@Kkg8Cfcu}Edvy(y{%Vvf8FnNWB z=?Q(8Om7haVRx95wl+aICFG;rI4?9>DK5_Ode2$h>__AiP!q8D0gSEqJo~JqGEl&qS8fHMHQuLMb+YuifTub6g9+dC~9VS zDr)WArKrQLt*9F_M^SGbucH3{Iz_{P_lib~5)_R;pHVb*wN*5mwo=jjg_NSDWt*Z^ z*C$2mJ8_D(y5|+`>a7*+FDzGdR1#KnDy~;_KJr@8RV+x+Eq$M&`%W!IPp)Z-UNKCH z-fJ@zeg0il^b2rQ^k2AEG2pX^VvtLNV(`>AiXqQ~6~ip{D~5MzD@NR&t{A1utQcLF zuNZUwnqr)ylVW_)I>m$|Qi@5UZHmch-xX7KBrB$Io>xqdwpPqovqmxVpM+wzf2U&3 zg0G6XpVAcbov$kvO!ZJKe6~}u*g{LOq;s}n>1{#9a-Al{irOEFmFF`Rs}=4m))a** z)*e2sSTE|R*pRkIv2llyVl(Gj#g=Gg#nv_R6x;quDt0auQS5QySDe@-qBuoYQgLeC zJjH1jloe+vu27s=tgATd$acj!Vm69%(~l|6+Zmv^fa{jx!kA3OMQcARF8<%7xHM2u zaoM5;ip#&~E3S0ir?_f*kmBkW&lJ~Ml`5|5;Z$6Icdp__eKW;P4W|@0Uy4)Qs{CDX zTj>PF?Z-70cS;;m+?5rrxO?{(#l5_}iu>Z#6!&j9qIi%gR`F2qZ^gq)XDS}~Zlrk3 zl-tZ`%vR$Qky5B?b%!6l&=Zsnu&$lQkUbuQd@sfI+;^m4zidRleRlFu+ ztav^5qT-GH`HHs$c@=N%Jj=+$%)-jX&cVsW&BM#bFCZu+EFvluBNJ@tfZl!sim!>D=np`Z(wL-Y+`CABxr77X=QC=YiIA^$l>Jd;_Bw^;pye= zElbw~Bk)D=XSX5k6 zT2>wx8xtK>QCU@8QyWrO-_Y39+|t_C-r?QJmSFT)cGg!ufNT z&t5rw_1g7gH;x>>dF%F_y?b`wy?6h?)`yQaK7R7_+4C1KU%h_wwjk?Waarv9$`7@{ zfz2}+7#Or~fNCyn0Y(M}2CYwE@+O$v4JH?X$rdn~4JL!Yq$QYC0F&$>Qu7^{yagr? zg2}aDaweE;1(StfG8RmFf=MedsRky+!6XNW)c6S|UxCR7VDciEJPs!Jg2~NbawV8t z0w!mH$*Ev+0+{RulWkzK5lqeplk33b4lsELOr8Og*TCc#5UI%wCV9c644Bjglcr$O z1xyBm$s{m21xzjmlbgWgF)(=*Ouht@KR~1w515n&lloxN4os$j$x<-c2`1-)$u(f| z0GK=vCLe>z?;ui}4NOXbNlh?m3nqQQWHgw}2a|PRvKLG)1d|)UtOOVnEVeS zb%nvC4w!TRlObR-7fgclg)TVP=z?>TE;xVbf^(cMI1lRn1F6�+Zm}st3-wdf;5F z2hP!Y;M}bT&gpvKyr8!NtbRL~JPjtn<%1qLFX(~ufZ^iDaE{Oi=Lmfd zun0J;^ueL04=#oD!Ffa<9K!nG(n%j2=KA39)CcDpeQ?>O4~`doa1PQ3$CN%ej`YF# zOCKCN`rz2n2j@P0U$Bkfl1*O_%w__Sdf@U+51hO8y1*i3U=p17^$fsla0#aS6vWmA zmnXX5GD;U*F6q{Q#goCLE0|OVlYAgj=L49$1STuMBm;=lKElXQRaM2nz&OGHs9G9P zn3R4bC}2Q+NihAp;T)L$b15B6|5ITF)Bj87foM?w5==8mTm{q2S$SZZWe+=;X5(D| zrrF~y!8FH)OJJIdDGf|>2mc4tJWD5oY2NSZV4B}!H<%WfUq1%Z!nWmLTBM&1 zOp8941*XM~G{Lk)^A0dAdDR_EORHT2(=rtaU|RO%doV38T?wWYa+$%j;=W!mtt=o8 zrd1N>fN9muYG7KOWi^=A2r~fFn#;F>X|11DU|M&MJ(xCah43vjOu>B1$_-%J>a;eP zwvkx|rfu^S!L;4}>0sJHPzX#rCUt;mr_KMsvXqU6XGvVZy&I@ z*POjz+WVa`nD(__0;c^Yih^nXN8MmL(D)CS4r)4|v7f$2~UNH~X8Lc%@#v<_H2 zQf4lgj>_W$)6x5@z;vv@YcL&`6b`22H=h90iL54IIw@=^m`+|H2&PkhHi79huXkWN zeNGgZ&UkwoOlR4fgX!!Ei@|ixBM~s2XWRg$^IO2<9iV%-*1bi?uqV7d|9NMr!@=fV7z z*^uX_*10d#`bV>3;QkFg>B-E0~^mDjQ5s zmVOAPr{qGyaq7OaVE%LgXD~e@aUYnTxfv3!vsu=I`E$aw!1UbZkZ_*&Qvu9h;58de zFPtL=rWd`P2&R`#=mFCkWFY)a`=^2VTLh)S^wuOuKHauO70lnkx(ZD14A%$KyH;!g z)4PA!f$6>8hr#r|xxQd}|2s&&KIjkw<{z5)3``$>TmYtzn*0LO$J$!J^zj>z^mI}a z5>BV8A>nrV3?v-S%0a^QTs|b6&mRl{>$@lfNw1euAnEt=*6(2PtL$xH`dTC;y4W6EI(J?GrF9^gkX%vn6I^S z7ns)J2A7wh@fa{)Zyhg~*8g7zrVRtY@dX;60rQPNp8?aRuC`#>Y}!gNZT>4YN?eB{qvaH&?f59ZetLDF08VQ@VF8ixXlH>B+W(~Ud8!{4AW zDKNh!S{Y2Yt^v0{K;u(je&<3+c=ovPgZUG?Ap9x1;QR#|vjU4xy8zKYLvaO|KeHH; zerFxo4(87hgQV}d>5%k3ZzpJcodGna1(shJ19AVNwV%QK#s9(e8fc6Q%wM($T#kaq zy1@LEu8?%HYC0s{tbPG57eQlRVEJ`D;Q9eH1_tJD)Hegun;O979%wua%-^aEiN9^7 z;Q9$PHU<{oDRBr)@5+h>)4O+r>pRd`8JNE>9^8HbjhTV@2bp5Q^r7J2VEXV<&_E3X zXbcU^Kjr~0S3qNFVE&0WJYf2iEx0}ajjMtAXC6TOan1-_o`c5Nz~UFK9stvq)FJun zas{}(0UC1yi(iugw@(zW=Ys2D(D)lz{FWdje~*sCjgG^Oj>C8T2 YVL4FMKcX;KRaKR)v6X?jm4OKt0DoPxqyPW_ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Riyadh88 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Riyadh88 deleted file mode 100644 index 0dac63b4aa8bb38b2ca9118f7e7f681c60a42d10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8523 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Riyadh89 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Riyadh89 deleted file mode 100644 index daba1e72f01a82b4a11dfd3a98376eb1aa2bef97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8523 zcmWHE%1kq2zyQw~7#Kj9fq{WB5Xxpz-uryN@_x%$sSqI_6SSNTZ&G3BEd z9JcKU(>L!7Js5O(n{YF8@=0qS~SSv|LE} z*@-#IFQgQeUuLgXezn&?`3>Jz<+lk|${(2Rl|Lo1RAjCStH`OfsK}Rp zP*FIUsG=lwRz*3-PDN$!Dit+;X%+Q^b`_0{pH;M&Q&hA=E~w}%vr*CgzE(xwQ&PoX zR+oz5>u)N?wn-``eV0{CAK0sy8*WgsXqHj2ywa;;t@=~NraVi<_QW+6dntDnhwL3H zj(as#ocU&{xFm3^xNfXbac6p~;t>+3;<@y^ir04s6(5gnD!#MSRs3GhRSB@=Qwi*A zQ3<;LOC`jxKqa*4nM&A|7?lXsODd7&9x72M4y(jSS*pZlZ&8WctEG~_w^SuDK|v*H z<7|}_W-*ntWr8Z1o;)f=%@b8h)uySGRYbAN|!ySO811xDm{;6Rr-wAsPwm*sZ6+b zKxLAKzslswn<`UIXQ)h*`J^&EuTf>j0dAF9g0oa+Cu^$A*|J$>9-EWO{O~g>3sy#} zEd2FKWwB3*%944^Dofw@sw{VuQCTr*naav1rYfsV_p7XF_f%PXmd=9?ZWd^cBE>k?A*3iWjBYp%AUwQDtlMEsqFi6TIGOWfXc!7 zS5*#uj8Zw`bYJD@loXW{=9wy|Zsn<5EPSbQMdXRfwe9y+Zg57a+>E-aa%)Y1%I&|$ zRPOpas@z+!UFH5KBbA5FD^wm$l~Z~AY>LWL3oeysoee6_Z+%mFsgthqs`jqR>+^mp zZx!~dyel$Qd4G7B%12Rgl}~9MDxbH1QTfW5s`4%Bn#%VzPAWhCZdUo_FR$`@!332* zAOEQQbIwrtKjo$>!!uV^Ci9J|%$>5TEVnvU*|fi^vezc6a-2J%%B5hU%3ZiXmFF;z zDxXM&Du3#IRe|l^szMywRfVIJRYg{JsfzyjrYi22q$)B0oT}tUQ&nlFg{m@BcvWSe zR;tRIJylic2vk+PxkFW1TSZl+W`e5fIYw1=`CL_vf}5(Ehg?;)g}15dq$;WEZtGLk zXaBEi5LuvVxay9o(H~z`6W@KRrt|ex%|0wpwQv$swVd3pYW3uYs*PEms%`rdRlA!} zst#HgR2^&FRGrT5QFW0wQgtm@tLk=0L)Algo~mc6q^j4pDXPAa{i=a}T&h9y`&GlH zh^U4?ov9jWE~gsRu~;?wmWFDq_FC1rT65L-a|cxu6}(lG3a_drAC6Z|6?vzcmR6yf zzJpyglXIGCRW_L`llIsZIV^Zf6q<}WNzE%@|bwa8_%YVkB3)sp82RLd+wRLi^G zs#e@-Q?1gISFNt!tXgx?N3~Arm1=!SvueXJ8Pz87U8>EQ!Ky90KB~6ybg8z-X{dIr zKc?Enn4;Pp^jEcK$!yi$Z@}hsQ5m7O52}vnw8Cf}b z1w|!g6;(BLHB}X5B@G2lEo~iLJt=(&14A)U5hG(0K~pnx3rj0&8(TYj2S+DoRu@-h zH+M!4PcLsDUqAnVz@Xre(6I1`$f)R;*tqzF#H8eu)U@=B%&hF3?5xa;^xV{xE+@9Wj{f#G7S~qh2}~0i8yhA~uAAapT{U%DaCzDE8BxWB`AMl6IWuR?o-=pe z`~?daEnc#8+42=DSFK*NcHR078#isC79d{CijBL<6!b4n7j=p--Ad^4lpSWCjG!< zESSszlU-nP9++GUCij5J3t;j-nEVVPwV1%97?@NAla^r87fi;0$pSFh0w$M($!%cr z9+-R!BDDp;qzafc29xe!G7L;+fyqiR*#Rb}gUMxJax0iT0wynm$wy%FBZ$;t0Fzu` zQW8umgGnPWX#*zRz+?cJi~^G>U@{L(R)EP`Fxd_!d%)y0FgY7cE&!8D!Q?71xgJbz z0h1HKWG0x52a};-(i==Vf=P2QsS74WK&19_FbPS?=fLd!V6qoX)`7_qFqsM_eZZtG zn3MvO+#pixJD7X{Ca-|W17LCyn4AG7JHccrn9K%~X<#xOOa_6;dNA1sCU1htPaslT z6HHow$!IXS5KL|WlfOZv4nLSY0VW@U$*&+%mlI6Nf=M$l=>;a^z+@4a1gCjja9+>_ zr)^zus@4UkXI*f5)&r+!JsFUCJ#g;R1Ls6NaIVw?=TJRxZq);)Z9Q<>*4qSDe-KQ9 z)3zQszw3e1wmvv*>w`-JeFcyjeQ^1p4^H9w9$*o0$moO9xjs0=^ueiJA6&NRgVVe| zIK=e9WsW{LwDrLuuMf@(`rr~te?>sf)>;Ic>$To&nqOCeow`J)RiC3L~1jV`!U(ai;^*YyXJ z5+G9N7nr;QCJ%#1?F2CC#K=%pRmH%-I3fV3LKy*=l+GV0I6xghFumV07EB-L`Ua*C z-kAcX59{fI=_B>W!1U3J@nHJ6(qAxrqGTGFK6y+ZOrI7%45rUy#(?RwyS{?y^E{nk z`a+y6n7+7vBbdI-=nAH<1l1*FWiIf4c7W-pZvu7N89*IdFrP2f0!;HSTM4EG zet^SAMaXjkm@f>j*cd<^UNB$G_A!_i?+*df5)Y1oX(=N!FfHA@2u#ad6$aCCYAs+| zzWf82Rydgmrj?}5f@$R(J20)XcNLgcIv;&T4Up9Fs;R$0;aV?E`VvBWj0`1 z_xoBft?wxbrVVCwfoa3n;PeOTOoRC*eV4(s=>u^1gF4n=zD2VPn6|tE2}f(ypJ2XC zc@~(qJ#h_8+e^8FX@~3`VA^r7CYW~Sn+2v_61c&%>&6-|?auTTOnZdHfoadB=fSks zcLy--J`@g{a5W@m69oqB^Oov?o=L=Bh9n6m` z_W;vTC&2jz)R71CW3#t_>A1aGU^;drmOjJz+AK?s){x_n?6TFu%VQlI|v4I{@ZS((nh< zlPkgH0BA4)%%3Ln2~1DVYXs9X4nX2-mLMelW+y}9bIulUxd0ky0IQoH4lWl!0}f#R z!e8KW0W|Oc<}aBC$#+ZNL(Eccf~7>7Cmk>3=teIhemEau1l^yV?y* z@B4EaOds$I0MiHOUj@^LK1PA*BTo0h^wBAh{B^=S6U;w#D-TRxEPM&3uZTPW)7Q2` z)ZgHQ=)V~SG4IwIi21kwg3EW%KnPg0p{NPhml23+og23NrHzx=@g4jNcz{0I&Q&>#+&FEfP~Ov^q6*9V{h9WY;^ z16=-t26n)FWo;EOtx^Ln??Hn+V7|IMxc&qU_JH}ChrsnKXwV1D*GW|Z)4JRGz_dR5 ze=uzj2`;BV13_TE(H~zhZQ{EROqGy?M-YryFnG~k-^hM2 z9q7jeri11~_+eAP`3yAB1Qw4p2d7iefD@P>eG6i4tTs5`fd-$z;_>GWg6TvBZ!n!y z2+kLv!6-04RpcF*PD`r*)9E|d!E`1kxLgGdP=Wc`Yj%R^oPXf*5;Rx^=I1YjgloYk zNH`a{fXhSB;1yWDl%+rzY)G#sr-G#}m8z*dc+{3`g#LUFNkOES}ko*Ru zKB<6#gMp!-fq}!vH-sVBH-y2{IRq>ZB1p08|NsC0LH2=YkewhJWG{#&$8Ii9=MY_U FE&x9vGHU<; diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Sakhalin b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Sakhalin deleted file mode 100644 index b1fda9ac7ca3f25eba81b3f9fb4e765335069819..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1961 zcmWHE%1kq2zyO>K3=AL)k|=|+#oIod-EsI_Yr!RhO&>(n%>%?FvJZ%JWL*&dIp0Cz z<-7pNTbB+u-eXW8vqrH%c8*YiTn}@BeD#+Ch3uyViqY2!l)R4@C|mC+P|;pl zpejA9K#jY*K%HgV2lX$@KWIEz&Y)T0&!BlF{(#mIrw!U$vOnl7iTR*A#rK0=i`@tP z68#SbDGDD9V|@yYiqs2?ZS@LFg2Wq4W#t;o41YG5{bgvdkQQUGxbvvN^4AXrt35{= ztZ&_7uvz+$!FJak2D{e74ED3;F*u|yWpHfX)!^jX&fuIpr@=)vlfl)wuECAfo55W< zp~3xKdV?pkQ-kL@&jzo@Dh=N2v>SZRI5PP5@izFaQD*SZecuq!!^#jC&chIt{hT4# z>>Wdh_eq9Ou?q}g+N&ADzHMTN5INouacv4iBVQQOKGqOWu}#LS=65W6L}A+Elp zA%2Q~LqdF5LtapBi%8_cP=zz0#1MzL24ybz4JWz}|+U)EN!M2J;(AT&o&N1sWU5^rkbE zeMoMo;HzY)xZv7Q`7WBFYJ+-1^*LLHnwc&Pwd>>=>MGS3>iZZO7@1g@A&`{~39@sr zGPA%0*g2>T85mkmfRb0;1O^rchPnw191ILA4lwdCFwEM(AOs^}A|Uae1q?zyz99_G zULg!#!66L6j@}S51Y`~a10y3NBZS4kz(7jE{{R2~e^BBE(VzqlqAwY2`T#Nvl+Zym zD6xZRP=W{3Kj%AuXi&lj(V)Z+qCpt|M1wK`hz4Z@5Dm%*fM`(00MVe# z0ir<}1Vn=}35W(|6c7!{EFc<`VL&t}(}3wO%faphWgZY8l!3tXmG}c78kCVhG$=EH zXq_c7VD+F(1>%D;7KjFAE)WgMU?3Wl$v`wHqk(8pW&_cn3PoXi&xk(V)x;qCpuHM1wLZhz4a;5Dm(#AR3fm zK{P1Sf@o021<|0)3!*_87)-xQ2ip(I$RIu_GlOVQh6d4~Obwzz85=}{GB=0@WpEG; z%H$v#l+i&nD6@lTP=*K5piB>P=IJqVF98+1qO%)6&fHKRB(W3P~ichK?Mki1{ES8 z8dQ*g=@*h93S6Lo7@$H0M1u+z5Dh9^Ks2a;0nwmB21J7j8W0UCY(O-qzyZ;qLI*^H z3LX#*DttgRr~m@dph5^lg9;)r{UI3~AD{vW#0M2hAR1IKfoM?S1foF&6o{^w=>np_ q1r>+^Dy%^Cur08-f*rj>bPWx_rJ9bfv7V`(fsU`C0f^Q&<^lkLgudqh diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Samarkand b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Samarkand deleted file mode 100644 index 191c07c12755da5e8fc626a01671f7a575527207..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 677 zcmWHE%1kq2zyMqf3=AL)l8}P3WmieICTv~&*FjXhdxMz70R?f6jSAvFKQEAY`DugX zZFL2yGvynk_q1G)SyOsJc23#_xt{O~@--e86ml#tD8^`AQ1X$!plri)K}GxT1y$*H z7u2}#Ur=Y|4p9H{CqQHWO$Ci7Zv!+F_8BlTF|#l;F*7lghqjIa0tju z1_nk(MhF8!k`grk|Ns9F3LX#*3L=mRpkM;gpr8WLpx^@2KR<�SYz{9~5*T8WemW z8We;e8WfBm8WfZu8Wfx$8Wf};8WgM`8Wgl38Wg-B8WhAJ8WhYR8WhwZ8Wh|h8WiMU c`pcgH5Df}?F#Y5$m_LZ3fGadAMAwuH0HJ(__y7O^ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Seoul b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Seoul deleted file mode 100644 index 1c3c15f9d7823004cd734fb15ee0af98a98a5050..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 380 zcmWHE%1kq2zyPca3=AL)lHh@|Ia(*zRc!dz`(a1RmWoIInjhXioYe5Hk@Ld`(~5?_ zOSyh1EOseS%(G2UYE~;y_LEOwWME`wVrF1uVPs)sU?}eZ8CEv|LNc;2FcdU^*gXpv zS-gWo7`$CVKwK!s;Vw1?1_lrYsp5sQdH(IEmS@->{g9rZzOml=b6W_^J| zT}FeVXJUa;oL7UgrgMRcdpd)vQ2Ylqbx#JhPmUin*tHonE-8OtVnl-s422Isw$x2v zWMN<^Xkg&*@eN^cb_ro{4h{iHFfcHX;>iF1|NjR$6hwm@3#Nam7l3Gxqd_#t;UJ?y zjt9{o4}fTpCqOjFBOn^&84wNf5QqkO3PgiE2BJZp1Jj=zKY(bEC&4ti9_4Zl4$-yX F0stgKTc!X2 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Singapore b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Singapore deleted file mode 100644 index a6f2db8f3a887fa0f19283b52c2f801329bb4f53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 402 zcmWHE%1kq2zyKT!3=AL)k^s>lEZ)}Kx_DQ*--H8PPZCaTewuK4Vm!wskK7O6clmaR zP5jEi$i&RT%EHFZz>pXV(wJ1hz{0?guE59%B0=oT3J_U0fq|caA+v%(n1P|7fk8Of zH-y30(FaTfhcI{rhcE=Yhk#5#!8n}C$-uw>!XULE8ib|)|NsBL&MbH_hz2l7VD}JR3oZaxJ7f3& diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Taipei b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Taipei deleted file mode 100644 index 906363660654488c7a49e38b28dfbb54dee17376..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 724 zcmWHE%1kq2zyM4P3=AL)lF)#%IWA7W%y22Os^D@ZTf-HnwI8lVSutEwepqnbWL$@cJls!<%jPAKrfd!|-m# zkq_^0>Nk9-{87OECyasPZC3&3-OdKCb9+As@43n#VkYo`fsshaP&a{*fq|i*fq})@ zC4|8_I0WQR1{`6*%)r0^!XP!8P&Uv1|NsA&ockaFqCw#TqCsH;qCw#UqCsHqCw#Xrk~IJ0HQ(R2ckh?2%qv!?lh?3|JZay_XJiv7pyZ?ZK-os>fr<|I16Aoi z57fBdK2T?sOi=&Im7u|J`hdn$&H~MZTLGF^?geNaIq0ChhB*<}tschH*Gb7~7fM`%k0MVe-0H(ikC4gv9ssPhZ zISW8ED0P78EB69GG$@sTXi!Q4(V)}7foM=l z0@0w<1foGH3QYgCH~^wSDGN;Bl>+lYDGbC1r7{o=N@*Y(l-fWvD8+$jP^tsbpp*xq zL8%W+-#rcvXHY5x@xdvPiG>*gS=o>vJ0}MhCkXOz^Kf&62n6Qj;DIMa76uk@0^d=mg*HMIQVmx()(;4h8~mtsDeH(@zMw zdhHN4e{(`aS9FJlLfHw8+jDnlo}P0;YoF2%?KKxXbmoUy==L$6&}-=2p`UN=VUW1j z!Z0A~gpt#S9mYoQPnf8d?l2Wm_Ap~xX<_y??1cIAJ3B0{b$M8x6tJ+`$?svkda8xZ zETfu*qZQ-Bs;zU4n-i|=;+!H~zpLYc7Ec6JGSGNe|y>cRqA!_)Xi(||(V!Fx zqCu$?M1xW)hz6xr5DiMPAR3fvK{P1kf@o0c1<{}s45C4)7(|0oGMN4vb^=6$QZ$GL zrD_ljO4%S9l)6DQD20P)P$~z}pp*`xL8%=?gHk+*2Bmrs4NCbS8kG7$G$;pvXizQy z(V(0FqCvRur8pj-u_K{*RVgK`&$2IVji4a#L88kEyO zG$^-$Xi$y=(V$!hqCq(iM1yi4hz8|AF#X#dY(FR`g7~1^2%Mk2Up(NP1Io=H rJ}5_nXi%;O(V(0SqCvSEM1yiThz8|y5Dm)dAR3h0LG;kc@myR0n}Ue? diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Tel_Aviv b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Tel_Aviv deleted file mode 100644 index f64f3afde5f00bff3ba085220ab71312b9784322..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2197 zcmWHE%1kq2zyK@^3=AL)lIVl71?L&KcASXZ^x(|Xg8^sP{9`zG?8}Ao{b>&_tgO6n zu_fWbrLL0&ms2-1T*-cL;d+!v!u9*|2X5$ZEx0M?_TZMlix0P6Z+>uliwVP>oeB@` zKImn*x8+>J{U!Sw9(0#6JPfO4c(l(e;jx*?g(q{qGdvX&yYQ^!@`LAsml|HE|7Upd z!v6wCP4@$izZ))aetVU`waoZ}%)TEFWII1zkUR4~K|Wz-fI`#81VzuS7nEXs6O`q- zFQ`NrB&agj2dHtseV}&j*#-62=O1VsU=Gl{@+LuRrThi$-Kh_BIvFqM&USyG7r!z< zzgqKwfydDch91)%7}?|n7#nU*Fp>Iq!BlW+g6YR)0p=_m4d&+=3oO3HH(1{J`M~PJ z+XCx#(Frz-7Zlho*py(`+*Dv+Gyj1@u~~s*z>)+fpMC~s5B~xeok9jzxo;obc!C++ z-Xwo;e`Ctv@%(Fn=NWMZuYGeqc(4A+;M2qT!FQ@?gJ1jX0{@cl4FPdZ9|A*eHUw#} z{}61lyCFo~u^?1rZbRtb7azj@?qUf4Syd2mcMe13vF8O*d+QjY=k|SwnVY~6J5!+` zuGWbmKL7ZKgjf}ZL|c;&Np21e$ri^7Qq+_hQu%W~q_MFyq%$7*kpA>pL&lAqg3O~Q z8nV_4f5=|Csv&39(t_N+;|zHfLIwGGD;Wy>c77=I>t-nO@-8UW%Vj7L-%(J?=g(03 zF8)K=_w0u9mmdo%uKPArZjURd+OFSFz3Kgjn(2ZKwVl%o>dHPh)Q7VaFfqa*GlDr# zECvRJAE0EdWx&Y7z#yZ*z`?*^;lRk_|8D-aFJT44IV`~eUR%3>fIl+8diD64_#*P9=JXi$~|(V%PxqCr^?M1!&)hz4ar z5Dm(PAR3evK{O~kf@n~d1ks>u38Fz+6GVfuCx`}RQ4kHvreOMo{{>K>fU+x?{<{Ip z2W49jACz@LG${LmXiydg(V%P$qCr_1M1!(3hz4b85Dm)KAR3glK{P0PgJ@6|2hpHx z4yLa?1KS76?jSxW%Y$f8wg=ImtPi3=*&jrMiU1G|Dh5C_s3-u@pyB{TgNg(Y4JsBu zG^l6*(V*f1M1zV55Dh9O!1Tvu0U#PwT!88Gj0GSXRBV7~P|*RRLB$7%1{EP78dQvc zXi!lCqCv$8hz1oYAR1JxfM`(B0-{013y204F(4XL%z$W6Q3Iku#SNH#ll%chgNhvx z4Jvv-G^qFi(V!v-M1zVU5DhAdKs2a00@0u%2}Fa6B@hiNnm{zDcmmNu+UvpQgNi8- zA5>IEWHV;~w-l!0haaR#D6MH+|(6>A_G zRJ4I;Q1J$$K}8&h1{HH48dTJQXi#wnqCrI-hz1pVAR1Kkf$68u8bCCt2n5lfVh}`w zib4<#Dh@$3s7M6Spkfh3gNjBF4JsZ%G^mIK(V$`yM1zV-5Dh9WK{Tky1ks>k6HLF0 z2Zsl!_yqAmMJR{{6{8>;RFr~fP;m;PK}9Nv1{JFy8dS7`Xi)JAqCrJ0BQp~mvLKiP n#bRJk diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Thimbu b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Thimbu deleted file mode 100644 index 90294aea202619ab9697a161be8a42753b9067a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmWHE%1kq2zyQn)3=AL)l3;?ed9FSaEm2JLUBSr2z!1U%lJbpUU}0bgNnqgc@eN_{ k3=Uy%3JC#8FfcHXV)Fn0|Nnzb2WchV1}>+N5M47a0E;XcegFUf diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Thimphu b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Thimphu deleted file mode 100644 index 90294aea202619ab9697a161be8a42753b9067a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmWHE%1kq2zyQn)3=AL)l3;?ed9FSaEm2JLUBSr2z!1U%lJbpUU}0bgNnqgc@eN_{ k3=Uy%3JC#8FfcHXV)Fn0|Nnzb2WchV1}>+N5M47a0E;XcegFUf diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Tokyo b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Tokyo deleted file mode 100644 index 058c1e99ba26b1ab7855b81895c8d577e2f582a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 331 zcmWHE%1kq2zyQn)3=AL)lHi20c@CdzEx2wcH{tplv4$Hz#U|W5{iESFyR5+N)wde% zJo_(jw|h?m6C)HdFw{)|>F!y;$O2|_ID3UKc)5fycm;=mBp4VNa9GaDz`y{)AXVH@ zw!r`Y|No~RT2cU_OU^w8(;x?d_#j7t={I5xAR6R25Dju5hz2lEU@rX?1WunS0|kAkZrgW_O5`DiJ6IkA^!tNQT_*z z`ho@q4hDw02@E_wz99_0z99_Go*@ig!66_eU`&dA|NsC053&dGeP3zi3Z7Ae?CZ^@okXaV^AQoM!!LJ zj!=PIk6?p*^_K#L?9UB~(bo!;ystJWTkj}P(ca#mDm|+}jeBN;I?J{X>R+}oXgrzm zLG#KC2CXAiAGEhrG3YFb`Jg)`hC#2z?t^}b9fLuN!Ux0Hs0Jfn+X7=-n+6kI`2tf} zxdt;{#saICn-^GbSu??A$?65RQ~D;@we&8qFDaPdkdnW^F(hb$lS|+NXA_eNE-JdGeP3zi3Z7Ae?CZ^@okXaV^AQoM!!LJ zj!=PIk6?p*^_K#L?9UB~(bo!;ystJWTkj}P(ca#mDm|+}jeBN;I?J{X>R+}oXgrzm zLG#KC2CXAiAGEhrG3YFb`Jg)`hC#2z?t^}b9fLuN!Ux0Hs0Jfn+X7=-n+6kI`2tf} zxdt;{#saICn-^GbSu??A$?65RQ~D;@we&8qFDaPdkdnW^F(hb$lS|+NXA_eNE-JvH$=8 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Vientiane b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Vientiane deleted file mode 100644 index 9352adfa9a360adab7fe447bc2f27eeda4829fa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmWHE%1kq2zyK@^3=AL)k^s>l%+rzY7BDgX-G#}m8z*dc+{3`g#LUFNkYE5(l>7#y zKB<6#gMp!-fq}!vH-sVBH-y2{IRqpP#-!Nw|NsC0Ap1Zx$W9OqvKK^?V>g$lbBL}v F7XUUfGHU<; diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Vladivostok b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Vladivostok deleted file mode 100644 index 8f880cece23f277d1a4b4c87d158ae1fb117c5b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1929 zcmWHE%1kq2zyKT!3=AL)k|>3;#g<392W(xu?SrVgYl4_W%j%7GlmJ$d+Zuy*626L&QWNP>k({_uVHFX$o|}*82zL{$@^-9vh}eB747W}s?sYO z)VOChsIwepQ2(-xLF36*0nLh70nID97qpH99MIlU#h|k!n?ZL<41->aFN1!G9fLuN zK7(OwRD)5GX@jw?O@m30c!Q~|T!We6&jz!<3=J02Vhk2{9yM70`oUne=SYL~ty>H> zOCK`W?%Km(*Ls-2e%3q&ht#DEj?KFooLt)(oRjA?xTt0_xH{K0xUqUOxGN_#xW7wp z@MLys@I2?);PqIg!F!!{gU=a92H!s32ER4R4F0+A8v=S*83Mz37=p5&GX$HxV+ip+ z$q*`bfgwzLHAC39O$-qt#~UK9O<{=qva%s+TNy+2mF|X^`I8!Ax8yd&)t5BHPw{U^ zh!1N>tj%FavbShRj`d?mk(X*nwKZT!<1lAPmla}2e<8_`@#hOe=JDSQS$D26WG}zV zkaP4?LvH(ihP2M`U)5+E9sEkHCVYk+7__5jhK zECQy#Yy(l?tO8^TgR&@y24zza4a%w@8kAkZ^t*Jh{h(|M z;)Aj-hz4a}5Dm)0AR3g7K{O~UgJ@882GO7_4WdEW8bpJ#Hi!mgZx9X2;vgE7%|SFM ztAl7zb_dhnHi0N`wg)jlSsz4$vOkCh6#*a`R1AP1{Fyl8dNNSXi(7vqK8@W#04tBbPWx{d>n&AbbO8V QO!W+Od<_jiw7xMH0I}zzod5s; diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Yakutsk b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Yakutsk deleted file mode 100644 index 5887a102005c04bbefdbd2a3427221ba77962b3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1914 zcmWHE%1kq2zyKT!3=AL)k|>3;`4`@PRj_sOQ3g@<-~us;_6On|Z6Cyc?oN<+xvN0( z*1HE%XY324_xMbZSz|jvc8=ZzxgPlm@-+ez6ml3RC`Nyppyd5{g0l6M2`bu0C#Xtq zo1n(Me1ba5WdZdsM+7vU99Gb*$X3w2QvE>dNZbYOEgb?nODY9)r(_A}wL}Z(m-q-6 zq}U1=#%4?~DsrA+Z0j|_BuI6FsjSWfGb8p1W`Fr6SV*e~SlszA!SXkofYqK$6RdB& z5U^SLUch$ODFM6Iivsqu)(AMHZWeHCJ~6?`b*g}K@~R0gs^tQ%&OH;{SR)18mGdUJ zzbl>K$s91j^IZ4@ug69cyw_Py@Hyiz;M*rX!EcSBfPe1a2?0IA0)gRD0zuhd1%l1~ z2!wcF7YG%*ClIE+Qy}cy0f7jSs}mxwEfR?QvVB6-wibctD>Em=%wI4ec1!hyxca6E z@l#?aB*dpoNUW_ANV0dEkQ^H$kRq=!A=TDSAdSOSAYE2LApM29K*nDtfy@(}0$F#S z2xKpREs%4JVM1>ES%JKzk0#`&uNNq2Ju;y%;Pix|)MXQj4c1O5aqXB;D$qZnOmC?` z*@waj6@2Xi6&HdhRKCj;sM=sUq57P+K+Vh`f!cMt0(F%p0`-0T0*uT|5Xi!c1libG zn3$0TsLN(xsGI;wSp^LYEDQ`i3m7>W80sc~*bovX0ul$Q@$n5|h;;M@6Tu-MoeYeO zjErCg0|NsoY54#D|NlYh7(|28GRO>2dIr&;G!3Fb=^9M`+?@cTLFpSrgVH#N2BmWl z4NB`E8kF8aG$_r3Xi&Nb(V(;sqCx2&M1%4Ghz8{Y5Dm%;AR3e(Kr|>%fM`&@0MVel z0j9qk5dhJkJOZLY`2&Xiz=^(V)Bp zqCxoyM1%4ahz8{=5Dm&(AR3gv!1P}}aI}H)8Hf+cYakkw-#|1d&w*%Az5~&qya%E| z`42>c@*s!?hoB`3GvIazh${R5Kp%5G& zpmGPq2bDb_8dUy(XiymhqCw>lhz6BKAR1I2foM>f1fqvaxx@u3vve&Z9le7?bbO8V QO!W+Od<_jiw7xMH0KOBgcK`qY diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Yekaterinburg b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Yekaterinburg deleted file mode 100644 index 106477ec1421758f81224f4495d1a1408493aea2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2000 zcmWHE%1kq2zyLf93=AL)k|>3;r4|aU{jhcMUk6e3?hRrR2Nc9P_8W-*{JcQo<);mj zx78J-&XjME-qUhHW=-h@**R$! z0z!QF146~c0>ZRE284b45fCBDdm-Z5t$@fc?=M7c+Y=Cd<>G~y`8O`aZrOYxu71~r z_$gB_B*f3TkXXAZAj!V&LUQbsfE4+J3#qnc0cjky0qL?40qHN|12XW5*Rrd7~BFtYzPSx0g1!a@PpNeg4ILWKE5Fg!C|go zA~=L0($yP6hJXxbU}R)uWMBYcFc(aalHC9Q|NkG98Xi#bl$}5{C`*CqD_aymG$?C~VgR(4$24!0i4a&M88kBuOG$;#$Xizo=(V(mh zqCwdiM1!(4n0~hw>>g0o2Ju1J8$^S$IEV&ia}W*6>L41F-9a=c%Y$f8wg=ImtPi3= z*&jrMiU1G|Dh5C_s3-u@pyB{TgNg(&{p|-h96&__hz}|rKs2a`0MVdg0z`v~3J?t{ zE$NgNhOm4JuARG^j`c(V$`lM1zVJF#RGP z>>f}N1LA{<84wLBYCtroxB=0iA_qi+iX9LQDtbUPsQ3ZVpdtuFgNh*#4JwL2G^jWN z(V!v;M1zVY5DhAt!1RZe;P?O)Q6N63m;%wDq6$QViYpKeDzZQ{sMrG0prQ*zgNiQ@ hJpzj`u1Ht!5M5JnVW;D3tY@lcpyO+30HXDcxd65x>fZnW diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Yerevan b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Asia/Yerevan deleted file mode 100644 index 3b4fb193e33133c6b9701fbb09777c3e743f738c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2012 zcmWHE%1kq2zyN#<3=AL)k|=?)C00q!@_2rWCqPtv<^eH@a|YrZXC1_UF>a7}#c)9K zwyA;Cnbrf+dnP@QS=0PLc23Cyxt`Pq@-<-(6mr}jD8^VkQ1a1ypll=cKt+f9fvWVM z2Ws4JAE>iRCa8bqO3=9T%|YWSXMyIG3l3UGHXCSfxl^FC-+?F9|ZJ7CIp5jBn0JHCj^^2C4~6M zCWMNsB!p@IPYC_$iAY zB*d?JkXU;lA<4eyL2~S(gcSL_2dTC#327YN3F)$F3F$9#6EgmKBxIiOPsqBfm5{x{ zFd^rd+k@N=;e@pT6lP#RW?MLb z#N7fw;vlwxWjkTnd9jEsy7AQH?&5TvC0|NsC02c>-w4NCtY zQ$TqDM1%4Hhz8{aF#U^h1BeFY2@nm+7a$sxH$XHfe}HIE9s$vyd;+3Dc?Cp+@(YLt zqgAqCxozOh4r;0MVfQ1)@QD z3`B$S8HfhuH4qKTZy*|!=Rh z4a%2b`mPz656Yh)J}8fZXiz={(V)BvqCxo;M1%4yhz8|b5Dm(^AR3f^K{O~2gJ@7b z2GO9r45C5#8AOBfG>8V}YcTz8H`snq{s!?uc^pK8@;QhG<#iAZ%I_c=l;=S-DBpu< zP~Hd8p!^S_L1h4l29*OK8dMg5Xi#|oqCsT>hz6AlVEQ{7I6gq-1BeeQBS18$oB+|F zvI0bd$_o$;DlK}Jp&zILjw@4Z_EV%@?G(? diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Azores b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Azores deleted file mode 100644 index 19e40040672aca4a74011b89614eda7eff77e2e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3462 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Canary b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Canary deleted file mode 100644 index 972388be7176991cad31d91ac7241b45a7c32e84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1899 zcmWHE%1kq2zyNFv3=AL)k|=|+g_g0ze7NHHT|wB_j6uZs*91}J*Av8q?@SP9K087D z^S%iZkJnF-yu4t7)ZvK}r1$IJ6V$(&Owf3$IzjWQ*aWSk>=U%N{FtD#*VuH=G_zAYVttQyDIZm*jEi=I(O?iT2i=}{*8|wt;6lnn$)#npjo&O5Bv7VgZ zu6$p>{oOMGPv(OHp65;ocs*V$;Jt2@fX|uz6MXx61pL-4oZz3AClJunJRvZ=YeG;? z>V#nPoCzU5?h``A{U(IzXif(L7S;SVW5pbQJT0wv7wwmiR({+Qb7iR zGJVkrWgi|1RPcSDP;udiK;^re6RI{W6R1A7dqU03LlbJ(&7DwJxnx3pU;P9|CT12^ zy2JnfKTcp^`2YXo2L={UGGpLmVBiyA7jXi&Na)1UWE0MVfI4WdD597KcCIfw?O zbr20o?;skK=0P+l-GgXQ+6U2~^bevzc>qL%@&SkjXfoM>E z0@0v61)@Ru3PgkQ7MT89F94!Jc??Y7O$75nc@4w|P%mq9crKZ9sco(9pNd<~*Oc^gE7@;8VE<#90m z-2faPpu7&^gYr9w2IYAW4a)Z*8kF}zG${XrXiymdqCw>Vhz6AfAR1I2fM`&e0HQ(V z0*D5c4Imm+K7eRY83Cd}l%-dNX*mGv;9ED3IH3Hn?-yIm47@7b7fBA)h;s5`~ z4;Wbf|Nr=bkpo0Bu=x0fFgS;SaBv975HKdivj6}8{|8wJqCu8|XpqGqgUGU+%Q-B> GkP86t$wV;# diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Faeroe b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Faeroe deleted file mode 100644 index 4dab7ef0859c244b916d61b7489d7371881e0ca2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1815 zcmWHE%1kq2zyK@^3=AL)k|>6e|yQ1S^8P_}UuP|-0HP?b>^P~(vh zP-k_Xp#Iflg2q$T37S{MCTJaHpP;?v#{``vFDK|uxivwr<@5yol06d)Qr1o|jJ+vf zRJ29F*mk#oNzgO_Q`xx!W=0hPW`FAiETpGQu(+EjVEMajg4JGU0qffl6Ks~nPq5u> zHNmdUaf1D9nF$VQ$`c%0ECrn0SSL8ANDH{AKA+&~{8zw@_2dM1<@*Be@16;GG9MK1 zJa+xa%?{%vLe9r8j;M>Rd4dnz%Tz?9b3Ni?k>5EP%`|wDhg75o; ziVH^sD&O6lP_<#1K=rxZ6KZB2nozrL?u5F^B@^oV>L)NVG1D9V|NnCZC_O=v6Q2Mh z2bjm=;~T;d?h3-eAq)%*jEo>mO1k|2|Nnnb+5{N~N}nJaltw``D4l}o&-*5TXi$0u z(V#R7qCx2vM1#^Uhz6x!5DiMhAR3g8K{O~WgJ@8C2GO824WdEm8bpKAHi!nLZx9Vi z;~*N8&OtONt%K>WCSZ4f(maR{O7|cdl=eY1DE)(IP#yr$pnL$LL3sg0gYpB22IUD5 z4ayfF8k9FcG$?<7Xiy#j(V%<+qCt5DO#iJH0MVd41E%jLg887l1LA}74~PckArKA9 zM<5!Mmq0WqKY?gao&wRJd(Xiz=`(V)BtqCxo)M1%4qhz8|L5Dm(kAR3fEK{P0jf@n}a1<|0q z3Zg;z6-0ybESUao0FDn(-UabN`4>ck@-T=7F#X{X zI6gpS2#60VM?f^FECJD=@&rVK$`lX{Dpx=>sB8hzpz;Mo4}~&@E8I22Alx-LM90@y R&s5Jq-%!Wb&;Z2Z0sy3qm&E`8 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Faroe b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Faroe deleted file mode 100644 index 4dab7ef0859c244b916d61b7489d7371881e0ca2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1815 zcmWHE%1kq2zyK@^3=AL)k|>6e|yQ1S^8P_}UuP|-0HP?b>^P~(vh zP-k_Xp#Iflg2q$T37S{MCTJaHpP;?v#{``vFDK|uxivwr<@5yol06d)Qr1o|jJ+vf zRJ29F*mk#oNzgO_Q`xx!W=0hPW`FAiETpGQu(+EjVEMajg4JGU0qffl6Ks~nPq5u> zHNmdUaf1D9nF$VQ$`c%0ECrn0SSL8ANDH{AKA+&~{8zw@_2dM1<@*Be@16;GG9MK1 zJa+xa%?{%vLe9r8j;M>Rd4dnz%Tz?9b3Ni?k>5EP%`|wDhg75o; ziVH^sD&O6lP_<#1K=rxZ6KZB2nozrL?u5F^B@^oV>L)NVG1D9V|NnCZC_O=v6Q2Mh z2bjm=;~T;d?h3-eAq)%*jEo>mO1k|2|Nnnb+5{N~N}nJaltw``D4l}o&-*5TXi$0u z(V#R7qCx2vM1#^Uhz6x!5DiMhAR3g8K{O~WgJ@8C2GO824WdEm8bpKAHi!nLZx9Vi z;~*N8&OtONt%K>WCSZ4f(maR{O7|cdl=eY1DE)(IP#yr$pnL$LL3sg0gYpB22IUD5 z4ayfF8k9FcG$?<7Xiy#j(V%<+qCt5DO#iJH0MVd41E%jLg887l1LA}74~PckArKA9 zM<5!Mmq0WqKY?gao&wRJd(Xiz=`(V)BtqCxo)M1%4qhz8|L5Dm(kAR3fEK{P0jf@n}a1<|0q z3Zg;z6-0ybESUao0FDn(-UabN`4>ck@-T=7F#X{X zI6gpS2#60VM?f^FECJD=@&rVK$`lX{Dpx=>sB8hzpz;Mo4}~&@E8I22Alx-LM90@y R&s5Jq-%!Wb&;Z2Z0sy3qm&E`8 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Jan_Mayen b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Jan_Mayen deleted file mode 100644 index 6326961453f404a4a886362ee8b684b56fd5b4f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2225 zcmWHE%1kq2zyNFv3=AL)lIVr9IcKXsW|)1YI^o22--I*Iy#>y$6rXTzk+Z=0NhSgp znp6cY7KsU5N@5pyyxYvk83vaA|_jx#=H-eO&}ZjDJlKRen7|O!&?OaptoV#6RzwAn|zp z1j)+_CP*EgI6->PUICdk>jY%y%omXBnIIrv(jQzW1mlPsX*6C$8&<0_z{VO4XHtH}h7r>YY)uZm63I?6sld&`drI!j(o(4BH?f?mt%3Hl{_CK#lw zonRPyQ^2Tbi-581ZUK{^X#%FQa|O(dDg?~_)(cojPnlqGH&MXyci9B1z0LyGw<9Ll zEQ_CDyW47lU7OD~~ z6Yyj{DByYSgn-xM#RA^zRtfl=*+0RzuSdXd&B6)(d3gc>J3ltm536!}06etyB5Gd0Zoly4S zkw69C_X!mjjtEq~yE&n1!!m*DbGs+h%se!qcHP_wb(Kpd)c4g-U|?imV#Wd)Sy<^0 z85m>~7#SEC_yibOVI)KZLW0DdU4ugyoLxg07#J8C89}NU7#VTo5_Sd#1`r12l0GP# z_y7O@|BK$K8V}Y7h;|*&rH}yFoN4hl6NPE(g(|oDQbH zntQh@2d^#ULoRAPYXyNO^vsN?|gL8S+X29+Qn8dQpaXi!N4qCuqz zhz6A?AR1JvfM`(30-`~s3y21lFd!OK%7AE4Nduxmr45J%l{jGf-7~QLpppl~2bDe` z8dL&-XizBxqCq7Qhz6BLAR1I6foM>v1foGD6NmD(OHpsI&vopb`&6gGxOR4J!G-^o!|W_kc=35Fb#29=l~8dPe6Xi&)srawFa#|Nkc z1@S?pD2N7?q#znpnu2Ihi3*}Yr7DO9m8>8dRJwv_PzlS#$i&FZf(0_Mve6$hFmQ>0 zTqdKy$O0~6IbkG31VZu&FmU?#g34KVVGA#985kM4oLxh74M8Qbj<2zvsh)w3ub}~m I);Hz?01}o~xBvhE diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Madeira b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Madeira deleted file mode 100644 index 2175096cf122745c2756c4223a70e989040f6cb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3452 zcmWHE%1kq2zyRC~3=AL)lDGq9%S}A^F=DoNb;Im`S0~Jw^Sfd0$%zf~>Khv7uR6-G zAU>&KVfT-QMUKxK7U$JAEK!zbSn9u#VHNA&hE-qYGORthjbYt#BZl=0VjDKJi!f~L ztYX+yV9>C+Xj;RT0HKEMMo|qr_^&nW_PE zKf}R_YKB7@IShv*Vi}Iu3pX6KuxB`CwUps_#IAs1hckCJGMt_2%y9N_WWl+j4Ij=OJ=<`;RF&cUn$iy!f+l^quylRH#ZY#J zi#_2VE*X`4xYRna;d10o$CG zp1OtT+ajn z`I<%ng`6S*#h7FPC7%!hWgAxk6&*7HRT*^wH6958bynvI>R(MJXgpP&pm|kng4R*? z3EEqJOwd{Ka)R!ZTNCtJPEXJ;*)zc)W$gsR*qZ`IMOy@nZFdWp1Wgk#m7ObKW>g_y z_P1WZLVC&si@S*emcPp;SnYKdu)ZBJ!Ddw1A81^9iobe+ArFPfl=GzAxbZ?wNom^Faa6b0-A69xoQ~UbjlX=gj^IzI{Cc zerpy^@XyN=27A%mTAwQv@%~YT; z&_K*85t9$kAsaJ3377L5&r-GK?78{FfcH({Qv*) z0|OU`hhXywF!D1n@Ch)Ag2Wl5P)U%un{Nn%ucJ#am;@8PAq?TJ!5|_8q?{217#JBr zY%peI#8KMuFfcHHFi6#1C|l|O|NsBvY=t90G^peQ(V)@~O#iz&0YrmJK@bfp2|+Zd zGz8J05)nj$N<|P2Dj7jEsB{F;pb`>9gGxyd4Js)?G^n%$(_iK?fatX+w}EL;$qC|v zN>30CDnUW?#?C6RJg6iE@j<02hz6CYAR1Jvf@o053a0-bZvfGt5*9>*N?8yMDrrG9 zsI&#qpb{5EgGyZx4Jvs-G^q3i(V!9-M1x9U5DhAcK{Ti|2GO7r8BE`N3$_nbGK2V_ z(iud9N@x%bDy6~nn~fhpG^n%&(|0z4{RJwuL3~ij4WdD%H<&(p7Hlr46bJD^B{_%& zmF8f2>3Xm{s8k2>K_xqg29@q$x^*I09#qPM_@I&=M1x9u5DhBvK{Tk;2hpICA58yT zYyhG`H2{bP)dCc5Jc-vxdm1astrMWP>l$pLA4@?2Gxup8dN)i zXiyCaqCvGJhz8Y^AR1I#g6Y5Y0w5YxYl7*!iC{jc_5|@kH7JM%)uJF8RFi^eP;CmL zK{YCf2Gyz{8dS4_Xi)76qCqt*hz8ZNAR1KDf@n}}3!*_aE{F!zx?uXP)!V?LA5c62Gz(Q8dNKTXi&`zqCvGYhz8ZrAR1IlgJ@7q4WdD{HHZe) z*dQ8IYlG?U2H@}o)!raJs0IhopjsS6gKBaR4XVvSG^j=g(V$u#M1yK}5Dlu`K{Tj_ z2hpHf9z=s`dJqk&?LjoC#s|@$S|3D%YJLz6s{O(Ai|JtZfLZ|{KBy%CqCu?z5DjV( zfM`&w07QdY1|S;LIsnn276OO{wGu!ysHFg+L9GQ44QerfXi%#GM1xumAR5$q0Mj2H zf#UP>TXYgIX0J8q~4?(V*4^hz7MVKs2b8!N|Ss<7DSRf?V8mgpg(im}CKYn2`hA*x*BD^9e8tgBu%?AaMpcRFY4CQPRgZgn?j# ng8|gwU_@?lFfcN5g}a6rfSM&bzQ%f{dItK2I=+SmAQl$@w?74I diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Reykjavik b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Atlantic/Reykjavik deleted file mode 100644 index e97f13a652019dc5ed5ea2fae293404d90ff2027..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1141 zcmWHE%1kq2zyNFv3=AL)l5l{s1-lcPr_7ls$1wL|$Ao!BferJoG7B8@m0~!a#=7A6 zE%6N})tnccJgla0noV`V=`~IZ&fGbxaJENf!MQ!_70&0dEx0geqQXV*7Yi=6u3d0h z`_zIfsr?JCT3%GR=32Pmy5wes8>+zzZv338aEq@%;nvM^h1*ZX7u?wysc`q4iNd`_ zr3>z_6H|E56u#hL?+=AXNtO#9=iX9y;v~J`sqY?zXNrFpJU6?s;03po!b`DT3tqnZ zqwwn6oCU8>-BWmTt!}~FRR~U3KVuV6w7IGl#|NpOZKmp3Y zz{v9d|HlsuoFE=Dn}IjTH-y16I2c5PFu41MfK@Ouf+z+C9FfJ&z`y{)AVrQ)w&?%= z|NpaIQ~Cpu@gN!$`5+pU06;V-5rAk=LIBaA!~mi}2?9ie z5(S6`B@8hAb1K+=Pyzw*L5T!JgAxje1|=2{4N5Q|8kA^2G$`SKXi(w-(VzqbqCtrW zM1v9%hz2Dl5DiLDAR3gYKr|>}foM?T0@0uZ2Bu&A0lNp3&_H}pVgu2j1P7u)i4H`A z5*~;KB|Z=hN`N35ln6mIC?SGqP+|nppacn`L5UJXgAyi)1|?1q4N9P3`m-B2{6Ps7 z#0Mo-5DiMOAR3ft8JU@&kcE{T$oBvL>lOwEaN1=7r7%VgaN6ZXXEO-;_=YfGOTP?^ OumsG&kj$r)%|JMqTC<6lniS*&$!{l z4{L{$_a1LJbwk$S^uD7T&TRkhaMrBRKvM9ZgXHBs8>BuSQIKAhVjy#InSyMWn}OVl z=ne8&W)2D+wi^_^Bpj47COMO7bUipN~Cy4=Ba~Tt|k2nY9)I3heU7{M07jrZrzlA-Zz-DMA5^?qeW7xx_k*f4y%(xmbsyAh zT@_H9=ao=5wI`t7PbYzi5ec#|voNzD3(%DP|NqG&3=IGOU%kM{^8f$w0}P!1|37{J zVqd+$z!~ft!rP)1_lrYsj7jp1^@s5|39-`a1V$ErD+fiO4lG7 zl(s=MD1C!yP#Oo(pmYwV|1)j?(V+AWqCsgMM1#^jhz6y75DiNIAR3ehK$e5@0hqqL zX9I`^@)d{%k8cPAj$({~fy>Q1!~|5p>G)de8R{A6_?qY$ I>lttX0K#%Pr~m)} diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/ACT b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/ACT deleted file mode 100644 index d95c245e5ee1cb22a2b88fa63bee6736a4d0a8ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2183 zcmWHE%1kq2zyK@^3=AL)lIVr9S?2gHn=@yR!iUo#n;A|Y4=*^gJ*?sEa?65q3yK-e zw@Vi=7g#p1@X9c-21qxsezRy`*Z27^h#4TiB% z4Ms(#4aT-M4JJY24W_bk4Q7Tv8_fPPG+0QBF<9Jr)L^;%WrNk8BMsKKZZX&_eaK+D zYY&56>tP1_S@ReiQkOC~Ht%Y1a&2dDPM*`?qPMug)w!<0jn$jMT{)q_{re&YkLQya zJg>JfcpWcg@ZO%r;IllO!FRd`gI~KPgMYaeLqI`jLtuhiLr{QuL$HHJLx_Q7L#P5* zLm2<>hOqx{8p7Y-ZHTykt|9XL{)VXi8ycc_++m1Wah4%=#y*C)j`a-j6$=;=GA1%4 zMl>-bc@#4wTcj|gXoNDPO1Lqk2^Kb_GbS~pe++KOc<9oQdC{~X>!4ag_D1oBoP`_> zxf6ai{vWP#F1xp~&+kL$T#8h7!%w45gBL7|J-;GL-$C$58&VpP}Mr z14HG>LWZiHNetDSdK+pM)iu;k%5SJ^N@%Dr3T$9tgg_?dK>!&TW^G_(U|{H307};g zwrg+*0|NsiNQwbRhG1o2U;tr|#y%*UXi%mB(V&b2G8B|~Kr|==foM=B0@L3t8bCBCGlA)AQeZwPQ-S!Pj0K`W znF~a7&zA&I;7kT$fHE4024yx74a#sJ8kFfkG$`YNXi(+@(Vz?nqCuGuO#f>JQQ*u7 zVt_Ivhz4a!Fnzoc>>g0&1o1%`6hwnEDToGTR1giytRNbcVL>z~(}HMF#s$%!%nPDH z85l%^GBJn-Wn>Ty%FJN;{VNa!&eR|VC}V?YQ04~H>(_xOa3%*aKp7oGgEBja24#2< z4a)Q&8kF%tG$`|fXixzFqCtfKhz1n|AR1H{fM`&G0HVzde}erDDi}a~P~iZk?>qvF zg9-@{A5>6)Xi#ARqCo`)hz1oJAR1I~fM`(R0ir<#2#5w1A|M)6kbr1VVFIE-1qz4; z6)GSaRIq?(cjW}Iy`TaH#0M2JAR1KAfM`%*1EN6%4u}R7Iv^TU@PKGg;RB*U1rUe^ z6+$2yR1kq^P+E5={S`2cp1*C5QnkFhMk^&;-$-f)hl83QrIXDnLOrs1OCw zpn?=cg9=k7Mkr)v83d4lq4x;LWwSOgvVhA}7I66rW&8MsFhI&xXu-p^0 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Adelaide b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Adelaide deleted file mode 100644 index b350cb6660a68969e89860ecefa57e708405ce71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2202 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Currie b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Currie deleted file mode 100644 index 43ca1e455803da69a06c0289048138fad5772e9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2183 zcmWHE%1kq2zyK@^3=AL)lIVr9S!Q3YXqdA{;lt^W%?ziHhZmgL9@cPnxn;q*1;q^K z+ocPb3oIL0cx4z^1Ed>RzgaY}>;G+Fzb4hd$$!6rbL*c5uJ;EUxaUhU@Z7k^z+3m5 zfp5nF2L8Ca3<5J2F$mi2XAr7rVGx#E$RHAt#vt;qnL*6LgF&3xpFu(~r9tAcA%hg7 zTZ7c{l0tZPtgIM<-$G@C&=^EHEtQZ0k3=UE0d zrg#Q*&GiiGU$!x5ynWc9d1VHJ*4e`i+FPm^bk;6y(47*)px4{ppkHFgV33>HU>F{14R&NG(_Kghg-xo1>JfFv$=H_x3afpXK2UzSBJz{Ms!U{L8f%0t!MK0u$UCf&$DNf*mv(LJTAuLKV0g z!uWqTg#CZh5dQvdL&W`a4Uy;fH$?5<&=9@j4nxd}vkb8__A$hDtY?U?Siq2wF_9rL zqKP5NqnIJtB84GEBa|Uk!i^zKu&^PWF{vT_V{k*pLzjlki>3`(2h|#~H;OmpEaYg& zo$#|Eui;fge!=aAf-H81!pI*CMV>DiiY;$3lxUu2D3#p9P{z5Iq3q{8hVqyF3>7yU z7%EQ|GF0tMVyNEK+fcKpuAz2PenVYTLPLE~U;`rq1TrxX0?5G7vjCK$XKi3)U|@id zAQ9K#5C#SYMvx!_jts%dz`y{)AnkonHpl<}|Nochu_%COQ04&9pbP?{L74` zph5yfg9-`|4Js@^G^oG;(V#*DM1u+r5Dh9kKs2ZT0nwmB1Vn=h5)ch4Oh7cKKmpO9 zLIp&F3KkFzDqO(y_eCHIT*!bJpn?WOg9;lE4JvRzG^o%4(V&6{M1u++5DhATKs2Zj z0@0v?2tYAOz8%!VpA*3PcbMDilF9 zs9*%qpu!PEg9=Cx4JstT^v`)93S3x%7@z_ZM1u-V5Dh9gK{TlF1ks=Z6hwmxQ4kF( zNI^8XFlAzdKxURf02vtC9)MidvjEgon6-hC1ze`GfJ<2xAKwrLNVy6vSQ)rngF|!; Y4P1jmbbJjB^bGY3bbL)fl)f<+034n2wg3PC diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Darwin b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Darwin deleted file mode 100644 index c44512fbb73ba306be6c2ad6cb6f2615a95d7695..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 288 zcmWHE%1kq2zyM4P3=AL)lHh={S?2hyT{35n`j68gyEslCkE=MdJ+|ZQa)*j@3#vHI zw<}dJFhU{2xl`|Nk!*n-l?}tA&^g zKs3m1Fuh0p2Z#o_0Zbo{s{qj;w}5Dndq6bEO&}WNE=Fc1C}d!$S^=`EZUV^G$txIH Zz^-KR@eP5y6eQ2(92}x+X=QA{1pv5sT!a7s diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Eucla b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Eucla deleted file mode 100644 index e78c2d42514ef555ce0201bc22f0e7ba8200abde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 446 zcmWHE%1kq2zyK@^3=AL)k`RKjS?BoeFqpH)sO5CXktwH-XR@5xo*{B}xidp3EU4p68-P7#Km2i5USI z7&>Jb85kIAq)%*j37A%98P6rU|;}YkWOJJoAdww|Nl#tacuz6AZLT= zJw`1c8svO1eLRx|M1#BmqCs8(83OVSnBK-G0-{0Q0@KS&!F-VSKzxuFK{UvlAR6RV z5DoG!n0{9YRuA$vh!65Q6C)ThvmhV?L&XJ3pfN=z@Y(U`}l@1Ktll<3=CW# LzOIFpi76KV+kIng diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Hobart b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Hobart deleted file mode 100644 index c4604e5386ef6aaec79f1dbc1e8af557ef63ca96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2295 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Lord_Howe b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Lord_Howe deleted file mode 100644 index 1f542d3700d59c575750e55470ea66114db86309..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1821 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 WI7G+S&_K^n&p^l51Vrf@a{&NhjQ6qt diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/NSW b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/NSW deleted file mode 100644 index d95c245e5ee1cb22a2b88fa63bee6736a4d0a8ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2183 zcmWHE%1kq2zyK@^3=AL)lIVr9S?2gHn=@yR!iUo#n;A|Y4=*^gJ*?sEa?65q3yK-e zw@Vi=7g#p1@X9c-21qxsezRy`*Z27^h#4TiB% z4Ms(#4aT-M4JJY24W_bk4Q7Tv8_fPPG+0QBF<9Jr)L^;%WrNk8BMsKKZZX&_eaK+D zYY&56>tP1_S@ReiQkOC~Ht%Y1a&2dDPM*`?qPMug)w!<0jn$jMT{)q_{re&YkLQya zJg>JfcpWcg@ZO%r;IllO!FRd`gI~KPgMYaeLqI`jLtuhiLr{QuL$HHJLx_Q7L#P5* zLm2<>hOqx{8p7Y-ZHTykt|9XL{)VXi8ycc_++m1Wah4%=#y*C)j`a-j6$=;=GA1%4 zMl>-bc@#4wTcj|gXoNDPO1Lqk2^Kb_GbS~pe++KOc<9oQdC{~X>!4ag_D1oBoP`_> zxf6ai{vWP#F1xp~&+kL$T#8h7!%w45gBL7|J-;GL-$C$58&VpP}Mr z14HG>LWZiHNetDSdK+pM)iu;k%5SJ^N@%Dr3T$9tgg_?dK>!&TW^G_(U|{H307};g zwrg+*0|NsiNQwbRhG1o2U;tr|#y%*UXi%mB(V&b2G8B|~Kr|==foM=B0@L3t8bCBCGlA)AQeZwPQ-S!Pj0K`W znF~a7&zA&I;7kT$fHE4024yx74a#sJ8kFfkG$`YNXi(+@(Vz?nqCuGuO#f>JQQ*u7 zVt_Ivhz4a!Fnzoc>>g0&1o1%`6hwnEDToGTR1giytRNbcVL>z~(}HMF#s$%!%nPDH z85l%^GBJn-Wn>Ty%FJN;{VNa!&eR|VC}V?YQ04~H>(_xOa3%*aKp7oGgEBja24#2< z4a)Q&8kF%tG$`|fXixzFqCtfKhz1n|AR1H{fM`&G0HVzde}erDDi}a~P~iZk?>qvF zg9-@{A5>6)Xi#ARqCo`)hz1oJAR1I~fM`(R0ir<#2#5w1A|M)6kbr1VVFIE-1qz4; z6)GSaRIq?(cjW}Iy`TaH#0M2JAR1KAfM`%*1EN6%4u}R7Iv^TU@PKGg;RB*U1rUe^ z6+$2yR1kq^P+E5={S`2cp1*C5QnkFhMk^&;-$-f)hl83QrIXDnLOrs1OCw zpn?=cg9=k7Mkr)v83d4lq4x;LWwSOgvVhA}7I66rW&8MsFhI&xXu-p^0 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/North b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/North deleted file mode 100644 index c44512fbb73ba306be6c2ad6cb6f2615a95d7695..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 288 zcmWHE%1kq2zyM4P3=AL)lHh={S?2hyT{35n`j68gyEslCkE=MdJ+|ZQa)*j@3#vHI zw<}dJFhU{2xl`|Nk!*n-l?}tA&^g zKs3m1Fuh0p2Z#o_0Zbo{s{qj;w}5Dndq6bEO&}WNE=Fc1C}d!$S^=`EZUV^G$txIH Zz^-KR@eP5y6eQ2(92}x+X=QA{1pv5sT!a7s diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Perth b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Perth deleted file mode 100644 index 1c7ebb795cb7b10a4153c9ba18802c741b43d313..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 440 zcmWHE%1kq2zyK@^3=AL)k`RKjS?2g1+B0X5t-$G!^9rYr7f(2|y=cMN<)ITe`F}6q z+$OO=iZN+{)bjcTnyN7iG}oU}a4p=g;KrJ+;I3S=!2MnG0#D|+1)k?p7cek_AQLkJ zGBDIlU}RumC};p#h+u~YhcGZOFoL8QaJZC}fq?;pK^ldjY>xl`|Nk#pCiVnGgIo=! z_t*-6Xprl{^zq^eAR6Qg5DoGP$Pkck!1OkW1t1#aD=@vh9?S>%4#Wrf5JZD~38Fzh z1<@eig6Vh7VD%thgZLnyGckf8GYbMTFyzbuN!LwaWB~^N3pg;KY#-kc21p=4LxF)S KJUB$xf(rnMB5-K{ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Queensland b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Queensland deleted file mode 100644 index 3e899a163f51980c2f92952b002d4cc672a35dda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413 zcmWHE%1kq2zyK@^3=AL)k`REhS?2gHn=@yR!iUo#n;A|Y4=*^gJ*?sEa?65q3yK-e zw@Vi=7g#p1@X9c#dY)xaegBF1lu(@gn@y95hTTc!+op_3=AL)(kKXJbNv7R|9{cj`CuC4RuCWLUJwm(GnhUe zUI3y&ZU@mI_k(DVA3!w7A0R_PegV-S|A1(apTP9{S0D=PHxL8lKM)P_BbZ*lj)930 s3Yl3Tkb$AU0wg(W10xIAyDVU@L)kvQAq)^NL;cLatzoyv1$^Wc_a~pF9*ZUJ4-18MUcy2u9;H_uk z;M;MWgFo&Ghro=L9D;VoID{&?IfUg_aEL_Ya)|uv;t;d&=Ma0otV2REyF=o5M~4)n zZ->tz*(_Kb@iI+vz(=yq##=xwU#&@XZ2Fqjn8VHlg( zVN_((VQlN%VG<v#=^_x4;4pXG5JzSI3V{MsEj{L2kF0t#X}0uy{Yf&%P1f*tfbLJSl-LKOr% z!UUK)!v25m2!H>iBjWzmj>z-JI->S(?}*;*m;wsFK)Eaynbn8A@4 z(aDkIQN@vLkxG zPGsoFYxvlaU+}1-Ad8QqF!Db~k>>}FV#|jdC7PEwN+l0-lyPq1DEqmTqx|JGj*6S@ z9F-?4II4DLa#U}c(owUhwWD@YSw~${dPjXxLEm$~AR3fuKr|@hfM`(W0nwlg1Tq|yi9j?cBY|kv0HqEv{mmXsgEAF}56V~|8kD)f z^fqR&JSdZa_@ImiqCuGrM1wLMhz4ak5Dm(BAR3hUKr|==f@n}C1ks?32%E5k!Lu zMi31u96>awfCSN?LJ~xS3Q727^h#4TiB% z4Ms(#4aT-M4JJY24W_bk4Q7Tv8_fPPG+0QBF<9Jr)L^;%WrNk8BMsKKZZX&_eaK+D zYY&56>tP1_S@ReiQkOC~Ht%Y1a&2dDPM*`?qPMug)w!<0jn$jMT{)q_{re&YkLQya zJg>JfcpWcg@ZO%r;IllO!FRd`gI~KPgMYaeLqI`jLtuhiLr{QuL$HHJLx_Q7L#P5* zLm2<>hOqx{8p7Y-ZHTykt|9XL{)VXi8ycc_++m1Wah4%=#y*C)j`a-j6$=;=GA1%4 zMl>-bc@#4wTcj|gXoNDPO1Lqk2^Kb_GbS~pe++KOc<9oQdC{~X>!4ag_D1oBoP`_> zxf6ai{vWP#F1xp~&+kL$T#8h7!%w45gBL7|J-;GL-$C$58&VpP}Mr z14HG>LWZiHNetDSdK+pM)iu;k%5SJ^N@%Dr3T$9tgg_?dK>!&TW^G_(U|{H307};g zwrg+*0|NsiNQwbRhG1o2U;tr|#y%*UXi%mB(V&b2G8B|~Kr|==foM=B0@L3t8bCBCGlA)AQeZwPQ-S!Pj0K`W znF~a7&zA&I;7kT$fHE4024yx74a#sJ8kFfkG$`YNXi(+@(Vz?nqCuGuO#f>JQQ*u7 zVt_Ivhz4a!Fnzoc>>g0&1o1%`6hwnEDToGTR1giytRNbcVL>z~(}HMF#s$%!%nPDH z85l%^GBJn-Wn>Ty%FJN;{VNa!&eR|VC}V?YQ04~H>(_xOa3%*aKp7oGgEBja24#2< z4a)Q&8kF%tG$`|fXixzFqCtfKhz1n|AR1H{fM`&G0HVzde}erDDi}a~P~iZk?>qvF zg9-@{A5>6)Xi#ARqCo`)hz1oJAR1I~fM`(R0ir<#2#5w1A|M)6kbr1VVFIE-1qz4; z6)GSaRIq?(cjW}Iy`TaH#0M2JAR1KAfM`%*1EN6%4u}R7Iv^TU@PKGg;RB*U1rUe^ z6+$2yR1kq^P+E5={S`2cp1*C5QnkFhMk^&;-$-f)hl83QrIXDnLOrs1OCw zpn?=cg9=k7Mkr)v83d4lq4x;LWwSOgvVhA}7I66rW&8MsFhI&xXu-p^0 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Tasmania b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Tasmania deleted file mode 100644 index c4604e5386ef6aaec79f1dbc1e8af557ef63ca96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2295 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 WI7G+S&_K^n&p^l51Vrf@a{&NhjQ6qt diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/West b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/West deleted file mode 100644 index 1c7ebb795cb7b10a4153c9ba18802c741b43d313..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 440 zcmWHE%1kq2zyK@^3=AL)k`RKjS?2g1+B0X5t-$G!^9rYr7f(2|y=cMN<)ITe`F}6q z+$OO=iZN+{)bjcTnyN7iG}oU}a4p=g;KrJ+;I3S=!2MnG0#D|+1)k?p7cek_AQLkJ zGBDIlU}RumC};p#h+u~YhcGZOFoL8QaJZC}fq?;pK^ldjY>xl`|Nk#pCiVnGgIo=! z_t*-6Xprl{^zq^eAR6Qg5DoGP$Pkck!1OkW1t1#aD=@vh9?S>%4#Wrf5JZD~38Fzh z1<@eig6Vh7VD%thgZLnyGckf8GYbMTFyzbuN!LwaWB~^N3pg;KY#-kc21p=4LxF)S KJUB$xf(rnMB5-K{ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Yancowinna b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Australia/Yancowinna deleted file mode 100644 index d8f3155c84dff3c25e1590a0c1aa086cc9d51a39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2237 zcmWHE%1kq2zyK@^3=AL)lIVl7S?2hyT{35n`j68gyEslCkE=MdJ+|ZQa)*j@3#vHI zw<}dJ7dUjV@G5h#1}Jr~ezWgjH(=>tzoyv1$^Wc_a~pF9*ZUJ4-18MUcy2u9;H_uk z;M;MWgFo&Ghro=L9D;VoID{&?IfUg_aEL_Ya)|uv;t;d&=Md+a&>^9i-63(jqeF_( zw?k@qR)_RM{SKLSpAOlBf*o>|i#z0}@8nR3Z0%5NxZ0uQw1`7F^Am@PQVWNw=M@gs z_a8abHMeo7pTEqZ$vJ~VbNyBht(R3C+A}V8=vhknG=4ueTi9fq-q z9Y#eq9mclK9VS6?9j3CX9cD%h9cF*oJ1nGSIV^J4->|szvcvM%e-5iXr#q}~J>;-i z`hvrD*I^F3)>9nzvzBr=q^{v`Y(CiGWhMQ>Gyt8;6I8*31UyK;Jm`}dU` z9?xfScwX=3@H$?@;k`YV!)JLMhwpTM4!?E>4*zmPj(~!gj=%)pj-UX$j$jAT>4><0wIlNUv5u(y+dHCnJm!d5afKsx#!-&Aj%^(A70Wpi zGG=fjMs#u{c~o&ETV!*jXvA=&O89c5308EZGiG+Ae~jwLc<9}cdC{gL>!5B&_C~pm zoQ3=yxf2;W@)|yNkLrhMzEcOLl_ts7(r4DIC2F$0|NsHgEUTrvU&dh|Np;OtRn?Pm$58;0HUjf zm5J?cL|G$`kQ>Em$~AR3f|Kr|>9foM=p0@0w{1hNE_qd+t$SAl5O0HqEv z{mmXsgK`*%56WdA8kEz(^fqR&JSfM3_@G<|qCq(iM1yi4hz8|A5Dm(OAR3etK{O~g zf@n~V1ks>e38Fzc6HNc>;sDX0915aAxfDc$aw?cU-T}5Blw(1BP_6~hpqvY$LAe)1 zgK{v42IXQ94a&(N8kCzsG$==dXi%;O(V(0SqCvSEM1yiTn125e>>f}~2k}9<9Ylk2 zJeXd;6)X?R`5-_x&r2vQql>{IfR2qP2P>BGdL8StS29*pT8dN%fXiy0O zqCuquhz6AuVEQjR*#Dps1H=cF8esa)ORzYo^Z@ZeB?yQHl_DS-RFZ&bP-z09K_v=^ z29+ux8dS1?Xi(__qCq7Lhz6B1AR1KCfM`%@1EN7C4u}SoI$-+yN^m%UN*@p(R04r$ zP$>kWK_wB029-u28dM^IXi%vHqCq7Shz6BTAR1IcfoM=E1)@PE6^I6vRv;QwVu5H- zsRgG0e+K&>RCsh=|D87v;)zg5)VX!N<9z_D)~S(sPqHVAEUtT0hNLvKBy!F(V)^0M1x915Dh97 zK{Tjj1ks?<5k!MZNDvJwB|$W(qy*8R(h@|2N=y(9Dm6hgsN@9Epwbge|6B@=4^Sxz z;)6<35Dh9#K{TjD1<{~V6-0wdRuBy;T|qRcgay%{QkId4g&7K2*~o;<%m;*aM1_bQ7H^JeS#i@W>Z^Q!b zNdCQWXJ@Iy-QR`*_h$ccxPNzBz=IHfhc7dvFMMUKa`<+jA>cco)qx*@9sxg&KXmxT z_3py2l_CdzzflVK(>?Qm?8#LDauuHs$S(-IpkVy^fMR27fD-qU15Au~;Q#*z3K$sv z|37|!k>&sYof{Z9eSAY09G!zfLQy zYY+|cIhcMU7676_ApoX#mO6lFP)LAiP-uW?P>6tNP^f@tP{@F2Q0RbYPzZr&P$+?D zP)LF4;}5~+fkF(#2Zb7l28A4m28ABTtDq1B(V$QS(V&n7(V)--(V!3o(bNf5E=T7O GQ!W5e0R3zL diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Brazil/DeNoronha b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Brazil/DeNoronha deleted file mode 100644 index c60239009e4695a66be6f44df8d332115be14764..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 714 zcmWHE%1kq2zyQn)3=AL)l2C`Td8e&PP1(V3ePPF6qX|1dswwQcmnLw_Vu8Y~*KZW= zNM2rWXQ#Ko-QVmA_hw%ZxPP}t;X#P1z?bPC7kp(65cqZ=OyN79z=R)xatc3=Zx{H* zb!5S>6|W}ze*Ht?Pj~(V*^>FBn9GfPBlqz(7iv{Qv*|KPX&4G$?Gq^k1V1AQ}`#AbQumGyxC|3M(-E z`i%mJ289`z-sugN2ZbGo4+=jJ4GKdL4GKpP4GK#T4GK>X4GL2b4GLEf4GLQ@eSACE zJWv>e_@HnG(V(yf(V*}Kc@-4qAQ}|zAQ}|*AQ}|@AQ}`0AQ}`8AQ}`GVER##0Eh;~ p37EdJ6U+z24Tukl9}o?SBQX7vaRP`2#TAIAc6@QU`Gpv90RY6-87cq( diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Brazil/East b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Brazil/East deleted file mode 100644 index 846caab5d9eb3fcadb4aa201e6df3e38e2bc0a6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1983 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 X5L80y_!{e(>KW+x8XACTePb>FCs_Uy diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/CST6CDT b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/CST6CDT deleted file mode 100644 index 5c8a1d9a3ea46457985198597d90f95462a70168..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2294 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Canada/East-Saskatchewan b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Canada/East-Saskatchewan deleted file mode 100644 index fa9c6eec2fcd0657018bb99e86a84ec6ebcb6a01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 980 zcmWHE%1kq2zyNFv3=AL)k}!p`CEET@mYKI>{e<}kd>gi=`hVDF;PGI)tKo+o0$LAt zstSMD`GM!bZa#y8-RIvu*z-=PVDC=ughNFf9}XwJesCo4)rX@NlM{{^p80TGas7i6 zQZEZma-B&y`RjDSsaNX~PIvN5xTO50;8LOl!{y{2fh)oJ3|B)R3tUsU!*Jd7sK5<| zeGE56mkZo{uz=y#zrz!5A82B@b8qQ{yDR54+}qba;eKaB!-IL56CP$JH9V^Gp77Yy zrQu1O?u4hBY7Niay#$^MIWxRa*AaN}NtNOCvkwAqu3ct$d+d?`6C+m0%z{-IqL}sn z|G7^X8221O)@21O=_21O{C{&l(lM1vw0 zM1vw1M1vw2Oeab(fM`%egJ@7>gJ@8MgJ@8sgJ@91gJ@9XgJ@6!0Mic^fc1kC0*DVv z3?LemAV4%IQGjSr!T`~r!~vo~2?Rug5($U~B@_@1N-Q86lwd$KDA9muP{IMxpu_{B eK?w*l?26ITCOU9e`We!|*2y#?#03MQ=IlV7l* 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 A1^@s6 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Canada/Saskatchewan b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Canada/Saskatchewan deleted file mode 100644 index fa9c6eec2fcd0657018bb99e86a84ec6ebcb6a01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 980 zcmWHE%1kq2zyNFv3=AL)k}!p`CEET@mYKI>{e<}kd>gi=`hVDF;PGI)tKo+o0$LAt zstSMD`GM!bZa#y8-RIvu*z-=PVDC=ughNFf9}XwJesCo4)rX@NlM{{^p80TGas7i6 zQZEZma-B&y`RjDSsaNX~PIvN5xTO50;8LOl!{y{2fh)oJ3|B)R3tUsU!*Jd7sK5<| zeGE56mkZo{uz=y#zrz!5A82B@b8qQ{yDR54+}qba;eKaB!-IL56CP$JH9V^Gp77Yy zrQu1O?u4hBY7Niay#$^MIWxRa*AaN}NtNOCvkwAqu3ct$d+d?`6C+m0%z{-IqL}sn z|G7^X8221O)@21O=_21O{C{&l(lM1vw0 zM1vw1M1vw2Oeab(fM`%egJ@7>gJ@8MgJ@8sgJ@91gJ@9XgJ@6!0Mic^fc1kC0*DVv z3?LemAV4%IQGjSr!T`~r!~vo~2?Rug5($U~B@_@1N-Q86lwd$KDA9muP{IMxpu_{B eK?w*CsR z1er@>3uF)eoFKRH#{&6Kg z5(SfBwh5-{VG3qOFD96?TPRq_unJf_mr}6&{anE6*dGP!+b0EVHb^Y6-Mw1CuK(8p z``Nt$4*7Q$IJT^u;N-t=fpbdt1Q-1U3tU}tC%AsTtl+NOCE$K}tAZzQj)3Rp=?Y$N z{RF({Y+m4VEo*{r&C~^c+k7VY$CNJ!n5H)&&?a(0P?^AlU>WNLA)%ipg#3|R5N3L1 zLfBI)g$TKi0ue`L6e9m!7KmE%Pa*o=R)Lt72MV$KrVGTS98!p%S1FL-dv8Hv`_u_Z zx(5~{rf4qD>FU-K($A(X$YhtDkh#`lLDsYX6SAkJD&$;{5y&lb zSIArcPar=`Q=y>$fk2@dw?a|=A%SAiw+bcxO9V>(b1o>eI545?-s=Sw5{o8O>^r-l z@<+>rs(I@dRNqLOP*XQ?LG2EY33YMB3+iWRO<-VTU}R!uWMO1w8vywKe}4lb!~g${ z1q>`;HV2sG`Tu|J1V#Z6n?V%JmW*@>VTcS4VTcS5VTcR}VTg2b31J8b4q*sz2>~T! zMi9Zk0HSatdkzK$1`q}*tcS7{|NsC0zqYMw4u}S20T2z!1|S-g6+kp7JAi0VmH^S9 zYyqYdO%y;hD0_ftP!<8vplkxN1e8@kG$^}(Xi$~`(V%PtqCr^)M1!&qhz4aL5Dm&k zVEU8E0uT+#P9PeTr9d<&TY+d$)&kL>>;hz4a(5Dm(rAR3fSK{P0< zf@n~71<{}^3!*{U7DR)xE{FzYUl0w-!XO%yjluMDDFqM>%FZAfl%+v5C|iSQP}T;~ zpzIBzL0KF`gR(h@24!^+4a)8y8kFThG$`AHXi(M%(V*-PraxZ>+XpHJKzvY90HQ&~ z0hr!A9V`zj7C?MZ(Ey@B#RG^26%imBR7`+qP*DM*LB$1#1{E0~8dPk6Xi(7sqCv$6 znEoRR4u4QF0^);;5)ch4PQdh08L<7JVgDI6-&wFcsCWbMK}8&h1{HH48dTJQXi#wnqCrI-hz1pVOpHv7Ow24ytW0d| z0|5X3Z%koe0F`fyEa1`)UhefbfXcnO6BtE6vJ8^o(ofdM7gXZmF9E@2AIN{8GLS1E aIK(2rB}B*9SkFk$K*!h6P|r}$fC~V#IxM9C diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Chile/Continental b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Chile/Continental deleted file mode 100644 index 9ca7c1fe7b8b4dafef1df2cebacfa320fdc6a206..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9173 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Cuba b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Cuba deleted file mode 100644 index 2139d1f876b568e53cad9040ac2231b85c82df39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2411 zcmWHE%1kq2zyPca3=AL)l9&x;^Q=ia)UfgLlz>eou?{Dq(=MF29O!V$+T+5hJ-G+Y zsH6s*nd5)p;t}qEOV(cxTweS(;EMG11K$%^FMR)B>+sXo<-*U$!3Tcbw!ZLtd7HzZ zqbo1`ZO?G{w}aur|K*PlFid}RfwBGQ0jBaJ7nlnkIj|%=3}7`CIl$&{IDlQu!+}F# zX#mIf>H}O1?EzdLvK+V{WCrluY&*bvz&n6%XT|~kO^X5qYG*qL2EMu=l(zkVu;G~t zB5pGeh(w@fhI|sR{-~jo4 z1qX#F(*VVMCI=5McIq zdw_-XnF|)rE?=jv;I}Q8uaLAt);Ob%;;QG1e zg1d@%fcu@50iMi113dS12Y5Zc9pJrm`30Xd-!J&Kc3$vXbMu0KYW9VIp4}G$U41VE z<;=Yhtg3$@#Hap3D68OwFrCB;Vej+;B1G!~BF+f}M1D;Oh+6w8Ao{9PKuqtIfY_}n z0dcw80^+B#1tf%Bx{z3>bRo%X%Z21PmJ2Cj(=MdiKD&_mt>Qwu?1>BM*P(V(mjqCwdm zOn5d)$@#SDlB6*V9lRNR1QP>}!_@Lqk zM1zVT5DhAZKs2Z*0@0x22t7q zD&oNO=N@o+0Tp#1KB%|@(V!v^Oz-Ii+Yc)GKzvZ~2ckhmAczJPgCH7I6oP0_aR{P8 zMIwj>6^kGmR5XHUQ1J+&K}95p1{ISa8dOw*>34cy`#?n|hz}|@K{Tl71ks@46GVfG zP!J6&MnN>FCsAvVzpyCxogNj%X4Ju|qG^nTr)88t<;Q=ag zL3~iL3!*_qFNg*ezaSb^1cPW$F$|(XMKOp56~`bNR3w9FP_Yc6K}9o&1{KdB8dOAs zXizZ?qCrJ9hz1qcAR1I;gX!n@!R`SS-5@@w_y*CSA{<16ig6GPD#}4Ls5l4FpduYa zgNk(!4Jz6hnVBesEKEp{m4$ln|Nl)VKxO-;0}L$S5*|{v^MFfu9*BsKZwLcgDbD~c i<{7x0gF{T6T|#txjrEN64D=0jd<_lsO!W-(4Y>eru=j@m diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/EET b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/EET deleted file mode 100644 index beb273a24838c96e81f0469e3827bea20ff930c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1876 zcmWHE%1kq2zyM4P3=AL)lBj~RIeC{PPvGm865wxfogh$RHbF2&eS%Pk!~|hq7XcCD zUlT-?Ur!JdzB56b`RoMo&-*4wJYGLR^74WSQimr_klwRbKxWN40ogh81>|}r2*}qo z3Mk|h2`I)S3n=-72q@dQ3aIFq38>1b3#jo(2&l6IBWJViUBEvQN<7 z@?(O|l9v;7r`(#L*K&G-e#xE*1}SSN7{=ZdFe=(2U~Icvz$9pzfT`?U0W+ft0kgmL z0v6I!CRp4}6tMhVHoFH0247EtUdKZmbiW zQ=|o4RG&|9b^a^h#(HvsyYhVj_jk_(Jedy)c%C~U;PrU1fcLsp0zPNp~MEziJ3X zZTm7I`YM+|%mP7y*e!1a;_5#O#7{XVkPv@WAhGtx6XK2@}#^OrMbPw`fAPN>?jOrZMQ?g=$B4^60D zH+Mo^<&p{Yef1L<7zYe8Xc;gvFfhm{FtED128S@Xx`r??GBPrfl1xEq7L-&$G$^@( zXi$;`(V%1tqCrU)M1ztqhz2EL5DiMkAR3gEK{O~igJ@8a2GgJSO#soLqz$4$$s0t2 zk~oM4C36rBO6njQl-xlyD9M9pP_hTnprj9?LCGIPgR%gK24w>f4ay228k8MCG$>1e zXi&BQ(_c-%?f_*E5FeC9Kr|?ufM`%w0nwoB0-`}#21J9h4TuJ19S{x5J|G&Dg+MeY z8-Zw0RszwW>;$4gSqemhvK5&ATQ2~jLD>sT-%SMbLD>w%2W2%74a#mH8kFTgG$`AF zXi(Mz(V*-HqCr^@M1!&+hz4av5Dm(XAR3e=@ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/EST b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/EST deleted file mode 100644 index 074a4fc76ad816447121db6cd004aa83ea41d437..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 tcmWHE%1kq2zyOR43=AL)lK`<<{{P>(fq}s_ID~x2bu3e{NWP_qA=t_k-2~o|}sv@E%An;M>{qfPZE42Z5Ps4+J|? zKL}NNJP^)w{~!{n^+429^MjZr&jWEy?hg`5nhBB|Z$C&eaVJQ9;wq4S_%=c2;+q25 zgXa_EHl8bxU$`+rp^V{!V&milrO-zol(W`9P%%C7LDg&G12xfQAJnyqAE^I3T%gGn z`atvE(gLkl<`1;@wHN4I4oT3Rmsy~<*(^c7&bz>1vP6Pmdin>WqF)Kd?w%h^g6<@k zs%w8RGuoG6&d&S6Li*MNi)ZgYSpMGg!0On=57xKmJ+N8-uE2J8!vnki3kCMGlO8za zZz^zXsZVh7pHkqQl9=G4UsmAi;+)|6dBq2J-S`LYm%BcA@;W~7+??~l>#gzw?>U_X zKGz%)d~31`{I)42_{aDb1WaQ|2(-~J2r7M+5G*5D5E6PKA>{Yxf-uun31Lt9KSanK zdk}Ht{gm|9t>apbQA2L75OlgEAtB z24zMN4a$%pn$6*U0f=TdIFtaUdnLhqPJtz0J}8rd#6cMqM1wLbhz4a?5Dm(-AR3f$ zK{P1yf@n|%2GO8Q45C398AO9JGl&LdXb=s`)F2v^u|YH_bAxD51_#lgOb((!868Z2 z;sU!5l;J^qP^Jgbpo|ZqL75*!g9-o;4JrgcG^ii|(V)TrM1u+h5Dh96Ks2ae0MVer z0Yrle2r&KcFxWm&K>^}}3JVYoDlkAasL%k>pn?NLg9;B24JtrDG^h{((V&6^M1u+w z5Dh9&Ks2aO0nwm>1w?}i7Z439U_dmekO9%4f(A@Kdk>CZP=N#Dg9;rG4Jvp*G^p?a z(VzkdM1u+;5DhAbKs2Z@0@0uX2}FYmB@hiNm_RhBa01bw0t!rjUIDfbR8WEVpu!47 zg92NiZ88dTtc=_4P(_JayO5Fb?dfoM|L4_oU1{IWG`fU{0J)i;;#0M3cAR1I~g6Xw#V0lmh z3gUwbQ4kF(NI^8HFa^<|0u@Aq3RMsdDp)}@sBi_*paK>|g9=#?4Jv5C^gl>`1r@j; zKB&+I(V&7COz&F^wjWdggZQ9A7({~#Vh{}~j6pQ0KnBsELK#F4n}V6kH8{l7)g?s7 T*I3U;&p^l5&`{4%&wvX6F;cIQ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Egypt b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Egypt deleted file mode 100644 index 39caffbe4ebdb6179a441ddd0e0c6fce4ac0ad2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9307 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+10 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+10 deleted file mode 100644 index d564b28a6f8c3fe191ed3e585b05847376843f9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130 ycmWHE%1kq2zyOR43=AL)lK`>V|Nk#eU|?|f4be6V|Nl=7U|?|f4be6V|NjqnU|?|f4be6PX`w(Xmkq=eJ3}Kb01g%n@Bjb+ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+2 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+2 deleted file mode 100644 index e43b63f66b6c081a1fde636a3705e30ceba613d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 ucmWHE%1kq2zyOR43=AL)lK`>V{{MgcfPul?H$)qxgM6J_HefUCjJNV{{O#vfq}u@H$>Z*fq{X1om@6xGwh7H06Q%YN&o-= diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+4 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+4 deleted file mode 100644 index 0ad0ee3229bd1a4dae7670cfc3c0514d6da97aae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 wcmWHE%1kq2zyOR43=AL)lK`>V{{KIIfPul?H$>Znfq{X1om@6xGwe*b057!<5&!@I diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+5 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+5 deleted file mode 100644 index e53f3febecf64fa59b36cc90405bcb6afc79e692..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 wcmWHE%1kq2zyOR43=AL)lK`>V{{P>(fq}u@H$>Z%fq{X1om@6xGwe*c03V{{LUSfPul?H$>Zvfq{X1om@6xGwjT`02sv%q5uE@ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+7 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+7 deleted file mode 100644 index 32fa6dcb42ccb1f685fb3cdb363b52ea61294ca0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 wcmWHE%1kq2zyOR43=AL)lK`>V{{Nplfq}u@H$>ZV{{Qc9U|?|f4biq>U|=9$CzlP_3_A-h00GqwG5`Po diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+9 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT+9 deleted file mode 100644 index d3e47e7b24e591d3d50c317d8e5c6c849a2273b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 wcmWHE%1kq2zyOR43=AL)lK`>V{{L?*U|?|f4biq_U|=9$CzlP_3_D9M0QOD|`Tzg` diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-0 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-0 deleted file mode 100644 index 2ee14295f108ab15ee013cd912e7688407fa3cde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 pcmWHE%1kq2zyOR43=AL)lK`<V7#R2j7#Q4rLv#%p7#PUc$z=mJ!%o+b3jo+72x|ZU diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-10 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-10 deleted file mode 100644 index 37b93fb9d15dd9247b52e77117ea81620258fcb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 zcmWHE%1kq2zyOR43=AL)lK`>V85nvNFfh3LhUgj^FfcGspq0x8Vv3!vp#c{Fc?Ane diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-11 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-11 deleted file mode 100644 index f1af0e290c988923609d96c86c23f03ea10b6671..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 zcmWHE%1kq2zyOR43=AL)lK`>V85m}5U|?|f4be3;WME*RKr5FG#1uPSLqjeAhD-~I diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-12 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-12 deleted file mode 100644 index 0fa4a8dc03ddc0a96f2dcd7adda6bf2a883bc038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 xcmWHE%1kq2zyOR43=AL)lK`>V85mX^U|?|f4be3OX`w(Xmkq=eJ6%H~E&!903&{Wg diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-13 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-13 deleted file mode 100644 index 0a5dbe16cde2e1871091a929bdcb23f1b7536ca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 zcmWHE%1kq2zyOR43=AL)lK`>V85p)*U|?|f4be3;W?*2TKr5FG#1uPSLt`!gpxO)x diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-14 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-14 deleted file mode 100644 index 41c6a1d1ca0a7bd4f391c13e069307859dff1924..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 zcmWHE%1kq2zyOR43=AL)lK`>V85oW{U|?|f4be3;VPIgOKr5FG#1uPSLlZ6lt|1Ib diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-2 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-2 deleted file mode 100644 index 9f63268d09e0b2dff05a1ee179beab9b51ccbccc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 vcmWHE%1kq2zyOR43=AL)lK`>V7#L&}7#Q4rLv%qp$k)kb12)4>*N6)MV7#Oq+7#Q4rLv)Q97#PUc$z=mJ!%o+j3jpx}2V7#J)Z7#Q4rLv&3T7#PUc$z=mJ!%o+P3jqCa2`c~q diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-5 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-5 deleted file mode 100644 index c88cf210c3ba7b6607e57b976ff35e74d7a24d70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 xcmWHE%1kq2zyOR43=AL)lK`>V7#Q3F7#Q4rLv&3U7#PUc$z=mJ!%o+f3jhi332OiV diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-6 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-6 deleted file mode 100644 index c1a0634cf5ca81e8d51493b3e7ed1ce53bff6eed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 xcmWHE%1kq2zyOR43=AL)lK`>V7#Knl7#Q4rLv+m;7#PUc$z=mJ!%o+X3jh{f39A4A diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-7 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-7 deleted file mode 100644 index bc152efdaf3c9c522cefa7f304db8a4facb1fb63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 xcmWHE%1kq2zyOR43=AL)lK`>V7#NZY7#Q4rLv+m<7#PUc$z=mJ!%o+n3jiX_3F`m= diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-8 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-8 deleted file mode 100644 index 2c0de20faa3e59e78a549f005f011ee4305b1e11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 xcmWHE%1kq2zyOR43=AL)lK`>V7#Io~7#Q4rLv$?|7#PUc$z=mJ!%o+N3ji-W3M&8r diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-9 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT-9 deleted file mode 100644 index 8a3bd45af31a743e973fcd3deff998c07409b87e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 xcmWHE%1kq2zyOR43=AL)lK`>V7#Qj%Ffh3LhUi){Fffp>lgkEdhMle@7XUk|3TprW diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT0 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/GMT0 deleted file mode 100644 index 2ee14295f108ab15ee013cd912e7688407fa3cde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 pcmWHE%1kq2zyOR43=AL)lK`<O=5C#SYa`kbAI)@l=0RVVt26X@c diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/UTC b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Etc/UTC deleted file mode 100644 index 5583f5b0c6e6949372648a7d75502e4d01b44931..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 pcmWHE%1kq2zyOR43=AL)lK`<rddo%m$wU{|Kcks+zvY%((a#f!B)5UleOmOU3 zSoVWwQGs&L;;>shO9EJXmYVJ1S*9A@vt0dP&x*LmJuBH4_pE#u#k1;pYtI_>M?7ne zr}wOVo5r(lxo6M%b2EE3v}^Zl+$h(xslbD0^Q0i2Edg3QTZ>zJwi)p7Y!BJVvxEN~ z&rXMmo}KS6@a&c-?Ad+eP0ya6OL_M0IM=i9){UP1GdA=b*c;n(uwqirq2;H04&8~3 zIUG?^aHRf7!BLB_f@2BaKO9#q`f$Q!Q^1+$-U4S=icdJV$XVe0Bol!PO{xMHi^K#j z`8iDB)%sh&yCiu6U$>M1e~aq`ffBO`f+^|~ghC`H2>ZGSh#3ExAgcU&f|&4~3F6FW zCy0OEH$md@`U#Sk7fg^kJaK~bp1lGxYt{+K&Y3SD*E2ytzNS$?A*V<{F(z3+$tOfW z*~V2sMaN7)RYqMvjYmR2oz;1Q`d5<)8c$UxXkHbYpmmgeg7%gl6LglmoS-}9)&#wl z(-ZVd_DnEHSv$cn_NIVQ(G~$?+uZ^tLDK|GW#4|5+e@$~l3A_^SemwXY^5*>4v}jy*FWMSiA0s_nW7X&hT8q{~j2kp5!&gp9vM z6EaU!PRP0&G9i0K^n{#ag#x)9wiEJ}1q?|WUjVxUREmN4pppzkgGw_H4Jy$>mKDq%r1sFVfKppq6ugGyTv4JvU#G^o@C(V&tSM1x9S z5DhAUK{Tio2GO9B7(|0gV-O80k-_v=6RjgkGsALDzcN4*U zPzev>gGzZ24JzqDG^n%((V!9^M1x9w5DhB%K{TlJ2hpG!07Qdo0T2zU2|zTcHUQC} z8UaLuY6TDtsu{rayJukgK{W)352__VG^nNk(V*G_M1yJ!5Dls|Ks2c40MVe@14M&r z5D*QjML;yDCIQi)+5|*{Y7`I+s#QQVsAd7v-wnX=0jgm@d{8X|qCqtchz8X*AR1KT zfM`&y1EN7S4~PcUJ|G%Y1A%BzEd-)LH4%sg)kYv1R3m|CP^|=_K{XSI2Gvd=8dO7p z=@-+%?g7$J0@0uv3q*rzEf5W=xj;0i_5#tM8Vp2(YB3NEs>wh!s5S%9pc)NC zgK9Mp4XW8dG^ln1(V!X*On-O;jt@{x2jYWjI}i=3@jx`F)&tR?nh!*SYCjMSssTYX zs1^j#pqh}0k%^gwNXX90#>&RZ#lZ=Nyxcqk1;Ldd1Go}o0kc8X-x5YRn`Hw7q$(5u zSBL@(4159%kg8A;Tp_|qh&YJ!0ab>0Dn;zIBB+|=a&`^THFS0j4$<*7)-%;J(D5}i J0MYu!Tmar%k!b(` diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Andorra b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Andorra deleted file mode 100644 index cf9533a3e4d5acb318419d5829880e7197a13a16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1725 zcmWHE%1kq2zyK@^3=AL)lE{X#d9OI$W{_F4PC$0fd;z(h2?FvpjRFceMFNU3$pT6~ zAp*)at^z7LW&)}*>H=y!5(4V1&J)zXnoQ7msyadQs@MdrqwEv3xBQr(v*hIj-6^*w z=(U`lpkK0Qfnvb>J7R*(viJ$MyR9bJwK-0(pDi=NAx(LLV~eGLlN;*<=M-rH7uDwzT%G?4 zxUrs`;I4dM!2R7b0Z-x(C zylX;GPU?hU^PCAGKJF7j#r-CP>1a*}`))8HLexzl;=0g;$gdg#QQN*uh`!1t5VJr~ zAa=_efw=n50`XJM2_(c{6-caoH6h7Z^*(;(a_d)@&||p&Xiz=^(V)BpqCxoyM1%4ahz8{=5Dm&(AR3gvKr|?ifoM=Z1JR(o z2BJav4Mcc@*s!?8V}YY+{}+aMa0zdWhz6AjAR1IIfM`(J0HQ(V1Bix}5iHDff(#6dpnMIongv`u za4;~)C@}Is*gn1?3~0p#xV&IsWaM&o4be4pb`1{E@io>n)icoXH8cRx`o>%UkKKB3 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Athens b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Athens deleted file mode 100644 index 726e56c3fe180c9212646e05bee82dfcbdd671bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2245 zcmWHE%1kq2zyO>K3=AL)lIVo8#b!4sHtei<`C#X<^%qWlN`7!kU`4>0=iUNmSNVK6 zw@Bi_`N^3D_l4&r+~3X>!1*RFfm`BB0{7W<3_N@1Gw?16ZQ$#PZQyS)ZxG1(BOsVk z{Xr;b)dyj>rUVh=Ljj`7uP2BJ-s!~~mV@e^!!TTQTQbDUs5TV{eo zn(_q47E1vqH`WQxDbfNis?R65I{y`LV?8;+UHQI%`@3fXp3DaYJkOmF@Or#hz) z0iQGbC;0aD2>7j8IKe+JPavSDc|u@#*My*))Cs}nITJ#B+$V&J`%MVb(VP(W-C#n5 zsGC5{rccQDTQni_MCF96yCD;@S42<9IaVl;+hIE)Z&|QF zeun&nf;Llu!ay5=qBL=VVnaEB64##srGg9sW%{BM%04_2sNnlPq2j_3fy#F`Csb`% zCQyBD_k^06hbGjnn>(Sda><1HzWNDFj7*Fy%q+}Ij7+R-Uhz4aR5Dm&wAR3gdKr|?8 zfoM?n0@0u>2BJaP3`}q53IJIK%5ESUl;yzm*>xZaob^BqQ1%1SpezWYLD>*QgR&xs z24zPO4a$-r8k8+TG$?C=Xi)Y9(V#2}qCwddOn=@t0YrncD~JYVSr84%wjdgmbwM;J z`+{gt76#FvYz(47Ss6rwvNMPVWoZx%%GMwnl(j)LD0_owP!DNS z1C-@Kd{DLr(V(mkqCwdoM1zU|5Dh8@Ks2Z*0MVf007Qd|1P~1>7CZDxN?zsE7j5pkfL{gNiB;4JxicG^oe| z)87ri@c}BjKzvZ~1)@Pk7>EWHV;~w-l!0haaR#D6MH+|(6>A_GRJ4I;Q1J$$K}8&h z1{HH48dTJQXi#wnqCrI-hz1pVAR1Kkf$101!R`SSfgnDp7zELvq7X!bibD_$DiT37 zs8|HiprR2(gNjEG4Jsl*G^m&a(V(IdM1zV;5Dh9aK{Tk?1ks?P6HI@21db0-5enji zict^^DoQ~#s5k}DpduASgNjuU4JukeG^lt5(V!xhk(r5^iIs(wg_((&jU5a@BFr3| z^oFo9R?LQh1ze(XfJ#?T8OtZYAP8bJilT~Z88AZC`1pn};3;j9i(3XpMlM&^5M3is X$*kjRtY@lcpl__>YiIywnQ#FB8(Sje diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Belfast b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Belfast deleted file mode 100644 index fe63ff7e7f1e9b47c45c62a7768e3924f8572c40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3661 zcmWHE%1kq2zyRzF3=AL)lK2E=^UhXVyI}S;R)sm|4HnE@a(KbKIdd1xpDwjvLF+Ds zg=K#hEJ~fDu(@t*}frL1DT2F@+UcItnXZ|5&h!;qro2S49<8zx<%E z=6H_6+LMmR2}eFf z_;q0Og5NKg7yPMSz2NWh-381A#}rsJBNSKzRw%G>S}Cv_bSbdElu_Um$Wh=t@lS#4 zgP#KTCaDEH7Yr15C;nN$w?RmOzwq7yfth*>1OpE&5ULbdAZ)m3fk?!s1)|EYCx}@b zn;_17c7lY&iU|^r*H4iA(KSKp@Wcty50?wbtXU@@d$3bLu4jUP{K9Mjg`6S*#YSHN zC7%!hRP%J)W4cc(B$Hupm|kng4WBA6STMdn4oj=@&w%} zw4&%!D_Fwfc5Q&2{y~(C)n<`nqb%FIKh6l%mjxt_qtUAK4IU(%3!Gs7=H-U)jLK7mtY6wJa`!XT= zDwjaa0zrY;EpG(k>OTv_PdO)$5Pwx5vG&!3B>U|G$+2f9q{z<{NVQ!zA&q0}gml>n z6VhKypOEplXhPeRw2L!S{Va#f2jRmG5p&sM@ehp!(eI2{khhO{iTrcS2p| zk_q*F^%EEvNrX%cFbLAgM1pQ+R!qe#toR@sK1p)r7#R2j7(rzj0|N^KgNy) z4WdECCYZj)ssN%v#V3dc6`>#+RE&aXP*Dn^LB%PE1{J9w8dR);Xi(7#qCv$ghz1q0 zAR1K6f@n}t3!*{AEtr1&V*!W;6}w>iswmigQ1J`mgNk4f4Jw8~G^i*B(V*fOM1zWC z5DhApK{Tjn2GOA68AOAMXb=r5ra?5Qs0PuX;u=JQifj-KDz?G&`zv7gfQoMrA5?^c zXizZ@qCrJDhz1qsAR1JpgJ@8(4x&LtJBS7q?;sjf#Di#1F%P0aMLmcH755+-ROEx{ zTby8fK}A1^4=VmaG^h#y(V%JoM1!gV5DlshKs2aI0MVdo0YrnU1~C2GNB~5Gst6Db zswO}*sHy%20MVc-1Wf;&3XT_0RRZFJsuK_ms!~8S zs9FKhcaQu8`vX+HfcT&)21J9Z84wMsYCtrox&hIkDhEV^svQsws(L^)sQLlXpehJN zgQ_7g{hJ%?4p4Oj;)ALr5Dlu9Ks2ao0@0xA2}FacC=d;*ra&~PsshoV>Iy`Isw@x< zsA(+@6!{RyhlKzvZO2BLqzU6G^m;d(V(gpM1!hZ5Dltw zK{Tk^1<|0Y7es@qUoidE1Z+R38V2z}RWXPLRmUJ2R3(FGP_+!AK~*z|235}>8dODt zXizl`rk|^TC~$QRVt}e_5DlufK{Tl92GOAE8$^Sua4`M1UI0Xcs&X)WHxbMSRp}r; zs9FcnpsF22gQ|BB4XWZnG^m;f(V(gxM1!h(5DlvGK{Tk^2hpIaA4G$ye-I670)S{x zGXO+`ngU?@-7~QLpe6x`4{8>GXi(DtM1z_KAR5#}0MVdk0*D4R6+kqoxd5U;O$HDR zYBqpqP}2cKgPIQ@8q|aU(V%7ohz2z!!1Q+maJ+z;6d*pRSplL!O$!hWYF>b7P!j`0 zgPIv28r0MP(V*rAhz2z|Ks2b?0ir=o4-gG%et>9D69hzqnjs(>)D!{HpymjO1~o~* z^o!|W_kfxvAU>#h0-`}p6c7z+rhsTrQw2nWnkyh0)MNqCpk@n*1~pwkG^qIkqCrg< z5DjX^fM`%t21J9JGawq&qyf_(9)aTn)U*NdLCqTw4Qk?mXizf;M1z_-AR5%%0nwl) z4~Paedq6a(>BGcGDr9DaL6A;n67;jMVJc>2!w1>%Ns=q~|NsB3An)@DFtUJXP-8_# zfsqH?0%8G?2ysyJ#Rt^-L2d;hH-kXUAue~{5Cf;+5FKA*JySgceM22zLjw?t3jhUd BRLcMW diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Belgrade b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Belgrade deleted file mode 100644 index b817364265ba707fd66d4f8dc74266e129736e45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1917 zcmWHE%1kq2zyNFv3=AL)k|>9=IZrW}J~;E-Tj1s!~~mV@e^!!TTQTQbDUs5TV{eon(_q47E1vqH`WQxDbfNis?R65I{y`L zV?8;+UHQI%`@3fXp3DaYJkOmF@Or#hz)0iQGbC;0aD2>7j8IKe+JPavSDc|u@# z*My*))Cs}nITJ#B+$V&J`%MVb(VP(W-C#n5sGC5{rccQD zTQni_MCF96yCD;@S42<9IaVl;+hIE)Z&|QFeun&nf;Llu!ay5=qBL=VVnaEB64##s zrGg9sW%{BM%04_2sNnlPq2j_3fy#F`Csb`%CQyBD_k^06hbGjnn>(Sda><1HzWNEw zj7(t2z`{yT$iToS07_#JQbvK1g@FN?1c^JlhA=q028S>(FfxJ=1Bihm-Lf+VES)8IO0Hg4a5iKHxLcVb08X&??5yt z?}2Dg{sYmVJP4ve`4B{d@*;=^|(M1%4!hz8|f5Dm)1AR3g9K{O~YgJ@8G2GO8A4WdE$8bpKgHi!o0 zZx9X2;~*N8&p|XOuY>9D2H^Mr<#`Yvlehz6A@AR1JzfM`(J0-{0X3y21lF(4XL&VXo8Sp%X$lhz6BKAR1I2foM>f1foIZ5{L$sO^hr|%wWjK z%0^Gfz#wb^as!_L0}HsIf)q|1;35i6f@FPsK}8e@gNi9oA;riD(#gQc$mQ%BqH72$ VzjS%*Lz>n6-yvUS3|of9U^Z<#*f1ZUxd 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Bucharest b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Bucharest deleted file mode 100644 index de2a5f0af1a4d0077692edd8332f46227ac6f747..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2195 zcmWHE%1kq2zyRzF3=AL)lIVo8dAD!4#Ie)vbHdK|a}svl?@ic!zAjS|$hRmrP19NGT04j9vG@sHpmavF&aFlb~q= zrm}Md%#11o%>LF3SV&KqU~xB5!18z51gpKy0@k-9CfF>CpJ2P&YJy#x;{^NJG7}uq zlqWd0SPD3~u}*MKkrr@KeLlg}`LBQ*>&Xf3%J&7_-#ruXWIib1dG3UO*W<+k-s@Hg z_?+24!MCqRz;DgM3I2I`0s%eE69U7#CIscAP6#&7nGoXRJ|R@xZ$g-k=7g~C1`{Gg z-2@`83r&dpsv!`y?aPGdt6Tyx3j_sXx4aREtN$zzKjoZ2Li|;M#M)OAlI*t&B*&ha zkRm@*Ak}u=gfxz=6VhcTOh|t*eL}|Hq6wKNDko&!4VjR=B6>p3u|k2|4%-QN%Yp^+ zGvp@}w3!MN2HFS|rHKm^8_Efkxc(F<6=V=7(-)mk_TiC01>g4x6&H>ORKB}8p=!f2 zf$DR+C)CV5G@*9g+zEA+OD5F!)lXnyWI~0^EX){UAQezS7LYtM3o9G7Ap?U%1t|4u z88EUiFvut{a56ApXFK_ZFu1w~gNP6Y21Z5*W&lw*at8+k0|N+y%8dL&+XizBtqCq7Ahz6AgAR1I6fa$;W0w5Yx zGJxs3iC{jcgaGkDr38oul@uTvR9b*&P>BJeL8S(W29+Ej8dQ3KXiy0PqCuqyhz6A; zAR1JffM`&O0-`~s3Wx@kEMWTGGqC-j5(dNvl`8dUOt zXi(_`qCq7Phz6BHAR1H>foM=^1foGD5{L$sN+23kGJ)yu1`|LusDuL3*M-1*P)P;i zgGwt94JxrfG^o@9(V&tGM1x8%5DhB9Ks2Zn1JR(83`B!UGY}0b(Lgk)R0GkVk_|+I zN;ePU5JZDYLJ$oq z4M8-hL3zy&HV sF1C+v2m@-Nid?EPFfwwvx`yZ)fy!JRUt>K}Jp+AX9bZEOFw2As00U1xYybcN diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Budapest b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Budapest deleted file mode 100644 index 28065290c06315f3c5153fd2d1fc1c70312fa633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2393 zcmWHE%1kq2zyNFv3=AL)l9&l)bI#@wPndo6)`vMa*G-taWb1@^1`!4GmTNAUKXtdj zf?1ao7N%5ASX7{)usG_dz{!s`6V5#M7C5_7e8Ra!&I0ErnFw5HQWdy3v*N*}-nfLz z0m~*_@w_B()$*{wHO(yo*Cm$<+~AxhaFglagqtrb1a7_6pK$wGw7{c9D?U69{FLyd z`A)%8W7P-GN*;cAF1Rh>MaU(F7atEz5cV}=5HbEWK~(wm1To<|6U3R%P7wdRZ-T_* z^%Ep7FPI>8c;W=ItqFQ9rzhx_?3rMY zvUY-D>`eiqqAdc(wz~yPf~E9+bTEIp1`2<(zzXEQoCnvZo-xqLy z_e{W(`JjO3xf23jj~5GguUjSHb7ubp-@YCJzcmXd_~+#b1oSjd2n_F<5R{WTA=o@; zLWqz1givw631K>#6T-e5Oo$M56NtDjG$Hb* zlyd?J@mB>BYhO)BvfnO{9D8O$iu_E0RNHkE(m1wGNSB>3A^pYl2^oKjCS;zdoRD=l zWJ30e=m|N;3I%dIY$xO`3l_-Fke^V{W-3q^Xd_URCN5BHC?`0t~FEY=nrjYj6mIvug+g0|O%?BSVcZB?O2Dl@cHtR8oLwP-y|8K_v!=29+8h8dP$CXi(_^qCq7Hhz6A+AR1JX zfM`%@0-`}B3Wx@kDq#An3D_N=(gnl^l`tS0RLX#8P)P%#L8T3d29-D<8dU0lXi&)m zqCuq(hz6BFAR1H(foM=k1foHu5r_trNFW+iDuL<0^#ULoR62p_yNO^vsFVWnK_wN4 z29;JI8dPF|Xi%vIqCq7Whz6BjAR1JHfoM=E2BJYF8HfgzW*{0=qJd~osRp7!B^!ta zm2P1A-7~QLpi&OR2bFXn8dTbWXi$jAR1KqfoM<(2%mUHDpf%=sAL7vpwbmYgGyKs4Ju{9^o!|W_kc=U z5Fb?Hf@n~w3!*_KFNg+}z91S@0)uE!DGZ`PB{7HwmBt_%R3d|DP^k=}K_xSY29?er z8dO4qXizB)rawFa#|Nmi2Jt~9Hi!n5+8`QKa)W44=?$VmB{+x%mEs^8RFZ>eP-)J@ z$i&RT#0Y^b%q+|-AOR2!!ccK0MpibuLk0%HCm>hKC@`{s3w2I#p$=#B2{1rKe0)J= mI=oa{&MkOw5u1 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Chisinau b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Chisinau deleted file mode 100644 index 983cc707167654f15ee699872672384a4637157a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2407 zcmWHE%1kq2zySOV3=AL)lIVf5mF8v7=h?pD630%v&j~x<&q>&Izc*p``MQKXCssb# zyJOaaeJi>j?4MEd;6O+2gM$@u4-RGcKR6uW@ZgAt;e(?VN)L`{2tPP3!Sdk5p2-QP z%4-A8JogqjyHb3@xkb(b=O>v6T=1KaAgaFnf|$e|2XT(u0ph>-4@kV?yC8Yn*+J^e z|6meqY44Dzx4tZ(o-f_+)Wg){9QJ|YOk|^_3elWHp}8C z*zUHPVAtk2!G5;P1cx-`363q60#0tM6P#0|1zc30PjGeqE8xa@a)P_^eF67(&jdV~ z4+?mmJ0alpc(H)@x>W)`XZBCI!A?&-sga}bLfr#ru6C%HA2t;lBG9mgZmq5${L4nvUZv^7%KMTZ9IVX@1 ze^nr{_SJ+W`|SeBv1cZv$j=l=wOuzMjbrPCblC|L(qBxUkny)@LgtCe30ZeTCSTm{B1s2OB#ZI~OMe za`V6;7Yh?J3o9J*@=+TyFi3p?C1!~V1{MYeEdxdl1_l`g23{Bm5#bYH5Cn-Zio!?> z2SzE7dImWd2@`>t;Ora1;N%;^;OZI-B0?CPT|qcFguyr1g~2!2n}LCWkr9F!7#TrK zkVBxDkr77@6kuRr0AY~2UMO4b|NsC0!?vCH0ir><5k!M>B!~v(N-+I?P6CJqAgP$>bTK_vx<29*{d8dPF{ zXi%vErsow0fM`(Z0ir=A2#5xiA|M)6l7Q(eZxTQ>s6+wLpi%`ygGv?<4JutgG^m6D z(V$WWM1x8i5DhAAKs2bt0nwmR2SkHP9uN&GeLys*1On54>%r*(R1$&spwb9LgGwY2 z4JwsDG^k_((V)@^M1x8w5DhA&Ks2bN0@0w-3PgiSED#MUwLmnewaK_wxW{%$YAU>#c1ks=p5=4Va zNe~SxDM2)-v;@(h5)(v&N=*(X9m1#h`=`0jZZ!U=Z~24PhXr5XV!B hGcYo8xw?kv8i6VS9baQTQ#}KHV;x^Z12D^k3jn1mntcEO diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Copenhagen b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Copenhagen deleted file mode 100644 index af7e9269e5e4517167db0f74284cff125104bd93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2134 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 K07UB>a{&Oxz*D#Y diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Guernsey b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Guernsey deleted file mode 100644 index fe63ff7e7f1e9b47c45c62a7768e3924f8572c40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3661 zcmWHE%1kq2zyRzF3=AL)lK2E=^UhXVyI}S;R)sm|4HnE@a(KbKIdd1xpDwjvLF+Ds zg=K#hEJ~fDu(@t*}frL1DT2F@+UcItnXZ|5&h!;qro2S49<8zx<%E z=6H_6+LMmR2}eFf z_;q0Og5NKg7yPMSz2NWh-381A#}rsJBNSKzRw%G>S}Cv_bSbdElu_Um$Wh=t@lS#4 zgP#KTCaDEH7Yr15C;nN$w?RmOzwq7yfth*>1OpE&5ULbdAZ)m3fk?!s1)|EYCx}@b zn;_17c7lY&iU|^r*H4iA(KSKp@Wcty50?wbtXU@@d$3bLu4jUP{K9Mjg`6S*#YSHN zC7%!hRP%J)W4cc(B$Hupm|kng4WBA6STMdn4oj=@&w%} zw4&%!D_Fwfc5Q&2{y~(C)n<`nqb%FIKh6l%mjxt_qtUAK4IU(%3!Gs7=H-U)jLK7mtY6wJa`!XT= zDwjaa0zrY;EpG(k>OTv_PdO)$5Pwx5vG&!3B>U|G$+2f9q{z<{NVQ!zA&q0}gml>n z6VhKypOEplXhPeRw2L!S{Va#f2jRmG5p&sM@ehp!(eI2{khhO{iTrcS2p| zk_q*F^%EEvNrX%cFbLAgM1pQ+R!qe#toR@sK1p)r7#R2j7(rzj0|N^KgNy) z4WdECCYZj)ssN%v#V3dc6`>#+RE&aXP*Dn^LB%PE1{J9w8dR);Xi(7#qCv$ghz1q0 zAR1K6f@n}t3!*{AEtr1&V*!W;6}w>iswmigQ1J`mgNk4f4Jw8~G^i*B(V*fOM1zWC z5DhApK{Tjn2GOA68AOAMXb=r5ra?5Qs0PuX;u=JQifj-KDz?G&`zv7gfQoMrA5?^c zXizZ@qCrJDhz1qsAR1JpgJ@8(4x&LtJBS7q?;sjf#Di#1F%P0aMLmcH755+-ROEx{ zTby8fK}A1^4=VmaG^h#y(V%JoM1!gV5DlshKs2aI0MVdo0YrnU1~C2GNB~5Gst6Db zswO}*sHy%20MVc-1Wf;&3XT_0RRZFJsuK_ms!~8S zs9FKhcaQu8`vX+HfcT&)21J9Z84wMsYCtrox&hIkDhEV^svQsws(L^)sQLlXpehJN zgQ_7g{hJ%?4p4Oj;)ALr5Dlu9Ks2ao0@0xA2}FacC=d;*ra&~PsshoV>Iy`Isw@x< zsA(+@6!{RyhlKzvZO2BLqzU6G^m;d(V(gpM1!hZ5Dltw zK{Tk^1<|0Y7es@qUoidE1Z+R38V2z}RWXPLRmUJ2R3(FGP_+!AK~*z|235}>8dODt zXizl`rk|^TC~$QRVt}e_5DlufK{Tl92GOAE8$^Sua4`M1UI0Xcs&X)WHxbMSRp}r; zs9FcnpsF22gQ|BB4XWZnG^m;f(V(gxM1!h(5DlvGK{Tk^2hpIaA4G$ye-I670)S{x zGXO+`ngU?@-7~QLpe6x`4{8>GXi(DtM1z_KAR5#}0MVdk0*D4R6+kqoxd5U;O$HDR zYBqpqP}2cKgPIQ@8q|aU(V%7ohz2z!!1Q+maJ+z;6d*pRSplL!O$!hWYF>b7P!j`0 zgPIv28r0MP(V*rAhz2z|Ks2b?0ir=o4-gG%et>9D69hzqnjs(>)D!{HpymjO1~o~* z^o!|W_kfxvAU>#h0-`}p6c7z+rhsTrQw2nWnkyh0)MNqCpk@n*1~pwkG^qIkqCrg< z5DjX^fM`%t21J9JGawq&qyf_(9)aTn)U*NdLCqTw4Qk?mXizf;M1z_-AR5%%0nwl) z4~Paedq6a(>BGcGDr9DaL6A;n67;jMVJc>2!w1>%Ns=q~|NsB3An)@DFtUJXP-8_# zfsqH?0%8G?2ysyJ#Rt^-L2d;hH-kXUAue~{5Cf;+5FKA*JySgceM22zLjw?t3jhUd BRLcMW diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Helsinki b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Helsinki deleted file mode 100644 index 97229f3157ed0ede0c7abc0659c4c53ff88563d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1883 zcmWHE%1kq2zyPca3=AL)k|>3;d6yLDOPoFzm~du)>jhEe*Av8q?@SP9K087D^S%iZ zkJnF-yu4t7)ZvK}r1$IJ6V$(&Owf3$IzjWQ*aWSk>=U%N{FtD#* zVuH=G_zAYVttQyDIZm*jEi=I(O?iT2i=}{*8|wt;6lnn$)#npjo&O5Bv7VgZu6$p> z{oOMGPv(OHp65;ocs*V$;Jt2@fX|uz6MXx61pL-4oZz3AClJunJRvZ=YeG;?>V#nP zoCzU5?h``A{U(IzXif(L7S;SVW5pbQJT0wv7wwmiR({+Qb7iRGJVkr zWgi|1RPcSDP;udiK;^re6RI{W6R1A7dqU03LlbJ(&7DwJxnx3pU;P9oMkZz!dP4>V z@eEMP(lTIVVPKF^VBln6K(IZ0Ll|6LgF!?HNEIU^0|NsiBaW2H#=yV;!XTApP`2Rz z|Ns97?^2rqqCu$^M1xW;hz6xzkYZ2@2GO8Y45C3P8BBlPHvvS0QZ$GLrD_ljO4%S9 zl)6DQD20P)P$~z}pp*`xL8%=?gHk+*2Bmrs4NCbS8kG7$G$;pvXizQy(V(0FqCvR< zOn)^2y91OfKzvZn0MVe_0ir=U1Vn>!35W*e6c7!{Eg%|{V?Z=0*MMkH&H>S&+ykOP zIS539auJ9I=h{R0YEgU6adkn zk^n@5N&^rLDiJ_5s8j&apppSZgGvW5{bD-UJ)lwo#0QlWAR1I!fM`&O0ir>r28afg z93UE0dVpw92?C-)r3i=yl_VeBMfL8S_a29+!z8dSP~=?{;<@c}AjKzvY1 z1EN8t4TuJnI3OBS>VRla$pfN6r4NV(l|UdGR0=UNGcmKU(i_5xA@K|b7H|Q?0WOSq tk=Z`JAq?mR5(BtIVqj$Ca&-;SH3F4YI=;qwrg{eY#yY-+24I#67XX*ht}*}s diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Isle_of_Man b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Isle_of_Man deleted file mode 100644 index fe63ff7e7f1e9b47c45c62a7768e3924f8572c40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3661 zcmWHE%1kq2zyRzF3=AL)lK2E=^UhXVyI}S;R)sm|4HnE@a(KbKIdd1xpDwjvLF+Ds zg=K#hEJ~fDu(@t*}frL1DT2F@+UcItnXZ|5&h!;qro2S49<8zx<%E z=6H_6+LMmR2}eFf z_;q0Og5NKg7yPMSz2NWh-381A#}rsJBNSKzRw%G>S}Cv_bSbdElu_Um$Wh=t@lS#4 zgP#KTCaDEH7Yr15C;nN$w?RmOzwq7yfth*>1OpE&5ULbdAZ)m3fk?!s1)|EYCx}@b zn;_17c7lY&iU|^r*H4iA(KSKp@Wcty50?wbtXU@@d$3bLu4jUP{K9Mjg`6S*#YSHN zC7%!hRP%J)W4cc(B$Hupm|kng4WBA6STMdn4oj=@&w%} zw4&%!D_Fwfc5Q&2{y~(C)n<`nqb%FIKh6l%mjxt_qtUAK4IU(%3!Gs7=H-U)jLK7mtY6wJa`!XT= zDwjaa0zrY;EpG(k>OTv_PdO)$5Pwx5vG&!3B>U|G$+2f9q{z<{NVQ!zA&q0}gml>n z6VhKypOEplXhPeRw2L!S{Va#f2jRmG5p&sM@ehp!(eI2{khhO{iTrcS2p| zk_q*F^%EEvNrX%cFbLAgM1pQ+R!qe#toR@sK1p)r7#R2j7(rzj0|N^KgNy) z4WdECCYZj)ssN%v#V3dc6`>#+RE&aXP*Dn^LB%PE1{J9w8dR);Xi(7#qCv$ghz1q0 zAR1K6f@n}t3!*{AEtr1&V*!W;6}w>iswmigQ1J`mgNk4f4Jw8~G^i*B(V*fOM1zWC z5DhApK{Tjn2GOA68AOAMXb=r5ra?5Qs0PuX;u=JQifj-KDz?G&`zv7gfQoMrA5?^c zXizZ@qCrJDhz1qsAR1JpgJ@8(4x&LtJBS7q?;sjf#Di#1F%P0aMLmcH755+-ROEx{ zTby8fK}A1^4=VmaG^h#y(V%JoM1!gV5DlshKs2aI0MVdo0YrnU1~C2GNB~5Gst6Db zswO}*sHy%20MVc-1Wf;&3XT_0RRZFJsuK_ms!~8S zs9FKhcaQu8`vX+HfcT&)21J9Z84wMsYCtrox&hIkDhEV^svQsws(L^)sQLlXpehJN zgQ_7g{hJ%?4p4Oj;)ALr5Dlu9Ks2ao0@0xA2}FacC=d;*ra&~PsshoV>Iy`Isw@x< zsA(+@6!{RyhlKzvZO2BLqzU6G^m;d(V(gpM1!hZ5Dltw zK{Tk^1<|0Y7es@qUoidE1Z+R38V2z}RWXPLRmUJ2R3(FGP_+!AK~*z|235}>8dODt zXizl`rk|^TC~$QRVt}e_5DlufK{Tl92GOAE8$^Sua4`M1UI0Xcs&X)WHxbMSRp}r; zs9FcnpsF22gQ|BB4XWZnG^m;f(V(gxM1!h(5DlvGK{Tk^2hpIaA4G$ye-I670)S{x zGXO+`ngU?@-7~QLpe6x`4{8>GXi(DtM1z_KAR5#}0MVdk0*D4R6+kqoxd5U;O$HDR zYBqpqP}2cKgPIQ@8q|aU(V%7ohz2z!!1Q+maJ+z;6d*pRSplL!O$!hWYF>b7P!j`0 zgPIv28r0MP(V*rAhz2z|Ks2b?0ir=o4-gG%et>9D69hzqnjs(>)D!{HpymjO1~o~* z^o!|W_kfxvAU>#h0-`}p6c7z+rhsTrQw2nWnkyh0)MNqCpk@n*1~pwkG^qIkqCrg< z5DjX^fM`%t21J9JGawq&qyf_(9)aTn)U*NdLCqTw4Qk?mXizf;M1z_-AR5%%0nwl) z4~Paedq6a(>BGcGDr9DaL6A;n67;jMVJc>2!w1>%Ns=q~|NsB3An)@DFtUJXP-8_# zfsqH?0%8G?2ysyJ#Rt^-L2d;hH-kXUAue~{5Cf;+5FKA*JySgceM22zLjw?t3jhUd BRLcMW diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Istanbul b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Istanbul deleted file mode 100644 index a7c16e76d1743ccdf5f8b7e6f8ef761e23456cb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2721 zcmWHE%1kq2zyO>K3=AL)l2{F8i%sbMI%77Ec*5+f`z|a>O@6Srx+!3ZUqixD`z;ri zsj5F%u3mp(m4-&bs)v6stp3^gV9jB}fD`ra5>EU-c;Tei*Mw8&8UjwAUYBs@>A`@D zg|8o6%H|BXyvQ=)iZfHdRUh65*EFjyT-Sd8;09;xg_}&%6K=k=zi{jQiiF#jVgl}5 zxsY&obN_{pUv?&ZO4)VcYX)1wH+hQ-3=4KWV9efpfvI8617`237g#cPCa{`p3Si5d zT)=L*qJjN)DFdhEvIU&CtsZcFV86g4a4v!8rb+WfKGVTci^N+KK~&(q|kH z_BCS=aj!Zcs(iOWOg-j+IP?An33j^!lATimB=1Z)Aam^U1=-o60dhS}4DvO_3<^0Z z42m(K3`#z349Yg<3@SPr45~7c3~D@F4C<_=4eDPd3N)T_7HD4iRiJg`b%FMlI|VvR z&KBrS*;k;~vc5pSWI=&J%ESW0*gYSNil%=sww?FEB&hO(scgdsGo$DaW`C1DSV&hC zSlo5_VEH?$z-q7B2kYB51vbl^3v74G71*_@7TC{bC~!z)FK}#;`QYUGvcNg{-v<}f z(*>^14?eigFnZv|dUArh@_hmKch3YonGXtho;xAn^?0#>_qtUAK4IU(%3!Gs7=H-U)jLK7mtY6wJa z`!XT=Dwjaa0zrY;EpG(k>OTv_PdO)$5Pwx5vG&!3B>U|G$+2f9q{z<{NVQ!zA&q0} zgml>n6VhKypOEplXhPeRw2L!S{Va#f2jRmG5p&sM@ehp!(eI2{khhO{iTr zcS2p|k_q*F^%IyF$$`u)Fv!Tn%0?_?V&|X)GB8MIfbyA^0V4|ogNy>wJH;lcFPeHTD9DC2`@Q052GpaK9yg9-r<4JrsgG^j8D(VzkW zOh5b!)(EWHWFT7D*9=5~3p5Y| zRH%VyP{9VGL4_NL1{H818dS)E={r*nfM`%*2ckg*9*71NdLSB9@PTMh;Rm8Y1t5q9 z6@nldR1kt_P+8}z6AR1Iaf@n}738Fy-C5Q$UmLM8bV1j5+ zp$Vcv1t*9G6`mj(RDgnLP$3GUK?Ny@1{J0t8dRWyXi%XFqCo{KnEspe0YrleSTKFp z1-mHum#be0vAMs3SAHlDtJLOsPF~RpaK{~g9>2~4JwF1G^j8J(VzkuM1u-t z5DhAr!SoCxaJm5%&>%jjkOtH5o(X_xP+<+G&z%7CL4`Jm4=T7pG^p?f(VzkxM1u-( z5DhBGK{Ti^2hpGc9Yli)br20I*g-U?a0k(#0v<$z3VAU7-CzQU1{L;T`nnL94=VIQ zd{Ds;qCtf}hz3;vAR1H&fM`%f0HQ&a0f+`w2p}3%DS&8D#Q>r~l>>+dRS+N=R7rqn zP(=ZvL6rrVelZ_hz3<2AR1JGfM`%90-`|`35W(&CLkJAp@3*mr2?Ws z6$^+4RW2YJRKb8~P$dJRK@|;%230m-`okk|_=74P5Fb?WfM`(V1EN6{5QqjWdx!@6%vRBRZ5J^OyocoRv2VrW@9H7GIMZJ0vQ;jH9+o`&R}2x*FhZMx`~&8 z!NP%25G2AN1|k{Z;#vkUwvTTJ1D^T`xq@O~WaM&n4be3M)nz)q#(JiD2KvT2zJ>;1 HmI)UCu)-`e diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Jersey b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Jersey deleted file mode 100644 index fe63ff7e7f1e9b47c45c62a7768e3924f8572c40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3661 zcmWHE%1kq2zyRzF3=AL)lK2E=^UhXVyI}S;R)sm|4HnE@a(KbKIdd1xpDwjvLF+Ds zg=K#hEJ~fDu(@t*}frL1DT2F@+UcItnXZ|5&h!;qro2S49<8zx<%E z=6H_6+LMmR2}eFf z_;q0Og5NKg7yPMSz2NWh-381A#}rsJBNSKzRw%G>S}Cv_bSbdElu_Um$Wh=t@lS#4 zgP#KTCaDEH7Yr15C;nN$w?RmOzwq7yfth*>1OpE&5ULbdAZ)m3fk?!s1)|EYCx}@b zn;_17c7lY&iU|^r*H4iA(KSKp@Wcty50?wbtXU@@d$3bLu4jUP{K9Mjg`6S*#YSHN zC7%!hRP%J)W4cc(B$Hupm|kng4WBA6STMdn4oj=@&w%} zw4&%!D_Fwfc5Q&2{y~(C)n<`nqb%FIKh6l%mjxt_qtUAK4IU(%3!Gs7=H-U)jLK7mtY6wJa`!XT= zDwjaa0zrY;EpG(k>OTv_PdO)$5Pwx5vG&!3B>U|G$+2f9q{z<{NVQ!zA&q0}gml>n z6VhKypOEplXhPeRw2L!S{Va#f2jRmG5p&sM@ehp!(eI2{khhO{iTrcS2p| zk_q*F^%EEvNrX%cFbLAgM1pQ+R!qe#toR@sK1p)r7#R2j7(rzj0|N^KgNy) z4WdECCYZj)ssN%v#V3dc6`>#+RE&aXP*Dn^LB%PE1{J9w8dR);Xi(7#qCv$ghz1q0 zAR1K6f@n}t3!*{AEtr1&V*!W;6}w>iswmigQ1J`mgNk4f4Jw8~G^i*B(V*fOM1zWC z5DhApK{Tjn2GOA68AOAMXb=r5ra?5Qs0PuX;u=JQifj-KDz?G&`zv7gfQoMrA5?^c zXizZ@qCrJDhz1qsAR1JpgJ@8(4x&LtJBS7q?;sjf#Di#1F%P0aMLmcH755+-ROEx{ zTby8fK}A1^4=VmaG^h#y(V%JoM1!gV5DlshKs2aI0MVdo0YrnU1~C2GNB~5Gst6Db zswO}*sHy%20MVc-1Wf;&3XT_0RRZFJsuK_ms!~8S zs9FKhcaQu8`vX+HfcT&)21J9Z84wMsYCtrox&hIkDhEV^svQsws(L^)sQLlXpehJN zgQ_7g{hJ%?4p4Oj;)ALr5Dlu9Ks2ao0@0xA2}FacC=d;*ra&~PsshoV>Iy`Isw@x< zsA(+@6!{RyhlKzvZO2BLqzU6G^m;d(V(gpM1!hZ5Dltw zK{Tk^1<|0Y7es@qUoidE1Z+R38V2z}RWXPLRmUJ2R3(FGP_+!AK~*z|235}>8dODt zXizl`rk|^TC~$QRVt}e_5DlufK{Tl92GOAE8$^Sua4`M1UI0Xcs&X)WHxbMSRp}r; zs9FcnpsF22gQ|BB4XWZnG^m;f(V(gxM1!h(5DlvGK{Tk^2hpIaA4G$ye-I670)S{x zGXO+`ngU?@-7~QLpe6x`4{8>GXi(DtM1z_KAR5#}0MVdk0*D4R6+kqoxd5U;O$HDR zYBqpqP}2cKgPIQ@8q|aU(V%7ohz2z!!1Q+maJ+z;6d*pRSplL!O$!hWYF>b7P!j`0 zgPIv28r0MP(V*rAhz2z|Ks2b?0ir=o4-gG%et>9D69hzqnjs(>)D!{HpymjO1~o~* z^o!|W_kfxvAU>#h0-`}p6c7z+rhsTrQw2nWnkyh0)MNqCpk@n*1~pwkG^qIkqCrg< z5DjX^fM`%t21J9JGawq&qyf_(9)aTn)U*NdLCqTw4Qk?mXizf;M1z_-AR5%%0nwl) z4~Paedq6a(>BGcGDr9DaL6A;n67;jMVJc>2!w1>%Ns=q~|NsB3An)@DFtUJXP-8_# zfsqH?0%8G?2ysyJ#Rt^-L2d;hH-kXUAue~{5Cf;+5FKA*JySgceM22zLjw?t3jhUd BRLcMW diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Kaliningrad b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Kaliningrad deleted file mode 100644 index 98ebee9aad004b739691cfc3aa49201a975c26b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2233 zcmWHE%1kq2zyN#<3=AL)l4ydmrDpSpC(OQj>%*Lz>n6-yvUS3|of9U^Z<#*f1ZUxd zGta#R&aM=naBh*a!1+lg0vDQ81upzzEVwweCE-%n+JH;9)gFkdFTWrramPWN<92}f zFa84(ulO!V-gb77Iy3o#^qvJDWY$dlAUmh&gIrJX2l<+m4+=S<9~5KUJ}CK^e^9p3 z_@JUA`9W2N>w_Bi?+@y%>ILdwB?>g2iZ^Ipxfh^yFd;nEfqeu#j$Ru(%t{VEH?v!D_E5 zgY|8%2AgGp4Ys>=8tmGP8|-KEH8`Y+HaNCuGdQ_^Z*WfGWpGiw+2HE@p23ZEcZ0j~ zMF#hGHyAvbH#2yi+r{AZcq)VUx;YF!XErwY_SG@?t(n~5pO?T8&{NtF7+%v5loQ?% zY#!GT;$ztmD(=t_rX$@D_FbtVLezpG;yO!1nH@`iNTriSzvoedd(QyMZ)WH)5p zb!*68;oFdNESVvs^bpdLd}8Ye@sp#VdP>uZKmflmx&`s@v5 zAFeP|@V#uPxUh|(^4;l%stq$3s?V)$sF}H?p>|z=LtW*xhWft31_nkZW*B5;VP$87 zKn_kM$i>aW%f(GA$iN_@zz9l~0t~FEY%K$jxQqfw+`@s8lYv3YfPoiA!bBJaLAn^k zK;kgAvukh&gR^T0gKw}4gKw}mgDXhD)is2Hfq@ZZC<7xSga%~_7{-x*_!$@&Kp3Q~ z8OoOX|NsC0{6*0oAR3gH!1UEyA3!uHPl0Gqz5>ypyal2``3ppY@)(E)M1%4&hz8|n z5Us}j`vZsu-hz6CVAR1JjGBGkSv%nx5 zD;ozp1afjAL2e#iK5iabK?Vk43y^bU6c||;82AJjI6(y@f~{o$V#_Fi#4Q{cAqA=+ zsQ6?MWMF`aFp7e7F-U>LVQe2?P^pT$XvI^uGH|)NhUglB%3&Q}V?9$n107#O0}!om G%mo1B^)7P& diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Kiev b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Kiev deleted file mode 100644 index 075cc02fd893fcac655ecf1b49207b399e7a405d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2057 zcmWHE%1kq2zyLf93=AL)k|>9=efXIB)6 zsxQAFCUM6>oa1(Y_%Hqg60i6!NZxjKkUBH@g7lsRA7s`{{2)80>4RKP@dx>uln)9y zp&t}u+&(Dzn14{V(fFXEBl$s9hURSKcIO9XTJMz2#hj&XSD*x>GhJ z=(S7^&@b6D!60Sr1jE>y0!Bq!1dMHW3z!5=6EKyXD_~|+Az=2mUcf?n$^?tMi2|0t z%O+Uubr!I`9WlXXS^Nas-BuIq+8ig?&z70skfuDrvBgrr$&Gb_bBeTpi|X?UuFii2 z+*nUea96%B;QsEJfG6`o0nc+M1iT(E7VuuTO2FsL{t3Q)Jpz7f7EbWb%M%FbX`T=m z-Zdd8Cv`%wdCr6oANL8N;(imtbTlV~eK(j8A?hX&ab0La+L|^3+h*=;g z5WD4#KwSN2f%qxs1QOz}3MAIPnvi6_T_8F3%!CyAnF6V{>n5aeY@LuUJ7Gfli|G?G z{uWKhJW)9z>u$(|>=n@ya*h=WuK$*Vigt8Bh1S*h|Vt6VanzOQ}) zBNHn#3o{cN1hR9$Arm7f7;UMG8TviWiAj6%3vTGl*vFeD5HVtdBp)B8kFHcG$_-7Xi&xj(V)x+qCpuD zM1wLRhz4au5Dm(VAR3e*K{O~+f@o021ks?(38Fz66hwnEDToGTR51OwUI0XcGAx+B zn+WEEGA@V@%Df;Nlz~AsC=-KdP(}vPpv(-SK^YoEgEBRU24!pz4a(dg8kE67G$@mU zXi!E6(V)x@qCpuROuu^uwjY%7L3~i=2hpGc07Qcd0T2x;2tYKbFaXh@0s%yW3Iz}i zDi}aCsBi$$paKF!g9-@{4Js%=G^nru(VzkYOn*0+0HQ$!2bjJt1m=SZ5D*_!h=6EN zK?0&dg$alT6(}GYRH%SxP{9JCL4^y51{E+M8dS)DXiz}|qCtfXhz1onAR1KYfM`&` z1Eyb02ip%SfIxguAq1j91rdk_6-FQ$R3L$9P@x2(K?M_t1{F>q8dN}mXiy;qqCo`} zhz1o_AR1I)foM>n1)@O(7nuI=2pk`v0u00l6=EP7RFHvaP+ zXi(t>q9FwwGaCyl3o|SGZPmWa`Vsv!b`Y0pb}0-0aU_i8GuSSJ^=-ebAq)h|I&6g<10y4st80j^5vV}a@io>n)icmH M*6}qo0JBWE0EtuUe*gdg diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Lisbon b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Lisbon deleted file mode 100644 index 168accf060c3837af1bd64361bd0dc157dec0ae9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3439 zcmWHE%1kq2zyRC~3=AL)lDG?HOHX<>U0}9%Zo%w-#~bF%d0Q~|WOKp1`l5pQtG0bu z5Fb*ou=`cPBFCEri}UgemMHUlSn9v%!z$MI1*^XFeOP;P`G7H3X}>q7j+bD31BJMZsb$2ga1Uqj{iFgcD`R#u;;|~4|{j4_^@w&e8K)1T^|n2 z`tadkMb3vq8L=M@NBDg>V$WJ|)WYDyF{^1Gjz_F1IDYef!AVB_f|DN=3Qj#r`fz${ z(1+7+7C$)C;QiptokbtcPBr;(_ON%txuQi6&K=!faK2RR!}&Go4=x0?Jh-rQVZp_a zA0ICEcs{sfl=k3KYjeTn$Ri)Fcy9f0)$*dkHO)f`*CjVA+~8cIaO3Axg_|$i6z=Sd zRJgmTWx>5gr3>y)N?Y)tDSW}hB98@+k}MZI4$@li#7TO=QzM=Q&lLYIcrLA}@Pb=P z;l*!mg_p1XD7?D$R^j!jdkSxMomY6f>VU$#SsNAJcP&!*P&HZMV^)j8r{whuJ_j#Y z@WpxJg0IF+3%)5AFZeE;vfu}E=z<@g-4^hy)?(nDEzQ8!&BMUoV%{K7qR}9jBH17m zA~8YO`FDee@vjM@%C9Gg3E!C@&U|))_~(5SBp&ZwAbEMg1gXOlCrIzvDIgV&}%t8LBC|r1cQ{d6AWW-3K$h_5iqvhEnpHfO~6!k zu7H_Qg@D=LdI1aRDHAO2CJI>oE}LMr*IB^&cEkjmW$_bicUw)cYjd1nKU-#kLz?mg z#}-QgCpXp!&MDFYE~?KbxH|t8aAQ3=!Cm>jfcv{=0-nqV1w7B45b%1uSipPTDgmD} z`zQGJ^$7T_SvbKzFHaz#r+GqPc-MrWoYV=y<~b8WeB395iu+9n)6tv|_T6AYgs7W9 z#C4$wkzX|gqPBgR5Pg+PAZCG}K&ci6G(`^Dv((FYC@9zc7f#BGZRwe zX9}d+uA7j?v2{Ya?1TyFFQ!k(_**m~^F-x@th*r-vR6b;$T?OhklSH9A#Yi*Kz@e& zgn~9xfx%p|3}`~Uy{e^8kRqCw>znErRX0Yrn!KM)Nn13@&X90bvzvJgar%0mzh zDic98s9Xfmpt2D}gUUw`4Jso+G^m^e(_i{NfM`&838Fz|CWr==n;;rgc7kY7`3a&y zWhjUSm7^dURF;BhPQgUVtsee*upK2Vtq;)BX%5DhAuK{Tj*2GegA zKLF97avDtESp@b!sJsU8L1i|G29?`j`sjYJxuEhJ#0Qn(AR1JTgXyIU!SbN;9K;8e z=^z?Zu7l~;X0SY{dIM)Esvkf!sEz>9pn3vCgX#(p4XQ7|^lxsk zy`Xvn#0S+KAR1JEfM`%10-{0n2#5yNB_JA9pMYpkodTjk^$Lgv)h!?zRKI{|P#puJ zLG=uX2Gunn8dTqaXi%L4ra!wa0OcZ{)mk75T>pR=pgIUdgX$p=4XTSkG^joT(V#jB zM1$%j5DluEKs2a+0@0v43PgkIDKPzc-vkg1s;@vasLle>pn3~LgX%624XVFDG^h>( z(V%(^M1$%w5Dlu&Ks2aM1JR&*4McN+s})dcJgP@M65k!OPMGy_D8$mRvegx5=Iub;K z>PZj{sw=_t-+BQM4XQK2^xZ@-A5?dO_@Md|M1$&35DltFK{Ti?1<|1T6hwpSR1giS zS3xwWZUxbx`V~Zj>R1pBs%JqosICRkp!ya>gX&x`{q7mqeo);D;)Cj65Dlt>K{Tiy z2GO9p7(|2WV-O9hlR-47UIx*ix*0@+>SquQs-r4FgX(J#4XU%j^mhYr ze1Ph15Fb>3gJ@744x&NzIEV(-!a z0ir=|2@nlxPk?Apn*v0G+7%!g)V2W8p!Nlb9&KY#zm35a?iykMYL)2t8ta+r8R#48 K_!=63SX=;oHVlCP diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Ljubljana b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Ljubljana deleted file mode 100644 index b817364265ba707fd66d4f8dc74266e129736e45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1917 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 BRLcMW diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Luxembourg b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Luxembourg deleted file mode 100644 index 6c194a5cdcb22da9319183df65478ec4e55555fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2960 zcmWHE%1kq2zyN#<3=AL)lGp)di?u9TyJxmsPr~f0w?52ywfw={B{K`=?VK=Se#`U; z^B){3Sdg&v!@|0!3l`}KeOO$TDX_$}@x#(M`w7cbO+PGGU&XLOi}Axs_E`ce-mR2}e zFu&+?lH>_|-BJSlEv^#;O3Wq*rl?O43Xzx~ z?CT;RV*G1@sPgLxV#0SOh%=v^ApUvZ1c}G%CrDmiFhT0@#0k=S_6o?XStlSnXTE@3 z&jbPannnSIoFW0mm}CJZpAZ3M8&?4p9Wwz{8Fc|Q9ti<;R_6)oUri=xJXM{bc~xwJ z)=~Be+FO21&{^_wg6@=C6ZBe6PtY&fGr=Hb?F7Tvn*v5fTLg@4cMF&VO%pJcohx8w zR3TvYw_d9IqPH^QmCj`76FBb4#w@Se0%>D_! zeLVtxYZgxM&&v}C=xLr17~VA@C?|D7uzAje5Fhsmq2hiM!gMqzgnc)d5FzR&5OG~- zLgZHsfv9a?CPZK55{OwKC=k2ljX+%eXMy-B=L8bsuL>mAzM7C^zg-|X_RNG7`I!Q# zw(BOOacrHCE<0gD`itokGX54#$UIRwA?t3)gzOd36LO9f3gmX!PRLspERdfeKcS$_ zRG=`>MxZE7T%g!cPN2l~r$DJ7gFu|isHBNHNVF)_0+voP`S4iscyU_AoL zs4@zSEDQ{M0t}oC49ILg0Y+YsJcAI7goyA7fJ9^zK(cTWYJ!h%2!pe0Fo+0Y2nR93 zT|+?H85tQE7#SHE89)q>00c8Kl2VfV|Ns9#s5Al5pb`a4U%mAKM1x8e5Dh9_Ks2a? z0nwmR224LVQUIbsr45J%l{g?8RO*0eP{{+LL8T9f29-b{8dM5_Xi!N6qCuq*hz6BN zVEUa2*j!M_1mc5AClC!Pp+GdKlmgM9k_tqFN-GczDzQK`sMG?{pppwjgGw(D4JyGv zG^i8<(V&tHM1x8*5DhBP!1Vve3qUleWCPKl(hWp|N;nV=D&;^lsH6kYpwbRRgGxLQ z4J!3OG^peQ(V)@~M1x8|5Dh8?K{Ti&1ks?<5JZDYL@<4e6Kp@IWCZa+r6Y(2m5?AB zR7!$qP)P}*L8T>#29=l~8dPe6Xi&)sqCur6C~bgBP%ynDc>;(Am82jVRGNZlP>Bkn zL8U5)29>NJ8dSQ1Xiy0YqCurBhz6CkAR1KKg6Yruz~+KVT@W8s@`7kk=?kJkB`}Bv zmBJtzR1$+|P-zUJK_xPX29?Sn8dNfaXi(`4qCq7zhz6C?AR1IsgJ@7`4WdCMHkkfu z0(J+epKs6AE52}SgG^i#5(V*H0M1yK15Dlu8Ks2ak0@0w_2}FZxC=d;*r9d>O zrUKER+6qL2YAg^9sz2BJYV z8;AzgZXg;|!+~f}EeE1OH64fs)pj5nRO5kYP^|}|K{X$U2GxEb8dL*<=?{;<@d2s{ zL3~hc2%UsQ!wI`QPz2i_%?34C3DKk&Ea zJP;_6DiBOjpCA+>F+teZML@*(*91}J*Av8q?@SP9K087D^S%iZkJnF-yu4t7)ZvK} zr1$IJ z6V$(&Owf3$IzjWQ*aWSk>=U%N{FtD#*VuH=G_zAYVttQyD zIZm*jEi=I(O?iT2i=}{*8|wt;6lnn$)#npjo&O5Bv7VgZu6$p>{oOMGPv(OHp65;o zcs*V$;Jt2@fX|uz6MXx61pL-4oZz3AClJunJRvZ=YeG;?>V#nPoCzU5?h``A{U(Iz zXif(L7S;SVW5pbQJT0wv7wwmiR({+Qb7iRGJVkrWgi|1RPcSDP;udi zK;^re6RI{W6R1A7dqU03LlbJ(&7DwJxnx3pU;P9IMy!yD0SuX$SXq!D8~Z>&1_nL> zMoC_CIWID{eG6@-057@R>oXV(x0Mn;e!V1j{x zfsqkMj^$)vU;tr|g-f7p>Hq)#|F1LKQ39etxfeu(axjPnO(gs9>N*oXkDs@0KsN@0Bpwb6KgGwL}4Jw5|G^iv3)1UWE0MVcl2}FZR zB@hiNnLsqCbOO6sB{MLK_xVZ29?qv8dOq)Xi#YlqCq7#hz6C~AR1J1 zgJ@9c4WdCMIEV(7;vgDSl7nbaX%3=6B|3-(mFgfGRI-C;Q0We)UrYzP2UN;~_@I&= zM1x9u5DhBvK{Tk;2hpICA4G#ne-I6-0YEgU768$pngB$DY6B1rsu4gms8#^cpqc?h zgK7sb{oxTfK0vhuh!3hMKs2bf0MVct14M&r4G;~gIY2b1_5jhK8U#dxY7r(z?2wre z3|W}jSdkz*$3VdU|Nr!W+{-7x$O584rM!#+BQK}|0g1>cFbaX#4C3I*1j_dD1=S;1 kD-^UEg@KWg%h@$V*AP_W==d7znd%wn_!=63XnkWY0A5l7l>h($ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Malta b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Malta deleted file mode 100644 index 5f518a1f1773e00b8b3ebe8a3a32c8ae69256b67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2603 zcmWHE%1kq2zyNFv3=AL)l2`#{bIvwj_F?wbTOZ~eJ^f+s);%BQb^a@uKksJ2f`p|X z7S`=9SQKMku-HeV;6#q;hcnN;1;i3wctx%A<(o#BKl zo|go!%6>1nraAq?wbu<3Zg5T$_-VZL!_S*X9{iTMRPcM}vIl?uY$^CVv*W?Prx!l_ zZ(5qbaCFlL#-#QHra4gs%ueM6EUjf9ShZUput^yguyd&taEOZ)aNIH};QTH!f$I=& z1NXIW6L=QBZ{Xc_V*+2}#RmRqyCw)EZf+1Pn=?VkacYCGYqWrf)+Po~<<}F$gzroc zXFfYY{PVsE5|7tUki5KLg4E%O6QuX-6_8o8PC$0fd;z(h2?FvpjRFceMFNU3$pT6~ zAp*)at^z7LW&)}*>H=y!5(4V1&J)zXnoQ7msyadQs@MdrqwEv3xBQr(v*hIj-6^*w z=(U`lpkK0Qfnvb>J7R*(viJ$MyR9bJwK-0(pDi=NAx(LLV~eGLlN;*<=M-rH7uDwzT%G?4 zxUrs`;I4dM!2R7b0Z-x(C zylX;GPU?hU^PCAGKJF7j#r-CP>1a*}`))8HLexzl;=0g;$gdg#QQN*uh`!1t5VJr~ zAa=_efw=n50`XJM2_(c{6-caoH6h7Z^*(;(a;mlAPQ7?fM`$w0-`~M2#5w1Bp@18n1EAR1IqfoM=+1)@O(7KjEFS|A!!aDix0;RT{W1sI416=EP7 zRFHvaP+Xi(t>roWni-2p1(KzvX^2ckiR9f$@Mcpw^7=z(ZZ z!3Uy2g&&9p6@VZbR0x7-P(cWyL4_fR1{H`P8dNBPXi&ijqCtftnEqQY0HQ&KB$&RN z2mE4JyPzG^ij4(V)T{M1u-+5DhBSK{Tjf2hpIy9Yli)cn}RLQ z!X8Y&m=1OisL%)TK?OgE1{MAw8dL#*Xiy~pqCph_hz3;#AR1I5fM`&q0HQ$^1BeDy z4j>v-L4asbB>|#A6$OX}RTg0S!y|BffGQ0TA5?LGXi((=qCpi1hz3<6AR1JWfM`%< z0-`|`3Wx?(Dol)MkQvHnW7+ m3%GItRWb~q8ivc+HAL4CRQc%m8ta+r8R+;L8h~hhV=e&p%<-ZC diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Mariehamn b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Mariehamn deleted file mode 100644 index 97229f3157ed0ede0c7abc0659c4c53ff88563d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1883 zcmWHE%1kq2zyPca3=AL)k|>3;d6yLDOPoFzm~du)>jhEe*Av8q?@SP9K087D^S%iZ zkJnF-yu4t7)ZvK}r1$IJ6V$(&Owf3$IzjWQ*aWSk>=U%N{FtD#* zVuH=G_zAYVttQyDIZm*jEi=I(O?iT2i=}{*8|wt;6lnn$)#npjo&O5Bv7VgZu6$p> z{oOMGPv(OHp65;ocs*V$;Jt2@fX|uz6MXx61pL-4oZz3AClJunJRvZ=YeG;?>V#nP zoCzU5?h``A{U(IzXif(L7S;SVW5pbQJT0wv7wwmiR({+Qb7iRGJVkr zWgi|1RPcSDP;udiK;^re6RI{W6R1A7dqU03LlbJ(&7DwJxnx3pU;P9oMkZz!dP4>V z@eEMP(lTIVVPKF^VBln6K(IZ0Ll|6LgF!?HNEIU^0|NsiBaW2H#=yV;!XTApP`2Rz z|Ns97?^2rqqCu$^M1xW;hz6xzkYZ2@2GO8Y45C3P8BBlPHvvS0QZ$GLrD_ljO4%S9 zl)6DQD20P)P$~z}pp*`xL8%=?gHk+*2Bmrs4NCbS8kG7$G$;pvXizQy(V(0FqCvR< zOn)^2y91OfKzvZn0MVe_0ir=U1Vn>!35W*e6c7!{Eg%|{V?Z=0*MMkH&H>S&+ykOP zIS539auJ9I=h{R0YEgU6adkn zk^n@5N&^rLDiJ_5s8j&apppSZgGvW5{bD-UJ)lwo#0QlWAR1I!fM`&O0ir>r28afg z93UE0dVpw92?C-)r3i=yl_VeBMfL8S_a29+!z8dSP~=?{;<@c}AjKzvY1 z1EN8t4TuJnI3OBS>VRla$pfN6r4NV(l|UdGR0=UNGcmKU(i_5xA@K|b7H|Q?0WOSq tk=Z`JAq?mR5(BtIVqj$Ca&-;SH3F4YI=;qwrg{eY#yY-+24I#67XX*ht}*}s diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Minsk b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Minsk deleted file mode 100644 index 6a45115571f2e2d4fec5ab364bc02d01e056930e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2067 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 QGu1QD@ijC6(fY<*0LqNP6#xJL diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Moscow b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Moscow deleted file mode 100644 index eb7619ccde4d93912c470ec81087570700eb6956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2194 zcmWHE%1kq2zyLf93=AL)l4yjo>zb!@&)NV3qHuKnfO6=PSXdup5hPkH7OqyazZ~S#<+b@@-hFQY@_i(MMv_3stnf$ zHSXUZ)LGRF)W1p;Xgn2f(5%?spn2tjgVvGF2HIQh6zD8DTcA5-Ux8lB`U3ru1qB8v z6AKJu_k1uan*PDqcHRe*pvn)XvJD^1jG{l7{Z0B{Aze{mao6R8~suYHK0 zvhhPg{EiQawdV?w>}P#Qj@?j@B46_%)pk-r8pq6nblH-E^cU3y8GpkHGEc-7WZktW z$X;PzkaH~LLvDv+LEbX65BV9)1qE#q9|{BIKNO|@`cQ1h_@Tu0&WBQg#~;e{eioE{ zIQpT2?{-1Oh2Hq)#|HHN&I0B+USqDUevJZ#`Wg#&A-LeBjgR&Bc24yD@ z4a!nr+Gd#phz4aXFl}qJ0Yrnc7?`$YJ^-RYSq(&kvKz=1pezTXLD>#OgR&l&{>6U) zL`%Hly8xm=*$_m7vLc8EWk(PV%90=&lr2FtC~JafQ1%4TpezcaLD>{UgR&}!24zNyC4nxXi(M$(V*-N zqCr_4M1!(9hz4bK5Dm)iAR3hAK{P1agJ@9J2hpJH528Uu0GR%p1a=pwC;;(6#Q}&0 z6$v03R4jmKP|*OQLB#`z1{Dz?8dOYxXi!lBqCv$4hz1oIAR1I`fM`(B0ir?02Z#n0 zAs`x5jDToRQ39slodmlFRHT6Tpkf6?gNhaq4JuwhG^mIH(V$`mM1zVN5DhABKs2bx z0nwmh2SkI49uN&Gen2#+2m;ZdVhBWoiXt%mT?8C2pdtyx2Ng>o8dNlaXi)J4qCrIz zhz1o?AR1IufoM>11)@Pk7KjEFTOb-#bb)A4@dctmMHq+%6=NV8RFr{eP;myLK}8yv zeo+l}52$DZ@j=BKhz1pLAR1K6foM=s2ckj69f$@Mc_128?15-d(FdYI#UF?U6@efc zR1AV>P*Dh?LB%161{H~5`omFhe1M8Z5Fb=Lf@n|?38F#8B!~tTl^_~aT!Ls&kqM$f z#U_Xb6`hRCOw24yENrZ7>};$YtZWd-$%O>Dc{tfvkp-yBW?)dZ0l7w5gMo#C!7u|< zYAQ#7*!C5SJm8X25L|+af=f_Qa7ihNDz0U~C<_ty0hOR23@SkJmZA*k#V7-pZ?Lzn Yv2U=8j<2zvsh)w3ub}~m);Hz?02KUR-T(jq diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Nicosia b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Nicosia deleted file mode 100644 index f7f10ab7665e94ca44fd8cd98a362cd4b304eff1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2002 zcmWHE%1kq2zyPca3=AL)lBkEWd6$;U?cjX7{sGtBNf)?(r99x-cPxN+iDd#`*TW0^ zEz$`BrT!NLlm8|N1wRN7_LY1fVtgn-RQX_nnDCMSapuJd;-A|BBp$aWNM6nekUE^6 zAibyMg3Oxc2eNb0F39zyK9H~RxS){Z{y;HC>w=Px<^yFLo(n2E+z(Wx-(67Se)~Y3 zl{-NFD_4TXleYnySKcIO9XTJMz2#hj&XSD*x>GhJ=(S7^&@Y*kV31N8U>LjZfsyaT z3&yq+9+>DBUoe#|dSGT$Az=2mUcf?n$^?tMi2|0t%O+Uubr!I`9WlXXS^Nas-BuIq z+8ig?&z70skfuDrvBgrr$&Gb_bBeTpi|X?UuFii2+*nUea96%B;QsEJfG6`o0nc+M z1iT(E7VuuTO2FsL{t3Q)Jpz7f7EbWb%M%FbX`T=m-Zdd8Cv`%wdCr6oANL8N;(imt zbTlV~eK(j8A?hX&ab0La+L|^3+h*=;g5WD4#KwSN2f%qxs1QOz}3MAIP znvi6_T_8F3%!CyAnF6V{>n5aeY@LuUJ7Gfli|G?G{uWKhJW)9z>u$(|>=n@ya*h=W zuK$*Vigt8Bh1S*h|Vt6VanzOQ})6C-JmnT4v5fkEB_loquN7+Dw? zWE2=UVI)Yz$2Ww*)ioGIgn(2rGBPkQFfx*ow*UYC{~wgTLE1rS97KcCIfw?Obr20o z?;skK=0P+l-GgXQ+6U2~^bevzc>qL%@&SkjS3ooC_jN{ zP@V$OpnL_QL3s;AgYp-c{>lZmAC%8Pd{ABk(V+YWqCt5MM1%4jhz8|75Dm(IAR3eh zK{O~If@n})1ks@U2%L3tQNgYq$m2IXZC4a(0T8kDC&G$>z#Xi(k;(V+YdqCt5aM1%4< zn11&RY(FT!gZQ94528W&9z=ukK8Ob8e-I5S13)yW901XvvH(Pb$^#G$Dic67s9XTi zpt1o(gUSaG4Jso*G^m^a)87pyfM`&80j94Df%%|v1H=cF9UvN1et>9D83Lj~hhz6B4AR1KOfaw?0!S;j79S|Q> z_JC+m`2(UsWe|u4l|vvJR2G3~P91*Shd0>=la+ye1IWfzDBm0utlREB|QP&o#oL1h_;29;+Z8dRo%=%HG!ak;vN a=o*0vJRM(SJySgcePbP8Ljy3&gbM%&q|NOB diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Oslo b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Oslo deleted file mode 100644 index 6326961453f404a4a886362ee8b684b56fd5b4f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2225 zcmWHE%1kq2zyNFv3=AL)lIVr9IcKXsW|)1YI^o22--I*Iy#>y$6rXTzk+Z=0NhSgp znp6cY7KsU5N@5pyyxYvk83vaA|_jx#=H-eO&}ZjDJlKRen7|O!&?OaptoV#6RzwAn|zp z1j)+_CP*EgI6->PUICdk>jY%y%omXBnIIrv(jQzW1mlPsX*6C$8&<0_z{VO4XHtH}h7r>YY)uZm63I?6sld&`drI!j(o(4BH?f?mt%3Hl{_CK#lw zonRPyQ^2Tbi-581ZUK{^X#%FQa|O(dDg?~_)(cojPnlqGH&MXyci9B1z0LyGw<9Ll zEQ_CDyW47lU7OD~~ z6Yyj{DByYSgn-xM#RA^zRtfl=*+0RzuSdXd&B6)(d3gc>J3ltm536!}06etyB5Gd0Zoly4S zkw69C_X!mjjtEq~yE&n1!!m*DbGs+h%se!qcHP_wb(Kpd)c4g-U|?imV#Wd)Sy<^0 z85m>~7#SEC_yibOVI)KZLW0DdU4ugyoLxg07#J8C89}NU7#VTo5_Sd#1`r12l0GP# z_y7O@|BK$K8V}Y7h;|*&rH}yFoN4hl6NPE(g(|oDQbH zntQh@2d^#ULoRAPYXyNO^vsN?|gL8S+X29+Qn8dQpaXi!N4qCuqz zhz6A?AR1JvfM`(30-`~s3y21lFd!OK%7AE4Nduxmr45J%l{jGf-7~QLpppl~2bDe` z8dL&-XizBxqCq7Qhz6BLAR1I6foM>v1foGD6NmD(OHpsI&vopb`&6gGxOR4J!G-^o!|W_kc=35Fb#29=l~8dPe6Xi&)srawFa#|Nkc z1@S?pD2N7?q#znpnu2Ihi3*}Yr7DO9m8>8dRJwv_PzlS#$i&FZf(0_Mve6$hFmQ>0 zTqdKy$O0~6IbkG31VZu&FmU?#g34KVVGA#985kM4oLxh74M8Qbj<2zvsh)w3ub}~m I);Hz?01}o~xBvhE diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Paris b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Paris deleted file mode 100644 index fd8ea7dbae9efe7782aa52c5babe4ece87fe773b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2945 zcmWHE%1kq2zyLf93=AL)lGqMqOHWJ)=$`Ff@nQCLoq{=gCKk*+;PGKz=f8sa3$#8g zNLcz|VFS;HMS4OX7FYRvSYq1vVQHLl!7^3T56jhOe^?QrRbKdlgSJY-nfwu(31y!=?hIg3U!81zQ4G3buOcf7qt~tYEv5 zPr(lU69qf|?=0B)epSJ)YY88A-#GSR&x!3H_U>5mVc-1tg8ehPJ{*|!;lsg-oDYXG zVm};?@cVGYp0(hpg~5koR?|Klk62T1{1)ee6FKS+&OG-PIJ;7O!nsAx0_P{02wd=g z_~1h4#}5~a!~`z+IZWW*ZOOp1TKWU;lH>_|-BJSlEv^#;O3Wq*rl?O43Xzx~?CT;R zV*G1@sPgLxV#0SOh%=v^ApUvZ1c}G%CrDmiFhT0@#0k=S_6o?XStlSnXTE@3&jbPa znnnSIoFW0mm}CJZpAZ3M8&?4p9Wwz{8Fc|Q9ti<;R_6)oUri=xJXM{bc~xwJ)=~Be z+FO21&{^_wg6@=C6ZBe6PtY&fGr=Hb?F7Tvn*v5fTLg@4cMF&VO%pJcohx8wR3TvY zw_d9IqPH^QmCj`76FBb4#w@Se0%>D_!eLVtx zYZgxM&&v}C=xLr17~VA@C?|D7uzAje5Fhsmq2hiM!gMqzgnc)d5FzR&5OG~-LgZHs zfv9a?CPZK55{OwKC=k2ljX+%eXMy-B=L8bsuL>mAzM7C^zg-|X_RNG7`I!Q#w(BOO zacrHCE<0gD`itokGX54#$UIRwA?t3)gzOd36LO9f3gmX!PRLspERdfeKcS$_RG=`> zMxZE7T%g!cPN2l~r$DJ7gFu|isH0~4CeTTFfcGOLNJ&CwuAvBfTQH# zWncgq4OX`U%9j8C|NsB&6JFgQ8dQpaXi!N4rmyQ1fM`&O0-`~s3Wx@kEFcBPgL8T6e29-P@8dUm#Xiy0RqCuq)n0{vhwii?yf%u>j z2}FZRB@hiNnLsqCbOO6(i233N>C6DDn&sws3Zl^pwbjXgGy8o z4JuVZG^k_+(V)^5M1x9LF#UPo1P~1>X+boov<1!mH^S9ngT?FY6~#^?itvAP^|&tgK7>C4XQmrG^hpv(V$uc zM1yJ)5DltLKs2aE0nwmZ1w?~t77z`pT|hLbh5^x_S_VXeY8ns?s%^mZcLQ*IfNC8O zA5`;zXi)6~qCqtfhz8X{AR1H?foM=|1foGT5{L%XN+23kGl6JO?F6DhH57;j)lwiD zR8xUyP;CXGK{XbL2Gv?%`o(mxdqA}ph!3j4Ks2Zp1JR(G3`B!!GY}1`(Lgk)Rs+$X znhivQYBvxKs^LI1sFnlKpqdUugK9ev4XW`#G^o}C(;psz;{#Otf%u>r5JZD&K@bh9 z2|+ZdHU!b28WBW;YDEwYsu@8vsCHyzWnv}`vT(4mv$1osaB^{Qaq|omgjJ7Bh72sA zN{^8PyR9k`>V4FY$BO{ly cYlyC)vukjOj<2zvsh)w3ub}~m);Hz?0P2*wM*si- diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Podgorica b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Podgorica deleted file mode 100644 index b817364265ba707fd66d4f8dc74266e129736e45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1917 zcmWHE%1kq2zyNFv3=AL)k|>9=IZrW}J~;E-Tj1s!~~mV@e^!!TTQTQbDUs5TV{eon(_q47E1vqH`WQxDbfNis?R65I{y`L zV?8;+UHQI%`@3fXp3DaYJkOmF@Or#hz)0iQGbC;0aD2>7j8IKe+JPavSDc|u@# z*My*))Cs}nITJ#B+$V&J`%MVb(VP(W-C#n5sGC5{rccQD zTQni_MCF96yCD;@S42<9IaVl;+hIE)Z&|QFeun&nf;Llu!ay5=qBL=VVnaEB64##s zrGg9sW%{BM%04_2sNnlPq2j_3fy#F`Csb`%CQyBD_k^06hbGjnn>(Sda><1HzWNEw zj7(t2z`{yT$iToS07_#JQbvK1g@FN?1c^JlhA=q028S>(FfxJ=1Bihm-Lf+VES)8IO0Hg4a5iKHxLcVb08X&??5yt z?}2Dg{sYmVJP4ve`4B{d@*;=^|(M1%4!hz8|f5Dm)1AR3g9K{O~YgJ@8G2GO8A4WdE$8bpKgHi!o0 zZx9X2;~*N8&p|XOuY>9D2H^Mr<#`Yvlehz6A@AR1JzfM`(J0-{0X3y21lF(4XL&VXo8Sp%X$lhz6BKAR1I2foM>f1foIZ5{L$sO^hr|%wWjK z%0^Gfz#wb^as!_L0}HsIf)q|1;35i6f@FPsK}8e@gNi9oA;riD(#gQc$mQ%BqH72$ VzjS%*Lz>n6-yvUS3|of9U^Z<#*f1ZUxd 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 Ps%N0%YiIzX^^Lgz^6CxM diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Samara b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Samara deleted file mode 100644 index 196bd1da8755095f546562be753edd10d3d1346e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2046 zcmWHE%1kq2zyN#<3=AL)k|=|+r4}-%&DpwyJ7AxW+5u7ZnFquq&KZbvoOKZY#kfJ@ z6~h6^+olFmXIc+P@0s*KW=-=0**PT-k*fwGO%0~H-+?F z9|ZJ7CIp5jBn0JH zCj^^2C4~6MCWMNsB!p@IPYC_$iAYB*d?JkXU;lA<4eyL2~S(gcSL_2dTC#327YN3F)$F3F$9#6EgmKBxIiO zPsqBfm5{x{Fd^rd+k@N=;e@EF3_jTL2>`n9UC(VIm-LEdvIA1_mty z5L-q8#C8i{6k%Y1kRTI$d_x$59eqO>yh9^{!6cX;90Ib4fq@YW7#JBLTo_489{B(N z|9?V0SpgaPiLHPtkgYpW92IUtJ4azeh z8kBE9G$`+YXi)wE(V#p8qCxoxM1%4Yhz8{+5Dm&xAR3gfK(re7?++jvl)u3ASBU}; z4a#RA8kE<-^p!&fAR3hCKr|@dfoM?P1JR)T2ckiF5JZFWA&3U$MGy_jk02V9CqXnQ zUxH{*-UQL0{0X8#c@#|l4S4{fL3tHS-!%jCL3tL$2jyE34a&P98kB!QG$;>)Xiz=| z(V)BxqCxo?M1%4)hz8|r5Dm)PAR3gvK{P0jgJ@7b2hpIs4yNDj2HOwH^B_Jb--BpS z-Urd3{12i*WdMi;CeR2G0}P_E(Yp)w7+~Axh@Y8tfho3i(Joqhhso?j{We@)R*;4R#X2*kn zPcMA<-?TJ=;pnChj7jYYOmm_Nn4QWCSX#?IuxhtHV9T3az|NiifWy`51IKI62V8pL z1ze{sKk)Eb7VxZ={=oa>!3VyszaRL|{w)wFktz^ed%r*^_)me*x#=H-eO&}ZjDJlK zRen7|O!&?OaptoV#6RzwAn|zp1j)+_CP*EgI6->PUICdk>jY%y%omXBnIIrv(j zQzW1mlPsX*6C$8&<0_z{VO4XHtH}h7r>YY)uZm63I?6sld&`dr zI!j(o(4BH?f?mt%3Hl{_CK#lwonRPyQ^2Tbi-581ZUK{^X#%FQa|O(dDg?~_)(coj zPnlqGH&MXyci9B1z0LyGw<9LlEQ_CDyW47lU7OD~~6Yyj{DByYSgn-xM#RA^zRtfl=*+0RzuSdXd&B6)( zd3gc>J z3ltm536!}06etyB5Gd0Zoly4Skw69C_X!mjjtEq~yE&n1!!m*DbGs+h%se!qcHP_w zb(Kpd)c4g-U|>XnOpHuW0VZa2h)~GP!b*S0z#yZ*$iTqBC&0jpi|yU|?VXVNkYR17!>T|NsBL?LN6PAi7{rGnfWtWe^{fok27xOM_@owg%Cl ztPP?;*&9TIvN(taWpfY>%IY8*l-)rzD9eLrP__rrpsWv~LD?TfgNgtU4Jrn}be>ZI zhz1o0AR1I8fM`&$0HQ%f1BeC{4bkheA1u9ZNG^khs(V(IQM1zVK5Dh9~Ks2bB0nwnM z21J938!-La^8ttk6+2-1v?bVFQ1JuegNh&!4Jw8}G^i*7(V*f8M1zVX5DhApKs2am z0@LTFgUtaIQ6N63m;%wDq6$QViYpKeDzd=z=Y11EG^pqT(V*fBM1zVj5DhBEKs2Z* z1JR)33`B#9G!P9c)<86Ks2bz0MVdo14M(W4iF8hK0q|63IWleY6MJwcm$3QP;~<0 zgQ^q|4XRc^G^lC;(V*%DM1!gr5DltkKs2bT0nwo9h7rA1VPR&03SrhLhzf|6jh+6G zfq{Dq$lcsq7+Am+4hOjM;l;)F@eN@J@&(mD&`JnY`9Ltp7)C}eXV(y2Lr@*1<7=#E Ps%N0%YiIzX^^Lgz^6CxM diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Sarajevo b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Sarajevo deleted file mode 100644 index b817364265ba707fd66d4f8dc74266e129736e45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1917 zcmWHE%1kq2zyNFv3=AL)k|>9=IZrW}J~;E-Tj1s!~~mV@e^!!TTQTQbDUs5TV{eon(_q47E1vqH`WQxDbfNis?R65I{y`L zV?8;+UHQI%`@3fXp3DaYJkOmF@Or#hz)0iQGbC;0aD2>7j8IKe+JPavSDc|u@# z*My*))Cs}nITJ#B+$V&J`%MVb(VP(W-C#n5sGC5{rccQD zTQni_MCF96yCD;@S42<9IaVl;+hIE)Z&|QFeun&nf;Llu!ay5=qBL=VVnaEB64##s zrGg9sW%{BM%04_2sNnlPq2j_3fy#F`Csb`%CQyBD_k^06hbGjnn>(Sda><1HzWNEw zj7(t2z`{yT$iToS07_#JQbvK1g@FN?1c^JlhA=q028S>(FfxJ=1Bihm-Lf+VES)8IO0Hg4a5iKHxLcVb08X&??5yt z?}2Dg{sYmVJP4ve`4B{d@*;=^|(M1%4!hz8|f5Dm)1AR3g9K{O~YgJ@8G2GO8A4WdE$8bpKgHi!o0 zZx9X2;~*N8&p|XOuY>9D2H^Mr<#`Yvlehz6A@AR1JzfM`(J0-{0X3y21lF(4XL&VXo8Sp%X$lhz6BKAR1I2foM>f1foIZ5{L$sO^hr|%wWjK z%0^Gfz#wb^as!_L0}HsIf)q|1;35i6f@FPsK}8e@gNi9oA;riD(#gQc$mQ%BqH72$ VzjSy$6rXTzk+Z=0NhSj4 z=UY4wRbPHVOyZ7%ILGY(@n8H0Bwq1dki6~eAa!Q)1?fEtKFF+@_(66~(+9bp;t%pQ zDIXMaLO&?RxP4IaG5?@!qwzsSNAiQJ4A%$MdBp*0y?P%sue?dnI&wZhd&{{5oh2Is zbf;`c&^>hQf?i9jgMLX%fI&*SgJJA~3x=_$8H|dSF&Le!yI^d)Tfih}nt-Y7Tmdtq z3IVgf^#T^sQzls4O%$;FT{gjLud{&l?T86B%i<^4?zWm>*XB6Eezwd6hcx90jxCk~ zPHwCdoKvI)TvVS=aCQDG;Kq7#g1hp40rz*$1U#7!3V5D7A>j3Rv4HowRRTU|_D}Hb z>k;rG#0!3-!0>y@M0wu0L1xf`O1j_V9CzO47Bv8TkeL}^BBLbE0ZceD$uuP!(-0lfA zGY?IuT{m|^UFDJq^?mgd7@1g^S(sUv*dUOd0}h!OIYAIC!NJbN#Z7Iv=?fl+{g0YX|hFp9!tVQfZ8kO+tb=?(S`VQ_T~Vek$1W^i^5 zVQ_X0260>%TtN&51_nk(Fa}W|`#_kH5l4pLWnf?cVUVI4C|l|O|NsBPwjJRB(V)x$ zqCpu1M1wL3hz4a85Dm&KAR3fmKr|@Rfa&=bVBdl=56Ey(1_IHbOa!KX@gD%upv(lK zK^Y1}gEAF}24yS|4a!^~8kE66G$@mSXi!E2(V)x*qCpuBM1wLNhz4am5Dm(FAR3eb z!SuZ101yqzh#(r289_8CLxN~frUcQTj0vJanG;MOI(7j>gEA?I24z$b4a%$_8kAun z^l1K{P0{gJ@8O2hpHR528UCA4G#PKZphu03aGv2!Lo%K>(sbg#m~L6$l_2R49Py zchA7~g9--_A5=hqXiy;mqCo`(hz1oFAR1I)fM`&m0ir<#2Z#n09v~W2fPiRFAp)X7 z1qp}-6(%4WRG@%pP@w{*zZ*;d(V)TwOkWoQ^Ff6Shz}}gKs2bZ0nwlW2SkGk9S{vF zctA9$@Bz`F0tiHd3Ly{;Du_Tds4xQ2paKa*g9;@O4Jw#GG^lU_(=Voj?FSW7AU>#| z0@0wt3PghnED#MUv_Led-~!R0!V5%$3NR22D#SoEs2~H;pu!A9g9_9ZAzyr~sLJvfP3O*1GD*Qk+r~m}fkV24|jfItk zm6;s^IXK~vnTZPo!4jMt%-lTGh71hyKS1t~e*h{4WfVZApq2rs6yy_NfRutF;IdGJ zfx*H7ROUfsVQfZOa9Jn|Qp3RE;~T<2usp<8ATlsAa=E&O=o*0vO&wojJySgcePbP8 KLjy3&gbM)RApCs* diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Skopje b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Skopje deleted file mode 100644 index b817364265ba707fd66d4f8dc74266e129736e45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1917 zcmWHE%1kq2zyNFv3=AL)k|>9=IZrW}J~;E-Tj1s!~~mV@e^!!TTQTQbDUs5TV{eon(_q47E1vqH`WQxDbfNis?R65I{y`L zV?8;+UHQI%`@3fXp3DaYJkOmF@Or#hz)0iQGbC;0aD2>7j8IKe+JPavSDc|u@# z*My*))Cs}nITJ#B+$V&J`%MVb(VP(W-C#n5sGC5{rccQD zTQni_MCF96yCD;@S42<9IaVl;+hIE)Z&|QFeun&nf;Llu!ay5=qBL=VVnaEB64##s zrGg9sW%{BM%04_2sNnlPq2j_3fy#F`Csb`%CQyBD_k^06hbGjnn>(Sda><1HzWNEw zj7(t2z`{yT$iToS07_#JQbvK1g@FN?1c^JlhA=q028S>(FfxJ=1Bihm-Lf+VES)8IO0Hg4a5iKHxLcVb08X&??5yt z?}2Dg{sYmVJP4ve`4B{d@*;=^|(M1%4!hz8|f5Dm)1AR3g9K{O~YgJ@8G2GO8A4WdE$8bpKgHi!o0 zZx9X2;~*N8&p|XOuY>9D2H^Mr<#`Yvlehz6A@AR1JzfM`(J0-{0X3y21lF(4XL&VXo8Sp%X$lhz6BKAR1I2foM>f1foIZ5{L$sO^hr|%wWjK z%0^Gfz#wb^as!_L0}HsIf)q|1;35i6f@FPsK}8e@gNi9oA;riD(#gQc$mQ%BqH72$ VzjSS|$hRmrP19NGT04j9vG@sHpmavF&aFlb~q= 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 HH|7EWJt?k* diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Tallinn b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Tallinn deleted file mode 100644 index 4ba4424121aeac25767ee83ef57ca579df2b4a96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2175 zcmWHE%1kq2zySOV3=AL)lBj{Q<>p1|o|(6E!i4!P(`L(o=N35&oS$SOaG~V%15x$m7sMp)IEZuH4iNvve?a0D-v!Cr&JI#%CSQ== zv*3fwnu#A|=QMqg>nZ*qUz74dAt&^MVvO4dB_Hz-$~GDwRCFXisLDt(sPS+ysI!_j zsDD*!(0D4|pm~*}LF>rR2JJ1c8g!Q2ZqS`_ra`Y|Z-aixx(0)k`3;7#rx}cjmN6LH zu4OO@>R>RH?PoA!+ZSMFR3TvYw_du7-EB3&uFY|R{cM>D4r$60 z99t{}oZMI^IHyPpxTrp#;OhKWz>W3f1b5~80`Bjg33xIe6!1KELcr_sVgc`Us|0+` z?4RJ<*CXJ!X5j??ygY$`p5_UG;awAga#AM*o99dj@o}FJD(*KSOh> zpDB=PyKX`n$JPnyvJ)nxznDHD<8RS~%oCLpvhIdV$X*dWA?H}3KyHWaguG?J0{I#8 z6AIc)1quUg1d7tc1&R&j1WH_g3X}>m2$boIPAL2ENT7o6`-F-MM+7S0-JDRhVVOYn zx!n_LW*(YQyKe4;y2>RJ>ig;^Ff%eSu&}Z*F)}f-vO^#TClqpVV?aJ0ULF=+9_l~_ z25}Qm;*(KeWMN?76JX$kkunMlybKIl1`L7>3=mlh2S!nt2#n1r36ce=gsBIKXc;g{ zhWLgsIJ*Xeh!6%>*ANEZU~dNBU>62gkRSsiBgk3?Mlb*~VFV*11CHDxz`(!&!XTBk zP`1+l|NsAoZ98)YM1yh;nBF;I0*D6XAP^18MIaiKlRz{mH-TtSjsnr3Tm_;*ISWLC zauVv)B)4q4JLqSQ0W7vuM2_s zpi&6L2bDx18dMsAXi$j+qCuq+hz6BRAR1IUfoM<(1)@Qv6o>|uR3I8uT7hU#i3OrT zr51<=m0TbiRCeDapvf#LURb#?H*d%*4h4ft*}W$jyTR`FZ(xS^0RW17XFa zxCsLbsK8_702hPAxH$qW|RfVf>grPgG96p7-fBYLl_7Y jn0QJ|kQA4zYlyB9sBG2oHP$oLGtf8I@ijC6vrM=E!8s96 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Tirane b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Tirane deleted file mode 100644 index 0b86017d243f1b7bbb41d6b4feefcb2b7edfc7d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2084 zcmWHE%1kq2zyPca3=AL)l4ympd8e&1$vBbQUU25Qx4_wz;uFs9csYSX!}0^id%FZK z)`|~Y7YZM6zw|HQ+2WDFdnx+^-xRF`{tbT$1WI@k1Si}p5DI>mAY5>uK*V}yf~d#N z0x{uD3F3xVKZyT1_dt?iN`d6<_ynml>pw{E*()HkW}SfSocRKBJre}vYZ?UIt)@l%wG#|uZweR{Z4ofG-7R1eG)=%%cCLV#QH6ln-+BQH=_wN| z?j{OY{w|wfwbxm|`gX(wn`QA6YwucIl*1|zJU9?X9Awg2L(LOoe=PPyjZ|{-6{c}Gy5m__Voz(tywt1KQB)p zpr?64V0hPrpq$hR!R9#=LVVmOgo^u32-DG=5cb_*LWHQBK*V*S36Wnl1fsTmnGk)I zOCV-}pg`=FHv)0>p9SKloD)chzbcSe`)Wdx{dR%m*fSGSJ0Wjbut0u>{DguwQ-Q)j8-b!Uae-n( zIe`+_p8})DNOTIRHe1ash}2!1JR(I2cki_4@84N&pZIDg{6^s3ZWK}Jp&zILjw@4Z_EV%;y&Xi diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Tiraspol b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Tiraspol deleted file mode 100644 index 983cc707167654f15ee699872672384a4637157a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2407 zcmWHE%1kq2zySOV3=AL)lIVf5mF8v7=h?pD630%v&j~x<&q>&Izc*p``MQKXCssb# zyJOaaeJi>j?4MEd;6O+2gM$@u4-RGcKR6uW@ZgAt;e(?VN)L`{2tPP3!Sdk5p2-QP z%4-A8JogqjyHb3@xkb(b=O>v6T=1KaAgaFnf|$e|2XT(u0ph>-4@kV?yC8Yn*+J^e z|6meqY44Dzx4tZ(o-f_+)Wg){9QJ|YOk|^_3elWHp}8C z*zUHPVAtk2!G5;P1cx-`363q60#0tM6P#0|1zc30PjGeqE8xa@a)P_^eF67(&jdV~ z4+?mmJ0alpc(H)@x>W)`XZBCI!A?&-sga}bLfr#ru6C%HA2t;lBG9mgZmq5${L4nvUZv^7%KMTZ9IVX@1 ze^nr{_SJ+W`|SeBv1cZv$j=l=wOuzMjbrPCblC|L(qBxUkny)@LgtCe30ZeTCSTm{B1s2OB#ZI~OMe za`V6;7Yh?J3o9J*@=+TyFi3p?C1!~V1{MYeEdxdl1_l`g23{Bm5#bYH5Cn-Zio!?> z2SzE7dImWd2@`>t;Ora1;N%;^;OZI-B0?CPT|qcFguyr1g~2!2n}LCWkr9F!7#TrK zkVBxDkr77@6kuRr0AY~2UMO4b|NsC0!?vCH0ir><5k!M>B!~v(N-+I?P6CJqAgP$>bTK_vx<29*{d8dPF{ zXi%vErsow0fM`(Z0ir=A2#5xiA|M)6l7Q(eZxTQ>s6+wLpi%`ygGv?<4JutgG^m6D z(V$WWM1x8i5DhAAKs2bt0nwmR2SkHP9uN&GeLys*1On54>%r*(R1$&spwb9LgGwY2 z4JwsDG^k_((V)@^M1x8w5DhA&Ks2bN0@0w-3PgiSED#MUwLmnewaK_wxW{%$YAU>#c1ks=p5=4Va zNe~SxDM2)-v;@(h5)(v&N=*(X9m1#h`=`0jZZ!U=Z~24PhXr5XV!B hGcYo8xw?kv8i6VS9baQTQ#}KHV;x^Z12D^k3jn1mntcEO diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Uzhgorod b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Uzhgorod deleted file mode 100644 index 7032ab9b34f97640d1ef631dc4cc790abeeed606..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2077 zcmWHE%1kq2zyLf93=AL)lBk5TrA}}bPB`=2Tj18#5ryUi2ve0An}Utg5+&y2dOiYFG%lM@IhwH#1FD_nm)+&6n~Jf zN%^3V6Z%0h#_fZWkNF2>8;uVtI+7n$Ww<`5&MOX3>(%?9{?%!L=9M=IT1UW3%I{~Cg90@P{8xt2?4Liiv_&btrGA#vwwnbUyp#_nuQbm z^YR1&dYUH$hIdT}%1NCNY@RbA#K(O?sJP#RFdfYaVc!iVM2NZxL|hk|5cyR@AZpu} z3DH-%1Y#Bl3dC-CBM?{rSs;GOIe~=us{)C&uO=kfZx=|8Ju@Liex^XG?YaqR99t)( z%TAb({$l!sjK4(_GEY=a$hsRcA$vvigq&lA0=XTw6Y`b?3*=|WPbg?J6(|g}5hzL% z7brHA6DV>0DNriNAW)_+I-%^tBY_IO?-MF691*B|cXLA3hGhcP=XOu1nR#eJ?Yg-W z>MEB^sPC(vz{teN#K_FR$^wCG>~P4+z`+TIT->yP3=Dh%pwuR#z{rBiws2tNWMI%T zVBm$35D^@SrqbQ67i8#B4FgUvghcNgCyD<0$do#GYhA_B-1Q-|@85qC>m;tg3 z%*T-hco`T#HiDH^LD_Qu|NsA=^=^X%hz4Z`5Dm%_AR3e{Kr|?8fM`(m0MVc<0;U(v zdjO(ASp{S&D7%1YP?iDFplk!CfAJpx(V*-DqCr^*M1!&shz4aP5Dm&sAR3gVKr|>@ zfoM?H0@0xC1)@P&3`B#n8HfgDH4qKTZXgI<7C<}sUP&Ne7 zpsWa@LD>;RgR&%u24zbS4a%Az8k9XjG$@OLXizo<(V(mfqCwdeM1!&{hz4a_F#We4 zoDx9U7sLl;VGs?<#vmG$l|eKpJA-IYmIl$FYz?A8SsO%yvNwnZWpNM<%H|*%l+{5r zD7%AbP?iVLpllDKL0KO}gR(!Ee)kOQ9#Am=;)99;5Dh90Ks2aG0MVdg0Yrm}1`rJ@ z9zZmxhyc-`Vgf{iiV6@7DlR}YsK@}(pkf0=gNhCi4Jtms^ml^^AR1JRfa&W(U_Pig z0r5da3Wx?3DGLo2*d{!Ngx_jEP-fH(FCGF#S@4I6;U7>R7`T6IRJ?&` zP!R{BLB$-11{HN68dBUbGchxy9(8<;^-T2)^o@0V4Gq976D|Ox3-@XO diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Vaduz b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Vaduz deleted file mode 100644 index c4e20dbe0e8c683863e7132be9438f95335d017e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1799 zcmWHE%1kq2zyQn)3=AL)k|=_*IYpIUPY@HnGeMmB>;&=8`zA;{UOz$d@`4FchbK;u z-m_OgX3aVQ**WtC4&%!D_Fwfc5Q&2{y~(C)n<`nqb%F zIKh6l%mjxt_qtUAK4 zIU(%3!Gs7=H-U)jLK7mtY6wJa`!XT=Dwjaa0zrY;EpG(k>OTv_PdO)$5Pwx5vG&!3 zB>U|G$+2f9q{z<{NVQ!zA&q0}gml>n6VhKypOEplXhPeRw2L!S{Va#f2jR zmG5p&sM@ehp!(eI2{khhO{iTrcS2p|k_q*F^%EGG=nWYd_yj;nNk)N@1;TcA4PkJ0 z4Gv*oU}R)qWWzfoM>+0@0wX1)@RO3q*sm7>EXCGcf(` z8Q49b>;~e4vK)v8WjhcJ%6cFgl>I<7C<}sUP&Ne7psWa@LD>;RgR&%u24zbS4a%Az z8k9XjG$@OLXizo<)87ri@d3)NAU-I|f@n~-1<|0a3!*{U7es@yFo*_aV-O9>${-q) zok27xOM_@owg%CltPP?;*&9TIvN(taWpfY>%IY8*l-g?W-hiy< z695$xG75|w;L?S~#}`z(fH0_p0TnR}jEr2)t|7XHph8E-*I3U~&p^l5&;Ug18*>2w D4l#~s diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Vatican b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Vatican deleted file mode 100644 index 28ddffe0d93ee1ad7d1f3f67492f7f3b85406e6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2652 zcmWHE%1kq2zyNFv3=AL)l2`?0bIvwj_F?wbTOZ~eJ^f+s);%BQb^a@uKksJ2f`p|X z7S`=9SQKMku-HeV;6#q;hcnN;1_E(Yp)w7+~Axh@Y8tfho3i(Joqhhso?j{We@)R*;4R#X2*kn zPcMA<-?TJ=;pnChj7jYYOmm_Nn4QWCSX#?IuxhtHV9T3az|NiifWy`51IKI62V8pL z1ze{sKk)Eb7VxZ={=oa>!3VyszaRL|{w)wFktz^ed%r*^_)me*x#=H-eO&}ZjDJlK zRen7|O!&?OaptoV#6RzwAn|zp1j)+_CP*EgI6->PUICdk>jY%y%omXBnIIrv(j zQzW1mlPsX*6C$8&<0_z{VO4XHtH}h7r>YY)uZm63I?6sld&`dr zI!j(o(4BH?f?mt%3Hl{_CK#lwonRPyQ^2Tbi-581ZUK{^X#%FQa|O(dDg?~_)(coj zPnlqGH&MXyci9B1z0LyGw<9LlEQ_CDyW47lU7OD~~6Yyj{DByYSgn-xM#RA^zRtfl=*+0RzuSdXd&B6)( zd3gc>J z3ltm536!}06etyB5Gd0Zoly4Skw69C_X!mjjtEq~yE&n1!!m*DbGs+h%se!qcHP_w zb(Kpd)c4g-U|>XnOpHuW0VZa2h)~GP!b*S0z#yZ*$iTqBC&0jpi|yU|?VXVNkYR17!>T|NsBL?LN6PAi7{rGnfWtWe^{fok27xOM_@owg%Cl ztPP?;*&9TIvN(taWpfY>%IY8*l-)rzD9eLrP__rrpsWv~LD?TfgNgtU4Jrn}be>ZI zhz1o0AR1I8fM`&$0HQ%f1BeC{4bkheA1u9ZNG^khs(V(IQM1zVK5Dh9~Ks2bB0nwnM z21J938!-La^8ttk6+2-1v?bVFQ1JuegNh&!4Jw8}G^i*7(V*f8M1zVX5DhApKs2am z0@LTFgUtaIQ6N63m;%wDq6$QViYpKeDzd=z=Y11EG^pqT(V*fBM1zVj5DhBEKs2Z* z1JR)33`B#9G!P9c)<86Ks2bz0MVdo14M(W4iF8hK0q|63IWleY6MJwcm$3QP;~<0 zgQ^q|4XRc^G^lC;(V*%DM1!gr5DltkKs2bT0nwo9h7rA1VPR&03SrhLhzf|6jh+6G zfq{Dq$lcsq7+Am+4hOjM;l;)F@eN@J@&(mD&`JnY`9Ltp7)C}eXV(y2Lr@*1<7=#E Ps%N0%YiIzX^^Lgz^6CxM diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Vienna b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Vienna deleted file mode 100644 index 8025ba520a85f2cd2fb72b54533f225ce20fd6a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2211 zcmWHE%1kq2zyNFv3=AL)lIVf5IcM{TC(OQj>%*Lz>n6-yvUS3|of9U^Z<#(};ivrt ziwdL!7P~}GIKf#s;mmVyfwL>cC!Aa4EO363iNJ*>Re_5|VgeWIT?H=PHu-QlS$e`1 z&r1SVEe{J^)7&C(T}Mjb2In*ZVPEwRBE}aIM3rAp5EH&LL7e&Q1o6-NCP+M9KSA>H zf(cTGCr*&wvsXZ7%{l?uIr9bNdL{_S*E9+!u|7tQp|6meqY44Dzx4tZ(o-f_+)Wg){9QJ|YOk|^_3elWHp}8C z*zUHPVAtk2!G5;P1cx-`363q60#0tM6P#0|1zc30PjGeqE8xa@a)P_^eF67(&jdV~ z4+?mmJ0alpc(H)@x>W)`XZBCI!A?&-sga}bLfr#ru6C%HA2t;lBG9mgZmq5${L4nvUZv^7%KMTZ9IVX@1 ze^nr{_SJ+W`|SeBv1cZv$j=l=wOuzMjbrPCblC|L(qBxUkny)@LgtCe30ZeTCSLfoM=>0@0uh1)@Qj z3Pgi47KjFAE)WgMU?3Wl$v`wHqk-vqR{;Q04>CpbQA2L75Ol zgEAt>Q=rTUqCpuFM1wLVhz4a$5Dm(lVEXgE2_PDjNkKFyqk?EqW(Cop3=5(`nHEHY zGA@V)WnK^s%D^BRl!-w!C?kVtP-X_vpbQP7L75svgEBUV24!v#4a(qP`l|`p9iWU3 z;)60fhz4bN5Dm)oAR3hMK{P1ygJ@6z0HQ&K0Eh+^1Rxqz7=UO{fdHaGg#w5M6$~I6 zR5*ZWPyqp^|JDnDXiz}`rtc<#`Je&=#0M1`AR1I~fM`(R0ir<#2#5w1A|M)6kbr1V zVFIE-1qz4;6)GSaRIq?(P~ifiK?Mwm1{E?O8dT7L>37e-_Jax>5Fb?NfM`&`1EN8N z4~Pa8Kp+}a2!Uu&K?I^fg%OAb6-Xc&R49RHP{9PEL4^~D1{F{s8dOMuXiz}~roS72 z;{#M+f%u?83q*qoE)WeWyg)Rl00YsWLJUNM3NjE4D$GDMs6YeJph68qg9V{s54} zWE2=#z~w6^xO~OJ_VEQ3ukbP!UdS>qGIBY)hUglC3Sb>yV?9$n107#O0}!om%mn}g Ccvd<9 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Vilnius b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Vilnius deleted file mode 100644 index b6545b24949cad3554f41ca3c31dfc5237e1b562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2173 zcmWHE%1kq2zyN{_3=AL)lBk5TmFD=%2P|y$nz87k!H30Z6$vNSoG&;PsdeGZb8msO zE5#?ATjVToev*m61q0g$qUy^ph)LXW5a+lZApVR0fW#}l3zD~;9i+}oz97A4!3UW& z6Fik#0jrHUNcjfy6?(d!ncrqUp@H}@y!0Yj10q=FI1boiypWxfqBjC4Y;ROG@ zJb{3o<_Uq}T@!+GQYQqP=S&Fkai0(>?l&P!M{`2hcY_HLqHY2a*M%lTe$^0&+V*8a z^i?i_m<56Yv0L5<#MOTmh@Wy!AR+#$Kw|By2}$mIKqj_z!?+P}T#{pzH^tL0J$)gR&ur24zJM4a$xn8k8kLG$>nw zXi(M!(V*-JqCr^{M1!&^hz4a<5Dm(%AX<(4_XiLS%C=zot3&~a24!Cm4a&kG8kCJe zG$<>BXi#X1foI35{L#BO&}UnJb`FX5e1?_#T1AJ6;&V_R9t~*P>}_qLB$rBelZ>F z9#HWG;)9AX5DhBEKs2Z*1JR)33`B#9G!P9c)<86!F1ks>k5JZEDLJ$oq4nZ`iNCeTKVi81xibfC( zEgo5zSvlC)+1Ob*A&`q33G(nFLl!=MJ^>a%0ct=72Jt;0R|szam5*W>pz@JV08-L{ z%112&1`%*6$pb0@86{w(g#)Negvi3!jEW#xkS-YokV;f@7!`edLl}rGDRCE--~yD( c)ip%d2vo4@_!{e(>KW)8>-ZWPfLSJ701SBv)&Kwi diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Volgograd b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Volgograd deleted file mode 100644 index 658075893bec079471eec1225a282dc37a1d641d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1982 zcmWHE%1kq2zyRC~3=AL)k|>3;B^Q2myR-U6Tfo*O+yNgp_&A8F&paR|an3-TGHaS2$j&KwAlH-nK)xpIfkKY^1H~AN2TDGg50q`B z9;oPWKTwt7`k==B`-3{GdV%^^i2}_lZxXbQY&Ou|a;HFN$=L$kDf;;Z3G9R2=Uluqg|NG#gdb+^X`N0P_*0lxh%7;F< zzdQNClX=Mp&vUCkcs*|W;JvQ*gU^}81-^axANRgD5rsFP;LX!pd1IHLAee@gK{2-2IW2w4a$LF`fn20 z9iW^D;)8M{hz8|I5Dm(eAR3f2K{P0Lf@n|<1<{~f3Zg+d6-0w_D~JZ=SP%`$wICXl zb3rsH_kw6p4hGSnTnwT?IT=j9I|+6VC`W_%pj-{2K{*>lgK{^B2IX)N4a(&p8kEyP zG$^-&Xi$y^(V$!pqCq(yM1yiahz6AaAR1H(fM`%j0H(i-fa3vFB7pdyQUOGRN(K-O zDjh&HsDuE~pi%-vgGvez4Js`_G^oS?(V$WTM1x8W5Dh9lKs2ZX0nwmR1Vn>M5)ch4 zO+YlLL;=$;s=@97l`J4WsB{6*pb`c|gGw0?4Jv6sG^n%z(V!9sM1x8l5DhAMKs2cI z0nwlm2t6}5(!LyI0}vrP{{=1gGwh54Jx5PG^msU(V&tFM1x8z r5DhA^Ks2b-0?{L<6c7hR;*v7`|9pGkmSJYWOB4%fPGk zw}5v^Xaiq24+DRTd4oWSMuT9AWP?x$SA(#x8H0%Nn+8$kyA5K(=NiPB_cw@t-q0ZN zcwvL&4&%!D_Fw zfc5Q&2{y~(C)n<`nqb%FIKh6l%mjxt_qtUAK4IU(%3!Gs7=H-U)jLK7mtY6wJa`!XT=Dwjaa0zrY;EpG(k z>OTv_PdO)$5Pwx5vG&!3B>U|G$+2f9q{z<{NVQ!zA&q0}gml>n6VhKypOEplXhPeRw2L!S{Va#f2jRmG5p&sM@ehp!(eI2{khhO{iTrcS2p|k_q*F^%IyFnV4Ca z*;(0`7+IKEm>D5_5EBD~6k-T6voLXR(jGD}2yX!8DH#Pu76t}B0R~P624uFD0V6L+ zgh2>F!c>O)hA=q027`zY23HWn)infU7$YMiBLgENhzY`sj5sniHv3j z|Ns9#Y}L4^pIepw*^qCtfTnEtq>0Yrle6%Y+7SU@zWZ~@c1HiPX46*3?` zsGtGSpuz@3g9;oF4Jvd%G^pSK(V)TyM1u+-5DhAXKs2Zz0tGgxFapy{LK{Fds89mY zpn?fRg9;}Q4Jx2OG^mgQ(ZarFAPQVqff%3y3q*qoEf5VVxWM%14PbLY1sI4AD#SoE zs2~H;(tFl}C~$!WVt@)Y5DhBWKs2au1JR%Y4n%_rIWT?e+6NE~D(pZssK5i!ph6Es zg9<(n4J!OVG^hXs(_c*{fM`%b2%;M4Jzb8G^n5l z(V)T}M1u-^5DhByK{Tk~2hpIyA4G#H01yqT1VA*XA^_2#$^b-zDg-e7VmjD8po#&+ z2UQLr8dO1mXiy~qqCph}hz3;_AR1I*fM`&q0ir<_2Z#n$9v~W2fq-aGB?6*B6$yw2 zRVE-BRH10@Ig!r3{r?8$im9Z$whkzt9gVsFtC8?7Df(m{R6IT5Ns_2 zMnRA)gBXH@$@=()FyO3%7|<#q21Z6MXV(y2Lr{&S<7=#Es%N0%YiIzX^^LgzKd~3H diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Zagreb b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Europe/Zagreb deleted file mode 100644 index b817364265ba707fd66d4f8dc74266e129736e45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1917 zcmWHE%1kq2zyNFv3=AL)k|>9=IZrW}J~;E-Tj1s!~~mV@e^!!TTQTQbDUs5TV{eon(_q47E1vqH`WQxDbfNis?R65I{y`L zV?8;+UHQI%`@3fXp3DaYJkOmF@Or#hz)0iQGbC;0aD2>7j8IKe+JPavSDc|u@# z*My*))Cs}nITJ#B+$V&J`%MVb(VP(W-C#n5sGC5{rccQD zTQni_MCF96yCD;@S42<9IaVl;+hIE)Z&|QFeun&nf;Llu!ay5=qBL=VVnaEB64##s zrGg9sW%{BM%04_2sNnlPq2j_3fy#F`Csb`%CQyBD_k^06hbGjnn>(Sda><1HzWNEw zj7(t2z`{yT$iToS07_#JQbvK1g@FN?1c^JlhA=q028S>(FfxJ=1Bihm-Lf+VES)8IO0Hg4a5iKHxLcVb08X&??5yt z?}2Dg{sYmVJP4ve`4B{d@*;=^|(M1%4!hz8|f5Dm)1AR3g9K{O~YgJ@8G2GO8A4WdE$8bpKgHi!o0 zZx9X2;~*N8&p|XOuY>9D2H^Mr<#`Yvlehz6A@AR1JzfM`(J0-{0X3y21lF(4XL&VXo8Sp%X$lhz6BKAR1I2foM>f1foIZ5{L$sO^hr|%wWjK z%0^Gfz#wb^as!_L0}HsIf)q|1;35i6f@FPsK}8e@gNi9oA;riD(#gQc$mQ%BqH72$ VzjSMa}}}_FgLx zRbPHVOyZ7%ILGY(@n8H0Bwq1dki6~eAa!Q)1?fEtKFF+@_(66~(+9bp;t%pQDIXMa zLO&?RxP4IaG5?@!qwzsSNAiQJ4A%!W?%yBOS=9^Fze*HnJb4?SdF4%l){*l8+FQ;g z=q%Y7pgUzlf?mty0R56Z6AV(;PB4tUDPUBzMZnm0w}45|GyzlDxdLWJ6#`~|>jf;N zr%bT8nu7-EB3&uFY|R{cM>D4r$6099t{}oZMI^IHyPp zxTrp#;OhKWz>W3f1b5~80`Bjg33xIe6!1KELcr_sVgc`Us|0+`?4RJ<*CXJ!X5j?? zygY$`p5_UG;awAga#AM*o99dj@o}FJD(*KSOh>pDB=PyKX`n$JPny zvJ)nxznDHD<8RS~%oCLpvhIdV$X*dWA?H}3KyHWaguG?J0{I#86AIc)1quUg1d7tc z1&R&j1WH_g3X}>m2$boIPAL2ENT7o6`-F-MM+7S0-JDRhVVOYnx!n_LW*(YQyKe4; zy2>RJ>ig;^Ffy?+voJHUK_EK^669orKrU`tKn4bd3!u~{qrkwzz@TNoz`?-4Cjd%> zG75|W3=9y`!hul~CJSRTN`gc{BuKAwXb6L=YY2mHus4IVYY2n0YcPo8!r%&GFfcGM zGJ-LP0@(+`jEp$40WSjs0|0kT@Kr|@(fM`$_0@0vs1foG%2}Fak6Nm<7 zDG&|HRv;RbwLml|dx2`qV? z1o1)H5JZErB8UcMM-UClk{}wCEkQIWYl3J{_5{(OEDEAQ*%U;BvMPuMWmgal%CaCD zlx;yYDC>ghzx4tj8kB{>^xZ@-AC#3rd{A}<(V#31qCwdjM1!(6hz4bE5Dm)WAR3g- zK{P0JdUXJGq5MFEHpDh@z2s7L_Opke_; zgNgfoM<>2ckj69Eb)Lbs!p4+<|CFk;lx&!pg$T4uKq;NRW#O0=ao;0T~z+et=w| zZ~;{2$tZxzJS_uIna3x<04eiCz$Kpu1A~PFsDy*a!q|+m;F3=kq=tdR$2Ww5VCjdg i_+wyXH=y!5(4V1&J)zXnoQ7msyadQs@MdrqwEv3xBQr(v*hIj z-6^*w=(U`lpkK0Qfnvb>J7R*(viJ$MyR9bJwK-0(pDi=NAx(LLV~eGLlN;*<=M-rH7uDwz zT%G?4xUrs`;I4dM!2R7b0Z-x(CylX;GPU?hU^PCAGKJF7j#r-CP>1a*}`))8HLexzl;=0g;$gdg#QQN*uh`!1t z5VJr~Aa=_efw=n50`XJM2_(c{6-caoH6h7Z^*(;(aO8wz`y{)pu}1Q zWefiQ|Np=AHNFNAU3i7914M%oFqkfCN&wNIgbb!1GK2Y`1P$VY5;e#$P{Ib$pu`QL zK?xj8f8I9%M1vAKhz2Eg5DiN3AR3hDK{P1ggJ@9V2hpGm0HQ&e07Qc_0*D4>1`rL( z5Fi?qDL^zRV}NK-<^a*43<9D-nFLIKH37Q=lvzN0P=*1~piBdzK^X@`gE9|@24x@+ z4a!6y8kCVhG$=EHXi$a%(V$EPqCpu8M1wLHhz4aa5Dm&?VES*p0Eh-!MP=N!YL4^*O{_qGKAE3eq#0M2XAR1H%foM=c1foHO5r_sANFW+iD1m5D!33f~ zg%cyRSYlzNH)LSo06Btz?FXnzlu=;h02fuf;Gzo3_VEp2aPkF}R`4PVRA7PhF*0&F byN2i*f=V+TUt>K}Jp&zILjw@4Z_EV%6c)+% diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/GMT b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/GMT deleted file mode 100644 index 2ee14295f108ab15ee013cd912e7688407fa3cde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 pcmWHE%1kq2zyOR43=AL)lK`<cq4$4mL{6)$gS?|Ah;cg5=+ygT09_h0dL`uiR4PUL93 zFTc3s!wNr*kKvnleCjaJ`0Q}O;!B2*##e<+7T?^zXna?#v-lyJsPU6E!Q$svXN_M^ zoh*Lei(m2QT-=Vo`y5yNTj#Lj|2*Xt41G#F80%P9Fy*oAV2*vhg2ngQ4pw&-4K{OT z3wE_<8XRIzEjZauXmEZzZo&0zl?L~h5dNg>qbzAT)%hM2?ZD}EtpR+=^TG~Ry z-){vIBNZS6LpBR2r0XUyvM?|dG%#@b_=Yfecn5=s5ReQ50|O~B_5c6>|Df0c(V!Ru z(V$oZ(V&VB0w}KRe)$v z$^g-z)B&PFDFj4=QVEC#r4$eiN-ZE7lwv?MDAj;yP|5+(pwt7RK`97CgHjQQ2Bjnr z4N6TQ8kC~I^jBvM5DiLMAo};c_!S`f&$&3Td;jip1oOcu4I}|dZJ@a8Q`!NdK&cKy zgHj%d2Bkg_4N8F^8k7n_G$+zzZv338aEq@%;nvM^h1*ZX7u?wysc`q4iNd`_ zr3>z_6H|E56u#hL?+=AXNtO#9=iX9y;v~J`sqY?zXNrFpJU6?s;03po!b`DT3tqnZ zqwwn6oCU8>-BWmTt!}~FRR~U3KVuV6w7IGl#|NpOZKmp3Y zz{v9d|HlsuoFE=Dn}IjTH-y16I2c5PFu41MfK@Ouf+z+C9FfJ&z`y{)AVrQ)w&?%= z|NpaIQ~Cpu@gN!$`5+pU06;V-5rAk=LIBaA!~mi}2?9ie z5(S6`B@8hAb1K+=Pyzw*L5T!JgAxje1|=2{4N5Q|8kA^2G$`SKXi(w-(VzqbqCtrW zM1v9%hz2Dl5DiLDAR3gYKr|>}foM?T0@0uZ2Bu&A0lNp3&_H}pVgu2j1P7u)i4H`A z5*~;KB|Z=hN`N35ln6mIC?SGqP+|nppacn`L5UJXgAyi)1|?1q4N9P3`m-B2{6Ps7 z#0Mo-5DiMOAR3ft8JU@&kcE{T$oBvL>lOwEaN1=7r7%VgaN6ZXXEO-;_=YfGOTP?^ OumsG&f@W8Gw{pI52WB wFo4)Tz99^*jvyQy!oa}5$OuwIiar1T|NjrN3q*tL1Jh*K$>r)8qHD|r01tpGdjJ3c diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Chagos b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Chagos deleted file mode 100644 index 864d3e29a2b0c9d4d3f35b8d71fb2f3038354f94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187 zcmWHE%1kq2zyQn)3=AL)l3;?eIXdgU&oOv*cLO661B3Gukd#{h0}BH~NCE?kk8cQr hr+)}Ykb!}L6jT5I|NkFkGDs_NrgM4vhv=Gd0RS1k90&ja diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Christmas b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Christmas deleted file mode 100644 index 686d5b3c65423d0297f5ff7def3647d0e75515c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 zcmWHE%1kq2zyOR43=AL)lK`<<7#NZY7#N%*LKqkraOh)VU|;}YkUo$e5S!!w|NsAs h#a2FHWMD{^0m&p4FtGUehCq#CVBm6&2+=j?0suYU58(g+ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Cocos b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Cocos deleted file mode 100644 index 6f7d869f0fb3e54ba9d5b4a0042740fa38a90139..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143 zcmWHE%1kq2zyOR43=AL)lK`<<7#N~67#N(LLl_tsaOh)VU|;}YkUo$e5S!!w|NsAM kLe-WqGB8Bl0m(#XFtGUehCq#CVBm6g4$(EUGB)4>0Ap(qTmS$7 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Comoro b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Comoro deleted file mode 100644 index 297c6db63c0689a0ad0d71c9110baee20c9bbb05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWHE%1kq2zyM4P3=AL)l3;|gIVOI-_<@muL1O|)RLg*Y#m6^ P|Ho?>m#brlt}zz?WK|Un diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Kerguelen b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Kerguelen deleted file mode 100644 index 1f42bbc1ffcba50b2fcb07f959ac5ff30e4dc0c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWHE%1kq2zyM4P3=AL)l3;|gIc_B;HGnuEK?b(~29~O-DuxiZ5HOzK4Gj;_Dm2;2RbK;xgbch?#+b z0fa$nKn8-?Jpcdy{~xw(z66K{8_EPT)#U{P3j>2&00V~)$ZQaXn$N(%DMpp^j<)iPjU@$n5|aCHm;aT!Q4=>Px! P|M42e`z*HaS@ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Reunion b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Indian/Reunion deleted file mode 100644 index 9b3830ec31a1f7b12d0b3f8e8e7a521f3a7ceef5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWHE%1kq2zyM4P3=AL)l3;|gIVPU5Y+z(yFaZfNSU51S`1pn}1i6NQ`J@>1|NsC0 Ocn#wUat+Zn;Q|1Pei9b| diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Iran b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Iran deleted file mode 100644 index 916694077383aa4c81b6c9e2c3209e1596db2d55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1622 zcmWHE%1kq2zyNFv3=AL)l1PEFg=Xc{p15>d=mg*HMIQVmx()(;4h8~mtsDeH(@zMw zdhHN4e{(`aS9FJlLfHw8+jDnlo}P0;YoF2%?KKxXbmoUy==L$6&}-=2p`UN=VUW1j z!Z0A~gpt#S9mYoQPnf8d?l2Wm_Ap~xX<_y??1cIAJ3B0{b$M8x6tJ+`$?svkda8xZ zETfu*qZQ-Bs;zU4n-i|=;+!H~zpLYc7Ec6JGSGNe|y>cRqA!_)Xi(||(V!Fx zqCu$?M1xW)hz6xr5DiMPAR3fvK{P1kf@o0c1<{}s45C4)7(|0oGMN4vb^=6$QZ$GL zrD_ljO4%S9l)6DQD20P)P$~z}pp*`xL8%=?gHk+*2Bmrs4NCbS8kG7$G$;pvXizQy z(V(0FqCvRur8pj-u_K{*RVgK`&$2IVji4a#L88kEyO zG$^-$Xi$y=(V$!hqCq(iM1yi4hz8|AF#X#dY(FR`g7~1^2%Mk2Up(NP1Io=H rJ}5_nXi%;O(V(0SqCvSEM1yiThz8|y5Dm)dAR3h0LG;kc@myR0n}Ue? diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Israel b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Israel deleted file mode 100644 index f64f3afde5f00bff3ba085220ab71312b9784322..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2197 zcmWHE%1kq2zyK@^3=AL)lIVl71?L&KcASXZ^x(|Xg8^sP{9`zG?8}Ao{b>&_tgO6n zu_fWbrLL0&ms2-1T*-cL;d+!v!u9*|2X5$ZEx0M?_TZMlix0P6Z+>uliwVP>oeB@` zKImn*x8+>J{U!Sw9(0#6JPfO4c(l(e;jx*?g(q{qGdvX&yYQ^!@`LAsml|HE|7Upd z!v6wCP4@$izZ))aetVU`waoZ}%)TEFWII1zkUR4~K|Wz-fI`#81VzuS7nEXs6O`q- zFQ`NrB&agj2dHtseV}&j*#-62=O1VsU=Gl{@+LuRrThi$-Kh_BIvFqM&USyG7r!z< zzgqKwfydDch91)%7}?|n7#nU*Fp>Iq!BlW+g6YR)0p=_m4d&+=3oO3HH(1{J`M~PJ z+XCx#(Frz-7Zlho*py(`+*Dv+Gyj1@u~~s*z>)+fpMC~s5B~xeok9jzxo;obc!C++ z-Xwo;e`Ctv@%(Fn=NWMZuYGeqc(4A+;M2qT!FQ@?gJ1jX0{@cl4FPdZ9|A*eHUw#} z{}61lyCFo~u^?1rZbRtb7azj@?qUf4Syd2mcMe13vF8O*d+QjY=k|SwnVY~6J5!+` zuGWbmKL7ZKgjf}ZL|c;&Np21e$ri^7Qq+_hQu%W~q_MFyq%$7*kpA>pL&lAqg3O~Q z8nV_4f5=|Csv&39(t_N+;|zHfLIwGGD;Wy>c77=I>t-nO@-8UW%Vj7L-%(J?=g(03 zF8)K=_w0u9mmdo%uKPArZjURd+OFSFz3Kgjn(2ZKwVl%o>dHPh)Q7VaFfqa*GlDr# zECvRJAE0EdWx&Y7z#yZ*z`?*^;lRk_|8D-aFJT44IV`~eUR%3>fIl+8diD64_#*P9=JXi$~|(V%PxqCr^?M1!&)hz4ar z5Dm(PAR3evK{O~kf@n~d1ks>u38Fz+6GVfuCx`}RQ4kHvreOMo{{>K>fU+x?{<{Ip z2W49jACz@LG${LmXiydg(V%P$qCr_1M1!(3hz4b85Dm)KAR3glK{P0PgJ@6|2hpHx z4yLa?1KS76?jSxW%Y$f8wg=ImtPi3=*&jrMiU1G|Dh5C_s3-u@pyB{TgNg(Y4JsBu zG^l6*(V*f1M1zV55Dh9O!1Tvu0U#PwT!88Gj0GSXRBV7~P|*RRLB$7%1{EP78dQvc zXi!lCqCv$8hz1oYAR1JxfM`(B0-{013y204F(4XL%z$W6Q3Iku#SNH#ll%chgNhvx z4Jvv-G^qFi(V!v-M1zVU5DhAdKs2a00@0u%2}Fa6B@hiNnm{zDcmmNu+UvpQgNi8- zA5>IEWHV;~w-l!0haaR#D6MH+|(6>A_G zRJ4I;Q1J$$K}8&h1{HH48dTJQXi#wnqCrI-hz1pVAR1Kkf$68u8bCCt2n5lfVh}`w zib4<#Dh@$3s7M6Spkfh3gNjBF4JsZ%G^mIK(V$`yM1zV-5Dh9WK{Tky1ks>k6HLF0 z2Zsl!_yqAmMJR{{6{8>;RFr~fP;m;PK}9Nv1{JFy8dS7`Xi)JAqCrJ0BQp~mvLKiP n#bRJk diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Jamaica b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Jamaica deleted file mode 100644 index 09e3eb93996d4498012f7fd8dfebfad416ebf102..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 481 zcmWHE%1kq2zyQn)3=AL)k`RTmc_#C3W#CXaSimW;B!P47ln-1V+7h@Qv=;E(T=anV zKzae+&Xx!KE1N$E%uIVA*qQo4sM6zsaHjhQkw~ovqMn)`#4LFph--3xkWkW0kmPv# zL5hhxfsqLd{QrLk0|UeV|2sD@u>Ajj`~V||w{Hl8Yj6mIt4j#TNem1OI2_Kxz`y{) zAXQ>ew!r`Y|Nm#UD>r~>kS9QrAdi4(kY~X3+9@AEG{{pR8ssq$4e}g_26+%fgFFeM zK^_IsAkTtmkcUAu$kQMi0S+4;AKwrL%F!y;$O2|_ID3UKc)5fycm;=mBp4VNa9GaDz`y{)AXVH@ zw!r`Y|No~RT2cU_OU^w8(;x?d_#j7t={I5xAR6R25Dju5hz2z_zjY_=cd{$iTqm>k*=BXv75o5&I`> diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Libya b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Libya deleted file mode 100644 index 943f9a36b1200450ac52d022b40f3a3594323958..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 599 zcmWHE%1kq2zyK@^3=AL)l8}Y61s8rgsB(ArMuB_EYZD$;ToQQrJoUj-efxr^E6+T5 z?RV^h*d(U}agOf=;=i;XNW9YeAbC4JLF&x<57K*|B*<*3`XD=B{DItL?gIIycL@pw zUImJYbq|z+&KD@VFh5W+Vfvt|YM!9xu>FIP-^T=F7qbEr)2s(fj9|zNCLwGH$;`ya z%)r1C19G8^0wW6p1D^l`Cj*0w0t2s)ZwQ04YcPliVQ_T~0jU9FQhfXW|Ns9WAA@L+ zuR%1(=O7y7docYx^#O6tNP^f_EU)m2qG$?dHG$@2XG$@on zG$^D%G$^z{G$_PCG$_R-G$>?2 TG$?dIH1$K6%hfeR*N6)M7a5*1 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/MET b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/MET deleted file mode 100644 index fee19095848c64b2797e04bc839607f09a73ee2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2074 zcmWHE%1kq2zyK@^3=AL)l4ygnIcM{TC(OQj>%*Lz>n6-yvUS3|of9U^Z<#*f1ZUxd zGta#R&aM=naBh*a!1+lg0vDQ81$dVvPvGm865wxfogh$RHbF2&eS%Pk!~|hq7XcCD zUlT-?Ur!JdzB56b`RoMo&-*4wJYGLR^74WSQimr_klwRbKxWN40ogh81>|}r2*}qo z3Mk|h2`I)S3n=-72q@dQ3aIFq38>1b3#jo(2&l6IBWJViUBEvQN<7 z@?(O|l9v;7r`(#L*K&G-e#xE*1}SSN7{=ZdFe=(2U~Icvz$9pzfT`?U0W+ft0kgmL z0v6I!CRp4}6tMhVHoFH0247EtUdKZmbiW zQ=|o4RG&|9b^a^h#(HvsyYhVj_jk_(Jedy)c%C~U;PrU1fcLsp0zPNp~MEziJ3X zZTm7I`YM+|%mP7y*e!1a;_5#O#7{XVkPv@WAhGtx6XK2@}#^OrMbPw`fAPN>?jOrZMQ?g=$B4^60D zH+Mo^<&p{Yef1L<7@3#{9x^b;R%cSpr0ZvIU3+WepGw${rvZltn=K z3zSVjG$^ZpXi#TfoM>60@I)OO#soL zYz3l0SqnsivKNR3Wib#9%4Q%Ml+{2qD7%4ZP?iJHplk=CL0Jz(gR&op24z7I4a$Zf z8k7}5G$=cQXi$~}(_c-%?f_*?5FeC1K{P0ff@n}S1<|0a3Zg;T6-0xwEQkhWTM!M( zx*!^qeL*xR3xjA-HU`n4tPG+-*%?HGvNV|fTQ2~jL0KD2-%SMbL0KHc2W4{*4a({u z8kF5ZG$_l1Xi&BX(V(mkqCwdoM1zU|5Dh8@Ks2Z*0MVf007Qd|1P~1>7C6sE7gaLB$M+1{F0R8dThXXi$*@qCv$Dhz1osAR1Ks zfM`$=1foI35Qqj9MIahf9D!(1kp!Ya#S(}H6-^)-R6K!bP!R>DUrYzP2UJvn_@Lqn zM1zVf5DhA}Ks2c60@0x23q*s8Fc1wY#y~WvCKW+x8XACTePb>Fl*0Z` diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/MST b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/MST deleted file mode 100644 index da3e926d23e76bc4ded05861c01c1f494b9c8d27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 tcmWHE%1kq2zyOR43=AL)lK`<<{{Nplfq}s{ID~uy6v;&HW6#2bw4F?Oe#fzjA?qz|3X_!OkWD zp~_SS;mi~Pkw|w2QBOAkF-uJbaZL>Y2_@GCNlq>SDJJy>sZVMXq#toM$Xw!>Abaq2 zgWSef6XX}3ZBQta6;Nzk-=GxwUqCtQ41EYl7|WxeRvwZzkB!u4iz_KR3a# zWp;y;|Aq<9DYXqQ`jaNOy2LlQem*MTu3N+4etEfoCvO~s=jKiUueS~i-gA~t@VOS# z;9Ju^!Ec*ggMUosgn(%Z4S_b^6N1W^8iHkXCxnDPX$bklKOxNYSVP!T9f1hB#|#li z`2-^W9c74G@93 zAq>9ZAq>6&A)w5`$iTqBNJ=L9|NsAgP(}jLpv(lKK^Y1}gEAF}24yS|4a!_#I#GfF zM1wLJhz4ae5Dm&~AR3h6Kr}ehff%5S2XfsEX#o%g%77pmlnFsJC?kSsP-X3hL3~hV1<{}k3!*`p7DR(GE{FzYUJwn+z#tlw zi9s|dBZFvAW(LtBk?tT0oT)(!F-uJl1AU-J5 zgJ@932hpI+528T@0Eh+^0w5Yx5P)bL2Z#n0ARro4h=6ENK?0&dg$alT6(}GYRH%Sx zP{9JCL4^y51{E+M8dS)DXiz}|rl0eG;{#OSfcT(72SkGk9uN&Gd_Xj)00PmVLI^~I z3L+2KG^l_A)1Qxm?E@85AU>$D0@0uX3ruhB1j~a8 zE)XA7c!6k80S2N$g&2qi6=Wb9RG5KiP=N-bL4_KK1{G`|8dSJ}XixzMrvLDR!yi=8 zf%u@p4n%_rJTQHf4{SfE-~;hNg&&9p6@VZbR0x7-P(cWyL4_fR1{H`P8dNBPXi&ij zqCtfthz1pqAR1Iif@n}d38vqcf!zZtFhP7!p$Vcv1t*wZYXz1E6`&wKs1OCwpn?=c zg9=j+4JuGUG^kJo(V&7AM1u-f5Dh9|K{Tk41<{~_7EJ&94K^QC;DY#|LKj4X3SKb1 zZ$DTbQ~-ncph6f#g9>604JwR5G^juZ(V#*ZL=T&Snaejg#N5{#_s}ek3CR$H}R$b_k;Bdcy68*;5{&L0pHH`0{ko2DG1D*C?ME5 zK|!dpSU@(}yCJUq=iBFKZB(^~I z;Lizi8-Fa2UwC_hLYcOLV&mQkN@2VT%2~GrR7~G1sCw-YP!qkVpsqDfK>gp_1)5w9 z0-E>EFVK3GB%r--;{u(_brW>wO8NEwG>6E8viS zXMtnO$_Y;X`xZE-bWd>6U$DT{C3k`wf71eY75@qDKjtfVvKUVAywRxO^+b4r_l{%* zpR)!6zB61E{MHHy_*bYa1oV6n2uyTd5R`LGAlOlLL5R-|flx*E1z|d~1i~3!E{G7_ zHX-7{=>?HrXH1AXuy#T8)v5_GD^DrJZjG4`*SSU^eyZJsgv>sL#JXsKB+mkc2iz$>7N1?Wc+#jRR}%J*IZRlDL9 zs?X~P)GV%EP`jQ_psqP~L4Dr`0Y)Z9CT1oURwm{_1poh^s1JR(22ckil4@}S8RRE$vnGi&SG9riuWkwJU%8(!$lqo?p zC}V(V#*PM1u-G5DhB)Ks2ZT1ks>E5JZCtLNNW{G&p`h1tN$KDilF9s9*%qpu!PE zg9=Cx4Jsr-G^n5i(V)T-M1u-U5Dh9cK{Tk~1ks?v6GVdwP!J6&L_svDAO+K(0>Jiz z3RDmuRH%YzP{9hKL4_-b1{JU%8dS)FXiz~5qCtf%hz1q7AR1KYf@n~|3!*`VFNg*e zz#tk_2!m))K@6sU%?8H@s6YnsL4`7i1{KU88dNxgXixzSqCtf;hz1qZAR1IygXm#j eU~>fohgbx-gy{I1=o#u6==d5M=$YynZ~*|kq@0BS diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Mexico/BajaSur b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Mexico/BajaSur deleted file mode 100644 index 6486aa1a64e8b5a22ff66067c4b86c80831fa74e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1534 zcmWHE%1kq2zyPca3=AL)l8A+}MV4-RQLz3~-h*vvVF}xvFD2~YF-zF-x9!8}SA_{T zCT{t_z);X&nBF2_R4mqD?4BlI67-|NRNX_s%;;8wIlGpCh4gm@i|0H7mcMT@SbY_m zV7=`kgUtr63AVfEGT8OMnP5M=p1~pi+yuv#*$qzq8zwlX)Hb;2PnzKB65rs)Uoyd6 z#j(Nt$3y{77Uc%d8^r=%PgongcZ3S~oK<4*onbEEx0Z#$zd}+VpywGwV4~@Spqvv7 z!H(h+LVQ*+gev@;5T?_^5YBLWLWJmwhKL7yCq#bjYKS^8e?s)toQ9Z{djw*)`ZdIL z&J&2AYS567*&vWu=gW}fnIw=Lr_Ye0=^~J7C&-W{lrSM(_A^8JC#MM+f3GrRUQ(Hm zb$2^M_9nIoIma$H5rSw?LIlyE#0a862@*tu5+#TR zB}@1|?h&4NAOV`o~1D{h&k);)4=0 zhz2EQ5DiMuAR3gYK{O~~gJ@9V2GO7d4x&Mc97KZ>I*0}(b`T9p@E{tL=s`3n;e%*U z;s?>73;?1*nE*^b*gFA4gE9k%24x5k4ayWC8k8|WG$?a`Xix?L(V$EMqCpu2M1wL5 zhz4aC5Dm&SAR3f$Kr|@xfM`$#0@0vM1g1YZf$axnCJ-N#p+Gb!Q-Nqu#sblx%mt!B z84N^&G8u>lWi${C%4{GSl;J=$DAR#xP{sq%pv(uNK^YK4gEAqQ{?!YP4^U;E*^?(X|w*MG0Ues;kJhx`K#jxD_f zPX3D;oKx}(T=ZKSTwMYS-1yTP+*OPV+{f?@xXuX-@l%xw5;BVz66@?fBzcA~B*!UyNYON7NVQ}7 zkR}w=kS_b=L;5F^hK#?*K4e}JYsk90;zRbv9}PLjjuzxjyw#AmY1Tc@`&G|S!SDT{;#ML<<$K)^RlA%Ss?YO(s97A} zP`mEqhq`9RhWftC9~hZHkeP{@iG>M7QXl{SznF)C;s5`+6BtH^WA6b7O}sSHg2 zZTkSCL8%QygHjxb2BkVM{pxN2hz6xTFugqt%m<}H5FeBhK~4mvMi323ksunBDnT?T zWrAo>>IBiC6bhn2sT4$mQYx5!_76mXQ!I!9O0^&wlyX5dDD{G9Pznaopi~T^K`9wT zgHkhy2Bl~a4NBD@8kDj@G$?h0Xiy3V(V$cgqCqJgO#f&GQQ#C0Vt`UThz6y65DiNG zAR3edK(y}+O%Mgn2_Ob2H-KnRjsVf1Tmhm%IRiw4atDY8uo957sw;Xi&}p(V*M|qCq(bM1yh>hz8{(5Dm&rAR3gTKr|>uxA zpj-)}K{*pdgK{T`2IWu?4a%h;8kAE(G$^-%Xi$y?)4%FL6gcOC7@*t>qCq(rM1yiM xhz8|k5Dm)BAR3gTK{O~=gXqDZv$>puL(H6ALUeph^bGY3bbJjB^i1^(xB&az;@AKH diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Mideast/Riyadh87 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Mideast/Riyadh87 deleted file mode 100644 index 2edb566e5404a1c5bbb9ac31cc1684fa6ef8700e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8669 zcmWHE%1kq2zyKc^7#Kj9fq{WB0Lo^O|D|sr|GVLw{GUtd^8Zv=<^Pw?Q(!o5qrfC_ zRe?DxPl06*y8;{U0tNPXO9hS%mlU{|(iFIZ|10n;ovgt7U0s3SW4D69EPn;T*N+v1 zZOauz`q>mjAIwq^H_}v)Xx^b9dDUG(TJ4&GOhtl%?8)~E^3s(G3c1V*iu-yMlm)~U zR1)VXsBTtMP-j`Kpb=)Ept*djg4Rzf1>HIJ3Z|`A3Kkls3YL`{6s%5bE7-^^Q?Sib zRIuAWUBN+6NWn3wL&0hDKLr=o5(U?=R|;+`5)|BjUQ_V&_EGSfvsc0Uow0(i{SpPg ziJ}VrkGd5CjsGYFwdN`WU%RIes^PB?R=Hat{Irfjq|97}s60M}=>1g+u>!9Z;*!D@ z;y0gANMtopND5o3ki0@rA?0V2LYmh*h4eX53K?%tD`eT5D`ZbttdR3aL?O?(K_S28 zqe8*8ScM|>lM2O^RthDjmMN6Uh%1!mHY-%@`=U@Kkg8Cfcu}Edvy(y{%Vvf8FnNWB z=?Q(8Om7haVRx95wl+aICFG;rI4?9>DK5_Ode2$h>__AiP!q8D0gSEqJo~JqGEl&qS8fHMHQuLMb+YuifTub6g9+dC~9VS zDr)WArKrQLt*9F_M^SGbucH3{Iz_{P_lib~5)_R;pHVb*wN*5mwo=jjg_NSDWt*Z^ z*C$2mJ8_D(y5|+`>a7*+FDzGdR1#KnDy~;_KJr@8RV+x+Eq$M&`%W!IPp)Z-UNKCH z-fJ@zeg0il^b2rQ^k2AEG2pX^VvtLNV(`>AiXqQ~6~ip{D~5MzD@NR&t{A1utQcLF zuNZUwnqr)ylVW_)I>m$|Qi@5UZHmch-xX7KBrB$Io>xqdwpPqovqmxVpM+wzf2U&3 zg0G6XpVAcbov$kvO!ZJKe6~}u*g{LOq;s}n>1{#9a-Al{irOEFmFF`Rs}=4m))a** z)*e2sSTE|R*pRkIv2llyVl(Gj#g=Gg#nv_R6x;quDt0auQS5QySDe@-qBuoYQgLeC zJjH1jloe+vu27s=tgATd$acj!Vm69%(~l|6+Zmv^fa{jx!kA3OMQcARF8<%7xHM2u zaoM5;ip#&~E3S0ir?_f*kmBkW&lJ~Ml`5|5;Z$6Icdp__eKW;P4W|@0Uy4)Qs{CDX zTj>PF?Z-70cS;;m+?5rrxO?{(#l5_}iu>Z#6!&j9qIi%gR`F2qZ^gq)XDS}~Zlrk3 zl-tZ`%vR$Qky5B?b%!6l&=Zsnu&$lQkUbuQd@sfI+;^m4zidRleRlFu+ ztav^5qT-GH`HHs$c@=N%Jj=+$%)-jX&cVsW&BM#bFCZu+EFvluBNJ@tfZl!sim!>D=np`Z(wL-Y+`CABxr77X=QC=YiIA^$l>Jd;_Bw^;pye= zElbw~Bk)D=XSX5k6 zT2>wx8xtK>QCU@8QyWrO-_Y39+|t_C-r?QJmSFT)cGg!ufNT z&t5rw_1g7gH;x>>dF%F_y?b`wy?6h?)`yQaK7R7_+4C1KU%h_wwjk?Waarv9$`7@{ zfz2}+7#Or~fNCyn0Y(M}2CYwE@+O$v4JH?X$rdn~4JL!Yq$QYC0F&$>Qu7^{yagr? zg2}aDaweE;1(StfG8RmFf=MedsRky+!6XNW)c6S|UxCR7VDciEJPs!Jg2~NbawV8t z0w!mH$*Ev+0+{RulWkzK5lqeplk33b4lsELOr8Og*TCc#5UI%wCV9c644Bjglcr$O z1xyBm$s{m21xzjmlbgWgF)(=*Ouht@KR~1w515n&lloxN4os$j$x<-c2`1-)$u(f| z0GK=vCLe>z?;ui}4NOXbNlh?m3nqQQWHgw}2a|PRvKLG)1d|)UtOOVnEVeS zb%nvC4w!TRlObR-7fgclg)TVP=z?>TE;xVbf^(cMI1lRn1F6�+Zm}st3-wdf;5F z2hP!Y;M}bT&gpvKyr8!NtbRL~JPjtn<%1qLFX(~ufZ^iDaE{Oi=Lmfd zun0J;^ueL04=#oD!Ffa<9K!nG(n%j2=KA39)CcDpeQ?>O4~`doa1PQ3$CN%ej`YF# zOCKCN`rz2n2j@P0U$Bkfl1*O_%w__Sdf@U+51hO8y1*i3U=p17^$fsla0#aS6vWmA zmnXX5GD;U*F6q{Q#goCLE0|OVlYAgj=L49$1STuMBm;=lKElXQRaM2nz&OGHs9G9P zn3R4bC}2Q+NihAp;T)L$b15B6|5ITF)Bj87foM?w5==8mTm{q2S$SZZWe+=;X5(D| zrrF~y!8FH)OJJIdDGf|>2mc4tJWD5oY2NSZV4B}!H<%WfUq1%Z!nWmLTBM&1 zOp8941*XM~G{Lk)^A0dAdDR_EORHT2(=rtaU|RO%doV38T?wWYa+$%j;=W!mtt=o8 zrd1N>fN9muYG7KOWi^=A2r~fFn#;F>X|11DU|M&MJ(xCah43vjOu>B1$_-%J>a;eP zwvkx|rfu^S!L;4}>0sJHPzX#rCUt;mr_KMsvXqU6XGvVZy&I@ z*POjz+WVa`nD(__0;c^Yih^nXN8MmL(D)CS4r)4|v7f$2~UNH~X8Lc%@#v<_H2 zQf4lgj>_W$)6x5@z;vv@YcL&`6b`22H=h90iL54IIw@=^m`+|H2&PkhHi79huXkWN zeNGgZ&UkwoOlR4fgX!!Ei@|ixBM~s2XWRg$^IO2<9iV%-*1bi?uqV7d|9NMr!@=fV7z z*^uX_*10d#`bV>3;QkFg>B-E0~^mDjQ5s zmVOAPr{qGyaq7OaVE%LgXD~e@aUYnTxfv3!vsu=I`E$aw!1UbZkZ_*&Qvu9h;58de zFPtL=rWd`P2&R`#=mFCkWFY)a`=^2VTLh)S^wuOuKHauO70lnkx(ZD14A%$KyH;!g z)4PA!f$6>8hr#r|xxQd}|2s&&KIjkw<{z5)3``$>TmYtzn*0LO$J$!J^zj>z^mI}a z5>BV8A>nrV3?v-S%0a^QTs|b6&mRl{>$@lfNw1euAnEt=*6(2PtL$xH`dTC;y4W6EI(J?GrF9^gkX%vn6I^S z7ns)J2A7wh@fa{)Zyhg~*8g7zrVRtY@dX;60rQPNp8?aRuC`#>Y}!gNZT>4YN?eB{qvaH&?f59ZetLDF08VQ@VF8ixXlH>B+W(~Ud8!{4AW zDKNh!S{Y2Yt^v0{K;u(je&<3+c=ovPgZUG?Ap9x1;QR#|vjU4xy8zKYLvaO|KeHH; zerFxo4(87hgQV}d>5%k3ZzpJcodGna1(shJ19AVNwV%QK#s9(e8fc6Q%wM($T#kaq zy1@LEu8?%HYC0s{tbPG57eQlRVEJ`D;Q9eH1_tJD)Hegun;O979%wua%-^aEiN9^7 z;Q9$PHU<{oDRBr)@5+h>)4O+r>pRd`8JNE>9^8HbjhTV@2bp5Q^r7J2VEXV<&_E3X zXbcU^Kjr~0S3qNFVE&0WJYf2iEx0}ajjMtAXC6TOan1-_o`c5Nz~UFK9stvq)FJun zas{}(0UC1yi(iugw@(zW=Ys2D(D)lz{FWdje~*sCjgG^Oj>C8T2 YVL4FMKcX;KRaKR)v6X?jm4OKt0DoPxqyPW_ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Mideast/Riyadh88 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Mideast/Riyadh88 deleted file mode 100644 index 0dac63b4aa8bb38b2ca9118f7e7f681c60a42d10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8523 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Mideast/Riyadh89 b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Mideast/Riyadh89 deleted file mode 100644 index daba1e72f01a82b4a11dfd3a98376eb1aa2bef97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8523 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 R*+qnn3=CZ1!6Al*Tmb#kFpK~I diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Auckland b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Auckland deleted file mode 100644 index a40767df93d3da9502281672a7b4663f6f815199..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2434 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Efate b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Efate deleted file mode 100644 index c46154a8056cecd7310434e01bb646c72b253716..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 464 zcmWHE%1kq2zyQn)3=AL)k`RTmc_)26v_oZXJ-mm3Bd9(Vhdcv%dw%HO)I9 zUwtD$A$zxjV)U*6CGWWo%GPrNRJ7|IRHf?z)VLEJ)P5%fsK0i0(0EdFL9;Q?LF=W* z1?@y*2PQ@=kbzFal|NsC0b>^WdAVHAvAR1x?^Z)Hq)#|3S8aw1R8|)7O6`fM}4-V45V` Mx!k-$bPbKT0CTV?5dZ)H diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Funafuti b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Funafuti deleted file mode 100644 index 66cf5e1df3fc941a7ea9213958c1fe29de440dd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmWHE%1kq2zyOR43=AL)lK`<<7#LO@U|un=8CBQ5}w0}(j@ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Galapagos b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Galapagos deleted file mode 100644 index 7504cc66f5006ace130bd71e12cac7bff2dca37b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197 zcmWHE%1kq2zyQn)3=AL)l3;?edABX`X^@jR62Qpx|Nj~W28RFtcWz){`Tu|Q0tOBr n-w*~@=MV;WN1qUoCI$uuQjGrp|NnoG@gS`vSiuFd&WsBHtkfux diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Gambier b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Gambier deleted file mode 100644 index fc49c03f6e043bf58534f6f4191717e6be1983d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmWHE%1kq2zyM4P3=AL)l3;|gIj018urU7r-&n)I@c(~f0RxMVZwQ0Cqi+aE6$2?I R{r~^}KYr7=K;~L<0RZ;28(RPX diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Guadalcanal b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Guadalcanal deleted file mode 100644 index 3a4ec12e56d7663327bf083dbf819ddd86eb7b81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmWHE%1kq2zyM4P3=AL)l3;|gIi~m<_b@UrO#K29owb31#m6^ Q|Ho?>SFlrvuAw0p0CKSvr2qf` diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Guam b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Guam deleted file mode 100644 index a05292f4bacfb1b9468afd759ca08abe0e36f9ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199 zcmWHE%1kq2zyM4P3=AL)l3;|gIjx-I5*Qg6dKQ30dloRTxCe(YIA;WhfcOkJOk!bR zU;tr|8fGY)_y7O@|3w}iJp-ca%yfM~l3>%BnE(GbGXZhiw}42HEnpite0)O~Q0xOq MbAfEvH8kJ?0EhD-cK`qY diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Honolulu b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Honolulu deleted file mode 100644 index 9297d8cfdab264e1b3ca4be7864cffad8c65e758..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 312 zcmWHE%1kq2zyPca3=AL)l3;_f1$MJKd+b(tvg358?TJguUkWZIdRkoVE%sn!U}9!q z`TsvBf`Q@x|Edf|7BI;HCVBq7c|NsAA6SmI|M1x!drWKy-0MQ^Fal|NsC0b>l%=*7gI>4+u-GPyTfnnALkkpC;3=H1>!66_v0}i8@ z85kHq7^DV7gD~g+|NsBjnaP-dXppfWNwCpOj0_Aj&VabHHZZU-FswMhz~bW@g0O{w MfeU1#uAw0p0C=1qRR910 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Kwajalein b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Kwajalein deleted file mode 100644 index b57237272d541866919b5115bde6e7bc2ce0797e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmWHE%1kq2zyQn)3=AL)l3;?eIsdmw2k4aSIl#!oz%XkA1H=FS;SLNe3=As{FfjOf zgfMuAJBENXFfcISFqVaZ0i*$}2xL5n&-?%X|NnJn5(*$1WCchTVhu9`!<+{o?yLz_zjY_=cd{$iTqm>k*=BXv75o5&I`> diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Majuro b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Majuro deleted file mode 100644 index eab93a2af9905e0b3865af9f85f93daf2b90ee39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmWHE%1kq2zyM4P3=AL)l3;|gS^l?42QV@)%-R4FU2%Yc!Pg@M#ALu>2r~l%0|O4P;_qSkM4cGHU|^3j@Q70}L!az9De485p>HJwkL1jko|p CA{%)C diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Marquesas b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Marquesas deleted file mode 100644 index cd2d5b073afffce74f34a5f984c3e5b7c95086f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmWHE%1kq2zyM4P3=AL)l3;|gIj02pcrgC|Uu(g@@c(~R1_O(aZwQ00V^9c46$2?I U{r~^}KYr7=K;~Ln85?i`080ED`v3p{ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Midway b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Midway deleted file mode 100644 index 8889a26fa7c87074fcf89c15b5bb5ac3c7cd3246..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 268 zcmWHE%1kq2zyK@^3=AL)k^s>lEby$fYs0g*r3$|;g>I12HZWjhU}FCNKQ(}X;s5{Q z1V$Dxn*&Vp_yvbB__>5II0c6=1P6zJ%mHH@_OUWBFn};f4TuI|k^ley|F1KT_5jf! zyTSC^QUwqVasx;)*d0ua%q;)^NA3VQBsGA61?(KCL%_}v@bL{{z~v+c2Cm@X5JN*Q E05|$bl%(M8pHp}TP`#ml=1r!K&vz%aLVq|7um{S8%v~UMV zecc2G4hDu52N+mmy Hp%E7VxL7Z> diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Niue b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Niue deleted file mode 100644 index b9f18a544ab4cffee02a84dfdcec9872675b377c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmWHE%1kq2zyQn)3=AL)l3;?eS?)NSCJ2>Aq;-b!5|_8q>7OdL^6=#hX4Qn{|C7P kq!Hv65Djt4 z!NBtWe`){&Cz#{~lY&0JAq>Hez99^L!66Jz!66L6!66_cp%{ndYzzzxAPiCkas-Gi w`v3p`|Dh+Ibbx4(LqIghF(4Y`Adq61qgWXjHdcUKMS1prtg5K;gD diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Pitcairn b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Pitcairn deleted file mode 100644 index 51f01c6410da8f9b518d07c1f040d830d0f1200e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177 zcmWHE%1kq2zyM4P3=AL)l3;|gIZR!gI2ix`@2Fs4`2WAZfq^B!FN7f=I0U4K0f#}% z3=9k)3{nF!5X9#B|NsC0I&-}*AVIL9O#lD4@qkS2s9<0Lo6X_l8^VBWJ_7?+KyZi! F7XaeQADRFF diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Ponape b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Ponape deleted file mode 100644 index f175ea587502fb875d165ea4ac3ad4b657b58b99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmWHE%1kq2zyOR43=AL)lK`<<85m}5U|1Px`u{a0L1=i3=o7l+Tc2a$X>{B65cGBh>{m9o92s53w(h%aENRzwqS(1^53m6dO-3P%@N} zP|kXxpd#>3Le=Y(g6f9{66#uO6x1&ql3-%Q1^@rgiC|#(|Gzi^L{?=mvN(H(FgSaA z1c!iJ%D}*Y!#^wx3=AL)QY8&#^Zoz-|9_pi*9njy$ZsGTWg}G|2B@`b0UH4+;Yi9~2HC8Wa{F8WbKN8WbiV8Wb)d8Wc7l8WcVt z8Wct#8Wc_-8WdI_8Wdh28Wd(=`ojaTdq80a;)BAEk(mh>{Qp180u*#P5ezKgU}X9K azbb=~!^amCj3A5%N(KflXYUY011tL!66_% z0|NsNV_6v(7(f`LiUrE%{r~^}f02hr?tthzGo2U^4YCTP2x1*G%m4r8DjLNEsK%LAr(pTmZT0EB^oh diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Samoa b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Samoa deleted file mode 100644 index fa084ba584c6364bec21116e0f05dabe9609e98b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmWHE%1kq2zyPca3=AL)l3;4 z!NBtWe`){&Cz#{~lY&0JAq>Hez99^L!66Jz!66L6!66_cp%{ndYzzzxAPiCkas-Gi w`v3p`|Dh+Ibbx4(LqIghF(4Y`Adq61qgWXjHdcUKMSHX diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Tongatapu b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Pacific/Tongatapu deleted file mode 100644 index 01ab6b87ef92e1a1ba7191614e73d4fab354b1c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 313 zcmWHE%1kq2zyPca3=AL)l3<6jIZqZlO)&rMe!=2$?FB0qjsUBo9S+uyUj^6%&2nI5 zVrF4vVPs%fTL99t?E;8A@_>q@eP5Q#lXM?GF8{mfC~Vq@eP5Q#lXM?GF8{mfC~V6c7hR;*v7`|9pGkmSJYWOB4%fPGk zw}5v^Xaiq24+DRTd4oWSMuT9AWP?x$SA(#x8H0%Nn+8$kyA5K(=NiPB_cw@t-q0ZN zcwvL&4&%!D_Fw zfc5Q&2{y~(C)n<`nqb%FIKh6l%mjxt_qtUAK4IU(%3!Gs7=H-U)jLK7mtY6wJa`!XT=Dwjaa0zrY;EpG(k z>OTv_PdO)$5Pwx5vG&!3B>U|G$+2f9q{z<{NVQ!zA&q0}gml>n6VhKypOEplXhPeRw2L!S{Va#f2jRmG5p&sM@ehp!(eI2{khhO{iTrcS2p|k_q*F^%IyFnV4Ca z*;(0`7+IKEm>D5_5EBD~6k-T6voLXR(jGD}2yX!8DH#Pu76t}B0R~P624uFD0V6L+ zgh2>F!c>O)hA=q027`zY23HWn)infU7$YMiBLgENhzY`sj5sniHv3j z|Ns9#Y}L4^pIepw*^qCtfTnEtq>0Yrle6%Y+7SU@zWZ~@c1HiPX46*3?` zsGtGSpuz@3g9;oF4Jvd%G^pSK(V)TyM1u+-5DhAXKs2Zz0tGgxFapy{LK{Fds89mY zpn?fRg9;}Q4Jx2OG^mgQ(ZarFAPQVqff%3y3q*qoEf5VVxWM%14PbLY1sI4AD#SoE zs2~H;(tFl}C~$!WVt@)Y5DhBWKs2au1JR%Y4n%_rIWT?e+6NE~D(pZssK5i!ph6Es zg9<(n4J!OVG^hXs(_c*{fM`%b2%;M4Jzb8G^n5l z(V)T}M1u-^5DhByK{Tk~2hpIyA4G#H01yqT1VA*XA^_2#$^b-zDg-e7VmjD8po#&+ z2UQLr8dO1mXiy~qqCph}hz3;_AR1I*fM`&q0ir<_2Z#n$9v~W2fq-aGB?6*B6$yw2 zRVE-BRH10@Ig!r3{r?8$im9Z$whkzt9gVsFtC8?7Df(m{R6IT5Ns_2 zMnRA)gBXH@$@=()FyO3%7|<#q21Z6MXV(y2Lr{&S<7=#Es%N0%YiIzX^^LgzKd~3H diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Portugal b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Portugal deleted file mode 100644 index 168accf060c3837af1bd64361bd0dc157dec0ae9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3439 zcmWHE%1kq2zyRC~3=AL)lDG?HOHX<>U0}9%Zo%w-#~bF%d0Q~|WOKp1`l5pQtG0bu z5Fb*ou=`cPBFCEri}UgemMHUlSn9v%!z$MI1*^XFeOP;P`G7H3X}>q7j+bD31BJMZsb$2ga1Uqj{iFgcD`R#u;;|~4|{j4_^@w&e8K)1T^|n2 z`tadkMb3vq8L=M@NBDg>V$WJ|)WYDyF{^1Gjz_F1IDYef!AVB_f|DN=3Qj#r`fz${ z(1+7+7C$)C;QiptokbtcPBr;(_ON%txuQi6&K=!faK2RR!}&Go4=x0?Jh-rQVZp_a zA0ICEcs{sfl=k3KYjeTn$Ri)Fcy9f0)$*dkHO)f`*CjVA+~8cIaO3Axg_|$i6z=Sd zRJgmTWx>5gr3>y)N?Y)tDSW}hB98@+k}MZI4$@li#7TO=QzM=Q&lLYIcrLA}@Pb=P z;l*!mg_p1XD7?D$R^j!jdkSxMomY6f>VU$#SsNAJcP&!*P&HZMV^)j8r{whuJ_j#Y z@WpxJg0IF+3%)5AFZeE;vfu}E=z<@g-4^hy)?(nDEzQ8!&BMUoV%{K7qR}9jBH17m zA~8YO`FDee@vjM@%C9Gg3E!C@&U|))_~(5SBp&ZwAbEMg1gXOlCrIzvDIgV&}%t8LBC|r1cQ{d6AWW-3K$h_5iqvhEnpHfO~6!k zu7H_Qg@D=LdI1aRDHAO2CJI>oE}LMr*IB^&cEkjmW$_bicUw)cYjd1nKU-#kLz?mg z#}-QgCpXp!&MDFYE~?KbxH|t8aAQ3=!Cm>jfcv{=0-nqV1w7B45b%1uSipPTDgmD} z`zQGJ^$7T_SvbKzFHaz#r+GqPc-MrWoYV=y<~b8WeB395iu+9n)6tv|_T6AYgs7W9 z#C4$wkzX|gqPBgR5Pg+PAZCG}K&ci6G(`^Dv((FYC@9zc7f#BGZRwe zX9}d+uA7j?v2{Ya?1TyFFQ!k(_**m~^F-x@th*r-vR6b;$T?OhklSH9A#Yi*Kz@e& zgn~9xfx%p|3}`~Uy{e^8kRqCw>znErRX0Yrn!KM)Nn13@&X90bvzvJgar%0mzh zDic98s9Xfmpt2D}gUUw`4Jso+G^m^e(_i{NfM`&838Fz|CWr==n;;rgc7kY7`3a&y zWhjUSm7^dURF;BhPQgUVtsee*upK2Vtq;)BX%5DhAuK{Tj*2GegA zKLF97avDtESp@b!sJsU8L1i|G29?`j`sjYJxuEhJ#0Qn(AR1JTgXyIU!SbN;9K;8e z=^z?Zu7l~;X0SY{dIM)Esvkf!sEz>9pn3vCgX#(p4XQ7|^lxsk zy`Xvn#0S+KAR1JEfM`%10-{0n2#5yNB_JA9pMYpkodTjk^$Lgv)h!?zRKI{|P#puJ zLG=uX2Gunn8dTqaXi%L4ra!wa0OcZ{)mk75T>pR=pgIUdgX$p=4XTSkG^joT(V#jB zM1$%j5DluEKs2a+0@0v43PgkIDKPzc-vkg1s;@vasLle>pn3~LgX%624XVFDG^h>( z(V%(^M1$%w5Dlu&Ks2aM1JR&*4McN+s})dcJgP@M65k!OPMGy_D8$mRvegx5=Iub;K z>PZj{sw=_t-+BQM4XQK2^xZ@-A5?dO_@Md|M1$&35DltFK{Ti?1<|1T6hwpSR1giS zS3xwWZUxbx`V~Zj>R1pBs%JqosICRkp!ya>gX&x`{q7mqeo);D;)Cj65Dlt>K{Tiy z2GO9p7(|2WV-O9hlR-47UIx*ix*0@+>SquQs-r4FgX(J#4XU%j^mhYr ze1Ph15Fb>3gJ@744x&NzIEV(-!a z0ir=|2@nlxPk?Apn*v0G+7%!g)V2W8p!Nlb9&KY#zm35a?iykMYL)2t8ta+r8R#48 K_!=63SX=;oHVlCP diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Singapore b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Singapore deleted file mode 100644 index a6f2db8f3a887fa0f19283b52c2f801329bb4f53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 402 zcmWHE%1kq2zyKT!3=AL)k^s>lEZ)}Kx_DQ*--H8PPZCaTewuK4Vm!wskK7O6clmaR zP5jEi$i&RT%EHFZz>pXV(wJ1hz{0?guE59%B0=oT3J_U0fq|caA+v%(n1P|7fk8Of zH-y30(FaTfhcI{rhcE=Yhk#5#!8n}C$-uw>!XULE8ib|)|NsBL&MbH_hz2l7VD}JR3oZaxJ7f3& diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Turkey b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/Turkey deleted file mode 100644 index a7c16e76d1743ccdf5f8b7e6f8ef761e23456cb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2721 zcmWHE%1kq2zyO>K3=AL)l2{F8i%sbMI%77Ec*5+f`z|a>O@6Srx+!3ZUqixD`z;ri zsj5F%u3mp(m4-&bs)v6stp3^gV9jB}fD`ra5>EU-c;Tei*Mw8&8UjwAUYBs@>A`@D zg|8o6%H|BXyvQ=)iZfHdRUh65*EFjyT-Sd8;09;xg_}&%6K=k=zi{jQiiF#jVgl}5 zxsY&obN_{pUv?&ZO4)VcYX)1wH+hQ-3=4KWV9efpfvI8617`237g#cPCa{`p3Si5d zT)=L*qJjN)DFdhEvIU&CtsZcFV86g4a4v!8rb+WfKGVTci^N+KK~&(q|kH z_BCS=aj!Zcs(iOWOg-j+IP?An33j^!lATimB=1Z)Aam^U1=-o60dhS}4DvO_3<^0Z z42m(K3`#z349Yg<3@SPr45~7c3~D@F4C<_=4eDPd3N)T_7HD4iRiJg`b%FMlI|VvR z&KBrS*;k;~vc5pSWI=&J%ESW0*gYSNil%=sww?FEB&hO(scgdsGo$DaW`C1DSV&hC zSlo5_VEH?$z-q7B2kYB51vbl^3v74G71*_@7TC{bC~!z)FK}#;`QYUGvcNg{-v<}f z(*>^14?eigFnZv|dUArh@_hmKch3YonGXtho;xAn^?0#>_qtUAK4IU(%3!Gs7=H-U)jLK7mtY6wJa z`!XT=Dwjaa0zrY;EpG(k>OTv_PdO)$5Pwx5vG&!3B>U|G$+2f9q{z<{NVQ!zA&q0} zgml>n6VhKypOEplXhPeRw2L!S{Va#f2jRmG5p&sM@ehp!(eI2{khhO{iTr zcS2p|k_q*F^%IyF$$`u)Fv!Tn%0?_?V&|X)GB8MIfbyA^0V4|ogNy>wJH;lcFPeHTD9DC2`@Q052GpaK9yg9-r<4JrsgG^j8D(VzkW zOh5b!)(EWHWFT7D*9=5~3p5Y| zRH%VyP{9VGL4_NL1{H818dS)E={r*nfM`%*2ckg*9*71NdLSB9@PTMh;Rm8Y1t5q9 z6@nldR1kt_P+8}z6AR1Iaf@n}738Fy-C5Q$UmLM8bV1j5+ zp$Vcv1t*9G6`mj(RDgnLP$3GUK?Ny@1{J0t8dRWyXi%XFqCo{KnEspe0YrleSTKFp z1-mHum#be0vAMs3SAHlDtJLOsPF~RpaK{~g9>2~4JwF1G^j8J(VzkuM1u-t z5DhAr!SoCxaJm5%&>%jjkOtH5o(X_xP+<+G&z%7CL4`Jm4=T7pG^p?f(VzkxM1u-( z5DhBGK{Ti^2hpGc9Yli)br20I*g-U?a0k(#0v<$z3VAU7-CzQU1{L;T`nnL94=VIQ zd{Ds;qCtf}hz3;vAR1H&fM`%f0HQ&a0f+`w2p}3%DS&8D#Q>r~l>>+dRS+N=R7rqn zP(=ZvL6rrVelZ_hz3<2AR1JGfM`%90-`|`35W(&CLkJAp@3*mr2?Ws z6$^+4RW2YJRKb8~P$dJRK@|;%230m-`okk|_=74P5Fb?WfM`(V1EN6{5QqjWdx!@6%vRBRZ5J^OyocoRv2VrW@9H7GIMZJ0vQ;jH9+o`&R}2x*FhZMx`~&8 z!NP%25G2AN1|k{Z;#vkUwvTTJ1D^T`xq@O~WaM&n4be3M)nz)q#(JiD2KvT2zJ>;1 HmI)UCu)-`e diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Alaska b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Alaska deleted file mode 100644 index d14735026a09cff0104e479fa6543301d482deed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2358 zcmWHE%1kq2zyKT!3=AL)lIVxB)lPSs9k`_YrQlMclfkb`?hF3yNOt(Y!p(qThN}Z( zhlT-Dg}MWCq00uAMCSvnfodDr990jn8**%5?~OmeDe!6o=i1v2Tp!MC;C^uW0ME^r z2D}H>9^l(~+JJxMDF=a>YYhZD*Ek4O_8SOi_Bn_|78;0p7C4Am1{;WL202J5{mmsB>$9%5f0w~1|o{KA(D6v`|O6dO-3PzsYaP|kXx zpkn&hK-KG%f|}@k19h!63hMuUZ_woGQ_#G3cZ1fe0tM}T`#0!Z?pdHaZ{Y^L&3Oy- z>zX$hOb%FJn7+WksMu(Mv3rw&NwCNQQ}q-BGox<{%-P)xEM$ZgES_r^SpNR1V0E0! z!20%e1)B|O8*F#)RIr=CvB7@!Yz2q>R~sB#wl8qyxztrc+WYw!RK1V0^gd&8~nCKE%1+N-4HO%WLC?=zphBXeMb;lz%~?SoF6+iT@^rlKan+X+hPzy&I};lq{&Jo4=uUN7#b8xW*0jGb|P`GBGf- z;DfB}Y;=VG{}(4PF#P}DSir~vCON?(d|;M1%|LqSv-~iFJ z?T#KG8kFHc^d;pl1zG^nry(VzkoM1u-V5Dh9g!SvfnVE2FuP!Jzfh=OQPK?4Ju?oG^n5j(V)T>M1u-k5DhAHK{Tk~1=Ih-DyoYsz+?ggq`>9?70ish;9^?{%oYcc3^L$iTLH{g_3;Ij*dR=}=tdOY fFcuf6P`7mSb_vn(HP$oIGtluhG}JTHGvERM@GWVC diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Aleutian b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Aleutian deleted file mode 100644 index 391ec98ec0f31cd595ed05a9b91a41c4cdb25d31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2353 zcmWHE%1kq2zyKT!3=AL)lIVxBl}~rNT)3qCrQlLxfWxm#p&S0~C=B?&BE*4VMsNUQ zhnWLYg=qkDVbB4V#J~%zfhGso9E~rq8;TuZ@6ElyDe&U}=h~M6Tpw;7;C^uP0?*Cw z4!j3;U*Ow$(}92GjR1j}yB!2OcLfMl&UFyZoD(1tS??g~Sr;H?ndl&{nGhhMRC_>@ z(r+@>}kBm3STrxT!dq{MH+$NC&@(aIjP$+YEP;9)pK`BhrK{@N2 zfr=TogR0jJ12xgN4(eLF4AlQ~9?;~PW1xBO^#QF{bq3n|&K}UYJZppQy!8k4HrH&> zubX(lU~=3B!}N6yM#T;rjNKav9`M_ivB5uP@_~S9UK;{!N)H5; z>1+s=2|o}L#Apc zP-bywL)m@y0~HecHdO3;d7$#gf(=#kP9Lbg(X^qaZta2E9Vr{?;`$HN&v4to$i%?R zf)BE?v(XX$|DPJb!0`WnaRMU?nB)M9@POF@Ad*4k|Nq7UMoBPR&M!EG!7n_7!7m_$ z!6`U|!O10r!O;#9l>#6dR1$z_P-y_7K_vo+29*jR8dNfXXi(_@qCq7Dhz6AsAR1Is zfM`%@0jB?Rg6#v98X!KX_h9=#r51<}D!D*3 zsPqEUn>T~yL8Tao4=Tw(G^jKK(V!9yM1x8-5DhBXKs2ay1JR%o4n%`WIS>sh=|D87 zv;)(BEWzOqD)m5oP{{|PL8Tv!>1<{~V6-0wdRuBy;T|qRcgay%{QWivmN?H&NDs4eDsKf=)pi&o1|5pW@4=Q~@ zd{7AtqCurFnBMmiEDtJ;L3~h&45C4$GKdD1%pe+6I)i9X2@Rqlr8F}O6Du1&$j-?@ zN65gi`XQ*Cj!FWNsR0b|(z-Z-kq2C6gG*~h5pX#z0WPy;!E7ZT-w+0(%56l+4P$Y6 cI0lCp8h{FS9baQTBRvBhUqeGZLp=j70DftCkN^Mx diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Arizona b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Arizona deleted file mode 100644 index 67589026c21c6bcb83587d25342c93f10570bc24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 327 zcmWHE%1kq2zyQn)3=AL)lHh`}dFCy%nlOJid&7b@nF$MLy=*w$$ur@+_`2T{u4C!#Tig9v|Nj2295@FmU+>hnRB# E0Gj1`V*mgE diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Central b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Central deleted file mode 100644 index e932c6dcfcabbe83157f011f0a8cc7b61cd46f97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3543 zcmWHE%1kq2zyPca3=AL)l6Vbei_BZ5(=dP6&w>SQd<_d{-7Z*kx`bhI^Y;%+TrV{& zO}_bIS@2DU<)YIIRv7PQSn+T3hgHIJ8CKn!`eF6wdWJRo%0H~VoXD_lUgU@Mo1Gap z)LDPnI48bgQ+hwmKm6qPYWT&G z{^8e;bcWwAJU{%o;mPp#g!YGjJG2@8ui*W_FoTzYvHkrArt6rNH}Krt@PYS0X#?NRNgw!EPGS(4S@J=! zvxGsYGVFtJW*CD=q{RnOPYVVyOQ{dynoSqpisuopxC&uKq>SigL2m14=SdY8C1RIe^3+M%Al^*_(A>O#Rg5T zmnNrCaV<~rk61o6>}6AyGJmX1idOS zRkva=GdfdX&Mw1XA^qZm#j}45mcLJZusZgD!TR=^4>s%nG}!L$`(W39ufcwH!3T%@ z0}YNXy#-GGiyE9$@(Wz_TN+$l0t;L}Z)b4V&Hdnhc_xD=um10K13~f#1MUN#)p`eBMhV z-nNERciV#0w;2uT>hcBYXT2IS*%=Em*XlH6J$qb`JgdCuC$?chfYCVTzEtM488&eM#7K@Newd#5{IzX!KC8<|D78c8UFuYy?}uQ#Ae_C zk&HZGQoz|IguyvDguyj9guyvHguyu=1XQRoFoH-%9K|0S0|NsHgVel%vL*ii|NlRZ z`QHK%4JryjG^jWP(V!v`M1zV&5Dh9CK{Tj%1ks=(5=4WFNe~SxDnT@;xCGIlA`?vi z+x!7UgNjZteQzq54=O@Id{8k8qCrI|hz1p>AR1Jpf@n~&3Zg+pD~JXauOJ#!#DZv0 zF$N8dP+H=^v?J`#?oFhz}~p zK{Ti+2hpJ7984#2g2M?^tb_QVq8&toigyqVD&j#jsF(-QprRf`gNl1F{a_+kKd9IT z@j*pDhz1q^AR1H!fM`%P0HQ%v0f+`w2Ot_$C4gv9wE&_)RRf3yRSzHpehDLgQ^)24XSEDG^n}((V!{^M1!gw5Dlt&!1RxF1`z%Gg(uiOplS%j z|9e6k%>M_fjz9vSDhZTZX7GYYaMc82fT|}D4XUC*G^m;a(V(gdM1!g;5Y29Ip#V(x zsyBdWPJvBeKB)Qv@j+D>hz3<-AR1JafoM>52BJY#8i)o}Yakj_wSj0*^#-CrRUC*0 zRdXO3RMmlKP<02QK~)}z2330?8dUXxXi)VBqCr(4nEoUIb|0uJ1o1)DA&3T5i69zO zErMuJ)d-?N)gy=oRgoYXR84|tP*n+{LDeOQ2346L8dPn9Xi(J&rvF_8+Xt#bL3~g( z3Zg+(DToGDryv?srGjWswF;s^RV#=FRj(i#RKeia%?}U_YJ!02e{aF&gPI~BKBzeYqCrg(FuiXhSRT|g z0r5f26A%q*qJU^nGX+G0nkpa~)La44pe73wBN31pNev4t5{DSggGbH(|7))>Fo0Vq zEZ~+4xXr=-Ak7yBMlR>z5Hn|&5FKA*JtI8>9bZF3JwrVME&zQG BX;}aO diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/East-Indiana b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/East-Indiana deleted file mode 100644 index aa3dfc43730ed25bde9c967039951f5c2fc15cc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1649 zcmWHE%1kq2zyNFv3=AL)l1PHGCFU*DX_&w3XTgFtzJ`UfZWo*iS86zQ!@b~i$G?V4 z%3lgDC31eaT>6>eio@#_-#{4@Q?8=2$;r_5NM-c5LEgsAy`JRASCoeLdfsW1!1PE62hMHe~6Gf_8{WO z#}ASJRy>GWa`{8_y{-o_En7dt?#p=)mooiB{5-!03BFqj65F#Al60pPB&Yi(r0`Z0 zq`K=Tq`r+RNLLq3NIz>+kjeHrA#<%k(vU>*$DkLfrD)ucdsQeL?P&Kc$p!$YQ zLQP$ILG2E?gt|D-g8CT@2@H%N$ixh$KuiQ?VPs*Y0{s7f=LSZG|NmDnU|<2WIlv?j zh-47>|Nr;_MiFP15C-Sq5C-S)5C-Rf5C+%a5C&J55KxL?1Q8633=B9@7drz30|C7DR(mErcluJM~D5rpEP;LRypd16DLAeG@|NdM6qCvR_Oh4rZ+Xu=;AU-H3foM=}0@0ux z1)@Q@3Pgi)7KjGrE)WgMVIUfm%Rn?Jr-5itZUfPv90#I7xei2wavq2V zP%Z@VK{*jbgK{I7UMmNd2jxl-ACxmeG$?n1XiyFX(V$!kqCq(oM1yiGhz8|Y5Dm(; zAR3f&K{P1$g6V(v!RCWx2bu3*tEcn!i<)WPlD~#8CSn+S^gH^(PA6DIKf3W&g2u*rv{xu-*E5!49?$2|J~47VLa>DPcFu*AKgo zZAsYkn}XmcVy>>{r#IB99S~@!@>M14-U1|emLx3_TWfL{D-6Z5f6^}))XA) zw|a0wH?H8skMM+3ybcAYZdfLq?)Xq}N%>2`rG(!PE|)&}aK+*7gR7y(K3r4S|KPgm ziVrs!7CyKs+V$b)gXRaf{w*)KeIWJ0oqL@HcULwg+}oF3aKAGp;lVuLf`^%I36JXZ z3m$uFBs_@|EO;8O_u!ek?uX~*0uNrO^M80L_UXYZwvQiPeY^7D^|Q+#-dx-E;O()k zAKvZ1obZ1ArGgLhw^{AmSW;wuxr`d1WuvyV>rt{+wKL!Wx_=Of)OsN5srf<7lIMZACie#kCCvm$j<+AAn79+9K5-RDKYW`Y zbMZ}q?7{O1avRST$S>TOpisu}L9uaif>P+C56W5VAE=lf`Jn1G@qwD?vJdK7#Shf~ z9WK!13Von?Z)t(nEAt21``Qb1E{7!O&dV&&+iaGgU*}z5Fj*qOFg^W)QPHmiV|ULF zCP8-+Ox3kNm>KO$FlXoeU?F|$fyJ};A1r_Gd0=(y;s@*7^B&l&e^+3;yWxRd|Ahkk z*+~x^@;4PYw$vv$`A;cuPDxB~(Jw1-b#YE`{k-CXyKejg_sd-$Jb4`-cy7-5;PqDd zf%lxw0-tLR3BEPi1%BI<68vL)3j(IGBm~;%7X+0)O9++`EC>lbkr49xb3vHts)Vqo z{2wCZjy;Gt^6^9DzZDOnmR$Z2eXr|5Ov}~}vHNl!#HCFC5I@iFL4xm=g2eXhge2W* z1ED2P-ZbLq3qtlf(nU>go=HO3o3s^ zB~;C8EvUX>lTcHaUQoM3E}<^Yv!H$kLjnUMX^@GTL=B`FPfOMR{~tfV$ngLF&J7GK zU^WMsu&VQ>u(VQ>uy0TpG83=9m6IEp-01_lNY2B~`kWsCg(|Nnm+^M?r_ z8dUs&XiyOdqCv$Vhz1pfAR1I0f@n~Y2%;RFr~fP;m;PK}9Nv-dtl`0HQ%f zD~JXauOJ#!#DZv0F$28R;B zbgyIqh~^Yn0_KCNED#@5ZGmV|)diwK)fb2cRbe0+RE>dXP*nz^LDd3AR1IHgJ@9I z45C5RGl&LN(I6UBO@nAqRSlv+)is#@yaH?=sM-ecK~*=1236l+dUFm~9#oBk_@JsB zM1!hx5Dlu*K{TjZ2hpIa9YlkwcMuJ#;z2a1ng`LKsvbmxs(Uc~`!hKFLDfEp532e> zG^qLq(?>pn?FTgjKzvYB07QeD10WjIBmmK%W&wx>H4Q*CsCfXQK}`e@4QeKUXi!rD zM1z_OAR5$U0MVdk1DJjr1$Gap`2gaBnh+ow)QkYrYvsW5pymXK4{B0?Xi&2PM1z_Z zAR5%X0MVc(28aeVGe9(`sR5!v%?%I@YI1;RP_qL}|GN)1AJqH+@j*=x5DjXEfa!gU z!SbNy2#61Al7MJXvjjwgnkFC`)I0&vpe7241~pTd7)gZ8EF@|m)dJe7|Nnp2JO&1E z+k^$&T7kAxz#;-Zz99@)S}Y8pCJO^2muql{sjEwfj<2zvk)DB$uc4uyp`HO3087c|NsAA6SmI|M1x!drWKy-0MQ^SQd<_d{-7YxY@vq^M@|S{3iJTv< zhF)d3rf~Mdb<^z(HyGA`xG6f5;pT&hA8!5I+Hm_o@rOJ2rZ?POIicX*zRHICokax? z=0!I=%nT`bRA<}p*wd`wNt}Gc({P&)&)jVoo}0^kc%d%G@Zyu$hga+j46iQ!`0)DK zBZfEEj(m7~>yAzyH8g{+@xkkf(qpk-LF4;9UWm!`lXSg9`=hz3L5|0-Fjr*Dhw@ z`Y@${`@!S}o|_v!@E#~_;M+Or1OLiN3<5JtJ_vS}FbGwKeGtwJV-Sh7_#o%J>-+8y6NR zg??mE&f5Dy#q=_Rs@MDvYNA^i)U_HvsQ5hW1r*aGta#ub?9A#jL{I~5x)RIRG(f4M2h-o>(5WBDHLtM%-hWL3g z9};{IH6*rI79{B|X-H0wE=b{RYe;psEl7Qv(U7h#Uyy#*t09w}u^@A;PD9qS#|7Eb zJQ;G%|NoF%rp=JI{^5uGFkXg&{=**%P2V#VogL7~QgL8NYgL6O#gKKaIDC;mn z2ppM=je&sygh7gCLD>@j|Ns9V$NX;rhz4ai5Dm(7AR3hMKr|@xfoM<$1ks>O2&NM` zKY(aZW(3io3<;t^nG!^UGA4)yWlk{tU?NyOD3gNtpo|KlL75dqgEB0L24z|h4a&G6 z8kBiKG$;duXiz2w(V&bBqCuG%M1wLkhz4b95Dm)MAR3gp!Sp9Fu>GJ+4&s9{I*0~k zb`TB9@E{tL=|MCoMPo z^L7vgF5o~6P$37RK?NO{-dqi$zy%(N0V?!BG^pSM(V)T)M1u-I5Dh8>K{Ti!1ks?v z5JZCtL=X)s6hSnoUjD4JyDvG^h{<(V&7HM1u-*5DhBO znHZTEnV4C?6o`o(vl5WUqKg%a7)hr5|G(}O0|Ti1W@G`E>qsR!qX0;pLBz*5gaJp{ j&Hygl85kM3oP$HmoLxe6e2w*t^bB--4Gr}S^$fTG$E87V diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Michigan b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Michigan deleted file mode 100644 index da53d46df347ac70897f4f5c51feb83b6a878627..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2202 zcmWHE%1kq2zyNFv3=AL)lIVuAC0h3?MbEUE!f?9dL%}8GF9nwpem}Twy5hqPhJ_D) z8?Pz&{lfYIo5TGAc7sC+?7fl&oB~S{xEK}}aD8Y?;C|3rz;koa1KtDa1$;YO9`LVh z{va?j?SWut>Ib1pj|ak;?jJ-VwH}CiYJL#2j$^Ah>Ni#u`aM+{SYS@(VX6D3mdLP;8u>pcMM(gL2mT2P&pVKB#(4e4r+}?1Q>i z@dNdLhYK{hLLX?}TUwy?%KU-$zV-s0%OMH6^D+zcHk&2r*LfEhOqNJ6Oi%w{RP-ys z*xmDkNzk1HQ+4eRW=8uG%-MNASV-S`VDaqz2g~1k9#|c__`&-2yazVx-xb*IZg^nV zf1$vBcG3ff{7nUpE%gab{!yL2|lpLJDt1L8`lcLh9S7f^>Dkg!HpE1(|H06EfGz6=XfTnvgxs>O;=?j}LOo zWIp7rzx*IS^xubq{;dxRO&@$H%AfwASoF|`6938vCI9XhlvzwmD7$yCphBV|p<>_S zg32FJ303o23#xC}B-GTU7u4>MOQ?(UEU2Hskif{q%)-PvDB%D9n^YMX{{LUSfPv-z z|D78cIR5`Xet?k&ObUQW5g*?W2It@q23HUc4`FZ(2w`w_2>~U421Y1JN>=&*|Nnnb zb^+0#ECZrJ*#<;|vJRL|`27GxgR&5a24y1<4a!Pj`i1oakkz0p1)@RO3QYG(7Jz6_ z_5#tMEC!}Ov?YLOP*wxcpzH>sL0Jw&gR&in24y`E4a$BX8k7Y=G$w;)d_65

$*0nwo12SkI4AP@~I zhCno^C<4)-;s`{8iX;#XDwaSrsAvMwpyCNk|NaaPe^4<6;)9AR5DhA>!1R%iVEaME z7KjfjxiZKukD#}1Ks5k@Bpdt-KgNii}4Jz6|G^lt3(V!v@M1zVs zF#R?P>>f~Y2jYW@JP-{k_Q3R7Ij}sa_yh4lMIeX<6@wreR1|_}P;m&NK}8~n1{I4S z8dNlbXi)J8qCrI@hz1ptVEW&Eu=$|k62u1;nIIZeY=Y^1i^1}s;uFLN6`>#+RE&aX sP*Dn^LB%PE1{J9wdYBfgT&}?(rmij_I=;qwMtTN1zJ`W+hI$5E0Pe|sod5s; diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Mountain b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Mountain deleted file mode 100644 index f8908febf220f27b3efa68bcc119633c8efee299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2427 zcmWHE%1kq2zyK@^3=AL)l9&r+3(Q+)HDUg4_J##*G7}cgdfBij_1}cWEo=-+TpvtW z(!Z?XbSKY*OUhpgE+tAZeAh3V@Izw?!%zN*3BNeX7=HaI75M!kg5l4NaDl%ktQh|7 zuoU>eLWY51hO_`<`#%Pz^1lMig;EVHiINjo1O7CyIsBf$Zg8)Gz1MUCr@(;*&b1o_ zxIQdu;C`@h0?*C;47>-LC-CiD$iTmHfq=lwW(L8|CIO+!R0iS96akS)cLq^UHvutA zO$KpI4FL%y*9J*WE&(Yf^#-X=Y7?X%aW=?Y;+Pjb^cK@IwK=@Seln=}}vw+I*&i!~U#rwNz@{b(>%_Yg2My47ILt|ee0{hh($Igfzl z@0$!($KDB8-`>q&vw>@Z?e4h@cKvTA*w3zKaL7M5!Lem_gOmS;3C=0C4KDhVCb+u9 zH@JR2D&VeL!{B~-xqv5c9E0cPP64mC4h-INmQL`w7SrHc(>}p(n_Yu{Oy-1uX$lR2 zHr^A0%9t90WppQmgg$8q`NKaU%=B18*i#*W2)V}$5l8t1BL5v_h+6VNAo|{NhM1O1 z0BmQ6@k*KJ5Y8!;i1 zoxdS-t<{9AXCE7~r-cjTT;OBKEwdEJTmOL}KTKMnp#Ks>q3K_NqWmok#iI8GO8loW zl>GZWq0C}aL)pE%6DlO8G*s-{KcVtRSwq#lg%hf8L^RaYHBYGBVbxFBh6mGY zH-gOrWqc4Hl=(q4r~m-bph5sdg9-u=4Jr&kG^juT(V#*BM1u+j5Dh9EK(t7tJBR`o z5+H_{r6!017ZxA}sK5Zxph5#gg9;8X{Yee%K2QMy;)4ni5Dh9wKs2Z@0nwlW1w?}i z6%Y+7SU@zWZ~@Vv0tQ5b3K|GN*i4^;4g_@KfEM1u+-5DhAX zKs2Zz0@0wt2tcCJRKS5~P$37R zK?NO%1{HQ78dTtc>CZ>O_JImM5Fb?dfoMrR z3PunODjY#HsDK2~ph6Nvg9=Iz4Js@_G^oG?(|`EE;SVY}L3~i*38Fy-D40IV2euzn zkb?N2!W2Y<3RDmcDpWx4Ju?oG^n5j(V)T>M1u-k5DhAHK{Tk~ z1=DZK!0rJRz#u-T5C+kpf*4G%wF1k73SmfL z_OC?YM#I_(xBgvRaQnanfjjp$FSxsM&4hdVrY^YO**D?Ayz&JPGYcj>s*7Ck*fVIt zlQ`=IPc=;@JadmwcrFwu@Iu{6;l(FofmiG@3a>7S3cP;yPvOnR?*ea+Jy3Wz@utB0 z^?w$8DBLaZvH#wJPxS{Ue9k|x;7k1C319seE%;{NI^ny1%Yq*oiv)i1r!Dx!(IW8c zN3+837ij{2Zlo&wJ>ennZ-=|W{}oyS3^Ozp7&~|bm@2pxmlg6cJS)I^VB!M4o$CeoSFTeKm^o2EuycZf zP-U@zaAuK$NMxvhsAq_Rn5DUZxTcwcgi`PXNlpm`DJIhiQlCr~NIw#vAahAyH^X?_5WI6Kf71JA^*+- z$Ci~7oc#AKa8Bu-;G(}^fvZdI1lP}(72I{Z1l%ugRq*7^5%AnRUBTKkbjYU(B~sNLZ)p)Rg?LH!J^2@H%3j7-doAZlpg|NrMsU}X6JzrTTj1Xi(t>qCo{5hz1pMV7k|N0f+__c3^t#ez19Z zSb}I!feE5Pg(jH(WCC^{sPF{wK?Nv?1{I;M4Jzb8G^n5l(V)T} zOn<%%whvV3gZQ9=A4G!+e=xmyI#?c534r*ZiU34|DgzJ=st`als8RsYpo#%RgDM9Q z4XPkOG^mmQ(V&U~M1v{|F#Sgs9R8q61H=ba93UE0d4TDoGGO~bl?aFrsz^XIs4@Z3 zpb7;HzbzO!I?P-O<8KDnV4C?6o@%=@c;i4)fgDSH5&`Ku7lQcU=aZy-w*~Y^&JDK!ee0M3J4Cd Y2yh9}@io>n(lgNUH8j*S)HC1$0Ot0U(f|Me diff --git a/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Samoa b/sbcl/.quicklisp/dists/quicklisp/software/local-time-20190710-git/zoneinfo/US/Samoa deleted file mode 100644 index fa084ba584c6364bec21116e0f05dabe9609e98b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmWHE%1kq2zyPca3=AL)l3;4 z!NBtWe`){&Cz#{~lY&0JAq>Hez99^L!66Jz!66L6!66_cp%{ndYzzzxAPiCkas-Gi w`v3p`|Dh+Ibbx4(LqIghF(4Y`Adq61qgWXjHdcUKMS|}r2*}qo z3Mk|h2`I)S3n=-72q@dQ3aIFq38>1b3#jo(2&l6IBWJViUBEvQN<7 z@?(O|l9v;7r`(#L*K&G-e#xE*1}SSN7{=ZdFe=(2U~Icvz$9pzfT`?U0W+ft0kgmL z0v6I!CRp4}6tMhVHoFH0247EtUdKZmbiW zQ=|o4RG&|9b^a^h#(HvsyYhVj_jk_(Jedy)c%C~U;PrU1fcLsp0zPNp~MEziJ3X zZTm7I`YM+|%mP7y*e!1a;_5#O#7{XVkPv@WAhGtx6XK2@}#^OrMbPw`fAPN>?jOrZMQ?g=$B4^60D zH+Mo^<&p{Yef1L<7zYe8@Ch)2(i{T=Yq)E02t&AQ2m>P{BO@uv6r>-NR6#T-xq@g= zk_FMAWDBA}Nf$(ek}rq`C1DT^O2!}>l$1d^@P?84IpZ84w(V(OaqCv?UM1ztz zhz2Ed5DiM|AR3h1K{P1IgJ@8)2hpIU528WIA4G$)0Eh-<0}u_$3LqMk9Y8cFOMqxl zwgA&#O~CE|We*S^ltn-^D4T$2P*wrapzH#oL0JYwgR%{X24x)(4az<6MjSr9~nvLT2DWknDT%8no!lqEqlC|iPPP}T&|pzH~z-#r7{56Y$>J}9e# zXi#i0Q1%DWpdtW7gNgwV4JryiG^jWL z(V!v$M1zV25Dh9CKs2a$0MVc#0z`v~2{8R)I@mp+;sV466&WBJRBV7~P|*RRLB$7% z1{EP78dQvcXi!lCqCv$8hz1oYAR1JxfM`(B0-{013y204F(4XL%z)_+kHGN(DsDi0 zP>} ✓ 1 is expected to be T -``` - -### (is got expected &rest test-args) - -Checks if `got` is equivalent to `expected`. - -```common-lisp -(is 1 1) -;-> ✓ 1 is expected to be 1 - -(is #(1 2 3) #(1 2 3)) -;-> × #(1 2 3) is expected to be #(1 2 3) - -(is #(1 2 3) #(1 2 3) :test #'equalp) -;-> ✓ #(1 2 3) is expected to be #(1 2 3) - -;; with description -(is 1 #\1 "Integer = Character ?") -;-> × Integer = Character ? -``` - -### (isnt got expected &rest test-args) - -Checks if `got` is _not_ equivalent to `expected`. - -```common-lisp -(isnt 1 1) -;-> × 1 is not expected to be 1 - -(isnt #(1 2 3) #(1 2 3)) -;-> ✓ #(1 2 3) is not expected to be #(1 2 3) -``` - -### (is-values got expected &rest test-args) - -Checks if the multiple values of `got` is equivalent to `expected`. This is same to `(is (multiple-value-list got) expected)`. - -```common-lisp -(defvar *person* (make-hash-table)) - -(is-values (gethash :name *person*) '("Eitaro" T)) -;-> × (NIL NIL) is expected to be ("Eitaro" T) - -(setf (gethash :name *person*) "Eitaro") - -(is-values (gethash :name *person*) '("Eitaro" T)) -;-> ✓ ("Eitaro" T) is expected to be ("Eitaro" T) -``` - -### (is-type got expected-type &optional desc) - -Checks if `got` is a type of `expected-type`. - -```common-lisp -(is-type #(1 2 3) 'simple-vector) -;-> ✓ #(1 2 3) is expected to be a type of SIMPLE-VECTOR (got (SIMPLE-VECTOR 3)) - -(is-type (make-array 0 :adjustable t) 'simple-vector) -;-> × #() is expected to be a type of SIMPLE-VECTOR (got (VECTOR T 0)) -``` - -### (like got regex &optional desc) - -Checks if `got` matches a regular expression `regex`. - -```common-lisp -(like "Hatsune 39" "\\d") -;-> ✓ "Hatsune 39" is expected to be like "\\d" - -(like "åˆéŸ³ãƒŸã‚¯" "\\d") -;-> × "åˆéŸ³ãƒŸã‚¯" is expected to be like "\\d" -``` - -### (is-print got expected &optional desc) - -Checks if `got` outputs `expected` to `*standard-output*` - -```common-lisp -(is-print (princ "Hi, there") "Hi, there") -;-> ✓ (PRINC "Hi, there") is expected to output "Hi, there" (got "Hi, there") -``` - -### (is-error form condition &optional desc) - -Checks if `form` raises a condition and that is a subtype of `condition`. - -```common-lisp -(is-error (error "Something wrong") 'simple-error) -;-> ✓ (ERROR "Something wrong") is expected to raise a condition SIMPLE-ERROR (got #) - -(define-condition my-error (simple-error) ()) - -(is-error (error "Something wrong") 'my-error) -;-> × (ERROR "Something wrong") is expected to raise a condition MY-ERROR (got #) -``` - -### (is-expand got expected &optional desc) - -Checks if `got` will be `macroexpand`ed to `expected`. - -```common-lisp -(is-expand (when T (princ "Hi")) (if T (progn (princ "Hi")))) -;-> ✓ (WHEN T (PRINC "Hi")) is expected to be expanded to (IF T -; (PROGN (PRINC "Hi"))) (got (IF T -; (PROGN -; (PRINC -; "Hi")) -; NIL)) -``` - -If a symbol that starts with "$" is contained, it will be treated as a gensym. - -### (pass desc) - -This will always be passed. This is convenient if the test case is complicated and hard to test with `ok`. - -```common-lisp -(pass "Looks good") -;-> ✓ Looks good -``` - -### (fail desc) - -This will always be failed. This is convenient if the test case is complicated and hard to test with `ok`. - -```common-lisp -(fail "Hopeless") -;-> × Hopeless -``` - -### (skip how-many why) - -Skip a number of `how-many` tests and mark them passed. - -```common-lisp -(skip 3 "No need to test these on Mac OS X") -;-> ✓ No need to test these on Mac OS X (Skipped) -; ✓ No need to test these on Mac OS X (Skipped) -; ✓ No need to test these on Mac OS X (Skipped) -``` - -### (subtest desc &body body) - -Run tests of `body` in a new sub test suite. - -```common-lisp -(subtest "Testing integers" - (is 1 1) - (is-type 1 'bit) - (is-type 10 'fixnum)) -;-> ✓ 1 is expected to be 1 -; ✓ 1 is expected to be a type of BIT (got BIT) -; ✓ 10 is expected to be a type of FIXNUM (got (INTEGER 0 4611686018427387903)) -;-> ✓ Testing integers -``` - -## Other functions - -### (diag desc) - -Outputs `desc` to a `*test-result-output*`. - -```common-lisp -(diag "Gonna run tests") -;-> # Gonna run tests -``` - -### (plan num) - -Declares a number of `num` tests are going to run. If `finalize` is called with no `plan`, a warning message will be output. `num` is allows to be `NIL` if you have no plan yet. - -### (finalize) - -Finalizes the current test suite and outputs the test reports. - -### (slow-threshold milliseconds) - -Set the threshold of slow test durations for the current test suite. The default threshold value is `prove:*default-slow-threshold*`. - -```common-lisp -(slow-threshold 150) -``` - -## Reporters - -You can change the test report formats by setting `prove:*default-reporter*` to `:list`, `:dot`, `:tap` or `:fiveam`. The default value is `:list`. - -`prove:run` also takes a keyword argument `:reporter`. - -### List (Default) - -The `:list` repoter outputs test results list as test cases pass or fail. - -![](images/list.png) - -### Dot - -The `:dot` reporter outputs a series of dots that represent test cases, failures highlight in red, skipping in cyan. - -![](images/dot.png) - -### FiveAM - -The `:fiveam` reporter outputs test results like [FiveAM](http://common-lisp.net/project/fiveam/) does. - -![](images/fiveam.png) - -### TAP - -The `:tap` reporter outputs in [Test Anything Protocol](http://testanything.org) format. - -![](images/tap.png) - -## Tips - -### Debugging with CL debugger - -Set `prove:*debug-on-error*` T for invoking CL debugger whenever getting an error during running tests. - -### Colorize test reports on SLIME - -SLIME doesn't support to color with ANSI colors in the REPL buffer officially. - -You can add the feature by using [slime-repl-ansi-color.el](https://github.com/enriquefernandez/slime-repl-ansi-color). - -After installing it, set `prove:*enable-colors*` to `T` before running tests. - -```common-lisp -;; A part of my ~/.sbclrc -(ql:quickload :prove) -(setf prove:*enable-colors* t) -``` - -The following snippet is a little bit complicated, however it would be better if you don't like to load `prove` in all sessions. - -```common-lisp -(defmethod asdf:perform :after ((op asdf:load-op) (c (eql (asdf:find-system :prove)))) - (setf (symbol-value (intern (string :*enable-colors*) :prove)) t)) -``` - -### ASDF integration - -Add `:defsystem-depends-on (:prove-asdf)` to your testing ASDF system to enable `:test-file` in the `:components`. - -`:test-file` is same as `:file` except it will be loaded only when `asdf:test-system`. - -```common-lisp -;; Main ASDF system -(defsystem my-app - - ;; ... - - :in-order-to ((test-op (test-op my-app-test)))) - -;; Testing ASDF system -(defsystem my-app-test - :depends-on (:my-app - :prove) - :defsystem-depends-on (:prove-asdf) - :components - ((:test-file "my-app")) - :perform (test-op :after (op c) - (funcall (intern #.(string :run) :prove) c))) -``` - -To run tests, execute `asdf:test-system` or `prove:run` in your REPL. - -```common-lisp -(asdf:test-system :my-app) -(asdf:test-system :my-app-test) - -;; Same as 'asdf:test-system' except it returns T or NIL as the result of tests. -(prove:run :my-app-test) -``` - -### Changing default test function - -Test functions like `is` uses `prove:*default-test-function*` for testing if no `:test` argument is specified. The default value is `#'equal`. - -### Changing output stream - -Test reports will be output to `prove:*test-result-output*`. The default value is `T`, which means `*standard-output*`. - -### Running tests on Travis CI - -Although Common Lisp isn't supported by Travis CI officially, you can run tests by using [cl-travis](https://github.com/luismbo/cl-travis). - -Here's a list of `.travis.yml` from projects using `prove` on Travis CI: - -- [Clack](https://github.com/fukamachi/clack/blob/master/.travis.yml) -- [CL-DBI](https://github.com/fukamachi/cl-dbi/blob/master/.travis.yml) -- [Woo](https://github.com/fukamachi/Woo/blob/master/.travis.yml) -- [fast-http](https://github.com/fukamachi/fast-http/blob/master/.travis.yml) -- [defclass-std](https://github.com/EuAndreh/defclass-std/blob/master/.travis.yml) - -## Bugs - -Please report any bugs to e.arrows@gmail.com, or post an issue to [GitHub](http://github.com/fukamachi/prove/issues). - -## License - -Copyright (c) 2010-2014 Eitaro Fukamachi <e.arrows@gmail.com> -'prove' and CL-TEST-MORE is freely distributable under the MIT License (http://www.opensource.org/licenses/mit-license). diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/cl-test-more.asd b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/cl-test-more.asd deleted file mode 100644 index 374db79..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/cl-test-more.asd +++ /dev/null @@ -1,5 +0,0 @@ -(defsystem "cl-test-more" - :version "2.0.0" - :author "Eitaro Fukamachi" - :license "MIT" - :depends-on ("prove")) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/images/dot.png b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/images/dot.png deleted file mode 100644 index ca3cb6a605a570a9aaa62d1df7c58958bd822347..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141441 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 z 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 XmcRLZEoT`R7#KWV{an^LB{Ts5;?(gX diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/images/failed.png b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/images/failed.png deleted file mode 100644 index 5f0abd13466cbee5e64920d1cf7435e6dfc4db05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159759 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 z 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∨menw z`0Z*7UpCHu@44UlVQD1K6-9>zhQ?CG3*T?HTgUyl_GP-c%_OtAI|4qwV3PZP?Ap)% z2{#QbWGjz++J8>I_|e0cGv@6$zW;ycKc?4f>ix>^n}69IJ#SXs-=5y$`hD{IUUs}Y zzwYV%NhSAt@B2)z-}GGR)0K60_Yb75`S;~n$-`{_m>b{Teff9)4C}$dwH@WdIi+|4hvMbwew%^_lKX%&o+y1?NNw`0D&bIg4;2nR|DD;r|3-*Unl761O$$~@-R?3cGb`+F`=xz~GqS@FH1pNBpvzq}j&hHK5y-Cp;vivB(~v-!aa=Xu`R@$$<%_Hx^e64v*3YX5!SeLv#tR{Q;{&)XW$ z{igq4X|7#(!~Ge4md`(ZX?+(c*Z<}J?u$t$bo9DCd*^nq`!)I9zj^wz%z-G9G9?C&G3-mkg$x>wnKTm058 z`c~Dl*D+qw_oGj~Uwm!7zHPYq-`6hFw=`W}X!BG#``u%)Q>!n>`!lVMPL1+EU!%YO zTKo3WqnB46FAx6vZs)ZmQb@z1vswaUuI}-)D>VZMOXz`+ebFXM4fQrSsDFznRe5 z&wgW`-Oqc4t-qg!-#4pzu77XZy1hRysxJR?c-_Bm(l1N*fBU+PH&qbSOqnH8@r-}3 zQf$pf)t8e#pPy4vEB}8p`(*x38->bNL zqu6%W582q;@^QZ`R&Tt?uNTI)ZMpmOeaq{Ue!VvP@3QMt@OIsK+j;i=pVq%*GoSUs z=k4W7zZ{#qPyg>RcKhqKOu2YI`eI-rl}UzvkC^ z@%F!SKkEJcX?&*a=&t(GgS#*HmLHwFY0B?{^ZabPzig5Bc)n-x?(ft8wndz(OnH6x z<@$en>gsa8-@LRgHvib`m}%B&8y4Mn*W6lHdvdzj>+79!E`PIna^~#IKi+zt;`8f0 ze|=p1cz*n+J6d&yeq4?vB z(?4gN&i(Sa>dWb$MeF)Bk30W;ysP&A`F9)L<%;JY{q=?U(!-yxzYx+83@*F0S5eEIymuTQr8|J%Qmx$lO3?c-zXm-ma`|GDLt_`cQW&A&CdZCf60$bGq4e$S#`2V)kOOG)0S{rzjE`jW--r|$p$cEgu1ytgmK*M7LvSiJ7? zbzAQpT5IQQvpn+M<`a?Wxu363 z|MuMS^6P?I@0T98`*Z76?EBqcUw_~Ke%{Zsca{II&a5+!$ZP+#(Qf71>q+a2?0$XS z+4f9X?^efaz0#Xo`FfT0ul+vuH0sOZvmXnu{4JW3oF@DI>5-jo+jk~xmvX;v_w~+< zLdoFo$uZj||N0tb+1Hd-_pY)oW6t$c?njQs^eonWo~*b1;`!GX^`D>KX|+s-|LgY` zOxfwrZbUM<+v@(kpI;YcwdXg_J^k7*eP3R`ziZlhckb7cuubp#_x`)_rQ3ez!rzs$ z{Y$>juPy$ycxuizw<6Jq>nFG$8gU5R*v;y*@{5_rI(D^*Q=}`TW)KD-S&LzI68g z+dm~K-_<|=*}eO-`-D3a_5Pkb`|{G=&#FF+r7JaNbuSK7(7pZQdHDW!(;rvWp4p+V zcK&S1lcu{_GPS?26ek}`^|{+$c+>CI_3Wn>T(f@eeExG`VVt(Spm?!i-?lmZJMXyJ zuXo=+NB{Y&8AUc%!V}&m$g*(ghzBIZzDsmzU;vG4Y~kLs`Zr_N^BgOK+`YfIeK~sm z@As1E?jrVuC zz30n&C7+ku&C#p6J9|%YX<8sBNZST=PK^!kJl8LK?gX|HG??AM&^TA2;PAB7m!x;M zH$z->BhaC-)Lqz^g+t(mGRryZ_j_y~RaOXrjDXq<8U@$oej>l_3Dorvqd>t0_D>@l zBkMIb6HQbtP)koRajkjBjO-Dx9*|}eE{zRlhdh-L) z2eB00`J>)K3YXE?LZsr+LStCfi2C&H_M+e|Wwa?Rz2Wj?umsQr$7y_k!n<(Y_ZV zk1#MYjTRY*;2143MvDw=)#_-Gfyg7HMFvtHacCGVGLV8}w3RX1%0MY8;K4E4%0Pt6 zXpu2mWQ?{lp!4#hBfLnNVRVESUSY6s;2GiF5T876%T~n?M-HXB>^56>DikRUp;Jmd zf+tMpR`hg=Z)Rf^i70>HE!2AP&O75rL9gx?Bp12mXt!W2@klV|cDbv5%W%5z#+{{a z)EHT>U2T;wHg@;PTQ2Hx`bN#t%a6jp-@JjjHYA~(^U1D&pEJs2larP6Zq;3L=hE2F z*CNGn+C0T>k*rq3v8ukgBEp3i`HnuTl|k|%)Y;Yj4(r6P_AgA2Ki1pX8FeLK%}-9I zx)WE0{O)*M)LZ-JM)&NJ<5QQ;?2z1iKWLg9X4%nrRahc=ao3K_^uDO@EtemC|53_% zZRx51Tg0vNHW`|qpD`oz`DQ;v4FvOgf+_2PmW(<@(F8{TuB zz9HCu^8C{`lBeC+Sp9C(j;}EZvfTTx<)7KHZ{PFab*}s0Kl_nqUg>?m$r4(oARN(X zsyQLsa_6$kl^2B zt&yxaV`!FlCQjF|_WAvr=Eo1;ZMC~*yYFt%!6Hlp%T_w9d-x>EZ{5o`Ym!&UT@BxT zEAsk<((d)N^k z(lEw`ZLCGS&->m@%(mLSs7$1E)w_~z_xpDqJ<@y8Q+Y2rsqElVKf9w)*LK|#etfl# zt@8e_8J4|i2zt@VrYiA2ypEo(_Q`Anm$1}PM_f2_mJzMv2(R!o( zcK%0r&mOOepI!WEBKN(*KAXO}ct6|e_rw1EaPs@d)4zE4aYn2@`_1}kcc}dp+kH1} z_g%An_f~G_G-3D1oSr%n`_pERKJ%aG+F>JZxKS?qY0cgKJ)XI5#B<+Rm&p`r=f3{D zu4I4c>HGOt%WiEpJEb2XV*c5-H@RUh3~xUS0P^uL`4s{Fs7*l#HRLQejj z+|RFn|GoRT=Ut)4_W~>_)T%LN@z0>|KfJ!*xM#cXmhGqA;h&YS7e)1LS~lf#vP|jH zX|}KDEVK>(Ec4a!`rC@Nq7jc>yP6)aYk6y3J}>%gc4zUE=UXq;evW%uS9$(@N&lbq z3P0mrKHWaU|4OdBtl$2<+|Qbyg6}8w7RKLheJe2i`KQ2lfql=##IGgS`9vRkQnzp4 zrxVX#Tem&?opcto;2e?c8JV)97pyD15+1$&d3pY^z;&+mIkUfO+~=J2`BY)t`Qncq zpO00n=(YV+_3n8;(~17IcONf&XE^1$?%Ed`-(xSjg%;i0Zu7|I>78}2u3z7@`kZye zyscpgvU@Jf-7_J6#;%0x=H}mwPKjH6PmYsq|0tQow?DJbx&U|wtS;} zao~@h!o1IdkN4G`@y$BDb=Umkh4=30_gmCkF87BeRcKkg#=mjJT%Ook5wqmIJ?~#1 zzq4dp%gcK3PNw!eygKa2Vvzr8Yh z<$+o86JjGxx}_6L&q-EKJ+Jue*cRyZ39Z zhrOTsUHkc~zrT+O%4Zv%dz&S*@qX4D)3W}nyS{CFF5MID&3f%%_Z?2|pR5tRi<0(C z(5;?o9yine^wy(4n>C6~|D4f1V`J`4_j8^4C2L#HezNS_%T|a~@PQLr<5Uip+QsX2 zpTDZR;`piNXU5KHpj@-ltnB>_>L^J8;%_sG9GF1~AF>1Q+x5Bw6G5vIT5 z`st4W_31XhEyDBK<<>rbdprNy-czqw)|06( zR+p~3R(tH3Ys|iHclrzSj$63aoIC&Vsa&OApJBCYPTuL-;>68gW7kx!k32uO7^CKE zjAU6f&2Xje^;320YNtGoJU2VJIPd=AxYLg_-S_(U_3zxc^YWutUpM}~Uir0R>$jEP z-%39(e!DHXTr8se=;U)dbXoUS1TON3+%|cg^`|1AFUw<{zh40wPTa~Yvn?$fKEo{uAoigIK&KXLWTJ8gUF zXX*X>!Q5+pvd&)GAg=#G$MWaV`KJ2E{daA)lCQ@^j1ue@KBcdJrq+d1v$?cX|PWSq8L z_LOJs_0Lc5eZ94$&^zwj&BuMQkqNv9u4-L*D!%xhaew;V{if>k>o4t0x_{@HyItF( z*I!S}JsyU{88okwn=KSo=3iKo%|^&ciNs$RZ9BbR^E>2pOf)=hlG1g&+%=SzrDS^ z{7j~8{{4N1;qT;&t=Hb2%6jc;osi@zooiPgXFlhCQPh9+gy#CiZ?0EA-@5U-Kw)LS z=k@4gM}H>eUE6bFe%U!Az4@!{{O9cNxeQv2jnd+o!gTo+``0SVcdw7fYbYI-*KcRauA7*qdt<78(4G^? z-#Ut2qu&L8Q(t@h=c2dP`Ej$i$UX0xkqmyNUH|W*Pc@R0k3Th>B5Y`Be$UPR z^>NlCa;esDYf{(Pp@f!z!iI9LDO-EMW&YxMf`*e-ihXQ~V!o(9on~13ci-o$g|&u; z;m3}}+&oq_@ATh=$(N$eb$-og|JM0a#@x)T=vCR$pI_^&OZVL4TBCjNg#MW=k7D;! zX!mM=pILHm;noxSxA$dteJzmeI{CRY=gE_8`ugYnPn~@IbH=pj_5C-C>(ap+#E}zJ zbvHa|FO8K9KId+KtysE$kJ#Uc{vVrklV8=n2|VV$U*GK7qP5ANcD$FEb$;VUvFfi+ z-D8gM9X%suo;lw(E!S2w;xl)Q`0HbP1d>08DeL7OTKM|RYiGmB*B(_)Gpt-^=l@3b zqu}J{uW#(RCO-f9;~A#Q|Lthl<6qmi&-QUmZSLIr;>mr;t^(CE_nB7z{r`Vs{Fa5n zkN5Sno-nMmO;S?7RiyhXRk|=$x_WBiMg7M`_Rkity`C)ddgt1H&ul?yL&J5q_tn0h zVH5Xu$1j=W@9RI8{j9JRjfgJz#BI2Cfw`L6eCxO?`~Iq}^*zCw_gsDzqX7S3ZnPEZ_JVckK)8`~Ax> ze0$*b6Q4I;Q@!x*G?_mdA~eX z*Rb^5F3I<2n6e*y6Mb@wX>CgX9P5{NlE0lZocyTmoZ#n)@$tu({LB&lxienAQnznk zZL;nyE462*Ym@Z0*M4-~IPv;);q1#r%6{Hxt%Nswk@Mo@lwzMFuKQ)aKb=;Xx?kVy z{8Yn>>ywl1wmTnRG9zMj@#&un_o|TkDIqRU*ER+yM)dCb2=ON=9Q@H zr+o2b-EX*j{xFsXGLc&)NRa{4L)~0yE5k8+~ZFTOV$~w{n~uQ z&F@clz+b;>JDydYKhgbFBAXKyT98(KqiuXblx@PTDh}SGu5*>H6^O*7Les_xkBQFQ&gPt=nlPB5&yY+WGTD@#i|nb^q4Pvwd|Vm}||?)|0He zGt~EbOip^lDyQ}DY3=V%>QA3;-S>50ZPNdJKlV)Pk2wAJm(}U5ReR%3zkX_%yZ+jZ zA53Dc*DTIo_hsjk7yG|TxX*sBF6&%5(OB31xU0{WiM#b~Z;eVg zyJNG+tuQI;mo*#3a{oGgKl^;=zMpeuKmQyUSA6EG<?vYgX9UQB`O&9M8XcYCgA^t|Nd z->zphmcE&MPXE9Rr`tDnEd2cK>GPdccKx3(misz?EX_Ic^=!Tk7~X4Nd}|H{Uy?|>)?f}*Iz%~@y7k`!a1*R8?Sdi6JY--$@Z2_ z{I~W;N^08+rxZV}iJQMAZ2j@Ni+pcIU#ChxpJ_Jz`s>=$a}57({F(gt*qq|&$JcCS z%1+=DeHqp8X`b_M-nsc1cIWPIe|{n6oaXhU_nE~L!?!*CeB$TE@V?HiMeF9A|68Sd z{;1$jL%A+lY4P7K(v=(YYYv`%-L-b%60}@fz1-mnciX&LP)kP2*>e8(uEO}}^HZPe zT`#hiOZ9noye2;S*tORi%}nlZFMo0++c5r}Y390^?z%0N{R@@9t-s#>OgZn;JV9gc z-M4<9EqZtF#@4Wew|h@y83`;-2-nq@es*Kuj)gzx*u0L4ubHR)e6f74oxj~D3;Cy} z&vsVXeQLY*%q;SR^eyef94&~P}jx&%b8QZT;lDYy)yfD`t#GMc>CjSF*lFZY_Fu5h8Qjwfx4S*#d~Upb z((A28`+7QmZjz0P@BLZSf2aTTn%}8+X3Xg5uRS#i;158 zcWXcb@0o>8wDPstxwDVg{;afHmzrUF{LLBVbNh|YC+4H3QHO-<96qb{ue^S`V}1O&r|ANZ zH|hTVsPj3-MoIrsl1%QAsc$bt-LIK<+I_CQ{cU^sje^0?uK%@CJLX({q-slT;YPD< zXRCdzmaX+abv9f3?EG#2SA5+XkRV&UP%?YP0<%or_jk9;{dhXBws`WowRg6kJNvlE zcHQDRtA7`+tMRSWm9I727qNnU#EO+ zD|#F8p0>f-Z2{}2KVDdOt!L{#vuCe%*vMz6MxQ@!k(4w)^RuO%d}_>_i{|0Szx5{T zZU5O(`^^3G{%ggxkB#br_Mbbuv9{RIK6m}XuX~=)vJYE*Aj{ z>#^n3&tGF~&qYtGep+|m;`r0r<4>O7sOqw9N-eoX#++P3Xn;Q8r~zh2U}4XZi3Iy52nW9yq1UZW6^&uMq} z>2J?pcV~N?{_#}%qEkEXoOh3Tf59Rt$@Z3&{-YvkL+4_{_+w9Z{(52UE}QIwRtpJa z2+jzbzT*1n!khiY$M0-0JN|rzk>0PTQAdtM_54oy6l15PR&?x)>zgHacAoA2d%Ez; z;@-cXcD(uCtE_&@s?Nvn$+xYwzrP+`yL;!>n1r)00tt&{8T z)GU5gC-+?0e*32R&rjWuc)qPiH(AO4_>;vwv**A3zg2%-{yO{Win3|8ML9BGKX+83 z<#7dYsmXig^;e52Np(@PAD^DFukOf`t)B!xU;MUqYH{t~g?Fm<$vm%wVI=v;8kiIbjn-tcLZ?CtIEx6H6w z-lKp0Ro%Y6%#DS6E!XLrT`QLU?H&X1{Ua$*O8Itn>g%2MYRk?Us-ZO+)d#=20XI%HspDUK`J-z47`p-!+g@t_*?z6w2|64WZ@$YA!YV4Hq>rDP<$7Da5 znw|Vh`>cF1pCLvXR5e)37r6fV;|m=>7jEm(PCixFr+Iv*e81KHIsJ88Hv0DzN1wm? zIMeX6wa)%|H|)Q4&B#bTU$ytl>g&s%ep}1`R&Zl!bX@peGn0AKjB{%VJ`&y*;==8RC{!+&+7xmsKk}2NVTes%9nf&Bu$+ZGPiI}+`M(nG`(>sZ zKCO|wZEmlYALJ8v+I>#?iun1}8hYoSD?eHs|4zPmXYb;k^Tn5s)fzfiAN{i{tNgfi zM0De)Zqt=7!r$K(k3WCbYTfz3zSnz`*3Mb~+wfej-J_pJYv!H)TQ%o-aSmum<<-v2 z$3Jy2dRZ)G>m6bruUNkscJ%cX~$AK7F%iX=hJ<{HgId z*=BpdTHo&OIh)Q}Cih#FT`RQnpKJW~&gNtOxAT{;UB8^^bwo>#eCsKr<@4s7yo)|v zeRN-?t^Cs+I%$5dp6|J_KY#v>?J?bTaoYW#Y%2HN+uqY#H+S;$-_Mlxt?&K(W$jFi zRpDo}3_^Z))V}&!6?6P()!k`@plZ#?DZ?F5#lwIdoRA|swCG%N3^R?~ik6GV7 zo4PIBoPXbDdVj~sza8CMGd@Sjq}H72%?+Pq{Z{7b)@PqBAbkXQW!<EYmH>lG^g7)eq)yFb_xkCro8~8<`go&G zcKY$JF>mf}HxseeOwU+5r@t=mbKv~yy0V`&M~+6_oc43_BPI2D;XUoQHWp5_&#rm0 zwrck@t~Is(dJBGW%`2_xTl;v~*{^G#*S`MT*QuTS>sO_o{UeR;IfC))p6{rzGmL*W z1cJ*?H$j>L3p6+h^~9pDup7)$?^~&b#NzMT^!xe^t1%KJK*pnW=w^_U~NqXu8!t8S%uuzxmc4|8pU3 zqukpYJ38(^eH*2}VOvwmk9|z{*L?o@C)Mvu@$7!j=N&g>#Q$b|j*+R@sTzwe%DGX44|LDsW7`mECJvi@DS zT6S-7kM8fnKAZ4wzmKKPLm!lJNC@Y0S)2UE^7M~|b@#NdwcYBFj5`1MY1B>q;?qAp zEjNa3e;Rl3e6HQEq~toi1Vy!HMKxbeZ+qkJV>$izQ$vy9bJIWWw9j1IcQ^Ui?{_Wf zLPrl&y{_6P_xwkd-m#0<3=QvJ|8~~3F0T9Q4DH)@&bv#Ri^zXYPD(zX@w@1AluYt< z<$ZadePye!WUqa^@4iOmx_rC&i({m_G}o&>TC98h3r0^mI3en+!Yh`G)3{RezJQL< zcprT}`)iHl{q14reWmNm6A#N=|9;}M;eG+D>r;v^_HR44@_DlDtvzyoTl3z3es^2_ zQ&PXg^xQX*+fr-JTrd7wk#TJedx1#jbGIRu5tcaw-3?)N!Giy?`M(jubsVh=Q<0|eBCN&EOLK)+%dn` z{A;KGcJsOWEjC|L_;1JQ#}>byCF$NWQu}rB+fkmgS1kp%>)rYqmoT?wPW+68Nq3iQ zyb&mPE zopJFmExyISwEKh}!dvwNt}~u0yxE^FR9qUp?)%!OJ7=8VXxO)NpIK7dqtkQt-8i9r z`-OYWUiY1He=~j;C9Ta%zHcLc{6ftAnkO#SnrWA!o~%DzRxTF7T$(QO;M2XY`)Z4y zc8A6JOWwZTztd>>J?;7SkCJqc?d-j?M{MKMswZEzg62!~zV~d+NPaJI{q2meb0(kP zI!Sq5;Tt=_`1!>-b#v3vYq~YIjSK((m)~{CsBXpl;$+=hH}w0H^=@_OUq7|;g}ZcR zYR#9$y2;6U+YRM&*Ia!(L;tqXvN!HNXP%n%?U~k}@!b9M{%=pG7S{eXT7GBso9UH? z_szw#wKL1F?OVJqvs^5~J@$c9fZME)0PX9i>*g%Z*IR$IW{aSF?iqLMDU+{1?s(lZ zCnMSRSn2HRpJVP%{J!S;uV=4j?Asfbt#?lJy!p4erFNed_5P8#{`>eI^f{y(#VoI? z9R8kBTRT1bV!zq9&cZE~cAzwHhQBv?-ifc}{Qc?;^>W6TdFi zIw>?m?PZCPk?$;d;fy!mX6ZYtulw>Qd|&W-8%uw`HJ?v*uAC@*+W6_pueM)0_WJwk z#M_2mcRusS<8}2voya#ct1^zf)Ts*g`G2K;=eIoZHL?r`UIl%86};JU`qwGT&E~q! zpCPxU>ubTgiGAO*AH6=m$3~ac|D9v9UV0V3fB&1uw$=Nu|F~G)Yv+1z<^0w-W znU*EQ?=6{~7No5H$u9Ksm6=zb?B4kP#P{`c=bZlcDSh7O)pGMfpYWVZv;Uf<_cb%^ zQdZj1&HZ*?r+!a3rh(zK2?x>zUwmi$`?mkr&C`3z0)%fymu5Y2FP!E1R_FcSe|o|D zw^VKVzVuIRebvjcLy-e0ier9<-CQJMM5`U@PtHS-)@1FMe%zqyH7ybWE?+Y&X-|Lk*`QL);CB5)a zLIjw+&x1GT9;}#e`>E?mYpc!ID-P3ZpIvgFXS-$2+)wMC_G$X(ns&EG*nOJ&DtWa{7YW%)qB6>Y2TLzYiIcH4bS>(yL-CT z_l=Kp%+f!dxpk87TYT@EeOBe`?e{D1|DTb6PUhzuPt>RbIqJhtmS46G>wh|xJet_o z9&ztfchhnV<8n$JFn-mi=dC zdfeYQHVxm-aY_Xi3&FUHZK3xfpvbC*S`G4(W>sc>1zkF+X zufO+w)xjwH6?+_Bf3-bOUiR?hiJ6zHm#+WiUiwb+{>8)VrasU3ms7U2_|i|gs^HkY z=ayxMem?h7cW%4g*LD2+1F^VfzWajv;!niW^gn+J5T3c(%JkD>kN&+^M9Yhwb)0$n z=E~{1b6@tH4~p-6x>mhBIDJjc*AM$v{}bK&{?*s1vHqX;eQFYA_HC_Jvzzok z&zbw>%8AZ1->Q~AJ{=L4RrJjG+V01zEo>{6-7`77@8tZbUsZAYM6Z9DmcOca->0fm z;r{Rb2K~#rx%{|{=|tNrZs^%@LIaE4^aHQ<{|}F!^6$*Y^4?hyc123JR_WC)Z&&}T z{r1G=>MN3!=}F&CtPbZdJz7=uC+PpHD=vTb`q_Sdw^(hNdGRmnLeuS+%FE)u?fLZo zN!Rq~*q+kb(Dh$#`S*9Y&7HVszj&4Fzk`SOg`T;Yx$OMIdnX4r>K7{~hOd`<)%E26@8zGjyB#kMd48_`+8@qZHhJsI-ua?8ry6J2E^C+ZfA`+f6meAg7HT`h4rhad%rGzncjDzuj}q~(|wui z{-x^X{|)y49^(7HKk>)n>P_ctzE6qck6OQfSA6{?@A_}cZPJ(Rn}sFs+P6FGXMbTD z-{tqF>RLs|RptFc;c?$W?QLg1R`j!dwmk0a)#mm;{Sx&T&dW|VJ6kTFeRJ!o<*^m} zwZE0uov5~X-1JpZ-%Ll7A?8}D_17~Wm$>=ae7dl@WB+kw{$kT$|Gm~feAUq}n^teBTCsoC|CEc>6Z&sf1z!q! z&)>6i{{FeA`r;P*8=gODmtMrTcU}72pQq}V7{|}6%Ul0jE^9HiFr4miPxeaqw^{n{ zLCI$2*FD$g?7UQ*|NR=z|CIjNFDrJl&-Iu;`9R`8~#5_4PNugr2Q=`qwjm zpa1u-yQ=%YJy6}G{rb%6_)^=g+vmlV@3qO8`n~<$hTY<9pwPulN72-tJfb z?8n89*!8pI3NO7_n{+>V-^tshuTGw>j`{fHjNiGuJ)*B4)>i#n{`0(i#kogW?8Q4j zFaBJ3X;RPki*3-|*SR zo9?lKy(g@T)vC^Y*|}=wX}QYx>r2kf`LlEXFB{9|v?+*+7F-xIa(X;S7kcrXVehlm zyZwCU)LcFNZ%VoUyMy*euN1Lc{=L;ctupI{OV!TBRW>hT!;9cUccPrc7QuJPHx+`D16X~}<>6vBp|IK|@?oO`yc4PXjQ{8?k+p^|eDN?We zdE#TxcRB0jCwL5PC%f5K&%9iJ`^S3qeK%hv?c{lX zYvvp8{k}4MV!XvYM)_Z>^kn%3^N(p)7yCbr++2L=V&9*aGi%Wb0v z;KHTL)2H4y-hJz5z+dZsY}x_8j^5oXA68wQzCOD?Yv%WRtMvBH4~(*nUBBzx3iZ$W zPhX#(+Sfk!&B__|%A)Z{-#k2TSNYXq`rp0brQersubOjk-K>|DnJ*7duF8sizjsyT z4ewlRVfkFhVi)_2stlJCDSJyC!vOGen>g?6Y^{cnO`tl|2+sBRi$=`OJ z>+7<4>At$--qyRbHkbc>xm$hyxxMN4ue~Y%!y6W-qyMIF%PZN+&C@H-y?yc2^Zpe7 zsJWBs%iVHm&IjmZC3x9$-l3w;$*e{>)7*IYWJ5`-`n=DZ~wt67Uqu2 zPw!ro**oieWLDDmwO>A^_RqQT`-!vs3x^%;o7*7ul|~W?)c^@^omaE@q+k?85@Vi{;A2t0Ssch4YKIAJPB%-g@KWFLuq-ZeATC8@^|5dY=9l z{bYX8!7A3U#`CAmvy$E_sc+hUU0XK(Xw@s5PxgoGqn^I_>9;a`-uW%szo%~QzPmTR z^y?+}dA~0QSA9ES{4DO=viQC89xo4{xO|Vzn?>h#yn0&m3u`rQ18V;7|D{@cK5*{d z&2#KF-dkOirS#r=uHom!KR+!kH$Q&d`ipT@?|hH_=hJ=X8Cy=bvMe<1{UAB z94vQpM1NKP>+yPT=-gjg>&xT61|6Rs^>nXZeEp@(ub%2ZnDV@DW&JYW&!(GaIjdi* zmVdg}{OZb5zR>5^ezm4pT0eDmjf;Obzxv3pQugZ0H=F0$>)CZ5hd+OP{>wvkKU$@8BiN>Gy_7(jR{VjRrrDy!p zuWR;cKHop*pC*=idASg{Uak)Nw@&`*P3zMyg+K4T(D!Inc=e|3r_|%CUM?@2_I>86 z*NN{m{wIIw*JrYS*|fFpN9D_HtAg!MSMOhORq}=C=Z7^VSvD`Oh~AtY^(_7G)am7G z?0!b-=)XU+`%_K z8~!iWw$}Fiu6v8Gue^A>v*L%@tDfLNc8Xu9iRYObyPzl%-Z$ zl=R*|-6w8~T(SJ#bqm8){P`=t8K19v`gMc)DMRKGMVx3_Sfxs@y2QW-Y0vf8$Y?*e=qs% zneui2Cc5>{_;y!7UfBKq!f4*%omNaMA4QX+2{8avT z#k;*W+SN~ve46;(;%ncQIqLfLwpT=dE`PoEo$;58oBh^)srocW|LK0yXB|IgoS(I) zy1Mth#yz9rE$8vg zIc@jT#QXibALr_uzrH#yx?zB^={=4S--fPGs3D5@4 zA0MW_b&C5xt(d;=)aBWhb|y*ZmXs~=-#hE<&$#cBd$i+URTQ&VzJD51S@A(|cbw^7 zId%P8BH^DWe^=g8zxRRe&J1hoS0~KBp4)OS{_5m;QO~~eMyAi(d&T%Y&!*{?`#cv< zH>~|LDQ$mINm8ce^m(T~pOpO6^`v6+yk9@GzHQz--LksMrypB5&i7sLzr22Z`Tlj! zmbKS@*`@#c=IxWe{n9$FuAeij!lb?Z1fP;s;id4si;Fj3fBv%YTFCP=6ZO;2f7PgSwDlr>uGq}Ib@9Jd<}Wi`&aJ;;n)T?(SvgC?@@Zx-U!MFs^LfmxCwuq*I{Iqg ztoeH~j(nPXcAB{T#%C8Uu2>!JzkdIf{Z_>i9Im_nx ziI-1hDvy1c?l;#`YGUQ9o|*4|{IXpA)ARl2zc#OWwzkKA&aQd5juY9A<-I-*c z{Jeheac%weW#_Cu`Rp}*yC&Y@)aBa9?{>CI*2_BDrq8gFni$uA^Sy1B&5=v5PtKY% zz=)o#!|-okYNhfKNR*acJJ>^=WIC3=FWGQ6H zS6_0zxA%o;f7MIl>DWpaA&XrayD!b&Gnvh^>d3lq-~Jg<-^=+;3qM^}UdFywsq*W| z>LuGRy$oNo{P&9eyW;wY(RpZoj3#}8$`g!-HF0xA=jAg?me#*| zF8RbIt@DMbdhfrrd*@c#lpnu)dd+VBU;kOH)8|%({q^+M{rqcM-12MHS8V5shlihwstm7UoLRLpweDGb<;BjO&po2Q2F))Et$%uO{@*h%{SCLy3qL#gx6%5# zYcu^fXVmI_UH!A<*;UzJSW;C5KU4ocj_9|uzg#iWH;PQ3cO__kk%`jg$nbmFHKLpQ z`#bVK8CV~U&9zcb*M1&Zx%z&!cJ9{KKFjA9S{eW5Kl%Ub1l?-ybuk^XmEn73_f}WM z#y7b=dA*`K=4^?4>95~;uVVdw8K2+m^?Z8gjC=FGNB%P1J!^i|ni`8_D-<_S8VV|LZf+N$9!JCC#$JQlUqxr0yltAL@};8s zBlSh!BWky3$E9^xT4z?Ci<}>OWU77nBh_y+jcd2pUv2-t?uRTW72AAX_bdHZr2WE2 zs+ShOE4-?|w|Zr`@!tAvk5A0s>~8tq>5cXJYpZQvY(Mr-Zu`4JKPHUK)c9U~!>)qe z-_M3s@2=Z=?)#~mbLZSV+3j{DT5zqqP3-b{Y2|5s&o&*`Q+h6Ru`~SZX3Jla;pt1B zC;rs_@4xPs_xqR$b1VCPt(LR;_-5~=>6K>#zn?hg>3(=}bhv2oTen@cJ+kC`>|Vc9d&@(<$G!E;Jr(>oW{X_- z->a5q);|lY{Uf=1x}25Z+#Q!*-j|-gx4vfo`#ooFS^kbYpCvc<#zP+~sfjb!oa}t6 zsQ%5eMCtF>b>r^e$n<@m7Ki)TTWbLB)$V?q@T%JS`ES3z z`tzkdqR&=cX{6hG0yW0}?yUKsNtoMF- z?sNX~@q1TJ^jEoC&#dqMF;{#I!;QTew?E2OhV8v#{QR$$Uscvj|9|)FZ_oXk8UOzK zuNQmX*{;sN8~VRV=C8NY{}aVu^0x20e$lTQBeO7a*6=q*zh{4yTmDYsgHQbS;%`r0 zMqQiv-T0;8%kR5hf9d?9y-2WH|Ld9JZO`Al_~&{5qk((O*$exH zr?ThvZ2wlQ_nF1&<;v8!;>gLuH@$sb)E5bRpO=ZhetB}`uis}v;xGPs7Z+dIZ-;GA zwSgs!rBCmAUsd=w-|Ai0Uf-F&H?;2A`JE?k|Gsi$*2z8B_g?=U`gw_Y@h{PEt9jMG z-`up+-pha9{$>7#YsckdFEKtpv-#EXd6w1v=Z^c&NqZr9*}3k@;mIFY?N7^}dD6K5 zQ*`u;HK=+RrW6@o9*@go;tU3{@Ht4=Ot~9 zY>xZ>)#~}l@Of8^)7L%nI$nJ3{>{Qv@q5dU&aXNcb)Zl0Q(skW*(bkSQ!Sr$np)eg z{^zw`)_w2Go^^Mv?|-*l{cpVIDE)BX3Y`)XC5 zqW}5Rmsyr2N>+k<-G7O`{95zW@&3%i)gr~`C%#`?HNWB@*Mqs-+mz4eT7I7FmTw++Gw}Z+nZKutuHCOyuf>wk{>U)7mve^i`}F4C!!`DEP50hj zcWj^W|10k|Yx7%ed}g$N7yEzRLaXVv?t8W6_T&q%kD0Ug(bDz%&iDO4Q+(xo+_RI9 zeC%Ie*RwftXa3)L@;`T#Z?!I8V>8(ytMZfA_q9`E&U%=`~+BhU?!g z`?+mXb~u0kUiEzLx~fa_EB^|~|5cLT8~x4@O9R+}X}!{hU8gN} zJ&!p1rF>pZ?Ca8ZFZRYgc2zH%yDO>6D84f6SJt-q6F)z3-&|p5RriZE`{4b(C#*lo zeqCl9_Rsk58vDOSZ_ll%x%@l+;A_;d&p!?oF+8$(nWZ>W$lf z_s*-id-=6p@wMarZ~nzSzTLTd^X`3fjpN@{Zs!hTh}m0k`|JFlWxw6`fl98Q&$?pI zTYa8mIs5g!=vRw3=ihwZgDs0xh%{GXqfq-||L*ryg=MF!-=3TEv+vj5>#zSfuB}>`UT1QdKS+5PCO@v_*x z{%PU6 zp1b<}l0KG->Ah+}ndSCZ>%WMeeD}U|{_DS+t)5?=U0J0S|8>{B*LQ7yoO|~1uF(9Q zzo&iwY5aMzUc~F>GX1Zhtbgx)>A!%mz3aYPmHXVk{&%n4?B(@l?e9fD&b{|k^!{r} zEcqZtz2LR$?VEQZ>#HtbJ>!+`{(k<|GlJ!R?;fu?dhc~BOUcF=U`t$dUE|=RZ{nshJhV|8{qYwJN zpSk>d?>YHnRUQe|8`%Q{MTjqbN=j( zdiUCRuV4OC_rLdEf1MgzalY)q>WZVYi}PpKpK`sa`@S+Y?RxdI*MH-l>mLeSU$giA z>pN3_KAFAcWzU_>r^0uCnE&;oB$f`zgahS*7Q3HVzxIE>ch<}=p0{sSnw4L9zc=pt z=kvdQl-EAp|7dTjy|I4p{1VBs)4Stl-u(LR$EC?XzZ|xGef`XnnOn4fhkw?ty>)kM zbb9{W*UzJ|jR^ndxKorFJ|%Ci^{m*pF)#lvH~p!Wo33ZOQ~C3klzopi|F3($YI^z3 zP4j0?KVJTSK8J_G_n1SmGw*)9_h@IT+Wz@9w~RA?RNH)#`+8&ZA@>`$3;K5es z{?TLV-!u;%Ew|!roT6TT+1mY@u`Ff!|IXE<|9$y;*-X#dbKmaUxBB|s z_^*A>yWX$b{^#eLeg5Zay#IBICw<@Z`RdKs|9$JLtM>k4z47(xpC@y-T#cN(&v^gi zm%Bl^3fq|G1P7rVPlNK((~eJmfAMo>-KAeLU)OE_U3GR}kM+Dy?|y?XwRZu-+V zr$77un$N*-PFe5Sx;GVD%5Rxx*5n_Hl{a?(w^;78^~YE9R{xt@enA;CJ2tRPI&k&$ z-qrtXv_CJlb>Dl(ao_9tHIt9UJ?eXYGwxe`$)6+KVGZ|-1ItgpnL1PU{gas{`?ep~ zj!QeAcJ9}kovL=l-*w+V##V^g&p$BL`^ajOb7k|tF8{pljL$vK*U#Tn%-H!T_1U~1 zuRg!4yk394?$^@md*9cW{_Cp0zWdYKFZKUFL=|0~|JZu7^}IWoSlYD>EOv7boNK+` zmwxo&t2d|iU;4ds_r6)XAMHI_e}4DZoB3<&4=ug9_kO|YKT~JASFC^YK>XD-$u#4* zo5e?Gr_aEW5EUB3g?AJ+RvfMVBD?)fY}Uj9k1w0wQ4F3sqk_59s&^Zrla-dMf= z@wK0;i^KnDzxTTT^Xbm?vaSCGt>rf+f316krP%qC!_>cHPW6#Kzn}BwuD&_--uZRE zy1t9qr^ng0TRz(R`OVL5KPKyKll!Q<{oM|u@}sBqk6kZ^Mta!TguJSpnTZLDm|AwqT6Z7#|<@R&7RqpS8Py4exw#@cbb>7|L(s!%&*Lj{x zJNGNR{-WI8_pg3p8+Vv+pj^1(NNQ5u;hXz5*S%BPZ&iG?{RsW;Y@@K9r z-%+}5|Nq6`zU;jp_Ww!uM)%s=w$*ua_m=9_Pb@2c^Q-9l;?Lz3?e6uHe`D+N^EQ_6 z*l@eHJ@&rf&gk+xR^ji9&gayfUi|IJx%~6>hmT%U-v9Ah?DlgXxr^Tav8|RXHG7|c zCDcl${^LdMo7&w!qV>1Q z{k_|N<9mnfU-37R*1siJ|FS+Gw|DX`EDeSIvk#QV{jz=h#{Esrk-k4`tG?{J^LN_M z{CzCd$F|#NJzxB7P2J0Rd+STrVbd-2<0Z?y+Jiq<{O!Lr+5UX`n=^m&XI5YQHt+xJ zWq+qXooc^4eBRalm$BAFHB61+aVmD7*0{erHUIMFZ_gz2XIIbs_TBxnkJ$NJf7k4- zUpXiJ{Rh71`750<1Avip4dGw_oeUuZ2aB6`1|5I^|)QfyVoY)IsfeQo4zr=--31G``=rAw~N~D`+r&f-rfnp7==jVeE$dLu|I0BZ?C()Q~v+$*H5oL zu4{RJ;FIjVhlMV8Rj?K1b$X5EJ1*3;m;d-Ne}j0@`JaOOw6B-fu7CbV`ZxRMyKedy z;{FT&$URek`}@9s=BI?QG$$;SKit-ntiSzz-rqm-Z+-vtdS%7->A#C_xGfFDmNGmP zI4WjJ8SGR3n)Kd!#ryd$&!^9y>W8Jbq4HreXT`){%j{$IKivDmzWHa=zdvS{Vtd;Xgsg-;OWcse|NUsyLEcIuFw8!Pu?G2 z|M%kWhZu3h$Z5h9H_1$4T0F}hhtK8@?{fUG{+VYlc;6kv*bj9qd*0OSpWm5}HRiCC qen?}VqfBgxchH2{gO@D-_{-;=@?ATj$CiPCfx*+&&t;ucLK6TfCfB_H diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/images/fiveam.png b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/images/fiveam.png deleted file mode 100644 index 9ce0a035c8634b66a59892a7a29a39798ba951cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182975 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 z 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

MgGj^_M^5N=2m50O$wiJ;qQTfPam9}cZGeK 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

4n3xQW=4tTXP#@l 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/images/list.png b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/images/list.png deleted file mode 100644 index 20e728a7a4a590a32a944fee37a87df9c4b13196..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190110 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 z 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/images/passed.png b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/images/passed.png deleted file mode 100644 index 015560716b8d36b5d1db269d60586b7e47957c84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144572 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 z 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%0Dh>P4(Sp!K2h z=doE4n@@C}dH;H9-})rmt@1zfAL_3y`eGCOYU*?2v!|+_o=GZOe|=ZhOXc%FUuxQB zKanifs}5ctb^c@U>J!0na%mgS?O2ss|LZK4p@a%srq%ZU<7+3|JtqaOa79p?Vazj_xtl%Hr1Q-ON$<@691d}*!`b*L}O8z;I>u% zzb0PGUS0ZX^`3M4RxRz*-+JozuA0A|=T}XOKcIPDGWf60>|d+XueSTGDVBe_*KBR@ zYniOM>2t8x)Ada5-`PVSvkO_j{_@S{xAuB=-N(^S->g=lbtEKoYH@>dDTN`@+YFOO28!MN8FZw6@pY3%jM|ayVft`1vpI$xH zKKGv8rmP>Ewq5!-=j!F~pIg}HE#6^e{oXgF-{yK?-~Ocg&81bB!Ygf8m!JA)zI;En z&n>hEK~LD)is}%POr*JuYA9<)b@+))BU~ws+2#> z)r)w2_`LV_t5#n(@44O`^|mq2Q2v{HdN2FjQrBlor~QnqefqQ~RNcP&>C-cFOsiML z`Bz@re(GabO5D@07d~(M^|^ZK|H3_~yZ7D0p2UZA0LN-F@k|-4>!F8x09YWAO{*PZVN>c|_1gQ;q$=PQdO>> zzD!8B{k$eTj=$Jw-q$a7RrUOTUWaErsnx4{wWj~klet?KOU6f4KjXf}G*dj^dO?+c zym9iSiycqb?wMzEeB!rf{~jOjKBx0#miN8vo6h(CzOcP^#-{jcze(1SFU!NMioKsJ zE)T1EwsYQ|jF+qT%v-ZpGk^c@KWk=sV_8xd1#WQdJ$mZ?*TtplpT?^+>nZD$?&uOclSG?ce{W$YK+v}^-wF626 z-ECgKx4R}o3pBr9C?P@5|)n>$m)3=j8Q2dTGYos;6%*mOi`C-rq65 z^w_G6>cw8#{)WqR zm|s1&B`$ugy6x68uVstoR$dD_zsLAQ)UzLIy-~-$d{jMK_4LJ&OPlm0bF>Czy{NKKNwYy)iS7LH4boKJ} z_pjJn)xNOxd;Uu9I!0~5$XSyQD*Eo&`p9KnIB8n>ZDR0gyH7nY_2-s8%W(M>nSQ3` z`1S9RU;V4zzx}=OTtxAV)^oFNlwOnEy*+F4G~4n|{WE_0KmT#&^y;~L`)q>W`dF_P zpYW+9eqHrksfm)oE{DB+WP3f<9$)iaD%?0W^B0s=n-)PL`-~d}Y5)UCCjH-KG+rZ+Ed%!s?go~(>JNt zT~D^U+pgK%_U+jW+r8rXuVy|!b0&P=oaytfgco0OzPI;&Uw6v!o2SzI!is?Z`?0UeI9KlTh{d6K{DfkJ~u!UGm?s+SUG2rAbvr^Iv6% zs_TDUd`p!7-tCXZ`s>TSS$&FG`%qnN$-0edk5ca@Up;T~YV!8$5#MJ#e_?v9;s$%I z=w*L@w^w`r`z*hwTzuiT)ZB`&{jUz^V+*WG&NngBp1wT)XYal1mfFQNE?H|j(|@h< zt9LEhBYM$j(&Oa06KhPBt3L`YpXcfQKjggaiOw%V7q$JQzV6;Sx6bB$-|p#=@9(|1 z-Y|FXIh)nLmMouExz{^>`L*md)i$pqe}?}u;eQ|E?9Cr_v})C~(xONC!GFAJr%tck zF1Gl;=2^-AAv}rK#dViqOJv4O?&7&WSC!Y^oL+hM+*hsn=PvB6y<5HP*F?A88R@#Y z?(c2qbl#H-Fa0v7{aDY+ZI}AKWa>rr?<`+$oAY<(^ziU+QI+9Uj5D)Vrq(@+ue{i4 z`P?J=YS8?&(AuX5=YKu3(%*3Fyz8^npQpxsjY+rry6Ee^E9;+Ko)@0}0^5v%C5O!~ zr5w}zOTnl2oOojOdC9b2Qx*%pJX`v-ws(EfwU2@yedVf_?^x~oJ0<_AjduRk>fEJk z)8@XsV(eF)_E+)eeL17l{1a2TH!8nhwQX^^fBf~?3j`~zui37v+SOnB>vztz-SfVr z&#Rt#ZhGg8d-J}>y}G*l)%>i3#+&sllx`GfeE zmwBrC9$nnC*e)AOtl7vneverp`*mGb?EBX$Q@~?bGj84NSuB^e`oxPd3F1~ zmD7yNUZrm?iu?ZU=S$mD)xDOs@7`RmE=%{X#WsfWM}{d~JY)4QFaM&ulV8uRnPvKQ zX_)O!wf7Tm#-`6LHA%Xr71lWz`Sd z9zz`C{(j!RXQmfAwQE=TM}1u^tgf3Kd0vKpW7f|F!mGEPT5e}j)e)N>yRmxHwa>Bd z*R4Naj;&MrU2#Ko;ap6<=6cntI;&{i?cU^REhP#VMIyvt9RUX}SLEQ2+Jw&suy+ ze;;@*vZMCd)vsB6zwX{RUs&E(izQxaY#Xn(-mdoFHtY7+)vs;BzrB0%#V^i8>0Vcc z?W31guUD2Yf4)LL`;5{ieZjdEq4uvA&nw*OUL`lJ{@MSNq4ri*LHGjmEzY%JBco>@L`jsMT7^Im#yfA#)e=H0DU@tKqFo!@tB`)_Qs`X7op z=iD`1^G;E1@A+4+m)yyAe;v2la;0x&)|>8Yk5}!x)&4K^{;EFvWhTKt-gLg z)<4gF-g|BR&1K)})~8?X_j^;ICfn=bzwTt`Q$_V}b|p$*L-W5stvVHa`ljXn=e4ya z%ISXlJYRn$VtfAO5nu}uH-r)O55?b@Y2t||Yt^jOUnx$v)d zrq8?5_p7ScbYi7T$s@1zzXEfY|L&TwLtU-)DBOdjIO~_3I4o>ScScUFp!) z{d#8e`Y%-%I#&KQ`|~w>m4DQ?3Cr^@f!2LQ9*zCKxOVmD71$beHY{a&H$H9I{V!I2 z^KSd=GuQulA$r;0?@j5iWmQ>sr*Az|T=(k9kuS1mmz6y^K6&%SWp-KG|MO(;UzB@U zS+TEr=GPCs^}KsFeV_S##lBTb=T+`|y=1YVy1l8A+_fXhd#g`%yZQ7+y4W09C;!#& z-qdT)*VnuVf1LI2s^u?i9fw$^^yvk=^S8~q{B_^DpOdHkPP6^|=B?FV(7^nYIcIkF zn@+5|W*cNbYv$H3<#TVk&(q#&xBvUMuUY@!RloRk^S|_(pPSOfbKSp&>V7?Q{@YRS zIe)HnR7410G!9Zu)BPOx{`Hr4Ps)G2uPc22X6t9ZDr}SKJ6X=X(_Hpz-L;k9_Qj;f z)z;c(R&=cXyF&PKyW5guyWC%imS?>@KX2ah{+%l)%3tkEyYye=qqcqohGyuZhoJ5*=3Bh$+I36&?A3qH%&(oi{d%PEYW2_i z-ffLrZ|YxVygaUO>Ep`$xt7+|OTRz-sr{GtTGh|R-c}FhREB-MVx0c&;=doA!ThF4 zRVVthDvaX3hQFUX@6Kn9{noqxH9mTtu@BqKjYZ13M)_Sa`V zUO(fP*8D#&m-by#{@Uffbxpee^_hiFUT(EZUbTP9Hy-gd47c~rx&3i2*y86sqUw9I z(_dee`S$Yf@XR7nBg;jogpg8a9uJ!9T&#!svX2sfg)YKlA;Hd0WqXK78|{`uQcYg)jc?yJvYh)c=?9di{?V#ecrYu{@4t zLWYsEMy&B_?6Hfs$5$<%U-_wY?fPQ3^grulzXh@ba9 z9=<<8_s4GWO80$>Z*4h#s(#u0tIPE-=bb-gKKFl@+1!^GZ(Y18zjyj)Y=uZ1%et5c zYxijX?YMGf^J>HGzkgSKD)o>5K5w&CUDEgOru*jZxV`)J?VF!3+nz5w$knh~Ja6|u z4Li`~WR?#?s5AGr7WFDv^M zp}Jqs^jGa(zkdCfW#*r+o>^UWZqMZP-*y|Hmc!D=-lyK!zbhsB?A}%7ulDX=fBAlP zdUn<2>6Tx+v};$zetaf(c}-k;?H2ZVa__%roHe||1-R* zet&HI``Oo)%G$bD%YKbrTYJqe{QS~*EW?8Hy&t?O$_tHusXgiL{p)+zUq65C=KOnS zE(iZyb?xiEdvlxLuaUn$_s7J|@8>)(KVQBpVXgSBy;neaziRLL&(4vcwVam8Rr}w) zf4#ZxReJ3YJ7v4ek#>)3?>b|#?KR80xGi(P&b_*P^17-pE90uaIll6R*YDSU34gP7 zpWpi@@4srl-n@6+nO{NgjpH|n&9I)H8(vkmCw<DXNM z$-*|Zs`4R}R`sFH(6(9oHIN-qsDUa^>E`CmaD&4ep&nI+@5>Y z%a@=3G2v_Zo&?>1a6Pv2J?Zn}-oO6yp)c$5&Go;QOKR($zxsJ`ZGTp6AGRSSl@A$A z@|8EsOn$F0+xz&*{i{WB?_a+D5>^-Te(Sz{M%?dj^3;f~uh{%P^K+ulvqL&h+2sIs4lQ%hffe-2WqG=VO^uVC1Y3ZQSg=Z}YE`ccJH( z_}@BrX7j$qRqMZ&-v7U*ul{=YKka+gpI`pG^22L-V)?nMrRmpqKlb*2cDcPeZ2i2G z#+l*I*8d9sWwJZFy!!pOuYa*l^L^&HvvZ5KSNZS0s&M1*s{dQm?k{=!WvP04%Dj1J z%59$B{~G(XXqxutmp{M!c=Nxrf#uUY?;YBEt?yaSv$p;D@5$vko`>&0p7?#mu{pB* z_ZI(HVd-9tZ9Dpdbis-%t#{7NQ9d8Iwq9v+`K7X7=WOInx4)nLdamu||3yDn#}@5< zz9+n@e6RJscQ0SR^xph<<-U{VnV02O&iy*)>ddXLv37GEnBrX%zCU_@raWx^z5G`* zx7@w=?)BzhyMAZyeZ2G0?pM0?cDtXSoTq;>{-e_y+w^_6cE7&=vD80){XT}>`(Dl8 zGkM#s>`Udp%57@D&7Eg=7~4>ikOxz_-qW(GGMmc2dH#PVU;7>L9+atPPA@zj3~Je} z|MhbB=J0QIRsX#HcQQP%d6e|-RF8Z0^2*7_ey82}da?M4{i=)mh1Z|k`Rcx9Gq$X+ zGJ$1X+`HJX&*NswpS4`|l;>0I|0lCeo(YxP$iGef=Y2eUPXg;6Z+WY-a`0w>U%J*vD_xk_4{raTU|8nlXy!-Kq54Pbzl@G62 z%Jlw}*=X~HSBL+bdhh$)uc7xv-^>25K6kBpf5~52y|edz^OgTv|HbA|bt+r@3TxXh zX?u*GcbR`Tz|sSEV4Cmy;1ug4(f1dt@66o%D)Qy!fAUXL*K2=%dGg1-e{;UR{8_$J zp!$9FowxgMl^@;zY2BB(`sb^w!avI!eik$idmfC%&(QREr@^e@Bt^W6G z(wwhzuCA}UC};cr)jw>F@(BmRg)5GvCha?XbI<0gb4vSf6<@6{m;Y6@XLtSl&re^! zud4jE;`=V^=YIF+%I$MV-`t$|?f-W>-(cOJoz7zSYtj3hf02J*{3)+`|K*D0 zyKi4V+h_UB|DF2!eU0I_73J0E=j`5F{`*t+7VG5e(>Ke{wLdH=_t)yK_5kho@Ki=kGhc_}P;)`seEp9lfS}|KqzgyK8G4@7?}C&$9p4Y-0&5 zeUAwTRtxSZHmq2l{^-*^%ktmvzttYG_A#FC_FHp$dVk&d?`Nw0^J@$5-QNG})86!V z)m7oo1F=M@1JiuR2e#s!?_b(hZU26**8hKX)$;PHFMBfk^{>|5I(lRA{qK7}-@AQ& z`t!iz8Rkd(?>tsc_kX_#+YZa`iXSG5SIAq=_J0sqy{G(K_3ujgM~j~uet-GMfA5W| zFV*%*_mtDV=-+TZ^QL;uwfLRiU-`Vk(*6FE!xUfn^1EQQebO`Kv?tqNUHn}1E%=%J zPoX!;_x=VN%bTWuUHbdQ&(*b8u?9@J`iG0+J^i!(udw`CS$E{joc~jHiszpHdEex1 z{Iv6b=GYal|2JNX#cB0d?%0Q% z+njE3_@`#6hXa;s*|afzhr*u~#x+;&Ec!Wd^Y!`HCWr2knQcFz|H-F`n_uVJRsHjM zQ~OGL-p|_nob6avSM@7>=$c+5U;C_o&i{#<<-gATam6w&NA~f*3_E$-{rm5xzrX$+ z+n`AUOC49^`F$OKUi`JI`ggice^0^f-!JUCFQ>mP{&MYnLEGZbkyuir15>>314%t; z``0}4x1JBLU$*`GccZsfyUwS4n^_&J{_)yJuJk>>^S)s@m+yly$DTu~kJ9ITH2z-o zGk?bPie$xOS|tWr%cE2;)CD9KRm_j;=ito-}?S^ef8cwRd?Kf z@aW8c$kVU|F*B`*S~pncE8t@cwtLJ?|lw*Us3;CviCssCH}O}5p{L57i_^20Sb-k z>JM07O|ExX{kYO`yVB>{68p#RKS%yj!;+`=s4?pM$A2!qZMAiJe)NpGH7DO6@BjOv zwh&8zOEKzuN()TSXW8TMdG?1KmOp-Wx78n2Vg}oJ_XDTTJ^$@vGm!;T5{o0SWf^So oH)0@bZvgPx1ZhRT?L>2z4|}xiDK}uh;vgrjSJ47L^GBNgOPqyI*h8-XRvE z6A@MtdL%SF+~HbN$6eQryQlG&1_oR^+Qd6GKTcss`uXkuYv0eA`MrAo&f@3g@6XIO zW?qo1KjHM}LfHnU$c;*dT2t&bZJW>U;GcDXHI|`3grob3A}41d$N$rxpRpx`Tns`Dg5DPI4O8a^eDrYup`lDHKqmc;7+V%73%ol&h>nS zf$U25ziS+G)^76j<6&O#n;~NZ3zI7!gSyPeKSGIopAHKuzEKkPOyyYbW)YwvsL)r; z`!JA|^|IhKH-R^s|2XJLx%h+Df~B^Ftl?2|e}x z8nIxOYM_hyqV0C4ZXet8a-&F^;-2_vriyZjwk`c0D?8W=XS+zwZ8Au`uc*W2ypu)l z(0bRV4-qZC3^^)Q`dGZNpdk`S-pTmaccdcAdP_D)Q*b&B+nv~M}hH5eky$Z4idfIK0>F1 z+P(+~RTgSIZQrCn_4(>+=9fG}x;`(~xF_`Rt*ff%t9{G6MNf+Ke{#EXLbPY`HSJ42 zHdDpb11uMQ+0$&n(OmGLS!k-x48ENTxvw){IL0^YPE=rEebOK?r(L47-z2n~=c;D_ zSA7%DO%dMj+@V{$7P5St-*)rhzH<}SX6XigJ<)tTqlM|x3?7xgCoMwQ7e8|QHDTYY zx|-arepM{CbL4#cmsqcm6i~YQbA^V(FZ&%4SJd1tY6j>AAOCPv{;lEKx!)#~&AsNh zn|I}h_EV<=mRw%aEt180c;0bm_D^OrL=8{P;MsN6Y>95rThF#hj2`xv{62Xk7pU0= zs3@igbe$F6`07pIs;P%>?Rye5w|uMY(pmqvOSD(?DIYKPaGhqQWit7d&!5Yur;BNJ zObC5ruiN>)qxp#BBbLHG3nvqX`4)aALgJl^MdU8YtUTp+?n6fBs-9;HC6;7KPq&($ zH@*MW`iBv$9ScPQiW{!gZ>&f&jH(wfi?#DsJUdb3v-1T#ooB~Sv@CZ2csC}-mSKhM z+)a!XM}yy9m3aS0eBB1g1KVZZGF~Y=wR{Z&OBh4DJafVQnulxR7R6_=9=LegY3ZVr z3w=xCOcECH2Fv#x;8}A(?&uS?xCi_P1sESI$W2m|UAAbA_X38M^B9X06sI_{u4ypc zz_{&z*$r0vgNzvs$^}e*hgo;>I=DV{u9H1x)D= zf9=rB>+U~T`$51)%>UT(2bL9zab5byrayfBL8^v7u7Cak{Rh`S^8Jy#=gzRu^#cd@ zp_v~P4|P;1HJ?xuIbySD&I+Zhj=e6zvtF-uVZZ3SNByPB^e2?+;`7kw*9jF#orPFCD#GK3U<8ePS^Zd$Z zSBlpa%*)Qsx}DLU;eS={>bgsID{4J=ySoP;4^#JXUtsLNJnH#|bG~!!V%M!(owp~i z@mo5HG-0!>py2JSchZU|SEOXp?FtC|V?%?L9M?ZY3JYC6NVO}BcHlvS2Qc-SW%8`45 z;ck0OWilmlG|Y6&@1$4U{m?9UU*nL*`HZE3%@=KxFWtCUvFIbu_f)&R>i;6I zDHCb;>A;Emz6HYWlU*j?RJ-k?H|xvHSu@>cp7Omud!ET#!^bmOXFr{_*33HXTJAYh zev|35)|=Vq{hN}1fdAq1&(}Xj|J*C4CU#NGt9z|juGrscWz#gLb?bbOytg?i>Ssi1 z^xAD%8((cT+b)-HdwkcqU**!i((=-sXQO5to8{-e&AFVje{1fBx0{T&bZ^w&x_a~O z?DO0BH|cL#zj6OFhw=}FCyH-8DYz+E{-tD!MVNJ5(V@9}<}C4>J?EDDMYo@QlX_Q4 zmR_FuROV64qnPJ^5=`<-?!0haEbV45pKPm^eCCv4`mvg_k0mF|Z@w!!9(ulX&TFOX zYS*Xd_2oHj&)S~-F6X<)_n+^2-|5@Tu{k0)+cvMV$o6=3-Rql=ex5vi+xy|x>#J|y zzGZ#6dhvH(`P%s`^OxGC*JkcpxbJgq|Brp&KY!BxX8qv%^!=Ob=l#$7ziwk$^3mk& z{k0+qk_sF*q%H`a;6KCjM{$Gl2_+AK5aBNdH?$%|_9*}G>~QwTJ27v<^M!f~yDm5{ z%s>3+(6ctvcHxJC51&5F6|54}6qHta=N{$u%;lQvH@8Z+vwc~8%UqAUt?$_~q_^cRQ{{gyjUiX}i&0*jL!KW7)?aKMEg*_wKhonAVizuKp`==*N z518@cwac#~EuB||<<)noo%6Jre8hLwv@O;zeTylT#_2ocPX{I3bhlZ=k8Yho*P$l@7$ioKU@CPvP!YeWNlBa+GG>? zx@7Z9XQf`HxpL{T zgEMy-ryA>@E1I)4<=W&+CoajSPu|?RIr>?|nMjN02k%VS8T~x*^QLE8&upKyzoPDW z(+bwzVn*W6bpPZ|JiX|Y>-znEzjtMBeEEpATfSEKt8c92a-YDm&(Z($x7WDWssCM< z+xdIaS8u!N-KWln?+6JAt%=c!srpxa{r&Y?`wcqPk++N1Kb;+ZA^b$xoe0S-Md3^H zQZt_}4t*Scb^WvTdhvg&&TcV%zRG6Rwl%5iLf5^G5Z}J8aPQY&qOa}qCgkjhla1P& zzxd=aRq6YALblHLz3IEsd%H{J^W%@! z-B^F;|Ci@y=I6_F*j^~Q@chBO_?)_%6&=+p_QvPA^iLVy3xlfl*mW!^*c~J54>^u=yWufVxS1+>-uj|FkFWCFn?No2Hx%&M#J5+aFEw%ptt^2-r-TVEUALzZ! z`)ND3I`q5myX$|BKeYdCwa2Q@j-$TdW8$U5*8MI0^Zo{YIez@y(f*tLtLM$IU-`D^ zwbdoro3%e*hWlI3KRN&F_bGo@{(gS!`M2}+Ked0X@7_DP$~s;nj%QEIuTw9sp1Ur$ zKKhr?uXp=3D=z=v_Gj+J-Lda$@6G=?;oC#c|2_RZ{jcpTYqEaH{QmjQ;oyOWm<0kW z&M~p9`uHZNVY)Trjh8Rp6i7Cll-yIiQfI@#YNbOr0v5ige{ir`@@m65fepqI3aN|^ zF~$edLUIJs7Mhp-@#AB=bGLSfLR(eWrn`4T7?L$FTzqo(zya-G1~=gY>PHVa{9o4C z=zsfS`9GBGM z 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/prove-asdf.asd b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/prove-asdf.asd deleted file mode 100644 index ebf3d9a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/prove-asdf.asd +++ /dev/null @@ -1,5 +0,0 @@ -(defsystem "prove-asdf" - :components ((:module "src" - :components - ((:file "asdf" :depends-on ("output")) - (:file "output"))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/prove-test.asd b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/prove-test.asd deleted file mode 100644 index 2506bea..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/prove-test.asd +++ /dev/null @@ -1,15 +0,0 @@ -(defsystem "prove-test" - :author "Eitaro Fukamachi" - :license "MIT" - :depends-on (:split-sequence - :alexandria - :prove) - :components ((:module "t" - :serial t - :components - ((:file "utils") - (:test-file "prove")))) - :description "Test system for Prove." - - :defsystem-depends-on ("prove-asdf") - :perform (test-op (o c) (symbol-call :prove-asdf :run-test-system c))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/prove.asd b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/prove.asd deleted file mode 100644 index 8bddb12..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/prove.asd +++ /dev/null @@ -1,27 +0,0 @@ -(defsystem "prove" - :version "1.0.0" - :author "Eitaro Fukamachi" - :license "MIT" - :depends-on ("cl-ppcre" - "cl-ansi-text" - "cl-colors" - "alexandria" - "uiop") - :components ((:module "src" - :components - ((:file "prove" :depends-on ("output" "test" "suite" "asdf" "color")) - (:file "test" :depends-on ("output" "report" "reporter" "suite")) - (:file "report") - (:file "reporter" :depends-on ("report" "output")) - (:module "reporter-components" - :pathname "reporter" - :depends-on ("report" "reporter" "color") - :components - ((:file "tap") - (:file "fiveam") - (:file "list") - (:file "dot" :depends-on ("list")))) - (:file "suite" :depends-on ("output" "report" "reporter" "asdf")) - (:file "asdf" :depends-on ("output" "color")) - (:file "color") - (:file "output"))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/roswell/run-prove.ros b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/roswell/run-prove.ros deleted file mode 100644 index 4db1dc1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/roswell/run-prove.ros +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/sh -#|-*- mode:lisp -*-|# -#| -exec ros -Q -- $0 "$@" -|# - -(unless (find-package :uiop) - (ql:quickload :uiop :silent t)) - -(ql:quickload :prove :silent t) - -(when (uiop:getenv "COVERALLS") - (ql:quickload '(:cl-coveralls :split-sequence) :silent t)) - -(defun print-error (format-string &rest format-args) - (format *error-output* "~&[Error] ") - (apply #'format *error-output* - format-string format-args) - (fresh-line *error-output*) - (uiop:quit -1)) - -(defun main (&rest test-files) - (let (reporter color) - (when (or (string= (first test-files) "-r") - (string= (first test-files) "--reporter")) - (setf reporter (second test-files) - test-files (cddr test-files))) - (flet ((not-color-p (arg) (or (string= "-c" arg) - (string= "--without-colors" arg)))) - (setf color (not (loop :for a :in test-files :thereis (not-color-p a))) - test-files (remove-if #'not-color-p test-files))) - (labels ((run-tests () - (not - (some #'null - (mapcar (lambda (test-file) - (unless (probe-file test-file) - (print-error "test file '~A' does not exist." test-file)) - (let ((prove.output:*default-reporter* - (or reporter - prove.output:*default-reporter*))) - (unless (string= (pathname-type (probe-file test-file)) "asd") - (print-error "test file '~A' is not an asd file." test-file)) - (let ((test-file (probe-file test-file)) - (prove:*enable-colors* color)) - (#+asdf3.3 asdf::with-asdf-session - #-asdf3.3 asdf::with-asdf-cache () - (asdf::load-asd test-file) - (prove:run-test-system (asdf:find-system (pathname-name test-file))))))) - test-files))))) - (or #.(if (uiop:getenv "COVERALLS") - `(,(intern (string :with-coveralls) :coveralls) - (:exclude - (,(intern (string :split-sequence) :split-sequence) - #\: (or (uiop:getenv "COVERAGE_EXCLUDE") "") - :remove-empty-subseqs t)) - (run-tests)) - '(run-tests)) - (uiop:quit -1))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/asdf.lisp b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/asdf.lisp deleted file mode 100644 index 4cd6101..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/asdf.lisp +++ /dev/null @@ -1,144 +0,0 @@ -(in-package :cl-user) -(defpackage prove.asdf - (:nicknames :prove-asdf) - (:use :cl - :asdf) - (:import-from :prove.output - :*test-result-output* - :*default-reporter*) - (:export :test-file - :run-test-system - :run - - :*last-suite-report*)) -(in-package :prove.asdf) - -(defvar *last-suite-report* nil) - -(defvar *system-test-files* (make-hash-table)) - -(defclass test-file (asdf:cl-source-file) ()) - -(defmethod asdf:perform ((op asdf:compile-op) (c test-file)) - ;; do nothing - ) - -#+asdf3 -(defmethod asdf::compute-action-stamp :around (plan (o asdf:operation) (c test-file) &key just-done) - (declare (ignore just-done)) - (let ((*error-output* (make-broadcast-stream))) - (call-next-method))) - -(defmethod asdf:perform ((op asdf:load-op) (c test-file)) - (pushnew c (gethash (asdf:component-system c) *system-test-files*) - :key #'asdf:component-pathname - :test #'equal)) - -(defun run-test-system (system-designator) - "Runs a testing ASDF system." - #+quicklisp (ql:quickload (if (typep system-designator 'asdf:system) - (asdf:component-name system-designator) - system-designator)) - #-quicklisp (asdf:load-system system-designator) - (let ((passed-files '()) (failed-files '())) - (restart-case - (dolist (c (reverse - (gethash (asdf:find-system system-designator) *system-test-files*))) - (setf *last-suite-report* nil) - (format *test-result-output* "~2&Running a test file '~A'~%" (asdf:component-pathname c)) - (restart-case - (progn - (asdf:perform 'asdf:load-source-op c) - (unless *last-suite-report* - (warn "Test completed without 'finalize'd.")) - (if (eql (getf *last-suite-report* :failed) 0) - (push (asdf:component-pathname c) passed-files) - (push (asdf:component-pathname c) failed-files))) - (skip-test-file () - :report "Skip this test file." - (push (asdf:component-pathname c) failed-files)))) - (skip-all-test-files () - :report "Give up all test files." - nil)) - (setf passed-files (nreverse passed-files) - failed-files (nreverse failed-files)) - (format t "~2&Summary:~%") - (if failed-files - (format t " ~D file~:*~P failed.~{~% - ~A~} -" - (length failed-files) - failed-files) - (format t " All ~D file~:*~P passed.~%" - (length passed-files))) - (values (null failed-files) - passed-files - failed-files))) - -(defun test-files-in-directory (directory) - (check-type directory pathname) - (flet ((always-true (&rest args) - (declare (ignore args)) - T)) - (let ((directories '())) - (#+asdf3 uiop:collect-sub*directories - #-asdf3 asdf::collect-sub*directories - directory - #'always-true - #'always-true - (lambda (dir) - (push dir directories))) - (mapcan (lambda (dir) - (#+asdf3 uiop:directory-files - #-asdf3 asdf::directory-files dir "*.lisp")) - (nreverse directories))))) - -(defun run (object &key (reporter *default-reporter*)) - "Runs a test. OBJECT can be one of a file pathname, a directory pathname or an ASDF system name. -Returns 3 multiple-values, a flag if the tests passed as T or NIL, passed test files as a list and failed test files also as a list. - -Example: - (prove:run :myapp-test) - (prove:run #P\"myapp/tests/\") - (prove:run #P\"myapp/tests/01-main.lisp\") -" - (check-type reporter keyword) - (flet ((directory-pathname-p (path) - (string= (file-namestring path) ""))) - (let ((*default-reporter* reporter)) - (cond - ((and (stringp object) - (asdf:find-system object nil)) - (run-test-system object)) - ((stringp object) - (run (pathname object))) - ((and (pathnamep object) - (directory-pathname-p object)) - (let ((all-passed-p T) (all-passed-files '()) (all-failed-files '())) - (restart-case - (dolist (file (test-files-in-directory object)) - (multiple-value-bind (passedp passed-files failed-files) - (run file) - (setf all-passed-files (append all-passed-files passed-files)) - (setf all-failed-files (append all-failed-files failed-files)) - (unless passedp - (setf all-passed-p nil)))) - (skip-all-test-files () - :report "Give up all test files." - nil)) - (values all-passed-p all-passed-files all-failed-files))) - ((pathnamep object) - (setf *last-suite-report* nil) - (restart-case - (progn - (load object) - (unless *last-suite-report* - (warn "Test completed without 'finalize'd."))) - (skip-test-file () - :report "Skip this test file." - nil)) - (if (eql (getf *last-suite-report* :failed) 0) - (values T (list object) '()) - (values NIL '() (list object)))) - (T (run-test-system object)))))) - -(import 'test-file :asdf) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/color.lisp b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/color.lisp deleted file mode 100644 index 922e30d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/color.lisp +++ /dev/null @@ -1,37 +0,0 @@ -(in-package :cl-user) -(defpackage prove.color - (:use :cl) - (:import-from :cl-ansi-text - :generate-color-string) - (:import-from :cl-colors - :+gray+ - :+grey+) - (:export :*enable-colors* - :with-color)) -(in-package :prove.color) - -(defvar *enable-colors* - (not (equal (uiop:getenv "EMACS") "t")) - "Flag whether colorize a test report. The default is T except on Emacs (SLIME).") - -(defmacro with-gray (stream &body body) - `(progn - (format ,stream (cl-ansi-text::generate-color-string 90)) - (unwind-protect (progn ,@body) - (format ,stream (cl-ansi-text::generate-color-string 0))))) - -(defmacro with-color ((color &rest args) &body body) - (cond - ((or (eq color :gray) - (eq color :grey)) - `(if *enable-colors* - (with-gray ,(or (getf args :stream) t) ,@body) - (progn ,@body))) - (T `(if *enable-colors* - (if (or (eq ,color :gray) - (eq ,color :grey) - (eq ,color cl-colors:+gray+) - (eq ,color cl-colors:+grey+)) - (with-gray ,(or (getf args :stream) t) ,@body) - (cl-ansi-text:with-color (,color ,@args) ,@body)) - (progn ,@body))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/output.lisp b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/output.lisp deleted file mode 100644 index d7d9d7a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/output.lisp +++ /dev/null @@ -1,13 +0,0 @@ -(in-package :cl-user) -(defpackage prove.output - (:use :cl) - (:export :*test-result-output* - :test-result-output - :*default-reporter*)) -(in-package :prove.output) - -(defvar *test-result-output* (make-synonym-stream '*standard-output*)) - -;; This should be in prove.reporter, -;; but it's here because this will also be used in prove-asdf. -(defvar *default-reporter* :list) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/prove.lisp b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/prove.lisp deleted file mode 100644 index c7f0892..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/prove.lisp +++ /dev/null @@ -1,87 +0,0 @@ -(in-package :cl-user) -(defpackage prove - (:nicknames :cl-test-more :test-more) - (:use :cl) - (:import-from :prove.output - :*test-result-output* - :*default-reporter*) - (:import-from :prove.asdf - :test-file - :run-test-system - :run) - (:import-from :prove.test - :*debug-on-error* - :*default-test-function* - :ok - :is - :isnt - :is-values - :is-print - :is-condition - :is-error - :is-type - :like - :is-expand - :diag - :skip - :pass - :fail - :subtest - :deftest - :run-test - :run-test-package - :run-test-all - :remove-test - :remove-test-all - :*gensym-prefix*) - (:import-from :prove.suite - :*default-slow-threshold* - :slow-threshold - :plan - :finalize - :current-suite - :*suite* - :reset-suite - :suite - :package-suite) - (:import-from :prove.color - :*enable-colors*) - (:export :*debug-on-error* - :*test-result-output* - :*default-test-function* - :*default-reporter* - :test-file - :run-test-system - :run - :ok - :is - :isnt - :is-values - :is-print - :is-condition - :is-error - :is-type - :like - :is-expand - :diag - :skip - :pass - :fail - :subtest - :deftest - :run-test - :run-test-package - :run-test-all - :remove-test - :remove-test-all - :plan - :finalize - :*gensym-prefix* - :*default-slow-threshold* - :slow-threshold - :current-suite - :*suite* - :reset-suite - :suite - :package-suite - :*enable-colors*)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/report.lisp b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/report.lisp deleted file mode 100644 index 9303d21..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/report.lisp +++ /dev/null @@ -1,113 +0,0 @@ -(in-package :cl-user) -(defpackage prove.report - (:use :cl) - (:export :report - :test-report - :normal-test-report - :passed-test-report - :failed-test-report - :error-test-report - :skipped-test-report - :comment-report - :composed-test-report - - :test-report-p - :passed-report-p - :failed-report-p - :error-report-p - :skipped-report-p - - :plan - :children - :description - :notp - :got - :got-form - :expected - :report-expected-label - :duration - :slow-threshold - :print-error-detail)) -(in-package :prove.report) - -(defclass report () - ((description :type (or null string) - :initarg :description - :initform nil))) - -(defclass comment-report (report) ()) - -(defclass test-report (report) - ((duration :initarg :duration - :initform nil) - (slow-threshold :initarg :slow-threshold) - (print-error-detail :type boolean - :initarg :print-error-detail - :initform t))) - -(defclass normal-test-report (test-report) - ((test-function :type (or function symbol) - :initarg :test-function) - (notp :type boolean - :initarg :notp - :initform nil) - (got :initarg :got - :initform (error ":got is required")) - (got-form :initarg :got-form - :initform '#:unbound) - (expected :initarg :expected - :initform (error ":expected is required")) - (report-expected-label :type (or null string) - :initarg :report-expected-label - :initform nil))) - -(defclass composed-test-report (test-report) - ((plan :initarg :plan - :initform nil) - (children :initarg :children - :initform (make-array 0 :adjustable t :fill-pointer 0)))) - -(defclass passed-test-report (normal-test-report) ()) -(defclass failed-test-report (normal-test-report) ()) -(defclass error-test-report (failed-test-report) ()) -(defclass skipped-test-report (normal-test-report) ()) - -(defun test-report-p (report) - (typep report 'test-report)) - -(defun passed-report-p (report) - (typecase report - (skipped-test-report nil) - (passed-test-report t) - (composed-test-report - (every #'passed-report-p (slot-value report 'children))) - (otherwise nil))) - -(defun failed-report-p (report) - (typecase report - (skipped-test-report nil) - (failed-test-report t) - (composed-test-report - (some #'failed-report-p (slot-value report 'children))) - (otherwise nil))) - -(defun error-report-p (report) - (typep report 'error-test-report)) - -(defun skipped-report-p (report) - (typecase report - (skipped-test-report t) - (composed-test-report - (some #'skipped-report-p (slot-value report 'children))) - (otherwise nil))) - -(defmethod print-object ((report normal-test-report) stream) - (with-slots (got notp expected description) report - (format stream - "#<~A RESULT: ~S, GOT: ~S, ~:[~;NOT ~]EXPECTED: ~S~:[~;~:*, DESCRIPTION: ~A~]>" - (type-of report) - (passed-report-p report) - got - notp - expected - description))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter.lisp b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter.lisp deleted file mode 100644 index 309fcea..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter.lisp +++ /dev/null @@ -1,175 +0,0 @@ -(in-package :cl-user) -(defpackage prove.reporter - (:use :cl) - (:import-from :prove.report - :report - :test-report - :description) - (:import-from :prove.output - :*default-reporter*) - (:export :*indent-level* - :indent-space - :format/indent - :reporter - :format-report - :print-error-report - :print-plan-report - :print-finalize-report - :with-additional-indent)) -(in-package :prove.reporter) - -(defparameter *indent-level* 0 - "Level for nested test-cases output. - Number of spaces, added for each indentation level - is described in reporter's indent-space slot. - - Also, macro shift-indent could be used to slightly - indent content inside the main indentation level. - - full-indent = indent-space * indent-level + additional-indent - - Here is an example of the output: - - 1| x Blah minor. - 2| Next line of description: - 3| - 4| x Nested test. - 5| Also has multiline description. - - In this example, indent-space is 4, that is why - text on lines 1 and 4 have 4 spaces between the 'x' - horizontally. - - Outputting the first line \" x \", reporter sets - *additional-indent* to 4. That is why these additional - 4 lines are prepended to the rest lines of the main - test case description. - - When inner testcase runs, it increments *indent-level*, - which shifts output to another 4 spaces (indent-space) - to the right, simultaneously resetting *additional-indent* - to zero. - - For nested test, reporter writes \" x \" and again, - sets *additional-indent* to 4 and every other lines now - shifted by 1 * 4 + 4 = 8 spaces. -") - -(defparameter *additional-indent* 0 - "Number of spaces to add to each line. see *indent-level* docstring for full description.") - -(defvar *debug-indentation* nil - "If True, then indentation will have '=' and '-' symbols for main indentaion and additional, instead of spaces.") - -(defun indent (space &optional (count *indent-level*)) - "Creates a string with a number of spaces to indent new line -of a test report." - (if *debug-indentation* - (concatenate 'string - (make-string (* count space) - :initial-element #\=) - (make-string *additional-indent* - :initial-element #\-)) - (make-string (+ (* count space) - *additional-indent*) - :initial-element #\space))) - - -(defmacro with-additional-indent ((reporter stream control-string &rest format-arguments) &body body) - (declare (ignorable reporter stream control-string)) - (let* ((need-new-line (ppcre:scan "^~&" control-string)) - (string (apply #'format nil control-string format-arguments)) - (increment (length string))) - `(with-slots (indent-space) reporter - (let* ((first-line-indent (indent indent-space)) - (*additional-indent* ,(if need-new-line - increment - `(+ *additional-indent* - ,increment)))) - (declare (ignorable first-line-indent)) - ,(if need-new-line - `(progn (fresh-line stream) - (write-string first-line-indent ,stream) - ;; because we just started a new line, we - ;; should use format/indent to write string - ;; taking into account a main indentation level - (format/indent ,reporter ,stream ,string)) - ;; otherwise, just output our prefix - `(write-string ,string ,stream)) - - - ,@body)))) - - - -(defun format/indent (reporter stream control-string &rest format-arguments) - "Writes a text to given stream with indentation, dictated by -*indent-level* and *additional-indent*. - -If first line start with ~&, then output will start from a fresh line. -Otherwise, all lines except the first one are indented." - - (with-slots (indent-space) reporter - (let ((output (apply #'format nil control-string format-arguments))) - ;; if string starts with new line, then we have to add indentation - ;; otherwise we think it is already written to the stream - (when (ppcre:scan "^~&" control-string) - (fresh-line stream) - (format stream (indent indent-space))) - - ;; if this (?!$) is indended to not insert spaces - ;; into empty lines, then (?m) should be inserted - ;; before - ;; TODO: make a pull-request - (write-string (ppcre:regex-replace-all - "(\\n)(?!$)" - output - (format nil "\\1~A" - (indent indent-space))) - stream)))) - - -(defclass reporter () - ((indent-space :initform 2))) - -(defun find-reporter (name) - (make-instance - (intern (format nil "~:@(~A~)-~A" name #.(string :reporter)) - (intern (format nil "~A.~:@(~A~)" - #.(string :prove.reporter) - name) - :keyword)))) - -(defgeneric format-report (stream reporter report &rest args) - (:method (stream (reporter null) (report report) &rest args) - (apply #'format-report - stream - (find-reporter *default-reporter*) - report - args)) - (:method (stream (reporter reporter) (report report) &rest args) - (declare (ignore args)) - (format/indent reporter stream "~&~A~%" - (slot-value report 'description)))) - -(defgeneric print-error-report (reporter report stream) - (:method ((reporter reporter) (report report) stream) - ;; Do nothing. - ) - (:method ((reporter null) (report test-report) stream) - (print-error-report (find-reporter *default-reporter*) report stream))) - -(defgeneric print-plan-report (reporter num stream) - (:method ((reporter null) num stream) - (print-plan-report (find-reporter *default-reporter*) num stream)) - (:method ((reporter t) num stream) - (declare (ignore reporter num)) - ;; Do nothing - )) - -(defgeneric print-finalize-report (reporter plan reports stream) - (:method ((reporter null) plan reports stream) - (print-finalize-report (find-reporter *default-reporter*) - plan - reports - stream))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter/dot.lisp b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter/dot.lisp deleted file mode 100644 index 4039998..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter/dot.lisp +++ /dev/null @@ -1,42 +0,0 @@ -(in-package :cl-user) -(defpackage prove.reporter.dot - (:use :cl - :prove.report - :prove.reporter - :prove.reporter.list - :prove.color)) -(in-package :prove.reporter.dot) - -(defclass dot-reporter (list-reporter) ()) - -(defmethod format-report (stream (reporter dot-reporter) (report comment-report) &rest args) - (declare (ignore args)) - ;; Do nothing. This reporter doesn't support 'diag'. - ) - -(defmethod format-report (stream (reporter dot-reporter) (report test-report) &rest args) - (declare (ignore args)) - (when (zerop *indent-level*) - (if *enable-colors* - (with-color ((cond - ((failed-report-p report) :red) - ((skipped-report-p report) :cyan) - (T :gray)) :stream stream) - (format stream (if (error-report-p report) - "x" - "."))) - (write-char (if (failed-report-p report) #\f #\.) stream)))) - -(defmethod print-finalize-report :before ((reporter dot-reporter) plan reports stream) - (declare (ignore plan reports)) - (fresh-line stream)) - -(defmethod print-finalize-report :after ((reporter dot-reporter) plan reports stream) - (let ((failed-reports (remove-if-not #'failed-report-p reports)) - (list-reporter (make-instance 'list-reporter))) - (when failed-reports - (format stream "~2&") - (map nil - (lambda (report) - (format-report stream list-reporter report)) - failed-reports)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter/fiveam.lisp b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter/fiveam.lisp deleted file mode 100644 index 9d17780..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter/fiveam.lisp +++ /dev/null @@ -1,71 +0,0 @@ -(in-package :cl-user) -(defpackage prove.reporter.fiveam - (:use :cl - :prove.report - :prove.reporter)) -(in-package :prove.reporter.fiveam) - -(defclass fiveam-reporter (reporter) ()) - -(defmethod format-report (stream (reporter fiveam-reporter) (report comment-report) &rest args) - (declare (ignore stream reporter report args)) - ;; Do nothing. This reporter doesn't support 'diag'. - ) - -(defmethod format-report (stream (reporter fiveam-reporter) (report test-report) &rest args) - (declare (ignore args)) - (when (zerop *indent-level*) - (write-char (if (failed-report-p report) #\f #\.) stream))) - -(defmethod print-error-report ((reporter fiveam-reporter) (report failed-test-report) stream) - (with-slots (description got got-form expected notp report-expected-label print-error-detail) report - (cond - (print-error-detail - (format/indent reporter - stream "~& ~:[(no description)~;~:*~A~]:~% ~S~:[~*~; => ~S~]~% is ~:[~;not ~]expected to ~:[be~;~:*~A~]~% ~S~%" - description - got-form - (not (eq got got-form)) - got - notp - report-expected-label - expected)) - (T (format/indent reporter stream "~& ~:[(no description)~;~:*~A~]: Failed~%" - description))))) - -(defmethod print-error-report ((reporter fiveam-reporter) (report composed-test-report) stream) - (with-slots (plan children description) report - (format/indent reporter stream "~& ~:[(no description)~;~:*~A~]:~%" - description) - (let ((*indent-level* (1+ *indent-level*))) - (print-finalize-report reporter plan children stream)))) - -(defmethod print-error-report ((reporter fiveam-reporter) (report comment-report) stream) - (format/indent reporter stream "~& ~A~%" - (slot-value report 'description))) - -(defmethod print-finalize-report ((reporter fiveam-reporter) plan reports stream) - (let ((failed-count (count-if #'failed-report-p reports)) - (passed-count (count-if #'passed-report-p reports)) - (skipped-count (count-if #'skipped-report-p reports)) - (count (count-if #'test-report-p reports))) - (format/indent reporter stream - "~& Did ~D checks.~:[~*~; (planned ~D tests)~]~%" - count - (not (eql plan count)) - plan) - (unless (zerop count) - (format/indent reporter - stream " Pass: ~D (~3D%)~%" passed-count (round (* (/ passed-count count) 100))) - (unless (zerop skipped-count) - (format/indent reporter - stream " Skip: ~D (~3D%)~%" skipped-count (round (* (/ skipped-count count) 100)))) - (format/indent reporter - stream " Fail: ~D (~3D%)~%" failed-count (round (* (/ failed-count count) 100)))) - (unless (zerop failed-count) - (format/indent reporter - stream "~2& Failure Details:~% --------------------------------~%") - (loop for report across reports - when (failed-report-p report) - do (print-error-report reporter report stream) - (format/indent reporter stream " --------------------------------~%"))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter/list.lisp b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter/list.lisp deleted file mode 100644 index fe96982..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter/list.lisp +++ /dev/null @@ -1,171 +0,0 @@ -(in-package :cl-user) -(defpackage prove.reporter.list - (:use :cl - :prove.report - :prove.reporter) - (:import-from :prove.color - :with-color) - (:export :list-reporter - :report-expected-line)) -(in-package :prove.reporter.list) - -(defclass list-reporter (reporter) ()) - -(defmethod format-report (stream (reporter list-reporter) (report comment-report) &rest args) - (declare (ignore args)) - (with-additional-indent (reporter stream "~& ") - (with-color (:white :stream stream) - (format/indent reporter stream (slot-value report 'description))) - (terpri stream))) - - -(defun omit-long-value (value) - (typecase value - (string - (if (< 500 (length value)) - (format nil "\"~A ...\"" (subseq value 0 94)) - (prin1-to-string value))) - (otherwise - (let ((value (prin1-to-string value))) - (if (< 500 (length value)) - (format nil "~A ..." (subseq value 0 96)) - value))))) - - -(defgeneric report-expected-line (report) - (:documentation "Reports about failed or passed test. - Should return a string with description of what have happened.") - - (:method ((report normal-test-report)) - (with-slots (got got-form notp report-expected-label expected) report - (escape-tildes - (format nil "~A is ~:[~;not ~]expected to ~:[be~;~:*~A~] ~A~:[ (got ~S)~;~*~]" - (omit-long-value (or got-form got)) - notp - report-expected-label - (omit-long-value expected) - (eq got got-form) - got))))) - - -(defun escape-tildes (text) - (ppcre:regex-replace-all "~" text "~~")) - - -(defun possible-report-description (report) - (cond - ((slot-value report 'description) - (format nil "~A~:[~; (Skipped)~]" - (escape-tildes (slot-value report 'description)) - (skipped-report-p report))) - (T (report-expected-line report)))) - -(defun print-duration (stream duration &optional slow-threshold) - (let ((color (if slow-threshold - (cond - ((< slow-threshold duration) :red) - ((< (/ slow-threshold 2) duration) :yellow)) - :gray))) - (when color - (with-color (color :stream stream) - (format stream "(~Dms)" duration))))) - -(defmethod format-report (stream (reporter list-reporter) (report normal-test-report) &rest args) - (declare (ignore args)) - (with-additional-indent (reporter stream "~& ") - (with-color (:green :stream stream) - (with-additional-indent (reporter stream "✓ ") - (let ((description (possible-report-description report)) - (duration (slot-value report 'duration))) - (when description - (with-color (:gray :stream stream) - (format/indent reporter stream description))) - - (when duration - (format stream " ") - (print-duration stream duration (slot-value report 'slow-threshold)))) - (terpri stream))))) - -(defmethod format-report (stream (reporter list-reporter) (report skipped-test-report) &rest args) - (declare (ignore args)) - (with-additional-indent (reporter stream "~& ") - (with-color (:cyan :stream stream) - (with-additional-indent (reporter stream "- ") - (let ((description (possible-report-description report))) - (when description - (format/indent reporter stream description)))) - (terpri stream)))) - -(defmethod format-report (stream (reporter list-reporter) (report failed-test-report) &rest args) - (declare (ignore args)) - (with-additional-indent (reporter stream "~& ") - (with-color (:red :stream stream) - (with-additional-indent (reporter stream "× ") - (let ((description (possible-report-description report)) - (duration (slot-value report 'duration))) - (when description - (format/indent reporter stream description)) - (when duration - (format stream " ") - (print-duration stream duration (slot-value report 'slow-threshold)))) - (when (slot-value report 'description) - (format/indent reporter stream - (concatenate 'string "~&" (report-expected-line report))))) - (terpri stream)))) - -(defmethod format-report (stream (reporter list-reporter) (report error-test-report) &rest args) - (declare (ignore args)) - ;; format/indent - (with-additional-indent (reporter stream "~& ") - (with-color (:red :stream stream) - (with-additional-indent (reporter stream "× ") - (when (slot-value report 'description) - (format/indent reporter stream "~A~%" (slot-value report 'description))) - (format/indent reporter stream "Raised an error ~A (expected: ~S)" - (slot-value report 'got) - (slot-value report 'expected))))) - (terpri stream)) - -(defmethod format-report (stream (reporter list-reporter) (report composed-test-report) &rest args) - (declare (ignore args)) - ;; Do nothing - ) - -(defmethod print-plan-report ((reporter list-reporter) num stream) - (when (numberp num) - (format/indent reporter stream "~&1..~A~2%" num))) - -(defmethod print-finalize-report ((reporter list-reporter) plan reports stream) - (let ((failed-count (count-if #'failed-report-p reports)) - (skipped-count (count-if #'skipped-report-p reports)) - (count (count-if #'test-report-p reports))) - (format/indent reporter stream "~2&") - (cond - ((eq plan :unspecified) - (with-color (:yellow :stream stream) - (format/indent reporter stream - "△ Tests were run but no plan was declared.~%"))) - ((and plan - (not (= count plan))) - (with-color (:yellow :stream stream) - (format/indent reporter stream - "△ Looks like you planned ~D test~:*~P but ran ~A.~%" - plan count)))) - (if (< 0 failed-count) - (with-color (:red :stream stream) - (format/indent reporter stream - "× ~D of ~D test~:*~P failed" - failed-count count)) - (with-color (:green :stream stream) - (format/indent reporter stream - "✓ ~D test~:*~P completed" count))) - (format stream " ") - (print-duration stream - (reduce #'+ - (remove-if-not #'test-report-p reports) - :key (lambda (report) (or (slot-value report 'duration) 0)))) - (terpri stream) - (unless (zerop skipped-count) - (with-color (:cyan :stream stream) - (format/indent reporter stream "◠~D test~:*~P skipped" skipped-count)) - (terpri stream)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter/tap.lisp b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter/tap.lisp deleted file mode 100644 index 722ba1e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/reporter/tap.lisp +++ /dev/null @@ -1,70 +0,0 @@ -(in-package :cl-user) -(defpackage prove.reporter.tap - (:use :cl - :prove.report - :prove.reporter)) -(in-package :prove.reporter.tap) - -(defclass tap-reporter (reporter) - ((indent-space :initform 4))) - -(defmethod format-report (stream (reporter tap-reporter) (report comment-report) &rest args) - (declare (ignore args)) - (format/indent reporter stream "~&# ~A~%" - (slot-value report 'description))) - -(defmethod format-report (stream (reporter tap-reporter) (report test-report) &key count) - (with-slots (description print-error-detail) report - (format/indent reporter stream - "~&~:[not ~;~]ok~:[~;~:* ~D~]~:[~;~:* - ~A~]~%" - (or (passed-report-p report) - (skipped-report-p report)) - count - description) - (print-error-report reporter report stream))) - -(defmethod format-report (stream (reporter tap-reporter) (report skipped-test-report) &key count) - (format/indent reporter stream - "~&ok~:[~;~:* ~D~] - skip~:[~;~:* ~A~]~%" - count - (slot-value report 'description))) - -(defmethod print-error-report ((reporter tap-reporter) (report failed-test-report) stream) - (with-slots (got got-form expected notp report-expected-label print-error-detail) report - (when print-error-detail - (format/indent reporter stream - "~&# got: ~S~:[~*~; => ~S~]~%# ~:[~;not ~]expected~:[~;~:* to ~A~]: ~S~%" - got-form - (not (eq got got-form)) - got - notp - report-expected-label - expected)))) - -(defmethod print-plan-report ((reporter tap-reporter) num stream) - (when (numberp num) - (format-report stream - reporter - (make-instance 'report - :description (format nil "1..~A" num))))) - -(defmethod print-finalize-report ((reporter tap-reporter) plan reports stream) - (let ((failed-count (count-if #'failed-report-p reports)) - (count (count-if #'test-report-p reports))) - (cond - ((eq plan :unspecified) - (format/indent reporter stream - "~&# Tests were run but no plan was declared.~%")) - ((and plan - (not (= count plan))) - (format/indent reporter stream - "~&# Looks like you planned ~D test~:*~P but ran ~A.~%" - plan count))) - (fresh-line stream) - (if (< 0 failed-count) - (format/indent reporter stream - "# Looks like you failed ~D test~:*~P of ~A run." - failed-count count) - (format/indent reporter stream "# All ~D test~:*~P passed." - count)) - (terpri stream))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/suite.lisp b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/suite.lisp deleted file mode 100644 index 24c7b47..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/suite.lisp +++ /dev/null @@ -1,92 +0,0 @@ -(in-package :cl-user) -(defpackage prove.suite - (:use :cl) - (:import-from :prove.output - :*test-result-output*) - (:import-from :prove.report - :report - :failed-report-p) - (:import-from :prove.reporter - :print-plan-report - :print-finalize-report) - (:import-from :prove.asdf - :*last-suite-report*) - (:export :*suite* - - :current-suite - - :suite - :package-suite - :suite-plan - :test-count - :failed - :reports - :slow-threshold - :*default-slow-threshold* - - :add-report - :plan - :finalize)) -(in-package :prove.suite) - -(defparameter *suite* nil) -(defparameter *default-slow-threshold* 75) - -(defclass suite () - ((plan :initarg :plan - :initform :unspecified - :accessor suite-plan) - (slow-threshold :initarg :slow-threshold - :initform *default-slow-threshold*) - (test-count :initform 0 - :accessor test-count) - (failed :initform 0 - :accessor failed) - (reports :initform (make-array 0 :adjustable t :fill-pointer 0) - :accessor reports))) - -(defun slow-threshold (&optional new-threshold) - (if new-threshold - (setf (slot-value (current-suite) 'slow-threshold) new-threshold) - (slot-value (current-suite) 'slow-threshold))) - -(defclass package-suite (suite) ()) - -(defvar *defined-suites* (make-hash-table :test 'equal)) - -(defun find-package-suite (package-designator) - (let ((package (typecase package-designator - (package package-designator) - (T (find-package package-designator))))) - (or (gethash (package-name package) *defined-suites*) - (setf (gethash (package-name package) *defined-suites*) - (make-instance 'package-suite))))) - -(defun current-suite () - (or *suite* - (find-package-suite *package*))) - -(defun reset-suite (suite) - (with-slots (test-count failed reports) suite - (setf test-count 0) - (setf failed 0) - (setf reports (make-array 0 :adjustable t :fill-pointer 0)))) - -(defun add-report (report suite) - (check-type report report) - (when (failed-report-p report) - (incf (slot-value suite 'failed))) - (vector-push-extend report (slot-value suite 'reports))) - -(defun plan (num) - (let ((suite (current-suite))) - (setf (slot-value suite 'plan) num) - (reset-suite suite)) - (print-plan-report nil num *test-result-output*)) - -(defun finalize (&optional (suite (current-suite))) - (with-slots (plan reports failed) suite - (print-finalize-report nil plan reports *test-result-output*) - (setf *last-suite-report* - (list :plan plan :failed failed)) - (zerop failed))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/test.lisp b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/test.lisp deleted file mode 100644 index 81389a5..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/src/test.lisp +++ /dev/null @@ -1,366 +0,0 @@ -(in-package :cl-user) -(defpackage prove.test - (:use :cl) - (:import-from :prove.output - :*test-result-output*) - (:import-from :prove.report - :test-report-p - :passed-test-report - :failed-test-report - :error-test-report - :skipped-test-report - :comment-report - :composed-test-report - :failed-report-p - :duration) - (:import-from :prove.reporter - :format-report - :*indent-level* - :*additional-indent*) - (:import-from :prove.suite - :suite - :*suite* - :suite-plan - :test-count - :failed - :reports - :slow-threshold - :current-suite - :finalize - :add-report) - (:import-from :alexandria - :with-gensyms - :once-only) - (:export :*default-test-function* - :*debug-on-error* - - :ok - :is - :isnt - :is-values - :is-print - :is-condition - :is-error - :is-type - :like - :is-expand - :diag - :skip - :pass - :fail - :subtest - - :*gensym-prefix* - - :deftest - :run-test - :run-test-package - :run-test-all - :remove-test - :remove-test-all)) -(in-package :prove.test) - -(defvar *debug-on-error* nil) -(defvar *default-test-function* #'equal) - -(defun parse-description-and-test (args) - (if (consp args) - (case (length args) - (1 (car args)) - (2 (if (eq :test (car args)) - (values nil (cadr args)) - (car args))) - (t (let ((k (member :test args))) - (case (length k) - ((0 1) (car args)) - (2 (values (car args) (cadr k))) - (t (values (nth 2 k) (cadr k))))))) - args)) - -(defun test (got expected args - &key notp - duration - (got-form nil got-form-supplied-p) - (test-fn *default-test-function*) - (passed-report-class 'passed-test-report) - (failed-report-class 'failed-test-report) - report-expected-label - (print-error-detail t) - (output t)) - (multiple-value-bind (desc arg-test) - (parse-description-and-test args) - (let* ((test-function (or arg-test test-fn)) - (result (funcall test-function got expected)) - (result (if notp (not result) result)) - (suite (current-suite)) - (report (apply #'make-instance - (if result - passed-report-class - failed-report-class) - :duration duration - :slow-threshold (slot-value suite 'slow-threshold) - :test-function test-function - :notp notp - :got got - :got-form (if got-form-supplied-p - got-form - got) - :expected expected - :description desc - :print-error-detail print-error-detail - (and report-expected-label - (list :report-expected-label report-expected-label))))) - (add-report report suite) - (unless result - (incf (failed suite))) - (incf (test-count suite)) - (when output - (format-report *test-result-output* nil report :count (test-count suite))) - (values result report)))) - -(defmacro with-duration (((duration result) form) &body body) - (with-gensyms (start end) - `(let* ((,start (get-internal-real-time)) - (,result ,form) - (,end (get-internal-real-time)) - (,duration (- ,end ,start))) - ,@body))) - -(defmacro with-catching-errors ((&key description expected) &body body) - (with-gensyms (e suite report) - `(if *debug-on-error* - (progn ,@body) - (handler-case (progn ,@body) - (error (,e) - (let ((,suite (current-suite)) - (,report (make-instance 'error-test-report - :got ,e - :got-form ,e - :expected ,expected - :description ,description - :duration nil))) - (add-report ,report ,suite) - (incf (failed ,suite)) - (incf (test-count ,suite)) - (format-report *test-result-output* nil ,report :count (test-count ,suite)))))))) - -(defmacro ok (test &optional desc) - (with-gensyms (duration result) - (once-only (test desc) - `(with-catching-errors (:expected T :description ,desc) - (with-duration ((,duration ,result) ,test) - (test ,result t ,desc - :duration ,duration - :test-fn (lambda (x y) - (eq (not (null x)) y)) - :got-form ,test)))))) - -(defmacro is (got expected &rest args) - (with-gensyms (duration result new-args desc) - (once-only (expected) - `(let* ((,new-args (list ,@args)) - (,desc (parse-description-and-test ,new-args))) - (with-catching-errors (:description ,desc :expected ,expected) - (with-duration ((,duration ,result) ,got) - (test ,result ,expected ,new-args - :duration ,duration))))))) - -(defmacro isnt (got expected &rest args) - (with-gensyms (duration result new-args desc) - (once-only (expected) - `(let* ((,new-args (list ,@args)) - (,desc (parse-description-and-test ,new-args))) - (with-catching-errors (:description ,desc :expected ,expected) - (with-duration ((,duration ,result) ,got) - (test ,result ,expected ,new-args - :notp t - :duration ,duration))))))) - -(defmacro is-values (got expected &rest args) - `(is (multiple-value-list ,got) ,expected ,@args)) - -(defmacro is-print (got expected &optional desc) - (with-gensyms (output duration duration-inner) - (once-only (expected desc) - `(with-catching-errors (:description ,desc :expected ,expected) - (let* (,duration - (,output (with-output-to-string (*standard-output*) - (with-duration ((,duration-inner ,output) ,got) - (declare (ignore ,output)) - (setq ,duration ,duration-inner))))) - (test ,output ,expected ,desc - :duration ,duration - :got-form ',got - :test-fn #'string= - :report-expected-label "output")))))) - -(defmacro is-condition (form condition &optional desc) - (with-gensyms (error duration) - `(with-duration ((,duration ,error) (handler-case ,form - (condition (,error) ,error))) - (test ,error - ,(if (and (listp condition) (eq 'quote (car condition))) - condition - `(quote ,condition)) - ,desc - :duration ,duration - :got-form ',form - :test-fn #'typep - :report-expected-label "raise a condition")))) - -;;; alias is-error to is-condition -(setf (macro-function 'is-error) (macro-function 'is-condition)) - -(defmacro is-type (got expected-type &optional desc) - (with-gensyms (duration result) - (once-only (desc expected-type) - `(with-catching-errors (:description ,desc :expected ,expected-type) - (with-duration ((,duration ,result) ,got) - (test ,result ,expected-type ,desc - :duration ,duration - :got-form ',got - :test-fn #'typep - :report-expected-label "be a type of")))))) - -(defmacro like (got regex &optional desc) - (with-gensyms (duration result) - (once-only (regex desc) - `(with-catching-errors (:description ,desc :expected ,regex) - (with-duration ((,duration ,result) ,got) - (test ,result ,regex ,desc - :duration ,duration - :test-fn (lambda (x y) (not (null (ppcre:scan y x)))) - :report-expected-label "be like")))))) - -(defvar *gensym-prefix* "$") -(defvar *gensym-alist* nil) - -(defun gensymp (val) - (and (symbolp val) - (string= (subseq (symbol-name val) 0 (length *gensym-prefix*)) *gensym-prefix*))) - -(defgeneric gensym-tree-equal (x y) - (:method (x y) - (if (and (gensymp y) (symbolp x)) - (if (assoc y *gensym-alist*) - (eq x (cdr (assoc y *gensym-alist*))) - (unless (rassoc x *gensym-alist*) - (setf *gensym-alist* `((,y . ,x) ,@*gensym-alist*)) - t)) - (equal x y))) - (:method ((x cons) (y cons)) - (loop for a in x for b in y - always (gensym-tree-equal a b)))) - -(defmacro is-expand (got expected &optional desc) - (with-gensyms (duration expanded) - (once-only (desc) - `(with-duration ((,duration ,expanded) (macroexpand-1 ',got)) - (let (*gensym-alist*) - (test ,expanded ',expected ,desc - :duration ,duration - :got-form ',got - :report-expected-label "be expanded to" - :test-fn #'gensym-tree-equal)))))) - -(defun diag (desc) - (let ((report (make-instance 'comment-report - :description desc))) - (add-report report (current-suite)) - (format-report *test-result-output* nil report))) - -(defun skip (how-many why &rest format-args) - (check-type how-many integer) - (dotimes (i how-many) - (test t t (apply #'format nil why format-args) - :passed-report-class 'skipped-test-report))) - -(defun pass (desc) - (test t t desc)) - -(defun fail (desc) - (test t nil desc - :print-error-detail nil)) - -(defun %subtest (desc body-fn) - (diag desc) - (let ((report - (let ((*suite* (make-instance 'suite)) - (*indent-level* (1+ *indent-level*)) - (*additional-indent* 0)) - (if *debug-on-error* - (funcall body-fn) - (handler-case (funcall body-fn) - (error (e) - (let ((error-report - (make-instance 'error-test-report - :expected :non-error - :got e - :description (format nil "Aborted due to an error in subtest ~S" desc)))) - (add-report error-report *suite*) - (format-report *test-result-output* nil error-report :count (test-count *suite*)))))) - (make-instance 'composed-test-report - :duration (reduce #'+ - (remove-if-not #'test-report-p (reports *suite*)) - :key (lambda (report) (or (slot-value report 'duration) 0))) - :plan (suite-plan *suite*) - :description desc - :children (reports *suite*)))) - (suite (current-suite))) - (add-report report suite) - (incf (test-count suite)) - (format-report *test-result-output* nil report :count (test-count suite)))) - -(defmacro subtest (desc &body body) - `(%subtest ,desc (lambda () ,@body))) - -(defvar *package-tests* (make-hash-table)) - -(defmacro deftest (name &body test-forms) - (let ((tests (gensym "TESTS")) - (test (gensym "TEST")) - (test-fn (gensym "TEST-FN"))) - `(progn - (unless (nth-value 1 (gethash *package* *package-tests*)) - (setf (gethash *package* *package-tests*) '())) - (let* ((,tests (gethash *package* *package-tests*)) - (,test (assoc ',name ,tests :test #'string=)) - (,test-fn (lambda () - (subtest (princ-to-string ',name) - ,@test-forms)))) - (if ,test - (rplacd ,test ,test-fn) - (push (cons ',name ,test-fn) (gethash *package* *package-tests*))) - ',name)))) - -(defun run-test (name) - (let ((test (assoc name - (gethash *package* *package-tests*) - :test #'string=))) - (unless test - (error "Test not found: ~S" name)) - (funcall (cdr test)))) - -(defun run-test-package (package-designator) - (let ((*package* (typecase package-designator - (package package-designator) - (T (find-package package-designator))))) - (loop for (name . test-fn) in (reverse (gethash *package* *package-tests*)) - do (funcall test-fn)) - (finalize))) - -(defun run-test-all () - (maphash (lambda (package tests) - (declare (ignore tests)) - (run-test-package package)) - *package-tests*)) - -(defun remove-test (name) - (setf (gethash *package* *package-tests*) - (delete name - (gethash *package* *package-tests*) - :key #'car - :test #'string=))) - -(defun remove-test-all () - (setf (gethash *package* *package-tests*) nil)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/t/prove.lisp b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/t/prove.lisp deleted file mode 100644 index e8ae103..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/t/prove.lisp +++ /dev/null @@ -1,166 +0,0 @@ -(in-package :cl-user) -(defpackage t.prove - (:use :cl - :prove - :prove.t.utils)) -(in-package :t.prove) - -(setf *default-reporter* :list) - - -(plan 22) - -(test-assertion "Successful OK" - (ok t) - "✓ T is expected to be T") - - -(test-assertion "Failed ok without description" - (ok nil) - "× NIL is expected to be T") - - -(test-assertion "Failed ok with description" - (ok nil "This supposed to be failed") - " -× This supposed to be failed - NIL is expected to be T") - - -(test-assertion "Simple number equality check" - (is 1 1) - "✓ 1 is expected to be 1") - - -(test-assertion "String and number shouldn't be equal" - (is "1" 1) - "× \"1\" is expected to be 1") - - -(test-assertion "String and number are not equal and isnt assertion returns OK" - (isnt "1" 1) - "✓ \"1\" is not expected to be 1") - - -(test-assertion "Subtest with diagnostic message" - (subtest "Subtest" - (diag "in subtest") - (is #\a #\a) - (like "truth" "^true")) -" -Subtest - in subtest - ✓ #\\a is expected to be #\\a - × \"truth\" is expected to be like \"^true\"") - - -(test-assertion "Check if (is-values ...) works propertly" - (is-values (values 1 2 nil 3) - '(1 2 nil 3)) - "✓ (1 2 NIL 3) is expected to be (1 2 NIL 3)") - - -(test-assertion "Standalone diagnostic message" - (diag "comment") - "comment") - - -(test-assertion "Just a pass" - (pass "pass") - "✓ pass") - - -(test-assertion "Fail" - (fail "fail") - " -× fail - T is expected to be NIL") - - -(test-assertion "Pass with parameter" - (pass "<~S>") - "✓ <~S>") - - -(test-assertion "Equality for strings with formatting" - (is "<~S>" "<~S>") - "✓ \"<~S>\" is expected to be \"<~S>\"") - - -(test-assertion "\"Skip\" with reason as control-string with arguments should substitute arguments" - (skip 1 "Because ~A" 42) - "- Because 42 (Skipped)") - - -(test-assertion "\"Skip\" without reason have default message \"skipping\"" - (skip 1 "skipping") - "- skipping (Skipped)") - - -(test-assertion "Assert is-print compares form's output to standart-output" - (is-print (princ "ABCDEFGH") - "ABCDEFGHIJKLMNO") - "× (PRINC \"ABCDEFGH\") is expected to output \"ABCDEFGHIJKLMNO\" (got \"ABCDEFGH\")") - - -(test-assertion "Type assertion fails if type mismatch" - (is-type 1 'string) - "× 1 is expected to be a type of STRING") - - -(test-assertion "Assertion \"is-error\" checks if condition of given type was thrown" - (is-error (error "Raising an error") 'simple-error) - "(?s)✓ \\(ERROR \"Raising an error\"\\) is expected to raise a condition SIMPLE-ERROR \\(got #<(a )?SIMPLE-ERROR.*>\\)") - - -(define-condition my-condition () ()) - -(test-assertion "If condition type mismatch, \"is-error\" fails" - (is-error (error 'my-condition) 'simple-error) - "(?s)× \\(ERROR ('MY-CONDITION|\\(QUOTE MY-CONDITION\\))\\) is expected to raise a condition SIMPLE-ERROR \\(got #<(a T.PROVE::)?MY-CONDITION.*>\\)") - - -(test-assertion - "All lines of multiline description should be indented" - (is 'blah 'blah - "Blah with multiline -description!") - " -✓ Blah with multiline - description!") - - -(test-assertion - "Multiline indentation should work for nested tests" - (subtest "Outer testcase -with multiline -description." - (is 'blah 'blah - "Blah with multiline -description!") - - (subtest "Inner testcase -with multiline description." - (is 'foo 'foo - "Foo with multiline -description!"))) - " -Outer testcase -with multiline -description. - ✓ Blah with multiline - description! - Inner testcase - with multiline description. - ✓ Foo with multiline - description!") - - -(test-assertion "Check finalize's output without a plan" - (finalize) - " -△ Tests were run but no plan was declared. -✓ 0 tests completed (0ms)") - - -(finalize) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/t/utils.lisp b/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/t/utils.lisp deleted file mode 100644 index 1170447..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/prove-20171130-git/t/utils.lisp +++ /dev/null @@ -1,118 +0,0 @@ -(in-package :cl-user) -(defpackage prove.t.utils - (:use :cl) - (:import-from :split-sequence - :split-sequence) - (:import-from :alexandria - :with-gensyms) - (:import-from :prove - :like - :subtest - :is) - (:export :test-assertion)) -(in-package :prove.t.utils) - - -(defun empty-line-p (line) - "Checks if line of text is empty." - (equal line "")) - - -(defun get-indentation (line) - "Returns numbers of leading spaces for the line." - (loop - :for char :across line - :for num-spaces :upfrom 0 - :when (not (equal char #\Space)) - :do (return num-spaces))) - - -(defun left-remove-if (items predicate) - "Returns list skipping leftmost items - which match a predicate." - (do () - ((not (funcall predicate (car items))) items) - (setf items (cdr items)))) - -(defun right-remove-if (items predicate) - "Returns a new list, without rightmost items -which match a predicate." - (labels ((recur (items) - (destructuring-bind (head . tail) items - (if tail - (let ((tail (recur tail))) - (if tail - (cons head tail) - (unless (funcall predicate head) - (list head)))) - (if (funcall predicate head) - nil - (list head)))))) - (recur items))) - - -(defun deindent (text) - "Removes empty new lines at the begining and at the end of the text, -and removes common number of whitespaces from rest of the lines." - (let* ((all-lines (split-sequence - #\Newline - text)) - ;; remove empty lines at beginning - (left-trimmed (left-remove-if - all-lines - #'empty-line-p)) - ;; and at the end - (lines (right-remove-if - left-trimmed - #'empty-line-p)) - - ;; calculate common indentation - (min-indent (apply #'min (mapcar #'get-indentation lines))) - - ;; remove common indentation from lines - (new-lines (loop :for line :in lines - :collect (subseq line min-indent)))) - - ;; now join lines together and separate them with new-lines - (values (format nil "~{~a~^~%~}" new-lines) - min-indent))) - - -(defmacro test-assertion (title body expected - &aux (method (if (search ".*" expected) - 'like - 'is))) - "Tests that assertion result in prove's output -matches given regular expression. - -Body evaluated and it's result is matched agains expected string, -using prove:like. Dangling spaces and newlines are trimmed from -the result before trying to match." - - (with-gensyms (result trimmed-result deindented-expected) - `(subtest ,title - (let* ((,result - ;; All output during the test, should be captured - ;; to test against give regex - (with-output-to-string - (prove.output:*test-result-output*) - - (let ( ;; Colors whould be turned off to - ;; prevent Prove's reporter return - ;; string with terminal sequences. - ;; This way it will be easier to compare - ;; results with usual strings - (prove.color:*enable-colors* nil) - ;; We need to overide current suite, to prevent - ;; tested assert-that macro from modifying real testsuite. - ;; Otherwise it can increment failed or success tests count - ;; and prove will output wrong data. - (prove.suite:*suite* (make-instance 'prove.suite:suite)) - (prove.reporter::*debug-indentation* nil)) - ,body))) - - (,trimmed-result (string-trim '(#\Space #\Newline) - (deindent ,result))) - (,deindented-expected (deindent ,expected))) - (,method ,trimmed-result - ,deindented-expected))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/.gitignore b/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/.gitignore deleted file mode 100644 index e4e5f6c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*~ \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/LICENSE.txt b/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/LICENSE.txt deleted file mode 100644 index 3263f84..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/LICENSE.txt +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Zachary Beane - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/README.txt b/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/README.txt deleted file mode 100644 index 73031b0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/README.txt +++ /dev/null @@ -1,8 +0,0 @@ -Quickproject creates the skeleton of a Common Lisp project. - -For full documentation, see doc/index.html. - -Quickproject is licensed under the MIT license; see LICENSE.txt for -details. - -For questions or comments, please email Zach Beane . diff --git a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/default-template/README.md b/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/default-template/README.md deleted file mode 100644 index 97588dd..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/default-template/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# (#| TMPL_VAR name |#) -### _(#| TMPL_VAR author |#)_ - -This is a project to do ... something. - -## License - -(#| TMPL_VAR license |#) -(#| TMPL_IF copyright |#) - -(#| TMPL_VAR copyright |#) -(#| /TMPL_IF |#) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/default-template/application.lisp b/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/default-template/application.lisp deleted file mode 100644 index 564d244..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/default-template/application.lisp +++ /dev/null @@ -1,5 +0,0 @@ -;;;; (#| TMPL_VAR name |#).lisp(#| TMPL_IF copyright |#) -;; -;;;; (#| TMPL_VAR copyright |#)(#| /TMPL_IF |#) - -(in-package #:(#| TMPL_VAR name |#)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/default-template/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/default-template/package.lisp deleted file mode 100644 index ae60d64..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/default-template/package.lisp +++ /dev/null @@ -1,6 +0,0 @@ -;;;; package.lisp(#| TMPL_IF copyright |#) -;; -;;;; (#| TMPL_VAR copyright |#)(#| /TMPL_IF |#) - -(defpackage #:(#| TMPL_VAR name |#) - (:use #:cl)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/default-template/system.asd b/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/default-template/system.asd deleted file mode 100644 index 186db66..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/default-template/system.asd +++ /dev/null @@ -1,13 +0,0 @@ -;;;; (#| TMPL_VAR name |#).asd(#| TMPL_IF copyright |#) -;; -;;;; (#| TMPL_VAR copyright |#)(#| /TMPL_IF |#) - -(asdf:defsystem #:(#| TMPL_VAR name |#) - :description "Describe (#| TMPL_VAR name |#) here" - :author "(#| TMPL_VAR author |#)" - :license "(#| TMPL_VAR license |#)" - :version "0.0.1" - :serial t(#| TMPL_IF depends-on |#) - :depends-on (#| TMPL_VAR dependencies-string |#)(#| /TMPL_IF |#) - :components ((:file "package") - (:file "(#| TMPL_VAR name |#)"))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/doc/LICENSE.txt b/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/doc/LICENSE.txt deleted file mode 100644 index e5624cf..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/doc/LICENSE.txt +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2012 Zachary Beane - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/doc/index.html b/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/doc/index.html deleted file mode 100644 index 296e844..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/doc/index.html +++ /dev/null @@ -1,265 +0,0 @@ - - - - - Quickproject - create a Common Lisp project skeleton - - - - -


- - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/doc/style.css b/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/doc/style.css deleted file mode 100644 index 71346c9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/doc/style.css +++ /dev/null @@ -1,83 +0,0 @@ - -body { - margin-left: 4em; - font: medium/1.45em "Lucida Grande", "Trebuchet MS", "Bitstream Vera Sans", Verdana, Helvetica, sans-serif; - -} - -p.copyright { - font-size: 75%; - font-weight: bold; -} - -#content { - margin-left: 4em; - margin-right: 4em; - max-width: 50em; -} - -h2, h3 { - margin-bottom: 0em; - margin-top: 2em; -} - -p.html { - margin-left: 1em; - font-family: monospace; -} - -.type { - color: #999; -} - -.signature { - color: #A01; - margin-left: 1em; -} - -.signature span.result { - color: black; -} - -.signature code.llkw { - font-family: monospace; -} - -.signature span.result var { - color: #A01; -} - -div.signature { - margin-left: 1.5em; - text-indent: -1.5em; -} - -.signature code.name { - font-weight: bold; -} - -.signature code { - font-family: sans-serif; -} - -blockquote.description { - margin-left: 1em; -} - -a[href] { - text-decoration: none; - border-bottom: dotted 1px #CCC; - color: #600; -} - -a:hover[href] { - text-decoration: none; - border-bottom: solid 1px #F00; - color: #F00; -} - -pre.code { - border: solid 1px #DDD; - padding: 0.5em; - background: #EEE; -} \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/package.lisp deleted file mode 100644 index 9244391..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/package.lisp +++ /dev/null @@ -1,23 +0,0 @@ -;;;; package.lisp - -(defpackage #:quickproject - (:documentation "The Quickproject package.") - (:use #:cl) - (:export #:make-project - #:*after-make-project-hooks* - #:*author* - #:*license* - #:*template-directory* - #:*include-copyright* - #:default-template-parameters - #:*template-parameter-functions*) - (:shadowing-import-from #:html-template - #:fill-and-print-template - #:*template-start-marker* - #:*template-end-marker*) - (:shadowing-import-from #:cl-fad - #:pathname-as-directory - #:walk-directory)) - -(in-package #:quickproject) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/quickproject.asd b/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/quickproject.asd deleted file mode 100644 index 2e90cc8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/quickproject.asd +++ /dev/null @@ -1,12 +0,0 @@ -;;;; quickproject.asd - -(asdf:defsystem #:quickproject - :description "Creates the skeleton of a new Common Lisp project" - :version "1.4.1" - :author "Zach Beane " - :license "MIT" - :depends-on (#:cl-fad - #:html-template) - :serial t - :components ((:file "package") - (:file "quickproject"))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/quickproject.lisp b/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/quickproject.lisp deleted file mode 100644 index 522767e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/quickproject-1.4.1/quickproject.lisp +++ /dev/null @@ -1,144 +0,0 @@ -;;;; quickproject.lisp - -(in-package #:quickproject) - -(defvar *name*) -(setf (documentation '*name* 'variable) - "The name of the project currently being created.") - -(defvar *template-directory* (asdf:system-relative-pathname :quickproject "default-template") - "A directory to use as a source of template files.") - -(defvar *depends-on* nil - "Dependencies specified at project creation") - -(defvar *author* - "Your Name " - "Set this variable to your contact information.") - -(defvar *license* - "Specify license here") - -(defvar *include-copyright* nil ; This gives default behavior. - "Include a copyright notice at the top of files.") - -(defun pathname-project-name (pathname) - "Return a project name based on PATHNAME by taking the last element -in the pathname-directory list. E.g. returns \"awesome-project\" for -#p\"src/awesome-project/\"." - (first (last (pathname-directory pathname)))) - -(defmacro with-new-file ((stream file) &body body) - "Like WITH-OPEN-FILE, but specialized for output to a file that must -not already exist." - `(with-open-file (,stream ,file - :direction :output - :if-exists :error) - (let ((*print-case* :downcase)) - ,@body))) - -(defun current-year () - (nth-value 5 (decode-universal-time (get-universal-time)))) - -(defvar *after-make-project-hooks* nil - "A list of functions to call after MAKE-PROJECT is finished making a -project. Each function is called with the same arguments passed to -MAKE-PROJECT, except that NAME is canonicalized if -necessary. *DEFAULT-PATHNAME-DEFAULTS* bound to the newly created -project directory.") - -(defun matches-template-p (pathname template) - (and (equal (pathname-name pathname) (pathname-name template)) - (equal (pathname-type pathname) (pathname-type template)))) - -(defun template-pathname->output-name (path) - (if (or (matches-template-p path "system.asd") - (matches-template-p path "application.lisp")) - (make-pathname :name *name* :defaults path) - path)) - -(defun rewrite-templates (template-directory target-directory parameters) - "Treat every file in TEMPLATE-DIRECTORY as a template file; fill it -out using PARAMETERS into a corresponding file in -TARGET-DIRECTORY. The rewriting uses HTML-TEMPLATE. The template start -marker is the string \"\(#|\" and the template end marker is the string -\"|#)\". Template vars are not modified or escaped when written." - (let ((*template-start-marker* "(#|") - (*template-end-marker* "|#)") - (html-template:*warn-on-creation* nil) - (html-template:*string-modifier* 'identity)) - (setf template-directory (truename template-directory) - target-directory (truename target-directory)) - (flet ((rewrite-template (pathname) - (let* ((relative-namestring - (enough-namestring pathname template-directory)) - (target-pathname (template-pathname->output-name - (merge-pathnames relative-namestring - target-directory)))) - (ensure-directories-exist target-pathname) - (with-open-file (stream - target-pathname - :direction :output - :if-exists :rename-and-delete) - (fill-and-print-template pathname - parameters - :stream stream))))) - (walk-directory template-directory #'rewrite-template)))) - -(defun default-template-parameters () - "Return a plist of :NAME, :LICENSE, and :AUTHOR parameters." - (list :name *name* - :license *license* - :author *author* - :depends-on (mapcar - (lambda (sym) - (list :symbol sym :uninterned (format nil "#:~(~a~)" sym))) - *depends-on*) - :dependencies-string (format nil "(~{#:~(~a~)~^ ~})" *depends-on*) - :copyright (when *include-copyright* - (format nil "Copyright (c) ~D ~A~%" (current-year) *author*)))) - -(defvar *template-parameter-functions* (list 'default-template-parameters) - "A list of functions that return plists for use when rewriting - template files. The results of calling each function are appended - together to pass to FILL-AND-PRINT-TEMPLATE.") - -(defun template-parameters (initial-parameters) - "Return all template parameters returned by calling each element in -*TEMPLATE-PARAMETER-FUNCTIONS*, appended together as a single plist." - (apply 'append initial-parameters - (mapcar 'funcall *template-parameter-functions*))) - -(defun make-project (pathname &key - template-parameters - ((:template-directory *template-directory*) - *template-directory*) - ((:depends-on *depends-on*) *depends-on*) - ((:author *author*) *author*) - ((:license *license*) *license*) - (name (pathname-project-name pathname) name-provided-p) - ((:include-copyright *include-copyright*) *include-copyright*)) - "Create a project skeleton for NAME in PATHNAME. If DEPENDS-ON is provided, -it is used as the asdf defsystem depends-on list." - (check-type *depends-on* list) - (when (pathname-name pathname) - (warn "Coercing ~S to directory" - pathname) - (setf pathname (pathname-as-directory pathname)) - (unless name-provided-p - (setf name (pathname-project-name pathname)))) - (labels ((relative (file) - (merge-pathnames file pathname)) - (nametype (type) - (relative (make-pathname :name name :type type)))) - (ensure-directories-exist pathname) - (let ((*default-pathname-defaults* (truename pathname)) - (*name* name)) - (rewrite-templates *template-directory* *default-pathname-defaults* - (template-parameters template-parameters)) - (pushnew *default-pathname-defaults* asdf:*central-registry* - :test 'equal) - (dolist (hook *after-make-project-hooks*) - (funcall hook pathname :depends-on *depends-on* :name name - :allow-other-keys t))) - name)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/.gitref b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/.gitref deleted file mode 100644 index f879a62..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/.gitref +++ /dev/null @@ -1 +0,0 @@ -c1f15e2bd02fabe7bb468b05fe311cd9a932f14f \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/.travis.yml b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/.travis.yml deleted file mode 100644 index f02735e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/.travis.yml +++ /dev/null @@ -1,41 +0,0 @@ -language: emacs - -env: - # we test emacs23 with sbcl only - - "CHECK_TARGET=check LISP=sbcl EMACS=emacs23" - - "CHECK_TARGET=check-fancy LISP=sbcl EMACS=emacs23" - - # for emacs24, use more combinations - - "CHECK_TARGET=check LISP=sbcl EMACS=emacs24" - #- "CHECK_TARGET=check LISP=cmucl EMACS=emacs24" - - "CHECK_TARGET=check LISP=ccl EMACS=emacs24" - - "CHECK_TARGET=check-fancy LISP=sbcl EMACS=emacs24" - #- "CHECK_TARGET=check-fancy LISP=cmucl EMACS=emacs24" - - "CHECK_TARGET=check-fancy LISP=ccl EMACS=emacs24" - - # also, for emacs24/sbcl test some more contribs in isolation - - "CHECK_TARGET=check-repl LISP=sbcl EMACS=emacs24" - - "CHECK_TARGET=check-indentation LISP=sbcl EMACS=emacs24" - -install: - - curl https://raw.githubusercontent.com/luismbo/cl-travis/master/install.sh | bash - - if [ "$EMACS" = "emacs23" ]; then - sudo apt-get -qq update && - sudo apt-get -qq -f install && - sudo apt-get -qq install emacs23-nox; - fi - - if [ "$EMACS" = "emacs24" ]; then - sudo add-apt-repository -y ppa:cassou/emacs && - sudo apt-get -qq update && - sudo apt-get -qq -f install && - sudo apt-get -qq install emacs24-nox; - fi - -script: - - make LISP=$LISP EMACS=$EMACS $CHECK_TARGET - -notifications: - email: - recipients: - - slime-cvs@common-lisp.net - # on_success: always # for testing diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/CONTRIBUTING.md b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/CONTRIBUTING.md deleted file mode 100644 index 6bf01dc..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/CONTRIBUTING.md +++ /dev/null @@ -1,153 +0,0 @@ -# The SLIME Hacker's Handbook - -## Lisp code file structure - -The Lisp code is organised into these files: - -* `swank-backend.lisp`: Definition of the interface to non-portable -features. Stand-alone. - -* `swank-.lisp`: Backend implementation for a specific -Common Lisp system. Uses swank-backend.lisp. - -* `swank.lisp`: The top-level server program, built from the other -components. Uses swank-backend.lisp as an interface to the actual -backends. - -* `slime.el`: The Superior Lisp Inferior Mode for Emacs, i.e. the -Emacs frontend that the user actually interacts with and that connects -to the SWANK server to send expressions to, and retrieve information -from the running Common Lisp system. - -* `contrib/*.lisp`: Lisp related code for add-ons to SLIME that are -maintained by their respective authors. Consult contrib/README for -more information. - -## Test Suite - -The Makefile includes a `check` target to run the ERT-based test -suite. This can give a pretty good sanity-check for your changes - -Some backends do not pass the full test suite because of missing -features. In these cases the test suite is still useful to ensure that -changes don't introduce new errors. CMUCL historically passes the full -test suite so it makes a good sanity check for fundamental changes -(e.g. to the protocol). - -Running the test suite, adding new cases, and increasing the number of -cases that backends support are all very good for karma. - - -## Source code layout - -We use a special source file layout to take advantage of some fancy -Emacs features: outline-mode and "narrowing". - -### Outline structure - -Our source files have a hierarchical structure using comments like -these: - -```el -;;;; Heading -;;;;; Subheading -... etc -``` - -We do this as a nice way to structure the program. We try to keep each -(sub)section small enough to fit in your head: typically around 50-200 -lines of code each. Each section usually begins with a brief -introduction, followed by its highest-level functions, followed by -their subroutines. This is a pleasing shape for a source file to have. - -Of course the comments mean something to Emacs too. One handy usage is -to bring up a hyperlinked "table of contents" for the source file -using this command: - -```el -(defun show-outline-structure () - "Show the outline-mode structure of the current buffer." - (interactive) - (occur (concat "^" outline-regexp))) -``` - -Another is to use `outline-minor-mode` to fold away certain parts of -the buffer. See the `Outline Mode` section of the Emacs manual for -details about that. - -### Pagebreak characters (^L) - -We partition source files into chunks using pagebreak characters. Each -chunk is a substantial piece of code that can be considered in -isolation, that could perhaps be a separate source file if we were -fanatical about small source files (rather than big ones!) - -The page breaks usually go in the same place as top-level outline-mode -headings, but they don't have to. They're flexible. - -In the old days, when `slime.el` was less than 100 pages long, these -page breaks were helpful when printing it out to read. Now they're -useful for something else: narrowing. - -You can use `C-x n p` (`narrow-to-page`) to "zoom in" on a -pagebreak-delimited section of the file as if it were a separate -buffer in itself. You can then use `C-x n w` (`widen`) to "zoom out" and -see the whole file again. This is tremendously helpful for focusing -your attention on one part of the program as if it were its own file. - -(This file contains some page break characters. If you're reading in -Emacs you can press `C-x n p` to narrow to this page, and then later -`C-x n w` to make the whole buffer visible again.) - - -## Coding style - -We like the fact that each function in SLIME will fit on a single -screen (80x20), and would like to preserve this property! Beyond that -we're not dogmatic :-) - -In early discussions we all made happy noises about the advice in -Norvig and Pitman's -[Tutorial on Good Lisp Programming Style](http://www.norvig.com/luv-slides.ps). - -For Emacs Lisp, we try to follow the _Tips and Conventions_ in -Appendix D of the GNU Emacs Lisp Reference Manual (see Info file -`elisp`, node `Tips`). - -We use Emacs conventions for docstrings: the first line should be a -complete sentence to make the output of `apropos` look good. We also -use imperative verbs. - -Now that XEmacs support is gone, rewrites using packages in GNU -Emacs's core get extra karma. - -Customization variables complicate testing and therefore we only add -new ones after careful consideration. Adding new customization -variables is bad for karma. - -We generally neither use nor recommend eval-after-load. - -The biggest problem with SLIME's code base is feature creep. Keep in -mind that the Right Thing isn't always the Smart Thing. If you can't -find an elegant solution to a problem then you're probably solving the -wrong problem. It's often a good idea to simplify the problem and to -ignore rarely needed cases. - -_Remember that to rewrite a program better is the sincerest form of -code appreciation. When you can see a way to rewrite a part of SLIME -better, please do so!_ - - - -## Pull requests - -* Read [how to properly contribute to open source projects on Github][1]. -* Use a topic branch to easily amend a pull request later, if necessary. -* Open a [pull request][2] that relates to *only* one subject with a - clear title and description in grammatically correct, complete - sentences. -* Write [good commit messages][3]. - -[1]: http://gun.io/blog/how-to-github-fork-branch-and-pull-request -[2]: https://help.github.com/articles/using-pull-requests -[3]: http://chris.beams.io/posts/git-commit/ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/Makefile b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/Makefile deleted file mode 100644 index ed63e6f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/Makefile +++ /dev/null @@ -1,113 +0,0 @@ -### Makefile for SLIME -# -# This file is in the public domain. - -# Variables -# -EMACS=emacs -LISP=sbcl - -LOAD_PATH=-L . - -ELFILES := slime.el slime-autoloads.el slime-tests.el $(wildcard lib/*.el) -ELCFILES := $(ELFILES:.el=.elc) - -default: compile contrib-compile - -all: compile - -help: - @printf "\ -Main targets\n\ -all -- see compile\n\ -compile -- compile .el files\n\ -check -- run tests in batch mode\n\ -clean -- delete generated files\n\ -doc-help -- print help about doc targets\n\ -help-vars -- print info about variables\n\ -help -- print this message\n" - -help-vars: - @printf "\ -Main make variables:\n\ -EMACS -- program to start Emacs ($(EMACS))\n\ -LISP -- program to start Lisp ($(LISP))\n\ -SELECTOR -- selector for ERT tests ($(SELECTOR))\n" - -# Compilation -# -slime.elc: slime.el lib/hyperspec.elc - -%.elc: %.el - $(EMACS) -Q $(LOAD_PATH) --batch -f batch-byte-compile $< - -compile: $(ELCFILES) - -# Automated tests -# -SELECTOR=t - -check: compile - $(EMACS) -Q --batch $(LOAD_PATH) \ - --eval "(require 'slime-tests)" \ - --eval "(slime-setup)" \ - --eval "(setq inferior-lisp-program \"$(LISP)\")" \ - --eval '(slime-batch-test (quote $(SELECTOR)))' - -# run tests interactively -# -# FIXME: Not terribly useful until bugs in ert-run-tests-interactively -# are fixed. -test: compile - $(EMACS) -Q -nw $(LOAD_PATH) \ - --eval "(require 'slime-tests)" \ - --eval "(slime-setup)" \ - --eval "(setq inferior-lisp-program \"$(LISP)\")" \ - --eval '(slime-batch-test (quote $(SELECTOR)))' - -compile-swank: - echo '(load "swank-loader.lisp")' '(swank-loader:init :setup nil)' \ - | $(LISP) - -run-swank: - { echo \ - '(load "swank-loader.lisp")' \ - '(swank-loader:init)' \ - '(swank:create-server)' \ - && cat; } \ - | $(LISP) - -elpa-slime: - echo "Not implemented yet: elpa-slime target" && exit 255 - -elpa: elpa-slime contrib-elpa - -# Cleanup -# -FASLREGEX = .*\.\(fasl\|ufasl\|sse2f\|lx32fsl\|abcl\|fas\|lib\|trace\)$$ - -clean-fasls: - find . -regex '$(FASLREGEX)' -exec rm -v {} \; - [ ! -d ~/.slime/fasl ] || rm -rf ~/.slime/fasl - -clean: clean-fasls - find . -iname '*.elc' -exec rm {} \; - - -# Contrib stuff. Should probably also go to contrib/ -# -MAKECONTRIB=$(MAKE) -C contrib EMACS="$(EMACS)" LISP="$(LISP)" -contrib-check-% check-%: - $(MAKECONTRIB) $(@:contrib-%=%) -contrib-elpa: - $(MAKECONTRIB) elpa-all -contrib-compile: - $(MAKECONTRIB) compile - -# Doc -# -doc-%: - $(MAKE) -C doc $(@:doc-%=%) -doc: doc-help - -.PHONY: clean elpa compile check doc dist diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/NEWS b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/NEWS deleted file mode 100644 index 9f24e38..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/NEWS +++ /dev/null @@ -1,609 +0,0 @@ -* SLIME News -*- mode: outline; coding: utf-8 -*- -* 2.24 (May 2019) -*** Minor improvements. - -* 2.23 (December 2018) -*** Improved compatiblity with different versions of Emacs, SBCL, Clasp, Allegro. -*** Bug fixes - -* 2.22 (July 2018) -*** Improved compatiblity with Emacs 26 - -* 2.21 (June 2018) -*** Improved compatiblity with Emacs 26 -*** Mezzano support - -* 2.20 (August 2017) -** Core -*** More secure handling of ~/.slime-secret -** SBCL backend -*** Compatiblity with the latest SBCL and older SBCL. -** ECL backend -*** Numerous enhancements - -* 2.19 (February 2017) -** Core -*** Function `create-server` now accepts optional `interface` argument. -Swank will bind the PORT on this interface. By default, interface is 127.0.0.1. -This argument can be used, for example, to bind swank on IPv6 interface "::1". -** SBCL backend -*** Now swank can be bound to IPv6 interface and can work on IPv6-only machines. -*** Compatiblity with the latest SBCL - -* 2.18 (May 2016) -*** Mostly bug fixes and compatibility with newer implementations - -* 2.17 (February 2016) -** Contribs -*** New contrib, slime-macrostep, for more advanced in-place macroexpansion. -*** New contrib, slime-quicklisp. - -* 2.16 (January 2016) -*** Auto-completion now supports package-local nicknames on SBCL and ABCL. -*** Bug fixes and updates for newer implementations. - -* 2.15 (August 2015) -** Core -*** Completions are now displayed with `completion-at-point'. -The new variable `slime-completion-at-point-functions' should now be -used to customize completion. The old variable -`slime-complete-symbol-function' still works, but it is considered -obsolete and will be removed eventually. - -** SBCL backend -*** M-. can locate forms within PROGN/MACROLET/etc. Needs SBCL 1.2.15 - -* 2.14 (June 2015) -** Core -*** Rationals are displayed in the echo area as floats too -*** Some of SLDB's faces now have MORE COLOR -*** Clicking with mouse-1 within inspector does things -As do mouse-6 and mouse-7. (Thanks to Attila Lendvai.) - -** slime-c-p-c (Compound Prefix Completion) -*** Now takes a better guess at symbol case (issue #233) - -** slime-fancy -*** slime-mdot-fu is now enabled by default - -** SBCL backend -*** Now able to jump to ir1-translators, declaims and alien types -*** Various updates supporting SBCL 1.2.12 - -** ABCL backend -*** Fixed inspection of frame-locals in the debugger -(Thanks to Mark Evenson.) - -* 2.13 (March 2015) - -** Core -*** slime-cycle-connections has been deprecated -It has been replaced by slime-next-connection and -slime-prev-connection. A shortcut for the latter has been added to -slime-selector. - -** slime-mdot-fu -The slime-mdot-fu contrib has been brought back to life. (Thanks to Charles -Zhang. Issues #8, #231 and #232.) - -** slime-typeout-frame -The slime-typeout-frame contrib has been restored. (Issue #221.) - -** SBCL backend -*** Fixed xrefs coming from C-c C-c -Issue #227. - -** CMUCL, SBCL and SCL backends -*** Better support for custom readtables -Functionality that depends on SWANK's source-path-parser, such as -`slime-find-definition', now works properly in face of custom -readtables by honoring SWANK:*READTABLE-ALIST*. (Thanks to Gábor -Melis. PR #244.) - -** Kawa backend -*** Updated for Kawa version 2.0 - -* 2.12 (January 2015) - -** Core -A couple of regressions introduced in version 2.10 were fixed. - -*** slime-compile-buffer (C-c C-k) no longer tries to save every buffer -*** slime-autodoc-mode doesn't spam the minibuffer anymore - -** SWANK -*** CREATE-SERVER provides interactive restarts when port is taken -Thanks to Adlai Chandrasekhar. (PR #204.) - -** slime-fuzzy -New variable *FUZZY-DUPLICATE-SYMBOL-FILTER* allows customization of -how symbols accessible from multiple packages should be -canonicalized. Defaults to :NEAREST-PACKAGE, a departure from the -previous default behaviour which is still available using -:HOME-PACKAGE. The new behaviour expands "ui:e-l" to -"uiop:ensure-list" rather than "uiop/utility:ensure-list". Consult the -manual for other options and other details. - -Thanks to Ivan Shvedunov. (PR #205.) - -* 2.11 (December 2014) - -** MELPA is now an officially supported installation method -Various bugs involving installation and upgrading via package.el were -fixed. See the README for more details. (Issues #125, #195, #208.) - -** Core -*** Compilation via the xref buffer now works again - -** slime-repl / slime-presentations -Only text to the left of the cursor should limit the scope of history -navigation. Fixed a long-standing bug that violated this when -slime-presentations was enabled. (Thanks to Ivan Shvedunov. PR #207.) - -** slime-package-fu -Now handles strings as symbol designators, is mindful of trailing -whitespace and properly handles an :export clause immediately -following the package name. (Thanks to Leo Liu. PR #145.) - -** slime-indentation -The edge case handling described in slime-cl-indent.el:958 have been -has been restored. - -** Allegro CL backend -Support for mlisp was restored. It had been broken by the previous -release. (Reported by Alexandre Rademaker. Issue #209.) - -** New experimental SWANK backend for MLWorks - -** SWANK -swank-listener-hooks was restored. (Thanks to Ivan Shvedunov. PR #210.) - -* 2.10.1 (October 2014) - -*** The SWANK-BACKEND nickname has been added to the SWANK/BACKEND package -This should ease the migration of external projects that depend on the -SWANK-BACKEND package. However, note that SWANK/BACKEND (as well as -the other SWANK/* packages) are internal packages. Please refer to -Conium for a project that purports to -offer a stable API for debugger- and compiler-related tasks in Common -Lisp. - -* 2.10 (October 2014) - -** Core -*** The SWANK-BACKEND package has been renamed to SWANK/BACKEND -Furthermore, implementations of the SWANK-BACKEND interface have -individual packages such as SWANK/SBCL, SWANK/CCL, etc. Other packages -such as SWANK-RPC, SWANK-GRAY have likewise had their hyphens turned -into slashes. - -*** slime-compile-file is now aware of compilation-ask-about-save -When set to nil, SLIME will save modified buffers without asking. -compilation-save-buffers-predicate can be used to customize which -buffers should be automatically saved. - -** slime-repl -*** Clearing REPL output no longer deletes the prompt (issue #183) - -** slime-autodoc -This contrib has been rewritten. Please report any regressions you may -find. - -** ABCL backend -*** Inspecting CLOS objects works properly again -*** SLDB frame arguments have become inspectable - -** SBCL backend -*** Source locations involving the #. reader macro -The aforementioned mechanism was adapted to recent changes in the -internals of the SBCL reader. - -*** Breakage involving recent versions of SBCL on Windows was fixed (issue #192) -We no longer assume SB-SYS:ENABLE-INTERRUPT exists on Windows SBCL. - -** MKCL backend -New backend for ManKai Common Lisp. - -** CMUCL backend -*** Support for versions prior to 20c has been removed - -** MIT Scheme backend -*** Updated and now requires MIT Scheme 9.2 - -* 2.9 (August 2014) - -** Core -*** Various display-related bugfixes - -** CMUCL -*** M-. now works on condition classes - -* 2.8 (July 2014) - -** Core - -*** Inspector fixes and improvements for SBCL. - -** Contribs -*** Kawa backend supports Kawa 1.14. - -* 2.7 (June 2014) - -** Core -*** SWANK now tries harder to send double-floats to Emacs - -** Allegro CL Backend -*** Added implementation for FUNCTION-NAME and FIND-SOURCE-LOCATION interfaces -Notably, this means that pressing "." in the SLIME inspector now works -on Allegro CL. (Thanks to Gábor Melis.) - -* 2.6 (May 2014) - -** Core - -*** *print-readably* bound to nil when displaying condition messages - -*** Issue #144: Removed nicknames and short package names -The STD nickname for SWANK-TRACE-DIALOG was removed. MONITOR was -renamed to SWANK-MONITOR and its nickname MON removed. - -*** Issues #135, #154: slime-to-lisp-filename used more pervasively -Now used for the both the port-file and loader file when announced -from Emacs to the lisp backend. Allows a user-written -`slime-to-lisp-filename-function' that supports Cygwin lisps with -non-Cygwin Emacsen or vice-versa. See #135 for an example of such a -function. - -*** Issue #155: Stale SLDB buffers are now properly removed -Indirect exits from an SLDB buffer that was not selected in a window -would leave a stale buffer behind, leading to an inconsistent state -and unexpected errors. - -** Contribs - -*** Issue #139: Restored "copy to REPL" for slime-presentations -`slime-copy-presentation-at-point-to-repl' will copy a presentation to -the REPL, place it at point, and _not_ set *, ** and ***. This -behaviour restored after refactorings of "copy to REPL" behaviour of -previous versions. - -*** Issue #140: Improvements in the "copy to REPL" behaviour -With or without the slime-presentations contrib, M-RET will -copy/return values to REPL from both Inspector and SLDB buffers, -setting *, ** and *** . If the slime-presentations contrib is enabled, -the returned part will be an interactive presentation. The protocol -for copying down parts to REPL has been reworked to not assume a CL -backend . - -*** Now supports more CLHS references: :type, :system-class, :ansi-cl - -*** Issue #133: Fixed links to the SBCL manual - -** Backend improvements - -*** SBCL - -**** `slime-set-default-directory' now calls chdir -This propagates its effects to subprocesses. - -* 2.5 (April 2014) - -** Backend improvements - -*** Clozure CL - -**** `slime-set-default-directory' now calls chdir -This propagates its effects to subprocesses. - -*** Allegro CL - -**** swank-compile-string no longer binds *default-pathname-defaults* -This was inconsistent with the behaviour of other backends and caused -strange issues with SYS:TEMPORARY-DIRECTORY. - -**** Improved source file recording -Whenever possible interactive definition compilation is mapped to the -actual source file rather than the buffer name to avoid breakage when -the the buffer name changes or is closed. - -** SLIME Trace Dialog - -*** (Un)Tracing a definition automatically updates the trace status - -** slime-repl - -*** Inspecting * in REPL no longer inspects ** (issue #137) - -** slime-autodoc - -*** Multiline arglists in `slime-autodoc' no longer imply a newline (issue #7) - -** Core Bugfixes - -*** SWANK port file name defined in more portable fashion -Bug reported by Mirko Vukovic on slime-devel. - -*** inferior-lisp-program can now hold paths with spaces (issue #116) - -* 2.4 (March 2014) - -** New contrib SLIME Trace Dialog included in `slime-fancy' -Interactive interface to tracing functions and methods. See manual for -details. - -** New contrib `slime-fancy-trace', included in `slime-fancy' -If your implementation allows it, trace complex method signatures, -labels, etc... - -** New options in `slime-cl-indent.el' used by the `slime-indentation' contrib -New variables are `lisp-loop-body-forms-indentation' and -`lisp-loop-body-forms-indentation'. - -** New command `sldb-copy-down-to-repl' bound to M-RET in debugger -Copies the frame variable under point to the REPL, much as -`slime-inspector-copy-down-to-repl' does. - -** New command `slime-delete-package' - -** UTF8 encoding -SLIME now uses only UTF8 to encode strings on the wire. Customization -variables like `slime-net-coding-system' or `swank:*coding-system*' are -now useless. - -** Setup recipe -In preparation for a more decentralized approach to SLIME contribs, -the setup recipe has been slightly changed, hopefully in a backwards -compatible way. Calling `slime-setup' is no longer required. Instead, -the `slime-contribs' variable can be customized with a list of -contribs to be loaded when `M-x slime' is first executed. See section -`8.1 Loading Contrib Packages' of the SLIME Manual for more details. - -** Bugfixes and stability improvements since the move to Github - -*** Issue #9: new REPL output respectes existing REPL results or presentations. - -*** Issue #17: TAB no longer freezes the REPL in "read-mode" - -*** Issue #42: compiles on Emacs 24 - -*** Issue #43: `just-one-space' no longer breaks REPL - -*** Issue #34: "Error in timer" error when starting slime on emacs24 - -*** Printing conditions is now a bit safer in the debugger (git:bafeb86) - -*** Fix undo behavior in the REPL (git:af354d7) -Previously, undo would obliterate previous prompts. - -*** Fix REPL type-ahead behaviour when presentations active (git:38a1826) -Input typed before your lisp responds is appended to the result when it arrives. - -*** Fix package and dir synch when no process buffer (git:dc88935) -Sometimes process buffer has been killed, but connection is still active. - -*** M-p on any part of the REPL buffer no longer errors (git:dc88935) - -*** slime-presentations can be enabled in inspector (git:647c3c3, 2f57b34) -Set `slime-inspector-insert-ispec-function' to -`slime-presentation-inspector-insert-ispec' to use them. - -*** M-. on a presentation on the REPL now longer errors -This happened when `slime-presentations' was enabled, either by itself -or by `slime-fancy'. - -*** M-. on the first position of a *slime-apropos* buffer no longer fails. -This happened with the `slime-fancy-inspector.el' contrib. - -*** RET on no part in *inspector* buffer no longer errors - -*** slime-repsentations properly recognized when at very beginning of buffer -Fix by Attila Lendvai - -*** Avoid loading `swank-asdf.lisp' if there's a good chance it will break SWANK -`swank-asdf.lisp' aborts the connection if it finds an old ASDF version. - -*** In ABCL, `slime-describe-function' now works for both macros and functions. - -** SLIME builds on Travis CI -See https://travis-ci.org/slime/slime for the build status and history. - -** Testing framework refactored to use ERT -`def-slime-test' creates regular ERT tests. `define-slime-ert-test' is -a lighter convenience macro which automatically sets some tags for the -new tests. - -** Top-level Makefile -For hackers or users using the latest version, there is now a -top-level Makefile. Use "make help" to learn about targets. - -** Moved to Github -SLIME now lives in Github. The documentation and the README.md file -were updated. HACKING was renamed to CONTRIBUTING.md and updated with -Github specific instructions. - -** Bugfixes and stability improvements -Since the last release and before move to Github, many bugfixes and -other changes were commited, too many to list here. See Changelog for -details. - -* 2.3 (October 2011) - -** REPL no longer loaded by default -SLIME has a REPL which communicates exclusively over SLIME's socket. -This REPL is no longer loaded by default. The default REPL is now the -one by the Lisp implementation in the *inferior-lisp* buffer. The -simplest way to enable the old REPL is: - - (slime-setup '(slime-repl)) - -** Precise source tracking in Clozure CL -Recent versions of the CCL compiler support source-location tracking. -This makes the sldb-show-source command much more useful and M-. works -better too. - -** Environment variables for Lisp process -slime-lisp-implementations can be used to specify a list of strings to -augment the process environment of the Lisp process. E.g.: - - (sbcl-cvs - ("/home/me/sbcl-cvs/src/runtime/sbcl" - "--core" "/home/me/sbcl-cvs/output/sbcl.core") - :env ("SBCL_HOME=/home/me/sbcl-cvs/contrib/")) - -* 2.1 - -** Removed Features -Some of the more esoteric features, like presentations or fuzzy -completion, are no longer enabled by default. A new directory -"contrib/" contains the code for these packages. To use them, you -must make some changes to your ~/.emacs. For details see, section -"Contributed Packages" in the manual. - -** Stepper -Juho Snellman implemented stepping commands for SBCL. - -** Completions -SLIME can now complete keywords and character names (like #\newline). - -* 2.0 (April 2006) - -** In-place macro expansion -Marco Baringer wrote a new minor mode to incrementally expand macros. - -** Improved arglist display -SLIME now recognizes `make-instance' calls and displays the correct -arglist if the classname is present. Similarly, for `defmethod' forms -SLIME displays the arguments of the generic function. - -** Persistent REPL history -SLIME now saves the command history from REPL buffers in a file and -reloads it for newly created REPL buffers. - -** Scieneer Common Lisp -Douglas Crosher added support for Scieneer Common Lisp. - -** SBCL -Various improvements to make SLIME work well with current SBCL versions. - -** Corman Common Lisp -Espen Wiborg added support for Corman Common Lisp. - -** Presentations -A new feature which associates objects in Lisp with their textual -represetation in Emacs. The text is clickable and operations on the -associated object can be invoked from a pop-up menu. - -** Security -SLIME has now a simple authentication mechanism: if the file -~/.slime-secret exists we verify that Emacs and Lisp can access it. -Since both parties have access to the same file system, we assume that -we can trust each other. - -* 1.2 (March 2005) - -** New inspector -The lisp side now returns a specially formated list of "things" to -format which are then passed to emacs and rendered in the inspector -buffer. Things can be either text, recursivly inspectable values, or -functions to call. The new inspector has much better support CLOS -objects and methods. - -** Unicode -It's now possible to send non-ascii characters to Emacs, if the -communication channel is configured properly. See the variable -`slime-net-coding-system'. - -** Arglist lookup while debugging -Previously, arglist lookup was disabled while debugging. This -restriction was removed. - -** Extended tracing command -It's now possible to trace individual a single methods or all methods -of a generic function. Also tracing can be restricted to situations -in which the traced function is called from a specific function. - -** M-x slime-browse-classes -A simple class browser was added. - -** FASL files -The fasl files for different Lisp/OS/hardware combinations are now -placed in different directories. - -** Many other small improvements and bugfixes - -* 1.0 (September 2004) - -** slime-interrupt -The default key binding for slime-interrupt is now C-c C-b. - -** sldb-inspect-condition -In SLDB 'C' is now bound to sldb-inspect-condition. - -** More Menus -SLDB and the REPL have now pull-down menus. - -** Global debugger hook. -A new configurable *global-debugger* to control whether -swank-debugger-hook should be installed globally is available. True by -default. - -** When you call sldb-eval-in-frame with a prefix argument, the result is -now inserted in the REPL buffer. - -** Compile function -For Allegro M-. works now for functions compiled with C-c C-c. - -** slime-edit-definition -Better support for Allegro: works now for different type of -definitions not only. So M-. now works for e.g. classes in Allegro. - -** SBCL 0.8.13 -SBCL 0.8.12 is no longer supported. Support for 0.8.12 was broken for -for some time now. - -* 1.0 beta (August 2004) - -** autodoc global variables -The slime-autodoc-mode will now automatically show the value of a -global variable at point. - -** Customize group -The customize group is expanded and better-organised. - -** slime-interactive-eval -Interactive-eval commands now print their results to the REPL when -given a prefix argument. - -** slime-conservative-indentation -New Elisp variable. Non-nil means that we exclude def* and with-* from -indentation-learning. The default is t. - -** (slime-setup) -New function to streamline setup in ~/.emacs - -** Modeline package -The package name in the modeline is now updated on an idle timer. The -message should now be more meaningful when moving around in files -containing multiple IN-PACKAGE forms. - -** XREF bugfix -The XREF commands did not find symbols in the right package. - -** REPL prompt -The package name in the REPL's prompt is now abbreviated to the last -`.'-delimited token, e.g. MY.COMPANY.PACKAGE would be PACKAGE. This -can be disabled by setting SWANK::*AUTO-ABBREVIATE-DOTTED-PACKAGES* to -NIL. - -** CMUCL source cache -The source cache is now populated on `first-change-hook'. This makes -M-. work accurately in more file modification scenarios. - -** SBCL compiler errors -Detect compiler errors and make some noise. Previously certain -problems (e.g. reader-errors) could slip by quietly. - -* 1.0 alpha (June 2004) - -The first preview release of SLIME. - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/PROBLEMS b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/PROBLEMS deleted file mode 100644 index 704f435..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/PROBLEMS +++ /dev/null @@ -1,94 +0,0 @@ -Known problems with SLIME -*- outline -*- - -* Common to all backends - -** Caution: network security - -The `M-x slime' command has Lisp listen on a TCP socket and wait for -Emacs to connect, which typically takes on the order of one second. If -someone else were to connect to this socket then they could use the -SLIME protocol to control the Lisp process. - -The listen socket is bound on the loopback interface in all Lisps that -support this. This way remote hosts are unable to connect. - -** READ-CHAR-NO-HANG is broken - -READ-CHAR-NO-HANG doesn't work properly for slime-input-streams. Due -to the way we request input from Emacs it's not possible to repeatedly -poll for input. To get any input you have to call READ-CHAR (or a -function which calls READ-CHAR). - -* Backend-specific problems - -** CMUCL - -The default communication style :SIGIO is reportedly unreliable with -certain libraries (like libSDL) and certain platforms (like Solaris on -Sparc). It generally works very well on x86 so it remains the default. - -** SBCL - -The latest released version of SBCL at the time of packaging should -work. Older or newer SBCLs may or may not work. Do not use -multithreading with unpatched 2.4 Linux kernels. There are also -problems with kernel versions 2.6.5 - 2.6.10. - -The (v)iew-source command in the debugger can only locate exact source -forms for code compiled at (debug 2) or higher. The default level is -lower and SBCL itself is compiled at a lower setting. Thus only -defun-granularity is available with default policies. - -** LispWorks - -On Windows, SLIME hangs when calling foreign functions or certain -other functions. The reason for this problem is unknown. - -We only support latin1 encoding. (Unicode wouldn't be hard to add.) - -** Allegro CL - -Interrupting Allegro with C-c C-b can be slow. This is caused by the -a relatively large process-quantum: 2 seconds by default. Allegro -responds much faster if mp:*default-process-quantum* is set to 0.1. - -** CLISP - -We require version 2.49 or higher. We also require socket support, so -you may have to start CLISP with "clisp -K full". - -Under Windows, interrupting (with C-c C-b) doesn't work. Emacs sends -a SIGINT signal, but the signal is either ignored or CLISP exits -immediately. - -On Windows, CLISP may refuse to parse filenames like -"C:\\DOCUME~1\\johndoe\\LOCALS~1\\Temp\\slime.1424" when we actually -mean C:\Documents and Settings\johndoe\Local Settings\slime.1424. As -a workaround, you could set slime-to-lisp-filename-function to some -function that returns a string that is accepted by CLISP. - -Function arguments and local variables aren't displayed properly in -the backtrace. Changes to CLISP's C code are needed to fix this -problem. Interpreted code is usually easer to debug. - -M-. (find-definition) only works if the fasl file is in the same -directory as the source file. - -The arglist doesn't include the proper names only "fake symbols" like -`arg1'. - -** Armed Bear Common Lisp - -The ABCL support is still new and experimental. - -** Corman Common Lisp - -We require version 2.51 or higher, with several patches (available at -http://www.grumblesmurf.org/lisp/corman-patches). - -The only communication style currently supported is NIL. - -Interrupting (with C-c C-b) doesn't work. - -The tracing, stepping and XREF commands are not implemented along with -some debugger functionality. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/README.md b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/README.md deleted file mode 100644 index 7ef8cd3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/README.md +++ /dev/null @@ -1,78 +0,0 @@ -[![Build Status](https://img.shields.io/travis/slime/slime/master.svg)](https://travis-ci.org/slime/slime) [![MELPA](http://melpa.org/packages/slime-badge.svg?)](http://melpa.org/#/slime) [![MELPA Stable](http://stable.melpa.org/packages/slime-badge.svg?)](http://stable.melpa.org/#/slime) - -Overview --------- - -SLIME is the Superior Lisp Interaction Mode for Emacs. - -SLIME extends Emacs with support for interactive programming in Common -Lisp. The features are centered around slime-mode, an Emacs minor-mode that -complements the standard lisp-mode. While lisp-mode supports editing Lisp -source files, slime-mode adds support for interacting with a running Common -Lisp process for compilation, debugging, documentation lookup, and so on. - -For much more information, consult [the manual][1]. - - -Quick setup instructions ------------------------- - - 1. [Set up the MELPA repository][2], if you haven't already, and install - SLIME using `M-x package-install RET slime RET`. - - 2. Add the following lines to your `~/.emacs` file, filling in in - the appropriate filenames: - - ```el - ;; Set your lisp system and, optionally, some contribs - (setq inferior-lisp-program "/opt/sbcl/bin/sbcl") - (setq slime-contribs '(slime-fancy)) - ``` - - 3. Use `M-x slime` to fire up and connect to an inferior Lisp. SLIME will - now automatically be available in your Lisp source buffers. - -If you'd like to contribute to SLIME, you will want to instead follow -the manual's instructions on [how to install SLIME via Git][7]. - - -Contribs --------- - -SLIME comes with additional contributed packages or "contribs". -Contribs can be selected via the `slime-contribs` list. - -The most-often used contrib is `slime-fancy`, which primarily installs a -popular set of other contributed packages. It includes a better REPL, and -many more nice features. - - -License -------- - -SLIME is free software. All files, unless explicitly stated otherwise, are -public domain. - - -Contact -------- - -If you have problems, first have a look at the list of -[known issues and workarounds][6]. - -Questions and comments are best directed to the mailing list at -`slime-devel@common-lisp.net`, but you have to [subscribe][3] first. The -mailing list archive is also available on [Gmane][4]. - -See the [CONTRIBUTING.md][5] file for instructions on how to contribute. - - - - -[1]: http://common-lisp.net/project/slime/doc/html/ -[2]: http://melpa.org/#/getting-started -[3]: http://www.common-lisp.net/project/slime/#mailinglist -[4]: http://news.gmane.org/gmane.lisp.slime.devel -[5]: https://github.com/slime/slime/blob/master/CONTRIBUTING.md -[6]: https://github.com/slime/slime/issues?labels=workaround&state=closed -[7]: http://common-lisp.net/project/slime/doc/html/Installation.html#Installing-from-Git diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/Makefile b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/Makefile deleted file mode 100644 index 27dcd80..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/Makefile +++ /dev/null @@ -1,92 +0,0 @@ -### Makefile for contribs -# -# This file is in the public domain. - -EMACS=emacs -LISP=sbcl - -LOAD_PATH=-L . -L .. -CONTRIBS = $(patsubst slime-%.el,%,$(wildcard slime-*.el)) -CONTRIB_TESTS = $(patsubst test/slime-%-tests.el,%,$(wildcard test/slime-*.el)) -SLIME_VERSION=$(shell grep "Version:" ../slime.el | grep -E -o "[0-9.]+$$") - -ELFILES := $(shell find . -type f -iname "*.el") -ELCFILES := $(patsubst %.el,%.elc,$(ELFILES)) - -%.elc: %.el - $(EMACS) -Q $(LOAD_PATH) --batch -f batch-byte-compile $< - -compile: $(ELCFILES) - $(EMACS) -Q --batch $(LOAD_PATH) \ - --eval "(batch-byte-recompile-directory 0)" . - -# ELPA builds for contribs -# -$(CONTRIBS:%=elpa-%): CONTRIB=$(@:elpa-%=%) -$(CONTRIBS:%=elpa-%): CONTRIB_EL=$(CONTRIB:%=slime-%.el) -$(CONTRIBS:%=elpa-%): CONTRIB_CL=$(CONTRIB:%=swank-%.lisp) -$(CONTRIBS:%=elpa-%): CONTRIB_VERSION=$(shell ( \ - grep "Version:" $(CONTRIB_EL) \ - || echo $(SLIME_VERSION) \ - ) | grep -E -o "[0-9.]+$$" ) -$(CONTRIBS:%=elpa-%): PACKAGE=$(CONTRIB:%=slime-%-$(CONTRIB_VERSION)) -$(CONTRIBS:%=elpa-%): PACKAGE_EL=$(CONTRIB:%=slime-%-pkg.el) -$(CONTRIBS:%=elpa-%): ELPA_DIR=elpa/$(PACKAGE) -$(CONTRIBS:%=elpa-%): compile - elpa_dir=$(ELPA_DIR) - mkdir -p $$elpa_dir; \ - emacs --batch $(CONTRIB_EL) \ - --eval "(require 'cl-lib)" \ - --eval "(search-forward \"define-slime-contrib\")" \ - --eval "(up-list -1)" \ - --eval "(pp \ - (pcase (read (point-marker)) \ - (\`(define-slime-contrib ,name ,docstring . ,rest) \ - \`(define-package ,name \"$(CONTRIB_VERSION)\" \ - ,docstring \ - ,(cons '(slime \"$(SLIME_VERSION)\") \ - (cl-loop for form in rest \ - when (eq :slime-dependencies (car form)) \ - append (cl-loop for contrib in (cdr form) \ - if (atom contrib) \ - collect \ - \`(,contrib \"$(SLIME_VERSION)\") \ - else \ - collect contrib))))))))" > \ - $$elpa_dir/$(PACKAGE_EL); \ - cp $(CONTRIB_EL) $$elpa_dir; \ - [ -r $(CONTRIB_CL) ] && cp $(CONTRIB_CL) $$elpa_dir; \ - ls $$elpa_dir - cd elpa && tar cvf $(PACKAGE).tar $(PACKAGE) - rm -rf $(ELPA_DIR) - -elpa-all: $(CONTRIBS:%=elpa-%) - -$(CONTRIB_TESTS:%=check-%): CONTRIB_NAME=$(patsubst check-%,slime-%,$@) -$(CONTRIB_TESTS:%=check-%): SELECTOR=(quote (tag contrib)) -$(CONTRIB_TESTS:%=check-%): compile - $(EMACS) -Q --batch $(LOAD_PATH) -L test \ - --eval "(require (quote slime))" \ - --eval "(slime-setup (quote ($(CONTRIB_NAME))))" \ - --eval "(require \ - (intern \ - (format \"%s-tests\" (quote $(CONTRIB_NAME)))))" \ - --eval '(setq inferior-lisp-program "$(LISP)")' \ - --eval "(slime-batch-test $(SELECTOR))" - -check-all: $(CONTRIB_TESTS:%=check-%) - -check-fancy: compile - $(EMACS) -Q --batch $(LOAD_PATH) -L test \ - --eval "(setq debug-on-error t)" \ - --eval "(require (quote slime))" \ - --eval "(slime-setup (quote (slime-fancy)))" \ - --eval "(mapc (lambda (sym) \ - (require \ - (intern (format \"%s-tests\" sym)) \ - nil t)) \ - (slime-contrib-all-dependencies \ - (quote slime-fancy)))" \ - --eval '(setq inferior-lisp-program "$(LISP)")' \ - --eval '(slime-batch-test (quote (tag contrib)))' - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/README.md b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/README.md deleted file mode 100644 index 94fd02f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/README.md +++ /dev/null @@ -1,14 +0,0 @@ -This directory contains source code which may be useful to some Slime -users. `*.el` files are Emacs Lisp source and `*.lisp` files contain -Common Lisp source code. If not otherwise stated in the file itself, -the files are placed in the Public Domain. - -The components in this directory are more or less detached from the -rest of Slime. They are essentially "add-ons". But Slime can also be -used without them. The code is maintained by the respective authors. - -See the top level README.md for how to use packages in this directory. - -Finally, the contrib `slime-fancy` is specially noteworthy, as it -represents a meta-contrib that'll load a bunch of commonly used -contribs. Look into `slime-fancy.el` to find out which. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/bridge.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/bridge.el deleted file mode 100644 index 5bf8779..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/bridge.el +++ /dev/null @@ -1,472 +0,0 @@ -;;; -*-Emacs-Lisp-*- -;;;%Header -;;; Bridge process filter, V1.0 -;;; Copyright (C) 1991 Chris McConnell, ccm@cs.cmu.edu -;;; -;;; Send mail to ilisp@cons.org if you have problems. -;;; -;;; Send mail to majordomo@cons.org if you want to be on the -;;; ilisp mailing list. - -;;; This file is part of GNU Emacs. - -;;; GNU Emacs is distributed in the hope that it will be useful, -;;; but WITHOUT ANY WARRANTY. No author or distributor -;;; accepts responsibility to anyone for the consequences of using it -;;; or for whether it serves any particular purpose or works at all, -;;; unless he says so in writing. Refer to the GNU Emacs General Public -;;; License for full details. - -;;; Everyone is granted permission to copy, modify and redistribute -;;; GNU Emacs, but only under the conditions described in the -;;; GNU Emacs General Public License. A copy of this license is -;;; supposed to have been given to you along with GNU Emacs so you -;;; can know your rights and responsibilities. It should be in a -;;; file named COPYING. Among other things, the copyright notice -;;; and this notice must be preserved on all copies. - -;;; Send any bugs or comments. Thanks to Todd Kaufmann for rewriting -;;; the process filter for continuous handlers. - -;;; USAGE: M-x install-bridge will add a process output filter to the -;;; current buffer. Any output that the process does between -;;; bridge-start-regexp and bridge-end-regexp will be bundled up and -;;; passed to the first handler on bridge-handlers that matches the -;;; output using string-match. If bridge-prompt-regexp shows up -;;; before bridge-end-regexp, the bridge will be cancelled. If no -;;; handler matches the output, the first symbol in the output is -;;; assumed to be a buffer name and the rest of the output will be -;;; sent to that buffer's process. This can be used to communicate -;;; between processes or to set up two way interactions between Emacs -;;; and an inferior process. - -;;; You can write handlers that process the output in special ways. -;;; See bridge-send-handler for the default handler. The command -;;; hand-bridge is useful for testing. Keep in mind that all -;;; variables are buffer local. - -;;; YOUR .EMACS FILE: -;;; -;;; ;;; Set up load path to include bridge -;;; (setq load-path (cons "/bridge-directory/" load-path)) -;;; (autoload 'install-bridge "bridge" "Install a process bridge." t) -;;; (setq bridge-hook -;;; '(lambda () -;;; ;; Example options -;;; (setq bridge-source-insert nil) ;Don't insert in source buffer -;;; (setq bridge-destination-insert nil) ;Don't insert in dest buffer -;;; ;; Handle copy-it messages yourself -;;; (setq bridge-handlers -;;; '(("copy-it" . my-copy-handler))))) - -;;; EXAMPLE: -;;; # This pipes stdin to the named buffer in a Unix shell -;;; alias devgnu '(echo -n "\!* "; cat -; echo -n "")' -;;; -;;; ls | devgnu *scratch* - -(eval-when-compile - (require 'cl)) - -;;;%Parameters -(defvar bridge-hook nil - "Hook called when a bridge is installed by install-hook.") - -(defvar bridge-start-regexp "" - "*Regular expression to match the start of a process bridge in -process output. It should be followed by a buffer name, the data to -be sent and a bridge-end-regexp.") - -(defvar bridge-end-regexp "" - "*Regular expression to match the end of a process bridge in process -output.") - -(defvar bridge-prompt-regexp nil - "*Regular expression for detecting a prompt. If there is a -comint-prompt-regexp, it will be initialized to that. A prompt before -a bridge-end-regexp will stop the process bridge.") - -(defvar bridge-handlers nil - "Alist of (regexp . handler) for handling process output delimited -by bridge-start-regexp and bridge-end-regexp. The first entry on the -list whose regexp matches the output will be called on the process and -the delimited output.") - -(defvar bridge-source-insert t - "*T to insert bridge input in the source buffer minus delimiters.") - -(defvar bridge-destination-insert t - "*T for bridge-send-handler to insert bridge input into the -destination buffer minus delimiters.") - -(defvar bridge-chunk-size 512 - "*Long inputs send to comint processes are broken up into chunks of -this size. If your process is choking on big inputs, try lowering the -value.") - -;;;%Internal variables -(defvar bridge-old-filter nil - "Old filter for a bridged process buffer.") - -(defvar bridge-string nil - "The current output in the process bridge.") - -(defvar bridge-in-progress nil - "The current handler function, if any, that bridge passes strings on to, -or nil if none.") - -(defvar bridge-leftovers nil - "Because of chunking you might get an incomplete bridge signal - start but the end is in the next packet. Save the overhanging text here.") - -(defvar bridge-send-to-buffer nil - "The buffer that the default bridge-handler (bridge-send-handler) is -currently sending to, or nil if it hasn't started yet. Your handler -function can use this variable also.") - -(defvar bridge-last-failure () - "Last thing that broke the bridge handler. First item is function call -(eval'able); last item is error condition which resulted. This is provided -to help handler-writers in their debugging.") - -(defvar bridge-insert-function nil - "If non-nil use this instead of `bridge-insert'") - -;;;%Utilities -(defun bridge-insert (output &optional _dummy) - "Insert process OUTPUT into the current buffer." - (if bridge-insert-function - (funcall bridge-insert-function output) - (if output - (let* ((buffer (current-buffer)) - (process (get-buffer-process buffer)) - (mark (process-mark process)) - (window (selected-window)) - (at-end nil)) - (if (eq (window-buffer window) buffer) - (setq at-end (= (point) mark)) - (setq window (get-buffer-window buffer))) - (save-excursion - (goto-char mark) - (insert output) - (set-marker mark (point))) - (if window - (progn - (if at-end (goto-char mark)) - (if (not (pos-visible-in-window-p (point) window)) - (let ((original (selected-window))) - (save-excursion - (select-window window) - (recenter '(center)) - (select-window original)))))))))) - -;;; -;(defun bridge-send-string (process string) -; "Send PROCESS the contents of STRING as input. -;This is equivalent to process-send-string, except that long input strings -;are broken up into chunks of size comint-input-chunk-size. Processes -;are given a chance to output between chunks. This can help prevent processes -;from hanging when you send them long inputs on some OS's." -; (let* ((len (length string)) -; (i (min len bridge-chunk-size))) -; (process-send-string process (substring string 0 i)) -; (while (< i len) -; (let ((next-i (+ i bridge-chunk-size))) -; (accept-process-output) -; (process-send-string process (substring string i (min len next-i))) -; (setq i next-i))))) - -;;; -(defun bridge-call-handler (handler proc string) - "Funcall HANDLER on PROC, STRING carefully. Error is caught if happens, -and user is signaled. State is put in bridge-last-failure. Returns t if -handler executed without error." - (let ((inhibit-quit nil) - (failed nil)) - (condition-case err - (funcall handler proc string) - (error - (ding) - (setq failed t) - (message "bridge-handler \"%s\" failed %s (see bridge-last-failure)" - handler err) - (setq bridge-last-failure - `((funcall ',handler ',proc ,string) - "Caused: " - ,err)))) - (not failed))) - -;;;%Handlers -(defun bridge-send-handler (process input) - "Send PROCESS INPUT to the buffer name found at the start of the -input. The input after the buffer name is sent to the buffer's -process if it has one. If bridge-destination-insert is T, the input -will be inserted into the buffer. If it does not have a process, it -will be inserted at the end of the buffer." - (if (null input) - (setq bridge-send-to-buffer nil) ; end of bridge - (let (buffer-and-start buffer-name dest to) - ;; if this is first time, get the buffer out of the first line - (cond ((not bridge-send-to-buffer) - (setq buffer-and-start (read-from-string input) - buffer-name (format "%s" (car (read-from-string input))) - dest (get-buffer buffer-name) - to (get-buffer-process dest) - input (substring input (cdr buffer-and-start))) - (setq bridge-send-to-buffer dest)) - (t - (setq buffer-name bridge-send-to-buffer - dest (get-buffer buffer-name) - to (get-buffer-process dest) - ))) - (if dest - (let ((buffer (current-buffer))) - (if bridge-destination-insert - (unwind-protect - (progn - (set-buffer dest) - (if to - (bridge-insert process input) - (goto-char (point-max)) - (insert input))) - (set-buffer buffer))) - (if to - ;; (bridge-send-string to input) - (process-send-string to input) - )) - (error "%s is not a buffer" buffer-name))))) - -;;;%Filter -(defun bridge-filter (process output) - "Given PROCESS and some OUTPUT, check for the presence of -bridge-start-regexp. Everything prior to this will be passed to the -normal filter function or inserted in the buffer if it is nil. The -output up to bridge-end-regexp will be sent to the first handler on -bridge-handlers that matches the string. If no handlers match, the -input will be sent to bridge-send-handler. If bridge-prompt-regexp is -encountered before the bridge-end-regexp, the bridge will be cancelled." - (let ((inhibit-quit t) - (match-data (match-data)) - (buffer (current-buffer)) - (process-buffer (process-buffer process)) - (case-fold-search t) - (start 0) (end 0) - function - b-start b-start-end b-end) - (set-buffer process-buffer) ;; access locals - - ;; Handle bridge messages that straddle a packet by prepending - ;; them to this packet. - - (when bridge-leftovers - (setq output (concat bridge-leftovers output)) - (setq bridge-leftovers nil)) - - (setq function bridge-in-progress) - - ;; How it works: - ;; - ;; start, end delimit the part of string we are interested in; - ;; initially both 0; after an iteration we move them to next string. - - ;; b-start, b-end delimit part of string to bridge (possibly whole string); - ;; this will be string between corresponding regexps. - - ;; There are two main cases when we come into loop: - - ;; bridge in progress - ;;0 setq b-start = start - ;;1 setq b-end (or end-pattern end) - ;;4 process string - ;;5 remove handler if end found - - ;; no bridge in progress - ;;0 setq b-start if see start-pattern - ;;1 setq b-end if bstart to (or end-pattern end) - ;;2 send (substring start b-start) to normal place - ;;3 find handler (in b-start, b-end) if not set - ;;4 process string - ;;5 remove handler if end found - - ;; equivalent sections have the same numbers here; - ;; we fold them together in this code. - - (block bridge-filter - (unwind-protect - (while (< end (length output)) - - ;;0 setq b-start if find - (setq b-start - (cond (bridge-in-progress - (setq b-start-end start) - start) - ((string-match bridge-start-regexp output start) - (setq b-start-end (match-end 0)) - (match-beginning 0)) - (t nil))) - ;;1 setq b-end - (setq b-end - (if b-start - (let ((end-seen (string-match bridge-end-regexp - output b-start-end))) - (if end-seen (setq end (match-end 0))) - - end-seen))) - - ;; Detect and save partial bridge messages - (when (and b-start b-start-end (not b-end)) - (setq bridge-leftovers (substring output b-start)) - ) - - (if (and b-start (not b-end)) - (setq end b-start) - (if (not b-end) - (setq end (length output)))) - - ;;1.5 - if see prompt before end, remove current - (if (and b-start b-end) - (let ((prompt (string-match bridge-prompt-regexp - output b-start-end))) - (if (and prompt (<= (match-end 0) b-end)) - (setq b-start nil ; b-start-end start - b-end start - end (match-end 0) - bridge-in-progress nil - )))) - - ;;2 send (substring start b-start) to old filter, if any - (when (not (equal start (or b-start end))) ; don't bother on empty string - (let ((pass-on (substring output start (or b-start end)))) - (if bridge-old-filter - (let ((old bridge-old-filter)) - (store-match-data match-data) - (funcall old process pass-on) - ;; if filter changed, re-install ourselves - (let ((new (process-filter process))) - (if (not (eq new 'bridge-filter)) - (progn (setq bridge-old-filter new) - (set-process-filter process 'bridge-filter))))) - (set-buffer process-buffer) - (bridge-insert pass-on)))) - - (if (and b-start-end (not b-end)) - (return-from bridge-filter t) ; when last bit has prematurely ending message, exit early. - (progn - ;;3 find handler (in b-start, b-end) if none current - (if (and b-start (not bridge-in-progress)) - (let ((handlers bridge-handlers)) - (while (and handlers (not function)) - (let* ((handler (car handlers)) - (m (string-match (car handler) output b-start-end))) - (if (and m (< m b-end)) - (setq function (cdr handler)) - (setq handlers (cdr handlers))))) - ;; Set default handler if none - (if (null function) - (setq function 'bridge-send-handler)) - (setq bridge-in-progress function))) - ;;4 process strin - (if function - (let ((ok t)) - (if (/= b-start-end b-end) - (let ((send (substring output b-start-end b-end))) - ;; also, insert the stuff in buffer between - ;; iff bridge-source-insert. - (if bridge-source-insert (bridge-insert send)) - ;; call handler on string - (setq ok (bridge-call-handler function process send)))) - ;;5 remove handler if end found - ;; if function removed then tell it that's all - (if (or (not ok) (/= b-end end)) ;; saw end before end-of-string - (progn - (bridge-call-handler function process nil) - ;; have to remove function too for next time around - (setq function nil - bridge-in-progress nil) - )) - )) - - ;; continue looping, in case there's more string - (setq start end)) - )) - ;; protected forms: restore buffer, match-data - (set-buffer buffer) - (store-match-data match-data) - )))) - - -;;;%Interface -(defun install-bridge () - "Set up a process bridge in the current buffer." - (interactive) - (if (not (get-buffer-process (current-buffer))) - (error "%s does not have a process" (buffer-name (current-buffer))) - (make-local-variable 'bridge-start-regexp) - (make-local-variable 'bridge-end-regexp) - (make-local-variable 'bridge-prompt-regexp) - (make-local-variable 'bridge-handlers) - (make-local-variable 'bridge-source-insert) - (make-local-variable 'bridge-destination-insert) - (make-local-variable 'bridge-chunk-size) - (make-local-variable 'bridge-old-filter) - (make-local-variable 'bridge-string) - (make-local-variable 'bridge-in-progress) - (make-local-variable 'bridge-send-to-buffer) - (make-local-variable 'bridge-leftovers) - (setq bridge-string nil bridge-in-progress nil - bridge-send-to-buffer nil) - (if (boundp 'comint-prompt-regexp) - (setq bridge-prompt-regexp comint-prompt-regexp)) - (let ((process (get-buffer-process (current-buffer)))) - (if process - (if (not (eq (process-filter process) 'bridge-filter)) - (progn - (setq bridge-old-filter (process-filter process)) - (set-process-filter process 'bridge-filter))) - (error "%s does not have a process" - (buffer-name (current-buffer))))) - (run-hooks 'bridge-hook) - (message "Process bridge is installed"))) - -;;; -(defun reset-bridge () - "Must be called from the process's buffer. Removes any active bridge." - (interactive) - ;; for when things get wedged - (if bridge-in-progress - (unwind-protect - (funcall bridge-in-progress (get-buffer-process - (current-buffer)) - nil) - (setq bridge-in-progress nil)) - (message "No bridge in progress."))) - -;;; -(defun remove-bridge () - "Remove bridge from the current buffer." - (interactive) - (let ((process (get-buffer-process (current-buffer)))) - (if (or (not process) (not (eq (process-filter process) 'bridge-filter))) - (error "%s has no bridge" (buffer-name (current-buffer))) - ;; remove any bridge-in-progress - (reset-bridge) - (set-process-filter process bridge-old-filter) - (funcall bridge-old-filter process bridge-string) - (message "Process bridge is removed.")))) - -;;;% Utility for testing -(defun hand-bridge (start end) - "With point at bridge-start, sends bridge-start + string + -bridge-end to bridge-filter. With prefix, use current region to send." - (interactive "r") - (let ((p0 (if current-prefix-arg (min start end) - (if (looking-at bridge-start-regexp) (point) - (error "Not looking at bridge-start-regexp")))) - (p1 (if current-prefix-arg (max start end) - (if (re-search-forward bridge-end-regexp nil t) - (point) (error "Didn't see bridge-end-regexp"))))) - - (bridge-filter (get-buffer-process (current-buffer)) - (buffer-substring-no-properties p0 p1)) - )) - -(provide 'bridge) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/inferior-slime.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/inferior-slime.el deleted file mode 100644 index b176098..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/inferior-slime.el +++ /dev/null @@ -1,133 +0,0 @@ -;;; inferior-slime.el --- Minor mode with Slime keys for comint buffers -;; -;; Author: Luke Gorrie -;; License: GNU GPL (same license as Emacs) -;; -;;; Installation: -;; -;; Add something like this to your .emacs: -;; -;; (add-to-list 'load-path "") -;; (add-hook 'slime-load-hook (lambda () (require 'inferior-slime))) -;; (add-hook 'inferior-lisp-mode-hook (lambda () (inferior-slime-mode 1))) -(require 'slime) -(require 'cl-lib) - -(define-minor-mode inferior-slime-mode - "\\\ -Inferior SLIME mode: The Inferior Superior Lisp Mode for Emacs. - -This mode is intended for use with `inferior-lisp-mode'. It provides a -subset of the bindings from `slime-mode'. - -\\{inferior-slime-mode-map}" - :keymap - ;; Fake binding to coax `define-minor-mode' to create the keymap - '((" " 'undefined)) - - (slime-setup-completion) - (setq-local tab-always-indent 'complete)) - -(defun inferior-slime-return () - "Handle the return key in the inferior-lisp buffer. -The current input should only be sent if a whole expression has been -entered, i.e. the parenthesis are matched. - -A prefix argument disables this behaviour." - (interactive) - (if (or current-prefix-arg (inferior-slime-input-complete-p)) - (comint-send-input) - (insert "\n") - (inferior-slime-indent-line))) - -(defun inferior-slime-indent-line () - "Indent the current line, ignoring everything before the prompt." - (interactive) - (save-restriction - (let ((indent-start - (save-excursion - (goto-char (process-mark (get-buffer-process (current-buffer)))) - (let ((inhibit-field-text-motion t)) - (beginning-of-line 1)) - (point)))) - (narrow-to-region indent-start (point-max))) - (lisp-indent-line))) - -(defun inferior-slime-input-complete-p () - "Return true if the input is complete in the inferior lisp buffer." - (slime-input-complete-p (process-mark (get-buffer-process (current-buffer))) - (point-max))) - -(defun inferior-slime-closing-return () - "Send the current expression to Lisp after closing any open lists." - (interactive) - (goto-char (point-max)) - (save-restriction - (narrow-to-region (process-mark (get-buffer-process (current-buffer))) - (point-max)) - (while (ignore-errors (save-excursion (backward-up-list 1) t)) - (insert ")"))) - (comint-send-input)) - -(defun inferior-slime-change-directory (directory) - "Set default-directory in the *inferior-lisp* buffer to DIRECTORY." - (let* ((proc (slime-process)) - (buffer (and proc (process-buffer proc)))) - (when buffer - (with-current-buffer buffer - (cd-absolute directory))))) - -(defun inferior-slime-init-keymap () - (let ((map inferior-slime-mode-map)) - (set-keymap-parent map slime-parent-map) - (slime-define-keys map - ([return] 'inferior-slime-return) - ([(control return)] 'inferior-slime-closing-return) - ([(meta control ?m)] 'inferior-slime-closing-return) - ;;("\t" 'slime-indent-and-complete-symbol) - (" " 'slime-space)))) - -(inferior-slime-init-keymap) - -(defun inferior-slime-hook-function () - (inferior-slime-mode 1)) - -(defun inferior-slime-switch-to-repl-buffer () - (switch-to-buffer (process-buffer (slime-inferior-process)))) - -(defun inferior-slime-show-transcript (string) - (remove-hook 'comint-output-filter-functions - 'inferior-slime-show-transcript t) - (with-current-buffer (process-buffer (slime-inferior-process)) - (let ((window (display-buffer (current-buffer) t))) - (set-window-point window (point-max))))) - -(defun inferior-slime-start-transcript () - (let ((proc (slime-inferior-process))) - (when proc - (with-current-buffer (process-buffer proc) - (add-hook 'comint-output-filter-functions - 'inferior-slime-show-transcript - nil t))))) - -(defun inferior-slime-stop-transcript () - (let ((proc (slime-inferior-process))) - (when proc - (with-current-buffer (process-buffer (slime-inferior-process)) - (run-with-timer 0.2 nil - (lambda (buffer) - (with-current-buffer buffer - (remove-hook 'comint-output-filter-functions - 'inferior-slime-show-transcript t))) - (current-buffer)))))) - -(defun inferior-slime-init () - (add-hook 'slime-inferior-process-start-hook 'inferior-slime-hook-function) - (add-hook 'slime-change-directory-hooks 'inferior-slime-change-directory) - (add-hook 'slime-transcript-start-hook 'inferior-slime-start-transcript) - (add-hook 'slime-transcript-stop-hook 'inferior-slime-stop-transcript) - (def-slime-selector-method ?r - "SLIME Read-Eval-Print-Loop." - (process-buffer (slime-inferior-process)))) - -(provide 'inferior-slime) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-asdf.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-asdf.el deleted file mode 100644 index fa4b176..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-asdf.el +++ /dev/null @@ -1,313 +0,0 @@ -(require 'slime) -(require 'cl-lib) -(require 'grep) - -(define-slime-contrib slime-asdf - "ASDF support." - (:authors "Daniel Barlow " - "Marco Baringer " - "Edi Weitz " - "Stas Boukarev " - "Tobias C Rittweiler ") - (:license "GPL") - (:slime-dependencies slime-repl) - (:swank-dependencies swank-asdf) - (:on-load - (add-to-list 'slime-edit-uses-xrefs :depends-on t) - (define-key slime-who-map [?d] 'slime-who-depends-on))) - -;;; NOTE: `system-name' is a predefined variable in Emacs. Try to -;;; avoid it as local variable name. - -;;; Utilities - -(defgroup slime-asdf nil - "ASDF support for Slime." - :prefix "slime-asdf-" - :group 'slime) - -(defvar slime-system-history nil - "History list for ASDF system names.") - -(defun slime-read-system-name (&optional prompt - default-value - determine-default-accurately) - "Read a system name from the minibuffer, prompting with PROMPT. -If no `default-value' is given, one is tried to be determined: if -`determine-default-accurately' is true, by an RPC request which -grovels through all defined systems; if it's not true, by looking -in the directory of the current buffer." - (let* ((completion-ignore-case nil) - (prompt (or prompt "System")) - (system-names (slime-eval `(swank:list-asdf-systems))) - (default-value - (or default-value - (if determine-default-accurately - (slime-determine-asdf-system (buffer-file-name) - (slime-current-package)) - (slime-find-asd-file (or default-directory - (buffer-file-name)) - system-names)))) - (prompt (concat prompt (if default-value - (format " (default `%s'): " default-value) - ": ")))) - (completing-read prompt (slime-bogus-completion-alist system-names) - nil nil nil - 'slime-system-history default-value))) - - - -(defun slime-find-asd-file (directory system-names) - "Tries to find an ASDF system definition file in the -`directory' and returns it if it's in `system-names'." - (let ((asd-files - (directory-files (file-name-directory directory) nil "\.asd$"))) - (cl-loop for system in asd-files - for candidate = (file-name-sans-extension system) - when (cl-find candidate system-names :test #'string-equal) - do (cl-return candidate)))) - -(defun slime-determine-asdf-system (filename buffer-package) - "Try to determine the asdf system that `filename' belongs to." - (slime-eval - `(swank:asdf-determine-system ,(and filename - (slime-to-lisp-filename filename)) - ,buffer-package))) - -(defun slime-who-depends-on-rpc (system) - (slime-eval `(swank:who-depends-on ,system))) - -(defcustom slime-asdf-collect-notes t - "Collect and display notes produced by the compiler. - -See also `slime-highlight-compiler-notes' and -`slime-compilation-finished-hook'." - :group 'slime-asdf) - -(defun slime-asdf-operation-finished-function (system) - (if slime-asdf-collect-notes - #'slime-compilation-finished - (slime-curry (lambda (system result) - (let (slime-highlight-compiler-notes - slime-compilation-finished-hook) - (slime-compilation-finished result))) - system))) - -(defun slime-oos (system operation &rest keyword-args) - "Operate On System." - (slime-save-some-lisp-buffers) - (slime-display-output-buffer) - (message "Performing ASDF %S%s on system %S" - operation (if keyword-args (format " %S" keyword-args) "") - system) - (slime-repl-shortcut-eval-async - `(swank:operate-on-system-for-emacs ,system ',operation ,@keyword-args) - (slime-asdf-operation-finished-function system))) - - -;;; Interactive functions - -(defun slime-load-system (&optional system) - "Compile and load an ASDF system. - -Default system name is taken from first file matching *.asd in current -buffer's working directory" - (interactive (list (slime-read-system-name))) - (slime-oos system 'load-op)) - -(defun slime-open-system (name &optional load interactive) - "Open all files in an ASDF system." - (interactive (list (slime-read-system-name) nil t)) - (when (or load - (and interactive - (not (slime-eval `(swank:asdf-system-loaded-p ,name))) - (y-or-n-p "Load it? "))) - (slime-load-system name)) - (slime-eval-async - `(swank:asdf-system-files ,name) - (lambda (files) - (when files - (let ((files (mapcar 'slime-from-lisp-filename - (nreverse files)))) - (find-file-other-window (car files)) - (mapc 'find-file (cdr files))))))) - -(defun slime-browse-system (name) - "Browse files in an ASDF system using Dired." - (interactive (list (slime-read-system-name))) - (slime-eval-async `(swank:asdf-system-directory ,name) - (lambda (directory) - (when directory - (dired (slime-from-lisp-filename directory)))))) - -(if (fboundp 'rgrep) - (defun slime-rgrep-system (sys-name regexp) - "Run `rgrep' on the base directory of an ASDF system." - (interactive (progn (grep-compute-defaults) - (list (slime-read-system-name nil nil t) - (grep-read-regexp)))) - (rgrep regexp "*.lisp" - (slime-from-lisp-filename - (slime-eval `(swank:asdf-system-directory ,sys-name))))) - (defun slime-rgrep-system () - (interactive) - (error "This command is only supported on GNU Emacs >21.x."))) - -(if (boundp 'multi-isearch-next-buffer-function) - (defun slime-isearch-system (sys-name) - "Run `isearch-forward' on the files of an ASDF system." - (interactive (list (slime-read-system-name nil nil t))) - (let* ((files (mapcar 'slime-from-lisp-filename - (slime-eval `(swank:asdf-system-files ,sys-name)))) - (multi-isearch-next-buffer-function - (lexical-let* - ((buffers-forward (mapcar #'find-file-noselect files)) - (buffers-backward (reverse buffers-forward))) - #'(lambda (current-buffer wrap) - ;; Contrarily to the docstring of - ;; `multi-isearch-next-buffer-function', the first - ;; arg is not necessarily a buffer. Report sent - ;; upstream. (2009-11-17) - (setq current-buffer (or current-buffer (current-buffer))) - (let* ((buffers (if isearch-forward - buffers-forward - buffers-backward))) - (if wrap - (car buffers) - (second (memq current-buffer buffers)))))))) - (isearch-forward))) - (defun slime-isearch-system () - (interactive) - (error "This command is only supported on GNU Emacs >23.1.x."))) - -(defun slime-read-query-replace-args (format-string &rest format-args) - (let* ((minibuffer-setup-hook (slime-minibuffer-setup-hook)) - (minibuffer-local-map slime-minibuffer-map) - (common (query-replace-read-args (apply #'format format-string - format-args) - t t))) - (list (nth 0 common) (nth 1 common) (nth 2 common)))) - -(defun slime-query-replace-system (name from to &optional delimited) - "Run `query-replace' on an ASDF system." - (interactive (let ((system (slime-read-system-name nil nil t))) - (cons system (slime-read-query-replace-args - "Query replace throughout `%s'" system)))) - (condition-case c - ;; `tags-query-replace' actually uses `query-replace-regexp' - ;; internally. - (tags-query-replace (regexp-quote from) to delimited - '(mapcar 'slime-from-lisp-filename - (slime-eval `(swank:asdf-system-files ,name)))) - (error - ;; Kludge: `tags-query-replace' does not actually return but - ;; signals an unnamed error with the below error - ;; message. (<=23.1.2, at least.) - (unless (string-equal (error-message-string c) "All files processed") - (signal (car c) (cdr c))) ; resignal - t))) - -(defun slime-query-replace-system-and-dependents - (name from to &optional delimited) - "Run `query-replace' on an ASDF system and all the systems -depending on it." - (interactive (let ((system (slime-read-system-name nil nil t))) - (cons system (slime-read-query-replace-args - "Query replace throughout `%s'+dependencies" - system)))) - (slime-query-replace-system name from to delimited) - (dolist (dep (slime-who-depends-on-rpc name)) - (when (y-or-n-p (format "Descend into system `%s'? " dep)) - (slime-query-replace-system dep from to delimited)))) - -(defun slime-delete-system-fasls (name) - "Delete FASLs produced by compiling a system." - (interactive (list (slime-read-system-name))) - (slime-repl-shortcut-eval-async - `(swank:delete-system-fasls ,name) - 'message)) - -(defun slime-reload-system (system) - "Reload an ASDF system without reloading its dependencies." - (interactive (list (slime-read-system-name))) - (slime-save-some-lisp-buffers) - (slime-display-output-buffer) - (message "Performing ASDF LOAD-OP on system %S" system) - (slime-repl-shortcut-eval-async - `(swank:reload-system ,system) - (slime-asdf-operation-finished-function system))) - -(defun slime-who-depends-on (system-name) - (interactive (list (slime-read-system-name))) - (slime-xref :depends-on system-name)) - -(defun slime-save-system (system) - "Save files belonging to an ASDF system." - (interactive (list (slime-read-system-name))) - (slime-eval-async - `(swank:asdf-system-files ,system) - (lambda (files) - (dolist (file files) - (let ((buffer (get-file-buffer (slime-from-lisp-filename file)))) - (when buffer - (with-current-buffer buffer - (save-buffer buffer))))) - (message "Done.")))) - - -;;; REPL shortcuts - -(defslime-repl-shortcut slime-repl-load/force-system ("force-load-system") - (:handler (lambda () - (interactive) - (slime-oos (slime-read-system-name) 'load-op :force t))) - (:one-liner "Recompile and load an ASDF system.")) - -(defslime-repl-shortcut slime-repl-load-system ("load-system") - (:handler (lambda () - (interactive) - (slime-oos (slime-read-system-name) 'load-op))) - (:one-liner "Compile (as needed) and load an ASDF system.")) - -(defslime-repl-shortcut slime-repl-test/force-system ("force-test-system") - (:handler (lambda () - (interactive) - (slime-oos (slime-read-system-name) 'test-op :force t))) - (:one-liner "Recompile and test an ASDF system.")) - -(defslime-repl-shortcut slime-repl-test-system ("test-system") - (:handler (lambda () - (interactive) - (slime-oos (slime-read-system-name) 'test-op))) - (:one-liner "Compile (as needed) and test an ASDF system.")) - -(defslime-repl-shortcut slime-repl-compile-system ("compile-system") - (:handler (lambda () - (interactive) - (slime-oos (slime-read-system-name) 'compile-op))) - (:one-liner "Compile (but not load) an ASDF system.")) - -(defslime-repl-shortcut slime-repl-compile/force-system - ("force-compile-system") - (:handler (lambda () - (interactive) - (slime-oos (slime-read-system-name) 'compile-op :force t))) - (:one-liner "Recompile (but not completely load) an ASDF system.")) - -(defslime-repl-shortcut slime-repl-open-system ("open-system") - (:handler 'slime-open-system) - (:one-liner "Open all files in an ASDF system.")) - -(defslime-repl-shortcut slime-repl-browse-system ("browse-system") - (:handler 'slime-browse-system) - (:one-liner "Browse files in an ASDF system using Dired.")) - -(defslime-repl-shortcut slime-repl-delete-system-fasls ("delete-system-fasls") - (:handler 'slime-delete-system-fasls) - (:one-liner "Delete FASLs of an ASDF system.")) - -(defslime-repl-shortcut slime-repl-reload-system ("reload-system") - (:handler 'slime-reload-system) - (:one-liner "Recompile and load an ASDF system.")) - -(provide 'slime-asdf) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-autodoc.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-autodoc.el deleted file mode 100644 index 1ea629e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-autodoc.el +++ /dev/null @@ -1,216 +0,0 @@ -(require 'slime) -(require 'eldoc) -(require 'cl-lib) -(require 'slime-parse) - -(define-slime-contrib slime-autodoc - "Show fancy arglist in echo area." - (:license "GPL") - (:authors "Luke Gorrie " - "Lawrence Mitchell " - "Matthias Koeppe " - "Tobias C. Rittweiler ") - (:slime-dependencies slime-parse) - (:swank-dependencies swank-arglists) - (:on-load (slime-autodoc--enable)) - (:on-unload (slime-autodoc--disable))) - -(defcustom slime-autodoc-accuracy-depth 10 - "Number of paren levels that autodoc takes into account for - context-sensitive arglist display (local functions. etc)" - :type 'integer - :group 'slime-ui) - -;;;###autoload -(defcustom slime-autodoc-mode-string (purecopy " adoc") - "String to display in mode line when Autodoc Mode is enabled; nil for none." - :type '(choice string (const :tag "None" nil)) - :group 'slime-ui) - - - -(defun slime-arglist (name) - "Show the argument list for NAME." - (interactive (list (slime-read-symbol-name "Arglist of: " t))) - (let ((arglist (slime-retrieve-arglist name))) - (if (eq arglist :not-available) - (error "Arglist not available") - (message "%s" (slime-autodoc--fontify arglist))))) - -;; used also in slime-c-p-c.el. -(defun slime-retrieve-arglist (name) - (let ((name (cl-etypecase name - (string name) - (symbol (symbol-name name))))) - (car (slime-eval `(swank:autodoc '(,name ,slime-cursor-marker)))))) - -(defun slime-autodoc-manually () - "Like autodoc informtion forcing multiline display." - (interactive) - (let ((doc (slime-autodoc t))) - (cond (doc (eldoc-message doc)) - (t (eldoc-message nil))))) - -;; Must call eldoc-add-command otherwise (eldoc-display-message-p) -;; returns nil and eldoc clears the echo area instead. -(eldoc-add-command 'slime-autodoc-manually) - -(defun slime-autodoc-space (n) - "Like `slime-space' but nicer." - (interactive "p") - (self-insert-command n) - (let ((doc (slime-autodoc))) - (when doc - (eldoc-message doc)))) - -(eldoc-add-command 'slime-autodoc-space) - - -;;;; Autodoc cache - -(defvar slime-autodoc--cache-last-context nil) -(defvar slime-autodoc--cache-last-autodoc nil) - -(defun slime-autodoc--cache-get (context) - "Return the cached autodoc documentation for `context', or nil." - (and (equal context slime-autodoc--cache-last-context) - slime-autodoc--cache-last-autodoc)) - -(defun slime-autodoc--cache-put (context autodoc) - "Update the autodoc cache for CONTEXT with AUTODOC." - (setq slime-autodoc--cache-last-context context) - (setq slime-autodoc--cache-last-autodoc autodoc)) - - -;;;; Formatting autodoc - -(defsubst slime-autodoc--canonicalize-whitespace (string) - (replace-regexp-in-string "[ \n\t]+" " " string)) - -(defun slime-autodoc--format (doc multilinep) - (let ((doc (slime-autodoc--fontify doc))) - (cond (multilinep doc) - (t (slime-oneliner (slime-autodoc--canonicalize-whitespace doc)))))) - -(defun slime-autodoc--fontify (string) - "Fontify STRING as `font-lock-mode' does in Lisp mode." - (with-current-buffer (get-buffer-create (slime-buffer-name :fontify 'hidden)) - (erase-buffer) - (unless (eq major-mode 'lisp-mode) - ;; Just calling (lisp-mode) will turn slime-mode on in that buffer, - ;; which may interfere with this function - (setq major-mode 'lisp-mode) - (lisp-mode-variables t)) - (insert string) - (let ((font-lock-verbose nil)) - (font-lock-fontify-buffer)) - (goto-char (point-min)) - (when (re-search-forward "===> \\(\\(.\\|\n\\)*\\) <===" nil t) - (let ((highlight (match-string 1))) - ;; Can't use (replace-match highlight) here -- broken in Emacs 21 - (delete-region (match-beginning 0) (match-end 0)) - (slime-insert-propertized '(face eldoc-highlight-function-argument) highlight))) - (buffer-substring (point-min) (point-max)))) - -(define-obsolete-function-alias 'slime-fontify-string - 'slime-autodoc--fontify - "SLIME 2.10") - - -;;;; Autodocs (automatic context-sensitive help) - -(defun slime-autodoc (&optional force-multiline) - "Returns the cached arglist information as string, or nil. -If it's not in the cache, the cache will be updated asynchronously." - (save-excursion - (save-match-data - (let ((context (slime-autodoc--parse-context))) - (when context - (let* ((cached (slime-autodoc--cache-get context)) - (multilinep (or force-multiline - eldoc-echo-area-use-multiline-p))) - (cond (cached (slime-autodoc--format cached multilinep)) - (t - (when (slime-background-activities-enabled-p) - (slime-autodoc--async context multilinep)) - nil)))))))) - -;; Return the context around point that can be passed to -;; swank:autodoc. nil is returned if nothing reasonable could be -;; found. -(defun slime-autodoc--parse-context () - (and (slime-autodoc--parsing-safe-p) - (let ((levels slime-autodoc-accuracy-depth)) - (slime-parse-form-upto-point levels)))) - -(defun slime-autodoc--parsing-safe-p () - (cond ((fboundp 'slime-repl-inside-string-or-comment-p) - (not (slime-repl-inside-string-or-comment-p))) - (t - (not (slime-inside-string-or-comment-p))))) - -(defun slime-autodoc--async (context multilinep) - (slime-eval-async - `(swank:autodoc ',context ;; FIXME: misuse of quote - :print-right-margin ,(window-width (minibuffer-window))) - (slime-curry #'slime-autodoc--async% context multilinep))) - -(defun slime-autodoc--async% (context multilinep doc) - (cl-destructuring-bind (doc &optional cache-p) doc - (unless (eq doc :not-available) - (when cache-p - (slime-autodoc--cache-put context doc)) - ;; Now that we've got our information, - ;; get it to the user ASAP. - (when (eldoc-display-message-p) - (eldoc-message (slime-autodoc--format doc multilinep)))))) - - -;;; Minor mode definition - -;; Compute the prefix for slime-doc-map, usually this is C-c C-d. -(defun slime-autodoc--doc-map-prefix () - (concat - (car (rassoc '(slime-prefix-map) slime-parent-bindings)) - (car (rassoc '(slime-doc-map) slime-prefix-bindings)))) - -(define-minor-mode slime-autodoc-mode - "Toggle echo area display of Lisp objects at point." - :lighter slime-autodoc-mode-string - :keymap (let ((prefix (slime-autodoc--doc-map-prefix))) - `((,(concat prefix "A") . slime-autodoc-manually) - (,(concat prefix (kbd "C-A")) . slime-autodoc-manually) - (,(kbd "SPC") . slime-autodoc-space))) - (set (make-local-variable 'eldoc-documentation-function) 'slime-autodoc) - (set (make-local-variable 'eldoc-minor-mode-string) nil) - (setq slime-autodoc-mode (eldoc-mode arg)) - (when (called-interactively-p 'interactive) - (message "Slime autodoc mode %s." - (if slime-autodoc-mode "enabled" "disabled")))) - - -;;; Noise to enable/disable slime-autodoc-mode - -(defun slime-autodoc--on () (slime-autodoc-mode 1)) -(defun slime-autodoc--off () (slime-autodoc-mode 0)) - -(defvar slime-autodoc--relevant-hooks - '(slime-mode-hook slime-repl-mode-hook sldb-mode-hook)) - -(defun slime-autodoc--enable () - (dolist (h slime-autodoc--relevant-hooks) - (add-hook h 'slime-autodoc--on)) - (dolist (b (buffer-list)) - (with-current-buffer b - (when slime-mode - (slime-autodoc--on))))) - -(defun slime-autodoc--disable () - (dolist (h slime-autodoc--relevant-hooks) - (remove-hook h 'slime-autodoc--on)) - (dolist (b (buffer-list)) - (with-current-buffer b - (when slime-autodoc-mode - (slime-autodoc--off))))) - -(provide 'slime-autodoc) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-banner.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-banner.el deleted file mode 100644 index f4eb8c4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-banner.el +++ /dev/null @@ -1,35 +0,0 @@ -(require 'slime) -(require 'slime-repl) - -(define-slime-contrib slime-banner - "Persistent header line and startup animation." - (:authors "Helmut Eller " - "Luke Gorrie ") - (:license "GPL") - (:on-load (setq slime-repl-banner-function 'slime-startup-message)) - (:on-unload (setq slime-repl-banner-function 'slime-repl-insert-banner))) - -(defcustom slime-startup-animation (fboundp 'animate-string) - "Enable the startup animation." - :type '(choice (const :tag "Enable" t) (const :tag "Disable" nil)) - :group 'slime-ui) - -(defcustom slime-header-line-p (boundp 'header-line-format) - "If non-nil, display a header line in Slime buffers." - :type 'boolean - :group 'slime-repl) - -(defun slime-startup-message () - (when slime-header-line-p - (setq header-line-format - (format "%s Port: %s Pid: %s" - (slime-lisp-implementation-type) - (slime-connection-port (slime-connection)) - (slime-pid)))) - (when (zerop (buffer-size)) - (let ((welcome (concat "; SLIME " slime-version))) - (if slime-startup-animation - (animate-string welcome 0 0) - (insert welcome))))) - -(provide 'slime-banner) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-buffer-streams.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-buffer-streams.el deleted file mode 100644 index 2fa700d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-buffer-streams.el +++ /dev/null @@ -1,36 +0,0 @@ -(eval-and-compile - (require 'slime)) - -(define-slime-contrib slime-buffer-streams - "Lisp streams that output to an emacs buffer" - (:authors "Ed Langley ") - (:license "GPL") - (:swank-dependencies swank-buffer-streams)) - -(defslimefun slime-make-buffer-stream-target (thread name) - (message "making target %s" name) - (slime-buffer-streams--get-target-marker name) - `(:stream-target-created ,thread ,name)) - -(defun slime-buffer-streams--get-target-name (target) - (format "*slime-target %s*" target)) - -(defvar-local slime-buffer-stream-target nil) - -;; TODO: tell backend that the buffer has been closed, so it can close -;; the stream -(defun slime-buffer-streams--cleanup-markers () - (when slime-buffer-stream-target - (message "Removing target: %s" slime-buffer-stream-target) - (remhash slime-buffer-stream-target slime-output-target-to-marker))) - -(defun slime-buffer-streams--get-target-marker (target) - (or (gethash target slime-output-target-to-marker) - (with-current-buffer - (generate-new-buffer (slime-buffer-streams--get-target-name target)) - (setq slime-buffer-stream-target target) - (add-hook 'kill-buffer-hook 'slime-buffer-streams--cleanup-markers) - (setf (gethash target slime-output-target-to-marker) - (point-marker))))) - -(provide 'slime-buffer-streams) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-c-p-c.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-c-p-c.el deleted file mode 100644 index 22a267b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-c-p-c.el +++ /dev/null @@ -1,305 +0,0 @@ -(require 'slime) -(require 'cl-lib) - -(defvar slime-c-p-c-init-undo-stack nil) - -(define-slime-contrib slime-c-p-c - "ILISP style Compound Prefix Completion." - (:authors "Luke Gorrie " - "Edi Weitz " - "Matthias Koeppe " - "Tobias C. Rittweiler ") - (:license "GPL") - (:slime-dependencies slime-parse slime-editing-commands slime-autodoc) - (:swank-dependencies swank-c-p-c) - (:on-load - (push - `(progn - (remove-hook 'slime-completion-at-point-functions - #'slime-c-p-c-completion-at-point) - (remove-hook 'slime-connected-hook 'slime-c-p-c-on-connect) - ,@(when (featurep 'slime-repl) - `((define-key slime-mode-map "\C-c\C-s" - ',(lookup-key slime-mode-map "\C-c\C-s")) - (define-key slime-repl-mode-map "\C-c\C-s" - ',(lookup-key slime-repl-mode-map "\C-c\C-s"))))) - slime-c-p-c-init-undo-stack) - (add-hook 'slime-completion-at-point-functions - #'slime-c-p-c-completion-at-point) - (define-key slime-mode-map "\C-c\C-s" 'slime-complete-form) - (when (featurep 'slime-repl) - (define-key slime-repl-mode-map "\C-c\C-s" 'slime-complete-form))) - (:on-unload - (while slime-c-p-c-init-undo-stack - (eval (pop slime-c-p-c-init-undo-stack))))) - -(defcustom slime-c-p-c-unambiguous-prefix-p t - "If true, set point after the unambigous prefix. -If false, move point to the end of the inserted text." - :type 'boolean - :group 'slime-ui) - -(defcustom slime-complete-symbol*-fancy nil - "Use information from argument lists for DWIM'ish symbol completion." - :group 'slime-mode - :type 'boolean) - - -;; FIXME: this is the old code to display completions. Remove it once -;; `slime-complete-symbol*' and `slime-fuzzy-complete-symbol' can be -;; used together with `completion-at-point'. - -(defvar slime-completions-buffer-name "*Completions*") - -;; FIXME: can probably use quit-window instead -(make-variable-buffer-local - (defvar slime-complete-saved-window-configuration nil - "Window configuration before we show the *Completions* buffer. -This is buffer local in the buffer where the completion is -performed.")) - -(make-variable-buffer-local - (defvar slime-completions-window nil - "The window displaying *Completions* after saving window configuration. -If this window is no longer active or displaying the completions -buffer then we can ignore `slime-complete-saved-window-configuration'.")) - -(defun slime-complete-maybe-save-window-configuration () - "Maybe save the current window configuration. -Return true if the configuration was saved." - (unless (or slime-complete-saved-window-configuration - (get-buffer-window slime-completions-buffer-name)) - (setq slime-complete-saved-window-configuration - (current-window-configuration)) - t)) - -(defun slime-complete-delay-restoration () - (add-hook 'pre-command-hook - 'slime-complete-maybe-restore-window-configuration - 'append - 'local)) - -(defun slime-complete-forget-window-configuration () - (setq slime-complete-saved-window-configuration nil) - (setq slime-completions-window nil)) - -(defun slime-complete-restore-window-configuration () - "Restore the window config if available." - (remove-hook 'pre-command-hook - 'slime-complete-maybe-restore-window-configuration) - (when (and slime-complete-saved-window-configuration - (slime-completion-window-active-p)) - (save-excursion (set-window-configuration - slime-complete-saved-window-configuration)) - (setq slime-complete-saved-window-configuration nil) - (when (buffer-live-p slime-completions-buffer-name) - (kill-buffer slime-completions-buffer-name)))) - -(defun slime-complete-maybe-restore-window-configuration () - "Restore the window configuration, if the following command -terminates a current completion." - (remove-hook 'pre-command-hook - 'slime-complete-maybe-restore-window-configuration) - (condition-case err - (cond ((cl-find last-command-event "()\"'`,# \r\n:") - (slime-complete-restore-window-configuration)) - ((not (slime-completion-window-active-p)) - (slime-complete-forget-window-configuration)) - (t - (slime-complete-delay-restoration))) - (error - ;; Because this is called on the pre-command-hook, we mustn't let - ;; errors propagate. - (message "Error in slime-complete-restore-window-configuration: %S" - err)))) - -(defun slime-completion-window-active-p () - "Is the completion window currently active?" - (and (window-live-p slime-completions-window) - (equal (buffer-name (window-buffer slime-completions-window)) - slime-completions-buffer-name))) - -(defun slime-display-completion-list (completions start end) - (let ((savedp (slime-complete-maybe-save-window-configuration))) - (with-output-to-temp-buffer slime-completions-buffer-name - (display-completion-list completions) - (with-current-buffer standard-output - (setq completion-base-position (list start end)) - (set-syntax-table lisp-mode-syntax-table))) - (when savedp - (setq slime-completions-window - (get-buffer-window slime-completions-buffer-name))))) - -(defun slime-display-or-scroll-completions (completions start end) - (cond ((and (eq last-command this-command) - (slime-completion-window-active-p)) - (slime-scroll-completions)) - (t - (slime-display-completion-list completions start end))) - (slime-complete-delay-restoration)) - -(defun slime-scroll-completions () - (let ((window slime-completions-window)) - (with-current-buffer (window-buffer window) - (if (pos-visible-in-window-p (point-max) window) - (set-window-start window (point-min)) - (save-selected-window - (select-window window) - (scroll-up)))))) - -(defun slime-minibuffer-respecting-message (format &rest format-args) - "Display TEXT as a message, without hiding any minibuffer contents." - (let ((text (format " [%s]" (apply #'format format format-args)))) - (if (minibuffer-window-active-p (minibuffer-window)) - (minibuffer-message text) - (message "%s" text)))) - -(defun slime-maybe-complete-as-filename () - "If point is at a string starting with \", complete it as filename. - Return nil if point is not at filename." - (when (save-excursion (re-search-backward "\"[^ \t\n]+\\=" - (max (point-min) - (- (point) 1000)) t)) - (let ((comint-completion-addsuffix '("/" . "\""))) - (comint-replace-by-expanded-filename) - t))) - - -(defun slime-complete-symbol* () - "Expand abbreviations and complete the symbol at point." - ;; NB: It is only the name part of the symbol that we actually want - ;; to complete -- the package prefix, if given, is just context. - (or (slime-maybe-complete-as-filename) - (slime-expand-abbreviations-and-complete))) - -(defun slime-c-p-c-completion-at-point () - #'slime-complete-symbol*) - -;; FIXME: factorize -(defun slime-expand-abbreviations-and-complete () - (let* ((end (move-marker (make-marker) (slime-symbol-end-pos))) - (beg (move-marker (make-marker) (slime-symbol-start-pos))) - (prefix (buffer-substring-no-properties beg end)) - (completion-result (slime-contextual-completions beg end)) - (completion-set (cl-first completion-result)) - (completed-prefix (cl-second completion-result))) - (if (null completion-set) - (progn (slime-minibuffer-respecting-message - "Can't find completion for \"%s\"" prefix) - (ding) - (slime-complete-restore-window-configuration)) - ;; some XEmacs issue makes this distinction necessary - (cond ((> (length completed-prefix) (- end beg)) - (goto-char end) - (insert-and-inherit completed-prefix) - (delete-region beg end) - (goto-char (+ beg (length completed-prefix)))) - (t nil)) - (cond ((and (member completed-prefix completion-set) - (slime-length= completion-set 1)) - (slime-minibuffer-respecting-message "Sole completion") - (when slime-complete-symbol*-fancy - (slime-complete-symbol*-fancy-bit)) - (slime-complete-restore-window-configuration)) - ;; Incomplete - (t - (when (member completed-prefix completion-set) - (slime-minibuffer-respecting-message - "Complete but not unique")) - (when slime-c-p-c-unambiguous-prefix-p - (let ((unambiguous-completion-length - (cl-loop for c in completion-set - minimizing (or (cl-mismatch completed-prefix c) - (length completed-prefix))))) - (goto-char (+ beg unambiguous-completion-length)))) - (slime-display-or-scroll-completions completion-set - beg - (max (point) end))))))) - -(defun slime-complete-symbol*-fancy-bit () - "Do fancy tricks after completing a symbol. -\(Insert a space or close-paren based on arglist information.)" - (let ((arglist (slime-retrieve-arglist (slime-symbol-at-point)))) - (unless (eq arglist :not-available) - (let ((args - ;; Don't intern these symbols - (let ((obarray (make-vector 10 0))) - (cdr (read arglist)))) - (function-call-position-p - (save-excursion - (backward-sexp) - (equal (char-before) ?\()))) - (when function-call-position-p - (if (null args) - (execute-kbd-macro ")") - (execute-kbd-macro " ") - (when (and (slime-background-activities-enabled-p) - (not (minibuffer-window-active-p (minibuffer-window)))) - (slime-echo-arglist)))))))) - -(cl-defun slime-contextual-completions (beg end) - "Return a list of completions of the token from BEG to END in the -current buffer." - (let ((token (buffer-substring-no-properties beg end))) - (cond - ((and (< beg (point-max)) - (string= (buffer-substring-no-properties beg (1+ beg)) ":")) - ;; Contextual keyword completion - (let ((completions - (slime-completions-for-keyword token - (save-excursion - (goto-char beg) - (slime-parse-form-upto-point))))) - (when (cl-first completions) - (cl-return-from slime-contextual-completions completions)) - ;; If no matching keyword was found, do regular symbol - ;; completion. - )) - ((and (>= (length token) 2) - (string= (cl-subseq token 0 2) "#\\")) - ;; Character name completion - (cl-return-from slime-contextual-completions - (slime-completions-for-character token)))) - ;; Regular symbol completion - (slime-completions token))) - -(defun slime-completions (prefix) - (slime-eval `(swank:completions ,prefix ',(slime-current-package)))) - -(defun slime-completions-for-keyword (prefix buffer-form) - (slime-eval `(swank:completions-for-keyword ,prefix ',buffer-form))) - -(defun slime-completions-for-character (prefix) - (cl-labels ((append-char-syntax (string) (concat "#\\" string))) - (let ((result (slime-eval `(swank:completions-for-character - ,(cl-subseq prefix 2))))) - (when (car result) - (list (mapcar #'append-char-syntax (car result)) - (append-char-syntax (cadr result))))))) - - -;;; Complete form - -(defun slime-complete-form () - "Complete the form at point. -This is a superset of the functionality of `slime-insert-arglist'." - (interactive) - ;; Find the (possibly incomplete) form around point. - (let ((buffer-form (slime-parse-form-upto-point))) - (let ((result (slime-eval `(swank:complete-form ',buffer-form)))) - (if (eq result :not-available) - (error "Could not generate completion for the form `%s'" buffer-form) - (progn - (just-one-space (if (looking-back "\\s(" (1- (point))) - 0 - 1)) - (save-excursion - (insert result) - (let ((slime-close-parens-limit 1)) - (slime-close-all-parens-in-sexp))) - (save-excursion - (backward-up-list 1) - (indent-sexp))))))) - -(provide 'slime-c-p-c) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-cl-indent.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-cl-indent.el deleted file mode 100644 index 96ebb58..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-cl-indent.el +++ /dev/null @@ -1,1821 +0,0 @@ -;;; slime-cl-indent.el --- enhanced lisp-indent mode - -;; Copyright (C) 1987, 2000-2011 Free Software Foundation, Inc. - -;; Author: Richard Mlynarik -;; Created: July 1987 -;; Maintainer: FSF -;; Keywords: lisp, tools -;; Package: emacs - -;; This file is forked from cl-indent.el, which is part of GNU Emacs. - -;; GNU Emacs 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 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs 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 GNU Emacs. If not, see . - -;;; Commentary: - -;; This package supplies a single entry point, common-lisp-indent-function, -;; which performs indentation in the preferred style for Common Lisp code. -;; To enable it: -;; -;; (setq lisp-indent-function 'common-lisp-indent-function) -;; -;; This file is substantially patched from original cl-indent.el, -;; which is in Emacs proper. It does not require SLIME, but is instead -;; required by one of it's contribs, `slime-indentation'. -;; -;; Before making modifications to this file, consider adding them to -;; Emacs's own `cl-indent' and refactoring this file to be an -;; extension of Emacs's. - -;;; Code: - -(require 'slime) ; only for its cl-lib loading smartness -(require 'cl-lib) -(eval-when-compile (require 'cl)) - -(defgroup lisp-indent nil - "Indentation in Lisp." - :group 'lisp) - -(defcustom lisp-indent-maximum-backtracking 6 - "Maximum depth to backtrack out from a sublist for structured indentation. -If this variable is 0, no backtracking will occur and forms such as `flet' -may not be correctly indented if this value is less than 4." - :type 'integer - :group 'lisp-indent) - -(defcustom lisp-tag-indentation 1 - "Indentation of tags relative to containing list. -This variable is used by the function `lisp-indent-tagbody'." - :type 'integer - :group 'lisp-indent) - -(defcustom lisp-tag-body-indentation 3 - "Indentation of non-tagged lines relative to containing list. -This variable is used by the function `lisp-indent-tagbody' to indent normal -lines (lines without tags). -The indentation is relative to the indentation of the parenthesis enclosing -the special form. If the value is t, the body of tags will be indented -as a block at the same indentation as the first s-expression following -the tag. In this case, any forms before the first tag are indented -by `lisp-body-indent'." - :type 'integer - :group 'lisp-indent) - -(defcustom lisp-backquote-indentation t - "Whether or not to indent backquoted lists as code. -If nil, indent backquoted lists as data, i.e., like quoted lists." - :type 'boolean - :group 'lisp-indent) - -(defcustom lisp-loop-indent-subclauses t - "Whether or not to indent loop subclauses." - :type 'boolean - :group 'lisp-indent) - -(defcustom lisp-simple-loop-indentation 2 - "Indentation of forms in simple loop forms." - :type 'integer - :group 'lisp-indent) - -(defcustom lisp-loop-clauses-indentation 2 - "Indentation of loop clauses if `loop' is immediately followed by a newline." - :type 'integer - :group 'lisp-indent) - -(defcustom lisp-loop-indent-body-forms-relative-to-loop-start nil - "When true, indent loop body clauses relative to the open paren of the loop -form, instead of the keyword position." - :type 'boolean - :group 'lisp-indent) - -(defcustom lisp-loop-body-forms-indentation 3 - "Indentation of loop body clauses." - :type 'integer - :group 'lisp-indent) - -(defcustom lisp-loop-indent-forms-like-keywords nil - "Whether or not to indent loop subforms just like -loop keywords. Only matters when `lisp-loop-indent-subclauses' -is nil." - :type 'boolean - :group 'lisp-indent) - -(defcustom lisp-align-keywords-in-calls t - "Whether to align keyword arguments vertically or not. -If t (the default), keywords in contexts where no other -indentation rule takes precedence are aligned like this: - -\(make-instance 'foo :bar t - :quux 42) - -If nil, they are indented like any other function -call arguments: - -\(make-instance 'foo :bar t - :quux 42)" - :type 'boolean - :group 'lisp-indent) - -(defcustom lisp-lambda-list-indentation t - "Whether to indent lambda-lists specially. Defaults to t. Setting this to -nil makes `lisp-lambda-list-keyword-alignment', -`lisp-lambda-list-keyword-parameter-alignment', and -`lisp-lambda-list-keyword-parameter-indentation' meaningless, causing -lambda-lists to be indented as if they were data: - -\(defun example (a b &optional o1 o2 - o3 o4 - &rest r - &key k1 k2 - k3 k4) - #|...|#)" - :type 'boolean - :group 'lisp-indent) - -(defcustom lisp-lambda-list-keyword-alignment nil - "Whether to vertically align lambda-list keywords together. -If nil (the default), keyworded lambda-list parts are aligned -with the initial mandatory arguments, like this: - -\(defun foo (arg1 arg2 &rest rest - &key key1 key2) - #|...|#) - -If non-nil, alignment is done with the first keyword -\(or falls back to the previous case), as in: - -\(defun foo (arg1 arg2 &rest rest - &key key1 key2) - #|...|#)" - :type 'boolean - :group 'lisp-indent) - -(defcustom lisp-lambda-list-keyword-parameter-indentation 2 - "Indentation of lambda list keyword parameters. -See `lisp-lambda-list-keyword-parameter-alignment' -for more information." - :type 'integer - :group 'lisp-indent) - -(defcustom lisp-lambda-list-keyword-parameter-alignment nil - "Whether to vertically align lambda-list keyword parameters together. -If nil (the default), the parameters are aligned -with their corresponding keyword, plus the value of -`lisp-lambda-list-keyword-parameter-indentation', like this: - -\(defun foo (arg1 arg2 &key key1 key2 - key3 key4) - #|...|#) - -If non-nil, alignment is done with the first parameter -\(or falls back to the previous case), as in: - -\(defun foo (arg1 arg2 &key key1 key2 - key3 key4) - #|...|#)" - :type 'boolean - :group 'lisp-indent) - - -(defvar lisp-indent-defun-method '(4 &lambda &body) - "Defun-like indentation method. -This applies when the value of the `common-lisp-indent-function' property -is set to `defun'.") - - -;;;; Named styles. -;;;; -;;;; -*- common-lisp-style: foo -*- -;;;; -;;;; sets the style for the buffer. -;;;; -;;;; A Common Lisp style is a list of the form: -;;;; -;;;; (NAME INHERIT VARIABLES INDENTATION HOOK DOCSTRING) -;;;; -;;;; where NAME is a symbol naming the style, INHERIT is the name of the style -;;;; it inherits from, VARIABLES is an alist specifying buffer local variables -;;;; for the style, and INDENTATION is an alist specifying non-standard -;;;; indentations for Common Lisp symbols. HOOK is a function to call when -;;;; activating the style. DOCSTRING is the documentation for the style. -;;;; -;;;; Convenience accessors `common-lisp-style-name', &co exist. -;;;; -;;;; `common-lisp-style' stores the name of the current style. -;;;; -;;;; `common-lisp-style-default' stores the name of the style to use when none -;;;; has been specified. -;;;; -;;;; `common-lisp-active-style' stores a cons of the list specifying the -;;;; current style, and a hash-table containing all indentation methods of -;;;; that style and any styles it inherits from. Whenever we're indenting, we -;;;; check that this is up to date, and recompute when necessary. -;;;; -;;;; Just setting the buffer local common-lisp-style will be enough to have -;;;; the style take effect. `common-lisp-set-style' can also be called -;;;; explicitly, however, and offers name completion, etc. - -;;; Convenience accessors -(defun common-lisp-style-name (style) (first style)) -(defun common-lisp-style-inherits (style) (second style)) -(defun common-lisp-style-variables (style) (third style)) -(defun common-lisp-style-indentation (style) (fourth style)) -(defun common-lisp-style-hook (style) (fifth style)) -(defun common-lisp-style-docstring (style) (sixth style)) - -(defun common-lisp-make-style (stylename inherits variables indentation hook - documentation) - (list stylename inherits variables indentation hook documentation)) - -(defvar common-lisp-style nil) - -;;; `define-common-lisp-style' updates the docstring of -;;; `common-lisp-style', using this as the base. -(put 'common-lisp-style 'common-lisp-style-base-doc - "Name of the Common Lisp indentation style used in the current buffer. -Set this by giving eg. - - ;; -*- common-lisp-style: sbcl -*- - -in the first line of the file, or by calling `common-lisp-set-style'. If -buffer has no style specified, but `common-lisp-style-default' is set, that -style is used instead. Use `define-common-lisp-style' to define new styles.") - -(make-variable-buffer-local 'common-lisp-style) -(set-default 'common-lisp-style nil) - -;;; `lisp-mode' kills all buffer-local variables. Setting the -;;; `permanent-local' property allows us to retain the style. -(put 'common-lisp-style 'permanent-local t) - -;;; Mark as safe when the style doesn't evaluate arbitrary code. -(put 'common-lisp-style 'safe-local-variable 'common-lisp-safe-style-p) - -;;; Common Lisp indentation style specifications. -(defvar common-lisp-styles (make-hash-table :test 'equal)) - -(defun common-lisp-delete-style (stylename) - (remhash stylename common-lisp-styles)) - -(defun common-lisp-find-style (stylename) - (let ((name (if (symbolp stylename) - (symbol-name stylename) - stylename))) - (or (gethash name common-lisp-styles) - (error "Unknown Common Lisp style: %s" name)))) - -(defun common-lisp-safe-style-p (stylename) - "True for known Common Lisp style without an :EVAL option. -Ie. styles that will not evaluate arbitrary code on activation." - (let* ((style (ignore-errors (common-lisp-find-style stylename))) - (base (common-lisp-style-inherits style))) - (and style - (not (common-lisp-style-hook style)) - (or (not base) - (common-lisp-safe-style-p base))))) - -(defun common-lisp-add-style (stylename inherits variables indentation hooks - documentation) - ;; Invalidate indentation methods cached in common-lisp-active-style. - (maphash (lambda (k v) - (puthash k (cl-copy-list v) common-lisp-styles)) - common-lisp-styles) - ;; Add/Redefine the specified style. - (puthash stylename - (common-lisp-make-style stylename inherits variables indentation - hooks documentation) - common-lisp-styles) - ;; Frob `common-lisp-style' docstring. - (let ((doc (get 'common-lisp-style 'common-lisp-style-base-doc)) - (all nil)) - (setq doc (concat doc "\n\nAvailable styles are:\n")) - (maphash (lambda (name style) - (push (list name (common-lisp-style-docstring style)) all)) - common-lisp-styles) - (dolist (info (sort all (lambda (a b) (string< (car a) (car b))))) - (let ((style-name (first info)) - (style-doc (second info))) - (if style-doc - (setq doc (concat doc - "\n " style-name "\n" - " " style-doc "\n")) - (setq doc (concat doc - "\n " style-name " (undocumented)\n"))))) - (put 'common-lisp-style 'variable-documentation doc)) - stylename) - -;;; Activate STYLENAME, adding its indentation methods to METHODS -- and -;;; recurse on style inherited from. -(defun common-lisp-activate-style (stylename methods) - (let* ((style (common-lisp-find-style stylename)) - (basename (common-lisp-style-inherits style))) - ;; Recurse on parent. - (when basename - (common-lisp-activate-style basename methods)) - ;; Copy methods - (dolist (spec (common-lisp-style-indentation style)) - (puthash (first spec) (second spec) methods)) - ;; Bind variables. - (dolist (var (common-lisp-style-variables style)) - (set (make-local-variable (first var)) (second var))) - ;; Run hook. - (let ((hook (common-lisp-style-hook style))) - (when hook - (funcall hook))))) - -;;; When a style is being used, `common-lisp-active-style' holds a cons -;;; -;;; (STYLE . METHODS) -;;; -;;; where STYLE is the list specifying the currently active style, and -;;; METHODS is the table of indentation methods -- including inherited -;;; ones -- for it. `common-lisp-active-style-methods' is reponsible -;;; for keeping this up to date. -(make-variable-buffer-local (defvar common-lisp-active-style nil)) - -;;; Makes sure common-lisp-active-style corresponds to common-lisp-style, and -;;; pick up redefinitions, etc. Returns the method table for the currently -;;; active style. -(defun common-lisp-active-style-methods () - (let* ((name common-lisp-style) - (style (when name (common-lisp-find-style name)))) - (if (eq style (car common-lisp-active-style)) - (cdr common-lisp-active-style) - (when style - (let ((methods (make-hash-table :test 'equal))) - (common-lisp-activate-style name methods) - (setq common-lisp-active-style (cons style methods)) - methods))))) - -(defvar common-lisp-set-style-history nil) - -(defun common-lisp-style-names () - (let (names) - (maphash (lambda (k v) - (push (cons k v) names)) - common-lisp-styles) - names)) - -(defun common-lisp-set-style (stylename) - "Set current buffer to use the Common Lisp style STYLENAME. -STYLENAME, a string, must be an existing Common Lisp style. Styles -are added (and updated) using `define-common-lisp-style'. - -The buffer-local variable `common-lisp-style' will get set to STYLENAME. - -A Common Lisp style is composed of local variables, indentation -specifications, and may also contain arbitrary elisp code to run upon -activation." - (interactive - (list (let ((completion-ignore-case t) - (prompt "Specify Common Lisp indentation style: ")) - (completing-read prompt - (common-lisp-style-names) nil t nil - 'common-lisp-set-style-history)))) - (setq common-lisp-style (common-lisp-style-name - (common-lisp-find-style stylename)) - common-lisp-active-style nil) - ;; Actually activates the style. - (common-lisp-active-style-methods) - stylename) - -(defmacro define-common-lisp-style (name documentation &rest options) - "Define a Common Lisp indentation style. - -NAME is the name of the style. - -DOCUMENTATION is the docstring for the style, automatically added to the -docstring of `common-lisp-style'. - -OPTIONS are: - - (:variables (name value) ...) - - Specifying the buffer local variables associated with the style. - - (:indentation (symbol spec) ...) - - Specifying custom indentations associated with the style. SPEC is - a normal `common-lisp-indent-function' indentation specification. - - (:inherit style) - - Inherit variables and indentations from another Common Lisp style. - - (:eval form ...) - - Lisp code to evaluate when activating the style. This can be used to - eg. activate other modes. It is possible that over the lifetime of - a buffer same style gets activated multiple times, so code in :eval - option should cope with that. -" - (when (consp documentation) - (setq options (cons documentation options) - documentation nil)) - `(common-lisp-add-style ,name - ',(cadr (assoc :inherit options)) - ',(cdr (assoc :variables options)) - ',(cdr (assoc :indentation options)) - ,(when (assoc :eval options) - `(lambda () - ,@(cdr (assoc :eval options)))) - ,documentation)) - -(define-common-lisp-style "basic-common" - (:variables - (lisp-indent-maximum-backtracking 6) - (lisp-tag-indentation 1) - (lisp-tag-body-indentation 3) - (lisp-backquote-indentation t) - (lisp-loop-indent-subclauses t) - (lisp-loop-indent-forms-like-keywords nil) - (lisp-simple-loop-indentation 2) - (lisp-align-keywords-in-calls t) - (lisp-lambda-list-indentation t) - (lisp-lambda-list-keyword-alignment nil) - (lisp-lambda-list-keyword-parameter-indentation 2) - (lisp-lambda-list-keyword-parameter-alignment nil) - (lisp-indent-defun-method (4 &lambda &body)) - (lisp-loop-clauses-indentation 2) - (lisp-loop-indent-body-forms-relative-to-loop-start nil) - (lisp-loop-body-forms-indentation 3))) - -(define-common-lisp-style "basic-emacs25" - "This style adds a workaround needed for Emacs 25" - (:inherit "basic-common") - (:variables - ;; Without these (;;foo would get a space inserted between - ;; ( and ; by indent-sexp. - (comment-indent-function (lambda () nil)))) - -(define-common-lisp-style "basic-emacs26" - "This style is the same as basic-common. It doesn't need or - want the workaround used in Emacs 25. In Emacs 26, that - workaround introduces a weird behavior where a single - semicolon breaks the mode and causes the cursor to move to the - start of the line after every character inserted." - (:inherit "basic-common")) - -(if (>= emacs-major-version 26) - (define-common-lisp-style "basic" - "This style merely gives all identation variables their default values, - making it easy to create new styles that are proof against user - customizations. It also adjusts comment indentation from default. - All other predefined modes inherit from basic." - (:inherit "basic-emacs26")) - (define-common-lisp-style "basic" - "This style merely gives all identation variables their default values, - making it easy to create new styles that are proof against user - customizations. It also adjusts comment indentation from default. - All other predefined modes inherit from basic." - (:inherit "basic-emacs25"))) - -(define-common-lisp-style "classic" - "This style of indentation emulates the most striking features of 1995 - vintage cl-indent.el once included as part of Slime: IF indented by two - spaces, and CASE clause bodies indentented more deeply than the keys." - (:inherit "basic") - (:variables - (lisp-lambda-list-keyword-parameter-indentation 0)) - (:indentation - (case (4 &rest (&whole 2 &rest 3))) - (if (4 2 2)))) - -(define-common-lisp-style "modern" - "A good general purpose style. Turns on lambda-list keyword and keyword - parameter alignment, and turns subclause aware loop indentation off. - (Loop indentation so because simpler style is more prevalent in existing - sources, not because it is necessarily preferred.)" - (:inherit "basic") - (:variables - (lisp-lambda-list-keyword-alignment t) - (lisp-lambda-list-keyword-parameter-alignment t) - (lisp-lambda-list-keyword-parameter-indentation 0) - (lisp-loop-indent-subclauses nil))) - -(define-common-lisp-style "sbcl" - "Style used in SBCL sources. A good if somewhat intrusive general purpose - style based on the \"modern\" style. Adds indentation for a few SBCL - specific constructs, sets indentation to use spaces instead of tabs, - fill-column to 78, and activates whitespace-mode to show tabs and trailing - whitespace." - (:inherit "modern") - (:eval - (whitespace-mode 1)) - (:variables - (whitespace-style (tabs trailing)) - (indent-tabs-mode nil) - (comment-fill-column nil) - (fill-column 78)) - (:indentation - (def!constant (as defconstant)) - (def!macro (as defmacro)) - (def!method (as defmethod)) - (def!struct (as defstruct)) - (def!type (as deftype)) - (defmacro-mundanely (as defmacro)) - (define-source-transform (as defun)) - (!def-type-translator (as defun)) - (!def-debug-command (as defun)))) - -(defcustom common-lisp-style-default nil - "Name of the Common Lisp indentation style to use in lisp-mode buffers if -none has been specified." - :type `(choice (const :tag "None" nil) - ,@(mapcar (lambda (spec) - `(const :tag ,(car spec) ,(car spec))) - (common-lisp-style-names)) - (string :tag "Other")) - :group 'lisp-indent) - -;;; If style is being used, that's a sufficient invitation to snag -;;; the indentation function. -(defun common-lisp-lisp-mode-hook () - (let ((style (or common-lisp-style common-lisp-style-default))) - (when style - (set (make-local-variable 'lisp-indent-function) - 'common-lisp-indent-function) - (common-lisp-set-style style)))) -(add-hook 'lisp-mode-hook 'common-lisp-lisp-mode-hook) - - -;;;; The indentation specs are stored at three levels. In order of priority: -;;;; -;;;; 1. Indentation as set by current style, from the indentation table -;;;; in the current style. -;;;; -;;;; 2. Globally set indentation, from the `common-lisp-indent-function' -;;;; property of the symbol. -;;;; -;;;; 3. Per-package indentation derived by the system. A live Common Lisp -;;;; system may (via Slime, eg.) add indentation specs to -;;;; common-lisp-system-indentation, where they are associated with -;;;; the package of the symbol. Then we run some lossy heuristics and -;;;; find something that looks promising. -;;;; -;;;; FIXME: for non-system packages the derived indentation should probably -;;;; take precedence. - -;;; This maps symbols into lists of (INDENT . PACKAGES) where INDENT is -;;; an indentation spec, and PACKAGES are the names of packages where this -;;; applies. -;;; -;;; We never add stuff here by ourselves: this is for things like Slime to -;;; fill. -(defvar common-lisp-system-indentation (make-hash-table :test 'equal)) - -(defun common-lisp-guess-current-package () - (let (pkg) - (save-excursion - (ignore-errors - (when (let ((case-fold-search t)) - (search-backward "(in-package ")) - (re-search-forward "[ :\"]+") - (let ((start (point))) - (re-search-forward "[\":)]") - (setf pkg (upcase (buffer-substring-no-properties - start (1- (point))))))))) - pkg)) - -(defvar common-lisp-current-package-function 'common-lisp-guess-current-package - "Used to derive the package name to use for indentation at a -given point. Defaults to `common-lisp-guess-current-package'.") - -(defun common-lisp-symbol-package (string) - (if (and (stringp string) (string-match ":" string)) - (let ((p (match-beginning 0))) - (if (eql 0 p) - "KEYWORD" - (upcase (substring string 0 p)))) - (funcall common-lisp-current-package-function))) - -(defun common-lisp-get-indentation (name &optional full) - "Retrieves the indentation information for NAME." - (let ((method - (or - ;; From style - (when common-lisp-style - (gethash name (common-lisp-active-style-methods))) - ;; From global settings. - (get name 'common-lisp-indent-function) - ;; From system derived information. - (let ((system-info (gethash name common-lisp-system-indentation))) - (if (not (cdr system-info)) - (caar system-info) - (let ((guess nil) - (guess-n 0) - (package (common-lisp-symbol-package full))) - (dolist (info system-info guess) - (let* ((pkgs (cdr info)) - (n (length pkgs))) - (cond ((member package pkgs) - ;; This is it. - (return (car info))) - ((> n guess-n) - ;; If we can't find the real thing, go with the one - ;; accessible in most packages. - (setf guess (car info) - guess-n n))))))))))) - (if (and (consp method) (eq 'as (car method))) - (common-lisp-get-indentation (cadr method)) - method))) - -;;;; LOOP indentation, the simple version - -(defun common-lisp-loop-type (loop-start) - "Returns the type of the loop form at LOOP-START. -Possible types are SIMPLE, SIMPLE/SPLIT, EXTENDED, and EXTENDED/SPLIT. */SPLIT -refers to extended loops whose body does not start on the same line as the -opening parenthesis of the loop." - (let (comment-split) - (condition-case () - (save-excursion - (goto-char loop-start) - (let ((line (line-number-at-pos)) - (maybe-split t)) - (forward-char 1) - (forward-sexp 1) - (save-excursion - (when (looking-at "\\s-*\\\n*;") - (search-forward ";") - (backward-char 1) - (if (= line (line-number-at-pos)) - (setq maybe-split nil) - (setq comment-split t)))) - (forward-sexp 1) - (backward-sexp 1) - (if (eql (char-after) ?\() - (if (or (not maybe-split) (= line (line-number-at-pos))) - 'simple - 'simple/split) - (if (or (not maybe-split) (= line (line-number-at-pos))) - 'extended - 'extended/split)))) - (error - (if comment-split - 'simple/split - 'simple))))) - -(defun common-lisp-trailing-comment () - (ignore-errors - ;; If we had a trailing comment just before this, find it. - (save-excursion - (backward-sexp) - (forward-sexp) - (when (looking-at "\\s-*;") - (search-forward ";") - (1- (current-column)))))) - -;;;###autoload -(defun common-lisp-indent-function (indent-point state) - "Function to indent the arguments of a Lisp function call. -This is suitable for use as the value of the variable -`lisp-indent-function'. INDENT-POINT is the point at which the -indentation function is called, and STATE is the -`parse-partial-sexp' state at that position. Browse the -`lisp-indent' customize group for options affecting the behavior -of this function. - -If the indentation point is in a call to a Lisp function, that -function's common-lisp-indent-function property specifies how -this function should indent it. Possible values for this -property are: - -* defun, meaning indent according to `lisp-indent-defun-method'; - i.e., like (4 &lambda &body), as explained below. - -* any other symbol, meaning a function to call. The function should - take the arguments: PATH STATE INDENT-POINT SEXP-COLUMN NORMAL-INDENT. - PATH is a list of integers describing the position of point in terms of - list-structure with respect to the containing lists. For example, in - ((a b c (d foo) f) g), foo has a path of (0 3 1). In other words, - to reach foo take the 0th element of the outermost list, then - the 3rd element of the next list, and finally the 1st element. - STATE and INDENT-POINT are as in the arguments to - `common-lisp-indent-function'. SEXP-COLUMN is the column of - the open parenthesis of the innermost containing list. - NORMAL-INDENT is the column the indentation point was - originally in. This function should behave like `lisp-indent-259'. - -* an integer N, meaning indent the first N arguments like - function arguments, and any further arguments like a body. - This is equivalent to (4 4 ... &body). - -* a list starting with `as' specifies an indirection: indentation is done as - if the form being indented had started with the second element of the list. - -* any other list. The list element in position M specifies how to indent the - Mth function argument. If there are fewer elements than function arguments, - the last list element applies to all remaining arguments. The accepted list - elements are: - - * nil, meaning the default indentation. - - * an integer, specifying an explicit indentation. - - * &lambda. Indent the argument (which may be a list) by 4. - - * &rest. When used, this must be the penultimate element. The - element after this one applies to all remaining arguments. - - * &body. This is equivalent to &rest lisp-body-indent, i.e., indent - all remaining elements by `lisp-body-indent'. - - * &whole. This must be followed by nil, an integer, or a - function symbol. This indentation is applied to the - associated argument, and as a base indent for all remaining - arguments. For example, an integer P means indent this - argument by P, and all remaining arguments by P, plus the - value specified by their associated list element. - - * a symbol. A function to call, with the 6 arguments specified above. - - * a list, with elements as described above. This applies when the - associated function argument is itself a list. Each element of the list - specifies how to indent the associated argument. - -For example, the function `case' has an indent property -\(4 &rest (&whole 2 &rest 1)), meaning: - * indent the first argument by 4. - * arguments after the first should be lists, and there may be any number - of them. The first list element has an offset of 2, all the rest - have an offset of 2+1=3." - (common-lisp-indent-function-1 indent-point state)) - -;;; XEmacs doesn't have looking-back, so we define a simple one. Faster to -;;; boot, and sufficient for our needs. -(defun common-lisp-looking-back (string) - (let ((len (length string))) - (dotimes (i len t) - (unless (eql (elt string (- len i 1)) (char-before (- (point) i))) - (return nil))))) - -(defvar common-lisp-feature-expr-regexp "#!?\\(+\\|-\\)") - -;;; Semi-feature-expression aware keyword check. -(defun common-lisp-looking-at-keyword () - (or (looking-at ":") - (and (looking-at common-lisp-feature-expr-regexp) - (save-excursion - (forward-sexp) - (skip-chars-forward " \t\n") - (common-lisp-looking-at-keyword))))) - -;;; Semi-feature-expression aware backwards movement for keyword -;;; argument pairs. -(defun common-lisp-backward-keyword-argument () - (ignore-errors - (backward-sexp 2) - (when (looking-at common-lisp-feature-expr-regexp) - (cond ((ignore-errors - (save-excursion - (backward-sexp 2) - (looking-at common-lisp-feature-expr-regexp))) - (common-lisp-backward-keyword-argument)) - ((ignore-errors - (save-excursion - (backward-sexp 1) - (looking-at ":"))) - (backward-sexp)))) - t)) - -(defun common-lisp-indent-function-1 (indent-point state) - ;; If we're looking at a splice, move to the first comma. - (when (or (common-lisp-looking-back ",") (common-lisp-looking-back ",@")) - (when (re-search-backward "[^,@'],") - (forward-char 1))) - (let ((normal-indent (current-column))) - ;; Walk up list levels until we see something - ;; which does special things with subforms. - (let ((depth 0) - ;; Path describes the position of point in terms of - ;; list-structure with respect to containing lists. - ;; `foo' has a path of (0 3 1) in `((a b c (d foo) f) g)'. - (path ()) - ;; set non-nil when somebody works out the indentation to use - calculated - ;; If non-nil, this is an indentation to use - ;; if nothing else specifies it more firmly. - tentative-calculated - (last-point indent-point) - ;; the position of the open-paren of the innermost containing list - (containing-form-start (common-lisp-indent-parse-state-start state)) - ;; the column of the above - sexp-column) - ;; Move to start of innermost containing list - (goto-char containing-form-start) - (setq sexp-column (current-column)) - - ;; Look over successively less-deep containing forms - (while (and (not calculated) - (< depth lisp-indent-maximum-backtracking)) - (let ((containing-sexp (point))) - (forward-char 1) - (parse-partial-sexp (point) indent-point 1 t) - ;; Move to the car of the relevant containing form - (let (tem full function method tentative-defun) - (if (not (looking-at "\\sw\\|\\s_")) - ;; This form doesn't seem to start with a symbol - (setq function nil method nil full nil) - (setq tem (point)) - (forward-sexp 1) - (setq full (downcase (buffer-substring-no-properties - tem (point))) - function full) - (goto-char tem) - (setq tem (intern-soft function) - method (common-lisp-get-indentation tem)) - (cond ((and (null method) - (string-match ":[^:]+" function)) - ;; The pleblisp package feature - (setq function (substring function - (1+ (match-beginning 0))) - method (common-lisp-get-indentation - (intern-soft function) full))) - ((and (null method)) - ;; backwards compatibility - (setq method (common-lisp-get-indentation tem))))) - (let ((n 0)) - ;; How far into the containing form is the current form? - (if (< (point) indent-point) - (while (condition-case () - (progn - (forward-sexp 1) - (if (>= (point) indent-point) - nil - (parse-partial-sexp (point) - indent-point 1 t) - (setq n (1+ n)) - t)) - (error nil)))) - (setq path (cons n path))) - - ;; Guess. - (when (and (not method) function (null (cdr path))) - ;; (package prefix was stripped off above) - (cond ((and (string-match "\\`def" function) - (not (string-match "\\`default" function)) - (not (string-match "\\`definition" function)) - (not (string-match "\\`definer" function))) - (setq tentative-defun t)) - ((string-match - (eval-when-compile - (concat "\\`\\(" - (regexp-opt '("with" "without" "do")) - "\\)-")) - function) - (setq method '(&lambda &body))))) - - ;; #+ and #- cleverness. - (save-excursion - (goto-char indent-point) - (backward-sexp) - (let ((indent (current-column))) - (when (or (looking-at common-lisp-feature-expr-regexp) - (ignore-errors - (backward-sexp) - (when (looking-at - common-lisp-feature-expr-regexp) - (setq indent (current-column)) - (let ((line (line-number-at-pos))) - (while - (ignore-errors - (backward-sexp 2) - (and - (= line (line-number-at-pos)) - (looking-at - common-lisp-feature-expr-regexp))) - (setq indent (current-column)))) - t))) - (setq calculated (list indent containing-form-start))))) - - (cond ((and (or (eq (char-after (1- containing-sexp)) ?\') - (and (not lisp-backquote-indentation) - (eq (char-after (1- containing-sexp)) ?\`))) - (not (eq (char-after (- containing-sexp 2)) ?\#))) - ;; No indentation for "'(...)" elements - (setq calculated (1+ sexp-column))) - ((eq (char-after (1- containing-sexp)) ?\#) - ;; "#(...)" - (setq calculated (1+ sexp-column))) - ((null method) - ;; If this looks like a call to a `def...' form, - ;; think about indenting it as one, but do it - ;; tentatively for cases like - ;; (flet ((defunp () - ;; nil))) - ;; Set both normal-indent and tentative-calculated. - ;; The latter ensures this value gets used - ;; if there are no relevant containing constructs. - ;; The former ensures this value gets used - ;; if there is a relevant containing construct - ;; but we are nested within the structure levels - ;; that it specifies indentation for. - (if tentative-defun - (setq tentative-calculated - (common-lisp-indent-call-method - function lisp-indent-defun-method - path state indent-point - sexp-column normal-indent) - normal-indent tentative-calculated) - (when lisp-align-keywords-in-calls - ;; No method so far. If we're looking at a keyword, - ;; align with the first keyword in this expression. - ;; This gives a reasonable indentation to most things - ;; with keyword arguments. - (save-excursion - (goto-char indent-point) - (back-to-indentation) - (when (common-lisp-looking-at-keyword) - (while (common-lisp-backward-keyword-argument) - (when (common-lisp-looking-at-keyword) - (setq calculated - (list (current-column) - containing-form-start))))))))) - ((integerp method) - ;; convenient top-level hack. - ;; (also compatible with lisp-indent-function) - ;; The number specifies how many `distinguished' - ;; forms there are before the body starts - ;; Equivalent to (4 4 ... &body) - (setq calculated (cond ((cdr path) - normal-indent) - ((<= (car path) method) - ;; `distinguished' form - (list (+ sexp-column 4) - containing-form-start)) - ((= (car path) (1+ method)) - ;; first body form. - (+ sexp-column lisp-body-indent)) - (t - ;; other body form - normal-indent)))) - (t - (setq calculated - (common-lisp-indent-call-method - function method path state indent-point - sexp-column normal-indent))))) - (goto-char containing-sexp) - (setq last-point containing-sexp) - (unless calculated - (condition-case () - (progn (backward-up-list 1) - (setq depth (1+ depth))) - (error - (setq depth lisp-indent-maximum-backtracking)))))) - - (or calculated tentative-calculated - ;; Fallback. - ;; - ;; Instead of punting directly to calculate-lisp-indent we - ;; handle a few of cases it doesn't deal with: - ;; - ;; A: (foo ( - ;; bar zot - ;; quux)) - ;; - ;; would align QUUX with ZOT. - ;; - ;; B: - ;; (foo (or x - ;; y) t - ;; z) - ;; - ;; would align the Z with Y. - ;; - ;; C: - ;; (foo ;; Comment - ;; (bar) - ;; ;; Comment 2 - ;; (quux)) - ;; - ;; would indent BAR and QUUX by one. - (ignore-errors - (save-excursion - (goto-char indent-point) - (back-to-indentation) - (let ((p (point))) - (goto-char containing-form-start) - (down-list) - (let ((one (current-column))) - (skip-chars-forward " \t") - (if (or (eolp) (looking-at ";")) - ;; A. - (list one containing-form-start) - (forward-sexp 2) - (backward-sexp) - (if (/= p (point)) - ;; B. - (list (current-column) containing-form-start) - (backward-sexp) - (forward-sexp) - (let ((tmp (+ (current-column) 1))) - (skip-chars-forward " \t") - (if (looking-at ";") - ;; C. - (list tmp containing-form-start))))))))))))) - - -(defun common-lisp-indent-call-method (function method path state indent-point - sexp-column normal-indent) - (let ((lisp-indent-error-function function)) - (if (symbolp method) - (funcall method - path state indent-point - sexp-column normal-indent) - (lisp-indent-259 method path state indent-point - sexp-column normal-indent)))) - -;; Dynamically bound in common-lisp-indent-call-method. -(defvar lisp-indent-error-function) - -(defun lisp-indent-report-bad-format (m) - (error "%s has a badly-formed %s property: %s" - ;; Love those free variable references!! - lisp-indent-error-function 'common-lisp-indent-function m)) - - -;; Lambda-list indentation is now done in LISP-INDENT-LAMBDA-LIST. -;; See also `lisp-lambda-list-keyword-alignment', -;; `lisp-lambda-list-keyword-parameter-alignment' and -;; `lisp-lambda-list-keyword-parameter-indentation' -- dvl - -(defvar lisp-indent-lambda-list-keywords-regexp - "&\\(\ -optional\\|rest\\|key\\|allow-other-keys\\|aux\\|whole\\|body\\|\ -environment\\|more\ -\\)\\>" - "Regular expression matching lambda-list keywords.") - -(defun lisp-indent-lambda-list - (indent-point sexp-column containing-form-start) - (if (not lisp-lambda-list-indentation) - (1+ sexp-column) - (lisp-properly-indent-lambda-list - indent-point sexp-column containing-form-start))) - -(defun lisp-properly-indent-lambda-list - (indent-point sexp-column containing-form-start) - (let (limit) - (cond - ((save-excursion - (goto-char indent-point) - (back-to-indentation) - (setq limit (point)) - (looking-at lisp-indent-lambda-list-keywords-regexp)) - ;; We're facing a lambda-list keyword. - (if lisp-lambda-list-keyword-alignment - ;; Align to the first keyword if any, or to the beginning of - ;; the lambda-list. - (save-excursion - (goto-char containing-form-start) - (down-list) - (let ((key-indent nil) - (next t)) - (while (and next (< (point) indent-point)) - (if (looking-at lisp-indent-lambda-list-keywords-regexp) - (setq key-indent (current-column) - next nil) - (setq next (ignore-errors (forward-sexp) t)) - (if next - (ignore-errors - (forward-sexp) - (backward-sexp))))) - (or key-indent - (1+ sexp-column)))) - ;; Align to the beginning of the lambda-list. - (1+ sexp-column))) - (t - ;; Otherwise, align to the first argument of the last lambda-list - ;; keyword, the keyword itself, or the beginning of the - ;; lambda-list. - (save-excursion - (goto-char indent-point) - (let ((indent nil) - (next t)) - (while (and next (> (point) containing-form-start)) - (setq next (ignore-errors (backward-sexp) t)) - (let* ((col (current-column)) - (pos - (save-excursion - (ignore-errors (forward-sexp)) - (skip-chars-forward " \t") - (if (eolp) - (+ col - lisp-lambda-list-keyword-parameter-indentation) - col)))) - (if (looking-at lisp-indent-lambda-list-keywords-regexp) - (setq indent - (if lisp-lambda-list-keyword-parameter-alignment - (or indent pos) - (+ col - lisp-lambda-list-keyword-parameter-indentation)) - next nil) - (setq indent col)))) - (or indent (1+ sexp-column)))))))) - -(defun common-lisp-lambda-list-initial-value-form-p (point) - (let ((state 'x) - (point (save-excursion - (goto-char point) - (back-to-indentation) - (point)))) - (save-excursion - (backward-sexp) - (ignore-errors (down-list 1)) - (while (and point (< (point) point)) - (cond ((or (looking-at "&key") (looking-at "&optional") - (looking-at "&aux")) - (setq state 'key)) - ((looking-at lisp-indent-lambda-list-keywords-regexp) - (setq state 'x))) - (if (not (ignore-errors (forward-sexp) t)) - (setq point nil) - (ignore-errors - (forward-sexp) - (backward-sexp)) - (cond ((> (point) point) - (backward-sexp) - (when (eq state 'var) - (setq state 'x)) - (or (ignore-errors - (down-list 1) - (cond ((> (point) point) - (backward-up-list)) - ((eq 'key state) - (setq state 'var))) - t) - (setq point nil))) - ((eq state 'var) - (setq state 'form)))))) - (eq 'form state))) - -;; Blame the crufty control structure on dynamic scoping -;; -- not on me! -(defun lisp-indent-259 - (method path state indent-point sexp-column normal-indent) - (catch 'exit - (let* ((p (cdr path)) - (containing-form-start (elt state 1)) - (n (1- (car path))) - tem tail) - (if (not (consp method)) - (lisp-indent-report-bad-format method)) - (while n - ;; This while loop is for advancing along a method - ;; until the relevant (possibly &rest/&body) pattern - ;; is reached. - ;; n is set to (1- n) and method to (cdr method) - ;; each iteration. - (setq tem (car method)) - - (or (eq tem 'nil) ;default indentation - (eq tem '&lambda) ;lambda list - (and (eq tem '&body) (null (cdr method))) - (and (eq tem '&rest) - (consp (cdr method)) - (null (cddr method))) - (integerp tem) ;explicit indentation specified - (and (consp tem) ;destructuring - (or (consp (car tem)) - (and (eq (car tem) '&whole) - (or (symbolp (cadr tem)) - (integerp (cadr tem)))))) - (and (symbolp tem) ;a function to call to do the work. - (null (cdr method))) - (lisp-indent-report-bad-format method)) - (cond ((eq tem '&body) - ;; &body means (&rest ) - (throw 'exit - (if (null p) - (+ sexp-column lisp-body-indent) - normal-indent))) - ((eq tem '&rest) - ;; this pattern holds for all remaining forms - (setq tail (> n 0) - n 0 - method (cdr method))) - ((> n 0) - ;; try next element of pattern - (setq n (1- n) - method (cdr method)) - (if (< n 0) - ;; Too few elements in pattern. - (throw 'exit normal-indent))) - ((eq tem 'nil) - (throw 'exit (if (consp normal-indent) - normal-indent - (list normal-indent containing-form-start)))) - ((eq tem '&lambda) - (throw 'exit - (cond ((not (common-lisp-looking-back ")")) - ;; If it's not a list at all, indent it - ;; like body instead. - (if (null p) - (+ sexp-column lisp-body-indent) - normal-indent)) - ((common-lisp-lambda-list-initial-value-form-p - indent-point) - (if (consp normal-indent) - normal-indent - (list normal-indent containing-form-start))) - ((null p) - (list (+ sexp-column 4) containing-form-start)) - (t - ;; Indentation within a lambda-list. -- dvl - (list (lisp-indent-lambda-list - indent-point - sexp-column - containing-form-start) - containing-form-start))))) - ((integerp tem) - (throw 'exit - (if (null p) ;not in subforms - (list (+ sexp-column tem) containing-form-start) - normal-indent))) - ((symbolp tem) ;a function to call - (throw 'exit - (funcall tem path state indent-point - sexp-column normal-indent))) - (t - ;; must be a destructing frob - (if p - ;; descend - (setq method (cddr tem) - n (car p) - p (cdr p) - tail nil) - (let ((wholep (eq '&whole (car tem)))) - (setq tem (cadr tem)) - (throw 'exit - (cond (tail - (if (and wholep (integerp tem) - (save-excursion - (goto-char indent-point) - (back-to-indentation) - (looking-at "\\sw"))) - ;; There's a further level of - ;; destructuring, but we're looking at a - ;; word -- indent to sexp. - (+ sexp-column tem) - normal-indent)) - ((not tem) - (list normal-indent - containing-form-start)) - ((integerp tem) - (list (+ sexp-column tem) - containing-form-start)) - (t - (funcall tem path state indent-point - sexp-column normal-indent)))))))))))) - -(defun lisp-indent-tagbody (path state indent-point sexp-column normal-indent) - (if (not (null (cdr path))) - normal-indent - (save-excursion - (goto-char indent-point) - (back-to-indentation) - (list (cond ((looking-at "\\sw\\|\\s_") - ;; a tagbody tag - (+ sexp-column lisp-tag-indentation)) - ((integerp lisp-tag-body-indentation) - (+ sexp-column lisp-tag-body-indentation)) - ((eq lisp-tag-body-indentation 't) - (condition-case () - (progn (backward-sexp 1) (current-column)) - (error (1+ sexp-column)))) - (t (+ sexp-column lisp-body-indent))) -; (cond ((integerp lisp-tag-body-indentation) -; (+ sexp-column lisp-tag-body-indentation)) -; ((eq lisp-tag-body-indentation 't) -; normal-indent) -; (t -; (+ sexp-column lisp-body-indent))) - (elt state 1) - )))) - -(defun lisp-indent-do (path state indent-point sexp-column normal-indent) - (if (>= (car path) 3) - (let ((lisp-tag-body-indentation lisp-body-indent)) - (funcall (function lisp-indent-tagbody) - path state indent-point sexp-column normal-indent)) - (funcall (function lisp-indent-259) - '((&whole nil &rest - ;; the following causes weird indentation - ;;(&whole 1 1 2 nil) - ) - (&whole nil &rest 1)) - path state indent-point sexp-column normal-indent))) - -(defun lisp-indent-defsetf - (path state indent-point sexp-column normal-indent) - (list - (cond - ;; Inside the lambda-list in a long-form defsetf. - ((and (eql 2 (car path)) (cdr path)) - (lisp-indent-lambda-list indent-point sexp-column (elt state 1))) - ;; Long form: has a lambda-list. - ((or (cdr path) - (save-excursion - (goto-char (elt state 1)) - (ignore-errors - (down-list) - (forward-sexp 3) - (backward-sexp) - (looking-at "nil\\|(")))) - (+ sexp-column - (case (car path) - ((1 3) 4) - (2 4) - (t 2)))) - ;; Short form. - (t - (+ sexp-column - (case (car path) - (1 4) - (2 4) - (t 2))))) - (elt state 1))) - -(defun lisp-beginning-of-defmethod-qualifiers () - (let ((regexp-1 "(defmethod\\|(DEFMETHOD") - (regexp-2 "(:method\\|(:METHOD")) - (while (and (not (or (looking-at regexp-1) - (looking-at regexp-2))) - (ignore-errors (backward-up-list) t))) - (cond ((looking-at regexp-1) - (forward-char) - ;; Skip name. - (forward-sexp 2) - 1) - ((looking-at regexp-2) - (forward-char) - (forward-sexp 1) - 0)))) - -;; LISP-INDENT-DEFMETHOD now supports the presence of more than one method -;; qualifier and indents the method's lambda list properly. -- dvl -(defun lisp-indent-defmethod - (path state indent-point sexp-column normal-indent) - (lisp-indent-259 - (let ((nskip nil)) - (if (save-excursion - (when (setq nskip (lisp-beginning-of-defmethod-qualifiers)) - (skip-chars-forward " \t\n") - (while (looking-at "\\sw\\|\\s_") - (incf nskip) - (forward-sexp) - (skip-chars-forward " \t\n")) - t)) - (append (make-list nskip 4) '(&lambda &body)) - (common-lisp-get-indentation 'defun))) - path state indent-point sexp-column normal-indent)) - -(defun lisp-indent-function-lambda-hack (path state indent-point - sexp-column normal-indent) - ;; indent (function (lambda () )) kludgily. - (if (or (cdr path) ; wtf? - (> (car path) 3)) - ;; line up under previous body form - normal-indent - ;; line up under function rather than under lambda in order to - ;; conserve horizontal space. (Which is what #' is for.) - (condition-case () - (save-excursion - (backward-up-list 2) - (forward-char 1) - (if (looking-at "\\(lisp:+\\)?function\\(\\Sw\\|\\S_\\)") - (+ lisp-body-indent -1 (current-column)) - (+ sexp-column lisp-body-indent))) - (error (+ sexp-column lisp-body-indent))))) - -(defun lisp-indent-loop (path state indent-point sexp-column normal-indent) - (if (cdr path) - normal-indent - (let* ((loop-start (elt state 1)) - (type (common-lisp-loop-type loop-start))) - (cond ((and lisp-loop-indent-subclauses - (member type '(extended extended/split))) - (list (common-lisp-indent-loop-macro-1 state indent-point) - (common-lisp-indent-parse-state-start state))) - (t - (common-lisp-loop-part-indentation indent-point state type)))))) - -;;;; LOOP indentation, the complex version -- handles subclause indentation - -;; Regexps matching various varieties of loop macro keyword ... -(defvar common-lisp-body-introducing-loop-macro-keyword - "\\(#?:\\)?\\(do\\(ing\\)?\\|finally\\|initially\\)" - "Regexp matching loop macro keywords which introduce body forms.") - -;; Not currenctly used -(defvar common-lisp-accumlation-loop-macro-keyword - "\\(#?:\\)?\\(collect\\(ing\\)?\\|append\\(ing\\)?\\|nconc\\(ing\\)?\\|\ -count\\(ing\\)?\\|sum\\(ming\\)?\\|maximiz\\(e\\|ing\\)\\|\ -minimiz\\(e\\|ing\\)\\)" - "Regexp matching loop macro keywords which introduce accumulation clauses.") - -;; This is so "and when" and "else when" get handled right -;; (not to mention "else do" !!!) -(defvar common-lisp-prefix-loop-macro-keyword - "\\(#?:\\)?\\(and\\|else\\)" - "Regexp matching loop macro keywords which are prefixes.") - -(defvar common-lisp-indent-clause-joining-loop-macro-keyword - "\\(#?:\\)?and" - "Regexp matching 'and', and anything else there ever comes to be like it.") - -(defvar common-lisp-indent-indented-loop-macro-keyword - "\\(#?:\\)?\\(\\(up\\|down\\)?(from\\|to)\\|below\\|above\\|in\\(to\\)?\\|\ -on\\|=\\|then\\|across\\|being\\|each\\|the\\|of\\|using\\|\ -\\(present-\\|external-\\)?symbols?\\|fixnum\\|float\\|t\\|nil\\|of-type\\)" - "Regexp matching keywords introducing loop subclauses. -Always indented two.") - -(defvar common-lisp-indenting-loop-macro-keyword - "\\(#?:\\)?\\(when\\|unless\\|if\\)" - "Regexp matching keywords introducing conditional clauses. -Cause subsequent clauses to be indented.") - -(defvar common-lisp-loop-macro-else-keyword "\\(#?:\\)?else") - -;;; Attempt to indent the loop macro ... - -(defun common-lisp-indent-parse-state-depth (parse-state) - (car parse-state)) - -(defun common-lisp-indent-parse-state-start (parse-state) - (car (cdr parse-state))) - -(defun common-lisp-indent-parse-state-prev (parse-state) - (car (cdr (cdr parse-state)))) - -(defun common-lisp-loop-part-indentation (indent-point state type) - "Compute the indentation of loop form constituents." - (let* ((loop-start (elt state 1)) - (loop-indentation (save-excursion - (goto-char loop-start) - (if (eq type 'extended/split) - (- (current-column) 4) - (current-column)))) - (indent nil) - (re "\\(\\(#?:\\)?\\sw+\\|)\\|\n\\)")) - (goto-char indent-point) - (back-to-indentation) - (cond ((eq type 'simple/split) - (+ loop-indentation lisp-simple-loop-indentation)) - ((eq type 'simple) - (+ loop-indentation 6)) - ;; We are already in a body, with forms in it. - ((and (not (looking-at re)) - (save-excursion - (while (and (ignore-errors (backward-sexp) t) - (not (looking-at re))) - (setq indent (current-column))) - (when (and indent - (looking-at - common-lisp-body-introducing-loop-macro-keyword)) - t))) - (list indent loop-start)) - ;; Keyword-style or comment outside body - ((or lisp-loop-indent-forms-like-keywords - (looking-at re) - (looking-at ";")) - (if (and (looking-at ";") - (let ((p (common-lisp-trailing-comment))) - (when p - (setq loop-indentation p)))) - (list loop-indentation loop-start) - (list (+ loop-indentation 6) loop-start))) - ;; Form-style - (t - (list (+ loop-indentation 9) loop-start))))) - -(defun common-lisp-indent-loop-macro-1 (parse-state indent-point) - (catch 'return-indentation - (save-excursion - ;; Find first clause of loop macro, and use it to establish - ;; base column for indentation - (goto-char (common-lisp-indent-parse-state-start parse-state)) - (let ((loop-start-column (current-column))) - (common-lisp-loop-advance-past-keyword-on-line) - - (when (eolp) - (forward-line 1) - (end-of-line) - ;; If indenting first line after "(loop " - ;; cop out ... - (if (<= indent-point (point)) - (throw 'return-indentation (+ lisp-loop-clauses-indentation - loop-start-column))) - (back-to-indentation)) - - (let* ((case-fold-search t) - (loop-macro-first-clause (point)) - (previous-expression-start - (common-lisp-indent-parse-state-prev parse-state)) - (default-value (current-column)) - (loop-body-p nil) - (loop-body-indentation nil) - (indented-clause-indentation (+ 2 default-value))) - ;; Determine context of this loop clause, starting with the - ;; expression immediately preceding the line we're trying to indent - (goto-char previous-expression-start) - - ;; Handle a body-introducing-clause which ends a line specially. - (if (looking-at common-lisp-body-introducing-loop-macro-keyword) - (let ((keyword-position (current-column))) - (setq loop-body-p t) - (setq loop-body-indentation - (if (common-lisp-loop-advance-past-keyword-on-line) - (current-column) - (back-to-indentation) - (if (/= (current-column) keyword-position) - (+ 2 (current-column)) - (+ lisp-loop-body-forms-indentation - (if lisp-loop-indent-body-forms-relative-to-loop-start - loop-start-column - keyword-position)))))) - - (back-to-indentation) - (if (< (point) loop-macro-first-clause) - (goto-char loop-macro-first-clause)) - ;; If there's an "and" or "else," advance over it. - ;; If it is alone on the line, the next "cond" will treat it - ;; as if there were a "when" and indent under it ... - (let ((exit nil)) - (while (and (null exit) - (looking-at common-lisp-prefix-loop-macro-keyword)) - (if (null (common-lisp-loop-advance-past-keyword-on-line)) - (progn (setq exit t) - (back-to-indentation))))) - - ;; Found start of loop clause preceding the one we're - ;; trying to indent. Glean context ... - (cond - ((looking-at "(") - ;; We're in the middle of a clause body ... - (setq loop-body-p t) - (setq loop-body-indentation (current-column))) - ((looking-at common-lisp-body-introducing-loop-macro-keyword) - (setq loop-body-p t) - ;; Know there's something else on the line (or would - ;; have been caught above) - (common-lisp-loop-advance-past-keyword-on-line) - (setq loop-body-indentation (current-column))) - (t - (setq loop-body-p nil) - (if (or (looking-at common-lisp-indenting-loop-macro-keyword) - (looking-at common-lisp-prefix-loop-macro-keyword)) - (setq default-value (+ 2 (current-column)))) - (setq indented-clause-indentation (+ 2 (current-column))) - ;; We still need loop-body-indentation for "syntax errors" ... - (goto-char previous-expression-start) - (setq loop-body-indentation (current-column))))) - - ;; Go to first non-blank character of the line we're trying - ;; to indent. (if none, wind up poised on the new-line ...) - (goto-char indent-point) - (back-to-indentation) - (cond - ((looking-at "(") - ;; Clause body ... - loop-body-indentation) - ((or (eolp) (looking-at ";")) - ;; Blank line. If body-p, indent as body, else indent as - ;; vanilla clause. - (if loop-body-p - loop-body-indentation - (or (and (looking-at ";") (common-lisp-trailing-comment)) - default-value))) - ((looking-at common-lisp-indent-indented-loop-macro-keyword) - indented-clause-indentation) - ((looking-at common-lisp-indent-clause-joining-loop-macro-keyword) - (let ((stolen-indent-column nil)) - (forward-line -1) - (while (and (null stolen-indent-column) - (> (point) loop-macro-first-clause)) - (back-to-indentation) - (if (and (< (current-column) loop-body-indentation) - (looking-at "\\(#?:\\)?\\sw")) - (progn - (if (looking-at common-lisp-loop-macro-else-keyword) - (common-lisp-loop-advance-past-keyword-on-line)) - (setq stolen-indent-column - (current-column))) - (forward-line -1))) - (if stolen-indent-column - stolen-indent-column - default-value))) - (t default-value))))))) - -(defun common-lisp-loop-advance-past-keyword-on-line () - (forward-word 1) - (while (and (looking-at "\\s-") (not (eolp))) - (forward-char 1)) - (if (eolp) - nil - (current-column))) - -;;;; IF* is not standard, but a plague upon the land -;;;; ...let's at least try to indent it. - -(defvar common-lisp-indent-if*-keyword - "threnret\\|elseif\\|then\\|else" - "Regexp matching if* keywords") - -(defun common-lisp-indent-if* - (path parse-state indent-point sexp-column normal-indent) - (list (common-lisp-indent-if*-1 parse-state indent-point) - (common-lisp-indent-parse-state-start parse-state))) - -(defun common-lisp-indent-if*-1 (parse-state indent-point) - (catch 'return-indentation - (save-excursion - ;; Find first clause of if* macro, and use it to establish - ;; base column for indentation - (goto-char (common-lisp-indent-parse-state-start parse-state)) - (let ((if*-start-column (current-column))) - (common-lisp-indent-if*-advance-past-keyword-on-line) - (let* ((case-fold-search t) - (if*-first-clause (point)) - (previous-expression-start - (common-lisp-indent-parse-state-prev parse-state)) - (default-value (current-column)) - (if*-body-p nil) - (if*-body-indentation nil)) - ;; Determine context of this if* clause, starting with the - ;; expression immediately preceding the line we're trying to indent - (goto-char previous-expression-start) - ;; Handle a body-introducing-clause which ends a line specially. - (back-to-indentation) - (if (< (point) if*-first-clause) - (goto-char if*-first-clause)) - ;; Found start of if* clause preceding the one we're trying - ;; to indent. Glean context ... - (cond - ((looking-at common-lisp-indent-if*-keyword) - (setq if*-body-p t) - ;; Know there's something else on the line (or would - ;; have been caught above) - (common-lisp-indent-if*-advance-past-keyword-on-line) - (setq if*-body-indentation (current-column))) - ((looking-at "#'\\|'\\|(") - ;; We're in the middle of a clause body ... - (setq if*-body-p t) - (setq if*-body-indentation (current-column))) - (t - (setq if*-body-p nil) - ;; We still need if*-body-indentation for "syntax errors" ... - (goto-char previous-expression-start) - (setq if*-body-indentation (current-column)))) - - ;; Go to first non-blank character of the line we're trying - ;; to indent. (if none, wind up poised on the new-line ...) - (goto-char indent-point) - (back-to-indentation) - (cond - ((or (eolp) (looking-at ";")) - ;; Blank line. If body-p, indent as body, else indent as - ;; vanilla clause. - (if if*-body-p - if*-body-indentation - default-value)) - ((not (looking-at common-lisp-indent-if*-keyword)) - ;; Clause body ... - if*-body-indentation) - (t - (- (+ 7 if*-start-column) - (- (match-end 0) (match-beginning 0)))))))))) - -(defun common-lisp-indent-if*-advance-past-keyword-on-line () - (forward-word 1) - (block move-forward - (while (and (looking-at "\\s-") (not (eolp))) - (forward-char 1))) - (if (eolp) - nil - (current-column))) - - -;;;; Indentation specs for standard symbols, and a few semistandard ones. -(defun common-lisp-init-standard-indentation () - (let ((l '((block 1) - (case (4 &rest (&whole 2 &rest 1))) - (ccase (as case)) - (ecase (as case)) - (typecase (as case)) - (etypecase (as case)) - (ctypecase (as case)) - (catch 1) - (cond (&rest (&whole 2 &rest nil))) - ;; for DEFSTRUCT - (:constructor (4 &lambda)) - (defvar (4 2 2)) - (defclass (6 (&whole 4 &rest 1) - (&whole 2 &rest 1) - (&whole 2 &rest 1))) - (defconstant (as defvar)) - (defcustom (4 2 2 2)) - (defparameter (as defvar)) - (defconst (as defcustom)) - (define-condition (as defclass)) - (define-modify-macro (4 &lambda &body)) - (defsetf lisp-indent-defsetf) - (defun (4 &lambda &body)) - (defgeneric (4 &lambda &body)) - (define-setf-method (as defun)) - (define-setf-expander (as defun)) - (defmacro (as defun)) - (defsubst (as defun)) - (deftype (as defun)) - (defmethod lisp-indent-defmethod) - (defpackage (4 2)) - (defstruct ((&whole 4 &rest (&whole 2 &rest 1)) - &rest (&whole 2 &rest 1))) - (destructuring-bind (&lambda 4 &body)) - (do lisp-indent-do) - (do* (as do)) - (dolist ((&whole 4 2 1) &body)) - (dotimes (as dolist)) - (eval-when 1) - (flet ((&whole 4 &rest (&whole 1 4 &lambda &body)) &body)) - (labels (as flet)) - (macrolet (as flet)) - (generic-flet (as flet)) - (generic-labels (as flet)) - (handler-case (4 &rest (&whole 2 &lambda &body))) - (restart-case (as handler-case)) - ;; single-else style (then and else equally indented) - (if (&rest nil)) - (if* common-lisp-indent-if*) - (lambda (&lambda &rest lisp-indent-function-lambda-hack)) - (let ((&whole 4 &rest (&whole 1 1 2)) &body)) - (let* (as let)) - (compiler-let (as let)) - (handler-bind (as let)) - (restart-bind (as let)) - (locally 1) - (loop lisp-indent-loop) - (:method lisp-indent-defmethod) ; in `defgeneric' - (multiple-value-bind ((&whole 6 &rest 1) 4 &body)) - (multiple-value-call (4 &body)) - (multiple-value-prog1 1) - (multiple-value-setq (4 2)) - (multiple-value-setf (as multiple-value-setq)) - (named-lambda (4 &lambda &rest lisp-indent-function-lambda-hack)) - (pprint-logical-block (4 2)) - (print-unreadable-object ((&whole 4 1 &rest 1) &body)) - ;; Combines the worst features of BLOCK, LET and TAGBODY - (prog (&lambda &rest lisp-indent-tagbody)) - (prog* (as prog)) - (prog1 1) - (prog2 2) - (progn 0) - (progv (4 4 &body)) - (return 0) - (return-from (nil &body)) - (symbol-macrolet (as let)) - (tagbody lisp-indent-tagbody) - (throw 1) - (unless 1) - (unwind-protect (5 &body)) - (when 1) - (with-accessors (as multiple-value-bind)) - (with-compilation-unit ((&whole 4 &rest 1) &body)) - (with-condition-restarts (as multiple-value-bind)) - (with-output-to-string (4 2)) - (with-slots (as multiple-value-bind)) - (with-standard-io-syntax (2))))) - (dolist (el l) - (let* ((name (car el)) - (spec (cdr el)) - (indentation - (if (symbolp spec) - (error "Old style indirect indentation spec: %s" el) - (when (cdr spec) - (error "Malformed indentation specification: %s" el)) - (car spec)))) - (unless (symbolp name) - (error "Cannot set Common Lisp indentation of a non-symbol: %s" - name)) - (put name 'common-lisp-indent-function indentation))))) -(common-lisp-init-standard-indentation) - -(provide 'cl-indent) -(provide 'slime-cl-indent) - -;;; slime-cl-indent.el ends here diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-clipboard.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-clipboard.el deleted file mode 100644 index 4f5dd17..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-clipboard.el +++ /dev/null @@ -1,172 +0,0 @@ -(require 'slime) -(require 'slime-repl) -(require 'cl-lib) -(eval-when-compile - (require 'cl)) ; lexical-let - -(define-slime-contrib slime-clipboard - "This add a few commands to put objects into a clipboard and to -insert textual references to those objects. - -The clipboard command prefix is C-c @. - - C-c @ + adds an object to the clipboard - C-c @ @ inserts a reference to an object in the clipboard - C-c @ ? displays the clipboard - -This package also also binds the + key in the inspector and -debugger to add the object at point to the clipboard." - (:authors "Helmut Eller ") - (:license "GPL") - (:swank-dependencies swank-clipboard)) - -(define-derived-mode slime-clipboard-mode fundamental-mode - "Slime-Clipboard" - "SLIME Clipboad Mode. - -\\{slime-clipboard-mode-map}") - -(slime-define-keys slime-clipboard-mode-map - ("g" 'slime-clipboard-redisplay) - ((kbd "C-k") 'slime-clipboard-delete-entry) - ("i" 'slime-clipboard-inspect)) - -(defvar slime-clipboard-map (make-sparse-keymap)) - -(slime-define-keys slime-clipboard-map - ("?" 'slime-clipboard-display) - ("+" 'slime-clipboard-add) - ("@" 'slime-clipboard-ref)) - -(define-key slime-mode-map (kbd "C-c @") slime-clipboard-map) -(define-key slime-repl-mode-map (kbd "C-c @") slime-clipboard-map) - -(slime-define-keys slime-inspector-mode-map - ("+" 'slime-clipboard-add-from-inspector)) - -(slime-define-keys sldb-mode-map - ("+" 'slime-clipboard-add-from-sldb)) - -(defun slime-clipboard-add (exp package) - "Add an object to the clipboard." - (interactive (list (slime-read-from-minibuffer - "Add to clipboard (evaluated): " - (slime-sexp-at-point)) - (slime-current-package))) - (slime-clipboard-add-internal `(:string ,exp ,package))) - -(defun slime-clipboard-add-internal (datum) - (slime-eval-async `(swank-clipboard:add ',datum) - (lambda (result) (message "%s" result)))) - -(defun slime-clipboard-display () - "Display the content of the clipboard." - (interactive) - (slime-eval-async `(swank-clipboard:entries) - #'slime-clipboard-display-entries)) - -(defun slime-clipboard-display-entries (entries) - (slime-with-popup-buffer ((slime-buffer-name :clipboard) - :mode 'slime-clipboard-mode) - (slime-clipboard-insert-entries entries))) - -(defun slime-clipboard-insert-entries (entries) - (let ((fstring "%2s %3s %s\n")) - (insert (format fstring "Nr" "Id" "Value") - (format fstring "--" "--" "-----" )) - (save-excursion - (cl-loop for i from 0 for (ref . value) in entries do - (slime-insert-propertized `(slime-clipboard-entry ,i - slime-clipboard-ref ,ref) - (format fstring i ref value)))))) - -(defun slime-clipboard-redisplay () - "Update the clipboard buffer." - (interactive) - (lexical-let ((saved (point))) - (slime-eval-async - `(swank-clipboard:entries) - (lambda (entries) - (let ((inhibit-read-only t)) - (erase-buffer) - (slime-clipboard-insert-entries entries) - (when (< saved (point-max)) - (goto-char saved))))))) - -(defun slime-clipboard-entry-at-point () - (or (get-text-property (point) 'slime-clipboard-entry) - (error "No clipboard entry at point"))) - -(defun slime-clipboard-ref-at-point () - (or (get-text-property (point) 'slime-clipboard-ref) - (error "No clipboard ref at point"))) - -(defun slime-clipboard-inspect (&optional entry) - "Inspect the current clipboard entry." - (interactive (list (slime-clipboard-ref-at-point))) - (slime-inspect (prin1-to-string `(swank-clipboard::clipboard-ref ,entry)))) - -(defun slime-clipboard-delete-entry (&optional entry) - "Delete the current entry from the clipboard." - (interactive (list (slime-clipboard-entry-at-point))) - (slime-eval-async `(swank-clipboard:delete-entry ,entry) - (lambda (result) - (slime-clipboard-redisplay) - (message "%s" result)))) - -(defun slime-clipboard-ref () - "Ask for a clipboard entry number and insert a reference to it." - (interactive) - (slime-clipboard-read-entry-number #'slime-clipboard-insert-ref)) - -;; insert a reference to clipboard entry ENTRY at point. The text -;; receives a special 'display property to make it look nicer. We -;; remove this property in a modification when a user tries to modify -;; he real text. -(defun slime-clipboard-insert-ref (entry) - (cl-destructuring-bind (ref . string) - (slime-eval `(swank-clipboard:entry-to-ref ,entry)) - (slime-insert-propertized - `(display ,(format "#@%d%s" ref string) - modification-hooks (slime-clipboard-ref-modified) - rear-nonsticky t) - (format "(swank-clipboard::clipboard-ref %d)" ref)))) - -(defun slime-clipboard-ref-modified (start end) - (when (get-text-property start 'display) - (let ((inhibit-modification-hooks t)) - (save-excursion - (goto-char start) - (cl-destructuring-bind (dstart dend) (slime-property-bounds 'display) - (unless (and (= start dstart) (= end dend)) - (remove-list-of-text-properties - dstart dend '(display modification-hooks)))))))) - -;; Read a entry number. -;; Written in CPS because the display the clipboard before reading. -(defun slime-clipboard-read-entry-number (k) - (slime-eval-async - `(swank-clipboard:entries) - (slime-rcurry - (lambda (entries window-config k) - (slime-clipboard-display-entries entries) - (let ((entry (unwind-protect - (read-from-minibuffer "Entry number: " nil nil t) - (set-window-configuration window-config)))) - (funcall k entry))) - (current-window-configuration) - k))) - -(defun slime-clipboard-add-from-inspector () - (interactive) - (let ((part (or (get-text-property (point) 'slime-part-number) - (error "No part at point")))) - (slime-clipboard-add-internal `(:inspector ,part)))) - -(defun slime-clipboard-add-from-sldb () - (interactive) - (slime-clipboard-add-internal - `(:sldb ,(sldb-frame-number-at-point) - ,(sldb-var-number-at-point)))) - -(provide 'slime-clipboard) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-compiler-notes-tree.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-compiler-notes-tree.el deleted file mode 100644 index bada587..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-compiler-notes-tree.el +++ /dev/null @@ -1,184 +0,0 @@ -(require 'slime) -(require 'cl-lib) - -(define-slime-contrib slime-compiler-notes-tree - "Display compiler messages in tree layout. - -M-x slime-list-compiler-notes display the compiler notes in a tree -grouped by severity. - - `slime-maybe-list-compiler-notes' can be used as - `slime-compilation-finished-hook'. -" - (:authors "Helmut Eller ") - (:license "GPL")) - -(defun slime-maybe-list-compiler-notes (notes) - "Show the compiler notes if appropriate." - ;; don't pop up a buffer if all notes are already annotated in the - ;; buffer itself - (unless (cl-every #'slime-note-has-location-p notes) - (slime-list-compiler-notes notes))) - -(defun slime-list-compiler-notes (notes) - "Show the compiler notes NOTES in tree view." - (interactive (list (slime-compiler-notes))) - (with-temp-message "Preparing compiler note tree..." - (slime-with-popup-buffer ((slime-buffer-name :notes) - :mode 'slime-compiler-notes-mode) - (when (null notes) - (insert "[no notes]")) - (let ((collapsed-p)) - (dolist (tree (slime-compiler-notes-to-tree notes)) - (when (slime-tree.collapsed-p tree) (setf collapsed-p t)) - (slime-tree-insert tree "") - (insert "\n")) - (goto-char (point-min)))))) - -(defvar slime-tree-printer 'slime-tree-default-printer) - -(defun slime-tree-for-note (note) - (make-slime-tree :item (slime-note.message note) - :plist (list 'note note) - :print-fn slime-tree-printer)) - -(defun slime-tree-for-severity (severity notes collapsed-p) - (make-slime-tree :item (format "%s (%d)" - (slime-severity-label severity) - (length notes)) - :kids (mapcar #'slime-tree-for-note notes) - :collapsed-p collapsed-p)) - -(defun slime-compiler-notes-to-tree (notes) - (let* ((alist (slime-alistify notes #'slime-note.severity #'eq)) - (collapsed-p (slime-length> alist 1))) - (cl-loop for (severity . notes) in alist - collect (slime-tree-for-severity severity notes - collapsed-p)))) - -(defvar slime-compiler-notes-mode-map) - -(define-derived-mode slime-compiler-notes-mode fundamental-mode - "Compiler-Notes" - "\\\ -\\{slime-compiler-notes-mode-map} -\\{slime-popup-buffer-mode-map} -" - (slime-set-truncate-lines)) - -(slime-define-keys slime-compiler-notes-mode-map - ((kbd "RET") 'slime-compiler-notes-default-action-or-show-details) - ([return] 'slime-compiler-notes-default-action-or-show-details) - ([mouse-2] 'slime-compiler-notes-default-action-or-show-details/mouse)) - -(defun slime-compiler-notes-default-action-or-show-details/mouse (event) - "Invoke the action pointed at by the mouse, or show details." - (interactive "e") - (cl-destructuring-bind (mouse-2 (w pos &rest _) &rest __) event - (save-excursion - (goto-char pos) - (let ((fn (get-text-property (point) - 'slime-compiler-notes-default-action))) - (if fn (funcall fn) (slime-compiler-notes-show-details)))))) - -(defun slime-compiler-notes-default-action-or-show-details () - "Invoke the action at point, or show details." - (interactive) - (let ((fn (get-text-property (point) 'slime-compiler-notes-default-action))) - (if fn (funcall fn) (slime-compiler-notes-show-details)))) - -(defun slime-compiler-notes-show-details () - (interactive) - (let* ((tree (slime-tree-at-point)) - (note (plist-get (slime-tree.plist tree) 'note)) - (inhibit-read-only t)) - (cond ((not (slime-tree-leaf-p tree)) - (slime-tree-toggle tree)) - (t - (slime-show-source-location (slime-note.location note) t))))) - - -;;;;;; Tree Widget - -(cl-defstruct (slime-tree (:conc-name slime-tree.)) - item - (print-fn #'slime-tree-default-printer :type function) - (kids '() :type list) - (collapsed-p t :type boolean) - (prefix "" :type string) - (start-mark nil) - (end-mark nil) - (plist '() :type list)) - -(defun slime-tree-leaf-p (tree) - (not (slime-tree.kids tree))) - -(defun slime-tree-default-printer (tree) - (princ (slime-tree.item tree) (current-buffer))) - -(defun slime-tree-decoration (tree) - (cond ((slime-tree-leaf-p tree) "-- ") - ((slime-tree.collapsed-p tree) "[+] ") - (t "-+ "))) - -(defun slime-tree-insert-list (list prefix) - "Insert a list of trees." - (cl-loop for (elt . rest) on list - do (cond (rest - (insert prefix " |") - (slime-tree-insert elt (concat prefix " |")) - (insert "\n")) - (t - (insert prefix " `") - (slime-tree-insert elt (concat prefix " ")))))) - -(defun slime-tree-insert-decoration (tree) - (insert (slime-tree-decoration tree))) - -(defun slime-tree-indent-item (start end prefix) - "Insert PREFIX at the beginning of each but the first line. -This is used for labels spanning multiple lines." - (save-excursion - (goto-char end) - (beginning-of-line) - (while (< start (point)) - (insert-before-markers prefix) - (forward-line -1)))) - -(defun slime-tree-insert (tree prefix) - "Insert TREE prefixed with PREFIX at point." - (with-struct (slime-tree. print-fn kids collapsed-p start-mark end-mark) tree - (let ((line-start (line-beginning-position))) - (setf start-mark (point-marker)) - (slime-tree-insert-decoration tree) - (funcall print-fn tree) - (slime-tree-indent-item start-mark (point) (concat prefix " ")) - (add-text-properties line-start (point) (list 'slime-tree tree)) - (set-marker-insertion-type start-mark t) - (when (and kids (not collapsed-p)) - (terpri (current-buffer)) - (slime-tree-insert-list kids prefix)) - (setf (slime-tree.prefix tree) prefix) - (setf end-mark (point-marker))))) - -(defun slime-tree-at-point () - (cond ((get-text-property (point) 'slime-tree)) - (t (error "No tree at point")))) - -(defun slime-tree-delete (tree) - "Delete the region for TREE." - (delete-region (slime-tree.start-mark tree) - (slime-tree.end-mark tree))) - -(defun slime-tree-toggle (tree) - "Toggle the visibility of TREE's children." - (with-struct (slime-tree. collapsed-p start-mark end-mark prefix) tree - (setf collapsed-p (not collapsed-p)) - (slime-tree-delete tree) - (insert-before-markers " ") ; move parent's end-mark - (backward-char 1) - (slime-tree-insert tree prefix) - (delete-char 1) - (goto-char start-mark))) - -(provide 'slime-compiler-notes-tree) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-editing-commands.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-editing-commands.el deleted file mode 100644 index db7bb01..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-editing-commands.el +++ /dev/null @@ -1,183 +0,0 @@ -(require 'slime) -(require 'slime-repl) -(require 'cl-lib) - -(define-slime-contrib slime-editing-commands - "Editing commands without server interaction." - (:authors "Thomas F. Burdick " - "Luke Gorrie " - "Bill Clementson " - "Tobias C. Rittweiler ") - (:license "GPL") - (:on-load - (define-key slime-mode-map "\M-\C-a" 'slime-beginning-of-defun) - (define-key slime-mode-map "\M-\C-e" 'slime-end-of-defun) - (define-key slime-mode-map "\C-c\M-q" 'slime-reindent-defun) - (define-key slime-mode-map "\C-c\C-]" 'slime-close-all-parens-in-sexp))) - -(defun slime-beginning-of-defun () - (interactive) - (if (and (boundp 'slime-repl-input-start-mark) - slime-repl-input-start-mark) - (slime-repl-beginning-of-defun) - (let ((this-command 'beginning-of-defun)) ; needed for push-mark - (call-interactively 'beginning-of-defun)))) - -(defun slime-end-of-defun () - (interactive) - (if (eq major-mode 'slime-repl-mode) - (slime-repl-end-of-defun) - (end-of-defun))) - -(defvar slime-comment-start-regexp - "\\(\\(^\\|[^\n\\\\]\\)\\([\\\\][\\\\]\\)*\\);+[ \t]*" - "Regexp to match the start of a comment.") - -(defun slime-beginning-of-comment () - "Move point to beginning of comment. -If point is inside a comment move to beginning of comment and return point. -Otherwise leave point unchanged and return NIL." - (let ((boundary (point))) - (beginning-of-line) - (cond ((re-search-forward slime-comment-start-regexp boundary t) - (point)) - (t (goto-char boundary) - nil)))) - -(defvar slime-close-parens-limit nil - "Maxmimum parens for `slime-close-all-sexp' to insert. NIL -means to insert as many parentheses as necessary to correctly -close the form.") - -(defun slime-close-all-parens-in-sexp (&optional region) - "Balance parentheses of open s-expressions at point. -Insert enough right parentheses to balance unmatched left parentheses. -Delete extra left parentheses. Reformat trailing parentheses -Lisp-stylishly. - -If REGION is true, operate on the region. Otherwise operate on -the top-level sexp before point." - (interactive "P") - (let ((sexp-level 0) - point) - (save-excursion - (save-restriction - (when region - (narrow-to-region (region-beginning) (region-end)) - (goto-char (point-max))) - ;; skip over closing parens, but not into comment - (skip-chars-backward ") \t\n") - (when (slime-beginning-of-comment) - (forward-line) - (skip-chars-forward " \t")) - (setq point (point)) - ;; count sexps until either '(' or comment is found at first column - (while (and (not (looking-at "^[(;]")) - (ignore-errors (backward-up-list 1) t)) - (incf sexp-level)))) - (when (> sexp-level 0) - ;; insert correct number of right parens - (goto-char point) - (dotimes (i sexp-level) (insert ")")) - ;; delete extra right parens - (setq point (point)) - (skip-chars-forward " \t\n)") - (skip-chars-backward " \t\n") - (let* ((deleted-region (delete-and-extract-region point (point))) - (deleted-text (substring-no-properties deleted-region)) - (prior-parens-count (cl-count ?\) deleted-text))) - ;; Remember: we always insert as many parentheses as necessary - ;; and only afterwards delete the superfluously-added parens. - (when slime-close-parens-limit - (let ((missing-parens (- sexp-level prior-parens-count - slime-close-parens-limit))) - (dotimes (i (max 0 missing-parens)) - (delete-char -1)))))))) - -(defun slime-insert-balanced-comments (arg) - "Insert a set of balanced comments around the s-expression -containing the point. If this command is invoked repeatedly -\(without any other command occurring between invocations), the -comment progressively moves outward over enclosing expressions. -If invoked with a positive prefix argument, the s-expression arg -expressions out is enclosed in a set of balanced comments." - (interactive "*p") - (save-excursion - (when (eq last-command this-command) - (when (search-backward "#|" nil t) - (save-excursion - (delete-char 2) - (while (and (< (point) (point-max)) (not (looking-at " *|#"))) - (forward-sexp)) - (replace-match "")))) - (while (> arg 0) - (backward-char 1) - (cond ((looking-at ")") (incf arg)) - ((looking-at "(") (decf arg)))) - (insert "#|") - (forward-sexp) - (insert "|#"))) - -(defun slime-remove-balanced-comments () - "Remove a set of balanced comments enclosing point." - (interactive "*") - (save-excursion - (when (search-backward "#|" nil t) - (delete-char 2) - (while (and (< (point) (point-max)) (not (looking-at " *|#"))) - (forward-sexp)) - (replace-match "")))) - - -;; SLIME-CLOSE-PARENS-AT-POINT is obsolete: - -;; It doesn't work correctly on the REPL, because there -;; BEGINNING-OF-DEFUN-FUNCTION and END-OF-DEFUN-FUNCTION is bound to -;; SLIME-REPL-MODE-BEGINNING-OF-DEFUN (and -;; SLIME-REPL-MODE-END-OF-DEFUN respectively) which compromises the -;; way how they're expect to work (i.e. END-OF-DEFUN does not signal -;; an UNBOUND-PARENTHESES error.) - -;; Use SLIME-CLOSE-ALL-PARENS-IN-SEXP instead. - -;; (defun slime-close-parens-at-point () -;; "Close parenthesis at point to complete the top-level-form. Simply -;; inserts ')' characters at point until `beginning-of-defun' and -;; `end-of-defun' execute without errors, or `slime-close-parens-limit' -;; is exceeded." -;; (interactive) -;; (loop for i from 1 to slime-close-parens-limit -;; until (save-excursion -;; (slime-beginning-of-defun) -;; (ignore-errors (slime-end-of-defun) t)) -;; do (insert ")"))) - -(defun slime-reindent-defun (&optional force-text-fill) - "Reindent the current defun, or refill the current paragraph. -If point is inside a comment block, the text around point will be -treated as a paragraph and will be filled with `fill-paragraph'. -Otherwise, it will be treated as Lisp code, and the current defun -will be reindented. If the current defun has unbalanced parens, -an attempt will be made to fix it before reindenting. - -When given a prefix argument, the text around point will always -be treated as a paragraph. This is useful for filling docstrings." - (interactive "P") - (save-excursion - (if (or force-text-fill (slime-beginning-of-comment)) - (fill-paragraph nil) - (let ((start (progn (unless (or (and (zerop (current-column)) - (eq ?\( (char-after))) - (and slime-repl-input-start-mark - (slime-repl-at-prompt-start-p))) - (slime-beginning-of-defun)) - (point))) - (end (ignore-errors (slime-end-of-defun) (point)))) - (unless end - (forward-paragraph) - (slime-close-all-parens-in-sexp) - (slime-end-of-defun) - (setf end (point))) - (indent-region start end nil))))) - -(provide 'slime-editing-commands) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-enclosing-context.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-enclosing-context.el deleted file mode 100644 index 53cee76..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-enclosing-context.el +++ /dev/null @@ -1,226 +0,0 @@ -(require 'slime) -(require 'slime-parse) -(require 'cl-lib) - -(define-slime-contrib slime-enclosing-context - "Utilities on top of slime-parse." - (:authors "Tobias C. Rittweiler ") - (:license "GPL")) - -(defun slime-parse-sexp-at-point (&optional n) - "Returns the sexps at point as a list of strings, otherwise nil. -\(If there are not as many sexps as N, a list with < N sexps is -returned.\) -If SKIP-BLANKS-P is true, leading whitespaces &c are skipped. -" - (interactive "p") (or n (setq n 1)) - (save-excursion - (let ((result nil)) - (dotimes (i n) - ;; Is there an additional sexp in front of us? - (save-excursion - (unless (slime-point-moves-p (ignore-errors (forward-sexp))) - (cl-return))) - (push (slime-sexp-at-point) result) - ;; Skip current sexp - (ignore-errors (forward-sexp) (skip-chars-forward "[:space:]"))) - (nreverse result)))) - -(defun slime-has-symbol-syntax-p (string) - (if (and string (not (zerop (length string)))) - (member (char-syntax (aref string 0)) - '(?w ?_ ?\' ?\\)))) - -(defun slime-beginning-of-string () - (let* ((parser-state (slime-current-parser-state)) - (inside-string-p (nth 3 parser-state)) - (string-start-pos (nth 8 parser-state))) - (if inside-string-p - (goto-char string-start-pos) - (error "We're not within a string")))) - -(defun slime-enclosing-form-specs (&optional max-levels) - "Return the list of ``raw form specs'' of all the forms -containing point from right to left. - -As a secondary value, return a list of indices: Each index tells -for each corresponding form spec in what argument position the -user's point is. - -As tertiary value, return the positions of the operators that are -contained in the returned form specs. - -When MAX-LEVELS is non-nil, go up at most this many levels of -parens. - -\(See SWANK::PARSE-FORM-SPEC for more information about what -exactly constitutes a ``raw form specs'') - -Examples: - - A return value like the following - - (values ((\"quux\") (\"bar\") (\"foo\")) (3 2 1) (p1 p2 p3)) - - can be interpreted as follows: - - The user point is located in the 3rd argument position of a - form with the operator name \"quux\" (which starts at P1.) - - This form is located in the 2nd argument position of a form - with the operator name \"bar\" (which starts at P2.) - - This form again is in the 1st argument position of a form - with the operator name \"foo\" (which itself begins at P3.) - - For instance, the corresponding buffer content could have looked - like `(foo (bar arg1 (quux 1 2 |' where `|' denotes point. -" - (let ((level 1) - (parse-sexp-lookup-properties nil) - (initial-point (point)) - (result '()) (arg-indices '()) (points '())) - ;; The expensive lookup of syntax-class text properties is only - ;; used for interactive balancing of #<...> in presentations; we - ;; do not need them in navigating through the nested lists. - ;; This speeds up this function significantly. - (ignore-errors - (save-excursion - ;; Make sure we get the whole thing at point. - (if (not (slime-inside-string-p)) - (slime-end-of-symbol) - (slime-beginning-of-string) - (forward-sexp)) - (save-restriction - ;; Don't parse more than 20000 characters before point, so we don't spend - ;; too much time. - (narrow-to-region (max (point-min) (- (point) 20000)) (point-max)) - (narrow-to-region (save-excursion (beginning-of-defun) (point)) - (min (1+ (point)) (point-max))) - (while (or (not max-levels) - (<= level max-levels)) - (let ((arg-index 0)) - ;; Move to the beginning of the current sexp if not already there. - (if (or (and (char-after) - (member (char-syntax (char-after)) '(?\( ?'))) - (member (char-syntax (char-before)) '(?\ ?>))) - (cl-incf arg-index)) - (ignore-errors (backward-sexp 1)) - (while (and (< arg-index 64) - (ignore-errors (backward-sexp 1) - (> (point) (point-min)))) - (cl-incf arg-index)) - (backward-up-list 1) - (when (member (char-syntax (char-after)) '(?\( ?')) - (cl-incf level) - (forward-char 1) - (let ((name (slime-symbol-at-point))) - (push (and name `(,name)) result) - (push arg-index arg-indices) - (push (point) points)) - (backward-up-list 1))))))) - (cl-values - (nreverse result) - (nreverse arg-indices) - (nreverse points)))) - -(defvar slime-variable-binding-ops-alist - '((let &bindings &body) - (let* &bindings &body))) - -(defvar slime-function-binding-ops-alist - '((flet &bindings &body) - (labels &bindings &body) - (macrolet &bindings &body))) - -(defun slime-lookup-binding-op (op &optional binding-type) - (cl-labels ((lookup-in (list) (cl-assoc op list :test 'cl-equalp :key 'symbol-name))) - (cond ((eq binding-type :variable) (lookup-in slime-variable-binding-ops-alist)) - ((eq binding-type :function) (lookup-in slime-function-binding-ops-alist)) - (t (or (lookup-in slime-variable-binding-ops-alist) - (lookup-in slime-function-binding-ops-alist)))))) - -(defun slime-binding-op-p (op &optional binding-type) - (and (slime-lookup-binding-op op binding-type) t)) - -(defun slime-binding-op-body-pos (op) - (let ((special-lambda-list (slime-lookup-binding-op op))) - (if special-lambda-list (cl-position '&body special-lambda-list)))) - -(defun slime-binding-op-bindings-pos (op) - (let ((special-lambda-list (slime-lookup-binding-op op))) - (if special-lambda-list (cl-position '&bindings special-lambda-list)))) - -(defun slime-enclosing-bound-names () - "Returns all bound function names as first value, and the -points where their bindings are established as second value." - (cl-multiple-value-call #'slime-find-bound-names - (slime-enclosing-form-specs))) - -(defun slime-find-bound-names (ops indices points) - (let ((binding-names) (binding-start-points)) - (save-excursion - (cl-loop for (op . nil) in ops - for index in indices - for point in points - do (when (and (slime-binding-op-p op) - ;; Are the bindings of OP in scope? - (>= index (slime-binding-op-body-pos op))) - (goto-char point) - (forward-sexp (slime-binding-op-bindings-pos op)) - (down-list) - (ignore-errors - (cl-loop - (down-list) - (push (slime-symbol-at-point) binding-names) - (push (save-excursion (backward-up-list) (point)) - binding-start-points) - (up-list))))) - (cl-values (nreverse binding-names) (nreverse binding-start-points))))) - - -(defun slime-enclosing-bound-functions () - (cl-multiple-value-call #'slime-find-bound-functions - (slime-enclosing-form-specs))) - -(defun slime-find-bound-functions (ops indices points) - (let ((names) (arglists) (start-points)) - (save-excursion - (cl-loop for (op . nil) in ops - for index in indices - for point in points - do (when (and (slime-binding-op-p op :function) - ;; Are the bindings of OP in scope? - (>= index (slime-binding-op-body-pos op))) - (goto-char point) - (forward-sexp (slime-binding-op-bindings-pos op)) - (down-list) - ;; If we're at the end of the bindings, an error will - ;; be signalled by the `down-list' below. - (ignore-errors - (cl-loop - (down-list) - (cl-destructuring-bind (name arglist) - (slime-parse-sexp-at-point 2) - (cl-assert (slime-has-symbol-syntax-p name)) - (cl-assert arglist) - (push name names) - (push arglist arglists) - (push (save-excursion (backward-up-list) (point)) - start-points)) - (up-list))))) - (cl-values (nreverse names) - (nreverse arglists) - (nreverse start-points))))) - - -(defun slime-enclosing-bound-macros () - (cl-multiple-value-call #'slime-find-bound-macros - (slime-enclosing-form-specs))) - -(defun slime-find-bound-macros (ops indices points) - ;; Kludgy! - (let ((slime-function-binding-ops-alist '((macrolet &bindings &body)))) - (slime-find-bound-functions ops indices points))) - -(provide 'slime-enclosing-context) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fancy-inspector.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fancy-inspector.el deleted file mode 100644 index 02d0131..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fancy-inspector.el +++ /dev/null @@ -1,42 +0,0 @@ -(eval-and-compile - (require 'slime)) - -(define-slime-contrib slime-fancy-inspector - "Fancy inspector for CLOS objects." - (:authors "Marco Baringer and others") - (:license "GPL") - (:slime-dependencies slime-parse) - (:swank-dependencies swank-fancy-inspector) - (:on-load - (add-hook 'slime-edit-definition-hooks 'slime-edit-inspector-part)) - (:on-unload - (remove-hook 'slime-edit-definition-hooks 'slime-edit-inspector-part))) - -(defun slime-inspect-definition () - "Inspect definition at point" - (interactive) - (slime-inspect (slime-definition-at-point))) - -(defun slime-disassemble-definition () - "Disassemble definition at point" - (interactive) - (slime-eval-describe `(swank:disassemble-form - ,(slime-definition-at-point t)))) - -(defun slime-edit-inspector-part (name &optional where) - (and (eq major-mode 'slime-inspector-mode) - (cl-destructuring-bind (&optional property value) - (slime-inspector-property-at-point) - (when (eq property 'slime-part-number) - (let ((location (slime-eval `(swank:find-definition-for-thing - (swank:inspector-nth-part ,value)))) - (name (format "Inspector part %s" value))) - (when (and (consp location) - (not (eq (car location) :error))) - (slime-edit-definition-cont - (list (make-slime-xref :dspec `(,name) - :location location)) - name - where))))))) - -(provide 'slime-fancy-inspector) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fancy-trace.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fancy-trace.el deleted file mode 100644 index 06a1fab..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fancy-trace.el +++ /dev/null @@ -1,68 +0,0 @@ -(eval-and-compile - (require 'slime)) - -(define-slime-contrib slime-fancy-trace - "Enhanced version of slime-trace capable of tracing local functions, -methods, setf functions, and other entities supported by specific -swank:swank-toggle-trace backends. Invoke via C-u C-t." - (:authors "Matthias Koeppe " - "Tobias C. Rittweiler ") - (:license "GPL") - (:slime-dependencies slime-parse)) - -(defun slime-trace-query (spec) - "Ask the user which function to trace; SPEC is the default. -The result is a string." - (cond ((null spec) - (slime-read-from-minibuffer "(Un)trace: ")) - ((stringp spec) - (slime-read-from-minibuffer "(Un)trace: " spec)) - ((symbolp spec) ; `slime-extract-context' can return symbols. - (slime-read-from-minibuffer "(Un)trace: " (prin1-to-string spec))) - (t - (slime-dcase spec - ((setf n) - (slime-read-from-minibuffer "(Un)trace: " (prin1-to-string spec))) - ((:defun n) - (slime-read-from-minibuffer "(Un)trace: " (prin1-to-string n))) - ((:defgeneric n) - (let* ((name (prin1-to-string n)) - (answer (slime-read-from-minibuffer "(Un)trace: " name))) - (cond ((and (string= name answer) - (y-or-n-p (concat "(Un)trace also all " - "methods implementing " - name "? "))) - (prin1-to-string `(:defgeneric ,n))) - (t - answer)))) - ((:defmethod &rest _) - (slime-read-from-minibuffer "(Un)trace: " (prin1-to-string spec))) - ((:call caller callee) - (let* ((callerstr (prin1-to-string caller)) - (calleestr (prin1-to-string callee)) - (answer (slime-read-from-minibuffer "(Un)trace: " - calleestr))) - (cond ((and (string= calleestr answer) - (y-or-n-p (concat "(Un)trace only when " calleestr - " is called by " callerstr "? "))) - (prin1-to-string `(:call ,caller ,callee))) - (t - answer)))) - (((:labels :flet) &rest _) - (slime-read-from-minibuffer "(Un)trace local function: " - (prin1-to-string spec))) - (t (error "Don't know how to trace the spec %S" spec)))))) - -(defun slime-toggle-fancy-trace (&optional using-context-p) - "Toggle trace." - (interactive "P") - (let* ((spec (if using-context-p - (slime-extract-context) - (slime-symbol-at-point))) - (spec (slime-trace-query spec))) - (message "%s" (slime-eval `(swank:swank-toggle-trace ,spec))))) - -;; override slime-toggle-trace-fdefinition -(define-key slime-prefix-map "\C-t" 'slime-toggle-fancy-trace) - -(provide 'slime-fancy-trace) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fancy.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fancy.el deleted file mode 100644 index 5aba81c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fancy.el +++ /dev/null @@ -1,38 +0,0 @@ -(require 'slime) - -(define-slime-contrib slime-fancy - "Make SLIME fancy." - (:authors "Matthias Koeppe " - "Tobias C Rittweiler ") - (:license "GPL") - (:slime-dependencies slime-repl - slime-autodoc - slime-c-p-c - slime-editing-commands - slime-fancy-inspector - slime-fancy-trace - slime-fuzzy - slime-mdot-fu - slime-macrostep - slime-presentations - slime-scratch - slime-references - slime-package-fu - slime-fontifying-fu - slime-trace-dialog) - (:on-load - (slime-trace-dialog-init) - (slime-repl-init) - (slime-autodoc-init) - (slime-c-p-c-init) - (slime-editing-commands-init) - (slime-fancy-inspector-init) - (slime-fancy-trace-init) - (slime-fuzzy-init) - (slime-presentations-init) - (slime-scratch-init) - (slime-references-init) - (slime-package-fu-init) - (slime-fontifying-fu-init))) - -(provide 'slime-fancy) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fontifying-fu.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fontifying-fu.el deleted file mode 100644 index 42de251..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fontifying-fu.el +++ /dev/null @@ -1,231 +0,0 @@ -(require 'slime) -(require 'slime-parse) -(require 'slime-autodoc) -(require 'font-lock) -(require 'cl-lib) - -;;; Fontify WITH-FOO, DO-FOO, and DEFINE-FOO like standard macros. -;;; Fontify CHECK-FOO like CHECK-TYPE. -(defvar slime-additional-font-lock-keywords - '(("(\\(\\(\\s_\\|\\w\\)*:\\(define-\\|do-\\|with-\\|without-\\)\\(\\s_\\|\\w\\)*\\)" 1 font-lock-keyword-face) - ("(\\(\\(define-\\|do-\\|with-\\)\\(\\s_\\|\\w\\)*\\)" 1 font-lock-keyword-face) - ("(\\(check-\\(\\s_\\|\\w\\)*\\)" 1 font-lock-warning-face) - ("(\\(assert-\\(\\s_\\|\\w\\)*\\)" 1 font-lock-warning-face))) - -;;;; Specially fontify forms suppressed by a reader conditional. -(defcustom slime-highlight-suppressed-forms t - "Display forms disabled by reader conditionals as comments." - :type '(choice (const :tag "Enable" t) (const :tag "Disable" nil)) - :group 'slime-mode) - -(define-slime-contrib slime-fontifying-fu - "Additional fontification tweaks: -Fontify WITH-FOO, DO-FOO, DEFINE-FOO like standard macros. -Fontify CHECK-FOO like CHECK-TYPE." - (:authors "Tobias C. Rittweiler ") - (:license "GPL") - (:on-load - (font-lock-add-keywords - 'lisp-mode slime-additional-font-lock-keywords) - (when slime-highlight-suppressed-forms - (slime-activate-font-lock-magic))) - (:on-unload - ;; FIXME: remove `slime-search-suppressed-forms', and remove the - ;; extend-region hook. - (font-lock-remove-keywords - 'lisp-mode slime-additional-font-lock-keywords))) - -(defface slime-reader-conditional-face - '((t (:inherit font-lock-comment-face))) - "Face for compiler notes while selected." - :group 'slime-mode-faces) - -(defvar slime-search-suppressed-forms-match-data (list nil nil)) - -(defun slime-search-suppressed-forms-internal (limit) - (when (search-forward-regexp slime-reader-conditionals-regexp limit t) - (let ((start (match-beginning 0)) ; save match data - (state (slime-current-parser-state))) - (if (or (nth 3 state) (nth 4 state)) ; inside string or comment? - (slime-search-suppressed-forms-internal limit) - (let* ((char (char-before)) - (expr (read (current-buffer))) - (val (slime-eval-feature-expression expr))) - (when (<= (point) limit) - (if (or (and (eq char ?+) (not val)) - (and (eq char ?-) val)) - ;; If `slime-extend-region-for-font-lock' did not - ;; fully extend the region, the assertion below may - ;; fail. This should only happen on XEmacs and older - ;; versions of GNU Emacs. - (ignore-errors - (forward-sexp) (backward-sexp) - ;; Try to suppress as far as possible. - (slime-forward-sexp) - (cl-assert (<= (point) limit)) - (let ((md (match-data nil slime-search-suppressed-forms-match-data))) - (setf (cl-first md) start) - (setf (cl-second md) (point)) - (set-match-data md) - t)) - (slime-search-suppressed-forms-internal limit)))))))) - -(defun slime-search-suppressed-forms (limit) - "Find reader conditionalized forms where the test is false." - (when (and slime-highlight-suppressed-forms - (slime-connected-p)) - (let ((result 'retry)) - (while (and (eq result 'retry) (<= (point) limit)) - (condition-case condition - (setq result (slime-search-suppressed-forms-internal limit)) - (end-of-file ; e.g. #+( - (setq result nil)) - ;; We found a reader conditional we couldn't process for - ;; some reason; however, there may still be other reader - ;; conditionals before `limit'. - (invalid-read-syntax ; e.g. #+#.foo - (setq result 'retry)) - (scan-error ; e.g. #+nil (foo ... - (setq result 'retry)) - (slime-incorrect-feature-expression ; e.g. #+(not foo bar) - (setq result 'retry)) - (slime-unknown-feature-expression ; e.g. #+(foo) - (setq result 'retry)) - (error - (setq result nil) - (slime-display-warning - (concat "Caught error during fontification while searching for forms\n" - "that are suppressed by reader-conditionals. The error was: %S.") - condition)))) - result))) - - -(defun slime-search-directly-preceding-reader-conditional () - "Search for a directly preceding reader conditional. Return its -position, or nil." - ;;; We search for a preceding reader conditional. Then we check that - ;;; between the reader conditional and the point where we started is - ;;; no other intervening sexp, and we check that the reader - ;;; conditional is at the same nesting level. - (condition-case nil - (let* ((orig-pt (point)) - (reader-conditional-pt - (search-backward-regexp slime-reader-conditionals-regexp - ;; We restrict the search to the - ;; beginning of the /previous/ defun. - (save-excursion - (beginning-of-defun) - (point)) - t))) - (when reader-conditional-pt - (let* ((parser-state - (parse-partial-sexp - (progn (goto-char (+ reader-conditional-pt 2)) - (forward-sexp) ; skip feature expr. - (point)) - orig-pt)) - (paren-depth (car parser-state)) - (last-sexp-pt (cl-caddr parser-state))) - (if (and paren-depth - (not (cl-plusp paren-depth)) ; no '(' in between? - (not last-sexp-pt)) ; no complete sexp in between? - reader-conditional-pt - nil)))) - (scan-error nil))) ; improper feature expression - - -;;; We'll push this onto `font-lock-extend-region-functions'. In past, -;;; we didn't do so which made our reader-conditional font-lock magic -;;; pretty unreliable (it wouldn't highlight all suppressed forms, and -;;; worked quite non-deterministic in general.) -;;; -;;; Cf. _Elisp Manual_, 23.6.10 Multiline Font Lock Constructs. -;;; -;;; We make sure that `font-lock-beg' and `font-lock-end' always point -;;; to the beginning or end of a toplevel form. So we never miss a -;;; reader-conditional, or point in mid of one. -(defvar font-lock-beg) ; shoosh compiler -(defvar font-lock-end) - -(defun slime-extend-region-for-font-lock () - (when slime-highlight-suppressed-forms - (condition-case c - (let (changedp) - (cl-multiple-value-setq (changedp font-lock-beg font-lock-end) - (slime-compute-region-for-font-lock font-lock-beg font-lock-end)) - changedp) - (error - (slime-display-warning - (concat "Caught error when trying to extend the region for fontification.\n" - "The error was: %S\n" - "Further: font-lock-beg=%d, font-lock-end=%d.") - c font-lock-beg font-lock-end))))) - -(defun slime-beginning-of-tlf () - (let ((pos (syntax-ppss-toplevel-pos (slime-current-parser-state)))) - (if pos (goto-char pos)))) - -(defun slime-compute-region-for-font-lock (orig-beg orig-end) - (let ((beg orig-beg) - (end orig-end)) - (goto-char beg) - (inline (slime-beginning-of-tlf)) - (cl-assert (not (cl-plusp (nth 0 (slime-current-parser-state))))) - (setq beg (let ((pt (point))) - (cond ((> (- beg pt) 20000) beg) - ((slime-search-directly-preceding-reader-conditional)) - (t pt)))) - (goto-char end) - (while (search-backward-regexp slime-reader-conditionals-regexp beg t) - (setq end (max end (save-excursion - (ignore-errors (slime-forward-reader-conditional)) - (point))))) - (cl-values (or (/= beg orig-beg) (/= end orig-end)) beg end))) - - -(defun slime-activate-font-lock-magic () - (if (featurep 'xemacs) - (let ((pattern `((slime-search-suppressed-forms - (0 slime-reader-conditional-face t))))) - (dolist (sym '(lisp-font-lock-keywords - lisp-font-lock-keywords-1 - lisp-font-lock-keywords-2)) - (set sym (append (symbol-value sym) pattern)))) - (font-lock-add-keywords - 'lisp-mode - `((slime-search-suppressed-forms 0 ,''slime-reader-conditional-face t))) - - (add-hook 'lisp-mode-hook - #'(lambda () - (add-hook 'font-lock-extend-region-functions - 'slime-extend-region-for-font-lock t t))))) - -(let ((byte-compile-warnings '())) - (mapc (lambda (sym) - (cond ((fboundp sym) - (unless (byte-code-function-p (symbol-function sym)) - (byte-compile sym))) - (t (error "%S is not fbound" sym)))) - '(slime-extend-region-for-font-lock - slime-compute-region-for-font-lock - slime-search-directly-preceding-reader-conditional - slime-search-suppressed-forms - slime-beginning-of-tlf))) - -(cl-defun slime-initialize-lisp-buffer-for-test-suite - (&key (font-lock-magic t) (autodoc t)) - (let ((hook lisp-mode-hook)) - (unwind-protect - (progn - (set (make-local-variable 'slime-highlight-suppressed-forms) - font-lock-magic) - (setq lisp-mode-hook nil) - (lisp-mode) - (slime-mode 1) - (when (boundp 'slime-autodoc-mode) - (if autodoc - (slime-autodoc-mode 1) - (slime-autodoc-mode -1)))) - (setq lisp-mode-hook hook)))) - -(provide 'slime-fontifying-fu) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fuzzy.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fuzzy.el deleted file mode 100644 index b2f22f1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-fuzzy.el +++ /dev/null @@ -1,604 +0,0 @@ -(require 'slime) -(require 'slime-repl) -(require 'slime-c-p-c) -(require 'cl-lib) - -(define-slime-contrib slime-fuzzy - "Fuzzy symbol completion." - (:authors "Brian Downing " - "Tobias C. Rittweiler " - "Attila Lendvai ") - (:license "GPL") - (:swank-dependencies swank-fuzzy) - (:on-load - (define-key slime-mode-map "\C-c\M-i" 'slime-fuzzy-complete-symbol) - (when (featurep 'slime-repl) - (define-key slime-repl-mode-map "\C-c\M-i" - 'slime-fuzzy-complete-symbol)))) - -(defcustom slime-fuzzy-completion-in-place t - "When non-NIL the fuzzy symbol completion is done in place as -opposed to moving the point to the completion buffer." - :group 'slime-mode - :type 'boolean) - -(defcustom slime-fuzzy-completion-limit 300 - "Only return and present this many symbols from swank." - :group 'slime-mode - :type 'integer) - -(defcustom slime-fuzzy-completion-time-limit-in-msec 1500 - "Limit the time spent (given in msec) in swank while gathering -completions." - :group 'slime-mode - :type 'integer) - -(defcustom slime-when-complete-filename-expand nil - "Use comint-replace-by-expanded-filename instead of -comint-filename-completion to complete file names" - :group 'slime-mode - :type 'boolean) - - -(defvar slime-fuzzy-target-buffer nil - "The buffer that is the target of the completion activities.") -(defvar slime-fuzzy-saved-window-configuration nil - "The saved window configuration before the fuzzy completion -buffer popped up.") -(defvar slime-fuzzy-start nil - "The beginning of the completion slot in the target buffer. -This is a non-advancing marker.") -(defvar slime-fuzzy-end nil - "The end of the completion slot in the target buffer. -This is an advancing marker.") -(defvar slime-fuzzy-original-text nil - "The original text that was in the completion slot in the -target buffer. This is what is put back if completion is -aborted.") -(defvar slime-fuzzy-text nil - "The text that is currently in the completion slot in the -target buffer. If this ever doesn't match, the target buffer has -been modified and we abort without touching it.") -(defvar slime-fuzzy-first nil - "The position of the first completion in the completions buffer. -The descriptive text and headers are above this.") -(defvar slime-fuzzy-last nil - "The position of the last completion in the completions buffer. -If the time limit has exhausted during generation possible completion -choices inside SWANK, an indication is printed below this.") -(defvar slime-fuzzy-current-completion nil - "The current completion object. If this is the same before and -after point moves in the completions buffer, the text is not -replaced in the target for efficiency.") -(defvar slime-fuzzy-current-completion-overlay nil - "The overlay representing the current completion in the completion -buffer. This is used to hightlight the text.") - -;;;;;;; slime-target-buffer-fuzzy-completions-mode -;; NOTE: this mode has to be able to override key mappings in slime-mode - -(defvar slime-target-buffer-fuzzy-completions-map - (let ((map (make-sparse-keymap))) - (cl-labels ((def (keys command) - (unless (listp keys) - (setq keys (list keys))) - (dolist (key keys) - (define-key map key command)))) - (def `([remap keyboard-quit] - ,(kbd "C-g")) - 'slime-fuzzy-abort) - (def `([remap slime-fuzzy-indent-and-complete-symbol] - [remap slime-indent-and-complete-symbol] - ,(kbd "")) - 'slime-fuzzy-select-or-update-completions) - (def `([remap previous-line] - ,(kbd "")) - 'slime-fuzzy-prev) - (def `([remap next-line] - ,(kbd "")) - 'slime-fuzzy-next) - (def `([remap isearch-forward] - ,(kbd "C-s")) - 'slime-fuzzy-continue-isearch-in-fuzzy-buffer) - ;; some unconditional direct bindings - (def (list (kbd "") (kbd "RET") (kbd "") "(" ")" "[" "]") - 'slime-fuzzy-select-and-process-event-in-target-buffer)) - map) - "Keymap for slime-target-buffer-fuzzy-completions-mode. -This will override the key bindings in the target buffer -temporarily during completion.") - -;; Make sure slime-fuzzy-target-buffer-completions-mode's map is -;; before everything else. -(setf minor-mode-map-alist - (cl-stable-sort minor-mode-map-alist - (lambda (a b) - (eq a 'slime-fuzzy-target-buffer-completions-mode)) - :key #'car)) - -(defun slime-fuzzy-continue-isearch-in-fuzzy-buffer () - (interactive) - (select-window (get-buffer-window (slime-get-fuzzy-buffer))) - (call-interactively 'isearch-forward)) - -(define-minor-mode slime-fuzzy-target-buffer-completions-mode - "This minor mode is intented to override key bindings during -fuzzy completions in the target buffer. Most of the bindings will -do an implicit select in the completion window and let the -keypress be processed in the target buffer." - nil - nil - slime-target-buffer-fuzzy-completions-map) - -(add-to-list 'minor-mode-alist - '(slime-fuzzy-target-buffer-completions-mode - " Fuzzy Target Buffer Completions")) - -(defvar slime-fuzzy-completions-map - (let ((map (make-sparse-keymap))) - (cl-labels ((def (keys command) - (unless (listp keys) - (setq keys (list keys))) - (dolist (key keys) - (define-key map key command)))) - (def `([remap keyboard-quit] - "q" - ,(kbd "C-g")) - 'slime-fuzzy-abort) - (def `([remap previous-line] - "p" - "\M-p" - ,(kbd "")) - 'slime-fuzzy-prev) - (def `([remap next-line] - "n" - "\M-n" - ,(kbd "")) - 'slime-fuzzy-next) - (def "\d" 'scroll-down) - (def `([remap slime-fuzzy-indent-and-complete-symbol] - [remap slime-indent-and-complete-symbol] - ,(kbd "")) - 'slime-fuzzy-select) - (def (kbd "") 'slime-fuzzy-select/mouse) - (def `(,(kbd "RET") - ,(kbd "")) - 'slime-fuzzy-select)) - map) - "Keymap for slime-fuzzy-completions-mode when in the completion buffer.") - -(define-derived-mode slime-fuzzy-completions-mode - fundamental-mode "Fuzzy Completions" - "Major mode for presenting fuzzy completion results. - -When you run `slime-fuzzy-complete-symbol', the symbol token at -point is completed using the Fuzzy Completion algorithm; this -means that the token is taken as a sequence of characters and all -the various possibilities that this sequence could meaningfully -represent are offered as selectable choices, sorted by how well -they deem to be a match for the token. (For instance, the first -choice of completing on \"mvb\" would be \"multiple-value-bind\".) - -Therefore, a new buffer (*Fuzzy Completions*) will pop up that -contains the different completion choices. Simultaneously, a -special minor-mode will be temporarily enabled in the original -buffer where you initiated fuzzy completion (also called the -``target buffer'') in order to navigate through the *Fuzzy -Completions* buffer without leaving. - -With focus in *Fuzzy Completions*: - Type `n' and `p' (`UP', `DOWN') to navigate between completions. - Type `RET' or `TAB' to select the completion near point. - Type `q' to abort. - -With focus in the target buffer: - Type `UP' and `DOWN' to navigate between completions. - Type a character that does not constitute a symbol name - to insert the current choice and then that character (`(', `)', - `SPACE', `RET'.) Use `TAB' to simply insert the current choice. - Use C-g to abort. - -Alternatively, you can click on a completion to select it. - - -Complete listing of keybindings within the target buffer: - -\\\ -\\{slime-target-buffer-fuzzy-completions-map} - -Complete listing of keybindings with *Fuzzy Completions*: - -\\\ -\\{slime-fuzzy-completions-map}" - (use-local-map slime-fuzzy-completions-map) - (set (make-local-variable 'slime-fuzzy-current-completion-overlay) - (make-overlay (point) (point) nil t nil))) - -(defun slime-fuzzy-completions (prefix &optional default-package) - "Get the list of sorted completion objects from completing -`prefix' in `package' from the connected Lisp." - (let ((prefix (cl-etypecase prefix - (symbol (symbol-name prefix)) - (string prefix)))) - (slime-eval `(swank:fuzzy-completions ,prefix - ,(or default-package - (slime-current-package)) - :limit ,slime-fuzzy-completion-limit - :time-limit-in-msec - ,slime-fuzzy-completion-time-limit-in-msec)))) - -(defun slime-fuzzy-selected (prefix completion) - "Tell the connected Lisp that the user selected completion -`completion' as the completion for `prefix'." - (let ((no-properties (copy-sequence prefix))) - (set-text-properties 0 (length no-properties) nil no-properties) - (slime-eval `(swank:fuzzy-completion-selected ,no-properties - ',completion)))) - -(defun slime-fuzzy-indent-and-complete-symbol () - "Indent the current line and perform fuzzy symbol completion. First -indent the line. If indenting doesn't move point, complete the -symbol. If there's no symbol at the point, show the arglist for the -most recently enclosed macro or function." - (interactive) - (let ((pos (point))) - (unless (get-text-property (line-beginning-position) 'slime-repl-prompt) - (lisp-indent-line)) - (when (= pos (point)) - (cond ((save-excursion (re-search-backward "[^() \n\t\r]+\\=" nil t)) - (slime-fuzzy-complete-symbol)) - ((memq (char-before) '(?\t ?\ )) - (slime-echo-arglist)))))) - -(cl-defun slime-fuzzy-complete-symbol () - "Fuzzily completes the abbreviation at point into a symbol." - (interactive) - (when (save-excursion (re-search-backward "\"[^ \t\n]+\\=" nil t)) - (cl-return-from slime-fuzzy-complete-symbol - ;; don't add space after completion - (let ((comint-completion-addsuffix '("/" . ""))) - (if slime-when-complete-filename-expand - (comint-replace-by-expanded-filename) - ;; FIXME: use `comint-filename-completion' when dropping emacs23 - (funcall (if (>= emacs-major-version 24) - 'comint-filename-completion - 'comint-dynamic-complete-as-filename)))))) - (let* ((end (move-marker (make-marker) (slime-symbol-end-pos))) - (beg (move-marker (make-marker) (slime-symbol-start-pos))) - (prefix (buffer-substring-no-properties beg end))) - (cl-destructuring-bind (completion-set interrupted-p) - (slime-fuzzy-completions prefix) - (if (null completion-set) - (progn (slime-minibuffer-respecting-message - "Can't find completion for \"%s\"" prefix) - (ding) - (slime-fuzzy-done)) - (goto-char end) - (cond ((slime-length= completion-set 1) - ;; insert completed string - (insert-and-inherit (caar completion-set)) - (delete-region beg end) - (goto-char (+ beg (length (caar completion-set)))) - (slime-minibuffer-respecting-message "Sole completion") - (slime-fuzzy-done)) - ;; Incomplete - (t - (slime-fuzzy-choices-buffer completion-set interrupted-p - beg end) - (slime-minibuffer-respecting-message - "Complete but not unique"))))))) - - -(defun slime-get-fuzzy-buffer () - (get-buffer-create "*Fuzzy Completions*")) - -(defvar slime-fuzzy-explanation - "For help on how the use this buffer, see `slime-fuzzy-completions-mode'. - -Flags: boundp fboundp generic-function class macro special-operator package -\n" - "The explanation that gets inserted at the beginning of the -*Fuzzy Completions* buffer.") - -(defun slime-fuzzy-insert-completion-choice (completion max-length) - "Inserts the completion object `completion' as a formatted -completion choice into the current buffer, and mark it with the -proper text properties." - (cl-destructuring-bind (symbol-name score chunks classification-string) - completion - (let ((start (point)) - (end)) - (insert symbol-name) - (setq end (point)) - (dolist (chunk chunks) - (put-text-property (+ start (cl-first chunk)) - (+ start (cl-first chunk) - (length (cl-second chunk))) - 'face 'bold)) - (put-text-property start (point) 'mouse-face 'highlight) - (dotimes (i (- max-length (- end start))) - (insert " ")) - (insert (format " %s %s\n" - classification-string - score)) - (put-text-property start (point) 'completion completion)))) - -(defun slime-fuzzy-insert (text) - "Inserts `text' into the target buffer in the completion slot. -If the buffer has been modified in the meantime, abort the -completion process. Otherwise, update all completion variables -so that the new text is present." - (with-current-buffer slime-fuzzy-target-buffer - (cond - ((not (string-equal slime-fuzzy-text - (buffer-substring slime-fuzzy-start - slime-fuzzy-end))) - (slime-fuzzy-done) - (beep) - (message "Target buffer has been modified!")) - (t - (goto-char slime-fuzzy-start) - (delete-region slime-fuzzy-start slime-fuzzy-end) - (insert-and-inherit text) - (setq slime-fuzzy-text text) - (goto-char slime-fuzzy-end))))) - -(defun slime-minibuffer-p (buffer) - (if (featurep 'xemacs) - (eq buffer (window-buffer (minibuffer-window))) - (minibufferp buffer))) - -(defun slime-fuzzy-choices-buffer (completions interrupted-p start end) - "Creates (if neccessary), populates, and pops up the *Fuzzy -Completions* buffer with the completions from `completions' and -the completion slot in the current buffer bounded by `start' and -`end'. This saves the window configuration before popping the -buffer so that it can possibly be restored when the user is -done." - (let ((new-completion-buffer (not slime-fuzzy-target-buffer)) - (connection (slime-connection))) - (when new-completion-buffer - (setq slime-fuzzy-saved-window-configuration - (current-window-configuration))) - (slime-fuzzy-enable-target-buffer-completions-mode) - (setq slime-fuzzy-target-buffer (current-buffer)) - (setq slime-fuzzy-start (move-marker (make-marker) start)) - (setq slime-fuzzy-end (move-marker (make-marker) end)) - (set-marker-insertion-type slime-fuzzy-end t) - (setq slime-fuzzy-original-text (buffer-substring start end)) - (setq slime-fuzzy-text slime-fuzzy-original-text) - (slime-fuzzy-fill-completions-buffer completions interrupted-p) - (pop-to-buffer (slime-get-fuzzy-buffer)) - (slime-fuzzy-next) - (setq slime-buffer-connection connection) - (when new-completion-buffer - ;; Hook to nullify window-config restoration if the user changes - ;; the window configuration himself. - (when (boundp 'window-configuration-change-hook) - (add-hook 'window-configuration-change-hook - 'slime-fuzzy-window-configuration-change)) - (add-hook 'kill-buffer-hook 'slime-fuzzy-abort 'append t) - (set (make-local-variable 'cursor-type) nil) - (setq buffer-quit-function 'slime-fuzzy-abort)) ; M-Esc Esc - (when slime-fuzzy-completion-in-place - ;; switch back to the original buffer - (if (slime-minibuffer-p slime-fuzzy-target-buffer) - (select-window (minibuffer-window)) - (switch-to-buffer-other-window slime-fuzzy-target-buffer))))) - -(defun slime-fuzzy-fill-completions-buffer (completions interrupted-p) - "Erases and fills the completion buffer with the given completions." - (with-current-buffer (slime-get-fuzzy-buffer) - (setq buffer-read-only nil) - (erase-buffer) - (slime-fuzzy-completions-mode) - (insert slime-fuzzy-explanation) - (let ((max-length 12)) - (dolist (completion completions) - (setf max-length (max max-length (length (cl-first completion))))) - - (insert "Completion:") - (dotimes (i (- max-length 10)) (insert " ")) - ;; Flags: Score: - ;; ... ------- -------- - ;; bfgctmsp - (let* ((example-classification-string (cl-fourth (cl-first completions))) - (classification-length (length example-classification-string)) - (spaces (- classification-length (length "Flags:")))) - (insert "Flags:") - (dotimes (i spaces) (insert " ")) - (insert " Score:\n") - (dotimes (i max-length) (insert "-")) - (insert " ") - (dotimes (i classification-length) (insert "-")) - (insert " --------\n") - (setq slime-fuzzy-first (point))) - - (dolist (completion completions) - (setq slime-fuzzy-last (point)) ; will eventually become the last entry - (slime-fuzzy-insert-completion-choice completion max-length)) - - (when interrupted-p - (insert "...\n") - (insert "[Interrupted: time limit exhausted]")) - - (setq buffer-read-only t)) - (setq slime-fuzzy-current-completion - (caar completions)) - (goto-char 0))) - -(defun slime-fuzzy-enable-target-buffer-completions-mode () - "Store the target buffer's local map, so that we can restore it." - (unless slime-fuzzy-target-buffer-completions-mode -; (slime-log-event "Enabling target buffer completions mode") - (slime-fuzzy-target-buffer-completions-mode 1))) - -(defun slime-fuzzy-disable-target-buffer-completions-mode () - "Restores the target buffer's local map when completion is finished." - (when slime-fuzzy-target-buffer-completions-mode -; (slime-log-event "Disabling target buffer completions mode") - (slime-fuzzy-target-buffer-completions-mode 0))) - -(defun slime-fuzzy-insert-from-point () - "Inserts the completion that is under point in the completions -buffer into the target buffer. If the completion in question had -already been inserted, it does nothing." - (with-current-buffer (slime-get-fuzzy-buffer) - (let ((current-completion (get-text-property (point) 'completion))) - (when (and current-completion - (not (eq slime-fuzzy-current-completion - current-completion))) - (slime-fuzzy-insert - (cl-first (get-text-property (point) 'completion))) - (setq slime-fuzzy-current-completion - current-completion))))) - -(defun slime-fuzzy-post-command-hook () - "The post-command-hook for the *Fuzzy Completions* buffer. -This makes sure the completion slot in the target buffer matches -the completion that point is on in the completions buffer." - (condition-case err - (when slime-fuzzy-target-buffer - (slime-fuzzy-insert-from-point)) - (error - ;; Because this is called on the post-command-hook, we mustn't let - ;; errors propagate. - (message "Error in slime-fuzzy-post-command-hook: %S" err)))) - -(defun slime-fuzzy-next () - "Moves point directly to the next completion in the completions -buffer." - (interactive) - (with-current-buffer (slime-get-fuzzy-buffer) - (let ((point (next-single-char-property-change - (point) 'completion nil slime-fuzzy-last))) - (set-window-point (get-buffer-window (current-buffer)) point) - (goto-char point)) - (slime-fuzzy-highlight-current-completion))) - -(defun slime-fuzzy-prev () - "Moves point directly to the previous completion in the -completions buffer." - (interactive) - (with-current-buffer (slime-get-fuzzy-buffer) - (let ((point (previous-single-char-property-change - (point) - 'completion nil slime-fuzzy-first))) - (set-window-point (get-buffer-window (current-buffer)) point) - (goto-char point)) - (slime-fuzzy-highlight-current-completion))) - -(defun slime-fuzzy-highlight-current-completion () - "Highlights the current completion, -so that the user can see it on the screen." - (let ((pos (point))) - (when (overlayp slime-fuzzy-current-completion-overlay) - (move-overlay slime-fuzzy-current-completion-overlay - (point) (1- (search-forward " "))) - (overlay-put slime-fuzzy-current-completion-overlay - 'face 'secondary-selection)) - (goto-char pos))) - -(defun slime-fuzzy-abort () - "Aborts the completion process, setting the completions slot in -the target buffer back to its original contents." - (interactive) - (when slime-fuzzy-target-buffer - (slime-fuzzy-done))) - -(defun slime-fuzzy-select () - "Selects the current completion, making sure that it is inserted -into the target buffer. This tells the connected Lisp what completion -was selected." - (interactive) - (when slime-fuzzy-target-buffer - (with-current-buffer (slime-get-fuzzy-buffer) - (let ((completion (get-text-property (point) 'completion))) - (when completion - (slime-fuzzy-insert (cl-first completion)) - (slime-fuzzy-selected slime-fuzzy-original-text - completion) - (slime-fuzzy-done)))))) - -(defun slime-fuzzy-select-or-update-completions () - "If there were no changes since the last time fuzzy completion was started -this function will select the current completion. -Otherwise refreshes the completion list based on the changes made." - (interactive) -; (slime-log-event "Selecting or updating completions") - (if (string-equal slime-fuzzy-original-text - (buffer-substring slime-fuzzy-start - slime-fuzzy-end)) - (slime-fuzzy-select) - (slime-fuzzy-complete-symbol))) - -(defun slime-fuzzy-process-event-in-completions-buffer () - "Simply processes the event in the target buffer" - (interactive) - (with-current-buffer (slime-get-fuzzy-buffer) - (push last-input-event unread-command-events))) - -(defun slime-fuzzy-select-and-process-event-in-target-buffer () - "Selects the current completion, making sure that it is inserted -into the target buffer and processes the event in the target buffer." - (interactive) -; (slime-log-event "Selecting and processing event in target buffer") - (when slime-fuzzy-target-buffer - (let ((buff slime-fuzzy-target-buffer)) - (slime-fuzzy-select) - (with-current-buffer buff - (slime-fuzzy-disable-target-buffer-completions-mode) - (push last-input-event unread-command-events))))) - -(defun slime-fuzzy-select/mouse (event) - "Handle a mouse-2 click on a completion choice as if point were -on the completion choice and the slime-fuzzy-select command was -run." - (interactive "e") - (with-current-buffer (window-buffer (posn-window (event-end event))) - (save-excursion - (goto-char (posn-point (event-end event))) - (when (get-text-property (point) 'mouse-face) - (slime-fuzzy-insert-from-point) - (slime-fuzzy-select))))) - -(defun slime-fuzzy-done () - "Cleans up after the completion process. This removes all hooks, -and attempts to restore the window configuration. If this fails, -it just burys the completions buffer and leaves the window -configuration alone." - (when slime-fuzzy-target-buffer - (set-buffer slime-fuzzy-target-buffer) - (slime-fuzzy-disable-target-buffer-completions-mode) - (if (slime-fuzzy-maybe-restore-window-configuration) - (bury-buffer (slime-get-fuzzy-buffer)) - ;; We couldn't restore the windows, so just bury the fuzzy - ;; completions buffer and let something else fill it in. - (pop-to-buffer (slime-get-fuzzy-buffer)) - (bury-buffer)) - (if (slime-minibuffer-p slime-fuzzy-target-buffer) - (select-window (minibuffer-window)) - (pop-to-buffer slime-fuzzy-target-buffer)) - (goto-char slime-fuzzy-end) - (setq slime-fuzzy-target-buffer nil) - (remove-hook 'window-configuration-change-hook - 'slime-fuzzy-window-configuration-change))) - -(defun slime-fuzzy-maybe-restore-window-configuration () - "Restores the saved window configuration if it has not been -nullified." - (when (boundp 'window-configuration-change-hook) - (remove-hook 'window-configuration-change-hook - 'slime-fuzzy-window-configuration-change)) - (if (not slime-fuzzy-saved-window-configuration) - nil - (set-window-configuration slime-fuzzy-saved-window-configuration) - (setq slime-fuzzy-saved-window-configuration nil) - t)) - -(defun slime-fuzzy-window-configuration-change () - "Called on window-configuration-change-hook. Since the window -configuration was changed, we nullify our saved configuration." - (setq slime-fuzzy-saved-window-configuration nil)) - -(provide 'slime-fuzzy) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-highlight-edits.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-highlight-edits.el deleted file mode 100644 index 2a3f0a8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-highlight-edits.el +++ /dev/null @@ -1,81 +0,0 @@ -(require 'slime) -(require 'slime-parse) - -(define-slime-contrib slime-highlight-edits - "Highlight edited, i.e. not yet compiled, code." - (:authors "William Bland ") - (:license "GPL") - (:on-load (add-hook 'slime-mode-hook 'slime-activate-highlight-edits)) - (:on-unload (remove-hook 'slime-mode-hook 'slime-activate-highlight-edits))) - -(defun slime-activate-highlight-edits () - (slime-highlight-edits-mode 1)) - -(defface slime-highlight-edits-face - `((((class color) (background light)) - (:background "lightgray")) - (((class color) (background dark)) - (:background "dimgray")) - (t (:background "yellow"))) - "Face for displaying edit but not compiled code." - :group 'slime-mode-faces) - -(define-minor-mode slime-highlight-edits-mode - "Minor mode to highlight not-yet-compiled code." nil) - -(add-hook 'slime-highlight-edits-mode-on-hook - 'slime-highlight-edits-init-buffer) - -(add-hook 'slime-highlight-edits-mode-off-hook - 'slime-highlight-edits-reset-buffer) - -(defun slime-highlight-edits-init-buffer () - (make-local-variable 'after-change-functions) - (add-to-list 'after-change-functions - 'slime-highlight-edits) - (add-to-list 'slime-before-compile-functions - 'slime-highlight-edits-compile-hook)) - -(defun slime-highlight-edits-reset-buffer () - (setq after-change-functions - (remove 'slime-highlight-edits after-change-functions)) - (slime-remove-edits (point-min) (point-max))) - -;; FIXME: what's the LEN arg for? -(defun slime-highlight-edits (beg end &optional len) - (save-match-data - (when (and (slime-connected-p) - (not (slime-inside-comment-p)) - (not (slime-only-whitespace-p beg end))) - (let ((overlay (make-overlay beg end))) - (overlay-put overlay 'face 'slime-highlight-edits-face) - (overlay-put overlay 'slime-edit t))))) - -(defun slime-remove-edits (start end) - "Delete the existing Slime edit hilights in the current buffer." - (save-excursion - (goto-char start) - (while (< (point) end) - (dolist (o (overlays-at (point))) - (when (overlay-get o 'slime-edit) - (delete-overlay o))) - (goto-char (next-overlay-change (point)))))) - -(defun slime-highlight-edits-compile-hook (start end) - (when slime-highlight-edits-mode - (let ((start (save-excursion (goto-char start) - (skip-chars-backward " \t\n\r") - (point))) - (end (save-excursion (goto-char end) - (skip-chars-forward " \t\n\r") - (point)))) - (slime-remove-edits start end)))) - -(defun slime-only-whitespace-p (beg end) - "Contains the region from BEG to END only whitespace?" - (save-excursion - (goto-char beg) - (skip-chars-forward " \n\t\r" end) - (<= end (point)))) - -(provide 'slime-highlight-edits) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-hyperdoc.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-hyperdoc.el deleted file mode 100644 index 64de7ee..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-hyperdoc.el +++ /dev/null @@ -1,48 +0,0 @@ -(require 'slime) -(require 'url-http) -(require 'browse-url) -(eval-when-compile (require 'cl)) ; lexical-let - -(defvar slime-old-documentation-lookup-function - slime-documentation-lookup-function) - -(define-slime-contrib slime-hyperdoc - "Extensible C-c C-d h." - (:authors "Tobias C Rittweiler ") - (:license "GPL") - (:swank-dependencies swank-hyperdoc) - (:on-load - (setq slime-documentation-lookup-function 'slime-hyperdoc-lookup)) - (:on-unload - (setq slime-documentation-lookup-function - slime-old-documentation-lookup-function))) - -;;; TODO: `url-http-file-exists-p' is slow, make it optional behaviour. - -(defun slime-hyperdoc-lookup-rpc (symbol-name) - (slime-eval-async `(swank:hyperdoc ,symbol-name) - (lexical-let ((symbol-name symbol-name)) - #'(lambda (result) - (slime-log-event result) - (cl-loop with foundp = nil - for (doc-type . url) in result do - (when (and url (stringp url) - (let ((url-show-status nil)) - (url-http-file-exists-p url))) - (message "Visiting documentation for %s `%s'..." - (substring (symbol-name doc-type) 1) - symbol-name) - (browse-url url) - (setq foundp t)) - finally - (unless foundp - (error "Could not find documentation for `%s'." - symbol-name))))))) - -(defun slime-hyperdoc-lookup (symbol-name) - (interactive (list (slime-read-symbol-name "Symbol: "))) - (if (memq :hyperdoc (slime-lisp-features)) - (slime-hyperdoc-lookup-rpc symbol-name) - (slime-hyperspec-lookup symbol-name))) - -(provide 'slime-hyperdoc) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-indentation.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-indentation.el deleted file mode 100644 index 8e323e0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-indentation.el +++ /dev/null @@ -1,31 +0,0 @@ -(require 'slime) -(require 'slime-cl-indent) -(require 'cl-lib) - -(define-slime-contrib slime-indentation - "Contrib interfacing `slime-cl-indent' and SLIME." - (:swank-dependencies swank-indentation) - (:on-load - (setq common-lisp-current-package-function 'slime-current-package))) - -(defun slime-update-system-indentation (symbol indent packages) - (let ((list (gethash symbol common-lisp-system-indentation)) - (ok nil)) - (if (not list) - (puthash symbol (list (cons indent packages)) - common-lisp-system-indentation) - (dolist (spec list) - (cond ((equal (car spec) indent) - (dolist (p packages) - (unless (member p (cdr spec)) - (push p (cdr spec)))) - (setf ok t)) - (t - (setf (cdr spec) - (cl-set-difference (cdr spec) packages :test 'equal))))) - (unless ok - (puthash symbol (cons (cons indent packages) - list) - common-lisp-system-indentation))))) - -(provide 'slime-indentation) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-listener-hooks.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-listener-hooks.el deleted file mode 100644 index ec573da..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-listener-hooks.el +++ /dev/null @@ -1,11 +0,0 @@ -(require 'slime) -(require 'cl-lib) - -(define-slime-contrib slime-listener-hooks - "Enable slime integration in an application'w event loop" - (:authors "Alan Ruttenberg , R. Mattes ") - (:license "GPL") - (:slime-dependencies slime-repl) - (:swank-dependencies swank-listener-hooks)) - -(provide 'slime-listener-hooks) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-macrostep.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-macrostep.el deleted file mode 100644 index a9dff73..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-macrostep.el +++ /dev/null @@ -1,129 +0,0 @@ -;;; slime-macrostep.el -- fancy macro-expansion via macrostep.el - -;; Authors: Luís Oliveira -;; Jon Oddie " - "Jon Oddie ") - (:license "GPL") - (:swank-dependencies swank-macrostep) - (:on-load - (easy-menu-add-item slime-mode-map '(menu-bar SLIME Debugging) - ["Macro stepper..." macrostep-expand (slime-connected-p)] - "Create Trace Buffer") - (add-hook 'slime-mode-hook #'macrostep-slime-mode-hook) - (define-key slime-mode-map (kbd "C-c M-e") #'macrostep-expand) - (eval-after-load 'slime-repl - '(progn - (add-hook 'slime-repl-mode-hook #'macrostep-slime-mode-hook) - (define-key slime-repl-mode-map (kbd "C-c M-e") #'macrostep-expand))))) - -(defun macrostep-slime-mode-hook () - (setq macrostep-sexp-at-point-function #'macrostep-slime-sexp-at-point) - (setq macrostep-environment-at-point-function #'macrostep-slime-context) - (setq macrostep-expand-1-function #'macrostep-slime-expand-1) - (setq macrostep-print-function #'macrostep-slime-insert) - (setq macrostep-macro-form-p-function #'macrostep-slime-macro-form-p)) - -(defun macrostep-slime-sexp-at-point (&rest _ignore) - (slime-sexp-at-point)) - -(defun macrostep-slime-context () - (let (defun-start defun-end) - (save-excursion - (while - (condition-case nil - (progn (backward-up-list) t) - (scan-error nil))) - (setq defun-start (point)) - (setq defun-end (scan-sexps (point) 1))) - (list (buffer-substring-no-properties - defun-start (point)) - (buffer-substring-no-properties - (scan-sexps (point) 1) defun-end)))) - -(defun macrostep-slime-expand-1 (string context) - (slime-dcase - (slime-eval - `(swank-macrostep:macrostep-expand-1 - ,string ,macrostep-expand-compiler-macros ',context)) - ((:error error-message) - (error "%s" error-message)) - ((:ok expansion positions) - (list expansion positions)))) - -(defun macrostep-slime-insert (result _ignore) - "Insert RESULT at point, indenting to match the current column." - (cl-destructuring-bind (expansion positions) result - (let ((start (point)) - (column-offset (current-column))) - (insert expansion) - (macrostep-slime--propertize-macros start positions) - (indent-rigidly start (point) column-offset)))) - -(defun macrostep-slime--propertize-macros (start-offset positions) - "Put text properties on macro forms." - (dolist (position positions) - (cl-destructuring-bind (operator type start) - position - (let ((open-paren-position - (+ start-offset start))) - (put-text-property open-paren-position - (1+ open-paren-position) - 'macrostep-macro-start - t) - ;; this assumes that the operator starts right next to the - ;; opening parenthesis. We could probably be more robust. - (let ((op-start (1+ open-paren-position))) - (put-text-property op-start - (+ op-start (length operator)) - 'font-lock-face - (if (eq type :macro) - 'macrostep-macro-face - 'macrostep-compiler-macro-face))))))) - -(defun macrostep-slime-macro-form-p (string context) - (slime-dcase - (slime-eval - `(swank-macrostep:macro-form-p - ,string ,macrostep-expand-compiler-macros ',context)) - ((:error error-message) - (error "%s" error-message)) - ((:ok result) - result))) - - - -(provide 'slime-macrostep) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-mdot-fu.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-mdot-fu.el deleted file mode 100644 index ed2e96a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-mdot-fu.el +++ /dev/null @@ -1,31 +0,0 @@ -(require 'slime) -(require 'cl-lib) - -(define-slime-contrib slime-mdot-fu - "Making M-. work on local functions." - (:authors "Tobias C. Rittweiler ") - (:license "GPL") - (:slime-dependencies slime-enclosing-context) - (:on-load - (add-hook 'slime-edit-definition-hooks 'slime-edit-local-definition)) - (:on-unload - (remove-hook 'slime-edit-definition-hooks 'slime-edit-local-definition))) - - -(defun slime-edit-local-definition (name &optional where) - "Like `slime-edit-definition', but tries to find the definition -in a local function binding near point." - (interactive (list (slime-read-symbol-name "Name: "))) - (cl-multiple-value-bind (binding-name point) - (cl-multiple-value-call #'cl-some #'(lambda (binding-name point) - (when (cl-equalp binding-name name) - (cl-values binding-name point))) - (slime-enclosing-bound-names)) - (when (and binding-name point) - (slime-edit-definition-cont - `((,binding-name - ,(make-slime-buffer-location (buffer-name (current-buffer)) point))) - name - where)))) - -(provide 'slime-mdot-fu) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-media.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-media.el deleted file mode 100644 index cb839eb..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-media.el +++ /dev/null @@ -1,46 +0,0 @@ -(eval-and-compile - (require 'slime)) - -(define-slime-contrib slime-media - "Display things other than text in SLIME buffers" - (:authors "Christophe Rhodes ") - (:license "GPL") - (:slime-dependencies slime-repl) - (:swank-dependencies swank-media) - (:on-load - (add-hook 'slime-event-hooks 'slime-dispatch-media-event))) - -(defun slime-media-decode-image (image) - (mapcar (lambda (image) - (if (plist-get image :data) - (plist-put image :data (base64-decode-string (plist-get image :data))) - image)) - image)) - -(defun slime-dispatch-media-event (event) - (slime-dcase event - ((:write-image image string) - (let ((img (or (find-image (slime-media-decode-image image)) - (create-image image)))) - (slime-media-insert-image img string)) - t) - ((:popup-buffer bufname string mode) - (slime-with-popup-buffer (bufname :connection t :package t) - (when mode (funcall mode)) - (princ string) - (goto-char (point-min))) - t) - (t nil))) - -(defun slime-media-insert-image (image string &optional bol) - (with-current-buffer (slime-output-buffer) - (let ((marker (slime-repl-output-target-marker :repl-result))) - (goto-char marker) - (slime-propertize-region `(face slime-repl-result-face - rear-nonsticky (face)) - (insert-image image string)) - ;; Move the input-start marker after the REPL result. - (set-marker marker (point))) - (slime-repl-show-maximum-output))) - -(provide 'slime-media) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-mrepl.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-mrepl.el deleted file mode 100644 index d9ebc38..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-mrepl.el +++ /dev/null @@ -1,150 +0,0 @@ -;; An experimental implementation of multiple REPLs multiplexed over a -;; single Slime socket. M-x slime-new-mrepl creates a new REPL buffer. -;; -(require 'slime) -(require 'inferior-slime) ; inferior-slime-indent-lime -(require 'cl-lib) - -(define-slime-contrib slime-mrepl - "Multiple REPLs." - (:authors "Helmut Eller ") - (:license "GPL") - (:swank-dependencies swank-mrepl)) - -(require 'comint) - -(defvar slime-mrepl-remote-channel nil) -(defvar slime-mrepl-expect-sexp nil) - -(define-derived-mode slime-mrepl-mode comint-mode "mrepl" - ;; idea lifted from ielm - (unless (get-buffer-process (current-buffer)) - (let* ((process-connection-type nil) - (proc (start-process "mrepl (dummy)" (current-buffer) "hexl"))) - (set-process-query-on-exit-flag proc nil))) - (set (make-local-variable 'comint-use-prompt-regexp) nil) - (set (make-local-variable 'comint-inhibit-carriage-motion) t) - (set (make-local-variable 'comint-input-sender) 'slime-mrepl-input-sender) - (set (make-local-variable 'comint-output-filter-functions) nil) - (set (make-local-variable 'slime-mrepl-expect-sexp) t) - ;;(set (make-local-variable 'comint-get-old-input) 'ielm-get-old-input) - (set-syntax-table lisp-mode-syntax-table) - ) - -(slime-define-keys slime-mrepl-mode-map - ((kbd "RET") 'slime-mrepl-return) - ([return] 'slime-mrepl-return) - ;;((kbd "TAB") 'slime-indent-and-complete-symbol) - ((kbd "C-c C-b") 'slime-interrupt) - ((kbd "C-c C-c") 'slime-interrupt)) - -(defun slime-mrepl-process% () (get-buffer-process (current-buffer))) ;stupid -(defun slime-mrepl-mark () (process-mark (slime-mrepl-process%))) - -(defun slime-mrepl-insert (string) - (comint-output-filter (slime-mrepl-process%) string)) - -(slime-define-channel-type listener) - -(slime-define-channel-method listener :prompt (package prompt) - (with-current-buffer (slime-channel-get self 'buffer) - (slime-mrepl-prompt package prompt))) - -(defun slime-mrepl-prompt (package prompt) - (setf slime-buffer-package package) - (slime-mrepl-insert (format "%s%s> " - (cl-case (current-column) - (0 "") - (t "\n")) - prompt)) - (slime-mrepl-recenter)) - -(defun slime-mrepl-recenter () - (when (get-buffer-window) - (recenter -1))) - -(slime-define-channel-method listener :write-result (result) - (with-current-buffer (slime-channel-get self 'buffer) - (goto-char (point-max)) - (slime-mrepl-insert result))) - -(slime-define-channel-method listener :evaluation-aborted () - (with-current-buffer (slime-channel-get self 'buffer) - (goto-char (point-max)) - (slime-mrepl-insert "; Evaluation aborted\n"))) - -(slime-define-channel-method listener :write-string (string) - (slime-mrepl-write-string self string)) - -(defun slime-mrepl-write-string (self string) - (with-current-buffer (slime-channel-get self 'buffer) - (goto-char (slime-mrepl-mark)) - (slime-mrepl-insert string))) - -(slime-define-channel-method listener :set-read-mode (mode) - (with-current-buffer (slime-channel-get self 'buffer) - (cl-ecase mode - (:read (setq slime-mrepl-expect-sexp nil) - (message "[Listener is waiting for input]")) - (:eval (setq slime-mrepl-expect-sexp t))))) - -(defun slime-mrepl-return (&optional end-of-input) - (interactive "P") - (slime-check-connected) - (goto-char (point-max)) - (cond ((and slime-mrepl-expect-sexp - (or (slime-input-complete-p (slime-mrepl-mark) (point)) - end-of-input)) - (comint-send-input)) - ((not slime-mrepl-expect-sexp) - (unless end-of-input - (insert "\n")) - (comint-send-input t)) - (t - (insert "\n") - (inferior-slime-indent-line) - (message "[input not complete]"))) - (slime-mrepl-recenter)) - -(defun slime-mrepl-input-sender (proc string) - (slime-mrepl-send-string (substring-no-properties string))) - -(defun slime-mrepl-send-string (string &optional command-string) - (slime-mrepl-send `(:process ,string))) - -(defun slime-mrepl-send (msg) - "Send MSG to the remote channel." - (slime-send-to-remote-channel slime-mrepl-remote-channel msg)) - -(defun slime-new-mrepl () - "Create a new listener window." - (interactive) - (let ((channel (slime-make-channel slime-listener-channel-methods))) - (slime-eval-async - `(swank-mrepl:create-mrepl ,(slime-channel.id channel)) - (slime-rcurry - (lambda (result channel) - (cl-destructuring-bind (remote thread-id package prompt) result - (pop-to-buffer (generate-new-buffer (slime-buffer-name :mrepl))) - (slime-mrepl-mode) - (setq slime-current-thread thread-id) - (setq slime-buffer-connection (slime-connection)) - (set (make-local-variable 'slime-mrepl-remote-channel) remote) - (slime-channel-put channel 'buffer (current-buffer)) - (slime-channel-send channel `(:prompt ,package ,prompt)))) - channel)))) - -(defun slime-mrepl () - (let ((conn (slime-connection))) - (cl-find-if (lambda (x) - (with-current-buffer x - (and (eq major-mode 'slime-mrepl-mode) - (eq (slime-current-connection) conn)))) - (buffer-list)))) - -(def-slime-selector-method ?m - "First mrepl-buffer" - (or (slime-mrepl) - (error "No mrepl buffer (%s)" (slime-connection-name)))) - -(provide 'slime-mrepl) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-package-fu.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-package-fu.el deleted file mode 100644 index 00a1449..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-package-fu.el +++ /dev/null @@ -1,320 +0,0 @@ -(require 'slime) -(require 'slime-c-p-c) -(require 'slime-parse) - -(defvar slime-package-fu-init-undo-stack nil) - -(define-slime-contrib slime-package-fu - "Exporting/Unexporting symbols at point." - (:authors "Tobias C. Rittweiler ") - (:license "GPL") - (:swank-dependencies swank-package-fu) - (:on-load - (push `(progn (define-key slime-mode-map "\C-cx" - ',(lookup-key slime-mode-map "\C-cx"))) - slime-package-fu-init-undo-stack) - (define-key slime-mode-map "\C-cx" 'slime-export-symbol-at-point)) - (:on-unload - (while slime-c-p-c-init-undo-stack - (eval (pop slime-c-p-c-init-undo-stack))))) - -(defvar slime-package-file-candidates - (mapcar #'file-name-nondirectory - '("package.lisp" "packages.lisp" "pkgdcl.lisp" - "defpackage.lisp"))) - -(defvar slime-export-symbol-representation-function - #'(lambda (n) (format "#:%s" n))) - -(defvar slime-export-symbol-representation-auto t - "Determine automatically which style is used for symbols, #: or : -If it's mixed or no symbols are exported so far, -use `slime-export-symbol-representation-function'.") - -(defvar slime-export-save-file nil - "Save the package file after each automatic modification") - -(defvar slime-defpackage-regexp - "^(\\(cl:\\|common-lisp:\\)?defpackage\\>[ \t']*") - -(defun slime-find-package-definition-rpc (package) - (slime-eval `(swank:find-definition-for-thing - (swank::guess-package ,package)))) - -(defun slime-find-package-definition-regexp (package) - (save-excursion - (save-match-data - (goto-char (point-min)) - (cl-block nil - (while (re-search-forward slime-defpackage-regexp nil t) - (when (slime-package-equal package (slime-sexp-at-point)) - (backward-sexp) - (cl-return (make-slime-file-location (buffer-file-name) - (1- (point)))))))))) - -(defun slime-package-equal (designator1 designator2) - ;; First try to be lucky and compare the strings themselves (for the - ;; case when one of the designated packages isn't loaded in the - ;; image.) Then try to do it properly using the inferior Lisp which - ;; will also resolve nicknames for us &c. - (or (cl-equalp (slime-cl-symbol-name designator1) - (slime-cl-symbol-name designator2)) - (slime-eval `(swank:package= ,designator1 ,designator2)))) - -(defun slime-export-symbol (symbol package) - "Unexport `symbol' from `package' in the Lisp image." - (slime-eval `(swank:export-symbol-for-emacs ,symbol ,package))) - -(defun slime-unexport-symbol (symbol package) - "Export `symbol' from `package' in the Lisp image." - (slime-eval `(swank:unexport-symbol-for-emacs ,symbol ,package))) - - -(defun slime-find-possible-package-file (buffer-file-name) - (cl-labels ((file-name-subdirectory (dirname) - (expand-file-name - (concat (file-name-as-directory (slime-to-lisp-filename dirname)) - (file-name-as-directory "..")))) - (try (dirname) - (cl-dolist (package-file-name slime-package-file-candidates) - (let ((f (slime-to-lisp-filename - (concat dirname package-file-name)))) - (when (file-readable-p f) - (cl-return f)))))) - (when buffer-file-name - (let ((buffer-cwd (file-name-directory buffer-file-name))) - (or (try buffer-cwd) - (try (file-name-subdirectory buffer-cwd)) - (try (file-name-subdirectory - (file-name-subdirectory buffer-cwd)))))))) - -(defun slime-goto-package-source-definition (package) - "Tries to find the DEFPACKAGE form of `package'. If found, -places the cursor at the start of the DEFPACKAGE form." - (cl-labels ((try (location) - (when (slime-location-p location) - (slime-goto-source-location location) - t))) - (or (try (slime-find-package-definition-rpc package)) - (try (slime-find-package-definition-regexp package)) - (try (let ((package-file (slime-find-possible-package-file - (buffer-file-name)))) - (when package-file - (with-current-buffer (find-file-noselect package-file t) - (slime-find-package-definition-regexp package))))) - (error "Couldn't find source definition of package: %s" package)))) - -(defun slime-at-expression-p (pattern) - (when (ignore-errors - ;; at a list? - (= (point) (progn (down-list 1) - (backward-up-list 1) - (point)))) - (save-excursion - (down-list 1) - (slime-in-expression-p pattern)))) - -(defun slime-goto-next-export-clause () - ;; Assumes we're inside the beginning of a DEFPACKAGE form. - (let ((point)) - (save-excursion - (cl-block nil - (while (ignore-errors (slime-forward-sexp) t) - (skip-chars-forward " \n\t") - (when (slime-at-expression-p '(:export *)) - (setq point (point)) - (cl-return))))) - (if point - (goto-char point) - (error "No next (:export ...) clause found")))) - -(defun slime-search-exports-in-defpackage (symbol-name) - "Look if `symbol-name' is mentioned in one of the :EXPORT clauses." - ;; Assumes we're inside the beginning of a DEFPACKAGE form. - (cl-labels ((target-symbol-p (symbol) - (string-match-p (format "^\\(\\(#:\\)\\|:\\)?%s$" - (regexp-quote symbol-name)) - symbol))) - (save-excursion - (cl-block nil - (while (ignore-errors (slime-goto-next-export-clause) t) - (let ((clause-end (save-excursion (forward-sexp) (point)))) - (save-excursion - (while (search-forward symbol-name clause-end t) - (when (target-symbol-p (slime-symbol-at-point)) - (cl-return (if (slime-inside-string-p) - ;; Include the following " - (1+ (point)) - (point)))))))))))) - -(defun slime-export-symbols () - "Return a list of symbols inside :export clause of a defpackage." - ;; Assumes we're at the beginning of :export - (cl-labels ((read-sexp () - (ignore-errors - (forward-comment (point-max)) - (buffer-substring-no-properties - (point) (progn (forward-sexp) (point)))))) - (save-excursion - (cl-loop for sexp = (read-sexp) while sexp collect sexp)))) - -(defun slime-defpackage-exports () - "Return a list of symbols inside :export clause of a defpackage." - ;; Assumes we're inside the beginning of a DEFPACKAGE form. - (cl-labels ((normalize-name (name) - (if (string-prefix-p "\"" name) - (read name) - (replace-regexp-in-string "^\\(\\(#:\\)\\|:\\)" - "" name)))) - (save-excursion - (mapcar #'normalize-name - (cl-loop while (ignore-errors (slime-goto-next-export-clause) t) - do (down-list) (forward-sexp) - append (slime-export-symbols) - do (up-list) (backward-sexp)))))) - -(defun slime-symbol-exported-p (name symbols) - (cl-member name symbols :test 'cl-equalp)) - -(defun slime-frob-defpackage-form (current-package do-what symbols) - "Adds/removes `symbol' from the DEFPACKAGE form of `current-package' -depending on the value of `do-what' which can either be `:export', -or `:unexport'. - -Returns t if the symbol was added/removed. Nil if the symbol was -already exported/unexported." - (save-excursion - (slime-goto-package-source-definition current-package) - (down-list 1) ; enter DEFPACKAGE form - (forward-sexp) ; skip DEFPACKAGE symbol - ;; Don't or will fail if (:export ...) is immediately following - ;; (forward-sexp) ; skip package name - (let ((exported-symbols (slime-defpackage-exports)) - (symbols (if (consp symbols) - symbols - (list symbols))) - (number-of-actions 0)) - (cl-ecase do-what - (:export - (slime-add-export) - (dolist (symbol symbols) - (let ((symbol-name (slime-cl-symbol-name symbol))) - (unless (slime-symbol-exported-p symbol-name exported-symbols) - (cl-incf number-of-actions) - (slime-insert-export symbol-name))))) - (:unexport - (dolist (symbol symbols) - (let ((symbol-name (slime-cl-symbol-name symbol))) - (when (slime-symbol-exported-p symbol-name exported-symbols) - (slime-remove-export symbol-name) - (cl-incf number-of-actions)))))) - (when slime-export-save-file - (save-buffer)) - number-of-actions))) - -(defun slime-add-export () - (let (point) - (save-excursion - (while (ignore-errors (slime-goto-next-export-clause) t) - (setq point (point)))) - (cond (point - (goto-char point) - (down-list) - (slime-end-of-list)) - (t - (slime-end-of-list) - (unless (looking-back "^\\s-*") - (newline-and-indent)) - (insert "(:export ") - (save-excursion (insert ")")))))) - -(defun slime-determine-symbol-style () - ;; Assumes we're inside :export - (save-excursion - (slime-beginning-of-list) - (slime-forward-sexp) - (let ((symbols (slime-export-symbols))) - (cond ((null symbols) - slime-export-symbol-representation-function) - ((cl-every (lambda (x) - (string-match "^:" x)) - symbols) - (lambda (n) (format ":%s" n))) - ((cl-every (lambda (x) - (string-match "^#:" x)) - symbols) - (lambda (n) (format "#:%s" n))) - ((cl-every (lambda (x) - (string-prefix-p "\"" x)) - symbols) - (lambda (n) (prin1-to-string (upcase (substring-no-properties n))))) - (t - slime-export-symbol-representation-function))))) - -(defun slime-format-symbol-for-defpackage (symbol-name) - (funcall (if slime-export-symbol-representation-auto - (slime-determine-symbol-style) - slime-export-symbol-representation-function) - symbol-name)) - -(defun slime-insert-export (symbol-name) - ;; Assumes we're at the inside :export after the last symbol - (let ((symbol-name (slime-format-symbol-for-defpackage symbol-name))) - (unless (looking-back "^\\s-*") - (newline-and-indent)) - (insert symbol-name))) - -(defun slime-remove-export (symbol-name) - ;; Assumes we're inside the beginning of a DEFPACKAGE form. - (let ((point)) - (while (setq point (slime-search-exports-in-defpackage symbol-name)) - (save-excursion - (goto-char point) - (backward-sexp) - (delete-region (point) point) - (beginning-of-line) - (when (looking-at "^\\s-*$") - (join-line) - (delete-trailing-whitespace (point) (line-end-position))))))) - -(defun slime-export-symbol-at-point () - "Add the symbol at point to the defpackage source definition -belonging to the current buffer-package. With prefix-arg, remove -the symbol again. Additionally performs an EXPORT/UNEXPORT of the -symbol in the Lisp image if possible." - (interactive) - (let ((package (slime-current-package)) - (symbol (slime-symbol-at-point))) - (unless symbol (error "No symbol at point.")) - (cond (current-prefix-arg - (if (cl-plusp (slime-frob-defpackage-form package :unexport symbol)) - (message "Symbol `%s' no longer exported form `%s'" - symbol package) - (message "Symbol `%s' is not exported from `%s'" - symbol package)) - (slime-unexport-symbol symbol package)) - (t - (if (cl-plusp (slime-frob-defpackage-form package :export symbol)) - (message "Symbol `%s' now exported from `%s'" - symbol package) - (message "Symbol `%s' already exported from `%s'" - symbol package)) - (slime-export-symbol symbol package))))) - -(defun slime-export-class (name) - "Export acessors, constructors, etc. associated with a structure or a class" - (interactive (list (slime-read-from-minibuffer "Export structure named: " - (slime-symbol-at-point)))) - (let* ((package (slime-current-package)) - (symbols (slime-eval `(swank:export-structure ,name ,package)))) - (message "%s symbols exported from `%s'" - (slime-frob-defpackage-form package :export symbols) - package))) - -(defalias 'slime-export-structure 'slime-export-class) - -(provide 'slime-package-fu) - -;; Local Variables: -;; indent-tabs-mode: nil -;; End: diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-parse.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-parse.el deleted file mode 100644 index ed81eb3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-parse.el +++ /dev/null @@ -1,358 +0,0 @@ -(require 'slime) -(require 'cl-lib) - -(define-slime-contrib slime-parse - "Utility contrib containg functions to parse forms in a buffer." - (:authors "Matthias Koeppe " - "Tobias C. Rittweiler ") - (:license "GPL")) - -(defun slime-parse-form-until (limit form-suffix) - "Parses form from point to `limit'." - ;; For performance reasons, this function does not use recursion. - (let ((todo (list (point))) ; stack of positions - (sexps) ; stack of expressions - (cursexp) - (curpos) - (depth 1)) ; This function must be called from the - ; start of the sexp to be parsed. - (while (and (setq curpos (pop todo)) - (progn - (goto-char curpos) - ;; (Here we also move over suppressed - ;; reader-conditionalized code! Important so CL-side - ;; of autodoc won't see that garbage.) - (ignore-errors (slime-forward-cruft)) - (< (point) limit))) - (setq cursexp (pop sexps)) - (cond - ;; End of an sexp? - ((or (looking-at "\\s)") (eolp)) - (cl-decf depth) - (push (nreverse cursexp) (car sexps))) - ;; Start of a new sexp? - ((looking-at "\\s'*@*\\s(") - (let ((subpt (match-end 0))) - (ignore-errors - (forward-sexp) - ;; (In case of error, we're at an incomplete sexp, and - ;; nothing's left todo after it.) - (push (point) todo)) - (push cursexp sexps) - (push subpt todo) ; to descend into new sexp - (push nil sexps) - (cl-incf depth))) - ;; In mid of an sexp.. - (t - (let ((pt1 (point)) - (pt2 (condition-case e - (progn (forward-sexp) (point)) - (scan-error - (cl-fourth e))))) ; end of sexp - (push (buffer-substring-no-properties pt1 pt2) cursexp) - (push pt2 todo) - (push cursexp sexps))))) - (when sexps - (setf (car sexps) (cl-nreconc form-suffix (car sexps))) - (while (> depth 1) - (push (nreverse (pop sexps)) (car sexps)) - (cl-decf depth)) - (nreverse (car sexps))))) - -(defun slime-compare-char-syntax (get-char-fn syntax &optional unescaped) - "Returns t if the character that `get-char-fn' yields has -characer syntax of `syntax'. If `unescaped' is true, it's ensured -that the character is not escaped." - (let ((char (funcall get-char-fn (point))) - (char-before (funcall get-char-fn (1- (point))))) - (if (and char (eq (char-syntax char) (aref syntax 0))) - (if unescaped - (or (null char-before) - (not (eq (char-syntax char-before) ?\\))) - t) - nil))) - -(defconst slime-cursor-marker 'swank::%cursor-marker%) - -(defun slime-parse-form-upto-point (&optional max-levels) - (save-restriction - ;; Don't parse more than 500 lines before point, so we don't spend - ;; too much time. NB. Make sure to go to beginning of line, and - ;; not possibly anywhere inside comments or strings. - (narrow-to-region (line-beginning-position -500) (point-max)) - (save-excursion - (let ((suffix (list slime-cursor-marker))) - (cond ((slime-compare-char-syntax #'char-after "(" t) - ;; We're at the start of some expression, so make sure - ;; that SWANK::%CURSOR-MARKER% will come after that - ;; expression. If the expression is not balanced, make - ;; still sure that the marker does *not* come directly - ;; after the preceding expression. - (or (ignore-errors (forward-sexp) t) - (push "" suffix))) - ((or (bolp) (slime-compare-char-syntax #'char-before " " t)) - ;; We're after some expression, so we have to make sure - ;; that %CURSOR-MARKER% does *not* come directly after - ;; that expression. - (push "" suffix)) - ((slime-compare-char-syntax #'char-before "(" t) - ;; We're directly after an opening parenthesis, so we - ;; have to make sure that something comes before - ;; %CURSOR-MARKER%. - (push "" suffix)) - (t - ;; We're at a symbol, so make sure we get the whole symbol. - (slime-end-of-symbol))) - (let ((pt (point))) - (ignore-errors (up-list (if max-levels (- max-levels) -5))) - (ignore-errors (down-list)) - (slime-parse-form-until pt suffix)))))) - -(require 'bytecomp) - -(mapc (lambda (sym) - (cond ((fboundp sym) - (unless (byte-code-function-p (symbol-function sym)) - (byte-compile sym))) - (t (error "%S is not fbound" sym)))) - '(slime-parse-form-upto-point - slime-parse-form-until - slime-compare-char-syntax)) - -;;;; Test cases -(defun slime-extract-context () - "Parse the context for the symbol at point. -Nil is returned if there's no symbol at point. Otherwise we detect -the following cases (the . shows the point position): - - (defun n.ame (...) ...) -> (:defun name) - (defun (setf n.ame) (...) ...) -> (:defun (setf name)) - (defmethod n.ame (...) ...) -> (:defmethod name (...)) - (defun ... (...) (labels ((n.ame (...) -> (:labels (:defun ...) name) - (defun ... (...) (flet ((n.ame (...) -> (:flet (:defun ...) name) - (defun ... (...) ... (n.ame ...) ...) -> (:call (:defun ...) name) - (defun ... (...) ... (setf (n.ame ...) -> (:call (:defun ...) (setf name)) - - (defmacro n.ame (...) ...) -> (:defmacro name) - (defsetf n.ame (...) ...) -> (:defsetf name) - (define-setf-expander n.ame (...) ...) -> (:define-setf-expander name) - (define-modify-macro n.ame (...) ...) -> (:define-modify-macro name) - (define-compiler-macro n.ame (...) ...) -> (:define-compiler-macro name) - (defvar n.ame (...) ...) -> (:defvar name) - (defparameter n.ame ...) -> (:defparameter name) - (defconstant n.ame ...) -> (:defconstant name) - (defclass n.ame ...) -> (:defclass name) - (defstruct n.ame ...) -> (:defstruct name) - (defpackage n.ame ...) -> (:defpackage name) -For other contexts we return the symbol at point." - (let ((name (slime-symbol-at-point))) - (if name - (let ((symbol (read name))) - (or (progn ;;ignore-errors - (slime-parse-context symbol)) - symbol))))) - -(defun slime-parse-context (name) - (save-excursion - (cond ((slime-in-expression-p '(defun *)) `(:defun ,name)) - ((slime-in-expression-p '(defmacro *)) `(:defmacro ,name)) - ((slime-in-expression-p '(defgeneric *)) `(:defgeneric ,name)) - ((slime-in-expression-p '(setf *)) - ;;a setf-definition, but which? - (backward-up-list 1) - (slime-parse-context `(setf ,name))) - ((slime-in-expression-p '(defmethod *)) - (unless (looking-at "\\s ") - (forward-sexp 1)) ; skip over the methodname - (let (qualifiers arglist) - (cl-loop for e = (read (current-buffer)) - until (listp e) do (push e qualifiers) - finally (setq arglist e)) - `(:defmethod ,name ,@qualifiers - ,(slime-arglist-specializers arglist)))) - ((and (symbolp name) - (slime-in-expression-p `(,name))) - ;; looks like a regular call - (let ((toplevel (ignore-errors (slime-parse-toplevel-form)))) - (cond ((slime-in-expression-p `(setf (*))) ;a setf-call - (if toplevel - `(:call ,toplevel (setf ,name)) - `(setf ,name))) - ((not toplevel) - name) - ((slime-in-expression-p `(labels ((*)))) - `(:labels ,toplevel ,name)) - ((slime-in-expression-p `(flet ((*)))) - `(:flet ,toplevel ,name)) - (t - `(:call ,toplevel ,name))))) - ((slime-in-expression-p '(define-compiler-macro *)) - `(:define-compiler-macro ,name)) - ((slime-in-expression-p '(define-modify-macro *)) - `(:define-modify-macro ,name)) - ((slime-in-expression-p '(define-setf-expander *)) - `(:define-setf-expander ,name)) - ((slime-in-expression-p '(defsetf *)) - `(:defsetf ,name)) - ((slime-in-expression-p '(defvar *)) `(:defvar ,name)) - ((slime-in-expression-p '(defparameter *)) `(:defparameter ,name)) - ((slime-in-expression-p '(defconstant *)) `(:defconstant ,name)) - ((slime-in-expression-p '(defclass *)) `(:defclass ,name)) - ((slime-in-expression-p '(defpackage *)) `(:defpackage ,name)) - ((slime-in-expression-p '(defstruct *)) - `(:defstruct ,(if (consp name) - (car name) - name))) - (t - name)))) - - -(defun slime-in-expression-p (pattern) - "A helper function to determine the current context. -The pattern can have the form: - pattern ::= () ;matches always - | (*) ;matches inside a list - | ( ) ;matches if the first element in - ; the current list is and - ; if matches. - | (()) ;matches if we are in a nested list." - (save-excursion - (let ((path (reverse (slime-pattern-path pattern)))) - (cl-loop for p in path - always (ignore-errors - (cl-etypecase p - (symbol (slime-beginning-of-list) - (eq (read (current-buffer)) p)) - (number (backward-up-list p) - t))))))) - -(defun slime-pattern-path (pattern) - ;; Compute the path to the * in the pattern to make matching - ;; easier. The path is a list of symbols and numbers. A number - ;; means "(down-list )" and a symbol "(look-at )") - (if (null pattern) - '() - (cl-etypecase (car pattern) - ((member *) '()) - (symbol (cons (car pattern) (slime-pattern-path (cdr pattern)))) - (cons (cons 1 (slime-pattern-path (car pattern))))))) - -(defun slime-beginning-of-list (&optional up) - "Move backward to the beginning of the current expression. -Point is placed before the first expression in the list." - (backward-up-list (or up 1)) - (down-list 1) - (skip-syntax-forward " ")) - -(defun slime-end-of-list (&optional up) - (backward-up-list (or up 1)) - (forward-list 1) - (down-list -1)) - -(defun slime-parse-toplevel-form () - (ignore-errors ; (foo) - (save-excursion - (goto-char (car (slime-region-for-defun-at-point))) - (down-list 1) - (forward-sexp 1) - (slime-parse-context (read (current-buffer)))))) - -(defun slime-arglist-specializers (arglist) - (cond ((or (null arglist) - (member (cl-first arglist) '(&optional &key &rest &aux))) - (list)) - ((consp (cl-first arglist)) - (cons (cl-second (cl-first arglist)) - (slime-arglist-specializers (cl-rest arglist)))) - (t - (cons 't - (slime-arglist-specializers (cl-rest arglist)))))) - -(defun slime-definition-at-point (&optional only-functional) - "Return object corresponding to the definition at point." - (let ((toplevel (slime-parse-toplevel-form))) - (if (or (symbolp toplevel) - (and only-functional - (not (member (car toplevel) - '(:defun :defgeneric :defmethod - :defmacro :define-compiler-macro))))) - (error "Not in a definition") - (slime-dcase toplevel - (((:defun :defgeneric) symbol) - (format "#'%s" symbol)) - (((:defmacro :define-modify-macro) symbol) - (format "(macro-function '%s)" symbol)) - ((:define-compiler-macro symbol) - (format "(compiler-macro-function '%s)" symbol)) - ((:defmethod symbol &rest args) - (declare (ignore args)) - (format "#'%s" symbol)) - (((:defparameter :defvar :defconstant) symbol) - (format "'%s" symbol)) - (((:defclass :defstruct) symbol) - (format "(find-class '%s)" symbol)) - ((:defpackage symbol) - (format "(or (find-package '%s) (error \"Package %s not found\"))" - symbol symbol)) - (t - (error "Not in a definition")))))) - -(defsubst slime-current-parser-state () - ;; `syntax-ppss' does not save match data as it invokes - ;; `beginning-of-defun' implicitly which does not save match - ;; data. This issue has been reported to the Emacs maintainer on - ;; Feb27. - (syntax-ppss)) - -(defun slime-inside-string-p () - (nth 3 (slime-current-parser-state))) - -(defun slime-inside-comment-p () - (nth 4 (slime-current-parser-state))) - -(defun slime-inside-string-or-comment-p () - (let ((state (slime-current-parser-state))) - (or (nth 3 state) (nth 4 state)))) - -;;; The following two functions can be handy when inspecting -;;; source-location while debugging `M-.'. -;;; -(defun slime-current-tlf-number () - "Return the current toplevel number." - (interactive) - (let ((original-pos (car (slime-region-for-defun-at-point))) - (n 0)) - (save-excursion - ;; We use this and no repeated `beginning-of-defun's to get - ;; reader conditionals right. - (goto-char (point-min)) - (while (progn (slime-forward-sexp) - (< (point) original-pos)) - (cl-incf n))) - n)) - -;;; This is similiar to `slime-enclosing-form-paths' in the -;;; `slime-parse' contrib except that this does not do any duck-tape -;;; parsing, and gets reader conditionals right. -(defun slime-current-form-path () - "Returns the path from the beginning of the current toplevel -form to the atom at point, or nil if we're in front of a tlf." - (interactive) - (let ((source-path nil)) - (save-excursion - ;; Moving forward to get reader conditionals right. - (cl-loop for inner-pos = (point) - for outer-pos = (cl-nth-value 1 (slime-current-parser-state)) - while outer-pos do - (goto-char outer-pos) - (unless (eq (char-before) ?#) ; when at #(...) continue. - (forward-char) - (let ((n 0)) - (while (progn (slime-forward-sexp) - (< (point) inner-pos)) - (cl-incf n)) - (push n source-path) - (goto-char outer-pos))))) - source-path)) - -(provide 'slime-parse) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-presentation-streams.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-presentation-streams.el deleted file mode 100644 index 786c549..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-presentation-streams.el +++ /dev/null @@ -1,18 +0,0 @@ -(eval-and-compile - (require 'slime)) - -(define-slime-contrib slime-presentation-streams - "Streams that allow attaching object identities to portions of - output." - (:authors "Alan Ruttenberg " - "Matthias Koeppe " - "Helmut Eller ") - (:license "GPL") - (:on-load - (add-hook 'slime-connected-hook 'slime-presentation-streams-on-connected)) - (:swank-dependencies swank-presentation-streams)) - -(defun slime-presentation-streams-on-connected () - (slime-eval `(swank:init-presentation-streams))) - -(provide 'slime-presentation-streams) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-presentations.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-presentations.el deleted file mode 100644 index 229bf8a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-presentations.el +++ /dev/null @@ -1,872 +0,0 @@ -(require 'slime) -(require 'bridge) -(require 'cl-lib) -(eval-when-compile - (require 'cl)) - -(define-slime-contrib slime-presentations - "Imitate LispM presentations." - (:authors "Alan Ruttenberg " - "Matthias Koeppe ") - (:license "GPL") - (:slime-dependencies slime-repl) - (:swank-dependencies swank-presentations) - (:on-load - (add-hook 'slime-repl-mode-hook - (lambda () - ;; Respect the syntax text properties of presentation. - (set (make-local-variable 'parse-sexp-lookup-properties) t) - (add-hook 'after-change-functions - 'slime-after-change-function 'append t))) - (add-hook 'slime-event-hooks 'slime-dispatch-presentation-event) - (setq slime-write-string-function 'slime-presentation-write) - (add-hook 'slime-connected-hook 'slime-presentations-on-connected) - (add-hook 'slime-repl-return-hooks 'slime-presentation-on-return-pressed) - (add-hook 'slime-repl-current-input-hooks 'slime-presentation-current-input) - (add-hook 'slime-open-stream-hooks 'slime-presentation-on-stream-open) - (add-hook 'slime-repl-clear-buffer-hook 'slime-clear-presentations) - (add-hook 'slime-edit-definition-hooks 'slime-edit-presentation) - (setq sldb-insert-frame-variable-value-function - 'slime-presentation-sldb-insert-frame-variable-value) - (slime-presentation-init-keymaps) - (slime-presentation-add-easy-menu))) - -;; To get presentations in the inspector as well, add this to your -;; init file. -;; -;; (eval-after-load 'slime-presentations -;; '(setq slime-inspector-insert-ispec-function -;; 'slime-presentation-inspector-insert-ispec)) -;; -(defface slime-repl-output-mouseover-face - '((t (:box (:line-width 1 :color "black" :style released-button) - :inherit slime-repl-inputed-output-face))) - "Face for Lisp output in the SLIME REPL, when the mouse hovers over it" - :group 'slime-repl) - -(defface slime-repl-inputed-output-face - '((((class color) (background light)) (:foreground "Red")) - (((class color) (background dark)) (:foreground "Red")) - (t (:slant italic))) - "Face for the result of an evaluation in the SLIME REPL." - :group 'slime-repl) - -;; FIXME: This conditional is not right - just used because the code -;; here does not work in XEmacs. -(when (boundp 'text-property-default-nonsticky) - (pushnew '(slime-repl-presentation . t) text-property-default-nonsticky - :test 'equal) - (pushnew '(slime-repl-result-face . t) text-property-default-nonsticky - :test 'equal)) - -(make-variable-buffer-local - (defvar slime-presentation-start-to-point (make-hash-table))) - -(defun slime-mark-presentation-start (id &optional target) - "Mark the beginning of a presentation with the given ID. -TARGET can be nil (regular process output) or :repl-result." - (setf (gethash id slime-presentation-start-to-point) - ;; We use markers because text can also be inserted before this presentation. - ;; (Output arrives while we are writing presentations within REPL results.) - (copy-marker (slime-repl-output-target-marker target) nil))) - -(defun slime-mark-presentation-start-handler (process string) - (if (and string (string-match "<\\([-0-9]+\\)" string)) - (let* ((match (substring string (match-beginning 1) (match-end 1))) - (id (car (read-from-string match)))) - (slime-mark-presentation-start id)))) - -(defun slime-mark-presentation-end (id &optional target) - "Mark the end of a presentation with the given ID. -TARGET can be nil (regular process output) or :repl-result." - (let ((start (gethash id slime-presentation-start-to-point))) - (remhash id slime-presentation-start-to-point) - (when start - (let* ((marker (slime-repl-output-target-marker target)) - (buffer (and marker (marker-buffer marker)))) - (with-current-buffer buffer - (let ((end (marker-position marker))) - (slime-add-presentation-properties start end - id nil))))))) - -(defun slime-mark-presentation-end-handler (process string) - (if (and string (string-match ">\\([-0-9]+\\)" string)) - (let* ((match (substring string (match-beginning 1) (match-end 1))) - (id (car (read-from-string match)))) - (slime-mark-presentation-end id)))) - -(cl-defstruct slime-presentation text id) - -(defvar slime-presentation-syntax-table - (let ((table (copy-syntax-table lisp-mode-syntax-table))) - ;; We give < and > parenthesis syntax, so that #< ... > is treated - ;; as a balanced expression. This allows to use C-M-k, C-M-SPC, - ;; etc. to deal with a whole presentation. (For Lisp mode, this - ;; is not desirable, since we do not wish to get a mismatched - ;; paren highlighted everytime we type < or >.) - (modify-syntax-entry ?< "(>" table) - (modify-syntax-entry ?> ")<" table) - table) - "Syntax table for presentations.") - -(defun slime-add-presentation-properties (start end id result-p) - "Make the text between START and END a presentation with ID. -RESULT-P decides whether a face for a return value or output text is used." - (let* ((text (buffer-substring-no-properties start end)) - (presentation (make-slime-presentation :text text :id id))) - (let ((inhibit-modification-hooks t)) - (add-text-properties start end - `(modification-hooks (slime-after-change-function) - insert-in-front-hooks (slime-after-change-function) - insert-behind-hooks (slime-after-change-function) - syntax-table ,slime-presentation-syntax-table - rear-nonsticky t)) - ;; Use the presentation as the key of a text property - (case (- end start) - (0) - (1 - (add-text-properties start end - `(slime-repl-presentation ,presentation - ,presentation :start-and-end))) - (t - (add-text-properties start (1+ start) - `(slime-repl-presentation ,presentation - ,presentation :start)) - (when (> (- end start) 2) - (add-text-properties (1+ start) (1- end) - `(,presentation :interior))) - (add-text-properties (1- end) end - `(slime-repl-presentation ,presentation - ,presentation :end)))) - ;; Also put an overlay for the face and the mouse-face. This enables - ;; highlighting of nested presentations. However, overlays get lost - ;; when we copy a presentation; their removal is also not undoable. - ;; In these cases the mouse-face text properties need to take over --- - ;; but they do not give nested highlighting. - (slime-ensure-presentation-overlay start end presentation)))) - -(defvar slime-presentation-map (make-sparse-keymap)) - -(defun slime-ensure-presentation-overlay (start end presentation) - (unless (cl-find presentation (overlays-at start) - :key (lambda (overlay) - (overlay-get overlay 'slime-repl-presentation))) - (let ((overlay (make-overlay start end (current-buffer) t nil))) - (overlay-put overlay 'slime-repl-presentation presentation) - (overlay-put overlay 'mouse-face 'slime-repl-output-mouseover-face) - (overlay-put overlay 'help-echo - (if (eq major-mode 'slime-repl-mode) - "mouse-2: copy to input; mouse-3: menu" - "mouse-2: inspect; mouse-3: menu")) - (overlay-put overlay 'face 'slime-repl-inputed-output-face) - (overlay-put overlay 'keymap slime-presentation-map)))) - -(defun slime-remove-presentation-properties (from to presentation) - (let ((inhibit-read-only t)) - (remove-text-properties from to - `(,presentation t syntax-table t rear-nonsticky t)) - (when (eq (get-text-property from 'slime-repl-presentation) presentation) - (remove-text-properties from (1+ from) `(slime-repl-presentation t))) - (when (eq (get-text-property (1- to) 'slime-repl-presentation) presentation) - (remove-text-properties (1- to) to `(slime-repl-presentation t))) - (dolist (overlay (overlays-at from)) - (when (eq (overlay-get overlay 'slime-repl-presentation) presentation) - (delete-overlay overlay))))) - -(defun slime-insert-presentation (string output-id &optional rectangle) - "Insert STRING in current buffer and mark it as a presentation -corresponding to OUTPUT-ID. If RECTANGLE is true, indent multi-line -strings to line up below the current point." - (cl-labels ((insert-it () - (if rectangle - (slime-insert-indented string) - (insert string)))) - (let ((start (point))) - (insert-it) - (slime-add-presentation-properties start (point) output-id t)))) - -(defun slime-presentation-whole-p (presentation start end &optional object) - (let ((object (or object (current-buffer)))) - (string= (etypecase object - (buffer (with-current-buffer object - (buffer-substring-no-properties start end))) - (string (substring-no-properties object start end))) - (slime-presentation-text presentation)))) - -(defun slime-presentations-around-point (point &optional object) - (let ((object (or object (current-buffer)))) - (loop for (key value . rest) on (text-properties-at point object) by 'cddr - when (slime-presentation-p key) - collect key))) - -(defun slime-presentation-start-p (tag) - (memq tag '(:start :start-and-end))) - -(defun slime-presentation-stop-p (tag) - (memq tag '(:end :start-and-end))) - -(cl-defun slime-presentation-start (point presentation - &optional (object (current-buffer))) - "Find start of `presentation' at `point' in `object'. -Return buffer index and whether a start-tag was found." - (let* ((this-presentation (get-text-property point presentation object))) - (while (not (slime-presentation-start-p this-presentation)) - (let ((change-point (previous-single-property-change - point presentation object (point-min)))) - (unless change-point - (return-from slime-presentation-start - (values (etypecase object - (buffer (with-current-buffer object 1)) - (string 0)) - nil))) - (setq this-presentation (get-text-property change-point - presentation object)) - (unless this-presentation - (return-from slime-presentation-start - (values point nil))) - (setq point change-point))) - (values point t))) - -(cl-defun slime-presentation-end (point presentation - &optional (object (current-buffer))) - "Find end of presentation at `point' in `object'. Return buffer -index (after last character of the presentation) and whether an -end-tag was found." - (let* ((this-presentation (get-text-property point presentation object))) - (while (not (slime-presentation-stop-p this-presentation)) - (let ((change-point (next-single-property-change - point presentation object))) - (unless change-point - (return-from slime-presentation-end - (values (etypecase object - (buffer (with-current-buffer object (point-max))) - (string (length object))) - nil))) - (setq point change-point) - (setq this-presentation (get-text-property point - presentation object)))) - (if this-presentation - (let ((after-end (next-single-property-change point - presentation object))) - (if (not after-end) - (values (etypecase object - (buffer (with-current-buffer object (point-max))) - (string (length object))) - t) - (values after-end t))) - (values point nil)))) - -(cl-defun slime-presentation-bounds (point presentation - &optional (object (current-buffer))) - "Return start index and end index of `presentation' around `point' -in `object', and whether the presentation is complete." - (multiple-value-bind (start good-start) - (slime-presentation-start point presentation object) - (multiple-value-bind (end good-end) - (slime-presentation-end point presentation object) - (values start end - (and good-start good-end - (slime-presentation-whole-p presentation - start end object)))))) - -(defun slime-presentation-around-point (point &optional object) - "Return presentation, start index, end index, and whether the -presentation is complete." - (let ((object (or object (current-buffer))) - (innermost-presentation nil) - (innermost-start 0) - (innermost-end most-positive-fixnum)) - (dolist (presentation (slime-presentations-around-point point object)) - (multiple-value-bind (start end whole-p) - (slime-presentation-bounds point presentation object) - (when whole-p - (when (< (- end start) (- innermost-end innermost-start)) - (setq innermost-start start - innermost-end end - innermost-presentation presentation))))) - (values innermost-presentation - innermost-start innermost-end))) - -(defun slime-presentation-around-or-before-point (point &optional object) - (let ((object (or object (current-buffer)))) - (multiple-value-bind (presentation start end whole-p) - (slime-presentation-around-point point object) - (if (or presentation (= point (point-min))) - (values presentation start end whole-p) - (slime-presentation-around-point (1- point) object))))) - -(defun slime-presentation-around-or-before-point-or-error (point) - (multiple-value-bind (presentation start end whole-p) - (slime-presentation-around-or-before-point point) - (unless presentation - (error "No presentation at point")) - (values presentation start end whole-p))) - -(cl-defun slime-for-each-presentation-in-region (from to function - &optional (object (current-buffer))) - "Call `function' with arguments `presentation', `start', `end', -`whole-p' for every presentation in the region `from'--`to' in the -string or buffer `object'." - (cl-labels ((handle-presentation (presentation point) - (multiple-value-bind (start end whole-p) - (slime-presentation-bounds point presentation object) - (funcall function presentation start end whole-p)))) - ;; Handle presentations active at `from'. - (dolist (presentation (slime-presentations-around-point from object)) - (handle-presentation presentation from)) - ;; Use the `slime-repl-presentation' property to search for new presentations. - (let ((point from)) - (while (< point to) - (setq point (next-single-property-change point 'slime-repl-presentation - object to)) - (let* ((presentation (get-text-property point 'slime-repl-presentation object)) - (status (get-text-property point presentation object))) - (when (slime-presentation-start-p status) - (handle-presentation presentation point))))))) - -;; XEmacs compatibility hack, from message by Stephen J. Turnbull on -;; xemacs-beta@xemacs.org of 18 Mar 2002 -(unless (boundp 'undo-in-progress) - (defvar undo-in-progress nil - "Placeholder defvar for XEmacs compatibility from SLIME.") - (defadvice undo-more (around slime activate) - (let ((undo-in-progress t)) ad-do-it))) - -(defun slime-after-change-function (start end &rest ignore) - "Check all presentations within and adjacent to the change. -When a presentation has been altered, change it to plain text." - (let ((inhibit-modification-hooks t)) - (let ((real-start (max 1 (1- start))) - (real-end (min (1+ (buffer-size)) (1+ end))) - (any-change nil)) - ;; positions around the change - (slime-for-each-presentation-in-region - real-start real-end - (lambda (presentation from to whole-p) - (cond - (whole-p - (slime-ensure-presentation-overlay from to presentation)) - ((not undo-in-progress) - (slime-remove-presentation-properties from to - presentation) - (setq any-change t))))) - (when any-change - (undo-boundary))))) - -(defun slime-presentation-around-click (event) - "Return the presentation around the position of the mouse-click EVENT. -If there is no presentation, signal an error. -Also return the start position, end position, and buffer of the presentation." - (when (and (featurep 'xemacs) (not (button-press-event-p event))) - (error "Command must be bound to a button-press-event")) - (let ((point (if (featurep 'xemacs) (event-point event) (posn-point (event-end event)))) - (window (if (featurep 'xemacs) (event-window event) (caadr event)))) - (with-current-buffer (window-buffer window) - (multiple-value-bind (presentation start end) - (slime-presentation-around-point point) - (unless presentation - (error "No presentation at click")) - (values presentation start end (current-buffer)))))) - -(defun slime-check-presentation (from to buffer presentation) - (unless (slime-eval `(cl:nth-value 1 (swank:lookup-presented-object - ',(slime-presentation-id presentation)))) - (with-current-buffer buffer - (slime-remove-presentation-properties from to presentation)))) - -(defun slime-copy-or-inspect-presentation-at-mouse (event) - (interactive "e") ; no "@" -- we don't want to select the clicked-at window - (multiple-value-bind (presentation start end buffer) - (slime-presentation-around-click event) - (slime-check-presentation start end buffer presentation) - (if (with-current-buffer buffer - (eq major-mode 'slime-repl-mode)) - (slime-copy-presentation-at-mouse-to-repl event) - (slime-inspect-presentation-at-mouse event)))) - -(defun slime-inspect-presentation (presentation start end buffer) - (let ((reset-p - (with-current-buffer buffer - (not (eq major-mode 'slime-inspector-mode))))) - (slime-eval-async `(swank:inspect-presentation ',(slime-presentation-id presentation) ,reset-p) - 'slime-open-inspector))) - -(defun slime-inspect-presentation-at-mouse (event) - (interactive "e") - (multiple-value-bind (presentation start end buffer) - (slime-presentation-around-click event) - (slime-inspect-presentation presentation start end buffer))) - -(defun slime-inspect-presentation-at-point (point) - (interactive "d") - (multiple-value-bind (presentation start end) - (slime-presentation-around-or-before-point-or-error point) - (slime-inspect-presentation presentation start end (current-buffer)))) - - -(defun slime-M-.-presentation (presentation start end buffer &optional where) - (let* ((id (slime-presentation-id presentation)) - (presentation-string (format "Presentation %s" id)) - (location (slime-eval `(swank:find-definition-for-thing - (swank:lookup-presented-object - ',(slime-presentation-id presentation)))))) - (unless (eq (car location) :error) - (slime-edit-definition-cont - (and location (list (make-slime-xref :dspec `(,presentation-string) - :location location))) - presentation-string - where)))) - -(defun slime-M-.-presentation-at-mouse (event) - (interactive "e") - (multiple-value-bind (presentation start end buffer) - (slime-presentation-around-click event) - (slime-M-.-presentation presentation start end buffer))) - -(defun slime-M-.-presentation-at-point (point) - (interactive "d") - (multiple-value-bind (presentation start end) - (slime-presentation-around-or-before-point-or-error point) - (slime-M-.-presentation presentation start end (current-buffer)))) - -(defun slime-edit-presentation (name &optional where) - (if (or current-prefix-arg (not (equal (slime-symbol-at-point) name))) - nil ; NAME came from user explicitly, so decline. - (multiple-value-bind (presentation start end whole-p) - (slime-presentation-around-or-before-point (point)) - (when presentation - (slime-M-.-presentation presentation start end (current-buffer) where))))) - -(defun slime-copy-presentation-to-repl (presentation start end buffer) - (let ((text (with-current-buffer buffer - ;; we use the buffer-substring rather than the - ;; presentation text to capture any overlays - (buffer-substring start end))) - (id (slime-presentation-id presentation))) - (unless (integerp id) - (setq id (slime-eval `(swank:lookup-and-save-presented-object-or-lose ',id)))) - (unless (eql major-mode 'slime-repl-mode) - (slime-switch-to-output-buffer)) - (cl-flet ((do-insertion () - (unless (looking-back "\\s-" (- (point) 1)) - (insert " ")) - (slime-insert-presentation text id) - (unless (or (eolp) (looking-at "\\s-")) - (insert " ")))) - (if (>= (point) slime-repl-prompt-start-mark) - (do-insertion) - (save-excursion - (goto-char (point-max)) - (do-insertion)))))) - -(defun slime-copy-presentation-at-mouse-to-repl (event) - (interactive "e") - (multiple-value-bind (presentation start end buffer) - (slime-presentation-around-click event) - (slime-copy-presentation-to-repl presentation start end buffer))) - -(defun slime-copy-presentation-at-point-to-repl (point) - (interactive "d") - (multiple-value-bind (presentation start end) - (slime-presentation-around-or-before-point-or-error point) - (slime-copy-presentation-to-repl presentation start end (current-buffer)))) - -(defun slime-copy-presentation-at-mouse-to-point (event) - (interactive "e") - (multiple-value-bind (presentation start end buffer) - (slime-presentation-around-click event) - (let ((presentation-text - (with-current-buffer buffer - (buffer-substring start end)))) - (when (not (string-match "\\s-" - (buffer-substring (1- (point)) (point)))) - (insert " ")) - (insert presentation-text) - (slime-after-change-function (point) (point)) - (when (and (not (eolp)) (not (looking-at "\\s-"))) - (insert " "))))) - -(defun slime-copy-presentation-to-kill-ring (presentation start end buffer) - (let ((presentation-text - (with-current-buffer buffer - (buffer-substring start end)))) - (kill-new presentation-text) - (message "Saved presentation \"%s\" to kill ring" presentation-text))) - -(defun slime-copy-presentation-at-mouse-to-kill-ring (event) - (interactive "e") - (multiple-value-bind (presentation start end buffer) - (slime-presentation-around-click event) - (slime-copy-presentation-to-kill-ring presentation start end buffer))) - -(defun slime-copy-presentation-at-point-to-kill-ring (point) - (interactive "d") - (multiple-value-bind (presentation start end) - (slime-presentation-around-or-before-point-or-error point) - (slime-copy-presentation-to-kill-ring presentation start end (current-buffer)))) - -(defun slime-describe-presentation (presentation) - (slime-eval-describe - `(swank::describe-to-string - (swank:lookup-presented-object ',(slime-presentation-id presentation))))) - -(defun slime-describe-presentation-at-mouse (event) - (interactive "@e") - (multiple-value-bind (presentation) (slime-presentation-around-click event) - (slime-describe-presentation presentation))) - -(defun slime-describe-presentation-at-point (point) - (interactive "d") - (multiple-value-bind (presentation) - (slime-presentation-around-or-before-point-or-error point) - (slime-describe-presentation presentation))) - -(defun slime-pretty-print-presentation (presentation) - (slime-eval-describe - `(swank::swank-pprint - (cl:list - (swank:lookup-presented-object ',(slime-presentation-id presentation)))))) - -(defun slime-pretty-print-presentation-at-mouse (event) - (interactive "@e") - (multiple-value-bind (presentation) (slime-presentation-around-click event) - (slime-pretty-print-presentation presentation))) - -(defun slime-pretty-print-presentation-at-point (point) - (interactive "d") - (multiple-value-bind (presentation) - (slime-presentation-around-or-before-point-or-error point) - (slime-pretty-print-presentation presentation))) - -(defun slime-mark-presentation (point) - (interactive "d") - (multiple-value-bind (presentation start end) - (slime-presentation-around-or-before-point-or-error point) - (goto-char start) - (push-mark end nil t))) - -(defun slime-previous-presentation (&optional arg) - "Move point to the beginning of the first presentation before point. -With ARG, do this that many times. -A negative argument means move forward instead." - (interactive "p") - (unless arg (setq arg 1)) - (slime-next-presentation (- arg))) - -(defun slime-next-presentation (&optional arg) - "Move point to the beginning of the next presentation after point. -With ARG, do this that many times. -A negative argument means move backward instead." - (interactive "p") - (unless arg (setq arg 1)) - (cond - ((plusp arg) - (dotimes (i arg) - ;; First skip outside the current surrounding presentation (if any) - (multiple-value-bind (presentation start end) - (slime-presentation-around-point (point)) - (when presentation - (goto-char end))) - (let ((p (next-single-property-change (point) 'slime-repl-presentation))) - (unless p - (error "No next presentation")) - (multiple-value-bind (presentation start end) - (slime-presentation-around-or-before-point-or-error p) - (goto-char start))))) - ((minusp arg) - (dotimes (i (- arg)) - ;; First skip outside the current surrounding presentation (if any) - (multiple-value-bind (presentation start end) - (slime-presentation-around-point (point)) - (when presentation - (goto-char start))) - (let ((p (previous-single-property-change (point) 'slime-repl-presentation))) - (unless p - (error "No previous presentation")) - (multiple-value-bind (presentation start end) - (slime-presentation-around-or-before-point-or-error p) - (goto-char start))))))) - -(define-key slime-presentation-map [mouse-2] 'slime-copy-or-inspect-presentation-at-mouse) -(define-key slime-presentation-map [mouse-3] 'slime-presentation-menu) - -(when (featurep 'xemacs) - (define-key slime-presentation-map [button2] 'slime-copy-or-inspect-presentation-at-mouse) - (define-key slime-presentation-map [button3] 'slime-presentation-menu)) - -;; protocol for handling up a menu. -;; 1. Send lisp message asking for menu choices for this object. -;; Get back list of strings. -;; 2. Let used choose -;; 3. Call back to execute menu choice, passing nth and string of choice - -(defun slime-menu-choices-for-presentation (presentation buffer from to choice-to-lambda) - "Return a menu for `presentation' at `from'--`to' in `buffer', suitable for `x-popup-menu'." - (let* ((what (slime-presentation-id presentation)) - (choices (with-current-buffer buffer - (slime-eval - `(swank::menu-choices-for-presentation-id ',what))))) - (cl-labels ((savel (f) ;; IMPORTANT - xemacs can't handle lambdas in x-popup-menu. So give them a name - (let ((sym (cl-gensym))) - (setf (gethash sym choice-to-lambda) f) - sym))) - (etypecase choices - (list - `(,(format "Presentation %s" (truncate-string-to-width - (slime-presentation-text presentation) - 30 nil nil t)) - ("" - ("Find Definition" . ,(savel 'slime-M-.-presentation-at-mouse)) - ("Inspect" . ,(savel 'slime-inspect-presentation-at-mouse)) - ("Describe" . ,(savel 'slime-describe-presentation-at-mouse)) - ("Pretty-print" . ,(savel 'slime-pretty-print-presentation-at-mouse)) - ("Copy to REPL" . ,(savel 'slime-copy-presentation-at-mouse-to-repl)) - ("Copy to kill ring" . ,(savel 'slime-copy-presentation-at-mouse-to-kill-ring)) - ,@(unless buffer-read-only - `(("Copy to point" . ,(savel 'slime-copy-presentation-at-mouse-to-point)))) - ,@(let ((nchoice 0)) - (mapcar - (lambda (choice) - (incf nchoice) - (cons choice - (savel `(lambda () - (interactive) - (slime-eval - '(swank::execute-menu-choice-for-presentation-id - ',what ,nchoice ,(nth (1- nchoice) choices))))))) - choices))))) - (symbol ; not-present - (with-current-buffer buffer - (slime-remove-presentation-properties from to presentation)) - (sit-for 0) ; allow redisplay - `("Object no longer recorded" - ("sorry" . ,(if (featurep 'xemacs) nil '(nil))))))))) - -(defun slime-presentation-menu (event) - (interactive "e") - (let* ((point (if (featurep 'xemacs) (event-point event) - (posn-point (event-end event)))) - (window (if (featurep 'xemacs) (event-window event) (caadr event))) - (buffer (window-buffer window)) - (choice-to-lambda (make-hash-table))) - (multiple-value-bind (presentation from to) - (with-current-buffer buffer - (slime-presentation-around-point point)) - (unless presentation - (error "No presentation at event position")) - (let ((menu (slime-menu-choices-for-presentation - presentation buffer from to choice-to-lambda))) - (let ((choice (x-popup-menu event menu))) - (when choice - (call-interactively (gethash choice choice-to-lambda)))))))) - -(defun slime-presentation-expression (presentation) - "Return a string that contains a CL s-expression accessing -the presented object." - (let ((id (slime-presentation-id presentation))) - (etypecase id - (number - ;; Make sure it works even if *read-base* is not 10. - (format "(swank:lookup-presented-object-or-lose %d.)" id)) - (list - ;; for frame variables and inspector parts - (format "(swank:lookup-presented-object-or-lose '%s)" id))))) - -(defun slime-buffer-substring-with-reified-output (start end) - (let ((str-props (buffer-substring start end)) - (str-no-props (buffer-substring-no-properties start end))) - (slime-reify-old-output str-props str-no-props))) - -(defun slime-reify-old-output (str-props str-no-props) - (let ((pos (slime-property-position 'slime-repl-presentation str-props))) - (if (null pos) - str-no-props - (multiple-value-bind (presentation start-pos end-pos whole-p) - (slime-presentation-around-point pos str-props) - (if (not presentation) - str-no-props - (concat (substring str-no-props 0 pos) - ;; Eval in the reader so that we play nice with quote. - ;; -luke (19/May/2005) - "#." (slime-presentation-expression presentation) - (slime-reify-old-output (substring str-props end-pos) - (substring str-no-props end-pos)))))))) - - - -(defun slime-repl-grab-old-output (replace) - "Resend the old REPL output at point. -If replace it non-nil the current input is replaced with the old -output; otherwise the new input is appended." - (multiple-value-bind (presentation beg end) - (slime-presentation-around-or-before-point (point)) - (slime-check-presentation beg end (current-buffer) presentation) - (let ((old-output (buffer-substring beg end))) ;;keep properties - ;; Append the old input or replace the current input - (cond (replace (goto-char slime-repl-input-start-mark)) - (t (goto-char (point-max)) - (unless (eq (char-before) ?\ ) - (insert " ")))) - (delete-region (point) (point-max)) - (let ((inhibit-read-only t)) - (insert old-output))))) - -;;; Presentation-related key bindings, non-context menu - -(defvar slime-presentation-command-map nil - "Keymap for presentation-related commands. Bound to a prefix key.") - -(defvar slime-presentation-bindings - '((?i slime-inspect-presentation-at-point) - (?d slime-describe-presentation-at-point) - (?w slime-copy-presentation-at-point-to-kill-ring) - (?r slime-copy-presentation-at-point-to-repl) - (?p slime-previous-presentation) - (?n slime-next-presentation) - (?\ slime-mark-presentation))) - -(defun slime-presentation-init-keymaps () - (slime-init-keymap 'slime-presentation-command-map nil t - slime-presentation-bindings) - (define-key slime-presentation-command-map "\M-o" 'slime-clear-presentations) - ;; C-c C-v is the prefix for the presentation-command map. - (define-key slime-prefix-map "\C-v" slime-presentation-command-map)) - -(defun slime-presentation-around-or-before-point-p () - (multiple-value-bind (presentation beg end) - (slime-presentation-around-or-before-point (point)) - presentation)) - -(defvar slime-presentation-easy-menu - (let ((P '(slime-presentation-around-or-before-point-p))) - `("Presentations" - [ "Find Definition" slime-M-.-presentation-at-point ,P ] - [ "Inspect" slime-inspect-presentation-at-point ,P ] - [ "Describe" slime-describe-presentation-at-point ,P ] - [ "Pretty-print" slime-pretty-print-presentation-at-point ,P ] - [ "Copy to REPL" slime-copy-presentation-at-point-to-repl ,P ] - [ "Copy to kill ring" slime-copy-presentation-at-point-to-kill-ring ,P ] - [ "Mark" slime-mark-presentation ,P ] - "--" - [ "Previous presentation" slime-previous-presentation ] - [ "Next presentation" slime-next-presentation ] - "--" - [ "Clear all presentations" slime-clear-presentations ]))) - -(defun slime-presentation-add-easy-menu () - (easy-menu-define menubar-slime-presentation slime-mode-map "Presentations" slime-presentation-easy-menu) - (easy-menu-define menubar-slime-presentation slime-repl-mode-map "Presentations" slime-presentation-easy-menu) - (easy-menu-define menubar-slime-presentation sldb-mode-map "Presentations" slime-presentation-easy-menu) - (easy-menu-define menubar-slime-presentation slime-inspector-mode-map "Presentations" slime-presentation-easy-menu) - (easy-menu-add slime-presentation-easy-menu 'slime-mode-map) - (easy-menu-add slime-presentation-easy-menu 'slime-repl-mode-map) - (easy-menu-add slime-presentation-easy-menu 'sldb-mode-map) - (easy-menu-add slime-presentation-easy-menu 'slime-inspector-mode-map)) - -;;; hook functions (hard to isolate stuff) - -(defun slime-dispatch-presentation-event (event) - (slime-dcase event - ((:presentation-start id &optional target) - (slime-mark-presentation-start id target) - t) - ((:presentation-end id &optional target) - (slime-mark-presentation-end id target) - t) - (t nil))) - -(defun slime-presentation-write-result (string) - (with-current-buffer (slime-output-buffer) - (let ((marker (slime-repl-output-target-marker :repl-result)) - (saved-point (point-marker))) - (goto-char marker) - (slime-propertize-region `(face slime-repl-result-face - rear-nonsticky (face)) - (insert string)) - ;; Move the input-start marker after the REPL result. - (set-marker marker (point)) - (set-marker slime-output-end (point)) - ;; Restore point before insertion but only it if was farther - ;; than `marker'. Omitting this breaks REPL test - ;; `repl-type-ahead'. - (when (> saved-point (point)) - (goto-char saved-point))) - (slime-repl-show-maximum-output))) - -(defun slime-presentation-write (string &optional target) - (case target - ((nil) ; Regular process output - (slime-repl-emit string)) - (:repl-result - (slime-presentation-write-result string)) - (t (slime-repl-emit-to-target string target)))) - -(defun slime-presentation-current-input (&optional until-point-p) - "Return the current input as string. -The input is the region from after the last prompt to the end of -buffer. Presentations of old results are expanded into code." - (slime-buffer-substring-with-reified-output slime-repl-input-start-mark - (if until-point-p - (point) - (point-max)))) - -(defun slime-presentation-on-return-pressed (end-of-input) - (when (and (car (slime-presentation-around-or-before-point (point))) - (< (point) slime-repl-input-start-mark)) - (slime-repl-grab-old-output end-of-input) - (slime-repl-recenter-if-needed) - t)) - -(defun slime-presentation-bridge-insert (process output) - (slime-output-filter process (or output ""))) - -(defun slime-presentation-on-stream-open (stream) - (install-bridge) - (setq bridge-insert-function #'slime-presentation-bridge-insert) - (setq bridge-destination-insert nil) - (setq bridge-source-insert nil) - (setq bridge-handlers - (list* '("<" . slime-mark-presentation-start-handler) - '(">" . slime-mark-presentation-end-handler) - bridge-handlers))) - -(defun slime-clear-presentations () - "Forget all objects associated to SLIME presentations. -This allows the garbage collector to remove these objects -even on Common Lisp implementations without weak hash tables." - (interactive) - (slime-eval-async `(swank:clear-repl-results)) - (unless (eql major-mode 'slime-repl-mode) - (slime-switch-to-output-buffer)) - (slime-for-each-presentation-in-region 1 (1+ (buffer-size)) - (lambda (presentation from to whole-p) - (slime-remove-presentation-properties from to - presentation)))) - -(defun slime-presentation-inspector-insert-ispec (ispec) - (if (stringp ispec) - (insert ispec) - (slime-dcase ispec - ((:value string id) - (slime-propertize-region - (list 'slime-part-number id - 'mouse-face 'highlight - 'face 'slime-inspector-value-face) - (slime-insert-presentation string `(:inspected-part ,id) t))) - ((:label string) - (insert (slime-inspector-fontify label string))) - ((:action string id) - (slime-insert-propertized (list 'slime-action-number id - 'mouse-face 'highlight - 'face 'slime-inspector-action-face) - string))))) - -(defun slime-presentation-sldb-insert-frame-variable-value (value frame index) - (slime-insert-presentation - (sldb-in-face local-value value) - `(:frame-var ,slime-current-thread ,(car frame) ,index) t)) - -(defun slime-presentations-on-connected () - (slime-eval-async `(swank:init-presentations))) - -(provide 'slime-presentations) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-quicklisp.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-quicklisp.el deleted file mode 100644 index 97f5ece..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-quicklisp.el +++ /dev/null @@ -1,51 +0,0 @@ -(require 'slime) -(require 'cl-lib) - -;;; bits of the following taken from slime-asdf.el - -(define-slime-contrib slime-quicklisp - "Quicklisp support." - (:authors "Matthew Kennedy ") - (:license "GPL") - (:slime-dependencies slime-repl) - (:swank-dependencies swank-quicklisp)) - -;;; Utilities - -(defgroup slime-quicklisp nil - "Quicklisp support for Slime." - :prefix "slime-quicklisp-" - :group 'slime) - -(defvar slime-quicklisp-system-history nil - "History list for Quicklisp system names.") - - - -(defun slime-read-quicklisp-system-name (&optional prompt default-value) - "Read a Quick system name from the minibuffer, prompting with PROMPT." - (let* ((completion-ignore-case nil) - (prompt (or prompt "Quicklisp system")) - (quicklisp-system-names (slime-eval `(swank:list-quicklisp-systems))) - (prompt (concat prompt (if default-value - (format " (default `%s'): " default-value) - ": ")))) - (completing-read prompt (slime-bogus-completion-alist quicklisp-system-names) - nil nil nil - 'slime-quicklisp-system-history default-value))) - -(defun slime-quicklisp-quickload (system) - "Load a Quicklisp system." - (slime-save-some-lisp-buffers) - (slime-display-output-buffer) - (slime-repl-shortcut-eval-async `(ql:quickload ,system))) - -;;; REPL shortcuts - -(defslime-repl-shortcut slime-repl-quicklisp-quickload ("quicklisp-quickload" "ql") - (:handler (lambda () - (interactive) - (slime-quicklisp-quickload (slime-read-quicklisp-system-name)))) - (:one-liner "Load a system known to Quicklisp.")) - -(provide 'slime-quicklisp) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-references.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-references.el deleted file mode 100644 index 93389ae..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-references.el +++ /dev/null @@ -1,156 +0,0 @@ -(require 'slime) -(require 'advice) -(require 'slime-compiler-notes-tree) ; FIXME: actually only uses the tree bits, so that should be a library. - -(define-slime-contrib slime-references - "Clickable references to documentation (SBCL only)." - (:authors "Christophe Rhodes " - "Luke Gorrie " - "Tobias C. Rittweiler ") - (:license "GPL") - (:on-load - (ad-enable-advice 'slime-note.message 'after 'slime-note.message+references) - (ad-activate 'slime-note.message) - (setq slime-tree-printer 'slime-tree-print-with-references) - (add-hook 'sldb-extras-hooks 'sldb-maybe-insert-references)) - (:on-unload - (ad-disable-advice 'slime-note.message 'after 'slime-note.message+references) - (ad-deactivate 'slime-note.message) - (setq slime-tree-printer 'slime-tree-default-printer) - (remove-hook 'sldb-extras-hooks 'sldb-maybe-insert-references))) - -(defcustom slime-sbcl-manual-root "http://www.sbcl.org/manual/" - "*The base URL of the SBCL manual, for documentation lookup." - :type '(choice (string :tag "HTML Documentation") - (const :tag "Info Documentation" :info)) - :group 'slime-mode) - -(defface sldb-reference-face - (list (list t '(:underline t))) - "Face for references." - :group 'slime-debugger) - - -;;;;; SBCL-style references - -(defvar slime-references-local-keymap - (let ((map (make-sparse-keymap "local keymap for slime references"))) - (define-key map [mouse-2] 'slime-lookup-reference-at-mouse) - (define-key map [return] 'slime-lookup-reference-at-point) - map)) - -(defun slime-reference-properties (reference) - "Return the properties for a reference. -Only add clickability to properties we actually know how to lookup." - (cl-destructuring-bind (where type what) reference - (if (or (and (eq where :sbcl) (eq type :node)) - (and (eq where :ansi-cl) - (memq type '(:function :special-operator :macro - :type :system-class - :section :glossary :issue)))) - `(slime-reference ,reference - font-lock-face sldb-reference-face - follow-link t - mouse-face highlight - help-echo "mouse-2: visit documentation." - keymap ,slime-references-local-keymap)))) - -(defun slime-insert-reference (reference) - "Insert documentation reference from a condition. -See SWANK-BACKEND:CONDITION-REFERENCES for the datatype." - (cl-destructuring-bind (where type what) reference - (insert "\n" (slime-format-reference-source where) ", ") - (slime-insert-propertized (slime-reference-properties reference) - (slime-format-reference-node what)) - (insert (format " [%s]" type)))) - -(defun slime-insert-references (references) - (when references - (insert "\nSee also:") - (slime-with-rigid-indentation 2 - (mapc #'slime-insert-reference references)))) - -(defun slime-format-reference-source (where) - (cl-case where - (:amop "The Art of the Metaobject Protocol") - (:ansi-cl "Common Lisp Hyperspec") - (:sbcl "SBCL Manual") - (t (format "%S" where)))) - -(defun slime-format-reference-node (what) - (if (listp what) - (mapconcat #'prin1-to-string what ".") - what)) - -(defun slime-lookup-reference-at-point () - "Browse the documentation reference at point." - (interactive) - (let ((refs (get-text-property (point) 'slime-reference))) - (if (null refs) - (error "No references at point") - (cl-destructuring-bind (where type what) refs - (cl-case where - (:ansi-cl - (cl-case type - (:section - (browse-url (funcall common-lisp-hyperspec-section-fun what))) - (:glossary - (browse-url (funcall common-lisp-hyperspec-glossary-function what))) - (:issue - (browse-url (common-lisp-issuex what))) - (:special-operator - (browse-url (common-lisp-special-operator (downcase name)))) - (t - (hyperspec-lookup what)))) - (t - (case slime-sbcl-manual-root - (:info - (info (format "(sbcl)%s" what))) - (t - (browse-url - (format "%s#%s" slime-sbcl-manual-root - (subst-char-in-string ?\ ?\- what))))))))))) - -(defun slime-lookup-reference-at-mouse (event) - "Invoke the action pointed at by the mouse." - (interactive "e") - (cl-destructuring-bind (mouse-1 (w pos . _) . _) event - (save-excursion - (goto-char pos) - (slime-lookup-reference-at-point)))) - -;;;;; Hook into *SLIME COMPILATION* - -(defun slime-note.references (note) - (plist-get note :references)) - -;;; FIXME: `compilation-mode' will swallow the `mouse-face' -;;; etc. properties. -(defadvice slime-note.message (after slime-note.message+references) - (setq ad-return-value - (concat ad-return-value - (with-temp-buffer - (slime-insert-references - (slime-note.references (ad-get-arg 0))) - (buffer-string))))) - -;;;;; Hook into slime-compiler-notes-tree - -(defun slime-tree-print-with-references (tree) - ;; for SBCL-style references - (slime-tree-default-printer tree) - (let ((note (plist-get (slime-tree.plist tree) 'note))) - (when note - (let ((references (slime-note.references note))) - (when references - (terpri (current-buffer)) - (slime-insert-references references)))))) - -;;;;; Hook into SLDB - -(defun sldb-maybe-insert-references (extra) - (slime-dcase extra - ((:references references) (slime-insert-references references) t) - (t nil))) - -(provide 'slime-references) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-repl.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-repl.el deleted file mode 100644 index 91e7b61..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-repl.el +++ /dev/null @@ -1,1770 +0,0 @@ -;;; slime-repl.el --- -;; -;; Original Author: Helmut Eller -;; Contributors: too many to mention -;; License: GNU GPL (same license as Emacs) -;; -;;; Description: -;; - -;; -;;; Installation: -;; -;; Call slime-setup and include 'slime-repl as argument: -;; -;; (slime-setup '(slime-repl [others conribs ...])) -;; -(require 'slime) -(require 'slime-parse) -(require 'cl-lib) -(eval-when-compile (require 'cl)) ; slime-def-connection-var, which - ; expands to defsetf not in cl-lib - -(define-slime-contrib slime-repl - "Read-Eval-Print Loop written in Emacs Lisp. - -This contrib implements a Lisp Listener along with some niceties like -a persistent history and various \"shortcut\" commands. Nothing here -depends on comint.el; I/O is multiplexed over SLIME's socket. - -This used to be the default REPL for SLIME, but it was hard to -maintain." - (:authors "too many to mention") - (:license "GPL") - (:on-load - (slime-repl-add-hooks) - (setq slime-find-buffer-package-function 'slime-repl-find-buffer-package)) - (:on-unload (slime-repl-remove-hooks)) - (:swank-dependencies swank-repl)) - -;;;;; slime-repl - -(defgroup slime-repl nil - "The Read-Eval-Print Loop (*slime-repl* buffer)." - :prefix "slime-repl-" - :group 'slime) - -(defcustom slime-repl-shortcut-dispatch-char ?\, - "Character used to distinguish repl commands from lisp forms." - :type '(character) - :group 'slime-repl) - -(defcustom slime-repl-only-save-lisp-buffers t - "When T we only attempt to save lisp-mode file buffers. When - NIL slime will attempt to save all buffers (as per - save-some-buffers). This applies to all ASDF related repl - shortcuts." - :type '(boolean) - :group 'slime-repl) - -(defcustom slime-repl-auto-right-margin nil - "When T we bind CL:*PRINT-RIGHT-MARGIN* to the width of the -current repl's (as per slime-output-buffer) window." - :type '(boolean) - :group 'slime-repl) - -(defface slime-repl-prompt-face - '((t (:inherit font-lock-keyword-face))) - "Face for the prompt in the SLIME REPL." - :group 'slime-repl) - -(defface slime-repl-output-face - '((t (:inherit font-lock-string-face))) - "Face for Lisp output in the SLIME REPL." - :group 'slime-repl) - -(defface slime-repl-input-face - '((t (:bold t))) - "Face for previous input in the SLIME REPL." - :group 'slime-repl) - -(defface slime-repl-result-face - '((t ())) - "Face for the result of an evaluation in the SLIME REPL." - :group 'slime-repl) - -(defcustom slime-repl-history-file "~/.slime-history.eld" - "File to save the persistent REPL history to." - :type 'string - :group 'slime-repl) - -(defcustom slime-repl-history-size 200 - "*Maximum number of lines for persistent REPL history." - :type 'integer - :group 'slime-repl) - -(defcustom slime-repl-history-file-coding-system - (cond ((slime-find-coding-system 'utf-8-unix) 'utf-8-unix) - (t slime-net-coding-system)) - "*The coding system for the history file." - :type 'symbol - :group 'slime-repl) - - -;; dummy defvar for compiler -(defvar slime-repl-read-mode) - -(defun slime-reading-p () - "True if Lisp is currently reading input from the REPL." - (with-current-buffer (slime-output-buffer) - slime-repl-read-mode)) - - -;;;; Stream output - -(slime-def-connection-var slime-connection-output-buffer nil - "The buffer for the REPL. May be nil or a dead buffer.") - -(make-variable-buffer-local - (defvar slime-output-start nil - "Marker for the start of the output for the evaluation.")) - -(make-variable-buffer-local - (defvar slime-output-end nil - "Marker for end of output. New output is inserted at this mark.")) - -;; dummy definitions for the compiler -(defvar slime-repl-package-stack) -(defvar slime-repl-directory-stack) -(defvar slime-repl-input-start-mark) -(defvar slime-repl-prompt-start-mark) - -(defun slime-output-buffer (&optional noprompt) - "Return the output buffer, create it if necessary." - (let ((buffer (slime-connection-output-buffer))) - (or (if (buffer-live-p buffer) buffer) - (setf (slime-connection-output-buffer) - (let ((connection (slime-connection))) - (with-current-buffer (slime-repl-buffer t connection) - (unless (eq major-mode 'slime-repl-mode) - (slime-repl-mode)) - (setq slime-buffer-connection connection) - (setq slime-buffer-package (slime-lisp-package connection)) - (slime-reset-repl-markers) - (unless noprompt - (slime-repl-insert-prompt)) - (current-buffer))))))) - -(defvar slime-repl-banner-function 'slime-repl-insert-banner) - -(defun slime-repl-update-banner () - (funcall slime-repl-banner-function) - (slime-move-point (point-max)) - (slime-mark-output-start) - (slime-mark-input-start) - (slime-repl-insert-prompt)) - -(defun slime-repl-insert-banner () - (when (zerop (buffer-size)) - (let ((welcome (concat "; SLIME " slime-version))) - (insert welcome)))) - -(defun slime-init-output-buffer (connection) - (with-current-buffer (slime-output-buffer t) - (setq slime-buffer-connection connection - slime-repl-directory-stack '() - slime-repl-package-stack '()) - (slime-repl-update-banner))) - -(defun slime-display-output-buffer () - "Display the output buffer and scroll to bottom." - (with-current-buffer (slime-output-buffer) - (goto-char (point-max)) - (unless (get-buffer-window (current-buffer) t) - (display-buffer (current-buffer) t)) - (slime-repl-show-maximum-output))) - -(defun slime-output-filter (process string) - (with-current-buffer (process-buffer process) - (when (and (plusp (length string)) - (eq (process-status slime-buffer-connection) 'open)) - (slime-write-string string)))) - -(defvar slime-open-stream-hooks) - -(defun slime-open-stream-to-lisp (port coding-system) - (let ((stream (open-network-stream "*lisp-output-stream*" - (slime-with-connection-buffer () - (current-buffer)) - (car (process-contact (slime-connection))) - port)) - (emacs-coding-system (car (cl-find coding-system - slime-net-valid-coding-systems - :key #'cl-third)))) - (slime-set-query-on-exit-flag stream) - (set-process-filter stream 'slime-output-filter) - (set-process-coding-system stream emacs-coding-system emacs-coding-system) - (let ((secret (slime-secret))) - (when secret - (slime-net-send secret stream))) - (run-hook-with-args 'slime-open-stream-hooks stream) - stream)) - -(defun slime-io-speed-test (&optional profile) - "A simple minded benchmark for stream performance. -If a prefix argument is given, instrument the slime package for -profiling before running the benchmark." - (interactive "P") - (eval-and-compile - (require 'elp)) - (elp-reset-all) - (elp-restore-all) - (load "slime.el") - ;;(byte-compile-file "slime-net.el" t) - ;;(setq slime-log-events nil) - (setq slime-enable-evaluate-in-emacs t) - ;;(setq slime-repl-enable-presentations nil) - (when profile - (elp-instrument-package "slime-")) - (kill-buffer (slime-output-buffer)) - (switch-to-buffer (slime-output-buffer)) - (delete-other-windows) - (sit-for 0) - (slime-repl-send-string "(swank:io-speed-test 4000 1)") - (let ((proc (slime-inferior-process))) - (when proc - (display-buffer (process-buffer proc) t) - (goto-char (point-max))))) - -(defvar slime-write-string-function 'slime-repl-write-string) - -(defun slime-write-string (string &optional target) - "Insert STRING in the REPL buffer or some other TARGET. -If TARGET is nil, insert STRING as regular process -output. If TARGET is :repl-result, insert STRING as the result of the -evaluation. Other values of TARGET map to an Emacs marker via the -hashtable `slime-output-target-to-marker'; output is inserted at this marker." - (funcall slime-write-string-function string target)) - -(defun slime-repl-write-string (string &optional target) - (case target - ((nil) (slime-repl-emit string)) - (:repl-result (slime-repl-emit-result string t)) - (t (slime-repl-emit-to-target string target)))) - -(defvar slime-repl-popup-on-output nil - "Display the output buffer when some output is written. -This is set to nil after displaying the buffer.") - -(defmacro slime-save-marker (marker &rest body) - (declare (debug (sexp &rest form))) - (let ((pos (cl-gensym "pos"))) - `(let ((,pos (marker-position ,marker))) - (prog1 (progn . ,body) - (set-marker ,marker ,pos))))) - -(put 'slime-save-marker 'lisp-indent-function 1) - -(defun slime-repl-emit (string) - ;; insert the string STRING in the output buffer - (with-current-buffer (slime-output-buffer) - (save-excursion - (goto-char slime-output-end) - (slime-save-marker slime-output-start - (slime-propertize-region '(face slime-repl-output-face - slime-repl-output t - rear-nonsticky (face)) - (let ((inhibit-read-only t)) - (insert-before-markers string) - (when (and (= (point) slime-repl-prompt-start-mark) - (not (bolp))) - (insert-before-markers "\n") - (set-marker slime-output-end (1- (point)))))))) - (when slime-repl-popup-on-output - (setq slime-repl-popup-on-output nil) - (display-buffer (current-buffer))) - (slime-repl-show-maximum-output))) - -(defun slime-repl-emit-result (string &optional bol) - ;; insert STRING and mark it as evaluation result - (with-current-buffer (slime-output-buffer) - (save-excursion - (goto-char slime-repl-input-start-mark) - (slime-save-marker slime-output-start - (goto-char slime-repl-input-start-mark) - (when (and bol (not (bolp))) (insert-before-markers-and-inherit "\n")) - (slime-save-marker slime-output-end - (slime-propertize-region `(face slime-repl-result-face - rear-nonsticky (face)) - (insert-before-markers string))) - (set-marker slime-output-end (point)))) - (slime-repl-show-maximum-output))) - -(defvar slime-last-output-target-id 0 - "The last integer we used as a TARGET id.") - -(defun slime-repl-emit-to-target (string target) - "Insert STRING at target TARGET. -See `slime-output-target-to-marker'." - (let* ((marker (slime-repl-output-target-marker target)) - (buffer (and marker (marker-buffer marker)))) - (when buffer - (with-current-buffer buffer - (save-excursion - ;; Insert STRING at MARKER, then move MARKER behind - ;; the insertion. - (goto-char marker) - (insert-before-markers string) - (set-marker marker (point))))))) - -(defun slime-repl-output-target-marker (target) - (case target - ((nil) - (with-current-buffer (slime-output-buffer) - slime-output-end)) - (:repl-result - (with-current-buffer (slime-output-buffer) - slime-repl-input-start-mark)) - (t - (slime-output-target-marker target)))) - - -(defun slime-switch-to-output-buffer () - "Select the output buffer, when possible in an existing window. - -Hint: You can use `display-buffer-reuse-frames' and -`special-display-buffer-names' to customize the frame in which -the buffer should appear." - (interactive) - (pop-to-buffer (slime-output-buffer)) - (goto-char (point-max))) - - -;;;; REPL -;; -;; The REPL uses some markers to separate input from output. The -;; usual configuration is as follows: -;; -;; ... output ... ... result ... prompt> ... input ... -;; ^ ^ ^ ^ ^ -;; output-start output-end prompt-start input-start point-max -;; -;; input-start is a right inserting marker, because -;; we want it to stay behind when the user inserts text. -;; -;; We maintain the following invariant: -;; -;; output-start <= output-end <= input-start. -;; -;; This invariant is important, because we must be prepared for -;; asynchronous output and asynchronous reads. ("Asynchronous" means, -;; triggered by Lisp and not by Emacs.) -;; -;; All output is inserted at the output-end marker. Some care must be -;; taken when output-end and input-start are at the same position: if -;; we insert at that point, we must move the right markers. We should -;; also not leave (window-)point in the middle of the new output. The -;; idiom we use is a combination to slime-save-marker, -;; insert-before-markers, and manually updating window-point -;; afterwards. -;; -;; A "synchronous" evaluation request proceeds as follows: the user -;; inserts some text between input-start and point-max and then hits -;; return. We send that region to Lisp, move the output and input -;; makers to the line after the input and wait. When we receive the -;; result, we insert it together with a prompt between the output-end -;; and input-start mark. See `slime-repl-insert-prompt'. -;; -;; It is possible that some output for such an evaluation request -;; arrives after the result. This output is inserted before the -;; result (and before the prompt). -;; -;; If we are in "reading" state, e.g., during a call to Y-OR-N-P, -;; there is no prompt between output-end and input-start. -;; - -;; FIXME: slime-lisp-package should be local in a REPL buffer -(slime-def-connection-var slime-lisp-package - "COMMON-LISP-USER" - "The current package name of the Superior lisp. -This is automatically synchronized from Lisp.") - -(slime-def-connection-var slime-lisp-package-prompt-string - "CL-USER" - "The current package name of the Superior lisp. -This is automatically synchronized from Lisp.") - -(slime-make-variables-buffer-local - (defvar slime-repl-package-stack nil - "The stack of packages visited in this repl.") - - (defvar slime-repl-directory-stack nil - "The stack of default directories associated with this repl.") - - (defvar slime-repl-prompt-start-mark) - (defvar slime-repl-input-start-mark) - (defvar slime-repl-old-input-counter 0 - "Counter used to generate unique `slime-repl-old-input' properties. -This property value must be unique to avoid having adjacent inputs be -joined together.")) - -(defun slime-reset-repl-markers () - (dolist (markname '(slime-output-start - slime-output-end - slime-repl-prompt-start-mark - slime-repl-input-start-mark)) - (set markname (make-marker)) - (set-marker (symbol-value markname) (point)))) - -;;;;; REPL mode setup - -(defvar slime-repl-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map lisp-mode-map) - map)) - -(slime-define-keys slime-prefix-map - ("\C-z" 'slime-switch-to-output-buffer) - ("\M-p" 'slime-repl-set-package)) - -(slime-define-keys slime-mode-map - ("\C-c~" 'slime-sync-package-and-default-directory) - ("\C-c\C-y" 'slime-call-defun) - ("\C-c\C-j" 'slime-eval-last-expression-in-repl)) - -(slime-define-keys slime-connection-list-mode-map - ((kbd "RET") 'slime-goto-connection) - ([return] 'slime-goto-connection)) - -(slime-define-keys slime-repl-mode-map - ("\C-m" 'slime-repl-return) - ([return] 'slime-repl-return) - ("\C-j" 'slime-repl-newline-and-indent) - ("\C-\M-m" 'slime-repl-closing-return) - ([(control return)] 'slime-repl-closing-return) - ("\M-p" 'slime-repl-previous-input) - ((kbd "C-") 'slime-repl-backward-input) - ("\M-n" 'slime-repl-next-input) - ((kbd "C-") 'slime-repl-forward-input) - ("\M-r" 'slime-repl-previous-matching-input) - ("\M-s" 'slime-repl-next-matching-input) - ("\C-c\C-c" 'slime-interrupt) - (" " 'slime-space) - ((string slime-repl-shortcut-dispatch-char) 'slime-handle-repl-shortcut) - ("\C-c\C-o" 'slime-repl-clear-output) - ("\C-c\M-o" 'slime-repl-clear-buffer) - ("\C-c\C-u" 'slime-repl-kill-input) - ("\C-c\C-n" 'slime-repl-next-prompt) - ("\C-c\C-p" 'slime-repl-previous-prompt) - ("\C-c\C-z" 'slime-nop) - ("\C-cI" 'slime-repl-inspect) - ("\C-x\C-e" 'slime-eval-last-expression)) - -(slime-define-keys slime-inspector-mode-map - ((kbd "M-RET") 'slime-inspector-copy-down-to-repl)) - -(slime-define-keys sldb-mode-map - ("\C-y" 'sldb-insert-frame-call-to-repl) - ((kbd "M-RET") 'sldb-copy-down-to-repl)) - -(def-slime-selector-method ?r - "SLIME Read-Eval-Print-Loop." - (slime-output-buffer)) - -(define-minor-mode slime-repl-map-mode - "Minor mode which makes slime-repl-mode-map available. -\\{slime-repl-mode-map}" - nil - nil - slime-repl-mode-map) - -(defun slime-repl-mode () - "Major mode for interacting with a superior Lisp. -\\{slime-repl-mode-map}" - (interactive) - (kill-all-local-variables) - (setq major-mode 'slime-repl-mode) - (slime-editing-mode 1) - (slime-repl-map-mode 1) - (lisp-mode-variables t) - (set (make-local-variable 'lisp-indent-function) - 'common-lisp-indent-function) - (slime-setup-completion) - (set (make-local-variable 'tab-always-indent) 'complete) - (setq font-lock-defaults nil) - (setq mode-name "REPL") - (setq slime-current-thread :repl-thread) - (set (make-local-variable 'scroll-conservatively) 20) - (set (make-local-variable 'scroll-margin) 0) - (when slime-repl-history-file - (slime-repl-safe-load-history) - (add-hook 'kill-buffer-hook - 'slime-repl-safe-save-merged-history - 'append t)) - (add-hook 'kill-emacs-hook 'slime-repl-save-all-histories) - ;; At the REPL, we define beginning-of-defun and end-of-defun to be - ;; the start of the previous prompt or next prompt respectively. - ;; Notice the interplay with SLIME-REPL-BEGINNING-OF-DEFUN. - (set (make-local-variable 'beginning-of-defun-function) - 'slime-repl-mode-beginning-of-defun) - (set (make-local-variable 'end-of-defun-function) - 'slime-repl-mode-end-of-defun) - (run-mode-hooks 'slime-repl-mode-hook)) - -(defun slime-repl-buffer (&optional create connection) - "Get the REPL buffer for the current connection; optionally create." - (funcall (if create #'get-buffer-create #'get-buffer) - (format "*slime-repl %s*" (slime-connection-name connection)))) - -(defun slime-repl () - (interactive) - (slime-switch-to-output-buffer) - (current-buffer)) - -(defun slime-repl-mode-beginning-of-defun (&optional arg) - (if (and arg (< arg 0)) - (slime-repl-mode-end-of-defun (- arg)) - (dotimes (i (or arg 1)) - (slime-repl-previous-prompt)))) - -(defun slime-repl-mode-end-of-defun (&optional arg) - (if (and arg (< arg 0)) - (slime-repl-mode-beginning-of-defun (- arg)) - (dotimes (i (or arg 1)) - (slime-repl-next-prompt)))) - -(defun slime-repl-send-string (string &optional command-string) - (cond (slime-repl-read-mode - (slime-repl-return-string string)) - (t (slime-repl-eval-string string)))) - -(defun slime-repl-eval-string (string) - (slime-rex () - ((if slime-repl-auto-right-margin - `(swank-repl:listener-eval - ,string - :window-width - ,(with-current-buffer (slime-output-buffer) - (window-width))) - `(swank-repl:listener-eval ,string)) - (slime-lisp-package)) - ((:ok result) - (slime-repl-insert-result result)) - ((:abort condition) - (slime-repl-show-abort condition)))) - -(defun slime-repl-insert-result (result) - (with-current-buffer (slime-output-buffer) - (save-excursion - (when result - (slime-dcase result - ((:values &rest strings) - (cond ((null strings) - (slime-repl-emit-result "; No value\n" t)) - (t - (dolist (s strings) - (slime-repl-emit-result s t))))))) - (slime-repl-insert-prompt)) - (slime-repl-show-maximum-output))) - -(defun slime-repl-show-abort (condition) - (with-current-buffer (slime-output-buffer) - (save-excursion - (slime-save-marker slime-output-start - (slime-save-marker slime-output-end - (goto-char slime-output-end) - (insert-before-markers (format "; Evaluation aborted on %s.\n" - condition)) - (slime-repl-insert-prompt)))) - (slime-repl-show-maximum-output))) - -(defvar slime-repl-suppress-prompt nil - "Supresses Slime REPL prompt when bound to T.") - -(defun slime-repl-insert-prompt () - "Insert the prompt (before markers!). -Set point after the prompt. -Return the position of the prompt beginning. - -If `slime-repl-suppress-prompt' is true, does nothing and returns nil." - (goto-char slime-repl-input-start-mark) - (unless slime-repl-suppress-prompt - (slime-save-marker slime-output-start - (slime-save-marker slime-output-end - (unless (bolp) (insert-before-markers "\n")) - (let ((prompt-start (point)) - (prompt (format "%s> " (slime-lisp-package-prompt-string)))) - (slime-propertize-region - '(face slime-repl-prompt-face - read-only t slime-repl-prompt t - rear-nonsticky t front-sticky (read-only) - inhibit-line-move-field-capture t - field output) - (insert-before-markers prompt)) - (set-marker slime-repl-prompt-start-mark prompt-start) - (setq buffer-undo-list nil) - prompt-start))))) - -(defun slime-repl-show-maximum-output () - "Put the end of the buffer at the bottom of the window." - (when (eobp) - (let ((win (if (eq (window-buffer) (current-buffer)) - (selected-window) - (get-buffer-window (current-buffer) t)))) - (when win - (with-selected-window win - (set-window-point win (point-max)) - (recenter -1)))))) - -(defvar slime-repl-current-input-hooks) - -(defun slime-repl-current-input (&optional until-point-p) - "Return the current input as string. -The input is the region from after the last prompt to the end of -buffer." - (or (run-hook-with-args-until-success 'slime-repl-current-input-hooks - until-point-p) - (buffer-substring-no-properties slime-repl-input-start-mark - (if until-point-p - (point) - (point-max))))) - -(defun slime-property-position (text-property &optional object) - "Return the first position of TEXT-PROPERTY, or nil." - (if (get-text-property 0 text-property object) - 0 - (next-single-property-change 0 text-property object))) - -(defun slime-mark-input-start () - (set-marker slime-repl-input-start-mark (point) (current-buffer))) - -(defun slime-mark-output-start () - (set-marker slime-output-start (point)) - (set-marker slime-output-end (point))) - -(defun slime-mark-output-end () - ;; Don't put slime-repl-output-face again; it would remove the - ;; special presentation face, for instance in the SBCL inspector. - (add-text-properties slime-output-start slime-output-end - '(;;face slime-repl-output-face - rear-nonsticky (face)))) - -(defun slime-preserve-zmacs-region () - "In XEmacs, ensure that the zmacs-region stays active after this command." - (when (boundp 'zmacs-region-stays) - (set 'zmacs-region-stays t))) - -(defun slime-repl-in-input-area-p () - (<= slime-repl-input-start-mark (point))) - -(defun slime-repl-at-prompt-start-p () - ;; This will not work on non-current prompts. - (= (point) slime-repl-input-start-mark)) - -(defun slime-repl-beginning-of-defun () - "Move to beginning of defun." - (interactive) - ;; We call BEGINNING-OF-DEFUN if we're at the start of a prompt - ;; already, to trigger SLIME-REPL-MODE-BEGINNING-OF-DEFUN by means - ;; of the locally bound BEGINNING-OF-DEFUN-FUNCTION, in order to - ;; jump to the start of the previous prompt. - (if (and (not (slime-repl-at-prompt-start-p)) - (slime-repl-in-input-area-p)) - (goto-char slime-repl-input-start-mark) - (beginning-of-defun)) - t) - -;; FIXME: this looks very strange -(defun slime-repl-end-of-defun () - "Move to next of defun." - (interactive) - ;; C.f. SLIME-REPL-BEGINNING-OF-DEFUN. - (if (and (not (= (point) (point-max))) - (slime-repl-in-input-area-p)) - (goto-char (point-max)) - (end-of-defun)) - t) - -(defun slime-repl-previous-prompt () - "Move backward to the previous prompt." - (interactive) - (slime-repl-find-prompt t)) - -(defun slime-repl-next-prompt () - "Move forward to the next prompt." - (interactive) - (slime-repl-find-prompt)) - -(defun slime-repl-find-prompt (&optional backward) - (let ((origin (point)) - (prop 'slime-repl-prompt)) - (while (progn - (slime-search-property-change prop backward) - (not (or (slime-end-of-proprange-p prop) (bobp) (eobp))))) - (unless (slime-end-of-proprange-p prop) - (goto-char origin)))) - -(defun slime-search-property-change (prop &optional backward) - (cond (backward - (goto-char (or (previous-single-char-property-change (point) prop) - (point-min)))) - (t - (goto-char (or (next-single-char-property-change (point) prop) - (point-max)))))) - -(defun slime-end-of-proprange-p (property) - (and (get-char-property (max 1 (1- (point))) property) - (not (get-char-property (point) property)))) - -(defvar slime-repl-return-hooks) - -(defun slime-repl-return (&optional end-of-input) - "Evaluate the current input string, or insert a newline. -Send the current input only if a whole expression has been entered, -i.e. the parenthesis are matched. - -With prefix argument send the input even if the parenthesis are not -balanced." - (interactive "P") - (slime-check-connected) - (cond (end-of-input - (slime-repl-send-input)) - (slime-repl-read-mode ; bad style? - (slime-repl-send-input t)) - ((and (get-text-property (point) 'slime-repl-old-input) - (< (point) slime-repl-input-start-mark)) - (slime-repl-grab-old-input end-of-input) - (slime-repl-recenter-if-needed)) - ((run-hook-with-args-until-success 'slime-repl-return-hooks end-of-input)) - ((slime-input-complete-p slime-repl-input-start-mark (point-max)) - (slime-repl-send-input t)) - (t - (slime-repl-newline-and-indent) - (message "[input not complete]")))) - -(defun slime-repl-recenter-if-needed () - "Make sure that (point) is visible." - (unless (pos-visible-in-window-p (point-max)) - (save-excursion - (goto-char (point-max)) - (recenter -1)))) - -(defun slime-repl-send-input (&optional newline) - "Goto to the end of the input and send the current input. -If NEWLINE is true then add a newline at the end of the input." - (unless (slime-repl-in-input-area-p) - (error "No input at point.")) - (goto-char (point-max)) - (let ((end (point))) ; end of input, without the newline - (slime-repl-add-to-input-history - (buffer-substring slime-repl-input-start-mark end)) - (when newline - (insert "\n") - (slime-repl-show-maximum-output)) - (let ((inhibit-modification-hooks t)) - (add-text-properties slime-repl-input-start-mark - (point) - `(slime-repl-old-input - ,(incf slime-repl-old-input-counter)))) - (let ((overlay (make-overlay slime-repl-input-start-mark end))) - ;; These properties are on an overlay so that they won't be taken - ;; by kill/yank. - (overlay-put overlay 'face 'slime-repl-input-face))) - (let ((input (slime-repl-current-input))) - (goto-char (point-max)) - (slime-mark-input-start) - (slime-mark-output-start) - (slime-repl-send-string input))) - -(defun slime-repl-grab-old-input (replace) - "Resend the old REPL input at point. -If replace is non-nil the current input is replaced with the old -input; otherwise the new input is appended. The old input has the -text property `slime-repl-old-input'." - (multiple-value-bind (beg end) (slime-property-bounds 'slime-repl-old-input) - (let ((old-input (buffer-substring beg end)) ;;preserve - ;;properties, they will be removed later - (offset (- (point) beg))) - ;; Append the old input or replace the current input - (cond (replace (goto-char slime-repl-input-start-mark)) - (t (goto-char (point-max)) - (unless (eq (char-before) ?\ ) - (insert " ")))) - (delete-region (point) (point-max)) - (save-excursion - (insert old-input) - (when (equal (char-before) ?\n) - (delete-char -1))) - (forward-char offset)))) - -(defun slime-repl-closing-return () - "Evaluate the current input string after closing all open lists." - (interactive) - (goto-char (point-max)) - (save-restriction - (narrow-to-region slime-repl-input-start-mark (point)) - (while (ignore-errors (save-excursion (backward-up-list 1)) t) - (insert ")"))) - (slime-repl-return)) - -(defun slime-repl-newline-and-indent () - "Insert a newline, then indent the next line. -Restrict the buffer from the prompt for indentation, to avoid being -confused by strange characters (like unmatched quotes) appearing -earlier in the buffer." - (interactive) - (save-restriction - (narrow-to-region slime-repl-prompt-start-mark (point-max)) - (insert "\n") - (lisp-indent-line))) - -(defun slime-repl-delete-current-input () - "Delete all text from the prompt." - (interactive) - (delete-region slime-repl-input-start-mark (point-max))) - -(defun slime-eval-last-expression-in-repl (prefix) - "Evaluates last expression in the Slime REPL. - -Switches REPL to current package of the source buffer for the duration. If -used with a prefix argument (C-u), doesn't switch back afterwards." - (interactive "P") - (let ((expr (slime-last-expression)) - (buffer-name (buffer-name (current-buffer))) - (new-package (slime-current-package)) - (old-package (slime-lisp-package)) - (slime-repl-suppress-prompt t) - (yank-back nil)) - (with-current-buffer (slime-output-buffer) - (unless (eq (current-buffer) (window-buffer)) - (pop-to-buffer (current-buffer) t)) - (goto-char (point-max)) - ;; Kill pending input in the REPL - (when (< (marker-position slime-repl-input-start-mark) (point)) - (kill-region slime-repl-input-start-mark (point)) - (setq yank-back t)) - (unwind-protect - (progn - (insert-before-markers (format "\n;;; from %s\n" buffer-name)) - (when new-package - (slime-repl-set-package new-package)) - (let ((slime-repl-suppress-prompt nil)) - (slime-repl-insert-prompt)) - (insert expr) - (slime-repl-return)) - (unless (or prefix (equal (slime-lisp-package) old-package)) - ;; Switch back. - (slime-repl-set-package old-package) - (let ((slime-repl-suppress-prompt nil)) - (slime-repl-insert-prompt)))) - ;; Put pending input back. - (when yank-back - (yank))))) - -(defun slime-repl-kill-input () - "Kill all text from the prompt to point." - (interactive) - (cond ((< (marker-position slime-repl-input-start-mark) (point)) - (kill-region slime-repl-input-start-mark (point))) - ((= (point) (marker-position slime-repl-input-start-mark)) - (slime-repl-delete-current-input)))) - -(defun slime-repl-replace-input (string) - (slime-repl-delete-current-input) - (insert-and-inherit string)) - -(defun slime-repl-input-line-beginning-position () - (save-excursion - (goto-char slime-repl-input-start-mark) - (let ((inhibit-field-text-motion t)) - (line-beginning-position)))) - -(defun slime-clear-repl-variables () - (interactive) - (slime-eval-async `(swank-repl:clear-repl-variables))) - -(defvar slime-repl-clear-buffer-hook) - -(add-hook 'slime-repl-clear-buffer-hook 'slime-clear-repl-variables) - -(defun slime-repl-clear-buffer () - "Delete the output generated by the Lisp process." - (interactive) - (let ((inhibit-read-only t)) - (delete-region (point-min) slime-repl-prompt-start-mark) - (delete-region slime-output-start slime-output-end) - (when (< (point) slime-repl-input-start-mark) - (goto-char slime-repl-input-start-mark)) - (recenter t)) - (run-hooks 'slime-repl-clear-buffer-hook)) - -(defun slime-repl-clear-output () - "Delete the output inserted since the last input." - (interactive) - (let ((start (save-excursion - (when (>= (point) slime-repl-input-start-mark) - (goto-char slime-repl-input-start-mark)) - (slime-repl-previous-prompt) - (ignore-errors (forward-sexp)) - (forward-line) - (point))) - (end (1- (slime-repl-input-line-beginning-position)))) - (when (< start end) - (let ((inhibit-read-only t)) - (delete-region start end) - (save-excursion - (goto-char start) - (insert ";;; output flushed")))))) - -(defun slime-repl-set-package (package) - "Set the package of the REPL buffer to PACKAGE." - (interactive (list (let* ((p (slime-current-package)) - (p (and p (slime-pretty-package-name p))) - (p (and (not (equal p (slime-lisp-package))) p))) - (slime-read-package-name "Package: " p)))) - (with-current-buffer (slime-output-buffer) - (let ((previouse-point (- (point) slime-repl-input-start-mark)) - (previous-prompt (slime-lisp-package-prompt-string))) - (destructuring-bind (name prompt-string) - (slime-repl-shortcut-eval `(swank:set-package ,package)) - (setf (slime-lisp-package) name) - (setf slime-buffer-package name) - (unless (equal previous-prompt prompt-string) - (setf (slime-lisp-package-prompt-string) prompt-string) - (slime-repl-insert-prompt)) - (when (plusp previouse-point) - (goto-char (+ previouse-point slime-repl-input-start-mark))))))) - - -;;;;; History - -(defcustom slime-repl-wrap-history nil - "*T to wrap history around when the end is reached." - :type 'boolean - :group 'slime-repl) - -(make-variable-buffer-local - (defvar slime-repl-input-history '() - "History list of strings read from the REPL buffer.")) - -(defun slime-repl-add-to-input-history (string) - "Add STRING to the input history. -Empty strings and duplicates are ignored." - (setq string (slime-trim-whitespace string)) - (unless (equal string "") - (setq slime-repl-input-history - (remove string slime-repl-input-history)) - (unless (equal string (car slime-repl-input-history)) - (push string slime-repl-input-history)))) - -;; These two vars contain the state of the last history search. We -;; only use them if `last-command' was 'slime-repl-history-replace, -;; otherwise we reinitialize them. - -(defvar slime-repl-input-history-position -1 - "Newer items have smaller indices.") - -(defvar slime-repl-history-pattern nil - "The regexp most recently used for finding input history.") - -(defun slime-repl-history-replace (direction &optional regexp) - "Replace the current input with the next line in DIRECTION. -DIRECTION is 'forward' or 'backward' (in the history list). -If REGEXP is non-nil, only lines matching REGEXP are considered." - (setq slime-repl-history-pattern regexp) - (let* ((min-pos -1) - (max-pos (length slime-repl-input-history)) - (pos0 (cond ((slime-repl-history-search-in-progress-p) - slime-repl-input-history-position) - (t min-pos))) - (pos (slime-repl-position-in-history pos0 direction (or regexp "") - (slime-repl-current-input))) - (msg nil)) - (cond ((and (< min-pos pos) (< pos max-pos)) - (slime-repl-replace-input (nth pos slime-repl-input-history)) - (setq msg (format "History item: %d" pos))) - ((not slime-repl-wrap-history) - (setq msg (cond ((= pos min-pos) "End of history") - ((= pos max-pos) "Beginning of history")))) - (slime-repl-wrap-history - (setq pos (if (= pos min-pos) max-pos min-pos)) - (setq msg "Wrapped history"))) - (when (or (<= pos min-pos) (<= max-pos pos)) - (when regexp - (setq msg (concat msg "; no matching item")))) - ;;(message "%s [%d %d %s]" msg start-pos pos regexp) - (message "%s%s" msg (cond ((not regexp) "") - (t (format "; current regexp: %s" regexp)))) - (setq slime-repl-input-history-position pos) - (setq this-command 'slime-repl-history-replace))) - -(defun slime-repl-history-search-in-progress-p () - (eq last-command 'slime-repl-history-replace)) - -(defun slime-repl-terminate-history-search () - (setq last-command this-command)) - -(defun slime-repl-position-in-history (start-pos direction regexp - &optional exclude-string) - "Return the position of the history item matching REGEXP. -Return -1 resp. the length of the history if no item matches. -If EXCLUDE-STRING is specified then it's excluded from the search." - ;; Loop through the history list looking for a matching line - (let* ((step (ecase direction - (forward -1) - (backward 1))) - (history slime-repl-input-history) - (len (length history))) - (loop for pos = (+ start-pos step) then (+ pos step) - if (< pos 0) return -1 - if (<= len pos) return len - for history-item = (nth pos history) - if (and (string-match regexp history-item) - (not (equal history-item exclude-string))) - return pos))) - -(defun slime-repl-previous-input () - "Cycle backwards through input history. -If the `last-command' was a history navigation command use the -same search pattern for this command. -Otherwise use the current input as search pattern." - (interactive) - (slime-repl-history-replace 'backward (slime-repl-history-pattern t))) - -(defun slime-repl-next-input () - "Cycle forwards through input history. -See `slime-repl-previous-input'." - (interactive) - (slime-repl-history-replace 'forward (slime-repl-history-pattern t))) - -(defun slime-repl-forward-input () - "Cycle forwards through input history." - (interactive) - (slime-repl-history-replace 'forward (slime-repl-history-pattern))) - -(defun slime-repl-backward-input () - "Cycle backwards through input history." - (interactive) - (slime-repl-history-replace 'backward (slime-repl-history-pattern))) - -(defun slime-repl-previous-matching-input (regexp) - (interactive (list (slime-read-from-minibuffer - "Previous element matching (regexp): "))) - (slime-repl-terminate-history-search) - (slime-repl-history-replace 'backward regexp)) - -(defun slime-repl-next-matching-input (regexp) - (interactive (list (slime-read-from-minibuffer - "Next element matching (regexp): "))) - (slime-repl-terminate-history-search) - (slime-repl-history-replace 'forward regexp)) - -(defun slime-repl-history-pattern (&optional use-current-input) - "Return the regexp for the navigation commands." - (cond ((slime-repl-history-search-in-progress-p) - slime-repl-history-pattern) - (use-current-input - (goto-char (max slime-repl-input-start-mark (point))) - (let ((str (slime-repl-current-input t))) - (cond ((string-match "^[ \t\n]*$" str) nil) - (t (concat "^" (regexp-quote str)))))) - (t nil))) - -(defun slime-repl-delete-from-input-history (string) - "Delete STRING from the repl input history. - -When string is not provided then clear the current repl input and -use it as an input. This is useful to get rid of unwanted repl -history entries while navigating the repl history." - (interactive (list (slime-repl-current-input))) - (let ((merged-history - (slime-repl-merge-histories (slime-repl-read-history nil t) - slime-repl-input-history))) - (setq slime-repl-input-history - (cl-delete string merged-history :test #'string=)) - (slime-repl-save-history)) - (slime-repl-delete-current-input)) - -;;;;; Persistent History - -(defun slime-repl-merge-histories (old-hist new-hist) - "Merge entries from OLD-HIST and NEW-HIST." - ;; Newer items in each list are at the beginning. - (let* ((ht (make-hash-table :test #'equal)) - (test (lambda (entry) - (or (gethash entry ht) - (progn (setf (gethash entry ht) t) - nil))))) - (append (cl-remove-if test new-hist) - (cl-remove-if test old-hist)))) - -(defun slime-repl-load-history (&optional filename) - "Set the current SLIME REPL history. -It can be read either from FILENAME or `slime-repl-history-file' or -from a user defined filename." - (interactive (list (slime-repl-read-history-filename))) - (let ((file (or filename slime-repl-history-file))) - (setq slime-repl-input-history (slime-repl-read-history file t)))) - -(defun slime-repl-read-history (&optional filename noerrer) - "Read and return the history from FILENAME. -The default value for FILENAME is `slime-repl-history-file'. -If NOERROR is true return and the file doesn't exits return nil." - (let ((file (or filename slime-repl-history-file))) - (cond ((not (file-readable-p file)) '()) - (t (with-temp-buffer - (insert-file-contents file) - (read (current-buffer))))))) - -(defun slime-repl-read-history-filename () - (read-file-name "Use SLIME REPL history from file: " - slime-repl-history-file)) - -(defun slime-repl-save-merged-history (&optional filename) - "Read the history file, merge the current REPL history and save it. -This tries to be smart in merging the history from the file and the -current history in that it tries to detect the unique entries using -`slime-repl-merge-histories'." - (interactive (list (slime-repl-read-history-filename))) - (let ((file (or filename slime-repl-history-file))) - (with-temp-message "saving history..." - (let ((hist (slime-repl-merge-histories (slime-repl-read-history file t) - slime-repl-input-history))) - (slime-repl-save-history file hist))))) - -(defun slime-repl-save-history (&optional filename history) - "Simply save the current SLIME REPL history to a file. -When SLIME is setup to always load the old history and one uses only -one instance of slime all the time, there is no need to merge the -files and this function is sufficient. - -When the list is longer than `slime-repl-history-size' it will be -truncated. That part is untested, though!" - (interactive (list (slime-repl-read-history-filename))) - (let ((file (or filename slime-repl-history-file)) - (hist (or history slime-repl-input-history))) - (unless (file-writable-p file) - (error (format "History file not writable: %s" file))) - (let ((hist (cl-subseq hist 0 (min (length hist) slime-repl-history-size)))) - ;;(message "saving %s to %s\n" hist file) - (with-temp-file file - (let ((cs slime-repl-history-file-coding-system) - (print-length nil) (print-level nil)) - (setq buffer-file-coding-system cs) - (insert (format ";; -*- coding: %s -*-\n" cs)) - (insert ";; History for SLIME REPL. Automatically written.\n" - ";; Edit only if you know what you're doing\n") - (prin1 (mapcar #'substring-no-properties hist) (current-buffer))))))) - -(defun slime-repl-save-all-histories () - "Save the history in each repl buffer." - (dolist (b (buffer-list)) - (with-current-buffer b - (when (eq major-mode 'slime-repl-mode) - (slime-repl-safe-save-merged-history))))) - -(defun slime-repl-safe-save-merged-history () - (slime-repl-call-with-handler - #'slime-repl-save-merged-history - "%S while saving the history. Continue? ")) - -(defun slime-repl-safe-load-history () - (slime-repl-call-with-handler - #'slime-repl-load-history - "%S while loading the history. Continue? ")) - -(defun slime-repl-call-with-handler (fun query) - "Call FUN in the context of an error handler. -The handler will use qeuery to ask the use if the error should be ingored." - (condition-case err - (funcall fun) - (error - (if (y-or-n-p (format query (error-message-string err))) - nil - (signal (car err) (cdr err)))))) - - -;;;;; REPL Read Mode - -(defvar slime-repl-read-mode-map - (let ((map (make-sparse-keymap))) - (define-key map "\C-m" 'slime-repl-return) - (define-key map [return] 'slime-repl-return) - (define-key map (kbd "TAB") 'self-insert-command) - (define-key map "\C-c\C-b" 'slime-repl-read-break) - (define-key map "\C-c\C-c" 'slime-repl-read-break) - (define-key map [remap slime-indent-and-complete-symbol] 'ignore) - (define-key map [remap slime-handle-repl-shortcut] 'self-insert-command) - map)) - -(define-minor-mode slime-repl-read-mode - "Mode to read input from Emacs -\\{slime-repl-read-mode-map}" - nil - "[read]") - -(make-variable-buffer-local - (defvar slime-read-string-threads nil)) - -(make-variable-buffer-local - (defvar slime-read-string-tags nil)) - -(defun slime-repl-read-string (thread tag) - (slime-switch-to-output-buffer) - (push thread slime-read-string-threads) - (push tag slime-read-string-tags) - (goto-char (point-max)) - (slime-mark-output-end) - (slime-mark-input-start) - (slime-repl-read-mode 1)) - -(defun slime-repl-return-string (string) - (slime-dispatch-event `(:emacs-return-string - ,(pop slime-read-string-threads) - ,(pop slime-read-string-tags) - ,string)) - (slime-repl-read-mode -1)) - -(defun slime-repl-read-break () - (interactive) - (slime-dispatch-event `(:emacs-interrupt ,(car slime-read-string-threads)))) - -(defun slime-repl-abort-read (thread tag) - (with-current-buffer (slime-output-buffer) - (pop slime-read-string-threads) - (pop slime-read-string-tags) - (slime-repl-read-mode -1) - (message "Read aborted"))) - - -;;;;; REPL handlers - -(cl-defstruct (slime-repl-shortcut (:conc-name slime-repl-shortcut.)) - symbol names handler one-liner) - -(defvar slime-repl-shortcut-table nil - "A list of slime-repl-shortcuts") - -(defvar slime-repl-shortcut-history '() - "History list of shortcut command names.") - -(defvar slime-within-repl-shortcut-handler-p nil - "Bound to T if we're in a REPL shortcut handler invoked from the REPL.") - -(defun slime-handle-repl-shortcut () - (interactive) - (if (> (point) slime-repl-input-start-mark) - (insert (string slime-repl-shortcut-dispatch-char)) - (let ((shortcut (slime-lookup-shortcut - (completing-read "Command: " - (slime-bogus-completion-alist - (slime-list-all-repl-shortcuts)) - nil t nil - 'slime-repl-shortcut-history)))) - (with-struct (slime-repl-shortcut. handler) shortcut - (let ((slime-within-repl-shortcut-handler-p t)) - (call-interactively handler)))))) - -(defun slime-list-all-repl-shortcuts () - (loop for shortcut in slime-repl-shortcut-table - append (slime-repl-shortcut.names shortcut))) - -(defun slime-lookup-shortcut (name) - (cl-find-if (lambda (s) (member name (slime-repl-shortcut.names s))) - slime-repl-shortcut-table)) - -(defmacro defslime-repl-shortcut (elisp-name names &rest options) - "Define a new repl shortcut. ELISP-NAME is a symbol specifying -the name of the interactive function to create, or NIL if no -function should be created. - -NAMES is a list of \(full-name . aliases\). - -OPTIONS is an plist specifying the handler doing the actual work -of the shortcut \(`:handler'\), and a help text \(`:one-liner'\)." - `(progn - ,(when elisp-name - `(defun ,elisp-name () - (interactive) - (call-interactively ,(second (assoc :handler options))))) - (let ((new-shortcut (make-slime-repl-shortcut - :symbol ',elisp-name - :names (list ,@names) - ,@(apply #'append options)))) - (setq slime-repl-shortcut-table - (cl-remove-if (lambda (s) - (member ',(car names) (slime-repl-shortcut.names s))) - slime-repl-shortcut-table)) - (push new-shortcut slime-repl-shortcut-table) - ',elisp-name))) - -(defun slime-repl-shortcut-eval (sexp &optional package) - "This function should be used by REPL shortcut handlers instead -of `slime-eval' to evaluate their final expansion. (This -expansion will be added to the REPL's history.)" - (when slime-within-repl-shortcut-handler-p ; were we invoked via ,foo? - (slime-repl-add-to-input-history (prin1-to-string sexp))) - (slime-eval sexp package)) - -(defun slime-repl-shortcut-eval-async (sexp &optional cont package) - "This function should be used by REPL shortcut handlers instead -of `slime-eval-async' to evaluate their final expansion. (This -expansion will be added to the REPL's history.)" - (when slime-within-repl-shortcut-handler-p ; were we invoked via ,foo? - (slime-repl-add-to-input-history (prin1-to-string sexp))) - (slime-eval-async sexp cont package)) - -(defun slime-list-repl-short-cuts () - (interactive) - (slime-with-popup-buffer ((slime-buffer-name :repl-help)) - (let ((table (cl-sort (cl-copy-list slime-repl-shortcut-table) #'string< - :key (lambda (x) - (car (slime-repl-shortcut.names x)))))) - (save-excursion - (dolist (shortcut table) - (let ((names (slime-repl-shortcut.names shortcut))) - (insert (pop names)) ;; first print the "full" name - (when names - ;; we also have aliases - (insert " (aka ") - (while (cdr names) - (insert (pop names) ", ")) - (insert (car names) ")")) - (when (slime-repl-shortcut.one-liner shortcut) - (insert "\n " (slime-repl-shortcut.one-liner shortcut))) - (insert "\n"))))))) - -(defun slime-save-some-lisp-buffers () - (if slime-repl-only-save-lisp-buffers - (save-some-buffers nil (lambda () - (and (memq major-mode slime-lisp-modes) - (not (null buffer-file-name))))) - (save-some-buffers))) - -(defun slime-kill-all-buffers () - "Kill all the SLIME-related buffers." - (dolist (buf (buffer-list)) - (when (or (string= (buffer-name buf) slime-event-buffer-name) - (string-match "^\\*inferior-lisp*" (buffer-name buf)) - (string-match "^\\*slime-repl .*\\*$" (buffer-name buf)) - (string-match "^\\*sldb .*\\*$" (buffer-name buf)) - (string-match "^\\*SLIME.*\\*$" (buffer-name buf))) - (kill-buffer buf)))) - -(defslime-repl-shortcut slime-repl-shortcut-help ("help") - (:handler 'slime-list-repl-short-cuts) - (:one-liner "Display the help.")) - -(defslime-repl-shortcut nil ("change-directory" "!d" "cd") - (:handler 'slime-set-default-directory) - (:one-liner "Change the current directory.")) - -(defslime-repl-shortcut nil ("pwd") - (:handler (lambda () - (interactive) - (let ((dir (slime-eval `(swank:default-directory)))) - (message "Directory %s" dir)))) - (:one-liner "Show the current directory.")) - -(defslime-repl-shortcut slime-repl-push-directory - ("push-directory" "+d" "pushd") - (:handler (lambda (directory) - (interactive - (list (read-directory-name - "Push directory: " - (slime-eval '(swank:default-directory)) - nil nil ""))) - (push (slime-eval '(swank:default-directory)) - slime-repl-directory-stack) - (slime-set-default-directory directory))) - (:one-liner "Save the current directory and set it to a new one.")) - -(defslime-repl-shortcut slime-repl-pop-directory - ("pop-directory" "-d" "popd") - (:handler (lambda () - (interactive) - (if (null slime-repl-directory-stack) - (message "Directory stack is empty.") - (slime-set-default-directory - (pop slime-repl-directory-stack))))) - (:one-liner "Restore the last saved directory.")) - -(defslime-repl-shortcut nil ("change-package" "!p" "in-package" "in") - (:handler 'slime-repl-set-package) - (:one-liner "Change the current package.")) - -(defslime-repl-shortcut slime-repl-push-package ("push-package" "+p") - (:handler (lambda (package) - (interactive (list (slime-read-package-name "Package: "))) - (push (slime-lisp-package) slime-repl-package-stack) - (slime-repl-set-package package))) - (:one-liner "Save the current package and set it to a new one.")) - -(defslime-repl-shortcut slime-repl-pop-package ("pop-package" "-p") - (:handler (lambda () - (interactive) - (if (null slime-repl-package-stack) - (message "Package stack is empty.") - (slime-repl-set-package - (pop slime-repl-package-stack))))) - (:one-liner "Restore the last saved package.")) - -(defslime-repl-shortcut slime-repl-resend ("resend-form") - (:handler (lambda () - (interactive) - (insert (car slime-repl-input-history)) - (insert "\n") - (slime-repl-send-input))) - (:one-liner "Resend the last form.")) - -(defslime-repl-shortcut slime-repl-disconnect ("disconnect") - (:handler 'slime-disconnect) - (:one-liner "Disconnect the current connection.")) - -(defslime-repl-shortcut slime-repl-disconnect-all ("disconnect-all") - (:handler 'slime-disconnect-all) - (:one-liner "Disconnect all connections.")) - -(defslime-repl-shortcut slime-repl-sayoonara ("sayoonara") - (:handler (lambda () - (interactive) - (when (slime-connected-p) - (slime-quit-lisp)) - (slime-kill-all-buffers))) - (:one-liner "Quit all Lisps and close all SLIME buffers.")) - -(defslime-repl-shortcut slime-repl-quit ("quit") - (:handler (lambda () - (interactive) - ;; `slime-quit-lisp' determines the connection to quit - ;; on behalf of the REPL's `slime-buffer-connection'. - (let ((repl-buffer (slime-output-buffer))) - (slime-quit-lisp) - (kill-buffer repl-buffer)))) - (:one-liner "Quit the current Lisp.")) - -(defslime-repl-shortcut slime-repl-defparameter ("defparameter" "!") - (:handler (lambda (name value) - (interactive (list (slime-read-symbol-name "Name (symbol): " t) - (slime-read-from-minibuffer "Value: " "*"))) - (insert "(cl:defparameter " name " " value - " \"REPL generated global variable.\")") - (slime-repl-send-input t))) - (:one-liner "Define a new global, special, variable.")) - -(defslime-repl-shortcut slime-repl-compile-and-load ("compile-and-load" "cl") - (:handler (lambda (filename) - (interactive (list (expand-file-name - (read-file-name "File: " nil nil nil nil)))) - (slime-save-some-lisp-buffers) - (slime-repl-shortcut-eval-async - `(swank:compile-file-if-needed - ,(slime-to-lisp-filename filename) t) - #'slime-compilation-finished))) - (:one-liner "Compile (if neccessary) and load a lisp file.")) - -(defslime-repl-shortcut nil ("restart-inferior-lisp") - (:handler 'slime-restart-inferior-lisp) - (:one-liner "Restart *inferior-lisp* and reconnect SLIME.")) - -(defun slime-redirect-inferior-output (&optional noerror) - "Redirect output of the inferior-process to the REPL buffer." - (interactive) - (let ((proc (slime-inferior-process))) - (cond (proc - (let ((filter (slime-rcurry #'slime-inferior-output-filter - (slime-current-connection)))) - (set-process-filter proc filter))) - (noerror) - (t (error "No inferior lisp process"))))) - -(defun slime-inferior-output-filter (proc string conn) - (cond ((eq (process-status conn) 'closed) - (message "Connection closed. Removing inferior output filter.") - (message "Lost output: %S" string) - (set-process-filter proc nil)) - (t - (slime-output-filter conn string)))) - -(defun slime-redirect-trace-output () - "Redirect the trace output to a separate Emacs buffer." - (interactive) - (let ((buffer (get-buffer-create (slime-buffer-name :trace)))) - (with-current-buffer buffer - (let ((marker (copy-marker (buffer-size))) - (target (incf slime-last-output-target-id))) - (puthash target marker slime-output-target-to-marker) - (slime-eval `(swank-repl:redirect-trace-output ,target)))) - ;; Note: We would like the entries in - ;; slime-output-target-to-marker to disappear when the buffers are - ;; killed. We cannot just make the hash-table ":weakness 'value" - ;; -- there is no reference from the buffers to the markers in the - ;; buffer, so entries would disappear even though the buffers are - ;; alive. Best solution might be to make buffer-local variables - ;; that keep the markers. --mkoeppe - (pop-to-buffer buffer))) - -(defun slime-call-defun () - "Insert a call to the toplevel form defined around point into the REPL." - (interactive) - (cl-labels ((insert-call - (name &key (function t) - defclass) - (let* ((setf (and function - (consp name) - (= (length name) 2) - (eql (car name) 'setf))) - (symbol (if setf - (cadr name) - name)) - (qualified-symbol-name - (slime-qualify-cl-symbol-name symbol)) - (symbol-name (slime-cl-symbol-name qualified-symbol-name)) - (symbol-package (slime-cl-symbol-package - qualified-symbol-name)) - (call (if (cl-equalp (slime-lisp-package) symbol-package) - symbol-name - qualified-symbol-name))) - (slime-switch-to-output-buffer) - (goto-char slime-repl-input-start-mark) - (insert (if function - "(" - " ")) - (when setf - (insert "setf (")) - (if defclass - (insert "make-instance '")) - (insert call) - (cond (setf - (insert " ") - (save-excursion (insert ") )"))) - (function - (insert " ") - (save-excursion (insert ")")))) - (unless function - (goto-char slime-repl-input-start-mark))))) - (let ((toplevel (slime-parse-toplevel-form))) - (if (symbolp toplevel) - (error "Not in a function definition") - (slime-dcase toplevel - (((:defun :defgeneric :defmacro :define-compiler-macro) symbol) - (insert-call symbol)) - ((:defmethod symbol &rest args) - (declare (ignore args)) - (insert-call symbol)) - (((:defparameter :defvar :defconstant) symbol) - (insert-call symbol :function nil)) - (((:defclass) symbol) - (insert-call symbol :defclass t)) - (t - (error "Not in a function definition"))))))) - -(defun slime-repl-copy-down-to-repl (slimefun &rest args) - (slime-eval-async `(swank-repl:listener-save-value ',slimefun ,@args) - #'(lambda (_ignored) - (with-current-buffer (slime-repl) - (slime-eval-async '(swank-repl:listener-get-value) - #'(lambda (_ignored) - (slime-repl-insert-prompt))))))) - -(defun slime-inspector-copy-down-to-repl (number) - "Evaluate the inspector slot at point via the REPL (to set `*')." - (interactive (list (or (get-text-property (point) 'slime-part-number) - (error "No part at point")))) - (slime-repl-copy-down-to-repl 'swank:inspector-nth-part number)) - -(defun sldb-copy-down-to-repl (frame-id var-id) - "Evaluate the frame var at point via the REPL (to set `*')." - (interactive (list (sldb-frame-number-at-point) (sldb-var-number-at-point))) - (slime-repl-copy-down-to-repl 'swank/backend:frame-var-value frame-id var-id)) - -(defun sldb-insert-frame-call-to-repl () - "Insert a call to a frame at point." - (interactive) - (let ((call (slime-eval `(swank/backend::frame-call - ,(sldb-frame-number-at-point))))) - (slime-switch-to-output-buffer) - (if (>= (point) slime-repl-prompt-start-mark) - (insert call) - (save-excursion - (goto-char (point-max)) - (insert call)))) - (slime-repl)) - -(defun slime-set-default-directory (directory) - "Make DIRECTORY become Lisp's current directory." - (interactive (list (read-directory-name "Directory: " nil nil t))) - (let ((dir (expand-file-name directory))) - (message "default-directory: %s" - (slime-from-lisp-filename - (slime-repl-shortcut-eval `(swank:set-default-directory - ,(slime-to-lisp-filename dir))))) - (with-current-buffer (slime-output-buffer) - (setq default-directory dir)))) - -(defun slime-sync-package-and-default-directory () - "Set Lisp's package and directory to the values in current buffer." - (interactive) - (let* ((package (slime-current-package)) - (exists-p (or (null package) - (slime-eval `(cl:packagep - (swank::guess-package ,package))))) - (directory default-directory)) - (when (and package exists-p) - (slime-repl-set-package package)) - (slime-set-default-directory directory) - ;; Sync *inferior-lisp* dir - (let* ((proc (slime-process)) - (buffer (and proc (process-buffer proc)))) - (when (buffer-live-p buffer) - (with-current-buffer buffer - (setq default-directory directory)))) - (message "package: %s%s directory: %s" - (with-current-buffer (slime-output-buffer) - (slime-lisp-package)) - (if exists-p "" (format " (package %s doesn't exist)" package)) - directory))) - -(defun slime-goto-connection () - "Switch to the REPL buffer for the connection at point." - (interactive) - (let ((slime-dispatching-connection (slime-connection-at-point))) - (switch-to-buffer (slime-output-buffer)))) - -(defun slime-repl-inside-string-or-comment-p () - (save-restriction - (when (and (boundp 'slime-repl-input-start-mark) - slime-repl-input-start-mark - (>= (point) slime-repl-input-start-mark)) - (narrow-to-region slime-repl-input-start-mark (point))) - (slime-inside-string-or-comment-p))) - -(defvar slime-repl-easy-menu - (let ((C '(slime-connected-p))) - `("REPL" - [ "Send Input" slime-repl-return ,C ] - [ "Close and Send Input " slime-repl-closing-return ,C ] - [ "Interrupt Lisp process" slime-interrupt ,C ] - "--" - [ "Previous Input" slime-repl-previous-input t ] - [ "Next Input" slime-repl-next-input t ] - [ "Goto Previous Prompt " slime-repl-previous-prompt t ] - [ "Goto Next Prompt " slime-repl-next-prompt t ] - [ "Clear Last Output" slime-repl-clear-output t ] - [ "Clear Buffer " slime-repl-clear-buffer t ] - [ "Kill Current Input" slime-repl-kill-input t ]))) - -(defun slime-repl-add-easy-menu () - (easy-menu-define menubar-slime-repl slime-repl-mode-map - "REPL" slime-repl-easy-menu) - (easy-menu-define menubar-slime slime-repl-mode-map - "SLIME" slime-easy-menu) - (easy-menu-add slime-repl-easy-menu 'slime-repl-mode-map)) - -(add-hook 'slime-repl-mode-hook 'slime-repl-add-easy-menu) - -(defun slime-hide-inferior-lisp-buffer () - "Display the REPL buffer instead of the *inferior-lisp* buffer." - (let* ((buffer (if (slime-process) - (process-buffer (slime-process)))) - (window (if buffer (get-buffer-window buffer t))) - (repl-buffer (slime-output-buffer t)) - (repl-window (get-buffer-window repl-buffer))) - (when buffer - (bury-buffer buffer)) - (cond (repl-window - (when window - (delete-window window))) - (window - (set-window-buffer window repl-buffer)) - (t - (pop-to-buffer repl-buffer) - (goto-char (point-max)))))) - -(defun slime-repl-choose-coding-system () - (let ((candidates (slime-connection-coding-systems))) - (or (cl-find (symbol-name (car default-process-coding-system)) - candidates - :test (lambda (s1 s2) - (if (fboundp 'coding-system-equal) - (coding-system-equal (intern s1) (intern s2))))) - (car candidates) - (error "Can't find suitable coding-system")))) - -(defun slime-repl-connected-hook-function () - (destructuring-bind (package prompt) - (let ((slime-current-thread t) - (cs (slime-repl-choose-coding-system))) - (slime-eval `(swank-repl:create-repl nil :coding-system ,cs))) - (setf (slime-lisp-package) package) - (setf (slime-lisp-package-prompt-string) prompt)) - (slime-hide-inferior-lisp-buffer) - (slime-init-output-buffer (slime-connection))) - -(defun slime-repl-event-hook-function (event) - (slime-dcase event - ((:write-string output &optional target) - (slime-write-string output target) - t) - ((:read-string thread tag) - (assert thread) - (slime-repl-read-string thread tag) - t) - ((:read-aborted thread tag) - (slime-repl-abort-read thread tag) - t) - ((:open-dedicated-output-stream port coding-system) - (slime-open-stream-to-lisp port coding-system) - t) - ((:new-package package prompt-string) - (setf (slime-lisp-package) package) - (setf (slime-lisp-package-prompt-string) prompt-string) - (let ((buffer (slime-connection-output-buffer))) - (when (buffer-live-p buffer) - (with-current-buffer buffer - (setq slime-buffer-package package)))) - t) - (t nil))) - -(defun slime-change-repl-to-default-connection () - "Change current REPL to the REPL of the default connection. -If the current buffer is not a REPL, don't do anything." - (when (equal major-mode 'slime-repl-mode) - (let ((slime-buffer-connection slime-default-connection)) - (pop-to-buffer-same-window (slime-connection-output-buffer))))) - -(defun slime-repl-find-buffer-package () - (or (slime-search-buffer-package) - (slime-lisp-package))) - -(defun slime-repl-add-hooks () - (add-hook 'slime-event-hooks 'slime-repl-event-hook-function) - (add-hook 'slime-connected-hook 'slime-repl-connected-hook-function) - (add-hook 'slime-cycle-connections-hook - 'slime-change-repl-to-default-connection)) - -(defun slime-repl-remove-hooks () - (remove-hook 'slime-event-hooks 'slime-repl-event-hook-function) - (remove-hook 'slime-connected-hook 'slime-repl-connected-hook-function) - (remove-hook 'slime-cycle-connections-hook - 'slime-change-repl-to-default-connection)) - -(defun slime-repl-sexp-at-point () - "Returns the current sexp at point (or NIL if none is found) -while ignoring the repl prompt text." - (if (<= slime-repl-input-start-mark (point)) - (save-restriction - (narrow-to-region slime-repl-input-start-mark (point-max)) - (slime-sexp-at-point)) - (slime-sexp-at-point))) - -(defun slime-repl-inspect (string) - (interactive - (list (slime-read-from-minibuffer "Inspect value (evaluated): " - (slime-repl-sexp-at-point)))) - (slime-inspect string)) - -(require 'bytecomp) - -;; (mapc (lambda (sym) -;; (cond ((fboundp sym) -;; (unless (byte-code-function-p (symbol-function sym)) -;; (byte-compile sym))) -;; (t (error "%S is not fbound" sym)))) -;; '(slime-repl-event-hook-function -;; slime-write-string -;; slime-repl-write-string -;; slime-repl-emit -;; slime-repl-show-maximum-output)) - -(provide 'slime-repl) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-sbcl-exts.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-sbcl-exts.el deleted file mode 100644 index ab1c524..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-sbcl-exts.el +++ /dev/null @@ -1,34 +0,0 @@ -(require 'slime) -(require 'cl-lib) - -(define-slime-contrib slime-sbcl-exts - "Misc extensions for SBCL" - (:authors "Tobias C. Rittweiler ") - (:license "GPL") - (:slime-dependencies slime-references) - (:swank-dependencies swank-sbcl-exts)) - -(defun slime-sbcl-bug-at-point () - (save-excursion - (save-match-data - (unless (looking-at "#[0-9]\\{6\\}") - (search-backward-regexp "#\\<" (line-beginning-position) t)) - (when (looking-at "#[0-9]\\{6\\}") - (buffer-substring-no-properties (match-beginning 0) (match-end 0)))))) - -(defun slime-read-sbcl-bug (prompt &optional query) - "Either read a sbcl bug or choose the one at point. -The user is prompted if a prefix argument is in effect, if there is no -symbol at point, or if QUERY is non-nil." - (let ((bug (slime-sbcl-bug-at-point))) - (cond ((or current-prefix-arg query (not bug)) - (slime-read-from-minibuffer prompt bug)) - (t bug)))) - -(defun slime-visit-sbcl-bug (bug) - "Visit the Launchpad site that describes `bug' (#nnnnnn)." - (interactive (list (slime-read-sbcl-bug "Bug number (#nnnnnn): "))) - (browse-url (format "http://bugs.launchpad.net/sbcl/+bug/%s" - (substring bug 1)))) - -(provide 'slime-sbcl-exts) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-scheme.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-scheme.el deleted file mode 100644 index 9b7abd6..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-scheme.el +++ /dev/null @@ -1,40 +0,0 @@ -;;; slime-scheme.el --- Support Scheme programs running under Common Lisp -;; -;; Authors: Matthias Koeppe -;; -;; License: GNU GPL (same license as Emacs) -;; -;;; Installation: -;; -;; Add this to your .emacs: -;; -;; (add-to-list 'load-path "") -;; (add-hook 'slime-load-hook (lambda () (require 'slime-scheme))) -;; -(eval-and-compile - (require 'slime)) - -(defun slime-scheme-mode-hook () - (slime-mode 1)) - -(defun slime-scheme-indentation-update (symbol indent packages) - ;; Does the symbol have an indentation value that we set? - (when (equal (get symbol 'scheme-indent-function) - (get symbol 'slime-scheme-indent)) - (put symbol 'slime-scheme-indent indent) - (put symbol 'scheme-indent-function indent))) - - -;;; Initialization - -(defun slime-scheme-init () - (add-hook 'scheme-mode-hook 'slime-scheme-mode-hook) - (add-hook 'slime-indentation-update-hooks 'slime-scheme-indentation-update) - (add-to-list 'slime-lisp-modes 'scheme-mode)) - -(defun slime-scheme-unload () - (remove-hook 'scheme-mode-hook 'slime-scheme-mode-hook) - (remove-hook 'slime-indentation-update-hooks 'slime-scheme-indentation-update) - (setq slime-lisp-modes (remove 'scheme-mode slime-lisp-modes))) - -(provide 'slime-scheme) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-scratch.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-scratch.el deleted file mode 100644 index 113fae0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-scratch.el +++ /dev/null @@ -1,48 +0,0 @@ -;;; slime-scratch.el - -(require 'slime) -(require 'cl-lib) - -(define-slime-contrib slime-scratch - "Imitate Emacs' *scratch* buffer" - (:authors "Helmut Eller ") - (:license "GPL") - (:on-load - (def-slime-selector-method ?s "*slime-scratch* buffer." - (slime-scratch-buffer)))) - - -;;; Code - -(defvar slime-scratch-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map lisp-mode-map) - map)) - -(defun slime-scratch () - (interactive) - (slime-switch-to-scratch-buffer)) - -(defun slime-switch-to-scratch-buffer () - (set-buffer (slime-scratch-buffer)) - (unless (eq (current-buffer) (window-buffer)) - (pop-to-buffer (current-buffer) t))) - -(defvar slime-scratch-file nil) - -(defun slime-scratch-buffer () - "Return the scratch buffer, create it if necessary." - (or (get-buffer (slime-buffer-name :scratch)) - (with-current-buffer (if slime-scratch-file - (find-file slime-scratch-file) - (get-buffer-create (slime-buffer-name :scratch))) - (rename-buffer (slime-buffer-name :scratch)) - (lisp-mode) - (use-local-map slime-scratch-mode-map) - (slime-mode t) - (current-buffer)))) - -(slime-define-keys slime-scratch-mode-map - ("\C-j" 'slime-eval-print-last-expression)) - -(provide 'slime-scratch) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-snapshot.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-snapshot.el deleted file mode 100644 index 1643ecc..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-snapshot.el +++ /dev/null @@ -1,34 +0,0 @@ -(eval-and-compile - (require 'slime)) - -(define-slime-contrib slime-snapshot - "Save&restore memory images without disconnecting" - (:authors "Helmut Eller ") - (:license "GPL v3") - (:swank-dependencies swank-snapshot)) - -(defun slime-snapshot (filename &optional background) - "Save a memory image to the file FILENAME." - (interactive (list (read-file-name "Image file: ") - current-prefix-arg)) - (let ((file (expand-file-name filename))) - (when (and (file-exists-p file) - (not (yes-or-no-p (format "File exists %s. Overwrite it? " - filename)))) - (signal 'quit nil)) - (slime-eval-with-transcript - `(,(if background - 'swank-snapshot:background-save-snapshot - 'swank-snapshot:save-snapshot) - ,file)))) - -(defun slime-restore (filename) - "Restore a memory image stored in file FILENAME." - (interactive (list (read-file-name "Image file: "))) - ;; bypass event dispatcher because we don't expect a reply. FIXME. - (slime-net-send `(:emacs-rex (swank-snapshot:restore-snapshot - ,(expand-file-name filename)) - nil t nil) - (slime-connection))) - -(provide 'slime-snapshot) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-sprof.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-sprof.el deleted file mode 100644 index 8233e7b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-sprof.el +++ /dev/null @@ -1,224 +0,0 @@ -(require 'slime) -(require 'cl-lib) -(eval-when-compile (require 'cl)) ; lexical-let* - -(define-slime-contrib slime-sprof - "Integration with SBCL's sb-sprof." - (:authors "Juho Snellman" - "Stas Boukarev") - (:license "MIT") - (:swank-dependencies swank-sprof) - (:on-load - (let ((C '(and (slime-connected-p) - (equal (slime-lisp-implementation-type) "SBCL")))) - (setf (cdr (last (assoc "Profiling" slime-easy-menu))) - `("--" - [ "Start sb-sprof" slime-sprof-start ,C ] - [ "Stop sb-sprof" slime-sprof-stop ,C ] - [ "Report sb-sprof" slime-sprof-report ,C ]))))) - -(defvar slime-sprof-exclude-swank nil - "*Display swank functions in the report.") - -(define-derived-mode slime-sprof-browser-mode fundamental-mode - "slprof" - "Mode for browsing profiler data\ -\\\ -\\{slime-sprof-browser-mode-map}" - :syntax-table lisp-mode-syntax-table - (setq buffer-read-only t)) - -(set-keymap-parent slime-sprof-browser-mode-map slime-parent-map) - -(slime-define-keys slime-sprof-browser-mode-map - ("h" 'describe-mode) - ("d" 'slime-sprof-browser-disassemble-function) - ("g" 'slime-sprof-browser-go-to) - ("v" 'slime-sprof-browser-view-source) - ("s" 'slime-sprof-toggle-swank-exclusion) - ((kbd "RET") 'slime-sprof-browser-toggle)) - -;; Start / stop profiling - -(cl-defun slime-sprof-start (&optional (mode :cpu)) - (interactive) - (slime-eval `(swank:swank-sprof-start :mode ,mode))) - -(defun slime-sprof-start-alloc () - (interactive) - (slime-sprof-start :alloc)) - -(defun slime-sprof-start-time () - (interactive) - (slime-sprof-start :time)) - -(defun slime-sprof-stop () - (interactive) - (slime-eval `(swank:swank-sprof-stop))) - -;; Reporting - -(defun slime-sprof-format (graph) - (with-current-buffer (slime-buffer-name :sprof) - (let ((inhibit-read-only t)) - (erase-buffer) - (insert (format "%4s %-54s %6s %6s %6s\n" - "Rank" - "Name" - "Self%" - "Cumul%" - "Total%")) - (dolist (data graph) - (slime-sprof-browser-insert-line data 54)))) - (forward-line 2)) - -(cl-defun slime-sprof-update (&optional (exclude-swank slime-sprof-exclude-swank)) - (slime-eval-async `(swank:swank-sprof-get-call-graph - :exclude-swank ,exclude-swank) - 'slime-sprof-format)) - -(defalias 'slime-sprof-browser 'slime-sprof-report) - -(defun slime-sprof-report () - (interactive) - (slime-with-popup-buffer ((slime-buffer-name :sprof) - :connection t - :select t - :mode 'slime-sprof-browser-mode) - (slime-sprof-update))) - -(defun slime-sprof-toggle-swank-exclusion () - (interactive) - (setq slime-sprof-exclude-swank - (not slime-sprof-exclude-swank)) - (slime-sprof-update)) - -(defun slime-sprof-browser-insert-line (data name-length) - (cl-destructuring-bind (index name self cumul total) - data - (if index - (insert (format "%-4d " index)) - (insert " ")) - (slime-insert-propertized - (slime-sprof-browser-name-properties) - (format (format "%%-%ds " name-length) - (slime-sprof-abbreviate-name name name-length))) - (insert (format "%6.2f " self)) - (when cumul - (insert (format "%6.2f " cumul)) - (when total - (insert (format "%6.2f" total)))) - (when index - (slime-sprof-browser-add-line-text-properties - `(profile-index ,index expanded nil))) - (insert "\n"))) - -(defun slime-sprof-abbreviate-name (name max-length) - (cl-subseq name 0 (min (length name) max-length))) - -;; Expanding / collapsing - -(defun slime-sprof-browser-toggle () - (interactive) - (let ((index (get-text-property (point) 'profile-index))) - (when index - (save-excursion - (if (slime-sprof-browser-line-expanded-p) - (slime-sprof-browser-collapse) - (slime-sprof-browser-expand)))))) - -(defun slime-sprof-browser-collapse () - (let ((inhibit-read-only t)) - (slime-sprof-browser-add-line-text-properties '(expanded nil)) - (forward-line) - (cl-loop until (or (eobp) - (get-text-property (point) 'profile-index)) - do - (delete-region (point-at-bol) (point-at-eol)) - (unless (eobp) - (delete-char 1))))) - -(defun slime-sprof-browser-expand () - (lexical-let* ((buffer (current-buffer)) - (point (point)) - (index (get-text-property point 'profile-index))) - (slime-eval-async `(swank:swank-sprof-expand-node ,index) - (lambda (data) - (with-current-buffer buffer - (save-excursion - (destructuring-bind (&key callers calls) - data - (slime-sprof-browser-add-expansion callers - "Callers" - 0) - (slime-sprof-browser-add-expansion calls - "Calls" - 0)))))))) - -(defun slime-sprof-browser-add-expansion (data type nesting) - (when data - (let ((inhibit-read-only t)) - (slime-sprof-browser-add-line-text-properties '(expanded t)) - (end-of-line) - (insert (format "\n %s" type)) - (dolist (node data) - (cl-destructuring-bind (index name cumul) node - (insert (format (format "\n%%%ds" (+ 7 (* 2 nesting))) "")) - (slime-insert-propertized - (slime-sprof-browser-name-properties) - (let ((len (- 59 (* 2 nesting)))) - (format (format "%%-%ds " len) - (slime-sprof-abbreviate-name name len)))) - (slime-sprof-browser-add-line-text-properties - `(profile-sub-index ,index)) - (insert (format "%6.2f" cumul))))))) - -(defun slime-sprof-browser-line-expanded-p () - (get-text-property (point) 'expanded)) - -(defun slime-sprof-browser-add-line-text-properties (properties) - (add-text-properties (point-at-bol) - (point-at-eol) - properties)) - -(defun slime-sprof-browser-name-properties () - '(face sldb-restart-number-face)) - -;; "Go to function" - -(defun slime-sprof-browser-go-to () - (interactive) - (let ((sub-index (get-text-property (point) 'profile-sub-index))) - (when sub-index - (let ((pos (text-property-any - (point-min) (point-max) 'profile-index sub-index))) - (when pos (goto-char pos)))))) - -;; Disassembly - -(defun slime-sprof-browser-disassemble-function () - (interactive) - (let ((index (or (get-text-property (point) 'profile-index) - (get-text-property (point) 'profile-sub-index)))) - (when index - (slime-eval-describe `(swank:swank-sprof-disassemble - ,index))))) - -;; View source - -(defun slime-sprof-browser-view-source () - (interactive) - (let ((index (or (get-text-property (point) 'profile-index) - (get-text-property (point) 'profile-sub-index)))) - (when index - (slime-eval-async - `(swank:swank-sprof-source-location ,index) - (lambda (source-location) - (slime-dcase source-location - ((:error message) - (message "%s" message) - (ding)) - (t - (slime-show-source-location source-location)))))))) - -(provide 'slime-sprof) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-trace-dialog.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-trace-dialog.el deleted file mode 100644 index fd25c7b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-trace-dialog.el +++ /dev/null @@ -1,837 +0,0 @@ -;;; -*- coding: utf-8; lexical-binding: t -*- -;;; -;;; slime-trace-dialog.el -- a navigable dialog of inspectable trace entries -;;; -;;; TODO: implement better wrap interface for sbcl method, labels and such -;;; TODO: backtrace printing is very slow -;;; -(require 'slime) -(require 'slime-parse) -(require 'slime-repl) -(require 'cl-lib) - -(define-slime-contrib slime-trace-dialog - "Provide an interfactive trace dialog buffer for managing and -inspecting details of traced functions. Invoke this dialog with C-c T." - (:authors "João Távora ") - (:license "GPL") - (:swank-dependencies swank-trace-dialog) - (:on-load (add-hook 'slime-mode-hook 'slime-trace-dialog-enable) - (add-hook 'slime-repl-mode-hook 'slime-trace-dialog-enable)) - (:on-unload (remove-hook 'slime-mode-hook 'slime-trace-dialog-enable) - (remove-hook 'slime-repl-mode-hook 'slime-trace-dialog-enable))) - - -;;;; Variables -;;; -(defvar slime-trace-dialog-flash t - "Non-nil means flash the updated region of the SLIME Trace Dialog. ") - -(defvar slime-trace-dialog--specs-overlay nil) - -(defvar slime-trace-dialog--progress-overlay nil) - -(defvar slime-trace-dialog--tree-overlay nil) - -(defvar slime-trace-dialog--collapse-chars (cons "-" "+")) - - -;;;; Local trace entry model -(defvar slime-trace-dialog--traces nil) - -(cl-defstruct (slime-trace-dialog--trace - (:constructor slime-trace-dialog--make-trace)) - id - parent - spec - args - retlist - depth - beg - end - collapse-button-marker - summary-beg - children-end - collapsed-p) - -(defun slime-trace-dialog--find-trace (id) - (gethash id slime-trace-dialog--traces)) - - -;;;; Modes and mode maps -;;; -(defvar slime-trace-dialog-mode-map - (let ((map (make-sparse-keymap)) - (remaps '((slime-inspector-operate-on-point . nil) - (slime-inspector-operate-on-click . nil) - (slime-inspector-reinspect - . slime-trace-dialog-fetch-status) - (slime-inspector-next-inspectable-object - . slime-trace-dialog-next-button) - (slime-inspector-previous-inspectable-object - . slime-trace-dialog-prev-button)))) - (set-keymap-parent map slime-inspector-mode-map) - (cl-loop for (old . new) in remaps - do (substitute-key-definition old new map)) - (set-keymap-parent map slime-parent-map) - (define-key map (kbd "G") 'slime-trace-dialog-fetch-traces) - (define-key map (kbd "C-k") 'slime-trace-dialog-clear-fetched-traces) - (define-key map (kbd "g") 'slime-trace-dialog-fetch-status) - (define-key map (kbd "M-RET") 'slime-trace-dialog-copy-down-to-repl) - (define-key map (kbd "q") 'quit-window) - map)) - -(define-derived-mode slime-trace-dialog-mode fundamental-mode - "SLIME Trace Dialog" "Mode for controlling SLIME's Trace Dialog" - (set-syntax-table lisp-mode-syntax-table) - (read-only-mode 1) - (add-to-list (make-local-variable 'slime-trace-dialog-after-toggle-hook) - 'slime-trace-dialog-fetch-status)) - -(define-derived-mode slime-trace-dialog--detail-mode slime-inspector-mode - "SLIME Trace Detail" - "Mode for viewing a particular trace from SLIME's Trace Dialog") - -(setq slime-trace-dialog--detail-mode-map - (let ((map (make-sparse-keymap)) - (remaps '((slime-inspector-next-inspectable-object - . slime-trace-dialog-next-button) - (slime-inspector-previous-inspectable-object - . slime-trace-dialog-prev-button)))) - (set-keymap-parent map slime-trace-dialog-mode-map) - (cl-loop for (old . new) in remaps - do (substitute-key-definition old new map)) - map)) - -(defvar slime-trace-dialog-minor-mode-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "C-c T") 'slime-trace-dialog) - (define-key map (kbd "C-c M-t") 'slime-trace-dialog-toggle-trace) - map)) - -(define-minor-mode slime-trace-dialog-minor-mode - "Add keybindings for accessing SLIME's Trace Dialog.") - -(defun slime-trace-dialog-enable () - (slime-trace-dialog-minor-mode 1)) - -(easy-menu-define slime-trace-dialog--menubar (list slime-trace-dialog-minor-mode-map - slime-trace-dialog-mode-map) - "A menu for accessing some features of SLIME's Trace Dialog" - (let* ((in-dialog '(eq major-mode 'slime-trace-dialog-mode)) - (dialog-live `(and ,in-dialog - (memq slime-buffer-connection slime-net-processes))) - (connected '(slime-connected-p))) - `("Trace" - ["Toggle trace" slime-trace-dialog-toggle-trace ,connected] - ["Trace complex spec" slime-trace-dialog-toggle-complex-trace ,connected] - ["Open Trace dialog" slime-trace-dialog (and ,connected (not ,in-dialog))] - "--" - [ "Refresh traces and progress" slime-trace-dialog-fetch-status ,dialog-live] - [ "Fetch next batch" slime-trace-dialog-fetch-traces ,dialog-live] - [ "Clear all fetched traces" slime-trace-dialog-clear-fetched-traces ,dialog-live] - [ "Toggle details" slime-trace-dialog-hide-details-mode ,in-dialog] - [ "Toggle autofollow" slime-trace-dialog-autofollow-mode ,in-dialog]))) - -(define-minor-mode slime-trace-dialog-hide-details-mode - "Hide details in `slime-trace-dialog-mode'" - nil " Brief" - :group 'slime-trace-dialog - (unless (derived-mode-p 'slime-trace-dialog-mode) - (error "Not a SLIME Trace Dialog buffer")) - (slime-trace-dialog--set-hide-details-mode)) - -(define-minor-mode slime-trace-dialog-autofollow-mode - "Automatically open buffers with trace details from `slime-trace-dialog-mode'" - nil " Autofollow" - :group 'slime-trace-dialog - (unless (derived-mode-p 'slime-trace-dialog-mode) - (error "Not a SLIME Trace Dialog buffer"))) - - -;;;; Helper functions -;;; -(defun slime-trace-dialog--call-refreshing (buffer - overlay - dont-erase - recover-point-p - fn) - (with-current-buffer buffer - (let ((inhibit-point-motion-hooks t) - (inhibit-read-only t) - (saved (point))) - (save-restriction - (when overlay - (narrow-to-region (overlay-start overlay) - (overlay-end overlay))) - (unwind-protect - (if dont-erase - (goto-char (point-max)) - (delete-region (point-min) (point-max))) - (funcall fn) - (when recover-point-p - (goto-char saved))) - (when slime-trace-dialog-flash - (slime-flash-region (point-min) (point-max))))) - buffer)) - -(cl-defmacro slime-trace-dialog--refresh ((&key - overlay - dont-erase - recover-point-p - buffer) - &rest body) - (declare (indent 1) - (debug (sexp &rest form))) - `(slime-trace-dialog--call-refreshing ,(or buffer - `(current-buffer)) - ,overlay - ,dont-erase - ,recover-point-p - #'(lambda () ,@body))) - -(defmacro slime-trace-dialog--insert-and-overlay (string overlay) - `(save-restriction - (let ((inhibit-read-only t)) - (narrow-to-region (point) (point)) - (insert ,string "\n") - (set (make-local-variable ',overlay) - (let ((overlay (make-overlay (point-min) - (point-max) - (current-buffer) - nil - t))) - (move-overlay overlay (overlay-start overlay) - (1- (overlay-end overlay))) - ;; (overlay-put overlay 'face '(:background "darkslategrey")) - overlay))))) - -(defun slime-trace-dialog--buffer-name () - (format "*traces for %s*" - (slime-connection-name slime-default-connection))) - -(defun slime-trace-dialog--live-dialog (&optional buffer-or-name) - (let ((buffer-or-name (or buffer-or-name - (slime-trace-dialog--buffer-name)))) - (and (buffer-live-p (get-buffer buffer-or-name)) - (with-current-buffer buffer-or-name - (memq slime-buffer-connection slime-net-processes)) - buffer-or-name))) - -(defun slime-trace-dialog--ensure-buffer () - (let ((name (slime-trace-dialog--buffer-name))) - (or (slime-trace-dialog--live-dialog name) - (with-current-buffer (get-buffer-create name) - (let ((inhibit-read-only t)) - (erase-buffer)) - (slime-trace-dialog-mode) - (save-excursion - (buffer-disable-undo) - (slime-trace-dialog--insert-and-overlay - "[waiting for the traced specs to be available]" - slime-trace-dialog--specs-overlay) - (slime-trace-dialog--insert-and-overlay - "[waiting for some info on trace download progress ]" - slime-trace-dialog--progress-overlay) - (slime-trace-dialog--insert-and-overlay - "[waiting for the actual traces to be available]" - slime-trace-dialog--tree-overlay) - (current-buffer)) - (setq slime-buffer-connection slime-default-connection) - (current-buffer))))) - -(defun slime-trace-dialog--make-autofollow-fn (id) - (let ((requested nil)) - #'(lambda (_before after) - (let ((inhibit-point-motion-hooks t) - (id-after (get-text-property after 'slime-trace-dialog--id))) - (when (and (= after (point)) - slime-trace-dialog-autofollow-mode - id-after - (= id-after id) - (not requested)) - (setq requested t) - (slime-eval-async `(swank-trace-dialog:report-trace-detail - ,id-after) - #'(lambda (detail) - (setq requested nil) - (when detail - (let ((inhibit-point-motion-hooks t)) - (slime-trace-dialog--open-detail detail - 'no-pop)))))))))) - -(defun slime-trace-dialog--set-collapsed (collapsed-p trace button) - (save-excursion - (setf (slime-trace-dialog--trace-collapsed-p trace) collapsed-p) - (slime-trace-dialog--go-replace-char-at - button - (if collapsed-p - (cdr slime-trace-dialog--collapse-chars) - (car slime-trace-dialog--collapse-chars))) - (slime-trace-dialog--hide-unhide - (slime-trace-dialog--trace-summary-beg trace) - (slime-trace-dialog--trace-end trace) - (if collapsed-p 1 -1)) - (slime-trace-dialog--hide-unhide - (slime-trace-dialog--trace-end trace) - (slime-trace-dialog--trace-children-end trace) - (if collapsed-p 1 -1)))) - -(defun slime-trace-dialog--hide-unhide (start-pos end-pos delta) - (cl-loop with inhibit-read-only = t - for pos = start-pos then next - for next = (next-single-property-change - pos - 'slime-trace-dialog--hidden-level - nil - end-pos) - for hidden-level = (+ (or (get-text-property - pos - 'slime-trace-dialog--hidden-level) - 0) - delta) - do (add-text-properties pos next - (list 'slime-trace-dialog--hidden-level - hidden-level - 'invisible - (cl-plusp hidden-level))) - while (< next end-pos))) - -(defun slime-trace-dialog--set-hide-details-mode () - (cl-loop for trace being the hash-values of slime-trace-dialog--traces - do (slime-trace-dialog--hide-unhide - (slime-trace-dialog--trace-summary-beg trace) - (slime-trace-dialog--trace-end trace) - (if slime-trace-dialog-hide-details-mode 1 -1)))) - -(defun slime-trace-dialog--format-part (part-id part-text trace-id type) - (slime-trace-dialog--button - (format "%s" part-text) - #'(lambda (_button) - (slime-eval-async - `(swank-trace-dialog:inspect-trace-part ,trace-id ,part-id ,type) - #'slime-open-inspector)) - 'mouse-face 'highlight - 'slime-trace-dialog--part-id part-id - 'slime-trace-dialog--type type - 'face 'slime-inspector-value-face)) - -(defun slime-trace-dialog--format-trace-entry (id external) - (slime-trace-dialog--button - (format "%s" external) - #'(lambda (_button) - (slime-eval-async - `(swank::inspect-object (swank-trace-dialog::find-trace ,id)) - #'slime-open-inspector)) - 'face 'slime-inspector-value-face)) - -(defun slime-trace-dialog--format (fmt-string &rest args) - (let* ((string (apply #'format fmt-string args)) - (indent (make-string (max 2 - (- 50 (length string))) ? ))) - (format "%s%s" string indent))) - -(defun slime-trace-dialog--button (title lambda &rest props) - (let ((string (format "%s" title))) - (apply #'make-text-button string nil - 'action #'(lambda (button) - (funcall lambda button)) - 'mouse-face 'highlight - 'face 'slime-inspector-action-face - props) - string)) - -(defun slime-trace-dialog--call-maintaining-properties (pos fn) - (save-excursion - (goto-char pos) - (let* ((saved-props (text-properties-at pos)) - (saved-point (point)) - (inhibit-read-only t) - (inhibit-point-motion-hooks t)) - (funcall fn) - (add-text-properties saved-point (point) saved-props) - (if (markerp pos) (set-marker pos saved-point))))) - -(cl-defmacro slime-trace-dialog--maintaining-properties (pos - &body body) - (declare (indent 1)) - `(slime-trace-dialog--call-maintaining-properties ,pos #'(lambda () ,@body))) - -(defun slime-trace-dialog--go-replace-char-at (pos char) - (slime-trace-dialog--maintaining-properties pos - (delete-char 1) - (insert char))) - - -;;;; Handlers for the *trace-dialog* and *trace-detail* buffers -;;; -(defun slime-trace-dialog--open-specs (traced-specs) - (cl-labels ((make-report-spec-fn - (&optional form) - #'(lambda (_button) - (slime-eval-async - `(cl:progn - ,form - (swank-trace-dialog:report-specs)) - #'(lambda (results) - (slime-trace-dialog--open-specs results)))))) - (slime-trace-dialog--refresh - (:overlay slime-trace-dialog--specs-overlay - :recover-point-p t) - (insert - (slime-trace-dialog--format "Traced specs (%s)" (length traced-specs)) - (slime-trace-dialog--button "[refresh]" - (make-report-spec-fn)) - "\n" (make-string 50 ? ) - (slime-trace-dialog--button - "[untrace all]" - (make-report-spec-fn `(swank-trace-dialog:dialog-untrace-all))) - "\n\n") - (cl-loop for spec in traced-specs - do (insert - " " - (slime-trace-dialog--button - "[untrace]" - (make-report-spec-fn - `(swank-trace-dialog:dialog-untrace ',spec))) - (format " %s" spec) - "\n"))))) - -(defvar slime-trace-dialog--fetch-key nil) - -(defvar slime-trace-dialog--stop-fetching nil) - -(defun slime-trace-dialog--update-progress (total &optional show-stop-p remaining-p) - ;; `remaining-p' indicates `total' is the number of remaining traces. - (slime-trace-dialog--refresh - (:overlay slime-trace-dialog--progress-overlay - :recover-point-p t) - (let* ((done (hash-table-count slime-trace-dialog--traces)) - (total (if remaining-p (+ done total) total))) - (insert - (slime-trace-dialog--format "Trace collection status (%d/%s)" - done - (or total "0")) - (slime-trace-dialog--button "[refresh]" - #'(lambda (_button) - (slime-trace-dialog-fetch-progress)))) - - (when (and total (cl-plusp (- total done))) - (insert "\n" (make-string 50 ? ) - (slime-trace-dialog--button - "[fetch next batch]" - #'(lambda (_button) - (slime-trace-dialog-fetch-traces nil))) - "\n" (make-string 50 ? ) - (slime-trace-dialog--button - "[fetch all]" - #'(lambda (_button) - (slime-trace-dialog-fetch-traces t))))) - (when total - (insert "\n" (make-string 50 ? ) - (slime-trace-dialog--button - "[clear]" - #'(lambda (_button) - (slime-trace-dialog-clear-fetched-traces))))) - (when show-stop-p - (insert "\n" (make-string 50 ? ) - (slime-trace-dialog--button - "[stop]" - #'(lambda (_button) - (setq slime-trace-dialog--stop-fetching t))))) - (insert "\n\n")))) - -(defun slime-trace-dialog--open-detail (trace-tuple &optional no-pop) - (slime-with-popup-buffer ("*trace-detail*" :select (not no-pop) - :mode 'slime-trace-dialog--detail-mode) - (cl-destructuring-bind (id _parent-id _spec args retlist backtrace external) - trace-tuple - (let ((headline (slime-trace-dialog--format-trace-entry id external))) - (setq headline (format "%s\n%s\n" - headline - (make-string (length headline) ?-))) - (insert headline)) - (cl-loop for (type objects label) - in `((:arg ,args "Called with args:") - (:retval ,retlist "Returned values:")) - do (insert (format "\n%s\n" label)) - (insert (cl-loop for object in objects - for i from 0 - concat (format " %s: %s\n" i - (slime-trace-dialog--format-part - (cl-first object) - (cl-second object) - id - type))))) - (when backtrace - (insert "\nBacktrace:\n" - (cl-loop for (i spec) in backtrace - concat (format " %s: %s\n" i spec))))))) - - -;;;; Rendering traces -;;; -(defun slime-trace-dialog--draw-tree-lines (start offset direction) - (save-excursion - (let ((inhibit-point-motion-hooks t)) - (goto-char start) - (cl-loop with replace-set = (if (eq direction 'down) - '(? ) - '(? ?`)) - for line-beginning = (line-beginning-position - (if (eq direction 'down) - 2 0)) - for pos = (+ line-beginning offset) - while (and (< (point-min) line-beginning) - (< line-beginning (point-max)) - (memq (char-after pos) replace-set)) - do - (slime-trace-dialog--go-replace-char-at pos "|") - (goto-char pos))))) - -(defun slime-trace-dialog--make-indent (depth suffix) - (concat (make-string (* 3 (max 0 (1- depth))) ? ) - (if (cl-plusp depth) suffix))) - -(defun slime-trace-dialog--make-collapse-button (trace) - (slime-trace-dialog--button (if (slime-trace-dialog--trace-collapsed-p trace) - (cdr slime-trace-dialog--collapse-chars) - (car slime-trace-dialog--collapse-chars)) - #'(lambda (button) - (slime-trace-dialog--set-collapsed - (not (slime-trace-dialog--trace-collapsed-p - trace)) - trace - button)))) - - -(defun slime-trace-dialog--insert-trace (trace) - (let* ((id (slime-trace-dialog--trace-id trace)) - (parent (slime-trace-dialog--trace-parent trace)) - (has-children-p (slime-trace-dialog--trace-children-end trace)) - (indent-spec (slime-trace-dialog--make-indent - (slime-trace-dialog--trace-depth trace) - "`--")) - (indent-summary (slime-trace-dialog--make-indent - (slime-trace-dialog--trace-depth trace) - " ")) - (autofollow-fn (slime-trace-dialog--make-autofollow-fn id)) - (id-string (slime-trace-dialog--button - (format "%4s" id) - #'(lambda (_button) - (slime-eval-async - `(swank-trace-dialog:report-trace-detail - ,id) - #'slime-trace-dialog--open-detail)))) - (spec (slime-trace-dialog--trace-spec trace)) - (summary (cl-loop for (type objects marker) in - `((:arg ,(slime-trace-dialog--trace-args trace) - " > ") - (:retval ,(slime-trace-dialog--trace-retlist trace) - " < ")) - concat (cl-loop for object in objects - concat " " - concat indent-summary - concat marker - concat (slime-trace-dialog--format-part - (cl-first object) - (cl-second object) - id - type) - concat "\n")))) - (puthash id trace slime-trace-dialog--traces) - ;; insert and propertize the text - ;; - (setf (slime-trace-dialog--trace-beg trace) (point-marker)) - (insert id-string " ") - (insert indent-spec) - (if has-children-p - (insert (slime-trace-dialog--make-collapse-button trace)) - (setf (slime-trace-dialog--trace-collapse-button-marker trace) - (point-marker)) - (insert "-")) - (insert (format " %s\n" spec)) - (setf (slime-trace-dialog--trace-summary-beg trace) (point-marker)) - (insert summary) - (setf (slime-trace-dialog--trace-end trace) (point-marker)) - (set-marker-insertion-type (slime-trace-dialog--trace-beg trace) t) - - (add-text-properties (slime-trace-dialog--trace-beg trace) - (slime-trace-dialog--trace-end trace) - (list 'slime-trace-dialog--id id - 'point-entered autofollow-fn - 'point-left autofollow-fn)) - ;; respect brief mode and collapsed state - ;; - (cl-loop for condition in (list slime-trace-dialog-hide-details-mode - (slime-trace-dialog--trace-collapsed-p trace)) - when condition - do (slime-trace-dialog--hide-unhide - (slime-trace-dialog--trace-summary-beg - trace) - (slime-trace-dialog--trace-end trace) - 1)) - (cl-loop for tr = trace then parent - for parent = (slime-trace-dialog--trace-parent tr) - while parent - when (slime-trace-dialog--trace-collapsed-p parent) - do (slime-trace-dialog--hide-unhide - (slime-trace-dialog--trace-beg trace) - (slime-trace-dialog--trace-end trace) - (+ 1 - (or (get-text-property (slime-trace-dialog--trace-beg parent) - 'slime-trace-dialog--hidden-level) - 0))) - (cl-return)) - ;; maybe add the collapse-button to the parent in case it didn't - ;; have one already - ;; - (when (and parent - (slime-trace-dialog--trace-collapse-button-marker parent)) - (slime-trace-dialog--maintaining-properties - (slime-trace-dialog--trace-collapse-button-marker parent) - (delete-char 1) - (insert (slime-trace-dialog--make-collapse-button parent)) - (setf (slime-trace-dialog--trace-collapse-button-marker parent) - nil))) - ;; draw the tree lines - ;; - (when parent - (slime-trace-dialog--draw-tree-lines (slime-trace-dialog--trace-beg trace) - (+ 2 (length indent-spec)) - 'up)) - (when has-children-p - (slime-trace-dialog--draw-tree-lines (slime-trace-dialog--trace-beg trace) - (+ 5 (length indent-spec)) - 'down)) - ;; set the "children-end" slot - ;; - (unless (slime-trace-dialog--trace-children-end trace) - (cl-loop for parent = trace - then (slime-trace-dialog--trace-parent parent) - while parent - do - (setf (slime-trace-dialog--trace-children-end parent) - (slime-trace-dialog--trace-end trace)))))) - -(defun slime-trace-dialog--render-trace (trace) - ;; Render the trace entry in the appropriate place. - ;; - ;; A trace becomes a few lines of slightly propertized text in the - ;; buffer, inserted by `slime-trace-dialog--insert-trace', bound by - ;; point markers that we use here. - ;; - ;; The new trace might be replacing an existing one, or otherwise - ;; must be placed under its existing parent which might or might not - ;; be the last entry inserted. - ;; - (let ((existing (slime-trace-dialog--find-trace - (slime-trace-dialog--trace-id trace))) - (parent (slime-trace-dialog--trace-parent trace))) - (cond (existing - ;; Other traces might already reference `existing' and with - ;; need to maintain that eqness. Best way to do that is - ;; destructively modify `existing' with the new retlist... - ;; - (setf (slime-trace-dialog--trace-retlist existing) - (slime-trace-dialog--trace-retlist trace)) - ;; Now, before deleting and re-inserting `existing' at an - ;; arbitrary point in the tree, note that it's - ;; "children-end" marker is already non-nil, and informs us - ;; about its parenthood status. We want to 1. leave it - ;; alone if it's already a parent, or 2. set it to nil if - ;; it's a leaf, thus forcing the needed update of the - ;; parents' "children-end" marker. - ;; - (when (= (slime-trace-dialog--trace-children-end existing) - (slime-trace-dialog--trace-end existing)) - (setf (slime-trace-dialog--trace-children-end existing) nil)) - (delete-region (slime-trace-dialog--trace-beg existing) - (slime-trace-dialog--trace-end existing)) - (goto-char (slime-trace-dialog--trace-end existing)) - ;; Remember to set `trace' to be `existing' - ;; - (setq trace existing)) - (parent - (goto-char (1+ (slime-trace-dialog--trace-children-end parent)))) - (;; top level trace - t - (goto-char (point-max)))) - (goto-char (line-beginning-position)) - (slime-trace-dialog--insert-trace trace))) - -(defun slime-trace-dialog--update-tree (tuples) - (save-excursion - (slime-trace-dialog--refresh - (:overlay slime-trace-dialog--tree-overlay - :dont-erase t) - (cl-loop for tuple in tuples - for parent = (slime-trace-dialog--find-trace (cl-second tuple)) - for trace = (slime-trace-dialog--make-trace - :id (cl-first tuple) - :parent parent - :spec (cl-third tuple) - :args (cl-fourth tuple) - :retlist (cl-fifth tuple) - :depth (if parent - (1+ (slime-trace-dialog--trace-depth - parent)) - 0)) - do (slime-trace-dialog--render-trace trace))))) - -(defun slime-trace-dialog--clear-local-tree () - (set (make-local-variable 'slime-trace-dialog--fetch-key) - (cl-gensym "slime-trace-dialog-fetch-key-")) - (set (make-local-variable 'slime-trace-dialog--traces) - (make-hash-table)) - (slime-trace-dialog--refresh - (:overlay slime-trace-dialog--tree-overlay)) - (slime-trace-dialog--update-progress nil)) - -(defun slime-trace-dialog--on-new-results (results &optional recurse) - (cl-destructuring-bind (tuples remaining reply-key) - results - (cond ((and slime-trace-dialog--fetch-key - (string= (symbol-name slime-trace-dialog--fetch-key) - (symbol-name reply-key))) - (slime-trace-dialog--update-tree tuples) - (slime-trace-dialog--update-progress - remaining - (and recurse - (cl-plusp remaining)) - t) - (when (and recurse - (not (prog1 slime-trace-dialog--stop-fetching - (setq slime-trace-dialog--stop-fetching nil))) - (cl-plusp remaining)) - (slime-eval-async `(swank-trace-dialog:report-partial-tree - ',reply-key) - #'(lambda (results) (slime-trace-dialog--on-new-results - results - recurse)))))))) - - -;;;; Interactive functions -;;; -(defun slime-trace-dialog-fetch-specs () - "Refresh just list of traced specs." - (interactive) - (slime-eval-async `(swank-trace-dialog:report-specs) - #'slime-trace-dialog--open-specs)) - -(defun slime-trace-dialog-fetch-progress () - (interactive) - (slime-eval-async - '(swank-trace-dialog:report-total) - #'(lambda (total) - (slime-trace-dialog--update-progress - total)))) - -(defun slime-trace-dialog-fetch-status () - "Refresh just the status part of the SLIME Trace Dialog" - (interactive) - (slime-trace-dialog-fetch-specs) - (slime-trace-dialog-fetch-progress)) - -(defun slime-trace-dialog-clear-fetched-traces (&optional interactive) - "Clear local and remote traces collected so far" - (interactive "p") - (when (or (not interactive) - (y-or-n-p "Clear all collected and fetched traces?")) - (slime-eval-async - '(swank-trace-dialog:clear-trace-tree) - #'(lambda (_ignored) - (slime-trace-dialog--clear-local-tree))))) - -(defun slime-trace-dialog-fetch-traces (&optional recurse) - (interactive "P") - (setq slime-trace-dialog--stop-fetching nil) - (slime-eval-async `(swank-trace-dialog:report-partial-tree - ',slime-trace-dialog--fetch-key) - #'(lambda (results) (slime-trace-dialog--on-new-results results - recurse)))) - -(defun slime-trace-dialog-next-button (&optional goback) - (interactive) - (let ((finder (if goback - #'previous-single-property-change - #'next-single-property-change))) - (cl-loop for pos = (funcall finder (point) 'action) - while pos - do (goto-char pos) - until (get-text-property pos 'action)))) - -(defun slime-trace-dialog-prev-button () - (interactive) - (slime-trace-dialog-next-button 'goback)) - -(defvar slime-trace-dialog-after-toggle-hook nil - "Hooks run after toggling a dialog-trace") - -(defun slime-trace-dialog-toggle-trace (&optional using-context-p) - "Toggle the dialog-trace of the spec at point. - -When USING-CONTEXT-P, attempt to decipher lambdas. methods and -other complicated function specs." - (interactive "P") - ;; Notice the use of "spec strings" here as opposed to the - ;; proper cons specs we use on the swank side. - ;; - ;; Notice the conditional use of `slime-trace-query' found in - ;; swank-fancy-trace.el - ;; - (let* ((spec-string (if using-context-p - (slime-extract-context) - (slime-symbol-at-point))) - (spec-string (if (fboundp 'slime-trace-query) - (slime-trace-query spec-string) - spec-string))) - (message "%s" (slime-eval `(swank-trace-dialog:dialog-toggle-trace - (swank::from-string ,spec-string)))) - (run-hooks 'slime-trace-dialog-after-toggle-hook))) - -(defun slime-trace-dialog--update-existing-dialog () - (let ((existing (slime-trace-dialog--live-dialog))) - (when existing - (with-current-buffer existing - (slime-trace-dialog-fetch-status))))) - -(add-hook 'slime-trace-dialog-after-toggle-hook - 'slime-trace-dialog--update-existing-dialog) - -(defun slime-trace-dialog-toggle-complex-trace () - "Toggle the dialog-trace of the complex spec at point. - -See `slime-trace-dialog-toggle-trace'." - (interactive) - (slime-trace-dialog-toggle-trace t)) - -(defun slime-trace-dialog (&optional clear-and-fetch) - "Show trace dialog and refresh trace collection status. - -With optional CLEAR-AND-FETCH prefix arg, clear the current tree -and fetch a first batch of traces." - (interactive "P") - (with-current-buffer - (pop-to-buffer (slime-trace-dialog--ensure-buffer)) - (slime-trace-dialog-fetch-status) - (when (or clear-and-fetch - (null slime-trace-dialog--fetch-key)) - (slime-trace-dialog--clear-local-tree)) - (when clear-and-fetch - (slime-trace-dialog-fetch-traces nil)))) - -(defun slime-trace-dialog-copy-down-to-repl (id part-id type) - "Eval the Trace Dialog entry under point in the REPL (to set *)" - (interactive (cl-loop for prop in '(slime-trace-dialog--id - slime-trace-dialog--part-id - slime-trace-dialog--type) - collect (get-text-property (point) prop))) - (unless (and id part-id type) (error "No trace part at point %s" (point))) - (slime-repl-send-string - (format "%s" `(nth-value 0 - (swank-trace-dialog::find-trace-part - ,id ,part-id ,type)))) - (slime-repl)) - -(provide 'slime-trace-dialog) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-tramp.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-tramp.el deleted file mode 100644 index 1e3f14c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-tramp.el +++ /dev/null @@ -1,121 +0,0 @@ -(require 'slime) -(require 'tramp) -(eval-when-compile (require 'cl)) ; lexical-let - -(define-slime-contrib slime-tramp - "Filename translations for tramp" - (:authors "Marco Baringer ") - (:license "GPL") - (:on-load - (setq slime-to-lisp-filename-function #'slime-tramp-to-lisp-filename) - (setq slime-from-lisp-filename-function #'slime-tramp-from-lisp-filename))) - -(defcustom slime-filename-translations nil - "Assoc list of hostnames and filename translation functions. -Each element is of the form (HOSTNAME-REGEXP TO-LISP FROM-LISP). - -HOSTNAME-REGEXP is a regexp which is applied to the connection's -slime-machine-instance. If HOSTNAME-REGEXP maches then the -corresponding TO-LISP and FROM-LISP functions will be used to -translate emacs filenames and lisp filenames. - -TO-LISP will be passed the filename of an emacs buffer and must -return a string which the underlying lisp understandas as a -pathname. FROM-LISP will be passed a pathname as returned by the -underlying lisp and must return something that emacs will -understand as a filename (this string will be passed to -find-file). - -This list will be traversed in order, so multiple matching -regexps are possible. - -Example: - -Assuming you run emacs locally and connect to slime running on -the machine 'soren' and you can connect with the username -'animaliter': - - (push (list \"^soren$\" - (lambda (emacs-filename) - (subseq emacs-filename (length \"/ssh:animaliter@soren:\"))) - (lambda (lisp-filename) - (concat \"/ssh:animaliter@soren:\" lisp-filename))) - slime-filename-translations) - -See also `slime-create-filename-translator'." - :type '(repeat (list :tag "Host description" - (regexp :tag "Hostname regexp") - (function :tag "To lisp function") - (function :tag "From lisp function"))) - :group 'slime-lisp) - -(defun slime-find-filename-translators (hostname) - (cond ((cdr (cl-assoc-if (lambda (regexp) (string-match regexp hostname)) - slime-filename-translations))) - (t (list #'identity #'identity)))) - -(defun slime-make-tramp-file-name (username remote-host lisp-filename) - "Tramp compatability function. - -Handles the signature of `tramp-make-tramp-file-name' changing -over time." - (cond - ((>= emacs-major-version 26) - ;; Emacs 26 requires the method to be provided and the signature of - ;; `tramp-make-tramp-file-name' has changed. - (tramp-make-tramp-file-name (tramp-find-method nil username remote-host) - username - nil - remote-host - nil - lisp-filename)) - ((boundp 'tramp-multi-methods) - (tramp-make-tramp-file-name nil nil - username - remote-host - lisp-filename)) - (t - (tramp-make-tramp-file-name nil - username - remote-host - lisp-filename)))) - -(cl-defun slime-create-filename-translator (&key machine-instance - remote-host - username) - "Creates a three element list suitable for push'ing onto -slime-filename-translations which uses Tramp to load files on -hostname using username. MACHINE-INSTANCE is a required -parameter, REMOTE-HOST defaults to MACHINE-INSTANCE and USERNAME -defaults to (user-login-name). - -MACHINE-INSTANCE is the value returned by slime-machine-instance, -which is just the value returned by cl:machine-instance on the -remote lisp. REMOTE-HOST is the fully qualified domain name (or -just the IP) of the remote machine. USERNAME is the username we -should login with. -The functions created here expect your tramp-default-method or - tramp-default-method-alist to be setup correctly." - (lexical-let ((remote-host (or remote-host machine-instance)) - (username (or username (user-login-name)))) - (list (concat "^" machine-instance "$") - (lambda (emacs-filename) - (tramp-file-name-localname - (tramp-dissect-file-name emacs-filename))) - `(lambda (lisp-filename) - (slime-make-tramp-file-name - ,username - ,remote-host - lisp-filename))))) - -(defun slime-tramp-to-lisp-filename (filename) - (funcall (if (slime-connected-p) - (first (slime-find-filename-translators (slime-machine-instance))) - 'identity) - (expand-file-name filename))) - -(defun slime-tramp-from-lisp-filename (filename) - (funcall (second (slime-find-filename-translators (slime-machine-instance))) - filename)) - -(provide 'slime-tramp) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-typeout-frame.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-typeout-frame.el deleted file mode 100644 index 7979b19..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-typeout-frame.el +++ /dev/null @@ -1,92 +0,0 @@ -(require 'slime) -(require 'slime-autodoc) -(require 'cl-lib) - -(defvar slime-typeout-frame-unbind-stack ()) - -(define-slime-contrib slime-typeout-frame - "Display messages in a dedicated frame." - (:authors "Luke Gorrie ") - (:license "GPL") - (:on-load - (unless (slime-typeout-tty-only-p) - (add-hook 'slime-connected-hook 'slime-ensure-typeout-frame) - (add-hook 'slime-autodoc-mode-hook 'slime-typeout-wrap-autodoc) - (cl-loop for (var value) in - '((slime-message-function slime-typeout-message) - (slime-background-message-function slime-typeout-message)) - do (slime-typeout-frame-init-var var value)))) - (:on-unload - (remove-hook 'slime-connected-hook 'slime-ensure-typeout-frame) - (remove-hook 'slime-autodoc-mode-hook 'slime-typeout-wrap-autodoc) - (cl-loop for (var value) in slime-typeout-frame-unbind-stack - do (cond ((eq var 'slime-unbound) (makunbound var)) - (t (set var value)))) - (setq slime-typeout-frame-unbind-stack nil))) - -(defun slime-typeout-frame-init-var (var value) - (push (list var (if (boundp var) (symbol-value var) 'slime-unbound)) - slime-typeout-frame-unbind-stack) - (set var value)) - -(defun slime-typeout-tty-only-p () - (cond ((featurep 'xemacs) - (null (remove 'tty (mapcar #'device-type (console-device-list))))) - (t (not (window-system))))) - - -;;;; Typeout frame - -;; When a "typeout frame" exists it is used to display certain -;; messages instead of the echo area or pop-up windows. - -(defvar slime-typeout-window nil - "The current typeout window.") - -(defvar slime-typeout-frame-properties - '((height . 10) (minibuffer . nil)) - "The typeout frame properties (passed to `make-frame').") - -(defun slime-typeout-buffer () - (with-current-buffer (get-buffer-create (slime-buffer-name :typeout)) - (setq buffer-read-only t) - (current-buffer))) - -(defun slime-typeout-active-p () - (and slime-typeout-window - (window-live-p slime-typeout-window))) - -(defun slime-typeout-message-aux (format-string &rest format-args) - (slime-ensure-typeout-frame) - (with-current-buffer (slime-typeout-buffer) - (let ((inhibit-read-only t) - (msg (apply #'format format-string format-args))) - (unless (string= msg "") - (erase-buffer) - (insert msg))))) - -(defun slime-typeout-message (format-string &rest format-args) - (apply #'slime-typeout-message-aux format-string format-args)) - -(defun slime-make-typeout-frame () - "Create a frame for displaying messages (e.g. arglists)." - (interactive) - (let ((frame (make-frame slime-typeout-frame-properties))) - (save-selected-window - (select-window (frame-selected-window frame)) - (switch-to-buffer (slime-typeout-buffer)) - (setq slime-typeout-window (selected-window))))) - -(defun slime-ensure-typeout-frame () - "Create the typeout frame unless it already exists." - (interactive) - (if (slime-typeout-active-p) - (save-selected-window - (select-window slime-typeout-window) - (switch-to-buffer (slime-typeout-buffer))) - (slime-make-typeout-frame))) - -(defun slime-typeout-wrap-autodoc () - (setq eldoc-message-function 'slime-typeout-message-aux)) - -(provide 'slime-typeout-frame) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-xref-browser.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-xref-browser.el deleted file mode 100644 index 45a7ad8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/slime-xref-browser.el +++ /dev/null @@ -1,99 +0,0 @@ -(eval-and-compile - (require 'slime)) - -(define-slime-contrib slime-xref-browser - "Xref browsing with tree-widget" - (:authors "Rui Patrocínio ") - (:license "GPL")) - - -;;;; classes browser - -(defun slime-expand-class-node (widget) - (or (widget-get widget :args) - (let ((name (widget-get widget :tag))) - (cl-loop for kid in (slime-eval `(swank:mop :subclasses ,name)) - collect `(tree-widget :tag ,kid - :expander slime-expand-class-node - :has-children t))))) - -(defun slime-browse-classes (name) - "Read the name of a class and show its subclasses." - (interactive (list (slime-read-symbol-name "Class Name: "))) - (slime-call-with-browser-setup - (slime-buffer-name :browser) (slime-current-package) "Class Browser" - (lambda () - (widget-create 'tree-widget :tag name - :expander 'slime-expand-class-node - :has-echildren t)))) - -(defvar slime-browser-map nil - "Keymap for tree widget browsers") - -(require 'tree-widget) -(unless slime-browser-map - (setq slime-browser-map (make-sparse-keymap)) - (set-keymap-parent slime-browser-map widget-keymap) - (define-key slime-browser-map "q" 'bury-buffer)) - -(defun slime-call-with-browser-setup (buffer package title fn) - (switch-to-buffer buffer) - (kill-all-local-variables) - (setq slime-buffer-package package) - (let ((inhibit-read-only t)) (erase-buffer)) - (widget-insert title "\n\n") - (save-excursion - (funcall fn)) - (lisp-mode-variables t) - (slime-mode t) - (use-local-map slime-browser-map) - (widget-setup)) - - -;;;; Xref browser - -(defun slime-fetch-browsable-xrefs (type name) - "Return a list ((LABEL DSPEC)). -LABEL is just a string for display purposes. -DSPEC can be used to expand the node." - (let ((xrefs '())) - (cl-loop for (_file . specs) in (slime-eval `(swank:xref ,type ,name)) do - (cl-loop for (dspec . _location) in specs do - (let ((exp (ignore-errors (read (downcase dspec))))) - (cond ((and (consp exp) (eq 'flet (car exp))) - ;; we can't expand FLET references so they're useless - ) - ((and (consp exp) (eq 'method (car exp))) - ;; this isn't quite right, but good enough for now - (push (list dspec (string (cl-second exp))) xrefs)) - (t - (push (list dspec dspec) xrefs)))))) - xrefs)) - -(defun slime-expand-xrefs (widget) - (or (widget-get widget :args) - (let* ((type (widget-get widget :xref-type)) - (dspec (widget-get widget :xref-dspec)) - (xrefs (slime-fetch-browsable-xrefs type dspec))) - (cl-loop for (label dspec) in xrefs - collect `(tree-widget :tag ,label - :xref-type ,type - :xref-dspec ,dspec - :expander slime-expand-xrefs - :has-children t))))) - -(defun slime-browse-xrefs (name type) - "Show the xref graph of a function in a tree widget." - (interactive - (list (slime-read-from-minibuffer "Name: " - (slime-symbol-at-point)) - (read (completing-read "Type: " (slime-bogus-completion-alist - '(":callers" ":callees" ":calls")) - nil t ":")))) - (slime-call-with-browser-setup - (slime-buffer-name :xref) (slime-current-package) "Xref Browser" - (lambda () - (widget-create 'tree-widget :tag name :xref-type type :xref-dspec name - :expander 'slime-expand-xrefs :has-echildren t)))) - -(provide 'slime-xref-browser) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-arglists.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-arglists.lisp deleted file mode 100644 index 9e35add..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-arglists.lisp +++ /dev/null @@ -1,1620 +0,0 @@ -;;; swank-arglists.lisp --- arglist related code ?? -;; -;; Authors: Matthias Koeppe -;; Tobias C. Rittweiler -;; and others -;; -;; License: Public Domain -;; - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (swank-require :swank-c-p-c)) - -;;;; Utilities - -(defun compose (&rest functions) - "Compose FUNCTIONS right-associatively, returning a function" - #'(lambda (x) - (reduce #'funcall functions :initial-value x :from-end t))) - -(defun length= (seq n) - "Test for whether SEQ contains N number of elements. I.e. it's equivalent - to (= (LENGTH SEQ) N), but besides being more concise, it may also be more - efficiently implemented." - (etypecase seq - (list (do ((i n (1- i)) - (list seq (cdr list))) - ((or (<= i 0) (null list)) - (and (zerop i) (null list))))) - (sequence (= (length seq) n)))) - -(declaim (inline memq)) -(defun memq (item list) - (member item list :test #'eq)) - -(defun exactly-one-p (&rest values) - "If exactly one value in VALUES is non-NIL, this value is returned. -Otherwise NIL is returned." - (let ((found nil)) - (dolist (v values) - (when v (if found - (return-from exactly-one-p nil) - (setq found v)))) - found)) - -(defun valid-operator-symbol-p (symbol) - "Is SYMBOL the name of a function, a macro, or a special-operator?" - (or (fboundp symbol) - (macro-function symbol) - (special-operator-p symbol) - (member symbol '(declare declaim)))) - -(defun function-exists-p (form) - (and (valid-function-name-p form) - (fboundp form) - t)) - -(defmacro multiple-value-or (&rest forms) - (if (null forms) - nil - (let ((first (first forms)) - (rest (rest forms))) - `(let* ((values (multiple-value-list ,first)) - (primary-value (first values))) - (if primary-value - (values-list values) - (multiple-value-or ,@rest)))))) - -(defun arglist-available-p (arglist) - (not (eql arglist :not-available))) - -(defmacro with-available-arglist ((var &rest more-vars) form &body body) - `(multiple-value-bind (,var ,@more-vars) ,form - (if (eql ,var :not-available) - :not-available - (progn ,@body)))) - - -;;;; Arglist Definition - -(defstruct (arglist (:conc-name arglist.) (:predicate arglist-p)) - provided-args ; list of the provided actual arguments - required-args ; list of the required arguments - optional-args ; list of the optional arguments - key-p ; whether &key appeared - keyword-args ; list of the keywords - rest ; name of the &rest or &body argument (if any) - body-p ; whether the rest argument is a &body - allow-other-keys-p ; whether &allow-other-keys appeared - aux-args ; list of &aux variables - any-p ; whether &any appeared - any-args ; list of &any arguments [*] - known-junk ; &whole, &environment - unknown-junk) ; unparsed stuff - -;;; -;;; [*] The &ANY lambda keyword is an extension to ANSI Common Lisp, -;;; and is only used to describe certain arglists that cannot be -;;; described in another way. -;;; -;;; &ANY is very similiar to &KEY but while &KEY is based upon -;;; the idea of a plist (key1 value1 key2 value2), &ANY is a -;;; cross between &OPTIONAL, &KEY and *FEATURES* lists: -;;; -;;; a) (&ANY :A :B :C) means that you can provide any (non-null) -;;; set consisting of the keywords `:A', `:B', or `:C' in -;;; the arglist. E.g. (:A) or (:C :B :A). -;;; -;;; (This is not restricted to keywords only, but any self-evaluating -;;; expression is allowed.) -;;; -;;; b) (&ANY (key1 v1) (key2 v2) (key3 v3)) means that you can -;;; provide any (non-null) set consisting of lists where -;;; the CAR of the list is one of `key1', `key2', or `key3'. -;;; E.g. ((key1 100) (key3 42)), or ((key3 66) (key2 23)) -;;; -;;; -;;; For example, a) let us describe the situations of EVAL-WHEN as -;;; -;;; (EVAL-WHEN (&ANY :compile-toplevel :load-toplevel :execute) &BODY body) -;;; -;;; and b) let us describe the optimization qualifiers that are valid -;;; in the declaration specifier `OPTIMIZE': -;;; -;;; (DECLARE (OPTIMIZE &ANY (compilation-speed 1) (safety 1) ...)) -;;; - -;; This is a wrapper object around anything that came from Slime and -;; could not reliably be read. -(defstruct (arglist-dummy - (:conc-name #:arglist-dummy.) - (:constructor make-arglist-dummy (string-representation))) - string-representation) - -(defun empty-arg-p (dummy) - (and (arglist-dummy-p dummy) - (zerop (length (arglist-dummy.string-representation dummy))))) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defparameter +lambda-list-keywords+ - '(&provided &required &optional &rest &key &any))) - -(defmacro do-decoded-arglist (decoded-arglist &body clauses) - (assert (loop for clause in clauses - thereis (member (car clause) +lambda-list-keywords+))) - (flet ((parse-clauses (clauses) - (let* ((size (length +lambda-list-keywords+)) - (initial (make-hash-table :test #'eq :size size)) - (main (make-hash-table :test #'eq :size size)) - (final (make-hash-table :test #'eq :size size))) - (loop for clause in clauses - for lambda-list-keyword = (first clause) - for clause-parameter = (second clause) - do - (case clause-parameter - (:initially - (setf (gethash lambda-list-keyword initial) clause)) - (:finally - (setf (gethash lambda-list-keyword final) clause)) - (t - (setf (gethash lambda-list-keyword main) clause))) - finally - (return (values initial main final))))) - (generate-main-clause (clause arglist) - (dcase clause - ((&provided (&optional arg) . body) - (let ((gensym (gensym "PROVIDED-ARG+"))) - `(dolist (,gensym (arglist.provided-args ,arglist)) - (declare (ignorable ,gensym)) - (let (,@(when arg `((,arg ,gensym)))) - ,@body)))) - ((&required (&optional arg) . body) - (let ((gensym (gensym "REQUIRED-ARG+"))) - `(dolist (,gensym (arglist.required-args ,arglist)) - (declare (ignorable ,gensym)) - (let (,@(when arg `((,arg ,gensym)))) - ,@body)))) - ((&optional (&optional arg init) . body) - (let ((optarg (gensym "OPTIONAL-ARG+"))) - `(dolist (,optarg (arglist.optional-args ,arglist)) - (declare (ignorable ,optarg)) - (let (,@(when arg - `((,arg (optional-arg.arg-name ,optarg)))) - ,@(when init - `((,init (optional-arg.default-arg ,optarg))))) - ,@body)))) - ((&key (&optional keyword arg init) . body) - (let ((keyarg (gensym "KEY-ARG+"))) - `(dolist (,keyarg (arglist.keyword-args ,arglist)) - (declare (ignorable ,keyarg)) - (let (,@(when keyword - `((,keyword (keyword-arg.keyword ,keyarg)))) - ,@(when arg - `((,arg (keyword-arg.arg-name ,keyarg)))) - ,@(when init - `((,init (keyword-arg.default-arg ,keyarg))))) - ,@body)))) - ((&rest (&optional arg body-p) . body) - `(when (arglist.rest ,arglist) - (let (,@(when arg `((,arg (arglist.rest ,arglist)))) - ,@(when body-p `((,body-p (arglist.body-p ,arglist))))) - ,@body))) - ((&any (&optional arg) . body) - (let ((gensym (gensym "REQUIRED-ARG+"))) - `(dolist (,gensym (arglist.any-args ,arglist)) - (declare (ignorable ,gensym)) - (let (,@(when arg `((,arg ,gensym)))) - ,@body))))))) - (let ((arglist (gensym "DECODED-ARGLIST+"))) - (multiple-value-bind (initially-clauses main-clauses finally-clauses) - (parse-clauses clauses) - `(let ((,arglist ,decoded-arglist)) - (block do-decoded-arglist - ,@(loop for keyword in '(&provided &required - &optional &rest &key &any) - append (cddr (gethash keyword initially-clauses)) - collect (let ((clause (gethash keyword main-clauses))) - (when clause - (generate-main-clause clause arglist))) - append (cddr (gethash keyword finally-clauses))))))))) - -;;;; Arglist Printing - -(defun undummy (x) - (if (typep x 'arglist-dummy) - (arglist-dummy.string-representation x) - (prin1-to-string x))) - -(defun print-decoded-arglist (arglist &key operator provided-args highlight) - (let ((first-space-after-operator (and operator t))) - (macrolet ((space () - ;; Kludge: When OPERATOR is not given, we don't want to - ;; print a space for the first argument. - `(if (not operator) - (setq operator t) - (progn (write-char #\space) - (if first-space-after-operator - (setq first-space-after-operator nil) - (pprint-newline :fill))))) - (with-highlighting ((&key index) &body body) - `(if (eql ,index (car highlight)) - (progn (princ "===> ") ,@body (princ " <===")) - (progn ,@body))) - (print-arglist-recursively (argl &key index) - `(if (eql ,index (car highlight)) - (print-decoded-arglist ,argl :highlight (cdr highlight)) - (print-decoded-arglist ,argl)))) - (let ((index 0)) - (pprint-logical-block (nil nil :prefix "(" :suffix ")") - (when operator - (print-arg operator) - (pprint-indent :current 1)) ; 1 due to possibly added space - (do-decoded-arglist (remove-given-args arglist provided-args) - (&provided (arg) - (space) - (print-arg arg :literal-strings t) - (incf index)) - (&required (arg) - (space) - (if (arglist-p arg) - (print-arglist-recursively arg :index index) - (with-highlighting (:index index) - (print-arg arg))) - (incf index)) - (&optional :initially - (when (arglist.optional-args arglist) - (space) - (princ '&optional))) - (&optional (arg init-value) - (space) - (if (arglist-p arg) - (print-arglist-recursively arg :index index) - (with-highlighting (:index index) - (if (null init-value) - (print-arg arg) - (format t "~:@<~A ~A~@:>" - (undummy arg) (undummy init-value))))) - (incf index)) - (&key :initially - (when (arglist.key-p arglist) - (space) - (princ '&key))) - (&key (keyword arg init) - (space) - (if (arglist-p arg) - (pprint-logical-block (nil nil :prefix "(" :suffix ")") - (prin1 keyword) (space) - (print-arglist-recursively arg :index keyword)) - (with-highlighting (:index keyword) - (cond ((and init (keywordp keyword)) - (format t "~:@<~A ~A~@:>" keyword (undummy init))) - (init - (format t "~:@<(~A ..) ~A~@:>" - (undummy keyword) (undummy init))) - ((not (keywordp keyword)) - (format t "~:@<(~S ..)~@:>" keyword)) - (t - (princ keyword)))))) - (&key :finally - (when (arglist.allow-other-keys-p arglist) - (space) - (princ '&allow-other-keys))) - (&any :initially - (when (arglist.any-p arglist) - (space) - (princ '&any))) - (&any (arg) - (space) - (print-arg arg)) - (&rest (args bodyp) - (space) - (princ (if bodyp '&body '&rest)) - (space) - (if (arglist-p args) - (print-arglist-recursively args :index index) - (with-highlighting (:index index) - (print-arg args)))) - ;; FIXME: add &UNKNOWN-JUNK? - )))))) - -(defun print-arg (arg &key literal-strings) - (let ((arg (if (arglist-dummy-p arg) - (arglist-dummy.string-representation arg) - arg))) - (if (or - (and literal-strings - (stringp arg)) - (keywordp arg)) - (prin1 arg) - (princ arg)))) - -(defun print-decoded-arglist-as-template (decoded-arglist &key - (prefix "(") (suffix ")")) - (let ((first-p t)) - (flet ((space () - (unless first-p - (write-char #\space)) - (setq first-p nil)) - (print-arg-or-pattern (arg) - (etypecase arg - (symbol (if (keywordp arg) (prin1 arg) (princ arg))) - (string (princ arg)) - (list (princ arg)) - (arglist-dummy (princ - (arglist-dummy.string-representation arg))) - (arglist (print-decoded-arglist-as-template arg))) - (pprint-newline :fill))) - (pprint-logical-block (nil nil :prefix prefix :suffix suffix) - (do-decoded-arglist decoded-arglist - (&provided ()) ; do nothing; provided args are in the buffer already. - (&required (arg) - (space) (print-arg-or-pattern arg)) - (&optional (arg) - (space) (princ "[") (print-arg-or-pattern arg) (princ "]")) - (&key (keyword arg) - (space) - (prin1 (if (keywordp keyword) keyword `',keyword)) - (space) - (print-arg-or-pattern arg) - (pprint-newline :linear)) - (&any (arg) - (space) (print-arg-or-pattern arg)) - (&rest (args) - (when (or (not (arglist.keyword-args decoded-arglist)) - (arglist.allow-other-keys-p decoded-arglist)) - (space) - (format t "~A..." args)))))))) - -(defvar *arglist-pprint-bindings* - '((*print-case* . :downcase) - (*print-pretty* . t) - (*print-circle* . nil) - (*print-readably* . nil) - (*print-level* . 10) - (*print-length* . 20) - (*print-escape* . nil))) - -(defvar *arglist-show-packages* t) - -(defmacro with-arglist-io-syntax (&body body) - (let ((package (gensym))) - `(let ((,package *package*)) - (with-standard-io-syntax - (let ((*package* (if *arglist-show-packages* - *package* - ,package))) - (with-bindings *arglist-pprint-bindings* - ,@body)))))) - -(defun decoded-arglist-to-string (decoded-arglist - &key operator highlight - print-right-margin) - (with-output-to-string (*standard-output*) - (with-arglist-io-syntax - (let ((*print-right-margin* print-right-margin)) - (print-decoded-arglist decoded-arglist - :operator operator - :highlight highlight))))) - -(defun decoded-arglist-to-template-string (decoded-arglist - &key (prefix "(") (suffix ")")) - (with-output-to-string (*standard-output*) - (with-arglist-io-syntax - (print-decoded-arglist-as-template decoded-arglist - :prefix prefix - :suffix suffix)))) - -;;;; Arglist Decoding / Encoding - -(defun decode-required-arg (arg) - "ARG can be a symbol or a destructuring pattern." - (etypecase arg - (symbol arg) - (arglist-dummy arg) - (list (decode-arglist arg)))) - -(defun encode-required-arg (arg) - (etypecase arg - (symbol arg) - (arglist (encode-arglist arg)))) - -(defstruct (keyword-arg - (:conc-name keyword-arg.) - (:constructor %make-keyword-arg)) - keyword - arg-name - default-arg) - -(defun canonicalize-default-arg (form) - (if (equalp ''nil form) - nil - form)) - -(defun make-keyword-arg (keyword arg-name default-arg) - (%make-keyword-arg :keyword keyword - :arg-name arg-name - :default-arg (canonicalize-default-arg default-arg))) - -(defun decode-keyword-arg (arg) - "Decode a keyword item of formal argument list. -Return three values: keyword, argument name, default arg." - (flet ((intern-as-keyword (arg) - (intern (etypecase arg - (symbol (symbol-name arg)) - (arglist-dummy (arglist-dummy.string-representation arg))) - keyword-package))) - (cond ((or (symbolp arg) (arglist-dummy-p arg)) - (make-keyword-arg (intern-as-keyword arg) arg nil)) - ((and (consp arg) - (consp (car arg))) - (make-keyword-arg (caar arg) - (decode-required-arg (cadar arg)) - (cadr arg))) - ((consp arg) - (make-keyword-arg (intern-as-keyword (car arg)) - (car arg) (cadr arg))) - (t - (error "Bad keyword item of formal argument list"))))) - -(defun encode-keyword-arg (arg) - (cond - ((arglist-p (keyword-arg.arg-name arg)) - ;; Destructuring pattern - (let ((keyword/name (list (keyword-arg.keyword arg) - (encode-required-arg - (keyword-arg.arg-name arg))))) - (if (keyword-arg.default-arg arg) - (list keyword/name - (keyword-arg.default-arg arg)) - (list keyword/name)))) - ((eql (intern (symbol-name (keyword-arg.arg-name arg)) - keyword-package) - (keyword-arg.keyword arg)) - (if (keyword-arg.default-arg arg) - (list (keyword-arg.arg-name arg) - (keyword-arg.default-arg arg)) - (keyword-arg.arg-name arg))) - (t - (let ((keyword/name (list (keyword-arg.keyword arg) - (keyword-arg.arg-name arg)))) - (if (keyword-arg.default-arg arg) - (list keyword/name - (keyword-arg.default-arg arg)) - (list keyword/name)))))) - -(progn - (assert (equalp (decode-keyword-arg 'x) - (make-keyword-arg :x 'x nil))) - (assert (equalp (decode-keyword-arg '(x t)) - (make-keyword-arg :x 'x t))) - (assert (equalp (decode-keyword-arg '((:x y))) - (make-keyword-arg :x 'y nil))) - (assert (equalp (decode-keyword-arg '((:x y) t)) - (make-keyword-arg :x 'y t)))) - -;;; FIXME suppliedp? -(defstruct (optional-arg - (:conc-name optional-arg.) - (:constructor %make-optional-arg)) - arg-name - default-arg) - -(defun make-optional-arg (arg-name default-arg) - (%make-optional-arg :arg-name arg-name - :default-arg (canonicalize-default-arg default-arg))) - -(defun decode-optional-arg (arg) - "Decode an optional item of a formal argument list. -Return an OPTIONAL-ARG structure." - (etypecase arg - (symbol (make-optional-arg arg nil)) - (arglist-dummy (make-optional-arg arg nil)) - (list (make-optional-arg (decode-required-arg (car arg)) - (cadr arg))))) - -(defun encode-optional-arg (optional-arg) - (if (or (optional-arg.default-arg optional-arg) - (arglist-p (optional-arg.arg-name optional-arg))) - (list (encode-required-arg - (optional-arg.arg-name optional-arg)) - (optional-arg.default-arg optional-arg)) - (optional-arg.arg-name optional-arg))) - -(progn - (assert (equalp (decode-optional-arg 'x) - (make-optional-arg 'x nil))) - (assert (equalp (decode-optional-arg '(x t)) - (make-optional-arg 'x t)))) - -(define-modify-macro nreversef () nreverse "Reverse the list in PLACE.") - -(defun decode-arglist (arglist) - "Parse the list ARGLIST and return an ARGLIST structure." - (etypecase arglist - ((eql :not-available) (return-from decode-arglist - :not-available)) - (list)) - (loop - with mode = nil - with result = (make-arglist) - for arg = (if (consp arglist) - (pop arglist) - (progn - (prog1 arglist - (setf mode '&rest - arglist nil)))) - do (cond - ((eql mode '&unknown-junk) - ;; don't leave this mode -- we don't know how the arglist - ;; after unknown lambda-list keywords is interpreted - (push arg (arglist.unknown-junk result))) - ((eql arg '&allow-other-keys) - (setf (arglist.allow-other-keys-p result) t)) - ((eql arg '&key) - (setf (arglist.key-p result) t - mode arg)) - ((memq arg '(&optional &rest &body &aux)) - (setq mode arg)) - ((memq arg '(&whole &environment)) - (setq mode arg) - (push arg (arglist.known-junk result))) - ((and (symbolp arg) - (string= (symbol-name arg) (string '#:&any))) ; may be interned - (setf (arglist.any-p result) t) ; in any *package*. - (setq mode '&any)) - ((memq arg lambda-list-keywords) - (setq mode '&unknown-junk) - (push arg (arglist.unknown-junk result))) - (t - (ecase mode - (&key - (push (decode-keyword-arg arg) - (arglist.keyword-args result))) - (&optional - (push (decode-optional-arg arg) - (arglist.optional-args result))) - (&body - (setf (arglist.body-p result) t - (arglist.rest result) arg)) - (&rest - (setf (arglist.rest result) arg)) - (&aux - (push (decode-optional-arg arg) - (arglist.aux-args result))) - ((nil) - (push (decode-required-arg arg) - (arglist.required-args result))) - ((&whole &environment) - (setf mode nil) - (push arg (arglist.known-junk result))) - (&any - (push arg (arglist.any-args result)))))) - until (null arglist) - finally (nreversef (arglist.required-args result)) - finally (nreversef (arglist.optional-args result)) - finally (nreversef (arglist.keyword-args result)) - finally (nreversef (arglist.aux-args result)) - finally (nreversef (arglist.any-args result)) - finally (nreversef (arglist.known-junk result)) - finally (nreversef (arglist.unknown-junk result)) - finally (assert (or (and (not (arglist.key-p result)) - (not (arglist.any-p result))) - (exactly-one-p (arglist.key-p result) - (arglist.any-p result)))) - finally (return result))) - -(defun encode-arglist (decoded-arglist) - (append (mapcar #'encode-required-arg - (arglist.required-args decoded-arglist)) - (when (arglist.optional-args decoded-arglist) - '(&optional)) - (mapcar #'encode-optional-arg - (arglist.optional-args decoded-arglist)) - (when (arglist.key-p decoded-arglist) - '(&key)) - (mapcar #'encode-keyword-arg - (arglist.keyword-args decoded-arglist)) - (when (arglist.allow-other-keys-p decoded-arglist) - '(&allow-other-keys)) - (when (arglist.any-args decoded-arglist) - `(&any ,@(arglist.any-args decoded-arglist))) - (cond ((not (arglist.rest decoded-arglist)) - '()) - ((arglist.body-p decoded-arglist) - `(&body ,(arglist.rest decoded-arglist))) - (t - `(&rest ,(arglist.rest decoded-arglist)))) - (when (arglist.aux-args decoded-arglist) - `(&aux ,(arglist.aux-args decoded-arglist))) - (arglist.known-junk decoded-arglist) - (arglist.unknown-junk decoded-arglist))) - -;;;; Arglist Enrichment - -(defun arglist-keywords (lambda-list) - "Return the list of keywords in ARGLIST. -As a secondary value, return whether &allow-other-keys appears." - (let ((decoded-arglist (decode-arglist lambda-list))) - (values (arglist.keyword-args decoded-arglist) - (arglist.allow-other-keys-p decoded-arglist)))) - - -(defun methods-keywords (methods) - "Collect all keywords in the arglists of METHODS. -As a secondary value, return whether &allow-other-keys appears somewhere." - (let ((keywords '()) - (allow-other-keys nil)) - (dolist (method methods) - (multiple-value-bind (kw aok) - (arglist-keywords - (swank-mop:method-lambda-list method)) - (setq keywords (remove-duplicates (append keywords kw) - :key #'keyword-arg.keyword) - allow-other-keys (or allow-other-keys aok)))) - (values keywords allow-other-keys))) - -(defun generic-function-keywords (generic-function) - "Collect all keywords in the methods of GENERIC-FUNCTION. -As a secondary value, return whether &allow-other-keys appears somewhere." - (methods-keywords - (swank-mop:generic-function-methods generic-function))) - -(defun applicable-methods-keywords (generic-function arguments) - "Collect all keywords in the methods of GENERIC-FUNCTION that are -applicable for argument of CLASSES. As a secondary value, return -whether &allow-other-keys appears somewhere." - (methods-keywords - (multiple-value-bind (amuc okp) - (swank-mop:compute-applicable-methods-using-classes - generic-function (mapcar #'class-of arguments)) - (if okp - amuc - (compute-applicable-methods generic-function arguments))))) - -(defgeneric extra-keywords (operator args) - (:documentation "Return a list of extra keywords of OPERATOR (a -symbol) when applied to the (unevaluated) ARGS. -As a secondary value, return whether other keys are allowed. -As a tertiary value, return the initial sublist of ARGS that was needed -to determine the extra keywords.")) - -;;; We make sure that symbol-from-KEYWORD-using keywords come before -;;; symbol-from-arbitrary-package-using keywords. And we sort the -;;; latter according to how their home-packages relate to *PACKAGE*. -;;; -;;; Rationale is to show those key parameters first which make most -;;; sense in the current context. And in particular: to put -;;; implementation-internal stuff last. -;;; -;;; This matters tremendeously on Allegro in combination with -;;; AllegroCache as that does some evil tinkering with initargs, -;;; obfuscating the arglist of MAKE-INSTANCE. -;;; - -(defmethod extra-keywords :around (op args) - (declare (ignorable op args)) - (multiple-value-bind (keywords aok enrichments) (call-next-method) - (values (sort-extra-keywords keywords) aok enrichments))) - -(defun make-package-comparator (reference-packages) - "Returns a two-argument test function which compares packages -according to their used-by relation with REFERENCE-PACKAGES. Packages -will be sorted first which appear first in the PACKAGE-USE-LIST of the -reference packages." - (let ((package-use-table (make-hash-table :test 'eq))) - ;; Walk the package dependency graph breadth-fist, and fill - ;; PACKAGE-USE-TABLE accordingly. - (loop with queue = (copy-list reference-packages) - with bfn = 0 ; Breadth-First Number - for p = (pop queue) - unless (gethash p package-use-table) - do (setf (gethash p package-use-table) (shiftf bfn (1+ bfn))) - and do (setf queue (nconc queue (copy-list (package-use-list p)))) - while queue) - #'(lambda (p1 p2) - (let ((bfn1 (gethash p1 package-use-table)) - (bfn2 (gethash p2 package-use-table))) - (cond ((and bfn1 bfn2) (<= bfn1 bfn2)) - (bfn1 bfn1) - (bfn2 nil) ; p2 is used, p1 not - (t (string<= (package-name p1) (package-name p2)))))))) - -(defun sort-extra-keywords (kwds) - (stable-sort kwds (make-package-comparator (list keyword-package *package*)) - :key (compose #'symbol-package #'keyword-arg.keyword))) - -(defun keywords-of-operator (operator) - "Return a list of KEYWORD-ARGs that OPERATOR accepts. -This function is useful for writing EXTRA-KEYWORDS methods for -user-defined functions which are declared &ALLOW-OTHER-KEYS and which -forward keywords to OPERATOR." - (with-available-arglist (arglist) (arglist-from-form (ensure-list operator)) - (values (arglist.keyword-args arglist) - (arglist.allow-other-keys-p arglist)))) - -(defmethod extra-keywords (operator args) - ;; default method - (declare (ignore args)) - (let ((symbol-function (symbol-function operator))) - (if (typep symbol-function 'generic-function) - (generic-function-keywords symbol-function) - nil))) - -(defun class-from-class-name-form (class-name-form) - (when (and (listp class-name-form) - (= (length class-name-form) 2) - (eq (car class-name-form) 'quote)) - (let* ((class-name (cadr class-name-form)) - (class (find-class class-name nil))) - (when (and class - (not (swank-mop:class-finalized-p class))) - ;; Try to finalize the class, which can fail if - ;; superclasses are not defined yet - (ignore-errors (swank-mop:finalize-inheritance class))) - class))) - -(defun extra-keywords/slots (class) - (multiple-value-bind (slots allow-other-keys-p) - (if (swank-mop:class-finalized-p class) - (values (swank-mop:class-slots class) nil) - (values (swank-mop:class-direct-slots class) t)) - (let ((slot-init-keywords - (loop for slot in slots append - (mapcar (lambda (initarg) - (make-keyword-arg - initarg - (swank-mop:slot-definition-name slot) - (and (swank-mop:slot-definition-initfunction slot) - (swank-mop:slot-definition-initform slot)))) - (swank-mop:slot-definition-initargs slot))))) - (values slot-init-keywords allow-other-keys-p)))) - -(defun extra-keywords/make-instance (operator args) - (declare (ignore operator)) - (unless (null args) - (let* ((class-name-form (car args)) - (class (class-from-class-name-form class-name-form))) - (when class - (multiple-value-bind (slot-init-keywords class-aokp) - (extra-keywords/slots class) - (multiple-value-bind (allocate-instance-keywords ai-aokp) - (applicable-methods-keywords - #'allocate-instance (list class)) - (multiple-value-bind (initialize-instance-keywords ii-aokp) - (ignore-errors - (applicable-methods-keywords - #'initialize-instance - (list (swank-mop:class-prototype class)))) - (multiple-value-bind (shared-initialize-keywords si-aokp) - (ignore-errors - (applicable-methods-keywords - #'shared-initialize - (list (swank-mop:class-prototype class) t))) - (values (append slot-init-keywords - allocate-instance-keywords - initialize-instance-keywords - shared-initialize-keywords) - (or class-aokp ai-aokp ii-aokp si-aokp) - (list class-name-form)))))))))) - -(defun extra-keywords/change-class (operator args) - (declare (ignore operator)) - (unless (null args) - (let* ((class-name-form (car args)) - (class (class-from-class-name-form class-name-form))) - (when class - (multiple-value-bind (slot-init-keywords class-aokp) - (extra-keywords/slots class) - (declare (ignore class-aokp)) - (multiple-value-bind (shared-initialize-keywords si-aokp) - (ignore-errors - (applicable-methods-keywords - #'shared-initialize - (list (swank-mop:class-prototype class) t))) - ;; FIXME: much as it would be nice to include the - ;; applicable keywords from - ;; UPDATE-INSTANCE-FOR-DIFFERENT-CLASS, I don't really see - ;; how to do it: so we punt, always declaring - ;; &ALLOW-OTHER-KEYS. - (declare (ignore si-aokp)) - (values (append slot-init-keywords shared-initialize-keywords) - t - (list class-name-form)))))))) - -(defmethod extra-keywords ((operator (eql 'make-instance)) - args) - (multiple-value-or (extra-keywords/make-instance operator args) - (call-next-method))) - -(defmethod extra-keywords ((operator (eql 'make-condition)) - args) - (multiple-value-or (extra-keywords/make-instance operator args) - (call-next-method))) - -(defmethod extra-keywords ((operator (eql 'error)) - args) - (multiple-value-or (extra-keywords/make-instance operator args) - (call-next-method))) - -(defmethod extra-keywords ((operator (eql 'signal)) - args) - (multiple-value-or (extra-keywords/make-instance operator args) - (call-next-method))) - -(defmethod extra-keywords ((operator (eql 'warn)) - args) - (multiple-value-or (extra-keywords/make-instance operator args) - (call-next-method))) - -(defmethod extra-keywords ((operator (eql 'cerror)) - args) - (multiple-value-bind (keywords aok determiners) - (extra-keywords/make-instance operator (cdr args)) - (if keywords - (values keywords aok - (cons (car args) determiners)) - (call-next-method)))) - -(defmethod extra-keywords ((operator (eql 'change-class)) - args) - (multiple-value-bind (keywords aok determiners) - (extra-keywords/change-class operator (cdr args)) - (if keywords - (values keywords aok - (cons (car args) determiners)) - (call-next-method)))) - -(defun enrich-decoded-arglist-with-keywords (decoded-arglist keywords - allow-other-keys-p) - "Modify DECODED-ARGLIST using KEYWORDS and ALLOW-OTHER-KEYS-P." - (when keywords - (setf (arglist.key-p decoded-arglist) t) - (setf (arglist.keyword-args decoded-arglist) - (remove-duplicates - (append (arglist.keyword-args decoded-arglist) - keywords) - :key #'keyword-arg.keyword))) - (setf (arglist.allow-other-keys-p decoded-arglist) - (or (arglist.allow-other-keys-p decoded-arglist) - allow-other-keys-p))) - -(defun enrich-decoded-arglist-with-extra-keywords (decoded-arglist form) - "Determine extra keywords from the function call FORM, and modify -DECODED-ARGLIST to include them. As a secondary return value, return -the initial sublist of ARGS that was needed to determine the extra -keywords. As a tertiary return value, return whether any enrichment -was done." - (multiple-value-bind (extra-keywords extra-aok determining-args) - (extra-keywords (car form) (cdr form)) - ;; enrich the list of keywords with the extra keywords - (enrich-decoded-arglist-with-keywords decoded-arglist - extra-keywords extra-aok) - (values decoded-arglist - determining-args - (or extra-keywords extra-aok)))) - -(defgeneric compute-enriched-decoded-arglist (operator-form argument-forms) - (:documentation - "Return three values: DECODED-ARGLIST, DETERMINING-ARGS, and -ANY-ENRICHMENT, just like enrich-decoded-arglist-with-extra-keywords. -If the arglist is not available, return :NOT-AVAILABLE.")) - -(defmethod compute-enriched-decoded-arglist (operator-form argument-forms) - (with-available-arglist (decoded-arglist) - (decode-arglist (arglist operator-form)) - (enrich-decoded-arglist-with-extra-keywords decoded-arglist - (cons operator-form - argument-forms)))) - -(defmethod compute-enriched-decoded-arglist - ((operator-form (eql 'with-open-file)) argument-forms) - (declare (ignore argument-forms)) - (multiple-value-bind (decoded-arglist determining-args) - (call-next-method) - (let ((first-arg (first (arglist.required-args decoded-arglist))) - (open-arglist (compute-enriched-decoded-arglist 'open nil))) - (when (and (arglist-p first-arg) (arglist-p open-arglist)) - (enrich-decoded-arglist-with-keywords - first-arg - (arglist.keyword-args open-arglist) - nil))) - (values decoded-arglist determining-args t))) - -(defmethod compute-enriched-decoded-arglist ((operator-form (eql 'apply)) - argument-forms) - (let ((function-name-form (car argument-forms))) - (when (and (listp function-name-form) - (length= function-name-form 2) - (memq (car function-name-form) '(quote function))) - (let ((function-name (cadr function-name-form))) - (when (valid-operator-symbol-p function-name) - (let ((function-arglist - (compute-enriched-decoded-arglist function-name - (cdr argument-forms)))) - (return-from compute-enriched-decoded-arglist - (values - (make-arglist :required-args - (list 'function) - :optional-args - (append - (mapcar #'(lambda (arg) - (make-optional-arg arg nil)) - (arglist.required-args function-arglist)) - (arglist.optional-args function-arglist)) - :key-p - (arglist.key-p function-arglist) - :keyword-args - (arglist.keyword-args function-arglist) - :rest - 'args - :allow-other-keys-p - (arglist.allow-other-keys-p function-arglist)) - (list function-name-form) - t))))))) - (call-next-method)) - -(defmethod compute-enriched-decoded-arglist - ((operator-form (eql 'multiple-value-call)) argument-forms) - (compute-enriched-decoded-arglist 'apply argument-forms)) - -(defun delete-given-args (decoded-arglist args) - "Delete given ARGS from DECODED-ARGLIST." - (macrolet ((pop-or-return (list) - `(if (null ,list) - (return-from do-decoded-arglist) - (pop ,list)))) - (do-decoded-arglist decoded-arglist - (&provided () - (assert (eq (pop-or-return args) - (pop (arglist.provided-args decoded-arglist))))) - (&required () - (pop-or-return args) - (pop (arglist.required-args decoded-arglist))) - (&optional () - (pop-or-return args) - (pop (arglist.optional-args decoded-arglist))) - (&key (keyword) - ;; N.b. we consider a keyword to be given only when the keyword - ;; _and_ a value has been given for it. - (loop for (key value) on args by #'cddr - when (and (eq keyword key) value) - do (setf (arglist.keyword-args decoded-arglist) - (remove keyword (arglist.keyword-args decoded-arglist) - :key #'keyword-arg.keyword)))))) - decoded-arglist) - -(defun remove-given-args (decoded-arglist args) - ;; FIXME: We actually needa deep copy here. - (delete-given-args (copy-arglist decoded-arglist) args)) - -;;;; Arglist Retrieval - -(defun arglist-from-form (form) - (if (null form) - :not-available - (arglist-dispatch (car form) (cdr form)))) - -(export 'arglist-dispatch) -(defgeneric arglist-dispatch (operator arguments) - ;; Default method - (:method (operator arguments) - (unless (and (symbolp operator) (valid-operator-symbol-p operator)) - (return-from arglist-dispatch :not-available)) - (when (equalp (package-name (symbol-package operator)) "closer-mop") - (let ((standard-symbol (or (find-symbol (symbol-name operator) :cl) - (find-symbol (symbol-name operator) :swank-mop)))) - (when standard-symbol - (return-from arglist-dispatch - (arglist-dispatch standard-symbol arguments))))) - - (multiple-value-bind (decoded-arglist determining-args) - (compute-enriched-decoded-arglist operator arguments) - (with-available-arglist (arglist) decoded-arglist - ;; replace some formal args by determining actual args - (setf arglist (delete-given-args arglist determining-args)) - (setf (arglist.provided-args arglist) determining-args) - arglist)))) - -(defmethod arglist-dispatch ((operator (eql 'defmethod)) arguments) - (match (cons operator arguments) - (('defmethod (#'function-exists-p gf-name) . rest) - (let ((gf (fdefinition gf-name))) - (when (typep gf 'generic-function) - (with-available-arglist (arglist) (decode-arglist (arglist gf)) - (let ((qualifiers (loop for x in rest - until (or (listp x) (empty-arg-p x)) - collect x))) - (return-from arglist-dispatch - (make-arglist :provided-args (cons gf-name qualifiers) - :required-args (list arglist) - :rest "body" :body-p t))))))) - (_)) ; Fall through - (call-next-method)) - -(defmethod arglist-dispatch ((operator (eql 'define-compiler-macro)) arguments) - (match (cons operator arguments) - (('define-compiler-macro (#'function-exists-p gf-name) . _) - (let ((gf (fdefinition gf-name))) - (with-available-arglist (arglist) (decode-arglist (arglist gf)) - (return-from arglist-dispatch - (make-arglist :provided-args (list gf-name) - :required-args (list arglist) - :rest "body" :body-p t))))) - (_)) ; Fall through - (call-next-method)) - - -(defmethod arglist-dispatch ((operator (eql 'eval-when)) arguments) - (declare (ignore arguments)) - (let ((eval-when-args '(:compile-toplevel :load-toplevel :execute))) - (make-arglist - :required-args (list (make-arglist :any-p t :any-args eval-when-args)) - :rest '#:body :body-p t))) - - -(defmethod arglist-dispatch ((operator (eql 'declare)) arguments) - (let* ((declaration (cons operator (last arguments))) - (typedecl-arglist (arglist-for-type-declaration declaration))) - (if (arglist-available-p typedecl-arglist) - typedecl-arglist - (match declaration - (('declare ((#'consp typespec) . decl-args)) - (with-available-arglist (typespec-arglist) - (decoded-arglist-for-type-specifier typespec) - (make-arglist - :required-args (list (make-arglist - :required-args (list typespec-arglist) - :rest '#:variables))))) - (('declare (decl-identifier . decl-args)) - (decoded-arglist-for-declaration decl-identifier decl-args)) - (_ (make-arglist :rest '#:declaration-specifiers)))))) - -(defmethod arglist-dispatch ((operator (eql 'declaim)) arguments) - (arglist-dispatch 'declare arguments)) - - -(defun arglist-for-type-declaration (declaration) - (flet ((%arglist-for-type-declaration (identifier typespec rest-var-name) - (with-available-arglist (typespec-arglist) - (decoded-arglist-for-type-specifier typespec) - (make-arglist - :required-args (list (make-arglist - :provided-args (list identifier) - :required-args (list typespec-arglist) - :rest rest-var-name)))))) - (match declaration - (('declare ('type (#'consp typespec) . decl-args)) - (%arglist-for-type-declaration 'type typespec '#:variables)) - (('declare ('ftype (#'consp typespec) . decl-args)) - (%arglist-for-type-declaration 'ftype typespec '#:function-names)) - (('declare ((#'consp typespec) . decl-args)) - (with-available-arglist (typespec-arglist) - (decoded-arglist-for-type-specifier typespec) - (make-arglist - :required-args (list (make-arglist - :required-args (list typespec-arglist) - :rest '#:variables))))) - (_ :not-available)))) - -(defun decoded-arglist-for-declaration (decl-identifier decl-args) - (declare (ignore decl-args)) - (with-available-arglist (arglist) - (decode-arglist (declaration-arglist decl-identifier)) - (setf (arglist.provided-args arglist) (list decl-identifier)) - (make-arglist :required-args (list arglist)))) - -(defun decoded-arglist-for-type-specifier (type-specifier) - (etypecase type-specifier - (arglist-dummy :not-available) - (cons (decoded-arglist-for-type-specifier (car type-specifier))) - (symbol - (with-available-arglist (arglist) - (decode-arglist (type-specifier-arglist type-specifier)) - (setf (arglist.provided-args arglist) (list type-specifier)) - arglist)))) - -;;; Slimefuns - -;;; We work on a RAW-FORM, or BUFFER-FORM, which represent the form at -;;; user's point in Emacs. A RAW-FORM looks like -;;; -;;; ("FOO" ("BAR" ...) "QUUX" ("ZURP" SWANK::%CURSOR-MARKER%)) -;;; -;;; The expression before the cursor marker is the expression where -;;; user's cursor points at. An explicit marker is necessary to -;;; disambiguate between -;;; -;;; ("IF" ("PRED") -;;; ("F" "X" "Y" %CURSOR-MARKER%)) -;;; -;;; and -;;; ("IF" ("PRED") -;;; ("F" "X" "Y") %CURSOR-MARKER%) - -;;; Notice that for a form like (FOO (BAR |) QUUX), where | denotes -;;; user's point, the following should be sent ("FOO" ("BAR" "" -;;; %CURSOR-MARKER%)). Only the forms up to point should be -;;; considered. - -(defslimefun autodoc (raw-form &key print-right-margin) - "Return a list of two elements. -First, a string representing the arglist for the deepest subform in -RAW-FORM that does have an arglist. The highlighted parameter is -wrapped in ===> X <===. - -Second, a boolean value telling whether the returned string can be cached." - (handler-bind ((serious-condition - #'(lambda (c) - (unless (debug-on-swank-error) - (let ((*print-right-margin* print-right-margin)) - (return-from autodoc - (format nil "Arglist Error: \"~A\"" c))))))) - (with-buffer-syntax () - (multiple-value-bind (form arglist obj-at-cursor form-path) - (find-subform-with-arglist (parse-raw-form raw-form)) - (cond ((boundp-and-interesting obj-at-cursor) - (list (print-variable-to-string obj-at-cursor) nil)) - (t - (list - (with-available-arglist (arglist) arglist - (decoded-arglist-to-string - arglist - :print-right-margin print-right-margin - :operator (car form) - :highlight (form-path-to-arglist-path form-path - form - arglist))) - t))))))) - -(defun boundp-and-interesting (symbol) - (and symbol - (symbolp symbol) - (boundp symbol) - (not (memq symbol '(cl:t cl:nil))) - (not (keywordp symbol)))) - -(defun print-variable-to-string (symbol) - "Return a short description of VARIABLE-NAME, or NIL." - (let ((*print-pretty* t) (*print-level* 4) - (*print-length* 10) (*print-lines* 1) - (*print-readably* nil) - (value (symbol-value symbol))) - (call/truncated-output-to-string - 75 (lambda (s) - (without-printing-errors (:object value :stream s) - (format s "~A ~A~S" symbol *echo-area-prefix* value)))))) - - -(defslimefun complete-form (raw-form) - "Read FORM-STRING in the current buffer package, then complete it - by adding a template for the missing arguments." - ;; We do not catch errors here because COMPLETE-FORM is an - ;; interactive command, not automatically run in the background like - ;; ARGLIST-FOR-ECHO-AREA. - (with-buffer-syntax () - (multiple-value-bind (arglist provided-args) - (find-immediately-containing-arglist (parse-raw-form raw-form)) - (with-available-arglist (arglist) arglist - (decoded-arglist-to-template-string - (delete-given-args arglist - (remove-if #'empty-arg-p provided-args - :from-end t :count 1)) - :prefix "" :suffix ""))))) - -(defslimefun completions-for-keyword (keyword-string raw-form) - "Return a list of possible completions for KEYWORD-STRING relative -to the context provided by RAW-FORM." - (with-buffer-syntax () - (let ((arglist (find-immediately-containing-arglist - (parse-raw-form raw-form)))) - (when (arglist-available-p arglist) - ;; It would be possible to complete keywords only if we are in - ;; a keyword position, but it is not clear if we want that. - (let* ((keywords - (append (mapcar #'keyword-arg.keyword - (arglist.keyword-args arglist)) - (remove-if-not #'keywordp (arglist.any-args arglist)))) - (keyword-name - (tokenize-symbol keyword-string)) - (matching-keywords - (find-matching-symbols-in-list - keyword-name keywords (make-compound-prefix-matcher #\-))) - (converter (completion-output-symbol-converter keyword-string)) - (strings - (mapcar converter - (mapcar #'symbol-name matching-keywords))) - (completion-set - (format-completion-set strings nil ""))) - (list completion-set - (longest-compound-prefix completion-set))))))) - -(defparameter +cursor-marker+ '%cursor-marker%) - -(defun find-subform-with-arglist (form) - "Returns four values: - - The appropriate subform of `form' which is closest to the - +CURSOR-MARKER+ and whose operator is valid and has an - arglist. The +CURSOR-MARKER+ is removed from that subform. - - Second value is the arglist. Local function and macro definitions - appearing in `form' into account. - - Third value is the object in front of +CURSOR-MARKER+. - - Fourth value is a form path to that object." - (labels - ((yield-success (form local-ops) - (multiple-value-bind (form obj-at-cursor form-path) - (extract-cursor-marker form) - (values form - (let ((entry (assoc (car form) local-ops :test #'op=))) - (if entry - (decode-arglist (cdr entry)) - (arglist-from-form form))) - obj-at-cursor - form-path))) - (yield-failure () - (values nil :not-available)) - (operator-p (operator local-ops) - (or (and (symbolp operator) (valid-operator-symbol-p operator)) - (assoc operator local-ops :test #'op=))) - (op= (op1 op2) - (cond ((and (symbolp op1) (symbolp op2)) - (eq op1 op2)) - ((and (arglist-dummy-p op1) (arglist-dummy-p op2)) - (string= (arglist-dummy.string-representation op1) - (arglist-dummy.string-representation op2))))) - (grovel-form (form local-ops) - "Descend FORM top-down, always taking the rightest branch, - until +CURSOR-MARKER+." - (assert (listp form)) - (destructuring-bind (operator . args) form - ;; N.b. the user's cursor is at the rightmost, deepest - ;; subform right before +CURSOR-MARKER+. - (let ((last-subform (car (last form))) - (new-ops)) - (cond - ((eq last-subform +cursor-marker+) - (if (operator-p operator local-ops) - (yield-success form local-ops) - (yield-failure))) - ((not (operator-p operator local-ops)) - (grovel-form last-subform local-ops)) - ;; Make sure to pick up the arglists of local - ;; function/macro definitions. - ((setq new-ops (extract-local-op-arglists operator args)) - (multiple-value-or (grovel-form last-subform - (nconc new-ops local-ops)) - (yield-success form local-ops))) - ;; Some typespecs clash with function names, so we make - ;; sure to bail out early. - ((member operator '(cl:declare cl:declaim)) - (yield-success form local-ops)) - ;; Mostly uninteresting, hence skip. - ((memq operator '(cl:quote cl:function)) - (yield-failure)) - (t - (multiple-value-or (grovel-form last-subform local-ops) - (yield-success form local-ops)))))))) - (if (null form) - (yield-failure) - (grovel-form form '())))) - -(defun extract-cursor-marker (form) - "Returns three values: normalized `form' without +CURSOR-MARKER+, -the object in front of +CURSOR-MARKER+, and a form path to that -object." - (labels ((grovel (form last path) - (let ((result-form)) - (loop for (car . cdr) on form do - (cond ((eql car +cursor-marker+) - (decf (first path)) - (return-from grovel - (values (nreconc result-form cdr) - last - (nreverse path)))) - ((consp car) - (multiple-value-bind (new-car new-last new-path) - (grovel car last (cons 0 path)) - (when new-path ; CAR contained cursor-marker? - (return-from grovel - (values (nreconc - (cons new-car result-form) cdr) - new-last - new-path)))))) - (push car result-form) - (setq last car) - (incf (first path)) - finally - (return-from grovel - (values (nreverse result-form) nil nil)))))) - (grovel form nil (list 0)))) - -(defgeneric extract-local-op-arglists (operator args) - (:documentation - "If the form `(OPERATOR ,@ARGS) is a local operator binding form, - return a list of pairs (OP . ARGLIST) for each locally bound op.") - (:method (operator args) - (declare (ignore operator args)) - nil) - ;; FLET - (:method ((operator (eql 'cl:flet)) args) - (let ((defs (first args)) - (body (rest args))) - (cond ((null body) nil) ; `(flet ((foo (x) |' - ((atom defs) nil) ; `(flet ,foo (|' - (t (%collect-op/argl-alist defs))))) - ;; LABELS - (:method ((operator (eql 'cl:labels)) args) - ;; Notice that we only have information to "look backward" and - ;; show arglists of previously occuring local functions. - (destructuring-bind (defs . body) args - (unless (or (atom defs) (null body)) ; `(labels ,foo (|' - (let ((current-def (car (last defs)))) - (cond ((atom current-def) nil) ; `(labels ((foo (x) ...)|' - ((not (null body)) - (extract-local-op-arglists 'cl:flet args)) - (t - (let ((def.body (cddr current-def))) - (when def.body - (%collect-op/argl-alist defs))))))))) - ;; MACROLET - (:method ((operator (eql 'cl:macrolet)) args) - (extract-local-op-arglists 'cl:labels args))) - -(defun %collect-op/argl-alist (defs) - (setq defs (remove-if-not #'(lambda (x) - ;; Well-formed FLET/LABELS def? - (and (consp x) (second x))) - defs)) - (loop for (name arglist . nil) in defs - collect (cons name arglist))) - -(defun find-immediately-containing-arglist (form) - "Returns the arglist of the subform _immediately_ containing -+CURSOR-MARKER+ in `form'. Notice, however, that +CURSOR-MARKER+ may -be in a nested arglist \(e.g. `(WITH-OPEN-FILE ('\), and the -arglist of the appropriate parent form \(WITH-OPEN-FILE\) will be -returned in that case." - (flet ((try (form-path form arglist) - (let* ((arglist-path (form-path-to-arglist-path form-path - form - arglist)) - (argl (apply #'arglist-ref - arglist - arglist-path)) - (args (apply #'provided-arguments-ref - (cdr form) - arglist - arglist-path))) - (when (and (arglist-p argl) (listp args)) - (values argl args))))) - (multiple-value-bind (form arglist obj form-path) - (find-subform-with-arglist form) - (declare (ignore obj)) - (with-available-arglist (arglist) arglist - ;; First try the form the cursor is in (in case of a normal - ;; form), then try the surrounding form (in case of a nested - ;; macro form). - (multiple-value-or (try form-path form arglist) - (try (butlast form-path) form arglist) - :not-available))))) - -(defun form-path-to-arglist-path (form-path form arglist) - "Convert a form path to an arglist path consisting of arglist -indices." - (labels ((convert (path args arglist) - (if (null path) - nil - (let* ((idx (car path)) - (idx* (arglist-index idx args arglist)) - (arglist* (and idx* (arglist-ref arglist idx*))) - (args* (and idx* (provided-arguments-ref args - arglist - idx*)))) - ;; The FORM-PATH may be more detailed than ARGLIST; - ;; consider (defun foo (x y) ...), a form path may - ;; point into the function's lambda-list, but the - ;; arglist of DEFUN won't contain as much information. - ;; So we only recurse if possible. - (cond ((null idx*) - nil) - ((arglist-p arglist*) - (cons idx* (convert (cdr path) args* arglist*))) - (t - (list idx*))))))) - (convert - ;; FORM contains irrelevant operator. Adjust FORM-PATH. - (cond ((null form-path) nil) - ((equal form-path '(0)) nil) - (t - (destructuring-bind (car . cdr) form-path - (cons (1- car) cdr)))) - (cdr form) - arglist))) - -(defun arglist-index (provided-argument-index provided-arguments arglist) - "Return the arglist index into `arglist' for the parameter belonging -to the argument (NTH `provided-argument-index' `provided-arguments')." - (let ((positional-args# (positional-args-number arglist)) - (arg-index provided-argument-index)) - (with-struct (arglist. key-p rest) arglist - (cond - ((< arg-index positional-args#) ; required + optional - arg-index) - ((and (not key-p) (not rest)) ; more provided than allowed - nil) - ((not key-p) ; rest + body - (assert (arglist.rest arglist)) - positional-args#) - (t ; key - ;; Find last provided &key parameter - (let* ((argument (nth arg-index provided-arguments)) - (provided-keys (subseq provided-arguments positional-args#))) - (loop for (key value) on provided-keys by #'cddr - when (eq value argument) - return (match key - (('quote symbol) symbol) - (_ key))))))))) - -(defun arglist-ref (arglist &rest indices) - "Returns the parameter in ARGLIST along the INDICIES path. Numbers -represent positional parameters (required, optional), keywords -represent key parameters." - (flet ((ref-positional-arg (arglist index) - (check-type index (integer 0 *)) - (with-struct (arglist. provided-args required-args - optional-args rest) - arglist - (loop for args in (list provided-args required-args - (mapcar #'optional-arg.arg-name - optional-args)) - for args# = (length args) - if (< index args#) - return (nth index args) - else - do (decf index args#) - finally (return (or rest nil))))) - (ref-keyword-arg (arglist keyword) - ;; keyword argument may be any symbol, - ;; not only from the KEYWORD package. - (let ((keyword (match keyword - (('quote symbol) symbol) - (_ keyword)))) - (do-decoded-arglist arglist - (&key (kw arg) (when (eq kw keyword) - (return-from ref-keyword-arg arg))))) - nil)) - (dolist (index indices) - (assert (arglist-p arglist)) - (setq arglist (if (numberp index) - (ref-positional-arg arglist index) - (ref-keyword-arg arglist index)))) - arglist)) - -(defun provided-arguments-ref (provided-args arglist &rest indices) - "Returns the argument in PROVIDED-ARGUMENT along the INDICES path -relative to ARGLIST." - (check-type arglist arglist) - (flet ((ref (provided-args arglist index) - (if (numberp index) - (nth index provided-args) - (let ((provided-keys (subseq provided-args - (positional-args-number arglist)))) - (loop for (key value) on provided-keys - when (eq key index) - return value))))) - (dolist (idx indices) - (setq provided-args (ref provided-args arglist idx)) - (setq arglist (arglist-ref arglist idx))) - provided-args)) - -(defun positional-args-number (arglist) - (+ (length (arglist.provided-args arglist)) - (length (arglist.required-args arglist)) - (length (arglist.optional-args arglist)))) - -(defun parse-raw-form (raw-form) - "Parse a RAW-FORM into a Lisp form. I.e. substitute strings by -symbols if already interned. For strings not already interned, use -ARGLIST-DUMMY." - (unless (null raw-form) - (loop for element in raw-form - collect (etypecase element - (string (read-conversatively element)) - (list (parse-raw-form element)) - (symbol (prog1 element - ;; Comes after list, so ELEMENT can't be NIL. - (assert (eq element +cursor-marker+)))))))) - -(defun read-conversatively (string) - "Tries to find the symbol that's represented by STRING. - -If it can't, this either means that STRING does not represent a -symbol, or that the symbol behind STRING would have to be freshly -interned. Because this function is supposed to be called from the -automatic arglist display stuff from Slime, interning freshly -symbols is a big no-no. - -In such a case (that no symbol could be found), an object of type -ARGLIST-DUMMY is returned instead, which works as a placeholder -datum for subsequent logics to rely on." - (let* ((string (string-left-trim '(#\Space #\Tab #\Newline) string)) - (length (length string)) - (type (cond ((zerop length) nil) - ((eql (aref string 0) #\') - :quoted-symbol) - ((search "#'" string :end2 (min length 2)) - :sharpquoted-symbol) - ((char= (char string 0) (char string (1- length)) - #\") - :string) - (t - :symbol)))) - (multiple-value-bind (symbol found?) - (case type - (:symbol (parse-symbol string)) - (:quoted-symbol (parse-symbol (subseq string 1))) - (:sharpquoted-symbol (parse-symbol (subseq string 2))) - (:string (values string t)) - (t (values string nil))) - (if found? - (ecase type - (:symbol symbol) - (:quoted-symbol `(quote ,symbol)) - (:sharpquoted-symbol `(function ,symbol)) - (:string (if (> length 1) - (subseq string 1 (1- length)) - string))) - (make-arglist-dummy string))))) - -(defun test-print-arglist () - (flet ((test (arglist &rest strings) - (let* ((*package* (find-package :swank)) - (actual (decoded-arglist-to-string - (decode-arglist arglist) - :print-right-margin 1000))) - (unless (loop for string in strings - thereis (string= actual string)) - (warn "Test failed: ~S => ~S~% Expected: ~A" - arglist actual - (if (cdr strings) - (format nil "One of: ~{~S~^, ~}" strings) - (format nil "~S" (first strings)))))))) - (test '(function cons) "(function cons)") - (test '(quote cons) "(quote cons)") - (test '(&key (function #'+)) - "(&key (function #'+))" "(&key (function (function +)))") - (test '(&whole x y z) "(y z)") - (test '(x &aux y z) "(x)") - (test '(x &environment env y) "(x y)") - (test '(&key ((function f))) "(&key ((function ..)))") - (test - '(eval-when (&any :compile-toplevel :load-toplevel :execute) &body body) - "(eval-when (&any :compile-toplevel :load-toplevel :execute) &body body)") - (test '(declare (optimize &any (speed 1) (safety 1))) - "(declare (optimize &any (speed 1) (safety 1)))"))) - -(defun test-arglist-ref () - (macrolet ((soft-assert (form) - `(unless ,form - (warn "Assertion failed: ~S~%" ',form)))) - (let ((sample (decode-arglist '(x &key ((:k (y z))))))) - (soft-assert (eq (arglist-ref sample 0) 'x)) - (soft-assert (eq (arglist-ref sample :k 0) 'y)) - (soft-assert (eq (arglist-ref sample :k 1) 'z)) - - (soft-assert (eq (provided-arguments-ref '(a :k (b c)) sample 0) - 'a)) - (soft-assert (eq (provided-arguments-ref '(a :k (b c)) sample :k 0) - 'b)) - (soft-assert (eq (provided-arguments-ref '(a :k (b c)) sample :k 1) - 'c))))) - -(test-print-arglist) -(test-arglist-ref) - -(provide :swank-arglists) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-asdf.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-asdf.lisp deleted file mode 100644 index 0fdd901..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-asdf.lisp +++ /dev/null @@ -1,541 +0,0 @@ -;;; swank-asdf.lisp -- ASDF support -;; -;; Authors: Daniel Barlow -;; Marco Baringer -;; Edi Weitz -;; Francois-Rene Rideau -;; and others -;; License: Public Domain -;; - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) -;;; The best way to load ASDF is from an init file of an -;;; implementation. If ASDF is not loaded at the time swank-asdf is -;;; loaded, it will be tried first with (require "asdf"), if that -;;; doesn't help and *asdf-path* is set, it will be loaded from that -;;; file. -;;; To set *asdf-path* put the following into ~/.swank.lisp: -;;; (defparameter swank::*asdf-path* #p"/path/to/asdf/asdf.lisp") - (defvar *asdf-path* nil - "Path to asdf.lisp file, to be loaded in case (require \"asdf\") fails.")) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (unless (member :asdf *features*) - (ignore-errors (funcall 'require "asdf")))) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (unless (member :asdf *features*) - (handler-bind ((warning #'muffle-warning)) - (when *asdf-path* - (load *asdf-path* :if-does-not-exist nil))))) - -;; If still not found, error out. -(eval-when (:compile-toplevel :load-toplevel :execute) - (unless (member :asdf *features*) - (error "Could not load ASDF. -Please update your implementation or -install a recent release of ASDF and in your ~~/.swank.lisp specify: - (defparameter swank::*asdf-path* #p\"/path/containing/asdf/asdf.lisp\")"))) - -;;; If ASDF is too old, punt. -;; As of January 2014, Quicklisp has been providing 2.26 for a year -;; (and previously had 2.014.6 for over a year), whereas -;; all SLIME-supported implementations provide ASDF3 (i.e. 2.27 or later) -;; except LispWorks (stuck with 2.019) and SCL (which hasn't been released -;; in years and doesn't provide ASDF at all, but is fully supported by ASDF). -;; If your implementation doesn't provide ASDF, or provides an old one, -;; install an upgrade yourself and configure *asdf-path*. -;; It's just not worth the hassle supporting something -;; that doesn't even have COERCE-PATHNAME. -;; -;; NB: this version check is duplicated in swank-loader.lisp so that we don't -;; try to load this contrib when ASDF is too old since that will abort the SLIME -;; connection. -#-asdf3 -(eval-when (:compile-toplevel :load-toplevel :execute) - (unless (and #+asdf2 (asdf:version-satisfies (asdf:asdf-version) "2.14.6")) - (error "Your ASDF is too old. ~ - The oldest version supported by swank-asdf is 2.014.6."))) -;;; Import functionality from ASDF that isn't available in all ASDF versions. -;;; Please do NOT depend on any of the below as reference: -;;; they are sometimes stripped down versions, for compatibility only. -;;; Indeed, they are supposed to work on *OLDER*, not *NEWER* versions of ASDF. -;;; -;;; The way I got these is usually by looking at the current definition, -;;; using git blame in one screen to locate which commit last modified it, -;;; and git log in another to determine which release that made it in. -;;; It is OK for some of the below definitions to be or become obsolete, -;;; as long as it will make do with versions older than the tagged version: -;;; if ASDF is more recent, its more recent version will win. -;;; -;;; If your software is hacking ASDF, use its internals. -;;; If you want ASDF utilities in user software, please use ASDF-UTILS. - -(defun asdf-at-least (version) - (asdf:version-satisfies (asdf:asdf-version) version)) - -(defmacro asdefs (version &rest defs) - (flet ((defun* (version name aname rest) - `(progn - (defun ,name ,@rest) - (declaim (notinline ,name)) - (when (asdf-at-least ,version) - (setf (fdefinition ',name) (fdefinition ',aname))))) - (defmethod* (version aname rest) - `(unless (asdf-at-least ,version) - (defmethod ,aname ,@rest))) - (defvar* (name aname rest) - `(progn - (define-symbol-macro ,name ,aname) - (defvar ,aname ,@rest)))) - `(progn - ,@(loop :for (def name . args) :in defs - :for aname = (intern (string name) :asdf) - :collect - (ecase def - ((defun) (defun* version name aname args)) - ((defmethod) (defmethod* version aname args)) - ((defvar) (defvar* name aname args))))))) - -(asdefs "2.15" - (defvar *wild* #-cormanlisp :wild #+cormanlisp "*") - - (defun collect-asds-in-directory (directory collect) - (map () collect (directory-asd-files directory))) - - (defun register-asd-directory (directory &key recurse exclude collect) - (if (not recurse) - (collect-asds-in-directory directory collect) - (collect-sub*directories-asd-files - directory :exclude exclude :collect collect)))) - -(asdefs "2.16" - (defun load-sysdef (name pathname) - (declare (ignore name)) - (let ((package (asdf::make-temporary-package))) - (unwind-protect - (let ((*package* package) - (*default-pathname-defaults* - (asdf::pathname-directory-pathname - (translate-logical-pathname pathname)))) - (asdf::asdf-message - "~&; Loading system definition from ~A into ~A~%" ; - pathname package) - (load pathname)) - (delete-package package)))) - - (defun directory* (pathname-spec &rest keys &key &allow-other-keys) - (apply 'directory pathname-spec - (append keys - '#.(or #+allegro - '(:directories-are-files nil - :follow-symbolic-links nil) - #+clozure - '(:follow-links nil) - #+clisp - '(:circle t :if-does-not-exist :ignore) - #+(or cmu scl) - '(:follow-links nil :truenamep nil) - #+sbcl - (when (find-symbol "RESOLVE-SYMLINKS" '#:sb-impl) - '(:resolve-symlinks nil))))))) -(asdefs "2.17" - (defun collect-sub*directories-asd-files - (directory &key - (exclude asdf::*default-source-registry-exclusions*) - collect) - (asdf::collect-sub*directories - directory - (constantly t) - (lambda (x) (not (member (car (last (pathname-directory x))) - exclude :test #'equal))) - (lambda (dir) (collect-asds-in-directory dir collect)))) - - (defun system-source-directory (system-designator) - (asdf::pathname-directory-pathname - (asdf::system-source-file system-designator))) - - (defun filter-logical-directory-results (directory entries merger) - (if (typep directory 'logical-pathname) - (loop for f in entries - when - (if (typep f 'logical-pathname) - f - (let ((u (ignore-errors (funcall merger f)))) - (and u - (equal (ignore-errors (truename u)) - (truename f)) - u))) - collect it) - entries)) - - (defun directory-asd-files (directory) - (directory-files directory asdf::*wild-asd*))) - -(asdefs "2.19" - (defun subdirectories (directory) - (let* ((directory (asdf::ensure-directory-pathname directory)) - #-(or abcl cormanlisp xcl) - (wild (asdf::merge-pathnames* - #-(or abcl allegro cmu lispworks sbcl scl xcl) - asdf::*wild-directory* - #+(or abcl allegro cmu lispworks sbcl scl xcl) "*.*" - directory)) - (dirs - #-(or abcl cormanlisp xcl) - (ignore-errors - (directory* wild . #.(or #+clozure '(:directories t :files nil) - #+mcl '(:directories t)))) - #+(or abcl xcl) (system:list-directory directory) - #+cormanlisp (cl::directory-subdirs directory)) - #+(or abcl allegro cmu lispworks sbcl scl xcl) - (dirs (loop for x in dirs - for d = #+(or abcl xcl) (extensions:probe-directory x) - #+allegro (excl:probe-directory x) - #+(or cmu sbcl scl) (asdf::directory-pathname-p x) - #+lispworks (lw:file-directory-p x) - when d collect #+(or abcl allegro xcl) d - #+(or cmu lispworks sbcl scl) x))) - (filter-logical-directory-results - directory dirs - (let ((prefix (or (normalize-pathname-directory-component - (pathname-directory directory)) - ;; because allegro 8.x returns NIL for #p"FOO:" - '(:absolute)))) - (lambda (d) - (let ((dir (normalize-pathname-directory-component - (pathname-directory d)))) - (and (consp dir) (consp (cdr dir)) - (make-pathname - :defaults directory :name nil :type nil :version nil - :directory - (append prefix - (make-pathname-component-logical - (last dir)))))))))))) - -(asdefs "2.21" - (defun component-loaded-p (c) - (and (gethash 'load-op (asdf::component-operation-times - (asdf::find-component c nil))) t)) - - (defun normalize-pathname-directory-component (directory) - (cond - #-(or cmu sbcl scl) - ((stringp directory) `(:absolute ,directory) directory) - ((or (null directory) - (and (consp directory) - (member (first directory) '(:absolute :relative)))) - directory) - (t - (error "Unrecognized pathname directory component ~S" directory)))) - - (defun make-pathname-component-logical (x) - (typecase x - ((eql :unspecific) nil) - #+clisp (string (string-upcase x)) - #+clisp (cons (mapcar 'make-pathname-component-logical x)) - (t x))) - - (defun make-pathname-logical (pathname host) - (make-pathname - :host host - :directory (make-pathname-component-logical (pathname-directory pathname)) - :name (make-pathname-component-logical (pathname-name pathname)) - :type (make-pathname-component-logical (pathname-type pathname)) - :version (make-pathname-component-logical (pathname-version pathname))))) - -(asdefs "2.22" - (defun directory-files (directory &optional (pattern asdf::*wild-file*)) - (let ((dir (pathname directory))) - (when (typep dir 'logical-pathname) - (when (wild-pathname-p dir) - (error "Invalid wild pattern in logical directory ~S" directory)) - (unless (member (pathname-directory pattern) - '(() (:relative)) :test 'equal) - (error "Invalid file pattern ~S for logical directory ~S" - pattern directory)) - (setf pattern (make-pathname-logical pattern (pathname-host dir)))) - (let ((entries (ignore-errors - (directory* (asdf::merge-pathnames* pattern dir))))) - (filter-logical-directory-results - directory entries - (lambda (f) - (make-pathname :defaults dir - :name (make-pathname-component-logical - (pathname-name f)) - :type (make-pathname-component-logical - (pathname-type f)) - :version (make-pathname-component-logical - (pathname-version f))))))))) - -(asdefs "2.26.149" - (defmethod component-relative-pathname ((system asdf:system)) - (asdf::coerce-pathname - (and (slot-boundp system 'asdf::relative-pathname) - (slot-value system 'asdf::relative-pathname)) - :type :directory - :defaults (system-source-directory system))) - (defun load-asd (pathname &key name &allow-other-keys) - (asdf::load-sysdef (or name (string-downcase (pathname-name pathname))) - pathname))) - - -;;; Taken from ASDF 1.628 -(defmacro while-collecting ((&rest collectors) &body body) - `(asdf::while-collecting ,collectors ,@body)) - -;;; Now for SLIME-specific stuff - -(defun asdf-operation (operation) - (or (asdf::find-symbol* operation :asdf) - (error "Couldn't find ASDF operation ~S" operation))) - -(defun map-system-components (fn system) - (map-component-subcomponents fn (asdf:find-system system))) - -(defun map-component-subcomponents (fn component) - (when component - (funcall fn component) - (when (typep component 'asdf:module) - (dolist (c (asdf:module-components component)) - (map-component-subcomponents fn c))))) - -;;; Maintaining a pathname to component table - -(defvar *pathname-component* (make-hash-table :test 'equal)) - -(defun clear-pathname-component-table () - (clrhash *pathname-component*)) - -(defun register-system-pathnames (system) - (map-system-components 'register-component-pathname system)) - -(defun recompute-pathname-component-table () - (clear-pathname-component-table) - (asdf::map-systems 'register-system-pathnames)) - -(defun pathname-component (x) - (gethash (pathname x) *pathname-component*)) - -(defmethod asdf:component-pathname :around ((component asdf:component)) - (let ((p (call-next-method))) - (when (pathnamep p) - (setf (gethash p *pathname-component*) component)) - p)) - -(defun register-component-pathname (component) - (asdf:component-pathname component)) - -(recompute-pathname-component-table) - -;;; This is a crude hack, see ASDF's LP #481187. -(defslimefun who-depends-on (system) - (flet ((system-dependencies (op system) - (mapcar (lambda (dep) - (asdf::coerce-name (if (consp dep) (second dep) dep))) - (cdr (assoc op (asdf:component-depends-on op system)))))) - (let ((system-name (asdf::coerce-name system)) - (result)) - (asdf::map-systems - (lambda (system) - (when (member system-name - (system-dependencies 'asdf:load-op system) - :test #'string=) - (push (asdf:component-name system) result)))) - result))) - -(defmethod xref-doit ((type (eql :depends-on)) thing) - (when (typep thing '(or string symbol)) - (loop for dependency in (who-depends-on thing) - for asd-file = (asdf:system-definition-pathname dependency) - when asd-file - collect (list dependency - (swank/backend:make-location - `(:file ,(namestring asd-file)) - `(:position 1) - `(:snippet ,(format nil "(defsystem :~A" dependency) - :align t)))))) - -(defslimefun operate-on-system-for-emacs (system-name operation &rest keywords) - "Compile and load SYSTEM using ASDF. -Record compiler notes signalled as `compiler-condition's." - (collect-notes - (lambda () - (apply #'operate-on-system system-name operation keywords)))) - -(defun operate-on-system (system-name operation-name &rest keyword-args) - "Perform OPERATION-NAME on SYSTEM-NAME using ASDF. -The KEYWORD-ARGS are passed on to the operation. -Example: -\(operate-on-system \"cl-ppcre\" 'compile-op :force t)" - (handler-case - (with-compilation-hooks () - (apply #'asdf:operate (asdf-operation operation-name) - system-name keyword-args) - t) - ((or asdf:compile-error #+asdf3 asdf/lisp-build:compile-file-error) - () nil))) - -(defun unique-string-list (&rest lists) - (sort (delete-duplicates (apply #'append lists) :test #'string=) #'string<)) - -(defslimefun list-all-systems-in-central-registry () - "Returns a list of all systems in ASDF's central registry -AND in its source-registry. (legacy name)" - (unique-string-list - (mapcar - #'pathname-name - (while-collecting (c) - (loop for dir in asdf:*central-registry* - for defaults = (eval dir) - when defaults - do (collect-asds-in-directory defaults #'c)) - (asdf:ensure-source-registry) - (if (or #+asdf3 t - #-asdf3 (asdf:version-satisfies (asdf:asdf-version) "2.15")) - (loop :for k :being :the :hash-keys :of asdf::*source-registry* - :do (c k)) - #-asdf3 - (dolist (entry (asdf::flatten-source-registry)) - (destructuring-bind (directory &key recurse exclude) entry - (register-asd-directory - directory - :recurse recurse :exclude exclude :collect #'c)))))))) - -(defslimefun list-all-systems-known-to-asdf () - "Returns a list of all systems ASDF knows already." - (while-collecting (c) - (asdf::map-systems (lambda (system) (c (asdf:component-name system)))))) - -(defslimefun list-asdf-systems () - "Returns the systems in ASDF's central registry and those which ASDF -already knows." - (unique-string-list - (list-all-systems-known-to-asdf) - (list-all-systems-in-central-registry))) - -(defun asdf-component-source-files (component) - (while-collecting (c) - (labels ((f (x) - (typecase x - (asdf:source-file (c (asdf:component-pathname x))) - (asdf:module (map () #'f (asdf:module-components x)))))) - (f component)))) - -(defun make-operation (x) - #+#.(swank/backend:with-symbol 'make-operation 'asdf) - (asdf:make-operation x) - #-#.(swank/backend:with-symbol 'make-operation 'asdf) - (make-instance x)) - -(defun asdf-component-output-files (component) - (while-collecting (c) - (labels ((f (x) - (typecase x - (asdf:source-file - (map () #'c - (asdf:output-files (make-operation 'asdf:compile-op) x))) - (asdf:module (map () #'f (asdf:module-components x)))))) - (f component)))) - -(defslimefun asdf-system-files (name) - (let* ((system (asdf:find-system name)) - (files (mapcar #'namestring - (cons - (asdf:system-definition-pathname system) - (asdf-component-source-files system)))) - (main-file (find name files - :test #'equalp :key #'pathname-name :start 1))) - (if main-file - (cons main-file (remove main-file files - :test #'equal :count 1)) - files))) - -(defslimefun asdf-system-loaded-p (name) - (component-loaded-p name)) - -(defslimefun asdf-system-directory (name) - (namestring (translate-logical-pathname (asdf:system-source-directory name)))) - -(defun pathname-system (pathname) - (let ((component (pathname-component pathname))) - (when component - (asdf:component-name (asdf:component-system component))))) - -(defslimefun asdf-determine-system (file buffer-package-name) - (or - (and file - (pathname-system file)) - (and file - (progn - ;; If not found, let's rebuild the table first - (recompute-pathname-component-table) - (pathname-system file))) - ;; If we couldn't find an already defined system, - ;; try finding a system that's named like BUFFER-PACKAGE-NAME. - (loop with package = (guess-buffer-package buffer-package-name) - for name in (package-names package) - for system = (asdf:find-system (asdf::coerce-name name) nil) - when (and system - (or (not file) - (pathname-system file))) - return (asdf:component-name system)))) - -(defslimefun delete-system-fasls (name) - (let ((removed-count - (loop for file in (asdf-component-output-files - (asdf:find-system name)) - when (probe-file file) - count it - and - do (delete-file file)))) - (format nil "~d file~:p ~:*~[were~;was~:;were~] removed" removed-count))) - -(defvar *recompile-system* nil) - -(defmethod asdf:operation-done-p :around - ((operation asdf:compile-op) - component) - (unless (eql *recompile-system* - (asdf:component-system component)) - (call-next-method))) - -(defslimefun reload-system (name) - (let ((*recompile-system* (asdf:find-system name))) - (operate-on-system-for-emacs name 'asdf:load-op))) - -;; Doing list-all-systems-in-central-registry might be quite slow -;; since it accesses a file-system, so run it once at the background -;; to initialize caches. -(when (eql *communication-style* :spawn) - (spawn (lambda () - (ignore-errors (list-all-systems-in-central-registry))) - :name "init-asdf-fs-caches")) - -;;; Hook for compile-file-for-emacs - -(defun try-compile-file-with-asdf (pathname load-p &rest options) - (declare (ignore options)) - (let ((component (pathname-component pathname))) - (when component - ;;(format t "~&Compiling ASDF component ~S~%" component) - (let ((op (make-operation 'asdf:compile-op))) - (with-compilation-hooks () - (asdf:perform op component)) - (when load-p - (asdf:perform (make-operation 'asdf:load-op) component)) - (values t t nil (first (asdf:output-files op component))))))) - -(defun try-compile-asd-file (pathname load-p &rest options) - (declare (ignore load-p options)) - (when (equalp (pathname-type pathname) "asd") - (load-asd pathname) - (values t t nil pathname))) - -(pushnew 'try-compile-asd-file *compile-file-for-emacs-hook*) - -;;; (pushnew 'try-compile-file-with-asdf *compile-file-for-emacs-hook*) - -(provide :swank-asdf) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-buffer-streams.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-buffer-streams.lisp deleted file mode 100644 index 4d901e2..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-buffer-streams.lisp +++ /dev/null @@ -1,39 +0,0 @@ -;;; swank-buffer-streams.lisp --- Streams that output to a buffer -;;; -;;; Authors: Ed Langley -;;; -;;; License: This code has been placed in the Public Domain. All warranties -;;; are disclaimed. - -(in-package :swank) - -(defpackage :swank-buffer-streams - (:use :cl) - (:import-from :swank - defslimefun - add-hook - encode-message - send-event - find-thread - dcase - current-socket-io - send-to-emacs - current-thread-id - wait-for-event - - *emacs-connection* - *event-hook*) - (:export make-buffer-output-stream)) - -(in-package :swank-buffer-streams) - -(defun get-temporary-identifier () - (intern (symbol-name (gensym "BUFFER")) - :keyword)) - -(defun make-buffer-output-stream (&optional (target-identifier (get-temporary-identifier))) - (swank:ed-rpc '#:slime-make-buffer-stream-target (current-thread-id) target-identifier) - (values (swank:make-output-stream-for-target *emacs-connection* target-identifier) - target-identifier)) - -(provide :swank-buffer-streams) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-c-p-c.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-c-p-c.lisp deleted file mode 100644 index 6a766fb..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-c-p-c.lisp +++ /dev/null @@ -1,298 +0,0 @@ -;;; swank-c-p-c.lisp -- ILISP style Compound Prefix Completion -;; -;; Author: Luke Gorrie -;; Edi Weitz -;; Matthias Koeppe -;; Tobias C. Rittweiler -;; and others -;; -;; License: Public Domain -;; - - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (swank-require :swank-util)) - -(defslimefun completions (string default-package-name) - "Return a list of completions for a symbol designator STRING. - -The result is the list (COMPLETION-SET COMPLETED-PREFIX), where -COMPLETION-SET is the list of all matching completions, and -COMPLETED-PREFIX is the best (partial) completion of the input -string. - -Simple compound matching is supported on a per-hyphen basis: - - (completions \"m-v-\" \"COMMON-LISP\") - ==> ((\"multiple-value-bind\" \"multiple-value-call\" - \"multiple-value-list\" \"multiple-value-prog1\" - \"multiple-value-setq\" \"multiple-values-limit\") - \"multiple-value\") - -\(For more advanced compound matching, see FUZZY-COMPLETIONS.) - -If STRING is package qualified the result list will also be -qualified. If string is non-qualified the result strings are -also not qualified and are considered relative to -DEFAULT-PACKAGE-NAME. - -The way symbols are matched depends on the symbol designator's -format. The cases are as follows: - FOO - Symbols with matching prefix and accessible in the buffer package. - PKG:FOO - Symbols with matching prefix and external in package PKG. - PKG::FOO - Symbols with matching prefix and accessible in package PKG. -" - (multiple-value-bind (name package-name package internal-p) - (parse-completion-arguments string default-package-name) - (let* ((symbol-set (symbol-completion-set - name package-name package internal-p - (make-compound-prefix-matcher #\-))) - (package-set (package-completion-set - name package-name package internal-p - (make-compound-prefix-matcher '(#\. #\-)))) - (completion-set - (format-completion-set (nconc symbol-set package-set) - internal-p package-name))) - (when completion-set - (list completion-set (longest-compound-prefix completion-set)))))) - - -;;;;; Find completion set - -(defun symbol-completion-set (name package-name package internal-p matchp) - "Return the set of completion-candidates as strings." - (mapcar (completion-output-symbol-converter name) - (and package - (mapcar #'symbol-name - (find-matching-symbols name - package - (and (not internal-p) - package-name) - matchp))))) - -(defun package-completion-set (name package-name package internal-p matchp) - (declare (ignore package internal-p)) - (mapcar (completion-output-package-converter name) - (and (not package-name) - (find-matching-packages name matchp)))) - -(defun find-matching-symbols (string package external test) - "Return a list of symbols in PACKAGE matching STRING. -TEST is called with two strings. If EXTERNAL is true, only external -symbols are returned." - (let ((completions '()) - (converter (completion-output-symbol-converter string))) - (flet ((symbol-matches-p (symbol) - (and (or (not external) - (symbol-external-p symbol package)) - (funcall test string - (funcall converter (symbol-name symbol)))))) - (do-symbols* (symbol package) - (when (symbol-matches-p symbol) - (push symbol completions)))) - completions)) - -(defun find-matching-symbols-in-list (string list test) - "Return a list of symbols in LIST matching STRING. -TEST is called with two strings." - (let ((completions '()) - (converter (completion-output-symbol-converter string))) - (flet ((symbol-matches-p (symbol) - (funcall test string - (funcall converter (symbol-name symbol))))) - (dolist (symbol list) - (when (symbol-matches-p symbol) - (push symbol completions)))) - (remove-duplicates completions))) - -(defun find-matching-packages (name matcher) - "Return a list of package names matching NAME with MATCHER. -MATCHER is a two-argument predicate." - (let ((converter (completion-output-package-converter name))) - (remove-if-not (lambda (x) - (funcall matcher name (funcall converter x))) - (mapcar (lambda (pkgname) - (concatenate 'string pkgname ":")) - (loop for package in (list-all-packages) - nconcing (package-names package)))))) - - -;; PARSE-COMPLETION-ARGUMENTS return table: -;; -;; user behaviour | NAME | PACKAGE-NAME | PACKAGE -;; ----------------+--------+--------------+----------------------------------- -;; asdf [tab] | "asdf" | NIL | # -;; | | | or *BUFFER-PACKAGE* -;; asdf: [tab] | "" | "asdf" | # -;; | | | -;; asdf:foo [tab] | "foo" | "asdf" | # -;; | | | -;; as:fo [tab] | "fo" | "as" | NIL -;; | | | -;; : [tab] | "" | "" | # -;; | | | -;; :foo [tab] | "foo" | "" | # -;; -(defun parse-completion-arguments (string default-package-name) - "Parse STRING as a symbol designator. -Return these values: - SYMBOL-NAME - PACKAGE-NAME, or nil if the designator does not include an explicit package. - PACKAGE, generally the package to complete in. (However, if PACKAGE-NAME is - NIL, return the respective package of DEFAULT-PACKAGE-NAME instead; - if PACKAGE is non-NIL but a package cannot be found under that name, - return NIL.) - INTERNAL-P, if the symbol is qualified with `::'." - (multiple-value-bind (name package-name internal-p) - (tokenize-symbol string) - (flet ((default-package () - (or (guess-package default-package-name) *buffer-package*))) - (let ((package (cond - ((not package-name) - (default-package)) - ((equal package-name "") - (guess-package (symbol-name :keyword))) - ((find-locally-nicknamed-package - package-name (default-package))) - (t - (guess-package package-name))))) - (values name package-name package internal-p))))) - -(defun completion-output-case-converter (input &optional with-escaping-p) - "Return a function to convert strings for the completion output. -INPUT is used to guess the preferred case." - (ecase (readtable-case *readtable*) - (:upcase (cond ((or with-escaping-p - (and (plusp (length input)) - (not (some #'lower-case-p input)))) - #'identity) - (t #'string-downcase))) - (:invert (lambda (output) - (multiple-value-bind (lower upper) (determine-case output) - (cond ((and lower upper) output) - (lower (string-upcase output)) - (upper (string-downcase output)) - (t output))))) - (:downcase (cond ((or with-escaping-p - (and (zerop (length input)) - (not (some #'upper-case-p input)))) - #'identity) - (t #'string-upcase))) - (:preserve #'identity))) - -(defun completion-output-package-converter (input) - "Return a function to convert strings for the completion output. -INPUT is used to guess the preferred case." - (completion-output-case-converter input)) - -(defun completion-output-symbol-converter (input) - "Return a function to convert strings for the completion output. -INPUT is used to guess the preferred case. Escape symbols when needed." - (let ((case-converter (completion-output-case-converter input)) - (case-converter-with-escaping (completion-output-case-converter input t))) - (lambda (str) - (if (or (multiple-value-bind (lowercase uppercase) - (determine-case str) - ;; In these readtable cases, symbols with letters from - ;; the wrong case need escaping - (case (readtable-case *readtable*) - (:upcase lowercase) - (:downcase uppercase) - (t nil))) - (some (lambda (el) - (or (member el '(#\: #\Space #\Newline #\Tab)) - (multiple-value-bind (macrofun nonterminating) - (get-macro-character el) - (and macrofun - (not nonterminating))))) - str)) - (concatenate 'string "|" (funcall case-converter-with-escaping str) "|") - (funcall case-converter str))))) - - -(defun determine-case (string) - "Return two booleans LOWER and UPPER indicating whether STRING -contains lower or upper case characters." - (values (some #'lower-case-p string) - (some #'upper-case-p string))) - - -;;;;; Compound-prefix matching - -(defun make-compound-prefix-matcher (delimiter &key (test #'char=)) - "Returns a matching function that takes a `prefix' and a -`target' string and which returns T if `prefix' is a -compound-prefix of `target', and otherwise NIL. - -Viewing each of `prefix' and `target' as a series of substrings -delimited by DELIMITER, if each substring of `prefix' is a prefix -of the corresponding substring in `target' then we call `prefix' -a compound-prefix of `target'. - -DELIMITER may be a character, or a list of characters." - (let ((delimiters (etypecase delimiter - (character (list delimiter)) - (cons (assert (every #'characterp delimiter)) - delimiter)))) - (lambda (prefix target) - (declare (type simple-string prefix target)) - (loop with tpos = 0 - for ch across prefix - always (and (< tpos (length target)) - (let ((delimiter (car (member ch delimiters :test test)))) - (if delimiter - (setf tpos (position delimiter target :start tpos)) - (funcall test ch (aref target tpos))))) - do (incf tpos))))) - - -;;;;; Extending the input string by completion - -(defun longest-compound-prefix (completions &optional (delimiter #\-)) - "Return the longest compound _prefix_ for all COMPLETIONS." - (flet ((tokenizer (string) (tokenize-completion string delimiter))) - (untokenize-completion - (loop for token-list in (transpose-lists (mapcar #'tokenizer completions)) - if (notevery #'string= token-list (rest token-list)) - ;; Note that we possibly collect the "" here as well, so that - ;; UNTOKENIZE-COMPLETION will append a delimiter for us. - collect (longest-common-prefix token-list) - and do (loop-finish) - else collect (first token-list)) - delimiter))) - -(defun tokenize-completion (string delimiter) - "Return all substrings of STRING delimited by DELIMITER." - (loop with end - for start = 0 then (1+ end) - until (> start (length string)) - do (setq end (or (position delimiter string :start start) (length string))) - collect (subseq string start end))) - -(defun untokenize-completion (tokens &optional (delimiter #\-)) - (format nil (format nil "~~{~~A~~^~a~~}" delimiter) tokens)) - -(defun transpose-lists (lists) - "Turn a list-of-lists on its side. -If the rows are of unequal length, truncate uniformly to the shortest. - -For example: -\(transpose-lists '((ONE TWO THREE) (1 2))) - => ((ONE 1) (TWO 2))" - (cond ((null lists) '()) - ((some #'null lists) '()) - (t (cons (mapcar #'car lists) - (transpose-lists (mapcar #'cdr lists)))))) - - -;;;; Completion for character names - -(defslimefun completions-for-character (prefix) - (let* ((matcher (make-compound-prefix-matcher #\_ :test #'char-equal)) - (completion-set (character-completion-set prefix matcher)) - (completions (sort completion-set #'string<))) - (list completions (longest-compound-prefix completions #\_)))) - -(provide :swank-c-p-c) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-clipboard.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-clipboard.lisp deleted file mode 100644 index 52b1085..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-clipboard.lisp +++ /dev/null @@ -1,71 +0,0 @@ -;;; swank-clipboard.lisp --- Object clipboard -;; -;; Written by Helmut Eller in 2008. -;; License: Public Domain - -(defpackage :swank-clipboard - (:use :cl) - (:import-from :swank :defslimefun :with-buffer-syntax :dcase) - (:export :add :delete-entry :entries :entry-to-ref :ref)) - -(in-package :swank-clipboard) - -(defstruct clipboard entries (counter 0)) - -(defvar *clipboard* (make-clipboard)) - -(defslimefun add (datum) - (let ((value (dcase datum - ((:string string package) - (with-buffer-syntax (package) - (eval (read-from-string string)))) - ((:inspector part) - (swank:inspector-nth-part part)) - ((:sldb frame var) - (swank/backend:frame-var-value frame var))))) - (clipboard-add value) - (format nil "Added: ~a" - (entry-to-string (1- (length (clipboard-entries *clipboard*))))))) - -(defslimefun entries () - (loop for (ref . value) in (clipboard-entries *clipboard*) - collect `(,ref . ,(to-line value)))) - -(defslimefun delete-entry (entry) - (let ((msg (format nil "Deleted: ~a" (entry-to-string entry)))) - (clipboard-delete-entry entry) - msg)) - -(defslimefun entry-to-ref (entry) - (destructuring-bind (ref . value) (clipboard-entry entry) - (list ref (to-line value 5)))) - -(defun clipboard-add (value) - (setf (clipboard-entries *clipboard*) - (append (clipboard-entries *clipboard*) - (list (cons (incf (clipboard-counter *clipboard*)) - value))))) - -(defun clipboard-ref (ref) - (let ((tail (member ref (clipboard-entries *clipboard*) :key #'car))) - (cond (tail (cdr (car tail))) - (t (error "Invalid clipboard ref: ~s" ref))))) - -(defun clipboard-entry (entry) - (elt (clipboard-entries *clipboard*) entry)) - -(defun clipboard-delete-entry (index) - (let* ((list (clipboard-entries *clipboard*)) - (tail (nthcdr index list))) - (setf (clipboard-entries *clipboard*) - (append (ldiff list tail) (cdr tail))))) - -(defun entry-to-string (entry) - (destructuring-bind (ref . value) (clipboard-entry entry) - (format nil "#@~d(~a)" ref (to-line value)))) - -(defun to-line (object &optional (width 75)) - (with-output-to-string (*standard-output*) - (write object :right-margin width :lines 1))) - -(provide :swank-clipboard) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-fancy-inspector.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-fancy-inspector.lisp deleted file mode 100644 index c2201a8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-fancy-inspector.lisp +++ /dev/null @@ -1,1006 +0,0 @@ -;;; swank-fancy-inspector.lisp --- Fancy inspector for CLOS objects -;; -;; Author: Marco Baringer and others -;; License: Public Domain -;; - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (swank-require :swank-util)) - -(defmethod emacs-inspect ((symbol symbol)) - (let ((package (symbol-package symbol))) - (multiple-value-bind (_symbol status) - (and package (find-symbol (string symbol) package)) - (declare (ignore _symbol)) - (append - (label-value-line "Its name is" (symbol-name symbol)) - ;; - ;; Value - (cond ((boundp symbol) - (append - (label-value-line (if (constantp symbol) - "It is a constant of value" - "It is a global variable bound to") - (symbol-value symbol) :newline nil) - ;; unbinding constants might be not a good idea, but - ;; implementations usually provide a restart. - `(" " (:action "[unbind]" - ,(lambda () (makunbound symbol)))) - '((:newline)))) - (t '("It is unbound." (:newline)))) - (docstring-ispec "Documentation" symbol 'variable) - (multiple-value-bind (expansion definedp) (macroexpand symbol) - (if definedp - (label-value-line "It is a symbol macro with expansion" - expansion))) - ;; - ;; Function - (if (fboundp symbol) - (append (if (macro-function symbol) - `("It a macro with macro-function: " - (:value ,(macro-function symbol))) - `("It is a function: " - (:value ,(symbol-function symbol)))) - `(" " (:action "[unbind]" - ,(lambda () (fmakunbound symbol)))) - `((:newline))) - `("It has no function value." (:newline))) - (docstring-ispec "Function documentation" symbol 'function) - (when (compiler-macro-function symbol) - (append - (label-value-line "It also names the compiler macro" - (compiler-macro-function symbol) :newline nil) - `(" " (:action "[remove]" - ,(lambda () - (setf (compiler-macro-function symbol) nil))) - (:newline)))) - (docstring-ispec "Compiler macro documentation" - symbol 'compiler-macro) - ;; - ;; Package - (if package - `("It is " ,(string-downcase (string status)) - " to the package: " - (:value ,package ,(package-name package)) - ,@(if (eq :internal status) - `(" " - (:action "[export]" - ,(lambda () (export symbol package))))) - " " - (:action "[unintern]" - ,(lambda () (unintern symbol package))) - (:newline)) - '("It is a non-interned symbol." (:newline))) - ;; - ;; Plist - (label-value-line "Property list" (symbol-plist symbol)) - ;; - ;; Class - (if (find-class symbol nil) - `("It names the class " - (:value ,(find-class symbol) ,(string symbol)) - " " - (:action "[remove]" - ,(lambda () (setf (find-class symbol) nil))) - (:newline))) - ;; - ;; More package - (if (find-package symbol) - (label-value-line "It names the package" (find-package symbol))) - (inspect-type-specifier symbol))))) - -#-sbcl -(defun inspect-type-specifier (symbol) - (declare (ignore symbol))) - -#+sbcl -(defun inspect-type-specifier (symbol) - (let* ((kind (sb-int:info :type :kind symbol)) - (fun (case kind - (:defined - (or (sb-int:info :type :expander symbol) t)) - (:primitive - (or #.(if (swank/sbcl::sbcl-version>= 1 3 1) - '(let ((x (sb-int:info :type :expander symbol))) - (if (consp x) - (car x) - x)) - '(sb-int:info :type :translator symbol)) - t))))) - (when fun - (append - (list - (format nil "It names a ~@[primitive~* ~]type-specifier." - (eq kind :primitive)) - '(:newline)) - (docstring-ispec "Type-specifier documentation" symbol 'type) - (unless (eq t fun) - (let ((arglist (arglist fun))) - (append - `("Type-specifier lambda-list: " - ;; Could use ~:s, but inspector-princ does a bit more, - ;; and not all NILs in the arglist should be printed that way. - ,(if arglist - (inspector-princ arglist) - "()") - (:newline)) - (multiple-value-bind (expansion ok) - (handler-case (sb-ext:typexpand-1 symbol) - (error () (values nil nil))) - (when ok - (list "Type-specifier expansion: " - (princ-to-string expansion))))))))))) - -(defun docstring-ispec (label object kind) - "Return a inspector spec if OBJECT has a docstring of kind KIND." - (let ((docstring (documentation object kind))) - (cond ((not docstring) nil) - ((< (+ (length label) (length docstring)) - 75) - (list label ": " docstring '(:newline))) - (t - (list label ":" '(:newline) " " docstring '(:newline)))))) - -(unless (find-method #'emacs-inspect '() (list (find-class 'function)) nil) - (defmethod emacs-inspect ((f function)) - (inspect-function f))) - -(defun inspect-function (f) - (append - (label-value-line "Name" (function-name f)) - `("Its argument list is: " - ,(inspector-princ (arglist f)) (:newline)) - (docstring-ispec "Documentation" f t) - (if (function-lambda-expression f) - (label-value-line "Lambda Expression" - (function-lambda-expression f))))) - -(defun method-specializers-for-inspect (method) - "Return a \"pretty\" list of the method's specializers. Normal - specializers are replaced by the name of the class, eql - specializers are replaced by `(eql ,object)." - (mapcar (lambda (spec) - (typecase spec - (swank-mop:eql-specializer - `(eql ,(swank-mop:eql-specializer-object spec))) - #-sbcl - (t - (swank-mop:class-name spec)) - #+sbcl - (t - ;; SBCL has extended specializers - (let ((gf (sb-mop:method-generic-function method))) - (cond (gf - (sb-pcl:unparse-specializer-using-class gf spec)) - ((typep spec 'class) - (class-name spec)) - (t - spec)))))) - (swank-mop:method-specializers method))) - -(defun method-for-inspect-value (method) - "Returns a \"pretty\" list describing METHOD. The first element - of the list is the name of generic-function method is - specialiazed on, the second element is the method qualifiers, - the rest of the list is the method's specialiazers (as per - method-specializers-for-inspect)." - (append (list (swank-mop:generic-function-name - (swank-mop:method-generic-function method))) - (swank-mop:method-qualifiers method) - (method-specializers-for-inspect method))) - -(defmethod emacs-inspect ((object standard-object)) - (let ((class (class-of object))) - `("Class: " (:value ,class) (:newline) - ,@(all-slots-for-inspector object)))) - -(defvar *gf-method-getter* 'methods-by-applicability - "This function is called to get the methods of a generic function. -The default returns the method sorted by applicability. -See `methods-by-applicability'.") - -(defun specializer< (specializer1 specializer2) - "Return true if SPECIALIZER1 is more specific than SPECIALIZER2." - (let ((s1 specializer1) (s2 specializer2) ) - (cond ((typep s1 'swank-mop:eql-specializer) - (not (typep s2 'swank-mop:eql-specializer))) - ((typep s1 'class) - (flet ((cpl (class) - (and (swank-mop:class-finalized-p class) - (swank-mop:class-precedence-list class)))) - (member s2 (cpl s1))))))) - -(defun methods-by-applicability (gf) - "Return methods ordered by most specific argument types. - -`method-specializer<' is used for sorting." - ;; FIXME: argument-precedence-order and qualifiers are ignored. - (labels ((method< (meth1 meth2) - (loop for s1 in (swank-mop:method-specializers meth1) - for s2 in (swank-mop:method-specializers meth2) - do (cond ((specializer< s2 s1) (return nil)) - ((specializer< s1 s2) (return t)))))) - (stable-sort (copy-seq (swank-mop:generic-function-methods gf)) - #'method<))) - -(defun abbrev-doc (doc &optional (maxlen 80)) - "Return the first sentence of DOC, but not more than MAXLAN characters." - (subseq doc 0 (min (1+ (or (position #\. doc) (1- maxlen))) - maxlen - (length doc)))) - -(defstruct (inspector-checklist (:conc-name checklist.) - (:constructor %make-checklist (buttons))) - (buttons nil :type (or null simple-vector)) - (count 0)) - -(defun make-checklist (n) - (%make-checklist (make-array n :initial-element nil))) - -(defun reinitialize-checklist (checklist) - ;; Along this counter the buttons are created, so we have to - ;; initialize it to 0 everytime the inspector page is redisplayed. - (setf (checklist.count checklist) 0) - checklist) - -(defun make-checklist-button (checklist) - (let ((buttons (checklist.buttons checklist)) - (i (checklist.count checklist))) - (incf (checklist.count checklist)) - `(:action ,(if (svref buttons i) - "[X]" - "[ ]") - ,#'(lambda () - (setf (svref buttons i) (not (svref buttons i)))) - :refreshp t))) - -(defmacro do-checklist ((idx checklist) &body body) - "Iterate over all set buttons in CHECKLIST." - (let ((buttons (gensym "buttons"))) - `(let ((,buttons (checklist.buttons ,checklist))) - (dotimes (,idx (length ,buttons)) - (when (svref ,buttons ,idx) - ,@body))))) - -(defun box (thing) (cons :box thing)) -(defun ref (box) - (assert (eq (car box) :box)) - (cdr box)) -(defun (setf ref) (value box) - (assert (eq (car box) :box)) - (setf (cdr box) value)) - -(defvar *inspector-slots-default-order* :alphabetically - "Accepted values: :alphabetically and :unsorted") - -(defvar *inspector-slots-default-grouping* :all - "Accepted values: :inheritance and :all") - -(defgeneric all-slots-for-inspector (object)) - -(defmethod all-slots-for-inspector ((object standard-object)) - (let* ((class (class-of object)) - (direct-slots (swank-mop:class-direct-slots class)) - (effective-slots (swank-mop:class-slots class)) - (longest-slot-name-length - (loop for slot :in effective-slots - maximize (length (symbol-name - (swank-mop:slot-definition-name slot))))) - (checklist - (reinitialize-checklist - (ensure-istate-metadata object :checklist - (make-checklist (length effective-slots))))) - (grouping-kind - ;; We box the value so we can re-set it. - (ensure-istate-metadata object :grouping-kind - (box *inspector-slots-default-grouping*))) - (sort-order - (ensure-istate-metadata object :sort-order - (box *inspector-slots-default-order*))) - (sort-predicate (ecase (ref sort-order) - (:alphabetically #'string<) - (:unsorted (constantly nil)))) - (sorted-slots (sort (copy-seq effective-slots) - sort-predicate - :key #'swank-mop:slot-definition-name)) - (effective-slots - (ecase (ref grouping-kind) - (:all sorted-slots) - (:inheritance (stable-sort-by-inheritance sorted-slots - class sort-predicate))))) - `("--------------------" - (:newline) - " Group slots by inheritance " - (:action ,(ecase (ref grouping-kind) - (:all "[ ]") - (:inheritance "[X]")) - ,(lambda () - ;; We have to do this as the order of slots will - ;; be sorted differently. - (fill (checklist.buttons checklist) nil) - (setf (ref grouping-kind) - (ecase (ref grouping-kind) - (:all :inheritance) - (:inheritance :all)))) - :refreshp t) - (:newline) - " Sort slots alphabetically " - (:action ,(ecase (ref sort-order) - (:unsorted "[ ]") - (:alphabetically "[X]")) - ,(lambda () - (fill (checklist.buttons checklist) nil) - (setf (ref sort-order) - (ecase (ref sort-order) - (:unsorted :alphabetically) - (:alphabetically :unsorted)))) - :refreshp t) - (:newline) - ,@ (case (ref grouping-kind) - (:all - `((:newline) - "All Slots:" - (:newline) - ,@(make-slot-listing checklist object class - effective-slots direct-slots - longest-slot-name-length))) - (:inheritance - (list-all-slots-by-inheritance checklist object class - effective-slots direct-slots - longest-slot-name-length))) - (:newline) - (:action "[set value]" - ,(lambda () - (do-checklist (idx checklist) - (query-and-set-slot class object - (nth idx effective-slots)))) - :refreshp t) - " " - (:action "[make unbound]" - ,(lambda () - (do-checklist (idx checklist) - (swank-mop:slot-makunbound-using-class - class object (nth idx effective-slots)))) - :refreshp t) - (:newline)))) - -(defun list-all-slots-by-inheritance (checklist object class effective-slots - direct-slots longest-slot-name-length) - (flet ((slot-home-class (slot) - (slot-home-class-using-class slot class))) - (let ((current-slots '())) - (append - (loop for slot in effective-slots - for previous-home-class = (slot-home-class slot) then home-class - for home-class = previous-home-class then (slot-home-class slot) - if (eq home-class previous-home-class) - do (push slot current-slots) - else - collect '(:newline) - and collect (format nil "~A:" (class-name previous-home-class)) - and collect '(:newline) - and append (make-slot-listing checklist object class - (nreverse current-slots) - direct-slots - longest-slot-name-length) - and do (setf current-slots (list slot))) - (and current-slots - `((:newline) - ,(format nil "~A:" - (class-name (slot-home-class-using-class - (car current-slots) class))) - (:newline) - ,@(make-slot-listing checklist object class - (nreverse current-slots) direct-slots - longest-slot-name-length))))))) - -(defun make-slot-listing (checklist object class effective-slots direct-slots - longest-slot-name-length) - (flet ((padding-for (slot-name) - (make-string (- longest-slot-name-length (length slot-name)) - :initial-element #\Space))) - (loop - for effective-slot :in effective-slots - for direct-slot = (find (swank-mop:slot-definition-name effective-slot) - direct-slots - :key #'swank-mop:slot-definition-name) - for slot-name = (inspector-princ - (swank-mop:slot-definition-name effective-slot)) - collect (make-checklist-button checklist) - collect " " - collect `(:value ,(if direct-slot - (list direct-slot effective-slot) - effective-slot) - ,slot-name) - collect (padding-for slot-name) - collect " = " - collect (slot-value-for-inspector class object effective-slot) - collect '(:newline)))) - -(defgeneric slot-value-for-inspector (class object slot) - (:method (class object slot) - (let ((boundp (swank-mop:slot-boundp-using-class class object slot))) - (if boundp - `(:value ,(swank-mop:slot-value-using-class class object slot)) - "#")))) - -(defun slot-home-class-using-class (slot class) - (let ((slot-name (swank-mop:slot-definition-name slot))) - (loop for class in (reverse (swank-mop:class-precedence-list class)) - thereis (and (member slot-name (swank-mop:class-direct-slots class) - :key #'swank-mop:slot-definition-name - :test #'eq) - class)))) - -(defun stable-sort-by-inheritance (slots class predicate) - (stable-sort slots predicate - :key #'(lambda (s) - (class-name (slot-home-class-using-class s class))))) - -(defun query-and-set-slot (class object slot) - (let* ((slot-name (swank-mop:slot-definition-name slot)) - (value-string (read-from-minibuffer-in-emacs - (format nil "Set slot ~S to (evaluated) : " - slot-name)))) - (when (and value-string (not (string= value-string ""))) - (with-simple-restart (abort "Abort setting slot ~S" slot-name) - (setf (swank-mop:slot-value-using-class class object slot) - (eval (read-from-string value-string))))))) - - -(defmethod emacs-inspect ((gf standard-generic-function)) - (flet ((lv (label value) (label-value-line label value))) - (append - (lv "Name" (swank-mop:generic-function-name gf)) - (lv "Arguments" (swank-mop:generic-function-lambda-list gf)) - (docstring-ispec "Documentation" gf t) - (lv "Method class" (swank-mop:generic-function-method-class gf)) - (lv "Method combination" - (swank-mop:generic-function-method-combination gf)) - `("Methods: " (:newline)) - (loop for method in (funcall *gf-method-getter* gf) append - `((:value ,method ,(inspector-princ - ;; drop the name of the GF - (cdr (method-for-inspect-value method)))) - " " - (:action "[remove method]" - ,(let ((m method)) ; LOOP reassigns method - (lambda () - (remove-method gf m)))) - (:newline))) - `((:newline)) - (all-slots-for-inspector gf)))) - -(defmethod emacs-inspect ((method standard-method)) - `(,@(if (swank-mop:method-generic-function method) - `("Method defined on the generic function " - (:value ,(swank-mop:method-generic-function method) - ,(inspector-princ - (swank-mop:generic-function-name - (swank-mop:method-generic-function method))))) - '("Method without a generic function")) - (:newline) - ,@(docstring-ispec "Documentation" method t) - "Lambda List: " (:value ,(swank-mop:method-lambda-list method)) - (:newline) - "Specializers: " (:value ,(swank-mop:method-specializers method) - ,(inspector-princ - (method-specializers-for-inspect method))) - (:newline) - "Qualifiers: " (:value ,(swank-mop:method-qualifiers method)) - (:newline) - "Method function: " (:value ,(swank-mop:method-function method)) - (:newline) - ,@(all-slots-for-inspector method))) - -(defun specializer-direct-methods (class) - (sort (copy-seq (swank-mop:specializer-direct-methods class)) - #'string< - :key - (lambda (x) - (symbol-name - (let ((name (swank-mop::generic-function-name - (swank-mop::method-generic-function x)))) - (if (symbolp name) - name - (second name))))))) - -(defmethod emacs-inspect ((class standard-class)) - `("Name: " - (:value ,(class-name class)) - (:newline) - "Super classes: " - ,@(common-seperated-spec (swank-mop:class-direct-superclasses class)) - (:newline) - "Direct Slots: " - ,@(common-seperated-spec - (swank-mop:class-direct-slots class) - (lambda (slot) - `(:value ,slot ,(inspector-princ - (swank-mop:slot-definition-name slot))))) - (:newline) - "Effective Slots: " - ,@(if (swank-mop:class-finalized-p class) - (common-seperated-spec - (swank-mop:class-slots class) - (lambda (slot) - `(:value ,slot ,(inspector-princ - (swank-mop:slot-definition-name slot))))) - `("# " - (:action "[finalize]" - ,(lambda () (swank-mop:finalize-inheritance class))))) - (:newline) - ,@(let ((doc (documentation class t))) - (when doc - `("Documentation:" (:newline) ,(inspector-princ doc) (:newline)))) - "Sub classes: " - ,@(common-seperated-spec (swank-mop:class-direct-subclasses class) - (lambda (sub) - `(:value ,sub - ,(inspector-princ (class-name sub))))) - (:newline) - "Precedence List: " - ,@(if (swank-mop:class-finalized-p class) - (common-seperated-spec - (swank-mop:class-precedence-list class) - (lambda (class) - `(:value ,class ,(inspector-princ (class-name class))))) - '("#")) - (:newline) - ,@(when (swank-mop:specializer-direct-methods class) - `("It is used as a direct specializer in the following methods:" - (:newline) - ,@(loop - for method in (specializer-direct-methods class) - collect " " - collect `(:value ,method - ,(inspector-princ - (method-for-inspect-value method))) - collect '(:newline) - if (documentation method t) - collect " Documentation: " and - collect (abbrev-doc (documentation method t)) and - collect '(:newline)))) - "Prototype: " ,(if (swank-mop:class-finalized-p class) - `(:value ,(swank-mop:class-prototype class)) - '"#") - (:newline) - ,@(all-slots-for-inspector class))) - -(defmethod emacs-inspect ((slot swank-mop:standard-slot-definition)) - `("Name: " - (:value ,(swank-mop:slot-definition-name slot)) - (:newline) - ,@(when (swank-mop:slot-definition-documentation slot) - `("Documentation:" (:newline) - (:value ,(swank-mop:slot-definition-documentation - slot)) - (:newline))) - "Init args: " - (:value ,(swank-mop:slot-definition-initargs slot)) - (:newline) - "Init form: " - ,(if (swank-mop:slot-definition-initfunction slot) - `(:value ,(swank-mop:slot-definition-initform slot)) - "#") - (:newline) - "Init function: " - (:value ,(swank-mop:slot-definition-initfunction slot)) - (:newline) - ,@(all-slots-for-inspector slot))) - - -;; Wrapper structure over the list of symbols of a package that should -;; be displayed with their respective classification flags. This is -;; because we need a unique type to dispatch on in EMACS-INSPECT. -;; Used by the Inspector for packages. -(defstruct (%package-symbols-container - (:conc-name %container.) - (:constructor %%make-package-symbols-container)) - title ;; A string; the title of the inspector page in Emacs. - description ;; A list of renderable objects; used as description. - symbols ;; A list of symbols. Supposed to be sorted alphabetically. - grouping-kind) ;; Either :SYMBOL or :CLASSIFICATION. Cf. MAKE-SYMBOLS-LISTING - - -(defun %make-package-symbols-container (&key title description symbols) - (%%make-package-symbols-container :title title :description description - :symbols symbols :grouping-kind :symbol)) - -(defgeneric make-symbols-listing (grouping-kind symbols)) - -(defmethod make-symbols-listing ((grouping-kind (eql :symbol)) symbols) - "Returns an object renderable by Emacs' inspector side that -alphabetically lists all the symbols in SYMBOLS together with a -concise string representation of what each symbol -represents (see SYMBOL-CLASSIFICATION-STRING)" - (let ((max-length (loop for s in symbols - maximizing (length (symbol-name s)))) - (distance 10)) ; empty distance between name and classification - (flet ((string-representations (symbol) - (let* ((name (symbol-name symbol)) - (length (length name)) - (padding (- max-length length))) - (values - (concatenate 'string - name - (make-string (+ padding distance) - :initial-element #\Space)) - (symbol-classification-string symbol))))) - `("" ; 8 is (length "Symbols:") - "Symbols:" ,(make-string (+ -8 max-length distance) - :initial-element #\Space) - "Flags:" - (:newline) - ,(concatenate 'string ; underlining dashes - (make-string (+ max-length distance -1) - :initial-element #\-) - " " - (symbol-classification-string '#:foo)) - (:newline) - ,@(loop for symbol in symbols appending - (multiple-value-bind (symbol-string classification-string) - (string-representations symbol) - `((:value ,symbol ,symbol-string) ,classification-string - (:newline) - ))))))) - -(defmethod make-symbols-listing ((grouping-kind (eql :classification)) symbols) - "For each possible classification (cf. CLASSIFY-SYMBOL), group -all the symbols in SYMBOLS to all of their respective -classifications. (If a symbol is, for instance, boundp and a -generic-function, it'll appear both below the BOUNDP group and -the GENERIC-FUNCTION group.) As macros and special-operators are -specified to be FBOUNDP, there is no general FBOUNDP group, -instead there are the three explicit FUNCTION, MACRO and -SPECIAL-OPERATOR groups." - (let ((table (make-hash-table :test #'eq)) - (+default-classification+ :misc)) - (flet ((normalize-classifications (classifications) - (cond ((null classifications) `(,+default-classification+)) - ;; Convert an :FBOUNDP in CLASSIFICATIONS to - ;; :FUNCTION if possible. - ((and (member :fboundp classifications) - (not (member :macro classifications)) - (not (member :special-operator classifications))) - (substitute :function :fboundp classifications)) - (t (remove :fboundp classifications))))) - (loop for symbol in symbols do - (loop for classification in - (normalize-classifications (classify-symbol symbol)) - ;; SYMBOLS are supposed to be sorted alphabetically; - ;; this property is preserved here except for reversing. - do (push symbol (gethash classification table))))) - (let* ((classifications (loop for k being each hash-key in table - collect k)) - (classifications (sort classifications - ;; Sort alphabetically, except - ;; +DEFAULT-CLASSIFICATION+ which - ;; sort to the end. - (lambda (a b) - (cond ((eql a +default-classification+) - nil) - ((eql b +default-classification+) - t) - (t (string< a b))))))) - (loop for classification in classifications - for symbols = (gethash classification table) - appending`(,(symbol-name classification) - (:newline) - ,(make-string 64 :initial-element #\-) - (:newline) - ,@(mapcan (lambda (symbol) - `((:value ,symbol ,(symbol-name symbol)) - (:newline))) - ;; restore alphabetic order. - (nreverse symbols)) - (:newline)))))) - -(defmethod emacs-inspect ((%container %package-symbols-container)) - (with-struct (%container. title description symbols grouping-kind) %container - `(,title (:newline) (:newline) - ,@description - (:newline) - " " ,(ecase grouping-kind - (:symbol - `(:action "[Group by classification]" - ,(lambda () - (setf grouping-kind :classification)) - :refreshp t)) - (:classification - `(:action "[Group by symbol]" - ,(lambda () (setf grouping-kind :symbol)) - :refreshp t))) - (:newline) (:newline) - ,@(make-symbols-listing grouping-kind symbols)))) - -(defun display-link (type symbols length &key title description) - (if (null symbols) - (format nil "0 ~A symbols." type) - `(:value ,(%make-package-symbols-container :title title - :description description - :symbols symbols) - ,(format nil "~D ~A symbol~P." length type length)))) - -(defmethod emacs-inspect ((package package)) - (let ((package-name (package-name package)) - (package-nicknames (package-nicknames package)) - (package-use-list (package-use-list package)) - (package-used-by-list (package-used-by-list package)) - (shadowed-symbols (package-shadowing-symbols package)) - (present-symbols '()) (present-symbols-length 0) - (internal-symbols '()) (internal-symbols-length 0) - (inherited-symbols '()) (inherited-symbols-length 0) - (external-symbols '()) (external-symbols-length 0)) - - (do-symbols* (sym package) - (let ((status (symbol-status sym package))) - (when (eq status :inherited) - (push sym inherited-symbols) (incf inherited-symbols-length) - (go :continue)) - (push sym present-symbols) (incf present-symbols-length) - (cond ((eq status :internal) - (push sym internal-symbols) (incf internal-symbols-length)) - (t - (push sym external-symbols) (incf external-symbols-length)))) - :continue) - - (setf package-nicknames (sort (copy-list package-nicknames) - #'string<) - package-use-list (sort (copy-list package-use-list) - #'string< :key #'package-name) - package-used-by-list (sort (copy-list package-used-by-list) - #'string< :key #'package-name) - shadowed-symbols (sort (copy-list shadowed-symbols) - #'string<)) - ;;; SORT + STRING-LESSP conses on at least SBCL 0.9.18. - (setf present-symbols (sort present-symbols #'string<) - internal-symbols (sort internal-symbols #'string<) - external-symbols (sort external-symbols #'string<) - inherited-symbols (sort inherited-symbols #'string<)) - `("" ;; dummy to preserve indentation. - "Name: " (:value ,package-name) (:newline) - - "Nick names: " ,@(common-seperated-spec package-nicknames) (:newline) - - ,@(when (documentation package t) - `("Documentation:" (:newline) - ,(documentation package t) (:newline))) - - "Use list: " ,@(common-seperated-spec - package-use-list - (lambda (package) - `(:value ,package ,(package-name package)))) - (:newline) - - "Used by list: " ,@(common-seperated-spec - package-used-by-list - (lambda (package) - `(:value ,package ,(package-name package)))) - (:newline) - - ,(display-link "present" present-symbols present-symbols-length - :title - (format nil "All present symbols of package \"~A\"" - package-name) - :description - '("A symbol is considered present in a package if it's" - (:newline) - "\"accessible in that package directly, rather than" - (:newline) - "being inherited from another package.\"" - (:newline) - "(CLHS glossary entry for `present')" - (:newline))) - - (:newline) - ,(display-link "external" external-symbols external-symbols-length - :title - (format nil "All external symbols of package \"~A\"" - package-name) - :description - '("A symbol is considered external of a package if it's" - (:newline) - "\"part of the `external interface' to the package and" - (:newline) - "[is] inherited by any other package that uses the" - (:newline) - "package.\" (CLHS glossary entry of `external')" - (:newline))) - (:newline) - ,(display-link "internal" internal-symbols internal-symbols-length - :title - (format nil "All internal symbols of package \"~A\"" - package-name) - :description - '("A symbol is considered internal of a package if it's" - (:newline) - "present and not external---that is if the package is" - (:newline) - "the home package of the symbol, or if the symbol has" - (:newline) - "been explicitly imported into the package." - (:newline) - (:newline) - "Notice that inherited symbols will thus not be listed," - (:newline) - "which deliberately deviates from the CLHS glossary" - (:newline) - "entry of `internal' because it's assumed to be more" - (:newline) - "useful this way." - (:newline))) - (:newline) - ,(display-link "inherited" inherited-symbols inherited-symbols-length - :title - (format nil "All inherited symbols of package \"~A\"" - package-name) - :description - '("A symbol is considered inherited in a package if it" - (:newline) - "was made accessible via USE-PACKAGE." - (:newline))) - (:newline) - ,(display-link "shadowed" shadowed-symbols (length shadowed-symbols) - :title - (format nil "All shadowed symbols of package \"~A\"" - package-name) - :description nil)))) - - -(defmethod emacs-inspect ((pathname pathname)) - `(,(if (wild-pathname-p pathname) - "A wild pathname." - "A pathname.") - (:newline) - ,@(label-value-line* - ("Namestring" (namestring pathname)) - ("Host" (pathname-host pathname)) - ("Device" (pathname-device pathname)) - ("Directory" (pathname-directory pathname)) - ("Name" (pathname-name pathname)) - ("Type" (pathname-type pathname)) - ("Version" (pathname-version pathname))) - ,@ (unless (or (wild-pathname-p pathname) - (not (probe-file pathname))) - (label-value-line "Truename" (truename pathname))))) - -(defmethod emacs-inspect ((pathname logical-pathname)) - (append - (label-value-line* - ("Namestring" (namestring pathname)) - ("Physical pathname: " (translate-logical-pathname pathname))) - `("Host: " - (:value ,(pathname-host pathname)) - " (" - (:value ,(logical-pathname-translations - (pathname-host pathname))) - " other translations)" - (:newline)) - (label-value-line* - ("Directory" (pathname-directory pathname)) - ("Name" (pathname-name pathname)) - ("Type" (pathname-type pathname)) - ("Version" (pathname-version pathname)) - ("Truename" (if (not (wild-pathname-p pathname)) - (probe-file pathname)))))) - -(defmethod emacs-inspect ((n number)) - `("Value: " ,(princ-to-string n))) - -(defun format-iso8601-time (time-value &optional include-timezone-p) - "Formats a universal time TIME-VALUE in ISO 8601 format, with - the time zone included if INCLUDE-TIMEZONE-P is non-NIL" - ;; Taken from http://www.pvv.ntnu.no/~nsaa/ISO8601.html - ;; Thanks, Nikolai Sandved and Thomas Russ! - (flet ((format-iso8601-timezone (zone) - (if (zerop zone) - "Z" - (multiple-value-bind (h m) (truncate (abs zone) 1.0) - ;; Tricky. Sign of time zone is reversed in ISO 8601 - ;; relative to Common Lisp convention! - (format nil "~:[+~;-~]~2,'0D:~2,'0D" - (> zone 0) h (round (* 60 m))))))) - (multiple-value-bind (second minute hour day month year dow dst zone) - (decode-universal-time time-value) - (declare (ignore dow)) - (format nil "~4,'0D-~2,'0D-~2,'0DT~2,'0D:~2,'0D:~2,'0D~:[~*~;~A~]" - year month day hour minute second - include-timezone-p (format-iso8601-timezone (if dst - (+ zone 1) - zone)))))) - -(defmethod emacs-inspect ((i integer)) - (append - `(,(format nil "Value: ~D = #x~8,'0X = #o~O = #b~,,' ,8:B~@[ = ~E~]" - i i i i (ignore-errors (coerce i 'float))) - (:newline)) - (when (< -1 i char-code-limit) - (label-value-line "Code-char" (code-char i))) - (label-value-line "Integer-length" (integer-length i)) - (ignore-errors - (label-value-line "Universal-time" (format-iso8601-time i t))))) - -(defmethod emacs-inspect ((c complex)) - (label-value-line* - ("Real part" (realpart c)) - ("Imaginary part" (imagpart c)))) - -(defmethod emacs-inspect ((r ratio)) - (label-value-line* - ("Numerator" (numerator r)) - ("Denominator" (denominator r)) - ("As float" (float r)))) - -(defmethod emacs-inspect ((f float)) - (cond - ((float-nan-p f) - ;; try NaN first because the next tests may perform operations - ;; that are undefined for NaNs. - (list "Not a Number.")) - ((not (float-infinity-p f)) - (multiple-value-bind (significand exponent sign) (decode-float f) - (append - `("Scientific: " ,(format nil "~E" f) (:newline) - "Decoded: " - (:value ,sign) " * " - (:value ,significand) " * " - (:value ,(float-radix f)) "^" - (:value ,exponent) (:newline)) - (label-value-line "Digits" (float-digits f)) - (label-value-line "Precision" (float-precision f))))) - ((> f 0) - (list "Positive infinity.")) - ((< f 0) - (list "Negative infinity.")))) - -(defun make-pathname-ispec (pathname position) - `("Pathname: " - (:value ,pathname) - (:newline) " " - ,@(when position - `((:action "[visit file and show current position]" - ,(lambda () - (ed-in-emacs `(,pathname :position ,position :bytep t))) - :refreshp nil) - (:newline))))) - -(defun make-file-stream-ispec (stream) - ;; SBCL's socket stream are file-stream but are not associated to - ;; any pathname. - (let ((pathname (ignore-errors (pathname stream)))) - (when pathname - (make-pathname-ispec pathname (and (open-stream-p stream) - (file-position stream)))))) - -(defmethod emacs-inspect ((stream file-stream)) - (multiple-value-bind (content) - (call-next-method) - (append (make-file-stream-ispec stream) content))) - -(defmethod emacs-inspect ((condition stream-error)) - (multiple-value-bind (content) - (call-next-method) - (let ((stream (stream-error-stream condition))) - (append (when (typep stream 'file-stream) - (make-file-stream-ispec stream)) - content)))) - -(defun common-seperated-spec (list &optional (callback (lambda (v) - `(:value ,v)))) - (butlast - (loop - for i in list - collect (funcall callback i) - collect ", "))) - -(defun inspector-princ (list) - "Like princ-to-string, but don't rewrite (function foo) as #'foo. -Do NOT pass circular lists to this function." - (let ((*print-pprint-dispatch* (copy-pprint-dispatch))) - (set-pprint-dispatch '(cons (member function)) nil) - (princ-to-string list))) - -(provide :swank-fancy-inspector) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-fuzzy.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-fuzzy.lisp deleted file mode 100644 index bfd274f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-fuzzy.lisp +++ /dev/null @@ -1,706 +0,0 @@ -;;; swank-fuzzy.lisp --- fuzzy symbol completion -;; -;; Authors: Brian Downing -;; Tobias C. Rittweiler -;; and others -;; -;; License: Public Domain -;; - - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (swank-require :swank-util) - (swank-require :swank-c-p-c)) - -(defvar *fuzzy-duplicate-symbol-filter* :nearest-package - "Specifies how fuzzy-matching handles \"duplicate\" symbols. -Possible values are :NEAREST-PACKAGE, :HOME-PACKAGE, :ALL, or a custom -function. See Fuzzy Completion in the manual for details.") - -(export '*fuzzy-duplicate-symbol-filter*) - -;;; For nomenclature of the fuzzy completion section, please read -;;; through the following docstring. - -(defslimefun fuzzy-completions (string default-package-name - &key limit time-limit-in-msec) -"Returns a list of two values: - - An (optionally limited to LIMIT best results) list of fuzzy - completions for a symbol designator STRING. The list will be - sorted by score, most likely match first. - - A flag that indicates whether or not TIME-LIMIT-IN-MSEC has - been exhausted during computation. If that parameter's value is - NIL or 0, no time limit is assumed. - -The main result is a list of completion objects, where a completion -object is: - - (COMPLETED-STRING SCORE (&rest CHUNKS) CLASSIFICATION-STRING) - -where a CHUNK is a description of a matched substring: - - (OFFSET SUBSTRING) - -and FLAGS is short string describing properties of the symbol (see -SYMBOL-CLASSIFICATION-STRING). - -E.g., completing \"mvb\" in a package that uses COMMON-LISP would -return something like: - - ((\"multiple-value-bind\" 26.588236 ((0 \"m\") (9 \"v\") (15 \"b\")) - (:FBOUNDP :MACRO)) - ...) - -If STRING is package qualified the result list will also be -qualified. If string is non-qualified the result strings are -also not qualified and are considered relative to -DEFAULT-PACKAGE-NAME. - -Which symbols are candidates for matching depends on the symbol -designator's format. The cases are as follows: - FOO - Symbols accessible in the buffer package. - PKG:FOO - Symbols external in package PKG. - PKG::FOO - Symbols accessible in package PKG." - ;; For Emacs we allow both NIL and 0 as value of TIME-LIMIT-IN-MSEC - ;; to denote an infinite time limit. Internally, we only use NIL for - ;; that purpose, to be able to distinguish between "no time limit - ;; alltogether" and "current time limit already exhausted." So we've - ;; got to canonicalize its value at first: - (let* ((no-time-limit-p (or (not time-limit-in-msec) - (zerop time-limit-in-msec))) - (time-limit (if no-time-limit-p nil time-limit-in-msec))) - (multiple-value-bind (completion-set interrupted-p) - (fuzzy-completion-set string default-package-name :limit limit - :time-limit-in-msec time-limit) - ;; We may send this as elisp [] arrays to spare a coerce here, - ;; but then the network serialization were slower by handling arrays. - ;; Instead we limit the number of completions that is transferred - ;; (the limit is set from Emacs.) - (list (coerce completion-set 'list) interrupted-p)))) - - -;;; A Fuzzy Matching -- Not to be confused with a fuzzy completion -;;; object that will be sent back to Emacs, as described above. - -(defstruct (fuzzy-matching (:conc-name fuzzy-matching.) - (:predicate fuzzy-matching-p) - (:constructor make-fuzzy-matching - (symbol package-name score package-chunks - symbol-chunks &key (symbol-p t)))) - symbol ; The symbol that has been found to match. - symbol-p ; To deffirentiate between completeing - ; package: and package:nil - package-name ; The name of the package where SYMBOL was found in. - ; (This is not necessarily the same as the home-package - ; of SYMBOL, because the SYMBOL can be internal to - ; lots of packages; also think of package nicknames.) - score ; The higher the better SYMBOL is a match. - package-chunks ; Chunks pertaining to the package identifier of SYMBOL. - symbol-chunks) ; Chunks pertaining to SYMBOL's name. - -(defun %fuzzy-extract-matching-info (fuzzy-matching user-input-string) - (multiple-value-bind (_ user-package-name __ input-internal-p) - (parse-completion-arguments user-input-string nil) - (declare (ignore _ __)) - (with-struct (fuzzy-matching. score symbol package-name package-chunks - symbol-chunks symbol-p) - fuzzy-matching - (let (symbol-name real-package-name internal-p) - (cond (symbol-p ; symbol fuzzy matching? - (setf symbol-name (symbol-name symbol)) - (setf internal-p input-internal-p) - (setf real-package-name (cond ((keywordp symbol) "") - ((not user-package-name) nil) - (t package-name)))) - (t ; package fuzzy matching? - (setf symbol-name "") - (setf real-package-name package-name) - ;; If no explicit package name was given by the user - ;; (e.g. input was "asdf"), we want to append only - ;; one colon ":" to the package names. - (setf internal-p (if user-package-name input-internal-p nil)))) - (values symbol-name - real-package-name - (if user-package-name internal-p nil) - (completion-output-symbol-converter user-input-string) - (completion-output-package-converter user-input-string)))))) - -(defun fuzzy-format-matching (fuzzy-matching user-input-string) - "Returns the completion (\"foo:bar\") that's represented by FUZZY-MATCHING." - (multiple-value-bind (symbol-name package-name internal-p - symbol-converter package-converter) - (%fuzzy-extract-matching-info fuzzy-matching user-input-string) - (setq symbol-name (and symbol-name - (funcall symbol-converter symbol-name))) - (setq package-name (and package-name - (funcall package-converter package-name))) - (let ((result (untokenize-symbol package-name internal-p symbol-name))) - ;; We return the length of the possibly added prefix as second value. - (values result (search symbol-name result))))) - -(defun fuzzy-convert-matching-for-emacs (fuzzy-matching user-input-string) - "Converts a result from the fuzzy completion core into something -that emacs is expecting. Converts symbols to strings, fixes case -issues, and adds information (as a string) describing if the symbol is -bound, fbound, a class, a macro, a generic-function, a -special-operator, or a package." - (with-struct (fuzzy-matching. symbol score package-chunks symbol-chunks - symbol-p) - fuzzy-matching - (multiple-value-bind (name added-length) - (fuzzy-format-matching fuzzy-matching user-input-string) - (list name - (format nil "~,2f" score) - (append package-chunks - (mapcar (lambda (chunk) - ;; Fix up chunk positions to account for possible - ;; added package identifier. - (let ((offset (first chunk)) - (string (second chunk))) - (list (+ added-length offset) string))) - symbol-chunks)) - (if symbol-p - (symbol-classification-string symbol) - "-------p"))))) - -(defun fuzzy-completion-set (string default-package-name - &key limit time-limit-in-msec) - "Returns two values: an array of completion objects, sorted by -their score, that is how well they are a match for STRING -according to the fuzzy completion algorithm. If LIMIT is set, -only the top LIMIT results will be returned. Additionally, a flag -is returned that indicates whether or not TIME-LIMIT-IN-MSEC was -exhausted." - (check-type limit (or null (integer 0 #.(1- most-positive-fixnum)))) - (check-type time-limit-in-msec - (or null (integer 0 #.(1- most-positive-fixnum)))) - (multiple-value-bind (matchings interrupted-p) - (fuzzy-generate-matchings string default-package-name time-limit-in-msec) - (when (and limit - (> limit 0) - (< limit (length matchings))) - (if (array-has-fill-pointer-p matchings) - (setf (fill-pointer matchings) limit) - (setf matchings (make-array limit :displaced-to matchings)))) - (map-into matchings #'(lambda (m) - (fuzzy-convert-matching-for-emacs m string)) - matchings) - (values matchings interrupted-p))) - - -(defun fuzzy-generate-matchings (string default-package-name - time-limit-in-msec) - "Does all the hard work for FUZZY-COMPLETION-SET. If -TIME-LIMIT-IN-MSEC is NIL, an infinite time limit is assumed." - (multiple-value-bind (parsed-symbol-name parsed-package-name - package internal-p) - (parse-completion-arguments string default-package-name) - (flet ((fix-up (matchings parent-package-matching) - ;; The components of each matching in MATCHINGS have been computed - ;; relatively to PARENT-PACKAGE-MATCHING. Make them absolute. - (let* ((p parent-package-matching) - (p.name (fuzzy-matching.package-name p)) - (p.score (fuzzy-matching.score p)) - (p.chunks (fuzzy-matching.package-chunks p))) - (map-into - matchings - (lambda (m) - (let ((m.score (fuzzy-matching.score m))) - (setf (fuzzy-matching.package-name m) p.name) - (setf (fuzzy-matching.package-chunks m) p.chunks) - (setf (fuzzy-matching.score m) - (if (equal parsed-symbol-name "") - ;; Make package matchings be sorted before all - ;; the relative symbol matchings while preserving - ;; over all orderness. - (/ p.score 100) - (+ p.score m.score))) - m)) - matchings))) - (find-symbols (designator package time-limit &optional filter) - (fuzzy-find-matching-symbols designator package - :time-limit-in-msec time-limit - :external-only (not internal-p) - :filter (or filter #'identity))) - (find-packages (designator time-limit) - (fuzzy-find-matching-packages designator - :time-limit-in-msec time-limit)) - (maybe-find-local-package (name) - (or (find-locally-nicknamed-package name *buffer-package*) - (find-package name)))) - (let ((time-limit time-limit-in-msec) (symbols) (packages) (results) - (dedup-table (make-hash-table :test #'equal))) - (cond ((not parsed-package-name) ; E.g. STRING = "asd" - ;; We don't know if user is searching for a package or a symbol - ;; within his current package. So we try to find either. - (setf (values packages time-limit) - (find-packages parsed-symbol-name time-limit)) - (setf (values symbols time-limit) - (find-symbols parsed-symbol-name package time-limit))) - ((string= parsed-package-name "") ; E.g. STRING = ":" or ":foo" - (setf (values symbols time-limit) - (find-symbols parsed-symbol-name package time-limit))) - (t ; E.g. STRING = "asd:" or "asd:foo" - ;; Find fuzzy matchings of the denoted package identifier part. - ;; After that, find matchings for the denoted symbol identifier - ;; relative to all the packages found. - (multiple-value-bind (symbol-packages rest-time-limit) - (find-packages parsed-package-name time-limit-in-msec) - ;; We want to traverse the found packages in the order of - ;; their score, since those with higher score presumably - ;; represent better choices. (This is important because some - ;; packages may never be looked at if time limit exhausts - ;; during traversal.) - (setf symbol-packages - (sort symbol-packages #'fuzzy-matching-greaterp)) - (loop - for package-matching across symbol-packages - for package = (maybe-find-local-package - (fuzzy-matching.package-name - package-matching)) - while (or (not time-limit) (> rest-time-limit 0)) do - (multiple-value-bind (matchings remaining-time) - ;; The duplication filter removes all those symbols - ;; which are present in more than one package - ;; match. See *FUZZY-DUPLICATE-SYMBOL-FILTER* - (find-symbols parsed-symbol-name package rest-time-limit - (%make-duplicate-symbols-filter - package-matching symbol-packages dedup-table)) - (setf matchings (fix-up matchings package-matching)) - (setf symbols (concatenate 'vector symbols matchings)) - (setf rest-time-limit remaining-time) - (let ((guessed-sort-duration - (%guess-sort-duration (length symbols)))) - (when (and rest-time-limit - (<= rest-time-limit guessed-sort-duration)) - (decf rest-time-limit guessed-sort-duration) - (loop-finish)))) - finally - (setf time-limit rest-time-limit) - (when (equal parsed-symbol-name "") ; E.g. STRING = "asd:" - (setf packages symbol-packages)))))) - ;; Sort by score; thing with equal score, sort alphabetically. - ;; (Especially useful when PARSED-SYMBOL-NAME is empty, and all - ;; possible completions are to be returned.) - (setf results (concatenate 'vector symbols packages)) - (setf results (sort results #'fuzzy-matching-greaterp)) - (values results (and time-limit (<= time-limit 0))))))) - -(defun %guess-sort-duration (length) - ;; These numbers are pretty much arbitrary, except that they're - ;; vaguely correct on my machine with SBCL. Yes, this is an ugly - ;; kludge, but it's better than before (where this didn't exist at - ;; all, which essentially meant, that this was taken to be 0.) - (if (zerop length) - 0 - (let ((comparasions (* 3.8 (* length (log length 2))))) - (* 1000 (* comparasions (expt 10 -7)))))) ; msecs - -(defun %make-duplicate-symbols-filter (current-package-matching fuzzy-package-matchings dedup-table) - ;; Returns a filter function based on *FUZZY-DUPLICATE-SYMBOL-FILTER*. - (case *fuzzy-duplicate-symbol-filter* - (:home-package - ;; Return a filter function that takes a symbol, and which returns T - ;; if and only if /no/ matching in FUZZY-PACKAGE-MATCHINGS represents - ;; the home-package of the symbol passed. - (let ((packages (mapcar #'(lambda (m) - (find-package (fuzzy-matching.package-name m))) - (remove current-package-matching - (coerce fuzzy-package-matchings 'list))))) - #'(lambda (symbol) - (not (member (symbol-package symbol) packages))))) - (:nearest-package - ;; Keep only the first occurence of the symbol. - #'(lambda (symbol) - (unless (gethash (symbol-name symbol) dedup-table) - (setf (gethash (symbol-name symbol) dedup-table) t)))) - (:all - ;; No filter - #'identity) - (t - (typecase *fuzzy-duplicate-symbol-filter* - (function - ;; Custom filter - (funcall *fuzzy-duplicate-symbol-filter* - (fuzzy-matching.package-name current-package-matching) - (map 'list #'fuzzy-matching.package-name fuzzy-package-matchings) - dedup-table)) - (t - ;; Bad filter value - (warn "bad *FUZZY-DUPLICATE-SYMBOL-FILTER* value: ~s" - *fuzzy-duplicate-symbol-filter*) - #'identity))))) - -(defun fuzzy-matching-greaterp (m1 m2) - "Returns T if fuzzy-matching M1 should be sorted before M2. -Basically just the scores of the two matchings are compared, and -the match with higher score wins. For the case that the score is -equal, the one which comes alphabetically first wins." - (declare (type fuzzy-matching m1 m2)) - (let ((score1 (fuzzy-matching.score m1)) - (score2 (fuzzy-matching.score m2))) - (cond ((> score1 score2) t) - ((< score1 score2) nil) ; total order - (t - (let ((name1 (symbol-name (fuzzy-matching.symbol m1))) - (name2 (symbol-name (fuzzy-matching.symbol m2)))) - (string< name1 name2)))))) - -(declaim (ftype (function () (integer 0)) get-real-time-msecs)) -(defun get-real-time-in-msecs () - (let ((units-per-msec (max 1 (floor internal-time-units-per-second 1000)))) - (values (floor (get-internal-real-time) units-per-msec)))) - -(defun fuzzy-find-matching-symbols - (string package &key (filter #'identity) external-only time-limit-in-msec) - "Returns two values: a vector of fuzzy matchings for matching -symbols in PACKAGE, using the fuzzy completion algorithm, and the -remaining time limit. - -Only those symbols are considered of which FILTER does return T. - -If EXTERNAL-ONLY is true, only external symbols are considered. A -TIME-LIMIT-IN-MSEC of NIL is considered no limit; if it's zero or -negative, perform a NOP." - (let ((time-limit-p (and time-limit-in-msec t)) - (time-limit (or time-limit-in-msec 0)) - (rtime-at-start (get-real-time-in-msecs)) - (package-name (package-name package)) - (count 0)) - (declare (type boolean time-limit-p)) - (declare (type integer time-limit rtime-at-start)) - (declare (type (integer 0 #.(1- most-positive-fixnum)) count)) - - (flet ((recompute-remaining-time (old-remaining-time) - (cond ((not time-limit-p) - ;; propagate NIL back as infinite time limit - (values nil nil)) - ((> count 0) ; ease up on getting internal time like crazy - (setf count (mod (1+ count) 128)) - (values nil old-remaining-time)) - (t (let* ((elapsed-time (- (get-real-time-in-msecs) - rtime-at-start)) - (remaining (- time-limit elapsed-time))) - (values (<= remaining 0) remaining))))) - (perform-fuzzy-match (string symbol-name) - (let* ((converter (completion-output-symbol-converter string)) - (converted-symbol-name (funcall converter symbol-name))) - (compute-highest-scoring-completion string - converted-symbol-name)))) - (let ((completions (make-array 256 :adjustable t :fill-pointer 0)) - (rest-time-limit time-limit)) - (do-symbols* (symbol package) - (multiple-value-bind (exhausted? remaining-time) - (recompute-remaining-time rest-time-limit) - (setf rest-time-limit remaining-time) - (cond (exhausted? (return)) - ((not (and (or (not external-only) - (symbol-external-p symbol package)) - (funcall filter symbol)))) - ((string= "" string) ; "" matches always - (vector-push-extend - (make-fuzzy-matching symbol package-name - 0.0 '() '()) - completions)) - (t - (multiple-value-bind (match-result score) - (perform-fuzzy-match string (symbol-name symbol)) - (when match-result - (vector-push-extend - (make-fuzzy-matching symbol package-name score - '() match-result) - completions))))))) - (values completions rest-time-limit))))) - -(defun fuzzy-find-matching-packages (name &key time-limit-in-msec) - "Returns a vector of fuzzy matchings for each package that is -similiar to NAME, and the remaining time limit. -Cf. FUZZY-FIND-MATCHING-SYMBOLS." - (let ((time-limit-p (and time-limit-in-msec t)) - (time-limit (or time-limit-in-msec 0)) - (rtime-at-start (get-real-time-in-msecs)) - (converter (completion-output-package-converter name)) - (completions (make-array 32 :adjustable t :fill-pointer 0))) - (declare (type boolean time-limit-p)) - (declare (type integer time-limit rtime-at-start)) - (declare (type function converter)) - (flet ((match-package (names) - (loop with max-pkg-name = "" - with max-result = nil - with max-score = 0 - for package-name in names - for converted-name = (funcall converter package-name) - do - (multiple-value-bind (result score) - (compute-highest-scoring-completion name - converted-name) - (when (and result (> score max-score)) - (setf max-pkg-name package-name) - (setf max-result result) - (setf max-score score))) - finally - (when max-result - (vector-push-extend - (make-fuzzy-matching nil max-pkg-name - max-score max-result '() - :symbol-p nil) - completions))))) - (cond ((and time-limit-p (<= time-limit 0)) - (values #() time-limit)) - (t - (loop for (nick) in (package-local-nicknames *buffer-package*) - do - (match-package (list nick))) - (loop for package in (list-all-packages) - do - ;; Find best-matching package-nickname: - (match-package (package-names package)) - finally - (return - (values completions - (and time-limit-p - (let ((elapsed-time (- (get-real-time-in-msecs) - rtime-at-start))) - (- time-limit elapsed-time))))))))))) - - -(defslimefun fuzzy-completion-selected (original-string completion) - "This function is called by Slime when a fuzzy completion is -selected by the user. It is for future expansion to make -testing, say, a machine learning algorithm for completion scoring -easier. - -ORIGINAL-STRING is the string the user completed from, and -COMPLETION is the completion object (see docstring for -SWANK:FUZZY-COMPLETIONS) corresponding to the completion that the -user selected." - (declare (ignore original-string completion)) - nil) - - -;;;;; Fuzzy completion core - -(defparameter *fuzzy-recursion-soft-limit* 30 - "This is a soft limit for recursion in -RECURSIVELY-COMPUTE-MOST-COMPLETIONS. Without this limit, -completing a string such as \"ZZZZZZ\" with a symbol named -\"ZZZZZZZZZZZZZZZZZZZZZZZ\" will result in explosive recursion to -find all the ways it can match. - -Most natural language searches and symbols do not have this -problem -- this is only here as a safeguard.") -(declaim (fixnum *fuzzy-recursion-soft-limit*)) - -(defvar *all-chunks* '()) -(declaim (type list *all-chunks*)) - -(defun compute-highest-scoring-completion (short full) - "Finds the highest scoring way to complete the abbreviation -SHORT onto the string FULL, using CHAR= as a equality function for -letters. Returns two values: The first being the completion -chunks of the highest scorer, and the second being the score." - (let* ((scored-results - (mapcar #'(lambda (result) - (cons (score-completion result short full) result)) - (compute-most-completions short full))) - (winner (first (sort scored-results #'> :key #'first)))) - (values (rest winner) (first winner)))) - -(defun compute-most-completions (short full) - "Finds most possible ways to complete FULL with the letters in SHORT. -Calls RECURSIVELY-COMPUTE-MOST-COMPLETIONS recursively. Returns -a list of (&rest CHUNKS), where each CHUNKS is a description of -how a completion matches." - (let ((*all-chunks* nil)) - (recursively-compute-most-completions short full 0 0 nil nil nil t) - *all-chunks*)) - -(defun recursively-compute-most-completions - (short full - short-index initial-full-index - chunks current-chunk current-chunk-pos - recurse-p) - "Recursively (if RECURSE-P is true) find /most/ possible ways -to fuzzily map the letters in SHORT onto FULL, using CHAR= to -determine if two letters match. - -A chunk is a list of elements that have matched consecutively. -When consecutive matches stop, it is coerced into a string, -paired with the starting position of the chunk, and pushed onto -CHUNKS. - -Whenever a letter matches, if RECURSE-P is true, -RECURSIVELY-COMPUTE-MOST-COMPLETIONS calls itself with a position -one index ahead, to find other possibly higher scoring -possibilities. If there are less than -*FUZZY-RECURSION-SOFT-LIMIT* results in *ALL-CHUNKS* currently, -this call will also recurse. - -Once a word has been completely matched, the chunks are pushed -onto the special variable *ALL-CHUNKS* and the function returns." - (declare (optimize speed) - (type fixnum short-index initial-full-index) - (type list current-chunk) - (simple-string short full)) - (flet ((short-cur () - "Returns the next letter from the abbreviation, or NIL - if all have been used." - (if (= short-index (length short)) - nil - (aref short short-index))) - (add-to-chunk (char pos) - "Adds the CHAR at POS in FULL to the current chunk, - marking the start position if it is empty." - (unless current-chunk - (setf current-chunk-pos pos)) - (push char current-chunk)) - (collect-chunk () - "Collects the current chunk to CHUNKS and prepares for - a new chunk." - (when current-chunk - (let ((current-chunk-as-string - (nreverse - (make-array (length current-chunk) - :element-type 'character - :initial-contents current-chunk)))) - (push (list current-chunk-pos current-chunk-as-string) chunks) - (setf current-chunk nil - current-chunk-pos nil))))) - ;; If there's an outstanding chunk coming in collect it. Since - ;; we're recursively called on skipping an input character, the - ;; chunk can't possibly continue on. - (when current-chunk (collect-chunk)) - (do ((pos initial-full-index (1+ pos))) - ((= pos (length full))) - (let ((cur-char (aref full pos))) - (if (and (short-cur) - (char= cur-char (short-cur))) - (progn - (when recurse-p - ;; Try other possibilities, limiting insanely deep - ;; recursion somewhat. - (recursively-compute-most-completions - short full short-index (1+ pos) - chunks current-chunk current-chunk-pos - (not (> (length *all-chunks*) - *fuzzy-recursion-soft-limit*)))) - (incf short-index) - (add-to-chunk cur-char pos)) - (collect-chunk)))) - (collect-chunk) - ;; If we've exhausted the short characters we have a match. - (if (short-cur) - nil - (let ((rev-chunks (reverse chunks))) - (push rev-chunks *all-chunks*) - rev-chunks)))) - - -;;;;; Fuzzy completion scoring - -(defvar *fuzzy-completion-symbol-prefixes* "*+-%&?<" - "Letters that are likely to be at the beginning of a symbol. -Letters found after one of these prefixes will be scored as if -they were at the beginning of ths symbol.") -(defvar *fuzzy-completion-symbol-suffixes* "*+->" - "Letters that are likely to be at the end of a symbol. -Letters found before one of these suffixes will be scored as if -they were at the end of the symbol.") -(defvar *fuzzy-completion-word-separators* "-/." - "Letters that separate different words in symbols. Letters -after one of these symbols will be scores more highly than other -letters.") - -(defun score-completion (completion short full) - "Scores the completion chunks COMPLETION as a completion from -the abbreviation SHORT to the full string FULL. COMPLETION is a -list like: - ((0 \"mul\") (9 \"v\") (15 \"b\")) -Which, if SHORT were \"mulvb\" and full were \"multiple-value-bind\", -would indicate that it completed as such (completed letters -capitalized): - MULtiple-Value-Bind - -Letters are given scores based on their position in the string. -Letters at the beginning of a string or after a prefix letter at -the beginning of a string are scored highest. Letters after a -word separator such as #\- are scored next highest. Letters at -the end of a string or before a suffix letter at the end of a -string are scored medium, and letters anywhere else are scored -low. - -If a letter is directly after another matched letter, and its -intrinsic value in that position is less than a percentage of the -previous letter's value, it will use that percentage instead. - -Finally, a small scaling factor is applied to favor shorter -matches, all other things being equal." - (labels ((at-beginning-p (pos) - (= pos 0)) - (after-prefix-p (pos) - (and (= pos 1) - (find (aref full 0) *fuzzy-completion-symbol-prefixes*))) - (word-separator-p (pos) - (find (aref full pos) *fuzzy-completion-word-separators*)) - (after-word-separator-p (pos) - (find (aref full (1- pos)) *fuzzy-completion-word-separators*)) - (at-end-p (pos) - (= pos (1- (length full)))) - (before-suffix-p (pos) - (and (= pos (- (length full) 2)) - (find (aref full (1- (length full))) - *fuzzy-completion-symbol-suffixes*))) - (score-or-percentage-of-previous (base-score pos chunk-pos) - (if (zerop chunk-pos) - base-score - (max base-score - (+ (* (score-char (1- pos) (1- chunk-pos)) 0.85) - (expt 1.2 chunk-pos))))) - (score-char (pos chunk-pos) - (score-or-percentage-of-previous - (cond ((at-beginning-p pos) 10) - ((after-prefix-p pos) 10) - ((word-separator-p pos) 1) - ((after-word-separator-p pos) 8) - ((at-end-p pos) 6) - ((before-suffix-p pos) 6) - (t 1)) - pos chunk-pos)) - (score-chunk (chunk) - (loop for chunk-pos below (length (second chunk)) - for pos from (first chunk) - summing (score-char pos chunk-pos)))) - (let* ((chunk-scores (mapcar #'score-chunk completion)) - (length-score (/ 10.0 (1+ (- (length full) (length short)))))) - (values - (+ (reduce #'+ chunk-scores) length-score) - (list (mapcar #'list chunk-scores completion) length-score))))) - -(defun highlight-completion (completion full) - "Given a chunk definition COMPLETION and the string FULL, -HIGHLIGHT-COMPLETION will create a string that demonstrates where -the completion matched in the string. Matches will be -capitalized, while the rest of the string will be lower-case." - (let ((highlit (nstring-downcase (copy-seq full)))) - (dolist (chunk completion) - (setf highlit (nstring-upcase highlit - :start (first chunk) - :end (+ (first chunk) - (length (second chunk)))))) - highlit)) - -(defun format-fuzzy-completion-set (winners) - "Given a list of completion objects such as on returned by -FUZZY-COMPLETION-SET, format the list into user-readable output -for interactive debugging purpose." - (let ((max-len - (loop for winner in winners maximizing (length (first winner))))) - (loop for (sym score result) in winners do - (format t "~&~VA score ~8,2F ~A" - max-len (highlight-completion result sym) score result)))) - -(provide :swank-fuzzy) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-goo.goo b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-goo.goo deleted file mode 100644 index 562401d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-goo.goo +++ /dev/null @@ -1,995 +0,0 @@ -;;;; swank-goo.goo --- Swank server for GOO -;;; -;;; Copyright (C) 2005 Helmut Eller -;;; -;;; This file is licensed under the terms of the GNU General Public -;;; License as distributed with Emacs (press C-h C-c to view it). - -;;;; Installation -;; -;; 1. Add something like this to your .emacs: -;; -;; (setq slime-lisp-implementations -;; '((goo ("g2c") :init goo-slime-init))) -;; -;; (defun goo-slime-init (file _) -;; (format "%S\n%S\n" -;; `(set goo/system:*module-search-path* -;; (cat '(".../slime/contrib/") -;; goo/system:*module-search-path*)) -;; `(swank-goo:start-swank ,file))) -;; -;; 2. Start everything with M-- M-x slime goo -;; - -;;;; Code - -(use goo) -(use goo/boot) -(use goo/x) -(use goo/io/port) -(use goo/io/write) -(use goo/eval) -(use goo/system) -(use goo/conditions) -(use goo/fun) -(use goo/loc) -(use goo/chr) -(use eval/module) -(use eval/ast) -(use eval/g2c) - - -;;;; server setup - -(df create-server (port-number) (setup-server port-number announce-port)) - -(df start-swank (port-file) - (setup-server 0 (fun (s) (write-port-file (%local-port s) port-file)))) - -(df setup-server (port-number announce) - (let ((s (create-socket port-number))) - (fin (seq - (announce s) - (let ((c (accept s))) - ;;(post "connection: %s" c) - (fin (serve-requests c) - (%close (@fd c))))) - (post "closing socket: %s" s) - (%close s)))) - -(df announce-port (socket) - (post "Listening on port: %d\n" (%local-port socket))) - -(df write-port-file (port-number filename) - (with-port (file (open filename)) - (msg file "%d\n" port-number))) - -(dc ()) - -(dc ()) -(dp @socket ( => )) -(dp @in ( => )) -(dp @out ( => )) - -(dv emacs-connection|(t? ) #f) - -(df serve-requests (socket) - (dlet ((emacs-connection (new - @socket socket - @out (new @socket socket) - @in (new @socket socket)))) - (dlet ((out (@out emacs-connection)) - (in (@in emacs-connection))) - (while #t - (simple-restart - "SLIME top-level" - (fun () (process-next-event socket))))))) - -(d. (t= 'nil)) -(d. t #t) -(d. cons pair) - -(dv tag-counter| 0) - -(df process-next-event (port) (dispatch-event (decode-message port) port)) - -(df dispatch-event (event port) - ;; (post "%=\n" event) - (match event - ((:emacs-rex ,form ,package ,_thread-id ,id) - (eval-for-emacs form package port id)) - ((:read-string ,_) - (def tag (incf tag-counter)) - (encode-message `(:read-string ,_ ,tag) port) - (rep loop () - (match (decode-message port) - ((:emacs-return-string ,_ ,rtag ,str) - (assert (= tag rtag) "Unexpected reply tag: %d" rtag) - str) - ((,@evt) - (try-recover - (fun () (dispatch-event evt port)) - (fun () (encode-message `(:read-aborted ,_ ,tag) port))) - (loop))))) - ((:emacs-return-string ,_ ,rtag ,str) - (error "Unexpected event: %=" event)) - ((,@_) (encode-message event port)))) - -(dc ()) -(dp @module ( => )) -(dp @id ( => )) -(dp @port ( => )) -(dp @prev ( => (t? ))) - -;; should be ddv -(dv eval-context|(t? ) #f) - -(df buffer-module () (@module eval-context)) - -(df eval-for-emacs (form| package|(t+ ) port id|) - (try-recover - (fun () - (try debugger-hook - (dlet ((eval-context (new - @module (find-buffer-module package) @id id - @port port @prev eval-context))) - (def result (eval (frob-form-for-eval form) 'swank-goo)) - (force-out out) - (dispatch-event `(:return (:ok ,result) ,id) port)))) - (fun () (dispatch-event `(:return (:abort) ,id) port)))) - -(dm find-buffer-module (name| => ) - (or (elt-or (all-modules) (as-sym name) #f) - (find-buffer-module 'nil))) - -(dm find-buffer-module (name| => ) default-module) - -(dv default-module| (runtime-module 'goo/user)) - -(d. slimefuns (fab 100)) - -(ds defslimefun (,name ,args ,@body) - `(set (elt slimefuns ',name) - (df ,(cat-sym 'swank@ name) ,args ,@body))) - -(df slimefun (name) - (or (elt-or slimefuns name #f) - (error "Undefined slimefun: %=" name))) - -;; rewrite (swank:foo ...) to ((slimefun 'foo) ...) -(df frob-form-for-eval (form) - (match form - ((,op ,@args) - (match (map as-sym (split (sym-name op) #\:)) - ((swank ,name) - `((slimefun ',name) ,@args)))))) - - -;;;; debugger - -(dc ()) -(dp @level ( => )) -(dp @top-frame ( => )) -(dp @restarts ( => )) -(dp @condition ( => )) -(dp @eval-context ( => (t? ))) - -(dv sldb-context|(t? ) #f) - -(df debugger-hook (c| resume) - (let ((tf (find-top-frame 'debugger-hook 2)) - (rs (compute-restarts c)) - (l (if sldb-context (1+ (@level sldb-context)) 1))) - (cond ((> l 10) (emergency-abort c)) - (#t - (dlet ((sldb-context (new - @level l @top-frame tf - @restarts rs @condition c - @eval-context eval-context))) - (let ((bt (compute-backtrace tf 0 10))) - (force-out out) - (dispatch-event `(:debug 0 ,l - ,@(debugger-info c rs bt eval-context)) - (@port eval-context)) - (sldb-loop l (@port eval-context)))))))) - -(df emergency-abort (c) - (post "Maximum debug level reached aborting...\n") - (post "%s\n" (describe-condition c)) - (do-stack-frames (fun (f args) (msg out " %= %=\n" f args))) - (invoke-handler-interactively (find-restart ) in out)) - -(df sldb-loop (level port) - (fin (while #t - (dispatch-event `(:debug-activate 0 ,level) port) - (simple-restart - (msg-to-str "Return to SLDB level %s" level) - (fun () (process-next-event port)))) - (dispatch-event `(:debug-return 0 ,level nil) port))) - -(defslimefun backtrace (start| end|(t+ )) - (backtrace-for-emacs - (compute-backtrace (@top-frame sldb-context) - start - (if (isa? end ) end #f)))) - -(defslimefun throw-to-toplevel () - (invoke-handler-interactively (find-restart ) in out)) - -(defslimefun invoke-nth-restart-for-emacs (sldb-level| n|) - (when (= (@level sldb-context) sldb-level) - (invoke-handler-interactively (elt (@restarts sldb-context) n) in out))) - -(defslimefun debugger-info-for-emacs (start end) - (debugger-info (@condition sldb-context) - (@restarts sldb-context) - (compute-backtrace (@top-frame sldb-context) - start - (if (isa? end ) end #f)))) - -(defslimefun frame-locals-and-catch-tags (frame-idx) - (def frame (nth-frame frame-idx)) - (list - (map-keyed (fun (i name) - (lst ':name (sym-name name) ':id 0 - ':value (safe-write-to-string (frame-var-value frame i)))) - (frame-var-names frame)) - '())) - -(defslimefun inspect-frame-var (frame-idx var-idx) - (reset-inspector) - (inspect-object (frame-var-value (nth-frame frame-idx) var-idx))) - -(defslimefun inspect-current-condition () - (reset-inspector) - (inspect-object (@condition sldb-context))) - -(defslimefun frame-source-location (frame-idx) - (match (nth-frame frame-idx) - ((,f ,@_) - (or (emacs-src-loc f) - `(:error ,(msg-to-str "No src-loc available for: %s" f)))))) - -(defslimefun eval-string-in-frame (string frame-idx) - (def frame (nth-frame frame-idx)) - (let ((names (frame-var-names frame)) - (values (frame-var-values frame))) - (write-to-string - (app (eval `(fun ,names ,(read-from-string string)) - (module-name (buffer-module))) - values)))) - -(df debugger-info (condition restarts backtrace eval-context) - (lst `(,(try-or (fun () (describe-condition condition)) "<...>") - ,(cat " [class: " (class-name-str condition) "]") - ()) - (restarts-for-emacs restarts) - (backtrace-for-emacs backtrace) - (pending-continuations eval-context))) - -(df backtrace-for-emacs (backtrace) - (map (fun (f) - (match f - ((,idx (,f ,@args)) - (lst idx (cat (if (fun-name f) - (sym-name (fun-name f)) - (safe-write-to-string f)) - (safe-write-to-string args)))))) - backtrace)) - -(df restarts-for-emacs (restarts) - (map (fun (x) `(,(sym-name (class-name (%handler-condition-type x))) - ,(describe-restart x))) - restarts)) - -(df describe-restart (restart) - (describe-handler (%handler-info restart) (%handler-condition-type restart))) - -(df compute-restarts (condition) - (packing (%do-handlers-of-type (fun (c) (pack c))))) - -(df find-restart (type) - (esc ret - (%do-handlers-of-type type ret) - #f)) - -(df pending-continuations (context|(t? )) - (if context - (pair (@id context) (pending-continuations (@prev context))) - '())) - -(df find-top-frame (fname| offset|) - (esc ret - (let ((top-seen? #f)) - (do-stack-frames (fun (f args) - (cond (top-seen? - (cond ((== offset 0) - (ret (pair f args))) - (#t (decf offset)))) - ((== (fun-name f) fname) - (set top-seen? #t)))))))) - -(df compute-backtrace (top-frame start| end) - (packing - (esc break - (do-user-frames (fun (idx f args) - (when (and end (<= end idx)) - (break #f)) - (when (<= start idx) - (pack (lst idx (pair f args))))) - top-frame)))) - -(df nth-frame (n|) - (esc ret - (do-user-frames - (fun (idx f args) - (when (= idx n) - (ret (pair f args)))) - (@top-frame sldb-context)))) - -(df frame-var-value (frame var-idx) - (match frame - ((,f ,@args) - (def sig (fun-sig f)) - (def arity (sig-arity sig)) - (def nary? (sig-nary? sig)) - (cond ((< var-idx arity) (elt args var-idx)) - (nary? (sub* args arity)))))) - -(df frame-var-names (frame) - (match frame - ((,f ,@_) (fun-info-names (fun-info f))))) - -(df frame-var-values (frame) - (map (curry frame-var-value frame) (keys (frame-var-names frame)))) - -(df do-user-frames (f| top-frame) - (let ((idx -1) - (top-seen? #f)) - (do-stack-frames - (fun (ffun args) - (cond (top-seen? - (incf idx) - (f idx ffun (rev args))) - ((= (pair ffun args) top-frame) - (set top-seen? #t))))))) - - -;;;; Write some classes a little less verbose - -;; (dm recurring-write (port| x d| recur|) -;; (msg port "#{%s &%s}" (class-name-str x) -;; (num-to-str-base (address-of x) 16))) - -(dm recurring-write (port| x| d| recur|) - (msg port "#{%s %s}" (class-name-str x) (module-name x))) - -(dm recurring-write (port| x| d| recur|) - (msg port "#{%s %s}" (class-name-str x) (binding-name x))) - -(dm recurring-write (port| x| d| recur|) - (msg port "#{%s %s}" (class-name-str x) (len x))) - -(dm recurring-write (port| x| - d| recur|) - (msg port "#{%s}" (class-name-str x))) - -(dm recurring-write (port| x| - d| recur|) - (msg port "#{%s}" (class-name-str x))) - -(dm recurring-write (port| x| d| recur|) - (msg port "#{%s %s:%=}" (class-name-str x) - (src-loc-file x) (src-loc-line x))) - - -;;;; Inspector - -(dc ()) -(dp! @object ( => )) -(dp! @parts ( => ) (new )) -(dp! @stack ( => ) '()) - -(dv inspector #f) - -(defslimefun init-inspector (form|) - (reset-inspector) - (inspect-object (str-eval form (buffer-module)))) - -(defslimefun quit-inspector () (reset-inspector) 'nil) - -(defslimefun inspect-nth-part (n|) - (inspect-object (elt (@parts inspector) n))) - -(defslimefun inspector-pop () - (cond ((<= 2 (len (@stack inspector))) - (popf (@stack inspector)) - (inspect-object (popf (@stack inspector)))) - (#t 'nil))) - -(df reset-inspector () (set inspector (new ))) - -(df inspect-object (o) - (set (@object inspector) o) - (set (@parts inspector) (new )) - (pushf (@stack inspector) o) - (lst ':title (safe-write-to-string o) ; ':type (class-name-str o) - ':content (inspector-content - `("class: " (:value ,(class-of o)) "\n" - ,@(inspect o))))) - -(df inspector-content (content) - (map (fun (part) - (case-by part isa? - (() part) - (() - (match part - ((:value ,o ,@str) - `(:value ,@(if (nul? str) - (lst (safe-write-to-string o)) - str) - ,(assign-index o))))) - (#t (error "Bad inspector content: %=" part)))) - content)) - -(df assign-index (o) - (pushf (@parts inspector) o) - (1- (len (@parts inspector)))) - -(dg inspect (o)) - -;; a list of dangerous functions -(d. getter-blacklist (lst fun-code fun-env class-row)) - -(dm inspect (o) - (join (map (fun (p) - (let ((getter (prop-getter p))) - `(,(sym-name (fun-name getter)) ": " - ,(cond ((mem? getter-blacklist getter) "<...>") - ((not (prop-bound? o getter)) "") - (#t (try-or (fun () `(:value ,(getter o))) - "<...>")))))) - (class-props (class-of o))) - '("\n"))) - -(dm inspect (o|) - (join (packing (do-keyed (fun (pos val) - (pack `(,(num-to-str pos) ": " (:value ,val)))) - o)) - '("\n"))) - -(dm inspect (o|) - (join (packing (do-keyed (fun (key val) - (pack `((:value ,key) "\t: " (:value ,val)))) - o)) - '("\n"))) - -;; inspecting the env of closures is broken -;; (dm inspect (o|) -;; (cat (sup o) -;; '("\n") -;; (if (%fun-env? o) -;; (inspect (packing (for ((i (below (%fun-env-len o)))) -;; (pack (%fun-env-elt o i))))) -;; '()))) -;; -;; (df %fun-env? (f| => ) #eb{ FUNENV($f) != $#f }) -;; (df %fun-env-len (f| => ) #ei{ ((ENV)FUNENV ($f))->size }) -;; (df %fun-env-elt (f| i| => ) #eg{ FUNENVGET($f, @i) }) - - -;;;; init - -(defslimefun connection-info () - `(:pid - ,(process-id) :style nil - :lisp-implementation (:type "GOO" :name "goo" - :version ,(%lookup '*goo-version* 'eval/main)) - :machine (:instance "" :type "" :version "") - :features () - :package (:name "goo/user" :prompt "goo/user"))) - -(defslimefun quit-lisp () #ei{ exit (0),0 }) - -(defslimefun set-default-directory (dir|) #ei{ chdir(@dir) } dir) - - -;;;; eval - -(defslimefun ping () "PONG") - -(defslimefun create-repl (_) - (let ((name (sym-name (module-name (buffer-module))))) - `(,name ,name))) - -(defslimefun listener-eval (string) - (clear-input in) - `(:values ,(write-to-string (str-eval string (buffer-module))))) - -(defslimefun interactive-eval (string) - (cat "=> " (write-to-string (str-eval string (buffer-module))))) - -(df str-eval (s| m|) - (eval (read-from-string s) (module-name m))) - -(df clear-input (in|) (while (ready? in) (get in))) - -(dc ()) - -(defslimefun simple-break () - (simple-restart - "Continue from break" - (fun () (sig (new - condition-message "Interrupt from Emacs")))) - 'nil) - -(defslimefun clear-repl-results () 'nil) - - -;;;; compile - -(defslimefun compile-string-for-emacs (string buffer position directory) - (def start (current-time)) - (def r (g2c-eval (read-from-string string) - (module-target-environment (buffer-module)))) - (lst (write-to-string r) - (/ (as (- (current-time) start)) 1000000.0))) - -(defslimefun compiler-notes-for-emacs () 'nil) - -(defslimefun filename-to-modulename (filename| => (t+ )) - (try-or (fun () (sym-name (filename-to-modulename filename))) 'nil)) - -(df filename-to-modulename (filename| => ) - (def paths (map pathname-to-components - (map simplify-filename - (pick file-exists? *module-search-path*)))) - (def filename (pathname-to-components filename)) - (def moddir (rep parent ((modpath filename)) - (cond ((any? (curry = modpath) paths) - modpath) - (#t - (parent (components-parent-directory modpath)))))) - (def modfile (components-to-pathname (sub* filename (len moddir)))) - (as-sym (sub modfile 0 (- (len modfile) (len *goo-extension*))))) - - - -;;;; Load - -(defslimefun load-file (filename) - (let ((file (cond ((= (sub (rev filename) 0 4) "oog.") filename) - (#t (cat filename ".goo"))))) - (safe-write-to-string (load-file file (filename-to-modulename file))))) - - -;;;; background activities - -(defslimefun operator-arglist (op _) - (try-or (fun () - (let ((value (str-eval op (buffer-module)))) - (if (isa? value ) - (write-to-string value) - 'nil))) - 'nil)) - - -;;;; M-. - -(defslimefun find-definitions-for-emacs (name|) - (match (parse-symbol name) - ((,sym ,modname) - (def env (module-target-environment (runtime-module modname))) - (def b (find-binding sym env)) - (cond (b (find-binding-definitions b)) - (#t 'nil))))) - -(df parse-symbol (name| => ) - (if (mem? name #\:) - (match (split name #\:) - ((,module ,name) (lst (as-sym name) (as-sym module)))) - (lst (as-sym name) (module-name (buffer-module))))) - -(df find-binding-definitions (b|) - (def value (case (binding-kind b) - (('runtime) (loc-val (binding-locative b))) - (('global) (let ((box (binding-global-box b))) - (and box (global-box-value box)))) - (('macro) (binding-info b)) - (#t (error "unknown binding kind %=" (binding-kind b))))) - (map (fun (o) - (def loc (emacs-src-loc o)) - `(,(write-to-string (dspec o)) - ,(or loc `(:error "no src-loc available")))) - (defining-objects value))) - -(dm defining-objects (o => ) '()) -(dm defining-objects (o| => ) (lst o)) -(dm defining-objects (o| => ) (pair o (fun-mets o))) - -(dm emacs-src-loc (o|) - (def loc (fun-src-loc o)) - (and loc `(:location (:file ,(simplify-filename - (find-goo-file-in-path - (module-name-to-relpath (src-loc-file loc)) - *module-search-path*))) - (:line ,(src-loc-line loc)) - ()))) - -(dm dspec (f|) - (cond ((fun-name f) - `(,(if (isa? f ) 'dg 'dm) ,(fun-name f) ,@(dspec-arglist f))) - (#t f))) - -(df dspec-arglist (f|) - (map2 (fun (name class) - (cond ((= class ) name) - ((isa? class ) - `(,name ,(class-name class))) - (#t `(,name ,class)))) - (fun-info-names (fun-info f)) - (sig-specs (fun-sig f)))) - -(defslimefun buffer-first-change (filename) 'nil) - - -;;;; apropos - -(defslimefun apropos-list-for-emacs - (pattern only-external? case-sensitive? package) - (def matches (fab 100)) - (do-all-bindings - (fun (b) - (when (finds (binding-name-str b) pattern) - (set (elt matches - (cat-sym (binding-name b) - (module-name (binding-module b)))) - b)))) - (set matches (sort-by (packing-as (for ((b matches)) (pack b))) - (fun (x y) - (< (binding-name x) - (binding-name y))))) - (map (fun (b) - `(:designator - ,(cat (sym-name (module-name (binding-module b))) ":" - (binding-name-str b) - "\tkind: " (sym-name (binding-kind b))))) - (as matches))) - -(df do-all-bindings (f|) - (for ((module (%module-loader-modules (runtime-module-loader)))) - (do f (environment-bindings (module-target-environment module))))) - -(dm < (s1| s2| => ) - (let ((l1 (len s1)) (l2 (len s2))) - (rep loop ((i 0)) - (cond ((= i l1) (~= l1 l2)) - ((= i l2) #f) - ((< (elt s1 i) (elt s2 i)) #t) - ((= (elt s1 i) (elt s2 i)) (loop (1+ i))) - (#t #f))))) - -(df %binding-info (name| module|) - (binding-info - (find-binding - name (module-target-environment (runtime-module module))))) - - -;;;; completion - -(defslimefun simple-completions (pattern| package) - (def matches (lst)) - (for ((b (environment-bindings (module-target-environment (buffer-module))))) - (when (prefix? (binding-name-str b) pattern) - (pushf matches b))) - (def strings (map binding-name-str matches)) - `(,strings ,(cond ((nul? strings) pattern) - (#t (fold+ common-prefix strings))))) - -(df common-prefix (s1| s2|) - (let ((limit (min (len s1) (len s2)))) - (rep loop ((i 0)) - (cond ((or (= i limit) - (~= (elt s1 i) (elt s2 i))) - (sub s1 0 i)) - (#t (loop (1+ i))))))) - -(defslimefun list-all-package-names (_|...) - (map sym-name (keys (all-modules)))) - -(df all-modules () (%module-loader-modules (runtime-module-loader))) - - -;;;; Macroexpand - -(defslimefun swank-macroexpand-1 (str|) - (write-to-string - (%ast-macro-expand (read-from-string str) - (module-target-environment (buffer-module)) - #f))) - - -;;;; streams - -(dc ()) -(dp @socket ( => )) -(dp! @buf-len ( => ) 0) -(dp @buf ( => ) (new )) -(dp! @timestamp ( => ) 0) - -(dm recurring-write (port| x| d| recur|) - (msg port "#{%s buf-len: %s}" (class-name-str x) (@buf-len x))) - -(dm put (p| c|) - (add! (@buf p) c) - (incf (@buf-len p)) - (maybe-flush p (= c #\newline))) - -(dm puts (p| s|) - (add! (@buf p) s) - (incf (@buf-len p) (len s)) - (maybe-flush p (mem? s #\newline))) - -(df maybe-flush (p| newline?|) - (and (or (> (@buf-len p) 4000) newline?) - (> (- (current-time) (@timestamp p)) 100000) - (force-out p))) - -(dm force-out (p|) - (unless (zero? (@buf-len p)) - (dispatch-event `(:write-string ,(%buf-to-str (@buf p))) (@socket p)) - (set (@buf-len p) 0) - (zap! (@buf p))) - (set (@timestamp p) (current-time))) - -(df %buf-to-str (buf|) - (packing-as - (for ((i buf)) - (cond ((isa? i ) (for ((c i)) (pack c))) - (#t (pack i)))))) - -(dc ()) -(dp @socket ( => )) -(dp! @idx ( => ) 0) -(dp! @buf ( => ) "") - -(df receive-input (p|) - (dispatch-event `(:read-string ,0) (@socket p))) - -(dm get (p| => ) - (cond ((< (@idx p) (len (@buf p))) - (def c (elt (@buf p) (@idx p))) - (incf (@idx p)) - c) - (#t - (def input (receive-input p)) - (cond ((zero? (len input)) (eof-object)) - (#t (set (@buf p) input) - (set (@idx p) 0) - (get p)))))) - -(dm ready? (p| => ) (< (@idx p) (len (@buf p)))) - -(dm peek (p| => ) - (let ((c (get p))) - (unless (eof-object? c) - (decf (@idx p))) - c)) - - -;;;; Message encoding - -(df decode-message (port|) - (read-from-string (get-block port (read-message-length port)))) - -(df read-message-length (port) - (or (str-to-num (cat "#x" (get-block port 6))) - (error "can't parse message length"))) - -(df encode-message (message port) - (let ((string (dlet ((*max-print-length* 1000000) - (*max-print-depth* 1000000)) - (write-to-string message)))) - (puts port (encode-message-length (len string))) - (puts port string) - (force-out port))) - -(df encode-message-length (n) - (loc ((hex (byte) - (if (< byte #x10) - (cat "0" (num-to-str-base byte 16)) - (num-to-str-base byte 16))) - (byte (i) (hex (& (>> n (* i 8)) 255)))) - (cat (byte 2) (byte 1) (byte 0)))) - - -;;;; semi general utilities - -;; Return the name of O's class as string. -(df class-name-str (o => ) (sym-name (class-name (class-of o)))) - -(df binding-name-str (b| => ) (sym-name (binding-name b))) - -(df as-sym (str|) (as str)) - -;; Replace '//' in the middle of a filename with with a '/' -(df simplify-filename (str| => ) - (match (pathname-to-components str) - ((,hd ,@tl) - (components-to-pathname (cons hd (del-vals tl 'root)))))) - -;; Execute BODY and only if BODY exits abnormally execute RECOVER. -(df try-recover (body recover) - (let ((ok #f)) - (fin (let ((val (body))) - (set ok #t) - val) - (unless ok - (recover))))) - -;; like CL's IGNORE-ERRORS but return VALUE in case of an error. -(df try-or (body| value) - (esc ret - (try (fun (condition resume) (ret value)) - (body)))) - -(df simple-restart (type msg body) - (esc restart - (try ((type type) (description msg)) - (fun (c r) (restart #f)) - (body)))) - -(df safe-write-to-string (o) - (esc ret - (try (fun (c r) - (ret (cat "#"))) - (write-to-string o)))) - -;; Read a string of length COUNT. -(df get-block (port| count| => ) - (packing-as - (for ((i (below count))) - (let ((c (get port))) - (cond ((eof-object? c) - (error "Premature EOF (read %d of %d)" i count)) - (#t (pack c))))))) - - -;;;; import some internal bindings - -(df %lookup (name| module|) - (loc-val - (binding-locative - (find-binding - name (module-target-environment (runtime-module module)))))) - -(d. %handler-info (%lookup 'handler-info 'goo/conditions)) -(d. %handler-condition-type (%lookup 'handler-condition-type 'goo/conditions)) -(d. %do-handlers-of-type (%lookup 'do-handlers-of-type 'goo/conditions)) -(d. %module-loader-modules (%lookup 'module-loader-modules 'eval/module)) -(d. %ast-macro-expand (%lookup 'ast-macro-expand 'eval/ast)) - - -;;;; low level socket stuff -;;; this shouldn't be here - -#{ -#include -#include -#include -#include -#include -#include -#include - -/* convert a goo number to a C long */ -static long g2i (P o) { return untag (o); } - -static int -set_reuse_address (int socket, int value) { - return setsockopt (socket, SOL_SOCKET, SO_REUSEADDR, &value, sizeof value); -} - -static int -bind_socket (int socket, int port) { - struct sockaddr_in addr; - addr.sin_family = AF_INET; - addr.sin_port = htons (port); - addr.sin_addr.s_addr = htonl (INADDR_ANY); - return bind (socket, (struct sockaddr *)&addr, sizeof addr); -} - -static int -local_port (int socket) { - struct sockaddr_in addr; - socklen_t len = sizeof addr; - int code = getsockname (socket, (struct sockaddr *)&addr, &len); - return (code == -1) ? -1 : ntohs (addr.sin_port); -} - -static int -c_accept (int socket) { - struct sockaddr_in addr; - socklen_t len = sizeof addr; - return accept (socket, (struct sockaddr *)&addr, &len); -} - -static P tup3 (P e0, P e1, P e2) { - P tup = YPPtfab ((P)3, YPfalse); - YPtelt_setter (e0, tup, (P)0); - YPtelt_setter (e1, tup, (P)1); - YPtelt_setter (e2, tup, (P)2); - return tup; -} - -static P -current_time (void) { - struct timeval timeval; - int code = gettimeofday (&timeval, NULL); - if (code == 0) { - return tup3 (YPib ((P)(timeval.tv_sec >> 24)), - YPib ((P)(timeval.tv_sec & 0xffffff)), - YPib ((P)(timeval.tv_usec))); - } else return YPib ((P)errno); -} -} - -;; Return the current time in microsecs -(df current-time (=> ) - (def t #eg{ current_time () }) - (cond ((isa? t ) (error "%s" (strerror t))) - (#t (+ (* (+ (<< (1st t) 24) - (2nd t)) - 1000000) - (3rd t))))) - -(dm strerror (e| => ) #es{ strerror (g2i ($e)) }) -(dm strerror (e|(t= #f) => ) #es{ strerror (errno) }) - -(df checkr (value|) - (cond ((~== value -1) value) - (#t (error "%s" (strerror #f))))) - -(df create-socket (port| => ) - (let ((socket (checkr #ei{ socket (PF_INET, SOCK_STREAM, 0) }))) - (checkr #ei{ set_reuse_address (g2i ($socket), 1) }) - (checkr #ei{ bind_socket (g2i ($socket), g2i ($port)) }) - (checkr #ei{ listen (g2i ($socket), 1)}) - socket)) - -(df %local-port (fd|) (checkr #ei{ local_port (g2i ($fd)) })) -(df %close (fd|) (checkr #ei{ close (g2i ($fd)) })) - -(dc ( )) -(dp @fd ( => )) -(dp @in ( => )) -(dp @out ( => )) - -(dm recurring-write (port| x| d| recur|) - (msg port "#{%s fd: %s}" (class-name-str x) (@fd x))) - -(dm get (port| => ) (get (@in port))) - -(dm puts (port| s|) (puts (@out port) s)) -(dm force-out (port|) (force-out (@out port))) - -(dm fdopen (fd| type|(t= ) => ) - (new @fd fd - @in (new port-handle (%fdopen fd "r")) - @out (new port-handle (%fdopen fd "w")))) - -(df %fdopen (fd| mode| => ) - (def addr #ei{ fdopen (g2i ($fd), @mode) }) - (when (zero? addr) - (error "fdopen failed: %s" (strerror #f))) - (%lb (%iu addr))) - -(df accept (socket| => ) - (fdopen (checkr #ei{ c_accept (g2i ($socket)) }) )) - -(export - start-swank - create-server) - -;;; swank-goo.goo ends here \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-hyperdoc.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-hyperdoc.lisp deleted file mode 100644 index 1e34a1d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-hyperdoc.lisp +++ /dev/null @@ -1,18 +0,0 @@ -(in-package :swank) - -(defslimefun hyperdoc (string) - (let ((hyperdoc-package (find-package :hyperdoc))) - (when hyperdoc-package - (multiple-value-bind (symbol foundp symbol-name package) - (parse-symbol string *buffer-package*) - (declare (ignore symbol)) - (when foundp - (funcall (find-symbol (string :lookup) hyperdoc-package) - (package-name (if (member package (cons *buffer-package* - (package-use-list - *buffer-package*))) - *buffer-package* - package)) - symbol-name)))))) - -(provide :swank-hyperdoc) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-ikarus.ss b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-ikarus.ss deleted file mode 100644 index e048446..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-ikarus.ss +++ /dev/null @@ -1,86 +0,0 @@ -;; swank-larceny.scm --- Swank server for Ikarus -;; -;; License: Public Domain -;; Author: Helmut Eller -;; -;; In a shell execute: -;; ikarus swank-ikarus.ss -;; and then `M-x slime-connect' in Emacs. -;; - -(library (swank os) - (export getpid make-server-socket accept local-port close-socket) - (import (rnrs) - (only (ikarus foreign) make-c-callout dlsym dlopen - pointer-set-c-long! pointer-ref-c-unsigned-short - malloc free pointer-size) - (rename (only (ikarus ipc) tcp-server-socket accept-connection - close-tcp-server-socket) - (tcp-server-socket make-server-socket) - (close-tcp-server-socket close-socket)) - (only (ikarus) - struct-type-descriptor - struct-type-field-names - struct-field-accessor) - ) - - (define libc (dlopen)) - (define (cfun name return-type arg-types) - ((make-c-callout return-type arg-types) (dlsym libc name))) - - (define getpid (cfun "getpid" 'signed-int '())) - - (define (accept socket codec) - (let-values (((in out) (accept-connection socket))) - (values (transcoded-port in (make-transcoder codec)) - (transcoded-port out (make-transcoder codec))))) - - (define (socket-fd socket) - (let ((rtd (struct-type-descriptor socket))) - (do ((i 0 (+ i 1)) - (names (struct-type-field-names rtd) (cdr names))) - ((eq? (car names) 'fd) ((struct-field-accessor rtd i) socket))))) - - (define sockaddr_in/size 16) - (define sockaddr_in/sin_family 0) - (define sockaddr_in/sin_port 2) - (define sockaddr_in/sin_addr 4) - - (define (local-port socket) - (let* ((fd (socket-fd socket)) - (addr (malloc sockaddr_in/size)) - (size (malloc (pointer-size)))) - (pointer-set-c-long! size 0 sockaddr_in/size) - (let ((code (getsockname fd addr size)) - (port (ntohs (pointer-ref-c-unsigned-short - addr sockaddr_in/sin_port)))) - (free addr) - (free size) - (cond ((= code -1) (error "getsockname failed")) - (#t port))))) - - (define getsockname - (cfun "getsockname" 'signed-int '(signed-int pointer pointer))) - - (define ntohs (cfun "ntohs" 'unsigned-short '(unsigned-short))) - - ) - - -(library (swank sys) - (export implementation-name eval-in-interaction-environment) - (import (rnrs) - (rnrs eval) - (only (ikarus) interaction-environment)) - - (define (implementation-name) "ikarus") - - (define (eval-in-interaction-environment form) - (eval form (interaction-environment))) - - ) - -(import (only (ikarus) load)) -(load "swank-r6rs.scm") -(import (swank)) -(start-server #f) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-indentation.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-indentation.lisp deleted file mode 100644 index 67e638d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-indentation.lisp +++ /dev/null @@ -1,140 +0,0 @@ -(in-package :swank) - -(defvar *application-hints-tables* '() - "A list of hash tables mapping symbols to indentation hints (lists -of symbols and numbers as per cl-indent.el). Applications can add hash -tables to the list to change the auto indentation slime sends to -emacs.") - -(defun has-application-indentation-hint-p (symbol) - (let ((default (load-time-value (gensym)))) - (dolist (table *application-hints-tables*) - (let ((indentation (gethash symbol table default))) - (unless (eq default indentation) - (return-from has-application-indentation-hint-p - (values indentation t)))))) - (values nil nil)) - -(defun application-indentation-hint (symbol) - (let ((indentation (has-application-indentation-hint-p symbol))) - (labels ((walk (indentation-spec) - (etypecase indentation-spec - (null nil) - (number indentation-spec) - (symbol (string-downcase indentation-spec)) - (cons (cons (walk (car indentation-spec)) - (walk (cdr indentation-spec))))))) - (walk indentation)))) - -;;; override swank version of this function -(defun symbol-indentation (symbol) - "Return a form describing the indentation of SYMBOL. - -The form is to be used as the `common-lisp-indent-function' property -in Emacs." - (cond - ((has-application-indentation-hint-p symbol) - (application-indentation-hint symbol)) - ((and (macro-function symbol) - (not (known-to-emacs-p symbol))) - (let ((arglist (arglist symbol))) - (etypecase arglist - ((member :not-available) - nil) - (list - (macro-indentation arglist))))) - (t nil))) - -;;; More complex version. -(defun macro-indentation (arglist) - (labels ((frob (list &optional base) - (if (every (lambda (x) - (member x '(nil "&rest") :test #'equal)) - list) - ;; If there was nothing interesting, don't return anything. - nil - ;; Otherwise substitute leading NIL's with 4 or 1. - (let ((ok t)) - (substitute-if (if base - 4 - 1) - (lambda (x) - (if (and ok (not x)) - t - (setf ok nil))) - list)))) - (walk (list level &optional firstp) - (when (consp list) - (let ((head (car list))) - (if (consp head) - (let ((indent (frob (walk head (+ level 1) t)))) - (cons (list* "&whole" (if (zerop level) - 4 - 1) - indent) (walk (cdr list) level))) - (case head - ;; &BODY is &BODY, this is clear. - (&body - '("&body")) - ;; &KEY is tricksy. If it's at the base level, we want - ;; to indent them normally: - ;; - ;; (foo bar quux - ;; :quux t - ;; :zot nil) - ;; - ;; If it's at a destructuring level, we want indent of 1: - ;; - ;; (with-foo (var arg - ;; :foo t - ;; :quux nil) - ;; ...) - (&key - (if (zerop level) - '("&rest" nil) - '("&rest" 1))) - ;; &REST is tricksy. If it's at the front of - ;; destructuring, we want to indent by 1, otherwise - ;; normally: - ;; - ;; (foo (bar quux - ;; zot) - ;; ...) - ;; - ;; but - ;; - ;; (foo bar quux - ;; zot) - (&rest - (if (and (plusp level) firstp) - '("&rest" 1) - '("&rest" nil))) - ;; &WHOLE and &ENVIRONMENT are skipped as if they weren't there - ;; at all. - ((&whole &environment) - (walk (cddr list) level firstp)) - ;; &OPTIONAL is indented normally -- and the &OPTIONAL marker - ;; itself is not counted. - (&optional - (walk (cdr list) level)) - ;; Indent normally, walk the tail -- but - ;; unknown lambda-list keywords terminate the walk. - (otherwise - (unless (member head lambda-list-keywords) - (cons nil (walk (cdr list) level)))))))))) - (frob (walk arglist 0 t) t))) - -#+nil -(progn - (assert (equal '(4 4 ("&whole" 4 "&rest" 1) "&body") - (macro-indentation '(bar quux (&rest slots) &body body)))) - (assert (equal nil - (macro-indentation '(a b c &rest more)))) - (assert (equal '(4 4 4 "&body") - (macro-indentation '(a b c &body more)))) - (assert (equal '(("&whole" 4 1 1 "&rest" 1) "&body") - (macro-indentation '((name zot &key foo bar) &body body)))) - (assert (equal nil - (macro-indentation '(x y &key z))))) - -(provide :swank-indentation) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-jolt.k b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-jolt.k deleted file mode 100644 index 93e53ab..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-jolt.k +++ /dev/null @@ -1,998 +0,0 @@ -;;; swank-jolt.k --- Swank server for Jolt -*- goo -*- -;; -;; Copyright (C) 2008 Helmut Eller -;; -;; This file is licensed under the terms of the GNU General Public -;; License as distributed with Emacs (press C-h C-c for details). - -;;; Commentary: -;; -;; Jolt/Coke is a Lisp-like language wich operates at the semantic level of -;; C, i.e. most objects are machine words and memory pointers. The -;; standard boot files define an interface to Id Smalltalk. So we can -;; also pretend to do OOP, but we must be careful to pass properly -;; tagged pointers to Smalltalk. -;; -;; This file only implements a minimum of SLIME's functionality. We -;; install a handler with atexit(3) to invoke the debugger. This way -;; we can stop Jolt from terminating the process on every error. -;; Unfortunately, the backtrace doesn't contain much information and -;; we also have no error message (other than the exit code). Jolt -;; usually prints some message to stdout before calling exit, so you -;; have to look in the *inferior-lisp* buffer for hints. We do -;; nothing (yet) to recover from SIGSEGV. - -;;; Installation -;; -;; 1. Download and build cola. See . -;; I used the svn version: -;; svn co http://piumarta.com/svn2/idst/trunk idst -;; 2. Add something like this to your .emacs: -;; -;; (add-to-list 'slime-lisp-implementations -;; '(jolt (".../idst/function/jolt-burg/main" -;; "boot.k" ".../swank-jolt.k" "-") ; note the "-" -;; :init jolt-slime-init -;; :init-function slime-redirect-inferior-output) -;; (defun jolt-slime-init (file _) (format "%S\n" `(start-swank ,file))) -;; (defun jolt () (interactive) (slime 'jolt)) -;; -;; 3. Use `M-x jolt' to start it. -;; - -;;; Code - -;; In this file I use 2-3 letters for often used names, like DF or -;; VEC, even if those names are abbreviations. I think that after a -;; little getting used to, this style is just as readable as the more -;; traditional DEFUN and VECTOR. Shorter names make it easier to -;; write terse code, in particular 1-line definitions. - -;; `df' is like `defun' in a traditional lisp -(syntax df - (lambda (form compiler) - (printf "df %s ...\n" [[[form second] asString] _stringValue]) - `(define ,[form second] (lambda ,@[form copyFrom: '2])))) - -;; (! args ...) is the same as [args ...] but easier to edit. -(syntax ! - (lambda (form compiler) - (cond ((== [form size] '3) - (if [[form third] isSymbol] - `(send ',[form third] ,[form second]) - [compiler errorSyntax: [form third]])) - ((and [[form size] > '3] - (== [[form size] \\ '2] '0)) - (let ((args [OrderedCollection new]) - (keys [OrderedCollection new]) - (i '2) (len [form size])) - (while (< i len) - (let ((key [form at: i])) - (if (or [key isKeyword] - (and (== i '2) [key isSymbol])) ; for [X + Y] - [keys addLast: [key asString]] - [compiler errorSyntax: key])) - [args addLast: [form at: [i + '1]]] - (set i [i + '2])) - `(send ',[[keys concatenated] asSymbol] ,[form second] ,@args))) - (1 [compiler errorArgumentCount: form])))) - -(define Integer (import "Integer")) -(define Symbol (import "Symbol")) ;; aka. _selector -(define StaticBlockClosure (import "StaticBlockClosure")) -(define BlockClosure (import "BlockClosure")) -(define SequenceableCollection (import "SequenceableCollection")) -(define _vtable (import "_vtable")) -(define ByteArray (import "ByteArray")) -(define CodeGenerator (import "CodeGenerator")) -(define TheGlobalEnvironment (import "TheGlobalEnvironment")) - -(df error (msg) (! Object error: msg)) -(df print-to-string (obj) - (let ((len '200) - (stream (! WriteStream on: (! String new: len)))) - (! stream print: obj) - (! stream contents))) -(df assertion-failed (exp) - (error (! '"Assertion failed: " , (print-to-string exp)))) - -(syntax assert - (lambda (form) - `(if (not ,(! form second)) - (assertion-failed ',(! form second))))) - -(df isa? (obj type) (! obj isKindOf: type)) -(df equal (o1 o2) (! o1 = o2)) - -(define nil 0) -(define false 0) -(define true (! Object notNil)) -(df bool? (obj) (or (== obj false) (== obj true))) -(df int? (obj) (isa? obj Integer)) - -;; In this file the convention X>Y is used for operations that convert -;; X-to-Y. And _ means "machine word". So _>int is the operator that -;; converts a machine word to an Integer. - -(df _>int (word) (! Integer value_: word)) -(df int>_ (i) (! i _integerValue)) - -;; Fixnum operators. Manual tagging/untagging would probably be more -;; efficent than invoking methods. - -(df fix? (obj) (& obj 1)) -(df _>fix (n) (! SmallInteger value_: n)) -(df fix>_ (i) (! i _integerValue)) -(df fx+ (fx1 fx2) (! fx1 + fx2)) -(df fx* (fx1 fx2) (! fx1 * fx2)) -(df fx1+ (fx) (! fx + '1)) -(df fx1- (fx) (! fx - '1)) - -(df str? (obj) (isa? obj String)) -(df >str (o) (! o asString)) -(df str>_ (s) (! s _stringValue)) -(df _>str (s) (! String value_: s)) -(df sym? (obj) (isa? obj Symbol)) -(df seq? (obj) (isa? obj SequenceableCollection)) -(df array? (obj) (isa? obj Array)) -(df len (obj) (! obj size)) -(df len_ (obj) (! (! obj size) _integerValue)) -(df ref (obj idx) (! obj at: idx)) -(df set-ref (obj idx elt) (! obj at: idx put: elt)) -(df first (obj) (! obj first)) -(df second (obj) (! obj second)) - -(df puts (string stream) (! stream nextPutAll: string)) - -(define _GC_base (dlsym "GC_base")) - -;; Is ADDR a pointer to a heap allocated object? The Boehm GC nows -;; such things. This is useful for debugging, because we can quite -;; safely (i.e. without provoking SIGSEGV) access such addresses. -(df valid-pointer? (addr) - (let ((ptr (& addr (~ 1)))) - (and (_GC_base ptr) - (_GC_base (long@ ptr -1))))) - -;; Print OBJ as a Lisp printer would do. -(df prin1 (obj stream) - (cond ((fix? obj) (! stream print: obj)) - ((== obj nil) (puts '"nil" stream)) - ((== obj false) (puts '"#f" stream)) - ((== obj true) (puts '"#t" stream)) - ((not (valid-pointer? obj)) - (begin (puts '"#int obj) stream) - (puts '">" stream))) - ((int? obj) (! stream print: obj)) - ((sym? obj) (puts (>str obj) stream)) - ((isa? obj StaticBlockClosure) - (begin (puts '"#" stream))) - ((and (str? obj) (len obj)) - (! obj printEscapedOn: stream delimited: (ref '"\"" '0))) - ((and (array? obj) (len obj)) - (begin (puts '"(" stream) - (let ((max (- (len_ obj) 1))) - (for (i 0 1 max) - (prin1 (ref obj (_>fix i)) stream) - (if (!= i max) - (puts '" " stream)))) - (puts '")" stream))) - ((and (isa? obj OrderedCollection) (len obj)) - (begin (puts '"#[" stream) - (let ((max (- (len_ obj) 1))) - (for (i 0 1 max) - (prin1 (ref obj (_>fix i)) stream) - (if (!= i max) - (puts '" " stream)))) - (puts '"]" stream))) - (true - (begin (puts '"#<" stream) - (puts (! obj debugName) stream) - (puts '">" stream)))) - obj) - -(df print (obj) - (prin1 obj StdOut) - (puts '"\n" StdOut)) - -(df prin1-to-string (obj) - (let ((len '100) - (stream (! WriteStream on: (! String new: len)))) - (prin1 obj stream) - (! stream contents))) - -;;(df %vable-tally (_vtable) (long@ _vtable)) -(df cr () (printf "\n")) -(df print-object-selectors (obj) - (let ((vtable (! obj _vtable)) - (tally (long@ vtable 0)) - (bindings (long@ vtable 1))) - (for (i 1 1 tally) - (print (long@ (long@ bindings i))) - (cr)))) - -(df print-object-slots (obj) - (let ((size (! obj _sizeof)) - (end (+ obj size))) - (while (< obj end) - (print (long@ obj)) - (cr) - (incr obj 4)))) - -(df intern (string) (! Symbol intern: string)) - -;; Jolt doesn't seem to have an equivalent for gensym, but it's damn -;; hard to write macros without it. So here we adopt the conventions -;; that symbols which look like ".[0-9]+" are reserved for gensym and -;; shouldn't be used for "user visible variables". -(define gensym-counter 0) -(df gensym () - (set gensym-counter (+ gensym-counter 1)) - (intern (! '"." , (>str (_>fix gensym-counter))))) - -;; Surprisingly, SequenceableCollection doesn't have a indexOf method. -;; So we even need to implement such mundane things. -(df index-of (seq elt) - (let ((max (len seq)) - (i '0)) - (while (! i < max) - (if (equal (ref seq i) elt) - (return i) - (set i (! i + '1)))) - nil)) - -(df find-dot (array) (index-of array '.)) - -;; What followes is the implementation of the pattern matching macro MIF. -;; The syntax is (mif (PATTERN EXP) THEN ELSE). -;; The THEN-branch is executed if PATTERN matches the value produced by EXP. -;; ELSE gets only executed if the match failes. -;; A pattern can be -;; 1) a symbol, which matches all values, but also binds the variable to the -;; value -;; 2) (quote LITERAL), matches if the value is `equal' to LITERAL. -;; 3) (PS ...) matches sequences, if the elements match PS. -;; 4) (P1 ... Pn . Ptail) matches if P1 ... Pn match the respective elements -;; at indices 1..n and if Ptail matches the rest -;; of the sequence -;; Examples: -;; (mif (x 10) x 'else) => 10 -;; (mif ('a 'a) 'then 'else) => then -;; (mif ('a 'b) 'then 'else) => else -;; (mif ((a b) '(1 2)) b 'else) => 2 -;; (mif ((a . b) '(1 2)) b 'else) => '(2) -;; (mif ((. x) '(1 2)) x 'else) => '(1 2) - -(define mif% 0) ;; defer -(df mif%array (compiler pattern i value then fail) - ;;(print `(mif%array ,pattern ,i ,value)) - (cond ((== i (len_ pattern)) then) - ((== (ref pattern (_>fix i)) '.) - (begin - (if (!= (- (len_ pattern) 2) i) - (begin - (print pattern) - (! compiler error: (! '"dot in strange position: " - , (>str (_>fix i)))))) - (mif% compiler - (ref pattern (_>fix (+ i 1))) - `(! ,value copyFrom: ',(_>fix i)) - then fail))) - (true - (mif% compiler - (ref pattern (_>fix i)) - `(ref ,value ',(_>fix i)) - (mif%array compiler pattern (+ i 1) value then fail) - fail)))) - -(df mif% (compiler pattern value then fail) - ;;(print `(mif% ,pattern ,value ,then)) - (cond ((== pattern '_) then) - ((== pattern '.) (! compiler errorSyntax: pattern)) - ((sym? pattern) - `(let ((,pattern ,value)) ,then)) - ((seq? pattern) - (cond ((== (len_ pattern) 0) - `(if (== (len_ ,value) 0) ,then (goto ,fail))) - ((== (first pattern) 'quote) - (begin - (if (not (== (len_ pattern) 2)) - (! compiler errorSyntax: pattern)) - `(if (equal ,value ,pattern) ,then (goto ,fail)))) - (true - (let ((tmp (gensym)) (tmp2 (gensym)) - (pos (find-dot pattern))) - `(let ((,tmp2 ,value) - (,tmp ,tmp2)) - (if (and (seq? ,tmp) - ,(if (find-dot pattern) - `(>= (len ,tmp) - ',(_>fix (- (len_ pattern) 2))) - `(== (len ,tmp) ',(len pattern)))) - ,(mif%array compiler pattern 0 tmp then fail) - (goto ,fail))))))) - (true (! compiler errorSyntax: pattern)))) - -(syntax mif - (lambda (node compiler) - ;;(print `(mif ,node)) - (if (not (or (== (len_ node) 4) - (== (len_ node) 3))) - (! compiler errorArgumentCount: node)) - (if (not (and (array? (ref node '1)) - (== (len_ (ref node '1)) 2))) - (! compiler errorSyntax: (ref node '1))) - (let ((pattern (first (ref node '1))) - (value (second (ref node '1))) - (then (ref node '2)) - (else (if (== (len_ node) 4) - (ref node '3) - `(error "mif failed"))) - (destination (gensym)) - (fail (! compiler newLabel)) - (success (! compiler newLabel))) - `(let ((,destination 0)) - ,(mif% compiler pattern value - `(begin (set ,destination ,then) - (goto ,success)) - fail) - (label ,fail) - (set ,destination ,else) - (label ,success) - ,destination)))) - -;; (define *catch-stack* nil) -;; -(df bar (o) (mif ('a o) 'yes 'no)) -(assert (== (bar 'a) 'yes)) -(assert (== (bar 'b) 'no)) -(df foo (o) (mif (('a) o) 'yes 'no)) -(assert (== (foo '(a)) 'yes)) -(assert (== (foo '(b)) 'no)) -(df baz (o) (mif (('a 'b) o) 'yes 'no)) -(assert (== (baz '(a b)) 'yes)) -(assert (== (baz '(a c)) 'no)) -(assert (== (baz '(b c)) 'no)) -(assert (== (baz 'a) 'no)) -(df mifvar (o) (mif (y o) y 'no)) -(assert (== (mifvar 'foo) 'foo)) -(df mifvec (o) (mif ((y) o) y 'no)) -(assert (== (mifvec '(a)) 'a)) -(assert (== (mifvec 'x) 'no)) -(df mifvec2 (o) (mif (('a y) o) y 'no)) -(assert (== (mifvec2 '(a b)) 'b)) -(assert (== (mifvec2 '(b c)) 'no)) -(assert (== (mif ((x) '(a)) x 'no) 'a)) -(assert (== (mif ((x . y) '(a b)) x 'no) 'a)) -(assert (== (mif ((x y . z) '(a b)) y 'no) 'b)) -(assert (equal (mif ((x . y) '(a b)) y 'no) '(b))) -(assert (equal (mif ((. x) '(a b)) x 'no) '(a b))) -(assert (equal (mif (((. x)) '((a b))) x 'no) '(a b))) -(assert (equal (mif (((. x) . y) '((a b) c)) y 'no) '(c))) -(assert (== (mif (() '()) 'yes 'no) 'yes)) -(assert (== (mif (() '(a)) 'yes 'no) 'no)) - -;; Now that we have a somewhat convenient pattern matcher we can write -;; a more convenient macro defining macro: -(syntax defmacro - (lambda (node compiler) - (mif (('defmacro name (. args) . body) node) - (begin - (printf "defmacro %s ...\n" (str>_ (>str name))) - `(syntax ,name - (lambda (node compiler) - (mif ((',name ,@args) node) - (begin ,@body) - (! compiler errorSyntax: node))))) - (! compiler errorSyntax: node)))) - -;; and an even more convenient pattern matcher: -(defmacro mcase (value . clauses) - (let ((tmp (gensym))) - `(let ((,tmp ,value)) - ,(mif (() clauses) - `(begin (print ,tmp) - (error "mcase failed")) - (mif (((pattern . body) . more) clauses) - `(mif (,pattern ,tmp) - (begin ,@(mif (() body) '(0) body)) - (mcase ,tmp ,@more)) - (! compiler errorSyntax: clauses)))))) - -;; and some traditional macros -(defmacro when (test . body) `(if ,test (begin ,@body))) -(defmacro unless (test . body) `(if ,test 0 (begin ,@body))) -(defmacro or (. args) ; the built in OR returns 1 on success. - (mcase args - (() 0) - ((e) e) - ((e1 . more) - (let ((tmp (gensym))) - `(let ((,tmp ,e1)) - (if ,tmp ,tmp (or ,@more))))))) - -(defmacro dotimes_ ((var n) . body) - (let ((tmp (gensym))) - `(let ((,tmp ,n) - (,var 0)) - (while (< ,var ,tmp) - ,@body - (set ,var (+ ,var 1)))))) - -(defmacro dotimes ((var n) . body) - (let ((tmp (gensym))) - `(let ((,tmp ,n) - (,var '0)) - (while (< ,var ,tmp) - ,@body - (set ,var (fx1+ ,var)))))) - -;; DOVEC is like the traditional DOLIST but works on "vectors" -;; i.e. sequences which can be indexed efficently. -(defmacro dovec ((var seq) . body) - (let ((i (gensym)) - (max (gensym)) - (tmp (gensym))) - `(let ((,i 0) - (,tmp ,seq) - (,max (len_ ,tmp))) - (while (< ,i ,max) - (let ((,var (! ,tmp at: (_>fix ,i)))) - ,@body - (set ,i (+ ,i 1))))))) - -;; "Packing" is what Lispers usually call "collecting". -;; The Lisp idiom (let ((result '())) .. (push x result) .. (nreverse result)) -;; translates to (packing (result) .. (pack x result)) -(defmacro packing ((var) . body) - `(let ((,var (! OrderedCollection new))) - ,@body - (! ,var asArray))) - -(df pack (elt packer) (! packer addLast: elt)) - -(assert (equal (packing (p) (dotimes_ (i 2) (pack (_>fix i) p))) - '(0 1))) - -(assert (equal (packing (p) (dovec (e '(2 3)) (pack e p))) - '(2 3))) - -(assert (equal (packing (p) - (let ((a '(2 3))) - (dotimes (i (len a)) - (pack (ref a i) p)))) - '(2 3))) - -;; MAPCAR (more or less) -(df map (fun col) - (packing (r) - (dovec (e col) - (pack (fun e) r)))) - -;; VEC allocates and initializes a new array. -;; The macro translates (vec x y z) to `(,x ,y ,z). -(defmacro vec (. args) - `(quasiquote - (,@(map (lambda (arg) `(,'unquote ,arg)) - args)))) - -(assert (equal (vec '0 '1) '(0 1))) -(assert (equal (vec) '())) -(assert (== (len (vec 0 1 2 3 4)) '5)) - -;; Concatenate. -(defmacro cat (. args) `(! (vec '"" ,@args) concatenated)) - -(assert (equal (cat '"a" '"b" '"c") '"abc")) - -;; Take a vector of bytes and copy the bytes to a continuous -;; block of memory -(df assemble_ (col) (! (! ByteArray withAll: col) _bytes)) - -;; Jolt doesn't seem to have catch/throw or something equivalent. -;; Here I use a pair of assembly routines as substitue. -;; (catch% FUN) calls FUN with the current stack pointer. -;; (throw% VALUE K) unwinds the stack to K and then returns VALUE. -;; catch% is a bit like call/cc. -;; -;; [Would setjmp/longjmp work from Jolt? or does setjmp require -;; C-compiler magic?] -;; [I figure Smalltalk has a way to do non-local-exits but, I don't know -;; how to use that in Jolt.] -;; -(define catch% - (assemble_ - '(0x55 ; push %ebp - 0x89 0xe5 ; mov %esp,%ebp - 0x54 ; push %esp - 0x8b 0x45 0x08 ; mov 0x8(%ebp),%eax - 0xff 0xd0 ; call *%eax - 0xc9 ; leave - 0xc3 ; ret - ))) - -(define throw% - (assemble_ - `(,@'() - 0x8b 0x44 0x24 0x04 ; mov 0x4(%esp),%eax - 0x8b 0x6c 0x24 0x08 ; mov 0x8(%esp),%ebp - 0xc9 ; leave - 0xc3 ; ret - ))) - -(df bar (i k) - (if (== i 0) - (throw% 100 k) - (begin - (printf "bar %d\n" i) - (bar (- i 1) k)))) -(df foo (k) - (printf "foo.1\n") - (printf "foo.2 %d\n" (bar 10 k))) - -;; Our way to produce closures: we compile a new little function which -;; hardcodes the addresses of the code resp. the data-vector. The -;; nice thing is that such closures can be used called C function -;; pointers. It's probably slow to invoke the compiler for such -;; things, so use with care. -(df make-closure (addr state) - (int>_ - (! `(lambda (a b c d) - (,(_>int addr) ,(_>int state) a b c d)) - eval))) - -;; Return a closure which calls FUN with ARGS and the arguments -;; that the closure was called with. -;; Example: ((curry printf "%d\n") 10) -(defmacro curry (fun . args) - `(make-closure - (lambda (state a b c d) - ((ref state '0) - ,@(packing (sv) - (dotimes (i (len args)) - (pack `(ref state ',(fx1+ i)) sv))) - a b c d)) - (vec ,fun ,@args))) - -(df parse-closure-arglist (vars) - (let ((pos (or (index-of vars '|) - (return nil))) - (cvars (! vars copyFrom: '0 to: (fx1- pos))) - (lvars (! vars copyFrom: (fx1+ pos)))) - (vec cvars lvars))) - -;; Create a closure, to-be-closed-over variables must enumerated -;; explicitly. -;; Example: ((let ((x 1)) (closure (x | y) (+ x y))) 3) => 4. -;; The variables before the "|" are captured by the closure. -(defmacro closure ((. vars) . body) - (mif ((cvars lvars) (parse-closure-arglist vars)) - `(curry (lambda (,@cvars ,@lvars) ,@body) - ,@cvars) - (! compiler errorSyntax: vars))) - -;; The analog for Smalltalkish "blocks". -(defmacro block ((. vars) . body) - (mif ((cvars lvars) (parse-closure-arglist vars)) - `(! StaticBlockClosure - function_: (curry (lambda (,@cvars _closure _self ,@lvars) ,@body) - ,@cvars) - arity_: ,(len lvars)) - (! compiler errorSyntax: vars))) - -(define %mkstemp (dlsym "mkstemp")) -(df make-temp-file () - (let ((name (! '"/tmp/jolt-tmp.XXXXXX" copy)) - (fd (%mkstemp (! name _stringValue)))) - (if (== fd -1) - (error "mkstemp failed")) - `(,fd ,name))) -(define %unlink (dlsym "unlink")) -(df unlink (filename) (%unlink (! filename _stringValue))) - -(define write (dlsym "write")) -(df write-bytes (addr count fd) - (let ((written (write fd addr count))) - (if (!= written count) - (begin - (printf "write failed %p %d %d => %d" addr count fd written) - (error '"write failed"))))) - -(define system (dlsym "system")) -(define main (dlsym "main")) - -;; Starting at address ADDR, disassemble COUNT bytes. -;; This is implemented by writing the memory region to a file -;; and call ndisasm on it. -(df disas (addr count) - (let ((fd+name (make-temp-file))) - (write-bytes addr count (first fd+name)) - (let ((cmd (str>_ (cat '"ndisasm -u -o " - (>str (_>fix addr)) - '" " (second fd+name))))) - (printf "Running: %s\n" cmd) - (system cmd)) - (unlink (second fd+name)))) - -(df rep () - (let ((result (! (! CokeScanner read: StdIn) eval))) - (puts '"=> " StdOut) - (print result) - (puts '"\n" StdOut))) - -;; Perhaps we could use setcontext/getcontext to return from signal -;; handlers (or not). -(define +ucontext-size+ 350) -(define _getcontext (dlsym "getcontext")) -(define _setcontext (dlsym "setcontext")) -(df getcontext () - (let ((context (malloc 350))) - (_getcontext context) - context)) - -(define on_exit (dlsym "on_exit")) ; "atexit" doesn't work. why? - -(define *top-level-restart* 0) -(define *top-level-context* 0) -(define *debugger-hook* 0) - -;; Jolt's error handling strategy is charmingly simple: call exit. -;; We invoke the SLIME debugger from an exit handler. -;; (The handler is registered with atexit, that's a libc function.) - -(df exit-handler (reason arg) - (printf "exit-handler 0x%x\n" reason) - ;;(backtrace) - (on_exit exit-handler nil) - (when *debugger-hook* - (*debugger-hook* `(exit ,reason))) - (cond (*top-level-context* - (_setcontext *top-level-context*)) - (*top-level-restart* - (throw% reason *top-level-restart*)))) - -(df repl () - (set *top-level-context* (getcontext)) - (while (not (! (! StdIn readStream) atEnd)) - (printf "top-level\n") - (catch% - (lambda (k) - (set *top-level-restart* k) - (printf "repl\n") - (while 1 - (rep))))) - (printf "EOF\n")) - -;; (repl) - - -;;; Socket code. (How boring. Duh, should have used netcat instead.) - -(define strerror (dlsym "strerror")) - -(df check-os-code (value) - (if (== value -1) - (error (_>str (strerror (fix>_ (! OS errno))))) - value)) - -;; For now just hard-code constants which usually reside in header -;; files (just like a Forth guy would do). -(define PF_INET 2) -(define SOCK_STREAM 1) -(define SOL_SOCKET 1) -(define SO_REUSEADDR 2) -(define socket (dlsym "socket")) -(define setsockopt (dlsym "setsockopt")) - -(df set-reuse-address (sock value) - (let ((word-size 4) - (val (! Object _balloc: (_>fix word-size)))) - (set-int@ val value) - (check-os-code - (setsockopt sock SOL_SOCKET SO_REUSEADDR val word-size)))) - -(define sockaddr_in/size 16) -(define sockaddr_in/sin_family 0) -(define sockaddr_in/sin_port 2) -(define sockaddr_in/sin_addr 4) -(define INADDR_ANY 0) -(define AF_INET 2) -(define htons (dlsym "htons")) -(define bind (dlsym "bind")) - -(df bind-socket (sock port) - (let ((addr (! OS _balloc: (_>fix sockaddr_in/size)))) - (set-short@ (+ addr sockaddr_in/sin_family) AF_INET) - (set-short@ (+ addr sockaddr_in/sin_port) (htons port)) - (set-int@ (+ addr sockaddr_in/sin_addr) INADDR_ANY) - (check-os-code - (bind sock addr sockaddr_in/size)))) - -(define listen (dlsym "listen")) - -(df create-socket (port) - (let ((sock (check-os-code (socket PF_INET SOCK_STREAM 0)))) - (set-reuse-address sock 1) - (bind-socket sock port) - (check-os-code (listen sock 1)) - sock)) - -(define accept% (dlsym "accept")) -(df accept (sock) - (let ((addr (! OS _balloc: (_>fix sockaddr_in/size))) - (len (! OS _balloc: 4))) - (set-int@ len sockaddr_in/size) - (check-os-code (accept% sock addr len)))) - -(define getsockname (dlsym "getsockname")) -(define ntohs (dlsym "ntohs")) -(df local-port (sock) - (let ((addr (! OS _balloc: (_>fix sockaddr_in/size))) - (len (! OS _balloc: 4))) - (set-int@ len sockaddr_in/size) - (check-os-code - (getsockname sock addr len)) - (ntohs (short@ (+ addr sockaddr_in/sin_port))))) - -(define close (dlsym "close")) -(define _read (dlsym "read")) - -;; Now, after 2/3 of the file we can begin with the actual Swank -;; server. - -(df read-string (fd count) - (let ((buffer (! String new: count)) - (buffer_ (str>_ buffer)) - (count_ (int>_ count)) - (start 0)) - (while (> (- count_ start) 0) - (let ((rcount (check-os-code (_read fd - (+ buffer_ start) - (- count_ start))))) - (set start (+ start rcount)))) - buffer)) - -;; Read and parse a message from the wire. -(df read-packet (fd) - (let ((header (read-string fd '6)) - (length (! Integer fromString: header base: '16)) - (payload (read-string fd length))) - (! CokeScanner read: payload))) - -;; Print a messag to the wire. -(df send-to-emacs (event fd) - (let ((stream (! WriteStream on: (! String new: '100)))) - (! stream position: '6) - (prin1 event stream) - (let ((len (! stream position))) - (! stream position: '0) - (! (fx+ len '-6) printOn: stream base: '16 width: '6) - (write-bytes (str>_ (! stream collection)) (int>_ len) fd)))) - -(df add-quotes (form) - (mcase form - ((fun . args) - `(,fun ,@(packing (s) - (dovec (e args) - (pack `(quote ,e) s))))))) - -(define sldb 0) ;defer - -(df eval-for-emacs (form id fd abort) - (let ((old-hook *debugger-hook*)) - (mcase (catch% - (closure (form fd | k) - (set *debugger-hook* (curry sldb fd k)) - `(ok ,(int>_ (! (add-quotes form) eval))))) - (('ok value) - (set *debugger-hook* old-hook) - (send-to-emacs `(:return (:ok ,value) ,id) fd) - 'ok) - (arg - (set *debugger-hook* old-hook) - (send-to-emacs `(:return (:abort) ,id) fd) - (throw% arg abort))))) - -(df process-events (fd) - (on_exit exit-handler nil) - (let ((done nil)) - (while (not done) - (mcase (read-packet fd) - ((':emacs-rex form package thread id) - (mcase (catch% (closure (form id fd | abort) - (eval-for-emacs form id fd abort))) - ('ok) - ;;('abort nil) - ('top-level) - (other - ;;(return other) ; compiler breaks with return - (set done 1)))))))) - -(df next-frame (fp) - (let ((next (get-caller-fp fp))) - (if (and (!= next fp) - (<= next %top-level-fp)) - next - nil))) - -(df nth-frame (n top) - (let ((fp top) - (i 0)) - (while fp - (if (== i n) (return fp)) - (set fp (next-frame fp)) - (set i (+ i 1))) - nil)) - -(define Dl_info/size 16) -(define Dl_info/dli_fname 0) -(define Dl_info/dli_sname 8) - -(df get-dl-sym-name (addr) - (let ((info (! OS _balloc: (_>fix Dl_info/size)))) - (when (== (dladdr addr info) 0) - (return nil)) - (let ((sname (long@ (+ info Dl_info/dli_sname)) ) - (fname (long@ (+ info Dl_info/dli_fname)))) - (cond ((and sname fname) - (cat (_>str sname) '" in " (_>str fname))) - (sname (_>str fname)) - (fname (cat '" " (_>str fname))) - (true nil))))) - -;;(get-dl-sym-name printf) - -(df guess-function-name (ip) - (let ((fname (get-function-name ip))) - (if fname - (_>str fname) - (get-dl-sym-name ip)))) - -(df backtrace>el (top_ from_ to_) - (let ((fp (nth-frame from_ top_)) - (i from_)) - (packing (bt) - (while (and fp (< i to_)) - (let ((ip (get-frame-ip fp))) - (pack (vec (_>int i) - (cat (or (guess-function-name ip) '"(no-name)") - '" " ;;(>str (_>int ip)) - )) - bt)) - (set i (+ i 1)) - (set fp (next-frame fp)))))) - -(df debugger-info (fp msg) - (vec `(,(prin1-to-string msg) " [type ...]" ()) - '(("quit" "Return to top level")) - (backtrace>el fp 0 20) - '())) - -(define *top-frame* 0) -(define *sldb-quit* 0) - -(df debugger-loop (fd args abort) - (let ((fp (get-current-fp))) - (set *top-frame* fp) - (send-to-emacs `(:debug 0 1 ,@(debugger-info fp args)) fd) - (while 1 - (mcase (read-packet fd) - ((':emacs-rex form package thread id) - (mcase (catch% (closure (form id fd | k) - (set *sldb-quit* k) - (eval-for-emacs form id fd k) - 'ok)) - ('ok nil) - (other - (send-to-emacs `(:return (:abort) ,id) fd) - (throw% other abort)))))))) - -(df sldb (fd abort args) - (let ((old-top-frame *top-frame*) - (old-sldb-quit *sldb-quit*)) - (mcase (catch% (curry debugger-loop fd args)) - (value - (set *top-frame* old-top-frame) - (set *sldb-quit* old-sldb-quit) - (send-to-emacs `(:debug-return 0 1 nil) fd) - (throw% value abort))))) - -(df swank:backtrace (start end) - (backtrace>el *top-frame* (int>_ start) (int>_ end))) - -(df sldb-quit () - (assert *sldb-quit*) - (throw% 'top-level *sldb-quit*)) - -(df swank:invoke-nth-restart-for-emacs (...) (sldb-quit)) -(df swank:throw-to-toplevel (...) (sldb-quit)) - -(df setup-server (port announce) - (let ((sock (create-socket port))) - (announce sock) - (let ((client (accept sock))) - (process-events client) - (close client)) - (printf "Closing socket: %d %d\n" sock (local-port sock)) - (close sock))) - -(df announce-port (sock) - (printf "Listening on port: %d\n" (local-port sock))) - -(df create-server (port) (setup-server port announce-port)) - -(df write-port-file (filename sock) - (let ((f (! File create: filename))) - (! f write: (print-to-string (_>int (local-port sock)))) - (! f close))) - -(df start-swank (port-file) - (setup-server 0 (curry write-port-file (_>str port-file)))) - -(define getpid (dlsym "getpid")) -(df swank:connection-info () - `(,@'() - :pid ,(_>int (getpid)) - :style nil - :lisp-implementation (,@'() - :type "Coke" - :name "jolt" - :version ,(! CodeGenerator versionString)) - :machine (:instance "" :type ,(! OS architecture) :version "") - :features () - :package (:name "jolt" :prompt "jolt"))) - -(df swank:listener-eval (string) - (let ((result (! (! CokeScanner read: string) eval))) - `(:values ,(prin1-to-string (if (or (fix? result) - (and (valid-pointer? result) - (int? result))) - (int>_ result) - result)) - ,(prin1-to-string result)))) - -(df swank:interactive-eval (string) - (let ((result (! (! CokeScanner read: string) eval))) - (cat '"=> " (prin1-to-string (if (or (fix? result) - (and (valid-pointer? result) - (int? result))) - (int>_ result) - result)) - '", " (prin1-to-string result)))) - -(df swank:operator-arglist () nil) -(df swank:buffer-first-change () nil) -(df swank:create-repl (_) '("jolt" "jolt")) - -(df min (x y) (if (<= x y) x y)) - -(df common-prefix2 (e1 e2) - (let ((i '0) - (max (min (len e1) (len e2)))) - (while (and (< i max) - (== (ref e1 i) (ref e2 i))) - (set i (fx1+ i))) - (! e1 copyFrom: '0 to: (fx1- i)))) - -(df common-prefix (seq) - (mcase seq - (() nil) - (_ - (let ((prefix (ref seq '0))) - (dovec (e seq) - (set prefix (common-prefix2 prefix e))) - prefix)))) - -(df swank:simple-completions (prefix _package) - (let ((matches (packing (s) - (dovec (e (! TheGlobalEnvironment keys)) - (let ((name (>str e))) - (when (! name beginsWith: prefix) - (pack name s))))))) - (vec matches (or (common-prefix matches) prefix)))) - - -;; swank-jolt.k ends here diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-kawa.scm b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-kawa.scm deleted file mode 100644 index 3dd9c07..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-kawa.scm +++ /dev/null @@ -1,2504 +0,0 @@ -;;;; swank-kawa.scm --- Swank server for Kawa -;;; -;;; Copyright (C) 2007 Helmut Eller -;;; -;;; This file is licensed under the terms of the GNU General Public -;;; License as distributed with Emacs (press C-h C-c for details). - -;;;; Installation -;; -;; 1. You need Kawa (version 2.x) and a JVM with debugger support. -;; -;; 2. Compile this file and create swank-kawa.jar with: -;; java -cp kawa.jar:$JAVA_HOME/lib/tools.jar \ -;; -Xss2M kawa.repl --r7rs -d classes -C swank-kawa.scm && -;; jar cf swank-kawa.jar -C classes . -;; -;; 3. Add something like this to your .emacs: -#| -;; Kawa, Swank, and the debugger classes (tools.jar) must be in the -;; classpath. You also need to start the debug agent. -(setq slime-lisp-implementations - '((kawa - ("java" - ;; needed jar files - "-cp" "kawa-2.0.1.jar:swank-kawa.jar:/opt/jdk1.8.0/lib/tools.jar" - ;; channel for debugger - "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n" - ;; depending on JVM, compiler may need more stack - "-Xss2M" - ;; kawa without GUI - "kawa.repl" "-s") - :init kawa-slime-init))) - -(defun kawa-slime-init (file _) - (setq slime-protocol-version 'ignore) - (format "%S\n" - `(begin (import (swank-kawa)) - (start-swank ,file) - ;; Optionally add source paths of your code so - ;; that M-. works better: - ;;(set! swank-java-source-path - ;; (append - ;; '(,(expand-file-name "~/lisp/slime/contrib/") - ;; "/scratch/kawa") - ;; swank-java-source-path)) - ))) - -;; Optionally define a command to start it. -(defun kawa () - (interactive) - (slime 'kawa)) - -|# -;; 4. Start everything with M-- M-x slime kawa -;; -;; - - -;;; Code: - -(define-library (swank macros) - (export df fun seq set fin esc - ! !! !s @ @s - when unless while dotimes dolist for packing with pushf == assert - mif mcase mlet mlet* typecase ignore-errors - ferror - ) - (import (scheme base) - (only (kawa base) - syntax - quasisyntax - syntax-case - define-syntax-case - identifier? - - invoke - invoke-static - field - static-field - instance? - try-finally - try-catch - primitive-throw - - format - reverse! - as - )) - (begin " -(" - -(define (ferror fstring #!rest args) - (let ((err ( - (as (apply format fstring args))))) - (primitive-throw err))) - -(define (rewrite-lambda-list args) - (syntax-case args () - (() #`()) - ((rest x ...) (eq? #'rest #!rest) args) - ((optional x ...) (eq? #'optional #!optional) args) - ((var args ...) (identifier? #'var) - #`(var #,@(rewrite-lambda-list #'(args ...)))) - (((var type) args ...) (identifier? #'var) - #`((var :: type) #,@(rewrite-lambda-list #'(args ...)))))) - -(define-syntax df - (lambda (stx) - (syntax-case stx (=>) - ((df name (args ... => return-type) body ...) - #`(define (name #,@(rewrite-lambda-list #'(args ...))) :: return-type - (seq body ...))) - ((df name (args ...) body ...) - #`(define (name #,@(rewrite-lambda-list #'(args ...))) - (seq body ...)))))) - -(define-syntax fun - (lambda (stx) - (syntax-case stx (=>) - ((fun (args ... => return-type) body ...) - #`(lambda #,(rewrite-lambda-list #'(args ...)) :: return-type - (seq body ...))) - ((fun (args ...) body ...) - #`(lambda #,(rewrite-lambda-list #'(args ...)) - (seq body ...)))))) - -(define-syntax fin - (syntax-rules () - ((fin body handler ...) - (try-finally body (seq handler ...))))) - -(define-syntax seq - (syntax-rules () - ((seq) - (begin #!void)) - ((seq body ...) - (begin body ...)))) - -(define-syntax esc - (syntax-rules () - ((esc abort body ...) - (let* ((key ()) - (abort (lambda (val) (throw key val)))) - (catch key - (lambda () body ...) - (lambda (key val) val)))))) - -(define-syntax ! - (syntax-rules () - ((! name obj args ...) - (invoke obj 'name args ...)))) - -(define-syntax !! - (syntax-rules () - ((!! name1 name2 obj args ...) - (! name1 (! name2 obj args ...))))) - -(define-syntax !s - (syntax-rules () - ((! class name args ...) - (invoke-static class 'name args ...)))) - -(define-syntax @ - (syntax-rules () - ((@ name obj) - (field obj 'name)))) - -(define-syntax @s - (syntax-rules (quote) - ((@s class name) - (static-field class (quote name))))) - -(define-syntax while - (syntax-rules () - ((while exp body ...) - (do () ((not exp)) body ...)))) - -(define-syntax dotimes - (syntax-rules () - ((dotimes (i n result) body ...) - (let ((max :: n)) - (do ((i :: 0 (as (+ i 1)))) - ((= i max) result) - body ...))) - ((dotimes (i n) body ...) - (dotimes (i n #f) body ...)))) - -(define-syntax dolist - (syntax-rules () - ((dolist (e list) body ... ) - (for ((e list)) body ...)))) - -(define-syntax for - (syntax-rules () - ((for ((var iterable)) body ...) - (let ((iter (! iterator iterable))) - (while (! has-next iter) - ((lambda (var) body ...) - (! next iter))))))) - -(define-syntax packing - (syntax-rules () - ((packing (var) body ...) - (let ((var :: '())) - (let ((var (lambda (v) (set! var (cons v var))))) - body ...) - (reverse! var))))) - -;;(define-syntax loop -;; (syntax-rules (for = then collect until) -;; ((loop for var = init then step until test collect exp) -;; (packing (pack) -;; (do ((var init step)) -;; (test) -;; (pack exp)))) -;; ((loop while test collect exp) -;; (packing (pack) (while test (pack exp)))))) - -(define-syntax with - (syntax-rules () - ((with (vars ... (f args ...)) body ...) - (f args ... (lambda (vars ...) body ...))))) - -(define-syntax pushf - (syntax-rules () - ((pushf value var) - (set! var (cons value var))))) - -(define-syntax == - (syntax-rules () - ((== x y) - (eq? x y)))) - -(define-syntax set - (syntax-rules () - ((set x y) - (let ((tmp y)) - (set! x tmp) - tmp)) - ((set x y more ...) - (begin (set! x y) (set more ...))))) - -(define-syntax assert - (syntax-rules () - ((assert test) - (seq - (when (not test) - (error "Assertion failed" 'test)) - 'ok)) - ((assert test fstring args ...) - (seq - (when (not test) - (error "Assertion failed" 'test (format #f fstring args ...))) - 'ok)))) - -(define-syntax mif - (syntax-rules (quote unquote _) - ((mif ('x value) then else) - (if (equal? 'x value) then else)) - ((mif (,x value) then else) - (if (eq? x value) then else)) - ((mif (() value) then else) - (if (eq? value '()) then else)) - #| This variant produces no lambdas but breaks the compiler - ((mif ((p . ps) value) then else) - (let ((tmp value) - (fail? :: 0) - (result #!null)) - (if (instance? tmp ) - (let ((tmp :: tmp)) - (mif (p (! get-car tmp)) - (mif (ps (! get-cdr tmp)) - (set! result then) - (set! fail? -1)) - (set! fail? -1))) - (set! fail? -1)) - (if (= fail? 0) result else))) - |# - ((mif ((p . ps) value) then else) - (let ((fail (lambda () else)) - (tmp value)) - (if (instance? tmp ) - (let ((tmp :: tmp)) - (mif (p (! get-car tmp)) - (mif (ps (! get-cdr tmp)) - then - (fail)) - (fail))) - (fail)))) - ((mif (_ value) then else) - then) - ((mif (var value) then else) - (let ((var value)) then)) - ((mif (pattern value) then) - (mif (pattern value) then (values))))) - -(define-syntax mcase - (syntax-rules () - ((mcase exp (pattern body ...) more ...) - (let ((tmp exp)) - (mif (pattern tmp) - (begin body ...) - (mcase tmp more ...)))) - ((mcase exp) (ferror "mcase failed ~s\n~a" 'exp exp)))) - -(define-syntax mlet - (syntax-rules () - ((mlet (pattern value) body ...) - (let ((tmp value)) - (mif (pattern tmp) - (begin body ...) - (error "mlet failed" tmp)))))) - -(define-syntax mlet* - (syntax-rules () - ((mlet* () body ...) (begin body ...)) - ((mlet* ((pattern value) ms ...) body ...) - (mlet (pattern value) (mlet* (ms ...) body ...))))) - -(define-syntax typecase% - (syntax-rules (eql or satisfies) - ((typecase% var (#t body ...) more ...) - (seq body ...)) - ((typecase% var ((eql value) body ...) more ...) - (cond ((eqv? var 'value) body ...) - (else (typecase% var more ...)))) - ((typecase% var ((satisfies predicate) body ...) more ...) - (cond ((predicate var) body ...) - (else (typecase% var more ...)))) - ((typecase% var ((or type) body ...) more ...) - (typecase% var (type body ...) more ...)) - ((typecase% var ((or type ...) body ...) more ...) - (let ((f (lambda (var) body ...))) - (typecase% var - (type (f var)) ... - (#t (typecase% var more ...))))) - ((typecase% var (type body ...) more ...) - (cond ((instance? var type) - (let ((var :: type (as type var))) - body ...)) - (else (typecase% var more ...)))) - ((typecase% var) - (error "typecase% failed" var - (! getClass (as var)))))) - -(define-syntax typecase - (lambda (stx) - (syntax-case stx () - ((_ exp more ...) (identifier? (syntax exp)) - #`(typecase% exp more ...)) - ((_ exp more ...) - #`(let ((tmp exp)) - (typecase% tmp more ...)))))) - -(define-syntax ignore-errors - (syntax-rules () - ((ignore-errors body ...) - (try-catch (seq body ...) - (v #f) - (v #f))))) - -)) - -(define-library (swank-kawa) - (export start-swank - create-swank-server - swank-java-source-path - break) - (import (scheme base) - (scheme file) - (scheme repl) - (scheme read) - (scheme write) - (scheme eval) - (scheme process-context) - (swank macros) - (only (kawa base) - - define-alias - define-variable - - define-simple-class - this - - invoke-special - instance? - as - - primitive-throw - try-finally - try-catch - synchronized - - call-with-input-string - call-with-output-string - force-output - format - - make-process - command-parse - - runnable - - scheme-implementation-version - reverse! - ) - (rnrs hashtables) - (only (gnu kawa slib syntaxutils) expand) - (only (kawa regex) regex-match)) - (begin " -(" - - -;;(define-syntax dc -;; (syntax-rules () -;; ((dc name () %% (props ...) prop more ...) -;; (dc name () %% (props ... (prop )) more ...)) -;; ;;((dc name () %% (props ...) (prop type) more ...) -;; ;; (dc name () %% (props ... (prop type)) more ...)) -;; ((dc name () %% ((prop type) ...)) -;; (define-simple-class name () -;; ((*init* (prop :: type) ...) -;; (set (field (this) 'prop) prop) ...) -;; (prop :type type) ...)) -;; ((dc name () props ...) -;; (dc name () %% () props ...)))) - - -;;;; Aliases - -(define-alias java.net.ServerSocket) -(define-alias java.net.Socket) -(define-alias java.io.InputStreamReader) -(define-alias java.io.OutputStreamWriter) -(define-alias gnu.kawa.io.InPort) -(define-alias gnu.kawa.io.OutPort) -(define-alias java.io.File) -(define-alias java.lang.String) -(define-alias java.lang.StringBuilder) -(define-alias java.lang.Throwable) -(define-alias gnu.text.SourceError) -(define-alias gnu.expr.ModuleInfo) -(define-alias java.lang.Iterable) -(define-alias java.lang.Thread) -(define-alias java.util.concurrent.LinkedBlockingQueue) -(define-alias java.util.concurrent.Exchanger) -(define-alias java.util.concurrent.TimeUnit) -(define-alias com.sun.jdi.VirtualMachine) -(define-alias com.sun.jdi.Mirror) -(define-alias com.sun.jdi.Value) -(define-alias com.sun.jdi.ThreadReference) -(define-alias com.sun.jdi.ObjectReference) -(define-alias com.sun.jdi.ArrayReference) -(define-alias com.sun.jdi.StringReference) -(define-alias com.sun.jdi.Method) -(define-alias com.sun.jdi.ClassType) -(define-alias com.sun.jdi.ReferenceType) -(define-alias com.sun.jdi.StackFrame) -(define-alias com.sun.jdi.Field) -(define-alias com.sun.jdi.LocalVariable) -(define-alias com.sun.jdi.Location) -(define-alias com.sun.jdi.AbsentInformationException) -(define-alias com.sun.jdi.event.Event) -(define-alias com.sun.jdi.event.ExceptionEvent) -(define-alias com.sun.jdi.event.StepEvent) -(define-alias com.sun.jdi.event.BreakpointEvent) -(define-alias gnu.mapping.Environment) - -(define-simple-class () - (owner :: #:init (!s java.lang.Thread currentThread)) - (peer :: ) - (queue :: #:init ()) - (lock #:init ())) - - -;;;; Entry Points - -(df create-swank-server (port-number) - (setup-server port-number announce-port)) - -(df start-swank (port-file) - (let ((announce (fun ((socket )) - (with (f (call-with-output-file port-file)) - (format f "~d\n" (! get-local-port socket)))))) - (spawn (fun () - (setup-server 0 announce))))) - -(df setup-server ((port-number ) announce) - (! set-name (current-thread) "swank") - (let ((s ( port-number))) - (announce s) - (let ((c (! accept s))) - (! close s) - (log "connection: ~s\n" c) - (fin (dispatch-events c) - (log "closing socket: ~a\n" s) - (! close c))))) - -(df announce-port ((socket )) - (log "Listening on port: ~d\n" (! get-local-port socket))) - - -;;;; Event dispatcher - -(define-variable *the-vm* #f) -(define-variable *last-exception* #f) -(define-variable *last-stacktrace* #f) -(df %vm (=> ) *the-vm*) - -;; FIXME: this needs factorization. But I guess the whole idea of -;; using bidirectional channels just sucks. Mailboxes owned by a -;; single thread to which everybody can send are much easier to use. - -(df dispatch-events ((s )) - (mlet* ((charset "iso-8859-1") - (ins ( (! getInputStream s) charset)) - (outs ( (! getOutputStream s) charset)) - ((in . _) (spawn/chan/catch (fun (c) (reader ins c)))) - ((out . _) (spawn/chan/catch (fun (c) (writer outs c)))) - ((dbg . _) (spawn/chan/catch vm-monitor)) - (user-env (interaction-environment)) - (x (seq - (! set-flag user-env #t #|:THREAD_SAFE|# 8) - (! set-flag user-env #f #|:DIRECT_INHERITED_ON_SET|# 16) - #f)) - ((listener . _) - (spawn/chan (fun (c) (listener c user-env)))) - (inspector #f) - (threads '()) - (repl-thread #f) - (extra '()) - (vm (let ((vm #f)) (fun () (or vm (rpc dbg `(get-vm))))))) - (while #t - (mlet ((c . event) (recv* (append (list in out dbg listener) - (if inspector (list inspector) '()) - (map car threads) - extra))) - ;;(log "event: ~s\n" event) - (mcase (list c event) - ((_ (':emacs-rex ('|swank:debugger-info-for-emacs| from to) - pkg thread id)) - (send dbg `(debug-info ,thread ,from ,to ,id))) - ((_ (':emacs-rex ('|swank:throw-to-toplevel|) pkg thread id)) - (send dbg `(throw-to-toplevel ,thread ,id))) - ((_ (':emacs-rex ('|swank:sldb-continue|) pkg thread id)) - (send dbg `(thread-continue ,thread ,id))) - ((_ (':emacs-rex ('|swank:frame-source-location| frame) - pkg thread id)) - (send dbg `(frame-src-loc ,thread ,frame ,id))) - ((_ (':emacs-rex ('|swank:frame-locals-and-catch-tags| frame) - pkg thread id)) - (send dbg `(frame-details ,thread ,frame ,id))) - ((_ (':emacs-rex ('|swank:sldb-disassemble| frame) - pkg thread id)) - (send dbg `(disassemble-frame ,thread ,frame ,id))) - ((_ (':emacs-rex ('|swank:backtrace| from to) pkg thread id)) - (send dbg `(thread-frames ,thread ,from ,to ,id))) - ((_ (':emacs-rex ('|swank:list-threads|) pkg thread id)) - (send dbg `(list-threads ,id))) - ((_ (':emacs-rex ('|swank:debug-nth-thread| n) _ _ _)) - (send dbg `(debug-nth-thread ,n))) - ((_ (':emacs-rex ('|swank:quit-thread-browser|) _ _ id)) - (send dbg `(quit-thread-browser ,id))) - ((_ (':emacs-rex ('|swank:init-inspector| str . _) pkg _ id)) - (set inspector (make-inspector user-env (vm))) - (send inspector `(init ,str ,id))) - ((_ (':emacs-rex ('|swank:inspect-frame-var| frame var) - pkg thread id)) - (mlet ((im . ex) (chan)) - (set inspector (make-inspector user-env (vm))) - (send dbg `(get-local ,ex ,thread ,frame ,var)) - (send inspector `(init-mirror ,im ,id)))) - ((_ (':emacs-rex ('|swank:inspect-current-condition|) pkg thread id)) - (mlet ((im . ex) (chan)) - (set inspector (make-inspector user-env (vm))) - (send dbg `(get-exception ,ex ,thread)) - (send inspector `(init-mirror ,im ,id)))) - ((_ (':emacs-rex ('|swank:inspect-nth-part| n) pkg _ id)) - (send inspector `(inspect-part ,n ,id))) - ((_ (':emacs-rex ('|swank:inspector-pop|) pkg _ id)) - (send inspector `(pop ,id))) - ((_ (':emacs-rex ('|swank:quit-inspector|) pkg _ id)) - (send inspector `(quit ,id))) - ((_ (':emacs-interrupt id)) - (let* ((vm (vm)) - (t (find-thread id (map cdr threads) repl-thread vm))) - (send dbg `(interrupt-thread ,t)))) - ((_ (':emacs-rex form _ _ id)) - (send listener `(,form ,id))) - ((_ ('get-vm c)) - (send dbg `(get-vm ,c))) - ((_ ('get-channel c)) - (mlet ((im . ex) (chan)) - (pushf im extra) - (send c ex))) - ((_ ('forward x)) - (send out x)) - ((_ ('set-listener x)) - (set repl-thread x)) - ((_ ('publish-vm vm)) - (set *the-vm* vm)) - ))))) - -(df find-thread (id threads listener (vm )) - (cond ((== id ':repl-thread) listener) - ((== id 't) listener - ;;(if (null? threads) - ;; listener - ;; (vm-mirror vm (car threads))) - ) - (#t - (let ((f (find-if threads - (fun (t :: ) - (= id (! uniqueID - (as (vm-mirror vm t))))) - #f))) - (cond (f (vm-mirror vm f)) - (#t listener)))))) - - -;;;; Reader thread - -(df reader ((in ) (c )) - (! set-name (current-thread) "swank-net-reader") - (let ((rt (!s gnu.kawa.lispexpr.ReadTable createInitial))) ; ':' not special - (while #t - (send c (decode-message in rt))))) - -(df decode-message ((in ) (rt ) => ) - (let* ((header (read-chunk in 6)) - (len (!s java.lang.Integer parseInt header 16))) - (call-with-input-string (read-chunk in len) - (fun ((port )) - (%read port rt))))) - -(df read-chunk ((in ) (len ) => ) - (let ((chars ( #:length len))) - (let loop ((offset :: 0)) - (cond ((= offset len) ( chars)) - (#t (let ((count (! read in chars offset (- len offset)))) - (assert (not (= count -1)) "partial packet") - (loop (+ offset count)))))))) - -;;; FIXME: not thread safe -(df %read ((port ) (table )) - (let ((old (!s gnu.kawa.lispexpr.ReadTable getCurrent))) - (try-finally - (seq (!s gnu.kawa.lispexpr.ReadTable setCurrent table) - (read port)) - (!s gnu.kawa.lispexpr.ReadTable setCurrent old)))) - - -;;;; Writer thread - -(df writer ((out ) (c )) - (! set-name (current-thread) "swank-net-writer") - (while #t - (encode-message out (recv c)))) - -(df encode-message ((out ) (message )) - (let ((builder ( (as 512)))) - (print-for-emacs message builder) - (! write out (! toString (format "~6,'0x" (! length builder)))) - (! write out builder) - (! flush out))) - -(df print-for-emacs (obj (out )) - (let ((pr (fun (o) (! append out (! toString (format "~s" o))))) - (++ (fun ((s )) (! append out (! toString s))))) - (cond ((null? obj) (++ "nil")) - ((string? obj) (pr obj)) - ((number? obj) (pr obj)) - ;;((keyword? obj) (++ ":") (! append out (to-str obj))) - ((symbol? obj) (pr obj)) - ((pair? obj) - (++ "(") - (let loop ((obj obj)) - (print-for-emacs (car obj) out) - (let ((cdr (cdr obj))) - (cond ((null? cdr) (++ ")")) - ((pair? cdr) (++ " ") (loop cdr)) - (#t (++ " . ") (print-for-emacs cdr out) (++ ")")))))) - (#t (error "Unprintable object" obj))))) - -;;;; SLIME-EVAL - -(df eval-for-emacs ((form ) env (id ) (c )) - ;;(! set-uncaught-exception-handler (current-thread) - ;; ( (fun (t e) (reply-abort c id)))) - (reply c (%eval form env) id)) - -(define-variable *slime-funs*) -(set *slime-funs* (tab)) - -(df %eval (form env) - (apply (lookup-slimefun (car form) *slime-funs*) env (cdr form))) - -(df lookup-slimefun ((name ) tab) - ;; name looks like '|swank:connection-info| - (or (get tab name #f) - (ferror "~a not implemented" name))) - -(df %defslimefun ((name ) (fun )) - (let ((string (symbol->string name))) - (cond ((regex-match #/:/ string) - (put *slime-funs* name fun)) - (#t - (let ((qname (string->symbol (string-append "swank:" string)))) - (put *slime-funs* qname fun)))))) - -(define-syntax defslimefun - (syntax-rules () - ((defslimefun name (args ...) body ...) - (seq - (df name (args ...) body ...) - (%defslimefun 'name name))))) - -(defslimefun connection-info ((env )) - (let ((prop (fun (name) (!s java.lang.System getProperty name)))) - `(:pid - 0 - :style :spawn - :lisp-implementation (:type "Kawa" :name "kawa" - :version ,(scheme-implementation-version)) - :machine (:instance ,(prop "java.vm.name") :type ,(prop "os.name") - :version ,(prop "java.runtime.version")) - :features () - :package (:name "??" :prompt ,(! getName env)) - :encoding (:coding-systems ("iso-8859-1")) - ))) - - -;;;; Listener - -(df listener ((c ) (env )) - (! set-name (current-thread) "swank-listener") - (log "listener: ~s ~s ~s ~s\n" - (current-thread) (! hashCode (current-thread)) c env) - (let ((out (make-swank-outport (rpc c `(get-channel))))) - (set (current-output-port) out) - (let ((vm (as (rpc c `(get-vm))))) - (send c `(set-listener ,(vm-mirror vm (current-thread)))) - (request-uncaught-exception-events vm) - ;;stack snaphost are too expensive - ;;(request-caught-exception-events vm) - ) - (rpc c `(get-vm)) - (listener-loop c env out))) - -(define-simple-class () - ((*init*) - (invoke-special (this) '*init* )) - ((abort) :: void - (primitive-throw (this)))) - -(df listener-loop ((c ) (env ) port) - (while (not (nul? c)) - ;;(log "listener-loop: ~s ~s\n" (current-thread) c) - (mlet ((form id) (recv c)) - (let ((restart (fun () - (close-port port) - (reply-abort c id) - (send (car (spawn/chan - (fun (cc) - (listener (recv cc) env)))) - c) - (set c #!null)))) - (! set-uncaught-exception-handler (current-thread) - ( (fun (t e) (restart)))) - (try-catch - (let* ((val (%eval form env))) - (force-output) - (reply c val id)) - (ex (invoke-debugger ex) (restart)) - (ex (invoke-debugger ex) (restart)) - (ex - (let ((flag (!s java.lang.Thread interrupted))) - (log "listener-abort: ~s ~a\n" ex flag)) - (restart)) - ))))) - -(df invoke-debugger (condition) - ;;(log "should now invoke debugger: ~a" condition) - (try-catch - (break condition) - (ex (seq)))) - -(defslimefun |swank-repl:create-repl| (env #!rest _) - (list "user" "user")) - -(defslimefun interactive-eval (env str) - (values-for-echo-area (eval (read-from-string str) env))) - -(defslimefun interactive-eval-region (env (s )) - (with (port (call-with-input-string s)) - (values-for-echo-area - (let next ((result (values))) - (let ((form (read port))) - (cond ((== form #!eof) result) - (#t (next (eval form env))))))))) - -(defslimefun |swank-repl:listener-eval| (env string) - (let* ((form (read-from-string string)) - (list (values-to-list (eval form env)))) - `(:values ,@(map pprint-to-string list)))) - -(defslimefun pprint-eval (env string) - (let* ((form (read-from-string string)) - (l (values-to-list (eval form env)))) - (apply cat (map pprint-to-string l)))) - -(defslimefun eval-and-grab-output (env string) - (let ((form (read (open-input-string string)))) - (let-values ((values (eval form env))) - (list "" - (format #f "~{~S~^~%~}" values))))) - -(df call-with-abort (f) - (try-catch (f) (ex (exception-message ex)))) - -(df exception-message ((ex )) - (typecase ex - ( (! to-string ex)) - ( (format "~a: ~a" - (class-name-sans-package ex) - (! getMessage ex))))) - -(df values-for-echo-area (values) - (let ((values (values-to-list values))) - (cond ((null? values) "; No value") - (#t (format "~{~a~^, ~}" (map pprint-to-string values)))))) - -;;;; Compilation - -(defslimefun compile-file-for-emacs (env (filename ) load? - #!optional options) - (let ((jar (cat (path-sans-extension (filepath filename)) ".jar"))) - (wrap-compilation - (fun ((m )) - (!s kawa.lang.CompileFile read filename m)) - jar (if (lisp-bool load?) env #f) #f))) - -(df wrap-compilation (f jar env delete?) - (let ((start-time (current-time)) - (messages ())) - (try-catch - (let ((c (as (f messages)))) - (set (@ explicit c) #t) - (! compile-to-archive c (! get-module c) jar)) - (ex - (log "error during compilation: ~a\n~a" ex (! getStackTrace ex)) - (! error messages (as #\f) - (to-str (exception-message ex)) #!null) - #f)) - (log "compilation done.\n") - (let ((success? (zero? (! get-error-count messages)))) - (when (and env success?) - (log "loading ...\n") - (eval `(load ,jar) env) - (log "loading ... done.\n")) - (when delete? - (ignore-errors (delete-file jar) #f)) - (let ((end-time (current-time))) - (list ':compilation-result - (compiler-notes-for-emacs messages) - (if success? 't 'nil) - (/ (- end-time start-time) 1000.0)))))) - -(defslimefun compile-string-for-emacs (env string buffer offset dir) - (wrap-compilation - (fun ((m )) - (let ((c (as - (call-with-input-string - string - (fun ((p )) - (! set-path p - (format "~s" - `(buffer ,buffer offset ,offset str ,string))) - (!s kawa.lang.CompileFile read p m)))))) - (let ((o (@ currentOptions c))) - (! set o "warn-invoke-unknown-method" #t) - (! set o "warn-undefined-variable" #t)) - (let ((m (! getModule c))) - (! set-name m (format ":~a/~a" buffer (current-time)))) - c)) - "/tmp/kawa-tmp.zip" env #t)) - -(df compiler-notes-for-emacs ((messages )) - (packing (pack) - (do ((e (! get-errors messages) (@ next e))) - ((nul? e)) - (pack (source-error>elisp e))))) - -(df source-error>elisp ((e ) => ) - (list ':message (to-string (@ message e)) - ':severity (case (integer->char (@ severity e)) - ((#\e #\f) ':error) - ((#\w) ':warning) - (else ':note)) - ':location (error-loc>elisp e))) - -(df error-loc>elisp ((e )) - (cond ((nul? (@ filename e)) `(:error "No source location")) - ((! starts-with (@ filename e) "(buffer ") - (mlet (('buffer b 'offset ('quote ((:position o) _)) 'str s) - (read-from-string (@ filename e))) - (let ((off (line>offset (1- (@ line e)) s)) - (col (1- (@ column e)))) - `(:location (:buffer ,b) (:position ,(+ o off col)) nil)))) - (#t - `(:location (:file ,(to-string (@ filename e))) - (:line ,(@ line e) ,(1- (@ column e))) - nil)))) - -(df line>offset ((line ) (s ) => ) - (let ((offset :: 0)) - (dotimes (i line) - (set offset (! index-of s (as #\newline) offset)) - (assert (>= offset 0)) - (set offset (as (+ offset 1)))) - (log "line=~a offset=~a\n" line offset) - offset)) - -(defslimefun load-file (env filename) - (format "Loaded: ~a => ~s" filename (eval `(load ,filename) env))) - -;;;; Completion - -(defslimefun simple-completions (env (pattern ) _) - (let* ((env (as env)) - (matches (packing (pack) - (let ((iter (! enumerate-all-locations env))) - (while (! has-next iter) - (let ((l (! next-location iter))) - (typecase l - ( - (let ((name (!! get-name get-key-symbol l))) - (when (! starts-with name pattern) - (pack name))))))))))) - `(,matches ,(cond ((null? matches) pattern) - (#t (fold+ common-prefix matches)))))) - -(df common-prefix ((s1 ) (s2 ) => ) - (let ((limit (min (! length s1) (! length s2)))) - (let loop ((i 0)) - (cond ((or (= i limit) - (not (== (! char-at s1 i) - (! char-at s2 i)))) - (! substring s1 0 i)) - (#t (loop (1+ i))))))) - -(df fold+ (f list) - (let loop ((s (car list)) - (l (cdr list))) - (cond ((null? l) s) - (#t (loop (f s (car l)) (cdr l)))))) - -;;; Quit - -(defslimefun quit-lisp (env) - (exit)) - -;;(defslimefun set-default-directory (env newdir)) - - -;;;; Dummy defs - -(defslimefun buffer-first-change (#!rest y) '()) -(defslimefun swank-require (#!rest y) '()) -(defslimefun frame-package-name (#!rest y) '()) - -;;;; arglist - -(defslimefun operator-arglist (env name #!rest _) - (mcase (try-catch `(ok ,(eval (read-from-string name) env)) - (ex 'nil)) - (('ok obj) - (mcase (arglist obj) - ('#f 'nil) - ((args rtype) - (format "(~a~{~^ ~a~})~a" name - (map (fun (e) - (if (equal (cadr e) "java.lang.Object") (car e) e)) - args) - (if (equal rtype "java.lang.Object") - "" - (format " => ~a" rtype)))))) - (_ 'nil))) - -(df arglist (obj) - (typecase obj - ( - (let* ((mref (module-method>meth-ref obj))) - (list (mapi (! arguments mref) - (fun ((v )) - (list (! name v) (! typeName v)))) - (! returnTypeName mref)))) - ( #f))) - -;;;; M-. - -(defslimefun find-definitions-for-emacs (env name) - (mcase (try-catch `(ok ,(eval (read-from-string name) env)) - (ex `(error ,(exception-message ex)))) - (('ok obj) (mapi (all-definitions obj) - (fun (d) - `(,(format "~a" d) ,(src-loc>elisp (src-loc d)))))) - (('error msg) `((,name (:error ,msg)))))) - -(define-simple-class () - (file #:init #f) - (line #:init #f) - ((*init* file name) - (set (@ file (this)) file) - (set (@ line (this)) line)) - ((lineNumber) :: (or line (absent))) - ((lineNumber (s :: )) :: int (! lineNumber (this))) - ((method) :: (absent)) - ((sourcePath) :: (or file (absent))) - ((sourcePath (s :: )) :: (! sourcePath (this))) - ((sourceName) :: (absent)) - ((sourceName (s :: )) :: (! sourceName (this))) - ((declaringType) :: (absent)) - ((codeIndex) :: -1) - ((virtualMachine) :: *the-vm*) - ((compareTo o) :: - (typecase o - ( (- (! codeIndex (this)) (! codeIndex o)))))) - -(df absent () (primitive-throw ())) - -(df all-definitions (o) - (typecase o - ( (list o)) - ( (list o)) - ( (append (mappend all-definitions (gf-methods o)) - (let ((s (! get-setter o))) - (if s (all-definitions s) '())))) - ( (list o)) - ( (all-definitions (! get-class o))) - ( (list o)) - ( (all-definitions (! getReflectClass o))) - ( '()) - )) - -(df gf-methods ((f )) - (let* ((o :: (vm-mirror *the-vm* f)) - (f (! field-by-name (! reference-type o) "methods")) - (ms (vm-demirror *the-vm* (! get-value o f)))) - (filter (array-to-list ms) (fun (x) (not (nul? x)))))) - -(df src-loc (o => ) - (typecase o - ( (src-loc (@ method o))) - ( (module-method>src-loc o)) - ( ( #f #f)) - ( (class>src-loc o)) - ( ( #f #f)) - ( (bytemethod>src-loc o)))) - -(df module-method>src-loc ((f )) - (! location (module-method>meth-ref f))) - -(df module-method>meth-ref ((f ) => ) - (let* ((module (! reference-type - (as (vm-mirror *the-vm* (@ module f))))) - (1st-method-by-name (fun (name) - (let ((i (! methods-by-name module name))) - (cond ((! is-empty i) #f) - (#t (1st i))))))) - (as (or (1st-method-by-name (! get-name f)) - (let ((mangled (mangled-name f))) - (or (1st-method-by-name mangled) - (1st-method-by-name (cat mangled "$V")) - (1st-method-by-name (cat mangled "$X")))))))) - -(df mangled-name ((f )) - (let* ((name0 (! get-name f)) - (name (cond ((nul? name0) (format "lambda~d" (@ selector f))) - (#t (!s gnu.expr.Compilation mangleName name0))))) - name)) - -(df class>src-loc ((c ) => ) - (let* ((type (class>ref-type c)) - (locs (! all-line-locations type))) - (cond ((not (! isEmpty locs)) (1st locs)) - (#t ( (1st (! source-paths type "Java")) - #f))))) - -(df class>ref-type ((class ) => ) - (! reflectedType (as - (vm-mirror *the-vm* class)))) - -(df class>class-type ((class ) => ) - (as (class>ref-type class))) - -(df bytemethod>src-loc ((m ) => ) - (let* ((cls (class>class-type (! get-reflect-class - (! get-declaring-class m)))) - (name (! get-name m)) - (sig (! get-signature m)) - (meth (! concrete-method-by-name cls name sig))) - (! location meth))) - -(df src-loc>elisp ((l )) - (df src-loc>list ((l )) - (list (ignore-errors (! source-name l "Java")) - (ignore-errors (! source-path l "Java")) - (ignore-errors (! line-number l "Java")))) - (mcase (src-loc>list l) - ((name path line) - (cond ((not path) - `(:error ,(call-with-abort (fun () (! source-path l))))) - ((! starts-with (as path) "(buffer ") - (mlet (('buffer b 'offset o 'str s) (read-from-string path)) - `(:location (:buffer ,b) - (:position ,(+ o (line>offset line s))) - nil))) - (#t - `(:location ,(or (find-file-in-path name (source-path)) - (find-file-in-path path (source-path)) - (ferror "Can't find source-path: ~s ~s ~a" - path name (source-path))) - (:line ,(or line -1)) ())))))) - -(df src-loc>str ((l )) - (cond ((nul? l) "") - (#t (format "~a ~a ~a" - (or (ignore-errors (! source-path l)) - (ignore-errors (! source-name l)) - (ignore-errors (!! name declaring-type l))) - (ignore-errors (!! name method l)) - (ignore-errors (! lineNumber l)))))) - -;;;;;; class-path hacking - -;; (find-file-in-path "kawa/lib/kawa/hashtable.scm" (source-path)) - -(df find-file-in-path ((filename ) (path )) - (let ((f ( filename))) - (cond ((! isAbsolute f) `(:file ,filename)) - (#t (let ((result #f)) - (find-if path (fun (dir) - (let ((x (find-file-in-dir f dir))) - (set result x))) - #f) - result))))) - -(df find-file-in-dir ((file ) (dir )) - (let ((filename :: (! getPath file))) - (or (let ((child ( ( dir) filename))) - (and (! exists child) - `(:file ,(! getPath child)))) - (try-catch - (and (not (nul? (! getEntry ( dir) filename))) - `(:zip ,dir ,filename)) - (ex #f))))) - -(define swank-java-source-path - (let* ((jre-home :: (!s getProperty "java.home")) - (parent :: (! get-parent ( jre-home)))) - (list (! get-path ( parent "src.zip"))))) - -(df source-path () - (mlet ((base) (search-path-prop "user.dir")) - (append - (list base) - (map (fun ((s )) - (let ((f ( s)) - (base :: (as base))) - (cond ((! isAbsolute f) s) - (#t (! getPath ( base s)))))) - (class-path)) - swank-java-source-path))) - -(df class-path () - (append (search-path-prop "java.class.path") - (search-path-prop "sun.boot.class.path"))) - -(df search-path-prop ((name )) - (array-to-list (! split (!s java.lang.System getProperty name) - (@s pathSeparator)))) - -;;;; Disassemble - -(defslimefun disassemble-form (env form) - (mcase (read-from-string form) - (('quote name) - (let ((f (eval name env))) - (typecase f - ( - (disassemble-to-string (module-method>meth-ref f)))))))) - -(df disassemble-to-string ((mr ) => ) - (with-sink #f (fun (out) (disassemble-meth-ref mr out)))) - -(df disassemble-meth-ref ((mr ) (out )) - (let* ((t (! declaring-type mr))) - (disas-header mr out) - (disas-code (! constant-pool t) - (! constant-pool-count t) - (! bytecodes mr) - out))) - -(df disas-header ((mr ) (out )) - (let* ((++ (fun ((str )) (! write out str))) - (? (fun (flag str) (if flag (++ str))))) - (? (! is-static mr) "static ") - (? (! is-final mr) "final ") - (? (! is-private mr) "private ") - (? (! is-protected mr) "protected ") - (? (! is-public mr) "public ") - (++ (! name mr)) (++ (! signature mr)) (++ "\n"))) - -(df disas-code ((cpool ) (cpoolcount ) (bytecode ) - (out )) - (let* ((ct ( "foo")) - (met (! addMethod ct "bar" 0)) - (ca ( met)) - (constants (let* ((bs ()) - (s ( bs))) - (! write-short s cpoolcount) - (! write s cpool) - (! flush s) - (! toByteArray bs)))) - (vm-set-slot *the-vm* ct "constants" - ( - ( - ( - constants)))) - (! setCode ca bytecode) - (let ((w ( ct out 0))) - (! print ca w) - (! flush w)))) - -(df with-sink (sink (f )) - (cond ((instance? sink ) (f sink)) - ((== sink #t) (f (as (current-output-port)))) - ((== sink #f) - (let* ((buffer ()) - (out ( buffer))) - (f out) - (! flush out) - (! toString buffer))) - (#t (ferror "Invalid sink designator: ~s" sink)))) - -(df test-disas ((c ) (m )) - (let* ((vm (as *the-vm*)) - (c (as (1st (! classes-by-name vm c)))) - (m (as (1st (! methods-by-name c m))))) - (with-sink #f (fun (out) (disassemble-meth-ref m out))))) - -;; (test-disas "java.lang.Class" "toString") - - -;;;; Macroexpansion - -(defslimefun swank-expand-1 (env s) (%swank-macroexpand s env)) -(defslimefun swank-expand (env s) (%swank-macroexpand s env)) -(defslimefun swank-expand-all (env s) (%swank-macroexpand s env)) - -(df %swank-macroexpand (string env) - (pprint-to-string (%macroexpand (read-from-string string) env))) - -(df %macroexpand (sexp env) (expand sexp #:env env)) - - -;;;; Inspector - -(define-simple-class () - (object #:init #!null) - (parts :: #:init () ) - (stack :: #:init '()) - (content :: #:init '())) - -(df make-inspector (env (vm ) => ) - (car (spawn/chan (fun (c) (inspector c env vm))))) - -(df inspector ((c ) env (vm )) - (! set-name (current-thread) "inspector") - (let ((state :: ()) - (open #t)) - (while open - (mcase (recv c) - (('init str id) - (set state ()) - (let ((obj (try-catch (eval (read-from-string str) env) - (ex ex)))) - (reply c (inspect-object obj state vm) id))) - (('init-mirror cc id) - (set state ()) - (let* ((mirror (recv cc)) - (obj (vm-demirror vm mirror))) - (reply c (inspect-object obj state vm) id))) - (('inspect-part n id) - (let ((part (! get (@ parts state) n))) - (reply c (inspect-object part state vm) id))) - (('pop id) - (reply c (inspector-pop state vm) id)) - (('quit id) - (reply c 'nil id) - (set open #f)))))) - -(df inspect-object (obj (state ) (vm )) - (set (@ object state) obj) - (set (@ parts state) ()) - (pushf obj (@ stack state)) - (set (@ content state) (inspector-content - `("class: " (:value ,(! getClass obj)) "\n" - ,@(inspect obj vm)) - state)) - (cond ((nul? obj) (list ':title "#!null" ':id 0 ':content `())) - (#t - (list ':title (pprint-to-string obj) - ':id (assign-index obj state) - ':content (let ((c (@ content state))) - (content-range c 0 (len c))))))) - -(df inspect (obj vm) - (let ((obj (as (vm-mirror vm obj)))) - (typecase obj - ( (inspect-array-ref vm obj)) - ( (inspect-obj-ref vm obj))))) - -(df inspect-array-ref ((vm ) (obj )) - (packing (pack) - (let ((i 0)) - (for (((v :: ) (! getValues obj))) - (pack (format "~d: " i)) - (pack `(:value ,(vm-demirror vm v))) - (pack "\n") - (set i (1+ i)))))) - -(df inspect-obj-ref ((vm ) (obj )) - (let* ((type (! referenceType obj)) - (fields (! allFields type)) - (values (! getValues obj fields)) - (ifields '()) (sfields '()) (imeths '()) (smeths '()) - (frob (lambda (lists) (apply append (reverse lists))))) - (for (((f :: ) fields)) - (let* ((val (as (! get values f))) - (l `(,(! name f) ": " (:value ,(vm-demirror vm val)) "\n"))) - (if (! is-static f) - (pushf l sfields) - (pushf l ifields)))) - (for (((m :: ) (! allMethods type))) - (let ((l `(,(! name m) ,(! signature m) "\n"))) - (if (! is-static m) - (pushf l smeths) - (pushf l imeths)))) - `(,@(frob ifields) - "--- static fields ---\n" ,@(frob sfields) - "--- methods ---\n" ,@(frob imeths) - "--- static methods ---\n" ,@(frob smeths)))) - -(df inspector-content (content (state )) - (map (fun (part) - (mcase part - ((':value val) - `(:value ,(pprint-to-string val) ,(assign-index val state))) - (x (to-string x)))) - content)) - -(df assign-index (obj (state ) => ) - (! add (@ parts state) obj) - (1- (! size (@ parts state)))) - -(df content-range (l start end) - (let* ((len (length l)) (end (min len end))) - (list (subseq l start end) len start end))) - -(df inspector-pop ((state ) vm) - (cond ((<= 2 (len (@ stack state))) - (let ((obj (cadr (@ stack state)))) - (set (@ stack state) (cddr (@ stack state))) - (inspect-object obj state vm))) - (#t 'nil))) - -;;;; IO redirection - -(define-simple-class () - (q :: #:init ( (as 100))) - ((*init*) (invoke-special (this) '*init*)) - ((write (buffer :: ) (from :: ) (to :: )) :: - (synchronized (this) - (assert (not (== q #!null))) - (! put q `(write ,( buffer from to))))) - ((close) :: - (synchronized (this) - (! put q 'close) - (set! q #!null))) - ((flush) :: - (synchronized (this) - (assert (not (== q #!null))) - (let ((ex ())) - (! put q `(flush ,ex)) - (! exchange ex #!null))))) - -(df swank-writer ((in ) (q )) - (! set-name (current-thread) "swank-redirect-thread") - (let* ((out (as (recv in))) - (builder ()) - (flush (fun () - (unless (zero? (! length builder)) - (send out `(forward (:write-string ,( builder)))) - (! setLength builder 0)))) - (closed #f)) - (while (not closed) - (mcase (! poll q (as long 200) (@s MILLISECONDS)) - ('#!null (flush)) - (('write s) - (! append builder (as s)) - (when (> (! length builder) 4000) - (flush))) - (('flush ex) - (flush) - (! exchange (as ex) #!null)) - ('close - (set closed #t) - (flush)))))) - -(df make-swank-outport ((out )) - (let ((w ())) - (mlet ((in . _) (spawn/chan (fun (c) (swank-writer c (@ q w))))) - (send in out)) - ( w #t #t))) - - -;;;; Monitor - -;;(define-simple-class () -;; (threadmap type: (tab))) - -(df vm-monitor ((c )) - (! set-name (current-thread) "swank-vm-monitor") - (let ((vm (vm-attach))) - (log-vm-props vm) - (request-breakpoint vm) - (mlet* (((ev . _) (spawn/chan/catch - (fun (c) - (let ((q (! eventQueue vm))) - (while #t - (send c `(vm-event ,(to-list (! remove q))))))))) - (to-string (vm-to-string vm)) - (state (tab))) - (send c `(publish-vm ,vm)) - (while #t - (mcase (recv* (list c ev)) - ((_ . ('get-vm cc)) - (send cc vm)) - ((,c . ('debug-info thread from to id)) - (reply c (debug-info thread from to state) id)) - ((,c . ('throw-to-toplevel thread id)) - (set state (throw-to-toplevel thread id c state))) - ((,c . ('thread-continue thread id)) - (set state (thread-continue thread id c state))) - ((,c . ('frame-src-loc thread frame id)) - (reply c (frame-src-loc thread frame state) id)) - ((,c . ('frame-details thread frame id)) - (reply c (list (frame-locals thread frame state) '()) id)) - ((,c . ('disassemble-frame thread frame id)) - (reply c (disassemble-frame thread frame state) id)) - ((,c . ('thread-frames thread from to id)) - (reply c (thread-frames thread from to state) id)) - ((,c . ('list-threads id)) - (reply c (list-threads vm state) id)) - ((,c . ('interrupt-thread ref)) - (set state (interrupt-thread ref state c))) - ((,c . ('debug-nth-thread n)) - (let ((t (nth (get state 'all-threads #f) n))) - ;;(log "thread ~d : ~a\n" n t) - (set state (interrupt-thread t state c)))) - ((,c . ('quit-thread-browser id)) - (reply c 't id) - (set state (del state 'all-threads))) - ((,ev . ('vm-event es)) - ;;(log "vm-events: len=~a\n" (len es)) - (for (((e :: ) (as es))) - (set state (process-vm-event e c state)))) - ((_ . ('get-exception from tid)) - (mlet ((_ _ es) (get state tid #f)) - (send from (let ((e (car es))) - (typecase e - ( (! exception e)) - ( e)))))) - ((_ . ('get-local rc tid frame var)) - (send rc (frame-local-var tid frame var state))) - ))))) - -(df reply ((c ) value id) - (send c `(forward (:return (:ok ,value) ,id)))) - -(df reply-abort ((c ) id) - (send c `(forward (:return (:abort nil) ,id)))) - -(df process-vm-event ((e ) (c ) state) - ;;(log "vm-event: ~s\n" e) - (typecase e - ( - ;;(log "exception: ~s\n" (! exception e)) - ;;(log "exception-message: ~s\n" - ;; (exception-message (vm-demirror *the-vm* (! exception e)))) - ;;(log "exception-location: ~s\n" (src-loc>str (! location e))) - ;;(log "exception-catch-location: ~s\n" (src-loc>str (! catch-location e))) - (cond ((! notifyUncaught (as - (! request e))) - (process-exception e c state)) - (#t - (let* ((t (! thread e)) - (r (! request e)) - (ex (! exception e))) - (unless (eq? *last-exception* ex) - (set *last-exception* ex) - (set *last-stacktrace* (copy-stack t))) - (! resume t)) - state))) - ( - (let* ((r (! request e)) - (k (! get-property r 'continuation))) - (! disable r) - (log "k: ~s\n" k) - (k e)) - state) - ( - (log "breakpoint event: ~a\n" e) - (debug-thread (! thread e) e state c)) - )) - -(df process-exception ((e ) (c ) state) - (let* ((tref (! thread e)) - (tid (! uniqueID tref)) - (s (get state tid #f))) - (mcase s - ('#f - ;; XXX redundant in debug-thread - (let* ((level 1) - (state (put state tid (list tref level (list e))))) - (send c `(forward (:debug ,tid ,level - ,@(debug-info tid 0 15 state)))) - (send c `(forward (:debug-activate ,tid ,level))) - state)) - ((_ level exs) - (send c `(forward (:debug-activate ,(! uniqueID tref) ,level))) - (put state tid (list tref (1+ level) (cons e exs))))))) - -(define-simple-class () - (loc :: ) - (args) - (names) - (values :: ) - (self) - ((*init* (loc :: ) args names (values :: ) self) - (set (@ loc (this)) loc) - (set (@ args (this)) args) - (set (@ names (this)) names) - (set (@ values (this)) values) - (set (@ self (this)) self)) - ((toString) :: - (format "#" (src-loc>str loc)))) - -(df copy-stack ((t )) - (packing (pack) - (iter (! frames t) - (fun ((f )) - (let ((vars (ignore-errors (! visibleVariables f)))) - (pack ( - (or (ignore-errors (! location f)) #!null) - (ignore-errors (! getArgumentValues f)) - (or vars #!null) - (or (and vars (ignore-errors (! get-values f vars))) - #!null) - (ignore-errors (! thisObject f))))))))) - -(define-simple-class () - (thread :: ) - ((*init* (thread :: )) (set (@ thread (this)) thread)) - ((request) :: #!null) - ((virtualMachine) :: (! virtualMachine thread))) - -(df break (#!optional condition) - ((breakpoint condition))) - -;; We set a breakpoint on this function. It returns a function which -;; specifies what the debuggee should do next (the actual return value -;; is set via JDI). Lets hope that the compiler doesn't optimize this -;; away. -(df breakpoint (condition => ) - (fun () #!null)) - -;; Enable breakpoints event on the breakpoint function. -(df request-breakpoint ((vm )) - (let* ((swank-classes (! classesByName vm "swank-kawa")) - (swank-classes-legacy (! classesByName vm "swank$Mnkawa")) - (class :: (1st (if (= (length swank-classes) 0) - swank-classes-legacy - swank-classes))) - (meth :: (1st (! methodsByName class "breakpoint"))) - (erm (! eventRequestManager vm)) - (req (! createBreakpointRequest erm (! location meth)))) - (! setSuspendPolicy req (@ SUSPEND_EVENT_THREAD req)) - (! put-property req 'swank #t) - (! put-property req 'argname "condition") - (! enable req))) - -(df log-vm-props ((vm )) - (letrec-syntax ((p (syntax-rules () - ((p name) (log "~s: ~s\n" 'name (! name vm))))) - (p* (syntax-rules () - ((p* n ...) (seq (p n) ...))))) - (p* canBeModified - canRedefineClasses - canAddMethod - canUnrestrictedlyRedefineClasses - canGetBytecodes - canGetConstantPool - canGetSyntheticAttribute - canGetSourceDebugExtension - canPopFrames - canForceEarlyReturn - canGetMethodReturnValues - canGetInstanceInfo - ))) - -;;;;; Debugger - -(df debug-thread ((tref ) (ev ) state (c )) - (unless (! is-suspended tref) - (! suspend tref)) - (let* ((id (! uniqueID tref)) - (level 1) - (state (put state id (list tref level (list ev))))) - (send c `(forward (:debug ,id ,level ,@(debug-info id 0 10 state)))) - (send c `(forward (:debug-activate ,id ,level))) - state)) - -(df interrupt-thread ((tref ) state (c )) - (debug-thread tref ( tref) state c)) - -(df debug-info ((tid ) (from ) to state) - (mlet ((thread-ref level evs) (get state tid #f)) - (let* ((tref (as thread-ref)) - (vm (! virtualMachine tref)) - (ev (as (car evs))) - (ex (typecase ev - ( (breakpoint-condition ev)) - ( (! exception ev)) - ( ( "Interrupt")))) - (desc (typecase ex - ( - ;;(log "ex: ~a ~a\n" ex (vm-demirror vm ex)) - (! toString (vm-demirror vm ex))) - ( (! toString ex)))) - (type (format " [type ~a]" - (typecase ex - ( (! name (! referenceType ex))) - ( (!! getName getClass ex))))) - (bt (thread-frames tid from to state))) - `((,desc ,type nil) (("quit" "terminate current thread")) ,bt ())))) - -(df breakpoint-condition ((e ) => ) - (let ((frame (! frame (! thread e) 0))) - (1st (! get-argument-values frame)))) - -(df thread-frames ((tid ) (from ) to state) - (mlet ((thread level evs) (get state tid #f)) - (let* ((thread (as thread)) - (fcount (! frameCount thread)) - (stacktrace (event-stacktrace (car evs))) - (missing (cond ((zero? (len stacktrace)) 0) - (#t (- (len stacktrace) fcount)))) - (fstart (max (- from missing) 0)) - (flen (max (- to from missing) 0)) - (frames (! frames thread fstart (min flen (- fcount fstart))))) - (packing (pack) - (let ((i from)) - (dotimes (_ (max (- missing from) 0)) - (pack (list i (format "~a" (stacktrace i)))) - (set i (1+ i))) - (iter frames (fun ((f )) - (let ((s (frame-to-string f))) - (pack (list i s)) - (set i (1+ i)))))))))) - -(df event-stacktrace ((ev )) - (let ((nothing (fun () ())) - (vm (! virtualMachine ev))) - (typecase ev - ( - (let ((condition (vm-demirror vm (breakpoint-condition ev)))) - (cond ((instance? condition ) - (throwable-stacktrace vm condition)) - (#t (nothing))))) - ( - (throwable-stacktrace vm (vm-demirror vm (! exception ev)))) - ( (nothing))))) - -(df throwable-stacktrace ((vm ) (ex )) - (cond ((== ex (ignore-errors (vm-demirror vm *last-exception*))) - *last-stacktrace*) - (#t - (! getStackTrace ex)))) - -(df frame-to-string ((f )) - (let ((loc (! location f)) - (vm (! virtualMachine f))) - (format "~a (~a)" (!! name method loc) - (call-with-abort - (fun () (format "~{~a~^ ~}" - (mapi (! getArgumentValues f) - (fun (arg) - (pprint-to-string - (vm-demirror vm arg)))))))))) - -(df frame-src-loc ((tid ) (n ) state) - (try-catch - (mlet* (((frame vm) (nth-frame tid n state)) - (vm (as vm))) - (src-loc>elisp - (typecase frame - ( (! location frame)) - ( (@ loc frame)) - ( - (let* ((classname (! getClassName frame)) - (classes (! classesByName vm classname)) - (t (as (1st classes)))) - (1st (! locationsOfLine t (! getLineNumber frame)))))))) - (ex - (let ((msg (! getMessage ex))) - `(:error ,(if (== msg #!null) - (! toString ex) - msg)))))) - -(df nth-frame ((tid ) (n ) state) - (mlet ((tref level evs) (get state tid #f)) - (let* ((thread (as tref)) - (fcount (! frameCount thread)) - (stacktrace (event-stacktrace (car evs))) - (missing (cond ((zero? (len stacktrace)) 0) - (#t (- (len stacktrace) fcount)))) - (vm (! virtualMachine thread)) - (frame (cond ((< n missing) - (stacktrace n)) - (#t (! frame thread (- n missing)))))) - (list frame vm)))) - -;;;;; Locals - -(df frame-locals ((tid ) (n ) state) - (mlet ((thread _ _) (get state tid #f)) - (let* ((thread (as thread)) - (vm (! virtualMachine thread)) - (p (fun (x) (pprint-to-string - (call-with-abort (fun () (vm-demirror vm x))))))) - (map (fun (x) - (mlet ((name value) x) - (list ':name name ':value (p value) ':id 0))) - (%frame-locals tid n state))))) - -(df frame-local-var ((tid ) (frame ) (var ) state => ) - (cadr (nth (%frame-locals tid frame state) var))) - -(df %frame-locals ((tid ) (n ) state) - (mlet ((frame _) (nth-frame tid n state)) - (typecase frame - ( - (let* ((visible (try-catch (! visibleVariables frame) - (ex - '()))) - (map (! getValues frame visible)) - (p (fun (x) x))) - (packing (pack) - (let ((self (ignore-errors (! thisObject frame)))) - (when self - (pack (list "this" (p self))))) - (iter (! entrySet map) - (fun ((e )) - (let ((var (as (! getKey e))) - (val (as (! getValue e)))) - (pack (list (! name var) (p val))))))))) - ( - (packing (pack) - (when (@ self frame) - (pack (list "this" (@ self frame)))) - (iter (! entrySet (@ values frame)) - (fun ((e )) - (let ((var (as (! getKey e))) - (val (as (! getValue e)))) - (pack (list (! name var) val))))))) - ( '())))) - -(df disassemble-frame ((tid ) (frame ) state) - (mlet ((frame _) (nth-frame tid frame state)) - (typecase frame - ( "") - ( - (let* ((l (! location frame)) - (m (! method l)) - (c (! declaringType l))) - (disassemble-to-string m)))))) - -;;;;; Restarts - -;; FIXME: factorize -(df throw-to-toplevel ((tid ) (id ) (c ) state) - (mlet ((tref level exc) (get state tid #f)) - (let* ((t (as tref)) - (ev (car exc))) - (typecase ev - ( ; actually uncaughtException - (! resume t) - (reply-abort c id) - ;;(send-debug-return c tid state) - (do ((level level (1- level)) - (exc exc (cdr exc))) - ((null? exc)) - (send c `(forward (:debug-return ,tid ,level nil)))) - (del state tid)) - ( - ;; XXX race condition? - (log "resume from from break (suspendCount: ~d)\n" (! suspendCount t)) - (let ((vm (! virtualMachine t)) - (k (fun () (primitive-throw ())))) - (reply-abort c id) - (! force-early-return t (vm-mirror vm k)) - (! resume t) - (do ((level level (1- level)) - (exc exc (cdr exc))) - ((null? exc)) - (send c `(forward (:debug-return ,tid ,level nil)))) - (del state tid))) - ( - (log "resume from from interrupt\n") - (let ((vm (! virtualMachine t))) - (! stop t (vm-mirror vm ())) - (! resume t) - (reply-abort c id) - (do ((level level (1- level)) - (exc exc (cdr exc))) - ((null? exc)) - (send c `(forward (:debug-return ,tid ,level nil)))) - (del state tid)) - ))))) - -(df thread-continue ((tid ) (id ) (c ) state) - (mlet ((tref level exc) (get state tid #f)) - (log "thread-continue: ~a ~a ~a \n" tref level exc) - (let* ((t (as tref))) - (! resume t)) - (reply-abort c id) - (do ((level level (1- level)) - (exc exc (cdr exc))) - ((null? exc)) - (send c `(forward (:debug-return ,tid ,level nil)))) - (del state tid))) - -(df thread-step ((t ) k) - (let* ((vm (! virtual-machine t)) - (erm (! eventRequestManager vm)) - ( ) - (req (! createStepRequest erm t - (@s STEP_MIN) - (@s STEP_OVER)))) - (! setSuspendPolicy req (@ SUSPEND_EVENT_THREAD req)) - (! addCountFilter req 1) - (! put-property req 'continuation k) - (! enable req))) - -(df eval-in-thread ((t ) sexp - #!optional (env :: (!s current))) - (let* ((vm (! virtualMachine t)) - (sc :: - (1st (! classes-by-name vm "kawa.standard.Scheme"))) - (ev :: - (1st (! methods-by-name sc "eval" - (cat "(Ljava/lang/Object;Lgnu/mapping/Environment;)" - "Ljava/lang/Object;"))))) - (! invokeMethod sc t ev (list sexp env) - (@s INVOKE_SINGLE_THREADED)))) - -;;;;; Threads - -(df list-threads (vm :: state) - (let* ((threads (! allThreads vm))) - (put state 'all-threads threads) - (packing (pack) - (pack '(\:id \:name \:status \:priority)) - (iter threads (fun ((t )) - (pack (list (! uniqueID t) - (! name t) - (let ((s (thread-status t))) - (if (! is-suspended t) - (cat "SUSPENDED/" s) - s)) - 0))))))) - -(df thread-status (t :: ) - (let ((s (! status t))) - (cond ((= s (@s THREAD_STATUS_UNKNOWN)) "UNKNOWN") - ((= s (@s THREAD_STATUS_ZOMBIE)) "ZOMBIE") - ((= s (@s THREAD_STATUS_RUNNING)) "RUNNING") - ((= s (@s THREAD_STATUS_SLEEPING)) "SLEEPING") - ((= s (@s THREAD_STATUS_MONITOR)) "MONITOR") - ((= s (@s THREAD_STATUS_WAIT)) "WAIT") - ((= s (@s THREAD_STATUS_NOT_STARTED)) "NOT_STARTED") - (#t "")))) - -;;;;; Bootstrap - -(df vm-attach (=> ) - (attach (getpid) 20)) - -(df attach (pid timeout) - (log "attaching: ~a ~a\n" pid timeout) - (let* (( ) - ( ) - (vmm (!s com.sun.jdi.Bootstrap virtualMachineManager)) - (pa (as - (or - (find-if (! attaching-connectors vmm) - (fun (x :: ) - (! equals (! name x) "com.sun.jdi.ProcessAttach")) - #f) - (error "ProcessAttach connector not found")))) - (args (! default-arguments pa))) - (! set-value (as (! get args (to-str "pid"))) pid) - (when timeout - (! set-value (as (! get args (to-str "timeout"))) timeout)) - (log "attaching2: ~a ~a\n" pa args) - (! attach pa args))) - -(df getpid () - (let ((p (make-process (command-parse "echo $PPID") #!null))) - (! waitFor p) - (! read-line ( ( (! get-input-stream p)))))) - -(df request-uncaught-exception-events ((vm )) - (let* ((erm (! eventRequestManager vm)) - (req (! createExceptionRequest erm #!null #f #t))) - (! setSuspendPolicy req (@ SUSPEND_EVENT_THREAD req)) - (! addThreadFilter req (vm-mirror vm (current-thread))) - (! enable req))) - - -(df request-caught-exception-events ((vm )) - (let* ((erm (! eventRequestManager vm)) - (req (! createExceptionRequest erm #!null #t #f))) - (! setSuspendPolicy req (@ SUSPEND_EVENT_THREAD req)) - (! addThreadFilter req (vm-mirror vm (current-thread))) - (! addClassExclusionFilter req "java.lang.ClassLoader") - (! addClassExclusionFilter req "java.net.URLClassLoader") - (! addClassExclusionFilter req "java.net.URLClassLoader$1") - (! enable req))) - -(df set-stacktrace-recording ((vm ) (flag )) - (for (((e :: ) - (!! exceptionRequests eventRequestManager vm))) - (when (! notify-caught e) - (! setEnabled e flag)))) - -;; (set-stacktrace-recording *the-vm* #f) - -(df vm-to-string ((vm )) - (let* ((obj (as (1st (! classesByName vm "java.lang.Object")))) - (met (as (1st (! methodsByName obj "toString"))))) - (fun ((o ) (t )) - (! value - (as - (! invokeMethod o t met '() - (@s INVOKE_SINGLE_THREADED))))))) - -(define-simple-class () - (var #:allocation 'static)) - -(define-variable *global-get-mirror* #!null) -(define-variable *global-set-mirror* #!null) -(define-variable *global-get-raw* #!null) -(define-variable *global-set-raw* #!null) - -(df init-global-field ((vm )) - (when (nul? *global-get-mirror*) - (set (@s var) #!null) ; prepare class - (let* ((swank-global-variable-classes - (! classes-by-name vm "swank-global-variable")) - (swank-global-variable-classes-legacy - (! classes-by-name vm "swank$Mnglobal$Mnvariable")) - (c (as - (1st (if (= (length swank-global-variable-classes) 0) - swank-global-variable-classes-legacy - swank-global-variable-classes)))) - (f (! fieldByName c "var"))) - (set *global-get-mirror* (fun () (! getValue c f))) - (set *global-set-mirror* (fun ((v )) (! setValue c f v)))) - (set *global-get-raw* (fun () '() (@s var))) - (set *global-set-raw* (fun (x) - (set (@s var) x))))) - -(df vm-mirror ((vm ) obj) - (synchronized vm - (init-global-field vm) - (*global-set-raw* obj) - (*global-get-mirror*))) - -(df vm-demirror ((vm ) (v )) - (synchronized vm - (if (== v #!null) - #!null - (typecase v - ( (init-global-field vm) - (*global-set-mirror* v) - (*global-get-raw*)) - ( (! value v)) - ( (! value v)) - ( (! value v)) - ( (! value v)) - ( (! value v)) - ( (! value v)) - ( (! value v)) - ( (! value v)))))) - -(df vm-set-slot ((vm ) (o ) (name ) value) - (let* ((o (as (vm-mirror vm o))) - (t (! reference-type o)) - (f (! field-by-name t name))) - (! set-value o f (vm-mirror vm value)))) - -(define-simple-class - () - (f :: ) - ((*init* (f :: )) (set (@ f (this)) f)) - ((uncaughtException (t :: ) (e :: )) - :: - (! println (@s java.lang.System err) (to-str "uhexc:::")) - (! apply2 f t e) - #!void)) - -;;;; Channels - -(df spawn (f) - (let ((thread ( (%%runnable f)))) - (! start thread) - thread)) - - -;; gnu.mapping.RunnableClosure uses the try{...}catch(Throwable){...} -;; idiom which defeats all attempts to use a break-on-error-style -;; debugger. Previously I had my own version of RunnableClosure -;; without that deficiency but something in upstream changed and it no -;; longer worked. Now we use the normal RunnableClosure and at the -;; cost of taking stack snapshots on every throw. -(df %%runnable (f => ) - ;;( f) - ;;( f) - ;;(runnable f) - (%runnable f) - ) - -(df %runnable (f => ) - (runnable - (fun () - (try-catch (f) - (ex - (log "exception in thread ~s: ~s" (current-thread) - ex) - (! printStackTrace ex)))))) - -(df chan () - (let ((lock ()) - (im ()) - (ex ())) - (set (@ lock im) lock) - (set (@ lock ex) lock) - (set (@ peer im) ex) - (set (@ peer ex) im) - (cons im ex))) - -(df immutable? (obj) - (or (== obj #!null) - (symbol? obj) - (number? obj) - (char? obj) - (instance? obj ) - (null? obj))) - -(df send ((c ) value => ) - (df pass (obj) - (cond ((immutable? obj) obj) - ((string? obj) (! to-string obj)) - ((pair? obj) - (let loop ((r (list (pass (car obj)))) - (o (cdr obj))) - (cond ((null? o) (reverse! r)) - ((pair? o) (loop (cons (pass (car o)) r) (cdr o))) - (#t (append (reverse! r) (pass o)))))) - ((instance? obj ) - (let ((o :: obj)) - (assert (== (@ owner o) (current-thread))) - (synchronized (@ lock c) - (set (@ owner o) (@ owner (@ peer c)))) - o)) - ((or (instance? obj ) - (instance? obj )) - ;; those can be shared, for pragmatic reasons - obj - ) - (#t (error "can't send" obj (class-name-sans-package obj))))) - ;;(log "send: ~s ~s -> ~s\n" value (@ owner c) (@ owner (@ peer c))) - (assert (== (@ owner c) (current-thread))) - ;;(log "lock: ~s send\n" (@ owner (@ peer c))) - (synchronized (@ owner (@ peer c)) - (! put (@ queue (@ peer c)) (pass value)) - (! notify (@ owner (@ peer c)))) - ;;(log "unlock: ~s send\n" (@ owner (@ peer c))) - ) - -(df recv ((c )) - (cdr (recv/timeout (list c) 0))) - -(df recv* ((cs )) - (recv/timeout cs 0)) - -(df recv/timeout ((cs ) (timeout )) - (let ((self (current-thread)) - (end (if (zero? timeout) - 0 - (+ (current-time) timeout)))) - ;;(log "lock: ~s recv\n" self) - (synchronized self - (let loop () - ;;(log "receive-loop: ~s\n" self) - (let ((ready (find-if cs - (fun ((c )) - (not (! is-empty (@ queue c)))) - #f))) - (cond (ready - ;;(log "unlock: ~s recv\n" self) - (cons ready (! take (@ queue (as ready))))) - ((zero? timeout) - ;;(log "wait: ~s recv\n" self) - (! wait self) (loop)) - (#t - (let ((now (current-time))) - (cond ((<= end now) - 'timeout) - (#t - ;;(log "wait: ~s recv\n" self) - (! wait self (- end now)) - (loop))))))))))) - -(df rpc ((c ) msg) - (mlet* (((im . ex) (chan)) - ((op . args) msg)) - (send c `(,op ,ex . ,args)) - (recv im))) - -(df spawn/chan (f) - (mlet ((im . ex) (chan)) - (let ((thread ( (%%runnable (fun () (f ex)))))) - (set (@ owner ex) thread) - (! start thread) - (cons im thread)))) - -(df spawn/chan/catch (f) - (spawn/chan - (fun (c) - (try-catch - (f c) - (ex - (send c `(error ,(! toString ex) - ,(class-name-sans-package ex) - ,(map (fun (e) (! to-string e)) - (array-to-list (! get-stack-trace ex)))))))))) - -;;;; Logging - -(define swank-log-port (current-error-port)) -(df log (fstr #!rest args) - (synchronized swank-log-port - (apply format swank-log-port fstr args) - (force-output swank-log-port)) - #!void) - -;;;; Random helpers - -(df 1+ (x) (+ x 1)) -(df 1- (x) (- x 1)) - -(df len (x => ) - (typecase x - ( (length x)) - ( (! length x)) - ( (string-length x)) - ( (vector-length x)) - ( (! size x)) - ( (@ length x)))) - -;;(df put (tab key value) (hash-table-set! tab key value) tab) -;;(df get (tab key default) (hash-table-ref/default tab key default)) -;;(df del (tab key) (hash-table-delete! tab key) tab) -;;(df tab () (make-hash-table)) - -(df put (tab key value) (hashtable-set! tab key value) tab) -(df get (tab key default) (hashtable-ref tab key default)) -(df del (tab key) (hashtable-delete! tab key) tab) -(df tab () (make-eqv-hashtable)) - -(df equal (x y => ) (equal? x y)) - -(df current-thread (=> ) (!s java.lang.Thread currentThread)) -(df current-time (=> ) (!s java.lang.System currentTimeMillis)) - -(df nul? (x) (== x #!null)) - -(df read-from-string (str) - (call-with-input-string str read)) - -;;(df print-to-string (obj) (call-with-output-string (fun (p) (write obj p)))) - -(df pprint-to-string (obj) - (let* ((w ()) - (p ( w #t #f))) - (try-catch (print-object obj p) - (ex - (format p "#" - ex (class-name-sans-package ex)))) - (! flush p) - (to-string (! getBuffer w)))) - -(df print-object (obj stream) - (typecase obj - #; - ((or (eql #!null) (eql #!eof) - ) - (write obj stream)) - (#t - #;(print-unreadable-object obj stream) - (write obj stream) - ))) - -(df print-unreadable-object ((o ) stream) - (let* ((string (! to-string o)) - (class (! get-class o)) - (name (! get-name class)) - (simplename (! get-simple-name class))) - (cond ((! starts-with string "#<") - (format stream "~a" string)) - ((or (! starts-with string name) - (! starts-with string simplename)) - (format stream "#<~a>" string)) - (#t - (format stream "#<~a ~a>" name string))))) - -(define cat string-append) - -(df values-to-list (values) - (typecase values - ( (array-to-list (! getValues values))) - ( (list values)))) - -;; (to-list (as-list (values 1 2 2))) - -(df array-to-list ((array ) => ) - (packing (pack) - (dotimes (i (@ length array)) - (pack (array i))))) - -(df lisp-bool (obj) - (cond ((== obj 'nil) #f) - ((== obj 't) #t) - (#t (error "Can't map lisp boolean" obj)))) - -(df path-sans-extension ((p path) => ) - (let ((ex (! get-extension p)) - (str (! to-string p))) - (to-string (cond ((not ex) str) - (#t (! substring str 0 (- (len str) (len ex) 1))))))) - -(df class-name-sans-package ((obj )) - (cond ((nul? obj) "<#!null>") - (#t - (try-catch - (let* ((c (! get-class obj)) - (n (! get-simple-name c))) - (cond ((equal n "") (! get-name c)) - (#t n))) - (e - (format "#<~a: ~a>" e (! get-message e))))))) - -(df list-env (#!optional (env :: (!s current))) - (let ((enum (! enumerateAllLocations env))) - (packing (pack) - (while (! hasMoreElements enum) - (pack (! nextLocation enum)))))) - -(df list-file (filename) - (with (port (call-with-input-file filename)) - (let* ((lang (!s gnu.expr.Language getDefaultLanguage)) - (messages ()) - (comp (! parse lang (as port) messages 0))) - (! get-module comp)))) - -(df list-decls (file) - (let* ((module (as (list-file file)))) - (do ((decl :: - (! firstDecl module) (! nextDecl decl))) - ((nul? decl)) - (format #t "~a ~a:~d:~d\n" decl - (! getFileName decl) - (! getLineNumber decl) - (! getColumnNumber decl) - )))) - -(df %time (f) - (define-alias ) - (define-alias ) - (let* ((gcs (!s getGarbageCollectorMXBeans)) - (mem (!s getMemoryMXBean)) - (jit (!s getCompilationMXBean)) - (oldjit (! getTotalCompilationTime jit)) - (oldgc (packing (pack) - (iter gcs (fun ((gc )) - (pack (cons gc - (list (! getCollectionCount gc) - (! getCollectionTime gc)))))))) - (heap (!! getUsed getHeapMemoryUsage mem)) - (nonheap (!! getUsed getNonHeapMemoryUsage mem)) - (start (!s java.lang.System nanoTime)) - (values (f)) - (end (!s java.lang.System nanoTime)) - (newheap (!! getUsed getHeapMemoryUsage mem)) - (newnonheap (!! getUsed getNonHeapMemoryUsage mem))) - (format #t "~&") - (let ((njit (! getTotalCompilationTime jit))) - (format #t "; JIT compilation: ~:d ms (~:d)\n" (- njit oldjit) njit)) - (iter gcs (fun ((gc )) - (mlet ((_ count time) (assoc gc oldgc)) - (format #t "; GC ~a: ~:d ms (~d)\n" - (! getName gc) - (- (! getCollectionTime gc) time) - (- (! getCollectionCount gc) count))))) - (format #t "; Heap: ~@:d (~:d)\n" (- newheap heap) newheap) - (format #t "; Non-Heap: ~@:d (~:d)\n" (- newnonheap nonheap) newnonheap) - (format #t "; Elapsed time: ~:d us\n" (/ (- end start) 1000)) - values)) - -(define-syntax time - (syntax-rules () - ((time form) - (%time (lambda () form))))) - -(df gc () - (let* ((mem (!s java.lang.management.ManagementFactory getMemoryMXBean)) - (oheap (!! getUsed getHeapMemoryUsage mem)) - (onheap (!! getUsed getNonHeapMemoryUsage mem)) - (_ (! gc mem)) - (heap (!! getUsed getHeapMemoryUsage mem)) - (nheap (!! getUsed getNonHeapMemoryUsage mem))) - (format #t "; heap: ~@:d (~:d) non-heap: ~@:d (~:d)\n" - (- heap oheap) heap (- onheap nheap) nheap))) - -(df room () - (let* ((pools (!s java.lang.management.ManagementFactory - getMemoryPoolMXBeans)) - (mem (!s java.lang.management.ManagementFactory getMemoryMXBean)) - (heap (!! getUsed getHeapMemoryUsage mem)) - (nheap (!! getUsed getNonHeapMemoryUsage mem))) - (iter pools (fun ((p )) - (format #t "~&; ~a~1,16t: ~10:d\n" - (! getName p) - (!! getUsed getUsage p)))) - (format #t "; Heap~1,16t: ~10:d\n" heap) - (format #t "; Non-Heap~1,16t: ~10:d\n" nheap))) - -;; (df javap (class #!key method signature) -;; (let* (( ) -;; (bytes -;; (typecase class -;; ( (read-bytes ( (to-str class)))) -;; ( class) -;; ( (read-class-file class)))) -;; (cdata ( ( bytes))) -;; (p ( -;; ( bytes) -;; (current-output-port) -;; ()))) -;; (cond (method -;; (dolist ((m ) -;; (array-to-list (! getMethods cdata))) -;; (when (and (equal (to-str method) (! getName m)) -;; (or (not signature) -;; (equal signature (! getInternalSig m)))) -;; (! printMethodSignature p m (! getAccess m)) -;; (! printExceptions p m) -;; (newline) -;; (! printVerboseHeader p m) -;; (! printcodeSequence p m)))) -;; (#t (p:print))) -;; (values))) - -(df read-bytes ((is ) => ) - (let ((os ())) - (let loop () - (let ((c (! read is))) - (cond ((= c -1)) - (#t (! write os c) (loop))))) - (! to-byte-array os))) - -(df read-class-file ((name ) => ) - (let ((f (cat (! replace (to-str name) (as #\.) (as #\/)) - ".class"))) - (mcase (find-file-in-path f (class-path)) - ('#f (ferror "Can't find classfile for ~s" name)) - ((:zip zipfile entry) - (let* ((z ( (as zipfile))) - (e (! getEntry z (as entry)))) - (read-bytes (! getInputStream z e)))) - ((:file s) (read-bytes ( (as s))))))) - -(df all-instances ((vm ) (classname )) - (mappend (fun ((c )) (to-list (! instances c (as long 9999)))) - (%all-subclasses vm classname))) - -(df %all-subclasses ((vm ) (classname )) - (mappend (fun ((c )) (cons c (to-list (! subclasses c)))) - (to-list (! classes-by-name vm classname)))) - -(df with-output-to-string (thunk => ) - (call-with-output-string - (fun (s) (parameterize ((current-output-port s)) (thunk))))) - -(df find-if ((i ) test default) - (let ((iter (! iterator i)) - (found #f)) - (while (and (not found) (! has-next iter)) - (let ((e (! next iter))) - (when (test e) - (set found #t) - (set default e)))) - default)) - -(df filter ((i ) test => ) - (packing (pack) - (for ((e i)) - (when (test e) - (pack e))))) - -(df iter ((i ) f) - (for ((e i)) (f e))) - -(df mapi ((i ) f => ) - (packing (pack) (for ((e i)) (pack (f e))))) - -(df nth ((i ) (n )) - (let ((iter (! iterator i))) - (dotimes (i n) - (! next iter)) - (! next iter))) - -(df 1st ((i )) (!! next iterator i)) - -(df to-list ((i ) => ) - (packing (pack) (for ((e i)) (pack e)))) - -(df as-list ((o ) => ) - (!s java.util.Arrays asList o)) - -(df mappend (f list) - (apply append (map f list))) - -(df subseq (s from to) - (typecase s - ( (apply list (! sub-list s from to))) - ( (apply vector (! sub-list s from to))) - ( (! substring s from to)) - ( (let* ((len (as (- to from))) - (t ( #:length len))) - (!s java.lang.System arraycopy s from t 0 len) - t)))) - -(df to-string (obj => ) - (typecase obj - ( ( obj)) - ((satisfies string?) obj) - ((satisfies symbol?) (symbol->string obj)) - ( ( obj)) - ( ( obj)) - (#t (error "Not a string designator" obj - (class-name-sans-package obj))))) - -(df to-str (obj => ) - (cond ((instance? obj ) obj) - ((string? obj) (! toString obj)) - ((symbol? obj) (! getName (as obj))) - (#t (error "Not a string designator" obj - (class-name-sans-package obj))))) - -)) - -;; Local Variables: -;; mode: goo -;; compile-command: "\ -;; rm -rf classes && \ -;; JAVA_OPTS=-Xss2M kawa --r7rs -d classes -C swank-kawa.scm && \ -;; jar cf swank-kawa.jar -C classes ." -;; End: diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-larceny.scm b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-larceny.scm deleted file mode 100644 index e4d730d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-larceny.scm +++ /dev/null @@ -1,176 +0,0 @@ -;; swank-larceny.scm --- Swank server for Larceny -;; -;; License: Public Domain -;; Author: Helmut Eller -;; -;; In a shell execute: -;; larceny -r6rs -program swank-larceny.scm -;; and then `M-x slime-connect' in Emacs. - -(library (swank os) - (export getpid make-server-socket accept local-port close-socket) - (import (rnrs) - (primitives foreign-procedure - ffi/handle->address - ffi/string->asciiz - sizeof:pointer - sizeof:int - %set-pointer - %get-int)) - - (define getpid (foreign-procedure "getpid" '() 'int)) - (define fork (foreign-procedure "fork" '() 'int)) - (define close (foreign-procedure "close" '(int) 'int)) - (define dup2 (foreign-procedure "dup2" '(int int) 'int)) - - (define bytevector-content-offset$ sizeof:pointer) - - (define execvp% (foreign-procedure "execvp" '(string boxed) 'int)) - (define (execvp file . args) - (let* ((nargs (length args)) - (argv (make-bytevector (* (+ nargs 1) - sizeof:pointer)))) - (do ((offset 0 (+ offset sizeof:pointer)) - (as args (cdr as))) - ((null? as)) - (%set-pointer argv - offset - (+ (ffi/handle->address (ffi/string->asciiz (car as))) - bytevector-content-offset$))) - (%set-pointer argv (* nargs sizeof:pointer) 0) - (execvp% file argv))) - - (define pipe% (foreign-procedure "pipe" '(boxed) 'int)) - (define (pipe) - (let ((array (make-bytevector (* sizeof:int 2)))) - (let ((r (pipe% array))) - (values r (%get-int array 0) (%get-int array sizeof:int))))) - - (define (fork/exec file . args) - (let ((pid (fork))) - (cond ((= pid 0) - (apply execvp file args)) - (#t pid)))) - - (define (start-process file . args) - (let-values (((r1 down-out down-in) (pipe)) - ((r2 up-out up-in) (pipe)) - ((r3 err-out err-in) (pipe))) - (assert (= 0 r1)) - (assert (= 0 r2)) - (assert (= 0 r3)) - (let ((pid (fork))) - (case pid - ((-1) - (error "Failed to fork a subprocess.")) - ((0) - (close up-out) - (close err-out) - (close down-in) - (dup2 down-out 0) - (dup2 up-in 1) - (dup2 err-in 2) - (apply execvp file args) - (exit 1)) - (else - (close down-out) - (close up-in) - (close err-in) - (list pid - (make-fd-io-stream up-out down-in) - (make-fd-io-stream err-out err-out))))))) - - (define (make-fd-io-stream in out) - (let ((write (lambda (bv start count) (fd-write out bv start count))) - (read (lambda (bv start count) (fd-read in bv start count))) - (closeit (lambda () (close in) (close out)))) - (make-custom-binary-input/output-port - "fd-stream" read write #f #f closeit))) - - (define write% (foreign-procedure "write" '(int ulong int) 'int)) - (define (fd-write fd bytevector start count) - (write% fd - (+ (ffi/handle->address bytevector) - bytevector-content-offset$ - start) - count)) - - (define read% (foreign-procedure "read" '(int ulong int) 'int)) - (define (fd-read fd bytevector start count) - ;;(printf "fd-read: ~a ~s ~a ~a\n" fd bytevector start count) - (read% fd - (+ (ffi/handle->address bytevector) - bytevector-content-offset$ - start) - count)) - - (define (make-server-socket port) - (let* ((args `("/bin/bash" "bash" - "-c" - ,(string-append - "netcat -s 127.0.0.1 -q 0 -l -v " - (if port - (string-append "-p " (number->string port)) - "")))) - (nc (apply start-process args)) - (err (transcoded-port (list-ref nc 2) - (make-transcoder (latin-1-codec)))) - (line (get-line err)) - (pos (last-index-of line '#\]))) - (cond (pos - (let* ((tail (substring line (+ pos 1) (string-length line))) - (port (get-datum (open-string-input-port tail)))) - (list (car nc) (cadr nc) err port))) - (#t (error "netcat failed: " line))))) - - (define (accept socket codec) - (let* ((line (get-line (caddr socket))) - (pos (last-index-of line #\]))) - (cond (pos - (close-port (caddr socket)) - (let ((stream (cadr socket))) - (let ((io (transcoded-port stream (make-transcoder codec)))) - (values io io)))) - (else (error "accept failed: " line))))) - - (define (local-port socket) - (list-ref socket 3)) - - (define (last-index-of str chr) - (let loop ((i (string-length str))) - (cond ((<= i 0) #f) - (#t (let ((i (- i 1))) - (cond ((char=? (string-ref str i) chr) - i) - (#t - (loop i)))))))) - - (define (close-socket socket) - ;;(close-port (cadr socket)) - #f - ) - - ) - -(library (swank sys) - (export implementation-name eval-in-interaction-environment) - (import (rnrs) - (primitives system-features - aeryn-evaluator)) - - (define (implementation-name) "larceny") - - ;; see $LARCENY/r6rsmode.sch: - ;; Larceny's ERR5RS and R6RS modes. - ;; Code names: - ;; Aeryn ERR5RS - ;; D'Argo R6RS-compatible - ;; Spanky R6RS-conforming (not yet implemented) - (define (eval-in-interaction-environment form) - (aeryn-evaluator form)) - - ) - -(import (rnrs) (rnrs eval) (larceny load)) -(load "swank-r6rs.scm") -(eval '(start-server #f) (environment '(swank))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-listener-hooks.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-listener-hooks.lisp deleted file mode 100644 index f289c90..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-listener-hooks.lisp +++ /dev/null @@ -1,91 +0,0 @@ -;;; swank-listener-hooks.lisp --- listener with special hooks -;; -;; Author: Alan Ruttenberg - -;; Provides *slime-repl-eval-hooks* special variable which -;; can be used for easy interception of SLIME REPL form evaluation -;; for purposes such as integration with application event loop. - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (swank-require :swank-repl)) - -(defvar *slime-repl-advance-history* nil - "In the dynamic scope of a single form typed at the repl, is set to nil to - prevent the repl from advancing the history - * ** *** etc.") - -(defvar *slime-repl-suppress-output* nil - "In the dynamic scope of a single form typed at the repl, is set to nil to - prevent the repl from printing the result of the evalation.") - -(defvar *slime-repl-eval-hook-pass* (gensym "PASS") - "Token to indicate that a repl hook declines to evaluate the form") - -(defvar *slime-repl-eval-hooks* nil - "A list of functions. When the repl is about to eval a form, first try running each of - these hooks. The first hook which returns a value which is not *slime-repl-eval-hook-pass* - is considered a replacement for calling eval. If there are no hooks, or all - pass, then eval is used.") - -(export '*slime-repl-eval-hooks*) - -(defslimefun repl-eval-hook-pass () - "call when repl hook declines to evaluate the form" - (throw *slime-repl-eval-hook-pass* *slime-repl-eval-hook-pass*)) - -(defslimefun repl-suppress-output () - "In the dynamic scope of a single form typed at the repl, call to - prevent the repl from printing the result of the evalation." - (setq *slime-repl-suppress-output* t)) - -(defslimefun repl-suppress-advance-history () - "In the dynamic scope of a single form typed at the repl, call to - prevent the repl from advancing the history - * ** *** etc." - (setq *slime-repl-advance-history* nil)) - -(defun %eval-region (string) - (with-input-from-string (stream string) - (let (- values) - (loop - (let ((form (read stream nil stream))) - (when (eq form stream) - (fresh-line) - (finish-output) - (return (values values -))) - (setq - form) - (if *slime-repl-eval-hooks* - (setq values (run-repl-eval-hooks form)) - (setq values (multiple-value-list (eval form)))) - (finish-output)))))) - -(defun run-repl-eval-hooks (form) - (loop for hook in *slime-repl-eval-hooks* - for res = (catch *slime-repl-eval-hook-pass* - (multiple-value-list (funcall hook form))) - until (not (eq res *slime-repl-eval-hook-pass*)) - finally (return - (if (eq res *slime-repl-eval-hook-pass*) - (multiple-value-list (eval form)) - res)))) - -(defun %listener-eval (string) - (clear-user-input) - (with-buffer-syntax () - (swank-repl::track-package - (lambda () - (let ((*slime-repl-suppress-output* :unset) - (*slime-repl-advance-history* :unset)) - (multiple-value-bind (values last-form) (%eval-region string) - (unless (or (and (eq values nil) (eq last-form nil)) - (eq *slime-repl-advance-history* nil)) - (setq *** ** ** * * (car values) - /// // // / / values)) - (setq +++ ++ ++ + + last-form) - (unless (eq *slime-repl-suppress-output* t) - (funcall swank-repl::*send-repl-results-function* values))))))) - nil) - -(setq swank-repl::*listener-eval-function* '%listener-eval) - -(provide :swank-listener-hooks) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-macrostep.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-macrostep.lisp deleted file mode 100644 index 7595e36..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-macrostep.lisp +++ /dev/null @@ -1,227 +0,0 @@ -;;; swank-macrostep.lisp -- fancy macro-expansion via macrostep.el -;; -;; Authors: Luis Oliveira -;; Jon Oddie -;; -;; License: Public Domain - -(defpackage swank-macrostep - (:use cl swank) - (:import-from swank - #:*macroexpand-printer-bindings* - #:with-buffer-syntax - #:with-bindings - #:to-string - #:macroexpand-all - #:compiler-macroexpand-1 - #:defslimefun - #:collect-macro-forms) - (:export #:macrostep-expand-1 - #:macro-form-p)) - -(in-package #:swank-macrostep) - -(defslimefun macrostep-expand-1 (string compiler-macros? context) - (with-buffer-syntax () - (let ((form (read-from-string string))) - (multiple-value-bind (expansion error-message) - (expand-form-once form compiler-macros? context) - (if error-message - `(:error ,error-message) - (multiple-value-bind (macros compiler-macros) - (collect-macro-forms-in-context expansion context) - (let* ((all-macros (append macros compiler-macros)) - (pretty-expansion (pprint-to-string expansion)) - (positions (collect-form-positions expansion - pretty-expansion - all-macros)) - (subform-info - (loop - for form in all-macros - for (start end) in positions - when (and start end) - collect (let ((op-name (to-string (first form))) - (op-type - (if (member form macros) - :macro - :compiler-macro))) - (list op-name - op-type - start))))) - `(:ok ,pretty-expansion ,subform-info)))))))) - -(defun expand-form-once (form compiler-macros? context) - (multiple-value-bind (expansion expanded?) - (macroexpand-1-in-context form context) - (if expanded? - (values expansion nil) - (if (not compiler-macros?) - (values nil "Not a macro form") - (multiple-value-bind (expansion expanded?) - (compiler-macroexpand-1 form) - (if expanded? - (values expansion nil) - (values nil "Not a macro or compiler-macro form"))))))) - -(defslimefun macro-form-p (string compiler-macros? context) - (with-buffer-syntax () - (let ((form - (handler-case - (read-from-string string) - (error (condition) - (unless (debug-on-swank-error) - (return-from macro-form-p - `(:error ,(format nil "Read error: ~A" condition)))))))) - `(:ok ,(macro-form-type form compiler-macros? context))))) - -(defun macro-form-type (form compiler-macros? context) - (cond - ((or (not (consp form)) - (not (symbolp (car form)))) - nil) - ((multiple-value-bind (expansion expanded?) - (macroexpand-1-in-context form context) - (declare (ignore expansion)) - expanded?) - :macro) - ((and compiler-macros? - (multiple-value-bind (expansion expanded?) - (compiler-macroexpand-1 form) - (declare (ignore expansion)) - expanded?)) - :compiler-macro) - (t - nil))) - - -;;;; Hacks to support macro-expansion within local context - -(defparameter *macrostep-tag* (gensym)) - -(defparameter *macrostep-placeholder* '*macrostep-placeholder*) - -(define-condition expansion-in-context-failed (simple-error) - ()) - -(defmacro throw-expansion (form &environment env) - (throw *macrostep-tag* (macroexpand-1 form env))) - -(defmacro throw-collected-macro-forms (form &environment env) - (throw *macrostep-tag* (collect-macro-forms form env))) - -(defun macroexpand-1-in-context (form context) - (handler-case - (macroexpand-and-catch - `(throw-expansion ,form) context) - (error () - (macroexpand-1 form)))) - -(defun collect-macro-forms-in-context (form context) - (handler-case - (macroexpand-and-catch - `(throw-collected-macro-forms ,form) context) - (error () - (collect-macro-forms form)))) - -(defun macroexpand-and-catch (form context) - (catch *macrostep-tag* - (macroexpand-all (enclose-form-in-context form context)) - (error 'expansion-in-context-failed))) - -(defun enclose-form-in-context (form context) - (with-buffer-syntax () - (destructuring-bind (prefix suffix) context - (let* ((placeholder-form - (read-from-string - (concatenate - 'string - prefix (prin1-to-string *macrostep-placeholder*) suffix))) - (substituted-form (subst form *macrostep-placeholder* - placeholder-form))) - (if (not (equal placeholder-form substituted-form)) - substituted-form - (error 'expansion-in-context-failed)))))) - - -;;;; Tracking Pretty Printer - -(defun marker-char-p (char) - (<= #xe000 (char-code char) #xe8ff)) - -(defun make-marker-char (id) - ;; using the private-use characters U+E000..U+F8FF as markers, so - ;; that's our upper limit for how many we can use. - (assert (<= 0 id #x8ff)) - (code-char (+ #xe000 id))) - -(defun marker-char-id (char) - (assert (marker-char-p char)) - (- (char-code char) #xe000)) - -(defparameter +whitespace+ (mapcar #'code-char '(9 13 10 32))) - -(defun whitespacep (char) - (member char +whitespace+)) - -(defun pprint-to-string (object &optional pprint-dispatch) - (let ((*print-pprint-dispatch* (or pprint-dispatch *print-pprint-dispatch*))) - (with-bindings *macroexpand-printer-bindings* - (to-string object)))) - -#-clisp -(defun collect-form-positions (expansion printed-expansion forms) - (loop for (start end) - in (collect-marker-positions - (pprint-to-string expansion (make-tracking-pprint-dispatch forms)) - (length forms)) - collect (when (and start end) - (list (find-non-whitespace-position printed-expansion start) - (find-non-whitespace-position printed-expansion end))))) - -;; The pprint-dispatch table constructed by -;; MAKE-TRACKING-PPRINT-DISPATCH causes an infinite loop and stack -;; overflow under CLISP version 2.49. Make the COLLECT-FORM-POSITIONS -;; entry point a no-op in thi case, so that basic macro-expansion will -;; still work (without detection of inner macro forms) -#+clisp -(defun collect-form-positions (expansion printed-expansion forms) - nil) - -(defun make-tracking-pprint-dispatch (forms) - (let ((original-table *print-pprint-dispatch*) - (table (copy-pprint-dispatch))) - (flet ((maybe-write-marker (position stream) - (when position - (write-char (make-marker-char position) stream)))) - (set-pprint-dispatch 'cons - (lambda (stream cons) - (let ((pos (position cons forms))) - (maybe-write-marker pos stream) - ;; delegate printing to the original table. - (funcall (pprint-dispatch cons original-table) - stream - cons) - (maybe-write-marker pos stream))) - most-positive-fixnum - table)) - table)) - -(defun collect-marker-positions (string position-count) - (let ((positions (make-array position-count :initial-element nil))) - (loop with p = 0 - for char across string - unless (whitespacep char) - do (if (marker-char-p char) - (push p (aref positions (marker-char-id char))) - (incf p))) - (map 'list #'reverse positions))) - -(defun find-non-whitespace-position (string position) - (loop with non-whitespace-position = -1 - for i from 0 and char across string - unless (whitespacep char) - do (incf non-whitespace-position) - until (eql non-whitespace-position position) - finally (return i))) - -(provide :swank-macrostep) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-media.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-media.lisp deleted file mode 100644 index 3d5ef7c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-media.lisp +++ /dev/null @@ -1,25 +0,0 @@ -;;; swank-media.lisp --- insert other media (images) -;; -;; Authors: Christophe Rhodes -;; -;; Licence: GPLv2 or later -;; - -(in-package :swank) - -;; this file is empty of functionality. The slime-media contrib -;; allows swank to return messages other than :write-string as repl -;; results; this is used in the R implementation of swank to display R -;; objects with graphical representations (such as trellis objects) as -;; image presentations in the swank repl. In R, this is done by -;; having a hook function for the preparation of the repl results, in -;; addition to the already-existing hook for sending the repl results -;; (*send-repl-results-function*, used by swank-presentations.lisp). -;; The swank-media.R contrib implementation defines a generic function -;; for use as this hook, along with methods for commonly-encountered -;; graphical R objects. (This strategy is harder in CL, where methods -;; can only be defined if their specializers already exist; in R's S3 -;; object system, methods are ordinary functions with a special naming -;; convention) - -(provide :swank-media) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-mit-scheme.scm b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-mit-scheme.scm deleted file mode 100644 index e7729ff..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-mit-scheme.scm +++ /dev/null @@ -1,870 +0,0 @@ -;;; swank-mit-scheme.scm --- SLIME server for MIT Scheme -;; -;; Copyright (C) 2008 Helmut Eller -;; -;; This file is licensed under the terms of the GNU General Public -;; License as distributed with Emacs (press C-h C-c for details). - -;;;; Installation: -#| - -1. You need MIT Scheme 9.2 - -2. The Emacs side needs some fiddling. I have the following in - my .emacs: - -(setq slime-lisp-implementations - '((mit-scheme ("mit-scheme") :init mit-scheme-init))) - -(defun mit-scheme-init (file encoding) - (format "%S\n\n" - `(begin - (load-option 'format) - (load-option 'sos) - (eval - '(create-package-from-description - (make-package-description '(swank) (list (list)) - (vector) (vector) (vector) false)) - (->environment '(package))) - (load ,(expand-file-name - ".../contrib/swank-mit-scheme.scm" ; <-- insert your path - slime-path) - (->environment '(swank))) - (eval '(start-swank ,file) (->environment '(swank)))))) - -(defun mit-scheme () - (interactive) - (slime 'mit-scheme)) - -(defun find-mit-scheme-package () - (save-excursion - (let ((case-fold-search t)) - (and (re-search-backward "^[;]+ package: \\((.+)\\).*$" nil t) - (match-string-no-properties 1))))) - -(setq slime-find-buffer-package-function 'find-mit-scheme-package) -(add-hook 'scheme-mode-hook (lambda () (slime-mode 1))) - - The `mit-scheme-init' function first loads the SOS and FORMAT - libraries, then creates a package "(swank)", and loads this file - into that package. Finally it starts the server. - - `find-mit-scheme-package' tries to figure out which package the - buffer belongs to, assuming that ";;; package: (FOO)" appears - somewhere in the file. Luckily, this assumption is true for many of - MIT Scheme's own files. Alternatively, you could add Emacs style - -*- slime-buffer-package: "(FOO)" -*- file variables. - -4. Start everything with `M-x mit-scheme'. - -|# - -;;; package: (swank) - -(if (< (car (get-subsystem-version "Release")) - '9) - (error "This file requires MIT Scheme Release 9")) - -(define (swank port) - (accept-connections (or port 4005) #f)) - -;; ### hardcoded port number for now. netcat-openbsd doesn't print -;; the listener port anymore. -(define (start-swank port-file) - (accept-connections 4055 port-file) - ) - -;;;; Networking - -(define (accept-connections port port-file) - (let ((sock (open-tcp-server-socket port (host-address-loopback)))) - (format #t "Listening on port: ~s~%" port) - (if port-file (write-port-file port port-file)) - (dynamic-wind - (lambda () #f) - (lambda () (serve (tcp-server-connection-accept sock #t #f))) - (lambda () (close-tcp-server-socket sock))))) - -(define (write-port-file portnumber filename) - (call-with-output-file filename (lambda (p) (write portnumber p)))) - -(define *top-level-restart* #f) -(define (serve socket) - (with-simple-restart - 'disconnect "Close connection." - (lambda () - (with-keyboard-interrupt-handler - (lambda () (main-loop socket)))))) - -(define (disconnect) - (format #t "Disconnecting ...~%") - (invoke-restart (find-restart 'disconnect))) - -(define (main-loop socket) - (do () (#f) - (with-simple-restart - 'abort "Return to SLIME top-level." - (lambda () - (fluid-let ((*top-level-restart* (find-restart 'abort))) - (dispatch (read-packet socket) socket 0)))))) - -(define (with-keyboard-interrupt-handler fun) - (define (set-^G-handler exp) - (eval `(vector-set! keyboard-interrupt-vector (char->ascii #\G) ,exp) - (->environment '(runtime interrupt-handler)))) - (dynamic-wind - (lambda () #f) - (lambda () - (set-^G-handler - `(lambda (char) (with-simple-restart - 'continue "Continue from interrupt." - (lambda () (error "Keyboard Interrupt."))))) - (fun)) - (lambda () - (set-^G-handler '^G-interrupt-handler)))) - - -;;;; Reading/Writing of SLIME packets - -(define (read-packet in) - "Read an S-expression from STREAM using the SLIME protocol." - (let* ((len (read-length in)) - (buffer (make-string len))) - (fill-buffer! in buffer) - (read-from-string buffer))) - -(define (write-packet message out) - (let* ((string (write-to-string message))) - (log-event "WRITE: [~a]~s~%" (string-length string) string) - (write-length (string-length string) out) - (write-string string out) - (flush-output out))) - -(define (fill-buffer! in buffer) - (read-string! buffer in)) - -(define (read-length in) - (if (eof-object? (peek-char in)) (disconnect)) - (do ((len 6 (1- len)) - (sum 0 (+ (* sum 16) (char->hex-digit (read-char in))))) - ((zero? len) sum))) - -(define (ldb size position integer) - "LoaD a Byte of SIZE bits at bit position POSITION from INTEGER." - (fix:and (fix:lsh integer (- position)) - (1- (fix:lsh 1 size)))) - -(define (write-length len out) - (do ((pos 20 (- pos 4))) - ((< pos 0)) - (write-hex-digit (ldb 4 pos len) out))) - -(define (write-hex-digit n out) - (write-char (hex-digit->char n) out)) - -(define (hex-digit->char n) - (digit->char n 16)) - -(define (char->hex-digit c) - (char->digit c 16)) - - -;;;; Event dispatching - -(define (dispatch request socket level) - (log-event "READ: ~s~%" request) - (case (car request) - ((:emacs-rex) (apply emacs-rex socket level (cdr request))))) - -(define (swank-package) - (or (name->package '(swank)) - (name->package '(user)))) - -(define *buffer-package* #f) -(define (find-buffer-package name) - (if (elisp-false? name) - #f - (let ((v (ignore-errors - (lambda () (name->package (read-from-string name)))))) - (and (package? v) v)))) - -(define swank-env (->environment (swank-package))) -(define (user-env buffer-package) - (cond ((string? buffer-package) - (let ((p (find-buffer-package buffer-package))) - (if (not p) (error "Invalid package name: " buffer-package)) - (package/environment p))) - (else (nearest-repl/environment)))) - -;; quote keywords -(define (hack-quotes list) - (map (lambda (x) - (cond ((symbol? x) `(quote ,x)) - (#t x))) - list)) - -(define (emacs-rex socket level sexp package thread id) - (let ((ok? #f) (result #f) (condition #f)) - (dynamic-wind - (lambda () #f) - (lambda () - (bind-condition-handler - (list condition-type:serious-condition) - (lambda (c) (set! condition c) (invoke-sldb socket (1+ level) c)) - (lambda () - (fluid-let ((*buffer-package* package)) - (set! result - (eval (cons* (car sexp) socket (hack-quotes (cdr sexp))) - swank-env)) - (set! ok? #t))))) - (lambda () - (write-packet `(:return - ,(if ok? `(:ok ,result) - `(:abort - ,(if condition - (format #f "~a" - (condition/type condition)) - ""))) - ,id) - socket))))) - -(define (swank:connection-info _) - (let ((p (environment->package (user-env #f)))) - `(:pid ,(unix/current-pid) - :package (:name ,(write-to-string (package/name p)) - :prompt ,(write-to-string (package/name p))) - :lisp-implementation - (:type "MIT Scheme" :version ,(get-subsystem-version-string "release")) - :encoding (:coding-systems ("iso-8859-1")) - ))) - -(define (swank:quit-lisp _) - (%exit)) - - -;;;; Evaluation - -(define (swank-repl:listener-eval socket string) - ;;(call-with-values (lambda () (eval-region string socket)) - ;; (lambda values `(:values . ,(map write-to-string values)))) - `(:values ,(write-to-string (eval-region string socket)))) - -(define (eval-region string socket) - (let ((sexp (read-from-string string))) - (if (eof-object? exp) - (values) - (with-output-to-repl socket - (lambda () (eval sexp (user-env *buffer-package*))))))) - -(define (with-output-to-repl socket fun) - (let ((p (make-port repl-port-type socket))) - (dynamic-wind - (lambda () #f) - (lambda () (with-output-to-port p fun)) - (lambda () (flush-output p))))) - -(define (swank:interactive-eval socket string) - ;;(call-with-values (lambda () (eval-region string)) format-for-echo-area) - (format-values (eval-region string socket)) - ) - -(define (format-values . values) - (if (null? values) - "; No value" - (with-string-output-port - (lambda (out) - (write-string "=> " out) - (do ((vs values (cdr vs))) ((null? vs)) - (write (car vs) out) - (if (not (null? (cdr vs))) - (write-string ", " out))))))) - -(define (swank:pprint-eval _ string) - (pprint-to-string (eval (read-from-string string) - (user-env *buffer-package*)))) - -(define (swank:interactive-eval-region socket string) - (format-values (eval-region string socket))) - -(define (swank:set-package _ package) - (set-repl/environment! (nearest-repl) - (->environment (read-from-string package))) - (let* ((p (environment->package (user-env #f))) - (n (write-to-string (package/name p)))) - (list n n))) - - -(define (repl-write-substring port string start end) - (cond ((< start end) - (write-packet `(:write-string ,(substring string start end)) - (port/state port)))) - (- end start)) - -(define (repl-write-char port char) - (write-packet `(:write-string ,(string char)) - (port/state port))) - -(define repl-port-type - (make-port-type `((write-substring ,repl-write-substring) - (write-char ,repl-write-char)) #f)) - -(define (swank-repl:create-repl socket . _) - (let* ((env (user-env #f)) - (name (format #f "~a" (package/name (environment->package env))))) - (list name name))) - - -;;;; Compilation - -(define (swank:compile-string-for-emacs _ string . x) - (apply - (lambda (errors seconds) - `(:compilation-result ,errors t ,seconds nil nil)) - (call-compiler - (lambda () - (let* ((sexps (snarf-string string)) - (env (user-env *buffer-package*)) - (scode (syntax `(begin ,@sexps) env)) - (compiled-expression (compile-scode scode #t))) - (scode-eval compiled-expression env)))))) - -(define (snarf-string string) - (with-input-from-string string - (lambda () - (let loop () - (let ((e (read))) - (if (eof-object? e) '() (cons e (loop)))))))) - -(define (call-compiler fun) - (let ((time #f)) - (with-timings fun - (lambda (run-time gc-time real-time) - (set! time real-time))) - (list 'nil (internal-time/ticks->seconds time)))) - -(define (swank:compiler-notes-for-emacs _) nil) - -(define (swank:compile-file-for-emacs socket file load?) - (apply - (lambda (errors seconds) - (list ':compilation-result errors 't seconds load? - (->namestring (pathname-name file)))) - (call-compiler - (lambda () (with-output-to-repl socket (lambda () (compile-file file))))))) - -(define (swank:load-file socket file) - (with-output-to-repl socket - (lambda () - (pprint-to-string - (load file (user-env *buffer-package*)))))) - -(define (swank:disassemble-form _ string) - (let ((sexp (let ((sexp (read-from-string string))) - (cond ((and (pair? sexp) (eq? (car sexp) 'quote)) - (cadr sexp)) - (#t sexp))))) - (with-output-to-string - (lambda () - (compiler:disassemble - (eval sexp (user-env *buffer-package*))))))) - -(define (swank:disassemble-symbol _ string) - (with-output-to-string - (lambda () - (compiler:disassemble - (eval (read-from-string string) - (user-env *buffer-package*)))))) - - -;;;; Macroexpansion - -(define (swank:swank-macroexpand-all _ string) - (with-output-to-string - (lambda () - (pp (syntax (read-from-string string) - (user-env *buffer-package*)))))) -(define swank:swank-macroexpand-1 swank:swank-macroexpand-all) -(define swank:swank-macroexpand swank:swank-macroexpand-all) - - -;;; Arglist - -(define (swank:operator-arglist socket name pack) - (let ((v (ignore-errors - (lambda () - (string-trim-right - (with-output-to-string - (lambda () - (carefully-pa - (eval (read-from-string name) (user-env pack)))))))))) - (if (condition? v) 'nil v))) - -(define (carefully-pa o) - (cond ((arity-dispatched-procedure? o) - ;; MIT Scheme crashes for (pa /) - (display "arity-dispatched-procedure")) - ((procedure? o) (pa o)) - (else (error "Not a procedure")))) - - -;;; Some unimplemented stuff. -(define (swank:buffer-first-change . _) nil) -(define (swank:filename-to-modulename . _) nil) -(define (swank:swank-require . _) nil) - -;; M-. is beyond my capabilities. -(define (swank:find-definitions-for-emacs . _) nil) - - -;;; Debugger - -(define-structure (sldb-state (conc-name sldb-state.)) condition restarts) - -(define *sldb-state* #f) -(define (invoke-sldb socket level condition) - (fluid-let ((*sldb-state* (make-sldb-state condition (bound-restarts)))) - (dynamic-wind - (lambda () #f) - (lambda () - (write-packet `(:debug 0 ,level ,@(sldb-info *sldb-state* 0 20)) - socket) - (sldb-loop level socket)) - (lambda () - (write-packet `(:debug-return 0 ,level nil) socket))))) - -(define (sldb-loop level socket) - (write-packet `(:debug-activate 0 ,level) socket) - (with-simple-restart - 'abort (format #f "Return to SLDB level ~a." level) - (lambda () (dispatch (read-packet socket) socket level))) - (sldb-loop level socket)) - -(define (sldb-info state start end) - (let ((c (sldb-state.condition state)) - (rs (sldb-state.restarts state))) - (list (list (condition/report-string c) - (format #f " [~a]" (%condition-type/name (condition/type c))) - nil) - (sldb-restarts rs) - (sldb-backtrace c start end) - ;;'((0 "dummy frame")) - '()))) - -(define %condition-type/name - (eval '%condition-type/name (->environment '(runtime error-handler)))) - -(define (sldb-restarts restarts) - (map (lambda (r) - (list (symbol->string (restart/name r)) - (with-string-output-port - (lambda (p) (write-restart-report r p))))) - restarts)) - -(define (swank:throw-to-toplevel . _) - (invoke-restart *top-level-restart*)) - -(define (swank:sldb-abort . _) - (abort (sldb-state.restarts *sldb-state*))) - -(define (swank:sldb-continue . _) - (continue (sldb-state.restarts *sldb-state*))) - -(define (swank:invoke-nth-restart-for-emacs _ _sldb-level n) - (invoke-restart (list-ref (sldb-state.restarts *sldb-state*) n))) - -(define (swank:debugger-info-for-emacs _ from to) - (sldb-info *sldb-state* from to)) - -(define (swank:backtrace _ from to) - (sldb-backtrace (sldb-state.condition *sldb-state*) from to)) - -(define (sldb-backtrace condition from to) - (sldb-backtrace-aux (condition/continuation condition) from to)) - -(define (sldb-backtrace-aux k from to) - (let ((l (map frame>string (substream (continuation>frames k) from to)))) - (let loop ((i from) (l l)) - (if (null? l) - '() - (cons (list i (car l)) (loop (1+ i) (cdr l))))))) - -;; Stack parser fails for this: -;; (map (lambda (x) x) "/tmp/x.x") - -(define (continuation>frames k) - (let loop ((frame (continuation->stack-frame k))) - (cond ((not frame) (stream)) - (else - (let ((next (ignore-errors - (lambda () (stack-frame/next-subproblem frame))))) - (cons-stream frame - (if (condition? next) - (stream next) - (loop next)))))))) - -(define (frame>string frame) - (if (condition? frame) - (format #f "Bogus frame: ~a ~a" frame - (condition/report-string frame)) - (with-string-output-port (lambda (p) (print-frame frame p))))) - -(define (print-frame frame port) - (define (invalid-subexpression? subexpression) - (or (debugging-info/undefined-expression? subexpression) - (debugging-info/unknown-expression? subexpression))) - (define (invalid-expression? expression) - (or (debugging-info/undefined-expression? expression) - (debugging-info/compiled-code? expression))) - (with-values (lambda () (stack-frame/debugging-info frame)) - (lambda (expression environment subexpression) - (cond ((debugging-info/compiled-code? expression) - (write-string ";unknown compiled code" port)) - ((not (debugging-info/undefined-expression? expression)) - (fluid-let ((*unparse-primitives-by-name?* #t)) - (write - (unsyntax (if (invalid-subexpression? subexpression) - expression - subexpression)) - port))) - ((debugging-info/noise? expression) - (write-string ";" port) - (write-string ((debugging-info/noise expression) #f) - port)) - (else - (write-string ";undefined expression" port)))))) - -(define (substream s from to) - (let loop ((i 0) (l '()) (s s)) - (cond ((or (= i to) (stream-null? s)) (reverse l)) - ((< i from) (loop (1+ i) l (stream-cdr s))) - (else (loop (1+ i) (cons (stream-car s) l) (stream-cdr s)))))) - -(define (swank:frame-locals-and-catch-tags _ frame) - (list (map frame-var>elisp (frame-vars (sldb-get-frame frame))) - '())) - -(define (frame-vars frame) - (with-values (lambda () (stack-frame/debugging-info frame)) - (lambda (expression environment subexpression) - (cond ((environment? environment) - (environment>frame-vars environment)) - (else '()))))) - -(define (environment>frame-vars environment) - (let loop ((e environment)) - (cond ((environment->package e) '()) - (else (append (environment-bindings e) - (if (environment-has-parent? e) - (loop (environment-parent e)) - '())))))) - -(define (frame-var>elisp b) - (list ':name (write-to-string (car b)) - ':value (cond ((null? (cdr b)) "{unavailable}") - (else (>line (cadr b)))) - ':id 0)) - -(define (sldb-get-frame index) - (stream-ref (continuation>frames - (condition/continuation - (sldb-state.condition *sldb-state*))) - index)) - -(define (frame-var-value frame var) - (let ((binding (list-ref (frame-vars frame) var))) - (cond ((cdr binding) (cadr binding)) - (else unspecific)))) - -(define (swank:inspect-frame-var _ frame var) - (reset-inspector) - (inspect-object (frame-var-value (sldb-get-frame frame) var))) - - -;;;; Completion - -(define (swank:simple-completions _ string package) - (let ((strings (all-completions string (user-env package) string-prefix?))) - (list (sort strings stringstring (environment-names env)))) - (keep-matching-items ss (lambda (s) (match? pattern s))))) - -;; symbol->string is too slow -(define %symbol->string symbol-name) - -(define (environment-names env) - (append (environment-bound-names env) - (if (environment-has-parent? env) - (environment-names (environment-parent env)) - '()))) - -(define (longest-common-prefix strings) - (define (common-prefix s1 s2) - (substring s1 0 (string-match-forward s1 s2))) - (reduce common-prefix "" strings)) - - -;;;; Apropos - -(define (swank:apropos-list-for-emacs _ name #!optional - external-only case-sensitive package) - (let* ((pkg (and (string? package) - (find-package (read-from-string package)))) - (parent (and (not (default-object? external-only)) - (elisp-false? external-only))) - (ss (append-map (lambda (p) - (map (lambda (s) (cons p s)) - (apropos-list name p (and pkg parent)))) - (if pkg (list pkg) (all-packages)))) - (ss (sublist ss 0 (min (length ss) 200)))) - (map (lambda (e) - (let ((p (car e)) (s (cdr e))) - (list ':designator (format #f "~a ~a" s (package/name p)) - ':variable (>line - (ignore-errors - (lambda () (package-lookup p s))))))) - ss))) - -(define (swank:list-all-package-names . _) - (map (lambda (p) (write-to-string (package/name p))) - (all-packages))) - -(define (all-packages) - (define (package-and-children package) - (append (list package) - (append-map package-and-children (package/children package)))) - (package-and-children system-global-package)) - - -;;;; Inspector - -(define-structure (inspector-state (conc-name istate.)) - object parts next previous content) - -(define istate #f) - -(define (reset-inspector) - (set! istate #f)) - -(define (swank:init-inspector _ string) - (reset-inspector) - (inspect-object (eval (read-from-string string) - (user-env *buffer-package*)))) - -(define (inspect-object o) - (let ((previous istate) - (content (inspect o)) - (parts (make-eqv-hash-table))) - (set! istate (make-inspector-state o parts #f previous content)) - (if previous (set-istate.next! previous istate)) - (istate>elisp istate))) - -(define (istate>elisp istate) - (list ':title (>line (istate.object istate)) - ':id (assign-index (istate.object istate) (istate.parts istate)) - ':content (prepare-range (istate.parts istate) - (istate.content istate) - 0 500))) - -(define (assign-index o parts) - (let ((i (hash-table/count parts))) - (hash-table/put! parts i o) - i)) - -(define (prepare-range parts content from to) - (let* ((cs (substream content from to)) - (ps (prepare-parts cs parts))) - (list ps - (if (< (length cs) (- to from)) - (+ from (length cs)) - (+ to 1000)) - from to))) - -(define (prepare-parts ps parts) - (define (line label value) - `(,(format #f "~a: " label) - (:value ,(>line value) ,(assign-index value parts)) - "\n")) - (append-map (lambda (p) - (cond ((string? p) (list p)) - ((symbol? p) (list (symbol->string p))) - (#t - (case (car p) - ((line) (apply line (cdr p))) - (else (error "Invalid part:" p)))))) - ps)) - -(define (swank:inspect-nth-part _ index) - (inspect-object (hash-table/get (istate.parts istate) index 'no-such-part))) - -(define (swank:quit-inspector _) - (reset-inspector)) - -(define (swank:inspector-pop _) - (cond ((istate.previous istate) - (set! istate (istate.previous istate)) - (istate>elisp istate)) - (else 'nil))) - -(define (swank:inspector-next _) - (cond ((istate.next istate) - (set! istate (istate.next istate)) - (istate>elisp istate)) - (else 'nil))) - -(define (swank:inspector-range _ from to) - (prepare-range (istate.parts istate) - (istate.content istate) - from to)) - -(define-syntax stream* - (syntax-rules () - ((stream* tail) tail) - ((stream* e1 e2 ...) (cons-stream e1 (stream* e2 ...))))) - -(define (iline label value) `(line ,label ,value)) - -(define-generic inspect (o)) - -(define-method inspect ((o )) - (cond ((environment? o) (inspect-environment o)) - ((vector? o) (inspect-vector o)) - ((procedure? o) (inspect-procedure o)) - ((compiled-code-block? o) (inspect-code-block o)) - ;;((system-pair? o) (inspect-system-pair o)) - ((probably-scode? o) (inspect-scode o)) - (else (inspect-fallback o)))) - -(define (inspect-fallback o) - (let* ((class (object-class o)) - (slots (class-slots class))) - (stream* - (iline "Class" class) - (let loop ((slots slots)) - (cond ((null? slots) (stream)) - (else - (let ((n (slot-name (car slots)))) - (stream* (iline n (slot-value o n)) - (loop (cdr slots)))))))))) - -(define-method inspect ((o )) - (if (or (pair? (cdr o)) (null? (cdr o))) - (inspect-list o) - (inspect-cons o))) - -(define (inspect-cons o) - (stream (iline "car" (car o)) - (iline "cdr" (cdr o)))) - -(define (inspect-list o) - (let loop ((i 0) (o o)) - (cond ((null? o) (stream)) - ((or (pair? (cdr o)) (null? (cdr o))) - (stream* (iline i (car o)) - (loop (1+ i) (cdr o)))) - (else - (stream (iline i (car o)) - (iline "tail" (cdr o))))))) - -(define (inspect-environment o) - (stream* - (iline "(package)" (environment->package o)) - (let loop ((bs (environment-bindings o))) - (cond ((null? bs) - (if (environment-has-parent? o) - (stream (iline "()" (environment-parent o))) - (stream))) - (else - (let* ((b (car bs)) (s (car b))) - (cond ((null? (cdr b)) - (stream* s " {" (environment-reference-type o s) "}\n" - (loop (cdr bs)))) - (else - (stream* (iline s (cadr b)) - (loop (cdr bs))))))))))) - -(define (inspect-vector o) - (let ((len (vector-length o))) - (let loop ((i 0)) - (cond ((= i len) (stream)) - (else (stream* (iline i (vector-ref o i)) - (loop (1+ i)))))))) - -(define (inspect-procedure o) - (cond ((primitive-procedure? o) - (stream (iline "name" (primitive-procedure-name o)) - (iline "arity" (primitive-procedure-arity o)) - (iline "doc" (primitive-procedure-documentation o)))) - ((compound-procedure? o) - (stream (iline "arity" (procedure-arity o)) - (iline "lambda" (procedure-lambda o)) - (iline "env" (ignore-errors - (lambda () (procedure-environment o)))))) - (else - (stream - (iline "block" (compiled-entry/block o)) - (with-output-to-string (lambda () (compiler:disassemble o))))))) - -(define (inspect-code-block o) - (stream-append - (let loop ((i (compiled-code-block/constants-start o))) - (cond ((>= i (compiled-code-block/constants-end o)) (stream)) - (else - (stream* - (iline i (system-vector-ref o i)) - (loop (+ i compiled-code-block/bytes-per-object)))))) - (stream (iline "debuginfo" (compiled-code-block/debugging-info o)) - (iline "env" (compiled-code-block/environment o)) - (with-output-to-string (lambda () (compiler:disassemble o)))))) - -(define (inspect-scode o) - (stream (pprint-to-string o))) - -(define (probably-scode? o) - (define tests (list access? assignment? combination? comment? - conditional? definition? delay? disjunction? lambda? - quotation? sequence? the-environment? variable?)) - (let loop ((tests tests)) - (cond ((null? tests) #f) - (((car tests) o)) - (else (loop (cdr tests)))))) - -(define (inspect-system-pair o) - (stream (iline "car" (system-pair-car o)) - (iline "cdr" (system-pair-cdr o)))) - - -;;;; Auxilary functions - -(define nil '()) -(define t 't) -(define (elisp-false? o) (member o '(nil ()))) -(define (elisp-true? o) (not (elisp-false? o))) -(define (>line o) - (let ((r (write-to-string o 100))) - (cond ((not (car r)) (cdr r)) - (else (string-append (cdr r) " .."))))) -;; Must compile >line otherwise we can't write unassigend-reference-traps. -(set! >line (compile-procedure >line)) -(define (read-from-string s) (with-input-from-string s read)) -(define (pprint-to-string o) - (with-string-output-port - (lambda (p) - (fluid-let ((*unparser-list-breadth-limit* 10) - (*unparser-list-depth-limit* 4) - (*unparser-string-length-limit* 100)) - (pp o p))))) -;(define (1+ n) (+ n 1)) -(define (1- n) (- n 1)) -(define (package-lookup package name) - (let ((p (if (package? package) package (find-package package)))) - (environment-lookup (package/environment p) name))) -(define log-port (current-output-port)) -(define (log-event fstring . args) - ;;(apply format log-port fstring args) - #f - ) - -;;; swank-mit-scheme.scm ends here diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-mlworks.sml b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-mlworks.sml deleted file mode 100644 index 3efac53..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-mlworks.sml +++ /dev/null @@ -1,348 +0,0 @@ -(* swank-mlworks.sml -- SWANK server for MLWorks - * - * This code has been placed in the Public Domain. - *) - -(* This is an experiment to see how the interfaces/modules would look - * in a language with a supposedly "good" module system. - * - * MLWorks is probably the only SML implementation that tries to - * support "interactive programming". Since MLWorks wasn't maintained - * the last 15 or so years, big chunks of the SML Basis Library are - * missing or not the way as required by the standard. That makes it - * rather hard to do anything; it also shows that MLWorks hasn't been - * "used in anger" for a long time. - *) - -structure Swank = struct - - structure Util = struct - fun utf8ToString (v:Word8Vector.vector) : string = Byte.bytesToString v - fun stringToUtf8 s = Byte.stringToBytes s - end - - structure Map = struct - datatype ('a, 'b) map = Alist of {list: ('a * 'b) list ref, - eq: ('a * 'a) -> bool} - - fun stringMap () = - Alist {list = ref [], - eq = (fn (x:string,y:string) => x = y)} - - - fun lookup (Alist {list, eq}, key) = - let fun search [] = NONE - | search ((key', value) :: xs) = - if eq (key', key) then SOME value - else search xs - in search (!list) - end - - fun put (Alist {list, eq}, key, value) = - let val l = (key, value) :: (!list) - in list := l - end - - end - - structure CharBuffer = struct - local - structure C = CharArray - datatype buffer = B of {array : C.array ref, - index: int ref} - in - - fun new hint = B {array = ref (C.array (hint, #"\000")), - index = ref 0} - - fun append (buffer as B {array, index}, char) = - let val a = !array - val i = !index - val len = C.length a - in if i < len then - (C.update (a, i, char); - index := i + 1; - ()) - else let val aa = C.array (2 * len, #"\000") - fun copy (src, dst) = - let val len = C.length src - fun loop i = - if i = len then () - else (C.update (dst, i, C.sub (src, i)); - loop (i + 1)) - in loop 0 end - in copy (a, aa); - C.update (aa, i, char); - array := aa; - index := i + 1; - () - end - end - - fun toString (B {array, index}) = - let val a = !array - val i = !index - in CharVector.tabulate (i, fn i => C.sub (a, i)) end - - end - - end - - - structure Sexp = struct - structure Type = struct - datatype sexp = Int of int - | Str of string - | Lst of sexp list - | Sym of string - | QSym of string * string - | T - | Nil - | Quote - end - open Type - - exception ReadError - - fun fromUtf8 v = - let val len = Word8Vector.length v - val index = ref 0 - fun getc () = - case getc' () of - SOME c => c - | NONE => raise ReadError - and getc' () = - let val i = !index - in if i = len then NONE - else (index := i + 1; - SOME (Byte.byteToChar (Word8Vector.sub (v, i)))) - end - and ungetc () = index := !index - 1 - and sexp () : sexp = - case getc () of - #"\"" => string (CharBuffer.new 100) - | #"(" => lst () - | #"'" => Lst [Quote, sexp ()] - | _ => (ungetc(); token ()) - and string buf : sexp = - case getc () of - #"\"" => Str (CharBuffer.toString buf) - | #"\\" => (CharBuffer.append (buf, getc ()); string buf) - | c => (CharBuffer.append (buf, c); string buf) - and lst () = - let val x = sexp () - in case getc () of - #")" => Lst [x] - | #" " => let val Lst y = lst () in Lst (x :: y) end - | _ => raise ReadError - end - and token () = - let val tok = token' (CharBuffer.new 50) - val c0 = String.sub (tok, 0) - in if Char.isDigit c0 then (case Int.fromString tok of - SOME i => Int i - | NONE => raise ReadError) - else - Sym (tok) - end - and token' buf : string = - case getc' () of - NONE => CharBuffer.toString buf - | SOME #"\\" => (CharBuffer.append (buf, getc ()); - token' buf) - | SOME #" " => (ungetc (); CharBuffer.toString buf) - | SOME #")" => (ungetc (); CharBuffer.toString buf) - | SOME c => (CharBuffer.append (buf, c); token' buf) - in - sexp () - end - - fun toString sexp = - case sexp of - (Str s) => "\"" ^ String.toCString s ^ "\"" - | (Lst []) => "nil" - | (Lst xs) => "(" ^ String.concatWith " " (map toString xs) ^ ")" - | Sym (name) => name - | QSym (pkg, name) => pkg ^ ":" ^ name - | Quote => "quote" - | T => "t" - | Nil => "nil" - | Int i => Int.toString i - - fun toUtf8 sexp = Util.stringToUtf8 (toString sexp) - end - - structure Net = struct - local - structure S = Socket - structure I = INetSock - structure W = Word8Vector - - fun createSocket (port) = - let val sock : S.passive I.stream_sock = I.TCP.socket () - val SOME localhost = NetHostDB.fromString "127.0.0.1" - in - S.Ctl.setREUSEADDR (sock, true); - S.bind (sock, I.toAddr (localhost, port)); - S.listen (sock, 2); - sock - end - - fun addrToString sockAddr = - let val (ip, port) = I.fromAddr sockAddr - in NetHostDB.toString ip ^ ":" ^ Int.toString port - end - - exception ShortRead of W.vector - exception InvalidHexString of string - in - - fun acceptConnection port = - let val sock = createSocket port - val addr = S.Ctl.getSockName sock - val _ = print ("Listening on: " ^ addrToString addr ^ "\n") - val (peer, addr) = S.accept sock - in - S.close sock; - print ("Connection from: " ^ addrToString addr ^ "\n"); - peer - end - - fun receivePacket socket = - let val v = S.recvVec (socket, 6) - val _ = if W.length v = 6 then () - else raise ShortRead v - val s = Util.utf8ToString v - val _ = print ("s = " ^ s ^ "\n") - val len = - case StringCvt.scanString (Int.scan StringCvt.HEX) s of - SOME len => len - | NONE => raise InvalidHexString s - val _ = print ("len = " ^ Int.toString len ^ "\n") - val payload = S.recvVec (socket, len) - val plen = W.length payload - val _ = print ("plen = " ^ Int.toString plen ^ "\n") - val _ = if plen = len then () - else raise ShortRead payload - in - payload - end - - fun nibbleToHex i:string = Int.fmt StringCvt.HEX i - - fun loadNibble i pos = - Word32.toInt (Word32.andb (Word32.>> (Word32.fromInt i, - Word.fromInt (pos * 4)), - 0wxf)) - - fun hexDigit i pos = nibbleToHex (loadNibble i pos) - - fun lenToHex i = - concat [hexDigit i 5, - hexDigit i 4, - hexDigit i 3, - hexDigit i 2, - hexDigit i 1, - hexDigit i 0] - - fun sendPacket (payload:W.vector, socket) = - let val len = W.length payload - val header = Util.stringToUtf8 (lenToHex len) - val packet = W.concat [header, payload] - in print ("len = " ^ Int.toString len ^ "\n" - ^ "header = " ^ lenToHex len ^ "\n" - ^ "paylad = " ^ Util.utf8ToString payload ^ "\n"); - S.sendVec (socket, {buf = packet, i = 0, sz = NONE}) - end - - end - end - - structure Rpc = struct - open Sexp.Type - - val funTable : (string, sexp list -> sexp) Map.map - = Map.stringMap () - - fun define name f = Map.put (funTable, name, f) - - exception UnknownFunction of string - fun call (name, args) = - (print ("call: " ^ name ^ "\n"); - case Map.lookup (funTable, name) of - SOME f => f args - | NONE => raise UnknownFunction name) - - - local fun getpid () = - Word32.toInt (Posix.Process.pidToWord (Posix.ProcEnv.getpid ())) - in - fun connectionInfo [] = - Lst [Sym ":pid", Int (getpid ()), - Sym ":lisp-implementation", Lst [Sym ":type", Str "MLWorks", - Sym ":name", Str "mlworks", - Sym ":version", Str "2.x"], - Sym ":machine", Lst [Sym ":instance", Str "", - Sym ":type", Str "", - Sym ":version", Str ""], - Sym ":features", Nil, - Sym ":package", Lst [Sym ":name", Str "root", - Sym ":prompt", Str "-"]] - end - - fun nyi _ = Nil - - local structure D = Shell.Dynamic - in - fun interactiveEval [Str string] = - let val x = D.eval string - in Str (concat [D.printValue x, " : ", D.printType (D.getType x)]) - end - end - - val _ = - (define "swank:connection-info" connectionInfo; - define "swank:swank-require" nyi; - define "swank:interactive-eval" interactiveEval; - ()) - end - - structure EventLoop = struct - open Sexp.Type - - fun execute (sexp, pkg) = - (print ("sexp = " ^ (Sexp.toString sexp) ^ "\n"); - case sexp of - Lst (Sym name :: args) => Rpc.call (name, args)) - - fun emacsRex (sexp, pkg, id as Int _, sock) = - let val result = (Lst [Sym (":ok"), execute (sexp, pkg)] - handle exn => (Lst [Sym ":abort", - Str (exnName exn ^ ": " - ^ exnMessage exn)])) - val reply = Lst [Sym ":return", result, id] - in Net.sendPacket (Sexp.toUtf8 reply, sock) - end - - fun dispatch (Lst ((Sym key) :: args), sock) = - case key of - ":emacs-rex" => let val [sexp, pkg, _, id] = args - in emacsRex (sexp, pkg, id, sock) - end - - fun processRequests socket:unit = - let val sexp = Sexp.fromUtf8 (Net.receivePacket socket) - in print ("request: " - ^ Util.utf8ToString (Sexp.toUtf8 sexp) - ^ "\n"); - dispatch (sexp, socket); - processRequests socket - end - - end - - (* val _ = EventLoop.processRequests (Net.acceptConnection 4005) *) - val _ = () - end - -(* (Swank.EventLoop.processRequests (Swank.Net.acceptConnection 4005)) *) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-mrepl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-mrepl.lisp deleted file mode 100644 index cc8ce81..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-mrepl.lisp +++ /dev/null @@ -1,162 +0,0 @@ -;;; swank-mrepl.lisp -;; -;; Licence: public domain - -(in-package :swank) -(eval-when (:compile-toplevel :load-toplevel :execute) - (let ((api '( - *emacs-connection* - channel - channel-id - define-channel-method - defslimefun - dcase - log-event - process-requests - send-to-remote-channel - use-threads-p - wait-for-event - with-bindings - with-connection - with-top-level-restart - with-slime-interrupts - ))) - (eval `(defpackage #:swank-api - (:use) - (:import-from #:swank . ,api) - (:export . ,api))))) - -(defpackage :swank-mrepl - (:use :cl :swank-api) - (:export #:create-mrepl)) - -(in-package :swank-mrepl) - -(defclass listener-channel (channel) - ((remote :initarg :remote) - (env :initarg :env) - (mode :initform :eval) - (tag :initform nil))) - -(defun package-prompt (package) - (reduce (lambda (x y) (if (<= (length x) (length y)) x y)) - (cons (package-name package) (package-nicknames package)))) - -(defslimefun create-mrepl (remote) - (let* ((pkg *package*) - (conn *emacs-connection*) - (thread (if (use-threads-p) - (spawn-listener-thread conn) - nil)) - (ch (make-instance 'listener-channel :remote remote :thread thread))) - (setf (slot-value ch 'env) (initial-listener-env ch)) - (when thread - (swank/backend:send thread `(:serve-channel ,ch))) - (list (channel-id ch) - (swank/backend:thread-id (or thread (swank/backend:current-thread))) - (package-name pkg) - (package-prompt pkg)))) - -(defun initial-listener-env (listener) - `((*package* . ,*package*) - (*standard-output* . ,(make-listener-output-stream listener)) - (*standard-input* . ,(make-listener-input-stream listener)))) - -(defun spawn-listener-thread (connection) - (swank/backend:spawn - (lambda () - (with-connection (connection) - (dcase (swank/backend:receive) - ((:serve-channel c) - (loop - (with-top-level-restart (connection (drop-unprocessed-events c)) - (process-requests nil))))))) - :name "mrepl thread")) - -(defun drop-unprocessed-events (channel) - (with-slots (mode) channel - (let ((old-mode mode)) - (setf mode :drop) - (unwind-protect - (process-requests t) - (setf mode old-mode))) - (send-prompt channel))) - -(define-channel-method :process ((c listener-channel) string) - (log-event ":process ~s~%" string) - (with-slots (mode remote) c - (ecase mode - (:eval (mrepl-eval c string)) - (:read (mrepl-read c string)) - (:drop)))) - -(defun mrepl-eval (channel string) - (with-slots (remote env) channel - (let ((aborted t)) - (with-bindings env - (unwind-protect - (let ((result (with-slime-interrupts (read-eval-print string)))) - (send-to-remote-channel remote `(:write-result ,result)) - (setq aborted nil)) - (setf env (loop for (sym) in env - collect (cons sym (symbol-value sym)))) - (cond (aborted - (send-to-remote-channel remote `(:evaluation-aborted))) - (t - (send-prompt channel)))))))) - -(defun send-prompt (channel) - (with-slots (env remote) channel - (let ((pkg (or (cdr (assoc '*package* env)) *package*)) - (out (cdr (assoc '*standard-output* env))) - (in (cdr (assoc '*standard-input* env)))) - (when out (force-output out)) - (when in (clear-input in)) - (send-to-remote-channel remote `(:prompt ,(package-name pkg) - ,(package-prompt pkg)))))) - -(defun mrepl-read (channel string) - (with-slots (tag) channel - (assert tag) - (throw tag string))) - -(defun read-eval-print (string) - (with-input-from-string (in string) - (setq / ()) - (loop - (let* ((form (read in nil in))) - (cond ((eq form in) (return)) - (t (setq / (multiple-value-list (eval (setq + form)))))))) - (force-output) - (if / - (format nil "~{~s~%~}" /) - "; No values"))) - -(defun make-listener-output-stream (channel) - (let ((remote (slot-value channel 'remote))) - (swank/backend:make-output-stream - (lambda (string) - (send-to-remote-channel remote `(:write-string ,string)))))) - -(defun make-listener-input-stream (channel) - (swank/backend:make-input-stream (lambda () (read-input channel)))) - -(defun set-mode (channel new-mode) - (with-slots (mode remote) channel - (unless (eq mode new-mode) - (send-to-remote-channel remote `(:set-read-mode ,new-mode))) - (setf mode new-mode))) - -(defun read-input (channel) - (with-slots (mode tag remote) channel - (force-output) - (let ((old-mode mode) - (old-tag tag)) - (setf tag (cons nil nil)) - (set-mode channel :read) - (unwind-protect - (catch tag (process-requests nil)) - (setf tag old-tag) - (set-mode channel old-mode))))) - -(provide :swank-mrepl) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-package-fu.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-package-fu.lisp deleted file mode 100644 index a22807a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-package-fu.lisp +++ /dev/null @@ -1,65 +0,0 @@ - -(in-package :swank) - -(defslimefun package= (string1 string2) - (let* ((pkg1 (guess-package string1)) - (pkg2 (guess-package string2))) - (and pkg1 pkg2 (eq pkg1 pkg2)))) - -(defslimefun export-symbol-for-emacs (symbol-str package-str) - (let ((package (guess-package package-str))) - (when package - (let ((*buffer-package* package)) - (export `(,(from-string symbol-str)) package))))) - -(defslimefun unexport-symbol-for-emacs (symbol-str package-str) - (let ((package (guess-package package-str))) - (when package - (let ((*buffer-package* package)) - (unexport `(,(from-string symbol-str)) package))))) - -#+sbcl -(defun list-structure-symbols (name) - (let ((dd (sb-kernel:find-defstruct-description name ))) - (list* name - (sb-kernel:dd-default-constructor dd) - (sb-kernel:dd-predicate-name dd) - (sb-kernel::dd-copier-name dd) - (mapcar #'sb-kernel:dsd-accessor-name - (sb-kernel:dd-slots dd))))) - -#+ccl -(defun list-structure-symbols (name) - (let ((definition (gethash name ccl::%defstructs%))) - (list* name - (ccl::sd-constructor definition) - (ccl::sd-refnames definition)))) - -(defun list-class-symbols (name) - (let* ((class (find-class name)) - (slots (swank-mop:class-direct-slots class))) - (labels ((extract-symbol (name) - (if (and (consp name) (eql (car name) 'setf)) - (cadr name) - name)) - (slot-accessors (slot) - (nintersection (copy-list (swank-mop:slot-definition-readers slot)) - (copy-list (swank-mop:slot-definition-readers slot)) - :key #'extract-symbol))) - (list* (class-name class) - (mapcan #'slot-accessors slots))))) - -(defslimefun export-structure (name package) - (let ((*package* (guess-package package))) - (when *package* - (let* ((name (from-string name)) - (symbols (cond #+(or sbcl ccl) - ((or (not (find-class name nil)) - (subtypep name 'structure-object)) - (list-structure-symbols name)) - (t - (list-class-symbols name))))) - (export symbols) - symbols)))) - -(provide :swank-package-fu) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-presentation-streams.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-presentation-streams.lisp deleted file mode 100644 index 93a6d1d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-presentation-streams.lisp +++ /dev/null @@ -1,334 +0,0 @@ -;;; swank-presentation-streams.lisp --- Streams that allow attaching object identities -;;; to portions of output -;;; -;;; Authors: Alan Ruttenberg -;;; Matthias Koeppe -;;; Helmut Eller -;;; -;;; License: This code has been placed in the Public Domain. All warranties -;;; are disclaimed. - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (swank-require :swank-presentations)) - -;; This file contains a mechanism for printing to the slime repl so -;; that the printed result remembers what object it is associated -;; with. This extends the recording of REPL results. -;; -;; There are two methods: -;; -;; 1. Depends on the ilisp bridge code being installed and ready to -;; intercept messages in the printed stream. We encode the -;; information with a message saying that we are starting to print -;; an object corresponding to a given id and another when we are -;; done. The process filter notices these and adds the necessary -;; text properties to the output. -;; -;; 2. Use separate protocol messages :presentation-start and -;; :presentation-end for sending presentations. -;; -;; We only do this if we know we are printing to a slime stream, -;; checked with the method slime-stream-p. Initially this checks for -;; the knows slime streams looking at *connections*. In cmucl, sbcl, and -;; openmcl it also checks if it is a pretty-printing stream which -;; ultimately prints to a slime stream. -;; -;; Method 1 seems to be faster, but the printed escape sequences can -;; disturb the column counting, and thus the layout in pretty-printing. -;; We use method 1 when a dedicated output stream is used. -;; -;; Method 2 is cleaner and works with pretty printing if the pretty -;; printers support "annotations". We use method 2 when no dedicated -;; output stream is used. - -;; Control -(defvar *enable-presenting-readable-objects* t - "set this to enable automatically printing presentations for some -subset of readable objects, such as pathnames." ) - -;; doing it - -(defmacro presenting-object (object stream &body body) - "What you use in your code. Wrap this around some printing and that text will -be sensitive and remember what object it is in the repl" - `(presenting-object-1 ,object ,stream #'(lambda () ,@body))) - -(defmacro presenting-object-if (predicate object stream &body body) - "What you use in your code. Wrap this around some printing and that text will -be sensitive and remember what object it is in the repl if predicate is true" - (let ((continue (gensym))) - `(let ((,continue #'(lambda () ,@body))) - (if ,predicate - (presenting-object-1 ,object ,stream ,continue) - (funcall ,continue))))) - -;;; Get pretty printer patches for SBCL at load (not compile) time. -#+#:disable-dangerous-patching ; #+sbcl -(eval-when (:load-toplevel) - (handler-bind ((simple-error - (lambda (c) - (declare (ignore c)) - (let ((clobber-it (find-restart 'sb-kernel::clobber-it))) - (when clobber-it (invoke-restart clobber-it)))))) - (sb-ext:without-package-locks - (swank/sbcl::with-debootstrapping - (load (make-pathname - :name "sbcl-pprint-patch" - :type "lisp" - :directory (pathname-directory - swank-loader:*source-directory*))))))) - -(let ((last-stream nil) - (last-answer nil)) - (defun slime-stream-p (stream) - "Check if stream is one of the slime streams, since if it isn't we -don't want to present anything. -Two special return values: -:DEDICATED -- Output ends up on a dedicated output stream -:REPL-RESULT -- Output ends up on the :repl-results target. -" - (if (eq last-stream stream) - last-answer - (progn - (setq last-stream stream) - (if (eq stream t) - (setq stream *standard-output*)) - (setq last-answer - (or #+openmcl - (and (typep stream 'ccl::xp-stream) - ;(slime-stream-p (ccl::xp-base-stream (slot-value stream 'ccl::xp-structure))) - (slime-stream-p (ccl::%svref (slot-value stream 'ccl::xp-structure) 1))) - #+cmu - (or (and (typep stream 'lisp::indenting-stream) - (slime-stream-p (lisp::indenting-stream-stream stream))) - (and (typep stream 'pretty-print::pretty-stream) - (fboundp 'pretty-print::enqueue-annotation) - (let ((slime-stream-p - (slime-stream-p (pretty-print::pretty-stream-target stream)))) - (and ;; Printing through CMUCL pretty - ;; streams is only cleanly - ;; possible if we are using the - ;; bridge-less protocol with - ;; annotations, because the bridge - ;; escape sequences disturb the - ;; pretty printer layout. - (not (eql slime-stream-p :dedicated-output)) - ;; If OK, return the return value - ;; we got from slime-stream-p on - ;; the target stream (could be - ;; :repl-result): - slime-stream-p)))) - #+sbcl - (let () - (declare (notinline sb-pretty::pretty-stream-target)) - (and (typep stream (find-symbol "PRETTY-STREAM" 'sb-pretty)) - (find-symbol "ENQUEUE-ANNOTATION" 'sb-pretty) - (not *use-dedicated-output-stream*) - (slime-stream-p (sb-pretty::pretty-stream-target stream)))) - #+allegro - (and (typep stream 'excl:xp-simple-stream) - (slime-stream-p (excl::stream-output-handle stream))) - (loop for connection in *connections* - thereis (or (and (eq stream (connection.dedicated-output connection)) - :dedicated) - (eq stream (connection.socket-io connection)) - (eq stream (connection.user-output connection)) - (eq stream (connection.user-io connection)) - (and (eq stream (connection.repl-results connection)) - :repl-result))))))))) - -(defun can-present-readable-objects (&optional stream) - (declare (ignore stream)) - *enable-presenting-readable-objects*) - -;; If we are printing to an XP (pretty printing) stream, printing the -;; escape sequences directly would mess up the layout because column -;; counting is disturbed. Use "annotations" instead. -#+allegro -(defun write-annotation (stream function arg) - (if (typep stream 'excl:xp-simple-stream) - (excl::schedule-annotation stream function arg) - (funcall function arg stream nil))) -#+cmu -(defun write-annotation (stream function arg) - (if (and (typep stream 'pp:pretty-stream) - (fboundp 'pp::enqueue-annotation)) - (pp::enqueue-annotation stream function arg) - (funcall function arg stream nil))) -#+sbcl -(defun write-annotation (stream function arg) - (let ((enqueue-annotation - (find-symbol "ENQUEUE-ANNOTATION" 'sb-pretty))) - (if (and enqueue-annotation - (typep stream (find-symbol "PRETTY-STREAM" 'sb-pretty))) - (funcall enqueue-annotation stream function arg) - (funcall function arg stream nil)))) -#-(or allegro cmu sbcl) -(defun write-annotation (stream function arg) - (funcall function arg stream nil)) - -(defstruct presentation-record - (id) - (printed-p) - (target)) - -(defun presentation-start (record stream truncatep) - (unless truncatep - ;; Don't start new presentations when nothing is going to be - ;; printed due to *print-lines*. - (let ((pid (presentation-record-id record)) - (target (presentation-record-target record))) - (case target - (:dedicated - ;; Use bridge protocol - (write-string "<" stream) - (prin1 pid stream) - (write-string "" stream)) - (t - (finish-output stream) - (send-to-emacs `(:presentation-start ,pid ,target))))) - (setf (presentation-record-printed-p record) t))) - -(defun presentation-end (record stream truncatep) - (declare (ignore truncatep)) - ;; Always end old presentations that were started. - (when (presentation-record-printed-p record) - (let ((pid (presentation-record-id record)) - (target (presentation-record-target record))) - (case target - (:dedicated - ;; Use bridge protocol - (write-string ">" stream) - (prin1 pid stream) - (write-string "" stream)) - (t - (finish-output stream) - (send-to-emacs `(:presentation-end ,pid ,target))))))) - -(defun presenting-object-1 (object stream continue) - "Uses the bridge mechanism with two messages >id and ) - (pp-end-block stream ">")) - nil)) - (defmethod print-object :around ((pathname pathname) stream) - (swank::presenting-object-if - (swank::can-present-readable-objects stream) - pathname stream (call-next-method)))) - (ccl::def-load-pointers clear-presentations () - (swank::clear-presentation-tables))) - -(in-package :swank) - -#+cmu -(progn - (fwrappers:define-fwrapper presenting-unreadable-wrapper (object stream type identity body) - (presenting-object object stream - (fwrappers:call-next-function))) - - (fwrappers:define-fwrapper presenting-pathname-wrapper (pathname stream depth) - (presenting-object-if (can-present-readable-objects stream) pathname stream - (fwrappers:call-next-function))) - - (defun monkey-patch-stream-printing () - (fwrappers::fwrap 'lisp::%print-pathname #'presenting-pathname-wrapper) - (fwrappers::fwrap 'lisp::%print-unreadable-object #'presenting-unreadable-wrapper))) - -#+sbcl -(progn - (defvar *saved-%print-unreadable-object* - (fdefinition 'sb-impl::%print-unreadable-object)) - - (defun monkey-patch-stream-printing () - (sb-ext:without-package-locks - (when (eq (fdefinition 'sb-impl::%print-unreadable-object) - *saved-%print-unreadable-object*) - (setf (fdefinition 'sb-impl::%print-unreadable-object) - (lambda (object stream &rest args) - (presenting-object object stream - (apply *saved-%print-unreadable-object* - object stream args))))) - (defmethod print-object :around ((object pathname) stream) - (presenting-object object stream - (call-next-method)))))) - -#+allegro -(progn - (excl:def-fwrapper presenting-unreadable-wrapper (object stream type identity continuation) - (swank::presenting-object object stream (excl:call-next-fwrapper))) - (excl:def-fwrapper presenting-pathname-wrapper (pathname stream depth) - (presenting-object-if (can-present-readable-objects stream) pathname stream - (excl:call-next-fwrapper))) - (defun monkey-patch-stream-printing () - (excl:fwrap 'excl::print-unreadable-object-1 - 'print-unreadable-present 'presenting-unreadable-wrapper) - (excl:fwrap 'excl::pathname-printer - 'print-pathname-present 'presenting-pathname-wrapper))) - -#-(or allegro sbcl cmu openmcl) -(defun monkey-patch-stream-printing () - (values)) - -;; Hook into SWANK. - -(defslimefun init-presentation-streams () - (monkey-patch-stream-printing) - ;; FIXME: import/use swank-repl to avoid package qualifier. - (setq swank-repl:*send-repl-results-function* - 'present-repl-results-via-presentation-streams)) - -(provide :swank-presentation-streams) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-presentations.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-presentations.lisp deleted file mode 100644 index 11326af..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-presentations.lisp +++ /dev/null @@ -1,246 +0,0 @@ -;;; swank-presentations.lisp --- imitate LispM's presentations -;; -;; Authors: Alan Ruttenberg -;; Luke Gorrie -;; Helmut Eller -;; Matthias Koeppe -;; -;; License: This code has been placed in the Public Domain. All warranties -;; are disclaimed. -;; - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (swank-require :swank-repl)) - -;;;; Recording and accessing results of computations - -(defvar *record-repl-results* t - "Non-nil means that REPL results are saved for later lookup.") - -(defvar *object-to-presentation-id* - (make-weak-key-hash-table :test 'eq) - "Store the mapping of objects to numeric identifiers") - -(defvar *presentation-id-to-object* - (make-weak-value-hash-table :test 'eql) - "Store the mapping of numeric identifiers to objects") - -(defun clear-presentation-tables () - (clrhash *object-to-presentation-id*) - (clrhash *presentation-id-to-object*)) - -(defvar *presentation-counter* 0 "identifier counter") - -(defvar *nil-surrogate* (make-symbol "nil-surrogate")) - -;; XXX thread safety? [2006-09-13] mb: not in the slightest (fwiw the -;; rest of slime isn't thread safe either), do we really care? -(defun save-presented-object (object) - "Save OBJECT and return the assigned id. -If OBJECT was saved previously return the old id." - (let ((object (if (null object) *nil-surrogate* object))) - ;; We store *nil-surrogate* instead of nil, to distinguish it from - ;; an object that was garbage collected. - (or (gethash object *object-to-presentation-id*) - (let ((id (incf *presentation-counter*))) - (setf (gethash id *presentation-id-to-object*) object) - (setf (gethash object *object-to-presentation-id*) id) - id)))) - -(defslimefun lookup-presented-object (id) - "Retrieve the object corresponding to ID. -The secondary value indicates the absence of an entry." - (etypecase id - (integer - ;; - (multiple-value-bind (object foundp) - (gethash id *presentation-id-to-object*) - (cond - ((eql object *nil-surrogate*) - ;; A stored nil object - (values nil t)) - ((null object) - ;; Object that was replaced by nil in the weak hash table - ;; when the object was garbage collected. - (values nil nil)) - (t - (values object foundp))))) - (cons - (dcase id - ((:frame-var thread-id frame index) - (declare (ignore thread-id)) ; later - (handler-case - (frame-var-value frame index) - (t (condition) - (declare (ignore condition)) - (values nil nil)) - (:no-error (value) - (values value t)))) - ((:inspected-part part-index) - (inspector-nth-part part-index)))))) - -(defslimefun lookup-presented-object-or-lose (id) - "Get the result of the previous REPL evaluation with ID." - (multiple-value-bind (object foundp) (lookup-presented-object id) - (cond (foundp object) - (t (error "Attempt to access unrecorded object (id ~D)." id))))) - -(defslimefun lookup-and-save-presented-object-or-lose (id) - "Get the object associated with ID and save it in the presentation tables." - (let ((obj (lookup-presented-object-or-lose id))) - (save-presented-object obj))) - -(defslimefun clear-repl-results () - "Forget the results of all previous REPL evaluations." - (clear-presentation-tables) - t) - -(defun present-repl-results (values) - ;; Override a function in swank.lisp, so that - ;; presentations are associated with every REPL result. - (flet ((send (value) - (let ((id (and *record-repl-results* - (save-presented-object value)))) - (send-to-emacs `(:presentation-start ,id :repl-result)) - (send-to-emacs `(:write-string ,(prin1-to-string value) - :repl-result)) - (send-to-emacs `(:presentation-end ,id :repl-result)) - (send-to-emacs `(:write-string ,(string #\Newline) - :repl-result))))) - (fresh-line) - (finish-output) - (if (null values) - (send-to-emacs `(:write-string "; No value" :repl-result)) - (mapc #'send values)))) - - -;;;; Presentation menu protocol -;; -;; To define a menu for a type of object, define a method -;; menu-choices-for-presentation on that object type. This function -;; should return a list of two element lists where the first element is -;; the name of the menu action and the second is a function that will be -;; called if the menu is chosen. The function will be called with 3 -;; arguments: -;; -;; choice: The string naming the action from above -;; -;; object: The object -;; -;; id: The presentation id of the object -;; -;; You might want append (when (next-method-p) (call-next-method)) to -;; pick up the Menu actions of superclasses. -;; - -(defvar *presentation-active-menu* nil) - -(defun menu-choices-for-presentation-id (id) - (multiple-value-bind (ob presentp) (lookup-presented-object id) - (cond ((not presentp) 'not-present) - (t - (let ((menu-and-actions (menu-choices-for-presentation ob))) - (setq *presentation-active-menu* (cons id menu-and-actions)) - (mapcar 'car menu-and-actions)))))) - -(defun swank-ioify (thing) - (cond ((keywordp thing) thing) - ((and (symbolp thing)(not (find #\: (symbol-name thing)))) - (intern (symbol-name thing) 'swank-io-package)) - ((consp thing) (cons (swank-ioify (car thing)) - (swank-ioify (cdr thing)))) - (t thing))) - -(defun execute-menu-choice-for-presentation-id (id count item) - (let ((ob (lookup-presented-object id))) - (assert (equal id (car *presentation-active-menu*)) () - "Bug: Execute menu call for id ~a but menu has id ~a" - id (car *presentation-active-menu*)) - (let ((action (second (nth (1- count) (cdr *presentation-active-menu*))))) - (swank-ioify (funcall action item ob id))))) - - -(defgeneric menu-choices-for-presentation (object) - (:method (ob) (declare (ignore ob)) nil)) ; default method - -;; Pathname -(defmethod menu-choices-for-presentation ((ob pathname)) - (let* ((file-exists (ignore-errors (probe-file ob))) - (lisp-type (make-pathname :type "lisp")) - (source-file (and (not (member (pathname-type ob) '("lisp" "cl") - :test 'equal)) - (let ((source (merge-pathnames lisp-type ob))) - (and (ignore-errors (probe-file source)) - source)))) - (fasl-file (and file-exists - (equal (ignore-errors - (namestring - (truename - (compile-file-pathname - (merge-pathnames lisp-type ob))))) - (namestring (truename ob)))))) - (remove nil - (list* - (and (and file-exists (not fasl-file)) - (list "Edit this file" - (lambda(choice object id) - (declare (ignore choice id)) - (ed-in-emacs (namestring (truename object))) - nil))) - (and file-exists - (list "Dired containing directory" - (lambda (choice object id) - (declare (ignore choice id)) - (ed-in-emacs (namestring - (truename - (merge-pathnames - (make-pathname :name "" :type "") - object)))) - nil))) - (and fasl-file - (list "Load this fasl file" - (lambda (choice object id) - (declare (ignore choice id object)) - (load ob) - nil))) - (and fasl-file - (list "Delete this fasl file" - (lambda (choice object id) - (declare (ignore choice id object)) - (let ((nt (namestring (truename ob)))) - (when (y-or-n-p-in-emacs "Delete ~a? " nt) - (delete-file nt))) - nil))) - (and source-file - (list "Edit lisp source file" - (lambda (choice object id) - (declare (ignore choice id object)) - (ed-in-emacs (namestring (truename source-file))) - nil))) - (and source-file - (list "Load lisp source file" - (lambda(choice object id) - (declare (ignore choice id object)) - (load source-file) - nil))) - (and (next-method-p) (call-next-method)))))) - -(defmethod menu-choices-for-presentation ((ob function)) - (list (list "Disassemble" - (lambda (choice object id) - (declare (ignore choice id)) - (disassemble object))))) - -(defslimefun inspect-presentation (id reset-p) - (let ((what (lookup-presented-object-or-lose id))) - (when reset-p - (reset-inspector)) - (inspect-object what))) - -(defslimefun init-presentations () - ;; FIXME: import/use swank-repl to avoid package qualifier. - (setq swank-repl:*send-repl-results-function* 'present-repl-results)) - -(provide :swank-presentations) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-quicklisp.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-quicklisp.lisp deleted file mode 100644 index 3654599..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-quicklisp.lisp +++ /dev/null @@ -1,17 +0,0 @@ -;;; swank-quicklisp.lisp -- Quicklisp support -;; -;; Authors: Matthew Kennedy -;; License: Public Domain -;; - -(in-package :swank) - -(defslimefun list-quicklisp-systems () - "Returns the Quicklisp systems list." - (if (member :quicklisp *features*) - (let ((ql-dist-name (find-symbol "NAME" "QL-DIST")) - (ql-system-list (find-symbol "SYSTEM-LIST" "QL"))) - (mapcar ql-dist-name (funcall ql-system-list))) - (error "Could not find Quicklisp already loaded."))) - -(provide :swank-quicklisp) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-r6rs.scm b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-r6rs.scm deleted file mode 100644 index 4e48050..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-r6rs.scm +++ /dev/null @@ -1,416 +0,0 @@ -;; swank-r6rs.sls --- Shareable code between swank-ikarus and swank-larceny -;; -;; Licence: public domain -;; Author: Helmut Eller -;; -;; This is a Swank server barely capable enough to process simple eval -;; requests from Emacs before dying. No fancy features like -;; backtraces, module redefintion, M-. etc. are implemented. Don't -;; even think about pc-to-source mapping. -;; -;; Despite standard modules, this file uses (swank os) and (swank sys) -;; which define implementation dependend functionality. There are -;; multiple modules in this files, which is probably not standardized. -;; - -;; Naive FORMAT implementation which supports: ~a ~s ~d ~x ~c -(library (swank format) - (export format printf fprintf) - (import (rnrs)) - - (define (format f . args) - (call-with-string-output-port - (lambda (port) (apply fprintf port f args)))) - - (define (printf f . args) - (let ((port (current-output-port))) - (apply fprintf port f args) - (flush-output-port port))) - - (define (fprintf port f . args) - (let ((len (string-length f))) - (let loop ((i 0) (args args)) - (cond ((= i len) (assert (null? args))) - ((and (char=? (string-ref f i) #\~) - (< (+ i 1) len)) - (dispatch-format (string-ref f (+ i 1)) port (car args)) - (loop (+ i 2) (cdr args))) - (else - (put-char port (string-ref f i)) - (loop (+ i 1) args)))))) - - (define (dispatch-format char port arg) - (let ((probe (assoc char format-dispatch-table))) - (cond (probe ((cdr probe) arg port)) - (else (error "invalid format char: " char))))) - - (define format-dispatch-table - `((#\a . ,display) - (#\s . ,write) - (#\d . ,(lambda (arg port) (put-string port (number->string arg 10)))) - (#\x . ,(lambda (arg port) (put-string port (number->string arg 16)))) - (#\c . ,(lambda (arg port) (put-char port arg)))))) - - -;; CL-style restarts to let us continue after errors. -(library (swank restarts) - (export with-simple-restart compute-restarts invoke-restart restart-name - write-restart-report) - (import (rnrs)) - - (define *restarts* '()) - - (define-record-type restart - (fields name reporter continuation)) - - (define (with-simple-restart name reporter thunk) - (call/cc - (lambda (k) - (let ((old-restarts *restarts*) - (restart (make-restart name (coerce-to-reporter reporter) k))) - (dynamic-wind - (lambda () (set! *restarts* (cons restart old-restarts))) - thunk - (lambda () (set! *restarts* old-restarts))))))) - - (define (compute-restarts) *restarts*) - - (define (invoke-restart restart . args) - (apply (restart-continuation restart) args)) - - (define (write-restart-report restart port) - ((restart-reporter restart) port)) - - (define (coerce-to-reporter obj) - (cond ((string? obj) (lambda (port) (put-string port obj))) - (#t (assert (procedure? obj)) obj))) - - ) - -;; This module encodes & decodes messages from the wire and queues them. -(library (swank event-queue) - (export make-event-queue wait-for-event enqueue-event - read-event write-event) - (import (rnrs) - (rnrs mutable-pairs) - (swank format)) - - (define-record-type event-queue - (fields (mutable q) wait-fun) - (protocol (lambda (init) - (lambda (wait-fun) - (init '() wait-fun))))) - - (define (wait-for-event q pattern) - (or (poll q pattern) - (begin - ((event-queue-wait-fun q) q) - (wait-for-event q pattern)))) - - (define (poll q pattern) - (let loop ((lag #f) - (l (event-queue-q q))) - (cond ((null? l) #f) - ((event-match? (car l) pattern) - (cond (lag - (set-cdr! lag (cdr l)) - (car l)) - (else - (event-queue-q-set! q (cdr l)) - (car l)))) - (else (loop l (cdr l)))))) - - (define (event-match? event pattern) - (cond ((or (number? pattern) - (member pattern '(t nil))) - (equal? event pattern)) - ((symbol? pattern) #t) - ((pair? pattern) - (case (car pattern) - ((quote) (equal? event (cadr pattern))) - ((or) (exists (lambda (p) (event-match? event p)) (cdr pattern))) - (else (and (pair? event) - (event-match? (car event) (car pattern)) - (event-match? (cdr event) (cdr pattern)))))) - (else (error "Invalid pattern: " pattern)))) - - (define (enqueue-event q event) - (event-queue-q-set! q - (append (event-queue-q q) - (list event)))) - - (define (write-event event port) - (let ((payload (call-with-string-output-port - (lambda (port) (write event port))))) - (write-length (string-length payload) port) - (put-string port payload) - (flush-output-port port))) - - (define (write-length len port) - (do ((i 24 (- i 4))) - ((= i 0)) - (put-string port - (number->string (bitwise-bit-field len (- i 4) i) - 16)))) - - (define (read-event port) - (let* ((header (string-append (get-string-n port 2) - (get-string-n port 2) - (get-string-n port 2))) - (_ (printf "header: ~s\n" header)) - (len (string->number header 16)) - (_ (printf "len: ~s\n" len)) - (payload (get-string-n port len))) - (printf "payload: ~s\n" payload) - (read (open-string-input-port payload)))) - - ) - -;; Entry points for SLIME commands. -(library (swank rpc) - (export connection-info interactive-eval - ;;compile-string-for-emacs - throw-to-toplevel sldb-abort - operator-arglist buffer-first-change - create-repl listener-eval) - (import (rnrs) - (rnrs eval) - (only (rnrs r5rs) scheme-report-environment) - (swank os) - (swank format) - (swank restarts) - (swank sys) - ) - - (define (connection-info . _) - `(,@'() - :pid ,(getpid) - :package (:name ">" :prompt ">") - :lisp-implementation (,@'() - :name ,(implementation-name) - :type "R6RS-Scheme"))) - - (define (interactive-eval string) - (call-with-values - (lambda () - (eval-in-interaction-environment (read-from-string string))) - (case-lambda - (() "; no value") - ((value) (format "~s" value)) - (values (format "values: ~s" values))))) - - (define (throw-to-toplevel) (invoke-restart-by-name-or-nil 'toplevel)) - - (define (sldb-abort) (invoke-restart-by-name-or-nil 'abort)) - - (define (invoke-restart-by-name-or-nil name) - (let ((r (find (lambda (r) (eq? (restart-name r) name)) - (compute-restarts)))) - (if r (invoke-restart r) 'nil))) - - (define (create-repl target) - (list "" "")) - - (define (listener-eval string) - (call-with-values (lambda () (eval-region string)) - (lambda values `(:values ,@(map (lambda (v) (format "~s" v)) values))))) - - (define (eval-region string) - (let ((sexp (read-from-string string))) - (if (eof-object? exp) - (values) - (eval-in-interaction-environment sexp)))) - - (define (read-from-string string) - (call-with-port (open-string-input-port string) read)) - - (define (operator-arglist . _) 'nil) - (define (buffer-first-change . _) 'nil) - - ) - -;; The server proper. Does the TCP stuff and exception handling. -(library (swank) - (export start-server) - (import (rnrs) - (rnrs eval) - (swank os) - (swank format) - (swank event-queue) - (swank restarts)) - - (define-record-type connection - (fields in-port out-port event-queue)) - - (define (start-server port) - (accept-connections (or port 4005) #f)) - - (define (start-server/port-file port-file) - (accept-connections #f port-file)) - - (define (accept-connections port port-file) - (let ((sock (make-server-socket port))) - (printf "Listening on port: ~s\n" (local-port sock)) - (when port-file - (write-port-file (local-port sock) port-file)) - (let-values (((in out) (accept sock (latin-1-codec)))) - (dynamic-wind - (lambda () #f) - (lambda () - (close-socket sock) - (serve in out)) - (lambda () - (close-port in) - (close-port out)))))) - - (define (write-port-file port port-file) - (call-with-output-file - (lambda (file) - (write port file)))) - - (define (serve in out) - (let ((err (current-error-port)) - (q (make-event-queue - (lambda (q) - (let ((e (read-event in))) - (printf "read: ~s\n" e) - (enqueue-event q e)))))) - (dispatch-loop (make-connection in out q)))) - - (define-record-type sldb-state - (fields level condition continuation next)) - - (define (dispatch-loop conn) - (let ((event (wait-for-event (connection-event-queue conn) 'x))) - (case (car event) - ((:emacs-rex) - (with-simple-restart - 'toplevel "Return to SLIME's toplevel" - (lambda () - (apply emacs-rex conn #f (cdr event))))) - (else (error "Unhandled event: ~s" event)))) - (dispatch-loop conn)) - - (define (recover thunk on-error-thunk) - (let ((ok #f)) - (dynamic-wind - (lambda () #f) - (lambda () - (call-with-values thunk - (lambda vals - (set! ok #t) - (apply values vals)))) - (lambda () - (unless ok - (on-error-thunk)))))) - - ;; Couldn't resist to exploit the prefix feature. - (define rpc-entries (environment '(prefix (swank rpc) swank:))) - - (define (emacs-rex conn sldb-state form package thread tag) - (let ((out (connection-out-port conn))) - (recover - (lambda () - (with-exception-handler - (lambda (condition) - (call/cc - (lambda (k) - (sldb-exception-handler conn condition k sldb-state)))) - (lambda () - (let ((value (apply (eval (car form) rpc-entries) (cdr form)))) - (write-event `(:return (:ok ,value) ,tag) out))))) - (lambda () - (write-event `(:return (:abort) ,tag) out))))) - - (define (sldb-exception-handler connection condition k sldb-state) - (when (serious-condition? condition) - (let ((level (if sldb-state (+ (sldb-state-level sldb-state) 1) 1)) - (out (connection-out-port connection))) - (write-event `(:debug 0 ,level ,@(debugger-info condition connection)) - out) - (dynamic-wind - (lambda () #f) - (lambda () - (sldb-loop connection - (make-sldb-state level condition k sldb-state))) - (lambda () (write-event `(:debug-return 0 ,level nil) out)))))) - - (define (sldb-loop connection state) - (apply emacs-rex connection state - (cdr (wait-for-event (connection-event-queue connection) - '(':emacs-rex . _)))) - (sldb-loop connection state)) - - (define (debugger-info condition connection) - (list `(,(call-with-string-output-port - (lambda (port) (print-condition condition port))) - ,(format " [type ~s]" (if (record? condition) - (record-type-name (record-rtd condition)) - )) - ()) - (map (lambda (r) - (list (format "~a" (restart-name r)) - (call-with-string-output-port - (lambda (port) - (write-restart-report r port))))) - (compute-restarts)) - '() - '())) - - (define (print-condition obj port) - (cond ((condition? obj) - (let ((list (simple-conditions obj))) - (case (length list) - ((0) - (display "Compuond condition with zero components" port)) - ((1) - (assert (eq? obj (car list))) - (print-simple-condition (car list) port)) - (else - (display "Compound condition:\n" port) - (for-each (lambda (c) - (display " " port) - (print-simple-condition c port) - (newline port)) - list))))) - (#t - (fprintf port "Non-condition object: ~s" obj)))) - - (define (print-simple-condition condition port) - (fprintf port "~a" (record-type-name (record-rtd condition))) - (case (count-record-fields condition) - ((0) #f) - ((1) - (fprintf port ": ") - (do-record-fields condition (lambda (name value) (write value port)))) - (else - (fprintf port ":") - (do-record-fields condition (lambda (name value) - (fprintf port "\n~a: ~s" name value)))))) - - ;; Call FUN with RECORD's rtd and parent rtds. - (define (do-record-rtds record fun) - (do ((rtd (record-rtd record) (record-type-parent rtd))) - ((not rtd)) - (fun rtd))) - - ;; Call FUN with RECORD's field names and values. - (define (do-record-fields record fun) - (do-record-rtds - record - (lambda (rtd) - (let* ((names (record-type-field-names rtd)) - (len (vector-length names))) - (do ((i 0 (+ 1 i))) - ((= i len)) - (fun (vector-ref names i) ((record-accessor rtd i) record))))))) - - ;; Return the number of fields in RECORD - (define (count-record-fields record) - (let ((i 0)) - (do-record-rtds - record (lambda (rtd) - (set! i (+ i (vector-length (record-type-field-names rtd)))))) - i)) - - ) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-repl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-repl.lisp deleted file mode 100644 index 259c9ea..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-repl.lisp +++ /dev/null @@ -1,441 +0,0 @@ -;;; swank-repl.lisp --- Server side part of the Lisp listener. -;; -;; License: public domain -(in-package swank) - -(defpackage swank-repl - (:use cl swank/backend) - (:export *send-repl-results-function*) - (:import-from - swank - - *default-worker-thread-bindings* - - *loopback-interface* - - add-hook - *connection-closed-hook* - - eval-region - with-buffer-syntax - - connection - connection.socket-io - connection.repl-results - connection.user-input - connection.user-output - connection.user-io - connection.trace-output - connection.dedicated-output - connection.env - - multithreaded-connection - mconn.active-threads - mconn.repl-thread - mconn.auto-flush-thread - use-threads-p - - *emacs-connection* - default-connection - with-connection - - send-to-emacs - *communication-style* - handle-requests - wait-for-event - make-tag - thread-for-evaluation - socket-quest - - authenticate-client - encode-message - - auto-flush-loop - clear-user-input - - current-thread-id - cat - with-struct* - with-retry-restart - with-bindings - - package-string-for-prompt - find-external-format-or-lose - - defslimefun - - ;; FIXME: those should be exported from swank-repl only, but how to - ;; do that whithout breaking init files? - *use-dedicated-output-stream* - *dedicated-output-stream-port* - *globally-redirect-io*)) - -(in-package swank-repl) - -(defvar *use-dedicated-output-stream* nil - "When T swank will attempt to create a second connection to Emacs -which is used just to send output.") - -(defvar *dedicated-output-stream-port* 0 - "Which port we should use for the dedicated output stream.") - -(defvar *dedicated-output-stream-buffering* - (if (eq *communication-style* :spawn) t nil) - "The buffering scheme that should be used for the output stream. -Valid values are nil, t, :line") - -(defvar *globally-redirect-io* :started-from-emacs - "When T globally redirect all standard streams to Emacs. -When :STARTED-FROM-EMACS redirect when launched by M-x slime") - -(defun globally-redirect-io-p () - (case *globally-redirect-io* - ((t) t) - (:started-from-emacs swank-loader:*started-from-emacs*))) - -(defun open-streams (connection properties) - "Return the 5 streams for IO redirection: -DEDICATED-OUTPUT INPUT OUTPUT IO REPL-RESULTS" - (let* ((input-fn - (lambda () - (with-connection (connection) - (with-simple-restart (abort-read - "Abort reading input from Emacs.") - (read-user-input-from-emacs))))) - (dedicated-output (if *use-dedicated-output-stream* - (open-dedicated-output-stream - connection - (getf properties :coding-system)))) - (in (make-input-stream input-fn)) - (out (or dedicated-output - (make-output-stream (make-output-function connection)))) - (io (make-two-way-stream in out)) - (repl-results (swank:make-output-stream-for-target connection - :repl-result))) - (typecase connection - (multithreaded-connection - (setf (mconn.auto-flush-thread connection) - (make-auto-flush-thread out)))) - (values dedicated-output in out io repl-results))) - -(defun make-output-function (connection) - "Create function to send user output to Emacs." - (lambda (string) - (with-connection (connection) - (send-to-emacs `(:write-string ,string))))) - -(defun open-dedicated-output-stream (connection coding-system) - "Open a dedicated output connection to the Emacs on SOCKET-IO. -Return an output stream suitable for writing program output. - -This is an optimized way for Lisp to deliver output to Emacs." - (let ((socket (socket-quest *dedicated-output-stream-port* nil)) - (ef (find-external-format-or-lose coding-system))) - (unwind-protect - (let ((port (local-port socket))) - (encode-message `(:open-dedicated-output-stream ,port - ,coding-system) - (connection.socket-io connection)) - (let ((dedicated (accept-connection - socket - :external-format ef - :buffering *dedicated-output-stream-buffering* - :timeout 30))) - (authenticate-client dedicated) - (close-socket socket) - (setf socket nil) - dedicated)) - (when socket - (close-socket socket))))) - -(defmethod thread-for-evaluation ((connection multithreaded-connection) - (id (eql :find-existing))) - (or (car (mconn.active-threads connection)) - (find-repl-thread connection))) - -(defmethod thread-for-evaluation ((connection multithreaded-connection) - (id (eql :repl-thread))) - (find-repl-thread connection)) - -(defun find-repl-thread (connection) - (cond ((not (use-threads-p)) - (current-thread)) - (t - (let ((thread (mconn.repl-thread connection))) - (cond ((not thread) nil) - ((thread-alive-p thread) thread) - (t - (setf (mconn.repl-thread connection) - (spawn-repl-thread connection "new-repl-thread")))))))) - -(defun spawn-repl-thread (connection name) - (spawn (lambda () - (with-bindings *default-worker-thread-bindings* - (repl-loop connection))) - :name name)) - -(defun repl-loop (connection) - (handle-requests connection)) - -;;;;; Redirection during requests -;;; -;;; We always redirect the standard streams to Emacs while evaluating -;;; an RPC. This is done with simple dynamic bindings. - -(defslimefun create-repl (target &key coding-system) - (assert (eq target nil)) - (let ((conn *emacs-connection*)) - (initialize-streams-for-connection conn `(:coding-system ,coding-system)) - (with-struct* (connection. @ conn) - (setf (@ env) - `((*standard-input* . ,(@ user-input)) - ,@(unless (globally-redirect-io-p) - `((*standard-output* . ,(@ user-output)) - (*trace-output* . ,(or (@ trace-output) (@ user-output))) - (*error-output* . ,(@ user-output)) - (*debug-io* . ,(@ user-io)) - (*query-io* . ,(@ user-io)) - (*terminal-io* . ,(@ user-io)))))) - (maybe-redirect-global-io conn) - (add-hook *connection-closed-hook* 'update-redirection-after-close) - (typecase conn - (multithreaded-connection - (setf (mconn.repl-thread conn) - (spawn-repl-thread conn "repl-thread")))) - (list (package-name *package*) - (package-string-for-prompt *package*))))) - -(defun initialize-streams-for-connection (connection properties) - (multiple-value-bind (dedicated in out io repl-results) - (open-streams connection properties) - (setf (connection.dedicated-output connection) dedicated - (connection.user-io connection) io - (connection.user-output connection) out - (connection.user-input connection) in - (connection.repl-results connection) repl-results) - connection)) - -(defun read-user-input-from-emacs () - (let ((tag (make-tag))) - (force-output) - (send-to-emacs `(:read-string ,(current-thread-id) ,tag)) - (let ((ok nil)) - (unwind-protect - (prog1 (caddr (wait-for-event `(:emacs-return-string ,tag value))) - (setq ok t)) - (unless ok - (send-to-emacs `(:read-aborted ,(current-thread-id) ,tag))))))) - -;;;;; Listener eval - -(defvar *listener-eval-function* 'repl-eval) - -(defvar *listener-saved-value* nil) - -(defslimefun listener-save-value (slimefun &rest args) - "Apply SLIMEFUN to ARGS and save the value. -The saved value should be visible to all threads and retrieved via -LISTENER-GET-VALUE." - (setq *listener-saved-value* (apply slimefun args)) - t) - -(defslimefun listener-get-value () - "Get the last value saved by LISTENER-SAVE-VALUE. -The value should be produced as if it were requested through -LISTENER-EVAL directly, so that spacial variables *, etc are set." - (listener-eval (let ((*package* (find-package :keyword))) - (write-to-string '*listener-saved-value*)))) - -(defslimefun listener-eval (string &key (window-width nil window-width-p)) - (if window-width-p - (let ((*print-right-margin* window-width)) - (funcall *listener-eval-function* string)) - (funcall *listener-eval-function* string))) - -(defslimefun clear-repl-variables () - (let ((variables '(*** ** * /// // / +++ ++ +))) - (loop for variable in variables - do (setf (symbol-value variable) nil)))) - -(defvar *send-repl-results-function* 'send-repl-results-to-emacs) - -(defun repl-eval (string) - (clear-user-input) - (with-buffer-syntax () - (with-retry-restart (:msg "Retry SLIME REPL evaluation request.") - (track-package - (lambda () - (multiple-value-bind (values last-form) (eval-region string) - (setq *** ** ** * * (car values) - /// // // / / values - +++ ++ ++ + + last-form) - (funcall *send-repl-results-function* values)))))) - nil) - -(defun track-package (fun) - (let ((p *package*)) - (unwind-protect (funcall fun) - (unless (eq *package* p) - (send-to-emacs (list :new-package (package-name *package*) - (package-string-for-prompt *package*))))))) - -(defun send-repl-results-to-emacs (values) - (finish-output) - (if (null values) - (send-to-emacs `(:write-string "; No value" :repl-result)) - (dolist (v values) - (send-to-emacs `(:write-string ,(cat (prin1-to-string v) #\newline) - :repl-result))))) - -(defslimefun redirect-trace-output (target) - (setf (connection.trace-output *emacs-connection*) - (swank:make-output-stream-for-target *emacs-connection* target)) - nil) - - - -;;;; IO to Emacs -;;; -;;; This code handles redirection of the standard I/O streams -;;; (`*standard-output*', etc) into Emacs. The `connection' structure -;;; contains the appropriate streams, so all we have to do is make the -;;; right bindings. - -;;;;; Global I/O redirection framework -;;; -;;; Optionally, the top-level global bindings of the standard streams -;;; can be assigned to be redirected to Emacs. When Emacs connects we -;;; redirect the streams into the connection, and they keep going into -;;; that connection even if more are established. If the connection -;;; handling the streams closes then another is chosen, or if there -;;; are no connections then we revert to the original (real) streams. -;;; -;;; It is slightly tricky to assign the global values of standard -;;; streams because they are often shadowed by dynamic bindings. We -;;; solve this problem by introducing an extra indirection via synonym -;;; streams, so that *STANDARD-INPUT* is a synonym stream to -;;; *CURRENT-STANDARD-INPUT*, etc. We never shadow the "current" -;;; variables, so they can always be assigned to affect a global -;;; change. - -;;;;; Global redirection setup - -(defvar *saved-global-streams* '() - "A plist to save and restore redirected stream objects. -E.g. the value for '*standard-output* holds the stream object -for *standard-output* before we install our redirection.") - -(defun setup-stream-indirection (stream-var &optional stream) - "Setup redirection scaffolding for a global stream variable. -Supposing (for example) STREAM-VAR is *STANDARD-INPUT*, this macro: - -1. Saves the value of *STANDARD-INPUT* in `*SAVED-GLOBAL-STREAMS*'. - -2. Creates *CURRENT-STANDARD-INPUT*, initially with the same value as -*STANDARD-INPUT*. - -3. Assigns *STANDARD-INPUT* to a synonym stream pointing to -*CURRENT-STANDARD-INPUT*. - -This has the effect of making *CURRENT-STANDARD-INPUT* contain the -effective global value for *STANDARD-INPUT*. This way we can assign -the effective global value even when *STANDARD-INPUT* is shadowed by a -dynamic binding." - (let ((current-stream-var (prefixed-var '#:current stream-var)) - (stream (or stream (symbol-value stream-var)))) - ;; Save the real stream value for the future. - (setf (getf *saved-global-streams* stream-var) stream) - ;; Define a new variable for the effective stream. - ;; This can be reassigned. - (proclaim `(special ,current-stream-var)) - (set current-stream-var stream) - ;; Assign the real binding as a synonym for the current one. - (let ((stream (make-synonym-stream current-stream-var))) - (set stream-var stream) - (set-default-initial-binding stream-var `(quote ,stream))))) - -(defun prefixed-var (prefix variable-symbol) - "(PREFIXED-VAR \"FOO\" '*BAR*) => SWANK::*FOO-BAR*" - (let ((basename (subseq (symbol-name variable-symbol) 1))) - (intern (format nil "*~A-~A" (string prefix) basename) :swank))) - -(defvar *standard-output-streams* - '(*standard-output* *error-output* *trace-output*) - "The symbols naming standard output streams.") - -(defvar *standard-input-streams* - '(*standard-input*) - "The symbols naming standard input streams.") - -(defvar *standard-io-streams* - '(*debug-io* *query-io* *terminal-io*) - "The symbols naming standard io streams.") - -(defun init-global-stream-redirection () - (when (globally-redirect-io-p) - (cond (*saved-global-streams* - (warn "Streams already redirected.")) - (t - (mapc #'setup-stream-indirection - (append *standard-output-streams* - *standard-input-streams* - *standard-io-streams*)))))) - -(defun globally-redirect-io-to-connection (connection) - "Set the standard I/O streams to redirect to CONNECTION. -Assigns *CURRENT-* for all standard streams." - (dolist (o *standard-output-streams*) - (set (prefixed-var '#:current o) - (connection.user-output connection))) - ;; FIXME: If we redirect standard input to Emacs then we get the - ;; regular Lisp top-level trying to read from our REPL. - ;; - ;; Perhaps the ideal would be for the real top-level to run in a - ;; thread with local bindings for all the standard streams. Failing - ;; that we probably would like to inhibit it from reading while - ;; Emacs is connected. - ;; - ;; Meanwhile we just leave *standard-input* alone. - #+NIL - (dolist (i *standard-input-streams*) - (set (prefixed-var '#:current i) - (connection.user-input connection))) - (dolist (io *standard-io-streams*) - (set (prefixed-var '#:current io) - (connection.user-io connection)))) - -(defun revert-global-io-redirection () - "Set *CURRENT-* to *REAL-* for all standard streams." - (dolist (stream-var (append *standard-output-streams* - *standard-input-streams* - *standard-io-streams*)) - (set (prefixed-var '#:current stream-var) - (getf *saved-global-streams* stream-var)))) - -;;;;; Global redirection hooks - -(defvar *global-stdio-connection* nil - "The connection to which standard I/O streams are globally redirected. -NIL if streams are not globally redirected.") - -(defun maybe-redirect-global-io (connection) - "Consider globally redirecting to CONNECTION." - (when (and (globally-redirect-io-p) (null *global-stdio-connection*) - (connection.user-io connection)) - (unless *saved-global-streams* - (init-global-stream-redirection)) - (setq *global-stdio-connection* connection) - (globally-redirect-io-to-connection connection))) - -(defun update-redirection-after-close (closed-connection) - "Update redirection after a connection closes." - (check-type closed-connection connection) - (when (eq *global-stdio-connection* closed-connection) - (if (and (default-connection) (globally-redirect-io-p)) - ;; Redirect to another connection. - (globally-redirect-io-to-connection (default-connection)) - ;; No more connections, revert to the real streams. - (progn (revert-global-io-redirection) - (setq *global-stdio-connection* nil))))) - -(provide :swank-repl) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-sbcl-exts.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-sbcl-exts.lisp deleted file mode 100644 index 6cbe09d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-sbcl-exts.lisp +++ /dev/null @@ -1,67 +0,0 @@ -;;; swank-sbcl-exts.lisp --- Misc extensions for SBCL -;; -;; Authors: Tobias C. Rittweiler -;; -;; License: Public Domain -;; - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (swank-require :swank-arglists)) - -;; We need to do this so users can place `slime-sbcl-exts' into their -;; ~/.emacs, and still use any implementation they want. -#+sbcl -(progn - -;;; Display arglist of instructions. -;;; -(defmethod compute-enriched-decoded-arglist ((operator-form (eql 'sb-assem:inst)) - argument-forms) - (flet ((decode-instruction-arglist (instr-name instr-arglist) - (let ((decoded-arglist (decode-arglist instr-arglist))) - ;; The arglist of INST is (instruction ...INSTR-ARGLIST...). - (push 'sb-assem::instruction (arglist.required-args decoded-arglist)) - (values decoded-arglist - (list instr-name) - t)))) - (if (null argument-forms) - (call-next-method) - (destructuring-bind (instruction &rest args) argument-forms - (declare (ignore args)) - (let* ((instr-name - (typecase instruction - (arglist-dummy - (string-upcase (arglist-dummy.string-representation instruction))) - (symbol - (string-downcase instruction)))) - (instr-fn - #+#.(swank/backend:with-symbol 'op-encoder-name 'sb-assem) - (or (sb-assem::op-encoder-name instr-name) - (sb-assem::op-encoder-name (string-upcase instr-name))) - #+#.(swank/backend:with-symbol 'inst-emitter-symbol 'sb-assem) - (sb-assem::inst-emitter-symbol instr-name) - #+(and - (not #.(swank/backend:with-symbol 'inst-emitter-symbol 'sb-assem)) - #.(swank/backend:with-symbol '*assem-instructions* 'sb-assem)) - (gethash instr-name sb-assem:*assem-instructions*))) - (cond ((functionp instr-fn) - (with-available-arglist (arglist) (arglist instr-fn) - (decode-instruction-arglist instr-name arglist))) - ((fboundp instr-fn) - (with-available-arglist (arglist) (arglist instr-fn) - ;; SB-ASSEM:INST invokes a symbolic INSTR-FN with - ;; current segment and current vop implicitly. - (decode-instruction-arglist instr-name - (if (or (get instr-fn :macro) - (macro-function instr-fn)) - arglist - (cddr arglist))))) - (t - (call-next-method)))))))) - - -) ; PROGN - -(provide :swank-sbcl-exts) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-snapshot.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-snapshot.lisp deleted file mode 100644 index 52a87ed..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-snapshot.lisp +++ /dev/null @@ -1,67 +0,0 @@ - -(defpackage swank-snapshot - (:use cl) - (:export restore-snapshot save-snapshot background-save-snapshot) - (:import-from swank defslimefun)) -(in-package swank-snapshot) - -(defslimefun save-snapshot (image-file) - (swank/backend:save-image image-file - (let ((c swank::*emacs-connection*)) - (lambda () (resurrect c)))) - (format nil "Dumped lisp to ~A" image-file)) - -(defslimefun restore-snapshot (image-file) - (let* ((conn swank::*emacs-connection*) - (stream (swank::connection.socket-io conn)) - (clone (swank/backend:dup (swank/backend:socket-fd stream))) - (style (swank::connection.communication-style conn)) - (repl (if (swank::connection.user-io conn) t)) - (args (list "--swank-fd" (format nil "~d" clone) - "--swank-style" (format nil "~s" style) - "--swank-repl" (format nil "~s" repl)))) - (swank::close-connection conn nil nil) - (swank/backend:exec-image image-file args))) - -(defslimefun background-save-snapshot (image-file) - (let ((connection swank::*emacs-connection*)) - (flet ((complete (success) - (let ((swank::*emacs-connection* connection)) - (swank::background-message - "Dumping lisp image ~A ~:[failed!~;succeeded.~]" - image-file success))) - (awaken () - (resurrect connection))) - (swank/backend:background-save-image image-file - :restart-function #'awaken - :completion-function #'complete) - (format nil "Started dumping lisp to ~A..." image-file)))) - -(in-package :swank) - -(defun swank-snapshot::resurrect (old-connection) - (setq *log-output* nil) - (init-log-output) - (clear-event-history) - (setq *connections* (delete old-connection *connections*)) - (format *error-output* "args: ~s~%" (command-line-args)) - (let* ((fd (read-command-line-arg "--swank-fd")) - (style (read-command-line-arg "--swank-style")) - (repl (read-command-line-arg "--swank-repl")) - (* (format *error-output* "fd=~s style=~s~%" fd style)) - (stream (make-fd-stream fd nil)) - (connection (make-connection nil stream style))) - (let ((*emacs-connection* connection)) - (when repl (swank-repl:create-repl nil)) - (background-message "~A" "Lisp image restored")) - (serve-requests connection) - (simple-repl))) - -(defun read-command-line-arg (name) - (let* ((args (command-line-args)) - (pos (position name args :test #'equal))) - (read-from-string (elt args (1+ pos))))) - -(in-package :swank-snapshot) - -(provide :swank-snapshot) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-sprof.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-sprof.lisp deleted file mode 100644 index 675240f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-sprof.lisp +++ /dev/null @@ -1,154 +0,0 @@ -;;; swank-sprof.lisp -;; -;; Authors: Juho Snellman -;; -;; License: MIT -;; - -(in-package :swank) - -#+sbcl -(eval-when (:compile-toplevel :load-toplevel :execute) - (require :sb-sprof)) - -#+sbcl(progn - -(defvar *call-graph* nil) -(defvar *node-numbers* nil) -(defvar *number-nodes* nil) - -(defun frame-name (name) - (if (consp name) - (case (first name) - ((sb-c::xep sb-c::tl-xep - sb-c::&more-processor - sb-c::top-level-form - sb-c::&optional-processor) - (second name)) - (sb-pcl::fast-method - (cdr name)) - ((flet labels lambda) - (let* ((in (member :in name))) - (if (stringp (cadr in)) - (append (ldiff name in) (cddr in)) - name))) - (t - name)) - name)) - -(defun pretty-name (name) - (let ((*package* (find-package :common-lisp-user)) - (*print-right-margin* most-positive-fixnum)) - (format nil "~S" (frame-name name)))) - -(defun samples-percent (count) - (sb-sprof::samples-percent *call-graph* count)) - -(defun node-values (node) - (values (pretty-name (sb-sprof::node-name node)) - (samples-percent (sb-sprof::node-count node)) - (samples-percent (sb-sprof::node-accrued-count node)))) - -(defun filter-swank-nodes (nodes) - (let ((swank-packages (load-time-value - (mapcar #'find-package - '(swank swank/rpc swank/mop - swank/match swank/backend))))) - (remove-if (lambda (node) - (let ((name (sb-sprof::node-name node))) - (and (symbolp name) - (member (symbol-package name) swank-packages - :test #'eq)))) - nodes))) - -(defun serialize-call-graph (&key exclude-swank) - (let ((nodes (sb-sprof::call-graph-flat-nodes *call-graph*))) - (when exclude-swank - (setf nodes (filter-swank-nodes nodes))) - (setf nodes (sort (copy-list nodes) #'> - ;; :key #'sb-sprof::node-count))) - :key #'sb-sprof::node-accrued-count)) - (setf *number-nodes* (make-hash-table)) - (setf *node-numbers* (make-hash-table)) - (loop for node in nodes - for i from 1 - with total = 0 - collect (multiple-value-bind (name self cumulative) - (node-values node) - (setf (gethash node *node-numbers*) i - (gethash i *number-nodes*) node) - (incf total self) - (list i name self cumulative total)) into list - finally (return - (let ((rest (- 100 total))) - (return (append list - `((nil "Elsewhere" ,rest nil nil))))))))) - -(defslimefun swank-sprof-get-call-graph (&key exclude-swank) - (when (setf *call-graph* (sb-sprof:report :type nil)) - (serialize-call-graph :exclude-swank exclude-swank))) - -(defslimefun swank-sprof-expand-node (index) - (let* ((node (gethash index *number-nodes*))) - (labels ((caller-count (v) - (loop for e in (sb-sprof::vertex-edges v) do - (when (eq (sb-sprof::edge-vertex e) node) - (return-from caller-count (sb-sprof::call-count e)))) - 0) - (serialize-node (node count) - (etypecase node - (sb-sprof::cycle - (list (sb-sprof::cycle-index node) - (sb-sprof::cycle-name node) - (samples-percent count))) - (sb-sprof::node - (let ((name (node-values node))) - (list (gethash node *node-numbers*) - name - (samples-percent count))))))) - (list :callers (loop for node in - (sort (copy-list (sb-sprof::node-callers node)) #'> - :key #'caller-count) - collect (serialize-node node - (caller-count node))) - :calls (let ((edges (sort (copy-list (sb-sprof::vertex-edges node)) - #'> - :key #'sb-sprof::call-count))) - (loop for edge in edges - collect - (serialize-node (sb-sprof::edge-vertex edge) - (sb-sprof::call-count edge)))))))) - -(defslimefun swank-sprof-disassemble (index) - (let* ((node (gethash index *number-nodes*)) - (debug-info (sb-sprof::node-debug-info node))) - (with-output-to-string (s) - (typecase debug-info - (sb-impl::code-component - (sb-disassem::disassemble-memory (sb-vm::code-instructions debug-info) - (sb-vm::%code-code-size debug-info) - :stream s)) - (sb-di::compiled-debug-fun - (let ((component (sb-di::compiled-debug-fun-component debug-info))) - (sb-disassem::disassemble-code-component component :stream s))) - (t `(:error "No disassembly available")))))) - -(defslimefun swank-sprof-source-location (index) - (let* ((node (gethash index *number-nodes*)) - (debug-info (sb-sprof::node-debug-info node))) - (or (when (typep debug-info 'sb-di::compiled-debug-fun) - (let* ((component (sb-di::compiled-debug-fun-component debug-info)) - (function (sb-kernel::%code-entry-points component))) - (when function - (find-source-location function)))) - `(:error "No source location available")))) - -(defslimefun swank-sprof-start (&key (mode :cpu)) - (sb-sprof:start-profiling :mode mode)) - -(defslimefun swank-sprof-stop () - (sb-sprof:stop-profiling)) - -) - -(provide :swank-sprof) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-trace-dialog.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-trace-dialog.lisp deleted file mode 100644 index 5cf95fd..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-trace-dialog.lisp +++ /dev/null @@ -1,264 +0,0 @@ -(defpackage :swank-trace-dialog - (:use :cl) - (:import-from :swank :defslimefun :from-string :to-string) - (:export #:clear-trace-tree - #:dialog-toggle-trace - #:dialog-trace - #:dialog-traced-p - #:dialog-untrace - #:dialog-untrace-all - #:inspect-trace-part - #:report-partial-tree - #:report-specs - #:report-total - #:report-trace-detail - #:report-specs - #:trace-format - #:still-inside - #:exited-non-locally - #:*record-backtrace* - #:*traces-per-report* - #:*dialog-trace-follows-trace* - #:find-trace-part - #:find-trace)) - -(in-package :swank-trace-dialog) - -(defparameter *record-backtrace* nil - "Record a backtrace of the last 20 calls for each trace. - -Beware that this may have a drastic performance impact on your -program.") - -(defparameter *traces-per-report* 150 - "Number of traces to report to emacs in each batch.") - - -;;;; `trace-entry' model -;;;; -(defvar *traces* (make-array 1000 :fill-pointer 0 - :adjustable t)) - -(defvar *trace-lock* (swank/backend:make-lock :name "swank-trace-dialog lock")) - -(defvar *current-trace-by-thread* (make-hash-table)) - -(defclass trace-entry () - ((id :reader id-of) - (children :accessor children-of :initform nil) - (backtrace :accessor backtrace-of :initform (when *record-backtrace* - (useful-backtrace))) - - (spec :initarg :spec :accessor spec-of - :initform (error "must provide a spec")) - (args :initarg :args :accessor args-of - :initform (error "must provide args")) - (parent :initarg :parent :reader parent-of - :initform (error "must provide a parent, even if nil")) - (retlist :initarg :retlist :accessor retlist-of - :initform 'still-inside))) - -(defmethod initialize-instance :after ((entry trace-entry) &rest initargs) - (declare (ignore initargs)) - (if (parent-of entry) - (nconc (children-of (parent-of entry)) (list entry))) - (swank/backend:call-with-lock-held - *trace-lock* - #'(lambda () - (setf (slot-value entry 'id) (fill-pointer *traces*)) - (vector-push-extend entry *traces*)))) - -(defmethod print-object ((entry trace-entry) stream) - (print-unreadable-object (entry stream) - (format stream "~a: ~a" (id-of entry) (spec-of entry)))) - -(defun completed-p (trace) (not (eq (retlist-of trace) 'still-inside))) - -(defun find-trace (id) - (when (<= 0 id (1- (length *traces*))) - (aref *traces* id))) - -(defun find-trace-part (id part-id type) - (let* ((trace (find-trace id)) - (l (and trace - (ecase type - (:arg (args-of trace)) - (:retval (swank::ensure-list (retlist-of trace))))))) - (values (nth part-id l) - (< part-id (length l))))) - -(defun useful-backtrace () - (swank/backend:call-with-debugging-environment - #'(lambda () - (loop for i from 0 - for frame in (swank/backend:compute-backtrace 0 20) - collect (list i (swank::frame-to-string frame)))))) - -(defun current-trace () - (gethash (swank/backend:current-thread) *current-trace-by-thread*)) - -(defun (setf current-trace) (trace) - (setf (gethash (swank/backend:current-thread) *current-trace-by-thread*) - trace)) - - -;;;; Control of traced specs -;;; -(defvar *traced-specs* '()) - -(defslimefun dialog-trace (spec) - (flet ((before-hook (args) - (setf (current-trace) (make-instance 'trace-entry - :spec spec - :args args - :parent (current-trace)))) - (after-hook (retlist) - (let ((trace (current-trace))) - (when trace - ;; the current trace might have been wiped away if the - ;; user cleared the tree in the meantime. no biggie, - ;; don't do anything. - ;; - (setf (retlist-of trace) retlist - (current-trace) (parent-of trace)))))) - (when (dialog-traced-p spec) - (warn "~a is apparently already traced! Untracing and retracing." spec) - (dialog-untrace spec)) - (swank/backend:wrap spec 'trace-dialog - :before #'before-hook - :after #'after-hook) - (pushnew spec *traced-specs*) - (format nil "~a is now traced for trace dialog" spec))) - -(defslimefun dialog-untrace (spec) - (swank/backend:unwrap spec 'trace-dialog) - (setq *traced-specs* (remove spec *traced-specs* :test #'equal)) - (format nil "~a is now untraced for trace dialog" spec)) - -(defslimefun dialog-toggle-trace (spec) - (if (dialog-traced-p spec) - (dialog-untrace spec) - (dialog-trace spec))) - -(defslimefun dialog-traced-p (spec) - (find spec *traced-specs* :test #'equal)) - -(defslimefun dialog-untrace-all () - (untrace) - (mapcar #'dialog-untrace *traced-specs*)) - -(defparameter *dialog-trace-follows-trace* nil) - -(setq swank:*after-toggle-trace-hook* - #'(lambda (spec traced-p) - (when *dialog-trace-follows-trace* - (cond (traced-p - (dialog-trace spec) - "traced for trace dialog as well") - (t - (dialog-untrace spec) - "untraced for the trace dialog as well"))))) - - -;;;; A special kind of trace call -;;; -(defun trace-format (format-spec &rest format-args) - "Make a string from FORMAT-SPEC and FORMAT-ARGS and as a trace." - (let* ((line (apply #'format nil format-spec format-args))) - (make-instance 'trace-entry :spec line - :args format-args - :parent (current-trace) - :retlist nil))) - - -;;;; Reporting to emacs -;;; -(defparameter *visitor-idx* 0) - -(defparameter *visitor-key* nil) - -(defvar *unfinished-traces* '()) - -(defun describe-trace-for-emacs (trace) - `(,(id-of trace) - ,(and (parent-of trace) (id-of (parent-of trace))) - ,(spec-of trace) - ,(loop for arg in (args-of trace) - for i from 0 - collect (list i (swank::to-line arg))) - ,(loop for retval in (swank::ensure-list (retlist-of trace)) - for i from 0 - collect (list i (swank::to-line retval))))) - -(defslimefun report-partial-tree (key) - (unless (equal key *visitor-key*) - (setq *visitor-idx* 0 - *visitor-key* key)) - (let* ((recently-finished - (loop with i = 0 - for trace in *unfinished-traces* - while (< i *traces-per-report*) - when (completed-p trace) - collect trace - and do - (incf i) - (setq *unfinished-traces* - (remove trace *unfinished-traces*)))) - (new (loop for i - from (length recently-finished) - below *traces-per-report* - while (< *visitor-idx* (length *traces*)) - for trace = (aref *traces* *visitor-idx*) - collect trace - unless (completed-p trace) - do (push trace *unfinished-traces*) - do (incf *visitor-idx*)))) - (list - (mapcar #'describe-trace-for-emacs - (append recently-finished new)) - (- (length *traces*) *visitor-idx*) - key))) - -(defslimefun report-trace-detail (trace-id) - (swank::call-with-bindings - swank::*inspector-printer-bindings* - #'(lambda () - (let ((trace (find-trace trace-id))) - (when trace - (append - (describe-trace-for-emacs trace) - (list (backtrace-of trace) - (swank::to-line trace)))))))) - -(defslimefun report-specs () - (sort (copy-list *traced-specs*) - #'string< - :key #'princ-to-string)) - -(defslimefun report-total () - (length *traces*)) - -(defslimefun clear-trace-tree () - (setf *current-trace-by-thread* (clrhash *current-trace-by-thread*) - *visitor-key* nil - *unfinished-traces* nil) - (swank/backend:call-with-lock-held - *trace-lock* - #'(lambda () (setf (fill-pointer *traces*) 0))) - nil) - -;; HACK: `swank::*inspector-history*' is unbound by default and needs -;; a reset in that case so that it won't error `swank::inspect-object' -;; before any other object is inspected in the slime session. -;; -(unless (boundp 'swank::*inspector-history*) - (swank::reset-inspector)) - -(defslimefun inspect-trace-part (trace-id part-id type) - (multiple-value-bind (obj found) - (find-trace-part trace-id part-id type) - (if found - (swank::inspect-object obj) - (error "No object found with ~a, ~a and ~a" trace-id part-id type)))) - -(provide :swank-trace-dialog) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-util.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-util.lisp deleted file mode 100644 index 72743ba..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank-util.lisp +++ /dev/null @@ -1,63 +0,0 @@ -;;; swank-util.lisp --- stuff of questionable utility -;; -;; License: public domain - -(in-package :swank) - -(defmacro do-symbols* ((var &optional (package '*package*) result-form) - &body body) - "Just like do-symbols, but makes sure a symbol is visited only once." - (let ((seen-ht (gensym "SEEN-HT"))) - `(let ((,seen-ht (make-hash-table :test #'eq))) - (do-symbols (,var ,package ,result-form) - (unless (gethash ,var ,seen-ht) - (setf (gethash ,var ,seen-ht) t) - (tagbody ,@body)))))) - -(defun classify-symbol (symbol) - "Returns a list of classifiers that classify SYMBOL according to its -underneath objects (e.g. :BOUNDP if SYMBOL constitutes a special -variable.) The list may contain the following classification -keywords: :BOUNDP, :FBOUNDP, :CONSTANT, :GENERIC-FUNCTION, -:TYPESPEC, :CLASS, :MACRO, :SPECIAL-OPERATOR, and/or :PACKAGE" - (check-type symbol symbol) - (flet ((type-specifier-p (s) - (or (documentation s 'type) - (not (eq (type-specifier-arglist s) :not-available))))) - (let (result) - (when (boundp symbol) (push (if (constantp symbol) - :constant :boundp) result)) - (when (fboundp symbol) (push :fboundp result)) - (when (type-specifier-p symbol) (push :typespec result)) - (when (find-class symbol nil) (push :class result)) - (when (macro-function symbol) (push :macro result)) - (when (special-operator-p symbol) (push :special-operator result)) - (when (find-package symbol) (push :package result)) - (when (and (fboundp symbol) - (typep (ignore-errors (fdefinition symbol)) - 'generic-function)) - (push :generic-function result)) - result))) - -(defun symbol-classification-string (symbol) - "Return a string in the form -f-c---- where each letter stands for -boundp fboundp generic-function class macro special-operator package" - (let ((letters "bfgctmsp") - (result (copy-seq "--------"))) - (flet ((flip (letter) - (setf (char result (position letter letters)) - letter))) - (when (boundp symbol) (flip #\b)) - (when (fboundp symbol) - (flip #\f) - (when (typep (ignore-errors (fdefinition symbol)) - 'generic-function) - (flip #\g))) - (when (type-specifier-p symbol) (flip #\t)) - (when (find-class symbol nil) (flip #\c) ) - (when (macro-function symbol) (flip #\m)) - (when (special-operator-p symbol) (flip #\s)) - (when (find-package symbol) (flip #\p)) - result))) - -(provide :swank-util) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank.rb b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank.rb deleted file mode 100644 index 6993649..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/swank.rb +++ /dev/null @@ -1,385 +0,0 @@ -# swank.rb --- swank server for Ruby. -# -# This is my first Ruby program and looks probably rather strange. Some -# people write Scheme interpreters when learning new languages, I -# write swank backends. -# -# Only a few things work. -# 1. Start the server with something like: ruby -r swank -e swank -# 2. Use M-x slime-connect to establish a connection - -require "socket" - -def swank(port=4005) - accept_connections port, false -end - -def start_swank(port_file) - accept_connections false, port_file -end - -def accept_connections(port, port_file) - server = TCPServer.new("localhost", port || 0) - puts "Listening on #{server.addr.inspect}\n" - if port_file - write_port_file server.addr[1], port_file - end - socket = begin server.accept ensure server.close end - begin - serve socket.to_io - ensure - socket.close - end -end - -def write_port_file(port, filename) - File.open(filename, File::CREAT|File::EXCL|File::WRONLY) do |f| - f.puts port - end -end - -def serve(io) - main_loop(io) -end - -def main_loop(io) - c = Connection.new(io) - while true - catch :swank_top_level do - c.dispatch(read_packet(io)) - end - end -end - -class Connection - - def initialize(io) - @io = io - end - - def dispatch(event) - puts "dispatch: %s\n" % event.inspect - case event[0] - when :":emacs-rex" - emacs_rex *event[1..4] - else raise "Unhandled event: #{event.inspect}" - end - end - - def send_to_emacs(obj) - payload = write_sexp_to_string(obj) - @io.write("%06x" % payload.length) - @io.write payload - @io.flush - end - - def emacs_rex(form, pkg, thread, id) - proc = $rpc_entries[form[0]] - args = form[1..-1]; - begin - raise "Undefined function: #{form[0]}" unless proc - value = proc[*args] - rescue Exception => exc - begin - pseudo_debug exc - ensure - send_to_emacs [:":return", [:":abort"], id] - end - else - send_to_emacs [:":return", [:":ok", value], id] - end - end - - def pseudo_debug(exc) - level = 1 - send_to_emacs [:":debug", 0, level] + sldb_info(exc, 0, 20) - begin - sldb_loop exc - ensure - send_to_emacs [:":debug-return", 0, level, :nil] - end - end - - def sldb_loop(exc) - $sldb_context = [self,exc] - while true - dispatch(read_packet(@io)) - end - end - - def sldb_info(exc, start, _end) - [[exc.to_s, - " [%s]" % exc.class.name, - :nil], - sldb_restarts(exc), - sldb_backtrace(exc, start, _end), - []] - end - - def sldb_restarts(exc) - [["Quit", "SLIME top-level."]] - end - - def sldb_backtrace(exc, start, _end) - bt = [] - exc.backtrace[start.._end].each_with_index do |frame, i| - bt << [i, frame] - end - bt - end - - def frame_src_loc(exc, frame) - string = exc.backtrace[frame] - match = /([^:]+):([0-9]+)/.match(string) - if match - file,line = match[1..2] - [:":location", [:":file", file], [:":line", line.to_i], :nil] - else - [:":error", "no src-loc for frame: #{string}"] - end - end - -end - -$rpc_entries = Hash.new - -$rpc_entries[:"swank:connection-info"] = lambda do || - [:":pid", $$, - :":package", [:":name", "ruby", :":prompt", "ruby> "], - :":lisp-implementation", [:":type", "Ruby", - :":name", "ruby", - :":version", RUBY_VERSION]] -end - -def swank_interactive_eval(string) - eval(string,TOPLEVEL_BINDING).inspect -end - -$rpc_entries[:"swank:interactive-eval"] = \ -$rpc_entries[:"swank:interactive-eval-region"] = \ -$rpc_entries[:"swank:pprint-eval"] = lambda { |string| - swank_interactive_eval string -} - -$rpc_entries[:"swank:throw-to-toplevel"] = lambda { - throw :swank_top_level -} - -$rpc_entries[:"swank:backtrace"] = lambda do |from, to| - conn, exc = $sldb_context - conn.sldb_backtrace(exc, from, to) -end - -$rpc_entries[:"swank:frame-source-location"] = lambda do |frame| - conn, exc = $sldb_context - conn.frame_src_loc(exc, frame) -end - -#ignored -$rpc_entries[:"swank:buffer-first-change"] = \ -$rpc_entries[:"swank:operator-arglist"] = lambda do - :nil -end - -$rpc_entries[:"swank:simple-completions"] = lambda do |prefix, pkg| - swank_simple_completions prefix, pkg -end - -# def swank_simple_completions(prefix, pkg) - -def read_packet(io) - header = read_chunk(io, 6) - len = header.hex - payload = read_chunk(io, len) - #$deferr.puts payload.inspect - read_sexp_from_string(payload) -end - -def read_chunk(io, len) - buffer = io.read(len) - raise "short read" if buffer.length != len - buffer -end - -def write_sexp_to_string(obj) - string = "" - write_sexp_to_string_loop obj, string - string -end - -def write_sexp_to_string_loop(obj, string) - if obj.is_a? String - string << "\"" - string << obj.gsub(/(["\\])/,'\\\\\1') - string << "\"" - elsif obj.is_a? Array - string << "(" - max = obj.length-1 - obj.each_with_index do |e,i| - write_sexp_to_string_loop e, string - string << " " unless i == max - end - string << ")" - elsif obj.is_a? Symbol or obj.is_a? Numeric - string << obj.to_s - elsif obj == false - string << "nil" - elsif obj == true - string << "t" - else raise "Can't write: #{obj.inspect}" - end -end - -def read_sexp_from_string(string) - stream = StringInputStream.new(string) - reader = LispReader.new(stream) - reader.read -end - -class LispReader - def initialize(io) - @io = io - end - - def read(allow_consing_dot=false) - skip_whitespace - c = @io.getc - case c - when ?( then read_list(true) - when ?" then read_string - when ?' then read_quote - when nil then raise EOFError.new("EOF during read") - else - @io.ungetc(c) - obj = read_number_or_symbol - if obj == :"." and not allow_consing_dot - raise "Consing-dot in invalid context" - end - obj - end - end - - def read_list(head) - list = [] - loop do - skip_whitespace - c = @io.readchar - if c == ?) - break - else - @io.ungetc(c) - obj = read(!head) - if obj == :"." - error "Consing-dot not implemented" # would need real conses - end - head = false - list << obj - end - end - list - end - - def read_string - string = "" - loop do - c = @io.getc - case c - when ?" - break - when ?\\ - c = @io.getc - case c - when ?\\, ?" then string << c - else raise "Invalid escape char: \\%c" % c - end - else - string << c - end - end - string - end - - def read_quote - [:quote, read] - end - - def read_number_or_symbol - token = read_token - if token.empty? - raise EOFError.new - elsif /^[0-9]+$/.match(token) - token.to_i - elsif /^[0-9]+\.[0-9]+$/.match(token) - token.to_f - else - token.intern - end - end - - def read_token - token = "" - loop do - c = @io.getc - if c.nil? - break - elsif terminating?(c) - @io.ungetc(c) - break - else - token << c - end - end - token - end - - def skip_whitespace - loop do - c = @io.getc - case c - when ?\s, ?\n, ?\t then next - when nil then break - else @io.ungetc(c); break - end - end - end - - def terminating?(char) - " \n\t()\"'".include?(char) - end - -end - - -class StringInputStream - def initialize(string) - @string = string - @pos = 0 - @max = string.length - end - - def pos() @pos end - - def getc - if @pos == @max - nil - else - c = @string[@pos] - @pos += 1 - c - end - end - - def readchar - getc or raise EOFError.new - end - - def ungetc(c) - if @pos > 0 && @string[@pos-1] == c - @pos -= 1 - else - raise "Invalid argument: %c [at %d]" % [c, @pos] - end - end - -end - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-autodoc-tests.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-autodoc-tests.el deleted file mode 100644 index 1f4b199..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-autodoc-tests.el +++ /dev/null @@ -1,199 +0,0 @@ -(require 'slime-autodoc) -(require 'slime-tests) -(require 'cl-lib) - -(defun slime-autodoc-to-string () - "Retrieve and return autodoc for form at point." - (let ((autodoc (car (slime-eval - `(swank:autodoc - ',(slime-autodoc--parse-context) - :print-right-margin - ,(window-width (minibuffer-window))))))) - (if (eq autodoc :not-available) - :not-available - (slime-autodoc--canonicalize-whitespace autodoc)))) - -(defun slime-check-autodoc-at-point (arglist) - (slime-test-expect (format "Autodoc in `%s' (at %d) is as expected" - (buffer-string) (point)) - arglist - (slime-autodoc-to-string))) - -(defmacro define-autodoc-tests (&rest specs) - `(progn - ,@(cl-loop - for (buffer-sexpr wished-arglist . options) - in specs - for fails-for = (plist-get options :fails-for) - for skip-trailing-test-p = (plist-get options :skip-trailing-test-p) - for i from 1 - when (featurep 'ert) - collect `(define-slime-ert-test ,(intern (format "autodoc-tests-%d" i)) - () - ,(format "Check autodoc works ok for %s" buffer-sexpr) - ,@(if fails-for - `(:expected-result - '(satisfies - (lambda (result) - (ert-test-result-type-p - result - (if (member (slime-lisp-implementation-name) - ',fails-for) - :failed - :passed)))))) - (slime-sync-to-top-level 0.3) - (slime-check-top-level) - (with-temp-buffer - (setq slime-buffer-package "COMMON-LISP-USER") - (lisp-mode) - (insert ,buffer-sexpr) - (search-backward "*HERE*") - (delete-region (match-beginning 0) (match-end 0)) - (should (equal ,wished-arglist - (slime-autodoc-to-string))) - (unless ,skip-trailing-test-p - (insert ")") (backward-char) - (should (equal ,wished-arglist - (slime-autodoc-to-string))))) - (slime-sync-to-top-level 0.3))))) - -(define-autodoc-tests - ;; Test basics - ("(swank::emacs-connected*HERE*" "(emacs-connected)") - ("(swank::emacs-connected *HERE*" "(emacs-connected)") - ("(swank::create-socket*HERE*" - "(create-socket host port &key backlog)") - ("(swank::create-socket *HERE*" - "(create-socket ===> host <=== port &key backlog)") - ("(swank::create-socket foo *HERE*" - "(create-socket host ===> port <=== &key backlog)") - - ;; Test that autodoc differentiates between exported and - ;; unexported symbols. - ("(swank:create-socket*HERE*" :not-available) - - ;; Test if cursor is on non-existing required parameter - ("(swank::create-socket foo bar *HERE*" - "(create-socket host port &key backlog)") - - ;; Test cursor in front of opening parenthesis - ("(swank::with-struct *HERE*(foo. x y) *struct* body1)" - "(with-struct (conc-name &rest names) obj &body body)" - :skip-trailing-test-p t) - - ;; Test variable content display - ("(progn swank::default-server-port*HERE*" - "DEFAULT-SERVER-PORT => 4005") - - ;; Test that "variable content display" is not triggered for - ;; trivial constants. - ("(swank::create-socket t*HERE*" - "(create-socket ===> host <=== port &key backlog)") - ("(swank::create-socket :foo*HERE*" - "(create-socket ===> host <=== port &key backlog)") - - ;; Test with syntactic sugar - ("#'(lambda () (swank::create-socket*HERE*" - "(create-socket host port &key backlog)") - ("`(lambda () ,(swank::create-socket*HERE*" - "(create-socket host port &key backlog)") - ("(remove-if #'(lambda () (swank::create-socket*HERE*" - "(create-socket host port &key backlog)") - ("`(remove-if #'(lambda () ,@(swank::create-socket*HERE*" - "(create-socket host port &key backlog)") - - ;; Test &optional - ("(swank::symbol-status foo *HERE*" - "(symbol-status symbol &optional\ - ===> (package (symbol-package symbol)) <===)" :fails-for ("allegro" "ccl")) - - ;; Test context-sensitive autodoc (DEFMETHOD) - ("(defmethod swank::arglist-dispatch (*HERE*" - "(defmethod arglist-dispatch\ - (===> operator <=== arguments) &body body)") - ("(defmethod swank::arglist-dispatch :before (*HERE*" - "(defmethod arglist-dispatch :before\ - (===> operator <=== arguments) &body body)") - - ;; Test context-sensitive autodoc (APPLY) - ("(apply 'swank::eval-for-emacs*HERE*" - "(apply 'eval-for-emacs &optional form buffer-package id &rest args)") - ("(apply #'swank::eval-for-emacs*HERE*" - "(apply #'eval-for-emacs &optional form buffer-package id &rest args)" :fails-for ("ccl")) - ("(apply 'swank::eval-for-emacs foo *HERE*" - "(apply 'eval-for-emacs &optional form\ - ===> buffer-package <=== id &rest args)") - ("(apply #'swank::eval-for-emacs foo *HERE*" - "(apply #'eval-for-emacs &optional form\ - ===> buffer-package <=== id &rest args)" :fails-for ("ccl")) - - ;; Test context-sensitive autodoc (ERROR, CERROR) - ("(error 'simple-condition*HERE*" - "(error 'simple-condition &rest arguments\ - &key format-arguments format-control)" :fails-for ("ccl")) - ("(cerror \"Foo\" 'simple-condition*HERE*" - "(cerror \"Foo\" 'simple-condition\ - &rest arguments &key format-arguments format-control)" - :fails-for ("allegro" "ccl")) - - ;; Test &KEY and nested arglists - ("(swank::with-retry-restart (:msg *HERE*" - "(with-retry-restart (&key ===> (msg \"Retry.\") <===) &body body)" - :fails-for ("allegro" "ccl")) - ("(swank::with-retry-restart (:msg *HERE*(foo" - "(with-retry-restart (&key ===> (msg \"Retry.\") <===) &body body)" - :skip-trailing-test-p t - :fails-for ("allegro" "ccl")) - ("(swank::start-server \"/tmp/foo\" :dont-close *HERE*" - "(start-server port-file &key (style swank:*communication-style*)\ - ===> (dont-close swank:*dont-close*) <===)" - :fails-for ("allegro" "ccl")) - - ;; Test declarations and type specifiers - ("(declare (string *HERE*" - "(declare (string &rest ===> variables <===))" - :fails-for ("allegro") :fails-for ("ccl")) - ("(declare ((string *HERE*" - "(declare ((string &optional ===> size <===) &rest variables))") - ("(declare (type (string *HERE*" - "(declare (type (string &optional ===> size <===) &rest variables))") - - ;; Test local functions - ("(flet ((foo (x y) (+ x y))) (foo *HERE*" "(foo ===> x <=== y)") - ("(macrolet ((foo (x y) `(+ ,x ,y))) (foo *HERE*" "(foo ===> x <=== y)") - ("(labels ((foo (x y) (+ x y))) (foo *HERE*" "(foo ===> x <=== y)") - ("(labels ((foo (x y) (+ x y)) - (bar (y) (foo *HERE*" - "(foo ===> x <=== y)" :fails-for ("cmucl" "sbcl" "allegro" "ccl"))) - -(def-slime-test autodoc-space - (input-keys expected-message) - "Emulate the inserting something followed by the space key -event and verify that the right thing appears in the echo -area (after a short delay)." - '(("( s w a n k : : o p e r a t o r - a r g l i s t SPC" - "(operator-arglist name package)")) - (when noninteractive - (slime-skip-test "Can't use unread-command-events in batch mode")) - (let* ((keys (eval `(kbd ,input-keys))) - (tag (cons nil nil)) - (timerfun (lambda (tag) (throw tag nil))) - (timer (run-with-timer 0.1 nil timerfun tag))) - (with-temp-buffer - (lisp-mode) - (unwind-protect - (catch tag - (message nil) - (select-window (display-buffer (current-buffer) t)) - (setq unread-command-events (listify-key-sequence keys)) - (accept-process-output) - (recursive-edit)) - (setq unread-command-events nil) - (cancel-timer timer)) - (slime-test-expect "Message after SPC" - expected-message (current-message)) - (accept-process-output nil (* eldoc-idle-delay 2)) - (slime-test-expect "Message after edloc delay" - expected-message (current-message))))) - -(provide 'slime-autodoc-tests) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-c-p-c-tests.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-c-p-c-tests.el deleted file mode 100644 index 772cc40..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-c-p-c-tests.el +++ /dev/null @@ -1,140 +0,0 @@ -(require 'slime-c-p-c) -(require 'slime-tests) - -(def-slime-test completions - (prefix expected-completions) - "Find the completions of a symbol-name prefix." - '(("cl:compile" (("cl:compile" "cl:compile-file" "cl:compile-file-pathname" - "cl:compiled-function" "cl:compiled-function-p" - "cl:compiler-macro" "cl:compiler-macro-function") - "cl:compile")) - ("cl:foobar" nil) - ("swank::compile-file" (("swank::compile-file" - "swank::compile-file-for-emacs" - "swank::compile-file-if-needed" - "swank::compile-file-output" - "swank::compile-file-pathname") - "swank::compile-file")) - ("cl:m-v-l" (("cl:multiple-value-list" "cl:multiple-values-limit") "cl:multiple-value")) - ("common-lisp" (("common-lisp-user:" "common-lisp:") "common-lisp"))) - (let ((completions (slime-completions prefix))) - (slime-test-expect "Completion set" expected-completions completions))) - -(def-slime-test complete-symbol* - (buffer-sexp wished-completion &optional chosen-completion fancy unambiguous) - "Ensure that completions are correctly inserted." - '(("cl:and" "cl:and") - ("(cl:and" "(cl:and") - ("(cl:and)" "(cl:and)") - ("(cl:and)" "(cl:and)" nil nil t) - ;; Fancy completion of a form that accepts arguments should - ;; insert a space after the completed form. - ("(cl:and)" "(cl:and )" nil t) - ;; ...but only for symbols in the funcall position. - ("cl:and" "cl:and" nil t) - ;; Fancy completion of a form without arguments should insert a - ;; closing paren. - ("(cl:get-internal-run-time" "(cl:get-internal-run-time)" nil t) - ;; ...but only for symbols in the funcall position. - ("cl:get-internal-run-time" "cl:get-internal-run-time" nil t) - ("cl:m-v-b" "cl:multiple-value-bind") - ("cl:m-v-l" "cl:multiple-value-list" "cl:multiple-value-list") - ;; Fancy completion is only done for unique completions. This is - ;; not a hard requirement, and might change in the future. This - ;; test is included merely to document the current behavior. - ("(cl:m-v-l)" "(cl:multiple-value-list)" "cl:multiple-value-list" t) - ("cl:mult" "cl:multiple-value-call" "cl:multiple-value-call") - ("cl:multiple-value" "cl:multiple-value-setq" "cl:multiple-value-setq") - ("cl:compile" "cl:compile" "cl:compile") - ("cl:compile" "cl:compile-file" "cl:compile-file") - ("cl:f-o" "cl:force-output" "cl:force-output") - ;; When `slime-c-p-c-unambiguous-prefix-p' is non nil, - ;; `slime-complete-symbol*' will move point back to the - ;; unambiguous portion of the prefix; however, the final result - ;; after choosing a completion candidate should be the same. - ("cl:f-o" "cl:force-output" "cl:force-output" nil t) - ("(cl:f-o)" "(cl:force-output)" "cl:force-output" nil t) - ;; Character completions - ("#\\N" "#\\Newline") - ("#\\R" "#\\Return" "#\\Return") - ("#\\R" "#\\Rubout" "#\\Rubout" nil t) - ;; Keyword completions - ("(cl:find 'x '() :)" "(cl:find 'x '() :START)" ":START") - ("(cl:find 'x '() :S)" "(cl:find 'x '() :START)") - ("(cl:find 'x '() :s)" "(cl:find 'x '() :start)") - ("(cl:find 'x '() :s)" "(cl:find 'x '() :start)" nil t) - ("(cl:find 'x '() :t)" "(cl:find 'x '() :test)" ":test") - ("(cl:find 'x '() :t)" "(cl:find 'x '() :test-not)" ":test-not" nil t)) - (slime-check-top-level) - (save-window-excursion - (with-temp-buffer - (lisp-mode) - (setq slime-buffer-package "SWANK") - (insert buffer-sexp) - (when (eq (char-before) ?\)) - (backward-char)) - (let ((slime-c-p-c-unambiguous-prefix-p unambiguous) - (slime-complete-symbol*-fancy fancy)) - (if (not fancy) - (slime-complete-symbol*) - ;; `slime-complete-symbol*-fancy-bit' may call - ;; `execute-kbd-macro', which ultimately operates on the - ;; buffer associated with the selected window, not - ;; necessarily the current buffer. Call `pop-to-buffer' to - ;; ensure that the current buffer is in the selected window - ;; before calling `slime-complete-symbol*'. Fancy completion - ;; might also kick off a `slime-eval-async' in - ;; `slime-echo-arglist', so ensure the output is consumed - ;; with `slime-sync-to-top-level' before continuing. - (pop-to-buffer (current-buffer)) - (slime-complete-symbol*) - (slime-sync-to-top-level 1))) - (when chosen-completion - (with-selected-window slime-completions-window - (goto-char (point-min)) - (search-forward chosen-completion) - (choose-completion))) - (slime-check-completed-form buffer-sexp wished-completion)))) - -(def-slime-test complete-form - (buffer-sexpr wished-completion &optional skip-trailing-test-p) - "" - '(("(defmethod arglist-dispatch *HERE*" - "(defmethod arglist-dispatch (operator arguments) body...)") - ("(with-struct *HERE*" - "(with-struct (conc-name names...) obj body...)") - ("(with-struct *HERE*" - "(with-struct (conc-name names...) obj body...)") - ("(with-struct (*HERE*" - "(with-struct (conc-name names...)" t) - ("(with-struct (foo. bar baz *HERE*" - "(with-struct (foo. bar baz names...)" t)) - (slime-check-top-level) - (with-temp-buffer - (lisp-mode) - (setq slime-buffer-package "SWANK") - (insert buffer-sexpr) - (search-backward "*HERE*") - (delete-region (match-beginning 0) (match-end 0)) - (slime-complete-form) - (slime-check-completed-form buffer-sexpr wished-completion) - - ;; Now the same but with trailing `)' for paredit users... - (unless skip-trailing-test-p - (erase-buffer) - (insert buffer-sexpr) - (search-backward "*HERE*") - (delete-region (match-beginning 0) (match-end 0)) - (insert ")") (backward-char) - (slime-complete-form) - (slime-check-completed-form (concat buffer-sexpr ")") wished-completion)) - )) - -(defun slime-check-completed-form (buffer-sexpr wished-completion) - (slime-test-expect (format "Completed form for `%s' is as expected" - buffer-sexpr) - wished-completion - (buffer-string) - 'equal)) - -(provide 'slime-c-p-c-tests) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-cl-indent-test.txt b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-cl-indent-test.txt deleted file mode 100644 index 71f8744..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-cl-indent-test.txt +++ /dev/null @@ -1,1006 +0,0 @@ -;;;; -*- mode: lisp -*- -;;;; -;;;; This file is .txt, because it's not meant to be evaluated. -;;;; common-lisp-run-indentation-tests in slime-cl-ident.el -;;;; parses this and runs the specified tests. - -;;; Test: indent-1 - -(defun foo () - t) - -;;; Test: indent-2 -;; -;; lisp-lambda-list-keyword-parameter-alignment: nil -;; lisp-lambda-list-keyword-alignment: nil - -(defun foo (foo &optional opt1 - opt2 - &rest rest) - (list foo opt1 opt2 - rest)) - -;;; Test: indent-3 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: nil - -(defun foo (foo &optional opt1 - opt2 - &rest rest) - (list foo opt1 opt2 - rest)) - -;;; Test: indent-4 -;; -;; lisp-lambda-list-keyword-parameter-alignment: nil -;; lisp-lambda-list-keyword-alignment: t - -(defun foo (foo &optional opt1 - opt2 - &rest rest) - (list foo opt1 opt2 - rest)) - -;;; Test: indent-5 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: t - -(defun foo (foo &optional opt1 - opt2 - &rest rest) - (list foo opt1 opt2 - rest)) - -;;; Test: indent-6 -;; -;; lisp-lambda-list-keyword-parameter-alignment: nil -;; lisp-lambda-list-keyword-alignment: nil - -(defmacro foo ((foo &optional opt1 - opt2 - &rest rest)) - (list foo opt1 opt2 - rest)) - -;;; Test: indent-7 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: nil - -(defmacro foo ((foo &optional opt1 - opt2 - &rest rest)) - (list foo opt1 opt2 - rest)) - -;;; Test: indent-8 -;; -;; lisp-lambda-list-keyword-parameter-alignment: nil -;; lisp-lambda-list-keyword-alignment: t - -(defmacro foo ((foo &optional opt1 - opt2 - &rest rest)) - (list foo opt1 opt2 - rest)) - -;;; Test: indent-9 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: t - -(defmacro foo ((foo &optional opt1 - opt2 - &rest rest)) - (list foo opt1 opt2 - rest)) - -;;; Test: indent-10 - -(let ((x y) - (foo #-foo (no-foo) - #+foo (yes-foo)) - (bar #-bar - (no-bar) - #+bar - (yes-bar))) - (list foo bar - x)) - -;;; Test: indent-11 -;; -;; lisp-loop-indent-subclauses: t - -(loop for i from 0 below 2 - for j from 0 below 2 - when foo - do (fubar) - (bar) - (moo) - and collect cash - into honduras - else do ;; this is the body of the first else - ;; the body is ... - (indented to the above comment) - (ZMACS gets this wrong) - and do this - and do that - and when foo - do the-other - and cry - when this-is-a-short-condition do - (body code of the when) - when here's something I used to botch do (here is a body) - (rest of body indented same) - do - (exdented loop body) - (I'm not sure I like this but it's compatible) - when funny-predicate do ;; Here's a comment - (body filled to comment)) - -;;; Test: indent-12 - -(defun foo (x) - (tagbody - foo - (bar) - baz - (when (losing) - (with-big-loser - (yow) - ((lambda () - foo) - big))) - (flet ((foo (bar baz zap) - (zip)) - (zot () - quux)) - (do () - ((lose) - (foo 1)) - (quux) - foo - (lose)) - (cond ((x) - (win 1 2 - (foo))) - (t - (lose - 3)))))) - -;;; Test: indent-13 - -(if* (eq t nil) - then () - () - elseif (dsf) - thenret x - else (balbkj) - (sdf)) - -;;; Test: indent-14 - -(list foo #+foo (foo) - #-foo (no-foo)) - -;;; Test: indent-15 -;; -;; lisp-loop-indent-subclauses: t - -(loop for x in foo1 - for y in quux1 - ) - -;;; Test: indent-16 -;; -;; lisp-loop-indent-subclauses: nil - -(loop for x in foo1 - for y in quux1 - ) - -;;; Test: indent-17 -;; -;; lisp-loop-indent-subclauses: nil -;; lisp-loop-indent-forms-like-keywords: t - -(loop for x in foo - for y in quux - finally (foo) - (fo) - (zoo) - do - (print x) - (print y) - (print 'ok!)) - -;;; Test: indent-18 -;; -;; lisp-loop-indent-subclauses: nil -;; lisp-loop-indent-forms-like-keywords: nil - -(loop for x in foo - for y in quux - finally (foo) - (fo) - (zoo) - do - (print x) - (print y) - (print 'ok!)) - -;;; Test: indent-19 -;; -;; lisp-loop-indent-subclauses: t -;; lisp-loop-indent-forms-like-keywords: nil - -(loop for x in foo - for y in quux - finally (foo) - (fo) - (zoo) - do - (print x) - (print y) - (print 'ok!)) - -;;; Test: indent-20 -;; -;; lisp-loop-indent-subclauses: nil -;; lisp-loop-indent-forms-like-keywords: nil - -(loop for f in files - collect (open f - :direction :output) - do (foo) (bar) - (quux)) - -;;; Test: indent-21 -;; -;; lisp-loop-indent-subclauses: t - -(loop for f in files - collect (open f - :direction :output) - do (foo) (bar) - (quux)) - -;;; Test: indent-22 - -(defsetf foo bar - "the doc string") - -;;; Test: indent-23 - -(defsetf foo - bar - "the doc string") - -;;; Test: indent-24 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t - -(defsetf foo (x y &optional a - z) - (a b c) - stuff) - -;;; Test: indent-25 -;; -;; lisp-align-keywords-in-calls: t - -(make-instance 'foo :bar t :quux t - :zot t) - -;;; Test: indent-26 -;; -;; lisp-align-keywords-in-calls: nil - -(make-instance 'foo :bar t :quux t - :zot t) - -;;; Test: indent-27 -;; -;; lisp-lambda-list-indentation: nil - -(defun example (a b &optional o1 o2 - o3 o4 - &rest r - &key k1 k2 - k3 k4) - 'hello) - -;;; Test: indent-28 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: t - -(destructuring-bind (foo &optional x - y - &key bar - quux) - foo - body) - -;;; Test: indent-29 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: t - -(named-lambda foo - (x &optional y - z - &rest more) - body) - -;;; Test: indent-30 - -(foo fii - (or x - y) t - bar) - -;;; Test: indent-31 - -(foo - (bar)) - -;;; Test: indent-32 -;; -;; comment-indent-function: (lambda () nil) -;; comment-column: nil - -(unknown (;; KLUDGE: comment-indent hackery to get - ;; the comment right. Otherwise we get a - ;; space before the first ;. - bar quux - zot) - (#|fii|# - zot) - ( - quux)) - -;;; Test: indent-33 - -(complex-indent.1 ((x z - f - ((fox foo - foo)) - :note (ding bar quux - zot) - :wait (this! is - a funcall)) - ;; Not 100% sure this should not be a step left. - (abbb) - (abb)) - (bodyform) - (another)) - -;;; Test: indent-34 - -(complex-indent.2 (bar quux - zot) - (a b - c d) - (form1) - (form2)) - -;;; Test: indent-35 - -(complex-indent.3 (:wait fii - (this is - a funcall)) - (bodyform) - (another)) - -;;; Test: indent-36 - -(defmacro foo (body) - `(let (,@(stuff) - ,(more-stuff) - ,(even-more) - (foo foo)) - ,@bofy)) - -;;; Test: indent-37 - -(defun foo () - `(list foo bar - ,@(quux fo - foo))) - -;;; Test: indent-38 - -(defmacro foofoo (body) - `(foo - `(let (,',@,(stuff) - ,(more-stuff) - ,(even-more) - (foo foo)) - ,@bofy))) - -;;; Test: indent-39 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: t - -(defstruct (foo (:constructor make-foo (&optional bar - quux - &key zot - fii))) - bar - quux - zot - fii) - -;;; Test: indent-40 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: t - -(defmethod foo :around (zot &key x - y) - (list zot)) - -;;; Test: indent-41 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: t - -(progn - (defmethod foo :around (fii &key x - y) - (list fii))) - -;;; Test: indent-42 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: t - -(progn - (defgeneric foo (x y &optional a - b) - (:method :around (a b &optional x - y) - (list a b x y)))) - -;;; Test: indent-43 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: t - -(defgeneric foo (x &optional a b) - (:method (x y &optional a - b) - (list x y a b))) - -;;; Test: indent-44 - -(let (definer - foo - bar - quux) - ...) - -;;; Test: indent-45 - -(let (definition - foo - bar - quux) - ...) - -;;; Test: indent-46 - -(let (foo bar - quux) - ...) - -;;; Test: indent-47 - -(with-compilation-unit - (:foo t - :quux nil) - ...) - -;;; Test: indent-48 - -(cond - ((> x y) (foo) - ;; This isn't ideal -- I at least would align with (FOO here. - (bar) (quux) - (zot)) - (qux (foo) - (bar) - (zot)) - (zot - (foo) - (foo2)) - (t (foo) - (bar))) - -;;; Test: indent-49 - -(cond ((> x y) (foo) - ;; This isn't ideal -- I at least would align with (FOO here. - (bar)) - (qux (foo) - (bar)) - (zot - (foo)) - (t (foo) - (bar))) - -;;; Test: indent-50 -;; -;; lisp-lambda-list-keyword-parameter-alignment: nil -;; lisp-lambda-list-keyword-alignment: nil - -(defun foo (x &optional opt1 - opt2 - &rest rest - &allow-other-keys) - (list opt1 opt2 - rest)) - -;;; Test: indent-51 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: nil - -(defun foo (x &optional opt1 - opt2 - &rest rest - &allow-other-keys) - (list opt1 opt2 - rest)) - -;;; Test: indent-52 -;; -;; lisp-lambda-list-keyword-parameter-alignment: nil -;; lisp-lambda-list-keyword-alignment: t - -(defun foo (x &optional opt1 - opt2 - &rest rest - &allow-other-keys) - (list opt1 opt2 - rest)) - -;;; Test: indent-53 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: t - -(defun foo (x &optional opt1 - opt2 - &rest rest - &allow-other-keys) - (list opt1 opt2 - rest)) - -;;; Test: indent-54 -;; - -(loop (foo) - ;; comment - (bar) - (quux)) - -;;; Test: indent-55 -;; - -(loop ;; comment - (foo) - (bar)) - -;;; Test: indent-56 -;; - -(loop - (foo) - ;; comment - (bar)) - - -;;; Test: indent-57 -;; - -(loop - ;; comment - (foo) - (bar)) - -;;; Test: indent-58 -;; -;; lisp-loop-indent-subclauses: t - -(loop ;; comment at toplevel of the loop - with foo = t - do (foo foo) - (foo)) - -;;; Test: indent-59 -;; -;; lisp-loop-indent-subclauses: nil - -(loop ;; comment at toplevel of the loop - with foo = t - do (foo foo) - (foo)) - -;;; Test: indent-60 -;; -;; lisp-loop-indent-subclauses: t - -(loop - ;; comment at toplevel of the loop - with foo = t - do (foo foo)) - -;;; Test: indent-61 -;; -;; lisp-loop-indent-subclauses: nil - -(loop - ;; comment at toplevel of the loop - with foo = t - do (foo foo) - (foo)) - -;;; Test: indent-62 -;; -;; lisp-loop-indent-subclauses: t - -(loop with foo = t - do (foo foo) - ;; comment inside clause - (bar)) - -;;; Test: indent-63 -;; -;; lisp-loop-indent-subclauses: nil - -(loop with foo = t - do (foo foo) - ;; comment inside clause - (bar)) - - -;;; Test: indent-64 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: t - -(defmethod (setf foo) :around (zot &key x - y) - (list zot)) - -;;; Test: indent-65 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: t - -(defmethod (setf foo) - :around (zot &key x y) - (list zot)) - -;;; Test: indent-66 -;; - -(define-condition - foo - (bar quux - zot) - () - (:report "foo")) - -;;; Test: indent-67 -;; - -(defclass - foo - (bar quxx - xoo) - () - (:metaclass foo-class)) - - -;;; Test: indent-68 -;; -;; lisp-loop-indent-subclauses: nil - -(progn - (loop - repeat 1000 - do ;; This is the - ;; beginning - (foo)) - (loop repeat 100 ;; This too - ;; is a beginning - do (foo))) - -;;; Test: indent-69 -;; -;; lisp-loop-indent-subclauses: t - -(progn - (loop - repeat 1000 - do ;; This is the - ;; beginning - (foo)) - (loop repeat 100 ;; This too - ;; is a beginning - do (foo))) - -;;; Test: indent-70 -;; -;; lisp-loop-indent-subclauses: nil - -(progn - (loop - :repeat 1000 - #:do ;; This is the - ;; beginning - (foo)) - (loop #:repeat 100 ;; This too - ;; is a beginning - :do (foo))) - -;;; Test: indent-71 -;; -;; lisp-loop-indent-subclauses: t - -(progn - (loop - #:repeat 1000 - #:do ;; This is the - ;; beginning - (foo)) - (loop :repeat 100 ;; This too - ;; is a beginning - #:do (foo))) - -;;; Test: indent-72 -;; -;; lisp-lambda-list-keyword-parameter-alignment: nil -;; lisp-lambda-list-keyword-alignment: nil - -(flet ((foo (foo &optional opt1 - opt2 - &rest rest) - (list foo opt1 opt2 - rest))) - ...) - -;;; Test: indent-73 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: nil - -(flet ((foo (foo &optional opt1 - opt2 - &rest rest) - (list foo opt1 opt2 - rest))) - ...) - -;;; Test: indent-74 -;; -;; lisp-lambda-list-keyword-parameter-alignment: nil -;; lisp-lambda-list-keyword-alignment: t - -(flet ((foo (foo &optional opt1 - opt2 - &rest rest) - (list foo opt1 opt2 - rest))) - ...) - -;;; Test: indent-75 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: t - -(flet ((foo (foo &optional opt1 - opt2 - &rest rest) - (list foo opt1 opt2 - rest))) - ...) - -;;; Test: indent-76 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: t - -(macrolet ((foo - (foo (&optional xopt1 - xopt2 - &rest xrest) - &optional opt1 - opt2 - &rest rest) - (list foo opt1 opt2 - rest))) - ...) - -;;; Test: indent-77 -;; -;; lisp-align-keywords-in-calls: t - -(foo *foo* - :bar t - :quux #+quux t - #-quux nil - :zot t) - -;;; Test: indent-78 -;; -;; lisp-align-keywords-in-calls: t - -(foo *foo* :fii t - :bar t - :quux #+quux t - #+zot nil - :zot t) - -;;; Test: indent-79 - -(foo #+quux :quux #+quux t - #-quux :zoo #-quux t) - -;;; Test: indent-80 -;; -;; lisp-align-keywords-in-calls: t - -(foo *foo* :fii t - :bar t - #+quux :quux #+quux t - :zot t) - -;;; Test: indent-81 -;; -;; lisp-align-keywords-in-calls: t - -(foo *foo* :fii t - :bar t - #+quux #+quux :quux t - :zot t) - -;;; Test: indent-82 -;; -;; lisp-align-keywords-in-calls: t - -(foo *foo* :fii t - :bar t - #+quux - :quux #+quux t - :zot t) - -;;; Test: indent-83 -;; -;; lisp-align-keywords-in-calls: t - -(foo *foo* :fii t - :bar t - #+quux #+quux - :quux t - :zot t) - -;;; Test: indent-84 - -(and ;; Foo - (something) - ;; Quux - (more)) - -;;; Test: indent-85 - -(and ;; Foo - (something) - ;; Quux - (more)) - -;;; Test: indent-86 - -(foo ( - bar quux - zor)) - -;;; Test: indent-87 -;; -;; lisp-lambda-list-keyword-parameter-alignment: t -;; lisp-lambda-list-keyword-alignment: t - -(defmacro foo ((foo &optional (opt1 (or (this) - (that))) - (opt2 (the-default) - opt2-p) - (opt3 - (the-default (foo) - (bar))) - &rest rest)) - (list foo opt1 opt2 - rest)) - -;;; Test: indent-88 - -(defstruct (foo - (:constructor make-foo - (bar &aux (quux (quux-from-bar bar - :for 'foo))))) - bar - quux) - -;;; Test: indent-89 - -(define-tentative-thing foo - (bar) - quux) - -;;; Test: indent-90 - -(define-tentative-thing foo - bar - quux) - -;;; Test: indent-91 -;; -;; lisp-loop-indent-body-forms-relative-to-loop-start: t - -(loop for foo in bar - do - (progn foo - bar - baz)) - -;;; Test: indent-92 -;; -;; lisp-loop-indent-body-forms-relative-to-loop-start: t -;; lisp-loop-clauses-indentation: 4 - -(loop - for foo in bar - do - (progn foo - bar - baz)) - -;;; Test: indent-93 -;; -;; lisp-loop-clauses-indentation: 4 - -(loop - for foo in bar - doing - (progn foo - bar - baz)) - -;;; Test: indent-94 -;; -;; lisp-loop-clauses-indentation: 4 -;; lisp-loop-body-forms-indentation: 1 - -(loop - for foo in bar - doing - (list foo - bar - baz)) - -;;; Test: indent-95 -;; -;; lisp-loop-body-forms-indentation: 1 -;; lisp-loop-indent-body-forms-relative-to-loop-start: t - -(loop - for foo in bar - do - (list foo - bar - baz)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-enclosing-context-tests.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-enclosing-context-tests.el deleted file mode 100644 index 41f50a7..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-enclosing-context-tests.el +++ /dev/null @@ -1,46 +0,0 @@ -(require 'slime-enclosing-context) -(require 'slime-tests) -(require 'cl-lib) - -(def-slime-test enclosing-context.1 - (buffer-sexpr wished-bound-names wished-bound-functions) - "Check that finding local definitions work." - '(("(flet ((,nil ())) - (let ((bar 13) - (,foo 42)) - *HERE*))" - ;; We used to return ,foo here, but we do not anymore. We - ;; still return ,nil for the `slime-enclosing-bound-functions', - ;; though. The first one is used for local M-., whereas the - ;; latter is used for local autodoc. It does not seem too - ;; important for local M-. to work on such names. \(The reason - ;; that it does not work anymore, is that - ;; `slime-symbol-at-point' now does TRT and does not return a - ;; leading comma anymore.\) - ("bar" nil nil) - ((",nil" "()"))) - ("(flet ((foo ())) - (quux) - (bar *HERE*))" - ("foo") - (("foo" "()")))) - (slime-check-top-level) - (with-temp-buffer - (let ((tmpbuf (current-buffer))) - (lisp-mode) - (insert buffer-sexpr) - (search-backward "*HERE*") - (cl-multiple-value-bind (bound-names points) - (slime-enclosing-bound-names) - (slime-check "Check enclosing bound names" - (cl-loop for name in wished-bound-names - always (member name bound-names)))) - (cl-multiple-value-bind (fn-names fn-arglists points) - (slime-enclosing-bound-functions) - (slime-check "Check enclosing bound functions" - (cl-loop for (name arglist) in wished-bound-functions - always (and (member name fn-names) - (member arglist fn-arglists))))) - ))) - -(provide 'slime-enclosing-context-tests) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-fontifying-fu-tests.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-fontifying-fu-tests.el deleted file mode 100644 index 9bc99af..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-fontifying-fu-tests.el +++ /dev/null @@ -1,120 +0,0 @@ -(require 'slime-fontifying-fu) -(require 'slime-tests) - -(def-slime-test font-lock-magic (buffer-content) - "Some testing for the font-lock-magic. *YES* should be - highlighted as a suppressed form, *NO* should not." - - '(("(defun *NO* (x y) (+ x y))") - ("(defun *NO*") - ("*NO*) #-(and) (*YES*) (*NO* *NO*") - ("\( -\(defun *NO*") - ("\) -\(defun *NO* - \( -\)") - ("#+#.foo -\(defun *NO* (x y) (+ x y))") - ("#+#.foo -\(defun *NO* (x ") - ("#+( -\(defun *NO* (x ") - ("#+(test) -\(defun *NO* (x ") - - ("(eval-when (...) -\(defun *NO* (x ") - - ("(eval-when (...) -#+(and) -\(defun *NO* (x ") - - ("#-(and) (defun *YES* (x y) (+ x y))") - (" -#-(and) (defun *YES* (x y) (+ x y)) -#+(and) (defun *NO* (x y) (+ x y))") - - ("#+(and) (defun *NO* (x y) #-(and) (+ *YES* y))") - ("#| #+(or) |# *NO*") - ("#| #+(or) x |# *NO*") - ("*NO* \"#| *NO* #+(or) x |# *NO*\" *NO*") - ("#+#.foo (defun foo (bar)) -#-(and) *YES* *NO* bar -") - ("#+(foo) (defun foo (bar)) -#-(and) *YES* *NO* bar") - ("#| #+(or) |# *NO* foo -#-(and) *YES* *NO*") - ("#- (and) -\(*YES*) -\(*NO*) -#-(and) -\(*YES*) -\(*NO*)") - ("#+nil (foo) - -#-(and) -#+nil ( - asdf *YES* a - fsdfad) - -\( asdf *YES* - - ) -\(*NO*) - -") - ("*NO* - -#-(and) \(progn - #-(and) - (defun *YES* ...) - - #+(and) - (defun *YES* ...) - - (defun *YES* ...) - - *YES* - - *YES* - - *YES* - - *YES* -\) - -*NO*") - ("#-(not) *YES* *NO* - -*NO* - -#+(not) *NO* *NO* - -*NO* - -#+(not a b c) *NO* *NO* - -*NO*")) - (slime-check-top-level) - (with-temp-buffer - (insert buffer-content) - (slime-initialize-lisp-buffer-for-test-suite - :autodoc t :font-lock-magic t) - ;; Can't use `font-lock-fontify-buffer' because for the case when - ;; `jit-lock-mode' is enabled. Jit-lock-mode fontifies only on - ;; actual display. - (font-lock-default-fontify-buffer) - (when (search-backward "*NO*" nil t) - (slime-test-expect "Not suppressed by reader conditional?" - 'slime-reader-conditional-face - (get-text-property (point) 'face) - #'(lambda (x y) (not (eq x y))))) - (goto-char (point-max)) - (when (search-backward "*YES*" nil t) - (slime-test-expect "Suppressed by reader conditional?" - 'slime-reader-conditional-face - (get-text-property (point) 'face))))) - -(provide 'slime-fontifying-fu-tests) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-indentation-tests.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-indentation-tests.el deleted file mode 100644 index ad1e2c5..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-indentation-tests.el +++ /dev/null @@ -1,81 +0,0 @@ -(require 'slime-indentation) -(require 'slime-tests) - -(define-common-lisp-style "common-lisp-indent-test" - ;; Used to specify a few complex indentation specs for testing. - (:inherit "basic") - (:indentation - (complex-indent.1 ((&whole 4 (&whole 1 1 1 1 (&whole 1 1) &rest 1) - &body) &body)) - (complex-indent.2 (4 (&whole 4 &rest 1) &body)) - (complex-indent.3 (4 &body)))) - -(defun slime-indentation-mess-up-indentation () - (while (not (eobp)) - (forward-line 1) - (unless (looking-at "^$") - (cl-case (random 2) - (0 - ;; Delete all leading whitespace -- except for - ;; comment lines. - (while (and (looking-at " ") (not (looking-at " ;"))) - (delete-char 1))) - (1 - ;; Insert whitespace random. - (let ((n (1+ (random 24)))) - (while (> n 0) (cl-decf n) (insert " "))))))) - (buffer-string)) - -(eval-and-compile - (defun slime-indentation-test-form (test-name bindings expected) - `(define-slime-ert-test ,test-name () - ,(format "An indentation test named `%s'" test-name) - (with-temp-buffer - (lisp-mode) - (setq indent-tabs-mode nil) - (common-lisp-set-style "common-lisp-indent-test") - (let ,(cons `(expected ,expected) bindings) - (insert expected) - (goto-char (point-min)) - (let ((mess (slime-indentation-mess-up-indentation))) - (when (string= mess expected) - (ert-fail "Could not mess up indentation?")) - (indent-region (point-min) (point-max)) - (delete-trailing-whitespace) - (should (equal expected (buffer-string)))))))) - - (defun slime-indentation-test-forms-for-file (file) - (with-current-buffer - (find-file-noselect (concat slime-path - "/contrib/test/slime-cl-indent-test.txt")) - (goto-char (point-min)) - (cl-loop - while (re-search-forward ";;; Test:[\t\n\s]*\\(.*\\)[\t\n\s]" nil t) - for test-name = (intern (match-string-no-properties 1)) - for bindings = - (save-restriction - (narrow-to-region (point) - (progn (forward-comment - (point-max)) - (point))) - (save-excursion - (goto-char (point-min)) - (cl-loop while - (re-search-forward - "\\([^\s]*\\)[\t\n\s]*:[\t\n\s]*\\(.*\\)[\t\n\s]" nil t) - collect (list - (intern (match-string-no-properties 1)) - (car - (read-from-string (match-string-no-properties 2))))))) - for expected = (buffer-substring-no-properties (point) - (scan-sexps (point) - 1)) - collect (slime-indentation-test-form test-name bindings expected))))) - -(defmacro slime-indentation-define-tests () - `(progn - ,@(slime-indentation-test-forms-for-file "slime-cl-indent-test.txt"))) - -(slime-indentation-define-tests) - -(provide 'slime-indentation-tests) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-macrostep-tests.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-macrostep-tests.el deleted file mode 100644 index 3ceadd8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-macrostep-tests.el +++ /dev/null @@ -1,287 +0,0 @@ -;; Tests for slime-macrostep. The following are expected failures: - -;; - Under CLISP, highlighting of macro sub-forms fails because our -;; pretty-printer dispatch table hacking causes infinite recursion: -;; see comment in swank-macrostep.lisp - -;; - COLLECT-MACRO-FORMS does not catch compiler macros under CLISP -;; and ABCL - -;; - Under CCL and ECL, compiler macro calls returned by -;; COLLECT-MACRO-FORMS are not EQ to the original form, and so are -;; not detected by the tracking pretty-printer mechanism. This -;; could be fixed by adding :TEST #'EQUAL to the POSITION call -;; within MAKE-TRACKING-PPRINT-DISPATCH, at the cost of introducing -;; false positives. - -;; ECL has two other issues: - -;; - it currently lacks a working SLIME defimplementation for -;; MACROEXPAND-ALL (Github issue #157), without which none of the -;; expand-in-context stuff works. - -;; - the environments consed up by its WALKER:MACROEXPAND-ALL -;; function are slightly broken, and do not work when passed to -;; MACROEXPAND-1 unless fixed up via - -;; (subst 'si::macro 'walker::macro env) - -(require 'slime-macrostep) -(require 'slime-tests) -(require 'cl-lib) - -(defun slime-macrostep-eval-definitions (definitions) - (slime-check-top-level) - (slime-compile-string definitions 0) - (slime-sync-to-top-level 5)) - -(defmacro slime-macrostep-with-text (buffer-text &rest body) - (declare (indent 1)) - `(with-temp-buffer - (lisp-mode) - (save-excursion - (insert ,buffer-text)) - ,@body)) - -(defun slime-macrostep-search (form) - "Search forward for FORM, leaving point at its first character." - (let ((case-fold-search t) - (search-spaces-regexp "\\s-+")) - (re-search-forward (regexp-quote form))) - (goto-char (match-beginning 0))) - - - -(def-slime-test (slime-macrostep-expand-defmacro) - (definition buffer-text original expansion) - "Test that simple macrostep expansion works." - '(("(defmacro macrostep-dummy-macro (&rest args) - `(expansion of ,@args))" - - "(progn - (first body form) - (second body form) - (macrostep-dummy-macro (first (argument)) second (third argument)) - (remaining body forms))" - - "(macrostep-dummy-macro (first (argument)) second (third argument))" - - "(expansion of (first (argument)) second (third argument))")) - (slime-macrostep-eval-definitions definition) - (slime-macrostep-with-text buffer-text - (slime-macrostep-search original) - (macrostep-expand) - (slime-test-expect "Macroexpansion is correct" - expansion - (downcase (slime-sexp-at-point)) - #'slime-test-macroexpansion=))) - -(def-slime-test (slime-macrostep-fontify-macros - (:fails-for "clisp" "ECL")) - (definition buffer-text original subform) - "Test that macro forms in expansions are font-locked" - '(("(defmacro macrostep-dummy-1 (&rest args) - `(expansion including (macrostep-dummy-2 ,@args))) - (defmacro macrostep-dummy-2 (&rest args) - `(final expansion of ,@args))" - - "(progn - (first body form) - (second body form) - (macrostep-dummy-1 (first (argument)) second (third argument)) - (remaining body forms))" - - "(macrostep-dummy-1 (first (argument)) second (third argument))" - - "(macrostep-dummy-2 (first (argument)) second (third argument))")) - (slime-macrostep-eval-definitions definition) - (slime-macrostep-with-text buffer-text - (slime-macrostep-search original) - (macrostep-expand) - (slime-macrostep-search subform) - (forward-char) ; move over open paren - (slime-check "Head of macro form in expansion is fontified correctly" - (eq (get-char-property (point) 'font-lock-face) - 'macrostep-macro-face)))) - -(def-slime-test (slime-macrostep-fontify-compiler-macros - (:fails-for "armedbear" "clisp" "ccl" "ECL")) - (definition buffer-text original subform) - "Test that compiler-macro forms in expansions are font-locked" - '(("(defmacro macrostep-dummy-3 (&rest args) - `(expansion including (macrostep-dummy-4 ,@args))) - (defun macrostep-dummy-4 (&rest args) - args) - (define-compiler-macro macrostep-dummy-4 (&rest args) - `(compile-time expansion of ,@args))" - - "(progn - (first body form) - (second body form) - (macrostep-dummy-3 first second third) - (remaining body forms))" - - "(macrostep-dummy-3 first second third)" - - "(macrostep-dummy-4 first second third)")) - (slime-macrostep-eval-definitions definition) - (slime-macrostep-with-text buffer-text - (slime-macrostep-search original) - (let ((macrostep-expand-compiler-macros t)) - (macrostep-expand)) - (slime-macrostep-search subform) - (forward-char) ; move over open paren - (slime-check "Head of compiler-macro in expansion is fontified correctly" - (eq (get-char-property (point) 'font-lock-face) - 'macrostep-compiler-macro-face)))) - -(def-slime-test (slime-macrostep-expand-macrolet - (:fails-for "ECL")) - (definitions buffer-text expansions) - "Test that calls to macrolet-defined macros are expanded." - '((nil - "(macrolet - ((test (&rest args) `(expansion of ,@args))) - (first body form) - (second body form) - (test (strawberry pie) and (apple pie)) - (final body form))" - (("(test (strawberry pie) and (apple pie))" - "(EXPANSION OF (STRAWBERRY PIE) AND (APPLE PIE))"))) - - ;; From swank.lisp: - (nil - "(macrolet ((define-xref-action (xref-type handler) - `(defmethod xref-doit ((type (eql ,xref-type)) thing) - (declare (ignorable type)) - (funcall ,handler thing)))) - (define-xref-action :calls #'who-calls) - (define-xref-action :calls-who #'calls-who) - (define-xref-action :references #'who-references) - (define-xref-action :binds #'who-binds) - (define-xref-action :macroexpands #'who-macroexpands) - (define-xref-action :specializes #'who-specializes) - (define-xref-action :callers #'list-callers) - (define-xref-action :callees #'list-callees))" - (("(define-xref-action :calls #'who-calls)" - "(DEFMETHOD XREF-DOIT ((TYPE (EQL :CALLS)) THING) - (DECLARE (IGNORABLE TYPE)) - (FUNCALL #'WHO-CALLS THING))") - ("(define-xref-action :macroexpands #'who-macroexpands)" - "(DEFMETHOD XREF-DOIT ((TYPE (EQL :MACROEXPANDS)) THING) - (DECLARE (IGNORABLE TYPE)) - (FUNCALL #'WHO-MACROEXPANDS THING))") - ("(define-xref-action :callees #'list-callees)" - "(DEFMETHOD XREF-DOIT ((TYPE (EQL :CALLEES)) THING) - (DECLARE (IGNORABLE TYPE)) - (FUNCALL #'LIST-CALLEES THING))"))) - - ;; Test expansion of shadowed definitions - (nil - "(macrolet - ((test-macro (&rest forms) (cons 'outer-definition forms))) - (test-macro first (call)) - (macrolet - ((test-macro (&rest forms) (cons 'inner-definition forms))) - (test-macro (second (call)))))" - (("(test-macro first (call))" - "(OUTER-DEFINITION FIRST (CALL))") - ("(test-macro (second (call)))" - "(INNER-DEFINITION (SECOND (CALL)))"))) - - ;; Expansion of macro-defined local macros - ("(defmacro with-local-dummy-macro (&rest body) - `(macrolet ((dummy (&rest args) `(expansion (of) ,@args))) - ,@body))" - "(with-local-dummy-macro - (dummy form (one)) - (dummy (form two)))" - (("(dummy form (one))" - "(EXPANSION (OF) FORM (ONE))") - ("(dummy (form two))" - "(EXPANSION (OF) (FORM TWO))")))) - - (when definitions - (slime-macrostep-eval-definitions definitions)) - (slime-macrostep-with-text buffer-text - ;; slime-test-macroexpansion= does not expect tab characters, - ;; so make sure that Emacs does not insert them - (let ((indent-tabs-mode nil)) - (cl-loop - for (original expansion) in expansions - do - (goto-char (point-min)) - (slime-macrostep-search original) - (macrostep-expand) - (slime-test-expect "Macroexpansion is correct" - expansion - (slime-sexp-at-point) - #'slime-test-macroexpansion=))))) - -(def-slime-test (slime-macrostep-fontify-local-macros - (:fails-for "clisp" "ECL")) - () - "Test that locally-bound macros are highlighted in expansions." - '(()) - (slime-macrostep-with-text - "(macrolet ((frob (&rest args) - (if (zerop (length args)) - nil - `(cons ,(car args) (frob ,@(cdr args)))))) - (frob 1 2 3 4 5))" - (let ((expansions - '(("(frob 1 2 3 4 5)" - "(CONS 1 (FROB 2 3 4 5))" - "(FROB 2 3 4 5)") - ("(FROB 2 3 4 5)" - "(CONS 2 (FROB 3 4 5))" - "(FROB 3 4 5)") - ("(FROB 3 4 5)" - "(CONS 3 (FROB 4 5))" - "(FROB 4 5)") - ("(FROB 4 5)" - "(CONS 4 (FROB 5))" - "(FROB 5)") - ("(FROB 5)" - "(CONS 5 (FROB))" - "(FROB)") - ;; ("(FROB)" - ;; "NIL" - ;; nil) - ))) - (cl-loop for (original expansion subform) in expansions - do - (goto-char (point-min)) - (slime-macrostep-search original) - (macrostep-expand) - (slime-test-expect "Macroexpansion is correct" - expansion - (slime-sexp-at-point) - #'slime-test-macroexpansion=) - (when subform - (slime-macrostep-search subform) - (forward-char) - (slime-check "Head of macro form in expansion is fontified correctly" - (eq (get-char-property (point) 'font-lock-face) - 'macrostep-macro-face))))))) - -(def-slime-test (slime-macrostep-handle-unreadable-objects) - (definitions buffer-text subform expansion) - "Check that macroexpansion succeeds in a context containing unreadable objects." - '(("(defmacro macrostep-dummy-5 (&rest args) - `(expansion of ,@args))" - "(progn - # - (macrostep-dummy-5 quux frob))" - "(macrostep-dummy-5 quux frob)" - "(EXPANSION OF QUUX FROB)")) - (slime-macrostep-eval-definitions definitions) - (slime-macrostep-with-text buffer-text - (slime-macrostep-search subform) - (macrostep-expand) - (slime-test-expect "Macroexpansion is correct" - expansion - (slime-sexp-at-point) - #'slime-test-macroexpansion=))) - -(provide 'slime-macrostep-tests) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-mdot-fu-tests.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-mdot-fu-tests.el deleted file mode 100644 index cf27b29..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-mdot-fu-tests.el +++ /dev/null @@ -1,43 +0,0 @@ -(require 'slime-mdot-fu) -(require 'slime-tests) - -(def-slime-test find-local-definitions.1 - (buffer-sexpr definition target-regexp) - "Check that finding local definitions work." - '(((defun foo (x) - (let ((y (+ x 1))) - (- x y *HERE*))) - y - "(y (+ x 1))") - - ((defun bar (x) - (flet ((foo (z) (+ x z))) - (* x (foo *HERE*)))) - foo - "(foo (z) (+ x z))") - - ((defun quux (x) - (flet ((foo (z) (+ x z))) - (let ((foo (- 1 x))) - (+ x foo *HERE*)))) - foo - "(foo (- 1 x)") - - ((defun zurp (x) - (macrolet ((frob (x y) `(quux ,x ,y))) - (frob x *HERE*))) - frob - "(frob (x y)")) - (slime-check-top-level) - (with-temp-buffer - (let ((tmpbuf (current-buffer))) - (insert (prin1-to-string buffer-sexpr)) - (search-backward "*HERE*") - (slime-edit-local-definition (prin1-to-string definition)) - (slime-sync) - (slime-check "Check that we didnt leave the temp buffer." - (eq (current-buffer) tmpbuf)) - (slime-check "Check that we are at the local definition." - (looking-at (regexp-quote target-regexp)))))) - -(provide 'slime-mdot-fu-tests) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-parse-tests.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-parse-tests.el deleted file mode 100644 index 0b0ec7d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-parse-tests.el +++ /dev/null @@ -1,63 +0,0 @@ -(require 'slime-parse) -(require 'slime-tests) - -(defun slime-check-buffer-form (result-form) - (slime-test-expect - (format "Buffer form correct in `%s' (at %d)" (buffer-string) (point)) - result-form - (slime-parse-form-upto-point 10))) - -(def-slime-test form-up-to-point.1 - (buffer-sexpr result-form &optional skip-trailing-test-p) - "" - `(("(char= #\\(*HERE*" - ("char=" "#\\(" ,slime-cursor-marker)) - ("(char= #\\( *HERE*" - ("char=" "#\\(" "" ,slime-cursor-marker)) - ("(char= #\\) *HERE*" - ("char=" "#\\)" "" ,slime-cursor-marker)) - ("(char= #\\*HERE*" - ("char=" "#\\" ,slime-cursor-marker) t) - ("(defun*HERE*" - ("defun" ,slime-cursor-marker)) - ("(defun foo*HERE*" - ("defun" "foo" ,slime-cursor-marker)) - ("(defun foo (x y)*HERE*" - ("defun" "foo" - ("x" "y") ,slime-cursor-marker)) - ("(defun foo (x y*HERE*" - ("defun" "foo" - ("x" "y" ,slime-cursor-marker))) - ("(apply 'foo*HERE*" - ("apply" "'foo" ,slime-cursor-marker)) - ("(apply #'foo*HERE*" - ("apply" "#'foo" ,slime-cursor-marker)) - ("(declare ((vector bit *HERE*" - ("declare" (("vector" "bit" "" ,slime-cursor-marker)))) - ("(with-open-file (*HERE*" - ("with-open-file" ("" ,slime-cursor-marker))) - ("(((*HERE*" - ((("" ,slime-cursor-marker)))) - ("(defun #| foo #| *HERE*" - ("defun" "" ,slime-cursor-marker)) - ("(defun #-(and) (bar) f*HERE*" - ("defun" "f" ,slime-cursor-marker)) - ("(remove-if #'(lambda (x)*HERE*" - ("remove-if" ("lambda" ("x") ,slime-cursor-marker))) - ("`(remove-if ,(lambda (x)*HERE*" - ("remove-if" ("lambda" ("x") ,slime-cursor-marker))) - ("`(remove-if ,@(lambda (x)*HERE*" - ("remove-if" ("lambda" ("x") ,slime-cursor-marker)))) - (slime-check-top-level) - (with-temp-buffer - (lisp-mode) - (insert buffer-sexpr) - (search-backward "*HERE*") - (delete-region (match-beginning 0) (match-end 0)) - (slime-check-buffer-form result-form) - (unless skip-trailing-test-p - (insert ")") (backward-char) - (slime-check-buffer-form result-form)) - )) - -(provide 'slime-parse-tests) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-presentations-tests.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-presentations-tests.el deleted file mode 100644 index fad8d99..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-presentations-tests.el +++ /dev/null @@ -1,61 +0,0 @@ -(require 'slime-presentations) -(require 'slime-tests) -(require 'slime-repl-tests "test/slime-repl-tests") - -(define-slime-ert-test pick-up-presentation-at-point () - "Ensure presentations are found consistently." - (cl-labels ((assert-it (point &optional negate) - (let ((result - (cl-first - (slime-presentation-around-or-before-point point)))) - (unless (if negate (not result) result) - (ert-fail - (format "Failed to pick up presentation at point %s" - point)))))) - (with-temp-buffer - (slime-insert-presentation "1234567890" `(:inspected-part 42)) - (insert " ") - (assert-it 1) - (assert-it 2) - (assert-it 3) - (assert-it 4) - (assert-it 5) - (assert-it 10) - (assert-it 11) - (assert-it 12 t)))) - -(def-slime-test (pretty-presentation-results (:fails-for "allegro")) - (input result-contents) - "Test some more simple situations dealing with print-width and stuff. - -Very much like `repl-test-2', but should be more stable when -presentations are enabled, except in allegro." - '(("\ -(with-standard-io-syntax - (write (make-list 15 :initial-element '(1 . 2)) :pretty t :right-margin 75) - 0)" - "\ -SWANK> \ -(with-standard-io-syntax - (write (make-list 15 :initial-element '(1 . 2)) :pretty t :right-margin 75) - 0) -{((1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) - (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2)) -}0 -SWANK> *[]") - ;; Two times to test the effect of FRESH-LINE. - ("\ -(with-standard-io-syntax - (write (make-list 15 :initial-element '(1 . 2)) :pretty t :right-margin 75) - 0)" - "SWANK> \ -(with-standard-io-syntax - (write (make-list 15 :initial-element '(1 . 2)) :pretty t :right-margin 75) - 0) -{((1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) - (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2)) -}0 -SWANK> *[]")) - (slime-test-repl-test input result-contents)) - -(provide 'slime-presentations-tests) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-repl-tests.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-repl-tests.el deleted file mode 100644 index dde08ae..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/contrib/test/slime-repl-tests.el +++ /dev/null @@ -1,343 +0,0 @@ -(require 'slime-repl) -(require 'slime-tests) -(require 'cl-lib) - -(defmacro slime-repl-test-markers (expected-string-spec &rest marker-specs) - "For (MARKER SIG FORM) in MARKER-SPECS, produce suitable `should' assertions. -The assertions compare values in symbols `expected-MARKER' and -`observed-MARKER'. The former is obtained by searching EXPECTED-STRING-SPEC -for the string sig SIG, the latter by evaling FORM in the test buffer." - (declare (indent 1)) - (cl-loop - for (marker signature observer-form) in marker-specs - for expected-sym = (make-symbol (format "expected-%s" marker)) - for observed-sym = (make-symbol (format "observed-%s" marker)) - - collect `(,expected-sym - (progn (goto-char (point-min)) - (when (search-forward ,signature nil t) - (replace-match "") - (point-marker)))) - into expected-bindings - collect `(,observed-sym ,observer-form) - into observed-bindings - collect `(when (and ,observed-sym (not ,expected-sym)) - (ert-fail - (format "Didn't expect to observe %s, but did and its %s" - ',marker ,observed-sym))) - into assertions - collect `(when (and (not ,observed-sym) ,expected-sym) - (ert-fail - (format "Expected %s to be %s, bit didn't observe anything" - ',marker ,expected-sym))) - into assertions - collect `(when (and ,observed-sym ,expected-sym) - (should (= ,observed-sym ,expected-sym))) - into assertions - finally - (return - `(progn - (let (,@observed-bindings - (observed-string (buffer-substring-no-properties (point-min) - (point-max)))) - (with-current-buffer (get-buffer-create "*slime-repl test buffer*") - (erase-buffer) - (insert ,expected-string-spec) - (let (,@expected-bindings) - (should - (equal observed-string (buffer-string))) - ,@assertions))))))) - -(defun slime-check-buffer-contents (_msg expected-string-spec) - (slime-repl-test-markers expected-string-spec - (point "*" (point)) - (output-start "{" (next-single-property-change - (point-min) 'slime-repl-output)) - (output-end "}" (previous-single-property-change - (point-max) 'slime-repl-output)) - (input-start "[" slime-repl-input-start-mark) - (point-max "]" (point-max)) - (next-input-start "^" nil))) - -(def-slime-test package-updating - (package-name nicknames) - "Test if slime-lisp-package is updated." - '(("COMMON-LISP" ("CL")) - ("KEYWORD" ("" "KEYWORD" "||")) - ("COMMON-LISP-USER" ("CL-USER"))) - (with-current-buffer (slime-output-buffer) - (let ((p (slime-eval - `(swank-repl:listener-eval - ,(format - "(cl:setq cl:*print-case* :upcase) - (cl:setq cl:*package* (cl:find-package %S)) - (cl:package-name cl:*package*)" package-name)) - (slime-lisp-package)))) - (slime-check ("slime-lisp-package is %S." package-name) - (equal (slime-lisp-package) package-name)) - (slime-check ("slime-lisp-package-prompt-string is in %S." nicknames) - (member (slime-lisp-package-prompt-string) nicknames))))) - -(defmacro with-canonicalized-slime-repl-buffer (&rest body) - "Evaluate BODY within a fresh REPL buffer. The REPL prompt is -canonicalized to \"SWANK\"---we do actually switch to that -package, though." - (declare (debug (&rest form)) (indent 0)) - `(let ((%old-prompt% (slime-lisp-package-prompt-string))) - (unwind-protect - (progn (with-current-buffer (slime-output-buffer) - (setf (slime-lisp-package-prompt-string) "SWANK")) - (kill-buffer (slime-output-buffer)) - (with-current-buffer (slime-output-buffer) - ,@body)) - (setf (slime-lisp-package-prompt-string) %old-prompt%)))) - -(def-slime-test repl-test - (input result-contents) - "Test simple commands in the minibuffer." - '(("(+ 1 2)" "SWANK> (+ 1 2) -3 -SWANK> *[]") - ("(princ 10)" "SWANK> (princ 10) -{10 -}10 -SWANK> *[]") - ("(princ 10)(princ 20)" "SWANK> (princ 10)(princ 20) -{1020 -}20 -SWANK> *[]") - ("(dotimes (i 10 77) (princ i) (terpri))" - "SWANK> (dotimes (i 10 77) (princ i) (terpri)) -{0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -}77 -SWANK> *[]") - ("(abort)" "SWANK> (abort) -; Evaluation aborted on NIL. -SWANK> *[]") - ("(progn (princ 10) (force-output) (abort))" - "SWANK> (progn (princ 10) (force-output) (abort)) -{10}; Evaluation aborted on NIL. -SWANK> *[]") - ("(progn (princ 10) (abort))" - ;; output can be flushed after aborting - "SWANK> (progn (princ 10) (abort)) -{10}; Evaluation aborted on NIL. -SWANK> *[]") - ("(if (fresh-line) 1 0)" - "SWANK> (if (fresh-line) 1 0) -{ -}1 -SWANK> *[]") - ("(values 1 2 3)" "SWANK> (values 1 2 3) -1 -2 -3 -SWANK> *[]")) - (with-canonicalized-slime-repl-buffer - (insert input) - (slime-check-buffer-contents "Buffer contains input" - (concat "SWANK> [" input "*]")) - (call-interactively 'slime-repl-return) - (slime-sync-to-top-level 5) - (slime-check-buffer-contents "Buffer contains result" result-contents))) - -(def-slime-test repl-test-2 - (input result-contents) - "Test some more simple situations dealing with print-width and stuff" - '(("(with-standard-io-syntax - (write (make-list 15 :initial-element '(1 . 2)) :pretty t) 0)" - "SWANK> (with-standard-io-syntax - (write (make-list 15 :initial-element '(1 . 2)) :pretty t) 0) -{((1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) - (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2)) -}0 -SWANK> *[]") - ;; Two times to test the effect of FRESH-LINE. - ("(with-standard-io-syntax - (write (make-list 15 :initial-element '(1 . 2)) :pretty t) 0)" - "SWANK> (with-standard-io-syntax - (write (make-list 15 :initial-element '(1 . 2)) :pretty t) 0) -{((1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) - (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2) (1 . 2)) -}0 -SWANK> *[]")) - (slime-skip-test "Repl test is unstable without the slime-presentations contrib.") - (slime-test-repl-test input result-contents)) - -(def-slime-test repl-return - (before after result-contents) - "Test if slime-repl-return sends the correct protion to Lisp even -if point is not at the end of the line." - '(("(+ 1 2)" "" "SWANK> (+ 1 2) -3 -SWANK> ") -("(+ 1 " "2)" "SWANK> (+ 1 2) -3 -SWANK> ") - -("(+ 1\n" "2)" "SWANK> (+ 1 -2) -3 -SWANK> ")) - (with-canonicalized-slime-repl-buffer - (insert before) - (save-excursion (insert after)) - (slime-test-expect "Buffer contains input" - (concat "SWANK> " before after) - (buffer-string)) - (call-interactively 'slime-repl-return) - (slime-sync-to-top-level 5) - (slime-test-expect "Buffer contains result" - result-contents (buffer-string)))) - -(def-slime-test repl-read - (prompt input result-contents) - "Test simple commands in the minibuffer." - '(("(read-line)" "foo" "SWANK> (values (read-line)) -foo -\"foo\" -SWANK> ") - ("(read-char)" "1" "SWANK> (values (read-char)) -1 -#\\1 -SWANK> ") - ("(read)" "(+ 2 3 -4)" "SWANK> (values (read)) -\(+ 2 3 -4) -\(+ 2 3 4) -SWANK> ")) - (with-canonicalized-slime-repl-buffer - (insert (format "(values %s)" prompt)) - (call-interactively 'slime-repl-return) - (slime-wait-condition "reading" #'slime-reading-p 5) - (insert input) - (call-interactively 'slime-repl-return) - (slime-sync-to-top-level 5) - (slime-test-expect "Buffer contains result" - result-contents (buffer-string)))) - -(def-slime-test repl-read-lines - (command inputs final-contents) - "Test reading multiple lines from the repl." - '(("(list (read-line) (read-line) (read-line))" - ("a" "b" "c") - "SWANK> (list (read-line) (read-line) (read-line)) -a -b -c -\(\"a\" \"b\" \"c\") -SWANK> ")) - (with-canonicalized-slime-repl-buffer - (insert command) - (call-interactively 'slime-repl-return) - (dolist (input inputs) - (slime-wait-condition "reading" #'slime-reading-p 5) - (insert input) - (call-interactively 'slime-repl-return)) - (slime-sync-to-top-level 5) - (slime-test-expect "Buffer contains result" - final-contents - (buffer-string) - #'equal))) - -(def-slime-test repl-type-ahead - (command input final-contents) - "Ensure that user input is preserved correctly. -In particular, input inserted while waiting for a result." - '(("(sleep 0.1)" "foo*" "SWANK> (sleep 0.1) -NIL -SWANK> [foo*]") - ("(sleep 0.1)" "*foo" "SWANK> (sleep 0.1) -NIL -SWANK> [*foo]") - ("(progn (sleep 0.1) (abort))" "*foo" "SWANK> (progn (sleep 0.1) (abort)) -; Evaluation aborted on NIL. -SWANK> [*foo]")) - (with-canonicalized-slime-repl-buffer - (insert command) - (call-interactively 'slime-repl-return) - (save-excursion (insert (cl-delete ?* input))) - (forward-char (cl-position ?* input)) - (slime-sync-to-top-level 5) - (slime-check-buffer-contents "Buffer contains result" final-contents))) - - -(def-slime-test interrupt-in-blocking-read - () - "Let's see what happens if we interrupt a blocking read operation." - '(()) - (slime-skip-test "TODO: skip for now, but analyse this failure!") - (slime-check-top-level) - (with-canonicalized-slime-repl-buffer - (insert "(read-char)") - (call-interactively 'slime-repl-return) - (slime-wait-condition "reading" #'slime-reading-p 5) - (slime-interrupt) - (slime-wait-condition "Debugger visible" - (lambda () - (and (slime-sldb-level= 1) - (get-buffer-window - (sldb-get-default-buffer)))) - 5) - (with-current-buffer (sldb-get-default-buffer) - (sldb-continue)) - (slime-wait-condition "reading" #'slime-reading-p 5) - (with-current-buffer (slime-output-buffer) - (insert "X") - (call-interactively 'slime-repl-return) - (slime-sync-to-top-level 5) - (slime-test-expect "Buffer contains result" - "SWANK> (read-char) -X -#\\X -SWANK> " (buffer-string))))) - -(def-slime-test move-around-and-be-nasty - () - "Test moving around in repl, and watching attempts to destroy prompt fail" - '(()) - (slime-skip-test "TODO: Test causes instability for other tests.") - (slime-check-top-level) - (with-canonicalized-slime-repl-buffer - (let ((start (point))) - (insert "foo") - (beginning-of-line) - (should (equal (buffer-substring-no-properties - (point-min) - (point-max)) "SWANK> foo")) - (should (equal (point) start)) - (unwind-protect - (progn - (let ((inhibit-field-text-motion t)) - (goto-char (line-beginning-position))) - (should-error (delete-char 1))) - (goto-char (line-end-position)))))) - -(def-slime-test mixed-output-and-results - (prompt eval-input result-contents) - "Test that output goes to the correct places." - '(("(princ 123)" (cl:loop repeat 2 do (cl:princ 456)) "SWANK> (princ 123) -123 -123 -456456 -SWANK> ")) - (with-canonicalized-slime-repl-buffer - (insert prompt) - (call-interactively 'slime-repl-return) - (slime-sync-to-top-level 5) - (slime-eval eval-input) - (slime-sync-to-top-level 5) - (slime-test-expect "Buffer contains result" - result-contents (buffer-string)))) - -(provide 'slime-repl-tests) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/.cvsignore b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/.cvsignore deleted file mode 100644 index 83078f7..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/.cvsignore +++ /dev/null @@ -1,21 +0,0 @@ -contributors.texi -slime.aux -slime.cp -slime.dvi -slime.fn -slime.fns -slime.info -slime.ky -slime.kys -slime.log -slime.pdf -slime.pg -slime.ps -slime.tmp -slime.toc -slime.tp -slime.vr -slime.vrs -slime.html -html -html.tgz diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/Makefile b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/Makefile deleted file mode 100644 index 242a70b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/Makefile +++ /dev/null @@ -1,116 +0,0 @@ -# This file has been placed in the public domain. -# -# Where to put the info file(s). NB: the GNU Coding Standards (GCS) -# and the Filesystem Hierarchy Standard (FHS) differ on where info -# files belong. The GCS says /usr/local/info; the FHS says -# /usr/local/share/info. Many distros obey the FHS, but people who -# installed their emacs from source probably have a GCS-ish file -# hierarchy. -infodir=/usr/local/info - -# What command to use to install info file(s) -INSTALL_CMD=install -m 644 - -# Info files generated here. -infofiles=slime.info - -TEXI = slime.texi contributors.texi - -help: - @echo -e "\ -Most important targets:\n\ -all generate info, pdf, and html documents\n\ -slime.info generate the slime.info file\n\ -slime.html generate a single html file\n\ -html/index.html generate on html file per node in html/ directory\n\ -html.tgz create a tarball of all html files\n\ -clean remove generated files" - -all: slime.info slime.pdf html/index.html - -slime.dvi: $(TEXI) - texi2dvi slime.texi - -slime.ps: slime.dvi - dvips -o $@ $< - -slime.info: $(TEXI) - makeinfo $< - -slime.html: $(TEXI) - texi2html --css-include=slime.css $< - -html/index.html: $(TEXI) - makeinfo -o html --css-include=slime.css --html $< - -html.tgz: html/index.html - tar -czf $@ html - -DOCDIR=/project/slime/public_html/doc -# invoke this like: make CLUSER=heller publish -publish: slime.pdf html.tgz - scp slime.pdf html.tgz $(CLUSER)@common-lisp.net:$(DOCDIR) - ssh $(CLUSER)@common-lisp.net "cd $(DOCDIR); tar -zxf html.tgz" - -slime.pdf: $(TEXI) - texi2pdf $< - -slime-refcard.pdf: slime-refcard.tex - texi2pdf $< - -install: install-info - -uninstall: uninstall-info - -# Create contributors.texi, a texinfo table listing all known -# contributors of code. -# -# The gist of this horror show is that the contributor list is piped -# into texinfo-tabulate.awk with one name per line, sorted -# by number of contributions. -LAST_CHANGELOG_COMMIT=ab6d1bd5c9d3c5b4a6299b8c864ce4acfd25cbcc -contributors.texi: ../slime.el Makefile texinfo-tabulate.awk - git show $(LAST_CHANGELOG_COMMIT):ChangeLog \ - $(LAST_CHANGELOG_COMMIT):contrib/ChangeLog | \ - sed -ne '/^[0-9]/{s/^[^ ]* *//; s/ *<.*//; p;}' | \ - (cat; git log $(LAST_CHANGELOG_COMMIT).. --format='%aN') | \ - sort | \ - uniq -c | \ - LC_ALL=C sort -nr | \ - sed -e 's/^[^A-Z]*//; /^$$/d' | \ - LC_ALL=C awk -f texinfo-tabulate.awk \ - > $@ - -#.INTERMEDIATE: contributors.texi - -# Debian's install-info wants a --section argument. -install-info: section=$(shell grep INFO-DIR-SECTION $(infofiles) | sed 's/INFO-DIR-SECTION //') -install-info: slime.info - mkdir -p $(infodir) - $(INSTALL_CMD) $(infofiles) $(infodir)/$(infofiles) - @if (install-info --version && \ - install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ - echo "install-info --info-dir=$(infodir) $(infodir)/$(infofiles)";\ - install-info --info-dir="$(infodir)" "$(infodir)/$(infofiles)" || :;\ - else \ - echo "install-info --infodir=$(infodir) --section $(section) $(section) $(infodir)/$(infofiles)" && \ - install-info --infodir="$(infodir)" --section $(section) ${section} "$(infodir)/$(infofiles)" || :; fi - -uninstall-info: - @if (install-info --version && \ - install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ - echo "install-info --info-dir=$(infodir) --remove $(infodir)/$(infofiles)";\ - install-info --info-dir="$(infodir)" --remove "$(infodir)/$(infofiles)" || :;\ - else \ - echo "install-info --infodir=$(infodir) --remove $(infodir)/$(infofiles)";\ - install-info --infodir="$(infodir)" --remove "$(infodir)/$(infofiles)" || :; fi - rm -f $(infodir)/$(infofiles) - -clean: - rm -f contributors.texi - rm -f slime.aux slime.cp slime.cps slime.fn slime.fns slime.ky - rm -f slime.kys slime.log slime.pg slime.tmp slime.toc slime.tp - rm -f slime.vr slime.vrs - rm -f slime.info slime.pdf slime.dvi slime.ps slime.html - rm -f slime-refcard.pdf slime-refcard.log slime-refcard.aux - rm -rf html html.tgz diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/contributors.texi b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/contributors.texi deleted file mode 100644 index 13d7504..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/contributors.texi +++ /dev/null @@ -1,67 +0,0 @@ -@multitable @columnfractions 0.333333 0.333333 0.333333 - -@item Helmut Eller @tab Tobias C. Rittweiler @tab Stas Boukarev -@item Luke Gorrie @tab Matthias Koeppe @tab Luís Oliveira -@item Nikodemus Siivola @tab Marco Baringer @tab João Távora -@item Alan Ruttenberg @tab Henry Harrington @tab Mark Evenson -@item Christophe Rhodes @tab Edi Weitz @tab Martin Simmons -@item Juho Snellman @tab Attila Lendvai @tab Peter Seibel -@item Geo Carncross @tab Douglas Crosher @tab Daniel Kochmanski -@item Gábor Melis @tab Daniel Barlow @tab Wolfgang Jenkner -@item Stelian Ionescu @tab Michael Weber @tab Didier Verna -@item Lawrence Mitchell @tab Anton Kovalenko @tab Terje Norderhaug -@item Jan Moringen @tab Brian Downing @tab Bill Clementson -@item Andras Simon @tab Adlai Chandrasekhar @tab Zach Beane -@item Ivan Shvedunov @tab Francois-Rene Rideau @tab Espen Wiborg -@item António Menezes Leitão @tab Utz-Uwe Haus @tab Thomas Schilling -@item Thomas F. Burdick @tab Takehiko Abe @tab Sébastien Villemot -@item Richard M Kreuter @tab Raymond Toy @tab Matthew Danish -@item Mark Harig @tab James Bielman @tab Harald Hanche-Olsen -@item Ariel Badichi @tab Andreas Fuchs @tab Willem Broekema -@item Taylor R. Campbell @tab Phil Hargett @tab Paulo Madeira -@item Lars Magne Ingebrigtsen @tab John Paul Wallington @tab Joerg Hoehle -@item David Reitter @tab Bryan O'Connor @tab Alexander Artemenko -@item Alan Shutko @tab Ursa americanus kermodei @tab Travis Cross -@item Tobias Rittweiler @tab Tiago Maduro-Dias @tab Stefan Kamphausen -@item Sean O'Rourke @tab Robert Lehr @tab Robert E. Brown -@item Philipp Marek @tab Peter S. Housel @tab Nathan Trapuzzano -@item Nathan Bird @tab Luís Borges de Oliveira @tab Jouni K Seppanen -@item Jon Oddie @tab Ivan Toshkov @tab Ian Eslick -@item Geoff Wozniak @tab Gary King @tab Fice T -@item Eric Blood @tab Eduardo Muñoz @tab Douglas Katzman -@item Christophe Junke @tab Christian Schafmeister @tab Christian Lynbech -@item Chris Capel @tab Charles Zhang @tab Bjørn Nordbø -@item Bart Botta @tab Anton Vodonosov @tab Alexey Dejneka -@item Alan Caulkins @tab Yu-Chiang Hsu @tab Yaroslav Kavenchuk -@item YOKOTA Yuki @tab Wolfgang Mederle @tab Wojciech Kaczmarek -@item William Bland @tab Vitaly Mayatskikh @tab Tomas Zellerin -@item Tom Pierce @tab Tim Daly Jr. @tab Syohei YOSHIDA -@item Sven Van Caekenberghe @tab Svein Ove Aas @tab Steve Smith -@item StanisBaw Halik @tab Sergey Kostyaev @tab Samuel Freilich -@item Russell McManus @tab Russ Tyndall @tab Rui Patrocínio -@item Robert P. Goldman @tab Robert Macomber @tab Robert Brown -@item Reini Urban @tab R. Matthew Emerson @tab Peter Feigl -@item Peter @tab Pawel Ostrowski @tab Paul Donnelly -@item Paul Collins @tab Olof-Joachim Frahm @tab Neil Van Dyke -@item NIIMI Satoshi @tab Mészáros Levente @tab Mikel Bancroft -@item MichaÅ‚ Herda @tab Michael White @tab Matthew Kennedy -@item Matthew D. Swank @tab Matt Pillsbury @tab Masayuki Onjo -@item Mark Wooding @tab Mark Karpov @tab Mark H. David -@item Marco Monteiro @tab Lynn Quam @tab Levente Mészáros -@item Leo Liu @tab Lasse Rasinen @tab Knut Olav Bøhmer -@item Kai Kaminski @tab Julian Stecklina @tab Juergen Gmeiner -@item Jon Allen Boone @tab John Stracke @tab John Smith -@item Johan BockgÃ¥rd @tab Joe Robertson @tab Jim Newton -@item Javier Olaechea @tab Jan Rychter @tab James McIlree -@item Jack Pugmire @tab Ivan Sokolov @tab Ivan Boldyrev -@item Ignas Mikalajunas @tab Hannu Koivisto @tab Graham Dobbins -@item Gerd Flaig @tab Gail Zacharias @tab Frederic Brunel -@item Eric Timmons @tab Dustin Long @tab Dmitry Igrishin -@item Deokhwan Kim @tab Denis Budyak @tab Daniel Koning -@item Daniel KochmaÅ„ski @tab Dan Weinreb @tab Dan Pierson -@item Cyrus Harmon @tab Chris Schafmeister @tab Cecil Westerhof -@item Brian Mastenbrook @tab Brandon Bergren @tab Bozhidar Batsov -@item Bob Halley @tab Barry Fishman @tab B.Scott Michel -@item Angelo Rossi @tab Andrew Myers @tab Aleksandar Bakic -@item Alain Picard @tab Adam Bozanich -@end multitable diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/slime-refcard.pdf b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/slime-refcard.pdf deleted file mode 100644 index 66e41849598c6f036abad7f3abc9fb46876b2209..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41845 zcmY!laB`=lhfE^W~Qn8SS3WRw&{BkM(-{*(9l@lhgMI``S&v z?BF-=!M>dtr|vTSpZ@K(f5HBYX_xQI{bzjjW$qLu|4AHIS&h2Z>~rv(sCMhs?~@%b zt^Vx3xz?e_PyO|#TaQDHZa(-sckjOYkJ^(iT77&OtM|#oE3k^=Q=w>J+LAi1Yws4W z`7XfFvBmE}V$HMjJrWx{7EP&sP$}g;`O^swrqIMG$KLJSe?$Ej{}Hbiqw@Rur?1^u zakHWH*=2=OJv$#&d@8wdQ1^2xyZG#?^!JaQtAgaqynjpXUnASMr(cMaT z4xi)8Sr@)iR`=*Mxth)`6`|IVqE#a1ZLsBL$V*-1(Ud#$n$MRcMD#e^sg%qIZ(@ zR%!3C>fE)adsbGfm0q)cH1}76{Tl8+UyM{YWNkX0YpB0v?a%Egj}#Q1GAI8%-?(($ zk3=@bH?p$~-Q~IisyWxcKJ+u>wy5v(HJ^69yyheD!bO9#;Gg|L6Q8!_8C^*ePaBw> z|99z1#;ed^iTInh-fVyL_wv3KYnrdzt_{7V!sW?gD{mXo8FO@JWs+FQ(Lc&n6OAHo zxm-O|b#?gxjb9$~(?0yXbatxP%rhB3yKgzTn6LEmN;p>@#dY_s$fX(HX`-*+seIA7 zWwT*g|8|SsMdl0#c@#C%^qJ3kJT(2R*0JP-ldIgPmdGd8tNzrzQ8l^IB`hXhcTFj} zWajE;3asm9WOA=sb-S7O_`hSTilb{&1&%N5I2C^h4;Hk5+1WWzIWjE zj+!%#Dl^kHUzz8v4w`sM=ku%HMy)kz>M~hD59Xfw>Gw1D{QK#`rYk=4?^X@rJE0bP zQBwZd-2L0v&Y9ToU&ZieaB$uR4Sjae%*dpbX^A(>&+qBDzSy~=()U`zm59YX5)Jp{ zBp$q$`|!2f550skCWa>7h)?iNRuHm!@4Pudihb=1MVJ42I&Xi!c(Xb4`_z?+ zdO}@kr3MSz`M*xj$Y9uP!(=dxW7@Z*lezOn6n>`twCz5aqr*0Lhw=Mw4)b z@RV5R-8TcpVil%6&z$7fC3^nVoGsE}(Z%bQwy<@*Z&>5oaZ@JNY%ObuUe2pEI@{OG z-Y8$XiZ&nhc^wSq9^2?Uqm=x5$-+je$m#){( z56`$S*pV1(GW*gtF`GJ#`8nqny}QzWyZ6-3EPb(by7~_LvV9TzBW_)U;ju@c!;1 z>D7ykgpGneU7E4|f)Vpv8&S`9waGHMKdl!sb+>q#p2@d&%DFL7LTLUcZ;h*Y&NG*# z8r{+nkg;ttS)3ddz4K0mU$)93_r6Dq%GuTCu&(Pj*}@oU`gL;s6Rwp^O>e5zuE)Kp zAO{Z=NpS>a`qA=#Lrp0G7 zb{$F9Y1)jkQ~%vPFwel@&7KBtO(Qn5nU3vqS4iZwT}#-Ul-PXd&Ek{%x>-fKQ`WY9 zy>_i~^M`L)@n1D>@Wno=Ir2er{riW{l%Fs3atZQEZ*mmk%E(F8SlKG%aW8!Cl#O>z z_Pz^I3wpcv(Y7?5S32v9ijKWXJ{~fg<=frznAp8hq3e8KG<8^_Q|rNLhM@Gf?o(czxvTl{;a`K9wVzMaaqk~A%!t-b?%y+SavG= z&&lUj<&&isOx(2DaE9dUx4rV=SGaB`)jmDrFh5`1o#k>si>E}q-(0gTb5iG5_V#dl zoSHFNZs$fvwWOErf4ILm+E1DB$(#F+cXHRfpNWERw(QyD;;ejUp-ZUvJFfEVDgBiz zYjVy+s7O_Pu(=vOA?CX0`~J1_BxO$Ph<;qzUH|&ki?xQnKI%MM*mupG)z$d zY`&FjvMbr~!P(v2xuEvz3#AXA*v00vTA#bHGa%3;N z`}|%1vI*0?a)}w{lmeDrnEze=&4YO_ES*o?IO62Q*7J0IvGGLrTRi*zF#r1-qnGt0LI20{oHvoT zs&Aa0qis3SBjo>!#0`(5^KRGHi##LH@C#cr3t zksTbRmlbER?`b>ZKB2ciUnVXI-oInh^o@SWk6Rk%r=6PrzMk=~egB`nW1O-fE86E; z-_aCr`*!VYwAK{n{|734ICOpI#m?dQs=h8V`$&iQ#Isd**E3ZRB(5SM;XYH@yPQF3arf}w(eLJ*g}Z)!?rqEmi_LbQQ`fr6=} zsh*L!shNU>iJ_i_g{4I-mwrHEQEFa^f)PZ6ot*;IN)R8`ly%F`D^akqQP6iYG*vJI znG9l@D_FvqW(tNNCkBCpEffsFu2Il;vrsUEtF}}yG>0lTGEguAIVVWL&W=kzpeR2% zIJHC}T0uX+#Z5s!B(g zbbg*k#VMf`O)Da}xQ;f7Ezt-#)lzn~a6%JPGaJj=Lk3}NTu%*of_0TN%JdA@t-Cni zcz@bi+xmC+(&xXwoj(73Vl>PBqvD4qCCIf2>FHQ?bN@MfxcP5{j{}q15i|Lat_htEGSZUSgF^SXR>+-doHVx}}jtNc_V14MM zBsp!Osf&~5gJdNZwM#D#gln<>zUHTKz%GLEai)RG@(mFTPA)7SO{yGTiECzZxgC}G zaASeu(mzkbqDwKjt}mqvkB1;`N;)HT$Xg zqAFj7DTCL*t7*=@Fd zjfxJbHYEY4DLhACVMVA02qgX!XXZoK? z&-`MYtoX1)>WI-xAGL0gNw1&A-_gFy6e!51xPoPa|;MA?%yNnr~xwJ*H->@BI<2iZj&BTXm3)kO2d!9cyeb)wy z1FdHjqc=vrJJ5Xi%s=ym9-WU3yw>#d&%EHR<8~q-F@m>SL;1VG#PGUPGxhB=PH_JD z@=cX_R#LWW?Z36(n0#BsYu{O~KU@BBJ)2VEZg(+OG0hXHpFjP)pvI>1tmkIU%h^{a zpG+6wiT*Mpcj4UiPo#A_p0Rwa+I#ix+}SD5x#}eec4VN3L!C->J_cP8dGfWaaws@o6{9Dc)z-zW)>ys`~V>uzj$Z`Cj?IDi^Eo zeLL~^yDooD;nodWC-)}$&G?a{YpPp*$E2e2`q{?T9VhQz-lKgs)!ol!dd-f*=?h=H z{{8oD=80~p^go$Kb?Fh3Nwsz>Pc7efcni<%q)TsSiIk}9<(~VXyX$=qyZ9qF-o{^y zR*xP{E)p=_?!x=~N1|M6xqs-no^xvr$}=o=56gvr^Y^He4Va(MenN`J^zO+|7hfLU zs2IlaBEWp>{@oe|-?m-r+dsFUG~4TnwZC~1VefNTyYgWk4X;oVH{71|@Yh=5H(c{@y=2{kPiQ$|Tj(_g`#DIB>#PLpXBIxfxQ|>)%iLdGPGs z#O~X|)rG6}tk!be_UXaSzm4g43!CoyiPdE2>!h}6c{lZ^R=EFNpm@w8(zw^i_1T*P zip~4(N&K^Y@3-0JTKRA3;*5|Fiy6=jvFpK|tMLrhxy_Kf+Dw?e8#K1)xe4Rxv`F1)!RmOFy_YsRZ0g z00|m$>AU77=ci=mr7IYLYiUqbSX5l%oRL_hU}nIj?~@4Q7;))`XQq^76e}2k>u@f8 zr^Mn^kf93tk*+@BKJMDizP_GLh6Y^vAW@gp;^d;tf|C3q1w#u3P>Tbp+6D>0T<2Jv z3~FVVS(NxN!}8@1+!xvg*n6w zo1!_QB0Hu=MQLzp>exi}JrdN>z57N*EU@D0{L26RXD;|yJet9-mL&Z7#s|mCGfN%? zO`rX1i+y04XKsZ05-~mX)af;Q@ANI%bhXEH<(%!a7R%n8(8`1_MP}&GsR^4 zmSy~*vz-z#Q@<%vqZl3pMv&GX5kX*VcFEW%+#tXp@PesPfPqnqxWQQP+{i z^EaS`LF?Q-hEUFns_e$>NolNSrtt?g|KV$cG>?)KGyHfoS>A%s@ZU%m6LxC7Kzb|JOFz-fNWlmccF2x11PQ=YLz1PTf}ycFyn|w-U}0fujJ>;JX=Y)n00y8k z8vkU$+v%wxF}JrZDD*98a&|1xwei>>a7T5ANPvaNyLa!zINrVEJE*vWo%fxPjL??X zbAI2mefhht?EkBap{7}H^4INr{_9&z_WM9r=aoxNDP=JkGI=}X%#FAadGjZu{FBfd zjSOXB3IRO5ZO@vSC7z@(ZWLv=Z2Zairlv-Qfpdf47lvOCpFex_{F%dI#+rs3JFO#T z%(P~FVQ=tf>Je^%t&G+Y63sb`pA^)KH}Gz0Gdv-+fXi?jgZ0kMOfGBJGHTV&eaI2O zXx$_mb3koP#+x?`!raN~4T3k$91`n&tFM|F9n8`2Jw8!5efNL4B1UTqr=<*E>a&d) z7EDqTh|Vr=;JhKy>&wVAmzSsX=l+FX=O0y_vv#ehgIWF5|EmN4CrhLxC%*j`&nX~n zovyxt*+DLescggF^C7$+_TPDOP)+Qd*?&u|w=A2s8HjB)-OR?^@SiKv!Yg7&qwf@* zIX!0?mnmesf4E<`VeQF!F9+-I+nHuhS+lEUjn?J;*S@?rRGrYecJi#;f3%2+gnvx#yuYztkzGXhU+9$aF*{0!?vw#v#tILr~Y66V*j*1_Y?IPW*Z(k#`eX(MfyP6yS#M1 zZGY8|uqQO%X!?KFCg9(X{70=})BdzuFy>tPFTmg6`%b>;m)4)z_Z)4f{!@IhbmbrC z3tFrG3xou{z0Y!YdCvbApB%HL{yGO3Kd!&U+Txe^iQUQfVEu#myMLG$7SH8@xF^+rG#q=?J9Eyd@I!>a$_} zDxQggVQ1D@`Yqg7y-nD*z)*njBj#3P1_4trO|JUVmV zPA~Ug<@uup`ga#kb@^-*d$0C--z&Wj5}WsCzWdc89afl@yT!zFb%Mg@nhzG?opCX_ z@|9DCmbo8ax=>xYqdh!W>28#*$&S8hlY>~b&+aqn(f-n|9TvoNsQ;vc{ON!xV#}s- zd$b#$tF`m;d$jqTY@N=wLUz{Wr^J-!o!a-o)6-EyEbXoL|Ls{5c^YP}Vou;MlypsX zu`=K`Ut)E+`N!geUn~zEIc`un-T2uxKHpR7QgVB@E|O*TQ)B+jH1nv_gGwj6B}%j2 znRgxkEU55QJU*^HXOaHbw)->1(-sBieNm5P%XK+*eeJY-&MoYhjF)||xna0&{|e#m zUkd_na;opGu1x-LW|=|3#MeS+|u5r|r+3Sbeav^x}g*2ig=Q)_1ND314N_`RwP9_dnEkvicUx zp5*bE`+3?z!?r!2SXQ>*V7~u8RB>v8M$HighoZup+4%`R%h$aSSS9)Ki$H~5pv_b1 z>J5RHSH6C6{!;zqtfrWGGneGqmiIZ;E}NLhcX`XHc-a;`8wrQ^2ZWUso_%4?Y*}t~ zEn-polfx4ZOPJ1PP~H57DQ8P<-o}`!OPW4O51At#R~?r0-c-dnp==WW?V!}Y-kHZ{ zZ+czd*rL96&$`Dw2PU%DoXRh`R(E~J{8JJ4K8tC#|M>h^|B%n`X;WXPEZw$PUwmy` ztaGyFCBx*-iAPu>e9IEvAKva7rM*z9VqQf?kVoH_-?#Vw-ottLRnsH819df9FE;-F z%#o&^b;sh(tH1|2g)8OR!q|IGF3V#6-?{A@>)E8nWDWBR$0EdUor?Skc9>o#^;r#d`Y zdi10@zuKi0UfJ81#Rl*ey$WBpP_U0JRPcFp<|OB}FQfA~6{|Pvh{hl77YL6$7Jojx zyO}9x;{5rBvbT@CR{z*tpnCFid(rW`_qa_1PWZfGnq#c<^oZ|vF~fIlPHVI#ZYvTr zSRH9LUuQngw3<`1K1@0r+--eF(V`Y9~k};T6j6)V2IJ|*-j=C`u1+nI(|&$(S%!*y=|VPq_@h=4DQP=_BQ#}>N02H zg(WsOrvK4hKK-*@bLY2}Udo!)W^?tQIsMrFQ~GwTt(B|SV(EW#cxqU_o2N|7VO#BP z(6D@=Q_)N*mL$HD$@0PeRU6;m`qlEOud(>-haipZ*0;~3^Sz!L&m$YZHlkhZ?CoUN zjL4Sypx1833}XM9Vt>v!b<$hu^Z|?GkM~L?)hlgP{^`rMyL!&#OO@00)Q;=0{F|<) zCa`_gwsmjZWtW$0&r^%qlybS^^Vb_|oW8n$)pp&#eQVXDvUdyFtNE@gzPeJUfBW+` zarF)TW)B~qUa5PR*Hpfz`jUJ1{n+-S)?%yW*!5;71YUcvS?7qfVbzZ5rO(T}`HjrW z>o&wJaX9yO%hJr%1y(|LRx3Q7;&EWDho3+Ar5=%LEl^3|L zJDc=U<&f2@O7nLG)3(}Ad9%oVX=qBPZcECSb!~HG_Z@scw{`FTSkXkr4mB(HRa-S@ zEBWxQiFJwzU2gWIc~Vob!newAb{|R#ym=Yde-~5~UT70~^U=({?oa~>HjIeue%^fAHrcJA#H=5Z|CfAO#IQQs3>W{dl(yyui! z-CD4(PIqEl+Xf%i@Ph2!A8mMDUKq7k_licA+~SUl{3jxupJ20kn;l=1jeDT%vHZV1 z3zB!dU$<7_Ls*oC!E;WFe=GJH%{{nHVC^2+n|H&Kw3bOMXV@Pf)qYFRC;ZIrr=O>Y zBXOqMN_*Rr-W5`E-Ki0H8RAdsJYQk=~wvMr0E|I>+?@*-8TK! zirgLj6CGYHFJr&-`A^WHx_t|K^L9HNIQV_x((E5o)s^@kClv2GrF48X$M<=YX1owC zpOm=$an0}h!t1+EAKUV)$LYzY<%e%d^#|6j&pF7h$8(8)#p>G7m+$;#8Lw;2ZQRbm z(`xl>a^;2$@g;#@<}%IIOg!xPt@ozoHMh;rZrNK)e(FjV%UR_Z{yF-#zy9^R@t$!p z){!^DWh=ANr>|_3NsNuIi@SWSNA8c}U)6U8GQ;plnzBh%zR-WzUpW#+V%1vSr~z;HCXX|h2{q>MawZ>+#ArCzD? zqMr}vofnzCx+-4q+wE$J=?84DCE5u}E?(ctYB)h9wCKKT<}u&SZx8e*CszA@U81pb z=HMRFA?EP`>*Uh-BxvOHj?lf~>Yw-w8UUcGbOqX=+JGQ{;70O0G4W!nZ zPA>THQAbGZ-L8m-_1P`6tdu*<{v0`+(>Kk(so`h26!7HsNA|L^&E}#{;uDbPEQPy1LC1*uX(Y7ZC8RZ3~g(b8vws`H?E4-$D=3OnN&Z_xr0VeNN zyef8Eo#M*r>`y6no?16~#i!)n8DCzx7Z+TeV1G~G5rB|}n=2b`7^%drC={P33Tx8p2k;6^J#>ug# z^L{HUopExE%hB$gdheK7@VRsP8mSpp*A2Y(%FMTN@6(Q6BW?LOUR*VQj#403)8u7y zUwoC^toNYkgYe%ey@k&W46f)Gx+$`Uxs}+xY3$5G-jTy zuIH4KZS8x#9^HJr-0AR=^Kxuk=H#y14i0_dRcQgI@mWvbwzEPqV{8Mbk^l+g5Tt zc;m$;%-(%GRC`wMjrCzq`TjS@S z(|G4(*~c9sQ>SjqoE*n9xo_)%BynHquxSpKmpTG89+WyUa=qYJP`|ITIoD-UaG&~B zO+f~1q9$kIwoyDzQyxQ~mo&po=n{3(r zi5K}Q#~$zPzAVAy^6mPgQv2WW z7VqjtF)d@&^A+|ux0mrj#j;~RqB08ZE?A*g+tcM9y6w=z zsk1d1c1>M#u_fW}ueOlZg?^c48OM`0Eb6_~R($y6!&HrbzUAECc$=+uEHq?^)XM{5wll9Oo2EUk1HmX4{l?-){VF+3%n9G{018)r{vSZ%kj^?;SSh zd{V<)=AJ9*dUl^)PEUUOFKWjx3udvf(Dh6_HonV#Kl(T;j8mVrcwXtRxk@V@CC8o$ zN=vpE(yrt(*MGviSgCOHguGA-aSzoitzJ=F-(AbErJvBBr2cnn)0L-7o}_ZMxd)uG z>G-lrXvSy0b4Qu9434b$`*g~VV+MK*N!trf?O%6UBaDU9kU72e*0aFNn~ugv#J1`! z6E06mz1?biB{taQVuV1=uAWC1CGGVY?kCOZQdQsc-N2t^vZe|{y52L@J-qSaCpe_D zJ*7gQl)Y*BYW4DlM*ZVydWNbyBp2Ccr))j6K1J2$r_YIbHbJ%^K1&ApS$Yk zc14fQKE2D6!j+q+A1ax=c(%j2mc)mgKFh2P`%5{~j(@l#?bTvFhvRg{rYmiYPAg=$ z&dh)QxV7@q;{x5gA5_z3P41YV_*O4ETyWKlxl0&W`aW$qR@un7A;`Gs)$t|9^H>;L zJ{_pKli_H}62PfgRg(2CVC%ODYtE?IS3RD5L}BJKb%+1Ywe$IMH)}sTb|N8DYvJdq zpT8b&dL`0j8s&cPeM4JA=Bd{g-M@c*uY7h!L4(67yKk~iyl1X3-af8*%yAyOd?3G8 zD~rXB=AE0$fAjIa*xPWbtqzomU-%-ubV={Q;G0(-Y`%Q={;3zUR@%1B znH9Ri%Z9mM=#NK#dU=m0PuEwYYj0|H*YVw{T2y;3qU#dJg7Dx7yS6hc+??9d$QUL zsh@Wntm5Qu@3bpRKk?LSz0K^D_R?eT`dHnM1QasO*x@nZ*KGUHc&)`D@mW5p2cDP5 z9h-HE$(HfRdX?w;m#;02%ur)3v)tL7TX~f8Vw`Tzwl49I8*?7sjI9pL7g{XiQ_nHW z*dgxkzJGO2@1B1?fAsO0`1eI71s~SUb9t`K5uzL2ReNrZ@kH~-e_X4hv)+|GS1-@5 zlQU=Sc(qrR>(tzLIm?A+d!_GLQz@>(F#AFM>7aX8Ret+ycyV4eQ8cPsXogwL-Q?fS z-qSgMo;jkS^Y-8CZ!4Da|6k+bEb*;t4*&lLtK`neUVXCmaL<>9%;+EPXWu2;&%J8b zr?GsIxLQicUrqKithd6-C5~mz{Ce|61xrq?0uOf z68;5DMR%eS))^XoeYnj$i7muF=bRC5P?bZ_^*8BXlB^$9?OrE*DDL2G89$Z%V*8%W zF&FIJS)ZG*xWV3F$=|sLIFtTOR)6iaQu=iAp6$6yZyi=DjeI_N|C|*&MOB4$cFw5G zTz%!)vx8SZFN*lo%<2EGHFkcwSI&~(ci7jln(#Y)(tq66cyj6e6;2J|Lb0pmxSw+b z|GKdz?)*~SGx;ozlAq^9c~5+}RoghKBGuzhQYM?Wjcw_>TE6waV>>m@%HCWhnY=Go z_~4JtmD^`ZehJeF__V6oK5Wkiv4S?~)hiwUU*iZ{FyZ3+H-ed^ha;z7^J(+mprhrH z=z8J)&kfhEp5bwss}lRn-Ti08)~T1;^;ZYn?O&CsSGDKQF}8iN=UJ9T1+mYZJa_Id zHvV?wOV?z~Rp;v`{a6|I;%G~6{*$ybd+!u23UAO|-{~vNEPEsVx1j5P5w~US1{EL9 zn$M2eYq5Dv+j~2=fVR>-d(W*YU;O4laNs=VRWpumomzRX$SUESS>xNjr0tGV5uJO9?VO+^w5bIS@BzIOjR+vT;DN_lF* zBzG>mte>%>F>l{Jtchr`J99fB?3161<|BFQD_Xm!?5~^ZuC?*Vgg;U z&~2+oj21ME%{pEeFJWCjXY0~!%96$9{T|6yxhqbo*WGGWK9H0da%{ufYPXxZ65D zCduXbelVEH3jpQ#rq1V?O%FW`^2ockmQ~#{@?rN zrcN)Ces$;A(bL~gdR$g~el|j%_a|TL>FACh$**@eow~7WUy2E9mLZEZH)s3b9+jr) z>Z0>Y<5~{C$gAayxI6p1K%1$Q=QXK9FO#;^zOr-i{HNpZ{%%>QUYqnW-z29zIVyMO zTfQ}~inqvB1iXqo^kd`AJy)k{3g=eU9J=rM{Z7H#@O6#qGmhKWUvp~isxerQJ9$a_ ziS+j1Z?>;x%jah42`dF`f4wsNTdtDMbN+sQj-@l)oImaey}#J-!NjoKbmfp*L+u>T zBk2i?+vbUJd@8DW?qtF|)xP6mTC3{JAGyc>mdvS%_;mO67BR26Pj&@wUbpe@y8lT# z^&NElZu2`HF+ce0QbftaC7v(O@OU_WVRLW1v3qmQHh~96&&Bo4@@V(h;(jVrobk%s zV5gs7sQ$FHMVI3ae^fL6a$4|5OP9- z>!w)dySwwuK0MuhEHXh|aMjUAM)TkN_FLXzJXdwo=6R1o*Q^xq{K^q?=)=CO{XZrc z{noT)Wxj3_y*!se%)Mr(ft+5|hxcvfuJga~e7L5p{ncuQ>z6lm2lzEuCw@FvcwN!T zlwZL{T4l?{PTxHN|Drz}wartoRy3wDJ& z`mtsUL{7@co{+Qs{o;C?W5ut8{j1a>R&h_Bv2k8yPKUxZUdg(rdpHiYzR?cyo%8Il zTF;E^%Y(rmRr!)Ol_?PixltJK1To|8nhgX(>&Y>3jS6e$jfL zeJ!Qp?(-f+XS0>PUmtvILvEFv%BGeF+t+DNG&*+t;jaZV{t2XO9aF!ZBmXK{xa!6m zDTUX6_wJi4vh~XY@88xtSF73_^WLW=X0A8A=;Pn)q*b;TjH5rFIJCZJE5q^$&7y)k z%4RWKIsBzYR${l(7U!lb2RFU+F8H&ta#0-HDeby{!fVecOny4+qUL+aq{Fh=k!=q1 zbXWgwxKYEs^9j!h51R+PV!VBl@A^JD?dRe-`tGF8{>|w}H~&xGzE1u7+a{-ro1niKVYhx!?)w+R!D@9i{v!YvtXQclciZn;Fq-^*u|`Q`c{L!S>xHT33W- zaE1Sk{`)u#JsI_@A@tuv&6oXt0LTPe(rWfVJ+Jalg_ek zx%BTx=(nO*|D{Ye$!?AP%y##%>hI)#(;r>2Js-wlxAwWkAD-(hk2804C%p7gsJ>F6 z^Pp_`maeW71%)>AXO(O1ak#k4_5$bp`47?$UirjxVr5I&u6MIPTxU8x@7vA*PVukq z;%`<&oRX_M74zZKz3$nP$75dXkWBTG!`1m2NVE3EP2EkX>_G~$N)9dZmgfrK_E;G8caM_%rckRDw z*feWfwXyw;QSW^v*sQ*5^*Q0%<@YAo>6Zxfs(-7Rm^E9-?cg!f>;(@6E_I}QtE=Y} zl)J$Z#eK5Z{`*bm`kRc$41}6z-$)BCEOV4$ak`c{FUV2-{f4QND|5a$JFa+J!@lvW z+tN9zozEn{MV?{2uD4;!{*5V-GyiHlaEWnWTsU!Kc*^uutIaz#=*K4<-FO7AbP-TQtW*-W9sgCAURyoC*>{QJp_h;TSot;X zh;QD?cYS%`b#?Y-Y&^;S*SQ1l-t3t=we&{!%tVU`znnM&f)U* zsJ=hvx6jX%R`lb~x3#+SOWF1Od`)AOuX1`^y`39k{aLnz7JuDkoipRgI^Evf_JBv4 zleBv)lp>>-zpzKf=T5Z}_tct_Q+|G)g7@A``Ftx?HeBWze@&Kw=Y){`TTbz4 zJKj1n%U}chwYqCRuSkSjr|g++-1TnCvt75Z@-x2B%9?W}xs#1`W6fJHZ(XUgD@=^t z!x)T&HZY54?APb*`lY|n`rD7sO7Sm^_DWv7njiCdq4x3)|99J5|Ja(oWc#x$;kWG3 z+0Qo5F!!%%YXT7#+aF@;Z&zL{2@>g7K3<;o(SXh1%ctvn@A!_% z>Dg|dSZgr3(yaeY<=hhGuEl2(3d2mM-dOORzh{Q}j4$W=w6~neiB_qsYl{+nBFn_M zWYSjNJi}w5SGIrX@HSqNDqXW_Vr2NcXYVgQtvPg*OWtbpJ@;$w*Y9edloncWMLS=> zYR(#~;|rPA?E2ls2J>uNnCtu5$SYkelp)_ z>+Ac^xl7K>pVPJc^?mmJcjnfZe%-c3&}zf8&1SNf|5O-GxVyJ5LEYep^NQ&&1g5_| zDPpcP-O`^+`EzR~$A0~#;TO)xsC8d4QrfW5bXT3ntG)UAL*|{kw8KMUw#9TFjo-It zb_cV3UTYzr*;^2>Gv|EfNjc>vJ3Gy*zx!?}dUNOhXIrcA?BHZs*P_;MZ(DCX+hJHQ zGI^z#XTwqPi<^wnCoyf^uB8^Mp!jL$GilXbF8lc>g=)1;OCJ1tOZR?xm-H=5 zFeTYlddqs(MP293K7V|+Qg-@#tBXn1R~$n2M4WLon^hLQ^JJ1%ewcB9YePzswRY&V zU+caWFikCdll|B%sKsk$fwXDRr#(iy`nf_pZ|+{RjJ3yLk)>Vv{>jspXZn{}d+*$L zr1`6zX2|ZO-ygf>&vo>9O`aMxKh)%t$L5WEFV|i=wbe;)$MsiVcJhZNPK?_-Bkzq_ z-CY%_{2l)%iuRvu^ZR*P=)>2%YXNuIdvC6{)BIL@K`1yg@SJFsT;0c$OOFJuI9aXz zQtk4ZnIihT?N;7gRAlU7W-v`_^fmYuh*TU-@d0rVq}Quoq7;-PfEN{wn1ppODhT zohQ#aowzxlyGU-;vrdi2bAr8CY?uO~V&ZQ;e-i0kXZ0cA%3YVp4e?VI=I_fXeQG@8 zo3`e&V&m@zKONsF?kHiZa=9mC)xU2OUU*;i5a`+V!{Eg7**$Fsk686qXztp&C3#!w zUA3Q~XTO&0c-HXe!@g3dU(X+KKF_-s)3d(Zkv#%zX3ao8EJtI|jHNde^w!K1FEq-P@C9KAU?! zxJ7oKv$n$ON9U`0eFXc}Yy_u&y{GWBeEQGW+AppB=dT}hF1h6Kt08=Qj_f(<4I-i$ zM>?-Q&a1XyHrcm$ukZStIUB6XUJKv(X2xv8d*TK|j?;VAb+w#- zpndqrp(7%T6CC+otp3Q6B{jj?!B@7vs>T$CzU(5zA5Kl+ankG^XJb6(JRk-_l0wdx*eUa z{J`|+!9QCrya{dNYOBjp%nB0t%9;BkM|bLHhYKxN?H(=<`L?_2y3^~_yy&CT&mZ`I zSp3$1{SW_L7?ZONP8{S+VlLX?^gI5CT7+*Z`o16V_8Hh>GMvl%P*(Ut7Od(cR^AyJ zBCYT>G(s%#H3lso4nkhy>){>h<{hl<>>Gq_fv<@I+5%sY0L*c?7Wf+DUf_#r8}jmA z1K7%5GfSj}y~c)+wTqBdiMmFnhR~J01_qW2mS&cqMTM9?QqxKxtRm1tWc}p)+}uR{jLL$H)I9zCyi|QxeRq9NeII>4{Q&(S{b2nN z{Y3pF{bc{R;g`{VJ4Y z#Gpli$g2dwVGmxyXlh}sU}_3l(FlqTQn0x>XkntUg{1-rgLE31TPPSCgH~>Xc%}v* zk{E1e0ov_lZUJ(ou^EVMpkM}G*=TMG(hrq4HUqoV9K6gKB#wzec7l9kVqyYT3!;q; z%oJeaAQu`am>O9qfLIpB5WmA@LE^@iMheE3CSX5-Oah64Yy{CD3^Eb1&=Zu}VM!2@ zKX5GcL|$-hXs8cP6$*yNu(j0+#ukV)qF`(Z7dJ70q!Y9hqhMl$P-23TeiTg15K@+) z)TCf)02eW{)OS@dNAS%J_1zWB5r&x?>w7Ago50nZo9X)~n42T`7W#e)<_Py$80ZHm zSQx_PEsP-PRl&j(E@o+tnR*or4G_*WG%zQWniUL<;DLp_IMx`HT3|5%S?;P}Xkn=U z0fbkv#`bUII^@997Hq{4`HSN$_lvJV7j|h};ku{r;)#Oas}~Dis2z2Gz4!-5pRCmk zxwkjD?iZ;1{P*P1NsnNcV5v>ZW@Mfzxm4krw$g3N5#QGp2d^x+C1|{A>XpEmrg!uE zjaQXyR_N7Qyw^qcLJG?S1{+;b2hMpPR(@F{szoaAo)GHRFv^ECq zuD}QjGe}Snu_8UTAF?RlU8g0}#_1W;uA8E!p)C>zby?Qx9P!d+6@A-OVbTv;k{|Tr z?u$)qaU0M4`9A$6@9wCim)^%S3_E#xa!loKO86vuR^7jvc7A5+R*~cgU&Hj&^dh_1 zvNfB2MwqOQ30o1h`Rr4NFGW*aST9c1DDCM`Dp+i`BY5>AN8b-i*f>n{|7G6e**Yt- z?%s?L?UV^Fa$xeG4Rjm`By zxdKeViz=`Qs9}Pms3K-fI@orYX`nUf;Cu*OlMYUY$WAi^IR~a1l1V{p(k+nJq#GHU z;aHPyU}^$M!i014+bN+j(YJ4{FVuMF>a7uEvO`Sc-Mc(R3l>hHjEzi3@7~>Naa1$v zPFM9pk?hRE?UT2D+a6y1ZJ*8aSAYB_b^qLx-1EQUne{Us=C!-TcDINg5z^rZNNdusm^lo33hK*M)R>#6NZ(+}VlSMwt)Z!vF~-U14nyPy)jv%Cgr7YYefH#d z3WJAZOhR6n*|q?N$s(WQC$lgJ`6ZZJPiQrEILeg8UDlM|pd-T=B``r&f{U3+MMjo! zR{h!n_Kc>x2lM77Xe+3Riyt_}$HE%Xl>26mq2<4#pn`2}3@rabw|y%3`F(==jkB_P ztO>uOCrdI+-_m4ZeTX3}A=`&9l%vMn;Lg+kZP)7CPFGo2t%|bvEBe2D`M>Nthfbao z{AO>g;HM`SutC~^HHo#X_}}@JRS)Vhi(Kjrew_6bRvzJhUk-Hg zKRC_0p?DipHS>Xc1<8C1j9IwinHsh~;XNSrsO{(V#-c)Ii#2cmt@_)$r(jD#`}Q;E z?mjG^D1Lyk$-*-7&$IDX0=)@OJy;g|1+!k70|SRPFH+0J6YD6?rlr`*~Pvma<`{hy$4$N97Q!S`;z z<%OEoZ!X!)VA-(ne^tnT$p-g7`w|s*bUe*(>TdX_sOPt%^Q!y_)&~s#8|zCS^0(w? zd}cqCoAckHBKhqJ`^$Ib}-`EeC*8DrLf6`l-wg0ZJ|6kXuqN;dr z-y53`(>4`yoqdW&>5l9bS*i8b zUf(e#5^evxTtat^_VEdP{D)>c_3SyqZrqYB5S6mT+VuvL2zUBV^{1;Bn6HhOV!hG& zqsn=EQQ7_HW>f2D1Uy`^?9Dy1I|+LyPyO^QYp=nw+gaH)Wt&y^n#Fi(8r{kj6xps} zwW8Yg`^Us7J$uWvZNDDL5?d@R%cOVgtGAR~7vH%R_t_WtiA~xk-(P-o^*8k4i7mGeWFOaCsdi$!*lcst{hx#nsVu%I z|LUB8hIUTvsySi%3U{wMv?)(S?DOZDevK1-R(z3V6gqCbO88OK-<>nq%OvG=^#vMs zo^b&P`p#>ilyMq4&T-p6KYU13D`dPkGFDrH|oWIb& zFLSR;?%sV0Ej25*YrpxXxzSDW{gK1Ae^sImh|ZMny1C%g6|)V;_c^I<`g@It_+Xg$N9a4eibf#Zy&elf$)UVjF*yg_dK|@x1{xB*iNZ$drcm;o3itF zpMKZVouK!qZr_E}HNj73#+0q&H+ngJ-^QAx#4EBd{&}?Bsx)8ZQqcF<;P*GXkQY_? zUH3e~MCO#AIc5>^ty}W`VdJImXLwhA+`Z0eLG4u6olfzZu}|A4lw3I??6a?s-G0xW zRRX=8`6gnVTD9Lcb^Z8RddkLpyT(F?bByk%{C6d&e_1*`(1PvU56k%1T2hJA&0A+} zSmkzG=vRMFvHq@e^?5fWjs&<>O+G4CdM7FK#>U0h>vH^$wApy(iv0N1`Dt#mtKo_R zZXLVDUFSbvc45i9)VTul`||Uy#umQb`%*vqZ)=PEG?()$^1D^e9hG~WF+J_~V}F@% z=cej<^se5s=-Zo~`l~x~t|mvH{br_-r15g+maEg9zhBaekbl&-ll$)t_bW@xTwl9P z+BZeECRc1ieW0(@sp{qj@^TSV)vXPcWhQOJURK)OVh%@a~B@j*GXC)|19F?^;<_X*!JU{XCLO?*MGR+ z^uEs?8{e-?u2|t=ZCRPW`kc)C(;@1S{5QFM!@?&fa5Cl3`=WLva`rB<2QjTvuh%x0 zT2`Ek>kzV?=DQ=?s_|HtdAHZ?OiksulaWj2B`MC>p&+4Ya{sO23oVOKpN)klg648( z%lu97_P!xhclbx{##zcCua|$^#^Gr>X$rUT!KGZHMoj8S$5;CXT01WMw!YWka^RM| zZj&!=zGCUQE&KeD8g-*C+q+rE1n~-nlLNRPGt| za#(&0zq(n~@4D8L?|*fsS?CEGn_t}g#g)@?0*mzAT>(aQK9h6GCIlYKN@-tv#cQdQ z;MDzPb&auWf?a;^WAClXof~cBS&4r?xFOa8LieIzgb%%~xU7 zrw#uTR^@YDT%QwGUz2&}g4h*9v7_z0v5wjwf{(Nv$SZFYToO^3z$G;OJX`(qryg}v z#XsIM{+^{`%;zY+a>I_lS2l5XDz1!tZ2d;|pH4szbN|mq{<6^cQpVQ_Z3!o$Cp}7h ztH*4ZJTqQUMbS`DMyKf5FSCOiXWm(8t9+w-+Y9b(lXvD`)h!h9=y#psUGlj2t^b4N zKfIJBGM2Ba`0K0va7W>hwYwS5e%IyYV3V!i@SQ`zDPs2b2MIxQX5I@A6Mqx4=+3$$ z`W>^>qK`SxN$qlzpKAKLV6xrodH$8JS^fzA`nLBpZ@uHhr7M}r61a*bC!PF|xVhll zZlk3Fg|^X#*Vik>e{O7dFkyZtFL~$imbQ<^dX7P!_fNA{+s`aKre3!*!|mS#t=}xl ziE%rYe^%6M`zBd^tbt#=HStxAAODnzqMja)gV(V=-d4sL*?nTM!m+)A%U6B2TB!WA zFQ7^O;2Gwp>b*Z7vz5y1nf5H0&82avwWZN2McZu$&sTO#OIDIdP0fF1c4;Sf*rl`_ z$IFus{@eVmSd6X0&HF9iMfo*mws)q4ybAKzf6wUI${BO-X+JyGP#3y^LvGIUHBp;y zUpo}`M5kz%lb8G2imR<`(`75eUhVo4w9cVVZTXuudt!dZW=vvgSjF=v|EIN~(OD6Z zJs$aurq>j>9=}VjUu@H^{dVRjo?Ex%qxNeY_W!t##r@bG5u>{sJG!nW#jm`e>+$m4 zw21+cfejkk6|<-B+1yQJVIOx$x||R_UE>dYdI@2L_1W{lxmBT*FW1j$TvL z|y7- zZnEErBTKKD&)>=%zsqWd|Nkf>9nQ~}XURXG8F*3g&C6%(lbGbpk9!(5ShDZiC0Z$a zY*V4@*4j(k-M)Rl@oewCx)GVEQ{uiztFS)P& zc#lu&ioU1mhc0luaepaw)bNQz&9qxh`(h5|y}IlkDllWq*Q)vZres|DGb`D>^XY45 z{c5lK?Iyn$-#Nc;(pr=CD%#46`&2?pBa&h^^8IFUk77z!5HFNC_e%VL+RKnv+%A1lz8Gfb9aQg_Ax>mRwlB^E~ZMs9Igxb=wOR)yqMA1u-@N*>EU{k<)BT1sQN!K~=Vlm4zW)iUX1 zJ<*skXOp7dzn!aZFeCBBHtLPwl(*OpGsb>znS=8XS{m-A6 zW)ty>toe`oZM4`1-RE@f1AAy{2fPpVe! zA=eD;XSHnx3E~}9nv*s>Fi!CQWthJ1+oor8zn^q@=dx{cG{Y?|C(T34pG**)aP_k7 z{PmaJl%8A6ST^J9^xC~Abr;Y1eWg3UCGP#gvu2)qF9|&k$XRjd)l04I>;BGjXER;L z`Xfhl`rkAEjN(>%-Tr*(3WrjYu-GxDwO`&&FYyRSIhFTJaYpd!BWeF9HE+r@za4Px zBE!_Tt^q7Y%N@8D{Aiug#mzd^$k=yzbyMHvhx;ND>D%*%Hqws&Xk&G(1YQ<3eO{ zVvOFZi+7tgI7}!K<%;>f+fOgHrowdJ#)9*gZbx10@Y3H{xpt%4!oR;dXFG0qu02C{ z`DInZxvsFTh)t2XqbA|3!GX{F^C|~+OLD*cC zZ@I4po4>-R11`5$%q=>0L-6pqh3lObeqHRm_eA*pn&zu#I>SyWeHNeNlDB1_?7e4v z&)yr%IT`wL-$J*Ix%UlTndt{FnDBp*Zb)s>vA3E#g9>KZzxD1AQP^(OS#f-WZ}eO1 zHA_64PuT5Pl$d7ojeFbl+%=_=?=~&$X=~^DW0TvdQFXddgp)f=CW7;_Pw@*ct?gd< zXZSuzE`HW~p{np=@nl1zZcDjUw{zIc802WRk9q004VuTNi@y>P`f ziDV&d7k*9aEg{c%SKhI2d-^TXj=}kH`{p9MsHy$C<{x*{+VaiqnO^;c9|xcGu9KG6 zGgsFVxVh_s|JNDkRKEFs>c!TQSwG(e{I7n# zq4IN)-I9C(AKoi-UexVBw^8?9D${P&F1fyynp>mt7g?Uko<3u7)rB?1oNB7Zdb^&f zxNbD~|Dk_p>cigar83E1x9ZH|u$fa4#22V=*MHh4smhC5t9oSuv$e9WZ_2aOkDV}S z%^#mx@|#w%1vKhhyZZTrSlDM-js8vRO{SD2^WFB)N}t`f%{9K+X_okB4;8ibAw6eP zUx)qt;HiJ>R{88jaXIE&SBH8!@K3g7?G@UaA!GS?m&WuT$x}WY?_X>wnRU~)Jx1or zt|)yTfi|x+oj2}xXZ@a?zM8e;NOkH*o>k5pLcVdBCWp=I(%qD*U-`5BLYb<*^_13& ziJ`IH`#gN(R#kG99XO*HQ=>MUk@w5O@@2CVRu|nr7+uxQwRLme1l`J5&Wzs=9a~tI zO`PiD^V9PTKht|Pm2z>-9i8iASn5x#@iA29-eq{T;&5g9*B9Hhsv5uXF4ezru)90z zm*BJuEooJ)&9O@jyEk>|uHFfJZwTlFIa2G56 z);_yzSJbYEH@BWDJX@)q^X`j9oxz6LOK0awTvB;iy>-41!^Wqp>gJxk^UIU((XG8p zS6hEupuOY%zFN<-+mDNxJb&P{?!=ZS>~$YrUi!75Z9&mtare&ikLMrjOv}pSd8@bE zPf+{b#67%>+}6_tNlLpU>enCU+S+tzSL{M2{}1W&{}g{w>d`DLW0kf` ze%`%Vq53AH{Zz*pXLxQ4o2#5%kco?&&?a@EvU$CVDR&rFN1 z6etgTH?_01_3~-9y))K6;4R?ZxY2CVEo)QFS-VZnU)_9StNyd6wf|0i`J8)$`>d$f zTb_gBH|wNDe$@IgE6hIPvR7Sucir>LffmmmRGZ$(>;4h+)6Vny5NMr zH^Y73Ta+npxV(3PSdq$)Q=EIJu{;diud}p!sZIa$Z%XHHOgOihFwx!8&!>3wp8O*!a)15@rQ?xt2m8*xS`onOklxvw+BdyJ z)?sQwt-zAd$f@~XZM84%_T8BA!0tok$BGU2jvl-!G%-`k$}ylvap9Q-=~2ZzXY$u> z&Tjl7vs_}Y)5-sKCmT&duZgycy~;B`VkSjwQ_5_wwS}v0E@{?aUwp~(!#?$d+Rf8N<92TpdOh9CEc3w<**1wk zCK=IYyLAoq{x{m19GCNaBYPnFz15OuJ0>j`zV*;@zNk-XV${mim&d;_|7|wPf1-8y z`r~QJuXzLiYCq{^m>3q@{a$rm+L|Nc)hX$Mi~qj;-pNz4ujAM$>F*D-aueKj+EMnzS9+=`wy9e%GnzyI$!?IF1M z#=V_gp)qo-tG2uoo0`@7ywq;v^39j3ogA*e7A+L=x!R%o%An*qv-H7qrOI4O&A7}r zGcB!qO%IcO}YIS{P!tOTtPoFaU(p8pwaB$tw zi&yyBc1=L>!#X>T)|WXLFdrc$=+*dhmgQV}(R2CE*5tqZQ74Y>iJIH!Kl#Su zzRH#l9#T@A$!hD3A}4;kGKKSNc9`qmGiN{FARXmG%d}e3t>*i}; zkMg#syBp60-IMwwn`9{M({a-a1-}z>5+9B}G!}o~-zx0hS z$KR-R_^R1os=lpgn3{O^!Zc^I%zF0TdgXgp?Tg<$l4UAu{+Ip6DkqAaMSS`4!^>)q z*m_N4ojm{QW62BW+%~-1zii?Yv1&Ob>kpzv)su~b&WHQ6p7u->Dmd+$+( zXI7rOeK+usds}Awdd+Gf=J}zw?5c&{uK&lFw#C|XtMJLFeXU2IH$uHoVP{DJg^o@JV zRE1vwVc)$pmQ79E&yyEeoUDJjRrN(*A=v?bzMwdyKnB)SB|WA6YTY@_o&K= z9$dnAt=msjU$r_v=9zQ;>BIl7Wu8)7Qr(mFCV};vM7>@X8*BCDk2)z;MGt<(>^qRg zwNa9%w@3X})5Ay0c`r?V^X|UuhK3ZWuUcMSI?ZXXSt1YDU3%b?v2*|8uD*m%uS<`H zY70bqUyDp$ci7%@hgLv;p!D1elHDH#zOq`{FzkNg{ajS_%dMD9ZrM}Qa&G*d$iz~& z#jrkXnxw@=+24KbVRf!cLe*yYU!T@<%6dxYy*yFL@^!p5Iv4KNW%j3BJRq1bwe^4R zl$U>hKUtc*Ao)*DFK71wg{6}=9|^r?<$cUg%6_fDdmaPXK*@6ZcS-(sk@t@tkvXwN z?yyF6(h2 z?cuQD9 zpM{C@?SK0G`}&CgxZIbh=N2))qHFH0-mz#y#AC1iv;4c>YRO-I95~-KWZU=O*L`>E zXq`Kre21$hyl1EHba8*jsS=qLXO_QX-B__;n;e759{bADn5ca&fe&Mf((eENxu7L6 zXG76Zo5>E}MbGyvQ1RNM_ovI8+w9NGDJ$C8J|7OKlZ_L($>8*1Y5%+E#D3;wm)$)B z=Q9LGMNUnTT-olM`^HtfD^`2@Z%(m9`R^^2#+7VqGy)!Q_B}DwU)eo1GL6~2V*1*A z$J<|wWmA4OS}eP%#+NzOsVMcy8Sj<7ipmNbIhhuDYJFRfwBpk4sZ%wSy_bn@ioUx> zrPcJdD}DR3#V;uI8-Qb-*VoD+pk47Dg=Jpz2oD1t8F@G zPw%MJ*4_N}Y$NBKga;~a}vYs$md#6J!^yO9E>!lnsH|WiuD)zyg;nkjVljd^2T5{sZ=f6Rctt_4P^2vFQxK42eQH^4rthFMZcZGnXw8-C_A5DA01-fs>+q z{EVJkzRl$Nw5O&t>Dk@YZJImJnwhlyTmJg%qa~jXhq0bX-{!wq$auc__GjiWO)!`HiA%k7-@*2QD$>@N=H%sJJnC*NGoxK~ta^zPU6i)_^a zKaZEstv7bnhD~i%afbO^6Qb(6GK0UvZ8nyoQ;j**opz2lmeMY8SseD34j$l-^#lA^J&0 ziOJciC6IN*#4ZwsE)mu*$;?SfMOi3ph!%|CcmS^|GcyJ)b_InhIoQ-3v|i2F5VTm> zSOG*MOaaM(FiZqh79wh4Y^Y#iVWa@MJ;EG(0IGq42{=80G*GZG1FKjp&^7eGFLD*HB8E8PFBUd2f~Oe; z6Zo=N1ryYTz|a(=V1ih^Yifi@PYR|c@D;kI7Le4XV2W7TYi15hYYOIw^}QJDgU$7Q z70fN*CV|%fDp(-gWMQHog0dFa7$wCjSRx!j{xV?&LqmiM3=J(|OW=_g4J#NLnL*OK zf}s&SM39#fgI2S{;>IU6FTEtgP{Gj90KP2INWsM1+#LHNMN<fMztiIti(ZP9&E>qhv4hGQ)9t#f6*S^!pW>7w3 zw)z>r1`#I4TZ%as9i(U29-1lgXSs4|x&@cUzwjI94nMuG=|5w(^)-A3nS})F2y^cg7*xpZCP$zW8`R8x|?YK z*dTp(ebfQD+y2Z6p`oRsqN4li|DK=kX{&KaGPkAh=kB-jui8s~>fX5gaoY#BC=M4;pXyg*-(^54(pT^-B^-+8RqeR%%E`GSUl3K0**6F+@LIrvVJ=Qr<0sc-uiatOTn zAe}TY+&vg@KOy|A%F~e)x>7*zNzG{u>v6 zn;#au;n;d`PvW*EpN%!5Uj`iCa_oaq{nVz7MNDxquD_SL%>8xlWZ9+(JCE-;@yO9P z{NDG{WzWwWuhh8Cc`b5}p5)!dw`;z-hm<$R2wz^le|@!G#QB;lhcb4}U)dX3oM_8= zbJx9F7Nt9MyH;C&tXrXTbIk_x^!53#SITYQbTNI=(c2cWV)OKOZE`w##5dG<;xWO* z(m98=^D?|#mpV~N&^xZ-iTV%k#fty>1dp7p;l3Y`D`$S5yW{iZefRgLnJ0aE;PN?J ztL@R^pOue3oIHEWVfCdK{c=BVNv3_AI^9gHTj!<#_mjGuYa-Vf?Qa<^el_*2HT_AG6rnd36rsVqfp`w`AmIyp}QM7e8~S=t9WvivmAA zs?whxRZ0DGnlHi1Qo3bwUiYS1*4^!Y+uJsz-KaU_Gvid~)9wbIwC_ivPVu^5UG&PM zLcJlhzqU$OX34*OiFwr;sd0u&rib`kTWD}G^d`#&_0Jy}J5Tk#XrKG_sg@^$?3=5v zyRQaVtIqs-{nmFuZmT?-6#@O>g2^_~i7U;XS^cu;St!7>_4<^@PaIFi3MXwb*_LF! zS6ue1Buk_Cmvg7C+pm8r6{^y1G52owgtOOgML*CGbQRwxet|Xe<&nvnf>OO~9R>z^ zCkm@dRjXfx%=*?Q`>akm>{nm8ZGNSkI-lQ0w`r!o*IdzE%sYvDJ};BOwiz`lAyu=c zUYY;u{D+gK{uAEp)~v~YHn()WsV?*H6yb|`jK@P7X6?8;ea*iphnNXZ>s+5&23;+4 zHaK%C?wNN<@S(pC_B5o=Isg9c&l5ji{-|3rC+F580g<;$`?TlUi|^ESstx^BXehpN zn)Y|o&u;qy4={ZE>lEGg@r{0xcG|}YCJ7Fnt2cjq@nv0fsJMpl)#ks~l*3OrGrrn! zb@{uRq?m>~PFEEbPhGou{-C3Bb>I}Hyxw&oixL^n3H@`Aw#^h!3rMD*Ov%Ofd zgEN2foQvytcb)j5-g;?C@UHfIFPopOx$teZr={ViwSmps=Cy8Bv60=jZT5;B&ZzLm zg}l61>z8dRiP4ii^Kq$CTMu0?_OfWDn>p2Mm(AI;?rZbb#P{2q zm#WTvyX*YR3sY4qU*29KX810rcvjTxQoG-*Li^TlzVvQF@hrv7pOO-arhhS;Q)AcO zn)*XQ@$}uqqbZlfH%Dj3R$ra4zPZ=dP3>xA&!)Sow)f>OKfB>_(B3pL{j&37?Z6oY z0gcZ$n%Y?lA8Gk_*yDVA=DhIk$6Rt}lf9yKC1R%EUb=bScF~U!f!*5oT3$uAJbc0J ze{bHA3F;Hwci)?$7TR`Kq$*>wd+?0D)WsEF+>4JE@IN}Bw|#Y&g8qCP&5zBx`&mwz z82$Lcx7F{FvXymZ{q=|5n_m@(GwGHc+bIC|F3rE3>;rrtaL{;SmFp3oJNeTBgx5^5`sWt!bS-c#rwZ8B?Olo)S@^8IyH z$M5KQ9PiSY;PLJ4!QYLWnzrg!#lN3tIn`e7p)kwef=ZS>%k14;oUi)dZJnko&A)Go z&#W~Y&Fp%XEkE$K@hMBBGl#X=!c#j0lJB6gtM!gwZP=2(zVPEJ{!GdK zL+5_7nx!u~xZqHl4PXBmp5E;?=jvuUxivRW;mtbwSZ={hp}+6_L(Kn1G0Ss?&Eq&X zAw9z6`<<-40{d2pTstnA+xKDSqFcYj7Th&`7_nk{Q3&&i{=jc$%O^GjOHbUr?Y{8B zJHDoQPvdUbOB|Mb;$P?N6{R%g_P>c8_FHTC1vhGWXEn^W{1YS`EN|MVJo}fD<*_wU zM&~CysVZ8)$oP2kEx*TlL8s@nN}f8NvPbb|@eO6laG+_jtM z&S&*04Sp1IV&3&%2fVu@nG{*~t!HJs?)~=LwVgtj3gq?&i|yI9{P2?g`Nx(qXQ(C@ zf1S7Uzr&?6yKQMEYzObob(wSEw5zw}k*QNwg-qY=_qD2ATGT%C@vK~#wOR3Z-yC^z z&p%Ek#D#fX$)9bOMJYEeo@@FxBrE9ao@1KZ{o1sN=jxBYii>Bw-|P@CzT(}C!k6+T zH}syL+Y=s=F4$B2r)?v5|0ivmsvmE+{dnQ|T|oAsrt6GPK8Ma0%(hV9`KgheN3w6u zRPnBt{2E!M?%k?OuV2}HYt9z^lIwL_qCNVhvIHIb#SYq)KX*NRZ<9dAo(l_Z z#--nld{=D#Qp$R=hLpqEN-Nb#o1PiJaEaQfrQoOkwB^P7ZIXJ{<>JY4w+s2Uq>9=K zPg(Pvg>#CJ_*J?Wt1T2W+*15D-y2R(*cZFa zz>|5aSA1kc+3F{^U#EFb*7BUFvV(ysol}$jLZ%(3=&FPbe!aJ3F7K7J-nh%b_vELD z8E53;X1-TG>~;ICwWUp2xX&AIj`hpi6*qA05?NxkZr+`32TShXYdG9c8o_X8+O5!h zhc~}nM4bLeNo|<9Xrug$-t@)GjUN{33VOWC`ut#u$JS#NpBB4I1x)`d)3bTiitkVKC^avoVn3F-I>cJ^0s?Ku1c28>SSJvnNj7} zxbtV6+85=q+#iT4MO})8l&m2RC+bNkk{VE_rE{7(T~sk?e;PTHD)Ch0FbIOgrKCAoOP9 z-CL8MoSVfRbKk7$;+}uU8-?FIU8Gnidq&hGa;n_!ElY)yrmSo~em9)KHF4G4%#0*S zr`wPAup}Ruk)8BNsej3V$Xnaut}7cSe!t)Q_d(L-^_3->({o*NnhZZgzx0sns=6D^DF4&5dcAJn&i0%X@rtTWs!yC~nq|*Hh2Gdml7N|$MWPafvX#P#JkjA zOxpEf)yy9UZ8_E~pD$-SY10qChc@$Kx?bLA^|`3Y$NRi|=O2%Z5B0r&VseDHOf}tR zvj5IDyT303KeeW?9R52ov;Fg1R`tS-Kjv8;+`fE^Ez`_ZFF!svX;FO{%-LOgUidrv zl%O-m#ZK!S?!Kp6)wx-wf1`jAuVh(CkWBdthw$bKmKq?Vr%FPOYZV*dky~{ zI=D&ku8`(4wr8CW80{^qt>4yrPO#gw!oFyOwQl0p*|!t>j^*rumk zP=BoX;NxX2wX^fTcjX27x8C;@+^{%_D>UEu)Z(j?x(}>h^Hc0!*Ve)U^XPZe&bB=) zigSw+o37Y@)!@16X0d~XJv{dH%Xsq*A|FNjExM&C=DK3_+^%oU%$GN;iT>sId3%q| z4@RANjOTqS9y8^?v=@lam2l1rPjfA}^K;7Q2(Iwprj$#EwmuKEYM7uN#M>@c7j-B0 zWcs->$)B0mGqP0zzCZh|z0zJMvb*G}G+*eS%{D2K$J&ax6nA}+mi#`c;B?sP8_y?OrT`qk?;I<;$spVFJ zri(?itNBY(RRT*+8T-{<{a7;T!e-7z6<01?h^*hfzd3tG^CUrQzGy_)~ln4T+F zlKC@`C#Z4Gt*T zf1N$uddEtS2br7PMGYv+pvDejHt{&aft%^juM7R-&|-`_Barihoz{<54~FyVU83iGL^ zOWox|e(#aJaP6$Zp4(b~7I9sWS3j^gQS+Vr46!YrqU?TLnzv{ByF(Qh7v)W>J$0@- zFuH1f-CZySqtvPe77dQ?lW~hwNf3AFrOzs}OHI{yph@nS`cx#%>GMMMBq$ z?$6Qb@SmKs|8Ibi)K=4vwFkxjIfSUb|8!^4&0iiX7ASaqXnyy4c^$j-1H~CnZk}`c zExE2KWFlAW>x%BwxH>b=o%x=cymH4mrbj+unt3DLN!fp|f3D`o4~G`}rMW&oFTM6* zddNwcgPu$IL|G1e*6iyLeV$Ra!E*Jz80|G0%W8b)>THSTl>ctQBC`7O^95(EUY3gZ zow;r`dHD+sJFfi^kKPAx$#^$Dw4S+l_uqsk>lTZdA6m(O+-tK_Vo|4Z!*+?x^TELz zxeZxfNu2S%I{j+r&k3IQ*Dm=Nw&}oYapegA*fQC5K~fuQ%IxY@idIg}$h%@)HN7^Z zO+(>h_Qhh=ZSQ>poaLrIn5|dP+OAl))sazf>XuIxLQnl|rXDt*e8o$Mv0va;n~trXd4GUioBT};C-Lum*x2{Bf*xofif>HCK{@#rmD?@U(@7nyU^JC(S{KO;E7nMIX zt$p+U$0^;5U9mN-y;kQt7WKBR)G6K`xQ zzj?}wOF6CQOZ2B%ZWUZcStqX;25!j=vOX{HW#y@z;>mL)BrZ+Of2(V`?u+;l8*%ec zp8pZ27n+_r2W4t9Rqj2og{nHKH3e}2;}kMCdF z&Ak{o*0#M;&I?eU;8^V>Cb3<3x%1)BYe$Zze|P?1(;GfJKCJYb|5eL*O%^W%pPlP{ zcgOgT(veetm#vyDsq=KLqR+~E6?+($Ua)3b6g$+qI2sGIAo=G|Q|5onf zF9%aukCmkF$+#`E%5lQ=3r)ut{assIbUwPbENYpCX7rlxr%!Ep@c)D2-~Vj?)unDI zB?g$AoZ@`-ZNiuR3`gU?24PHGf#xw_1HF(zctZ157T{SCq(f~?K;yuOc`HN2ycNiB zlzA&RH&0hrSIE4T5oCtQ1#xX9WSR?cYbA&ea~m16R%n)CpS3bTKGntqb=Jz%7&K`G z8u&K0R4~VNU1f1jVsVDPqrNlrpc>F2HITWdROsO}h@)u`2h&s{&on`T6yb63>=JmQ z$rL<)1DQR+O1rt+C1<;u=CNLTBwVa^4&P@~$ z^FAQ=!J-wC3M8e?c+sGq7}XkY}N_AxXthD5vq>bWi!`tXDRx+WE&-p~YbVvz!9$_92DsiBdf zex-t;5!`I#DH_lmA}knTQ#6(qpaZ7B^EE~a#ug^o^V-l0+-@f4!!`!#CxgqI7MWN?}B}xlY z6SOqhJ(><|`ST~rf`zC5$bzkj6)j2%D;FqmW>i=)1|>KIg#|{%1$wnjlfQ6i$L~iI z{LWQ4czFLvpD457VcP*k*@TP(3~l9ZJ0_aQBxoGqdEDUgpw_X0jf-{0Kbwb)Gn8xu zEc97qT(mVg4@~5%c))jvvvb+hADJHFZ#x*D{Np)nd-wm`PfibPJeDyiPV!7_ND=IF zTwKFwacE-LApz%I+>S+`_9woY|0uv;*I2BW)_*3FTb5%qbJwqWRASg#X!XBC|7GSZQ#*D%J|;>^V0u#nBda8bg8E{CANOC$*c4i@Nd133 zU%~hP{Wl#dZ@HKrHWw_ID|6gJqjmR^Yxk5{UW)M8+v*m1U4H4>lo)zC!#MWFk;B0& z)c5|1m^kzKwcn~Qb$X6mKB9fEUEDTl7LyO#f^5YbEn7AwFS?$av@8Cv>+9YU=KKEd zY^)Pc`}A(j-yWv0yyxDTFM^ZuMat6Fmg_#3Sz>mB_i3zt&_&pU4Qk>1ey?V8OQwtulXKT%6JRd~0{gzv@%1%kE#m&KnHsfixYi4;p`dRey$h`T9k#c8aW_84H5QN)YmJmu2^|z#Y4&W zugVVQENI#@SM&DOZ_8B+_5EH~Es}n;tz_QImuvz*yncrsD={cca@=%M&+I<0qh_Y2 z_4?kD$bxD53#;~gKXjZ$xN^PX{&Ti7HEz$ETtBg=+IfMi;HJvSzZ)4VdHD^d++~xf z(LApGqs!Ge@2YF)qvVR)?T5OIvJWrqHx+Mjdu^tCDDhhE%$IL>t*Bb^gTs>jlKhu% zy7kpwA6$;-vaOGt>nCAeb=Pm6?DDJUq+Yh4$!6AEd%(hR{-^WlEF3Za4TYv%{h{Y3 zdrak+fP&%d&GU~HCpi`t_sGvWCGzd~uA z*p_>>7U4UkHB9>qC7#LtJg4wT*L%ladW)B zZEyCSh;248?_PgO?aPbUyq?Fr+EHiPE+*y~-re**z|N}vQ2Cy)^T+SUKeiRON&c~9 z^2D#Vrc8DC*Sexo+C2R7cdb+1vav@`y~#ViwPf9f_RvjB-OT)FhU#l2p89%~Blx2u z*QI6mvTaUIGV|X4;I#ZY4GqrKyz*Di3seg^RWgc+u`P6&Dg3NI{Qj)yBQgJqqCGuM zNvF(~u2|^xe%0ZK*h74~qwaqEGxbmDuSaJkeC>W#T)nq--Nu7S`E#=;3I2Lhy8PBk z1?H@U)81{p?QP1hx_|04tv>UGZKt1InX*lE&GaSnUsqmx7yOc?n|GJrPbW2&qt7-> zV?B6${$|^)voud>YKkuq+^8Hlb75M~YX7XNT|3WtwEx**yzOA&rOYWi@94Gk@%~@) z^feSCnJ((diX{&Ygrs>IAPaoc!^QmIuYVn(Sf6RVu zNthe^KINT7;UB#@N*8aR*}s{+Id`ea!str=sadNeV)!ET>{HJleR}=kk0*b*|1V{b z*!o3vc}(Ko$F6f96)G1kYn*pjcK@1&8(NaBOAoslb?t1;{dMqB>mz$D?jxI%W7EIa zrTF+b+20H}eESQN?94a9&hg88{M`AX(#(&!?Np!o@tDo|Z57j}SDDCY&3rO>M`ESr zhLyK{Y|lsNm=>P?cW2w`*B(dbM6Qy!bs}NH^M^019cz9po^ezlSIPOnOR0$gZ8;jh zeV6aqAvyEWE%`mmlOKMSSf{n=$UoI+aa~pWW7d{0g;<^jbX{+hI(67~V|cV{mt5bb zc|G~(^OCh!I`f^cP&SEF#Ku#;_;GW zdLXyJ=VA{RsYn8rM{pyMAf(%E!e|n$SSp0ftRIQ^i_hhC`clp)$kP4WD=MN>KIFt@ESSh%5{wOH={L}H~#7&Pve#w4XbuVk}R}Dp_HN};ylD6mAwS5XaD^yVxyL!p}$GpvT z?=J*I-}CxXne^sX+ks;n z`NNjEPhHnFJ>m1p_s>o@3YLF6$*_FQ?z_`2f0MV->|OVvpX>O=4fdB_Z`~+nqx$*h z!fBYAPh=7EN#E2kR0zTN&yvhmfi^-^|!bxJM#j-C;@ z7Ty=)`R}3lv9{@l?e@L8FJ&fR7giN8h5zNI*bCxU1RPd8SZT}Ao;FiVES@u;FIzm7 z_1ZkU8{fLa!oORu+QTwwN97^zSG}$?bGI0{7H5ffzBb67`7_>Yr_bT(uYR?tGYCDi z$c~LVka$>iPWrO7nLZ1bsu=0tIq5U^!4&zYxf2|g8`|*auJ4kW^N`7VbMDI>febb~ zRKF{SAOB?+yJu(9hP*u)n|0J&m8~b)z5FA0ncL`dr=-g_clB<@Cst+)({>jbOXbG5 zByS2maZ=Ree_>l~=kg~$H_yIH;ID}9>QnTdni+9yp0nfG2>ri#`~NCf!L_SfWkc2(H<#XdiHX6rBc zu0dA_6dK9+2585pPk|V z?1oUjwYN>u-a_-Q(+;Q9Hxz_P$=RyRDOFtLJblfQ%n5Ban|rN_uVj`nmdD81{9LxD zy16hp>wji{rQG+OXJiedg!@gt?R@^2mnodRf8hcbe~*%Y-|p7Y8w0k-U0uBI_#=_P z8^LGl5+68DyYNGu@tvsCpP;L={$AMYtp4M=cz)?iJHFx|*0S5v0$=^~{2g+D<2&!x za??$l3tE$_aV9X@R`kGG_F(t_=k|7HHm zOI@v5ddY4d&&!|`bEjKx^c7uKeX|HJz4Ls&`$_RIE-vHV-&f<#cSK%|=3CJ5i%((W z$E@AZ8~+$F+&-YMNZsGENMotE3H9ouHh1@WzVepP1H+LiJt?Z<0)^&UPEsATce z5XcB_-Je`*YyOhM^7^gsKOIcfLi#ISuK0K?tLV7an?UyY1&MCG<9!qQ)m5) zFL4WIo%$Qep8Ia%T_)RRe_zM`i9a{r2tM~n|LK|EdcvVg=9KcBpS;ljPMGAc_3rCm zmAqHkrclntEAWX~)7>@3%j?u9*>s0(li$BNu;t{}+3OZrf70`L^rTYz#_GcRIvWJP zz4T}E;@^^-v7wG_>(XsiAYa#nN8|Ne1(bR{x2$rl6!+{BCl~L@f>co>iJDhcI}V;-m^Wi%ir@jI>I$7Zvj0<`d=^nG z>bUd!sK#y<#|fSdJzp<{Tln!@Su<~QxLV{?r;|&{_xokuuh!of&nqK8E1{<4YW{^Y zb7$71OBXLQ3=luhAm&eJN}Z^5tC9{)ZaP}K2cO<9XO^W<|K zu|HnDQ4wg1n!ouw%c1IsQ%PF^i)6sKck7i|NAG}wv ze7T2((}y?zs`oy~@P4&HoqL|`dAWGG*-jg^Oxj{^Szcejwez_8dB&tOtvk!Cd@D}0 zW{51a+P{10tn$3}y5BZwru#+o&MiB6d)Ix%6E(bR?)3zJ`ctTOI?g%!$+J3#1M=yK z)4kbp_Fmw-8N=Cj@{X3$*_)xpVRv0F3RL^9e0Q94(XpKu&UWAbwc~7J^kRwE?}U|K zt;xLGY|a^b!_G$f{g7F9Tlotj@WZV1qu(0YM_YqYq>n+~?J0ftV`=vjwpB7G( z3DLUMlC|@a+4Y4JpYB>$t{9d6;LP>Pk1Je)H~NX~SIO(!mwDt$)ddHBLs{*%X{)vJ zG9PAj-0#tN{F6aSY=Z0EiceSHyfNM>*7Z3 zIm!Q?+o=4&ggpb?$^59$aayQ zx4I2;BI+9p*?#?K5<5O;!uCsRUr*91_q7Y&QoX0qHBi*vOKL6mt|;Y~TjF${e$RS! z%H5{etL?c~^3%yDZi!6J=*TQJ;9Bz3ZTIUp@7L!hcJ1`rotU~LV`bc$#M;L%)GnG& z&wR4M&GcU6-bYn$-_E*K)Sqb_HYI9q!=pnJs;^((9wRQ&nbKWd$z&`3Yl&E7e6Z7F z&ec52o0$A>9hF(SHQU^>ST2mO_~KfVmv-nvvrF$+s$=mnf)|IpMT}=GO<0G%w|TNr|0h3 zKT|}-P()JUP-A}MtgzaLawbduP1wq=m>`sPE;`}w)T3TIID+z27nuKgX#CqGDn`{g z+~nRCzC$Jw-;B&O+LxVqr+s?f$>>Lk+i#27?T=&fN?lPXwQF*^27jhlCK#CMSuADy zCvUgqzy61Mrvr?w4G%v^m`j|S`YnFZHwjsc;ato$)dYrfO+cf6DBBRsP=<32&Ednj zCXn^;`c8?(sUTAo^!=UO1HB@&oqdBq%0OaBqq(2~NaTZ0LHzurECm}IE`401xu_?U zn?gp2{StFi(e1)Im}_c`v;)D|0HPbV0|7jiYoK6hVya+ng5!L0&=9VtzK_1Iejxbd z=0x}@9~F*lim@putRW)sVOMZO z!@{5FVON4fs#uQ5Mq31L2nkFD3lsQ=Cuks5!O{Z3w}b_>0%-6QKKyB5s-KBAh-$8% ztzc+?&}wLCpr5B;Xoy&qZwMMrRWLL}oVjgiXs%z1ye=Mj7}W?A_Nd_!keHrY%%$&~ zUz%56}=Sn3JE*r4Kej0ci~&!A?7G5ic-_K z3=~XExD4Px!OYau*i<1+0V-x>Zf>LimQ~1ui>owUz|g?uZWMJmvV(w^c qW@KPsY3ych -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcDnQp&=1TJ,~> -JcDnQp&=1TJ,~> -JcDnQp&=1TJ,~> -JcE=]rVd0(rr2loqtg-`p\+IV#PRoeq>:*grpKf:~> -JcE=]rVd0(rr2loqtg-`p\+IV#PRoeq>:*grpKf:~> -JcE=]rVd0(rr2loqtg-`p\+IV#PRoeq>:*grpKf:~> -^&S*2K`;\ar;-0]p@n@Wp@RnBl/gp^gtM_[%,0ImiT04hnFZMQrVl?eJ,~> -^&S*2K`;\ar;-0]p@n@Wp@RnBl/gp^gtM_[%,0ImiT04hnFZMQrVl?eJ,~> -^&S*2K`;\ar;-0]p@n@Wp@RnBl/gp^gtM_[%,0ImiT04hnFZMQrVl?eJ,~> -_#FK8r;$?d!r;cn\,QX2rVZTlrpKdkrquWgqYU6joD]L&q=RRajSr)m.C/Qo)F4~> -_#FK8r;$?d!r;cn\,QX2rVZTlrpKdkrquWgqYU6joD]L&q=RRajSr)m.C/Qo)F4~> -_#FK8r;$?d!r;cn\,QX2rVZTlrpKdkrquWgqYU6joD]L&q=RRajSr)m.C/Qo)F4~> -_>al?q!dM,hr['q!?_R[B6U<\@8]>TW+a/a2[rL%+WD>YGn1p]$&prp\j^`J,~> -_>al?q!dM,hr['q!?_R[B6U<\@8]>SYMdk^:j@0%*ZE"VkT`^]$&prp\j^`J,~> -_>al?q!dM,hr['q!?_R[B6U<\@8]>V6mGObffhD%+WSI]!S?7]$&prp\j^`J,~> -h>[WWrVZQgrV-NkqY^ -h>[WWrVZQgrV-NkqY^ -h>[WWrVZQgrV-NkqY^ -i;XMjrVH<]nEfB#j5]4`lgOH>q>C3jq>Us'pZTo*]]&><]WTQDp\jIY$N0Yek2"S6bK.`Erl4rX -&]r8De_&U3i8`tbmIBiCqYgEerser%mFoFYYH=n8d,t$!pAYX%qXE=XWP-?nW4LRHq>U0h%/ohS -[aX -i;XMjrVH<]nEfB#j5]4`lgOH>q>C3jq>Us'pZTo'Ze=ZtZ`DC8p\jIY$N0Yek2"S6bK.`Erl4rX -&]r8De_&U3i8`tbmIBiCqYgEerser%mFoFYWMcZ'd,t$!pAYX%qXE=XVR4(PUUo%Cq>U0h%/ohS -[`n%#kND*rlfmd!#jCO?bH'(YqYp0fJ,~> -i;XMjrVH<]nEfB#j5]4`lgOH>q>C3jq>UWspZTo0_>_X^_6_GNp\jIY$N0Yek2"S6bK.`Erl4rX -&]r8De_&U3i8`tbmIBiCqYgEerser%mFoFY\[SrTd,t$!pAYX%qXE=XXhr)uZ+ANQq>U0h%/ohS -[`cFp[C*Zc_S#6C#e.Ieb-TO`qYp0fJ,~> -ir9kpr:omMj4hu'_7R1c\\?)/fAPl]p%eObqu70'nC=YujOr):jPR)inGDVQ#lOAYeA&,YUT+6j -rMKRl&ZM@nU8Fur\%T]%dFmOFo_SR^rt#,*mFJYMn*93*d]1LSp\jjd&,YqR];b5Zi8F"CZIeRB -rqZR'qsDY1lH-<4XLlTm]<(D##dM"dh:&pnpAO[aJ,~> -ir9kpr:omMj4hu'_7R1c\\?)/fAPl]p%eObqu70'nC=SolKIEplJ&AinGDVQ#lOAYeA&,YT;)+R -&tu(iSt`*_Z+%Eab0eo%lh(&Qq#:m(qX)k@WpB$ -ir9kpr:omMj4hu'_7R1c\\?)/fAPl]p%eObqu70'nC=kd^ULV[^W -jSp5!r:odDfu^e(TW#$4`5KX*VPBrn_U.-&nbE%]rr3Q/q<,T+jM8%%Z,#G4_<:Xnn,E[lpZKc$ -a7&Kap$)PFrpLj&hlI!DZ]?TEJ -]]&S_qYq$(q<,Q6i4G)-M3+3lOR.f0N0'^WmB"n/r:U)?~> -jSoYfr:odDfu^e(SYE!prk&ZETV&$d_U.-&nbE%]rr3Q/q<,T#lJgaZi8X%._<:Xnn,E[lpZKc" -^?b+Po^)SC%GA>*Yb%S[Vmjk,nG<.[rt#%ugU4c]kN(^cl.W)cn,)n[&H2=`_5$AZio/kXlE\(] -pAOjf%K?1d^qT'lg=Os1gtUQLf*L$_h<"%&f(&\2s*t~> -jSoYfr:odDfu^e(V6RMKrko5ZYH4P+_U.-&nbE%]rr3Q/q<,T1^SmiuTr>`A_<:Xnn,E[lpZKc* -`luZIou$jQrQG\e`4`=ZUo1]FhsgLAq>V!'o%URl_R6MJYe%o[eF3;0rt,/&jMA1@ZDaXtYeRud -iV*6Hrso&(kJ5*MVO*gCQ^ -jo5bfq=3Rs^o=!Gi9omnrSSgZlL"&YYFr&9f&uZ$rr<#tp><.DeZ=^dN2tLtZ/>9Sn,E[jn'nDq -i76B&ouR3]rm_J2i8E\]lL+,hXhEQ]r;-F*rqPZpWTqU,S"$+djLMq`p\t!g&GtqFVs_s0PE:m' -dI*aUmeck\%0$%_\AdC -jo5bfq=3Rs^o<.@kMOqDf\blXZ/>9Sn,E[jn'n>j -l0%6kp#H,8roXCIl07L4liue!VnLpWr;-F*rqPZpU?psugt^`FlE\(_p\t!g#5dlKeD0-OVpY#3p&BO~> -jo5bfq=3Rs^o=9Obf[l@rOa8f`5g*>\>6:Ff&uZ$rr<#tp><.![@`qYS"@%3Z/>9Sn,E[jn'nV` -]X>/OorS5"rj<3E]Y)"t`6-^V@GAp\t!g&GtqFXNIi=QC!r. -ZH9&lmeck\%0$%_\AZ%WQ`IKoUS[sjs.fUb!1WhPrgj(a$EL>7UR/+$\'a^Cp&BO~> -kPl%kr:]F/_5=EomGQ[Fai+.i+Mc+De_oWYdBTXhhspRBs8DWFVsi0;M04ZUeaKEjp&4C[$3'b_ -^rPBFXK8,gRfK>bX:DMI]>2P1dFI(<^;T1/rql^-r:8L?i7YAoK7f#]eaK -kPl%kr:]F/_5=0amHNisjQ$3t+QDJDkNV=!af25XhspRBs8DWFVsEO'f?`(+kNf&#p&4C[$3'b_ -^q]-mhr!8_g]641h[\T'iSrqZk3)!q[`%>'rql^-r:8L?g$%AHeC<+-kNeqonbi7`')q^i^p<7b -g=+Kug>_D&]]Akequ7B0pYrWol/C@Eb0%rPeCWF0gu%#IqVhG2s4dt8g"4j2jQrnrnbi([J,~> -kPl%kr:]F/_5=`da1SmeXfMDt+K2EH[CjB!agn@hhspRBs8DWFVp)Q@S@"iY[EPQ'p&4C[$3'b_ -^rO*bT:_SFQN3QTT+7QlVPpW!ZF.9^_o1^4rql^-r:8L?bdX:8USFBO[EPGsnbi7`')q^i^qd^` -QDgj_QDhR4]]Akequ7B0pYrX!]V_$raiV93URdd=Q_'eBqPO7`s-F([R@Tn8Xi.d"nbi([J,~> -kl21mqXW[jYG^=Ag!..6VONkLO74rsA]! -iNr"'XGMdfon*7"reV,DOH>ZqS#39qeaKToo_n^f'E7jn`i87FRtGWtJssdGVoS*!rql^.rUo!M -dG;6kH>.S]Z.\'7g%51>rtPJ-j0lna]9%DS>]54_X1HBne^`@Li;V:,a9oMeX/ii!jIG&urUp2@~> -kl21mqXW[jYFsS7kiLd]hV?l`g)o,+hr3VXl0I$"^Ynb^s8DTCU[.+#f?`(+kNenro_n:Z$3'\X -Zg6f3f@SRGe,\)!f)XJ&gAfq6hV[;Tl`Ak5rVZ[/rqbp"U?psreBH.dguRgqa6NO#qu7<-p"cgo -l/C=Cb0\f!kh2rgoDSRd'`Rmf[_1k`g="-?bgbG*iT0(_kNMd,roa=Bs5F"8#3"t'QJM33p&BO~> -kl21mqXW[jYHcQQVT\R\-IXZF[os[D1Ylr;Z`ffqZd!T:E9ZT!ce;g%>74rsA]! -iNpb9T:DFFoqMMYrgXIfQ^=#)Q^j\C[EP`,o_n^f'E7jn`j3ObQ_V:/UR/+$YfH&*rql^.rUo!M -ah"78Y0!rrtPJ-j0ln=VO+@*`4r(6Su/Wl[C*L?]`,>=XU:r#St;h"fsBN,rUp2@~> -l2M=oqXE=XUVuHN`3H"tN/*%9rHo`:K8#/DQ);".g$5``lh^VZo[oo,eZ=UMM6#1qU=f,:nG`am -pY`=FeZ=W(K)0BuF*2bUG^OmfK7er9R`Octe+*A6rtGA)i3^G\]9%DSBRGoQi5E+ap\t'i')_:K -TC:=3M03 -l2M=oqXE=XTtKaUj5AbIf[eR$rR)h;eCE1)gYUoLkj57klh^VZo[oo(kMOn;fAGcWU=f,:nG`am -pY`=BkMOnfeG@B%cHjndd*g@keC<($guRh$e+*A6rtGA)i3^/]iS)`&ajSo%l+FLbp\t'i')_:K -TBk[tf?_"Pe_T?ST?Zg$qu7W7puJuul/C@Eb08AjjQGdom-Euj]!f)[]=,0Ili6;Yl0. -l2M=oqXE=XWPl`aX.buKS"?COrMq'>US43EQ(4VM\&>c!lh^VZo[on^[@`trSY!75U=f,:nG`am -pY`=#[@`ucU\_\;\$W<=Z)aq(USFENQ`\3:e+*A6rtGA)i3^G8VO+@*b,^o,]Yh5KTpi4+XNg21qu79-puK!(]V_$rahOU;XgPg[`;[sb_8jX6_T0^rbl>Tg]XkMY]Z7S& -lM:GPs*t~> -lMhLrq^+GGDrH$k-tNg6m"n%.TTrr)KAU@6X6M04ZUeaK6bo_n:Z -#QFM[][>QDT_b)XJoCQl!b$#!r/(B(#,]f9YL;q7?rtG7p -aJ\=FRtGWaCk.ehkH;Ybq>U -lMhLrq5n-eBIif!jg,#r7Cns#2\M/WRC;6r;RH.n^X?!kMOn;\\?GCi98jmg%>7?rtG7p -aJ%t]gsjQFbL>5+l__M^q>UZt61LRbiolg)'+ -DS#K -lMhLrqW[@`tra2kNTTsr7Eg%>7?rtG7p -aK`[cQ_V:6_PWU!_RIAFq>U -li.XtqecA:l@c2,KfRt>Q`91rN.JsuVRB+iSf03H[9p[_/X@p -DfU)Zc27M4s*t~> -li.Xtq_:p\t-`fV7]phq-3+hrj="f_#.2 -rs&>ec?\g@jne$EgsjQEBP=6deD0uZrS.V6k3SPhoDSUe'Dh%9U?psreBFepcIUk7m$uGkr;?R/ -rqPQcYNk-$e'"0$db<[E]X?bnrqudGrqblrOmM/aeC<:7m!_j6@:Wt`G2I%MiSeNdBkV*h_-^HL -?!q8ia8>l.s*t~> -li.XtqZ$jQ'\$?SfjJgQC4;9USF9T][XCLp\t-`fV6TtT:E9ZT!ce:f_#.2 -rs&>ecF_-+YkkI.Q_V:5]tMA!UR1nMrKd_YZH9E)oDSUe'Dh%9Z,Ec2UV=^e\=]:saeR5Or;?R/ -rqPQc]t^M3W5ZZsX-fcs_mSLurqudGrqblr[)B)5USF0X`3cMF\@]Gh_r&;IiShVh^q[Rp_7$_Q -[(!`gjSSrKs*t~> -m/Ie!qXE4IViB2rJdMm:snWnd:Gqu7Q1lG]=Zad[p7R`OcVDUX#aJV&sWK7ipmKDpH1JUls4 -I,97"J<87ZoDa=~> -m/Ie!qXE4ITBt[rg=4Kndam%,hrEe[roYEcjPo.UhV?oBiU".jk5##To[oo(kMOn;fAGcWU=f,: -n,EUjp#9GgmJ+DfC7$EH1aIEH,r:Df4cS -C>N]ADLg"2oDa=~> -m/Ie!qXE4IYJdZ8Q_Uh#W1TWNSu]!!rjfXQ`\3:ZdZe1`lH?uaN4,MaN2EB`l7/Y -_;<#G`Qd]IoDa=~> -m/IdtoA@0XlH,`THuEqGM5I?$e`Z5crpLuslK$dOdE'DRea@b2med"^o[oo,eZ=UMM6#1qU=f,: -n,F7(qso,XGH%U-Pbt7>Q)D`nK5Y[[R`NR_rU9^M"n&Y&\FBCnrtYM*hQG8^[Z5ZH -m/IdtoA@0Qm,[!Rd`fq]fA>EIkNhL$rp(]om- -m/IdtoA@0a`3#K"X1l?USXc:W[DKl(rlcM*`4rmkZE:75[E5l)med"^o[on^[@`trSY!75U=f,: -n,F7(qsqV9['?sN]W\HKT!b\eUV=LfXQ`\3<\E(]Pai`!0b0'__rQ>/^ -#l;W`p;k=sd-^E(J,~> -mJf3GpufYlmEM>YF(oQ8M6#%Sma%ntS"+2]Kp9'nn*]K+mGF7PjS&QPrUea:n("LrFc!0Ln"SJ, -rU0\3rqh:sLXXIiFiM79Q&Y(NRtH<]aQe[mBPM7MQBd`$HZRi\q>U -mJe4+pufYhmH*0ScH=AWfAG`Rm)YrVR@I?IG(m-?li-5fmFmD,jS&QPrUea:lf[0Wce%(;l_<&( -rU0\3rqgYOGLOcGA&c>kQ%//]gsjj/jQq=l<`iImLkgbBC15c3q>UllF"bZhrF8u:; -Es)G`F8l/[!JAbis*t~> -mJf3GpufYta0;#+\&lClSY!-paiCa#Tq&9S\@]DsbfRfAa3)0.jS&QPrUea:bdF(5[%3erbbEb^ -rU0\3rqjaS`7)rA]#MRoQ*nQ4Q_U=BXi.TFXfnps^:h4p\%()Kq>UO_9&jJ -UUnOLhY-sIrtP=qa0ERbQ_V:6]u@UWR]si4cL:Z-rt"tl`jWgfQ_U=BXi.l`lH0%J"jm:lb5_M= -aoh[db5VC_!RU6)s*t~> -mJf3DnC=Jqfs-K\AT)sQX4?XAG&4^3cI7'eG'(<5CNukFWNp\qoDARfrUea:n("LrFc!0Ln"SJ, -rU'V0re,obna:pXlK*8mYiNT`IY+$0lB,q,H$Rh^G'8(UIdkeaqu7E.m`hKnc(Ti2?VO@+Fc!0L -n"\M+rVlg3rqGKa\E(GhIVW(Z>]54_aQfYBlh^MY&,PV3Sa+=dK7]Q5lBHGWK`6Z/PQ->js8VtM -"94(/s8I]QPLf=)J,~> -mJf3DnC=Jjkht+?^Wb-Xhrj@&AQlWScI6FSAR`5U=_FOdV6XWIoDARfrUea:lf[0Wce%(;l_<&( -rU'V0rc<(0na::4lK)Z\V<['oe(!16m"8PRB4oY(A7T7bD",[Iqu7E.m`h?jjk\J3XDiQsce%(; -l_E)'rVlg3rqGKaYNk-$e'".kV9IHEjQrPZlh^MY&,PV3PO.AceC<:7m"T$9ErL+`KE$"6s8Vt; -"93F`s8I'?K@'2hJ,~> -mJf3DnC=J]\"T:raM4dHT!c\TZ*LpOcI9MU]XbV[YdCdOZ*M!YoDARfrUea:bdF(5[%3erbbEb^ -rU'V0rlW=,na=B8lK,a^`4r7:W2#]]`4<4d^:r%.]=Y_j_slphqu7E.m`hfQYaV8s`P0+-[%3er -bbNe]rVlg3rqGKa]t^M3W5ZZe`4r(6Xi.E_lh^MY&,PV3[`#;7USF0X`4W\Iao9Edd/V82s8Vu= -"96Nds8L.Ad-^E(J,~> -mf,?IpZ9/nkJWX9D/Xf`X4=@sDfpBeJ+)r[nUQ,NI!U%_GLYK!K)>QIs8DTBU@6X6M04ZUeaK6b -o_n.Vs+M8Pr;2/#q=B!@_;MqeI"e6iB2qN,Ck.ehkH)G]q>Ujs8VtM -"94(/s8I]QPLf=)J,~> -mf,?IpZ9/glf6aKbfnMhhrgeI?"@X0D=@%7nSW4*C1q5)A^oRRE;TY7s8DTBU?h""f?`(+kNekp -o_n.Vs)T97r;1MTq=A@.\*;l*dad18m=o(cDf>/aDJjB3EVn)ZrtbV1l,0+ZjP88/VJ(+WcIUk7 -m$c8hr;Q^3rUegDam%d;dD_&OT$,U;j6NPVkP>,Trt"tl`focMgsjj/jQqV2lZ2uG"bZhrF8u:; -Es)G`F8u5\!JAbis*t~> -mf,?IpZ90"_Q/ru_S<.=T!c;<[(F*6`:*9;n\rH._8!\/][YfVa8>l9s8DTBUfs`P'"*\=]:s -aeI,Mr;Q^3rUegDah"78Y0"Mm_nr:9X2;9ZkP>,Trt"tl`jWgfQ_U=BXi.l`lcK.K"jm:lb5_M= -aoh[db5_I`!RU6)s*t~> -mf+X3o%0etfs-K\Dg[YXeW=TiH[gYBK`(e%r.KauJqARBJFW;bK`:uN&H27RU@6X6M04ZUeaK6b -o_n.Vs+M8Qs8Re,rqCiK_;MqeI"e6s+Q1,s8.KP -s+Q1,re1B:f(/ik~> -mf+X3o%0emkht+?bgP5(kCZrJBl.haEr>lWr,QiQEH#jbDt3L?F8l1=&H27RU?h""f?`(+kNekp -o_n.Vs)T!/s8R.]rqC39\*;l*dad18m<<,ZEcV*VErU1]s3UZC(B4*i\\.1cg="-,;J)cLeD0-O -T>p3nrr3c2n'@Njk2+\7ZZf6.ajSo%l+FLcq#:3k&,PS1PO.AceC<:7m"T$9ErL+`KE$"6s8Vt; -"93F`s8I'?K@'2hJ,~> -mf+X3o%0e`\"T:r^T3a![C* -mf+U0lc?'jad[p$I#tqtNbs#iJqSgVL&_1,s+Q1,KnP-WK`(h'L&M#_rUea:n("LrFc!0Ln"SJ, -rTsRaKbosQs+Q1+pO'9_i4G(uM6#1qBR#)]L&_%(!WUaJs"OHGhQOiT]9%DS=%5\^C4;>\jLDnc -q>UEnq<,SskJWX9D-KS# -mf+U0lc>gejP88/db<[EJQl`&E,p%!F8u8]s)W8]F)uC"Er>oXF8c+MrUea:lf[0Wce%(;l_<&( -rTsRaEu0K/s)W8\pM7(Cl/C@EfAGcWkF8u,Y!WUODs"OHGhQONTiS)`&P#>DLbL5,(lEIta -q>UEnq<,Sllf6aKbb& -F*%B\Ergp?o)F4~> -mf+U0lc?BMXd>fsX-fcsZa.9^a2uL'b5_Las2rLab0%j(ao).\b5M>OrUea:bdF(5[%3erbbEb^ -rTsRaaqrG)s2rL`pVO5W]V_$rSY!75Y.hotb5_@]!WVQas"OHGhQOf/VO+@*_Rd@s`i,3%^V.>C -q>UEnq<,T'_Q/ru_Sj*u_TJpHVS'aKhtI'Jrt,2+l,0pIXd>fXQ`\3=]'IK;ap$/lb0'baqoT$@ -b0'b`aoTlVo)F4~> -n,FF-puK!)i4G(uI#tqtcXh3IJqSf2s+ULQL&Zj\s8I]Us+ULQKn]L*&H27RU$pO5M04ZUeaK6b -o_n.Vs+M8Qs8Re,rq:`C^u2hdI#4oSmqI'!KSBI'K`V5)qu8AKo@Tl-eZ=UM@o5Z`re6()rV_EL -K*_7)KDU=UKp1*Ys*t~> -n,FF-puJuul/C@Edb<[E`Dg;_E,p#@s)\5?F8p<&s8I'Cs)\5?F*%<[&H27RU$Ln!f?`(+kNekp -o_n.Vs)T!/s8R.]rq:*1[cuc)db!C>lW@e=F*%BYErl -n,FF-puK!(]V_$rX-fcsbH&1ka2uKHs2tBAb5]W,s8L.Es2tBAb0'\_&H27RU!0p:S@"iY[EPAt -o_n.Vs2l/)s8U6arq=13aLnC:X.>iibceb$b0'b]aoVP0qu8AKo@Tk_[@`tra1o*p_TJpHVS'dP -i:m6NrUo'Q_n;k5X3&5i]"c:mSY!75VqUeArVmH.q<,N!`3#B$UR/+$]XmFNrlPDkrlWC^rVak< -a924YaSYtZ!RU6)s*t~> -n,FF-p>2t1fs-K\I#tqt^1MM:JqJ`0qh4nGK`6[Zs8I]Us+ULQKn]L*&H24OTC:=3M04ZUeaK9d -o_n.Vs+M8Qs8Re,rq1Wo)F4~> -n,FF-p>2t*kht+?db<[EZrCOOE,fo=qf;W5F8g6%s8I'Cs)\5?F*%<[&H24OTBk[tf?`(+kNenr -o_n.Vs)T!/s8R.]rq1!*f]_8Gd+@1F*%BYErl,^bi98jm -g@Y@Dr:/7.lf[0WcaeL::jfe!fAGcWT%*?/rVn;FpuT-$l/C@EeD0-OL19=cEH6&MpMk0Eo5AMa -D/=%KCM`BWEH?cZo)F4~> -n,FF-p>2sr\"T:rX-fcs`N6Yga2lBEqoSd7b5TQ+s8L.Es2tBAb0'\_&H24OT?O^8S@"iY[EPE! -o_n.Vs2l/)s8U6arq4(,bdX:8Z(7Jobcee%b0'b]aoVP0qu8AJn'@cOZCIMq`kJmm^rWdMTsr7E -g@Y@Dr:/7.bdF(5[)]qo]"c:mSY!75T%*?/rVn;FpuT-,]V_$rUR/+$]Xd4HaN;NKpW1DIo>\bg -`5BLQ_Sbc]aNDlso)F4~> -n,FF,p"QG6eZ=UMF,-X?h/I4SH[^Hom""TrK(X_Jq>Q$Nre:CPKn]L*&H)(IS+"n/M04`]g$klm -p&47Ws+M8Qs8Re,rUkK6n("LrFc!0LmqR0#KSBI'K`V5)qu8AHlc,jfad[p$>Y@sb:h"R(X4?[/ -ddd87qWc%tlH,NJDd5q3787*.KqQ]XU!<$&rVn;FpuAj%i4G(uJssdGPB#B,It)p(iSJq6eTc7[ -FE2B2EHB?NItIULo)F4~> -n,Fa5p"QG2kMOn;cIUk7fO.rqBl%X'lu)=`E:n3jq/ULsrcA,>F*%<[&H)(IS*T7pf?`+-kj,," -p&47Ws)T!/s8R.]rUjm%lf[0Wce%(;lW@h>F*%BYErlYe_T?SS^$U"rVmE-puAirl/C@EeD0-OKj`^8D&$l4iSJ;$eRi?% -@UWWR?X_/mD/oL#o)F4~> -n,Fa5p"QFh[@`tr\=]:s`iQMZ^r++/m)AJba7[Npq8pb$rlY9@b0'\_&H)(IS'8:4S@"cZ\'Lr* -p&47Ws2l/)s8U6arUmt'bdF(5[%3erbcnk&b0'b]aoVP0qu8AHlc-0IXd>fs`P&[k^W3^PT!ce4 -ddd87qWc&(`3#B$^;[e#]"Q(pTpi4+Wm0u/rVmE-puAj%]V_$rUR/+$]=6Sp`"g20iSMB&e\/T+ -\[])X[^aPs`5qlDo)F4~> -n,Fa5p"QG6eZ=UMA93O'dG9@fDK9iAaEGnYHJ*XmjaVi5q1S_HKn]L*&H)"BU[?="Km\uni8L]k -p&=:W(kn1Rs+Q1*oQm;$eZ=UMM6#1qC3kJbL&_%(!WUaKs"XNJk.J4b^ls4_=[u+a93cCeR`Ocm -amAm&p>NEti4G(uBiePK<_H\9JssdGUr;QprVn;FpYrU!i4G(uJssdGOD;JJFE;K4Z`\,>Sp-Kc -Pc_pC_T/`rGCK;:o)F4~> -n,Fa5p"QG2kMOn;^[V#NaCNWGB\@*7j_\pTq/ZH6F*%<[&H)"BTC(are^E11l.N)l -p&=:W(it?0s)W8[oOt#ckMOn;fAGcW=D2YpF8u,Y!WUOEs"XNJk.Iq`inDl)R9F2aAu3`$guRgr -amAm&p>NEll/C@Eb*&U2O_1H6eD0-OT#BpjrVn;FpYrTml/C@EeD0-OJQTV)@prcTZ`[K,SnEk6 -L8DPq\%\_FASq1fo)F4~> -n,Fa5p"QFh[@`traL@e3ZH';S[(!TWaLfdI^Y-E=ji#0Zq8rU8b0'\_&H)"BX2hH5TrXQX][3\6 -p&=:W(s:5*s2rL_oY70F[@`trSY!75YeS6$b5_@]!WVQbs"XNJk.JCBW0XC$_n3Rh]YqR[Q`\33 -amAm&p>NEt]V_$rahl!:_S!h%UR/+$Y/KW%rVn;FpYrTu]V_$rUR/+$\$3Qb]"#5ZZ`^U/T!Z5F -]X>\rai:`q]YsR2o)F4~> -n,Fa6p>2t@eZ=UM@pjA5VU=eg_3:+KVj4$IC8Gcc]6/@Fk(*1&Kn]L*&Gtk;WTqTpK7&cli5)VS -pAXCX(kn1Rs+Q1*oQm8#eZ=UMM6#1qC3kJbL&_%(!WUaKs"aTIi3L8Y]9%DS=%c@_8Qoq\Q,Mje -^ZYCho%'Vpfs-K\AR&nkBNA5MIZhJ,\%Lhtrr2p5rqGBY`8J7hI"Ig.lAAo;Vj*CN`5KOlmf;eT -l2^#Gi!/K*H[+r+rq$/?~> -n,Fa6p>2t -n,Fa6p>2sr[@`tra2YT\S?g2ZaLf*uZ+d9/YGJP3]=P\kk/R,lb0'\_&Gtk;Zc&u4UT9cZ]Z%)3 -pAXCX(s:5*s2rL_oY7-E[@`trSY!75YeS6$b5_@]!WVQbs"aTIi3L85VO+@*_S!Xr]YhU`Q)hd0 -^ZYCho%'V[\"T:raMc6.b/2'9W0XBs]tEJ%rr2p5rqGBY_n;k5X.u#``3Q/5Z+[ch`5BIkbQ,fb -_uR[Q]EZ=!\@q:orq$/?~> -n,F"!puK'(i4G(uBjP1gLSi>Li;Dj?mJZJ]_8V[aD81>TmXp2lrr3Q+m)Z*iad[p1OLjAdZJbKV -lMhZas8Re,rUbE1n("LrFc!0LmqR0#KSBI'K`V5)r;SPNo@Tqufs-K\AQW2H>YA+2I#tqt_mA:p -q!6%omEM>YEF3C,M0ru;BRGoQi5;n[p\t0l&,u=]ZGYV4OF1tuS&ssamJcANjSn*:eH""raT09X -]*?C5d;e*jrU^&>~> -n,F"!puK&rl/C@Eb,_hnf&#NPl29lJmJZ>Y[_7E.>ean1mW!:Hrr3Q+m)YjdjP885g>V;+ZJbKV -lMhZQs8R.]rUactlf[0Wce%(;lW@h>F*%BYErl~> -n,F"!puK'/]V_$rai29/T:E-p]_o\Ja8O3iaMkj"ZbO35m`f`R&7O8ZJbKV -lMh[Is8U6arUdk!bdF(5[%3erbcnk&b0'b]aoVP0r;SPNo@Tq`\"T:raMYs:`4Wt0X-fcs_R&1o -q!6&#a0;#+]#DgmSZBoMb,^o,]Y_#6p\t0l&,u=]ZGX>PQ`IiqQ`\3Ma8X!W^](nF[/dN3XT5F# -V?X06bdQHlrU^&>~> -mf*jpm*(7Pc(Ti:EGB$*LS:ubr5er`rRLr+*U<(NY'IS+IY.Irs8Vr]`i&+DRtH*M]&:E3iV3?6 -rtC+bo[oo,eZ=UMM6#1qC3kJbL&_()s8N)Mr;SPLn'@TndAD\?@9dDeDd61NGDi`Zi25/to]!Ek -jM6t.CN"T^X,q^BA9Ws:g#/jap&4mi&,u:[YJ];1OF1b\Jt'm4c2Pfb_#CtFX8o-sRfJ`PO9VB& -m>BH;r:Br=~> -mf*jpm*'_Ajk\J7c-*iHf%o9Cr8[k>rTF4Fs6L]XVJ3ThCiK:Ns8Vr]`h;\Zgsjd+iT[kZiV3?6 -rtBJPo[oo(kMOn;fAGcW=D2YpF8u/Zs8N)Gr;SPLn'@Kik2+\7Z_bUdbb]s+d+I:?fr!Emo]!Eb -lJgOHbKSDghqHN$^ -mf*jpm**&]YaV8g]>hq$Ssl@Mr2ft'rO)[<*Q6+E[^EZo_oMZRs8Vr]`j!C`Q_UUKVS'pUiV3?6 -rtEQRo[on^[@`trSY!75YeS6$b5_C^s8N)dr;SPLn'@cOZCIMq`l-!+^Vmq/Z(%GrbGNq_o]!Ep -^SmHs`P8I@SsZS$aK_5.\'1i+p&4mi&,u:[YJRrLQ`J6BUR/*jYl:a)W;`[nT)bD\QN3 -mf*jso\XW*i4kqFKmn5cF+oR7r0m\[rN-%2*Qc^^kO,mVFFV)rqYfrV[VW.VU=h'cg:)O -VVp.4N-K8gOLhF&OF1bbM6#1qT@EH0rr3N.p"ZS*fs-K\AR'/*S#i=_RfJZOOT((:L]2o+JGsp$ -JssdGQdEnQoDa=~> -mf*jso\X#cl/LOPe^DghcILS$r7h;.rSRY6*TZAHlg1mP@qtN0rr2c[`h;\Zgsjd+iT[kZiV3?6 -rtKPQo[oo(kMOn;fAGcW=D2YpF8u:=F8u7?d/Eu#rqYfrT'YOneBFf.dFZmlV6S=shWF0ocg:)O -VV11kf[.jjg>T*kg="-ifAGcWT@EH0rr3N.p"ZS#kht+?^ST0(gu$reh#5t+f)XD$e,[tsdKe:W -jQq`M`;K6,J,~> -mf*gro\[+"]Vq9eTr>6.\"T;gQN3KQTDtc/Xg5FQb.ja`_=7=#rqbs#Yf*Z1UT9cZ]Z.>;p\s=T -'[$CHfV6TtT:E9ZT!ceH^W4L>s8W&?s8N)drVn\Qq<>f"`3#B$^;\3sSYNp;`jhY2ZH8iem-`K& -bdX:8Z+m?,VQH__X3.f?T!ce7eFNP:rt#,%goAT-Tpr=.`4i"5T:5bG!1*VNrgWt[rhBIiri6:! -Q`\3@d,Foos*t~> -mf*aqqX/WG_W8tMTTY4eK)U/qK)gW(M>rYXS#3I/dH'5?Eng'ZrVGj"Vs;BnK7&cli5)eZp\s=T -'SZMXfV7ibXGM(VX4?ZRH@gg(s8W%Os8N)MrVn\Qp>NEti4G(uC2\BXUmcmR>]54_aQfSYEIhXGM(0;-\$lM1tq]!.Oops)n -mf*aqqX/!#\*E)6h:gN3eGdnoe,\%tfDjPFgtpuLk3CWD@,(/HrVGj"T^:apeC*(0l+"+Zp\s=T -'Qa6FfV7]phq-3+hrj<-BQ/$6s8W%=s8N)GrVn\Qp>NEll/C@EbKSAebhU^lV9IHEjQrJTjQ=OQ -mH*0Sc-k>)l$'>ig="6rh<"$pbjPB-rt#)$g8=3!hq-2bI\k9 -mf*aqqX2)'ahP'TR[0G:U].=lUB%"dSGnipS>!!h^Wa6tg[G";qWl/*`3#B$X-fcs`jF_!roX4p -b5LtbUO`4i":U&LeeW;`jt[/R*+VZ*@iSHbFb -`4sd\r:Br=~> -mJd^qpj[O*\aA4t^TjH#OH>CuM#`>1K)U-iS:Q2[6OWs60& -oPWI0rU^&>~> -mJd^qphaVJZ0gc:io&YJg=k3Wf)XD$eGdl:eCN:,hW!bdLUu=4qYBHsT^:apeC*(0l+"+[p\s=T -'Qa6FfV7]phq-3+hrj<-BQ/$6s8W%=s8N)GrVo=bo%0_kkht+?bgG,&R&f#lbfS;eiT\"^g"Np= -lJgOHdb<[El9quCiS)`0guRgm_Wgprs8W&ifq[lrhq-2bI\k97dJhSne,\%ufDaJ(g]$"-hZi', -lWi5drU^&>~> -mJd^qpr'kP^;mghW1fZHR$aB@SH,;]U].;7URms?S>`p;]t3%jqYBHsYJdQ0UT9cZ]Z.>s8W&?s8N)drVo=bo%0_]\"T:r^TO!"V5]fV^<3LDVS'gRg"NpK -^SmHsX-fcse=4FiVO+?YQ`\3._Wgprs8W&ifqZd!T:E:/^VmmoY5YL$UB%"eSc4uVQ2[-LSd)(4 -gp>etrU^&>~> -m/IRoK7A0UL=#>Kg!.UL]!;16!2faa+HVV=HujO_LQf!flD_V\p%[glVWu9mK7&cli5)e[p\s=T -'SZMXfV7ibXGM(VX4?ZRH@gg(s8W%Os8N)MrVo=`mE;6kc(Ti2H&f>hKr2t]Jo>jkZ.\'2bfcd> -fs-K\JssdG_-N&cad[p1OLjAg\E!A`s8W&ifV7ibXGM(0>]54NNrG.>RK0#[X8][1`;[jWeHXt! -QZ_N>rq$/?~> -m/IRoEG]?tGK9+9kiLmaiSaXk!8d_1+PPN"da$4gf%T'Dm%_DXp%[glT^:apeC*(0l+"+[p\s=T -'Qa6FfV7]phq-3+hrj<-BQ/$6s8W%=s8N)GrVo=`mE;'fjk\J3dFmLBHCj3QeBH:li98jibfcd7 -kht+?eD0-O\4hD=jP885g>V;/\E!A`s8W&ifV7]phq-2bV9IH@g&B_)g]610hu;R7j8S-=k6C2< -M.>bmrq$/?~> -m/IRoaMbg%\]`%.\$3!3VP3pZ!1a%T+IJRhX1,@1SsH(S`3R5?p%[glYJdQ0UT9cZ]Z.>s8W&?s8N)drVo=`mE;NMYaV8sY*l&rV6m@kUV="&Tsr7Abfcd* -\"T:rUR/+$_kXWXXd>f`R&7O6\E!A`s8W&ifV6TtT:E:/`4r( -li.EIK7Mg$DMG[ZmHWWfg&0A#dJh30]!eJtHt[AE%jhRtGd;VU=h"]==F! -c(Ti2JssdGS7RiJad[p.NjdcjXPNRJs8W&ifV.caXGM(0Dh=FY[f3l;a8jKaec+J,kPjcGmfg[e -F+!T/o)F4~> -li.E8EGjWC>^*F*mHj*%kksTDk5OHAi?$k0d`TeZe(EO>g8!$]p$'Gfm,ZsOdb<[E\@(>jroX4p -F8ba`U?h""f?`(+kNc5`E-$+#s8@$=rrCFFs$cq^jh7MVj4i&1g#;/[97H6ggsjX#hWF0k]==6q -jk\J3eD0-OQ;`J'jP884g#;/:XPNRJs8W&ifV.Wohq-2bbgbG*rSdb:!9O4CrojFKrp9XM"hf1j -C@faAs*t~> -li.F:aMm#I[(3loa2GX'\,fcRA7@7XPNRJs8W&ifV-NsT:E:/^S@-eU]..iXT5U)[Jmf=_Z%LQbQYtt -\\[n'o)F4~> -li7!=$\\/%HZm!"Um/^2i;E$Dmf)Joi8)elOF1bNCOVG]jLD\VnE7]clH,NJI#tqt_RAM"roX4p -L&LYrU@6X6M04ZUeaI7!JqSjXs8@ZOrrCXLs$ltZgo\u[[Z5ZaQ,Mk5ARFoVXGM(OR`OceV4b6W -^ls4rP/$)KPAFh!eZ=UMM6#1qT[iW2s8W&heXl6[XGM(Z@3l2^5Nmgm:N_4m0YQCDZ, -]Q\dTqpk9;J,~> -li7!+$ZblVBk=lTT8'h`g&117llbQVk2G%Bb-T:>g>_D%\)6]<_k-5Ugsjd+iT[k\j7rW9rtKPQ -o[oo(kMOn;fAGcW=D2YpF8u:=F8u7?d/O&7rUemIb3@m -li7"-$H_qY^q@7XXh;`qqof&^rkoql]!A3#X3/H$W0XBs]slngkJOI@Xd>f`R&7O9[c@/^k5Q.< -rUea:bdF(5[%3erbcnk&b0'barQ>0?!:Bdc7fDu7Xi\/LRBEEPX2<2WV9H?>S@#&XXi.38TY%t; -QDgaJW5$rJZ)Z$UT:E9ZT!ce8eaiYT$4U7S@$&+Q`[[,rk/6K!6>)_&&H?.^q7:oS$963 -]Y_\cmIL:-~> -li6s<2#W&YJE5FsFE)5@ChmdZBqD8fTu#(Ci4G(uBjc";VU=h+cfjE(U?]jiK7K6*kJXplq#9FU -'SZMXfV7ibXGM(VX4?ZRH@gg(s8W%Os8N)Mrr6C(n'RfrdAD\?KqQ]XTl+Jgh6r>iI#tqt_23g5 -eZ=UMKqQ]X\#XO`i7YAoG_Mg8m@_Yiqu?]on^ -li6s*2#VE5DWKN]@UNJQ>$4t$=.>q=S%$E(l/C@Eb-B7ChWF0tcfjE(SF#=leC314laaReq#9FU -'Qa6FfV7]phq-3+hrj<-BQ/$6s8W%=s8N)Grr6C(n'R]mk2+\7e_T?SP[7>0l/C=Cdb<[E\VYt) -kMOn;e_T?SYH)&5g$%AHd+-t6m@2;dqu?]on^ -li6t,2#YM9`T5ar\[SrOZ*:I+Y+i57WlW?)]V_$rai:i_S?g88cfjE(X2M-,USas8W&?s8N)drr6C(n'RuSZCIMqTpi4+^oONY\tb[rX-fcs^km]f -[@`trTpi4+^8n`HbI=17Z([Vja/I2Kqu?]on^ -li6s<2#i8_K_Y2kIsud#H[:"iH-j`V^2IeN^Yl_cHtd>EP/$(g^YmtZ`Se@iI"Ig.lD;5Xq>TOV -'SZMXfV7ibXGM(VX4?ZRH@gg(s8W%Os8QW\s8W)ol,0@_ad[p&KqQ]XKQ_1:jM6t.GDi`ZheJ;= -ad[p&KqQ]XT"oMd_r/.gI"7L#kH2M^q>UEkm`hftad[p7R`OcP@;2l`EH?5FcZsikhL'a#It3(> -JqEcNKSBHWo)F4~> -li6s*2#hW_D'^YmtZ^$4M0da[(5m$YTNq>TOV -'Qa6FfV7]phq-3+hrj<-BQ/$6s8W%=s8QWVs8W)ol,0+ZjP880e_T?SFCn^QlJgOHd+I:?fP6?2 -jP880e_T?SR_WK>]BS;.daQt2l_VAZq>UEkm`hQojP887guRgM:fsl,?t!PUcY$qGhJ6nCD/O:^ -E,kYnF*%B.o)F4~> -li6t,+TKU,anYMj`5BI1^q[Y9^TOV -'[$CHfV6TtT:E9ZT!ceH^W4L>s8W&?s8QWss8W)ol,0^CXd>fpTpi4+[^36X^SmHsZ(%Grb%dEa -Xd>fpTpi4+VnfsO_n;k5X/;/__R@5Bq>UEkm`i,WXd>fXQ`\34Vm!82\%'#]cb@0KhSR.I`5Tad -a2n%tb0'bOo)F4~> -li6s -li6s*!<<%>#6+SXEcH)Lrbs4VDt*13kA"YEV;]=)D_DNVU9'aYj16%e'ct/l+=7YpAP!fm)c!gjP887guRgR>@lQ)Ci+$,n8E:=pAT(2EWc5\ -F8l/[!WUO;s*t~> -li6t,!<<&@#6+SkaiMQJrl6AX`piE7kJ=mIY/e2PQ`J62RA7@8YLhI8`4Vt6X.u#``4s8W&?s8Q*ds8W)li3U>6VO+?aR&7OGY.D'T`3#B$]:k[ta*G"q -R\@fXQ`\39ZFnr/_o0L4nA`NApAW/4aTMI` -b5VC_!WVQXs*t~> -li6s,dBKS9@(qh51QKn]P\ -rr2uLo)F4~> -li6s*!<<%>s8N)Wrc8'lrc9CaF8YoUq/L?3@T;"Di7QE&fAGcWU!D2o]BS;.da[(5m#&dIqW7_k -F8ba`U?h""f?`(+kNc5`E-$+#s8@$=s&IGGs8;H=U[.+#f?_q#j6O-YEb&8;kMOn;c.1Y3RH<8T -c-Fnsk3T+ZhJ6Snm,ZsOce%(;l_E&%r;QQYa.Ve[gsjj/jQqS/C[uK?q>,.0F*%?[qf;o?F*%A& -rr2uFo)F4~> -li6t,!<<&@s8N)jrlP5frlQPcb5D.Yq8gS7\Z/52b0'__qoT'Ab0'b, -rr2uco)F4~> -n,ELhr;-6gKE2#NL&_/QjSji5PQ$7^s+ULQL&Zj[nTo&VjM6t.EJ:(1mA%_LYf,J3OF2YKaQf/4 -lh]`C'SZMXfV7ibXGM(VX4?ZRH@gg(s8W%Or;T@cm)ksfc(Ti2KqQ]XUN2*7D9q%HNd>>XKqZbb -KlLLALSiJeHctZ'GFn6MVMB5HTZuktbjG<,qWl/!lH,NJJssdGPf8.JL&V)UL&Zj\s8VtM!rmt. -r;QcJo)F4~> -n,EXlr;-50Ec_6ZF8u7?i;RctKDop -n,EXlr;-62aiaV^b5_JAoDZl4d/M06s2tBAb5]W+n\;BI^SmHs]:k[ta/m>/Yf",NQ`HmJXi.fj -lh]`C'[$CHfV6TtT:E9ZT!ceH^W4L>s8W&?r;T@cm)l9IYaV8sTpi4+_RIFsZHKhSRBFZDTpi3S -Tt87RT:E4/Z-2CM]VEWTS=[3`R]si3bjG<,qWl/*`3#B$UR/+$]Z%hbb5VDEb5]W,s8Vu=!rpEc -r;Qcao)F4~> -nc'.!r:faIk^J&6q1OHUs8V0ZK`I>9KdHbQs8RfQKn]8LEKTP.RtGX2R`Ocm_U#F'i4G(uJssdG -R)nXjjo6$KrUea:n("LrFc!0LmqR0#KSBI+rIt4M9)eVI]Xd+=PC@M*TZukXG)CZeZK/fbIVW80 -KqX3??Yk7X`95Tkg@9`?VXN':M04?6`948;kP>)Qlc,jfad[p7R`OcY`ddi=rr3.Us+Q1,s8.KO -s+Q1)rrCX@s*t~> -nc&ppr:faIk\Y3Vq>PI8rrD!VEr^jlF!^j-s8R0?F*%(k?\Ie,gsjQtguRgr_U#Etl/C@EeD0-O -Mob8]jo6$9rUea:lf[0Wce%(;lW@h>F*%B]rH%r;9)eVI]Wg\\g=+)Qlc,UajP887guRgV`bkQnrr3.Cs)W8]s8-j= -s)W8ZrrCF:s*t~> -nc&ppr:faIketH\q>SP:rrDZiaoKffasI)1s8U7Ab0'Iq[^sDZQ_V9iQ`\32_U#F']V_$rUR/+$ -]#a77jo6%;rUea:bdF(5[%3erbcnk&b0'barQ>*=9)eVI]Y;.ZQDhEhR]siB]>qdt`kSI)Qlc-0IXd>fXQ`\3=`l._rrr3/Es2rLas80q? -s2rL^rrDHWs*t~> -nc'-soB+WF^iO[Fl@O\Cs8V0ZK`I>9KdHbQs8RfQKnT/JE09G-RtGX2R`Ock^s/sui4G(uKqQ]X -R*+gnjSonlo[oo,eZ=UMM6#1qU=b'NL&_2OL&M$DrUo!KdG;6kH@1gci:1T.N.5u(mEM>YEF3$l -KlLI-F,-X?m]V!!p@Wg>`8J7hI!h$ei5;eUp&+[P`hr%CRtH<]aQf#0J,4lurrn,VKn]R,qh5+O -Kn]I)!7p`@J,~> -nc'-soB+WF^gUbfl>^ics8V$VEr^jlF!^j-s8R0?F*%%j?\@_+gsjQtguRgp^s/sll/C@Ee_T?S -N6:PbjSonlo[oo(kMOn;fAGcWU=aF+F8u:=F8c,2rUo!Kb3@mJ>QrrmKDF*%B]qf;i= -F*%9Z!7:<:J,~> -nc'-soB+WF^pq"llH%)is8V]iaoKffasI)1s8U7Ab0'Fp[^j>YQ_V9iQ`\31^s/st]V_$rTpi4+ -]ZTX=jSonlo[on^[@`trSY!75U=dN/b5_M?b5M?4rUo!Kah"78Y,dqe][X1"b/Cp%a0;#+]#DY" -Tt84_\=]:sagnqCp@Z8._n;k5X/hVb]Y^o0p&+[P`im=_Q_U=BXi.ll`;7XUrrpRFb0'baqoT!? -b0'Y^!:B@WJ,~> -nc'-kiPqq)a2=clc$k7ts8V0ZK`I>9KdHbQs8RfQL&18gCp -nc'-kiPqjt^:9S9c"q??s8V$VEr^jlF!^j-s8R0?F8G@U>,:HCg=+9qguRgq^rr^gl/C@Ee_T?S -IEq!WR6>s%<4Ze"5mghq-3'gZ.V.?#"k-B3FQ`hq-2b -I]UeqFg96ChWF0pEUN\uCquq6j4i&/fAGcWT[`N/qWl.om,ZsOeD0-OL;n*,F8l1CF8p<&s8Vt; -!rm=_r;QcDo)F4~> -nc'-kiPr.7`lc6+c,7TEs8V]iaoKffasI)1s8U7Ab51SWZ,=>TQDhQnQ`\31^rr^o]V_$rTpi4+ -\'FI?jSoeio[on^[@`trSY!75U=dNbrr<#@!WU=@s%<4Ze"4dkT:E9cQ)hdF[)'u+^9GhhT:E:/ -^W!e'^;d[TS?g83^@(jm_n`auX-KNgSY!75T[`N/qWl/*`3#B$UR/+$]Z.ndb5VDEb5]W,s8Vu= -!rpEcr;Qcao)F4~> -nc'-^a04poi8EeVW-3ZCrVtsXK`I>9KdHbQs8RfNKC@U-F5>6@LN@BcR`Oco`65"GeZ=UMM6#1q -DU\.Rp&>V90o[oo,eZ=UMM6#1qU"4elrVc_LL&Qf)s%<.Ra/A4ERtGX5TZul! -F+3lVHuHjZ]9%DS=&!$r>&8_S`95UOL@kE@JBOYRc(Ti2JssdGW6"<#q -nc'-^a/J@jl07NeV.FL`rVtgTEr^jlF!^j-s8R0V90o[oo(kMOn;fAGcWU"4/ZrVc_:F8g7Zs%<.Ra._k\gsjQuh<"$i -@;P]2C0e=5iS)`&P&IF@T$,U;j6OjiG4b_0DTeR;jk\J3eD0-OU<)Zrq -nc'-^a10:/]Y),+XLuKmrVuKgaoKffasI)1s8U7>aR@orYfV90o[on^[@`trSY!75U"76\rVc` -nc'9SXPhXI]=Z#7iGIaturhU/3UF(T]X[b^G5bKQ^LeZ=UMM6#1q -E7a^[q>V!)rVQEao'PZ(l0e6@rVuorrb)3,n^X9#eZ=UMM6#1qS'QTTo^qg.K(aiorVlfkjh&%` -^ls4eKqQ]XKm&"Cq0mFMlH,NJDd5q0:1/-uVU=h8^P_gcr.3Fnn("LrFafLgjL;_]p\F-qVs;Bn -K7]Q5lBK; -nc'9SWnHRqiSih\fii$+qYoDoF8pmlF!^j-rqpd,Ct6(]g#h/BcG\,`iTTQ_bKQ^HkMOn;fAGcW -@+Y#Kq>V!)rVQEao'PZ(l0e6@rVuorrb)3,n^X8tkMOn;fAGcWS'PsBo^qfqE;";KrVlfkjh%_] -inDl+e_T?SG%>Leq/'Sqm,ZsObbf&mFg96ChWF1&^O#\Sr,:/\lf[0WcdLP,lE@e[p\F-qT^:ap -eC<:7m"WMsqK)Z9"`s]bF8u:;EruA_F8Z% -nc'9SZH9MTVP^E'bd+t%qYp*/b5]ifasI)1rqsk._pu;gaKh>-\&ke@UUnmMbKQ^)[@`trSY!75 -Xk31Cq>V!)rVQEao'PZ(l0e6@rVuorrb)3,n^X8U[@`trSY!75S'T%Do^qgsa7dUOrVlfkjh&4@ -W0XBoTpi4+\@]`Vq8BhV`3#B$^;[e"^;d[TS?g8I^W6-Kr5R<^bdF(5[&B:h^V%/=p\F-qZ,Ec2 -USF0X`4X+.qTAg;"j6kfb5_M=ao_Ucb5D8>mIL:-~> -nc*OK[-uPGOH>aGkFupAn+bmrL&R9iKnT>Up@*O`FJtS`dAD\?@;LIZ`95R;eBafVeZ=UMM6#1q -ES:!_s8W)trVZNep@@V6hpffb^;J=Un+chXq=jUUo^V+fQg`J+M04ZUeaJ@(GLtL"fm7s@hL4ea -qu$0FYL217Nd?)7]&<*nH%GnjJ9ZA-dAD\?@8BKj?uq+#dI*XPNVi_RK&3]Ii4G(uH&f>hd&Ypm -q!?,$lH,NJJssdGPf/(JL&V)UL&Zj\s8VtM!rmt.r;QcJo)F4~> -nc'9DXR#',g=k -nc'9D^Wa*WQ^[p@,uP\Yu4BZCIMq`knUVYab5VDEb5]W,s8Vu=!rpEcr;Qcao)F4~> -nc'9;b4!l]M0t)UdGB"cfBCk=p@j[JJoL1-hpQSFL!f;8VMB5$?uLXcaQfS"h9hk`eZ=UMOLjB? -F4p-[qYBp[oC)#,hUTfaYbA&-`lG$ifB`%tki(=Mf[S$HJa_-jM04ZUeaI.-BVD/pUMFYIER*V8 -q"!(5n("LrFaT:^i4s2VK)PX-JpVC^h6r>iB2q?'Ck.ehkL-KfO8]+XKB9bOjM6t.F,-X?m\%qq -p[6;,lH,NJJssdGP.uJ@K`:rSL&Qd[rr)_I"T*k*rVlfr!7p`@J,~> -nc*F?_!C1@f@&7,k1O9PfBC_'p@j)WE,b8_hpPr4Fis+6hU]uYZ-:_QjQr5-h9hk\kMOn;g>V;] -A(gGKqYBp[oC)#,hUTfaYb@es]t^>SfB`%tki(=Mf[S$HJa;LVf?`(+kNcc;5+lc?3`J,TEHETOj1lJgOHcIUk7m%)Ml -p[6;%m,ZsOeD0-OKthI!F8l.BF8g6%rr)e:s)J8>EcV-Xrr2uFo)F4~> -nc*F?cciegSZABQZH'5YfBDDaVS'sU^rQEPa2#%)\tb[rahbO*_PWU!_U,F?bl.S@aQ:(S^SmHs\=]:sae[;P -p[6;5`3#B$UR/+$]>)8Yb5VADb5TQ+rr)f -nc*47am[c\M03lpVU=7AX2DYthr*F?He$BWZ(@3,mG6$aLN?m+F+Tk%lJl]gjO'LdeZ=UTOLjAd -Ems7=lK@0_f?_FIY+_Mj_scmOi8F"D[FF'`_m?>F,-X?m\IV[OT,:[K^6^ElH,NJDh=G!lD2;\p@-Ohn("Lr -IZhJ,YdAcGK(o!4K(X_Io^r*6$A!`qJ:[ChrVliJo)F4~> -nc*47_!C1@f?_anhWEL#X2DM_hr*F-C":JEZ(?]lmHN`hf$:UhcICY1m+PXHjO'L`kMOn>g>V;, -@ajQ-lK@0_f?_FIY+_>^]BehKl07TM[FF'`_m?>EKJc>]LEpLf%m,ZsObgbG/m%2)Xp@-Oblf[0W -db<^GV6jt*E;0)"E:n0ho^r*$s)/22DK#4DrVliDo)F4~> -nc*47cciegS[>kuS?g5>X2E2thr*G/^t$]GZ(AVMa1ALFT!u_W\>,Cm`7D3;jO'LA[@`tiR&7O3 -YLD_%lK@0_f?_FIY+_f&_p$'6]Y);*[FF'`_m?>fsUR/+$Xhs;qnC+,U[@`tf -QDhR:[(u.Np\+=$ouG,Fo_li1`X)"O`qB0+rr;BVs*t~> -nc)Y-^$jLPM039KLSiJe[@<=qYHkHOCnR8m`:*!Ic*j=$F(&HcF+Tk%lBlY.kg#aedAD\HOLjAb -CqIj4`P/a]U7J-idI6Jci75rb]=Z>NZ*V*B]]&eWs69m3RtGWa@WdO/pXLeMmB4Okk/aLdad[p$ -JssdGPB25+rr7Y%GB`K&VMB5$:LJ7!VU=gVcgHtqs!`WjdV81#XGM(IOLjAf[,CTIfTP^RXGM=d -]&:>mFOtothVTGi%`Xqu51;s*t~> -nc)Y-[-Qo4f?^qOf&#QUXI"rNYHkH=>+h:S]BehJjl,%HcEjdccICY1m#,>akg#[ak2+\;g>V;* ->eA/$`P/a]U77dYb3SH\l0%-eiSinaWjB@;[+YBCs6L$PgsjQF\BidapZF'kmAS+ek/a:`jP88/ -eD0-OKjnn=rr7"VAS1;khU]uYGHoHEhWF0;cgHDas!`!XdT>bthq-3&g>V;.[,CTIfSo.Zhq-<1 -iT[b>@b5APhV;huBP?&Nrb)[PAnB.sBAVqGqu4t5s*t~> -nc)V,`lti^S[?GHT:E40\tl%*YHkI?ZCmnn_p$'1YbRYY\&QG.\>,Cm`4NS3kg#pFZCIMeR&7O2 -WOpDIV`!EK3UV=^f[%3f_[4Ai/\&dXmaK`[cQ_V9i -Q`\3<\\uSgs2i6mZc]SDT!u_R`jhY2ZH9H!ma(n4.EV)-Y0=;GS@#>aVS'gRi:QTmWQ_cBS?&$S -]Z-GOf>6A$gq_UX^Y%3<^C.ch]Z[t%hWjb1rpB:VJ,~> -nc'0HRIA\,M0398F,-X?jR)E^rkh(MNmZ&Ep=<,[AWaQh5lh=Qm0s!`WngMGg$Z&EpMM6#1qUt5&,hO2^G[Z5Zl -Z.\#UAuBONY,Q33CMTZ=rb;gTBU>]aLpG1^o)&FWs*t~> -nc)8.O6budf?^q3cIUk7lL!oX]">S_f^%njl0%-dh:^?(^<=gJf%8gB]k;&rlH>shjP885g>V;& -:Q(I3T;B3Blg4!'l0%0giSWGig'?U#acM\=lKJ0/s5XI@eBFe;MR_!apYRL[kh32lh7oNIjP88/ -eD0-OLLb:Cs8R.ZBj03Ri7QDkMTjT*jQsunh=Q@!s!`$]gKN:oi7QE&fAGcWUt5&,hNQ%FiRuW2 -i98d6<2X!*Y,PR!=]qJnrE'D-LnfcOZHD.squ60dJ,~> -nc)Y9[*5qLS[?GW\"B1r^W4R@_Sa:4bfn5J]X=l:R[KkYaMt`sT:MR]^pLo8lH?NPXd>f`R&7O. -S;WWfs -UR/+$]t;8*s8U6^^p;1nTpr=._7ub3Xi/Yoh=T(ns#A0ngTo&4Tpr -nc'0VN6pChNd>MP?uq+#^s1EcrSSpRe^;LNXIG6(H?!kGIYWcWX4>"cJq))3aJeCGRtGX,OLsHM -n,MYikMY1HdE024XJ(o@M1^8)MlYCsFL1&DZ2C^'RfS.[raGtABP;P_M(>%9lEJOb\AdC -nc'-UK#m38g!S!WZHh%XioTA$kp,ETk2bLYgtC6*c-4M^f%8d9kI7I4D92%aU?psreBH@piT^@- -s6LTgl07BnjPo.Uh:pZ8eC2juhrj -nc'0VZcp"URBFEJ`j_P0W3E\@rOaAa[Bcp3T9kt>Y.DBTW1TWNT!cJ9^r5@#aK`[cQ_V9qR&7Oq -bl>Tu_S!IfZE:(#T:2%3S>3$`S"@%3FLf/bU&:P_QN[E#qWQ`I`lR]si4bO"i\\B2C\Q`IB\ -Tsr7iaN268p!!ER#04rt_rC@fo)F4~> -nc'0cRtpCUVMftKDeO3IPG,(drOX;ZXJVJKM1^+oFaSdtP,>;-e\H%JMh9@BaJeCGRtGWmI#tu> -ec3`.`4NIZVONd0M1pJ-Fa&4bMne?DB^aKQN;SP4K)foiFT?^[Hn9lHdI+0[e?m0P]9%DfOLjB? -CjL\ds8RfLJ9?_9c(Ti2A:Tr`kMg9&nbeUMruZskl#`9Wad[p$J -nc'-bOa-9ThUp<(bfS/]g>1Zai?R:W%o -s5Y$WiSi\NgtLH5e^Msmd*gFrip,fBlf[0Xr7Ctu!6tJg!7CJf/C`P=m&8(V[(PY^g="F'iT]W2 -BlJ.ns)\$SA:3e+h:9cae(`pKfii%Yr.G"K*cq2B@Z'O5gsjQsgZ.Us^ut@SV2"?tgsjQpf\krU -rTX"1kmJ?DRJ,~> -nc'0c_RddlS=?C\^WO$WQC=G@rMCg5T:D77S>36u[&]smQCOPP[D]AsaN3T2aK`[cQ_V:;X-]^_ -[K!?GX/;YaSfsVNn4![_V(ul,(-PXd>fsZ(%Gp -[CZ@MosOe$#-bSWZ-Mb5o)F4~> -nc'0mWH+9hdBSspJp_c`IYEW=rK&7_M2-_2FaSXiM3+1,^X:TgUi1MBOG)'LbGsjLRtGW]Bmc$A -XT+b,Q&q#_LP(&%Fa8@dLP_+]X2!`#EpqP[M>_f(J:`B,rJ:N7oT1T#dI*ONf!WHS]9%DhP/$(r -Dg[1ks8RfNJU2A*eZ=UMFb#q%lD8QNp\pBUruZslmWXTVc(Ti2I#tqt_m\Rsn$RH/dAD\?A9a'7 -XLA,?orS.^#GJT^e%=]9rq$/?~> -nc'0mT4!H@k2>"HeC)^he(*('rRrLKf@JI"cdL7kf@o$;io]FXT3Z'nJ9&m$bG=LcgsjQ8b0o#C -huDIKgY1?4f$r0rcdC1jf%8X2hr_D0 -?>FP%s8R0 -nc'0mcaUU+ZD!PQUT:Z/W1f`LrKeauS=ZLV[&^.#SX>b8W3WhNX0fS)c,o5;bHo-hQ_V:4b,^m. -TDt5pQ'[o/Sti6e['$I)T:M@9SuBEEEm1q`SGfJjVPBo[rLEqVoU%/!ZH9;rf!WH/VO+?^QDhR: -[DL#-s8U7>`kS_$[@`tr[&01l`4rh"p\rP=ru]D\m_$$LYaV8sX-fcs_m\Rsn'&2^ZCIMqaK_5, -T;2C_oq25M#F_F!b.Ha0rq$/?~> -nc'*rZ?pShmb,O`RZNG_Jq3]F,(P8sLP_+UR]F$@e`?/&Uq_5+pQC6[nC"9&c(Ti0C1q:.re^Z- -(k@![H$k-oLP_%QR\m-saOTA/FcG>4Z','I"-o=DT`(nk[e.-]aOSk7gYKK]i4G(uI\tN\]5rFR -L&_1,re#WFZK/fbM2@86lJlo1Jc#J2rr4'orUY>Wi7YAoG_1dQeaKa"o^on;_Vi%fIWojXM2@8l -OS+J0K*R76eaKa"pAX[`J,~> -nc'*rW+fV4m-*KfgtLE3eC49B,1G&kf%8X0gu%)OkN_E1U;(AZpOdP4nC"*!jk\J2bK7lSrn%2" -(Xpg[dF-Lnf%8U/gtprIjQGg]A<#:+i;D:2gYCT?rSR5*/*,m -nc'*rftb&#ag\=EQ^F87USdmg,,V-1T:M@8Q_((V[D0huWP?3epX%(KnC"P]YaV9#`lcH)rga"` -(o=:9Y,eFpT:MC;Q^jYEXgPpcZ&Qu:TpGYE"-o4>Rf/fXU\(E6XgQ]ggYKK\]V_$rW1:08`4 -nc'*u\:Aq>T&AebaL\XRR[*`2+-i:`VQ7;CaOT56hQihocf9S/rKDrco\?(sfs-KfIf+R4J:`B, -M2@7SQ("SN[^sQ-e_o`LZZC,kVru=>rON*LaN2X)eH"Fti%+*MXL%-P`i\FBQ&q*)dI*cSmt?Dp -s+UK+J:`(7dC-*V[`Ia4I=?hJs-*H^+GKgiIXAK`^lsA%TXs(OZJbHOaEMptdAE(bLOsu&I!>7+ -!."Qk#_8APh=.W*pAX[`J,~> -nc'*uY&A$fS([,kjPf%RgtV\Z*o#K*hV[;OjQGdofqt?Jcf8q`rI]1;o\>qhkht+CqpHG4eC<%# -f@em4gtprIiT0.al0R*$@pcL1lfI.)i/*tuiXm"ldU[-spg=kEGm%J%[Ec_9\ -F8p8uEbXn&iSWPOjQrUXCiTISKDtljF8krNCT?[Zg=4X.iT]X5i:cr_ASLMnhV-W5eGdkrd.P]b -dJhQ"e(ipGlEB+=rq$/?~> -nc'*uho]#2Vgs3UcF+Nj]Y_mm\#W0X3RR\maIZJbHOhn6A>ZCI5MT;/?cX0M?) -!3Z=%#cpAX[`J,~> -nG`s0KRr(&CnoqRi7ZN!`;7%e`5p$Ie_oNRn&(E2ER0%"p4S/"PD.Q^kH_PW^oNoer/_k_R[TnM -X1#UXaO/Poi9Kaf`2@ZsK6u$j_sQO`hui0-lL"Q=!7:PW0Z1`C`58R!cc#GDeW'"E`4EP$e]#+I -p4S/"s+UK+Jr+Q8mG6=Ch -nG`s&Ec9mW>*dk.l0.9jj8.^Uj5f:`kNV9ulb&!^@*`TTp2Y6SK6,B6kH:lNinrPgg)Jf%gtglF -iSihXk3(smm-NEPaL8PS[kPG'\%K5IB@"<`n(!$Vk2YFZjQF7g -C\Dgjs8R0?F)cJ7M!aEhkNM9I[WZS0s8R`Lru1cQF)p!si8!,DiU".jk4nkrCLN%ck2P=Uh#?"- -f_*hrg&B\2gYCcSah$R.rq$/?~> -nG`sVai<8[ZGFc']XP2KX88\8X0&M0[Cj8mbeq,t\'MnXp;tJWd)tbNkJ>0QW1K?Ar0SFgQ^=/4 -Sti0`Xg5@G]Yqq6`3HPV^qeC+b/_9q]E?$h`5hi#!m&F&qoCJ.aN28S!1EhR#aLaO`7) -nG`s0KnT*^H#n&*_;ObHkPF*YkN_@#n%cGuC:&,:II;^`rIot*PD0&7n\fXgjOM>dr44>qaN2WV -e_T0HlL+,e_53cF\As8ONIgDKEJV6G_84'kPc0=NC29cLDYe9*[;^)AF0C>achd@tO-f:ti8EnI -Y18(!Kn]R,L&Zj[NdPo(dI6POQFPP*K8'@*PPkG%rI]rTRd/SIaN`Q/HID9ZrmQFFEL#tQg!RmU -]"50>WrTU-\d-0pe`rLFm/$;QJ,~> -nG`s&F)pp:B45;E\(L'6lh]iGli-5ilaF$Q=L;R[C[Q0[@550XY4nI:9*ulcK"sk(JTXlfm[# -afa04qK$`Xs)\3]Edhb3Gf]4:aG@@XI;s?.s+C7L*rU))D2moGjQ,FdltXu;qu4iYBjZ\_lKIBk -io/kSp##`,#NOn.m"rsQqXXZ:~> -nG`sWb/s;>^::DQaNVcE_YUne_SjC7bf@E1YdD!X_X>J@rQ<:_d)uCdn^Fke^U:2Br2(sEXf\h8 -[CX#f`6$6HaKD;B\AuJ(b/Wba\%BGoaN2<-]2ss*t~> -nGa!1Kn]L#JUW9nEGTluXi^IV+/5QrTVZS?Fa;npNe@4^s8Re,s-*K_rqY&rDmSotjS[pakN_@" -n*eT=U6Kk;DK3VAL#_KZK9Co_NI5ug]5V`#^N@SAG^=\jh>)FPidH6JI`RTGec,I;SooCU`knis -e*;SaKn]R,L&Zj\Ob%q)EGi"#G2;SJKSBI+PPbA#qi6GYXPrI0mEp6&k4eiSeV&L#F*Y(Lmcrlk -i7[eR!8[Y4#NtC@V/kMdrUTu=~> -nGa!'F*%7+s8R.]s+C@OrqXo^?)[)UlMTlqlg4!* -lg)U#Q%ipS>[PFrG2qn;EIr6+I;3B3]3epV^LG;rB4tu5h.le%0]Hk`P\e3dq9T';o9*TuR(g). -?IS1ZrH!&[s)\3]F+J7FARJcI?Y&!\JTGo4s+C4K*W(;0CSoeOm-Vl.AENXbs3G_(Bjk_Rg$J(j -l07F)k5a`Fkm-P@l^2,=o_n@\J,~> -nGa!Xb0'\X`l#[7[^*9F[_DX[+2G%mV5:Q4]>!4AbK0S's8U6as3UfGrqYTi[)U>.^\k_n_SjC5 -bfn8O^qI(YZaRg!_rL(+aNr!'b/(d/]=,/Z^U_J!^;%G;h8/s)0]KsdcGSSaq<\+Xo?=eT_o9a+ -[F=E^rQ<:_s2tAab0J#D]XP8P[_(A`cH=<0s3UZC*W+$u\@0W"`5g*1]B8kds6[qJ^pphlbfRf< -]Y(`H[/df;]Ec -nGa!1Kn]R+KS, -nGa$(F*%B\EcHQoCM@D&_5:T=?N4@H@Dud*fkTYeDt\4'F8p=]s)W8]KDtm.rRuX4@Afp!\%KA_ -]Tn2+GFhuC?=@>UBPM>Jmsk*.JocQcrdf$,l/c\rjl^LJDf9T6p%J3$/GO4)SoN#-rm:]Eqj_J8 -A&2X"C$kY9s)W8]s)\3]F+\LPDJX(FCMre@K6.%l!/(1K*WCV=GK=BRM5O]lD"RZ*s3Ph-Deirn -AS?gq\%:5blO1bA\%S)`X(,o6qYp'cJ,~> -nGa$Yb0'b`aiMZk_SEk,_7@#R[K!ZL\Ac).ftlgi`qIO#b5]Was2rLad/O&&rU%_A\>Q[PaMYp: -`5'!u\Xp(4[CEf]^VRePn'(P&ccXVWrm&R(l/fe!jlaSL`l?'>p%J4&/GR<-fZ<@)rpBabqpr[! -]"tr&_!Um=s2rLas2tAab0\8N`P]OL_Su0Dd)u@f!7:WC*<+7,`5o:#^U1G^_t~> -nGa!1Kn]R,KnY]dK7\[@kg'*Ss*bXHJFW8`q1OG#Kp.5jL&_1,L&[A8s"<;nJUZ7pF)eXrE4U+4 -Fa)>]I!pHoJV&K+qYZNUs-&/#L&[?iK_kIrKD>7qqu26ML&V)IKc'iDKs$-\PQ056s8K*PJUcm5 -mXk<6L&Zl+rt'naKnY_EKS4u1pOe.trf`'8rrA8ZruI;cO6MFEGh%1lK)GWJs42mXKS+f(L3Ri] -E3X7rrbE.@C20K -nGa!'F*%B]F)us0EH#j_kfWg=s(iA6DXm@=q/UQUF+\Q6F8u8]F8pmks"E8\Df"(L@:-IN?b0ZT -A7a8(C27X'DfB]9qYZ!Fs+>BFF8pl6Er,QNEVT?Mqf;[Ws8Mh8)#nYuU3"\6s3UfGrh+7LD&9IkmF+\OTEcH*nEH;$WK6.%l!/(.J*J8oml$$cPeS8uAr;Q`rcuX8KEGoZ:An,7V -Z!1E2=V@H2=JDQn=^#$8?FjUifkbX(rpg#=~> -nGa!Xb0'bab0&',aN)s3Sp8b5]i2ankeRaS>SQqoSi[s8Mi:)#qb$grf$2s6]jdrn>H5`9>/- -a85bWs2t?@&Bb$qb0\;RaiMQtaN=D[d)u@f!7:TB*RN*Ul,: -nGa!1Kn]R,KnY`jKnP-Vq=so@(ANN7qLneFL&_1,s+QYjs+ULQKn]PjrVmSmPD"S[m='KDidKp; -It3+@JqAW-re1<*s8N^qs8S::PD0%#Kn]R,Kn]R,L&_+*s8VnK#lfU4Y(bGjs472L%'G;;K_^;u -K`;"*s+UIP"GQl0Kp2Fg#6'=1s8S::rr2t^qZ$SZ#a5"EJV!BDKS9=(!7q+&$&!qlJUi2ti8&bZ -HN2V.HJ$nsH@(!dIH>tHo7M_qnGe"~> -nGa!'F*%B]F*!!6F)uC!q=so.(AMlhqJuN4F8u8]s)Wg6s)\5?F*%A6rVmJfK5tu'm;6Y!ibRXl -D/O:_E;jkWErL.[rt9tas+>BFF8pl6F8u8]F8u8]s8@$=s7p^As)W7UF3oR>d/O%RU2t?qq/Z@R -rr7'>F8l1BF8p<&KD]cprcClrr@]Js8R]WK)'q8Dt7mgF8c+=d/A"lEcHVJDJX+Hh.ck% -s4@Eef\'s;BaAHhj_aGWEH;'Js*t~> -nGa!Xb0'bab0&*2b0%j'q=sp0(APtlqT8[6b5_Las2r^2s2tBAb0'b2rVmK$d)jB#mDQm%ikjfp -`5Taea8X0[ao9H_rt<]Ys3Sp8b5]i2b5_Lab5_Las8C+?s7seCs2rL>b3dRUmJd+ogrda\q8rNV -rr:.@b5VDDb5]W,d/;#jrlWC`s3SpfrrCFBs8UFOchYi*`q%3mb5M>?mJY06aiM`H`P]RNh8'$) -s4@Fgf\+%=^^.cnji$TYaN=GNs*t~> -nG`d+Kn]R,KnY`jre:@OrIl$eKn]P\s8RfQs+UK,PD0$js8Re,s-*E]%-3V+L&Ln$KD>4opk/R! -!<)\Hs8N^qs8S::PD0%#Kn]R,Kn]R,L&_+*s8VnK#lfU4Y(bGjs472L!3Z -nG`d!F*%B]F*!!6rcA)=rGrbSF*%A&s8R0?s)\3]K6.'6s8R.]s+C:M%,cbZF8buUEVT -"EXTaF+aC3"oiXbs8R`Mrr@]Js8IWRre#63rVgm:rrCFCEs@8;EcH*npAJt1oE'")p&8q0E -nG`dRb0'bab0&*2rlY6?rQ5oUb0'b,s8U7As2tAad)uC2s8U6as3U`E%.higb5M4YaS>POprNHV -!<)]8s8N_Ys8UHgd)uC8b0'bab0'bab5_F_s8Vo;#li&igrf$2s6]gc!8RRr#li'Ib5_Las2t?@ -"Npbeb0^(/"ol`fs8UIErrCFBs8L@Jrm8d/rVjt -nG`d+Kn]R,KnY`jre:@OrIl$eKn]P\s8RfQs+UK,PD0$js8Re,s-*E]$fmM*L&_1,L&_1,s8@WO -s7h -nG`d!F*%B]F*!!6rcA)=rGrbSF*%A&s8R0?s)\3]K6.'6s8R.]s+C:M$fHYYF8u8]F8u8]s8@!= -s7g[8rt9tas+>BFF8pl6F8u8]F8u8]s8@$=s7p^As)W7UF3oR>d/O%FUAf3>s)\3]s8R0?F8l1B -F8p<&s86pAs)W8]s+C:M!/(.Jrdt@RK6),6rcA& -nG`dRb0'bab0&*2rlY6?rQ5oUb0'b,s8U7As2tAad)uC2s8U6as3U`E$hM`fb5_Lab5_Las8C(? -s7jb:rt<]Ys3Sp8b5]i2b5_Lab5_Las8C+?s7seCs2rL>b3dRUmJd+ch#>G%s2tAas8U7Ab5VDD -b5]W,s8:"Cs2rLas3U`E!7:TBrm1fJd)sN2rlY3>!:B[+!7:\es8Mu>s8<#Arr2f;"olaFs2rLQ -s*t~> -nG`d+Kn]R,KnY`jre:@OrIl$eKn]P\s8RfQs+UK,PD0$js8Re,s-*E]$fmM*L&_1,L&_1,s8@WO -s7hL&_.+rVllKqh5$6rIt:OrIt:O!ep[Sqh54RL&_1,L%#%l~> -nG`d!F*%B]F*!!6rcA)=rGrbSF*%A&s8R0?s)\3]K6.'6s8R.]s+C:M$fHYYF8u8]F8u8]s8@!= -s7g[8rt9tas+>BFF8pl6F8u8]F8u8]s8@$=s7p^As)W7UF3oR>d/O%FUAf3 -nG`dRb0'bab0&*2rlY6?rQ5oUb0'b,s8U7As2tAad)uC2s8U6as3U`E$hM`fb5_Lab5_Las8C(? -s7jb:rt<]Ys3Sp8b5]i2b5_Lab5_Las8C+?s7seCs2rL>b3dRUmJd+ch#>G#s2tAas8U7>rrgLE -b0'b^ap%gfb5_LgrVllEqZ$QA"TQikb5_I`rVllbqoSocrQ>0?rQ>0?!m:QCqoT*Bb5_Lab4#@\~> -nG`O$L&V,PK`RD;re:@OrIl$eKn]P\s8RfQs+UK,PD0$js8Re,s-*E]$fmM*L&_1,L&_1,s8@WO -s7h -nG`NoF8l4>ErgpnrcA)=rGrbSF*%A&s8R0?s)\3]K6.'6s8R.]s+C:M$fHYYF8u8]F8u8]s8@!= -s7g[8rt9tas+>BFF8pl6F8u8]F8u8]s8@$=s7p^?s)W7UF3oR;rrAemEsDYcs)\5?F8Z%@F8p<& -s86pAs)W8]s+C:M!/(.Jrdt@RK6),6rcA&#leses)\5?F*$gM -J,~> -nG`OKb5VG@aoTlhrlY6?rQ5oUb0'b,s8U7As2tAad)uC2s8U6as3U`E$hM`fb5_Lab5_Las8C(? -s7jb:rt<]Ys3Sp8b5]i2b5_Lab5_Las8C+?s7seAs2rL>b3dRRrrCjRap.mgs2tBAb5D8Bb5]W, -s8:"Cs2rLas3U`E!7:TBrm1fJd)sN2rlY3>!:B[+!7:_frr;r>s8N/Cs8W)@#li&is2tBAb0'2Q -J,~> -nG`O$L&V,PK`RD;re:@OrIka]Kn]P\s8RfQs+UK,PD/u8s+LLRPPtLhjHG:Os8Re,s8RfQrIk7O -pkAbJ&sN@qPD,3Ss-&.js8Re,s8RfQrIt:Oq1T%QKnZ[`es$%3!3Z -nG`NoF8l4>ErgpnrcA)=rGrJKF*%A&s8R0?s)\3]K6."ks)S5@KDkfXi.H)ls8R.]s8R0?rGqu= -piHK8&qg5aK6)Zds+>B6s8R.]s8R0?rH&#=q/Zc?F*"'sd"D8r!2BI6#6/cEF8u8]r;QqAs)W8] -s8@!Bs)W8]s+C:M!/(.Jrdt@RK6),6rcA&#leses)\5?F*$gM -J,~> -nG`OKb5VG@aoTlhrlY6?rQ5WMb0'b,s8U7As2tAad)u=es2kBBd/EtPo?bY&s8U6as8U7ArQ5-? -pr`X:'%$[Yd)s_Xs3Sp2s8U6as8U7ArQ>0?q8rpAb0&M^mEke2!8RRr#62jGb5_Lar;QrCs2rLa -s8C(Ds2rLas3U`E!7:TBrm1fJd)sN2rlY3>!:B[+!7:_frr;r>s8N/Cs8W)@#li&is2tBAb0'2Q -J,~> -nG`O$L&V,PK`RD;re:@OrIka]Kn]P\s8RfQs+UK,PD/u8s+LLRPPkFfPD+_js+Q1,s+ULOK`M/J -L&_/cPQ1ZHKp.5js+Q1,s+Q1,s+ULOL&_2KKa.R2Ks$-\PPkF\Y5X+Zs+UK,s8RfNrrn,VKn]R, -rIkFTKn]R,PPtL]PPY:aPQ-jHPD+_jre:=N!7q%$!0dD9rr;qNs8N.Ss8W(P#lfU4s+ULQKn]!q -J,~> -nG`NoF8l4>ErgpnrcA)=rGrJKF*%A&s8R0?s)\3]K6."ks)S5@KDb`VK6),6s)W8]s)\5=Erc78 -F8u7QKE(t(F+\Q6s)W8]s)W8]s)\5=F8u:9EsDYcF/!a&KDb`LUAf3#leses)\5?F*$gM -J,~> -nG`OKb5VG@aoTlhrlY6?rQ5WMb0'b,s8U7As2tAad)u=es2kBBd/G#s2tAas8U7>rrpRFb0'ba -rQ5!:B[+!7:_frr;r>s8N/Cs8W)@#li&is2tBAb0'2Q -J,~> -nG`O$L&V,PK`RD;re:@OrIka]Kn]P\s8RfQs+UK,PD/u8s+LLRPPkFfPD+_js+Q1,s+ULOK`M/J -L&_/QPQ(R`Kp.5irs4>Ys+Q1,s+ULOL&V,KKa.R2Ks(I,PPkF\Y5X+Zs+UK,s8RfNrrn,VKn]R, -rIkFTKn]R,PPtL]PPY:cPQ-jHPD+_jKn]I)!7q%$!0dD9rr;qNs8N.Ss8W(P#QKL3s+ULQL$ntk~> -nG`NoF8l4>ErgpnrcA)=rGrJKF*%A&s8R0?s)\3]K6."ks)S5@KDb`VK6),6s)W8]s)\5=Erc78 -F8u7?KDtlPF+\Q5rs3]Gs)W8]s)\5=F8l49EsDYcF/&]]KDb`LUAf3#QJjds)\5?F70'Y~> -nG`OKb5VG@aoTlhrlY6?rQ5WMb0'b,s8U7As2tAad)u=es2kBBd/G#s2tAas8U7>rrpRFb0'ba -rQ5s8N/Cs8W)@#QMrhs2tBAb3o:[~> -nG`O$L&V,PK`RD;re:@OrIkLVKn]P\s8RfOrrRn -nG`NoF8l4>ErgpnrcA)=rGr5DF*%A&s8R0=rrR7oF8c.=Erl;nr;R+Vs)\5?F*%B]F8u2[!<;h8 -qu6_=K6-qis)\5?!-A/>s)\2>rGr,AF*%A&rr3#GKDb`QUAo:Us)\/=!-A)<%s.blF8u8]s)W8] -F*%B]KDkfMKDPTSKE$T(K6),6F*%9Z!7:Ua!/(8lrr;q#QJjds)\5?F70'Y~> -nG`OKb5VG@aoTlhrlY6?rQ5BFb0'b,s8U7?rrU?ib5MA?aoVOhr;R,Ns2tBAb0'bab5_F_!<;i: -qu6`?d)u7cs2tBA!6Y<@s2t?@rQ59Cb0'b,rr3#dd/s2t&'Fppb5_Las2rLa -b0'bad/EtEd/*bKd/VJmd)sN2b0'Y^!:B[+!7:_frr;r>s8N/Cs8W)@#QMrhs2tBAb3o:[~> -nG`O$L&V,PK`RD;re:@Os+LUUL&Zj\rVlkOrVlqQPD/u8s+LLRPPkFfPQ-@:s+Q1,s+ULOK`h@/ -s+UFOs+U@M!elhlqu?\Ms8N(Qrr<"Prr;qN"TO10s+UIP!S3J4rr]G(Kn]F(!/:@N%u(%;L&_1, -s+Q1,Kn]R,PPtL]PPY:bPQ-jHPD+_jL&:lMf)::(s+Q[9L&V,NL&_/SL&_2PKa7X3L&Zl,s+Tn@ -J,~> -nG`NoF8l4>ErgpnrcA)=s)S>CF8p<&rVlk=rVlq?K6."ks)S5@KDb`VKE$#ms)W8]s)\5=Es)G` -s)\/=s)\);!cs!8qu?\;s8N(?rr<">rr;q<"TNOas)\2>!RQJsrr]"qF*%6Y!-A)<%s.blF8u8] -s)W8]F*%B]KDkfMKDPTRKE$T(K6),6F8Pt;d/A"es)WhlF8l4EsM_dF8p=]s)[W. -J,~> -nG`OKb5VG@aoTlhrlY6?s2kKEb5]W,rVll?rVlrAd)u=es2kBBd/"TQWes2t?@!U\83rr_'Vb0'V]!6Y6>&'Fppb5_La -s2rLab0'bad/EtEd/*bJd/VJmd)sN2b5;2=mJY0/s2r^fb5VG>b5_JCb5_M@ap7shb5]Was2sd0 -J,~> -nG`O$L&V,PK`mV>L&Zl+s8RcUs+UK,L&M#OL&M#QKp.5hs8RcRs-*B\!gEY -nG`NoF8l4>Es.-qF8p=\s8R-Cs)\3]F8c+=F8c+?F+\Q4s8R-@s+C7L!e^Morr3CJs8R0?s)\3] -s)\3]rVun=qu6_=K6-qis)\5?!-A/>s)\2>rGr,AF*%A&rr3#GKDb`OUAo:Uqu6Y;r;R:Ks)W8] -s)\3]F8p<&s8R`Mrr@]Jrs48WKE$RFF8p=YrrCFEEruA_KDorks8@$=rrR9As8I'Es)W8]F8u8] -mf.e~> -nG`OKb5VG@aop)kb5]W`s8U4Es2tAab5M>?b5M>Ab0\<0s8U4Bs3U]D!mptirr3DLs8U7As2tAa -s2tAarVuo?qu6`?d)u7cs2tBA!6Y<@s2t?@rQ59Cb0'b,rr3#dd/qu6Z=r;R;Ms2rLa -s2tAab5]W,s8UIErrCFBrs7!Od/VJ8b5]W]rrDHbao_Ucd/M2es8C+?rrU@Cs8L.Gs2rLab5_La -mf.e~> -nG`O$L&V,PK`[J -nG`NoF8l4>Erq!oF8Z(%!2IKF8u8]s)\3] -s)\/=s)\);!cs!8qu?\;s8N(?rr<">rr;q<"TNOas)\2>!RQJsrr]"qF*%$S%s.blF8u8]s)W8] -F*%B]KDkfMKDPTRKE$T(K6),6F8Pt;d/A"es)WhlF8l4>EsDYcs8R0?s8I'Es)W8]F8u8]mf.e~> -nG`OKb5VG@ao]rib5D;>aoqaes2rL_rrC4?rrU?ib5MA?aoVOhr;QiFs2t?@%*JVMb5_Las2tAa -s2t"TQWes2t?@!U\83rr_'Vb0'DW&'Fppb5_Las2rLa -b0'bad/EtEd/*bJd/VJmd)sN2b5;2=mJY0/s2r^fb5VG@ap.mgs8U7As8L.Gs2rLab5_Lamf.e~> -nG`O$L&V,PK`[J -nG`NoF8l4>Erq!oF8Pt@F8p=]F*%<[!-A,=!cs!8rVun=!WRfMrrRiQF8l1JF8u8]s8R0?F8p=] -F8c.=F8Pt=F+\Q2s8R0?rr@->s8R0>s8@!As)W8]F8l1?d"D8r"/>g:F7oPDF8p<&s8R0?F*%A& -F8u8mrVlkMqYphRs+C?(F*%A&qu6ZCrGr&?F+aI5rr<">#6/cEs)\5?rcA,>"`s]bs8R0.s*t~> -nG`OKb5VG@ao]rib5;2Bb5]Wab0'\_!6Y9?!m8m4rVuo?!WUOErrURIb5VDLb5_Las8U7Ab5]Wa -b5MA?b5;2?b0\<.s8U7ArrC4@s8U7@s8C(Cs2rLab5VDAmEke2"5Nq!b4YcFb5]W,s8U7Ab0'b, -b5_LgrVllEqYpiJs3Uemb0'b,qu6Z`rQ53Ab0^.1rr<#@#62jGs2tBArlY9@"j6kfs8U70s*t~> -p]#dES,i?aJ,~> -p]#dES,i?aJ,~> -p]#dES,i?aJ,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -o`#!5WoMY0s5WDE!6>&<_uB_Wrr2u=p&G&loD\l4 -o`#!5WoMY0s5WDE!6>&<_uB_Wrr2u=p&G&loD\l4 -o`#!5WoMY0s5WDE!6>&<_uB_Wrr2u=p&G&loD\l4 -pAY0R -pAY0R -pAY0R -pAY:r3TL.>j6?REj)XYhs&K$t!TS4grrE,"q#C@okPkR_!<3#uWpfrl`rK->EWF/Rs8Q*krrE+[ -n,EEg!8%7$~> -pAY:r3TL.>j6?REj)XYhs&K$t!TS4grrE,"q#C@okPkR_!<3#uWpfrl`rK->EWF/Rs8Q*krrE+[ -n,EEg!8%7$~> -pAY:r3TL.>j6?REj)XYhs&K$t!TS4grrE,"q#C@okPkR_!<3#uWpfrl`rK->EWF/Rs8Q*krrE+[ -n,EEg!8%7$~> -pAY-nEr>qDEo[2[ElS0?WrN+! -*KF."q>WDSWrN+ZElV1?j&I*?j)R-[j8]."!36%u%rt[Ms8V+Zrr3MLs2S,[a8b1? -pAY-nEr>qDEo[2[ElS0?WrN+! -*KF."q>WDSWrN+ZElV1?j&I*?j)R-[j8]."!36%u%rt[Ms8V+Zrr3MLs2S,[a8b1? -pAY-nEr>qDEo[2[ElS0?WrN+! -*KF."q>WDSWrN+ZElV1?j&I*?j)R-[j8]."!36%u%rt[Ms8V+Zrr3MLs2S,[a8b1? -pAY+mrW";dWrE(!s/H(!!!$">ErT,[EiK*>3<6)Ws8Q*ts8Q(,s)K,[ -3E9&Z*E<*[qYrPUWrN+!!!#"ZW`:&[ -<<1(>!!#"Za8>lS<<*%!!$-+[s&C(>!6=+"3E6&Zs&C(>*HM)X&B@cN3E>,"*B?,#rr<$>*EE%; -!NH.u<>smt!$)%>*<<,>WW4&"!<;'Z3B8,[*B@+?WqQIC~> -pAY+mrW";dWrE(!s/H(!!!$">ErT,[EiK*>3<6)Ws8Q*ts8Q(,s)K,[ -3E9&Z*E<*[qYrPUWrN+!!!#"ZW`:&[ -<<1(>!!#"Za8>lS<<*%!!$-+[s&C(>!6=+"3E6&Zs&C(>*HM)X&B@cN3E>,"*B?,#rr<$>*EE%; -!NH.u<>smt!$)%>*<<,>WW4&"!<;'Z3B8,[*B@+?WqQIC~> -pAY+mrW";dWrE(!s/H(!!!$">ErT,[EiK*>3<6)Ws8Q*ts8Q(,s)K,[ -3E9&Z*E<*[qYrPUWrN+!!!#"ZW`:&[ -<<1(>!!#"Za8>lS<<*%!!$-+[s&C(>!6=+"3E6&Zs&C(>*HM)X&B@cN3E>,"*B?,#rr<$>*EE%; -!NH.u<>smt!$)%>*<<,>WW4&"!<;'Z3B8,[*B@+?WqQIC~> -p&?N%WiB&!irH+ZWW<&!NrQ*Z`rM,[!33%!WrF*[ErV."WW9(!*QS*Xs&K$ts&BI,EZL2? -s/H(Zs&E(qruqHCs8T)!+" -a8\/"EZP2[N]@*>qYq$*WrN*>*WP."WW6'!EcV*X!NH.u -<>"7k*TI-[rrB)!*EE->!<5&>rVlp>3QLdlJ,~> -p&?N%WiB&!irH+ZWW<&!NrQ*Z`rM,[!33%!WrF*[ErV."WW9(!*QS*Xs&K$ts&BI,EZL2? -s/H(Zs&E(qruqHCs8T)!+" -a8\/"EZP2[N]@*>qYq$*WrN*>*WP."WW6'!EcV*X!NH.u -<>"7k*TI-[rrB)!*EE->!<5&>rVlp>3QLdlJ,~> -p&?N%WiB&!irH+ZWW<&!NrQ*Z`rM,[!33%!WrF*[ErV."WW9(!*QS*Xs&K$ts&BI,EZL2? -s/H(Zs&E(qruqHCs8T)!+" -a8\/"EZP2[N]@*>qYq$*WrN*>*WP."WW6'!EcV*X!NH.u -<>"7k*TI-[rrB)!*EE->!<5&>rVlp>3QLdlJ,~> -nc':'WW9(!WW<&!WrK(!WW3$!a8`.>rVumt#QFe(s/H(!!;QTosts8Q(%WW3$!a8,`C!36)!UJq!;uls<=]$/WrE'>rrB)! -WW<&!Wr;r"j)P-"p&BO~> -nc':'WW9(!WW<&!WrK(!WW3$!a8`.>rVumt#QFe(s/H(!!;QTosts8Q(%WW3$!a8,`C!36)!UJq!;uls<=]$/WrE'>rrB)! -WW<&!Wr;r"j)P-"p&BO~> -nc':'WW9(!WW<&!WrK(!WW3$!a8`.>rVumt#QFe(s/H(!!;QTosts8Q(%WW3$!a8,`C!36)!UJq!;uls<=]$/WrE'>rrB)! -WW<&!Wr;r"j)P-"p&BO~> -p\u.P3<8([WrK(!rrB)!WW<"ts&B=(*EE,>3N<)Ss8Q(2s/L+>!<<'!WrH(!s8R*[j8Y." -iuO/[!<<'!Wr2l8EZP0[!07'ZWlG+>iuO/#*TQ0?*>s2S.9rsJh,s8R*[j/N+>!35kp!NH.t -s8Q(8rrB)!3E?)"ErV."ruG,>a)^4?s2P,>pA]X~> -p\u.P3<8([WrK(!rrB)!WW<"ts&B=(*EE,>3N<)Ss8Q(2s/L+>!<<'!WrH(!s8R*[j8Y." -iuO/[!<<'!Wr2l8EZP0[!07'ZWlG+>iuO/#*TQ0?*>s2S.9rsJh,s8R*[j/N+>!35kp!NH.t -s8Q(8rrB)!3E?)"ErV."ruG,>a)^4?s2P,>pA]X~> -p\u.P3<8([WrK(!rrB)!WW<"ts&B=(*EE,>3N<)Ss8Q(2s/L+>!<<'!WrH(!s8R*[j8Y." -iuO/[!<<'!Wr2l8EZP0[!07'ZWlG+>iuO/#*TQ0?*>s2S.9rsJh,s8R*[j/N+>!35kp!NH.t -s8Q(8rrB)!3E?)"ErV."ruG,>a)^4?s2P,>pA]X~> -p\t5nr;Zp?WrI,WW<)! -!35tss&BR/WW;)Z!!"&>iuS+!!`f8#rVupuqYpp'WrN+Z*<6([rrB(prrM-[rDa3bEcV0[ -WrH(!s,R$Xs/Q%u!EI2>!!+,#pA]X~> -p\t5nr;Zp?WrI,WW<)! -!35tss&BR/WW;)Z!!"&>iuS+!!`f8#rVupuqYpp'WrN+Z*<6([rrB(prrM-[rDa3bEcV0[ -WrH(!s,R$Xs/Q%u!EI2>!!+,#pA]X~> -p\t5nr;Zp?WrI,WW<)! -!35tss&BR/WW;)Z!!"&>iuS+!!`f8#rVupuqYpp'WrN+Z*<6([rrB(prrM-[rDa3bEcV0[ -WrH(!s,R$Xs/Q%u!EI2>!!+,#pA]X~> -pAY6TWiF,s8V->s8T+!j8Z+Z -WiG[j#KQlEa8c2"j8K#XWWV;]j5^(;s/H;'a8c1[WoO*Y!6>*=!6>*=!QV5>rr^=As2Y$:s5X.Z -#fluFWiH+!a/]+s2V/"a8c2" -WlP/>j/T-Os*t~> -pAY6TWiF,s8V->s8T+!j8Z+Z -WiG[j#KQlEa8c2"j8K#XWWV;]j5^(;s/H;'a8c1[WoO*Y!6>*=!6>*=!QV5>rr^=As2Y$:s5X.Z -#fluFWiH+!a/]+s2V/"a8c2" -WlP/>j/T-Os*t~> -pAY6TWiF,s8V->s8T+!j8Z+Z -WiG[j#KQlEa8c2"j8K#XWWV;]j5^(;s/H;'a8c1[WoO*Y!6>*=!6>*=!QV5>rr^=As2Y$:s5X.Z -#fluFWiH+!a/]+s2V/"a8c2" -WlP/>j/T-Os*t~> -l2LbaWmUhIWW7VMec1.~> -l2LbaWmUhIWW7VMec1.~> -l2LbaWmUhIWW7VMec1.~> -l2Lc)a3jnf`uTa2ec1.~> -l2Lc)a3jnf`uTa2ec1.~> -l2Lc)a3jnf`uTa2ec1.~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -JcCT,J,~> -%%EndData -showpage -%%Trailer -end -%%EOF diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/slime-small.pdf b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/slime-small.pdf deleted file mode 100644 index 4fd6557889e650edbbdf23ea97834b6c2cc16d16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7407 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, describe-key, ``What does this key do?''} -Describes current function bound to @kbd{} for focus buffer. - -@kbdanchorc{C-h b, describe-bindings, ``Exactly what bindings are available?''} -Lists the current key-bindings for the focus buffer. - -@kbdanchorc{C-h m, describe-mode, ``Tell me all about this mode''} -Shows all the available major mode keys, then the minor mode keys, for -the modes of the focus buffer. - -@kbdanchorc{C-h l, view-lossage, ``Woah@comma{} what key chord did I just do?''} -Shows you the literal sequence of keys you've pressed in order. - -@c is breaks links PDF, despite that it's not l it's C-h -@c @kbdanchorc{ l, , ``What starts with?''} -@c Lists all keybindings that begin with @code{} for the focus buffer mode. - - -@end table - -@emph{Note:} In this documentation the designation @kbd{C-h} is a -@dfn{canonical key} which might actually mean Ctrl-h, or F1, or -whatever you have @code{help-command} bound to in your -@code{.emacs}. Here is a common situation: - -@example -(global-set-key [f1] 'help-command) -(global-set-key "\C-h" 'delete-backward-char) -@end example - -@noindent In this situation everywhere you see @kbd{C-h} in the -documentation you would substitute @kbd{F1}. - -You can assign or change default key bindings globally using the -@code{global-set-key} function in your @file{~/.emacs} file like this: -@example -(global-set-key "\C-c s" 'slime-selector) -@end example -@noindent -which binds @kbd{C-c s} to the function @code{slime-selector}. - -Alternatively, if you want to assign or change a key binding in just a -particular slime mode, you can use the @code{define-key} function -in your @file{~/.emacs} file like this: -@example -(define-key slime-repl-mode-map (kbd "C-c ;") - 'slime-insert-balanced-comments) -@end example -@noindent -which binds @kbd{C-c ;} to the function -@code{slime-insert-balanced-comments} in the REPL buffer. - -@c ----------------------- -@node Evaluation -@section Evaluation commands - -These commands each evaluate a Common Lisp expression in a different -way. Usually they mimic commands for evaluating Emacs Lisp code. By -default they show their results in the echo area, but a prefix -argument causes the results to be inserted in the current buffer. - -@table @kbd - -@kbditem{C-x C-e, slime-eval-last-expression} - -Evaluate the expression before point and show the result in the echo -area. - -@kbditem{C-M-x, slime-eval-defun} -Evaluate the current toplevel form and show the result in the echo -area. `C-M-x' treats `defvar' expressions specially. Normally, -evaluating a `defvar' expression does nothing if the variable it -defines already has a value. But `C-M-x' unconditionally resets the -variable to the initial value specified in the `defvar' expression. -This special feature is convenient for debugging Lisp programs. - -@end table - -If @kbd{C-M-x} or @kbd{C-x C-e} is given a numeric argument, it -inserts the value into the current buffer, rather than displaying it -in the echo area. - -@table @kbd -@kbditem{C-c :, slime-interactive-eval} -Evaluate an expression read from the minibuffer. - -@kbditem{C-c C-r, slime-eval-region} -Evaluate the region. - -@kbditem{C-c C-p, slime-pprint-eval-last-expression} -Evaluate the expression before point and pretty-print the result in a -fresh buffer. - -@kbditem{C-c E, slime-edit-value} -Edit the value of a setf-able form in a new buffer @file{*Edit
*}. -The value is inserted into a temporary buffer for editing and then set -in Lisp when committed with @kbd{C-c C-c}. - -@kbditem{C-c C-u, slime-undefine-function} -Undefine the function, with @code{fmakunbound}, for the symbol at -point. - -@end table - -@c ----------------------- -@node Compilation -@section Compilation commands - -@cindex Compilation - -@SLIME{} has fancy commands for compiling functions, files, and -packages. The fancy part is that notes and warnings offered by the -Lisp compiler are intercepted and annotated directly onto the -corresponding expressions in the Lisp source buffer. (Give it a try to -see what this means.) - -@table @kbd -@cindex Compiling Functions -@kbditem{C-c C-c, slime-compile-defun} -Compile the top-level form at point. The region blinks shortly to -give some feedback which part was chosen. - -With (positive) prefix argument the form is compiled with maximal -debug settings (@kbd{C-u C-c C-c}). With negative prefix argument it is compiled for -speed (@kbd{M-- C-c C-c}). If a numeric argument is passed set debug or speed settings -to it depending on its sign. - -The code for the region is executed after compilation. In principle, -the command writes the region to a file, compiles that file, and loads -the resulting code. - -@kbditem{C-c C-k, slime-compile-and-load-file} -Compile and load the current buffer's source file. If the compilation -step fails, the file is not loaded. It's not always easy to tell -whether the compilation failed: occasionally you may end up in the -debugger during the load step. - -With (positive) prefix argument the file is compiled with maximal -debug settings (@kbd{C-u C-c C-k}). With negative prefix argument it is compiled for -speed (@kbd{M-- C-c C-k}). If a numeric argument is passed set debug or speed settings -to it depending on its sign. - -@kbditem{C-c M-k, slime-compile-file} -Compile (but don't load) the current buffer's source file. - -@kbditem{C-c C-l, slime-load-file} -Load a Lisp file. This command uses the Common Lisp LOAD function. - -@cmditem{slime-compile-region} -Compile the selected region. - -@end table - -The annotations are indicated as underlining on source forms. The -compiler message associated with an annotation can be read either by -placing the mouse over the text or with the selection commands below. - -@table @kbd -@kbditem{M-n, slime-next-note} -Move the point to the next compiler note and displays the note. - -@kbditem{M-p, slime-previous-note} -Move the point to the previous compiler note and displays the note. - -@kbditem{C-c M-c, slime-remove-notes} -Remove all annotations from the buffer. - -@kbditem{C-x `, next-error} -Visit the next-error message. This is not actually a @SLIME{} command -but @SLIME{} creates a hidden buffer so that most of the Compilation -mode commands (@inforef{Compilation Mode,, emacs}) work similarly for -Lisp as for batch compilers. - -@end table - -@node Completion -@section Completion commands - -@cindex Completion -@cindex Symbol Completion - -Completion commands are used to complete a symbol or form based on -what is already present at point. Classical completion assumes an -exact prefix and gives choices only where branches may occur. Fuzzy -completion tries harder. - -@table @kbd -@kbditem{M-TAB,slime-complete-symbol} -@c @itemx ESC TAB -@c @itemx C-M-i -Complete the symbol at point. Note that three styles of completion are -available in @SLIME{}; the default is similar to normal Emacs -completion (@pxref{slime-completion-at-point-functions}). - -@end table - -@c ----------------------- -@node Finding definitions -@section Finding definitions (``Meta-Point'' commands). - -@cindex Meta-dot -@cindex TAGS - -The familiar @kbd{M-.} command is provided. For generic functions this -command finds all methods, and with some systems it does other fancy -things (like tracing structure accessors to their @code{DEFSTRUCT} -definition). - -@table @kbd - -@kbditem{M-., slime-edit-definition} -Go to the definition of the symbol at point. - -@item M-, -@itemx M-* -@itemx M-x slime-pop-find-definition-stack -@kindex M-, -@findex slime-pop-find-definition-stack -Go back to the point where @kbd{M-.} was invoked. This gives multi-level -backtracking when @kbd{M-.} has been used several times. - -@kbditem{C-x 4 ., slime-edit-definition-other-window} -Like @code{slime-edit-definition} but switches to the other window to -edit the definition in. - -@kbditem{C-x 5 ., slime-edit-definition-other-frame} -Like @code{slime-edit-definition} but opens another frame to edit the -definition in. - -@cmditem{slime-edit-definition-with-etags} -Use an ETAGS table to find definition at point. - -@end table - -@c ----------------------- -@node Documentation -@section Documentation commands - -@SLIME{}'s online documentation commands follow the example of Emacs -Lisp. The commands all share the common prefix @kbd{C-c C-d} and allow -the final key to be modified or unmodified (@pxref{Key bindings}.) - -@table @kbd - -@kbditem{SPC, slime-space} -The space key inserts a space, but also looks up and displays the -argument list for the function at point, if there is one. - -@kbditem{C-c C-d d, slime-describe-symbol} -Describe the symbol at point. - -@kbditem{C-c C-d f, slime-describe-function} -Describe the function at point. - -@kbditem{C-c C-d A, slime-apropos} -Perform an apropos search on Lisp symbol names for a regular expression -match and display their documentation strings. By default the external -symbols of all packages are searched. With a prefix argument you can choose a -specific package and whether to include unexported symbols. - -@kbditem{C-c C-d z, slime-apropos-all} -Like @code{slime-apropos} but also includes internal symbols by default. - -@kbditem{C-c C-d p, slime-apropos-package} -Show apropos results of all symbols in a package. This command is for -browsing a package at a high-level. With package-name completion it -also serves as a rudimentary Smalltalk-ish image-browser. - -@kbditem{C-c C-d h, slime-hyperspec-lookup} -Lookup the symbol at point in the @cite{Common Lisp Hyperspec}. This -uses the familiar @file{hyperspec.el} to show the appropriate section -in a web browser. The Hyperspec is found either on the Web or in -@code{common-lisp-hyperspec-root}, and the browser is selected by -@code{browse-url-browser-function}. - -Note: this is one case where @kbd{C-c C-d h} is @emph{not} the same as -@kbd{C-c C-d C-h}. - -@kbditem{C-c C-d ~, hyperspec-lookup-format} -Lookup a @emph{format character} in the @cite{Common Lisp Hyperspec}. - -@kbditem{C-c C-d #, hyperspec-lookup-reader-macro} -Lookup a @emph{reader macro} in the @cite{Common Lisp Hyperspec}. -@end table - -@c ----------------------- -@node Cross-reference -@section Cross-reference commands - -@cindex xref -@cindex Cross-referencing - -@SLIME{}'s cross-reference commands are based on the support provided -by the Lisp system, which varies widely between Lisps. For systems -with no built-in @acronym{XREF} support @SLIME{} queries a portable -@acronym{XREF} package, which is taken from the @cite{CMU AI -Repository} and bundled with @SLIME{}. - -Each command operates on the symbol at point, or prompts if there is -none. With a prefix argument they always prompt. You can either enter -the key bindings as shown here or with the control modified on the -last key, @xref{Key bindings}. - -@menu -* Xref buffer commands:: -@end menu - -@table @kbd -@kbditem{C-c C-w c, slime-who-calls} -Show function callers. - -@kbditem{C-c C-w w, slime-calls-who} -Show all known callees. - -@kbditem{C-c C-w r, slime-who-references} -Show references to global variable. - -@kbditem{C-c C-w b, slime-who-binds} -Show bindings of a global variable. - -@kbditem{C-c C-w s, slime-who-sets} -Show assignments to a global variable. - -@kbditem{C-c C-w m, slime-who-macroexpands} -Show expansions of a macro. - -@cmditem{slime-who-specializes} -Show all known methods specialized on a class. - -@end table - -There are also ``List callers/callees'' commands. These operate by -rummaging through function objects on the heap at a low-level to -discover the call graph. They are only available with some Lisp -systems, and are most useful as a fallback when precise @acronym{XREF} -information is unavailable. - -@table @kbd -@kbditem{C-c <, slime-list-callers} -List callers of a function. - -@kbditem{C-c >, slime-list-callees} -List callees of a function. - -@end table - -@node Xref buffer commands -@subsection Xref buffer commands -Commands available in Xref buffers -@table @kbd - -@kbditem{RET, slime-show-xref} -Show definition at point in the other window. Do not leave Xref buffer. - -@kbditem{Space, slime-goto-xref} -Show definition at point in the other window and close Xref buffer. - -@kbditem{C-c C-c, slime-recompile-xref} -Recompile definition at point. - -@kbditem{C-c C-k, slime-recompile-all-xrefs} -Recompile all definitions. - -@end table - -@c ----------------------- -@node Macro-expansion -@section Macro-expansion commands - -@cindex Macros - -@table @kbd -@kbditem{C-c C-m, slime-expand-1} -Macroexpand (or compiler-macroexpand) the expression starting at point -once. If invoked with a prefix argument use macroexpand instead or -macroexpand-1 (or compiler-macroexpand instead of -compiler-macroexpand-1). - -@cmditem{slime-macroexpand-1} -Macroexpand the expression starting at point once. If invoked with a -prefix argument, use macroexpand instead of macroexpand-1. - -@kbditem{C-c M-m, slime-macroexpand-all} -Fully macroexpand the expression starting at point. - -@cmditem{slime-compiler-macroexpand-1} -Display the compiler-macro expansion of sexp starting at point. - -@cmditem{slime-compiler-macroexpand} -Repeatedy expand compiler macros of sexp starting at point. - -@end table - -For additional minor-mode commands and discussion, -@pxref{slime-macroexpansion-minor-mode}. - - -@c ----------------------- -@node Disassembly -@section Disassembly commands - -@table @kbd - -@kbditem{C-c M-d, slime-disassemble-symbol} -Disassemble the function definition of the symbol at point. - -@kbditem{C-c C-t, slime-toggle-trace-fdefinition} -Toggle tracing of the function at point. If invoked with a prefix -argument, read additional information, like which particular method -should be traced. - -@cmditem{slime-untrace-all} -Untrace all functions. - -@end table - -@c ----------------------- -@node Recovery -@section Abort/Recovery commands - -@table @kbd -@kbditem{C-c C-b, slime-interrupt} -Interrupt Lisp (send @code{SIGINT}). - -@cmditem{slime-restart-inferior-lisp} -Restart the @code{inferior-lisp} process. - -@kbditem{C-c ~, slime-sync-package-and-default-directory} -Synchronize the current package and working directory from Emacs to -Lisp. - -@kbditem{C-c M-p, slime-repl-set-package} -Set the current package of the @acronym{REPL}. - -@cmditem{slime-cd} -Set the current directory of the Lisp process. This also -changes the current directory of the REPL buffer. - -@cmditem{slime-pwd} -Print the current directory of the Lisp process. - -@end table - -@c ----------------------- -@node Inspector -@section Inspector commands - -The @SLIME{} inspector is a Emacs-based alternative to the -standard @code{INSPECT} function. The inspector presents objects in -Emacs buffers using a combination of plain text, hyperlinks to related -objects. - -The inspector can easily be specialized for the objects in your own -programs. For details see the @code{inspect-for-emacs} generic -function in @file{swank/backend.lisp}. - -@table @kbd - -@kbditem{C-c I, slime-inspect} -Inspect the value of an expression entered in the minibuffer. - -@end table - -The standard commands available in the inspector are: - -@table @kbd - -@kbditem{RET, slime-inspector-operate-on-point} -If point is on a value then recursively call the inspector on that -value. If point is on an action then call that action. - -@kbditem{d, slime-inspector-describe} -Describe the slot at point. - -@kbditem{e, slime-inspector-eval} -Evaluate an expression in the context of the inspected object. The -variable @code{*} will be bound to the inspected object. - -@kbditem{v, slime-inspector-toggle-verbose} -Toggle between verbose and terse mode. Default is determined by -`swank:*inspector-verbose*'. - -@kbditem{l, slime-inspector-pop} -Go back to the previous object (return from @kbd{RET}). - -@kbditem{n, slime-inspector-next} -The inverse of @kbd{l}. Also bound to @kbd{SPC}. - -@kbditem{g, slime-inspector-reinspect} -Reinspect. - -@kbditem{q, slime-inspector-quit} -Dismiss the inspector buffer. - -@kbditem{p, slime-inspector-pprint} -Pretty print in another buffer object at point. - -@kbditem{., slime-inspector-show-source} -Find source of object at point. - -@kbditem{>, slime-inspector-fetch-all} -Fetch all inspector contents and go to the end. - -@kbditem{M-RET, slime-inspector-copy-down} -Store the value under point in the variable `*'. This can -then be used to access the object in the REPL. - -@kbditempair{TAB, S-TAB, slime-inspector-next-inspectable-object, slime-inspector-previous-inspectable-object} - -Jump to the next and previous inspectable object respectively. - -@end table - -@c ----------------------- -@node Profiling -@section Profiling commands - -The profiling commands are based on CMUCL's profiler. These are -simple wrappers around functions which usually print something to the -output buffer. - -@table @kbd -@cmditem{slime-toggle-profile-fdefinition} -Toggle profiling of a function. -@cmditem{slime-profile-package} -Profile all functions in a package. -@cmditem{slime-profile-by-substring} -Profile all functions which names contain a substring. -@cmditem{slime-unprofile-all} -Unprofile all functions. -@cmditem{slime-profile-report} -Report profiler data. -@cmditem{slime-profile-reset} -Reset profiler data. -@cmditem{slime-profiled-functions} -Show list of currently profiled functions. -@end table - -@c ----------------------- -@node Other -@section Shadowed Commands - -@table @kbd - -@kbditempair{C-c C-a, C-c C-v, slime-nop, slime-nop} -This key-binding is shadowed from inf-lisp. - -@end table - -@c ----------------------- -@node Semantic indentation -@section Semantic indentation - -@SLIME{} automatically discovers how to indent the macros in your Lisp -system. To do this the Lisp side scans all the macros in the system and -reports to Emacs all the ones with @code{&body} arguments. Emacs then -indents these specially, putting the first arguments four spaces in and -the ``body'' arguments just two spaces, as usual. - -This should ``just work.'' If you are a lucky sort of person you needn't -read the rest of this section. - -To simplify the implementation, @SLIME{} doesn't distinguish between -macros with the same symbol-name but different packages. This makes it -fit nicely with Emacs's indentation code. However, if you do have -several macros with the same symbol-name then they will all be indented -the same way, arbitrarily using the style from one of their -arglists. You can find out which symbols are involved in collisions -with: - -@example -(swank:print-indentation-lossage) -@end example - -If a collision causes you irritation, don't have a nervous breakdown, -just override the Elisp symbol's @code{common-lisp-indent-function} -property to your taste. @SLIME{} won't override your custom settings, it -just tries to give you good defaults. - -A more subtle issue is that imperfect caching is used for the sake of -performance. @footnote{@emph{Of course} we made sure it was actually too -slow before making the ugly optimization.} - -In an ideal world, Lisp would automatically scan every symbol for -indentation changes after each command from Emacs. However, this is too -expensive to do every time. Instead Lisp usually just scans the symbols -whose home package matches the one used by the Emacs buffer where the -request comes from. That is sufficient to pick up the indentation of -most interactively-defined macros. To catch the rest we make a full scan -of every symbol each time a new Lisp package is created between commands --- that takes care of things like new systems being loaded. - -You can use @kbd{M-x slime-update-indentation} to force all symbols to -be scanned for indentation information. - -@c ----------------------- -@node Reader conditionals -@section Reader conditional fontification - -@SLIME{} automatically evaluates reader-conditional expressions, like -@code{#+linux}, in source buffers and ``grays out'' code that will be -skipped for the current Lisp connection. - -@c ----------------------- -@node Debugger -@chapter SLDB: the SLIME debugger - -@cindex Debugger - -@SLIME{} has a custom Emacs-based debugger called @SLDB{}. Conditions -signalled in the Lisp system invoke @SLDB{} in Emacs by way of the -Lisp @code{*DEBUGGER-HOOK*}. - -@SLDB{} pops up a buffer when a condition is signalled. The buffer -displays a description of the condition, a list of restarts, and a -backtrace. Commands are offered for invoking restarts, examining the -backtrace, and poking around in stack frames. - -@menu -* Examining frames:: -* Restarts:: -* Frame Navigation:: -* Stepping:: -* Miscellaneous:: -@end menu - -@c ----------------------- -@node Examining frames -@section Examining frames - -Commands for examining the stack frame at point. - -@table @kbd -@kbditem{t, sldb-toggle-details} -Toggle display of local variables and @code{CATCH} tags. - -@kbditem{v, sldb-show-source} -View the frame's current source expression. The expression is -presented in the Lisp source file's buffer. - -@kbditem{e, sldb-eval-in-frame} -Evaluate an expression in the frame. The expression can refer to the -available local variables in the frame. - -@kbditem{d, sldb-pprint-eval-in-frame} -Evaluate an expression in the frame and pretty-print the result in a -temporary buffer. - -@kbditem{D, sldb-disassemble} -Disassemble the frame's function. Includes information such as the -instruction pointer within the frame. - -@kbditem{i, sldb-inspect-in-frame} -Inspect the result of evaluating an expression in the frame. - -@kbditem{C-c C-c, sldb-recompile-frame-source} -Recompile frame. @kbd{C-u C-c C-c} for recompiling with maximum debug settings. - -@end table - -@c ----------------------- -@node Restarts -@section Invoking restarts - -@table @kbd -@kbditem{a, sldb-abort} -Invoke the @code{ABORT} restart. - -@anchor{sldb-quit} -@kbditem{q, sldb-quit} -``Quit'' -- For @SLIME{} evaluation requests, invoke a restart which -restores to a known program state. For errors in other threads, see -@ref{*SLDB-QUIT-RESTART*}. - -@kbditem{c, sldb-continue} -Invoke the @code{CONTINUE} restart. - -@item 0 ... 9 -Invoke a restart by number. -@end table - -Restarts can also be invoked by pressing @kbd{RET} or @kbd{Mouse-2} on -them in the buffer. - -@c ----------------------- -@node Frame Navigation -@section Navigating between frames - -@table @kbd -@kbditempair{n,p,sldb-down,sldb-up} -Move between frames. - -@kbditempair{M-n, M-p, sldb-details-down, sldb-details-up} -Move between frames ``with sugar'': hide the details of the original -frame and display the details and source code of the next. Sugared -motion makes you see the details and source code for the current frame -only. - -@kbditem{>, sldb-end-of-backtrace} -Fetch the entire backtrace and go to the last frame. - -@kbditem{<, sldb-beginning-of-backtrace} -Goto the first frame. - -@end table - -@node Stepping -@section Stepping - -@cindex Stepping - -Stepping is not available in all implementations and works very -differently in those in which it is available. - -@table @kbd -@kbditem{s, sldb-step} -Step to the next expression in the frame. For CMUCL that means, set a -breakpoint at all those code locations in the current code block which -are reachable from the current code location. - -@kbditem{x, sldb-next} -Step to the next form in the current function. - -@kbditem{o, sldb-out} -Stop single-stepping temporarily, but resume it once the current -function returns. - -@end table - -@node Miscellaneous -@section Miscellaneous Commands - -@table @kbd -@kbditem{r, sldb-restart-frame} -Restart execution of the frame with the same arguments it was -originally called with. (This command is not available in all -implementations.) - -@kbditem{R, sldb-return-from-frame} -Return from the frame with a value entered in the minibuffer. (This -command is not available in all implementations.) - - -@kbditem{B, sldb-break-with-default-debugger} -Exit @SLDB{} and debug the condition using the Lisp system's default -debugger. - -@kbditem{C, sldb-inspect-condition} -Inspect the condition currently being debugged. - -@kbditem{:, slime-interactive-eval} -Evaluate an expression entered in the minibuffer. -@kbditem{A, sldb-break-with-system-debugger} -Attach debugger (e.g. gdb) to the current lisp process. - -@end table - - -@c ----------------------- -@node Misc -@chapter Misc - -@menu -* slime-selector:: -* slime-macroexpansion-minor-mode:: -* Multiple connections:: -@end menu - -@c ----------------------- -@node slime-selector -@section @code{slime-selector} - -The @code{slime-selector} command is for quickly switching to -important buffers: the @REPL{}, @SLDB{}, the Lisp source you were just -hacking, etc. Once invoked the command prompts for a single letter to -specify which buffer it should display. Here are some of the options: - -@table @kbd -@item ? -A help buffer listing all @code{slime-selectors}'s available buffers. -@item r -The @REPL{} buffer for the current @SLIME{} connection. -@item d -The most recently activated @SLDB{} buffer for the current connection. -@item l -The most recently visited @code{lisp-mode} source buffer. -@item s -The @code{*slime-scratch*} buffer (@pxref{slime-scratch}). -@item c -SLIME connections buffer (@pxref{Multiple connections}). -@item n -Cycle to the next Lisp connection (@pxref{Multiple connections}). -@item t -SLIME threads buffer (@pxref{Multiple connections}). -@end table - -@code{slime-selector} doesn't have a key binding by default but we -suggest that you assign it a global one. You can bind it to @kbd{C-c s} -like this: - -@example -(global-set-key "\C-cs" 'slime-selector) -@end example - -@noindent -And then you can switch to the @REPL{} from anywhere with @kbd{C-c s -r}. - -The macro @code{def-slime-selector-method} can be used to define new -buffers for @code{slime-selector} to find. - -@c ----------------------- -@node slime-macroexpansion-minor-mode -@section slime-macroexpansion-minor-mode - -Within a slime macroexpansion buffer some extra commands are provided -(these commands are always available but are only bound to keys in a -macroexpansion buffer). - -@table @kbd -@kbditem{C-c C-m, slime-macroexpand-1-inplace} -Just like slime-macroexpand-1 but the original form is replaced with -the expansion. - -@c @anchor{slime-macroexpand-1-inplace} -@kbditem{g, slime-macroexpand-1-inplace} -The last macroexpansion is performed again, the current contents of -the macroexpansion buffer are replaced with the new expansion. - -@kbditem{q, slime-temp-buffer-quit} -Close the expansion buffer. - -@kbditem{C-_, slime-macroexpand-undo} -Undo last macroexpansion operation. - -@end table - -@c ----------------------- -@node Multiple connections -@section Multiple connections - -@SLIME{} is able to connect to multiple Lisp processes at the same -time. The @kbd{M-x slime} command, when invoked with a prefix -argument, will offer to create an additional Lisp process if one is -already running. This is often convenient, but it requires some -understanding to make sure that your @SLIME{} commands execute in the -Lisp that you expect them to. - -Some buffers are tied to specific Lisp processes. Each Lisp connection -has its own @acronym{REPL} buffer, and all expressions entered or -@SLIME{} commands invoked in that buffer are sent to the associated -connection. Other buffers created by @SLIME{} are similarly tied to -the connections they originate from, including @SLDB{} buffers, -apropos result listings, and so on. These buffers are the result of -some interaction with a Lisp process, so commands in them always go -back to that same process. - -Commands executed in other places, such as @code{slime-mode} source -buffers, always use the ``default'' connection. Usually this is the -most recently established connection, but this can be reassigned via -the ``connection list'' buffer: - -@table @kbd -@kbditem{C-c C-x c, slime-list-connections} -Pop up a buffer listing the established connections. It is also -available by the typing @kbd{c} from the @SLIME{} selector -(@ref{slime-selector}). - -@kbditem{C-c C-x n, slime-cycle-connections} -Change current Lisp connection by cycling through all connections. It -is also available by the typing @kbd{n} from the SLIME selector -(@ref{slime-selector}). - -@kbditem{C-c C-x t, slime-list-threads} -Pop up a buffer listing the current threads. It is also available by -the typing @kbd{t} from the @SLIME{} selector (@ref{slime-selector}). -@end table - -The buffer displayed by @code{slime-list-connections} gives a one-line -summary of each connection. The summary shows the connection's serial -number, the name of the Lisp implementation, and other details of the -Lisp process. The current ``default'' connection is indicated with an -asterisk. - -The commands available in the connection-list buffer are: - -@table @kbd -@kbditem{RET, slime-goto-connection} -Pop to the @acronym{REPL} buffer of the connection at point. - -@kbditem{d, slime-connection-list-make-default} -Make the connection at point the ``default'' connection. It will then -be used for commands in @code{slime-mode} source buffers. - -@kbditem{g, slime-update-connection-list} -Update the connection list in the buffer. - -@kbditem{q, slime-temp-buffer-quit} -Quit the connection list (kill buffer, restore window configuration). - -@kbditem{R, slime-restart-connection-at-point} -Restart the Lisp process for the connection at point. - -@cmditem{slime-connect} -Connect to a running Swank server. - -@cmditem{slime-disconnect} -Disconnect all connections. - -@cmditem{slime-abort-connection} -Abort the current attempt to connect. - -@end table - - -@c ----------------------- -@node Customization -@chapter Customization - -@menu -* Emacs-side customization:: -* Lisp-side:: -@end menu - -@c ----------------------- -@node Emacs-side customization -@section Emacs-side - -The Emacs part of @SLIME{} can be configured with the Emacs -@code{customize} system, just use @kbd{M-x customize-group slime -RET}. Because the customize system is self-describing, we only cover a -few important or obscure configuration options here in the manual. - -@table @code - -@item slime-truncate-lines -The value to use for @code{truncate-lines} in line-by-line summary -buffers popped up by @SLIME{}. This is @code{t} by default, which -ensures that lines do not wrap in backtraces, apropos listings, and so -on. It can however cause information to spill off the screen. - -@anchor{slime-completion-at-point-functions} -@vindex slime-completion-at-point-functions -@item slime-completion-at-point-functions -A list of functions used for completion of Lisp symbols. This works -as the standard -@code{completion-at-point-functions} -(@pxref{Completion in Buffers,,,elisp}). Three completion -styles are available: @code{slime-simple-completion-at-point}, -@code{slime-complete-symbol*} (@pxref{Compound Completion}), -and @code{slime-fuzzy-complete-symbol} (@pxref{Fuzzy Completion}). - -The default is @code{slime-simple-completion-at-point}, which -completes in the usual Emacs way. - -@vindex slime-filename-translations -@item slime-filename-translations -This variable controls filename translation between Emacs and the Lisp -system. It is useful if you run Emacs and Lisp on separate machines -which don't share a common file system or if they share the filesystem -but have different layouts, as is the case with @acronym{SMB}-based -file sharing. - -@anchor{slime-net-coding-system} -@vindex slime-net-coding-system -@cindex Unicode -@cindex UTF-8 -@cindex ASCII -@cindex LATIN-1 -@cindex Character Encoding -@item slime-net-coding-system -If you want to transmit Unicode characters between Emacs and the Lisp -system, you should customize this variable. E.g., if you use SBCL, you -can set: -@example -(setq slime-net-coding-system 'utf-8-unix) -@end example -To actually display Unicode characters you also need appropriate -fonts, otherwise the characters will be rendered as hollow boxes. If -you are using Allegro CL and GNU Emacs, you can also -use @code{emacs-mule-unix} as coding system. GNU Emacs has often -nicer fonts for the latter encoding. (Different encodings can be used -for different Lisps, see @ref{Multiple Lisps}.) - -@end table - -@menu -* Hooks:: -@end menu - -@c ----------------------- -@node Hooks -@subsection Hooks - -@table @code - -@vindex slime-mode-hook -@item slime-mode-hook -This hook is run each time a buffer enters @code{slime-mode}. It is -most useful for setting buffer-local configuration in your Lisp source -buffers. An example use is to enable @code{slime-autodoc-mode} -(@pxref{slime-autodoc-mode}). - -@anchor{slime-connected-hook} -@vindex slime-connected-hook -@item slime-connected-hook -This hook is run when @SLIME{} establishes a connection to a Lisp -server. An example use is to create a Typeout frame (@xref{Typeout frames}.) - -@vindex sldb-hook -@item sldb-hook -This hook is run after @SLDB{} is invoked. The hook functions are -called from the @SLDB{} buffer after it is initialized. An example use -is to add @code{sldb-print-condition} to this hook, which makes all -conditions debugged with @SLDB{} be recorded in the @REPL{} buffer. - -@end table - -@c ----------------------- -@node Lisp-side -@section Lisp-side (Swank) - -The Lisp server side of @SLIME{} (known as ``Swank'') offers several -variables to configure. The initialization file @file{~/.swank.lisp} -is automatically evaluated at startup and can be used to set these -variables. - -@menu -* Communication style:: -* Other configurables:: -@end menu - -@c ----------------------- -@node Communication style -@subsection Communication style -@vindex SWANK:*COMMUNICATION-STYLE* - -The most important configurable is @code{SWANK:*COMMUNICATION-STYLE*}, -which specifies the mechanism by which Lisp reads and processes -protocol messages from Emacs. The choice of communication style has a -global influence on @SLIME{}'s operation. - -The available communication styles are: - -@table @code -@item NIL -This style simply loops reading input from the communication socket -and serves @SLIME{} protocol events as they arise. The simplicity -means that the Lisp cannot do any other processing while under -@SLIME{}'s control. - -@item :FD-HANDLER -This style uses the classical Unix-style ``@code{select()}-loop.'' -Swank registers the communication socket with an event-dispatching -framework (such as @code{SERVE-EVENT} in @acronym{CMUCL} and -@acronym{SBCL}) and receives a callback when data is available. In -this style requests from Emacs are only detected and processed when -Lisp enters the event-loop. This style is simple and predictable. - -@item :SIGIO -This style uses @dfn{signal-driven I/O} with a @code{SIGIO} signal -handler. Lisp receives requests from Emacs along with a signal, -causing it to interrupt whatever it is doing to serve the -request. This style has the advantage of responsiveness, since Emacs -can perform operations in Lisp even while it is busy doing other -things. It also allows Emacs to issue requests concurrently, e.g. to -send one long-running request (like compilation) and then interrupt -that with several short requests before it completes. The -disadvantages are that it may conflict with other uses of @code{SIGIO} -by Lisp code, and it may cause untold havoc by interrupting Lisp at an -awkward moment. - -@item :SPAWN -This style uses multiprocessing support in the Lisp system to execute -each request in a separate thread. This style has similar properties -to @code{:SIGIO}, but it does not use signals and all requests issued -by Emacs can be executed in parallel. - -@end table - -The default request handling style is chosen according to the -capabilities of your Lisp system. The general order of preference is -@code{:SPAWN}, then @code{:SIGIO}, then @code{:FD-HANDLER}, with -@code{NIL} as a last resort. You can check the default style by -calling @code{SWANK-BACKEND::PREFERRED-COMMUNICATION-STYLE}. You can -also override the default by setting -@code{SWANK:*COMMUNICATION-STYLE*} in your Swank init file. - -@c ----------------------- -@node Other configurables -@subsection Other configurables - -These Lisp variables can be configured via your @file{~/.swank.lisp} -file: - -@table @code - -@vindex SWANK:*CONFIGURE-EMACS-INDENTATION* -@item SWANK:*CONFIGURE-EMACS-INDENTATION* -This variable controls whether indentation styles for -@code{&body}-arguments in macros are discovered and sent to Emacs. It -is enabled by default. - -@vindex SWANK:*GLOBALLY-REDIRECT-IO* -@item SWANK:*GLOBALLY-REDIRECT-IO* -When T this causes the standard streams (@code{*standard-output*}, -etc) to be globally redirected to the @REPL{} in Emacs. - -When @code{:STARTED-FROM-EMACS} (default) redirects the output when -the lisp is launched from emacs (i.e. @kbd{M-x slime}), but not -from @kbd{M-x slime-connect}. - -When @code{NIL} these streams are only temporarily redirected -to Emacs using dynamic bindings while handling requests. Note that -@code{*standard-input*} is currently never globally redirected into -Emacs, because it can interact badly with the Lisp's native @REPL{} by -having it try to read from the Emacs one. - -@vindex SWANK:*GLOBAL-DEBUGGER* -@item SWANK:*GLOBAL-DEBUGGER* -When true (the default) this causes @code{*DEBUGGER-HOOK*} to be -globally set to @code{SWANK:SWANK-DEBUGGER-HOOK} and thus for @SLIME{} -to handle all debugging in the Lisp image. This is for debugging -multithreaded and callback-driven applications. - -@anchor{*SLDB-QUIT-RESTART*} -@vindex SWANK:*SLDB-QUIT-RESTART* -@item SWANK:*SLDB-QUIT-RESTART* -This variable names the restart that is invoked when pressing @kbd{q} -(@pxref{sldb-quit}) in @SLDB{}. For @SLIME{} evaluation requests this -is @emph{unconditionally} bound to a restart that returns to a safe -point. This variable is supposed to customize what @kbd{q} does if an -application's thread lands into the debugger (see -@code{SWANK:*GLOBAL-DEBUGGER*}). -@example -(setf swank:*sldb-quit-restart* 'sb-thread:terminate-thread) -@end example - -@vindex SWANK:*BACKTRACE-PRINTER-BINDINGS* -@vindex SWANK:*MACROEXPAND-PRINTER-BINDINGS* -@vindex SWANK:*SLDB-PRINTER-BINDINGS* -@vindex SWANK:*SWANK-PPRINT-BINDINGS* -@item SWANK:*BACKTRACE-PRINTER-BINDINGS* -@itemx SWANK:*MACROEXPAND-PRINTER-BINDINGS* -@itemx SWANK:*SLDB-PRINTER-BINDINGS* -@itemx SWANK:*SWANK-PPRINT-BINDINGS* -These variables can be used to customize the printer in various -situations. The values of the variables are association lists of -printer variable names with the corresponding value. E.g., to enable -the pretty printer for formatting backtraces in @SLDB{}, you can use: -@example -(push '(*print-pretty* . t) swank:*sldb-printer-bindings*). -@end example - -@vindex SWANK:*USE-DEDICATED-OUTPUT-STREAM* -@item SWANK:*USE-DEDICATED-OUTPUT-STREAM* -This variable controls whether to use an unsafe efficiency hack for -sending printed output from Lisp to Emacs. The default is @code{nil}, -don't use it, and is strongly recommended to keep. - -When @code{t}, a separate socket is established solely for Lisp to send -printed output to Emacs through, which is faster than sending the output -in protocol-messages to Emacs. However, as nothing can be guaranteed -about the timing between the dedicated output stream and the stream of -protocol messages, the output of a Lisp command can arrive before or -after the corresponding REPL results. Thus output and REPL results can -end up in the wrong order, or even interleaved, in the REPL buffer. -Using a dedicated output stream also makes it more difficult to -communicate to a Lisp running on a remote host via SSH -(@pxref{Connecting to a remote lisp}). - -@vindex SWANK:*DEDICATED-OUTPUT-STREAM-PORT* -@item SWANK:*DEDICATED-OUTPUT-STREAM-PORT* -When @code{*USE-DEDICATED-OUTPUT-STREAM*} is @code{t} the stream will -be opened on this port. The default value, @code{0}, means that the -stream will be opened on some random port. - -@vindex SWANK:*LOG-EVENTS* -@item SWANK:*LOG-EVENTS* -Setting this variable to @code{t} causes all protocol messages -exchanged with Emacs to be printed to @code{*TERMINAL-IO*}. This is -useful for low-level debugging and for observing how @SLIME{} works -``on the wire.'' The output of @code{*TERMINAL-IO*} can be found in -your Lisp system's own listener, usually in the buffer -@code{*inferior-lisp*}. - -@end table - -@c ----------------------- -@node Tips and Tricks -@chapter Tips and Tricks - -@menu -* Connecting to a remote lisp:: -* Global IO Redirection:: -* Auto-SLIME:: -@end menu - -@c ----------------------- -@node Connecting to a remote lisp -@section Connecting to a remote lisp - -One of the advantages of the way @SLIME{} is implemented is that we can -easily run the Emacs side (slime.el) on one machine and the lisp backend -(swank) on another. The basic idea is to start up lisp on the remote -machine, load swank and wait for incoming @SLIME{} connections. On the -local machine we start up emacs and tell @SLIME{} to connect to the -remote machine. The details are a bit messier but the underlying idea is -that simple. - -@menu -* Setting up the lisp image:: -* Setting up Emacs:: -* Setting up pathname translations:: -@end menu - -@c ----------------------- -@node Setting up the lisp image -@subsection Setting up the lisp image - -When you want to load swank without going through the normal, Emacs -based, process just load the @file{swank-loader.lisp} file. Just -execute - -@example -(load "/path/to/swank-loader.lisp") -(swank-loader:init) -@end example - -inside a running lisp image@footnote{@SLIME{} also provides an -@acronym{ASDF} system definition which does the same thing}. Now all we -need to do is startup our swank server. The first example assumes we're -using the default settings. - -@example -(swank:create-server) -@end example - -Since we're going to be tunneling our connection via ssh@footnote{there -is a way to connect without an ssh tunnel, but it has the side-effect of -giving the entire world access to your lisp image, so we're not going to -talk about it} and we'll only have one port open we want to tell swank -to not use an extra connection for output (this is actually the default -in current @SLIME{}): - -@example -(setf swank:*use-dedicated-output-stream* nil) -@end example - -@c ----------------------- -If you need to do anything particular -(like be able to reconnect to swank after you're done), look into -@code{swank:create-server}'s other arguments. Some of these arguments -are -@table @code - -@item :PORT -Port number for the server to listen on (default: 4005). -@item :STYLE -See @xref{Communication style}. -@item :DONT-CLOSE -Boolean indicating if the server will continue to accept connections -after the first one (default: @code{NIL}). For ``long-running'' lisp processes -to which you want to be able to connect from time to time, -specify @code{:dont-close t} -@item :CODING-SYSTEM -String designating the encoding to be used to communicate between the -Emacs and Lisp. -@end table - -So the more complete example will be -@example -(swank:create-server :port 4005 :dont-close t :coding-system "utf-8-unix") -@end example -On the emacs side you will use something like -@example -(setq slime-net-coding-system 'utf-8-unix) -(slime-connect "localhost" 4005)) -@end example -to connect to this lisp image from the same machine. - - -@node Setting up Emacs -@subsection Setting up Emacs - -Now we need to create the tunnel between the local machine and the -remote machine. - -@example -ssh -L4005:localhost:4005 username@@remote.example.com -@end example - -That ssh invocation creates an ssh tunnel between the port 4005 on our -local machine and the port 4005 on the remote machine@footnote{By -default swank listens for incoming connections on port 4005, had we -passed a @code{:port} parameter to @code{swank:create-server} we'd be -using that port number instead}. - -Finally we can start @SLIME{}: - -@example -M-x slime-connect RET RET -@end example - -The @kbd{RET RET} sequence just means that we want to use the default -host (@code{localhost}) and the default port (@code{4005}). Even -though we're connecting to a remote machine the ssh tunnel fools Emacs -into thinking it's actually @code{localhost}. - -@c ----------------------- -@node Setting up pathname translations -@subsection Setting up pathname translations - -One of the main problems with running swank remotely is that Emacs -assumes the files can be found using normal filenames. if we want -things like @code{slime-compile-and-load-file} (@kbd{C-c C-k}) and -@code{slime-edit-definition} (@kbd{M-.}) to work correctly we need to -find a way to let our local Emacs refer to remote files. - -There are, mainly, two ways to do this. The first is to mount, using -NFS or similar, the remote machine's hard disk on the local machine's -file system in such a fashion that a filename like -@file{/opt/project/source.lisp} refers to the same file on both -machines. Unfortunately NFS is usually slow, often buggy, and not -always feasible, fortunately we have an ssh connection and Emacs' -@code{tramp-mode} can do the rest. -(See @inforef{Top, TRAMP User Manual,tramp}.) - -What we do is teach Emacs how to take a filename on the remote machine -and translate it into something that tramp can understand and access -(and vice versa). Assuming the remote machine's host name is -@code{remote.example.com}, @code{cl:machine-instance} returns -``remote'' and we login as the user ``user'' we can use @code{slime-tramp} -contrib to setup the proper translations by simply doing: - -@example -(add-to-list 'slime-filename-translations - (slime-create-filename-translator - :machine-instance "remote" - :remote-host "remote.example.com" - :username "user")) -@end example - -@c ----------------------- -@node Global IO Redirection -@section Globally redirecting all IO to the REPL - -When connecting via @kbd{M-x slime-connect} @SLIME{} does -not change @code{*standard-output*} and friends outside of the -@REPL{}. If you have any other threads which call @code{format}, -@code{write-string}, etc. that output will be seen only in -the @code{*inferior-lisp*} buffer or on the terminal, more often than -not this is inconvenient. So, if you want code such as this: - -@example -(run-in-new-thread - (lambda () - (write-line "In some random thread.~%" *standard-output*))) -@end example - -to send its output to @SLIME{}'s repl buffer, as opposed to -@code{*inferior-lisp*}, set @code{swank:*globally-redirect-io*} to T -in @file{~/.swank.lisp} - -But when started using @kbd{M-x slime} the streams are redirected by -default. - -@c ----------------------- -@node Auto-SLIME -@section Connecting to SLIME automatically - -To make @SLIME{} connect to your lisp whenever you open a lisp file -just add this to your @file{.emacs}: - -@example -(add-hook 'slime-mode-hook - (lambda () - (unless (slime-connected-p) - (save-excursion (slime))))) -@end example - -@node Contributed Packages -@chapter Contributed Packages - -In version 2.1 we moved some functionality to separate packages. This -chapter tells you how to load contrib modules and describes what the -particular packages do. - -@menu -* Loading Contribs:: -* REPL:: -* slime-mrepl:: -* inferior-slime-mode:: -* Compound Completion:: -* Fuzzy Completion:: -* slime-autodoc-mode:: -* ASDF:: -* Banner:: -* Editing Commands:: -* Fancy Inspector:: -* Presentations:: -* Typeout frames:: -* TRAMP:: -* Documentation Links:: -* Xref and Class Browser:: -* Highlight Edits:: -* Scratch Buffer:: -* SLIME Trace Dialog:: -* slime-sprof:: -* SLIME Enhanced M-.:: -* slime-fancy:: -* Quicklisp:: -@end menu - -@node Loading Contribs -@section Loading Contrib Packages - -@cindex Contribs -@cindex Contributions -@cindex Plugins - -Contrib packages aren't loaded by default. You have to modify your -setup a bit so that Emacs knows where to find them and which of them -to load. Generally, you set the variable @code{slime-contribs} with -the list of package-names that you want to use. For example, a setup -to load the @code{slime-scratch} and @code{slime-editing-commands} -packages looks like: - -@example -;; @emph{Setup load-path and autoloads} -(add-to-list 'load-path "~/dir/to/cloned/slime") -(require 'slime-autoloads) - -;; @emph{Set your lisp system and some contribs} -(setq inferior-lisp-program "/opt/sbcl/bin/sbcl") -(setq slime-contribs '(slime-scratch slime-editing-commands)) -@end example - -After starting @SLIME{}, the commands of both packages should be -available. - -The REPL and @code{slime-fancy} modules deserve special mention. Many -users consider the REPL (@pxref{REPL}) essential -while @code{slime-fancy} (@pxref{slime-fancy}) loads the REPL and -almost all of the popular contribs. So, if you aren't sure what to -choose start with: - -@example -(setq slime-contribs '(slime-repl)) ; repl only -@end example - -If you like what you see try this: - -@example -(setq slime-contribs '(slime-fancy)) ; almost everything -@end example - -@subsection Loading and unloading ``on the fly'' - -We recommend that you setup contribs @emph{before} starting @SLIME{} via -@kbd{M-x slime}, but if you want to enable more contribs @emph{after} -you do that, you can set the @code{slime-contribs} variable to another -value and call @code{M-x slime-setup}. Note this though: - -@itemize @bullet -@item -If you've removed contribs from the list they won't be unloaded -automatically. -@item -If you have more than one @SLIME{} connection currently active, you must -manually repeat the @code{slime-setup} step for each of them. -@end itemize - -Short of restarting Emacs, a reasonable way of unloading contribs is -by calling an Emacs Lisp function whose name is obtained by -adding @code{-unload} to the contrib's name, for every contrib you -wish to unload. So, to remove @code{slime-repl}, you must call -@code{slime-repl-unload}. Because the unload function will only, if -ever, unload the Emacs Lisp side of the contrib, you may also need to -restart your lisps. - -@c ----------------------- -@node REPL -@section REPL: the ``top level'' - -@cindex Listener - -@SLIME{} uses a custom Read-Eval-Print Loop (@REPL{}, also known as a -``top level'', or listener). The @REPL{} user-interface is written in -Emacs Lisp, which gives more Emacs-integration than the traditional -@code{comint}-based Lisp interaction: - -@itemize @bullet -@item -Conditions signalled in @REPL{} expressions are debugged with @SLDB{}. -@item -Return values are distinguished from printed output by separate Emacs -faces (colours). -@item -Emacs manages the @REPL{} prompt with markers. This ensures that Lisp -output is inserted in the right place, and doesn't get mixed up with -user input. -@end itemize - -To load the REPL use @code{(add-to-list 'slime-contribs 'slime-repl)} in your -@code{.emacs}. - -@table @kbd - -@kbditem{C-c C-z, slime-switch-to-output-buffer} -Select the output buffer, preferably in a different window. - -@kbditem{C-c C-y, slime-call-defun} -Insert a call to the function defined around point into the REPL. - -@kbditem{C-c C-j, slime-eval-last-expression-in-repl} -Inserts the last expression to the REPL and evaluates it there. -Switches to the current packae of the source buffer for the duration. -If used with a prefix argument, doesn't switch back afterwards. - -@end table - -@menu -* REPL commands:: -* Input Navigation:: -* Shortcuts:: -@end menu - -@c ----------------------- -@node REPL commands -@subsection REPL commands - -@table @kbd - -@kbditem{RET, slime-repl-return} -Evaluate the current input in Lisp if it is complete. If incomplete, -open a new line and indent. If a prefix argument is given then the -input is evaluated without checking for completeness. - -@kbditem{C-RET, slime-repl-closing-return} -Close any unmatched parenthesis and then evaluate the current input in -Lisp. Also bound to @kbd{M-RET}. - -@kbditem{TAB, slime-indent-and-complete-symbol} -Indent the current line and perform symbol completion. - -@kbditem{C-j, slime-repl-newline-and-indent} -Open and indent a new line. - -@kbditem{C-a, slime-repl-bol} -Go to the beginning of the line, but stop at the @REPL{} prompt. - -@c @anchor{slime-interrupt} -@kbditem{C-c C-c, slime-interrupt} -Interrupt the Lisp process with @code{SIGINT}. - -@c @kbditem{C-c M-g, slime-quit} -@c Quit @SLIME{}. - -@kbditem{C-c M-o, slime-repl-clear-buffer} -Clear the entire buffer, leaving only a prompt. - -@kbditem{C-c C-o, slime-repl-clear-output} -Remove the output and result of the previous expression from the -buffer. - -@end table - -@c ----------------------- -@node Input Navigation -@subsection Input navigation - -@cindex Input History - -The input navigation (a.k.a. history) commands are modelled after -@code{coming}-mode. Be careful if you are used to Bash-like -keybindings: @kbd{M-p} and @kbd{M-n} use the current input as search -pattern and only work Bash-like if the current line is -empty. @kbd{C-} and @kbd{C-} work like the up and down keys in -Bash. - -@table @kbd - -@kbditempair{C-, C-, slime-repl-forward-input, slime-repl-backward-input} -Go to the next/previous history item. - -@kbditempair{M-n, M-p, slime-repl-next-input, slime-repl-previous-input} -Search the next/previous item in the command history using the current -input as search pattern. If @kbd{M-n}/@kbd{M-n} is typed two times in -a row, the second invocation uses the same search pattern (even if the -current input has changed). - -@kbditempair{M-s, M-r, slime-repl-next-matching-input, slime-repl-previous-matching-input} -Search forward/reverse through command history with regex - -@c @code{slime-repl-@{next,previous@}-input}@* -@c @code{slime-repl-@{next,previous@}-matching-input}@* -@c @code{comint}-style input history commands. - -@kbditempair{C-c C-n, C-c C-p, slime-repl-next-prompt, slime-repl-previous-prompt} -Move between the current and previous prompts in the @REPL{} buffer. -Pressing RET on a line with old input copies that line to the newest -prompt. -@end table - -@vindex slime-repl-wrap-history -The variable @code{slime-repl-wrap-history} controls wrap around -behaviour, i.e. whether cycling should restart at the beginning of the -history if the end is reached. - -@c ----------------------- -@comment node-name, next, previous, up -@node Shortcuts -@subsection Shortcuts - -@cindex Shortcuts - -``Shortcuts'' are a special set of @REPL{} commands that are invoked -by name. To invoke a shortcut you first press @kbd{,} (comma) at the -@REPL{} prompt and then enter the shortcut's name when prompted. - -Shortcuts deal with things like switching between directories and -compiling and loading Lisp systems. The set of shortcuts is listed -below, and you can also use the @code{help} -shortcut to list them interactively. - -@table @kbd -@item change-directory (aka !d, cd) -Change the current directory. - -@item change-package (aka !p, in, in-package) -Change the current package. - -@item compile-and-load (aka cl) -Compile (if necessary) and load a lisp file. - -@item defparameter (aka !) -Define a new global, special, variable. - -@item disconnect -Disconnect all connections. - -@item help (aka ?) -Display the help. - -@item pop-directory (aka -d) -Pop the current directory. - -@item pop-package (aka -p) -Pop the top of the package stack. - -@item push-directory (aka +d, pushd) -Push a new directory onto the directory stack. - -@item push-package (aka +p) -Push a package onto the package stack. - -@item pwd -Show the current directory. - -@item quit -Quit the current Lisp. - -@item resend-form -Resend the last form. - -@item restart-inferior-lisp -Restart *inferior-lisp* and reconnect @SLIME{}. - -@item sayoonara -Quit all Lisps and close all @SLIME{} buffers. - -@end table - -@node slime-mrepl -@section Multiple REPLs - -The @code{slime-mrepl} package adds support for multiple listener -buffers. The command @kbd{M-x slime-new-mrepl} creates a new -buffer. In a multi-threaded Lisp, each listener is associated with a -separate thread. In a single-threaded Lisp it's also possible to -create multiple listener buffers but the commands are executed -sequentially by the same process. - -@node inferior-slime-mode -@section @code{inferior-slime-mode} - -The @code{inferior-slime-mode} is a minor mode is intended to use with -the @code{*inferior-lisp*} lisp buffer. It provides some of the -@SLIME{} commands, like symbol completion and documentation lookup. It -also tracks the current directory of the Lisp process. To install it, -add something like this to user @file{.emacs}: - -@example -(add-to-list 'slime-contribs 'inferior-slime) -@end example - -@table @kbd -@cmditem{inferior-slime-mode} -Turns inferior-slime-mode on or off. -@end table - -@vindex inferior-slime-mode-map -The variable @code{inferior-slime-mode-map} contains the extra -keybindings. - -@node Compound Completion -@section Compound Completion - -@anchor{slime-complete-symbol*} -The package @code{slime-c-p-c} provides a different symbol completion -algorithm, which performs completion ``in parallel'' over the -hyphen-delimited sub-words of a symbol name. -@footnote{This style of completion is modelled on @file{completer.el} -by Chris McConnell. That package is bundled with @acronym{ILISP}.} -Formally this means that ``@code{a-b-c}'' can complete to any symbol -matching the regular expression ``@code{^a.*-b.*-c.*}'' (where ``dot'' -matches anything but a hyphen). Examples give a more intuitive -feeling: -@itemize @bullet -@item -@code{m-v-b} completes to @code{multiple-value-bind}. -@item -@code{w-open} is ambiguous: it completes to either -@code{with-open-file} or @code{with-open-stream}. The symbol is -expanded to the longest common completion (@code{with-open-}) and the -point is placed at the first point of ambiguity, which in this case is -the end. -@item -@code{w--stream} completes to @code{with-open-stream}. -@end itemize - -The variable @code{slime-c-p-c-unambiguous-prefix-p} specifies where -point should be placed after completion. E.g. the possible -completions for @code{f-o} are @code{finish-output} and -@code{force-output}. By the default point is moved after the -@code{f}, because that is the unambiguous prefix. If -@code{slime-c-p-c-unambiguous-prefix-p} is nil, point moves to -the end of the inserted text, after the @code{o} in this case. - -In addition, @code{slime-c-p-c} provides completion for character names -(mostly useful for Unicode-aware implementations): - -@example -CL-USER> #\Sp -@end example - -Here @SLIME{} will usually complete the character to @code{#\Space}, but -in a Unicode-aware implementation, this might provide the following -completions: -@example -Space Space -Sparkle Spherical_Angle -Spherical_Angle_Opening_Left Spherical_Angle_Opening_Up -@end example - -The package @code{slime-c-p-c} also provides context-sensitive -completion for keywords. Example: - -@example -CL-USER> (find 1 '(1 2 3) :s -@end example - -Here @SLIME{} will complete @code{:start}, rather than suggesting all -ever-interned keywords starting with @code{:s}. - - -@table @kbd -@kbditem{C-c C-s, slime-complete-form} -Looks up and inserts into the current buffer the argument list for the -function at point, if there is one. More generally, the command -completes an incomplete form with a template for the missing arguments. -There is special code for discovering extra keywords of generic -functions and for handling @code{make-instance}, -@code{defmethod}, and many other functions. Examples: - -@example -(subseq "abc" - --inserts--> start [end]) -(find 17 - --inserts--> sequence :from-end from-end :test test - :test-not test-not :start start :end end - :key key) -(find 17 '(17 18 19) :test #'= - --inserts--> :from-end from-end - :test-not test-not :start start :end end - :key key) -(defclass foo () ((bar :initarg :bar))) -(defmethod print-object - --inserts--> (object stream) - body...) -(defmethod initialize-instance :after ((object foo) &key blub)) -(make-instance 'foo - --inserts--> :bar bar :blub blub initargs...) -@end example -@end table - -@node Fuzzy Completion -@section Fuzzy Completion - -The package @code{slime-fuzzy} implements yet another symbol -completion heuristic. - -@table @kbd -@anchor{slime-fuzzy-complete-symbol} -@kbditem{C-c M-i, slime-fuzzy-complete-symbol} -Presents a list of likely completions to choose from for an -abbreviation at point. If you set the -variable @code{slime-complete-symbol-function} to this command, fuzzy -completion will also be used for @kbd{M-TAB}. -@end table - -@subsection The Algorithm - -It attempts to complete a symbol all at once, instead of in pieces. -For example, ``mvb'' will find ``@code{multiple-value-bind}'' and -``norm-df'' will find -``@code{least-positive-normalized-double-float}''. - -The algorithm tries to expand every character in various ways and -rates the list of possible completions with the following heuristic. - -Letters are given scores based on their position in the string. -Letters at the beginning of a string or after a prefix letter at -the beginning of a string are scored highest. Letters after a -word separator such as #\- are scored next highest. Letters at -the end of a string or before a suffix letter at the end of a -string are scored medium, and letters anywhere else are scored -low. - -If a letter is directly after another matched letter, and its -intrinsic value in that position is less than a percentage of the -previous letter's value, it will use that percentage instead. - -Finally, a small scaling factor is applied to favor shorter -matches, all other things being equal. - -@subsection Duplicate Symbols - -In case a symbol is accessible via several packages, duplicate symbol -filter specified via @code{*fuzzy-duplicate-symbol-filter*} swank -variable is applied. @code{:nearest-package} value specifies that only -symbols in the package with highest score should be kept. -@code{:home-package} specifies that only the match that represents the home -package of the symbol is used, and @code{:all} value specifies that -duplicate symbol filter mode should be turned off. - -To specify a custom filter, set @code{*fuzzy-duplicate-symbol-filter*} -to a function accepting three arguments: the name of package being -examined, the list of names of all packages being examined with -packages with highest matching score listed first and an @code{equal} -hash-table that is shared between calls to the function and can be -used for deduplication purposes. The function should return a -deduplication filter function which accepts a symbol and returns true -if the symbol should be kept. - -For example, the effect of @code{:nearest-package} can be also achieved -by specifying the following custom filter in @file{~/.swank.lisp}: -@example -(setf *fuzzy-duplicate-symbol-filter* - (lambda (cur-package all-packages dedup-table) - (declare (ignore cur-package all-packages)) - (lambda (symbol) - (unless (gethash (symbol-name symbol) dedup-table) - (setf (gethash (symbol-name symbol) dedup-table) t))))) -@end example -And instead of @code{:home-package}, the following can be used: -@example -(setf *fuzzy-duplicate-symbol-filter* - (lambda (cur-package all-packages dedup-table) - (declare (ignore dedup-table)) - (let ((packages (mapcar #'find-package - (remove cur-package all-packages)))) - (lambda (symbol) - (not (member (symbol-package symbol) packages)))))) -@end example - -@node slime-autodoc-mode -@section @code{slime-autodoc-mode} - -Autodoc mode is an additional minor-mode for automatically showing -information about symbols near the point. For function names the -argument list is displayed, and for global variables, the value. -Autodoc is implemented by means of @code{eldoc-mode} of Emacs. - -The mode can be enabled by default in your @code{~/.emacs}: -@example -(add-to-list 'slime-contribs 'slime-autodoc) -@end example - -@table @kbd -@cmditem{slime-arglist NAME} -Show the argument list of the function NAME. - -@cmditem{slime-autodoc-mode} -Toggles autodoc-mode on or off according to the argument, and -toggles the mode when invoked without argument. -@kbditem{C-c C-d a, slime-autodoc-manually} -Like slime-autodoc, but when called twice, -or after slime-autodoc was already automatically called, -display multiline arglist. -@end table - -@vindex slime-use-autodoc-mode -If the variable @code{slime-use-autodoc-mode} is set (default), Emacs -starts a timer, otherwise the information is only displayed after -pressing SPC. - -@vindex slime-autodoc-use-multiline-p -If @code{slime-autodoc-use-multiline-p} is set to non-nil, -allow long autodoc messages to resize echo area display. - -@vindex slime-autodoc-mode-string -@code{slime-autodoc-mode-string} is a string that will be displayed in -the mode line when autodoc-mode is enabled, or nil, if you prefer no -indication. You can customize this variable. - -@node ASDF -@section ASDF - -@acronym{ASDF} is a popular ``system construction tool''. The package -@code{slime-asdf} provides some commands to load and compile such -systems from Emacs. @acronym{ASDF} itself is not included with -@SLIME{}; you have to load that yourself into your Lisp. In -particular, you must load @acronym{ASDF} before you connect, otherwise -you will get errors about missing symbols. - -@table @kbd -@cmditem{slime-load-system NAME} -Compile and load an ASDF system. The default system name is taken -from the first file matching *.asd in the current directory. -@cmditem{slime-reload-system NAME} -Recompile and load an ASDF system without recompiling its dependencies. -@cmditem{slime-open-system NAME &optional LOAD} -Open all files in a system, optionally load it if LOAD is non-nil. -@cmditem{slime-browse-system NAME} -Browse files in a system using Dired. -@cmditem{slime-delete-system-fasls NAME} -Delete FASLs produced by compiling a system. -@cmditem{slime-rgrep-system NAME REGEXP} -Run @code{rgrep} on the base directory of an ASDF system. -@cmditem{slime-isearch-system NAME} -Run @code{isearch-forward} on the files of an ASDF system. -@cmditem{slime-query-replace-system NAME FROM TO &OPTIONAL DELIMITED} -Run @code{query-replace} on an ASDF system. -@end table -The package also installs some new REPL shortcuts (@pxref{Shortcuts}): - -@table @kbd -@item load-system -Compile (as needed) and load an ASDF system. -@item reload-system -Recompile and load an ASDF system. -@item compile-system -Compile (but not load) an ASDF system. -@item force-compile-system -Recompile (but not load) an ASDF system. -@item force-load-system -Recompile and load an ASDF system. -@item open-system -Open all files in a system. -@item browse-system -Browse files in a system using Dired. -@item delete-system-fasls -Delete FASLs produced by compiling a system. -@end table - -@node Banner -@section Banner -The package @code{slime-banner} installs a window header line ( -@inforef{Header Lines, , elisp}.) in the REPL buffer. It also runs an -animation at startup. - -@vindex slime-startup-animation -@vindex slime-header-line-p -By setting the variable @code{slime-startup-animation} to nil you can -disable the animation respectively with the -variable @code{slime-header-line-p} the header line. - -@node Editing Commands -@section Editing Commands - -The package @code{slime-editing-commands} provides some commands to -edit Lisp expressions. - -@table @kbd -@kbditem{C-c M-q, slime-reindent-defun} -Re-indents the current defun, or refills the current paragraph. -If point is inside a comment block, the text around point will be -treated as a paragraph and will be filled with @code{fill-paragraph}. -Otherwise, it will be treated as Lisp code, and the current defun -will be reindented. If the current defun has unbalanced parens, -an attempt will be made to fix it before reindenting. - -@kbditem{C-c C-], slime-close-all-parens-in-sexp} -Balance parentheses of open s-expressions at point. -Insert enough right parentheses to balance unmatched left parentheses. -Delete extra left parentheses. Reformat trailing parentheses -Lisp-stylishly. - -If REGION is true, operate on the region. Otherwise operate on -the top-level sexp before point. - -@cmditem{slime-insert-balanced-comments} -Insert a set of balanced comments around the s-expression containing -the point. If this command is invoked repeatedly (without any other -command occurring between invocations), the comment progressively -moves outward over enclosing expressions. If invoked with a positive -prefix argument, the s-expression arg expressions out is enclosed in a -set of balanced comments. - -@kbditem{M-C-a, slime-beginning-of-defun} -@kbditem{M-C-e, slime-end-of-defun} -@end table - -@node Fancy Inspector -@section Fancy Inspector - -@cindex Methods - -An alternative to default inspector is provided by the package -`slime-fancy-inspector'. This inspector knows a lot about CLOS -objects and methods. It provides many ``actions'' that can be -selected to invoke Lisp code on the inspected object. For example, to -present a generic function the inspector shows the documentation in -plain text and presents each method with both a hyperlink to inspect -the method object and a ``remove method'' action that you can invoke -interactively. The key-bindings are the same as for the basic -inspector (@pxref{Inspector}). - -@node Presentations -@section Presentations - -@cindex Presentations - -A ``presentation''@footnote{Presentations are a feature originating -from the Lisp machines. It was possible to define @code{present} -methods specialized to various devices, e.g. to draw an object to -bitmapped screen or to write some text to a character stream.} in -@SLIME{} is a region of text associated with a Lisp object. -Right-clicking on the text brings up a menu with operations for the -particular object. Some operations, like inspecting, are available -for all objects, but the object may also have specialized operations. -For instance, pathnames have a dired operation. - -More importantly, it is possible to cut and paste presentations (i.e., -Lisp objects, not just their printed presentation), using all standard -Emacs commands. This way it is possible to cut and paste the results of -previous computations in the REPL. This is of particular importance for -unreadable objects. - -The package @code{slime-presentations} installs presentations in the -REPL, i.e. the results of evaluation commands become presentations. In -this way, presentations generalize the use of the standard Common Lisp -REPL history variables @code{*}, @code{**}, @code{***}. Example: - -@example -CL-USER> (find-class 'standard-class) -@emph{#} -CL-USER> -@end example - -Presentations appear in red color in the buffer. -(In this manual, we indicate the presentations @emph{like this}.) -Using standard Emacs -commands, the presentation can be copied to a new input in the REPL: - -@example -CL-USER> (eql '@emph{#} - '@emph{#}) -@emph{T} -@end example - -Note that standard evaluation and quoting rules still apply. So if a -presentation is a list, it needs to be quoted in an evaluated context to -avoid treating it as a function call: - -@example -CL-USER> (list (find-class 'standard-class) 2 3 4) -@emph{(# 2 3 4)} -CL-USER> @emph{(# 2 3 4)} -; Funcall of # which is a non-function. -; Evaluation aborted. -CL-USER> '@emph{(# 2 3 4)} -(# 2 3 4) -@end example - -When you copy an incomplete presentation or edit the text within a -presentation, the presentation changes to plain text, losing the -association with a Lisp object. In the buffer, this is indicated by -changing the color of the text from red to black. This can be undone. - -Presentations are also available in the inspector (all inspectable parts -are presentations) and the debugger (all local variables are -presentations). This makes it possible to evaluate expressions in the -REPL using objects that appear in local variables of some active -debugger frame; this can be more convenient than using @code{M-x -sldb-eval-in-frame}. @strong{Warning:} The presentations that stem from -the inspector and debugger are only valid as long as the corresponding -buffers are open. Using them later can cause errors or confusing -behavior. - -For some Lisp implementations you can also install the package -@code{slime-presentation-streams}, which enables presentations on the -Lisp @code{*standard-output*} stream and similar streams. This means -that not only results -of computations, but also some objects that are printed to the standard -output (as a side-effect of the computation) are associated with -presentations. Currently, all unreadable objects -and pathnames get printed as presentations. - -@example -CL-USER> (describe (find-class 'standard-object)) -@emph{#} is an instance of - @emph{#}: - The following slots have :INSTANCE allocation: - PLIST NIL - FLAGS 1 - DIRECT-METHODS ((@emph{#} - ... -@end example - -Again, this makes it possible to inspect and copy-paste these objects. - -In addition to the standard Emacs commands, there are several keyboard -commands, a menu-bar menu, and a context menu to operate on -presentations. We describe the keyboard commands below; they are also -shown in the menu-bar menu. - -@table @kbd -@kbditem{C-c C-v SPC, slime-mark-presentation} -If point is within a presentation, move point to the beginning of the -presentation and mark to the end of the presentation. -This makes it possible to copy the presentation. - -@kbditem{C-c C-v w, slime-copy-presentation-at-point-to-kill-ring} -If point is within a presentation, copy the surrounding presentation -to the kill ring. - -@kbditem{C-c C-v r, slime-copy-presentation-at-point-to-repl} -If point is within a presentation, copy the surrounding presentation -to the REPL. - -@kbditem{C-c C-v d, slime-describe-presentation-at-point} -If point is within a presentation, describe the associated object. - -@kbditem{C-c C-v i, slime-inspect-presentation-at-point} -If point is within a presentation, inspect the associated object with -the @SLIME{} inspector. - -@kbditem{C-c C-v n, slime-next-presentation} -Move point to the next presentation in the buffer. - -@kbditem{C-c C-v p, slime-previous-presentation} -Move point to the previous presentation in the buffer. - -@end table -Similar operations are also possible from the context menu of every -presentation. Using @kbd{mouse-3} on a presentation, the context menu -opens and offers various commands. For some objects, specialized -commands are also offered. Users can define additional specialized -commands by defining a method for -@code{swank::menu-choices-for-presentation}. - - -@strong{Warning:} On Lisp implementations without weak hash tables, -all objects associated with presentations are protected from garbage -collection. If your Lisp image grows too large because of that, -use @kbd{C-c C-v M-o} (@code{slime-clear-presentations}) to remove these -associations. You can also use the command @kbd{C-c M-o} -(@code{slime-repl-clear-buffer}), which both clears the REPL buffer and -removes all associations of objects with presentations. - -@strong{Warning:} Presentations can confuse new users. - -@example -CL-USER> (cons 1 2) -@emph{(1 . 2)} -CL-USER> (eq '@emph{(1 . 2)} '@emph{(1 . 2)}) -@emph{T} -@end example - -One could have expected @code{NIL} here, because it looks like two -fresh cons cells are compared regarding object identity. -However, in the example the presentation @code{@emph{(1 . 2)}} was copied twice -to the REPL. Thus @code{EQ} is really invoked with the same object, -namely the cons cell that was returned by the first form entered in the -REPL. - -@node Typeout frames -@section Typeout frames - -@cindex Typeout Frame - -A ``typeout frame'' is a special Emacs frame which is used instead of -the echo area (minibuffer) to display messages from @SLIME{} commands. -This is an optional feature. The advantage of a typeout frame over the -echo area is that it can hold more text, it can be scrolled, and its -contents don't disappear when you press a key. All potentially long -messages are sent to the typeout frame, such as argument lists, macro -expansions, and so on. - -@table @kbd -@cmditem{slime-ensure-typeout-frame} -Ensure that a typeout frame exists, creating one if necessary. -@end table - -If the typeout frame is closed then the echo area will be used again -as usual. - -To have a typeout frame created automatically at startup you should -load the @code{slime-typeout-frame} package. (@pxref{Loading Contribs}.) - -The variable @code{slime-typeout-frame-properties} specifies the -height and possibly other properties of the frame. Its value is -passed to @code{make-frame}. (@inforef{Creating Frames, ,elisp}.) - -@node TRAMP -@section TRAMP - -@cindex TRAMP - -The package @code{slime-tramp} provides some functions to set up -filename translations for TRAMP. (@pxref{Setting up pathname -translations}) - -@node Documentation Links -@section Documentation Links - -For certain error messages, SBCL includes references to the ANSI -Standard or the SBCL User Manual. The @code{slime-references} package -turns those references into clickable links. This makes finding the -referenced section of the HyperSpec much easier. - -@node Xref and Class Browser -@section Xref and Class Browser - -A rudimentary class browser is provided by -the @code{slime-xref-browser} package. - -@table @kbd -@cmditem{slime-browse-classes} -This command asks for a class name and displays inheritance tree of -for the class. - -@cmditem{slime-browse-xrefs} -This command prompts for a symbol and the kind of cross reference, -e.g. callers. The cross reference tree rooted at the symbol is then -then displayed. - -@end table - - -@node Highlight Edits -@section Highlight Edits - -@code{slime-highlight-edits} is a minor mode to highlight those -regions in a Lisp source file which are modified. This is useful to -quickly find those functions which need to be recompiled (with -@kbd{C-c C-c}) - -@table @kbd -@cmditem{slime-highlight-edits-mode} -Turns @code{slime-highlight-edits-mode} on or off. -@end table - -@node Scratch Buffer -@section Scratch Buffer - -@anchor{slime-scratch} -The @SLIME{} scratch buffer, in contrib package @code{slime-scratch}, -imitates Emacs' usual @code{*scratch*} buffer. -If @code{slime-scratch-file} is set, it is used to back the scratch -buffer, making it persistent. The buffer is like any other Lisp -buffer, except for the command bound to @kbd{C-j}. - -@table @kbd - -@kbditem{C-j, slime-eval-print-last-expression} -Evaluate the expression sexp before point and insert print value into -the current buffer. - -@cmditem{slime-scratch} -Create a @file{*slime-scratch*} buffer. In this -buffer you can enter Lisp expressions and evaluate them with -@kbd{C-j}, like in Emacs's @file{*scratch*} buffer. - -@end table - -@node SLIME Trace Dialog -@section SLIME Trace Dialog - -The @SLIME{} Trace Dialog, in package @code{slime-trace-dialog}, is a -tracing facility, similar to Common Lisp's @code{trace}, but -interactive rather than purely textual. It is an Emacs 24-only -contrib. - -You use it just like you would regular @code{trace}: after tracing a -function, calling it causes interesting information about that -particular call to be reported. - -However, instead of printing the trace results to the -the @code{*trace-output*} stream (usually the REPL), the @SLIME{} -Trace Dialog collects and stores them in your lisp environment until, -on user's request, they are fetched into Emacs and displayed in a -dialog-like interactive view. - -To use this contrib, add it to @code{slime-contribs} in your -@code{~/.emacs}, either directly by setting up @code{slime-fancy} -(@pxref{slime-fancy}). - -@example -;; setting up 'slime-fancy would also have worked -(add-to-list 'slime-contribs 'slime-trace-dialog) -@end example - -After starting up @SLIME{}, @SLIME{}'s Trace Dialog installs -a @emph{Trace} menu in the menu-bar of any @code{slime-mode} buffer and -adds two new commands, with respective key-bindings: - -@table @kbd -@kbditem{C-c M-t, slime-trace-dialog-toggle-trace} -If point is on a symbol name, toggle tracing of its function -definition. If point is not on a symbol, prompt user for a function. - -With a @kbd{C-u} prefix argument, and if your lisp implementation -allows it, attempt to decipher lambdas, methods and other complicated -function signatures. - -The function is traced for the @SLIME{} Trace Dialog only, i.e. it is -not found in the list returned by Common Lisp's @code{trace}. - -@kbditem{C-c T, slime-trace-dialog} -Pop to the interactive SLIME Trace Dialog buffer associated with the -current connection (@pxref{Multiple connections}). -@end table - -@page -Consider the (useless) program: - -@example -(defun foo (n) (if (plusp n) (* n (bar (1- n))) 1)) -(defun bar (n) (if (plusp n) (* n (foo (1- n))) 1)) -@end example - -After tracing both @code{foo} and @code{bar} with @kbd{C-c M-t}, -calling call @code{(foo 2)} and moving to the trace dialog with -@kbd{C-c T}, we are presented with this buffer. - -@example -Traced specs (2) [refresh] - [untrace all] - [untrace] common-lisp-user::bar - [untrace] common-lisp-user::foo - -Trace collection status (3/3) [refresh] - [clear] - - 0 - common-lisp-user::foo - | > 2 - | < 2 - 1 `--- common-lisp-user::bar - | > 1 - | < 1 - 2 `-- common-lisp-user::foo - > 0 - < 1 -@end example - -The dialog is divided into sections displaying the functions already -traced, the trace collection progress and the actual trace tree that -follow your program's logic. The most important key-bindings in this -buffer are: - -@table @kbd -@kbditem{g, slime-trace-dialog-fetch-status} -Update information on the trace collection and traced specs. -@kbditem{G, slime-trace-dialog-fetch-traces} -Fetch the next batch of outstanding (not fetched yet) traces. With a -@kbd{C-u} prefix argument, repeat until no more outstanding traces. -@kbditem{C-k, slime-trace-dialog-clear-fetched-traces} -Prompt for confirmation, then clear all traces, both fetched and -outstanding. -@end table - -The arguments and return values below each entry are interactive -buttons. Clicking them opens the inspector -(@pxref{Inspector}). Invoking @kbd{M-RET} -(@code{slime-trace-dialog-copy-down-to-repl}) returns them to the REPL -for manipulation (@pxref{REPL}). The number left of each entry -indicates its absolute position in the calling order, which might -differ from display order in case multiple threads call the same -traced function. - -@code{slime-trace-dialog-hide-details-mode} hides arguments and return -values so you can concentrate on the calling logic. Additionally, -@code{slime-trace-dialog-autofollow-mode} will automatically -display additional detail about an entry when the cursor moves over -it. - -@node slime-sprof -@section @code{slime-sprof} - -@code{slime-sprof} is a package for integrating SBCL's statistical profiler, sb-sprof. - -The variable @code{slime-sprof-exclude-swank} controls whether to -display swank functions. The default value is NIL. - -@table @kbd - -@cmditem{slime-sprof-start} -Start profiling. - -@cmditem{slime-sprof-stop} -Stop profiling. -@cmditem{slime-sprof-report} -Report results of the profiling. -@end table - -The following keys are defined in slime-sprof-browser mode: -@table @kbd - -@kbditem{RET, slime-sprof-browser-toggle} -Expand / collapse function details (callers, calls to) -@kbditem{v, slime-sprof-browser-view-source} -View function sources. -@kbditem{d, slime-sprof-browser-disassemble-function} -Disassemble function. -@kbditem{s, slime-sprof-toggle-swank-exclusion} -Toggle exclusion of swank functions from the report. - -@end table - -@node SLIME Enhanced M-. -@section SLIME Enhanced M-. -@code{slime-mdot-fu} enables meta-point to jump to local variables -bound with @code{let} and @code{let*}, in addition to function bindings -declared with @code{flet} and @code{labels}, via -@code{slime-edit-local-definition}. - -@node slime-fancy -@section Meta package: @code{slime-fancy} - -@code{slime-fancy} is a meta package which loads a combination of the -most popular packages. - -@node Quicklisp -@section Quicklisp -The package @code{slime-quicklisp} adds support for loading Quicklisp -systems in the REPL buffer. In order for this to work, Quicklisp -should have already been loaded in the Lisp implementation. Refer -to @url{https://www.quicklisp.org/} for Quicklisp installation -details. - -The package installs the following REPL shortcuts (@pxref{Shortcuts}): - -@table @kbd -@item quicklisp-quickload (aka ql) -Load a Quicklisp system. -@end table - -@c ----------------------- -@node Credits -@chapter Credits - -@emph{The soppy ending...} - -@unnumberedsec Hackers of the good hack - -@SLIME{} is an Extension of @acronym{SLIM} by Eric Marsden. At the -time of writing, the authors and code-contributors of @SLIME{} are: - -@include contributors.texi - -... not counting the bundled code from @file{hyperspec.el}, -@cite{CLOCC}, and the @cite{CMU AI Repository}. - -Many people on the @code{slime-devel} mailing list have made non-code -contributions to @SLIME{}. Life is hard though: you gotta send code to -get your name in the manual. @code{:-)} - -@unnumberedsec Thanks! - -We're indebted to the good people of @code{common-lisp.net} for their -hosting and help, and for rescuing us from ``Sourceforge hell.'' - -Implementors of the Lisps that we support have been a great help. We'd -like to thank the @acronym{CMUCL} maintainers for their helpful -answers, Craig Norvell and Kevin Layer at Franz providing Allegro CL -licenses for @SLIME{} development, and Peter Graves for his help to -get @SLIME{} running with @acronym{ABCL}. - -Most of all we're happy to be working with the Lisp implementors -who've joined in the @SLIME{} development: Dan Barlow and Christophe -Rhodes of @acronym{SBCL}, Gary Byers of OpenMCL, and Martin Simmons of -LispWorks. Thanks also to Alain Picard and Memetrics for funding -Martin's initial work on the LispWorks backend! - -@ignore -This index is currently ignored, because texinfo's built-in indexing -produces nicer results. -- Helmut Eller - -@c@node Index to Functions -@c@appendix Index to Functions - -These functions are all available (when relevant). To find the -keybinding (if there is one) refer to the function description. - -@c Note to editors: @fcnindex{...} lines commented out below are place holders -@c ---------------- -@c They have yet to be documented -@c Please feel free to add descriptions in the text where appropriate, add the -@c appropriate anchors and uncomment them. -@c -@c [jkc] - -@table @code -@fcnindex{common-lisp-hyperspec-format} -@fcnindex{sldb-abort} -@c @fcnindex{sldb-activate} -@c @fcnindex{sldb-add-face} -@c @fcnindex{sldb-backward-frame} -@c @fcnindex{sldb-beginning-of-backtrace} -@c @fcnindex{sldb-break} -@c @fcnindex{sldb-break-on-return} -@fcnindex{sldb-break-with-default-debugger} -@c @fcnindex{sldb-buffers} -@c @fcnindex{sldb-catch-tags} -@fcnindex{sldb-continue} -@c @fcnindex{sldb-debugged-continuations} -@c @fcnindex{sldb-default-action} -@c @fcnindex{sldb-default-action/mouse} -@c @fcnindex{sldb-delete-overlays} -@c @fcnindex{sldb-details-down} -@c @fcnindex{sldb-details-up} -@fcnindex{sldb-disassemble} -@c @fcnindex{sldb-dispatch-extras} -@c @fcnindex{sldb-down} -@c @fcnindex{sldb-end-of-backtrace} -@fcnindex{sldb-eval-in-frame} -@c @fcnindex{sldb-exit} -@c @fcnindex{sldb-fetch-all-frames} -@c @fcnindex{sldb-fetch-more-frames} -@c @fcnindex{sldb-find-buffer} -@c @fcnindex{sldb-format-reference-node} -@c @fcnindex{sldb-format-reference-source} -@c @fcnindex{sldb-forward-frame} -@c @fcnindex{sldb-frame-details-visible-p} -@c @fcnindex{sldb-frame-locals} -@c @fcnindex{sldb-frame-number-at-point} -@c @fcnindex{sldb-frame-region} -@c @fcnindex{sldb-get-buffer} -@c @fcnindex{sldb-get-default-buffer} -@c @fcnindex{sldb-goto-last-frame} -@c @fcnindex{sldb-help-summary} -@c @fcnindex{sldb-hide-frame-details} -@c @fcnindex{sldb-highlight-sexp} -@c @fcnindex{sldb-insert-condition} -@c @fcnindex{sldb-insert-frame} -@c @fcnindex{sldb-insert-frames} -@c @fcnindex{sldb-insert-locals} -@c @fcnindex{sldb-insert-references} -@c @fcnindex{sldb-insert-restarts} -@c @fcnindex{sldb-inspect-condition} -@fcnindex{sldb-inspect-in-frame} -@c @fcnindex{sldb-inspect-var} -@c @fcnindex{sldb-invoke-restart} -@c @fcnindex{sldb-level} -@c @fcnindex{sldb-list-catch-tags} -@c @fcnindex{sldb-list-locals} -@c @fcnindex{sldb-lookup-reference} -@c @fcnindex{sldb-maybe-recenter-region} -@c @fcnindex{sldb-mode-hook} -@c @fcnindex{sldb-next} -@c @fcnindex{sldb-out} -@fcnindex{sldb-pprint-eval-in-frame} -@c @fcnindex{sldb-previous-frame-number} -@c @fcnindex{sldb-print-condition} -@c @fcnindex{sldb-prune-initial-frames} -@fcnindex{sldb-quit} -@c @fcnindex{sldb-reference-properties} -@c @fcnindex{sldb-restart-at-point} -@fcnindex{sldb-restart-frame} -@fcnindex{sldb-return-from-frame} -@c @fcnindex{sldb-setup} -@c @fcnindex{sldb-show-frame-details} -@c @fcnindex{sldb-show-frame-source} -@fcnindex{sldb-show-source} -@fcnindex{sldb-step} -@c @fcnindex{sldb-sugar-move} -@fcnindex{sldb-toggle-details} -@c @fcnindex{sldb-up} -@c @fcnindex{sldb-var-number-at-point} -@c @fcnindex{sldb-xemacs-emulate-point-entered-hook} -@c @fcnindex{sldb-xemacs-post-command-hook} - - -@c @fcnindex{inferior-slime-closing-return} -@c @fcnindex{inferior-slime-indent-line} -@c @fcnindex{inferior-slime-mode} -@c @fcnindex{inferior-slime-return} -@fcnindex{slime-abort-connection} -@fcnindex{slime-apropos} -@fcnindex{slime-apropos-all} -@fcnindex{slime-apropos-package} -@c @fcnindex{slime-arglist} -@fcnindex{slime-autodoc-mode} -@c @fcnindex{slime-autodoc-start-timer} -@c @fcnindex{slime-background-activities-enabled-p} -@c @fcnindex{slime-background-message} -@c @fcnindex{slime-browse-classes} -@c @fcnindex{slime-browse-xrefs} -@fcnindex{slime-call-defun} -@fcnindex{slime-calls-who} -@c @fcnindex{slime-check-coding-system} -@fcnindex{slime-close-all-sexp} -@fcnindex{slime-close-parens-at-point} -@fcnindex{slime-compile-and-load-file} -@fcnindex{slime-compile-defun} -@fcnindex{slime-compile-file} -@fcnindex{slime-compile-region} -@fcnindex{slime-compiler-macroexpand} -@fcnindex{slime-compiler-macroexpand-1} -@c @fcnindex{slime-compiler-notes-default-action-or-show-details} -@c @fcnindex{slime-compiler-notes-default-action-or-show-details/mouse} -@c @fcnindex{slime-compiler-notes-quit} -@c @fcnindex{slime-compiler-notes-show-details} -@c @fcnindex{slime-complete-form} -@fcnindex{slime-complete-symbol} -@fcnindex{slime-connect} -@fcnindex{slime-connection-list-make-default} -@c @fcnindex{slime-connection-list-mode} -@c @fcnindex{slime-copy-presentation-at-point} -@fcnindex{slime-describe-function} -@fcnindex{slime-describe-symbol} -@fcnindex{slime-disassemble-symbol} -@fcnindex{slime-disconnect} -@c @fcnindex{slime-documentation} -@fcnindex{slime-edit-definition} -@fcnindex{slime-edit-definition-other-frame} -@fcnindex{slime-edit-definition-other-window} -@fcnindex{slime-edit-definition-with-etags} -@fcnindex{slime-edit-value} -@c @fcnindex{slime-edit-value-commit} -@c @fcnindex{slime-edit-value-mode} -@fcnindex{slime-ensure-typeout-frame} -@c @fcnindex{slime-eval-buffer} -@fcnindex{slime-eval-defun} -@fcnindex{slime-eval-last-expression} -@c @fcnindex{slime-eval-print-last-expression} -@fcnindex{slime-eval-region} -@fcnindex{slime-fuzzy-abort} -@fcnindex{slime-fuzzy-complete-symbol} -@fcnindex{slime-fuzzy-completions-mode} -@c @fcnindex{slime-fuzzy-next} -@c @fcnindex{slime-fuzzy-prev} -@c @fcnindex{slime-fuzzy-select} -@c @fcnindex{slime-fuzzy-select/mouse} -@fcnindex{slime-goto-connection} -@fcnindex{slime-goto-xref} -@c @fcnindex{slime-handle-repl-shortcut} -@c @fcnindex{slime-highlight-notes} -@fcnindex{slime-hyperspec-lookup} -@c @fcnindex{slime-indent-and-complete-symbol} -@c @fcnindex{slime-init-keymaps} -@c @fcnindex{slime-insert-arglist} -@c @fcnindex{slime-insert-balanced-comments} -@fcnindex{slime-inspect} -@fcnindex{slime-inspector-copy-down} -@fcnindex{slime-inspector-describe} -@fcnindex{slime-inspector-next} -@c @fcnindex{slime-inspector-next-inspectable-object} -@fcnindex{slime-inspector-quit} -@c @fcnindex{slime-inspector-reinspect} -@fcnindex{slime-interactive-eval} -@fcnindex{slime-interrupt} -@fcnindex{slime-list-callees} -@fcnindex{slime-list-callers} -@c @fcnindex{slime-list-compiler-notes} -@fcnindex{slime-list-connections} -@c @fcnindex{slime-list-repl-shortcuts} -@fcnindex{slime-list-threads} -@fcnindex{slime-load-file} -@c @fcnindex{slime-load-system} -@fcnindex{slime-macroexpand-1} -@fcnindex{slime-macroexpand-1-inplace} -@fcnindex{slime-macroexpand-all} -@c @fcnindex{slime-make-default-connection} -@c @fcnindex{slime-make-typeout-frame} -@fcnindex{slime-mode} -@c @fcnindex{slime-next-location} -@fcnindex{slime-next-note} -@fcnindex{slime-nop} -@c @fcnindex{slime-ping} -@fcnindex{slime-pop-find-definition-stack} -@fcnindex{slime-pprint-eval-last-expression} -@c @fcnindex{slime-presentation-menu} -@c @fcnindex{slime-pretty-lambdas} -@fcnindex{slime-previous-note} -@fcnindex{slime-profile-package} -@fcnindex{slime-profile-report} -@fcnindex{slime-profile-reset} -@fcnindex{slime-profiled-functions} -@fcnindex{slime-quit} -@c @fcnindex{slime-quit-connection-at-point} -@c @fcnindex{slime-quit-lisp} -@c @fcnindex{slime-re-evaluate-defvar} -@c @fcnindex{slime-recompile-bytecode} -@c @fcnindex{slime-register-lisp-implementation} -@fcnindex{slime-reindent-defun} -@c @fcnindex{slime-remove-balanced-comments} -@fcnindex{slime-remove-notes} -@c @fcnindex{slime-repl} -@fcnindex{slime-repl-beginning-of-defun} -@fcnindex{slime-repl-bol} -@fcnindex{slime-repl-clear-buffer} -@fcnindex{slime-repl-clear-output} -@fcnindex{slime-repl-closing-return} -@c @fcnindex{slime-repl-compile-and-load} -@c @fcnindex{slime-repl-compile-system} -@c @fcnindex{slime-repl-compile/force-system} -@c @fcnindex{slime-repl-defparameter} -@fcnindex{slime-repl-end-of-defun} -@c @fcnindex{slime-repl-eol} -@c @fcnindex{slime-repl-load-system} -@c @fcnindex{slime-repl-load/force-system} -@c @fcnindex{slime-repl-mode} -@fcnindex{slime-repl-newline-and-indent} -@fcnindex{slime-repl-next-input} -@fcnindex{slime-repl-next-matching-input} -@fcnindex{slime-repl-next-prompt} -@c @fcnindex{slime-repl-pop-directory} -@c @fcnindex{slime-repl-pop-packages} -@fcnindex{slime-repl-previous-input} -@fcnindex{slime-repl-previous-matching-input} -@fcnindex{slime-repl-previous-prompt} -@c @fcnindex{slime-repl-push-directory} -@c @fcnindex{slime-repl-push-package} -@c @fcnindex{slime-repl-read-break} -@c @fcnindex{slime-repl-read-mode} -@fcnindex{slime-repl-return} -@fcnindex{slime-repl-set-package} -@c @fcnindex{slime-repl-shortcut-help} -@c @fcnindex{slime-reset} -@c @fcnindex{slime-restart-connection-at-point} -@c @fcnindex{slime-restart-inferior-lisp} -@c @fcnindex{slime-restart-inferior-lisp-aux} -@fcnindex{slime-scratch} -@c @fcnindex{slime-select-lisp-implementation} -@fcnindex{slime-selector} -@c @fcnindex{slime-send-sigint} -@c @fcnindex{slime-set-default-directory} -@c @fcnindex{slime-set-package} -@c @fcnindex{slime-show-xref} -@fcnindex{slime-space} -@c @fcnindex{slime-start-and-load} -@fcnindex{slime-switch-to-output-buffer} -@fcnindex{slime-sync-package-and-default-directory} -@c @fcnindex{slime-temp-buffer-mode} -@fcnindex{slime-temp-buffer-quit} -@c @fcnindex{slime-thread-attach} -@c @fcnindex{slime-thread-debug} -@c @fcnindex{slime-thread-control-mode} -@c @fcnindex{slime-thread-kill} -@c @fcnindex{slime-thread-quit} -@fcnindex{slime-toggle-profile-fdefinition} -@fcnindex{slime-toggle-trace-fdefinition} -@fcnindex{slime-undefine-function} -@fcnindex{slime-unprofile-all} -@fcnindex{slime-untrace-all} -@fcnindex{slime-update-connection-list} -@c @fcnindex{slime-update-indentation} ??? -@fcnindex{slime-who-binds} -@fcnindex{slime-who-calls} -@fcnindex{slime-who-macroexpands} -@fcnindex{slime-who-references} -@fcnindex{slime-who-sets} -@fcnindex{slime-who-specializes} -@c @fcnindex{slime-xref-mode} -@c @fcnindex{slime-xref-quit} -@end table - -@end ignore - -@node Key Index -@unnumbered Key (Character) Index -@printindex ky - -@node Command Index -@unnumbered Command and Function Index -@printindex fn - -@node Variable Index -@unnumbered Variable and Concept Index -@printindex vr - -@bye -Local Variables: -paragraph-start: "@[a-zA-Z]+\\({[^}]+}\\)?[ \n]\\|[ ]*$" -paragraph-separate: "@[a-zA-Z]+\\({[^}]+}\\)?[ \n]\\|[ ]*$" -End: diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/texinfo-tabulate.awk b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/texinfo-tabulate.awk deleted file mode 100644 index 87e7fe7..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/doc/texinfo-tabulate.awk +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env awk -f -# -# Format input lines into a multi-column texinfo table. -# Note: does not do texinfo-escaping of the input. - -# This code has been placed in the Public Domain. All warranties -# are disclaimed. - -BEGIN { - columns = 3; - printf("@multitable @columnfractions"); - for (i = 0; i < columns; i++) - printf(" %f", 1.0/columns); - print -} - -{ if (NR % columns == 1) printf("\n@item %s", $0); - else printf(" @tab %s", $0); } - -END { printf("\n@end multitable\n"); } - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/.nosearch b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/.nosearch deleted file mode 100644 index 5529475..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/.nosearch +++ /dev/null @@ -1 +0,0 @@ -;; normal-top-level-add-subdirs-to-load-path needs this file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/cl-lib.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/cl-lib.el deleted file mode 100644 index ce11309..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/cl-lib.el +++ /dev/null @@ -1,410 +0,0 @@ -;;; cl-lib.el --- Properly prefixed CL functions and macros -*- coding: utf-8 -*- - -;; Copyright (C) 2012, 2013, 2014 Free Software Foundation, Inc. - -;; Author: Stefan Monnier -;; vcomment: Emacs-24.3's version is 1.0 so this has to stay below. -;; Version: 0.5 - -;; 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 3 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, see . - -;;; Commentary: - -;; This is a forward compatibility package, which provides (a subset of) the -;; features of the cl-lib package introduced in Emacs-24.3, for use on -;; previous emacsen. - -;; Make sure this is installed *late* in your `load-path`, i.e. after Emacs's -;; built-in .../lisp/emacs-lisp directory, so that if/when you upgrade to -;; Emacs-24.3, the built-in version of the file will take precedence, otherwise -;; you could get into trouble (although we try to hack our way around the -;; problem in case it happens). - -;; This code is largely copied from Emacs-24.3's cl.el, with the alias bindings -;; simply reversed. - -;;; Code: - -;; We need to handle the situation where this package is used with an Emacs -;; that comes with a real cl-lib (i.e. ≥24.3). - -;; First line of defense: try to make sure the built-in cl-lib comes earlier in -;; load-path so we never get loaded: -;;;###autoload (let ((d (file-name-directory #$))) -;;;###autoload (when (member d load-path) -;;;###autoload (setq load-path (append (remove d load-path) (list d))))) - -(when (functionp 'macroexp--compiler-macro) - ;; `macroexp--compiler-macro' was introduced as part of the big CL - ;; reorganization which moved/reimplemented some of CL into core (mostly the - ;; setf and compiler-macro support), so its presence indicates we're running - ;; in an Emacs that comes with the new cl-lib.el, where this file should - ;; never be loaded! - (message "Real cl-lib shadowed by compatibility cl-lib? (%s)" load-file-name) - (when load-file-name - ;; (message "Let's try to patch things up") - (let ((loaddir (file-name-directory load-file-name)) - load-path-dir) - ;; Find the problematic directory from load-path. - (dolist (dir load-path) - (if (equal loaddir (expand-file-name (file-name-as-directory dir))) - (setq load-path-dir dir))) - (when load-path-dir - ;; (message "Let's move the offending dir to the end") - (setq load-path (append (remove load-path-dir load-path) - (list load-path-dir))) - ;; Here we could manually load cl-lib and then return immediately. - ;; But Emacs currently doesn't provide any way for a file to "return - ;; immediately", so instead we make sure the rest of the file does not - ;; throw away any pre-existing definition. - )))) - -(require 'cl) - -;; Some of Emacs-24.3's cl.el definition are not just aliases, because either -;; the feature was dropped from cl-lib.el or because the cl-lib version is -;; not fully compatible. -;; Let's just not include them here, since it is very important that if code -;; works with this cl-lib.el it should also work with Emacs-24.3's cl-lib.el, -;; whereas the reverse is much less important. - -(dolist (var '( - ;; loop-result-var - ;; loop-result - ;; loop-initially - ;; loop-finally - ;; loop-bindings - ;; loop-args - ;; bind-inits - ;; bind-block - ;; lambda-list-keywords - float-negative-epsilon - float-epsilon - least-negative-normalized-float - least-positive-normalized-float - least-negative-float - least-positive-float - most-negative-float - most-positive-float - ;; custom-print-functions - )) - (let ((new (intern (format "cl-%s" var)))) - (unless (boundp new) (defvaralias new var)))) - -;; The following cl-lib functions were already defined in the old cl.el, -;; with a different meaning: -;; - cl-position and cl-delete-duplicates -;; the two meanings are clearly different, but we can distinguish which was -;; meant by looking at the arguments. -;; - cl-member -;; the old meaning hasn't been used for a long time and is a subset of the -;; new, so we can simply override it. -;; - cl-adjoin -;; the old meaning is actually the same as the new except for optimizations. - -(dolist (fun '( - (get* . cl-get) - (random* . cl-random) - (rem* . cl-rem) - (mod* . cl-mod) - (round* . cl-round) - (truncate* . cl-truncate) - (ceiling* . cl-ceiling) - (floor* . cl-floor) - (rassoc* . cl-rassoc) - (assoc* . cl-assoc) - ;; (member* . cl-member) ;Handle specially below. - (delete* . cl-delete) - (remove* . cl-remove) - (defsubst* . cl-defsubst) - (sort* . cl-sort) - (function* . cl-function) - (defmacro* . cl-defmacro) - (defun* . cl-defun) - (mapcar* . cl-mapcar) - - remprop - getf - tailp - list-length - nreconc - revappend - concatenate - subseq - random-state-p - make-random-state - signum - isqrt - lcm - gcd - notevery - notany - every - some - mapcon - mapcan - mapl - maplist - map - equalp - coerce - tree-equal - nsublis - sublis - nsubst-if-not - nsubst-if - nsubst - subst-if-not - subst-if - subsetp - nset-exclusive-or - set-exclusive-or - nset-difference - set-difference - nintersection - intersection - nunion - union - rassoc-if-not - rassoc-if - assoc-if-not - assoc-if - member-if-not - member-if - merge - stable-sort - search - mismatch - count-if-not - count-if - count - position-if-not - position-if - ;; position ;Handle specially via defadvice below. - find-if-not - find-if - find - nsubstitute-if-not - nsubstitute-if - nsubstitute - substitute-if-not - substitute-if - substitute - ;; delete-duplicates ;Handle specially via defadvice below. - remove-duplicates - delete-if-not - delete-if - remove-if-not - remove-if - replace - fill - reduce - compiler-macroexpand - define-compiler-macro - assert - check-type - typep - deftype - defstruct - callf2 - callf - letf* - letf - rotatef - shiftf - remf - psetf - declare - the - locally - multiple-value-setq - multiple-value-bind - symbol-macrolet - macrolet - progv - psetq - do-all-symbols - do-symbols - dotimes - dolist - do* - do - loop - return-from - return - block - etypecase - typecase - ecase - case - load-time-value - eval-when - destructuring-bind - gentemp - gensym - pairlis - acons - subst - ;; adjoin ;It's already defined. - copy-list - ldiff - list* - cddddr - cdddar - cddadr - cddaar - cdaddr - cdadar - cdaadr - cdaaar - cadddr - caddar - cadadr - cadaar - caaddr - caadar - caaadr - caaaar - cdddr - cddar - cdadr - cdaar - caddr - cadar - caadr - caaar - tenth - ninth - eighth - seventh - sixth - fifth - fourth - third - endp - rest - second - first - svref - copy-seq - evenp - oddp - minusp - plusp - floatp-safe - declaim - proclaim - nth-value - multiple-value-call - multiple-value-apply - multiple-value-list - values-list - values - pushnew - decf - incf - - dolist - dotimes - )) - (let ((new (if (consp fun) (prog1 (cdr fun) (setq fun (car fun))) - (intern (format "cl-%s" fun))))) - (if (fboundp new) - (unless (or (eq (symbol-function new) fun) - (eq new (and (symbolp fun) (fboundp fun) - (symbol-function fun)))) - (message "%S already defined, not rebinding" new)) - (defalias new fun)))) - -(unless (symbolp (symbol-function 'position)) - (autoload 'cl-position "cl-seq") - (defadvice cl-position (around cl-lib (cl-item cl-seq &rest cl-keys) activate) - (let ((argk (ad-get-args 2))) - (if (or (null argk) (keywordp (car argk))) - ;; This is a call to cl-lib's `cl-position'. - (setq ad-return-value - (apply #'position (ad-get-arg 0) (ad-get-arg 1) argk)) - ;; Must be a call to cl's old `cl-position'. - ad-do-it)))) - -(unless (symbolp (symbol-function 'delete-duplicates)) - (autoload 'cl-delete-duplicates "cl-seq") - (defadvice cl-delete-duplicates (around cl-lib (cl-seq &rest cl-keys) activate) - (let ((argk (ad-get-args 1))) - (if (or (null argk) (keywordp (car argk))) - ;; This is a call to cl-lib's `cl-delete-duplicates'. - (setq ad-return-value - (apply #'delete-duplicates (ad-get-arg 0) argk)) - ;; Must be a call to cl's old `cl-delete-duplicates'. - ad-do-it)))) - -(when (or (not (fboundp 'cl-member)) - (eq (symbol-function 'cl-member) #'memq)) - (defalias 'cl-member #'member*)) - -;; `cl-labels' is not 100% compatible with `labels' when using dynamic scoping -;; (mostly because it does not turn lambdas that refer to those functions into -;; closures). OTOH it is compatible when using lexical scoping. - -(unless (fboundp 'cl-labels) - (defmacro cl-labels (&rest args) - (unless (and (boundp 'lexical-binding) lexical-binding) - ;; We used to signal an error rather than a message, but in many uses of - ;; cl-labels, the value of lexical-binding doesn't actually matter. - ;; More importantly, the value of `lexical-binding' here is unreliable - ;; (it does not necessarily reflect faithfully whether the output of this - ;; macro will be interpreted as lexically bound code or not). - (message "This `cl-labels' requires `lexical-binding' to be non-nil")) - `(labels ,@args))) - -;;;; ChangeLog: - -;; 2014-02-25 Stefan Monnier -;; -;; Fixes: debbugs:16671 -;; -;; * cl-lib.el (cl-position, cl-delete-duplicate): Don't advise if >=24.3. -;; (load-path): Try to make sure we're at the end. -;; -;; 2014-01-25 Stefan Monnier -;; -;; * cl-lib.el: Resolve conflicts with old internal definitions -;; (bug#16353). -;; (dolist fun): Don't skip definitions silently. -;; (define-setf-expander): Remove, not in cl-lib. -;; (cl-position, cl-delete-duplicates): Add advice to distinguish the use -;; case. -;; (cl-member): Override old definition. -;; -;; 2013-05-22 Stefan Monnier -;; -;; * cl-lib.el (cl-labels): Demote error to message and improve it. -;; -;; 2012-11-30 Stefan Monnier -;; -;; * cl-lib.el: Try and patch things up in case we're hiding the real -;; cl-lib. -;; -;; 2012-11-22 Stefan Monnier -;; -;; Add cl-letf and cl-labels. -;; -;; 2012-11-16 Stefan Monnier -;; -;; * packages/cl-lib: New package. -;; - - -(provide 'cl-lib) -;;; cl-lib.el ends here diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/ert-x.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/ert-x.el deleted file mode 100644 index 53b76f7..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/ert-x.el +++ /dev/null @@ -1,2544 +0,0 @@ -;;; ert.el --- Emacs Lisp Regression Testing - -;; Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc. - -;; Author: Christian M. Ohler -;; Keywords: lisp, tools - -;; This file is NOT part of GNU Emacs. - -;; 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 3 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, see `http://www.gnu.org/licenses/'. - -;;; Commentary: - -;; ERT is a tool for automated testing in Emacs Lisp. Its main -;; features are facilities for defining and running test cases and -;; reporting the results as well as for debugging test failures -;; interactively. -;; -;; The main entry points are `ert-deftest', which is similar to -;; `defun' but defines a test, and `ert-run-tests-interactively', -;; which runs tests and offers an interactive interface for inspecting -;; results and debugging. There is also -;; `ert-run-tests-batch-and-exit' for non-interactive use. -;; -;; The body of `ert-deftest' forms resembles a function body, but the -;; additional operators `should', `should-not' and `should-error' are -;; available. `should' is similar to cl's `assert', but signals a -;; different error when its condition is violated that is caught and -;; processed by ERT. In addition, it analyzes its argument form and -;; records information that helps debugging (`assert' tries to do -;; something similar when its second argument SHOW-ARGS is true, but -;; `should' is more sophisticated). For information on `should-not' -;; and `should-error', see their docstrings. -;; -;; See ERT's info manual as well as the docstrings for more details. -;; To compile the manual, run `makeinfo ert.texinfo' in the ERT -;; directory, then C-u M-x info ert.info in Emacs to view it. -;; -;; To see some examples of tests written in ERT, see its self-tests in -;; ert-tests.el. Some of these are tricky due to the bootstrapping -;; problem of writing tests for a testing tool, others test simple -;; functions and are straightforward. - -;;; Code: - -(eval-when-compile - (require 'cl)) -(require 'button) -(require 'debug) -(require 'easymenu) -(require 'ewoc) -(require 'find-func) -(require 'help) - - -;;; UI customization options. - -(defgroup ert () - "ERT, the Emacs Lisp regression testing tool." - :prefix "ert-" - :group 'lisp) - -(defface ert-test-result-expected '((((class color) (background light)) - :background "green1") - (((class color) (background dark)) - :background "green3")) - "Face used for expected results in the ERT results buffer." - :group 'ert) - -(defface ert-test-result-unexpected '((((class color) (background light)) - :background "red1") - (((class color) (background dark)) - :background "red3")) - "Face used for unexpected results in the ERT results buffer." - :group 'ert) - - -;;; Copies/reimplementations of cl functions. - -(defun ert--cl-do-remf (plist tag) - "Copy of `cl-do-remf'. Modify PLIST by removing TAG." - (let ((p (cdr plist))) - (while (and (cdr p) (not (eq (car (cdr p)) tag))) (setq p (cdr (cdr p)))) - (and (cdr p) (progn (setcdr p (cdr (cdr (cdr p)))) t)))) - -(defun ert--remprop (sym tag) - "Copy of `cl-remprop'. Modify SYM's plist by removing TAG." - (let ((plist (symbol-plist sym))) - (if (and plist (eq tag (car plist))) - (progn (setplist sym (cdr (cdr plist))) t) - (ert--cl-do-remf plist tag)))) - -(defun ert--remove-if-not (ert-pred ert-list) - "A reimplementation of `remove-if-not'. - -ERT-PRED is a predicate, ERT-LIST is the input list." - (loop for ert-x in ert-list - if (funcall ert-pred ert-x) - collect ert-x)) - -(defun ert--intersection (a b) - "A reimplementation of `intersection'. Intersect the sets A and B. - -Elements are compared using `eql'." - (loop for x in a - if (memql x b) - collect x)) - -(defun ert--set-difference (a b) - "A reimplementation of `set-difference'. Subtract the set B from the set A. - -Elements are compared using `eql'." - (loop for x in a - unless (memql x b) - collect x)) - -(defun ert--set-difference-eq (a b) - "A reimplementation of `set-difference'. Subtract the set B from the set A. - -Elements are compared using `eq'." - (loop for x in a - unless (memq x b) - collect x)) - -(defun ert--union (a b) - "A reimplementation of `union'. Compute the union of the sets A and B. - -Elements are compared using `eql'." - (append a (ert--set-difference b a))) - -(eval-and-compile - (defvar ert--gensym-counter 0)) - -(eval-and-compile - (defun ert--gensym (&optional prefix) - "Only allows string PREFIX, not compatible with CL." - (unless prefix (setq prefix "G")) - (make-symbol (format "%s%s" - prefix - (prog1 ert--gensym-counter - (incf ert--gensym-counter)))))) - -(defun ert--coerce-to-vector (x) - "Coerce X to a vector." - (when (char-table-p x) (error "Not supported")) - (if (vectorp x) - x - (vconcat x))) - -(defun* ert--remove* (x list &key key test) - "Does not support all the keywords of remove*." - (unless key (setq key #'identity)) - (unless test (setq test #'eql)) - (loop for y in list - unless (funcall test x (funcall key y)) - collect y)) - -(defun ert--string-position (c s) - "Return the position of the first occurrence of C in S, or nil if none." - (loop for i from 0 - for x across s - when (eql x c) return i)) - -(defun ert--mismatch (a b) - "Return index of first element that differs between A and B. - -Like `mismatch'. Uses `equal' for comparison." - (cond ((or (listp a) (listp b)) - (ert--mismatch (ert--coerce-to-vector a) - (ert--coerce-to-vector b))) - ((> (length a) (length b)) - (ert--mismatch b a)) - (t - (let ((la (length a)) - (lb (length b))) - (assert (arrayp a) t) - (assert (arrayp b) t) - (assert (<= la lb) t) - (loop for i below la - when (not (equal (aref a i) (aref b i))) return i - finally (return (if (/= la lb) - la - (assert (equal a b) t) - nil))))))) - -(defun ert--subseq (seq start &optional end) - "Return a subsequence of SEQ from START to END." - (when (char-table-p seq) (error "Not supported")) - (let ((vector (substring (ert--coerce-to-vector seq) start end))) - (etypecase seq - (vector vector) - (string (concat vector)) - (list (append vector nil)) - (bool-vector (loop with result = (make-bool-vector (length vector) nil) - for i below (length vector) do - (setf (aref result i) (aref vector i)) - finally (return result))) - (char-table (assert nil))))) - -(defun ert-equal-including-properties (a b) - "Return t if A and B have similar structure and contents. - -This is like `equal-including-properties' except that it compares -the property values of text properties structurally (by -recursing) rather than with `eq'. Perhaps this is what -`equal-including-properties' should do in the first place; see -Emacs bug 6581 at URL `http://debbugs.gnu.org/cgi/bugreport.cgi?bug=6581'." - ;; This implementation is inefficient. Rather than making it - ;; efficient, let's hope bug 6581 gets fixed so that we can delete - ;; it altogether. - (not (ert--explain-not-equal-including-properties a b))) - - -;;; Defining and locating tests. - -;; The data structure that represents a test case. -(defstruct ert-test - (name nil) - (documentation nil) - (body (assert nil)) - (most-recent-result nil) - (expected-result-type ':passed) - (tags '())) - -(defun ert-test-boundp (symbol) - "Return non-nil if SYMBOL names a test." - (and (get symbol 'ert--test) t)) - -(defun ert-get-test (symbol) - "If SYMBOL names a test, return that. Signal an error otherwise." - (unless (ert-test-boundp symbol) (error "No test named `%S'" symbol)) - (get symbol 'ert--test)) - -(defun ert-set-test (symbol definition) - "Make SYMBOL name the test DEFINITION, and return DEFINITION." - (when (eq symbol 'nil) - ;; We disallow nil since `ert-test-at-point' and related functions - ;; want to return a test name, but also need an out-of-band value - ;; on failure. Nil is the most natural out-of-band value; using 0 - ;; or "" or signalling an error would be too awkward. - ;; - ;; Note that nil is still a valid value for the `name' slot in - ;; ert-test objects. It designates an anonymous test. - (error "Attempt to define a test named nil")) - (put symbol 'ert--test definition) - definition) - -(defun ert-make-test-unbound (symbol) - "Make SYMBOL name no test. Return SYMBOL." - (ert--remprop symbol 'ert--test) - symbol) - -(defun ert--parse-keys-and-body (keys-and-body) - "Split KEYS-AND-BODY into keyword-and-value pairs and the remaining body. - -KEYS-AND-BODY should have the form of a property list, with the -exception that only keywords are permitted as keys and that the -tail -- the body -- is a list of forms that does not start with a -keyword. - -Returns a two-element list containing the keys-and-values plist -and the body." - (let ((extracted-key-accu '()) - (remaining keys-and-body)) - (while (and (consp remaining) (keywordp (first remaining))) - (let ((keyword (pop remaining))) - (unless (consp remaining) - (error "Value expected after keyword %S in %S" - keyword keys-and-body)) - (when (assoc keyword extracted-key-accu) - (warn "Keyword %S appears more than once in %S" keyword - keys-and-body)) - (push (cons keyword (pop remaining)) extracted-key-accu))) - (setq extracted-key-accu (nreverse extracted-key-accu)) - (list (loop for (key . value) in extracted-key-accu - collect key - collect value) - remaining))) - -;;;###autoload -(defmacro* ert-deftest (name () &body docstring-keys-and-body) - "Define NAME (a symbol) as a test. - -BODY is evaluated as a `progn' when the test is run. It should -signal a condition on failure or just return if the test passes. - -`should', `should-not' and `should-error' are useful for -assertions in BODY. - -Use `ert' to run tests interactively. - -Tests that are expected to fail can be marked as such -using :expected-result. See `ert-test-result-type-p' for a -description of valid values for RESULT-TYPE. - -\(fn NAME () [DOCSTRING] [:expected-result RESULT-TYPE] \ -\[:tags '(TAG...)] BODY...)" - (declare (debug (&define :name test - name sexp [&optional stringp] - [&rest keywordp sexp] def-body)) - (doc-string 3) - (indent 2)) - (let ((documentation nil) - (documentation-supplied-p nil)) - (when (stringp (first docstring-keys-and-body)) - (setq documentation (pop docstring-keys-and-body) - documentation-supplied-p t)) - (destructuring-bind ((&key (expected-result nil expected-result-supplied-p) - (tags nil tags-supplied-p)) - body) - (ert--parse-keys-and-body docstring-keys-and-body) - `(progn - (ert-set-test ',name - (make-ert-test - :name ',name - ,@(when documentation-supplied-p - `(:documentation ,documentation)) - ,@(when expected-result-supplied-p - `(:expected-result-type ,expected-result)) - ,@(when tags-supplied-p - `(:tags ,tags)) - :body (lambda () ,@body))) - ;; This hack allows `symbol-file' to associate `ert-deftest' - ;; forms with files, and therefore enables `find-function' to - ;; work with tests. However, it leads to warnings in - ;; `unload-feature', which doesn't know how to undefine tests - ;; and has no mechanism for extension. - (push '(ert-deftest . ,name) current-load-list) - ',name)))) - -;; We use these `put' forms in addition to the (declare (indent)) in -;; the defmacro form since the `declare' alone does not lead to -;; correct indentation before the .el/.elc file is loaded. -;; Autoloading these `put' forms solves this. -;;;###autoload -(progn - ;; TODO(ohler): Figure out what these mean and make sure they are correct. - (put 'ert-deftest 'lisp-indent-function 2) - (put 'ert-info 'lisp-indent-function 1)) - -(defvar ert--find-test-regexp - (concat "^\\s-*(ert-deftest" - find-function-space-re - "%s\\(\\s-\\|$\\)") - "The regexp the `find-function' mechanisms use for finding test definitions.") - - -(put 'ert-test-failed 'error-conditions '(error ert-test-failed)) -(put 'ert-test-failed 'error-message "Test failed") - -(defun ert-pass () - "Terminate the current test and mark it passed. Does not return." - (throw 'ert--pass nil)) - -(defun ert-fail (data) - "Terminate the current test and mark it failed. Does not return. -DATA is displayed to the user and should state the reason of the failure." - (signal 'ert-test-failed (list data))) - - -;;; The `should' macros. - -(defvar ert--should-execution-observer nil) - -(defun ert--signal-should-execution (form-description) - "Tell the current `should' form observer (if any) about FORM-DESCRIPTION." - (when ert--should-execution-observer - (funcall ert--should-execution-observer form-description))) - -(defun ert--special-operator-p (thing) - "Return non-nil if THING is a symbol naming a special operator." - (and (symbolp thing) - (let ((definition (indirect-function thing t))) - (and (subrp definition) - (eql (cdr (subr-arity definition)) 'unevalled))))) - -(defun ert--expand-should-1 (whole form inner-expander) - "Helper function for the `should' macro and its variants." - (let ((form - ;; If `cl-macroexpand' isn't bound, the code that we're - ;; compiling doesn't depend on cl and thus doesn't need an - ;; environment arg for `macroexpand'. - (if (fboundp 'cl-macroexpand) - ;; Suppress warning about run-time call to cl funtion: we - ;; only call it if it's fboundp. - (with-no-warnings - (cl-macroexpand form (and (boundp 'cl-macro-environment) - cl-macro-environment))) - (macroexpand form)))) - (cond - ((or (atom form) (ert--special-operator-p (car form))) - (let ((value (ert--gensym "value-"))) - `(let ((,value (ert--gensym "ert-form-evaluation-aborted-"))) - ,(funcall inner-expander - `(setq ,value ,form) - `(list ',whole :form ',form :value ,value) - value) - ,value))) - (t - (let ((fn-name (car form)) - (arg-forms (cdr form))) - (assert (or (symbolp fn-name) - (and (consp fn-name) - (eql (car fn-name) 'lambda) - (listp (cdr fn-name))))) - (let ((fn (ert--gensym "fn-")) - (args (ert--gensym "args-")) - (value (ert--gensym "value-")) - (default-value (ert--gensym "ert-form-evaluation-aborted-"))) - `(let ((,fn (function ,fn-name)) - (,args (list ,@arg-forms))) - (let ((,value ',default-value)) - ,(funcall inner-expander - `(setq ,value (apply ,fn ,args)) - `(nconc (list ',whole) - (list :form `(,,fn ,@,args)) - (unless (eql ,value ',default-value) - (list :value ,value)) - (let ((-explainer- - (and (symbolp ',fn-name) - (get ',fn-name 'ert-explainer)))) - (when -explainer- - (list :explanation - (apply -explainer- ,args))))) - value) - ,value)))))))) - -(defun ert--expand-should (whole form inner-expander) - "Helper function for the `should' macro and its variants. - -Analyzes FORM and returns an expression that has the same -semantics under evaluation but records additional debugging -information. - -INNER-EXPANDER should be a function and is called with two -arguments: INNER-FORM and FORM-DESCRIPTION-FORM, where INNER-FORM -is an expression equivalent to FORM, and FORM-DESCRIPTION-FORM is -an expression that returns a description of FORM. INNER-EXPANDER -should return code that calls INNER-FORM and performs the checks -and error signalling specific to the particular variant of -`should'. The code that INNER-EXPANDER returns must not call -FORM-DESCRIPTION-FORM before it has called INNER-FORM." - (lexical-let ((inner-expander inner-expander)) - (ert--expand-should-1 - whole form - (lambda (inner-form form-description-form value-var) - (let ((form-description (ert--gensym "form-description-"))) - `(let (,form-description) - ,(funcall inner-expander - `(unwind-protect - ,inner-form - (setq ,form-description ,form-description-form) - (ert--signal-should-execution ,form-description)) - `,form-description - value-var))))))) - -(defmacro* should (form) - "Evaluate FORM. If it returns nil, abort the current test as failed. - -Returns the value of FORM." - (ert--expand-should `(should ,form) form - (lambda (inner-form form-description-form value-var) - `(unless ,inner-form - (ert-fail ,form-description-form))))) - -(defmacro* should-not (form) - "Evaluate FORM. If it returns non-nil, abort the current test as failed. - -Returns nil." - (ert--expand-should `(should-not ,form) form - (lambda (inner-form form-description-form value-var) - `(unless (not ,inner-form) - (ert-fail ,form-description-form))))) - -(defun ert--should-error-handle-error (form-description-fn - condition type exclude-subtypes) - "Helper function for `should-error'. - -Determines whether CONDITION matches TYPE and EXCLUDE-SUBTYPES, -and aborts the current test as failed if it doesn't." - (let ((signalled-conditions (get (car condition) 'error-conditions)) - (handled-conditions (etypecase type - (list type) - (symbol (list type))))) - (assert signalled-conditions) - (unless (ert--intersection signalled-conditions handled-conditions) - (ert-fail (append - (funcall form-description-fn) - (list - :condition condition - :fail-reason (concat "the error signalled did not" - " have the expected type"))))) - (when exclude-subtypes - (unless (member (car condition) handled-conditions) - (ert-fail (append - (funcall form-description-fn) - (list - :condition condition - :fail-reason (concat "the error signalled was a subtype" - " of the expected type")))))))) - -;; FIXME: The expansion will evaluate the keyword args (if any) in -;; nonstandard order. -(defmacro* should-error (form &rest keys &key type exclude-subtypes) - "Evaluate FORM and check that it signals an error. - -The error signalled needs to match TYPE. TYPE should be a list -of condition names. (It can also be a non-nil symbol, which is -equivalent to a singleton list containing that symbol.) If -EXCLUDE-SUBTYPES is nil, the error matches TYPE if one of its -condition names is an element of TYPE. If EXCLUDE-SUBTYPES is -non-nil, the error matches TYPE if it is an element of TYPE. - -If the error matches, returns (ERROR-SYMBOL . DATA) from the -error. If not, or if no error was signalled, abort the test as -failed." - (unless type (setq type ''error)) - (ert--expand-should - `(should-error ,form ,@keys) - form - (lambda (inner-form form-description-form value-var) - (let ((errorp (ert--gensym "errorp")) - (form-description-fn (ert--gensym "form-description-fn-"))) - `(let ((,errorp nil) - (,form-description-fn (lambda () ,form-description-form))) - (condition-case -condition- - ,inner-form - ;; We can't use ,type here because we want to evaluate it. - (error - (setq ,errorp t) - (ert--should-error-handle-error ,form-description-fn - -condition- - ,type ,exclude-subtypes) - (setq ,value-var -condition-))) - (unless ,errorp - (ert-fail (append - (funcall ,form-description-fn) - (list - :fail-reason "did not signal an error"))))))))) - - -;;; Explanation of `should' failures. - -;; TODO(ohler): Rework explanations so that they are displayed in a -;; similar way to `ert-info' messages; in particular, allow text -;; buttons in explanations that give more detail or open an ediff -;; buffer. Perhaps explanations should be reported through `ert-info' -;; rather than as part of the condition. - -(defun ert--proper-list-p (x) - "Return non-nil if X is a proper list, nil otherwise." - (loop - for firstp = t then nil - for fast = x then (cddr fast) - for slow = x then (cdr slow) do - (when (null fast) (return t)) - (when (not (consp fast)) (return nil)) - (when (null (cdr fast)) (return t)) - (when (not (consp (cdr fast))) (return nil)) - (when (and (not firstp) (eq fast slow)) (return nil)))) - -(defun ert--explain-format-atom (x) - "Format the atom X for `ert--explain-not-equal'." - (typecase x - (fixnum (list x (format "#x%x" x) (format "?%c" x))) - (t x))) - -(defun ert--explain-not-equal (a b) - "Explainer function for `equal'. - -Returns a programmer-readable explanation of why A and B are not -`equal', or nil if they are." - (if (not (equal (type-of a) (type-of b))) - `(different-types ,a ,b) - (etypecase a - (cons - (let ((a-proper-p (ert--proper-list-p a)) - (b-proper-p (ert--proper-list-p b))) - (if (not (eql (not a-proper-p) (not b-proper-p))) - `(one-list-proper-one-improper ,a ,b) - (if a-proper-p - (if (not (equal (length a) (length b))) - `(proper-lists-of-different-length ,(length a) ,(length b) - ,a ,b - first-mismatch-at - ,(ert--mismatch a b)) - (loop for i from 0 - for ai in a - for bi in b - for xi = (ert--explain-not-equal ai bi) - do (when xi (return `(list-elt ,i ,xi))) - finally (assert (equal a b) t))) - (let ((car-x (ert--explain-not-equal (car a) (car b)))) - (if car-x - `(car ,car-x) - (let ((cdr-x (ert--explain-not-equal (cdr a) (cdr b)))) - (if cdr-x - `(cdr ,cdr-x) - (assert (equal a b) t) - nil)))))))) - (array (if (not (equal (length a) (length b))) - `(arrays-of-different-length ,(length a) ,(length b) - ,a ,b - ,@(unless (char-table-p a) - `(first-mismatch-at - ,(ert--mismatch a b)))) - (loop for i from 0 - for ai across a - for bi across b - for xi = (ert--explain-not-equal ai bi) - do (when xi (return `(array-elt ,i ,xi))) - finally (assert (equal a b) t)))) - (atom (if (not (equal a b)) - (if (and (symbolp a) (symbolp b) (string= a b)) - `(different-symbols-with-the-same-name ,a ,b) - `(different-atoms ,(ert--explain-format-atom a) - ,(ert--explain-format-atom b))) - nil))))) -(put 'equal 'ert-explainer 'ert--explain-not-equal) - -(defun ert--significant-plist-keys (plist) - "Return the keys of PLIST that have non-null values, in order." - (assert (zerop (mod (length plist) 2)) t) - (loop for (key value . rest) on plist by #'cddr - unless (or (null value) (memq key accu)) collect key into accu - finally (return accu))) - -(defun ert--plist-difference-explanation (a b) - "Return a programmer-readable explanation of why A and B are different plists. - -Returns nil if they are equivalent, i.e., have the same value for -each key, where absent values are treated as nil. The order of -key/value pairs in each list does not matter." - (assert (zerop (mod (length a) 2)) t) - (assert (zerop (mod (length b) 2)) t) - ;; Normalizing the plists would be another way to do this but it - ;; requires a total ordering on all lisp objects (since any object - ;; is valid as a text property key). Perhaps defining such an - ;; ordering is useful in other contexts, too, but it's a lot of - ;; work, so let's punt on it for now. - (let* ((keys-a (ert--significant-plist-keys a)) - (keys-b (ert--significant-plist-keys b)) - (keys-in-a-not-in-b (ert--set-difference-eq keys-a keys-b)) - (keys-in-b-not-in-a (ert--set-difference-eq keys-b keys-a))) - (flet ((explain-with-key (key) - (let ((value-a (plist-get a key)) - (value-b (plist-get b key))) - (assert (not (equal value-a value-b)) t) - `(different-properties-for-key - ,key ,(ert--explain-not-equal-including-properties value-a - value-b))))) - (cond (keys-in-a-not-in-b - (explain-with-key (first keys-in-a-not-in-b))) - (keys-in-b-not-in-a - (explain-with-key (first keys-in-b-not-in-a))) - (t - (loop for key in keys-a - when (not (equal (plist-get a key) (plist-get b key))) - return (explain-with-key key))))))) - -(defun ert--abbreviate-string (s len suffixp) - "Shorten string S to at most LEN chars. - -If SUFFIXP is non-nil, returns a suffix of S, otherwise a prefix." - (let ((n (length s))) - (cond ((< n len) - s) - (suffixp - (substring s (- n len))) - (t - (substring s 0 len))))) - -(defun ert--explain-not-equal-including-properties (a b) - "Explainer function for `ert-equal-including-properties'. - -Returns a programmer-readable explanation of why A and B are not -`ert-equal-including-properties', or nil if they are." - (if (not (equal a b)) - (ert--explain-not-equal a b) - (assert (stringp a) t) - (assert (stringp b) t) - (assert (eql (length a) (length b)) t) - (loop for i from 0 to (length a) - for props-a = (text-properties-at i a) - for props-b = (text-properties-at i b) - for difference = (ert--plist-difference-explanation props-a props-b) - do (when difference - (return `(char ,i ,(substring-no-properties a i (1+ i)) - ,difference - context-before - ,(ert--abbreviate-string - (substring-no-properties a 0 i) - 10 t) - context-after - ,(ert--abbreviate-string - (substring-no-properties a (1+ i)) - 10 nil)))) - ;; TODO(ohler): Get `equal-including-properties' fixed in - ;; Emacs, delete `ert-equal-including-properties', and - ;; re-enable this assertion. - ;;finally (assert (equal-including-properties a b) t) - ))) -(put 'ert-equal-including-properties - 'ert-explainer - 'ert--explain-not-equal-including-properties) - - -;;; Implementation of `ert-info'. - -;; TODO(ohler): The name `info' clashes with -;; `ert--test-execution-info'. One or both should be renamed. -(defvar ert--infos '() - "The stack of `ert-info' infos that currently apply. - -Bound dynamically. This is a list of (PREFIX . MESSAGE) pairs.") - -(defmacro* ert-info ((message-form &key ((:prefix prefix-form) "Info: ")) - &body body) - "Evaluate MESSAGE-FORM and BODY, and report the message if BODY fails. - -To be used within ERT tests. MESSAGE-FORM should evaluate to a -string that will be displayed together with the test result if -the test fails. PREFIX-FORM should evaluate to a string as well -and is displayed in front of the value of MESSAGE-FORM." - (declare (debug ((form &rest [sexp form]) body)) - (indent 1)) - `(let ((ert--infos (cons (cons ,prefix-form ,message-form) ert--infos))) - ,@body)) - - - -;;; Facilities for running a single test. - -(defvar ert-debug-on-error nil - "Non-nil means enter debugger when a test fails or terminates with an error.") - -;; The data structures that represent the result of running a test. -(defstruct ert-test-result - (messages nil) - (should-forms nil) - ) -(defstruct (ert-test-passed (:include ert-test-result))) -(defstruct (ert-test-result-with-condition (:include ert-test-result)) - (condition (assert nil)) - (backtrace (assert nil)) - (infos (assert nil))) -(defstruct (ert-test-quit (:include ert-test-result-with-condition))) -(defstruct (ert-test-failed (:include ert-test-result-with-condition))) -(defstruct (ert-test-aborted-with-non-local-exit (:include ert-test-result))) - - -(defun ert--record-backtrace () - "Record the current backtrace (as a list) and return it." - ;; Since the backtrace is stored in the result object, result - ;; objects must only be printed with appropriate limits - ;; (`print-level' and `print-length') in place. For interactive - ;; use, the cost of ensuring this possibly outweighs the advantage - ;; of storing the backtrace for - ;; `ert-results-pop-to-backtrace-for-test-at-point' given that we - ;; already have `ert-results-rerun-test-debugging-errors-at-point'. - ;; For batch use, however, printing the backtrace may be useful. - (loop - ;; 6 is the number of frames our own debugger adds (when - ;; compiled; more when interpreted). FIXME: Need to describe a - ;; procedure for determining this constant. - for i from 6 - for frame = (backtrace-frame i) - while frame - collect frame)) - -(defun ert--print-backtrace (backtrace) - "Format the backtrace BACKTRACE to the current buffer." - ;; This is essentially a reimplementation of Fbacktrace - ;; (src/eval.c), but for a saved backtrace, not the current one. - (let ((print-escape-newlines t) - (print-level 8) - (print-length 50)) - (dolist (frame backtrace) - (ecase (first frame) - ((nil) - ;; Special operator. - (destructuring-bind (special-operator &rest arg-forms) - (cdr frame) - (insert - (format " %S\n" (list* special-operator arg-forms))))) - ((t) - ;; Function call. - (destructuring-bind (fn &rest args) (cdr frame) - (insert (format " %S(" fn)) - (loop for firstp = t then nil - for arg in args do - (unless firstp - (insert " ")) - (insert (format "%S" arg))) - (insert ")\n"))))))) - -;; A container for the state of the execution of a single test and -;; environment data needed during its execution. -(defstruct ert--test-execution-info - (test (assert nil)) - (result (assert nil)) - ;; A thunk that may be called when RESULT has been set to its final - ;; value and test execution should be terminated. Should not - ;; return. - (exit-continuation (assert nil)) - ;; The binding of `debugger' outside of the execution of the test. - next-debugger - ;; The binding of `ert-debug-on-error' that is in effect for the - ;; execution of the current test. We store it to avoid being - ;; affected by any new bindings the test itself may establish. (I - ;; don't remember whether this feature is important.) - ert-debug-on-error) - -(defun ert--run-test-debugger (info debugger-args) - "During a test run, `debugger' is bound to a closure that calls this function. - -This function records failures and errors and either terminates -the test silently or calls the interactive debugger, as -appropriate. - -INFO is the ert--test-execution-info corresponding to this test -run. DEBUGGER-ARGS are the arguments to `debugger'." - (destructuring-bind (first-debugger-arg &rest more-debugger-args) - debugger-args - (ecase first-debugger-arg - ((lambda debug t exit nil) - (apply (ert--test-execution-info-next-debugger info) debugger-args)) - (error - (let* ((condition (first more-debugger-args)) - (type (case (car condition) - ((quit) 'quit) - (otherwise 'failed))) - (backtrace (ert--record-backtrace)) - (infos (reverse ert--infos))) - (setf (ert--test-execution-info-result info) - (ecase type - (quit - (make-ert-test-quit :condition condition - :backtrace backtrace - :infos infos)) - (failed - (make-ert-test-failed :condition condition - :backtrace backtrace - :infos infos)))) - ;; Work around Emacs' heuristic (in eval.c) for detecting - ;; errors in the debugger. - (incf num-nonmacro-input-events) - ;; FIXME: We should probably implement more fine-grained - ;; control a la non-t `debug-on-error' here. - (cond - ((ert--test-execution-info-ert-debug-on-error info) - (apply (ert--test-execution-info-next-debugger info) debugger-args)) - (t)) - (funcall (ert--test-execution-info-exit-continuation info))))))) - -(defun ert--run-test-internal (ert-test-execution-info) - "Low-level function to run a test according to ERT-TEST-EXECUTION-INFO. - -This mainly sets up debugger-related bindings." - (lexical-let ((info ert-test-execution-info)) - (setf (ert--test-execution-info-next-debugger info) debugger - (ert--test-execution-info-ert-debug-on-error info) ert-debug-on-error) - (catch 'ert--pass - ;; For now, each test gets its own temp buffer and its own - ;; window excursion, just to be safe. If this turns out to be - ;; too expensive, we can remove it. - (with-temp-buffer - (save-window-excursion - (let ((debugger (lambda (&rest debugger-args) - (ert--run-test-debugger info debugger-args))) - (debug-on-error t) - (debug-on-quit t) - ;; FIXME: Do we need to store the old binding of this - ;; and consider it in `ert--run-test-debugger'? - (debug-ignored-errors nil) - (ert--infos '())) - (funcall (ert-test-body (ert--test-execution-info-test info)))))) - (ert-pass)) - (setf (ert--test-execution-info-result info) (make-ert-test-passed))) - nil) - -(defun ert--force-message-log-buffer-truncation () - "Immediately truncate *Messages* buffer according to `message-log-max'. - -This can be useful after reducing the value of `message-log-max'." - (with-current-buffer (get-buffer-create "*Messages*") - ;; This is a reimplementation of this part of message_dolog() in xdisp.c: - ;; if (NATNUMP (Vmessage_log_max)) - ;; { - ;; scan_newline (Z, Z_BYTE, BEG, BEG_BYTE, - ;; -XFASTINT (Vmessage_log_max) - 1, 0); - ;; del_range_both (BEG, BEG_BYTE, PT, PT_BYTE, 0); - ;; } - (when (and (integerp message-log-max) (>= message-log-max 0)) - (let ((begin (point-min)) - (end (save-excursion - (goto-char (point-max)) - (forward-line (- message-log-max)) - (point)))) - (delete-region begin end))))) - -(defvar ert--running-tests nil - "List of tests that are currently in execution. - -This list is empty while no test is running, has one element -while a test is running, two elements while a test run from -inside a test is running, etc. The list is in order of nesting, -innermost test first. - -The elements are of type `ert-test'.") - -(defun ert-run-test (ert-test) - "Run ERT-TEST. - -Returns the result and stores it in ERT-TEST's `most-recent-result' slot." - (setf (ert-test-most-recent-result ert-test) nil) - (block error - (lexical-let ((begin-marker - (with-current-buffer (get-buffer-create "*Messages*") - (set-marker (make-marker) (point-max))))) - (unwind-protect - (lexical-let ((info (make-ert--test-execution-info - :test ert-test - :result - (make-ert-test-aborted-with-non-local-exit) - :exit-continuation (lambda () - (return-from error nil)))) - (should-form-accu (list))) - (unwind-protect - (let ((ert--should-execution-observer - (lambda (form-description) - (push form-description should-form-accu))) - (message-log-max t) - (ert--running-tests (cons ert-test ert--running-tests))) - (ert--run-test-internal info)) - (let ((result (ert--test-execution-info-result info))) - (setf (ert-test-result-messages result) - (with-current-buffer (get-buffer-create "*Messages*") - (buffer-substring begin-marker (point-max)))) - (ert--force-message-log-buffer-truncation) - (setq should-form-accu (nreverse should-form-accu)) - (setf (ert-test-result-should-forms result) - should-form-accu) - (setf (ert-test-most-recent-result ert-test) result)))) - (set-marker begin-marker nil)))) - (ert-test-most-recent-result ert-test)) - -(defun ert-running-test () - "Return the top-level test currently executing." - (car (last ert--running-tests))) - - -;;; Test selectors. - -(defun ert-test-result-type-p (result result-type) - "Return non-nil if RESULT matches type RESULT-TYPE. - -Valid result types: - -nil -- Never matches. -t -- Always matches. -:failed, :passed -- Matches corresponding results. -\(and TYPES...\) -- Matches if all TYPES match. -\(or TYPES...\) -- Matches if some TYPES match. -\(not TYPE\) -- Matches if TYPE does not match. -\(satisfies PREDICATE\) -- Matches if PREDICATE returns true when called with - RESULT." - ;; It would be easy to add `member' and `eql' types etc., but I - ;; haven't bothered yet. - (etypecase result-type - ((member nil) nil) - ((member t) t) - ((member :failed) (ert-test-failed-p result)) - ((member :passed) (ert-test-passed-p result)) - (cons - (destructuring-bind (operator &rest operands) result-type - (ecase operator - (and - (case (length operands) - (0 t) - (t - (and (ert-test-result-type-p result (first operands)) - (ert-test-result-type-p result `(and ,@(rest operands))))))) - (or - (case (length operands) - (0 nil) - (t - (or (ert-test-result-type-p result (first operands)) - (ert-test-result-type-p result `(or ,@(rest operands))))))) - (not - (assert (eql (length operands) 1)) - (not (ert-test-result-type-p result (first operands)))) - (satisfies - (assert (eql (length operands) 1)) - (funcall (first operands) result))))))) - -(defun ert-test-result-expected-p (test result) - "Return non-nil if TEST's expected result type matches RESULT." - (ert-test-result-type-p result (ert-test-expected-result-type test))) - -(defun ert-select-tests (selector universe) - "Return the tests that match SELECTOR. - -UNIVERSE specifies the set of tests to select from; it should be -a list of tests, or t, which refers to all tests named by symbols -in `obarray'. - -Returns the set of tests as a list. - -Valid selectors: - -nil -- Selects the empty set. -t -- Selects UNIVERSE. -:new -- Selects all tests that have not been run yet. -:failed, :passed -- Select tests according to their most recent result. -:expected, :unexpected -- Select tests according to their most recent result. -a string -- Selects all tests that have a name that matches the string, - a regexp. -a test -- Selects that test. -a symbol -- Selects the test that the symbol names, errors if none. -\(member TESTS...\) -- Selects TESTS, a list of tests or symbols naming tests. -\(eql TEST\) -- Selects TEST, a test or a symbol naming a test. -\(and SELECTORS...\) -- Selects the tests that match all SELECTORS. -\(or SELECTORS...\) -- Selects the tests that match any SELECTOR. -\(not SELECTOR\) -- Selects all tests that do not match SELECTOR. -\(tag TAG) -- Selects all tests that have TAG on their tags list. -\(satisfies PREDICATE\) -- Selects all tests that satisfy PREDICATE. - -Only selectors that require a superset of tests, such -as (satisfies ...), strings, :new, etc. make use of UNIVERSE. -Selectors that do not, such as \(member ...\), just return the -set implied by them without checking whether it is really -contained in UNIVERSE." - ;; This code needs to match the etypecase in - ;; `ert-insert-human-readable-selector'. - (etypecase selector - ((member nil) nil) - ((member t) (etypecase universe - (list universe) - ((member t) (ert-select-tests "" universe)))) - ((member :new) (ert-select-tests - `(satisfies ,(lambda (test) - (null (ert-test-most-recent-result test)))) - universe)) - ((member :failed) (ert-select-tests - `(satisfies ,(lambda (test) - (ert-test-result-type-p - (ert-test-most-recent-result test) - ':failed))) - universe)) - ((member :passed) (ert-select-tests - `(satisfies ,(lambda (test) - (ert-test-result-type-p - (ert-test-most-recent-result test) - ':passed))) - universe)) - ((member :expected) (ert-select-tests - `(satisfies - ,(lambda (test) - (ert-test-result-expected-p - test - (ert-test-most-recent-result test)))) - universe)) - ((member :unexpected) (ert-select-tests `(not :expected) universe)) - (string - (etypecase universe - ((member t) (mapcar #'ert-get-test - (apropos-internal selector #'ert-test-boundp))) - (list (ert--remove-if-not (lambda (test) - (and (ert-test-name test) - (string-match selector - (ert-test-name test)))) - universe)))) - (ert-test (list selector)) - (symbol - (assert (ert-test-boundp selector)) - (list (ert-get-test selector))) - (cons - (destructuring-bind (operator &rest operands) selector - (ecase operator - (member - (mapcar (lambda (purported-test) - (etypecase purported-test - (symbol (assert (ert-test-boundp purported-test)) - (ert-get-test purported-test)) - (ert-test purported-test))) - operands)) - (eql - (assert (eql (length operands) 1)) - (ert-select-tests `(member ,@operands) universe)) - (and - ;; Do these definitions of AND, NOT and OR satisfy de - ;; Morgan's laws? Should they? - (case (length operands) - (0 (ert-select-tests 't universe)) - (t (ert-select-tests `(and ,@(rest operands)) - (ert-select-tests (first operands) - universe))))) - (not - (assert (eql (length operands) 1)) - (let ((all-tests (ert-select-tests 't universe))) - (ert--set-difference all-tests - (ert-select-tests (first operands) - all-tests)))) - (or - (case (length operands) - (0 (ert-select-tests 'nil universe)) - (t (ert--union (ert-select-tests (first operands) universe) - (ert-select-tests `(or ,@(rest operands)) - universe))))) - (tag - (assert (eql (length operands) 1)) - (let ((tag (first operands))) - (ert-select-tests `(satisfies - ,(lambda (test) - (member tag (ert-test-tags test)))) - universe))) - (satisfies - (assert (eql (length operands) 1)) - (ert--remove-if-not (first operands) - (ert-select-tests 't universe)))))))) - -(defun ert--insert-human-readable-selector (selector) - "Insert a human-readable presentation of SELECTOR into the current buffer." - ;; This is needed to avoid printing the (huge) contents of the - ;; `backtrace' slot of the result objects in the - ;; `most-recent-result' slots of test case objects in (eql ...) or - ;; (member ...) selectors. - (labels ((rec (selector) - ;; This code needs to match the etypecase in `ert-select-tests'. - (etypecase selector - ((or (member nil t - :new :failed :passed - :expected :unexpected) - string - symbol) - selector) - (ert-test - (if (ert-test-name selector) - (make-symbol (format "<%S>" (ert-test-name selector))) - (make-symbol ""))) - (cons - (destructuring-bind (operator &rest operands) selector - (ecase operator - ((member eql and not or) - `(,operator ,@(mapcar #'rec operands))) - ((member tag satisfies) - selector))))))) - (insert (format "%S" (rec selector))))) - - -;;; Facilities for running a whole set of tests. - -;; The data structure that contains the set of tests being executed -;; during one particular test run, their results, the state of the -;; execution, and some statistics. -;; -;; The data about results and expected results of tests may seem -;; redundant here, since the test objects also carry such information. -;; However, the information in the test objects may be more recent, it -;; may correspond to a different test run. We need the information -;; that corresponds to this run in order to be able to update the -;; statistics correctly when a test is re-run interactively and has a -;; different result than before. -(defstruct ert--stats - (selector (assert nil)) - ;; The tests, in order. - (tests (assert nil) :type vector) - ;; A map of test names (or the test objects themselves for unnamed - ;; tests) to indices into the `tests' vector. - (test-map (assert nil) :type hash-table) - ;; The results of the tests during this run, in order. - (test-results (assert nil) :type vector) - ;; The start times of the tests, in order, as reported by - ;; `current-time'. - (test-start-times (assert nil) :type vector) - ;; The end times of the tests, in order, as reported by - ;; `current-time'. - (test-end-times (assert nil) :type vector) - (passed-expected 0) - (passed-unexpected 0) - (failed-expected 0) - (failed-unexpected 0) - (start-time nil) - (end-time nil) - (aborted-p nil) - (current-test nil) - ;; The time at or after which the next redisplay should occur, as a - ;; float. - (next-redisplay 0.0)) - -(defun ert-stats-completed-expected (stats) - "Return the number of tests in STATS that had expected results." - (+ (ert--stats-passed-expected stats) - (ert--stats-failed-expected stats))) - -(defun ert-stats-completed-unexpected (stats) - "Return the number of tests in STATS that had unexpected results." - (+ (ert--stats-passed-unexpected stats) - (ert--stats-failed-unexpected stats))) - -(defun ert-stats-completed (stats) - "Number of tests in STATS that have run so far." - (+ (ert-stats-completed-expected stats) - (ert-stats-completed-unexpected stats))) - -(defun ert-stats-total (stats) - "Number of tests in STATS, regardless of whether they have run yet." - (length (ert--stats-tests stats))) - -;; The stats object of the current run, dynamically bound. This is -;; used for the mode line progress indicator. -(defvar ert--current-run-stats nil) - -(defun ert--stats-test-key (test) - "Return the key used for TEST in the test map of ert--stats objects. - -Returns the name of TEST if it has one, or TEST itself otherwise." - (or (ert-test-name test) test)) - -(defun ert--stats-set-test-and-result (stats pos test result) - "Change STATS by replacing the test at position POS with TEST and RESULT. - -Also changes the counters in STATS to match." - (let* ((tests (ert--stats-tests stats)) - (results (ert--stats-test-results stats)) - (old-test (aref tests pos)) - (map (ert--stats-test-map stats))) - (flet ((update (d) - (if (ert-test-result-expected-p (aref tests pos) - (aref results pos)) - (etypecase (aref results pos) - (ert-test-passed (incf (ert--stats-passed-expected stats) d)) - (ert-test-failed (incf (ert--stats-failed-expected stats) d)) - (null) - (ert-test-aborted-with-non-local-exit)) - (etypecase (aref results pos) - (ert-test-passed (incf (ert--stats-passed-unexpected stats) d)) - (ert-test-failed (incf (ert--stats-failed-unexpected stats) d)) - (null) - (ert-test-aborted-with-non-local-exit))))) - ;; Adjust counters to remove the result that is currently in stats. - (update -1) - ;; Put new test and result into stats. - (setf (aref tests pos) test - (aref results pos) result) - (remhash (ert--stats-test-key old-test) map) - (setf (gethash (ert--stats-test-key test) map) pos) - ;; Adjust counters to match new result. - (update +1) - nil))) - -(defun ert--make-stats (tests selector) - "Create a new `ert--stats' object for running TESTS. - -SELECTOR is the selector that was used to select TESTS." - (setq tests (ert--coerce-to-vector tests)) - (let ((map (make-hash-table :size (length tests)))) - (loop for i from 0 - for test across tests - for key = (ert--stats-test-key test) do - (assert (not (gethash key map))) - (setf (gethash key map) i)) - (make-ert--stats :selector selector - :tests tests - :test-map map - :test-results (make-vector (length tests) nil) - :test-start-times (make-vector (length tests) nil) - :test-end-times (make-vector (length tests) nil)))) - -(defun ert-run-or-rerun-test (stats test listener) - ;; checkdoc-order: nil - "Run the single test TEST and record the result using STATS and LISTENER." - (let ((ert--current-run-stats stats) - (pos (ert--stats-test-pos stats test))) - (ert--stats-set-test-and-result stats pos test nil) - ;; Call listener after setting/before resetting - ;; (ert--stats-current-test stats); the listener might refresh the - ;; mode line display, and if the value is not set yet/any more - ;; during this refresh, the mode line will flicker unnecessarily. - (setf (ert--stats-current-test stats) test) - (funcall listener 'test-started stats test) - (setf (ert-test-most-recent-result test) nil) - (setf (aref (ert--stats-test-start-times stats) pos) (current-time)) - (unwind-protect - (ert-run-test test) - (setf (aref (ert--stats-test-end-times stats) pos) (current-time)) - (let ((result (ert-test-most-recent-result test))) - (ert--stats-set-test-and-result stats pos test result) - (funcall listener 'test-ended stats test result)) - (setf (ert--stats-current-test stats) nil)))) - -(defun ert-run-tests (selector listener) - "Run the tests specified by SELECTOR, sending progress updates to LISTENER." - (let* ((tests (ert-select-tests selector t)) - (stats (ert--make-stats tests selector))) - (setf (ert--stats-start-time stats) (current-time)) - (funcall listener 'run-started stats) - (let ((abortedp t)) - (unwind-protect - (let ((ert--current-run-stats stats)) - (force-mode-line-update) - (unwind-protect - (progn - (loop for test in tests do - (ert-run-or-rerun-test stats test listener)) - (setq abortedp nil)) - (setf (ert--stats-aborted-p stats) abortedp) - (setf (ert--stats-end-time stats) (current-time)) - (funcall listener 'run-ended stats abortedp))) - (force-mode-line-update)) - stats))) - -(defun ert--stats-test-pos (stats test) - ;; checkdoc-order: nil - "Return the position (index) of TEST in the run represented by STATS." - (gethash (ert--stats-test-key test) (ert--stats-test-map stats))) - - -;;; Formatting functions shared across UIs. - -(defun ert--format-time-iso8601 (time) - "Format TIME in the variant of ISO 8601 used for timestamps in ERT." - (format-time-string "%Y-%m-%d %T%z" time)) - -(defun ert-char-for-test-result (result expectedp) - "Return a character that represents the test result RESULT. - -EXPECTEDP specifies whether the result was expected." - (let ((s (etypecase result - (ert-test-passed ".P") - (ert-test-failed "fF") - (null "--") - (ert-test-aborted-with-non-local-exit "aA")))) - (elt s (if expectedp 0 1)))) - -(defun ert-string-for-test-result (result expectedp) - "Return a string that represents the test result RESULT. - -EXPECTEDP specifies whether the result was expected." - (let ((s (etypecase result - (ert-test-passed '("passed" "PASSED")) - (ert-test-failed '("failed" "FAILED")) - (null '("unknown" "UNKNOWN")) - (ert-test-aborted-with-non-local-exit '("aborted" "ABORTED"))))) - (elt s (if expectedp 0 1)))) - -(defun ert--pp-with-indentation-and-newline (object) - "Pretty-print OBJECT, indenting it to the current column of point. -Ensures a final newline is inserted." - (let ((begin (point))) - (pp object (current-buffer)) - (unless (bolp) (insert "\n")) - (save-excursion - (goto-char begin) - (indent-sexp)))) - -(defun ert--insert-infos (result) - "Insert `ert-info' infos from RESULT into current buffer. - -RESULT must be an `ert-test-result-with-condition'." - (check-type result ert-test-result-with-condition) - (dolist (info (ert-test-result-with-condition-infos result)) - (destructuring-bind (prefix . message) info - (let ((begin (point)) - (indentation (make-string (+ (length prefix) 4) ?\s)) - (end nil)) - (unwind-protect - (progn - (insert message "\n") - (setq end (copy-marker (point))) - (goto-char begin) - (insert " " prefix) - (forward-line 1) - (while (< (point) end) - (insert indentation) - (forward-line 1))) - (when end (set-marker end nil))))))) - - -;;; Running tests in batch mode. - -(defvar ert-batch-backtrace-right-margin 70 - "*The maximum line length for printing backtraces in `ert-run-tests-batch'.") - -;;;###autoload -(defun ert-run-tests-batch (&optional selector) - "Run the tests specified by SELECTOR, printing results to the terminal. - -SELECTOR works as described in `ert-select-tests', except if -SELECTOR is nil, in which case all tests rather than none will be -run; this makes the command line \"emacs -batch -l my-tests.el -f -ert-run-tests-batch-and-exit\" useful. - -Returns the stats object." - (unless selector (setq selector 't)) - (ert-run-tests - selector - (lambda (event-type &rest event-args) - (ecase event-type - (run-started - (destructuring-bind (stats) event-args - (message "Running %s tests (%s)" - (length (ert--stats-tests stats)) - (ert--format-time-iso8601 (ert--stats-start-time stats))))) - (run-ended - (destructuring-bind (stats abortedp) event-args - (let ((unexpected (ert-stats-completed-unexpected stats)) - (expected-failures (ert--stats-failed-expected stats))) - (message "\n%sRan %s tests, %s results as expected%s (%s)%s\n" - (if (not abortedp) - "" - "Aborted: ") - (ert-stats-total stats) - (ert-stats-completed-expected stats) - (if (zerop unexpected) - "" - (format ", %s unexpected" unexpected)) - (ert--format-time-iso8601 (ert--stats-end-time stats)) - (if (zerop expected-failures) - "" - (format "\n%s expected failures" expected-failures))) - (unless (zerop unexpected) - (message "%s unexpected results:" unexpected) - (loop for test across (ert--stats-tests stats) - for result = (ert-test-most-recent-result test) do - (when (not (ert-test-result-expected-p test result)) - (message "%9s %S" - (ert-string-for-test-result result nil) - (ert-test-name test)))) - (message "%s" ""))))) - (test-started - ) - (test-ended - (destructuring-bind (stats test result) event-args - (unless (ert-test-result-expected-p test result) - (etypecase result - (ert-test-passed - (message "Test %S passed unexpectedly" (ert-test-name test))) - (ert-test-result-with-condition - (message "Test %S backtrace:" (ert-test-name test)) - (with-temp-buffer - (ert--print-backtrace (ert-test-result-with-condition-backtrace - result)) - (goto-char (point-min)) - (while (not (eobp)) - (let ((start (point)) - (end (progn (end-of-line) (point)))) - (setq end (min end - (+ start ert-batch-backtrace-right-margin))) - (message "%s" (buffer-substring-no-properties - start end))) - (forward-line 1))) - (with-temp-buffer - (ert--insert-infos result) - (insert " ") - (let ((print-escape-newlines t) - (print-level 5) - (print-length 10)) - (let ((begin (point))) - (ert--pp-with-indentation-and-newline - (ert-test-result-with-condition-condition result)))) - (goto-char (1- (point-max))) - (assert (looking-at "\n")) - (delete-char 1) - (message "Test %S condition:" (ert-test-name test)) - (message "%s" (buffer-string)))) - (ert-test-aborted-with-non-local-exit - (message "Test %S aborted with non-local exit" - (ert-test-name test))))) - (let* ((max (prin1-to-string (length (ert--stats-tests stats)))) - (format-string (concat "%9s %" - (prin1-to-string (length max)) - "s/" max " %S"))) - (message format-string - (ert-string-for-test-result result - (ert-test-result-expected-p - test result)) - (1+ (ert--stats-test-pos stats test)) - (ert-test-name test))))))))) - -;;;###autoload -(defun ert-run-tests-batch-and-exit (&optional selector) - "Like `ert-run-tests-batch', but exits Emacs when done. - -The exit status will be 0 if all test results were as expected, 1 -on unexpected results, or 2 if the framework detected an error -outside of the tests (e.g. invalid SELECTOR or bug in the code -that runs the tests)." - (unwind-protect - (let ((stats (ert-run-tests-batch selector))) - (kill-emacs (if (zerop (ert-stats-completed-unexpected stats)) 0 1))) - (unwind-protect - (progn - (message "Error running tests") - (backtrace)) - (kill-emacs 2)))) - - -;;; Utility functions for load/unload actions. - -(defun ert--activate-font-lock-keywords () - "Activate font-lock keywords for some of ERT's symbols." - (font-lock-add-keywords - nil - '(("(\\(\\\\s *\\(\\sw+\\)?" - (1 font-lock-keyword-face nil t) - (2 font-lock-function-name-face nil t))))) - -(defun* ert--remove-from-list (list-var element &key key test) - "Remove ELEMENT from the value of LIST-VAR if present. - -This can be used as an inverse of `add-to-list'." - (unless key (setq key #'identity)) - (unless test (setq test #'equal)) - (setf (symbol-value list-var) - (ert--remove* element - (symbol-value list-var) - :key key - :test test))) - - -;;; Some basic interactive functions. - -(defun ert-read-test-name (prompt &optional default history - add-default-to-prompt) - "Read the name of a test and return it as a symbol. - -Prompt with PROMPT. If DEFAULT is a valid test name, use it as a -default. HISTORY is the history to use; see `completing-read'. -If ADD-DEFAULT-TO-PROMPT is non-nil, PROMPT will be modified to -include the default, if any. - -Signals an error if no test name was read." - (etypecase default - (string (let ((symbol (intern-soft default))) - (unless (and symbol (ert-test-boundp symbol)) - (setq default nil)))) - (symbol (setq default - (if (ert-test-boundp default) - (symbol-name default) - nil))) - (ert-test (setq default (ert-test-name default)))) - (when add-default-to-prompt - (setq prompt (if (null default) - (format "%s: " prompt) - (format "%s (default %s): " prompt default)))) - (let ((input (completing-read prompt obarray #'ert-test-boundp - t nil history default nil))) - ;; completing-read returns an empty string if default was nil and - ;; the user just hit enter. - (let ((sym (intern-soft input))) - (if (ert-test-boundp sym) - sym - (error "Input does not name a test"))))) - -(defun ert-read-test-name-at-point (prompt) - "Read the name of a test and return it as a symbol. -As a default, use the symbol at point, or the test at point if in -the ERT results buffer. Prompt with PROMPT, augmented with the -default (if any)." - (ert-read-test-name prompt (ert-test-at-point) nil t)) - -(defun ert-find-test-other-window (test-name) - "Find, in another window, the definition of TEST-NAME." - (interactive (list (ert-read-test-name-at-point "Find test definition: "))) - (find-function-do-it test-name 'ert-deftest 'switch-to-buffer-other-window)) - -(defun ert-delete-test (test-name) - "Make the test TEST-NAME unbound. - -Nothing more than an interactive interface to `ert-make-test-unbound'." - (interactive (list (ert-read-test-name-at-point "Delete test"))) - (ert-make-test-unbound test-name)) - -(defun ert-delete-all-tests () - "Make all symbols in `obarray' name no test." - (interactive) - (when (interactive-p) - (unless (y-or-n-p "Delete all tests? ") - (error "Aborted"))) - ;; We can't use `ert-select-tests' here since that gives us only - ;; test objects, and going from them back to the test name symbols - ;; can fail if the `ert-test' defstruct has been redefined. - (mapc #'ert-make-test-unbound (apropos-internal "" #'ert-test-boundp)) - t) - - -;;; Display of test progress and results. - -;; An entry in the results buffer ewoc. There is one entry per test. -(defstruct ert--ewoc-entry - (test (assert nil)) - ;; If the result of this test was expected, its ewoc entry is hidden - ;; initially. - (hidden-p (assert nil)) - ;; An ewoc entry may be collapsed to hide details such as the error - ;; condition. - ;; - ;; I'm not sure the ability to expand and collapse entries is still - ;; a useful feature. - (expanded-p t) - ;; By default, the ewoc entry presents the error condition with - ;; certain limits on how much to print (`print-level', - ;; `print-length'). The user can interactively switch to a set of - ;; higher limits. - (extended-printer-limits-p nil)) - -;; Variables local to the results buffer. - -;; The ewoc. -(defvar ert--results-ewoc) -;; The stats object. -(defvar ert--results-stats) -;; A string with one character per test. Each character represents -;; the result of the corresponding test. The string is displayed near -;; the top of the buffer and serves as a progress bar. -(defvar ert--results-progress-bar-string) -;; The position where the progress bar button begins. -(defvar ert--results-progress-bar-button-begin) -;; The test result listener that updates the buffer when tests are run. -(defvar ert--results-listener) - -(defun ert-insert-test-name-button (test-name) - "Insert a button that links to TEST-NAME." - (insert-text-button (format "%S" test-name) - :type 'ert--test-name-button - 'ert-test-name test-name)) - -(defun ert--results-format-expected-unexpected (expected unexpected) - "Return a string indicating EXPECTED expected results, UNEXPECTED unexpected." - (if (zerop unexpected) - (format "%s" expected) - (format "%s (%s unexpected)" (+ expected unexpected) unexpected))) - -(defun ert--results-update-ewoc-hf (ewoc stats) - "Update the header and footer of EWOC to show certain information from STATS. - -Also sets `ert--results-progress-bar-button-begin'." - (let ((run-count (ert-stats-completed stats)) - (results-buffer (current-buffer)) - ;; Need to save buffer-local value. - (font-lock font-lock-mode)) - (ewoc-set-hf - ewoc - ;; header - (with-temp-buffer - (insert "Selector: ") - (ert--insert-human-readable-selector (ert--stats-selector stats)) - (insert "\n") - (insert - (format (concat "Passed: %s\n" - "Failed: %s\n" - "Total: %s/%s\n\n") - (ert--results-format-expected-unexpected - (ert--stats-passed-expected stats) - (ert--stats-passed-unexpected stats)) - (ert--results-format-expected-unexpected - (ert--stats-failed-expected stats) - (ert--stats-failed-unexpected stats)) - run-count - (ert-stats-total stats))) - (insert - (format "Started at: %s\n" - (ert--format-time-iso8601 (ert--stats-start-time stats)))) - ;; FIXME: This is ugly. Need to properly define invariants of - ;; the `stats' data structure. - (let ((state (cond ((ert--stats-aborted-p stats) 'aborted) - ((ert--stats-current-test stats) 'running) - ((ert--stats-end-time stats) 'finished) - (t 'preparing)))) - (ecase state - (preparing - (insert "")) - (aborted - (cond ((ert--stats-current-test stats) - (insert "Aborted during test: ") - (ert-insert-test-name-button - (ert-test-name (ert--stats-current-test stats)))) - (t - (insert "Aborted.")))) - (running - (assert (ert--stats-current-test stats)) - (insert "Running test: ") - (ert-insert-test-name-button (ert-test-name - (ert--stats-current-test stats)))) - (finished - (assert (not (ert--stats-current-test stats))) - (insert "Finished."))) - (insert "\n") - (if (ert--stats-end-time stats) - (insert - (format "%s%s\n" - (if (ert--stats-aborted-p stats) - "Aborted at: " - "Finished at: ") - (ert--format-time-iso8601 (ert--stats-end-time stats)))) - (insert "\n")) - (insert "\n")) - (let ((progress-bar-string (with-current-buffer results-buffer - ert--results-progress-bar-string))) - (let ((progress-bar-button-begin - (insert-text-button progress-bar-string - :type 'ert--results-progress-bar-button - 'face (or (and font-lock - (ert-face-for-stats stats)) - 'button)))) - ;; The header gets copied verbatim to the results buffer, - ;; and all positions remain the same, so - ;; `progress-bar-button-begin' will be the right position - ;; even in the results buffer. - (with-current-buffer results-buffer - (set (make-local-variable 'ert--results-progress-bar-button-begin) - progress-bar-button-begin)))) - (insert "\n\n") - (buffer-string)) - ;; footer - ;; - ;; We actually want an empty footer, but that would trigger a bug - ;; in ewoc, sometimes clearing the entire buffer. (It's possible - ;; that this bug has been fixed since this has been tested; we - ;; should test it again.) - "\n"))) - - -(defvar ert-test-run-redisplay-interval-secs .1 - "How many seconds ERT should wait between redisplays while running tests. - -While running tests, ERT shows the current progress, and this variable -determines how frequently the progress display is updated.") - -(defun ert--results-update-stats-display (ewoc stats) - "Update EWOC and the mode line to show data from STATS." - ;; TODO(ohler): investigate using `make-progress-reporter'. - (ert--results-update-ewoc-hf ewoc stats) - (force-mode-line-update) - (redisplay t) - (setf (ert--stats-next-redisplay stats) - (+ (float-time) ert-test-run-redisplay-interval-secs))) - -(defun ert--results-update-stats-display-maybe (ewoc stats) - "Call `ert--results-update-stats-display' if not called recently. - -EWOC and STATS are arguments for `ert--results-update-stats-display'." - (when (>= (float-time) (ert--stats-next-redisplay stats)) - (ert--results-update-stats-display ewoc stats))) - -(defun ert--tests-running-mode-line-indicator () - "Return a string for the mode line that shows the test run progress." - (let* ((stats ert--current-run-stats) - (tests-total (ert-stats-total stats)) - (tests-completed (ert-stats-completed stats))) - (if (>= tests-completed tests-total) - (format " ERT(%s/%s,finished)" tests-completed tests-total) - (format " ERT(%s/%s):%s" - (1+ tests-completed) - tests-total - (if (null (ert--stats-current-test stats)) - "?" - (format "%S" - (ert-test-name (ert--stats-current-test stats)))))))) - -(defun ert--make-xrefs-region (begin end) - "Attach cross-references to function names between BEGIN and END. - -BEGIN and END specify a region in the current buffer." - (save-excursion - (save-restriction - (narrow-to-region begin (point)) - ;; Inhibit optimization in `debugger-make-xrefs' that would - ;; sometimes insert unrelated backtrace info into our buffer. - (let ((debugger-previous-backtrace nil)) - (debugger-make-xrefs))))) - -(defun ert--string-first-line (s) - "Return the first line of S, or S if it contains no newlines. - -The return value does not include the line terminator." - (substring s 0 (ert--string-position ?\n s))) - -(defun ert-face-for-test-result (expectedp) - "Return a face that shows whether a test result was expected or unexpected. - -If EXPECTEDP is nil, returns the face for unexpected results; if -non-nil, returns the face for expected results.." - (if expectedp 'ert-test-result-expected 'ert-test-result-unexpected)) - -(defun ert-face-for-stats (stats) - "Return a face that represents STATS." - (cond ((ert--stats-aborted-p stats) 'nil) - ((plusp (ert-stats-completed-unexpected stats)) - (ert-face-for-test-result nil)) - ((eql (ert-stats-completed-expected stats) (ert-stats-total stats)) - (ert-face-for-test-result t)) - (t 'nil))) - -(defun ert--print-test-for-ewoc (entry) - "The ewoc print function for ewoc test entries. ENTRY is the entry to print." - (let* ((test (ert--ewoc-entry-test entry)) - (stats ert--results-stats) - (result (let ((pos (ert--stats-test-pos stats test))) - (assert pos) - (aref (ert--stats-test-results stats) pos))) - (hiddenp (ert--ewoc-entry-hidden-p entry)) - (expandedp (ert--ewoc-entry-expanded-p entry)) - (extended-printer-limits-p (ert--ewoc-entry-extended-printer-limits-p - entry))) - (cond (hiddenp) - (t - (let ((expectedp (ert-test-result-expected-p test result))) - (insert-text-button (format "%c" (ert-char-for-test-result - result expectedp)) - :type 'ert--results-expand-collapse-button - 'face (or (and font-lock-mode - (ert-face-for-test-result - expectedp)) - 'button))) - (insert " ") - (ert-insert-test-name-button (ert-test-name test)) - (insert "\n") - (when (and expandedp (not (eql result 'nil))) - (when (ert-test-documentation test) - (insert " " - (propertize - (ert--string-first-line (ert-test-documentation test)) - 'font-lock-face 'font-lock-doc-face) - "\n")) - (etypecase result - (ert-test-passed - (if (ert-test-result-expected-p test result) - (insert " passed\n") - (insert " passed unexpectedly\n")) - (insert "")) - (ert-test-result-with-condition - (ert--insert-infos result) - (let ((print-escape-newlines t) - (print-level (if extended-printer-limits-p 12 6)) - (print-length (if extended-printer-limits-p 100 10))) - (insert " ") - (let ((begin (point))) - (ert--pp-with-indentation-and-newline - (ert-test-result-with-condition-condition result)) - (ert--make-xrefs-region begin (point))))) - (ert-test-aborted-with-non-local-exit - (insert " aborted\n"))) - (insert "\n"))))) - nil) - -(defun ert--results-font-lock-function (enabledp) - "Redraw the ERT results buffer after font-lock-mode was switched on or off. - -ENABLEDP is true if font-lock-mode is switched on, false -otherwise." - (ert--results-update-ewoc-hf ert--results-ewoc ert--results-stats) - (ewoc-refresh ert--results-ewoc) - (font-lock-default-function enabledp)) - -(defun ert--setup-results-buffer (stats listener buffer-name) - "Set up a test results buffer. - -STATS is the stats object; LISTENER is the results listener; -BUFFER-NAME, if non-nil, is the buffer name to use." - (unless buffer-name (setq buffer-name "*ert*")) - (let ((buffer (get-buffer-create buffer-name))) - (with-current-buffer buffer - (setq buffer-read-only t) - (let ((inhibit-read-only t)) - (buffer-disable-undo) - (erase-buffer) - (ert-results-mode) - ;; Erase buffer again in case switching out of the previous - ;; mode inserted anything. (This happens e.g. when switching - ;; from ert-results-mode to ert-results-mode when - ;; font-lock-mode turns itself off in change-major-mode-hook.) - (erase-buffer) - (set (make-local-variable 'font-lock-function) - 'ert--results-font-lock-function) - (let ((ewoc (ewoc-create 'ert--print-test-for-ewoc nil nil t))) - (set (make-local-variable 'ert--results-ewoc) ewoc) - (set (make-local-variable 'ert--results-stats) stats) - (set (make-local-variable 'ert--results-progress-bar-string) - (make-string (ert-stats-total stats) - (ert-char-for-test-result nil t))) - (set (make-local-variable 'ert--results-listener) listener) - (loop for test across (ert--stats-tests stats) do - (ewoc-enter-last ewoc - (make-ert--ewoc-entry :test test :hidden-p t))) - (ert--results-update-ewoc-hf ert--results-ewoc ert--results-stats) - (goto-char (1- (point-max))) - buffer))))) - - -(defvar ert--selector-history nil - "List of recent test selectors read from terminal.") - -;; Should OUTPUT-BUFFER-NAME and MESSAGE-FN really be arguments here? -;; They are needed only for our automated self-tests at the moment. -;; Or should there be some other mechanism? -;;;###autoload -(defun ert-run-tests-interactively (selector - &optional output-buffer-name message-fn) - "Run the tests specified by SELECTOR and display the results in a buffer. - -SELECTOR works as described in `ert-select-tests'. -OUTPUT-BUFFER-NAME and MESSAGE-FN should normally be nil; they -are used for automated self-tests and specify which buffer to use -and how to display message." - (interactive - (list (let ((default (if ert--selector-history - ;; Can't use `first' here as this form is - ;; not compiled, and `first' is not - ;; defined without cl. - (car ert--selector-history) - "t"))) - (read-from-minibuffer (if (null default) - "Run tests: " - (format "Run tests (default %s): " default)) - nil nil t 'ert--selector-history - default nil)) - nil)) - (unless message-fn (setq message-fn 'message)) - (lexical-let ((output-buffer-name output-buffer-name) - buffer - listener - (message-fn message-fn)) - (setq listener - (lambda (event-type &rest event-args) - (ecase event-type - (run-started - (destructuring-bind (stats) event-args - (setq buffer (ert--setup-results-buffer stats - listener - output-buffer-name)) - (pop-to-buffer buffer))) - (run-ended - (destructuring-bind (stats abortedp) event-args - (funcall message-fn - "%sRan %s tests, %s results were as expected%s" - (if (not abortedp) - "" - "Aborted: ") - (ert-stats-total stats) - (ert-stats-completed-expected stats) - (let ((unexpected - (ert-stats-completed-unexpected stats))) - (if (zerop unexpected) - "" - (format ", %s unexpected" unexpected)))) - (ert--results-update-stats-display (with-current-buffer buffer - ert--results-ewoc) - stats))) - (test-started - (destructuring-bind (stats test) event-args - (with-current-buffer buffer - (let* ((ewoc ert--results-ewoc) - (pos (ert--stats-test-pos stats test)) - (node (ewoc-nth ewoc pos))) - (assert node) - (setf (ert--ewoc-entry-test (ewoc-data node)) test) - (aset ert--results-progress-bar-string pos - (ert-char-for-test-result nil t)) - (ert--results-update-stats-display-maybe ewoc stats) - (ewoc-invalidate ewoc node))))) - (test-ended - (destructuring-bind (stats test result) event-args - (with-current-buffer buffer - (let* ((ewoc ert--results-ewoc) - (pos (ert--stats-test-pos stats test)) - (node (ewoc-nth ewoc pos))) - (when (ert--ewoc-entry-hidden-p (ewoc-data node)) - (setf (ert--ewoc-entry-hidden-p (ewoc-data node)) - (ert-test-result-expected-p test result))) - (aset ert--results-progress-bar-string pos - (ert-char-for-test-result result - (ert-test-result-expected-p - test result))) - (ert--results-update-stats-display-maybe ewoc stats) - (ewoc-invalidate ewoc node)))))))) - (ert-run-tests - selector - listener))) -;;;###autoload -(defalias 'ert 'ert-run-tests-interactively) - - -;;; Simple view mode for auxiliary information like stack traces or -;;; messages. Mainly binds "q" for quit. - -(define-derived-mode ert-simple-view-mode fundamental-mode "ERT-View" - "Major mode for viewing auxiliary information in ERT.") - -(loop for (key binding) in - '(("q" quit-window) - ) - do - (define-key ert-simple-view-mode-map key binding)) - - -;;; Commands and button actions for the results buffer. - -(define-derived-mode ert-results-mode fundamental-mode "ERT-Results" - "Major mode for viewing results of ERT test runs.") - -(loop for (key binding) in - '(;; Stuff that's not in the menu. - ("\t" forward-button) - ([backtab] backward-button) - ("j" ert-results-jump-between-summary-and-result) - ("q" quit-window) - ("L" ert-results-toggle-printer-limits-for-test-at-point) - ("n" ert-results-next-test) - ("p" ert-results-previous-test) - ;; Stuff that is in the menu. - ("R" ert-results-rerun-all-tests) - ("r" ert-results-rerun-test-at-point) - ("d" ert-results-rerun-test-at-point-debugging-errors) - ("." ert-results-find-test-at-point-other-window) - ("b" ert-results-pop-to-backtrace-for-test-at-point) - ("m" ert-results-pop-to-messages-for-test-at-point) - ("l" ert-results-pop-to-should-forms-for-test-at-point) - ("h" ert-results-describe-test-at-point) - ("D" ert-delete-test) - ("T" ert-results-pop-to-timings) - ) - do - (define-key ert-results-mode-map key binding)) - -(easy-menu-define ert-results-mode-menu ert-results-mode-map - "Menu for `ert-results-mode'." - '("ERT Results" - ["Re-run all tests" ert-results-rerun-all-tests] - "--" - ["Re-run test" ert-results-rerun-test-at-point] - ["Debug test" ert-results-rerun-test-at-point-debugging-errors] - ["Show test definition" ert-results-find-test-at-point-other-window] - "--" - ["Show backtrace" ert-results-pop-to-backtrace-for-test-at-point] - ["Show messages" ert-results-pop-to-messages-for-test-at-point] - ["Show `should' forms" ert-results-pop-to-should-forms-for-test-at-point] - ["Describe test" ert-results-describe-test-at-point] - "--" - ["Delete test" ert-delete-test] - "--" - ["Show execution time of each test" ert-results-pop-to-timings] - )) - -(define-button-type 'ert--results-progress-bar-button - 'action #'ert--results-progress-bar-button-action - 'help-echo "mouse-2, RET: Reveal test result") - -(define-button-type 'ert--test-name-button - 'action #'ert--test-name-button-action - 'help-echo "mouse-2, RET: Find test definition") - -(define-button-type 'ert--results-expand-collapse-button - 'action #'ert--results-expand-collapse-button-action - 'help-echo "mouse-2, RET: Expand/collapse test result") - -(defun ert--results-test-node-or-null-at-point () - "If point is on a valid ewoc node, return it; return nil otherwise. - -To be used in the ERT results buffer." - (let* ((ewoc ert--results-ewoc) - (node (ewoc-locate ewoc))) - ;; `ewoc-locate' will return an arbitrary node when point is on - ;; header or footer, or when all nodes are invisible. So we need - ;; to validate its return value here. - ;; - ;; Update: I'm seeing nil being returned in some cases now, - ;; perhaps this has been changed? - (if (and node - (>= (point) (ewoc-location node)) - (not (ert--ewoc-entry-hidden-p (ewoc-data node)))) - node - nil))) - -(defun ert--results-test-node-at-point () - "If point is on a valid ewoc node, return it; signal an error otherwise. - -To be used in the ERT results buffer." - (or (ert--results-test-node-or-null-at-point) - (error "No test at point"))) - -(defun ert-results-next-test () - "Move point to the next test. - -To be used in the ERT results buffer." - (interactive) - (ert--results-move (ewoc-locate ert--results-ewoc) 'ewoc-next - "No tests below")) - -(defun ert-results-previous-test () - "Move point to the previous test. - -To be used in the ERT results buffer." - (interactive) - (ert--results-move (ewoc-locate ert--results-ewoc) 'ewoc-prev - "No tests above")) - -(defun ert--results-move (node ewoc-fn error-message) - "Move point from NODE to the previous or next node. - -EWOC-FN specifies the direction and should be either `ewoc-prev' -or `ewoc-next'. If there are no more nodes in that direction, an -error is signalled with the message ERROR-MESSAGE." - (loop - (setq node (funcall ewoc-fn ert--results-ewoc node)) - (when (null node) - (error "%s" error-message)) - (unless (ert--ewoc-entry-hidden-p (ewoc-data node)) - (goto-char (ewoc-location node)) - (return)))) - -(defun ert--results-expand-collapse-button-action (button) - "Expand or collapse the test node BUTTON belongs to." - (let* ((ewoc ert--results-ewoc) - (node (save-excursion - (goto-char (ert--button-action-position)) - (ert--results-test-node-at-point))) - (entry (ewoc-data node))) - (setf (ert--ewoc-entry-expanded-p entry) - (not (ert--ewoc-entry-expanded-p entry))) - (ewoc-invalidate ewoc node))) - -(defun ert-results-find-test-at-point-other-window () - "Find the definition of the test at point in another window. - -To be used in the ERT results buffer." - (interactive) - (let ((name (ert-test-at-point))) - (unless name - (error "No test at point")) - (ert-find-test-other-window name))) - -(defun ert--test-name-button-action (button) - "Find the definition of the test BUTTON belongs to, in another window." - (let ((name (button-get button 'ert-test-name))) - (ert-find-test-other-window name))) - -(defun ert--ewoc-position (ewoc node) - ;; checkdoc-order: nil - "Return the position of NODE in EWOC, or nil if NODE is not in EWOC." - (loop for i from 0 - for node-here = (ewoc-nth ewoc 0) then (ewoc-next ewoc node-here) - do (when (eql node node-here) - (return i)) - finally (return nil))) - -(defun ert-results-jump-between-summary-and-result () - "Jump back and forth between the test run summary and individual test results. - -From an ewoc node, jumps to the character that represents the -same test in the progress bar, and vice versa. - -To be used in the ERT results buffer." - ;; Maybe this command isn't actually needed much, but if it is, it - ;; seems like an indication that the UI design is not optimal. If - ;; jumping back and forth between a summary at the top of the buffer - ;; and the error log in the remainder of the buffer is useful, then - ;; the summary apparently needs to be easily accessible from the - ;; error log, and perhaps it would be better to have it in a - ;; separate buffer to keep it visible. - (interactive) - (let ((ewoc ert--results-ewoc) - (progress-bar-begin ert--results-progress-bar-button-begin)) - (cond ((ert--results-test-node-or-null-at-point) - (let* ((node (ert--results-test-node-at-point)) - (pos (ert--ewoc-position ewoc node))) - (goto-char (+ progress-bar-begin pos)))) - ((and (<= progress-bar-begin (point)) - (< (point) (button-end (button-at progress-bar-begin)))) - (let* ((node (ewoc-nth ewoc (- (point) progress-bar-begin))) - (entry (ewoc-data node))) - (when (ert--ewoc-entry-hidden-p entry) - (setf (ert--ewoc-entry-hidden-p entry) nil) - (ewoc-invalidate ewoc node)) - (ewoc-goto-node ewoc node))) - (t - (goto-char progress-bar-begin))))) - -(defun ert-test-at-point () - "Return the name of the test at point as a symbol, or nil if none." - (or (and (eql major-mode 'ert-results-mode) - (let ((test (ert--results-test-at-point-no-redefinition))) - (and test (ert-test-name test)))) - (let* ((thing (thing-at-point 'symbol)) - (sym (intern-soft thing))) - (and (ert-test-boundp sym) - sym)))) - -(defun ert--results-test-at-point-no-redefinition () - "Return the test at point, or nil. - -To be used in the ERT results buffer." - (assert (eql major-mode 'ert-results-mode)) - (if (ert--results-test-node-or-null-at-point) - (let* ((node (ert--results-test-node-at-point)) - (test (ert--ewoc-entry-test (ewoc-data node)))) - test) - (let ((progress-bar-begin ert--results-progress-bar-button-begin)) - (when (and (<= progress-bar-begin (point)) - (< (point) (button-end (button-at progress-bar-begin)))) - (let* ((test-index (- (point) progress-bar-begin)) - (test (aref (ert--stats-tests ert--results-stats) - test-index))) - test))))) - -(defun ert--results-test-at-point-allow-redefinition () - "Look up the test at point, and check whether it has been redefined. - -To be used in the ERT results buffer. - -Returns a list of two elements: the test (or nil) and a symbol -specifying whether the test has been redefined. - -If a new test has been defined with the same name as the test at -point, replaces the test at point with the new test, and returns -the new test and the symbol `redefined'. - -If the test has been deleted, returns the old test and the symbol -`deleted'. - -If the test is still current, returns the test and the symbol nil. - -If there is no test at point, returns a list with two nils." - (let ((test (ert--results-test-at-point-no-redefinition))) - (cond ((null test) - `(nil nil)) - ((null (ert-test-name test)) - `(,test nil)) - (t - (let* ((name (ert-test-name test)) - (new-test (and (ert-test-boundp name) - (ert-get-test name)))) - (cond ((eql test new-test) - `(,test nil)) - ((null new-test) - `(,test deleted)) - (t - (ert--results-update-after-test-redefinition - (ert--stats-test-pos ert--results-stats test) - new-test) - `(,new-test redefined)))))))) - -(defun ert--results-update-after-test-redefinition (pos new-test) - "Update results buffer after the test at pos POS has been redefined. - -Also updates the stats object. NEW-TEST is the new test -definition." - (let* ((stats ert--results-stats) - (ewoc ert--results-ewoc) - (node (ewoc-nth ewoc pos)) - (entry (ewoc-data node))) - (ert--stats-set-test-and-result stats pos new-test nil) - (setf (ert--ewoc-entry-test entry) new-test - (aref ert--results-progress-bar-string pos) (ert-char-for-test-result - nil t)) - (ewoc-invalidate ewoc node)) - nil) - -(defun ert--button-action-position () - "The buffer position where the last button action was triggered." - (cond ((integerp last-command-event) - (point)) - ((eventp last-command-event) - (posn-point (event-start last-command-event))) - (t (assert nil)))) - -(defun ert--results-progress-bar-button-action (button) - "Jump to details for the test represented by the character clicked in BUTTON." - (goto-char (ert--button-action-position)) - (ert-results-jump-between-summary-and-result)) - -(defun ert-results-rerun-all-tests () - "Re-run all tests, using the same selector. - -To be used in the ERT results buffer." - (interactive) - (assert (eql major-mode 'ert-results-mode)) - (let ((selector (ert--stats-selector ert--results-stats))) - (ert-run-tests-interactively selector (buffer-name)))) - -(defun ert-results-rerun-test-at-point () - "Re-run the test at point. - -To be used in the ERT results buffer." - (interactive) - (destructuring-bind (test redefinition-state) - (ert--results-test-at-point-allow-redefinition) - (when (null test) - (error "No test at point")) - (let* ((stats ert--results-stats) - (progress-message (format "Running %stest %S" - (ecase redefinition-state - ((nil) "") - (redefined "new definition of ") - (deleted "deleted ")) - (ert-test-name test)))) - ;; Need to save and restore point manually here: When point is on - ;; the first visible ewoc entry while the header is updated, point - ;; moves to the top of the buffer. This is undesirable, and a - ;; simple `save-excursion' doesn't prevent it. - (let ((point (point))) - (unwind-protect - (unwind-protect - (progn - (message "%s..." progress-message) - (ert-run-or-rerun-test stats test - ert--results-listener)) - (ert--results-update-stats-display ert--results-ewoc stats) - (message "%s...%s" - progress-message - (let ((result (ert-test-most-recent-result test))) - (ert-string-for-test-result - result (ert-test-result-expected-p test result))))) - (goto-char point)))))) - -(defun ert-results-rerun-test-at-point-debugging-errors () - "Re-run the test at point with `ert-debug-on-error' bound to t. - -To be used in the ERT results buffer." - (interactive) - (let ((ert-debug-on-error t)) - (ert-results-rerun-test-at-point))) - -(defun ert-results-pop-to-backtrace-for-test-at-point () - "Display the backtrace for the test at point. - -To be used in the ERT results buffer." - (interactive) - (let* ((test (ert--results-test-at-point-no-redefinition)) - (stats ert--results-stats) - (pos (ert--stats-test-pos stats test)) - (result (aref (ert--stats-test-results stats) pos))) - (etypecase result - (ert-test-passed (error "Test passed, no backtrace available")) - (ert-test-result-with-condition - (let ((backtrace (ert-test-result-with-condition-backtrace result)) - (buffer (get-buffer-create "*ERT Backtrace*"))) - (pop-to-buffer buffer) - (setq buffer-read-only t) - (let ((inhibit-read-only t)) - (buffer-disable-undo) - (erase-buffer) - (ert-simple-view-mode) - ;; Use unibyte because `debugger-setup-buffer' also does so. - (set-buffer-multibyte nil) - (setq truncate-lines t) - (ert--print-backtrace backtrace) - (debugger-make-xrefs) - (goto-char (point-min)) - (insert "Backtrace for test `") - (ert-insert-test-name-button (ert-test-name test)) - (insert "':\n"))))))) - -(defun ert-results-pop-to-messages-for-test-at-point () - "Display the part of the *Messages* buffer generated during the test at point. - -To be used in the ERT results buffer." - (interactive) - (let* ((test (ert--results-test-at-point-no-redefinition)) - (stats ert--results-stats) - (pos (ert--stats-test-pos stats test)) - (result (aref (ert--stats-test-results stats) pos))) - (let ((buffer (get-buffer-create "*ERT Messages*"))) - (pop-to-buffer buffer) - (setq buffer-read-only t) - (let ((inhibit-read-only t)) - (buffer-disable-undo) - (erase-buffer) - (ert-simple-view-mode) - (insert (ert-test-result-messages result)) - (goto-char (point-min)) - (insert "Messages for test `") - (ert-insert-test-name-button (ert-test-name test)) - (insert "':\n"))))) - -(defun ert-results-pop-to-should-forms-for-test-at-point () - "Display the list of `should' forms executed during the test at point. - -To be used in the ERT results buffer." - (interactive) - (let* ((test (ert--results-test-at-point-no-redefinition)) - (stats ert--results-stats) - (pos (ert--stats-test-pos stats test)) - (result (aref (ert--stats-test-results stats) pos))) - (let ((buffer (get-buffer-create "*ERT list of should forms*"))) - (pop-to-buffer buffer) - (setq buffer-read-only t) - (let ((inhibit-read-only t)) - (buffer-disable-undo) - (erase-buffer) - (ert-simple-view-mode) - (if (null (ert-test-result-should-forms result)) - (insert "\n(No should forms during this test.)\n") - (loop for form-description in (ert-test-result-should-forms result) - for i from 1 do - (insert "\n") - (insert (format "%s: " i)) - (let ((begin (point))) - (ert--pp-with-indentation-and-newline form-description) - (ert--make-xrefs-region begin (point))))) - (goto-char (point-min)) - (insert "`should' forms executed during test `") - (ert-insert-test-name-button (ert-test-name test)) - (insert "':\n") - (insert "\n") - (insert (concat "(Values are shallow copies and may have " - "looked different during the test if they\n" - "have been modified destructively.)\n")) - (forward-line 1))))) - -(defun ert-results-toggle-printer-limits-for-test-at-point () - "Toggle how much of the condition to print for the test at point. - -To be used in the ERT results buffer." - (interactive) - (let* ((ewoc ert--results-ewoc) - (node (ert--results-test-node-at-point)) - (entry (ewoc-data node))) - (setf (ert--ewoc-entry-extended-printer-limits-p entry) - (not (ert--ewoc-entry-extended-printer-limits-p entry))) - (ewoc-invalidate ewoc node))) - -(defun ert-results-pop-to-timings () - "Display test timings for the last run. - -To be used in the ERT results buffer." - (interactive) - (let* ((stats ert--results-stats) - (start-times (ert--stats-test-start-times stats)) - (end-times (ert--stats-test-end-times stats)) - (buffer (get-buffer-create "*ERT timings*")) - (data (loop for test across (ert--stats-tests stats) - for start-time across (ert--stats-test-start-times stats) - for end-time across (ert--stats-test-end-times stats) - collect (list test - (float-time (subtract-time end-time - start-time)))))) - (setq data (sort data (lambda (a b) - (> (second a) (second b))))) - (pop-to-buffer buffer) - (setq buffer-read-only t) - (let ((inhibit-read-only t)) - (buffer-disable-undo) - (erase-buffer) - (ert-simple-view-mode) - (if (null data) - (insert "(No data)\n") - (insert (format "%-3s %8s %8s\n" "" "time" "cumul")) - (loop for (test time) in data - for cumul-time = time then (+ cumul-time time) - for i from 1 do - (let ((begin (point))) - (insert (format "%3s: %8.3f %8.3f " i time cumul-time)) - (ert-insert-test-name-button (ert-test-name test)) - (insert "\n")))) - (goto-char (point-min)) - (insert "Tests by run time (seconds):\n\n") - (forward-line 1)))) - -;;;###autoload -(defun ert-describe-test (test-or-test-name) - "Display the documentation for TEST-OR-TEST-NAME (a symbol or ert-test)." - (interactive (list (ert-read-test-name-at-point "Describe test"))) - (when (< emacs-major-version 24) - (error "Requires Emacs 24")) - (let (test-name - test-definition) - (etypecase test-or-test-name - (symbol (setq test-name test-or-test-name - test-definition (ert-get-test test-or-test-name))) - (ert-test (setq test-name (ert-test-name test-or-test-name) - test-definition test-or-test-name))) - (help-setup-xref (list #'ert-describe-test test-or-test-name) - (called-interactively-p 'interactive)) - (save-excursion - (with-help-window (help-buffer) - (with-current-buffer (help-buffer) - (insert (if test-name (format "%S" test-name) "")) - (insert " is a test") - (let ((file-name (and test-name - (symbol-file test-name 'ert-deftest)))) - (when file-name - (insert " defined in `" (file-name-nondirectory file-name) "'") - (save-excursion - (re-search-backward "`\\([^`']+\\)'" nil t) - (help-xref-button 1 'help-function-def test-name file-name))) - (insert ".") - (fill-region-as-paragraph (point-min) (point)) - (insert "\n\n") - (unless (and (ert-test-boundp test-name) - (eql (ert-get-test test-name) test-definition)) - (let ((begin (point))) - (insert "Note: This test has been redefined or deleted, " - "this documentation refers to an old definition.") - (fill-region-as-paragraph begin (point))) - (insert "\n\n")) - (insert (or (ert-test-documentation test-definition) - "It is not documented.") - "\n"))))))) - -(defun ert-results-describe-test-at-point () - "Display the documentation of the test at point. - -To be used in the ERT results buffer." - (interactive) - (ert-describe-test (ert--results-test-at-point-no-redefinition))) - - -;;; Actions on load/unload. - -(add-to-list 'find-function-regexp-alist '(ert-deftest . ert--find-test-regexp)) -(add-to-list 'minor-mode-alist '(ert--current-run-stats - (:eval - (ert--tests-running-mode-line-indicator)))) -(add-to-list 'emacs-lisp-mode-hook 'ert--activate-font-lock-keywords) - -(defun ert--unload-function () - "Unload function to undo the side-effects of loading ert.el." - (ert--remove-from-list 'find-function-regexp-alist 'ert-deftest :key #'car) - (ert--remove-from-list 'minor-mode-alist 'ert--current-run-stats :key #'car) - (ert--remove-from-list 'emacs-lisp-mode-hook - 'ert--activate-font-lock-keywords) - nil) - -(defvar ert-unload-hook '()) -(add-hook 'ert-unload-hook 'ert--unload-function) - - -(provide 'ert) - -;;; ert.el ends here diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/ert.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/ert.el deleted file mode 100644 index 53b76f7..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/ert.el +++ /dev/null @@ -1,2544 +0,0 @@ -;;; ert.el --- Emacs Lisp Regression Testing - -;; Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc. - -;; Author: Christian M. Ohler -;; Keywords: lisp, tools - -;; This file is NOT part of GNU Emacs. - -;; 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 3 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, see `http://www.gnu.org/licenses/'. - -;;; Commentary: - -;; ERT is a tool for automated testing in Emacs Lisp. Its main -;; features are facilities for defining and running test cases and -;; reporting the results as well as for debugging test failures -;; interactively. -;; -;; The main entry points are `ert-deftest', which is similar to -;; `defun' but defines a test, and `ert-run-tests-interactively', -;; which runs tests and offers an interactive interface for inspecting -;; results and debugging. There is also -;; `ert-run-tests-batch-and-exit' for non-interactive use. -;; -;; The body of `ert-deftest' forms resembles a function body, but the -;; additional operators `should', `should-not' and `should-error' are -;; available. `should' is similar to cl's `assert', but signals a -;; different error when its condition is violated that is caught and -;; processed by ERT. In addition, it analyzes its argument form and -;; records information that helps debugging (`assert' tries to do -;; something similar when its second argument SHOW-ARGS is true, but -;; `should' is more sophisticated). For information on `should-not' -;; and `should-error', see their docstrings. -;; -;; See ERT's info manual as well as the docstrings for more details. -;; To compile the manual, run `makeinfo ert.texinfo' in the ERT -;; directory, then C-u M-x info ert.info in Emacs to view it. -;; -;; To see some examples of tests written in ERT, see its self-tests in -;; ert-tests.el. Some of these are tricky due to the bootstrapping -;; problem of writing tests for a testing tool, others test simple -;; functions and are straightforward. - -;;; Code: - -(eval-when-compile - (require 'cl)) -(require 'button) -(require 'debug) -(require 'easymenu) -(require 'ewoc) -(require 'find-func) -(require 'help) - - -;;; UI customization options. - -(defgroup ert () - "ERT, the Emacs Lisp regression testing tool." - :prefix "ert-" - :group 'lisp) - -(defface ert-test-result-expected '((((class color) (background light)) - :background "green1") - (((class color) (background dark)) - :background "green3")) - "Face used for expected results in the ERT results buffer." - :group 'ert) - -(defface ert-test-result-unexpected '((((class color) (background light)) - :background "red1") - (((class color) (background dark)) - :background "red3")) - "Face used for unexpected results in the ERT results buffer." - :group 'ert) - - -;;; Copies/reimplementations of cl functions. - -(defun ert--cl-do-remf (plist tag) - "Copy of `cl-do-remf'. Modify PLIST by removing TAG." - (let ((p (cdr plist))) - (while (and (cdr p) (not (eq (car (cdr p)) tag))) (setq p (cdr (cdr p)))) - (and (cdr p) (progn (setcdr p (cdr (cdr (cdr p)))) t)))) - -(defun ert--remprop (sym tag) - "Copy of `cl-remprop'. Modify SYM's plist by removing TAG." - (let ((plist (symbol-plist sym))) - (if (and plist (eq tag (car plist))) - (progn (setplist sym (cdr (cdr plist))) t) - (ert--cl-do-remf plist tag)))) - -(defun ert--remove-if-not (ert-pred ert-list) - "A reimplementation of `remove-if-not'. - -ERT-PRED is a predicate, ERT-LIST is the input list." - (loop for ert-x in ert-list - if (funcall ert-pred ert-x) - collect ert-x)) - -(defun ert--intersection (a b) - "A reimplementation of `intersection'. Intersect the sets A and B. - -Elements are compared using `eql'." - (loop for x in a - if (memql x b) - collect x)) - -(defun ert--set-difference (a b) - "A reimplementation of `set-difference'. Subtract the set B from the set A. - -Elements are compared using `eql'." - (loop for x in a - unless (memql x b) - collect x)) - -(defun ert--set-difference-eq (a b) - "A reimplementation of `set-difference'. Subtract the set B from the set A. - -Elements are compared using `eq'." - (loop for x in a - unless (memq x b) - collect x)) - -(defun ert--union (a b) - "A reimplementation of `union'. Compute the union of the sets A and B. - -Elements are compared using `eql'." - (append a (ert--set-difference b a))) - -(eval-and-compile - (defvar ert--gensym-counter 0)) - -(eval-and-compile - (defun ert--gensym (&optional prefix) - "Only allows string PREFIX, not compatible with CL." - (unless prefix (setq prefix "G")) - (make-symbol (format "%s%s" - prefix - (prog1 ert--gensym-counter - (incf ert--gensym-counter)))))) - -(defun ert--coerce-to-vector (x) - "Coerce X to a vector." - (when (char-table-p x) (error "Not supported")) - (if (vectorp x) - x - (vconcat x))) - -(defun* ert--remove* (x list &key key test) - "Does not support all the keywords of remove*." - (unless key (setq key #'identity)) - (unless test (setq test #'eql)) - (loop for y in list - unless (funcall test x (funcall key y)) - collect y)) - -(defun ert--string-position (c s) - "Return the position of the first occurrence of C in S, or nil if none." - (loop for i from 0 - for x across s - when (eql x c) return i)) - -(defun ert--mismatch (a b) - "Return index of first element that differs between A and B. - -Like `mismatch'. Uses `equal' for comparison." - (cond ((or (listp a) (listp b)) - (ert--mismatch (ert--coerce-to-vector a) - (ert--coerce-to-vector b))) - ((> (length a) (length b)) - (ert--mismatch b a)) - (t - (let ((la (length a)) - (lb (length b))) - (assert (arrayp a) t) - (assert (arrayp b) t) - (assert (<= la lb) t) - (loop for i below la - when (not (equal (aref a i) (aref b i))) return i - finally (return (if (/= la lb) - la - (assert (equal a b) t) - nil))))))) - -(defun ert--subseq (seq start &optional end) - "Return a subsequence of SEQ from START to END." - (when (char-table-p seq) (error "Not supported")) - (let ((vector (substring (ert--coerce-to-vector seq) start end))) - (etypecase seq - (vector vector) - (string (concat vector)) - (list (append vector nil)) - (bool-vector (loop with result = (make-bool-vector (length vector) nil) - for i below (length vector) do - (setf (aref result i) (aref vector i)) - finally (return result))) - (char-table (assert nil))))) - -(defun ert-equal-including-properties (a b) - "Return t if A and B have similar structure and contents. - -This is like `equal-including-properties' except that it compares -the property values of text properties structurally (by -recursing) rather than with `eq'. Perhaps this is what -`equal-including-properties' should do in the first place; see -Emacs bug 6581 at URL `http://debbugs.gnu.org/cgi/bugreport.cgi?bug=6581'." - ;; This implementation is inefficient. Rather than making it - ;; efficient, let's hope bug 6581 gets fixed so that we can delete - ;; it altogether. - (not (ert--explain-not-equal-including-properties a b))) - - -;;; Defining and locating tests. - -;; The data structure that represents a test case. -(defstruct ert-test - (name nil) - (documentation nil) - (body (assert nil)) - (most-recent-result nil) - (expected-result-type ':passed) - (tags '())) - -(defun ert-test-boundp (symbol) - "Return non-nil if SYMBOL names a test." - (and (get symbol 'ert--test) t)) - -(defun ert-get-test (symbol) - "If SYMBOL names a test, return that. Signal an error otherwise." - (unless (ert-test-boundp symbol) (error "No test named `%S'" symbol)) - (get symbol 'ert--test)) - -(defun ert-set-test (symbol definition) - "Make SYMBOL name the test DEFINITION, and return DEFINITION." - (when (eq symbol 'nil) - ;; We disallow nil since `ert-test-at-point' and related functions - ;; want to return a test name, but also need an out-of-band value - ;; on failure. Nil is the most natural out-of-band value; using 0 - ;; or "" or signalling an error would be too awkward. - ;; - ;; Note that nil is still a valid value for the `name' slot in - ;; ert-test objects. It designates an anonymous test. - (error "Attempt to define a test named nil")) - (put symbol 'ert--test definition) - definition) - -(defun ert-make-test-unbound (symbol) - "Make SYMBOL name no test. Return SYMBOL." - (ert--remprop symbol 'ert--test) - symbol) - -(defun ert--parse-keys-and-body (keys-and-body) - "Split KEYS-AND-BODY into keyword-and-value pairs and the remaining body. - -KEYS-AND-BODY should have the form of a property list, with the -exception that only keywords are permitted as keys and that the -tail -- the body -- is a list of forms that does not start with a -keyword. - -Returns a two-element list containing the keys-and-values plist -and the body." - (let ((extracted-key-accu '()) - (remaining keys-and-body)) - (while (and (consp remaining) (keywordp (first remaining))) - (let ((keyword (pop remaining))) - (unless (consp remaining) - (error "Value expected after keyword %S in %S" - keyword keys-and-body)) - (when (assoc keyword extracted-key-accu) - (warn "Keyword %S appears more than once in %S" keyword - keys-and-body)) - (push (cons keyword (pop remaining)) extracted-key-accu))) - (setq extracted-key-accu (nreverse extracted-key-accu)) - (list (loop for (key . value) in extracted-key-accu - collect key - collect value) - remaining))) - -;;;###autoload -(defmacro* ert-deftest (name () &body docstring-keys-and-body) - "Define NAME (a symbol) as a test. - -BODY is evaluated as a `progn' when the test is run. It should -signal a condition on failure or just return if the test passes. - -`should', `should-not' and `should-error' are useful for -assertions in BODY. - -Use `ert' to run tests interactively. - -Tests that are expected to fail can be marked as such -using :expected-result. See `ert-test-result-type-p' for a -description of valid values for RESULT-TYPE. - -\(fn NAME () [DOCSTRING] [:expected-result RESULT-TYPE] \ -\[:tags '(TAG...)] BODY...)" - (declare (debug (&define :name test - name sexp [&optional stringp] - [&rest keywordp sexp] def-body)) - (doc-string 3) - (indent 2)) - (let ((documentation nil) - (documentation-supplied-p nil)) - (when (stringp (first docstring-keys-and-body)) - (setq documentation (pop docstring-keys-and-body) - documentation-supplied-p t)) - (destructuring-bind ((&key (expected-result nil expected-result-supplied-p) - (tags nil tags-supplied-p)) - body) - (ert--parse-keys-and-body docstring-keys-and-body) - `(progn - (ert-set-test ',name - (make-ert-test - :name ',name - ,@(when documentation-supplied-p - `(:documentation ,documentation)) - ,@(when expected-result-supplied-p - `(:expected-result-type ,expected-result)) - ,@(when tags-supplied-p - `(:tags ,tags)) - :body (lambda () ,@body))) - ;; This hack allows `symbol-file' to associate `ert-deftest' - ;; forms with files, and therefore enables `find-function' to - ;; work with tests. However, it leads to warnings in - ;; `unload-feature', which doesn't know how to undefine tests - ;; and has no mechanism for extension. - (push '(ert-deftest . ,name) current-load-list) - ',name)))) - -;; We use these `put' forms in addition to the (declare (indent)) in -;; the defmacro form since the `declare' alone does not lead to -;; correct indentation before the .el/.elc file is loaded. -;; Autoloading these `put' forms solves this. -;;;###autoload -(progn - ;; TODO(ohler): Figure out what these mean and make sure they are correct. - (put 'ert-deftest 'lisp-indent-function 2) - (put 'ert-info 'lisp-indent-function 1)) - -(defvar ert--find-test-regexp - (concat "^\\s-*(ert-deftest" - find-function-space-re - "%s\\(\\s-\\|$\\)") - "The regexp the `find-function' mechanisms use for finding test definitions.") - - -(put 'ert-test-failed 'error-conditions '(error ert-test-failed)) -(put 'ert-test-failed 'error-message "Test failed") - -(defun ert-pass () - "Terminate the current test and mark it passed. Does not return." - (throw 'ert--pass nil)) - -(defun ert-fail (data) - "Terminate the current test and mark it failed. Does not return. -DATA is displayed to the user and should state the reason of the failure." - (signal 'ert-test-failed (list data))) - - -;;; The `should' macros. - -(defvar ert--should-execution-observer nil) - -(defun ert--signal-should-execution (form-description) - "Tell the current `should' form observer (if any) about FORM-DESCRIPTION." - (when ert--should-execution-observer - (funcall ert--should-execution-observer form-description))) - -(defun ert--special-operator-p (thing) - "Return non-nil if THING is a symbol naming a special operator." - (and (symbolp thing) - (let ((definition (indirect-function thing t))) - (and (subrp definition) - (eql (cdr (subr-arity definition)) 'unevalled))))) - -(defun ert--expand-should-1 (whole form inner-expander) - "Helper function for the `should' macro and its variants." - (let ((form - ;; If `cl-macroexpand' isn't bound, the code that we're - ;; compiling doesn't depend on cl and thus doesn't need an - ;; environment arg for `macroexpand'. - (if (fboundp 'cl-macroexpand) - ;; Suppress warning about run-time call to cl funtion: we - ;; only call it if it's fboundp. - (with-no-warnings - (cl-macroexpand form (and (boundp 'cl-macro-environment) - cl-macro-environment))) - (macroexpand form)))) - (cond - ((or (atom form) (ert--special-operator-p (car form))) - (let ((value (ert--gensym "value-"))) - `(let ((,value (ert--gensym "ert-form-evaluation-aborted-"))) - ,(funcall inner-expander - `(setq ,value ,form) - `(list ',whole :form ',form :value ,value) - value) - ,value))) - (t - (let ((fn-name (car form)) - (arg-forms (cdr form))) - (assert (or (symbolp fn-name) - (and (consp fn-name) - (eql (car fn-name) 'lambda) - (listp (cdr fn-name))))) - (let ((fn (ert--gensym "fn-")) - (args (ert--gensym "args-")) - (value (ert--gensym "value-")) - (default-value (ert--gensym "ert-form-evaluation-aborted-"))) - `(let ((,fn (function ,fn-name)) - (,args (list ,@arg-forms))) - (let ((,value ',default-value)) - ,(funcall inner-expander - `(setq ,value (apply ,fn ,args)) - `(nconc (list ',whole) - (list :form `(,,fn ,@,args)) - (unless (eql ,value ',default-value) - (list :value ,value)) - (let ((-explainer- - (and (symbolp ',fn-name) - (get ',fn-name 'ert-explainer)))) - (when -explainer- - (list :explanation - (apply -explainer- ,args))))) - value) - ,value)))))))) - -(defun ert--expand-should (whole form inner-expander) - "Helper function for the `should' macro and its variants. - -Analyzes FORM and returns an expression that has the same -semantics under evaluation but records additional debugging -information. - -INNER-EXPANDER should be a function and is called with two -arguments: INNER-FORM and FORM-DESCRIPTION-FORM, where INNER-FORM -is an expression equivalent to FORM, and FORM-DESCRIPTION-FORM is -an expression that returns a description of FORM. INNER-EXPANDER -should return code that calls INNER-FORM and performs the checks -and error signalling specific to the particular variant of -`should'. The code that INNER-EXPANDER returns must not call -FORM-DESCRIPTION-FORM before it has called INNER-FORM." - (lexical-let ((inner-expander inner-expander)) - (ert--expand-should-1 - whole form - (lambda (inner-form form-description-form value-var) - (let ((form-description (ert--gensym "form-description-"))) - `(let (,form-description) - ,(funcall inner-expander - `(unwind-protect - ,inner-form - (setq ,form-description ,form-description-form) - (ert--signal-should-execution ,form-description)) - `,form-description - value-var))))))) - -(defmacro* should (form) - "Evaluate FORM. If it returns nil, abort the current test as failed. - -Returns the value of FORM." - (ert--expand-should `(should ,form) form - (lambda (inner-form form-description-form value-var) - `(unless ,inner-form - (ert-fail ,form-description-form))))) - -(defmacro* should-not (form) - "Evaluate FORM. If it returns non-nil, abort the current test as failed. - -Returns nil." - (ert--expand-should `(should-not ,form) form - (lambda (inner-form form-description-form value-var) - `(unless (not ,inner-form) - (ert-fail ,form-description-form))))) - -(defun ert--should-error-handle-error (form-description-fn - condition type exclude-subtypes) - "Helper function for `should-error'. - -Determines whether CONDITION matches TYPE and EXCLUDE-SUBTYPES, -and aborts the current test as failed if it doesn't." - (let ((signalled-conditions (get (car condition) 'error-conditions)) - (handled-conditions (etypecase type - (list type) - (symbol (list type))))) - (assert signalled-conditions) - (unless (ert--intersection signalled-conditions handled-conditions) - (ert-fail (append - (funcall form-description-fn) - (list - :condition condition - :fail-reason (concat "the error signalled did not" - " have the expected type"))))) - (when exclude-subtypes - (unless (member (car condition) handled-conditions) - (ert-fail (append - (funcall form-description-fn) - (list - :condition condition - :fail-reason (concat "the error signalled was a subtype" - " of the expected type")))))))) - -;; FIXME: The expansion will evaluate the keyword args (if any) in -;; nonstandard order. -(defmacro* should-error (form &rest keys &key type exclude-subtypes) - "Evaluate FORM and check that it signals an error. - -The error signalled needs to match TYPE. TYPE should be a list -of condition names. (It can also be a non-nil symbol, which is -equivalent to a singleton list containing that symbol.) If -EXCLUDE-SUBTYPES is nil, the error matches TYPE if one of its -condition names is an element of TYPE. If EXCLUDE-SUBTYPES is -non-nil, the error matches TYPE if it is an element of TYPE. - -If the error matches, returns (ERROR-SYMBOL . DATA) from the -error. If not, or if no error was signalled, abort the test as -failed." - (unless type (setq type ''error)) - (ert--expand-should - `(should-error ,form ,@keys) - form - (lambda (inner-form form-description-form value-var) - (let ((errorp (ert--gensym "errorp")) - (form-description-fn (ert--gensym "form-description-fn-"))) - `(let ((,errorp nil) - (,form-description-fn (lambda () ,form-description-form))) - (condition-case -condition- - ,inner-form - ;; We can't use ,type here because we want to evaluate it. - (error - (setq ,errorp t) - (ert--should-error-handle-error ,form-description-fn - -condition- - ,type ,exclude-subtypes) - (setq ,value-var -condition-))) - (unless ,errorp - (ert-fail (append - (funcall ,form-description-fn) - (list - :fail-reason "did not signal an error"))))))))) - - -;;; Explanation of `should' failures. - -;; TODO(ohler): Rework explanations so that they are displayed in a -;; similar way to `ert-info' messages; in particular, allow text -;; buttons in explanations that give more detail or open an ediff -;; buffer. Perhaps explanations should be reported through `ert-info' -;; rather than as part of the condition. - -(defun ert--proper-list-p (x) - "Return non-nil if X is a proper list, nil otherwise." - (loop - for firstp = t then nil - for fast = x then (cddr fast) - for slow = x then (cdr slow) do - (when (null fast) (return t)) - (when (not (consp fast)) (return nil)) - (when (null (cdr fast)) (return t)) - (when (not (consp (cdr fast))) (return nil)) - (when (and (not firstp) (eq fast slow)) (return nil)))) - -(defun ert--explain-format-atom (x) - "Format the atom X for `ert--explain-not-equal'." - (typecase x - (fixnum (list x (format "#x%x" x) (format "?%c" x))) - (t x))) - -(defun ert--explain-not-equal (a b) - "Explainer function for `equal'. - -Returns a programmer-readable explanation of why A and B are not -`equal', or nil if they are." - (if (not (equal (type-of a) (type-of b))) - `(different-types ,a ,b) - (etypecase a - (cons - (let ((a-proper-p (ert--proper-list-p a)) - (b-proper-p (ert--proper-list-p b))) - (if (not (eql (not a-proper-p) (not b-proper-p))) - `(one-list-proper-one-improper ,a ,b) - (if a-proper-p - (if (not (equal (length a) (length b))) - `(proper-lists-of-different-length ,(length a) ,(length b) - ,a ,b - first-mismatch-at - ,(ert--mismatch a b)) - (loop for i from 0 - for ai in a - for bi in b - for xi = (ert--explain-not-equal ai bi) - do (when xi (return `(list-elt ,i ,xi))) - finally (assert (equal a b) t))) - (let ((car-x (ert--explain-not-equal (car a) (car b)))) - (if car-x - `(car ,car-x) - (let ((cdr-x (ert--explain-not-equal (cdr a) (cdr b)))) - (if cdr-x - `(cdr ,cdr-x) - (assert (equal a b) t) - nil)))))))) - (array (if (not (equal (length a) (length b))) - `(arrays-of-different-length ,(length a) ,(length b) - ,a ,b - ,@(unless (char-table-p a) - `(first-mismatch-at - ,(ert--mismatch a b)))) - (loop for i from 0 - for ai across a - for bi across b - for xi = (ert--explain-not-equal ai bi) - do (when xi (return `(array-elt ,i ,xi))) - finally (assert (equal a b) t)))) - (atom (if (not (equal a b)) - (if (and (symbolp a) (symbolp b) (string= a b)) - `(different-symbols-with-the-same-name ,a ,b) - `(different-atoms ,(ert--explain-format-atom a) - ,(ert--explain-format-atom b))) - nil))))) -(put 'equal 'ert-explainer 'ert--explain-not-equal) - -(defun ert--significant-plist-keys (plist) - "Return the keys of PLIST that have non-null values, in order." - (assert (zerop (mod (length plist) 2)) t) - (loop for (key value . rest) on plist by #'cddr - unless (or (null value) (memq key accu)) collect key into accu - finally (return accu))) - -(defun ert--plist-difference-explanation (a b) - "Return a programmer-readable explanation of why A and B are different plists. - -Returns nil if they are equivalent, i.e., have the same value for -each key, where absent values are treated as nil. The order of -key/value pairs in each list does not matter." - (assert (zerop (mod (length a) 2)) t) - (assert (zerop (mod (length b) 2)) t) - ;; Normalizing the plists would be another way to do this but it - ;; requires a total ordering on all lisp objects (since any object - ;; is valid as a text property key). Perhaps defining such an - ;; ordering is useful in other contexts, too, but it's a lot of - ;; work, so let's punt on it for now. - (let* ((keys-a (ert--significant-plist-keys a)) - (keys-b (ert--significant-plist-keys b)) - (keys-in-a-not-in-b (ert--set-difference-eq keys-a keys-b)) - (keys-in-b-not-in-a (ert--set-difference-eq keys-b keys-a))) - (flet ((explain-with-key (key) - (let ((value-a (plist-get a key)) - (value-b (plist-get b key))) - (assert (not (equal value-a value-b)) t) - `(different-properties-for-key - ,key ,(ert--explain-not-equal-including-properties value-a - value-b))))) - (cond (keys-in-a-not-in-b - (explain-with-key (first keys-in-a-not-in-b))) - (keys-in-b-not-in-a - (explain-with-key (first keys-in-b-not-in-a))) - (t - (loop for key in keys-a - when (not (equal (plist-get a key) (plist-get b key))) - return (explain-with-key key))))))) - -(defun ert--abbreviate-string (s len suffixp) - "Shorten string S to at most LEN chars. - -If SUFFIXP is non-nil, returns a suffix of S, otherwise a prefix." - (let ((n (length s))) - (cond ((< n len) - s) - (suffixp - (substring s (- n len))) - (t - (substring s 0 len))))) - -(defun ert--explain-not-equal-including-properties (a b) - "Explainer function for `ert-equal-including-properties'. - -Returns a programmer-readable explanation of why A and B are not -`ert-equal-including-properties', or nil if they are." - (if (not (equal a b)) - (ert--explain-not-equal a b) - (assert (stringp a) t) - (assert (stringp b) t) - (assert (eql (length a) (length b)) t) - (loop for i from 0 to (length a) - for props-a = (text-properties-at i a) - for props-b = (text-properties-at i b) - for difference = (ert--plist-difference-explanation props-a props-b) - do (when difference - (return `(char ,i ,(substring-no-properties a i (1+ i)) - ,difference - context-before - ,(ert--abbreviate-string - (substring-no-properties a 0 i) - 10 t) - context-after - ,(ert--abbreviate-string - (substring-no-properties a (1+ i)) - 10 nil)))) - ;; TODO(ohler): Get `equal-including-properties' fixed in - ;; Emacs, delete `ert-equal-including-properties', and - ;; re-enable this assertion. - ;;finally (assert (equal-including-properties a b) t) - ))) -(put 'ert-equal-including-properties - 'ert-explainer - 'ert--explain-not-equal-including-properties) - - -;;; Implementation of `ert-info'. - -;; TODO(ohler): The name `info' clashes with -;; `ert--test-execution-info'. One or both should be renamed. -(defvar ert--infos '() - "The stack of `ert-info' infos that currently apply. - -Bound dynamically. This is a list of (PREFIX . MESSAGE) pairs.") - -(defmacro* ert-info ((message-form &key ((:prefix prefix-form) "Info: ")) - &body body) - "Evaluate MESSAGE-FORM and BODY, and report the message if BODY fails. - -To be used within ERT tests. MESSAGE-FORM should evaluate to a -string that will be displayed together with the test result if -the test fails. PREFIX-FORM should evaluate to a string as well -and is displayed in front of the value of MESSAGE-FORM." - (declare (debug ((form &rest [sexp form]) body)) - (indent 1)) - `(let ((ert--infos (cons (cons ,prefix-form ,message-form) ert--infos))) - ,@body)) - - - -;;; Facilities for running a single test. - -(defvar ert-debug-on-error nil - "Non-nil means enter debugger when a test fails or terminates with an error.") - -;; The data structures that represent the result of running a test. -(defstruct ert-test-result - (messages nil) - (should-forms nil) - ) -(defstruct (ert-test-passed (:include ert-test-result))) -(defstruct (ert-test-result-with-condition (:include ert-test-result)) - (condition (assert nil)) - (backtrace (assert nil)) - (infos (assert nil))) -(defstruct (ert-test-quit (:include ert-test-result-with-condition))) -(defstruct (ert-test-failed (:include ert-test-result-with-condition))) -(defstruct (ert-test-aborted-with-non-local-exit (:include ert-test-result))) - - -(defun ert--record-backtrace () - "Record the current backtrace (as a list) and return it." - ;; Since the backtrace is stored in the result object, result - ;; objects must only be printed with appropriate limits - ;; (`print-level' and `print-length') in place. For interactive - ;; use, the cost of ensuring this possibly outweighs the advantage - ;; of storing the backtrace for - ;; `ert-results-pop-to-backtrace-for-test-at-point' given that we - ;; already have `ert-results-rerun-test-debugging-errors-at-point'. - ;; For batch use, however, printing the backtrace may be useful. - (loop - ;; 6 is the number of frames our own debugger adds (when - ;; compiled; more when interpreted). FIXME: Need to describe a - ;; procedure for determining this constant. - for i from 6 - for frame = (backtrace-frame i) - while frame - collect frame)) - -(defun ert--print-backtrace (backtrace) - "Format the backtrace BACKTRACE to the current buffer." - ;; This is essentially a reimplementation of Fbacktrace - ;; (src/eval.c), but for a saved backtrace, not the current one. - (let ((print-escape-newlines t) - (print-level 8) - (print-length 50)) - (dolist (frame backtrace) - (ecase (first frame) - ((nil) - ;; Special operator. - (destructuring-bind (special-operator &rest arg-forms) - (cdr frame) - (insert - (format " %S\n" (list* special-operator arg-forms))))) - ((t) - ;; Function call. - (destructuring-bind (fn &rest args) (cdr frame) - (insert (format " %S(" fn)) - (loop for firstp = t then nil - for arg in args do - (unless firstp - (insert " ")) - (insert (format "%S" arg))) - (insert ")\n"))))))) - -;; A container for the state of the execution of a single test and -;; environment data needed during its execution. -(defstruct ert--test-execution-info - (test (assert nil)) - (result (assert nil)) - ;; A thunk that may be called when RESULT has been set to its final - ;; value and test execution should be terminated. Should not - ;; return. - (exit-continuation (assert nil)) - ;; The binding of `debugger' outside of the execution of the test. - next-debugger - ;; The binding of `ert-debug-on-error' that is in effect for the - ;; execution of the current test. We store it to avoid being - ;; affected by any new bindings the test itself may establish. (I - ;; don't remember whether this feature is important.) - ert-debug-on-error) - -(defun ert--run-test-debugger (info debugger-args) - "During a test run, `debugger' is bound to a closure that calls this function. - -This function records failures and errors and either terminates -the test silently or calls the interactive debugger, as -appropriate. - -INFO is the ert--test-execution-info corresponding to this test -run. DEBUGGER-ARGS are the arguments to `debugger'." - (destructuring-bind (first-debugger-arg &rest more-debugger-args) - debugger-args - (ecase first-debugger-arg - ((lambda debug t exit nil) - (apply (ert--test-execution-info-next-debugger info) debugger-args)) - (error - (let* ((condition (first more-debugger-args)) - (type (case (car condition) - ((quit) 'quit) - (otherwise 'failed))) - (backtrace (ert--record-backtrace)) - (infos (reverse ert--infos))) - (setf (ert--test-execution-info-result info) - (ecase type - (quit - (make-ert-test-quit :condition condition - :backtrace backtrace - :infos infos)) - (failed - (make-ert-test-failed :condition condition - :backtrace backtrace - :infos infos)))) - ;; Work around Emacs' heuristic (in eval.c) for detecting - ;; errors in the debugger. - (incf num-nonmacro-input-events) - ;; FIXME: We should probably implement more fine-grained - ;; control a la non-t `debug-on-error' here. - (cond - ((ert--test-execution-info-ert-debug-on-error info) - (apply (ert--test-execution-info-next-debugger info) debugger-args)) - (t)) - (funcall (ert--test-execution-info-exit-continuation info))))))) - -(defun ert--run-test-internal (ert-test-execution-info) - "Low-level function to run a test according to ERT-TEST-EXECUTION-INFO. - -This mainly sets up debugger-related bindings." - (lexical-let ((info ert-test-execution-info)) - (setf (ert--test-execution-info-next-debugger info) debugger - (ert--test-execution-info-ert-debug-on-error info) ert-debug-on-error) - (catch 'ert--pass - ;; For now, each test gets its own temp buffer and its own - ;; window excursion, just to be safe. If this turns out to be - ;; too expensive, we can remove it. - (with-temp-buffer - (save-window-excursion - (let ((debugger (lambda (&rest debugger-args) - (ert--run-test-debugger info debugger-args))) - (debug-on-error t) - (debug-on-quit t) - ;; FIXME: Do we need to store the old binding of this - ;; and consider it in `ert--run-test-debugger'? - (debug-ignored-errors nil) - (ert--infos '())) - (funcall (ert-test-body (ert--test-execution-info-test info)))))) - (ert-pass)) - (setf (ert--test-execution-info-result info) (make-ert-test-passed))) - nil) - -(defun ert--force-message-log-buffer-truncation () - "Immediately truncate *Messages* buffer according to `message-log-max'. - -This can be useful after reducing the value of `message-log-max'." - (with-current-buffer (get-buffer-create "*Messages*") - ;; This is a reimplementation of this part of message_dolog() in xdisp.c: - ;; if (NATNUMP (Vmessage_log_max)) - ;; { - ;; scan_newline (Z, Z_BYTE, BEG, BEG_BYTE, - ;; -XFASTINT (Vmessage_log_max) - 1, 0); - ;; del_range_both (BEG, BEG_BYTE, PT, PT_BYTE, 0); - ;; } - (when (and (integerp message-log-max) (>= message-log-max 0)) - (let ((begin (point-min)) - (end (save-excursion - (goto-char (point-max)) - (forward-line (- message-log-max)) - (point)))) - (delete-region begin end))))) - -(defvar ert--running-tests nil - "List of tests that are currently in execution. - -This list is empty while no test is running, has one element -while a test is running, two elements while a test run from -inside a test is running, etc. The list is in order of nesting, -innermost test first. - -The elements are of type `ert-test'.") - -(defun ert-run-test (ert-test) - "Run ERT-TEST. - -Returns the result and stores it in ERT-TEST's `most-recent-result' slot." - (setf (ert-test-most-recent-result ert-test) nil) - (block error - (lexical-let ((begin-marker - (with-current-buffer (get-buffer-create "*Messages*") - (set-marker (make-marker) (point-max))))) - (unwind-protect - (lexical-let ((info (make-ert--test-execution-info - :test ert-test - :result - (make-ert-test-aborted-with-non-local-exit) - :exit-continuation (lambda () - (return-from error nil)))) - (should-form-accu (list))) - (unwind-protect - (let ((ert--should-execution-observer - (lambda (form-description) - (push form-description should-form-accu))) - (message-log-max t) - (ert--running-tests (cons ert-test ert--running-tests))) - (ert--run-test-internal info)) - (let ((result (ert--test-execution-info-result info))) - (setf (ert-test-result-messages result) - (with-current-buffer (get-buffer-create "*Messages*") - (buffer-substring begin-marker (point-max)))) - (ert--force-message-log-buffer-truncation) - (setq should-form-accu (nreverse should-form-accu)) - (setf (ert-test-result-should-forms result) - should-form-accu) - (setf (ert-test-most-recent-result ert-test) result)))) - (set-marker begin-marker nil)))) - (ert-test-most-recent-result ert-test)) - -(defun ert-running-test () - "Return the top-level test currently executing." - (car (last ert--running-tests))) - - -;;; Test selectors. - -(defun ert-test-result-type-p (result result-type) - "Return non-nil if RESULT matches type RESULT-TYPE. - -Valid result types: - -nil -- Never matches. -t -- Always matches. -:failed, :passed -- Matches corresponding results. -\(and TYPES...\) -- Matches if all TYPES match. -\(or TYPES...\) -- Matches if some TYPES match. -\(not TYPE\) -- Matches if TYPE does not match. -\(satisfies PREDICATE\) -- Matches if PREDICATE returns true when called with - RESULT." - ;; It would be easy to add `member' and `eql' types etc., but I - ;; haven't bothered yet. - (etypecase result-type - ((member nil) nil) - ((member t) t) - ((member :failed) (ert-test-failed-p result)) - ((member :passed) (ert-test-passed-p result)) - (cons - (destructuring-bind (operator &rest operands) result-type - (ecase operator - (and - (case (length operands) - (0 t) - (t - (and (ert-test-result-type-p result (first operands)) - (ert-test-result-type-p result `(and ,@(rest operands))))))) - (or - (case (length operands) - (0 nil) - (t - (or (ert-test-result-type-p result (first operands)) - (ert-test-result-type-p result `(or ,@(rest operands))))))) - (not - (assert (eql (length operands) 1)) - (not (ert-test-result-type-p result (first operands)))) - (satisfies - (assert (eql (length operands) 1)) - (funcall (first operands) result))))))) - -(defun ert-test-result-expected-p (test result) - "Return non-nil if TEST's expected result type matches RESULT." - (ert-test-result-type-p result (ert-test-expected-result-type test))) - -(defun ert-select-tests (selector universe) - "Return the tests that match SELECTOR. - -UNIVERSE specifies the set of tests to select from; it should be -a list of tests, or t, which refers to all tests named by symbols -in `obarray'. - -Returns the set of tests as a list. - -Valid selectors: - -nil -- Selects the empty set. -t -- Selects UNIVERSE. -:new -- Selects all tests that have not been run yet. -:failed, :passed -- Select tests according to their most recent result. -:expected, :unexpected -- Select tests according to their most recent result. -a string -- Selects all tests that have a name that matches the string, - a regexp. -a test -- Selects that test. -a symbol -- Selects the test that the symbol names, errors if none. -\(member TESTS...\) -- Selects TESTS, a list of tests or symbols naming tests. -\(eql TEST\) -- Selects TEST, a test or a symbol naming a test. -\(and SELECTORS...\) -- Selects the tests that match all SELECTORS. -\(or SELECTORS...\) -- Selects the tests that match any SELECTOR. -\(not SELECTOR\) -- Selects all tests that do not match SELECTOR. -\(tag TAG) -- Selects all tests that have TAG on their tags list. -\(satisfies PREDICATE\) -- Selects all tests that satisfy PREDICATE. - -Only selectors that require a superset of tests, such -as (satisfies ...), strings, :new, etc. make use of UNIVERSE. -Selectors that do not, such as \(member ...\), just return the -set implied by them without checking whether it is really -contained in UNIVERSE." - ;; This code needs to match the etypecase in - ;; `ert-insert-human-readable-selector'. - (etypecase selector - ((member nil) nil) - ((member t) (etypecase universe - (list universe) - ((member t) (ert-select-tests "" universe)))) - ((member :new) (ert-select-tests - `(satisfies ,(lambda (test) - (null (ert-test-most-recent-result test)))) - universe)) - ((member :failed) (ert-select-tests - `(satisfies ,(lambda (test) - (ert-test-result-type-p - (ert-test-most-recent-result test) - ':failed))) - universe)) - ((member :passed) (ert-select-tests - `(satisfies ,(lambda (test) - (ert-test-result-type-p - (ert-test-most-recent-result test) - ':passed))) - universe)) - ((member :expected) (ert-select-tests - `(satisfies - ,(lambda (test) - (ert-test-result-expected-p - test - (ert-test-most-recent-result test)))) - universe)) - ((member :unexpected) (ert-select-tests `(not :expected) universe)) - (string - (etypecase universe - ((member t) (mapcar #'ert-get-test - (apropos-internal selector #'ert-test-boundp))) - (list (ert--remove-if-not (lambda (test) - (and (ert-test-name test) - (string-match selector - (ert-test-name test)))) - universe)))) - (ert-test (list selector)) - (symbol - (assert (ert-test-boundp selector)) - (list (ert-get-test selector))) - (cons - (destructuring-bind (operator &rest operands) selector - (ecase operator - (member - (mapcar (lambda (purported-test) - (etypecase purported-test - (symbol (assert (ert-test-boundp purported-test)) - (ert-get-test purported-test)) - (ert-test purported-test))) - operands)) - (eql - (assert (eql (length operands) 1)) - (ert-select-tests `(member ,@operands) universe)) - (and - ;; Do these definitions of AND, NOT and OR satisfy de - ;; Morgan's laws? Should they? - (case (length operands) - (0 (ert-select-tests 't universe)) - (t (ert-select-tests `(and ,@(rest operands)) - (ert-select-tests (first operands) - universe))))) - (not - (assert (eql (length operands) 1)) - (let ((all-tests (ert-select-tests 't universe))) - (ert--set-difference all-tests - (ert-select-tests (first operands) - all-tests)))) - (or - (case (length operands) - (0 (ert-select-tests 'nil universe)) - (t (ert--union (ert-select-tests (first operands) universe) - (ert-select-tests `(or ,@(rest operands)) - universe))))) - (tag - (assert (eql (length operands) 1)) - (let ((tag (first operands))) - (ert-select-tests `(satisfies - ,(lambda (test) - (member tag (ert-test-tags test)))) - universe))) - (satisfies - (assert (eql (length operands) 1)) - (ert--remove-if-not (first operands) - (ert-select-tests 't universe)))))))) - -(defun ert--insert-human-readable-selector (selector) - "Insert a human-readable presentation of SELECTOR into the current buffer." - ;; This is needed to avoid printing the (huge) contents of the - ;; `backtrace' slot of the result objects in the - ;; `most-recent-result' slots of test case objects in (eql ...) or - ;; (member ...) selectors. - (labels ((rec (selector) - ;; This code needs to match the etypecase in `ert-select-tests'. - (etypecase selector - ((or (member nil t - :new :failed :passed - :expected :unexpected) - string - symbol) - selector) - (ert-test - (if (ert-test-name selector) - (make-symbol (format "<%S>" (ert-test-name selector))) - (make-symbol ""))) - (cons - (destructuring-bind (operator &rest operands) selector - (ecase operator - ((member eql and not or) - `(,operator ,@(mapcar #'rec operands))) - ((member tag satisfies) - selector))))))) - (insert (format "%S" (rec selector))))) - - -;;; Facilities for running a whole set of tests. - -;; The data structure that contains the set of tests being executed -;; during one particular test run, their results, the state of the -;; execution, and some statistics. -;; -;; The data about results and expected results of tests may seem -;; redundant here, since the test objects also carry such information. -;; However, the information in the test objects may be more recent, it -;; may correspond to a different test run. We need the information -;; that corresponds to this run in order to be able to update the -;; statistics correctly when a test is re-run interactively and has a -;; different result than before. -(defstruct ert--stats - (selector (assert nil)) - ;; The tests, in order. - (tests (assert nil) :type vector) - ;; A map of test names (or the test objects themselves for unnamed - ;; tests) to indices into the `tests' vector. - (test-map (assert nil) :type hash-table) - ;; The results of the tests during this run, in order. - (test-results (assert nil) :type vector) - ;; The start times of the tests, in order, as reported by - ;; `current-time'. - (test-start-times (assert nil) :type vector) - ;; The end times of the tests, in order, as reported by - ;; `current-time'. - (test-end-times (assert nil) :type vector) - (passed-expected 0) - (passed-unexpected 0) - (failed-expected 0) - (failed-unexpected 0) - (start-time nil) - (end-time nil) - (aborted-p nil) - (current-test nil) - ;; The time at or after which the next redisplay should occur, as a - ;; float. - (next-redisplay 0.0)) - -(defun ert-stats-completed-expected (stats) - "Return the number of tests in STATS that had expected results." - (+ (ert--stats-passed-expected stats) - (ert--stats-failed-expected stats))) - -(defun ert-stats-completed-unexpected (stats) - "Return the number of tests in STATS that had unexpected results." - (+ (ert--stats-passed-unexpected stats) - (ert--stats-failed-unexpected stats))) - -(defun ert-stats-completed (stats) - "Number of tests in STATS that have run so far." - (+ (ert-stats-completed-expected stats) - (ert-stats-completed-unexpected stats))) - -(defun ert-stats-total (stats) - "Number of tests in STATS, regardless of whether they have run yet." - (length (ert--stats-tests stats))) - -;; The stats object of the current run, dynamically bound. This is -;; used for the mode line progress indicator. -(defvar ert--current-run-stats nil) - -(defun ert--stats-test-key (test) - "Return the key used for TEST in the test map of ert--stats objects. - -Returns the name of TEST if it has one, or TEST itself otherwise." - (or (ert-test-name test) test)) - -(defun ert--stats-set-test-and-result (stats pos test result) - "Change STATS by replacing the test at position POS with TEST and RESULT. - -Also changes the counters in STATS to match." - (let* ((tests (ert--stats-tests stats)) - (results (ert--stats-test-results stats)) - (old-test (aref tests pos)) - (map (ert--stats-test-map stats))) - (flet ((update (d) - (if (ert-test-result-expected-p (aref tests pos) - (aref results pos)) - (etypecase (aref results pos) - (ert-test-passed (incf (ert--stats-passed-expected stats) d)) - (ert-test-failed (incf (ert--stats-failed-expected stats) d)) - (null) - (ert-test-aborted-with-non-local-exit)) - (etypecase (aref results pos) - (ert-test-passed (incf (ert--stats-passed-unexpected stats) d)) - (ert-test-failed (incf (ert--stats-failed-unexpected stats) d)) - (null) - (ert-test-aborted-with-non-local-exit))))) - ;; Adjust counters to remove the result that is currently in stats. - (update -1) - ;; Put new test and result into stats. - (setf (aref tests pos) test - (aref results pos) result) - (remhash (ert--stats-test-key old-test) map) - (setf (gethash (ert--stats-test-key test) map) pos) - ;; Adjust counters to match new result. - (update +1) - nil))) - -(defun ert--make-stats (tests selector) - "Create a new `ert--stats' object for running TESTS. - -SELECTOR is the selector that was used to select TESTS." - (setq tests (ert--coerce-to-vector tests)) - (let ((map (make-hash-table :size (length tests)))) - (loop for i from 0 - for test across tests - for key = (ert--stats-test-key test) do - (assert (not (gethash key map))) - (setf (gethash key map) i)) - (make-ert--stats :selector selector - :tests tests - :test-map map - :test-results (make-vector (length tests) nil) - :test-start-times (make-vector (length tests) nil) - :test-end-times (make-vector (length tests) nil)))) - -(defun ert-run-or-rerun-test (stats test listener) - ;; checkdoc-order: nil - "Run the single test TEST and record the result using STATS and LISTENER." - (let ((ert--current-run-stats stats) - (pos (ert--stats-test-pos stats test))) - (ert--stats-set-test-and-result stats pos test nil) - ;; Call listener after setting/before resetting - ;; (ert--stats-current-test stats); the listener might refresh the - ;; mode line display, and if the value is not set yet/any more - ;; during this refresh, the mode line will flicker unnecessarily. - (setf (ert--stats-current-test stats) test) - (funcall listener 'test-started stats test) - (setf (ert-test-most-recent-result test) nil) - (setf (aref (ert--stats-test-start-times stats) pos) (current-time)) - (unwind-protect - (ert-run-test test) - (setf (aref (ert--stats-test-end-times stats) pos) (current-time)) - (let ((result (ert-test-most-recent-result test))) - (ert--stats-set-test-and-result stats pos test result) - (funcall listener 'test-ended stats test result)) - (setf (ert--stats-current-test stats) nil)))) - -(defun ert-run-tests (selector listener) - "Run the tests specified by SELECTOR, sending progress updates to LISTENER." - (let* ((tests (ert-select-tests selector t)) - (stats (ert--make-stats tests selector))) - (setf (ert--stats-start-time stats) (current-time)) - (funcall listener 'run-started stats) - (let ((abortedp t)) - (unwind-protect - (let ((ert--current-run-stats stats)) - (force-mode-line-update) - (unwind-protect - (progn - (loop for test in tests do - (ert-run-or-rerun-test stats test listener)) - (setq abortedp nil)) - (setf (ert--stats-aborted-p stats) abortedp) - (setf (ert--stats-end-time stats) (current-time)) - (funcall listener 'run-ended stats abortedp))) - (force-mode-line-update)) - stats))) - -(defun ert--stats-test-pos (stats test) - ;; checkdoc-order: nil - "Return the position (index) of TEST in the run represented by STATS." - (gethash (ert--stats-test-key test) (ert--stats-test-map stats))) - - -;;; Formatting functions shared across UIs. - -(defun ert--format-time-iso8601 (time) - "Format TIME in the variant of ISO 8601 used for timestamps in ERT." - (format-time-string "%Y-%m-%d %T%z" time)) - -(defun ert-char-for-test-result (result expectedp) - "Return a character that represents the test result RESULT. - -EXPECTEDP specifies whether the result was expected." - (let ((s (etypecase result - (ert-test-passed ".P") - (ert-test-failed "fF") - (null "--") - (ert-test-aborted-with-non-local-exit "aA")))) - (elt s (if expectedp 0 1)))) - -(defun ert-string-for-test-result (result expectedp) - "Return a string that represents the test result RESULT. - -EXPECTEDP specifies whether the result was expected." - (let ((s (etypecase result - (ert-test-passed '("passed" "PASSED")) - (ert-test-failed '("failed" "FAILED")) - (null '("unknown" "UNKNOWN")) - (ert-test-aborted-with-non-local-exit '("aborted" "ABORTED"))))) - (elt s (if expectedp 0 1)))) - -(defun ert--pp-with-indentation-and-newline (object) - "Pretty-print OBJECT, indenting it to the current column of point. -Ensures a final newline is inserted." - (let ((begin (point))) - (pp object (current-buffer)) - (unless (bolp) (insert "\n")) - (save-excursion - (goto-char begin) - (indent-sexp)))) - -(defun ert--insert-infos (result) - "Insert `ert-info' infos from RESULT into current buffer. - -RESULT must be an `ert-test-result-with-condition'." - (check-type result ert-test-result-with-condition) - (dolist (info (ert-test-result-with-condition-infos result)) - (destructuring-bind (prefix . message) info - (let ((begin (point)) - (indentation (make-string (+ (length prefix) 4) ?\s)) - (end nil)) - (unwind-protect - (progn - (insert message "\n") - (setq end (copy-marker (point))) - (goto-char begin) - (insert " " prefix) - (forward-line 1) - (while (< (point) end) - (insert indentation) - (forward-line 1))) - (when end (set-marker end nil))))))) - - -;;; Running tests in batch mode. - -(defvar ert-batch-backtrace-right-margin 70 - "*The maximum line length for printing backtraces in `ert-run-tests-batch'.") - -;;;###autoload -(defun ert-run-tests-batch (&optional selector) - "Run the tests specified by SELECTOR, printing results to the terminal. - -SELECTOR works as described in `ert-select-tests', except if -SELECTOR is nil, in which case all tests rather than none will be -run; this makes the command line \"emacs -batch -l my-tests.el -f -ert-run-tests-batch-and-exit\" useful. - -Returns the stats object." - (unless selector (setq selector 't)) - (ert-run-tests - selector - (lambda (event-type &rest event-args) - (ecase event-type - (run-started - (destructuring-bind (stats) event-args - (message "Running %s tests (%s)" - (length (ert--stats-tests stats)) - (ert--format-time-iso8601 (ert--stats-start-time stats))))) - (run-ended - (destructuring-bind (stats abortedp) event-args - (let ((unexpected (ert-stats-completed-unexpected stats)) - (expected-failures (ert--stats-failed-expected stats))) - (message "\n%sRan %s tests, %s results as expected%s (%s)%s\n" - (if (not abortedp) - "" - "Aborted: ") - (ert-stats-total stats) - (ert-stats-completed-expected stats) - (if (zerop unexpected) - "" - (format ", %s unexpected" unexpected)) - (ert--format-time-iso8601 (ert--stats-end-time stats)) - (if (zerop expected-failures) - "" - (format "\n%s expected failures" expected-failures))) - (unless (zerop unexpected) - (message "%s unexpected results:" unexpected) - (loop for test across (ert--stats-tests stats) - for result = (ert-test-most-recent-result test) do - (when (not (ert-test-result-expected-p test result)) - (message "%9s %S" - (ert-string-for-test-result result nil) - (ert-test-name test)))) - (message "%s" ""))))) - (test-started - ) - (test-ended - (destructuring-bind (stats test result) event-args - (unless (ert-test-result-expected-p test result) - (etypecase result - (ert-test-passed - (message "Test %S passed unexpectedly" (ert-test-name test))) - (ert-test-result-with-condition - (message "Test %S backtrace:" (ert-test-name test)) - (with-temp-buffer - (ert--print-backtrace (ert-test-result-with-condition-backtrace - result)) - (goto-char (point-min)) - (while (not (eobp)) - (let ((start (point)) - (end (progn (end-of-line) (point)))) - (setq end (min end - (+ start ert-batch-backtrace-right-margin))) - (message "%s" (buffer-substring-no-properties - start end))) - (forward-line 1))) - (with-temp-buffer - (ert--insert-infos result) - (insert " ") - (let ((print-escape-newlines t) - (print-level 5) - (print-length 10)) - (let ((begin (point))) - (ert--pp-with-indentation-and-newline - (ert-test-result-with-condition-condition result)))) - (goto-char (1- (point-max))) - (assert (looking-at "\n")) - (delete-char 1) - (message "Test %S condition:" (ert-test-name test)) - (message "%s" (buffer-string)))) - (ert-test-aborted-with-non-local-exit - (message "Test %S aborted with non-local exit" - (ert-test-name test))))) - (let* ((max (prin1-to-string (length (ert--stats-tests stats)))) - (format-string (concat "%9s %" - (prin1-to-string (length max)) - "s/" max " %S"))) - (message format-string - (ert-string-for-test-result result - (ert-test-result-expected-p - test result)) - (1+ (ert--stats-test-pos stats test)) - (ert-test-name test))))))))) - -;;;###autoload -(defun ert-run-tests-batch-and-exit (&optional selector) - "Like `ert-run-tests-batch', but exits Emacs when done. - -The exit status will be 0 if all test results were as expected, 1 -on unexpected results, or 2 if the framework detected an error -outside of the tests (e.g. invalid SELECTOR or bug in the code -that runs the tests)." - (unwind-protect - (let ((stats (ert-run-tests-batch selector))) - (kill-emacs (if (zerop (ert-stats-completed-unexpected stats)) 0 1))) - (unwind-protect - (progn - (message "Error running tests") - (backtrace)) - (kill-emacs 2)))) - - -;;; Utility functions for load/unload actions. - -(defun ert--activate-font-lock-keywords () - "Activate font-lock keywords for some of ERT's symbols." - (font-lock-add-keywords - nil - '(("(\\(\\\\s *\\(\\sw+\\)?" - (1 font-lock-keyword-face nil t) - (2 font-lock-function-name-face nil t))))) - -(defun* ert--remove-from-list (list-var element &key key test) - "Remove ELEMENT from the value of LIST-VAR if present. - -This can be used as an inverse of `add-to-list'." - (unless key (setq key #'identity)) - (unless test (setq test #'equal)) - (setf (symbol-value list-var) - (ert--remove* element - (symbol-value list-var) - :key key - :test test))) - - -;;; Some basic interactive functions. - -(defun ert-read-test-name (prompt &optional default history - add-default-to-prompt) - "Read the name of a test and return it as a symbol. - -Prompt with PROMPT. If DEFAULT is a valid test name, use it as a -default. HISTORY is the history to use; see `completing-read'. -If ADD-DEFAULT-TO-PROMPT is non-nil, PROMPT will be modified to -include the default, if any. - -Signals an error if no test name was read." - (etypecase default - (string (let ((symbol (intern-soft default))) - (unless (and symbol (ert-test-boundp symbol)) - (setq default nil)))) - (symbol (setq default - (if (ert-test-boundp default) - (symbol-name default) - nil))) - (ert-test (setq default (ert-test-name default)))) - (when add-default-to-prompt - (setq prompt (if (null default) - (format "%s: " prompt) - (format "%s (default %s): " prompt default)))) - (let ((input (completing-read prompt obarray #'ert-test-boundp - t nil history default nil))) - ;; completing-read returns an empty string if default was nil and - ;; the user just hit enter. - (let ((sym (intern-soft input))) - (if (ert-test-boundp sym) - sym - (error "Input does not name a test"))))) - -(defun ert-read-test-name-at-point (prompt) - "Read the name of a test and return it as a symbol. -As a default, use the symbol at point, or the test at point if in -the ERT results buffer. Prompt with PROMPT, augmented with the -default (if any)." - (ert-read-test-name prompt (ert-test-at-point) nil t)) - -(defun ert-find-test-other-window (test-name) - "Find, in another window, the definition of TEST-NAME." - (interactive (list (ert-read-test-name-at-point "Find test definition: "))) - (find-function-do-it test-name 'ert-deftest 'switch-to-buffer-other-window)) - -(defun ert-delete-test (test-name) - "Make the test TEST-NAME unbound. - -Nothing more than an interactive interface to `ert-make-test-unbound'." - (interactive (list (ert-read-test-name-at-point "Delete test"))) - (ert-make-test-unbound test-name)) - -(defun ert-delete-all-tests () - "Make all symbols in `obarray' name no test." - (interactive) - (when (interactive-p) - (unless (y-or-n-p "Delete all tests? ") - (error "Aborted"))) - ;; We can't use `ert-select-tests' here since that gives us only - ;; test objects, and going from them back to the test name symbols - ;; can fail if the `ert-test' defstruct has been redefined. - (mapc #'ert-make-test-unbound (apropos-internal "" #'ert-test-boundp)) - t) - - -;;; Display of test progress and results. - -;; An entry in the results buffer ewoc. There is one entry per test. -(defstruct ert--ewoc-entry - (test (assert nil)) - ;; If the result of this test was expected, its ewoc entry is hidden - ;; initially. - (hidden-p (assert nil)) - ;; An ewoc entry may be collapsed to hide details such as the error - ;; condition. - ;; - ;; I'm not sure the ability to expand and collapse entries is still - ;; a useful feature. - (expanded-p t) - ;; By default, the ewoc entry presents the error condition with - ;; certain limits on how much to print (`print-level', - ;; `print-length'). The user can interactively switch to a set of - ;; higher limits. - (extended-printer-limits-p nil)) - -;; Variables local to the results buffer. - -;; The ewoc. -(defvar ert--results-ewoc) -;; The stats object. -(defvar ert--results-stats) -;; A string with one character per test. Each character represents -;; the result of the corresponding test. The string is displayed near -;; the top of the buffer and serves as a progress bar. -(defvar ert--results-progress-bar-string) -;; The position where the progress bar button begins. -(defvar ert--results-progress-bar-button-begin) -;; The test result listener that updates the buffer when tests are run. -(defvar ert--results-listener) - -(defun ert-insert-test-name-button (test-name) - "Insert a button that links to TEST-NAME." - (insert-text-button (format "%S" test-name) - :type 'ert--test-name-button - 'ert-test-name test-name)) - -(defun ert--results-format-expected-unexpected (expected unexpected) - "Return a string indicating EXPECTED expected results, UNEXPECTED unexpected." - (if (zerop unexpected) - (format "%s" expected) - (format "%s (%s unexpected)" (+ expected unexpected) unexpected))) - -(defun ert--results-update-ewoc-hf (ewoc stats) - "Update the header and footer of EWOC to show certain information from STATS. - -Also sets `ert--results-progress-bar-button-begin'." - (let ((run-count (ert-stats-completed stats)) - (results-buffer (current-buffer)) - ;; Need to save buffer-local value. - (font-lock font-lock-mode)) - (ewoc-set-hf - ewoc - ;; header - (with-temp-buffer - (insert "Selector: ") - (ert--insert-human-readable-selector (ert--stats-selector stats)) - (insert "\n") - (insert - (format (concat "Passed: %s\n" - "Failed: %s\n" - "Total: %s/%s\n\n") - (ert--results-format-expected-unexpected - (ert--stats-passed-expected stats) - (ert--stats-passed-unexpected stats)) - (ert--results-format-expected-unexpected - (ert--stats-failed-expected stats) - (ert--stats-failed-unexpected stats)) - run-count - (ert-stats-total stats))) - (insert - (format "Started at: %s\n" - (ert--format-time-iso8601 (ert--stats-start-time stats)))) - ;; FIXME: This is ugly. Need to properly define invariants of - ;; the `stats' data structure. - (let ((state (cond ((ert--stats-aborted-p stats) 'aborted) - ((ert--stats-current-test stats) 'running) - ((ert--stats-end-time stats) 'finished) - (t 'preparing)))) - (ecase state - (preparing - (insert "")) - (aborted - (cond ((ert--stats-current-test stats) - (insert "Aborted during test: ") - (ert-insert-test-name-button - (ert-test-name (ert--stats-current-test stats)))) - (t - (insert "Aborted.")))) - (running - (assert (ert--stats-current-test stats)) - (insert "Running test: ") - (ert-insert-test-name-button (ert-test-name - (ert--stats-current-test stats)))) - (finished - (assert (not (ert--stats-current-test stats))) - (insert "Finished."))) - (insert "\n") - (if (ert--stats-end-time stats) - (insert - (format "%s%s\n" - (if (ert--stats-aborted-p stats) - "Aborted at: " - "Finished at: ") - (ert--format-time-iso8601 (ert--stats-end-time stats)))) - (insert "\n")) - (insert "\n")) - (let ((progress-bar-string (with-current-buffer results-buffer - ert--results-progress-bar-string))) - (let ((progress-bar-button-begin - (insert-text-button progress-bar-string - :type 'ert--results-progress-bar-button - 'face (or (and font-lock - (ert-face-for-stats stats)) - 'button)))) - ;; The header gets copied verbatim to the results buffer, - ;; and all positions remain the same, so - ;; `progress-bar-button-begin' will be the right position - ;; even in the results buffer. - (with-current-buffer results-buffer - (set (make-local-variable 'ert--results-progress-bar-button-begin) - progress-bar-button-begin)))) - (insert "\n\n") - (buffer-string)) - ;; footer - ;; - ;; We actually want an empty footer, but that would trigger a bug - ;; in ewoc, sometimes clearing the entire buffer. (It's possible - ;; that this bug has been fixed since this has been tested; we - ;; should test it again.) - "\n"))) - - -(defvar ert-test-run-redisplay-interval-secs .1 - "How many seconds ERT should wait between redisplays while running tests. - -While running tests, ERT shows the current progress, and this variable -determines how frequently the progress display is updated.") - -(defun ert--results-update-stats-display (ewoc stats) - "Update EWOC and the mode line to show data from STATS." - ;; TODO(ohler): investigate using `make-progress-reporter'. - (ert--results-update-ewoc-hf ewoc stats) - (force-mode-line-update) - (redisplay t) - (setf (ert--stats-next-redisplay stats) - (+ (float-time) ert-test-run-redisplay-interval-secs))) - -(defun ert--results-update-stats-display-maybe (ewoc stats) - "Call `ert--results-update-stats-display' if not called recently. - -EWOC and STATS are arguments for `ert--results-update-stats-display'." - (when (>= (float-time) (ert--stats-next-redisplay stats)) - (ert--results-update-stats-display ewoc stats))) - -(defun ert--tests-running-mode-line-indicator () - "Return a string for the mode line that shows the test run progress." - (let* ((stats ert--current-run-stats) - (tests-total (ert-stats-total stats)) - (tests-completed (ert-stats-completed stats))) - (if (>= tests-completed tests-total) - (format " ERT(%s/%s,finished)" tests-completed tests-total) - (format " ERT(%s/%s):%s" - (1+ tests-completed) - tests-total - (if (null (ert--stats-current-test stats)) - "?" - (format "%S" - (ert-test-name (ert--stats-current-test stats)))))))) - -(defun ert--make-xrefs-region (begin end) - "Attach cross-references to function names between BEGIN and END. - -BEGIN and END specify a region in the current buffer." - (save-excursion - (save-restriction - (narrow-to-region begin (point)) - ;; Inhibit optimization in `debugger-make-xrefs' that would - ;; sometimes insert unrelated backtrace info into our buffer. - (let ((debugger-previous-backtrace nil)) - (debugger-make-xrefs))))) - -(defun ert--string-first-line (s) - "Return the first line of S, or S if it contains no newlines. - -The return value does not include the line terminator." - (substring s 0 (ert--string-position ?\n s))) - -(defun ert-face-for-test-result (expectedp) - "Return a face that shows whether a test result was expected or unexpected. - -If EXPECTEDP is nil, returns the face for unexpected results; if -non-nil, returns the face for expected results.." - (if expectedp 'ert-test-result-expected 'ert-test-result-unexpected)) - -(defun ert-face-for-stats (stats) - "Return a face that represents STATS." - (cond ((ert--stats-aborted-p stats) 'nil) - ((plusp (ert-stats-completed-unexpected stats)) - (ert-face-for-test-result nil)) - ((eql (ert-stats-completed-expected stats) (ert-stats-total stats)) - (ert-face-for-test-result t)) - (t 'nil))) - -(defun ert--print-test-for-ewoc (entry) - "The ewoc print function for ewoc test entries. ENTRY is the entry to print." - (let* ((test (ert--ewoc-entry-test entry)) - (stats ert--results-stats) - (result (let ((pos (ert--stats-test-pos stats test))) - (assert pos) - (aref (ert--stats-test-results stats) pos))) - (hiddenp (ert--ewoc-entry-hidden-p entry)) - (expandedp (ert--ewoc-entry-expanded-p entry)) - (extended-printer-limits-p (ert--ewoc-entry-extended-printer-limits-p - entry))) - (cond (hiddenp) - (t - (let ((expectedp (ert-test-result-expected-p test result))) - (insert-text-button (format "%c" (ert-char-for-test-result - result expectedp)) - :type 'ert--results-expand-collapse-button - 'face (or (and font-lock-mode - (ert-face-for-test-result - expectedp)) - 'button))) - (insert " ") - (ert-insert-test-name-button (ert-test-name test)) - (insert "\n") - (when (and expandedp (not (eql result 'nil))) - (when (ert-test-documentation test) - (insert " " - (propertize - (ert--string-first-line (ert-test-documentation test)) - 'font-lock-face 'font-lock-doc-face) - "\n")) - (etypecase result - (ert-test-passed - (if (ert-test-result-expected-p test result) - (insert " passed\n") - (insert " passed unexpectedly\n")) - (insert "")) - (ert-test-result-with-condition - (ert--insert-infos result) - (let ((print-escape-newlines t) - (print-level (if extended-printer-limits-p 12 6)) - (print-length (if extended-printer-limits-p 100 10))) - (insert " ") - (let ((begin (point))) - (ert--pp-with-indentation-and-newline - (ert-test-result-with-condition-condition result)) - (ert--make-xrefs-region begin (point))))) - (ert-test-aborted-with-non-local-exit - (insert " aborted\n"))) - (insert "\n"))))) - nil) - -(defun ert--results-font-lock-function (enabledp) - "Redraw the ERT results buffer after font-lock-mode was switched on or off. - -ENABLEDP is true if font-lock-mode is switched on, false -otherwise." - (ert--results-update-ewoc-hf ert--results-ewoc ert--results-stats) - (ewoc-refresh ert--results-ewoc) - (font-lock-default-function enabledp)) - -(defun ert--setup-results-buffer (stats listener buffer-name) - "Set up a test results buffer. - -STATS is the stats object; LISTENER is the results listener; -BUFFER-NAME, if non-nil, is the buffer name to use." - (unless buffer-name (setq buffer-name "*ert*")) - (let ((buffer (get-buffer-create buffer-name))) - (with-current-buffer buffer - (setq buffer-read-only t) - (let ((inhibit-read-only t)) - (buffer-disable-undo) - (erase-buffer) - (ert-results-mode) - ;; Erase buffer again in case switching out of the previous - ;; mode inserted anything. (This happens e.g. when switching - ;; from ert-results-mode to ert-results-mode when - ;; font-lock-mode turns itself off in change-major-mode-hook.) - (erase-buffer) - (set (make-local-variable 'font-lock-function) - 'ert--results-font-lock-function) - (let ((ewoc (ewoc-create 'ert--print-test-for-ewoc nil nil t))) - (set (make-local-variable 'ert--results-ewoc) ewoc) - (set (make-local-variable 'ert--results-stats) stats) - (set (make-local-variable 'ert--results-progress-bar-string) - (make-string (ert-stats-total stats) - (ert-char-for-test-result nil t))) - (set (make-local-variable 'ert--results-listener) listener) - (loop for test across (ert--stats-tests stats) do - (ewoc-enter-last ewoc - (make-ert--ewoc-entry :test test :hidden-p t))) - (ert--results-update-ewoc-hf ert--results-ewoc ert--results-stats) - (goto-char (1- (point-max))) - buffer))))) - - -(defvar ert--selector-history nil - "List of recent test selectors read from terminal.") - -;; Should OUTPUT-BUFFER-NAME and MESSAGE-FN really be arguments here? -;; They are needed only for our automated self-tests at the moment. -;; Or should there be some other mechanism? -;;;###autoload -(defun ert-run-tests-interactively (selector - &optional output-buffer-name message-fn) - "Run the tests specified by SELECTOR and display the results in a buffer. - -SELECTOR works as described in `ert-select-tests'. -OUTPUT-BUFFER-NAME and MESSAGE-FN should normally be nil; they -are used for automated self-tests and specify which buffer to use -and how to display message." - (interactive - (list (let ((default (if ert--selector-history - ;; Can't use `first' here as this form is - ;; not compiled, and `first' is not - ;; defined without cl. - (car ert--selector-history) - "t"))) - (read-from-minibuffer (if (null default) - "Run tests: " - (format "Run tests (default %s): " default)) - nil nil t 'ert--selector-history - default nil)) - nil)) - (unless message-fn (setq message-fn 'message)) - (lexical-let ((output-buffer-name output-buffer-name) - buffer - listener - (message-fn message-fn)) - (setq listener - (lambda (event-type &rest event-args) - (ecase event-type - (run-started - (destructuring-bind (stats) event-args - (setq buffer (ert--setup-results-buffer stats - listener - output-buffer-name)) - (pop-to-buffer buffer))) - (run-ended - (destructuring-bind (stats abortedp) event-args - (funcall message-fn - "%sRan %s tests, %s results were as expected%s" - (if (not abortedp) - "" - "Aborted: ") - (ert-stats-total stats) - (ert-stats-completed-expected stats) - (let ((unexpected - (ert-stats-completed-unexpected stats))) - (if (zerop unexpected) - "" - (format ", %s unexpected" unexpected)))) - (ert--results-update-stats-display (with-current-buffer buffer - ert--results-ewoc) - stats))) - (test-started - (destructuring-bind (stats test) event-args - (with-current-buffer buffer - (let* ((ewoc ert--results-ewoc) - (pos (ert--stats-test-pos stats test)) - (node (ewoc-nth ewoc pos))) - (assert node) - (setf (ert--ewoc-entry-test (ewoc-data node)) test) - (aset ert--results-progress-bar-string pos - (ert-char-for-test-result nil t)) - (ert--results-update-stats-display-maybe ewoc stats) - (ewoc-invalidate ewoc node))))) - (test-ended - (destructuring-bind (stats test result) event-args - (with-current-buffer buffer - (let* ((ewoc ert--results-ewoc) - (pos (ert--stats-test-pos stats test)) - (node (ewoc-nth ewoc pos))) - (when (ert--ewoc-entry-hidden-p (ewoc-data node)) - (setf (ert--ewoc-entry-hidden-p (ewoc-data node)) - (ert-test-result-expected-p test result))) - (aset ert--results-progress-bar-string pos - (ert-char-for-test-result result - (ert-test-result-expected-p - test result))) - (ert--results-update-stats-display-maybe ewoc stats) - (ewoc-invalidate ewoc node)))))))) - (ert-run-tests - selector - listener))) -;;;###autoload -(defalias 'ert 'ert-run-tests-interactively) - - -;;; Simple view mode for auxiliary information like stack traces or -;;; messages. Mainly binds "q" for quit. - -(define-derived-mode ert-simple-view-mode fundamental-mode "ERT-View" - "Major mode for viewing auxiliary information in ERT.") - -(loop for (key binding) in - '(("q" quit-window) - ) - do - (define-key ert-simple-view-mode-map key binding)) - - -;;; Commands and button actions for the results buffer. - -(define-derived-mode ert-results-mode fundamental-mode "ERT-Results" - "Major mode for viewing results of ERT test runs.") - -(loop for (key binding) in - '(;; Stuff that's not in the menu. - ("\t" forward-button) - ([backtab] backward-button) - ("j" ert-results-jump-between-summary-and-result) - ("q" quit-window) - ("L" ert-results-toggle-printer-limits-for-test-at-point) - ("n" ert-results-next-test) - ("p" ert-results-previous-test) - ;; Stuff that is in the menu. - ("R" ert-results-rerun-all-tests) - ("r" ert-results-rerun-test-at-point) - ("d" ert-results-rerun-test-at-point-debugging-errors) - ("." ert-results-find-test-at-point-other-window) - ("b" ert-results-pop-to-backtrace-for-test-at-point) - ("m" ert-results-pop-to-messages-for-test-at-point) - ("l" ert-results-pop-to-should-forms-for-test-at-point) - ("h" ert-results-describe-test-at-point) - ("D" ert-delete-test) - ("T" ert-results-pop-to-timings) - ) - do - (define-key ert-results-mode-map key binding)) - -(easy-menu-define ert-results-mode-menu ert-results-mode-map - "Menu for `ert-results-mode'." - '("ERT Results" - ["Re-run all tests" ert-results-rerun-all-tests] - "--" - ["Re-run test" ert-results-rerun-test-at-point] - ["Debug test" ert-results-rerun-test-at-point-debugging-errors] - ["Show test definition" ert-results-find-test-at-point-other-window] - "--" - ["Show backtrace" ert-results-pop-to-backtrace-for-test-at-point] - ["Show messages" ert-results-pop-to-messages-for-test-at-point] - ["Show `should' forms" ert-results-pop-to-should-forms-for-test-at-point] - ["Describe test" ert-results-describe-test-at-point] - "--" - ["Delete test" ert-delete-test] - "--" - ["Show execution time of each test" ert-results-pop-to-timings] - )) - -(define-button-type 'ert--results-progress-bar-button - 'action #'ert--results-progress-bar-button-action - 'help-echo "mouse-2, RET: Reveal test result") - -(define-button-type 'ert--test-name-button - 'action #'ert--test-name-button-action - 'help-echo "mouse-2, RET: Find test definition") - -(define-button-type 'ert--results-expand-collapse-button - 'action #'ert--results-expand-collapse-button-action - 'help-echo "mouse-2, RET: Expand/collapse test result") - -(defun ert--results-test-node-or-null-at-point () - "If point is on a valid ewoc node, return it; return nil otherwise. - -To be used in the ERT results buffer." - (let* ((ewoc ert--results-ewoc) - (node (ewoc-locate ewoc))) - ;; `ewoc-locate' will return an arbitrary node when point is on - ;; header or footer, or when all nodes are invisible. So we need - ;; to validate its return value here. - ;; - ;; Update: I'm seeing nil being returned in some cases now, - ;; perhaps this has been changed? - (if (and node - (>= (point) (ewoc-location node)) - (not (ert--ewoc-entry-hidden-p (ewoc-data node)))) - node - nil))) - -(defun ert--results-test-node-at-point () - "If point is on a valid ewoc node, return it; signal an error otherwise. - -To be used in the ERT results buffer." - (or (ert--results-test-node-or-null-at-point) - (error "No test at point"))) - -(defun ert-results-next-test () - "Move point to the next test. - -To be used in the ERT results buffer." - (interactive) - (ert--results-move (ewoc-locate ert--results-ewoc) 'ewoc-next - "No tests below")) - -(defun ert-results-previous-test () - "Move point to the previous test. - -To be used in the ERT results buffer." - (interactive) - (ert--results-move (ewoc-locate ert--results-ewoc) 'ewoc-prev - "No tests above")) - -(defun ert--results-move (node ewoc-fn error-message) - "Move point from NODE to the previous or next node. - -EWOC-FN specifies the direction and should be either `ewoc-prev' -or `ewoc-next'. If there are no more nodes in that direction, an -error is signalled with the message ERROR-MESSAGE." - (loop - (setq node (funcall ewoc-fn ert--results-ewoc node)) - (when (null node) - (error "%s" error-message)) - (unless (ert--ewoc-entry-hidden-p (ewoc-data node)) - (goto-char (ewoc-location node)) - (return)))) - -(defun ert--results-expand-collapse-button-action (button) - "Expand or collapse the test node BUTTON belongs to." - (let* ((ewoc ert--results-ewoc) - (node (save-excursion - (goto-char (ert--button-action-position)) - (ert--results-test-node-at-point))) - (entry (ewoc-data node))) - (setf (ert--ewoc-entry-expanded-p entry) - (not (ert--ewoc-entry-expanded-p entry))) - (ewoc-invalidate ewoc node))) - -(defun ert-results-find-test-at-point-other-window () - "Find the definition of the test at point in another window. - -To be used in the ERT results buffer." - (interactive) - (let ((name (ert-test-at-point))) - (unless name - (error "No test at point")) - (ert-find-test-other-window name))) - -(defun ert--test-name-button-action (button) - "Find the definition of the test BUTTON belongs to, in another window." - (let ((name (button-get button 'ert-test-name))) - (ert-find-test-other-window name))) - -(defun ert--ewoc-position (ewoc node) - ;; checkdoc-order: nil - "Return the position of NODE in EWOC, or nil if NODE is not in EWOC." - (loop for i from 0 - for node-here = (ewoc-nth ewoc 0) then (ewoc-next ewoc node-here) - do (when (eql node node-here) - (return i)) - finally (return nil))) - -(defun ert-results-jump-between-summary-and-result () - "Jump back and forth between the test run summary and individual test results. - -From an ewoc node, jumps to the character that represents the -same test in the progress bar, and vice versa. - -To be used in the ERT results buffer." - ;; Maybe this command isn't actually needed much, but if it is, it - ;; seems like an indication that the UI design is not optimal. If - ;; jumping back and forth between a summary at the top of the buffer - ;; and the error log in the remainder of the buffer is useful, then - ;; the summary apparently needs to be easily accessible from the - ;; error log, and perhaps it would be better to have it in a - ;; separate buffer to keep it visible. - (interactive) - (let ((ewoc ert--results-ewoc) - (progress-bar-begin ert--results-progress-bar-button-begin)) - (cond ((ert--results-test-node-or-null-at-point) - (let* ((node (ert--results-test-node-at-point)) - (pos (ert--ewoc-position ewoc node))) - (goto-char (+ progress-bar-begin pos)))) - ((and (<= progress-bar-begin (point)) - (< (point) (button-end (button-at progress-bar-begin)))) - (let* ((node (ewoc-nth ewoc (- (point) progress-bar-begin))) - (entry (ewoc-data node))) - (when (ert--ewoc-entry-hidden-p entry) - (setf (ert--ewoc-entry-hidden-p entry) nil) - (ewoc-invalidate ewoc node)) - (ewoc-goto-node ewoc node))) - (t - (goto-char progress-bar-begin))))) - -(defun ert-test-at-point () - "Return the name of the test at point as a symbol, or nil if none." - (or (and (eql major-mode 'ert-results-mode) - (let ((test (ert--results-test-at-point-no-redefinition))) - (and test (ert-test-name test)))) - (let* ((thing (thing-at-point 'symbol)) - (sym (intern-soft thing))) - (and (ert-test-boundp sym) - sym)))) - -(defun ert--results-test-at-point-no-redefinition () - "Return the test at point, or nil. - -To be used in the ERT results buffer." - (assert (eql major-mode 'ert-results-mode)) - (if (ert--results-test-node-or-null-at-point) - (let* ((node (ert--results-test-node-at-point)) - (test (ert--ewoc-entry-test (ewoc-data node)))) - test) - (let ((progress-bar-begin ert--results-progress-bar-button-begin)) - (when (and (<= progress-bar-begin (point)) - (< (point) (button-end (button-at progress-bar-begin)))) - (let* ((test-index (- (point) progress-bar-begin)) - (test (aref (ert--stats-tests ert--results-stats) - test-index))) - test))))) - -(defun ert--results-test-at-point-allow-redefinition () - "Look up the test at point, and check whether it has been redefined. - -To be used in the ERT results buffer. - -Returns a list of two elements: the test (or nil) and a symbol -specifying whether the test has been redefined. - -If a new test has been defined with the same name as the test at -point, replaces the test at point with the new test, and returns -the new test and the symbol `redefined'. - -If the test has been deleted, returns the old test and the symbol -`deleted'. - -If the test is still current, returns the test and the symbol nil. - -If there is no test at point, returns a list with two nils." - (let ((test (ert--results-test-at-point-no-redefinition))) - (cond ((null test) - `(nil nil)) - ((null (ert-test-name test)) - `(,test nil)) - (t - (let* ((name (ert-test-name test)) - (new-test (and (ert-test-boundp name) - (ert-get-test name)))) - (cond ((eql test new-test) - `(,test nil)) - ((null new-test) - `(,test deleted)) - (t - (ert--results-update-after-test-redefinition - (ert--stats-test-pos ert--results-stats test) - new-test) - `(,new-test redefined)))))))) - -(defun ert--results-update-after-test-redefinition (pos new-test) - "Update results buffer after the test at pos POS has been redefined. - -Also updates the stats object. NEW-TEST is the new test -definition." - (let* ((stats ert--results-stats) - (ewoc ert--results-ewoc) - (node (ewoc-nth ewoc pos)) - (entry (ewoc-data node))) - (ert--stats-set-test-and-result stats pos new-test nil) - (setf (ert--ewoc-entry-test entry) new-test - (aref ert--results-progress-bar-string pos) (ert-char-for-test-result - nil t)) - (ewoc-invalidate ewoc node)) - nil) - -(defun ert--button-action-position () - "The buffer position where the last button action was triggered." - (cond ((integerp last-command-event) - (point)) - ((eventp last-command-event) - (posn-point (event-start last-command-event))) - (t (assert nil)))) - -(defun ert--results-progress-bar-button-action (button) - "Jump to details for the test represented by the character clicked in BUTTON." - (goto-char (ert--button-action-position)) - (ert-results-jump-between-summary-and-result)) - -(defun ert-results-rerun-all-tests () - "Re-run all tests, using the same selector. - -To be used in the ERT results buffer." - (interactive) - (assert (eql major-mode 'ert-results-mode)) - (let ((selector (ert--stats-selector ert--results-stats))) - (ert-run-tests-interactively selector (buffer-name)))) - -(defun ert-results-rerun-test-at-point () - "Re-run the test at point. - -To be used in the ERT results buffer." - (interactive) - (destructuring-bind (test redefinition-state) - (ert--results-test-at-point-allow-redefinition) - (when (null test) - (error "No test at point")) - (let* ((stats ert--results-stats) - (progress-message (format "Running %stest %S" - (ecase redefinition-state - ((nil) "") - (redefined "new definition of ") - (deleted "deleted ")) - (ert-test-name test)))) - ;; Need to save and restore point manually here: When point is on - ;; the first visible ewoc entry while the header is updated, point - ;; moves to the top of the buffer. This is undesirable, and a - ;; simple `save-excursion' doesn't prevent it. - (let ((point (point))) - (unwind-protect - (unwind-protect - (progn - (message "%s..." progress-message) - (ert-run-or-rerun-test stats test - ert--results-listener)) - (ert--results-update-stats-display ert--results-ewoc stats) - (message "%s...%s" - progress-message - (let ((result (ert-test-most-recent-result test))) - (ert-string-for-test-result - result (ert-test-result-expected-p test result))))) - (goto-char point)))))) - -(defun ert-results-rerun-test-at-point-debugging-errors () - "Re-run the test at point with `ert-debug-on-error' bound to t. - -To be used in the ERT results buffer." - (interactive) - (let ((ert-debug-on-error t)) - (ert-results-rerun-test-at-point))) - -(defun ert-results-pop-to-backtrace-for-test-at-point () - "Display the backtrace for the test at point. - -To be used in the ERT results buffer." - (interactive) - (let* ((test (ert--results-test-at-point-no-redefinition)) - (stats ert--results-stats) - (pos (ert--stats-test-pos stats test)) - (result (aref (ert--stats-test-results stats) pos))) - (etypecase result - (ert-test-passed (error "Test passed, no backtrace available")) - (ert-test-result-with-condition - (let ((backtrace (ert-test-result-with-condition-backtrace result)) - (buffer (get-buffer-create "*ERT Backtrace*"))) - (pop-to-buffer buffer) - (setq buffer-read-only t) - (let ((inhibit-read-only t)) - (buffer-disable-undo) - (erase-buffer) - (ert-simple-view-mode) - ;; Use unibyte because `debugger-setup-buffer' also does so. - (set-buffer-multibyte nil) - (setq truncate-lines t) - (ert--print-backtrace backtrace) - (debugger-make-xrefs) - (goto-char (point-min)) - (insert "Backtrace for test `") - (ert-insert-test-name-button (ert-test-name test)) - (insert "':\n"))))))) - -(defun ert-results-pop-to-messages-for-test-at-point () - "Display the part of the *Messages* buffer generated during the test at point. - -To be used in the ERT results buffer." - (interactive) - (let* ((test (ert--results-test-at-point-no-redefinition)) - (stats ert--results-stats) - (pos (ert--stats-test-pos stats test)) - (result (aref (ert--stats-test-results stats) pos))) - (let ((buffer (get-buffer-create "*ERT Messages*"))) - (pop-to-buffer buffer) - (setq buffer-read-only t) - (let ((inhibit-read-only t)) - (buffer-disable-undo) - (erase-buffer) - (ert-simple-view-mode) - (insert (ert-test-result-messages result)) - (goto-char (point-min)) - (insert "Messages for test `") - (ert-insert-test-name-button (ert-test-name test)) - (insert "':\n"))))) - -(defun ert-results-pop-to-should-forms-for-test-at-point () - "Display the list of `should' forms executed during the test at point. - -To be used in the ERT results buffer." - (interactive) - (let* ((test (ert--results-test-at-point-no-redefinition)) - (stats ert--results-stats) - (pos (ert--stats-test-pos stats test)) - (result (aref (ert--stats-test-results stats) pos))) - (let ((buffer (get-buffer-create "*ERT list of should forms*"))) - (pop-to-buffer buffer) - (setq buffer-read-only t) - (let ((inhibit-read-only t)) - (buffer-disable-undo) - (erase-buffer) - (ert-simple-view-mode) - (if (null (ert-test-result-should-forms result)) - (insert "\n(No should forms during this test.)\n") - (loop for form-description in (ert-test-result-should-forms result) - for i from 1 do - (insert "\n") - (insert (format "%s: " i)) - (let ((begin (point))) - (ert--pp-with-indentation-and-newline form-description) - (ert--make-xrefs-region begin (point))))) - (goto-char (point-min)) - (insert "`should' forms executed during test `") - (ert-insert-test-name-button (ert-test-name test)) - (insert "':\n") - (insert "\n") - (insert (concat "(Values are shallow copies and may have " - "looked different during the test if they\n" - "have been modified destructively.)\n")) - (forward-line 1))))) - -(defun ert-results-toggle-printer-limits-for-test-at-point () - "Toggle how much of the condition to print for the test at point. - -To be used in the ERT results buffer." - (interactive) - (let* ((ewoc ert--results-ewoc) - (node (ert--results-test-node-at-point)) - (entry (ewoc-data node))) - (setf (ert--ewoc-entry-extended-printer-limits-p entry) - (not (ert--ewoc-entry-extended-printer-limits-p entry))) - (ewoc-invalidate ewoc node))) - -(defun ert-results-pop-to-timings () - "Display test timings for the last run. - -To be used in the ERT results buffer." - (interactive) - (let* ((stats ert--results-stats) - (start-times (ert--stats-test-start-times stats)) - (end-times (ert--stats-test-end-times stats)) - (buffer (get-buffer-create "*ERT timings*")) - (data (loop for test across (ert--stats-tests stats) - for start-time across (ert--stats-test-start-times stats) - for end-time across (ert--stats-test-end-times stats) - collect (list test - (float-time (subtract-time end-time - start-time)))))) - (setq data (sort data (lambda (a b) - (> (second a) (second b))))) - (pop-to-buffer buffer) - (setq buffer-read-only t) - (let ((inhibit-read-only t)) - (buffer-disable-undo) - (erase-buffer) - (ert-simple-view-mode) - (if (null data) - (insert "(No data)\n") - (insert (format "%-3s %8s %8s\n" "" "time" "cumul")) - (loop for (test time) in data - for cumul-time = time then (+ cumul-time time) - for i from 1 do - (let ((begin (point))) - (insert (format "%3s: %8.3f %8.3f " i time cumul-time)) - (ert-insert-test-name-button (ert-test-name test)) - (insert "\n")))) - (goto-char (point-min)) - (insert "Tests by run time (seconds):\n\n") - (forward-line 1)))) - -;;;###autoload -(defun ert-describe-test (test-or-test-name) - "Display the documentation for TEST-OR-TEST-NAME (a symbol or ert-test)." - (interactive (list (ert-read-test-name-at-point "Describe test"))) - (when (< emacs-major-version 24) - (error "Requires Emacs 24")) - (let (test-name - test-definition) - (etypecase test-or-test-name - (symbol (setq test-name test-or-test-name - test-definition (ert-get-test test-or-test-name))) - (ert-test (setq test-name (ert-test-name test-or-test-name) - test-definition test-or-test-name))) - (help-setup-xref (list #'ert-describe-test test-or-test-name) - (called-interactively-p 'interactive)) - (save-excursion - (with-help-window (help-buffer) - (with-current-buffer (help-buffer) - (insert (if test-name (format "%S" test-name) "")) - (insert " is a test") - (let ((file-name (and test-name - (symbol-file test-name 'ert-deftest)))) - (when file-name - (insert " defined in `" (file-name-nondirectory file-name) "'") - (save-excursion - (re-search-backward "`\\([^`']+\\)'" nil t) - (help-xref-button 1 'help-function-def test-name file-name))) - (insert ".") - (fill-region-as-paragraph (point-min) (point)) - (insert "\n\n") - (unless (and (ert-test-boundp test-name) - (eql (ert-get-test test-name) test-definition)) - (let ((begin (point))) - (insert "Note: This test has been redefined or deleted, " - "this documentation refers to an old definition.") - (fill-region-as-paragraph begin (point))) - (insert "\n\n")) - (insert (or (ert-test-documentation test-definition) - "It is not documented.") - "\n"))))))) - -(defun ert-results-describe-test-at-point () - "Display the documentation of the test at point. - -To be used in the ERT results buffer." - (interactive) - (ert-describe-test (ert--results-test-at-point-no-redefinition))) - - -;;; Actions on load/unload. - -(add-to-list 'find-function-regexp-alist '(ert-deftest . ert--find-test-regexp)) -(add-to-list 'minor-mode-alist '(ert--current-run-stats - (:eval - (ert--tests-running-mode-line-indicator)))) -(add-to-list 'emacs-lisp-mode-hook 'ert--activate-font-lock-keywords) - -(defun ert--unload-function () - "Unload function to undo the side-effects of loading ert.el." - (ert--remove-from-list 'find-function-regexp-alist 'ert-deftest :key #'car) - (ert--remove-from-list 'minor-mode-alist 'ert--current-run-stats :key #'car) - (ert--remove-from-list 'emacs-lisp-mode-hook - 'ert--activate-font-lock-keywords) - nil) - -(defvar ert-unload-hook '()) -(add-hook 'ert-unload-hook 'ert--unload-function) - - -(provide 'ert) - -;;; ert.el ends here diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/hyperspec.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/hyperspec.el deleted file mode 100644 index 45c3328..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/hyperspec.el +++ /dev/null @@ -1,2511 +0,0 @@ -;;; hyperspec.el --- Browse documentation from the Common Lisp HyperSpec - -;; Copyright 1997 Naggum Software - -;; Author: Erik Naggum -;; Keywords: lisp - -;; This file is not part of GNU Emacs, but distributed under the same -;; conditions as GNU Emacs, and is useless without GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Kent Pitman and Xanalys Inc. have made the text of American National -;; Standard for Information Technology -- Programming Language -- Common -;; Lisp, ANSI X3.226-1994 available on the WWW, in the form of the Common -;; Lisp HyperSpec. This package makes it convenient to peruse this -;; documentation from within Emacs. - -;;; Code: - -(require 'cl-lib nil t) -(require 'cl-lib "lib/cl-lib") -(require 'browse-url) ;you need the Emacs 20 version -(require 'thingatpt) - -(defvar common-lisp-hyperspec-root - "http://www.lispworks.com/reference/HyperSpec/" - "The root of the Common Lisp HyperSpec URL. -If you copy the HyperSpec to your local system, set this variable to -something like \"file://usr/local/doc/HyperSpec/\".") - -;;; Added variable for CLHS symbol table. See details below. -;;; -;;; 20011201 Edi Weitz - -(defvar common-lisp-hyperspec-symbol-table nil - "The HyperSpec symbol table file. -If you copy the HyperSpec to your local system, set this variable to -the location of the symbol table which is usually \"Map_Sym.txt\" -or \"Symbol-Table.text\".") - -(defvar common-lisp-hyperspec-history nil - "History of symbols looked up in the Common Lisp HyperSpec.") - -(defvar common-lisp-hyperspec--symbols (make-hash-table :test 'equal) - "Map a symbol name to its list of relative URLs.") - -;; Lookup NAME in 'common-lisp-hyperspec--symbols´ -(defun common-lisp-hyperspec--find (name) - "Get the relative url of a Common Lisp symbol NAME." - (gethash name common-lisp-hyperspec--symbols)) - -(defun common-lisp-hyperspec--insert (name relative-url) - "Insert CL symbol NAME and RELATIVE-URL into master table." - (cl-pushnew relative-url - (gethash name common-lisp-hyperspec--symbols) - :test #'equal)) - -(defun common-lisp-hyperspec--strip-cl-package (name) - (if (string-match "^\\([^:]*\\)::?\\([^:]*\\)$" name) - (let ((package-name (match-string 1 name)) - (symbol-name (match-string 2 name))) - (if (member (downcase package-name) - '("cl" "common-lisp")) - symbol-name - name)) - name)) - -;; Choose the symbol at point or read symbol-name from the minibuffer. -(defun common-lisp-hyperspec-read-symbol-name (&optional symbol-at-point) - (let* ((symbol-at-point (or symbol-at-point (thing-at-point 'symbol))) - (stripped-symbol (and symbol-at-point - (common-lisp-hyperspec--strip-cl-package - (downcase symbol-at-point))))) - (cond ((and stripped-symbol - (common-lisp-hyperspec--find stripped-symbol)) - stripped-symbol) - (t - (completing-read "Look up symbol in Common Lisp HyperSpec: " - common-lisp-hyperspec--symbols nil t - stripped-symbol - 'common-lisp-hyperspec-history))))) - -;; FIXME: is the (sleep-for 1.5) a actually needed? -(defun common-lisp-hyperspec (symbol-name) - "View the documentation on SYMBOL-NAME from the Common Lisp HyperSpec. -If SYMBOL-NAME has more than one definition, all of them are displayed with -your favorite browser in sequence. The browser should have a \"back\" -function to view the separate definitions. - -The Common Lisp HyperSpec is the full ANSI Standard Common Lisp, provided -by Kent Pitman and Xanalys Inc. By default, the Xanalys Web site is -visited to retrieve the information. Xanalys Inc. allows you to transfer -the entire Common Lisp HyperSpec to your own site under certain conditions. -Visit http://www.lispworks.com/reference/HyperSpec/ for more information. -If you copy the HyperSpec to another location, customize the variable -`common-lisp-hyperspec-root' to point to that location." - (interactive (list (common-lisp-hyperspec-read-symbol-name))) - (let ((name (common-lisp-hyperspec--strip-cl-package - (downcase symbol-name)))) - (cl-maplist (lambda (entry) - (browse-url (concat common-lisp-hyperspec-root "Body/" - (car entry))) - (when (cdr entry) - (sleep-for 1.5))) - (or (common-lisp-hyperspec--find name) - (error "The symbol `%s' is not defined in Common Lisp" - symbol-name))))) - -;;; Added dynamic lookup of symbol in CLHS symbol table -;;; -;;; 20011202 Edi Weitz - -;;; Replaced symbol table for v 4.0 with the one for v 6.0 -;;; (which is now online at Xanalys' site) -;;; -;;; 20020213 Edi Weitz - -(defun common-lisp-hyperspec--get-one-line () - (prog1 - (cl-delete ?\n (thing-at-point 'line)) - (forward-line))) - -(defun common-lisp-hyperspec--parse-map-file (file) - (with-current-buffer (find-file-noselect file) - (goto-char (point-min)) - (let ((result '())) - (while (< (point) (point-max)) - (let* ((symbol-name (downcase (common-lisp-hyperspec--get-one-line))) - (relative-url (common-lisp-hyperspec--get-one-line)) - (file (file-name-nondirectory relative-url))) - (push (list symbol-name file) - result))) - (reverse result)))) - -(mapc (lambda (entry) - (common-lisp-hyperspec--insert (car entry) (cadr entry))) - (if common-lisp-hyperspec-symbol-table - (common-lisp-hyperspec--parse-map-file - common-lisp-hyperspec-symbol-table) - '(("&allow-other-keys" "03_da.htm") - ("&aux" "03_da.htm") - ("&body" "03_dd.htm") - ("&environment" "03_dd.htm") - ("&key" "03_da.htm") - ("&optional" "03_da.htm") - ("&rest" "03_da.htm") - ("&whole" "03_dd.htm") - ("*" "a_st.htm") - ("**" "v__stst_.htm") - ("***" "v__stst_.htm") - ("*break-on-signals*" "v_break_.htm") - ("*compile-file-pathname*" "v_cmp_fi.htm") - ("*compile-file-truename*" "v_cmp_fi.htm") - ("*compile-print*" "v_cmp_pr.htm") - ("*compile-verbose*" "v_cmp_pr.htm") - ("*debug-io*" "v_debug_.htm") - ("*debugger-hook*" "v_debugg.htm") - ("*default-pathname-defaults*" "v_defaul.htm") - ("*error-output*" "v_debug_.htm") - ("*features*" "v_featur.htm") - ("*gensym-counter*" "v_gensym.htm") - ("*load-pathname*" "v_ld_pns.htm") - ("*load-print*" "v_ld_prs.htm") - ("*load-truename*" "v_ld_pns.htm") - ("*load-verbose*" "v_ld_prs.htm") - ("*macroexpand-hook*" "v_mexp_h.htm") - ("*modules*" "v_module.htm") - ("*package*" "v_pkg.htm") - ("*print-array*" "v_pr_ar.htm") - ("*print-base*" "v_pr_bas.htm") - ("*print-case*" "v_pr_cas.htm") - ("*print-circle*" "v_pr_cir.htm") - ("*print-escape*" "v_pr_esc.htm") - ("*print-gensym*" "v_pr_gen.htm") - ("*print-length*" "v_pr_lev.htm") - ("*print-level*" "v_pr_lev.htm") - ("*print-lines*" "v_pr_lin.htm") - ("*print-miser-width*" "v_pr_mis.htm") - ("*print-pprint-dispatch*" "v_pr_ppr.htm") - ("*print-pretty*" "v_pr_pre.htm") - ("*print-radix*" "v_pr_bas.htm") - ("*print-readably*" "v_pr_rda.htm") - ("*print-right-margin*" "v_pr_rig.htm") - ("*query-io*" "v_debug_.htm") - ("*random-state*" "v_rnd_st.htm") - ("*read-base*" "v_rd_bas.htm") - ("*read-default-float-format*" "v_rd_def.htm") - ("*read-eval*" "v_rd_eva.htm") - ("*read-suppress*" "v_rd_sup.htm") - ("*readtable*" "v_rdtabl.htm") - ("*standard-input*" "v_debug_.htm") - ("*standard-output*" "v_debug_.htm") - ("*terminal-io*" "v_termin.htm") - ("*trace-output*" "v_debug_.htm") - ("+" "a_pl.htm") - ("++" "v_pl_plp.htm") - ("+++" "v_pl_plp.htm") - ("-" "a__.htm") - ("/" "a_sl.htm") - ("//" "v_sl_sls.htm") - ("///" "v_sl_sls.htm") - ("/=" "f_eq_sle.htm") - ("1+" "f_1pl_1_.htm") - ("1-" "f_1pl_1_.htm") - ("<" "f_eq_sle.htm") - ("<=" "f_eq_sle.htm") - ("=" "f_eq_sle.htm") - (">" "f_eq_sle.htm") - (">=" "f_eq_sle.htm") - ("abort" "a_abort.htm") - ("abs" "f_abs.htm") - ("acons" "f_acons.htm") - ("acos" "f_asin_.htm") - ("acosh" "f_sinh_.htm") - ("add-method" "f_add_me.htm") - ("adjoin" "f_adjoin.htm") - ("adjust-array" "f_adjust.htm") - ("adjustable-array-p" "f_adju_1.htm") - ("allocate-instance" "f_alloca.htm") - ("alpha-char-p" "f_alpha_.htm") - ("alphanumericp" "f_alphan.htm") - ("and" "a_and.htm") - ("append" "f_append.htm") - ("apply" "f_apply.htm") - ("apropos" "f_apropo.htm") - ("apropos-list" "f_apropo.htm") - ("aref" "f_aref.htm") - ("arithmetic-error" "e_arithm.htm") - ("arithmetic-error-operands" "f_arithm.htm") - ("arithmetic-error-operation" "f_arithm.htm") - ("array" "t_array.htm") - ("array-dimension" "f_ar_dim.htm") - ("array-dimension-limit" "v_ar_dim.htm") - ("array-dimensions" "f_ar_d_1.htm") - ("array-displacement" "f_ar_dis.htm") - ("array-element-type" "f_ar_ele.htm") - ("array-has-fill-pointer-p" "f_ar_has.htm") - ("array-in-bounds-p" "f_ar_in_.htm") - ("array-rank" "f_ar_ran.htm") - ("array-rank-limit" "v_ar_ran.htm") - ("array-row-major-index" "f_ar_row.htm") - ("array-total-size" "f_ar_tot.htm") - ("array-total-size-limit" "v_ar_tot.htm") - ("arrayp" "f_arrayp.htm") - ("ash" "f_ash.htm") - ("asin" "f_asin_.htm") - ("asinh" "f_sinh_.htm") - ("assert" "m_assert.htm") - ("assoc" "f_assocc.htm") - ("assoc-if" "f_assocc.htm") - ("assoc-if-not" "f_assocc.htm") - ("atan" "f_asin_.htm") - ("atanh" "f_sinh_.htm") - ("atom" "a_atom.htm") - ("base-char" "t_base_c.htm") - ("base-string" "t_base_s.htm") - ("bignum" "t_bignum.htm") - ("bit" "a_bit.htm") - ("bit-and" "f_bt_and.htm") - ("bit-andc1" "f_bt_and.htm") - ("bit-andc2" "f_bt_and.htm") - ("bit-eqv" "f_bt_and.htm") - ("bit-ior" "f_bt_and.htm") - ("bit-nand" "f_bt_and.htm") - ("bit-nor" "f_bt_and.htm") - ("bit-not" "f_bt_and.htm") - ("bit-orc1" "f_bt_and.htm") - ("bit-orc2" "f_bt_and.htm") - ("bit-vector" "t_bt_vec.htm") - ("bit-vector-p" "f_bt_vec.htm") - ("bit-xor" "f_bt_and.htm") - ("block" "s_block.htm") - ("boole" "f_boole.htm") - ("boole-1" "v_b_1_b.htm") - ("boole-2" "v_b_1_b.htm") - ("boole-and" "v_b_1_b.htm") - ("boole-andc1" "v_b_1_b.htm") - ("boole-andc2" "v_b_1_b.htm") - ("boole-c1" "v_b_1_b.htm") - ("boole-c2" "v_b_1_b.htm") - ("boole-clr" "v_b_1_b.htm") - ("boole-eqv" "v_b_1_b.htm") - ("boole-ior" "v_b_1_b.htm") - ("boole-nand" "v_b_1_b.htm") - ("boole-nor" "v_b_1_b.htm") - ("boole-orc1" "v_b_1_b.htm") - ("boole-orc2" "v_b_1_b.htm") - ("boole-set" "v_b_1_b.htm") - ("boole-xor" "v_b_1_b.htm") - ("boolean" "t_ban.htm") - ("both-case-p" "f_upper_.htm") - ("boundp" "f_boundp.htm") - ("break" "f_break.htm") - ("broadcast-stream" "t_broadc.htm") - ("broadcast-stream-streams" "f_broadc.htm") - ("built-in-class" "t_built_.htm") - ("butlast" "f_butlas.htm") - ("byte" "f_by_by.htm") - ("byte-position" "f_by_by.htm") - ("byte-size" "f_by_by.htm") - ("caaaar" "f_car_c.htm") - ("caaadr" "f_car_c.htm") - ("caaar" "f_car_c.htm") - ("caadar" "f_car_c.htm") - ("caaddr" "f_car_c.htm") - ("caadr" "f_car_c.htm") - ("caar" "f_car_c.htm") - ("cadaar" "f_car_c.htm") - ("cadadr" "f_car_c.htm") - ("cadar" "f_car_c.htm") - ("caddar" "f_car_c.htm") - ("cadddr" "f_car_c.htm") - ("caddr" "f_car_c.htm") - ("cadr" "f_car_c.htm") - ("call-arguments-limit" "v_call_a.htm") - ("call-method" "m_call_m.htm") - ("call-next-method" "f_call_n.htm") - ("car" "f_car_c.htm") - ("case" "m_case_.htm") - ("catch" "s_catch.htm") - ("ccase" "m_case_.htm") - ("cdaaar" "f_car_c.htm") - ("cdaadr" "f_car_c.htm") - ("cdaar" "f_car_c.htm") - ("cdadar" "f_car_c.htm") - ("cdaddr" "f_car_c.htm") - ("cdadr" "f_car_c.htm") - ("cdar" "f_car_c.htm") - ("cddaar" "f_car_c.htm") - ("cddadr" "f_car_c.htm") - ("cddar" "f_car_c.htm") - ("cdddar" "f_car_c.htm") - ("cddddr" "f_car_c.htm") - ("cdddr" "f_car_c.htm") - ("cddr" "f_car_c.htm") - ("cdr" "f_car_c.htm") - ("ceiling" "f_floorc.htm") - ("cell-error" "e_cell_e.htm") - ("cell-error-name" "f_cell_e.htm") - ("cerror" "f_cerror.htm") - ("change-class" "f_chg_cl.htm") - ("char" "f_char_.htm") - ("char-code" "f_char_c.htm") - ("char-code-limit" "v_char_c.htm") - ("char-downcase" "f_char_u.htm") - ("char-equal" "f_chareq.htm") - ("char-greaterp" "f_chareq.htm") - ("char-int" "f_char_i.htm") - ("char-lessp" "f_chareq.htm") - ("char-name" "f_char_n.htm") - ("char-not-equal" "f_chareq.htm") - ("char-not-greaterp" "f_chareq.htm") - ("char-not-lessp" "f_chareq.htm") - ("char-upcase" "f_char_u.htm") - ("char/=" "f_chareq.htm") - ("char<" "f_chareq.htm") - ("char<=" "f_chareq.htm") - ("char=" "f_chareq.htm") - ("char>" "f_chareq.htm") - ("char>=" "f_chareq.htm") - ("character" "a_ch.htm") - ("characterp" "f_chp.htm") - ("check-type" "m_check_.htm") - ("cis" "f_cis.htm") - ("class" "t_class.htm") - ("class-name" "f_class_.htm") - ("class-of" "f_clas_1.htm") - ("clear-input" "f_clear_.htm") - ("clear-output" "f_finish.htm") - ("close" "f_close.htm") - ("clrhash" "f_clrhas.htm") - ("code-char" "f_code_c.htm") - ("coerce" "f_coerce.htm") - ("compilation-speed" "d_optimi.htm") - ("compile" "f_cmp.htm") - ("compile-file" "f_cmp_fi.htm") - ("compile-file-pathname" "f_cmp__1.htm") - ("compiled-function" "t_cmpd_f.htm") - ("compiled-function-p" "f_cmpd_f.htm") - ("compiler-macro" "f_docume.htm") - ("compiler-macro-function" "f_cmp_ma.htm") - ("complement" "f_comple.htm") - ("complex" "a_comple.htm") - ("complexp" "f_comp_3.htm") - ("compute-applicable-methods" "f_comput.htm") - ("compute-restarts" "f_comp_1.htm") - ("concatenate" "f_concat.htm") - ("concatenated-stream" "t_concat.htm") - ("concatenated-stream-streams" "f_conc_1.htm") - ("cond" "m_cond.htm") - ("condition" "e_cnd.htm") - ("conjugate" "f_conjug.htm") - ("cons" "a_cons.htm") - ("consp" "f_consp.htm") - ("constantly" "f_cons_1.htm") - ("constantp" "f_consta.htm") - ("continue" "a_contin.htm") - ("control-error" "e_contro.htm") - ("copy-alist" "f_cp_ali.htm") - ("copy-list" "f_cp_lis.htm") - ("copy-pprint-dispatch" "f_cp_ppr.htm") - ("copy-readtable" "f_cp_rdt.htm") - ("copy-seq" "f_cp_seq.htm") - ("copy-structure" "f_cp_stu.htm") - ("copy-symbol" "f_cp_sym.htm") - ("copy-tree" "f_cp_tre.htm") - ("cos" "f_sin_c.htm") - ("cosh" "f_sinh_.htm") - ("count" "f_countc.htm") - ("count-if" "f_countc.htm") - ("count-if-not" "f_countc.htm") - ("ctypecase" "m_tpcase.htm") - ("debug" "d_optimi.htm") - ("decf" "m_incf_.htm") - ("declaim" "m_declai.htm") - ("declaration" "d_declar.htm") - ("declare" "s_declar.htm") - ("decode-float" "f_dec_fl.htm") - ("decode-universal-time" "f_dec_un.htm") - ("defclass" "m_defcla.htm") - ("defconstant" "m_defcon.htm") - ("defgeneric" "m_defgen.htm") - ("define-compiler-macro" "m_define.htm") - ("define-condition" "m_defi_5.htm") - ("define-method-combination" "m_defi_4.htm") - ("define-modify-macro" "m_defi_2.htm") - ("define-setf-expander" "m_defi_3.htm") - ("define-symbol-macro" "m_defi_1.htm") - ("defmacro" "m_defmac.htm") - ("defmethod" "m_defmet.htm") - ("defpackage" "m_defpkg.htm") - ("defparameter" "m_defpar.htm") - ("defsetf" "m_defset.htm") - ("defstruct" "m_defstr.htm") - ("deftype" "m_deftp.htm") - ("defun" "m_defun.htm") - ("defvar" "m_defpar.htm") - ("delete" "f_rm_rm.htm") - ("delete-duplicates" "f_rm_dup.htm") - ("delete-file" "f_del_fi.htm") - ("delete-if" "f_rm_rm.htm") - ("delete-if-not" "f_rm_rm.htm") - ("delete-package" "f_del_pk.htm") - ("denominator" "f_numera.htm") - ("deposit-field" "f_deposi.htm") - ("describe" "f_descri.htm") - ("describe-object" "f_desc_1.htm") - ("destructuring-bind" "m_destru.htm") - ("digit-char" "f_digit_.htm") - ("digit-char-p" "f_digi_1.htm") - ("directory" "f_dir.htm") - ("directory-namestring" "f_namest.htm") - ("disassemble" "f_disass.htm") - ("division-by-zero" "e_divisi.htm") - ("do" "m_do_do.htm") - ("do*" "m_do_do.htm") - ("do-all-symbols" "m_do_sym.htm") - ("do-external-symbols" "m_do_sym.htm") - ("do-symbols" "m_do_sym.htm") - ("documentation" "f_docume.htm") - ("dolist" "m_dolist.htm") - ("dotimes" "m_dotime.htm") - ("double-float" "t_short_.htm") - ("double-float-epsilon" "v_short_.htm") - ("double-float-negative-epsilon" "v_short_.htm") - ("dpb" "f_dpb.htm") - ("dribble" "f_dribbl.htm") - ("dynamic-extent" "d_dynami.htm") - ("ecase" "m_case_.htm") - ("echo-stream" "t_echo_s.htm") - ("echo-stream-input-stream" "f_echo_s.htm") - ("echo-stream-output-stream" "f_echo_s.htm") - ("ed" "f_ed.htm") - ("eighth" "f_firstc.htm") - ("elt" "f_elt.htm") - ("encode-universal-time" "f_encode.htm") - ("end-of-file" "e_end_of.htm") - ("endp" "f_endp.htm") - ("enough-namestring" "f_namest.htm") - ("ensure-directories-exist" "f_ensu_1.htm") - ("ensure-generic-function" "f_ensure.htm") - ("eq" "f_eq.htm") - ("eql" "a_eql.htm") - ("equal" "f_equal.htm") - ("equalp" "f_equalp.htm") - ("error" "a_error.htm") - ("etypecase" "m_tpcase.htm") - ("eval" "f_eval.htm") - ("eval-when" "s_eval_w.htm") - ("evenp" "f_evenpc.htm") - ("every" "f_everyc.htm") - ("exp" "f_exp_e.htm") - ("export" "f_export.htm") - ("expt" "f_exp_e.htm") - ("extended-char" "t_extend.htm") - ("fboundp" "f_fbound.htm") - ("fceiling" "f_floorc.htm") - ("fdefinition" "f_fdefin.htm") - ("ffloor" "f_floorc.htm") - ("fifth" "f_firstc.htm") - ("file-author" "f_file_a.htm") - ("file-error" "e_file_e.htm") - ("file-error-pathname" "f_file_e.htm") - ("file-length" "f_file_l.htm") - ("file-namestring" "f_namest.htm") - ("file-position" "f_file_p.htm") - ("file-stream" "t_file_s.htm") - ("file-string-length" "f_file_s.htm") - ("file-write-date" "f_file_w.htm") - ("fill" "f_fill.htm") - ("fill-pointer" "f_fill_p.htm") - ("find" "f_find_.htm") - ("find-all-symbols" "f_find_a.htm") - ("find-class" "f_find_c.htm") - ("find-if" "f_find_.htm") - ("find-if-not" "f_find_.htm") - ("find-method" "f_find_m.htm") - ("find-package" "f_find_p.htm") - ("find-restart" "f_find_r.htm") - ("find-symbol" "f_find_s.htm") - ("finish-output" "f_finish.htm") - ("first" "f_firstc.htm") - ("fixnum" "t_fixnum.htm") - ("flet" "s_flet_.htm") - ("float" "a_float.htm") - ("float-digits" "f_dec_fl.htm") - ("float-precision" "f_dec_fl.htm") - ("float-radix" "f_dec_fl.htm") - ("float-sign" "f_dec_fl.htm") - ("floating-point-inexact" "e_floa_1.htm") - ("floating-point-invalid-operation" "e_floati.htm") - ("floating-point-overflow" "e_floa_2.htm") - ("floating-point-underflow" "e_floa_3.htm") - ("floatp" "f_floatp.htm") - ("floor" "f_floorc.htm") - ("fmakunbound" "f_fmakun.htm") - ("force-output" "f_finish.htm") - ("format" "f_format.htm") - ("formatter" "m_format.htm") - ("fourth" "f_firstc.htm") - ("fresh-line" "f_terpri.htm") - ("fround" "f_floorc.htm") - ("ftruncate" "f_floorc.htm") - ("ftype" "d_ftype.htm") - ("funcall" "f_funcal.htm") - ("function" "a_fn.htm") - ("function-keywords" "f_fn_kwd.htm") - ("function-lambda-expression" "f_fn_lam.htm") - ("functionp" "f_fnp.htm") - ("gcd" "f_gcd.htm") - ("generic-function" "t_generi.htm") - ("gensym" "f_gensym.htm") - ("gentemp" "f_gentem.htm") - ("get" "f_get.htm") - ("get-decoded-time" "f_get_un.htm") - ("get-dispatch-macro-character" "f_set__1.htm") - ("get-internal-real-time" "f_get_in.htm") - ("get-internal-run-time" "f_get__1.htm") - ("get-macro-character" "f_set_ma.htm") - ("get-output-stream-string" "f_get_ou.htm") - ("get-properties" "f_get_pr.htm") - ("get-setf-expansion" "f_get_se.htm") - ("get-universal-time" "f_get_un.htm") - ("getf" "f_getf.htm") - ("gethash" "f_gethas.htm") - ("go" "s_go.htm") - ("graphic-char-p" "f_graphi.htm") - ("handler-bind" "m_handle.htm") - ("handler-case" "m_hand_1.htm") - ("hash-table" "t_hash_t.htm") - ("hash-table-count" "f_hash_1.htm") - ("hash-table-p" "f_hash_t.htm") - ("hash-table-rehash-size" "f_hash_2.htm") - ("hash-table-rehash-threshold" "f_hash_3.htm") - ("hash-table-size" "f_hash_4.htm") - ("hash-table-test" "f_hash_5.htm") - ("host-namestring" "f_namest.htm") - ("identity" "f_identi.htm") - ("if" "s_if.htm") - ("ignorable" "d_ignore.htm") - ("ignore" "d_ignore.htm") - ("ignore-errors" "m_ignore.htm") - ("imagpart" "f_realpa.htm") - ("import" "f_import.htm") - ("in-package" "m_in_pkg.htm") - ("incf" "m_incf_.htm") - ("initialize-instance" "f_init_i.htm") - ("inline" "d_inline.htm") - ("input-stream-p" "f_in_stm.htm") - ("inspect" "f_inspec.htm") - ("integer" "t_intege.htm") - ("integer-decode-float" "f_dec_fl.htm") - ("integer-length" "f_intege.htm") - ("integerp" "f_inte_1.htm") - ("interactive-stream-p" "f_intera.htm") - ("intern" "f_intern.htm") - ("internal-time-units-per-second" "v_intern.htm") - ("intersection" "f_isec_.htm") - ("invalid-method-error" "f_invali.htm") - ("invoke-debugger" "f_invoke.htm") - ("invoke-restart" "f_invo_1.htm") - ("invoke-restart-interactively" "f_invo_2.htm") - ("isqrt" "f_sqrt_.htm") - ("keyword" "t_kwd.htm") - ("keywordp" "f_kwdp.htm") - ("labels" "s_flet_.htm") - ("lambda" "a_lambda.htm") - ("lambda-list-keywords" "v_lambda.htm") - ("lambda-parameters-limit" "v_lamb_1.htm") - ("last" "f_last.htm") - ("lcm" "f_lcm.htm") - ("ldb" "f_ldb.htm") - ("ldb-test" "f_ldb_te.htm") - ("ldiff" "f_ldiffc.htm") - ("least-negative-double-float" "v_most_1.htm") - ("least-negative-long-float" "v_most_1.htm") - ("least-negative-normalized-double-float" "v_most_1.htm") - ("least-negative-normalized-long-float" "v_most_1.htm") - ("least-negative-normalized-short-float" "v_most_1.htm") - ("least-negative-normalized-single-float" "v_most_1.htm") - ("least-negative-short-float" "v_most_1.htm") - ("least-negative-single-float" "v_most_1.htm") - ("least-positive-double-float" "v_most_1.htm") - ("least-positive-long-float" "v_most_1.htm") - ("least-positive-normalized-double-float" "v_most_1.htm") - ("least-positive-normalized-long-float" "v_most_1.htm") - ("least-positive-normalized-short-float" "v_most_1.htm") - ("least-positive-normalized-single-float" "v_most_1.htm") - ("least-positive-short-float" "v_most_1.htm") - ("least-positive-single-float" "v_most_1.htm") - ("length" "f_length.htm") - ("let" "s_let_l.htm") - ("let*" "s_let_l.htm") - ("lisp-implementation-type" "f_lisp_i.htm") - ("lisp-implementation-version" "f_lisp_i.htm") - ("list" "a_list.htm") - ("list*" "f_list_.htm") - ("list-all-packages" "f_list_a.htm") - ("list-length" "f_list_l.htm") - ("listen" "f_listen.htm") - ("listp" "f_listp.htm") - ("load" "f_load.htm") - ("load-logical-pathname-translations" "f_ld_log.htm") - ("load-time-value" "s_ld_tim.htm") - ("locally" "s_locall.htm") - ("log" "f_log.htm") - ("logand" "f_logand.htm") - ("logandc1" "f_logand.htm") - ("logandc2" "f_logand.htm") - ("logbitp" "f_logbtp.htm") - ("logcount" "f_logcou.htm") - ("logeqv" "f_logand.htm") - ("logical-pathname" "a_logica.htm") - ("logical-pathname-translations" "f_logica.htm") - ("logior" "f_logand.htm") - ("lognand" "f_logand.htm") - ("lognor" "f_logand.htm") - ("lognot" "f_logand.htm") - ("logorc1" "f_logand.htm") - ("logorc2" "f_logand.htm") - ("logtest" "f_logtes.htm") - ("logxor" "f_logand.htm") - ("long-float" "t_short_.htm") - ("long-float-epsilon" "v_short_.htm") - ("long-float-negative-epsilon" "v_short_.htm") - ("long-site-name" "f_short_.htm") - ("loop" "m_loop.htm") - ("loop-finish" "m_loop_f.htm") - ("lower-case-p" "f_upper_.htm") - ("machine-instance" "f_mach_i.htm") - ("machine-type" "f_mach_t.htm") - ("machine-version" "f_mach_v.htm") - ("macro-function" "f_macro_.htm") - ("macroexpand" "f_mexp_.htm") - ("macroexpand-1" "f_mexp_.htm") - ("macrolet" "s_flet_.htm") - ("make-array" "f_mk_ar.htm") - ("make-broadcast-stream" "f_mk_bro.htm") - ("make-concatenated-stream" "f_mk_con.htm") - ("make-condition" "f_mk_cnd.htm") - ("make-dispatch-macro-character" "f_mk_dis.htm") - ("make-echo-stream" "f_mk_ech.htm") - ("make-hash-table" "f_mk_has.htm") - ("make-instance" "f_mk_ins.htm") - ("make-instances-obsolete" "f_mk_i_1.htm") - ("make-list" "f_mk_lis.htm") - ("make-load-form" "f_mk_ld_.htm") - ("make-load-form-saving-slots" "f_mk_l_1.htm") - ("make-method" "m_call_m.htm") - ("make-package" "f_mk_pkg.htm") - ("make-pathname" "f_mk_pn.htm") - ("make-random-state" "f_mk_rnd.htm") - ("make-sequence" "f_mk_seq.htm") - ("make-string" "f_mk_stg.htm") - ("make-string-input-stream" "f_mk_s_1.htm") - ("make-string-output-stream" "f_mk_s_2.htm") - ("make-symbol" "f_mk_sym.htm") - ("make-synonym-stream" "f_mk_syn.htm") - ("make-two-way-stream" "f_mk_two.htm") - ("makunbound" "f_makunb.htm") - ("map" "f_map.htm") - ("map-into" "f_map_in.htm") - ("mapc" "f_mapc_.htm") - ("mapcan" "f_mapc_.htm") - ("mapcar" "f_mapc_.htm") - ("mapcon" "f_mapc_.htm") - ("maphash" "f_maphas.htm") - ("mapl" "f_mapc_.htm") - ("maplist" "f_mapc_.htm") - ("mask-field" "f_mask_f.htm") - ("max" "f_max_m.htm") - ("member" "a_member.htm") - ("member-if" "f_mem_m.htm") - ("member-if-not" "f_mem_m.htm") - ("merge" "f_merge.htm") - ("merge-pathnames" "f_merge_.htm") - ("method" "t_method.htm") - ("method-combination" "a_method.htm") - ("method-combination-error" "f_meth_1.htm") - ("method-qualifiers" "f_method.htm") - ("min" "f_max_m.htm") - ("minusp" "f_minusp.htm") - ("mismatch" "f_mismat.htm") - ("mod" "a_mod.htm") - ("most-negative-double-float" "v_most_1.htm") - ("most-negative-fixnum" "v_most_p.htm") - ("most-negative-long-float" "v_most_1.htm") - ("most-negative-short-float" "v_most_1.htm") - ("most-negative-single-float" "v_most_1.htm") - ("most-positive-double-float" "v_most_1.htm") - ("most-positive-fixnum" "v_most_p.htm") - ("most-positive-long-float" "v_most_1.htm") - ("most-positive-short-float" "v_most_1.htm") - ("most-positive-single-float" "v_most_1.htm") - ("muffle-warning" "a_muffle.htm") - ("multiple-value-bind" "m_multip.htm") - ("multiple-value-call" "s_multip.htm") - ("multiple-value-list" "m_mult_1.htm") - ("multiple-value-prog1" "s_mult_1.htm") - ("multiple-value-setq" "m_mult_2.htm") - ("multiple-values-limit" "v_multip.htm") - ("name-char" "f_name_c.htm") - ("namestring" "f_namest.htm") - ("nbutlast" "f_butlas.htm") - ("nconc" "f_nconc.htm") - ("next-method-p" "f_next_m.htm") - ("nil" "a_nil.htm") - ("nintersection" "f_isec_.htm") - ("ninth" "f_firstc.htm") - ("no-applicable-method" "f_no_app.htm") - ("no-next-method" "f_no_nex.htm") - ("not" "a_not.htm") - ("notany" "f_everyc.htm") - ("notevery" "f_everyc.htm") - ("notinline" "d_inline.htm") - ("nreconc" "f_revapp.htm") - ("nreverse" "f_revers.htm") - ("nset-difference" "f_set_di.htm") - ("nset-exclusive-or" "f_set_ex.htm") - ("nstring-capitalize" "f_stg_up.htm") - ("nstring-downcase" "f_stg_up.htm") - ("nstring-upcase" "f_stg_up.htm") - ("nsublis" "f_sublis.htm") - ("nsubst" "f_substc.htm") - ("nsubst-if" "f_substc.htm") - ("nsubst-if-not" "f_substc.htm") - ("nsubstitute" "f_sbs_s.htm") - ("nsubstitute-if" "f_sbs_s.htm") - ("nsubstitute-if-not" "f_sbs_s.htm") - ("nth" "f_nth.htm") - ("nth-value" "m_nth_va.htm") - ("nthcdr" "f_nthcdr.htm") - ("null" "a_null.htm") - ("number" "t_number.htm") - ("numberp" "f_nump.htm") - ("numerator" "f_numera.htm") - ("nunion" "f_unionc.htm") - ("oddp" "f_evenpc.htm") - ("open" "f_open.htm") - ("open-stream-p" "f_open_s.htm") - ("optimize" "d_optimi.htm") - ("or" "a_or.htm") - ("otherwise" "m_case_.htm") - ("output-stream-p" "f_in_stm.htm") - ("package" "t_pkg.htm") - ("package-error" "e_pkg_er.htm") - ("package-error-package" "f_pkg_er.htm") - ("package-name" "f_pkg_na.htm") - ("package-nicknames" "f_pkg_ni.htm") - ("package-shadowing-symbols" "f_pkg_sh.htm") - ("package-use-list" "f_pkg_us.htm") - ("package-used-by-list" "f_pkg__1.htm") - ("packagep" "f_pkgp.htm") - ("pairlis" "f_pairli.htm") - ("parse-error" "e_parse_.htm") - ("parse-integer" "f_parse_.htm") - ("parse-namestring" "f_pars_1.htm") - ("pathname" "a_pn.htm") - ("pathname-device" "f_pn_hos.htm") - ("pathname-directory" "f_pn_hos.htm") - ("pathname-host" "f_pn_hos.htm") - ("pathname-match-p" "f_pn_mat.htm") - ("pathname-name" "f_pn_hos.htm") - ("pathname-type" "f_pn_hos.htm") - ("pathname-version" "f_pn_hos.htm") - ("pathnamep" "f_pnp.htm") - ("peek-char" "f_peek_c.htm") - ("phase" "f_phase.htm") - ("pi" "v_pi.htm") - ("plusp" "f_minusp.htm") - ("pop" "m_pop.htm") - ("position" "f_pos_p.htm") - ("position-if" "f_pos_p.htm") - ("position-if-not" "f_pos_p.htm") - ("pprint" "f_wr_pr.htm") - ("pprint-dispatch" "f_ppr_di.htm") - ("pprint-exit-if-list-exhausted" "m_ppr_ex.htm") - ("pprint-fill" "f_ppr_fi.htm") - ("pprint-indent" "f_ppr_in.htm") - ("pprint-linear" "f_ppr_fi.htm") - ("pprint-logical-block" "m_ppr_lo.htm") - ("pprint-newline" "f_ppr_nl.htm") - ("pprint-pop" "m_ppr_po.htm") - ("pprint-tab" "f_ppr_ta.htm") - ("pprint-tabular" "f_ppr_fi.htm") - ("prin1" "f_wr_pr.htm") - ("prin1-to-string" "f_wr_to_.htm") - ("princ" "f_wr_pr.htm") - ("princ-to-string" "f_wr_to_.htm") - ("print" "f_wr_pr.htm") - ("print-not-readable" "e_pr_not.htm") - ("print-not-readable-object" "f_pr_not.htm") - ("print-object" "f_pr_obj.htm") - ("print-unreadable-object" "m_pr_unr.htm") - ("probe-file" "f_probe_.htm") - ("proclaim" "f_procla.htm") - ("prog" "m_prog_.htm") - ("prog*" "m_prog_.htm") - ("prog1" "m_prog1c.htm") - ("prog2" "m_prog1c.htm") - ("progn" "s_progn.htm") - ("program-error" "e_progra.htm") - ("progv" "s_progv.htm") - ("provide" "f_provid.htm") - ("psetf" "m_setf_.htm") - ("psetq" "m_psetq.htm") - ("push" "m_push.htm") - ("pushnew" "m_pshnew.htm") - ("quote" "s_quote.htm") - ("random" "f_random.htm") - ("random-state" "t_rnd_st.htm") - ("random-state-p" "f_rnd_st.htm") - ("rassoc" "f_rassoc.htm") - ("rassoc-if" "f_rassoc.htm") - ("rassoc-if-not" "f_rassoc.htm") - ("ratio" "t_ratio.htm") - ("rational" "a_ration.htm") - ("rationalize" "f_ration.htm") - ("rationalp" "f_rati_1.htm") - ("read" "f_rd_rd.htm") - ("read-byte" "f_rd_by.htm") - ("read-char" "f_rd_cha.htm") - ("read-char-no-hang" "f_rd_c_1.htm") - ("read-delimited-list" "f_rd_del.htm") - ("read-from-string" "f_rd_fro.htm") - ("read-line" "f_rd_lin.htm") - ("read-preserving-whitespace" "f_rd_rd.htm") - ("read-sequence" "f_rd_seq.htm") - ("reader-error" "e_rder_e.htm") - ("readtable" "t_rdtabl.htm") - ("readtable-case" "f_rdtabl.htm") - ("readtablep" "f_rdta_1.htm") - ("real" "t_real.htm") - ("realp" "f_realp.htm") - ("realpart" "f_realpa.htm") - ("reduce" "f_reduce.htm") - ("reinitialize-instance" "f_reinit.htm") - ("rem" "f_mod_r.htm") - ("remf" "m_remf.htm") - ("remhash" "f_remhas.htm") - ("remove" "f_rm_rm.htm") - ("remove-duplicates" "f_rm_dup.htm") - ("remove-if" "f_rm_rm.htm") - ("remove-if-not" "f_rm_rm.htm") - ("remove-method" "f_rm_met.htm") - ("remprop" "f_rempro.htm") - ("rename-file" "f_rn_fil.htm") - ("rename-package" "f_rn_pkg.htm") - ("replace" "f_replac.htm") - ("require" "f_provid.htm") - ("rest" "f_rest.htm") - ("restart" "t_rst.htm") - ("restart-bind" "m_rst_bi.htm") - ("restart-case" "m_rst_ca.htm") - ("restart-name" "f_rst_na.htm") - ("return" "m_return.htm") - ("return-from" "s_ret_fr.htm") - ("revappend" "f_revapp.htm") - ("reverse" "f_revers.htm") - ("room" "f_room.htm") - ("rotatef" "m_rotate.htm") - ("round" "f_floorc.htm") - ("row-major-aref" "f_row_ma.htm") - ("rplaca" "f_rplaca.htm") - ("rplacd" "f_rplaca.htm") - ("safety" "d_optimi.htm") - ("satisfies" "t_satisf.htm") - ("sbit" "f_bt_sb.htm") - ("scale-float" "f_dec_fl.htm") - ("schar" "f_char_.htm") - ("search" "f_search.htm") - ("second" "f_firstc.htm") - ("sequence" "t_seq.htm") - ("serious-condition" "e_seriou.htm") - ("set" "f_set.htm") - ("set-difference" "f_set_di.htm") - ("set-dispatch-macro-character" "f_set__1.htm") - ("set-exclusive-or" "f_set_ex.htm") - ("set-macro-character" "f_set_ma.htm") - ("set-pprint-dispatch" "f_set_pp.htm") - ("set-syntax-from-char" "f_set_sy.htm") - ("setf" "a_setf.htm") - ("setq" "s_setq.htm") - ("seventh" "f_firstc.htm") - ("shadow" "f_shadow.htm") - ("shadowing-import" "f_shdw_i.htm") - ("shared-initialize" "f_shared.htm") - ("shiftf" "m_shiftf.htm") - ("short-float" "t_short_.htm") - ("short-float-epsilon" "v_short_.htm") - ("short-float-negative-epsilon" "v_short_.htm") - ("short-site-name" "f_short_.htm") - ("signal" "f_signal.htm") - ("signed-byte" "t_sgn_by.htm") - ("signum" "f_signum.htm") - ("simple-array" "t_smp_ar.htm") - ("simple-base-string" "t_smp_ba.htm") - ("simple-bit-vector" "t_smp_bt.htm") - ("simple-bit-vector-p" "f_smp_bt.htm") - ("simple-condition" "e_smp_cn.htm") - ("simple-condition-format-arguments" "f_smp_cn.htm") - ("simple-condition-format-control" "f_smp_cn.htm") - ("simple-error" "e_smp_er.htm") - ("simple-string" "t_smp_st.htm") - ("simple-string-p" "f_smp_st.htm") - ("simple-type-error" "e_smp_tp.htm") - ("simple-vector" "t_smp_ve.htm") - ("simple-vector-p" "f_smp_ve.htm") - ("simple-warning" "e_smp_wa.htm") - ("sin" "f_sin_c.htm") - ("single-float" "t_short_.htm") - ("single-float-epsilon" "v_short_.htm") - ("single-float-negative-epsilon" "v_short_.htm") - ("sinh" "f_sinh_.htm") - ("sixth" "f_firstc.htm") - ("sleep" "f_sleep.htm") - ("slot-boundp" "f_slt_bo.htm") - ("slot-exists-p" "f_slt_ex.htm") - ("slot-makunbound" "f_slt_ma.htm") - ("slot-missing" "f_slt_mi.htm") - ("slot-unbound" "f_slt_un.htm") - ("slot-value" "f_slt_va.htm") - ("software-type" "f_sw_tpc.htm") - ("software-version" "f_sw_tpc.htm") - ("some" "f_everyc.htm") - ("sort" "f_sort_.htm") - ("space" "d_optimi.htm") - ("special" "d_specia.htm") - ("special-operator-p" "f_specia.htm") - ("speed" "d_optimi.htm") - ("sqrt" "f_sqrt_.htm") - ("stable-sort" "f_sort_.htm") - ("standard" "07_ffb.htm") - ("standard-char" "t_std_ch.htm") - ("standard-char-p" "f_std_ch.htm") - ("standard-class" "t_std_cl.htm") - ("standard-generic-function" "t_std_ge.htm") - ("standard-method" "t_std_me.htm") - ("standard-object" "t_std_ob.htm") - ("step" "m_step.htm") - ("storage-condition" "e_storag.htm") - ("store-value" "a_store_.htm") - ("stream" "t_stream.htm") - ("stream-element-type" "f_stm_el.htm") - ("stream-error" "e_stm_er.htm") - ("stream-error-stream" "f_stm_er.htm") - ("stream-external-format" "f_stm_ex.htm") - ("streamp" "f_stmp.htm") - ("string" "a_string.htm") - ("string-capitalize" "f_stg_up.htm") - ("string-downcase" "f_stg_up.htm") - ("string-equal" "f_stgeq_.htm") - ("string-greaterp" "f_stgeq_.htm") - ("string-left-trim" "f_stg_tr.htm") - ("string-lessp" "f_stgeq_.htm") - ("string-not-equal" "f_stgeq_.htm") - ("string-not-greaterp" "f_stgeq_.htm") - ("string-not-lessp" "f_stgeq_.htm") - ("string-right-trim" "f_stg_tr.htm") - ("string-stream" "t_stg_st.htm") - ("string-trim" "f_stg_tr.htm") - ("string-upcase" "f_stg_up.htm") - ("string/=" "f_stgeq_.htm") - ("string<" "f_stgeq_.htm") - ("string<=" "f_stgeq_.htm") - ("string=" "f_stgeq_.htm") - ("string>" "f_stgeq_.htm") - ("string>=" "f_stgeq_.htm") - ("stringp" "f_stgp.htm") - ("structure" "f_docume.htm") - ("structure-class" "t_stu_cl.htm") - ("structure-object" "t_stu_ob.htm") - ("style-warning" "e_style_.htm") - ("sublis" "f_sublis.htm") - ("subseq" "f_subseq.htm") - ("subsetp" "f_subset.htm") - ("subst" "f_substc.htm") - ("subst-if" "f_substc.htm") - ("subst-if-not" "f_substc.htm") - ("substitute" "f_sbs_s.htm") - ("substitute-if" "f_sbs_s.htm") - ("substitute-if-not" "f_sbs_s.htm") - ("subtypep" "f_subtpp.htm") - ("svref" "f_svref.htm") - ("sxhash" "f_sxhash.htm") - ("symbol" "t_symbol.htm") - ("symbol-function" "f_symb_1.htm") - ("symbol-macrolet" "s_symbol.htm") - ("symbol-name" "f_symb_2.htm") - ("symbol-package" "f_symb_3.htm") - ("symbol-plist" "f_symb_4.htm") - ("symbol-value" "f_symb_5.htm") - ("symbolp" "f_symbol.htm") - ("synonym-stream" "t_syn_st.htm") - ("synonym-stream-symbol" "f_syn_st.htm") - ("t" "a_t.htm") - ("tagbody" "s_tagbod.htm") - ("tailp" "f_ldiffc.htm") - ("tan" "f_sin_c.htm") - ("tanh" "f_sinh_.htm") - ("tenth" "f_firstc.htm") - ("terpri" "f_terpri.htm") - ("the" "s_the.htm") - ("third" "f_firstc.htm") - ("throw" "s_throw.htm") - ("time" "m_time.htm") - ("trace" "m_tracec.htm") - ("translate-logical-pathname" "f_tr_log.htm") - ("translate-pathname" "f_tr_pn.htm") - ("tree-equal" "f_tree_e.htm") - ("truename" "f_tn.htm") - ("truncate" "f_floorc.htm") - ("two-way-stream" "t_two_wa.htm") - ("two-way-stream-input-stream" "f_two_wa.htm") - ("two-way-stream-output-stream" "f_two_wa.htm") - ("type" "a_type.htm") - ("type-error" "e_tp_err.htm") - ("type-error-datum" "f_tp_err.htm") - ("type-error-expected-type" "f_tp_err.htm") - ("type-of" "f_tp_of.htm") - ("typecase" "m_tpcase.htm") - ("typep" "f_typep.htm") - ("unbound-slot" "e_unboun.htm") - ("unbound-slot-instance" "f_unboun.htm") - ("unbound-variable" "e_unbo_1.htm") - ("undefined-function" "e_undefi.htm") - ("unexport" "f_unexpo.htm") - ("unintern" "f_uninte.htm") - ("union" "f_unionc.htm") - ("unless" "m_when_.htm") - ("unread-char" "f_unrd_c.htm") - ("unsigned-byte" "t_unsgn_.htm") - ("untrace" "m_tracec.htm") - ("unuse-package" "f_unuse_.htm") - ("unwind-protect" "s_unwind.htm") - ("update-instance-for-different-class" "f_update.htm") - ("update-instance-for-redefined-class" "f_upda_1.htm") - ("upgraded-array-element-type" "f_upgr_1.htm") - ("upgraded-complex-part-type" "f_upgrad.htm") - ("upper-case-p" "f_upper_.htm") - ("use-package" "f_use_pk.htm") - ("use-value" "a_use_va.htm") - ("user-homedir-pathname" "f_user_h.htm") - ("values" "a_values.htm") - ("values-list" "f_vals_l.htm") - ("variable" "f_docume.htm") - ("vector" "a_vector.htm") - ("vector-pop" "f_vec_po.htm") - ("vector-push" "f_vec_ps.htm") - ("vector-push-extend" "f_vec_ps.htm") - ("vectorp" "f_vecp.htm") - ("warn" "f_warn.htm") - ("warning" "e_warnin.htm") - ("when" "m_when_.htm") - ("wild-pathname-p" "f_wild_p.htm") - ("with-accessors" "m_w_acce.htm") - ("with-compilation-unit" "m_w_comp.htm") - ("with-condition-restarts" "m_w_cnd_.htm") - ("with-hash-table-iterator" "m_w_hash.htm") - ("with-input-from-string" "m_w_in_f.htm") - ("with-open-file" "m_w_open.htm") - ("with-open-stream" "m_w_op_1.htm") - ("with-output-to-string" "m_w_out_.htm") - ("with-package-iterator" "m_w_pkg_.htm") - ("with-simple-restart" "m_w_smp_.htm") - ("with-slots" "m_w_slts.htm") - ("with-standard-io-syntax" "m_w_std_.htm") - ("write" "f_wr_pr.htm") - ("write-byte" "f_wr_by.htm") - ("write-char" "f_wr_cha.htm") - ("write-line" "f_wr_stg.htm") - ("write-sequence" "f_wr_seq.htm") - ("write-string" "f_wr_stg.htm") - ("write-to-string" "f_wr_to_.htm") - ("y-or-n-p" "f_y_or_n.htm") - ("yes-or-no-p" "f_y_or_n.htm") - ("zerop" "f_zerop.htm")))) - -;;; Added entries for reader macros. -;;; -;;; 20090302 Tobias C Rittweiler, and Stas Boukarev - -(defvar common-lisp-hyperspec--reader-macros (make-hash-table :test #'equal)) - -;;; Data/Map_Sym.txt in does not contain entries for the reader -;;; macros. So we have to enumerate these explicitly. -(mapc (lambda (entry) - (puthash (car entry) (cadr entry) - common-lisp-hyperspec--reader-macros)) - '(("#" "02_dh.htm") - ("##" "02_dhp.htm") - ("#'" "02_dhb.htm") - ("#(" "02_dhc.htm") - ("#*" "02_dhd.htm") - ("#:" "02_dhe.htm") - ("#." "02_dhf.htm") - ("#=" "02_dho.htm") - ("#+" "02_dhq.htm") - ("#-" "02_dhr.htm") - ("#<" "02_dht.htm") - ("#A" "02_dhl.htm") - ("#B" "02_dhg.htm") - ("#C" "02_dhk.htm") - ("#O" "02_dhh.htm") - ("#P" "02_dhn.htm") - ("#R" "02_dhj.htm") - ("#S" "02_dhm.htm") - ("#X" "02_dhi.htm") - ("#\\" "02_dha.htm") - ("#|" "02_dhs.htm") - ("\"" "02_de.htm") - ("'" "02_dc.htm") - ("`" "02_df.htm") - ("," "02_dg.htm") - ("(" "02_da.htm") - (")" "02_db.htm") - (";" "02_dd.htm"))) - -(defun common-lisp-hyperspec-lookup-reader-macro (macro) - "Browse the CLHS entry for the reader-macro MACRO." - (interactive - (list - (let ((completion-ignore-case t)) - (completing-read "Look up reader-macro: " - common-lisp-hyperspec--reader-macros nil t - (common-lisp-hyperspec-reader-macro-at-point))))) - (browse-url - (concat common-lisp-hyperspec-root "Body/" - (gethash macro common-lisp-hyperspec--reader-macros)))) - -(defun common-lisp-hyperspec-reader-macro-at-point () - (let ((regexp "\\(#.?\\)\\|\\([\"',`';()]\\)")) - (when (looking-back regexp nil t) - (match-string-no-properties 0)))) - -;;; FORMAT character lookup by Frode Vatvedt Fjeld 20030902 -;;; -;;; adjusted for ILISP by Nikodemus Siivola 20030903 - -(defvar common-lisp-hyperspec-format-history nil - "History of format characters looked up in the Common Lisp HyperSpec.") - -(defun common-lisp-hyperspec-section-6.0 (indices) - (let ((string (format "%sBody/%s_" - common-lisp-hyperspec-root - (let ((base (pop indices))) - (if (< base 10) - (format "0%s" base) - base))))) - (concat string - (mapconcat (lambda (n) - (make-string 1 (+ ?a (- n 1)))) - indices - "") - ".htm"))) - -(defun common-lisp-hyperspec-section-4.0 (indices) - (let ((string (format "%sBody/sec_" - common-lisp-hyperspec-root))) - (concat string - (mapconcat (lambda (n) - (format "%d" n)) - indices - "-") - ".html"))) - -(defvar common-lisp-hyperspec-section-fun 'common-lisp-hyperspec-section-6.0) - -(defun common-lisp-hyperspec-section (indices) - (funcall common-lisp-hyperspec-section-fun indices)) - -(defvar common-lisp-hyperspec--format-characters - (make-hash-table :test 'equal)) - -(defun common-lisp-hyperspec--read-format-character () - (let ((char-at-point - (ignore-errors (char-to-string (char-after (point)))))) - (if (and char-at-point - (gethash (upcase char-at-point) - common-lisp-hyperspec--format-characters)) - char-at-point - (completing-read - "Look up format control character in Common Lisp HyperSpec: " - common-lisp-hyperspec--format-characters nil t nil - 'common-lisp-hyperspec-format-history)))) - -(defun common-lisp-hyperspec-format (character-name) - (interactive (list (common-lisp-hyperspec--read-format-character))) - (cl-maplist (lambda (entry) - (browse-url (common-lisp-hyperspec-section (car entry)))) - (or (gethash character-name - common-lisp-hyperspec--format-characters) - (error "The symbol `%s' is not defined in Common Lisp" - character-name)))) - -;;; Previously there were entries for "C" and "C: Character", -;;; which unpleasingly crowded the completion buffer, so I made -;;; it show one entry ("C - Character") only. -;;; -;;; 20100131 Tobias C Rittweiler - -(defun common-lisp-hyperspec--insert-format-directive (char section - &optional summary) - (let* ((designator (if summary (format "%s - %s" char summary) char))) - (cl-pushnew section (gethash designator - common-lisp-hyperspec--format-characters) - :test #'equal))) - -(mapc (lambda (entry) - (cl-destructuring-bind (char section &optional summary) entry - (common-lisp-hyperspec--insert-format-directive char section summary) - (when (and (= 1 (length char)) - (not (string-equal char (upcase char)))) - (common-lisp-hyperspec--insert-format-directive - (upcase char) section summary)))) - '(("c" (22 3 1 1) "Character") - ("%" (22 3 1 2) "Newline") - ("&" (22 3 1 3) "Fresh-line") - ("|" (22 3 1 4) "Page") - ("~" (22 3 1 5) "Tilde") - ("r" (22 3 2 1) "Radix") - ("d" (22 3 2 2) "Decimal") - ("b" (22 3 2 3) "Binary") - ("o" (22 3 2 4) "Octal") - ("x" (22 3 2 5) "Hexadecimal") - ("f" (22 3 3 1) "Fixed-Format Floating-Point") - ("e" (22 3 3 2) "Exponential Floating-Point") - ("g" (22 3 3 3) "General Floating-Point") - ("$" (22 3 3 4) "Monetary Floating-Point") - ("a" (22 3 4 1) "Aesthetic") - ("s" (22 3 4 2) "Standard") - ("w" (22 3 4 3) "Write") - ("_" (22 3 5 1) "Conditional Newline") - ("<" (22 3 5 2) "Logical Block") - ("i" (22 3 5 3) "Indent") - ("/" (22 3 5 4) "Call Function") - ("t" (22 3 6 1) "Tabulate") - ("<" (22 3 6 2) "Justification") - (">" (22 3 6 3) "End of Justification") - ("*" (22 3 7 1) "Go-To") - ("[" (22 3 7 2) "Conditional Expression") - ("]" (22 3 7 3) "End of Conditional Expression") - ("{" (22 3 7 4) "Iteration") - ("}" (22 3 7 5) "End of Iteration") - ("?" (22 3 7 6) "Recursive Processing") - ("(" (22 3 8 1) "Case Conversion") - (")" (22 3 8 2) "End of Case Conversion") - ("p" (22 3 8 3) "Plural") - (";" (22 3 9 1) "Clause Separator") - ("^" (22 3 9 2) "Escape Upward") - ("Newline: Ignored Newline" (22 3 9 3)) - ("Nesting of FORMAT Operations" (22 3 10 1)) - ("Missing and Additional FORMAT Arguments" (22 3 10 2)) - ("Additional FORMAT Parameters" (22 3 10 3)))) - - -;;;; Glossary - -(defvar common-lisp-hyperspec-glossary-function 'common-lisp-glossary-6.0 - "Function that creates a URL for a glossary term.") - -(define-obsolete-variable-alias 'common-lisp-glossary-fun - 'common-lisp-hyperspec-glossary-function) - -(defvar common-lisp-hyperspec--glossary-terms (make-hash-table :test #'equal) - "Collection of glossary terms and relative URLs.") - -;;; Functions - -;;; The functions below are used to collect glossary terms and page anchors -;;; from CLHS. They are commented out because they are not needed unless the -;;; list of terms/anchors need to be updated. - -;; (defun common-lisp-hyperspec-glossary-pages () -;; "List of CLHS glossary pages." -;; (mapcar (lambda (end) -;; (format "%sBody/26_glo_%s.htm" -;; common-lisp-hyperspec-root -;; end)) -;; (cons "9" (mapcar #'char-to-string -;; (number-sequence ?a ?z))))) - -;; (defun common-lisp-hyperspec-glossary-download () -;; "Download CLHS glossary pages to temporary files and return a -;; list of file names." -;; (mapcar (lambda (url) -;; (url-file-local-copy url)) -;; (common-lisp-hyperspec-glossary-pages))) - -;; (defun common-lisp-hyperspec-glossary-entries (file) -;; "Given a CLHS glossary file FILE, return a list of -;; term-anchor pairs. - -;; Term is the glossary term and anchor is the term's anchor on the -;; page." -;; (let (entries) -;; (save-excursion -;; (set-buffer (find-file-noselect file)) -;; (goto-char (point-min)) -;; (while (search-forward-regexp "\\(.*?\\)" nil t) -;; (setq entries (cons (list (match-string-no-properties 2) -;; (match-string-no-properties 1)) -;; entries)))) -;; (sort entries (lambda (a b) -;; (string< (car a) (car b)))))) - -;; ;; Add glossary terms by downloading and parsing glossary pages from CLHS -;; (mapc (lambda (entry) -;; (puthash (car entry) (cadr entry) -;; common-lisp-hyperspec--glossary-terms)) -;; (cl-reduce (lambda (a b) -;; (append a b)) -;; (mapcar #'common-lisp-hyperspec-glossary-entries -;; (common-lisp-hyperspec-glossary-download)))) - -;; Add glossary entries to the master hash table -(mapc (lambda (entry) - (puthash (car entry) (cadr entry) - common-lisp-hyperspec--glossary-terms)) - '(("()" "OPCP") - ("absolute" "absolute") - ("access" "access") - ("accessibility" "accessibility") - ("accessible" "accessible") - ("accessor" "accessor") - ("active" "active") - ("actual adjustability" "actual_adjustability") - ("actual argument" "actual_argument") - ("actual array element type" "actual_array_element_type") - ("actual complex part type" "actual_complex_part_type") - ("actual parameter" "actual_parameter") - ("actually adjustable" "actually_adjustable") - ("adjustability" "adjustability") - ("adjustable" "adjustable") - ("after method" "after_method") - ("alist" "alist") - ("alphabetic" "alphabetic") - ("alphanumeric" "alphanumeric") - ("ampersand" "ampersand") - ("anonymous" "anonymous") - ("apparently uninterned" "apparently_uninterned") - ("applicable" "applicable") - ("applicable handler" "applicable_handler") - ("applicable method" "applicable_method") - ("applicable restart" "applicable_restart") - ("apply" "apply") - ("argument" "argument") - ("argument evaluation order" "argument_evaluation_order") - ("argument precedence order" "argument_precedence_order") - ("around method" "around_method") - ("array" "array") - ("array element type" "array_element_type") - ("array total size" "array_total_size") - ("assign" "assign") - ("association list" "association_list") - ("asterisk" "asterisk") - ("at-sign" "at-sign") - ("atom" "atom") - ("atomic" "atomic") - ("atomic type specifier" "atomic_type_specifier") - ("attribute" "attribute") - ("aux variable" "aux_variable") - ("auxiliary method" "auxiliary_method") - ("backquote" "backquote") - ("backslash" "backslash") - ("base character" "base_character") - ("base string" "base_string") - ("before method" "before_method") - ("bidirectional" "bidirectional") - ("binary" "binary") - ("bind" "bind") - ("binding" "binding") - ("bit" "bit") - ("bit array" "bit_array") - ("bit vector" "bit_vector") - ("bit-wise logical operation specifier" "bit-wise_logical_operation_specifier") - ("block" "block") - ("block tag" "block_tag") - ("boa lambda list" "boa_lambda_list") - ("body parameter" "body_parameter") - ("boolean" "boolean") - ("boolean equivalent" "boolean_equivalent") - ("bound" "bound") - ("bound declaration" "bound_declaration") - ("bounded" "bounded") - ("bounding index" "bounding_index") - ("bounding index designator" "bounding_index_designator") - ("break loop" "break_loop") - ("broadcast stream" "broadcast_stream") - ("built-in class" "built-in_class") - ("built-in type" "built-in_type") - ("byte" "byte") - ("byte specifier" "byte_specifier") - ("cadr" "cadr") - ("call" "call") - ("captured initialization form" "captured_initialization_form") - ("car" "car") - ("case" "case") - ("case sensitivity mode" "case_sensitivity_mode") - ("catch" "catch") - ("catch tag" "catch_tag") - ("cddr" "cddr") - ("cdr" "cdr") - ("cell" "cell") - ("character" "character") - ("character code" "character_code") - ("character designator" "character_designator") - ("circular" "circular") - ("circular list" "circular_list") - ("class" "class") - ("class designator" "class_designator") - ("class precedence list" "class_precedence_list") - ("close" "close") - ("closed" "closed") - ("closure" "closure") - ("coalesce" "coalesce") - ("code" "code") - ("coerce" "coerce") - ("colon" "colon") - ("comma" "comma") - ("compilation" "compilation") - ("compilation environment" "compilation_environment") - ("compilation unit" "compilation_unit") - ("compile" "compile") - ("compile time" "compile_time") - ("compile-time definition" "compile-time_definition") - ("compiled code" "compiled_code") - ("compiled file" "compiled_file") - ("compiled function" "compiled_function") - ("compiler" "compiler") - ("compiler macro" "compiler_macro") - ("compiler macro expansion" "compiler_macro_expansion") - ("compiler macro form" "compiler_macro_form") - ("compiler macro function" "compiler_macro_function") - ("complex" "complex") - ("complex float" "complex_float") - ("complex part type" "complex_part_type") - ("complex rational" "complex_rational") - ("complex single float" "complex_single_float") - ("composite stream" "composite_stream") - ("compound form" "compound_form") - ("compound type specifier" "compound_type_specifier") - ("concatenated stream" "concatenated_stream") - ("condition" "condition") - ("condition designator" "condition_designator") - ("condition handler" "condition_handler") - ("condition reporter" "condition_reporter") - ("conditional newline" "conditional_newline") - ("conformance" "conformance") - ("conforming code" "conforming_code") - ("conforming implementation" "conforming_implementation") - ("conforming processor" "conforming_processor") - ("conforming program" "conforming_program") - ("congruent" "congruent") - ("cons" "cons") - ("constant" "constant") - ("constant form" "constant_form") - ("constant object" "constant_object") - ("constant variable" "constant_variable") - ("constituent" "constituent") - ("constituent trait" "constituent_trait") - ("constructed stream" "constructed_stream") - ("contagion" "contagion") - ("continuable" "continuable") - ("control form" "control_form") - ("copy" "copy") - ("correctable" "correctable") - ("current input base" "current_input_base") - ("current logical block" "current_logical_block") - ("current output base" "current_output_base") - ("current package" "current_package") - ("current pprint dispatch table" "current_pprint_dispatch_table") - ("current random state" "current_random_state") - ("current readtable" "current_readtable") - ("data type" "data_type") - ("debug I/O" "debug_iSLo") - ("debugger" "debugger") - ("declaration" "declaration") - ("declaration identifier" "declaration_identifier") - ("declaration specifier" "declaration_specifier") - ("declare" "declare") - ("decline" "decline") - ("decoded time" "decoded_time") - ("default method" "default_method") - ("defaulted initialization argument list" "defaulted_initialization_argument_list") - ("define-method-combination arguments lambda list" "define-method-combination_arguments_lambda_list") - ("define-modify-macro lambda list" "define-modify-macro_lambda_list") - ("defined name" "defined_name") - ("defining form" "defining_form") - ("defsetf lambda list" "defsetf_lambda_list") - ("deftype lambda list" "deftype_lambda_list") - ("denormalized" "denormalized") - ("derived type" "derived_type") - ("derived type specifier" "derived_type_specifier") - ("designator" "designator") - ("destructive" "destructive") - ("destructuring lambda list" "destructuring_lambda_list") - ("different" "different") - ("digit" "digit") - ("dimension" "dimension") - ("direct instance" "direct_instance") - ("direct subclass" "direct_subclass") - ("direct superclass" "direct_superclass") - ("disestablish" "disestablish") - ("disjoint" "disjoint") - ("dispatching macro character" "dispatching_macro_character") - ("displaced array" "displaced_array") - ("distinct" "distinct") - ("documentation string" "documentation_string") - ("dot" "dot") - ("dotted list" "dotted_list") - ("dotted pair" "dotted_pair") - ("double float" "double_float") - ("double-quote" "double-quote") - ("dynamic binding" "dynamic_binding") - ("dynamic environment" "dynamic_environment") - ("dynamic extent" "dynamic_extent") - ("dynamic scope" "dynamic_scope") - ("dynamic variable" "dynamic_variable") - ("echo stream" "echo_stream") - ("effective method" "effective_method") - ("element" "element") - ("element type" "element_type") - ("em" "em") - ("empty list" "empty_list") - ("empty type" "empty_type") - ("end of file" "end_of_file") - ("environment" "environment") - ("environment object" "environment_object") - ("environment parameter" "environment_parameter") - ("error" "error") - ("error output" "error_output") - ("escape" "escape") - ("establish" "establish") - ("evaluate" "evaluate") - ("evaluation" "evaluation") - ("evaluation environment" "evaluation_environment") - ("execute" "execute") - ("execution time" "execution_time") - ("exhaustive partition" "exhaustive_partition") - ("exhaustive union" "exhaustive_union") - ("exit point" "exit_point") - ("explicit return" "explicit_return") - ("explicit use" "explicit_use") - ("exponent marker" "exponent_marker") - ("export" "export") - ("exported" "exported") - ("expressed adjustability" "expressed_adjustability") - ("expressed array element type" "expressed_array_element_type") - ("expressed complex part type" "expressed_complex_part_type") - ("expression" "expression") - ("expressly adjustable" "expressly_adjustable") - ("extended character" "extended_character") - ("extended function designator" "extended_function_designator") - ("extended lambda list" "extended_lambda_list") - ("extension" "extension") - ("extent" "extent") - ("external file format" "external_file_format") - ("external file format designator" "external_file_format_designator") - ("external symbol" "external_symbol") - ("externalizable object" "externalizable_object") - ("false" "false") - ("fbound" "fbound") - ("feature" "feature") - ("feature expression" "feature_expression") - ("features list" "features_list") - ("file" "file") - ("file compiler" "file_compiler") - ("file position" "file_position") - ("file position designator" "file_position_designator") - ("file stream" "file_stream") - ("file system" "file_system") - ("filename" "filename") - ("fill pointer" "fill_pointer") - ("finite" "finite") - ("fixnum" "fixnum") - ("float" "float") - ("for-value" "for-value") - ("form" "form") - ("formal argument" "formal_argument") - ("formal parameter" "formal_parameter") - ("format" "format") - ("format argument" "format_argument") - ("format control" "format_control") - ("format directive" "format_directive") - ("format string" "format_string") - ("free declaration" "free_declaration") - ("fresh" "fresh") - ("freshline" "freshline") - ("funbound" "funbound") - ("function" "function") - ("function block name" "function_block_name") - ("function cell" "function_cell") - ("function designator" "function_designator") - ("function form" "function_form") - ("function name" "function_name") - ("functional evaluation" "functional_evaluation") - ("functional value" "functional_value") - ("further compilation" "further_compilation") - ("general" "general") - ("generalized boolean" "generalized_boolean") - ("generalized instance" "generalized_instance") - ("generalized reference" "generalized_reference") - ("generalized synonym stream" "generalized_synonym_stream") - ("generic function" "generic_function") - ("generic function lambda list" "generic_function_lambda_list") - ("gensym" "gensym") - ("global declaration" "global_declaration") - ("global environment" "global_environment") - ("global variable" "global_variable") - ("glyph" "glyph") - ("go" "go") - ("go point" "go_point") - ("go tag" "go_tag") - ("graphic" "graphic") - ("handle" "handle") - ("handler" "handler") - ("hash table" "hash_table") - ("home package" "home_package") - ("I/O customization variable" "iSLo_customization_variable") - ("identical" "identical") - ("identifier" "identifier") - ("immutable" "immutable") - ("implementation" "implementation") - ("implementation limit" "implementation_limit") - ("implementation-defined" "implementation-defined") - ("implementation-dependent" "implementation-dependent") - ("implementation-independent" "implementation-independent") - ("implicit block" "implicit_block") - ("implicit compilation" "implicit_compilation") - ("implicit progn" "implicit_progn") - ("implicit tagbody" "implicit_tagbody") - ("import" "import") - ("improper list" "improper_list") - ("inaccessible" "inaccessible") - ("indefinite extent" "indefinite_extent") - ("indefinite scope" "indefinite_scope") - ("indicator" "indicator") - ("indirect instance" "indirect_instance") - ("inherit" "inherit") - ("initial pprint dispatch table" "initial_pprint_dispatch_table") - ("initial readtable" "initial_readtable") - ("initialization argument list" "initialization_argument_list") - ("initialization form" "initialization_form") - ("input" "input") - ("instance" "instance") - ("integer" "integer") - ("interactive stream" "interactive_stream") - ("intern" "intern") - ("internal symbol" "internal_symbol") - ("internal time" "internal_time") - ("internal time unit" "internal_time_unit") - ("interned" "interned") - ("interpreted function" "interpreted_function") - ("interpreted implementation" "interpreted_implementation") - ("interval designator" "interval_designator") - ("invalid" "invalid") - ("iteration form" "iteration_form") - ("iteration variable" "iteration_variable") - ("key" "key") - ("keyword" "keyword") - ("keyword parameter" "keyword_parameter") - ("keyword/value pair" "keywordSLvalue_pair") - ("Lisp image" "lisp_image") - ("Lisp printer" "lisp_printer") - ("Lisp read-eval-print loop" "lisp_read-eval-print_loop") - ("Lisp reader" "lisp_reader") - ("lambda combination" "lambda_combination") - ("lambda expression" "lambda_expression") - ("lambda form" "lambda_form") - ("lambda list" "lambda_list") - ("lambda list keyword" "lambda_list_keyword") - ("lambda variable" "lambda_variable") - ("leaf" "leaf") - ("leap seconds" "leap_seconds") - ("left-parenthesis" "left-parenthesis") - ("length" "length") - ("lexical binding" "lexical_binding") - ("lexical closure" "lexical_closure") - ("lexical environment" "lexical_environment") - ("lexical scope" "lexical_scope") - ("lexical variable" "lexical_variable") - ("list" "list") - ("list designator" "list_designator") - ("list structure" "list_structure") - ("literal" "literal") - ("load" "load") - ("load time" "load_time") - ("load time value" "load_time_value") - ("loader" "loader") - ("local declaration" "local_declaration") - ("local precedence order" "local_precedence_order") - ("local slot" "local_slot") - ("logical block" "logical_block") - ("logical host" "logical_host") - ("logical host designator" "logical_host_designator") - ("logical pathname" "logical_pathname") - ("long float" "long_float") - ("loop keyword" "loop_keyword") - ("lowercase" "lowercase") - ("Metaobject Protocol" "metaobject_protocol") - ("macro" "macro") - ("macro character" "macro_character") - ("macro expansion" "macro_expansion") - ("macro form" "macro_form") - ("macro function" "macro_function") - ("macro lambda list" "macro_lambda_list") - ("macro name" "macro_name") - ("macroexpand hook" "macroexpand_hook") - ("mapping" "mapping") - ("metaclass" "metaclass") - ("method" "method") - ("method combination" "method_combination") - ("method-defining form" "method-defining_form") - ("method-defining operator" "method-defining_operator") - ("minimal compilation" "minimal_compilation") - ("modified lambda list" "modified_lambda_list") - ("most recent" "most_recent") - ("multiple escape" "multiple_escape") - ("multiple values" "multiple_values") - ("name" "name") - ("named constant" "named_constant") - ("namespace" "namespace") - ("namestring" "namestring") - ("newline" "newline") - ("next method" "next_method") - ("nickname" "nickname") - ("nil" "nil") - ("non-atomic" "non-atomic") - ("non-constant variable" "non-constant_variable") - ("non-correctable" "non-correctable") - ("non-empty" "non-empty") - ("non-generic function" "non-generic_function") - ("non-graphic" "non-graphic") - ("non-list" "non-list") - ("non-local exit" "non-local_exit") - ("non-nil" "non-nil") - ("non-null lexical environment" "non-null_lexical_environment") - ("non-simple" "non-simple") - ("non-terminating" "non-terminating") - ("non-top-level form" "non-top-level_form") - ("normal return" "normal_return") - ("normalized" "normalized") - ("null" "null") - ("null lexical environment" "null_lexical_environment") - ("number" "number") - ("numeric" "numeric") - ("object" "object") - ("object-traversing" "object-traversing") - ("open" "open") - ("operator" "operator") - ("optimize quality" "optimize_quality") - ("optional parameter" "optional_parameter") - ("ordinary function" "ordinary_function") - ("ordinary lambda list" "ordinary_lambda_list") - ("otherwise inaccessible part" "otherwise_inaccessible_part") - ("output" "output") - ("package" "package") - ("package cell" "package_cell") - ("package designator" "package_designator") - ("package marker" "package_marker") - ("package prefix" "package_prefix") - ("package registry" "package_registry") - ("pairwise" "pairwise") - ("parallel" "parallel") - ("parameter" "parameter") - ("parameter specializer" "parameter_specializer") - ("parameter specializer name" "parameter_specializer_name") - ("pathname" "pathname") - ("pathname designator" "pathname_designator") - ("physical pathname" "physical_pathname") - ("place" "place") - ("plist" "plist") - ("portable" "portable") - ("potential copy" "potential_copy") - ("potential number" "potential_number") - ("pprint dispatch table" "pprint_dispatch_table") - ("predicate" "predicate") - ("present" "present") - ("pretty print" "pretty_print") - ("pretty printer" "pretty_printer") - ("pretty printing stream" "pretty_printing_stream") - ("primary method" "primary_method") - ("primary value" "primary_value") - ("principal" "principal") - ("print name" "print_name") - ("printer control variable" "printer_control_variable") - ("printer escaping" "printer_escaping") - ("printing" "printing") - ("process" "process") - ("processor" "processor") - ("proclaim" "proclaim") - ("proclamation" "proclamation") - ("prog tag" "prog_tag") - ("program" "program") - ("programmer" "programmer") - ("programmer code" "programmer_code") - ("proper list" "proper_list") - ("proper name" "proper_name") - ("proper sequence" "proper_sequence") - ("proper subtype" "proper_subtype") - ("property" "property") - ("property indicator" "property_indicator") - ("property list" "property_list") - ("property value" "property_value") - ("purports to conform" "purports_to_conform") - ("qualified method" "qualified_method") - ("qualifier" "qualifier") - ("query I/O" "query_iSLo") - ("quoted object" "quoted_object") - ("radix" "radix") - ("random state" "random_state") - ("rank" "rank") - ("ratio" "ratio") - ("ratio marker" "ratio_marker") - ("rational" "rational") - ("read" "read") - ("readably" "readably") - ("reader" "reader") - ("reader macro" "reader_macro") - ("reader macro function" "reader_macro_function") - ("readtable" "readtable") - ("readtable case" "readtable_case") - ("readtable designator" "readtable_designator") - ("recognizable subtype" "recognizable_subtype") - ("reference" "reference") - ("registered package" "registered_package") - ("relative" "relative") - ("repertoire" "repertoire") - ("report" "report") - ("report message" "report_message") - ("required parameter" "required_parameter") - ("rest list" "rest_list") - ("rest parameter" "rest_parameter") - ("restart" "restart") - ("restart designator" "restart_designator") - ("restart function" "restart_function") - ("return" "return") - ("return value" "return_value") - ("right-parenthesis" "right-parenthesis") - ("run time" "run_time") - ("run-time compiler" "run-time_compiler") - ("run-time definition" "run-time_definition") - ("run-time environment" "run-time_environment") - ("safe" "safe") - ("safe call" "safe_call") - ("same" "same") - ("satisfy the test" "satisfy_the_test") - ("scope" "scope") - ("script" "script") - ("secondary value" "secondary_value") - ("section" "section") - ("self-evaluating object" "self-evaluating_object") - ("semi-standard" "semi-standard") - ("semicolon" "semicolon") - ("sequence" "sequence") - ("sequence function" "sequence_function") - ("sequential" "sequential") - ("sequentially" "sequentially") - ("serious condition" "serious_condition") - ("session" "session") - ("set" "set") - ("setf expander" "setf_expander") - ("setf expansion" "setf_expansion") - ("setf function" "setf_function") - ("setf function name" "setf_function_name") - ("shadow" "shadow") - ("shadowing symbol" "shadowing_symbol") - ("shadowing symbols list" "shadowing_symbols_list") - ("shared slot" "shared_slot") - ("sharpsign" "sharpsign") - ("short float" "short_float") - ("sign" "sign") - ("signal" "signal") - ("signature" "signature") - ("similar" "similar") - ("similarity" "similarity") - ("simple" "simple") - ("simple array" "simple_array") - ("simple bit array" "simple_bit_array") - ("simple bit vector" "simple_bit_vector") - ("simple condition" "simple_condition") - ("simple general vector" "simple_general_vector") - ("simple string" "simple_string") - ("simple vector" "simple_vector") - ("single escape" "single_escape") - ("single float" "single_float") - ("single-quote" "single-quote") - ("singleton" "singleton") - ("situation" "situation") - ("slash" "slash") - ("slot" "slot") - ("slot specifier" "slot_specifier") - ("source code" "source_code") - ("source file" "source_file") - ("space" "space") - ("special form" "special_form") - ("special operator" "special_operator") - ("special variable" "special_variable") - ("specialize" "specialize") - ("specialized" "specialized") - ("specialized lambda list" "specialized_lambda_list") - ("spreadable argument list designator" "spreadable_argument_list_designator") - ("stack allocate" "stack_allocate") - ("stack-allocated" "stack-allocated") - ("standard character" "standard_character") - ("standard class" "standard_class") - ("standard generic function" "standard_generic_function") - ("standard input" "standard_input") - ("standard method combination" "standard_method_combination") - ("standard object" "standard_object") - ("standard output" "standard_output") - ("standard pprint dispatch table" "standard_pprint_dispatch_table") - ("standard readtable" "standard_readtable") - ("standard syntax" "standard_syntax") - ("standardized" "standardized") - ("startup environment" "startup_environment") - ("step" "step") - ("stream" "stream") - ("stream associated with a file" "stream_associated_with_a_file") - ("stream designator" "stream_designator") - ("stream element type" "stream_element_type") - ("stream variable" "stream_variable") - ("stream variable designator" "stream_variable_designator") - ("string" "string") - ("string designator" "string_designator") - ("string equal" "string_equal") - ("string stream" "string_stream") - ("structure" "structure") - ("structure class" "structure_class") - ("structure name" "structure_name") - ("style warning" "style_warning") - ("subclass" "subclass") - ("subexpression" "subexpression") - ("subform" "subform") - ("subrepertoire" "subrepertoire") - ("subtype" "subtype") - ("superclass" "superclass") - ("supertype" "supertype") - ("supplied-p parameter" "supplied-p_parameter") - ("symbol" "symbol") - ("symbol macro" "symbol_macro") - ("synonym stream" "synonym_stream") - ("synonym stream symbol" "synonym_stream_symbol") - ("syntax type" "syntax_type") - ("system class" "system_class") - ("system code" "system_code") - ("t" "t") - ("tag" "tag") - ("tail" "tail") - ("target" "target") - ("terminal I/O" "terminal_iSLo") - ("terminating" "terminating") - ("tertiary value" "tertiary_value") - ("throw" "throw") - ("tilde" "tilde") - ("time" "time") - ("time zone" "time_zone") - ("token" "token") - ("top level form" "top_level_form") - ("trace output" "trace_output") - ("tree" "tree") - ("tree structure" "tree_structure") - ("true" "true") - ("truename" "truename") - ("two-way stream" "two-way_stream") - ("type" "type") - ("type declaration" "type_declaration") - ("type equivalent" "type_equivalent") - ("type expand" "type_expand") - ("type specifier" "type_specifier") - ("unbound" "unbound") - ("unbound variable" "unbound_variable") - ("undefined function" "undefined_function") - ("unintern" "unintern") - ("uninterned" "uninterned") - ("universal time" "universal_time") - ("unqualified method" "unqualified_method") - ("unregistered package" "unregistered_package") - ("unsafe" "unsafe") - ("unsafe call" "unsafe_call") - ("upgrade" "upgrade") - ("upgraded array element type" "upgraded_array_element_type") - ("upgraded complex part type" "upgraded_complex_part_type") - ("uppercase" "uppercase") - ("use" "use") - ("use list" "use_list") - ("user" "user") - ("valid array dimension" "valid_array_dimension") - ("valid array index" "valid_array_index") - ("valid array row-major index" "valid_array_row-major_index") - ("valid fill pointer" "valid_fill_pointer") - ("valid logical pathname host" "valid_logical_pathname_host") - ("valid pathname device" "valid_pathname_device") - ("valid pathname directory" "valid_pathname_directory") - ("valid pathname host" "valid_pathname_host") - ("valid pathname name" "valid_pathname_name") - ("valid pathname type" "valid_pathname_type") - ("valid pathname version" "valid_pathname_version") - ("valid physical pathname host" "valid_physical_pathname_host") - ("valid sequence index" "valid_sequence_index") - ("value" "value") - ("value cell" "value_cell") - ("variable" "variable") - ("vector" "vector") - ("vertical-bar" "vertical-bar") - ("whitespace" "whitespace") - ("wild" "wild") - ("write" "write") - ("writer" "writer") - ("yield" "yield"))) - -(defun common-lisp-hyperspec-glossary-term (term) - "View the definition of TERM on the Common Lisp Hyperspec." - (interactive - (list - (completing-read "Look up glossary term: " - common-lisp-hyperspec--glossary-terms nil t))) - (browse-url (funcall common-lisp-hyperspec-glossary-function term))) - -(defun common-lisp-glossary-6.0 (term) - "Get a URL for a glossary term TERM." - (let ((anchor (gethash term common-lisp-hyperspec--glossary-terms))) - (if (not anchor) - (message "Unknown glossary term: %s" term) - (format "%sBody/26_glo_%s.htm#%s" - common-lisp-hyperspec-root - (let ((char (string-to-char term))) - (if (and (<= ?a char) - (<= char ?z)) - (make-string 1 char) - "9")) - anchor)))) - -;; Tianxiang Xiong 20151229 -;; Is this function necessary? The link does created does not work. -(defun common-lisp-glossary-4.0 (string) - (format "%sBody/glo_%s.html#%s" - common-lisp-hyperspec-root - (let ((char (string-to-char string))) - (if (and (<= ?a char) - (<= char ?z)) - (make-string 1 char) - "9")) - (subst-char-in-string ?\ ?_ string))) - - -;;;; Issuex - -;; FIXME: the issuex stuff is not used -(defvar common-lisp-hyperspec-issuex-table nil - "The HyperSpec IssueX table file. If you copy the HyperSpec to your -local system, set this variable to the location of the Issue -cross-references table which is usually \"Map_IssX.txt\" or -\"Issue-Cross-Refs.text\".") - -(defvar common-lisp-hyperspec--issuex-symbols - (make-hash-table :test 'equal)) - -(mapc - (lambda (entry) - (puthash (car entry) (cadr entry) common-lisp-hyperspec--issuex-symbols)) - (if common-lisp-hyperspec-issuex-table - (common-lisp-hyperspec--parse-map-file - common-lisp-hyperspec-issuex-table) - '(("&environment-binding-order:first" "iss001.htm") - ("access-error-name" "iss002.htm") - ("adjust-array-displacement" "iss003.htm") - ("adjust-array-fill-pointer" "iss004.htm") - ("adjust-array-not-adjustable:implicit-copy" "iss005.htm") - ("allocate-instance:add" "iss006.htm") - ("allow-local-inline:inline-notinline" "iss007.htm") - ("allow-other-keys-nil:permit" "iss008.htm") - ("aref-1d" "iss009.htm") - ("argument-mismatch-error-again:consistent" "iss010.htm") - ("argument-mismatch-error-moon:fix" "iss011.htm") - ("argument-mismatch-error:more-clarifications" "iss012.htm") - ("arguments-underspecified:specify" "iss013.htm") - ("array-dimension-limit-implications:all-fixnum" "iss014.htm") - ("array-type-element-type-semantics:unify-upgrading" "iss015.htm") - ("assert-error-type:error" "iss016.htm") - ("assoc-rassoc-if-key" "iss017.htm") - ("assoc-rassoc-if-key:yes" "iss018.htm") - ("boa-aux-initialization:error-on-read" "iss019.htm") - ("break-on-warnings-obsolete:remove" "iss020.htm") - ("broadcast-stream-return-values:clarify-minimally" "iss021.htm") - ("butlast-negative:should-signal" "iss022.htm") - ("change-class-initargs:permit" "iss023.htm") - ("char-name-case:x3j13-mar-91" "iss024.htm") - ("character-loose-ends:fix" "iss025.htm") - ("character-proposal:2" "iss026.htm") - ("character-proposal:2-1-1" "iss027.htm") - ("character-proposal:2-1-2" "iss028.htm") - ("character-proposal:2-2-1" "iss029.htm") - ("character-proposal:2-3-1" "iss030.htm") - ("character-proposal:2-3-2" "iss031.htm") - ("character-proposal:2-3-3" "iss032.htm") - ("character-proposal:2-3-4" "iss033.htm") - ("character-proposal:2-3-5" "iss034.htm") - ("character-proposal:2-3-6" "iss035.htm") - ("character-proposal:2-4-1" "iss036.htm") - ("character-proposal:2-4-2" "iss037.htm") - ("character-proposal:2-4-3" "iss038.htm") - ("character-proposal:2-5-2" "iss039.htm") - ("character-proposal:2-5-6" "iss040.htm") - ("character-proposal:2-5-7" "iss041.htm") - ("character-proposal:2-6-1" "iss042.htm") - ("character-proposal:2-6-2" "iss043.htm") - ("character-proposal:2-6-3" "iss044.htm") - ("character-proposal:2-6-5" "iss045.htm") - ("character-vs-char:less-inconsistent-short" "iss046.htm") - ("class-object-specializer:affirm" "iss047.htm") - ("clos-conditions-again:allow-subset" "iss048.htm") - ("clos-conditions:integrate" "iss049.htm") - ("clos-error-checking-order:no-applicable-method-first" "iss050.htm") - ("clos-macro-compilation:minimal" "iss051.htm") - ("close-constructed-stream:argument-stream-only" "iss052.htm") - ("closed-stream-operations:allow-inquiry" "iss053.htm") - ("coercing-setf-name-to-function:all-function-names" "iss054.htm") - ("colon-number" "iss055.htm") - ("common-features:specify" "iss056.htm") - ("common-type:remove" "iss057.htm") - ("compile-argument-problems-again:fix" "iss058.htm") - ("compile-file-handling-of-top-level-forms:clarify" "iss059.htm") - ("compile-file-output-file-defaults:input-file" "iss060.htm") - ("compile-file-package" "iss061.htm") - ("compile-file-pathname-arguments:make-consistent" "iss062.htm") - ("compile-file-symbol-handling:new-require-consistency" "iss063.htm") - ("compiled-function-requirements:tighten" "iss064.htm") - ("compiler-diagnostics:use-handler" "iss065.htm") - ("compiler-let-confusion:eliminate" "iss066.htm") - ("compiler-verbosity:like-load" "iss067.htm") - ("compiler-warning-stream" "iss068.htm") - ("complex-atan-branch-cut:tweak" "iss069.htm") - ("complex-atanh-bogus-formula:tweak-more" "iss070.htm") - ("complex-rational-result:extend" "iss071.htm") - ("compute-applicable-methods:generic" "iss072.htm") - ("concatenate-sequence:signal-error" "iss073.htm") - ("condition-accessors-setfable:no" "iss074.htm") - ("condition-restarts:buggy" "iss075.htm") - ("condition-restarts:permit-association" "iss076.htm") - ("condition-slots:hidden" "iss077.htm") - ("cons-type-specifier:add" "iss078.htm") - ("constant-circular-compilation:yes" "iss079.htm") - ("constant-collapsing:generalize" "iss080.htm") - ("constant-compilable-types:specify" "iss081.htm") - ("constant-function-compilation:no" "iss082.htm") - ("constant-modification:disallow" "iss083.htm") - ("constantp-definition:intentional" "iss084.htm") - ("constantp-environment:add-arg" "iss085.htm") - ("contagion-on-numerical-comparisons:transitive" "iss086.htm") - ("copy-symbol-copy-plist:copy-list" "iss087.htm") - ("copy-symbol-print-name:equal" "iss088.htm") - ("data-io:add-support" "iss089.htm") - ("data-types-hierarchy-underspecified" "iss090.htm") - ("debugger-hook-vs-break:clarify" "iss091.htm") - ("declaration-scope:no-hoisting" "iss092.htm") - ("declare-array-type-element-references:restrictive" "iss093.htm") - ("declare-function-ambiguity:delete-ftype-abbreviation" "iss094.htm") - ("declare-macros:flush" "iss095.htm") - ("declare-type-free:lexical" "iss096.htm") - ("decls-and-doc" "iss097.htm") - ("decode-universal-time-daylight:like-encode" "iss098.htm") - ("defconstant-special:no" "iss099.htm") - ("defgeneric-declare:allow-multiple" "iss100.htm") - ("define-compiler-macro:x3j13-nov89" "iss101.htm") - ("define-condition-syntax:\ -incompatibly-more-like-defclass+emphasize-read-only" "iss102.htm") - ("define-method-combination-behavior:clarify" "iss103.htm") - ("defining-macros-non-top-level:allow" "iss104.htm") - ("defmacro-block-scope:excludes-bindings" "iss105.htm") - ("defmacro-lambda-list:tighten-description" "iss106.htm") - ("defmethod-declaration-scope:corresponds-to-bindings" "iss107.htm") - ("defpackage:addition" "iss108.htm") - ("defstruct-constructor-key-mixture:allow-key" "iss109.htm") - ("defstruct-constructor-options:explicit" "iss110.htm") - ("defstruct-constructor-slot-variables:not-bound" "iss111.htm") - ("defstruct-copier-argument-type:restrict" "iss112.htm") - ("defstruct-copier:argument-type" "iss113.htm") - ("defstruct-default-value-evaluation:iff-needed" "iss114.htm") - ("defstruct-include-deftype:explicitly-undefined" "iss115.htm") - ("defstruct-print-function-again:x3j13-mar-93" "iss116.htm") - ("defstruct-print-function-inheritance:yes" "iss117.htm") - ("defstruct-redefinition:error" "iss118.htm") - ("defstruct-slots-constraints-name:duplicates-error" "iss119.htm") - ("defstruct-slots-constraints-number" "iss120.htm") - ("deftype-destructuring:yes" "iss121.htm") - ("deftype-key:allow" "iss122.htm") - ("defvar-documentation:unevaluated" "iss123.htm") - ("defvar-init-time:not-delayed" "iss124.htm") - ("defvar-initialization:conservative" "iss125.htm") - ("deprecation-position:limited" "iss126.htm") - ("describe-interactive:no" "iss127.htm") - ("describe-underspecified:describe-object" "iss128.htm") - ("destructive-operations:specify" "iss129.htm") - ("destructuring-bind:new-macro" "iss130.htm") - ("disassemble-side-effect:do-not-install" "iss131.htm") - ("displaced-array-predicate:add" "iss132.htm") - ("do-symbols-block-scope:entire-form" "iss133.htm") - ("do-symbols-duplicates" "iss134.htm") - ("documentation-function-bugs:fix" "iss135.htm") - ("documentation-function-tangled:require-argument" "iss136.htm") - ("dotimes-ignore:x3j13-mar91" "iss137.htm") - ("dotted-list-arguments:clarify" "iss138.htm") - ("dotted-macro-forms:allow" "iss139.htm") - ("dribble-technique" "iss140.htm") - ("dynamic-extent-function:extend" "iss141.htm") - ("dynamic-extent:new-declaration" "iss142.htm") - ("equal-structure:maybe-status-quo" "iss143.htm") - ("error-terminology-warning:might" "iss144.htm") - ("eval-other:self-evaluate" "iss145.htm") - ("eval-top-level:load-like-compile-file" "iss146.htm") - ("eval-when-non-top-level:generalize-eval-new-keywords" "iss147.htm") - ("eval-when-obsolete-keywords:x3j13-mar-1993" "iss148.htm") - ("evalhook-step-confusion:fix" "iss149.htm") - ("evalhook-step-confusion:x3j13-nov-89" "iss150.htm") - ("exit-extent-and-condition-system:like-dynamic-bindings" "iss151.htm") - ("exit-extent:minimal" "iss152.htm") - ("expt-ratio:p.211" "iss153.htm") - ("extensions-position:documentation" "iss154.htm") - ("external-format-for-every-file-connection:minimum" "iss155.htm") - ("extra-return-values:no" "iss156.htm") - ("file-open-error:signal-file-error" "iss157.htm") - ("fixnum-non-portable:tighten-definition" "iss158.htm") - ("flet-declarations" "iss159.htm") - ("flet-declarations:allow" "iss160.htm") - ("flet-implicit-block:yes" "iss161.htm") - ("float-underflow:add-variables" "iss162.htm") - ("floating-point-condition-names:x3j13-nov-89" "iss163.htm") - ("format-atsign-colon" "iss164.htm") - ("format-colon-uparrow-scope" "iss165.htm") - ("format-comma-interval" "iss166.htm") - ("format-e-exponent-sign:force-sign" "iss167.htm") - ("format-op-c" "iss168.htm") - ("format-pretty-print:yes" "iss169.htm") - ("format-string-arguments:specify" "iss170.htm") - ("function-call-evaluation-order:more-unspecified" "iss171.htm") - ("function-composition:jan89-x3j13" "iss172.htm") - ("function-definition:jan89-x3j13" "iss173.htm") - ("function-name:large" "iss174.htm") - ("function-type" "iss175.htm") - ("function-type-argument-type-semantics:restrictive" "iss176.htm") - ("function-type-key-name:specify-keyword" "iss177.htm") - ("function-type-rest-list-element:use-actual-argument-type" "iss178.htm") - ("function-type:x3j13-march-88" "iss179.htm") - ("generalize-pretty-printer:unify" "iss180.htm") - ("generic-flet-poorly-designed:delete" "iss181.htm") - ("gensym-name-stickiness:like-teflon" "iss182.htm") - ("gentemp-bad-idea:deprecate" "iss183.htm") - ("get-macro-character-readtable:nil-standard" "iss184.htm") - ("get-setf-method-environment:add-arg" "iss185.htm") - ("hash-table-access:x3j13-mar-89" "iss186.htm") - ("hash-table-key-modification:specify" "iss187.htm") - ("hash-table-package-generators:add-with-wrapper" "iss188.htm") - ("hash-table-rehash-size-integer" "iss189.htm") - ("hash-table-size:intended-entries" "iss190.htm") - ("hash-table-tests:add-equalp" "iss191.htm") - ("ieee-atan-branch-cut:split" "iss192.htm") - ("ignore-use-terminology:value-only" "iss193.htm") - ("import-setf-symbol-package" "iss194.htm") - ("in-package-functionality:mar89-x3j13" "iss195.htm") - ("in-syntax:minimal" "iss196.htm") - ("initialization-function-keyword-checking" "iss197.htm") - ("iso-compatibility:add-substrate" "iss198.htm") - ("jun90-trivial-issues:11" "iss199.htm") - ("jun90-trivial-issues:14" "iss200.htm") - ("jun90-trivial-issues:24" "iss201.htm") - ("jun90-trivial-issues:25" "iss202.htm") - ("jun90-trivial-issues:27" "iss203.htm") - ("jun90-trivial-issues:3" "iss204.htm") - ("jun90-trivial-issues:4" "iss205.htm") - ("jun90-trivial-issues:5" "iss206.htm") - ("jun90-trivial-issues:9" "iss207.htm") - ("keyword-argument-name-package:any" "iss208.htm") - ("last-n" "iss209.htm") - ("lcm-no-arguments:1" "iss210.htm") - ("lexical-construct-global-definition:undefined" "iss211.htm") - ("lisp-package-name:common-lisp" "iss212.htm") - ("lisp-symbol-redefinition-again:more-fixes" "iss213.htm") - ("lisp-symbol-redefinition:mar89-x3j13" "iss214.htm") - ("load-objects:make-load-form" "iss215.htm") - ("load-time-eval:r**2-new-special-form" "iss216.htm") - ("load-time-eval:r**3-new-special-form" "iss217.htm") - ("load-truename:new-pathname-variables" "iss218.htm") - ("locally-top-level:special-form" "iss219.htm") - ("loop-and-discrepancy:no-reiteration" "iss220.htm") - ("loop-for-as-on-typo:fix-typo" "iss221.htm") - ("loop-initform-environment:partial-interleaving-vague" "iss222.htm") - ("loop-miscellaneous-repairs:fix" "iss223.htm") - ("loop-named-block-nil:override" "iss224.htm") - ("loop-present-symbols-typo:flush-wrong-words" "iss225.htm") - ("loop-syntax-overhaul:repair" "iss226.htm") - ("macro-as-function:disallow" "iss227.htm") - ("macro-declarations:make-explicit" "iss228.htm") - ("macro-environment-extent:dynamic" "iss229.htm") - ("macro-function-environment" "iss230.htm") - ("macro-function-environment:yes" "iss231.htm") - ("macro-subforms-top-level-p:add-constraints" "iss232.htm") - ("macroexpand-hook-default:explicitly-vague" "iss233.htm") - ("macroexpand-hook-initial-value:implementation-dependent" "iss234.htm") - ("macroexpand-return-value:true" "iss235.htm") - ("make-load-form-confusion:rewrite" "iss236.htm") - ("make-load-form-saving-slots:no-initforms" "iss237.htm") - ("make-package-use-default:implementation-dependent" "iss238.htm") - ("map-into:add-function" "iss239.htm") - ("mapping-destructive-interaction:explicitly-vague" "iss240.htm") - ("metaclass-of-system-class:unspecified" "iss241.htm") - ("method-combination-arguments:clarify" "iss242.htm") - ("method-initform:forbid-call-next-method" "iss243.htm") - ("muffle-warning-condition-argument" "iss244.htm") - ("multiple-value-setq-order:like-setf-of-values" "iss245.htm") - ("multiple-values-limit-on-variables:undefined" "iss246.htm") - ("nintersection-destruction" "iss247.htm") - ("nintersection-destruction:revert" "iss248.htm") - ("not-and-null-return-value:x3j13-mar-93" "iss249.htm") - ("nth-value:add" "iss250.htm") - ("optimize-debug-info:new-quality" "iss251.htm") - ("package-clutter:reduce" "iss252.htm") - ("package-deletion:new-function" "iss253.htm") - ("package-function-consistency:more-permissive" "iss254.htm") - ("parse-error-stream:split-types" "iss255.htm") - ("pathname-component-case:keyword-argument" "iss256.htm") - ("pathname-component-value:specify" "iss257.htm") - ("pathname-host-parsing:recognize-logical-host-names" "iss258.htm") - ("pathname-logical:add" "iss259.htm") - ("pathname-print-read:sharpsign-p" "iss260.htm") - ("pathname-stream" "iss261.htm") - ("pathname-stream:files-or-synonym" "iss262.htm") - ("pathname-subdirectory-list:new-representation" "iss263.htm") - ("pathname-symbol" "iss264.htm") - ("pathname-syntax-error-time:explicitly-vague" "iss265.htm") - ("pathname-unspecific-component:new-token" "iss266.htm") - ("pathname-wild:new-functions" "iss267.htm") - ("peek-char-read-char-echo:first-read-char" "iss268.htm") - ("plist-duplicates:allow" "iss269.htm") - ("pretty-print-interface" "iss270.htm") - ("princ-readably:x3j13-dec-91" "iss271.htm") - ("print-case-behavior:clarify" "iss272.htm") - ("print-case-print-escape-interaction:vertical-bar-rule-no-upcase" - "iss273.htm") - ("print-circle-shared:respect-print-circle" "iss274.htm") - ("print-circle-structure:user-functions-work" "iss275.htm") - ("print-readably-behavior:clarify" "iss276.htm") - ("printer-whitespace:just-one-space" "iss277.htm") - ("proclaim-etc-in-compile-file:new-macro" "iss278.htm") - ("push-evaluation-order:first-item" "iss279.htm") - ("push-evaluation-order:item-first" "iss280.htm") - ("pushnew-store-required:unspecified" "iss281.htm") - ("quote-semantics:no-copying" "iss282.htm") - ("range-of-count-keyword:nil-or-integer" "iss283.htm") - ("range-of-start-and-end-parameters:integer-and-integer-nil" "iss284.htm") - ("read-and-write-bytes:new-functions" "iss285.htm") - ("read-case-sensitivity:readtable-keywords" "iss286.htm") - ("read-modify-write-evaluation-order:delayed-access-stores" "iss287.htm") - ("read-suppress-confusing:generalize" "iss288.htm") - ("reader-error:new-type" "iss289.htm") - ("real-number-type:x3j13-mar-89" "iss290.htm") - ("recursive-deftype:explicitly-vague" "iss291.htm") - ("reduce-argument-extraction" "iss292.htm") - ("remf-destruction-unspecified:x3j13-mar-89" "iss293.htm") - ("require-pathname-defaults-again:x3j13-dec-91" "iss294.htm") - ("require-pathname-defaults-yet-again:restore-argument" "iss295.htm") - ("require-pathname-defaults:eliminate" "iss296.htm") - ("rest-list-allocation:may-share" "iss297.htm") - ("result-lists-shared:specify" "iss298.htm") - ("return-values-unspecified:specify" "iss299.htm") - ("room-default-argument:new-value" "iss300.htm") - ("self-modifying-code:forbid" "iss301.htm") - ("sequence-type-length:must-match" "iss302.htm") - ("setf-apply-expansion:ignore-expander" "iss303.htm") - ("setf-find-class:allow-nil" "iss304.htm") - ("setf-functions-again:minimal-changes" "iss305.htm") - ("setf-get-default:evaluated-but-ignored" "iss306.htm") - ("setf-macro-expansion:last" "iss307.htm") - ("setf-method-vs-setf-method:rename-old-terms" "iss308.htm") - ("setf-multiple-store-variables:allow" "iss309.htm") - ("setf-of-apply:only-aref-and-friends" "iss310.htm") - ("setf-of-values:add" "iss311.htm") - ("setf-sub-methods:delayed-access-stores" "iss312.htm") - ("shadow-already-present" "iss313.htm") - ("shadow-already-present:works" "iss314.htm") - ("sharp-comma-confusion:remove" "iss315.htm") - ("sharp-o-foobar:consequences-undefined" "iss316.htm") - ("sharp-star-delimiter:normal-delimiter" "iss317.htm") - ("sharpsign-plus-minus-package:keyword" "iss318.htm") - ("slot-missing-values:specify" "iss319.htm") - ("slot-value-metaclasses:less-minimal" "iss320.htm") - ("special-form-p-misnomer:rename" "iss321.htm") - ("special-type-shadowing:clarify" "iss322.htm") - ("standard-input-initial-binding:defined-contracts" "iss323.htm") - ("standard-repertoire-gratuitous:rename" "iss324.htm") - ("step-environment:current" "iss325.htm") - ("step-minimal:permit-progn" "iss326.htm") - ("stream-access:add-types-accessors" "iss327.htm") - ("stream-capabilities:interactive-stream-p" "iss328.htm") - ("string-coercion:make-consistent" "iss329.htm") - ("string-output-stream-bashing:undefined" "iss330.htm") - ("structure-read-print-syntax:keywords" "iss331.htm") - ("subseq-out-of-bounds" "iss332.htm") - ("subseq-out-of-bounds:is-an-error" "iss333.htm") - ("subsetting-position:none" "iss334.htm") - ("subtypep-environment:add-arg" "iss335.htm") - ("subtypep-too-vague:clarify-more" "iss336.htm") - ("sxhash-definition:similar-for-sxhash" "iss337.htm") - ("symbol-macrolet-declare:allow" "iss338.htm") - ("symbol-macrolet-semantics:special-form" "iss339.htm") - ("symbol-macrolet-type-declaration:no" "iss340.htm") - ("symbol-macros-and-proclaimed-specials:signals-an-error" "iss341.htm") - ("symbol-print-escape-behavior:clarify" "iss342.htm") - ("syntactic-environment-access:retracted-mar91" "iss343.htm") - ("tagbody-tag-expansion:no" "iss344.htm") - ("tailp-nil:t" "iss345.htm") - ("test-not-if-not:flush-all" "iss346.htm") - ("the-ambiguity:for-declaration" "iss347.htm") - ("the-values:return-number-received" "iss348.htm") - ("time-zone-non-integer:allow" "iss349.htm") - ("type-declaration-abbreviation:allow-all" "iss350.htm") - ("type-of-and-predefined-classes:type-of-handles-floats" "iss351.htm") - ("type-of-and-predefined-classes:unify-and-extend" "iss352.htm") - ("type-of-underconstrained:add-constraints" "iss353.htm") - ("type-specifier-abbreviation:x3j13-jun90-guess" "iss354.htm") - ("undefined-variables-and-functions:compromise" "iss355.htm") - ("uninitialized-elements:consequences-undefined" "iss356.htm") - ("unread-char-after-peek-char:dont-allow" "iss357.htm") - ("unsolicited-messages:not-to-system-user-streams" "iss358.htm") - ("variable-list-asymmetry:symmetrize" "iss359.htm") - ("with-added-methods:delete" "iss360.htm") - ("with-compilation-unit:new-macro" "iss361.htm") - ("with-open-file-does-not-exist:stream-is-nil" "iss362.htm") - ("with-open-file-setq:explicitly-vague" "iss363.htm") - ("with-open-file-stream-extent:dynamic-extent" "iss364.htm") - ("with-output-to-string-append-style:vector-push-extend" "iss365.htm") - ("with-standard-io-syntax-readtable:x3j13-mar-91" "iss366.htm")))) - -(defun common-lisp-issuex (issue-name) - (let ((entry (gethash (downcase issue-name) - common-lisp-hyperspec--issuex-symbols))) - (concat common-lisp-hyperspec-root "Issues/" entry))) - -(defun common-lisp-special-operator (name) - (format "%sBody/s_%s.htm" common-lisp-hyperspec-root name)) - -;;; Added the following just to provide a common entry point according -;;; to the various 'hyperspec' implementations. -;;; -;;; 19990820 Marco Antoniotti - -(defalias 'hyperspec-lookup 'common-lisp-hyperspec) -(defalias 'hyperspec-lookup-reader-macro - 'common-lisp-hyperspec-lookup-reader-macro) -(defalias 'hyperspec-lookup-format 'common-lisp-hyperspec-format) - -(provide 'hyperspec) - -;;; hyperspec.el ends here diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/macrostep.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/macrostep.el deleted file mode 100644 index b301497..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/lib/macrostep.el +++ /dev/null @@ -1,1122 +0,0 @@ -;;; macrostep.el --- interactive macro expander - -;; Copyright (C) 2012-2015 Jon Oddie - -;; Author: joddie -;; Maintainer: joddie -;; Created: 16 January 2012 -;; Updated: 07 December 2015 -;; Version: 0.9 -;; Keywords: lisp, languages, macro, debugging -;; Url: https://github.com/joddie/macrostep -;; Package-Requires: ((cl-lib "0.5")) - -;; This file is NOT part of GNU Emacs. - -;; 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 3 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, see `http://www.gnu.org/licenses/'. - -;;; Commentary: - -;; `macrostep' is an Emacs minor mode for interactively stepping through -;; the expansion of macros in Emacs Lisp source code. It lets you see -;; exactly what happens at each step of the expansion process by -;; pretty-printing the expanded forms inline in the source buffer, which is -;; temporarily read-only while macro expansions are visible. You can -;; expand and collapse macro forms one step at a time, and evaluate or -;; instrument the expansions for debugging with Edebug as normal (but see -;; "Bugs and known limitations", below). Single-stepping through the -;; expansion is particularly useful for debugging macros that expand into -;; another macro form. These can be difficult to debug with Emacs' -;; built-in `macroexpand', which continues expansion until the top-level -;; form is no longer a macro call. - -;; Both globally-visible macros as defined by `defmacro' and local macros -;; bound by `(cl-)macrolet' or another macro-defining form can be expanded. -;; Within macro expansions, calls to macros and compiler macros are -;; fontified specially: macro forms using `macrostep-macro-face', and -;; functions with compiler macros using `macrostep-compiler-macro-face'. -;; Uninterned symbols (gensyms) are fontified based on which step in the -;; expansion created them, to distinguish them both from normal symbols and -;; from other gensyms with the same print name. - -;; As of version 0.9, it is also possible to extend `macrostep' to work -;; with other languages with macro systems in addition to Emacs Lisp. An -;; extension for Common Lisp (via SLIME) is in the works; contributions for -;; other languages are welcome. See "Extending macrostep" below for -;; details. - - -;; 1 Key-bindings and usage -;; ======================== - -;; The standard keybindings in `macrostep-mode' are the following: - -;; e, =, RET : expand the macro form following point one step -;; c, u, DEL : collapse the form following point -;; q, C-c C-c: collapse all expanded forms and exit macrostep-mode -;; n, TAB : jump to the next macro form in the expansion -;; p, M-TAB : jump to the previous macro form in the expansion - -;; It's not very useful to enable and disable macrostep-mode directly. -;; Instead, bind `macrostep-expand' to a key in `emacs-lisp-mode-map', -;; for example C-c e: - -;; ,---- -;; | (define-key emacs-lisp-mode-map (kbd "C-c e") 'macrostep-expand) -;; `---- - -;; You can then enter macrostep-mode and expand a macro form completely -;; by typing `C-c e e e ...' as many times as necessary. - -;; Exit macrostep-mode by typing `q' or `C-c C-c', or by successively -;; typing `c' to collapse all surrounding expansions. - - -;; 2 Customization options -;; ======================= - -;; Type `M-x customize-group RET macrostep RET' to customize options and -;; faces. - -;; To display macro expansions in a separate window, instead of inline in -;; the source buffer, customize `macrostep-expand-in-separate-buffer' to -;; `t'. The default is `nil'. Whichever default behavior is selected, -;; the alternative behavior can be obtained temporarily by giving a -;; prefix argument to `macrostep-expand'. - -;; To have `macrostep' ignore compiler macros, customize -;; `macrostep-expand-compiler-macros' to `nil'. The default is `t'. - -;; Customize the faces `macrostep-macro-face', -;; `macrostep-compiler-macro-face', and `macrostep-gensym-1' through -;; `macrostep-gensym-5' to alter the appearance of macro expansions. - - -;; 3 Locally-bound macros -;; ====================== - -;; As of version 0.9, `macrostep' can expand calls to a locally-bound -;; macro, whether defined by a surrounding `(cl-)macrolet' form, or by -;; another macro-defining macro. In other words, it is possible to -;; expand the inner `local-macro' forms in both the following examples, -;; whether `local-macro' is defined by an enclosing `cl-macrolet' -- - -;; ,---- -;; | (cl-macrolet ((local-macro (&rest args) -;; | `(expansion of ,args))) -;; | (local-macro (do-something))) -;; `---- - -;; -- or by a macro which expands into `cl-macrolet', provided that its -;; definition of macro is evaluated prior to calling `macrostep-expand': - -;; ,---- -;; | (defmacro with-local-macro (&rest body) -;; | `(cl-macrolet ((local-macro (&rest args) -;; | `(expansion of ,args))) -;; | ,@body)) -;; | -;; | (with-local-macro -;; | (local-macro (do something (else))) -;; `---- - -;; See the `with-js' macro in Emacs's `js.el' for a real example of the -;; latter kind of macro. - -;; Expansion of locally-bound macros is implemented by instrumenting -;; Emacs Lisp's macro-expander to capture the environment at point. A -;; similar trick is used to detect macro- and compiler-macro calls within -;; expanded text so that they can be fontified accurately. - - -;; 4 Expanding sub-forms -;; ===================== - -;; By moving point around in the macro expansion using -;; `macrostep-next-macro' and `macrostep-prev-macro' (bound to the `n' -;; and `p' keys), it is possible to expand other macro calls within the -;; expansion before expanding the outermost form. This can sometimes be -;; useful, although it does not correspond to the real order of macro -;; expansion in Emacs Lisp, which proceeds by fully expanding the outer -;; form to a non-macro form before expanding sub-forms. - -;; The main reason to expand sub-forms out of order is to help with -;; debugging macros which programmatically expand their arguments in -;; order to rewrite them. Expanding the arguments of such a macro lets -;; you visualise what the macro definition would compute via -;; `macroexpand-all'. - - -;; 5 Extending macrostep for other languages -;; ========================================= - -;; Since version 0.9, it is possible to extend macrostep to work with -;; other languages besides Emacs Lisp. In typical Emacs fashion, this is -;; implemented by setting buffer-local variables to different function -;; values. Six buffer-local variables define the language-specific part -;; of the implementation: - -;; - `macrostep-sexp-bounds-function' -;; - `macrostep-sexp-at-point-function' -;; - `macrostep-environment-at-point-function' -;; - `macrostep-expand-1-function' -;; - `macrostep-print-function' -;; - `macrostep-macro-form-p-function' - -;; Typically, an implementation for another language would set these -;; variables in a major-mode hook. See the docstrings of each variable -;; for details on how each one is called and what it should return. At a -;; minimum, another language implementation needs to provide -;; `macrostep-sexp-at-point-function', `macrostep-expand-1-function', and -;; `macrostep-print-function'. Lisp-like languages may be able to reuse -;; the default `macrostep-sexp-bounds-function' if they provide another -;; implementation of `macrostep-macro-form-p-function'. Languages which -;; do not implement locally-defined macros can set -;; `macrostep-environment-at-point-function' to `ignore'. - -;; Note that the core `macrostep' machinery only interprets the return -;; value of `macrostep-sexp-bounds-function', so implementations for -;; other languages can use any internal representations of code and -;; environments which is convenient. Although the terminology is -;; Lisp-specific, there is no reason that implementations could not be -;; provided for non-Lisp languages with macro systems, provided there is -;; some way of identifying macro calls and calling the compiler / -;; preprocessor to obtain their expansions. - - -;; 6 Bugs and known limitations -;; ============================ - -;; You can evaluate and edebug macro-expanded forms and step through the -;; macro-expanded version, but the form that `eval-defun' and friends -;; read from the buffer won't have the uninterned symbols of the real -;; macro expansion. This will probably work OK with CL-style gensyms, -;; but may cause problems with `make-symbol' symbols if they have the -;; same print name as another symbol in the expansion. It's possible that -;; using `print-circle' and `print-gensym' could get around this. - -;; Please send other bug reports and feature requests to the author. - - -;; 7 Acknowledgements -;; ================== - -;; Thanks to: -;; - John Wiegley for fixing a bug with the face definitions under Emacs -;; 24 & for plugging macrostep in his [EmacsConf presentation]! -;; - George Kettleborough for bug reports, and patches to highlight the -;; expanded region and properly handle backquotes. -;; - Nic Ferrier for suggesting support for local definitions within -;; macrolet forms -;; - Luís Oliveira for suggesting and implementing SLIME support - -;; `macrostep' was originally inspired by J. V. Toups's 'Deep Emacs Lisp' -;; articles ([part 1], [part 2], [screencast]). - -;; [EmacsConf presentation] http://youtu.be/RvPFZL6NJNQ - -;; [part 1] -;; http://dorophone.blogspot.co.uk/2011/04/deep-emacs-part-1.html - -;; [part 2] -;; http://dorophone.blogspot.co.uk/2011/04/deep-emacs-lisp-part-2.html - -;; [screencast] -;; http://dorophone.blogspot.co.uk/2011/05/monadic-parser-combinators-in-elisp.html - - -;; 8 Changelog -;; =========== - -;; - v0.9, 2015-10-01: -;; - separate into Elisp-specific and generic components -;; - highlight and expand compiler macros -;; - improve local macro expansion and macro form identification by -;; instrumenting `macroexpand(-all)' -;; - v0.8, 2014-05-29: fix a bug with printing the first element of lists -;; - v0.7, 2014-05-11: expand locally-defined macros within -;; `(cl-)macrolet' forms -;; - v0.6, 2013-05-04: better handling of quote and backquote -;; - v0.5, 2013-04-16: highlight region, maintain cleaner buffer state -;; - v0.4, 2013-04-07: only enter macrostep-mode on successful -;; macro-expansion -;; - v0.3, 2012-10-30: print dotted lists correctly. autoload -;; definitions. - -;;; Code: - -(require 'pp) -(require 'ring) -(eval-and-compile - (require 'cl-lib nil t) - (require 'cl-lib "lib/cl-lib")) - - -;;; Constants and dynamically bound variables -(defvar macrostep-overlays nil - "List of all macro stepper overlays in the current buffer.") -(make-variable-buffer-local 'macrostep-overlays) - -(defvar macrostep-gensym-depth nil - "Number of macro expansion levels that have introduced gensyms so far.") -(make-variable-buffer-local 'macrostep-gensym-depth) - -(defvar macrostep-gensyms-this-level nil - "t if gensyms have been encountered during current level of macro expansion.") -(make-variable-buffer-local 'macrostep-gensyms-this-level) - -(defvar macrostep-saved-undo-list nil - "Saved value of buffer-undo-list upon entering macrostep mode.") -(make-variable-buffer-local 'macrostep-saved-undo-list) - -(defvar macrostep-saved-read-only nil - "Saved value of buffer-read-only upon entering macrostep mode.") -(make-variable-buffer-local 'macrostep-saved-read-only) - -(defvar macrostep-expansion-buffer nil - "Non-nil if the current buffer is a macro-expansion buffer.") -(make-variable-buffer-local 'macrostep-expansion-buffer) - -(defvar macrostep-outer-environment nil - "Outermost macro-expansion environment to use in a dedicated macro-expansion buffers. - -This variable is used to save information about any enclosing -`cl-macrolet' context when a macro form is expanded in a separate -buffer.") -(make-variable-buffer-local 'macrostep-outer-environment) - -;;; Customization options and faces -(defgroup macrostep nil - "Interactive macro stepper for Emacs Lisp." - :group 'lisp - :link '(emacs-commentary-link :tag "commentary" "macrostep.el") - :link '(emacs-library-link :tag "lisp file" "macrostep.el") - :link '(url-link :tag "web page" "https://github.com/joddie/macrostep")) - -(defface macrostep-gensym-1 - '((((min-colors 16581375)) :foreground "#8080c0" :box t :bold t) - (((min-colors 8)) :background "cyan") - (t :inverse-video t)) - "Face for gensyms created in the first level of macro expansion." - :group 'macrostep) - -(defface macrostep-gensym-2 - '((((min-colors 16581375)) :foreground "#8fbc8f" :box t :bold t) - (((min-colors 8)) :background "#00cd00") - (t :inverse-video t)) - "Face for gensyms created in the second level of macro expansion." - :group 'macrostep) - -(defface macrostep-gensym-3 - '((((min-colors 16581375)) :foreground "#daa520" :box t :bold t) - (((min-colors 8)) :background "yellow") - (t :inverse-video t)) - "Face for gensyms created in the third level of macro expansion." - :group 'macrostep) - -(defface macrostep-gensym-4 - '((((min-colors 16581375)) :foreground "#cd5c5c" :box t :bold t) - (((min-colors 8)) :background "red") - (t :inverse-video t)) - "Face for gensyms created in the fourth level of macro expansion." - :group 'macrostep) - -(defface macrostep-gensym-5 - '((((min-colors 16581375)) :foreground "#da70d6" :box t :bold t) - (((min-colors 8)) :background "magenta") - (t :inverse-video t)) - "Face for gensyms created in the fifth level of macro expansion." - :group 'macrostep) - -(defface macrostep-expansion-highlight-face - '((((min-colors 16581375) (background light)) :background "#eee8d5") - (((min-colors 16581375) (background dark)) :background "#222222")) - "Face for macro-expansion highlight." - :group 'macrostep) - -(defface macrostep-macro-face - '((t :underline t)) - "Face for macros in macro-expanded code." - :group 'macrostep) - -(defface macrostep-compiler-macro-face - '((t :slant italic)) - "Face for compiler macros in macro-expanded code." - :group 'macrostep) - -(defcustom macrostep-expand-in-separate-buffer nil - "When non-nil, show expansions in a separate buffer instead of inline." - :group 'macrostep - :type 'boolean) - -(defcustom macrostep-expand-compiler-macros t - "When non-nil, expand compiler macros as well as `defmacro' and `macrolet' macros." - :group 'macrostep - :type 'boolean) - -;; Need the following for making the ring of faces -(defun macrostep-make-ring (&rest items) - "Make a ring containing all of ITEMS with no empty slots." - (let ((ring (make-ring (length items)))) - (mapc (lambda (item) (ring-insert ring item)) (reverse items)) - ring)) - -(defvar macrostep-gensym-faces - (macrostep-make-ring - 'macrostep-gensym-1 'macrostep-gensym-2 'macrostep-gensym-3 - 'macrostep-gensym-4 'macrostep-gensym-5) - "Ring of all macrostepper faces for fontifying gensyms.") - -;; Other modes can enable macrostep by redefining these functions to -;; language-specific versions. -(defvar macrostep-sexp-bounds-function - #'macrostep-sexp-bounds - "Function to return the bounds of the macro form nearest point. - -It will be called with no arguments and should return a cons of -buffer positions, (START . END). It should use `save-excursion' -to avoid changing the position of point. - -The default value, `macrostep-sexp-bounds', implements this for -Emacs Lisp, and may be suitable for other Lisp-like languages.") -(make-variable-buffer-local 'macrostep-sexp-bounds-function) - -(defvar macrostep-sexp-at-point-function - #'macrostep-sexp-at-point - "Function to return the macro form at point for expansion. - -It will be called with two arguments, the values of START and END -returned by `macrostep-sexp-bounds-function', and with point -positioned at START. It should return a value suitable for -passing as the first argument to `macrostep-expand-1-function'. - -The default value, `macrostep-sexp-at-point', implements this for -Emacs Lisp, and may be suitable for other Lisp-like languages.") -(make-variable-buffer-local 'macrostep-sexp-at-point-function) - -(defvar macrostep-environment-at-point-function - #'macrostep-environment-at-point - "Function to return the local macro-expansion environment at point. - -It will be called with no arguments, and should return a value -suitable for passing as the second argument to -`macrostep-expand-1-function'. - -The default value, `macrostep-environment-at-point', is specific -to Emacs Lisp. For languages which do not implement local -macro-expansion environments, this should be set to `ignore' -or `(lambda () nil)'.") -(make-variable-buffer-local 'macrostep-environment-at-point-function) - -(defvar macrostep-expand-1-function - #'macrostep-expand-1 - "Function to perform one step of macro-expansion. - -It will be called with two arguments, FORM and ENVIRONMENT, the -return values of `macrostep-sexp-at-point-function' and -`macrostep-environment-at-point-function' respectively. It -should return the result of expanding FORM by one step as a value -which is suitable for passing as the argument to -`macrostep-print-function'. - -The default value, `macrostep-expand-1', is specific to Emacs Lisp.") -(make-variable-buffer-local 'macrostep-expand-1-function) - -(defvar macrostep-print-function - #'macrostep-pp - "Function to pretty-print macro expansions. - -It will be called with two arguments, FORM and ENVIRONMENT, the -return values of `macrostep-sexp-at-point-function' and -`macrostep-environment-at-point-function' respectively. It -should insert a pretty-printed representation at point in the -current buffer, leaving point just after the inserted -representation, without altering any other text in the current -buffer. - -The default value, `macrostep-pp', is specific to Emacs Lisp.") -(make-variable-buffer-local 'macrostep-print-function) - -(defvar macrostep-macro-form-p-function - #'macrostep-macro-form-p - "Function to check whether a form is a macro call. - -It will be called with two arguments, FORM and ENVIRONMENT -- the -return values of `macrostep-sexp-at-point-function' and -`macrostep-environment-at-point-function' respectively -- and -should return non-nil if FORM would undergo macro-expansion in -ENVIRONMENT. - -This is called only from `macrostep-sexp-bounds', so it need not -be provided if a different value is used for -`macrostep-sexp-bounds-function'. - -The default value, `macrostep-macro-form-p', is specific to Emacs Lisp.") -(make-variable-buffer-local 'macrostep-macro-form-p-function) - - -;;; Define keymap and minor mode -(defvar macrostep-keymap - (let ((map (make-sparse-keymap))) - (define-key map (kbd "RET") 'macrostep-expand) - (define-key map "=" 'macrostep-expand) - (define-key map "e" 'macrostep-expand) - - (define-key map (kbd "DEL") 'macrostep-collapse) - (define-key map "u" 'macrostep-collapse) - (define-key map "c" 'macrostep-collapse) - - (define-key map (kbd "TAB") 'macrostep-next-macro) - (define-key map "n" 'macrostep-next-macro) - (define-key map (kbd "M-TAB") 'macrostep-prev-macro) - (define-key map "p" 'macrostep-prev-macro) - - (define-key map "q" 'macrostep-collapse-all) - (define-key map (kbd "C-c C-c") 'macrostep-collapse-all) - map) - "Keymap for `macrostep-mode'.") - -;;;###autoload -(define-minor-mode macrostep-mode - "Minor mode for inline expansion of macros in Emacs Lisp source buffers. - -\\Progressively expand macro forms with \\[macrostep-expand], collapse them with \\[macrostep-collapse], -and move back and forth with \\[macrostep-next-macro] and \\[macrostep-prev-macro]. -Use \\[macrostep-collapse-all] or collapse all visible expansions to -quit and return to normal editing. - -\\{macrostep-keymap}" - nil " Macro-Stepper" - :keymap macrostep-keymap - :group macrostep - (if macrostep-mode - (progn - ;; Disable recording of undo information - (setq macrostep-saved-undo-list buffer-undo-list - buffer-undo-list t) - ;; Remember whether buffer was read-only - (setq macrostep-saved-read-only buffer-read-only - buffer-read-only t) - ;; Set up post-command hook to bail out on leaving read-only - (add-hook 'post-command-hook 'macrostep-command-hook nil t) - (message - (substitute-command-keys - "\\Entering macro stepper mode. Use \\[macrostep-expand] to expand, \\[macrostep-collapse] to collapse, \\[macrostep-collapse-all] to exit."))) - - ;; Exiting mode - (if macrostep-expansion-buffer - ;; Kill dedicated expansion buffers - (quit-window t) - ;; Collapse any remaining overlays - (when macrostep-overlays (macrostep-collapse-all)) - ;; Restore undo info & read-only state - (setq buffer-undo-list macrostep-saved-undo-list - buffer-read-only macrostep-saved-read-only - macrostep-saved-undo-list nil) - ;; Remove our post-command hook - (remove-hook 'post-command-hook 'macrostep-command-hook t)))) - -;; Post-command hook: bail out of macrostep-mode if the user types C-x -;; C-q to make the buffer writable again. -(defun macrostep-command-hook () - (if (not buffer-read-only) - (macrostep-mode 0))) - - -;;; Interactive functions -;;;###autoload -(defun macrostep-expand (&optional toggle-separate-buffer) - "Expand the macro form following point by one step. - -Enters `macrostep-mode' if it is not already active, making the -buffer temporarily read-only. If macrostep-mode is active and the -form following point is not a macro form, search forward in the -buffer and expand the next macro form found, if any. - -With a prefix argument, the expansion is displayed in a separate -buffer instead of inline in the current buffer. Setting -`macrostep-expand-in-separate-buffer' to non-nil swaps these two -behaviors." - (interactive "P") - (cl-destructuring-bind (start . end) - (funcall macrostep-sexp-bounds-function) - (goto-char start) - (let* ((sexp (funcall macrostep-sexp-at-point-function start end)) - (end (copy-marker end)) - (text (buffer-substring start end)) - (env (funcall macrostep-environment-at-point-function)) - (expansion (funcall macrostep-expand-1-function sexp env))) - - ;; Create a dedicated macro-expansion buffer and copy the text to - ;; be expanded into it, if required - (let ((separate-buffer-p - (if toggle-separate-buffer - (not macrostep-expand-in-separate-buffer) - macrostep-expand-in-separate-buffer))) - (when (and separate-buffer-p (not macrostep-expansion-buffer)) - (let ((mode major-mode) - (buffer - (get-buffer-create (generate-new-buffer-name "*macro expansion*")))) - (set-buffer buffer) - (funcall mode) - (setq macrostep-expansion-buffer t) - (setq macrostep-outer-environment env) - (save-excursion - (setq start (point)) - (insert text) - (setq end (point-marker))) - (pop-to-buffer buffer)))) - - (unless macrostep-mode (macrostep-mode t)) - (let ((existing-overlay (macrostep-overlay-at-point)) - (macrostep-gensym-depth macrostep-gensym-depth) - (macrostep-gensyms-this-level nil) - priority) - (if existing-overlay - (progn ; Expanding part of a previous macro-expansion - (setq priority (1+ (overlay-get existing-overlay 'priority))) - (setq macrostep-gensym-depth - (overlay-get existing-overlay 'macrostep-gensym-depth))) - ;; Expanding source buffer text - (setq priority 1) - (setq macrostep-gensym-depth -1)) - - (with-silent-modifications - (atomic-change-group - (let ((inhibit-read-only t)) - (save-excursion - ;; Insert expansion - (funcall macrostep-print-function expansion env) - ;; Delete the original form - (macrostep-collapse-overlays-in (point) end) - (delete-region (point) end) - ;; Create a new overlay - (let ((overlay - (make-overlay start - (if (looking-at "\n") - (1+ (point)) - (point))))) - (unless macrostep-expansion-buffer - ;; Highlight the overlay in original source buffers only - (overlay-put overlay 'face 'macrostep-expansion-highlight-face)) - (overlay-put overlay 'priority priority) - (overlay-put overlay 'macrostep-original-text text) - (overlay-put overlay 'macrostep-gensym-depth macrostep-gensym-depth) - (push overlay macrostep-overlays)))))))))) - -(defun macrostep-collapse () - "Collapse the innermost macro expansion near point to its source text. - -If no more macro expansions are visible after this, exit -`macrostep-mode'." - (interactive) - (let ((overlay (macrostep-overlay-at-point))) - (when (not overlay) (error "No macro expansion at point")) - (let ((inhibit-read-only t)) - (with-silent-modifications - (atomic-change-group - (macrostep-collapse-overlay overlay))))) - (if (not macrostep-overlays) - (macrostep-mode 0))) - -(defun macrostep-collapse-all () - "Collapse all visible macro expansions and exit `macrostep-mode'." - (interactive) - (let ((inhibit-read-only t)) - (with-silent-modifications - (dolist (overlay macrostep-overlays) - (let ((outermost (= (overlay-get overlay 'priority) 1))) - ;; We only need restore the original text for the outermost - ;; overlays - (macrostep-collapse-overlay overlay (not outermost)))))) - (setq macrostep-overlays nil) - (macrostep-mode 0)) - -(defun macrostep-next-macro () - "Move point forward to the next macro form in macro-expanded text." - (interactive) - (let* ((start - (if (get-text-property (point) 'macrostep-macro-start) - (1+ (point)) - (point))) - (next (next-single-property-change start 'macrostep-macro-start))) - (if next - (goto-char next) - (error "No more macro forms found")))) - -(defun macrostep-prev-macro () - "Move point back to the previous macro form in macro-expanded text." - (interactive) - (let (prev) - (save-excursion - (while - (progn - (setq prev - (previous-single-property-change (point) 'macrostep-macro-start)) - (if (or (not prev) - (get-text-property (1- prev) 'macrostep-macro-start)) - nil - (prog1 t (goto-char prev)))))) - (if prev - (goto-char (1- prev)) - (error "No previous macro form found")))) - - -;;; Utility functions (not language-specific) - -(defun macrostep-overlay-at-point () - "Return the innermost macro stepper overlay at point." - (let ((result - (get-char-property-and-overlay (point) 'macrostep-original-text))) - (cdr result))) - -(defun macrostep-collapse-overlay (overlay &optional no-restore-p) - "Collapse a macro-expansion overlay and restore the unexpanded source text. - -As a minor optimization, does not restore the original source -text if NO-RESTORE-P is non-nil. This is safe to do when -collapsing all the sub-expansions of an outer overlay, since the -outer overlay will restore the original source itself. - -Also removes the overlay from `macrostep-overlays'." - (with-current-buffer (overlay-buffer overlay) - ;; If we're cleaning up we don't need to bother restoring text - ;; or checking for inner overlays to delete - (unless no-restore-p - (let* ((start (overlay-start overlay)) - (end (overlay-end overlay)) - (text (overlay-get overlay 'macrostep-original-text)) - (sexp-end - (copy-marker - (if (equal (char-before end) ?\n) (1- end) end)))) - (macrostep-collapse-overlays-in start end) - (goto-char (overlay-start overlay)) - (save-excursion - (insert text) - (delete-region (point) sexp-end)))) - ;; Remove overlay from the list and delete it - (setq macrostep-overlays - (delq overlay macrostep-overlays)) - (delete-overlay overlay))) - -(defun macrostep-collapse-overlays-in (start end) - "Collapse all macrostepper overlays that are strictly between START and END. - -Will not collapse overlays that begin at START and end at END." - (dolist (ol (overlays-in start end)) - (if (and (> (overlay-start ol) start) - (< (overlay-end ol) end) - (overlay-get ol 'macrostep-original-text)) - (macrostep-collapse-overlay ol t)))) - - -;;; Emacs Lisp implementation - -(defun macrostep-sexp-bounds () - "Find the bounds of the macro form nearest point. - -If point is not before an open-paren, moves up to the nearest -enclosing list. If the form at point is not a macro call, -attempts to move forward to the next macro form as determined by -`macrostep-macro-form-p-function'. - -Returns a cons of buffer positions, (START . END)." - (save-excursion - (if (not (looking-at "[(`]")) - (backward-up-list 1)) - (if (equal (char-before) ?`) - (backward-char)) - (let ((sexp (funcall macrostep-sexp-at-point-function)) - (env (funcall macrostep-environment-at-point-function))) - ;; If this isn't a macro form, try to find the next one in the buffer - (unless (funcall macrostep-macro-form-p-function sexp env) - (condition-case nil - (macrostep-next-macro) - (error - (if (consp sexp) - (error "(%s ...) is not a macro form" (car sexp)) - (error "Text at point is not a macro form.")))))) - (cons (point) (scan-sexps (point) 1)))) - -(defun macrostep-sexp-at-point (&rest ignore) - "Return the sexp near point for purposes of macro-stepper expansion. - -If the sexp near point is part of a macro expansion, returns the -saved text of the macro expansion, and does not read from the -buffer. This preserves uninterned symbols in the macro -expansion, so that they can be fontified consistently. (See -`macrostep-print-sexp'.)" - (or (get-text-property (point) 'macrostep-expanded-text) - (sexp-at-point))) - -(defun macrostep-macro-form-p (form environment) - "Return non-nil if FORM would be evaluated via macro expansion. - -If FORM is an invocation of a macro defined by `defmacro' or an -enclosing `cl-macrolet' form, return the symbol `macro'. - -If `macrostep-expand-compiler-macros' is non-nil and FORM is a -call to a function with a compiler macro, return the symbol -`compiler-macro'. - -Otherwise, return nil." - (car (macrostep--macro-form-info form environment t))) - -(defun macrostep--macro-form-info (form environment &optional inhibit-autoload) - "Return information about macro definitions that apply to FORM. - -If no macros are involved in the evaluation of FORM within -ENVIRONMENT, returns nil. Otherwise, returns a cons (TYPE -. DEFINITION). - -If FORM would be evaluated by a macro defined by `defmacro', -`cl-macrolet', etc., TYPE is the symbol `macro' and DEFINITION is -the macro definition, as a function. - -If `macrostep-expand-compiler-macros' is non-nil and FORM would -be compiled using a compiler macro, TYPE is the symbol -`compmiler-macro' and DEFINITION is the function that implements -the compiler macro. - -If FORM is an invocation of an autoloaded macro, the behavior -depends on the value of INHIBIT-AUTOLOAD. If INHIBIT-AUTOLOAD is -nil, the file containing the macro definition will be loaded -using `load-library' and the macro definition returned as normal. -If INHIBIT-AUTOLOAD is non-nil, no files will be loaded, and the -value of DEFINITION in the result will be nil." - (if (not (and (consp form) - (symbolp (car form)))) - `(nil . nil) - (let* ((head (car form)) - (local-definition (assoc-default head environment #'eq))) - (if local-definition - `(macro . ,local-definition) - (let ((compiler-macro-definition - (and macrostep-expand-compiler-macros - (or (get head 'compiler-macro) - (get head 'cl-compiler-macro))))) - (if (and compiler-macro-definition - (not (eq form - (apply compiler-macro-definition form (cdr form))))) - `(compiler-macro . ,compiler-macro-definition) - (condition-case nil - (let ((fun (indirect-function head))) - (cl-case (car-safe fun) - ((macro) - `(macro . ,(cdr fun))) - ((autoload) - (when (eq (nth 4 fun) 'macro) - (if inhibit-autoload - `(macro . nil) - (load-library (nth 1 fun)) - (macrostep--macro-form-info form nil)))) - (t - `(nil . nil)))) - (void-function nil)))))))) - -(defun macrostep-expand-1 (form environment) - "Return result of macro-expanding the top level of FORM by exactly one step. -Unlike `macroexpand', this function does not continue macro -expansion until a non-macro-call results." - (cl-destructuring-bind (type . definition) - (macrostep--macro-form-info form environment) - (cl-ecase type - ((nil) - form) - ((macro) - (apply definition (cdr form))) - ((compiler-macro) - (let ((expansion - (apply definition form (cdr form)))) - (if (equal form expansion) - (error "Form left unchanged by compiler macro") - expansion)))))) - -(put 'macrostep-grab-environment-failed 'error-conditions - '(macrostep-grab-environment-failed error)) - -(defun macrostep-environment-at-point () - "Return the local macro-expansion environment at point, if any. - -The local environment includes macros declared by any `macrolet' -or `cl-macrolet' forms surrounding point, as well as by any macro -forms which expand into a `macrolet'. - -The return value is an alist of elements (NAME . FUNCTION), where -NAME is the symbol locally bound to the macro and FUNCTION is the -lambda expression that returns its expansion." - ;; If point is on a macro form within an expansion inserted by - ;; `macrostep-print-sexp', a local environment may have been - ;; previously saved as a text property. - (let ((saved-environment - (get-text-property (point) 'macrostep-environment))) - (if saved-environment - saved-environment - ;; Otherwise, we (ab)use the macro-expander to return the - ;; environment at point. If point is not at an evaluated - ;; position in the containing form, - ;; `macrostep-environment-at-point-1' will raise an error, and - ;; we back up progressively through the containing forms until - ;; it succeeds. - (save-excursion - (catch 'done - (while t - (condition-case nil - (throw 'done (macrostep-environment-at-point-1)) - (macrostep-grab-environment-failed - (condition-case nil - (backward-sexp) - (scan-error (backward-up-list))))))))))) - -(defun macrostep-environment-at-point-1 () - "Attempt to extract the macro environment that would be active at point. - -If point is not at an evaluated position within the containing -form, raise an error." - ;; Macro environments are extracted using Emacs Lisp's builtin - ;; macro-expansion machinery. The form containing point is copied - ;; to a temporary buffer, and a call to - ;; `--macrostep-grab-environment--' is inserted at point. This - ;; altered form is then fully macro-expanded, in an environment - ;; where `--macrostep-grab-environment--' is defined as a macro - ;; which throws the environment to a uniquely-generated tag. - (let* ((point-at-top-level - (save-excursion - (while (ignore-errors (backward-up-list) t)) - (point))) - (enclosing-form - (buffer-substring point-at-top-level - (scan-sexps point-at-top-level 1))) - (position (- (point) point-at-top-level)) - (tag (make-symbol "macrostep-grab-environment-tag")) - (grab-environment '--macrostep-grab-environment--)) - (if (= position 0) - nil - (with-temp-buffer - (emacs-lisp-mode) - (insert enclosing-form) - (goto-char (+ (point-min) position)) - (prin1 `(,grab-environment) (current-buffer)) - (let ((form (read (copy-marker (point-min))))) - (catch tag - (cl-letf (((symbol-function #'message) (symbol-function #'format))) - (with-no-warnings - (ignore-errors - (macroexpand-all - `(cl-macrolet ((,grab-environment (&environment env) - (throw ',tag env))) - ,form))))) - (signal 'macrostep-grab-environment-failed nil))))))) - -(defun macrostep-collect-macro-forms (form &optional environment) - "Identify sub-forms of FORM which undergo macro-expansion. - -FORM is an Emacs Lisp form. ENVIRONMENT is a local environment of -macro definitions. - -The return value is a list of two elements, (MACRO-FORM-ALIST -COMPILER-MACRO-FORMS). - -MACRO-FORM-ALIST is an alist of elements of the form (SUBFORM -. ENVIRONMENT), where SUBFORM is a form which undergoes -macro-expansion in the course of expanding FORM, and ENVIRONMENT -is the local macro environment in force when it is expanded. - -COMPILER-MACRO-FORMS is a list of subforms which would be -compiled using a compiler macro. Since there is no standard way -to provide a local compiler-macro definition in Emacs Lisp, no -corresponding local environments are collected for these. - -Forms and environments are extracted from FORM by instrumenting -Emacs's builtin `macroexpand' function and calling -`macroexpand-all'." - (let ((real-macroexpand (indirect-function #'macroexpand)) - (macro-form-alist '()) - (compiler-macro-forms '())) - (cl-letf - (((symbol-function #'macroexpand) - (lambda (form environment &rest args) - (let ((expansion - (apply real-macroexpand form environment args))) - (cond ((not (eq expansion form)) - (setq macro-form-alist - (cons (cons form environment) - macro-form-alist))) - ((and (consp form) - (symbolp (car form)) - macrostep-expand-compiler-macros - (not (eq form - (cl-compiler-macroexpand form)))) - (setq compiler-macro-forms - (cons form compiler-macro-forms)))) - expansion)))) - (ignore-errors - (macroexpand-all form environment))) - (list macro-form-alist compiler-macro-forms))) - -(defvar macrostep-collected-macro-form-alist nil - "An alist of macro forms and environments. -Controls the printing of sub-forms in `macrostep-print-sexp'.") - -(defvar macrostep-collected-compiler-macro-forms nil - "A list of compiler-macro forms to be highlighted in `macrostep-print-sexp'.") - -(defun macrostep-pp (sexp environment) - "Pretty-print SEXP, fontifying macro forms and uninterned symbols." - (cl-destructuring-bind - (macrostep-collected-macro-form-alist - macrostep-collected-compiler-macro-forms) - (macrostep-collect-macro-forms sexp environment) - (let ((print-quoted t)) - (macrostep-print-sexp sexp) - ;; Point is now after the expanded form; pretty-print it - (save-restriction - (narrow-to-region (scan-sexps (point) -1) (point)) - (save-excursion - (pp-buffer) - ;; Remove the extra newline inserted by pp-buffer - (goto-char (point-max)) - (delete-region - (point) - (save-excursion (skip-chars-backward " \t\n") (point)))) - ;; Indent the newly-inserted form in context - (widen) - (save-excursion - (backward-sexp) - (indent-sexp)))))) - -;; This must be defined before `macrostep-print-sexp': -(defmacro macrostep-propertize (form &rest plist) - "Evaluate FORM, applying syntax properties in PLIST to any inserted text." - (declare (indent 1) - (debug (&rest form))) - (let ((start (make-symbol "start"))) - `(let ((,start (point))) - (prog1 - ,form - ,@(cl-loop for (key value) on plist by #'cddr - collect `(put-text-property ,start (point) - ,key ,value)))))) - -(defun macrostep-print-sexp (sexp) - "Insert SEXP like `print', fontifying macro forms and uninterned symbols. - -Fontifies uninterned symbols and macro forms using -`font-lock-face' property, and saves the actual text of SEXP's -sub-forms as the `macrostep-expanded-text' text property so that -any uninterned symbols can be reused in macro expansions of the -sub-forms. See also `macrostep-sexp-at-point'. - -Macro and compiler-macro forms within SEXP are identified by -comparison with the `macrostep-collected-macro-form-alist' and -`macrostep-collected-compiler-macro-forms' variables, which -should be dynamically let-bound around calls to this function." - (cond - ((symbolp sexp) - ;; Fontify gensyms - (if (not (eq sexp (intern-soft (symbol-name sexp)))) - (macrostep-propertize - (prin1 sexp (current-buffer)) - 'font-lock-face (macrostep-get-gensym-face sexp)) - ;; Print other symbols as normal - (prin1 sexp (current-buffer)))) - - ((listp sexp) - ;; Print quoted and quasiquoted forms nicely. - (let ((head (car sexp))) - (cond ((and (eq head 'quote) ; quote - (= (length sexp) 2)) - (insert "'") - (macrostep-print-sexp (cadr sexp))) - - ((and (eq head '\`) ; backquote - (= (length sexp) 2)) - (if (assq sexp macrostep-collected-macro-form-alist) - (macrostep-propertize - (insert "`") - 'macrostep-expanded-text sexp - 'macrostep-macro-start t - 'font-lock-face 'macrostep-macro-face) - (insert "`")) - (macrostep-print-sexp (cadr sexp))) - - ((and (memq head '(\, \,@)) ; unquote - (= (length sexp) 2)) - (princ head (current-buffer)) - (macrostep-print-sexp (cadr sexp))) - - (t ; other list form - (cl-destructuring-bind (macro? . environment) - (or (assq sexp macrostep-collected-macro-form-alist) - '(nil . nil)) - (let - ((compiler-macro? - (memq sexp macrostep-collected-compiler-macro-forms))) - (if (or macro? compiler-macro?) - (progn - ;; Save the real expansion as a text property on the - ;; opening paren - (macrostep-propertize - (insert "(") - 'macrostep-macro-start t - 'macrostep-expanded-text sexp - 'macrostep-environment environment) - ;; Fontify the head of the macro - (macrostep-propertize - (macrostep-print-sexp head) - 'font-lock-face - (if macro? - 'macrostep-macro-face - 'macrostep-compiler-macro-face))) - ;; Not a macro form - (insert "(") - (macrostep-print-sexp head)))) - - ;; Print remaining list elements - (setq sexp (cdr sexp)) - (when sexp (insert " ")) - (while sexp - (if (listp sexp) - (progn - (macrostep-print-sexp (car sexp)) - (when (cdr sexp) (insert " ")) - (setq sexp (cdr sexp))) - ;; Print tail of dotted list - (insert ". ") - (macrostep-print-sexp sexp) - (setq sexp nil))) - (insert ")"))))) - - ;; Print everything except symbols and lists as normal - (t (prin1 sexp (current-buffer))))) - -(defun macrostep-get-gensym-face (symbol) - "Return the face to use in fontifying SYMBOL in printed macro expansions. - -All symbols introduced in the same level of macro expansion are -fontified using the same face (modulo the number of faces; see -`macrostep-gensym-faces')." - (or (get symbol 'macrostep-gensym-face) - (progn - (if (not macrostep-gensyms-this-level) - (setq macrostep-gensym-depth (1+ macrostep-gensym-depth) - macrostep-gensyms-this-level t)) - (let ((face (ring-ref macrostep-gensym-faces macrostep-gensym-depth))) - (put symbol 'macrostep-gensym-face face) - face)))) - - -(provide 'macrostep) - -;;; macrostep.el ends here diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/metering.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/metering.lisp deleted file mode 100644 index b87d280..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/metering.lisp +++ /dev/null @@ -1,1213 +0,0 @@ -;;; -*- Mode: LISP; Package: monitor; Syntax: Common-lisp; Base: 10.; -*- -;;; Tue Jan 25 18:32:28 1994 by Mark Kantrowitz - -;;; **************************************************************** -;;; Metering System ************************************************ -;;; **************************************************************** -;;; -;;; The Metering System is a portable Common Lisp code profiling tool. -;;; It gathers timing and consing statistics for specified functions -;;; while a program is running. -;;; -;;; The Metering System is a combination of -;;; o the Monitor package written by Chris McConnell -;;; o the Profile package written by Skef Wholey and Rob MacLachlan -;;; The two systems were merged and extended by Mark Kantrowitz. -;;; -;;; Address: Carnegie Mellon University -;;; School of Computer Science -;;; Pittsburgh, PA 15213 -;;; -;;; This code is in the public domain and is distributed without warranty -;;; of any kind. -;;; -;;; This copy is from SLIME, http://www.common-lisp.net/project/slime/ -;;; -;;; - -;;; ******************************** -;;; Change Log ********************* -;;; ******************************** -;;; -;;; 26-JUN-90 mk Merged functionality of Monitor and Profile packages. -;;; 26-JUN-90 mk Now handles both inclusive and exclusive statistics -;;; with respect to nested calls. (Allows it to subtract -;;; total monitoring overhead for each function, not just -;;; the time spent monitoring the function itself.) -;;; 26-JUN-90 mk The table is now saved so that one may manipulate -;;; the data (sorting it, etc.) even after the original -;;; source of the data has been cleared. -;;; 25-SEP-90 mk Added get-cons functions for Lucid 3.0, MACL 1.3.2 -;;; required-arguments functions for Lucid 3.0, -;;; Franz Allegro CL, and MACL 1.3.2. -;;; 25-JAN-91 mk Now uses fdefinition if available. -;;; 25-JAN-91 mk Replaced (and :allegro (not :coral)) with :excl. -;;; Much better solution for the fact that both call -;;; themselves :allegro. -;;; 5-JUL-91 mk Fixed warning to occur only when file is loaded -;;; uncompiled. -;;; 5-JUL-91 mk When many unmonitored functions, print out number -;;; instead of whole list. -;;; 24-MAR-92 mk Updated for CLtL2 compatibility. space measuring -;;; doesn't work in MCL, but fixed so that timing -;;; statistics do. -;;; 26-MAR-92 mk Updated for Lispworks. Replaced :ccl with -;;; (and :ccl (not :lispworks)). -;;; 27-MAR-92 mk Added get-cons for Allegro-V4.0. -;;; 01-JAN-93 mk v2.0 Support for MCL 2.0, CMU CL 16d, Allegro V3.1/4.0/4.1, -;;; Lucid 4.0, ibcl -;;; 25-JAN-94 mk v2.1 Patches for CLISP from Bruno Haible. -;;; 01-APR-05 lgorrie Removed support for all Lisps except CLISP and OpenMCL. -;;; Purely to cut down on stale code (e.g. #+cltl2) in this -;;; version that is bundled with SLIME. -;;; 22-Aug-08 stas Define TIME-TYPE for Clozure CL. -;;; 07-Aug-12 heller Break lines at 80 columns -;;; - -;;; ******************************** -;;; To Do ************************** -;;; ******************************** -;;; -;;; - Need get-cons for Allegro, AKCL. -;;; - Speed up monitoring code. Replace use of hash tables with an embedded -;;; offset in an array so that it will be faster than using gethash. -;;; (i.e., svref/closure reference is usually faster than gethash). -;;; - Beware of (get-internal-run-time) overflowing. Yikes! -;;; - Check robustness with respect to profiled functions. -;;; - Check logic of computing inclusive and exclusive time and consing. -;;; Especially wrt incf/setf comment below. Should be incf, so we -;;; sum recursive calls. -;;; - Add option to record caller statistics -- this would list who -;;; called which functions and how often. -;;; - switches to turn timing/CONSING statistics collection on/off. - - -;;; ******************************** -;;; Notes ************************** -;;; ******************************** -;;; -;;; METERING has been tested (successfully) in the following lisps: -;;; CMU Common Lisp (16d, Python Compiler 1.0 ) :new-compiler -;;; CMU Common Lisp (M2.9 15-Aug-90, Compiler M1.8 15-Aug-90) -;;; Macintosh Allegro Common Lisp (1.3.2) -;;; Macintosh Common Lisp (2.0) -;;; ExCL (Franz Allegro CL 3.1.12 [DEC 3100] 11/19/90) :allegro-v3.1 -;;; ExCL (Franz Allegro CL 4.0.1 [Sun4] 2/8/91) :allegro-v4.0 -;;; ExCL (Franz Allegro CL 4.1 [SPARC R1] 8/28/92 14:06) :allegro-v4.1 -;;; ExCL (Franz ACL 5.0.1 [Linux/X86] 6/29/99 16:11) :allegro-v5.0.1 -;;; Lucid CL (Version 2.1 6-DEC-87) -;;; Lucid Common Lisp (3.0) -;;; Lucid Common Lisp (4.0.1 HP-700 12-Aug-91) -;;; AKCL (1.86, June 30, 1987 or later) -;;; Ibuki Common Lisp (Version 2, release 01.027) -;;; CLISP (January 1994) -;;; -;;; METERING needs to be tested in the following lisps: -;;; Symbolics Common Lisp (8.0) -;;; KCL (June 3, 1987 or later) -;;; TI (Release 4.1 or later) -;;; Golden Common Lisp (3.1 IBM-PC) -;;; VAXLisp (2.0, 3.1) -;;; Procyon Common Lisp - - -;;; **************************************************************** -;;; Documentation ************************************************** -;;; **************************************************************** -;;; -;;; This system runs in any valid Common Lisp. Four small -;;; implementation-dependent changes can be made to improve performance -;;; and prettiness. In the section labelled "Implementation Dependent -;;; Changes" below, you should tailor the functions REQUIRED-ARGUMENTS, -;;; GET-CONS, GET-TIME, and TIME-UNITS-PER-SECOND to your implementation -;;; for the best results. If GET-CONS is not specified for your -;;; implementation, no consing information will be reported. The other -;;; functions will default to working forms, albeit inefficient, in -;;; non-CMU implementations. If you tailor these functions for a particular -;;; version of Common Lisp, we'd appreciate receiving the code. -;;; - -;;; **************************************************************** -;;; Usage Notes **************************************************** -;;; **************************************************************** -;;; -;;; SUGGESTED USAGE: -;;; -;;; Start by monitoring big pieces of the program, then carefully choose -;;; which functions close to, but not in, the inner loop are to be -;;; monitored next. Don't monitor functions that are called by other -;;; monitored functions: you will only confuse yourself. -;;; -;;; If the per-call time reported is less than 1/10th of a second, then -;;; consider the clock resolution and profiling overhead before you believe -;;; the time. It may be that you will need to run your program many times -;;; in order to average out to a higher resolution. -;;; -;;; The easiest way to use this package is to load it and execute either -;;; (swank-monitor:with-monitoring (names*) () -;;; your-forms*) -;;; or -;;; (swank-monitor:monitor-form your-form) -;;; The former allows you to specify which functions will be monitored; the -;;; latter monitors all functions in the current package. Both automatically -;;; produce a table of statistics. Other variants can be constructed from -;;; the monitoring primitives, which are described below, along with a -;;; fuller description of these two macros. -;;; -;;; For best results, compile this file before using. -;;; -;;; -;;; CLOCK RESOLUTION: -;;; -;;; Unless you are very lucky, the length of your machine's clock "tick" is -;;; probably much longer than the time it takes a simple function to run. -;;; For example, on the IBM RT, the clock resolution is 1/50th of a second. -;;; This means that if a function is only called a few times, then only the -;;; first couple of decimal places are really meaningful. -;;; -;;; -;;; MONITORING OVERHEAD: -;;; -;;; The added monitoring code takes time to run every time that the monitored -;;; function is called, which can disrupt the attempt to collect timing -;;; information. In order to avoid serious inflation of the times for functions -;;; that take little time to run, an estimate of the overhead due to monitoring -;;; is subtracted from the times reported for each function. -;;; -;;; Although this correction works fairly well, it is not totally accurate, -;;; resulting in times that become increasingly meaningless for functions -;;; with short runtimes. For example, subtracting the estimated overhead -;;; may result in negative times for some functions. This is only a concern -;;; when the estimated profiling overhead is many times larger than -;;; reported total CPU time. -;;; -;;; If you monitor functions that are called by monitored functions, in -;;; :inclusive mode the monitoring overhead for the inner function is -;;; subtracted from the CPU time for the outer function. [We do this by -;;; counting for each function not only the number of calls to *this* -;;; function, but also the number of monitored calls while it was running.] -;;; In :exclusive mode this is not necessary, since we subtract the -;;; monitoring time of inner functions, overhead & all. -;;; -;;; Otherwise, the estimated monitoring overhead is not represented in the -;;; reported total CPU time. The sum of total CPU time and the estimated -;;; monitoring overhead should be close to the total CPU time for the -;;; entire monitoring run (as determined by TIME). -;;; -;;; A timing overhead factor is computed at load time. This will be incorrect -;;; if the monitoring code is run in a different environment than this file -;;; was loaded in. For example, saving a core image on a high performance -;;; machine and running it on a low performance one will result in the use -;;; of an erroneously small overhead factor. -;;; -;;; -;;; If your times vary widely, possible causes are: -;;; - Garbage collection. Try turning it off, then running your code. -;;; Be warned that monitoring code will probably cons when it does -;;; (get-internal-run-time). -;;; - Swapping. If you have enough memory, execute your form once -;;; before monitoring so that it will be swapped into memory. Otherwise, -;;; get a bigger machine! -;;; - Resolution of internal-time-units-per-second. If this value is -;;; too low, then the timings become wild. You can try executing more -;;; of whatever your test is, but that will only work if some of your -;;; paths do not match the timer resolution. -;;; internal-time-units-per-second is so coarse -- on a Symbolics it is -;;; 977, in MACL it is 60. -;;; -;;; - -;;; **************************************************************** -;;; Interface ****************************************************** -;;; **************************************************************** -;;; -;;; WITH-MONITORING (&rest functions) [Macro] -;;; (&optional (nested :exclusive) -;;; (threshold 0.01) -;;; (key :percent-time)) -;;; &body body -;;; The named functions will be set up for monitoring, the body forms executed, -;;; a table of results printed, and the functions unmonitored. The nested, -;;; threshold, and key arguments are passed to report-monitoring below. -;;; -;;; MONITOR-FORM form [Macro] -;;; &optional (nested :exclusive) -;;; (threshold 0.01) -;;; (key :percent-time) -;;; All functions in the current package are set up for monitoring while -;;; the form is executed, and automatically unmonitored after a table of -;;; results has been printed. The nested, threshold, and key arguments -;;; are passed to report-monitoring below. -;;; -;;; *MONITORED-FUNCTIONS* [Variable] -;;; This holds a list of all functions that are currently being monitored. -;;; -;;; MONITOR &rest names [Macro] -;;; The named functions will be set up for monitoring by augmenting -;;; their function definitions with code that gathers statistical information -;;; about code performance. As with the TRACE macro, the function names are -;;; not evaluated. Calls the function SWANK-MONITOR::MONITORING-ENCAPSULATE on each -;;; function name. If no names are specified, returns a list of all -;;; monitored functions. -;;; -;;; If name is not a symbol, it is evaled to return the appropriate -;;; closure. This allows you to monitor closures stored anywhere like -;;; in a variable, array or structure. Most other monitoring packages -;;; can't handle this. -;;; -;;; MONITOR-ALL &optional (package *package*) [Function] -;;; Monitors all functions in the specified package, which defaults to -;;; the current package. -;;; -;;; UNMONITOR &rest names [Macro] -;;; Removes monitoring code from the named functions. If no names are -;;; specified, all currently monitored functions are unmonitored. -;;; -;;; RESET-MONITORING-INFO name [Function] -;;; Resets the monitoring statistics for the specified function. -;;; -;;; RESET-ALL-MONITORING [Function] -;;; Resets the monitoring statistics for all monitored functions. -;;; -;;; MONITORED name [Function] -;;; Predicate to test whether a function is monitored. -;;; -;;; REPORT-MONITORING &optional names [Function] -;;; (nested :exclusive) -;;; (threshold 0.01) -;;; (key :percent-time) -;;; Creates a table of monitoring information for the specified list -;;; of names, and displays the table using display-monitoring-results. -;;; If names is :all or nil, uses all currently monitored functions. -;;; Takes the following arguments: -;;; - NESTED specifies whether nested calls of monitored functions -;;; are included in the times for monitored functions. -;;; o If :inclusive, the per-function information is for the entire -;;; duration of the monitored function, including any calls to -;;; other monitored functions. If functions A and B are monitored, -;;; and A calls B, then the accumulated time and consing for A will -;;; include the time and consing of B. Note: if a function calls -;;; itself recursively, the time spent in the inner call(s) may -;;; be counted several times. -;;; o If :exclusive, the information excludes time attributed to -;;; calls to other monitored functions. This is the default. -;;; - THRESHOLD specifies that only functions which have been executed -;;; more than threshold percent of the time will be reported. Defaults -;;; to 1%. If a threshold of 0 is specified, all functions are listed, -;;; even those with 0 or negative running times (see note on overhead). -;;; - KEY specifies that the table be sorted by one of the following -;;; sort keys: -;;; :function alphabetically by function name -;;; :percent-time by percent of total execution time -;;; :percent-cons by percent of total consing -;;; :calls by number of times the function was called -;;; :time-per-call by average execution time per function -;;; :cons-per-call by average consing per function -;;; :time same as :percent-time -;;; :cons same as :percent-cons -;;; -;;; REPORT &key (names :all) [Function] -;;; (nested :exclusive) -;;; (threshold 0.01) -;;; (sort-key :percent-time) -;;; (ignore-no-calls nil) -;;; -;;; Same as REPORT-MONITORING but we use a nicer keyword interface. -;;; -;;; DISPLAY-MONITORING-RESULTS &optional (threshold 0.01) [Function] -;;; (key :percent-time) -;;; Prints a table showing for each named function: -;;; - the total CPU time used in that function for all calls -;;; - the total number of bytes consed in that function for all calls -;;; - the total number of calls -;;; - the average amount of CPU time per call -;;; - the average amount of consing per call -;;; - the percent of total execution time spent executing that function -;;; - the percent of total consing spent consing in that function -;;; Summary totals of the CPU time, consing, and calls columns are printed. -;;; An estimate of the monitoring overhead is also printed. May be run -;;; even after unmonitoring all the functions, to play with the data. -;;; -;;; SAMPLE TABLE: -#| - Cons - % % Per Total Total -Function Time Cons Calls Sec/Call Call Time Cons ----------------------------------------------------------------------- -FIND-ROLE: 0.58 0.00 136 0.003521 0 0.478863 0 -GROUP-ROLE: 0.35 0.00 365 0.000802 0 0.292760 0 -GROUP-PROJECTOR: 0.05 0.00 102 0.000408 0 0.041648 0 -FEATURE-P: 0.02 0.00 570 0.000028 0 0.015680 0 ----------------------------------------------------------------------- -TOTAL: 1173 0.828950 0 -Estimated total monitoring overhead: 0.88 seconds -|# - -;;; **************************************************************** -;;; METERING ******************************************************* -;;; **************************************************************** - -;;; ******************************** -;;; Warn people using the wrong Lisp -;;; ******************************** - -#-(or clisp openmcl) -(warn "metering.lisp does not support your Lisp implementation!") - -;;; ******************************** -;;; Packages *********************** -;;; ******************************** - -;;; For CLtL2 compatible lisps - -(defpackage "SWANK-MONITOR" (:use "COMMON-LISP") - (:export "*MONITORED-FUNCTIONS*" - "MONITOR" "MONITOR-ALL" "UNMONITOR" "MONITOR-FORM" - "WITH-MONITORING" - "RESET-MONITORING-INFO" "RESET-ALL-MONITORING" - "MONITORED" - "REPORT-MONITORING" - "DISPLAY-MONITORING-RESULTS" - "MONITORING-ENCAPSULATE" "MONITORING-UNENCAPSULATE" - "REPORT")) -(in-package "SWANK-MONITOR") - -;;; Warn user if they're loading the source instead of compiling it first. -(eval-when (eval) - (warn "This file should be compiled before loading for best results.")) - -;;; ******************************** -;;; Version ************************ -;;; ******************************** - -(defparameter *metering-version* "v2.1 25-JAN-94" - "Current version number/date for Metering.") - - -;;; **************************************************************** -;;; Implementation Dependent Definitions *************************** -;;; **************************************************************** - -;;; ******************************** -;;; Timing Functions *************** -;;; ******************************** -;;; The get-time function is called to find the total number of ticks since -;;; the beginning of time. time-units-per-second allows us to convert units -;;; to seconds. - -#-(or clisp openmcl) -(eval-when (compile eval) - (warn - "You may want to supply implementation-specific get-time functions.")) - -(defconstant time-units-per-second internal-time-units-per-second) - -#+openmcl -(progn - (deftype time-type () 'unsigned-byte) - (deftype consing-type () 'unsigned-byte)) - -(defmacro get-time () - `(the time-type (get-internal-run-time))) - -;;; NOTE: In Macintosh Common Lisp, CCL::GCTIME returns the number of -;;; milliseconds spent during GC. We could subtract this from -;;; the value returned by get-internal-run-time to eliminate -;;; the effect of GC on the timing values, but we prefer to let -;;; the user run without GC on. If the application is so big that -;;; it requires GC to complete, then the GC times are part of the -;;; cost of doing business, and will average out in the long run. -;;; If it seems really important to a user that GC times not be -;;; counted, then uncomment the following three lines and read-time -;;; conditionalize the definition of get-time above with #-:openmcl. -;#+openmcl -;(defmacro get-time () -; `(the time-type (- (get-internal-run-time) (ccl:gctime)))) - -;;; ******************************** -;;; Consing Functions ************** -;;; ******************************** -;;; The get-cons macro is called to find the total number of bytes -;;; consed since the beginning of time. - -#+clisp -(defun get-cons () - (multiple-value-bind (real1 real2 run1 run2 gc1 gc2 space1 space2 gccount) - (sys::%%time) - (declare (ignore real1 real2 run1 run2 gc1 gc2 gccount)) - (dpb space1 (byte 24 24) space2))) - -;;; Macintosh Common Lisp 2.0 -;;; Note that this includes bytes that were allocated during GC. -;;; We could subtract this out by advising GC like we did under -;;; MCL 1.3.2, but I'd rather users ran without GC. If they can't -;;; run without GC, then the bytes consed during GC are a cost of -;;; running their program. Metering the code a few times will -;;; avoid the consing values being too lopsided. If a user really really -;;; wants to subtract out the consing during GC, replace the following -;;; two lines with the commented out code. -#+openmcl -(defmacro get-cons () `(the consing-type (ccl::total-bytes-allocated))) - -#-(or clisp openmcl) -(progn - (eval-when (compile eval) - (warn "No consing will be reported unless a get-cons function is ~ - defined.")) - - (defmacro get-cons () '(the consing-type 0))) - -;; actually, neither `get-cons' nor `get-time' are used as is, -;; but only in the following macro `with-time/cons' -#-:clisp -(defmacro with-time/cons ((delta-time delta-cons) form &body post-process) - (let ((start-cons (gensym "START-CONS-")) - (start-time (gensym "START-TIME-"))) - `(let ((,start-time (get-time)) (,start-cons (get-cons))) - (declare (type time-type ,start-time) - (type consing-type ,start-cons)) - (multiple-value-prog1 ,form - (let ((,delta-time (- (get-time) ,start-time)) - (,delta-cons (- (get-cons) ,start-cons))) - ,@post-process))))) - -#+clisp -(progn - (defmacro delta4 (nv1 nv2 ov1 ov2 by) - `(- (dpb (- ,nv1 ,ov1) (byte ,by ,by) ,nv2) ,ov2)) - - (let ((del (find-symbol "DELTA4" "SYS"))) - (when del (setf (fdefinition 'delta4) (fdefinition del)))) - - (if (< internal-time-units-per-second 1000000) - ;; TIME_1: AMIGA, OS/2, UNIX_TIMES - (defmacro delta4-time (new-time1 new-time2 old-time1 old-time2) - `(delta4 ,new-time1 ,new-time2 ,old-time1 ,old-time2 16)) - ;; TIME_2: other UNIX, WIN32 - (defmacro delta4-time (new-time1 new-time2 old-time1 old-time2) - `(+ (* (- ,new-time1 ,old-time1) internal-time-units-per-second) - (- ,new-time2 ,old-time2)))) - - (defmacro delta4-cons (new-cons1 new-cons2 old-cons1 old-cons2) - `(delta4 ,new-cons1 ,new-cons2 ,old-cons1 ,old-cons2 24)) - - ;; avoid consing: when the application conses a lot, - ;; get-cons may return a bignum, so we really should not use it. - (defmacro with-time/cons ((delta-time delta-cons) form &body post-process) - (let ((beg-cons1 (gensym "BEG-CONS1-")) (end-cons1 (gensym "END-CONS1-")) - (beg-cons2 (gensym "BEG-CONS2-")) (end-cons2 (gensym "END-CONS2-")) - (beg-time1 (gensym "BEG-TIME1-")) (end-time1 (gensym "END-TIME1-")) - (beg-time2 (gensym "BEG-TIME2-")) (end-time2 (gensym "END-TIME2-")) - (re1 (gensym)) (re2 (gensym)) (gc1 (gensym)) (gc2 (gensym))) - `(multiple-value-bind (,re1 ,re2 ,beg-time1 ,beg-time2 - ,gc1 ,gc2 ,beg-cons1 ,beg-cons2) - (sys::%%time) - (declare (ignore ,re1 ,re2 ,gc1 ,gc2)) - (multiple-value-prog1 ,form - (multiple-value-bind (,re1 ,re2 ,end-time1 ,end-time2 - ,gc1 ,gc2 ,end-cons1 ,end-cons2) - (sys::%%time) - (declare (ignore ,re1 ,re2 ,gc1 ,gc2)) - (let ((,delta-time (delta4-time ,end-time1 ,end-time2 - ,beg-time1 ,beg-time2)) - (,delta-cons (delta4-cons ,end-cons1 ,end-cons2 - ,beg-cons1 ,beg-cons2))) - ,@post-process))))))) - -;;; ******************************** -;;; Required Arguments ************* -;;; ******************************** -;;; -;;; Required (Fixed) vs Optional Args -;;; -;;; To avoid unnecessary consing in the "encapsulation" code, we find out the -;;; number of required arguments, and use &rest to capture only non-required -;;; arguments. The function Required-Arguments returns two values: the first -;;; is the number of required arguments, and the second is T iff there are any -;;; non-required arguments (e.g. &optional, &rest, &key). - -;;; Lucid, Allegro, and Macintosh Common Lisp -#+openmcl -(defun required-arguments (name) - (let* ((function (symbol-function name)) - (args (ccl:arglist function)) - (pos (position-if #'(lambda (x) - (and (symbolp x) - (let ((name (symbol-name x))) - (and (>= (length name) 1) - (char= (schar name 0) - #\&))))) - args))) - (if pos - (values pos t) - (values (length args) nil)))) - -#+clisp -(defun required-arguments (name) - (multiple-value-bind (name req-num opt-num rest-p key-p keywords allow-p) - (sys::function-signature name t) - (if name ; no error - (values req-num (or (/= 0 opt-num) rest-p key-p keywords allow-p)) - (values 0 t)))) - -#-(or clisp openmcl) -(progn - (eval-when (compile eval) - (warn - "You may want to add an implementation-specific ~ -Required-Arguments function.")) - (eval-when (load eval) - (defun required-arguments (name) - (declare (ignore name)) - (values 0 t)))) - -#| -;;;Examples -(defun square (x) (* x x)) -(defun square2 (x &optional y) (* x x y)) -(defun test (x y &optional (z 3)) 3) -(defun test2 (x y &optional (z 3) &rest fred) 3) - -(required-arguments 'square) => 1 nil -(required-arguments 'square2) => 1 t -(required-arguments 'test) => 2 t -(required-arguments 'test2) => 2 t -|# - - -;;; **************************************************************** -;;; Main METERING Code ********************************************* -;;; **************************************************************** - -;;; ******************************** -;;; Global Variables *************** -;;; ******************************** -(defvar *MONITOR-TIME-OVERHEAD* nil - "The amount of time an empty monitored function costs.") -(defvar *MONITOR-CONS-OVERHEAD* nil - "The amount of cons an empty monitored function costs.") - -(defvar *TOTAL-TIME* 0 - "Total amount of time monitored so far.") -(defvar *TOTAL-CONS* 0 - "Total amount of consing monitored so far.") -(defvar *TOTAL-CALLS* 0 - "Total number of calls monitored so far.") -(proclaim '(type time-type *total-time*)) -(proclaim '(type consing-type *total-cons*)) -(proclaim '(fixnum *total-calls*)) - -;;; ******************************** -;;; Accessor Functions ************* -;;; ******************************** -;;; Perhaps the SYMBOLP should be FBOUNDP? I.e., what about variables -;;; containing closures. -(defmacro PLACE-FUNCTION (function-place) - "Return the function found at FUNCTION-PLACE. Evals FUNCTION-PLACE -if it isn't a symbol, to allow monitoring of closures located in -variables/arrays/structures." - ;; Note that (fboundp 'fdefinition) returns T even if fdefinition - ;; is a macro, which is what we want. - (if (fboundp 'fdefinition) - `(if (fboundp ,function-place) - (fdefinition ,function-place) - (eval ,function-place)) - `(if (symbolp ,function-place) - (symbol-function ,function-place) - (eval ,function-place)))) - -(defsetf PLACE-FUNCTION (function-place) (function) - "Set the function in FUNCTION-PLACE to FUNCTION." - (if (fboundp 'fdefinition) - ;; If we're conforming to CLtL2, use fdefinition here. - `(if (fboundp ,function-place) - (setf (fdefinition ,function-place) ,function) - (eval '(setf ,function-place ',function))) - `(if (symbolp ,function-place) - (setf (symbol-function ,function-place) ,function) - (eval '(setf ,function-place ',function))))) - -#| -;;; before using fdefinition -(defun PLACE-FUNCTION (function-place) - "Return the function found at FUNCTION-PLACE. Evals FUNCTION-PLACE -if it isn't a symbol, to allow monitoring of closures located in -variables/arrays/structures." - (if (symbolp function-place) - (symbol-function function-place) - (eval function-place))) - -(defsetf PLACE-FUNCTION (function-place) (function) - "Set the function in FUNCTION-PLACE to FUNCTION." - `(if (symbolp ,function-place) - (setf (symbol-function ,function-place) ,function) - (eval '(setf ,function-place ',function)))) -|# - -(defun PLACE-FBOUNDP (function-place) - "Test to see if FUNCTION-PLACE is a function." - ;; probably should be - #|(or (and (symbolp function-place)(fboundp function-place)) - (functionp (place-function function-place)))|# - (if (symbolp function-place) - (fboundp function-place) - (functionp (place-function function-place)))) - -(defun PLACE-MACROP (function-place) - "Test to see if FUNCTION-PLACE is a macro." - (when (symbolp function-place) - (macro-function function-place))) - -;;; ******************************** -;;; Measurement Tables ************* -;;; ******************************** -(defvar *monitored-functions* nil - "List of monitored symbols.") - -;;; We associate a METERING-FUNCTIONS structure with each monitored function -;;; name or other closure. This holds the functions that we call to manipulate -;;; the closure which implements the encapsulation. -;;; -(defstruct metering-functions - (name nil) - (old-definition nil :type function) - (new-definition nil :type function) - (read-metering nil :type function) - (reset-metering nil :type function)) - -;;; In general using hash tables in time-critical programs is a bad idea, -;;; because when one has to grow the table and rehash everything, the -;;; timing becomes grossly inaccurate. In this case it is not an issue -;;; because all inserting of entries in the hash table occurs before the -;;; timing commences. The only circumstance in which this could be a -;;; problem is if the lisp rehashes on the next reference to the table, -;;; instead of when the entry which forces a rehash was inserted. -;;; -;;; Note that a similar kind of problem can occur with GC, which is why -;;; one should turn off GC when monitoring code. -;;; -(defvar *monitor* (make-hash-table :test #'equal) - "Hash table in which METERING-FUNCTIONS structures are stored.") -(defun get-monitor-info (name) - (gethash name *monitor*)) -(defsetf get-monitor-info (name) (info) - `(setf (gethash ,name *monitor*) ,info)) - -(defun MONITORED (function-place) - "Test to see if a FUNCTION-PLACE is monitored." - (and (place-fboundp function-place) ; this line necessary? - (get-monitor-info function-place))) - -(defun reset-monitoring-info (name) - "Reset the monitoring info for the specified function." - (let ((finfo (get-monitor-info name))) - (when finfo - (funcall (metering-functions-reset-metering finfo))))) -(defun reset-all-monitoring () - "Reset monitoring info for all functions." - (setq *total-time* 0 - *total-cons* 0 - *total-calls* 0) - (dolist (symbol *monitored-functions*) - (when (monitored symbol) - (reset-monitoring-info symbol)))) - -(defun monitor-info-values (name &optional (nested :exclusive) warn) - "Returns monitoring information values for the named function, -adjusted for overhead." - (let ((finfo (get-monitor-info name))) - (if finfo - (multiple-value-bind (inclusive-time inclusive-cons - exclusive-time exclusive-cons - calls nested-calls) - (funcall (metering-functions-read-metering finfo)) - (unless (or (null warn) - (eq (place-function name) - (metering-functions-new-definition finfo))) - (warn "Funtion ~S has been redefined, so times may be inaccurate.~@ - MONITOR it again to record calls to the new definition." - name)) - (case nested - (:exclusive (values calls - nested-calls - (- exclusive-time - (* calls *monitor-time-overhead*)) - (- exclusive-cons - (* calls *monitor-cons-overhead*)))) - ;; In :inclusive mode, subtract overhead for all the - ;; called functions as well. Nested-calls includes the - ;; calls of the function as well. [Necessary 'cause of - ;; functions which call themselves recursively.] - (:inclusive (values calls - nested-calls - (- inclusive-time - (* nested-calls ;(+ calls) - *monitor-time-overhead*)) - (- inclusive-cons - (* nested-calls ;(+ calls) - *monitor-cons-overhead*)))))) - (values 0 0 0 0)))) - -;;; ******************************** -;;; Encapsulate ******************** -;;; ******************************** -(eval-when (compile load eval) -;; Returns a lambda expression for a function that, when called with the -;; function name, will set up that function for metering. -;; -;; A function is monitored by replacing its definition with a closure -;; created by the following function. The closure records the monitoring -;; data, and updates the data with each call of the function. -;; -;; Other closures are used to read and reset the data. -(defun make-monitoring-encapsulation (min-args optionals-p) - (let (required-args) - (dotimes (i min-args) (push (gensym) required-args)) - `(lambda (name) - (let ((inclusive-time 0) - (inclusive-cons 0) - (exclusive-time 0) - (exclusive-cons 0) - (calls 0) - (nested-calls 0) - (old-definition (place-function name))) - (declare (type time-type inclusive-time) - (type time-type exclusive-time) - (type consing-type inclusive-cons) - (type consing-type exclusive-cons) - (fixnum calls) - (fixnum nested-calls)) - (pushnew name *monitored-functions*) - - (setf (place-function name) - #'(lambda (,@required-args - ,@(when optionals-p - `(&rest optional-args))) - (let ((prev-total-time *total-time*) - (prev-total-cons *total-cons*) - (prev-total-calls *total-calls*) - ;; (old-time inclusive-time) - ;; (old-cons inclusive-cons) - ;; (old-nested-calls nested-calls) - ) - (declare (type time-type prev-total-time) - (type consing-type prev-total-cons) - (fixnum prev-total-calls)) - (with-time/cons (delta-time delta-cons) - ;; form - ,(if optionals-p - `(apply old-definition - ,@required-args optional-args) - `(funcall old-definition ,@required-args)) - ;; post-processing: - ;; Calls - (incf calls) - (incf *total-calls*) - ;; nested-calls includes this call - (incf nested-calls (the fixnum - (- *total-calls* - prev-total-calls))) - ;; (setf nested-calls (+ old-nested-calls - ;; (- *total-calls* - ;; prev-total-calls))) - ;; Time - ;; Problem with inclusive time is that it - ;; currently doesn't add values from recursive - ;; calls to the same function. Change the - ;; setf to an incf to fix this? - (incf inclusive-time (the time-type delta-time)) - ;; (setf inclusive-time (+ delta-time old-time)) - (incf exclusive-time (the time-type - (+ delta-time - (- prev-total-time - *total-time*)))) - (setf *total-time* (the time-type - (+ delta-time - prev-total-time))) - ;; Consing - (incf inclusive-cons (the consing-type delta-cons)) - ;; (setf inclusive-cons (+ delta-cons old-cons)) - (incf exclusive-cons (the consing-type - (+ delta-cons - (- prev-total-cons - *total-cons*)))) - (setf *total-cons* - (the consing-type - (+ delta-cons prev-total-cons))))))) - (setf (get-monitor-info name) - (make-metering-functions - :name name - :old-definition old-definition - :new-definition (place-function name) - :read-metering #'(lambda () - (values inclusive-time - inclusive-cons - exclusive-time - exclusive-cons - calls - nested-calls)) - :reset-metering #'(lambda () - (setq inclusive-time 0 - inclusive-cons 0 - exclusive-time 0 - exclusive-cons 0 - calls 0 - nested-calls 0) - t))))))) -);; End of EVAL-WHEN - -;;; For efficiency reasons, we precompute the encapsulation functions -;;; for a variety of combinations of argument structures -;;; (min-args . optional-p). These are stored in the following hash table -;;; along with any new ones we encounter. Since we're now precomputing -;;; closure functions for common argument signatures, this eliminates -;;; the former need to call COMPILE for each monitored function. -(eval-when (compile eval) - (defconstant precomputed-encapsulations 8)) - -(defvar *existing-encapsulations* (make-hash-table :test #'equal)) -(defun find-encapsulation (min-args optionals-p) - (or (gethash (cons min-args optionals-p) *existing-encapsulations*) - (setf (gethash (cons min-args optionals-p) *existing-encapsulations*) - (compile nil - (make-monitoring-encapsulation min-args optionals-p))))) - -(macrolet ((frob () - (let ((res ())) - (dotimes (i precomputed-encapsulations) - (push `(setf (gethash '(,i . nil) *existing-encapsulations*) - #',(make-monitoring-encapsulation i nil)) - res) - (push `(setf (gethash '(,i . t) *existing-encapsulations*) - #',(make-monitoring-encapsulation i t)) - res)) - `(progn ,@res)))) - (frob)) - -(defun monitoring-encapsulate (name &optional warn) - "Monitor the function Name. If already monitored, unmonitor first." - ;; Saves the current definition of name and inserts a new function which - ;; returns the result of evaluating body. - (cond ((not (place-fboundp name)) ; not a function - (when warn - (warn "Ignoring undefined function ~S." name))) - ((place-macrop name) ; a macro - (when warn - (warn "Ignoring macro ~S." name))) - (t ; tis a function - (when (get-monitor-info name) ; monitored - (when warn - (warn "~S already monitored, so unmonitoring it first." name)) - (monitoring-unencapsulate name)) - (multiple-value-bind (min-args optionals-p) - (required-arguments name) - (funcall (find-encapsulation min-args optionals-p) name))))) - -(defun monitoring-unencapsulate (name &optional warn) - "Removes monitoring encapsulation code from around Name." - (let ((finfo (get-monitor-info name))) - (when finfo ; monitored - (remprop name 'metering-functions) - (setq *monitored-functions* - (remove name *monitored-functions* :test #'equal)) - (if (eq (place-function name) - (metering-functions-new-definition finfo)) - (setf (place-function name) - (metering-functions-old-definition finfo)) - (when warn - (warn "Preserving current definition of redefined function ~S." - name)))))) - -;;; ******************************** -;;; Main Monitoring Functions ****** -;;; ******************************** -(defmacro MONITOR (&rest names) - "Monitor the named functions. As in TRACE, the names are not evaluated. - If a function is already monitored, then unmonitor and remonitor (useful - to notice function redefinition). If a name is undefined, give a warning - and ignore it. See also unmonitor, report-monitoring, - display-monitoring-results and reset-time." - `(progn - ,@(mapcar #'(lambda (name) `(monitoring-encapsulate ',name)) names) - *monitored-functions*)) - -(defmacro UNMONITOR (&rest names) - "Remove the monitoring on the named functions. - Names defaults to the list of all currently monitored functions." - `(dolist (name ,(if names `',names '*monitored-functions*) (values)) - (monitoring-unencapsulate name))) - -(defun MONITOR-ALL (&optional (package *package*)) - "Monitor all functions in the specified package." - (let ((package (if (packagep package) - package - (find-package package)))) - (do-symbols (symbol package) - (when (eq (symbol-package symbol) package) - (monitoring-encapsulate symbol))))) - -(defmacro MONITOR-FORM (form - &optional (nested :exclusive) (threshold 0.01) - (key :percent-time)) - "Monitor the execution of all functions in the current package -during the execution of FORM. All functions that are executed above -THRESHOLD % will be reported." - `(unwind-protect - (progn - (monitor-all) - (reset-all-monitoring) - (prog1 - (time ,form) - (report-monitoring :all ,nested ,threshold ,key :ignore-no-calls))) - (unmonitor))) - -(defmacro WITH-MONITORING ((&rest functions) - (&optional (nested :exclusive) - (threshold 0.01) - (key :percent-time)) - &body body) - "Monitor the specified functions during the execution of the body." - `(unwind-protect - (progn - (dolist (fun ',functions) - (monitoring-encapsulate fun)) - (reset-all-monitoring) - ,@body - (report-monitoring :all ,nested ,threshold ,key)) - (unmonitor))) - -;;; ******************************** -;;; Overhead Calculations ********** -;;; ******************************** -(defconstant overhead-iterations 5000 - "Number of iterations over which the timing overhead is averaged.") - -;;; Perhaps this should return something to frustrate clever compilers. -(defun STUB-FUNCTION (x) - (declare (ignore x)) - nil) -(proclaim '(notinline stub-function)) - -(defun SET-MONITOR-OVERHEAD () - "Determines the average overhead of monitoring by monitoring the execution -of an empty function many times." - (setq *monitor-time-overhead* 0 - *monitor-cons-overhead* 0) - (stub-function nil) - (monitor stub-function) - (reset-all-monitoring) - (let ((overhead-function (symbol-function 'stub-function))) - (dotimes (x overhead-iterations) - (funcall overhead-function overhead-function))) -; (dotimes (x overhead-iterations) -; (stub-function nil)) - (let ((fiter (float overhead-iterations))) - (multiple-value-bind (calls nested-calls time cons) - (monitor-info-values 'stub-function) - (declare (ignore calls nested-calls)) - (setq *monitor-time-overhead* (/ time fiter) - *monitor-cons-overhead* (/ cons fiter)))) - (unmonitor stub-function)) -(set-monitor-overhead) - -;;; ******************************** -;;; Report Data ******************** -;;; ******************************** -(defvar *monitor-results* nil - "A table of monitoring statistics is stored here.") -(defvar *no-calls* nil - "A list of monitored functions which weren't called.") -(defvar *estimated-total-overhead* 0) -;; (proclaim '(type time-type *estimated-total-overhead*)) - -(defstruct (monitoring-info - (:conc-name m-info-) - (:constructor make-monitoring-info - (name calls time cons - percent-time percent-cons - time-per-call cons-per-call))) - name - calls - time - cons - percent-time - percent-cons - time-per-call - cons-per-call) - -(defun REPORT (&key (names :all) - (nested :exclusive) - (threshold 0.01) - (sort-key :percent-time) - (ignore-no-calls nil)) - "Same as REPORT-MONITORING but with a nicer keyword interface" - (declare (type (member :function :percent-time :time :percent-cons - :cons :calls :time-per-call :cons-per-call) - sort-key) - (type (member :inclusive :exclusive) nested)) - (report-monitoring names nested threshold sort-key ignore-no-calls)) - -(defun REPORT-MONITORING (&optional names - (nested :exclusive) - (threshold 0.01) - (key :percent-time) - ignore-no-calls) - "Report the current monitoring state. -The percentage of the total time spent executing unmonitored code -in each function (:exclusive mode), or total time (:inclusive mode) -will be printed together with the number of calls and -the unmonitored time per call. Functions that have been executed -below THRESHOLD % of the time will not be reported. To report on all -functions set NAMES to be either NIL or :ALL." - (when (or (null names) (eq names :all)) (setq names *monitored-functions*)) - - (let ((total-time 0) - (total-cons 0) - (total-calls 0)) - ;; Compute overall time and consing. - (dolist (name names) - (multiple-value-bind (calls nested-calls time cons) - (monitor-info-values name nested :warn) - (declare (ignore nested-calls)) - (incf total-calls calls) - (incf total-time time) - (incf total-cons cons))) - ;; Total overhead. - (setq *estimated-total-overhead* - (/ (* *monitor-time-overhead* total-calls) - time-units-per-second)) - ;; Assemble data for only the specified names (all monitored functions) - (if (zerop total-time) - (format *trace-output* "Not enough execution time to monitor.") - (progn - (setq *monitor-results* nil *no-calls* nil) - (dolist (name names) - (multiple-value-bind (calls nested-calls time cons) - (monitor-info-values name nested) - (declare (ignore nested-calls)) - (when (minusp time) (setq time 0.0)) - (when (minusp cons) (setq cons 0.0)) - (if (zerop calls) - (push (if (symbolp name) - (symbol-name name) - (format nil "~S" name)) - *no-calls*) - (push (make-monitoring-info - (format nil "~S" name) ; name - calls ; calls - (/ time (float time-units-per-second)) ; time in secs - (round cons) ; consing - (/ time (float total-time)) ; percent-time - (if (zerop total-cons) 0 - (/ cons (float total-cons))) ; percent-cons - (/ (/ time (float calls)) ; time-per-call - time-units-per-second) ; sec/call - (round (/ cons (float calls)))) ; cons-per-call - *monitor-results*)))) - (display-monitoring-results threshold key ignore-no-calls))))) - -(defun display-monitoring-results (&optional (threshold 0.01) - (key :percent-time) - (ignore-no-calls t)) - (let ((max-length 8) ; Function header size - (max-cons-length 8) - (total-time 0.0) - (total-consed 0) - (total-calls 0) - (total-percent-time 0) - (total-percent-cons 0)) - (sort-results key) - (dolist (result *monitor-results*) - (when (or (zerop threshold) - (> (m-info-percent-time result) threshold)) - (setq max-length - (max max-length - (length (m-info-name result)))) - (setq max-cons-length - (max max-cons-length - (m-info-cons-per-call result))))) - (incf max-length 2) - (setf max-cons-length (+ 2 (ceiling (log max-cons-length 10)))) - (format *trace-output* - "~%~%~ - ~VT ~VA~ - ~% ~VT % % ~VA ~ -Total Total~ - ~%Function~VT Time Cons Calls Sec/Call ~VA ~ -Time Cons~ - ~%~V,,,'-A" - max-length - max-cons-length "Cons" - max-length - max-cons-length "Per" - max-length - max-cons-length "Call" - (+ max-length 62 (max 0 (- max-cons-length 5))) "-") - (dolist (result *monitor-results*) - (when (or (zerop threshold) - (> (m-info-percent-time result) threshold)) - (format *trace-output* - "~%~A:~VT~6,2F ~6,2F ~7D ~,6F ~VD ~8,3F ~10D" - (m-info-name result) - max-length - (* 100 (m-info-percent-time result)) - (* 100 (m-info-percent-cons result)) - (m-info-calls result) - (m-info-time-per-call result) - max-cons-length - (m-info-cons-per-call result) - (m-info-time result) - (m-info-cons result)) - (incf total-time (m-info-time result)) - (incf total-consed (m-info-cons result)) - (incf total-calls (m-info-calls result)) - (incf total-percent-time (m-info-percent-time result)) - (incf total-percent-cons (m-info-percent-cons result)))) - (format *trace-output* - "~%~V,,,'-A~ - ~%TOTAL:~VT~6,2F ~6,2F ~7D ~9@T ~VA ~8,3F ~10D~ - ~%Estimated monitoring overhead: ~5,2F seconds~ - ~%Estimated total monitoring overhead: ~5,2F seconds" - (+ max-length 62 (max 0 (- max-cons-length 5))) "-" - max-length - (* 100 total-percent-time) - (* 100 total-percent-cons) - total-calls - max-cons-length " " - total-time total-consed - (/ (* *monitor-time-overhead* total-calls) - time-units-per-second) - *estimated-total-overhead*) - (when (and (not ignore-no-calls) *no-calls*) - (setq *no-calls* (sort *no-calls* #'string<)) - (let ((num-no-calls (length *no-calls*))) - (if (> num-no-calls 20) - (format *trace-output* - "~%~@(~r~) monitored functions were not called. ~ - ~%See the variable swank-monitor::*no-calls* for a list." - num-no-calls) - (format *trace-output* - "~%The following monitored functions were not called:~ - ~%~{~<~%~:; ~A~>~}~%" - *no-calls*)))) - (values))) - -(defun sort-results (&optional (key :percent-time)) - (setq *monitor-results* - (case key - (:function (sort *monitor-results* #'string> - :key #'m-info-name)) - ((:percent-time :time) (sort *monitor-results* #'> - :key #'m-info-time)) - ((:percent-cons :cons) (sort *monitor-results* #'> - :key #'m-info-cons)) - (:calls (sort *monitor-results* #'> - :key #'m-info-calls)) - (:time-per-call (sort *monitor-results* #'> - :key #'m-info-time-per-call)) - (:cons-per-call (sort *monitor-results* #'> - :key #'m-info-cons-per-call))))) - -;;; *END OF FILE* - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/nregex.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/nregex.lisp deleted file mode 100644 index 43586ef..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/nregex.lisp +++ /dev/null @@ -1,523 +0,0 @@ -;;; -;;; This code was written by: -;;; -;;; Lawrence E. Freil -;;; National Science Center Foundation -;;; Augusta, Georgia 30909 -;;; -;;; This program was released into the public domain on 2005-08-31. -;;; (See the slime-devel mailing list archive for details.) -;;; -;;; nregex.lisp - My 4/8/92 attempt at a Lisp based regular expression -;;; parser. -;;; -;;; This regular expression parser operates by taking a -;;; regular expression and breaking it down into a list -;;; consisting of lisp expressions and flags. The list -;;; of lisp expressions is then taken in turned into a -;;; lambda expression that can be later applied to a -;;; string argument for parsing. -;;;; -;;;; Modifications made 6 March 2001 By Chris Double (chris@double.co.nz) -;;;; to get working with Corman Lisp 1.42, add package statement and export -;;;; relevant functions. -;;;; - -(in-package :cl-user) - -;; Renamed to slime-nregex avoid name clashes with other versions of -;; this file. -- he - -;;;; CND - 6/3/2001 -(defpackage slime-nregex - (:use #:common-lisp) - (:export - #:regex - #:regex-compile - )) - -;;;; CND - 6/3/2001 -(in-package :slime-nregex) - -;;; -;;; First we create a copy of macros to help debug the beast -(eval-when (:compile-toplevel :load-toplevel :execute) -(defvar *regex-debug* nil) ; Set to nil for no debugging code -) - -(defmacro info (message &rest args) - (if *regex-debug* - `(format *standard-output* ,message ,@args))) - -;;; -;;; Declare the global variables for storing the paren index list. -;;; -(defvar *regex-groups* (make-array 10)) -(defvar *regex-groupings* 0) - -;;; -;;; Declare a simple interface for testing. You probably wouldn't want -;;; to use this interface unless you were just calling this once. -;;; -(defun regex (expression string) - "Usage: (regex &optional invert) - Returns either the quoted character or a simple bit vector of bits set for - the matching values" - (let ((first (char char-string 0)) - (result (char char-string 0)) - (used-length 1)) - (cond ((eql first #\n) - (setf result #\NewLine)) - ((eql first #\c) - (setf result #\Return)) - ((eql first #\t) - (setf result #\Tab)) - ((eql first #\d) - (setf result #*0000000000000000000000000000000000000000000000001111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)) - ((eql first #\D) - (setf result #*1111111111111111111111111111111111111111111111110000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111)) - ((eql first #\w) - (setf result #*0000000000000000000000000000000000000000000000001111111111000000011111111111111111111111111000010111111111111111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)) - ((eql first #\W) - (setf result #*1111111111111111111111111111111111111111111111110000000000111111100000000000000000000000000111101000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111)) - ((eql first #\b) - (setf result #*0000000001000000000000000000000011000000000010100000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)) - ((eql first #\B) - (setf result #*1111111110111111111111111111111100111111111101011111111111011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111)) - ((eql first #\s) - (setf result #*0000000001100000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)) - ((eql first #\S) - (setf result #*1111111110011111111111111111111101111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111)) - ((and (>= (char-code first) (char-code #\0)) - (<= (char-code first) (char-code #\9))) - (if (and (> (length char-string) 2) - (and (>= (char-code (char char-string 1)) (char-code #\0)) - (<= (char-code (char char-string 1)) (char-code #\9)) - (>= (char-code (char char-string 2)) (char-code #\0)) - (<= (char-code (char char-string 2)) (char-code #\9)))) - ;; - ;; It is a single character specified in octal - ;; - (progn - (setf result (do ((x 0 (1+ x)) - (return 0)) - ((= x 2) return) - (setf return (+ (* return 8) - (- (char-code (char char-string x)) - (char-code #\0)))))) - (setf used-length 3)) - ;; - ;; We have a group number replacement. - ;; - (let ((group (- (char-code first) (char-code #\0)))) - (setf result `((let ((nstring (subseq string (car (aref *regex-groups* ,group)) - (cadr (aref *regex-groups* ,group))))) - (if (< length (+ index (length nstring))) - (return-from compare nil)) - (if (not (string= string nstring - :start1 index - :end1 (+ index (length nstring)))) - (return-from compare nil) - (incf index (length nstring))))))))) - (t - (setf result first))) - (if (and (vectorp result) invert) - (bit-xor result #*1111111110011111111111111111111101111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 t)) - (values result used-length))) - -;;; -;;; Now for the main regex compiler routine. -;;; -(defun regex-compile (source &key (anchored nil)) - "Usage: (regex-compile [ :anchored (t/nil) ]) - This function take a regular expression (supplied as source) and - compiles this into a lambda list that a string argument can then - be applied to. It is also possible to compile this lambda list - for better performance or to save it as a named function for later - use" - (info "Now entering regex-compile with \"~A\"~%" source) - ;; - ;; This routine works in two parts. - ;; The first pass take the regular expression and produces a list of - ;; operators and lisp expressions for the entire regular expression. - ;; The second pass takes this list and produces the lambda expression. - (let ((expression '()) ; holder for expressions - (group 1) ; Current group index - (group-stack nil) ; Stack of current group endings - (result nil) ; holder for built expression. - (fast-first nil)) ; holder for quick unanchored scan - ;; - ;; If the expression was an empty string then it alway - ;; matches (so lets leave early) - ;; - (if (= (length source) 0) - (return-from regex-compile - '(lambda (&rest args) - (declare (ignore args)) - t))) - ;; - ;; If the first character is a caret then set the anchored - ;; flags and remove if from the expression string. - ;; - (cond ((eql (char source 0) #\^) - (setf source (subseq source 1)) - (setf anchored t))) - ;; - ;; If the first sequence is .* then also set the anchored flags. - ;; (This is purely for optimization, it will work without this). - ;; - (if (>= (length source) 2) - (if (string= source ".*" :start1 0 :end1 2) - (setf anchored t))) - ;; - ;; Also, If this is not an anchored search and the first character is - ;; a literal, then do a quick scan to see if it is even in the string. - ;; If not then we can issue a quick nil, - ;; otherwise we can start the search at the matching character to skip - ;; the checks of the non-matching characters anyway. - ;; - ;; If I really wanted to speed up this section of code it would be - ;; easy to recognize the case of a fairly long multi-character literal - ;; and generate a Boyer-Moore search for the entire literal. - ;; - ;; I generate the code to do a loop because on CMU Lisp this is about - ;; twice as fast a calling position. - ;; - (if (and (not anchored) - (not (position (char source 0) *regex-special-chars*)) - (not (and (> (length source) 1) - (position (char source 1) *regex-special-chars*)))) - (setf fast-first `((if (not (dotimes (i length nil) - (if (eql (char string i) - ,(char source 0)) - (return (setf start i))))) - (return-from final-return nil))))) - ;; - ;; Generate the very first expression to save the starting index - ;; so that group 0 will be the entire string matched always - ;; - (add-exp '((setf (aref *regex-groups* 0) - (list index nil)))) - ;; - ;; Loop over each character in the regular expression building the - ;; expression list as we go. - ;; - (do ((eindex 0 (1+ eindex))) - ((= eindex (length source))) - (let ((current (char source eindex))) - (info "Now processing character ~A index = ~A~%" current eindex) - (case current - ((#\.) - ;; - ;; Generate code for a single wild character - ;; - (add-exp '((if (>= index length) - (return-from compare nil) - (incf index))))) - ((#\$) - ;; - ;; If this is the last character of the expression then - ;; anchor the end of the expression, otherwise let it slide - ;; as a standard character (even though it should be quoted). - ;; - (if (= eindex (1- (length source))) - (add-exp '((if (not (= index length)) - (return-from compare nil)))) - (add-exp '((if (not (and (< index length) - (eql (char string index) #\$))) - (return-from compare nil) - (incf index)))))) - ((#\*) - (add-exp '(ASTRISK))) - - ((#\+) - (add-exp '(PLUS))) - - ((#\?) - (add-exp '(QUESTION))) - - ((#\() - ;; - ;; Start a grouping. - ;; - (incf group) - (push group group-stack) - (add-exp `((setf (aref *regex-groups* ,(1- group)) - (list index nil)))) - (add-exp `(,group))) - ((#\)) - ;; - ;; End a grouping - ;; - (let ((group (pop group-stack))) - (add-exp `((setf (cadr (aref *regex-groups* ,(1- group))) - index))) - (add-exp `(,(- group))))) - ((#\[) - ;; - ;; Start of a range operation. - ;; Generate a bit-vector that has one bit per possible character - ;; and then on each character or range, set the possible bits. - ;; - ;; If the first character is carat then invert the set. - (let* ((invert (eql (char source (1+ eindex)) #\^)) - (bitstring (make-array 256 :element-type 'bit - :initial-element - (if invert 1 0))) - (set-char (if invert 0 1))) - (if invert (incf eindex)) - (do ((x (1+ eindex) (1+ x))) - ((eql (char source x) #\]) (setf eindex x)) - (info "Building range with character ~A~%" (char source x)) - (cond ((and (eql (char source (1+ x)) #\-) - (not (eql (char source (+ x 2)) #\]))) - (if (>= (char-code (char source x)) - (char-code (char source (+ 2 x)))) - (error "Invalid range \"~A-~A\". Ranges must be in acending order" - (char source x) (char source (+ 2 x)))) - (do ((j (char-code (char source x)) (1+ j))) - ((> j (char-code (char source (+ 2 x)))) - (incf x 2)) - (info "Setting bit for char ~A code ~A~%" (code-char j) j) - (setf (sbit bitstring j) set-char))) - (t - (cond ((not (eql (char source x) #\])) - (let ((char (char source x))) - ;; - ;; If the character is quoted then find out what - ;; it should have been - ;; - (if (eql (char source x) #\\ ) - (let ((length)) - (multiple-value-setq (char length) - (regex-quoted (subseq source x) invert)) - (incf x length))) - (info "Setting bit for char ~A code ~A~%" char (char-code char)) - (if (not (vectorp char)) - (setf (sbit bitstring (char-code (char source x))) set-char) - (bit-ior bitstring char t)))))))) - (add-exp `((let ((range ,bitstring)) - (if (>= index length) - (return-from compare nil)) - (if (= 1 (sbit range (char-code (char string index)))) - (incf index) - (return-from compare nil))))))) - ((#\\ ) - ;; - ;; Intreprete the next character as a special, range, octal, group or - ;; just the character itself. - ;; - (let ((length) - (value)) - (multiple-value-setq (value length) - (regex-quoted (subseq source (1+ eindex)) nil)) - (cond ((listp value) - (add-exp value)) - ((characterp value) - (add-exp `((if (not (and (< index length) - (eql (char string index) - ,value))) - (return-from compare nil) - (incf index))))) - ((vectorp value) - (add-exp `((let ((range ,value)) - (if (>= index length) - (return-from compare nil)) - (if (= 1 (sbit range (char-code (char string index)))) - (incf index) - (return-from compare nil))))))) - (incf eindex length))) - (t - ;; - ;; We have a literal character. - ;; Scan to see how many we have and if it is more than one - ;; generate a string= verses as single eql. - ;; - (let* ((lit "") - (term (dotimes (litindex (- (length source) eindex) nil) - (let ((litchar (char source (+ eindex litindex)))) - (if (position litchar *regex-special-chars*) - (return litchar) - (progn - (info "Now adding ~A index ~A to lit~%" litchar - litindex) - (setf lit (concatenate 'string lit - (string litchar))))))))) - (if (= (length lit) 1) - (add-exp `((if (not (and (< index length) - (eql (char string index) ,current))) - (return-from compare nil) - (incf index)))) - ;; - ;; If we have a multi-character literal then we must - ;; check to see if the next character (if there is one) - ;; is an astrisk or a plus or a question mark. If so then we must not use this - ;; character in the big literal. - (progn - (if (or (eql term #\*) - (eql term #\+) - (eql term #\?)) - (setf lit (subseq lit 0 (1- (length lit))))) - (add-exp `((if (< length (+ index ,(length lit))) - (return-from compare nil)) - (if (not (string= string ,lit :start1 index - :end1 (+ index ,(length lit)))) - (return-from compare nil) - (incf index ,(length lit))))))) - (incf eindex (1- (length lit)))))))) - ;; - ;; Plug end of list to return t. If we made it this far then - ;; We have matched! - (add-exp '((setf (cadr (aref *regex-groups* 0)) - index))) - (add-exp '((return-from final-return t))) - ;; -;;; (print expression) - ;; - ;; Now take the expression list and turn it into a lambda expression - ;; replacing the special flags with lisp code. - ;; For example: A BEGIN needs to be replace by an expression that - ;; saves the current index, then evaluates everything till it gets to - ;; the END then save the new index if it didn't fail. - ;; On an ASTRISK I need to take the previous expression and wrap - ;; it in a do that will evaluate the expression till an error - ;; occurs and then another do that encompases the remainder of the - ;; regular expression and iterates decrementing the index by one - ;; of the matched expression sizes and then returns nil. After - ;; the last expression insert a form that does a return t so that - ;; if the entire nested sub-expression succeeds then the loop - ;; is broken manually. - ;; - (setf result (copy-tree nil)) - ;; - ;; Reversing the current expression makes building up the - ;; lambda list easier due to the nexting of expressions when - ;; and astrisk has been encountered. - (setf expression (reverse expression)) - (do ((elt 0 (1+ elt))) - ((>= elt (length expression))) - (let ((piece (nth elt expression))) - ;; - ;; Now check for PLUS, if so then ditto the expression and then let the - ;; ASTRISK below handle the rest. - ;; - (cond ((eql piece 'PLUS) - (cond ((listp (nth (1+ elt) expression)) - (setf result (append (list (nth (1+ elt) expression)) - result))) - ;; - ;; duplicate the entire group - ;; NOTE: This hasn't been implemented yet!! - (t - (error "GROUP repeat hasn't been implemented yet~%"))))) - (cond ((listp piece) ;Just append the list - (setf result (append (list piece) result))) - ((eql piece 'QUESTION) ; Wrap it in a block that won't fail - (cond ((listp (nth (1+ elt) expression)) - (setf result - (append `((progn (block compare - ,(nth (1+ elt) - expression)) - t)) - result)) - (incf elt)) - ;; - ;; This is a QUESTION on an entire group which - ;; hasn't been implemented yet!!! - ;; - (t - (error "Optional groups not implemented yet~%")))) - ((or (eql piece 'ASTRISK) ; Do the wild thing! - (eql piece 'PLUS)) - (cond ((listp (nth (1+ elt) expression)) - ;; - ;; This is a single character wild card so - ;; do the simple form. - ;; - (setf result - `((let ((oindex index)) - (block compare - (do () - (nil) - ,(nth (1+ elt) expression))) - (do ((start index (1- start))) - ((< start oindex) nil) - (let ((index start)) - (block compare - ,@result)))))) - (incf elt)) - (t - ;; - ;; This is a subgroup repeated so I must build - ;; the loop using several values. - ;; - )) - ) - (t t)))) ; Just ignore everything else. - ;; - ;; Now wrap the result in a lambda list that can then be - ;; invoked or compiled, however the user wishes. - ;; - (if anchored - (setf result - `(lambda (string &key (start 0) (end (length string))) - (setf *regex-groupings* ,group) - (block final-return - (block compare - (let ((index start) - (length end)) - ,@result))))) - (setf result - `(lambda (string &key (start 0) (end (length string))) - (setf *regex-groupings* ,group) - (block final-return - (let ((length end)) - ,@fast-first - (do ((marker start (1+ marker))) - ((> marker end) nil) - (let ((index marker)) - (if (block compare - ,@result) - (return t))))))))))) - -;; (provide 'nregex) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/packages.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/packages.lisp deleted file mode 100644 index b4b159f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/packages.lisp +++ /dev/null @@ -1,202 +0,0 @@ -(defpackage swank/backend - (:use cl) - (:nicknames swank-backend) - (:export *debug-swank-backend* - *log-output* - sldb-condition - compiler-condition - original-condition - message - source-context - condition - severity - with-compilation-hooks - make-location - location - location-p - location-buffer - location-position - location-hints - position-p - position-pos - print-output-to-string - quit-lisp - references - unbound-slot-filler - declaration-arglist - type-specifier-arglist - with-struct - when-let - defimplementation - converting-errors-to-error-location - make-error-location - deinit-log-output - ;; interrupt macro for the backend - *pending-slime-interrupts* - check-slime-interrupts - *interrupt-queued-handler* - ;; inspector related symbols - emacs-inspect - label-value-line - label-value-line* - boolean-to-feature-expression - with-symbol - choose-symbol - ;; package helper for backend - import-to-swank-mop - import-swank-mop-symbols - ;; - default-directory - set-default-directory - frame-source-location - restart-frame - gdb-initial-commands - sldb-break-on-return - buffer-first-change - - profiled-functions - unprofile-all - profile-report - profile-reset - profile-package - - with-collected-macro-forms - auto-flush-loop - *auto-flush-interval*)) - -(defpackage swank/rpc - (:use :cl) - (:export - read-message - read-packet - swank-reader-error - swank-reader-error.packet - swank-reader-error.cause - write-message)) - -(defpackage swank/match - (:use cl) - (:export match)) - -;; FIXME: rename to sawnk/mop -(defpackage swank-mop - (:use) - (:export - ;; classes - standard-generic-function - standard-slot-definition - standard-method - standard-class - eql-specializer - eql-specializer-object - ;; standard-class readers - class-default-initargs - class-direct-default-initargs - class-direct-slots - class-direct-subclasses - class-direct-superclasses - class-finalized-p - class-name - class-precedence-list - class-prototype - class-slots - specializer-direct-methods - ;; generic function readers - generic-function-argument-precedence-order - generic-function-declarations - generic-function-lambda-list - generic-function-methods - generic-function-method-class - generic-function-method-combination - generic-function-name - ;; method readers - method-generic-function - method-function - method-lambda-list - method-specializers - method-qualifiers - ;; slot readers - slot-definition-allocation - slot-definition-documentation - slot-definition-initargs - slot-definition-initform - slot-definition-initfunction - slot-definition-name - slot-definition-type - slot-definition-readers - slot-definition-writers - slot-boundp-using-class - slot-value-using-class - slot-makunbound-using-class - ;; generic function protocol - compute-applicable-methods-using-classes - finalize-inheritance)) - -(defpackage swank - (:use cl swank/backend swank/match swank/rpc) - (:export #:startup-multiprocessing - #:start-server - #:create-server - #:stop-server - #:restart-server - #:ed-in-emacs - #:inspect-in-emacs - #:print-indentation-lossage - #:invoke-slime-debugger - #:swank-debugger-hook - #:emacs-inspect - ;;#:inspect-slot-for-emacs - ;; These are user-configurable variables: - #:*communication-style* - #:*dont-close* - #:*fasl-pathname-function* - #:*log-events* - #:*use-dedicated-output-stream* - #:*dedicated-output-stream-port* - #:*configure-emacs-indentation* - #:*readtable-alist* - #:*globally-redirect-io* - #:*global-debugger* - #:*sldb-quit-restart* - #:*backtrace-printer-bindings* - #:*default-worker-thread-bindings* - #:*macroexpand-printer-bindings* - #:*swank-pprint-bindings* - #:*record-repl-results* - #:*inspector-verbose* - ;; This is SETFable. - #:debug-on-swank-error - ;; These are re-exported directly from the backend: - #:buffer-first-change - #:frame-source-location - #:gdb-initial-commands - #:restart-frame - #:sldb-step - #:sldb-break - #:sldb-break-on-return - #:profiled-functions - #:profile-report - #:profile-reset - #:unprofile-all - #:profile-package - #:default-directory - #:set-default-directory - #:quit-lisp - #:eval-for-emacs - #:eval-in-emacs - #:ed-rpc - #:ed-rpc-no-wait - #:y-or-n-p-in-emacs - #:*find-definitions-right-trim* - #:*find-definitions-left-trim* - #:*after-toggle-trace-hook* - #:unreadable-result - #:unreadable-result-p - #:unreadable-result-string - #:parse-string - #:from-string - #:to-string - #:*swank-debugger-condition* - #:run-hook-with-args-until-success - #:make-output-function-for-target - #:make-output-stream-for-target)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/sbcl-pprint-patch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/sbcl-pprint-patch.lisp deleted file mode 100644 index dfdc0bb..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/sbcl-pprint-patch.lisp +++ /dev/null @@ -1,332 +0,0 @@ -;; Pretty printer patch for SBCL, which adds the "annotations" feature -;; required for sending presentations through pretty-printing streams. -;; -;; The section marked "Changed functions" and the DEFSTRUCT -;; PRETTY-STREAM are based on SBCL's pprint.lisp. -;; -;; Public domain. - -(in-package "SB!PRETTY") - -(defstruct (annotation (:include queued-op)) - (handler (constantly nil) :type function) - (record)) - - -(defstruct (pretty-stream (:include sb!kernel:ansi-stream - (out #'pretty-out) - (sout #'pretty-sout) - (misc #'pretty-misc)) - (:constructor make-pretty-stream (target)) - (:copier nil)) - ;; Where the output is going to finally go. - (target (missing-arg) :type stream) - ;; Line length we should format to. Cached here so we don't have to keep - ;; extracting it from the target stream. - (line-length (or *print-right-margin* - (sb!impl::line-length target) - default-line-length) - :type column) - ;; A simple string holding all the text that has been output but not yet - ;; printed. - (buffer (make-string initial-buffer-size) :type (simple-array character (*))) - ;; The index into BUFFER where more text should be put. - (buffer-fill-pointer 0 :type index) - ;; Whenever we output stuff from the buffer, we shift the remaining noise - ;; over. This makes it difficult to keep references to locations in - ;; the buffer. Therefore, we have to keep track of the total amount of - ;; stuff that has been shifted out of the buffer. - (buffer-offset 0 :type posn) - ;; The column the first character in the buffer will appear in. Normally - ;; zero, but if we end up with a very long line with no breaks in it we - ;; might have to output part of it. Then this will no longer be zero. - (buffer-start-column (or (sb!impl::charpos target) 0) :type column) - ;; The line number we are currently on. Used for *PRINT-LINES* - ;; abbreviations and to tell when sections have been split across - ;; multiple lines. - (line-number 0 :type index) - ;; the value of *PRINT-LINES* captured at object creation time. We - ;; use this, instead of the dynamic *PRINT-LINES*, to avoid - ;; weirdness like - ;; (let ((*print-lines* 50)) - ;; (pprint-logical-block .. - ;; (dotimes (i 10) - ;; (let ((*print-lines* 8)) - ;; (print (aref possiblybigthings i) prettystream))))) - ;; terminating the output of the entire logical blockafter 8 lines. - (print-lines *print-lines* :type (or index null) :read-only t) - ;; Stack of logical blocks in effect at the buffer start. - (blocks (list (make-logical-block)) :type list) - ;; Buffer holding the per-line prefix active at the buffer start. - ;; Indentation is included in this. The length of this is stored - ;; in the logical block stack. - (prefix (make-string initial-buffer-size) :type (simple-array character (*))) - ;; Buffer holding the total remaining suffix active at the buffer start. - ;; The characters are right-justified in the buffer to make it easier - ;; to output the buffer. The length is stored in the logical block - ;; stack. - (suffix (make-string initial-buffer-size) :type (simple-array character (*))) - ;; Queue of pending operations. When empty, HEAD=TAIL=NIL. Otherwise, - ;; TAIL holds the first (oldest) cons and HEAD holds the last (newest) - ;; cons. Adding things to the queue is basically (setf (cdr head) (list - ;; new)) and removing them is basically (pop tail) [except that care must - ;; be taken to handle the empty queue case correctly.] - (queue-tail nil :type list) - (queue-head nil :type list) - ;; Block-start queue entries in effect at the queue head. - (pending-blocks nil :type list) - ;; Queue of annotations to the buffer - (annotations-tail nil :type list) - (annotations-head nil :type list)) - - -(defmacro enqueue (stream type &rest args) - (let ((constructor (intern (concatenate 'string - "MAKE-" - (symbol-name type)) - "SB-PRETTY"))) - (once-only ((stream stream) - (entry `(,constructor :posn - (index-posn - (pretty-stream-buffer-fill-pointer - ,stream) - ,stream) - ,@args)) - (op `(list ,entry)) - (head `(pretty-stream-queue-head ,stream))) - `(progn - (if ,head - (setf (cdr ,head) ,op) - (setf (pretty-stream-queue-tail ,stream) ,op)) - (setf (pretty-stream-queue-head ,stream) ,op) - ,entry)))) - -;;; -;;; New helper functions -;;; - -(defun enqueue-annotation (stream handler record) - (enqueue stream annotation :handler handler - :record record)) - -(defun re-enqueue-annotation (stream annotation) - (let* ((annotation-cons (list annotation)) - (head (pretty-stream-annotations-head stream))) - (if head - (setf (cdr head) annotation-cons) - (setf (pretty-stream-annotations-tail stream) annotation-cons)) - (setf (pretty-stream-annotations-head stream) annotation-cons) - nil)) - -(defun re-enqueue-annotations (stream end) - (loop for tail = (pretty-stream-queue-tail stream) then (cdr tail) - while (and tail (not (eql (car tail) end))) - when (annotation-p (car tail)) - do (re-enqueue-annotation stream (car tail)))) - -(defun dequeue-annotation (stream &key end-posn) - (let ((next-annotation (car (pretty-stream-annotations-tail stream)))) - (when next-annotation - (when (or (not end-posn) - (<= (annotation-posn next-annotation) end-posn)) - (pop (pretty-stream-annotations-tail stream)) - (unless (pretty-stream-annotations-tail stream) - (setf (pretty-stream-annotations-head stream) nil)) - next-annotation)))) - -(defun invoke-annotation (stream annotation truncatep) - (let ((target (pretty-stream-target stream))) - (funcall (annotation-handler annotation) - (annotation-record annotation) - target - truncatep))) - -(defun output-buffer-with-annotations (stream end) - (let ((target (pretty-stream-target stream)) - (buffer (pretty-stream-buffer stream)) - (end-posn (index-posn end stream)) - (start 0)) - (loop - for annotation = (dequeue-annotation stream :end-posn end-posn) - while annotation - do - (let ((annotation-index (posn-index (annotation-posn annotation) - stream))) - (when (> annotation-index start) - (write-string buffer target :start start - :end annotation-index) - (setf start annotation-index)) - (invoke-annotation stream annotation nil))) - (when (> end start) - (write-string buffer target :start start :end end)))) - -(defun flush-annotations (stream end truncatep) - (let ((end-posn (index-posn end stream))) - (loop - for annotation = (dequeue-annotation stream :end-posn end-posn) - while annotation - do (invoke-annotation stream annotation truncatep)))) - -;;; -;;; Changed functions -;;; - -(defun maybe-output (stream force-newlines-p) - (declare (type pretty-stream stream)) - (let ((tail (pretty-stream-queue-tail stream)) - (output-anything nil)) - (loop - (unless tail - (setf (pretty-stream-queue-head stream) nil) - (return)) - (let ((next (pop tail))) - (etypecase next - (newline - (when (ecase (newline-kind next) - ((:literal :mandatory :linear) t) - (:miser (misering-p stream)) - (:fill - (or (misering-p stream) - (> (pretty-stream-line-number stream) - (logical-block-section-start-line - (first (pretty-stream-blocks stream)))) - (ecase (fits-on-line-p stream - (newline-section-end next) - force-newlines-p) - ((t) nil) - ((nil) t) - (:dont-know - (return)))))) - (setf output-anything t) - (output-line stream next))) - (indentation - (unless (misering-p stream) - (set-indentation stream - (+ (ecase (indentation-kind next) - (:block - (logical-block-start-column - (car (pretty-stream-blocks stream)))) - (:current - (posn-column - (indentation-posn next) - stream))) - (indentation-amount next))))) - (block-start - (ecase (fits-on-line-p stream (block-start-section-end next) - force-newlines-p) - ((t) - ;; Just nuke the whole logical block and make it look like one - ;; nice long literal. (But don't nuke annotations.) - (let ((end (block-start-block-end next))) - (expand-tabs stream end) - (re-enqueue-annotations stream end) - (setf tail (cdr (member end tail))))) - ((nil) - (really-start-logical-block - stream - (posn-column (block-start-posn next) stream) - (block-start-prefix next) - (block-start-suffix next))) - (:dont-know - (return)))) - (block-end - (really-end-logical-block stream)) - (tab - (expand-tabs stream next)) - (annotation - (re-enqueue-annotation stream next)))) - (setf (pretty-stream-queue-tail stream) tail)) - output-anything)) - -(defun output-line (stream until) - (declare (type pretty-stream stream) - (type newline until)) - (let* ((target (pretty-stream-target stream)) - (buffer (pretty-stream-buffer stream)) - (kind (newline-kind until)) - (literal-p (eq kind :literal)) - (amount-to-consume (posn-index (newline-posn until) stream)) - (amount-to-print - (if literal-p - amount-to-consume - (let ((last-non-blank - (position #\space buffer :end amount-to-consume - :from-end t :test #'char/=))) - (if last-non-blank - (1+ last-non-blank) - 0))))) - (output-buffer-with-annotations stream amount-to-print) - (flush-annotations stream amount-to-consume nil) - (let ((line-number (pretty-stream-line-number stream))) - (incf line-number) - (when (and (not *print-readably*) - (pretty-stream-print-lines stream) - (>= line-number (pretty-stream-print-lines stream))) - (write-string " .." target) - (flush-annotations stream - (pretty-stream-buffer-fill-pointer stream) - t) - (let ((suffix-length (logical-block-suffix-length - (car (pretty-stream-blocks stream))))) - (unless (zerop suffix-length) - (let* ((suffix (pretty-stream-suffix stream)) - (len (length suffix))) - (write-string suffix target - :start (- len suffix-length) - :end len)))) - (throw 'line-limit-abbreviation-happened t)) - (setf (pretty-stream-line-number stream) line-number) - (write-char #\newline target) - (setf (pretty-stream-buffer-start-column stream) 0) - (let* ((fill-ptr (pretty-stream-buffer-fill-pointer stream)) - (block (first (pretty-stream-blocks stream))) - (prefix-len - (if literal-p - (logical-block-per-line-prefix-end block) - (logical-block-prefix-length block))) - (shift (- amount-to-consume prefix-len)) - (new-fill-ptr (- fill-ptr shift)) - (new-buffer buffer) - (buffer-length (length buffer))) - (when (> new-fill-ptr buffer-length) - (setf new-buffer - (make-string (max (* buffer-length 2) - (+ buffer-length - (floor (* (- new-fill-ptr buffer-length) - 5) - 4))))) - (setf (pretty-stream-buffer stream) new-buffer)) - (replace new-buffer buffer - :start1 prefix-len :start2 amount-to-consume :end2 fill-ptr) - (replace new-buffer (pretty-stream-prefix stream) - :end1 prefix-len) - (setf (pretty-stream-buffer-fill-pointer stream) new-fill-ptr) - (incf (pretty-stream-buffer-offset stream) shift) - (unless literal-p - (setf (logical-block-section-column block) prefix-len) - (setf (logical-block-section-start-line block) line-number)))))) - -(defun output-partial-line (stream) - (let* ((fill-ptr (pretty-stream-buffer-fill-pointer stream)) - (tail (pretty-stream-queue-tail stream)) - (count - (if tail - (posn-index (queued-op-posn (car tail)) stream) - fill-ptr)) - (new-fill-ptr (- fill-ptr count)) - (buffer (pretty-stream-buffer stream))) - (when (zerop count) - (error "Output-partial-line called when nothing can be output.")) - (output-buffer-with-annotations stream count) - (incf (pretty-stream-buffer-start-column stream) count) - (replace buffer buffer :end1 new-fill-ptr :start2 count :end2 fill-ptr) - (setf (pretty-stream-buffer-fill-pointer stream) new-fill-ptr) - (incf (pretty-stream-buffer-offset stream) count))) - -(defun force-pretty-output (stream) - (maybe-output stream nil) - (expand-tabs stream nil) - (re-enqueue-annotations stream nil) - (output-buffer-with-annotations stream - (pretty-stream-buffer-fill-pointer stream))) - \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/slime-autoloads.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/slime-autoloads.el deleted file mode 100644 index 0666f37..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/slime-autoloads.el +++ /dev/null @@ -1,51 +0,0 @@ -;;; slime-autoloads.el --- autoload definitions for SLIME -*- no-byte-compile: t -*- - -;; Copyright (C) 2007 Helmut Eller - -;; This file is protected by the GNU GPLv2 (or later), as distributed -;; with GNU Emacs. - -;;; Commentary: - -;; This code defines the necessary autoloads, so that we don't need to -;; load everything from .emacs. -;; -;; JT@14/01/09: FIXME: This file should be auto-generated with autoload cookies. - -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - -(autoload 'slime "slime" - "Start a Lisp subprocess and connect to its Swank server." t) - -(autoload 'slime-mode "slime" - "SLIME: The Superior Lisp Interaction (Minor) Mode for Emacs." t) - -(autoload 'slime-connect "slime" - "Connect to a running Swank server." t) - -(autoload 'slime-selector "slime" - "Select a new by type, indicated by a single character." t) - -(autoload 'hyperspec-lookup "lib/hyperspec" nil t) - -(autoload 'slime-lisp-mode-hook "slime") - -(autoload 'slime-scheme-mode-hook "slime") - -(defvar slime-contribs nil - "A list of contrib packages to load with SLIME.") - -(autoload 'slime-setup "slime" - "Setup some SLIME contribs.") - -(define-obsolete-variable-alias 'slime-setup-contribs - 'slime-contribs "2.3.2") - -(add-hook 'lisp-mode-hook 'slime-lisp-mode-hook) - -(provide 'slime-autoloads) - -;;; slime-autoloads.el ends here diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/slime-tests.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/slime-tests.el deleted file mode 100644 index 87f81f1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/slime-tests.el +++ /dev/null @@ -1,1459 +0,0 @@ -;;; slime-tests.el --- Automated tests for slime.el -;; -;;;; License -;; Copyright (C) 2003 Eric Marsden, Luke Gorrie, Helmut Eller -;; Copyright (C) 2004,2005,2006 Luke Gorrie, Helmut Eller -;; Copyright (C) 2007,2008,2009 Helmut Eller, Tobias C. Rittweiler -;; Copyright (C) 2013 -;; -;; For a detailed list of contributors, see the manual. -;; -;; 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. - - -;;;; Tests -(require 'slime) -(require 'ert nil t) -(require 'ert "lib/ert" t) ;; look for bundled version for Emacs 23 -(require 'cl-lib) -(require 'bytecomp) ; byte-compile-current-file -(eval-when-compile - (require 'cl)) ; lexical-let - -(defun slime-shuffle-list (list) - (let* ((len (length list)) - (taken (make-vector len nil)) - (result (make-vector len nil))) - (dolist (e list) - (while (let ((i (random len))) - (cond ((aref taken i)) - (t (aset taken i t) - (aset result i e) - nil))))) - (append result '()))) - -(defun slime-batch-test (&optional test-name randomize) - "Run the test suite in batch-mode. -Exits Emacs when finished. The exit code is the number of failed tests." - (interactive) - (let ((ert-debug-on-error nil) - (timeout 30) - (slime-background-message-function #'ignore)) - (slime) - ;; Block until we are up and running. - (lexical-let (timed-out) - (run-with-timer timeout nil - (lambda () (setq timed-out t))) - (while (not (slime-connected-p)) - (sit-for 1) - (when timed-out - (when noninteractive - (kill-emacs 252))))) - (slime-sync-to-top-level 5) - (let* ((selector (if randomize - `(member ,@(slime-shuffle-list - (ert-select-tests (or test-name t) t))) - (or test-name t))) - (ert-fun (if noninteractive - 'ert-run-tests-batch - 'ert))) - (let ((stats (funcall ert-fun selector))) - (if noninteractive - (kill-emacs (ert-stats-completed-unexpected stats))))))) - -(defun slime-skip-test (message) - ;; ERT for Emacs 23 and earlier doesn't have `ert-skip' - (if (fboundp 'ert-skip) - (ert-skip message) - (message (concat "SKIPPING: " message)) - (ert-pass))) - -(defun slime-tests--undefine-all () - (dolist (test (ert-select-tests t t)) - (let* ((sym (ert-test-name test))) - (cl-assert (eq (get sym 'ert--test) test)) - (cl-remprop sym 'ert--test)))) - -(slime-tests--undefine-all) - -(eval-and-compile - (defun slime-tests-auto-tags () - (append '(slime) - (let ((file-name (or load-file-name - byte-compile-current-file))) - (if (and file-name - (string-match "contrib/test/slime-\\(.*\\)\.elc?$" - file-name)) - (list 'contrib (intern (match-string 1 file-name))) - '(core))))) - - (defmacro define-slime-ert-test (name &rest args) - "Like `ert-deftest', but set tags automatically. -Also don't error if `ert.el' is missing." - (if (not (featurep 'ert)) - (warn "No ert.el found: not defining test %s" - name) - (let* ((docstring (and (stringp (second args)) - (second args))) - (args (if docstring - (cddr args) - (cdr args))) - (tags (slime-tests-auto-tags))) - `(ert-deftest ,name () ,(or docstring "No docstring for this test.") - :tags ',tags - ,@args)))) - - (defun slime-test-ert-test-for (name input i doc body fails-for style fname) - `(define-slime-ert-test - ,(intern (format "%s-%d" name i)) () - ,(format "For input %s, %s" (truncate-string-to-width - (format "%s" input) - 15 nil nil 'ellipsis) - (replace-regexp-in-string "^.??\\(\\w+\\)" - (lambda (s) (downcase s)) - doc - t)) - ,@(if fails-for - `(:expected-result '(satisfies - (lambda (result) - (ert-test-result-type-p - result - (if (member - (slime-lisp-implementation-name) - ',fails-for) - :failed - :passed)))))) - - ,@(when style - `((let ((style (slime-communication-style))) - (when (not (member style ',style)) - (slime-skip-test (format "test not applicable for style %s" - style)))))) - (apply #',fname ',input)))) - -(defmacro def-slime-test (name args doc inputs &rest body) - "Define a test case. -NAME ::= SYMBOL | (SYMBOL OPTION*) is a symbol naming the test. -OPTION ::= (:fails-for IMPLEMENTATION*) | (:style COMMUNICATION-STYLE*) -ARGS is a lambda-list. -DOC is a docstring. -INPUTS is a list of argument lists, each tested separately. -BODY is the test case. The body can use `slime-check' to test -conditions (assertions)." - (declare (debug (&define name sexp sexp sexp &rest def-form))) - (if (not (featurep 'ert)) - (warn "No ert.el found: not defining test %s" - name) - `(progn - ,@(cl-destructuring-bind (name &rest options) - (if (listp name) name (list name)) - (let ((fname (intern (format "slime-test-%s" name)))) - (cons `(defun ,fname ,args - (slime-sync-to-top-level 0.3) - ,@body - (slime-sync-to-top-level 0.3)) - (cl-loop for input in (eval inputs) - for i from 1 - with fails-for = (cdr (assoc :fails-for options)) - with style = (cdr (assoc :style options)) - collect (slime-test-ert-test-for name - input - i - doc - body - fails-for - style - fname)))))))) - -(put 'def-slime-test 'lisp-indent-function 4) - -(defmacro slime-check (check &rest body) - (declare (indent defun)) - `(unless (progn ,@body) - (ert-fail ,(cl-etypecase check - (cons `(concat "Ooops, " ,(cons 'format check))) - (string `(concat "Check failed: " ,check)) - (symbol `(concat "Check failed: " ,(symbol-name check))))))) - - -;;;;; Test case definitions -(defun slime-check-top-level () ;(&optional _test-name) - (accept-process-output nil 0.001) - (slime-check "At the top level (no debugging or pending RPCs)" - (slime-at-top-level-p))) - -(defun slime-at-top-level-p () - (and (not (sldb-get-default-buffer)) - (null (slime-rex-continuations)))) - -(defun slime-wait-condition (name predicate timeout) - (let ((end (time-add (current-time) (seconds-to-time timeout)))) - (while (not (funcall predicate)) - (let ((now (current-time))) - (message "waiting for condition: %s [%s.%06d]" name - (format-time-string "%H:%M:%S" now) (third now))) - (cond ((time-less-p end (current-time)) - (error "Timeout waiting for condition: %S" name)) - (t - ;; XXX if a process-filter enters a recursive-edit, we - ;; hang forever - (accept-process-output nil 0.1)))))) - -(defun slime-sync-to-top-level (timeout) - (slime-wait-condition "top-level" #'slime-at-top-level-p timeout)) - -;; XXX: unused function -(defun slime-check-sldb-level (expected) - (let ((sldb-level (let ((sldb (sldb-get-default-buffer))) - (if sldb - (with-current-buffer sldb - sldb-level))))) - (slime-check ("SLDB level (%S) is %S" expected sldb-level) - (equal expected sldb-level)))) - -(defun slime-test-expect (_name expected actual &optional test) - (when (stringp expected) (setq expected (substring-no-properties expected))) - (when (stringp actual) (setq actual (substring-no-properties actual))) - (if test - (should (funcall test expected actual)) - (should (equal expected actual)))) - -(defun sldb-level () - (let ((sldb (sldb-get-default-buffer))) - (if sldb - (with-current-buffer sldb - sldb-level)))) - -(defun slime-sldb-level= (level) - (equal level (sldb-level))) - -(eval-when-compile - (defvar slime-test-symbols - '(("foobar") ("foo@bar") ("@foobar") ("foobar@") ("\\@foobar") - ("|asdf||foo||bar|") - ("\\#") - ("\\(setf\\ car\\)")))) - -(defun slime-check-symbol-at-point (prefix symbol suffix) - ;; We test that `slime-symbol-at-point' works at every - ;; character of the symbol name. - (with-temp-buffer - (lisp-mode) - (insert prefix) - (let ((start (point))) - (insert symbol suffix) - (dotimes (i (length symbol)) - (goto-char (+ start i)) - (slime-test-expect (format "Check `%s' (at %d)..." - (buffer-string) (point)) - symbol - (slime-symbol-at-point) - #'equal))))) - - - -(def-slime-test symbol-at-point.2 (sym) - "fancy symbol-name _not_ at BOB/EOB" - slime-test-symbols - (slime-check-symbol-at-point "(foo " sym " bar)")) - -(def-slime-test symbol-at-point.3 (sym) - "fancy symbol-name with leading ," - (remove-if (lambda (s) (eq (aref (car s) 0) ?@)) slime-test-symbols) - (slime-check-symbol-at-point "," sym "")) - -(def-slime-test symbol-at-point.4 (sym) - "fancy symbol-name with leading ,@" - slime-test-symbols - (slime-check-symbol-at-point ",@" sym "")) - -(def-slime-test symbol-at-point.5 (sym) - "fancy symbol-name with leading `" - slime-test-symbols - (slime-check-symbol-at-point "`" sym "")) - -(def-slime-test symbol-at-point.6 (sym) - "fancy symbol-name wrapped in ()" - slime-test-symbols - (slime-check-symbol-at-point "(" sym ")")) - -(def-slime-test symbol-at-point.7 (sym) - "fancy symbol-name wrapped in #< {DEADBEEF}>" - slime-test-symbols - (slime-check-symbol-at-point "#<" sym " {DEADBEEF}>")) - -;;(def-slime-test symbol-at-point.8 (sym) -;; "fancy symbol-name wrapped in #<>" -;; slime-test-symbols -;; (slime-check-symbol-at-point "#<" sym ">")) - -(def-slime-test symbol-at-point.9 (sym) - "fancy symbol-name wrapped in #| ... |#" - slime-test-symbols - (slime-check-symbol-at-point "#|\n" sym "\n|#")) - -(def-slime-test symbol-at-point.10 (sym) - "fancy symbol-name after #| )))(( |# (1)" - slime-test-symbols - (slime-check-symbol-at-point "#| )))(( #|\n" sym "")) - -(def-slime-test symbol-at-point.11 (sym) - "fancy symbol-name after #| )))(( |# (2)" - slime-test-symbols - (slime-check-symbol-at-point "#| )))(( #|" sym "")) - -(def-slime-test symbol-at-point.12 (sym) - "fancy symbol-name wrapped in \"...\"" - slime-test-symbols - (slime-check-symbol-at-point "\"\n" sym "\"\n")) - -(def-slime-test symbol-at-point.13 (sym) - "fancy symbol-name wrapped in \" )))(( \" (1)" - slime-test-symbols - (slime-check-symbol-at-point "\" )))(( \"\n" sym "")) - -(def-slime-test symbol-at-point.14 (sym) - "fancy symbol-name wrapped in \" )))(( \" (1)" - slime-test-symbols - (slime-check-symbol-at-point "\" )))(( \"" sym "")) - -(def-slime-test symbol-at-point.15 (sym) - "symbol-at-point after #." - slime-test-symbols - (slime-check-symbol-at-point "#." sym "")) - -(def-slime-test symbol-at-point.16 (sym) - "symbol-at-point after #+" - slime-test-symbols - (slime-check-symbol-at-point "#+" sym "")) - - -(def-slime-test sexp-at-point.1 (string) - "symbol-at-point after #'" - '(("foo") - ("#:foo") - ("#'foo") - ("#'(lambda (x) x)") - ("()")) - (with-temp-buffer - (lisp-mode) - (insert string) - (goto-char (point-min)) - (slime-test-expect (format "Check sexp `%s' (at %d)..." - (buffer-string) (point)) - string - (slime-sexp-at-point) - #'equal))) - -(def-slime-test narrowing () - "Check that narrowing is properly sustained." - '() - (slime-check-top-level) - (let ((random-buffer-name (symbol-name (cl-gensym))) - (defun-pos) (tmpbuffer)) - (with-temp-buffer - (dotimes (i 100) (insert (format ";;; %d. line\n" i))) - (setq tmpbuffer (current-buffer)) - (setq defun-pos (point)) - (insert (concat "(defun __foo__ (x y)" "\n" - " 'nothing)" "\n")) - (dotimes (i 100) (insert (format ";;; %d. line\n" (+ 100 i)))) - (slime-check "Checking that newly created buffer is not narrowed." - (not (slime-buffer-narrowed-p))) - - (goto-char defun-pos) - (narrow-to-defun) - (slime-check "Checking that narrowing succeeded." - (slime-buffer-narrowed-p)) - - (slime-with-popup-buffer (random-buffer-name) - (slime-check ("Checking that we're in Slime's temp buffer `%s'" - random-buffer-name) - (equal (buffer-name (current-buffer)) random-buffer-name))) - (with-current-buffer random-buffer-name - ;; Notice that we cannot quit the buffer within the extent - ;; of slime-with-output-to-temp-buffer. - (quit-window t)) - (slime-check ("Checking that we've got back from `%s'" - random-buffer-name) - (and (eq (current-buffer) tmpbuffer) - (= (point) defun-pos))) - - (slime-check "Checking that narrowing sustained \ -after quitting Slime's temp buffer." - (slime-buffer-narrowed-p)) - - (let ((slime-buffer-package "SWANK") - (symbol '*buffer-package*)) - (slime-edit-definition (symbol-name symbol)) - (slime-check ("Checking that we've got M-. into swank.lisp. %S" symbol) - (string= (file-name-nondirectory (buffer-file-name)) - "swank.lisp")) - (slime-pop-find-definition-stack) - (slime-check ("Checking that we've got back.") - (and (eq (current-buffer) tmpbuffer) - (= (point) defun-pos))) - - (slime-check "Checking that narrowing sustained after M-," - (slime-buffer-narrowed-p))) - )) - (slime-check-top-level)) - -(defun slime-test--display-region-eval-arg (line window-height) - (cl-etypecase line - (number line) - (cons (slime-dcase line - ((+h line) - (+ (slime-test--display-region-eval-arg line window-height) - window-height)) - ((-h line) - (- (slime-test--display-region-eval-arg line window-height) - window-height)))))) - -(defun slime-test--display-region-line-to-position (line window-height) - (let ((line (slime-test--display-region-eval-arg line window-height))) - (save-excursion - (goto-char (point-min)) - (forward-line (1- line)) - (line-beginning-position)))) - -(def-slime-test display-region - (start end pos window-start expected-window-start expected-point) - "Test `slime-display-region'." - ;; numbers are actually lines numbers - '(;; region visible, point in region - (2 4 3 1 1 3) - ;; region visible, point visible but ouside region - (2 4 5 1 1 5) - ;; end not visible, point at start - (2 (+h 2) 2 1 2 2) - ;; start not visible, point at start - ((+h 2) (+h 500) (+h 2) 1 (+h 2) (+h 2)) - ;; start not visible, point after end - ((+h 2) (+h 500) (+h 6) 1 (+h 2) (+h 6)) - ;; end - start should be visible, point after end - ((+h 2) (+h 7) (+h 10) 1 (-h (+h 7)) (+h 6)) - ;; region is window-height + 1 and ends with newline - ((+h -2) (+h (+h -3)) (+h -2) 1 (+h -3) (+h -2)) - (2 (+h 1) 3 1 1 3) - (2 (+h 0) 3 1 1 3) - (2 (+h -1) 3 1 1 3) - ;; start and end are the beginning - (1 1 1 1 1 1) - ;; - (1 (+h 1) (+h 22) (+h 20) 1 (+h 0)) - ) - (when noninteractive - (slime-skip-test "Can't test slime-display-region in batch mode")) - (with-temp-buffer - (dotimes (i 1000) - (insert (format "%09d\n" i))) - (let* ((win (display-buffer (current-buffer) t)) - (wh (window-text-height win))) - (cl-macrolet ((l2p (l) - `(slime-test--display-region-line-to-position ,l wh))) - (select-window win) - (set-window-start win (l2p window-start)) - (redisplay) - (goto-char (l2p pos)) - (cl-assert (= (l2p window-start) (window-start win))) - (cl-assert (= (point) (l2p pos))) - (slime--display-region (l2p start) (l2p end)) - (redisplay) - (cl-assert (= (l2p expected-window-start) (window-start))) - (cl-assert (= (l2p expected-point) (point))) - )))) - -(def-slime-test find-definition - (name buffer-package snippet) - "Find the definition of a function or macro in swank.lisp." - '(("start-server" "SWANK" "(defun start-server ") - ("swank::start-server" "CL-USER" "(defun start-server ") - ("swank:start-server" "CL-USER" "(defun start-server ") - ("swank::connection" "CL-USER" "(defstruct (connection") - ("swank::*emacs-connection*" "CL-USER" "(defvar \\*emacs-connection\\*") - ) - (switch-to-buffer "*scratch*") ; not buffer of definition - (slime-check-top-level) - (let ((orig-buffer (current-buffer)) - (orig-pos (point)) - (enable-local-variables nil) ; don't get stuck on -*- eval: -*- - (slime-buffer-package buffer-package)) - (slime-edit-definition name) - ;; Postconditions - (slime-check ("Definition of `%S' is in swank.lisp." name) - (string= (file-name-nondirectory (buffer-file-name)) "swank.lisp")) - (slime-check ("Looking at '%s'." snippet) (looking-at snippet)) - (slime-pop-find-definition-stack) - (slime-check "Returning from definition restores original buffer/position." - (and (eq orig-buffer (current-buffer)) - (= orig-pos (point))))) - (slime-check-top-level)) - -(def-slime-test (find-definition.2 (:fails-for "allegro" "lispworks")) - (buffer-content buffer-package snippet) - "Check that we're able to find definitions even when -confronted with nasty #.-fu." - '(("#.(prog1 nil (defvar *foobar* 42)) - - (defun .foo. (x) - (+ x #.*foobar*)) - - #.(prog1 nil (makunbound '*foobar*)) - " - "SWANK" - "[ \t]*(defun .foo. " - ) - ("#.(prog1 nil (defvar *foobar* 42)) - - ;; some comment - (defun .foo. (x) - (+ x #.*foobar*)) - - #.(prog1 nil (makunbound '*foobar*)) - " - "SWANK" - "[ \t]*(defun .foo. " - ) - ("(in-package swank) - (eval-when (:compile-toplevel) (defparameter *bar* 456)) - (eval-when (:load-toplevel :execute) (makunbound '*bar*)) - (defun bar () #.*bar*) - (defun .foo. () 123)" - "SWANK" - "[ \t]*(defun .foo. () 123)")) - (let ((slime-buffer-package buffer-package)) - (with-temp-buffer - (insert buffer-content) - (slime-check-top-level) - (slime-eval - `(swank:compile-string-for-emacs - ,buffer-content - ,(buffer-name) - '((:position 0) (:line 1 1)) - ,nil - ,nil)) - (let ((bufname (buffer-name))) - (slime-edit-definition ".foo.") - (slime-check ("Definition of `.foo.' is in buffer `%s'." bufname) - (string= (buffer-name) bufname)) - (slime-check "Definition now at point." (looking-at snippet)))))) - -(def-slime-test (find-definition.3 - (:fails-for "abcl" "allegro" "clisp" "lispworks" "sbcl" - "ecl")) - (name source regexp) - "Extra tests for defstruct." - '(("swank::foo-struct" - "(progn - (defun foo-fun ()) - (defstruct (foo-struct (:constructor nil) (:predicate nil))) -)" - "(defstruct (foo-struct")) - (switch-to-buffer "*scratch*") - (with-temp-buffer - (insert source) - (let ((slime-buffer-package "SWANK")) - (slime-eval - `(swank:compile-string-for-emacs - ,source - ,(buffer-name) - '((:position 0) (:line 1 1)) - ,nil - ,nil))) - (let ((temp-buffer (current-buffer))) - (with-current-buffer "*scratch*" - (slime-edit-definition name) - (slime-check ("Definition of %S is in buffer `%s'." - name temp-buffer) - (eq (current-buffer) temp-buffer)) - (slime-check "Definition now at point." (looking-at regexp))) - ))) - -(def-slime-test complete-symbol - (prefix expected-completions) - "Find the completions of a symbol-name prefix." - '(("cl:compile" ("cl:compile" "cl:compile-file" "cl:compile-file-pathname" - "cl:compiled-function" "cl:compiled-function-p" - "cl:compiler-macro" "cl:compiler-macro-function")) - ("cl:foobar" ()) - ("swank::compile-file" ("swank::compile-file" - "swank::compile-file-for-emacs" - "swank::compile-file-if-needed" - "swank::compile-file-output" - "swank::compile-file-pathname")) - ("cl:m-v-l" ())) - (let ((completions (slime-simple-completions prefix))) - (slime-test-expect "Completion set" expected-completions completions))) - -(def-slime-test read-from-minibuffer - (input-keys expected-result) - "Test `slime-read-from-minibuffer' with INPUT-KEYS as events." - '(("( r e v e TAB SPC ' ( 1 SPC 2 SPC 3 ) ) RET" - "(reverse '(1 2 3))") - ("( c l : c o n TAB s t a n t l TAB SPC 4 2 ) RET" - "(cl:constantly 42)")) - (when noninteractive - (slime-skip-test "Can't use unread-command-events in batch mode")) - (let ((keys (eval `(kbd ,input-keys)))) ; kbd is a macro in Emacs 23 - (setq unread-command-events (listify-key-sequence keys))) - (let ((actual-result (slime-read-from-minibuffer "Test: "))) - (accept-process-output) ; run idle timers - (slime-test-expect "Completed string" expected-result actual-result))) - -(def-slime-test arglist - ;; N.B. Allegro apparently doesn't return the default values of - ;; optional parameters. Thus the regexp in the start-server - ;; expected value. In a perfect world we'd find a way to smooth - ;; over this difference between implementations--perhaps by - ;; convincing Franz to provide a function that does what we want. - (function-name expected-arglist) - "Lookup the argument list for FUNCTION-NAME. -Confirm that EXPECTED-ARGLIST is displayed." - '(("swank::operator-arglist" "(swank::operator-arglist name package)") - ("swank::compute-backtrace" "(swank::compute-backtrace start end)") - ("swank::emacs-connected" "(swank::emacs-connected)") - ("swank::compile-string-for-emacs" - "(swank::compile-string-for-emacs \ -string buffer position filename policy)") - ("swank::connection.socket-io" - "(swank::connection.socket-io \ -\\(struct\\(ure\\)?\\|object\\|instance\\|x\\|connection\\))") - ("cl:lisp-implementation-type" "(cl:lisp-implementation-type)") - ("cl:class-name" - "(cl:class-name \\(class\\|object\\|instance\\|structure\\))")) - (let ((arglist (slime-eval `(swank:operator-arglist ,function-name - "swank")))) - (slime-test-expect "Argument list is as expected" - expected-arglist (and arglist (downcase arglist)) - (lambda (pattern arglist) - (and arglist (string-match pattern arglist)))))) - -(defun slime-test--compile-defun (program subform) - (slime-check-top-level) - (with-temp-buffer - (lisp-mode) - (insert program) - (let ((font-lock-verbose nil)) - (setq slime-buffer-package ":swank") - (slime-compile-string (buffer-string) 1) - (setq slime-buffer-package ":cl-user") - (slime-sync-to-top-level 5) - (goto-char (point-max)) - (slime-previous-note) - (slime-check error-location-correct - (equal (read (current-buffer)) subform)))) - (slime-check-top-level)) - -(def-slime-test (compile-defun (:fails-for "allegro" "lispworks" "clisp")) - (program subform) - "Compile PROGRAM containing errors. -Confirm that SUBFORM is correctly located." - '(("(defun cl-user::foo () (cl-user::bar))" (cl-user::bar)) - ("(defun cl-user::foo () - #\\space - ;;Sdf - (cl-user::bar))" - (cl-user::bar)) - ("(defun cl-user::foo () - #+(or)skipped - #| #||# - #||# |# - (cl-user::bar))" - (cl-user::bar)) - ("(defun cl-user::foo () - \"\\\" bla bla \\\"\" - (cl-user::bar))" - (cl-user::bar)) - ("(defun cl-user::foo () - #.*log-events* - (cl-user::bar))" - (cl-user::bar)) - ("#.'(defun x () (/ 1 0)) - (defun foo () - (cl-user::bar)) - - " - (cl-user::bar))) - (slime-test--compile-defun program subform)) - -;; This test ideally would be collapsed into the previous -;; compile-defun test, but only 1 case fails for ccl--and that's here -(def-slime-test (compile-defun-with-reader-conditionals - (:fails-for "allegro" "lispworks" "clisp" "ccl")) - (program subform) - "Compile PROGRAM containing errors. -Confirm that SUBFORM is correctly located." - '(("(defun foo () - #+#.'(:and) (/ 1 0))" - (/ 1 0))) - (slime-test--compile-defun program subform)) - -;; SBCL used to pass this one but since they changed the -;; backquote/unquote reader it fails. -(def-slime-test (compile-defun-with-backquote - (:fails-for "allegro" "lispworks" "clisp" "sbcl")) - (program subform) - "Compile PROGRAM containing errors. -Confirm that SUBFORM is correctly located." - '(("(defun cl-user::foo () - (list `(1 ,(random 10) 2 ,@(make-list (random 10)) 3 - ,(cl-user::bar))))" - (cl-user::bar))) - (slime-test--compile-defun program subform)) - -(def-slime-test (compile-file (:fails-for "allegro" "clisp")) - (string) - "Insert STRING in a file, and compile it." - `((,(pp-to-string '(defun foo () nil)))) - (let ((filename "/tmp/slime-tmp-file.lisp")) - (with-temp-file filename - (insert string)) - (let ((cell (cons nil nil))) - (slime-eval-async - `(swank:compile-file-for-emacs ,filename nil) - (slime-rcurry (lambda (result cell) - (setcar cell t) - (setcdr cell result)) - cell)) - (slime-wait-condition "Compilation finished" (lambda () (car cell)) - 0.5) - (let ((result (cdr cell))) - (slime-check "Compilation successfull" - (eq (slime-compilation-result.successp result) t)))))) - -(def-slime-test utf-8-source - (input output) - "Source code containing utf-8 should work" - (list (let* ((bytes "\343\201\212\343\201\257\343\202\210\343\201\206") - ;;(encode-coding-string (string #x304a #x306f #x3088 #x3046) - ;; 'utf-8) - (string (decode-coding-string bytes 'utf-8-unix))) - (assert (equal bytes (encode-coding-string string 'utf-8-unix))) - (list (concat "(defun cl-user::foo () \"" string "\")") - string))) - (slime-eval `(cl:eval (cl:read-from-string ,input))) - (slime-test-expect "Eval result correct" - output (slime-eval '(cl-user::foo))) - (let ((cell (cons nil nil))) - (let ((hook (slime-curry (lambda (cell &rest _) (setcar cell t)) cell))) - (add-hook 'slime-compilation-finished-hook hook) - (unwind-protect - (progn - (slime-compile-string input 0) - (slime-wait-condition "Compilation finished" - (lambda () (car cell)) - 0.5) - (slime-test-expect "Compile-string result correct" - output (slime-eval '(cl-user::foo)))) - (remove-hook 'slime-compilation-finished-hook hook)) - (let ((filename "/tmp/slime-tmp-file.lisp")) - (setcar cell nil) - (add-hook 'slime-compilation-finished-hook hook) - (unwind-protect - (with-temp-buffer - (when (fboundp 'set-buffer-multibyte) - (set-buffer-multibyte t)) - (setq buffer-file-coding-system 'utf-8-unix) - (setq buffer-file-name filename) - (insert ";; -*- coding: utf-8-unix -*- \n") - (insert input) - (let ((coding-system-for-write 'utf-8-unix)) - (write-region nil nil filename nil t)) - (let ((slime-load-failed-fasl 'always)) - (slime-compile-and-load-file) - (slime-wait-condition "Compilation finished" - (lambda () (car cell)) - 0.5)) - (slime-test-expect "Compile-file result correct" - output (slime-eval '(cl-user::foo)))) - (remove-hook 'slime-compilation-finished-hook hook) - (ignore-errors (delete-file filename))))))) - -(def-slime-test async-eval-debugging (depth) - "Test recursive debugging of asynchronous evaluation requests." - '((1) (2) (3)) - (lexical-let ((depth depth) - (debug-hook-max-depth 0)) - (let ((debug-hook - (lambda () - (with-current-buffer (sldb-get-default-buffer) - (when (> sldb-level debug-hook-max-depth) - (setq debug-hook-max-depth sldb-level) - (if (= sldb-level depth) - ;; We're at maximum recursion - time to unwind - (sldb-quit) - ;; Going down - enter another recursive debug - ;; Recursively debug. - (slime-eval-async '(error)))))))) - (let ((sldb-hook (cons debug-hook sldb-hook))) - (slime-eval-async '(error)) - (slime-sync-to-top-level 5) - (slime-check ("Maximum depth reached (%S) is %S." - debug-hook-max-depth depth) - (= debug-hook-max-depth depth)))))) - -(def-slime-test unwind-to-previous-sldb-level (level2 level1) - "Test recursive debugging and returning to lower SLDB levels." - '((2 1) (4 2)) - (slime-check-top-level) - (lexical-let ((level2 level2) - (level1 level1) - (state 'enter) - (max-depth 0)) - (let ((debug-hook - (lambda () - (with-current-buffer (sldb-get-default-buffer) - (setq max-depth (max sldb-level max-depth)) - (ecase state - (enter - (cond ((= sldb-level level2) - (setq state 'leave) - (sldb-invoke-restart (sldb-first-abort-restart))) - (t - (slime-eval-async `(cl:aref cl:nil ,sldb-level))))) - (leave - (cond ((= sldb-level level1) - (setq state 'ok) - (sldb-quit)) - (t - (sldb-invoke-restart (sldb-first-abort-restart)) - )))))))) - (let ((sldb-hook (cons debug-hook sldb-hook))) - (slime-eval-async `(cl:aref cl:nil 0)) - (slime-sync-to-top-level 15) - (slime-check-top-level) - (slime-check ("Maximum depth reached (%S) is %S." max-depth level2) - (= max-depth level2)) - (slime-check ("Final state reached.") - (eq state 'ok)))))) - -(defun sldb-first-abort-restart () - (let ((case-fold-search t)) - (cl-position-if (lambda (x) (string-match "abort" (car x))) - sldb-restarts))) - -(def-slime-test loop-interrupt-quit - () - "Test interrupting a loop." - '(()) - (slime-check-top-level) - (slime-eval-async '(cl:loop) (lambda (_) ) "CL-USER") - (accept-process-output nil 1) - (slime-check "In eval state." (slime-busy-p)) - (slime-interrupt) - (slime-wait-condition "First interrupt" (lambda () (slime-sldb-level= 1)) 5) - (with-current-buffer (sldb-get-default-buffer) - (sldb-quit)) - (slime-sync-to-top-level 5) - (slime-check-top-level)) - -(def-slime-test loop-interrupt-continue-interrupt-quit - () - "Test interrupting a previously interrupted but continued loop." - '(()) - (slime-check-top-level) - (slime-eval-async '(cl:loop) (lambda (_) ) "CL-USER") - (sleep-for 1) - (slime-wait-condition "running" #'slime-busy-p 5) - (slime-interrupt) - (slime-wait-condition "First interrupt" (lambda () (slime-sldb-level= 1)) 5) - (with-current-buffer (sldb-get-default-buffer) - (sldb-continue)) - (slime-wait-condition "running" (lambda () - (and (slime-busy-p) - (not (sldb-get-default-buffer)))) 5) - (slime-interrupt) - (slime-wait-condition "Second interrupt" (lambda () (slime-sldb-level= 1)) 5) - (with-current-buffer (sldb-get-default-buffer) - (sldb-quit)) - (slime-sync-to-top-level 5) - (slime-check-top-level)) - -(def-slime-test interactive-eval - () - "Test interactive eval and continuing from the debugger." - '(()) - (slime-check-top-level) - (lexical-let ((done nil)) - (let ((sldb-hook (lambda () (sldb-continue) (setq done t)))) - (slime-interactive-eval - "(progn\ - (cerror \"foo\" \"restart\")\ - (cerror \"bar\" \"restart\")\ - (+ 1 2))") - (while (not done) (accept-process-output)) - (slime-sync-to-top-level 5) - (slime-check-top-level) - (unless noninteractive - (let ((message (current-message))) - (slime-check "Minibuffer contains: \"3\"" - (equal "=> 3 (2 bits, #x3, #o3, #b11)" message))))))) - -(def-slime-test report-condition-with-circular-list - (format-control format-argument) - "Test conditions involving circular lists." - '(("~a" "(let ((x (cons nil nil))) (setf (cdr x) x))") - ("~a" "(let ((x (cons nil nil))) (setf (car x) x))") - ("~a" "(let ((x (cons (make-string 100000 :initial-element #\\X) nil)))\ - (setf (cdr x) x))")) - (slime-check-top-level) - (lexical-let ((done nil)) - (let ((sldb-hook (lambda () (sldb-continue) (setq done t)))) - (slime-interactive-eval - (format "(with-standard-io-syntax (cerror \"foo\" \"%s\" %s) (+ 1 2))" - format-control format-argument)) - (while (not done) (accept-process-output)) - (slime-sync-to-top-level 5) - (slime-check-top-level) - (unless noninteractive - (let ((message (current-message))) - (slime-check "Minibuffer contains: \"3\"" - (equal "=> 3 (2 bits, #x3, #o3, #b11)" message))))))) - -(def-slime-test interrupt-bubbling-idiot - () - "Test interrupting a loop that sends a lot of output to Emacs." - '(()) - (accept-process-output nil 1) - (slime-check-top-level) - (slime-eval-async '(cl:loop :for i :from 0 :do (cl:progn (cl:print i) - (cl:finish-output))) - (lambda (_) ) - "CL-USER") - (sleep-for 1) - (slime-interrupt) - (slime-wait-condition "Debugger visible" - (lambda () - (and (slime-sldb-level= 1) - (get-buffer-window (sldb-get-default-buffer)))) - 30) - (with-current-buffer (sldb-get-default-buffer) - (sldb-quit)) - (slime-sync-to-top-level 5)) - -(def-slime-test (interrupt-encode-message (:style :sigio)) - () - "Test interrupt processing during swank::encode-message" - '(()) - (slime-eval-async '(cl:loop :for i :from 0 - :do (swank::background-message "foo ~d" i))) - (sleep-for 1) - (slime-eval-async '(cl:/ 1 0)) - (slime-wait-condition "Debugger visible" - (lambda () - (and (slime-sldb-level= 1) - (get-buffer-window (sldb-get-default-buffer)))) - 30) - (with-current-buffer (sldb-get-default-buffer) - (sldb-quit)) - (slime-sync-to-top-level 5)) - -(def-slime-test inspector - (exp) - "Test basic inspector workingness." - '(((let ((h (make-hash-table))) - (loop for i below 10 do (setf (gethash i h) i)) - h)) - ((make-array 10)) - ((make-list 10)) - ('cons) - (#'cons)) - (slime-inspect (prin1-to-string exp)) - (cl-assert (not (slime-inspector-visible-p))) - (slime-wait-condition "Inspector visible" #'slime-inspector-visible-p 5) - (with-current-buffer (window-buffer (selected-window)) - (slime-inspector-quit)) - (slime-wait-condition "Inspector closed" - (lambda () (not (slime-inspector-visible-p))) - 5) - (slime-sync-to-top-level 1)) - -(defun slime-buffer-visible-p (name) - (let ((buffer (window-buffer (selected-window)))) - (string-match name (buffer-name buffer)))) - -(defun slime-inspector-visible-p () - (slime-buffer-visible-p (slime-buffer-name :inspector))) - -(defun slime-execute-as-command (name) - "Execute `name' as if it was done by the user through the -Command Loop. Similiar to `call-interactively' but also pushes on -the buffer's undo-list." - (undo-boundary) - (call-interactively name)) - -(def-slime-test macroexpand - (macro-defs bufcontent expansion1 search-str expansion2) - "foo" - '((("(defmacro qwertz (&body body) `(list :qwertz ',body))" - "(defmacro yxcv (&body body) `(list :yxcv (qwertz ,@body)))") - "(yxcv :A :B :C)" - "(list :yxcv (qwertz :a :b :c))" - "(qwertz" - "(list :yxcv (list :qwertz '(:a :b :c)))")) - (slime-check-top-level) - (setq slime-buffer-package ":swank") - (with-temp-buffer - (lisp-mode) - (dolist (def macro-defs) - (slime-compile-string def 0) - (slime-sync-to-top-level 5)) - (insert bufcontent) - (goto-char (point-min)) - (slime-execute-as-command 'slime-macroexpand-1) - (slime-wait-condition "Macroexpansion buffer visible" - (lambda () - (slime-buffer-visible-p - (slime-buffer-name :macroexpansion))) - 5) - (with-current-buffer (get-buffer (slime-buffer-name :macroexpansion)) - (slime-test-expect "Initial macroexpansion is correct" - expansion1 - (downcase (buffer-string)) - #'slime-test-macroexpansion=) - (search-forward search-str) - (backward-up-list) - (slime-execute-as-command 'slime-macroexpand-1-inplace) - (slime-sync-to-top-level 3) - (slime-test-expect "In-place macroexpansion is correct" - expansion2 - (downcase (buffer-string)) - #'slime-test-macroexpansion=) - (slime-execute-as-command 'slime-macroexpand-undo) - (slime-test-expect "Expansion after undo is correct" - expansion1 - (downcase (buffer-string)) - #'slime-test-macroexpansion=))) - (setq slime-buffer-package ":cl-user")) - -(defun slime-test-macroexpansion= (string1 string2) - (let ((string1 (replace-regexp-in-string " *\n *" " " string1)) - (string2 (replace-regexp-in-string " *\n *" " " string2))) - (equal string1 string2))) - -(def-slime-test indentation (buffer-content point-markers) - "Check indentation update to work correctly." - '((" -\(in-package :swank) - -\(defmacro with-lolipop (&body body) - `(progn ,@body)) - -\(defmacro lolipop (&body body) - `(progn ,@body)) - -\(with-lolipop - 1 - 2 - 42) - -\(lolipop - 1 - 2 - 23) -" - ("23" "42"))) - (with-temp-buffer - (lisp-mode) - (slime-lisp-mode-hook) - (insert buffer-content) - (slime-compile-region (point-min) (point-max)) - (slime-sync-to-top-level 3) - (slime-update-indentation) - (slime-sync-to-top-level 3) - (dolist (marker point-markers) - (search-backward marker) - (beginning-of-defun) - (indent-sexp)) - (slime-test-expect "Correct buffer content" - buffer-content - (substring-no-properties (buffer-string))))) - -(def-slime-test break - (times exp) - "Test whether BREAK invokes SLDB." - (let ((exp1 '(break))) - `((1 ,exp1) (2 ,exp1) (3 ,exp1))) - (accept-process-output nil 0.2) - (slime-check-top-level) - (slime-eval-async - `(cl:eval (cl:read-from-string - ,(prin1-to-string `(dotimes (i ,times) - (unless (= i 0) - (swank::sleep-for 1)) - ,exp))))) - (dotimes (_i times) - (slime-wait-condition "Debugger visible" - (lambda () - (and (slime-sldb-level= 1) - (get-buffer-window - (sldb-get-default-buffer)))) - 3) - (with-current-buffer (sldb-get-default-buffer) - (sldb-continue)) - (slime-wait-condition "sldb closed" - (lambda () (not (sldb-get-default-buffer))) - 0.5)) - (slime-sync-to-top-level 1)) - -(def-slime-test (break2 (:fails-for "cmucl" "allegro")) - (times exp) - "Backends should arguably make sure that BREAK does not depend -on *DEBUGGER-HOOK*." - (let ((exp2 - '(block outta - (let ((*debugger-hook* (lambda (c h) (return-from outta 42)))) - (break))))) - `((1 ,exp2) (2 ,exp2) (3 ,exp2))) - (slime-test-break times exp)) - -(def-slime-test locally-bound-debugger-hook - () - "Test that binding *DEBUGGER-HOOK* locally works properly." - '(()) - (accept-process-output nil 1) - (slime-check-top-level) - (slime-compile-string - (prin1-to-string `(defun cl-user::quux () - (block outta - (let ((*debugger-hook* - (lambda (c hook) - (declare (ignore c hook)) - (return-from outta 42)))) - (error "FOO"))))) - 0) - (slime-sync-to-top-level 2) - (slime-eval-async '(cl-user::quux)) - ;; FIXME: slime-wait-condition returns immediately if the test returns true - (slime-wait-condition "Checking that Debugger does not popup" - (lambda () - (not (sldb-get-default-buffer))) - 3) - (slime-sync-to-top-level 5)) - -(def-slime-test end-of-file - (expr) - "Signalling END-OF-FILE should invoke the debugger." - '(((cl:error 'cl:end-of-file)) - ((cl:read-from-string ""))) - (let ((value (slime-eval - `(cl:let ((condition nil)) - (cl:with-simple-restart - (cl:continue "continue") - (cl:let ((cl:*debugger-hook* - (cl:lambda (c h) - (cl:setq condition c) - (cl:continue)))) - ,expr)) - (cl:if (cl:typep condition 'cl:end-of-file) t))))) - (slime-test-expect "Debugger invoked" t value))) - -(def-slime-test interrupt-at-toplevel - () - "Let's see what happens if we send a user interrupt at toplevel." - '(()) - (slime-check-top-level) - (unless (and (eq (slime-communication-style) :spawn) - (not (featurep 'slime-repl))) - (slime-interrupt) - (slime-wait-condition - "Debugger visible" - (lambda () - (and (slime-sldb-level= 1) - (get-buffer-window (sldb-get-default-buffer)))) - 5) - (with-current-buffer (sldb-get-default-buffer) - (sldb-quit)) - (slime-sync-to-top-level 5))) - -(def-slime-test interrupt-in-debugger (interrupts continues) - "Let's see what happens if we interrupt the debugger. -INTERRUPTS ... number of nested interrupts -CONTINUES ... how often the continue restart should be invoked" - '((1 0) (2 1) (4 2)) - (slime-check "No debugger" (not (sldb-get-default-buffer))) - (when (and (eq (slime-communication-style) :spawn) - (not (featurep 'slime-repl))) - (slime-eval-async '(swank::without-slime-interrupts - (swank::receive))) - (sit-for 0.2)) - (dotimes (i interrupts) - (slime-interrupt) - (let ((level (1+ i))) - (slime-wait-condition (format "Debug level %d reachend" level) - (lambda () (equal (sldb-level) level)) - 2))) - (dotimes (i continues) - (with-current-buffer (sldb-get-default-buffer) - (sldb-continue)) - (let ((level (- interrupts (1+ i)))) - (slime-wait-condition (format "Return to debug level %d" level) - (lambda () (equal (sldb-level) level)) - 2))) - (with-current-buffer (sldb-get-default-buffer) - (sldb-quit)) - (slime-sync-to-top-level 1)) - -(def-slime-test flow-control - (n delay interrupts) - "Let Lisp produce output faster than Emacs can consume it." - `((400 0.03 3)) - (when noninteractive - (slime-skip-test "test is currently unstable")) - (slime-check "No debugger" (not (sldb-get-default-buffer))) - (slime-eval-async `(swank:flow-control-test ,n ,delay)) - (sleep-for 0.2) - (dotimes (_i interrupts) - (slime-interrupt) - (slime-wait-condition "In debugger" (lambda () (slime-sldb-level= 1)) 5) - (slime-check "In debugger" (slime-sldb-level= 1)) - (with-current-buffer (sldb-get-default-buffer) - (sldb-continue)) - (slime-wait-condition "No debugger" (lambda () (slime-sldb-level= nil)) 3) - (slime-check "Debugger closed" (slime-sldb-level= nil))) - (slime-sync-to-top-level 8)) - -(def-slime-test sbcl-world-lock - (n delay) - "Print something from *MACROEXPAND-HOOK*. -In SBCL, the compiler grabs a lock which can be problematic because -no method dispatch code can be generated for other threads. -This test will fail more likely before dispatch caches are warmed up." - '((10 0.03) - ;;((cl:+ swank::send-counter-limit 10) 0.03) - ) - (slime-test-expect "no error" - 123 - (slime-eval - `(cl:let ((cl:*macroexpand-hook* - (cl:lambda (fun form env) - (swank:flow-control-test ,n ,delay) - (cl:funcall fun form env)))) - (cl:eval '(cl:macrolet ((foo () 123)) - (foo))))))) - -(def-slime-test (disconnect-one-connection (:style :spawn)) () - "`slime-disconnect' should disconnect only the current connection" - '(()) - (let ((connection-count (length slime-net-processes)) - (old-connection slime-default-connection) - (slime-connected-hook nil)) - (unwind-protect - (let ((slime-dispatching-connection - (slime-connect "localhost" - ;; Here we assume that the request will - ;; be evaluated in its own thread. - (slime-eval `(swank:create-server - :port 0 ; use random port - :style :spawn - :dont-close nil))))) - (slime-sync-to-top-level 3) - (slime-disconnect) - (slime-test-expect "Number of connections must remane the same" - connection-count - (length slime-net-processes))) - (slime-select-connection old-connection)))) - -(def-slime-test disconnect-and-reconnect - () - "Close the connetion. -Confirm that the subprocess continues gracefully. -Reconnect afterwards." - '(()) - (slime-check-top-level) - (let* ((c (slime-connection)) - (p (slime-inferior-process c))) - (with-current-buffer (process-buffer p) - (erase-buffer)) - (delete-process c) - (assert (equal (process-status c) 'closed) nil "Connection not closed") - (accept-process-output nil 0.1) - (assert (equal (process-status p) 'run) nil "Subprocess not running") - (with-current-buffer (process-buffer p) - (assert (< (buffer-size) 500) nil "Unusual output")) - (slime-inferior-connect p (slime-inferior-lisp-args p)) - (lexical-let ((hook nil) (p p)) - (setq hook (lambda () - (slime-test-expect - "We are connected again" p (slime-inferior-process)) - (remove-hook 'slime-connected-hook hook))) - (add-hook 'slime-connected-hook hook) - (slime-wait-condition "Lisp restarted" - (lambda () - (not (member hook slime-connected-hook))) - 5)))) - - -;;;; SLIME-loading tests that launch separate Emacsen -;;;; -(cl-defun slime-test-recipe-test-for (&key preflight - takeoff - landing) - (let ((success nil) - (test-file (make-temp-file "slime-recipe-" nil ".el")) - (test-forms - `((require 'cl) - (labels - ((die - (reason &optional more) - (princ reason) - (terpri) - (and more (pp more)) - (kill-emacs 254))) - (condition-case err - (progn ,@preflight) - (error - (die "Unexpected error running preflight forms" - err))) - (add-hook - 'slime-connected-hook - #'(lambda () - (condition-case err - (progn - ,@landing - (kill-emacs 0)) - (error - (die "Unexpected error running landing forms" - err)))) - t) - (condition-case err - (progn - ,@takeoff - ,(when (null landing) '(kill-emacs 0))) - (error - (die "Unexpected error running takeoff forms" - err))) - (with-timeout - (20 - (die "Timeout waiting for recipe test to finish." - takeoff)) - (while t (sit-for 1))))))) - (unwind-protect - (progn - (with-temp-buffer - (mapc #'insert (mapcar #'pp-to-string test-forms)) - (write-file test-file)) - (with-temp-buffer - (let ((retval - (call-process (concat invocation-directory invocation-name) - nil (list t nil) nil - "-Q" "--batch" - "-l" test-file))) - (unless (= 0 retval) - (ert-fail (buffer-substring - (+ (goto-char (point-min)) - (skip-chars-forward " \t\n")) - (+ (goto-char (point-max)) - (skip-chars-backward " \t\n"))))))) - (setq success t)) - (if success (delete-file test-file) - (message "Test failed: keeping %s for inspection" test-file))))) - -(define-slime-ert-test readme-recipe () - "Test the README.md's autoload recipe." - (slime-test-recipe-test-for - :preflight `((add-to-list 'load-path ,slime-path) - (require 'slime-autoloads) - (setq inferior-lisp-program ,inferior-lisp-program) - (setq slime-contribs '(slime-fancy))) - :takeoff `((call-interactively 'slime)) - :landing `((unless (and (featurep 'slime-repl) - (find 'swank-repl slime-required-modules)) - (die "slime-repl not loaded properly")) - (with-current-buffer (slime-repl-buffer) - (unless (and (string-match "^; +SLIME" (buffer-string)) - (string-match "CL-USER> *$" (buffer-string))) - (die "REPL prompt not properly setup" - (buffer-substring-no-properties (point-min) - (point-max)))))))) - -(define-slime-ert-test traditional-recipe () - "Test the README.md's traditional recipe." - (slime-test-recipe-test-for - :preflight `((add-to-list 'load-path ,slime-path) - (require 'slime) - (setq inferior-lisp-program ,inferior-lisp-program) - (slime-setup '(slime-fancy))) - :takeoff `((call-interactively 'slime)) - :landing `((unless (and (featurep 'slime-repl) - (find 'swank-repl slime-required-modules)) - (die "slime-repl not loaded properly")) - (with-current-buffer (slime-repl-buffer) - (unless (and (string-match "^; +SLIME" (buffer-string)) - (string-match "CL-USER> *$" (buffer-string))) - (die "REPL prompt not properly setup" - (buffer-substring-no-properties (point-min) - (point-max)))))))) - -(define-slime-ert-test readme-recipe-autoload-on-lisp-visit () - "Test more autoload bits in README.md's installation recipe." - (slime-test-recipe-test-for - :preflight `((add-to-list 'load-path ,slime-path) - (require 'slime-autoloads)) - :takeoff `((if (featurep 'slime) - (die "Didn't expect SLIME to be loaded so early!")) - (find-file ,(make-temp-file "slime-lisp-source-file" nil - ".lisp")) - (unless (featurep 'slime) - (die "Expected SLIME to be fully loaded by now"))))) - -(defun slime-test-eval-now (string) - (second (slime-eval `(swank:eval-and-grab-output ,string)))) - -(def-slime-test (slime-recompile-all-xrefs (:fails-for "cmucl")) () - "Test recompilation of all references within an xref buffer." - '(()) - (let* ((cell (cons nil nil)) - (hook (slime-curry (lambda (cell &rest _) (setcar cell t)) cell)) - (filename (make-temp-file "slime-recompile-all-xrefs" nil ".lisp"))) - (add-hook 'slime-compilation-finished-hook hook) - (unwind-protect - (with-temp-file filename - (set-visited-file-name filename) - (slime-test-eval-now "(defparameter swank::*.var.* nil)") - (insert "(in-package :swank) - (defun .fn1. ()) - (defun .fn2. () (.fn1.) #.*.var.*) - (defun .fn3. () (.fn1.) #.*.var.*)") - (save-buffer) - (slime-compile-and-load-file) - (slime-wait-condition "Compilation finished" - (lambda () (car cell)) - 0.5) - (slime-test-eval-now "(setq *.var.* t)") - (setcar cell nil) - (slime-xref :calls ".fn1." - (lambda (&rest args) - (apply #'slime-show-xrefs args) - (setcar cell t))) - (slime-wait-condition "Xrefs computed and displayed" - (lambda () (car cell)) - 0.5) - (setcar cell nil) - (with-current-buffer slime-xref-last-buffer - (slime-recompile-all-xrefs) - (slime-wait-condition "Compilation finished" - (lambda () (car cell)) - 0.5)) - (should (cl-equalp (list (slime-test-eval-now "(.fn2.)") - (slime-test-eval-now "(.fn3.)")) - '("T" "T")))) - (remove-hook 'slime-compilation-finished-hook hook) - (when slime-xref-last-buffer - (kill-buffer slime-xref-last-buffer))))) - -(provide 'slime-tests) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/slime.el b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/slime.el deleted file mode 100644 index cce0f88..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/slime.el +++ /dev/null @@ -1,7659 +0,0 @@ -;;; slime.el --- Superior Lisp Interaction Mode for Emacs -*-lexical-binding:t-*- - -;; URL: https://github.com/slime/slime -;; Package-Requires: ((cl-lib "0.5") (macrostep "0.9")) -;; Keywords: languages, lisp, slime -;; Version: 2.24 - -;;;; License and Commentary - -;; Copyright (C) 2003 Eric Marsden, Luke Gorrie, Helmut Eller -;; Copyright (C) 2004,2005,2006 Luke Gorrie, Helmut Eller -;; Copyright (C) 2007,2008,2009 Helmut Eller, Tobias C. Rittweiler -;; -;; For a detailed list of contributors, see the manual. -;; -;; 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. - -;;; Commentary: - -;; SLIME is the ``Superior Lisp Interaction Mode for Emacs.'' -;; -;; SLIME extends Emacs with support for interactive programming in -;; Common Lisp. The features are centered around slime-mode, an Emacs -;; minor-mode that complements the standard lisp-mode. While lisp-mode -;; supports editing Lisp source files, slime-mode adds support for -;; interacting with a running Common Lisp process for compilation, -;; debugging, documentation lookup, and so on. -;; -;; The slime-mode programming environment follows the example of -;; Emacs's native Emacs Lisp environment. We have also included good -;; ideas from similar systems (such as ILISP) and some new ideas of -;; our own. -;; -;; SLIME is constructed from two parts: a user-interface written in -;; Emacs Lisp, and a supporting server program written in Common -;; Lisp. The two sides are connected together with a socket and -;; communicate using an RPC-like protocol. -;; -;; The Lisp server is primarily written in portable Common Lisp. The -;; required implementation-specific functionality is specified by a -;; well-defined interface and implemented separately for each Lisp -;; implementation. This makes SLIME readily portable. - -;;; Code: - - -;;;; Dependencies and setup -(eval-and-compile - (require 'cl-lib nil t) - ;; For emacs 23, look for bundled version - (require 'cl-lib "lib/cl-lib")) - -(eval-when-compile (require 'cl)) ; defsetf, lexical-let - -(eval-and-compile - (if (< emacs-major-version 23) - (error "Slime requires an Emacs version of 23, or above"))) - -(require 'hyperspec "lib/hyperspec") -(require 'thingatpt) -(require 'comint) -(require 'pp) -(require 'easymenu) -(require 'outline) -(require 'arc-mode) -(require 'etags) -(require 'compile) - -(eval-when-compile - (require 'apropos) - (require 'gud) - (require 'lisp-mnt)) - -(declare-function lm-version "lisp-mnt") - -(defvar slime-path nil - "Directory containing the Slime package. -This is used to load the supporting Common Lisp library, Swank. -The default value is automatically computed from the location of -the Emacs Lisp package.") -(setq slime-path (file-name-directory load-file-name)) - -(defvar slime-version nil - "The version of SLIME that you're using.") -(setq slime-version - (eval-when-compile - (lm-version - (cl-find "slime.el" - (remove nil - (list load-file-name - (when (boundp 'byte-compile-current-file) - byte-compile-current-file))) - :key #'file-name-nondirectory - :test #'string-equal)))) - -(defvar slime-lisp-modes '(lisp-mode)) -(defvar slime-contribs nil - "A list of contrib packages to load with SLIME.") -(define-obsolete-variable-alias 'slime-setup-contribs -'slime-contribs "2.3.2") - -(defun slime-setup (&optional contribs) - "Setup Emacs so that lisp-mode buffers always use SLIME. -CONTRIBS is a list of contrib packages to load. If `nil', use -`slime-contribs'. " - (interactive) - (when (member 'lisp-mode slime-lisp-modes) - (add-hook 'lisp-mode-hook 'slime-lisp-mode-hook)) - (when contribs - (setq slime-contribs contribs)) - (slime--setup-contribs)) - -(defvar slime-required-modules '()) - -(defun slime--setup-contribs () - "Load and initialize contribs." - (dolist (c slime-contribs) - (unless (featurep c) - (require c) - (let ((init (intern (format "%s-init" c)))) - (when (fboundp init) - (funcall init)))))) - -(defun slime-lisp-mode-hook () - (slime-mode 1) - (set (make-local-variable 'lisp-indent-function) - 'common-lisp-indent-function)) - -(defvar slime-protocol-version nil) -(setq slime-protocol-version slime-version) - - -;;;; Customize groups -;; -;;;;; slime - -(defgroup slime nil - "Interaction with the Superior Lisp Environment." - :prefix "slime-" - :group 'applications) - -;;;;; slime-ui - -(defgroup slime-ui nil - "Interaction with the Superior Lisp Environment." - :prefix "slime-" - :group 'slime) - -(defcustom slime-truncate-lines t - "Set `truncate-lines' in popup buffers. -This applies to buffers that present lines as rows of data, such as -debugger backtraces and apropos listings." - :type 'boolean - :group 'slime-ui) - -(defcustom slime-kill-without-query-p nil - "If non-nil, kill SLIME processes without query when quitting Emacs. -This applies to the *inferior-lisp* buffer and the network connections." - :type 'boolean - :group 'slime-ui) - -;;;;; slime-lisp - -(defgroup slime-lisp nil - "Lisp server configuration." - :prefix "slime-" - :group 'slime) - -(defcustom slime-backend "swank-loader.lisp" - "The name of the Lisp file that loads the Swank server. -This name is interpreted relative to the directory containing -slime.el, but could also be set to an absolute filename." - :type 'string - :group 'slime-lisp) - -(defcustom slime-connected-hook nil - "List of functions to call when SLIME connects to Lisp." - :type 'hook - :group 'slime-lisp) - -(defcustom slime-enable-evaluate-in-emacs nil - "*If non-nil, the inferior Lisp can evaluate arbitrary forms in Emacs. -The default is nil, as this feature can be a security risk." - :type '(boolean) - :group 'slime-lisp) - -(defcustom slime-lisp-host "localhost" - "The default hostname (or IP address) to connect to." - :type 'string - :group 'slime-lisp) - -(defcustom slime-port 4005 - "Port to use as the default for `slime-connect'." - :type 'integer - :group 'slime-lisp) - -(defvar slime-connect-host-history (list slime-lisp-host)) -(defvar slime-connect-port-history (list (prin1-to-string slime-port))) - -(defvar slime-net-valid-coding-systems - '((iso-latin-1-unix nil "iso-latin-1-unix") - (iso-8859-1-unix nil "iso-latin-1-unix") - (binary nil "iso-latin-1-unix") - (utf-8-unix t "utf-8-unix") - (emacs-mule-unix t "emacs-mule-unix") - (euc-jp-unix t "euc-jp-unix")) - "A list of valid coding systems. -Each element is of the form: (NAME MULTIBYTEP CL-NAME)") - -(defun slime-find-coding-system (name) - "Return the coding system for the symbol NAME. -The result is either an element in `slime-net-valid-coding-systems' -of nil." - (let ((probe (assq name slime-net-valid-coding-systems))) - (when (and probe (if (fboundp 'check-coding-system) - (ignore-errors (check-coding-system (car probe))) - (eq (car probe) 'binary))) - probe))) - -(defcustom slime-net-coding-system - (car (cl-find-if 'slime-find-coding-system - slime-net-valid-coding-systems :key 'car)) - "Coding system used for network connections. -See also `slime-net-valid-coding-systems'." - :type (cons 'choice - (mapcar (lambda (x) - (list 'const (car x))) - slime-net-valid-coding-systems)) - :group 'slime-lisp) - -;;;;; slime-mode - -(defgroup slime-mode nil - "Settings for slime-mode Lisp source buffers." - :prefix "slime-" - :group 'slime) - -(defcustom slime-find-definitions-function 'slime-find-definitions-rpc - "Function to find definitions for a name. -The function is called with the definition name, a string, as its -argument." - :type 'function - :group 'slime-mode - :options '(slime-find-definitions-rpc - slime-etags-definitions - (lambda (name) - (append (slime-find-definitions-rpc name) - (slime-etags-definitions name))) - (lambda (name) - (or (slime-find-definitions-rpc name) - (and tags-table-list - (slime-etags-definitions name)))))) - -;; FIXME: remove one day -(defcustom slime-complete-symbol-function 'nil - "Obsolete. Use `slime-completion-at-point-functions' instead." - :group 'slime-mode - :type '(choice (const :tag "Compound" slime-complete-symbol*) - (const :tag "Fuzzy" slime-fuzzy-complete-symbol))) - -(make-obsolete-variable 'slime-complete-symbol-function - 'slime-completion-at-point-functions - "2015-10-18") - -(defcustom slime-completion-at-point-functions - '(slime-filename-completion - slime-simple-completion-at-point) - "List of functions to perform completion. -Works like `completion-at-point-functions'. -`slime--completion-at-point' uses this variable." - :group 'slime-mode) - -;;;;; slime-mode-faces - -(defgroup slime-mode-faces nil - "Faces in slime-mode source code buffers." - :prefix "slime-" - :group 'slime-mode) - -(defface slime-error-face - `((((class color) (background light)) - (:underline "red")) - (((class color) (background dark)) - (:underline "red")) - (t (:underline t))) - "Face for errors from the compiler." - :group 'slime-mode-faces) - -(defface slime-warning-face - `((((class color) (background light)) - (:underline "orange")) - (((class color) (background dark)) - (:underline "coral")) - (t (:underline t))) - "Face for warnings from the compiler." - :group 'slime-mode-faces) - -(defface slime-style-warning-face - `((((class color) (background light)) - (:underline "brown")) - (((class color) (background dark)) - (:underline "gold")) - (t (:underline t))) - "Face for style-warnings from the compiler." - :group 'slime-mode-faces) - -(defface slime-note-face - `((((class color) (background light)) - (:underline "brown4")) - (((class color) (background dark)) - (:underline "light goldenrod")) - (t (:underline t))) - "Face for notes from the compiler." - :group 'slime-mode-faces) - -(defface slime-early-deprecation-warning-face - `((((type graphic) (class color) (background light)) - (:strike-through "brown")) - (((type graphic) (class color) (background dark)) - (:strike-through "gold")) - (((type graphic)) - (:strike-through t)) - (((class color) (background light)) - (:underline "brown")) - (((class color) (background dark)) - (:underline "gold")) - (t - (:underline t))) - "Face for early deprecation warnings from the compiler." - :group 'slime-mode-faces) - -(defface slime-late-deprecation-warning-face - `((((type graphic) (class color) (background light)) - (:strike-through "orange")) - (((type graphic) (class color) (background dark)) - (:strike-through "coral")) - (((type graphic)) - (:strike-through t)) - (((class color) (background light)) - (:underline "orange")) - (((class color) (background dark)) - (:underline "coral")) - (t - (:underline t))) - "Face for late deprecation warnings from the compiler." - :group 'slime-mode-faces) - -(defface slime-final-deprecation-warning-face - `((((type graphic) (class color) (background light)) - (:strike-through "red")) - (((type graphic) (class color) (background dark)) - (:strike-through "red")) - (((type graphic)) - (:strike-through t)) - (((class color) (background light)) - (:underline "red")) - (((class color) (background dark)) - (:underline "red")) - (t - (:strike-through t))) - "Face for final deprecation warnings from the compiler." - :group 'slime-mode-faces) - -(defface slime-highlight-face - '((t (:inherit highlight :underline nil))) - "Face for compiler notes while selected." - :group 'slime-mode-faces) - -;;;;; sldb - -(defgroup slime-debugger nil - "Backtrace options and fontification." - :prefix "sldb-" - :group 'slime) - -(defmacro define-sldb-faces (&rest faces) - "Define the set of SLDB faces. -Each face specifiation is (NAME DESCRIPTION &optional PROPERTIES). -NAME is a symbol; the face will be called sldb-NAME-face. -DESCRIPTION is a one-liner for the customization buffer. -PROPERTIES specifies any default face properties." - `(progn ,@(cl-loop for face in faces - collect `(define-sldb-face ,@face)))) - -(defmacro define-sldb-face (name description &optional default) - (let ((facename (intern (format "sldb-%s-face" (symbol-name name))))) - `(defface ,facename - (list (list t ,default)) - ,(format "Face for %s." description) - :group 'slime-debugger))) - -(define-sldb-faces - (topline "the top line describing the error") - (condition "the condition class" - '(:inherit font-lock-warning-face)) - (section "the labels of major sections in the debugger buffer" - '(:inherit header-line)) - (frame-label "backtrace frame numbers" - '(:inherit shadow)) - (restart-type "restart names." - '(:inherit font-lock-keyword-face)) - (restart "restart descriptions") - (restart-number "restart numbers (correspond to keystrokes to invoke)" - '(:bold t)) - (frame-line "function names and arguments in the backtrace") - (restartable-frame-line - "frames which are surely restartable" - '(:foreground "lime green")) - (non-restartable-frame-line - "frames which are surely not restartable") - (detailed-frame-line - "function names and arguments in a detailed (expanded) frame") - (local-name "local variable names" - '(:inherit font-lock-variable-name-face)) - (local-value "local variable values") - (catch-tag "catch tags" - '(:inherit highlight))) - - -;;;; Minor modes - -;;;;; slime-mode - -(defvar slime-mode-indirect-map (make-sparse-keymap) - "Empty keymap which has `slime-mode-map' as it's parent. -This is a hack so that we can reinitilize the real slime-mode-map -more easily. See `slime-init-keymaps'.") - -(defvar slime-buffer-connection) -(defvar slime-dispatching-connection) -(defvar slime-current-thread) - -(defun slime--on () - (slime-setup-completion)) - -(defun slime--off () - (remove-hook 'completion-at-point-functions #'slime--completion-at-point t)) - -(define-minor-mode slime-mode - "\\\ -SLIME: The Superior Lisp Interaction Mode for Emacs (minor-mode). - -Commands to compile the current buffer's source file and visually -highlight any resulting compiler notes and warnings: -\\[slime-compile-and-load-file] - Compile and load the current buffer's file. -\\[slime-compile-file] - Compile (but not load) the current buffer's file. -\\[slime-compile-defun] - Compile the top-level form at point. - -Commands for visiting compiler notes: -\\[slime-next-note] - Goto the next form with a compiler note. -\\[slime-previous-note] - Goto the previous form with a compiler note. -\\[slime-remove-notes] - Remove compiler-note annotations in buffer. - -Finding definitions: -\\[slime-edit-definition] -- Edit the definition of the function called at point. -\\[slime-pop-find-definition-stack] -- Pop the definition stack to go back from a definition. - -Documentation commands: -\\[slime-describe-symbol] - Describe symbol. -\\[slime-apropos] - Apropos search. -\\[slime-disassemble-symbol] - Disassemble a function. - -Evaluation commands: -\\[slime-eval-defun] - Evaluate top-level from containing point. -\\[slime-eval-last-expression] - Evaluate sexp before point. -\\[slime-pprint-eval-last-expression] \ -- Evaluate sexp before point, pretty-print result. - -Full set of commands: -\\{slime-mode-map}" - :keymap slime-mode-indirect-map - :lighter (:eval (slime-modeline-string)) - (cond (slime-mode (slime--on)) - (t (slime--off)))) - - -;;;;;; Modeline - -(defun slime-modeline-string () - "Return the string to display in the modeline. -\"Slime\" only appears if we aren't connected. If connected, -include package-name, connection-name, and possibly some state -information." - (let ((conn (slime-current-connection))) - ;; Bail out early in case there's no connection, so we won't - ;; implicitly invoke `slime-connection' which may query the user. - (if (not conn) - (and slime-mode " Slime") - (let ((local (eq conn slime-buffer-connection)) - (pkg (slime-current-package))) - (concat " " - (if local "{" "[") - (if pkg (slime-pretty-package-name pkg) "?") - " " - ;; ignore errors for closed connections - (ignore-errors (slime-connection-name conn)) - (slime-modeline-state-string conn) - (if local "}" "]")))))) - -(defun slime-pretty-package-name (name) - "Return a pretty version of a package name NAME." - (cond ((string-match "^#?:\\(.*\\)$" name) - (match-string 1 name)) - ((string-match "^\"\\(.*\\)\"$" name) - (match-string 1 name)) - (t name))) - -(defun slime-modeline-state-string (conn) - "Return a string possibly describing CONN's state." - (cond ((not (eq (process-status conn) 'open)) - (format " %s" (process-status conn))) - ((let ((pending (length (slime-rex-continuations conn))) - (sldbs (length (sldb-buffers conn)))) - (cond ((and (zerop sldbs) (zerop pending)) nil) - ((zerop sldbs) (format " %s" pending)) - (t (format " %s/%s" pending sldbs))))))) - -(defun slime--recompute-modelines () - (force-mode-line-update t)) - - -;;;;; Key bindings - -(defvar slime-parent-map nil - "Parent keymap for shared between all Slime related modes.") - -(defvar slime-parent-bindings - '(("\M-." slime-edit-definition) - ("\M-," slime-pop-find-definition-stack) - ("\M-_" slime-edit-uses) ; for German layout - ("\M-?" slime-edit-uses) ; for USian layout - ("\C-x4." slime-edit-definition-other-window) - ("\C-x5." slime-edit-definition-other-frame) - ("\C-x\C-e" slime-eval-last-expression) - ("\C-\M-x" slime-eval-defun) - ;; Include PREFIX keys... - ("\C-c" slime-prefix-map))) - -(defvar slime-prefix-map nil - "Keymap for commands prefixed with `slime-prefix-key'.") - -(defvar slime-prefix-bindings - '(("\C-r" slime-eval-region) - (":" slime-interactive-eval) - ("\C-e" slime-interactive-eval) - ("E" slime-edit-value) - ("\C-l" slime-load-file) - ("\C-b" slime-interrupt) - ("\M-d" slime-disassemble-symbol) - ("\C-t" slime-toggle-trace-fdefinition) - ("I" slime-inspect) - ("\C-xt" slime-list-threads) - ("\C-xn" slime-next-connection) - ("\C-xp" slime-prev-connection) - ("\C-xc" slime-list-connections) - ("<" slime-list-callers) - (">" slime-list-callees) - ;; Include DOC keys... - ("\C-d" slime-doc-map) - ;; Include XREF WHO-FOO keys... - ("\C-w" slime-who-map) - )) - -(defvar slime-editing-map nil - "These keys are useful for buffers where the user can insert and -edit s-exprs, e.g. for source buffers and the REPL.") - -(defvar slime-editing-keys - `(;; Arglist display & completion - (" " slime-space) - ;; Evaluating - ;;("\C-x\M-e" slime-eval-last-expression-display-output :inferior t) - ("\C-c\C-p" slime-pprint-eval-last-expression) - ;; Macroexpand - ("\C-c\C-m" slime-expand-1) - ("\C-c\M-m" slime-macroexpand-all) - ;; Misc - ("\C-c\C-u" slime-undefine-function) - (,(kbd "C-M-.") slime-next-location) - (,(kbd "C-M-,") slime-previous-location) - ;; Obsolete, redundant bindings - ("\C-c\C-i" completion-at-point) - ;;("\M-*" pop-tag-mark) ; almost to clever - )) - -(defvar slime-mode-map nil - "Keymap for slime-mode.") - -(defvar slime-keys - '( ;; Compiler notes - ("\M-p" slime-previous-note) - ("\M-n" slime-next-note) - ("\C-c\M-c" slime-remove-notes) - ("\C-c\C-k" slime-compile-and-load-file) - ("\C-c\M-k" slime-compile-file) - ("\C-c\C-c" slime-compile-defun))) - -(defun slime-nop () - "The null command. Used to shadow currently-unused keybindings." - (interactive) - (call-interactively 'undefined)) - -(defvar slime-doc-map nil - "Keymap for documentation commands. Bound to a prefix key.") - -(defvar slime-doc-bindings - '((?a slime-apropos) - (?z slime-apropos-all) - (?p slime-apropos-package) - (?d slime-describe-symbol) - (?f slime-describe-function) - (?h slime-documentation-lookup) - (?~ common-lisp-hyperspec-format) - (?g common-lisp-hyperspec-glossary-term) - (?# common-lisp-hyperspec-lookup-reader-macro))) - -(defvar slime-who-map nil - "Keymap for who-xref commands. Bound to a prefix key.") - -(defvar slime-who-bindings - '((?c slime-who-calls) - (?w slime-calls-who) - (?r slime-who-references) - (?b slime-who-binds) - (?s slime-who-sets) - (?m slime-who-macroexpands) - (?a slime-who-specializes))) - -(defun slime-init-keymaps () - "(Re)initialize the keymaps for `slime-mode'." - (interactive) - (slime-init-keymap 'slime-doc-map t t slime-doc-bindings) - (slime-init-keymap 'slime-who-map t t slime-who-bindings) - (slime-init-keymap 'slime-prefix-map t nil slime-prefix-bindings) - (slime-init-keymap 'slime-parent-map nil nil slime-parent-bindings) - (slime-init-keymap 'slime-editing-map nil nil slime-editing-keys) - (set-keymap-parent slime-editing-map slime-parent-map) - (slime-init-keymap 'slime-mode-map nil nil slime-keys) - (set-keymap-parent slime-mode-map slime-editing-map) - (set-keymap-parent slime-mode-indirect-map slime-mode-map)) - -(defun slime-init-keymap (keymap-name prefixp bothp bindings) - (set keymap-name (make-sparse-keymap)) - (when prefixp (define-prefix-command keymap-name)) - (slime-bind-keys (eval keymap-name) bothp bindings)) - -(defun slime-bind-keys (keymap bothp bindings) - "Add BINDINGS to KEYMAP. -If BOTHP is true also add bindings with control modifier." - (cl-loop for (key command) in bindings do - (cond (bothp - (define-key keymap `[,key] command) - (unless (equal key ?h) ; But don't bind C-h - (define-key keymap `[(control ,key)] command))) - (t (define-key keymap key command))))) - -(slime-init-keymaps) - -(define-minor-mode slime-editing-mode - "Minor mode which makes slime-editing-map available. -\\{slime-editing-map}" - nil - nil - slime-editing-map) - - -;;;; Framework'ey bits -;;; -;;; This section contains some standard SLIME idioms: basic macros, -;;; ways of showing messages to the user, etc. All the code in this -;;; file should use these functions when applicable. -;;; -;;;;; Syntactic sugar - -(defmacro slime-dcase (value &rest patterns) - (declare (indent 1)) - "Dispatch VALUE to one of PATTERNS. -A cross between `case' and `destructuring-bind'. -The pattern syntax is: - ((HEAD . ARGS) . BODY) -The list of patterns is searched for a HEAD `eq' to the car of -VALUE. If one is found, the BODY is executed with ARGS bound to the -corresponding values in the CDR of VALUE." - (let ((operator (cl-gensym "op-")) - (operands (cl-gensym "rand-")) - (tmp (cl-gensym "tmp-"))) - `(let* ((,tmp ,value) - (,operator (car ,tmp)) - (,operands (cdr ,tmp))) - (cl-case ,operator - ,@(mapcar (lambda (clause) - (if (eq (car clause) t) - `(t ,@(cdr clause)) - (cl-destructuring-bind ((op &rest rands) &rest body) - clause - `(,op (cl-destructuring-bind ,rands ,operands - . ,(or body - '((ignore)) ; suppress some warnings - )))))) - patterns) - ,@(if (eq (caar (last patterns)) t) - '() - `((t (error "slime-dcase failed: %S" ,tmp)))))))) - -(defmacro slime-define-keys (keymap &rest key-command) - "Define keys in KEYMAP. Each KEY-COMMAND is a list of (KEY COMMAND)." - (declare (indent 1)) - `(progn . ,(mapcar (lambda (k-c) `(define-key ,keymap . ,k-c)) - key-command))) - -(cl-defmacro with-struct ((conc-name &rest slots) struct &body body) - "Like with-slots but works only for structs. -\(fn (CONC-NAME &rest SLOTS) STRUCT &body BODY)" - (declare (indent 2)) - (let ((struct-var (cl-gensym "struct")) - (reader (lambda (slot) - (intern (concat (symbol-name conc-name) - (symbol-name slot)))))) - `(let ((,struct-var ,struct)) - (cl-symbol-macrolet - ,(mapcar (lambda (slot) - (cl-etypecase slot - (symbol `(,slot (,(funcall reader slot) ,struct-var))) - (cons `(,(cl-first slot) - (,(funcall reader (cl-second slot)) - ,struct-var))))) - slots) - . ,body)))) - -;;;;; Very-commonly-used functions - -(defvar slime-message-function 'message) - -;; Interface -(defun slime-buffer-name (type &optional hidden) - (cl-assert (keywordp type)) - (concat (if hidden " " "") - (format "*slime-%s*" (substring (symbol-name type) 1)))) - -;; Interface -(defun slime-message (format &rest args) - "Like `message' but with special support for multi-line messages. -Single-line messages use the echo area." - (apply slime-message-function format args)) - -(defun slime-display-warning (message &rest args) - (display-warning '(slime warning) (apply #'format message args))) - -(defvar slime-background-message-function 'slime-display-oneliner) - -;; Interface -(defun slime-background-message (format-string &rest format-args) - "Display a message in passing. -This is like `slime-message', but less distracting because it -will never pop up a buffer or display multi-line messages. -It should be used for \"background\" messages such as argument lists." - (apply slime-background-message-function format-string format-args)) - -(defun slime-display-oneliner (format-string &rest format-args) - (let* ((msg (apply #'format format-string format-args))) - (unless (minibuffer-window-active-p (minibuffer-window)) - (message "%s" (slime-oneliner msg))))) - -(defun slime-oneliner (string) - "Return STRING truncated to fit in a single echo-area line." - (substring string 0 (min (length string) - (or (cl-position ?\n string) most-positive-fixnum) - (1- (window-width (minibuffer-window)))))) - -;; Interface -(defun slime-set-truncate-lines () - "Apply `slime-truncate-lines' to the current buffer." - (when slime-truncate-lines - (set (make-local-variable 'truncate-lines) t))) - -;; Interface -(defun slime-read-package-name (prompt &optional initial-value) - "Read a package name from the minibuffer, prompting with PROMPT." - (let ((completion-ignore-case t)) - (completing-read prompt (slime-bogus-completion-alist - (slime-eval - `(swank:list-all-package-names t))) - nil t initial-value))) - -;; Interface -(defun slime-read-symbol-name (prompt &optional query) - "Either read a symbol name or choose the one at point. -The user is prompted if a prefix argument is in effect, if there is no -symbol at point, or if QUERY is non-nil." - (cond ((or current-prefix-arg query (not (slime-symbol-at-point))) - (slime-read-from-minibuffer prompt (slime-symbol-at-point))) - (t (slime-symbol-at-point)))) - -;; Interface -(defmacro slime-propertize-region (props &rest body) - "Execute BODY and add PROPS to all the text it inserts. -More precisely, PROPS are added to the region between the point's -positions before and after executing BODY." - (declare (indent 1) (debug (sexp &rest form))) - (let ((start (cl-gensym))) - `(let ((,start (point))) - (prog1 (progn ,@body) - (add-text-properties ,start (point) ,props))))) - -(defun slime-add-face (face string) - (declare (indent 1)) - (add-text-properties 0 (length string) (list 'face face) string) - string) - -;; Interface -(defsubst slime-insert-propertized (props &rest args) - "Insert all ARGS and then add text-PROPS to the inserted text." - (slime-propertize-region props (apply #'insert args))) - -(defmacro slime-with-rigid-indentation (level &rest body) - "Execute BODY and then rigidly indent its text insertions. -Assumes all insertions are made at point." - (declare (indent 1)) - (let ((start (cl-gensym)) (l (cl-gensym))) - `(let ((,start (point)) (,l ,(or level '(current-column)))) - (prog1 (progn ,@body) - (slime-indent-rigidly ,start (point) ,l))))) - -(defun slime-indent-rigidly (start end column) - ;; Similar to `indent-rigidly' but doesn't inherit text props. - (let ((indent (make-string column ?\ ))) - (save-excursion - (goto-char end) - (beginning-of-line) - (while (and (<= start (point)) - (progn - (insert-before-markers indent) - (zerop (forward-line -1)))))))) - -(defun slime-insert-indented (&rest strings) - "Insert all arguments rigidly indented." - (slime-with-rigid-indentation nil - (apply #'insert strings))) - -(defun slime-property-bounds (prop) - "Return two the positions of the previous and next changes to PROP. -PROP is the name of a text property." - (cl-assert (get-text-property (point) prop)) - (let ((end (next-single-char-property-change (point) prop))) - (list (previous-single-char-property-change end prop) end))) - -(defun slime-curry (fun &rest args) - "Partially apply FUN to ARGS. The result is a new function. -This idiom is preferred over `lexical-let'." - `(lambda (&rest more) (apply ',fun (append ',args more)))) - -(defun slime-rcurry (fun &rest args) - "Like `slime-curry' but ARGS on the right are applied." - `(lambda (&rest more) (apply ',fun (append more ',args)))) - - -;;;;; Temporary popup buffers - -;; keep compiler quiet -(defvar slime-buffer-package) -(defvar slime-buffer-connection) - -;; Interface -(cl-defmacro slime-with-popup-buffer ((name &key package connection select - mode) - &body body) - "Similar to `with-output-to-temp-buffer'. -Bind standard-output and initialize some buffer-local variables. -Restore window configuration when closed. - -NAME is the name of the buffer to be created. -PACKAGE is the value `slime-buffer-package'. -CONNECTION is the value for `slime-buffer-connection', - if nil, no explicit connection is associated with - the buffer. If t, the current connection is taken. -MODE is the name of a major mode which will be enabled. -" - (declare (indent 1)) - (let ((package-sym (cl-gensym "package-")) - (connection-sym (cl-gensym "connection-"))) - `(let ((,package-sym ,(if (eq package t) - `(slime-current-package) - package)) - (,connection-sym ,(if (eq connection t) - `(slime-current-connection) - connection))) - (with-current-buffer (get-buffer-create ,name) - (let ((inhibit-read-only t) - (standard-output (current-buffer))) - (erase-buffer) - (funcall (or ,mode 'fundamental-mode)) - (setq slime-buffer-package ,package-sym - slime-buffer-connection ,connection-sym) - (set-syntax-table lisp-mode-syntax-table) - ,@body - (slime-popup-buffer-mode 1) - (funcall (if ,select 'pop-to-buffer 'display-buffer) - (current-buffer)) - (current-buffer)))))) - -(defvar slime-popup-buffer-mode-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "q") 'quit-window) - ;;("\C-c\C-z" . slime-switch-to-output-buffer) - (define-key map (kbd "M-.") 'slime-edit-definition) - map)) - -(define-minor-mode slime-popup-buffer-mode - "Mode for displaying read only stuff" - nil nil nil - (setq buffer-read-only t)) - -(add-to-list 'minor-mode-alist - `(slime-popup-buffer-mode - (:eval (unless slime-mode - (slime-modeline-string))))) - -(set-keymap-parent slime-popup-buffer-mode-map slime-parent-map) - -;;;;; Filename translation -;;; -;;; Filenames passed between Emacs and Lisp should be translated using -;;; these functions. This way users who run Emacs and Lisp on separate -;;; machines have a chance to integrate file operations somehow. - -(defvar slime-to-lisp-filename-function #'convert-standard-filename - "Function to translate Emacs filenames to CL namestrings.") -(defvar slime-from-lisp-filename-function #'identity - "Function to translate CL namestrings to Emacs filenames.") - -(defun slime-to-lisp-filename (filename) - "Translate the string FILENAME to a Lisp filename." - (funcall slime-to-lisp-filename-function filename)) - -(defun slime-from-lisp-filename (filename) - "Translate the Lisp filename FILENAME to an Emacs filename." - (funcall slime-from-lisp-filename-function filename)) - - -;;;; Starting SLIME -;;; -;;; This section covers starting an inferior-lisp, compiling and -;;; starting the server, initiating a network connection. - -;;;;; Entry points - -;; We no longer load inf-lisp, but we use this variable for backward -;; compatibility. -(defvar inferior-lisp-program "lisp" - "*Program name for invoking an inferior Lisp with for Inferior Lisp mode.") - -(defvar slime-lisp-implementations nil - "*A list of known Lisp implementations. -The list should have the form: - ((NAME (PROGRAM PROGRAM-ARGS...) &key KEYWORD-ARGS) ...) - -NAME is a symbol for the implementation. -PROGRAM and PROGRAM-ARGS are strings used to start the Lisp process. -For KEYWORD-ARGS see `slime-start'. - -Here's an example: - ((cmucl (\"/opt/cmucl/bin/lisp\" \"-quiet\") :init slime-init-command) - (acl (\"acl7\") :coding-system emacs-mule))") - -(defvar slime-default-lisp nil - "*The name of the default Lisp implementation. -See `slime-lisp-implementations'") - -;; dummy definitions for the compiler -(defvar slime-net-processes) -(defvar slime-default-connection) - -(defun slime (&optional command coding-system) - "Start an inferior^_superior Lisp and connect to its Swank server." - (interactive) - (slime-setup) - (let ((inferior-lisp-program (or command inferior-lisp-program)) - (slime-net-coding-system (or coding-system slime-net-coding-system))) - (slime-start* (cond ((and command (symbolp command)) - (slime-lisp-options command)) - (t (slime-read-interactive-args)))))) - -(defvar slime-inferior-lisp-program-history '() - "History list of command strings. Used by `slime'.") - -(defun slime-read-interactive-args () - "Return the list of args which should be passed to `slime-start'. - -The rules for selecting the arguments are rather complicated: - -- In the most common case, i.e. if there's no prefix-arg in - effect and if `slime-lisp-implementations' is nil, use - `inferior-lisp-program' as fallback. - -- If the table `slime-lisp-implementations' is non-nil use the - implementation with name `slime-default-lisp' or if that's nil - the first entry in the table. - -- If the prefix-arg is `-', prompt for one of the registered - lisps. - -- If the prefix-arg is positive, read the command to start the - process." - (let ((table slime-lisp-implementations)) - (cond ((not current-prefix-arg) (slime-lisp-options)) - ((eq current-prefix-arg '-) - (let ((key (completing-read - "Lisp name: " (mapcar (lambda (x) - (list (symbol-name (car x)))) - table) - nil t))) - (slime-lookup-lisp-implementation table (intern key)))) - (t - (cl-destructuring-bind (program &rest program-args) - (split-string-and-unquote - (read-shell-command "Run lisp: " inferior-lisp-program - 'slime-inferior-lisp-program-history)) - (let ((coding-system - (if (eq 16 (prefix-numeric-value current-prefix-arg)) - (read-coding-system "set slime-coding-system: " - slime-net-coding-system) - slime-net-coding-system))) - (list :program program :program-args program-args - :coding-system coding-system))))))) - -(defun slime-lisp-options (&optional name) - (let ((table slime-lisp-implementations)) - (cl-assert (or (not name) table)) - (cond (table (slime-lookup-lisp-implementation slime-lisp-implementations - (or name slime-default-lisp - (car (car table))))) - (t (cl-destructuring-bind (program &rest args) - (split-string inferior-lisp-program) - (list :program program :program-args args)))))) - -(defun slime-lookup-lisp-implementation (table name) - (let ((arguments (cl-rest (assoc name table)))) - (unless arguments - (error "Could not find lisp implementation with the name '%S'" name)) - (when (and (= (length arguments) 1) - (functionp (cl-first arguments))) - (setf arguments (funcall (cl-first arguments)))) - (cl-destructuring-bind ((prog &rest args) &rest keys) arguments - (cl-list* :name name :program prog :program-args args keys)))) - -(cl-defun slime-start (&key (program inferior-lisp-program) program-args - directory - (coding-system slime-net-coding-system) - (init 'slime-init-command) - name - (buffer "*inferior-lisp*") - init-function - env) - "Start a Lisp process and connect to it. -This function is intended for programmatic use if `slime' is not -flexible enough. - -PROGRAM and PROGRAM-ARGS are the filename and argument strings - for the subprocess. -INIT is a function that should return a string to load and start - Swank. The function will be called with the PORT-FILENAME and ENCODING as - arguments. INIT defaults to `slime-init-command'. -CODING-SYSTEM a symbol for the coding system. The default is - slime-net-coding-system -ENV environment variables for the subprocess (see `process-environment'). -INIT-FUNCTION function to call right after the connection is established. -BUFFER the name of the buffer to use for the subprocess. -NAME a symbol to describe the Lisp implementation -DIRECTORY change to this directory before starting the process. -" - (let ((args (list :program program :program-args program-args :buffer buffer - :coding-system coding-system :init init :name name - :init-function init-function :env env))) - (slime-check-coding-system coding-system) - (when (slime-bytecode-stale-p) - (slime-urge-bytecode-recompile)) - (let ((proc (slime-maybe-start-lisp program program-args env - directory buffer))) - (slime-inferior-connect proc args) - (pop-to-buffer (process-buffer proc))))) - -(defun slime-start* (options) - (apply #'slime-start options)) - -(defun slime-connect (host port &optional _coding-system interactive-p) - "Connect to a running Swank server. Return the connection." - (interactive (list (read-from-minibuffer - "Host: " (cl-first slime-connect-host-history) - nil nil '(slime-connect-host-history . 1)) - (string-to-number - (read-from-minibuffer - "Port: " (cl-first slime-connect-port-history) - nil nil '(slime-connect-port-history . 1))) - nil t)) - (slime-setup) - (when (and interactive-p - slime-net-processes - (y-or-n-p "Close old connections first? ")) - (slime-disconnect-all)) - (message "Connecting to Swank on port %S.." port) - (let* ((process (slime-net-connect host port)) - (slime-dispatching-connection process)) - (slime-setup-connection process))) - -;; FIXME: seems redundant -(defun slime-start-and-init (options fun) - (let* ((rest (plist-get options :init-function)) - (init (cond (rest `(lambda () (funcall ',rest) (funcall ',fun))) - (t fun)))) - (slime-start* (plist-put (cl-copy-list options) :init-function init)))) - -;;;;; Start inferior lisp -;;; -;;; Here is the protocol for starting SLIME: -;;; -;;; 0. Emacs recompiles/reloads slime.elc if it exists and is stale. -;;; 1. Emacs starts an inferior Lisp process. -;;; 2. Emacs tells Lisp (via stdio) to load and start Swank. -;;; 3. Lisp recompiles the Swank if needed. -;;; 4. Lisp starts the Swank server and writes its TCP port to a temp file. -;;; 5. Emacs reads the temp file to get the port and then connects. -;;; 6. Emacs prints a message of warm encouragement for the hacking ahead. -;;; -;;; Between steps 2-5 Emacs polls for the creation of the temp file so -;;; that it can make the connection. This polling may continue for a -;;; fair while if Swank needs recompilation. - -(defvar slime-connect-retry-timer nil - "Timer object while waiting for an inferior-lisp to start.") - -;;; Recompiling bytecode: - -(defun slime-bytecode-stale-p () - "Return true if slime.elc is older than slime.el." - (let ((libfile (locate-library "slime"))) - (when libfile - (let* ((basename (file-name-sans-extension libfile)) - (sourcefile (concat basename ".el")) - (bytefile (concat basename ".elc"))) - (and (file-exists-p bytefile) - (file-newer-than-file-p sourcefile bytefile)))))) - -(defun slime-recompile-bytecode () - "Recompile and reload slime." - (interactive) - (let ((sourcefile (concat (file-name-sans-extension (locate-library "slime")) - ".el"))) - (byte-compile-file sourcefile t))) - -(defun slime-urge-bytecode-recompile () - "Urge the user to recompile slime.elc. -Return true if we have been given permission to continue." - (when (y-or-n-p "slime.elc is older than source. Recompile first? ") - (slime-recompile-bytecode))) - -(defun slime-abort-connection () - "Abort connection the current connection attempt." - (interactive) - (cond (slime-connect-retry-timer - (slime-cancel-connect-retry-timer) - (message "Cancelled connection attempt.")) - (t (error "Not connecting")))) - -;;; Starting the inferior Lisp and loading Swank: - -(defun slime-maybe-start-lisp (program program-args env directory buffer) - "Return a new or existing inferior lisp process." - (cond ((not (comint-check-proc buffer)) - (slime-start-lisp program program-args env directory buffer)) - ((slime-reinitialize-inferior-lisp-p program program-args env buffer) - (let ((conn (cl-find (get-buffer-process buffer) - slime-net-processes - :key #'slime-inferior-process))) - (when conn - (slime-net-close conn))) - (get-buffer-process buffer)) - (t (slime-start-lisp program program-args env directory - (generate-new-buffer-name buffer))))) - -(defun slime-reinitialize-inferior-lisp-p (program program-args env buffer) - (let ((args (slime-inferior-lisp-args (get-buffer-process buffer)))) - (and (equal (plist-get args :program) program) - (equal (plist-get args :program-args) program-args) - (equal (plist-get args :env) env) - (not (y-or-n-p "Create an additional *inferior-lisp*? "))))) - -(defvar slime-inferior-process-start-hook nil - "Hook called whenever a new process gets started.") - -(defun slime-start-lisp (program program-args env directory buffer) - "Does the same as `inferior-lisp' but less ugly. -Return the created process." - (with-current-buffer (get-buffer-create buffer) - (when directory - (cd (expand-file-name directory))) - (comint-mode) - (let ((process-environment (append env process-environment)) - (process-connection-type nil)) - (comint-exec (current-buffer) "inferior-lisp" program nil program-args)) - (lisp-mode-variables t) - (let ((proc (get-buffer-process (current-buffer)))) - (slime-set-query-on-exit-flag proc) - (run-hooks 'slime-inferior-process-start-hook) - proc))) - -(defun slime-inferior-connect (process args) - "Start a Swank server in the inferior Lisp and connect." - (slime-delete-swank-port-file 'quiet) - (slime-start-swank-server process args) - (slime-read-port-and-connect process)) - -(defvar slime-inferior-lisp-args nil - "A buffer local variable in the inferior proccess. -See `slime-start'.") - -(defun slime-start-swank-server (process args) - "Start a Swank server on the inferior lisp." - (cl-destructuring-bind (&key coding-system init &allow-other-keys) args - (with-current-buffer (process-buffer process) - (make-local-variable 'slime-inferior-lisp-args) - (setq slime-inferior-lisp-args args) - (let ((str (funcall init (slime-swank-port-file) coding-system))) - (goto-char (process-mark process)) - (insert-before-markers str) - (process-send-string process str))))) - -(defun slime-inferior-lisp-args (process) - "Return the initial process arguments. -See `slime-start'." - (with-current-buffer (process-buffer process) - slime-inferior-lisp-args)) - -;; XXX load-server & start-server used to be separated. maybe that was better. -(defun slime-init-command (port-filename _coding-system) - "Return a string to initialize Lisp." - (let ((loader (if (file-name-absolute-p slime-backend) - slime-backend - (concat slime-path slime-backend)))) - ;; Return a single form to avoid problems with buffered input. - (format "%S\n\n" - `(progn - (load ,(slime-to-lisp-filename (expand-file-name loader)) - :verbose t) - (funcall (read-from-string "swank-loader:init") - :from-emacs t) - (funcall (read-from-string "swank:start-server") - ,(slime-to-lisp-filename port-filename)))))) - -(defun slime-swank-port-file () - "Filename where the SWANK server writes its TCP port number." - (expand-file-name (format "slime.%S" (emacs-pid)) (slime-temp-directory))) - -(defun slime-temp-directory () - (cond ((fboundp 'temp-directory) (temp-directory)) - ((boundp 'temporary-file-directory) temporary-file-directory) - (t "/tmp/"))) - -(defun slime-delete-swank-port-file (&optional quiet) - (condition-case data - (delete-file (slime-swank-port-file)) - (error - (cl-ecase quiet - ((nil) (signal (car data) (cdr data))) - (quiet) - (message (message "Unable to delete swank port file %S" - (slime-swank-port-file))))))) - -(defun slime-read-port-and-connect (inferior-process) - (slime-attempt-connection inferior-process nil 1)) - -(defun slime-attempt-connection (process retries attempt) - ;; A small one-state machine to attempt a connection with - ;; timer-based retries. - (slime-cancel-connect-retry-timer) - (let ((file (slime-swank-port-file))) - (unless (active-minibuffer-window) - (message "Polling %S .. %d (Abort with `M-x slime-abort-connection'.)" - file attempt)) - (cond ((and (file-exists-p file) - (> (nth 7 (file-attributes file)) 0)) ; file size - (let ((port (slime-read-swank-port)) - (args (slime-inferior-lisp-args process))) - (slime-delete-swank-port-file 'message) - (let ((c (slime-connect slime-lisp-host port - (plist-get args :coding-system)))) - (slime-set-inferior-process c process)))) - ((and retries (zerop retries)) - (message "Gave up connecting to Swank after %d attempts." attempt)) - ((eq (process-status process) 'exit) - (message "Failed to connect to Swank: inferior process exited.")) - (t - (when (and (file-exists-p file) - (zerop (nth 7 (file-attributes file)))) - (message "(Zero length port file)") - ;; the file may be in the filesystem but not yet written - (unless retries (setq retries 3))) - (cl-assert (not slime-connect-retry-timer)) - (setq slime-connect-retry-timer - (run-with-timer - 0.3 nil - #'slime-timer-call #'slime-attempt-connection - process (and retries (1- retries)) - (1+ attempt))))))) - -(defun slime-timer-call (fun &rest args) - "Call function FUN with ARGS, reporting all errors. - -The default condition handler for timer functions (see -`timer-event-handler') ignores errors." - (condition-case data - (apply fun args) - ((debug error) - (debug nil (list "Error in timer" fun args data))))) - -(defun slime-cancel-connect-retry-timer () - (when slime-connect-retry-timer - (cancel-timer slime-connect-retry-timer) - (setq slime-connect-retry-timer nil))) - -(defun slime-read-swank-port () - "Read the Swank server port number from the `slime-swank-port-file'." - (save-excursion - (with-temp-buffer - (insert-file-contents (slime-swank-port-file)) - (goto-char (point-min)) - (let ((port (read (current-buffer)))) - (cl-assert (integerp port)) - port)))) - -(defun slime-toggle-debug-on-swank-error () - (interactive) - (if (slime-eval `(swank:toggle-debug-on-swank-error)) - (message "Debug on SWANK error enabled.") - (message "Debug on SWANK error disabled."))) - -;;; Words of encouragement - -(defun slime-user-first-name () - (let ((name (if (string= (user-full-name) "") - (user-login-name) - (user-full-name)))) - (string-match "^[^ ]*" name) - (capitalize (match-string 0 name)))) - -(defvar slime-words-of-encouragement - `("Let the hacking commence!" - "Hacks and glory await!" - "Hack and be merry!" - "Your hacking starts... NOW!" - "May the source be with you!" - "Take this REPL, brother, and may it serve you well." - "Lemonodor-fame is but a hack away!" - "Are we consing yet?" - ,(format "%s, this could be the start of a beautiful program." - (slime-user-first-name))) - "Scientifically-proven optimal words of hackerish encouragement.") - -(defun slime-random-words-of-encouragement () - "Return a string of hackerish encouragement." - (eval (nth (random (length slime-words-of-encouragement)) - slime-words-of-encouragement))) - - -;;;; Networking -;;; -;;; This section covers the low-level networking: establishing -;;; connections and encoding/decoding protocol messages. -;;; -;;; Each SLIME protocol message beings with a 6-byte header followed -;;; by an S-expression as text. The sexp must be readable both by -;;; Emacs and by Common Lisp, so if it contains any embedded code -;;; fragments they should be sent as strings: -;;; -;;; The set of meaningful protocol messages are not specified -;;; here. They are defined elsewhere by the event-dispatching -;;; functions in this file and in swank.lisp. - -(defvar slime-net-processes nil - "List of processes (sockets) connected to Lisps.") - -(defvar slime-net-process-close-hooks '() - "List of functions called when a slime network connection closes. -The functions are called with the process as their argument.") - -(defun slime-secret () - "Find the magic secret from the user's home directory. -Return nil if the file doesn't exist or is empty; otherwise the -first line of the file." - (condition-case _err - (with-temp-buffer - (insert-file-contents "~/.slime-secret") - (goto-char (point-min)) - (buffer-substring (point-min) (line-end-position))) - (file-error nil))) - -;;; Interface - -(defun slime-send-secret (proc) - (let ((secret (slime-secret))) - (when secret - (let* ((payload (encode-coding-string secret 'utf-8-unix)) - (string (concat (slime-net-encode-length (length payload)) - payload))) - (process-send-string proc string))))) - -(defun slime-net-connect (host port) - "Establish a connection with a CL." - (let* ((inhibit-quit nil) - (proc (open-network-stream "SLIME Lisp" nil host port)) - (buffer (slime-make-net-buffer " *cl-connection*"))) - (push proc slime-net-processes) - (set-process-buffer proc buffer) - (set-process-filter proc 'slime-net-filter) - (set-process-sentinel proc 'slime-net-sentinel) - (slime-set-query-on-exit-flag proc) - (when (fboundp 'set-process-coding-system) - (set-process-coding-system proc 'binary 'binary)) - (slime-send-secret proc) - proc)) - -(defun slime-make-net-buffer (name) - "Make a buffer suitable for a network process." - (let ((buffer (generate-new-buffer name))) - (with-current-buffer buffer - (buffer-disable-undo) - (set (make-local-variable 'kill-buffer-query-functions) nil)) - buffer)) - -(defun slime-set-query-on-exit-flag (process) - "Set PROCESS's query-on-exit-flag to `slime-kill-without-query-p'." - (when slime-kill-without-query-p - ;; avoid byte-compiler warnings - (let ((fun (if (fboundp 'set-process-query-on-exit-flag) - 'set-process-query-on-exit-flag - 'process-kill-without-query))) - (funcall fun process nil)))) - -;;;;; Coding system madness - -(defun slime-check-coding-system (coding-system) - "Signal an error if CODING-SYSTEM isn't a valid coding system." - (interactive) - (let ((props (slime-find-coding-system coding-system))) - (unless props - (error "Invalid slime-net-coding-system: %s. %s" - coding-system (mapcar #'car slime-net-valid-coding-systems))) - (when (and (cl-second props) (boundp 'default-enable-multibyte-characters)) - (cl-assert default-enable-multibyte-characters)) - t)) - -(defun slime-coding-system-mulibyte-p (coding-system) - (cl-second (slime-find-coding-system coding-system))) - -(defun slime-coding-system-cl-name (coding-system) - (cl-third (slime-find-coding-system coding-system))) - -;;; Interface -(defun slime-net-send (sexp proc) - "Send a SEXP to Lisp over the socket PROC. -This is the lowest level of communication. The sexp will be READ and -EVAL'd by Lisp." - (let* ((payload (encode-coding-string - (concat (slime-prin1-to-string sexp) "\n") - 'utf-8-unix)) - (string (concat (slime-net-encode-length (length payload)) - payload))) - (slime-log-event sexp) - (process-send-string proc string))) - -(defun slime-safe-encoding-p (coding-system string) - "Return true iff CODING-SYSTEM can safely encode STRING." - (or (let ((candidates (find-coding-systems-string string)) - (base (coding-system-base coding-system))) - (or (equal candidates '(undecided)) - (memq base candidates))) - (and (not (multibyte-string-p string)) - (not (slime-coding-system-mulibyte-p coding-system))))) - -(defun slime-net-close (process &optional debug) - (setq slime-net-processes (remove process slime-net-processes)) - (when (eq process slime-default-connection) - (setq slime-default-connection nil)) - (cond (debug - (set-process-sentinel process 'ignore) - (set-process-filter process 'ignore) - (delete-process process)) - (t - (run-hook-with-args 'slime-net-process-close-hooks process) - ;; killing the buffer also closes the socket - (kill-buffer (process-buffer process))))) - -(defun slime-net-sentinel (process message) - (message "Lisp connection closed unexpectedly: %s" message) - (slime-net-close process)) - -;;; Socket input is handled by `slime-net-filter', which decodes any -;;; complete messages and hands them off to the event dispatcher. - -(defun slime-net-filter (process string) - "Accept output from the socket and process all complete messages." - (with-current-buffer (process-buffer process) - (goto-char (point-max)) - (insert string)) - (slime-process-available-input process)) - -(defun slime-process-available-input (process) - "Process all complete messages that have arrived from Lisp." - (with-current-buffer (process-buffer process) - (while (slime-net-have-input-p) - (let ((event (slime-net-read-or-lose process)) - (ok nil)) - (slime-log-event event) - (unwind-protect - (save-current-buffer - (slime-dispatch-event event process) - (setq ok t)) - (unless ok - (slime-run-when-idle 'slime-process-available-input process))))))) - -(defun slime-net-have-input-p () - "Return true if a complete message is available." - (goto-char (point-min)) - (and (>= (buffer-size) 6) - (>= (- (buffer-size) 6) (slime-net-decode-length)))) - -(defun slime-run-when-idle (function &rest args) - "Call FUNCTION as soon as Emacs is idle." - (apply #'run-at-time 0 nil function args)) - -(defun slime-handle-net-read-error (error) - (let ((packet (buffer-string))) - (slime-with-popup-buffer ((slime-buffer-name :error)) - (princ (format "%s\nin packet:\n%s" (error-message-string error) packet)) - (goto-char (point-min))) - (cond ((y-or-n-p "Skip this packet? ") - `(:emacs-skipped-packet ,packet)) - (t - (when (y-or-n-p "Enter debugger instead? ") - (debug 'error error)) - (signal (car error) (cdr error)))))) - -(defun slime-net-read-or-lose (process) - (condition-case error - (slime-net-read) - (error - (slime-net-close process t) - (error "net-read error: %S" error)))) - -(defun slime-net-read () - "Read a message from the network buffer." - (goto-char (point-min)) - (let* ((length (slime-net-decode-length)) - (start (+ (point) 6)) - (end (+ start length))) - (cl-assert (cl-plusp length)) - (prog1 (save-restriction - (narrow-to-region start end) - (condition-case error - (progn - (decode-coding-region start end 'utf-8-unix) - (setq end (point-max)) - (read (current-buffer))) - (error - (slime-handle-net-read-error error)))) - (delete-region (point-min) end)))) - -(defun slime-net-decode-length () - (string-to-number (buffer-substring-no-properties (point) (+ (point) 6)) - 16)) - -(defun slime-net-encode-length (n) - (format "%06x" n)) - -(defun slime-prin1-to-string (sexp) - "Like `prin1-to-string' but don't octal-escape non-ascii characters. -This is more compatible with the CL reader." - (let (print-escape-nonascii - print-escape-newlines - print-length - print-level) - (prin1-to-string sexp))) - - -;;;; Connections -;;; -;;; "Connections" are the high-level Emacs<->Lisp networking concept. -;;; -;;; Emacs has a connection to each Lisp process that it's interacting -;;; with. Typically there would only be one, but a user can choose to -;;; connect to many Lisps simultaneously. -;;; -;;; A connection consists of a control socket, optionally an extra -;;; socket dedicated to receiving Lisp output (an optimization), and a -;;; set of connection-local state variables. -;;; -;;; The state variables are stored as buffer-local variables in the -;;; control socket's process-buffer and are used via accessor -;;; functions. These variables include things like the *FEATURES* list -;;; and Unix Pid of the Lisp process. -;;; -;;; One connection is "current" at any given time. This is: -;;; `slime-dispatching-connection' if dynamically bound, or -;;; `slime-buffer-connection' if this is set buffer-local, or -;;; `slime-default-connection' otherwise. -;;; -;;; When you're invoking commands in your source files you'll be using -;;; `slime-default-connection'. This connection can be interactively -;;; reassigned via the connection-list buffer. -;;; -;;; When a command creates a new buffer it will set -;;; `slime-buffer-connection' so that commands in the new buffer will -;;; use the connection that the buffer originated from. For example, -;;; the apropos command creates the *Apropos* buffer and any command -;;; in that buffer (e.g. `M-.') will go to the same Lisp that did the -;;; apropos search. REPL buffers are similarly tied to their -;;; respective connections. -;;; -;;; When Emacs is dispatching some network message that arrived from a -;;; connection it will dynamically bind `slime-dispatching-connection' -;;; so that the event will be processed in the context of that -;;; connection. -;;; -;;; This is mostly transparent. The user should be aware that he can -;;; set the default connection to pick which Lisp handles commands in -;;; Lisp-mode source buffers, and slime hackers should be aware that -;;; they can tie a buffer to a specific connection. The rest takes -;;; care of itself. - -(defvar slime-dispatching-connection nil - "Network process currently executing. -This is dynamically bound while handling messages from Lisp; it -overrides `slime-buffer-connection' and `slime-default-connection'.") - -(make-variable-buffer-local - (defvar slime-buffer-connection nil - "Network connection to use in the current buffer. -This overrides `slime-default-connection'.")) - -(defvar slime-default-connection nil - "Network connection to use by default. -Used for all Lisp communication, except when overridden by -`slime-dispatching-connection' or `slime-buffer-connection'.") - -(defun slime-current-connection () - "Return the connection to use for Lisp interaction. -Return nil if there's no connection." - (or slime-dispatching-connection - slime-buffer-connection - slime-default-connection)) - -(defun slime-connection () - "Return the connection to use for Lisp interaction. -Signal an error if there's no connection." - (let ((conn (slime-current-connection))) - (cond ((and (not conn) slime-net-processes) - (or (slime-auto-select-connection) - (error "No default connection selected."))) - ((not conn) - (or (slime-auto-start) - (error "Not connected."))) - ((not (eq (process-status conn) 'open)) - (error "Connection closed.")) - (t conn)))) - -(define-obsolete-variable-alias 'slime-auto-connect -'slime-auto-start "2.5") -(defcustom slime-auto-start 'never - "Controls auto connection when information from lisp process is needed. -This doesn't mean it will connect right after Slime is loaded." - :group 'slime-mode - :type '(choice (const never) - (const always) - (const ask))) - -(defun slime-auto-start () - (cond ((or (eq slime-auto-start 'always) - (and (eq slime-auto-start 'ask) - (y-or-n-p "No connection. Start Slime? "))) - (save-window-excursion - (slime) - (while (not (slime-current-connection)) - (sleep-for 1)) - (slime-connection))) - (t nil))) - -(defcustom slime-auto-select-connection 'ask - "Controls auto selection after the default connection was closed." - :group 'slime-mode - :type '(choice (const never) - (const always) - (const ask))) - -(defun slime-auto-select-connection () - (let* ((c0 (car slime-net-processes)) - (c (cond ((eq slime-auto-select-connection 'always) c0) - ((and (eq slime-auto-select-connection 'ask) - (y-or-n-p - (format "No default connection selected. %s %s? " - "Switch to" (slime-connection-name c0)))) - c0)))) - (when c - (slime-select-connection c) - (message "Switching to connection: %s" (slime-connection-name c)) - c))) - -(defun slime-select-connection (process) - "Make PROCESS the default connection." - (setq slime-default-connection process)) - -(defvar slime-cycle-connections-hook nil) - -(defun slime-cycle-connections-within (connections) - (let* ((tail (or (cdr (member (slime-current-connection) connections)) - connections)) ; loop around to the beginning - (next (car tail))) - (slime-select-connection next) - (run-hooks 'slime-cycle-connections-hook) - (message "Lisp: %s %s" - (slime-connection-name next) - (process-contact next)))) - -(defun slime-next-connection () - "Change current slime connection, cycling through all connections." - (interactive) - (slime-cycle-connections-within (reverse slime-net-processes))) - -(define-obsolete-function-alias 'slime-cycle-connections - 'slime-next-connection "2.13") - -(defun slime-prev-connection () - "Change current slime connection, cycling through all connections. -Goes in reverse order, relative to `slime-next-connection'." - (interactive) - (slime-cycle-connections-within slime-net-processes)) - -(cl-defmacro slime-with-connection-buffer ((&optional process) &rest body) - "Execute BODY in the process-buffer of PROCESS. -If PROCESS is not specified, `slime-connection' is used. - -\(fn (&optional PROCESS) &body BODY))" - (declare (indent 1)) - `(with-current-buffer - (process-buffer (or ,process (slime-connection) - (error "No connection"))) - ,@body)) - -;;; Connection-local variables: - -(defmacro slime-def-connection-var (varname &rest initial-value-and-doc) - "Define a connection-local variable. -The value of the variable can be read by calling the function of the -same name (it must not be accessed directly). The accessor function is -setf-able. - -The actual variable bindings are stored buffer-local in the -process-buffers of connections. The accessor function refers to -the binding for `slime-connection'." - (declare (indent 2)) - (let ((real-var (intern (format "%s:connlocal" varname)))) - `(progn - ;; Variable - (make-variable-buffer-local - (defvar ,real-var ,@initial-value-and-doc)) - ;; Accessor - (defun ,varname (&optional process) - (slime-with-connection-buffer (process) ,real-var)) - ;; Setf - (defsetf ,varname (&optional process) (store) - `(slime-with-connection-buffer (,process) - (setq (\, (quote (\, real-var))) (\, store)))) - '(\, varname)))) - -(slime-def-connection-var slime-connection-number nil - "Serial number of a connection. -Bound in the connection's process-buffer.") - -(slime-def-connection-var slime-lisp-features '() - "The symbol-names of Lisp's *FEATURES*. -This is automatically synchronized from Lisp.") - -(slime-def-connection-var slime-lisp-modules '() - "The strings of Lisp's *MODULES*.") - -(slime-def-connection-var slime-pid nil - "The process id of the Lisp process.") - -(slime-def-connection-var slime-lisp-implementation-type nil - "The implementation type of the Lisp process.") - -(slime-def-connection-var slime-lisp-implementation-version nil - "The implementation type of the Lisp process.") - -(slime-def-connection-var slime-lisp-implementation-name nil - "The short name for the Lisp implementation.") - -(slime-def-connection-var slime-lisp-implementation-program nil - "The argv[0] of the process running the Lisp implementation.") - -(slime-def-connection-var slime-connection-name nil - "The short name for connection.") - -(slime-def-connection-var slime-inferior-process nil - "The inferior process for the connection if any.") - -(slime-def-connection-var slime-communication-style nil - "The communication style.") - -(slime-def-connection-var slime-machine-instance nil - "The name of the (remote) machine running the Lisp process.") - -(slime-def-connection-var slime-connection-coding-systems nil - "Coding systems supported by the Lisp process.") - -;;;;; Connection setup - -(defvar slime-connection-counter 0 - "The number of SLIME connections made. For generating serial numbers.") - -;;; Interface -(defun slime-setup-connection (process) - "Make a connection out of PROCESS." - (let ((slime-dispatching-connection process)) - (slime-init-connection-state process) - (slime-select-connection process) - process)) - -(defun slime-init-connection-state (proc) - "Initialize connection state in the process-buffer of PROC." - ;; To make life simpler for the user: if this is the only open - ;; connection then reset the connection counter. - (when (equal slime-net-processes (list proc)) - (setq slime-connection-counter 0)) - (slime-with-connection-buffer () - (setq slime-buffer-connection proc)) - (setf (slime-connection-number proc) (cl-incf slime-connection-counter)) - ;; We do the rest of our initialization asynchronously. The current - ;; function may be called from a timer, and if we setup the REPL - ;; from a timer then it mysteriously uses the wrong keymap for the - ;; first command. - (let ((slime-current-thread t)) - (slime-eval-async '(swank:connection-info) - (slime-curry #'slime-set-connection-info proc)))) - -(defun slime-set-connection-info (connection info) - "Initialize CONNECTION with INFO received from Lisp." - (let ((slime-dispatching-connection connection) - (slime-current-thread t)) - (cl-destructuring-bind (&key pid style lisp-implementation machine - features version modules encoding - &allow-other-keys) info - (slime-check-version version connection) - (setf (slime-pid) pid - (slime-communication-style) style - (slime-lisp-features) features - (slime-lisp-modules) modules) - (cl-destructuring-bind (&key type name version program) - lisp-implementation - (setf (slime-lisp-implementation-type) type - (slime-lisp-implementation-version) version - (slime-lisp-implementation-name) name - (slime-lisp-implementation-program) program - (slime-connection-name) (slime-generate-connection-name name))) - (cl-destructuring-bind (&key instance ((:type _)) ((:version _))) machine - (setf (slime-machine-instance) instance)) - (cl-destructuring-bind (&key coding-systems) encoding - (setf (slime-connection-coding-systems) coding-systems))) - (let ((args (let ((p (slime-inferior-process))) - (if p (slime-inferior-lisp-args p))))) - (let ((name (plist-get args ':name))) - (when name - (unless (string= (slime-lisp-implementation-name) name) - (setf (slime-connection-name) - (slime-generate-connection-name (symbol-name name)))))) - (slime-load-contribs) - (run-hooks 'slime-connected-hook) - (let ((fun (plist-get args ':init-function))) - (when fun (funcall fun)))) - (message "Connected. %s" (slime-random-words-of-encouragement)))) - -(defun slime-check-version (version conn) - (or (equal version slime-protocol-version) - (equal slime-protocol-version 'ignore) - (y-or-n-p - (format "Versions differ: %s (slime) vs. %s (swank). Continue? " - slime-protocol-version version)) - (slime-net-close conn) - (top-level))) - -(defun slime-generate-connection-name (lisp-name) - (cl-loop for i from 1 - for name = lisp-name then (format "%s<%d>" lisp-name i) - while (cl-find name slime-net-processes - :key #'slime-connection-name :test #'equal) - finally (cl-return name))) - -(defun slime-connection-close-hook (process) - (when (eq process slime-default-connection) - (when slime-net-processes - (slime-select-connection (car slime-net-processes)) - (message "Default connection closed; switched to #%S (%S)" - (slime-connection-number) - (slime-connection-name))))) - -(add-hook 'slime-net-process-close-hooks 'slime-connection-close-hook) - -;;;;; Commands on connections - -(defun slime-disconnect () - "Close the current connection." - (interactive) - (slime-net-close (slime-connection))) - -(defun slime-disconnect-all () - "Disconnect all connections." - (interactive) - (mapc #'slime-net-close slime-net-processes)) - -(defun slime-connection-port (connection) - "Return the remote port number of CONNECTION." - (cadr (process-contact connection))) - -(defun slime-process (&optional connection) - "Return the Lisp process for CONNECTION (default `slime-connection'). -Return nil if there's no process object for the connection." - (let ((proc (slime-inferior-process connection))) - (if (and proc - (memq (process-status proc) '(run stop))) - proc))) - -;; Non-macro version to keep the file byte-compilable. -(defun slime-set-inferior-process (connection process) - (setf (slime-inferior-process connection) process)) - -(defun slime-use-sigint-for-interrupt (&optional connection) - (let ((c (or connection (slime-connection)))) - (cl-ecase (slime-communication-style c) - ((:fd-handler nil) t) - ((:spawn :sigio) nil)))) - -(defvar slime-inhibit-pipelining t - "*If true, don't send background requests if Lisp is already busy.") - -(defun slime-background-activities-enabled-p () - (and (let ((con (slime-current-connection))) - (and con - (eq (process-status con) 'open))) - (or (not (slime-busy-p)) - (not slime-inhibit-pipelining)))) - - -;;;; Communication protocol - -;;;;; Emacs Lisp programming interface -;;; -;;; The programming interface for writing Emacs commands is based on -;;; remote procedure calls (RPCs). The basic operation is to ask Lisp -;;; to apply a named Lisp function to some arguments, then to do -;;; something with the result. -;;; -;;; Requests can be either synchronous (blocking) or asynchronous -;;; (with the result passed to a callback/continuation function). If -;;; an error occurs during the request then the debugger is entered -;;; before the result arrives -- for synchronous evaluations this -;;; requires a recursive edit. -;;; -;;; You should use asynchronous evaluations (`slime-eval-async') for -;;; most things. Reserve synchronous evaluations (`slime-eval') for -;;; the cases where blocking Emacs is really appropriate (like -;;; completion) and that shouldn't trigger errors (e.g. not evaluate -;;; user-entered code). -;;; -;;; We have the concept of the "current Lisp package". RPC requests -;;; always say what package the user is making them from and the Lisp -;;; side binds that package to *BUFFER-PACKAGE* to use as it sees -;;; fit. The current package is defined as the buffer-local value of -;;; `slime-buffer-package' if set, and otherwise the package named by -;;; the nearest IN-PACKAGE as found by text search (cl-first backwards, -;;; then forwards). -;;; -;;; Similarly we have the concept of the current thread, i.e. which -;;; thread in the Lisp process should handle the request. The current -;;; thread is determined solely by the buffer-local value of -;;; `slime-current-thread'. This is usually bound to t meaning "no -;;; particular thread", but can also be used to nominate a specific -;;; thread. The REPL and the debugger both use this feature to deal -;;; with specific threads. - -(make-variable-buffer-local - (defvar slime-current-thread t - "The id of the current thread on the Lisp side. -t means the \"current\" thread; -:repl-thread the thread that executes REPL requests; -fixnum a specific thread.")) - -(make-variable-buffer-local - (defvar slime-buffer-package nil - "The Lisp package associated with the current buffer. -This is set only in buffers bound to specific packages.")) - -;;; `slime-rex' is the RPC primitive which is used to implement both -;;; `slime-eval' and `slime-eval-async'. You can use it directly if -;;; you need to, but the others are usually more convenient. - -(cl-defmacro slime-rex ((&rest saved-vars) - (sexp &optional - (package '(slime-current-package)) - (thread 'slime-current-thread)) - &rest continuations) - "(slime-rex (VAR ...) (SEXP &optional PACKAGE THREAD) CLAUSES ...) - -Remote EXecute SEXP. - -VARs are a list of saved variables visible in the other forms. Each -VAR is either a symbol or a list (VAR INIT-VALUE). - -SEXP is evaluated and the princed version is sent to Lisp. - -PACKAGE is evaluated and Lisp binds *BUFFER-PACKAGE* to this package. -The default value is (slime-current-package). - -CLAUSES is a list of patterns with same syntax as -`slime-dcase'. The result of the evaluation of SEXP is -dispatched on CLAUSES. The result is either a sexp of the -form (:ok VALUE) or (:abort CONDITION). CLAUSES is executed -asynchronously. - -Note: don't use backquote syntax for SEXP, because various Emacs -versions cannot deal with that." - (declare (indent 2)) - (let ((result (cl-gensym))) - `(lexical-let ,(cl-loop for var in saved-vars - collect (cl-etypecase var - (symbol (list var var)) - (cons var))) - (slime-dispatch-event - (list :emacs-rex ,sexp ,package ,thread - (lambda (,result) - (slime-dcase ,result - ,@continuations))))))) - -;;; Interface -(defun slime-current-package () - "Return the Common Lisp package in the current context. -If `slime-buffer-package' has a value then return that, otherwise -search for and read an `in-package' form." - (or slime-buffer-package - (save-restriction - (widen) - (slime-find-buffer-package)))) - -(defvar slime-find-buffer-package-function 'slime-search-buffer-package - "*Function to use for `slime-find-buffer-package'. -The result should be the package-name (a string) -or nil if nothing suitable can be found.") - -(defun slime-find-buffer-package () - "Figure out which Lisp package the current buffer is associated with." - (funcall slime-find-buffer-package-function)) - -(make-variable-buffer-local - (defvar slime-package-cache nil - "Cons of the form (buffer-modified-tick . package)")) - -;; When modifing this code consider cases like: -;; (in-package #.*foo*) -;; (in-package #:cl) -;; (in-package :cl) -;; (in-package "CL") -;; (in-package |CL|) -;; (in-package #+ansi-cl :cl #-ansi-cl 'lisp) - -(defun slime-search-buffer-package () - (let ((case-fold-search t) - (regexp (concat "^(\\(cl:\\|common-lisp:\\)?in-package\\>[ \t']*" - "\\([^)]+\\)[ \t]*)"))) - (save-excursion - (when (or (re-search-backward regexp nil t) - (re-search-forward regexp nil t)) - (match-string-no-properties 2))))) - -;;; Synchronous requests are implemented in terms of asynchronous -;;; ones. We make an asynchronous request with a continuation function -;;; that `throw's its result up to a `catch' and then enter a loop of -;;; handling I/O until that happens. - -(defvar slime-stack-eval-tags nil - "List of stack-tags of continuations waiting on the stack.") - -(defun slime-eval (sexp &optional package) - "Evaluate EXPR on the superior Lisp and return the result." - (when (null package) (setq package (slime-current-package))) - (let* ((tag (cl-gensym (format "slime-result-%d-" - (1+ (slime-continuation-counter))))) - (slime-stack-eval-tags (cons tag slime-stack-eval-tags))) - (apply - #'funcall - (catch tag - (slime-rex (tag sexp) - (sexp package) - ((:ok value) - (unless (member tag slime-stack-eval-tags) - (error "Reply to canceled synchronous eval request tag=%S sexp=%S" - tag sexp)) - (throw tag (list #'identity value))) - ((:abort _condition) - (throw tag (list #'error "Synchronous Lisp Evaluation aborted")))) - (let ((debug-on-quit t) - (inhibit-quit nil) - (conn (slime-connection))) - (while t - (unless (eq (process-status conn) 'open) - (error "Lisp connection closed unexpectedly")) - (accept-process-output nil 0.01))))))) - -(defun slime-eval-async (sexp &optional cont package) - "Evaluate EXPR on the superior Lisp and call CONT with the result." - (declare (indent 1)) - (slime-rex (cont (buffer (current-buffer))) - (sexp (or package (slime-current-package))) - ((:ok result) - (when cont - (set-buffer buffer) - (funcall cont result))) - ((:abort condition) - (message "Evaluation aborted on %s." condition))) - ;; Guard against arbitrary return values which once upon a time - ;; showed up in the minibuffer spuriously (due to a bug in - ;; slime-autodoc.) If this ever happens again, returning the - ;; following will make debugging much easier: - :slime-eval-async) - -;;; These functions can be handy too: - -(defun slime-connected-p () - "Return true if the Swank connection is open." - (not (null slime-net-processes))) - -(defun slime-check-connected () - "Signal an error if we are not connected to Lisp." - (unless (slime-connected-p) - (error "Not connected. Use `%s' to start a Lisp." - (substitute-command-keys "\\[slime]")))) - -;; UNUSED -(defun slime-debugged-connection-p (conn) - ;; This previously was (AND (SLDB-DEBUGGED-CONTINUATIONS CONN) T), - ;; but an SLDB buffer may exist without having continuations - ;; attached to it, e.g. the one resulting from `slime-interrupt'. - (cl-loop for b in (sldb-buffers) - thereis (with-current-buffer b - (eq slime-buffer-connection conn)))) - -(defun slime-busy-p (&optional conn) - "True if Lisp has outstanding requests. -Debugged requests are ignored." - (let ((debugged (sldb-debugged-continuations (or conn (slime-connection))))) - (cl-remove-if (lambda (id) - (memq id debugged)) - (slime-rex-continuations) - :key #'car))) - -(defun slime-sync () - "Block until the most recent request has finished." - (when (slime-rex-continuations) - (let ((tag (caar (slime-rex-continuations)))) - (while (cl-find tag (slime-rex-continuations) :key #'car) - (accept-process-output nil 0.1))))) - -(defun slime-ping () - "Check that communication works." - (interactive) - (message "%s" (slime-eval "PONG"))) - -;;;;; Protocol event handler (cl-the guts) -;;; -;;; This is the protocol in all its glory. The input to this function -;;; is a protocol event that either originates within Emacs or arrived -;;; over the network from Lisp. -;;; -;;; Each event is a list beginning with a keyword and followed by -;;; arguments. The keyword identifies the type of event. Events -;;; originating from Emacs have names starting with :emacs- and events -;;; from Lisp don't. - -(slime-def-connection-var slime-rex-continuations '() - "List of (ID . FUNCTION) continuations waiting for RPC results.") - -(slime-def-connection-var slime-continuation-counter 0 - "Continuation serial number counter.") - -(defvar slime-event-hooks) - -(defun slime-dispatch-event (event &optional process) - (let ((slime-dispatching-connection (or process (slime-connection)))) - (or (run-hook-with-args-until-success 'slime-event-hooks event) - (slime-dcase event - ((:emacs-rex form package thread continuation) - (when (and (slime-use-sigint-for-interrupt) (slime-busy-p)) - (slime-display-oneliner "; pipelined request... %S" form)) - (let ((id (cl-incf (slime-continuation-counter)))) - (slime-send `(:emacs-rex ,form ,package ,thread ,id)) - (push (cons id continuation) (slime-rex-continuations)) - (slime--recompute-modelines))) - ((:return value id) - (let ((rec (assq id (slime-rex-continuations)))) - (cond (rec (setf (slime-rex-continuations) - (remove rec (slime-rex-continuations))) - (slime--recompute-modelines) - (funcall (cdr rec) value)) - (t - (error "Unexpected reply: %S %S" id value))))) - ((:debug-activate thread level &optional select) - (cl-assert thread) - (sldb-activate thread level select)) - ((:debug thread level condition restarts frames conts) - (cl-assert thread) - (sldb-setup thread level condition restarts frames conts)) - ((:debug-return thread level stepping) - (cl-assert thread) - (sldb-exit thread level stepping)) - ((:emacs-interrupt thread) - (slime-send `(:emacs-interrupt ,thread))) - ((:channel-send id msg) - (slime-channel-send (or (slime-find-channel id) - (error "Invalid channel id: %S %S" id msg)) - msg)) - ((:emacs-channel-send id msg) - (slime-send `(:emacs-channel-send ,id ,msg))) - ((:read-from-minibuffer thread tag prompt initial-value) - (slime-read-from-minibuffer-for-swank thread tag prompt - initial-value)) - ((:y-or-n-p thread tag question) - (slime-y-or-n-p thread tag question)) - ((:emacs-return-string thread tag string) - (slime-send `(:emacs-return-string ,thread ,tag ,string))) - ((:new-features features) - (setf (slime-lisp-features) features)) - ((:indentation-update info) - (slime-handle-indentation-update info)) - ((:eval-no-wait form) - (slime-check-eval-in-emacs-enabled) - (eval (read form))) - ((:eval thread tag form-string) - (slime-check-eval-in-emacs-enabled) - (slime-eval-for-lisp thread tag form-string)) - ((:ed-rpc-no-wait fn-name &rest args) - (let ((fn (intern-soft fn-name))) - (slime-check-rpc-allowed fn) - (apply fn args))) - ((:ed-rpc thread tag fn-name &rest args) - (slime-rpc-from-lisp thread tag (intern-soft fn-name) args)) - ((:emacs-return thread tag value) - (slime-send `(:emacs-return ,thread ,tag ,value))) - ((:ed what) - (slime-ed what)) - ((:inspect what thread tag) - (let ((hook (when (and thread tag) - (slime-curry #'slime-send - `(:emacs-return ,thread ,tag nil))))) - (slime-open-inspector what nil hook))) - ((:background-message message) - (slime-background-message "%s" message)) - ((:debug-condition thread message) - (cl-assert thread) - (message "%s" message)) - ((:ping thread tag) - (slime-send `(:emacs-pong ,thread ,tag))) - ((:reader-error packet condition) - (slime-with-popup-buffer ((slime-buffer-name :error)) - (princ (format "Invalid protocol message:\n%s\n\n%s" - condition packet)) - (goto-char (point-min))) - (error "Invalid protocol message")) - ((:invalid-rpc id message) - (setf (slime-rex-continuations) - (cl-remove id (slime-rex-continuations) :key #'car)) - (error "Invalid rpc: %s" message)) - ((:emacs-skipped-packet _pkg)) - ((:test-delay seconds) ; for testing only - (sit-for seconds)))))) - -(defun slime-send (sexp) - "Send SEXP directly over the wire on the current connection." - (slime-net-send sexp (slime-connection))) - -(defun slime-reset () - "Clear all pending continuations and erase connection buffer." - (interactive) - (setf (slime-rex-continuations) '()) - (mapc #'kill-buffer (sldb-buffers)) - (slime-with-connection-buffer () - (erase-buffer))) - -(defun slime-send-sigint () - (interactive) - (signal-process (slime-pid) 'SIGINT)) - -;;;;; Channels - -;;; A channel implements a set of operations. Those operations can be -;;; invoked by sending messages to the channel. Channels are used for -;;; protocols which can't be expressed naturally with RPCs, e.g. for -;;; streaming data over the wire. -;;; -;;; A channel can be "remote" or "local". Remote channels are -;;; represented by integers. Local channels are structures. Messages -;;; sent to a closed (remote) channel are ignored. - -(slime-def-connection-var slime-channels '() - "Alist of the form (ID . CHANNEL).") - -(slime-def-connection-var slime-channels-counter 0 - "Channel serial number counter.") - -(cl-defstruct (slime-channel (:conc-name slime-channel.) - (:constructor - slime-make-channel% (operations name id plist))) - operations name id plist) - -(defun slime-make-channel (operations &optional name) - (let* ((id (cl-incf (slime-channels-counter))) - (ch (slime-make-channel% operations name id nil))) - (push (cons id ch) (slime-channels)) - ch)) - -(defun slime-close-channel (channel) - (setf (slime-channel.operations channel) 'closed-channel) - (let ((probe (assq (slime-channel.id channel) (slime-channels)))) - (cond (probe (setf (slime-channels) (delete probe (slime-channels)))) - (t (error "Invalid channel: %s" channel))))) - -(defun slime-find-channel (id) - (cdr (assq id (slime-channels)))) - -(defun slime-channel-send (channel message) - (apply (or (gethash (car message) (slime-channel.operations channel)) - (error "Unsupported operation: %S %S" message channel)) - channel (cdr message))) - -(defun slime-channel-put (channel prop value) - (setf (slime-channel.plist channel) - (plist-put (slime-channel.plist channel) prop value))) - -(defun slime-channel-get (channel prop) - (plist-get (slime-channel.plist channel) prop)) - -(eval-and-compile - (defun slime-channel-method-table-name (type) - (intern (format "slime-%s-channel-methods" type)))) - -(defmacro slime-define-channel-type (name) - (declare (indent defun)) - (let ((tab (slime-channel-method-table-name name))) - `(progn - (defvar ,tab) - (setq ,tab (make-hash-table :size 10))))) - -(defmacro slime-define-channel-method (type method args &rest body) - (declare (indent 3) (debug (&define name sexp lambda-list - def-body))) - `(puthash ',method - (lambda (self . ,args) . ,body) - ,(slime-channel-method-table-name type))) - -(defun slime-send-to-remote-channel (channel-id msg) - (slime-dispatch-event `(:emacs-channel-send ,channel-id ,msg))) - -;;;;; Event logging to *slime-events* -;;; -;;; The *slime-events* buffer logs all protocol messages for debugging -;;; purposes. Optionally you can enable outline-mode in that buffer, -;;; which is convenient but slows things down significantly. - -(defvar slime-log-events t - "*Log protocol events to the *slime-events* buffer.") - -(defvar slime-outline-mode-in-events-buffer nil - "*Non-nil means use outline-mode in *slime-events*.") - -(defvar slime-event-buffer-name (slime-buffer-name :events) - "The name of the slime event buffer.") - -(defun slime-log-event (event) - "Record the fact that EVENT occurred." - (when slime-log-events - (with-current-buffer (slime-events-buffer) - ;; trim? - (when (> (buffer-size) 100000) - (goto-char (/ (buffer-size) 2)) - (re-search-forward "^(" nil t) - (delete-region (point-min) (point))) - (goto-char (point-max)) - (save-excursion - (slime-pprint-event event (current-buffer))) - (when (and (boundp 'outline-minor-mode) - outline-minor-mode) - (hide-entry)) - (goto-char (point-max))))) - -(defun slime-pprint-event (event buffer) - "Pretty print EVENT in BUFFER with limited depth and width." - (let ((print-length 20) - (print-level 6) - (pp-escape-newlines t)) - (pp event buffer))) - -(defun slime-events-buffer () - "Return or create the event log buffer." - (or (get-buffer slime-event-buffer-name) - (let ((buffer (get-buffer-create slime-event-buffer-name))) - (with-current-buffer buffer - (buffer-disable-undo) - (set (make-local-variable 'outline-regexp) "^(") - (set (make-local-variable 'comment-start) ";") - (set (make-local-variable 'comment-end) "") - (when slime-outline-mode-in-events-buffer - (outline-minor-mode))) - buffer))) - - -;;;;; Cleanup after a quit - -(defun slime-restart-inferior-lisp () - "Kill and restart the Lisp subprocess." - (interactive) - (cl-assert (slime-inferior-process) () "No inferior lisp process") - (slime-quit-lisp-internal (slime-connection) 'slime-restart-sentinel t)) - -(defun slime-restart-sentinel (process _message) - "Restart the inferior lisp process. -Also rearrange windows." - (cl-assert (process-status process) 'closed) - (let* ((proc (slime-inferior-process process)) - (args (slime-inferior-lisp-args proc)) - (buffer (buffer-name (process-buffer proc))) - ;;(buffer-window (get-buffer-window buffer)) - (new-proc (slime-start-lisp (plist-get args :program) - (plist-get args :program-args) - (plist-get args :env) - nil - buffer))) - (slime-net-close process) - (slime-inferior-connect new-proc args) - (switch-to-buffer buffer) - (goto-char (point-max)))) - - -;;;; Compilation and the creation of compiler-note annotations - -(defvar slime-highlight-compiler-notes t - "*When non-nil annotate buffers with compilation notes etc.") - -(defvar slime-before-compile-functions nil - "A list of function called before compiling a buffer or region. -The function receive two arguments: the beginning and the end of the -region that will be compiled.") - -;; FIXME: remove some of the options -(defcustom slime-compilation-finished-hook 'slime-maybe-show-compilation-log - "Hook called with a list of compiler notes after a compilation." - :group 'slime-mode - :type 'hook - :options '(slime-maybe-show-compilation-log - slime-create-compilation-log - slime-show-compilation-log - slime-maybe-list-compiler-notes - slime-list-compiler-notes - slime-maybe-show-xrefs-for-notes - slime-goto-first-note)) - -;; FIXME: I doubt that anybody uses this directly and it seems to be -;; only an ugly way to pass arguments. -(defvar slime-compilation-policy nil - "When non-nil compile with these optimization settings.") - -(defun slime-compute-policy (arg) - "Return the policy for the prefix argument ARG." - (let ((between (lambda (min n max) - (cond ((< n min) min) - ((> n max) max) - (t n))))) - (let ((n (prefix-numeric-value arg))) - (cond ((not arg) slime-compilation-policy) - ((cl-plusp n) `((cl:debug . ,(funcall between 0 n 3)))) - ((eq arg '-) `((cl:speed . 3))) - (t `((cl:speed . ,(funcall between 0 (abs n) 3)))))))) - -(cl-defstruct (slime-compilation-result - (:type list) - (:conc-name slime-compilation-result.) - (:constructor nil) - (:copier nil)) - tag notes successp duration loadp faslfile) - -(defvar slime-last-compilation-result nil - "The result of the most recently issued compilation.") - -(defun slime-compiler-notes () - "Return all compiler notes, warnings, and errors." - (slime-compilation-result.notes slime-last-compilation-result)) - -(defun slime-compile-and-load-file (&optional policy) - "Compile and load the buffer's file and highlight compiler notes. - -With (positive) prefix argument the file is compiled with maximal -debug settings (`C-u'). With negative prefix argument it is compiled for -speed (`M--'). If a numeric argument is passed set debug or speed settings -to it depending on its sign. - -Each source location that is the subject of a compiler note is -underlined and annotated with the relevant information. The commands -`slime-next-note' and `slime-previous-note' can be used to navigate -between compiler notes and to display their full details." - (interactive "P") - (slime-compile-file t (slime-compute-policy policy))) - -(defcustom slime-compile-file-options '() - "Plist of additional options that C-c C-k should pass to Lisp. -Currently only :fasl-directory is supported." - :group 'slime-lisp - :type '(plist :key-type symbol :value-type (file :must-match t))) - -(defun slime-compile-file (&optional load policy) - "Compile current buffer's file and highlight resulting compiler notes. - -See `slime-compile-and-load-file' for further details." - (interactive) - (unless buffer-file-name - (error "Buffer %s is not associated with a file." (buffer-name))) - (check-parens) - (slime--maybe-save-buffer) - (run-hook-with-args 'slime-before-compile-functions (point-min) (point-max)) - (let ((file (slime-to-lisp-filename (buffer-file-name))) - (options (slime-simplify-plist `(,@slime-compile-file-options - :policy ,policy)))) - (slime-eval-async - `(swank:compile-file-for-emacs ,file ,(if load t nil) - . ,(slime-hack-quotes options)) - #'slime-compilation-finished) - (message "Compiling %s..." file))) - -;; FIXME: compilation-save-buffers-predicate was introduced in 24.1 -(defun slime--maybe-save-buffer () - (let ((slime--this-buffer (current-buffer))) - (save-some-buffers (not compilation-ask-about-save) - (lambda () (eq (current-buffer) slime--this-buffer))))) - -(defun slime-hack-quotes (arglist) - ;; eval is the wrong primitive, we really want funcall - (cl-loop for arg in arglist collect `(quote ,arg))) - -(defun slime-simplify-plist (plist) - (cl-loop for (key val) on plist by #'cddr - append (cond ((null val) '()) - (t (list key val))))) - -(defun slime-compile-defun (&optional raw-prefix-arg) - "Compile the current toplevel form. - -With (positive) prefix argument the form is compiled with maximal -debug settings (`C-u'). With negative prefix argument it is compiled for -speed (`M--'). If a numeric argument is passed set debug or speed settings -to it depending on its sign." - (interactive "P") - (let ((slime-compilation-policy (slime-compute-policy raw-prefix-arg))) - (if (use-region-p) - (slime-compile-region (region-beginning) (region-end)) - (apply #'slime-compile-region (slime-region-for-defun-at-point))))) - -(defun slime-compile-region (start end) - "Compile the region." - (interactive "r") - ;; Check connection before running hooks things like - ;; slime-flash-region don't make much sense if there's no connection - (slime-connection) - (slime-flash-region start end) - (run-hook-with-args 'slime-before-compile-functions start end) - (slime-compile-string (buffer-substring-no-properties start end) start)) - -(defun slime-flash-region (start end &optional timeout) - "Temporarily highlight region from START to END." - (let ((overlay (make-overlay start end))) - (overlay-put overlay 'face 'secondary-selection) - (run-with-timer (or timeout 0.2) nil 'delete-overlay overlay))) - -(defun slime-compile-string (string start-offset) - (let* ((line (save-excursion - (goto-char start-offset) - (list (line-number-at-pos) (1+ (current-column))))) - (position `((:position ,start-offset) (:line ,@line)))) - (slime-eval-async - `(swank:compile-string-for-emacs - ,string - ,(buffer-name) - ',position - ,(if (buffer-file-name) (slime-to-lisp-filename (buffer-file-name))) - ',slime-compilation-policy) - #'slime-compilation-finished))) - -(defcustom slime-load-failed-fasl 'ask - "Which action to take when COMPILE-FILE set FAILURE-P to T. -NEVER doesn't load the fasl -ALWAYS loads the fasl -ASK asks the user." - :type '(choice (const never) - (const always) - (const ask))) - -(defun slime-load-failed-fasl-p () - (cl-ecase slime-load-failed-fasl - (never nil) - (always t) - (ask (y-or-n-p "Compilation failed. Load fasl file anyway? ")))) - -(defun slime-compilation-finished (result) - (with-struct (slime-compilation-result. notes duration successp - loadp faslfile) result - (setf slime-last-compilation-result result) - (slime-show-note-counts notes duration (cond ((not loadp) successp) - (t (and faslfile successp)))) - (when slime-highlight-compiler-notes - (slime-highlight-notes notes)) - (run-hook-with-args 'slime-compilation-finished-hook notes) - (when (and loadp faslfile - (or successp - (slime-load-failed-fasl-p))) - (slime-eval-async `(swank:load-file ,faslfile))))) - -(defun slime-show-note-counts (notes secs successp) - (message (concat - (cond (successp "Compilation finished") - (t (slime-add-face 'font-lock-warning-face - "Compilation failed"))) - (if (null notes) ". (No warnings)" ": ") - (mapconcat - (lambda (messages) - (cl-destructuring-bind (sev . notes) messages - (let ((len (length notes))) - (format "%d %s%s" len (slime-severity-label sev) - (if (= len 1) "" "s"))))) - (sort (slime-alistify notes #'slime-note.severity #'eq) - (lambda (x y) (slime-severity< (car y) (car x)))) - " ") - (if secs (format " [%.2f secs]" secs))))) - -(defun slime-highlight-notes (notes) - "Highlight compiler notes, warnings, and errors in the buffer." - (interactive (list (slime-compiler-notes))) - (with-temp-message "Highlighting notes..." - (save-excursion - (save-restriction - (widen) ; highlight notes on the whole buffer - (slime-remove-old-overlays) - (mapc #'slime-overlay-note (slime-merge-notes-for-display notes)))))) - -(defvar slime-note-overlays '() - "List of overlays created by `slime-make-note-overlay'") - -(defun slime-remove-old-overlays () - "Delete the existing note overlays." - (mapc #'delete-overlay slime-note-overlays) - (setq slime-note-overlays '())) - -(defun slime-filter-buffers (predicate) - "Return a list of where PREDICATE returns true. -PREDICATE is executed in the buffer to test." - (cl-remove-if-not (lambda (%buffer) - (with-current-buffer %buffer - (funcall predicate))) - (buffer-list))) - -;;;;; Recompilation. - -;; FIXME: This whole idea is questionable since it depends so -;; crucially on precise source-locs. - -(defun slime-recompile-location (location) - (save-excursion - (slime-goto-source-location location) - (slime-compile-defun))) - -(defun slime-recompile-locations (locations cont) - (slime-eval-async - `(swank:compile-multiple-strings-for-emacs - ',(cl-loop for loc in locations collect - (save-excursion - (slime-goto-source-location loc) - (cl-destructuring-bind (start end) - (slime-region-for-defun-at-point) - (list (buffer-substring-no-properties start end) - (buffer-name) - (slime-current-package) - start - (if (buffer-file-name) - (slime-to-lisp-filename (buffer-file-name)) - nil))))) - ',slime-compilation-policy) - cont)) - - -;;;;; Merging together compiler notes in the same location. - -(defun slime-merge-notes-for-display (notes) - "Merge together notes that refer to the same location. -This operation is \"lossy\" in the broad sense but not for display purposes." - (mapcar #'slime-merge-notes - (slime-group-similar 'slime-notes-in-same-location-p notes))) - -(defun slime-merge-notes (notes) - "Merge NOTES together. Keep the highest severity, concatenate the messages." - (let* ((new-severity (cl-reduce #'slime-most-severe notes - :key #'slime-note.severity)) - (new-message (mapconcat #'slime-note.message notes "\n"))) - (let ((new-note (cl-copy-list (car notes)))) - (setf (cl-getf new-note :message) new-message) - (setf (cl-getf new-note :severity) new-severity) - new-note))) - -(defun slime-notes-in-same-location-p (a b) - (equal (slime-note.location a) (slime-note.location b))) - - -;;;;; Compiler notes list - -(defun slime-one-line-ify (string) - "Return a single-line version of STRING. -Each newlines and following indentation is replaced by a single space." - (with-temp-buffer - (insert string) - (goto-char (point-min)) - (while (re-search-forward "\n[\n \t]*" nil t) - (replace-match " ")) - (buffer-string))) - -(defun slime-xrefs-for-notes (notes) - (let ((xrefs)) - (dolist (note notes) - (let* ((location (cl-getf note :location)) - (fn (cadr (assq :file (cdr location)))) - (file (assoc fn xrefs)) - (node - (list (format "%s: %s" - (cl-getf note :severity) - (slime-one-line-ify (cl-getf note :message))) - location))) - (when fn - (if file - (push node (cdr file)) - (setf xrefs (cl-acons fn (list node) xrefs)))))) - xrefs)) - -(defun slime-maybe-show-xrefs-for-notes (notes) - "Show the compiler notes NOTES if they come from more than one file." - (let ((xrefs (slime-xrefs-for-notes notes))) - (when (slime-length> xrefs 1) ; >1 file - (slime-show-xrefs - xrefs 'definition "Compiler notes" (slime-current-package))))) - -(defun slime-note-has-location-p (note) - (not (eq ':error (car (slime-note.location note))))) - -(defun slime-redefinition-note-p (note) - (eq (slime-note.severity note) :redefinition)) - -(defun slime-create-compilation-log (notes) - "Create a buffer for `next-error' to use." - (with-current-buffer (get-buffer-create (slime-buffer-name :compilation)) - (let ((inhibit-read-only t)) - (erase-buffer)) - (slime-insert-compilation-log notes) - (compilation-mode))) - -(defun slime-maybe-show-compilation-log (notes) - "Display the log on failed compilations or if NOTES is non-nil." - (slime-create-compilation-log notes) - (with-struct (slime-compilation-result. notes duration successp) - slime-last-compilation-result - (unless successp - (with-current-buffer (slime-buffer-name :compilation) - (let ((inhibit-read-only t)) - (goto-char (point-max)) - (insert "Compilation " (if successp "succeeded." "failed.")) - (goto-char (point-min)) - (display-buffer (current-buffer))))))) - -(defun slime-show-compilation-log (notes) - "Create and display the compilation log buffer." - (interactive (list (slime-compiler-notes))) - (slime-with-popup-buffer ((slime-buffer-name :compilation) - :mode 'compilation-mode) - (slime-insert-compilation-log notes))) - -(defun slime-insert-compilation-log (notes) - "Insert NOTES in format suitable for `compilation-mode'." - (cl-destructuring-bind (grouped-notes canonicalized-locs-table) - (slime-group-and-sort-notes notes) - (with-temp-message "Preparing compilation log..." - (let ((inhibit-read-only t) - (inhibit-modification-hooks t)) ; inefficient font-lock-hook - (insert (format "cd %s\n%d compiler notes:\n\n" - default-directory (length notes))) - (dolist (notes grouped-notes) - (let ((loc (gethash (cl-first notes) canonicalized-locs-table)) - (start (point))) - (insert (slime-canonicalized-location-to-string loc) ":") - (slime-insert-note-group notes) - (insert "\n") - (slime-make-note-overlay (cl-first notes) start (1- (point)))))) - (set (make-local-variable 'compilation-skip-threshold) 0) - (setq next-error-last-buffer (current-buffer))))) - -(defun slime-insert-note-group (notes) - "Insert a group of compiler messages." - (insert "\n") - (dolist (note notes) - (insert " " (slime-severity-label (slime-note.severity note)) ": ") - (let ((start (point))) - (insert (slime-note.message note)) - (let ((ctx (slime-note.source-context note))) - (if ctx (insert "\n" ctx))) - (slime-indent-block start 4)) - (insert "\n"))) - -(defun slime-indent-block (start column) - "If the region back to START isn't a one-liner indent it." - (when (< start (line-beginning-position)) - (save-excursion - (goto-char start) - (insert "\n")) - (slime-indent-rigidly start (point) column))) - -(defun slime-canonicalized-location (location) - "Return a list (FILE LINE COLUMN) for slime-location LOCATION. -This is quite an expensive operation so use carefully." - (save-excursion - (slime-goto-location-buffer (slime-location.buffer location)) - (save-excursion - (slime-goto-source-location location) - (list (or (buffer-file-name) (buffer-name)) - (save-restriction - (widen) - (line-number-at-pos)) - (1+ (current-column)))))) - -(defun slime-canonicalized-location-to-string (loc) - (if loc - (cl-destructuring-bind (filename line col) loc - (format "%s:%d:%d" - (cond ((not filename) "") - ((let ((rel (file-relative-name filename))) - (if (< (length rel) (length filename)) - rel))) - (t filename)) - line col)) - (format "Unknown location"))) - -(defun slime-goto-note-in-compilation-log (note) - "Find `note' in the compilation log and display it." - (with-current-buffer (get-buffer (slime-buffer-name :compilation)) - (let ((pos - (save-excursion - (goto-char (point-min)) - (cl-loop for overlay = (slime-find-next-note) - while overlay - for other-note = (overlay-get overlay 'slime-note) - when (slime-notes-in-same-location-p note other-note) - return (overlay-start overlay))))) - (when pos - (slime--display-position pos nil 0))))) - -(defun slime-group-and-sort-notes (notes) - "First sort, then group NOTES according to their canonicalized locs." - (let ((locs (make-hash-table :test #'eq))) - (mapc (lambda (note) - (let ((loc (slime-note.location note))) - (when (slime-location-p loc) - (puthash note (slime-canonicalized-location loc) locs)))) - notes) - (list (slime-group-similar - (lambda (n1 n2) - (equal (gethash n1 locs nil) (gethash n2 locs t))) - (let* ((bottom most-negative-fixnum) - (+default+ (list "" bottom bottom))) - (sort notes - (lambda (n1 n2) - (cl-destructuring-bind ((filename1 line1 col1) - (filename2 line2 col2)) - (list (gethash n1 locs +default+) - (gethash n2 locs +default+)) - (cond ((string-lessp filename1 filename2) t) - ((string-lessp filename2 filename1) nil) - ((< line1 line2) t) - ((> line1 line2) nil) - (t (< col1 col2)))))))) - locs))) - -(defun slime-note.severity (note) - (plist-get note :severity)) - -(defun slime-note.message (note) - (plist-get note :message)) - -(defun slime-note.source-context (note) - (plist-get note :source-context)) - -(defun slime-note.location (note) - (plist-get note :location)) - -(defun slime-severity-label (severity) - (cl-subseq (symbol-name severity) 1)) - - -;;;;; Adding a single compiler note - -(defun slime-overlay-note (note) - "Add a compiler note to the buffer as an overlay. -If an appropriate overlay for a compiler note in the same location -already exists then the new information is merged into it. Otherwise a -new overlay is created." - (cl-multiple-value-bind (start end) (slime-choose-overlay-region note) - (when start - (goto-char start) - (let ((severity (plist-get note :severity)) - (message (plist-get note :message)) - (overlay (slime-note-at-point))) - (if overlay - (slime-merge-note-into-overlay overlay severity message) - (slime-create-note-overlay note start end severity message)))))) - -(defun slime-make-note-overlay (note start end) - (let ((overlay (make-overlay start end))) - (overlay-put overlay 'slime-note note) - (push overlay slime-note-overlays) - overlay)) - -(defun slime-create-note-overlay (note start end severity message) - "Create an overlay representing a compiler note. -The overlay has several properties: - FACE - to underline the relevant text. - SEVERITY - for future reference :NOTE, :STYLE-WARNING, :WARNING, or :ERROR. - MOUSE-FACE - highlight the note when the mouse passes over. - HELP-ECHO - a string describing the note, both for future reference - and for display as a tooltip (due to the special - property name)." - (let ((overlay (slime-make-note-overlay note start end))) - (cl-macrolet ((putp (name value) `(overlay-put overlay ,name ,value))) - (putp 'face (slime-severity-face severity)) - (putp 'severity severity) - (putp 'mouse-face 'highlight) - (putp 'help-echo message) - overlay))) - -;; XXX Obsolete due to `slime-merge-notes-for-display' doing the -;; work already -- unless we decide to put several sets of notes on a -;; buffer without clearing in between, which only this handles. -(defun slime-merge-note-into-overlay (overlay severity message) - "Merge another compiler note into an existing overlay. -The help text describes both notes, and the highest of the severities -is kept." - (cl-macrolet ((putp (name value) `(overlay-put overlay ,name ,value)) - (getp (name) `(overlay-get overlay ,name))) - (putp 'severity (slime-most-severe severity (getp 'severity))) - (putp 'face (slime-severity-face (getp 'severity))) - (putp 'help-echo (concat (getp 'help-echo) "\n" message)))) - -(defun slime-choose-overlay-region (note) - "Choose the start and end points for an overlay over NOTE. -If the location's sexp is a list spanning multiple lines, then the -region around the first element is used. -Return nil if there's no useful source location." - (let ((location (slime-note.location note))) - (when location - (slime-dcase location - ((:error _)) ; do nothing - ((:location file pos _hints) - (cond ((eq (car file) ':source-form) nil) - ((eq (slime-note.severity note) :read-error) - (slime-choose-overlay-for-read-error location)) - ((equal pos '(:eof)) - (cl-values (1- (point-max)) (point-max))) - (t - (slime-choose-overlay-for-sexp location)))))))) - -(defun slime-choose-overlay-for-read-error (location) - (let ((pos (slime-location-offset location))) - (save-excursion - (goto-char pos) - (cond ((slime-symbol-at-point) - ;; package not found, &c. - (cl-values (slime-symbol-start-pos) (slime-symbol-end-pos))) - (t - (cl-values pos (1+ pos))))))) - -(defun slime-choose-overlay-for-sexp (location) - (slime-goto-source-location location) - (skip-chars-forward "'#`") - (let ((start (point))) - (ignore-errors (slime-forward-sexp)) - (if (slime-same-line-p start (point)) - (cl-values start (point)) - (cl-values (1+ start) - (progn (goto-char (1+ start)) - (ignore-errors (forward-sexp 1)) - (point)))))) - -(defun slime-same-line-p (pos1 pos2) - "Return t if buffer positions POS1 and POS2 are on the same line." - (save-excursion (goto-char (min pos1 pos2)) - (<= (max pos1 pos2) (line-end-position)))) - -(defvar slime-severity-face-plist - '(:error slime-error-face - :read-error slime-error-face - :warning slime-warning-face - :redefinition slime-style-warning-face - :style-warning slime-style-warning-face - :early-deprecation-warning slime-early-deprecation-warning-face - :late-deprecation-warning slime-late-deprecation-warning-face - :final-deprecation-warning slime-final-deprecation-warning-face - :note slime-note-face)) - -(defun slime-severity-face (severity) - "Return the name of the font-lock face representing SEVERITY." - (or (plist-get slime-severity-face-plist severity) - (error "No face for: %S" severity))) - -(defvar slime-severity-order - '(:note - :early-deprecation-warning :style-warning :redefinition - :late-deprecation-warning :final-deprecation-warning - :warning :error :read-error)) - -(defun slime-severity< (sev1 sev2) - "Return true if SEV1 is less severe than SEV2." - (< (cl-position sev1 slime-severity-order) - (cl-position sev2 slime-severity-order))) - -(defun slime-most-severe (sev1 sev2) - "Return the most servere of two conditions." - (if (slime-severity< sev1 sev2) sev2 sev1)) - -;; XXX: unused function -(defun slime-visit-source-path (source-path) - "Visit a full source path including the top-level form." - (goto-char (point-min)) - (slime-forward-source-path source-path)) - -(defun slime-forward-positioned-source-path (source-path) - "Move forward through a sourcepath from a fixed position. -The point is assumed to already be at the outermost sexp, making the -first element of the source-path redundant." - (ignore-errors - (slime-forward-sexp) - (beginning-of-defun)) - (let ((source-path (cdr source-path))) - (when source-path - (down-list 1) - (slime-forward-source-path source-path)))) - -(defun slime-forward-source-path (source-path) - (let ((origin (point))) - (condition-case nil - (progn - (cl-loop for (count . more) on source-path - do (progn - (slime-forward-sexp count) - (when more (down-list 1)))) - ;; Align at beginning - (slime-forward-sexp) - (beginning-of-sexp)) - (error (goto-char origin))))) - - -;; FIXME: really fix this mess -;; FIXME: the check shouln't be done here anyway but by M-. itself. - -(defun slime-filesystem-toplevel-directory () - ;; Windows doesn't have a true toplevel root directory, and all - ;; filenames look like "c:/foo/bar/quux.baz" from an Emacs - ;; perspective anyway. - (if (memq system-type '(ms-dos windows-nt)) - "" - (file-name-as-directory "/"))) - -(defun slime-file-name-merge-source-root (target-filename buffer-filename) - "Returns a filename where the source root directory of TARGET-FILENAME -is replaced with the source root directory of BUFFER-FILENAME. - -If no common source root could be determined, return NIL. - -E.g. (slime-file-name-merge-source-root - \"/usr/local/src/joe/upstream/sbcl/code/late-extensions.lisp\" - \"/usr/local/src/joe/hacked/sbcl/compiler/deftype.lisp\") - - ==> \"/usr/local/src/joe/hacked/sbcl/code/late-extensions.lisp\" -" - (let ((target-dirs (split-string (file-name-directory target-filename) - "/" t)) - (buffer-dirs (split-string (file-name-directory buffer-filename) - "/" t))) - ;; Starting from the end, we look if one of the TARGET-DIRS exists - ;; in BUFFER-FILENAME---if so, it and everything left from that dirname - ;; is considered to be the source root directory of BUFFER-FILENAME. - (cl-loop with target-suffix-dirs = nil - with buffer-dirs* = (reverse buffer-dirs) - with target-dirs* = (reverse target-dirs) - for target-dir in target-dirs* - do (let ((concat-dirs (lambda (dirs) - (apply #'concat - (mapcar #'file-name-as-directory - dirs)))) - (pos (cl-position target-dir buffer-dirs* - :test #'equal))) - (if (not pos) ; TARGET-DIR not in BUFFER-FILENAME? - (push target-dir target-suffix-dirs) - (let* ((target-suffix - ; PUSH reversed for us! - (funcall concat-dirs target-suffix-dirs)) - (buffer-root - (funcall concat-dirs - (reverse (nthcdr pos buffer-dirs*))))) - (cl-return (concat (slime-filesystem-toplevel-directory) - buffer-root - target-suffix - (file-name-nondirectory - target-filename))))))))) - -(defun slime-highlight-differences-in-dirname (base-dirname contrast-dirname) - "Returns a copy of BASE-DIRNAME where all differences between -BASE-DIRNAME and CONTRAST-DIRNAME are propertized with a -highlighting face." - (setq base-dirname (file-name-as-directory base-dirname)) - (setq contrast-dirname (file-name-as-directory contrast-dirname)) - (let ((base-dirs (split-string base-dirname "/" t)) - (contrast-dirs (split-string contrast-dirname "/" t))) - (with-temp-buffer - (cl-loop initially (insert (slime-filesystem-toplevel-directory)) - for base-dir in base-dirs do - (let ((pos (cl-position base-dir contrast-dirs :test #'equal))) - (cond ((not pos) - (slime-insert-propertized '(face highlight) base-dir) - (insert "/")) - (t - (insert (file-name-as-directory base-dir)) - (setq contrast-dirs - (nthcdr (1+ pos) contrast-dirs)))))) - (buffer-substring (point-min) (point-max))))) - -(defvar slime-warn-when-possibly-tricked-by-M-. t - "When working on multiple source trees simultaneously, the way -`slime-edit-definition' (M-.) works can sometimes be confusing: - -`M-.' visits locations that are present in the current Lisp image, -which works perfectly well as long as the image reflects the source -tree that one is currently looking at. - -In the other case, however, one can easily end up visiting a file -in a different source root directory (cl-the one corresponding to -the Lisp image), and is thus easily tricked to modify the wrong -source files---which can lead to quite some stressfull cursing. - -If this variable is T, a warning message is issued to raise the -user's attention whenever `M-.' is about opening a file in a -different source root that also exists in the source root -directory of the user's current buffer. - -There's no guarantee that all possible cases are covered, but -if you encounter such a warning, it's a strong indication that -you should check twice before modifying.") - -(defun slime-maybe-warn-for-different-source-root (target-filename - buffer-filename) - (let ((guessed-target (slime-file-name-merge-source-root target-filename - buffer-filename))) - (when (and guessed-target - (not (equal guessed-target target-filename)) - (file-exists-p guessed-target)) - (slime-message "Attention: This is `%s'." - (concat (slime-highlight-differences-in-dirname - (file-name-directory target-filename) - (file-name-directory guessed-target)) - (file-name-nondirectory target-filename)))))) - -(defun slime-check-location-filename-sanity (filename) - (when slime-warn-when-possibly-tricked-by-M-. - (cl-macrolet ((truename-safe (file) `(and ,file (file-truename ,file)))) - (let ((target-filename (truename-safe filename)) - (buffer-filename (truename-safe (buffer-file-name)))) - (when (and target-filename - buffer-filename) - (slime-maybe-warn-for-different-source-root - target-filename buffer-filename)))))) - -(defun slime-check-location-buffer-name-sanity (buffer-name) - (slime-check-location-filename-sanity - (buffer-file-name (get-buffer buffer-name)))) - - - -(defun slime-goto-location-buffer (buffer) - (slime-dcase buffer - ((:file filename) - (let ((filename (slime-from-lisp-filename filename))) - (slime-check-location-filename-sanity filename) - (set-buffer (or (get-file-buffer filename) - (let ((find-file-suppress-same-file-warnings t)) - (find-file-noselect filename)))))) - ((:buffer buffer-name) - (slime-check-location-buffer-name-sanity buffer-name) - (set-buffer buffer-name)) - ((:buffer-and-file buffer filename) - (slime-goto-location-buffer - (if (get-buffer buffer) - (list :buffer buffer) - (list :file filename)))) - ((:source-form string) - (set-buffer (get-buffer-create (slime-buffer-name :source))) - (erase-buffer) - (lisp-mode) - (insert string) - (goto-char (point-min))) - ((:zip file entry) - (require 'arc-mode) - (set-buffer (find-file-noselect file t)) - (goto-char (point-min)) - (re-search-forward (concat " " entry "$")) - (let ((buffer (save-window-excursion - (archive-extract) - (current-buffer)))) - (set-buffer buffer) - (goto-char (point-min)))))) - -(defun slime-goto-location-position (position) - (slime-dcase position - ((:position pos) - (goto-char 1) - (forward-char (- (1- pos) (slime-eol-conversion-fixup (1- pos))))) - ((:offset start offset) - (goto-char start) - (forward-char offset)) - ((:line start &optional column) - (goto-char (point-min)) - (beginning-of-line start) - (cond (column (move-to-column column)) - (t (skip-chars-forward " \t")))) - ((:function-name name) - (let ((case-fold-search t) - (name (regexp-quote name))) - (goto-char (point-min)) - (when (or - (re-search-forward - (format "\\s *(def\\(\\s_\\|\\sw\\)*\\s +(*%s\\S_" - (regexp-quote name)) nil t) - (re-search-forward - (format "[( \t]%s\\>\\(\\s \\|$\\)" name) nil t)) - (goto-char (match-beginning 0))))) - ((:method name specializers &rest qualifiers) - (slime-search-method-location name specializers qualifiers)) - ((:source-path source-path start-position) - (cond (start-position - (goto-char start-position) - (slime-forward-positioned-source-path source-path)) - (t - (slime-forward-source-path source-path)))) - ((:eof) - (goto-char (point-max))))) - -(defun slime-eol-conversion-fixup (n) - ;; Return the number of \r\n eol markers that we need to cross when - ;; moving N chars forward. N is the number of chars but \r\n are - ;; counted as 2 separate chars. - (cl-case (coding-system-eol-type buffer-file-coding-system) - ((1) - (save-excursion - (cl-do ((pos (+ (point) n)) - (count 0 (1+ count))) - ((>= (point) pos) (1- count)) - (forward-line) - (cl-decf pos)))) - (t 0))) - -(defun slime-search-method-location (name specializers qualifiers) - ;; Look for a sequence of words (def method name - ;; qualifers specializers don't look for "T" since it isn't requires - ;; (arg without t) as class is taken as such. - (let* ((case-fold-search t) - (name (regexp-quote name)) - (qualifiers (mapconcat (lambda (el) (concat ".+?\\<" el "\\>")) - qualifiers "")) - (specializers (mapconcat - (lambda (el) - (if (eql (aref el 0) ?\() - (let ((spec (read el))) - (if (eq (car spec) 'EQL) - (concat - ".*?\\n\\{0,1\\}.*?(EQL.*?'\\{0,1\\}" - (format "%s" (cl-second spec)) ")") - (error "don't understand specializer: %s,%s" - el (car spec)))) - (concat ".+?\n\\{0,1\\}.+?\\<" el "\\>"))) - (remove "T" specializers) "")) - (regexp (format "\\s *(def\\(\\s_\\|\\sw\\)*\\s +%s\\s +%s%s" name - qualifiers specializers))) - (or (and (re-search-forward regexp nil t) - (goto-char (match-beginning 0))) - ;; (slime-goto-location-position `(:function-name ,name)) - ))) - -(defun slime-search-call-site (fname) - "Move to the place where FNAME called. -Don't move if there are multiple or no calls in the current defun." - (save-restriction - (narrow-to-defun) - (let ((start (point)) - (regexp (concat "(" fname "[)\n \t]")) - (case-fold-search t)) - (cond ((and (re-search-forward regexp nil t) - (not (re-search-forward regexp nil t))) - (goto-char (match-beginning 0))) - (t (goto-char start)))))) - -(defun slime-search-edit-path (edit-path) - "Move to EDIT-PATH starting at the current toplevel form." - (when edit-path - (unless (and (= (current-column) 0) - (looking-at "(")) - (beginning-of-defun)) - (slime-forward-source-path edit-path))) - -(defun slime-goto-source-location (location &optional noerror) - "Move to the source location LOCATION. Several kinds of locations -are supported: - - ::= (:location ) - | (:error ) - - ::= (:file ) - | (:buffer ) - | (:buffer-and-file ) - | (:source-form ) - | (:zip ) - - ::= (:position ) ; 1 based (for files) - | (:offset ) ; start+offset (for C-c C-c) - | (:line []) - | (:function-name ) - | (:source-path ) - | (:method . )" - (slime-dcase location - ((:location buffer _position _hints) - (slime-goto-location-buffer buffer) - (let ((pos (slime-location-offset location))) - (cond ((and (<= (point-min) pos) (<= pos (point-max)))) - (widen-automatically (widen)) - (t - (error "Location is outside accessible part of buffer"))) - (goto-char pos))) - ((:error message) - (if noerror - (slime-message "%s" message) - (error "%s" message))))) - -(defun slime-location-offset (location) - "Return the position, as character number, of LOCATION." - (save-restriction - (widen) - (condition-case nil - (slime-goto-location-position - (slime-location.position location)) - (error (goto-char 0))) - (cl-destructuring-bind (&key snippet edit-path call-site align) - (slime-location.hints location) - (when snippet (slime-isearch snippet)) - (when edit-path (slime-search-edit-path edit-path)) - (when call-site (slime-search-call-site call-site)) - (when align - (slime-forward-sexp) - (beginning-of-sexp))) - (point))) - - -;;;;; Incremental search -;; -;; Search for the longest match of a string in either direction. -;; -;; This is for locating text that is expected to be near the point and -;; may have been modified (but hopefully not near the beginning!) - -(defun slime-isearch (string) - "Find the longest occurence of STRING either backwards of forwards. -If multiple matches exist the choose the one nearest to point." - (goto-char - (let* ((start (point)) - (len1 (slime-isearch-with-function 'search-forward string)) - (pos1 (point))) - (goto-char start) - (let* ((len2 (slime-isearch-with-function 'search-backward string)) - (pos2 (point))) - (cond ((and len1 len2) - ;; Have a match in both directions - (cond ((= len1 len2) - ;; Both are full matches -- choose the nearest. - (if (< (abs (- start pos1)) - (abs (- start pos2))) - pos1 pos2)) - ((> len1 len2) pos1) - ((> len2 len1) pos2))) - (len1 pos1) - (len2 pos2) - (t start)))))) - -(defun slime-isearch-with-function (search-fn string) - "Search for the longest substring of STRING using SEARCH-FN. -SEARCH-FN is either the symbol `search-forward' or `search-backward'." - (unless (string= string "") - (cl-loop for i from 1 to (length string) - while (funcall search-fn (substring string 0 i) nil t) - for match-data = (match-data) - do (cl-case search-fn - (search-forward (goto-char (match-beginning 0))) - (search-backward (goto-char (1+ (match-end 0))))) - finally (cl-return (if (null match-data) - nil - ;; Finish based on the last successful match - (store-match-data match-data) - (goto-char (match-beginning 0)) - (- (match-end 0) (match-beginning 0))))))) - - -;;;;; Visiting and navigating the overlays of compiler notes - -(defun slime-next-note () - "Go to and describe the next compiler note in the buffer." - (interactive) - (let ((here (point)) - (note (slime-find-next-note))) - (if note - (slime-show-note note) - (goto-char here) - (message "No next note.")))) - -(defun slime-previous-note () - "Go to and describe the previous compiler note in the buffer." - (interactive) - (let ((here (point)) - (note (slime-find-previous-note))) - (if note - (slime-show-note note) - (goto-char here) - (message "No previous note.")))) - -(defun slime-goto-first-note (&rest _) - "Go to the first note in the buffer." - (let ((point (point))) - (goto-char (point-min)) - (cond ((slime-find-next-note) - (slime-show-note (slime-note-at-point))) - (t (goto-char point))))) - -(defun slime-remove-notes () - "Remove compiler-note annotations from the current buffer." - (interactive) - (slime-remove-old-overlays)) - -(defun slime-show-note (overlay) - "Present the details of a compiler note to the user." - (slime-temporarily-highlight-note overlay) - (if (get-buffer-window (slime-buffer-name :compilation) t) - (slime-goto-note-in-compilation-log (overlay-get overlay 'slime-note)) - (let ((message (get-char-property (point) 'help-echo))) - (slime-message "%s" (if (zerop (length message)) "\"\"" message))))) - -;; FIXME: could probably use flash region -(defun slime-temporarily-highlight-note (overlay) - "Temporarily highlight a compiler note's overlay. -The highlighting is designed to both make the relevant source more -visible, and to highlight any further notes that are nested inside the -current one. - -The highlighting is automatically undone with a timer." - (run-with-timer 0.2 nil - #'overlay-put overlay 'face (overlay-get overlay 'face)) - (overlay-put overlay 'face 'slime-highlight-face)) - - -;;;;; Overlay lookup operations - -(defun slime-note-at-point () - "Return the overlay for a note starting at point, otherwise NIL." - (cl-find (point) (slime-note-overlays-at-point) - :key 'overlay-start)) - -(defun slime-note-overlay-p (overlay) - "Return true if OVERLAY represents a compiler note." - (overlay-get overlay 'slime-note)) - -(defun slime-note-overlays-at-point () - "Return a list of all note overlays that are under the point." - (cl-remove-if-not 'slime-note-overlay-p (overlays-at (point)))) - -(defun slime-find-next-note () - "Go to the next position with the `slime-note' text property. -Retuns the note overlay if such a position is found, otherwise nil." - (slime-search-property 'slime-note nil #'slime-note-at-point)) - -(defun slime-find-previous-note () - "Go to the next position with the `slime-note' text property. -Retuns the note overlay if such a position is found, otherwise nil." - (slime-search-property 'slime-note t #'slime-note-at-point)) - - -;;;; Arglist Display - -(defun slime-space (n) - "Insert a space and print some relevant information (function arglist). -Designed to be bound to the SPC key. Prefix argument can be used to insert -more than one space." - (interactive "p") - (self-insert-command n) - (slime-echo-arglist)) - -(put 'slime-space 'delete-selection t) ; for delete-section-mode & CUA - -(defun slime-echo-arglist () - (when (slime-background-activities-enabled-p) - (let ((op (slime-operator-before-point))) - (when op - (slime-eval-async `(swank:operator-arglist ,op - ,(slime-current-package)) - (lambda (arglist) - (when arglist - (slime-message "%s" arglist)))))))) - -(defvar slime-operator-before-point-function 'slime-lisp-operator-before-point) - -(defun slime-operator-before-point () - (funcall slime-operator-before-point-function)) - -(defun slime-lisp-operator-before-point () - (ignore-errors - (save-excursion - (backward-up-list 1) - (down-list 1) - (slime-symbol-at-point)))) - -;;;; Completion - -;; FIXME: use this in Emacs 24 -;;(define-obsolete-function-alias slime-complete-symbol completion-at-point) - -(defalias 'slime-complete-symbol #'completion-at-point) -(make-obsolete 'slime-complete-symbol #'completion-at-point "2015-10-17") - -;; This is the function that we add to -;; `completion-at-point-functions'. For backward-compatibilty we look -;; at `slime-complete-symbol-function' first. The indirection through -;; `slime-completion-at-point-functions' is used so that users don't -;; have to set `completion-at-point-functions' in every slime-like -;; buffer. -(defun slime--completion-at-point () - (cond (slime-complete-symbol-function - slime-complete-symbol-function) - (t - (run-hook-with-args-until-success - 'slime-completion-at-point-functions)))) - -(defun slime-setup-completion () - (add-hook 'completion-at-point-functions #'slime--completion-at-point nil t)) - -(defun slime-simple-completion-at-point () - "Complete the symbol at point. -Perform completion similar to `elisp-completion-at-point'." - (let* ((end (point)) - (beg (slime-symbol-start-pos))) - (list beg end (completion-table-dynamic #'slime-simple-completions)))) - -(defun slime-filename-completion () - "If point is at a string starting with \", complete it as filename. -Return nil if point is not at filename." - (when (save-excursion (re-search-backward "\"[^ \t\n]+\\=" - (max (point-min) (- (point) 1000)) - t)) - (let ((comint-completion-addsuffix '("/" . "\""))) - (comint-filename-completion)))) - -;; FIXME: for backward compatibility. Remove it one day -;; together with slime-complete-symbol-function. -(defun slime-simple-complete-symbol () - (let ((completion-at-point-functions '(slime-maybe-complete-as-filename - slime-simple-completion-at-point))) - (completion-at-point))) - -;; NOTE: the original idea was to bind this to TAB but that no longer -;; works as `completion-at-point' sets a transient keymap that -;; overrides TAB. So this is rather useless now. -(defun slime-indent-and-complete-symbol () - "Indent the current line and perform symbol completion. -First indent the line. If indenting doesn't move point, complete -the symbol. If there's no symbol at the point, show the arglist -for the most recently enclosed macro or function." - (interactive) - (let ((pos (point))) - (unless (get-text-property (line-beginning-position) 'slime-repl-prompt) - (lisp-indent-line)) - (when (= pos (point)) - (cond ((save-excursion (re-search-backward "[^() \n\t\r]+\\=" nil t)) - (completion-at-point)) - ((memq (char-before) '(?\t ?\ )) - (slime-echo-arglist)))))) - -(make-obsolete 'slime-indent-and-complete-symbol - "Set tab-always-indent to 'complete." - "2015-10-18") - -(defvar slime-minibuffer-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map minibuffer-local-map) - (define-key map "\t" #'completion-at-point) - (define-key map "\M-\t" #'completion-at-point) - map) - "Minibuffer keymap used for reading CL expressions.") - -(defvar slime-minibuffer-history '() - "History list of expressions read from the minibuffer.") - -(defun slime-minibuffer-setup-hook () - (cons (lexical-let ((package (slime-current-package)) - (connection (slime-connection))) - (lambda () - (setq slime-buffer-package package) - (setq slime-buffer-connection connection) - (set-syntax-table lisp-mode-syntax-table) - (slime-setup-completion))) - minibuffer-setup-hook)) - -(defun slime-read-from-minibuffer (prompt &optional initial-value history) - "Read a string from the minibuffer, prompting with PROMPT. -If INITIAL-VALUE is non-nil, it is inserted into the minibuffer before -reading input. The result is a string (\"\" if no input was given)." - (let ((minibuffer-setup-hook (slime-minibuffer-setup-hook))) - (read-from-minibuffer prompt initial-value slime-minibuffer-map - nil (or history 'slime-minibuffer-history)))) - -(defun slime-bogus-completion-alist (list) - "Make an alist out of list. -The same elements go in the CAR, and nil in the CDR. To support the -apparently very stupid `try-completions' interface, that wants an -alist but ignores CDRs." - (mapcar (lambda (x) (cons x nil)) list)) - -(defun slime-simple-completions (prefix) - (cl-destructuring-bind (completions _partial) - (let ((slime-current-thread t)) - (slime-eval - `(swank:simple-completions ,(substring-no-properties prefix) - ',(slime-current-package)))) - completions)) - - -;;;; Edit definition - -(defun slime-push-definition-stack () - "Add point to find-tag-marker-ring." - (require 'etags) - (ring-insert find-tag-marker-ring (point-marker))) - -(defun slime-pop-find-definition-stack () - "Pop the edit-definition stack and goto the location." - (interactive) - (pop-tag-mark)) - -(cl-defstruct (slime-xref (:conc-name slime-xref.) (:type list)) - dspec location) - -(cl-defstruct (slime-location (:conc-name slime-location.) (:type list) - (:constructor nil) - (:copier nil)) - tag buffer position hints) - -(defun slime-location-p (o) (and (consp o) (eq (car o) :location))) - -(defun slime-xref-has-location-p (xref) - (slime-location-p (slime-xref.location xref))) - -(defun make-slime-buffer-location (buffer-name position &optional hints) - `(:location (:buffer ,buffer-name) (:position ,position) - ,(when hints `(:hints ,hints)))) - -(defun make-slime-file-location (file-name position &optional hints) - `(:location (:file ,file-name) (:position ,position) - ,(when hints `(:hints ,hints)))) - -;;; The hooks are tried in order until one succeeds, otherwise the -;;; default implementation involving `slime-find-definitions-function' -;;; is used. The hooks are called with the same arguments as -;;; `slime-edit-definition'. -(defvar slime-edit-definition-hooks) - -(defun slime-edit-definition (&optional name where) - "Lookup the definition of the name at point. -If there's no name at point, or a prefix argument is given, then the -function name is prompted." - (interactive (list (or (and (not current-prefix-arg) - (slime-symbol-at-point)) - (slime-read-symbol-name "Edit Definition of: ")))) - ;; The hooks might search for a name in a different manner, so don't - ;; ask the user if it's missing before the hooks are run - (or (run-hook-with-args-until-success 'slime-edit-definition-hooks - name where) - (slime-edit-definition-cont (slime-find-definitions name) - name where))) - -(defun slime-edit-definition-cont (xrefs name where) - (cl-destructuring-bind (1loc file-alist) (slime-analyze-xrefs xrefs) - (cond ((null xrefs) - (error "No known definition for: %s (in %s)" - name (slime-current-package))) - (1loc - (slime-push-definition-stack) - (slime-pop-to-location (slime-xref.location (car xrefs)) where)) - ((slime-length= xrefs 1) ; ((:error "...")) - (error "%s" (cadr (slime-xref.location (car xrefs))))) - (t - (slime-push-definition-stack) - (slime-show-xrefs file-alist 'definition name - (slime-current-package)))))) - -(defvar slime-edit-uses-xrefs - '(:calls :macroexpands :binds :references :sets :specializes)) - -;;; FIXME. TODO: Would be nice to group the symbols (in each -;;; type-group) by their home-package. -(defun slime-edit-uses (symbol) - "Lookup all the uses of SYMBOL." - (interactive (list (slime-read-symbol-name "Edit Uses of: "))) - (slime-xrefs slime-edit-uses-xrefs - symbol - (lambda (xrefs type symbol package) - (cond - ((null xrefs) - (message "No xref information found for %s." symbol)) - ((and (slime-length= xrefs 1) ; one group - (slime-length= (cdar xrefs) 1)) ; one ref in group - (cl-destructuring-bind (_ (_ loc)) (cl-first xrefs) - (slime-push-definition-stack) - (slime-pop-to-location loc))) - (t - (slime-push-definition-stack) - (slime-show-xref-buffer xrefs type symbol package)))))) - -(defun slime-analyze-xrefs (xrefs) - "Find common filenames in XREFS. -Return a list (SINGLE-LOCATION FILE-ALIST). -SINGLE-LOCATION is true if all xrefs point to the same location. -FILE-ALIST is an alist of the form ((FILENAME . (XREF ...)) ...)." - (list (and xrefs - (let ((loc (slime-xref.location (car xrefs)))) - (and (slime-location-p loc) - (cl-every (lambda (x) (equal (slime-xref.location x) loc)) - (cdr xrefs))))) - (slime-alistify xrefs #'slime-xref-group #'equal))) - -(defun slime-xref-group (xref) - (cond ((slime-xref-has-location-p xref) - (slime-dcase (slime-location.buffer (slime-xref.location xref)) - ((:file filename) filename) - ((:buffer bufname) - (let ((buffer (get-buffer bufname))) - (if buffer - (format "%S" buffer) ; "#" - (format "%s (previously existing buffer)" bufname)))) - ((:buffer-and-file _buffer filename) filename) - ((:source-form _) "(S-Exp)") - ((:zip _zip entry) entry))) - (t - "(No location)"))) - -(defun slime-pop-to-location (location &optional where) - (slime-goto-source-location location) - (let ((point (point))) - (cl-ecase where - ((nil) (switch-to-buffer (current-buffer))) - (window (pop-to-buffer (current-buffer) t)) - (frame (let ((pop-up-frames t)) (pop-to-buffer (current-buffer) t)))) - (goto-char point))) - -(defun slime-postprocess-xref (original-xref) - "Process (for normalization purposes) an Xref comming directly -from SWANK before the rest of Slime sees it. In particular, -convert ETAGS based xrefs to actual file+position based -locations." - (if (not (slime-xref-has-location-p original-xref)) - (list original-xref) - (let ((loc (slime-xref.location original-xref))) - (slime-dcase (slime-location.buffer loc) - ((:etags-file tags-file) - (slime-dcase (slime-location.position loc) - ((:tag &rest tags) - (visit-tags-table tags-file) - (mapcar (lambda (xref) - (let ((old-dspec (slime-xref.dspec original-xref)) - (new-dspec (slime-xref.dspec xref))) - (setf (slime-xref.dspec xref) - (format "%s: %s" old-dspec new-dspec)) - xref)) - (cl-mapcan #'slime-etags-definitions tags))))) - (t - (list original-xref)))))) - -(defun slime-postprocess-xrefs (xrefs) - (cl-mapcan #'slime-postprocess-xref xrefs)) - -(defun slime-find-definitions (name) - "Find definitions for NAME." - (slime-postprocess-xrefs (funcall slime-find-definitions-function name))) - -(defun slime-find-definitions-rpc (name) - (slime-eval `(swank:find-definitions-for-emacs ,name))) - -(defun slime-edit-definition-other-window (name) - "Like `slime-edit-definition' but switch to the other window." - (interactive (list (slime-read-symbol-name "Symbol: "))) - (slime-edit-definition name 'window)) - -(defun slime-edit-definition-other-frame (name) - "Like `slime-edit-definition' but switch to the other window." - (interactive (list (slime-read-symbol-name "Symbol: "))) - (slime-edit-definition name 'frame)) - -(defun slime-edit-definition-with-etags (name) - (interactive (list (slime-read-symbol-name "Symbol: "))) - (let ((xrefs (slime-etags-definitions name))) - (cond (xrefs - (message "Using tag file...") - (slime-edit-definition-cont xrefs name nil)) - (t - (error "No known definition for: %s" name))))) - -(defun slime-etags-to-locations (name) - "Search for definitions matching `name' in the currently active -tags table. Return a possibly empty list of slime-locations." - (let ((locs '())) - (save-excursion - (let ((first-time t)) - (while (visit-tags-table-buffer (not first-time)) - (setq first-time nil) - (goto-char (point-min)) - (while (search-forward name nil t) - (beginning-of-line) - (cl-destructuring-bind (hint line &rest pos) (etags-snarf-tag) - (unless (eq hint t) ; hint==t if we are in a filename line - (push `(:location (:file ,(expand-file-name (file-of-tag))) - (:line ,line) - (:snippet ,hint)) - locs)))))) - (nreverse locs)))) - -(defun slime-etags-definitions (name) - "Search definitions matching NAME in the tags file. -The result is a (possibly empty) list of definitions." - (mapcar (lambda (loc) - (make-slime-xref :dspec (cl-second (slime-location.hints loc)) - :location loc)) - (slime-etags-to-locations name))) - -;;;;; first-change-hook - -(defun slime-first-change-hook () - "Notify Lisp that a source file's buffer has been modified." - ;; Be careful not to disturb anything! - ;; In particular if we muck up the match-data then query-replace - ;; breaks. -luke (26/Jul/2004) - (save-excursion - (save-match-data - (when (and (buffer-file-name) - (file-exists-p (buffer-file-name)) - (slime-background-activities-enabled-p)) - (let ((filename (slime-to-lisp-filename (buffer-file-name)))) - (slime-eval-async `(swank:buffer-first-change ,filename))))))) - -(defun slime-setup-first-change-hook () - (add-hook (make-local-variable 'first-change-hook) - 'slime-first-change-hook)) - -(add-hook 'slime-mode-hook 'slime-setup-first-change-hook) - - -;;;; Eval for Lisp - -(defun slime-lisp-readable-p (x) - (or (stringp x) - (memq x '(nil t)) - (integerp x) - (keywordp x) - (and (consp x) - (let ((l x)) - (while (consp l) - (slime-lisp-readable-p (car x)) - (setq l (cdr l))) - (slime-lisp-readable-p l))))) - -(defun slime--funcall-and-dispatch-result (thread tag fn &rest args) - (let ((ok nil) - (value nil) - (error nil)) - (unwind-protect - (condition-case err - (progn - (setq value (apply fn args)) - (setq ok t)) - ((debug error) - (setq error err))) - (let ((result (cond ((and ok - (not (slime-lisp-readable-p value))) - `(:unreadable ,(slime-prin1-to-string value))) - (ok `(:ok ,value)) - (error `(:error ,(symbol-name (car error)) - . ,(mapcar #'slime-prin1-to-string - (cdr error)))) - (t `(:abort))))) - (slime-dispatch-event `(:emacs-return ,thread ,tag ,result)))))) - -(defun slime-eval-for-lisp (thread tag form-string) - (slime--funcall-and-dispatch-result thread tag - (lambda (s) (eval (read s))) - form-string)) - -(defun slime-check-eval-in-emacs-enabled () - "Raise an error if `slime-enable-evaluate-in-emacs' isn't true." - (unless slime-enable-evaluate-in-emacs - (error (concat "slime-eval-in-emacs disabled for security. " - "Set `slime-enable-evaluate-in-emacs' true to enable it.")))) - - -;;;; RPC from Lisp - -(defmacro defslimefun (name arglist &rest body) - "Define a function via `cl-defun' that can be invoked from SWANK." - `(progn - (put ',name 'slime-rpc t) - (cl-defun ,name ,arglist ,@body))) - -(defun slime-rpc-allowed-p (fn) - (get fn 'slime-rpc)) - -(defun slime-check-rpc-allowed (fn) - "Raise an error if FN does not denote a function defined via -`defslimefun'." - (unless (slime-rpc-allowed-p fn) - (error "Lisp tried to RPC `%s', but it wasn't defined via `defslimefun'." - fn))) - -(defun slime-rpc-from-lisp (thread tag fn args) - (if (not (slime-rpc-allowed-p fn)) - (slime-dispatch-event '(:ed-rpc-forbidden ,thread ,tag ,fn)) - (apply #'slime--funcall-and-dispatch-result thread tag fn args))) - - -;;;; `ED' - -(defvar slime-ed-frame nil - "The frame used by `slime-ed'.") - -(defcustom slime-ed-use-dedicated-frame t - "*When non-nil, `slime-ed' will create and reuse a dedicated frame." - :type 'boolean - :group 'slime-mode) - -(defun slime-ed (what) - "Edit WHAT. - -WHAT can be: - A filename (string), - A list (:filename FILENAME &key LINE COLUMN POSITION), - A function name (:function-name STRING) - nil. - -This is for use in the implementation of COMMON-LISP:ED." - (when slime-ed-use-dedicated-frame - (unless (and slime-ed-frame (frame-live-p slime-ed-frame)) - (setq slime-ed-frame (make-frame))) - (select-frame slime-ed-frame)) - (when what - (slime-dcase what - ((:filename file &key line column position bytep) - (find-file (slime-from-lisp-filename file)) - (when line (slime-goto-line line)) - (when column (move-to-column column)) - (when position - (goto-char (if bytep - (byte-to-position position) - position)))) - ((:function-name name) - (slime-edit-definition name))))) - -(defun slime-goto-line (line-number) - "Move to line LINE-NUMBER (1-based). -This is similar to `goto-line' but without pushing the mark and -the display stuff that we neither need nor want." - (cl-assert (= (buffer-size) (- (point-max) (point-min))) () - "slime-goto-line in narrowed buffer") - (goto-char (point-min)) - (forward-line (1- line-number))) - -(defun slime-y-or-n-p (thread tag question) - (slime-dispatch-event `(:emacs-return ,thread ,tag ,(y-or-n-p question)))) - -(defun slime-read-from-minibuffer-for-swank (thread tag prompt initial-value) - (let ((answer (condition-case nil - (slime-read-from-minibuffer prompt initial-value) - (quit nil)))) - (slime-dispatch-event `(:emacs-return ,thread ,tag ,answer)))) - -;;;; Interactive evaluation. - -(defun slime-interactive-eval (string) - "Read and evaluate STRING and print value in minibuffer. - -Note: If a prefix argument is in effect then the result will be -inserted in the current buffer." - (interactive (list (slime-read-from-minibuffer "Slime Eval: "))) - (cl-case current-prefix-arg - ((nil) - (slime-eval-with-transcript `(swank:interactive-eval ,string))) - ((-) - (slime-eval-save string)) - (t - (slime-eval-print string)))) - -(defvar slime-transcript-start-hook nil - "Hook run before start an evalution.") -(defvar slime-transcript-stop-hook nil - "Hook run after finishing a evalution.") - -(defun slime-display-eval-result (value) - (slime-message "%s" value)) - -(defun slime-eval-with-transcript (form) - "Eval FORM in Lisp. Display output, if any." - (run-hooks 'slime-transcript-start-hook) - (slime-rex () (form) - ((:ok value) - (run-hooks 'slime-transcript-stop-hook) - (slime-display-eval-result value)) - ((:abort condition) - (run-hooks 'slime-transcript-stop-hook) - (message "Evaluation aborted on %s." condition)))) - -(defun slime-eval-print (string) - "Eval STRING in Lisp; insert any output and the result at point." - (slime-eval-async `(swank:eval-and-grab-output ,string) - (lambda (result) - (cl-destructuring-bind (output value) result - (push-mark) - (insert output value))))) - -(defun slime-eval-save (string) - "Evaluate STRING in Lisp and save the result in the kill ring." - (slime-eval-async `(swank:eval-and-grab-output ,string) - (lambda (result) - (cl-destructuring-bind (output value) result - (let ((string (concat output value))) - (kill-new string) - (message "Evaluation finished; pushed result to kill ring.")))))) - -(defun slime-eval-describe (form) - "Evaluate FORM in Lisp and display the result in a new buffer." - (slime-eval-async form (slime-rcurry #'slime-show-description - (slime-current-package)))) - -(defvar slime-description-autofocus nil - "If non-nil select description windows on display.") - -(defun slime-show-description (string package) - ;; So we can have one description buffer open per connection. Useful - ;; for comparing the output of DISASSEMBLE across implementations. - ;; FIXME: could easily be achieved with M-x rename-buffer - (let ((bufname (slime-buffer-name :description))) - (slime-with-popup-buffer (bufname :package package - :connection t - :select slime-description-autofocus) - (princ string) - (goto-char (point-min))))) - -(defun slime-last-expression () - (buffer-substring-no-properties - (save-excursion (backward-sexp) (point)) - (point))) - -(defun slime-eval-last-expression () - "Evaluate the expression preceding point." - (interactive) - (slime-interactive-eval (slime-last-expression))) - -(defun slime-eval-defun () - "Evaluate the current toplevel form. -Use `slime-re-evaluate-defvar' if the from starts with '(defvar'" - (interactive) - (let ((form (slime-defun-at-point))) - (cond ((string-match "^(defvar " form) - (slime-re-evaluate-defvar form)) - (t - (slime-interactive-eval form))))) - -(defun slime-eval-region (start end) - "Evaluate region." - (interactive "r") - (slime-eval-with-transcript - `(swank:interactive-eval-region - ,(buffer-substring-no-properties start end)))) - -(defun slime-pprint-eval-region (start end) - "Evaluate region; pprint the value in a buffer." - (interactive "r") - (slime-eval-describe - `(swank:pprint-eval - ,(buffer-substring-no-properties start end)))) - -(defun slime-eval-buffer () - "Evaluate the current buffer. -The value is printed in the echo area." - (interactive) - (slime-eval-region (point-min) (point-max))) - -(defun slime-re-evaluate-defvar (form) - "Force the re-evaluaton of the defvar form before point. - -First make the variable unbound, then evaluate the entire form." - (interactive (list (slime-last-expression))) - (slime-eval-with-transcript `(swank:re-evaluate-defvar ,form))) - -(defun slime-pprint-eval-last-expression () - "Evaluate the form before point; pprint the value in a buffer." - (interactive) - (slime-eval-describe `(swank:pprint-eval ,(slime-last-expression)))) - -(defun slime-eval-print-last-expression (string) - "Evaluate sexp before point; print value into the current buffer" - (interactive (list (slime-last-expression))) - (insert "\n") - (slime-eval-print string)) - -;;;; Edit Lisp value -;;; -(defun slime-edit-value (form-string) - "\\\ -Edit the value of a setf'able form in a new buffer. -The value is inserted into a temporary buffer for editing and then set -in Lisp when committed with \\[slime-edit-value-commit]." - (interactive - (list (slime-read-from-minibuffer "Edit value (evaluated): " - (slime-sexp-at-point)))) - (slime-eval-async `(swank:value-for-editing ,form-string) - (lexical-let ((form-string form-string) - (package (slime-current-package))) - (lambda (result) - (slime-edit-value-callback form-string result - package))))) - -(make-variable-buffer-local - (defvar slime-edit-form-string nil - "The form being edited by `slime-edit-value'.")) - -(define-minor-mode slime-edit-value-mode - "Mode for editing a Lisp value." - nil - " Edit-Value" - '(("\C-c\C-c" . slime-edit-value-commit))) - -(defun slime-edit-value-callback (form-string current-value package) - (let* ((name (generate-new-buffer-name (format "*Edit %s*" form-string))) - (buffer (slime-with-popup-buffer (name :package package - :connection t - :select t - :mode 'lisp-mode) - (slime-popup-buffer-mode -1) ; don't want binding of 'q' - (slime-mode 1) - (slime-edit-value-mode 1) - (setq slime-edit-form-string form-string) - (insert current-value) - (current-buffer)))) - (with-current-buffer buffer - (setq buffer-read-only nil) - (message "Type C-c C-c when done")))) - -(defun slime-edit-value-commit () - "Commit the edited value to the Lisp image. -\\(See `slime-edit-value'.)" - (interactive) - (if (null slime-edit-form-string) - (error "Not editing a value.") - (let ((value (buffer-substring-no-properties (point-min) (point-max)))) - (lexical-let ((buffer (current-buffer))) - (slime-eval-async `(swank:commit-edited-value ,slime-edit-form-string - ,value) - (lambda (_) - (with-current-buffer buffer - (quit-window t)))))))) - -;;;; Tracing - -(defun slime-untrace-all () - "Untrace all functions." - (interactive) - (slime-eval `(swank:untrace-all))) - -(defun slime-toggle-trace-fdefinition (spec) - "Toggle trace." - (interactive (list (slime-read-from-minibuffer - "(Un)trace: " (slime-symbol-at-point)))) - (message "%s" (slime-eval `(swank:swank-toggle-trace ,spec)))) - - - -(defun slime-disassemble-symbol (symbol-name) - "Display the disassembly for SYMBOL-NAME." - (interactive (list (slime-read-symbol-name "Disassemble: "))) - (slime-eval-describe `(swank:disassemble-form ,(concat "'" symbol-name)))) - -(defun slime-undefine-function (symbol-name) - "Unbind the function slot of SYMBOL-NAME." - (interactive (list (slime-read-symbol-name "fmakunbound: " t))) - (slime-eval-async `(swank:undefine-function ,symbol-name) - (lambda (result) (message "%s" result)))) - -(defun slime-unintern-symbol (symbol-name package) - "Unintern the symbol given with SYMBOL-NAME PACKAGE." - (interactive (list (slime-read-symbol-name "Unintern symbol: " t) - (slime-read-package-name "from package: " - (slime-current-package)))) - (slime-eval-async `(swank:unintern-symbol ,symbol-name ,package) - (lambda (result) (message "%s" result)))) - -(defun slime-delete-package (package-name) - "Delete the package with name PACKAGE-NAME." - (interactive (list (slime-read-package-name "Delete package: " - (slime-current-package)))) - (slime-eval-async `(cl:delete-package - (swank::guess-package ,package-name)))) - -(defun slime-load-file (filename) - "Load the Lisp file FILENAME." - (interactive (list - (read-file-name "Load file: " nil nil - nil (if (buffer-file-name) - (file-name-nondirectory - (buffer-file-name)))))) - (let ((lisp-filename (slime-to-lisp-filename (expand-file-name filename)))) - (slime-eval-with-transcript `(swank:load-file ,lisp-filename)))) - -(defvar slime-change-directory-hooks nil - "Hook run by `slime-change-directory'. -The functions are called with the new (absolute) directory.") - -(defun slime-change-directory (directory) - "Make DIRECTORY become Lisp's current directory. -Return whatever swank:set-default-directory returns." - (let ((dir (expand-file-name directory))) - (prog1 (slime-eval `(swank:set-default-directory - ,(slime-to-lisp-filename dir))) - (slime-with-connection-buffer nil (cd-absolute dir)) - (run-hook-with-args 'slime-change-directory-hooks dir)))) - -(defun slime-cd (directory) - "Make DIRECTORY become Lisp's current directory. -Return whatever swank:set-default-directory returns." - (interactive (list (read-directory-name "Directory: " nil nil t))) - (message "default-directory: %s" (slime-change-directory directory))) - -(defun slime-pwd () - "Show Lisp's default directory." - (interactive) - (message "Directory %s" (slime-eval `(swank:default-directory)))) - - -;;;; Profiling - -(defun slime-toggle-profile-fdefinition (fname-string) - "Toggle profiling for FNAME-STRING." - (interactive (list (slime-read-from-minibuffer - "(Un)Profile: " - (slime-symbol-at-point)))) - (slime-eval-async `(swank:toggle-profile-fdefinition ,fname-string) - (lambda (r) (message "%s" r)))) - -(defun slime-unprofile-all () - "Unprofile all functions." - (interactive) - (slime-eval-async '(swank:unprofile-all) - (lambda (r) (message "%s" r)))) - -(defun slime-profile-report () - "Print profile report." - (interactive) - (slime-eval-with-transcript '(swank:profile-report))) - -(defun slime-profile-reset () - "Reset profile counters." - (interactive) - (slime-eval-async (slime-eval `(swank:profile-reset)) - (lambda (r) (message "%s" r)))) - -(defun slime-profiled-functions () - "Return list of names of currently profiled functions." - (interactive) - (slime-eval-async `(swank:profiled-functions) - (lambda (r) (message "%s" r)))) - -(defun slime-profile-package (package callers methods) - "Profile all functions in PACKAGE. -If CALLER is non-nil names have counts of the most common calling -functions recorded. -If METHODS is non-nil, profile all methods of all generic function -having names in the given package." - (interactive (list (slime-read-package-name "Package: ") - (y-or-n-p "Record the most common callers? ") - (y-or-n-p "Profile methods? "))) - (slime-eval-async `(swank:swank-profile-package ,package ,callers ,methods) - (lambda (r) (message "%s" r)))) - -(defun slime-profile-by-substring (substring &optional package) - "Profile all functions which names contain SUBSTRING. -If PACKAGE is NIL, then search in all packages." - (interactive (list - (slime-read-from-minibuffer - "Profile by matching substring: " - (slime-symbol-at-point)) - (slime-read-package-name "Package (RET for all packages): "))) - (let ((package (unless (equal package "") package))) - (slime-eval-async `(swank:profile-by-substring ,substring ,package) - (lambda (r) (message "%s" r)) ))) - -;;;; Documentation - -(defvar slime-documentation-lookup-function - 'slime-hyperspec-lookup) - -(defun slime-documentation-lookup () - "Generalized documentation lookup. Defaults to hyperspec lookup." - (interactive) - (call-interactively slime-documentation-lookup-function)) - -(defun slime-hyperspec-lookup (symbol-name) - "A wrapper for `hyperspec-lookup'" - (interactive (list (common-lisp-hyperspec-read-symbol-name - (slime-symbol-at-point)))) - (hyperspec-lookup symbol-name)) - -(defun slime-describe-symbol (symbol-name) - "Describe the symbol at point." - (interactive (list (slime-read-symbol-name "Describe symbol: "))) - (when (not symbol-name) - (error "No symbol given")) - (slime-eval-describe `(swank:describe-symbol ,symbol-name))) - -(defun slime-documentation (symbol-name) - "Display function- or symbol-documentation for SYMBOL-NAME." - (interactive (list (slime-read-symbol-name "Documentation for symbol: "))) - (when (not symbol-name) - (error "No symbol given")) - (slime-eval-describe - `(swank:documentation-symbol ,symbol-name))) - -(defun slime-describe-function (symbol-name) - (interactive (list (slime-read-symbol-name "Describe symbol's function: "))) - (when (not symbol-name) - (error "No symbol given")) - (slime-eval-describe `(swank:describe-function ,symbol-name))) - -(defface slime-apropos-symbol - '((t (:inherit bold))) - "Face for the symbol name in Apropos output." - :group 'slime) - -(defface slime-apropos-label - '((t (:inherit italic))) - "Face for label (`Function', `Variable' ...) in Apropos output." - :group 'slime) - -(defun slime-apropos-summary (string case-sensitive-p package only-external-p) - "Return a short description for the performed apropos search." - (concat (if case-sensitive-p "Case-sensitive " "") - "Apropos for " - (format "%S" string) - (if package (format " in package %S" package) "") - (if only-external-p " (external symbols only)" ""))) - -(defun slime-apropos (string &optional only-external-p package - case-sensitive-p) - "Show all bound symbols whose names match STRING. With prefix -arg, you're interactively asked for parameters of the search." - (interactive - (if current-prefix-arg - (list (read-string "SLIME Apropos: ") - (y-or-n-p "External symbols only? ") - (let ((pkg (slime-read-package-name "Package: "))) - (if (string= pkg "") nil pkg)) - (y-or-n-p "Case-sensitive? ")) - (list (read-string "SLIME Apropos: ") t nil nil))) - (let ((buffer-package (or package (slime-current-package)))) - (slime-eval-async - `(swank:apropos-list-for-emacs ,string ,only-external-p - ,case-sensitive-p ',package) - (slime-rcurry #'slime-show-apropos string buffer-package - (slime-apropos-summary string case-sensitive-p - package only-external-p))))) - -(defun slime-apropos-all () - "Shortcut for (slime-apropos nil nil)" - (interactive) - (slime-apropos (read-string "SLIME Apropos: ") nil nil)) - -(defun slime-apropos-package (package &optional internal) - "Show apropos listing for symbols in PACKAGE. -With prefix argument include internal symbols." - (interactive (list (let ((pkg (slime-read-package-name "Package: "))) - (if (string= pkg "") (slime-current-package) pkg)) - current-prefix-arg)) - (slime-apropos "" (not internal) package)) - -(autoload 'apropos-mode "apropos") -(defun slime-show-apropos (plists string package summary) - (if (null plists) - (message "No apropos matches for %S" string) - (slime-with-popup-buffer ((slime-buffer-name :apropos) - :package package :connection t - :mode 'apropos-mode) - (if (boundp 'header-line-format) - (setq header-line-format summary) - (insert summary "\n\n")) - (slime-set-truncate-lines) - (slime-print-apropos plists) - (set-syntax-table lisp-mode-syntax-table) - (goto-char (point-min))))) - -(defvar slime-apropos-namespaces - '((:variable "Variable") - (:function "Function") - (:generic-function "Generic Function") - (:macro "Macro") - (:special-operator "Special Operator") - (:setf "Setf") - (:type "Type") - (:class "Class") - (:alien-type "Alien type") - (:alien-struct "Alien struct") - (:alien-union "Alien type") - (:alien-enum "Alien enum"))) - -(defun slime-print-apropos (plists) - (dolist (plist plists) - (let ((designator (plist-get plist :designator))) - (cl-assert designator) - (slime-insert-propertized `(face slime-apropos-symbol) designator)) - (terpri) - (cl-loop for (prop value) on plist by #'cddr - unless (eq prop :designator) do - (let ((namespace (cadr (or (assq prop slime-apropos-namespaces) - (error "Unknown property: %S" prop)))) - (start (point))) - (princ " ") - (slime-insert-propertized `(face slime-apropos-label) namespace) - (princ ": ") - (princ (cl-etypecase value - (string value) - ((member nil :not-documented) "(not documented)"))) - (add-text-properties - start (point) - (list 'type prop 'action 'slime-call-describer - 'button t 'apropos-label namespace - 'item (plist-get plist :designator))) - (terpri))))) - -(defun slime-call-describer (arg) - (let* ((pos (if (markerp arg) arg (point))) - (type (get-text-property pos 'type)) - (item (get-text-property pos 'item))) - (slime-eval-describe `(swank:describe-definition-for-emacs ,item ,type)))) - -(defun slime-info () - "Open Slime manual" - (interactive) - (let ((file (expand-file-name "doc/slime.info" slime-path))) - (if (file-exists-p file) - (info file) - (message "No slime.info, run `make slime.info' in %s" - (expand-file-name "doc/" slime-path))))) - - -;;;; XREF: cross-referencing - -(defvar slime-xref-mode-map) - -(define-derived-mode slime-xref-mode lisp-mode "Xref" - "slime-xref-mode: Major mode for cross-referencing. -\\\ -The most important commands: -\\[slime-xref-quit] - Dismiss buffer. -\\[slime-show-xref] - Display referenced source and keep xref window. -\\[slime-goto-xref] - Jump to referenced source and dismiss xref window. - -\\{slime-xref-mode-map} -\\{slime-popup-buffer-mode-map} -" - (slime-popup-buffer-mode) - (setq font-lock-defaults nil) - (setq delayed-mode-hooks nil) - (slime-mode -1)) - -(slime-define-keys slime-xref-mode-map - ((kbd "RET") 'slime-goto-xref) - ((kbd "SPC") 'slime-goto-xref) - ("v" 'slime-show-xref) - ("n" 'slime-xref-next-line) - ("p" 'slime-xref-prev-line) - ("." 'slime-xref-next-line) - ("," 'slime-xref-prev-line) - ("\C-c\C-c" 'slime-recompile-xref) - ("\C-c\C-k" 'slime-recompile-all-xrefs) - ("\M-," 'slime-xref-retract) - ([remap next-line] 'slime-xref-next-line) - ([remap previous-line] 'slime-xref-prev-line) - ) - - -;;;;; XREF results buffer and window management - -(cl-defmacro slime-with-xref-buffer ((_xref-type _symbol &optional package) - &body body) - "Execute BODY in a xref buffer, then show that buffer." - (declare (indent 1)) - `(slime-with-popup-buffer ((slime-buffer-name :xref) - :package ,package - :connection t - :select t - :mode 'slime-xref-mode) - (slime-set-truncate-lines) - ,@body)) - -(defun slime-insert-xrefs (xref-alist) - "Insert XREF-ALIST in the current-buffer. -XREF-ALIST is of the form ((GROUP . ((LABEL LOCATION) ...)) ...). -GROUP and LABEL are for decoration purposes. LOCATION is a -source-location." - (cl-loop for (group . refs) in xref-alist do - (slime-insert-propertized '(face bold) group "\n") - (cl-loop for (label location) in refs do - (slime-insert-propertized - (list 'slime-location location - 'face 'font-lock-keyword-face) - " " (slime-one-line-ify label) "\n"))) - ;; Remove the final newline to prevent accidental window-scrolling - (backward-delete-char 1)) - -(defun slime-xref-next-line () - (interactive) - (slime-xref-show-location (slime-search-property 'slime-location))) - -(defun slime-xref-prev-line () - (interactive) - (slime-xref-show-location (slime-search-property 'slime-location t))) - -(defun slime-xref-show-location (loc) - (cl-ecase (car loc) - (:location (slime-show-source-location loc nil 1)) - (:error (message "%s" (cadr loc))) - ((nil)))) - -(defvar slime-next-location-function nil - "Function to call for going to the next location.") - -(defvar slime-previous-location-function nil - "Function to call for going to the previous location.") - -(defvar slime-xref-last-buffer nil - "The most recent XREF results buffer. -This is used by `slime-goto-next-xref'") - -(defun slime-show-xref-buffer (xrefs _type _symbol package) - (slime-with-xref-buffer (_type _symbol package) - (slime-insert-xrefs xrefs) - (setq slime-next-location-function 'slime-goto-next-xref) - (setq slime-previous-location-function 'slime-goto-previous-xref) - (setq slime-xref-last-buffer (current-buffer)) - (goto-char (point-min)))) - -(defun slime-show-xrefs (xrefs type symbol package) - "Show the results of an XREF query." - (if (null xrefs) - (message "No references found for %s." symbol) - (slime-show-xref-buffer xrefs type symbol package))) - - -;;;;; XREF commands - -(defun slime-who-calls (symbol) - "Show all known callers of the function SYMBOL." - (interactive (list (slime-read-symbol-name "Who calls: " t))) - (slime-xref :calls symbol)) - -(defun slime-calls-who (symbol) - "Show all known functions called by the function SYMBOL." - (interactive (list (slime-read-symbol-name "Who calls: " t))) - (slime-xref :calls-who symbol)) - -(defun slime-who-references (symbol) - "Show all known referrers of the global variable SYMBOL." - (interactive (list (slime-read-symbol-name "Who references: " t))) - (slime-xref :references symbol)) - -(defun slime-who-binds (symbol) - "Show all known binders of the global variable SYMBOL." - (interactive (list (slime-read-symbol-name "Who binds: " t))) - (slime-xref :binds symbol)) - -(defun slime-who-sets (symbol) - "Show all known setters of the global variable SYMBOL." - (interactive (list (slime-read-symbol-name "Who sets: " t))) - (slime-xref :sets symbol)) - -(defun slime-who-macroexpands (symbol) - "Show all known expanders of the macro SYMBOL." - (interactive (list (slime-read-symbol-name "Who macroexpands: " t))) - (slime-xref :macroexpands symbol)) - -(defun slime-who-specializes (symbol) - "Show all known methods specialized on class SYMBOL." - (interactive (list (slime-read-symbol-name "Who specializes: " t))) - (slime-xref :specializes symbol)) - -(defun slime-list-callers (symbol-name) - "List the callers of SYMBOL-NAME in a xref window." - (interactive (list (slime-read-symbol-name "List callers: "))) - (slime-xref :callers symbol-name)) - -(defun slime-list-callees (symbol-name) - "List the callees of SYMBOL-NAME in a xref window." - (interactive (list (slime-read-symbol-name "List callees: "))) - (slime-xref :callees symbol-name)) - -;; FIXME: whats the call (slime-postprocess-xrefs result) good for? -(defun slime-xref (type symbol &optional continuation) - "Make an XREF request to Lisp." - (slime-eval-async - `(swank:xref ',type ',symbol) - (slime-rcurry (lambda (result type symbol package cont) - (slime-check-xref-implemented type result) - (let* ((_xrefs (slime-postprocess-xrefs result)) - (file-alist (cadr (slime-analyze-xrefs result)))) - (funcall (or cont 'slime-show-xrefs) - file-alist type symbol package))) - type - symbol - (slime-current-package) - continuation))) - -(defun slime-check-xref-implemented (type xrefs) - (when (eq xrefs :not-implemented) - (error "%s is not implemented yet on %s." - (slime-xref-type type) - (slime-lisp-implementation-name)))) - -(defun slime-xref-type (type) - (format "who-%s" (slime-cl-symbol-name type))) - -(defun slime-xrefs (types symbol &optional continuation) - "Make multiple XREF requests at once." - (slime-eval-async - `(swank:xrefs ',types ',symbol) - #'(lambda (result) - (funcall (or continuation - #'slime-show-xrefs) - (cl-loop for (key . val) in result - collect (cons (slime-xref-type key) val)) - types symbol (slime-current-package))))) - - -;;;;; XREF navigation - -(defun slime-xref-location-at-point () - (save-excursion - ;; When the end of the last line is at (point-max) we can't find - ;; the text property there. Going to bol avoids this problem. - (beginning-of-line 1) - (or (get-text-property (point) 'slime-location) - (error "No reference at point.")))) - -(defun slime-xref-dspec-at-point () - (save-excursion - (beginning-of-line 1) - (with-syntax-table lisp-mode-syntax-table - (forward-sexp) ; skip initial whitespaces - (backward-sexp) - (slime-sexp-at-point)))) - -(defun slime-all-xrefs () - (let ((xrefs nil)) - (save-excursion - (goto-char (point-min)) - (while (zerop (forward-line 1)) - (let ((loc (get-text-property (point) 'slime-location))) - (when loc - (let* ((dspec (slime-xref-dspec-at-point)) - (xref (make-slime-xref :dspec dspec :location loc))) - (push xref xrefs)))))) - (nreverse xrefs))) - -(defun slime-goto-xref () - "Goto the cross-referenced location at point." - (interactive) - (slime-show-xref) - (quit-window)) - -(defun slime-show-xref () - "Display the xref at point in the other window." - (interactive) - (let ((location (slime-xref-location-at-point))) - (slime-show-source-location location t 1))) - -(defun slime-goto-next-xref (&optional backward) - "Goto the next cross-reference location." - (if (not (buffer-live-p slime-xref-last-buffer)) - (error "No XREF buffer alive.") - (cl-destructuring-bind (location pos) - (with-current-buffer slime-xref-last-buffer - (list (slime-search-property 'slime-location backward) - (point))) - (cond ((slime-location-p location) - (slime-pop-to-location location) - ;; We do this here because changing the location can take - ;; a while when Emacs needs to read a file from disk. - (with-current-buffer slime-xref-last-buffer - (goto-char pos) - (slime-highlight-line 0.35))) - ((null location) - (message (if backward "No previous xref" "No next xref."))) - (t ; error location - (slime-goto-next-xref backward)))))) - -(defun slime-goto-previous-xref () - "Goto the previous cross-reference location." - (slime-goto-next-xref t)) - -(defun slime-search-property (prop &optional backward prop-value-fn) - "Search the next text range where PROP is non-nil. -Return the value of PROP. -If BACKWARD is non-nil, search backward. -If PROP-VALUE-FN is non-nil use it to extract PROP's value." - (let ((next-candidate (if backward - #'previous-single-char-property-change - #'next-single-char-property-change)) - (prop-value-fn (or prop-value-fn - (lambda () - (get-text-property (point) prop)))) - (start (point)) - (prop-value)) - (while (progn - (goto-char (funcall next-candidate (point) prop)) - (not (or (setq prop-value (funcall prop-value-fn)) - (eobp) - (bobp))))) - (cond (prop-value) - (t (goto-char start) nil)))) - -(defun slime-next-location () - "Go to the next location, depending on context. -When displaying XREF information, this goes to the next reference." - (interactive) - (when (null slime-next-location-function) - (error "No context for finding locations.")) - (funcall slime-next-location-function)) - -(defun slime-previous-location () - "Go to the previous location, depending on context. -When displaying XREF information, this goes to the previous reference." - (interactive) - (when (null slime-previous-location-function) - (error "No context for finding locations.")) - (funcall slime-previous-location-function)) - -(defun slime-recompile-xref (&optional raw-prefix-arg) - (interactive "P") - (let ((slime-compilation-policy (slime-compute-policy raw-prefix-arg))) - (let ((location (slime-xref-location-at-point)) - (dspec (slime-xref-dspec-at-point))) - (slime-recompile-locations - (list location) - (slime-rcurry #'slime-xref-recompilation-cont - (list dspec) (current-buffer)))))) - -(defun slime-recompile-all-xrefs (&optional raw-prefix-arg) - (interactive "P") - (let ((slime-compilation-policy (slime-compute-policy raw-prefix-arg))) - (let ((dspecs) (locations)) - (dolist (xref (slime-all-xrefs)) - (when (slime-xref-has-location-p xref) - (push (slime-xref.dspec xref) dspecs) - (push (slime-xref.location xref) locations))) - (slime-recompile-locations - locations - (slime-rcurry #'slime-xref-recompilation-cont - dspecs (current-buffer)))))) - -(defun slime-xref-recompilation-cont (results dspecs buffer) - ;; Extreme long-windedness to insert status of recompilation; - ;; sometimes Elisp resembles more of an Ewwlisp. - - ;; FIXME: Should probably throw out the whole recompilation cruft - ;; anyway. -- helmut - ;; TODO: next iteration of fixme cleanup this is going in a contrib -- jt - (with-current-buffer buffer - (slime-compilation-finished (slime-aggregate-compilation-results results)) - (save-excursion - (slime-xref-insert-recompilation-flags - dspecs (cl-loop for r in results collect - (or (slime-compilation-result.successp r) - (and (slime-compilation-result.notes r) - :complained))))))) - -(defun slime-aggregate-compilation-results (results) - `(:compilation-result - ,(cl-reduce #'append (mapcar #'slime-compilation-result.notes results)) - ,(cl-every #'slime-compilation-result.successp results) - ,(cl-reduce #'+ (mapcar #'slime-compilation-result.duration results)))) - -(defun slime-xref-insert-recompilation-flags (dspecs compilation-results) - (let* ((buffer-read-only nil) - (max-column (slime-column-max))) - (goto-char (point-min)) - (cl-loop for dspec in dspecs - for result in compilation-results - do (save-excursion - (cl-loop for dspec2 = (progn (search-forward dspec) - (slime-xref-dspec-at-point)) - until (equal dspec2 dspec)) - (end-of-line) ; skip old status information. - (insert-char ?\ (1+ (- max-column (current-column)))) - (insert (format "[%s]" - (cl-case result - ((t) :success) - ((nil) :failure) - (t result)))))))) - - -;;;; Macroexpansion - -(define-minor-mode slime-macroexpansion-minor-mode - "SLIME mode for macroexpansion" - nil - " Macroexpand" - '(("g" . slime-macroexpand-again))) - -(cl-macrolet ((remap (from to) - `(dolist (mapping - (where-is-internal ,from slime-mode-map)) - (define-key slime-macroexpansion-minor-mode-map - mapping ,to)))) - (remap 'slime-macroexpand-1 'slime-macroexpand-1-inplace) - (remap 'slime-macroexpand-all 'slime-macroexpand-all-inplace) - (remap 'slime-compiler-macroexpand-1 'slime-compiler-macroexpand-1-inplace) - (remap 'slime-expand-1 - 'slime-expand-1-inplace) - (remap 'advertised-undo 'slime-macroexpand-undo) - (remap 'undo 'slime-macroexpand-undo)) - -(defun slime-macroexpand-undo (&optional arg) - (interactive) - ;; Emacs 22.x introduced `undo-only' which - ;; works by binding `undo-no-redo' to t. We do - ;; it this way so we don't break prior Emacs - ;; versions. - (cl-macrolet ((undo-only (arg) `(let ((undo-no-redo t)) (undo ,arg)))) - (let ((inhibit-read-only t)) - (when (fboundp 'slime-remove-edits) - (slime-remove-edits (point-min) (point-max))) - (undo-only arg)))) - -(defvar slime-eval-macroexpand-expression nil - "Specifies the last macroexpansion preformed. -This variable specifies both what was expanded and how.") - -(defun slime-eval-macroexpand (expander &optional string) - (let ((string (or string (slime-sexp-at-point-or-error)))) - (setq slime-eval-macroexpand-expression `(,expander ,string)) - (slime-eval-async slime-eval-macroexpand-expression - #'slime-initialize-macroexpansion-buffer))) - -(defun slime-macroexpand-again () - "Reperform the last macroexpansion." - (interactive) - (slime-eval-async slime-eval-macroexpand-expression - (slime-rcurry #'slime-initialize-macroexpansion-buffer - (current-buffer)))) - -(defun slime-initialize-macroexpansion-buffer (expansion &optional buffer) - (pop-to-buffer (or buffer (slime-create-macroexpansion-buffer))) - (setq buffer-undo-list nil) ; Get rid of undo information from - ; previous expansions. - (let ((inhibit-read-only t) - (buffer-undo-list t)) ; Make the initial insertion not be undoable. - (erase-buffer) - (insert expansion) - (goto-char (point-min)) - (font-lock-fontify-buffer))) - -(defun slime-create-macroexpansion-buffer () - (let ((name (slime-buffer-name :macroexpansion))) - (slime-with-popup-buffer (name :package t :connection t - :mode 'lisp-mode) - (slime-mode 1) - (slime-macroexpansion-minor-mode 1) - (setq font-lock-keywords-case-fold-search t) - (current-buffer)))) - -(defun slime-eval-macroexpand-inplace (expander) - "Substitute the sexp at point with its macroexpansion. - -NB: Does not affect slime-eval-macroexpand-expression" - (interactive) - (let* ((bounds (or (slime-bounds-of-sexp-at-point) - (user-error "No sexp at point")))) - (lexical-let* ((start (copy-marker (car bounds))) - (end (copy-marker (cdr bounds))) - (point (point)) - (package (slime-current-package)) - (buffer (current-buffer))) - (slime-eval-async - `(,expander ,(buffer-substring-no-properties start end)) - (lambda (expansion) - (with-current-buffer buffer - (let ((buffer-read-only nil)) - (when (fboundp 'slime-remove-edits) - (slime-remove-edits (point-min) (point-max))) - (goto-char start) - (delete-region start end) - (slime-insert-indented expansion) - (goto-char point)))))))) - -(defun slime-macroexpand-1 (&optional repeatedly) - "Display the macro expansion of the form starting at point. -The form is expanded with CL:MACROEXPAND-1 or, if a prefix -argument is given, with CL:MACROEXPAND." - (interactive "P") - (slime-eval-macroexpand - (if repeatedly 'swank:swank-macroexpand 'swank:swank-macroexpand-1))) - -(defun slime-macroexpand-1-inplace (&optional repeatedly) - (interactive "P") - (slime-eval-macroexpand-inplace - (if repeatedly 'swank:swank-macroexpand 'swank:swank-macroexpand-1))) - -(defun slime-macroexpand-all () - "Display the recursively macro expanded sexp starting at -point." - (interactive) - (slime-eval-macroexpand 'swank:swank-macroexpand-all)) - -(defun slime-macroexpand-all-inplace () - "Display the recursively macro expanded sexp starting at point." - (interactive) - (slime-eval-macroexpand-inplace 'swank:swank-macroexpand-all)) - -(defun slime-compiler-macroexpand-1 (&optional repeatedly) - "Display the compiler-macro expansion of sexp starting at point." - (interactive "P") - (slime-eval-macroexpand - (if repeatedly - 'swank:swank-compiler-macroexpand - 'swank:swank-compiler-macroexpand-1))) - -(defun slime-compiler-macroexpand-1-inplace (&optional repeatedly) - "Display the compiler-macro expansion of sexp starting at point." - (interactive "P") - (slime-eval-macroexpand-inplace - (if repeatedly - 'swank:swank-compiler-macroexpand - 'swank:swank-compiler-macroexpand-1))) - -(defun slime-expand-1 (&optional repeatedly) - "Display the macro expansion of the form starting at point. -The form is expanded with CL:MACROEXPAND-1 or, if a prefix -argument is given, with CL:MACROEXPAND. If the form denotes a -compiler macro, SWANK/BACKEND:COMPILER-MACROEXPAND or -SWANK/BACKEND:COMPILER-MACROEXPAND-1 are used instead." - (interactive "P") - (slime-eval-macroexpand - (if repeatedly - 'swank:swank-expand - 'swank:swank-expand-1))) - -(defun slime-expand-1-inplace (&optional repeatedly) - "Display the macro expansion of the form at point. -The form is expanded with CL:MACROEXPAND-1 or, if a prefix -argument is given, with CL:MACROEXPAND." - (interactive "P") - (slime-eval-macroexpand-inplace - (if repeatedly - 'swank:swank-expand - 'swank:swank-expand-1))) - -(defun slime-format-string-expand (&optional string) - "Expand the format-string at point and display it." - (interactive (list (or (and (not current-prefix-arg) - (slime-string-at-point)) - (slime-read-from-minibuffer "Expand format: " - (slime-string-at-point))))) - (slime-eval-macroexpand 'swank:swank-format-string-expand string)) - - -;;;; Subprocess control - -(defun slime-interrupt () - "Interrupt Lisp." - (interactive) - (cond ((slime-use-sigint-for-interrupt) (slime-send-sigint)) - (t (slime-dispatch-event `(:emacs-interrupt ,slime-current-thread))))) - -(defun slime-quit () - (error "Not implemented properly. Use `slime-interrupt' instead.")) - -(defun slime-quit-lisp (&optional kill) - "Quit lisp, kill the inferior process and associated buffers." - (interactive "P") - (slime-quit-lisp-internal (slime-connection) 'slime-quit-sentinel kill)) - -(defun slime-quit-lisp-internal (connection sentinel kill) - (let ((slime-dispatching-connection connection)) - (slime-eval-async '(swank:quit-lisp)) - (let* ((process (slime-inferior-process connection))) - (set-process-filter connection nil) - (set-process-sentinel connection sentinel) - (when (and kill process) - (sleep-for 0.2) - (unless (memq (process-status process) '(exit signal)) - (kill-process process)))))) - -(defun slime-quit-sentinel (process _message) - (cl-assert (process-status process) 'closed) - (let* ((inferior (slime-inferior-process process)) - (inferior-buffer (if inferior (process-buffer inferior)))) - (when inferior (delete-process inferior)) - (when inferior-buffer (kill-buffer inferior-buffer)) - (slime-net-close process) - (message "Connection closed."))) - - -;;;; Debugger (SLDB) - -(defvar sldb-hook nil - "Hook run on entry to the debugger.") - -(defcustom sldb-initial-restart-limit 6 - "Maximum number of restarts to display initially." - :group 'slime-debugger - :type 'integer) - - -;;;;; Local variables in the debugger buffer - -;; Small helper. -(defun slime-make-variables-buffer-local (&rest variables) - (mapcar #'make-variable-buffer-local variables)) - -(slime-make-variables-buffer-local - (defvar sldb-condition nil - "A list (DESCRIPTION TYPE) describing the condition being debugged.") - - (defvar sldb-restarts nil - "List of (NAME DESCRIPTION) for each available restart.") - - (defvar sldb-level nil - "Current debug level (recursion depth) displayed in buffer.") - - (defvar sldb-backtrace-start-marker nil - "Marker placed at the first frame of the backtrace.") - - (defvar sldb-restart-list-start-marker nil - "Marker placed at the first restart in the restart list.") - - (defvar sldb-continuations nil - "List of ids for pending continuation.")) - -;;;;; SLDB macros - -;; some macros that we need to define before the first use - -(defmacro sldb-in-face (name string) - "Return STRING propertised with face sldb-NAME-face." - (declare (indent 1)) - (let ((facename (intern (format "sldb-%s-face" (symbol-name name)))) - (var (cl-gensym "string"))) - `(let ((,var ,string)) - (slime-add-face ',facename ,var) - ,var))) - - -;;;;; sldb-mode - -(defvar sldb-mode-syntax-table - (let ((table (copy-syntax-table lisp-mode-syntax-table))) - ;; We give < and > parenthesis syntax, so that #< ... > is treated - ;; as a balanced expression. This enables autodoc-mode to match - ;; # actual arguments in the backtraces with formal - ;; arguments of the function. (For Lisp mode, this is not - ;; desirable, since we do not wish to get a mismatched paren - ;; highlighted everytime we type < or >.) - (modify-syntax-entry ?< "(" table) - (modify-syntax-entry ?> ")" table) - table) - "Syntax table for SLDB mode.") - -(define-derived-mode sldb-mode fundamental-mode "sldb" - "Superior lisp debugger mode. -In addition to ordinary SLIME commands, the following are -available:\\ - -Commands to examine the selected frame: - \\[sldb-toggle-details] - toggle details (local bindings, CATCH tags) - \\[sldb-show-source] - view source for the frame - \\[sldb-eval-in-frame] - eval in frame - \\[sldb-pprint-eval-in-frame] - eval in frame, pretty-print result - \\[sldb-disassemble] - disassemble - \\[sldb-inspect-in-frame] - inspect - -Commands to invoke restarts: - \\[sldb-quit] - quit - \\[sldb-abort] - abort - \\[sldb-continue] - continue - \\[sldb-invoke-restart-0]-\\[sldb-invoke-restart-9] - restart shortcuts - \\[sldb-invoke-restart-by-name] - invoke restart by name - -Commands to navigate frames: - \\[sldb-down] - down - \\[sldb-up] - up - \\[sldb-details-down] - down, with details - \\[sldb-details-up] - up, with details - \\[sldb-cycle] - cycle between restarts & backtrace - \\[sldb-beginning-of-backtrace] - beginning of backtrace - \\[sldb-end-of-backtrace] - end of backtrace - -Miscellaneous commands: - \\[sldb-restart-frame] - restart frame - \\[sldb-return-from-frame] - return from frame - \\[sldb-step] - step - \\[sldb-break-with-default-debugger] - switch to native debugger - \\[sldb-break-with-system-debugger] - switch to system debugger (gdb) - \\[slime-interactive-eval] - eval - \\[sldb-inspect-condition] - inspect signalled condition - -Full list of commands: - -\\{sldb-mode-map}" - (erase-buffer) - (set-syntax-table sldb-mode-syntax-table) - (slime-set-truncate-lines) - ;; Make original slime-connection "sticky" for SLDB commands in this buffer - (setq slime-buffer-connection (slime-connection))) - -(set-keymap-parent sldb-mode-map slime-parent-map) - -(slime-define-keys sldb-mode-map - - ((kbd "RET") 'sldb-default-action) - ("\C-m" 'sldb-default-action) - ([return] 'sldb-default-action) - ([mouse-2] 'sldb-default-action/mouse) - ([follow-link] 'mouse-face) - ("\C-i" 'sldb-cycle) - ("h" 'describe-mode) - ("v" 'sldb-show-source) - ("e" 'sldb-eval-in-frame) - ("d" 'sldb-pprint-eval-in-frame) - ("D" 'sldb-disassemble) - ("i" 'sldb-inspect-in-frame) - ("n" 'sldb-down) - ("p" 'sldb-up) - ("\M-n" 'sldb-details-down) - ("\M-p" 'sldb-details-up) - ("<" 'sldb-beginning-of-backtrace) - (">" 'sldb-end-of-backtrace) - ("t" 'sldb-toggle-details) - ("r" 'sldb-restart-frame) - ("I" 'sldb-invoke-restart-by-name) - ("R" 'sldb-return-from-frame) - ("c" 'sldb-continue) - ("s" 'sldb-step) - ("x" 'sldb-next) - ("o" 'sldb-out) - ("b" 'sldb-break-on-return) - ("a" 'sldb-abort) - ("q" 'sldb-quit) - ("A" 'sldb-break-with-system-debugger) - ("B" 'sldb-break-with-default-debugger) - ("P" 'sldb-print-condition) - ("C" 'sldb-inspect-condition) - (":" 'slime-interactive-eval) - ("\C-c\C-c" 'sldb-recompile-frame-source)) - -;; Keys 0-9 are shortcuts to invoke particular restarts. -(dotimes (number 10) - (let ((fname (intern (format "sldb-invoke-restart-%S" number))) - (docstring (format "Invoke restart numbered %S." number))) - (eval `(defun ,fname () - ,docstring - (interactive) - (sldb-invoke-restart ,number))) - (define-key sldb-mode-map (number-to-string number) fname))) - - -;;;;; SLDB buffer creation & update - -(defun sldb-buffers (&optional connection) - "Return a list of all sldb buffers (belonging to CONNECTION.)" - (if connection - (slime-filter-buffers (lambda () - (and (eq slime-buffer-connection connection) - (eq major-mode 'sldb-mode)))) - (slime-filter-buffers (lambda () (eq major-mode 'sldb-mode))))) - -(defun sldb-find-buffer (thread &optional connection) - (let ((connection (or connection (slime-connection)))) - (cl-find-if (lambda (buffer) - (with-current-buffer buffer - (and (eq slime-buffer-connection connection) - (eq slime-current-thread thread)))) - (sldb-buffers)))) - -(defun sldb-get-default-buffer () - "Get a sldb buffer. -The chosen buffer the default connection's it if exists." - (car (sldb-buffers slime-default-connection))) - -(defun sldb-get-buffer (thread &optional connection) - "Find or create a sldb-buffer for THREAD." - (let ((connection (or connection (slime-connection)))) - (or (sldb-find-buffer thread connection) - (let ((name (format "*sldb %s/%s*" (slime-connection-name) thread))) - (with-current-buffer (generate-new-buffer name) - (setq slime-buffer-connection connection - slime-current-thread thread) - (current-buffer)))))) - -(defun sldb-debugged-continuations (connection) - "Return the all debugged continuations for CONNECTION across SLDB buffers." - (cl-loop for b in (sldb-buffers) - append (with-current-buffer b - (and (eq slime-buffer-connection connection) - sldb-continuations)))) - -(defun sldb--display-buffer-reuse-last-window (buffer _alist) - (let ((window - (get-window-with-predicate (lambda (w) - (window-parameter w 'sldb-last-window))))) - (when (and window - (not (with-current-buffer (window-buffer window) - (derived-mode-p 'sldb-mode)))) - (display-buffer-record-window 'reuse window buffer) - (set-window-buffer window buffer) - window))) - -(defun sldb-display-buffer (buffer) - "Pop to BUFFER reusing the last SLDB window, if any." - (pop-to-buffer buffer '(sldb--display-buffer-reuse-last-window))) - -(defun sldb-setup (thread level condition restarts frames conts) - "Setup a new SLDB buffer. -CONDITION is a string describing the condition to debug. -RESTARTS is a list of strings (NAME DESCRIPTION) for each available restart. -FRAMES is a list (NUMBER DESCRIPTION &optional PLIST) describing the initial -portion of the backtrace. Frames are numbered from 0. -CONTS is a list of pending Emacs continuations." - (with-current-buffer (sldb-get-buffer thread) - (cl-assert (if (equal sldb-level level) - (equal sldb-condition condition) - t) - () "Bug: sldb-level is equal but condition differs\n%s\n%s" - sldb-condition condition) - (unless (equal sldb-level level) - (setq buffer-read-only nil) - (sldb-mode) - (setq slime-current-thread thread) - (setq sldb-level level) - (setq mode-name (format "sldb[%d]" sldb-level)) - (setq sldb-condition condition) - (setq sldb-restarts restarts) - (setq sldb-continuations conts) - (sldb-insert-condition condition) - (insert "\n\n" (sldb-in-face section "Restarts:") "\n") - (setq sldb-restart-list-start-marker (point-marker)) - (sldb-insert-restarts restarts 0 sldb-initial-restart-limit) - (insert "\n" (sldb-in-face section "Backtrace:") "\n") - (setq sldb-backtrace-start-marker (point-marker)) - (save-excursion - (if frames - (sldb-insert-frames (sldb-prune-initial-frames frames) t) - (insert "[No backtrace]"))) - (run-hooks 'sldb-hook) - (set-syntax-table lisp-mode-syntax-table)) - ;; FIXME: remove when dropping Emacs23 support - (let ((saved (selected-window))) - (sldb-display-buffer (current-buffer)) - (set-window-parameter (selected-window) 'sldb-restore saved)) - (unless noninteractive ; needed for tests in batch-mode - (slime--display-region (point-min) (point))) - (setq buffer-read-only t) - (when (and slime-stack-eval-tags - ;; (y-or-n-p "Enter recursive edit? ") - ) - (message "Entering recursive edit..") - (recursive-edit)))) - -(defun sldb-activate (thread level select) - "Display the debugger buffer for THREAD. -If LEVEL isn't the same as in the buffer reinitialize the buffer." - (or (let ((buffer (sldb-find-buffer thread))) - (when buffer - (with-current-buffer buffer - (when (equal sldb-level level) - (when select (pop-to-buffer (current-buffer))) - t)))) - (sldb-reinitialize thread level))) - -(defun sldb-reinitialize (thread level) - (slime-rex (thread level) - ('(swank:debugger-info-for-emacs 0 10) - nil thread) - ((:ok result) - (apply #'sldb-setup thread level result)))) - -(defun sldb--mark-last-window (window) - (dolist (window (window-list)) - (when (window-parameter window 'sldb-last-window) - (set-window-parameter window 'sldb-last-window nil))) - (set-window-parameter (selected-window) 'sldb-last-window t)) - -(defun sldb-exit (thread _level &optional stepping) - "Exit from the debug level LEVEL." - (let ((sldb (sldb-find-buffer thread))) - (when sldb - (with-current-buffer sldb - (cond (stepping - (setq sldb-level nil) - (run-with-timer 0.4 nil 'sldb-close-step-buffer sldb)) - ((not (eq sldb (window-buffer (selected-window)))) - ;; A different window selection means an indirect, - ;; non-interactive exit, we just kill the sldb buffer. - (kill-buffer)) - (t - (sldb--mark-last-window (selected-window)) - ;; An interactive exit should restore configuration per - ;; `quit-window's protocol. FIXME: remove - ;; `previous-window' hack when dropping Emacs23 support - (let ((previous-window (window-parameter (selected-window) - 'sldb-restore))) - (quit-window t) - (if (and (not (>= emacs-major-version 24)) - (window-live-p previous-window)) - (select-window previous-window))))))))) - -(defun sldb-close-step-buffer (buffer) - (when (buffer-live-p buffer) - (with-current-buffer buffer - (when (not sldb-level) - (quit-window t))))) - - -;;;;;; SLDB buffer insertion - -(defun sldb-insert-condition (condition) - "Insert the text for CONDITION. -CONDITION should be a list (MESSAGE TYPE EXTRAS). -EXTRAS is currently used for the stepper." - (cl-destructuring-bind (message type extras) condition - (slime-insert-propertized '(sldb-default-action sldb-inspect-condition) - (sldb-in-face topline message) - "\n" - (sldb-in-face condition type)) - (sldb-dispatch-extras extras))) - -(defvar sldb-extras-hooks) - -(defun sldb-dispatch-extras (extras) - ;; this is (mis-)used for the stepper - (dolist (extra extras) - (slime-dcase extra - ((:show-frame-source n) - (sldb-show-frame-source n)) - (t - (or (run-hook-with-args-until-success 'sldb-extras-hooks extra) - ;;(error "Unhandled extra element:" extra) - ))))) - -(defun sldb-insert-restarts (restarts start count) - "Insert RESTARTS and add the needed text props -RESTARTS should be a list ((NAME DESCRIPTION) ...)." - (let* ((len (length restarts)) - (end (if count (min (+ start count) len) len))) - (cl-loop for (name string) in (cl-subseq restarts start end) - for number from start - do (slime-insert-propertized - `(,@nil restart ,number - sldb-default-action sldb-invoke-restart - mouse-face highlight) - " " (sldb-in-face restart-number (number-to-string number)) - ": [" (sldb-in-face restart-type name) "] " - (sldb-in-face restart string)) - (insert "\n")) - (when (< end len) - (let ((pos (point))) - (slime-insert-propertized - (list 'sldb-default-action - (slime-rcurry #'sldb-insert-more-restarts restarts pos end)) - " --more--\n"))))) - -(defun sldb-insert-more-restarts (restarts position start) - (goto-char position) - (let ((inhibit-read-only t)) - (delete-region position (1+ (line-end-position))) - (sldb-insert-restarts restarts start nil))) - -(defun sldb-frame.string (frame) - (cl-destructuring-bind (_ str &optional _) frame str)) - -(defun sldb-frame.number (frame) - (cl-destructuring-bind (n _ &optional _) frame n)) - -(defun sldb-frame.plist (frame) - (cl-destructuring-bind (_ _ &optional plist) frame plist)) - -(defun sldb-frame-restartable-p (frame) - (and (plist-get (sldb-frame.plist frame) :restartable) t)) - -(defun sldb-prune-initial-frames (frames) - "Return the prefix of FRAMES to initially present to the user. -Regexp heuristics are used to avoid showing SWANK-internal frames." - (let* ((case-fold-search t) - (rx "^\\([() ]\\|lambda\\)*swank\\>")) - (or (cl-loop for frame in frames - until (string-match rx (sldb-frame.string frame)) - collect frame) - frames))) - -(defun sldb-insert-frames (frames more) - "Insert FRAMES into buffer. -If MORE is non-nil, more frames are on the Lisp stack." - (mapc #'sldb-insert-frame frames) - (when more - (slime-insert-propertized - `(,@nil sldb-default-action sldb-fetch-more-frames - sldb-previous-frame-number - ,(sldb-frame.number (cl-first (last frames))) - point-entered sldb-fetch-more-frames - start-open t - face sldb-section-face - mouse-face highlight) - " --more--") - (insert "\n"))) - -(defun sldb-compute-frame-face (frame) - (if (sldb-frame-restartable-p frame) - 'sldb-restartable-frame-line-face - 'sldb-frame-line-face)) - -(defun sldb-insert-frame (frame &optional face) - "Insert FRAME with FACE at point. -If FACE is nil, `sldb-compute-frame-face' is used to determine the face." - (setq face (or face (sldb-compute-frame-face frame))) - (let ((number (sldb-frame.number frame)) - (string (sldb-frame.string frame)) - (props `(frame ,frame sldb-default-action sldb-toggle-details))) - (slime-propertize-region props - (slime-propertize-region '(mouse-face highlight) - (insert " " (sldb-in-face frame-label (format "%2d:" number)) " ") - (slime-insert-indented - (slime-add-face face string))) - (insert "\n")))) - -(defun sldb-fetch-more-frames (&rest _) - "Fetch more backtrace frames. -Called on the `point-entered' text-property hook." - (let ((inhibit-point-motion-hooks t) - (inhibit-read-only t) - (prev (get-text-property (point) 'sldb-previous-frame-number))) - ;; we may be called twice, PREV is nil the second time - (when prev - (let* ((count 40) - (from (1+ prev)) - (to (+ from count)) - (frames (slime-eval `(swank:backtrace ,from ,to))) - (more (slime-length= frames count)) - (pos (point))) - (delete-region (line-beginning-position) (point-max)) - (sldb-insert-frames frames more) - (goto-char pos))))) - - -;;;;;; SLDB examining text props - -(defun sldb-restart-at-point () - (or (get-text-property (point) 'restart) - (error "No restart at point"))) - -(defun sldb-frame-number-at-point () - (let ((frame (get-text-property (point) 'frame))) - (cond (frame (car frame)) - (t (error "No frame at point"))))) - -(defun sldb-var-number-at-point () - (let ((var (get-text-property (point) 'var))) - (cond (var var) - (t (error "No variable at point"))))) - -(defun sldb-previous-frame-number () - (save-excursion - (sldb-backward-frame) - (sldb-frame-number-at-point))) - -(defun sldb-frame-details-visible-p () - (and (get-text-property (point) 'frame) - (get-text-property (point) 'details-visible-p))) - -(defun sldb-frame-region () - (slime-property-bounds 'frame)) - -(defun sldb-forward-frame () - (goto-char (next-single-char-property-change (point) 'frame))) - -(defun sldb-backward-frame () - (when (> (point) sldb-backtrace-start-marker) - (goto-char (previous-single-char-property-change - (if (get-text-property (point) 'frame) - (car (sldb-frame-region)) - (point)) - 'frame - nil sldb-backtrace-start-marker)))) - -(defun sldb-goto-last-frame () - (goto-char (point-max)) - (while (not (get-text-property (point) 'frame)) - (goto-char (previous-single-property-change (point) 'frame)) - ;; Recenter to bottom of the window; -2 to account for the - ;; empty last line displayed in sldb buffers. - (recenter -2))) - -(defun sldb-beginning-of-backtrace () - "Goto the first frame." - (interactive) - (goto-char sldb-backtrace-start-marker)) - - -;;;;;; SLDB recenter & redisplay -;; not sure yet, whether this is a good idea. -;; -;; jt: seconded. Only `sldb-show-frame-details' and -;; `sldb-hide-frame-details' use this. They could avoid it by not -;; removing and reinserting the frame's name line. -(defmacro slime-save-coordinates (origin &rest body) - "Restore line and column relative to ORIGIN, after executing BODY. - -This is useful if BODY deletes and inserts some text but we want to -preserve the current row and column as closely as possible." - (let ((base (make-symbol "base")) - (goal (make-symbol "goal")) - (mark (make-symbol "mark"))) - `(let* ((,base ,origin) - (,goal (slime-coordinates ,base)) - (,mark (point-marker))) - (set-marker-insertion-type ,mark t) - (prog1 (save-excursion ,@body) - (slime-restore-coordinate ,base ,goal ,mark))))) - -(put 'slime-save-coordinates 'lisp-indent-function 1) - -(defun slime-coordinates (origin) - ;; Return a pair (X . Y) for the column and line distance to ORIGIN. - (let ((y (slime-count-lines origin (point))) - (x (save-excursion - (- (current-column) - (progn (goto-char origin) (current-column)))))) - (cons x y))) - -(defun slime-restore-coordinate (base goal limit) - ;; Move point to GOAL. Coordinates are relative to BASE. - ;; Don't move beyond LIMIT. - (save-restriction - (narrow-to-region base limit) - (goto-char (point-min)) - (let ((col (current-column))) - (forward-line (cdr goal)) - (when (and (eobp) (bolp) (not (bobp))) - (backward-char)) - (move-to-column (+ col (car goal)))))) - -(defun slime-count-lines (start end) - "Return the number of lines between START and END. -This is 0 if START and END at the same line." - (- (count-lines start end) - (if (save-excursion (goto-char end) (bolp)) 0 1))) - - -;;;;; SLDB commands - -(defun sldb-default-action () - "Invoke the action at point." - (interactive) - (let ((fn (get-text-property (point) 'sldb-default-action))) - (if fn (funcall fn)))) - -(defun sldb-default-action/mouse (event) - "Invoke the action pointed at by the mouse." - (interactive "e") - (cl-destructuring-bind (_mouse-1 (_w pos &rest ignore)) event - (save-excursion - (goto-char pos) - (let ((fn (get-text-property (point) 'sldb-default-action))) - (if fn (funcall fn)))))) - -(defun sldb-cycle () - "Cycle between restart list and backtrace." - (interactive) - (let ((pt (point))) - (cond ((< pt sldb-restart-list-start-marker) - (goto-char sldb-restart-list-start-marker)) - ((< pt sldb-backtrace-start-marker) - (goto-char sldb-backtrace-start-marker)) - (t - (goto-char sldb-restart-list-start-marker))))) - -(defun sldb-end-of-backtrace () - "Fetch the entire backtrace and go to the last frame." - (interactive) - (sldb-fetch-all-frames) - (sldb-goto-last-frame)) - -(defun sldb-fetch-all-frames () - (let ((inhibit-read-only t) - (inhibit-point-motion-hooks t)) - (sldb-goto-last-frame) - (let ((last (sldb-frame-number-at-point))) - (goto-char (next-single-char-property-change (point) 'frame)) - (delete-region (point) (point-max)) - (save-excursion - (sldb-insert-frames (slime-eval `(swank:backtrace ,(1+ last) nil)) - nil))))) - - -;;;;;; SLDB show source - -(defun sldb-show-source () - "Highlight the frame at point's expression in a source code buffer." - (interactive) - (sldb-show-frame-source (sldb-frame-number-at-point))) - -(defun sldb-show-frame-source (frame-number) - (slime-eval-async - `(swank:frame-source-location ,frame-number) - (lambda (source-location) - (slime-dcase source-location - ((:error message) - (message "%s" message) - (ding)) - (t - (slime-show-source-location source-location t nil)))))) - -(defun slime-show-source-location (source-location - &optional highlight recenter-arg) - "Go to SOURCE-LOCATION and display the buffer in the other window." - (slime-goto-source-location source-location) - ;; show the location, but don't hijack focus. - (slime--display-position (point) t recenter-arg) - (when highlight (slime-highlight-sexp))) - -(defun slime--display-position (pos other-window recenter-arg) - (with-selected-window (display-buffer (current-buffer) other-window) - (goto-char pos) - (recenter recenter-arg))) - -;; Set window-start so that the region from START to END becomes visible. -;; START is inclusive; END is exclusive. -(defun slime--adjust-window-start (start end) - (let* ((last (max start (1- end))) - (window-height (window-text-height)) - (region-height (count-screen-lines start last t))) - ;; if needed, make the region visible - (when (or (not (pos-visible-in-window-p start)) - (not (pos-visible-in-window-p last))) - (let* ((nlines (cond ((or (< start (window-start)) - (>= region-height window-height)) - 0) - (t - (- region-height))))) - (goto-char start) - (recenter nlines))) - (cl-assert (pos-visible-in-window-p start)) - (cl-assert (or (pos-visible-in-window-p last) - (> region-height window-height))) - (cl-assert (pos-visible-in-window-p (1- (window-end nil t)) nil t)))) - -;; move POS to visible region -(defun slime--adjust-window-point (pos) - (cond ((pos-visible-in-window-p pos) - (goto-char pos)) - ((< pos (window-start)) - (goto-char (window-start))) - (t - (goto-char (1- (window-end nil t))) - (move-to-column 0))) - (cl-assert (pos-visible-in-window-p (point) nil t))) - -(defun slime--display-region (start end) - "Make the region from START to END visible. -Minimize point motion." - (cl-assert (<= start end)) - (cl-assert (eq (window-buffer (selected-window)) - (current-buffer))) - (let ((pos (point))) - (slime--adjust-window-start start end) - (slime--adjust-window-point pos))) - -(defun slime-highlight-sexp (&optional start end) - "Highlight the first sexp after point." - (let ((start (or start (point))) - (end (or end (save-excursion (ignore-errors (forward-sexp)) (point))))) - (slime-flash-region start end))) - -(defun slime-highlight-line (&optional timeout) - (slime-flash-region (+ (line-beginning-position) (current-indentation)) - (line-end-position) - timeout)) - - -;;;;;; SLDB toggle details - -(defun sldb-toggle-details (&optional on) - "Toggle display of details for the current frame. -The details include local variable bindings and CATCH-tags." - (interactive) - (cl-assert (sldb-frame-number-at-point)) - (let ((inhibit-read-only t) - (inhibit-point-motion-hooks t)) - (if (or on (not (sldb-frame-details-visible-p))) - (sldb-show-frame-details) - (sldb-hide-frame-details)))) - -(defun sldb-show-frame-details () - ;; fetch and display info about local variables and catch tags - (cl-destructuring-bind (start end frame locals catches) (sldb-frame-details) - (slime-save-coordinates start - (delete-region start end) - (slime-propertize-region `(frame ,frame details-visible-p t) - (sldb-insert-frame frame (if (sldb-frame-restartable-p frame) - 'sldb-restartable-frame-line-face - ;; FIXME: can we somehow merge the two? - 'sldb-detailed-frame-line-face)) - (let ((indent1 " ") - (indent2 " ")) - (insert indent1 (sldb-in-face section - (if locals "Locals:" "[No Locals]")) "\n") - (sldb-insert-locals locals indent2 frame) - (when catches - (insert indent1 (sldb-in-face section "Catch-tags:") "\n") - (dolist (tag catches) - (slime-propertize-region `(catch-tag ,tag) - (insert indent2 (sldb-in-face catch-tag (format "%s" tag)) - "\n")))) - (setq end (point))))) - (slime--display-region (point) end))) - -(defun sldb-frame-details () - ;; Return a list (START END FRAME LOCALS CATCHES) for frame at point. - (let* ((frame (get-text-property (point) 'frame)) - (num (car frame))) - (cl-destructuring-bind (start end) (sldb-frame-region) - (cl-list* start end frame - (slime-eval `(swank:frame-locals-and-catch-tags ,num)))))) - -(defvar sldb-insert-frame-variable-value-function - 'sldb-insert-frame-variable-value) - -(defun sldb-insert-locals (vars prefix frame) - "Insert VARS and add PREFIX at the beginning of each inserted line. -VAR should be a plist with the keys :name, :id, and :value." - (cl-loop for i from 0 - for var in vars do - (cl-destructuring-bind (&key name id value) var - (slime-propertize-region - (list 'sldb-default-action 'sldb-inspect-var 'var i) - (insert prefix - (sldb-in-face local-name - (concat name (if (zerop id) "" (format "#%d" id)))) - " = ") - (funcall sldb-insert-frame-variable-value-function - value frame i) - (insert "\n"))))) - -(defun sldb-insert-frame-variable-value (value _frame _index) - (insert (sldb-in-face local-value value))) - -(defun sldb-hide-frame-details () - ;; delete locals and catch tags, but keep the function name and args. - (cl-destructuring-bind (start end) (sldb-frame-region) - (let ((frame (get-text-property (point) 'frame))) - (slime-save-coordinates start - (delete-region start end) - (slime-propertize-region '(details-visible-p nil) - (sldb-insert-frame frame)))))) - -(defun sldb-disassemble () - "Disassemble the code for the current frame." - (interactive) - (let ((frame (sldb-frame-number-at-point))) - (slime-eval-async `(swank:sldb-disassemble ,frame) - (lambda (result) - (slime-show-description result nil))))) - - -;;;;;; SLDB eval and inspect - -(defun sldb-eval-in-frame (frame string package) - "Prompt for an expression and evaluate it in the selected frame." - (interactive (sldb-read-form-for-frame "Eval in frame (%s)> ")) - (slime-eval-async `(swank:eval-string-in-frame ,string ,frame ,package) - (if current-prefix-arg - 'slime-write-string - 'slime-display-eval-result))) - -(defun sldb-pprint-eval-in-frame (frame string package) - "Prompt for an expression, evaluate in selected frame, pretty-print result." - (interactive (sldb-read-form-for-frame "Eval in frame (%s)> ")) - (slime-eval-async - `(swank:pprint-eval-string-in-frame ,string ,frame ,package) - (lambda (result) - (slime-show-description result nil)))) - -(defun sldb-read-form-for-frame (fstring) - (let* ((frame (sldb-frame-number-at-point)) - (pkg (slime-eval `(swank:frame-package-name ,frame)))) - (list frame - (let ((slime-buffer-package pkg)) - (slime-read-from-minibuffer (format fstring pkg))) - pkg))) - -(defun sldb-inspect-in-frame (string) - "Prompt for an expression and inspect it in the selected frame." - (interactive (list (slime-read-from-minibuffer - "Inspect in frame (evaluated): " - (slime-sexp-at-point)))) - (let ((number (sldb-frame-number-at-point))) - (slime-eval-async `(swank:inspect-in-frame ,string ,number) - 'slime-open-inspector))) - -(defun sldb-inspect-var () - (let ((frame (sldb-frame-number-at-point)) - (var (sldb-var-number-at-point))) - (slime-eval-async `(swank:inspect-frame-var ,frame ,var) - 'slime-open-inspector))) - -(defun sldb-inspect-condition () - "Inspect the current debugger condition." - (interactive) - (slime-eval-async '(swank:inspect-current-condition) - 'slime-open-inspector)) - -(defun sldb-print-condition () - (interactive) - (slime-eval-describe `(swank:sdlb-print-condition))) - - -;;;;;; SLDB movement - -(defun sldb-down () - "Select next frame." - (interactive) - (sldb-forward-frame)) - -(defun sldb-up () - "Select previous frame." - (interactive) - (sldb-backward-frame) - (when (= (point) sldb-backtrace-start-marker) - (recenter (1+ (count-lines (point-min) (point)))))) - -(defun sldb-sugar-move (move-fn) - (let ((inhibit-read-only t)) - (when (sldb-frame-details-visible-p) (sldb-hide-frame-details)) - (funcall move-fn) - (sldb-show-source) - (sldb-toggle-details t))) - -(defun sldb-details-up () - "Select previous frame and show details." - (interactive) - (sldb-sugar-move 'sldb-up)) - -(defun sldb-details-down () - "Select next frame and show details." - (interactive) - (sldb-sugar-move 'sldb-down)) - - -;;;;;; SLDB restarts - -(defun sldb-quit () - "Quit to toplevel." - (interactive) - (cl-assert sldb-restarts () "sldb-quit called outside of sldb buffer") - (slime-rex () ('(swank:throw-to-toplevel)) - ((:ok x) (error "sldb-quit returned [%s]" x)) - ((:abort _)))) - -(defun sldb-continue () - "Invoke the \"continue\" restart." - (interactive) - (cl-assert sldb-restarts () "sldb-continue called outside of sldb buffer") - (slime-rex () - ('(swank:sldb-continue)) - ((:ok _) - (message "No restart named continue") - (ding)) - ((:abort _)))) - -(defun sldb-abort () - "Invoke the \"abort\" restart." - (interactive) - (slime-eval-async '(swank:sldb-abort) - (lambda (v) (message "Restart returned: %S" v)))) - -(defun sldb-invoke-restart (&optional number) - "Invoke a restart. -Optional NUMBER (index into `sldb-restarts') specifies the -restart to invoke, otherwise use the restart at point." - (interactive) - (let ((restart (or number (sldb-restart-at-point)))) - (slime-rex () - ((list 'swank:invoke-nth-restart-for-emacs sldb-level restart)) - ((:ok value) (message "Restart returned: %s" value)) - ((:abort _))))) - -(defun sldb-invoke-restart-by-name (restart-name) - (interactive (list (let ((completion-ignore-case t)) - (completing-read "Restart: " sldb-restarts nil t - "" - 'sldb-invoke-restart-by-name)))) - (sldb-invoke-restart (cl-position restart-name sldb-restarts - :test 'string= :key 'first))) - -(defun sldb-break-with-default-debugger (&optional dont-unwind) - "Enter default debugger." - (interactive "P") - (slime-rex () - ((list 'swank:sldb-break-with-default-debugger - (not (not dont-unwind))) - nil slime-current-thread) - ((:abort _)))) - -(defun sldb-break-with-system-debugger (&optional lightweight) - "Enter system debugger (gdb)." - (interactive "P") - (slime-attach-gdb slime-buffer-connection lightweight)) - -(defun slime-attach-gdb (connection &optional lightweight) - "Run `gud-gdb'on the connection with PID `pid'. - -If `lightweight' is given, do not send any request to the -inferior Lisp (e.g. to obtain default gdb config) but only -operate from the Emacs side; intended for cases where the Lisp is -truly screwed up." - (interactive - (list (slime-read-connection "Attach gdb to: " (slime-connection)) "P")) - (let ((pid (slime-pid connection)) - (file (slime-lisp-implementation-program connection)) - (commands (unless lightweight - (let ((slime-dispatching-connection connection)) - (slime-eval `(swank:gdb-initial-commands)))))) - (gud-gdb (format "gdb -p %d %s" pid (or file ""))) - (with-current-buffer gud-comint-buffer - (dolist (cmd commands) - ;; First wait until gdb was initialized, then wait until current - ;; command was processed. - (while (not (looking-back comint-prompt-regexp nil)) - (sit-for 0.01)) - ;; We do not use `gud-call' because we want the initial commands - ;; to be displayed by the user so he knows what he's got. - (insert cmd) - (comint-send-input))))) - -(defun slime-read-connection (prompt &optional initial-value) - "Read a connection from the minibuffer. -Return the net process, or nil." - (cl-assert (memq initial-value slime-net-processes)) - (let* ((to-string (lambda (p) - (format "%s (pid %d)" - (slime-connection-name p) (slime-pid p)))) - (candidates (mapcar (lambda (p) (cons (funcall to-string p) p)) - slime-net-processes))) - (cdr (assoc (completing-read prompt candidates - nil t (funcall to-string initial-value)) - candidates)))) - -(defun sldb-step () - "Step to next basic-block boundary." - (interactive) - (let ((frame (sldb-frame-number-at-point))) - (slime-eval-async `(swank:sldb-step ,frame)))) - -(defun sldb-next () - "Step over call." - (interactive) - (let ((frame (sldb-frame-number-at-point))) - (slime-eval-async `(swank:sldb-next ,frame)))) - -(defun sldb-out () - "Resume stepping after returning from this function." - (interactive) - (let ((frame (sldb-frame-number-at-point))) - (slime-eval-async `(swank:sldb-out ,frame)))) - -(defun sldb-break-on-return () - "Set a breakpoint at the current frame. -The debugger is entered when the frame exits." - (interactive) - (let ((frame (sldb-frame-number-at-point))) - (slime-eval-async `(swank:sldb-break-on-return ,frame) - (lambda (msg) (message "%s" msg))))) - -(defun sldb-break (name) - "Set a breakpoint at the start of the function NAME." - (interactive (list (slime-read-symbol-name "Function: " t))) - (slime-eval-async `(swank:sldb-break ,name) - (lambda (msg) (message "%s" msg)))) - -(defun sldb-return-from-frame (string) - "Reads an expression in the minibuffer and causes the function to -return that value, evaluated in the context of the frame." - (interactive (list (slime-read-from-minibuffer "Return from frame: "))) - (let* ((number (sldb-frame-number-at-point))) - (slime-rex () - ((list 'swank:sldb-return-from-frame number string)) - ((:ok value) (message "%s" value)) - ((:abort _))))) - -(defun sldb-restart-frame () - "Causes the frame to restart execution with the same arguments as it -was called originally." - (interactive) - (let* ((number (sldb-frame-number-at-point))) - (slime-rex () - ((list 'swank:restart-frame number)) - ((:ok value) (message "%s" value)) - ((:abort _))))) - -(defun slime-toggle-break-on-signals () - "Toggle the value of *break-on-signals*." - (interactive) - (slime-eval-async `(swank:toggle-break-on-signals) - (lambda (msg) (message "%s" msg)))) - - -;;;;;; SLDB recompilation commands - -(defun sldb-recompile-frame-source (&optional raw-prefix-arg) - (interactive "P") - (slime-eval-async - `(swank:frame-source-location ,(sldb-frame-number-at-point)) - (lexical-let ((policy (slime-compute-policy raw-prefix-arg))) - (lambda (source-location) - (slime-dcase source-location - ((:error message) - (message "%s" message) - (ding)) - (t - (let ((slime-compilation-policy policy)) - (slime-recompile-location source-location)))))))) - - -;;;; Thread control panel - -(defvar slime-threads-buffer-name (slime-buffer-name :threads)) -(defvar slime-threads-buffer-timer nil) - -(defcustom slime-threads-update-interval nil - "Interval at which the list of threads will be updated." - :type '(choice - (number :value 0.5) - (const nil)) - :group 'slime-ui) - -(defun slime-list-threads () - "Display a list of threads." - (interactive) - (let ((name slime-threads-buffer-name)) - (slime-with-popup-buffer (name :connection t - :mode 'slime-thread-control-mode) - (slime-update-threads-buffer) - (goto-char (point-min)) - (when slime-threads-update-interval - (when slime-threads-buffer-timer - (cancel-timer slime-threads-buffer-timer)) - (setq slime-threads-buffer-timer - (run-with-timer - slime-threads-update-interval - slime-threads-update-interval - 'slime-update-threads-buffer)))))) - -(defun slime-quit-threads-buffer () - (when slime-threads-buffer-timer - (cancel-timer slime-threads-buffer-timer)) - (quit-window t) - (slime-eval-async `(swank:quit-thread-browser))) - -(defun slime-update-threads-buffer () - (interactive) - (with-current-buffer slime-threads-buffer-name - (slime-eval-async '(swank:list-threads) - 'slime-display-threads))) - -(defun slime-move-point (position) - "Move point in the current buffer and in the window the buffer is displayed." - (let ((window (get-buffer-window (current-buffer) t))) - (goto-char position) - (when window - (set-window-point window position)))) - -(defun slime-display-threads (threads) - (with-current-buffer slime-threads-buffer-name - (let* ((inhibit-read-only t) - (old-thread-id (get-text-property (point) 'thread-id)) - (old-line (line-number-at-pos)) - (old-column (current-column))) - (erase-buffer) - (slime-insert-threads threads) - (let ((new-position (cl-position old-thread-id (cdr threads) - :key #'car :test #'equal))) - (goto-char (point-min)) - (forward-line (or new-position (1- old-line))) - (move-to-column old-column) - (slime-move-point (point)))))) - -(defun slime-transpose-lists (list-of-lists) - (let ((ncols (length (car list-of-lists)))) - (cl-loop for col-index below ncols - collect (cl-loop for row in list-of-lists - collect (elt row col-index))))) - -(defun slime-insert-table-row (line line-props col-props col-widths) - (slime-propertize-region line-props - (cl-loop for string in line - for col-prop in col-props - for width in col-widths do - (slime-insert-propertized col-prop string) - (insert-char ?\ (- width (length string)))))) - -(defun slime-insert-table (rows header row-properties column-properties) - "Insert a \"table\" so that the columns are nicely aligned." - (let* ((ncols (length header)) - (lines (cons header rows)) - (widths (cl-loop for columns in (slime-transpose-lists lines) - collect (1+ (cl-loop for cell in columns - maximize (length cell))))) - (header-line (with-temp-buffer - (slime-insert-table-row - header nil (make-list ncols nil) widths) - (buffer-string)))) - (cond ((boundp 'header-line-format) - (setq header-line-format header-line)) - (t (insert header-line "\n"))) - (cl-loop for line in rows for line-props in row-properties do - (slime-insert-table-row line line-props column-properties widths) - (insert "\n")))) - -(defvar slime-threads-table-properties - '(nil (face bold))) - -(defun slime-insert-threads (threads) - (let* ((labels (car threads)) - (threads (cdr threads)) - (header (cl-loop for label in labels collect - (capitalize (substring (symbol-name label) 1)))) - (rows (cl-loop for thread in threads collect - (cl-loop for prop in thread collect - (format "%s" prop)))) - (line-props (cl-loop for (id) in threads for i from 0 - collect `(thread-index ,i thread-id ,id))) - (col-props (cl-loop for nil in labels for i from 0 collect - (nth i slime-threads-table-properties)))) - (slime-insert-table rows header line-props col-props))) - - -;;;;; Major mode - -(define-derived-mode slime-thread-control-mode fundamental-mode - "Threads" - "SLIME Thread Control Panel Mode. - -\\{slime-thread-control-mode-map} -\\{slime-popup-buffer-mode-map}" - (when slime-truncate-lines - (set (make-local-variable 'truncate-lines) t)) - (setq buffer-undo-list t)) - -(slime-define-keys slime-thread-control-mode-map - ("a" 'slime-thread-attach) - ("d" 'slime-thread-debug) - ("g" 'slime-update-threads-buffer) - ("k" 'slime-thread-kill) - ("q" 'slime-quit-threads-buffer)) - -(defun slime-thread-kill () - (interactive) - (slime-eval `(cl:mapc 'swank:kill-nth-thread - ',(slime-get-properties 'thread-index))) - (call-interactively 'slime-update-threads-buffer)) - -(defun slime-get-region-properties (prop start end) - (cl-loop for position = (if (get-text-property start prop) - start - (next-single-property-change start prop)) - then (next-single-property-change position prop) - while (<= position end) - collect (get-text-property position prop))) - -(defun slime-get-properties (prop) - (if (use-region-p) - (slime-get-region-properties prop - (region-beginning) - (region-end)) - (let ((value (get-text-property (point) prop))) - (when value - (list value))))) - -(defun slime-thread-attach () - (interactive) - (let ((id (get-text-property (point) 'thread-index)) - (file (slime-swank-port-file))) - (slime-eval-async `(swank:start-swank-server-in-thread ,id ,file))) - (slime-read-port-and-connect nil)) - -(defun slime-thread-debug () - (interactive) - (let ((id (get-text-property (point) 'thread-index))) - (slime-eval-async `(swank:debug-nth-thread ,id)))) - - -;;;;; Connection listing - -(define-derived-mode slime-connection-list-mode fundamental-mode - "Slime-Connections" - "SLIME Connection List Mode. - -\\{slime-connection-list-mode-map} -\\{slime-popup-buffer-mode-map}" - (when slime-truncate-lines - (set (make-local-variable 'truncate-lines) t))) - -(slime-define-keys slime-connection-list-mode-map - ("d" 'slime-connection-list-make-default) - ("g" 'slime-update-connection-list) - ((kbd "C-k") 'slime-quit-connection-at-point) - ("R" 'slime-restart-connection-at-point)) - -(defun slime-connection-at-point () - (or (get-text-property (point) 'slime-connection) - (error "No connection at point"))) - -(defun slime-quit-connection-at-point (connection) - (interactive (list (slime-connection-at-point))) - (let ((slime-dispatching-connection connection) - (end (time-add (current-time) (seconds-to-time 3)))) - (slime-quit-lisp t) - (while (memq connection slime-net-processes) - (when (time-less-p end (current-time)) - (message "Quit timeout expired. Disconnecting.") - (delete-process connection)) - (sit-for 0 100))) - (slime-update-connection-list)) - -(defun slime-restart-connection-at-point (connection) - (interactive (list (slime-connection-at-point))) - (let ((slime-dispatching-connection connection)) - (slime-restart-inferior-lisp))) - -(defun slime-connection-list-make-default () - "Make the connection at point the default connection." - (interactive) - (slime-select-connection (slime-connection-at-point)) - (slime-update-connection-list)) - -(defvar slime-connections-buffer-name (slime-buffer-name :connections)) - -(defun slime-list-connections () - "Display a list of all connections." - (interactive) - (slime-with-popup-buffer (slime-connections-buffer-name - :mode 'slime-connection-list-mode) - (slime-draw-connection-list))) - -(defun slime-update-connection-list () - "Display a list of all connections." - (interactive) - (let ((pos (point)) - (inhibit-read-only t)) - (erase-buffer) - (slime-draw-connection-list) - (goto-char pos))) - -(defun slime-draw-connection-list () - (let ((default-pos nil) - (default slime-default-connection) - (fstring "%s%2s %-10s %-17s %-7s %-s\n")) - (insert (format fstring " " "Nr" "Name" "Port" "Pid" "Type") - (format fstring " " "--" "----" "----" "---" "----")) - (dolist (p (reverse slime-net-processes)) - (when (eq default p) (setf default-pos (point))) - (slime-insert-propertized - (list 'slime-connection p) - (format fstring - (if (eq default p) "*" " ") - (slime-connection-number p) - (slime-connection-name p) - (or (process-id p) (process-contact p)) - (slime-pid p) - (slime-lisp-implementation-type p)))) - (when default-pos - (goto-char default-pos)))) - - -;;;; Inspector - -(defgroup slime-inspector nil - "Inspector faces." - :prefix "slime-inspector-" - :group 'slime) - -(defface slime-inspector-topline-face - '((t ())) - "Face for top line describing object." - :group 'slime-inspector) - -(defface slime-inspector-label-face - '((t (:inherit font-lock-constant-face))) - "Face for labels in the inspector." - :group 'slime-inspector) - -(defface slime-inspector-value-face - '((t (:inherit font-lock-builtin-face))) - "Face for things which can themselves be inspected." - :group 'slime-inspector) - -(defface slime-inspector-action-face - '((t (:inherit font-lock-warning-face))) - "Face for labels of inspector actions." - :group 'slime-inspector) - -(defface slime-inspector-type-face - '((t (:inherit font-lock-type-face))) - "Face for type description in inspector." - :group 'slime-inspector) - -(defvar slime-inspector-mark-stack '()) - -(defun slime-inspect (string) - "Eval an expression and inspect the result." - (interactive - (list (slime-read-from-minibuffer "Inspect value (evaluated): " - (slime-sexp-at-point)))) - (slime-eval-async `(swank:init-inspector ,string) 'slime-open-inspector)) - -(define-derived-mode slime-inspector-mode fundamental-mode - "Slime-Inspector" - " -\\{slime-inspector-mode-map} -\\{slime-popup-buffer-mode-map}" - (set-syntax-table lisp-mode-syntax-table) - (slime-set-truncate-lines) - (setq buffer-read-only t)) - -(defun slime-inspector-buffer () - (or (get-buffer (slime-buffer-name :inspector)) - (slime-with-popup-buffer ((slime-buffer-name :inspector) - :mode 'slime-inspector-mode) - (setq slime-inspector-mark-stack '()) - (buffer-disable-undo) - (current-buffer)))) - -(defmacro slime-inspector-fontify (face string) - `(slime-add-face ',(intern (format "slime-inspector-%s-face" face)) ,string)) - -(defvar slime-inspector-insert-ispec-function 'slime-inspector-insert-ispec) - -(defun slime-open-inspector (inspected-parts &optional point hook) - "Display INSPECTED-PARTS in a new inspector window. -Optionally set point to POINT. If HOOK is provided, it is added to local -KILL-BUFFER hooks for the inspector buffer." - (with-current-buffer (slime-inspector-buffer) - (when hook - (add-hook 'kill-buffer-hook hook t t)) - (setq slime-buffer-connection (slime-current-connection)) - (let ((inhibit-read-only t)) - (erase-buffer) - (pop-to-buffer (current-buffer)) - (cl-destructuring-bind (&key id title content) inspected-parts - (cl-macrolet ((fontify (face string) - `(slime-inspector-fontify ,face ,string))) - (slime-propertize-region - (list 'slime-part-number id - 'mouse-face 'highlight - 'face 'slime-inspector-value-face) - (insert title)) - (while (eq (char-before) ?\n) - (backward-delete-char 1)) - (insert "\n" (fontify label "--------------------") "\n") - (save-excursion - (slime-inspector-insert-content content)) - (when point - (cl-check-type point cons) - (ignore-errors - (goto-char (point-min)) - (forward-line (1- (car point))) - (move-to-column (cdr point))))))))) - -(defvar slime-inspector-limit 500) - -(defun slime-inspector-insert-content (content) - (slime-inspector-fetch-chunk - content nil - (lambda (chunk) - (let ((inhibit-read-only t)) - (slime-inspector-insert-chunk chunk t t))))) - -(defun slime-inspector-insert-chunk (chunk prev next) - "Insert CHUNK at point. -If PREV resp. NEXT are true insert more-buttons as needed." - (cl-destructuring-bind (ispecs len start end) chunk - (when (and prev (> start 0)) - (slime-inspector-insert-more-button start t)) - (mapc slime-inspector-insert-ispec-function ispecs) - (when (and next (< end len)) - (slime-inspector-insert-more-button end nil)))) - -(defun slime-inspector-insert-ispec (ispec) - (if (stringp ispec) - (insert ispec) - (slime-dcase ispec - ((:value string id) - (slime-propertize-region - (list 'slime-part-number id - 'mouse-face 'highlight - 'face 'slime-inspector-value-face) - (insert string))) - ((:label string) - (insert (slime-inspector-fontify label string))) - ((:action string id) - (slime-insert-propertized (list 'slime-action-number id - 'mouse-face 'highlight - 'face 'slime-inspector-action-face) - string))))) - -(defun slime-inspector-position () - "Return a pair (Y-POSITION X-POSITION) representing the -position of point in the current buffer." - ;; We make sure we return absolute coordinates even if the user has - ;; narrowed the buffer. - ;; FIXME: why would somebody narrow the buffer? - (save-restriction - (widen) - (cons (line-number-at-pos) - (current-column)))) - -(defun slime-inspector-property-at-point () - (let* ((properties '(slime-part-number slime-range-button - slime-action-number)) - (find-property - (lambda (point) - (cl-loop for property in properties - for value = (get-text-property point property) - when value - return (list property value))))) - (or (funcall find-property (point)) - (funcall find-property (1- (point)))))) - -(defun slime-inspector-operate-on-point () - "Invoke the command for the text at point. -1. If point is on a value then recursivly call the inspector on -that value. -2. If point is on an action then call that action. -3. If point is on a range-button fetch and insert the range." - (interactive) - (let ((opener (lexical-let ((point (slime-inspector-position))) - (lambda (parts) - (when parts - (slime-open-inspector parts point))))) - (new-opener (lambda (parts) - (when parts - (slime-open-inspector parts))))) - (cl-destructuring-bind (&optional property value) - (slime-inspector-property-at-point) - (cl-case property - (slime-part-number - (slime-eval-async `(swank:inspect-nth-part ,value) - new-opener) - (push (slime-inspector-position) slime-inspector-mark-stack)) - (slime-range-button - (slime-inspector-fetch-more value)) - (slime-action-number - (slime-eval-async `(swank:inspector-call-nth-action ,value) - opener)) - (t (error "No object at point")))))) - -(defun slime-inspector-operate-on-click (event) - "Move to events' position and operate the part." - (interactive "@e") - (let ((point (posn-point (event-end event)))) - (cond ((and point - (or (get-text-property point 'slime-part-number) - (get-text-property point 'slime-range-button) - (get-text-property point 'slime-action-number))) - (goto-char point) - (slime-inspector-operate-on-point)) - (t - (error "No clickable part here"))))) - -(defun slime-inspector-pop () - "Reinspect the previous object." - (interactive) - (slime-eval-async - `(swank:inspector-pop) - (lambda (result) - (cond (result - (slime-open-inspector result (pop slime-inspector-mark-stack))) - (t - (message "No previous object") - (ding)))))) - -(defun slime-inspector-next () - "Inspect the next object in the history." - (interactive) - (let ((result (slime-eval `(swank:inspector-next)))) - (cond (result - (push (slime-inspector-position) slime-inspector-mark-stack) - (slime-open-inspector result)) - (t (message "No next object") - (ding))))) - -(defun slime-inspector-quit () - "Quit the inspector and kill the buffer." - (interactive) - (slime-eval-async `(swank:quit-inspector)) - (quit-window t)) - -;; FIXME: first return value is just point. -;; FIXME: could probably use slime-search-property. -(defun slime-find-inspectable-object (direction limit) - "Find the next/previous inspectable object. -DIRECTION can be either 'next or 'prev. -LIMIT is the maximum or minimum position in the current buffer. - -Return a list of two values: If an object could be found, the -starting position of the found object and T is returned; -otherwise LIMIT and NIL is returned." - (let ((finder (cl-ecase direction - (next 'next-single-property-change) - (prev 'previous-single-property-change)))) - (let ((prop nil) (curpos (point))) - (while (and (not prop) (not (= curpos limit))) - (let ((newpos (funcall finder curpos 'slime-part-number nil limit))) - (setq prop (get-text-property newpos 'slime-part-number)) - (setq curpos newpos))) - (list curpos (and prop t))))) - -(defun slime-inspector-next-inspectable-object (arg) - "Move point to the next inspectable object. -With optional ARG, move across that many objects. -If ARG is negative, move backwards." - (interactive "p") - (let ((maxpos (point-max)) (minpos (point-min)) - (previously-wrapped-p nil)) - ;; Forward. - (while (> arg 0) - (cl-destructuring-bind (pos foundp) - (slime-find-inspectable-object 'next maxpos) - (if foundp - (progn (goto-char pos) (setq arg (1- arg)) - (setq previously-wrapped-p nil)) - (if (not previously-wrapped-p) ; cycle detection - (progn (goto-char minpos) (setq previously-wrapped-p t)) - (error "No inspectable objects"))))) - ;; Backward. - (while (< arg 0) - (cl-destructuring-bind (pos foundp) - (slime-find-inspectable-object 'prev minpos) - ;; SLIME-OPEN-INSPECTOR inserts the title of an inspector page - ;; as a presentation at the beginning of the buffer; skip - ;; that. (Notice how this problem can not arise in ``Forward.'') - (if (and foundp (/= pos minpos)) - (progn (goto-char pos) (setq arg (1+ arg)) - (setq previously-wrapped-p nil)) - (if (not previously-wrapped-p) ; cycle detection - (progn (goto-char maxpos) (setq previously-wrapped-p t)) - (error "No inspectable objects"))))))) - -(defun slime-inspector-previous-inspectable-object (arg) - "Move point to the previous inspectable object. -With optional ARG, move across that many objects. -If ARG is negative, move forwards." - (interactive "p") - (slime-inspector-next-inspectable-object (- arg))) - -(defun slime-inspector-describe () - (interactive) - (slime-eval-describe `(swank:describe-inspectee))) - -(defun slime-inspector-pprint (part) - (interactive (list (or (get-text-property (point) 'slime-part-number) - (error "No part at point")))) - (slime-eval-describe `(swank:pprint-inspector-part ,part))) - -(defun slime-inspector-eval (string) - "Eval an expression in the context of the inspected object. -The `*' variable will be bound to the inspected object." - (interactive (list (slime-read-from-minibuffer "Inspector eval: "))) - (slime-eval-with-transcript `(swank:inspector-eval ,string))) - -(defun slime-inspector-history () - "Show the previously inspected objects." - (interactive) - (slime-eval-describe `(swank:inspector-history))) - -(defun slime-inspector-show-source (part) - (interactive (list (or (get-text-property (point) 'slime-part-number) - (error "No part at point")))) - (slime-eval-async - `(swank:find-source-location-for-emacs '(:inspector ,part)) - #'slime-show-source-location)) - -(defun slime-inspector-reinspect () - (interactive) - (slime-eval-async `(swank:inspector-reinspect) - (lexical-let ((point (slime-inspector-position))) - (lambda (parts) - (slime-open-inspector parts point))))) - -(defun slime-inspector-toggle-verbose () - (interactive) - (slime-eval-async `(swank:inspector-toggle-verbose) - (lexical-let ((point (slime-inspector-position))) - (lambda (parts) - (slime-open-inspector parts point))))) - -(defun slime-inspector-insert-more-button (index previous) - (slime-insert-propertized - (list 'slime-range-button (list index previous) - 'mouse-face 'highlight - 'face 'slime-inspector-action-face) - (if previous " [--more--]\n" " [--more--]"))) - -(defun slime-inspector-fetch-all () - "Fetch all inspector contents and go to the end." - (interactive) - (goto-char (1- (point-max))) - (let ((button (get-text-property (point) 'slime-range-button))) - (when button - (let (slime-inspector-limit) - (slime-inspector-fetch-more button))))) - -(defun slime-inspector-fetch-more (button) - (cl-destructuring-bind (index prev) button - (slime-inspector-fetch-chunk - (list '() (1+ index) index index) prev - (slime-rcurry - (lambda (chunk prev) - (let ((inhibit-read-only t)) - (apply #'delete-region (slime-property-bounds 'slime-range-button)) - (slime-inspector-insert-chunk chunk prev (not prev)))) - prev)))) - -(defun slime-inspector-fetch-chunk (chunk prev cont) - (slime-inspector-fetch chunk slime-inspector-limit prev cont)) - -(defun slime-inspector-fetch (chunk limit prev cont) - (cl-destructuring-bind (from to) - (slime-inspector-next-range chunk limit prev) - (cond ((and from to) - (slime-eval-async - `(swank:inspector-range ,from ,to) - (slime-rcurry (lambda (chunk2 chunk1 limit prev cont) - (slime-inspector-fetch - (slime-inspector-join-chunks chunk1 chunk2) - limit prev cont)) - chunk limit prev cont))) - (t (funcall cont chunk))))) - -(defun slime-inspector-next-range (chunk limit prev) - (cl-destructuring-bind (_ len start end) chunk - (let ((count (- end start))) - (cond ((and prev (< 0 start) (or (not limit) (< count limit))) - (list (if limit (max (- end limit) 0) 0) start)) - ((and (not prev) (< end len) (or (not limit) (< count limit))) - (list end (if limit (+ start limit) most-positive-fixnum))) - (t '(nil nil)))))) - -(defun slime-inspector-join-chunks (chunk1 chunk2) - (cl-destructuring-bind (i1 _l1 s1 e1) chunk1 - (cl-destructuring-bind (i2 l2 s2 e2) chunk2 - (cond ((= e1 s2) - (list (append i1 i2) l2 s1 e2)) - ((= e2 s1) - (list (append i2 i1) l2 s2 e1)) - (t (error "Invalid chunks")))))) - -(set-keymap-parent slime-inspector-mode-map slime-parent-map) - -(slime-define-keys slime-inspector-mode-map - ([return] 'slime-inspector-operate-on-point) - ("\C-m" 'slime-inspector-operate-on-point) - ([mouse-1] 'slime-inspector-operate-on-click) - ([mouse-2] 'slime-inspector-operate-on-click) - ([mouse-6] 'slime-inspector-pop) - ([mouse-7] 'slime-inspector-next) - ("l" 'slime-inspector-pop) - ("n" 'slime-inspector-next) - (" " 'slime-inspector-next) - ("d" 'slime-inspector-describe) - ("p" 'slime-inspector-pprint) - ("e" 'slime-inspector-eval) - ("h" 'slime-inspector-history) - ("g" 'slime-inspector-reinspect) - ("v" 'slime-inspector-toggle-verbose) - ("\C-i" 'slime-inspector-next-inspectable-object) - ([(shift tab)] - 'slime-inspector-previous-inspectable-object) ; Emacs translates S-TAB - ([backtab] 'slime-inspector-previous-inspectable-object) ; to BACKTAB on X. - ("." 'slime-inspector-show-source) - (">" 'slime-inspector-fetch-all) - ("q" 'slime-inspector-quit)) - - -;;;; Buffer selector - -(defvar slime-selector-methods nil - "List of buffer-selection methods for the `slime-select' command. -Each element is a list (KEY DESCRIPTION FUNCTION). -DESCRIPTION is a one-line description of what the key selects.") - -(defvar slime-selector-other-window nil - "If non-nil use switch-to-buffer-other-window.") - -(defun slime-selector (&optional other-window) - "Select a new buffer by type, indicated by a single character. -The user is prompted for a single character indicating the method by -which to choose a new buffer. The `?' character describes the -available methods. - -See `def-slime-selector-method' for defining new methods." - (interactive) - (message "Select [%s]: " - (apply #'string (mapcar #'car slime-selector-methods))) - (let* ((slime-selector-other-window other-window) - (sequence (save-window-excursion - (select-window (minibuffer-window)) - (key-description (read-key-sequence nil)))) - (ch (cond ((equal sequence "C-g") - (keyboard-quit)) - ((equal sequence "TAB") - ?i) - ((= (length sequence) 1) - (elt sequence 0)) - ((= (length sequence) 3) - (elt sequence 2)))) - (method (cl-find ch slime-selector-methods :key #'car))) - (cond (method - (funcall (cl-third method))) - (t - (message "No method for character: ?\\%c" ch) - (ding) - (sleep-for 1) - (discard-input) - (slime-selector))))) - -(defmacro def-slime-selector-method (key description &rest body) - "Define a new `slime-select' buffer selection method. - -KEY is the key the user will enter to choose this method. - -DESCRIPTION is a one-line sentence describing how the method -selects a buffer. - -BODY is a series of forms which are evaluated when the selector -is chosen. The returned buffer is selected with -switch-to-buffer." - (let ((method `(lambda () - (let ((buffer (progn ,@body))) - (cond ((not (get-buffer buffer)) - (message "No such buffer: %S" buffer) - (ding)) - ((get-buffer-window buffer) - (select-window (get-buffer-window buffer))) - (slime-selector-other-window - (switch-to-buffer-other-window buffer)) - (t - (switch-to-buffer buffer))))))) - `(setq slime-selector-methods - (cl-sort (cons (list ,key ,description ,method) - (cl-remove ,key slime-selector-methods :key #'car)) - #'< :key #'car)))) - -(def-slime-selector-method ?? "Selector help buffer." - (ignore-errors (kill-buffer "*Select Help*")) - (with-current-buffer (get-buffer-create "*Select Help*") - (insert "Select Methods:\n\n") - (cl-loop for (key line nil) in slime-selector-methods - do (insert (format "%c:\t%s\n" key line))) - (goto-char (point-min)) - (help-mode) - (display-buffer (current-buffer) t)) - (slime-selector) - (current-buffer)) - -(cl-pushnew (list ?4 "Select in other window" (lambda () (slime-selector t))) - slime-selector-methods :key #'car) - -(def-slime-selector-method ?q "Abort." - (top-level)) - -(def-slime-selector-method ?i - "*inferior-lisp* buffer." - (cond ((and (slime-connected-p) (slime-process)) - (process-buffer (slime-process))) - (t - "*inferior-lisp*"))) - -(def-slime-selector-method ?v - "*slime-events* buffer." - slime-event-buffer-name) - -(def-slime-selector-method ?l - "most recently visited lisp-mode buffer." - (slime-recently-visited-buffer 'lisp-mode)) - -(def-slime-selector-method ?d - "*sldb* buffer for the current connection." - (or (sldb-get-default-buffer) - (error "No debugger buffer"))) - -(def-slime-selector-method ?e - "most recently visited emacs-lisp-mode buffer." - (slime-recently-visited-buffer 'emacs-lisp-mode)) - -(def-slime-selector-method ?c - "SLIME connections buffer." - (slime-list-connections) - slime-connections-buffer-name) - -(def-slime-selector-method ?n - "Cycle to the next Lisp connection." - (slime-next-connection) - (concat "*slime-repl " - (slime-connection-name (slime-current-connection)) - "*")) - -(def-slime-selector-method ?p - "Cycle to the previous Lisp connection." - (slime-prev-connection) - (concat "*slime-repl " - (slime-connection-name (slime-current-connection)) - "*")) - -(def-slime-selector-method ?t - "SLIME threads buffer." - (slime-list-threads) - slime-threads-buffer-name) - -(defun slime-recently-visited-buffer (mode) - "Return the most recently visited buffer whose major-mode is MODE. -Only considers buffers that are not already visible." - (cl-loop for buffer in (buffer-list) - when (and (with-current-buffer buffer (eq major-mode mode)) - (not (string-match "^ " (buffer-name buffer))) - (null (get-buffer-window buffer 'visible))) - return buffer - finally (error "Can't find unshown buffer in %S" mode))) - - -;;;; Indentation - -(defun slime-update-indentation () - "Update indentation for all macros defined in the Lisp system." - (interactive) - (slime-eval-async '(swank:update-indentation-information))) - -(defvar slime-indentation-update-hooks) - -(defun slime-intern-indentation-spec (spec) - (cond ((consp spec) - (cons (slime-intern-indentation-spec (car spec)) - (slime-intern-indentation-spec (cdr spec)))) - ((stringp spec) - (intern spec)) - (t - spec))) - -;; FIXME: restore the old version without per-package -;; stuff. slime-indentation.el should be able tho disable the simple -;; version if needed. -(defun slime-handle-indentation-update (alist) - "Update Lisp indent information. - -ALIST is a list of (SYMBOL-NAME . INDENT-SPEC) of proposed indentation -settings for `common-lisp-indent-function'. The appropriate property -is setup, unless the user already set one explicitly." - (dolist (info alist) - (let ((symbol (intern (car info))) - (indent (slime-intern-indentation-spec (cl-second info))) - (packages (cl-third info))) - (if (and (boundp 'common-lisp-system-indentation) - (fboundp 'slime-update-system-indentation)) - ;; A table provided by slime-cl-indent.el. - (funcall #'slime-update-system-indentation symbol indent packages) - ;; Does the symbol have an indentation value that we set? - (when (equal (get symbol 'common-lisp-indent-function) - (get symbol 'slime-indent)) - (put symbol 'common-lisp-indent-function indent) - (put symbol 'slime-indent indent))) - (run-hook-with-args 'slime-indentation-update-hooks - symbol indent packages)))) - - -;;;; Contrib modules - -(defun slime-require (module) - (cl-pushnew module slime-required-modules) - (when (slime-connected-p) - (slime-load-contribs))) - -(defun slime-load-contribs () - (let ((needed (cl-remove-if (lambda (s) - (member (cl-subseq (symbol-name s) 1) - (mapcar #'downcase - (slime-lisp-modules)))) - slime-required-modules))) - (when needed - ;; No asynchronous request because with :SPAWN that could result - ;; in the attempt to load modules concurrently which may not be - ;; supported by the host Lisp. - (setf (slime-lisp-modules) - (slime-eval `(swank:swank-require ',needed)))))) - -(cl-defstruct slime-contrib - name - slime-dependencies - swank-dependencies - enable - disable - authors - license) - -(defun slime-contrib--enable-fun (name) - (intern (concat (symbol-name name) "-init"))) - -(defun slime-contrib--disable-fun (name) - (intern (concat (symbol-name name) "-unload"))) - -(defmacro define-slime-contrib (name _docstring &rest clauses) - (declare (indent 1)) - (cl-destructuring-bind (&key slime-dependencies - swank-dependencies - on-load - on-unload - authors - license) - (cl-loop for (key . value) in clauses append `(,key ,value)) - `(progn - ,@(mapcar (lambda (d) `(require ',d)) slime-dependencies) - (defun ,(slime-contrib--enable-fun name) () - (mapc #'funcall ',(mapcar - #'slime-contrib--enable-fun - slime-dependencies)) - (mapc #'slime-require ',swank-dependencies) - ,@on-load) - (defun ,(slime-contrib--disable-fun name) () - ,@on-unload - (mapc #'funcall ',(mapcar - #'slime-contrib--disable-fun - slime-dependencies))) - (put 'slime-contribs ',name - (make-slime-contrib - :name ',name :authors ',authors :license ',license - :slime-dependencies ',slime-dependencies - :swank-dependencies ',swank-dependencies - :enable ',(slime-contrib--enable-fun name) - :disable ',(slime-contrib--disable-fun name)))))) - -(defun slime-all-contribs () - (cl-loop for (nil val) on (symbol-plist 'slime-contribs) by #'cddr - when (slime-contrib-p val) - collect val)) - -(defun slime-contrib-all-dependencies (contrib) - "List all contribs recursively needed by CONTRIB, including self." - (cons contrib - (cl-mapcan #'slime-contrib-all-dependencies - (slime-contrib-slime-dependencies - (slime-find-contrib contrib))))) - -(defun slime-find-contrib (name) - (get 'slime-contribs name)) - -(defun slime-read-contrib-name () - (let ((names (cl-loop for c in (slime-all-contribs) collect - (symbol-name (slime-contrib-name c))))) - (intern (completing-read "Contrib: " names nil t)))) - -(defun slime-enable-contrib (name) - (interactive (list (slime-read-contrib-name))) - (let ((c (or (slime-find-contrib name) - (error "Unknown contrib: %S" name)))) - (funcall (slime-contrib-enable c)))) - -(defun slime-disable-contrib (name) - (interactive (list (slime-read-contrib-name))) - (let ((c (or (slime-find-contrib name) - (error "Unknown contrib: %S" name)))) - (funcall (slime-contrib-disable c)))) - - -;;;;; Pull-down menu - -(defvar slime-easy-menu - (let ((C '(slime-connected-p))) - `("SLIME" - [ "Edit Definition..." slime-edit-definition ,C ] - [ "Return From Definition" slime-pop-find-definition-stack ,C ] - [ "Complete Symbol" completion-at-point ,C ] - "--" - ("Evaluation" - [ "Eval Defun" slime-eval-defun ,C ] - [ "Eval Last Expression" slime-eval-last-expression ,C ] - [ "Eval And Pretty-Print" slime-pprint-eval-last-expression ,C ] - [ "Eval Region" slime-eval-region ,C ] - [ "Eval Region And Pretty-Print" slime-pprint-eval-region ,C ] - [ "Interactive Eval..." slime-interactive-eval ,C ] - [ "Edit Lisp Value..." slime-edit-value ,C ] - [ "Call Defun" slime-call-defun ,C ]) - ("Debugging" - [ "Macroexpand Once..." slime-macroexpand-1 ,C ] - [ "Macroexpand All..." slime-macroexpand-all ,C ] - [ "Create Trace Buffer" slime-redirect-trace-output ,C ] - [ "Toggle Trace..." slime-toggle-trace-fdefinition ,C ] - [ "Untrace All" slime-untrace-all ,C] - [ "Disassemble..." slime-disassemble-symbol ,C ] - [ "Inspect..." slime-inspect ,C ]) - ("Compilation" - [ "Compile Defun" slime-compile-defun ,C ] - [ "Compile/Load File" slime-compile-and-load-file ,C ] - [ "Compile File" slime-compile-file ,C ] - [ "Compile Region" slime-compile-region ,C ] - "--" - [ "Next Note" slime-next-note t ] - [ "Previous Note" slime-previous-note t ] - [ "Remove Notes" slime-remove-notes t ] - [ "List Notes" slime-list-compiler-notes ,C ]) - ("Cross Reference" - [ "Who Calls..." slime-who-calls ,C ] - [ "Who References... " slime-who-references ,C ] - [ "Who Sets..." slime-who-sets ,C ] - [ "Who Binds..." slime-who-binds ,C ] - [ "Who Macroexpands..." slime-who-macroexpands ,C ] - [ "Who Specializes..." slime-who-specializes ,C ] - [ "List Callers..." slime-list-callers ,C ] - [ "List Callees..." slime-list-callees ,C ] - [ "Next Location" slime-next-location t ]) - ("Editing" - [ "Check Parens" check-parens t] - [ "Update Indentation" slime-update-indentation ,C] - [ "Select Buffer" slime-selector t]) - ("Profiling" - [ "Toggle Profiling..." slime-toggle-profile-fdefinition ,C ] - [ "Profile Package" slime-profile-package ,C] - [ "Profile by Substring" slime-profile-by-substring ,C ] - [ "Unprofile All" slime-unprofile-all ,C ] - [ "Show Profiled" slime-profiled-functions ,C ] - "--" - [ "Report" slime-profile-report ,C ] - [ "Reset Counters" slime-profile-reset ,C ]) - ("Documentation" - [ "Describe Symbol..." slime-describe-symbol ,C ] - [ "Lookup Documentation..." slime-documentation-lookup t ] - [ "Apropos..." slime-apropos ,C ] - [ "Apropos all..." slime-apropos-all ,C ] - [ "Apropos Package..." slime-apropos-package ,C ] - [ "Hyperspec..." slime-hyperspec-lookup t ]) - "--" - [ "Interrupt Command" slime-interrupt ,C ] - [ "Abort Async. Command" slime-quit ,C ] - [ "Sync Package & Directory" slime-sync-package-and-default-directory ,C] - ))) - -(defvar slime-sldb-easy-menu - (let ((C '(slime-connected-p))) - `("SLDB" - [ "Next Frame" sldb-down t ] - [ "Previous Frame" sldb-up t ] - [ "Toggle Frame Details" sldb-toggle-details t ] - [ "Next Frame (Details)" sldb-details-down t ] - [ "Previous Frame (Details)" sldb-details-up t ] - "--" - [ "Eval Expression..." slime-interactive-eval ,C ] - [ "Eval in Frame..." sldb-eval-in-frame ,C ] - [ "Eval in Frame (pretty print)..." sldb-pprint-eval-in-frame ,C ] - [ "Inspect In Frame..." sldb-inspect-in-frame ,C ] - [ "Inspect Condition Object" sldb-inspect-condition ,C ] - "--" - [ "Restart Frame" sldb-restart-frame ,C ] - [ "Return from Frame..." sldb-return-from-frame ,C ] - ("Invoke Restart" - [ "Continue" sldb-continue ,C ] - [ "Abort" sldb-abort ,C ] - [ "Step" sldb-step ,C ] - [ "Step next" sldb-next ,C ] - [ "Step out" sldb-out ,C ] - ) - "--" - [ "Quit (throw)" sldb-quit ,C ] - [ "Break With Default Debugger" sldb-break-with-default-debugger ,C ]))) - -(easy-menu-define menubar-slime slime-mode-map "SLIME" slime-easy-menu) - -(defun slime-add-easy-menu () - (easy-menu-add slime-easy-menu 'slime-mode-map)) - -(add-hook 'slime-mode-hook 'slime-add-easy-menu) - -(defun slime-sldb-add-easy-menu () - (easy-menu-define menubar-slime-sldb - sldb-mode-map "SLDB" slime-sldb-easy-menu) - (easy-menu-add slime-sldb-easy-menu 'sldb-mode-map)) - -(add-hook 'sldb-mode-hook 'slime-sldb-add-easy-menu) - - -;;;; Cheat Sheet - -(defvar - slime-cheat-sheet-table - '((:title - "Editing lisp code" - :map slime-mode-map - :bindings ((slime-eval-defun "Evaluate current top level form") - (slime-compile-defun "Compile current top level form") - (slime-interactive-eval "Prompt for form and eval it") - (slime-compile-and-load-file "Compile and load current file") - (slime-sync-package-and-default-directory - "Synch default package and directory with current buffer") - (slime-next-note "Next compiler note") - (slime-previous-note "Previous compiler note") - (slime-remove-notes "Remove notes") - slime-documentation-lookup)) - (:title "Completion" - :map slime-mode-map - :bindings (slime-indent-and-complete-symbol - slime-fuzzy-complete-symbol)) - (:title - "Within SLDB buffers" - :map sldb-mode-map - :bindings ((sldb-default-action "Do 'whatever' with thing at point") - (sldb-toggle-details "Toggle frame details visualization") - (sldb-quit "Quit to REPL") - (sldb-abort "Invoke ABORT restart") - (sldb-continue "Invoke CONTINUE restart (if available)") - (sldb-show-source "Jump to frame's source code") - (sldb-eval-in-frame "Evaluate in frame at point") - (sldb-inspect-in-frame - "Evaluate in frame at point and inspect result"))) - (:title - "Within the Inspector" - :map slime-inspector-mode-map - :bindings ((slime-inspector-next-inspectable-object - "Jump to next inspectable object") - (slime-inspector-operate-on-point - "Inspect object or execute action at point") - (slime-inspector-reinspect "Reinspect current object") - (slime-inspector-pop "Return to previous object") - ;;(slime-inspector-copy-down "Send object at point to REPL") - (slime-inspector-toggle-verbose "Toggle verbose mode") - (slime-inspector-quit "Quit"))) - (:title - "Finding Definitions" - :map slime-mode-map - :bindings (slime-edit-definition - slime-pop-find-definition-stack)))) - -(defun slime-cheat-sheet () - (interactive) - (switch-to-buffer-other-frame - (get-buffer-create (slime-buffer-name :cheat-sheet))) - (setq buffer-read-only nil) - (delete-region (point-min) (point-max)) - (goto-char (point-min)) - (insert - "SLIME: The Superior Lisp Interaction Mode for Emacs (minor-mode).\n\n") - (dolist (mode slime-cheat-sheet-table) - (let ((title (cl-getf mode :title)) - (mode-map (cl-getf mode :map)) - (mode-keys (cl-getf mode :bindings))) - (insert title) - (insert ":\n") - (insert (make-string (1+ (length title)) ?-)) - (insert "\n") - (let ((keys '()) - (descriptions '())) - (dolist (func mode-keys) - ;; func is eithor the function name or a list (NAME DESCRIPTION) - (push (if (symbolp func) - (prin1-to-string func) - (cl-second func)) - descriptions) - (let ((all-bindings (where-is-internal (if (symbolp func) - func - (cl-first func)) - (symbol-value mode-map))) - (key-bindings '())) - (dolist (binding all-bindings) - (when (and (vectorp binding) - (integerp (aref binding 0))) - (push binding key-bindings))) - (push (mapconcat 'key-description key-bindings " or ") keys))) - (cl-loop with desc-length = (apply 'max (mapcar 'length descriptions)) - for key in (nreverse keys) - for desc in (nreverse descriptions) - do (insert desc) - do (insert (make-string (- desc-length (length desc)) ? )) - do (insert " => ") - do (insert (if (string= "" key) - "" - key)) - do (insert "\n") - finally do (insert "\n"))))) - (setq buffer-read-only t) - (goto-char (point-min))) - - -;;;; Utilities (no not Paul Graham style) - -;; XXX: unused function -(defun slime-intersperse (element list) - "Intersperse ELEMENT between each element of LIST." - (if (null list) - '() - (cons (car list) - (cl-mapcan (lambda (x) (list element x)) (cdr list))))) - -;;; FIXME: this looks almost slime `slime-alistify', perhaps the two -;;; functions can be merged. -(defun slime-group-similar (similar-p list) - "Return the list of lists of 'similar' adjacent elements of LIST. -The function SIMILAR-P is used to test for similarity. -The order of the input list is preserved." - (if (null list) - nil - (let ((accumulator (list (list (car list))))) - (dolist (x (cdr list)) - (if (funcall similar-p x (caar accumulator)) - (push x (car accumulator)) - (push (list x) accumulator))) - (reverse (mapcar #'reverse accumulator))))) - -(defun slime-alistify (list key test) - "Partition the elements of LIST into an alist. -KEY extracts the key from an element and TEST is used to compare -keys." - (let ((alist '())) - (dolist (e list) - (let* ((k (funcall key e)) - (probe (cl-assoc k alist :test test))) - (if probe - (push e (cdr probe)) - (push (cons k (list e)) alist)))) - ;; Put them back in order. - (cl-loop for (key . value) in (reverse alist) - collect (cons key (reverse value))))) - -;;;;; Misc. - -(defun slime-length= (seq n) - "Return (= (length SEQ) N)." - (cl-etypecase seq - (list - (cond ((zerop n) (null seq)) - ((let ((tail (nthcdr (1- n) seq))) - (and tail (null (cdr tail))))))) - (sequence - (= (length seq) n)))) - -(defun slime-length> (seq n) - "Return (> (length SEQ) N)." - (cl-etypecase seq - (list (nthcdr n seq)) - (sequence (> (length seq) n)))) - -(defun slime-trim-whitespace (str) - (let ((start (cl-position-if-not (lambda (x) - (memq x '(?\t ?\n ?\s ?\r))) - str)) - - (end (cl-position-if-not (lambda (x) - (memq x '(?\t ?\n ?\s ?\r))) - str - :from-end t))) - (if start - (substring str start (1+ end)) - ""))) - -;;;;; Buffer related - -(defun slime-buffer-narrowed-p (&optional buffer) - "Returns T if BUFFER (or the current buffer respectively) is narrowed." - (with-current-buffer (or buffer (current-buffer)) - (let ((beg (point-min)) - (end (point-max)) - (total (buffer-size))) - (or (/= beg 1) (/= end (1+ total)))))) - -(defun slime-column-max () - (save-excursion - (goto-char (point-min)) - (cl-loop for column = (prog2 (end-of-line) (current-column) (forward-line)) - until (= (point) (point-max)) - maximizing column))) - -;;;;; CL symbols vs. Elisp symbols. - -(defun slime-cl-symbol-name (symbol) - (let ((n (if (stringp symbol) symbol (symbol-name symbol)))) - (if (string-match ":\\([^:]*\\)$" n) - (let ((symbol-part (match-string 1 n))) - (if (string-match "^|\\(.*\\)|$" symbol-part) - (match-string 1 symbol-part) - symbol-part)) - n))) - -(defun slime-cl-symbol-package (symbol &optional default) - (let ((n (if (stringp symbol) symbol (symbol-name symbol)))) - (if (string-match "^\\([^:]*\\):" n) - (match-string 1 n) - default))) - -(defun slime-qualify-cl-symbol-name (symbol-or-name) - "Return a package-qualified string for SYMBOL-OR-NAME. -If SYMBOL-OR-NAME doesn't already have a package prefix the -current package is used." - (let ((s (if (stringp symbol-or-name) - symbol-or-name - (symbol-name symbol-or-name)))) - (if (slime-cl-symbol-package s) - s - (format "%s::%s" - (let* ((package (slime-current-package))) - ;; package is a string like ":cl-user" - ;; or "CL-USER", or "\"CL-USER\"". - (if package - (slime-pretty-package-name package) - "CL-USER")) - (slime-cl-symbol-name s))))) - -;;;;; Moving, CL idiosyncracies aware (reader conditionals &c.) - -(defmacro slime-point-moves-p (&rest body) - "Execute BODY and return true if the current buffer's point moved." - (declare (indent 0)) - (let ((pointvar (cl-gensym "point-"))) - `(let ((,pointvar (point))) - (save-current-buffer ,@body) - (/= ,pointvar (point))))) - -(defun slime-forward-sexp (&optional count) - "Like `forward-sexp', but understands reader-conditionals (#- and #+), -and skips comments." - (dotimes (_i (or count 1)) - (slime-forward-cruft) - (forward-sexp))) - -(defconst slime-reader-conditionals-regexp - ;; #!+, #!- are SBCL specific reader-conditional syntax. - ;; We need this for the source files of SBCL itself. - (regexp-opt '("#+" "#-" "#!+" "#!-"))) - -(defun slime-forward-reader-conditional () - "Move past any reader conditional (#+ or #-) at point." - (when (looking-at slime-reader-conditionals-regexp) - (goto-char (match-end 0)) - (let* ((plus-conditional-p (eq (char-before) ?+)) - (result (slime-eval-feature-expression - (condition-case e - (read (current-buffer)) - (invalid-read-syntax - (signal 'slime-unknown-feature-expression (cdr e))))))) - (unless (if plus-conditional-p result (not result)) - ;; skip this sexp - (slime-forward-sexp))))) - -(defun slime-forward-cruft () - "Move forward over whitespace, comments, reader conditionals." - (while (slime-point-moves-p (skip-chars-forward " \t\n") - (forward-comment (buffer-size)) - (inline (slime-forward-reader-conditional))))) - -(defun slime-keywordify (symbol) - "Make a keyword out of the symbol SYMBOL." - (let ((name (downcase (symbol-name symbol)))) - (intern (if (eq ?: (aref name 0)) - name - (concat ":" name))))) - -(put 'slime-incorrect-feature-expression - 'error-conditions '(slime-incorrect-feature-expression error)) - -(put 'slime-unknown-feature-expression - 'error-conditions '(slime-unknown-feature-expression - slime-incorrect-feature-expression - error)) - -;; FIXME: let it crash -;; FIXME: the length=1 constraint is bogus -(defun slime-eval-feature-expression (e) - "Interpret a reader conditional expression." - (cond ((symbolp e) - (memq (slime-keywordify e) (slime-lisp-features))) - ((and (consp e) (symbolp (car e))) - (funcall (let ((head (slime-keywordify (car e)))) - (cl-case head - (:and #'cl-every) - (:or #'cl-some) - (:not - (lexical-let ((feature-expression e)) - (lambda (f l) - (cond - ((slime-length= l 0) t) - ((slime-length= l 1) (not (apply f l))) - (t (signal 'slime-incorrect-feature-expression - feature-expression)))))) - (t (signal 'slime-unknown-feature-expression head)))) - #'slime-eval-feature-expression - (cdr e))) - (t (signal 'slime-incorrect-feature-expression e)))) - -;;;;; Extracting Lisp forms from the buffer or user - -(defun slime-defun-at-point () - "Return the text of the defun at point." - (apply #'buffer-substring-no-properties - (slime-region-for-defun-at-point))) - -(defun slime-region-for-defun-at-point () - "Return the start and end position of defun at point." - (save-excursion - (save-match-data - (end-of-defun) - (let ((end (point))) - (beginning-of-defun) - (list (point) end))))) - -(defun slime-beginning-of-symbol () - "Move to the beginning of the CL-style symbol at point." - (while (re-search-backward "\\(\\sw\\|\\s_\\|\\s\\.\\|\\s\\\\|[#@|]\\)\\=" - (when (> (point) 2000) (- (point) 2000)) - t)) - (re-search-forward "\\=#[-+.<|]" nil t) - (when (and (looking-at "@") (eq (char-before) ?\,)) - (forward-char))) - -(defun slime-end-of-symbol () - "Move to the end of the CL-style symbol at point." - (re-search-forward "\\=\\(\\sw\\|\\s_\\|\\s\\.\\|#:\\|[@|]\\)*")) - -(put 'slime-symbol 'end-op 'slime-end-of-symbol) -(put 'slime-symbol 'beginning-op 'slime-beginning-of-symbol) - -(defun slime-symbol-start-pos () - "Return the starting position of the symbol under point. -The result is unspecified if there isn't a symbol under the point." - (save-excursion (slime-beginning-of-symbol) (point))) - -(defun slime-symbol-end-pos () - (save-excursion (slime-end-of-symbol) (point))) - -(defun slime-bounds-of-symbol-at-point () - "Return the bounds of the symbol around point. -The returned bounds are either nil or non-empty." - (let ((bounds (bounds-of-thing-at-point 'slime-symbol))) - (if (and bounds - (< (car bounds) - (cdr bounds))) - bounds))) - -(defun slime-symbol-at-point () - "Return the name of the symbol at point, otherwise nil." - ;; (thing-at-point 'symbol) returns "" in empty buffers - (let ((bounds (slime-bounds-of-symbol-at-point))) - (if bounds - (buffer-substring-no-properties (car bounds) - (cdr bounds))))) - -(defun slime-bounds-of-sexp-at-point () - "Return the bounds sexp at point as a pair (or nil)." - (or (slime-bounds-of-symbol-at-point) - (and (equal (char-after) ?\() - (member (char-before) '(?\' ?\, ?\@)) - ;; hide stuff before ( to avoid quirks with '( etc. - (save-restriction - (narrow-to-region (point) (point-max)) - (bounds-of-thing-at-point 'sexp))) - (bounds-of-thing-at-point 'sexp))) - -(defun slime-sexp-at-point () - "Return the sexp at point as a string, otherwise nil." - (let ((bounds (slime-bounds-of-sexp-at-point))) - (if bounds - (buffer-substring-no-properties (car bounds) - (cdr bounds))))) - -(defun slime-sexp-at-point-or-error () - "Return the sexp at point as a string, othwise signal an error." - (or (slime-sexp-at-point) (user-error "No expression at point"))) - -(defun slime-string-at-point () - "Returns the string at point as a string, otherwise nil." - (let ((sexp (slime-sexp-at-point))) - (if (and sexp - (eql (char-syntax (aref sexp 0)) ?\")) - sexp - nil))) - -(defun slime-string-at-point-or-error () - "Return the sexp at point as a string, othwise signal an error." - (or (slime-string-at-point) (error "No string at point."))) - -(defun slime-input-complete-p (start end) - "Return t if the region from START to END contains a complete sexp." - (save-excursion - (goto-char start) - (cond ((looking-at "\\s *['`#]?[(\"]") - (ignore-errors - (save-restriction - (narrow-to-region start end) - ;; Keep stepping over blanks and sexps until the end of - ;; buffer is reached or an error occurs. Tolerate extra - ;; close parens. - (cl-loop do (skip-chars-forward " \t\r\n)") - until (eobp) - do (forward-sexp)) - t))) - (t t)))) - - -;;;; slime.el in pretty colors - -(cl-loop for sym in (list 'slime-def-connection-var - 'slime-define-channel-type - 'slime-define-channel-method - 'define-slime-contrib - 'slime-defun-if-undefined - 'slime-defmacro-if-undefined) - for regexp = (format "(\\(%S\\)\\s +\\(\\(\\w\\|\\s_\\)+\\)" - sym) - do (font-lock-add-keywords - 'emacs-lisp-mode - `((,regexp (1 font-lock-keyword-face) - (2 font-lock-variable-name-face))))) - -;;;; target manipulation (used by slime-presentations, slime-media, -;;;; slime-repl and slime-buffer-streams, at -;;;; least) - -(defvar slime-output-target-to-marker - (make-hash-table) - "Map from TARGET ids to Emacs markers. -The markers indicate where output should be inserted.") - -(defun slime-output-target-marker (target) - "Return the marker where output for TARGET should be inserted." - (gethash target slime-output-target-to-marker)) - -(defun slime-emit-to-target (string target) - "Insert STRING at target TARGET. -See `slime-output-target-to-marker'." - (let* ((marker (slime-output-target-marker target)) - (buffer (and marker (marker-buffer marker)))) - (when buffer - (with-current-buffer buffer - (save-excursion - ;; Insert STRING at MARKER, then move MARKER behind - ;; the insertion. - (goto-char marker) - (insert-before-markers string) - (set-marker marker (point))))))) - -;;;; Finishing up - -(eval-when-compile - (require 'bytecomp)) - -(defun slime--byte-compile (symbol) - (require 'bytecomp) ;; tricky interaction between autoload and let. - (let ((byte-compile-warnings '())) - (byte-compile symbol))) - -(defun slime--compile-hotspots () - (mapc (lambda (sym) - (cond ((fboundp sym) - (unless (byte-code-function-p (symbol-function sym)) - (slime--byte-compile sym))) - (t (error "%S is not fbound" sym)))) - '(slime-alistify - slime-log-event - slime-events-buffer - slime-process-available-input - slime-dispatch-event - slime-net-filter - slime-net-have-input-p - slime-net-decode-length - slime-net-read - slime-print-apropos - slime-insert-propertized - slime-beginning-of-symbol - slime-end-of-symbol - slime-eval-feature-expression - slime-forward-sexp - slime-forward-cruft - slime-forward-reader-conditional))) - -(slime--compile-hotspots) - -(add-to-list 'load-path (expand-file-name "contrib" slime-path)) - -(run-hooks 'slime-load-hook) -(provide 'slime) - -(slime-setup) - -;; Local Variables: -;; outline-regexp: ";;;;+" -;; indent-tabs-mode: nil -;; coding: latin-1-unix -;; End: -;;; slime.el ends here diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/start-swank.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/start-swank.lisp deleted file mode 100644 index 340606c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/start-swank.lisp +++ /dev/null @@ -1,20 +0,0 @@ -;;; This file is intended to be loaded by an implementation to -;;; get a running swank server -;;; e.g. sbcl --load start-swank.lisp -;;; -;;; Default port is 4005 - -;;; For additional swank-side configurations see -;;; 6.2 section of the Slime user manual. - -(load (merge-pathnames "swank-loader.lisp" *load-truename*)) - -(swank-loader:init - :delete nil ; delete any existing SWANK packages - :reload nil ; reload SWANK, even if the SWANK package already exists - :load-contribs nil) ; load all contribs - -(swank:create-server :port 4005 - ;; if non-nil the connection won't be closed - ;; after connecting - :dont-close nil) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank-loader.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank-loader.lisp deleted file mode 100644 index ec89e67..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank-loader.lisp +++ /dev/null @@ -1,376 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- -;;; -;;; swank-loader.lisp --- Compile and load the Slime backend. -;;; -;;; Created 2003, James Bielman -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -;; If you want customize the source- or fasl-directory you can set -;; swank-loader:*source-directory* resp. swank-loader:*fasl-directory* -;; before loading this files. -;; E.g.: -;; -;; (load ".../swank-loader.lisp") -;; (setq swank-loader::*fasl-directory* "/tmp/fasl/") -;; (swank-loader:init) - -(cl:defpackage :swank-loader - (:use :cl) - (:export :init - :dump-image - :list-fasls - :*source-directory* - :*fasl-directory* - :*started-from-emacs*)) - -(cl:in-package :swank-loader) - -(defvar *started-from-emacs* nil) - -(defvar *source-directory* - (make-pathname :name nil :type nil - :defaults (or *load-pathname* *default-pathname-defaults*)) - "The directory where to look for the source.") - -(defparameter *sysdep-files* - #+cmu '((swank source-path-parser) (swank source-file-cache) (swank cmucl) - (swank gray)) - #+scl '((swank source-path-parser) (swank source-file-cache) (swank scl) - (swank gray)) - #+sbcl '((swank source-path-parser) (swank source-file-cache) (swank sbcl) - (swank gray)) - #+clozure '(metering (swank ccl) (swank gray)) - #+lispworks '((swank lispworks) (swank gray)) - #+allegro '((swank allegro) (swank gray)) - #+clisp '(xref metering (swank clisp) (swank gray)) - #+armedbear '((swank abcl)) - #+cormanlisp '((swank corman) (swank gray)) - #+ecl '((swank ecl) (swank gray)) - #+clasp '((swank clasp) (swank gray)) - #+mkcl '((swank mkcl) (swank gray)) - #+mezzano '((swank mezzano) (swank gray)) - ) - -(defparameter *implementation-features* - '(:allegro :lispworks :sbcl :clozure :cmu :clisp :ccl :corman :cormanlisp - :armedbear :gcl :ecl :scl :mkcl :clasp :mezzano)) - -(defparameter *os-features* - '(:macosx :linux :windows :mswindows :win32 :solaris :darwin :sunos :hpux - :unix :mezzano)) - -(defparameter *architecture-features* - '(:powerpc :ppc :x86 :x86-64 :x86_64 :amd64 :i686 :i586 :i486 :pc386 :iapx386 - :sparc64 :sparc :hppa64 :hppa :arm :armv5l :armv6l :armv7l :arm64 :aarch64 - :pentium3 :pentium4 - :mips :mipsel - :java-1.4 :java-1.5 :java-1.6 :java-1.7)) - -(defun q (s) (read-from-string s)) - -#+ecl -(defun ecl-version-string () - (format nil "~A~@[-~A~]" - (lisp-implementation-version) - (when (find-symbol "LISP-IMPLEMENTATION-VCS-ID" :ext) - (let ((vcs-id (funcall (q "ext:lisp-implementation-vcs-id")))) - (when (>= (length vcs-id) 8) - (subseq vcs-id 0 8)))))) - -#+clasp -(defun clasp-version-string () - (format nil "~A~@[-~A~]" - (lisp-implementation-version) - (core:lisp-implementation-id))) - -(defun lisp-version-string () - #+(or clozure cmu) (substitute-if #\_ (lambda (x) (find x " /")) - (lisp-implementation-version)) - #+(or cormanlisp scl mkcl) (lisp-implementation-version) - #+sbcl (format nil "~a~:[~;-no-threads~]" - (lisp-implementation-version) - #+sb-thread nil - #-sb-thread t) - #+lispworks (lisp-implementation-version) - #+allegro (format nil "~@{~a~}" - excl::*common-lisp-version-number* - (if (eq 'h 'H) "A" "M") ; ANSI vs MoDeRn - (if (member :smp *features*) "s" "") - (if (member :64bit *features*) "-64bit" "") - (excl:ics-target-case - (:-ics "") - (:+ics "-ics"))) - #+clisp (let ((s (lisp-implementation-version))) - (subseq s 0 (position #\space s))) - #+armedbear (lisp-implementation-version) - #+ecl (ecl-version-string) - #+clasp (clasp-version-string) - #+mezzano (let ((s (lisp-implementation-version))) - (subseq s 0 (position #\space s)))) - -(defun unique-dir-name () - "Return a name that can be used as a directory name that is -unique to a Lisp implementation, Lisp implementation version, -operating system, and hardware architecture." - (flet ((first-of (features) - (loop for f in features - when (find f *features*) return it)) - (maybe-warn (value fstring &rest args) - (cond (value) - (t (apply #'warn fstring args) - "unknown")))) - (let ((lisp (maybe-warn (first-of *implementation-features*) - "No implementation feature found in ~a." - *implementation-features*)) - (os (maybe-warn (first-of *os-features*) - "No os feature found in ~a." *os-features*)) - (arch (maybe-warn (first-of *architecture-features*) - "No architecture feature found in ~a." - *architecture-features*)) - (version (maybe-warn (lisp-version-string) - "Don't know how to get Lisp ~ - implementation version."))) - (format nil "~(~@{~a~^-~}~)" lisp version os arch)))) - -(defun file-newer-p (new-file old-file) - "Returns true if NEW-FILE is newer than OLD-FILE." - (> (file-write-date new-file) (file-write-date old-file))) - -(defun string-starts-with (string prefix) - (string-equal string prefix :end1 (min (length string) (length prefix)))) - -(defun slime-version-string () - "Return a string identifying the SLIME version. -Return nil if nothing appropriate is available." - (with-open-file (s (merge-pathnames "slime.el" *source-directory*) - :if-does-not-exist nil) - (when s - (loop with prefix = ";; Version: " - for line = (read-line s nil :eof) - until (eq line :eof) - when (string-starts-with line prefix) - return (subseq line (length prefix)))))) - -(defun default-fasl-dir () - (merge-pathnames - (make-pathname - :directory `(:relative ".slime" "fasl" - ,@(if (slime-version-string) (list (slime-version-string))) - ,(unique-dir-name))) - (user-homedir-pathname))) - -(defvar *fasl-directory* (default-fasl-dir) - "The directory where fasl files should be placed.") - -(defun binary-pathname (src-pathname binary-dir) - "Return the pathname where SRC-PATHNAME's binary should be compiled." - (let ((cfp (compile-file-pathname src-pathname))) - (merge-pathnames (make-pathname :name (pathname-name cfp) - :type (pathname-type cfp)) - binary-dir))) - -(defun handle-swank-load-error (condition context pathname) - (fresh-line *error-output*) - (pprint-logical-block (*error-output* () :per-line-prefix ";; ") - (format *error-output* - "~%Error ~A ~A:~% ~A~%" - context pathname condition))) - -(defun compile-files (files fasl-dir load quiet) - "Compile each file in FILES if the source is newer than its -corresponding binary, or the file preceding it was recompiled. -If LOAD is true, load the fasl file." - (let ((needs-recompile nil) - (state :unknown)) - (dolist (src files) - (let ((dest (binary-pathname src fasl-dir))) - (handler-bind - ((error (lambda (c) - (ecase state - (:compile (handle-swank-load-error c "compiling" src)) - (:load (handle-swank-load-error c "loading" dest)) - (:unknown (handle-swank-load-error c "???ing" src)))))) - (when (or needs-recompile - (not (probe-file dest)) - (file-newer-p src dest)) - (ensure-directories-exist dest) - ;; need to recompile SRC, so we'll need to recompile - ;; everything after this too. - (setf needs-recompile t - state :compile) - (or (compile-file src :output-file dest :print nil - :verbose (not quiet)) - ;; An implementation may not necessarily signal a - ;; condition itself when COMPILE-FILE fails (e.g. ECL) - (error "COMPILE-FILE returned NIL."))) - (when load - (setf state :load) - (load dest :verbose (not quiet)))))))) - -#+cormanlisp -(defun compile-files (files fasl-dir load quiet) - "Corman Lisp has trouble with compiled files." - (declare (ignore fasl-dir)) - (when load - (dolist (file files) - (load file :verbose (not quiet) - (force-output))))) - -(defun load-user-init-file () - "Load the user init file, return NIL if it does not exist." - (load (merge-pathnames (user-homedir-pathname) - (make-pathname :name ".swank" :type "lisp")) - :if-does-not-exist nil)) - -(defun load-site-init-file (dir) - (load (make-pathname :name "site-init" :type "lisp" - :defaults dir) - :if-does-not-exist nil)) - -(defun src-files (names src-dir) - (mapcar (lambda (name) - (multiple-value-bind (dirs name) - (etypecase name - (symbol (values '() name)) - (cons (values (butlast name) (car (last name))))) - (make-pathname - :directory (append (or (pathname-directory src-dir) - '(:relative)) - (mapcar #'string-downcase dirs)) - :name (string-downcase name) - :type "lisp" - :defaults src-dir))) - names)) - -(defvar *swank-files* - `(packages - (swank backend) ,@*sysdep-files* (swank match) (swank rpc) - swank)) - -(defvar *contribs* - '(swank-util swank-repl - swank-c-p-c swank-arglists swank-fuzzy - swank-fancy-inspector - swank-presentations swank-presentation-streams - #+(or asdf2 asdf3 sbcl ecl) swank-asdf - swank-package-fu - swank-hyperdoc - #+sbcl swank-sbcl-exts - swank-mrepl - swank-trace-dialog - swank-macrostep - swank-quicklisp) - "List of names for contrib modules.") - -(defun append-dir (absolute name) - (merge-pathnames - (make-pathname :directory `(:relative ,name) :defaults absolute) - absolute)) - -(defun contrib-dir (base-dir) - (append-dir base-dir "contrib")) - -(defun load-swank (&key (src-dir *source-directory*) - (fasl-dir *fasl-directory*) - quiet) - (with-compilation-unit () - (compile-files (src-files *swank-files* src-dir) fasl-dir t quiet)) - (funcall (q "swank::before-init") - (slime-version-string) - (list (contrib-dir fasl-dir) - (contrib-dir src-dir)))) - -(defun delete-stale-contrib-fasl-files (swank-files contrib-files fasl-dir) - (let ((newest (reduce #'max (mapcar #'file-write-date swank-files)))) - (dolist (src contrib-files) - (let ((fasl (binary-pathname src fasl-dir))) - (when (and (probe-file fasl) - (<= (file-write-date fasl) newest)) - (delete-file fasl)))))) - -(defun compile-contribs (&key (src-dir (contrib-dir *source-directory*)) - (fasl-dir (contrib-dir *fasl-directory*)) - (swank-src-dir *source-directory*) - load quiet) - (let* ((swank-src-files (src-files *swank-files* swank-src-dir)) - (contrib-src-files (src-files *contribs* src-dir))) - (delete-stale-contrib-fasl-files swank-src-files contrib-src-files - fasl-dir) - (compile-files contrib-src-files fasl-dir load quiet))) - -(defun loadup () - (load-swank) - (compile-contribs :load t)) - -(defun setup () - (load-site-init-file *source-directory*) - (load-user-init-file) - (when (#-clisp probe-file - #+clisp ext:probe-directory - (contrib-dir *source-directory*)) - (eval `(pushnew 'compile-contribs ,(q "swank::*after-init-hook*")))) - (funcall (q "swank::init"))) - -(defun list-swank-packages () - (remove-if-not (lambda (package) - (let ((name (package-name package))) - (and (string-not-equal name "swank-loader") - (string-starts-with name "swank")))) - (list-all-packages))) - -(defun delete-packages (packages) - (dolist (package packages) - (flet ((handle-package-error (c) - (let ((pkgs (set-difference (package-used-by-list package) - packages))) - (when pkgs - (warn "deleting ~a which is used by ~{~a~^, ~}." - package pkgs)) - (continue c)))) - (handler-bind ((package-error #'handle-package-error)) - (delete-package package))))) - -(defun init (&key delete reload load-contribs (setup t) - (quiet (not *load-verbose*)) - from-emacs) - "Load SWANK and initialize some global variables. -If DELETE is true, delete any existing SWANK packages. -If RELOAD is true, reload SWANK, even if the SWANK package already exists. -If LOAD-CONTRIBS is true, load all contribs -If SETUP is true, load user init files and initialize some -global variabes in SWANK." - (when from-emacs - (setf *started-from-emacs* t)) - (when (and delete (find-package :swank)) - (delete-packages (list-swank-packages))) - (cond ((or (not (find-package :swank)) reload) - (load-swank :quiet quiet)) - (t - (warn "Not reloading SWANK. Package already exists."))) - (when load-contribs - (compile-contribs :load t :quiet quiet)) - (when setup - (setup))) - -(defun dump-image (filename) - (init :setup nil) - (funcall (q "swank/backend:save-image") filename)) - -(defun list-fasls (&key (include-contribs t) (compile t) - (quiet (not *compile-verbose*))) - "List up SWANK's fasls along with their dependencies." - (flet ((collect-fasls (files fasl-dir) - (when compile - (compile-files files fasl-dir nil quiet)) - (loop for src in files - when (probe-file (binary-pathname src fasl-dir)) - collect it))) - (append (collect-fasls (src-files *swank-files* *source-directory*) - *fasl-directory*) - (when include-contribs - (collect-fasls (src-files *contribs* - (contrib-dir *source-directory*)) - (contrib-dir *fasl-directory*)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank.asd b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank.asd deleted file mode 100644 index d9a7627..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank.asd +++ /dev/null @@ -1,37 +0,0 @@ -;;; -*- lisp -*- - -;; ASDF system definition for loading the Swank server independently -;; of Emacs. -;; -;; This is only useful if you want to start a Swank server in a Lisp -;; processes that doesn't run under Emacs. Lisp processes created by -;; `M-x slime' automatically start the server. - -;; Usage: -;; -;; (require :swank) -;; (swank:create-swank-server PORT) => ACTUAL-PORT -;; -;; (PORT can be zero to mean "any available port".) -;; Then the Swank server is running on localhost:ACTUAL-PORT. You can -;; use `M-x slime-connect' to connect Emacs to it. -;; -;; This code has been placed in the Public Domain. All warranties -;; are disclaimed. - -(defpackage :swank-loader - (:use :cl)) - -(in-package :swank-loader) - -(defclass swank-loader-file (asdf:cl-source-file) ()) - -;;;; after loading run init - -(defmethod asdf:perform ((o asdf:load-op) (f swank-loader-file)) - (load (asdf::component-pathname f)) - (funcall (read-from-string "swank-loader::init") :reload t)) - -(asdf:defsystem :swank - :default-component-class swank-loader-file - :components ((:file "swank-loader"))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank.lisp deleted file mode 100644 index d0ba81b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank.lisp +++ /dev/null @@ -1,3795 +0,0 @@ -;;;; swank.lisp --- Server for SLIME commands. -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; -;;; This file defines the "Swank" TCP server for Emacs to talk to. The -;;; code in this file is purely portable Common Lisp. We do require a -;;; smattering of non-portable functions in order to write the server, -;;; so we have defined them in `swank/backend.lisp' and implemented -;;; them separately for each Lisp implementation. These extensions are -;;; available to us here via the `SWANK/BACKEND' package. - -(in-package :swank) -;;;; Top-level variables, constants, macros - -(defconstant cl-package (find-package :cl) - "The COMMON-LISP package.") - -(defconstant keyword-package (find-package :keyword) - "The KEYWORD package.") - -(defconstant default-server-port 4005 - "The default TCP port for the server (when started manually).") - -(defvar *swank-debug-p* t - "When true, print extra debugging information.") - -(defvar *backtrace-pprint-dispatch-table* - (let ((table (copy-pprint-dispatch nil))) - (flet ((print-string (stream string) - (cond (*print-escape* - (escape-string string stream - :map '((#\" . "\\\"") - (#\\ . "\\\\") - (#\newline . "\\n") - (#\return . "\\r")))) - (t (write-string string stream))))) - (set-pprint-dispatch 'string #'print-string 0 table) - table))) - -(defvar *backtrace-printer-bindings* - `((*print-pretty* . t) - (*print-readably* . nil) - (*print-level* . 4) - (*print-length* . 6) - (*print-lines* . 1) - (*print-right-margin* . 200) - (*print-pprint-dispatch* . ,*backtrace-pprint-dispatch-table*)) - "Pretter settings for printing backtraces.") - -(defvar *default-worker-thread-bindings* '() - "An alist to initialize dynamic variables in worker threads. -The list has the form ((VAR . VALUE) ...). Each variable VAR will be -bound to the corresponding VALUE.") - -(defun call-with-bindings (alist fun) - "Call FUN with variables bound according to ALIST. -ALIST is a list of the form ((VAR . VAL) ...)." - (if (null alist) - (funcall fun) - (let* ((rlist (reverse alist)) - (vars (mapcar #'car rlist)) - (vals (mapcar #'cdr rlist))) - (progv vars vals - (funcall fun))))) - -(defmacro with-bindings (alist &body body) - "See `call-with-bindings'." - `(call-with-bindings ,alist (lambda () ,@body))) - -;;; The `DEFSLIMEFUN' macro defines a function that Emacs can call via -;;; RPC. - -(defmacro defslimefun (name arglist &body rest) - "A DEFUN for functions that Emacs can call by RPC." - `(progn - (defun ,name ,arglist ,@rest) - ;; see - (eval-when (:compile-toplevel :load-toplevel :execute) - (export ',name (symbol-package ',name))))) - -(defun missing-arg () - "A function that the compiler knows will never to return a value. -You can use (MISSING-ARG) as the initform for defstruct slots that -must always be supplied. This way the :TYPE slot option need not -include some arbitrary initial value like NIL." - (error "A required &KEY or &OPTIONAL argument was not supplied.")) - - -;;;; Hooks -;;; -;;; We use Emacs-like `add-hook' and `run-hook' utilities to support -;;; simple indirection. The interface is more CLish than the Emacs -;;; Lisp one. - -(defmacro add-hook (place function) - "Add FUNCTION to the list of values on PLACE." - `(pushnew ,function ,place)) - -(defun run-hook (functions &rest arguments) - "Call each of FUNCTIONS with ARGUMENTS." - (dolist (function functions) - (apply function arguments))) - -(defun run-hook-until-success (functions &rest arguments) - "Call each of FUNCTIONS with ARGUMENTS, stop if any function returns -a truthy value" - (loop for hook in functions - thereis (apply hook arguments))) - -(defvar *new-connection-hook* '() - "This hook is run each time a connection is established. -The connection structure is given as the argument. -Backend code should treat the connection structure as opaque.") - -(defvar *connection-closed-hook* '() - "This hook is run when a connection is closed. -The connection as passed as an argument. -Backend code should treat the connection structure as opaque.") - -(defvar *pre-reply-hook* '() - "Hook run (without arguments) immediately before replying to an RPC.") - -(defvar *after-init-hook* '() - "Hook run after user init files are loaded.") - - -;;;; Connections -;;; -;;; Connection structures represent the network connections between -;;; Emacs and Lisp. Each has a socket stream, a set of user I/O -;;; streams that redirect to Emacs, and optionally a second socket -;;; used solely to pipe user-output to Emacs (an optimization). This -;;; is also the place where we keep everything that needs to be -;;; freed/closed/killed when we disconnect. - -(defstruct (connection - (:constructor %make-connection) - (:conc-name connection.) - (:print-function print-connection)) - ;; The listening socket. (usually closed) - (socket (missing-arg) :type t :read-only t) - ;; Character I/O stream of socket connection. Read-only to avoid - ;; race conditions during initialization. - (socket-io (missing-arg) :type stream :read-only t) - ;; Optional dedicated output socket (backending `user-output' slot). - ;; Has a slot so that it can be closed with the connection. - (dedicated-output nil :type (or stream null)) - ;; Streams that can be used for user interaction, with requests - ;; redirected to Emacs. - (user-input nil :type (or stream null)) - (user-output nil :type (or stream null)) - (user-io nil :type (or stream null)) - ;; Bindings used for this connection (usually streams) - (env '() :type list) - ;; A stream that we use for *trace-output*; if nil, we user user-output. - (trace-output nil :type (or stream null)) - ;; A stream where we send REPL results. - (repl-results nil :type (or stream null)) - ;; Cache of macro-indentation information that has been sent to Emacs. - ;; This is used for preparing deltas to update Emacs's knowledge. - ;; Maps: symbol -> indentation-specification - (indentation-cache (make-hash-table :test 'eq) :type hash-table) - ;; The list of packages represented in the cache: - (indentation-cache-packages '()) - ;; The communication style used. - (communication-style nil :type (member nil :spawn :sigio :fd-handler)) - ) - -(defun print-connection (conn stream depth) - (declare (ignore depth)) - (print-unreadable-object (conn stream :type t :identity t))) - -(defstruct (singlethreaded-connection (:include connection) - (:conc-name sconn.)) - ;; The SIGINT handler we should restore when the connection is - ;; closed. - saved-sigint-handler - ;; A queue of events. Not all events can be processed in order and - ;; we need a place to stored them. - (event-queue '() :type list) - ;; A counter that is incremented whenever an event is added to the - ;; queue. This is used to detected modifications to the event queue - ;; by interrupts. The counter wraps around. - (events-enqueued 0 :type fixnum)) - -(defstruct (multithreaded-connection (:include connection) - (:conc-name mconn.)) - ;; In multithreaded systems we delegate certain tasks to specific - ;; threads. The `reader-thread' is responsible for reading network - ;; requests from Emacs and sending them to the `control-thread'; the - ;; `control-thread' is responsible for dispatching requests to the - ;; threads that should handle them; the `repl-thread' is the one - ;; that evaluates REPL expressions. The control thread dispatches - ;; all REPL evaluations to the REPL thread and for other requests it - ;; spawns new threads. - reader-thread - control-thread - repl-thread - auto-flush-thread - indentation-cache-thread - ;; List of threads that are currently processing requests. We use - ;; this to find the newest/current thread for an interrupt. In the - ;; future we may store here (thread . request-tag) pairs so that we - ;; can interrupt specific requests. - (active-threads '() :type list) - ) - -(defvar *emacs-connection* nil - "The connection to Emacs currently in use.") - -(defun make-connection (socket stream style) - (let ((conn (funcall (ecase style - (:spawn - #'make-multithreaded-connection) - ((:sigio nil :fd-handler) - #'make-singlethreaded-connection)) - :socket socket - :socket-io stream - :communication-style style))) - (run-hook *new-connection-hook* conn) - (send-to-sentinel `(:add-connection ,conn)) - conn)) - -(defslimefun ping (tag) - tag) - -(defun safe-backtrace () - (ignore-errors - (call-with-debugging-environment - (lambda () (backtrace 0 nil))))) - -(define-condition swank-error (error) - ((backtrace :initarg :backtrace :reader swank-error.backtrace) - (condition :initarg :condition :reader swank-error.condition)) - (:report (lambda (c s) (princ (swank-error.condition c) s))) - (:documentation "Condition which carries a backtrace.")) - -(defun signal-swank-error (condition &optional (backtrace (safe-backtrace))) - (error 'swank-error :condition condition :backtrace backtrace)) - -(defvar *debug-on-swank-protocol-error* nil - "When non-nil invoke the system debugger on errors that were -signalled during decoding/encoding the wire protocol. Do not set this -to T unless you want to debug swank internals.") - -(defmacro with-swank-error-handler ((connection) &body body) - "Close the connection on internal `swank-error's." - (let ((conn (gensym))) - `(let ((,conn ,connection)) - (handler-case - (handler-bind ((swank-error - (lambda (condition) - (when *debug-on-swank-protocol-error* - (invoke-default-debugger condition))))) - (progn . ,body)) - (swank-error (condition) - (close-connection ,conn - (swank-error.condition condition) - (swank-error.backtrace condition))))))) - -(defmacro with-panic-handler ((connection) &body body) - "Close the connection on unhandled `serious-condition's." - (let ((conn (gensym))) - `(let ((,conn ,connection)) - (handler-bind ((serious-condition - (lambda (condition) - (close-connection ,conn condition (safe-backtrace)) - (abort condition)))) - . ,body)))) - -(add-hook *new-connection-hook* 'notify-backend-of-connection) -(defun notify-backend-of-connection (connection) - (declare (ignore connection)) - (emacs-connected)) - - -;;;; Utilities - - -;;;;; Logging - -(defvar *swank-io-package* - (let ((package (make-package :swank-io-package :use '()))) - (import '(nil t quote) package) - package)) - -(defvar *log-events* nil) - -(defun init-log-output () - (unless *log-output* - (setq *log-output* (real-output-stream *error-output*)))) - -(add-hook *after-init-hook* 'init-log-output) - -(defun real-input-stream (stream) - (typecase stream - (synonym-stream - (real-input-stream (symbol-value (synonym-stream-symbol stream)))) - (two-way-stream - (real-input-stream (two-way-stream-input-stream stream))) - (t stream))) - -(defun real-output-stream (stream) - (typecase stream - (synonym-stream - (real-output-stream (symbol-value (synonym-stream-symbol stream)))) - (two-way-stream - (real-output-stream (two-way-stream-output-stream stream))) - (t stream))) - -(defvar *event-history* (make-array 40 :initial-element nil) - "A ring buffer to record events for better error messages.") -(defvar *event-history-index* 0) -(defvar *enable-event-history* t) - -(defun log-event (format-string &rest args) - "Write a message to *terminal-io* when *log-events* is non-nil. -Useful for low level debugging." - (with-standard-io-syntax - (let ((*print-readably* nil) - (*print-pretty* nil) - (*package* *swank-io-package*)) - (when *enable-event-history* - (setf (aref *event-history* *event-history-index*) - (format nil "~?" format-string args)) - (setf *event-history-index* - (mod (1+ *event-history-index*) (length *event-history*)))) - (when *log-events* - (write-string (escape-non-ascii (format nil "~?" format-string args)) - *log-output*) - (force-output *log-output*))))) - -(defun event-history-to-list () - "Return the list of events (older events first)." - (let ((arr *event-history*) - (idx *event-history-index*)) - (concatenate 'list (subseq arr idx) (subseq arr 0 idx)))) - -(defun clear-event-history () - (fill *event-history* nil) - (setq *event-history-index* 0)) - -(defun dump-event-history (stream) - (dolist (e (event-history-to-list)) - (dump-event e stream))) - -(defun dump-event (event stream) - (cond ((stringp event) - (write-string (escape-non-ascii event) stream)) - ((null event)) - (t - (write-string - (escape-non-ascii (format nil "Unexpected event: ~A~%" event)) - stream)))) - -(defun escape-non-ascii (string) - "Return a string like STRING but with non-ascii chars escaped." - (cond ((ascii-string-p string) string) - (t (with-output-to-string (out) - (loop for c across string do - (cond ((ascii-char-p c) (write-char c out)) - (t (format out "\\x~4,'0X" (char-code c))))))))) - -(defun ascii-string-p (o) - (and (stringp o) - (every #'ascii-char-p o))) - -(defun ascii-char-p (c) - (<= (char-code c) 127)) - - -;;;;; Helper macros - -(defmacro dcase (value &body patterns) - "Dispatch VALUE to one of PATTERNS. -A cross between `case' and `destructuring-bind'. -The pattern syntax is: - ((HEAD . ARGS) . BODY) -The list of patterns is searched for a HEAD `eq' to the car of -VALUE. If one is found, the BODY is executed with ARGS bound to the -corresponding values in the CDR of VALUE." - (let ((operator (gensym "op-")) - (operands (gensym "rand-")) - (tmp (gensym "tmp-"))) - `(let* ((,tmp ,value) - (,operator (car ,tmp)) - (,operands (cdr ,tmp))) - (case ,operator - ,@(loop for (pattern . body) in patterns collect - (if (eq pattern t) - `(t ,@body) - (destructuring-bind (op &rest rands) pattern - `(,op (destructuring-bind ,rands ,operands - ,@body))))) - ,@(if (eq (caar (last patterns)) t) - '() - `((t (error "dcase failed: ~S" ,tmp)))))))) - - -;;;; Interrupt handling - -;; Usually we'd like to enter the debugger when an interrupt happens. -;; But for some operations, in particular send&receive, it's crucial -;; that those are not interrupted when the mailbox is in an -;; inconsistent/locked state. Obviously, if send&receive don't work we -;; can't communicate and the debugger will not work. To solve that -;; problem, we try to handle interrupts only at certain safe-points. -;; -;; Whenever an interrupt happens we call the function -;; INVOKE-OR-QUEUE-INTERRUPT. Usually this simply invokes the -;; debugger, but if interrupts are disabled the interrupt is put in a -;; queue for later processing. At safe-points, we call -;; CHECK-SLIME-INTERRUPTS which looks at the queue and invokes the -;; debugger if needed. -;; -;; The queue for interrupts is stored in a thread local variable. -;; WITH-CONNECTION sets it up. WITH-SLIME-INTERRUPTS allows -;; interrupts, i.e. the debugger is entered immediately. When we call -;; "user code" or non-problematic code we allow interrupts. When -;; inside WITHOUT-SLIME-INTERRUPTS, interrupts are queued. When we -;; switch from "user code" to more delicate operations we need to -;; disable interrupts. In particular, interrupts should be disabled -;; for SEND and RECEIVE-IF. - -;; If true execute interrupts, otherwise queue them. -;; Note: `with-connection' binds *pending-slime-interrupts*. -(defvar *slime-interrupts-enabled*) - -(defmacro with-interrupts-enabled% (flag body) - `(progn - ,@(if flag '((check-slime-interrupts))) - (multiple-value-prog1 - (let ((*slime-interrupts-enabled* ,flag)) - ,@body) - ,@(if flag '((check-slime-interrupts)))))) - -(defmacro with-slime-interrupts (&body body) - `(with-interrupts-enabled% t ,body)) - -(defmacro without-slime-interrupts (&body body) - `(with-interrupts-enabled% nil ,body)) - -(defun queue-thread-interrupt (thread function) - (interrupt-thread thread - (lambda () - ;; safely interrupt THREAD - (when (invoke-or-queue-interrupt function) - (wake-thread thread))))) - -(defun invoke-or-queue-interrupt (function) - (log-event "invoke-or-queue-interrupt: ~a~%" function) - (cond ((not (boundp '*slime-interrupts-enabled*)) - (without-slime-interrupts - (funcall function))) - (*slime-interrupts-enabled* - (log-event "interrupts-enabled~%") - (funcall function)) - (t - (setq *pending-slime-interrupts* - (nconc *pending-slime-interrupts* - (list function))) - (cond ((cdr *pending-slime-interrupts*) - (log-event "too many queued interrupts~%") - (with-simple-restart (continue "Continue from interrupt") - (handler-bind ((serious-condition #'invoke-slime-debugger)) - (check-slime-interrupts)))) - (t - (log-event "queue-interrupt: ~a~%" function) - (when *interrupt-queued-handler* - (funcall *interrupt-queued-handler*)) - t))))) - - -;;; FIXME: poor name? -(defmacro with-io-redirection ((connection) &body body) - "Execute BODY I/O redirection to CONNECTION. " - `(with-bindings (connection.env ,connection) - . ,body)) - -;; Thread local variable used for flow-control. -;; It's bound by `with-connection'. -(defvar *send-counter*) - -(defmacro with-connection ((connection) &body body) - "Execute BODY in the context of CONNECTION." - `(let ((connection ,connection) - (function (lambda () . ,body))) - (if (eq *emacs-connection* connection) - (funcall function) - (let ((*emacs-connection* connection) - (*pending-slime-interrupts* '()) - (*send-counter* 0)) - (without-slime-interrupts - (with-swank-error-handler (connection) - (with-io-redirection (connection) - (call-with-debugger-hook #'swank-debugger-hook - function)))))))) - -(defun call-with-retry-restart (msg thunk) - (loop (with-simple-restart (retry "~a" msg) - (return (funcall thunk))))) - -(defmacro with-retry-restart ((&key (msg "Retry.")) &body body) - (check-type msg string) - `(call-with-retry-restart ,msg (lambda () ,@body))) - -(defmacro with-struct* ((conc-name get obj) &body body) - (let ((var (gensym))) - `(let ((,var ,obj)) - (macrolet ((,get (slot) - (let ((getter (intern (concatenate 'string - ',(string conc-name) - (string slot)) - (symbol-package ',conc-name)))) - `(,getter ,',var)))) - ,@body)))) - -(defmacro define-special (name doc) - "Define a special variable NAME with doc string DOC. -This is like defvar, but NAME will not be initialized." - `(progn - (defvar ,name) - (setf (documentation ',name 'variable) ,doc))) - - -;;;;; Sentinel -;;; -;;; The sentinel thread manages some global lists. -;;; FIXME: Overdesigned? - -(defvar *connections* '() - "List of all active connections, with the most recent at the front.") - -(defvar *servers* '() - "A list ((server-socket port thread) ...) describing the listening sockets. -Used to close sockets on server shutdown or restart.") - -;; FIXME: we simply access the global variable here. We could ask the -;; sentinel thread instead but then we still have the problem that the -;; connection could be closed before we use it. -(defun default-connection () - "Return the 'default' Emacs connection. -This connection can be used to talk with Emacs when no specific -connection is in use, i.e. *EMACS-CONNECTION* is NIL. - -The default connection is defined (quite arbitrarily) as the most -recently established one." - (car *connections*)) - -(defun start-sentinel () - (unless (find-registered 'sentinel) - (let ((thread (spawn #'sentinel :name "Swank Sentinel"))) - (register-thread 'sentinel thread)))) - -(defun sentinel () - (catch 'exit-sentinel - (loop (sentinel-serve (receive))))) - -(defun send-to-sentinel (msg) - (let ((sentinel (find-registered 'sentinel))) - (cond (sentinel (send sentinel msg)) - (t (sentinel-serve msg))))) - -(defun sentinel-serve (msg) - (dcase msg - ((:add-connection conn) - (push conn *connections*)) - ((:close-connection connection condition backtrace) - (close-connection% connection condition backtrace) - (sentinel-maybe-exit)) - ((:add-server socket port thread) - (push (list socket port thread) *servers*)) - ((:stop-server key port) - (sentinel-stop-server key port) - (sentinel-maybe-exit)))) - -(defun sentinel-stop-server (key value) - (let ((probe (find value *servers* :key (ecase key - (:socket #'car) - (:port #'cadr))))) - (cond (probe - (setq *servers* (delete probe *servers*)) - (destructuring-bind (socket _port thread) probe - (declare (ignore _port)) - (ignore-errors (close-socket socket)) - (when (and thread - (thread-alive-p thread) - (not (eq thread (current-thread)))) - (ignore-errors (kill-thread thread))))) - (t - (warn "No server for ~s: ~s" key value))))) - -(defun sentinel-maybe-exit () - (when (and (null *connections*) - (null *servers*) - (and (current-thread) - (eq (find-registered 'sentinel) - (current-thread)))) - (register-thread 'sentinel nil) - (throw 'exit-sentinel nil))) - - -;;;;; Misc - -(defun use-threads-p () - (eq (connection.communication-style *emacs-connection*) :spawn)) - -(defun current-thread-id () - (thread-id (current-thread))) - -(declaim (inline ensure-list)) -(defun ensure-list (thing) - (if (listp thing) thing (list thing))) - - -;;;;; Symbols - -;; FIXME: this docstring is more confusing than helpful. -(defun symbol-status (symbol &optional (package (symbol-package symbol))) - "Returns one of - - :INTERNAL if the symbol is _present_ in PACKAGE as an _internal_ symbol, - - :EXTERNAL if the symbol is _present_ in PACKAGE as an _external_ symbol, - - :INHERITED if the symbol is _inherited_ by PACKAGE through USE-PACKAGE, - but is not _present_ in PACKAGE, - - or NIL if SYMBOL is not _accessible_ in PACKAGE. - - -Be aware not to get confused with :INTERNAL and how \"internal -symbols\" are defined in the spec; there is a slight mismatch of -definition with the Spec and what's commonly meant when talking -about internal symbols most times. As the spec says: - - In a package P, a symbol S is - - _accessible_ if S is either _present_ in P itself or was - inherited from another package Q (which implies - that S is _external_ in Q.) - - You can check that with: (AND (SYMBOL-STATUS S P) T) - - - _present_ if either P is the /home package/ of S or S has been - imported into P or exported from P by IMPORT, or - EXPORT respectively. - - Or more simply, if S is not _inherited_. - - You can check that with: (LET ((STATUS (SYMBOL-STATUS S P))) - (AND STATUS - (NOT (EQ STATUS :INHERITED)))) - - - _external_ if S is going to be inherited into any package that - /uses/ P by means of USE-PACKAGE, MAKE-PACKAGE, or - DEFPACKAGE. - - Note that _external_ implies _present_, since to - make a symbol _external_, you'd have to use EXPORT - which will automatically make the symbol _present_. - - You can check that with: (EQ (SYMBOL-STATUS S P) :EXTERNAL) - - - _internal_ if S is _accessible_ but not _external_. - - You can check that with: (LET ((STATUS (SYMBOL-STATUS S P))) - (AND STATUS - (NOT (EQ STATUS :EXTERNAL)))) - - - Notice that this is *different* to - (EQ (SYMBOL-STATUS S P) :INTERNAL) - because what the spec considers _internal_ is split up into two - explicit pieces: :INTERNAL, and :INHERITED; just as, for instance, - CL:FIND-SYMBOL does. - - The rationale is that most times when you speak about \"internal\" - symbols, you're actually not including the symbols inherited - from other packages, but only about the symbols directly specific - to the package in question. -" - (when package ; may be NIL when symbol is completely uninterned. - (check-type symbol symbol) (check-type package package) - (multiple-value-bind (present-symbol status) - (find-symbol (symbol-name symbol) package) - (and (eq symbol present-symbol) status)))) - -(defun symbol-external-p (symbol &optional (package (symbol-package symbol))) - "True if SYMBOL is external in PACKAGE. -If PACKAGE is not specified, the home package of SYMBOL is used." - (eq (symbol-status symbol package) :external)) - - -;;;; TCP Server - -(defvar *communication-style* (preferred-communication-style)) - -(defvar *dont-close* nil - "Default value of :dont-close argument to start-server and - create-server.") - -(defparameter *loopback-interface* "localhost") - -(defun start-server (port-file &key (style *communication-style*) - (dont-close *dont-close*)) - "Start the server and write the listen port number to PORT-FILE. -This is the entry point for Emacs." - (setup-server 0 - (lambda (port) (announce-server-port port-file port)) - style dont-close nil)) - -(defun create-server (&key (port default-server-port) - (style *communication-style*) - (dont-close *dont-close*) - interface - backlog) - "Start a SWANK server on PORT running in STYLE. -If DONT-CLOSE is true then the listen socket will accept multiple -connections, otherwise it will be closed after the first. - -Optionally, an INTERFACE could be specified and swank will bind -the PORT on this interface. By default, interface is \"localhost\"." - (let ((*loopback-interface* (or interface - *loopback-interface*))) - (setup-server port #'simple-announce-function - style dont-close backlog))) - -(defun find-external-format-or-lose (coding-system) - (or (find-external-format coding-system) - (error "Unsupported coding system: ~s" coding-system))) - -(defmacro restart-loop (form &body clauses) - "Executes FORM, with restart-case CLAUSES which have a chance to modify FORM's -environment before trying again (by returning normally) or giving up (through an -explicit transfer of control), all within an implicit block named nil. -e.g.: (restart-loop (http-request url) (use-value (new) (setq url new)))" - `(loop (restart-case (return ,form) ,@clauses))) - -(defun socket-quest (port backlog) - (restart-loop (create-socket *loopback-interface* port :backlog backlog) - (use-value (&optional (new-port (1+ port))) - :report (lambda (stream) (format stream "Try a port other than ~D" port)) - :interactive - (lambda () - (format *query-io* "Enter port (defaults to ~D): " (1+ port)) - (finish-output *query-io*) ; necessary for tunnels - (ignore-errors (list (parse-integer (read-line *query-io*))))) - (setq port new-port)))) - -(defun setup-server (port announce-fn style dont-close backlog) - (init-log-output) - (let* ((socket (socket-quest port backlog)) - (port (local-port socket))) - (funcall announce-fn port) - (labels ((serve () (accept-connections socket style dont-close)) - (note () (send-to-sentinel `(:add-server ,socket ,port - ,(current-thread)))) - (serve-loop () (note) (loop do (serve) while dont-close))) - (ecase style - (:spawn (initialize-multiprocessing - (lambda () - (start-sentinel) - (spawn #'serve-loop :name (format nil "Swank ~s" port))))) - ((:fd-handler :sigio) - (note) - (add-fd-handler socket #'serve)) - ((nil) (serve-loop)))) - port)) - -(defun stop-server (port) - "Stop server running on PORT." - (send-to-sentinel `(:stop-server :port ,port))) - -(defun restart-server (&key (port default-server-port) - (style *communication-style*) - (dont-close *dont-close*)) - "Stop the server listening on PORT, then start a new SWANK server -on PORT running in STYLE. If DONT-CLOSE is true then the listen socket -will accept multiple connections, otherwise it will be closed after the -first." - (stop-server port) - (sleep 5) - (create-server :port port :style style :dont-close dont-close)) - -(defun accept-connections (socket style dont-close) - (unwind-protect - (let ((client (accept-connection socket :external-format nil - :buffering t))) - (authenticate-client client) - (serve-requests (make-connection socket client style))) - (unless dont-close - (send-to-sentinel `(:stop-server :socket ,socket))))) - -(defun authenticate-client (stream) - (let ((secret (slime-secret))) - (when secret - (set-stream-timeout stream 20) - (let ((first-val (read-packet stream))) - (unless (and (stringp first-val) (string= first-val secret)) - (error "Incoming connection doesn't know the password."))) - (set-stream-timeout stream nil)))) - -(defun slime-secret () - "Finds the magic secret from the user's home directory. Returns nil -if the file doesn't exist; otherwise the first line of the file." - (with-open-file (in - (merge-pathnames (user-homedir-pathname) #p".slime-secret") - :if-does-not-exist nil) - (and in (read-line in nil "")))) - -(defun serve-requests (connection) - "Read and process all requests on connections." - (etypecase connection - (multithreaded-connection - (spawn-threads-for-connection connection)) - (singlethreaded-connection - (ecase (connection.communication-style connection) - ((nil) (simple-serve-requests connection)) - (:sigio (install-sigio-handler connection)) - (:fd-handler (install-fd-handler connection)))))) - -(defun stop-serving-requests (connection) - (etypecase connection - (multithreaded-connection - (cleanup-connection-threads connection)) - (singlethreaded-connection - (ecase (connection.communication-style connection) - ((nil)) - (:sigio (deinstall-sigio-handler connection)) - (:fd-handler (deinstall-fd-handler connection)))))) - -(defun announce-server-port (file port) - (with-open-file (s file - :direction :output - :if-exists :error - :if-does-not-exist :create) - (format s "~S~%" port)) - (simple-announce-function port)) - -(defun simple-announce-function (port) - (when *swank-debug-p* - (format *log-output* "~&;; Swank started at port: ~D.~%" port) - (force-output *log-output*))) - - -;;;;; Event Decoding/Encoding - -(defun decode-message (stream) - "Read an S-expression from STREAM using the SLIME protocol." - (log-event "decode-message~%") - (without-slime-interrupts - (handler-bind ((error #'signal-swank-error)) - (handler-case (read-message stream *swank-io-package*) - (swank-reader-error (c) - `(:reader-error ,(swank-reader-error.packet c) - ,(swank-reader-error.cause c))))))) - -(defun encode-message (message stream) - "Write an S-expression to STREAM using the SLIME protocol." - (log-event "encode-message~%") - (without-slime-interrupts - (handler-bind ((error #'signal-swank-error)) - (write-message message *swank-io-package* stream)))) - - -;;;;; Event Processing - -(defvar *sldb-quit-restart* nil - "The restart that will be invoked when the user calls sldb-quit.") - -;; Establish a top-level restart and execute BODY. -;; Execute K if the restart is invoked. -(defmacro with-top-level-restart ((connection k) &body body) - `(with-connection (,connection) - (restart-case - (let ((*sldb-quit-restart* (find-restart 'abort))) - ,@body) - (abort (&optional v) - :report "Return to SLIME's top level." - (declare (ignore v)) - (force-user-output) - ,k)))) - -(defun handle-requests (connection &optional timeout) - "Read and process :emacs-rex requests. -The processing is done in the extent of the toplevel restart." - (with-connection (connection) - (cond (*sldb-quit-restart* - (process-requests timeout)) - (t - (tagbody - start - (with-top-level-restart (connection (go start)) - (process-requests timeout))))))) - -(defun process-requests (timeout) - "Read and process requests from Emacs." - (loop - (multiple-value-bind (event timeout?) - (wait-for-event `(or (:emacs-rex . _) - (:emacs-channel-send . _)) - timeout) - (when timeout? (return)) - (dcase event - ((:emacs-rex &rest args) (apply #'eval-for-emacs args)) - ((:emacs-channel-send channel (selector &rest args)) - (channel-send channel selector args)))))) - -(defun current-socket-io () - (connection.socket-io *emacs-connection*)) - -(defun close-connection (connection condition backtrace) - (send-to-sentinel `(:close-connection ,connection ,condition ,backtrace))) - -(defun close-connection% (c condition backtrace) - (let ((*debugger-hook* nil)) - (log-event "close-connection: ~a ...~%" condition) - (format *log-output* "~&;; swank:close-connection: ~A~%" - (escape-non-ascii (safe-condition-message condition))) - (stop-serving-requests c) - (close (connection.socket-io c)) - (when (connection.dedicated-output c) - (close (connection.dedicated-output c))) - (setf *connections* (remove c *connections*)) - (run-hook *connection-closed-hook* c) - (when (and condition (not (typep condition 'end-of-file))) - (finish-output *log-output*) - (format *log-output* "~&;; Event history start:~%") - (dump-event-history *log-output*) - (format *log-output* "~ -;; Event history end.~%~ -;; Backtrace:~%~{~A~%~}~ -;; Connection to Emacs lost. [~%~ -;; condition: ~A~%~ -;; type: ~S~%~ -;; style: ~S]~%" - (loop for (i f) in backtrace collect - (ignore-errors - (format nil "~d: ~a" i (escape-non-ascii f)))) - (escape-non-ascii (safe-condition-message condition) ) - (type-of condition) - (connection.communication-style c))) - (finish-output *log-output*) - (log-event "close-connection ~a ... done.~%" condition))) - -;;;;;; Thread based communication - -(defun read-loop (connection) - (let ((input-stream (connection.socket-io connection)) - (control-thread (mconn.control-thread connection))) - (with-swank-error-handler (connection) - (loop (send control-thread (decode-message input-stream)))))) - -(defun dispatch-loop (connection) - (let ((*emacs-connection* connection)) - (with-panic-handler (connection) - (loop (dispatch-event connection (receive)))))) - -(defgeneric thread-for-evaluation (connection id) - (:documentation "Find or create a thread to evaluate the next request.") - (:method ((connection multithreaded-connection) (id (eql t))) - (spawn-worker-thread connection)) - (:method ((connection multithreaded-connection) (id (eql :find-existing))) - (car (mconn.active-threads connection))) - (:method (connection (id integer)) - (declare (ignorable connection)) - (find-thread id)) - (:method ((connection singlethreaded-connection) id) - (declare (ignorable connection connection id)) - (current-thread))) - -(defun interrupt-worker-thread (connection id) - (let ((thread (thread-for-evaluation connection - (cond ((eq id t) :find-existing) - (t id))))) - (log-event "interrupt-worker-thread: ~a ~a~%" id thread) - (if thread - (etypecase connection - (multithreaded-connection - (queue-thread-interrupt thread #'simple-break)) - (singlethreaded-connection - (simple-break))) - (encode-message (list :debug-condition (current-thread-id) - (format nil "Thread with id ~a not found" - id)) - (current-socket-io))))) - -(defun spawn-worker-thread (connection) - (spawn (lambda () - (with-bindings *default-worker-thread-bindings* - (with-top-level-restart (connection nil) - (apply #'eval-for-emacs - (cdr (wait-for-event `(:emacs-rex . _))))))) - :name "worker")) - -(defun add-active-thread (connection thread) - (etypecase connection - (multithreaded-connection - (push thread (mconn.active-threads connection))) - (singlethreaded-connection))) - -(defun remove-active-thread (connection thread) - (etypecase connection - (multithreaded-connection - (setf (mconn.active-threads connection) - (delete thread (mconn.active-threads connection) :count 1))) - (singlethreaded-connection))) - -(defparameter *event-hook* nil) - -(defun dispatch-event (connection event) - "Handle an event triggered either by Emacs or within Lisp." - (log-event "dispatch-event: ~s~%" event) - (or (run-hook-until-success *event-hook* connection event) - (dcase event - ((:emacs-rex form package thread-id id) - (let ((thread (thread-for-evaluation connection thread-id))) - (cond (thread - (add-active-thread connection thread) - (send-event thread `(:emacs-rex ,form ,package ,id))) - (t - (encode-message - (list :invalid-rpc id - (format nil "Thread not found: ~s" thread-id)) - (current-socket-io)))))) - ((:return thread &rest args) - (remove-active-thread connection thread) - (encode-message `(:return ,@args) (current-socket-io))) - ((:emacs-interrupt thread-id) - (interrupt-worker-thread connection thread-id)) - (((:write-string - :debug :debug-condition :debug-activate :debug-return :channel-send - :presentation-start :presentation-end - :new-package :new-features :ed :indentation-update - :eval :eval-no-wait :background-message :inspect :ping - :y-or-n-p :read-from-minibuffer :read-string :read-aborted :test-delay - :write-image :ed-rpc :ed-rpc-no-wait) - &rest _) - (declare (ignore _)) - (encode-message event (current-socket-io))) - (((:emacs-pong :emacs-return :emacs-return-string :ed-rpc-forbidden) - thread-id &rest args) - (send-event (find-thread thread-id) (cons (car event) args))) - ((:emacs-channel-send channel-id msg) - (let ((ch (find-channel channel-id))) - (send-event (channel-thread ch) `(:emacs-channel-send ,ch ,msg)))) - ((:reader-error packet condition) - (encode-message `(:reader-error ,packet - ,(safe-condition-message condition)) - (current-socket-io)))))) - - -(defun send-event (thread event) - (log-event "send-event: ~s ~s~%" thread event) - (let ((c *emacs-connection*)) - (etypecase c - (multithreaded-connection - (send thread event)) - (singlethreaded-connection - (setf (sconn.event-queue c) (nconc (sconn.event-queue c) (list event))) - (setf (sconn.events-enqueued c) (mod (1+ (sconn.events-enqueued c)) - most-positive-fixnum)))))) - -(defun send-to-emacs (event) - "Send EVENT to Emacs." - ;;(log-event "send-to-emacs: ~a" event) - (without-slime-interrupts - (let ((c *emacs-connection*)) - (etypecase c - (multithreaded-connection - (send (mconn.control-thread c) event)) - (singlethreaded-connection - (dispatch-event c event))) - (maybe-slow-down)))) - - -;;;;;; Flow control - -;; After sending N (usually 100) messages we slow down and ping Emacs -;; to make sure that everything we have sent so far was received. - -(defconstant send-counter-limit 100) - -(defun maybe-slow-down () - (let ((counter (incf *send-counter*))) - (when (< send-counter-limit counter) - (setf *send-counter* 0) - (ping-pong)))) - -(defun ping-pong () - (let* ((tag (make-tag)) - (pattern `(:emacs-pong ,tag))) - (send-to-emacs `(:ping ,(current-thread-id) ,tag)) - (wait-for-event pattern))) - - -(defun wait-for-event (pattern &optional timeout) - "Scan the event queue for PATTERN and return the event. -If TIMEOUT is 'nil wait until a matching event is enqued. -If TIMEOUT is 't only scan the queue without waiting. -The second return value is t if the timeout expired before a matching -event was found." - (log-event "wait-for-event: ~s ~s~%" pattern timeout) - (without-slime-interrupts - (let ((c *emacs-connection*)) - (etypecase c - (multithreaded-connection - (receive-if (lambda (e) (event-match-p e pattern)) timeout)) - (singlethreaded-connection - (wait-for-event/event-loop c pattern timeout)))))) - -(defun wait-for-event/event-loop (connection pattern timeout) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (let ((event (poll-for-event connection pattern))) - (when event (return (car event)))) - (let ((events-enqueued (sconn.events-enqueued connection)) - (ready (wait-for-input (list (current-socket-io)) timeout))) - (cond ((and timeout (not ready)) - (return (values nil t))) - ((or (/= events-enqueued (sconn.events-enqueued connection)) - (eq ready :interrupt)) - ;; rescan event queue, interrupts may enqueue new events - ) - (t - (assert (equal ready (list (current-socket-io)))) - (dispatch-event connection - (decode-message (current-socket-io)))))))) - -(defun poll-for-event (connection pattern) - (let* ((c connection) - (tail (member-if (lambda (e) (event-match-p e pattern)) - (sconn.event-queue c)))) - (when tail - (setf (sconn.event-queue c) - (nconc (ldiff (sconn.event-queue c) tail) (cdr tail))) - tail))) - -;;; FIXME: Make this use SWANK-MATCH. -(defun event-match-p (event pattern) - (cond ((or (keywordp pattern) (numberp pattern) (stringp pattern) - (member pattern '(nil t))) - (equal event pattern)) - ((symbolp pattern) t) - ((consp pattern) - (case (car pattern) - ((or) (some (lambda (p) (event-match-p event p)) (cdr pattern))) - (t (and (consp event) - (and (event-match-p (car event) (car pattern)) - (event-match-p (cdr event) (cdr pattern))))))) - (t (error "Invalid pattern: ~S" pattern)))) - - - -(defun spawn-threads-for-connection (connection) - (setf (mconn.control-thread connection) - (spawn (lambda () (control-thread connection)) - :name "control-thread")) - connection) - -(defun control-thread (connection) - (with-struct* (mconn. @ connection) - (setf (@ control-thread) (current-thread)) - (setf (@ reader-thread) (spawn (lambda () (read-loop connection)) - :name "reader-thread")) - (setf (@ indentation-cache-thread) - (spawn (lambda () (indentation-cache-loop connection)) - :name "swank-indentation-cache-thread")) - (dispatch-loop connection))) - -(defun cleanup-connection-threads (connection) - (let* ((c connection) - (threads (list (mconn.repl-thread c) - (mconn.reader-thread c) - (mconn.control-thread c) - (mconn.auto-flush-thread c) - (mconn.indentation-cache-thread c)))) - (dolist (thread threads) - (when (and thread - (thread-alive-p thread) - (not (equal (current-thread) thread))) - (ignore-errors (kill-thread thread)))))) - -;;;;;; Signal driven IO - -(defun install-sigio-handler (connection) - (add-sigio-handler (connection.socket-io connection) - (lambda () (process-io-interrupt connection))) - (handle-requests connection t)) - -(defvar *io-interupt-level* 0) - -(defun process-io-interrupt (connection) - (log-event "process-io-interrupt ~d ...~%" *io-interupt-level*) - (let ((*io-interupt-level* (1+ *io-interupt-level*))) - (invoke-or-queue-interrupt - (lambda () (handle-requests connection t)))) - (log-event "process-io-interrupt ~d ... done ~%" *io-interupt-level*)) - -(defun deinstall-sigio-handler (connection) - (log-event "deinstall-sigio-handler...~%") - (remove-sigio-handlers (connection.socket-io connection)) - (log-event "deinstall-sigio-handler...done~%")) - -;;;;;; SERVE-EVENT based IO - -(defun install-fd-handler (connection) - (add-fd-handler (connection.socket-io connection) - (lambda () (handle-requests connection t))) - (setf (sconn.saved-sigint-handler connection) - (install-sigint-handler - (lambda () - (invoke-or-queue-interrupt - (lambda () (dispatch-interrupt-event connection)))))) - (handle-requests connection t)) - -(defun dispatch-interrupt-event (connection) - (with-connection (connection) - (dispatch-event connection `(:emacs-interrupt ,(current-thread-id))))) - -(defun deinstall-fd-handler (connection) - (log-event "deinstall-fd-handler~%") - (remove-fd-handlers (connection.socket-io connection)) - (install-sigint-handler (sconn.saved-sigint-handler connection))) - -;;;;;; Simple sequential IO - -(defun simple-serve-requests (connection) - (unwind-protect - (with-connection (connection) - (call-with-user-break-handler - (lambda () - (invoke-or-queue-interrupt - (lambda () (dispatch-interrupt-event connection)))) - (lambda () - (with-simple-restart (close-connection "Close SLIME connection.") - (let* ((stdin (real-input-stream *standard-input*)) - (*standard-input* (make-repl-input-stream connection - stdin))) - (tagbody toplevel - (with-top-level-restart (connection (go toplevel)) - (simple-repl)))))))) - (close-connection connection nil (safe-backtrace)))) - -;; this is signalled when our custom stream thinks the end-of-file is reached. -;; (not when the end-of-file on the socket is reached) -(define-condition end-of-repl-input (end-of-file) ()) - -(defun simple-repl () - (loop - (format t "~a> " (package-string-for-prompt *package*)) - (force-output) - (let ((form (handler-case (read) - (end-of-repl-input () (return))))) - (let ((- form) - (values (multiple-value-list (eval form)))) - (setq *** ** ** * * (car values) - /// // // / / values - +++ ++ ++ + + form) - (cond ((null values) (format t "; No values~&")) - (t (mapc (lambda (v) (format t "~s~&" v)) values))))))) - -(defun make-repl-input-stream (connection stdin) - (make-input-stream - (lambda () (repl-input-stream-read connection stdin)))) - -(defun repl-input-stream-read (connection stdin) - (loop - (let* ((socket (connection.socket-io connection)) - (inputs (list socket stdin)) - (ready (wait-for-input inputs))) - (cond ((eq ready :interrupt) - (check-slime-interrupts)) - ((member socket ready) - ;; A Slime request from Emacs is pending; make sure to - ;; redirect IO to the REPL buffer. - (with-simple-restart (process-input "Continue reading input.") - (let ((*sldb-quit-restart* (find-restart 'process-input))) - (with-io-redirection (connection) - (handle-requests connection t))))) - ((member stdin ready) - ;; User typed something into the *inferior-lisp* buffer, - ;; so do not redirect. - (return (read-non-blocking stdin))) - (t (assert (null ready))))))) - -(defun read-non-blocking (stream) - (with-output-to-string (str) - (handler-case - (loop (let ((c (read-char-no-hang stream))) - (unless c (return)) - (write-char c str))) - (end-of-file () (error 'end-of-repl-input :stream stream))))) - - -;;; Channels - -;; FIXME: should be per connection not global. -(defvar *channels* '()) -(defvar *channel-counter* 0) - -(defclass channel () - ((id :reader channel-id) - (thread :initarg :thread :initform (current-thread) :reader channel-thread) - (name :initarg :name :initform nil))) - -(defmethod initialize-instance :after ((ch channel) &key) - (with-slots (id) ch - (setf id (incf *channel-counter*)) - (push (cons id ch) *channels*))) - -(defmethod print-object ((c channel) stream) - (print-unreadable-object (c stream :type t) - (with-slots (id name) c - (format stream "~d ~a" id name)))) - -(defun find-channel (id) - (cdr (assoc id *channels*))) - -(defgeneric channel-send (channel selector args)) - -(defmacro define-channel-method (selector (channel &rest args) &body body) - `(defmethod channel-send (,channel (selector (eql ',selector)) args) - (destructuring-bind ,args args - . ,body))) - -(defun send-to-remote-channel (channel-id msg) - (send-to-emacs `(:channel-send ,channel-id ,msg))) - - - -(defvar *slime-features* nil - "The feature list that has been sent to Emacs.") - -(defun send-oob-to-emacs (object) - (send-to-emacs object)) - -;; FIXME: belongs to swank-repl.lisp -(defun force-user-output () - (force-output (connection.user-io *emacs-connection*))) - -(add-hook *pre-reply-hook* 'force-user-output) - -;; FIXME: belongs to swank-repl.lisp -(defun clear-user-input () - (clear-input (connection.user-input *emacs-connection*))) - -;; FIXME: not thread save. -(defvar *tag-counter* 0) - -(defun make-tag () - (setq *tag-counter* (mod (1+ *tag-counter*) (expt 2 22)))) - -(defun y-or-n-p-in-emacs (format-string &rest arguments) - "Like y-or-n-p, but ask in the Emacs minibuffer." - (let ((tag (make-tag)) - (question (apply #'format nil format-string arguments))) - (force-output) - (send-to-emacs `(:y-or-n-p ,(current-thread-id) ,tag ,question)) - (third (wait-for-event `(:emacs-return ,tag result))))) - -(defun read-from-minibuffer-in-emacs (prompt &optional initial-value) - "Ask user a question in Emacs' minibuffer. Returns \"\" when user -entered nothing, returns NIL when user pressed C-g." - (check-type prompt string) (check-type initial-value (or null string)) - (let ((tag (make-tag))) - (force-output) - (send-to-emacs `(:read-from-minibuffer ,(current-thread-id) ,tag - ,prompt ,initial-value)) - (third (wait-for-event `(:emacs-return ,tag result))))) - -(defstruct (unreadable-result - (:constructor make-unreadable-result (string)) - (:copier nil) - (:print-object - (lambda (object stream) - (print-unreadable-object (object stream :type t) - (princ (unreadable-result-string object) stream))))) - string) - -(defun symbol-name-for-emacs (symbol) - (check-type symbol symbol) - (let ((name (string-downcase (symbol-name symbol)))) - (if (keywordp symbol) - (concatenate 'string ":" name) - name))) - -(defun process-form-for-emacs (form) - "Returns a string which emacs will read as equivalent to -FORM. FORM can contain lists, strings, characters, symbols and -numbers. - -Characters are converted emacs' ? notaion, strings are left -as they are (except for espacing any nested \" chars, numbers are -printed in base 10 and symbols are printed as their symbol-name -converted to lower case." - (etypecase form - (string (format nil "~S" form)) - (cons (format nil "(~A . ~A)" - (process-form-for-emacs (car form)) - (process-form-for-emacs (cdr form)))) - (character (format nil "?~C" form)) - (symbol (symbol-name-for-emacs form)) - (number (let ((*print-base* 10)) - (princ-to-string form))))) - -(defun wait-for-emacs-return (tag) - (let ((event (caddr (wait-for-event `(:emacs-return ,tag result))))) - (dcase event - ((:unreadable value) (make-unreadable-result value)) - ((:ok value) value) - ((:error kind . data) (error "~a: ~{~a~}" kind data)) - ((:abort) (abort)) - ;; only in reply to :ed-rpc{-no-wait} events. - ((:ed-rpc-forbidden fn) (error "ED-RPC forbidden for ~a" fn))))) - -(defun eval-in-emacs (form &optional nowait) - "Eval FORM in Emacs. -`slime-enable-evaluate-in-emacs' should be set to T on the Emacs side." - (cond (nowait - (send-to-emacs `(:eval-no-wait ,(process-form-for-emacs form)))) - (t - (force-output) - (let ((tag (make-tag))) - (send-to-emacs `(:eval ,(current-thread-id) ,tag - ,(process-form-for-emacs form))) - (wait-for-emacs-return tag))))) - -(defun ed-rpc-no-wait (fn &rest args) - "Invoke FN in Emacs (or some lesser editor) and don't wait for the result." - (send-to-emacs `(:ed-rpc-no-wait ,(symbol-name-for-emacs fn) ,@args)) - (values)) - -(defun ed-rpc (fn &rest args) - "Invoke FN in Emacs (or some lesser editor). FN should be defined in -Emacs Lisp via `defslimefun' or otherwise marked as RPCallable." - (let ((tag (make-tag))) - (send-to-emacs `(:ed-rpc ,(current-thread-id) ,tag - ,(symbol-name-for-emacs fn) - ,@args)) - (wait-for-emacs-return tag))) - -(defvar *swank-wire-protocol-version* nil - "The version of the swank/slime communication protocol.") - -(defslimefun connection-info () - "Return a key-value list of the form: -\(&key PID STYLE LISP-IMPLEMENTATION MACHINE FEATURES PACKAGE VERSION) -PID: is the process-id of Lisp process (or nil, depending on the STYLE) -STYLE: the communication style -LISP-IMPLEMENTATION: a list (&key TYPE NAME VERSION) -FEATURES: a list of keywords -PACKAGE: a list (&key NAME PROMPT) -VERSION: the protocol version" - (let ((c *emacs-connection*)) - (setq *slime-features* *features*) - `(:pid ,(getpid) :style ,(connection.communication-style c) - :encoding (:coding-systems - ,(loop for cs in '("utf-8-unix" "iso-latin-1-unix") - when (find-external-format cs) collect cs)) - :lisp-implementation (:type ,(lisp-implementation-type) - :name ,(lisp-implementation-type-name) - :version ,(lisp-implementation-version) - :program ,(lisp-implementation-program)) - :machine (:instance ,(machine-instance) - :type ,(machine-type) - :version ,(machine-version)) - :features ,(features-for-emacs) - :modules ,*modules* - :package (:name ,(package-name *package*) - :prompt ,(package-string-for-prompt *package*)) - :version ,*swank-wire-protocol-version*))) - -(defun debug-on-swank-error () - (assert (eq *debug-on-swank-protocol-error* *debug-swank-backend*)) - *debug-on-swank-protocol-error*) - -(defun (setf debug-on-swank-error) (new-value) - (setf *debug-on-swank-protocol-error* new-value) - (setf *debug-swank-backend* new-value)) - -(defslimefun toggle-debug-on-swank-error () - (setf (debug-on-swank-error) (not (debug-on-swank-error)))) - - -;;;; Reading and printing - -(define-special *buffer-package* - "Package corresponding to slime-buffer-package. - -EVAL-FOR-EMACS binds *buffer-package*. Strings originating from a slime -buffer are best read in this package. See also FROM-STRING and TO-STRING.") - -(define-special *buffer-readtable* - "Readtable associated with the current buffer") - -(defmacro with-buffer-syntax ((&optional package) &body body) - "Execute BODY with appropriate *package* and *readtable* bindings. - -This should be used for code that is conceptionally executed in an -Emacs buffer." - `(call-with-buffer-syntax ,package (lambda () ,@body))) - -(defun call-with-buffer-syntax (package fun) - (let ((*package* (if package - (guess-buffer-package package) - *buffer-package*))) - ;; Don't shadow *readtable* unnecessarily because that prevents - ;; the user from assigning to it. - (if (eq *readtable* *buffer-readtable*) - (call-with-syntax-hooks fun) - (let ((*readtable* *buffer-readtable*)) - (call-with-syntax-hooks fun))))) - -(defmacro without-printing-errors ((&key object stream - (msg "<>")) - &body body) - "Catches errors during evaluation of BODY and prints MSG instead." - `(handler-case (progn ,@body) - (serious-condition () - ,(cond ((and stream object) - (let ((gstream (gensym "STREAM+"))) - `(let ((,gstream ,stream)) - (print-unreadable-object (,object ,gstream :type t - :identity t) - (write-string ,msg ,gstream))))) - (stream - `(write-string ,msg ,stream)) - (object - `(with-output-to-string (s) - (print-unreadable-object (,object s :type t :identity t) - (write-string ,msg s)))) - (t msg))))) - -(defun to-string (object) - "Write OBJECT in the *BUFFER-PACKAGE*. -The result may not be readable. Handles problems with PRINT-OBJECT methods -gracefully." - (with-buffer-syntax () - (let ((*print-readably* nil)) - (without-printing-errors (:object object :stream nil) - (prin1-to-string object))))) - -(defun from-string (string) - "Read string in the *BUFFER-PACKAGE*" - (with-buffer-syntax () - (let ((*read-suppress* nil)) - (values (read-from-string string))))) - -(defun parse-string (string package) - "Read STRING in PACKAGE." - (with-buffer-syntax (package) - (let ((*read-suppress* nil)) - (read-from-string string)))) - -;; FIXME: deal with #\| etc. hard to do portably. -(defun tokenize-symbol (string) - "STRING is interpreted as the string representation of a symbol -and is tokenized accordingly. The result is returned in three -values: The package identifier part, the actual symbol identifier -part, and a flag if the STRING represents a symbol that is -internal to the package identifier part. (Notice that the flag is -also true with an empty package identifier part, as the STRING is -considered to represent a symbol internal to some current package.)" - (let ((package (let ((pos (position #\: string))) - (if pos (subseq string 0 pos) nil))) - (symbol (let ((pos (position #\: string :from-end t))) - (if pos (subseq string (1+ pos)) string))) - (internp (not (= (count #\: string) 1)))) - (values symbol package internp))) - -(defun tokenize-symbol-thoroughly (string) - "This version of TOKENIZE-SYMBOL handles escape characters." - (let ((package nil) - (token (make-array (length string) :element-type 'character - :fill-pointer 0)) - (backslash nil) - (vertical nil) - (internp nil)) - (loop for char across string do - (cond - (backslash - (vector-push-extend char token) - (setq backslash nil)) - ((char= char #\\) ; Quotes next character, even within |...| - (setq backslash t)) - ((char= char #\|) - (setq vertical (not vertical))) - (vertical - (vector-push-extend char token)) - ((char= char #\:) - (cond ((and package internp) - (return-from tokenize-symbol-thoroughly)) - (package - (setq internp t)) - (t - (setq package token - token (make-array (length string) - :element-type 'character - :fill-pointer 0))))) - (t - (vector-push-extend (casify-char char) token)))) - (unless vertical - (values token package (or (not package) internp))))) - -(defun untokenize-symbol (package-name internal-p symbol-name) - "The inverse of TOKENIZE-SYMBOL. - - (untokenize-symbol \"quux\" nil \"foo\") ==> \"quux:foo\" - (untokenize-symbol \"quux\" t \"foo\") ==> \"quux::foo\" - (untokenize-symbol nil nil \"foo\") ==> \"foo\" -" - (cond ((not package-name) symbol-name) - (internal-p (cat package-name "::" symbol-name)) - (t (cat package-name ":" symbol-name)))) - -(defun casify-char (char) - "Convert CHAR accoring to readtable-case." - (ecase (readtable-case *readtable*) - (:preserve char) - (:upcase (char-upcase char)) - (:downcase (char-downcase char)) - (:invert (if (upper-case-p char) - (char-downcase char) - (char-upcase char))))) - - -(defun find-symbol-with-status (symbol-name status - &optional (package *package*)) - (multiple-value-bind (symbol flag) (find-symbol symbol-name package) - (if (and flag (eq flag status)) - (values symbol flag) - (values nil nil)))) - -(defun parse-symbol (string &optional (package *package*)) - "Find the symbol named STRING. -Return the symbol and a flag indicating whether the symbols was found." - (multiple-value-bind (sname pname internalp) - (tokenize-symbol-thoroughly string) - (when sname - (let ((package (cond ((string= pname "") keyword-package) - (pname (find-package pname)) - (t package)))) - (if package - (multiple-value-bind (symbol flag) - (if internalp - (find-symbol sname package) - (find-symbol-with-status sname ':external package)) - (values symbol flag sname package)) - (values nil nil nil nil)))))) - -(defun parse-symbol-or-lose (string &optional (package *package*)) - (multiple-value-bind (symbol status) (parse-symbol string package) - (if status - (values symbol status) - (error "Unknown symbol: ~A [in ~A]" string package)))) - -(defun parse-package (string) - "Find the package named STRING. -Return the package or nil." - ;; STRING comes usually from a (in-package STRING) form. - (ignore-errors - (find-package (let ((*package* *swank-io-package*)) - (read-from-string string))))) - -(defun unparse-name (string) - "Print the name STRING according to the current printer settings." - ;; this is intended for package or symbol names - (subseq (prin1-to-string (make-symbol string)) 2)) - -(defun guess-package (string) - "Guess which package corresponds to STRING. -Return nil if no package matches." - (when string - (or (find-package string) - (parse-package string) - (if (find #\! string) ; for SBCL - (guess-package (substitute #\- #\! string)))))) - -(defvar *readtable-alist* (default-readtable-alist) - "An alist mapping package names to readtables.") - -(defun guess-buffer-readtable (package-name) - (let ((package (guess-package package-name))) - (or (and package - (cdr (assoc (package-name package) *readtable-alist* - :test #'string=))) - *readtable*))) - - -;;;; Evaluation - -(defvar *pending-continuations* '() - "List of continuations for Emacs. (thread local)") - -(defun guess-buffer-package (string) - "Return a package for STRING. -Fall back to the current if no such package exists." - (or (and string (guess-package string)) - *package*)) - -(defun eval-for-emacs (form buffer-package id) - "Bind *BUFFER-PACKAGE* to BUFFER-PACKAGE and evaluate FORM. -Return the result to the continuation ID. -Errors are trapped and invoke our debugger." - (let (ok result condition) - (unwind-protect - (let ((*buffer-package* (guess-buffer-package buffer-package)) - (*buffer-readtable* (guess-buffer-readtable buffer-package)) - (*pending-continuations* (cons id *pending-continuations*))) - (check-type *buffer-package* package) - (check-type *buffer-readtable* readtable) - ;; APPLY would be cleaner than EVAL. - ;; (setq result (apply (car form) (cdr form))) - (handler-bind ((t (lambda (c) (setf condition c)))) - (setq result (with-slime-interrupts (eval form)))) - (run-hook *pre-reply-hook*) - (setq ok t)) - (send-to-emacs `(:return ,(current-thread) - ,(if ok - `(:ok ,result) - `(:abort ,(prin1-to-string condition))) - ,id))))) - -(defvar *echo-area-prefix* "=> " - "A prefix that `format-values-for-echo-area' should use.") - -(defun format-values-for-echo-area (values) - (with-buffer-syntax () - (let ((*print-readably* nil)) - (cond ((null values) "; No value") - ((and (integerp (car values)) (null (cdr values))) - (let ((i (car values))) - (format nil "~A~D (~a bit~:p, #x~X, #o~O, #b~B)" - *echo-area-prefix* - i (integer-length i) i i i))) - ((and (typep (car values) 'ratio) - (null (cdr values)) - (ignore-errors - ;; The ratio may be to large to be represented as a single float - (format nil "~A~D (~:*~f)" - *echo-area-prefix* - (car values))))) - (t (format nil "~a~{~S~^, ~}" *echo-area-prefix* values)))))) - -(defmacro values-to-string (values) - `(format-values-for-echo-area (multiple-value-list ,values))) - -(defslimefun interactive-eval (string) - (with-buffer-syntax () - (with-retry-restart (:msg "Retry SLIME interactive evaluation request.") - (let ((values (multiple-value-list (eval (from-string string))))) - (finish-output) - (format-values-for-echo-area values))))) - -(defslimefun eval-and-grab-output (string) - (with-buffer-syntax () - (with-retry-restart (:msg "Retry SLIME evaluation request.") - (let* ((s (make-string-output-stream)) - (*standard-output* s) - (values (multiple-value-list (eval (from-string string))))) - (list (get-output-stream-string s) - (format nil "~{~S~^~%~}" values)))))) - -(defun eval-region (string) - "Evaluate STRING. -Return the results of the last form as a list and as secondary value the -last form." - (with-input-from-string (stream string) - (let (- values) - (loop - (let ((form (read stream nil stream))) - (when (eq form stream) - (finish-output) - (return (values values -))) - (setq - form) - (setq values (multiple-value-list (eval form))) - (finish-output)))))) - -(defslimefun interactive-eval-region (string) - (with-buffer-syntax () - (with-retry-restart (:msg "Retry SLIME interactive evaluation request.") - (format-values-for-echo-area (eval-region string))))) - -(defslimefun re-evaluate-defvar (form) - (with-buffer-syntax () - (with-retry-restart (:msg "Retry SLIME evaluation request.") - (let ((form (read-from-string form))) - (destructuring-bind (dv name &optional value doc) form - (declare (ignore value doc)) - (assert (eq dv 'defvar)) - (makunbound name) - (prin1-to-string (eval form))))))) - -(defvar *swank-pprint-bindings* - `((*print-pretty* . t) - (*print-level* . nil) - (*print-length* . nil) - (*print-circle* . t) - (*print-gensym* . t) - (*print-readably* . nil)) - "A list of variables bindings during pretty printing. -Used by pprint-eval.") - -(defun swank-pprint (values) - "Bind some printer variables and pretty print each object in VALUES." - (with-buffer-syntax () - (with-bindings *swank-pprint-bindings* - (cond ((null values) "; No value") - (t (with-output-to-string (*standard-output*) - (dolist (o values) - (pprint o) - (terpri)))))))) - -(defslimefun pprint-eval (string) - (with-buffer-syntax () - (let* ((s (make-string-output-stream)) - (values - (let ((*standard-output* s) - (*trace-output* s)) - (multiple-value-list (eval (read-from-string string)))))) - (cat (get-output-stream-string s) - (swank-pprint values))))) - -(defslimefun set-package (name) - "Set *package* to the package named NAME. -Return the full package-name and the string to use in the prompt." - (let ((p (guess-package name))) - (assert (packagep p) nil "Package ~a doesn't exist." name) - (setq *package* p) - (list (package-name p) (package-string-for-prompt p)))) - -(defun cat (&rest strings) - "Concatenate all arguments and make the result a string." - (with-output-to-string (out) - (dolist (s strings) - (etypecase s - (string (write-string s out)) - (character (write-char s out)))))) - -(defun truncate-string (string width &optional ellipsis) - (let ((len (length string))) - (cond ((< len width) string) - (ellipsis (cat (subseq string 0 width) ellipsis)) - (t (subseq string 0 width))))) - -(defun call/truncated-output-to-string (length function - &optional (ellipsis "..")) - "Call FUNCTION with a new stream, return the output written to the stream. -If FUNCTION tries to write more than LENGTH characters, it will be -aborted and return immediately with the output written so far." - (let ((buffer (make-string (+ length (length ellipsis)))) - (fill-pointer 0)) - (block buffer-full - (flet ((write-output (string) - (let* ((free (- length fill-pointer)) - (count (min free (length string)))) - (replace buffer string :start1 fill-pointer :end2 count) - (incf fill-pointer count) - (when (> (length string) free) - (replace buffer ellipsis :start1 fill-pointer) - (return-from buffer-full buffer))))) - (let ((stream (make-output-stream #'write-output))) - (funcall function stream) - (finish-output stream) - (subseq buffer 0 fill-pointer)))))) - -(defmacro with-string-stream ((var &key length bindings) - &body body) - (cond ((and (not bindings) (not length)) - `(with-output-to-string (,var) . ,body)) - ((not bindings) - `(call/truncated-output-to-string - ,length (lambda (,var) . ,body))) - (t - `(with-bindings ,bindings - (with-string-stream (,var :length ,length) - . ,body))))) - -(defun to-line (object &optional width) - "Print OBJECT to a single line. Return the string." - (let ((width (or width 512))) - (without-printing-errors (:object object :stream nil) - (with-string-stream (stream :length width) - (write object :stream stream :right-margin width :lines 1))))) - -(defun escape-string (string stream &key length (map '((#\" . "\\\"") - (#\\ . "\\\\")))) - "Write STRING to STREAM surronded by double-quotes. -LENGTH -- if non-nil truncate output after LENGTH chars. -MAP -- rewrite the chars in STRING according to this alist." - (let ((limit (or length array-dimension-limit))) - (write-char #\" stream) - (loop for c across string - for i from 0 do - (when (= i limit) - (write-string "..." stream) - (return)) - (let ((probe (assoc c map))) - (cond (probe (write-string (cdr probe) stream)) - (t (write-char c stream))))) - (write-char #\" stream))) - - -;;;; Prompt - -;; FIXME: do we really need 45 lines of code just to figure out the -;; prompt? - -(defvar *canonical-package-nicknames* - `((:common-lisp-user . :cl-user)) - "Canonical package names to use instead of shortest name/nickname.") - -(defvar *auto-abbreviate-dotted-packages* t - "Abbreviate dotted package names to their last component if T.") - -(defun package-string-for-prompt (package) - "Return the shortest nickname (or canonical name) of PACKAGE." - (unparse-name - (or (canonical-package-nickname package) - (auto-abbreviated-package-name package) - (shortest-package-nickname package)))) - -(defun canonical-package-nickname (package) - "Return the canonical package nickname, if any, of PACKAGE." - (let ((name (cdr (assoc (package-name package) *canonical-package-nicknames* - :test #'string=)))) - (and name (string name)))) - -(defun auto-abbreviated-package-name (package) - "Return an abbreviated 'name' for PACKAGE. - -N.B. this is not an actual package name or nickname." - (when *auto-abbreviate-dotted-packages* - (loop with package-name = (package-name package) - with offset = nil - do (let ((last-dot-pos (position #\. package-name :end offset - :from-end t))) - (unless last-dot-pos - (return nil)) - ;; If a dot chunk contains only numbers, that chunk most - ;; likely represents a version number; so we collect the - ;; next chunks, too, until we find one with meat. - (let ((name (subseq package-name (1+ last-dot-pos) offset))) - (if (notevery #'digit-char-p name) - (return (subseq package-name (1+ last-dot-pos))) - (setq offset last-dot-pos))))))) - -(defun shortest-package-nickname (package) - "Return the shortest nickname of PACKAGE." - (loop for name in (cons (package-name package) (package-nicknames package)) - for shortest = name then (if (< (length name) (length shortest)) - name - shortest) - finally (return shortest))) - - - -(defslimefun ed-in-emacs (&optional what) - "Edit WHAT in Emacs. - -WHAT can be: - A pathname or a string, - A list (PATHNAME-OR-STRING &key LINE COLUMN POSITION), - A function name (symbol or cons), - NIL. " - (flet ((canonicalize-filename (filename) - (pathname-to-filename (or (probe-file filename) filename)))) - (let ((target - (etypecase what - (null nil) - ((or string pathname) - `(:filename ,(canonicalize-filename what))) - ((cons (or string pathname) *) - `(:filename ,(canonicalize-filename (car what)) ,@(cdr what))) - ((or symbol cons) - `(:function-name ,(prin1-to-string what)))))) - (cond (*emacs-connection* (send-oob-to-emacs `(:ed ,target))) - ((default-connection) - (with-connection ((default-connection)) - (send-oob-to-emacs `(:ed ,target)))) - (t (error "No connection")))))) - -(defslimefun inspect-in-emacs (what &key wait) - "Inspect WHAT in Emacs. If WAIT is true (default NIL) blocks until the -inspector has been closed in Emacs." - (flet ((send-it () - (let ((tag (when wait (make-tag))) - (thread (when wait (current-thread-id)))) - (with-buffer-syntax () - (reset-inspector) - (send-oob-to-emacs `(:inspect ,(inspect-object what) - ,thread - ,tag))) - (when wait - (wait-for-event `(:emacs-return ,tag result)))))) - (cond - (*emacs-connection* - (send-it)) - ((default-connection) - (with-connection ((default-connection)) - (send-it)))) - what)) - -(defslimefun value-for-editing (form) - "Return a readable value of FORM for editing in Emacs. -FORM is expected, but not required, to be SETF'able." - ;; FIXME: Can we check FORM for setfability? -luke (12/Mar/2005) - (with-buffer-syntax () - (let* ((value (eval (read-from-string form))) - (*print-length* nil)) - (prin1-to-string value)))) - -(defslimefun commit-edited-value (form value) - "Set the value of a setf'able FORM to VALUE. -FORM and VALUE are both strings from Emacs." - (with-buffer-syntax () - (eval `(setf ,(read-from-string form) - ,(read-from-string (concatenate 'string "`" value)))) - t)) - -(defun background-message (format-string &rest args) - "Display a message in Emacs' echo area. - -Use this function for informative messages only. The message may even -be dropped if we are too busy with other things." - (when *emacs-connection* - (send-to-emacs `(:background-message - ,(apply #'format nil format-string args))))) - -;; This is only used by the test suite. -(defun sleep-for (seconds) - "Sleep for at least SECONDS seconds. -This is just like cl:sleep but guarantees to sleep -at least SECONDS." - (let* ((start (get-internal-real-time)) - (end (+ start - (* seconds internal-time-units-per-second)))) - (loop - (let ((now (get-internal-real-time))) - (cond ((< end now) (return)) - (t (sleep (/ (- end now) - internal-time-units-per-second)))))))) - - -;;;; Debugger - -(defun invoke-slime-debugger (condition) - "Sends a message to Emacs declaring that the debugger has been entered, -then waits to handle further requests from Emacs. Eventually returns -after Emacs causes a restart to be invoked." - (without-slime-interrupts - (cond (*emacs-connection* - (debug-in-emacs condition)) - ((default-connection) - (with-connection ((default-connection)) - (debug-in-emacs condition)))))) - -(define-condition invoke-default-debugger () ()) - -(defun swank-debugger-hook (condition hook) - "Debugger function for binding *DEBUGGER-HOOK*." - (declare (ignore hook)) - (handler-case - (call-with-debugger-hook #'swank-debugger-hook - (lambda () (invoke-slime-debugger condition))) - (invoke-default-debugger () - (invoke-default-debugger condition)))) - -(defun invoke-default-debugger (condition) - (call-with-debugger-hook nil (lambda () (invoke-debugger condition)))) - -(defvar *global-debugger* t - "Non-nil means the Swank debugger hook will be installed globally.") - -(add-hook *new-connection-hook* 'install-debugger) -(defun install-debugger (connection) - (declare (ignore connection)) - (when *global-debugger* - (install-debugger-globally #'swank-debugger-hook))) - -;;;;; Debugger loop -;;; -;;; These variables are dynamically bound during debugging. -;;; -(defvar *swank-debugger-condition* nil - "The condition being debugged.") - -(defvar *sldb-level* 0 - "The current level of recursive debugging.") - -(defvar *sldb-initial-frames* 20 - "The initial number of backtrace frames to send to Emacs.") - -(defvar *sldb-restarts* nil - "The list of currenlty active restarts.") - -(defvar *sldb-stepping-p* nil - "True during execution of a step command.") - -(defun debug-in-emacs (condition) - (let ((*swank-debugger-condition* condition) - (*sldb-restarts* (compute-restarts condition)) - (*sldb-quit-restart* (and *sldb-quit-restart* - (find-restart *sldb-quit-restart*))) - (*package* (or (and (boundp '*buffer-package*) - (symbol-value '*buffer-package*)) - *package*)) - (*sldb-level* (1+ *sldb-level*)) - (*sldb-stepping-p* nil)) - (force-user-output) - (call-with-debugging-environment - (lambda () - (sldb-loop *sldb-level*))))) - -(defun sldb-loop (level) - (unwind-protect - (loop - (with-simple-restart (abort "Return to sldb level ~D." level) - (send-to-emacs - (list* :debug (current-thread-id) level - (debugger-info-for-emacs 0 *sldb-initial-frames*))) - (send-to-emacs - (list :debug-activate (current-thread-id) level nil)) - (loop - (handler-case - (dcase (wait-for-event - `(or (:emacs-rex . _) - (:sldb-return ,(1+ level)))) - ((:emacs-rex &rest args) (apply #'eval-for-emacs args)) - ((:sldb-return _) (declare (ignore _)) (return nil))) - (sldb-condition (c) - (handle-sldb-condition c)))))) - (send-to-emacs `(:debug-return - ,(current-thread-id) ,level ,*sldb-stepping-p*)) - (wait-for-event `(:sldb-return ,(1+ level)) t) ; clean event-queue - (when (> level 1) - (send-event (current-thread) `(:sldb-return ,level))))) - -(defun handle-sldb-condition (condition) - "Handle an internal debugger condition. -Rather than recursively debug the debugger (a dangerous idea!), these -conditions are simply reported." - (let ((real-condition (original-condition condition))) - (send-to-emacs `(:debug-condition ,(current-thread-id) - ,(princ-to-string real-condition))))) - -(defun %%condition-message (condition) - (let ((limit (ash 1 16))) - (with-string-stream (stream :length limit) - (handler-case - (let ((*print-readably* nil) - (*print-pretty* t) - (*print-right-margin* 65) - (*print-circle* t) - (*print-length* (or *print-length* limit)) - (*print-level* (or *print-level* limit)) - (*print-lines* (or *print-lines* limit))) - (print-condition condition stream)) - (serious-condition (c) - (ignore-errors - (with-standard-io-syntax - (let ((*print-readably* nil)) - (format stream "~&Error (~a) during printing: " (type-of c)) - (print-unreadable-object (condition stream :type t - :identity t)))))))))) - -(defun %condition-message (condition) - (string-trim #(#\newline #\space #\tab) - (%%condition-message condition))) - -(defvar *sldb-condition-printer* #'%condition-message - "Function called to print a condition to an SLDB buffer.") - -(defun safe-condition-message (condition) - "Print condition to a string, handling any errors during printing." - (funcall *sldb-condition-printer* condition)) - -(defun debugger-condition-for-emacs () - (list (safe-condition-message *swank-debugger-condition*) - (format nil " [Condition of type ~S]" - (type-of *swank-debugger-condition*)) - (condition-extras *swank-debugger-condition*))) - -(defun format-restarts-for-emacs () - "Return a list of restarts for *swank-debugger-condition* in a -format suitable for Emacs." - (let ((*print-right-margin* most-positive-fixnum)) - (loop for restart in *sldb-restarts* collect - (list (format nil "~:[~;*~]~a" - (eq restart *sldb-quit-restart*) - (restart-name restart)) - (with-output-to-string (stream) - (without-printing-errors (:object restart - :stream stream - :msg "<>") - (princ restart stream))))))) - -;;;;; SLDB entry points - -(defslimefun sldb-break-with-default-debugger (dont-unwind) - "Invoke the default debugger." - (cond (dont-unwind - (invoke-default-debugger *swank-debugger-condition*)) - (t - (signal 'invoke-default-debugger)))) - -(defslimefun backtrace (start end) - "Return a list ((I FRAME PLIST) ...) of frames from START to END. - -I is an integer, and can be used to reference the corresponding frame -from Emacs; FRAME is a string representation of an implementation's -frame." - (loop for frame in (compute-backtrace start end) - for i from start collect - (list* i (frame-to-string frame) - (ecase (frame-restartable-p frame) - ((nil) nil) - ((t) `((:restartable t))))))) - -(defun frame-to-string (frame) - (with-string-stream (stream :length (* (or *print-lines* 1) - (or *print-right-margin* 100)) - :bindings *backtrace-printer-bindings*) - (handler-case (print-frame frame stream) - (serious-condition () - (format stream "[error printing frame]"))))) - -(defslimefun debugger-info-for-emacs (start end) - "Return debugger state, with stack frames from START to END. -The result is a list: - (condition ({restart}*) ({stack-frame}*) (cont*)) -where - condition ::= (description type [extra]) - restart ::= (name description) - stack-frame ::= (number description [plist]) - extra ::= (:references and other random things) - cont ::= continutation - plist ::= (:restartable {nil | t | :unknown}) - -condition---a pair of strings: message, and type. If show-source is -not nil it is a frame number for which the source should be displayed. - -restart---a pair of strings: restart name, and description. - -stack-frame---a number from zero (the top), and a printed -representation of the frame's call. - -continutation---the id of a pending Emacs continuation. - -Below is an example return value. In this case the condition was a -division by zero (multi-line description), and only one frame is being -fetched (start=0, end=1). - - ((\"Arithmetic error DIVISION-BY-ZERO signalled. -Operation was KERNEL::DIVISION, operands (1 0).\" - \"[Condition of type DIVISION-BY-ZERO]\") - ((\"ABORT\" \"Return to Slime toplevel.\") - (\"ABORT\" \"Return to Top-Level.\")) - ((0 \"(KERNEL::INTEGER-/-INTEGER 1 0)\" (:restartable nil))) - (4))" - (list (debugger-condition-for-emacs) - (format-restarts-for-emacs) - (backtrace start end) - *pending-continuations*)) - -(defun nth-restart (index) - (nth index *sldb-restarts*)) - -(defslimefun invoke-nth-restart (index) - (let ((restart (nth-restart index))) - (when restart - (invoke-restart-interactively restart)))) - -(defslimefun sldb-abort () - (invoke-restart (find 'abort *sldb-restarts* :key #'restart-name))) - -(defslimefun sldb-continue () - (continue)) - -(defun coerce-to-condition (datum args) - (etypecase datum - (string (make-condition 'simple-error :format-control datum - :format-arguments args)) - (symbol (apply #'make-condition datum args)))) - -(defslimefun simple-break (&optional (datum "Interrupt from Emacs") &rest args) - (with-simple-restart (continue "Continue from break.") - (invoke-slime-debugger (coerce-to-condition datum args)))) - -;; FIXME: (last (compute-restarts)) looks dubious. -(defslimefun throw-to-toplevel () - "Invoke the ABORT-REQUEST restart abort an RPC from Emacs. -If we are not evaluating an RPC then ABORT instead." - (let ((restart (or (and *sldb-quit-restart* - (find-restart *sldb-quit-restart*)) - (car (last (compute-restarts)))))) - (cond (restart (invoke-restart restart)) - (t (format nil "Restart not active [~s]" *sldb-quit-restart*))))) - -(defslimefun invoke-nth-restart-for-emacs (sldb-level n) - "Invoke the Nth available restart. -SLDB-LEVEL is the debug level when the request was made. If this -has changed, ignore the request." - (when (= sldb-level *sldb-level*) - (invoke-nth-restart n))) - -(defun wrap-sldb-vars (form) - `(let ((*sldb-level* ,*sldb-level*)) - ,form)) - -(defun eval-in-frame-aux (frame string package print) - (let* ((form (wrap-sldb-vars (parse-string string package))) - (values (multiple-value-list (eval-in-frame form frame)))) - (with-buffer-syntax (package) - (funcall print values)))) - -(defslimefun eval-string-in-frame (string frame package) - (eval-in-frame-aux frame string package #'format-values-for-echo-area)) - -(defslimefun pprint-eval-string-in-frame (string frame package) - (eval-in-frame-aux frame string package #'swank-pprint)) - -(defslimefun frame-package-name (frame) - (let ((pkg (frame-package frame))) - (cond (pkg (package-name pkg)) - (t (with-buffer-syntax () (package-name *package*)))))) - -(defslimefun frame-locals-and-catch-tags (index) - "Return a list (LOCALS TAGS) for vars and catch tags in the frame INDEX. -LOCALS is a list of the form ((&key NAME ID VALUE) ...). -TAGS has is a list of strings." - (list (frame-locals-for-emacs index) - (mapcar #'to-string (frame-catch-tags index)))) - -(defun frame-locals-for-emacs (index) - (with-bindings *backtrace-printer-bindings* - (loop for var in (frame-locals index) collect - (destructuring-bind (&key name id value) var - (list :name (let ((*package* (or (frame-package index) *package*))) - (prin1-to-string name)) - :id id - :value (to-line value *print-right-margin*)))))) - -(defslimefun sldb-disassemble (index) - (with-output-to-string (*standard-output*) - (disassemble-frame index))) - -(defslimefun sldb-return-from-frame (index string) - (let ((form (from-string string))) - (to-string (multiple-value-list (return-from-frame index form))))) - -(defslimefun sldb-break (name) - (with-buffer-syntax () - (sldb-break-at-start (read-from-string name)))) - -(defmacro define-stepper-function (name backend-function-name) - `(defslimefun ,name (frame) - (cond ((sldb-stepper-condition-p *swank-debugger-condition*) - (setq *sldb-stepping-p* t) - (,backend-function-name)) - ((find-restart 'continue) - (activate-stepping frame) - (setq *sldb-stepping-p* t) - (continue)) - (t - (error "Not currently single-stepping, ~ -and no continue restart available."))))) - -(define-stepper-function sldb-step sldb-step-into) -(define-stepper-function sldb-next sldb-step-next) -(define-stepper-function sldb-out sldb-step-out) - -(defslimefun toggle-break-on-signals () - (setq *break-on-signals* (not *break-on-signals*)) - (format nil "*break-on-signals* = ~a" *break-on-signals*)) - -(defslimefun sdlb-print-condition () - (princ-to-string *swank-debugger-condition*)) - - -;;;; Compilation Commands. - -(defstruct (compilation-result (:type list)) - (type :compilation-result) - notes - (successp nil :type boolean) - (duration 0.0 :type float) - (loadp nil :type boolean) - (faslfile nil :type (or null string))) - -(defun measure-time-interval (fun) - "Call FUN and return the first return value and the elapsed time. -The time is measured in seconds." - (declare (type function fun)) - (let ((before (get-internal-real-time))) - (values - (funcall fun) - (/ (- (get-internal-real-time) before) - (coerce internal-time-units-per-second 'float))))) - -(defun make-compiler-note (condition) - "Make a compiler note data structure from a compiler-condition." - (declare (type compiler-condition condition)) - (list* :message (message condition) - :severity (severity condition) - :location (location condition) - :references (references condition) - (let ((s (source-context condition))) - (if s (list :source-context s))))) - -(defun collect-notes (function) - (let ((notes '())) - (multiple-value-bind (result seconds) - (handler-bind ((compiler-condition - (lambda (c) (push (make-compiler-note c) notes)))) - (measure-time-interval - (lambda () - ;; To report location of error-signaling toplevel forms - ;; for errors in EVAL-WHEN or during macroexpansion. - (restart-case (multiple-value-list (funcall function)) - (abort () :report "Abort compilation." (list nil)))))) - (destructuring-bind (successp &optional loadp faslfile) result - (let ((faslfile (etypecase faslfile - (null nil) - (pathname (pathname-to-filename faslfile))))) - (make-compilation-result :notes (reverse notes) - :duration seconds - :successp (if successp t) - :loadp (if loadp t) - :faslfile faslfile)))))) - -(defun swank-compile-file* (pathname load-p &rest options &key policy - &allow-other-keys) - (multiple-value-bind (output-pathname warnings? failure?) - (swank-compile-file pathname - (fasl-pathname pathname options) - nil - (or (guess-external-format pathname) - :default) - :policy policy) - (declare (ignore warnings?)) - (values t (not failure?) load-p output-pathname))) - -(defvar *compile-file-for-emacs-hook* '(swank-compile-file*)) - -(defslimefun compile-file-for-emacs (filename load-p &rest options) - "Compile FILENAME and, when LOAD-P, load the result. -Record compiler notes signalled as `compiler-condition's." - (with-buffer-syntax () - (collect-notes - (lambda () - (let ((pathname (filename-to-pathname filename)) - (*compile-print* nil) - (*compile-verbose* t)) - (loop for hook in *compile-file-for-emacs-hook* - do - (multiple-value-bind (tried success load? output-pathname) - (apply hook pathname load-p options) - (when tried - (return (values success load? output-pathname)))))))))) - -;; FIXME: now that *compile-file-for-emacs-hook* is there this is -;; redundant and confusing. -(defvar *fasl-pathname-function* nil - "In non-nil, use this function to compute the name for fasl-files.") - -(defun pathname-as-directory (pathname) - (append (pathname-directory pathname) - (when (pathname-name pathname) - (list (file-namestring pathname))))) - -(defun compile-file-output (file directory) - (make-pathname :directory (pathname-as-directory directory) - :defaults (compile-file-pathname file))) - -(defun fasl-pathname (input-file options) - (cond (*fasl-pathname-function* - (funcall *fasl-pathname-function* input-file options)) - ((getf options :fasl-directory) - (let ((dir (getf options :fasl-directory))) - (assert (char= (aref dir (1- (length dir))) #\/)) - (compile-file-output input-file dir))) - (t - (compile-file-pathname input-file)))) - -(defslimefun compile-string-for-emacs (string buffer position filename policy) - "Compile STRING (exerpted from BUFFER at POSITION). -Record compiler notes signalled as `compiler-condition's." - (let ((offset (cadr (assoc :position position)))) - (with-buffer-syntax () - (collect-notes - (lambda () - (let ((*compile-print* t) (*compile-verbose* nil)) - (swank-compile-string string - :buffer buffer - :position offset - :filename filename - :policy policy))))))) - -(defslimefun compile-multiple-strings-for-emacs (strings policy) - "Compile STRINGS (exerpted from BUFFER at POSITION). -Record compiler notes signalled as `compiler-condition's." - (loop for (string buffer package position filename) in strings collect - (collect-notes - (lambda () - (with-buffer-syntax (package) - (let ((*compile-print* t) (*compile-verbose* nil)) - (swank-compile-string string - :buffer buffer - :position position - :filename filename - :policy policy))))))) - -(defun file-newer-p (new-file old-file) - "Returns true if NEW-FILE is newer than OLD-FILE." - (> (file-write-date new-file) (file-write-date old-file))) - -(defun requires-compile-p (source-file) - (let ((fasl-file (probe-file (compile-file-pathname source-file)))) - (or (not fasl-file) - (file-newer-p source-file fasl-file)))) - -(defslimefun compile-file-if-needed (filename loadp) - (let ((pathname (filename-to-pathname filename))) - (cond ((requires-compile-p pathname) - (compile-file-for-emacs pathname loadp)) - (t - (collect-notes - (lambda () - (or (not loadp) - (load (compile-file-pathname pathname))))))))) - - -;;;; Loading - -(defslimefun load-file (filename) - (to-string (load (filename-to-pathname filename)))) - - -;;;;; swank-require - -(defslimefun swank-require (modules &optional filename) - "Load the module MODULE." - (dolist (module (ensure-list modules)) - (unless (member (string module) *modules* :test #'string=) - (require module (if filename - (filename-to-pathname filename) - (module-filename module))) - (assert (member (string module) *modules* :test #'string=) - () "Required module ~s was not provided" module))) - *modules*) - -(defvar *find-module* 'find-module - "Pluggable function to locate modules. -The function receives a module name as argument and should return -the filename of the module (or nil if the file doesn't exist).") - -(defun module-filename (module) - "Return the filename for the module MODULE." - (or (funcall *find-module* module) - (error "Can't locate module: ~s" module))) - -;;;;;; Simple *find-module* function. - -(defun merged-directory (dirname defaults) - (pathname-directory - (merge-pathnames - (make-pathname :directory `(:relative ,dirname) :defaults defaults) - defaults))) - -(defvar *load-path* '() - "A list of directories to search for modules.") - -(defun module-candidates (name dir) - (list (compile-file-pathname (make-pathname :name name :defaults dir)) - (make-pathname :name name :type "lisp" :defaults dir))) - -(defun find-module (module) - (let ((name (string-downcase module))) - (some (lambda (dir) (some #'probe-file (module-candidates name dir))) - *load-path*))) - - -;;;; Macroexpansion - -(defvar *macroexpand-printer-bindings* - '((*print-circle* . nil) - (*print-pretty* . t) - (*print-escape* . t) - (*print-lines* . nil) - (*print-level* . nil) - (*print-length* . nil))) - -(defun apply-macro-expander (expander string) - (with-buffer-syntax () - (with-bindings *macroexpand-printer-bindings* - (prin1-to-string (funcall expander (from-string string)))))) - -(defslimefun swank-macroexpand-1 (string) - (apply-macro-expander #'macroexpand-1 string)) - -(defslimefun swank-macroexpand (string) - (apply-macro-expander #'macroexpand string)) - -(defslimefun swank-macroexpand-all (string) - (apply-macro-expander #'macroexpand-all string)) - -(defslimefun swank-compiler-macroexpand-1 (string) - (apply-macro-expander #'compiler-macroexpand-1 string)) - -(defslimefun swank-compiler-macroexpand (string) - (apply-macro-expander #'compiler-macroexpand string)) - -(defslimefun swank-expand-1 (string) - (apply-macro-expander #'expand-1 string)) - -(defslimefun swank-expand (string) - (apply-macro-expander #'expand string)) - -(defun expand-1 (form) - (multiple-value-bind (expansion expanded?) (macroexpand-1 form) - (if expanded? - (values expansion t) - (compiler-macroexpand-1 form)))) - -(defun expand (form) - (expand-repeatedly #'expand-1 form)) - -(defun expand-repeatedly (expander form) - (loop - (multiple-value-bind (expansion expanded?) (funcall expander form) - (unless expanded? (return expansion)) - (setq form expansion)))) - -(defslimefun swank-format-string-expand (string) - (apply-macro-expander #'format-string-expand string)) - -(defslimefun disassemble-form (form) - (with-buffer-syntax () - (with-output-to-string (*standard-output*) - (let ((*print-readably* nil)) - (disassemble (eval (read-from-string form))))))) - - -;;;; Simple completion - -(defslimefun simple-completions (prefix package) - "Return a list of completions for the string PREFIX." - (let ((strings (all-completions prefix package))) - (list strings (longest-common-prefix strings)))) - -(defun all-completions (prefix package) - (multiple-value-bind (name pname intern) (tokenize-symbol prefix) - (let* ((extern (and pname (not intern))) - (pkg (cond ((equal pname "") keyword-package) - ((not pname) (guess-buffer-package package)) - (t (guess-package pname)))) - (test (lambda (sym) (prefix-match-p name (symbol-name sym)))) - (syms (and pkg (matching-symbols pkg extern test))) - (strings (loop for sym in syms - for str = (unparse-symbol sym) - when (prefix-match-p name str) ; remove |Foo| - collect str))) - (format-completion-set strings intern pname)))) - -(defun matching-symbols (package external test) - (let ((test (if external - (lambda (s) - (and (symbol-external-p s package) - (funcall test s))) - test)) - (result '())) - (do-symbols (s package) - (when (funcall test s) - (push s result))) - (remove-duplicates result))) - -(defun unparse-symbol (symbol) - (let ((*print-case* (case (readtable-case *readtable*) - (:downcase :upcase) - (t :downcase)))) - (unparse-name (symbol-name symbol)))) - -(defun prefix-match-p (prefix string) - "Return true if PREFIX is a prefix of STRING." - (not (mismatch prefix string :end2 (min (length string) (length prefix)) - :test #'char-equal))) - -(defun longest-common-prefix (strings) - "Return the longest string that is a common prefix of STRINGS." - (if (null strings) - "" - (flet ((common-prefix (s1 s2) - (let ((diff-pos (mismatch s1 s2))) - (if diff-pos (subseq s1 0 diff-pos) s1)))) - (reduce #'common-prefix strings)))) - -(defun format-completion-set (strings internal-p package-name) - "Format a set of completion strings. -Returns a list of completions with package qualifiers if needed." - (mapcar (lambda (string) (untokenize-symbol package-name internal-p string)) - (sort strings #'string<))) - - -;;;; Simple arglist display - -(defslimefun operator-arglist (name package) - (ignore-errors - (let ((args (arglist (parse-symbol name (guess-buffer-package package))))) - (cond ((eq args :not-available) nil) - (t (princ-to-string (cons name args))))))) - - -;;;; Documentation - -(defslimefun apropos-list-for-emacs (name &optional external-only - case-sensitive package) - "Make an apropos search for Emacs. -The result is a list of property lists." - (let ((package (if package - (or (parse-package package) - (error "No such package: ~S" package))))) - ;; The MAPCAN will filter all uninteresting symbols, i.e. those - ;; who cannot be meaningfully described. - (mapcan (listify #'briefly-describe-symbol-for-emacs) - (sort (remove-duplicates - (apropos-symbols name external-only case-sensitive package)) - #'present-symbol-before-p)))) - -(defun briefly-describe-symbol-for-emacs (symbol) - "Return a property list describing SYMBOL. -Like `describe-symbol-for-emacs' but with at most one line per item." - (flet ((first-line (string) - (let ((pos (position #\newline string))) - (if (null pos) string (subseq string 0 pos))))) - (let ((desc (map-if #'stringp #'first-line - (describe-symbol-for-emacs symbol)))) - (if desc - (list* :designator (to-string symbol) desc))))) - -(defun map-if (test fn &rest lists) - "Like (mapcar FN . LISTS) but only call FN on objects satisfying TEST. -Example: -\(map-if #'oddp #'- '(1 2 3 4 5)) => (-1 2 -3 4 -5)" - (apply #'mapcar - (lambda (x) (if (funcall test x) (funcall fn x) x)) - lists)) - -(defun listify (f) - "Return a function like F, but which returns any non-null value -wrapped in a list." - (lambda (x) - (let ((y (funcall f x))) - (and y (list y))))) - -(defun present-symbol-before-p (x y) - "Return true if X belongs before Y in a printed summary of symbols. -Sorted alphabetically by package name and then symbol name, except -that symbols accessible in the current package go first." - (declare (type symbol x y)) - (flet ((accessible (s) - ;; Test breaks on NIL for package that does not inherit it - (eq (find-symbol (symbol-name s) *buffer-package*) s))) - (let ((ax (accessible x)) (ay (accessible y))) - (cond ((and ax ay) (string< (symbol-name x) (symbol-name y))) - (ax t) - (ay nil) - (t (let ((px (symbol-package x)) (py (symbol-package y))) - (if (eq px py) - (string< (symbol-name x) (symbol-name y)) - (string< (package-name px) (package-name py))))))))) - -(defun make-apropos-matcher (pattern case-sensitive) - (let ((chr= (if case-sensitive #'char= #'char-equal))) - (lambda (symbol) - (search pattern (string symbol) :test chr=)))) - -(defun apropos-symbols (string external-only case-sensitive package) - (let ((packages (or package (remove (find-package :keyword) - (list-all-packages)))) - (matcher (make-apropos-matcher string case-sensitive)) - (result)) - (with-package-iterator (next packages :external :internal) - (loop (multiple-value-bind (morep symbol) (next) - (cond ((not morep) (return)) - ((and (if external-only (symbol-external-p symbol) t) - (funcall matcher symbol)) - (push symbol result)))))) - result)) - -(defun call-with-describe-settings (fn) - (let ((*print-readably* nil)) - (funcall fn))) - -(defmacro with-describe-settings ((&rest _) &body body) - (declare (ignore _)) - `(call-with-describe-settings (lambda () ,@body))) - -(defun describe-to-string (object) - (with-describe-settings () - (with-output-to-string (*standard-output*) - (describe object)))) - -(defslimefun describe-symbol (symbol-name) - (with-buffer-syntax () - (describe-to-string (parse-symbol-or-lose symbol-name)))) - -(defslimefun describe-function (name) - (with-buffer-syntax () - (let ((symbol (parse-symbol-or-lose name))) - (describe-to-string (or (macro-function symbol) - (symbol-function symbol)))))) - -(defslimefun describe-definition-for-emacs (name kind) - (with-buffer-syntax () - (with-describe-settings () - (with-output-to-string (*standard-output*) - (describe-definition (parse-symbol-or-lose name) kind))))) - -(defslimefun documentation-symbol (symbol-name) - (with-buffer-syntax () - (multiple-value-bind (sym foundp) (parse-symbol symbol-name) - (if foundp - (let ((vdoc (documentation sym 'variable)) - (fdoc (documentation sym 'function))) - (with-output-to-string (string) - (format string "Documentation for the symbol ~a:~2%" sym) - (unless (or vdoc fdoc) - (format string "Not documented." )) - (when vdoc - (format string "Variable:~% ~a~2%" vdoc)) - (when fdoc - (format string "Function:~% Arglist: ~a~2% ~a" - (arglist sym) - fdoc)))) - (format nil "No such symbol, ~a." symbol-name))))) - - -;;;; Package Commands - -(defslimefun list-all-package-names (&optional nicknames) - "Return a list of all package names. -Include the nicknames if NICKNAMES is true." - (mapcar #'unparse-name - (if nicknames - (mapcan #'package-names (list-all-packages)) - (mapcar #'package-name (list-all-packages))))) - - -;;;; Tracing - -;; Use eval for the sake of portability... -(defun tracedp (fspec) - (member fspec (eval '(trace)))) - -(defvar *after-toggle-trace-hook* nil - "Hook called whenever a SPEC is traced or untraced. - -If non-nil, called with two arguments SPEC and TRACED-P." ) -(defslimefun swank-toggle-trace (spec-string) - (let* ((spec (from-string spec-string)) - (retval (cond ((consp spec) ; handle complicated cases in the backend - (toggle-trace spec)) - ((tracedp spec) - (eval `(untrace ,spec)) - (format nil "~S is now untraced." spec)) - (t - (eval `(trace ,spec)) - (format nil "~S is now traced." spec)))) - (traced-p (let* ((tosearch "is now traced.") - (start (- (length retval) - (length tosearch))) - (end (+ start (length tosearch)))) - (search tosearch (subseq retval start end)))) - (hook-msg (when *after-toggle-trace-hook* - (funcall *after-toggle-trace-hook* - spec - traced-p)))) - (if hook-msg - (format nil "~a~%(also ~a)" retval hook-msg) - retval))) - -(defslimefun untrace-all () - (untrace)) - - -;;;; Undefing - -(defslimefun undefine-function (fname-string) - (let ((fname (from-string fname-string))) - (format nil "~S" (fmakunbound fname)))) - -(defslimefun unintern-symbol (name package) - (let ((pkg (guess-package package))) - (cond ((not pkg) (format nil "No such package: ~s" package)) - (t - (multiple-value-bind (sym found) (parse-symbol name pkg) - (case found - ((nil) (format nil "~s not in package ~s" name package)) - (t - (unintern sym pkg) - (format nil "Uninterned symbol: ~s" sym)))))))) - -(defslimefun swank-delete-package (package-name) - (let ((pkg (or (guess-package package-name) - (error "No such package: ~s" package-name)))) - (delete-package pkg) - nil)) - - -;;;; Profiling - -(defun profiledp (fspec) - (member fspec (profiled-functions))) - -(defslimefun toggle-profile-fdefinition (fname-string) - (let ((fname (from-string fname-string))) - (cond ((profiledp fname) - (unprofile fname) - (format nil "~S is now unprofiled." fname)) - (t - (profile fname) - (format nil "~S is now profiled." fname))))) - -(defslimefun profile-by-substring (substring package) - (let ((count 0)) - (flet ((maybe-profile (symbol) - (when (and (fboundp symbol) - (not (profiledp symbol)) - (search substring (symbol-name symbol) :test #'equalp)) - (handler-case (progn - (profile symbol) - (incf count)) - (error (condition) - (warn "~a" condition)))))) - (if package - (do-symbols (symbol (parse-package package)) - (maybe-profile symbol)) - (do-all-symbols (symbol) - (maybe-profile symbol)))) - (format nil "~a function~:p ~:*~[are~;is~:;are~] now profiled" count))) - -(defslimefun swank-profile-package (package-name callersp methodsp) - (let ((pkg (or (guess-package package-name) - (error "Not a valid package name: ~s" package-name)))) - (check-type callersp boolean) - (check-type methodsp boolean) - (profile-package pkg callersp methodsp))) - - -;;;; Source Locations - -(defslimefun find-definition-for-thing (thing) - (find-source-location thing)) - -(defslimefun find-source-location-for-emacs (spec) - (find-source-location (value-spec-ref spec))) - -(defun value-spec-ref (spec) - (dcase spec - ((:string string package) - (with-buffer-syntax (package) - (eval (read-from-string string)))) - ((:inspector part) - (inspector-nth-part part)) - ((:sldb frame var) - (frame-var-value frame var)))) - -(defvar *find-definitions-right-trim* ",:.>") -(defvar *find-definitions-left-trim* "#:<") - -(defun find-definitions-find-symbol-or-package (name) - (flet ((do-find (name) - (multiple-value-bind (symbol found name) - (with-buffer-syntax () - (parse-symbol name)) - (cond (found - (return-from find-definitions-find-symbol-or-package - (values symbol found))) - ;; Packages are not named by symbols, so - ;; not-interned symbols can refer to packages - ((find-package name) - (return-from find-definitions-find-symbol-or-package - (values (make-symbol name) t))))))) - (do-find name) - (do-find (string-right-trim *find-definitions-right-trim* name)) - (do-find (string-left-trim *find-definitions-left-trim* name)) - (do-find (string-left-trim *find-definitions-left-trim* - (string-right-trim - *find-definitions-right-trim* name))) - ;; Not exactly robust - (when (and (eql (search "(setf " name :test #'char-equal) 0) - (char= (char name (1- (length name))) #\))) - (multiple-value-bind (symbol found) - (with-buffer-syntax () - (parse-symbol (subseq name (length "(setf ") - (1- (length name))))) - (when found - (values `(setf ,symbol) t)))))) - -(defslimefun find-definitions-for-emacs (name) - "Return a list ((DSPEC LOCATION) ...) of definitions for NAME. -DSPEC is a string and LOCATION a source location. NAME is a string." - (multiple-value-bind (symbol found) - (find-definitions-find-symbol-or-package name) - (when found - (mapcar #'xref>elisp (find-definitions symbol))))) - -;;; Generic function so contribs can extend it. -(defgeneric xref-doit (type thing) - (:method (type thing) - (declare (ignore type thing)) - :not-implemented)) - -(macrolet ((define-xref-action (xref-type handler) - `(defmethod xref-doit ((type (eql ,xref-type)) thing) - (declare (ignorable type)) - (funcall ,handler thing)))) - (define-xref-action :calls #'who-calls) - (define-xref-action :calls-who #'calls-who) - (define-xref-action :references #'who-references) - (define-xref-action :binds #'who-binds) - (define-xref-action :sets #'who-sets) - (define-xref-action :macroexpands #'who-macroexpands) - (define-xref-action :specializes #'who-specializes) - (define-xref-action :callers #'list-callers) - (define-xref-action :callees #'list-callees)) - -(defslimefun xref (type name) - (multiple-value-bind (sexp error) (ignore-errors (from-string name)) - (unless error - (let ((xrefs (xref-doit type sexp))) - (if (eq xrefs :not-implemented) - :not-implemented - (mapcar #'xref>elisp xrefs)))))) - -(defslimefun xrefs (types name) - (loop for type in types - for xrefs = (xref type name) - when (and (not (eq :not-implemented xrefs)) - (not (null xrefs))) - collect (cons type xrefs))) - -(defun xref>elisp (xref) - (destructuring-bind (name loc) xref - (list (to-string name) loc))) - - -;;;;; Lazy lists - -(defstruct (lcons (:constructor %lcons (car %cdr)) - (:predicate lcons?)) - car - (%cdr nil :type (or null lcons function)) - (forced? nil)) - -(defmacro lcons (car cdr) - `(%lcons ,car (lambda () ,cdr))) - -(defmacro lcons* (car cdr &rest more) - (cond ((null more) `(lcons ,car ,cdr)) - (t `(lcons ,car (lcons* ,cdr ,@more))))) - -(defun lcons-cdr (lcons) - (with-struct* (lcons- @ lcons) - (cond ((@ forced?) - (@ %cdr)) - (t - (let ((value (funcall (@ %cdr)))) - (setf (@ forced?) t - (@ %cdr) value)))))) - -(defun llist-range (llist start end) - (llist-take (llist-skip llist start) (- end start))) - -(defun llist-skip (lcons index) - (do ((i 0 (1+ i)) - (l lcons (lcons-cdr l))) - ((or (= i index) (null l)) - l))) - -(defun llist-take (lcons count) - (let ((result '())) - (do ((i 0 (1+ i)) - (l lcons (lcons-cdr l))) - ((or (= i count) - (null l))) - (push (lcons-car l) result)) - (nreverse result))) - -(defun iline (label value) - `(:line ,label ,value)) - - -;;;; Inspecting - -(defvar *inspector-verbose* nil) - -(defvar *inspector-printer-bindings* - '((*print-lines* . 1) - (*print-right-margin* . 75) - (*print-pretty* . t) - (*print-readably* . nil))) - -(defvar *inspector-verbose-printer-bindings* - '((*print-escape* . t) - (*print-circle* . t) - (*print-array* . nil))) - -(defstruct inspector-state) -(defstruct (istate (:conc-name istate.) (:include inspector-state)) - object - (verbose *inspector-verbose*) - (parts (make-array 10 :adjustable t :fill-pointer 0)) - (actions (make-array 10 :adjustable t :fill-pointer 0)) - metadata-plist - content - next previous) - -(defvar *istate* nil) -(defvar *inspector-history*) - -(defun reset-inspector () - (setq *istate* nil - *inspector-history* (make-array 10 :adjustable t :fill-pointer 0))) - -(defslimefun init-inspector (string) - (with-buffer-syntax () - (with-retry-restart (:msg "Retry SLIME inspection request.") - (reset-inspector) - (inspect-object (eval (read-from-string string)))))) - -(defun ensure-istate-metadata (o indicator default) - (with-struct (istate. object metadata-plist) *istate* - (assert (eq object o)) - (let ((data (getf metadata-plist indicator default))) - (setf (getf metadata-plist indicator) data) - data))) - -(defun inspect-object (o) - (let* ((prev *istate*) - (istate (make-istate :object o :previous prev - :verbose (cond (prev (istate.verbose prev)) - (t *inspector-verbose*))))) - (setq *istate* istate) - (setf (istate.content istate) (emacs-inspect/istate istate)) - (unless (find o *inspector-history*) - (vector-push-extend o *inspector-history*)) - (let ((previous (istate.previous istate))) - (if previous (setf (istate.next previous) istate))) - (istate>elisp istate))) - -(defun emacs-inspect/istate (istate) - (with-bindings (if (istate.verbose istate) - *inspector-verbose-printer-bindings* - *inspector-printer-bindings*) - (emacs-inspect (istate.object istate)))) - -(defun istate>elisp (istate) - (list :title (prepare-title istate) - :id (assign-index (istate.object istate) (istate.parts istate)) - :content (prepare-range istate 0 500))) - -(defun prepare-title (istate) - (if (istate.verbose istate) - (with-bindings *inspector-verbose-printer-bindings* - (to-string (istate.object istate))) - (with-string-stream (stream :length 200 - :bindings *inspector-printer-bindings*) - (print-unreadable-object - ((istate.object istate) stream :type t :identity t))))) - -(defun prepare-range (istate start end) - (let* ((range (content-range (istate.content istate) start end)) - (ps (loop for part in range append (prepare-part part istate)))) - (list ps - (if (< (length ps) (- end start)) - (+ start (length ps)) - (+ end 1000)) - start end))) - -(defun prepare-part (part istate) - (let ((newline '#.(string #\newline))) - (etypecase part - (string (list part)) - (cons (dcase part - ((:newline) (list newline)) - ((:value obj &optional str) - (list (value-part obj str (istate.parts istate)))) - ((:label &rest strs) - (list (list :label (apply #'cat (mapcar #'string strs))))) - ((:action label lambda &key (refreshp t)) - (list (action-part label lambda refreshp - (istate.actions istate)))) - ((:line label value) - (list (princ-to-string label) ": " - (value-part value nil (istate.parts istate)) - newline))))))) - -(defun value-part (object string parts) - (list :value - (or string (print-part-to-string object)) - (assign-index object parts))) - -(defun action-part (label lambda refreshp actions) - (list :action label (assign-index (list lambda refreshp) actions))) - -(defun assign-index (object vector) - (let ((index (fill-pointer vector))) - (vector-push-extend object vector) - index)) - -(defun print-part-to-string (value) - (let* ((*print-readably* nil) - (string (to-line value)) - (pos (position value *inspector-history*))) - (if pos - (format nil "@~D=~A" pos string) - string))) - -(defun content-range (list start end) - (typecase list - (list (let ((len (length list))) - (subseq list start (min len end)))) - (lcons (llist-range list start end)))) - -(defslimefun inspector-nth-part (index) - "Return the current inspector's INDEXth part. -The second value indicates if that part exists at all." - (let* ((parts (istate.parts *istate*)) - (foundp (< index (length parts)))) - (values (and foundp (aref parts index)) - foundp))) - -(defslimefun inspect-nth-part (index) - (with-buffer-syntax () - (inspect-object (inspector-nth-part index)))) - -(defslimefun inspector-range (from to) - (prepare-range *istate* from to)) - -(defslimefun inspector-call-nth-action (index &rest args) - (destructuring-bind (fun refreshp) (aref (istate.actions *istate*) index) - (apply fun args) - (if refreshp - (inspector-reinspect) - ;; tell emacs that we don't want to refresh the inspector buffer - nil))) - -(defslimefun inspector-pop () - "Inspect the previous object. -Return nil if there's no previous object." - (with-buffer-syntax () - (cond ((istate.previous *istate*) - (setq *istate* (istate.previous *istate*)) - (istate>elisp *istate*)) - (t nil)))) - -(defslimefun inspector-next () - "Inspect the next element in the history of inspected objects.." - (with-buffer-syntax () - (cond ((istate.next *istate*) - (setq *istate* (istate.next *istate*)) - (istate>elisp *istate*)) - (t nil)))) - -(defslimefun inspector-reinspect () - (let ((istate *istate*)) - (setf (istate.content istate) (emacs-inspect/istate istate)) - (istate>elisp istate))) - -(defslimefun inspector-toggle-verbose () - "Toggle verbosity of inspected object." - (setf (istate.verbose *istate*) (not (istate.verbose *istate*))) - (istate>elisp *istate*)) - -(defslimefun inspector-eval (string) - (let* ((obj (istate.object *istate*)) - (context (eval-context obj)) - (form (with-buffer-syntax ((cdr (assoc '*package* context))) - (read-from-string string))) - (ignorable (remove-if #'boundp (mapcar #'car context)))) - (to-string (eval `(let ((* ',obj) (- ',form) - . ,(loop for (var . val) in context - unless (constantp var) collect - `(,var ',val))) - (declare (ignorable . ,ignorable)) - ,form))))) - -(defslimefun inspector-history () - (with-output-to-string (out) - (let ((newest (loop for s = *istate* then next - for next = (istate.next s) - if (not next) return s))) - (format out "--- next/prev chain ---") - (loop for s = newest then (istate.previous s) while s do - (let ((val (istate.object s))) - (format out "~%~:[ ~; *~]@~d " - (eq s *istate*) - (position val *inspector-history*)) - (print-unreadable-object (val out :type t :identity t))))) - (format out "~%~%--- all visited objects ---") - (loop for val across *inspector-history* for i from 0 do - (format out "~%~2,' d " i) - (print-unreadable-object (val out :type t :identity t))))) - -(defslimefun quit-inspector () - (reset-inspector) - nil) - -(defslimefun describe-inspectee () - "Describe the currently inspected object." - (with-buffer-syntax () - (describe-to-string (istate.object *istate*)))) - -(defslimefun pprint-inspector-part (index) - "Pretty-print the currently inspected object." - (with-buffer-syntax () - (swank-pprint (list (inspector-nth-part index))))) - -(defslimefun inspect-in-frame (string index) - (with-buffer-syntax () - (with-retry-restart (:msg "Retry SLIME inspection request.") - (reset-inspector) - (inspect-object (eval-in-frame (from-string string) index))))) - -(defslimefun inspect-current-condition () - (with-buffer-syntax () - (reset-inspector) - (inspect-object *swank-debugger-condition*))) - -(defslimefun inspect-frame-var (frame var) - (with-buffer-syntax () - (reset-inspector) - (inspect-object (frame-var-value frame var)))) - -;;;;; Lists - -(defmethod emacs-inspect ((o cons)) - (if (listp (cdr o)) - (inspect-list o) - (inspect-cons o))) - -(defun inspect-cons (cons) - (label-value-line* - ('car (car cons)) - ('cdr (cdr cons)))) - -(defun inspect-list (list) - (multiple-value-bind (length tail) (safe-length list) - (flet ((frob (title list) - (list* title '(:newline) (inspect-list-aux list)))) - (cond ((not length) - (frob "A circular list:" - (cons (car list) - (ldiff (cdr list) list)))) - ((not tail) - (frob "A proper list:" list)) - (t - (frob "An improper list:" list)))))) - -(defun inspect-list-aux (list) - (loop for i from 0 for rest on list while (consp rest) append - (if (listp (cdr rest)) - (label-value-line i (car rest)) - (label-value-line* (i (car rest)) (:tail (cdr rest)))))) - -(defun safe-length (list) - "Similar to `list-length', but avoid errors on improper lists. -Return two values: the length of the list and the last cdr. -Return NIL if LIST is circular." - (do ((n 0 (+ n 2)) ;Counter. - (fast list (cddr fast)) ;Fast pointer: leaps by 2. - (slow list (cdr slow))) ;Slow pointer: leaps by 1. - (nil) - (cond ((null fast) (return (values n nil))) - ((not (consp fast)) (return (values n fast))) - ((null (cdr fast)) (return (values (1+ n) (cdr fast)))) - ((and (eq fast slow) (> n 0)) (return nil)) - ((not (consp (cdr fast))) (return (values (1+ n) (cdr fast))))))) - -;;;;; Hashtables - -(defun hash-table-to-alist (ht) - (let ((result '())) - (maphash (lambda (key value) - (setq result (acons key value result))) - ht) - result)) - -(defmethod emacs-inspect ((ht hash-table)) - (append - (label-value-line* - ("Count" (hash-table-count ht)) - ("Size" (hash-table-size ht)) - ("Test" (hash-table-test ht)) - ("Rehash size" (hash-table-rehash-size ht)) - ("Rehash threshold" (hash-table-rehash-threshold ht))) - (let ((weakness (hash-table-weakness ht))) - (when weakness - (label-value-line "Weakness:" weakness))) - (unless (zerop (hash-table-count ht)) - `((:action "[clear hashtable]" - ,(lambda () (clrhash ht))) (:newline) - "Contents: " (:newline))) - (let ((content (hash-table-to-alist ht))) - (cond ((every (lambda (x) (typep (first x) '(or string symbol))) content) - (setf content (sort content 'string< :key #'first))) - ((every (lambda (x) (typep (first x) 'real)) content) - (setf content (sort content '< :key #'first)))) - (loop for (key . value) in content appending - `((:value ,key) " = " (:value ,value) - " " (:action "[remove entry]" - ,(let ((key key)) - (lambda () (remhash key ht)))) - (:newline)))))) - -;;;;; Arrays - -(defmethod emacs-inspect ((array array)) - (lcons* - (iline "Dimensions" (array-dimensions array)) - (iline "Element type" (array-element-type array)) - (iline "Total size" (array-total-size array)) - (iline "Adjustable" (adjustable-array-p array)) - (iline "Fill pointer" (if (array-has-fill-pointer-p array) - (fill-pointer array))) - "Contents:" '(:newline) - (labels ((k (i max) - (cond ((= i max) '()) - (t (lcons (iline i (row-major-aref array i)) - (k (1+ i) max)))))) - (k 0 (array-total-size array))))) - -;;;;; Chars - -(defmethod emacs-inspect ((char character)) - (append - (label-value-line* - ("Char code" (char-code char)) - ("Lower cased" (char-downcase char)) - ("Upper cased" (char-upcase char))) - (if (get-macro-character char) - `("In the current readtable (" - (:value ,*readtable*) ") it is a macro character: " - (:value ,(get-macro-character char)))))) - -;;;; Thread listing - -(defvar *thread-list* () - "List of threads displayed in Emacs. We don't care a about -synchronization issues (yet). There can only be one thread listing at -a time.") - -(defslimefun list-threads () - "Return a list (LABELS (ID NAME STATUS ATTRS ...) ...). -LABELS is a list of attribute names and the remaining lists are the -corresponding attribute values per thread. -Example: - ((:id :name :status :priority) - (6 \"swank-indentation-cache-thread\" \"Semaphore timed wait\" 0) - (5 \"reader-thread\" \"Active\" 0) - (4 \"control-thread\" \"Semaphore timed wait\" 0) - (2 \"Swank Sentinel\" \"Semaphore timed wait\" 0) - (1 \"listener\" \"Active\" 0) - (0 \"Initial\" \"Sleep\" 0))" - (setq *thread-list* (all-threads)) - (when (and *emacs-connection* - (use-threads-p) - (equalp (thread-name (current-thread)) "worker")) - (setf *thread-list* (delete (current-thread) *thread-list*))) - (let* ((plist (thread-attributes (car *thread-list*))) - (labels (loop for (key) on plist by #'cddr - collect key))) - `((:id :name :status ,@labels) - ,@(loop for thread in *thread-list* - for name = (thread-name thread) - for attributes = (thread-attributes thread) - collect (list* (thread-id thread) - (string name) - (thread-status thread) - (loop for label in labels - collect (getf attributes label))))))) - -(defslimefun quit-thread-browser () - (setq *thread-list* nil)) - -(defun nth-thread (index) - (nth index *thread-list*)) - -(defslimefun debug-nth-thread (index) - (let ((connection *emacs-connection*)) - (queue-thread-interrupt - (nth-thread index) - (lambda () - (with-connection (connection) - (simple-break)))))) - -(defslimefun kill-nth-thread (index) - (kill-thread (nth-thread index))) - -(defslimefun start-swank-server-in-thread (index port-file-name) - "Interrupt the INDEXth thread and make it start a swank server. -The server port is written to PORT-FILE-NAME." - (interrupt-thread (nth-thread index) - (lambda () - (start-server port-file-name :style nil)))) - -;;;; Class browser - -(defun mop-helper (class-name fn) - (let ((class (find-class class-name nil))) - (if class - (mapcar (lambda (x) (to-string (class-name x))) - (funcall fn class))))) - -(defslimefun mop (type symbol-name) - "Return info about classes using mop. - - When type is: - :subclasses - return the list of subclasses of class. - :superclasses - return the list of superclasses of class." - (let ((symbol (parse-symbol symbol-name *buffer-package*))) - (ecase type - (:subclasses - (mop-helper symbol #'swank-mop:class-direct-subclasses)) - (:superclasses - (mop-helper symbol #'swank-mop:class-direct-superclasses))))) - - -;;;; Automatically synchronized state -;;; -;;; Here we add hooks to push updates of relevant information to -;;; Emacs. - -;;;;; *FEATURES* - -(defun sync-features-to-emacs () - "Update Emacs if any relevant Lisp state has changed." - ;; FIXME: *slime-features* should be connection-local - (unless (eq *slime-features* *features*) - (setq *slime-features* *features*) - (send-to-emacs (list :new-features (features-for-emacs))))) - -(defun features-for-emacs () - "Return `*slime-features*' in a format suitable to send it to Emacs." - *slime-features*) - -(add-hook *pre-reply-hook* 'sync-features-to-emacs) - - -;;;;; Indentation of macros -;;; -;;; This code decides how macros should be indented (based on their -;;; arglists) and tells Emacs. A per-connection cache is used to avoid -;;; sending redundant information to Emacs -- we just say what's -;;; changed since last time. -;;; -;;; The strategy is to scan all symbols, pick out the macros, and look -;;; for &body-arguments. - -(defvar *configure-emacs-indentation* t - "When true, automatically send indentation information to Emacs -after each command.") - -(defslimefun update-indentation-information () - (send-to-indentation-cache `(:update-indentation-information)) - nil) - -;; This function is for *PRE-REPLY-HOOK*. -(defun sync-indentation-to-emacs () - "Send any indentation updates to Emacs via CONNECTION." - (when *configure-emacs-indentation* - (send-to-indentation-cache `(:sync-indentation ,*buffer-package*)))) - -;; Send REQUEST to the cache. If we are single threaded perform the -;; request right away, otherwise delegate the request to the -;; indentation-cache-thread. -(defun send-to-indentation-cache (request) - (let ((c *emacs-connection*)) - (etypecase c - (singlethreaded-connection - (handle-indentation-cache-request c request)) - (multithreaded-connection - (without-slime-interrupts - (send (mconn.indentation-cache-thread c) request)))))) - -(defun indentation-cache-loop (connection) - (with-connection (connection) - (loop - (restart-case - (handle-indentation-cache-request connection (receive)) - (abort () - :report "Return to the indentation cache request handling loop."))))) - -(defun handle-indentation-cache-request (connection request) - (dcase request - ((:sync-indentation package) - (let ((fullp (need-full-indentation-update-p connection))) - (perform-indentation-update connection fullp package))) - ((:update-indentation-information) - (perform-indentation-update connection t nil)))) - -(defun need-full-indentation-update-p (connection) - "Return true if the whole indentation cache should be updated. -This is a heuristic to avoid scanning all symbols all the time: -instead, we only do a full scan if the set of packages has changed." - (set-difference (list-all-packages) - (connection.indentation-cache-packages connection))) - -(defun perform-indentation-update (connection force package) - "Update the indentation cache in CONNECTION and update Emacs. -If FORCE is true then start again without considering the old cache." - (let ((cache (connection.indentation-cache connection))) - (when force (clrhash cache)) - (let ((delta (update-indentation/delta-for-emacs cache force package))) - (setf (connection.indentation-cache-packages connection) - (list-all-packages)) - (unless (null delta) - (setf (connection.indentation-cache connection) cache) - (send-to-emacs (list :indentation-update delta)))))) - -(defun update-indentation/delta-for-emacs (cache force package) - "Update the cache and return the changes in a (SYMBOL INDENT PACKAGES) list. -If FORCE is true then check all symbols, otherwise only check symbols -belonging to PACKAGE." - (let ((alist '())) - (flet ((consider (symbol) - (let ((indent (symbol-indentation symbol))) - (when indent - (unless (equal (gethash symbol cache) indent) - (setf (gethash symbol cache) indent) - (let ((pkgs (mapcar #'package-name - (symbol-packages symbol))) - (name (string-downcase symbol))) - (push (list name indent pkgs) alist))))))) - (cond (force - (do-all-symbols (symbol) - (consider symbol))) - ((package-name package) ; don't try to iterate over a - ; deleted package. - (do-symbols (symbol package) - (when (eq (symbol-package symbol) package) - (consider symbol))))) - alist))) - -(defun package-names (package) - "Return the name and all nicknames of PACKAGE in a fresh list." - (cons (package-name package) (copy-list (package-nicknames package)))) - -(defun symbol-packages (symbol) - "Return the packages where SYMBOL can be found." - (let ((string (string symbol))) - (loop for p in (list-all-packages) - when (eq symbol (find-symbol string p)) - collect p))) - -(defun cl-symbol-p (symbol) - "Is SYMBOL a symbol in the COMMON-LISP package?" - (eq (symbol-package symbol) cl-package)) - -(defun known-to-emacs-p (symbol) - "Return true if Emacs has special rules for indenting SYMBOL." - (cl-symbol-p symbol)) - -(defun symbol-indentation (symbol) - "Return a form describing the indentation of SYMBOL. -The form is to be used as the `common-lisp-indent-function' property -in Emacs." - (if (and (macro-function symbol) - (not (known-to-emacs-p symbol))) - (let ((arglist (arglist symbol))) - (etypecase arglist - ((member :not-available) - nil) - (list - (macro-indentation arglist)))) - nil)) - -(defun macro-indentation (arglist) - (if (well-formed-list-p arglist) - (position '&body (remove '&optional (clean-arglist arglist))) - nil)) - -(defun clean-arglist (arglist) - "Remove &whole, &enviroment, and &aux elements from ARGLIST." - (cond ((null arglist) '()) - ((member (car arglist) '(&whole &environment)) - (clean-arglist (cddr arglist))) - ((eq (car arglist) '&aux) - '()) - (t (cons (car arglist) (clean-arglist (cdr arglist)))))) - -(defun well-formed-list-p (list) - "Is LIST a proper list terminated by NIL?" - (typecase list - (null t) - (cons (well-formed-list-p (cdr list))) - (t nil))) - -(defun print-indentation-lossage (&optional (stream *standard-output*)) - "Return the list of symbols whose indentation styles collide incompatibly. -Collisions are caused because package information is ignored." - (let ((table (make-hash-table :test 'equal))) - (flet ((name (s) (string-downcase (symbol-name s)))) - (do-all-symbols (s) - (setf (gethash (name s) table) - (cons s (symbol-indentation s)))) - (let ((collisions '())) - (do-all-symbols (s) - (let* ((entry (gethash (name s) table)) - (owner (car entry)) - (indent (cdr entry))) - (unless (or (eq s owner) - (equal (symbol-indentation s) indent) - (and (not (fboundp s)) - (null (macro-function s)))) - (pushnew owner collisions) - (pushnew s collisions)))) - (if (null collisions) - (format stream "~&No worries!~%") - (format stream "~&Symbols with collisions:~%~{ ~S~%~}" - collisions)))))) - -;;; FIXME: it's too slow on CLASP right now, remove once it's fast enough. -#-clasp -(add-hook *pre-reply-hook* 'sync-indentation-to-emacs) - -(defun make-output-function-for-target (connection target) - "Create a function to send user output to a specific TARGET in Emacs." - (lambda (string) - (swank::with-connection (connection) - (with-simple-restart - (abort "Abort sending output to Emacs.") - (swank::send-to-emacs `(:write-string ,string ,target)))))) - -(defun make-output-stream-for-target (connection target) - "Create a stream that sends output to a specific TARGET in Emacs." - (make-output-stream (make-output-function-for-target connection target))) - - -;;;; Testing - -(defslimefun io-speed-test (&optional (n 1000) (m 1)) - (let* ((s *standard-output*) - (*trace-output* (make-broadcast-stream s *log-output*))) - (time (progn - (dotimes (i n) - (format s "~D abcdefghijklm~%" i) - (when (zerop (mod n m)) - (finish-output s))) - (finish-output s) - (when *emacs-connection* - (eval-in-emacs '(message "done."))))) - (terpri *trace-output*) - (finish-output *trace-output*) - nil)) - -(defslimefun flow-control-test (n delay) - (let ((stream (make-output-stream - (let ((conn *emacs-connection*)) - (lambda (string) - (declare (ignore string)) - (with-connection (conn) - (send-to-emacs `(:test-delay ,delay)))))))) - (dotimes (i n) - (print i stream) - (force-output stream) - (background-message "flow-control-test: ~d" i)))) - - -(defun before-init (version load-path) - (pushnew :swank *features*) - (setq *swank-wire-protocol-version* version) - (setq *load-path* load-path)) - -(defun init () - (run-hook *after-init-hook*)) - -;; Local Variables: -;; coding: latin-1-unix -;; indent-tabs-mode: nil -;; outline-regexp: ";;;;;*" -;; End: - -;;; swank.lisp ends here diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/abcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/abcl.lisp deleted file mode 100644 index f5764d6..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/abcl.lisp +++ /dev/null @@ -1,847 +0,0 @@ -;;;; -*- indent-tabs-mode: nil; outline-regexp: ";;;;;*"; -*- -;;; -;;; swank-abcl.lisp --- Armedbear CL specific code for SLIME. -;;; -;;; Adapted from swank-acl.lisp, Andras Simon, 2004 -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -(defpackage swank/abcl - (:use cl swank/backend)) - -(in-package swank/abcl) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (require :collect) ;just so that it doesn't spoil the flying letters - (require :pprint) - (require :gray-streams) - (assert (>= (read-from-string (subseq (lisp-implementation-version) 0 4)) - 0.22) - () "This file needs ABCL version 0.22 or newer")) - -(defimplementation gray-package-name () - "GRAY-STREAMS") - -;; FIXME: switch to shared Gray stream implementation when bugs are -;; fixed in ABCL. See: http://abcl.org/trac/ticket/373. -(progn - (defimplementation make-output-stream (write-string) - (ext:make-slime-output-stream write-string)) - - (defimplementation make-input-stream (read-string) - (ext:make-slime-input-stream read-string - (make-synonym-stream '*standard-output*)))) - -(defimplementation call-with-compilation-hooks (function) - (funcall function)) - -;;; swank-mop - -;;dummies and definition - -(defclass standard-slot-definition ()()) - -;(defun class-finalized-p (class) t) - -(defun slot-definition-documentation (slot) - (declare (ignore slot)) - #+nil (documentation slot 't)) - -(defun slot-definition-type (slot) - (declare (ignore slot)) - t) - -(defun class-prototype (class) - (declare (ignore class)) - nil) - -(defun generic-function-declarations (gf) - (declare (ignore gf)) - nil) - -(defun specializer-direct-methods (spec) - (mop:class-direct-methods spec)) - -(defun slot-definition-name (slot) - (mop:slot-definition-name slot)) - -(defun class-slots (class) - (mop:class-slots class)) - -(defun method-generic-function (method) - (mop:method-generic-function method)) - -(defun method-function (method) - (mop:method-function method)) - -(defun slot-boundp-using-class (class object slotdef) - (declare (ignore class)) - (system::slot-boundp object (slot-definition-name slotdef))) - -(defun slot-value-using-class (class object slotdef) - (declare (ignore class)) - (system::slot-value object (slot-definition-name slotdef))) - -(import-to-swank-mop - '( ;; classes - cl:standard-generic-function - standard-slot-definition ;;dummy - cl:method - cl:standard-class - #+#.(swank/backend:with-symbol 'compute-applicable-methods-using-classes - 'mop) - mop:compute-applicable-methods-using-classes - ;; standard-class readers - mop:class-default-initargs - mop:class-direct-default-initargs - mop:class-direct-slots - mop:class-direct-subclasses - mop:class-direct-superclasses - mop:eql-specializer - mop:class-finalized-p - mop:finalize-inheritance - cl:class-name - mop:class-precedence-list - class-prototype ;;dummy - class-slots - specializer-direct-methods - ;; eql-specializer accessors - mop::eql-specializer-object - ;; generic function readers - mop:generic-function-argument-precedence-order - generic-function-declarations ;;dummy - mop:generic-function-lambda-list - mop:generic-function-methods - mop:generic-function-method-class - mop:generic-function-method-combination - mop:generic-function-name - ;; method readers - method-generic-function - method-function - mop:method-lambda-list - mop:method-specializers - mop:method-qualifiers - ;; slot readers - mop:slot-definition-allocation - slot-definition-documentation ;;dummy - mop:slot-definition-initargs - mop:slot-definition-initform - mop:slot-definition-initfunction - slot-definition-name - slot-definition-type ;;dummy - mop:slot-definition-readers - mop:slot-definition-writers - slot-boundp-using-class - slot-value-using-class - mop:slot-makunbound-using-class)) - -;;;; TCP Server - - -(defimplementation preferred-communication-style () - :spawn) - -(defimplementation create-socket (host port &key backlog) - (ext:make-server-socket port)) - -(defimplementation local-port (socket) - (java:jcall (java:jmethod "java.net.ServerSocket" "getLocalPort") socket)) - -(defimplementation close-socket (socket) - (ext:server-socket-close socket)) - -(defimplementation accept-connection (socket - &key external-format buffering timeout) - (declare (ignore buffering timeout)) - (ext:get-socket-stream (ext:socket-accept socket) - :element-type (if external-format - 'character - '(unsigned-byte 8)) - :external-format (or external-format :default))) - -;;;; UTF8 - -;; faster please! -(defimplementation string-to-utf8 (s) - (jbytes-to-octets - (java:jcall - (java:jmethod "java.lang.String" "getBytes" "java.lang.String") - s - "UTF8"))) - -(defimplementation utf8-to-string (u) - (java:jnew - (java:jconstructor "org.armedbear.lisp.SimpleString" - "java.lang.String") - (java:jnew (java:jconstructor "java.lang.String" "[B" "java.lang.String") - (octets-to-jbytes u) - "UTF8"))) - -(defun octets-to-jbytes (octets) - (declare (type octets (simple-array (unsigned-byte 8) (*)))) - (let* ((len (length octets)) - (bytes (java:jnew-array "byte" len))) - (loop for byte across octets - for i from 0 - do (java:jstatic (java:jmethod "java.lang.reflect.Array" "setByte" - "java.lang.Object" "int" "byte") - "java.lang.relect.Array" - bytes i byte)) - bytes)) - -(defun jbytes-to-octets (jbytes) - (let* ((len (java:jarray-length jbytes)) - (octets (make-array len :element-type '(unsigned-byte 8)))) - (loop for i from 0 below len - for jbyte = (java:jarray-ref jbytes i) - do (setf (aref octets i) jbyte)) - octets)) - -;;;; External formats - -(defvar *external-format-to-coding-system* - '((:iso-8859-1 "latin-1" "iso-latin-1" "iso-8859-1") - ((:iso-8859-1 :eol-style :lf) - "latin-1-unix" "iso-latin-1-unix" "iso-8859-1-unix") - (:utf-8 "utf-8") - ((:utf-8 :eol-style :lf) "utf-8-unix") - (:euc-jp "euc-jp") - ((:euc-jp :eol-style :lf) "euc-jp-unix") - (:us-ascii "us-ascii") - ((:us-ascii :eol-style :lf) "us-ascii-unix"))) - -(defimplementation find-external-format (coding-system) - (car (rassoc-if (lambda (x) - (member coding-system x :test #'equal)) - *external-format-to-coding-system*))) - -;;;; Unix signals - -(defimplementation getpid () - (handler-case - (let* ((runtime - (java:jstatic "getRuntime" "java.lang.Runtime")) - (command - (java:jnew-array-from-array - "java.lang.String" #("sh" "-c" "echo $PPID"))) - (runtime-exec-jmethod - ;; Complicated because java.lang.Runtime.exec() is - ;; overloaded on a non-primitive type (array of - ;; java.lang.String), so we have to use the actual - ;; parameter instance to get java.lang.Class - (java:jmethod "java.lang.Runtime" "exec" - (java:jcall - (java:jmethod "java.lang.Object" "getClass") - command))) - (process - (java:jcall runtime-exec-jmethod runtime command)) - (output - (java:jcall (java:jmethod "java.lang.Process" "getInputStream") - process))) - (java:jcall (java:jmethod "java.lang.Process" "waitFor") - process) - (loop :with b :do - (setq b - (java:jcall (java:jmethod "java.io.InputStream" "read") - output)) - :until (member b '(-1 #x0a)) ; Either EOF or LF - :collecting (code-char b) :into result - :finally (return - (parse-integer (coerce result 'string))))) - (t () 0))) - -(defimplementation lisp-implementation-type-name () - "armedbear") - -(defimplementation set-default-directory (directory) - (let ((dir (sys::probe-directory directory))) - (when dir (setf *default-pathname-defaults* dir)) - (namestring dir))) - - -;;;; Misc - -(defimplementation arglist (fun) - (cond ((symbolp fun) - (multiple-value-bind (arglist present) - (sys::arglist fun) - (when (and (not present) - (fboundp fun) - (typep (symbol-function fun) - 'standard-generic-function)) - (setq arglist - (mop::generic-function-lambda-list (symbol-function fun)) - present - t)) - (if present arglist :not-available))) - (t :not-available))) - -(defimplementation function-name (function) - (nth-value 2 (function-lambda-expression function))) - -(defimplementation macroexpand-all (form &optional env) - (ext:macroexpand-all form env)) - -(defimplementation collect-macro-forms (form &optional env) - ;; Currently detects only normal macros, not compiler macros. - (declare (ignore env)) - (with-collected-macro-forms (macro-forms) - (handler-bind ((warning #'muffle-warning)) - (ignore-errors - (compile nil `(lambda () ,(macroexpand-all form env))))) - (values macro-forms nil))) - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (flet ((doc (kind &optional (sym symbol)) - (or (documentation sym kind) :not-documented)) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push - :variable (when (boundp symbol) - (doc 'variable))) - (when (fboundp symbol) - (maybe-push - (cond ((macro-function symbol) :macro) - ((special-operator-p symbol) :special-operator) - ((typep (fdefinition symbol) 'generic-function) - :generic-function) - (t :function)) - (doc 'function))) - (maybe-push - :class (if (find-class symbol nil) - (doc 'class))) - result))) - -(defimplementation describe-definition (symbol namespace) - (ecase namespace - ((:variable :macro) - (describe symbol)) - ((:function :generic-function) - (describe (symbol-function symbol))) - (:class - (describe (find-class symbol))))) - -(defimplementation describe-definition (symbol namespace) - (ecase namespace - (:variable - (describe symbol)) - ((:function :generic-function) - (describe (symbol-function symbol))) - (:class - (describe (find-class symbol))))) - - -;;;; Debugger - -;; Copied from swank-sbcl.lisp. -;; -;; Notice that *INVOKE-DEBUGGER-HOOK* is tried before *DEBUGGER-HOOK*, -;; so we have to make sure that the latter gets run when it was -;; established locally by a user (i.e. changed meanwhile.) -(defun make-invoke-debugger-hook (hook) - (lambda (condition old-hook) - (if *debugger-hook* - (funcall *debugger-hook* condition old-hook) - (funcall hook condition old-hook)))) - -(defimplementation call-with-debugger-hook (hook fun) - (let ((*debugger-hook* hook) - (sys::*invoke-debugger-hook* (make-invoke-debugger-hook hook))) - (funcall fun))) - -(defimplementation install-debugger-globally (function) - (setq *debugger-hook* function) - (setq sys::*invoke-debugger-hook* (make-invoke-debugger-hook function))) - -(defvar *sldb-topframe*) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (let* ((magic-token (intern "SWANK-DEBUGGER-HOOK" 'swank)) - (*sldb-topframe* - (second (member magic-token (sys:backtrace) - :key (lambda (frame) - (first (sys:frame-to-list frame))))))) - (funcall debugger-loop-fn))) - -(defun backtrace (start end) - "A backtrace without initial SWANK frames." - (let ((backtrace (sys:backtrace))) - (subseq (or (member *sldb-topframe* backtrace) backtrace) - start end))) - -(defun nth-frame (index) - (nth index (backtrace 0 nil))) - -(defimplementation compute-backtrace (start end) - (let ((end (or end most-positive-fixnum))) - (backtrace start end))) - -(defimplementation print-frame (frame stream) - (write-string (sys:frame-to-string frame) - stream)) - -;;; Sorry, but can't seem to declare DEFIMPLEMENTATION under FLET. -;;; --ME 20150403 -(defun nth-frame-list (index) - (java:jcall "toLispList" (nth-frame index))) - -(defun match-lambda (operator values) - (jvm::match-lambda-list - (multiple-value-list - (jvm::parse-lambda-list (ext:arglist operator))) - values)) - -(defimplementation frame-locals (index) - (loop - :for id :upfrom 0 - :with frame = (nth-frame-list index) - :with operator = (first frame) - :with values = (rest frame) - :with arglist = (if (and operator (consp values) (not (null values))) - (handler-case - (match-lambda operator values) - (jvm::lambda-list-mismatch (e) - :lambda-list-mismatch)) - :not-available) - :for value :in values - :collecting (list - :name (if (not (keywordp arglist)) - (first (nth id arglist)) - (format nil "arg~A" id)) - :id id - :value value))) - -(defimplementation frame-var-value (index id) - (elt (rest (java:jcall "toLispList" (nth-frame index))) id)) - - -#+nil -(defimplementation disassemble-frame (index) - (disassemble (debugger:frame-function (nth-frame index)))) - -(defimplementation frame-source-location (index) - (let ((frame (nth-frame index))) - (or (source-location (nth-frame index)) - `(:error ,(format nil "No source for frame: ~a" frame))))) - -#+nil -(defimplementation eval-in-frame (form frame-number) - (debugger:eval-form-in-context - form - (debugger:environment-of-frame (nth-frame frame-number)))) - -#+nil -(defimplementation return-from-frame (frame-number form) - (let ((frame (nth-frame frame-number))) - (multiple-value-call #'debugger:frame-return - frame (debugger:eval-form-in-context - form - (debugger:environment-of-frame frame))))) - -;;; XXX doesn't work for frames with arguments -#+nil -(defimplementation restart-frame (frame-number) - (let ((frame (nth-frame frame-number))) - (debugger:frame-retry frame (debugger:frame-function frame)))) - -;;;; Compiler hooks - -(defvar *buffer-name* nil) -(defvar *buffer-start-position*) -(defvar *buffer-string*) -(defvar *compile-filename*) - -(defvar *abcl-signaled-conditions*) - -(defun handle-compiler-warning (condition) - (let ((loc (when (and jvm::*compile-file-pathname* - system::*source-position*) - (cons jvm::*compile-file-pathname* system::*source-position*)))) - ;; filter condition signaled more than once. - (unless (member condition *abcl-signaled-conditions*) - (push condition *abcl-signaled-conditions*) - (signal 'compiler-condition - :original-condition condition - :severity :warning - :message (format nil "~A" condition) - :location (cond (*buffer-name* - (make-location - (list :buffer *buffer-name*) - (list :offset *buffer-start-position* 0))) - (loc - (destructuring-bind (file . pos) loc - (make-location - (list :file (namestring (truename file))) - (list :position (1+ pos))))) - (t - (make-location - (list :file (namestring *compile-filename*)) - (list :position 1)))))))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore external-format policy)) - (let ((jvm::*resignal-compiler-warnings* t) - (*abcl-signaled-conditions* nil)) - (handler-bind ((warning #'handle-compiler-warning)) - (let ((*buffer-name* nil) - (*compile-filename* input-file)) - (multiple-value-bind (fn warn fail) - (compile-file input-file :output-file output-file) - (values fn warn - (and fn load-p - (not (load fn))))))))) - -(defimplementation swank-compile-string (string &key buffer position filename - policy) - (declare (ignore filename policy)) - (let ((jvm::*resignal-compiler-warnings* t) - (*abcl-signaled-conditions* nil)) - (handler-bind ((warning #'handle-compiler-warning)) - (let ((*buffer-name* buffer) - (*buffer-start-position* position) - (*buffer-string* string) - (sys::*source* (make-pathname :device "emacs-buffer" :name buffer)) - (sys::*source-position* position)) - (funcall (compile nil (read-from-string - (format nil "(~S () ~A)" 'lambda string)))) - t)))) - -#| -;;;; Definition Finding - -(defun find-fspec-location (fspec type) - (let ((file (excl::fspec-pathname fspec type))) - (etypecase file - (pathname - (let ((start (scm:find-definition-in-file fspec type file))) - (make-location (list :file (namestring (truename file))) - (if start - (list :position (1+ start)) - (list :function-name (string fspec)))))) - ((member :top-level) - (list :error (format nil "Defined at toplevel: ~A" fspec))) - (null - (list :error (format nil "Unkown source location for ~A" fspec)))))) - -(defun fspec-definition-locations (fspec) - (let ((defs (excl::find-multiple-definitions fspec))) - (loop for (fspec type) in defs - collect (list fspec (find-fspec-location fspec type))))) - -(defimplementation find-definitions (symbol) - (fspec-definition-locations symbol)) -|# - -(defgeneric source-location (object)) - -(defmethod source-location ((symbol symbol)) - (when (pathnamep (ext:source-pathname symbol)) - (let ((pos (ext:source-file-position symbol)) - (path (namestring (ext:source-pathname symbol)))) - (cond ((ext:pathname-jar-p path) - `(:location - ;; strip off "jar:file:" = 9 characters - (:zip ,@(split-string (subseq path 9) "!/")) - ;; pos never seems right. Use function name. - (:function-name ,(string symbol)) - (:align t))) - ((equal (pathname-device (ext:source-pathname symbol)) "emacs-buffer") - ;; conspire with swank-compile-string to keep the buffer - ;; name in a pathname whose device is "emacs-buffer". - `(:location - (:buffer ,(pathname-name (ext:source-pathname symbol))) - (:function-name ,(string symbol)) - (:align t))) - (t - `(:location - (:file ,path) - ,(if pos - (list :position (1+ pos)) - (list :function-name (string symbol))) - (:align t))))))) - -(defmethod source-location ((frame sys::java-stack-frame)) - (destructuring-bind (&key class method file line) (sys:frame-to-list frame) - (declare (ignore method)) - (let ((file (or (find-file-in-path file *source-path*) - (let ((f (format nil "~{~a/~}~a" - (butlast (split-string class "\\.")) - file))) - (find-file-in-path f *source-path*))))) - (and file - `(:location ,file (:line ,line) ()))))) - -(defmethod source-location ((frame sys::lisp-stack-frame)) - (destructuring-bind (operator &rest args) (sys:frame-to-list frame) - (declare (ignore args)) - (etypecase operator - (function (source-location operator)) - (list nil) - (symbol (source-location operator))))) - -(defmethod source-location ((fun function)) - (let ((name (function-name fun))) - (and name (source-location name)))) - -(defun system-property (name) - (java:jstatic "getProperty" "java.lang.System" name)) - -(defun pathname-parent (pathname) - (make-pathname :directory (butlast (pathname-directory pathname)))) - -(defun pathname-absolute-p (pathname) - (eq (car (pathname-directory pathname)) ':absolute)) - -(defun split-string (string regexp) - (coerce - (java:jcall (java:jmethod "java.lang.String" "split" "java.lang.String") - string regexp) - 'list)) - -(defun path-separator () - (java:jfield "java.io.File" "pathSeparator")) - -(defun search-path-property (prop-name) - (let ((string (system-property prop-name))) - (and string - (remove nil - (mapcar #'truename - (split-string string (path-separator))))))) - -(defun jdk-source-path () - (let* ((jre-home (truename (system-property "java.home"))) - (src-zip (merge-pathnames "src.zip" (pathname-parent jre-home))) - (truename (probe-file src-zip))) - (and truename (list truename)))) - -(defun class-path () - (append (search-path-property "java.class.path") - (search-path-property "sun.boot.class.path"))) - -(defvar *source-path* - (append (search-path-property "user.dir") - (jdk-source-path) - ;;(list (truename "/scratch/abcl/src")) - ) - "List of directories to search for source files.") - -(defun zipfile-contains-p (zipfile-name entry-name) - (let ((zipfile (java:jnew (java:jconstructor "java.util.zip.ZipFile" - "java.lang.String") - zipfile-name))) - (java:jcall - (java:jmethod "java.util.zip.ZipFile" "getEntry" "java.lang.String") - zipfile entry-name))) - -;; (find-file-in-path "java/lang/String.java" *source-path*) -;; (find-file-in-path "Lisp.java" *source-path*) - -;; Try to find FILENAME in PATH. If found, return a file spec as -;; needed by Emacs. We also look in zip files. -(defun find-file-in-path (filename path) - (labels ((try (dir) - (cond ((not (pathname-type dir)) - (let ((f (probe-file (merge-pathnames filename dir)))) - (and f `(:file ,(namestring f))))) - ((equal (pathname-type dir) "zip") - (try-zip dir)) - (t (error "strange path element: ~s" path)))) - (try-zip (zip) - (let* ((zipfile-name (namestring (truename zip)))) - (and (zipfile-contains-p zipfile-name filename) - `(:dir ,zipfile-name ,filename))))) - (cond ((pathname-absolute-p filename) (probe-file filename)) - (t - (loop for dir in path - if (try dir) return it))))) - -(defimplementation find-definitions (symbol) - (ext:resolve symbol) - (let ((srcloc (source-location symbol))) - (and srcloc `((,symbol ,srcloc))))) - -#| -Uncomment this if you have patched xref.lisp, as in -http://article.gmane.org/gmane.lisp.slime.devel/2425 -Also, make sure that xref.lisp is loaded by modifying the armedbear -part of *sysdep-pathnames* in swank.loader.lisp. - -;;;; XREF -(setq pxref:*handle-package-forms* '(cl:in-package)) - -(defmacro defxref (name function) - `(defimplementation ,name (name) - (xref-results (,function name)))) - -(defxref who-calls pxref:list-callers) -(defxref who-references pxref:list-readers) -(defxref who-binds pxref:list-setters) -(defxref who-sets pxref:list-setters) -(defxref list-callers pxref:list-callers) -(defxref list-callees pxref:list-callees) - -(defun xref-results (symbols) - (let ((xrefs '())) - (dolist (symbol symbols) - (push (list symbol (cadar (source-location symbol))) xrefs)) - xrefs)) -|# - -;;;; Inspecting -(defmethod emacs-inspect ((o t)) - (let ((parts (sys:inspected-parts o))) - `("The object is of type " ,(symbol-name (type-of o)) "." (:newline) - ,@(if parts - (loop :for (label . value) :in parts - :appending (label-value-line label value)) - (list "No inspectable parts, dumping output of CL:DESCRIBE:" - '(:newline) - (with-output-to-string (desc) (describe o desc))))))) - -(defmethod emacs-inspect ((slot mop::slot-definition)) - `("Name: " - (:value ,(mop:slot-definition-name slot)) - (:newline) - "Documentation:" (:newline) - ,@(when (slot-definition-documentation slot) - `((:value ,(slot-definition-documentation slot)) (:newline))) - "Initialization:" (:newline) - " Args: " (:value ,(mop:slot-definition-initargs slot)) (:newline) - " Form: " ,(if (mop:slot-definition-initfunction slot) - `(:value ,(mop:slot-definition-initform slot)) - "#") (:newline) - " Function: " - (:value ,(mop:slot-definition-initfunction slot)) - (:newline))) - -(defmethod emacs-inspect ((f function)) - `(,@(when (function-name f) - `("Name: " - ,(princ-to-string (function-name f)) (:newline))) - ,@(multiple-value-bind (args present) - (sys::arglist f) - (when present - `("Argument list: " - ,(princ-to-string args) (:newline)))) - (:newline) - #+nil,@(when (documentation f t) - `("Documentation:" (:newline) - ,(documentation f t) (:newline))) - ,@(when (function-lambda-expression f) - `("Lambda expression:" - (:newline) ,(princ-to-string - (function-lambda-expression f)) (:newline))))) - -;;; Although by convention toString() is supposed to be a -;;; non-computationally expensive operation this isn't always the -;;; case, so make its computation a user interaction. -(defparameter *to-string-hashtable* (make-hash-table)) -(defmethod emacs-inspect ((o java:java-object)) - (let ((to-string (lambda () - (handler-case - (setf (gethash o *to-string-hashtable*) - (java:jcall "toString" o)) - (t (e) - (setf (gethash o *to-string-hashtable*) - (format nil - "Could not invoke toString(): ~A" - e))))))) - (append - (if (gethash o *to-string-hashtable*) - (label-value-line "toString()" (gethash o *to-string-hashtable*)) - `((:action "[compute toString()]" ,to-string) (:newline))) - (loop :for (label . value) :in (sys:inspected-parts o) - :appending (label-value-line label value))))) - -;;;; Multithreading - -(defimplementation spawn (fn &key name) - (threads:make-thread (lambda () (funcall fn)) :name name)) - -(defvar *thread-plists* (make-hash-table) ; should be a weak table - "A hashtable mapping threads to a plist.") - -(defvar *thread-id-counter* 0) - -(defimplementation thread-id (thread) - (threads:synchronized-on *thread-plists* - (or (getf (gethash thread *thread-plists*) 'id) - (setf (getf (gethash thread *thread-plists*) 'id) - (incf *thread-id-counter*))))) - -(defimplementation find-thread (id) - (find id (all-threads) - :key (lambda (thread) - (getf (gethash thread *thread-plists*) 'id)))) - -(defimplementation thread-name (thread) - (threads:thread-name thread)) - -(defimplementation thread-status (thread) - (format nil "Thread is ~:[dead~;alive~]" (threads:thread-alive-p thread))) - -(defimplementation make-lock (&key name) - (declare (ignore name)) - (threads:make-thread-lock)) - -(defimplementation call-with-lock-held (lock function) - (threads:with-thread-lock (lock) (funcall function))) - -(defimplementation current-thread () - (threads:current-thread)) - -(defimplementation all-threads () - (copy-list (threads:mapcar-threads #'identity))) - -(defimplementation thread-alive-p (thread) - (member thread (all-threads))) - -(defimplementation interrupt-thread (thread fn) - (threads:interrupt-thread thread fn)) - -(defimplementation kill-thread (thread) - (threads:destroy-thread thread)) - -(defstruct mailbox - (queue '())) - -(defun mailbox (thread) - "Return THREAD's mailbox." - (threads:synchronized-on *thread-plists* - (or (getf (gethash thread *thread-plists*) 'mailbox) - (setf (getf (gethash thread *thread-plists*) 'mailbox) - (make-mailbox))))) - -(defimplementation send (thread message) - (let ((mbox (mailbox thread))) - (threads:synchronized-on mbox - (setf (mailbox-queue mbox) - (nconc (mailbox-queue mbox) (list message))) - (threads:object-notify-all mbox)))) - -(defimplementation receive-if (test &optional timeout) - (let* ((mbox (mailbox (current-thread)))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (threads:synchronized-on mbox - (let* ((q (mailbox-queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox-queue mbox) (nconc (ldiff q tail) (cdr tail))) - (return (car tail))) - (when (eq timeout t) (return (values nil t))) - (threads:object-wait mbox 0.3)))))) - -(defimplementation quit-lisp () - (ext:exit)) -;;; -#+#.(swank/backend:with-symbol 'package-local-nicknames 'ext) -(defimplementation package-local-nicknames (package) - (ext:package-local-nicknames package)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/allegro.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/allegro.lisp deleted file mode 100644 index 63f4b6f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/allegro.lisp +++ /dev/null @@ -1,1070 +0,0 @@ -;;;; -*- indent-tabs-mode: nil; outline-regexp: ";;;;;* "; -*- -;;; -;;; swank-allegro.lisp --- Allegro CL specific code for SLIME. -;;; -;;; Created 2003 -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -(defpackage swank/allegro - (:use cl swank/backend)) - -(in-package swank/allegro) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (require :sock) - (require :process) - #+(version>= 8 2) - (require 'lldb)) - -(defimplementation gray-package-name () - '#:excl) - -;;; swank-mop - -(import-swank-mop-symbols :clos '(:slot-definition-documentation)) - -(defun swank-mop:slot-definition-documentation (slot) - (documentation slot t)) - - -;;;; UTF8 - -(define-symbol-macro utf8-ef - (load-time-value - (excl:crlf-base-ef (excl:find-external-format :utf-8)) - t)) - -(defimplementation string-to-utf8 (s) - (excl:string-to-octets s :external-format utf8-ef - :null-terminate nil)) - -(defimplementation utf8-to-string (u) - (excl:octets-to-string u :external-format utf8-ef)) - - -;;;; TCP Server - -(defimplementation preferred-communication-style () - :spawn) - -(defimplementation create-socket (host port &key backlog) - (socket:make-socket :connect :passive :local-port port - :local-host host :reuse-address t - :backlog (or backlog 5))) - -(defimplementation local-port (socket) - (socket:local-port socket)) - -(defimplementation close-socket (socket) - (close socket)) - -(defimplementation accept-connection (socket &key external-format buffering - timeout) - (declare (ignore buffering timeout)) - (let ((s (socket:accept-connection socket :wait t))) - (when external-format - (setf (stream-external-format s) external-format)) - s)) - -(defimplementation socket-fd (stream) - (excl::stream-input-handle stream)) - -(defvar *external-format-to-coding-system* - '((:iso-8859-1 - "latin-1" "latin-1-unix" "iso-latin-1-unix" - "iso-8859-1" "iso-8859-1-unix") - (:utf-8 "utf-8" "utf-8-unix") - (:euc-jp "euc-jp" "euc-jp-unix") - (:us-ascii "us-ascii" "us-ascii-unix") - (:emacs-mule "emacs-mule" "emacs-mule-unix"))) - -(defimplementation find-external-format (coding-system) - (let ((e (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*))) - (and e (excl:crlf-base-ef - (excl:find-external-format (car e) - :try-variant t))))) - -;;;; Unix signals - -(defimplementation getpid () - (excl::getpid)) - -(defimplementation lisp-implementation-type-name () - "allegro") - -(defimplementation set-default-directory (directory) - (let* ((dir (namestring (truename (merge-pathnames directory))))) - (setf *default-pathname-defaults* (pathname (excl:chdir dir))) - dir)) - -(defimplementation default-directory () - (namestring (excl:current-directory))) - -;;;; Misc - -(defimplementation arglist (symbol) - (handler-case (excl:arglist symbol) - (simple-error () :not-available))) - -(defimplementation macroexpand-all (form &optional env) - (declare (ignore env)) - #+(version>= 8 0) - (excl::walk-form form) - #-(version>= 8 0) - (excl::walk form)) - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (flet ((doc (kind &optional (sym symbol)) - (or (documentation sym kind) :not-documented)) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push - :variable (when (boundp symbol) - (doc 'variable))) - (maybe-push - :function (if (fboundp symbol) - (doc 'function))) - (maybe-push - :class (if (find-class symbol nil) - (doc 'class))) - result))) - -(defimplementation describe-definition (symbol namespace) - (ecase namespace - (:variable - (describe symbol)) - ((:function :generic-function) - (describe (symbol-function symbol))) - (:class - (describe (find-class symbol))))) - -(defimplementation type-specifier-p (symbol) - (or (ignore-errors - (subtypep nil symbol)) - (not (eq (type-specifier-arglist symbol) :not-available)))) - -(defimplementation function-name (f) - (check-type f function) - (cross-reference::object-to-function-name f)) - -;;;; Debugger - -(defvar *sldb-topframe*) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (let ((*sldb-topframe* (find-topframe)) - (excl::*break-hook* nil)) - (funcall debugger-loop-fn))) - -(defimplementation sldb-break-at-start (fname) - ;; :print-before is kind of mis-used but we just want to stuff our - ;; break form somewhere. This does not work for setf, :before and - ;; :after methods, which need special syntax in the trace call, see - ;; ACL's doc/debugging.htm chapter 10. - (eval `(trace (,fname - :print-before - ((break "Function start breakpoint of ~A" ',fname))))) - `(:ok ,(format nil "Set breakpoint at start of ~S" fname))) - -(defun find-topframe () - (let ((magic-symbol (intern (symbol-name :swank-debugger-hook) - (find-package :swank))) - (top-frame (excl::int-newest-frame (excl::current-thread)))) - (loop for frame = top-frame then (next-frame frame) - for i from 0 - while (and frame (< i 30)) - when (eq (debugger:frame-name frame) magic-symbol) - return (next-frame frame) - finally (return top-frame)))) - -(defun next-frame (frame) - (let ((next (excl::int-next-older-frame frame))) - (cond ((not next) nil) - ((debugger:frame-visible-p next) next) - (t (next-frame next))))) - -(defun nth-frame (index) - (do ((frame *sldb-topframe* (next-frame frame)) - (i index (1- i))) - ((zerop i) frame))) - -(defimplementation compute-backtrace (start end) - (let ((end (or end most-positive-fixnum))) - (loop for f = (nth-frame start) then (next-frame f) - for i from start below end - while f collect f))) - -(defimplementation print-frame (frame stream) - (debugger:output-frame stream frame :moderate)) - -(defimplementation frame-locals (index) - (let ((frame (nth-frame index))) - (loop for i from 0 below (debugger:frame-number-vars frame) - collect (list :name (debugger:frame-var-name frame i) - :id 0 - :value (debugger:frame-var-value frame i))))) - -(defimplementation frame-var-value (frame var) - (let ((frame (nth-frame frame))) - (debugger:frame-var-value frame var))) - -(defimplementation disassemble-frame (index) - (let ((frame (nth-frame index))) - (multiple-value-bind (x fun xx xxx pc) (debugger::dyn-fd-analyze frame) - (format t "pc: ~d (~s ~s ~s)~%fun: ~a~%" pc x xx xxx fun) - (disassemble (debugger:frame-function frame))))) - -(defimplementation frame-source-location (index) - (let* ((frame (nth-frame index))) - (multiple-value-bind (x fun xx xxx pc) (debugger::dyn-fd-analyze frame) - (declare (ignore x xx xxx)) - (cond ((and pc - #+(version>= 8 2) - (pc-source-location fun pc) - #-(version>= 8 2) - (function-source-location fun))) - (t ; frames for unbound functions etc end up here - (cadr (car (fspec-definition-locations - (car (debugger:frame-expression frame)))))))))) - -(defun function-source-location (fun) - (cadr (car (fspec-definition-locations - (xref::object-to-function-name fun))))) - -#+(version>= 8 2) -(defun pc-source-location (fun pc) - (let* ((debug-info (excl::function-source-debug-info fun))) - (cond ((not debug-info) - (function-source-location fun)) - (t - (let* ((code-loc (find-if (lambda (c) - (<= (- pc (sys::natural-width)) - (let ((x (excl::ldb-code-pc c))) - (or x -1)) - pc)) - debug-info))) - (cond ((not code-loc) - (ldb-code-to-src-loc (aref debug-info 0))) - (t - (ldb-code-to-src-loc code-loc)))))))) - -#+(version>= 8 2) -(defun ldb-code-to-src-loc (code) - (declare (optimize debug)) - (let* ((func (excl::ldb-code-func code)) - (debug-info (excl::function-source-debug-info func)) - (start (loop for i from (excl::ldb-code-index code) downto 0 - for bpt = (aref debug-info i) - for start = (excl::ldb-code-start-char bpt) - when start - return (if (listp start) - (first start) - start))) - (src-file (excl:source-file func))) - (cond (start - (buffer-or-file-location src-file start)) - (func - (let* ((debug-info (excl::function-source-debug-info func)) - (whole (aref debug-info 0)) - (paths (source-paths-of (excl::ldb-code-source whole) - (excl::ldb-code-source code))) - (path (if paths (longest-common-prefix paths) '())) - (start 0)) - (buffer-or-file - src-file - (lambda (file) - (make-location `(:file ,file) - `(:source-path (0 . ,path) ,start))) - (lambda (buffer bstart) - (make-location `(:buffer ,buffer) - `(:source-path (0 . ,path) - ,(+ bstart start))))))) - (t - nil)))) - -(defun longest-common-prefix (sequences) - (assert sequences) - (flet ((common-prefix (s1 s2) - (let ((diff-pos (mismatch s1 s2))) - (if diff-pos (subseq s1 0 diff-pos) s1)))) - (reduce #'common-prefix sequences))) - -(defun source-paths-of (whole part) - (let ((result '())) - (labels ((walk (form path) - (cond ((eq form part) - (push (reverse path) result)) - ((consp form) - (loop for i from 0 while (consp form) do - (walk (pop form) (cons i path))))))) - (walk whole '()) - (reverse result)))) - -(defimplementation eval-in-frame (form frame-number) - (let ((frame (nth-frame frame-number))) - ;; let-bind lexical variables - (let ((vars (loop for i below (debugger:frame-number-vars frame) - for name = (debugger:frame-var-name frame i) - if (typep name '(and symbol (not null) (not keyword))) - collect `(,name ',(debugger:frame-var-value frame i))))) - (debugger:eval-form-in-context - `(let* ,vars ,form) - (debugger:environment-of-frame frame))))) - -(defimplementation frame-package (frame-number) - (let* ((frame (nth-frame frame-number)) - (exp (debugger:frame-expression frame))) - (typecase exp - ((cons symbol) (symbol-package (car exp))) - ((cons (cons (eql :internal) (cons symbol))) - (symbol-package (cadar exp)))))) - -(defimplementation return-from-frame (frame-number form) - (let ((frame (nth-frame frame-number))) - (multiple-value-call #'debugger:frame-return - frame (debugger:eval-form-in-context - form - (debugger:environment-of-frame frame))))) - -(defimplementation frame-restartable-p (frame) - (handler-case (debugger:frame-retryable-p frame) - (serious-condition (c) - (funcall (read-from-string "swank::background-message") - "~a ~a" frame (princ-to-string c)) - nil))) - -(defimplementation restart-frame (frame-number) - (let ((frame (nth-frame frame-number))) - (cond ((debugger:frame-retryable-p frame) - (apply #'debugger:frame-retry frame (debugger:frame-function frame) - (cdr (debugger:frame-expression frame)))) - (t "Frame is not retryable")))) - -;;;; Compiler hooks - -(defvar *buffer-name* nil) -(defvar *buffer-start-position*) -(defvar *buffer-string*) -(defvar *compile-filename* nil) - -(defun compiler-note-p (object) - (member (type-of object) '(excl::compiler-note compiler::compiler-note))) - -(defun redefinition-p (condition) - (and (typep condition 'style-warning) - (every #'char-equal "redefin" (princ-to-string condition)))) - -(defun compiler-undefined-functions-called-warning-p (object) - (typep object 'excl:compiler-undefined-functions-called-warning)) - -(deftype compiler-note () - `(satisfies compiler-note-p)) - -(deftype redefinition () - `(satisfies redefinition-p)) - -(defun signal-compiler-condition (&rest args) - (apply #'signal 'compiler-condition args)) - -(defun handle-compiler-warning (condition) - (declare (optimize (debug 3) (speed 0) (space 0))) - (cond ((and #-(version>= 10 0) (not *buffer-name*) - (compiler-undefined-functions-called-warning-p condition)) - (handle-undefined-functions-warning condition)) - ((and (typep condition 'excl::compiler-note) - (let ((format (slot-value condition 'excl::format-control))) - (and (search "Closure" format) - (search "will be stack allocated" format)))) - ;; Ignore "Closure will be stack allocated" notes. - ;; That occurs often but is usually uninteresting. - ) - (t - (signal-compiler-condition - :original-condition condition - :severity (etypecase condition - (redefinition :redefinition) - (style-warning :style-warning) - (warning :warning) - (compiler-note :note) - (reader-error :read-error) - (error :error)) - :message (format nil "~A" condition) - :location (compiler-warning-location condition))))) - -(defun condition-pathname-and-position (condition) - (let* ((context #+(version>= 10 0) - (getf (slot-value condition 'excl::plist) - :source-context)) - (location-available (and context - (excl::source-context-start-char context)))) - (cond (location-available - (values (excl::source-context-pathname context) - (when-let (start-char (excl::source-context-start-char context)) - (let ((position (if (listp start-char) ; HACK - (first start-char) - start-char))) - (if (typep condition 'excl::compiler-free-reference-warning) - position - (1+ position)))))) - ((typep condition 'reader-error) - (let ((pos (car (last (slot-value condition 'excl::format-arguments)))) - (file (pathname (stream-error-stream condition)))) - (when (integerp pos) - (values file pos)))) - (t - (let ((loc (getf (slot-value condition 'excl::plist) :loc))) - (when loc - (destructuring-bind (file . pos) loc - (let ((start (if (consp pos) ; 8.2 and newer - #+(version>= 10 1) - (if (typep condition 'excl::compiler-inconsistent-name-usage-warning) - (second pos) - (first pos)) - #-(version>= 10 1) - (first pos) - pos))) - (values file start))))))))) - -(defun compiler-warning-location (condition) - (multiple-value-bind (pathname position) - (condition-pathname-and-position condition) - (cond (*buffer-name* - (make-location - (list :buffer *buffer-name*) - (if position - (list :offset 1 (1- position)) - (list :offset *buffer-start-position* 0)))) - (pathname - (make-location - (list :file (namestring (truename pathname))) - #+(version>= 10 1) - (list :offset 1 position) - #-(version>= 10 1) - (list :position (1+ position)))) - (t - (make-error-location "No error location available."))))) - -;; TODO: report it as a bug to Franz that the condition's plist -;; slot contains (:loc nil). -(defun handle-undefined-functions-warning (condition) - (let ((fargs (slot-value condition 'excl::format-arguments))) - (loop for (fname . locs) in (car fargs) do - (dolist (loc locs) - (multiple-value-bind (pos file) (ecase (length loc) - (2 (values-list loc)) - (3 (destructuring-bind - (start end file) loc - (declare (ignore end)) - (values start file)))) - (signal-compiler-condition - :original-condition condition - :severity :warning - :message (format nil "Undefined function referenced: ~S" - fname) - :location (make-location (list :file file) - #+(version>= 9 0) - (list :offset 1 pos) - #-(version>= 9 0) - (list :position (1+ pos))))))))) - -(defimplementation call-with-compilation-hooks (function) - (handler-bind ((warning #'handle-compiler-warning) - (compiler-note #'handle-compiler-warning) - (reader-error #'handle-compiler-warning)) - (funcall function))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (handler-case - (with-compilation-hooks () - (let ((*buffer-name* nil) - (*compile-filename* input-file) - #+(version>= 8 2) - (compiler:save-source-level-debug-info-switch t) - (excl:*load-source-file-info* t) - #+(version>= 8 2) - (excl:*load-source-debug-info* t)) - (compile-file *compile-filename* - :output-file output-file - :load-after-compile load-p - :external-format external-format))) - (reader-error () (values nil nil t)))) - -(defun call-with-temp-file (fn) - (let ((tmpname (system:make-temp-file-name))) - (unwind-protect - (with-open-file (file tmpname :direction :output :if-exists :error) - (funcall fn file tmpname)) - (delete-file tmpname)))) - -(defvar *temp-file-map* (make-hash-table :test #'equal) - "A mapping from tempfile names to Emacs buffer names.") - -(defun write-tracking-preamble (stream file file-offset) - "Instrument the top of the temporary file to be compiled. - -The header tells allegro that any definitions compiled in the temp -file should be found in FILE exactly at FILE-OFFSET. To get Allegro -to do this, this factors in the length of the inserted header itself." - (with-standard-io-syntax - (let* ((*package* (find-package :keyword)) - (source-pathname-form - `(cl:eval-when (:compile-toplevel :load-toplevel :execute) - (cl:setq excl::*source-pathname* - (pathname ,(sys::frob-source-file file))))) - (source-pathname-string (write-to-string source-pathname-form)) - (position-form-length-bound 160) ; should be enough for everyone - (header-length (+ (length source-pathname-string) - position-form-length-bound)) - (position-form - `(cl:eval-when (:compile-toplevel :load-toplevel :execute) - (cl:setq excl::*partial-source-file-p* ,(- file-offset - header-length - 1 ; for the newline - )))) - (position-form-string (write-to-string position-form)) - (padding-string (make-string (- position-form-length-bound - (length position-form-string)) - :initial-element #\;))) - (write-string source-pathname-string stream) - (write-string position-form-string stream) - (write-string padding-string stream) - (write-char #\newline stream)))) - -(defun compile-from-temp-file (string buffer offset file) - (call-with-temp-file - (lambda (stream filename) - (when (and file offset (probe-file file)) - (write-tracking-preamble stream file offset)) - (write-string string stream) - (finish-output stream) - (multiple-value-bind (binary-filename warnings? failure?) - (let ((sys:*source-file-types* '(nil)) ; suppress .lisp extension - #+(version>= 8 2) - (compiler:save-source-level-debug-info-switch t) - (excl:*redefinition-warnings* nil)) - (compile-file filename)) - (declare (ignore warnings?)) - (when binary-filename - (let ((excl:*load-source-file-info* t) - #+(version>= 8 2) - (excl:*load-source-debug-info* t)) - excl::*source-pathname* - (load binary-filename)) - (when (and buffer offset (or (not file) - (not (probe-file file)))) - (setf (gethash (pathname stream) *temp-file-map*) - (list buffer offset))) - (delete-file binary-filename)) - (not failure?))))) - -(defimplementation swank-compile-string (string &key buffer position filename - policy) - (declare (ignore policy)) - (handler-case - (with-compilation-hooks () - (let ((*buffer-name* buffer) - (*buffer-start-position* position) - (*buffer-string* string)) - (compile-from-temp-file string buffer position filename))) - (reader-error () nil))) - -;;;; Definition Finding - -(defun buffer-or-file (file file-fun buffer-fun) - (let* ((probe (gethash file *temp-file-map*))) - (cond (probe - (destructuring-bind (buffer start) probe - (funcall buffer-fun buffer start))) - (t (funcall file-fun (namestring (truename file))))))) - -(defun buffer-or-file-location (file offset) - (buffer-or-file file - (lambda (filename) - (make-location `(:file ,filename) - `(:position ,(1+ offset)))) - (lambda (buffer start) - (make-location `(:buffer ,buffer) - `(:offset ,start ,offset))))) - -(defun fspec-primary-name (fspec) - (etypecase fspec - (symbol fspec) - (list (fspec-primary-name (second fspec))))) - -(defun find-definition-in-file (fspec type file top-level) - (let* ((part - (or (scm::find-definition-in-definition-group - fspec type (scm:section-file :file file) - :top-level top-level) - (scm::find-definition-in-definition-group - (fspec-primary-name fspec) - type (scm:section-file :file file) - :top-level top-level))) - (start (and part - (scm::source-part-start part))) - (pos (if start - (list :offset 1 start) - (list :function-name (string (fspec-primary-name fspec)))))) - (make-location (list :file (namestring (truename file))) - pos))) - -(defun find-fspec-location (fspec type file top-level) - (handler-case - (etypecase file - (pathname - (let ((probe (gethash file *temp-file-map*))) - (cond (probe - (destructuring-bind (buffer offset) probe - (make-location `(:buffer ,buffer) - `(:offset ,offset 0)))) - (t - (find-definition-in-file fspec type file top-level))))) - ((member :top-level) - (make-error-location "Defined at toplevel: ~A" - (fspec->string fspec)))) - (error (e) - (make-error-location "Error: ~A" e)))) - -(defun fspec->string (fspec) - (typecase fspec - (symbol (let ((*package* (find-package :keyword))) - (prin1-to-string fspec))) - (list (format nil "(~A ~A)" - (prin1-to-string (first fspec)) - (let ((*package* (find-package :keyword))) - (prin1-to-string (second fspec))))) - (t (princ-to-string fspec)))) - -(defun fspec-definition-locations (fspec) - (cond - ((and (listp fspec) (eq (car fspec) :internal)) - (destructuring-bind (_internal next _n) fspec - (declare (ignore _internal _n)) - (fspec-definition-locations next))) - (t - (let ((defs (excl::find-source-file fspec))) - (when (and (null defs) - (listp fspec) - (string= (car fspec) '#:method)) - ;; If methods are defined in a defgeneric form, the source location is - ;; recorded for the gf but not for the methods. Therefore fall back to - ;; the gf as the likely place of definition. - (setq defs (excl::find-source-file (second fspec)))) - (if (null defs) - (list - (list fspec - (make-error-location "Unknown source location for ~A" - (fspec->string fspec)))) - (loop for (fspec type file top-level) in defs collect - (list (list type fspec) - (find-fspec-location fspec type file top-level)))))))) - -(defimplementation find-definitions (symbol) - (fspec-definition-locations symbol)) - -(defimplementation find-source-location (obj) - (first (rest (first (fspec-definition-locations obj))))) - -;;;; XREF - -(defmacro defxref (name relation name1 name2) - `(defimplementation ,name (x) - (xref-result (xref:get-relation ,relation ,name1 ,name2)))) - -(defxref who-calls :calls :wild x) -(defxref calls-who :calls x :wild) -(defxref who-references :uses :wild x) -(defxref who-binds :binds :wild x) -(defxref who-macroexpands :macro-calls :wild x) -(defxref who-sets :sets :wild x) - -(defun xref-result (fspecs) - (loop for fspec in fspecs - append (fspec-definition-locations fspec))) - -;; list-callers implemented by groveling through all fbound symbols. -;; Only symbols are considered. Functions in the constant pool are -;; searched recursively. Closure environments are ignored at the -;; moment (constants in methods are therefore not found). - -(defun map-function-constants (function fn depth) - "Call FN with the elements of FUNCTION's constant pool." - (do ((i 0 (1+ i)) - (max (excl::function-constant-count function))) - ((= i max)) - (let ((c (excl::function-constant function i))) - (cond ((and (functionp c) - (not (eq c function)) - (plusp depth)) - (map-function-constants c fn (1- depth))) - (t - (funcall fn c)))))) - -(defun in-constants-p (fun symbol) - (map-function-constants fun - (lambda (c) - (when (eq c symbol) - (return-from in-constants-p t))) - 3)) - -(defun function-callers (name) - (let ((callers '())) - (do-all-symbols (sym) - (when (fboundp sym) - (let ((fn (fdefinition sym))) - (when (in-constants-p fn name) - (push sym callers))))) - callers)) - -(defimplementation list-callers (name) - (xref-result (function-callers name))) - -(defimplementation list-callees (name) - (let ((result '())) - (map-function-constants (fdefinition name) - (lambda (c) - (when (fboundp c) - (push c result))) - 2) - (xref-result result))) - -;;;; Profiling - -;; Per-function profiling based on description in -;; http://www.franz.com/support/documentation/8.0/\ -;; doc/runtime-analyzer.htm#data-collection-control-2 - -(defvar *profiled-functions* ()) -(defvar *profile-depth* 0) - -(defmacro with-redirected-y-or-n-p (&body body) - ;; If the profiler is restarted when the data from the previous - ;; session is not reported yet, the user is warned via Y-OR-N-P. - ;; As the CL:Y-OR-N-P question is (for some reason) not directly - ;; sent to the Slime user, the function CL:Y-OR-N-P is temporarily - ;; overruled. - `(let* ((pkg (find-package :common-lisp)) - (saved-pdl (excl::package-definition-lock pkg)) - (saved-ynp (symbol-function 'cl:y-or-n-p))) - (setf (excl::package-definition-lock pkg) nil - (symbol-function 'cl:y-or-n-p) - (symbol-function (read-from-string "swank:y-or-n-p-in-emacs"))) - (unwind-protect - (progn ,@body) - (setf (symbol-function 'cl:y-or-n-p) saved-ynp - (excl::package-definition-lock pkg) saved-pdl)))) - -(defun start-acl-profiler () - (with-redirected-y-or-n-p - (prof:start-profiler :type :time :count t - :start-sampling-p nil :verbose nil))) -(defun acl-profiler-active-p () - (not (eq (prof:profiler-status :verbose nil) :inactive))) - -(defun stop-acl-profiler () - (prof:stop-profiler :verbose nil)) - -(excl:def-fwrapper profile-fwrapper (&rest args) - ;; Ensures sampling is done during the execution of the function, - ;; taking into account recursion. - (declare (ignore args)) - (cond ((zerop *profile-depth*) - (let ((*profile-depth* (1+ *profile-depth*))) - (prof:start-sampling) - (unwind-protect (excl:call-next-fwrapper) - (prof:stop-sampling)))) - (t - (excl:call-next-fwrapper)))) - -(defimplementation profile (fname) - (unless (acl-profiler-active-p) - (start-acl-profiler)) - (excl:fwrap fname 'profile-fwrapper 'profile-fwrapper) - (push fname *profiled-functions*)) - -(defimplementation profiled-functions () - *profiled-functions*) - -(defimplementation unprofile (fname) - (excl:funwrap fname 'profile-fwrapper) - (setq *profiled-functions* (remove fname *profiled-functions*))) - -(defimplementation profile-report () - (prof:show-flat-profile :verbose nil) - (when *profiled-functions* - (start-acl-profiler))) - -(defimplementation profile-reset () - (when (acl-profiler-active-p) - (stop-acl-profiler) - (start-acl-profiler)) - "Reset profiling counters.") - -;;;; Inspecting - -(excl:without-redefinition-warnings -(defmethod emacs-inspect ((o t)) - (allegro-inspect o))) - -(defmethod emacs-inspect ((o function)) - (allegro-inspect o)) - -(defmethod emacs-inspect ((o standard-object)) - (allegro-inspect o)) - -(defun allegro-inspect (o) - (loop for (d dd) on (inspect::inspect-ctl o) - append (frob-allegro-field-def o d) - until (eq d dd))) - -(defun frob-allegro-field-def (object def) - (with-struct (inspect::field-def- name type access) def - (ecase type - ((:unsigned-word :unsigned-byte :unsigned-natural - :unsigned-long :unsigned-half-long - :unsigned-3byte :unsigned-long32) - (label-value-line name (inspect::component-ref-v object access type))) - ((:lisp :value :func) - (label-value-line name (inspect::component-ref object access))) - (:indirect - (destructuring-bind (prefix count ref set) access - (declare (ignore set prefix)) - (loop for i below (funcall count object) - append (label-value-line (format nil "~A-~D" name i) - (funcall ref object i)))))))) - -;;;; Multithreading - -(defimplementation initialize-multiprocessing (continuation) - (mp:start-scheduler) - (funcall continuation)) - -(defimplementation spawn (fn &key name) - (mp:process-run-function name fn)) - -(defvar *id-lock* (mp:make-process-lock :name "id lock")) -(defvar *thread-id-counter* 0) - -(defimplementation thread-id (thread) - (mp:with-process-lock (*id-lock*) - (or (getf (mp:process-property-list thread) 'id) - (setf (getf (mp:process-property-list thread) 'id) - (incf *thread-id-counter*))))) - -(defimplementation find-thread (id) - (find id mp:*all-processes* - :key (lambda (p) (getf (mp:process-property-list p) 'id)))) - -(defimplementation thread-name (thread) - (mp:process-name thread)) - -(defimplementation thread-status (thread) - (princ-to-string (mp:process-whostate thread))) - -(defimplementation thread-attributes (thread) - (list :priority (mp:process-priority thread) - :times-resumed (mp:process-times-resumed thread))) - -(defimplementation make-lock (&key name) - (mp:make-process-lock :name name)) - -(defimplementation call-with-lock-held (lock function) - (mp:with-process-lock (lock) (funcall function))) - -(defimplementation current-thread () - mp:*current-process*) - -(defimplementation all-threads () - (copy-list mp:*all-processes*)) - -(defimplementation interrupt-thread (thread fn) - (mp:process-interrupt thread fn)) - -(defimplementation kill-thread (thread) - (mp:process-kill thread)) - -(defvar *mailbox-lock* (mp:make-process-lock :name "mailbox lock")) - -(defstruct (mailbox (:conc-name mailbox.)) - (lock (mp:make-process-lock :name "process mailbox")) - (queue '() :type list) - (gate (mp:make-gate nil))) - -(defun mailbox (thread) - "Return THREAD's mailbox." - (mp:with-process-lock (*mailbox-lock*) - (or (getf (mp:process-property-list thread) 'mailbox) - (setf (getf (mp:process-property-list thread) 'mailbox) - (make-mailbox))))) - -(defimplementation send (thread message) - (let* ((mbox (mailbox thread))) - (mp:with-process-lock ((mailbox.lock mbox)) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message))) - (mp:open-gate (mailbox.gate mbox))))) - -(defimplementation receive-if (test &optional timeout) - (let ((mbox (mailbox mp:*current-process*))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (mp:with-process-lock ((mailbox.lock mbox)) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) (nconc (ldiff q tail) (cdr tail))) - (return (car tail))) - (mp:close-gate (mailbox.gate mbox)))) - (when (eq timeout t) (return (values nil t))) - (mp:process-wait-with-timeout "receive-if" 0.5 - #'mp:gate-open-p (mailbox.gate mbox))))) - -(let ((alist '()) - (lock (mp:make-process-lock :name "register-thread"))) - - (defimplementation register-thread (name thread) - (declare (type symbol name)) - (mp:with-process-lock (lock) - (etypecase thread - (null - (setf alist (delete name alist :key #'car))) - (mp:process - (let ((probe (assoc name alist))) - (cond (probe (setf (cdr probe) thread)) - (t (setf alist (acons name thread alist)))))))) - nil) - - (defimplementation find-registered (name) - (mp:with-process-lock (lock) - (cdr (assoc name alist))))) - -(defimplementation set-default-initial-binding (var form) - (push (cons var form) - #+(version>= 9 0) - excl:*required-thread-bindings* - #-(version>= 9 0) - excl::required-thread-bindings)) - -(defimplementation quit-lisp () - (excl:exit 0 :quiet t)) - - -;;Trace implementations -;;In Allegro 7.0, we have: -;; (trace ) -;; (trace ((method ? (+)))) -;; (trace ((labels ))) -;; (trace ((labels (method (+)) ))) -;; can be a normal name or a (setf name) - -(defimplementation toggle-trace (spec) - (ecase (car spec) - ((setf) - (toggle-trace-aux spec)) - (:defgeneric (toggle-trace-generic-function-methods (second spec))) - ((setf :defmethod :labels :flet) - (toggle-trace-aux (process-fspec-for-allegro spec))) - (:call - (destructuring-bind (caller callee) (cdr spec) - (toggle-trace-aux callee - :inside (list (process-fspec-for-allegro caller))))))) - -(defun tracedp (fspec) - (member fspec (eval '(trace)) :test #'equal)) - -(defun toggle-trace-aux (fspec &rest args) - (cond ((tracedp fspec) - (eval `(untrace ,fspec)) - (format nil "~S is now untraced." fspec)) - (t - (eval `(trace (,fspec ,@args))) - (format nil "~S is now traced." fspec)))) - -(defun toggle-trace-generic-function-methods (name) - (let ((methods (mop:generic-function-methods (fdefinition name)))) - (cond ((tracedp name) - (eval `(untrace ,name)) - (dolist (method methods (format nil "~S is now untraced." name)) - (excl:funtrace (mop:method-function method)))) - (t - (eval `(trace (,name))) - (dolist (method methods (format nil "~S is now traced." name)) - (excl:ftrace (mop:method-function method))))))) - -(defun process-fspec-for-allegro (fspec) - (cond ((consp fspec) - (ecase (first fspec) - ((setf) fspec) - ((:defun :defgeneric) (second fspec)) - ((:defmethod) `(method ,@(rest fspec))) - ((:labels) `(labels ,(process-fspec-for-allegro (second fspec)) - ,(third fspec))) - ((:flet) `(flet ,(process-fspec-for-allegro (second fspec)) - ,(third fspec))))) - (t - fspec))) - - -;;;; Weak hashtables - -(defimplementation make-weak-key-hash-table (&rest args) - (apply #'make-hash-table :weak-keys t args)) - -(defimplementation make-weak-value-hash-table (&rest args) - (apply #'make-hash-table :values :weak args)) - -(defimplementation hash-table-weakness (hashtable) - (cond ((excl:hash-table-weak-keys hashtable) :key) - ((eq (excl:hash-table-values hashtable) :weak) :value))) - - - -;;;; Character names - -(defimplementation character-completion-set (prefix matchp) - (loop for name being the hash-keys of excl::*name-to-char-table* - when (funcall matchp prefix name) - collect (string-capitalize name))) - - -;;;; wrap interface implementation - -(defimplementation wrap (spec indicator &key before after replace) - (let ((allegro-spec (process-fspec-for-allegro spec))) - (excl:fwrap allegro-spec - indicator - (excl:def-fwrapper allegro-wrapper (&rest args) - (let (retlist completed) - (unwind-protect - (progn - (when before - (funcall before args)) - (setq retlist (multiple-value-list - (if replace - (funcall replace args) - (excl:call-next-fwrapper)))) - (setq completed t) - (values-list retlist)) - (when after - (funcall after (if completed - retlist - :exited-non-locally))))))) - allegro-spec)) - -(defimplementation unwrap (spec indicator) - (let ((allegro-spec (process-fspec-for-allegro spec))) - (excl:funwrap allegro-spec indicator) - allegro-spec)) - -(defimplementation wrapped-p (spec indicator) - (getf (excl:fwrap-order (process-fspec-for-allegro spec)) indicator)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/backend.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/backend.lisp deleted file mode 100644 index eca348e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/backend.lisp +++ /dev/null @@ -1,1579 +0,0 @@ -;;; -*- indent-tabs-mode: nil; outline-regexp: ";;;;;*" -*- -;;; -;;; slime-backend.lisp --- SLIME backend interface. -;;; -;;; Created by James Bielman in 2003. Released into the public domain. -;;; -;;;; Frontmatter -;;; -;;; This file defines the functions that must be implemented -;;; separately for each Lisp. Each is declared as a generic function -;;; for which swank-.lisp provides methods. - -(in-package swank/backend) - - -;;;; Metacode - -(defparameter *debug-swank-backend* nil - "If this is true, backends should not catch errors but enter the -debugger where appropriate. Also, they should not perform backtrace -magic but really show every frame including SWANK related ones.") - -(defparameter *interface-functions* '() - "The names of all interface functions.") - -(defparameter *unimplemented-interfaces* '() - "List of interface functions that are not implemented. -DEFINTERFACE adds to this list and DEFIMPLEMENTATION removes.") - -(defvar *log-output* nil) ; should be nil for image dumpers - -(defmacro definterface (name args documentation &rest default-body) - "Define an interface function for the backend to implement. -A function is defined with NAME, ARGS, and DOCUMENTATION. This -function first looks for a function to call in NAME's property list -that is indicated by 'IMPLEMENTATION; failing that, it looks for a -function indicated by 'DEFAULT. If neither is present, an error is -signaled. - -If a DEFAULT-BODY is supplied, then a function with the same body and -ARGS will be added to NAME's property list as the property indicated -by 'DEFAULT. - -Backends implement these functions using DEFIMPLEMENTATION." - (check-type documentation string "a documentation string") - (assert (every #'symbolp args) () - "Complex lambda-list not supported: ~S ~S" name args) - (labels ((gen-default-impl () - `(setf (get ',name 'default) (lambda ,args ,@default-body))) - (args-as-list (args) - (destructuring-bind (req opt key rest) (parse-lambda-list args) - `(,@req ,@opt - ,@(loop for k in key append `(,(kw k) ,k)) - ,@(or rest '(()))))) - (parse-lambda-list (args) - (parse args '(&optional &key &rest) - (make-array 4 :initial-element nil))) - (parse (args keywords vars) - (cond ((null args) - (reverse (map 'list #'reverse vars))) - ((member (car args) keywords) - (parse (cdr args) (cdr (member (car args) keywords)) vars)) - (t (push (car args) (aref vars (length keywords))) - (parse (cdr args) keywords vars)))) - (kw (s) (intern (string s) :keyword))) - `(progn - (defun ,name ,args - ,documentation - (let ((f (or (get ',name 'implementation) - (get ',name 'default)))) - (cond (f (apply f ,@(args-as-list args))) - (t (error "~S not implemented" ',name))))) - (pushnew ',name *interface-functions*) - ,(if (null default-body) - `(pushnew ',name *unimplemented-interfaces*) - (gen-default-impl)) - (eval-when (:compile-toplevel :load-toplevel :execute) - (export ',name :swank/backend)) - ',name))) - -(defmacro defimplementation (name args &body body) - (assert (every #'symbolp args) () - "Complex lambda-list not supported: ~S ~S" name args) - `(progn - (setf (get ',name 'implementation) - ;; For implicit BLOCK. FLET because of interplay w/ decls. - (flet ((,name ,args ,@body)) #',name)) - (if (member ',name *interface-functions*) - (setq *unimplemented-interfaces* - (remove ',name *unimplemented-interfaces*)) - (warn "DEFIMPLEMENTATION of undefined interface (~S)" ',name)) - ',name)) - -(defun warn-unimplemented-interfaces () - "Warn the user about unimplemented backend features. -The portable code calls this function at startup." - (let ((*print-pretty* t)) - (warn "These Swank interfaces are unimplemented:~% ~:<~{~A~^ ~:_~}~:>" - (list (sort (copy-list *unimplemented-interfaces*) #'string<))))) - -(defun import-to-swank-mop (symbol-list) - (dolist (sym symbol-list) - (let* ((swank-mop-sym (find-symbol (symbol-name sym) :swank-mop))) - (when swank-mop-sym - (unintern swank-mop-sym :swank-mop)) - (import sym :swank-mop) - (export sym :swank-mop)))) - -(defun import-swank-mop-symbols (package except) - "Import the mop symbols from PACKAGE to SWANK-MOP. -EXCEPT is a list of symbol names which should be ignored." - (do-symbols (s :swank-mop) - (unless (member s except :test #'string=) - (let ((real-symbol (find-symbol (string s) package))) - (assert real-symbol () "Symbol ~A not found in package ~A" s package) - (unintern s :swank-mop) - (import real-symbol :swank-mop) - (export real-symbol :swank-mop))))) - -(definterface gray-package-name () - "Return a package-name that contains the Gray stream symbols. -This will be used like so: - (defpackage foo - (:import-from #.(gray-package-name) . #.*gray-stream-symbols*)") - - -;;;; Utilities - -(defmacro with-struct ((conc-name &rest names) obj &body body) - "Like with-slots but works only for structs." - (check-type conc-name symbol) - (flet ((reader (slot) - (intern (concatenate 'string - (symbol-name conc-name) - (symbol-name slot)) - (symbol-package conc-name)))) - (let ((tmp (gensym "OO-"))) - ` (let ((,tmp ,obj)) - (symbol-macrolet - ,(loop for name in names collect - (typecase name - (symbol `(,name (,(reader name) ,tmp))) - (cons `(,(first name) (,(reader (second name)) ,tmp))) - (t (error "Malformed syntax in WITH-STRUCT: ~A" name)))) - ,@body))))) - -(defmacro when-let ((var value) &body body) - `(let ((,var ,value)) - (when ,var ,@body))) - -(defun boolean-to-feature-expression (value) - "Converts a boolean VALUE to a form suitable for testing with #+." - (if value - '(:and) - '(:or))) - -(defun with-symbol (name package) - "Check if a symbol with a given NAME exists in PACKAGE and returns a -form suitable for testing with #+." - (boolean-to-feature-expression - (and (find-package package) - (find-symbol (string name) package)))) - -(defun choose-symbol (package name alt-package alt-name) - "If symbol package:name exists return that symbol, otherwise alt-package:alt-name. - Suitable for use with #." - (or (and (find-package package) - (find-symbol (string name) package)) - (find-symbol (string alt-name) alt-package))) - - -;;;; UFT8 - -(deftype octet () '(unsigned-byte 8)) -(deftype octets () '(simple-array octet (*))) - -;; Helper function. Decode the next N bytes starting from INDEX. -;; Return the decoded char and the new index. -(defun utf8-decode-aux (buffer index limit byte0 n) - (declare (type octets buffer) (fixnum index limit byte0 n)) - (if (< (- limit index) n) - (values nil index) - (do ((i 0 (1+ i)) - (code byte0 (let ((byte (aref buffer (+ index i)))) - (cond ((= (ldb (byte 2 6) byte) #b10) - (+ (ash code 6) (ldb (byte 6 0) byte))) - (t - (error "Invalid encoding")))))) - ((= i n) - (values (cond ((<= code #xff) (code-char code)) - ((<= #xd800 code #xdfff) - (error "Invalid Unicode code point: #x~x" code)) - ((and (< code char-code-limit) - (code-char code))) - (t - (error - "Can't represent code point: #x~x ~ - (char-code-limit is #x~x)" - code char-code-limit))) - (+ index n)))))) - -;; Decode one character in BUFFER starting at INDEX. -;; Return 2 values: the character and the new index. -;; If there aren't enough bytes between INDEX and LIMIT return nil. -(defun utf8-decode (buffer index limit) - (declare (type octets buffer) (fixnum index limit)) - (if (= index limit) - (values nil index) - (let ((b (aref buffer index))) - (if (<= b #x7f) - (values (code-char b) (1+ index)) - (macrolet ((try (marker else) - (let* ((l (integer-length marker)) - (n (- l 2))) - `(if (= (ldb (byte ,l ,(- 8 l)) b) ,marker) - (utf8-decode-aux buffer (1+ index) limit - (ldb (byte ,(- 8 l) 0) b) - ,n) - ,else)))) - (try #b110 - (try #b1110 - (try #b11110 - (try #b111110 - (try #b1111110 - (error "Invalid encoding"))))))))))) - -;; Decode characters from BUFFER and write them to STRING. -;; Return 2 values: LASTINDEX and LASTSTART where -;; LASTINDEX is the last index in BUFFER that was not decoded -;; and LASTSTART is the last index in STRING not written. -(defun utf8-decode-into (buffer index limit string start end) - (declare (string string) (fixnum index limit start end) (type octets buffer)) - (loop - (cond ((= start end) - (return (values index start))) - (t - (multiple-value-bind (c i) (utf8-decode buffer index limit) - (cond (c - (setf (aref string start) c) - (setq index i) - (setq start (1+ start))) - (t - (return (values index start))))))))) - -(defun default-utf8-to-string (octets) - (let* ((limit (length octets)) - (str (make-string limit))) - (multiple-value-bind (i s) (utf8-decode-into octets 0 limit str 0 limit) - (if (= i limit) - (if (= limit s) - str - (adjust-array str s)) - (loop - (let ((end (+ (length str) (- limit i)))) - (setq str (adjust-array str end)) - (multiple-value-bind (i2 s2) - (utf8-decode-into octets i limit str s end) - (cond ((= i2 limit) - (return (adjust-array str s2))) - (t - (setq i i2) - (setq s s2)))))))))) - -(defmacro utf8-encode-aux (code buffer start end n) - `(cond ((< (- ,end ,start) ,n) - ,start) - (t - (setf (aref ,buffer ,start) - (dpb (ldb (byte ,(- 7 n) ,(* 6 (1- n))) ,code) - (byte ,(- 7 n) 0) - ,(dpb 0 (byte 1 (- 7 n)) #xff))) - ,@(loop for i from 0 upto (- n 2) collect - `(setf (aref ,buffer (+ ,start ,(- n 1 i))) - (dpb (ldb (byte 6 ,(* 6 i)) ,code) - (byte 6 0) - #b10111111))) - (+ ,start ,n)))) - -(defun %utf8-encode (code buffer start end) - (declare (type (unsigned-byte 31) code) (type octets buffer) - (type (and fixnum unsigned-byte) start end)) - (cond ((<= code #x7f) - (cond ((< start end) - (setf (aref buffer start) code) - (1+ start)) - (t start))) - ((<= code #x7ff) (utf8-encode-aux code buffer start end 2)) - ((<= #xd800 code #xdfff) - (error "Invalid Unicode code point (surrogate): #x~x" code)) - ((<= code #xffff) (utf8-encode-aux code buffer start end 3)) - ((<= code #x1fffff) (utf8-encode-aux code buffer start end 4)) - ((<= code #x3ffffff) (utf8-encode-aux code buffer start end 5)) - (t (utf8-encode-aux code buffer start end 6)))) - -(defun utf8-encode (char buffer start end) - (declare (type character char) (type octets buffer) - (type (and fixnum unsigned-byte) start end)) - (%utf8-encode (char-code char) buffer start end)) - -(defun utf8-encode-into (string start end buffer index limit) - (declare (string string) (type octets buffer) (fixnum start end index limit)) - (loop - (cond ((= start end) - (return (values start index))) - ((= index limit) - (return (values start index))) - (t - (let ((i2 (utf8-encode (char string start) buffer index limit))) - (cond ((= i2 index) - (return (values start index))) - (t - (setq index i2) - (incf start)))))))) - -(defun default-string-to-utf8 (string) - (let* ((len (length string)) - (b (make-array len :element-type 'octet))) - (multiple-value-bind (s i) (utf8-encode-into string 0 len b 0 len) - (if (= s len) - b - (loop - (let ((limit (+ (length b) (- len s)))) - (setq b (coerce (adjust-array b limit) 'octets)) - (multiple-value-bind (s2 i2) - (utf8-encode-into string s len b i limit) - (cond ((= s2 len) - (return (coerce (adjust-array b i2) 'octets))) - (t - (setq i i2) - (setq s s2)))))))))) - -(definterface string-to-utf8 (string) - "Convert the string STRING to a (simple-array (unsigned-byte 8))" - (default-string-to-utf8 string)) - -(definterface utf8-to-string (octets) - "Convert the (simple-array (unsigned-byte 8)) OCTETS to a string." - (default-utf8-to-string octets)) - - -;;;; TCP server - -(definterface create-socket (host port &key backlog) - "Create a listening TCP socket on interface HOST and port PORT. -BACKLOG queue length for incoming connections.") - -(definterface local-port (socket) - "Return the local port number of SOCKET.") - -(definterface close-socket (socket) - "Close the socket SOCKET.") - -(definterface accept-connection (socket &key external-format - buffering timeout) - "Accept a client connection on the listening socket SOCKET. -Return a stream for the new connection. -If EXTERNAL-FORMAT is nil return a binary stream -otherwise create a character stream. -BUFFERING can be one of: - nil ... no buffering - t ... enable buffering - :line ... enable buffering with automatic flushing on eol.") - -(definterface add-sigio-handler (socket fn) - "Call FN whenever SOCKET is readable.") - -(definterface remove-sigio-handlers (socket) - "Remove all sigio handlers for SOCKET.") - -(definterface add-fd-handler (socket fn) - "Call FN when Lisp is waiting for input and SOCKET is readable.") - -(definterface remove-fd-handlers (socket) - "Remove all fd-handlers for SOCKET.") - -(definterface preferred-communication-style () - "Return one of the symbols :spawn, :sigio, :fd-handler, or NIL." - nil) - -(definterface set-stream-timeout (stream timeout) - "Set the 'stream 'timeout. The timeout is either the real number - specifying the timeout in seconds or 'nil for no timeout." - (declare (ignore stream timeout)) - nil) - -;;; Base condition for networking errors. -(define-condition network-error (simple-error) ()) - -(definterface emacs-connected () - "Hook called when the first connection from Emacs is established. -Called from the INIT-FN of the socket server that accepts the -connection. - -This is intended for setting up extra context, e.g. to discover -that the calling thread is the one that interacts with Emacs." - nil) - - -;;;; Unix signals - -(defconstant +sigint+ 2) - -(definterface getpid () - "Return the (Unix) process ID of this superior Lisp.") - -(definterface install-sigint-handler (function) - "Call FUNCTION on SIGINT (instead of invoking the debugger). -Return old signal handler." - (declare (ignore function)) - nil) - -(definterface call-with-user-break-handler (handler function) - "Install the break handler HANDLER while executing FUNCTION." - (let ((old-handler (install-sigint-handler handler))) - (unwind-protect (funcall function) - (install-sigint-handler old-handler)))) - -(definterface quit-lisp () - "Exit the current lisp image.") - -(definterface lisp-implementation-type-name () - "Return a short name for the Lisp implementation." - (lisp-implementation-type)) - -(definterface lisp-implementation-program () - "Return the argv[0] of the running Lisp process, or NIL." - (let ((file (car (command-line-args)))) - (when (and file (probe-file file)) - (namestring (truename file))))) - -(definterface socket-fd (socket-stream) - "Return the file descriptor for SOCKET-STREAM.") - -(definterface make-fd-stream (fd external-format) - "Create a character stream for the file descriptor FD.") - -(definterface dup (fd) - "Duplicate a file descriptor. -If the syscall fails, signal a condition. -See dup(2).") - -(definterface exec-image (image-file args) - "Replace the current process with a new process image. -The new image is created by loading the previously dumped -core file IMAGE-FILE. -ARGS is a list of strings passed as arguments to -the new image. -This is thin wrapper around exec(3).") - -(definterface command-line-args () - "Return a list of strings as passed by the OS." - nil) - - -;; pathnames are sooo useless - -(definterface filename-to-pathname (filename) - "Return a pathname for FILENAME. -A filename in Emacs may for example contain asterisks which should not -be translated to wildcards." - (parse-namestring filename)) - -(definterface pathname-to-filename (pathname) - "Return the filename for PATHNAME." - (namestring pathname)) - -(definterface default-directory () - "Return the default directory." - (directory-namestring (truename *default-pathname-defaults*))) - -(definterface set-default-directory (directory) - "Set the default directory. -This is used to resolve filenames without directory component." - (setf *default-pathname-defaults* (truename (merge-pathnames directory))) - (default-directory)) - - -(definterface call-with-syntax-hooks (fn) - "Call FN with hooks to handle special syntax." - (funcall fn)) - -(definterface default-readtable-alist () - "Return a suitable initial value for SWANK:*READTABLE-ALIST*." - '()) - - -;;;; Packages - -(definterface package-local-nicknames (package) - "Returns an alist of (local-nickname . actual-package) describing the -nicknames local to the designated package." - (declare (ignore package)) - nil) - -(definterface find-locally-nicknamed-package (name base-package) - "Return the package whose local nickname in BASE-PACKAGE matches NAME. -Return NIL if local nicknames are not implemented or if there is no -such package." - (cdr (assoc name (package-local-nicknames base-package) :test #'string-equal))) - - -;;;; Compilation - -(definterface call-with-compilation-hooks (func) - "Call FUNC with hooks to record compiler conditions.") - -(defmacro with-compilation-hooks ((&rest ignore) &body body) - "Execute BODY as in CALL-WITH-COMPILATION-HOOKS." - (declare (ignore ignore)) - `(call-with-compilation-hooks (lambda () (progn ,@body)))) - -(definterface swank-compile-string (string &key buffer position filename - policy) - "Compile source from STRING. -During compilation, compiler conditions must be trapped and -resignalled as COMPILER-CONDITIONs. - -If supplied, BUFFER and POSITION specify the source location in Emacs. - -Additionally, if POSITION is supplied, it must be added to source -positions reported in compiler conditions. - -If FILENAME is specified it may be used by certain implementations to -rebind *DEFAULT-PATHNAME-DEFAULTS* which may improve the recording of -source information. - -If POLICY is supplied, and non-NIL, it may be used by certain -implementations to compile with optimization qualities of its -value. - -Should return T on successful compilation, NIL otherwise. -") - -(definterface swank-compile-file (input-file output-file load-p - external-format - &key policy) - "Compile INPUT-FILE signalling COMPILE-CONDITIONs. -If LOAD-P is true, load the file after compilation. -EXTERNAL-FORMAT is a value returned by find-external-format or -:default. - -If POLICY is supplied, and non-NIL, it may be used by certain -implementations to compile with optimization qualities of its -value. - -Should return OUTPUT-TRUENAME, WARNINGS-P and FAILURE-p -like `compile-file'") - -(deftype severity () - '(member :error :read-error :warning :style-warning :note :redefinition)) - -;; Base condition type for compiler errors, warnings and notes. -(define-condition compiler-condition (condition) - ((original-condition - ;; The original condition thrown by the compiler if appropriate. - ;; May be NIL if a compiler does not report using conditions. - :type (or null condition) - :initarg :original-condition - :accessor original-condition) - - (severity :type severity - :initarg :severity - :accessor severity) - - (message :initarg :message - :accessor message) - - ;; Macro expansion history etc. which may be helpful in some cases - ;; but is often very verbose. - (source-context :initarg :source-context - :type (or null string) - :initform nil - :accessor source-context) - - (references :initarg :references - :initform nil - :accessor references) - - (location :initarg :location - :accessor location))) - -(definterface find-external-format (coding-system) - "Return a \"external file format designator\" for CODING-SYSTEM. -CODING-SYSTEM is Emacs-style coding system name (a string), -e.g. \"latin-1-unix\"." - (if (equal coding-system "iso-latin-1-unix") - :default - nil)) - -(definterface guess-external-format (pathname) - "Detect the external format for the file with name pathname. -Return nil if the file contains no special markers." - ;; Look for a Emacs-style -*- coding: ... -*- or Local Variable: section. - (with-open-file (s pathname :if-does-not-exist nil - :external-format (or (find-external-format "latin-1-unix") - :default)) - (if s - (or (let* ((line (read-line s nil)) - (p (search "-*-" line))) - (when p - (let* ((start (+ p (length "-*-"))) - (end (search "-*-" line :start2 start))) - (when end - (%search-coding line start end))))) - (let* ((len (file-length s)) - (buf (make-string (min len 3000)))) - (file-position s (- len (length buf))) - (read-sequence buf s) - (let ((start (search "Local Variables:" buf :from-end t)) - (end (search "End:" buf :from-end t))) - (and start end (< start end) - (%search-coding buf start end)))))))) - -(defun %search-coding (str start end) - (let ((p (search "coding:" str :start2 start :end2 end))) - (when p - (incf p (length "coding:")) - (loop while (and (< p end) - (member (aref str p) '(#\space #\tab))) - do (incf p)) - (let ((end (position-if (lambda (c) (find c '(#\space #\tab #\newline #\;))) - str :start p))) - (find-external-format (subseq str p end)))))) - - -;;;; Streams - -(definterface make-output-stream (write-string) - "Return a new character output stream. -The stream calls WRITE-STRING when output is ready.") - -(definterface make-input-stream (read-string) - "Return a new character input stream. -The stream calls READ-STRING when input is needed.") - -(defvar *auto-flush-interval* 0.2) - -(defun auto-flush-loop (stream interval &optional receive) - (loop - (when (not (and (open-stream-p stream) - (output-stream-p stream))) - (return nil)) - (force-output stream) - (when receive - (receive-if #'identity)) - (sleep interval))) - -(definterface make-auto-flush-thread (stream) - "Make an auto-flush thread" - (spawn (lambda () (auto-flush-loop stream *auto-flush-interval* nil)) - :name "auto-flush-thread")) - - -;;;; Documentation - -(definterface arglist (name) - "Return the lambda list for the symbol NAME. NAME can also be -a lisp function object, on lisps which support this. - -The result can be a list or the :not-available keyword if the -arglist cannot be determined." - (declare (ignore name)) - :not-available) - -(defgeneric declaration-arglist (decl-identifier) - (:documentation - "Return the argument list of the declaration specifier belonging to the -declaration identifier DECL-IDENTIFIER. If the arglist cannot be determined, -the keyword :NOT-AVAILABLE is returned. - -The different SWANK backends can specialize this generic function to -include implementation-dependend declaration specifiers, or to provide -additional information on the specifiers defined in ANSI Common Lisp.") - (:method (decl-identifier) - (case decl-identifier - (dynamic-extent '(&rest variables)) - (ignore '(&rest variables)) - (ignorable '(&rest variables)) - (special '(&rest variables)) - (inline '(&rest function-names)) - (notinline '(&rest function-names)) - (declaration '(&rest names)) - (optimize '(&any compilation-speed debug safety space speed)) - (type '(type-specifier &rest args)) - (ftype '(type-specifier &rest function-names)) - (otherwise - (flet ((typespec-p (symbol) - (member :type (describe-symbol-for-emacs symbol)))) - (cond ((and (symbolp decl-identifier) (typespec-p decl-identifier)) - '(&rest variables)) - ((and (listp decl-identifier) - (typespec-p (first decl-identifier))) - '(&rest variables)) - (t :not-available))))))) - -(defgeneric type-specifier-arglist (typespec-operator) - (:documentation - "Return the argument list of the type specifier belonging to -TYPESPEC-OPERATOR.. If the arglist cannot be determined, the keyword -:NOT-AVAILABLE is returned. - -The different SWANK backends can specialize this generic function to -include implementation-dependend declaration specifiers, or to provide -additional information on the specifiers defined in ANSI Common Lisp.") - (:method (typespec-operator) - (declare (special *type-specifier-arglists*)) ; defined at end of file. - (typecase typespec-operator - (symbol (or (cdr (assoc typespec-operator *type-specifier-arglists*)) - :not-available)) - (t :not-available)))) - -(definterface type-specifier-p (symbol) - "Determine if SYMBOL is a type-specifier." - (or (documentation symbol 'type) - (not (eq (type-specifier-arglist symbol) :not-available)))) - -(definterface function-name (function) - "Return the name of the function object FUNCTION. - -The result is either a symbol, a list, or NIL if no function name is -available." - (declare (ignore function)) - nil) - -(definterface valid-function-name-p (form) - "Is FORM syntactically valid to name a function? - If true, FBOUNDP should not signal a type-error for FORM." - (flet ((length=2 (list) - (and (not (null (cdr list))) (null (cddr list))))) - (or (symbolp form) - (and (consp form) (length=2 form) - (eq (first form) 'setf) (symbolp (second form)))))) - -(definterface macroexpand-all (form &optional env) - "Recursively expand all macros in FORM. -Return the resulting form.") - -(definterface compiler-macroexpand-1 (form &optional env) - "Call the compiler-macro for form. -If FORM is a function call for which a compiler-macro has been -defined, invoke the expander function using *macroexpand-hook* and -return the results and T. Otherwise, return the original form and -NIL." - (let ((fun (and (consp form) - (valid-function-name-p (car form)) - (compiler-macro-function (car form) env)))) - (if fun - (let ((result (funcall *macroexpand-hook* fun form env))) - (values result (not (eq result form)))) - (values form nil)))) - -(definterface compiler-macroexpand (form &optional env) - "Repetitively call `compiler-macroexpand-1'." - (labels ((frob (form expanded) - (multiple-value-bind (new-form newly-expanded) - (compiler-macroexpand-1 form env) - (if newly-expanded - (frob new-form t) - (values new-form expanded))))) - (frob form env))) - -(defmacro with-collected-macro-forms - ((forms &optional result) instrumented-form &body body) - "Collect macro forms by locally binding *MACROEXPAND-HOOK*. - -Evaluates INSTRUMENTED-FORM and collects any forms which undergo -macro-expansion into a list. Then evaluates BODY with FORMS bound to -the list of forms, and RESULT (optionally) bound to the value of -INSTRUMENTED-FORM." - (assert (and (symbolp forms) (not (null forms)))) - (assert (symbolp result)) - (let ((result-symbol (or result (gensym)))) - `(call-with-collected-macro-forms - (lambda (,forms ,result-symbol) - (declare (ignore ,@(and (not result) - `(,result-symbol)))) - ,@body) - (lambda () ,instrumented-form)))) - -(defun call-with-collected-macro-forms (body-fn instrumented-fn) - (let ((return-value nil) - (collected-forms '())) - (let* ((real-macroexpand-hook *macroexpand-hook*) - (*macroexpand-hook* - (lambda (macro-function form environment) - (let ((result (funcall real-macroexpand-hook - macro-function form environment))) - (unless (eq result form) - (push form collected-forms)) - result)))) - (setf return-value (funcall instrumented-fn))) - (funcall body-fn collected-forms return-value))) - -(definterface collect-macro-forms (form &optional env) - "Collect subforms of FORM which undergo (compiler-)macro expansion. -Returns two values: a list of macro forms and a list of compiler macro -forms." - (with-collected-macro-forms (macro-forms expansion) - (ignore-errors (macroexpand-all form env)) - (with-collected-macro-forms (compiler-macro-forms) - (handler-bind ((warning #'muffle-warning)) - (ignore-errors - (compile nil `(lambda () ,expansion)))) - (values macro-forms compiler-macro-forms)))) - -(definterface format-string-expand (control-string) - "Expand the format string CONTROL-STRING." - (macroexpand `(formatter ,control-string))) - -(definterface describe-symbol-for-emacs (symbol) - "Return a property list describing SYMBOL. - -The property list has an entry for each interesting aspect of the -symbol. The recognised keys are: - - :VARIABLE :FUNCTION :SETF :SPECIAL-OPERATOR :MACRO :COMPILER-MACRO - :TYPE :CLASS :ALIEN-TYPE :ALIEN-STRUCT :ALIEN-UNION :ALIEN-ENUM - -The value of each property is the corresponding documentation string, -or NIL (or the obsolete :NOT-DOCUMENTED). It is legal to include keys -not listed here (but slime-print-apropos in Emacs must know about -them). - -Properties should be included if and only if they are applicable to -the symbol. For example, only (and all) fbound symbols should include -the :FUNCTION property. - -Example: -\(describe-symbol-for-emacs 'vector) - => (:CLASS :NOT-DOCUMENTED - :TYPE :NOT-DOCUMENTED - :FUNCTION \"Constructs a simple-vector from the given objects.\")") - -(definterface describe-definition (name type) - "Describe the definition NAME of TYPE. -TYPE can be any value returned by DESCRIBE-SYMBOL-FOR-EMACS. - -Return a documentation string, or NIL if none is available.") - - -;;;; Debugging - -(definterface install-debugger-globally (function) - "Install FUNCTION as the debugger for all threads/processes. This -usually involves setting *DEBUGGER-HOOK* and, if the implementation -permits, hooking into BREAK as well." - (setq *debugger-hook* function)) - -(definterface call-with-debugging-environment (debugger-loop-fn) - "Call DEBUGGER-LOOP-FN in a suitable debugging environment. - -This function is called recursively at each debug level to invoke the -debugger loop. The purpose is to setup any necessary environment for -other debugger callbacks that will be called within the debugger loop. - -For example, this is a reasonable place to compute a backtrace, switch -to safe reader/printer settings, and so on.") - -(definterface call-with-debugger-hook (hook fun) - "Call FUN and use HOOK as debugger hook. HOOK can be NIL. - -HOOK should be called for both BREAK and INVOKE-DEBUGGER." - (let ((*debugger-hook* hook)) - (funcall fun))) - -(define-condition sldb-condition (condition) - ((original-condition - :initarg :original-condition - :accessor original-condition)) - (:report (lambda (condition stream) - (format stream "Condition in debugger code~@[: ~A~]" - (original-condition condition)))) - (:documentation - "Wrapper for conditions that should not be debugged. - -When a condition arises from the internals of the debugger, it is not -desirable to debug it -- we'd risk entering an endless loop trying to -debug the debugger! Instead, such conditions can be reported to the -user without (re)entering the debugger by wrapping them as -`sldb-condition's.")) - -;;; The following functions in this section are supposed to be called -;;; within the dynamic contour of CALL-WITH-DEBUGGING-ENVIRONMENT only. - -(definterface compute-backtrace (start end) - "Returns a backtrace of the condition currently being debugged, -that is an ordered list consisting of frames. ``Ordered list'' -means that an integer I can be mapped back to the i-th frame of this -backtrace. - -START and END are zero-based indices constraining the number of frames -returned. Frame zero is defined as the frame which invoked the -debugger. If END is nil, return the frames from START to the end of -the stack.") - -(definterface print-frame (frame stream) - "Print frame to stream.") - -(definterface frame-restartable-p (frame) - "Is the frame FRAME restartable?. -Return T if `restart-frame' can safely be called on the frame." - (declare (ignore frame)) - nil) - -(definterface frame-source-location (frame-number) - "Return the source location for the frame associated to FRAME-NUMBER.") - -(definterface frame-catch-tags (frame-number) - "Return a list of catch tags for being printed in a debugger stack -frame." - (declare (ignore frame-number)) - '()) - -(definterface frame-locals (frame-number) - "Return a list of ((&key NAME ID VALUE) ...) where each element of -the list represents a local variable in the stack frame associated to -FRAME-NUMBER. - -NAME, a symbol; the name of the local variable. - -ID, an integer; used as primary key for the local variable, unique -relatively to the frame under operation. - -value, an object; the value of the local variable.") - -(definterface frame-var-value (frame-number var-id) - "Return the value of the local variable associated to VAR-ID -relatively to the frame associated to FRAME-NUMBER.") - -(definterface disassemble-frame (frame-number) - "Disassemble the code for the FRAME-NUMBER. -The output should be written to standard output. -FRAME-NUMBER is a non-negative integer.") - -(definterface eval-in-frame (form frame-number) - "Evaluate a Lisp form in the lexical context of a stack frame -in the debugger. - -FRAME-NUMBER must be a positive integer with 0 indicating the -frame which invoked the debugger. - -The return value is the result of evaulating FORM in the -appropriate context.") - -(definterface frame-package (frame-number) - "Return the package corresponding to the frame at FRAME-NUMBER. -Return nil if the backend can't figure it out." - (declare (ignore frame-number)) - nil) - -(definterface frame-call (frame-number) - "Return a string representing a call to the entry point of a frame.") - -(definterface return-from-frame (frame-number form) - "Unwind the stack to the frame FRAME-NUMBER and return the value(s) -produced by evaluating FORM in the frame context to its caller. - -Execute any clean-up code from unwind-protect forms above the frame -during unwinding. - -Return a string describing the error if it's not possible to return -from the frame.") - -(definterface restart-frame (frame-number) - "Restart execution of the frame FRAME-NUMBER with the same arguments -as it was called originally.") - -(definterface print-condition (condition stream) - "Print a condition for display in SLDB." - (princ condition stream)) - -(definterface condition-extras (condition) - "Return a list of extra for the debugger. -The allowed elements are of the form: - (:SHOW-FRAME-SOURCE frame-number) - (:REFERENCES &rest refs) -" - (declare (ignore condition)) - '()) - -(definterface gdb-initial-commands () - "List of gdb commands supposed to be executed first for the - ATTACH-GDB restart." - nil) - -(definterface activate-stepping (frame-number) - "Prepare the frame FRAME-NUMBER for stepping.") - -(definterface sldb-break-on-return (frame-number) - "Set a breakpoint in the frame FRAME-NUMBER.") - -(definterface sldb-break-at-start (symbol) - "Set a breakpoint on the beginning of the function for SYMBOL.") - -(definterface sldb-stepper-condition-p (condition) - "Return true if SLDB was invoked due to a single-stepping condition, -false otherwise. " - (declare (ignore condition)) - nil) - -(definterface sldb-step-into () - "Step into the current single-stepper form.") - -(definterface sldb-step-next () - "Step to the next form in the current function.") - -(definterface sldb-step-out () - "Stop single-stepping temporarily, but resume it once the current function -returns.") - - -;;;; Definition finding - -(defstruct (location (:type list) - (:constructor make-location - (buffer position &optional hints))) - (type :location) - buffer position - ;; Hints is a property list optionally containing: - ;; :snippet SOURCE-TEXT - ;; This is a snippet of the actual source text at the start of - ;; the definition, which could be used in a text search. - hints) - -(defmacro converting-errors-to-error-location (&body body) - "Catches errors during BODY and converts them to an error location." - (let ((gblock (gensym "CONVERTING-ERRORS+"))) - `(block ,gblock - (handler-bind ((error - #'(lambda (e) - (if *debug-swank-backend* - nil ;decline - (return-from ,gblock - (make-error-location e)))))) - ,@body)))) - -(defun make-error-location (datum &rest args) - (cond ((typep datum 'condition) - `(:error ,(format nil "Error: ~A" datum))) - ((symbolp datum) - `(:error ,(format nil "Error: ~A" - (apply #'make-condition datum args)))) - (t - (assert (stringp datum)) - `(:error ,(apply #'format nil datum args))))) - -(definterface find-definitions (name) - "Return a list ((DSPEC LOCATION) ...) for NAME's definitions. - -NAME is a \"definition specifier\". - -DSPEC is a \"definition specifier\" describing the -definition, e.g., FOO or (METHOD FOO (STRING NUMBER)) or -\(DEFVAR FOO). - -LOCATION is the source location for the definition.") - -(definterface find-source-location (object) - "Returns the source location of OBJECT, or NIL. - -That is the source location of the underlying datastructure of -OBJECT. E.g. on a STANDARD-OBJECT, the source location of the -respective DEFCLASS definition is returned, on a STRUCTURE-CLASS the -respective DEFSTRUCT definition, and so on." - ;; This returns one source location and not a list of locations. It's - ;; supposed to return the location of the DEFGENERIC definition on - ;; #'SOME-GENERIC-FUNCTION. - (declare (ignore object)) - (make-error-location "FIND-SOURCE-LOCATION is not yet implemented on ~ - this implementation.")) - -(definterface buffer-first-change (filename) - "Called for effect the first time FILENAME's buffer is modified. -CMUCL/SBCL use this to cache the unmodified file and use the -unmodified text to improve the precision of source locations." - (declare (ignore filename)) - nil) - - - -;;;; XREF - -(definterface who-calls (function-name) - "Return the call sites of FUNCTION-NAME (a symbol). -The results is a list ((DSPEC LOCATION) ...)." - (declare (ignore function-name)) - :not-implemented) - -(definterface calls-who (function-name) - "Return the call sites of FUNCTION-NAME (a symbol). -The results is a list ((DSPEC LOCATION) ...)." - (declare (ignore function-name)) - :not-implemented) - -(definterface who-references (variable-name) - "Return the locations where VARIABLE-NAME (a symbol) is referenced. -See WHO-CALLS for a description of the return value." - (declare (ignore variable-name)) - :not-implemented) - -(definterface who-binds (variable-name) - "Return the locations where VARIABLE-NAME (a symbol) is bound. -See WHO-CALLS for a description of the return value." - (declare (ignore variable-name)) - :not-implemented) - -(definterface who-sets (variable-name) - "Return the locations where VARIABLE-NAME (a symbol) is set. -See WHO-CALLS for a description of the return value." - (declare (ignore variable-name)) - :not-implemented) - -(definterface who-macroexpands (macro-name) - "Return the locations where MACRO-NAME (a symbol) is expanded. -See WHO-CALLS for a description of the return value." - (declare (ignore macro-name)) - :not-implemented) - -(definterface who-specializes (class-name) - "Return the locations where CLASS-NAME (a symbol) is specialized. -See WHO-CALLS for a description of the return value." - (declare (ignore class-name)) - :not-implemented) - -;;; Simpler variants. - -(definterface list-callers (function-name) - "List the callers of FUNCTION-NAME. -This function is like WHO-CALLS except that it is expected to use -lower-level means. Whereas WHO-CALLS is usually implemented with -special compiler support, LIST-CALLERS is usually implemented by -groveling for constants in function objects throughout the heap. - -The return value is as for WHO-CALLS.") - -(definterface list-callees (function-name) - "List the functions called by FUNCTION-NAME. -See LIST-CALLERS for a description of the return value.") - - -;;;; Profiling - -;;; The following functions define a minimal profiling interface. - -(definterface profile (fname) - "Marks symbol FNAME for profiling.") - -(definterface profiled-functions () - "Returns a list of profiled functions.") - -(definterface unprofile (fname) - "Marks symbol FNAME as not profiled.") - -(definterface unprofile-all () - "Marks all currently profiled functions as not profiled." - (dolist (f (profiled-functions)) - (unprofile f))) - -(definterface profile-report () - "Prints profile report.") - -(definterface profile-reset () - "Resets profile counters.") - -(definterface profile-package (package callers-p methods) - "Wrap profiling code around all functions in PACKAGE. If a function -is already profiled, then unprofile and reprofile (useful to notice -function redefinition.) - -If CALLERS-P is T names have counts of the most common calling -functions recorded. - -When called with arguments :METHODS T, profile all methods of all -generic functions having names in the given package. Generic functions -themselves, that is, their dispatch functions, are left alone.") - - -;;;; Trace - -(definterface toggle-trace (spec) - "Toggle tracing of the function(s) given with SPEC. -SPEC can be: - (setf NAME) ; a setf function - (:defmethod NAME QUALIFIER... (SPECIALIZER...)) ; a specific method - (:defgeneric NAME) ; a generic function with all methods - (:call CALLER CALLEE) ; trace calls from CALLER to CALLEE. - (:labels TOPLEVEL LOCAL) - (:flet TOPLEVEL LOCAL) ") - - -;;;; Inspector - -(defgeneric emacs-inspect (object) - (:documentation - "Explain to Emacs how to inspect OBJECT. - -Returns a list specifying how to render the object for inspection. - -Every element of the list must be either a string, which will be -inserted into the buffer as is, or a list of the form: - - (:value object &optional format) - Render an inspectable - object. If format is provided it must be a string and will be - rendered in place of the value, otherwise use princ-to-string. - - (:newline) - Render a \\n - - (:action label lambda &key (refresh t)) - Render LABEL (a text - string) which when clicked will call LAMBDA. If REFRESH is - non-NIL the currently inspected object will be re-inspected - after calling the lambda. -")) - -(defmethod emacs-inspect ((object t)) - "Generic method for inspecting any kind of object. - -Since we don't know how to deal with OBJECT we simply dump the -output of CL:DESCRIBE." - `("Type: " (:value ,(type-of object)) (:newline) - "Don't know how to inspect the object, dumping output of CL:DESCRIBE:" - (:newline) (:newline) - ,(with-output-to-string (desc) (describe object desc)))) - -(definterface eval-context (object) - "Return a list of bindings corresponding to OBJECT's slots." - (declare (ignore object)) - '()) - -;;; Utilities for inspector methods. -;;; - -(defun label-value-line (label value &key (newline t)) - "Create a control list which prints \"LABEL: VALUE\" in the inspector. -If NEWLINE is non-NIL a `(:newline)' is added to the result." - (list* (princ-to-string label) ": " `(:value ,value) - (if newline '((:newline)) nil))) - -(defmacro label-value-line* (&rest label-values) - ` (append ,@(loop for (label value) in label-values - collect `(label-value-line ,label ,value)))) - -(definterface describe-primitive-type (object) - "Return a string describing the primitive type of object." - (declare (ignore object)) - "N/A") - - -;;;; Multithreading -;;; -;;; The default implementations are sufficient for non-multiprocessing -;;; implementations. - -(definterface initialize-multiprocessing (continuation) - "Initialize multiprocessing, if necessary and then invoke CONTINUATION. - -Depending on the impleimentaion, this function may never return." - (funcall continuation)) - -(definterface spawn (fn &key name) - "Create a new thread to call FN.") - -(definterface thread-id (thread) - "Return an Emacs-parsable object to identify THREAD. - -Ids should be comparable with equal, i.e.: - (equal (thread-id ) (thread-id )) <==> (eq )" - thread) - -(definterface find-thread (id) - "Return the thread for ID. -ID should be an id previously obtained with THREAD-ID. -Can return nil if the thread no longer exists." - (declare (ignore id)) - (current-thread)) - -(definterface thread-name (thread) - "Return the name of THREAD. -Thread names are short strings meaningful to the user. They do not -have to be unique." - (declare (ignore thread)) - "The One True Thread") - -(definterface thread-status (thread) - "Return a string describing THREAD's state." - (declare (ignore thread)) - "") - -(definterface thread-attributes (thread) - "Return a plist of implementation-dependent attributes for THREAD" - (declare (ignore thread)) - '()) - -(definterface current-thread () - "Return the currently executing thread." - 0) - -(definterface all-threads () - "Return a fresh list of all threads." - '()) - -(definterface thread-alive-p (thread) - "Test if THREAD is termintated." - (member thread (all-threads))) - -(definterface interrupt-thread (thread fn) - "Cause THREAD to execute FN.") - -(definterface kill-thread (thread) - "Terminate THREAD immediately. -Don't execute unwind-protected sections, don't raise conditions. -(Do not pass go, do not collect $200.)" - (declare (ignore thread)) - nil) - -(definterface send (thread object) - "Send OBJECT to thread THREAD." - (declare (ignore thread)) - object) - -(definterface receive (&optional timeout) - "Return the next message from current thread's mailbox." - (receive-if (constantly t) timeout)) - -(definterface receive-if (predicate &optional timeout) - "Return the first message satisfiying PREDICATE.") - -(definterface wake-thread (thread) - "Trigger a call to CHECK-SLIME-INTERRUPTS in THREAD without using -asynchronous interrupts." - (declare (ignore thread)) - ;; Doesn't have to implement this if RECEIVE-IF periodically calls - ;; CHECK-SLIME-INTERRUPTS, but that's energy inefficient - nil) - -(definterface register-thread (name thread) - "Associate the thread THREAD with the symbol NAME. -The thread can then be retrieved with `find-registered'. -If THREAD is nil delete the association." - (declare (ignore name thread)) - nil) - -(definterface find-registered (name) - "Find the thread that was registered for the symbol NAME. -Return nil if the no thread was registred or if the tread is dead." - (declare (ignore name)) - nil) - -(definterface set-default-initial-binding (var form) - "Initialize special variable VAR by default with FORM. - -Some implementations initialize certain variables in each newly -created thread. This function sets the form which is used to produce -the initial value." - (set var (eval form))) - -;; List of delayed interrupts. -;; This should only have thread-local bindings, so no init form. -(defvar *pending-slime-interrupts*) - -(defun check-slime-interrupts () - "Execute pending interrupts if any. -This should be called periodically in operations which -can take a long time to complete. -Return a boolean indicating whether any interrupts was processed." - (when (and (boundp '*pending-slime-interrupts*) - *pending-slime-interrupts*) - (funcall (pop *pending-slime-interrupts*)) - t)) - -(defvar *interrupt-queued-handler* nil - "Function to call on queued interrupts. -Interrupts get queued when an interrupt occurs while interrupt -handling is disabled. - -Backends can use this function to abort slow operations.") - -(definterface wait-for-input (streams &optional timeout) - "Wait for input on a list of streams. Return those that are ready. -STREAMS is a list of streams -TIMEOUT nil, t, or real number. If TIMEOUT is t, return those streams -which are ready (or have reached end-of-file) without waiting. -If TIMEOUT is a number and no streams is ready after TIMEOUT seconds, -return nil. - -Return :interrupt if an interrupt occurs while waiting." - (declare (ignore streams timeout)) - ;; Invoking the slime debugger will just endlessly loop. - (call-with-debugger-hook - nil - (lambda () - (error "~s not implemented. Check if ~s = ~s is supported by the implementation." - 'wait-for-input 'swank:*communication-style* swank:*communication-style*)))) - - -;;;; Locks - -;; Please use locks only in swank-gray.lisp. Locks are too low-level -;; for our taste. - -(definterface make-lock (&key name) - "Make a lock for thread synchronization. -Only one thread may hold the lock (via CALL-WITH-LOCK-HELD) at a time -but that thread may hold it more than once." - (declare (ignore name)) - :null-lock) - -(definterface call-with-lock-held (lock function) - "Call FUNCTION with LOCK held, queueing if necessary." - (declare (ignore lock) - (type function function)) - (funcall function)) - - -;;;; Weak datastructures - -(definterface make-weak-key-hash-table (&rest args) - "Like MAKE-HASH-TABLE, but weak w.r.t. the keys." - (apply #'make-hash-table args)) - -(definterface make-weak-value-hash-table (&rest args) - "Like MAKE-HASH-TABLE, but weak w.r.t. the values." - (apply #'make-hash-table args)) - -(definterface hash-table-weakness (hashtable) - "Return nil or one of :key :value :key-or-value :key-and-value" - (declare (ignore hashtable)) - nil) - - -;;;; Floating point - -(definterface float-nan-p (float) - "Return true if FLOAT is a NaN value (Not a Number)." - ;; When the float type implements IEEE-754 floats, two NaN values - ;; are never equal; when the implementation does not support NaN, - ;; the predicate should return false. An implementation can - ;; implement comparison with "unordered-signaling predicates", which - ;; emit floating point exceptions. - (handler-case (not (= float float)) - ;; Comparisons never signal an exception other than the invalid - ;; operation exception (5.11 Details of comparison predicates). - (floating-point-invalid-operation () t))) - -(definterface float-infinity-p (float) - "Return true if FLOAT is positive or negative infinity." - (not (< most-negative-long-float - float - most-positive-long-float))) - - -;;;; Character names - -(definterface character-completion-set (prefix matchp) - "Return a list of names of characters that match PREFIX." - ;; Handle the standard and semi-standard characters. - (loop for name in '("Newline" "Space" "Tab" "Page" "Rubout" - "Linefeed" "Return" "Backspace") - when (funcall matchp prefix name) - collect name)) - - -(defparameter *type-specifier-arglists* - '((and . (&rest type-specifiers)) - (array . (&optional element-type dimension-spec)) - (base-string . (&optional size)) - (bit-vector . (&optional size)) - (complex . (&optional type-specifier)) - (cons . (&optional car-typespec cdr-typespec)) - (double-float . (&optional lower-limit upper-limit)) - (eql . (object)) - (float . (&optional lower-limit upper-limit)) - (function . (&optional arg-typespec value-typespec)) - (integer . (&optional lower-limit upper-limit)) - (long-float . (&optional lower-limit upper-limit)) - (member . (&rest eql-objects)) - (mod . (n)) - (not . (type-specifier)) - (or . (&rest type-specifiers)) - (rational . (&optional lower-limit upper-limit)) - (real . (&optional lower-limit upper-limit)) - (satisfies . (predicate-symbol)) - (short-float . (&optional lower-limit upper-limit)) - (signed-byte . (&optional size)) - (simple-array . (&optional element-type dimension-spec)) - (simple-base-string . (&optional size)) - (simple-bit-vector . (&optional size)) - (simple-string . (&optional size)) - (single-float . (&optional lower-limit upper-limit)) - (simple-vector . (&optional size)) - (string . (&optional size)) - (unsigned-byte . (&optional size)) - (values . (&rest typespecs)) - (vector . (&optional element-type size)) - )) - -;;; Heap dumps - -(definterface save-image (filename &optional restart-function) - "Save a heap image to the file FILENAME. -RESTART-FUNCTION, if non-nil, should be called when the image is loaded.") - -(definterface background-save-image (filename &key restart-function - completion-function) - "Request saving a heap image to the file FILENAME. -RESTART-FUNCTION, if non-nil, should be called when the image is loaded. -COMPLETION-FUNCTION, if non-nil, should be called after saving the image.") - -(defun deinit-log-output () - ;; Can't hang on to an fd-stream from a previous session. - (setf *log-output* nil)) - - -;;;; Wrapping - -(definterface wrap (spec indicator &key before after replace) - "Intercept future calls to SPEC and surround them in callbacks. - -INDICATOR is a symbol identifying a particular wrapping, and is used -to differentiate between multiple wrappings. - -Implementations intercept calls to SPEC and call, in this order: - -* the BEFORE callback, if it's provided, with a single argument set to - the list of arguments passed to the intercepted call; - -* the original definition of SPEC recursively honouring any wrappings - previously established under different values of INDICATOR. If the - compatible function REPLACE is provided, call that instead. - -* the AFTER callback, if it's provided, with a single set to the list - of values returned by the previous call, or, if that call exited - non-locally, a single descriptive symbol, like :EXITED-NON-LOCALLY." - (declare (ignore indicator)) - (assert (symbolp spec) nil - "The default implementation for WRAP allows only simple names") - (assert (null (get spec 'slime-wrap)) nil - "The default implementation for WRAP allows a single wrapping") - (let* ((saved (symbol-function spec)) - (replacement (lambda (&rest args) - (let (retlist completed) - (unwind-protect - (progn - (when before - (funcall before args)) - (setq retlist (multiple-value-list - (apply (or replace - saved) args))) - (setq completed t) - (values-list retlist)) - (when after - (funcall after (if completed - retlist - :exited-non-locally)))))))) - (setf (get spec 'slime-wrap) (list saved replacement)) - (setf (symbol-function spec) replacement)) - spec) - -(definterface unwrap (spec indicator) - "Remove from SPEC any wrappings tagged with INDICATOR." - (if (wrapped-p spec indicator) - (setf (symbol-function spec) (first (get spec 'slime-wrap))) - (cerror "All right, so I did" - "Hmmm, ~a is not correctly wrapped, you probably redefined it" - spec)) - (setf (get spec 'slime-wrap) nil) - spec) - -(definterface wrapped-p (spec indicator) - "Returns true if SPEC is wrapped with INDICATOR." - (declare (ignore indicator)) - (and (symbolp spec) - (let ((prop-value (get spec 'slime-wrap))) - (cond ((and prop-value - (not (eq (second prop-value) - (symbol-function spec)))) - (warn "~a appears to be incorrectly wrapped" spec) - nil) - (prop-value t) - (t nil))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/ccl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/ccl.lisp deleted file mode 100644 index 61f3f5e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/ccl.lisp +++ /dev/null @@ -1,868 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- -;;; -;;; swank-ccl.lisp --- SLIME backend for Clozure CL. -;;; -;;; Copyright (C) 2003, James Bielman -;;; -;;; This program is licensed under the terms of the Lisp Lesser GNU -;;; Public License, known as the LLGPL, and distributed with Clozure CL -;;; as the file "LICENSE". The LLGPL consists of a preamble and the -;;; LGPL, which is distributed with Clozure CL as the file "LGPL". Where -;;; these conflict, the preamble takes precedence. -;;; -;;; The LLGPL is also available online at -;;; http://opensource.franz.com/preamble.html - -(defpackage swank/ccl - (:use cl swank/backend)) - -(in-package swank/ccl) - -(eval-when (:compile-toplevel :execute :load-toplevel) - (assert (and (= ccl::*openmcl-major-version* 1) - (>= ccl::*openmcl-minor-version* 4)) - () "This file needs CCL version 1.4 or newer")) - -(defimplementation gray-package-name () - "CCL") - -(eval-when (:compile-toplevel :load-toplevel :execute) - (multiple-value-bind (ok err) (ignore-errors (require 'xref)) - (unless ok - (warn "~a~%" err)))) - -;;; swank-mop - -(import-to-swank-mop - '( ;; classes - cl:standard-generic-function - ccl:standard-slot-definition - cl:method - cl:standard-class - ccl:eql-specializer - openmcl-mop:finalize-inheritance - openmcl-mop:compute-applicable-methods-using-classes - ;; standard-class readers - openmcl-mop:class-default-initargs - openmcl-mop:class-direct-default-initargs - openmcl-mop:class-direct-slots - openmcl-mop:class-direct-subclasses - openmcl-mop:class-direct-superclasses - openmcl-mop:class-finalized-p - cl:class-name - openmcl-mop:class-precedence-list - openmcl-mop:class-prototype - openmcl-mop:class-slots - openmcl-mop:specializer-direct-methods - ;; eql-specializer accessors - openmcl-mop:eql-specializer-object - ;; generic function readers - openmcl-mop:generic-function-argument-precedence-order - openmcl-mop:generic-function-declarations - openmcl-mop:generic-function-lambda-list - openmcl-mop:generic-function-methods - openmcl-mop:generic-function-method-class - openmcl-mop:generic-function-method-combination - openmcl-mop:generic-function-name - ;; method readers - openmcl-mop:method-generic-function - openmcl-mop:method-function - openmcl-mop:method-lambda-list - openmcl-mop:method-specializers - openmcl-mop:method-qualifiers - ;; slot readers - openmcl-mop:slot-definition-allocation - openmcl-mop:slot-definition-documentation - openmcl-mop:slot-value-using-class - openmcl-mop:slot-definition-initargs - openmcl-mop:slot-definition-initform - openmcl-mop:slot-definition-initfunction - openmcl-mop:slot-definition-name - openmcl-mop:slot-definition-type - openmcl-mop:slot-definition-readers - openmcl-mop:slot-definition-writers - openmcl-mop:slot-boundp-using-class - openmcl-mop:slot-makunbound-using-class)) - -;;; UTF8 - -(defimplementation string-to-utf8 (string) - (ccl:encode-string-to-octets string :external-format :utf-8)) - -(defimplementation utf8-to-string (octets) - (ccl:decode-string-from-octets octets :external-format :utf-8)) - -;;; TCP Server - -(defimplementation preferred-communication-style () - :spawn) - -(defimplementation create-socket (host port &key backlog) - (ccl:make-socket :connect :passive :local-port port - :local-host host :reuse-address t - :backlog (or backlog 5))) - -(defimplementation local-port (socket) - (ccl:local-port socket)) - -(defimplementation close-socket (socket) - (close socket)) - -(defimplementation accept-connection (socket &key external-format - buffering timeout) - (declare (ignore buffering timeout)) - (let ((stream-args (and external-format - `(:external-format ,external-format)))) - (ccl:accept-connection socket :wait t :stream-args stream-args))) - -(defvar *external-format-to-coding-system* - '((:iso-8859-1 - "latin-1" "latin-1-unix" "iso-latin-1-unix" - "iso-8859-1" "iso-8859-1-unix") - (:utf-8 "utf-8" "utf-8-unix"))) - -(defimplementation find-external-format (coding-system) - (car (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*))) - -(defimplementation socket-fd (stream) - (ccl::ioblock-device (ccl::stream-ioblock stream t))) - -;;; Unix signals - -(defimplementation getpid () - (ccl::getpid)) - -(defimplementation lisp-implementation-type-name () - "ccl") - -;;; Arglist - -(defimplementation arglist (fname) - (multiple-value-bind (arglist binding) (let ((*break-on-signals* nil)) - (ccl:arglist fname)) - (if binding - arglist - :not-available))) - -(defimplementation function-name (function) - (ccl:function-name function)) - -(defmethod declaration-arglist ((decl-identifier (eql 'optimize))) - (let ((flags (ccl:declaration-information decl-identifier))) - (if flags - `(&any ,flags) - (call-next-method)))) - -;;; Compilation - -(defun handle-compiler-warning (condition) - "Resignal a ccl:compiler-warning as swank/backend:compiler-warning." - (signal 'compiler-condition - :original-condition condition - :message (compiler-warning-short-message condition) - :source-context nil - :severity (compiler-warning-severity condition) - :location (source-note-to-source-location - (ccl:compiler-warning-source-note condition) - (lambda () "Unknown source") - (ccl:compiler-warning-function-name condition)))) - -(defgeneric compiler-warning-severity (condition)) -(defmethod compiler-warning-severity ((c ccl:compiler-warning)) :warning) -(defmethod compiler-warning-severity ((c ccl:style-warning)) :style-warning) - -(defgeneric compiler-warning-short-message (condition)) - -;; Pretty much the same as ccl:report-compiler-warning but -;; without the source position and function name stuff. -(defmethod compiler-warning-short-message ((c ccl:compiler-warning)) - (with-output-to-string (stream) - (ccl:report-compiler-warning c stream :short t))) - -;; Needed because `ccl:report-compiler-warning' would return -;; "Nonspecific warning". -(defmethod compiler-warning-short-message ((c ccl::shadowed-typecase-clause)) - (princ-to-string c)) - -(defimplementation call-with-compilation-hooks (function) - (handler-bind ((ccl:compiler-warning 'handle-compiler-warning)) - (let ((ccl:*merge-compiler-warnings* nil)) - (funcall function)))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (with-compilation-hooks () - (compile-file input-file - :output-file output-file - :load load-p - :external-format external-format))) - -;; Use a temp file rather than in-core compilation in order to handle -;; eval-when's as compile-time. -(defimplementation swank-compile-string (string &key buffer position filename - policy) - (declare (ignore policy)) - (with-compilation-hooks () - (let ((temp-file-name (ccl:temp-pathname)) - (ccl:*save-source-locations* t)) - (unwind-protect - (progn - (with-open-file (s temp-file-name :direction :output - :if-exists :error :external-format :utf-8) - (write-string string s)) - (let ((binary-filename (compile-temp-file - temp-file-name filename buffer position))) - (delete-file binary-filename))) - (delete-file temp-file-name))))) - -(defvar *temp-file-map* (make-hash-table :test #'equal) - "A mapping from tempfile names to Emacs buffer names.") - -(defun compile-temp-file (temp-file-name buffer-file-name buffer-name offset) - (compile-file temp-file-name - :load t - :compile-file-original-truename - (or buffer-file-name - (progn - (setf (gethash temp-file-name *temp-file-map*) - buffer-name) - temp-file-name)) - :compile-file-original-buffer-offset (1- offset) - :external-format :utf-8)) - -(defimplementation save-image (filename &optional restart-function) - (ccl:save-application filename :toplevel-function restart-function)) - -;;; Cross-referencing - -(defun xref-locations (relation name &optional inverse) - (delete-duplicates - (mapcan #'find-definitions - (if inverse - (ccl::get-relation relation name :wild :exhaustive t) - (ccl::get-relation relation :wild name :exhaustive t))) - :test 'equal)) - -(defimplementation who-binds (name) - (xref-locations :binds name)) - -(defimplementation who-macroexpands (name) - (xref-locations :macro-calls name t)) - -(defimplementation who-references (name) - (remove-duplicates - (append (xref-locations :references name) - (xref-locations :sets name) - (xref-locations :binds name)) - :test 'equal)) - -(defimplementation who-sets (name) - (xref-locations :sets name)) - -(defimplementation who-calls (name) - (remove-duplicates - (append - (xref-locations :direct-calls name) - (xref-locations :indirect-calls name) - (xref-locations :macro-calls name t)) - :test 'equal)) - -(defimplementation who-specializes (class) - (when (symbolp class) - (setq class (find-class class nil))) - (when class - (delete-duplicates - (mapcar (lambda (m) - (car (find-definitions m))) - (ccl:specializer-direct-methods class)) - :test 'equal))) - -(defimplementation list-callees (name) - (remove-duplicates - (append - (xref-locations :direct-calls name t) - (xref-locations :macro-calls name nil)) - :test 'equal)) - -(defimplementation list-callers (symbol) - (delete-duplicates - (mapcan #'find-definitions (ccl:caller-functions symbol)) - :test #'equal)) - -;;; Profiling (alanr: lifted from swank-clisp) - -(defimplementation profile (fname) - (eval `(swank-monitor:monitor ,fname))) ;monitor is a macro - -(defimplementation profiled-functions () - swank-monitor:*monitored-functions*) - -(defimplementation unprofile (fname) - (eval `(swank-monitor:unmonitor ,fname))) ;unmonitor is a macro - -(defimplementation unprofile-all () - (swank-monitor:unmonitor)) - -(defimplementation profile-report () - (swank-monitor:report-monitoring)) - -(defimplementation profile-reset () - (swank-monitor:reset-all-monitoring)) - -(defimplementation profile-package (package callers-p methods) - (declare (ignore callers-p methods)) - (swank-monitor:monitor-all package)) - -;;; Debugging - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (let* (;;(*debugger-hook* nil) - ;; don't let error while printing error take us down - (ccl:*signal-printing-errors* nil)) - (funcall debugger-loop-fn))) - -;; This is called for an async interrupt and is running in a random -;; thread not selected by the user, so don't use thread-local vars -;; such as *emacs-connection*. -(defun find-repl-thread () - (let* ((*break-on-signals* nil) - (conn (swank::default-connection))) - (and (swank::multithreaded-connection-p conn) - (swank::mconn.repl-thread conn)))) - -(defimplementation call-with-debugger-hook (hook fun) - (let ((*debugger-hook* hook) - (ccl:*break-hook* hook) - (ccl:*select-interactive-process-hook* 'find-repl-thread)) - (funcall fun))) - -(defimplementation install-debugger-globally (function) - (setq *debugger-hook* function) - (setq ccl:*break-hook* function) - (setq ccl:*select-interactive-process-hook* 'find-repl-thread) - ) - -(defun map-backtrace (function &optional - (start-frame-number 0) - end-frame-number) - "Call FUNCTION passing information about each stack frame - from frames START-FRAME-NUMBER to END-FRAME-NUMBER." - (let ((end-frame-number (or end-frame-number most-positive-fixnum))) - (ccl:map-call-frames function - :origin ccl:*top-error-frame* - :start-frame-number start-frame-number - :count (- end-frame-number start-frame-number)))) - -(defimplementation compute-backtrace (start-frame-number end-frame-number) - (let (result) - (map-backtrace (lambda (p context) - (push (list :frame p context) result)) - start-frame-number end-frame-number) - (nreverse result))) - -(defimplementation print-frame (frame stream) - (assert (eq (first frame) :frame)) - (destructuring-bind (p context) (rest frame) - (let ((lfun (ccl:frame-function p context))) - (format stream "(~S" (or (ccl:function-name lfun) lfun)) - (let* ((unavailable (cons nil nil)) - (args (ccl:frame-supplied-arguments p context - :unknown-marker unavailable))) - (declare (dynamic-extent unavailable)) - (if (eq args unavailable) - (format stream " #") - (dolist (arg args) - (if (eq arg unavailable) - (format stream " #") - (format stream " ~s" arg))))) - (format stream ")")))) - -(defmacro with-frame ((p context) frame-number &body body) - `(call/frame ,frame-number (lambda (,p ,context) . ,body))) - -(defun call/frame (frame-number if-found) - (map-backtrace - (lambda (p context) - (return-from call/frame - (funcall if-found p context))) - frame-number)) - -(defimplementation frame-call (frame-number) - (with-frame (p context) frame-number - (with-output-to-string (stream) - (print-frame (list :frame p context) stream)))) - -(defimplementation frame-var-value (frame var) - (with-frame (p context) frame - (cdr (nth var (ccl:frame-named-variables p context))))) - -(defimplementation frame-locals (index) - (with-frame (p context) index - (loop for (name . value) in (ccl:frame-named-variables p context) - collect (list :name name :value value :id 0)))) - -(defimplementation frame-source-location (index) - (with-frame (p context) index - (multiple-value-bind (lfun pc) (ccl:frame-function p context) - (if pc - (pc-source-location lfun pc) - (function-source-location lfun))))) - -(defun function-name-package (name) - (etypecase name - (null nil) - (symbol (symbol-package name)) - ((cons (eql ccl::traced)) (function-name-package (second name))) - ((cons (eql setf)) (symbol-package (second name))) - ((cons (eql :internal)) (function-name-package (car (last name)))) - ((cons (and symbol (not keyword)) (or (cons list null) - (cons keyword (cons list null)))) - (symbol-package (car name))) - (standard-method (function-name-package (ccl:method-name name))))) - -(defimplementation frame-package (frame-number) - (with-frame (p context) frame-number - (let* ((lfun (ccl:frame-function p context)) - (name (ccl:function-name lfun))) - (function-name-package name)))) - -(defimplementation eval-in-frame (form index) - (with-frame (p context) index - (let ((vars (ccl:frame-named-variables p context))) - (eval `(let ,(loop for (var . val) in vars collect `(,var ',val)) - (declare (ignorable ,@(mapcar #'car vars))) - ,form))))) - -(defimplementation return-from-frame (index form) - (let ((values (multiple-value-list (eval-in-frame form index)))) - (with-frame (p context) index - (declare (ignore context)) - (ccl:apply-in-frame p #'values values)))) - -(defimplementation restart-frame (index) - (with-frame (p context) index - (ccl:apply-in-frame p - (ccl:frame-function p context) - (ccl:frame-supplied-arguments p context)))) - -(defimplementation disassemble-frame (the-frame-number) - (with-frame (p context) the-frame-number - (multiple-value-bind (lfun pc) (ccl:frame-function p context) - (format t "LFUN: ~a~%PC: ~a FP: #x~x CONTEXT: ~a~%" lfun pc p context) - (disassemble lfun)))) - -;; CCL commit r11373 | gz | 2008-11-16 16:35:28 +0100 (Sun, 16 Nov 2008) -;; contains some interesting details: -;; -;; Source location are recorded in CCL:SOURCE-NOTE's, which are objects -;; with accessors CCL:SOURCE-NOTE-FILENAME, CCL:SOURCE-NOTE-START-POS, -;; CCL:SOURCE-NOTE-END-POS and CCL:SOURCE-NOTE-TEXT. The start and end -;; positions are file positions (not character positions). The text will -;; be NIL unless text recording was on at read-time. If the original -;; file is still available, you can force missing source text to be read -;; from the file at runtime via CCL:ENSURE-SOURCE-NOTE-TEXT. -;; -;; Source-note's are associated with definitions (via record-source-file) -;; and also stored in function objects (including anonymous and nested -;; functions). The former can be retrieved via -;; CCL:FIND-DEFINITION-SOURCES, the latter via CCL:FUNCTION-SOURCE-NOTE. -;; -;; The recording behavior is controlled by the new variable -;; CCL:*SAVE-SOURCE-LOCATIONS*: -;; -;; If NIL, don't store source-notes in function objects, and store only -;; the filename for definitions (the latter only if -;; *record-source-file* is true). -;; -;; If T, store source-notes, including a copy of the original source -;; text, for function objects and definitions (the latter only if -;; *record-source-file* is true). -;; -;; If :NO-TEXT, store source-notes, but without saved text, for -;; function objects and defintions (the latter only if -;; *record-source-file* is true). This is the default. -;; -;; PC to source mapping is controlled by the new variable -;; CCL:*RECORD-PC-MAPPING*. If true (the default), functions store a -;; compressed table mapping pc offsets to corresponding source locations. -;; This can be retrieved by (CCL:FIND-SOURCE-NOTE-AT-PC function pc) -;; which returns a source-note for the source at offset pc in the -;; function. - -(defun function-source-location (function) - (source-note-to-source-location - (or (ccl:function-source-note function) - (function-name-source-note function)) - (lambda () - (format nil "Function has no source note: ~A" function)) - (ccl:function-name function))) - -(defun pc-source-location (function pc) - (source-note-to-source-location - (or (ccl:find-source-note-at-pc function pc) - (ccl:function-source-note function) - (function-name-source-note function)) - (lambda () - (format nil "No source note at PC: ~a[~d]" function pc)) - (ccl:function-name function))) - -(defun function-name-source-note (fun) - (let ((defs (ccl:find-definition-sources (ccl:function-name fun) 'function))) - (and defs - (destructuring-bind ((type . name) srcloc . srclocs) (car defs) - (declare (ignore type name srclocs)) - srcloc)))) - -(defun source-note-to-source-location (source if-nil-thunk &optional name) - (labels ((filename-to-buffer (filename) - (cond ((gethash filename *temp-file-map*) - (list :buffer (gethash filename *temp-file-map*))) - ((probe-file filename) - (list :file (ccl:native-translated-namestring - (truename filename)))) - (t (error "File ~s doesn't exist" filename))))) - (handler-case - (cond ((ccl:source-note-p source) - (let* ((full-text (ccl:source-note-text source)) - (file-name (ccl:source-note-filename source)) - (start-pos (ccl:source-note-start-pos source))) - (make-location - (when file-name (filename-to-buffer (pathname file-name))) - (when start-pos (list :position (1+ start-pos))) - (when full-text - (list :snippet (subseq full-text 0 - (min 40 (length full-text)))))))) - ((and source name) - ;; This branch is probably never used - (make-location - (filename-to-buffer source) - (list :function-name (princ-to-string - (if (functionp name) - (ccl:function-name name) - name))))) - (t `(:error ,(funcall if-nil-thunk)))) - (error (c) `(:error ,(princ-to-string c)))))) - -(defun alphatizer-definitions (name) - (let ((alpha (gethash name ccl::*nx1-alphatizers*))) - (and alpha (ccl:find-definition-sources alpha)))) - -(defun p2-definitions (name) - (let ((nx1-op (gethash name ccl::*nx1-operators*))) - (and nx1-op - (let ((dispatch (ccl::backend-p2-dispatch ccl::*target-backend*)) ) - (and (array-in-bounds-p dispatch nx1-op) - (let ((p2 (aref dispatch nx1-op))) - (and p2 - (ccl:find-definition-sources p2)))))))) - -(defimplementation find-definitions (name) - (let ((defs (append (or (ccl:find-definition-sources name) - (and (symbolp name) - (fboundp name) - (ccl:find-definition-sources - (symbol-function name)))) - (alphatizer-definitions name) - (p2-definitions name)))) - (loop for ((type . name) . sources) in defs - collect (list (definition-name type name) - (source-note-to-source-location - (find-if-not #'null sources) - (lambda () "No source-note available") - name))))) - -(defimplementation find-source-location (obj) - (let* ((defs (ccl:find-definition-sources obj)) - (best-def (or (find (ccl:name-of obj) defs :key #'cdar :test #'equal) - (car defs))) - (note (find-if-not #'null (cdr best-def)))) - (when note - (source-note-to-source-location - note - (lambda () "No source note available"))))) - -(defun definition-name (type object) - (case (ccl:definition-type-name type) - (method (ccl:name-of object)) - (t (list (ccl:definition-type-name type) (ccl:name-of object))))) - -;;; Utilities - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (flet ((doc (kind &optional (sym symbol)) - (or (documentation sym kind) :not-documented)) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push - :variable (when (boundp symbol) - (doc 'variable))) - (maybe-push - :function (if (fboundp symbol) - (doc 'function))) - (maybe-push - :setf (let ((setf-function-name (ccl:setf-function-spec-name - `(setf ,symbol)))) - (when (fboundp setf-function-name) - (doc 'function setf-function-name)))) - (maybe-push - :type (when (ccl:type-specifier-p symbol) - (doc 'type))) - result))) - -(defimplementation describe-definition (symbol namespace) - (ecase namespace - (:variable - (describe symbol)) - ((:function :generic-function) - (describe (symbol-function symbol))) - (:setf - (describe (ccl:setf-function-spec-name `(setf ,symbol)))) - (:class - (describe (find-class symbol))) - (:type - (describe (or (find-class symbol nil) symbol))))) - -;; spec ::= (:defmethod {}* ({}*)) -(defun parse-defmethod-spec (spec) - (values (second spec) - (subseq spec 2 (position-if #'consp spec)) - (find-if #'consp (cddr spec)))) - -(defimplementation toggle-trace (spec) - "We currently ignore just about everything." - (let ((what (ecase (first spec) - ((setf) - spec) - ((:defgeneric) - (second spec)) - ((:defmethod) - (multiple-value-bind (name qualifiers specializers) - (parse-defmethod-spec spec) - (find-method (fdefinition name) - qualifiers - specializers)))))) - (cond ((member what (trace) :test #'equal) - (ccl::%untrace what) - (format nil "~S is now untraced." what)) - (t - (ccl:trace-function what) - (format nil "~S is now traced." what))))) - -;;; Macroexpansion - -(defimplementation macroexpand-all (form &optional env) - (ccl:macroexpand-all form env)) - -;;;; Inspection - -(defun comment-type-p (type) - (or (eq type :comment) - (and (consp type) (eq (car type) :comment)))) - -(defmethod emacs-inspect ((o t)) - (let* ((inspector:*inspector-disassembly* t) - (i (inspector:make-inspector o)) - (count (inspector:compute-line-count i))) - (loop for l from 0 below count append - (multiple-value-bind (value label type) (inspector:line-n i l) - (etypecase type - ((member nil :normal) - `(,(or label "") (:value ,value) (:newline))) - ((member :colon) - (label-value-line label value)) - ((member :static) - (list (princ-to-string label) " " `(:value ,value) '(:newline))) - ((satisfies comment-type-p) - (list (princ-to-string label) '(:newline)))))))) - -(defmethod emacs-inspect :around ((o t)) - (if (or (uvector-inspector-p o) - (not (ccl:uvectorp o))) - (call-next-method) - (let ((value (call-next-method))) - (cond ((listp value) - (append value - `((:newline) - (:value ,(make-instance 'uvector-inspector :object o) - "Underlying UVECTOR")))) - (t value))))) - -(defmethod emacs-inspect ((f function)) - (append - (label-value-line "Name" (function-name f)) - `("Its argument list is: " - ,(princ-to-string (arglist f)) (:newline)) - (label-value-line "Documentation" (documentation f t)) - (when (function-lambda-expression f) - (label-value-line "Lambda Expression" - (function-lambda-expression f))) - (when (ccl:function-source-note f) - (label-value-line "Source note" - (ccl:function-source-note f))) - (when (typep f 'ccl:compiled-lexical-closure) - (append - (label-value-line "Inner function" (ccl::closure-function f)) - '("Closed over values:" (:newline)) - (loop for (name value) in (ccl::closure-closed-over-values f) - append (label-value-line (format nil " ~a" name) - value)))))) - -(defclass uvector-inspector () - ((object :initarg :object))) - -(defgeneric uvector-inspector-p (object) - (:method ((object t)) nil) - (:method ((object uvector-inspector)) t)) - -(defmethod emacs-inspect ((uv uvector-inspector)) - (with-slots (object) uv - (loop for i below (ccl:uvsize object) append - (label-value-line (princ-to-string i) (ccl:uvref object i))))) - -(defimplementation type-specifier-p (symbol) - (or (ccl:type-specifier-p symbol) - (not (eq (type-specifier-arglist symbol) :not-available)))) - -;;; Multiprocessing - -(defvar *known-processes* - (make-hash-table :size 20 :weak :key :test #'eq) - "A map from threads to mailboxes.") - -(defvar *known-processes-lock* (ccl:make-lock "*known-processes-lock*")) - -(defstruct (mailbox (:conc-name mailbox.)) - (mutex (ccl:make-lock "thread mailbox")) - (semaphore (ccl:make-semaphore)) - (queue '() :type list)) - -(defimplementation spawn (fun &key name) - (ccl:process-run-function (or name "Anonymous (Swank)") - fun)) - -(defimplementation thread-id (thread) - (ccl:process-serial-number thread)) - -(defimplementation find-thread (id) - (find id (ccl:all-processes) :key #'ccl:process-serial-number)) - -(defimplementation thread-name (thread) - (ccl:process-name thread)) - -(defimplementation thread-status (thread) - (format nil "~A" (ccl:process-whostate thread))) - -(defimplementation thread-attributes (thread) - (list :priority (ccl:process-priority thread))) - -(defimplementation make-lock (&key name) - (ccl:make-lock name)) - -(defimplementation call-with-lock-held (lock function) - (ccl:with-lock-grabbed (lock) - (funcall function))) - -(defimplementation current-thread () - ccl:*current-process*) - -(defimplementation all-threads () - (ccl:all-processes)) - -(defimplementation kill-thread (thread) - ;;(ccl:process-kill thread) ; doesn't cut it - (ccl::process-initial-form-exited thread :kill)) - -(defimplementation thread-alive-p (thread) - (not (ccl:process-exhausted-p thread))) - -(defimplementation interrupt-thread (thread function) - (ccl:process-interrupt - thread - (lambda () - (let ((ccl:*top-error-frame* (ccl::%current-exception-frame))) - (funcall function))))) - -(defun mailbox (thread) - (ccl:with-lock-grabbed (*known-processes-lock*) - (or (gethash thread *known-processes*) - (setf (gethash thread *known-processes*) (make-mailbox))))) - -(defimplementation send (thread message) - (assert message) - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) - (ccl:with-lock-grabbed (mutex) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message))) - (ccl:signal-semaphore (mailbox.semaphore mbox))))) - -(defimplementation wake-thread (thread) - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) - (ccl:with-lock-grabbed (mutex) - (ccl:signal-semaphore (mailbox.semaphore mbox))))) - -(defimplementation receive-if (test &optional timeout) - (let* ((mbox (mailbox ccl:*current-process*)) - (mutex (mailbox.mutex mbox))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (ccl:with-lock-grabbed (mutex) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) - (nconc (ldiff q tail) (cdr tail))) - (return (car tail))))) - (when (eq timeout t) (return (values nil t))) - (ccl:wait-on-semaphore (mailbox.semaphore mbox))))) - -(let ((alist '()) - (lock (ccl:make-lock "register-thread"))) - - (defimplementation register-thread (name thread) - (declare (type symbol name)) - (ccl:with-lock-grabbed (lock) - (etypecase thread - (null - (setf alist (delete name alist :key #'car))) - (ccl:process - (let ((probe (assoc name alist))) - (cond (probe (setf (cdr probe) thread)) - (t (setf alist (acons name thread alist)))))))) - nil) - - (defimplementation find-registered (name) - (ccl:with-lock-grabbed (lock) - (cdr (assoc name alist))))) - -(defimplementation set-default-initial-binding (var form) - (eval `(ccl::def-standard-initial-binding ,var ,form))) - -(defimplementation quit-lisp () - (ccl:quit)) - -(defimplementation set-default-directory (directory) - (let ((dir (truename (merge-pathnames directory)))) - (setf *default-pathname-defaults* (truename (merge-pathnames directory))) - (ccl:cwd dir) - (default-directory))) - -;;; Weak datastructures - -(defimplementation make-weak-key-hash-table (&rest args) - (apply #'make-hash-table :weak :key args)) - -(defimplementation make-weak-value-hash-table (&rest args) - (apply #'make-hash-table :weak :value args)) - -(defimplementation hash-table-weakness (hashtable) - (ccl:hash-table-weak-p hashtable)) - -(pushnew 'deinit-log-output ccl:*save-exit-functions*) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/clasp.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/clasp.lisp deleted file mode 100644 index cc1705c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/clasp.lisp +++ /dev/null @@ -1,809 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- -;;; -;;; swank-clasp.lisp --- SLIME backend for CLASP. -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -;;; Administrivia - -(defpackage swank/clasp - (:use cl swank/backend)) - -(in-package swank/clasp) - -#+(or) -(eval-when (:compile-toplevel :load-toplevel :execute) - (setq swank::*log-output* (open "/tmp/slime.log" :direction :output)) - (setq swank:*log-events* t)) - -(defmacro slime-dbg (fmt &rest args) - `(swank::log-event "slime-dbg ~a ~a~%" mp:*current-process* (apply #'format nil ,fmt ,args))) - -;; Hard dependencies. -(eval-when (:compile-toplevel :load-toplevel :execute) - (require 'sockets)) - -;; Soft dependencies. -(eval-when (:compile-toplevel :load-toplevel :execute) - (when (probe-file "sys:profile.fas") - (require :profile) - (pushnew :profile *features*)) - (when (probe-file "sys:serve-event") - (require :serve-event) - (pushnew :serve-event *features*))) - -(declaim (optimize (debug 3))) - -;;; Swank-mop - -(eval-when (:compile-toplevel :load-toplevel :execute) - (import-swank-mop-symbols - :clos - nil - #+(or)`(:eql-specializer - :eql-specializer-object - :generic-function-declarations - :specializer-direct-methods - ,@(unless (fboundp 'clos:compute-applicable-methods-using-classes) - '(:compute-applicable-methods-using-classes))))) - -(defimplementation gray-package-name () - "GRAY") - - -;;;; TCP Server - -(defimplementation preferred-communication-style () - ;; As of March 2017 CLASP provides threads. - ;; But it's experimental. - ;; ECLs swank implementation says that CLOS is not thread safe and - ;; I use ECLs CLOS implementation - this is a worry for the future. - ;; nil or :spawn - ;; nil - :spawn -#| #+threads :spawn - #-threads nil -|# - ) - -(defun resolve-hostname (name) - (car (sb-bsd-sockets:host-ent-addresses - (sb-bsd-sockets:get-host-by-name name)))) - -(defimplementation create-socket (host port &key backlog) - (let ((socket (make-instance 'sb-bsd-sockets:inet-socket - :type :stream - :protocol :tcp))) - (setf (sb-bsd-sockets:sockopt-reuse-address socket) t) - (sb-bsd-sockets:socket-bind socket (resolve-hostname host) port) - (sb-bsd-sockets:socket-listen socket (or backlog 5)) - socket)) - -(defimplementation local-port (socket) - (nth-value 1 (sb-bsd-sockets:socket-name socket))) - -(defimplementation close-socket (socket) - (sb-bsd-sockets:socket-close socket)) - -(defimplementation accept-connection (socket - &key external-format - buffering timeout) - (declare (ignore timeout)) - (sb-bsd-sockets:socket-make-stream (accept socket) - :output t - :input t - :buffering (ecase buffering - ((t) :full) - ((nil) :none) - (:line :line)) - :element-type (if external-format - 'character - '(unsigned-byte 8)) - :external-format external-format)) -(defun accept (socket) - "Like socket-accept, but retry on EAGAIN." - (loop (handler-case - (return (sb-bsd-sockets:socket-accept socket)) - (sb-bsd-sockets:interrupted-error ())))) - -(defimplementation socket-fd (socket) - (etypecase socket - (fixnum socket) - (two-way-stream (socket-fd (two-way-stream-input-stream socket))) - (sb-bsd-sockets:socket (sb-bsd-sockets:socket-file-descriptor socket)) - (file-stream (si:file-stream-fd socket)))) - -(defvar *external-format-to-coding-system* - '((:latin-1 - "latin-1" "latin-1-unix" "iso-latin-1-unix" - "iso-8859-1" "iso-8859-1-unix") - (:utf-8 "utf-8" "utf-8-unix"))) - -(defun external-format (coding-system) - (or (car (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*)) - (find coding-system (ext:all-encodings) :test #'string-equal))) - -(defimplementation find-external-format (coding-system) - #+unicode (external-format coding-system) - ;; Without unicode support, CLASP uses the one-byte encoding of the - ;; underlying OS, and will barf on anything except :DEFAULT. We - ;; return NIL here for known multibyte encodings, so - ;; SWANK:CREATE-SERVER will barf. - #-unicode (let ((xf (external-format coding-system))) - (if (member xf '(:utf-8)) - nil - :default))) - - -;;;; Unix Integration - -;;; If CLASP is built with thread support, it'll spawn a helper thread -;;; executing the SIGINT handler. We do not want to BREAK into that -;;; helper but into the main thread, though. This is coupled with the -;;; current choice of NIL as communication-style in so far as CLASP's -;;; main-thread is also the Slime's REPL thread. - -#+clasp-working -(defimplementation call-with-user-break-handler (real-handler function) - (let ((old-handler #'si:terminal-interrupt)) - (setf (symbol-function 'si:terminal-interrupt) - (make-interrupt-handler real-handler)) - (unwind-protect (funcall function) - (setf (symbol-function 'si:terminal-interrupt) old-handler)))) - -#+threads -(defun make-interrupt-handler (real-handler) - (let ((main-thread (find 'si:top-level (mp:all-processes) - :key #'mp:process-name))) - #'(lambda (&rest args) - (declare (ignore args)) - (mp:interrupt-process main-thread real-handler)))) - -#-threads -(defun make-interrupt-handler (real-handler) - #'(lambda (&rest args) - (declare (ignore args)) - (funcall real-handler))) - - -(defimplementation getpid () - (si:getpid)) - -(defimplementation set-default-directory (directory) - (ext:chdir (namestring directory)) ; adapts *DEFAULT-PATHNAME-DEFAULTS*. - (default-directory)) - -(defimplementation default-directory () - (namestring (ext:getcwd))) - -(defimplementation quit-lisp () - (core:quit)) - - - -;;; Instead of busy waiting with communication-style NIL, use select() -;;; on the sockets' streams. -#+serve-event -(progn - (defun poll-streams (streams timeout) - (let* ((serve-event::*descriptor-handlers* - (copy-list serve-event::*descriptor-handlers*)) - (active-fds '()) - (fd-stream-alist - (loop for s in streams - for fd = (socket-fd s) - collect (cons fd s) - do (serve-event:add-fd-handler fd :input - #'(lambda (fd) - (push fd active-fds)))))) - (serve-event:serve-event timeout) - (loop for fd in active-fds collect (cdr (assoc fd fd-stream-alist))))) - - (defimplementation wait-for-input (streams &optional timeout) - (assert (member timeout '(nil t))) - (loop - (cond ((check-slime-interrupts) (return :interrupt)) - (timeout (return (poll-streams streams 0))) - (t - (when-let (ready (poll-streams streams 0.2)) - (return ready)))))) - -) ; #+serve-event (progn ... - -#-serve-event -(defimplementation wait-for-input (streams &optional timeout) - (assert (member timeout '(nil t))) - (loop - (cond ((check-slime-interrupts) (return :interrupt)) - (timeout (return (remove-if-not #'listen streams))) - (t - (let ((ready (remove-if-not #'listen streams))) - (if ready (return ready)) - (sleep 0.1)))))) - - -;;;; Compilation - -(defvar *buffer-name* nil) -(defvar *buffer-start-position*) - -(defun signal-compiler-condition (&rest args) - (apply #'signal 'compiler-condition args)) - -#-clasp-bytecmp -(defun handle-compiler-message (condition) - ;; CLASP emits lots of noise in compiler-notes, like "Invoking - ;; external command". - (unless (typep condition 'c::compiler-note) - (signal-compiler-condition - :original-condition condition - :message (princ-to-string condition) - :severity (etypecase condition - (cmp:compiler-fatal-error :error) - (cmp:compiler-error :error) - (error :error) - (style-warning :style-warning) - (warning :warning)) - :location (condition-location condition)))) - -#-clasp-bytecmp -(defun condition-location (condition) - (let ((file (cmp:compiler-message-file condition)) - (position (cmp:compiler-message-file-position condition))) - (if (and position (not (minusp position))) - (if *buffer-name* - (make-buffer-location *buffer-name* - *buffer-start-position* - position) - (make-file-location file position)) - (make-error-location "No location found.")))) - -(defimplementation call-with-compilation-hooks (function) - (funcall function)) -#|| #-clasp-bytecmp - (handler-bind ((c:compiler-message #'handle-compiler-message)) - (funcall function))) -||# - - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (format t "Compiling file input-file = ~a output-file = ~a~%" input-file output-file) - ;; Ignore the output-file and generate our own - (let ((tmp-output-file (compile-file-pathname (si:mkstemp "TMP:clasp-swank-compile-file-")))) - (format t "Using tmp-output-file: ~a~%" tmp-output-file) - (multiple-value-bind (fasl warnings-p failure-p) - (with-compilation-hooks () - (compile-file input-file :output-file tmp-output-file - :external-format external-format)) - (values fasl warnings-p - (or failure-p - (when load-p - (not (load fasl)))))))) - -(defvar *tmpfile-map* (make-hash-table :test #'equal)) - -(defun note-buffer-tmpfile (tmp-file buffer-name) - ;; EXT:COMPILED-FUNCTION-FILE below will return a namestring. - (let ((tmp-namestring (namestring (truename tmp-file)))) - (setf (gethash tmp-namestring *tmpfile-map*) buffer-name) - tmp-namestring)) - -(defun tmpfile-to-buffer (tmp-file) - (gethash tmp-file *tmpfile-map*)) - -(defimplementation swank-compile-string (string &key buffer position filename policy) - (declare (ignore policy)) - (with-compilation-hooks () - (let ((*buffer-name* buffer) ; for compilation hooks - (*buffer-start-position* position)) - (let ((tmp-file (si:mkstemp "TMP:clasp-swank-tmpfile-")) - (fasl-file) - (warnings-p) - (failure-p)) - (unwind-protect - (with-open-file (tmp-stream tmp-file :direction :output - :if-exists :supersede) - (write-string string tmp-stream) - (finish-output tmp-stream) - (multiple-value-setq (fasl-file warnings-p failure-p) - (let ((truename (or filename (note-buffer-tmpfile tmp-file buffer)))) - (compile-file tmp-file - :source-debug-pathname (pathname truename) - :source-debug-offset (1- position))))) - (when fasl-file (load fasl-file)) - (when (probe-file tmp-file) - (delete-file tmp-file)) - (when fasl-file - (delete-file fasl-file))) - (not failure-p))))) - -;;;; Documentation - -(defimplementation arglist (name) - (multiple-value-bind (arglist foundp) - (core:function-lambda-list name) ;; Uses bc-split - (if foundp arglist :not-available))) - -(defimplementation function-name (f) - (typecase f - (generic-function (clos::generic-function-name f)) - (function (ext:compiled-function-name f)))) - -;; FIXME -(defimplementation macroexpand-all (form &optional env) - (declare (ignore env)) - (macroexpand form)) - -;;; modified from sbcl.lisp -(defimplementation collect-macro-forms (form &optional environment) - (let ((macro-forms '()) - (compiler-macro-forms '()) - (function-quoted-forms '())) - (format t "In collect-macro-forms~%") - (cmp:code-walk - form environment - :code-walker-function - (lambda (form environment) - (when (and (consp form) - (symbolp (car form))) - (cond ((eq (car form) 'function) - (push (cadr form) function-quoted-forms)) - ((member form function-quoted-forms) - nil) - ((macro-function (car form) environment) - (push form macro-forms)) - ((not (eq form (core:compiler-macroexpand-1 form environment))) - (push form compiler-macro-forms)))) - form)) - (values macro-forms compiler-macro-forms))) - - - - - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (flet ((frob (type boundp) - (when (funcall boundp symbol) - (let ((doc (describe-definition symbol type))) - (setf result (list* type doc result)))))) - (frob :VARIABLE #'boundp) - (frob :FUNCTION #'fboundp) - (frob :CLASS (lambda (x) (find-class x nil)))) - result)) - -(defimplementation describe-definition (name type) - (case type - (:variable (documentation name 'variable)) - (:function (documentation name 'function)) - (:class (documentation name 'class)) - (t nil))) - -(defimplementation type-specifier-p (symbol) - (or (subtypep nil symbol) - (not (eq (type-specifier-arglist symbol) :not-available)))) - - -;;; Debugging - -(eval-when (:compile-toplevel :load-toplevel :execute) - (import - '(si::*break-env* - si::*ihs-top* - si::*ihs-current* - si::*ihs-base* -#+frs si::*frs-base* -#+frs si::*frs-top* - si::*tpl-commands* - si::*tpl-level* -#+frs si::frs-top - si::ihs-top - si::ihs-fun - si::ihs-env -#+frs si::sch-frs-base - si::set-break-env - si::set-current-ihs - si::tpl-commands))) - -(defun make-invoke-debugger-hook (hook) - (when hook - #'(lambda (condition old-hook) - ;; Regard *debugger-hook* if set by user. - (if *debugger-hook* - nil ; decline, *DEBUGGER-HOOK* will be tried next. - (funcall hook condition old-hook))))) - -(defimplementation install-debugger-globally (function) - (setq *debugger-hook* function) - (setq ext:*invoke-debugger-hook* (make-invoke-debugger-hook function)) - ) - -(defimplementation call-with-debugger-hook (hook fun) - (let ((*debugger-hook* hook) - (ext:*invoke-debugger-hook* (make-invoke-debugger-hook hook))) - (funcall fun)) - ) - -(defvar *backtrace* '()) - -;;; Commented out; it's not clear this is a good way of doing it. In -;;; particular because it makes errors stemming from this file harder -;;; to debug, and given the "young" age of CLASP's swank backend, that's -;;; a bad idea. - -;; (defun in-swank-package-p (x) -;; (and -;; (symbolp x) -;; (member (symbol-package x) -;; (list #.(find-package :swank) -;; #.(find-package :swank/backend) -;; #.(ignore-errors (find-package :swank-mop)) -;; #.(ignore-errors (find-package :swank-loader)))) -;; t)) - -;; (defun is-swank-source-p (name) -;; (setf name (pathname name)) -;; (pathname-match-p -;; name -;; (make-pathname :defaults swank-loader::*source-directory* -;; :name (pathname-name name) -;; :type (pathname-type name) -;; :version (pathname-version name)))) - -;; (defun is-ignorable-fun-p (x) -;; (or -;; (in-swank-package-p (frame-name x)) -;; (multiple-value-bind (file position) -;; (ignore-errors (si::bc-file (car x))) -;; (declare (ignore position)) -;; (if file (is-swank-source-p file))))) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (declare (type function debugger-loop-fn)) - (let* ((*ihs-top* 0) - (*ihs-current* *ihs-top*) - #+frs (*frs-base* (or (sch-frs-base *frs-top* *ihs-base*) (1+ (frs-top)))) - #+frs (*frs-top* (frs-top)) - (*tpl-level* (1+ *tpl-level*))) - (core:call-with-backtrace - (lambda (raw-backtrace) - (let ((*backtrace* - (let ((backtrace (core::common-lisp-backtrace-frames - raw-backtrace - :gather-start-trigger - (lambda (frame) - (let ((function-name (core::backtrace-frame-function-name frame))) - (and (symbolp function-name) - (eq function-name 'core::universal-error-handler)))) - :gather-all-frames nil))) - (unless backtrace - (setq backtrace (core::common-lisp-backtrace-frames - :gather-all-frames nil))) - backtrace))) - (declare (special *ihs-current*)) - (set-break-env) - (set-current-ihs) - (let ((*ihs-base* *ihs-top*)) - (funcall debugger-loop-fn))))))) - -(defimplementation compute-backtrace (start end) - (subseq *backtrace* start - (and (numberp end) - (min end (length *backtrace*))))) - -(defun frame-name (frame) - (let ((x (core::backtrace-frame-function-name frame))) - (if (symbolp x) - x - (function-name x)))) - -(defun frame-function (frame-number) - (let ((x (core::backtrace-frame-function-name (elt *backtrace* frame-number)))) - (etypecase x - (symbol - (and (fboundp x) - (fdefinition x))) - (cons - (if (eq (car x) 'cl:setf) - (fdefinition x) - nil)) - (function - x)))) - -(defimplementation print-frame (frame stream) - (if (core::backtrace-frame-arguments frame) - (format stream "(~a~{ ~s~})" (core::backtrace-frame-print-name frame) - (coerce (core::backtrace-frame-arguments frame) 'list)) - (format stream "~a" (core::backtrace-frame-print-name frame)))) - -(defimplementation frame-source-location (frame-number) - (let* ((address (core::backtrace-frame-return-address (elt *backtrace* frame-number))) - (code-source-location (ext::code-source-position address))) - (format t "code-source-location ~s~%" code-source-location) - ;; (core::source-info-backtrace *backtrace*) - (make-location (list :file (namestring (ext::code-source-line-source-pathname code-source-location))) - (list :line (ext::code-source-line-line-number code-source-location)) - '(:align t)))) - -#+clasp-working -(defimplementation frame-catch-tags (frame-number) - (third (elt *backtrace* frame-number))) - -(defun ihs-frame-id (frame-number) - (- (core:ihs-top) frame-number)) - -(defimplementation frame-locals (frame-number) - (let* ((frame (elt *backtrace* frame-number)) - (env nil) ; no env yet - (locals (loop for x = env then (core:get-parent-environment x) - while x - nconc (loop for name across (core:environment-debug-names x) - for value across (core:environment-debug-values x) - collect (list :name name :id 0 :value value))))) - (nconc - (loop for arg across (core::backtrace-frame-arguments frame) - for i from 0 - collect (list :name (intern (format nil "ARG~d" i) :cl-user) - :id 0 - :value arg)) - locals))) - -(defimplementation frame-var-value (frame-number var-number) - (let* ((frame (elt *backtrace* frame-number)) - (env nil) - (args (core::backtrace-frame-arguments frame))) - (if (< var-number (length args)) - (svref args var-number) - (elt (frame-locals frame-number) var-number)))) - -(defimplementation disassemble-frame (frame-number) - (let ((fun (frame-function frame-number))) - (disassemble fun))) - -(defimplementation eval-in-frame (form frame-number) - (let* ((frame (elt *backtrace* frame-number)) - (raw-arg-values (coerce (core::backtrace-frame-arguments frame) 'list))) - (if (and (= (length raw-arg-values) 2) (core:vaslistp (car raw-arg-values))) - (let* ((arg-values (core:list-from-va-list (car raw-arg-values))) - (bindings (append (loop for i from 0 for value in arg-values collect `(,(intern (core:bformat nil "ARG%d" i) :cl-user) ',value)) - (list (list (intern "NEXT-METHODS" :cl-user) (cadr raw-arg-values)))))) - (eval - `(let (,@bindings) ,form))) - (let* ((arg-values raw-arg-values) - (bindings (loop for i from 0 for value in arg-values collect `(,(intern (core:bformat nil "ARG%d" i) :cl-user) ',value)))) - (eval - `(let (,@bindings) ,form)))))) - - -#+clasp-working -(defimplementation gdb-initial-commands () - ;; These signals are used by the GC. - #+linux '("handle SIGPWR noprint nostop" - "handle SIGXCPU noprint nostop")) - -#+clasp-working -(defimplementation command-line-args () - (loop for n from 0 below (si:argc) collect (si:argv n))) - - -;;;; Inspector - -;;; FIXME: Would be nice if it was possible to inspect objects -;;; implemented in C. - - -;;;; Definitions - -(defun make-file-location (file file-position) - ;; File positions in CL start at 0, but Emacs' buffer positions - ;; start at 1. We specify (:ALIGN T) because the positions comming - ;; from CLASP point at right after the toplevel form appearing before - ;; the actual target toplevel form; (:ALIGN T) will DTRT in that case. - (make-location `(:file ,(namestring (translate-logical-pathname file))) - `(:position ,(1+ file-position)) - `(:align t))) - -(defun make-buffer-location (buffer-name start-position &optional (offset 0)) - (make-location `(:buffer ,buffer-name) - `(:offset ,start-position ,offset) - `(:align t))) - -(defun translate-location (location) - (make-location (list :file (namestring (ext:source-location-pathname location))) - (list :position (ext:source-location-offset location)) - '(:align t))) - -(defimplementation find-definitions (name) - (loop for kind in ext:*source-location-kinds* - for locations = (ext:source-location name kind) - when locations - nconc (loop for location in locations - collect (list kind (translate-location location))))) - -(defun source-location (object) - (let ((location (ext:source-location object t))) - (when location - (translate-location (car location))))) - -(defimplementation find-source-location (object) - (or (source-location object) - (make-error-location "Source definition of ~S not found." object))) - - -;;;; Profiling - -#+profile -(progn - -(defimplementation profile (fname) - (when fname (eval `(profile:profile ,fname)))) - -(defimplementation unprofile (fname) - (when fname (eval `(profile:unprofile ,fname)))) - -(defimplementation unprofile-all () - (profile:unprofile-all) - "All functions unprofiled.") - -(defimplementation profile-report () - (profile:report)) - -(defimplementation profile-reset () - (profile:reset) - "Reset profiling counters.") - -(defimplementation profiled-functions () - (profile:profile)) - -(defimplementation profile-package (package callers methods) - (declare (ignore callers methods)) - (eval `(profile:profile ,(package-name (find-package package))))) -) ; #+profile (progn ... - - -;;;; Threads - -#+threads -(progn - (defvar *thread-id-counter* 0) - - (defparameter *thread-id-map* (make-hash-table)) - - (defvar *thread-id-map-lock* - (mp:make-lock :name "thread id map lock")) - - (defimplementation spawn (fn &key name) - (mp:process-run-function name fn)) - - (defimplementation thread-id (target-thread) - (block thread-id - (mp:with-lock (*thread-id-map-lock*) - ;; Does TARGET-THREAD have an id already? - (maphash (lambda (id thread-pointer) - (let ((thread (si:weak-pointer-value thread-pointer))) - (cond ((not thread) - (remhash id *thread-id-map*)) - ((eq thread target-thread) - (return-from thread-id id))))) - *thread-id-map*) - ;; TARGET-THREAD not found in *THREAD-ID-MAP* - (let ((id (incf *thread-id-counter*)) - (thread-pointer (si:make-weak-pointer target-thread))) - (setf (gethash id *thread-id-map*) thread-pointer) - id)))) - - (defimplementation find-thread (id) - (mp:with-lock (*thread-id-map-lock*) - (let* ((thread-ptr (gethash id *thread-id-map*)) - (thread (and thread-ptr (si:weak-pointer-value thread-ptr)))) - (unless thread - (remhash id *thread-id-map*)) - thread))) - - (defimplementation thread-name (thread) - (mp:process-name thread)) - - (defimplementation thread-status (thread) - (if (mp:process-active-p thread) - "RUNNING" - "STOPPED")) - - (defimplementation make-lock (&key name) - (mp:make-lock :name name :recursive t)) - - (defimplementation call-with-lock-held (lock function) - (declare (type function function)) - (mp:with-lock (lock) (funcall function))) - - (defimplementation current-thread () - mp:*current-process*) - - (defimplementation all-threads () - (mp:all-processes)) - - (defimplementation interrupt-thread (thread fn) - (mp:interrupt-process thread fn)) - - (defimplementation kill-thread (thread) - (mp:process-kill thread)) - - (defimplementation thread-alive-p (thread) - (mp:process-active-p thread)) - - (defvar *mailbox-lock* (mp:make-lock :name "mailbox lock")) - (defvar *mailboxes* (list)) - (declaim (type list *mailboxes*)) - - (defstruct (mailbox (:conc-name mailbox.)) - thread - (mutex (mp:make-lock :name "SLIMELCK")) - (cvar (mp:make-condition-variable)) - (queue '() :type list)) - - (defun mailbox (thread) - "Return THREAD's mailbox." - (mp:with-lock (*mailbox-lock*) - (or (find thread *mailboxes* :key #'mailbox.thread) - (let ((mb (make-mailbox :thread thread))) - (push mb *mailboxes*) - mb)))) - - (defimplementation wake-thread (thread) - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) - (format t "About to with-lock in wake-thread~%") - (mp:with-lock (mutex) - (format t "In wake-thread~%") - (mp:condition-variable-broadcast (mailbox.cvar mbox))))) - - (defimplementation send (thread message) - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) - (swank::log-event "clasp.lisp: send message ~a mutex: ~a~%" message mutex) - (swank::log-event "clasp.lisp: (lock-owner mutex) -> ~a~%" (mp:lock-owner mutex)) - (swank::log-event "clasp.lisp: (lock-count mutex) -> ~a~%" (mp:lock-count mutex)) - (mp:with-lock (mutex) - (swank::log-event "clasp.lisp: in with-lock (lock-owner mutex) -> ~a~%" (mp:lock-owner mutex)) - (swank::log-event "clasp.lisp: in with-lock (lock-count mutex) -> ~a~%" (mp:lock-count mutex)) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message))) - (swank::log-event "clasp.lisp: send about to broadcast~%") - (mp:condition-variable-broadcast (mailbox.cvar mbox))))) - - - (defimplementation receive-if (test &optional timeout) - (slime-dbg "Entered receive-if") - (let* ((mbox (mailbox (current-thread))) - (mutex (mailbox.mutex mbox))) - (slime-dbg "receive-if assert") - (assert (or (not timeout) (eq timeout t))) - (loop - (slime-dbg "receive-if check-slime-interrupts") - (check-slime-interrupts) - (slime-dbg "receive-if with-lock") - (mp:with-lock (mutex) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) (nconc (ldiff q tail) (cdr tail))) - (return (car tail)))) - (slime-dbg "receive-if when (eq") - (when (eq timeout t) (return (values nil t))) - (slime-dbg "receive-if condition-variable-timedwait") - (mp:condition-variable-wait (mailbox.cvar mbox) mutex) ; timedwait 0.2 - (slime-dbg "came out of condition-variable-timedwait") - (core:check-pending-interrupts))))) - - ) ; #+threads (progn ... - - -(defmethod emacs-inspect ((object core:cxx-object)) - (let ((encoded (core:encode object))) - (loop for (key . value) in encoded - append (list (string key) ": " (list :value value) (list :newline))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/clisp.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/clisp.lisp deleted file mode 100644 index 27ae688..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/clisp.lisp +++ /dev/null @@ -1,930 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -;;;; SWANK support for CLISP. - -;;;; Copyright (C) 2003, 2004 W. Jenkner, V. Sedach - -;;;; 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 is work in progress, but it's already usable. Many things -;;; are adapted from other swank-*.lisp, in particular from -;;; swank-allegro (I don't use allegro at all, but it's the shortest -;;; one and I found Helmut Eller's code there enlightening). - -;;; This code will work better with recent versions of CLISP (say, the -;;; last release or CVS HEAD) while it may not work at all with older -;;; versions. It is reasonable to expect it to work on platforms with -;;; a "SOCKET" package, in particular on GNU/Linux or Unix-like -;;; systems, but also on Win32. This backend uses the portable xref -;;; from the CMU AI repository and metering.lisp from CLOCC [1], which -;;; are conveniently included in SLIME. - -;;; [1] http://cvs.sourceforge.net/viewcvs.py/clocc/clocc/src/tools/metering/ - -(defpackage swank/clisp - (:use cl swank/backend)) - -(in-package swank/clisp) - -(eval-when (:compile-toplevel) - (unless (string< "2.44" (lisp-implementation-version)) - (error "Need at least CLISP version 2.44"))) - -(defimplementation gray-package-name () - "GRAY") - -;;;; if this lisp has the complete CLOS then we use it, otherwise we -;;;; build up a "fake" swank-mop and then override the methods in the -;;;; inspector. - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defvar *have-mop* - (and (find-package :clos) - (eql :external - (nth-value 1 (find-symbol (string ':standard-slot-definition) - :clos)))) - "True in those CLISP images which have a complete MOP implementation.")) - -#+#.(cl:if swank/clisp::*have-mop* '(cl:and) '(cl:or)) -(progn - (import-swank-mop-symbols :clos '(:slot-definition-documentation)) - - (defun swank-mop:slot-definition-documentation (slot) - (clos::slot-definition-documentation slot))) - -#-#.(cl:if swank/clisp::*have-mop* '(and) '(or)) -(defclass swank-mop:standard-slot-definition () - () - (:documentation - "Dummy class created so that swank.lisp will compile and load.")) - -(let ((getpid (or (find-symbol "PROCESS-ID" :system) - ;; old name prior to 2005-03-01, clisp <= 2.33.2 - (find-symbol "PROGRAM-ID" :system) - #+win32 ; integrated into the above since 2005-02-24 - (and (find-package :win32) ; optional modules/win32 - (find-symbol "GetCurrentProcessId" :win32))))) - (defimplementation getpid () ; a required interface - (cond - (getpid (funcall getpid)) - #+win32 ((ext:getenv "PID")) ; where does that come from? - (t -1)))) - -(defimplementation call-with-user-break-handler (handler function) - (handler-bind ((system::simple-interrupt-condition - (lambda (c) - (declare (ignore c)) - (funcall handler) - (when (find-restart 'socket-status) - (invoke-restart (find-restart 'socket-status))) - (continue)))) - (funcall function))) - -(defimplementation lisp-implementation-type-name () - "clisp") - -(defimplementation set-default-directory (directory) - (setf (ext:default-directory) directory) - (namestring (setf *default-pathname-defaults* (ext:default-directory)))) - -(defimplementation filename-to-pathname (string) - (cond ((member :cygwin *features*) - (parse-cygwin-filename string)) - (t (parse-namestring string)))) - -(defun parse-cygwin-filename (string) - (multiple-value-bind (match _ drive absolute) - (regexp:match "^(([a-zA-Z\\]+):)?([\\/])?" string :extended t) - (declare (ignore _)) - (assert (and match (if drive absolute t)) () - "Invalid filename syntax: ~a" string) - (let* ((sans-prefix (subseq string (regexp:match-end match))) - (path (remove "" (regexp:regexp-split "[\\/]" sans-prefix))) - (path (loop for name in path collect - (cond ((equal name "..") ':back) - (t name)))) - (directoryp (or (equal string "") - (find (aref string (1- (length string))) "\\/")))) - (multiple-value-bind (file type) - (cond ((and (not directoryp) (last path)) - (let* ((file (car (last path))) - (pos (position #\. file :from-end t))) - (cond ((and pos (> pos 0)) - (values (subseq file 0 pos) - (subseq file (1+ pos)))) - (t file))))) - (make-pathname :host nil - :device nil - :directory (cons - (if absolute :absolute :relative) - (let ((path (if directoryp - path - (butlast path)))) - (if drive - (cons - (regexp:match-string string drive) - path) - path))) - :name file - :type type))))) - -;;;; UTF - -(defimplementation string-to-utf8 (string) - (let ((enc (load-time-value - (ext:make-encoding :charset "utf-8" :line-terminator :unix) - t))) - (ext:convert-string-to-bytes string enc))) - -(defimplementation utf8-to-string (octets) - (let ((enc (load-time-value - (ext:make-encoding :charset "utf-8" :line-terminator :unix) - t))) - (ext:convert-string-from-bytes octets enc))) - -;;;; TCP Server - -(defimplementation create-socket (host port &key backlog) - (socket:socket-server port :interface host :backlog (or backlog 5))) - -(defimplementation local-port (socket) - (socket:socket-server-port socket)) - -(defimplementation close-socket (socket) - (socket:socket-server-close socket)) - -(defimplementation accept-connection (socket - &key external-format buffering timeout) - (declare (ignore buffering timeout)) - (socket:socket-accept socket - :buffered buffering ;; XXX may not work if t - :element-type (if external-format - 'character - '(unsigned-byte 8)) - :external-format (or external-format :default))) - -#-win32 -(defimplementation wait-for-input (streams &optional timeout) - (assert (member timeout '(nil t))) - (let ((streams (mapcar (lambda (s) (list* s :input nil)) streams))) - (loop - (cond ((check-slime-interrupts) (return :interrupt)) - (timeout - (socket:socket-status streams 0 0) - (return (loop for (s nil . x) in streams - if x collect s))) - (t - (with-simple-restart (socket-status "Return from socket-status.") - (socket:socket-status streams 0 500000)) - (let ((ready (loop for (s nil . x) in streams - if x collect s))) - (when ready (return ready)))))))) - -#+win32 -(defimplementation wait-for-input (streams &optional timeout) - (assert (member timeout '(nil t))) - (loop - (cond ((check-slime-interrupts) (return :interrupt)) - (t - (let ((ready (remove-if-not #'input-available-p streams))) - (when ready (return ready))) - (when timeout (return nil)) - (sleep 0.1))))) - -#+win32 -;; Some facts to remember (for the next time we need to debug this): -;; - interactive-sream-p returns t for socket-streams -;; - listen returns nil for socket-streams -;; - (type-of ) is 'stream -;; - (type-of *terminal-io*) is 'two-way-stream -;; - stream-element-type on our sockets is usually (UNSIGNED-BYTE 8) -;; - calling socket:socket-status on non sockets signals an error, -;; but seems to mess up something internally. -;; - calling read-char-no-hang on sockets does not signal an error, -;; but seems to mess up something internally. -(defun input-available-p (stream) - (case (stream-element-type stream) - (character - (let ((c (read-char-no-hang stream nil nil))) - (cond ((not c) - nil) - (t - (unread-char c stream) - t)))) - (t - (eq (socket:socket-status (cons stream :input) 0 0) - :input)))) - -;;;; Coding systems - -(defvar *external-format-to-coding-system* - '(((:charset "iso-8859-1" :line-terminator :unix) - "latin-1-unix" "iso-latin-1-unix" "iso-8859-1-unix") - ((:charset "iso-8859-1") - "latin-1" "iso-latin-1" "iso-8859-1") - ((:charset "utf-8") "utf-8") - ((:charset "utf-8" :line-terminator :unix) "utf-8-unix") - ((:charset "euc-jp") "euc-jp") - ((:charset "euc-jp" :line-terminator :unix) "euc-jp-unix") - ((:charset "us-ascii") "us-ascii") - ((:charset "us-ascii" :line-terminator :unix) "us-ascii-unix"))) - -(defimplementation find-external-format (coding-system) - (let ((args (car (rassoc-if (lambda (x) - (member coding-system x :test #'equal)) - *external-format-to-coding-system*)))) - (and args (apply #'ext:make-encoding args)))) - - -;;;; Swank functions - -(defimplementation arglist (fname) - (block nil - (or (ignore-errors - (let ((exp (function-lambda-expression fname))) - (and exp (return (second exp))))) - (ignore-errors - (return (ext:arglist fname))) - :not-available))) - -(defimplementation macroexpand-all (form &optional env) - (declare (ignore env)) - (ext:expand-form form)) - -(defimplementation collect-macro-forms (form &optional env) - ;; Currently detects only normal macros, not compiler macros. - (declare (ignore env)) - (with-collected-macro-forms (macro-forms) - (handler-bind ((warning #'muffle-warning)) - (ignore-errors - (compile nil `(lambda () ,form)))) - (values macro-forms nil))) - -(defimplementation describe-symbol-for-emacs (symbol) - "Return a plist describing SYMBOL. -Return NIL if the symbol is unbound." - (let ((result ())) - (flet ((doc (kind) - (or (documentation symbol kind) :not-documented)) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push :variable (when (boundp symbol) (doc 'variable))) - (when (fboundp symbol) - (maybe-push - ;; Report WHEN etc. as macros, even though they may be - ;; implemented as special operators. - (if (macro-function symbol) :macro - (typecase (fdefinition symbol) - (generic-function :generic-function) - (function :function) - ;; (type-of 'progn) -> ext:special-operator - (t :special-operator))) - (doc 'function))) - (when (or (get symbol 'system::setf-function) ; e.g. #'(setf elt) - (get symbol 'system::setf-expander)); defsetf - (maybe-push :setf (doc 'setf))) - (when (or (get symbol 'system::type-symbol); cf. clisp/src/describe.lisp - (get symbol 'system::defstruct-description) - (get symbol 'system::deftype-expander)) - (maybe-push :type (doc 'type))) ; even for 'structure - (when (find-class symbol nil) - (maybe-push :class (doc 'type))) - ;; Let this code work compiled in images without FFI - (let ((types (load-time-value - (and (find-package "FFI") - (symbol-value - (find-symbol "*C-TYPE-TABLE*" "FFI")))))) - ;; Use ffi::*c-type-table* so as not to suffer the overhead of - ;; (ignore-errors (ffi:parse-c-type symbol)) for 99.9% of symbols - ;; which are not FFI type names. - (when (and types (nth-value 1 (gethash symbol types))) - ;; Maybe use (case (head (ffi:deparse-c-type))) - ;; to distinguish struct and union types? - (maybe-push :alien-type :not-documented))) - result))) - -(defimplementation describe-definition (symbol namespace) - (ecase namespace - (:variable (describe symbol)) - (:macro (describe (macro-function symbol))) - (:function (describe (symbol-function symbol))) - (:class (describe (find-class symbol))))) - -(defimplementation type-specifier-p (symbol) - (or (ignore-errors - (subtypep nil symbol)) - (not (eq (type-specifier-arglist symbol) :not-available)))) - -(defun fspec-pathname (spec) - (let ((path spec) - type - lines) - (when (consp path) - (psetq type (car path) - path (cadr path) - lines (cddr path))) - (when (and path - (member (pathname-type path) - custom:*compiled-file-types* :test #'equal)) - (setq path - (loop for suffix in custom:*source-file-types* - thereis (probe-file (make-pathname :defaults path - :type suffix))))) - (values path type lines))) - -(defun fspec-location (name fspec) - (multiple-value-bind (file type lines) - (fspec-pathname fspec) - (list (if type (list name type) name) - (cond (file - (multiple-value-bind (truename c) - (ignore-errors (truename file)) - (cond (truename - (make-location - (list :file (namestring truename)) - (if (consp lines) - (list* :line lines) - (list :function-name (string name))) - (when (consp type) - (list :snippet (format nil "~A" type))))) - (t (list :error (princ-to-string c)))))) - (t (list :error - (format nil "No source information available for: ~S" - fspec))))))) - -(defimplementation find-definitions (name) - (mapcar #'(lambda (e) (fspec-location name e)) - (documentation name 'sys::file))) - -(defun trim-whitespace (string) - (string-trim #(#\newline #\space #\tab) string)) - -(defvar *sldb-backtrace*) - -(defun sldb-backtrace () - "Return a list ((ADDRESS . DESCRIPTION) ...) of frames." - (let* ((modes '((:all-stack-elements 1) - (:all-frames 2) - (:only-lexical-frames 3) - (:only-eval-and-apply-frames 4) - (:only-apply-frames 5))) - (mode (cadr (assoc :all-stack-elements modes)))) - (do ((frames '()) - (last nil frame) - (frame (sys::the-frame) - (sys::frame-up 1 frame mode))) - ((eq frame last) (nreverse frames)) - (unless (boring-frame-p frame) - (push frame frames))))) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (let* (;;(sys::*break-count* (1+ sys::*break-count*)) - ;;(sys::*driver* debugger-loop-fn) - ;;(sys::*fasoutput-stream* nil) - (*sldb-backtrace* - (let* ((f (sys::the-frame)) - (bt (sldb-backtrace)) - (rest (member f bt))) - (if rest (nthcdr 8 rest) bt)))) - (funcall debugger-loop-fn))) - -(defun nth-frame (index) - (nth index *sldb-backtrace*)) - -(defun boring-frame-p (frame) - (member (frame-type frame) '(stack-value bind-var bind-env - compiled-tagbody compiled-block))) - -(defun frame-to-string (frame) - (with-output-to-string (s) - (sys::describe-frame s frame))) - -(defun frame-type (frame) - ;; FIXME: should bind *print-length* etc. to small values. - (frame-string-type (frame-to-string frame))) - -;; FIXME: they changed the layout in 2.44 and not all patterns have -;; been updated. -(defvar *frame-prefixes* - '(("\\[[0-9]\\+\\] frame binding variables" bind-var) - ("<1> # # # " fun) - ("<2> " 2nd-frame) - )) - -(defun frame-string-type (string) - (cadr (assoc-if (lambda (pattern) (is-prefix-p pattern string)) - *frame-prefixes*))) - -(defimplementation compute-backtrace (start end) - (let* ((bt *sldb-backtrace*) - (len (length bt))) - (loop for f in (subseq bt start (min (or end len) len)) - collect f))) - -(defimplementation print-frame (frame stream) - (let* ((str (frame-to-string frame))) - (write-string (extract-frame-line str) - stream))) - -(defun extract-frame-line (frame-string) - (let ((s frame-string)) - (trim-whitespace - (case (frame-string-type s) - ((eval special-op) - (string-match "EVAL frame .*for form \\(.*\\)" s 1)) - (apply - (string-match "APPLY frame for call \\(.*\\)" s 1)) - ((compiled-fun sys-fun fun) - (extract-function-name s)) - (t s))))) - -(defun extract-function-name (string) - (let ((1st (car (split-frame-string string)))) - (or (string-match (format nil "^<1>[ ~%]*#<[-A-Za-z]* \\(.*\\)>") - 1st - 1) - (string-match (format nil "^<1>[ ~%]*\\(.*\\)") 1st 1) - 1st))) - -(defun split-frame-string (string) - (let ((rx (format nil "~%\\(~{~A~^\\|~}\\)" - (mapcar #'car *frame-prefixes*)))) - (loop for pos = 0 then (1+ (regexp:match-start match)) - for match = (regexp:match rx string :start pos) - if match collect (subseq string pos (regexp:match-start match)) - else collect (subseq string pos) - while match))) - -(defun string-match (pattern string n) - (let* ((match (nth-value n (regexp:match pattern string)))) - (if match (regexp:match-string string match)))) - -(defimplementation eval-in-frame (form frame-number) - (sys::eval-at (nth-frame frame-number) form)) - -(defimplementation frame-locals (frame-number) - (let ((frame (nth-frame frame-number))) - (loop for i below (%frame-count-vars frame) - collect (list :name (%frame-var-name frame i) - :value (%frame-var-value frame i) - :id 0)))) - -(defimplementation frame-var-value (frame var) - (%frame-var-value (nth-frame frame) var)) - -;;; Interpreter-Variablen-Environment has the shape -;;; NIL or #(v1 val1 ... vn valn NEXT-ENV). - -(defun %frame-count-vars (frame) - (cond ((sys::eval-frame-p frame) - (do ((venv (frame-venv frame) (next-venv venv)) - (count 0 (+ count (/ (1- (length venv)) 2)))) - ((not venv) count))) - ((member (frame-type frame) '(compiled-fun sys-fun fun special-op)) - (length (%parse-stack-values frame))) - (t 0))) - -(defun %frame-var-name (frame i) - (cond ((sys::eval-frame-p frame) - (nth-value 0 (venv-ref (frame-venv frame) i))) - (t (format nil "~D" i)))) - -(defun %frame-var-value (frame i) - (cond ((sys::eval-frame-p frame) - (let ((name (venv-ref (frame-venv frame) i))) - (multiple-value-bind (v c) (ignore-errors (sys::eval-at frame name)) - (if c - (format-sldb-condition c) - v)))) - ((member (frame-type frame) '(compiled-fun sys-fun fun special-op)) - (let ((str (nth i (%parse-stack-values frame)))) - (trim-whitespace (subseq str 2)))) - (t (break "Not implemented")))) - -(defun frame-venv (frame) - (let ((env (sys::eval-at frame '(sys::the-environment)))) - (svref env 0))) - -(defun next-venv (venv) (svref venv (1- (length venv)))) - -(defun venv-ref (env i) - "Reference the Ith binding in ENV. -Return two values: NAME and VALUE" - (let ((idx (* i 2))) - (if (< idx (1- (length env))) - (values (svref env idx) (svref env (1+ idx))) - (venv-ref (next-venv env) (- i (/ (1- (length env)) 2)))))) - -(defun %parse-stack-values (frame) - (labels ((next (fp) (sys::frame-down 1 fp 1)) - (parse (fp accu) - (let ((str (frame-to-string fp))) - (cond ((is-prefix-p "- " str) - (parse (next fp) (cons str accu))) - ((is-prefix-p "<1> " str) - ;;(when (eq (frame-type frame) 'compiled-fun) - ;; (pop accu)) - (dolist (str (cdr (split-frame-string str))) - (when (is-prefix-p "- " str) - (push str accu))) - (nreverse accu)) - (t (parse (next fp) accu)))))) - (parse (next frame) '()))) - -(defun is-prefix-p (regexp string) - (if (regexp:match (concatenate 'string "^" regexp) string) t)) - -(defimplementation return-from-frame (index form) - (sys::return-from-eval-frame (nth-frame index) form)) - -(defimplementation restart-frame (index) - (sys::redo-eval-frame (nth-frame index))) - -(defimplementation frame-source-location (index) - `(:error - ,(format nil "frame-source-location not implemented. (frame: ~A)" - (nth-frame index)))) - -;;;; Profiling - -(defimplementation profile (fname) - (eval `(swank-monitor:monitor ,fname))) ;monitor is a macro - -(defimplementation profiled-functions () - swank-monitor:*monitored-functions*) - -(defimplementation unprofile (fname) - (eval `(swank-monitor:unmonitor ,fname))) ;unmonitor is a macro - -(defimplementation unprofile-all () - (swank-monitor:unmonitor)) - -(defimplementation profile-report () - (swank-monitor:report-monitoring)) - -(defimplementation profile-reset () - (swank-monitor:reset-all-monitoring)) - -(defimplementation profile-package (package callers-p methods) - (declare (ignore callers-p methods)) - (swank-monitor:monitor-all package)) - -;;;; Handle compiler conditions (find out location of error etc.) - -(defmacro compile-file-frobbing-notes ((&rest args) &body body) - "Pass ARGS to COMPILE-FILE, send the compiler notes to -*STANDARD-INPUT* and frob them in BODY." - `(let ((*error-output* (make-string-output-stream)) - (*compile-verbose* t)) - (multiple-value-prog1 - (compile-file ,@args) - (handler-case - (with-input-from-string - (*standard-input* (get-output-stream-string *error-output*)) - ,@body) - (sys::simple-end-of-file () nil))))) - -(defvar *orig-c-warn* (symbol-function 'system::c-warn)) -(defvar *orig-c-style-warn* (symbol-function 'system::c-style-warn)) -(defvar *orig-c-error* (symbol-function 'system::c-error)) -(defvar *orig-c-report-problems* (symbol-function 'system::c-report-problems)) - -(defmacro dynamic-flet (names-functions &body body) - "(dynamic-flet ((NAME FUNCTION) ...) BODY ...) -Execute BODY with NAME's function slot set to FUNCTION." - `(ext:letf* ,(loop for (name function) in names-functions - collect `((symbol-function ',name) ,function)) - ,@body)) - -(defvar *buffer-name* nil) -(defvar *buffer-offset*) - -(defun compiler-note-location () - "Return the current compiler location." - (let ((lineno1 sys::*compile-file-lineno1*) - (lineno2 sys::*compile-file-lineno2*) - (file sys::*compile-file-truename*)) - (cond ((and file lineno1 lineno2) - (make-location (list ':file (namestring file)) - (list ':line lineno1))) - (*buffer-name* - (make-location (list ':buffer *buffer-name*) - (list ':offset *buffer-offset* 0))) - (t - (list :error "No error location available"))))) - -(defun signal-compiler-warning (cstring args severity orig-fn) - (signal 'compiler-condition - :severity severity - :message (apply #'format nil cstring args) - :location (compiler-note-location)) - (apply orig-fn cstring args)) - -(defun c-warn (cstring &rest args) - (signal-compiler-warning cstring args :warning *orig-c-warn*)) - -(defun c-style-warn (cstring &rest args) - (dynamic-flet ((sys::c-warn *orig-c-warn*)) - (signal-compiler-warning cstring args :style-warning *orig-c-style-warn*))) - -(defun c-error (&rest args) - (signal 'compiler-condition - :severity :error - :message (apply #'format nil - (if (= (length args) 3) - (cdr args) - args)) - :location (compiler-note-location)) - (apply *orig-c-error* args)) - -(defimplementation call-with-compilation-hooks (function) - (handler-bind ((warning #'handle-notification-condition)) - (dynamic-flet ((system::c-warn #'c-warn) - (system::c-style-warn #'c-style-warn) - (system::c-error #'c-error)) - (funcall function)))) - -(defun handle-notification-condition (condition) - "Handle a condition caused by a compiler warning." - (signal 'compiler-condition - :original-condition condition - :severity :warning - :message (princ-to-string condition) - :location (compiler-note-location))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (with-compilation-hooks () - (with-compilation-unit () - (multiple-value-bind (fasl-file warningsp failurep) - (compile-file input-file - :output-file output-file - :external-format external-format) - (values fasl-file warningsp - (or failurep - (and load-p - (not (load fasl-file))))))))) - -(defimplementation swank-compile-string (string &key buffer position filename - policy) - (declare (ignore filename policy)) - (with-compilation-hooks () - (let ((*buffer-name* buffer) - (*buffer-offset* position)) - (funcall (compile nil (read-from-string - (format nil "(~S () ~A)" 'lambda string)))) - t))) - -;;;; Portable XREF from the CMU AI repository. - -(setq pxref::*handle-package-forms* '(cl:in-package)) - -(defmacro defxref (name function) - `(defimplementation ,name (name) - (xref-results (,function name)))) - -(defxref who-calls pxref:list-callers) -(defxref who-references pxref:list-readers) -(defxref who-binds pxref:list-setters) -(defxref who-sets pxref:list-setters) -(defxref list-callers pxref:list-callers) -(defxref list-callees pxref:list-callees) - -(defun xref-results (symbols) - (let ((xrefs '())) - (dolist (symbol symbols) - (push (fspec-location symbol symbol) xrefs)) - xrefs)) - -(when (find-package :swank-loader) - (setf (symbol-function (intern "USER-INIT-FILE" :swank-loader)) - (lambda () - (let ((home (user-homedir-pathname))) - (and (ext:probe-directory home) - (probe-file (format nil "~A/.swank.lisp" - (namestring (truename home))))))))) - -;;; Don't set *debugger-hook* to nil on break. -(ext:without-package-lock () - (defun break (&optional (format-string "Break") &rest args) - (if (not sys::*use-clcs*) - (progn - (terpri *error-output*) - (apply #'format *error-output* - (concatenate 'string "*** - " format-string) - args) - (funcall ext:*break-driver* t)) - (let ((condition - (make-condition 'simple-condition - :format-control format-string - :format-arguments args)) - ;;(*debugger-hook* nil) - ;; Issue 91 - ) - (ext:with-restarts - ((continue - :report (lambda (stream) - (format stream (sys::text "Return from ~S loop") - 'break)) - ())) - (with-condition-restarts condition (list (find-restart 'continue)) - (invoke-debugger condition))))) - nil)) - -;;;; Inspecting - -(defmethod emacs-inspect ((o t)) - (let* ((*print-array* nil) (*print-pretty* t) - (*print-circle* t) (*print-escape* t) - (*print-lines* custom:*inspect-print-lines*) - (*print-level* custom:*inspect-print-level*) - (*print-length* custom:*inspect-print-length*) - (sys::*inspect-all* (make-array 10 :fill-pointer 0 :adjustable t)) - (tmp-pack (make-package (gensym "INSPECT-TMP-PACKAGE-"))) - (*package* tmp-pack) - (sys::*inspect-unbound-value* (intern "#" tmp-pack))) - (let ((inspection (sys::inspect-backend o))) - (append (list - (format nil "~S~% ~A~{~%~A~}~%" o - (sys::insp-title inspection) - (sys::insp-blurb inspection))) - (loop with count = (sys::insp-num-slots inspection) - for i below count - append (multiple-value-bind (value name) - (funcall (sys::insp-nth-slot inspection) - i) - `((:value ,name) " = " (:value ,value) - (:newline)))))))) - -(defimplementation quit-lisp () - #+lisp=cl (ext:quit) - #-lisp=cl (lisp:quit)) - - -(defimplementation preferred-communication-style () - nil) - -;;; FIXME -;;; -;;; Clisp 2.48 added experimental support for threads. Basically, you -;;; can use :SPAWN now, BUT: -;;; -;;; - there are problems with GC, and threads stuffed into weak -;;; hash-tables as is the case for *THREAD-PLIST-TABLE*. -;;; -;;; See test case at -;;; http://thread.gmane.org/gmane.lisp.clisp.devel/20429 -;;; -;;; Even though said to be fixed, it's not: -;;; -;;; http://thread.gmane.org/gmane.lisp.clisp.devel/20429/focus=20443 -;;; -;;; - The DYNAMIC-FLET above is an implementation technique that's -;;; probably not sustainable in light of threads. This got to be -;;; rewritten. -;;; -;;; TCR (2009-07-30) - -#+#.(cl:if (cl:find-package "MP") '(:and) '(:or)) -(progn - (defimplementation spawn (fn &key name) - (mp:make-thread fn :name name)) - - (defvar *thread-plist-table-lock* - (mp:make-mutex :name "THREAD-PLIST-TABLE-LOCK")) - - (defvar *thread-plist-table* (make-hash-table :weak :key) - "A hashtable mapping threads to a plist.") - - (defvar *thread-id-counter* 0) - - (defimplementation thread-id (thread) - (mp:with-mutex-lock (*thread-plist-table-lock*) - (or (getf (gethash thread *thread-plist-table*) 'thread-id) - (setf (getf (gethash thread *thread-plist-table*) 'thread-id) - (incf *thread-id-counter*))))) - - (defimplementation find-thread (id) - (find id (all-threads) - :key (lambda (thread) - (getf (gethash thread *thread-plist-table*) 'thread-id)))) - - (defimplementation thread-name (thread) - ;; To guard against returning #. - (princ-to-string (mp:thread-name thread))) - - (defimplementation thread-status (thread) - (if (thread-alive-p thread) - "RUNNING" - "STOPPED")) - - (defimplementation make-lock (&key name) - (mp:make-mutex :name name :recursive-p t)) - - (defimplementation call-with-lock-held (lock function) - (mp:with-mutex-lock (lock) - (funcall function))) - - (defimplementation current-thread () - (mp:current-thread)) - - (defimplementation all-threads () - (mp:list-threads)) - - (defimplementation interrupt-thread (thread fn) - (mp:thread-interrupt thread :function fn)) - - (defimplementation kill-thread (thread) - (mp:thread-interrupt thread :function t)) - - (defimplementation thread-alive-p (thread) - (mp:thread-active-p thread)) - - (defvar *mailboxes-lock* (make-lock :name "MAILBOXES-LOCK")) - (defvar *mailboxes* (list)) - - (defstruct (mailbox (:conc-name mailbox.)) - thread - (lock (make-lock :name "MAILBOX.LOCK")) - (waitqueue (mp:make-exemption :name "MAILBOX.WAITQUEUE")) - (queue '() :type list)) - - (defun mailbox (thread) - "Return THREAD's mailbox." - (mp:with-mutex-lock (*mailboxes-lock*) - (or (find thread *mailboxes* :key #'mailbox.thread) - (let ((mb (make-mailbox :thread thread))) - (push mb *mailboxes*) - mb)))) - - (defimplementation send (thread message) - (let* ((mbox (mailbox thread)) - (lock (mailbox.lock mbox))) - (mp:with-mutex-lock (lock) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message))) - (mp:exemption-broadcast (mailbox.waitqueue mbox))))) - - (defimplementation receive-if (test &optional timeout) - (let* ((mbox (mailbox (current-thread))) - (lock (mailbox.lock mbox))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (mp:with-mutex-lock (lock) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) (nconc (ldiff q tail) (cdr tail))) - (return (car tail)))) - (when (eq timeout t) (return (values nil t))) - (mp:exemption-wait (mailbox.waitqueue mbox) lock :timeout 0.2)))))) - - -;;;; Weak hashtables - -(defimplementation make-weak-key-hash-table (&rest args) - (apply #'make-hash-table :weak :key args)) - -(defimplementation make-weak-value-hash-table (&rest args) - (apply #'make-hash-table :weak :value args)) - -(defimplementation save-image (filename &optional restart-function) - (let ((args `(,filename - ,@(if restart-function - `((:init-function ,restart-function)))))) - (apply #'ext:saveinitmem args))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/cmucl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/cmucl.lisp deleted file mode 100644 index 12d4282..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/cmucl.lisp +++ /dev/null @@ -1,2470 +0,0 @@ -;;; -*- indent-tabs-mode: nil; outline-regexp: ";;;;+" -*- -;;; -;;; License: Public Domain -;;; -;;;; Introduction -;;; -;;; This is the CMUCL implementation of the `swank/backend' package. - -(defpackage swank/cmucl - (:use cl swank/backend swank/source-path-parser swank/source-file-cache - fwrappers)) - -(in-package swank/cmucl) - -(eval-when (:compile-toplevel :load-toplevel :execute) - - (let ((min-version #x20c)) - (assert (>= c:byte-fasl-file-version min-version) - () "This file requires CMUCL version ~x or newer" min-version)) - - (require 'gray-streams)) - - -(import-swank-mop-symbols :pcl '(:slot-definition-documentation)) - -(defun swank-mop:slot-definition-documentation (slot) - (documentation slot t)) - -;;; UTF8 - -(locally (declare (optimize (ext:inhibit-warnings 3))) - ;; Compile and load the utf8 format, if not already loaded. - (stream::find-external-format :utf-8)) - -(defimplementation string-to-utf8 (string) - (let ((ef (load-time-value (stream::find-external-format :utf-8) t))) - (stream:string-to-octets string :external-format ef))) - -(defimplementation utf8-to-string (octets) - (let ((ef (load-time-value (stream::find-external-format :utf-8) t))) - (stream:octets-to-string octets :external-format ef))) - - -;;;; TCP server -;;; -;;; In CMUCL we support all communication styles. By default we use -;;; `:SIGIO' because it is the most responsive, but it's somewhat -;;; dangerous: CMUCL is not in general "signal safe", and you don't -;;; know for sure what you'll be interrupting. Both `:FD-HANDLER' and -;;; `:SPAWN' are reasonable alternatives. - -(defimplementation preferred-communication-style () - :sigio) - -#-(or darwin mips) -(defimplementation create-socket (host port &key backlog) - (let* ((addr (resolve-hostname host)) - (addr (if (not (find-symbol "SOCKET-ERROR" :ext)) - (ext:htonl addr) - addr))) - (ext:create-inet-listener port :stream :reuse-address t :host addr - :backlog (or backlog 5)))) - -;; There seems to be a bug in create-inet-listener on Mac/OSX and Irix. -#+(or darwin mips) -(defimplementation create-socket (host port &key backlog) - (declare (ignore host)) - (ext:create-inet-listener port :stream :reuse-address t)) - -(defimplementation local-port (socket) - (nth-value 1 (ext::get-socket-host-and-port (socket-fd socket)))) - -(defimplementation close-socket (socket) - (let ((fd (socket-fd socket))) - (sys:invalidate-descriptor fd) - (ext:close-socket fd))) - -(defimplementation accept-connection (socket &key - external-format buffering timeout) - (declare (ignore timeout)) - (make-socket-io-stream (ext:accept-tcp-connection socket) - (ecase buffering - ((t) :full) - (:line :line) - ((nil) :none)) - external-format)) - -;;;;; Sockets - -(defimplementation socket-fd (socket) - "Return the filedescriptor for the socket represented by SOCKET." - (etypecase socket - (fixnum socket) - (sys:fd-stream (sys:fd-stream-fd socket)))) - -(defun resolve-hostname (hostname) - "Return the IP address of HOSTNAME as an integer (in host byte-order)." - (let ((hostent (ext:lookup-host-entry hostname))) - (car (ext:host-entry-addr-list hostent)))) - -(defvar *external-format-to-coding-system* - '((:iso-8859-1 "iso-latin-1-unix") - #+unicode - (:utf-8 "utf-8-unix"))) - -(defimplementation find-external-format (coding-system) - (car (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*))) - -(defun make-socket-io-stream (fd buffering external-format) - "Create a new input/output fd-stream for FD." - (cond (external-format - (sys:make-fd-stream fd :input t :output t - :element-type 'character - :buffering buffering - :external-format external-format)) - (t - (sys:make-fd-stream fd :input t :output t - :element-type '(unsigned-byte 8) - :buffering buffering)))) - -(defimplementation make-fd-stream (fd external-format) - (make-socket-io-stream fd :full external-format)) - -(defimplementation dup (fd) - (multiple-value-bind (clone error) (unix:unix-dup fd) - (unless clone (error "dup failed: ~a" (unix:get-unix-error-msg error))) - clone)) - -(defimplementation command-line-args () - ext:*command-line-strings*) - -(defimplementation exec-image (image-file args) - (multiple-value-bind (ok error) - (unix:unix-execve (car (command-line-args)) - (list* (car (command-line-args)) - "-core" image-file - "-noinit" - args)) - (error "~a" (unix:get-unix-error-msg error)) - ok)) - -;;;;; Signal-driven I/O - -(defimplementation install-sigint-handler (function) - (sys:enable-interrupt :sigint (lambda (signal code scp) - (declare (ignore signal code scp)) - (funcall function)))) - -(defvar *sigio-handlers* '() - "List of (key . function) pairs. -All functions are called on SIGIO, and the key is used for removing -specific functions.") - -(defun reset-sigio-handlers () (setq *sigio-handlers* '())) -;; All file handlers are invalid afer reload. -(pushnew 'reset-sigio-handlers ext:*after-save-initializations*) - -(defun set-sigio-handler () - (sys:enable-interrupt :sigio (lambda (signal code scp) - (sigio-handler signal code scp)))) - -(defun sigio-handler (signal code scp) - (declare (ignore signal code scp)) - (mapc #'funcall (mapcar #'cdr *sigio-handlers*))) - -(defun fcntl (fd command arg) - "fcntl(2) - manipulate a file descriptor." - (multiple-value-bind (ok error) (unix:unix-fcntl fd command arg) - (cond (ok) - (t (error "fcntl: ~A" (unix:get-unix-error-msg error)))))) - -(defimplementation add-sigio-handler (socket fn) - (set-sigio-handler) - (let ((fd (socket-fd socket))) - (fcntl fd unix:f-setown (unix:unix-getpid)) - (let ((old-flags (fcntl fd unix:f-getfl 0))) - (fcntl fd unix:f-setfl (logior old-flags unix:fasync))) - (assert (not (assoc fd *sigio-handlers*))) - (push (cons fd fn) *sigio-handlers*))) - -(defimplementation remove-sigio-handlers (socket) - (let ((fd (socket-fd socket))) - (when (assoc fd *sigio-handlers*) - (setf *sigio-handlers* (remove fd *sigio-handlers* :key #'car)) - (let ((old-flags (fcntl fd unix:f-getfl 0))) - (fcntl fd unix:f-setfl (logandc2 old-flags unix:fasync))) - (sys:invalidate-descriptor fd)) - (assert (not (assoc fd *sigio-handlers*))) - (when (null *sigio-handlers*) - (sys:default-interrupt :sigio)))) - -;;;;; SERVE-EVENT - -(defimplementation add-fd-handler (socket fn) - (let ((fd (socket-fd socket))) - (sys:add-fd-handler fd :input (lambda (_) _ (funcall fn))))) - -(defimplementation remove-fd-handlers (socket) - (sys:invalidate-descriptor (socket-fd socket))) - -(defimplementation wait-for-input (streams &optional timeout) - (assert (member timeout '(nil t))) - (loop - (let ((ready (remove-if-not #'listen streams))) - (when ready (return ready))) - (when timeout (return nil)) - (multiple-value-bind (in out) (make-pipe) - (let* ((f (constantly t)) - (handlers (loop for s in (cons in (mapcar #'to-fd-stream streams)) - collect (add-one-shot-handler s f)))) - (unwind-protect - (let ((*interrupt-queued-handler* (lambda () - (write-char #\! out)))) - (when (check-slime-interrupts) (return :interrupt)) - (sys:serve-event)) - (mapc #'sys:remove-fd-handler handlers) - (close in) - (close out)))))) - -(defun to-fd-stream (stream) - (etypecase stream - (sys:fd-stream stream) - (synonym-stream - (to-fd-stream - (symbol-value (synonym-stream-symbol stream)))) - (two-way-stream - (to-fd-stream (two-way-stream-input-stream stream))))) - -(defun add-one-shot-handler (stream function) - (let (handler) - (setq handler (sys:add-fd-handler (sys:fd-stream-fd stream) :input - (lambda (fd) - (declare (ignore fd)) - (sys:remove-fd-handler handler) - (funcall function stream)))))) - -(defun make-pipe () - (multiple-value-bind (in out) (unix:unix-pipe) - (values (sys:make-fd-stream in :input t :buffering :none) - (sys:make-fd-stream out :output t :buffering :none)))) - - -;;;; Stream handling - -(defimplementation gray-package-name () - "EXT") - - -;;;; Compilation Commands - -(defvar *previous-compiler-condition* nil - "Used to detect duplicates.") - -(defvar *previous-context* nil - "Previous compiler error context.") - -(defvar *buffer-name* nil - "The name of the Emacs buffer we are compiling from. -NIL if we aren't compiling from a buffer.") - -(defvar *buffer-start-position* nil) -(defvar *buffer-substring* nil) - -(defimplementation call-with-compilation-hooks (function) - (let ((*previous-compiler-condition* nil) - (*previous-context* nil) - (*print-readably* nil)) - (handler-bind ((c::compiler-error #'handle-notification-condition) - (c::style-warning #'handle-notification-condition) - (c::warning #'handle-notification-condition)) - (funcall function)))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (clear-xref-info input-file) - (with-compilation-hooks () - (let ((*buffer-name* nil) - (ext:*ignore-extra-close-parentheses* nil)) - (multiple-value-bind (output-file warnings-p failure-p) - (compile-file input-file :output-file output-file - :external-format external-format) - (values output-file warnings-p - (or failure-p - (when load-p - ;; Cache the latest source file for definition-finding. - (source-cache-get input-file - (file-write-date input-file)) - (not (load output-file))))))))) - -(defimplementation swank-compile-string (string &key buffer position filename - policy) - (declare (ignore filename policy)) - (with-compilation-hooks () - (let ((*buffer-name* buffer) - (*buffer-start-position* position) - (*buffer-substring* string) - (source-info (list :emacs-buffer buffer - :emacs-buffer-offset position - :emacs-buffer-string string))) - (with-input-from-string (stream string) - (let ((failurep (ext:compile-from-stream stream :source-info - source-info))) - (not failurep)))))) - - -;;;;; Trapping notes -;;; -;;; We intercept conditions from the compiler and resignal them as -;;; `SWANK:COMPILER-CONDITION's. - -(defun handle-notification-condition (condition) - "Handle a condition caused by a compiler warning." - (unless (eq condition *previous-compiler-condition*) - (let ((context (c::find-error-context nil))) - (setq *previous-compiler-condition* condition) - (setq *previous-context* context) - (signal-compiler-condition condition context)))) - -(defun signal-compiler-condition (condition context) - (signal 'compiler-condition - :original-condition condition - :severity (severity-for-emacs condition) - :message (compiler-condition-message condition) - :source-context (compiler-error-context context) - :location (if (read-error-p condition) - (read-error-location condition) - (compiler-note-location context)))) - -(defun severity-for-emacs (condition) - "Return the severity of CONDITION." - (etypecase condition - ((satisfies read-error-p) :read-error) - (c::compiler-error :error) - (c::style-warning :note) - (c::warning :warning))) - -(defun read-error-p (condition) - (eq (type-of condition) 'c::compiler-read-error)) - -(defun compiler-condition-message (condition) - "Briefly describe a compiler error for Emacs. -When Emacs presents the message it already has the source popped up -and the source form highlighted. This makes much of the information in -the error-context redundant." - (princ-to-string condition)) - -(defun compiler-error-context (error-context) - "Describe context information for Emacs." - (declare (type (or c::compiler-error-context null) error-context)) - (multiple-value-bind (enclosing source) - (if error-context - (values (c::compiler-error-context-enclosing-source error-context) - (c::compiler-error-context-source error-context))) - (if (or enclosing source) - (format nil "~@[--> ~{~<~%--> ~1:;~A ~>~}~%~]~ - ~@[==>~{~&~A~}~]" - enclosing source)))) - -(defun read-error-location (condition) - (let* ((finfo (car (c::source-info-current-file c::*source-info*))) - (file (c::file-info-name finfo)) - (pos (c::compiler-read-error-position condition))) - (cond ((and (eq file :stream) *buffer-name*) - (make-location (list :buffer *buffer-name*) - (list :offset *buffer-start-position* pos))) - ((and (pathnamep file) (not *buffer-name*)) - (make-location (list :file (unix-truename file)) - (list :position (1+ pos)))) - (t (break))))) - -(defun compiler-note-location (context) - "Derive the location of a complier message from its context. -Return a `location' record, or (:error REASON) on failure." - (if (null context) - (note-error-location) - (with-struct (c::compiler-error-context- file-name - original-source - original-source-path) context - (or (locate-compiler-note file-name original-source - (reverse original-source-path)) - (note-error-location))))) - -(defun note-error-location () - "Pseudo-location for notes that can't be located." - (cond (*compile-file-truename* - (make-location (list :file (unix-truename *compile-file-truename*)) - (list :eof))) - (*buffer-name* - (make-location (list :buffer *buffer-name*) - (list :position *buffer-start-position*))) - (t (list :error "No error location available.")))) - -(defun locate-compiler-note (file source source-path) - (cond ((and (eq file :stream) *buffer-name*) - ;; Compiling from a buffer - (make-location (list :buffer *buffer-name*) - (list :offset *buffer-start-position* - (source-path-string-position - source-path *buffer-substring*)))) - ((and (pathnamep file) (null *buffer-name*)) - ;; Compiling from a file - (make-location (list :file (unix-truename file)) - (list :position (1+ (source-path-file-position - source-path file))))) - ((and (eq file :lisp) (stringp source)) - ;; No location known, but we have the source form. - ;; XXX How is this case triggered? -luke (16/May/2004) - ;; This can happen if the compiler needs to expand a macro - ;; but the macro-expander is not yet compiled. Calling the - ;; (interpreted) macro-expander triggers IR1 conversion of - ;; the lambda expression for the expander and invokes the - ;; compiler recursively. - (make-location (list :source-form source) - (list :position 1))))) - -(defun unix-truename (pathname) - (ext:unix-namestring (truename pathname))) - - -;;;; XREF -;;; -;;; Cross-reference support is based on the standard CMUCL `XREF' -;;; package. This package has some caveats: XREF information is -;;; recorded during compilation and not preserved in fasl files, and -;;; XREF recording is disabled by default. Redefining functions can -;;; also cause duplicate references to accumulate, but -;;; `swank-compile-file' will automatically clear out any old records -;;; from the same filename. -;;; -;;; To enable XREF recording, set `c:*record-xref-info*' to true. To -;;; clear out the XREF database call `xref:init-xref-database'. - -(defmacro defxref (name function) - `(defimplementation ,name (name) - (xref-results (,function name)))) - -(defxref who-calls xref:who-calls) -(defxref who-references xref:who-references) -(defxref who-binds xref:who-binds) -(defxref who-sets xref:who-sets) - -;;; More types of XREF information were added since 18e: -;;; - -(defxref who-macroexpands xref:who-macroexpands) -;; XXX -(defimplementation who-specializes (symbol) - (let* ((methods (xref::who-specializes (find-class symbol))) - (locations (mapcar #'method-location methods))) - (mapcar #'list methods locations))) - -(defun xref-results (contexts) - (mapcar (lambda (xref) - (list (xref:xref-context-name xref) - (resolve-xref-location xref))) - contexts)) - -(defun resolve-xref-location (xref) - (let ((name (xref:xref-context-name xref)) - (file (xref:xref-context-file xref)) - (source-path (xref:xref-context-source-path xref))) - (cond ((and file source-path) - (let ((position (source-path-file-position source-path file))) - (make-location (list :file (unix-truename file)) - (list :position (1+ position))))) - (file - (make-location (list :file (unix-truename file)) - (list :function-name (string name)))) - (t - `(:error ,(format nil "Unknown source location: ~S ~S ~S " - name file source-path)))))) - -(defun clear-xref-info (namestring) - "Clear XREF notes pertaining to NAMESTRING. -This is a workaround for a CMUCL bug: XREF records are cumulative." - (when c:*record-xref-info* - (let ((filename (truename namestring))) - (dolist (db (list xref::*who-calls* - xref::*who-is-called* - xref::*who-macroexpands* - xref::*who-references* - xref::*who-binds* - xref::*who-sets*)) - (maphash (lambda (target contexts) - ;; XXX update during traversal? - (setf (gethash target db) - (delete filename contexts - :key #'xref:xref-context-file - :test #'equalp))) - db))))) - - -;;;; Find callers and callees -;;; -;;; Find callers and callees by looking at the constant pool of -;;; compiled code objects. We assume every fdefn object in the -;;; constant pool corresponds to a call to that function. A better -;;; strategy would be to use the disassembler to find actual -;;; call-sites. - -(labels ((make-stack () (make-array 100 :fill-pointer 0 :adjustable t)) - (map-cpool (code fun) - (declare (type kernel:code-component code) (type function fun)) - (loop for i from vm:code-constants-offset - below (kernel:get-header-data code) - do (funcall fun (kernel:code-header-ref code i)))) - - (callees (fun) - (let ((callees (make-stack))) - (map-cpool (vm::find-code-object fun) - (lambda (o) - (when (kernel:fdefn-p o) - (vector-push-extend (kernel:fdefn-function o) - callees)))) - (coerce callees 'list))) - - (callers (fun) - (declare (function fun)) - (let ((callers (make-stack))) - (ext:gc :full t) - ;; scan :dynamic first to avoid the need for even more gcing - (dolist (space '(:dynamic :read-only :static)) - (vm::map-allocated-objects - (lambda (obj header size) - (declare (type fixnum header) (ignore size)) - (when (= vm:code-header-type header) - (map-cpool obj - (lambda (c) - (when (and (kernel:fdefn-p c) - (eq (kernel:fdefn-function c) fun)) - (vector-push-extend obj callers)))))) - space) - (ext:gc)) - (coerce callers 'list))) - - (entry-points (code) - (loop for entry = (kernel:%code-entry-points code) - then (kernel::%function-next entry) - while entry - collect entry)) - - (guess-main-entry-point (entry-points) - (or (find-if (lambda (fun) - (ext:valid-function-name-p - (kernel:%function-name fun))) - entry-points) - (car entry-points))) - - (fun-dspec (fun) - (list (kernel:%function-name fun) (function-location fun))) - - (code-dspec (code) - (let ((eps (entry-points code)) - (di (kernel:%code-debug-info code))) - (cond (eps (fun-dspec (guess-main-entry-point eps))) - (di (list (c::debug-info-name di) - (debug-info-function-name-location di))) - (t (list (princ-to-string code) - `(:error "No src-loc available"))))))) - (declare (inline map-cpool)) - - (defimplementation list-callers (symbol) - (mapcar #'code-dspec (callers (coerce symbol 'function) ))) - - (defimplementation list-callees (symbol) - (mapcar #'fun-dspec (callees symbol)))) - -(defun test-list-callers (count) - (let ((funsyms '())) - (do-all-symbols (s) - (when (and (fboundp s) - (functionp (symbol-function s)) - (not (macro-function s)) - (not (special-operator-p s))) - (push s funsyms))) - (let ((len (length funsyms))) - (dotimes (i count) - (let ((sym (nth (random len) funsyms))) - (format t "~s -> ~a~%" sym (mapcar #'car (list-callers sym)))))))) - -;; (test-list-callers 100) - - -;;;; Resolving source locations -;;; -;;; Our mission here is to "resolve" references to code locations into -;;; actual file/buffer names and character positions. The references -;;; we work from come out of the compiler's statically-generated debug -;;; information, such as `code-location''s and `debug-source''s. For -;;; more details, see the "Debugger Programmer's Interface" section of -;;; the CMUCL manual. -;;; -;;; The first step is usually to find the corresponding "source-path" -;;; for the location. Once we have the source-path we can pull up the -;;; source file and `READ' our way through to the right position. The -;;; main source-code groveling work is done in -;;; `source-path-parser.lisp'. - -(defvar *debug-definition-finding* nil - "When true don't handle errors while looking for definitions. -This is useful when debugging the definition-finding code.") - -(defmacro safe-definition-finding (&body body) - "Execute BODY and return the source-location it returns. -If an error occurs and `*debug-definition-finding*' is false, then -return an error pseudo-location. - -The second return value is NIL if no error occurs, otherwise it is the -condition object." - `(flet ((body () ,@body)) - (if *debug-definition-finding* - (body) - (handler-case (values (progn ,@body) nil) - (error (c) (values `(:error ,(trim-whitespace (princ-to-string c))) - c)))))) - -(defun trim-whitespace (string) - (string-trim #(#\newline #\space #\tab) string)) - -(defun code-location-source-location (code-location) - "Safe wrapper around `code-location-from-source-location'." - (safe-definition-finding - (source-location-from-code-location code-location))) - -(defun source-location-from-code-location (code-location) - "Return the source location for CODE-LOCATION." - (let ((debug-fun (di:code-location-debug-function code-location))) - (when (di::bogus-debug-function-p debug-fun) - ;; Those lousy cheapskates! They've put in a bogus debug source - ;; because the code was compiled at a low debug setting. - (error "Bogus debug function: ~A" debug-fun))) - (let* ((debug-source (di:code-location-debug-source code-location)) - (from (di:debug-source-from debug-source)) - (name (di:debug-source-name debug-source))) - (ecase from - (:file - (location-in-file name code-location debug-source)) - (:stream - (location-in-stream code-location debug-source)) - (:lisp - ;; The location comes from a form passed to `compile'. - ;; The best we can do is return the form itself for printing. - (make-location - (list :source-form (with-output-to-string (*standard-output*) - (debug::print-code-location-source-form - code-location 100 t))) - (list :position 1)))))) - -(defun location-in-file (filename code-location debug-source) - "Resolve the source location for CODE-LOCATION in FILENAME." - (let* ((code-date (di:debug-source-created debug-source)) - (root-number (di:debug-source-root-number debug-source)) - (source-code (get-source-code filename code-date))) - (with-input-from-string (s source-code) - (make-location (list :file (unix-truename filename)) - (list :position (1+ (code-location-stream-position - code-location s root-number))) - `(:snippet ,(read-snippet s)))))) - -(defun location-in-stream (code-location debug-source) - "Resolve the source location for a CODE-LOCATION from a stream. -This only succeeds if the code was compiled from an Emacs buffer." - (unless (debug-source-info-from-emacs-buffer-p debug-source) - (error "The code is compiled from a non-SLIME stream.")) - (let* ((info (c::debug-source-info debug-source)) - (string (getf info :emacs-buffer-string)) - (position (code-location-string-offset - code-location - string))) - (make-location - (list :buffer (getf info :emacs-buffer)) - (list :offset (getf info :emacs-buffer-offset) position) - (list :snippet (with-input-from-string (s string) - (file-position s position) - (read-snippet s)))))) - -;;;;; Function-name locations -;;; -(defun debug-info-function-name-location (debug-info) - "Return a function-name source-location for DEBUG-INFO. -Function-name source-locations are a fallback for when precise -positions aren't available." - (with-struct (c::debug-info- (fname name) source) debug-info - (with-struct (c::debug-source- info from name) (car source) - (ecase from - (:file - (make-location (list :file (namestring (truename name))) - (list :function-name (string fname)))) - (:stream - (assert (debug-source-info-from-emacs-buffer-p (car source))) - (make-location (list :buffer (getf info :emacs-buffer)) - (list :function-name (string fname)))) - (:lisp - (make-location (list :source-form (princ-to-string (aref name 0))) - (list :position 1))))))) - -(defun debug-source-info-from-emacs-buffer-p (debug-source) - "Does the `info' slot of DEBUG-SOURCE contain an Emacs buffer location? -This is true for functions that were compiled directly from buffers." - (info-from-emacs-buffer-p (c::debug-source-info debug-source))) - -(defun info-from-emacs-buffer-p (info) - (and info - (consp info) - (eq :emacs-buffer (car info)))) - - -;;;;; Groveling source-code for positions - -(defun code-location-stream-position (code-location stream root) - "Return the byte offset of CODE-LOCATION in STREAM. Extract the -toplevel-form-number and form-number from CODE-LOCATION and use that -to find the position of the corresponding form. - -Finish with STREAM positioned at the start of the code location." - (let* ((location (debug::maybe-block-start-location code-location)) - (tlf-offset (- (di:code-location-top-level-form-offset location) - root)) - (form-number (di:code-location-form-number location))) - (let ((pos (form-number-stream-position tlf-offset form-number stream))) - (file-position stream pos) - pos))) - -(defun form-number-stream-position (tlf-number form-number stream) - "Return the starting character position of a form in STREAM. -TLF-NUMBER is the top-level-form number. -FORM-NUMBER is an index into a source-path table for the TLF." - (multiple-value-bind (tlf position-map) (read-source-form tlf-number stream) - (let* ((path-table (di:form-number-translations tlf 0)) - (source-path - (if (<= (length path-table) form-number) ; source out of sync? - (list 0) ; should probably signal a condition - (reverse (cdr (aref path-table form-number)))))) - (source-path-source-position source-path tlf position-map)))) - -(defun code-location-string-offset (code-location string) - "Return the byte offset of CODE-LOCATION in STRING. -See CODE-LOCATION-STREAM-POSITION." - (with-input-from-string (s string) - (code-location-stream-position code-location s 0))) - - -;;;; Finding definitions - -;;; There are a great many different types of definition for us to -;;; find. We search for definitions of every kind and return them in a -;;; list. - -(defimplementation find-definitions (name) - (append (function-definitions name) - (setf-definitions name) - (variable-definitions name) - (class-definitions name) - (type-definitions name) - (compiler-macro-definitions name) - (source-transform-definitions name) - (function-info-definitions name) - (ir1-translator-definitions name) - (template-definitions name) - (primitive-definitions name) - (vm-support-routine-definitions name) - )) - -;;;;; Functions, macros, generic functions, methods -;;; -;;; We make extensive use of the compile-time debug information that -;;; CMUCL records, in particular "debug functions" and "code -;;; locations." Refer to the "Debugger Programmer's Interface" section -;;; of the CMUCL manual for more details. - -(defun function-definitions (name) - "Return definitions for NAME in the \"function namespace\", i.e., -regular functions, generic functions, methods and macros. -NAME can any valid function name (e.g, (setf car))." - (let ((macro? (and (symbolp name) (macro-function name))) - (function? (and (ext:valid-function-name-p name) - (ext:info :function :definition name) - (if (symbolp name) (fboundp name) t)))) - (cond (macro? - (list `((defmacro ,name) - ,(function-location (macro-function name))))) - (function? - (let ((function (fdefinition name))) - (if (genericp function) - (gf-definitions name function) - (list (list `(function ,name) - (function-location function))))))))) - -;;;;;; Ordinary (non-generic/macro/special) functions -;;; -;;; First we test if FUNCTION is a closure created by defstruct, and -;;; if so extract the defstruct-description (`dd') from the closure -;;; and find the constructor for the struct. Defstruct creates a -;;; defun for the default constructor and we use that as an -;;; approximation to the source location of the defstruct. -;;; -;;; For an ordinary function we return the source location of the -;;; first code-location we find. -;;; -(defun function-location (function) - "Return the source location for FUNCTION." - (cond ((struct-closure-p function) - (struct-closure-location function)) - ((c::byte-function-or-closure-p function) - (byte-function-location function)) - (t - (compiled-function-location function)))) - -(defun compiled-function-location (function) - "Return the location of a regular compiled function." - (multiple-value-bind (code-location error) - (safe-definition-finding (function-first-code-location function)) - (cond (error (list :error (princ-to-string error))) - (t (code-location-source-location code-location))))) - -(defun function-first-code-location (function) - "Return the first code-location we can find for FUNCTION." - (and (function-has-debug-function-p function) - (di:debug-function-start-location - (di:function-debug-function function)))) - -(defun function-has-debug-function-p (function) - (di:function-debug-function function)) - -(defun function-code-object= (closure function) - (and (eq (vm::find-code-object closure) - (vm::find-code-object function)) - (not (eq closure function)))) - -(defun byte-function-location (fun) - "Return the location of the byte-compiled function FUN." - (etypecase fun - ((or c::hairy-byte-function c::simple-byte-function) - (let* ((di (kernel:%code-debug-info (c::byte-function-component fun)))) - (if di - (debug-info-function-name-location di) - `(:error - ,(format nil "Byte-function without debug-info: ~a" fun))))) - (c::byte-closure - (byte-function-location (c::byte-closure-function fun))))) - -;;; Here we deal with structure accessors. Note that `dd' is a -;;; "defstruct descriptor" structure in CMUCL. A `dd' describes a -;;; `defstruct''d structure. - -(defun struct-closure-p (function) - "Is FUNCTION a closure created by defstruct?" - (or (function-code-object= function #'kernel::structure-slot-accessor) - (function-code-object= function #'kernel::structure-slot-setter) - (function-code-object= function #'kernel::%defstruct))) - -(defun struct-closure-location (function) - "Return the location of the structure that FUNCTION belongs to." - (assert (struct-closure-p function)) - (safe-definition-finding - (dd-location (struct-closure-dd function)))) - -(defun struct-closure-dd (function) - "Return the defstruct-definition (dd) of FUNCTION." - (assert (= (kernel:get-type function) vm:closure-header-type)) - (flet ((find-layout (function) - (sys:find-if-in-closure - (lambda (x) - (let ((value (if (di::indirect-value-cell-p x) - (c:value-cell-ref x) - x))) - (when (kernel::layout-p value) - (return-from find-layout value)))) - function))) - (kernel:layout-info (find-layout function)))) - -(defun dd-location (dd) - "Return the location of a `defstruct'." - (let ((ctor (struct-constructor dd))) - (cond (ctor - (function-location (coerce ctor 'function))) - (t - (let ((name (kernel:dd-name dd))) - (multiple-value-bind (location foundp) - (ext:info :source-location :defvar name) - (cond (foundp - (resolve-source-location location)) - (t - (error "No location for defstruct: ~S" name))))))))) - -(defun struct-constructor (dd) - "Return the name of the constructor from a defstruct definition." - (let* ((constructor (or (kernel:dd-default-constructor dd) - (car (kernel::dd-constructors dd))))) - (if (consp constructor) (car constructor) constructor))) - -;;;;;; Generic functions and methods - -(defun gf-definitions (name function) - "Return the definitions of a generic function and its methods." - (cons (list `(defgeneric ,name) (gf-location function)) - (gf-method-definitions function))) - -(defun gf-location (gf) - "Return the location of the generic function GF." - (definition-source-location gf (pcl::generic-function-name gf))) - -(defun gf-method-definitions (gf) - "Return the locations of all methods of the generic function GF." - (mapcar #'method-definition (pcl::generic-function-methods gf))) - -(defun method-definition (method) - (list (method-dspec method) - (method-location method))) - -(defun method-dspec (method) - "Return a human-readable \"definition specifier\" for METHOD." - (let* ((gf (pcl:method-generic-function method)) - (name (pcl:generic-function-name gf)) - (specializers (pcl:method-specializers method)) - (qualifiers (pcl:method-qualifiers method))) - `(method ,name ,@qualifiers ,(pcl::unparse-specializers specializers)))) - -(defun method-location (method) - (typecase method - (pcl::standard-accessor-method - (definition-source-location - (cond ((pcl::definition-source method) - method) - (t - (pcl::slot-definition-class - (pcl::accessor-method-slot-definition method)))) - (pcl::accessor-method-slot-name method))) - (t - (function-location (or (pcl::method-fast-function method) - (pcl:method-function method)))))) - -(defun genericp (fn) - (typep fn 'generic-function)) - -;;;;;; Types and classes - -(defun type-definitions (name) - "Return `deftype' locations for type NAME." - (maybe-make-definition (ext:info :type :expander name) 'deftype name)) - -(defun maybe-make-definition (function kind name) - "If FUNCTION is non-nil then return its definition location." - (if function - (list (list `(,kind ,name) (function-location function))))) - -(defun class-definitions (name) - "Return the definition locations for the class called NAME." - (if (symbolp name) - (let ((class (kernel::find-class name nil))) - (etypecase class - (null '()) - (kernel::structure-class - (list (list `(defstruct ,name) (dd-location (find-dd name))))) - #+(or) - (conditions::condition-class - (list (list `(define-condition ,name) - (condition-class-location class)))) - (kernel::standard-class - (list (list `(defclass ,name) - (pcl-class-location (find-class name))))) - ((or kernel::built-in-class - conditions::condition-class - kernel:funcallable-structure-class) - (list (list `(class ,name) (class-location class)))))))) - -(defun pcl-class-location (class) - "Return the `defclass' location for CLASS." - (definition-source-location class (pcl:class-name class))) - -;; FIXME: eval used for backward compatibility. -(defun class-location (class) - (declare (type kernel::class class)) - (let ((name (kernel:%class-name class))) - (multiple-value-bind (loc found?) - (let ((x (ignore-errors - (multiple-value-list - (eval `(ext:info :source-location :class ',name)))))) - (values-list x)) - (cond (found? (resolve-source-location loc)) - (`(:error - ,(format nil "No location recorded for class: ~S" name))))))) - -(defun find-dd (name) - "Find the defstruct-definition by the name of its structure-class." - (let ((layout (ext:info :type :compiler-layout name))) - (if layout - (kernel:layout-info layout)))) - -(defun condition-class-location (class) - (let ((slots (conditions::condition-class-slots class)) - (name (conditions::condition-class-name class))) - (cond ((null slots) - `(:error ,(format nil "No location info for condition: ~A" name))) - (t - ;; Find the class via one of its slot-reader methods. - (let* ((slot (first slots)) - (gf (fdefinition - (first (conditions::condition-slot-readers slot))))) - (method-location - (first - (pcl:compute-applicable-methods-using-classes - gf (list (find-class name)))))))))) - -(defun make-name-in-file-location (file string) - (multiple-value-bind (filename c) - (ignore-errors - (unix-truename (merge-pathnames (make-pathname :type "lisp") - file))) - (cond (filename (make-location `(:file ,filename) - `(:function-name ,(string string)))) - (t (list :error (princ-to-string c)))))) - -(defun source-location-form-numbers (location) - (c::decode-form-numbers (c::form-numbers-form-numbers location))) - -(defun source-location-tlf-number (location) - (nth-value 0 (source-location-form-numbers location))) - -(defun source-location-form-number (location) - (nth-value 1 (source-location-form-numbers location))) - -(defun resolve-file-source-location (location) - (let ((filename (c::file-source-location-pathname location)) - (tlf-number (source-location-tlf-number location)) - (form-number (source-location-form-number location))) - (with-open-file (s filename) - (let ((pos (form-number-stream-position tlf-number form-number s))) - (make-location `(:file ,(unix-truename filename)) - `(:position ,(1+ pos))))))) - -(defun resolve-stream-source-location (location) - (let ((info (c::stream-source-location-user-info location)) - (tlf-number (source-location-tlf-number location)) - (form-number (source-location-form-number location))) - ;; XXX duplication in frame-source-location - (assert (info-from-emacs-buffer-p info)) - (destructuring-bind (&key emacs-buffer emacs-buffer-string - emacs-buffer-offset) info - (with-input-from-string (s emacs-buffer-string) - (let ((pos (form-number-stream-position tlf-number form-number s))) - (make-location `(:buffer ,emacs-buffer) - `(:offset ,emacs-buffer-offset ,pos))))))) - -;; XXX predicates for 18e backward compatibilty. Remove them when -;; we're 19a only. -(defun file-source-location-p (object) - (when (fboundp 'c::file-source-location-p) - (c::file-source-location-p object))) - -(defun stream-source-location-p (object) - (when (fboundp 'c::stream-source-location-p) - (c::stream-source-location-p object))) - -(defun source-location-p (object) - (or (file-source-location-p object) - (stream-source-location-p object))) - -(defun resolve-source-location (location) - (etypecase location - ((satisfies file-source-location-p) - (resolve-file-source-location location)) - ((satisfies stream-source-location-p) - (resolve-stream-source-location location)))) - -(defun definition-source-location (object name) - (let ((source (pcl::definition-source object))) - (etypecase source - (null - `(:error ,(format nil "No source info for: ~A" object))) - ((satisfies source-location-p) - (resolve-source-location source)) - (pathname - (make-name-in-file-location source name)) - (cons - (destructuring-bind ((dg name) pathname) source - (declare (ignore dg)) - (etypecase pathname - (pathname (make-name-in-file-location pathname (string name))) - (null `(:error ,(format nil "Cannot resolve: ~S" source))))))))) - -(defun setf-definitions (name) - (let ((f (or (ext:info :setf :inverse name) - (ext:info :setf :expander name) - (and (symbolp name) - (fboundp `(setf ,name)) - (fdefinition `(setf ,name)))))) - (if f - `(((setf ,name) ,(function-location (cond ((functionp f) f) - ((macro-function f)) - ((fdefinition f))))))))) - -(defun variable-location (symbol) - (multiple-value-bind (location foundp) - ;; XXX for 18e compatibilty. rewrite this when we drop 18e - ;; support. - (ignore-errors (eval `(ext:info :source-location :defvar ',symbol))) - (if (and foundp location) - (resolve-source-location location) - `(:error ,(format nil "No source info for variable ~S" symbol))))) - -(defun variable-definitions (name) - (if (symbolp name) - (multiple-value-bind (kind recorded-p) (ext:info :variable :kind name) - (if recorded-p - (list (list `(variable ,kind ,name) - (variable-location name))))))) - -(defun compiler-macro-definitions (symbol) - (maybe-make-definition (compiler-macro-function symbol) - 'define-compiler-macro - symbol)) - -(defun source-transform-definitions (name) - (maybe-make-definition (ext:info :function :source-transform name) - 'c:def-source-transform - name)) - -(defun function-info-definitions (name) - (let ((info (ext:info :function :info name))) - (if info - (append (loop for transform in (c::function-info-transforms info) - collect (list `(c:deftransform ,name - ,(c::type-specifier - (c::transform-type transform))) - (function-location (c::transform-function - transform)))) - (maybe-make-definition (c::function-info-derive-type info) - 'c::derive-type name) - (maybe-make-definition (c::function-info-optimizer info) - 'c::optimizer name) - (maybe-make-definition (c::function-info-ltn-annotate info) - 'c::ltn-annotate name) - (maybe-make-definition (c::function-info-ir2-convert info) - 'c::ir2-convert name) - (loop for template in (c::function-info-templates info) - collect (list `(,(type-of template) - ,(c::template-name template)) - (function-location - (c::vop-info-generator-function - template)))))))) - -(defun ir1-translator-definitions (name) - (maybe-make-definition (ext:info :function :ir1-convert name) - 'c:def-ir1-translator name)) - -(defun template-definitions (name) - (let* ((templates (c::backend-template-names c::*backend*)) - (template (gethash name templates))) - (etypecase template - (null) - (c::vop-info - (maybe-make-definition (c::vop-info-generator-function template) - (type-of template) name))))) - -;; for cases like: (%primitive NAME ...) -(defun primitive-definitions (name) - (let ((csym (find-symbol (string name) 'c))) - (and csym - (not (eq csym name)) - (template-definitions csym)))) - -(defun vm-support-routine-definitions (name) - (let ((sr (c::backend-support-routines c::*backend*)) - (name (find-symbol (string name) 'c))) - (and name - (slot-exists-p sr name) - (maybe-make-definition (slot-value sr name) - (find-symbol (string 'vm-support-routine) 'c) - name)))) - - -;;;; Documentation. - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (flet ((doc (kind) - (or (documentation symbol kind) :not-documented)) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push - :variable (multiple-value-bind (kind recorded-p) - (ext:info variable kind symbol) - (declare (ignore kind)) - (if (or (boundp symbol) recorded-p) - (doc 'variable)))) - (when (fboundp symbol) - (maybe-push - (cond ((macro-function symbol) :macro) - ((special-operator-p symbol) :special-operator) - ((genericp (fdefinition symbol)) :generic-function) - (t :function)) - (doc 'function))) - (maybe-push - :setf (if (or (ext:info setf inverse symbol) - (ext:info setf expander symbol)) - (doc 'setf))) - (maybe-push - :type (if (ext:info type kind symbol) - (doc 'type))) - (maybe-push - :class (if (find-class symbol nil) - (doc 'class))) - (maybe-push - :alien-type (if (not (eq (ext:info alien-type kind symbol) :unknown)) - (doc 'alien-type))) - (maybe-push - :alien-struct (if (ext:info alien-type struct symbol) - (doc nil))) - (maybe-push - :alien-union (if (ext:info alien-type union symbol) - (doc nil))) - (maybe-push - :alien-enum (if (ext:info alien-type enum symbol) - (doc nil))) - result))) - -(defimplementation describe-definition (symbol namespace) - (describe (ecase namespace - (:variable - symbol) - ((:function :generic-function) - (symbol-function symbol)) - (:setf - (or (ext:info setf inverse symbol) - (ext:info setf expander symbol))) - (:type - (kernel:values-specifier-type symbol)) - (:class - (find-class symbol)) - (:alien-struct - (ext:info :alien-type :struct symbol)) - (:alien-union - (ext:info :alien-type :union symbol)) - (:alien-enum - (ext:info :alien-type :enum symbol)) - (:alien-type - (ecase (ext:info :alien-type :kind symbol) - (:primitive - (let ((alien::*values-type-okay* t)) - (funcall (ext:info :alien-type :translator symbol) - (list symbol)))) - ((:defined) - (ext:info :alien-type :definition symbol)) - (:unknown :unkown)))))) - -;;;;; Argument lists - -(defimplementation arglist (fun) - (etypecase fun - (function (function-arglist fun)) - (symbol (function-arglist (or (macro-function fun) - (symbol-function fun)))))) - -(defun function-arglist (fun) - (let ((arglist - (cond ((eval:interpreted-function-p fun) - (eval:interpreted-function-arglist fun)) - ((pcl::generic-function-p fun) - (pcl:generic-function-lambda-list fun)) - ((c::byte-function-or-closure-p fun) - (byte-code-function-arglist fun)) - ((kernel:%function-arglist (kernel:%function-self fun)) - (handler-case (read-arglist fun) - (error () :not-available))) - ;; this should work both for compiled-debug-function - ;; and for interpreted-debug-function - (t - (handler-case (debug-function-arglist - (di::function-debug-function fun)) - (di:unhandled-condition () :not-available)))))) - (check-type arglist (or list (member :not-available))) - arglist)) - -(defimplementation function-name (function) - (cond ((eval:interpreted-function-p function) - (eval:interpreted-function-name function)) - ((pcl::generic-function-p function) - (pcl::generic-function-name function)) - ((c::byte-function-or-closure-p function) - (c::byte-function-name function)) - (t (kernel:%function-name (kernel:%function-self function))))) - -;;; A simple case: the arglist is available as a string that we can -;;; `read'. - -(defun read-arglist (fn) - "Parse the arglist-string of the function object FN." - (let ((string (kernel:%function-arglist - (kernel:%function-self fn))) - (package (find-package - (c::compiled-debug-info-package - (kernel:%code-debug-info - (vm::find-code-object fn)))))) - (with-standard-io-syntax - (let ((*package* (or package *package*))) - (read-from-string string))))) - -;;; A harder case: an approximate arglist is derived from available -;;; debugging information. - -(defun debug-function-arglist (debug-function) - "Derive the argument list of DEBUG-FUNCTION from debug info." - (let ((args (di::debug-function-lambda-list debug-function)) - (required '()) - (optional '()) - (rest '()) - (key '())) - ;; collect the names of debug-vars - (dolist (arg args) - (etypecase arg - (di::debug-variable - (push (di::debug-variable-symbol arg) required)) - ((member :deleted) - (push ':deleted required)) - (cons - (ecase (car arg) - (:keyword - (push (second arg) key)) - (:optional - (push (debug-variable-symbol-or-deleted (second arg)) optional)) - (:rest - (push (debug-variable-symbol-or-deleted (second arg)) rest)))))) - ;; intersperse lambda keywords as needed - (append (nreverse required) - (if optional (cons '&optional (nreverse optional))) - (if rest (cons '&rest (nreverse rest))) - (if key (cons '&key (nreverse key)))))) - -(defun debug-variable-symbol-or-deleted (var) - (etypecase var - (di:debug-variable - (di::debug-variable-symbol var)) - ((member :deleted) - '#:deleted))) - -(defun symbol-debug-function-arglist (fname) - "Return FNAME's debug-function-arglist and %function-arglist. -A utility for debugging DEBUG-FUNCTION-ARGLIST." - (let ((fn (fdefinition fname))) - (values (debug-function-arglist (di::function-debug-function fn)) - (kernel:%function-arglist (kernel:%function-self fn))))) - -;;; Deriving arglists for byte-compiled functions: -;;; -(defun byte-code-function-arglist (fn) - ;; There doesn't seem to be much arglist information around for - ;; byte-code functions. Use the arg-count and return something like - ;; (arg0 arg1 ...) - (etypecase fn - (c::simple-byte-function - (loop for i from 0 below (c::simple-byte-function-num-args fn) - collect (make-arg-symbol i))) - (c::hairy-byte-function - (hairy-byte-function-arglist fn)) - (c::byte-closure - (byte-code-function-arglist (c::byte-closure-function fn))))) - -(defun make-arg-symbol (i) - (make-symbol (format nil "~A~D" (string 'arg) i))) - -;;; A "hairy" byte-function is one that takes a variable number of -;;; arguments. `hairy-byte-function' is a type from the bytecode -;;; interpreter. -;;; -(defun hairy-byte-function-arglist (fn) - (let ((counter -1)) - (flet ((next-arg () (make-arg-symbol (incf counter)))) - (with-struct (c::hairy-byte-function- min-args max-args rest-arg-p - keywords-p keywords) fn - (let ((arglist '()) - (optional (- max-args min-args))) - ;; XXX isn't there a better way to write this? - ;; (Looks fine to me. -luke) - (dotimes (i min-args) - (push (next-arg) arglist)) - (when (plusp optional) - (push '&optional arglist) - (dotimes (i optional) - (push (next-arg) arglist))) - (when rest-arg-p - (push '&rest arglist) - (push (next-arg) arglist)) - (when keywords-p - (push '&key arglist) - (loop for (key _ __) in keywords - do (push key arglist)) - (when (eq keywords-p :allow-others) - (push '&allow-other-keys arglist))) - (nreverse arglist)))))) - - -;;;; Miscellaneous. - -(defimplementation macroexpand-all (form &optional env) - (walker:macroexpand-all form env)) - -(defimplementation compiler-macroexpand-1 (form &optional env) - (ext:compiler-macroexpand-1 form env)) - -(defimplementation compiler-macroexpand (form &optional env) - (ext:compiler-macroexpand form env)) - -(defimplementation set-default-directory (directory) - (setf (ext:default-directory) (namestring directory)) - ;; Setting *default-pathname-defaults* to an absolute directory - ;; makes the behavior of MERGE-PATHNAMES a bit more intuitive. - (setf *default-pathname-defaults* (pathname (ext:default-directory))) - (default-directory)) - -(defimplementation default-directory () - (namestring (ext:default-directory))) - -(defimplementation getpid () - (unix:unix-getpid)) - -(defimplementation lisp-implementation-type-name () - "cmucl") - -(defimplementation quit-lisp () - (ext::quit)) - -;;; source-path-{stream,file,string,etc}-position moved into -;;; source-path-parser - - -;;;; Debugging - -(defvar *sldb-stack-top*) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (unix:unix-sigsetmask 0) - (let* ((*sldb-stack-top* (or debug:*stack-top-hint* (di:top-frame))) - (debug:*stack-top-hint* nil) - (kernel:*current-level* 0)) - (handler-bind ((di::unhandled-condition - (lambda (condition) - (error 'sldb-condition - :original-condition condition)))) - (unwind-protect - (progn - #+(or)(sys:scrub-control-stack) - (funcall debugger-loop-fn)) - #+(or)(sys:scrub-control-stack) - )))) - -(defun frame-down (frame) - (handler-case (di:frame-down frame) - (di:no-debug-info () nil))) - -(defun nth-frame (index) - (do ((frame *sldb-stack-top* (frame-down frame)) - (i index (1- i))) - ((zerop i) frame))) - -(defimplementation compute-backtrace (start end) - (let ((end (or end most-positive-fixnum))) - (loop for f = (nth-frame start) then (frame-down f) - for i from start below end - while f collect f))) - -(defimplementation print-frame (frame stream) - (let ((*standard-output* stream)) - (handler-case - (debug::print-frame-call frame :verbosity 1 :number nil) - (error (e) - (ignore-errors (princ e stream)))))) - -(defimplementation frame-source-location (index) - (let ((frame (nth-frame index))) - (cond ((foreign-frame-p frame) (foreign-frame-source-location frame)) - ((code-location-source-location (di:frame-code-location frame)))))) - -(defimplementation eval-in-frame (form index) - (di:eval-in-frame (nth-frame index) form)) - -(defun frame-debug-vars (frame) - "Return a vector of debug-variables in frame." - (let ((loc (di:frame-code-location frame))) - (remove-if - (lambda (v) - (not (eq (di:debug-variable-validity v loc) :valid))) - (di::debug-function-debug-variables (di:frame-debug-function frame))))) - -(defun debug-var-value (var frame) - (let* ((loc (di:frame-code-location frame)) - (validity (di:debug-variable-validity var loc))) - (ecase validity - (:valid (di:debug-variable-value var frame)) - ((:invalid :unknown) (make-symbol (string validity)))))) - -(defimplementation frame-locals (index) - (let ((frame (nth-frame index))) - (loop for v across (frame-debug-vars frame) - collect (list :name (di:debug-variable-symbol v) - :id (di:debug-variable-id v) - :value (debug-var-value v frame))))) - -(defimplementation frame-var-value (frame var) - (let* ((frame (nth-frame frame)) - (dvar (aref (frame-debug-vars frame) var))) - (debug-var-value dvar frame))) - -(defimplementation frame-catch-tags (index) - (mapcar #'car (di:frame-catches (nth-frame index)))) - -(defimplementation frame-package (frame-number) - (let* ((frame (nth-frame frame-number)) - (dbg-fun (di:frame-debug-function frame))) - (typecase dbg-fun - (di::compiled-debug-function - (let* ((comp (di::compiled-debug-function-component dbg-fun)) - (dbg-info (kernel:%code-debug-info comp))) - (typecase dbg-info - (c::compiled-debug-info - (find-package (c::compiled-debug-info-package dbg-info))))))))) - -(defimplementation return-from-frame (index form) - (let ((sym (find-symbol (string 'find-debug-tag-for-frame) - :debug-internals))) - (if sym - (let* ((frame (nth-frame index)) - (probe (funcall sym frame))) - (cond (probe (throw (car probe) (eval-in-frame form index))) - (t (format nil "Cannot return from frame: ~S" frame)))) - "return-from-frame is not implemented in this version of CMUCL."))) - -(defimplementation activate-stepping (frame) - (set-step-breakpoints (nth-frame frame))) - -(defimplementation sldb-break-on-return (frame) - (break-on-return (nth-frame frame))) - -;;; We set the breakpoint in the caller which might be a bit confusing. -;;; -(defun break-on-return (frame) - (let* ((caller (di:frame-down frame)) - (cl (di:frame-code-location caller))) - (flet ((hook (frame bp) - (when (frame-pointer= frame caller) - (di:delete-breakpoint bp) - (signal-breakpoint bp frame)))) - (let* ((info (ecase (di:code-location-kind cl) - ((:single-value-return :unknown-return) nil) - (:known-return (debug-function-returns - (di:frame-debug-function frame))))) - (bp (di:make-breakpoint #'hook cl :kind :code-location - :info info))) - (di:activate-breakpoint bp) - `(:ok ,(format nil "Set breakpoint in ~A" caller)))))) - -(defun frame-pointer= (frame1 frame2) - "Return true if the frame pointers of FRAME1 and FRAME2 are the same." - (sys:sap= (di::frame-pointer frame1) (di::frame-pointer frame2))) - -;;; The PC in escaped frames at a single-return-value point is -;;; actually vm:single-value-return-byte-offset bytes after the -;;; position given in the debug info. Here we try to recognize such -;;; cases. -;;; -(defun next-code-locations (frame code-location) - "Like `debug::next-code-locations' but be careful in escaped frames." - (let ((next (debug::next-code-locations code-location))) - (flet ((adjust-pc () - (let ((cl (di::copy-compiled-code-location code-location))) - (incf (di::compiled-code-location-pc cl) - vm:single-value-return-byte-offset) - cl))) - (cond ((and (di::compiled-frame-escaped frame) - (eq (di:code-location-kind code-location) - :single-value-return) - (= (length next) 1) - (di:code-location= (car next) (adjust-pc))) - (debug::next-code-locations (car next))) - (t - next))))) - -(defun set-step-breakpoints (frame) - (let ((cl (di:frame-code-location frame))) - (when (di:debug-block-elsewhere-p (di:code-location-debug-block cl)) - (error "Cannot step in elsewhere code")) - (let* ((debug::*bad-code-location-types* - (remove :call-site debug::*bad-code-location-types*)) - (next (next-code-locations frame cl))) - (cond (next - (let ((steppoints '())) - (flet ((hook (bp-frame bp) - (signal-breakpoint bp bp-frame) - (mapc #'di:delete-breakpoint steppoints))) - (dolist (code-location next) - (let ((bp (di:make-breakpoint #'hook code-location - :kind :code-location))) - (di:activate-breakpoint bp) - (push bp steppoints)))))) - (t - (break-on-return frame)))))) - - -;; XXX the return values at return breakpoints should be passed to the -;; user hooks. debug-int.lisp should be changed to do this cleanly. - -;;; The sigcontext and the PC for a breakpoint invocation are not -;;; passed to user hook functions, but we need them to extract return -;;; values. So we advice di::handle-breakpoint and bind the values to -;;; special variables. -;;; -(defvar *breakpoint-sigcontext*) -(defvar *breakpoint-pc*) - -(define-fwrapper bind-breakpoint-sigcontext (offset c sigcontext) - (let ((*breakpoint-sigcontext* sigcontext) - (*breakpoint-pc* offset)) - (call-next-function))) -(set-fwrappers 'di::handle-breakpoint '()) -(fwrap 'di::handle-breakpoint #'bind-breakpoint-sigcontext) - -(defun sigcontext-object (sc index) - "Extract the lisp object in sigcontext SC at offset INDEX." - (kernel:make-lisp-obj (vm:sigcontext-register sc index))) - -(defun known-return-point-values (sigcontext sc-offsets) - (let ((fp (system:int-sap (vm:sigcontext-register sigcontext - vm::cfp-offset)))) - (system:without-gcing - (loop for sc-offset across sc-offsets - collect (di::sub-access-debug-var-slot fp sc-offset sigcontext))))) - -;;; CMUCL returns the first few values in registers and the rest on -;;; the stack. In the multiple value case, the number of values is -;;; stored in a dedicated register. The values of the registers can be -;;; accessed in the sigcontext for the breakpoint. There are 3 kinds -;;; of return conventions: :single-value-return, :unknown-return, and -;;; :known-return. -;;; -;;; The :single-value-return convention returns the value in a -;;; register without setting the nargs registers. -;;; -;;; The :unknown-return variant is used for multiple values. A -;;; :unknown-return point consists actually of 2 breakpoints: one for -;;; the single value case and one for the general case. The single -;;; value breakpoint comes vm:single-value-return-byte-offset after -;;; the multiple value breakpoint. -;;; -;;; The :known-return convention is used by local functions. -;;; :known-return is currently not supported because we don't know -;;; where the values are passed. -;;; -(defun breakpoint-values (breakpoint) - "Return the list of return values for a return point." - (flet ((1st (sc) (sigcontext-object sc (car vm::register-arg-offsets)))) - (let ((sc (locally (declare (optimize (speed 0))) - (alien:sap-alien *breakpoint-sigcontext* (* unix:sigcontext)))) - (cl (di:breakpoint-what breakpoint))) - (ecase (di:code-location-kind cl) - (:single-value-return - (list (1st sc))) - (:known-return - (let ((info (di:breakpoint-info breakpoint))) - (if (vectorp info) - (known-return-point-values sc info) - (progn - ;;(break) - (list "<>" info))))) - (:unknown-return - (let ((mv-return-pc (di::compiled-code-location-pc cl))) - (if (= mv-return-pc *breakpoint-pc*) - (mv-function-end-breakpoint-values sc) - (list (1st sc))))))))) - -;; XXX: di::get-function-end-breakpoint-values takes 2 arguments in -;; newer versions of CMUCL (after ~March 2005). -(defun mv-function-end-breakpoint-values (sigcontext) - (let ((sym (find-symbol "FUNCTION-END-BREAKPOINT-VALUES/STANDARD" :di))) - (cond (sym (funcall sym sigcontext)) - (t (funcall 'di::get-function-end-breakpoint-values sigcontext))))) - -(defun debug-function-returns (debug-fun) - "Return the return style of DEBUG-FUN." - (let* ((cdfun (di::compiled-debug-function-compiler-debug-fun debug-fun))) - (c::compiled-debug-function-returns cdfun))) - -(define-condition breakpoint (simple-condition) - ((message :initarg :message :reader breakpoint.message) - (values :initarg :values :reader breakpoint.values)) - (:report (lambda (c stream) (princ (breakpoint.message c) stream)))) - -(defimplementation condition-extras (condition) - (typecase condition - (breakpoint - ;; pop up the source buffer - `((:show-frame-source 0))) - (t '()))) - -(defun signal-breakpoint (breakpoint frame) - "Signal a breakpoint condition for BREAKPOINT in FRAME. -Try to create a informative message." - (flet ((brk (values fstring &rest args) - (let ((msg (apply #'format nil fstring args)) - (debug:*stack-top-hint* frame)) - (break 'breakpoint :message msg :values values)))) - (with-struct (di::breakpoint- kind what) breakpoint - (case kind - (:code-location - (case (di:code-location-kind what) - ((:single-value-return :known-return :unknown-return) - (let ((values (breakpoint-values breakpoint))) - (brk values "Return value: ~{~S ~}" values))) - (t - #+(or) - (when (eq (di:code-location-kind what) :call-site) - (call-site-function breakpoint frame)) - (brk nil "Breakpoint: ~S ~S" - (di:code-location-kind what) - (di::compiled-code-location-pc what))))) - (:function-start - (brk nil "Function start breakpoint")) - (t (brk nil "Breakpoint: ~A in ~A" breakpoint frame)))))) - -(defimplementation sldb-break-at-start (fname) - (let ((debug-fun (di:function-debug-function (coerce fname 'function)))) - (cond ((not debug-fun) - `(:error ,(format nil "~S has no debug-function" fname))) - (t - (flet ((hook (frame bp &optional args cookie) - (declare (ignore args cookie)) - (signal-breakpoint bp frame))) - (let ((bp (di:make-breakpoint #'hook debug-fun - :kind :function-start))) - (di:activate-breakpoint bp) - `(:ok ,(format nil "Set breakpoint in ~S" fname)))))))) - -(defun frame-cfp (frame) - "Return the Control-Stack-Frame-Pointer for FRAME." - (etypecase frame - (di::compiled-frame (di::frame-pointer frame)) - ((or di::interpreted-frame null) -1))) - -(defun frame-ip (frame) - "Return the (absolute) instruction pointer and the relative pc of FRAME." - (if (not frame) - -1 - (let ((debug-fun (di::frame-debug-function frame))) - (etypecase debug-fun - (di::compiled-debug-function - (let* ((code-loc (di:frame-code-location frame)) - (component (di::compiled-debug-function-component debug-fun)) - (pc (di::compiled-code-location-pc code-loc)) - (ip (sys:without-gcing - (sys:sap-int - (sys:sap+ (kernel:code-instructions component) pc))))) - (values ip pc))) - (di::interpreted-debug-function -1) - (di::bogus-debug-function - #-x86 - (let* ((real (di::frame-real-frame (di::frame-up frame))) - (fp (di::frame-pointer real))) - ;;#+(or) - (progn - (format *debug-io* "Frame-real-frame = ~S~%" real) - (format *debug-io* "fp = ~S~%" fp) - (format *debug-io* "lra = ~S~%" - (kernel:stack-ref fp vm::lra-save-offset))) - (values - (sys:int-sap - (- (kernel:get-lisp-obj-address - (kernel:stack-ref fp vm::lra-save-offset)) - (- (ash vm:function-code-offset vm:word-shift) - vm:function-pointer-type))) - 0)) - #+x86 - (let ((fp (di::frame-pointer (di:frame-up frame)))) - (multiple-value-bind (ra ofp) (di::x86-call-context fp) - (declare (ignore ofp)) - (values ra 0)))))))) - -(defun frame-registers (frame) - "Return the lisp registers CSP, CFP, IP, OCFP, LRA for FRAME-NUMBER." - (let* ((cfp (frame-cfp frame)) - (csp (frame-cfp (di::frame-up frame))) - (ip (frame-ip frame)) - (ocfp (frame-cfp (di::frame-down frame))) - (lra (frame-ip (di::frame-down frame)))) - (values csp cfp ip ocfp lra))) - -(defun print-frame-registers (frame-number) - (let ((frame (di::frame-real-frame (nth-frame frame-number)))) - (flet ((fixnum (p) (etypecase p - (integer p) - (sys:system-area-pointer (sys:sap-int p))))) - (apply #'format t "~ -~8X Stack Pointer -~8X Frame Pointer -~8X Instruction Pointer -~8X Saved Frame Pointer -~8X Saved Instruction Pointer~%" (mapcar #'fixnum - (multiple-value-list (frame-registers frame))))))) - -(defvar *gdb-program-name* - (ext:enumerate-search-list (p "path:gdb") - (when (probe-file p) - (return p)))) - -(defimplementation disassemble-frame (frame-number) - (print-frame-registers frame-number) - (terpri) - (let* ((frame (di::frame-real-frame (nth-frame frame-number))) - (debug-fun (di::frame-debug-function frame))) - (etypecase debug-fun - (di::compiled-debug-function - (let* ((component (di::compiled-debug-function-component debug-fun)) - (fun (di:debug-function-function debug-fun))) - (if fun - (disassemble fun) - (disassem:disassemble-code-component component)))) - (di::bogus-debug-function - (cond ((probe-file *gdb-program-name*) - (let ((ip (sys:sap-int (frame-ip frame)))) - (princ (gdb-command "disas 0x~x" ip)))) - (t - (format t "~%[Disassembling bogus frames not implemented]"))))))) - -(defmacro with-temporary-file ((stream filename) &body body) - `(call/temporary-file (lambda (,stream ,filename) . ,body))) - -(defun call/temporary-file (fun) - (let ((name (system::pick-temporary-file-name))) - (unwind-protect - (with-open-file (stream name :direction :output :if-exists :supersede) - (funcall fun stream name)) - (delete-file name)))) - -(defun gdb-command (format-string &rest args) - (let ((str (gdb-exec (format nil - "interpreter-exec mi2 \"attach ~d\"~%~ - interpreter-exec console ~s~%detach" - (getpid) - (apply #'format nil format-string args)))) - (prompt (format nil - #-(and darwin x86) "~%^done~%(gdb) ~%" - #+(and darwin x86) -"~%^done,thread-id=\"1\"~%(gdb) ~%"))) - (subseq str (+ (or (search prompt str) 0) (length prompt))))) - -(defun gdb-exec (cmd) - (with-temporary-file (file filename) - (write-string cmd file) - (force-output file) - (let* ((output (make-string-output-stream)) - ;; gdb on sparc needs to know the executable to find the - ;; symbols. Without this, gdb can't disassemble anything. - ;; NOTE: We assume that the first entry in - ;; lisp::*cmucl-lib* is the bin directory where lisp is - ;; located. If this is not true, we'll have to do - ;; something better to find the lisp executable. - (lisp-path - #+sparc - (list - (namestring - (probe-file - (merge-pathnames "lisp" (car (lisp::parse-unix-search-path - lisp::*cmucl-lib*)))))) - #-sparc - nil) - (proc (ext:run-program *gdb-program-name* - `(,@lisp-path "-batch" "-x" ,filename) - :wait t - :output output))) - (assert (eq (ext:process-status proc) :exited)) - (assert (eq (ext:process-exit-code proc) 0)) - (get-output-stream-string output)))) - -(defun foreign-frame-p (frame) - #-x86 - (let ((ip (frame-ip frame))) - (and (sys:system-area-pointer-p ip) - (typep (di::frame-debug-function frame) 'di::bogus-debug-function))) - #+x86 - (let ((ip (frame-ip frame))) - (and (sys:system-area-pointer-p ip) - (multiple-value-bind (pc code) - (di::compute-lra-data-from-pc ip) - (declare (ignore pc)) - (not code))))) - -(defun foreign-frame-source-location (frame) - (let ((ip (sys:sap-int (frame-ip frame)))) - (cond ((probe-file *gdb-program-name*) - (parse-gdb-line-info (gdb-command "info line *0x~x" ip))) - (t `(:error "no srcloc available for ~a" frame))))) - -;; The output of gdb looks like: -;; Line 215 of "../../src/lisp/x86-assem.S" -;; starts at address 0x805318c -;; and ends at 0x805318e . -;; The ../../ are fixed up with the "target:" search list which might -;; be wrong sometimes. -(defun parse-gdb-line-info (string) - (with-input-from-string (*standard-input* string) - (let ((w1 (read-word))) - (cond ((equal w1 "Line") - (let ((line (read-word))) - (assert (equal (read-word) "of")) - (let* ((file (read-from-string (read-word))) - (pathname - (or (probe-file file) - (probe-file (format nil "target:lisp/~a" file)) - file))) - (make-location (list :file (unix-truename pathname)) - (list :line (parse-integer line)))))) - (t - `(:error ,string)))))) - -(defun read-word (&optional (stream *standard-input*)) - (peek-char t stream) - (concatenate 'string (loop until (whitespacep (peek-char nil stream)) - collect (read-char stream)))) - -(defun whitespacep (char) - (member char '(#\space #\newline))) - - -;;;; Inspecting - -(defconstant +lowtag-symbols+ - '(vm:even-fixnum-type - vm:function-pointer-type - vm:other-immediate-0-type - vm:list-pointer-type - vm:odd-fixnum-type - vm:instance-pointer-type - vm:other-immediate-1-type - vm:other-pointer-type) - "Names of the constants that specify type tags. -The `symbol-value' of each element is a type tag.") - -(defconstant +header-type-symbols+ - (labels ((suffixp (suffix string) - (and (>= (length string) (length suffix)) - (string= string suffix :start1 (- (length string) - (length suffix))))) - (header-type-symbol-p (x) - (and (suffixp "-TYPE" (symbol-name x)) - (not (member x +lowtag-symbols+)) - (boundp x) - (typep (symbol-value x) 'fixnum)))) - (remove-if-not #'header-type-symbol-p - (append (apropos-list "-TYPE" "VM") - (apropos-list "-TYPE" "BIGNUM")))) - "A list of names of the type codes in boxed objects.") - -(defimplementation describe-primitive-type (object) - (with-output-to-string (*standard-output*) - (let* ((lowtag (kernel:get-lowtag object)) - (lowtag-symbol (find lowtag +lowtag-symbols+ :key #'symbol-value))) - (format t "lowtag: ~A" lowtag-symbol) - (when (member lowtag (list vm:other-pointer-type - vm:function-pointer-type - vm:other-immediate-0-type - vm:other-immediate-1-type - )) - (let* ((type (kernel:get-type object)) - (type-symbol (find type +header-type-symbols+ - :key #'symbol-value))) - (format t ", type: ~A" type-symbol)))))) - -(defmethod emacs-inspect ((o t)) - (cond ((di::indirect-value-cell-p o) - `("Value: " (:value ,(c:value-cell-ref o)))) - ((alien::alien-value-p o) - (inspect-alien-value o)) - (t - (cmucl-inspect o)))) - -(defun cmucl-inspect (o) - (destructuring-bind (text labeledp . parts) (inspect::describe-parts o) - (list* (format nil "~A~%" text) - (if labeledp - (loop for (label . value) in parts - append (label-value-line label value)) - (loop for value in parts for i from 0 - append (label-value-line i value)))))) - -(defmethod emacs-inspect ((o function)) - (let ((header (kernel:get-type o))) - (cond ((= header vm:function-header-type) - (append (label-value-line* - ("Self" (kernel:%function-self o)) - ("Next" (kernel:%function-next o)) - ("Name" (kernel:%function-name o)) - ("Arglist" (kernel:%function-arglist o)) - ("Type" (kernel:%function-type o)) - ("Code" (kernel:function-code-header o))) - (list - (with-output-to-string (s) - (disassem:disassemble-function o :stream s))))) - ((= header vm:closure-header-type) - (list* (format nil "~A is a closure.~%" o) - (append - (label-value-line "Function" (kernel:%closure-function o)) - `("Environment:" (:newline)) - (loop for i from 0 below (1- (kernel:get-closure-length o)) - append (label-value-line - i (kernel:%closure-index-ref o i)))))) - ((eval::interpreted-function-p o) - (cmucl-inspect o)) - (t - (call-next-method))))) - -(defmethod emacs-inspect ((o kernel:funcallable-instance)) - (append (label-value-line* - (:function (kernel:%funcallable-instance-function o)) - (:lexenv (kernel:%funcallable-instance-lexenv o)) - (:layout (kernel:%funcallable-instance-layout o))) - (cmucl-inspect o))) - -(defmethod emacs-inspect ((o kernel:code-component)) - (append - (label-value-line* - ("code-size" (kernel:%code-code-size o)) - ("entry-points" (kernel:%code-entry-points o)) - ("debug-info" (kernel:%code-debug-info o)) - ("trace-table-offset" (kernel:code-header-ref - o vm:code-trace-table-offset-slot))) - `("Constants:" (:newline)) - (loop for i from vm:code-constants-offset - below (kernel:get-header-data o) - append (label-value-line i (kernel:code-header-ref o i))) - `("Code:" - (:newline) - , (with-output-to-string (*standard-output*) - (cond ((c::compiled-debug-info-p (kernel:%code-debug-info o)) - (disassem:disassemble-code-component o)) - ((or - (c::debug-info-p (kernel:%code-debug-info o)) - (consp (kernel:code-header-ref - o vm:code-trace-table-offset-slot))) - (c:disassem-byte-component o)) - (t - (disassem:disassemble-memory - (disassem::align - (+ (logandc2 (kernel:get-lisp-obj-address o) - vm:lowtag-mask) - (* vm:code-constants-offset vm:word-bytes)) - (ash 1 vm:lowtag-bits)) - (ash (kernel:%code-code-size o) vm:word-shift)))))))) - -(defmethod emacs-inspect ((o kernel:fdefn)) - (label-value-line* - ("name" (kernel:fdefn-name o)) - ("function" (kernel:fdefn-function o)) - ("raw-addr" (sys:sap-ref-32 - (sys:int-sap (kernel:get-lisp-obj-address o)) - (* vm:fdefn-raw-addr-slot vm:word-bytes))))) - -#+(or) -(defmethod emacs-inspect ((o array)) - (if (typep o 'simple-array) - (call-next-method) - (label-value-line* - (:header (describe-primitive-type o)) - (:rank (array-rank o)) - (:fill-pointer (kernel:%array-fill-pointer o)) - (:fill-pointer-p (kernel:%array-fill-pointer-p o)) - (:elements (kernel:%array-available-elements o)) - (:data (kernel:%array-data-vector o)) - (:displacement (kernel:%array-displacement o)) - (:displaced-p (kernel:%array-displaced-p o)) - (:dimensions (array-dimensions o))))) - -(defmethod emacs-inspect ((o simple-vector)) - (append - (label-value-line* - (:header (describe-primitive-type o)) - (:length (c::vector-length o))) - (loop for i below (length o) - append (label-value-line i (aref o i))))) - -(defun inspect-alien-record (alien) - (with-struct (alien::alien-value- sap type) alien - (with-struct (alien::alien-record-type- kind name fields) type - (append - (label-value-line* - (:sap sap) - (:kind kind) - (:name name)) - (loop for field in fields - append (let ((slot (alien::alien-record-field-name field))) - (declare (optimize (speed 0))) - (label-value-line slot (alien:slot alien slot)))))))) - -(defun inspect-alien-pointer (alien) - (with-struct (alien::alien-value- sap type) alien - (label-value-line* - (:sap sap) - (:type type) - (:to (alien::deref alien))))) - -(defun inspect-alien-value (alien) - (typecase (alien::alien-value-type alien) - (alien::alien-record-type (inspect-alien-record alien)) - (alien::alien-pointer-type (inspect-alien-pointer alien)) - (t (cmucl-inspect alien)))) - -(defimplementation eval-context (obj) - (cond ((typep (class-of obj) 'structure-class) - (let* ((dd (kernel:layout-info (kernel:layout-of obj))) - (slots (kernel:dd-slots dd))) - (list* (cons '*package* - (symbol-package (if slots - (kernel:dsd-name (car slots)) - (kernel:dd-name dd)))) - (loop for slot in slots collect - (cons (kernel:dsd-name slot) - (funcall (kernel:dsd-accessor slot) obj)))))))) - - -;;;; Profiling -(defimplementation profile (fname) - (eval `(profile:profile ,fname))) - -(defimplementation unprofile (fname) - (eval `(profile:unprofile ,fname))) - -(defimplementation unprofile-all () - (eval `(profile:unprofile)) - "All functions unprofiled.") - -(defimplementation profile-report () - (eval `(profile:report-time))) - -(defimplementation profile-reset () - (eval `(profile:reset-time)) - "Reset profiling counters.") - -(defimplementation profiled-functions () - profile:*timed-functions*) - -(defimplementation profile-package (package callers methods) - (profile:profile-all :package package - :callers-p callers - :methods methods)) - - -;;;; Multiprocessing - -#+mp -(progn - (defimplementation initialize-multiprocessing (continuation) - (mp::init-multi-processing) - (mp:make-process continuation :name "swank") - ;; Threads magic: this never returns! But top-level becomes - ;; available again. - (unless mp::*idle-process* - (mp::startup-idle-and-top-level-loops))) - - (defimplementation spawn (fn &key name) - (mp:make-process fn :name (or name "Anonymous"))) - - (defvar *thread-id-counter* 0) - - (defimplementation thread-id (thread) - (or (getf (mp:process-property-list thread) 'id) - (setf (getf (mp:process-property-list thread) 'id) - (incf *thread-id-counter*)))) - - (defimplementation find-thread (id) - (find id (all-threads) - :key (lambda (p) (getf (mp:process-property-list p) 'id)))) - - (defimplementation thread-name (thread) - (mp:process-name thread)) - - (defimplementation thread-status (thread) - (mp:process-whostate thread)) - - (defimplementation current-thread () - mp:*current-process*) - - (defimplementation all-threads () - (copy-list mp:*all-processes*)) - - (defimplementation interrupt-thread (thread fn) - (mp:process-interrupt thread fn)) - - (defimplementation kill-thread (thread) - (mp:destroy-process thread)) - - (defvar *mailbox-lock* (mp:make-lock "mailbox lock")) - - (defstruct (mailbox (:conc-name mailbox.)) - (mutex (mp:make-lock "process mailbox")) - (queue '() :type list)) - - (defun mailbox (thread) - "Return THREAD's mailbox." - (mp:with-lock-held (*mailbox-lock*) - (or (getf (mp:process-property-list thread) 'mailbox) - (setf (getf (mp:process-property-list thread) 'mailbox) - (make-mailbox))))) - - (defimplementation send (thread message) - (check-slime-interrupts) - (let* ((mbox (mailbox thread))) - (mp:with-lock-held ((mailbox.mutex mbox)) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message)))))) - - (defimplementation receive-if (test &optional timeout) - (let ((mbox (mailbox mp:*current-process*))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (mp:with-lock-held ((mailbox.mutex mbox)) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) - (nconc (ldiff q tail) (cdr tail))) - (return (car tail))))) - (when (eq timeout t) (return (values nil t))) - (mp:process-wait-with-timeout - "receive-if" 0.5 - (lambda () (some test (mailbox.queue mbox))))))) - - - ) ;; #+mp - - - -;;;; GC hooks -;;; -;;; Display GC messages in the echo area to avoid cluttering the -;;; normal output. -;;; - -;; this should probably not be here, but where else? -(defun background-message (message) - (swank::background-message message)) - -(defun print-bytes (nbytes &optional stream) - "Print the number NBYTES to STREAM in KB, MB, or GB units." - (let ((names '((0 bytes) (10 kb) (20 mb) (30 gb) (40 tb) (50 eb)))) - (multiple-value-bind (power name) - (loop for ((p1 n1) (p2 n2)) on names - while n2 do - (when (<= (expt 2 p1) nbytes (1- (expt 2 p2))) - (return (values p1 n1)))) - (cond (name - (format stream "~,1F ~A" (/ nbytes (expt 2 power)) name)) - (t - (format stream "~:D bytes" nbytes)))))) - -(defconstant gc-generations 6) - -#+gencgc -(defun generation-stats () - "Return a string describing the size distribution among the generations." - (let* ((alloc (loop for i below gc-generations - collect (lisp::gencgc-stats i))) - (sum (coerce (reduce #'+ alloc) 'float))) - (format nil "~{~3F~^/~}" - (mapcar (lambda (size) (/ size sum)) - alloc)))) - -(defvar *gc-start-time* 0) - -(defun pre-gc-hook (bytes-in-use) - (setq *gc-start-time* (get-internal-real-time)) - (let ((msg (format nil "[Commencing GC with ~A in use.]" - (print-bytes bytes-in-use)))) - (background-message msg))) - -(defun post-gc-hook (bytes-retained bytes-freed trigger) - (declare (ignore trigger)) - (let* ((seconds (/ (- (get-internal-real-time) *gc-start-time*) - internal-time-units-per-second)) - (msg (format nil "[GC done. ~A freed ~A retained ~A ~4F sec]" - (print-bytes bytes-freed) - (print-bytes bytes-retained) - #+gencgc(generation-stats) - #-gencgc"" - seconds))) - (background-message msg))) - -(defun install-gc-hooks () - (setq ext:*gc-notify-before* #'pre-gc-hook) - (setq ext:*gc-notify-after* #'post-gc-hook)) - -(defun remove-gc-hooks () - (setq ext:*gc-notify-before* #'lisp::default-gc-notify-before) - (setq ext:*gc-notify-after* #'lisp::default-gc-notify-after)) - -(defvar *install-gc-hooks* t - "If non-nil install GC hooks") - -(defimplementation emacs-connected () - (when *install-gc-hooks* - (install-gc-hooks))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;Trace implementations -;;In CMUCL, we have: -;; (trace ) -;; (trace (method ? (+))) -;; (trace :methods t ') ;;to trace all methods of the gf -;; can be a normal name or a (setf name) - -(defun tracedp (spec) - (member spec (eval '(trace)) :test #'equal)) - -(defun toggle-trace-aux (spec &rest options) - (cond ((tracedp spec) - (eval `(untrace ,spec)) - (format nil "~S is now untraced." spec)) - (t - (eval `(trace ,spec ,@options)) - (format nil "~S is now traced." spec)))) - -(defimplementation toggle-trace (spec) - (ecase (car spec) - ((setf) - (toggle-trace-aux spec)) - ((:defgeneric) - (let ((name (second spec))) - (toggle-trace-aux name :methods name))) - ((:defmethod) - (cond ((fboundp `(method ,@(cdr spec))) - (toggle-trace-aux `(method ,(cdr spec)))) - ;; Man, is this ugly - ((fboundp `(pcl::fast-method ,@(cdr spec))) - (toggle-trace-aux `(pcl::fast-method ,@(cdr spec)))) - (t - (error 'undefined-function :name (cdr spec))))) - ((:call) - (destructuring-bind (caller callee) (cdr spec) - (toggle-trace-aux (process-fspec callee) - :wherein (list (process-fspec caller))))) - ;; doesn't work properly - ;; ((:labels :flet) (toggle-trace-aux (process-fspec spec))) - )) - -(defun process-fspec (fspec) - (cond ((consp fspec) - (ecase (first fspec) - ((:defun :defgeneric) (second fspec)) - ((:defmethod) - `(method ,(second fspec) ,@(third fspec) ,(fourth fspec))) - ((:labels) `(labels ,(third fspec) ,(process-fspec (second fspec)))) - ((:flet) `(flet ,(third fspec) ,(process-fspec (second fspec)))))) - (t - fspec))) - -;;; Weak datastructures - -(defimplementation make-weak-key-hash-table (&rest args) - (apply #'make-hash-table :weak-p t args)) - - -;;; Save image - -(defimplementation save-image (filename &optional restart-function) - (multiple-value-bind (pid error) (unix:unix-fork) - (when (not pid) (error "fork: ~A" (unix:get-unix-error-msg error))) - (cond ((= pid 0) - (apply #'ext:save-lisp - filename - (if restart-function - `(:init-function ,restart-function)))) - (t - (let ((status (waitpid pid))) - (destructuring-bind (&key exited? status &allow-other-keys) status - (assert (and exited? (equal status 0)) () - "Invalid exit status: ~a" status))))))) - -(defun waitpid (pid) - (alien:with-alien ((status c-call:int)) - (let ((code (alien:alien-funcall - (alien:extern-alien - waitpid (alien:function c-call:int c-call:int - (* c-call:int) c-call:int)) - pid (alien:addr status) 0))) - (cond ((= code -1) (error "waitpid: ~A" (unix:get-unix-error-msg))) - (t (assert (= code pid)) - (decode-wait-status status)))))) - -(defun decode-wait-status (status) - (let ((output (with-output-to-string (s) - (call-program (list (process-status-program) - (format nil "~d" status)) - :output s)))) - (read-from-string output))) - -(defun call-program (args &key output) - (destructuring-bind (program &rest args) args - (let ((process (ext:run-program program args :output output))) - (when (not program) (error "fork failed")) - (unless (and (eq (ext:process-status process) :exited) - (= (ext:process-exit-code process) 0)) - (error "Non-zero exit status"))))) - -(defvar *process-status-program* nil) - -(defun process-status-program () - (or *process-status-program* - (setq *process-status-program* - (compile-process-status-program)))) - -(defun compile-process-status-program () - (let ((infile (system::pick-temporary-file-name - "/tmp/process-status~d~c.c"))) - (with-open-file (stream infile :direction :output :if-exists :supersede) - (format stream " -#include -#include -#include -#include -#include - -#define FLAG(value) (value ? \"t\" : \"nil\") - -int main (int argc, char** argv) { - assert (argc == 2); - { - char* endptr = NULL; - char* arg = argv[1]; - long int status = strtol (arg, &endptr, 10); - assert (endptr != arg && *endptr == '\\0'); - printf (\"(:exited? %s :status %d :signal? %s :signal %d :coredump? %s\" - \" :stopped? %s :stopsig %d)\\n\", - FLAG(WIFEXITED(status)), WEXITSTATUS(status), - FLAG(WIFSIGNALED(status)), WTERMSIG(status), - FLAG(WCOREDUMP(status)), - FLAG(WIFSTOPPED(status)), WSTOPSIG(status)); - fflush (NULL); - return 0; - } -} -") - (finish-output stream)) - (let* ((outfile (system::pick-temporary-file-name)) - (args (list "cc" "-o" outfile infile))) - (warn "Running cc: ~{~a ~}~%" args) - (call-program args :output t) - (delete-file infile) - outfile))) - -;; FIXME: lisp:unicode-complete introduced in version 20d. -#+#.(swank/backend:with-symbol 'unicode-complete 'lisp) -(defun match-semi-standard (prefix matchp) - ;; Handle the CMUCL's short character names. - (loop for name in lisp::char-name-alist - when (funcall matchp prefix (car name)) - collect (car name))) - -#+#.(swank/backend:with-symbol 'unicode-complete 'lisp) -(defimplementation character-completion-set (prefix matchp) - (let ((names (lisp::unicode-complete prefix))) - ;; Match prefix against semistandard names. If there's a match, - ;; add it to our list of matches. - (let ((semi-standard (match-semi-standard prefix matchp))) - (when semi-standard - (setf names (append semi-standard names)))) - (setf names (mapcar #'string-capitalize names)) - (loop for n in names - when (funcall matchp prefix n) - collect n))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/corman.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/corman.lisp deleted file mode 100644 index 80d9ddd..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/corman.lisp +++ /dev/null @@ -1,583 +0,0 @@ -;;; -;;; swank-corman.lisp --- Corman Lisp specific code for SLIME. -;;; -;;; Copyright (C) 2004, 2005 Espen Wiborg (espenhw@grumblesmurf.org) -;;; -;;; License -;;; ======= -;;; This software is provided 'as-is', without any express or implied -;;; warranty. In no event will the author be held liable for any damages -;;; arising from the use of this software. -;;; -;;; Permission is granted to anyone to use this software for any purpose, -;;; including commercial applications, and to alter it and redistribute -;;; it freely, subject to the following restrictions: -;;; -;;; 1. The origin of this software must not be misrepresented; you must -;;; not claim that you wrote the original software. If you use this -;;; software in a product, an acknowledgment in the product documentation -;;; would be appreciated but is not required. -;;; -;;; 2. Altered source versions must be plainly marked as such, and must -;;; not be misrepresented as being the original software. -;;; -;;; 3. This notice may not be removed or altered from any source -;;; distribution. -;;; -;;; Notes -;;; ===== -;;; You will need CCL 2.51, and you will *definitely* need to patch -;;; CCL with the patches at -;;; http://www.grumblesmurf.org/lisp/corman-patches, otherwise SLIME -;;; will blow up in your face. You should also follow the -;;; instructions on http://www.grumblesmurf.org/lisp/corman-slime. -;;; -;;; The only communication style currently supported is NIL. -;;; -;;; Starting CCL inside emacs (with M-x slime) seems to work for me -;;; with Corman Lisp 2.51, but I have seen random failures with 2.5 -;;; (sometimes it works, other times it hangs on start or hangs when -;;; initializing WinSock) - starting CCL externally and using M-x -;;; slime-connect always works fine. -;;; -;;; Sometimes CCL gets confused and starts giving you random memory -;;; access violation errors on startup; if this happens, try redumping -;;; your image. -;;; -;;; What works -;;; ========== -;;; * Basic editing and evaluation -;;; * Arglist display -;;; * Compilation -;;; * Loading files -;;; * apropos/describe -;;; * Debugger -;;; * Inspector -;;; -;;; TODO -;;; ==== -;;; * More debugger functionality (missing bits: restart-frame, -;;; return-from-frame, disassemble-frame, activate-stepping, -;;; toggle-trace) -;;; * XREF -;;; * Profiling -;;; * More sophisticated communication styles than NIL -;;; - -(in-package :swank/backend) - -;;; Pull in various needed bits -(require :composite-streams) -(require :sockets) -(require :winbase) -(require :lp) - -(use-package :gs) - -;; MOP stuff - -(defclass swank-mop:standard-slot-definition () - () - (:documentation - "Dummy class created so that swank.lisp will compile and load.")) - -(defun named-by-gensym-p (c) - (null (symbol-package (class-name c)))) - -(deftype swank-mop:eql-specializer () - '(satisfies named-by-gensym-p)) - -(defun swank-mop:eql-specializer-object (specializer) - (with-hash-table-iterator (next-entry cl::*clos-singleton-specializers*) - (loop (multiple-value-bind (more key value) - (next-entry) - (unless more (return nil)) - (when (eq specializer value) - (return key)))))) - -(defun swank-mop:class-finalized-p (class) - (declare (ignore class)) - t) - -(defun swank-mop:class-prototype (class) - (make-instance class)) - -(defun swank-mop:specializer-direct-methods (obj) - (declare (ignore obj)) - nil) - -(defun swank-mop:generic-function-argument-precedence-order (gf) - (generic-function-lambda-list gf)) - -(defun swank-mop:generic-function-method-combination (gf) - (declare (ignore gf)) - :standard) - -(defun swank-mop:generic-function-declarations (gf) - (declare (ignore gf)) - nil) - -(defun swank-mop:slot-definition-documentation (slot) - (declare (ignore slot)) - (getf slot :documentation nil)) - -(defun swank-mop:slot-definition-type (slot) - (declare (ignore slot)) - t) - -(import-swank-mop-symbols :cl '(;; classes - :standard-slot-definition - :eql-specializer - :eql-specializer-object - ;; standard class readers - :class-default-initargs - :class-direct-default-initargs - :class-finalized-p - :class-prototype - :specializer-direct-methods - ;; gf readers - :generic-function-argument-precedence-order - :generic-function-declarations - :generic-function-method-combination - ;; method readers - ;; slot readers - :slot-definition-documentation - :slot-definition-type)) - -;;;; swank implementations - -;;; Debugger - -(defvar *stack-trace* nil) -(defvar *frame-trace* nil) - -(defstruct frame - name function address debug-info variables) - -(defimplementation call-with-debugging-environment (fn) - (let* ((real-stack-trace (cl::stack-trace)) - (*stack-trace* (cdr (member 'cl:invoke-debugger real-stack-trace - :key #'car))) - (*frame-trace* - (let* ((db::*debug-level* (1+ db::*debug-level*)) - (db::*debug-frame-pointer* (db::stash-ebp - (ct:create-foreign-ptr))) - (db::*debug-max-level* (length real-stack-trace)) - (db::*debug-min-level* 1)) - (cdr (member #'cl:invoke-debugger - (cons - (make-frame :function nil) - (loop for i from db::*debug-min-level* - upto db::*debug-max-level* - until (eq (db::get-frame-function i) - cl::*top-level*) - collect - (make-frame - :function (db::get-frame-function i) - :address (db::get-frame-address i)))) - :key #'frame-function))))) - (funcall fn))) - -(defimplementation compute-backtrace (start end) - (loop for f in (subseq *stack-trace* start (min end (length *stack-trace*))) - collect f)) - -(defimplementation print-frame (frame stream) - (format stream "~S" frame)) - -(defun get-frame-debug-info (frame) - (or (frame-debug-info frame) - (setf (frame-debug-info frame) - (db::prepare-frame-debug-info (frame-function frame) - (frame-address frame))))) - -(defimplementation frame-locals (frame-number) - (let* ((frame (elt *frame-trace* frame-number)) - (info (get-frame-debug-info frame))) - (let ((var-list - (loop for i from 4 below (length info) by 2 - collect `(list :name ',(svref info i) :id 0 - :value (db::debug-filter ,(svref info i)))))) - (let ((vars (eval-in-frame `(list ,@var-list) frame-number))) - (setf (frame-variables frame) vars))))) - -(defimplementation eval-in-frame (form frame-number) - (let ((frame (elt *frame-trace* frame-number))) - (let ((cl::*compiler-environment* (get-frame-debug-info frame))) - (eval form)))) - -(defimplementation frame-var-value (frame-number var) - (let ((vars (frame-variables (elt *frame-trace* frame-number)))) - (when vars - (second (elt vars var))))) - -(defimplementation frame-source-location (frame-number) - (fspec-location (frame-function (elt *frame-trace* frame-number)))) - -(defun break (&optional (format-control "Break") &rest format-arguments) - (with-simple-restart (continue "Return from BREAK.") - (let ();(*debugger-hook* nil)) - (let ((condition - (make-condition 'simple-condition - :format-control format-control - :format-arguments format-arguments))) - ;;(format *debug-io* ";;; User break: ~A~%" condition) - (invoke-debugger condition)))) - nil) - -;;; Socket communication - -(defimplementation create-socket (host port &key backlog) - (sockets:start-sockets) - (sockets:make-server-socket :host host :port port)) - -(defimplementation local-port (socket) - (sockets:socket-port socket)) - -(defimplementation close-socket (socket) - (close socket)) - -(defimplementation accept-connection (socket - &key external-format buffering timeout) - (declare (ignore buffering timeout external-format)) - (sockets:make-socket-stream (sockets:accept-socket socket))) - -;;; Misc - -(defimplementation preferred-communication-style () - nil) - -(defimplementation getpid () - ccl:*current-process-id*) - -(defimplementation lisp-implementation-type-name () - "cormanlisp") - -(defimplementation quit-lisp () - (sockets:stop-sockets) - (win32:exitprocess 0)) - -(defimplementation set-default-directory (directory) - (setf (ccl:current-directory) directory) - (directory-namestring (setf *default-pathname-defaults* - (truename (merge-pathnames directory))))) - -(defimplementation default-directory () - (directory-namestring (ccl:current-directory))) - -(defimplementation macroexpand-all (form &optional env) - (declare (ignore env)) - (ccl:macroexpand-all form)) - -;;; Documentation - -(defun fspec-location (fspec) - (when (symbolp fspec) - (setq fspec (symbol-function fspec))) - (let ((file (ccl::function-source-file fspec))) - (if file - (handler-case - (let ((truename (truename - (merge-pathnames file - ccl:*cormanlisp-directory*)))) - (make-location (list :file (namestring truename)) - (if (ccl::function-source-line fspec) - (list :line - (1+ (ccl::function-source-line fspec))) - (list :function-name - (princ-to-string - (function-name fspec)))))) - (error (c) (list :error (princ-to-string c)))) - (list :error (format nil "No source information available for ~S" - fspec))))) - -(defimplementation find-definitions (name) - (list (list name (fspec-location name)))) - -(defimplementation arglist (name) - (handler-case - (cond ((and (symbolp name) - (macro-function name)) - (ccl::macro-lambda-list (symbol-function name))) - (t - (when (symbolp name) - (setq name (symbol-function name))) - (if (eq (class-of name) cl::the-class-standard-gf) - (generic-function-lambda-list name) - (ccl:function-lambda-list name)))) - (error () :not-available))) - -(defimplementation function-name (fn) - (handler-case (getf (cl::function-info-list fn) 'cl::function-name) - (error () nil))) - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (flet ((doc (kind &optional (sym symbol)) - (or (documentation sym kind) :not-documented)) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push - :variable (when (boundp symbol) - (doc 'variable))) - (maybe-push - :function (if (fboundp symbol) - (doc 'function))) - (maybe-push - :class (if (find-class symbol nil) - (doc 'class))) - result))) - -(defimplementation describe-definition (symbol namespace) - (ecase namespace - (:variable - (describe symbol)) - ((:function :generic-function) - (describe (symbol-function symbol))) - (:class - (describe (find-class symbol))))) - -;;; Compiler - -(defvar *buffer-name* nil) -(defvar *buffer-position*) -(defvar *buffer-string*) -(defvar *compile-filename* nil) - -;; FIXME -(defimplementation call-with-compilation-hooks (FN) - (handler-bind ((error (lambda (c) - (signal 'compiler-condition - :original-condition c - :severity :warning - :message (format nil "~A" c) - :location - (cond (*buffer-name* - (make-location - (list :buffer *buffer-name*) - (list :offset *buffer-position* 0))) - (*compile-filename* - (make-location - (list :file *compile-filename*) - (list :position 1))) - (t - (list :error "No location"))))))) - (funcall fn))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore external-format policy)) - (with-compilation-hooks () - (let ((*buffer-name* nil) - (*compile-filename* input-file)) - (multiple-value-bind (output-file warnings? failure?) - (compile-file input-file :output-file output-file) - (values output-file warnings? - (or failure? (and load-p (load output-file)))))))) - -(defimplementation swank-compile-string (string &key buffer position filename - policy) - (declare (ignore filename policy)) - (with-compilation-hooks () - (let ((*buffer-name* buffer) - (*buffer-position* position) - (*buffer-string* string)) - (funcall (compile nil (read-from-string - (format nil "(~S () ~A)" 'lambda string)))) - t))) - -;;;; Inspecting - -;; Hack to make swank.lisp load, at least -(defclass file-stream ()) - -(defun comma-separated (list &optional (callback (lambda (v) - `(:value ,v)))) - (butlast (loop for e in list - collect (funcall callback e) - collect ", "))) - -(defmethod emacs-inspect ((class standard-class)) - `("Name: " - (:value ,(class-name class)) - (:newline) - "Super classes: " - ,@(comma-separated (swank-mop:class-direct-superclasses class)) - (:newline) - "Direct Slots: " - ,@(comma-separated - (swank-mop:class-direct-slots class) - (lambda (slot) - `(:value ,slot - ,(princ-to-string - (swank-mop:slot-definition-name slot))))) - (:newline) - "Effective Slots: " - ,@(if (swank-mop:class-finalized-p class) - (comma-separated - (swank-mop:class-slots class) - (lambda (slot) - `(:value ,slot ,(princ-to-string - (swank-mop:slot-definition-name slot))))) - '("#")) - (:newline) - ,@(when (documentation class t) - `("Documentation:" (:newline) ,(documentation class t) (:newline))) - "Sub classes: " - ,@(comma-separated (swank-mop:class-direct-subclasses class) - (lambda (sub) - `(:value ,sub ,(princ-to-string (class-name sub))))) - (:newline) - "Precedence List: " - ,@(if (swank-mop:class-finalized-p class) - (comma-separated - (swank-mop:class-precedence-list class) - (lambda (class) - `(:value ,class - ,(princ-to-string (class-name class))))) - '("#")) - (:newline))) - -(defmethod emacs-inspect ((slot cons)) - ;; Inspects slot definitions - (if (eq (car slot) :name) - `("Name: " (:value ,(swank-mop:slot-definition-name slot)) - (:newline) - ,@(when (swank-mop:slot-definition-documentation slot) - `("Documentation:" - (:newline) - (:value - ,(swank-mop:slot-definition-documentation slot)) - (:newline))) - "Init args: " (:value - ,(swank-mop:slot-definition-initargs slot)) - (:newline) - "Init form: " - ,(if (swank-mop:slot-definition-initfunction slot) - `(:value ,(swank-mop:slot-definition-initform slot)) - "#") (:newline) - "Init function: " - (:value ,(swank-mop:slot-definition-initfunction slot)) - (:newline)) - (call-next-method))) - -(defmethod emacs-inspect ((pathname pathnames::pathname-internal)) - (list* (if (wild-pathname-p pathname) - "A wild pathname." - "A pathname.") - '(:newline) - (append (label-value-line* - ("Namestring" (namestring pathname)) - ("Host" (pathname-host pathname)) - ("Device" (pathname-device pathname)) - ("Directory" (pathname-directory pathname)) - ("Name" (pathname-name pathname)) - ("Type" (pathname-type pathname)) - ("Version" (pathname-version pathname))) - (unless (or (wild-pathname-p pathname) - (not (probe-file pathname))) - (label-value-line "Truename" (truename pathname)))))) - -(defmethod emacs-inspect ((o t)) - (cond ((cl::structurep o) (inspect-structure o)) - (t (call-next-method)))) - -(defun inspect-structure (o) - (let* ((template (cl::uref o 1)) - (num-slots (cl::struct-template-num-slots template))) - (cond ((symbolp template) - (loop for i below num-slots - append (label-value-line i (cl::uref o (+ 2 i))))) - (t - (loop for i below num-slots - append (label-value-line (elt template (+ 6 (* i 5))) - (cl::uref o (+ 2 i)))))))) - - -;;; Threads - -(require 'threads) - -(defstruct (mailbox (:conc-name mailbox.)) - thread - (lock (make-instance 'threads:critical-section)) - (queue '() :type list)) - -(defvar *mailbox-lock* (make-instance 'threads:critical-section)) -(defvar *mailboxes* (list)) - -(defmacro with-lock (lock &body body) - `(threads:with-synchronization (threads:cs ,lock) - ,@body)) - -(defimplementation spawn (fun &key name) - (declare (ignore name)) - (th:create-thread - (lambda () - (handler-bind ((serious-condition #'invoke-debugger)) - (unwind-protect (funcall fun) - (with-lock *mailbox-lock* - (setq *mailboxes* (remove cormanlisp:*current-thread-id* - *mailboxes* :key #'mailbox.thread)))))))) - -(defimplementation thread-id (thread) - thread) - -(defimplementation find-thread (thread) - (if (thread-alive-p thread) - thread)) - -(defimplementation thread-alive-p (thread) - (if (threads:thread-handle thread) t nil)) - -(defimplementation current-thread () - cormanlisp:*current-thread-id*) - -;; XXX implement it -(defimplementation all-threads () - '()) - -;; XXX something here is broken -(defimplementation kill-thread (thread) - (threads:terminate-thread thread 'killed)) - -(defun mailbox (thread) - (with-lock *mailbox-lock* - (or (find thread *mailboxes* :key #'mailbox.thread) - (let ((mb (make-mailbox :thread thread))) - (push mb *mailboxes*) - mb)))) - -(defimplementation send (thread message) - (let ((mbox (mailbox thread))) - (with-lock (mailbox.lock mbox) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message)))))) - -(defimplementation receive () - (let ((mbox (mailbox cormanlisp:*current-thread-id*))) - (loop - (with-lock (mailbox.lock mbox) - (when (mailbox.queue mbox) - (return (pop (mailbox.queue mbox))))) - (sleep 0.1)))) - - -;;; This is probably not good, but it WFM -(in-package :common-lisp) - -(defvar *old-documentation* #'documentation) -(defun documentation (thing &optional (type 'function)) - (if (symbolp thing) - (funcall *old-documentation* thing type) - (values))) - -(defmethod print-object ((restart restart) stream) - (if (or *print-escape* - *print-readably*) - (print-unreadable-object (restart stream :type t :identity t) - (princ (restart-name restart) stream)) - (when (functionp (restart-report-function restart)) - (funcall (restart-report-function restart) stream)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/ecl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/ecl.lisp deleted file mode 100644 index 743aa6e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/ecl.lisp +++ /dev/null @@ -1,1098 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- -;;; -;;; swank-ecl.lisp --- SLIME backend for ECL. -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -;;; Administrivia - -(defpackage swank/ecl - (:use cl swank/backend)) - -(in-package swank/ecl) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun ecl-version () - (let ((version (find-symbol "+ECL-VERSION-NUMBER+" :EXT))) - (if version - (symbol-value version) - 0))) - (when (< (ecl-version) 100301) - (error "~&IMPORTANT:~% ~ - The version of ECL you're using (~A) is too old.~% ~ - Please upgrade to at least 10.3.1.~% ~ - Sorry for the inconvenience.~%~%" - (lisp-implementation-version)))) - -;; Hard dependencies. -(eval-when (:compile-toplevel :load-toplevel :execute) - (require 'sockets)) - -;; Soft dependencies. -(eval-when (:compile-toplevel :load-toplevel :execute) - (when (probe-file "sys:profile.fas") - (require :profile) - (pushnew :profile *features*)) - (when (probe-file "sys:serve-event.fas") - (require :serve-event) - (pushnew :serve-event *features*))) - -(declaim (optimize (debug 3))) - -;;; Swank-mop - -(eval-when (:compile-toplevel :load-toplevel :execute) - (import-swank-mop-symbols - :clos - (and (< (ecl-version) 121201) - `(:eql-specializer - :eql-specializer-object - :generic-function-declarations - :specializer-direct-methods - ,@(unless (fboundp 'clos:compute-applicable-methods-using-classes) - '(:compute-applicable-methods-using-classes)))))) - -(defimplementation gray-package-name () - "GRAY") - - -;;;; UTF8 - -;;; Convert the string STRING to a (simple-array (unsigned-byte 8)). -;;; -;;; string-to-utf8 (string) - -;;; Convert the (simple-array (unsigned-byte 8)) OCTETS to a string. -;;; -;;; utf8-to-string (octets) - - -;;;; TCP Server - -(defun resolve-hostname (name) - (car (sb-bsd-sockets:host-ent-addresses - (sb-bsd-sockets:get-host-by-name name)))) - -(defimplementation create-socket (host port &key backlog) - (let ((socket (make-instance 'sb-bsd-sockets:inet-socket - :type :stream - :protocol :tcp))) - (setf (sb-bsd-sockets:sockopt-reuse-address socket) t) - (sb-bsd-sockets:socket-bind socket (resolve-hostname host) port) - (sb-bsd-sockets:socket-listen socket (or backlog 5)) - socket)) - -(defimplementation local-port (socket) - (nth-value 1 (sb-bsd-sockets:socket-name socket))) - -(defimplementation close-socket (socket) - (sb-bsd-sockets:socket-close socket)) - -(defun accept (socket) - "Like socket-accept, but retry on EAGAIN." - (loop (handler-case - (return (sb-bsd-sockets:socket-accept socket)) - (sb-bsd-sockets:interrupted-error ())))) - -(defimplementation accept-connection (socket - &key external-format - buffering timeout) - (declare (ignore timeout)) - (sb-bsd-sockets:socket-make-stream (accept socket) - :output t - :input t - :buffering (ecase buffering - ((t) :full) - ((nil) :none) - (:line :line)) - :element-type (if external-format - 'character - '(unsigned-byte 8)) - :external-format external-format)) - -;;; Call FN whenever SOCKET is readable. -;;; -;;; add-sigio-handler (socket fn) - -;;; Remove all sigio handlers for SOCKET. -;;; -;;; remove-sigio-handlers (socket) - -;;; Call FN when Lisp is waiting for input and SOCKET is readable. -;;; -;;; add-fd-handler (socket fn) - -;;; Remove all fd-handlers for SOCKET. -;;; -;;; remove-fd-handlers (socket) - -(defimplementation preferred-communication-style () - (cond - ((member :threads *features*) :spawn) - ((member :windows *features*) nil) - (t #|:fd-handler|# nil))) - -;;; Set the 'stream 'timeout. The timeout is either the real number -;;; specifying the timeout in seconds or 'nil for no timeout. -;;; -;;; set-stream-timeout (stream timeout) - - -;;; Hook called when the first connection from Emacs is established. -;;; Called from the INIT-FN of the socket server that accepts the -;;; connection. -;;; -;;; This is intended for setting up extra context, e.g. to discover -;;; that the calling thread is the one that interacts with Emacs. -;;; -;;; emacs-connected () - - -;;;; Unix Integration - -(defimplementation getpid () - (si:getpid)) - -;;; Call FUNCTION on SIGINT (instead of invoking the debugger). -;;; Return old signal handler. -;;; -;;; install-sigint-handler (function) - -;;; XXX! -;;; If ECL is built with thread support, it'll spawn a helper thread -;;; executing the SIGINT handler. We do not want to BREAK into that -;;; helper but into the main thread, though. This is coupled with the -;;; current choice of NIL as communication-style in so far as ECL's -;;; main-thread is also the Slime's REPL thread. - -(defun make-interrupt-handler (real-handler) - #+threads - (let ((main-thread (find 'si:top-level (mp:all-processes) - :key #'mp:process-name))) - #'(lambda (&rest args) - (declare (ignore args)) - (mp:interrupt-process main-thread real-handler))) - #-threads - #'(lambda (&rest args) - (declare (ignore args)) - (funcall real-handler))) - -(defimplementation call-with-user-break-handler (real-handler function) - (let ((old-handler #'si:terminal-interrupt)) - (setf (symbol-function 'si:terminal-interrupt) - (make-interrupt-handler real-handler)) - (unwind-protect (funcall function) - (setf (symbol-function 'si:terminal-interrupt) old-handler)))) - -(defimplementation quit-lisp () - (ext:quit)) - -;;; Default implementation is fine. -;;; -;;; lisp-implementation-type-name -;;; lisp-implementation-program - -(defimplementation socket-fd (socket) - (etypecase socket - (fixnum socket) - (two-way-stream (socket-fd (two-way-stream-input-stream socket))) - (sb-bsd-sockets:socket (sb-bsd-sockets:socket-file-descriptor socket)) - (file-stream (si:file-stream-fd socket)))) - -;;; Create a character stream for the file descriptor FD. This -;;; interface implementation requires either `ffi:c-inline' or has to -;;; wait for the exported interface. -;;; -;;; make-fd-stream (socket-stream) - -;;; Duplicate a file descriptor. If the syscall fails, signal a -;;; condition. See dup(2). This interface requiers `ffi:c-inline' or -;;; has to wait for the exported interface. -;;; -;;; dup (fd) - -;;; Does not apply to ECL which doesn't dump images. -;;; -;;; exec-image (image-file args) - -(defimplementation command-line-args () - (ext:command-args)) - - -;;;; pathnames - -;;; Return a pathname for FILENAME. -;;; A filename in Emacs may for example contain asterisks which should not -;;; be translated to wildcards. -;;; -;;; filename-to-pathname (filename) - -;;; Return the filename for PATHNAME. -;;; -;;; pathname-to-filename (pathname) - -(defimplementation default-directory () - (namestring (ext:getcwd))) - -(defimplementation set-default-directory (directory) - (ext:chdir (namestring directory)) ; adapts *DEFAULT-PATHNAME-DEFAULTS*. - (default-directory)) - - -;;; Call FN with hooks to handle special syntax. Can we use it for -;;; `ffi:c-inline' to be handled as C/C++ code? -;;; -;;; call-with-syntax-hooks - -;;; Return a suitable initial value for SWANK:*READTABLE-ALIST*. -;;; -;;; default-readtable-alist - - -;;;; Packages - -#+package-local-nicknames -(defimplementation package-local-nicknames (package) - (ext:package-local-nicknames package)) - - -;;;; Compilation - -(defvar *buffer-name* nil) -(defvar *buffer-start-position*) - -(defun signal-compiler-condition (&rest args) - (apply #'signal 'compiler-condition args)) - -#-ecl-bytecmp -(defun handle-compiler-message (condition) - ;; ECL emits lots of noise in compiler-notes, like "Invoking - ;; external command". - (unless (typep condition 'c::compiler-note) - (signal-compiler-condition - :original-condition condition - :message (princ-to-string condition) - :severity (etypecase condition - (c:compiler-fatal-error :error) - (c:compiler-error :error) - (error :error) - (style-warning :style-warning) - (warning :warning)) - :location (condition-location condition)))) - -#-ecl-bytecmp -(defun condition-location (condition) - (let ((file (c:compiler-message-file condition)) - (position (c:compiler-message-file-position condition))) - (if (and position (not (minusp position))) - (if *buffer-name* - (make-buffer-location *buffer-name* - *buffer-start-position* - position) - (make-file-location file position)) - (make-error-location "No location found.")))) - -(defimplementation call-with-compilation-hooks (function) - #+ecl-bytecmp - (funcall function) - #-ecl-bytecmp - (handler-bind ((c:compiler-message #'handle-compiler-message)) - (funcall function))) - -(defvar *tmpfile-map* (make-hash-table :test #'equal)) - -(defun note-buffer-tmpfile (tmp-file buffer-name) - ;; EXT:COMPILED-FUNCTION-FILE below will return a namestring. - (let ((tmp-namestring (namestring (truename tmp-file)))) - (setf (gethash tmp-namestring *tmpfile-map*) buffer-name) - tmp-namestring)) - -(defun tmpfile-to-buffer (tmp-file) - (gethash tmp-file *tmpfile-map*)) - -(defimplementation swank-compile-string - (string &key buffer position filename policy) - (declare (ignore policy)) - (with-compilation-hooks () - (let ((*buffer-name* buffer) ; for compilation hooks - (*buffer-start-position* position)) - (let ((tmp-file (si:mkstemp "TMP:ecl-swank-tmpfile-")) - (fasl-file) - (warnings-p) - (failure-p)) - (unwind-protect - (with-open-file (tmp-stream tmp-file :direction :output - :if-exists :supersede) - (write-string string tmp-stream) - (finish-output tmp-stream) - (multiple-value-setq (fasl-file warnings-p failure-p) - (compile-file tmp-file - :load t - :source-truename (or filename - (note-buffer-tmpfile tmp-file buffer)) - :source-offset (1- position)))) - (when (probe-file tmp-file) - (delete-file tmp-file)) - (when fasl-file - (delete-file fasl-file))) - (not failure-p))))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (with-compilation-hooks () - (compile-file input-file :output-file output-file - :load load-p - :external-format external-format))) - -(defvar *external-format-to-coding-system* - '((:latin-1 - "latin-1" "latin-1-unix" "iso-latin-1-unix" - "iso-8859-1" "iso-8859-1-unix") - (:utf-8 "utf-8" "utf-8-unix"))) - -(defun external-format (coding-system) - (or (car (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*)) - (find coding-system (ext:all-encodings) :test #'string-equal))) - -(defimplementation find-external-format (coding-system) - #+unicode (external-format coding-system) - ;; Without unicode support, ECL uses the one-byte encoding of the - ;; underlying OS, and will barf on anything except :DEFAULT. We - ;; return NIL here for known multibyte encodings, so - ;; SWANK:CREATE-SERVER will barf. - #-unicode (let ((xf (external-format coding-system))) - (if (member xf '(:utf-8)) - nil - :default))) - - -;;; Default implementation is fine -;;; -;;; guess-external-format - - -;;;; Streams - -;;; Implemented in `gray' -;;; -;;; make-output-stream -;;; make-input-stream - - -;;;; Documentation - -(defimplementation arglist (name) - (multiple-value-bind (arglist foundp) - (ext:function-lambda-list name) - (if foundp arglist :not-available))) - -(defimplementation type-specifier-p (symbol) - (or (subtypep nil symbol) - (not (eq (type-specifier-arglist symbol) :not-available)))) - -(defimplementation function-name (f) - (typecase f - (generic-function (clos:generic-function-name f)) - (function (si:compiled-function-name f)))) - -;;; Default implementation is fine (CL). -;;; -;;; valid-function-name-p (form) - -#+walker -(defimplementation macroexpand-all (form &optional env) - (walker:macroexpand-all form env)) - -;;; Default implementation is fine. -;;; -;;; compiler-macroexpand-1 -;;; compiler-macroexpand - -(defimplementation collect-macro-forms (form &optional env) - ;; Currently detects only normal macros, not compiler macros. - (declare (ignore env)) - (with-collected-macro-forms (macro-forms) - (handler-bind ((warning #'muffle-warning)) - (ignore-errors - (compile nil `(lambda () ,form)))) - (values macro-forms nil))) - -;;; Expand the format string CONTROL-STRING. -;;; Default implementation is fine. -;;; -;;; format-string-expand - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (flet ((frob (type boundp) - (when (funcall boundp symbol) - (let ((doc (describe-definition symbol type))) - (setf result (list* type doc result)))))) - (frob :VARIABLE #'boundp) - (frob :FUNCTION #'fboundp) - (frob :CLASS (lambda (x) (find-class x nil)))) - result)) - -(defimplementation describe-definition (name type) - (case type - (:variable (documentation name 'variable)) - (:function (documentation name 'function)) - (:class (documentation name 'class)) - (t nil))) - - -;;;; Debugging - -(eval-when (:compile-toplevel :load-toplevel :execute) - (import - '(si::*break-env* - si::*ihs-top* - si::*ihs-current* - si::*ihs-base* - si::*frs-base* - si::*frs-top* - si::*tpl-commands* - si::*tpl-level* - si::frs-top - si::ihs-top - si::ihs-fun - si::ihs-env - si::sch-frs-base - si::set-break-env - si::set-current-ihs - si::tpl-commands))) - -(defun make-invoke-debugger-hook (hook) - (when hook - #'(lambda (condition old-hook) - ;; Regard *debugger-hook* if set by user. - (if *debugger-hook* - nil ; decline, *DEBUGGER-HOOK* will be tried next. - (funcall hook condition old-hook))))) - -(defimplementation install-debugger-globally (function) - (setq *debugger-hook* function) - (setq ext:*invoke-debugger-hook* (make-invoke-debugger-hook function))) - -(defimplementation call-with-debugger-hook (hook fun) - (let ((*debugger-hook* hook) - (ext:*invoke-debugger-hook* (make-invoke-debugger-hook hook))) - (funcall fun))) - -(defvar *backtrace* '()) - -(defun in-swank-package-p (x) - (and - (symbolp x) - (member (symbol-package x) - (list #.(find-package :swank) - #.(find-package :swank/backend) - #.(ignore-errors (find-package :swank-mop)) - #.(ignore-errors (find-package :swank-loader)))) - t)) - -(defun is-swank-source-p (name) - (setf name (pathname name)) - (pathname-match-p - name - (make-pathname :defaults swank-loader::*source-directory* - :name (pathname-name name) - :type (pathname-type name) - :version (pathname-version name)))) - -(defun is-ignorable-fun-p (x) - (or - (in-swank-package-p (frame-name x)) - (multiple-value-bind (file position) - (ignore-errors (si::bc-file (car x))) - (declare (ignore position)) - (if file (is-swank-source-p file))))) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (declare (type function debugger-loop-fn)) - (let* ((*ihs-top* (ihs-top)) - (*ihs-current* *ihs-top*) - (*frs-base* (or (sch-frs-base *frs-top* *ihs-base*) (1+ (frs-top)))) - (*frs-top* (frs-top)) - (*tpl-level* (1+ *tpl-level*)) - (*backtrace* (loop for ihs from 0 below *ihs-top* - collect (list (si::ihs-fun ihs) - (si::ihs-env ihs) - nil)))) - (declare (special *ihs-current*)) - (loop for f from *frs-base* until *frs-top* - do (let ((i (- (si::frs-ihs f) *ihs-base* 1))) - (when (plusp i) - (let* ((x (elt *backtrace* i)) - (name (si::frs-tag f))) - (unless (si::fixnump name) - (push name (third x))))))) - (setf *backtrace* (remove-if #'is-ignorable-fun-p (nreverse *backtrace*))) - (set-break-env) - (set-current-ihs) - (let ((*ihs-base* *ihs-top*)) - (funcall debugger-loop-fn)))) - -(defimplementation compute-backtrace (start end) - (subseq *backtrace* start - (and (numberp end) - (min end (length *backtrace*))))) - -(defun frame-name (frame) - (let ((x (first frame))) - (if (symbolp x) - x - (function-name x)))) - -(defun function-position (fun) - (multiple-value-bind (file position) - (si::bc-file fun) - (when file - (make-file-location file position)))) - -(defun frame-function (frame) - (let* ((x (first frame)) - fun position) - (etypecase x - (symbol (and (fboundp x) - (setf fun (fdefinition x) - position (function-position fun)))) - (function (setf fun x position (function-position x)))) - (values fun position))) - -(defun frame-decode-env (frame) - (let ((functions '()) - (blocks '()) - (variables '())) - (setf frame (si::decode-ihs-env (second frame))) - (dolist (record (remove-if-not #'consp frame)) - (let* ((record0 (car record)) - (record1 (cdr record))) - (cond ((or (symbolp record0) (stringp record0)) - (setq variables (acons record0 record1 variables))) - ((not (si::fixnump record0)) - (push record1 functions)) - ((symbolp record1) - (push record1 blocks)) - (t - )))) - (values functions blocks variables))) - -(defimplementation print-frame (frame stream) - (format stream "~A" (first frame))) - -;;; Is the frame FRAME restartable?. -;;; Return T if `restart-frame' can safely be called on the frame. -;;; -;;; frame-restartable-p (frame) - -(defimplementation frame-source-location (frame-number) - (let ((frame (elt *backtrace* frame-number))) - (or (nth-value 1 (frame-function frame)) - (make-error-location "Unknown source location for ~A." (car frame))))) - -(defimplementation frame-catch-tags (frame-number) - (third (elt *backtrace* frame-number))) - -(defimplementation frame-locals (frame-number) - (loop for (name . value) in (nth-value 2 (frame-decode-env - (elt *backtrace* frame-number))) - collect (list :name name :id 0 :value value))) - -(defimplementation frame-var-value (frame-number var-number) - (destructuring-bind (name . value) - (elt - (nth-value 2 (frame-decode-env (elt *backtrace* frame-number))) - var-number) - (declare (ignore name)) - value)) - -(defimplementation disassemble-frame (frame-number) - (let ((fun (frame-function (elt *backtrace* frame-number)))) - (disassemble fun))) - -(defimplementation eval-in-frame (form frame-number) - (let ((env (second (elt *backtrace* frame-number)))) - (si:eval-with-env form env))) - -;;; frame-package -;;; frame-call -;;; return-from-frame -;;; restart-frame -;;; print-condition -;;; condition-extras - -(defimplementation gdb-initial-commands () - ;; These signals are used by the GC. - #+linux '("handle SIGPWR noprint nostop" - "handle SIGXCPU noprint nostop")) - -;;; active-stepping -;;; sldb-break-on-return -;;; sldb-break-at-start -;;; sldb-stepper-condition-p -;;; sldb-setp-into -;;; sldb-step-next -;;; sldb-step-out - - -;;;; Definition finding - -(defvar +TAGS+ (namestring - (merge-pathnames "TAGS" (translate-logical-pathname "SYS:")))) - -(defun make-file-location (file file-position) - ;; File positions in CL start at 0, but Emacs' buffer positions - ;; start at 1. We specify (:ALIGN T) because the positions comming - ;; from ECL point at right after the toplevel form appearing before - ;; the actual target toplevel form; (:ALIGN T) will DTRT in that case. - (make-location `(:file ,(namestring (translate-logical-pathname file))) - `(:position ,(1+ file-position)) - `(:align t))) - -(defun make-buffer-location (buffer-name start-position &optional (offset 0)) - (make-location `(:buffer ,buffer-name) - `(:offset ,start-position ,offset) - `(:align t))) - -(defun make-TAGS-location (&rest tags) - (make-location `(:etags-file ,+TAGS+) - `(:tag ,@tags))) - -(defimplementation find-definitions (name) - (let ((annotations (ext:get-annotation name 'si::location :all))) - (cond (annotations - (loop for annotation in annotations - collect (destructuring-bind (dspec file . pos) annotation - `(,dspec ,(make-file-location file pos))))) - (t - (mapcan #'(lambda (type) (find-definitions-by-type name type)) - (classify-definition-name name)))))) - -(defun classify-definition-name (name) - (let ((types '())) - (when (fboundp name) - (cond ((special-operator-p name) - (push :special-operator types)) - ((macro-function name) - (push :macro types)) - ((typep (fdefinition name) 'generic-function) - (push :generic-function types)) - ((si:mangle-name name t) - (push :c-function types)) - (t - (push :lisp-function types)))) - (when (boundp name) - (cond ((constantp name) - (push :constant types)) - (t - (push :global-variable types)))) - types)) - -(defun find-definitions-by-type (name type) - (ecase type - (:lisp-function - (when-let (loc (source-location (fdefinition name))) - (list `((defun ,name) ,loc)))) - (:c-function - (when-let (loc (source-location (fdefinition name))) - (list `((c-source ,name) ,loc)))) - (:generic-function - (loop for method in (clos:generic-function-methods (fdefinition name)) - for specs = (clos:method-specializers method) - for loc = (source-location method) - when loc - collect `((defmethod ,name ,specs) ,loc))) - (:macro - (when-let (loc (source-location (macro-function name))) - (list `((defmacro ,name) ,loc)))) - (:constant - (when-let (loc (source-location name)) - (list `((defconstant ,name) ,loc)))) - (:global-variable - (when-let (loc (source-location name)) - (list `((defvar ,name) ,loc)))) - (:special-operator))) - -;;; FIXME: There ought to be a better way. -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun c-function-name-p (name) - (and (symbolp name) (si:mangle-name name t) t)) - (defun c-function-p (object) - (and (functionp object) - (let ((fn-name (function-name object))) - (and fn-name (c-function-name-p fn-name)))))) - -(deftype c-function () - `(satisfies c-function-p)) - -(defun assert-source-directory () - (unless (probe-file #P"SRC:") - (error "ECL's source directory ~A does not exist. ~ - You can specify a different location via the environment ~ - variable `ECLSRCDIR'." - (namestring (translate-logical-pathname #P"SYS:"))))) - -(defun assert-TAGS-file () - (unless (probe-file +TAGS+) - (error "No TAGS file ~A found. It should have been installed with ECL." - +TAGS+))) - -(defun package-names (package) - (cons (package-name package) (package-nicknames package))) - -(defun source-location (object) - (converting-errors-to-error-location - (typecase object - (c-function - (assert-source-directory) - (assert-TAGS-file) - (let ((lisp-name (function-name object))) - (assert lisp-name) - (multiple-value-bind (flag c-name) (si:mangle-name lisp-name t) - (assert flag) - ;; In ECL's code base sometimes the mangled name is used - ;; directly, sometimes ECL's DPP magic of @SI::SYMBOL or - ;; @EXT::SYMBOL is used. We cannot predict here, so we just - ;; provide several candidates. - (apply #'make-TAGS-location - c-name - (loop with s = (symbol-name lisp-name) - for p in (package-names (symbol-package lisp-name)) - collect (format nil "~A::~A" p s) - collect (format nil "~(~A::~A~)" p s)))))) - (function - (multiple-value-bind (file pos) (ext:compiled-function-file object) - (cond ((not file) - (return-from source-location nil)) - ((tmpfile-to-buffer file) - (make-buffer-location (tmpfile-to-buffer file) pos)) - (t - (assert (probe-file file)) - (assert (not (minusp pos))) - (make-file-location file pos))))) - (method - ;; FIXME: This will always return NIL at the moment; ECL does not - ;; store debug information for methods yet. - (source-location (clos:method-function object))) - ((member nil t) - (multiple-value-bind (flag c-name) (si:mangle-name object) - (assert flag) - (make-TAGS-location c-name)))))) - -(defimplementation find-source-location (object) - (or (source-location object) - (make-error-location "Source definition of ~S not found." object))) - -;;; buffer-first-change - - -;;;; XREF - -;;; who-calls -;;; calls-who -;;; who-references -;;; who-binds -;;; who-sets -;;; who-macroexpands -;;; who-specializes -;;; list-callers -;;; list-callees - - -;;;; Profiling - -;;; XXX: use monitor.lisp (ccl,clisp) - -#+profile -(progn - -(defimplementation profile (fname) - (when fname (eval `(profile:profile ,fname)))) - -(defimplementation unprofile (fname) - (when fname (eval `(profile:unprofile ,fname)))) - -(defimplementation unprofile-all () - (profile:unprofile-all) - "All functions unprofiled.") - -(defimplementation profile-report () - (profile:report)) - -(defimplementation profile-reset () - (profile:reset) - "Reset profiling counters.") - -(defimplementation profiled-functions () - (profile:profile)) - -(defimplementation profile-package (package callers methods) - (declare (ignore callers methods)) - (eval `(profile:profile ,(package-name (find-package package))))) -) ; #+profile (progn ... - - -;;;; Trace - -;;; Toggle tracing of the function(s) given with SPEC. -;;; SPEC can be: -;;; (setf NAME) ; a setf function -;;; (:defmethod NAME QUALIFIER... (SPECIALIZER...)) ; a specific method -;;; (:defgeneric NAME) ; a generic function with all methods -;;; (:call CALLER CALLEE) ; trace calls from CALLER to CALLEE. -;;; (:labels TOPLEVEL LOCAL) -;;; (:flet TOPLEVEL LOCAL) -;;; -;;; toggle-trace (spec) - - -;;;; Inspector - -;;; FIXME: Would be nice if it was possible to inspect objects -;;; implemented in C. - -;;; Return a list of bindings corresponding to OBJECT's slots. -;;; eval-context (object) - -;;; Return a string describing the primitive type of object. -;;; describe-primitive-type (object) - - -;;;; Multithreading - -;;; Not needed in ECL -;;; -;;; initialize-multiprocessing - -#+threads -(progn - (defvar *thread-id-counter* 0) - - (defparameter *thread-id-map* (make-hash-table)) - - (defvar *thread-id-map-lock* - (mp:make-lock :name "thread id map lock")) - - (defimplementation spawn (fn &key name) - (mp:process-run-function name fn)) - - (defimplementation thread-id (target-thread) - (block thread-id - (mp:with-lock (*thread-id-map-lock*) - ;; Does TARGET-THREAD have an id already? - (maphash (lambda (id thread-pointer) - (let ((thread (si:weak-pointer-value thread-pointer))) - (cond ((not thread) - (remhash id *thread-id-map*)) - ((eq thread target-thread) - (return-from thread-id id))))) - *thread-id-map*) - ;; TARGET-THREAD not found in *THREAD-ID-MAP* - (let ((id (incf *thread-id-counter*)) - (thread-pointer (si:make-weak-pointer target-thread))) - (setf (gethash id *thread-id-map*) thread-pointer) - id)))) - - (defimplementation find-thread (id) - (mp:with-lock (*thread-id-map-lock*) - (let* ((thread-ptr (gethash id *thread-id-map*)) - (thread (and thread-ptr (si:weak-pointer-value thread-ptr)))) - (unless thread - (remhash id *thread-id-map*)) - thread))) - - (defimplementation thread-name (thread) - (mp:process-name thread)) - - (defimplementation thread-status (thread) - (if (mp:process-active-p thread) - "RUNNING" - "STOPPED")) - - ;; thread-attributes - - (defimplementation current-thread () - mp:*current-process*) - - (defimplementation all-threads () - (mp:all-processes)) - - (defimplementation thread-alive-p (thread) - (mp:process-active-p thread)) - - (defimplementation interrupt-thread (thread fn) - (mp:interrupt-process thread fn)) - - (defimplementation kill-thread (thread) - (mp:process-kill thread)) - - (defvar *mailbox-lock* (mp:make-lock :name "mailbox lock")) - (defvar *mailboxes* (list)) - (declaim (type list *mailboxes*)) - - (defstruct (mailbox (:conc-name mailbox.)) - thread - (mutex (mp:make-lock)) - (cvar (mp:make-condition-variable)) - (queue '() :type list)) - - (defun mailbox (thread) - "Return THREAD's mailbox." - (mp:with-lock (*mailbox-lock*) - (or (find thread *mailboxes* :key #'mailbox.thread) - (let ((mb (make-mailbox :thread thread))) - (push mb *mailboxes*) - mb)))) - - (defimplementation send (thread message) - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) - (mp:with-lock (mutex) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message))) - (mp:condition-variable-broadcast (mailbox.cvar mbox))))) - - ;; receive - - (defimplementation receive-if (test &optional timeout) - (let* ((mbox (mailbox (current-thread))) - (mutex (mailbox.mutex mbox))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (mp:with-lock (mutex) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) (nconc (ldiff q tail) (cdr tail))) - (return (car tail)))) - (when (eq timeout t) (return (values nil t))) - (mp:condition-variable-wait (mailbox.cvar mbox) mutex))))) - - ;; Trigger a call to CHECK-SLIME-INTERRUPTS in THREAD without using - ;; asynchronous interrupts. - ;; - ;; Doesn't have to implement this if RECEIVE-IF periodically calls - ;; CHECK-SLIME-INTERRUPTS, but that's energy inefficient. - ;; - ;; wake-thread (thread) - - ;; Copied from sbcl.lisp and adjusted to ECL. - (let ((alist '()) - (mutex (mp:make-lock :name "register-thread"))) - - (defimplementation register-thread (name thread) - (declare (type symbol name)) - (mp:with-lock (mutex) - (etypecase thread - (null - (setf alist (delete name alist :key #'car))) - (mp:process - (let ((probe (assoc name alist))) - (cond (probe (setf (cdr probe) thread)) - (t (setf alist (acons name thread alist)))))))) - nil) - - (defimplementation find-registered (name) - (mp:with-lock (mutex) - (cdr (assoc name alist))))) - - ;; Not needed in ECL (?). - ;; - ;; set-default-initial-binding (var form) - - ) ; #+threads - -;;; Instead of busy waiting with communication-style NIL, use select() -;;; on the sockets' streams. -#+serve-event -(defimplementation wait-for-input (streams &optional timeout) - (assert (member timeout '(nil t))) - (flet ((poll-streams (streams timeout) - (let* ((serve-event::*descriptor-handlers* - (copy-list serve-event::*descriptor-handlers*)) - (active-fds '()) - (fd-stream-alist - (loop for s in streams - for fd = (socket-fd s) - collect (cons fd s) - do (serve-event:add-fd-handler fd :input - #'(lambda (fd) - (push fd active-fds)))))) - (serve-event:serve-event timeout) - (loop for fd in active-fds collect (cdr (assoc fd fd-stream-alist)))))) - (loop - (cond ((check-slime-interrupts) (return :interrupt)) - (timeout (return (poll-streams streams 0))) - (t - (when-let (ready (poll-streams streams 0.2)) - (return ready))))))) - -#-serve-event -(defimplementation wait-for-input (streams &optional timeout) - (assert (member timeout '(nil t))) - (loop - (cond ((check-slime-interrupts) (return :interrupt)) - (timeout (return (remove-if-not #'listen streams))) - (t - (let ((ready (remove-if-not #'listen streams))) - (if ready (return ready)) - (sleep 0.1)))))) - - -;;;; Locks - -#+threads -(defimplementation make-lock (&key name) - (mp:make-lock :name name :recursive t)) - -(defimplementation call-with-lock-held (lock function) - (declare (type function function)) - (mp:with-lock (lock) (funcall function))) - - -;;;; Weak datastructures - -;;; XXX: this should work but causes SLIME REPL hang at some point of time. May -;;; be ECL or SLIME bug - disabling for now. -#+(and ecl-weak-hash (or)) -(progn - (defimplementation make-weak-key-hash-table (&rest args) - (apply #'make-hash-table :weakness :key args)) - - (defimplementation make-weak-value-hash-table (&rest args) - (apply #'make-hash-table :weakness :value args)) - - (defimplementation hash-table-weakness (hashtable) - (ext:hash-table-weakness hashtable))) - - -;;;; Character names - -;;; Default implementation is fine. -;;; -;;; character-completion-set (prefix matchp) - - -;;;; Heap dumps - -;;; Doesn't apply to ECL. -;;; -;;; save-image (filename &optional restart-function) -;;; background-save-image (filename &key restart-function completion-function) - - -;;;; Wrapping - -;;; Intercept future calls to SPEC and surround them in callbacks. -;;; Very much similar to so-called advices for normal functions. -;;; -;;; wrap (spec indicator &key before after replace) -;;; unwrap (spec indicator) -;;; wrapped-p (spec indicator) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/gray.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/gray.lisp deleted file mode 100644 index 3c6c697..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/gray.lisp +++ /dev/null @@ -1,207 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; swank-gray.lisp --- Gray stream based IO redirection. -;;; -;;; Created 2003 -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -(in-package swank/backend) - -#.(progn - (defvar *gray-stream-symbols* - '(fundamental-character-output-stream - stream-write-char - stream-write-string - stream-fresh-line - stream-force-output - stream-finish-output - - fundamental-character-input-stream - stream-read-char - stream-peek-char - stream-read-line - stream-listen - stream-unread-char - stream-clear-input - stream-line-column - stream-read-char-no-hang)) - nil) - -(defpackage swank/gray - (:use cl swank/backend) - (:import-from #.(gray-package-name) . #.*gray-stream-symbols*) - (:export . #.*gray-stream-symbols*)) - -(in-package swank/gray) - -(defclass slime-output-stream (fundamental-character-output-stream) - ((output-fn :initarg :output-fn) - (buffer :initform (make-string 8000)) - (fill-pointer :initform 0) - (column :initform 0) - (lock :initform (make-lock :name "buffer write lock")) - (flush-thread :initarg :flush-thread - :initform nil - :accessor flush-thread) - (flush-scheduled :initarg :flush-scheduled - :initform nil - :accessor flush-scheduled))) - -(defun maybe-schedule-flush (stream) - (when (and (flush-thread stream) - (not (flush-scheduled stream))) - (setf (flush-scheduled stream) t) - (send (flush-thread stream) t))) - -(defmacro with-slime-output-stream (stream &body body) - `(with-slots (lock output-fn buffer fill-pointer column) ,stream - (call-with-lock-held lock (lambda () ,@body)))) - -(defmethod stream-write-char ((stream slime-output-stream) char) - (with-slime-output-stream stream - (setf (schar buffer fill-pointer) char) - (incf fill-pointer) - (incf column) - (when (char= #\newline char) - (setf column 0)) - (if (= fill-pointer (length buffer)) - (finish-output stream) - (maybe-schedule-flush stream))) - char) - -(defmethod stream-write-string ((stream slime-output-stream) string - &optional start end) - (with-slime-output-stream stream - (let* ((start (or start 0)) - (end (or end (length string))) - (len (length buffer)) - (count (- end start)) - (free (- len fill-pointer))) - (when (>= count free) - (stream-finish-output stream)) - (cond ((< count len) - (replace buffer string :start1 fill-pointer - :start2 start :end2 end) - (incf fill-pointer count) - (maybe-schedule-flush stream)) - (t - (funcall output-fn (subseq string start end)))) - (let ((last-newline (position #\newline string :from-end t - :start start :end end))) - (setf column (if last-newline - (- end last-newline 1) - (+ column count)))))) - string) - -(defmethod stream-line-column ((stream slime-output-stream)) - (with-slime-output-stream stream column)) - -(defmethod stream-finish-output ((stream slime-output-stream)) - (with-slime-output-stream stream - (unless (zerop fill-pointer) - (funcall output-fn (subseq buffer 0 fill-pointer)) - (setf fill-pointer 0)) - (setf (flush-scheduled stream) nil)) - nil) - -#+(and sbcl sb-thread) -(defmethod stream-force-output :around ((stream slime-output-stream)) - ;; Workaround for deadlocks between the world-lock and auto-flush-thread - ;; buffer write lock. - ;; - ;; Another alternative would be to grab the world-lock here, but that's less - ;; future-proof, and could introduce other lock-ordering issues in the - ;; future. - (handler-case - (sb-sys:with-deadline (:seconds 0.1) - (call-next-method)) - (sb-sys:deadline-timeout () - nil))) - -(defmethod stream-force-output ((stream slime-output-stream)) - (stream-finish-output stream)) - -(defmethod stream-fresh-line ((stream slime-output-stream)) - (with-slime-output-stream stream - (cond ((zerop column) nil) - (t (terpri stream) t)))) - -(defclass slime-input-stream (fundamental-character-input-stream) - ((input-fn :initarg :input-fn) - (buffer :initform "") (index :initform 0) - (lock :initform (make-lock :name "buffer read lock")))) - -(defmethod stream-read-char ((s slime-input-stream)) - (call-with-lock-held - (slot-value s 'lock) - (lambda () - (with-slots (buffer index input-fn) s - (when (= index (length buffer)) - (let ((string (funcall input-fn))) - (cond ((zerop (length string)) - (return-from stream-read-char :eof)) - (t - (setf buffer string) - (setf index 0))))) - (assert (plusp (length buffer))) - (prog1 (aref buffer index) (incf index)))))) - -(defmethod stream-listen ((s slime-input-stream)) - (call-with-lock-held - (slot-value s 'lock) - (lambda () - (with-slots (buffer index) s - (< index (length buffer)))))) - -(defmethod stream-unread-char ((s slime-input-stream) char) - (call-with-lock-held - (slot-value s 'lock) - (lambda () - (with-slots (buffer index) s - (decf index) - (cond ((eql (aref buffer index) char) - (setf (aref buffer index) char)) - (t - (warn "stream-unread-char: ignoring ~S (expected ~S)" - char (aref buffer index))))))) - nil) - -(defmethod stream-clear-input ((s slime-input-stream)) - (call-with-lock-held - (slot-value s 'lock) - (lambda () - (with-slots (buffer index) s - (setf buffer "" - index 0)))) - nil) - -(defmethod stream-line-column ((s slime-input-stream)) - nil) - -(defmethod stream-read-char-no-hang ((s slime-input-stream)) - (call-with-lock-held - (slot-value s 'lock) - (lambda () - (with-slots (buffer index) s - (when (< index (length buffer)) - (prog1 (aref buffer index) (incf index))))))) - - -;;; - -(defimplementation make-auto-flush-thread (stream) - (if (typep stream 'slime-output-stream) - (setf (flush-thread stream) - (spawn (lambda () (auto-flush-loop stream 0.08 t)) - :name "auto-flush-thread")) - (spawn (lambda () (auto-flush-loop stream *auto-flush-interval*)) - :name "auto-flush-thread"))) - -(defimplementation make-output-stream (write-string) - (make-instance 'slime-output-stream :output-fn write-string)) - -(defimplementation make-input-stream (read-string) - (make-instance 'slime-input-stream :input-fn read-string)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/lispworks.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/lispworks.lisp deleted file mode 100644 index 8b2d2ed..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/lispworks.lisp +++ /dev/null @@ -1,1020 +0,0 @@ -;;; -*- indent-tabs-mode: nil -*- -;;; -;;; swank-lispworks.lisp --- LispWorks specific code for SLIME. -;;; -;;; Created 2003, Helmut Eller -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -(defpackage swank/lispworks - (:use cl swank/backend)) - -(in-package swank/lispworks) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (require "comm")) - -(defimplementation gray-package-name () - "STREAM") - -(import-swank-mop-symbols :clos '(:slot-definition-documentation - :slot-boundp-using-class - :slot-value-using-class - :slot-makunbound-using-class - :eql-specializer - :eql-specializer-object - :compute-applicable-methods-using-classes)) - -(defun swank-mop:slot-definition-documentation (slot) - (documentation slot t)) - -(defun swank-mop:slot-boundp-using-class (class object slotd) - (clos:slot-boundp-using-class class object - (clos:slot-definition-name slotd))) - -(defun swank-mop:slot-value-using-class (class object slotd) - (clos:slot-value-using-class class object - (clos:slot-definition-name slotd))) - -(defun (setf swank-mop:slot-value-using-class) (value class object slotd) - (setf (clos:slot-value-using-class class object - (clos:slot-definition-name slotd)) - value)) - -(defun swank-mop:slot-makunbound-using-class (class object slotd) - (clos:slot-makunbound-using-class class object - (clos:slot-definition-name slotd))) - -(defun swank-mop:compute-applicable-methods-using-classes (gf classes) - (clos::compute-applicable-methods-from-classes gf classes)) - -;; lispworks doesn't have the eql-specializer class, it represents -;; them as a list of `(EQL ,OBJECT) -(deftype swank-mop:eql-specializer () 'cons) - -(defun swank-mop:eql-specializer-object (eql-spec) - (second eql-spec)) - -(eval-when (:compile-toplevel :execute :load-toplevel) - (defvar *original-defimplementation* (macro-function 'defimplementation)) - (defmacro defimplementation (&whole whole name args &body body - &environment env) - (declare (ignore args body)) - `(progn - (dspec:record-definition '(defun ,name) (dspec:location) - :check-redefinition-p nil) - ,(funcall *original-defimplementation* whole env)))) - -;;; UTF8 - -(defimplementation string-to-utf8 (string) - (ef:encode-lisp-string string '(:utf-8 :eol-style :lf))) - -(defimplementation utf8-to-string (octets) - (ef:decode-external-string octets '(:utf-8 :eol-style :lf))) - -;;; TCP server - -(defimplementation preferred-communication-style () - :spawn) - -(defun socket-fd (socket) - (etypecase socket - (fixnum socket) - (comm:socket-stream (comm:socket-stream-socket socket)))) - -(defimplementation create-socket (host port &key backlog) - (multiple-value-bind (socket where errno) - #-(or lispworks4.1 (and macosx lispworks4.3)) - (comm::create-tcp-socket-for-service port :address host - :backlog (or backlog 5)) - #+(or lispworks4.1 (and macosx lispworks4.3)) - (comm::create-tcp-socket-for-service port) - (cond (socket socket) - (t (error 'network-error - :format-control "~A failed: ~A (~D)" - :format-arguments (list where - (list #+unix (lw:get-unix-error errno)) - errno)))))) - -(defimplementation local-port (socket) - (nth-value 1 (comm:get-socket-address (socket-fd socket)))) - -(defimplementation close-socket (socket) - (comm::close-socket (socket-fd socket))) - -(defimplementation accept-connection (socket - &key external-format buffering timeout) - (declare (ignore buffering)) - (let* ((fd (comm::get-fd-from-socket socket))) - (assert (/= fd -1)) - (cond ((not external-format) - (make-instance 'comm:socket-stream - :socket fd - :direction :io - :read-timeout timeout - :element-type '(unsigned-byte 8))) - (t - (assert (valid-external-format-p external-format)) - (ecase (first external-format) - ((:latin-1 :ascii) - (make-instance 'comm:socket-stream - :socket fd - :direction :io - :read-timeout timeout - :element-type 'base-char)) - (:utf-8 - (make-flexi-stream - (make-instance 'comm:socket-stream - :socket fd - :direction :io - :read-timeout timeout - :element-type '(unsigned-byte 8)) - external-format))))))) - -(defun make-flexi-stream (stream external-format) - (unless (member :flexi-streams *features*) - (error "Cannot use external format ~A~ - without having installed flexi-streams in the inferior-lisp." - external-format)) - (funcall (read-from-string "FLEXI-STREAMS:MAKE-FLEXI-STREAM") - stream - :external-format - (apply (read-from-string "FLEXI-STREAMS:MAKE-EXTERNAL-FORMAT") - external-format))) - -;;; Coding Systems - -(defun valid-external-format-p (external-format) - (member external-format *external-format-to-coding-system* - :test #'equal :key #'car)) - -(defvar *external-format-to-coding-system* - '(((:latin-1 :eol-style :lf) - "latin-1-unix" "iso-latin-1-unix" "iso-8859-1-unix") - ;;((:latin-1) "latin-1" "iso-latin-1" "iso-8859-1") - ;;((:utf-8) "utf-8") - ((:utf-8 :eol-style :lf) "utf-8-unix") - ;;((:euc-jp) "euc-jp") - ((:euc-jp :eol-style :lf) "euc-jp-unix") - ;;((:ascii) "us-ascii") - ((:ascii :eol-style :lf) "us-ascii-unix"))) - -(defimplementation find-external-format (coding-system) - (car (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*))) - -;;; Unix signals - -(defun sigint-handler () - (with-simple-restart (continue "Continue from SIGINT handler.") - (invoke-debugger "SIGINT"))) - -(defun make-sigint-handler (process) - (lambda (&rest args) - (declare (ignore args)) - (mp:process-interrupt process #'sigint-handler))) - -(defun set-sigint-handler () - ;; Set SIGINT handler on Swank request handler thread. - #-win32 - (sys::set-signal-handler +sigint+ - (make-sigint-handler mp:*current-process*))) - -#-win32 -(defimplementation install-sigint-handler (handler) - (sys::set-signal-handler +sigint+ - (let ((self mp:*current-process*)) - (lambda (&rest args) - (declare (ignore args)) - (mp:process-interrupt self handler))))) - -(defimplementation getpid () - #+win32 (win32:get-current-process-id) - #-win32 (system::getpid)) - -(defimplementation lisp-implementation-type-name () - "lispworks") - -(defimplementation set-default-directory (directory) - (namestring (hcl:change-directory directory))) - -;;;; Documentation - -(defun map-list (function list) - "Map over proper and not proper lists." - (loop for (car . cdr) on list - collect (funcall function car) into result - when (null cdr) return result - when (atom cdr) return (nconc result (funcall function cdr)))) - -(defun replace-strings-with-symbols (tree) - (map-list - (lambda (x) - (typecase x - (list - (replace-strings-with-symbols x)) - (symbol - x) - (string - (intern x)) - (t - (intern (write-to-string x))))) - tree)) - -(defimplementation arglist (symbol-or-function) - (let ((arglist (lw:function-lambda-list symbol-or-function))) - (etypecase arglist - ((member :dont-know) - :not-available) - (list - (replace-strings-with-symbols arglist))))) - -(defimplementation function-name (function) - (nth-value 2 (function-lambda-expression function))) - -(defimplementation macroexpand-all (form &optional env) - (declare (ignore env)) - (walker:walk-form form)) - -(defun generic-function-p (object) - (typep object 'generic-function)) - -(defimplementation describe-symbol-for-emacs (symbol) - "Return a plist describing SYMBOL. -Return NIL if the symbol is unbound." - (let ((result '())) - (labels ((first-line (string) - (let ((pos (position #\newline string))) - (if (null pos) string (subseq string 0 pos)))) - (doc (kind &optional (sym symbol)) - (let ((string (or (documentation sym kind)))) - (if string - (first-line string) - :not-documented))) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push - :variable (when (boundp symbol) - (doc 'variable))) - (maybe-push - :generic-function (if (and (fboundp symbol) - (generic-function-p (fdefinition symbol))) - (doc 'function))) - (maybe-push - :function (if (and (fboundp symbol) - (not (generic-function-p (fdefinition symbol)))) - (doc 'function))) - (maybe-push - :setf (let ((setf-name (sys:underlying-setf-name `(setf ,symbol)))) - (if (fboundp setf-name) - (doc 'setf)))) - (maybe-push - :class (if (find-class symbol nil) - (doc 'class))) - result))) - -(defimplementation describe-definition (symbol type) - (ecase type - (:variable (describe-symbol symbol)) - (:class (describe (find-class symbol))) - ((:function :generic-function) (describe-function symbol)) - (:setf (describe-function (sys:underlying-setf-name `(setf ,symbol)))))) - -(defun describe-function (symbol) - (cond ((fboundp symbol) - (format t "(~A ~/pprint-fill/)~%~%~:[(not documented)~;~:*~A~]~%" - symbol - (lispworks:function-lambda-list symbol) - (documentation symbol 'function)) - (describe (fdefinition symbol))) - (t (format t "~S is not fbound" symbol)))) - -(defun describe-symbol (sym) - (format t "~A is a symbol in package ~A." sym (symbol-package sym)) - (when (boundp sym) - (format t "~%~%Value: ~A" (symbol-value sym))) - (let ((doc (documentation sym 'variable))) - (when doc - (format t "~%~%Variable documentation:~%~A" doc))) - (when (fboundp sym) - (describe-function sym))) - -(defimplementation type-specifier-p (symbol) - (or (ignore-errors - (subtypep nil symbol)) - (not (eq (type-specifier-arglist symbol) :not-available)))) - -;;; Debugging - -(defclass slime-env (env:environment) - ((debugger-hook :initarg :debugger-hoook))) - -(defun slime-env (hook io-bindings) - (make-instance 'slime-env :name "SLIME Environment" - :io-bindings io-bindings - :debugger-hoook hook)) - -(defmethod env-internals:environment-display-notifier - ((env slime-env) &key restarts condition) - (declare (ignore restarts condition)) - (swank:swank-debugger-hook condition *debugger-hook*)) - -(defmethod env-internals:environment-display-debugger ((env slime-env)) - *debug-io*) - -(defmethod env-internals:confirm-p ((e slime-env) &optional msg &rest args) - (apply #'swank:y-or-n-p-in-emacs msg args)) - -(defimplementation call-with-debugger-hook (hook fun) - (let ((*debugger-hook* hook)) - (env:with-environment ((slime-env hook '())) - (funcall fun)))) - -(defimplementation install-debugger-globally (function) - (setq *debugger-hook* function) - (setf (env:environment) (slime-env function '()))) - -(defvar *sldb-top-frame*) - -(defun interesting-frame-p (frame) - (cond ((or (dbg::call-frame-p frame) - (dbg::derived-call-frame-p frame) - (dbg::foreign-frame-p frame) - (dbg::interpreted-call-frame-p frame)) - t) - ((dbg::catch-frame-p frame) dbg:*print-catch-frames*) - ((dbg::binding-frame-p frame) dbg:*print-binding-frames*) - ((dbg::handler-frame-p frame) dbg:*print-handler-frames*) - ((dbg::restart-frame-p frame) dbg:*print-restart-frames*) - (t nil))) - -(defun nth-next-frame (frame n) - "Unwind FRAME N times." - (do ((frame frame (dbg::frame-next frame)) - (i n (if (interesting-frame-p frame) (1- i) i))) - ((or (not frame) - (and (interesting-frame-p frame) (zerop i))) - frame))) - -(defun nth-frame (index) - (nth-next-frame *sldb-top-frame* index)) - -(defun find-top-frame () - "Return the most suitable top-frame for the debugger." - (flet ((find-named-frame (name) - (do ((frame (dbg::debugger-stack-current-frame - dbg::*debugger-stack*) - (nth-next-frame frame 1))) - ((or (null frame) ; no frame found! - (and (dbg::call-frame-p frame) - (eq (dbg::call-frame-function-name frame) - name))) - (nth-next-frame frame 1))))) - (or (find-named-frame 'invoke-debugger) - (find-named-frame 'swank::safe-backtrace) - ;; if we can't find a likely top frame, take any old frame - ;; at the top - (dbg::debugger-stack-current-frame dbg::*debugger-stack*)))) - -(defimplementation call-with-debugging-environment (fn) - (dbg::with-debugger-stack () - (let ((*sldb-top-frame* (find-top-frame))) - (funcall fn)))) - -(defimplementation compute-backtrace (start end) - (let ((end (or end most-positive-fixnum)) - (backtrace '())) - (do ((frame (nth-frame start) (dbg::frame-next frame)) - (i start)) - ((or (not frame) (= i end)) (nreverse backtrace)) - (when (interesting-frame-p frame) - (incf i) - (push frame backtrace))))) - -(defun frame-actual-args (frame) - (let ((*break-on-signals* nil) - (kind nil)) - (loop for arg in (dbg::call-frame-arglist frame) - if (eq kind '&rest) - nconc (handler-case - (dbg::dbg-eval arg frame) - (error (e) (list (format nil "<~A>" arg)))) - and do (loop-finish) - else - if (member arg '(&rest &optional &key)) - do (setq kind arg) - else - nconc - (handler-case - (nconc (and (eq kind '&key) - (list (cond ((symbolp arg) - (intern (symbol-name arg) :keyword)) - ((and (consp arg) (symbolp (car arg))) - (intern (symbol-name (car arg)) - :keyword)) - (t (caar arg))))) - (list (dbg::dbg-eval - (cond ((symbolp arg) arg) - ((and (consp arg) (symbolp (car arg))) - (car arg)) - (t (cadar arg))) - frame))) - (error (e) (list (format nil "<~A>" arg))))))) - -(defimplementation print-frame (frame stream) - (cond ((dbg::call-frame-p frame) - (prin1 (cons (dbg::call-frame-function-name frame) - (frame-actual-args frame)) - stream)) - (t (princ frame stream)))) - -(defun frame-vars (frame) - (first (dbg::frame-locals-format-list frame #'list 75 0))) - -(defimplementation frame-locals (n) - (let ((frame (nth-frame n))) - (if (dbg::call-frame-p frame) - (mapcar (lambda (var) - (destructuring-bind (name value symbol location) var - (declare (ignore name location)) - (list :name symbol :id 0 - :value value))) - (frame-vars frame))))) - -(defimplementation frame-var-value (frame var) - (let ((frame (nth-frame frame))) - (destructuring-bind (_n value _s _l) (nth var (frame-vars frame)) - (declare (ignore _n _s _l)) - value))) - -(defimplementation frame-source-location (frame) - (let ((frame (nth-frame frame)) - (callee (if (plusp frame) (nth-frame (1- frame))))) - (if (dbg::call-frame-p frame) - (let ((dspec (dbg::call-frame-function-name frame)) - (cname (and (dbg::call-frame-p callee) - (dbg::call-frame-function-name callee))) - (path (and (dbg::call-frame-p frame) - (dbg::call-frame-edit-path frame)))) - (if dspec - (frame-location dspec cname path)))))) - -(defimplementation eval-in-frame (form frame-number) - (let ((frame (nth-frame frame-number))) - (dbg::dbg-eval form frame))) - -(defun function-name-package (name) - (typecase name - (null nil) - (symbol (symbol-package name)) - ((cons (eql hcl:subfunction)) - (destructuring-bind (name parent) (cdr name) - (declare (ignore name)) - (function-name-package parent))) - ((cons (eql lw:top-level-form)) nil) - (t nil))) - -(defimplementation frame-package (frame-number) - (let ((frame (nth-frame frame-number))) - (if (dbg::call-frame-p frame) - (function-name-package (dbg::call-frame-function-name frame))))) - -(defimplementation return-from-frame (frame-number form) - (let* ((frame (nth-frame frame-number)) - (return-frame (dbg::find-frame-for-return frame))) - (dbg::dbg-return-from-call-frame frame form return-frame - dbg::*debugger-stack*))) - -(defimplementation restart-frame (frame-number) - (let ((frame (nth-frame frame-number))) - (dbg::restart-frame frame :same-args t))) - -(defimplementation disassemble-frame (frame-number) - (let* ((frame (nth-frame frame-number))) - (when (dbg::call-frame-p frame) - (let ((function (dbg::get-call-frame-function frame))) - (disassemble function))))) - -;;; Definition finding - -(defun frame-location (dspec callee-name edit-path) - (let ((infos (dspec:find-dspec-locations dspec))) - (cond (infos - (destructuring-bind ((rdspec location) &rest _) infos - (declare (ignore _)) - (let ((name (and callee-name (symbolp callee-name) - (string callee-name))) - (path (edit-path-to-cmucl-source-path edit-path))) - (make-dspec-location rdspec location - `(:call-site ,name :edit-path ,path))))) - (t - (list :error (format nil "Source location not available for: ~S" - dspec)))))) - -;; dbg::call-frame-edit-path is not documented but lets assume the -;; binary representation of the integer EDIT-PATH should be -;; interpreted as a sequence of CAR or CDR. #b1111010 is roughly the -;; same as cadadddr. Something is odd with the highest bit. -(defun edit-path-to-cmucl-source-path (edit-path) - (and edit-path - (cons 0 - (let ((n -1)) - (loop for i from (1- (integer-length edit-path)) downto 0 - if (logbitp i edit-path) do (incf n) - else collect (prog1 n (setq n 0))))))) - -;; (edit-path-to-cmucl-source-path #b1111010) => (0 3 1) - -(defimplementation find-definitions (name) - (let ((locations (dspec:find-name-locations dspec:*dspec-classes* name))) - (loop for (dspec location) in locations - collect (list dspec (make-dspec-location dspec location))))) - - -;;; Compilation - -(defmacro with-swank-compilation-unit ((location &rest options) &body body) - (lw:rebinding (location) - `(let ((compiler::*error-database* '())) - (with-compilation-unit ,options - (multiple-value-prog1 (progn ,@body) - (signal-error-data-base compiler::*error-database* - ,location) - (signal-undefined-functions compiler::*unknown-functions* - ,location)))))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (with-swank-compilation-unit (input-file) - (compile-file input-file - :output-file output-file - :load load-p - :external-format external-format))) - -(defvar *within-call-with-compilation-hooks* nil - "Whether COMPILE-FILE was called from within CALL-WITH-COMPILATION-HOOKS.") - -(defvar *undefined-functions-hash* nil - "Hash table to map info about undefined functions to pathnames.") - -(lw:defadvice (compile-file compile-file-and-collect-notes :around) - (pathname &rest rest) - (multiple-value-prog1 (apply #'lw:call-next-advice pathname rest) - (when *within-call-with-compilation-hooks* - (maphash (lambda (unfun dspecs) - (dolist (dspec dspecs) - (let ((unfun-info (list unfun dspec))) - (unless (gethash unfun-info *undefined-functions-hash*) - (setf (gethash unfun-info *undefined-functions-hash*) - pathname))))) - compiler::*unknown-functions*)))) - -(defimplementation call-with-compilation-hooks (function) - (let ((compiler::*error-database* '()) - (*undefined-functions-hash* (make-hash-table :test 'equal)) - (*within-call-with-compilation-hooks* t)) - (with-compilation-unit () - (prog1 (funcall function) - (signal-error-data-base compiler::*error-database*) - (signal-undefined-functions compiler::*unknown-functions*))))) - -(defun map-error-database (database fn) - (loop for (filename . defs) in database do - (loop for (dspec . conditions) in defs do - (dolist (c conditions) - (multiple-value-bind (condition path) - (if (consp c) (values (car c) (cdr c)) (values c nil)) - (funcall fn filename dspec condition path)))))) - -(defun lispworks-severity (condition) - (cond ((not condition) :warning) - (t (etypecase condition - #-(or lispworks4 lispworks5) - (conditions:compiler-note :note) - (error :error) - (style-warning :warning) - (warning :warning))))) - -(defun signal-compiler-condition (message location condition) - (check-type message string) - (signal - (make-instance 'compiler-condition :message message - :severity (lispworks-severity condition) - :location location - :original-condition condition))) - -(defvar *temp-file-format* '(:utf-8 :eol-style :lf)) - -(defun compile-from-temp-file (string filename) - (unwind-protect - (progn - (with-open-file (s filename :direction :output - :if-exists :supersede - :external-format *temp-file-format*) - - (write-string string s) - (finish-output s)) - (multiple-value-bind (binary-filename warnings? failure?) - (compile-file filename :load t - :external-format *temp-file-format*) - (declare (ignore warnings?)) - (when binary-filename - (delete-file binary-filename)) - (not failure?))) - (delete-file filename))) - -(defun dspec-function-name-position (dspec fallback) - (etypecase dspec - (cons (let ((name (dspec:dspec-primary-name dspec))) - (typecase name - ((or symbol string) - (list :function-name (string name))) - (t fallback)))) - (null fallback) - (symbol (list :function-name (string dspec))))) - -(defmacro with-fairly-standard-io-syntax (&body body) - "Like WITH-STANDARD-IO-SYNTAX but preserve *PACKAGE* and *READTABLE*." - (let ((package (gensym)) - (readtable (gensym))) - `(let ((,package *package*) - (,readtable *readtable*)) - (with-standard-io-syntax - (let ((*package* ,package) - (*readtable* ,readtable)) - ,@body))))) - -(defun skip-comments (stream) - (let ((pos0 (file-position stream))) - (cond ((equal (ignore-errors (list (read-delimited-list #\( stream))) - '(())) - (file-position stream (1- (file-position stream)))) - (t (file-position stream pos0))))) - -#-(or lispworks4.1 lispworks4.2) ; no dspec:parse-form-dspec prior to 4.3 -(defun dspec-stream-position (stream dspec) - (with-fairly-standard-io-syntax - (loop (let* ((pos (progn (skip-comments stream) (file-position stream))) - (form (read stream nil '#1=#:eof))) - (when (eq form '#1#) - (return nil)) - (labels ((check-dspec (form) - (when (consp form) - (let ((operator (car form))) - (case operator - ((progn) - (mapcar #'check-dspec - (cdr form))) - ((eval-when locally macrolet symbol-macrolet) - (mapcar #'check-dspec - (cddr form))) - ((in-package) - (let ((package (find-package (second form)))) - (when package - (setq *package* package)))) - (otherwise - (let ((form-dspec (dspec:parse-form-dspec form))) - (when (dspec:dspec-equal dspec form-dspec) - (return pos))))))))) - (check-dspec form)))))) - -(defun dspec-file-position (file dspec) - (let* ((*compile-file-pathname* (pathname file)) - (*compile-file-truename* (truename *compile-file-pathname*)) - (*load-pathname* *compile-file-pathname*) - (*load-truename* *compile-file-truename*)) - (with-open-file (stream file) - (let ((pos - #-(or lispworks4.1 lispworks4.2) - (ignore-errors (dspec-stream-position stream dspec)))) - (if pos - (list :position (1+ pos)) - (dspec-function-name-position dspec `(:position 1))))))) - -(defun emacs-buffer-location-p (location) - (and (consp location) - (eq (car location) :emacs-buffer))) - -(defun make-dspec-location (dspec location &optional hints) - (etypecase location - ((or pathname string) - (multiple-value-bind (file err) - (ignore-errors (namestring (truename location))) - (if err - (list :error (princ-to-string err)) - (make-location `(:file ,file) - (dspec-file-position file dspec) - hints)))) - (symbol - `(:error ,(format nil "Cannot resolve location: ~S" location))) - ((satisfies emacs-buffer-location-p) - (destructuring-bind (_ buffer offset) location - (declare (ignore _)) - (make-location `(:buffer ,buffer) - (dspec-function-name-position dspec `(:offset ,offset 0)) - hints))))) - -(defun make-dspec-progenitor-location (dspec location edit-path) - (let ((canon-dspec (dspec:canonicalize-dspec dspec))) - (make-dspec-location - (if canon-dspec - (if (dspec:local-dspec-p canon-dspec) - (dspec:dspec-progenitor canon-dspec) - canon-dspec) - nil) - location - (if edit-path - (list :edit-path (edit-path-to-cmucl-source-path edit-path)))))) - -(defun signal-error-data-base (database &optional location) - (map-error-database - database - (lambda (filename dspec condition edit-path) - (signal-compiler-condition - (format nil "~A" condition) - (make-dspec-progenitor-location dspec (or location filename) edit-path) - condition)))) - -(defun unmangle-unfun (symbol) - "Converts symbols like 'SETF::|\"CL-USER\" \"GET\"| to -function names like \(SETF GET)." - (cond ((sys::setf-symbol-p symbol) - (sys::setf-pair-from-underlying-name symbol)) - (t symbol))) - -(defun signal-undefined-functions (htab &optional filename) - (maphash (lambda (unfun dspecs) - (dolist (dspec dspecs) - (signal-compiler-condition - (format nil "Undefined function ~A" (unmangle-unfun unfun)) - (make-dspec-progenitor-location - dspec - (or filename - (gethash (list unfun dspec) *undefined-functions-hash*)) - nil) - nil))) - htab)) - -(defimplementation swank-compile-string (string &key buffer position filename - policy) - (declare (ignore filename policy)) - (assert buffer) - (assert position) - (let* ((location (list :emacs-buffer buffer position)) - (tmpname (hcl:make-temp-file nil "lisp"))) - (with-swank-compilation-unit (location) - (compile-from-temp-file - (with-output-to-string (s) - (let ((*print-radix* t)) - (print `(eval-when (:compile-toplevel) - (setq dspec::*location* (list ,@location))) - s)) - (write-string string s)) - tmpname)))) - -;;; xref - -(defmacro defxref (name function) - `(defimplementation ,name (name) - (xref-results (,function name)))) - -(defxref who-calls hcl:who-calls) -(defxref who-macroexpands hcl:who-calls) ; macros are in the calls table too -(defxref calls-who hcl:calls-who) -(defxref list-callers list-callers-internal) -(defxref list-callees list-callees-internal) - -(defun list-callers-internal (name) - (let ((callers (make-array 100 - :fill-pointer 0 - :adjustable t))) - (hcl:sweep-all-objects - #'(lambda (object) - (when (and #+Harlequin-PC-Lisp (low:compiled-code-p object) - #+Harlequin-Unix-Lisp (sys:callablep object) - #-(or Harlequin-PC-Lisp Harlequin-Unix-Lisp) - (sys:compiled-code-p object) - (system::find-constant$funcallable name object)) - (vector-push-extend object callers)))) - ;; Delay dspec:object-dspec until after sweep-all-objects - ;; to reduce allocation problems. - (loop for object across callers - collect (if (symbolp object) - (list 'function object) - (or (dspec:object-dspec object) object))))) - -(defun list-callees-internal (name) - (let ((callees '())) - (system::find-constant$funcallable - 'junk name - :test #'(lambda (junk constant) - (declare (ignore junk)) - (when (and (symbolp constant) - (fboundp constant)) - (pushnew (list 'function constant) callees :test 'equal)) - ;; Return nil so we iterate over all constants. - nil)) - callees)) - -;; only for lispworks 4.2 and above -#-lispworks4.1 -(progn - (defxref who-references hcl:who-references) - (defxref who-binds hcl:who-binds) - (defxref who-sets hcl:who-sets)) - -(defimplementation who-specializes (classname) - (let ((class (find-class classname nil))) - (when class - (let ((methods (clos:class-direct-methods class))) - (xref-results (mapcar #'dspec:object-dspec methods)))))) - -(defun xref-results (dspecs) - (flet ((frob-locs (dspec locs) - (cond (locs - (loop for (name loc) in locs - collect (list name (make-dspec-location name loc)))) - (t `((,dspec (:error "Source location not available"))))))) - (loop for dspec in dspecs - append (frob-locs dspec (dspec:dspec-definition-locations dspec))))) - -;;; Inspector - -(defmethod emacs-inspect ((o t)) - (lispworks-inspect o)) - -(defmethod emacs-inspect ((o function)) - (lispworks-inspect o)) - -;; FIXME: slot-boundp-using-class in LW works with names so we can't -;; use our method in swank.lisp. -(defmethod emacs-inspect ((o standard-object)) - (lispworks-inspect o)) - -(defun lispworks-inspect (o) - (multiple-value-bind (names values _getter _setter type) - (lw:get-inspector-values o nil) - (declare (ignore _getter _setter)) - (append - (label-value-line "Type" type) - (loop for name in names - for value in values - append (label-value-line name value))))) - -;;; Miscellaneous - -(defimplementation quit-lisp () - (lispworks:quit)) - -;;; Tracing - -(defun parse-fspec (fspec) - "Return a dspec for FSPEC." - (ecase (car fspec) - ((:defmethod) `(method ,(cdr fspec))))) - -(defun tracedp (dspec) - (member dspec (eval '(trace)) :test #'equal)) - -(defun toggle-trace-aux (dspec) - (cond ((tracedp dspec) - (eval `(untrace ,dspec)) - (format nil "~S is now untraced." dspec)) - (t - (eval `(trace (,dspec))) - (format nil "~S is now traced." dspec)))) - -(defimplementation toggle-trace (fspec) - (toggle-trace-aux (parse-fspec fspec))) - -;;; Multithreading - -(defimplementation initialize-multiprocessing (continuation) - (cond ((not mp::*multiprocessing*) - (push (list "Initialize SLIME" '() continuation) - mp:*initial-processes*) - (mp:initialize-multiprocessing)) - (t (funcall continuation)))) - -(defimplementation spawn (fn &key name) - (mp:process-run-function name () fn)) - -(defvar *id-lock* (mp:make-lock)) -(defvar *thread-id-counter* 0) - -(defimplementation thread-id (thread) - (mp:with-lock (*id-lock*) - (or (getf (mp:process-plist thread) 'id) - (setf (getf (mp:process-plist thread) 'id) - (incf *thread-id-counter*))))) - -(defimplementation find-thread (id) - (find id (mp:list-all-processes) - :key (lambda (p) (getf (mp:process-plist p) 'id)))) - -(defimplementation thread-name (thread) - (mp:process-name thread)) - -(defimplementation thread-status (thread) - (format nil "~A ~D" - (mp:process-whostate thread) - (mp:process-priority thread))) - -(defimplementation make-lock (&key name) - (mp:make-lock :name name)) - -(defimplementation call-with-lock-held (lock function) - (mp:with-lock (lock) (funcall function))) - -(defimplementation current-thread () - mp:*current-process*) - -(defimplementation all-threads () - (mp:list-all-processes)) - -(defimplementation interrupt-thread (thread fn) - (mp:process-interrupt thread fn)) - -(defimplementation kill-thread (thread) - (mp:process-kill thread)) - -(defimplementation thread-alive-p (thread) - (mp:process-alive-p thread)) - -(defstruct (mailbox (:conc-name mailbox.)) - (mutex (mp:make-lock :name "thread mailbox")) - (queue '() :type list)) - -(defvar *mailbox-lock* (mp:make-lock)) - -(defun mailbox (thread) - (mp:with-lock (*mailbox-lock*) - (or (getf (mp:process-plist thread) 'mailbox) - (setf (getf (mp:process-plist thread) 'mailbox) - (make-mailbox))))) - -(defimplementation receive-if (test &optional timeout) - (let* ((mbox (mailbox mp:*current-process*)) - (lock (mailbox.mutex mbox))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (mp:with-lock (lock "receive-if/try") - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) (nconc (ldiff q tail) (cdr tail))) - (return (car tail))))) - (when (eq timeout t) (return (values nil t))) - (mp:process-wait-with-timeout - "receive-if" 0.3 (lambda () (some test (mailbox.queue mbox))))))) - -(defimplementation send (thread message) - (let ((mbox (mailbox thread))) - (mp:with-lock ((mailbox.mutex mbox)) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message)))))) - -(let ((alist '()) - (lock (mp:make-lock :name "register-thread"))) - - (defimplementation register-thread (name thread) - (declare (type symbol name)) - (mp:with-lock (lock) - (etypecase thread - (null - (setf alist (delete name alist :key #'car))) - (mp:process - (let ((probe (assoc name alist))) - (cond (probe (setf (cdr probe) thread)) - (t (setf alist (acons name thread alist)))))))) - nil) - - (defimplementation find-registered (name) - (mp:with-lock (lock) - (cdr (assoc name alist))))) - - -(defimplementation set-default-initial-binding (var form) - (setq mp:*process-initial-bindings* - (acons var `(eval (quote ,form)) - mp:*process-initial-bindings* ))) - -(defimplementation thread-attributes (thread) - (list :priority (mp:process-priority thread) - :idle (mp:process-idle-time thread))) - - -;;;; Weak hashtables - -(defimplementation make-weak-key-hash-table (&rest args) - (apply #'make-hash-table :weak-kind :key args)) - -(defimplementation make-weak-value-hash-table (&rest args) - (apply #'make-hash-table :weak-kind :value args)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/match.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/match.lisp deleted file mode 100644 index d6200db..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/match.lisp +++ /dev/null @@ -1,242 +0,0 @@ -;; -;; SELECT-MATCH macro (and IN macro) -;; -;; Copyright 1990 Stephen Adams -;; -;; You are free to copy, distribute and make derivative works of this -;; source provided that this copyright notice is displayed near the -;; beginning of the file. No liability is accepted for the -;; correctness or performance of the code. If you modify the code -;; please indicate this fact both at the place of modification and in -;; this copyright message. -;; -;; Stephen Adams -;; Department of Electronics and Computer Science -;; University of Southampton -;; SO9 5NH, UK -;; -;; sra@ecs.soton.ac.uk -;; - -;; -;; Synopsis: -;; -;; (select-match expression -;; (pattern action+)*) -;; -;; --- or --- -;; -;; (select-match expression -;; pattern => expression -;; pattern => expression -;; ...) -;; -;; pattern -> constant ;egs 1, #\x, #c(1.0 1.1) -;; | symbol ;matches anything -;; | 'anything ;must be EQUAL -;; | (pattern = pattern) ;both patterns must match -;; | (#'function pattern) ;predicate test -;; | (pattern . pattern) ;cons cell -;; - -;; Example -;; -;; (select-match item -;; (('if e1 e2 e3) 'if-then-else) ;(1) -;; ((#'oddp k) 'an-odd-integer) ;(2) -;; (((#'treep tree) = (hd . tl)) 'something-else) ;(3) -;; (other 'anything-else)) ;(4) -;; -;; Notes -;; -;; . Each pattern is tested in turn. The first match is taken. -;; -;; . If no pattern matches, an error is signalled. -;; -;; . Constant patterns (things X for which (CONSTANTP X) is true, i.e. -;; numbers, strings, characters, etc.) match things which are EQUAL. -;; -;; . Quoted patterns (which are CONSTANTP) are constants. -;; -;; . Symbols match anything. The symbol is bound to the matched item -;; for the execution of the actions. -;; For example, (SELECT-MATCH '(1 2 3) -;; (1 . X) => X) -;; returns (2 3) because X is bound to the cdr of the candidate. -;; -;; . The two pattern match (p1 = p2) can be used to name parts -;; of the matched structure. For example, (ALL = (HD . TL)) -;; matches a cons cell. ALL is bound to the cons cell, HD to its car -;; and TL to its tail. -;; -;; . A predicate test applies the predicate to the item being matched. -;; If the predicate returns NIL then the match fails. -;; If it returns truth, then the nested pattern is matched. This is -;; often just a symbol like K in the example. -;; -;; . Care should be taken with the domain values for predicate matches. -;; If, in the above eg, item is not an integer, an error would occur -;; during the test. A safer pattern would be -;; (#'integerp (#'oddp k)) -;; This would only test for oddness of the item was an integer. -;; -;; . A single symbol will match anything so it can be used as a default -;; case, like OTHER above. -;; - -(in-package swank/match) - -(defmacro match (expression &body patterns) - `(select-match ,expression ,@patterns)) - -(defmacro select-match (expression &rest patterns) - (let* ((do-let (not (atom expression))) - (key (if do-let (gensym) expression)) - (cbody (expand-select-patterns key patterns)) - (cform `(cond . ,cbody))) - (if do-let - `(let ((,key ,expression)) ,cform) - cform))) - -(defun expand-select-patterns (key patterns) - (if (eq (second patterns) '=>) - (expand-select-patterns-style-2 key patterns) - (expand-select-patterns-style-1 key patterns))) - -(defun expand-select-patterns-style-1 (key patterns) - (if (null patterns) - `((t (error "Case select pattern match failure on ~S" ,key))) - (let* ((pattern (caar patterns)) - (actions (cdar patterns)) - (rest (cdr patterns)) - (test (compile-select-test key pattern)) - (bindings (compile-select-bindings key pattern actions))) - `(,(if bindings `(,test (let ,bindings . ,actions)) - `(,test . ,actions)) - . ,(unless (eq test t) - (expand-select-patterns-style-1 key rest)))))) - -(defun expand-select-patterns-style-2 (key patterns) - (cond ((null patterns) - `((t (error "Case select pattern match failure on ~S" ,key)))) - (t (when (or (< (length patterns) 3) - (not (eq (second patterns) '=>))) - (error "Illegal patterns: ~S" patterns)) - (let* ((pattern (first patterns)) - (actions (list (third patterns))) - (rest (cdddr patterns)) - (test (compile-select-test key pattern)) - (bindings (compile-select-bindings key pattern actions))) - `(,(if bindings `(,test (let ,bindings . ,actions)) - `(,test . ,actions)) - . ,(unless (eq test t) - (expand-select-patterns-style-2 key rest))))))) - -(defun compile-select-test (key pattern) - (let ((tests (remove t (compile-select-tests key pattern)))) - (cond - ;; note AND does this anyway, but this allows us to tell if - ;; the pattern will always match. - ((null tests) t) - ((= (length tests) 1) (car tests)) - (t `(and . ,tests))))) - -(defun compile-select-tests (key pattern) - (cond ((constantp pattern) `((,(cond ((numberp pattern) 'eql) - ((symbolp pattern) 'eq) - (t 'equal)) - ,key ,pattern))) - ((symbolp pattern) '(t)) - ((select-double-match? pattern) - (append - (compile-select-tests key (first pattern)) - (compile-select-tests key (third pattern)))) - ((select-predicate? pattern) - (append - `((,(second (first pattern)) ,key)) - (compile-select-tests key (second pattern)))) - ((consp pattern) - (append - `((consp ,key)) - (compile-select-tests (cs-car key) (car - pattern)) - (compile-select-tests (cs-cdr key) (cdr - pattern)))) - (t (error "Illegal select pattern: ~S" pattern)))) - - -(defun compile-select-bindings (key pattern action) - (cond ((constantp pattern) '()) - ((symbolp pattern) - (if (select-in-tree pattern action) - `((,pattern ,key)) - '())) - ((select-double-match? pattern) - (append - (compile-select-bindings key (first pattern) action) - (compile-select-bindings key (third pattern) action))) - ((select-predicate? pattern) - (compile-select-bindings key (second pattern) action)) - ((consp pattern) - (append - (compile-select-bindings (cs-car key) (car pattern) - action) - (compile-select-bindings (cs-cdr key) (cdr pattern) - action))))) - -(defun select-in-tree (atom tree) - (or (eq atom tree) - (if (consp tree) - (or (select-in-tree atom (car tree)) - (select-in-tree atom (cdr tree)))))) - -(defun select-double-match? (pattern) - ;; ( = ) - (and (consp pattern) (consp (cdr pattern)) (consp (cddr pattern)) - (null (cdddr pattern)) - (eq (second pattern) '=))) - -(defun select-predicate? (pattern) - ;; ((function ) ) - (and (consp pattern) - (consp (cdr pattern)) - (null (cddr pattern)) - (consp (first pattern)) - (consp (cdr (first pattern))) - (null (cddr (first pattern))) - (eq (caar pattern) 'function))) - -(defun cs-car (exp) - (cs-car/cdr 'car exp - '((car . caar) (cdr . cadr) (caar . caaar) (cadr . caadr) - (cdar . cadar) (cddr . caddr) - (caaar . caaaar) (caadr . caaadr) (cadar . caadar) - (caddr . caaddr) (cdaar . cadaar) (cdadr . cadadr) - (cddar . caddar) (cdddr . cadddr)))) - -(defun cs-cdr (exp) - (cs-car/cdr 'cdr exp - '((car . cdar) (cdr . cddr) (caar . cdaar) (cadr . cdadr) - (cdar . cddar) (cddr . cdddr) - (caaar . cdaaar) (caadr . cdaadr) (cadar . cdadar) - (caddr . cdaddr) (cdaar . cddaar) (cdadr . cddadr) - (cddar . cdddar) (cdddr . cddddr)))) - -(defun cs-car/cdr (op exp table) - (if (and (consp exp) (= (length exp) 2)) - (let ((replacement (assoc (car exp) table))) - (if replacement - `(,(cdr replacement) ,(second exp)) - `(,op ,exp))) - `(,op ,exp))) - -;; (setf c1 '(select-match x (a 1) (b 2 3 4))) -;; (setf c2 '(select-match (car y) -;; (1 (print 100) 101) (2 200) ("hello" 5) (:x 20) (else (1+ -;; else)))) -;; (setf c3 '(select-match (caddr y) -;; ((all = (x y)) (list x y all)) -;; ((a '= b) (list 'assign a b)) -;; ((#'oddp k) (1+ k))))) - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/mezzano.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/mezzano.lisp deleted file mode 100644 index b4d8feb..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/mezzano.lisp +++ /dev/null @@ -1,730 +0,0 @@ -;;;;; -*- indent-tabs-mode: nil -*- -;;; -;;; swank-mezzano.lisp --- SLIME backend for Mezzano -;;; -;;; This code has been placed in the Public Domain. All warranties are -;;; disclaimed. -;;; - -;;; Administrivia - -(defpackage swank/mezzano - (:use cl swank/backend)) - -(in-package swank/mezzano) - -;;; swank-mop - -(import-swank-mop-symbols :mezzano.clos '(:class-default-initargs - :class-direct-default-initargs - :specializer-direct-methods - :generic-function-declarations)) - -(defun swank-mop:specializer-direct-methods (obj) - (declare (ignore obj)) - '()) - -(defun swank-mop:generic-function-declarations (gf) - (declare (ignore gf)) - '()) - -(defimplementation gray-package-name () - "MEZZANO.GRAY") - -;;;; TCP server - -(defclass listen-socket () - ((%host :initarg :host) - (%port :initarg :port) - (%connection-fifo :initarg :connections) - (%callback :initarg :callback))) - -(defimplementation create-socket (host port &key backlog) - (let* ((connections (mezzano.supervisor:make-fifo (or backlog 10))) - (sock (make-instance 'listen-socket - :host host - :port port - :connections connections - :callback (lambda (conn) - (do-connection conn connections)))) - (listen-fn (slot-value sock '%callback))) - (when (find port mezzano.network.tcp::*server-alist* - :key #'first) - (error "Server already listening on port ~D" port)) - (push (list port listen-fn) mezzano.network.tcp::*server-alist*) - sock)) - -(defun do-connection (conn connections) - (when (not (mezzano.supervisor:fifo-push - (make-instance 'mezzano.network.tcp::tcp-stream :connection conn) - connections - nil)) - ;; Drop connections when they can't be handled. - (close conn))) - -(defimplementation local-port (socket) - (slot-value socket '%port)) - -(defimplementation close-socket (socket) - (setf mezzano.network.tcp::*server-alist* - (remove (slot-value socket '%callback) - mezzano.network.tcp::*server-alist* - :key #'second)) - (let ((fifo (slot-value socket '%connection-fifo))) - (loop - (let ((conn (mezzano.supervisor:fifo-pop fifo nil))) - (when (not conn) - (return)) - (close conn)))) - (setf (slot-value socket '%connection-fifo) nil)) - -(defimplementation accept-connection (socket &key external-format - buffering timeout) - (declare (ignore external-format buffering timeout)) - (loop - (let ((value (mezzano.supervisor:fifo-pop - (slot-value socket '%connection-fifo) - nil))) - (when value - (return value))) - ;; Poke standard-input every now and then to keep the console alive. - (listen) - (sleep 0.05))) - -(defimplementation preferred-communication-style () - :spawn) - -;;;; Unix signals -;;;; ???? - -(defimplementation getpid () - 0) - -;;;; Compilation - -(defun signal-compiler-condition (condition severity) - (signal 'compiler-condition - :original-condition condition - :severity severity - :message (format nil "~A" condition) - :location nil)) - -(defimplementation call-with-compilation-hooks (func) - (handler-bind - ((error - (lambda (c) - (signal-compiler-condition c :error))) - (warning - (lambda (c) - (signal-compiler-condition c :warning))) - (style-warning - (lambda (c) - (signal-compiler-condition c :style-warning)))) - (funcall func))) - -(defimplementation swank-compile-string (string &key buffer position filename - policy) - (declare (ignore buffer policy)) - (let* ((*load-pathname* (ignore-errors (pathname filename))) - (*load-truename* (when *load-pathname* - (ignore-errors (truename *load-pathname*)))) - (sys.int::*top-level-form-number* `(:position ,position))) - (with-compilation-hooks () - (eval (read-from-string (concatenate 'string "(progn " string " )"))))) - t) - -(defimplementation swank-compile-file (input-file output-file load-p - external-format - &key policy) - (with-compilation-hooks () - (multiple-value-prog1 - (compile-file input-file - :output-file output-file - :external-format external-format) - (when load-p - (load output-file))))) - -(defimplementation find-external-format (coding-system) - (if (or (equal coding-system "utf-8") - (equal coding-system "utf-8-unix")) - :default - nil)) - -;;;; Debugging - -;; Definitely don't allow this. -(defimplementation install-debugger-globally (function) - (declare (ignore function)) - nil) - -(defvar *current-backtrace*) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (let ((*current-backtrace* '())) - (let ((prev-fp nil)) - (sys.int::map-backtrace - (lambda (i fp) - (push (list (1- i) fp prev-fp) *current-backtrace*) - (setf prev-fp fp)))) - (setf *current-backtrace* (reverse *current-backtrace*)) - ;; Drop the topmost frame, which is finished call to MAP-BACKTRACE. - (pop *current-backtrace*) - ;; And the next one for good measure. - (pop *current-backtrace*) - (funcall debugger-loop-fn))) - -(defimplementation compute-backtrace (start end) - (subseq *current-backtrace* start end)) - -(defimplementation print-frame (frame stream) - (format stream "~S" (sys.int::function-from-frame frame))) - -(defimplementation frame-source-location (frame-number) - (let* ((frame (nth frame-number *current-backtrace*)) - (fn (sys.int::function-from-frame frame))) - (function-location fn))) - -(defimplementation frame-locals (frame-number) - (loop - with frame = (nth frame-number *current-backtrace*) - for (name id location repr) in (sys.int::frame-locals frame) - collect (list :name name - :id id - :value (sys.int::read-frame-slot frame location repr)))) - -(defimplementation frame-var-value (frame-number var-id) - (let* ((frame (nth frame-number *current-backtrace*)) - (locals (sys.int::frame-locals frame)) - (info (nth var-id locals))) - (if info - (destructuring-bind (name id location repr) - info - (declare (ignore id)) - (values (sys.int::read-frame-slot frame location repr) name)) - (error "Invalid variable id ~D for frame number ~D." - var-id frame-number)))) - -;;;; Definition finding - -(defun top-level-form-position (pathname tlf) - (ignore-errors - (with-open-file (s pathname) - (loop - repeat tlf - do (with-standard-io-syntax - (let ((*read-suppress* t) - (*read-eval* nil)) - (read s nil)))) - (let ((default (make-pathname :host (pathname-host s)))) - (make-location `(:file ,(enough-namestring s default)) - `(:position ,(1+ (file-position s)))))))) - -(defun function-location (function) - "Return a location object for FUNCTION." - (let* ((info (sys.int::function-debug-info function)) - (pathname (sys.int::debug-info-source-pathname info)) - (tlf (sys.int::debug-info-source-top-level-form-number info))) - (cond ((and (consp tlf) - (eql (first tlf) :position)) - (let ((default (make-pathname :host (pathname-host pathname)))) - (make-location `(:file ,(enough-namestring pathname default)) - `(:position ,(second tlf))))) - (t - (top-level-form-position pathname tlf))))) - -(defun method-definition-name (name method) - `(defmethod ,name - ,@(mezzano.clos:method-qualifiers method) - ,(mapcar (lambda (x) - (typecase x - (mezzano.clos:class - (mezzano.clos:class-name x)) - (mezzano.clos:eql-specializer - `(eql ,(mezzano.clos:eql-specializer-object x))) - (t x))) - (mezzano.clos:method-specializers method)))) - -(defimplementation find-definitions (name) - (let ((result '())) - (labels - ((frob-fn (dspec fn) - (let ((loc (function-location fn))) - (when loc - (push (list dspec loc) result)))) - (try-fn (name) - (when (valid-function-name-p name) - (when (and (fboundp name) - (not (and (symbolp name) - (or (special-operator-p name) - (macro-function name))))) - (let ((fn (fdefinition name))) - (cond ((typep fn 'mezzano.clos:standard-generic-function) - (dolist (m (mezzano.clos:generic-function-methods fn)) - (frob-fn (method-definition-name name m) - (mezzano.clos:method-function m)))) - (t - (frob-fn `(defun ,name) fn))))) - (when (compiler-macro-function name) - (frob-fn `(define-compiler-macro ,name) - (compiler-macro-function name)))))) - (try-fn name) - (try-fn `(setf name)) - (try-fn `(sys.int::cas name)) - (when (and (symbolp name) - (get name 'sys.int::setf-expander)) - (frob-fn `(define-setf-expander ,name) - (get name 'sys.int::setf-expander))) - (when (and (symbolp name) - (macro-function name)) - (frob-fn `(defmacro ,name) - (macro-function name)))) - result)) - -;;;; XREF -;;; Simpler variants. - -(defun find-all-frefs () - (let ((frefs (make-array 500 :adjustable t :fill-pointer 0)) - (keep-going t)) - (loop - (when (not keep-going) - (return)) - (adjust-array frefs (* (array-dimension frefs 0) 2)) - (setf keep-going nil - (fill-pointer frefs) 0) - ;; Walk the wired area looking for FREFs. - (sys.int::walk-area - :wired - (lambda (object address size) - (when (sys.int::function-reference-p object) - (when (not (vector-push object frefs)) - (setf keep-going t)))))) - (remove-duplicates (coerce frefs 'list)))) - -(defimplementation list-callers (function-name) - (let ((fref-for-fn (sys.int::function-reference function-name)) - (callers '())) - (loop - for fref in (find-all-frefs) - for fn = (sys.int::function-reference-function fref) - for name = (sys.int::function-reference-name fref) - when fn - do - (cond ((typep fn 'standard-generic-function) - (dolist (m (mezzano.clos:generic-function-methods fn)) - (let* ((mf (mezzano.clos:method-function m)) - (mf-frefs (get-all-frefs-in-function mf))) - (when (member fref-for-fn mf-frefs) - (push `((defmethod ,name - ,@(mezzano.clos:method-qualifiers m) - ,(mapcar #'specializer-name - (mezzano.clos:method-specializers m))) - ,(function-location mf)) - callers))))) - ((member fref-for-fn - (get-all-frefs-in-function fn)) - (push `((defun ,name) ,(function-location fn)) callers)))) - callers)) - -(defun specializer-name (specializer) - (if (typep specializer 'standard-class) - (mezzano.clos:class-name specializer) - specializer)) - -(defun get-all-frefs-in-function (function) - (when (sys.int::funcallable-std-instance-p function) - (setf function (sys.int::funcallable-std-instance-function function))) - (when (sys.int::closure-p function) - (setf function (sys.int::%closure-function function))) - (loop - for i below (sys.int::function-pool-size function) - for entry = (sys.int::function-pool-object function i) - when (sys.int::function-reference-p entry) - collect entry - when (compiled-function-p entry) ; closures - append (get-all-frefs-in-function entry))) - -(defimplementation list-callees (function-name) - (let* ((fn (fdefinition function-name)) - ;; Grovel around in the function's constant pool looking for - ;; function-references. These may be for #', but they're - ;; probably going to be for normal calls. - ;; TODO: This doesn't work well on interpreted functions or - ;; funcallable instances. - (callees (remove-duplicates (get-all-frefs-in-function fn)))) - (loop - for fref in callees - for name = (sys.int::function-reference-name fref) - for fn = (sys.int::function-reference-function fref) - when fn - collect `((defun ,name) ,(function-location fn))))) - -;;;; Documentation - -(defimplementation arglist (name) - (let ((macro (when (symbolp name) - (macro-function name))) - (fn (if (functionp name) - name - (ignore-errors (fdefinition name))))) - (cond - (macro - (get name 'sys.int::macro-lambda-list)) - (fn - (cond - ((typep fn 'mezzano.clos:standard-generic-function) - (mezzano.clos:generic-function-lambda-list fn)) - (t - (function-lambda-list fn)))) - (t :not-available)))) - -(defun function-lambda-list (function) - (sys.int::debug-info-lambda-list - (sys.int::function-debug-info function))) - -(defimplementation type-specifier-p (symbol) - (cond - ((or (get symbol 'sys.int::type-expander) - (get symbol 'sys.int::compound-type) - (get symbol 'sys.int::type-symbol)) - t) - (t :not-available))) - -(defimplementation function-name (function) - (sys.int::function-name function)) - -(defimplementation valid-function-name-p (form) - "Is FORM syntactically valid to name a function? - If true, FBOUNDP should not signal a type-error for FORM." - (flet ((length=2 (list) - (and (not (null (cdr list))) (null (cddr list))))) - (or (symbolp form) - (and (consp form) (length=2 form) - (or (eq (first form) 'setf) - (eq (first form) 'sys.int::cas)) - (symbolp (second form)))))) - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (when (boundp symbol) - (setf (getf result :variable) nil)) - (when (and (fboundp symbol) - (not (macro-function symbol))) - (setf (getf result :function) - (function-docstring symbol))) - (when (fboundp `(setf ,symbol)) - (setf (getf result :setf) - (function-docstring `(setf ,symbol)))) - (when (get symbol 'sys.int::setf-expander) - (setf (getf result :setf) nil)) - (when (special-operator-p symbol) - (setf (getf result :special-operator) nil)) - (when (macro-function symbol) - (setf (getf result :macro) nil)) - (when (compiler-macro-function symbol) - (setf (getf result :compiler-macro) nil)) - (when (type-specifier-p symbol) - (setf (getf result :type) nil)) - (when (find-class symbol nil) - (setf (getf result :class) nil)) - result)) - -(defun function-docstring (function-name) - (let* ((definition (fdefinition function-name)) - (debug-info (sys.int::function-debug-info definition))) - (sys.int::debug-info-docstring debug-info))) - -;;;; Multithreading - -;; FIXME: This should be a weak table. -(defvar *thread-ids-for-emacs* (make-hash-table)) -(defvar *next-thread-id-for-emacs* 0) -(defvar *thread-id-for-emacs-lock* (mezzano.supervisor:make-mutex - "SWANK thread ID table")) - -(defimplementation spawn (fn &key name) - (mezzano.supervisor:make-thread fn :name name)) - -(defimplementation thread-id (thread) - (mezzano.supervisor:with-mutex (*thread-id-for-emacs-lock*) - (let ((id (gethash thread *thread-ids-for-emacs*))) - (when (null id) - (setf id (incf *next-thread-id-for-emacs*) - (gethash thread *thread-ids-for-emacs*) id - (gethash id *thread-ids-for-emacs*) thread)) - id))) - -(defimplementation find-thread (id) - (mezzano.supervisor:with-mutex (*thread-id-for-emacs-lock*) - (gethash id *thread-ids-for-emacs*))) - -(defimplementation thread-name (thread) - (mezzano.supervisor:thread-name thread)) - -(defimplementation thread-status (thread) - (format nil "~:(~A~)" (mezzano.supervisor:thread-state thread))) - -(defimplementation current-thread () - (mezzano.supervisor:current-thread)) - -(defimplementation all-threads () - (mezzano.supervisor:all-threads)) - -(defimplementation thread-alive-p (thread) - (not (eql (mezzano.supervisor:thread-state thread) :dead))) - -(defimplementation interrupt-thread (thread fn) - (mezzano.supervisor:establish-thread-foothold thread fn)) - -(defimplementation kill-thread (thread) - ;; Documentation says not to execute unwind-protected sections, but there's - ;; no way to do that. - ;; And killing threads at arbitrary points without unwinding them is a good - ;; way to hose the system. - (mezzano.supervisor:terminate-thread thread)) - -(defvar *mailbox-lock* (mezzano.supervisor:make-mutex "mailbox lock")) -(defvar *mailboxes* (list)) - -(defstruct (mailbox (:conc-name mailbox.)) - thread - (mutex (mezzano.supervisor:make-mutex)) - (queue '() :type list)) - -(defun mailbox (thread) - "Return THREAD's mailbox." - ;; Use weak pointers to avoid holding on to dead threads forever. - (mezzano.supervisor:with-mutex (*mailbox-lock*) - ;; Flush forgotten threads. - (setf *mailboxes* - (remove-if-not #'sys.int::weak-pointer-value *mailboxes*)) - (loop - for entry in *mailboxes* - do - (multiple-value-bind (key value livep) - (sys.int::weak-pointer-pair entry) - (when (eql key thread) - (return value))) - finally - (let ((mb (make-mailbox :thread thread))) - (push (sys.int::make-weak-pointer thread mb) *mailboxes*) - (return mb))))) - -(defimplementation send (thread message) - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) - (mezzano.supervisor:with-mutex (mutex) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message)))))) - -(defvar *receive-if-sleep-time* 0.02) - -(defimplementation receive-if (test &optional timeout) - (let* ((mbox (mailbox (current-thread))) - (mutex (mailbox.mutex mbox))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (mezzano.supervisor:with-mutex (mutex) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) (nconc (ldiff q tail) (cdr tail))) - (return (car tail)))) - (when (eq timeout t) (return (values nil t)))) - (sleep *receive-if-sleep-time*)))) - -(defvar *registered-threads* (make-hash-table)) -(defvar *registered-threads-lock* - (mezzano.supervisor:make-mutex "registered threads lock")) - -(defimplementation register-thread (name thread) - (declare (type symbol name)) - (mezzano.supervisor:with-mutex (*registered-threads-lock*) - (etypecase thread - (null - (remhash name *registered-threads*)) - (mezzano.supervisor:thread - (setf (gethash name *registered-threads*) thread)))) - nil) - -(defimplementation find-registered (name) - (mezzano.supervisor:with-mutex (*registered-threads-lock*) - (values (gethash name *registered-threads*)))) - -(defimplementation wait-for-input (streams &optional timeout) - (loop - (let ((ready '())) - (dolist (s streams) - (when (or (listen s) - (and (typep s 'mezzano.network.tcp::tcp-stream) - (mezzano.network.tcp::tcp-connection-closed-p s))) - (push s ready))) - (when ready - (return ready)) - (when (check-slime-interrupts) - (return :interrupt)) - (when timeout - (return '())) - (sleep 1) - (when (numberp timeout) - (decf timeout 1) - (when (not (plusp timeout)) - (return '())))))) - -;;;; Locks - -(defstruct recursive-lock - mutex - (depth 0)) - -(defimplementation make-lock (&key name) - (make-recursive-lock - :mutex (mezzano.supervisor:make-mutex name))) - -(defimplementation call-with-lock-held (lock function) - (cond ((mezzano.supervisor:mutex-held-p - (recursive-lock-mutex lock)) - (unwind-protect - (progn (incf (recursive-lock-depth lock)) - (funcall function)) - (decf (recursive-lock-depth lock)))) - (t - (mezzano.supervisor:with-mutex ((recursive-lock-mutex lock)) - (multiple-value-prog1 - (funcall function) - (assert (eql (recursive-lock-depth lock) 0))))))) - -;;;; Character names - -(defimplementation character-completion-set (prefix matchp) - ;; TODO: Unicode characters too. - (loop - for names in sys.int::*char-name-alist* - append - (loop - for name in (rest names) - when (funcall matchp prefix name) - collect name))) - -;;;; Inspector - -(defmethod emacs-inspect ((o function)) - (case (sys.int::%object-tag o) - (#.sys.int::+object-tag-function+ - (label-value-line* - (:name (sys.int::function-name o)) - (:arglist (arglist o)) - (:debug-info (sys.int::function-debug-info o)))) - (#.sys.int::+object-tag-closure+ - (append - (label-value-line :function (sys.int::%closure-function o)) - `("Closed over values:" (:newline)) - (loop - for i below (sys.int::%closure-length o) - append (label-value-line i (sys.int::%closure-value o i))))) - (t - (call-next-method)))) - -(defmethod emacs-inspect ((o sys.int::weak-pointer)) - (label-value-line* - (:key (sys.int::weak-pointer-key o)) - (:value (sys.int::weak-pointer-value o)))) - -(defmethod emacs-inspect ((o sys.int::function-reference)) - (label-value-line* - (:name (sys.int::function-reference-name o)) - (:function (sys.int::function-reference-function o)))) - -(defmethod emacs-inspect ((object structure-object)) - (let ((class (class-of object))) - `("Class: " (:value ,class) (:newline) - ,@(swank::all-slots-for-inspector object)))) - -(in-package :swank) - -(defmethod all-slots-for-inspector ((object structure-object)) - (let* ((class (class-of object)) - (direct-slots (swank-mop:class-direct-slots class)) - (effective-slots (swank-mop:class-slots class)) - (longest-slot-name-length - (loop for slot :in effective-slots - maximize (length (symbol-name - (swank-mop:slot-definition-name slot))))) - (checklist - (reinitialize-checklist - (ensure-istate-metadata object :checklist - (make-checklist (length effective-slots))))) - (grouping-kind - ;; We box the value so we can re-set it. - (ensure-istate-metadata object :grouping-kind - (box *inspector-slots-default-grouping*))) - (sort-order - (ensure-istate-metadata object :sort-order - (box *inspector-slots-default-order*))) - (sort-predicate (ecase (ref sort-order) - (:alphabetically #'string<) - (:unsorted (constantly nil)))) - (sorted-slots (sort (copy-seq effective-slots) - sort-predicate - :key #'swank-mop:slot-definition-name)) - (effective-slots - (ecase (ref grouping-kind) - (:all sorted-slots) - (:inheritance (stable-sort-by-inheritance sorted-slots - class sort-predicate))))) - `("--------------------" - (:newline) - " Group slots by inheritance " - (:action ,(ecase (ref grouping-kind) - (:all "[ ]") - (:inheritance "[X]")) - ,(lambda () - ;; We have to do this as the order of slots will - ;; be sorted differently. - (fill (checklist.buttons checklist) nil) - (setf (ref grouping-kind) - (ecase (ref grouping-kind) - (:all :inheritance) - (:inheritance :all)))) - :refreshp t) - (:newline) - " Sort slots alphabetically " - (:action ,(ecase (ref sort-order) - (:unsorted "[ ]") - (:alphabetically "[X]")) - ,(lambda () - (fill (checklist.buttons checklist) nil) - (setf (ref sort-order) - (ecase (ref sort-order) - (:unsorted :alphabetically) - (:alphabetically :unsorted)))) - :refreshp t) - (:newline) - ,@ (case (ref grouping-kind) - (:all - `((:newline) - "All Slots:" - (:newline) - ,@(make-slot-listing checklist object class - effective-slots direct-slots - longest-slot-name-length))) - (:inheritance - (list-all-slots-by-inheritance checklist object class - effective-slots direct-slots - longest-slot-name-length))) - (:newline) - (:action "[set value]" - ,(lambda () - (do-checklist (idx checklist) - (query-and-set-slot class object - (nth idx effective-slots)))) - :refreshp t) - " " - (:action "[make unbound]" - ,(lambda () - (do-checklist (idx checklist) - (swank-mop:slot-makunbound-using-class - class object (nth idx effective-slots)))) - :refreshp t) - (:newline)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/mkcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/mkcl.lisp deleted file mode 100644 index 53696fb..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/mkcl.lisp +++ /dev/null @@ -1,933 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- -;;; -;;; swank-mkcl.lisp --- SLIME backend for MKCL. -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -;;; Administrivia - -(defpackage swank/mkcl - (:use cl swank/backend)) - -(in-package swank/mkcl) - -;;(declaim (optimize (debug 3))) - -(defvar *tmp*) - -(defimplementation gray-package-name () - '#:gray) - -(eval-when (:compile-toplevel :load-toplevel) - - (swank/backend::import-swank-mop-symbols :clos - ;; '(:eql-specializer - ;; :eql-specializer-object - ;; :generic-function-declarations - ;; :specializer-direct-methods - ;; :compute-applicable-methods-using-classes) - nil - )) - - -;;; UTF8 - -(defimplementation string-to-utf8 (string) - (mkcl:octets (si:utf-8 string))) - -(defimplementation utf8-to-string (octets) - (string (si:utf-8 octets))) - - -;;;; TCP Server - -(eval-when (:compile-toplevel :load-toplevel) - ;; At compile-time we need access to the sb-bsd-sockets package for the - ;; the following code to be read properly. - ;; It is a bit a shame we have to load the entire module to get that. - (require 'sockets)) - - -(defun resolve-hostname (name) - (car (sb-bsd-sockets:host-ent-addresses - (sb-bsd-sockets:get-host-by-name name)))) - -(defimplementation create-socket (host port &key backlog) - (let ((socket (make-instance 'sb-bsd-sockets:inet-socket - :type :stream - :protocol :tcp))) - (setf (sb-bsd-sockets:sockopt-reuse-address socket) t) - (sb-bsd-sockets:socket-bind socket (resolve-hostname host) port) - (sb-bsd-sockets:socket-listen socket (or backlog 5)) - socket)) - -(defimplementation local-port (socket) - (nth-value 1 (sb-bsd-sockets:socket-name socket))) - -(defimplementation close-socket (socket) - (sb-bsd-sockets:socket-close socket)) - -(defun accept (socket) - "Like socket-accept, but retry on EINTR." - (loop (handler-case - (return (sb-bsd-sockets:socket-accept socket)) - (sb-bsd-sockets:interrupted-error ())))) - -(defimplementation accept-connection (socket - &key external-format - buffering timeout) - (declare (ignore timeout)) - (sb-bsd-sockets:socket-make-stream (accept socket) - :output t ;; bogus - :input t ;; bogus - :buffering buffering ;; bogus - :element-type (if external-format - 'character - '(unsigned-byte 8)) - :external-format external-format - )) - -(defimplementation preferred-communication-style () - :spawn - ) - -(defvar *external-format-to-coding-system* - '((:iso-8859-1 - "latin-1" "latin-1-unix" "iso-latin-1-unix" - "iso-8859-1" "iso-8859-1-unix") - (:utf-8 "utf-8" "utf-8-unix"))) - -(defun external-format (coding-system) - (or (car (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*)) - (find coding-system (si:all-encodings) :test #'string-equal))) - -(defimplementation find-external-format (coding-system) - #+unicode (external-format coding-system) - ;; Without unicode support, MKCL uses the one-byte encoding of the - ;; underlying OS, and will barf on anything except :DEFAULT. We - ;; return NIL here for known multibyte encodings, so - ;; SWANK:CREATE-SERVER will barf. - #-unicode (let ((xf (external-format coding-system))) - (if (member xf '(:utf-8)) - nil - :default))) - - - -;;;; Unix signals - -(defimplementation install-sigint-handler (handler) - (let ((old-handler (symbol-function 'si:terminal-interrupt))) - (setf (symbol-function 'si:terminal-interrupt) - (if (consp handler) - (car handler) - (lambda (&rest args) - (declare (ignore args)) - (funcall handler) - (continue)))) - (list old-handler))) - - -(defimplementation getpid () - (mkcl:getpid)) - -(defimplementation set-default-directory (directory) - (mk-ext::chdir (namestring directory)) - (default-directory)) - -(defimplementation default-directory () - (namestring (mk-ext:getcwd))) - -(defmacro progf (plist &rest forms) - `(let (_vars _vals) - (do ((p ,plist (cddr p))) - ((endp p)) - (push (car p) _vars) - (push (cadr p) _vals)) - (progv _vars _vals ,@forms) - ) - ) - -(defvar *inferior-lisp-sleeping-post* nil) - -(defimplementation quit-lisp () - (progf (ignore-errors (eval (read-from-string "swank::*saved-global-streams*"))) ;; restore original IO streams. - (when *inferior-lisp-sleeping-post* (mt:semaphore-signal *inferior-lisp-sleeping-post*)) - ;;(mk-ext:quit :verbose t) - )) - - -;;;; Compilation - -(defvar *buffer-name* nil) -(defvar *buffer-start-position*) -(defvar *buffer-string*) -(defvar *compile-filename*) - -(defun signal-compiler-condition (&rest args) - (signal (apply #'make-condition 'compiler-condition args))) - -#| -(defun handle-compiler-warning (condition) - (signal-compiler-condition - :original-condition condition - :message (format nil "~A" condition) - :severity :warning - :location - (if *buffer-name* - (make-location (list :buffer *buffer-name*) - (list :offset *buffer-start-position* 0)) - ;; ;; compiler::*current-form* - ;; (if compiler::*current-function* - ;; (make-location (list :file *compile-filename*) - ;; (list :function-name - ;; (symbol-name - ;; (slot-value compiler::*current-function* - ;; 'compiler::name)))) - (list :error "No location found.") - ;; ) - ))) -|# - -#| -(defun condition-location (condition) - (let ((file (compiler:compiler-message-file condition)) - (position (compiler:compiler-message-file-position condition))) - (if (and position (not (minusp position))) - (if *buffer-name* - (make-buffer-location *buffer-name* - *buffer-start-position* - position) - (make-file-location file position)) - (make-error-location "No location found.")))) -|# - -(defun condition-location (condition) - (if *buffer-name* - (make-location (list :buffer *buffer-name*) - (list :offset *buffer-start-position* 0)) - ;; ;; compiler::*current-form* ; - ;; (if compiler::*current-function* ; - ;; (make-location (list :file *compile-filename*) ; - ;; (list :function-name ; - ;; (symbol-name ; - ;; (slot-value compiler::*current-function* ; - ;; 'compiler::name)))) ; - (if (typep condition 'compiler::compiler-message) - (make-location (list :file (namestring (compiler:compiler-message-file condition))) - (list :end-position (compiler:compiler-message-file-end-position condition))) - (list :error "No location found.")) - ) - ) - -(defun handle-compiler-message (condition) - (unless (typep condition 'compiler::compiler-note) - (signal-compiler-condition - :original-condition condition - :message (princ-to-string condition) - :severity (etypecase condition - (compiler:compiler-fatal-error :error) - (compiler:compiler-error :error) - (error :error) - (style-warning :style-warning) - (warning :warning)) - :location (condition-location condition)))) - -(defimplementation call-with-compilation-hooks (function) - (handler-bind ((compiler:compiler-message #'handle-compiler-message)) - (funcall function))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (with-compilation-hooks () - (let ((*buffer-name* nil) - (*compile-filename* input-file)) - (handler-bind (#| - (compiler::compiler-note - #'(lambda (n) - (format t "~%swank saw a compiler note: ~A~%" n) (finish-output) nil)) - (compiler::compiler-warning - #'(lambda (w) - (format t "~%swank saw a compiler warning: ~A~%" w) (finish-output) nil)) - (compiler::compiler-error - #'(lambda (e) - (format t "~%swank saw a compiler error: ~A~%" e) (finish-output) nil)) - |# - ) - (multiple-value-bind (output-truename warnings-p failure-p) - (compile-file input-file :output-file output-file :external-format external-format) - (values output-truename warnings-p - (or failure-p - (and load-p (not (load output-truename)))))))))) - -(defimplementation swank-compile-string (string &key buffer position filename policy) - (declare (ignore filename policy)) - (with-compilation-hooks () - (let ((*buffer-name* buffer) - (*buffer-start-position* position) - (*buffer-string* string)) - (with-input-from-string (s string) - (when position (file-position position)) - (compile-from-stream s))))) - -(defun compile-from-stream (stream) - (let ((file (mkcl:mkstemp "TMP:MKCL-SWANK-TMPXXXXXX")) - output-truename - warnings-p - failure-p - ) - (with-open-file (s file :direction :output :if-exists :overwrite) - (do ((line (read-line stream nil) (read-line stream nil))) - ((not line)) - (write-line line s))) - (unwind-protect - (progn - (multiple-value-setq (output-truename warnings-p failure-p) - (compile-file file)) - (and (not failure-p) (load output-truename))) - (when (probe-file file) (delete-file file)) - (when (probe-file output-truename) (delete-file output-truename))))) - - -;;;; Documentation - -(defun grovel-docstring-for-arglist (name type) - (flet ((compute-arglist-offset (docstring) - (when docstring - (let ((pos1 (search "Args: " docstring))) - (if pos1 - (+ pos1 6) - (let ((pos2 (search "Syntax: " docstring))) - (when pos2 - (+ pos2 8)))))))) - (let* ((docstring (si::get-documentation name type)) - (pos (compute-arglist-offset docstring))) - (if pos - (multiple-value-bind (arglist errorp) - (ignore-errors - (values (read-from-string docstring t nil :start pos))) - (if (or errorp (not (listp arglist))) - :not-available - arglist - )) - :not-available )))) - -(defimplementation arglist (name) - (cond ((and (symbolp name) (special-operator-p name)) - (let ((arglist (grovel-docstring-for-arglist name 'function))) - (if (consp arglist) (cdr arglist) arglist))) - ((and (symbolp name) (macro-function name)) - (let ((arglist (grovel-docstring-for-arglist name 'function))) - (if (consp arglist) (cdr arglist) arglist))) - ((or (functionp name) (fboundp name)) - (multiple-value-bind (name fndef) - (if (functionp name) - (values (function-name name) name) - (values name (fdefinition name))) - (let ((fle (function-lambda-expression fndef))) - (case (car fle) - (si:lambda-block (caddr fle)) - (t (typecase fndef - (generic-function (clos::generic-function-lambda-list fndef)) - (compiled-function (grovel-docstring-for-arglist name 'function)) - (function :not-available))))))) - (t :not-available))) - -(defimplementation function-name (f) - (si:compiled-function-name f) - ) - -(eval-when (:compile-toplevel :load-toplevel) - ;; At compile-time we need access to the walker package for the - ;; the following code to be read properly. - ;; It is a bit a shame we have to load the entire module to get that. - (require 'walker)) - -(defimplementation macroexpand-all (form &optional env) - (declare (ignore env)) - (walker:macroexpand-all form)) - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (dolist (type '(:VARIABLE :FUNCTION :CLASS)) - (let ((doc (describe-definition symbol type))) - (when doc - (setf result (list* type doc result))))) - result)) - -(defimplementation describe-definition (name type) - (case type - (:variable (documentation name 'variable)) - (:function (documentation name 'function)) - (:class (documentation name 'class)) - (t nil))) - -;;; Debugging - -(eval-when (:compile-toplevel :load-toplevel) - (import - '(si::*break-env* - si::*ihs-top* - si::*ihs-current* - si::*ihs-base* - si::*frs-base* - si::*frs-top* - si::*tpl-commands* - si::*tpl-level* - si::frs-top - si::ihs-top - si::ihs-fun - si::ihs-env - si::sch-frs-base - si::set-break-env - si::set-current-ihs - si::tpl-commands))) - -(defvar *backtrace* '()) - -(defun in-swank-package-p (x) - (and - (symbolp x) - (member (symbol-package x) - (list #.(find-package :swank) - #.(find-package :swank/backend) - #.(ignore-errors (find-package :swank-mop)) - #.(ignore-errors (find-package :swank-loader)))) - t)) - -(defun is-swank-source-p (name) - (setf name (pathname name)) - #+(or) - (pathname-match-p - name - (make-pathname :defaults swank-loader::*source-directory* - :name (pathname-name name) - :type (pathname-type name) - :version (pathname-version name))) - nil) - -(defun is-ignorable-fun-p (x) - (or - (in-swank-package-p (frame-name x)) - (multiple-value-bind (file position) - (ignore-errors (si::compiled-function-file (car x))) - (declare (ignore position)) - (if file (is-swank-source-p file))))) - -(defmacro find-ihs-top (x) - (declare (ignore x)) - '(si::ihs-top)) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (declare (type function debugger-loop-fn)) - (let* (;;(*tpl-commands* si::tpl-commands) - (*ihs-base* 0) - (*ihs-top* (find-ihs-top 'call-with-debugging-environment)) - (*ihs-current* *ihs-top*) - (*frs-base* (or (sch-frs-base 0 #|*frs-top*|# *ihs-base*) (1+ (frs-top)))) - (*frs-top* (frs-top)) - (*read-suppress* nil) - ;;(*tpl-level* (1+ *tpl-level*)) - (*backtrace* (loop for ihs from 0 below *ihs-top* - collect (list (si::ihs-fun ihs) - (si::ihs-env ihs) - nil)))) - (declare (special *ihs-current*)) - (loop for f from *frs-base* to *frs-top* - do (let ((i (- (si::frs-ihs f) *ihs-base* 1))) - (when (plusp i) - (let* ((x (elt *backtrace* i)) - (name (si::frs-tag f))) - (unless (mkcl:fixnump name) - (push name (third x))))))) - (setf *backtrace* (remove-if #'is-ignorable-fun-p (nreverse *backtrace*))) - (setf *tmp* *backtrace*) - (set-break-env) - (set-current-ihs) - (let ((*ihs-base* *ihs-top*)) - (funcall debugger-loop-fn)))) - -(defimplementation call-with-debugger-hook (hook fun) - (let ((*debugger-hook* hook) - (*ihs-base* (find-ihs-top 'call-with-debugger-hook))) - (funcall fun))) - -(defimplementation compute-backtrace (start end) - (when (numberp end) - (setf end (min end (length *backtrace*)))) - (loop for f in (subseq *backtrace* start end) - collect f)) - -(defimplementation format-sldb-condition (condition) - "Format a condition for display in SLDB." - ;;(princ-to-string condition) - (format nil "~A~%In thread: ~S" condition mt:*thread*) - ) - -(defun frame-name (frame) - (let ((x (first frame))) - (if (symbolp x) - x - (function-name x)))) - -(defun function-position (fun) - (multiple-value-bind (file position) - (si::compiled-function-file fun) - (and file (make-location - `(:file ,(if (stringp file) file (namestring file))) - ;;`(:position ,position) - `(:end-position , position))))) - -(defun frame-function (frame) - (let* ((x (first frame)) - fun position) - (etypecase x - (symbol (and (fboundp x) - (setf fun (fdefinition x) - position (function-position fun)))) - (function (setf fun x position (function-position x)))) - (values fun position))) - -(defun frame-decode-env (frame) - (let ((functions '()) - (blocks '()) - (variables '())) - (setf frame (si::decode-ihs-env (second frame))) - (dolist (record frame) - (let* ((record0 (car record)) - (record1 (cdr record))) - (cond ((or (symbolp record0) (stringp record0)) - (setq variables (acons record0 record1 variables))) - ((not (mkcl:fixnump record0)) - (push record1 functions)) - ((symbolp record1) - (push record1 blocks)) - (t - )))) - (values functions blocks variables))) - -(defimplementation print-frame (frame stream) - (let ((function (first frame))) - (let ((fname -;;; (cond ((symbolp function) function) -;;; ((si:instancep function) (slot-value function 'name)) -;;; ((compiled-function-p function) -;;; (or (si::compiled-function-name function) 'lambda)) -;;; (t :zombi)) - (si::get-fname function) - )) - (if (eq fname 'si::bytecode) - (format stream "~A [Evaluation of: ~S]" - fname (function-lambda-expression function)) - (format stream "~A" fname) - ) - (when (si::closurep function) - (format stream - ", closure generated from ~A" - (si::get-fname (si:closure-producer function))) - ) - ) - ) - ) - -(defimplementation frame-source-location (frame-number) - (nth-value 1 (frame-function (elt *backtrace* frame-number)))) - -(defimplementation frame-catch-tags (frame-number) - (third (elt *backtrace* frame-number))) - -(defimplementation frame-locals (frame-number) - (loop for (name . value) in (nth-value 2 (frame-decode-env (elt *backtrace* frame-number))) - with i = 0 - collect (list :name name :id (prog1 i (incf i)) :value value))) - -(defimplementation frame-var-value (frame-number var-id) - (cdr (elt (nth-value 2 (frame-decode-env (elt *backtrace* frame-number))) var-id))) - -(defimplementation disassemble-frame (frame-number) - (let ((fun (frame-fun (elt *backtrace* frame-number)))) - (disassemble fun))) - -(defimplementation eval-in-frame (form frame-number) - (let ((env (second (elt *backtrace* frame-number)))) - (si:eval-in-env form env))) - -#| -(defimplementation gdb-initial-commands () - ;; These signals are used by the GC. - #+linux '("handle SIGPWR noprint nostop" - "handle SIGXCPU noprint nostop")) - -(defimplementation command-line-args () - (loop for n from 0 below (si:argc) collect (si:argv n))) -|# - -;;;; Inspector - -(defmethod emacs-inspect ((o t)) - ; ecl clos support leaves some to be desired - (cond - ((streamp o) - (list* - (format nil "~S is an ordinary stream~%" o) - (append - (list - "Open for " - (cond - ((ignore-errors (interactive-stream-p o)) "Interactive") - ((and (input-stream-p o) (output-stream-p o)) "Input and output") - ((input-stream-p o) "Input") - ((output-stream-p o) "Output")) - `(:newline) `(:newline)) - (label-value-line* - ("Element type" (stream-element-type o)) - ("External format" (stream-external-format o))) - (ignore-errors (label-value-line* - ("Broadcast streams" (broadcast-stream-streams o)))) - (ignore-errors (label-value-line* - ("Concatenated streams" (concatenated-stream-streams o)))) - (ignore-errors (label-value-line* - ("Echo input stream" (echo-stream-input-stream o)))) - (ignore-errors (label-value-line* - ("Echo output stream" (echo-stream-output-stream o)))) - (ignore-errors (label-value-line* - ("Output String" (get-output-stream-string o)))) - (ignore-errors (label-value-line* - ("Synonym symbol" (synonym-stream-symbol o)))) - (ignore-errors (label-value-line* - ("Input stream" (two-way-stream-input-stream o)))) - (ignore-errors (label-value-line* - ("Output stream" (two-way-stream-output-stream o))))))) - ((si:instancep o) ;;t - (let* ((cl (si:instance-class o)) - (slots (clos::class-slots cl))) - (list* (format nil "~S is an instance of class ~A~%" - o (clos::class-name cl)) - (loop for x in slots append - (let* ((name (clos::slot-definition-name x)) - (value (if (slot-boundp o name) - (clos::slot-value o name) - "Unbound" - ))) - (list - (format nil "~S: " name) - `(:value ,value) - `(:newline))))))) - (t (list (format nil "~A" o))))) - -;;;; Definitions - -(defimplementation find-definitions (name) - (if (fboundp name) - (let ((tmp (find-source-location (symbol-function name)))) - `(((defun ,name) ,tmp))))) - -(defimplementation find-source-location (obj) - (setf *tmp* obj) - (or - (typecase obj - (function - (multiple-value-bind (file pos) (ignore-errors (si::compiled-function-file obj)) - (if (and file pos) - (make-location - `(:file ,(if (stringp file) file (namestring file))) - `(:end-position ,pos) ;; `(:position ,pos) - `(:snippet - ,(with-open-file (s file) - (file-position s pos) - (skip-comments-and-whitespace s) - (read-snippet s)))))))) - `(:error (format nil "Source definition of ~S not found" obj)))) - -;;;; Profiling - - -(eval-when (:compile-toplevel :load-toplevel) - ;; At compile-time we need access to the profile package for the - ;; the following code to be read properly. - ;; It is a bit a shame we have to load the entire module to get that. - (require 'profile)) - - -(defimplementation profile (fname) - (when fname (eval `(profile:profile ,fname)))) - -(defimplementation unprofile (fname) - (when fname (eval `(profile:unprofile ,fname)))) - -(defimplementation unprofile-all () - (profile:unprofile-all) - "All functions unprofiled.") - -(defimplementation profile-report () - (profile:report)) - -(defimplementation profile-reset () - (profile:reset) - "Reset profiling counters.") - -(defimplementation profiled-functions () - (profile:profile)) - -(defimplementation profile-package (package callers methods) - (declare (ignore callers methods)) - (eval `(profile:profile ,(package-name (find-package package))))) - - -;;;; Threads - -(defvar *thread-id-counter* 0) - -(defvar *thread-id-counter-lock* - (mt:make-lock :name "thread id counter lock")) - -(defun next-thread-id () - (mt:with-lock (*thread-id-counter-lock*) - (incf *thread-id-counter*)) - ) - -(defparameter *thread-id-map* (make-hash-table)) -(defparameter *id-thread-map* (make-hash-table)) - -(defvar *thread-id-map-lock* - (mt:make-lock :name "thread id map lock")) - -(defparameter +default-thread-local-variables+ - '(*macroexpand-hook* - *default-pathname-defaults* - *readtable* - *random-state* - *compile-print* - *compile-verbose* - *load-print* - *load-verbose* - *print-array* - *print-base* - *print-case* - *print-circle* - *print-escape* - *print-gensym* - *print-length* - *print-level* - *print-lines* - *print-miser-width* - *print-pprint-dispatch* - *print-pretty* - *print-radix* - *print-readably* - *print-right-margin* - *read-base* - *read-default-float-format* - *read-eval* - *read-suppress* - )) - -(defun thread-local-default-bindings () - (let (local) - (dolist (var +default-thread-local-variables+ local) - (setq local (acons var (symbol-value var) local)) - ))) - -;; mkcl doesn't have weak pointers -(defimplementation spawn (fn &key name initial-bindings) - (let* ((local-defaults (thread-local-default-bindings)) - (thread - ;;(mt:make-thread :name name) - (mt:make-thread :name name - :initial-bindings (nconc initial-bindings - local-defaults)) - ) - (id (next-thread-id))) - (mt:with-lock (*thread-id-map-lock*) - (setf (gethash id *thread-id-map*) thread) - (setf (gethash thread *id-thread-map*) id)) - (mt:thread-preset - thread - #'(lambda () - (unwind-protect - (progn - ;;(format t "~&Starting thread: ~S.~%" name) (finish-output) - (mt:thread-detach nil) - (funcall fn)) - (progn - ;;(format t "~&Wrapping up thread: ~S.~%" name) (finish-output) - (mt:with-lock (*thread-id-map-lock*) - (remhash thread *id-thread-map*) - (remhash id *thread-id-map*)) - ;;(format t "~&Finished thread: ~S~%" name) (finish-output) - )))) - (mt:thread-enable thread) - (mt:thread-yield) - thread - )) - -(defimplementation thread-id (thread) - (block thread-id - (mt:with-lock (*thread-id-map-lock*) - (or (gethash thread *id-thread-map*) - (let ((id (next-thread-id))) - (setf (gethash id *thread-id-map*) thread) - (setf (gethash thread *id-thread-map*) id) - id))))) - -(defimplementation find-thread (id) - (mt:with-lock (*thread-id-map-lock*) - (gethash id *thread-id-map*))) - -(defimplementation thread-name (thread) - (mt:thread-name thread)) - -(defimplementation thread-status (thread) - (if (mt:thread-active-p thread) - "RUNNING" - "STOPPED")) - -(defimplementation make-lock (&key name) - (mt:make-lock :name name :recursive t)) - -(defimplementation call-with-lock-held (lock function) - (declare (type function function)) - (mt:with-lock (lock) (funcall function))) - -(defimplementation current-thread () - mt:*thread*) - -(defimplementation all-threads () - (mt:all-threads)) - -(defimplementation interrupt-thread (thread fn) - (mt:interrupt-thread thread fn)) - -(defimplementation kill-thread (thread) - (mt:interrupt-thread thread #'mt:terminate-thread) - ) - -(defimplementation thread-alive-p (thread) - (mt:thread-active-p thread)) - -(defvar *mailbox-lock* (mt:make-lock :name "mailbox lock")) -(defvar *mailboxes* (list)) -(declaim (type list *mailboxes*)) - -(defstruct (mailbox (:conc-name mailbox.)) - thread - locked-by - (mutex (mt:make-lock :name "thread mailbox")) - (semaphore (mt:make-semaphore)) - (queue '() :type list)) - -(defun mailbox (thread) - "Return THREAD's mailbox." - (mt:with-lock (*mailbox-lock*) - (or (find thread *mailboxes* :key #'mailbox.thread) - (let ((mb (make-mailbox :thread thread))) - (push mb *mailboxes*) - mb)))) - -(defimplementation send (thread message) - (handler-case - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) -;; (mt:interrupt-thread -;; thread -;; (lambda () -;; (mt:with-lock (mutex) -;; (setf (mailbox.queue mbox) -;; (nconc (mailbox.queue mbox) (list message)))))) - -;; (format t "~&! thread = ~S~% thread = ~S~% message = ~S~%" -;; mt:*thread* thread message) (finish-output) - (mt:with-lock (mutex) - (setf (mailbox.locked-by mbox) mt:*thread*) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message))) - ;;(format t "*") (finish-output) - (handler-case - (mt:semaphore-signal (mailbox.semaphore mbox)) - (condition (condition) - (format t "Something went bad with semaphore-signal ~A" condition) (finish-output) - ;;(break) - )) - (setf (mailbox.locked-by mbox) nil) - ) - ;;(format t "+") (finish-output) - ) - (condition (condition) - (format t "~&Error in send: ~S~%" condition) (finish-output)) - ) - ) - -;; (defimplementation receive () -;; (block got-mail -;; (let* ((mbox (mailbox mt:*thread*)) -;; (mutex (mailbox.mutex mbox))) -;; (loop -;; (mt:with-lock (mutex) -;; (if (mailbox.queue mbox) -;; (return-from got-mail (pop (mailbox.queue mbox))))) -;; ;;interrupt-thread will halt this if it takes longer than 1sec -;; (sleep 1))))) - - -(defimplementation receive-if (test &optional timeout) - (handler-case - (let* ((mbox (mailbox (current-thread))) - (mutex (mailbox.mutex mbox)) - got-one) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - ;;(format t "~&: ~S~%" mt:*thread*) (finish-output) - (handler-case - (setq got-one (mt:semaphore-wait (mailbox.semaphore mbox) 2)) - (condition (condition) - (format t "~&In (swank-mkcl) receive-if: Something went bad with semaphore-wait ~A~%" condition) - (finish-output) - nil - ) - ) - (mt:with-lock (mutex) - (setf (mailbox.locked-by mbox) mt:*thread*) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) (nconc (ldiff q tail) (cdr tail))) - (setf (mailbox.locked-by mbox) nil) - ;;(format t "~&thread ~S received: ~S~%" mt:*thread* (car tail)) - (return (car tail)))) - (setf (mailbox.locked-by mbox) nil) - ) - - ;;(format t "/ ~S~%" mt:*thread*) (finish-output) - (when (eq timeout t) (return (values nil t))) -;; (unless got-one -;; (format t "~&In (swank-mkcl) receive-if: semaphore-wait timed out!~%")) - ) - ) - (condition (condition) - (format t "~&Error in (swank-mkcl) receive-if: ~S, ~A~%" condition condition) (finish-output) - nil - ) - ) - ) - - -(defmethod stream-finish-output ((stream stream)) - (finish-output stream)) - - -;; - -;;#+windows -(defimplementation doze-in-repl () - (setq *inferior-lisp-sleeping-post* (mt:make-semaphore)) - ;;(loop (sleep 1)) - (mt:semaphore-wait *inferior-lisp-sleeping-post*) - (mk-ext:quit :verbose t) - ) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/rpc.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/rpc.lisp deleted file mode 100644 index e30cc2c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/rpc.lisp +++ /dev/null @@ -1,162 +0,0 @@ -;;; -*- indent-tabs-mode: nil; coding: latin-1-unix -*- -;;; -;;; swank-rpc.lisp -- Pass remote calls and responses between lisp systems. -;;; -;;; Created 2010, Terje Norderhaug -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -(in-package swank/rpc) - - -;;;;; Input - -(define-condition swank-reader-error (reader-error) - ((packet :type string :initarg :packet - :reader swank-reader-error.packet) - (cause :type reader-error :initarg :cause - :reader swank-reader-error.cause))) - -(defun read-message (stream package) - (let ((packet (read-packet stream))) - (handler-case (values (read-form packet package)) - (reader-error (c) - (error 'swank-reader-error - :packet packet :cause c))))) - -(defun read-packet (stream) - (let* ((length (parse-header stream)) - (octets (read-chunk stream length))) - (handler-case (swank/backend:utf8-to-string octets) - (error (c) - (error 'swank-reader-error - :packet (asciify octets) - :cause c))))) - -(defun asciify (packet) - (with-output-to-string (*standard-output*) - (loop for code across (etypecase packet - (string (map 'vector #'char-code packet)) - (vector packet)) - do (cond ((<= code #x7f) (write-char (code-char code))) - (t (format t "\\x~x" code)))))) - -(defun parse-header (stream) - (parse-integer (map 'string #'code-char (read-chunk stream 6)) - :radix 16)) - -(defun read-chunk (stream length) - (let* ((buffer (make-array length :element-type '(unsigned-byte 8))) - (count (read-sequence buffer stream))) - (cond ((= count length) - buffer) - ((zerop count) - (error 'end-of-file :stream stream)) - (t - (error "Short read: length=~D count=~D" length count))))) - -(defparameter *validate-input* nil - "Set to true to require input that more strictly conforms to the protocol") - -(defun read-form (string package) - (with-standard-io-syntax - (let ((*package* package)) - (if *validate-input* - (validating-read string) - (read-from-string string))))) - -(defun validating-read (string) - (with-input-from-string (*standard-input* string) - (simple-read))) - -(defun simple-read () - "Read a form that conforms to the protocol, otherwise signal an error." - (let ((c (read-char))) - (case c - (#\( (loop collect (simple-read) - while (ecase (read-char) - (#\) nil) - (#\space t)))) - (#\' `(quote ,(simple-read))) - (t - (cond - ((digit-char-p c) - (parse-integer - (map 'simple-string #'identity - (loop for ch = c then (read-char nil nil) - while (and ch (digit-char-p ch)) - collect ch - finally (unread-char ch))))) - ((or (member c '(#\: #\")) (alpha-char-p c)) - (unread-char c) - (read-preserving-whitespace)) - (t (error "Invalid character ~:c" c))))))) - - -;;;;; Output - -(defun write-message (message package stream) - (let* ((string (prin1-to-string-for-emacs message package)) - (octets (handler-case (swank/backend:string-to-utf8 string) - (error (c) (encoding-error c string)))) - (length (length octets))) - (write-header stream length) - (write-sequence octets stream) - (finish-output stream))) - -;; FIXME: for now just tell emacs that we and an encoding problem. -(defun encoding-error (condition string) - (swank/backend:string-to-utf8 - (prin1-to-string-for-emacs - `(:reader-error - ,(asciify string) - ,(format nil "Error during string-to-utf8: ~a" - (or (ignore-errors (asciify (princ-to-string condition))) - (asciify (princ-to-string (type-of condition)))))) - (find-package :cl)))) - -(defun write-header (stream length) - (declare (type (unsigned-byte 24) length)) - ;;(format *trace-output* "length: ~d (#x~x)~%" length length) - (loop for c across (format nil "~6,'0x" length) - do (write-byte (char-code c) stream))) - -(defun switch-to-double-floats (x) - (typecase x - (double-float x) - (float (coerce x 'double-float)) - (null x) - (list (loop for (x . cdr) on x - collect (switch-to-double-floats x) into result - until (atom cdr) - finally (return (append result (switch-to-double-floats cdr))))) - (t x))) - -(defun prin1-to-string-for-emacs (object package) - (with-standard-io-syntax - (let ((*print-case* :downcase) - (*print-readably* nil) - (*print-pretty* nil) - (*package* package) - ;; Emacs has only double floats. - (*read-default-float-format* 'double-float)) - (prin1-to-string (switch-to-double-floats object))))) - - -#| TEST/DEMO: - -(defparameter *transport* - (with-output-to-string (out) - (write-message '(:message (hello "world")) *package* out) - (write-message '(:return 5) *package* out) - (write-message '(:emacs-rex NIL) *package* out))) - -*transport* - -(with-input-from-string (in *transport*) - (loop while (peek-char T in NIL) - collect (read-message in *package*))) - -|# diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/sbcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/sbcl.lisp deleted file mode 100644 index 430c906..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/sbcl.lisp +++ /dev/null @@ -1,2025 +0,0 @@ -;;;;; -*- indent-tabs-mode: nil -*- -;;; -;;; swank-sbcl.lisp --- SLIME backend for SBCL. -;;; -;;; Created 2003, Daniel Barlow -;;; -;;; This code has been placed in the Public Domain. All warranties are -;;; disclaimed. - -;;; Requires the SB-INTROSPECT contrib. - -;;; Administrivia - -(defpackage swank/sbcl - (:use cl swank/backend swank/source-path-parser swank/source-file-cache)) - -(in-package swank/sbcl) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (require 'sb-bsd-sockets) - (require 'sb-introspect) - (require 'sb-posix) - (require 'sb-cltl2)) - -(declaim (optimize (debug 2) - (sb-c::insert-step-conditions 0) - (sb-c::insert-debug-catch 0))) - -;;; backwards compability tests - -(eval-when (:compile-toplevel :load-toplevel :execute) - ;; Generate a form suitable for testing for stepper support (0.9.17) - ;; with #+. - (defun sbcl-with-new-stepper-p () - (with-symbol 'enable-stepping 'sb-impl)) - ;; Ditto for weak hash-tables - (defun sbcl-with-weak-hash-tables () - (with-symbol 'hash-table-weakness 'sb-ext)) - ;; And for xref support (1.0.1) - (defun sbcl-with-xref-p () - (with-symbol 'who-calls 'sb-introspect)) - ;; ... for restart-frame support (1.0.2) - (defun sbcl-with-restart-frame () - (with-symbol 'frame-has-debug-tag-p 'sb-debug)) - ;; ... for :setf :inverse info (1.1.17) - (defun sbcl-with-setf-inverse-meta-info () - (boolean-to-feature-expression - ;; going through FIND-SYMBOL since META-INFO was renamed from - ;; TYPE-INFO in 1.2.10. - (let ((sym (find-symbol "META-INFO" "SB-C"))) - (and sym - (fboundp sym) - (funcall sym :setf :inverse ())))))) - -;;; swank-mop - -(import-swank-mop-symbols :sb-mop '(:slot-definition-documentation)) - -(defun swank-mop:slot-definition-documentation (slot) - (sb-pcl::documentation slot t)) - -;; stream support - -(defimplementation gray-package-name () - "SB-GRAY") - -;; Pretty printer calls this, apparently -(defmethod sb-gray:stream-line-length - ((s sb-gray:fundamental-character-input-stream)) - nil) - -;;; Connection info - -(defimplementation lisp-implementation-type-name () - "sbcl") - -;; Declare return type explicitly to shut up STYLE-WARNINGS about -;; %SAP-ALIEN in ENABLE-SIGIO-ON-FD below. -(declaim (ftype (function () (values (signed-byte 32) &optional)) getpid)) -(defimplementation getpid () - (sb-posix:getpid)) - -;;; UTF8 - -(defimplementation string-to-utf8 (string) - (sb-ext:string-to-octets string :external-format :utf8)) - -(defimplementation utf8-to-string (octets) - (sb-ext:octets-to-string octets :external-format :utf8)) - -;;; TCP Server - -(defimplementation preferred-communication-style () - (cond - ;; fixme: when SBCL/win32 gains better select() support, remove - ;; this. - ((member :sb-thread *features*) :spawn) - ((member :win32 *features*) nil) - (t :fd-handler))) - - -(defun resolve-hostname (host) - "Returns valid IPv4 or IPv6 address for the host." - ;; get all IPv4 and IPv6 addresses as a list - (let* ((host-ents (multiple-value-list (sb-bsd-sockets:get-host-by-name host))) - ;; remove protocols for which we don't have an address - (addresses (remove-if-not #'sb-bsd-sockets:host-ent-address host-ents))) - ;; Return the first one or nil, - ;; but actually, it shouln't return nil, because - ;; get-host-by-name will signal NAME-SERVICE-ERROR condition - ;; if there isn't any address for the host. - (first addresses))) - - -(defimplementation create-socket (host port &key backlog) - (let* ((host-ent (resolve-hostname host)) - (socket (make-instance (cond #+#.(swank/backend:with-symbol 'inet6-socket 'sb-bsd-sockets) - ((eql (sb-bsd-sockets:host-ent-address-type host-ent) 10) - 'sb-bsd-sockets:inet6-socket) - (t - 'sb-bsd-sockets:inet-socket)) - :type :stream - :protocol :tcp))) - (setf (sb-bsd-sockets:sockopt-reuse-address socket) t) - (sb-bsd-sockets:socket-bind socket (sb-bsd-sockets:host-ent-address host-ent) port) - - (sb-bsd-sockets:socket-listen socket (or backlog 5)) - socket)) - -(defimplementation local-port (socket) - (nth-value 1 (sb-bsd-sockets:socket-name socket))) - -(defimplementation close-socket (socket) - (sb-sys:invalidate-descriptor (socket-fd socket)) - (sb-bsd-sockets:socket-close socket)) - -(defimplementation accept-connection (socket &key - external-format - buffering timeout) - (declare (ignore timeout)) - (make-socket-io-stream (accept socket) external-format - (ecase buffering - ((t :full) :full) - ((nil :none) :none) - ((:line) :line)))) - - -;; The SIGIO stuff should probably be removed as it's unlikey that -;; anybody uses it. -#-win32 -(progn - (defimplementation install-sigint-handler (function) - (sb-sys:enable-interrupt sb-unix:sigint - (lambda (&rest args) - (declare (ignore args)) - (sb-sys:invoke-interruption - (lambda () - (sb-sys:with-interrupts - (funcall function))))))) - - (defvar *sigio-handlers* '() - "List of (key . fn) pairs to be called on SIGIO.") - - (defun sigio-handler (signal code scp) - (declare (ignore signal code scp)) - (sb-sys:with-interrupts - (mapc (lambda (handler) - (funcall (the function (cdr handler)))) - *sigio-handlers*))) - - (defun set-sigio-handler () - (sb-sys:enable-interrupt sb-unix:sigio #'sigio-handler)) - - (defun enable-sigio-on-fd (fd) - (sb-posix::fcntl fd sb-posix::f-setfl sb-posix::o-async) - (sb-posix::fcntl fd sb-posix::f-setown (getpid)) - (values)) - - (defimplementation add-sigio-handler (socket fn) - (set-sigio-handler) - (let ((fd (socket-fd socket))) - (enable-sigio-on-fd fd) - (push (cons fd fn) *sigio-handlers*))) - - (defimplementation remove-sigio-handlers (socket) - (let ((fd (socket-fd socket))) - (setf *sigio-handlers* (delete fd *sigio-handlers* :key #'car)) - (sb-sys:invalidate-descriptor fd)) - (close socket))) - - -(defimplementation add-fd-handler (socket fun) - (let ((fd (socket-fd socket)) - (handler nil)) - (labels ((add () - (setq handler (sb-sys:add-fd-handler fd :input #'run))) - (run (fd) - (sb-sys:remove-fd-handler handler) ; prevent recursion - (unwind-protect - (funcall fun) - (when (sb-unix:unix-fstat fd) ; still open? - (add))))) - (add)))) - -(defimplementation remove-fd-handlers (socket) - (sb-sys:invalidate-descriptor (socket-fd socket))) - -(defimplementation socket-fd (socket) - (etypecase socket - (fixnum socket) - (sb-bsd-sockets:socket (sb-bsd-sockets:socket-file-descriptor socket)) - (file-stream (sb-sys:fd-stream-fd socket)))) - -(defimplementation command-line-args () - sb-ext:*posix-argv*) - -(defimplementation dup (fd) - (sb-posix:dup fd)) - -(defvar *wait-for-input-called*) - -(defimplementation wait-for-input (streams &optional timeout) - (assert (member timeout '(nil t))) - (when (boundp '*wait-for-input-called*) - (setq *wait-for-input-called* t)) - (let ((*wait-for-input-called* nil)) - (loop - (let ((ready (remove-if-not #'input-ready-p streams))) - (when ready (return ready))) - (when (check-slime-interrupts) - (return :interrupt)) - (when *wait-for-input-called* - (return :interrupt)) - (when timeout - (return nil)) - (sleep 0.1)))) - -(defun fd-stream-input-buffer-empty-p (stream) - (let ((buffer (sb-impl::fd-stream-ibuf stream))) - (or (not buffer) - (= (sb-impl::buffer-head buffer) - (sb-impl::buffer-tail buffer))))) - -#-win32 -(defun input-ready-p (stream) - (or (not (fd-stream-input-buffer-empty-p stream)) - #+#.(swank/backend:with-symbol 'fd-stream-fd-type 'sb-impl) - (eq :regular (sb-impl::fd-stream-fd-type stream)) - (not (sb-impl::sysread-may-block-p stream)))) - -#+win32 -(progn - (defun input-ready-p (stream) - (or (not (fd-stream-input-buffer-empty-p stream)) - (handle-listen (sockint::fd->handle (sb-impl::fd-stream-fd stream))))) - - (sb-alien:define-alien-routine ("WSACreateEvent" wsa-create-event) - sb-win32:handle) - - (sb-alien:define-alien-routine ("WSACloseEvent" wsa-close-event) - sb-alien:int - (event sb-win32:handle)) - - (defconstant +fd-read+ #.(ash 1 0)) - (defconstant +fd-close+ #.(ash 1 5)) - - (sb-alien:define-alien-routine ("WSAEventSelect" wsa-event-select) - sb-alien:int - (fd sb-alien:int) - (handle sb-win32:handle) - (mask sb-alien:long)) - - (sb-alien:load-shared-object "kernel32.dll") - (sb-alien:define-alien-routine ("WaitForSingleObjectEx" - wait-for-single-object-ex) - sb-alien:int - (event sb-win32:handle) - (milliseconds sb-alien:long) - (alertable sb-alien:int)) - - ;; see SB-WIN32:HANDLE-LISTEN - (defun handle-listen (handle) - (sb-alien:with-alien ((avail sb-win32:dword) - (buf (array char #.sb-win32::input-record-size))) - (unless (zerop (sb-win32:peek-named-pipe handle nil 0 nil - (sb-alien:alien-sap - (sb-alien:addr avail)) - nil)) - (return-from handle-listen (plusp avail))) - - (unless (zerop (sb-win32:peek-console-input handle - (sb-alien:alien-sap buf) - sb-win32::input-record-size - (sb-alien:alien-sap - (sb-alien:addr avail)))) - (return-from handle-listen (plusp avail)))) - - (let ((event (wsa-create-event))) - (wsa-event-select handle event (logior +fd-read+ +fd-close+)) - (let ((val (wait-for-single-object-ex event 0 0))) - (wsa-close-event event) - (unless (= val -1) - (return-from handle-listen (zerop val))))) - - nil) - - ) - -(defvar *external-format-to-coding-system* - '((:iso-8859-1 - "latin-1" "latin-1-unix" "iso-latin-1-unix" - "iso-8859-1" "iso-8859-1-unix") - (:utf-8 "utf-8" "utf-8-unix") - (:euc-jp "euc-jp" "euc-jp-unix") - (:us-ascii "us-ascii" "us-ascii-unix"))) - -;; C.f. R.M.Kreuter in <20536.1219412774@progn.net> on sbcl-general, -;; 2008-08-22. -(defvar *physical-pathname-host* (pathname-host (user-homedir-pathname))) - -(defimplementation filename-to-pathname (filename) - (sb-ext:parse-native-namestring filename *physical-pathname-host*)) - -(defimplementation find-external-format (coding-system) - (car (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*))) - -(defimplementation set-default-directory (directory) - (let ((directory (truename (merge-pathnames directory)))) - (sb-posix:chdir directory) - (setf *default-pathname-defaults* directory) - (default-directory))) - -(defun make-socket-io-stream (socket external-format buffering) - (let ((args `(:output t - :input t - :element-type ,(if external-format - 'character - '(unsigned-byte 8)) - :buffering ,buffering - ,@(cond ((and external-format (sb-int:featurep :sb-unicode)) - `(:external-format ,external-format)) - (t '())) - :serve-events ,(eq :fd-handler swank:*communication-style*) - ;; SBCL < 1.0.42.43 doesn't support :SERVE-EVENTS - ;; argument. - :allow-other-keys t))) - (apply #'sb-bsd-sockets:socket-make-stream socket args))) - -(defun accept (socket) - "Like socket-accept, but retry on EAGAIN." - (loop (handler-case - (return (sb-bsd-sockets:socket-accept socket)) - (sb-bsd-sockets:interrupted-error ())))) - - -;;;; Support for SBCL syntax - -;;; SBCL's source code is riddled with #! reader macros. Also symbols -;;; containing `!' have special meaning. We have to work long and -;;; hard to be able to read the source. To deal with #! reader -;;; macros, we use a special readtable. The special symbols are -;;; converted by a condition handler. - -(defun feature-in-list-p (feature list) - (etypecase feature - (symbol (member feature list :test #'eq)) - (cons (flet ((subfeature-in-list-p (subfeature) - (feature-in-list-p subfeature list))) - ;; Don't use ECASE since SBCL also has :host-feature, - ;; don't need to handle it or anything else appearing in - ;; the future or in erronous code. - (case (first feature) - (:or (some #'subfeature-in-list-p (rest feature))) - (:and (every #'subfeature-in-list-p (rest feature))) - (:not (destructuring-bind (e) (cdr feature) - (not (subfeature-in-list-p e))))))))) - -(defun shebang-reader (stream sub-character infix-parameter) - (declare (ignore sub-character)) - (when infix-parameter - (error "illegal read syntax: #~D!" infix-parameter)) - (let ((next-char (read-char stream))) - (unless (find next-char "+-") - (error "illegal read syntax: #!~C" next-char)) - ;; When test is not satisfied - ;; FIXME: clearer if order of NOT-P and (NOT NOT-P) were reversed? then - ;; would become "unless test is satisfied".. - (when (let* ((*package* (find-package "KEYWORD")) - (*read-suppress* nil) - (not-p (char= next-char #\-)) - (feature (read stream))) - (if (feature-in-list-p feature *features*) - not-p - (not not-p))) - ;; Read (and discard) a form from input. - (let ((*read-suppress* t)) - (read stream t nil t)))) - (values)) - -(defvar *shebang-readtable* - (let ((*readtable* (copy-readtable nil))) - (set-dispatch-macro-character #\# #\! - (lambda (s c n) (shebang-reader s c n)) - *readtable*) - *readtable*)) - -(defun shebang-readtable () - *shebang-readtable*) - -(defun sbcl-package-p (package) - (let ((name (package-name package))) - (eql (mismatch "SB-" name) 3))) - -(defun sbcl-source-file-p (filename) - (when filename - (loop for (nil pattern) in (logical-pathname-translations "SYS") - thereis (pathname-match-p filename pattern)))) - -(defun guess-readtable-for-filename (filename) - (if (sbcl-source-file-p filename) - (shebang-readtable) - *readtable*)) - -(defvar *debootstrap-packages* t) - -(defun call-with-debootstrapping (fun) - (handler-bind ((sb-int:bootstrap-package-not-found - #'sb-int:debootstrap-package)) - (funcall fun))) - -(defmacro with-debootstrapping (&body body) - `(call-with-debootstrapping (lambda () ,@body))) - -(defimplementation call-with-syntax-hooks (fn) - (cond ((and *debootstrap-packages* - (sbcl-package-p *package*)) - (with-debootstrapping (funcall fn))) - (t - (funcall fn)))) - -(defimplementation default-readtable-alist () - (let ((readtable (shebang-readtable))) - (loop for p in (remove-if-not #'sbcl-package-p (list-all-packages)) - collect (cons (package-name p) readtable)))) - -;;; Packages - -#+#.(swank/backend:with-symbol 'package-local-nicknames 'sb-ext) -(defimplementation package-local-nicknames (package) - (sb-ext:package-local-nicknames package)) - -;;; Utilities - -#+#.(swank/backend:with-symbol 'function-lambda-list 'sb-introspect) -(defimplementation arglist (fname) - (sb-introspect:function-lambda-list fname)) - -#-#.(swank/backend:with-symbol 'function-lambda-list 'sb-introspect) -(defimplementation arglist (fname) - (sb-introspect:function-arglist fname)) - -(defimplementation function-name (f) - (check-type f function) - (sb-impl::%fun-name f)) - -(defmethod declaration-arglist ((decl-identifier (eql 'optimize))) - (flet ((ensure-list (thing) (if (listp thing) thing (list thing)))) - (let* ((flags (sb-cltl2:declaration-information decl-identifier))) - (if flags - ;; Symbols aren't printed with package qualifiers, but the - ;; FLAGS would have to be fully qualified when used inside a - ;; declaration. So we strip those as long as there's no - ;; better way. (FIXME) - `(&any ,@(remove-if-not - #'(lambda (qualifier) - (find-symbol (symbol-name (first qualifier)) :cl)) - flags :key #'ensure-list)) - (call-next-method))))) - -#+#.(swank/backend:with-symbol 'deftype-lambda-list 'sb-introspect) -(defmethod type-specifier-arglist :around (typespec-operator) - (multiple-value-bind (arglist foundp) - (sb-introspect:deftype-lambda-list typespec-operator) - (if foundp arglist (call-next-method)))) - -(defimplementation type-specifier-p (symbol) - (or (sb-ext:valid-type-specifier-p symbol) - (not (eq (type-specifier-arglist symbol) :not-available)))) - -(defvar *buffer-name* nil) -(defvar *buffer-tmpfile* nil) -(defvar *buffer-offset*) -(defvar *buffer-substring* nil) - -(defvar *previous-compiler-condition* nil - "Used to detect duplicates.") - -(defun handle-notification-condition (condition) - "Handle a condition caused by a compiler warning. -This traps all compiler conditions at a lower-level than using -C:*COMPILER-NOTIFICATION-FUNCTION*. The advantage is that we get to -craft our own error messages, which can omit a lot of redundant -information." - (unless (or (eq condition *previous-compiler-condition*)) - ;; First resignal warnings, so that outer handlers -- which may choose to - ;; muffle this -- get a chance to run. - (when (typep condition 'warning) - (signal condition)) - (setq *previous-compiler-condition* condition) - (signal-compiler-condition (real-condition condition) - (sb-c::find-error-context nil)))) - -(defun signal-compiler-condition (condition context) - (signal 'compiler-condition - :original-condition condition - :severity (etypecase condition - (sb-ext:compiler-note :note) - (sb-c:compiler-error :error) - (reader-error :read-error) - (error :error) - #+#.(swank/backend:with-symbol early-deprecation-warning sb-ext) - (sb-ext::early-deprecation-warning :early-deprecation-warning) - #+#.(swank/backend:with-symbol late-deprecation-warning sb-ext) - (sb-ext::late-deprecation-warning :late-deprecation-warning) - #+#.(swank/backend:with-symbol final-deprecation-warning sb-ext) - (sb-ext::final-deprecation-warning :final-deprecation-warning) - #+#.(swank/backend:with-symbol redefinition-warning - sb-kernel) - (sb-kernel:redefinition-warning - :redefinition) - (style-warning :style-warning) - (warning :warning)) - :references (condition-references condition) - :message (brief-compiler-message-for-emacs condition) - :source-context (compiler-error-context context) - :location (compiler-note-location condition context))) - -(defun real-condition (condition) - "Return the encapsulated condition or CONDITION itself." - (typecase condition - (sb-int:encapsulated-condition (sb-int:encapsulated-condition condition)) - (t condition))) - -(defun condition-references (condition) - (if (typep condition 'sb-int:reference-condition) - (externalize-reference - (sb-int:reference-condition-references condition)))) - -(defun compiler-note-location (condition context) - (flet ((bailout () - (return-from compiler-note-location - (make-error-location "No error location available")))) - (cond (context - (locate-compiler-note - (sb-c::compiler-error-context-file-name context) - (compiler-source-path context) - (sb-c::compiler-error-context-original-source context))) - ((typep condition 'reader-error) - (let* ((stream (stream-error-stream condition)) - (file (pathname stream))) - (unless (open-stream-p stream) - (bailout)) - (if (compiling-from-buffer-p file) - ;; The stream position for e.g. "comma not inside - ;; backquote" is at the character following the - ;; comma, :offset is 0-based, hence the 1-. - (make-location (list :buffer *buffer-name*) - (list :offset *buffer-offset* - (1- (file-position stream)))) - (progn - (assert (compiling-from-file-p file)) - ;; No 1- because :position is 1-based. - (make-location (list :file (namestring file)) - (list :position (file-position stream))))))) - (t (bailout))))) - -(defun compiling-from-buffer-p (filename) - (and *buffer-name* - ;; The following is to trigger COMPILING-FROM-GENERATED-CODE-P - ;; in LOCATE-COMPILER-NOTE, and allows handling nested - ;; compilation from eg. hitting C-C on (eval-when ... (require ..))). - ;; - ;; PROBE-FILE to handle tempfile directory being a symlink. - (pathnamep filename) - (let ((true1 (probe-file filename)) - (true2 (probe-file *buffer-tmpfile*))) - (and true1 (equal true1 true2))))) - -(defun compiling-from-file-p (filename) - (and (pathnamep filename) - (or (null *buffer-name*) - (null *buffer-tmpfile*) - (let ((true1 (probe-file filename)) - (true2 (probe-file *buffer-tmpfile*))) - (not (and true1 (equal true1 true2))))))) - -(defun compiling-from-generated-code-p (filename source) - (and (eq filename :lisp) (stringp source))) - -(defun locate-compiler-note (file source-path source) - (cond ((compiling-from-buffer-p file) - (make-location (list :buffer *buffer-name*) - (list :offset *buffer-offset* - (source-path-string-position - source-path *buffer-substring*)))) - ((compiling-from-file-p file) - (let ((position (source-path-file-position source-path file))) - (make-location (list :file (namestring file)) - (list :position (and position - (1+ position)))))) - ((compiling-from-generated-code-p file source) - (make-location (list :source-form source) - (list :position 1))) - (t - (error "unhandled case in compiler note ~S ~S ~S" - file source-path source)))) - -(defun brief-compiler-message-for-emacs (condition) - "Briefly describe a compiler error for Emacs. -When Emacs presents the message it already has the source popped up -and the source form highlighted. This makes much of the information in -the error-context redundant." - (let ((sb-int:*print-condition-references* nil)) - (princ-to-string condition))) - -(defun compiler-error-context (error-context) - "Describe a compiler error for Emacs including context information." - (declare (type (or sb-c::compiler-error-context null) error-context)) - (multiple-value-bind (enclosing source) - (if error-context - (values (sb-c::compiler-error-context-enclosing-source error-context) - (sb-c::compiler-error-context-source error-context))) - (and (or enclosing source) - (format nil "~@[--> ~{~<~%--> ~1:;~A~> ~}~%~]~@[~{==>~%~A~%~}~]" - enclosing source)))) - -(defun compiler-source-path (context) - "Return the source-path for the current compiler error. -Returns NIL if this cannot be determined by examining internal -compiler state." - (cond ((sb-c::node-p context) - (reverse - (sb-c::source-path-original-source - (sb-c::node-source-path context)))) - ((sb-c::compiler-error-context-p context) - (reverse - (sb-c::compiler-error-context-original-source-path context))))) - -(defimplementation call-with-compilation-hooks (function) - (declare (type function function)) - (handler-bind - ;; N.B. Even though these handlers are called HANDLE-FOO they - ;; actually decline, i.e. the signalling of the original - ;; condition continues upward. - ((sb-c:fatal-compiler-error #'handle-notification-condition) - (sb-c:compiler-error #'handle-notification-condition) - (sb-ext:compiler-note #'handle-notification-condition) - (error #'handle-notification-condition) - (warning #'handle-notification-condition)) - (funcall function))) - -;;; HACK: SBCL 1.2.12 shipped with a bug where -;;; SB-EXT:RESTRICT-COMPILER-POLICY would signal an error when there -;;; were no policy restrictions in place. This workaround ensures the -;;; existence of at least one dummy restriction. -(handler-case (sb-ext:restrict-compiler-policy) - (error () (sb-ext:restrict-compiler-policy 'debug))) - -(defun compiler-policy (qualities) - "Return compiler policy qualities present in the QUALITIES alist. -QUALITIES is an alist with (quality . value)" - #+#.(swank/backend:with-symbol 'restrict-compiler-policy 'sb-ext) - (loop with policy = (sb-ext:restrict-compiler-policy) - for (quality) in qualities - collect (cons quality - (or (cdr (assoc quality policy)) - 0)))) - -(defun (setf compiler-policy) (policy) - (declare (ignorable policy)) - #+#.(swank/backend:with-symbol 'restrict-compiler-policy 'sb-ext) - (loop for (qual . value) in policy - do (sb-ext:restrict-compiler-policy qual value))) - -(defmacro with-compiler-policy (policy &body body) - (let ((current-policy (gensym))) - `(let ((,current-policy (compiler-policy ,policy))) - (setf (compiler-policy) ,policy) - (unwind-protect (progn ,@body) - (setf (compiler-policy) ,current-policy))))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (multiple-value-bind (output-file warnings-p failure-p) - (with-compiler-policy policy - (with-compilation-hooks () - (compile-file input-file :output-file output-file - :external-format external-format))) - (values output-file warnings-p - (or failure-p - (when load-p - ;; Cache the latest source file for definition-finding. - (source-cache-get input-file - (file-write-date input-file)) - (not (load output-file))))))) - -;;;; compile-string - -;;; We copy the string to a temporary file in order to get adequate -;;; semantics for :COMPILE-TOPLEVEL and :LOAD-TOPLEVEL EVAL-WHEN forms -;;; which the previous approach using -;;; (compile nil `(lambda () ,(read-from-string string))) -;;; did not provide. - -(locally (declare (sb-ext:muffle-conditions sb-ext:compiler-note)) - -(sb-alien:define-alien-routine (#-win32 "tempnam" #+win32 "_tempnam" tempnam) - sb-alien:c-string - (dir sb-alien:c-string) - (prefix sb-alien:c-string))) - -(defun temp-file-name () - "Return a temporary file name to compile strings into." - (tempnam nil "slime")) - -(defvar *trap-load-time-warnings* t) - -(defimplementation swank-compile-string (string &key buffer position filename - policy) - (let ((*buffer-name* buffer) - (*buffer-offset* position) - (*buffer-substring* string) - (*buffer-tmpfile* (temp-file-name))) - (labels ((load-it (filename) - (cond (*trap-load-time-warnings* - (with-compilation-hooks () (load filename))) - (t (load filename)))) - (cf () - (with-compiler-policy policy - (with-compilation-unit - (:source-plist (list :emacs-buffer buffer - :emacs-filename filename - :emacs-package (package-name *package*) - :emacs-position position - :emacs-string string) - :source-namestring filename - :allow-other-keys t) - (compile-file *buffer-tmpfile* :external-format :utf-8))))) - (with-open-file (s *buffer-tmpfile* :direction :output :if-exists :error - :external-format :utf-8) - (write-string string s)) - (unwind-protect - (multiple-value-bind (output-file warningsp failurep) - (with-compilation-hooks () (cf)) - (declare (ignore warningsp)) - (when output-file - (load-it output-file)) - (not failurep)) - (ignore-errors - (delete-file *buffer-tmpfile*) - (delete-file (compile-file-pathname *buffer-tmpfile*))))))) - -;;;; Definitions - -(defparameter *definition-types* - '(:variable defvar - :constant defconstant - :type deftype - :symbol-macro define-symbol-macro - :macro defmacro - :compiler-macro define-compiler-macro - :function defun - :generic-function defgeneric - :method defmethod - :setf-expander define-setf-expander - :structure defstruct - :condition define-condition - :class defclass - :method-combination define-method-combination - :package defpackage - :transform :deftransform - :optimizer :defoptimizer - :vop :define-vop - :source-transform :define-source-transform - :ir1-convert :def-ir1-translator - :declaration declaim - :alien-type :define-alien-type) - "Map SB-INTROSPECT definition type names to Slime-friendly forms") - -(defun definition-specifier (type) - "Return a pretty specifier for NAME representing a definition of type TYPE." - (getf *definition-types* type)) - -(defun make-dspec (type name source-location) - (list* (definition-specifier type) - name - (sb-introspect::definition-source-description source-location))) - -(defimplementation find-definitions (name) - (loop for type in *definition-types* by #'cddr - for defsrcs = (sb-introspect:find-definition-sources-by-name name type) - append (loop for defsrc in defsrcs collect - (list (make-dspec type name defsrc) - (converting-errors-to-error-location - (definition-source-for-emacs defsrc - type name)))))) - -(defimplementation find-source-location (obj) - (flet ((general-type-of (obj) - (typecase obj - (method :method) - (generic-function :generic-function) - (function :function) - (structure-class :structure-class) - (class :class) - (method-combination :method-combination) - (package :package) - (condition :condition) - (structure-object :structure-object) - (standard-object :standard-object) - (t :thing))) - (to-string (obj) - (typecase obj - ;; Packages are possibly named entities. - (package (princ-to-string obj)) - ((or structure-object standard-object condition) - (with-output-to-string (s) - (print-unreadable-object (obj s :type t :identity t)))) - (t (princ-to-string obj))))) - (converting-errors-to-error-location - (let ((defsrc (sb-introspect:find-definition-source obj))) - (definition-source-for-emacs defsrc - (general-type-of obj) - (to-string obj)))))) - -(defmacro with-definition-source ((&rest names) obj &body body) - "Like with-slots but works only for structs." - (flet ((reader (slot) - ;; Use read-from-string instead of intern so that - ;; conc-name can be a string such as ext:struct- and not - ;; cause errors and not force interning ext::struct- - (read-from-string - (concatenate 'string "sb-introspect:definition-source-" - (string slot))))) - (let ((tmp (gensym "OO-"))) - ` (let ((,tmp ,obj)) - (symbol-macrolet - ,(loop for name in names collect - (typecase name - (symbol `(,name (,(reader name) ,tmp))) - (cons `(,(first name) (,(reader (second name)) ,tmp))) - (t (error "Malformed syntax in WITH-STRUCT: ~A" name)))) - ,@body))))) - -(defun categorize-definition-source (definition-source) - (with-definition-source (pathname form-path character-offset plist) - definition-source - (let ((file-p (and pathname (probe-file pathname) - (or form-path character-offset)))) - (cond ((and (getf plist :emacs-buffer) file-p) :buffer-and-file) - ((getf plist :emacs-buffer) :buffer) - (file-p :file) - (pathname :file-without-position) - (t :invalid))))) - -#+#.(swank/backend:with-symbol 'definition-source-form-number 'sb-introspect) -(defun form-number-position (definition-source stream) - (let* ((tlf-number (car (sb-introspect:definition-source-form-path definition-source))) - (form-number (sb-introspect:definition-source-form-number definition-source))) - (multiple-value-bind (tlf pos-map) (read-source-form tlf-number stream) - (let* ((path-table (sb-di::form-number-translations tlf 0)) - (path (cond ((<= (length path-table) form-number) - (warn "inconsistent form-number-translations") - (list 0)) - (t - (reverse (cdr (aref path-table form-number))))))) - (source-path-source-position path tlf pos-map))))) - -#+#.(swank/backend:with-symbol 'definition-source-form-number 'sb-introspect) -(defun file-form-number-position (definition-source) - (let* ((code-date (sb-introspect:definition-source-file-write-date definition-source)) - (filename (sb-introspect:definition-source-pathname definition-source)) - (*readtable* (guess-readtable-for-filename filename)) - (source-code (get-source-code filename code-date))) - (with-debootstrapping - (with-input-from-string (s source-code) - (form-number-position definition-source s))))) - -#+#.(swank/backend:with-symbol 'definition-source-form-number 'sb-introspect) -(defun string-form-number-position (definition-source string) - (with-input-from-string (s string) - (form-number-position definition-source s))) - -(defun definition-source-buffer-location (definition-source) - (with-definition-source (form-path character-offset plist) definition-source - (destructuring-bind (&key emacs-buffer emacs-position emacs-directory - emacs-string &allow-other-keys) - plist - (let ((*readtable* (guess-readtable-for-filename emacs-directory)) - start - end) - (with-debootstrapping - (or - (and form-path - (or - #+#.(swank/backend:with-symbol 'definition-source-form-number 'sb-introspect) - (setf (values start end) - (and (sb-introspect:definition-source-form-number definition-source) - (string-form-number-position definition-source emacs-string))) - (setf (values start end) - (source-path-string-position form-path emacs-string)))) - (setf start character-offset - end most-positive-fixnum))) - (make-location - `(:buffer ,emacs-buffer) - `(:offset ,emacs-position ,start) - `(:snippet - ,(subseq emacs-string - start - (min end (+ start *source-snippet-size*))))))))) - -(defun definition-source-file-location (definition-source) - (with-definition-source (pathname form-path character-offset plist - file-write-date) definition-source - (let* ((namestring (namestring (translate-logical-pathname pathname))) - (pos (or (and form-path - (or - #+#.(swank/backend:with-symbol 'definition-source-form-number 'sb-introspect) - (and (sb-introspect:definition-source-form-number definition-source) - (ignore-errors (file-form-number-position definition-source))) - (ignore-errors - (source-file-position namestring file-write-date - form-path)))) - character-offset)) - (snippet (source-hint-snippet namestring file-write-date pos))) - (make-location `(:file ,namestring) - ;; /file positions/ in Common Lisp start from - ;; 0, buffer positions in Emacs start from 1. - `(:position ,(1+ pos)) - `(:snippet ,snippet))))) - -(defun definition-source-buffer-and-file-location (definition-source) - (let ((buffer (definition-source-buffer-location definition-source))) - (make-location (list :buffer-and-file - (cadr (location-buffer buffer)) - (namestring (sb-introspect:definition-source-pathname - definition-source))) - (location-position buffer) - (location-hints buffer)))) - -(defun definition-source-for-emacs (definition-source type name) - (with-definition-source (pathname form-path character-offset plist - file-write-date) - definition-source - (ecase (categorize-definition-source definition-source) - (:buffer-and-file - (definition-source-buffer-and-file-location definition-source)) - (:buffer - (definition-source-buffer-location definition-source)) - (:file - (definition-source-file-location definition-source)) - (:file-without-position - (make-location `(:file ,(namestring - (translate-logical-pathname pathname))) - '(:position 1) - (when (eql type :function) - `(:snippet ,(format nil "(defun ~a " - (symbol-name name)))))) - (:invalid - (error "DEFINITION-SOURCE of ~(~A~) ~A did not contain ~ - meaningful information." - type name))))) - -(defun source-file-position (filename write-date form-path) - (let ((source (get-source-code filename write-date)) - (*readtable* (guess-readtable-for-filename filename))) - (with-debootstrapping - (source-path-string-position form-path source)))) - -(defun source-hint-snippet (filename write-date position) - (read-snippet-from-string (get-source-code filename write-date) position)) - -(defun function-source-location (function &optional name) - (declare (type function function)) - (definition-source-for-emacs (sb-introspect:find-definition-source function) - :function - (or name (function-name function)))) - -(defun setf-expander (symbol) - (or - #+#.(swank/sbcl::sbcl-with-setf-inverse-meta-info) - (sb-int:info :setf :inverse symbol) - (sb-int:info :setf :expander symbol))) - -(defimplementation describe-symbol-for-emacs (symbol) - "Return a plist describing SYMBOL. -Return NIL if the symbol is unbound." - (let ((result '())) - (flet ((doc (kind) - (or (documentation symbol kind) :not-documented)) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push - :variable (multiple-value-bind (kind recorded-p) - (sb-int:info :variable :kind symbol) - (declare (ignore kind)) - (if (or (boundp symbol) recorded-p) - (doc 'variable)))) - (when (fboundp symbol) - (maybe-push - (cond ((macro-function symbol) :macro) - ((special-operator-p symbol) :special-operator) - ((typep (fdefinition symbol) 'generic-function) - :generic-function) - (t :function)) - (doc 'function))) - (maybe-push - :setf (and (setf-expander symbol) - (doc 'setf))) - (maybe-push - :type (if (sb-int:info :type :kind symbol) - (doc 'type))) - result))) - -(defimplementation describe-definition (symbol type) - (case type - (:variable - (describe symbol)) - (:function - (describe (symbol-function symbol))) - (:setf - (describe (setf-expander symbol))) - (:class - (describe (find-class symbol))) - (:type - (describe (sb-kernel:values-specifier-type symbol))))) - -#+#.(swank/sbcl::sbcl-with-xref-p) -(progn - (defmacro defxref (name &optional fn-name) - `(defimplementation ,name (what) - (sanitize-xrefs - (mapcar #'source-location-for-xref-data - (,(find-symbol (symbol-name (if fn-name - fn-name - name)) - "SB-INTROSPECT") - what))))) - (defxref who-calls) - (defxref who-binds) - (defxref who-sets) - (defxref who-references) - (defxref who-macroexpands) - #+#.(swank/backend:with-symbol 'who-specializes-directly 'sb-introspect) - (defxref who-specializes who-specializes-directly)) - -(defun source-location-for-xref-data (xref-data) - (destructuring-bind (name . defsrc) xref-data - (list name (converting-errors-to-error-location - (definition-source-for-emacs defsrc 'function name))))) - -(defimplementation list-callers (symbol) - (let ((fn (fdefinition symbol))) - (sanitize-xrefs - (mapcar #'function-dspec (sb-introspect:find-function-callers fn))))) - -(defimplementation list-callees (symbol) - (let ((fn (fdefinition symbol))) - (sanitize-xrefs - (mapcar #'function-dspec (sb-introspect:find-function-callees fn))))) - -(defun sanitize-xrefs (xrefs) - (remove-duplicates - (remove-if (lambda (f) - (member f (ignored-xref-function-names))) - (loop for entry in xrefs - for name = (car entry) - collect (if (and (consp name) - (member (car name) - '(sb-pcl::fast-method - sb-pcl::slow-method - sb-pcl::method))) - (cons (cons 'defmethod (cdr name)) - (cdr entry)) - entry)) - :key #'car) - :test (lambda (a b) - (and (eq (first a) (first b)) - (equal (second a) (second b)))))) - -(defun ignored-xref-function-names () - #-#.(swank/sbcl::sbcl-with-new-stepper-p) - '(nil sb-c::step-form sb-c::step-values) - #+#.(swank/sbcl::sbcl-with-new-stepper-p) - '(nil)) - -(defun function-dspec (fn) - "Describe where the function FN was defined. -Return a list of the form (NAME LOCATION)." - (let ((name (function-name fn))) - (list name (converting-errors-to-error-location - (function-source-location fn name))))) - -;;; macroexpansion - -(defimplementation macroexpand-all (form &optional env) - (sb-cltl2:macroexpand-all form env)) - -(defimplementation collect-macro-forms (form &optional environment) - (let ((macro-forms '()) - (compiler-macro-forms '()) - (function-quoted-forms '())) - (sb-walker:walk-form - form environment - (lambda (form context environment) - (declare (ignore context)) - (when (and (consp form) - (symbolp (car form))) - (cond ((eq (car form) 'function) - (push (cadr form) function-quoted-forms)) - ((member form function-quoted-forms) - nil) - ((macro-function (car form) environment) - (push form macro-forms)) - ((not (eq form (compiler-macroexpand-1 form environment))) - (push form compiler-macro-forms)))) - form)) - (values macro-forms compiler-macro-forms))) - - -;;; Debugging - -;;; Notice that SB-EXT:*INVOKE-DEBUGGER-HOOK* is slightly stronger -;;; than just a hook into BREAK. In particular, it'll make -;;; (LET ((*DEBUGGER-HOOK* NIL)) ..error..) drop into SLDB rather -;;; than the native debugger. That should probably be considered a -;;; feature. - -(defun make-invoke-debugger-hook (hook) - (when hook - #'(sb-int:named-lambda swank-invoke-debugger-hook - (condition old-hook) - (if *debugger-hook* - nil ; decline, *DEBUGGER-HOOK* will be tried next. - (funcall hook condition old-hook))))) - -(defun set-break-hook (hook) - (setq sb-ext:*invoke-debugger-hook* (make-invoke-debugger-hook hook))) - -(defun call-with-break-hook (hook continuation) - (let ((sb-ext:*invoke-debugger-hook* (make-invoke-debugger-hook hook))) - (funcall continuation))) - -(defimplementation install-debugger-globally (function) - (setq *debugger-hook* function) - (set-break-hook function)) - -(defimplementation condition-extras (condition) - (cond #+#.(swank/sbcl::sbcl-with-new-stepper-p) - ((typep condition 'sb-impl::step-form-condition) - `((:show-frame-source 0))) - ((typep condition 'sb-int:reference-condition) - (let ((refs (sb-int:reference-condition-references condition))) - (if refs - `((:references ,(externalize-reference refs)))))))) - -(defun externalize-reference (ref) - (etypecase ref - (null nil) - (cons (cons (externalize-reference (car ref)) - (externalize-reference (cdr ref)))) - ((or string number) ref) - (symbol - (cond ((eq (symbol-package ref) (symbol-package :test)) - ref) - (t (symbol-name ref)))))) - -(defvar *sldb-stack-top*) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (declare (type function debugger-loop-fn)) - (let ((*sldb-stack-top* - (if (and (not *debug-swank-backend*) - sb-debug:*stack-top-hint*) - #+#.(swank/backend:with-symbol 'resolve-stack-top-hint 'sb-debug) - (sb-debug::resolve-stack-top-hint) - #-#.(swank/backend:with-symbol 'resolve-stack-top-hint 'sb-debug) - sb-debug:*stack-top-hint* - (sb-di:top-frame))) - (sb-debug:*stack-top-hint* nil)) - (handler-bind ((sb-di:debug-condition - (lambda (condition) - (signal 'sldb-condition - :original-condition condition)))) - (funcall debugger-loop-fn)))) - -#+#.(swank/sbcl::sbcl-with-new-stepper-p) -(progn - (defimplementation activate-stepping (frame) - (declare (ignore frame)) - (sb-impl::enable-stepping)) - (defimplementation sldb-stepper-condition-p (condition) - (typep condition 'sb-ext:step-form-condition)) - (defimplementation sldb-step-into () - (invoke-restart 'sb-ext:step-into)) - (defimplementation sldb-step-next () - (invoke-restart 'sb-ext:step-next)) - (defimplementation sldb-step-out () - (invoke-restart 'sb-ext:step-out))) - -(defimplementation call-with-debugger-hook (hook fun) - (let ((*debugger-hook* hook) - #+#.(swank/sbcl::sbcl-with-new-stepper-p) - (sb-ext:*stepper-hook* - (lambda (condition) - (typecase condition - (sb-ext:step-form-condition - (let ((sb-debug:*stack-top-hint* (sb-di::find-stepped-frame))) - (sb-impl::invoke-debugger condition))))))) - (handler-bind (#+#.(swank/sbcl::sbcl-with-new-stepper-p) - (sb-ext:step-condition #'sb-impl::invoke-stepper)) - (call-with-break-hook hook fun)))) - -(defun nth-frame (index) - (do ((frame *sldb-stack-top* (sb-di:frame-down frame)) - (i index (1- i))) - ((zerop i) frame))) - -(defimplementation compute-backtrace (start end) - "Return a list of frames starting with frame number START and -continuing to frame number END or, if END is nil, the last frame on the -stack." - (let ((end (or end most-positive-fixnum))) - (loop for f = (nth-frame start) then (sb-di:frame-down f) - for i from start below end - while f collect f))) - -(defimplementation print-frame (frame stream) - (sb-debug::print-frame-call frame stream - :allow-other-keys t - :emergency-best-effort t)) - -(defimplementation frame-restartable-p (frame) - #+#.(swank/sbcl::sbcl-with-restart-frame) - (not (null (sb-debug:frame-has-debug-tag-p frame)))) - -(defimplementation frame-call (frame-number) - (multiple-value-bind (name args) - (sb-debug::frame-call (nth-frame frame-number)) - (with-output-to-string (stream) - (locally (declare (sb-ext:muffle-conditions sb-ext:compiler-note)) - (pprint-logical-block (stream nil :prefix "(" :suffix ")") - (locally (declare (sb-ext:unmuffle-conditions sb-ext:compiler-note)) - (let ((*print-length* nil) - (*print-level* nil)) - (prin1 (sb-debug::ensure-printable-object name) stream)) - (let ((args (sb-debug::ensure-printable-object args))) - (if (listp args) - (format stream "~{ ~_~S~}" args) - (format stream " ~S" args))))))))) - -;;;; Code-location -> source-location translation - -;;; If debug-block info is avaibale, we determine the file position of -;;; the source-path for a code-location. If the code was compiled -;;; with C-c C-c, we have to search the position in the source string. -;;; If there's no debug-block info, we return the (less precise) -;;; source-location of the corresponding function. - -(defun code-location-source-location (code-location) - (let* ((dsource (sb-di:code-location-debug-source code-location)) - (plist (sb-c::debug-source-plist dsource)) - (package (getf plist :emacs-package)) - (*package* (or (and package - (find-package package)) - *package*))) - (if (getf plist :emacs-buffer) - (emacs-buffer-source-location code-location plist) - #+#.(swank/backend:with-symbol 'debug-source-from 'sb-di) - (ecase (sb-di:debug-source-from dsource) - (:file (file-source-location code-location)) - (:lisp (lisp-source-location code-location))) - #-#.(swank/backend:with-symbol 'debug-source-from 'sb-di) - (if (sb-di:debug-source-namestring dsource) - (file-source-location code-location) - (lisp-source-location code-location))))) - -;;; FIXME: The naming policy of source-location functions is a bit -;;; fuzzy: we have FUNCTION-SOURCE-LOCATION which returns the -;;; source-location for a function, and we also have FILE-SOURCE-LOCATION &co -;;; which returns the source location for a _code-location_. -;;; -;;; Maybe these should be named code-location-file-source-location, -;;; etc, turned into generic functions, or something. In the very -;;; least the names should indicate the main entry point vs. helper -;;; status. - -(defun file-source-location (code-location) - (if (code-location-has-debug-block-info-p code-location) - (source-file-source-location code-location) - (fallback-source-location code-location))) - -(defun fallback-source-location (code-location) - (let ((fun (code-location-debug-fun-fun code-location))) - (cond (fun (function-source-location fun)) - (t (error "Cannot find source location for: ~A " code-location))))) - -(defun lisp-source-location (code-location) - (let ((source (prin1-to-string - (sb-debug::code-location-source-form code-location 100))) - (condition swank:*swank-debugger-condition*)) - (if (and (typep condition 'sb-impl::step-form-condition) - (search "SB-IMPL::WITH-STEPPING-ENABLED" source - :test #'char-equal) - (search "SB-IMPL::STEP-FINISHED" source :test #'char-equal)) - ;; The initial form is utterly uninteresting -- and almost - ;; certainly right there in the REPL. - (make-error-location "Stepping...") - (make-location `(:source-form ,source) '(:position 1))))) - -(defun emacs-buffer-source-location (code-location plist) - (if (code-location-has-debug-block-info-p code-location) - (destructuring-bind (&key emacs-buffer emacs-position emacs-string - &allow-other-keys) - plist - (let* ((pos (string-source-position code-location emacs-string)) - (snipped (read-snippet-from-string emacs-string pos))) - (make-location `(:buffer ,emacs-buffer) - `(:offset ,emacs-position ,pos) - `(:snippet ,snipped)))) - (fallback-source-location code-location))) - -(defun source-file-source-location (code-location) - (let* ((code-date (code-location-debug-source-created code-location)) - (filename (code-location-debug-source-name code-location)) - (*readtable* (guess-readtable-for-filename filename)) - (source-code (get-source-code filename code-date))) - (with-debootstrapping - (with-input-from-string (s source-code) - (let* ((pos (stream-source-position code-location s)) - (snippet (read-snippet s pos))) - (make-location `(:file ,filename) - `(:position ,pos) - `(:snippet ,snippet))))))) - -(defun code-location-debug-source-name (code-location) - (namestring (truename (#.(swank/backend:choose-symbol - 'sb-c 'debug-source-name - 'sb-c 'debug-source-namestring) - (sb-di::code-location-debug-source code-location))))) - -(defun code-location-debug-source-created (code-location) - (sb-c::debug-source-created - (sb-di::code-location-debug-source code-location))) - -(defun code-location-debug-fun-fun (code-location) - (sb-di:debug-fun-fun (sb-di:code-location-debug-fun code-location))) - -(defun code-location-has-debug-block-info-p (code-location) - (handler-case - (progn (sb-di:code-location-debug-block code-location) - t) - (sb-di:no-debug-blocks () nil))) - -(defun stream-source-position (code-location stream) - (let* ((cloc (sb-debug::maybe-block-start-location code-location)) - (tlf-number (sb-di::code-location-toplevel-form-offset cloc)) - (form-number (sb-di::code-location-form-number cloc))) - (multiple-value-bind (tlf pos-map) (read-source-form tlf-number stream) - (let* ((path-table (sb-di::form-number-translations tlf 0)) - (path (cond ((<= (length path-table) form-number) - (warn "inconsistent form-number-translations") - (list 0)) - (t - (reverse (cdr (aref path-table form-number))))))) - (source-path-source-position path tlf pos-map))))) - -(defun string-source-position (code-location string) - (with-input-from-string (s string) - (stream-source-position code-location s))) - -;;; source-path-file-position and friends are in source-path-parser - -(defimplementation frame-source-location (index) - (converting-errors-to-error-location - (code-location-source-location - (sb-di:frame-code-location (nth-frame index))))) - -(defvar *keep-non-valid-locals* nil) - -(defun frame-debug-vars (frame) - "Return a vector of debug-variables in frame." - (let ((all-vars (sb-di::debug-fun-debug-vars (sb-di:frame-debug-fun frame)))) - (cond (*keep-non-valid-locals* all-vars) - (t (let ((loc (sb-di:frame-code-location frame))) - (remove-if (lambda (var) - (ecase (sb-di:debug-var-validity var loc) - (:valid nil) - ((:invalid :unknown) t))) - all-vars)))))) - -(defun debug-var-value (var frame location) - (ecase (sb-di:debug-var-validity var location) - (:valid (sb-di:debug-var-value var frame)) - ((:invalid :unknown) ':))) - -(defun debug-var-info (var) - ;; Introduced by SBCL 1.0.49.76. - (let ((s (find-symbol "DEBUG-VAR-INFO" :sb-di))) - (when (and s (fboundp s)) - (funcall s var)))) - -(defimplementation frame-locals (index) - (let* ((frame (nth-frame index)) - (loc (sb-di:frame-code-location frame)) - (vars (frame-debug-vars frame)) - ;; Since SBCL 1.0.49.76 PREPROCESS-FOR-EVAL understands SB-DEBUG::MORE - ;; specially. - (more-name (or (find-symbol "MORE" :sb-debug) 'more)) - (more-context nil) - (more-count nil)) - (when vars - (let ((locals - (loop for v across vars - unless - (case (debug-var-info v) - (:more-context - (setf more-context (debug-var-value v frame loc)) - t) - (:more-count - (setf more-count (debug-var-value v frame loc)) - t)) - collect - (list :name (sb-di:debug-var-symbol v) - :id (sb-di:debug-var-id v) - :value (debug-var-value v frame loc))))) - (when (and more-context more-count) - (setf locals (append locals - (list - (list :name more-name - :id 0 - :value (multiple-value-list - (sb-c:%more-arg-values - more-context - 0 more-count))))))) - locals)))) - -(defimplementation frame-var-value (frame var) - (let* ((frame (nth-frame frame)) - (vars (frame-debug-vars frame)) - (loc (sb-di:frame-code-location frame)) - (dvar (if (= var (length vars)) - ;; If VAR is out of bounds, it must be the fake var - ;; we made up for &MORE. - (let* ((context-var (find :more-context vars - :key #'debug-var-info)) - (more-context (debug-var-value context-var frame - loc)) - (count-var (find :more-count vars - :key #'debug-var-info)) - (more-count (debug-var-value count-var frame loc))) - (return-from frame-var-value - (multiple-value-list (sb-c:%more-arg-values - more-context - 0 more-count)))) - (aref vars var)))) - (debug-var-value dvar frame loc))) - -(defimplementation frame-catch-tags (index) - (mapcar #'car (sb-di:frame-catches (nth-frame index)))) - -(defimplementation eval-in-frame (form index) - (let ((frame (nth-frame index))) - (funcall (the function - (sb-di:preprocess-for-eval form - (sb-di:frame-code-location frame))) - frame))) - -(defimplementation frame-package (frame-number) - (let* ((frame (nth-frame frame-number)) - (fun (sb-di:debug-fun-fun (sb-di:frame-debug-fun frame)))) - (when fun - (let ((name (function-name fun))) - (typecase name - (null nil) - (symbol (symbol-package name)) - ((cons (eql setf) (cons symbol)) (symbol-package (cadr name)))))))) - -#+#.(swank/sbcl::sbcl-with-restart-frame) -(progn - (defimplementation return-from-frame (index form) - (let* ((frame (nth-frame index))) - (cond ((sb-debug:frame-has-debug-tag-p frame) - (let ((values (multiple-value-list (eval-in-frame form index)))) - (sb-debug:unwind-to-frame-and-call frame - (lambda () - (values-list values))))) - (t (format nil "Cannot return from frame: ~S" frame))))) - - (defimplementation restart-frame (index) - (let ((frame (nth-frame index))) - (when (sb-debug:frame-has-debug-tag-p frame) - (multiple-value-bind (fname args) (sb-debug::frame-call frame) - (multiple-value-bind (fun arglist) - (if (and (sb-int:legal-fun-name-p fname) (fboundp fname)) - (values (fdefinition fname) args) - (values (sb-di:debug-fun-fun (sb-di:frame-debug-fun frame)) - (sb-debug::frame-args-as-list frame))) - (when (functionp fun) - (sb-debug:unwind-to-frame-and-call - frame - (lambda () - ;; Ensure TCO. - (declare (optimize (debug 0))) - (apply fun arglist))))))) - (format nil "Cannot restart frame: ~S" frame)))) - -;; FIXME: this implementation doesn't unwind the stack before -;; re-invoking the function, but it's better than no implementation at -;; all. -#-#.(swank/sbcl::sbcl-with-restart-frame) -(progn - (defun sb-debug-catch-tag-p (tag) - (and (symbolp tag) - (not (symbol-package tag)) - (string= tag :sb-debug-catch-tag))) - - (defimplementation return-from-frame (index form) - (let* ((frame (nth-frame index)) - (probe (assoc-if #'sb-debug-catch-tag-p - (sb-di::frame-catches frame)))) - (cond (probe (throw (car probe) (eval-in-frame form index))) - (t (format nil "Cannot return from frame: ~S" frame))))) - - (defimplementation restart-frame (index) - (let ((frame (nth-frame index))) - (return-from-frame index (sb-debug::frame-call-as-list frame))))) - -;;;;; reference-conditions - -(defimplementation print-condition (condition stream) - (let ((sb-int:*print-condition-references* nil)) - (princ condition stream))) - - -;;;; Profiling - -(defimplementation profile (fname) - (when fname (eval `(sb-profile:profile ,fname)))) - -(defimplementation unprofile (fname) - (when fname (eval `(sb-profile:unprofile ,fname)))) - -(defimplementation unprofile-all () - (sb-profile:unprofile) - "All functions unprofiled.") - -(defimplementation profile-report () - (sb-profile:report)) - -(defimplementation profile-reset () - (sb-profile:reset) - "Reset profiling counters.") - -(defimplementation profiled-functions () - (sb-profile:profile)) - -(defimplementation profile-package (package callers methods) - (declare (ignore callers methods)) - (eval `(sb-profile:profile ,(package-name (find-package package))))) - - -;;;; Inspector - -(defmethod emacs-inspect ((o t)) - (cond ((sb-di::indirect-value-cell-p o) - (label-value-line* (:value (sb-kernel:value-cell-ref o)))) - (t - (multiple-value-bind (text label parts) (sb-impl::inspected-parts o) - (list* (string-right-trim '(#\Newline) text) - '(:newline) - (if label - (loop for (l . v) in parts - append (label-value-line l v)) - (loop for value in parts - for i from 0 - append (label-value-line i value)))))))) - -(defmethod emacs-inspect ((o function)) - (cond ((sb-kernel:simple-fun-p o) - (label-value-line* - (:name (sb-kernel:%simple-fun-name o)) - (:arglist (sb-kernel:%simple-fun-arglist o)) - (:next (sb-kernel:%simple-fun-next o)) - (:type (sb-kernel:%simple-fun-type o)) - (:code (sb-kernel:fun-code-header o)))) - ((sb-kernel:closurep o) - (append - (label-value-line :function (sb-kernel:%closure-fun o)) - `("Closed over values:" (:newline)) - (loop for i below (1- (sb-kernel:get-closure-length o)) - append (label-value-line - i (sb-kernel:%closure-index-ref o i))))) - (t (call-next-method o)))) - -(defmethod emacs-inspect ((o sb-kernel:code-component)) - (append - (label-value-line* - (:code-size (sb-kernel:%code-code-size o)) - (:entry-points (sb-kernel:%code-entry-points o)) - (:debug-info (sb-kernel:%code-debug-info o))) - `("Constants:" (:newline)) - (loop for i from sb-vm:code-constants-offset - below - (#.(swank/backend:choose-symbol 'sb-kernel 'code-header-words - 'sb-kernel 'get-header-data) - o) - append (label-value-line i (sb-kernel:code-header-ref o i))) - `("Code:" (:newline) - ,(with-output-to-string (s) - (sb-disassem:disassemble-code-component o :stream s))))) - -(defmethod emacs-inspect ((o sb-ext:weak-pointer)) - (label-value-line* - (:value (sb-ext:weak-pointer-value o)))) - -(defmethod emacs-inspect ((o sb-kernel:fdefn)) - (label-value-line* - (:name (sb-kernel:fdefn-name o)) - (:function (sb-kernel:fdefn-fun o)))) - -(defmethod emacs-inspect :around ((o generic-function)) - (append - (call-next-method) - (label-value-line* - (:pretty-arglist (sb-pcl::generic-function-pretty-arglist o)) - (:initial-methods (sb-pcl::generic-function-initial-methods o)) - ))) - - -;;;; Multiprocessing - -#+(and sb-thread - #.(swank/backend:with-symbol "THREAD-NAME" "SB-THREAD")) -(progn - (defvar *thread-id-counter* 0) - - (defvar *thread-id-counter-lock* - (sb-thread:make-mutex :name "thread id counter lock")) - - (defun next-thread-id () - (sb-thread:with-mutex (*thread-id-counter-lock*) - (incf *thread-id-counter*))) - - (defparameter *thread-id-map* (make-hash-table)) - - ;; This should be a thread -> id map but as weak keys are not - ;; supported it is id -> map instead. - (defvar *thread-id-map-lock* - (sb-thread:make-mutex :name "thread id map lock")) - - (defimplementation spawn (fn &key name) - (sb-thread:make-thread fn :name name)) - - (defimplementation thread-id (thread) - (block thread-id - (sb-thread:with-mutex (*thread-id-map-lock*) - (loop for id being the hash-key in *thread-id-map* - using (hash-value thread-pointer) - do - (let ((maybe-thread (sb-ext:weak-pointer-value thread-pointer))) - (cond ((null maybe-thread) - ;; the value is gc'd, remove it manually - (remhash id *thread-id-map*)) - ((eq thread maybe-thread) - (return-from thread-id id))))) - ;; lazy numbering - (let ((id (next-thread-id))) - (setf (gethash id *thread-id-map*) (sb-ext:make-weak-pointer thread)) - id)))) - - (defimplementation find-thread (id) - (sb-thread:with-mutex (*thread-id-map-lock*) - (let ((thread-pointer (gethash id *thread-id-map*))) - (if thread-pointer - (let ((maybe-thread (sb-ext:weak-pointer-value thread-pointer))) - (if maybe-thread - maybe-thread - ;; the value is gc'd, remove it manually - (progn - (remhash id *thread-id-map*) - nil))) - nil)))) - - (defimplementation thread-name (thread) - ;; sometimes the name is not a string (e.g. NIL) - (princ-to-string (sb-thread:thread-name thread))) - - (defimplementation thread-status (thread) - (if (sb-thread:thread-alive-p thread) - "Running" - "Stopped")) - - (defimplementation make-lock (&key name) - (sb-thread:make-mutex :name name)) - - (defimplementation call-with-lock-held (lock function) - (declare (type function function)) - (sb-thread:with-recursive-lock (lock) (funcall function))) - - (defimplementation current-thread () - sb-thread:*current-thread*) - - (defimplementation all-threads () - (sb-thread:list-all-threads)) - - (defimplementation interrupt-thread (thread fn) - (sb-thread:interrupt-thread thread fn)) - - (defimplementation kill-thread (thread) - (sb-thread:terminate-thread thread)) - - (defimplementation thread-alive-p (thread) - (sb-thread:thread-alive-p thread)) - - (defvar *mailbox-lock* (sb-thread:make-mutex :name "mailbox lock")) - (defvar *mailboxes* (list)) - (declaim (type list *mailboxes*)) - - (defstruct (mailbox (:conc-name mailbox.)) - thread - (mutex (sb-thread:make-mutex)) - (waitqueue (sb-thread:make-waitqueue)) - (queue '() :type list)) - - (defun mailbox (thread) - "Return THREAD's mailbox." - (sb-thread:with-mutex (*mailbox-lock*) - (or (find thread *mailboxes* :key #'mailbox.thread) - (let ((mb (make-mailbox :thread thread))) - (push mb *mailboxes*) - mb)))) - - (defimplementation wake-thread (thread) - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) - (sb-thread:with-recursive-lock (mutex) - (sb-thread:condition-broadcast (mailbox.waitqueue mbox))))) - - (defimplementation send (thread message) - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) - (sb-thread:with-mutex (mutex) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message))) - (sb-thread:condition-broadcast (mailbox.waitqueue mbox))))) - - (defimplementation receive-if (test &optional timeout) - (let* ((mbox (mailbox (current-thread))) - (mutex (mailbox.mutex mbox)) - (waitq (mailbox.waitqueue mbox))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (sb-thread:with-mutex (mutex) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) (nconc (ldiff q tail) (cdr tail))) - (return (car tail)))) - (when (eq timeout t) (return (values nil t))) - (sb-thread:condition-wait waitq mutex))))) - - (let ((alist '()) - (mutex (sb-thread:make-mutex :name "register-thread"))) - - (defimplementation register-thread (name thread) - (declare (type symbol name)) - (sb-thread:with-mutex (mutex) - (etypecase thread - (null - (setf alist (delete name alist :key #'car))) - (sb-thread:thread - (let ((probe (assoc name alist))) - (cond (probe (setf (cdr probe) thread)) - (t (setf alist (acons name thread alist)))))))) - nil) - - (defimplementation find-registered (name) - (sb-thread:with-mutex (mutex) - (cdr (assoc name alist)))))) - -(defimplementation quit-lisp () - #+#.(swank/backend:with-symbol 'exit 'sb-ext) - (sb-ext:exit) - #-#.(swank/backend:with-symbol 'exit 'sb-ext) - (progn - #+sb-thread - (dolist (thread (remove (current-thread) (all-threads))) - (ignore-errors (sb-thread:terminate-thread thread))) - (sb-ext:quit))) - - - -;;Trace implementations -;;In SBCL, we have: -;; (trace ) -;; (trace :methods ') ;to trace all methods of the gf -;; (trace (method ? (+))) -;; can be a normal name or a (setf name) - -(defun toggle-trace-aux (fspec &rest args) - (cond ((member fspec (eval '(trace)) :test #'equal) - (eval `(untrace ,fspec)) - (format nil "~S is now untraced." fspec)) - (t - (eval `(trace ,@(if args `(:encapsulate nil) (list)) ,fspec ,@args)) - (format nil "~S is now traced." fspec)))) - -(defun process-fspec (fspec) - (cond ((consp fspec) - (ecase (first fspec) - ((:defun :defgeneric) (second fspec)) - ((:defmethod) `(method ,@(rest fspec))) - ((:labels) `(labels ,(process-fspec (second fspec)) ,(third fspec))) - ((:flet) `(flet ,(process-fspec (second fspec)) ,(third fspec))))) - (t - fspec))) - -(defimplementation toggle-trace (spec) - (ecase (car spec) - ((setf) - (toggle-trace-aux spec)) - ((:defmethod) - (toggle-trace-aux `(sb-pcl::fast-method ,@(rest (process-fspec spec))))) - ((:defgeneric) - (toggle-trace-aux (second spec) :methods t)) - ((:call) - (destructuring-bind (caller callee) (cdr spec) - (toggle-trace-aux callee :wherein (list (process-fspec caller))))))) - -;;; Weak datastructures - -(defimplementation make-weak-key-hash-table (&rest args) - #+#.(swank/sbcl::sbcl-with-weak-hash-tables) - (apply #'make-hash-table :weakness :key args) - #-#.(swank/sbcl::sbcl-with-weak-hash-tables) - (apply #'make-hash-table args)) - -(defimplementation make-weak-value-hash-table (&rest args) - #+#.(swank/sbcl::sbcl-with-weak-hash-tables) - (apply #'make-hash-table :weakness :value args) - #-#.(swank/sbcl::sbcl-with-weak-hash-tables) - (apply #'make-hash-table args)) - -(defimplementation hash-table-weakness (hashtable) - #+#.(swank/sbcl::sbcl-with-weak-hash-tables) - (sb-ext:hash-table-weakness hashtable)) - -;;; Floating point - -(defimplementation float-nan-p (float) - (sb-ext:float-nan-p float)) - -(defimplementation float-infinity-p (float) - (sb-ext:float-infinity-p float)) - -#-win32 -(defimplementation save-image (filename &optional restart-function) - (flet ((restart-sbcl () - (sb-debug::enable-debugger) - (setf sb-impl::*descriptor-handlers* nil) - (funcall restart-function))) - (let ((pid (sb-posix:fork))) - (cond ((= pid 0) - (sb-debug::disable-debugger) - (apply #'sb-ext:save-lisp-and-die filename - (when restart-function - (list :toplevel #'restart-sbcl)))) - (t - (multiple-value-bind (rpid status) (sb-posix:waitpid pid 0) - (assert (= pid rpid)) - (assert (and (sb-posix:wifexited status) - (zerop (sb-posix:wexitstatus status)))))))))) - -#+unix -(progn - (sb-alien:define-alien-routine ("execv" sys-execv) sb-alien:int - (program sb-alien:c-string) - (argv (* sb-alien:c-string))) - - (defun execv (program args) - "Replace current executable with another one." - (let ((a-args (sb-alien:make-alien sb-alien:c-string - (+ 1 (length args))))) - (unwind-protect - (progn - (loop for index from 0 by 1 - and item in (append args '(nil)) - do (setf (sb-alien:deref a-args index) - item)) - (when (minusp - (sys-execv program a-args)) - (error "execv(3) returned."))) - (sb-alien:free-alien a-args)))) - - (defun runtime-pathname () - #+#.(swank/backend:with-symbol - '*runtime-pathname* 'sb-ext) - sb-ext:*runtime-pathname* - #-#.(swank/backend:with-symbol - '*runtime-pathname* 'sb-ext) - (car sb-ext:*posix-argv*)) - - (defimplementation exec-image (image-file args) - (loop with fd-arg = - (loop for arg in args - and key = "" then arg - when (string-equal key "--swank-fd") - return (parse-integer arg)) - for my-fd from 3 to 1024 - when (/= my-fd fd-arg) - do (ignore-errors (sb-posix:fcntl my-fd sb-posix:f-setfd 1))) - (let* ((self-string (pathname-to-filename (runtime-pathname)))) - (execv - self-string - (apply 'list self-string "--core" image-file args))))) - -(defimplementation make-fd-stream (fd external-format) - (sb-sys:make-fd-stream fd :input t :output t - :element-type 'character - :buffering :full - :dual-channel-p t - :external-format external-format)) - -#-win32 -(defimplementation background-save-image (filename &key restart-function - completion-function) - (flet ((restart-sbcl () - (sb-debug::enable-debugger) - (setf sb-impl::*descriptor-handlers* nil) - (funcall restart-function))) - (multiple-value-bind (pipe-in pipe-out) (sb-posix:pipe) - (let ((pid (sb-posix:fork))) - (cond ((= pid 0) - (sb-posix:close pipe-in) - (sb-debug::disable-debugger) - (apply #'sb-ext:save-lisp-and-die filename - (when restart-function - (list :toplevel #'restart-sbcl)))) - (t - (sb-posix:close pipe-out) - (sb-sys:add-fd-handler - pipe-in :input - (lambda (fd) - (sb-sys:invalidate-descriptor fd) - (sb-posix:close fd) - (multiple-value-bind (rpid status) (sb-posix:waitpid pid 0) - (assert (= pid rpid)) - (assert (sb-posix:wifexited status)) - (funcall completion-function - (zerop (sb-posix:wexitstatus status)))))))))))) - -(pushnew 'deinit-log-output sb-ext:*save-hooks*) - - -;;;; wrap interface implementation - -(defun sbcl-version>= (&rest subversions) - #+#.(swank/backend:with-symbol 'assert-version->= 'sb-ext) - (values (ignore-errors (apply #'sb-ext:assert-version->= subversions) t)) - #-#.(swank/backend:with-symbol 'assert-version->= 'sb-ext) - nil) - -(defimplementation wrap (spec indicator &key before after replace) - (when (wrapped-p spec indicator) - (warn "~a already wrapped with indicator ~a, unwrapping first" - spec indicator) - (sb-int:unencapsulate spec indicator)) - (sb-int:encapsulate spec indicator - #-#.(swank/backend:with-symbol 'arg-list 'sb-int) - (lambda (function &rest args) - (sbcl-wrap spec before after replace function args)) - #+#.(swank/backend:with-symbol 'arg-list 'sb-int) - (if (sbcl-version>= 1 1 16) - (lambda () - (sbcl-wrap spec before after replace - (symbol-value 'sb-int:basic-definition) - (symbol-value 'sb-int:arg-list))) - `(sbcl-wrap ',spec ,before ,after ,replace - (symbol-value 'sb-int:basic-definition) - (symbol-value 'sb-int:arg-list))))) - -(defimplementation unwrap (spec indicator) - (sb-int:unencapsulate spec indicator)) - -(defimplementation wrapped-p (spec indicator) - (sb-int:encapsulated-p spec indicator)) - -(defun sbcl-wrap (spec before after replace function args) - (declare (ignore spec)) - (let (retlist completed) - (unwind-protect - (progn - (when before - (funcall before args)) - (setq retlist (multiple-value-list (if replace - (funcall replace - args) - (apply function args)))) - (setq completed t) - (values-list retlist)) - (when after - (funcall after (if completed retlist :exited-non-locally)))))) - -#+#.(swank/backend:with-symbol 'comma-expr 'sb-impl) -(progn - (defmethod sexp-in-bounds-p ((s sb-impl::comma) i) - (= i 1)) - - (defmethod sexp-ref ((s sb-impl::comma) i) - (sb-impl::comma-expr s))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/scl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/scl.lisp deleted file mode 100644 index 7327133..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/scl.lisp +++ /dev/null @@ -1,1726 +0,0 @@ -;;; -*- indent-tabs-mode: nil; outline-regexp: ";;;;+" -*- -;;; -;;; Scieneer Common Lisp code for SLIME. -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -(defpackage swank/scl - (:use cl swank/backend swank/source-path-parser swank/source-file-cache)) - -(in-package swank/scl) - - - -;;; swank-mop - -(import-swank-mop-symbols :clos '(:slot-definition-documentation)) - -(defun swank-mop:slot-definition-documentation (slot) - (documentation slot t)) - - -;;;; TCP server -;;; -;;; SCL only supports the :spawn communication style. -;;; - -(defimplementation preferred-communication-style () - :spawn) - -(defimplementation create-socket (host port &key backlog) - (let ((addr (resolve-hostname host))) - (ext:create-inet-listener port :stream :host addr :reuse-address t - :backlog (or backlog 5)))) - -(defimplementation local-port (socket) - (nth-value 1 (ext::get-socket-host-and-port (socket-fd socket)))) - -(defimplementation close-socket (socket) - (ext:close-socket (socket-fd socket))) - -(defimplementation accept-connection (socket - &key external-format buffering timeout) - (let ((buffering (or buffering :full)) - (fd (socket-fd socket))) - (loop - (let ((ready (sys:wait-until-fd-usable fd :input timeout))) - (unless ready - (error "Timeout accepting connection on socket: ~S~%" socket))) - (let ((new-fd (ignore-errors (ext:accept-tcp-connection fd)))) - (when new-fd - (return (make-socket-io-stream new-fd external-format - (ecase buffering - ((t) :full) - ((nil) :none) - (:line :line))))))))) - -(defimplementation set-stream-timeout (stream timeout) - (check-type timeout (or null real)) - (if (fboundp 'ext::stream-timeout) - (setf (ext::stream-timeout stream) timeout) - (setf (slot-value (slot-value stream 'lisp::stream) 'lisp::timeout) - timeout))) - -;;;;; Sockets - -(defun socket-fd (socket) - "Return the file descriptor for the socket represented by 'socket." - (etypecase socket - (fixnum socket) - (stream (sys:fd-stream-fd socket)))) - -(defun resolve-hostname (hostname) - "Return the IP address of 'hostname as an integer (in host byte-order)." - (let ((hostent (ext:lookup-host-entry hostname))) - (car (ext:host-entry-addr-list hostent)))) - -(defvar *external-format-to-coding-system* - '((:iso-8859-1 - "latin-1" "latin-1-unix" "iso-latin-1-unix" - "iso-8859-1" "iso-8859-1-unix") - (:utf-8 "utf-8" "utf-8-unix") - (:euc-jp "euc-jp" "euc-jp-unix"))) - -(defimplementation find-external-format (coding-system) - (car (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*))) - -(defun make-socket-io-stream (fd external-format buffering) - "Create a new input/output fd-stream for 'fd." - (cond ((not external-format) - (sys:make-fd-stream fd :input t :output t :buffering buffering - :element-type '(unsigned-byte 8))) - (t - (let* ((stream (sys:make-fd-stream fd :input t :output t - :element-type 'base-char - :buffering buffering - :external-format external-format))) - ;; Ignore character conversion errors. Without this the - ;; communication channel is prone to lockup if a character - ;; conversion error occurs. - (setf (lisp::character-conversion-stream-input-error-value stream) - #\?) - (setf (lisp::character-conversion-stream-output-error-value stream) - #\?) - stream)))) - - -;;;; Stream handling - -(defimplementation gray-package-name () - '#:ext) - - -;;;; Compilation Commands - -(defvar *previous-compiler-condition* nil - "Used to detect duplicates.") - -(defvar *previous-context* nil - "Previous compiler error context.") - -(defvar *buffer-name* nil - "The name of the Emacs buffer we are compiling from. - Nil if we aren't compiling from a buffer.") - -(defvar *buffer-start-position* nil) -(defvar *buffer-substring* nil) - -(defimplementation call-with-compilation-hooks (function) - (let ((*previous-compiler-condition* nil) - (*previous-context* nil) - (*print-readably* nil)) - (handler-bind ((c::compiler-error #'handle-notification-condition) - (c::style-warning #'handle-notification-condition) - (c::warning #'handle-notification-condition)) - (funcall function)))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (with-compilation-hooks () - (let ((*buffer-name* nil) - (ext:*ignore-extra-close-parentheses* nil)) - (multiple-value-bind (output-file warnings-p failure-p) - (compile-file input-file - :output-file output-file - :external-format external-format) - (values output-file warnings-p - (or failure-p - (when load-p - ;; Cache the latest source file for definition-finding. - (source-cache-get input-file - (file-write-date input-file)) - (not (load output-file))))))))) - -(defimplementation swank-compile-string (string &key buffer position filename - policy) - (declare (ignore filename policy)) - (with-compilation-hooks () - (let ((*buffer-name* buffer) - (*buffer-start-position* position) - (*buffer-substring* string)) - (with-input-from-string (stream string) - (ext:compile-from-stream - stream - :source-info `(:emacs-buffer ,buffer - :emacs-buffer-offset ,position - :emacs-buffer-string ,string)))))) - - -;;;;; Trapping notes -;;; -;;; We intercept conditions from the compiler and resignal them as -;;; `swank:compiler-condition's. - -(defun handle-notification-condition (condition) - "Handle a condition caused by a compiler warning." - (unless (eq condition *previous-compiler-condition*) - (let ((context (c::find-error-context nil))) - (setq *previous-compiler-condition* condition) - (setq *previous-context* context) - (signal-compiler-condition condition context)))) - -(defun signal-compiler-condition (condition context) - (signal 'compiler-condition - :original-condition condition - :severity (severity-for-emacs condition) - :message (brief-compiler-message-for-emacs condition) - :source-context (compiler-error-context context) - :location (if (read-error-p condition) - (read-error-location condition) - (compiler-note-location context)))) - -(defun severity-for-emacs (condition) - "Return the severity of 'condition." - (etypecase condition - ((satisfies read-error-p) :read-error) - (c::compiler-error :error) - (c::style-warning :note) - (c::warning :warning))) - -(defun read-error-p (condition) - (eq (type-of condition) 'c::compiler-read-error)) - -(defun brief-compiler-message-for-emacs (condition) - "Briefly describe a compiler error for Emacs. - When Emacs presents the message it already has the source popped up - and the source form highlighted. This makes much of the information in - the error-context redundant." - (princ-to-string condition)) - -(defun compiler-error-context (error-context) - "Describe a compiler error for Emacs including context information." - (declare (type (or c::compiler-error-context null) error-context)) - (multiple-value-bind (enclosing source) - (if error-context - (values (c::compiler-error-context-enclosing-source error-context) - (c::compiler-error-context-source error-context))) - (if (and enclosing source) - (format nil "~@[--> ~{~<~%--> ~1:;~A~> ~}~%~]~@[~{==>~%~A~^~%~}~]" - enclosing source)))) - -(defun read-error-location (condition) - (let* ((finfo (car (c::source-info-current-file c::*source-info*))) - (file (c::file-info-name finfo)) - (pos (c::compiler-read-error-position condition))) - (cond ((and (eq file :stream) *buffer-name*) - (make-location (list :buffer *buffer-name*) - (list :offset *buffer-start-position* pos))) - ((and (pathnamep file) (not *buffer-name*)) - (make-location (list :file (unix-truename file)) - (list :position (1+ pos)))) - (t (break))))) - -(defun compiler-note-location (context) - "Derive the location of a complier message from its context. - Return a `location' record, or (:error ) on failure." - (if (null context) - (note-error-location) - (let ((file (c::compiler-error-context-file-name context)) - (source (c::compiler-error-context-original-source context)) - (path - (reverse - (c::compiler-error-context-original-source-path context)))) - (or (locate-compiler-note file source path) - (note-error-location))))) - -(defun note-error-location () - "Pseudo-location for notes that can't be located." - (list :error "No error location available.")) - -(defun locate-compiler-note (file source source-path) - (cond ((and (eq file :stream) *buffer-name*) - ;; Compiling from a buffer - (make-location (list :buffer *buffer-name*) - (list :offset *buffer-start-position* - (source-path-string-position - source-path *buffer-substring*)))) - ((and (pathnamep file) (null *buffer-name*)) - ;; Compiling from a file - (make-location (list :file (unix-truename file)) - (list :position (1+ (source-path-file-position - source-path file))))) - ((and (eq file :lisp) (stringp source)) - ;; No location known, but we have the source form. - ;; XXX How is this case triggered? -luke (16/May/2004) - ;; This can happen if the compiler needs to expand a macro - ;; but the macro-expander is not yet compiled. Calling the - ;; (interpreted) macro-expander triggers IR1 conversion of - ;; the lambda expression for the expander and invokes the - ;; compiler recursively. - (make-location (list :source-form source) - (list :position 1))))) - -(defun unix-truename (pathname) - (ext:unix-namestring (truename pathname))) - - - -;;; TODO -(defimplementation who-calls (name) nil) -(defimplementation who-references (name) nil) -(defimplementation who-binds (name) nil) -(defimplementation who-sets (name) nil) -(defimplementation who-specializes (symbol) nil) -(defimplementation who-macroexpands (name) nil) - - -;;;; Find callers and callees -;;; -;;; Find callers and callees by looking at the constant pool of -;;; compiled code objects. We assume every fdefn object in the -;;; constant pool corresponds to a call to that function. A better -;;; strategy would be to use the disassembler to find actual -;;; call-sites. - -(declaim (inline map-code-constants)) -(defun map-code-constants (code fn) - "Call 'fn for each constant in 'code's constant pool." - (check-type code kernel:code-component) - (loop for i from vm:code-constants-offset below (kernel:get-header-data code) - do (funcall fn (kernel:code-header-ref code i)))) - -(defun function-callees (function) - "Return 'function's callees as a list of functions." - (let ((callees '())) - (map-code-constants - (vm::find-code-object function) - (lambda (obj) - (when (kernel:fdefn-p obj) - (push (kernel:fdefn-function obj) callees)))) - callees)) - -(declaim (ext:maybe-inline map-allocated-code-components)) -(defun map-allocated-code-components (spaces fn) - "Call FN for each allocated code component in one of 'spaces. FN - receives the object as argument. 'spaces should be a list of the - symbols :dynamic, :static, or :read-only." - (dolist (space spaces) - (declare (inline vm::map-allocated-objects) - (optimize (ext:inhibit-warnings 3))) - (vm::map-allocated-objects - (lambda (obj header size) - (declare (type fixnum size) (ignore size)) - (when (= vm:code-header-type header) - (funcall fn obj))) - space))) - -(declaim (ext:maybe-inline map-caller-code-components)) -(defun map-caller-code-components (function spaces fn) - "Call 'fn for each code component with a fdefn for 'function in its - constant pool." - (let ((function (coerce function 'function))) - (declare (inline map-allocated-code-components)) - (map-allocated-code-components - spaces - (lambda (obj) - (map-code-constants - obj - (lambda (constant) - (when (and (kernel:fdefn-p constant) - (eq (kernel:fdefn-function constant) - function)) - (funcall fn obj)))))))) - -(defun function-callers (function &optional (spaces '(:read-only :static - :dynamic))) - "Return 'function's callers. The result is a list of code-objects." - (let ((referrers '())) - (declare (inline map-caller-code-components)) - (map-caller-code-components function spaces - (lambda (code) (push code referrers))) - referrers)) - -(defun debug-info-definitions (debug-info) - "Return the defintions for a debug-info. This should only be used - for code-object without entry points, i.e., byte compiled - code (are theree others?)" - ;; This mess has only been tested with #'ext::skip-whitespace, a - ;; byte-compiled caller of #'read-char . - (check-type debug-info (and (not c::compiled-debug-info) c::debug-info)) - (let ((name (c::debug-info-name debug-info)) - (source (c::debug-info-source debug-info))) - (destructuring-bind (first) source - (ecase (c::debug-source-from first) - (:file - (list (list name - (make-location - (list :file (unix-truename (c::debug-source-name first))) - (list :function-name (string name)))))))))) - -(defun valid-function-name-p (name) - (or (symbolp name) (and (consp name) - (eq (car name) 'setf) - (symbolp (cadr name)) - (not (cddr name))))) - -(defun code-component-entry-points (code) - "Return a list ((name location) ...) of function definitons for - the code omponent 'code." - (let ((names '())) - (do ((f (kernel:%code-entry-points code) (kernel::%function-next f))) - ((not f)) - (let ((name (kernel:%function-name f))) - (when (valid-function-name-p name) - (push (list name (function-location f)) names)))) - names)) - -(defimplementation list-callers (symbol) - "Return a list ((name location) ...) of callers." - (let ((components (function-callers symbol)) - (xrefs '())) - (dolist (code components) - (let* ((entry (kernel:%code-entry-points code)) - (defs (if entry - (code-component-entry-points code) - ;; byte compiled stuff - (debug-info-definitions - (kernel:%code-debug-info code))))) - (setq xrefs (nconc defs xrefs)))) - xrefs)) - -(defimplementation list-callees (symbol) - (let ((fns (function-callees symbol))) - (mapcar (lambda (fn) - (list (kernel:%function-name fn) - (function-location fn))) - fns))) - - -;;;; Resolving source locations -;;; -;;; Our mission here is to "resolve" references to code locations into -;;; actual file/buffer names and character positions. The references -;;; we work from come out of the compiler's statically-generated debug -;;; information, such as `code-location''s and `debug-source''s. For -;;; more details, see the "Debugger Programmer's Interface" section of -;;; the SCL manual. -;;; -;;; The first step is usually to find the corresponding "source-path" -;;; for the location. Once we have the source-path we can pull up the -;;; source file and `READ' our way through to the right position. The -;;; main source-code groveling work is done in -;;; `source-path-parser.lisp'. - -(defvar *debug-definition-finding* nil - "When true don't handle errors while looking for definitions. - This is useful when debugging the definition-finding code.") - -(defmacro safe-definition-finding (&body body) - "Execute 'body and return the source-location it returns. - If an error occurs and `*debug-definition-finding*' is false, then - return an error pseudo-location. - - The second return value is 'nil if no error occurs, otherwise it is the - condition object." - `(flet ((body () ,@body)) - (if *debug-definition-finding* - (body) - (handler-case (values (progn ,@body) nil) - (error (c) (values (list :error (princ-to-string c)) c)))))) - -(defun code-location-source-location (code-location) - "Safe wrapper around `code-location-from-source-location'." - (safe-definition-finding - (source-location-from-code-location code-location))) - -(defun source-location-from-code-location (code-location) - "Return the source location for 'code-location." - (let ((debug-fun (di:code-location-debug-function code-location))) - (when (di::bogus-debug-function-p debug-fun) - ;; Those lousy cheapskates! They've put in a bogus debug source - ;; because the code was compiled at a low debug setting. - (error "Bogus debug function: ~A" debug-fun))) - (let* ((debug-source (di:code-location-debug-source code-location)) - (from (di:debug-source-from debug-source)) - (name (di:debug-source-name debug-source))) - (ecase from - (:file - (location-in-file name code-location debug-source)) - (:stream - (location-in-stream code-location debug-source)) - (:lisp - ;; The location comes from a form passed to `compile'. - ;; The best we can do is return the form itself for printing. - (make-location - (list :source-form (with-output-to-string (*standard-output*) - (debug::print-code-location-source-form - code-location 100 t))) - (list :position 1)))))) - -(defun location-in-file (filename code-location debug-source) - "Resolve the source location for 'code-location in 'filename." - (let* ((code-date (di:debug-source-created debug-source)) - (source-code (get-source-code filename code-date))) - (with-input-from-string (s source-code) - (make-location (list :file (unix-truename filename)) - (list :position (1+ (code-location-stream-position - code-location s))) - `(:snippet ,(read-snippet s)))))) - -(defun location-in-stream (code-location debug-source) - "Resolve the source location for a 'code-location from a stream. - This only succeeds if the code was compiled from an Emacs buffer." - (unless (debug-source-info-from-emacs-buffer-p debug-source) - (error "The code is compiled from a non-SLIME stream.")) - (let* ((info (c::debug-source-info debug-source)) - (string (getf info :emacs-buffer-string)) - (position (code-location-string-offset - code-location - string))) - (make-location - (list :buffer (getf info :emacs-buffer)) - (list :offset (getf info :emacs-buffer-offset) position) - (list :snippet (with-input-from-string (s string) - (file-position s position) - (read-snippet s)))))) - -;;;;; Function-name locations -;;; -(defun debug-info-function-name-location (debug-info) - "Return a function-name source-location for 'debug-info. - Function-name source-locations are a fallback for when precise - positions aren't available." - (with-struct (c::debug-info- (fname name) source) debug-info - (with-struct (c::debug-source- info from name) (car source) - (ecase from - (:file - (make-location (list :file (namestring (truename name))) - (list :function-name (string fname)))) - (:stream - (assert (debug-source-info-from-emacs-buffer-p (car source))) - (make-location (list :buffer (getf info :emacs-buffer)) - (list :function-name (string fname)))) - (:lisp - (make-location (list :source-form (princ-to-string (aref name 0))) - (list :position 1))))))) - -(defun debug-source-info-from-emacs-buffer-p (debug-source) - "Does the `info' slot of 'debug-source contain an Emacs buffer location? - This is true for functions that were compiled directly from buffers." - (info-from-emacs-buffer-p (c::debug-source-info debug-source))) - -(defun info-from-emacs-buffer-p (info) - (and info - (consp info) - (eq :emacs-buffer (car info)))) - - -;;;;; Groveling source-code for positions - -(defun code-location-stream-position (code-location stream) - "Return the byte offset of 'code-location in 'stream. Extract the - toplevel-form-number and form-number from 'code-location and use that - to find the position of the corresponding form. - - Finish with 'stream positioned at the start of the code location." - (let* ((location (debug::maybe-block-start-location code-location)) - (tlf-offset (di:code-location-top-level-form-offset location)) - (form-number (di:code-location-form-number location))) - (let ((pos (form-number-stream-position tlf-offset form-number stream))) - (file-position stream pos) - pos))) - -(defun form-number-stream-position (tlf-number form-number stream) - "Return the starting character position of a form in 'stream. - 'tlf-number is the top-level-form number. - 'form-number is an index into a source-path table for the TLF." - (multiple-value-bind (tlf position-map) (read-source-form tlf-number stream) - (let* ((path-table (di:form-number-translations tlf 0)) - (source-path - (if (<= (length path-table) form-number) ; source out of sync? - (list 0) ; should probably signal a condition - (reverse (cdr (aref path-table form-number)))))) - (source-path-source-position source-path tlf position-map)))) - -(defun code-location-string-offset (code-location string) - "Return the byte offset of 'code-location in 'string. - See 'code-location-stream-position." - (with-input-from-string (s string) - (code-location-stream-position code-location s))) - - -;;;; Finding definitions - -;;; There are a great many different types of definition for us to -;;; find. We search for definitions of every kind and return them in a -;;; list. - -(defimplementation find-definitions (name) - (append (function-definitions name) - (setf-definitions name) - (variable-definitions name) - (class-definitions name) - (type-definitions name) - (compiler-macro-definitions name) - (source-transform-definitions name) - (function-info-definitions name) - (ir1-translator-definitions name))) - -;;;;; Functions, macros, generic functions, methods -;;; -;;; We make extensive use of the compile-time debug information that -;;; SCL records, in particular "debug functions" and "code -;;; locations." Refer to the "Debugger Programmer's Interface" section -;;; of the SCL manual for more details. - -(defun function-definitions (name) - "Return definitions for 'name in the \"function namespace\", i.e., - regular functions, generic functions, methods and macros. - 'name can any valid function name (e.g, (setf car))." - (let ((macro? (and (symbolp name) (macro-function name))) - (special? (and (symbolp name) (special-operator-p name))) - (function? (and (valid-function-name-p name) - (ext:info :function :definition name) - (if (symbolp name) (fboundp name) t)))) - (cond (macro? - (list `((defmacro ,name) - ,(function-location (macro-function name))))) - (special? - (list `((:special-operator ,name) - (:error ,(format nil "Special operator: ~S" name))))) - (function? - (let ((function (fdefinition name))) - (if (genericp function) - (generic-function-definitions name function) - (list (list `(function ,name) - (function-location function))))))))) - -;;;;;; Ordinary (non-generic/macro/special) functions -;;; -;;; First we test if FUNCTION is a closure created by defstruct, and -;;; if so extract the defstruct-description (`dd') from the closure -;;; and find the constructor for the struct. Defstruct creates a -;;; defun for the default constructor and we use that as an -;;; approximation to the source location of the defstruct. -;;; -;;; For an ordinary function we return the source location of the -;;; first code-location we find. -;;; -(defun function-location (function) - "Return the source location for FUNCTION." - (cond ((struct-closure-p function) - (struct-closure-location function)) - ((c::byte-function-or-closure-p function) - (byte-function-location function)) - (t - (compiled-function-location function)))) - -(defun compiled-function-location (function) - "Return the location of a regular compiled function." - (multiple-value-bind (code-location error) - (safe-definition-finding (function-first-code-location function)) - (cond (error (list :error (princ-to-string error))) - (t (code-location-source-location code-location))))) - -(defun function-first-code-location (function) - "Return the first code-location we can find for 'function." - (and (function-has-debug-function-p function) - (di:debug-function-start-location - (di:function-debug-function function)))) - -(defun function-has-debug-function-p (function) - (di:function-debug-function function)) - -(defun function-code-object= (closure function) - (and (eq (vm::find-code-object closure) - (vm::find-code-object function)) - (not (eq closure function)))) - - -(defun byte-function-location (fn) - "Return the location of the byte-compiled function 'fn." - (etypecase fn - ((or c::hairy-byte-function c::simple-byte-function) - (let* ((component (c::byte-function-component fn)) - (debug-info (kernel:%code-debug-info component))) - (debug-info-function-name-location debug-info))) - (c::byte-closure - (byte-function-location (c::byte-closure-function fn))))) - -;;; Here we deal with structure accessors. Note that `dd' is a -;;; "defstruct descriptor" structure in SCL. A `dd' describes a -;;; `defstruct''d structure. - -(defun struct-closure-p (function) - "Is 'function a closure created by defstruct?" - (or (function-code-object= function #'kernel::structure-slot-accessor) - (function-code-object= function #'kernel::structure-slot-setter) - (function-code-object= function #'kernel::%defstruct))) - -(defun struct-closure-location (function) - "Return the location of the structure that 'function belongs to." - (assert (struct-closure-p function)) - (safe-definition-finding - (dd-location (struct-closure-dd function)))) - -(defun struct-closure-dd (function) - "Return the defstruct-definition (dd) of FUNCTION." - (assert (= (kernel:get-type function) vm:closure-header-type)) - (flet ((find-layout (function) - (sys:find-if-in-closure - (lambda (x) - (let ((value (if (di::indirect-value-cell-p x) - (c:value-cell-ref x) - x))) - (when (kernel::layout-p value) - (return-from find-layout value)))) - function))) - (kernel:layout-info (find-layout function)))) - -(defun dd-location (dd) - "Return the location of a `defstruct'." - ;; Find the location in a constructor. - (function-location (struct-constructor dd))) - -(defun struct-constructor (dd) - "Return a constructor function from a defstruct definition. -Signal an error if no constructor can be found." - (let ((constructor (or (kernel:dd-default-constructor dd) - (car (kernel::dd-constructors dd))))) - (when (or (null constructor) - (and (consp constructor) (null (car constructor)))) - (error "Cannot find structure's constructor: ~S" - (kernel::dd-name dd))) - (coerce (if (consp constructor) (first constructor) constructor) - 'function))) - -;;;;;; Generic functions and methods - -(defun generic-function-definitions (name function) - "Return the definitions of a generic function and its methods." - (cons (list `(defgeneric ,name) (gf-location function)) - (gf-method-definitions function))) - -(defun gf-location (gf) - "Return the location of the generic function GF." - (definition-source-location gf (clos:generic-function-name gf))) - -(defun gf-method-definitions (gf) - "Return the locations of all methods of the generic function GF." - (mapcar #'method-definition (clos:generic-function-methods gf))) - -(defun method-definition (method) - (list (method-dspec method) - (method-location method))) - -(defun method-dspec (method) - "Return a human-readable \"definition specifier\" for METHOD." - (let* ((gf (clos:method-generic-function method)) - (name (clos:generic-function-name gf)) - (specializers (clos:method-specializers method)) - (qualifiers (clos:method-qualifiers method))) - `(method ,name ,@qualifiers ,specializers - #+nil (clos::unparse-specializers specializers)))) - -;; XXX maybe special case setters/getters -(defun method-location (method) - (function-location (clos:method-function method))) - -(defun genericp (fn) - (typep fn 'generic-function)) - -;;;;;; Types and classes - -(defun type-definitions (name) - "Return `deftype' locations for type NAME." - (maybe-make-definition (ext:info :type :expander name) 'deftype name)) - -(defun maybe-make-definition (function kind name) - "If FUNCTION is non-nil then return its definition location." - (if function - (list (list `(,kind ,name) (function-location function))))) - -(defun class-definitions (name) - "Return the definition locations for the class called NAME." - (if (symbolp name) - (let ((class (find-class name nil))) - (etypecase class - (null '()) - (structure-class - (list (list `(defstruct ,name) - (dd-location (find-dd name))))) - (standard-class - (list (list `(defclass ,name) - (class-location (find-class name))))) - ((or built-in-class - kernel:funcallable-structure-class) - (list (list `(kernel::define-type-class ,name) - `(:error - ,(format nil "No source info for ~A" name))))))))) - -(defun class-location (class) - "Return the `defclass' location for CLASS." - (definition-source-location class (class-name class))) - -(defun find-dd (name) - "Find the defstruct-definition by the name of its structure-class." - (let ((layout (ext:info :type :compiler-layout name))) - (if layout - (kernel:layout-info layout)))) - -(defun condition-class-location (class) - (let ((name (class-name class))) - `(:error ,(format nil "No location info for condition: ~A" name)))) - -(defun make-name-in-file-location (file string) - (multiple-value-bind (filename c) - (ignore-errors - (unix-truename (merge-pathnames (make-pathname :type "lisp") - file))) - (cond (filename (make-location `(:file ,filename) - `(:function-name ,(string string)))) - (t (list :error (princ-to-string c)))))) - -(defun definition-source-location (object name) - `(:error ,(format nil "No source info for: ~A" object))) - -(defun setf-definitions (name) - (let ((function (or (ext:info :setf :inverse name) - (ext:info :setf :expander name)))) - (if function - (list (list `(setf ,name) - (function-location (coerce function 'function))))))) - - -(defun variable-location (symbol) - `(:error ,(format nil "No source info for variable ~S" symbol))) - -(defun variable-definitions (name) - (if (symbolp name) - (multiple-value-bind (kind recorded-p) (ext:info :variable :kind name) - (if recorded-p - (list (list `(variable ,kind ,name) - (variable-location name))))))) - -(defun compiler-macro-definitions (symbol) - (maybe-make-definition (compiler-macro-function symbol) - 'define-compiler-macro - symbol)) - -(defun source-transform-definitions (name) - (maybe-make-definition (ext:info :function :source-transform name) - 'c:def-source-transform - name)) - -(defun function-info-definitions (name) - (let ((info (ext:info :function :info name))) - (if info - (append (loop for transform in (c::function-info-transforms info) - collect (list `(c:deftransform ,name - ,(c::type-specifier - (c::transform-type transform))) - (function-location (c::transform-function - transform)))) - (maybe-make-definition (c::function-info-derive-type info) - 'c::derive-type name) - (maybe-make-definition (c::function-info-optimizer info) - 'c::optimizer name) - (maybe-make-definition (c::function-info-ltn-annotate info) - 'c::ltn-annotate name) - (maybe-make-definition (c::function-info-ir2-convert info) - 'c::ir2-convert name) - (loop for template in (c::function-info-templates info) - collect (list `(c::vop ,(c::template-name template)) - (function-location - (c::vop-info-generator-function - template)))))))) - -(defun ir1-translator-definitions (name) - (maybe-make-definition (ext:info :function :ir1-convert name) - 'c:def-ir1-translator name)) - - -;;;; Documentation. - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (flet ((doc (kind) - (or (documentation symbol kind) :not-documented)) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push - :variable (multiple-value-bind (kind recorded-p) - (ext:info variable kind symbol) - (declare (ignore kind)) - (if (or (boundp symbol) recorded-p) - (doc 'variable)))) - (when (fboundp symbol) - (maybe-push - (cond ((macro-function symbol) :macro) - ((special-operator-p symbol) :special-operator) - ((genericp (fdefinition symbol)) :generic-function) - (t :function)) - (doc 'function))) - (maybe-push - :setf (if (or (ext:info setf inverse symbol) - (ext:info setf expander symbol)) - (doc 'setf))) - (maybe-push - :type (if (ext:info type kind symbol) - (doc 'type))) - (maybe-push - :class (if (find-class symbol nil) - (doc 'class))) - (maybe-push - :alien-type (if (not (eq (ext:info alien-type kind symbol) :unknown)) - (doc 'alien-type))) - (maybe-push - :alien-struct (if (ext:info alien-type struct symbol) - (doc nil))) - (maybe-push - :alien-union (if (ext:info alien-type union symbol) - (doc nil))) - (maybe-push - :alien-enum (if (ext:info alien-type enum symbol) - (doc nil))) - result))) - -(defimplementation describe-definition (symbol namespace) - (describe (ecase namespace - (:variable - symbol) - ((:function :generic-function) - (symbol-function symbol)) - (:setf - (or (ext:info setf inverse symbol) - (ext:info setf expander symbol))) - (:type - (kernel:values-specifier-type symbol)) - (:class - (find-class symbol)) - (:alien-struct - (ext:info :alien-type :struct symbol)) - (:alien-union - (ext:info :alien-type :union symbol)) - (:alien-enum - (ext:info :alien-type :enum symbol)) - (:alien-type - (ecase (ext:info :alien-type :kind symbol) - (:primitive - (let ((alien::*values-type-okay* t)) - (funcall (ext:info :alien-type :translator symbol) - (list symbol)))) - ((:defined) - (ext:info :alien-type :definition symbol)) - (:unknown :unknown)))))) - -;;;;; Argument lists - -(defimplementation arglist (fun) - (multiple-value-bind (args winp) - (ext:function-arglist fun) - (if winp args :not-available))) - -(defimplementation function-name (function) - (cond ((eval:interpreted-function-p function) - (eval:interpreted-function-name function)) - ((typep function 'generic-function) - (clos:generic-function-name function)) - ((c::byte-function-or-closure-p function) - (c::byte-function-name function)) - (t (kernel:%function-name (kernel:%function-self function))))) - - -;;; A harder case: an approximate arglist is derived from available -;;; debugging information. - -(defun debug-function-arglist (debug-function) - "Derive the argument list of DEBUG-FUNCTION from debug info." - (let ((args (di::debug-function-lambda-list debug-function)) - (required '()) - (optional '()) - (rest '()) - (key '())) - ;; collect the names of debug-vars - (dolist (arg args) - (etypecase arg - (di::debug-variable - (push (di::debug-variable-symbol arg) required)) - ((member :deleted) - (push ':deleted required)) - (cons - (ecase (car arg) - (:keyword - (push (second arg) key)) - (:optional - (push (debug-variable-symbol-or-deleted (second arg)) optional)) - (:rest - (push (debug-variable-symbol-or-deleted (second arg)) rest)))))) - ;; intersperse lambda keywords as needed - (append (nreverse required) - (if optional (cons '&optional (nreverse optional))) - (if rest (cons '&rest (nreverse rest))) - (if key (cons '&key (nreverse key)))))) - -(defun debug-variable-symbol-or-deleted (var) - (etypecase var - (di:debug-variable - (di::debug-variable-symbol var)) - ((member :deleted) - '#:deleted))) - -(defun symbol-debug-function-arglist (fname) - "Return FNAME's debug-function-arglist and %function-arglist. - A utility for debugging DEBUG-FUNCTION-ARGLIST." - (let ((fn (fdefinition fname))) - (values (debug-function-arglist (di::function-debug-function fn)) - (kernel:%function-arglist (kernel:%function-self fn))))) - - -;;;; Miscellaneous. - -(defimplementation macroexpand-all (form &optional env) - (declare (ignore env)) - (macroexpand form)) - -(defimplementation set-default-directory (directory) - (setf (ext:default-directory) (namestring directory)) - ;; Setting *default-pathname-defaults* to an absolute directory - ;; makes the behavior of MERGE-PATHNAMES a bit more intuitive. - (setf *default-pathname-defaults* (pathname (ext:default-directory))) - (default-directory)) - -(defimplementation default-directory () - (namestring (ext:default-directory))) - -(defimplementation pathname-to-filename (pathname) - (ext:unix-namestring pathname nil)) - -(defimplementation getpid () - (unix:unix-getpid)) - -(defimplementation lisp-implementation-type-name () - (if (eq ext:*case-mode* :upper) "scl" "scl-lower")) - -(defimplementation quit-lisp () - (ext:quit)) - -;;; source-path-{stream,file,string,etc}-position moved into -;;; source-path-parser - - -;;;; Debugging - -(defvar *sldb-stack-top*) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (let* ((*sldb-stack-top* (or debug:*stack-top-hint* (di:top-frame))) - (debug:*stack-top-hint* nil) - (kernel:*current-level* 0)) - (handler-bind ((di::unhandled-condition - (lambda (condition) - (error 'sldb-condition - :original-condition condition)))) - (funcall debugger-loop-fn)))) - -(defun frame-down (frame) - (handler-case (di:frame-down frame) - (di:no-debug-info () nil))) - -(defun nth-frame (index) - (do ((frame *sldb-stack-top* (frame-down frame)) - (i index (1- i))) - ((zerop i) frame))) - -(defimplementation compute-backtrace (start end) - (let ((end (or end most-positive-fixnum))) - (loop for f = (nth-frame start) then (frame-down f) - for i from start below end - while f collect f))) - -(defimplementation print-frame (frame stream) - (let ((*standard-output* stream)) - (handler-case - (debug::print-frame-call frame :verbosity 1 :number nil) - (error (e) - (ignore-errors (princ e stream)))))) - -(defimplementation frame-source-location (index) - (code-location-source-location (di:frame-code-location (nth-frame index)))) - -(defimplementation eval-in-frame (form index) - (di:eval-in-frame (nth-frame index) form)) - -(defun frame-debug-vars (frame) - "Return a vector of debug-variables in frame." - (di::debug-function-debug-variables (di:frame-debug-function frame))) - -(defun debug-var-value (var frame location) - (let ((validity (di:debug-variable-validity var location))) - (ecase validity - (:valid (di:debug-variable-value var frame)) - ((:invalid :unknown) (make-symbol (string validity)))))) - -(defimplementation frame-locals (index) - (let* ((frame (nth-frame index)) - (loc (di:frame-code-location frame)) - (vars (frame-debug-vars frame))) - (loop for v across vars collect - (list :name (di:debug-variable-symbol v) - :id (di:debug-variable-id v) - :value (debug-var-value v frame loc))))) - -(defimplementation frame-var-value (frame var) - (let* ((frame (nth-frame frame)) - (dvar (aref (frame-debug-vars frame) var))) - (debug-var-value dvar frame (di:frame-code-location frame)))) - -(defimplementation frame-catch-tags (index) - (mapcar #'car (di:frame-catches (nth-frame index)))) - -(defimplementation return-from-frame (index form) - (let ((sym (find-symbol (symbol-name '#:find-debug-tag-for-frame) - :debug-internals))) - (if sym - (let* ((frame (nth-frame index)) - (probe (funcall sym frame))) - (cond (probe (throw (car probe) (eval-in-frame form index))) - (t (format nil "Cannot return from frame: ~S" frame)))) - "return-from-frame is not implemented in this version of SCL."))) - -(defimplementation activate-stepping (frame) - (set-step-breakpoints (nth-frame frame))) - -(defimplementation sldb-break-on-return (frame) - (break-on-return (nth-frame frame))) - -;;; We set the breakpoint in the caller which might be a bit confusing. -;;; -(defun break-on-return (frame) - (let* ((caller (di:frame-down frame)) - (cl (di:frame-code-location caller))) - (flet ((hook (frame bp) - (when (frame-pointer= frame caller) - (di:delete-breakpoint bp) - (signal-breakpoint bp frame)))) - (let* ((info (ecase (di:code-location-kind cl) - ((:single-value-return :unknown-return) nil) - (:known-return (debug-function-returns - (di:frame-debug-function frame))))) - (bp (di:make-breakpoint #'hook cl :kind :code-location - :info info))) - (di:activate-breakpoint bp) - `(:ok ,(format nil "Set breakpoint in ~A" caller)))))) - -(defun frame-pointer= (frame1 frame2) - "Return true if the frame pointers of FRAME1 and FRAME2 are the same." - (sys:sap= (di::frame-pointer frame1) (di::frame-pointer frame2))) - -;;; The PC in escaped frames at a single-return-value point is -;;; actually vm:single-value-return-byte-offset bytes after the -;;; position given in the debug info. Here we try to recognize such -;;; cases. -;;; -(defun next-code-locations (frame code-location) - "Like `debug::next-code-locations' but be careful in escaped frames." - (let ((next (debug::next-code-locations code-location))) - (flet ((adjust-pc () - (let ((cl (di::copy-compiled-code-location code-location))) - (incf (di::compiled-code-location-pc cl) - vm:single-value-return-byte-offset) - cl))) - (cond ((and (di::compiled-frame-escaped frame) - (eq (di:code-location-kind code-location) - :single-value-return) - (= (length next) 1) - (di:code-location= (car next) (adjust-pc))) - (debug::next-code-locations (car next))) - (t - next))))) - -(defun set-step-breakpoints (frame) - (let ((cl (di:frame-code-location frame))) - (when (di:debug-block-elsewhere-p (di:code-location-debug-block cl)) - (error "Cannot step in elsewhere code")) - (let* ((debug::*bad-code-location-types* - (remove :call-site debug::*bad-code-location-types*)) - (next (next-code-locations frame cl))) - (cond (next - (let ((steppoints '())) - (flet ((hook (bp-frame bp) - (signal-breakpoint bp bp-frame) - (mapc #'di:delete-breakpoint steppoints))) - (dolist (code-location next) - (let ((bp (di:make-breakpoint #'hook code-location - :kind :code-location))) - (di:activate-breakpoint bp) - (push bp steppoints)))))) - (t - (break-on-return frame)))))) - - -;; XXX the return values at return breakpoints should be passed to the -;; user hooks. debug-int.lisp should be changed to do this cleanly. - -;;; The sigcontext and the PC for a breakpoint invocation are not -;;; passed to user hook functions, but we need them to extract return -;;; values. So we advice di::handle-breakpoint and bind the values to -;;; special variables. -;;; -(defvar *breakpoint-sigcontext*) -(defvar *breakpoint-pc*) - -(defun sigcontext-object (sc index) - "Extract the lisp object in sigcontext SC at offset INDEX." - (kernel:make-lisp-obj (vm:ucontext-register sc index))) - -(defun known-return-point-values (sigcontext sc-offsets) - (let ((fp (system:int-sap (vm:ucontext-register sigcontext - vm::cfp-offset)))) - (system:without-gcing - (loop for sc-offset across sc-offsets - collect (di::sub-access-debug-var-slot fp sc-offset sigcontext))))) - -;;; SCL returns the first few values in registers and the rest on -;;; the stack. In the multiple value case, the number of values is -;;; stored in a dedicated register. The values of the registers can be -;;; accessed in the sigcontext for the breakpoint. There are 3 kinds -;;; of return conventions: :single-value-return, :unknown-return, and -;;; :known-return. -;;; -;;; The :single-value-return convention returns the value in a -;;; register without setting the nargs registers. -;;; -;;; The :unknown-return variant is used for multiple values. A -;;; :unknown-return point consists actually of 2 breakpoints: one for -;;; the single value case and one for the general case. The single -;;; value breakpoint comes vm:single-value-return-byte-offset after -;;; the multiple value breakpoint. -;;; -;;; The :known-return convention is used by local functions. -;;; :known-return is currently not supported because we don't know -;;; where the values are passed. -;;; -(defun breakpoint-values (breakpoint) - "Return the list of return values for a return point." - (flet ((1st (sc) (sigcontext-object sc (car vm::register-arg-offsets)))) - (let ((sc (locally (declare (optimize (ext:inhibit-warnings 3))) - (alien:sap-alien *breakpoint-sigcontext* (* unix:ucontext)))) - (cl (di:breakpoint-what breakpoint))) - (ecase (di:code-location-kind cl) - (:single-value-return - (list (1st sc))) - (:known-return - (let ((info (di:breakpoint-info breakpoint))) - (if (vectorp info) - (known-return-point-values sc info) - (progn - ;;(break) - (list "<>" info))))) - (:unknown-return - (let ((mv-return-pc (di::compiled-code-location-pc cl))) - (if (= mv-return-pc *breakpoint-pc*) - (mv-function-end-breakpoint-values sc) - (list (1st sc))))))))) - -(defun mv-function-end-breakpoint-values (sigcontext) - (let ((sym (find-symbol - (symbol-name '#:function-end-breakpoint-values/standard) - :debug-internals))) - (cond (sym (funcall sym sigcontext)) - (t (di::get-function-end-breakpoint-values sigcontext))))) - -(defun debug-function-returns (debug-fun) - "Return the return style of DEBUG-FUN." - (let* ((cdfun (di::compiled-debug-function-compiler-debug-fun debug-fun))) - (c::compiled-debug-function-returns cdfun))) - -(define-condition breakpoint (simple-condition) - ((message :initarg :message :reader breakpoint.message) - (values :initarg :values :reader breakpoint.values)) - (:report (lambda (c stream) (princ (breakpoint.message c) stream)))) - -#+nil -(defimplementation condition-extras ((c breakpoint)) - ;; simply pop up the source buffer - `((:short-frame-source 0))) - -(defun signal-breakpoint (breakpoint frame) - "Signal a breakpoint condition for BREAKPOINT in FRAME. -Try to create a informative message." - (flet ((brk (values fstring &rest args) - (let ((msg (apply #'format nil fstring args)) - (debug:*stack-top-hint* frame)) - (break 'breakpoint :message msg :values values)))) - (with-struct (di::breakpoint- kind what) breakpoint - (case kind - (:code-location - (case (di:code-location-kind what) - ((:single-value-return :known-return :unknown-return) - (let ((values (breakpoint-values breakpoint))) - (brk values "Return value: ~{~S ~}" values))) - (t - #+(or) - (when (eq (di:code-location-kind what) :call-site) - (call-site-function breakpoint frame)) - (brk nil "Breakpoint: ~S ~S" - (di:code-location-kind what) - (di::compiled-code-location-pc what))))) - (:function-start - (brk nil "Function start breakpoint")) - (t (brk nil "Breakpoint: ~A in ~A" breakpoint frame)))))) - -#+nil -(defimplementation sldb-break-at-start (fname) - (let ((debug-fun (di:function-debug-function (coerce fname 'function)))) - (cond ((not debug-fun) - `(:error ,(format nil "~S has no debug-function" fname))) - (t - (flet ((hook (frame bp &optional args cookie) - (declare (ignore args cookie)) - (signal-breakpoint bp frame))) - (let ((bp (di:make-breakpoint #'hook debug-fun - :kind :function-start))) - (di:activate-breakpoint bp) - `(:ok ,(format nil "Set breakpoint in ~S" fname)))))))) - -(defun frame-cfp (frame) - "Return the Control-Stack-Frame-Pointer for FRAME." - (etypecase frame - (di::compiled-frame (di::frame-pointer frame)) - ((or di::interpreted-frame null) -1))) - -(defun frame-ip (frame) - "Return the (absolute) instruction pointer and the relative pc of FRAME." - (if (not frame) - -1 - (let ((debug-fun (di::frame-debug-function frame))) - (etypecase debug-fun - (di::compiled-debug-function - (let* ((code-loc (di:frame-code-location frame)) - (component (di::compiled-debug-function-component debug-fun)) - (pc (di::compiled-code-location-pc code-loc)) - (ip (sys:without-gcing - (sys:sap-int - (sys:sap+ (kernel:code-instructions component) pc))))) - (values ip pc))) - ((or di::bogus-debug-function di::interpreted-debug-function) - -1))))) - -(defun frame-registers (frame) - "Return the lisp registers CSP, CFP, IP, OCFP, LRA for FRAME-NUMBER." - (let* ((cfp (frame-cfp frame)) - (csp (frame-cfp (di::frame-up frame))) - (ip (frame-ip frame)) - (ocfp (frame-cfp (di::frame-down frame))) - (lra (frame-ip (di::frame-down frame)))) - (values csp cfp ip ocfp lra))) - -(defun print-frame-registers (frame-number) - (let ((frame (di::frame-real-frame (nth-frame frame-number)))) - (flet ((fixnum (p) (etypecase p - (integer p) - (sys:system-area-pointer (sys:sap-int p))))) - (apply #'format t "~ -CSP = ~X -CFP = ~X -IP = ~X -OCFP = ~X -LRA = ~X~%" (mapcar #'fixnum - (multiple-value-list (frame-registers frame))))))) - - -(defimplementation disassemble-frame (frame-number) - "Return a string with the disassembly of frames code." - (print-frame-registers frame-number) - (terpri) - (let* ((frame (di::frame-real-frame (nth-frame frame-number))) - (debug-fun (di::frame-debug-function frame))) - (etypecase debug-fun - (di::compiled-debug-function - (let* ((component (di::compiled-debug-function-component debug-fun)) - (fun (di:debug-function-function debug-fun))) - (if fun - (disassemble fun) - (disassem:disassemble-code-component component)))) - (di::bogus-debug-function - (format t "~%[Disassembling bogus frames not implemented]"))))) - - -;;;; Inspecting - -(defconstant +lowtag-symbols+ - '(vm:even-fixnum-type - vm:instance-pointer-type - vm:other-immediate-0-type - vm:list-pointer-type - vm:odd-fixnum-type - vm:function-pointer-type - vm:other-immediate-1-type - vm:other-pointer-type) - "Names of the constants that specify type tags. -The `symbol-value' of each element is a type tag.") - -(defconstant +header-type-symbols+ - (labels ((suffixp (suffix string) - (and (>= (length string) (length suffix)) - (string= string suffix :start1 (- (length string) - (length suffix))))) - (header-type-symbol-p (x) - (and (suffixp (symbol-name '#:-type) (symbol-name x)) - (not (member x +lowtag-symbols+)) - (boundp x) - (typep (symbol-value x) 'fixnum)))) - (remove-if-not #'header-type-symbol-p - (append (apropos-list (symbol-name '#:-type) :vm) - (apropos-list (symbol-name '#:-type) :bignum)))) - "A list of names of the type codes in boxed objects.") - -(defimplementation describe-primitive-type (object) - (with-output-to-string (*standard-output*) - (let* ((lowtag (kernel:get-lowtag object)) - (lowtag-symbol (find lowtag +lowtag-symbols+ :key #'symbol-value))) - (format t "lowtag: ~A" lowtag-symbol) - (when (member lowtag (list vm:other-pointer-type - vm:function-pointer-type - vm:other-immediate-0-type - vm:other-immediate-1-type - )) - (let* ((type (kernel:get-type object)) - (type-symbol (find type +header-type-symbols+ - :key #'symbol-value))) - (format t ", type: ~A" type-symbol)))))) - -(defmethod emacs-inspect ((o t)) - (cond ((di::indirect-value-cell-p o) - `("Value: " (:value ,(c:value-cell-ref o)))) - ((alien::alien-value-p o) - (inspect-alien-value o)) - (t - (scl-inspect o)))) - -(defun scl-inspect (o) - (destructuring-bind (text labeledp . parts) - (inspect::describe-parts o) - (list* (format nil "~A~%" text) - (if labeledp - (loop for (label . value) in parts - append (label-value-line label value)) - (loop for value in parts for i from 0 - append (label-value-line i value)))))) - -(defmethod emacs-inspect ((o function)) - (let ((header (kernel:get-type o))) - (cond ((= header vm:function-header-type) - (list* (format nil "~A is a function.~%" o) - (append (label-value-line* - ("Self" (kernel:%function-self o)) - ("Next" (kernel:%function-next o)) - ("Name" (kernel:%function-name o)) - ("Arglist" (kernel:%function-arglist o)) - ("Type" (kernel:%function-type o)) - ("Code" (kernel:function-code-header o))) - (list - (with-output-to-string (s) - (disassem:disassemble-function o :stream s)))))) - ((= header vm:closure-header-type) - (list* (format nil "~A is a closure.~%" o) - (append - (label-value-line "Function" (kernel:%closure-function o)) - `("Environment:" (:newline)) - (loop for i from 0 below (- (kernel:get-closure-length o) - (1- vm:closure-info-offset)) - append (label-value-line - i (kernel:%closure-index-ref o i)))))) - ((eval::interpreted-function-p o) - (scl-inspect o)) - (t - (call-next-method))))) - - -(defmethod emacs-inspect ((o kernel:code-component)) - (append - (label-value-line* - ("code-size" (kernel:%code-code-size o)) - ("entry-points" (kernel:%code-entry-points o)) - ("debug-info" (kernel:%code-debug-info o)) - ("trace-table-offset" (kernel:code-header-ref - o vm:code-trace-table-offset-slot))) - `("Constants:" (:newline)) - (loop for i from vm:code-constants-offset - below (kernel:get-header-data o) - append (label-value-line i (kernel:code-header-ref o i))) - `("Code:" (:newline) - , (with-output-to-string (s) - (cond ((kernel:%code-debug-info o) - (disassem:disassemble-code-component o :stream s)) - (t - (disassem:disassemble-memory - (disassem::align - (+ (logandc2 (kernel:get-lisp-obj-address o) - vm:lowtag-mask) - (* vm:code-constants-offset vm:word-bytes)) - (ash 1 vm:lowtag-bits)) - (ash (kernel:%code-code-size o) vm:word-shift) - :stream s))))))) - -(defmethod emacs-inspect ((o kernel:fdefn)) - (label-value-line* - ("name" (kernel:fdefn-name o)) - ("function" (kernel:fdefn-function o)) - ("raw-addr" (sys:sap-ref-32 - (sys:int-sap (kernel:get-lisp-obj-address o)) - (* vm:fdefn-raw-addr-slot vm:word-bytes))))) - -(defmethod emacs-inspect ((o array)) - (cond ((kernel:array-header-p o) - (list* (format nil "~A is an array.~%" o) - (label-value-line* - (:header (describe-primitive-type o)) - (:rank (array-rank o)) - (:fill-pointer (kernel:%array-fill-pointer o)) - (:fill-pointer-p (kernel:%array-fill-pointer-p o)) - (:elements (kernel:%array-available-elements o)) - (:data (kernel:%array-data-vector o)) - (:displacement (kernel:%array-displacement o)) - (:displaced-p (kernel:%array-displaced-p o)) - (:dimensions (array-dimensions o))))) - (t - (list* (format nil "~A is an simple-array.~%" o) - (label-value-line* - (:header (describe-primitive-type o)) - (:length (length o))))))) - -(defmethod emacs-inspect ((o simple-vector)) - (list* (format nil "~A is a vector.~%" o) - (append - (label-value-line* - (:header (describe-primitive-type o)) - (:length (c::vector-length o))) - (unless (eq (array-element-type o) 'nil) - (loop for i below (length o) - append (label-value-line i (aref o i))))))) - -(defun inspect-alien-record (alien) - (with-struct (alien::alien-value- sap type) alien - (with-struct (alien::alien-record-type- kind name fields) type - (append - (label-value-line* - (:sap sap) - (:kind kind) - (:name name)) - (loop for field in fields - append (let ((slot (alien::alien-record-field-name field))) - (label-value-line slot (alien:slot alien slot)))))))) - -(defun inspect-alien-pointer (alien) - (with-struct (alien::alien-value- sap type) alien - (label-value-line* - (:sap sap) - (:type type) - (:to (alien::deref alien))))) - -(defun inspect-alien-value (alien) - (typecase (alien::alien-value-type alien) - (alien::alien-record-type (inspect-alien-record alien)) - (alien::alien-pointer-type (inspect-alien-pointer alien)) - (t (scl-inspect alien)))) - -;;;; Profiling -(defimplementation profile (fname) - (eval `(profile:profile ,fname))) - -(defimplementation unprofile (fname) - (eval `(profile:unprofile ,fname))) - -(defimplementation unprofile-all () - (eval `(profile:unprofile)) - "All functions unprofiled.") - -(defimplementation profile-report () - (eval `(profile:report-time))) - -(defimplementation profile-reset () - (eval `(profile:reset-time)) - "Reset profiling counters.") - -(defimplementation profiled-functions () - profile:*timed-functions*) - -(defimplementation profile-package (package callers methods) - (profile:profile-all :package package - :callers-p callers - #+nil :methods #+nil methods)) - - -;;;; Multiprocessing - -(defimplementation spawn (fn &key name) - (thread:thread-create fn :name (or name "Anonymous"))) - -(defvar *thread-id-counter* 0) -(defvar *thread-id-counter-lock* (thread:make-lock "Thread ID counter")) - -(defimplementation thread-id (thread) - (thread:with-lock-held (*thread-id-counter-lock*) - (or (getf (thread:thread-plist thread) 'id) - (setf (getf (thread:thread-plist thread) 'id) - (incf *thread-id-counter*))))) - -(defimplementation find-thread (id) - (block find-thread - (thread:map-over-threads - #'(lambda (thread) - (when (eql (getf (thread:thread-plist thread) 'id) id) - (return-from find-thread thread)))))) - -(defimplementation thread-name (thread) - (princ-to-string (thread:thread-name thread))) - -(defimplementation thread-status (thread) - (let ((dynamic-values (thread::thread-dynamic-values thread))) - (if (zerop dynamic-values) "Exited" "Running"))) - -(defimplementation make-lock (&key name) - (thread:make-lock name)) - -(defimplementation call-with-lock-held (lock function) - (declare (type function function)) - (thread:with-lock-held (lock) (funcall function))) - -(defimplementation current-thread () - thread:*thread*) - -(defimplementation all-threads () - (let ((all-threads nil)) - (thread:map-over-threads #'(lambda (thread) (push thread all-threads))) - all-threads)) - -(defimplementation interrupt-thread (thread fn) - (thread:thread-interrupt thread #'(lambda () - (sys:with-interrupts - (funcall fn))))) - -(defimplementation kill-thread (thread) - (thread:destroy-thread thread)) - -(defimplementation thread-alive-p (thread) - (not (zerop (thread::thread-dynamic-values thread)))) - -(defvar *mailbox-lock* (thread:make-lock "Mailbox lock" :interruptible nil)) - -(defstruct (mailbox) - (lock (thread:make-lock "Thread mailbox" :type :error-check - :interruptible nil) - :type thread:error-check-lock) - (queue '() :type list)) - -(defun mailbox (thread) - "Return 'thread's mailbox." - (sys:without-interrupts - (thread:with-lock-held (*mailbox-lock*) - (or (getf (thread:thread-plist thread) 'mailbox) - (setf (getf (thread:thread-plist thread) 'mailbox) - (make-mailbox)))))) - -(defimplementation send (thread message) - (let* ((mbox (mailbox thread)) - (lock (mailbox-lock mbox))) - (sys:without-interrupts - (thread:with-lock-held (lock "Mailbox Send") - (setf (mailbox-queue mbox) (nconc (mailbox-queue mbox) - (list message))))) - (mp:process-wakeup thread))) - -#+nil -(defimplementation receive () - (receive-if (constantly t))) - -(defimplementation receive-if (test &optional timeout) - (let ((mbox (mailbox thread:*thread*))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (sys:without-interrupts - (mp:with-lock-held ((mailbox-lock mbox)) - (let* ((q (mailbox-queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox-queue mbox) - (nconc (ldiff q tail) (cdr tail))) - (return (car tail)))))) - (when (eq timeout t) (return (values nil t))) - (mp:process-wait-with-timeout - "Mailbox read wait" 0.5 (lambda () (some test (mailbox-queue mbox))))))) - - - -(defimplementation emacs-connected ()) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;Trace implementations -;; In SCL, we have: -;; (trace ) -;; (trace (method ? (+))) -;; (trace :methods t ') ;;to trace all methods of the gf -;; can be a normal name or a (setf name) - -(defun tracedp (spec) - (member spec (eval '(trace)) :test #'equal)) - -(defun toggle-trace-aux (spec &rest options) - (cond ((tracedp spec) - (eval `(untrace ,spec)) - (format nil "~S is now untraced." spec)) - (t - (eval `(trace ,spec ,@options)) - (format nil "~S is now traced." spec)))) - -(defimplementation toggle-trace (spec) - (ecase (car spec) - ((setf) - (toggle-trace-aux spec)) - ((:defgeneric) - (let ((name (second spec))) - (toggle-trace-aux name :methods name))) - ((:defmethod) - nil) - ((:call) - (destructuring-bind (caller callee) (cdr spec) - (toggle-trace-aux (process-fspec callee) - :wherein (list (process-fspec caller))))))) - -(defun process-fspec (fspec) - (cond ((consp fspec) - (ecase (first fspec) - ((:defun :defgeneric) (second fspec)) - ((:defmethod) - `(method ,(second fspec) ,@(third fspec) ,(fourth fspec))) - ;; this isn't actually supported - ((:labels) `(labels ,(process-fspec (second fspec)) ,(third fspec))) - ((:flet) `(flet ,(process-fspec (second fspec)) ,(third fspec))))) - (t - fspec))) - -;;; Weak datastructures - -;;; Not implemented in SCL. -(defimplementation make-weak-key-hash-table (&rest args) - (apply #'make-hash-table :weak-p t args)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/source-file-cache.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/source-file-cache.lisp deleted file mode 100644 index e639ea1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/source-file-cache.lisp +++ /dev/null @@ -1,136 +0,0 @@ -;;;; Source-file cache -;;; -;;; To robustly find source locations in CMUCL and SBCL it's useful to -;;; have the exact source code that the loaded code was compiled from. -;;; In this source we can accurately find the right location, and from -;;; that location we can extract a "snippet" of code to show what the -;;; definition looks like. Emacs can use this snippet in a best-match -;;; search to locate the right definition, which works well even if -;;; the buffer has been modified. -;;; -;;; The idea is that if a definition previously started with -;;; `(define-foo bar' then it probably still does. -;;; -;;; Whenever we see that the file on disk has the same -;;; `file-write-date' as a location we're looking for we cache the -;;; whole file inside Lisp. That way we will still have the matching -;;; version even if the file is later modified on disk. If the file is -;;; later recompiled and reloaded then we replace our cache entry. -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. - -(defpackage swank/source-file-cache - (:use cl) - (:import-from swank/backend - defimplementation buffer-first-change - guess-external-format - find-external-format) - (:export - get-source-code - source-cache-get ;FIXME: isn't it odd that both are exported? - - *source-snippet-size* - read-snippet - read-snippet-from-string - )) - -(in-package swank/source-file-cache) - -(defvar *cache-sourcecode* t - "When true complete source files are cached. -The cache is used to keep known good copies of the source text which -correspond to the loaded code. Finding definitions is much more -reliable when the exact source is available, so we cache it in case it -gets edited on disk later.") - -(defvar *source-file-cache* (make-hash-table :test 'equal) - "Cache of source file contents. -Maps from truename to source-cache-entry structure.") - -(defstruct (source-cache-entry - (:conc-name source-cache-entry.) - (:constructor make-source-cache-entry (text date))) - text date) - -(defimplementation buffer-first-change (filename) - "Load a file into the cache when the user modifies its buffer. -This is a win if the user then saves the file and tries to M-. into it." - (unless (source-cached-p filename) - (ignore-errors - (source-cache-get filename (file-write-date filename)))) - nil) - -(defun get-source-code (filename code-date) - "Return the source code for FILENAME as written on DATE in a string. -If the exact version cannot be found then return the current one from disk." - (or (source-cache-get filename code-date) - (read-file filename))) - -(defun source-cache-get (filename date) - "Return the source code for FILENAME as written on DATE in a string. -Return NIL if the right version cannot be found." - (when *cache-sourcecode* - (let ((entry (gethash filename *source-file-cache*))) - (cond ((and entry (equal date (source-cache-entry.date entry))) - ;; Cache hit. - (source-cache-entry.text entry)) - ((or (null entry) - (not (equal date (source-cache-entry.date entry)))) - ;; Cache miss. - (if (equal (file-write-date filename) date) - ;; File on disk has the correct version. - (let ((source (read-file filename))) - (setf (gethash filename *source-file-cache*) - (make-source-cache-entry source date)) - source) - nil)))))) - -(defun source-cached-p (filename) - "Is any version of FILENAME in the source cache?" - (if (gethash filename *source-file-cache*) t)) - -(defun read-file (filename) - "Return the entire contents of FILENAME as a string." - (with-open-file (s filename :direction :input - :external-format (or (guess-external-format filename) - (find-external-format "latin-1") - :default)) - (let* ((string (make-string (file-length s))) - (length (read-sequence string s))) - (subseq string 0 length)))) - -;;;; Snippets - -(defvar *source-snippet-size* 256 - "Maximum number of characters in a snippet of source code. -Snippets at the beginning of definitions are used to tell Emacs what -the definitions looks like, so that it can accurately find them by -text search.") - -(defun read-snippet (stream &optional position) - "Read a string of upto *SOURCE-SNIPPET-SIZE* characters from STREAM. -If POSITION is given, set the STREAM's file position first." - (when position - (file-position stream position)) - #+sbcl (skip-comments-and-whitespace stream) - (read-upto-n-chars stream *source-snippet-size*)) - -(defun read-snippet-from-string (string &optional position) - (with-input-from-string (s string) - (read-snippet s position))) - -(defun skip-comments-and-whitespace (stream) - (case (peek-char nil stream nil nil) - ((#\Space #\Tab #\Newline #\Linefeed #\Page) - (read-char stream) - (skip-comments-and-whitespace stream)) - (#\; - (read-line stream) - (skip-comments-and-whitespace stream)))) - -(defun read-upto-n-chars (stream n) - "Return a string of upto N chars from STREAM." - (let* ((string (make-string n)) - (chars (read-sequence string stream))) - (subseq string 0 chars))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/source-path-parser.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/source-path-parser.lisp deleted file mode 100644 index bb9c35c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/swank/source-path-parser.lisp +++ /dev/null @@ -1,239 +0,0 @@ -;;;; Source-paths - -;;; CMUCL/SBCL use a data structure called "source-path" to locate -;;; subforms. The compiler assigns a source-path to each form in a -;;; compilation unit. Compiler notes usually contain the source-path -;;; of the error location. -;;; -;;; Compiled code objects don't contain source paths, only the -;;; "toplevel-form-number" and the (sub-) "form-number". To get from -;;; the form-number to the source-path we need the entire toplevel-form -;;; (i.e. we have to read the source code). CMUCL has already some -;;; utilities to do this translation, but we use some extended -;;; versions, because we need more exact position info. Apparently -;;; Hemlock is happy with the position of the toplevel-form; we also -;;; need the position of subforms. -;;; -;;; We use a special readtable to get the positions of the subforms. -;;; The readtable stores the start and end position for each subform in -;;; hashtable for later retrieval. -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. - -;;; Taken from swank-cmucl.lisp, by Helmut Eller - -(defpackage swank/source-path-parser - (:use cl) - (:export - read-source-form - source-path-string-position - source-path-file-position - source-path-source-position - - sexp-in-bounds-p - sexp-ref) - (:shadow ignore-errors)) - -(in-package swank/source-path-parser) - -;; Some test to ensure the required conformance -(let ((rt (copy-readtable nil))) - (assert (or (not (get-macro-character #\space rt)) - (nth-value 1 (get-macro-character #\space rt)))) - (assert (not (get-macro-character #\\ rt)))) - -(eval-when (:compile-toplevel) - (defmacro ignore-errors (&rest forms) - ;;`(progn . ,forms) ; for debugging - `(cl:ignore-errors . ,forms))) - -(defun make-sharpdot-reader (orig-sharpdot-reader) - (lambda (s c n) - ;; We want things like M-. to work regardless of any #.-fu in - ;; the source file that is to be visited. (For instance, when a - ;; file contains #. forms referencing constants that do not - ;; currently exist in the image.) - (ignore-errors (funcall orig-sharpdot-reader s c n)))) - -(defun make-source-recorder (fn source-map) - "Return a macro character function that does the same as FN, but -additionally stores the result together with the stream positions -before and after of calling FN in the hashtable SOURCE-MAP." - (lambda (stream char) - (let ((start (1- (file-position stream))) - (values (multiple-value-list (funcall fn stream char))) - (end (file-position stream))) - #+(or) - (format t "[~D \"~{~A~^, ~}\" ~D ~D ~S]~%" - start values end (char-code char) char) - (when values - (destructuring-bind (&optional existing-start &rest existing-end) - (car (gethash (car values) source-map)) - ;; Some macros may return what a sub-call to another macro - ;; produced, e.g. "#+(and) (a)" may end up saving (a) twice, - ;; once from #\# and once from #\(. If the saved form - ;; is a subform, don't save it again. - (unless (and existing-start existing-end - (<= start existing-start end) - (<= start existing-end end)) - (push (cons start end) (gethash (car values) source-map))))) - (values-list values)))) - -(defun make-source-recording-readtable (readtable source-map) - (declare (type readtable readtable) (type hash-table source-map)) - "Return a source position recording copy of READTABLE. -The source locations are stored in SOURCE-MAP." - (flet ((install-special-sharpdot-reader (rt) - (let ((fun (ignore-errors - (get-dispatch-macro-character #\# #\. rt)))) - (when fun - (let ((wrapper (make-sharpdot-reader fun))) - (set-dispatch-macro-character #\# #\. wrapper rt))))) - (install-wrappers (rt) - (dotimes (code 128) - (let ((char (code-char code))) - (multiple-value-bind (fun nt) (get-macro-character char rt) - (when fun - (let ((wrapper (make-source-recorder fun source-map))) - (set-macro-character char wrapper nt rt)))))))) - (let ((rt (copy-readtable readtable))) - (install-special-sharpdot-reader rt) - (install-wrappers rt) - rt))) - -;; FIXME: try to do this with *READ-SUPPRESS* = t to avoid interning. -;; Should be possible as we only need the right "list structure" and -;; not the right atoms. -(defun read-and-record-source-map (stream) - "Read the next object from STREAM. -Return the object together with a hashtable that maps -subexpressions of the object to stream positions." - (let* ((source-map (make-hash-table :test #'eq)) - (*readtable* (make-source-recording-readtable *readtable* source-map)) - (*read-suppress* nil) - (start (file-position stream)) - (form (ignore-errors (read stream))) - (end (file-position stream))) - ;; ensure that at least FORM is in the source-map - (unless (gethash form source-map) - (push (cons start end) (gethash form source-map))) - (values form source-map))) - -(defun starts-with-p (string prefix) - (declare (type string string prefix)) - (not (mismatch string prefix - :end1 (min (length string) (length prefix)) - :test #'char-equal))) - -(defun extract-package (line) - (declare (type string line)) - (let ((name (cadr (read-from-string line)))) - (find-package name))) - -#+(or) -(progn - (assert (extract-package "(in-package cl)")) - (assert (extract-package "(cl:in-package cl)")) - (assert (extract-package "(in-package \"CL\")")) - (assert (extract-package "(in-package #:cl)"))) - -;; FIXME: do something cleaner than this. -(defun readtable-for-package (package) - ;; KLUDGE: due to the load order we can't reference the swank - ;; package. - (funcall (read-from-string "swank::guess-buffer-readtable") - (string-upcase (package-name package)))) - -;; Search STREAM for a "(in-package ...)" form. Use that to derive -;; the values for *PACKAGE* and *READTABLE*. -;; -;; IDEA: move GUESS-READER-STATE to swank.lisp so that all backends -;; use the same heuristic and to avoid the need to access -;; swank::guess-buffer-readtable from here. -(defun guess-reader-state (stream) - (let* ((point (file-position stream)) - (pkg *package*)) - (file-position stream 0) - (loop for line = (read-line stream nil nil) do - (when (not line) (return)) - (when (or (starts-with-p line "(in-package ") - (starts-with-p line "(cl:in-package ")) - (let ((p (extract-package line))) - (when p (setf pkg p))) - (return))) - (file-position stream point) - (values (readtable-for-package pkg) pkg))) - -(defun skip-whitespace (stream) - (peek-char t stream nil nil)) - -;; Skip over N toplevel forms. -(defun skip-toplevel-forms (n stream) - (let ((*read-suppress* t)) - (dotimes (i n) - (read stream)) - (skip-whitespace stream))) - -(defun read-source-form (n stream) - "Read the Nth toplevel form number with source location recording. -Return the form and the source-map." - (multiple-value-bind (*readtable* *package*) (guess-reader-state stream) - (skip-toplevel-forms n stream) - (read-and-record-source-map stream))) - -(defun source-path-stream-position (path stream) - "Search the source-path PATH in STREAM and return its position." - (check-source-path path) - (destructuring-bind (tlf-number . path) path - (multiple-value-bind (form source-map) (read-source-form tlf-number stream) - (source-path-source-position (cons 0 path) form source-map)))) - -(defun check-source-path (path) - (unless (and (consp path) - (every #'integerp path)) - (error "The source-path ~S is not valid." path))) - -(defun source-path-string-position (path string) - (with-input-from-string (s string) - (source-path-stream-position path s))) - -(defun source-path-file-position (path filename) - ;; We go this long way round, and don't directly operate on the file - ;; stream because FILE-POSITION (used above) is not totally savy even - ;; on file character streams; on SBCL, FILE-POSITION returns the binary - ;; offset, and not the character offset---screwing up on Unicode. - (let ((toplevel-number (first path)) - (buffer)) - (with-open-file (file filename) - (skip-toplevel-forms (1+ toplevel-number) file) - (let ((endpos (file-position file))) - (setq buffer (make-array (list endpos) :element-type 'character - :initial-element #\Space)) - (assert (file-position file 0)) - (read-sequence buffer file :end endpos))) - (source-path-string-position path buffer))) - -(defgeneric sexp-in-bounds-p (sexp i) - (:method ((list list) i) - (< i (loop for e on list - count t))) - (:method ((sexp t) i) nil)) - -(defgeneric sexp-ref (sexp i) - (:method ((s list) i) (elt s i))) - -(defun source-path-source-position (path form source-map) - "Return the start position of PATH from FORM and SOURCE-MAP. All -subforms along the path are considered and the start and end position -of the deepest (i.e. smallest) possible form is returned." - ;; compute all subforms along path - (let ((forms (loop for i in path - for f = form then (if (sexp-in-bounds-p f i) - (sexp-ref f i)) - collect f))) - ;; select the first subform present in source-map - (loop for form in (nreverse forms) - for ((start . end) . rest) = (gethash form source-map) - when (and start end (not rest)) - return (return (values start end))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/xref.lisp b/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/xref.lisp deleted file mode 100644 index e09a150..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/slime-v2.24/xref.lisp +++ /dev/null @@ -1,2906 +0,0 @@ -;;; -*- Mode: LISP; Package: XREF; Syntax: Common-lisp; -*- -;;; Mon Jan 21 16:21:20 1991 by Mark Kantrowitz -;;; xref.lisp - -;;; **************************************************************** -;;; List Callers: A Static Analysis Cross Referencing Tool for Lisp -;;; **************************************************************** -;;; -;;; The List Callers system is a portable Common Lisp cross referencing -;;; utility. It grovels over a set of files and compiles a database of the -;;; locations of all references for each symbol used in the files. -;;; List Callers is similar to the Symbolics Who-Calls and the -;;; Xerox Masterscope facilities. -;;; -;;; When you change a function or variable definition, it can be useful -;;; to know its callers, in order to update each of them to the new -;;; definition. Similarly, having a graphic display of the structure -;;; (e.g., call graph) of a program can help make undocumented code more -;;; understandable. This static code analyzer facilitates both capabilities. -;;; The database compiled by xref is suitable for viewing by a graphical -;;; browser. (Note: the reference graph is not necessarily a DAG. Since many -;;; graphical browsers assume a DAG, this will lead to infinite loops. -;;; Some code which is useful in working around this problem is included, -;;; as well as a sample text-indenting outliner and an interface to Bates' -;;; PSGraph Postscript Graphing facility.) -;;; -;;; Written by Mark Kantrowitz, July 1990. -;;; -;;; Address: School of Computer Science -;;; Carnegie Mellon University -;;; Pittsburgh, PA 15213 -;;; -;;; Copyright (c) 1990. All rights reserved. -;;; -;;; See general license below. -;;; - -;;; **************************************************************** -;;; General License Agreement and Lack of Warranty ***************** -;;; **************************************************************** -;;; -;;; This software is distributed in the hope that it will be useful (both -;;; in and of itself and as an example of lisp programming), but WITHOUT -;;; ANY WARRANTY. The author(s) do not accept responsibility to anyone for -;;; the consequences of using it or for whether it serves any particular -;;; purpose or works at all. No warranty is made about the software or its -;;; performance. -;;; -;;; Use and copying of this software and the preparation of derivative -;;; works based on this software are permitted, so long as the following -;;; conditions are met: -;;; o The copyright notice and this entire notice are included intact -;;; and prominently carried on all copies and supporting documentation. -;;; o No fees or compensation are charged for use, copies, or -;;; access to this software. You may charge a nominal -;;; distribution fee for the physical act of transferring a -;;; copy, but you may not charge for the program itself. -;;; o If you modify this software, you must cause the modified -;;; file(s) to carry prominent notices (a Change Log) -;;; describing the changes, who made the changes, and the date -;;; of those changes. -;;; o Any work distributed or published that in whole or in part -;;; contains or is a derivative of this software or any part -;;; thereof is subject to the terms of this agreement. The -;;; aggregation of another unrelated program with this software -;;; or its derivative on a volume of storage or distribution -;;; medium does not bring the other program under the scope -;;; of these terms. -;;; o Permission is granted to manufacturers and distributors of -;;; lisp compilers and interpreters to include this software -;;; with their distribution. -;;; -;;; This software is made available AS IS, and is distributed without -;;; warranty of any kind, either expressed or implied. -;;; -;;; In no event will the author(s) or their institutions be liable to you -;;; for damages, including lost profits, lost monies, or other special, -;;; incidental or consequential damages arising out of or in connection -;;; with the use or inability to use (including but not limited to loss of -;;; data or data being rendered inaccurate or losses sustained by third -;;; parties or a failure of the program to operate as documented) the -;;; program, even if you have been advised of the possibility of such -;;; damanges, or for any claim by any other party, whether in an action of -;;; contract, negligence, or other tortious action. -;;; -;;; The current version of this software and a variety of related utilities -;;; may be obtained by anonymous ftp from ftp.cs.cmu.edu in the directory -;;; user/ai/lang/lisp/code/tools/xref/ -;;; -;;; Please send bug reports, comments, questions and suggestions to -;;; mkant@cs.cmu.edu. We would also appreciate receiving any changes -;;; or improvements you may make. -;;; -;;; If you wish to be added to the Lisp-Utilities@cs.cmu.edu mailing list, -;;; send email to Lisp-Utilities-Request@cs.cmu.edu with your name, email -;;; address, and affiliation. This mailing list is primarily for -;;; notification about major updates, bug fixes, and additions to the lisp -;;; utilities collection. The mailing list is intended to have low traffic. -;;; - -;;; ******************************** -;;; Change Log ********************* -;;; ******************************** -;;; -;;; 27-FEB-91 mk Added insert arg to psgraph-xref to allow the postscript -;;; graphs to be inserted in Scribe documents. -;;; 21-FEB-91 mk Added warning if not compiled. -;;; 07-FEB-91 mk Fixed bug in record-callers with regard to forms at -;;; toplevel. -;;; 21-JAN-91 mk Added file xref-test.lisp to test xref. -;;; 16-JAN-91 mk Added definition WHO-CALLS to parallel the Symbolics syntax. -;;; 16-JAN-91 mk Added macroexpansion capability to record-callers. Also -;;; added parameter *handle-macro-forms*, defaulting to T. -;;; 16-JAN-91 mk Modified print-caller-tree and related functions -;;; to allow the user to specify root nodes. If the user -;;; doesn't specify them, it will default to all root -;;; nodes, as before. -;;; 16-JAN-91 mk Added parameter *default-graphing-mode* to specify -;;; the direction of the graphing. Either :call-graph, -;;; where the children of a node are those functions called -;;; by the node, or :caller-graph where the children of a -;;; node are the callers of the node. :call-graph is the -;;; default. -;;; 16-JAN-91 mk Added parameter *indent-amount* to control the indentation -;;; in print-indented-tree. -;;; 16-JUL-90 mk Functions with argument lists of () were being ignored -;;; because of a (when form) wrapped around the body of -;;; record-callers. Then intent of (when form) was as an extra -;;; safeguard against infinite looping. This wasn't really -;;; necessary, so it has been removed. -;;; 16-JUL-90 mk PSGraph-XREF now has keyword arguments, instead of -;;; optionals. -;;; 16-JUL-90 mk Added PRINT-CLASS-HIERARCHY to use psgraph to graph the -;;; CLOS class hierarchy. This really doesn't belong here, -;;; and should be moved to psgraph.lisp as an example of how -;;; to use psgraph. -;;; 16-JUL-90 mk Fixed several caller patterns. The pattern for member -;;; had an error which caused many references to be missed. -;;; 16-JUL-90 mk Added ability to save/load processed databases. -;;; 5-JUL-91 mk Fixed warning of needing compilation to occur only when the -;;; source is loaded. -;;; 20-SEP-93 mk Added fix from Peter Norvig to allow Xref to xref itself. -;;; The arg to macro-function must be a symbol. -;;; 7-APR-12 heller Break lines at 80 columns. - -;;; ******************************** -;;; To Do ************************** -;;; ******************************** -;;; -;;; Verify that: -;;; o null forms don't cause it to infinite loop. -;;; o nil matches against null argument lists. -;;; o declarations and doc are being ignored. -;;; -;;; Would be nice if in addition to showing callers of a function, it -;;; displayed the context of the calls to the function (e.g., the -;;; immediately surrounding form). This entails storing entries of -;;; the form (symbol context*) in the database and augmenting -;;; record-callers to keep the context around. The only drawbacks is -;;; that it would cons a fair bit. If we do this, we should store -;;; additional information as well in the database, such as the caller -;;; pattern type (e.g., variable vs. function). -;;; -;;; Write a translator from BNF (at least as much of BNF as is used -;;; in CLtL2), to the format used here. -;;; -;;; Should automatically add new patterns for new functions and macros -;;; based on their arglists. Probably requires much more than this -;;; simple code walker, so there isn't much we can do. -;;; -;;; Defmacro is a problem, because it often hides internal function -;;; calls within backquote and quote, which we normally ignore. If -;;; we redefine QUOTE's pattern so that it treats the arg like a FORM, -;;; we'll probably get them (though maybe the syntax will be mangled), -;;; but most likely a lot of spurious things as well. -;;; -;;; Define an operation for Defsystem which will run XREF-FILE on the -;;; files of the system. Or yet simpler, when XREF sees a LOAD form -;;; for which the argument is a string, tries to recursively call -;;; XREF-FILE on the specified file. Then one could just XREF-FILE -;;; the file which loads the system. (This should be a program -;;; parameter.) -;;; -;;; Have special keywords which the user may place in a file to have -;;; XREF-FILE ignore a region. -;;; -;;; Should we distinguish flet and labels from defun? I.e., note that -;;; flet's definitions are locally defined, instead of just lumping -;;; them in with regular definitions. -;;; -;;; Add patterns for series, loop macro. -;;; -;;; Need to integrate the variable reference database with the other -;;; databases, yet maintain separation. So we can distinguish all -;;; the different types of variable and function references, without -;;; multiplying databases. -;;; -;;; Would pay to comment record-callers and record-callers* in more -;;; depth. -;;; -;;; (&OPTIONAL &REST &KEY &AUX &BODY &WHOLE &ALLOW-OTHER-KEYS &ENVIRONMENT) - -;;; ******************************** -;;; Notes ************************** -;;; ******************************** -;;; -;;; XREF has been tested (successfully) in the following lisps: -;;; CMU Common Lisp (M2.9 15-Aug-90, Compiler M1.8 15-Aug-90) -;;; Macintosh Allegro Common Lisp (1.3.2) -;;; ExCL (Franz Allegro CL 3.1.12 [DEC 3100] 3/30/90) -;;; Lucid CL (Version 2.1 6-DEC-87) -;;; -;;; XREF has been tested (unsuccessfully) in the following lisps: -;;; Ibuki Common Lisp (01/01, October 15, 1987) -;;; - if interpreted, runs into stack overflow -;;; - does not compile (tried ibcl on Suns, PMAXes and RTs) -;;; seems to be due to a limitation in the c compiler. -;;; -;;; XREF needs to be tested in the following lisps: -;;; Symbolics Common Lisp (8.0) -;;; Lucid Common Lisp (3.0, 4.0) -;;; KCL (June 3, 1987 or later) -;;; AKCL (1.86, June 30, 1987 or later) -;;; TI (Release 4.1 or later) -;;; Golden Common Lisp (3.1 IBM-PC) -;;; VAXLisp (2.0, 3.1) -;;; HP Common Lisp (same as Lucid?) -;;; Procyon Common Lisp - - -;;; **************************************************************** -;;; Documentation ************************************************** -;;; **************************************************************** -;;; -;;; XREF analyzes a user's program, determining which functions call a -;;; given function, and the location of where variables are bound/assigned -;;; and used. The user may retrieve this information for either a single -;;; symbol, or display the call graph of portions of the program -;;; (including the entire program). This allows the programmer to debug -;;; and document the program's structure. -;;; -;;; XREF is primarily intended for analyzing large programs, where it is -;;; difficult, if not impossible, for the programmer to grasp the structure -;;; of the whole program. Nothing precludes using XREF for smaller programs, -;;; where it can be useful for inspecting the relationships between pieces -;;; of the program and for documenting the program. -;;; -;;; Two aspects of the Lisp programming language greatly simplify the -;;; analysis of Lisp programs: -;;; o Lisp programs are naturally represented as data. -;;; Successive definitions from a file are easily read in -;;; as list structure. -;;; o The basic syntax of Lisp is uniform. A list program -;;; consists of a set of nested forms, where each form is -;;; a list whose car is a tag (e.g., function name) that -;;; specifies the structure of the rest of the form. -;;; Thus Lisp programs, when represented as data, can be considered to be -;;; parse trees. Given a grammar of syntax patterns for the language, XREF -;;; recursively descends the parse tree for a given definition, computing -;;; a set of relations that hold for the definition at each node in the -;;; tree. For example, one kind of relation is that the function defined -;;; by the definition calls the functions in its body. The relations are -;;; stored in a database for later examination by the user. -;;; -;;; While XREF currently only works for programs written in Lisp, it could -;;; be extended to other programming languages by writing a function to -;;; generate parse trees for definitions in that language, and a core -;;; set of patterns for the language's syntax. -;;; -;;; Since XREF normally does a static syntactic analysis of the program, -;;; it does not detect references due to the expansion of a macro definition. -;;; To do this in full generality XREF would have to have knowledge about the -;;; semantics of the program (e.g., macros which call other functions to -;;; do the expansion). This entails either modifying the compiler to -;;; record the relationships (e.g., Symbolics Who-Calls Database) or doing -;;; a walk of loaded code and macroexpanding as needed (PCL code walker). -;;; The former is not portable, while the latter requires that the code -;;; used by macros be loaded and in working order. On the other hand, then -;;; we would need no special knowledge about macros (excluding the 24 special -;;; forms of Lisp). -;;; -;;; Parameters may be set to enable macro expansion in XREF. Then XREF -;;; will expand any macros for which it does not have predefined patterns. -;;; (For example, most Lisps will implement dolist as a macro. Since XREF -;;; has a pattern defined for dolist, it will not call macroexpand-1 on -;;; a form whose car is dolist.) For this to work properly, the code must -;;; be loaded before being processed by XREF, and XREF's parameters should -;;; be set so that it processes forms in their proper packages. -;;; -;;; If macro expansion is disabled, the default rules for handling macro -;;; references may not be sufficient for some user-defined macros, because -;;; macros allow a variety of non-standard syntactic extensions to the -;;; language. In this case, the user may specify additional templates in -;;; a manner similar to that in which the core Lisp grammar was specified. -;;; - - -;;; ******************************** -;;; User Guide ********************* -;;; ******************************** -;;; ----- -;;; The following functions are called to cross reference the source files. -;;; -;;; XREF-FILES (&rest files) [FUNCTION] -;;; Grovels over the lisp code located in source file FILES, using -;;; xref-file. -;;; -;;; XREF-FILE (filename &optional clear-tables verbose) [Function] -;;; Cross references the function and variable calls in FILENAME by -;;; walking over the source code located in the file. Defaults type of -;;; filename to ".lisp". Chomps on the code using record-callers and -;;; record-callers*. If CLEAR-TABLES is T (the default), it clears the -;;; callers database before processing the file. Specify CLEAR-TABLES as -;;; nil to append to the database. If VERBOSE is T (the default), prints -;;; out the name of the file, one progress dot for each form processed, -;;; and the total number of forms. -;;; -;;; ----- -;;; The following functions display information about the uses of the -;;; specified symbol as a function, variable, or constant. -;;; -;;; LIST-CALLERS (symbol) [FUNCTION] -;;; Lists all functions which call SYMBOL as a function (function -;;; invocation). -;;; -;;; LIST-READERS (symbol) [FUNCTION] -;;; Lists all functions which refer to SYMBOL as a variable -;;; (variable reference). -;;; -;;; LIST-SETTERS (symbol) [FUNCTION] -;;; Lists all functions which bind/set SYMBOL as a variable -;;; (variable mutation). -;;; -;;; LIST-USERS (symbol) [FUNCTION] -;;; Lists all functions which use SYMBOL as a variable or function. -;;; -;;; WHO-CALLS (symbol &optional how) [FUNCTION] -;;; Lists callers of symbol. HOW may be :function, :reader, :setter, -;;; or :variable." -;;; -;;; WHAT-FILES-CALL (symbol) [FUNCTION] -;;; Lists names of files that contain uses of SYMBOL -;;; as a function, variable, or constant. -;;; -;;; SOURCE-FILE (symbol) [FUNCTION] -;;; Lists the names of files in which SYMBOL is defined/used. -;;; -;;; LIST-CALLEES (symbol) [FUNCTION] -;;; Lists names of functions and variables called by SYMBOL. -;;; -;;; ----- -;;; The following functions may be useful for viewing the database and -;;; debugging the calling patterns. -;;; -;;; *LAST-FORM* () [VARIABLE] -;;; The last form read from the file. Useful for figuring out what went -;;; wrong when xref-file drops into the debugger. -;;; -;;; *XREF-VERBOSE* t [VARIABLE] -;;; When T, xref-file(s) prints out the names of the files it looks at, -;;; progress dots, and the number of forms read. -;;; -;;; *TYPES-TO-IGNORE* (quote (:lisp :lisp2)) [VARIABLE] -;;; Default set of caller types (as specified in the patterns) to ignore -;;; in the database handling functions. :lisp is CLtL 1st edition, -;;; :lisp2 is additional patterns from CLtL 2nd edition. -;;; -;;; *HANDLE-PACKAGE-FORMS* () [VARIABLE] -;;; When non-NIL, and XREF-FILE sees a package-setting form like -;;; IN-PACKAGE, sets the current package to the specified package by -;;; evaluating the form. When done with the file, xref-file resets the -;;; package to its original value. In some of the displaying functions, -;;; when this variable is non-NIL one may specify that all symbols from a -;;; particular set of packages be ignored. This is only useful if the -;;; files use different packages with conflicting names. -;;; -;;; *HANDLE-FUNCTION-FORMS* t [VARIABLE] -;;; When T, XREF-FILE tries to be smart about forms which occur in -;;; a function position, such as lambdas and arbitrary Lisp forms. -;;; If so, it recursively calls record-callers with pattern 'FORM. -;;; If the form is a lambda, makes the caller a caller of -;;; :unnamed-lambda. -;;; -;;; *HANDLE-MACRO-FORMS* t [VARIABLE] -;;; When T, if the file was loaded before being processed by XREF, and -;;; the car of a form is a macro, it notes that the parent calls the -;;; macro, and then calls macroexpand-1 on the form. -;;; -;;; *DEFAULT-GRAPHING-MODE* :call-graph [VARIABLE] -;;; Specifies whether we graph up or down. If :call-graph, the children -;;; of a node are the functions it calls. If :caller-graph, the -;;; children of a node are the functions that call it. -;;; -;;; *INDENT-AMOUNT* 3 [VARIABLE] -;;; Number of spaces to indent successive levels in PRINT-INDENTED-TREE. -;;; -;;; DISPLAY-DATABASE (&optional database types-to-ignore) [FUNCTION] -;;; Prints out the name of each symbol and all its callers. Specify -;;; database :callers (the default) to get function call references, -;;; :file to the get files in which the symbol is called, :readers to get -;;; variable references, and :setters to get variable binding and -;;; assignments. Ignores functions of types listed in types-to-ignore. -;;; -;;; PRINT-CALLER-TREES (&key (mode *default-graphing-mode*) [FUNCTION] -;;; (types-to-ignore *types-to-ignore*) -;;; compact root-nodes) -;;; Prints the calling trees (which may actually be a full graph and not -;;; necessarily a DAG) as indented text trees using -;;; PRINT-INDENTED-TREE. MODE is :call-graph for trees where the children -;;; of a node are the functions called by the node, or :caller-graph for -;;; trees where the children of a node are the functions the node calls. -;;; TYPES-TO-IGNORE is a list of funcall types (as specified in the -;;; patterns) to ignore in printing out the database. For example, -;;; '(:lisp) would ignore all calls to common lisp functions. COMPACT is -;;; a flag to tell the program to try to compact the trees a bit by not -;;; printing trees if they have already been seen. ROOT-NODES is a list -;;; of root nodes of trees to display. If ROOT-NODES is nil, tries to -;;; find all root nodes in the database. -;;; -;;; MAKE-CALLER-TREE (&optional (mode *default-graphing-mode*) [FUNCTION] -;;; (types-to-ignore *types-to-ignore*) -;;; compact) -;;; Outputs list structure of a tree which roughly represents the -;;; possibly cyclical structure of the caller database. -;;; If mode is :call-graph, the children of a node are the functions -;;; it calls. If mode is :caller-graph, the children of a node are the -;;; functions that call it. -;;; If compact is T, tries to eliminate the already-seen nodes, so -;;; that the graph for a node is printed at most once. Otherwise it will -;;; duplicate the node's tree (except for cycles). This is usefull -;;; because the call tree is actually a directed graph, so we can either -;;; duplicate references or display only the first one. -;;; -;;; DETERMINE-FILE-DEPENDENCIES (&optional database) [FUNCTION] -;;; Makes a hash table of file dependencies for the references listed in -;;; DATABASE. This function may be useful for automatically resolving -;;; file references for automatic creation of a system definition -;;; (defsystem). -;;; -;;; PRINT-FILE-DEPENDENCIES (&optional database) [FUNCTION] -;;; Prints a list of file dependencies for the references listed in -;;; DATABASE. This function may be useful for automatically computing -;;; file loading constraints for a system definition tool. -;;; -;;; WRITE-CALLERS-DATABASE-TO-FILE (filename) [FUNCTION] -;;; Saves the contents of the current callers database to a file. This -;;; file can be loaded to restore the previous contents of the -;;; database. (For large systems it can take a long time to crunch -;;; through the code, so this can save some time.) -;;; -;;; ----- -;;; The following macros define new function and macro call patterns. -;;; They may be used to extend the static analysis tool to handle -;;; new def forms, extensions to Common Lisp, and program defs. -;;; -;;; DEFINE-PATTERN-SUBSTITUTION (name pattern) [MACRO] -;;; Defines NAME to be equivalent to the specified pattern. Useful for -;;; making patterns more readable. For example, the LAMBDA-LIST is -;;; defined as a pattern substitution, making the definition of the -;;; DEFUN caller-pattern simpler. -;;; -;;; DEFINE-CALLER-PATTERN (name pattern &optional caller-type) [MACRO] -;;; Defines NAME as a function/macro call with argument structure -;;; described by PATTERN. CALLER-TYPE, if specified, assigns a type to -;;; the pattern, which may be used to exclude references to NAME while -;;; viewing the database. For example, all the Common Lisp definitions -;;; have a caller-type of :lisp or :lisp2, so that you can exclude -;;; references to common lisp functions from the calling tree. -;;; -;;; DEFINE-VARIABLE-PATTERN (name &optional caller-type) [MACRO] -;;; Defines NAME as a variable reference of type CALLER-TYPE. This is -;;; mainly used to establish the caller-type of the variable. -;;; -;;; DEFINE-CALLER-PATTERN-SYNONYMS (source destinations) [MACRO] -;;; For defining function caller pattern syntax synonyms. For each name -;;; in DESTINATIONS, defines its pattern as a copy of the definition -;;; of SOURCE. Allows a large number of identical patterns to be defined -;;; simultaneously. Must occur after the SOURCE has been defined. -;;; -;;; ----- -;;; This system includes pattern definitions for the latest -;;; common lisp specification, as published in Guy Steele, -;;; Common Lisp: The Language, 2nd Edition. -;;; -;;; Patterns may be either structures to match, or a predicate -;;; like symbolp/numberp/stringp. The pattern specification language -;;; is similar to the notation used in CLtL2, but in a more lisp-like -;;; form: -;;; (:eq name) The form element must be eq to the symbol NAME. -;;; (:test test) TEST must be true when applied to the form element. -;;; (:typep type) The form element must be of type TYPE. -;;; (:or pat1 pat2 ...) Tries each of the patterns in left-to-right order, -;;; until one succeeds. -;;; Equivalent to { pat1 | pat2 | ... } -;;; (:rest pattern) The remaining form elements are grouped into a -;;; list which is matched against PATTERN. -;;; (:optional pat1 ...) The patterns may optionally match against the -;;; form element. -;;; Equivalent to [ pat1 ... ]. -;;; (:star pat1 ...) The patterns may match against the patterns -;;; any number of times, including 0. -;;; Equivalent to { pat1 ... }*. -;;; (:plus pat1 ...) The patterns may match against the patterns -;;; any number of times, but at least once. -;;; Equivalent to { pat1 ... }+. -;;; &optional, &key, Similar in behavior to the corresponding -;;; &rest lambda-list keywords. -;;; FORM A random lisp form. If a cons, assumes the -;;; car is a function or macro and tries to -;;; match the args against that symbol's pattern. -;;; If a symbol, assumes it's a variable reference. -;;; :ignore Ignores the corresponding form element. -;;; NAME The corresponding form element should be -;;; the name of a new definition (e.g., the -;;; first arg in a defun pattern is NAME. -;;; FUNCTION, MACRO The corresponding form element should be -;;; a function reference not handled by FORM. -;;; Used in the definition of apply and funcall. -;;; VAR The corresponding form element should be -;;; a variable definition or mutation. Used -;;; in the definition of let, let*, etc. -;;; VARIABLE The corresponding form element should be -;;; a variable reference. -;;; -;;; In all other pattern symbols, it looks up the symbols pattern substitution -;;; and recursively matches against the pattern. Automatically destructures -;;; list structure that does not include consing dots. -;;; -;;; Among the pattern substitution names defined are: -;;; STRING, SYMBOL, NUMBER Appropriate :test patterns. -;;; LAMBDA-LIST Matches against a lambda list. -;;; BODY Matches against a function body definition. -;;; FN Matches against #'function, 'function, -;;; and lambdas. This is used in the definition -;;; of apply, funcall, and the mapping patterns. -;;; and others... -;;; -;;; Here's some sample pattern definitions: -;;; (define-caller-pattern defun -;;; (name lambda-list -;;; (:star (:or documentation-string declaration)) -;;; (:star form)) -;;; :lisp) -;;; (define-caller-pattern funcall (fn (:star form)) :lisp) -;;; -;;; In general, the system is intelligent enough to handle any sort of -;;; simple funcall. One only need specify the syntax for functions and -;;; macros which use optional arguments, keyword arguments, or some -;;; argument positions are special, such as in apply and funcall, or -;;; to indicate that the function is of the specified caller type. -;;; -;;; -;;; NOTES: -;;; -;;; XRef assumes syntactically correct lisp code. -;;; -;;; This is by no means perfect. For example, let and let* are treated -;;; identically, instead of differentiating between serial and parallel -;;; binding. But it's still a useful tool. It can be helpful in -;;; maintaining code, debugging problems with patch files, determining -;;; whether functions are multiply defined, and help you remember where -;;; a function is defined or called. -;;; -;;; XREF runs best when compiled. - -;;; ******************************** -;;; References ********************* -;;; ******************************** -;;; -;;; Xerox Interlisp Masterscope Program: -;;; Larry M Masinter, Global program analysis in an interactive environment -;;; PhD Thesis, Stanford University, 1980. -;;; -;;; Symbolics Who-Calls Database: -;;; User's Guide to Symbolics Computers, Volume 1, Cambridge, MA, July 1986 -;;; Genera 7.0, pp 183-185. -;;; - -;;; ******************************** -;;; Example ************************ -;;; ******************************** -;;; -;;; Here is an example of running XREF on a short program. -;;; [In Scribe documentation, give a simple short program and resulting -;;; XREF output, including postscript call graphs.] -#| - (xref:xref-file "/afs/cs/user/mkant/Lisp/Graph-Dag/graph-dag.lisp") -Cross-referencing file /afs/cs/user/mkant/Lisp/Graph-Dag/graph-dag.lisp. -................................................ -48 forms processed. - (xref:display-database :readers) - -*DISPLAY-CUTOFF-DEPTH* is referenced by CALCULATE-LEVEL-POSITION -CALCULATE-LEVEL-POSITION-BEFORE CALCULATE-POSITION-IN-LEVEL. -*OFFSET-FROM-EDGE-OF-PANE* is referenced by CALCULATE-LEVEL-POSITION -CALCULATE-LEVEL-POSITION-BEFORE. -*WITHIN-LEVEL-SPACING* is referenced by BREADTH CALCULATE-POSITION-INFO. -*DIRECTION* is referenced by CREATE-POSITION-INFO. -*LINK-OFFSET* is referenced by OFFSET-OF-LINK-FROM-ATTACHMENT-POINT. -*ROOT-IS-SEQUENCE* is referenced by GRAPH. -*LEVEL-SPACING* is referenced by CALCULATE-LEVEL-POSITION -CALCULATE-LEVEL-POSITION-BEFORE. -*ORIENTATION* is referenced by BREADTH CALCULATE-LEVEL-POSITION -CALCULATE-LEVEL-POSITION-BEFORE CALCULATE-POSITION-IN-LEVEL. -*DEFAULT-GRAPH-POSITION* is referenced by CREATE-POSITION-INFO. -*GRAPHING-CUTOFF-DEPTH* is referenced by CREATE-NODE-STRUCTURE. -*LIST-OF-NODES* is referenced by CALCULATE-LEVEL-POSITION -CALCULATE-LEVEL-POSITION-BEFORE CREATE-NODE FIND-NODE. -*GRAPH-TYPE* is referenced by CREATE-NODE-STRUCTURE. - (xref:print-caller-trees :root-nodes '(display-graph)) - -Rooted calling trees: - DISPLAY-GRAPH - CREATE-POSITION-INFO - CALCULATE-POSITION-INFO - CALCULATE-POSITION - NODE-POSITION-ALREADY-SET-FLAG - NODE-LEVEL-ALREADY-SET-FLAG - CALCULATE-POSITION-IN-LEVEL - NODE-CHILDREN - NODE-LEVEL - CALCULATE-POSITION - NEW-CALCULATE-BREADTH - NODE-CHILDREN - BREADTH - OPPOSITE-DIMENSION - NODE-HEIGHT - NODE-WIDTH - NEW-CALCULATE-BREADTH - NODE-PARENTS - OPPOSITE-DIMENSION - NODE-HEIGHT - NODE-WIDTH - OPPOSITE-POSITION - NODE-Y - NODE-X - NODE-LEVEL - CALCULATE-LEVEL-POSITION - NODE-LEVEL - NODE-POSITION - NODE-X - NODE-Y - DIMENSION - NODE-WIDTH - NODE-HEIGHT - CALCULATE-LEVEL-POSITION-BEFORE - NODE-LEVEL - NODE-POSITION - NODE-X - NODE-Y - NODE-WIDTH - NODE-HEIGHT - DIMENSION - NODE-WIDTH - NODE-HEIGHT -|# - -;;; **************************************************************** -;;; List Callers *************************************************** -;;; **************************************************************** - -(defpackage :pxref - (:use :common-lisp) - (:export #:list-callers - #:list-users - #:list-readers - #:list-setters - #:what-files-call - #:who-calls - #:list-callees - #:source-file - #:clear-tables - #:define-pattern-substitution - #:define-caller-pattern - #:define-variable-pattern - #:define-caller-pattern-synonyms - #:clear-patterns - #:*last-form* - #:*xref-verbose* - #:*handle-package-forms* - #:*handle-function-forms* - #:*handle-macro-forms* - #:*types-to-ignore* - #:*last-caller-tree* - #:*default-graphing-mode* - #:*indent-amount* - #:xref-file - #:xref-files - #:write-callers-database-to-file - #:display-database - #:print-caller-trees - #:make-caller-tree - #:print-indented-tree - #:determine-file-dependencies - #:print-file-dependencies - #:psgraph-xref - )) - -(in-package "PXREF") - -;;; Warn user if they're loading the source instead of compiling it first. -;(eval-when (compile load eval) -; (defvar compiled-p nil)) -;(eval-when (compile load) -; (setq compiled-p t)) -;(eval-when (load eval) -; (unless compiled-p -; (warn "This file should be compiled before loading for best results."))) -(eval-when (eval) - (warn "This file should be compiled before loading for best results.")) - - -;;; ******************************** -;;; Primitives ********************* -;;; ******************************** -(defun lookup (symbol environment) - (dolist (frame environment) - (when (member symbol frame) - (return symbol)))) - -(defun car-eq (list item) - (and (consp list) - (eq (car list) item))) - -;;; ******************************** -;;; Callers Database *************** -;;; ******************************** -(defvar *file-callers-database* (make-hash-table :test #'equal) - "Contains name and list of file callers (files which call) for that name.") -(defvar *callers-database* (make-hash-table :test #'equal) - "Contains name and list of callers (function invocation) for that name.") -(defvar *readers-database* (make-hash-table :test #'equal) - "Contains name and list of readers (variable use) for that name.") -(defvar *setters-database* (make-hash-table :test #'equal) - "Contains name and list of setters (variable mutation) for that name.") -(defvar *callees-database* (make-hash-table :test #'equal) - "Contains name and list of functions and variables it calls.") -(defun callers-list (name &optional (database :callers)) - (case database - (:file (gethash name *file-callers-database*)) - (:callees (gethash name *callees-database*)) - (:callers (gethash name *callers-database*)) - (:readers (gethash name *readers-database*)) - (:setters (gethash name *setters-database*)))) -(defsetf callers-list (name &optional (database :callers)) (caller) - `(setf (gethash ,name (case ,database - (:file *file-callers-database*) - (:callees *callees-database*) - (:callers *callers-database*) - (:readers *readers-database*) - (:setters *setters-database*))) - ,caller)) - -(defun list-callers (symbol) - "Lists all functions which call SYMBOL as a function (function invocation)." - (callers-list symbol :callers)) -(defun list-readers (symbol) - "Lists all functions which refer to SYMBOL as a variable - (variable reference)." - (callers-list symbol :readers)) -(defun list-setters (symbol) - "Lists all functions which bind/set SYMBOL as a variable - (variable mutation)." - (callers-list symbol :setters)) -(defun list-users (symbol) - "Lists all functions which use SYMBOL as a variable or function." - (values (list-callers symbol) - (list-readers symbol) - (list-setters symbol))) -(defun who-calls (symbol &optional how) - "Lists callers of symbol. HOW may be :function, :reader, :setter, - or :variable." - ;; would be nice to have :macro and distinguish variable - ;; binding from assignment. (i.e., variable binding, assignment, and use) - (case how - (:function (list-callers symbol)) - (:reader (list-readers symbol)) - (:setter (list-setters symbol)) - (:variable (append (list-readers symbol) - (list-setters symbol))) - (otherwise (append (list-callers symbol) - (list-readers symbol) - (list-setters symbol))))) -(defun what-files-call (symbol) - "Lists names of files that contain uses of SYMBOL - as a function, variable, or constant." - (callers-list symbol :file)) -(defun list-callees (symbol) - "Lists names of functions and variables called by SYMBOL." - (callers-list symbol :callees)) - -(defvar *source-file* (make-hash-table :test #'equal) - "Contains function name and source file for that name.") -(defun source-file (symbol) - "Lists the names of files in which SYMBOL is defined/used." - (gethash symbol *source-file*)) -(defsetf source-file (name) (value) - `(setf (gethash ,name *source-file*) ,value)) - -(defun clear-tables () - (clrhash *file-callers-database*) - (clrhash *callers-database*) - (clrhash *callees-database*) - (clrhash *readers-database*) - (clrhash *setters-database*) - (clrhash *source-file*)) - - -;;; ******************************** -;;; Pattern Database *************** -;;; ******************************** -;;; Pattern Types -(defvar *pattern-caller-type* (make-hash-table :test #'equal)) -(defun pattern-caller-type (name) - (gethash name *pattern-caller-type*)) -(defsetf pattern-caller-type (name) (value) - `(setf (gethash ,name *pattern-caller-type*) ,value)) - -;;; Pattern Substitutions -(defvar *pattern-substitution-table* (make-hash-table :test #'equal) - "Stores general patterns for function destructuring.") -(defun lookup-pattern-substitution (name) - (gethash name *pattern-substitution-table*)) -(defmacro define-pattern-substitution (name pattern) - "Defines NAME to be equivalent to the specified pattern. Useful for - making patterns more readable. For example, the LAMBDA-LIST is - defined as a pattern substitution, making the definition of the - DEFUN caller-pattern simpler." - `(setf (gethash ',name *pattern-substitution-table*) - ',pattern)) - -;;; Function/Macro caller patterns: -;;; The car of the form is skipped, so we don't need to specify -;;; (:eq function-name) like we would for a substitution. -;;; -;;; Patterns must be defined in the XREF package because the pattern -;;; language is tested by comparing symbols (using #'equal) and not -;;; their printreps. This is fine for the lisp grammer, because the XREF -;;; package depends on the LISP package, so a symbol like 'xref::cons is -;;; translated automatically into 'lisp::cons. However, since -;;; (equal 'foo::bar 'baz::bar) returns nil unless both 'foo::bar and -;;; 'baz::bar are inherited from the same package (e.g., LISP), -;;; if package handling is turned on the user must specify package -;;; names in the caller pattern definitions for functions that occur -;;; in packages other than LISP, otherwise the symbols will not match. -;;; -;;; Perhaps we should enforce the definition of caller patterns in the -;;; XREF package by wrapping the body of define-caller-pattern in -;;; the XREF package: -;;; (defmacro define-caller-pattern (name value &optional caller-type) -;;; (let ((old-package *package*)) -;;; (setf *package* (find-package "XREF")) -;;; (prog1 -;;; `(progn -;;; (when ',caller-type -;;; (setf (pattern-caller-type ',name) ',caller-type)) -;;; (when ',value -;;; (setf (gethash ',name *caller-pattern-table*) -;;; ',value))) -;;; (setf *package* old-package)))) -;;; Either that, or for the purpose of pattern testing we should compare -;;; printreps. [The latter makes the primitive patterns like VAR -;;; reserved words.] -(defvar *caller-pattern-table* (make-hash-table :test #'equal) - "Stores patterns for function destructuring.") -(defun lookup-caller-pattern (name) - (gethash name *caller-pattern-table*)) -(defmacro define-caller-pattern (name pattern &optional caller-type) - "Defines NAME as a function/macro call with argument structure - described by PATTERN. CALLER-TYPE, if specified, assigns a type to - the pattern, which may be used to exclude references to NAME while - viewing the database. For example, all the Common Lisp definitions - have a caller-type of :lisp or :lisp2, so that you can exclude - references to common lisp functions from the calling tree." - `(progn - (when ',caller-type - (setf (pattern-caller-type ',name) ',caller-type)) - (when ',pattern - (setf (gethash ',name *caller-pattern-table*) - ',pattern)))) - -;;; For defining variables -(defmacro define-variable-pattern (name &optional caller-type) - "Defines NAME as a variable reference of type CALLER-TYPE. This is - mainly used to establish the caller-type of the variable." - `(progn - (when ',caller-type - (setf (pattern-caller-type ',name) ',caller-type)))) - -;;; For defining synonyms. Means much less space taken up by the patterns. -(defmacro define-caller-pattern-synonyms (source destinations) - "For defining function caller pattern syntax synonyms. For each name - in DESTINATIONS, defines its pattern as a copy of the definition of SOURCE. - Allows a large number of identical patterns to be defined simultaneously. - Must occur after the SOURCE has been defined." - `(let ((source-type (pattern-caller-type ',source)) - (source-pattern (gethash ',source *caller-pattern-table*))) - (when source-type - (dolist (dest ',destinations) - (setf (pattern-caller-type dest) source-type))) - (when source-pattern - (dolist (dest ',destinations) - (setf (gethash dest *caller-pattern-table*) - source-pattern))))) - -(defun clear-patterns () - (clrhash *pattern-substitution-table*) - (clrhash *caller-pattern-table*) - (clrhash *pattern-caller-type*)) - -;;; ******************************** -;;; Cross Reference Files ********** -;;; ******************************** -(defvar *last-form* () - "The last form read from the file. Useful for figuring out what went wrong - when xref-file drops into the debugger.") - -(defvar *xref-verbose* t - "When T, xref-file(s) prints out the names of the files it looks at, - progress dots, and the number of forms read.") - -;;; This needs to first clear the tables? -(defun xref-files (&rest files) - "Grovels over the lisp code located in source file FILES, using xref-file." - ;; If the arg is a list, use it. - (when (listp (car files)) (setq files (car files))) - (dolist (file files) - (xref-file file nil)) - (values)) - -(defvar *handle-package-forms* nil ;'(lisp::in-package) - "When non-NIL, and XREF-FILE sees a package-setting form like IN-PACKAGE, - sets the current package to the specified package by evaluating the - form. When done with the file, xref-file resets the package to its - original value. In some of the displaying functions, when this variable - is non-NIL one may specify that all symbols from a particular set of - packages be ignored. This is only useful if the files use different - packages with conflicting names.") - -(defvar *normal-readtable* (copy-readtable nil) - "Normal, unadulterated CL readtable.") - -(defun xref-file (filename &optional (clear-tables t) (verbose *xref-verbose*)) - "Cross references the function and variable calls in FILENAME by - walking over the source code located in the file. Defaults type of - filename to \".lisp\". Chomps on the code using record-callers and - record-callers*. If CLEAR-TABLES is T (the default), it clears the callers - database before processing the file. Specify CLEAR-TABLES as nil to - append to the database. If VERBOSE is T (the default), prints out the - name of the file, one progress dot for each form processed, and the - total number of forms." - ;; Default type to "lisp" - (when (and (null (pathname-type filename)) - (not (probe-file filename))) - (cond ((stringp filename) - (setf filename (concatenate 'string filename ".lisp"))) - ((pathnamep filename) - (setf filename (merge-pathnames filename - (make-pathname :type "lisp")))))) - (when clear-tables (clear-tables)) - (let ((count 0) - (old-package *package*) - (*readtable* *normal-readtable*)) - (when verbose - (format t "~&Cross-referencing file ~A.~&" filename)) - (with-open-file (stream filename :direction :input) - (do ((form (read stream nil :eof) (read stream nil :eof))) - ((eq form :eof)) - (incf count) - (when verbose - (format *standard-output* ".") - (force-output *standard-output*)) - (setq *last-form* form) - (record-callers filename form) - ;; Package Magic. - (when (and *handle-package-forms* - (consp form) - (member (car form) *handle-package-forms*)) - (eval form)))) - (when verbose - (format t "~&~D forms processed." count)) - (setq *package* old-package) - (values))) - -(defvar *handle-function-forms* t - "When T, XREF-FILE tries to be smart about forms which occur in - a function position, such as lambdas and arbitrary Lisp forms. - If so, it recursively calls record-callers with pattern 'FORM. - If the form is a lambda, makes the caller a caller of :unnamed-lambda.") - -(defvar *handle-macro-forms* t - "When T, if the file was loaded before being processed by XREF, and the - car of a form is a macro, it notes that the parent calls the macro, - and then calls macroexpand-1 on the form.") - -(defvar *callees-database-includes-variables* nil) - -(defun record-callers (filename form - &optional pattern parent (environment nil) - funcall) - "RECORD-CALLERS is the main routine used to walk down the code. It matches - the PATTERN against the FORM, possibly adding statements to the database. - PARENT is the name defined by the current outermost definition; it is - the caller of the forms in the body (e.g., FORM). ENVIRONMENT is used - to keep track of the scoping of variables. FUNCALL deals with the type - of variable assignment and hence how the environment should be modified. - RECORD-CALLERS handles atomic patterns and simple list-structure patterns. - For complex list-structure pattern destructuring, it calls RECORD-CALLERS*." -; (when form) - (unless pattern (setq pattern 'FORM)) - (cond ((symbolp pattern) - (case pattern - (:IGNORE - ;; Ignores the rest of the form. - (values t parent environment)) - (NAME - ;; This is the name of a new definition. - (push filename (source-file form)) - (values t form environment)) - ((FUNCTION MACRO) - ;; This is the name of a call. - (cond ((and *handle-function-forms* (consp form)) - ;; If we're a cons and special handling is on, - (when (eq (car form) 'lambda) - (pushnew filename (callers-list :unnamed-lambda :file)) - (when parent - (pushnew parent (callers-list :unnamed-lambda - :callers)) - (pushnew :unnamed-lambda (callers-list parent - :callees)))) - (record-callers filename form 'form parent environment)) - (t - ;; If we're just a regular function name call. - (pushnew filename (callers-list form :file)) - (when parent - (pushnew parent (callers-list form :callers)) - (pushnew form (callers-list parent :callees))) - (values t parent environment)))) - (VAR - ;; This is the name of a new variable definition. - ;; Includes arglist parameters. - (when (and (symbolp form) (not (keywordp form)) - (not (member form lambda-list-keywords))) - (pushnew form (car environment)) - (pushnew filename (callers-list form :file)) - (when parent -; (pushnew form (callers-list parent :callees)) - (pushnew parent (callers-list form :setters))) - (values t parent environment))) - (VARIABLE - ;; VAR reference - (pushnew filename (callers-list form :file)) - (when (and parent (not (lookup form environment))) - (pushnew parent (callers-list form :readers)) - (when *callees-database-includes-variables* - (pushnew form (callers-list parent :callees)))) - (values t parent environment)) - (FORM - ;; A random form (var or funcall). - (cond ((consp form) - ;; Get new pattern from TAG. - (let ((new-pattern (lookup-caller-pattern (car form)))) - (pushnew filename (callers-list (car form) :file)) - (when parent - (pushnew parent (callers-list (car form) :callers)) - (pushnew (car form) (callers-list parent :callees))) - (cond ((and new-pattern (cdr form)) - ;; Special Pattern and there's stuff left - ;; to be processed. Note that we check if - ;; a pattern is defined for the form before - ;; we check to see if we can macroexpand it. - (record-callers filename (cdr form) new-pattern - parent environment :funcall)) - ((and *handle-macro-forms* - (symbolp (car form)) ; pnorvig 9/9/93 - (macro-function (car form))) - ;; The car of the form is a macro and - ;; macro processing is turned on. Macroexpand-1 - ;; the form and try again. - (record-callers filename - (macroexpand-1 form) - 'form parent environment - :funcall)) - ((null (cdr form)) - ;; No more left to be processed. Note that - ;; this must occur after the macros clause, - ;; since macros can expand into more code. - (values t parent environment)) - (t - ;; Random Form. We assume it is a function call. - (record-callers filename (cdr form) - '((:star FORM)) - parent environment :funcall))))) - (t - (when (and (not (lookup form environment)) - (not (numberp form)) - ;; the following line should probably be - ;; commented out? - (not (keywordp form)) - (not (stringp form)) - (not (eq form t)) - (not (eq form nil))) - (pushnew filename (callers-list form :file)) - ;; ??? :callers - (when parent - (pushnew parent (callers-list form :readers)) - (when *callees-database-includes-variables* - (pushnew form (callers-list parent :callees))))) - (values t parent environment)))) - (otherwise - ;; Pattern Substitution - (let ((new-pattern (lookup-pattern-substitution pattern))) - (if new-pattern - (record-callers filename form new-pattern - parent environment) - (when (eq pattern form) - (values t parent environment))))))) - ((consp pattern) - (case (car pattern) - (:eq (when (eq (second pattern) form) - (values t parent environment))) - (:test (when (funcall (eval (second pattern)) form) - (values t parent environment))) - (:typep (when (typep form (second pattern)) - (values t parent environment))) - (:or (dolist (subpat (rest pattern)) - (multiple-value-bind (processed parent environment) - (record-callers filename form subpat - parent environment) - (when processed - (return (values processed parent environment)))))) - (:rest ; (:star :plus :optional :rest) - (record-callers filename form (second pattern) - parent environment)) - (otherwise - (multiple-value-bind (d p env) - (record-callers* filename form pattern - parent (cons nil environment)) - (values d p (if funcall environment env)))))))) - -(defun record-callers* (filename form pattern parent environment - &optional continuation - in-optionals in-keywords) - "RECORD-CALLERS* handles complex list-structure patterns, such as - ordered lists of subpatterns, patterns involving :star, :plus, - &optional, &key, &rest, and so on. CONTINUATION is a stack of - unprocessed patterns, IN-OPTIONALS and IN-KEYWORDS are corresponding - stacks which determine whether &rest or &key has been seen yet in - the current pattern." - ;; form must be a cons or nil. -; (when form) - (if (null pattern) - (if (null continuation) - (values t parent environment) - (record-callers* filename form (car continuation) parent environment - (cdr continuation) - (cdr in-optionals) - (cdr in-keywords))) - (let ((pattern-elt (car pattern))) - (cond ((car-eq pattern-elt :optional) - (if (null form) - (values t parent environment) - (multiple-value-bind (processed par env) - (record-callers* filename form (cdr pattern-elt) - parent environment - (cons (cdr pattern) continuation) - (cons (car in-optionals) in-optionals) - (cons (car in-keywords) in-keywords)) - (if processed - (values processed par env) - (record-callers* filename form (cdr pattern) - parent environment continuation - in-optionals in-keywords))))) - ((car-eq pattern-elt :star) - (if (null form) - (values t parent environment) - (multiple-value-bind (processed par env) - (record-callers* filename form (cdr pattern-elt) - parent environment - (cons pattern continuation) - (cons (car in-optionals) in-optionals) - (cons (car in-keywords) in-keywords)) - (if processed - (values processed par env) - (record-callers* filename form (cdr pattern) - parent environment continuation - in-optionals in-keywords))))) - ((car-eq pattern-elt :plus) - (record-callers* filename form (cdr pattern-elt) - parent environment - (cons (cons (cons :star (cdr pattern-elt)) - (cdr pattern)) - continuation) - (cons (car in-optionals) in-optionals) - (cons (car in-keywords) in-keywords))) - ((car-eq pattern-elt :rest) - (record-callers filename form pattern-elt parent environment)) - ((eq pattern-elt '&optional) - (record-callers* filename form (cdr pattern) - parent environment continuation - (cons t in-optionals) - (cons (car in-keywords) in-keywords))) - ((eq pattern-elt '&rest) - (record-callers filename form (second pattern) - parent environment)) - ((eq pattern-elt '&key) - (record-callers* filename form (cdr pattern) - parent environment continuation - (cons (car in-optionals) in-optionals) - (cons t in-keywords))) - ((null form) - (when (or (car in-keywords) (car in-optionals)) - (values t parent environment))) - ((consp form) - (multiple-value-bind (processed parent environment) - (record-callers filename (if (car in-keywords) - (cadr form) - (car form)) - pattern-elt - parent environment) - (cond (processed - (record-callers* filename (if (car in-keywords) - (cddr form) - (cdr form)) - (cdr pattern) - parent environment - continuation - in-optionals in-keywords)) - ((or (car in-keywords) - (car in-optionals)) - (values t parent environment))))))))) - - -;;; ******************************** -;;; Misc Utilities ***************** -;;; ******************************** -(defvar *types-to-ignore* - '(:lisp ; CLtL 1st Edition - :lisp2 ; CLtL 2nd Edition additional patterns - ) - "Default set of caller types (as specified in the patterns) to ignore - in the database handling functions. :lisp is CLtL 1st edition, - :lisp2 is additional patterns from CLtL 2nd edition.") - -(defun display-database (&optional (database :callers) - (types-to-ignore *types-to-ignore*)) - "Prints out the name of each symbol and all its callers. Specify database - :callers (the default) to get function call references, :fill to the get - files in which the symbol is called, :readers to get variable references, - and :setters to get variable binding and assignments. Ignores functions - of types listed in types-to-ignore." - (maphash #'(lambda (name callers) - (unless (or (member (pattern-caller-type name) - types-to-ignore) - ;; When we're doing fancy package crap, - ;; allow us to ignore symbols based on their - ;; packages. - (when *handle-package-forms* - (member (symbol-package name) - types-to-ignore - :key #'find-package))) - (format t "~&~S is referenced by~{ ~S~}." - name callers))) - (ecase database - (:file *file-callers-database*) - (:callers *callers-database*) - (:readers *readers-database*) - (:setters *setters-database*)))) - -(defun write-callers-database-to-file (filename) - "Saves the contents of the current callers database to a file. This - file can be loaded to restore the previous contents of the - database. (For large systems it can take a long time to crunch - through the code, so this can save some time.)" - (with-open-file (stream filename :direction :output) - (format stream "~&(clear-tables)") - (maphash #'(lambda (x y) - (format stream "~&(setf (source-file '~S) '~S)" - x y)) - *source-file*) - (maphash #'(lambda (x y) - (format stream "~&(setf (callers-list '~S :file) '~S)" - x y)) - *file-callers-database*) - (maphash #'(lambda (x y) - (format stream "~&(setf (callers-list '~S :callers) '~S)" - x y)) - *callers-database*) - (maphash #'(lambda (x y) - (format stream "~&(setf (callers-list '~S :callees) '~S)" - x y)) - *callees-database*) - (maphash #'(lambda (x y) - (format stream "~&(setf (callers-list '~S :readers) '~S)" - x y)) - *readers-database*) - (maphash #'(lambda (x y) - (format stream "~&(setf (callers-list '~S :setters) '~S)" - x y)) - *setters-database*))) - - -;;; ******************************** -;;; Print Caller Trees ************* -;;; ******************************** -;;; The following function is useful for reversing a caller table into -;;; a callee table. Possibly later we'll extend xref to create two -;;; such database hash tables. Needs to include vars as well. -(defun invert-hash-table (table &optional (types-to-ignore *types-to-ignore*)) - "Makes a copy of the hash table in which (name value*) pairs - are inverted to (value name*) pairs." - (let ((target (make-hash-table :test #'equal))) - (maphash #'(lambda (key values) - (dolist (value values) - (unless (member (pattern-caller-type key) - types-to-ignore) - (pushnew key (gethash value target))))) - table) - target)) - -;;; Resolve file references for automatic creation of a defsystem file. -(defun determine-file-dependencies (&optional (database *callers-database*)) - "Makes a hash table of file dependencies for the references listed in - DATABASE. This function may be useful for automatically resolving - file references for automatic creation of a system definition (defsystem)." - (let ((file-ref-ht (make-hash-table :test #'equal))) - (maphash #'(lambda (key values) - (let ((key-file (source-file key))) - (when key - (dolist (value values) - (let ((value-file (source-file value))) - (when value-file - (dolist (s key-file) - (dolist (d value-file) - (pushnew d (gethash s file-ref-ht)))))))))) - database) - file-ref-ht)) - -(defun print-file-dependencies (&optional (database *callers-database*)) - "Prints a list of file dependencies for the references listed in DATABASE. - This function may be useful for automatically computing file loading - constraints for a system definition tool." - (maphash #'(lambda (key value) (format t "~&~S --> ~S" key value)) - (determine-file-dependencies database))) - -;;; The following functions demonstrate a possible way to interface -;;; xref to a graphical browser such as psgraph to mimic the capabilities -;;; of Masterscope's graphical browser. - -(defvar *last-caller-tree* nil) - -(defvar *default-graphing-mode* :call-graph - "Specifies whether we graph up or down. If :call-graph, the children - of a node are the functions it calls. If :caller-graph, the children - of a node are the functions that call it.") - -(defun gather-tree (parents &optional already-seen - (mode *default-graphing-mode*) - (types-to-ignore *types-to-ignore*) compact) - "Extends the tree, copying it into list structure, until it repeats - a reference (hits a cycle)." - (let ((*already-seen* nil) - (database (case mode - (:call-graph *callees-database*) - (:caller-graph *callers-database*)))) - (declare (special *already-seen*)) - (labels - ((amass-tree - (parents &optional already-seen) - (let (result this-item) - (dolist (parent parents) - (unless (member (pattern-caller-type parent) - types-to-ignore) - (pushnew parent *already-seen*) - (if (member parent already-seen) - (setq this-item nil) ; :ignore - (if compact - (multiple-value-setq (this-item already-seen) - (amass-tree (gethash parent database) - (cons parent already-seen))) - (setq this-item - (amass-tree (gethash parent database) - (cons parent already-seen))))) - (setq parent (format nil "~S" parent)) - (when (consp parent) (setq parent (cons :xref-list parent))) - (unless (eq this-item :ignore) - (push (if this-item - (list parent this-item) - parent) - result)))) - (values result ;(reverse result) - already-seen)))) - (values (amass-tree parents already-seen) - *already-seen*)))) - -(defun find-roots-and-cycles (&optional (mode *default-graphing-mode*) - (types-to-ignore *types-to-ignore*)) - "Returns a list of uncalled callers (roots) and called callers (potential - cycles)." - (let ((uncalled-callers nil) - (called-callers nil) - (database (ecase mode - (:call-graph *callers-database*) - (:caller-graph *callees-database*))) - (other-database (ecase mode - (:call-graph *callees-database*) - (:caller-graph *callers-database*)))) - (maphash #'(lambda (name value) - (declare (ignore value)) - (unless (member (pattern-caller-type name) - types-to-ignore) - (if (gethash name database) - (push name called-callers) - (push name uncalled-callers)))) - other-database) - (values uncalled-callers called-callers))) - -(defun make-caller-tree (&optional (mode *default-graphing-mode*) - (types-to-ignore *types-to-ignore*) compact) - "Outputs list structure of a tree which roughly represents the possibly - cyclical structure of the caller database. - If mode is :call-graph, the children of a node are the functions it calls. - If mode is :caller-graph, the children of a node are the functions that - call it. - If compact is T, tries to eliminate the already-seen nodes, so that - the graph for a node is printed at most once. Otherwise it will duplicate - the node's tree (except for cycles). This is usefull because the call tree - is actually a directed graph, so we can either duplicate references or - display only the first one." - ;; Would be nice to print out line numbers and whenever we skip a duplicated - ;; reference, print the line number of the full reference after the node. - (multiple-value-bind (uncalled-callers called-callers) - (find-roots-and-cycles mode types-to-ignore) - (multiple-value-bind (trees already-seen) - (gather-tree uncalled-callers nil mode types-to-ignore compact) - (setq *last-caller-tree* trees) - (let ((more-trees (gather-tree (set-difference called-callers - already-seen) - already-seen - mode types-to-ignore compact))) - (values trees more-trees))))) - -(defvar *indent-amount* 3 - "Number of spaces to indent successive levels in PRINT-INDENTED-TREE.") - -(defun print-indented-tree (trees &optional (indent 0)) - "Simple code to print out a list-structure tree (such as those created - by make-caller-tree) as indented text." - (when trees - (dolist (tree trees) - (cond ((and (listp tree) (eq (car tree) :xref-list)) - (format t "~&~VT~A" indent (cdr tree))) - ((listp tree) - (format t "~&~VT~A" indent (car tree)) - (print-indented-tree (cadr tree) (+ indent *indent-amount*))) - (t - (format t "~&~VT~A" indent tree)))))) - -(defun print-caller-trees (&key (mode *default-graphing-mode*) - (types-to-ignore *types-to-ignore*) - compact - root-nodes) - "Prints the calling trees (which may actually be a full graph and not - necessarily a DAG) as indented text trees using PRINT-INDENTED-TREE. - MODE is :call-graph for trees where the children of a node are the - functions called by the node, or :caller-graph for trees where the - children of a node are the functions the node calls. TYPES-TO-IGNORE - is a list of funcall types (as specified in the patterns) to ignore - in printing out the database. For example, '(:lisp) would ignore all - calls to common lisp functions. COMPACT is a flag to tell the program - to try to compact the trees a bit by not printing trees if they have - already been seen. ROOT-NODES is a list of root nodes of trees to - display. If ROOT-NODES is nil, tries to find all root nodes in the - database." - (multiple-value-bind (rooted cycles) - (if root-nodes - (values (gather-tree root-nodes nil mode types-to-ignore compact)) - (make-caller-tree mode types-to-ignore compact)) - (when rooted - (format t "~&Rooted calling trees:") - (print-indented-tree rooted 2)) - (when cycles - (when rooted - (format t "~2%")) - (format t "~&Cyclic calling trees:") - (print-indented-tree cycles 2)))) - - -;;; ******************************** -;;; Interface to PSGraph *********** -;;; ******************************** -#| -;;; Interface to Bates' PostScript Graphing Utility -(load "/afs/cs/user/mkant/Lisp/PSGraph/psgraph") - -(defparameter *postscript-output-directory* "") -(defun psgraph-xref (&key (mode *default-graphing-mode*) - (output-directory *postscript-output-directory*) - (types-to-ignore *types-to-ignore*) - (compact t) - (shrink t) - root-nodes - insert) - ;; If root-nodes is a non-nil list, uses that list as the starting - ;; position. Otherwise tries to find all roots in the database. - (multiple-value-bind (rooted cycles) - (if root-nodes - (values (gather-tree root-nodes nil mode types-to-ignore compact)) - (make-caller-tree mode types-to-ignore compact)) - (psgraph-output (append rooted cycles) output-directory shrink insert))) - -(defun psgraph-output (list-of-trees directory shrink &optional insert) - (let ((psgraph:*fontsize* 9) - (psgraph:*second-fontsize* 7) -; (psgraph:*boxkind* "fill") - (psgraph:*boxgray* "0") ; .8 - (psgraph:*edgewidth* "1") - (psgraph:*edgegray* "0")) - (labels ((stringify (thing) - (cond ((stringp thing) (string-downcase thing)) - ((symbolp thing) (string-downcase (symbol-name thing))) - ((and (listp thing) (eq (car thing) :xref-list)) - (stringify (cdr thing))) - ((listp thing) (stringify (car thing))) - (t (string thing))))) - (dolist (item list-of-trees) - (let* ((fname (stringify item)) - (filename (concatenate 'string directory - (string-trim '(#\: #\|) fname) - ".ps"))) - (format t "~&Creating PostScript file ~S." filename) - (with-open-file (*standard-output* filename - :direction :output - :if-does-not-exist :create - :if-exists :supersede) - ;; Note that the #'eq prints the DAG as a tree. If - ;; you replace it with #'equal, it will print it as - ;; a DAG, which I think is slightly ugly. - (psgraph:psgraph item - #'caller-tree-children #'caller-info shrink - insert #'eq))))))) - -(defun caller-tree-children (tree) - (when (and tree (listp tree) (not (eq (car tree) :xref-list))) - (cadr tree))) - -(defun caller-tree-node (tree) - (when tree - (cond ((and (listp tree) (eq (car tree) :xref-list)) - (cdr tree)) - ((listp tree) - (car tree)) - (t - tree)))) - -(defun caller-info (tree) - (let ((node (caller-tree-node tree))) - (list node))) -|# -#| -;;; Code to print out graphical trees of CLOS class hierarchies. -(defun print-class-hierarchy (&optional (start-class 'anything) - (file "classes.ps")) - (let ((start (find-class start-class))) - (when start - (with-open-file (*standard-output* file :direction :output) - (psgraph:psgraph start - #'clos::class-direct-subclasses - #'(lambda (x) - (list (format nil "~A" (clos::class-name x)))) - t nil #'eq))))) - -|# - - -;;; **************************************************************** -;;; Cross Referencing Patterns for Common Lisp ********************* -;;; **************************************************************** -(clear-patterns) - -;;; ******************************** -;;; Pattern Substitutions ********** -;;; ******************************** -(define-pattern-substitution integer (:test #'integerp)) -(define-pattern-substitution rational (:test #'rationalp)) -(define-pattern-substitution symbol (:test #'symbolp)) -(define-pattern-substitution string (:test #'stringp)) -(define-pattern-substitution number (:test #'numberp)) -(define-pattern-substitution lambda-list - ((:star var) - (:optional (:eq &optional) - (:star (:or var - (var (:optional form (:optional var)))))) - (:optional (:eq &rest) var) - (:optional (:eq &key) (:star (:or var - ((:or var - (keyword var)) - (:optional form (:optional var))))) - (:optional &allow-other-keys)) - (:optional (:eq &aux) - (:star (:or var - (var (:optional form))))))) -(define-pattern-substitution test form) -(define-pattern-substitution body - ((:star (:or declaration documentation-string)) - (:star form))) -(define-pattern-substitution documentation-string string) -(define-pattern-substitution initial-value form) -(define-pattern-substitution tag symbol) -(define-pattern-substitution declaration ((:eq declare)(:rest :ignore))) -(define-pattern-substitution destination form) -(define-pattern-substitution control-string string) -(define-pattern-substitution format-arguments - ((:star form))) -(define-pattern-substitution fn - (:or ((:eq quote) function) - ((:eq function) function) - function)) - -;;; ******************************** -;;; Caller Patterns **************** -;;; ******************************** - -;;; Types Related -(define-caller-pattern coerce (form :ignore) :lisp) -(define-caller-pattern type-of (form) :lisp) -(define-caller-pattern upgraded-array-element-type (:ignore) :lisp2) -(define-caller-pattern upgraded-complex-part-type (:ignore) :lisp2) - -;;; Lambdas and Definitions -(define-variable-pattern lambda-list-keywords :lisp) -(define-variable-pattern lambda-parameters-limit :lisp) -(define-caller-pattern lambda (lambda-list (:rest body)) :lisp) - -(define-caller-pattern defun - (name lambda-list - (:star (:or documentation-string declaration)) - (:star form)) - :lisp) - -;;; perhaps this should use VAR, instead of NAME -(define-caller-pattern defvar - (var (:optional initial-value (:optional documentation-string))) - :lisp) -(define-caller-pattern defparameter - (var initial-value (:optional documentation-string)) - :lisp) -(define-caller-pattern defconstant - (var initial-value (:optional documentation-string)) - :lisp) - -(define-caller-pattern eval-when - (:ignore ; the situations - (:star form)) - :lisp) - -;;; Logical Values -(define-variable-pattern nil :lisp) -(define-variable-pattern t :lisp) - -;;; Predicates -(define-caller-pattern typep (form form) :lisp) -(define-caller-pattern subtypep (form form) :lisp) - -(define-caller-pattern null (form) :lisp) -(define-caller-pattern symbolp (form) :lisp) -(define-caller-pattern atom (form) :lisp) -(define-caller-pattern consp (form) :lisp) -(define-caller-pattern listp (form) :lisp) -(define-caller-pattern numberp (form) :lisp) -(define-caller-pattern integerp (form) :lisp) -(define-caller-pattern rationalp (form) :lisp) -(define-caller-pattern floatp (form) :lisp) -(define-caller-pattern realp (form) :lisp2) -(define-caller-pattern complexp (form) :lisp) -(define-caller-pattern characterp (form) :lisp) -(define-caller-pattern stringp (form) :lisp) -(define-caller-pattern bit-vector-p (form) :lisp) -(define-caller-pattern vectorp (form) :lisp) -(define-caller-pattern simple-vector-p (form) :lisp) -(define-caller-pattern simple-string-p (form) :lisp) -(define-caller-pattern simple-bit-vector-p (form) :lisp) -(define-caller-pattern arrayp (form) :lisp) -(define-caller-pattern packagep (form) :lisp) -(define-caller-pattern functionp (form) :lisp) -(define-caller-pattern compiled-function-p (form) :lisp) -(define-caller-pattern commonp (form) :lisp) - -;;; Equality Predicates -(define-caller-pattern eq (form form) :lisp) -(define-caller-pattern eql (form form) :lisp) -(define-caller-pattern equal (form form) :lisp) -(define-caller-pattern equalp (form form) :lisp) - -;;; Logical Operators -(define-caller-pattern not (form) :lisp) -(define-caller-pattern or ((:star form)) :lisp) -(define-caller-pattern and ((:star form)) :lisp) - -;;; Reference - -;;; Quote is a problem. In Defmacro & friends, we'd like to actually -;;; look at the argument, 'cause it hides internal function calls -;;; of the defmacro. -(define-caller-pattern quote (:ignore) :lisp) - -(define-caller-pattern function ((:or fn form)) :lisp) -(define-caller-pattern symbol-value (form) :lisp) -(define-caller-pattern symbol-function (form) :lisp) -(define-caller-pattern fdefinition (form) :lisp2) -(define-caller-pattern boundp (form) :lisp) -(define-caller-pattern fboundp (form) :lisp) -(define-caller-pattern special-form-p (form) :lisp) - -;;; Assignment -(define-caller-pattern setq ((:star var form)) :lisp) -(define-caller-pattern psetq ((:star var form)) :lisp) -(define-caller-pattern set (form form) :lisp) -(define-caller-pattern makunbound (form) :lisp) -(define-caller-pattern fmakunbound (form) :lisp) - -;;; Generalized Variables -(define-caller-pattern setf ((:star form form)) :lisp) -(define-caller-pattern psetf ((:star form form)) :lisp) -(define-caller-pattern shiftf ((:plus form) form) :lisp) -(define-caller-pattern rotatef ((:star form)) :lisp) -(define-caller-pattern define-modify-macro - (name - lambda-list - fn - (:optional documentation-string)) - :lisp) -(define-caller-pattern defsetf - (:or (name name (:optional documentation-string)) - (name lambda-list (var) - (:star (:or declaration documentation-string)) - (:star form))) - :lisp) -(define-caller-pattern define-setf-method - (name lambda-list - (:star (:or declaration documentation-string)) - (:star form)) - :lisp) -(define-caller-pattern get-setf-method (form) :lisp) -(define-caller-pattern get-setf-method-multiple-value (form) :lisp) - - -;;; Function invocation -(define-caller-pattern apply (fn form (:star form)) :lisp) -(define-caller-pattern funcall (fn (:star form)) :lisp) - - -;;; Simple sequencing -(define-caller-pattern progn ((:star form)) :lisp) -(define-caller-pattern prog1 (form (:star form)) :lisp) -(define-caller-pattern prog2 (form form (:star form)) :lisp) - -;;; Variable bindings -(define-caller-pattern let - (((:star (:or var (var &optional form)))) - (:star declaration) - (:star form)) - :lisp) -(define-caller-pattern let* - (((:star (:or var (var &optional form)))) - (:star declaration) - (:star form)) - :lisp) -(define-caller-pattern compiler-let - (((:star (:or var (var form)))) - (:star form)) - :lisp) -(define-caller-pattern progv - (form form (:star form)) :lisp) -(define-caller-pattern flet - (((:star (name lambda-list - (:star (:or declaration - documentation-string)) - (:star form)))) - (:star form)) - :lisp) -(define-caller-pattern labels - (((:star (name lambda-list - (:star (:or declaration - documentation-string)) - (:star form)))) - (:star form)) - :lisp) -(define-caller-pattern macrolet - (((:star (name lambda-list - (:star (:or declaration - documentation-string)) - (:star form)))) - (:star form)) - :lisp) -(define-caller-pattern symbol-macrolet - (((:star (var form))) (:star declaration) (:star form)) - :lisp2) - -;;; Conditionals -(define-caller-pattern if (test form (:optional form)) :lisp) -(define-caller-pattern when (test (:star form)) :lisp) -(define-caller-pattern unless (test (:star form)) :lisp) -(define-caller-pattern cond ((:star (test (:star form)))) :lisp) -(define-caller-pattern case - (form - (:star ((:or symbol - ((:star symbol))) - (:star form)))) - :lisp) -(define-caller-pattern typecase (form (:star (symbol (:star form)))) - :lisp) - -;;; Blocks and Exits -(define-caller-pattern block (name (:star form)) :lisp) -(define-caller-pattern return-from (function (:optional form)) :lisp) -(define-caller-pattern return ((:optional form)) :lisp) - -;;; Iteration -(define-caller-pattern loop ((:star form)) :lisp) -(define-caller-pattern do - (((:star (:or var - (var (:optional form (:optional form)))))) ; init step - (form (:star form)) ; end-test result - (:star declaration) - (:star (:or tag form))) ; statement - :lisp) -(define-caller-pattern do* - (((:star (:or var - (var (:optional form (:optional form)))))) - (form (:star form)) - (:star declaration) - (:star (:or tag form))) - :lisp) -(define-caller-pattern dolist - ((var form (:optional form)) - (:star declaration) - (:star (:or tag form))) - :lisp) -(define-caller-pattern dotimes - ((var form (:optional form)) - (:star declaration) - (:star (:or tag form))) - :lisp) - -;;; Mapping -(define-caller-pattern mapcar (fn form (:star form)) :lisp) -(define-caller-pattern maplist (fn form (:star form)) :lisp) -(define-caller-pattern mapc (fn form (:star form)) :lisp) -(define-caller-pattern mapl (fn form (:star form)) :lisp) -(define-caller-pattern mapcan (fn form (:star form)) :lisp) -(define-caller-pattern mapcon (fn form (:star form)) :lisp) - -;;; The "Program Feature" -(define-caller-pattern tagbody ((:star (:or tag form))) :lisp) -(define-caller-pattern prog - (((:star (:or var (var (:optional form))))) - (:star declaration) - (:star (:or tag form))) - :lisp) -(define-caller-pattern prog* - (((:star (:or var (var (:optional form))))) - (:star declaration) - (:star (:or tag form))) - :lisp) -(define-caller-pattern go (tag) :lisp) - -;;; Multiple Values -(define-caller-pattern values ((:star form)) :lisp) -(define-variable-pattern multiple-values-limit :lisp) -(define-caller-pattern values-list (form) :lisp) -(define-caller-pattern multiple-value-list (form) :lisp) -(define-caller-pattern multiple-value-call (fn (:star form)) :lisp) -(define-caller-pattern multiple-value-prog1 (form (:star form)) :lisp) -(define-caller-pattern multiple-value-bind - (((:star var)) form - (:star declaration) - (:star form)) - :lisp) -(define-caller-pattern multiple-value-setq (((:star var)) form) :lisp) -(define-caller-pattern nth-value (form form) :lisp2) - -;;; Dynamic Non-Local Exits -(define-caller-pattern catch (tag (:star form)) :lisp) -(define-caller-pattern throw (tag form) :lisp) -(define-caller-pattern unwind-protect (form (:star form)) :lisp) - -;;; Macros -(define-caller-pattern macro-function (form) :lisp) -(define-caller-pattern defmacro - (name - lambda-list - (:star (:or declaration documentation-string)) - (:star form)) - :lisp) -(define-caller-pattern macroexpand (form (:optional :ignore)) :lisp) -(define-caller-pattern macroexpand-1 (form (:optional :ignore)) :lisp) -(define-variable-pattern *macroexpand-hook* :lisp) - -;;; Destructuring -(define-caller-pattern destructuring-bind - (lambda-list form - (:star declaration) - (:star form)) - :lisp2) - -;;; Compiler Macros -(define-caller-pattern define-compiler-macro - (name lambda-list - (:star (:or declaration documentation-string)) - (:star form)) - :lisp2) -(define-caller-pattern compiler-macro-function (form) :lisp2) -(define-caller-pattern compiler-macroexpand (form (:optional :ignore)) :lisp2) -(define-caller-pattern compiler-macroexpand-1 (form (:optional :ignore)) - :lisp2) - -;;; Environments -(define-caller-pattern variable-information (form &optional :ignore) - :lisp2) -(define-caller-pattern function-information (fn &optional :ignore) :lisp2) -(define-caller-pattern declaration-information (form &optional :ignore) :lisp2) -(define-caller-pattern augment-environment (form &key (:star :ignore)) :lisp2) -(define-caller-pattern define-declaration - (name - lambda-list - (:star form)) - :lisp2) -(define-caller-pattern parse-macro (name lambda-list form) :lisp2) -(define-caller-pattern enclose (form &optional :ignore) :lisp2) - - -;;; Declarations -(define-caller-pattern declare ((:rest :ignore)) :lisp) -(define-caller-pattern proclaim ((:rest :ignore)) :lisp) -(define-caller-pattern locally ((:star declaration) (:star form)) :lisp) -(define-caller-pattern declaim ((:rest :ignore)) :lisp2) -(define-caller-pattern the (form form) :lisp) - -;;; Symbols -(define-caller-pattern get (form form (:optional form)) :lisp) -(define-caller-pattern remprop (form form) :lisp) -(define-caller-pattern symbol-plist (form) :lisp) -(define-caller-pattern getf (form form (:optional form)) :lisp) -(define-caller-pattern remf (form form) :lisp) -(define-caller-pattern get-properties (form form) :lisp) - -(define-caller-pattern symbol-name (form) :lisp) -(define-caller-pattern make-symbol (form) :lisp) -(define-caller-pattern copy-symbol (form (:optional :ignore)) :lisp) -(define-caller-pattern gensym ((:optional :ignore)) :lisp) -(define-variable-pattern *gensym-counter* :lisp2) -(define-caller-pattern gentemp ((:optional :ignore :ignore)) :lisp) -(define-caller-pattern symbol-package (form) :lisp) -(define-caller-pattern keywordp (form) :lisp) - -;;; Packages -(define-variable-pattern *package* :lisp) -(define-caller-pattern make-package ((:rest :ignore)) :lisp) -(define-caller-pattern in-package ((:rest :ignore)) :lisp) -(define-caller-pattern find-package ((:rest :ignore)) :lisp) -(define-caller-pattern package-name ((:rest :ignore)) :lisp) -(define-caller-pattern package-nicknames ((:rest :ignore)) :lisp) -(define-caller-pattern rename-package ((:rest :ignore)) :lisp) -(define-caller-pattern package-use-list ((:rest :ignore)) :lisp) -(define-caller-pattern package-used-by-list ((:rest :ignore)) :lisp) -(define-caller-pattern package-shadowing-symbols ((:rest :ignore)) :lisp) -(define-caller-pattern list-all-packages () :lisp) -(define-caller-pattern delete-package ((:rest :ignore)) :lisp2) -(define-caller-pattern intern (form &optional :ignore) :lisp) -(define-caller-pattern find-symbol (form &optional :ignore) :lisp) -(define-caller-pattern unintern (form &optional :ignore) :lisp) - -(define-caller-pattern export ((:or symbol ((:star symbol))) - &optional :ignore) :lisp) -(define-caller-pattern unexport ((:or symbol ((:star symbol))) - &optional :ignore) :lisp) -(define-caller-pattern import ((:or symbol ((:star symbol))) - &optional :ignore) :lisp) -(define-caller-pattern shadowing-import ((:or symbol ((:star symbol))) - &optional :ignore) :lisp) -(define-caller-pattern shadow ((:or symbol ((:star symbol))) - &optional :ignore) :lisp) - -(define-caller-pattern use-package ((:rest :ignore)) :lisp) -(define-caller-pattern unuse-package ((:rest :ignore)) :lisp) -(define-caller-pattern defpackage (name (:rest :ignore)) :lisp2) -(define-caller-pattern find-all-symbols (form) :lisp) -(define-caller-pattern do-symbols - ((var (:optional form (:optional form))) - (:star declaration) - (:star (:or tag form))) - :lisp) -(define-caller-pattern do-external-symbols - ((var (:optional form (:optional form))) - (:star declaration) - (:star (:or tag form))) - :lisp) -(define-caller-pattern do-all-symbols - ((var (:optional form)) - (:star declaration) - (:star (:or tag form))) - :lisp) -(define-caller-pattern with-package-iterator - ((name form (:plus :ignore)) - (:star form)) - :lisp2) - -;;; Modules -(define-variable-pattern *modules* :lisp) -(define-caller-pattern provide (form) :lisp) -(define-caller-pattern require (form &optional :ignore) :lisp) - - -;;; Numbers -(define-caller-pattern zerop (form) :lisp) -(define-caller-pattern plusp (form) :lisp) -(define-caller-pattern minusp (form) :lisp) -(define-caller-pattern oddp (form) :lisp) -(define-caller-pattern evenp (form) :lisp) - -(define-caller-pattern = (form (:star form)) :lisp) -(define-caller-pattern /= (form (:star form)) :lisp) -(define-caller-pattern > (form (:star form)) :lisp) -(define-caller-pattern < (form (:star form)) :lisp) -(define-caller-pattern <= (form (:star form)) :lisp) -(define-caller-pattern >= (form (:star form)) :lisp) - -(define-caller-pattern max (form (:star form)) :lisp) -(define-caller-pattern min (form (:star form)) :lisp) - -(define-caller-pattern - (form (:star form)) :lisp) -(define-caller-pattern + (form (:star form)) :lisp) -(define-caller-pattern * (form (:star form)) :lisp) -(define-caller-pattern / (form (:star form)) :lisp) -(define-caller-pattern 1+ (form) :lisp) -(define-caller-pattern 1- (form) :lisp) - -(define-caller-pattern incf (form form) :lisp) -(define-caller-pattern decf (form form) :lisp) - -(define-caller-pattern conjugate (form) :lisp) - -(define-caller-pattern gcd ((:star form)) :lisp) -(define-caller-pattern lcm ((:star form)) :lisp) - -(define-caller-pattern exp (form) :lisp) -(define-caller-pattern expt (form form) :lisp) -(define-caller-pattern log (form (:optional form)) :lisp) -(define-caller-pattern sqrt (form) :lisp) -(define-caller-pattern isqrt (form) :lisp) - -(define-caller-pattern abs (form) :lisp) -(define-caller-pattern phase (form) :lisp) -(define-caller-pattern signum (form) :lisp) -(define-caller-pattern sin (form) :lisp) -(define-caller-pattern cos (form) :lisp) -(define-caller-pattern tan (form) :lisp) -(define-caller-pattern cis (form) :lisp) -(define-caller-pattern asin (form) :lisp) -(define-caller-pattern acos (form) :lisp) -(define-caller-pattern atan (form &optional form) :lisp) -(define-variable-pattern pi :lisp) - -(define-caller-pattern sinh (form) :lisp) -(define-caller-pattern cosh (form) :lisp) -(define-caller-pattern tanh (form) :lisp) -(define-caller-pattern asinh (form) :lisp) -(define-caller-pattern acosh (form) :lisp) -(define-caller-pattern atanh (form) :lisp) - -;;; Type Conversions and Extractions -(define-caller-pattern float (form (:optional form)) :lisp) -(define-caller-pattern rational (form) :lisp) -(define-caller-pattern rationalize (form) :lisp) -(define-caller-pattern numerator (form) :lisp) -(define-caller-pattern denominator (form) :lisp) - -(define-caller-pattern floor (form (:optional form)) :lisp) -(define-caller-pattern ceiling (form (:optional form)) :lisp) -(define-caller-pattern truncate (form (:optional form)) :lisp) -(define-caller-pattern round (form (:optional form)) :lisp) - -(define-caller-pattern mod (form form) :lisp) -(define-caller-pattern rem (form form) :lisp) - -(define-caller-pattern ffloor (form (:optional form)) :lisp) -(define-caller-pattern fceiling (form (:optional form)) :lisp) -(define-caller-pattern ftruncate (form (:optional form)) :lisp) -(define-caller-pattern fround (form (:optional form)) :lisp) - -(define-caller-pattern decode-float (form) :lisp) -(define-caller-pattern scale-float (form form) :lisp) -(define-caller-pattern float-radix (form) :lisp) -(define-caller-pattern float-sign (form (:optional form)) :lisp) -(define-caller-pattern float-digits (form) :lisp) -(define-caller-pattern float-precision (form) :lisp) -(define-caller-pattern integer-decode-float (form) :lisp) - -(define-caller-pattern complex (form (:optional form)) :lisp) -(define-caller-pattern realpart (form) :lisp) -(define-caller-pattern imagpart (form) :lisp) - -(define-caller-pattern logior ((:star form)) :lisp) -(define-caller-pattern logxor ((:star form)) :lisp) -(define-caller-pattern logand ((:star form)) :lisp) -(define-caller-pattern logeqv ((:star form)) :lisp) - -(define-caller-pattern lognand (form form) :lisp) -(define-caller-pattern lognor (form form) :lisp) -(define-caller-pattern logandc1 (form form) :lisp) -(define-caller-pattern logandc2 (form form) :lisp) -(define-caller-pattern logorc1 (form form) :lisp) -(define-caller-pattern logorc2 (form form) :lisp) - -(define-caller-pattern boole (form form form) :lisp) -(define-variable-pattern boole-clr :lisp) -(define-variable-pattern boole-set :lisp) -(define-variable-pattern boole-1 :lisp) -(define-variable-pattern boole-2 :lisp) -(define-variable-pattern boole-c1 :lisp) -(define-variable-pattern boole-c2 :lisp) -(define-variable-pattern boole-and :lisp) -(define-variable-pattern boole-ior :lisp) -(define-variable-pattern boole-xor :lisp) -(define-variable-pattern boole-eqv :lisp) -(define-variable-pattern boole-nand :lisp) -(define-variable-pattern boole-nor :lisp) -(define-variable-pattern boole-andc1 :lisp) -(define-variable-pattern boole-andc2 :lisp) -(define-variable-pattern boole-orc1 :lisp) -(define-variable-pattern boole-orc2 :lisp) - -(define-caller-pattern lognot (form) :lisp) -(define-caller-pattern logtest (form form) :lisp) -(define-caller-pattern logbitp (form form) :lisp) -(define-caller-pattern ash (form form) :lisp) -(define-caller-pattern logcount (form) :lisp) -(define-caller-pattern integer-length (form) :lisp) - -(define-caller-pattern byte (form form) :lisp) -(define-caller-pattern byte-size (form) :lisp) -(define-caller-pattern byte-position (form) :lisp) -(define-caller-pattern ldb (form form) :lisp) -(define-caller-pattern ldb-test (form form) :lisp) -(define-caller-pattern mask-field (form form) :lisp) -(define-caller-pattern dpb (form form form) :lisp) -(define-caller-pattern deposit-field (form form form) :lisp) - -;;; Random Numbers -(define-caller-pattern random (form (:optional form)) :lisp) -(define-variable-pattern *random-state* :lisp) -(define-caller-pattern make-random-state ((:optional form)) :lisp) -(define-caller-pattern random-state-p (form) :lisp) - -;;; Implementation Parameters -(define-variable-pattern most-positive-fixnum :lisp) -(define-variable-pattern most-negative-fixnum :lisp) -(define-variable-pattern most-positive-short-float :lisp) -(define-variable-pattern least-positive-short-float :lisp) -(define-variable-pattern least-negative-short-float :lisp) -(define-variable-pattern most-negative-short-float :lisp) -(define-variable-pattern most-positive-single-float :lisp) -(define-variable-pattern least-positive-single-float :lisp) -(define-variable-pattern least-negative-single-float :lisp) -(define-variable-pattern most-negative-single-float :lisp) -(define-variable-pattern most-positive-double-float :lisp) -(define-variable-pattern least-positive-double-float :lisp) -(define-variable-pattern least-negative-double-float :lisp) -(define-variable-pattern most-negative-double-float :lisp) -(define-variable-pattern most-positive-long-float :lisp) -(define-variable-pattern least-positive-long-float :lisp) -(define-variable-pattern least-negative-long-float :lisp) -(define-variable-pattern most-negative-long-float :lisp) -(define-variable-pattern least-positive-normalized-short-float :lisp2) -(define-variable-pattern least-negative-normalized-short-float :lisp2) -(define-variable-pattern least-positive-normalized-single-float :lisp2) -(define-variable-pattern least-negative-normalized-single-float :lisp2) -(define-variable-pattern least-positive-normalized-double-float :lisp2) -(define-variable-pattern least-negative-normalized-double-float :lisp2) -(define-variable-pattern least-positive-normalized-long-float :lisp2) -(define-variable-pattern least-negative-normalized-long-float :lisp2) -(define-variable-pattern short-float-epsilon :lisp) -(define-variable-pattern single-float-epsilon :lisp) -(define-variable-pattern double-float-epsilon :lisp) -(define-variable-pattern long-float-epsilon :lisp) -(define-variable-pattern short-float-negative-epsilon :lisp) -(define-variable-pattern single-float-negative-epsilon :lisp) -(define-variable-pattern double-float-negative-epsilon :lisp) -(define-variable-pattern long-float-negative-epsilon :lisp) - -;;; Characters -(define-variable-pattern char-code-limit :lisp) -(define-variable-pattern char-font-limit :lisp) -(define-variable-pattern char-bits-limit :lisp) -(define-caller-pattern standard-char-p (form) :lisp) -(define-caller-pattern graphic-char-p (form) :lisp) -(define-caller-pattern string-char-p (form) :lisp) -(define-caller-pattern alpha-char-p (form) :lisp) -(define-caller-pattern upper-case-p (form) :lisp) -(define-caller-pattern lower-case-p (form) :lisp) -(define-caller-pattern both-case-p (form) :lisp) -(define-caller-pattern digit-char-p (form (:optional form)) :lisp) -(define-caller-pattern alphanumericp (form) :lisp) - -(define-caller-pattern char= ((:star form)) :lisp) -(define-caller-pattern char/= ((:star form)) :lisp) -(define-caller-pattern char< ((:star form)) :lisp) -(define-caller-pattern char> ((:star form)) :lisp) -(define-caller-pattern char<= ((:star form)) :lisp) -(define-caller-pattern char>= ((:star form)) :lisp) - -(define-caller-pattern char-equal ((:star form)) :lisp) -(define-caller-pattern char-not-equal ((:star form)) :lisp) -(define-caller-pattern char-lessp ((:star form)) :lisp) -(define-caller-pattern char-greaterp ((:star form)) :lisp) -(define-caller-pattern char-not-greaterp ((:star form)) :lisp) -(define-caller-pattern char-not-lessp ((:star form)) :lisp) - -(define-caller-pattern char-code (form) :lisp) -(define-caller-pattern char-bits (form) :lisp) -(define-caller-pattern char-font (form) :lisp) -(define-caller-pattern code-char (form (:optional form form)) :lisp) -(define-caller-pattern make-char (form (:optional form form)) :lisp) -(define-caller-pattern characterp (form) :lisp) -(define-caller-pattern char-upcase (form) :lisp) -(define-caller-pattern char-downcase (form) :lisp) -(define-caller-pattern digit-char (form (:optional form form)) :lisp) -(define-caller-pattern char-int (form) :lisp) -(define-caller-pattern int-char (form) :lisp) -(define-caller-pattern char-name (form) :lisp) -(define-caller-pattern name-char (form) :lisp) -(define-variable-pattern char-control-bit :lisp) -(define-variable-pattern char-meta-bit :lisp) -(define-variable-pattern char-super-bit :lisp) -(define-variable-pattern char-hyper-bit :lisp) -(define-caller-pattern char-bit (form form) :lisp) -(define-caller-pattern set-char-bit (form form form) :lisp) - -;;; Sequences -(define-caller-pattern complement (fn) :lisp2) -(define-caller-pattern elt (form form) :lisp) -(define-caller-pattern subseq (form form &optional form) :lisp) -(define-caller-pattern copy-seq (form) :lisp) -(define-caller-pattern length (form) :lisp) -(define-caller-pattern reverse (form) :lisp) -(define-caller-pattern nreverse (form) :lisp) -(define-caller-pattern make-sequence (form form &key form) :lisp) - -(define-caller-pattern concatenate (form (:star form)) :lisp) -(define-caller-pattern map (form fn form (:star form)) :lisp) -(define-caller-pattern map-into (form fn (:star form)) :lisp2) - -(define-caller-pattern some (fn form (:star form)) :lisp) -(define-caller-pattern every (fn form (:star form)) :lisp) -(define-caller-pattern notany (fn form (:star form)) :lisp) -(define-caller-pattern notevery (fn form (:star form)) :lisp) - -(define-caller-pattern reduce (fn form &key (:star form)) :lisp) -(define-caller-pattern fill (form form &key (:star form)) :lisp) -(define-caller-pattern replace (form form &key (:star form)) :lisp) -(define-caller-pattern remove (form form &key (:star form)) :lisp) -(define-caller-pattern remove-if (fn form &key (:star form)) :lisp) -(define-caller-pattern remove-if-not (fn form &key (:star form)) :lisp) -(define-caller-pattern delete (form form &key (:star form)) :lisp) -(define-caller-pattern delete-if (fn form &key (:star form)) :lisp) -(define-caller-pattern delete-if-not (fn form &key (:star form)) :lisp) -(define-caller-pattern remove-duplicates (form &key (:star form)) :lisp) -(define-caller-pattern delete-duplicates (form &key (:star form)) :lisp) -(define-caller-pattern substitute (form form form &key (:star form)) :lisp) -(define-caller-pattern substitute-if (form fn form &key (:star form)) :lisp) -(define-caller-pattern substitute-if-not (form fn form &key (:star form)) - :lisp) -(define-caller-pattern nsubstitute (form form form &key (:star form)) :lisp) -(define-caller-pattern nsubstitute-if (form fn form &key (:star form)) :lisp) -(define-caller-pattern nsubstitute-if-not (form fn form &key (:star form)) - :lisp) -(define-caller-pattern find (form form &key (:star form)) :lisp) -(define-caller-pattern find-if (fn form &key (:star form)) :lisp) -(define-caller-pattern find-if-not (fn form &key (:star form)) :lisp) -(define-caller-pattern position (form form &key (:star form)) :lisp) -(define-caller-pattern position-if (fn form &key (:star form)) :lisp) -(define-caller-pattern position-if-not (fn form &key (:star form)) :lisp) -(define-caller-pattern count (form form &key (:star form)) :lisp) -(define-caller-pattern count-if (fn form &key (:star form)) :lisp) -(define-caller-pattern count-if-not (fn form &key (:star form)) :lisp) -(define-caller-pattern mismatch (form form &key (:star form)) :lisp) -(define-caller-pattern search (form form &key (:star form)) :lisp) -(define-caller-pattern sort (form fn &key (:star form)) :lisp) -(define-caller-pattern stable-sort (form fn &key (:star form)) :lisp) -(define-caller-pattern merge (form form form fn &key (:star form)) :lisp) - -;;; Lists -(define-caller-pattern car (form) :lisp) -(define-caller-pattern cdr (form) :lisp) -(define-caller-pattern caar (form) :lisp) -(define-caller-pattern cadr (form) :lisp) -(define-caller-pattern cdar (form) :lisp) -(define-caller-pattern cddr (form) :lisp) -(define-caller-pattern caaar (form) :lisp) -(define-caller-pattern caadr (form) :lisp) -(define-caller-pattern cadar (form) :lisp) -(define-caller-pattern caddr (form) :lisp) -(define-caller-pattern cdaar (form) :lisp) -(define-caller-pattern cdadr (form) :lisp) -(define-caller-pattern cddar (form) :lisp) -(define-caller-pattern cdddr (form) :lisp) -(define-caller-pattern caaaar (form) :lisp) -(define-caller-pattern caaadr (form) :lisp) -(define-caller-pattern caadar (form) :lisp) -(define-caller-pattern caaddr (form) :lisp) -(define-caller-pattern cadaar (form) :lisp) -(define-caller-pattern cadadr (form) :lisp) -(define-caller-pattern caddar (form) :lisp) -(define-caller-pattern cadddr (form) :lisp) -(define-caller-pattern cdaaar (form) :lisp) -(define-caller-pattern cdaadr (form) :lisp) -(define-caller-pattern cdadar (form) :lisp) -(define-caller-pattern cdaddr (form) :lisp) -(define-caller-pattern cddaar (form) :lisp) -(define-caller-pattern cddadr (form) :lisp) -(define-caller-pattern cdddar (form) :lisp) -(define-caller-pattern cddddr (form) :lisp) - -(define-caller-pattern cons (form form) :lisp) -(define-caller-pattern tree-equal (form form &key (:star fn)) :lisp) -(define-caller-pattern endp (form) :lisp) -(define-caller-pattern list-length (form) :lisp) -(define-caller-pattern nth (form form) :lisp) - -(define-caller-pattern first (form) :lisp) -(define-caller-pattern second (form) :lisp) -(define-caller-pattern third (form) :lisp) -(define-caller-pattern fourth (form) :lisp) -(define-caller-pattern fifth (form) :lisp) -(define-caller-pattern sixth (form) :lisp) -(define-caller-pattern seventh (form) :lisp) -(define-caller-pattern eighth (form) :lisp) -(define-caller-pattern ninth (form) :lisp) -(define-caller-pattern tenth (form) :lisp) - -(define-caller-pattern rest (form) :lisp) -(define-caller-pattern nthcdr (form form) :lisp) -(define-caller-pattern last (form (:optional form)) :lisp) -(define-caller-pattern list ((:star form)) :lisp) -(define-caller-pattern list* ((:star form)) :lisp) -(define-caller-pattern make-list (form &key (:star form)) :lisp) -(define-caller-pattern append ((:star form)) :lisp) -(define-caller-pattern copy-list (form) :lisp) -(define-caller-pattern copy-alist (form) :lisp) -(define-caller-pattern copy-tree (form) :lisp) -(define-caller-pattern revappend (form form) :lisp) -(define-caller-pattern nconc ((:star form)) :lisp) -(define-caller-pattern nreconc (form form) :lisp) -(define-caller-pattern push (form form) :lisp) -(define-caller-pattern pushnew (form form &key (:star form)) :lisp) -(define-caller-pattern pop (form) :lisp) -(define-caller-pattern butlast (form (:optional form)) :lisp) -(define-caller-pattern nbutlast (form (:optional form)) :lisp) -(define-caller-pattern ldiff (form form) :lisp) -(define-caller-pattern rplaca (form form) :lisp) -(define-caller-pattern rplacd (form form) :lisp) - -(define-caller-pattern subst (form form form &key (:star form)) :lisp) -(define-caller-pattern subst-if (form fn form &key (:star form)) :lisp) -(define-caller-pattern subst-if-not (form fn form &key (:star form)) :lisp) -(define-caller-pattern nsubst (form form form &key (:star form)) :lisp) -(define-caller-pattern nsubst-if (form fn form &key (:star form)) :lisp) -(define-caller-pattern nsubst-if-not (form fn form &key (:star form)) :lisp) -(define-caller-pattern sublis (form form &key (:star form)) :lisp) -(define-caller-pattern nsublis (form form &key (:star form)) :lisp) -(define-caller-pattern member (form form &key (:star form)) :lisp) -(define-caller-pattern member-if (fn form &key (:star form)) :lisp) -(define-caller-pattern member-if-not (fn form &key (:star form)) :lisp) - -(define-caller-pattern tailp (form form) :lisp) -(define-caller-pattern adjoin (form form &key (:star form)) :lisp) -(define-caller-pattern union (form form &key (:star form)) :lisp) -(define-caller-pattern nunion (form form &key (:star form)) :lisp) -(define-caller-pattern intersection (form form &key (:star form)) :lisp) -(define-caller-pattern nintersection (form form &key (:star form)) :lisp) -(define-caller-pattern set-difference (form form &key (:star form)) :lisp) -(define-caller-pattern nset-difference (form form &key (:star form)) :lisp) -(define-caller-pattern set-exclusive-or (form form &key (:star form)) :lisp) -(define-caller-pattern nset-exclusive-or (form form &key (:star form)) :lisp) -(define-caller-pattern subsetp (form form &key (:star form)) :lisp) - -(define-caller-pattern acons (form form form) :lisp) -(define-caller-pattern pairlis (form form (:optional form)) :lisp) -(define-caller-pattern assoc (form form &key (:star form)) :lisp) -(define-caller-pattern assoc-if (fn form) :lisp) -(define-caller-pattern assoc-if-not (fn form) :lisp) -(define-caller-pattern rassoc (form form &key (:star form)) :lisp) -(define-caller-pattern rassoc-if (fn form &key (:star form)) :lisp) -(define-caller-pattern rassoc-if-not (fn form &key (:star form)) :lisp) - -;;; Hash Tables -(define-caller-pattern make-hash-table (&key (:star form)) :lisp) -(define-caller-pattern hash-table-p (form) :lisp) -(define-caller-pattern gethash (form form (:optional form)) :lisp) -(define-caller-pattern remhash (form form) :lisp) -(define-caller-pattern maphash (fn form) :lisp) -(define-caller-pattern clrhash (form) :lisp) -(define-caller-pattern hash-table-count (form) :lisp) -(define-caller-pattern with-hash-table-iterator - ((name form) (:star form)) :lisp2) -(define-caller-pattern hash-table-rehash-size (form) :lisp2) -(define-caller-pattern hash-table-rehash-threshold (form) :lisp2) -(define-caller-pattern hash-table-size (form) :lisp2) -(define-caller-pattern hash-table-test (form) :lisp2) -(define-caller-pattern sxhash (form) :lisp) - -;;; Arrays -(define-caller-pattern make-array (form &key (:star form)) :lisp) -(define-variable-pattern array-rank-limit :lisp) -(define-variable-pattern array-dimension-limit :lisp) -(define-variable-pattern array-total-size-limit :lisp) -(define-caller-pattern vector ((:star form)) :lisp) -(define-caller-pattern aref (form (:star form)) :lisp) -(define-caller-pattern svref (form form) :lisp) -(define-caller-pattern array-element-type (form) :lisp) -(define-caller-pattern array-rank (form) :lisp) -(define-caller-pattern array-dimension (form form) :lisp) -(define-caller-pattern array-dimensions (form) :lisp) -(define-caller-pattern array-total-size (form) :lisp) -(define-caller-pattern array-in-bounds-p (form (:star form)) :lisp) -(define-caller-pattern array-row-major-index (form (:star form)) :lisp) -(define-caller-pattern row-major-aref (form form) :lisp2) -(define-caller-pattern adjustable-array-p (form) :lisp) - -(define-caller-pattern bit (form (:star form)) :lisp) -(define-caller-pattern sbit (form (:star form)) :lisp) - -(define-caller-pattern bit-and (form form (:optional form)) :lisp) -(define-caller-pattern bit-ior (form form (:optional form)) :lisp) -(define-caller-pattern bit-xor (form form (:optional form)) :lisp) -(define-caller-pattern bit-eqv (form form (:optional form)) :lisp) -(define-caller-pattern bit-nand (form form (:optional form)) :lisp) -(define-caller-pattern bit-nor (form form (:optional form)) :lisp) -(define-caller-pattern bit-andc1 (form form (:optional form)) :lisp) -(define-caller-pattern bit-andc2 (form form (:optional form)) :lisp) -(define-caller-pattern bit-orc1 (form form (:optional form)) :lisp) -(define-caller-pattern bit-orc2 (form form (:optional form)) :lisp) -(define-caller-pattern bit-not (form (:optional form)) :lisp) - -(define-caller-pattern array-has-fill-pointer-p (form) :lisp) -(define-caller-pattern fill-pointer (form) :lisp) -(define-caller-pattern vector-push (form form) :lisp) -(define-caller-pattern vector-push-extend (form form (:optional form)) :lisp) -(define-caller-pattern vector-pop (form) :lisp) -(define-caller-pattern adjust-array (form form &key (:star form)) :lisp) - -;;; Strings -(define-caller-pattern char (form form) :lisp) -(define-caller-pattern schar (form form) :lisp) -(define-caller-pattern string= (form form &key (:star form)) :lisp) -(define-caller-pattern string-equal (form form &key (:star form)) :lisp) -(define-caller-pattern string< (form form &key (:star form)) :lisp) -(define-caller-pattern string> (form form &key (:star form)) :lisp) -(define-caller-pattern string<= (form form &key (:star form)) :lisp) -(define-caller-pattern string>= (form form &key (:star form)) :lisp) -(define-caller-pattern string/= (form form &key (:star form)) :lisp) -(define-caller-pattern string-lessp (form form &key (:star form)) :lisp) -(define-caller-pattern string-greaterp (form form &key (:star form)) :lisp) -(define-caller-pattern string-not-greaterp (form form &key (:star form)) :lisp) -(define-caller-pattern string-not-lessp (form form &key (:star form)) :lisp) -(define-caller-pattern string-not-equal (form form &key (:star form)) :lisp) - -(define-caller-pattern make-string (form &key (:star form)) :lisp) -(define-caller-pattern string-trim (form form) :lisp) -(define-caller-pattern string-left-trim (form form) :lisp) -(define-caller-pattern string-right-trim (form form) :lisp) -(define-caller-pattern string-upcase (form &key (:star form)) :lisp) -(define-caller-pattern string-downcase (form &key (:star form)) :lisp) -(define-caller-pattern string-capitalize (form &key (:star form)) :lisp) -(define-caller-pattern nstring-upcase (form &key (:star form)) :lisp) -(define-caller-pattern nstring-downcase (form &key (:star form)) :lisp) -(define-caller-pattern nstring-capitalize (form &key (:star form)) :lisp) -(define-caller-pattern string (form) :lisp) - -;;; Structures -(define-caller-pattern defstruct - ((:or name (name (:rest :ignore))) - (:optional documentation-string) - (:plus :ignore)) - :lisp) - -;;; The Evaluator -(define-caller-pattern eval (form) :lisp) -(define-variable-pattern *evalhook* :lisp) -(define-variable-pattern *applyhook* :lisp) -(define-caller-pattern evalhook (form fn fn &optional :ignore) :lisp) -(define-caller-pattern applyhook (fn form fn fn &optional :ignore) :lisp) -(define-caller-pattern constantp (form) :lisp) - -;;; Streams -(define-variable-pattern *standard-input* :lisp) -(define-variable-pattern *standard-output* :lisp) -(define-variable-pattern *error-output* :lisp) -(define-variable-pattern *query-io* :lisp) -(define-variable-pattern *debug-io* :lisp) -(define-variable-pattern *terminal-io* :lisp) -(define-variable-pattern *trace-output* :lisp) -(define-caller-pattern make-synonym-stream (symbol) :lisp) -(define-caller-pattern make-broadcast-stream ((:star form)) :lisp) -(define-caller-pattern make-concatenated-stream ((:star form)) :lisp) -(define-caller-pattern make-two-way-stream (form form) :lisp) -(define-caller-pattern make-echo-stream (form form) :lisp) -(define-caller-pattern make-string-input-stream (form &optional form form) - :lisp) -(define-caller-pattern make-string-output-stream (&key (:star form)) :lisp) -(define-caller-pattern get-output-stream-string (form) :lisp) - -(define-caller-pattern with-open-stream - ((var form) - (:star declaration) - (:star form)) - :lisp) - -(define-caller-pattern with-input-from-string - ((var form &key (:star form)) - (:star declaration) - (:star form)) - :lisp) - -(define-caller-pattern with-output-to-string - ((var (:optional form)) - (:star declaration) - (:star form)) - :lisp) -(define-caller-pattern streamp (form) :lisp) -(define-caller-pattern open-stream-p (form) :lisp2) -(define-caller-pattern input-stream-p (form) :lisp) -(define-caller-pattern output-stream-p (form) :lisp) -(define-caller-pattern stream-element-type (form) :lisp) -(define-caller-pattern close (form (:rest :ignore)) :lisp) -(define-caller-pattern broadcast-stream-streams (form) :lisp2) -(define-caller-pattern concatenated-stream-streams (form) :lisp2) -(define-caller-pattern echo-stream-input-stream (form) :lisp2) -(define-caller-pattern echo-stream-output-stream (form) :lisp2) -(define-caller-pattern synonym-stream-symbol (form) :lisp2) -(define-caller-pattern two-way-stream-input-stream (form) :lisp2) -(define-caller-pattern two-way-stream-output-stream (form) :lisp2) -(define-caller-pattern interactive-stream-p (form) :lisp2) -(define-caller-pattern stream-external-format (form) :lisp2) - -;;; Reader -(define-variable-pattern *read-base* :lisp) -(define-variable-pattern *read-suppress* :lisp) -(define-variable-pattern *read-eval* :lisp2) -(define-variable-pattern *readtable* :lisp) -(define-caller-pattern copy-readtable (&optional form form) :lisp) -(define-caller-pattern readtablep (form) :lisp) -(define-caller-pattern set-syntax-from-char (form form &optional form form) - :lisp) -(define-caller-pattern set-macro-character (form fn &optional form) :lisp) -(define-caller-pattern get-macro-character (form (:optional form)) :lisp) -(define-caller-pattern make-dispatch-macro-character (form &optional form form) - :lisp) -(define-caller-pattern set-dispatch-macro-character - (form form fn (:optional form)) :lisp) -(define-caller-pattern get-dispatch-macro-character - (form form (:optional form)) :lisp) -(define-caller-pattern readtable-case (form) :lisp2) -(define-variable-pattern *print-readably* :lisp2) -(define-variable-pattern *print-escape* :lisp) -(define-variable-pattern *print-pretty* :lisp) -(define-variable-pattern *print-circle* :lisp) -(define-variable-pattern *print-base* :lisp) -(define-variable-pattern *print-radix* :lisp) -(define-variable-pattern *print-case* :lisp) -(define-variable-pattern *print-gensym* :lisp) -(define-variable-pattern *print-level* :lisp) -(define-variable-pattern *print-length* :lisp) -(define-variable-pattern *print-array* :lisp) -(define-caller-pattern with-standard-io-syntax - ((:star declaration) - (:star form)) - :lisp2) - -(define-caller-pattern read (&optional form form form form) :lisp) -(define-variable-pattern *read-default-float-format* :lisp) -(define-caller-pattern read-preserving-whitespace - (&optional form form form form) :lisp) -(define-caller-pattern read-delimited-list (form &optional form form) :lisp) -(define-caller-pattern read-line (&optional form form form form) :lisp) -(define-caller-pattern read-char (&optional form form form form) :lisp) -(define-caller-pattern unread-char (form (:optional form)) :lisp) -(define-caller-pattern peek-char (&optional form form form form) :lisp) -(define-caller-pattern listen ((:optional form)) :lisp) -(define-caller-pattern read-char-no-hang ((:star form)) :lisp) -(define-caller-pattern clear-input ((:optional form)) :lisp) -(define-caller-pattern read-from-string (form (:star form)) :lisp) -(define-caller-pattern parse-integer (form &rest :ignore) :lisp) -(define-caller-pattern read-byte ((:star form)) :lisp) - -(define-caller-pattern write (form &key (:star form)) :lisp) -(define-caller-pattern prin1 (form (:optional form)) :lisp) -(define-caller-pattern print (form (:optional form)) :lisp) -(define-caller-pattern pprint (form (:optional form)) :lisp) -(define-caller-pattern princ (form (:optional form)) :lisp) -(define-caller-pattern write-to-string (form &key (:star form)) :lisp) -(define-caller-pattern prin1-to-string (form) :lisp) -(define-caller-pattern princ-to-string (form) :lisp) -(define-caller-pattern write-char (form (:optional form)) :lisp) -(define-caller-pattern write-string (form &optional form &key (:star form)) - :lisp) -(define-caller-pattern write-line (form &optional form &key (:star form)) - :lisp) -(define-caller-pattern terpri ((:optional form)) :lisp) -(define-caller-pattern fresh-line ((:optional form)) :lisp) -(define-caller-pattern finish-output ((:optional form)) :lisp) -(define-caller-pattern force-output ((:optional form)) :lisp) -(define-caller-pattern clear-output ((:optional form)) :lisp) -(define-caller-pattern print-unreadable-object - ((form form &key (:star form)) - (:star declaration) - (:star form)) - :lisp2) -(define-caller-pattern write-byte (form form) :lisp) -(define-caller-pattern format - (destination - control-string - (:rest format-arguments)) - :lisp) - -(define-caller-pattern y-or-n-p (control-string (:star form)) :lisp) -(define-caller-pattern yes-or-no-p (control-string (:star form)) :lisp) - -;;; Pathnames -(define-caller-pattern wild-pathname-p (form &optional form) :lisp2) -(define-caller-pattern pathname-match-p (form form) :lisp2) -(define-caller-pattern translate-pathname (form form form &key (:star form)) - :lisp2) - -(define-caller-pattern logical-pathname (form) :lisp2) -(define-caller-pattern translate-logical-pathname (form &key (:star form)) - :lisp2) -(define-caller-pattern logical-pathname-translations (form) :lisp2) -(define-caller-pattern load-logical-pathname-translations (form) :lisp2) -(define-caller-pattern compile-file-pathname (form &key form) :lisp2) - -(define-caller-pattern pathname (form) :lisp) -(define-caller-pattern truename (form) :lisp) -(define-caller-pattern parse-namestring ((:star form)) :lisp) -(define-caller-pattern merge-pathnames ((:star form)) :lisp) -(define-variable-pattern *default-pathname-defaults* :lisp) -(define-caller-pattern make-pathname ((:star form)) :lisp) -(define-caller-pattern pathnamep (form) :lisp) -(define-caller-pattern pathname-host (form) :lisp) -(define-caller-pattern pathname-device (form) :lisp) -(define-caller-pattern pathname-directory (form) :lisp) -(define-caller-pattern pathname-name (form) :lisp) -(define-caller-pattern pathname-type (form) :lisp) -(define-caller-pattern pathname-version (form) :lisp) -(define-caller-pattern namestring (form) :lisp) -(define-caller-pattern file-namestring (form) :lisp) -(define-caller-pattern directory-namestring (form) :lisp) -(define-caller-pattern host-namestring (form) :lisp) -(define-caller-pattern enough-namestring (form (:optional form)) :lisp) -(define-caller-pattern user-homedir-pathname (&optional form) :lisp) -(define-caller-pattern open (form &key (:star form)) :lisp) -(define-caller-pattern with-open-file - ((var form (:rest :ignore)) - (:star declaration) - (:star form)) - :lisp) - -(define-caller-pattern rename-file (form form) :lisp) -(define-caller-pattern delete-file (form) :lisp) -(define-caller-pattern probe-file (form) :lisp) -(define-caller-pattern file-write-date (form) :lisp) -(define-caller-pattern file-author (form) :lisp) -(define-caller-pattern file-position (form (:optional form)) :lisp) -(define-caller-pattern file-length (form) :lisp) -(define-caller-pattern file-string-length (form form) :lisp2) -(define-caller-pattern load (form &key (:star form)) :lisp) -(define-variable-pattern *load-verbose* :lisp) -(define-variable-pattern *load-print* :lisp2) -(define-variable-pattern *load-pathname* :lisp2) -(define-variable-pattern *load-truename* :lisp2) -(define-caller-pattern make-load-form (form) :lisp2) -(define-caller-pattern make-load-form-saving-slots (form &optional form) - :lisp2) -(define-caller-pattern directory (form &key (:star form)) :lisp) - -;;; Errors -(define-caller-pattern error (form (:star form)) :lisp) -(define-caller-pattern cerror (form form (:star form)) :lisp) -(define-caller-pattern warn (form (:star form)) :lisp) -(define-variable-pattern *break-on-warnings* :lisp) -(define-caller-pattern break (&optional form (:star form)) :lisp) -(define-caller-pattern check-type (form form (:optional form)) :lisp) -(define-caller-pattern assert - (form - (:optional ((:star var)) - (:optional form (:star form)))) - :lisp) -(define-caller-pattern etypecase (form (:star (symbol (:star form)))) :lisp) -(define-caller-pattern ctypecase (form (:star (symbol (:star form)))) :lisp) -(define-caller-pattern ecase - (form - (:star ((:or symbol ((:star symbol))) - (:star form)))) - :lisp) -(define-caller-pattern ccase - (form - (:star ((:or symbol ((:star symbol))) - (:star form)))) - :lisp) - -;;; The Compiler -(define-caller-pattern compile (form (:optional form)) :lisp) -(define-caller-pattern compile-file (form &key (:star form)) :lisp) -(define-variable-pattern *compile-verbose* :lisp2) -(define-variable-pattern *compile-print* :lisp2) -(define-variable-pattern *compile-file-pathname* :lisp2) -(define-variable-pattern *compile-file-truename* :lisp2) -(define-caller-pattern load-time-value (form (:optional form)) :lisp2) -(define-caller-pattern disassemble (form) :lisp) -(define-caller-pattern function-lambda-expression (fn) :lisp2) -(define-caller-pattern with-compilation-unit (((:star :ignore)) (:star form)) - :lisp2) - -;;; Documentation -(define-caller-pattern documentation (form form) :lisp) -(define-caller-pattern trace ((:star form)) :lisp) -(define-caller-pattern untrace ((:star form)) :lisp) -(define-caller-pattern step (form) :lisp) -(define-caller-pattern time (form) :lisp) -(define-caller-pattern describe (form &optional form) :lisp) -(define-caller-pattern describe-object (form &optional form) :lisp2) -(define-caller-pattern inspect (form) :lisp) -(define-caller-pattern room ((:optional form)) :lisp) -(define-caller-pattern ed ((:optional form)) :lisp) -(define-caller-pattern dribble ((:optional form)) :lisp) -(define-caller-pattern apropos (form (:optional form)) :lisp) -(define-caller-pattern apropos-list (form (:optional form)) :lisp) -(define-caller-pattern get-decoded-time () :lisp) -(define-caller-pattern get-universal-time () :lisp) -(define-caller-pattern decode-universal-time (form &optional form) :lisp) -(define-caller-pattern encode-universal-time - (form form form form form form &optional form) :lisp) -(define-caller-pattern get-internal-run-time () :lisp) -(define-caller-pattern get-internal-real-time () :lisp) -(define-caller-pattern sleep (form) :lisp) - -(define-caller-pattern lisp-implementation-type () :lisp) -(define-caller-pattern lisp-implementation-version () :lisp) -(define-caller-pattern machine-type () :lisp) -(define-caller-pattern machine-version () :lisp) -(define-caller-pattern machine-instance () :lisp) -(define-caller-pattern software-type () :lisp) -(define-caller-pattern software-version () :lisp) -(define-caller-pattern short-site-name () :lisp) -(define-caller-pattern long-site-name () :lisp) -(define-variable-pattern *features* :lisp) - -(define-caller-pattern identity (form) :lisp) - -;;; Pretty Printing -(define-variable-pattern *print-pprint-dispatch* :lisp2) -(define-variable-pattern *print-right-margin* :lisp2) -(define-variable-pattern *print-miser-width* :lisp2) -(define-variable-pattern *print-lines* :lisp2) -(define-caller-pattern pprint-newline (form &optional form) :lisp2) -(define-caller-pattern pprint-logical-block - ((var form &key (:star form)) - (:star form)) - :lisp2) -(define-caller-pattern pprint-exit-if-list-exhausted () :lisp2) -(define-caller-pattern pprint-pop () :lisp2) -(define-caller-pattern pprint-indent (form form &optional form) :lisp2) -(define-caller-pattern pprint-tab (form form form &optional form) :lisp2) -(define-caller-pattern pprint-fill (form form &optional form form) :lisp2) -(define-caller-pattern pprint-linear (form form &optional form form) :lisp2) -(define-caller-pattern pprint-tabular (form form &optional form form form) - :lisp2) -(define-caller-pattern formatter (control-string) :lisp2) -(define-caller-pattern copy-pprint-dispatch (&optional form) :lisp2) -(define-caller-pattern pprint-dispatch (form &optional form) :lisp2) -(define-caller-pattern set-pprint-dispatch (form form &optional form form) - :lisp2) - -;;; CLOS -(define-caller-pattern add-method (fn form) :lisp2) -(define-caller-pattern call-method (form form) :lisp2) -(define-caller-pattern call-next-method ((:star form)) :lisp2) -(define-caller-pattern change-class (form form) :lisp2) -(define-caller-pattern class-name (form) :lisp2) -(define-caller-pattern class-of (form) :lisp2) -(define-caller-pattern compute-applicable-methods (fn (:star form)) :lisp2) -(define-caller-pattern defclass (name &rest :ignore) :lisp2) -(define-caller-pattern defgeneric (name lambda-list &rest :ignore) :lisp2) -(define-caller-pattern define-method-combination - (name lambda-list ((:star :ignore)) - (:optional ((:eq :arguments) :ignore)) - (:optional ((:eq :generic-function) :ignore)) - (:star (:or declaration documentation-string)) - (:star form)) - :lisp2) -(define-caller-pattern defmethod - (name (:star symbol) lambda-list - (:star (:or declaration documentation-string)) - (:star form)) - :lisp2) -(define-caller-pattern ensure-generic-function (name &key (:star form)) :lisp2) -(define-caller-pattern find-class (form &optional form form) :lisp2) -(define-caller-pattern find-method (fn &rest :ignore) :lisp2) -(define-caller-pattern function-keywords (&rest :ignore) :lisp2) -(define-caller-pattern generic-flet (((:star (name lambda-list))) (:star form)) - :lisp2) -(define-caller-pattern generic-labels - (((:star (name lambda-list))) (:star form)) - :lisp2) -(define-caller-pattern generic-function (lambda-list) :lisp2) -(define-caller-pattern initialize-instance (form &key (:star form)) :lisp2) -(define-caller-pattern invalid-method-error (fn form (:star form)) :lisp2) -(define-caller-pattern make-instance (fn (:star form)) :lisp2) -(define-caller-pattern make-instances-obsolete (fn) :lisp2) -(define-caller-pattern method-combination-error (form (:star form)) :lisp2) -(define-caller-pattern method-qualifiers (fn) :lisp2) -(define-caller-pattern next-method-p () :lisp2) -(define-caller-pattern no-applicable-method (fn (:star form)) :lisp2) -(define-caller-pattern no-next-method (fn (:star form)) :lisp2) -(define-caller-pattern print-object (form form) :lisp2) -(define-caller-pattern reinitialize-instance (form (:star form)) :lisp2) -(define-caller-pattern remove-method (fn form) :lisp2) -(define-caller-pattern shared-initialize (form form (:star form)) :lisp2) -(define-caller-pattern slot-boundp (form form) :lisp2) -(define-caller-pattern slot-exists-p (form form) :lisp2) -(define-caller-pattern slot-makeunbound (form form) :lisp2) -(define-caller-pattern slot-missing (fn form form form &optional form) :lisp2) -(define-caller-pattern slot-unbound (fn form form) :lisp2) -(define-caller-pattern slot-value (form form) :lisp2) -(define-caller-pattern update-instance-for-different-class - (form form (:star form)) :lisp2) -(define-caller-pattern update-instance-for-redefined-class - (form form (:star form)) :lisp2) -(define-caller-pattern with-accessors - (((:star :ignore)) form - (:star declaration) - (:star form)) - :lisp2) -(define-caller-pattern with-added-methods - ((name lambda-list) form - (:star form)) - :lisp2) -(define-caller-pattern with-slots - (((:star :ignore)) form - (:star declaration) - (:star form)) - :lisp2) - -;;; Conditions -(define-caller-pattern signal (form (:star form)) :lisp2) -(define-variable-pattern *break-on-signals* :lisp2) -(define-caller-pattern handler-case (form (:star (form ((:optional var)) - (:star form)))) - :lisp2) -(define-caller-pattern ignore-errors ((:star form)) :lisp2) -(define-caller-pattern handler-bind (((:star (form form))) - (:star form)) - :lisp2) -(define-caller-pattern define-condition (name &rest :ignore) :lisp2) -(define-caller-pattern make-condition (form &rest :ignore) :lisp2) -(define-caller-pattern with-simple-restart - ((name form (:star form)) (:star form)) :lisp2) -(define-caller-pattern restart-case - (form - (:star (form form (:star form)))) - :lisp2) -(define-caller-pattern restart-bind - (((:star (name fn &key (:star form)))) - (:star form)) - :lisp2) -(define-caller-pattern with-condition-restarts - (form form - (:star declaration) - (:star form)) - :lisp2) -(define-caller-pattern compute-restarts (&optional form) :lisp2) -(define-caller-pattern restart-name (form) :lisp2) -(define-caller-pattern find-restart (form &optional form) :lisp2) -(define-caller-pattern invoke-restart (form (:star form)) :lisp2) -(define-caller-pattern invoke-restart-interactively (form) :lisp2) -(define-caller-pattern abort (&optional form) :lisp2) -(define-caller-pattern continue (&optional form) :lisp2) -(define-caller-pattern muffle-warning (&optional form) :lisp2) -(define-caller-pattern store-value (form &optional form) :lisp2) -(define-caller-pattern use-value (form &optional form) :lisp2) -(define-caller-pattern invoke-debugger (form) :lisp2) -(define-variable-pattern *debugger-hook* :lisp2) -(define-caller-pattern simple-condition-format-string (form) :lisp2) -(define-caller-pattern simple-condition-format-arguments (form) :lisp2) -(define-caller-pattern type-error-datum (form) :lisp2) -(define-caller-pattern type-error-expected-type (form) :lisp2) -(define-caller-pattern package-error-package (form) :lisp2) -(define-caller-pattern stream-error-stream (form) :lisp2) -(define-caller-pattern file-error-pathname (form) :lisp2) -(define-caller-pattern cell-error-name (form) :lisp2) -(define-caller-pattern arithmetic-error-operation (form) :lisp2) -(define-caller-pattern arithmetic-error-operands (form) :lisp2) - -;;; For ZetaLisp Flavors -(define-caller-pattern send (form fn (:star form)) :flavors) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/LICENSE b/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/LICENSE deleted file mode 100644 index 5ea30c8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (C) 2001-2018, Arthur Lemmens et al. - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, copy, -modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/README.md b/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/README.md deleted file mode 100644 index 47dc29b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/README.md +++ /dev/null @@ -1,109 +0,0 @@ -SPLIT-SEQUENCE -============== - -[SPLIT-SEQUENCE](http://cliki.net/split-sequence) is a member of the -[Common Lisp Utilities](http://cliki.net/Common%20Lisp%20Utilities) -family of programs, designed by community consensus. - - -_Function_ __SPLIT-SEQUENCE, SPLIT-SEQUENCE-IF, SPLIT-SEQUENCE-IF-NOT__ - - -__Syntax:__ - -__split-sequence__ _delimiter sequence `&key` count -remove-empty-subseqs from-end start end test test-not key ⇒ list, -index_ - -__split-sequence-if__ _predicate sequence `&key` count -remove-empty-subseqs from-end start end key ⇒ list, index_ - -__split-sequence-if-not__ _predicate sequence `&key` count -remove-empty-subseqs from-end start end key ⇒ list, index_ - - -__Arguments and Values:__ - -_delimiter_—an _object_. - -_predicate_—a designator for a _function_ of one _argument_ that -returns a _generalized boolean_. - -_sequence_—a _proper sequence_. - -_count_—an _integer_ or __nil__. The default is __nil__. - -_remove-empty-subseqs_—a _generalized boolean_. The default is -_false_. - -_from-end_—a _generalized boolean_. The default is _false_. - -_start, end_—_bounding index designators_ of _sequence_. The -defaults for _start_ and _end_ are __0__ and __nil__, respectively. - -_test_—a _designator_ for a _function_ of two _arguments_ that -returns a _generalized boolean_. - -_test-not_—a _designator_ for a _function_ of two _arguments_ -that returns a _generalized boolean_. - -_key_—a _designator_ for a _function_ of one _argument_, or -__nil__. - -_list_—a _proper sequence_. - -_index_—an _integer_ greater than or equal to zero, and less -than or equal to the _length_ of the _sequence_. - - -__Description:__ - -Splits _sequence_ into a list of subsequences delimited by objects -_satisfying the test_. - -_List_ is a list of sequences of the same kind as _sequence_ that has -elements consisting of subsequences of _sequence_ that were delimited -in the argument by elements _satisfying the test_. Index is an index -into _sequence_ indicating the unprocessed region, suitable as an -argument to -[subseq](http://www.lispworks.com/documentation/HyperSpec/Body/f_subseq.htm) -to continue processing in the same manner if desired. - -The _count_ argument, if supplied, limits the number of subsequences -in the first return value; if more than _count_ delimited subsequences -exist in _sequence_, the _count_ leftmost delimited subsequences will -be in order in the first return value, and the second return value -will be the index into _sequence_ at which processing stopped. - -If _from-end_ is non-null, _sequence_ is conceptually processed from -right to left, accumulating the subsequences in reverse order; -_from-end_ only makes a difference in the case of a non-null _count_ -argument. In the presence of _from-end_, the _count_ rightmost -delimited subsequences will be in the order that they are in -_sequence_ in the first return value, and the second is the index -indicating the end of the unprocessed region. - -The _start_ and _end_ keyword arguments permit a certain subsequence -of the _sequence_ to be processed without the need for a copying -stage; their use is conceptually equivalent to partitioning the -subsequence delimited by _start_ and _end_, only without the need for -copying. - -If _remove-empty-subseqs_ is null (the default), then empty -subsequences will be included in the result. - -In all cases, the subsequences in the first return value will be in -the order that they appeared in _sequence_. - - -__Examples:__ - -
-SPLIT-SEQUENCE> (split-sequence #\Space "A stitch in time saves nine.")
-⇒ ("A" "stitch" "in" "time" "saves" "nine.")
-⇒ 28
-
-SPLIT-SEQUENCE> (split-sequence #\, "foo,bar ,baz, foobar , barbaz,")
-⇒ ("foo" "bar " "baz" " foobar " " barbaz" "")
-⇒ 30
-
diff --git a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/api.lisp b/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/api.lisp deleted file mode 100644 index fad0af7..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/api.lisp +++ /dev/null @@ -1,79 +0,0 @@ -;;;; -*- Mode: Lisp; indent-tabs-mode: nil -*- - -(in-package :split-sequence) - -(defun list-long-enough-p (list length) - (or (zerop length) - (not (null (nthcdr (1- length) list))))) - -(defun check-bounds (sequence start end) - (progn - (check-type start unsigned-byte "a non-negative integer") - (check-type end (or null unsigned-byte) "a non-negative integer or NIL") - (typecase sequence - (list - (when end - (unless (list-long-enough-p sequence end) - (error "The list is too short: END was ~S but the list is ~S elements long." - end (length sequence))))) - (t - (let ((length (length sequence))) - (unless end (setf end length)) - (unless (<= start end length) - (error "Wrong sequence bounds. START: ~S END: ~S" start end))))))) - -(define-condition simple-program-error (program-error simple-condition) ()) - -(defmacro check-tests (test test-p test-not test-not-p) - `(progn - (when (and ,test-p ,test-not-p) - (error (make-condition 'simple-program-error - :format-control "Cannot specify both TEST and TEST-NOT."))) - (when (and ,test-not-p (not ,test-p)) - (check-type ,test-not (or function (and symbol (not null))))) - (when (and ,test-p (not ,test-not-p)) - (check-type ,test (or function (and symbol (not null))))))) - -(declaim (ftype (function (&rest t) (values list unsigned-byte)) - split-sequence split-sequence-if split-sequence-if-not)) - -(defun split-sequence (delimiter sequence &key (start 0) (end nil) (from-end nil) - (count nil) (remove-empty-subseqs nil) - (test #'eql test-p) (test-not nil test-not-p) - (key #'identity)) - (check-bounds sequence start end) - (check-tests test test-p test-not test-not-p) - (etypecase sequence - (list (split-list delimiter sequence start end from-end count - remove-empty-subseqs test test-not key)) - (vector (split-vector delimiter sequence start end from-end count - remove-empty-subseqs test test-not key)) - #+(or abcl sbcl) - (extended-sequence (split-extended-sequence delimiter sequence start end from-end count - remove-empty-subseqs test test-not key)))) - -(defun split-sequence-if (predicate sequence &key (start 0) (end nil) (from-end nil) - (count nil) (remove-empty-subseqs nil) (key #'identity)) - (check-bounds sequence start end) - (etypecase sequence - (list (split-list-if predicate sequence start end from-end count - remove-empty-subseqs key)) - (vector (split-vector-if predicate sequence start end from-end count - remove-empty-subseqs key)) - #+(or abcl sbcl) - (extended-sequence (split-extended-sequence-if predicate sequence start end from-end count - remove-empty-subseqs key)))) - -(defun split-sequence-if-not (predicate sequence &key (start 0) (end nil) (from-end nil) - (count nil) (remove-empty-subseqs nil) (key #'identity)) - (check-bounds sequence start end) - (etypecase sequence - (list (split-list-if-not predicate sequence start end from-end count - remove-empty-subseqs key)) - (vector (split-vector-if-not predicate sequence start end from-end count - remove-empty-subseqs key)) - #+(or abcl sbcl) - (extended-sequence (split-extended-sequence-if-not predicate sequence start end from-end count - remove-empty-subseqs key)))) - -(pushnew :split-sequence *features*) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/documentation.lisp b/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/documentation.lisp deleted file mode 100644 index f05c4eb..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/documentation.lisp +++ /dev/null @@ -1,41 +0,0 @@ -;;;; -*- Mode: Lisp; indent-tabs-mode: nil -*- - -(in-package :split-sequence) - -(setf (documentation 'split-sequence 'function) - "Return a list of subsequences in seq delimited by delimiter. -If :remove-empty-subseqs is NIL, empty subsequences will be included -in the result; otherwise they will be discarded. All other keywords -work analogously to those for CL:SUBSTITUTE. In particular, the -behaviour of :from-end is possibly different from other versions of -this function; :from-end values of NIL and T are equivalent unless -:count is supplied. :count limits the number of subseqs in the main -resulting list. The second return value is an index suitable as an -argument to CL:SUBSEQ into the sequence indicating where processing -stopped.") - -(setf (documentation 'split-sequence-if 'function) - "Return a list of subsequences in seq delimited by items satisfying -predicate. -If :remove-empty-subseqs is NIL, empty subsequences will be included -in the result; otherwise they will be discarded. All other keywords -work analogously to those for CL:SUBSTITUTE-IF. In particular, the -behaviour of :from-end is possibly different from other versions of -this function; :from-end values of NIL and T are equivalent unless -:count is supplied. :count limits the number of subseqs in the main -resulting list. The second return value is an index suitable as an -argument to CL:SUBSEQ into the sequence indicating where processing -stopped.") - -(setf (documentation 'split-sequence-if-not 'function) - "Return a list of subsequences in seq delimited by items satisfying -\(CL:COMPLEMENT predicate). -If :remove-empty-subseqs is NIL, empty subsequences will be included -in the result; otherwise they will be discarded. All other keywords -work analogously to those for CL:SUBSTITUTE-IF-NOT. In particular, -the behaviour of :from-end is possibly different from other versions -of this function; :from-end values of NIL and T are equivalent unless -:count is supplied. :count limits the number of subseqs in the main -resulting list. The second return value is an index suitable as an -argument to CL:SUBSEQ into the sequence indicating where processing -stopped.") diff --git a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/extended-sequence.lisp b/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/extended-sequence.lisp deleted file mode 100644 index 8341d5f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/extended-sequence.lisp +++ /dev/null @@ -1,100 +0,0 @@ -;;;; -*- Mode: Lisp; indent-tabs-mode: nil -*- - -(in-package :split-sequence) - -;;; For extended sequences, we make the assumption that all extended sequences -;;; can be at most ARRAY-DIMENSION-LIMIT long. This seems to match what SBCL -;;; assumes about them. - -;;; TODO test this code. This will require creating such an extended sequence. - -(deftype extended-sequence () - '(and sequence (not list) (not vector))) - -(declaim (inline - split-extended-sequence split-extended-sequence-if split-extended-sequence-if-not - split-extended-sequence-from-end split-extended-sequence-from-start)) - -(declaim (ftype (function (&rest t) (values list unsigned-byte)) - split-extended-sequence split-extended-sequence-if split-extended-sequence-if-not)) - -(declaim (ftype (function (function extended-sequence array-index - (or null fixnum) (or null fixnum) boolean) - (values list fixnum)) - split-extended-sequence-from-start split-extended-sequence-from-end)) - -(defun split-extended-sequence - (delimiter sequence start end from-end count remove-empty-subseqs test test-not key) - (cond - ((and (not from-end) (null test-not)) - (split-extended-sequence-from-start (lambda (sequence start) - (position delimiter sequence :start start :key key :test test)) - sequence start end count remove-empty-subseqs)) - ((and (not from-end) test-not) - (split-extended-sequence-from-start (lambda (sequence start) - (position delimiter sequence :start start :key key :test-not test-not)) - sequence start end count remove-empty-subseqs)) - ((and from-end (null test-not)) - (split-extended-sequence-from-end (lambda (sequence end) - (position delimiter sequence :end end :from-end t :key key :test test)) - sequence start end count remove-empty-subseqs)) - (t - (split-extended-sequence-from-end (lambda (sequence end) - (position delimiter sequence :end end :from-end t :key key :test-not test-not)) - sequence start end count remove-empty-subseqs)))) - -(defun split-extended-sequence-if - (predicate sequence start end from-end count remove-empty-subseqs key) - (if from-end - (split-extended-sequence-from-end (lambda (sequence end) - (position-if predicate sequence :end end :from-end t :key key)) - sequence start end count remove-empty-subseqs) - (split-extended-sequence-from-start (lambda (sequence start) - (position-if predicate sequence :start start :key key)) - sequence start end count remove-empty-subseqs))) - -(defun split-extended-sequence-if-not - (predicate sequence start end from-end count remove-empty-subseqs key) - (if from-end - (split-extended-sequence-from-end (lambda (sequence end) - (position-if-not predicate sequence :end end :from-end t :key key)) - sequence start end count remove-empty-subseqs) - (split-extended-sequence-from-start (lambda (sequence start) - (position-if-not predicate sequence :start start :key key)) - sequence start end count remove-empty-subseqs))) - -(defun split-extended-sequence-from-end (position-fn sequence start end count remove-empty-subseqs) - (declare (optimize (speed 3) (debug 0)) - (type (function (extended-sequence fixnum) (or null fixnum)) position-fn)) - (loop - :with length = (length sequence) - :with end = (or end length) - :for right := end :then left - :for left := (max (or (funcall position-fn sequence right) -1) - (1- start)) - :unless (and (= right (1+ left)) remove-empty-subseqs) - :if (and count (>= nr-elts count)) - :return (values (nreverse subseqs) right) - :else - :collect (subseq sequence (1+ left) right) into subseqs - :and :sum 1 :into nr-elts :of-type fixnum - :until (< left start) - :finally (return (values (nreverse subseqs) (1+ left))))) - -(defun split-extended-sequence-from-start (position-fn sequence start end count remove-empty-subseqs) - (declare (optimize (speed 3) (debug 0)) - (type (function (extended-sequence fixnum) (or null fixnum)) position-fn)) - (loop - :with length = (length sequence) - :with end = (or end length) - :for left := start :then (1+ right) - :for right := (min (or (funcall position-fn sequence left) length) - end) - :unless (and (= right left) remove-empty-subseqs) - :if (and count (>= nr-elts count)) - :return (values subseqs left) - :else - :collect (subseq sequence left right) :into subseqs - :and :sum 1 :into nr-elts :of-type fixnum - :until (>= right end) - :finally (return (values subseqs right)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/list.lisp b/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/list.lisp deleted file mode 100644 index 7907d10..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/list.lisp +++ /dev/null @@ -1,116 +0,0 @@ -;;;; -*- Mode: Lisp; indent-tabs-mode: nil -*- - -(in-package :split-sequence) - -(declaim (inline - collect-until count-while - split-list split-list-if split-list-if-not - split-list-from-end split-list-from-start split-list-internal)) - -(declaim (ftype (function (&rest t) (values list unsigned-byte)) - split-list split-list-if split-list-if-not)) - -(declaim (ftype (function (function list unsigned-byte (or null unsigned-byte) (or null unsigned-byte) - boolean) - (values list unsigned-byte)) - split-list-from-start split-list-from-end split-list-internal)) - -(defun collect-until (predicate list end) - "Collect elements from LIST until one that satisfies PREDICATE is found. - - At most END elements will be examined. If END is null, all elements will be examined. - - Returns four values: - - * The collected items. - * The remaining items. - * The number of elements examined. - * Whether the search ended by running off the end, instead of by finding a delimiter." - (let ((examined 0) - (found nil)) - (flet ((examine (value) - (incf examined) - (setf found (funcall predicate value)))) - (loop :for (value . remaining) :on list - :until (eql examined end) - :until (examine value) - :collect value :into result - :finally (return (values result - remaining - examined - (and (not found) - (or (null end) - (= end examined))))))))) - -(defun count-while (predicate list end) - "Count the number of elements satisfying PREDICATE at the beginning of LIST. - - At most END elements will be counted. If END is null, all elements will be examined." - (if end - (loop :for value :in list - :for i :below end - :while (funcall predicate value) - :summing 1) - (loop :for value :in list - :while (funcall predicate value) - :summing 1))) - -(defun split-list-internal (predicate list start end count remove-empty-subseqs) - (let ((count count) - (done nil) - (index start) - (end (when end (- end start))) - (list (nthcdr start list))) - (flet ((should-collect-p (chunk) - (unless (and remove-empty-subseqs (null chunk)) - (when (numberp count) (decf count)) - t)) - (gather-chunk () - (multiple-value-bind (chunk remaining examined ran-off-end) - (collect-until predicate list end) - (incf index examined) - (when end (decf end examined)) - (setf list remaining - done ran-off-end) - chunk))) - (values (loop :with chunk - :until (or done (eql 0 count)) - :do (setf chunk (gather-chunk)) - :when (should-collect-p chunk) - :collect chunk) - (+ index - (if remove-empty-subseqs - (count-while predicate list end) ; chew off remaining empty seqs - 0)))))) - -(defun split-list-from-end (predicate list start end count remove-empty-subseqs) - (let ((length (length list))) - (multiple-value-bind (result index) - (split-list-internal predicate (reverse list) - (if end (- length end) 0) - (- length start) count remove-empty-subseqs) - (loop :for cons on result - :for car := (car cons) - :do (setf (car cons) (nreverse car))) - (values (nreverse result) (- length index))))) - -(defun split-list-from-start (predicate list start end count remove-empty-subseqs) - (split-list-internal predicate list start end count remove-empty-subseqs)) - -(defun split-list-if (predicate list start end from-end count remove-empty-subseqs key) - (let ((predicate (lambda (x) (funcall predicate (funcall key x))))) - (if from-end - (split-list-from-end predicate list start end count remove-empty-subseqs) - (split-list-from-start predicate list start end count remove-empty-subseqs)))) - -(defun split-list-if-not (predicate list start end from-end count remove-empty-subseqs key) - (split-list-if (complement predicate) list start end from-end count remove-empty-subseqs key)) - -(defun split-list - (delimiter list start end from-end count remove-empty-subseqs test test-not key) - (let ((predicate (if test-not - (lambda (x) (not (funcall test-not delimiter (funcall key x)))) - (lambda (x) (funcall test delimiter (funcall key x)))))) - (if from-end - (split-list-from-end predicate list start end count remove-empty-subseqs) - (split-list-from-start predicate list start end count remove-empty-subseqs)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/original-message.txt b/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/original-message.txt deleted file mode 100644 index fe4873c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/original-message.txt +++ /dev/null @@ -1,150 +0,0 @@ -From ... -Path: supernews.google.com!sn-xit-02!sn-xit-03!supernews.com!news.tele.dk!193.190.198.17!newsfeeds.belnet.be! -news.belnet.be!skynet.be!newsfeed2.news.nl.uu.net!sun4nl!not-for-mail -From: Arthur Lemmens -Newsgroups: comp.lang.lisp -Subject: Re: Q: on hashes and counting -Date: Mon, 23 Oct 2000 00:50:02 +0200 -Organization: Kikashi Software -Lines: 129 -Message-ID: <39F36F1A.B8F19D20@simplex.nl> -References: <8sl58e$ivq$1@nnrp1.deja.com> <878zrlp1cr.fsf@orion.bln.pmsf.de> -Mime-Version: 1.0 -Content-Type: text/plain; charset=us-ascii -Content-Transfer-Encoding: 7bit -X-Trace: porthos.nl.uu.net 972255051 2606 193.78.46.221 (22 Oct 2000 22:50:51 GMT) -X-Complaints-To: abuse@nl.uu.net -NNTP-Posting-Date: 22 Oct 2000 22:50:51 GMT -X-Mailer: Mozilla 4.5 [en] (Win98; I) -X-Accept-Language: en -Xref: supernews.google.com comp.lang.lisp:2515 - - -Pierre R. Mai wrote: - -> ;;; The following functions are based on the versions by Arthur -> ;;; Lemmens of the original code by Bernard Pfahringer posted to -> ;;; comp.lang.lisp. I only renamed and diddled them a bit. -> -> (defun partition - -[snip] - -> ;; DO: Find a more efficient way to take care of :from-end T. -> (when from-end -> (setf seq (reverse seq)) -> (psetf start (- len end) -> end (- len start))) - -I've written a different version now for dealing with :FROM-END T. -It doesn't call REVERSE anymore, which makes it more efficient. -Also, I prefer the new semantics. Stuff like - (split #\space "one two three " :from-end t) -now returns - ("three" "two" "one") -which I find a lot more useful than - ("eerht" "owt" "eno") -If you prefer the latter, it's easy enough to use - (split #\space (reverse "one two three ")) - - -Here it is (feel free to use this code any way you like): - -(defun SPLIT (delimiter seq - &key (maximum nil) - (keep-empty-subseqs nil) - (from-end nil) - (start 0) - (end nil) - (test nil test-supplied) - (test-not nil test-not-supplied) - (key nil key-supplied)) - -"Return a list of subsequences in delimited by . -If :keep-empty-subseqs is true, empty subsequences will be included -in the result; otherwise they will be discarded. -If :maximum is supplied, the result will contain no more than :maximum -(possibly empty) subsequences. The second result value contains the -unsplit rest of the sequence. -All other keywords work analogously to those for CL:POSITION." - -;; DO: Make ":keep-delimiters t" include the delimiters in the result (?). - - (let ((len (length seq)) - (other-keys (nconc (when test-supplied - (list :test test)) - (when test-not-supplied - (list :test-not test-not)) - (when key-supplied - (list :key key))))) - -(unless end (setq end len)) -(if from-end - (loop for right = end then left - for left = (max (or (apply #'position delimiter seq - :end right - :from-end t - other-keys) - -1) - (1- start)) - unless (and (= right (1+ left) ) - (not keep-empty-subseqs)) ; empty subseq we don't want - if (and maximum (>= nr-elts maximum)) - ;; We can't take any more. Return now. - return (values subseqs (subseq seq start right)) - else - collect (subseq seq (1+ left) right) into subseqs - and sum 1 into nr-elts - until (<= left start) - finally return (values subseqs (subseq seq start (1+ left)))) - (loop for left = start then (+ right 1) - for right = (min (or (apply #'position delimiter seq - :start left - other-keys) - len) - end) - unless (and (= right left) - (not keep-empty-subseqs)) ; empty subseq we don't want - if (and maximum (>= nr-elts maximum)) - ;; We can't take any more. Return now. - return (values subseqs (subseq seq left end)) - else - collect (subseq seq left right) into subseqs - and sum 1 into nr-elts - until (= right end) - finally return (values subseqs (subseq seq right end)))))) - - - -Here are some examples of how you can use this: - - -CL-USER 2 > (split #\space "word1 word2 word3") -("word1" "word2" "word3") -"" - -CL-USER 3 > (split #\space "word1 word2 word3" :from-end t) -("word3" "word2" "word1") -"" - -CL-USER 4 > (split nil '(a b nil c d e nil nil nil nil f) :maximum 2) -((A B) (C D E)) -(F) - -CL-USER 5 > (split #\space "Nospaceshere.") -("Nospaceshere.") -"" - -CL-USER 6 > (split #\; "12;13;;14" :keep-empty-subseqs t) - -("12" "13" "" "14") -"" - -CL-USER 7 > (split #\; "12;13;;14" :keep-empty-subseqs t :from-end t) - -("14" "" "13" "12") -"" - -CL-USER 8 > (split #\space "Nospaceshere. ") -("Nospaceshere.") -"" diff --git a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/package.lisp deleted file mode 100644 index 71f5001..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/package.lisp +++ /dev/null @@ -1,37 +0,0 @@ -;;;; -*- Mode: Lisp; indent-tabs-mode: nil -*- -;;; -;;; SPLIT-SEQUENCE -;;; -;;; This code was based on Arthur Lemmens' in -;;; ; -;;; -;;; changes include: -;;; -;;; * altering the behaviour of the :from-end keyword argument to -;;; return the subsequences in original order, for consistency with -;;; CL:REMOVE, CL:SUBSTITUTE et al. (:from-end being non-NIL only -;;; affects the answer if :count is less than the number of -;;; subsequences, by analogy with the above-referenced functions). -;;; -;;; * changing the :maximum keyword argument to :count, by analogy -;;; with CL:REMOVE, CL:SUBSTITUTE, and so on. -;;; -;;; * naming the function SPLIT-SEQUENCE rather than PARTITION rather -;;; than SPLIT. -;;; -;;; * adding SPLIT-SEQUENCE-IF and SPLIT-SEQUENCE-IF-NOT. -;;; -;;; * The second return value is now an index rather than a copy of a -;;; portion of the sequence; this index is the `right' one to feed to -;;; CL:SUBSEQ for continued processing. - -;;; There's a certain amount of code duplication in the vector and -;;; extended sequence modules, which is kept to illustrate the -;;; relationship between the SPLIT-SEQUENCE functions and the -;;; CL:POSITION functions. - -(defpackage #:split-sequence - (:use #:common-lisp) - (:export #:split-sequence - #:split-sequence-if - #:split-sequence-if-not)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/split-sequence.asd b/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/split-sequence.asd deleted file mode 100644 index 868d840..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/split-sequence.asd +++ /dev/null @@ -1,28 +0,0 @@ -;;; -*- Lisp -*- - -(defsystem :split-sequence - :author "Arthur Lemmens " - :maintainer "Sharp Lispers " - :description "Splits a sequence into a list of subsequences - delimited by objects satisfying a test." - :license "MIT" - :version (:read-file-form "version.sexp") - :components ((:static-file "version.sexp") - (:file "package") - (:file "vector") - (:file "list") - (:file "extended-sequence" :if-feature (:or :sbcl :abcl)) - (:file "api") - (:file "documentation"))) - -(defsystem :split-sequence/tests - :author "Arthur Lemmens " - :maintainer "Sharp Lispers " - :description "Split-Sequence test suite" - :license "MIT" - :depends-on (:split-sequence :fiveam) - :components ((:file "tests"))) - -(defmethod perform ((o test-op) (c (eql (find-system :split-sequence)))) - (load-system :split-sequence/tests) - (symbol-call :5am :run! :split-sequence)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/tests.lisp b/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/tests.lisp deleted file mode 100644 index 691c546..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/tests.lisp +++ /dev/null @@ -1,268 +0,0 @@ -;;;; -*- Mode: Lisp; indent-tabs-mode: nil -*- - -(defpackage :split-sequence/tests - (:use :common-lisp :split-sequence :fiveam)) - -(in-package :split-sequence/tests) - -(in-suite* :split-sequence) - -;;; UNIT TESTS - -(defmacro define-test (name (&key input output index) &body forms) - ;; This macro automatically generates test code for testing vector and list input. - ;; Vector input and output is automatically coerced into list form for the list tests. - ;; (DEFINE-TEST FOO ...) generates FIVEAM tests FOO.VECTOR and FOO.LIST. - (check-type name symbol) - (check-type input (cons symbol (cons vector null))) - (check-type output (cons symbol (cons list null))) - (check-type index (cons symbol (cons unsigned-byte null))) - (let* ((input-symbol (first input)) (vector-input (second input)) - (output-symbol (first output)) (vector-output (second output)) - (index-symbol (first index)) (index-value (second index)) - (list-input (coerce vector-input 'list)) - (list-output (mapcar (lambda (x) (coerce x 'list)) vector-output)) - (vector-name (intern (concatenate 'string (symbol-name name) ".VECTOR"))) - (list-name (intern (concatenate 'string (symbol-name name) ".LIST")))) - `(progn - (test (,vector-name :compile-at :definition-time) - (let ((,input-symbol ',vector-input) - (,output-symbol ',vector-output) - (,index-symbol ,index-value)) - ,@forms)) - (test (,list-name :compile-at :definition-time) - (let ((,input-symbol ',list-input) - (,output-symbol ',list-output) - (,index-symbol ,index-value)) - ,@forms))))) - -(define-test split-sequence.0 (:input (input "") - :output (output ("")) - :index (index 0)) - (is (equalp (split-sequence #\; input) - (values output index)))) - -(define-test split-sequence.1 (:input (input "a;;b;c") - :output (output ("a" "" "b" "c")) - :index (index 6)) - (is (equalp (split-sequence #\; input) - (values output index)))) - -(define-test split-sequence.2 (:input (input "a;;b;c") - :output (output ("a" "" "b" "c")) - :index (index 0)) - (is (equalp (split-sequence #\; input :from-end t) - (values output index)))) - -(define-test split-sequence.3 (:input (input "a;;b;c") - :output (output ("c")) - :index (index 4)) - (is (equalp (split-sequence #\; input :from-end t :count 1) - (values output index)))) - -(define-test split-sequence.4 (:input (input "a;;b;c") - :output (output ("a" "b" "c")) - :index (index 6)) - (is (equalp (split-sequence #\; input :remove-empty-subseqs t) - (values output index)))) - -(define-test split-sequence.5 (:input (input ";oo;bar;ba;") - :output (output ("oo" "bar" "b")) - :index (index 9)) - (is (equalp (split-sequence #\; input :start 1 :end 9) - (values output index)))) - -(define-test split-sequence.6 (:input (input "abracadabra") - :output (output ("" "br" "c" "d" "br" "")) - :index (index 11)) - (is (equalp (split-sequence #\A input :key #'char-upcase) - (values output index)))) - -(define-test split-sequence.7 (:input (input "abracadabra") - :output (output ("r" "c" "d")) - :index (index 7)) - (is (equalp (split-sequence #\A input :key #'char-upcase :start 2 :end 7) - (values output index)))) - -(define-test split-sequence.8 (:input (input "abracadabra") - :output (output ("r" "c" "d")) - :index (index 2)) - (is (equalp (split-sequence #\A input :key #'char-upcase :start 2 :end 7 :from-end t) - (values output index)))) - -(define-test split-sequence.9 (:input (input #(1 2 0)) - :output (output (#(1 2) #())) - :index (index 0)) - (is (equalp (split-sequence 0 input :from-end t) - (values output index)))) - -(define-test split-sequence.10 (:input (input #(2 0 0 2 3 2 0 1 0 3)) - :output (output ()) - :index (index 8)) - (is (equalp (split-sequence 0 input :start 8 :end 9 :from-end t :count 0 :remove-empty-subseqs t) - (values output index)))) - -(define-test split-sequence.11 (:input (input #(0 1 3 0 3 1 2 2 1 0)) - :output (output ()) - :index (index 0)) - (is (equalp (split-sequence 0 input :start 0 :end 0 :remove-empty-subseqs t) - (values output index)))) - -(define-test split-sequence.12 (:input (input #(3 0 0 0 3 3 0 3 1 0)) - :output (output ()) - :index (index 10)) - (is (equalp (split-sequence 0 input :start 9 :end 10 :from-end t :count 0) - (values output index)))) - -(define-test split-sequence.13 (:input (input #(3 3 3 3 0 2 0 0 1 2)) - :output (output (#(1))) - :index (index 6)) - (is (equalp (split-sequence 0 input :start 6 :end 9 :from-end t :count 1 :remove-empty-subseqs t) - (values output index)))) - -(define-test split-sequence.14 (:input (input #(1 0)) - :output (output (#(1))) - :index (index 0)) - (is (equalp (split-sequence 0 input :from-end t :count 1 :remove-empty-subseqs t) - (values output index)))) - -(define-test split-sequence.15 (:input (input #(0 0)) - :output (output ()) - :index (index 1)) - (is (equalp (split-sequence 0 input :start 0 :end 1 :count 0 :remove-empty-subseqs t) - (values output index)))) - -(define-test split-sequence.16 (:input (input "a;;b;c") - :output (output ("" ";;" ";" "")) - :index (index 6)) - (is (equalp (split-sequence #\; input :test-not #'eql) - (values output index)))) - -(define-test split-sequence.17 (:input (input "a;;b;c") - :output (output ("" ";;" ";" "")) - :index (index 0)) - (is (equalp (split-sequence #\; input :from-end t :test-not #'eql) - (values output index)))) - -(define-test split-sequence.18 (:input (input #(1 0 2 0 3 0 4)) - :output (output (#(1) #(2) #(3))) - :index (index 6)) - (is (equalp (split-sequence 0 input :count 3) - (values output index)))) - -(define-test split-sequence-if.1 (:input (input "abracadabra") - :output (output ("" "" "r" "c" "d" "" "r" "")) - :index (index 11)) - (is (equalp (split-sequence-if (lambda (x) (member x '(#\a #\b))) input) - (values output index)))) - -(define-test split-sequence-if.2 (:input (input "123456") - :output (output ("1" "3" "5")) - :index (index 6)) - (is (equalp (split-sequence-if (lambda (x) (evenp (parse-integer (string x)))) input - :remove-empty-subseqs t) - (values output index)))) - -(define-test split-sequence-if.3 (:input (input "123456") - :output (output ("1" "3" "5" "")) - :index (index 6)) - (is (equalp (split-sequence-if (lambda (x) (evenp (parse-integer (string x)))) input) - (values output index)))) - -(define-test split-sequence-if-not.1 (:input (input "abracadabra") - :output (output ("ab" "a" "a" "ab" "a")) - :index (index 11)) - (is (equalp (split-sequence-if-not (lambda (x) (member x '(#\a #\b))) input) - (values output index)))) - -(test split-sequence.start-end-error - (signals error (split-sequence 0 #(0 1 2 3) :start nil)) - (signals error (split-sequence 0 #(0 1 2 3) :end '#:end)) - (signals error (split-sequence 0 #(0 1 2 3) :start 0 :end 8)) - (signals error (split-sequence 0 #(0 1 2 3) :start 2 :end 0))) - -(test split-sequence.test-provided - ;; Neither provided - (is (equal '((1) (3)) (split-sequence 2 '(1 2 3)))) - ;; Either provided - (is (equal '((1) (3)) (split-sequence 2 '(1 2 3) :test #'eql))) - (is (equal '(() (2) ()) (split-sequence 2 '(1 2 3) :test-not #'eql))) - (signals type-error (split-sequence 2 '(1 2 3) :test nil)) - (signals type-error (split-sequence 2 '(1 2 3) :test-not nil)) - ;; Both provided - (signals program-error (split-sequence 2 '(1 2 3) :test #'eql :test-not nil)) - (signals program-error (split-sequence 2 '(1 2 3) :test nil :test-not #'eql)) - (signals program-error (split-sequence 2 '(1 2 3) :test #'eql :test-not #'eql)) - (signals program-error (split-sequence 2 '(1 2 3) :test nil :test-not nil))) - -;;; FUZZ TEST - -(test split-sequence.fuzz - (fuzz :verbose nil :fiveamp t)) - -(defun fuzz (&key (max-length 100) (repetitions 1000000) (verbose t) (print-every 10000) (fiveamp nil)) - (flet ((random-vector (n) - (let ((vector (make-array n :element-type '(unsigned-byte 2)))) - (dotimes (i n) (setf (aref vector i) (random 4))) - vector)) - (random-boolean () (if (= 0 (random 2)) t nil)) - (fuzz-failure (vector start end from-end count remove-empty-subseqs - expected-splits expected-index actual-splits actual-index) - (format nil "Fuzz failure: -\(MULTIPLE-VALUE-CALL #'VALUES - (SPLIT-SEQUENCE 0 ~S - :START ~S :END ~S :FROM-END ~S :COUNT ~S :REMOVE-EMPTY-SUBSEQS ~S) - (SPLIT-SEQUENCE 0 (COERCE ~S 'LIST) - :START ~S :END ~S :FROM-END ~S :COUNT ~S :REMOVE-EMPTY-SUBSEQS ~S)) -~S~%~S~%~S~%~S" - vector start end from-end count remove-empty-subseqs - vector start end from-end count remove-empty-subseqs - expected-splits expected-index actual-splits actual-index))) - (let ((failure-string nil) - (predicate (lambda (x) (= x 0))) - (predicate-not (lambda (x) (/= x 0)))) - (dotimes (i repetitions) - (when (and verbose (= 0 (mod (1+ i) print-every))) - (format t "Fuzz: Pass ~D passed.~%" (1+ i))) - (let* ((length (1+ (random max-length))) - (vector (random-vector length)) - (list (coerce vector 'list)) - (remove-empty-subseqs (random-boolean)) - (start 0) end from-end count) - (case (random 5) - (0) - (1 (setf start (random length))) - (2 (setf start (random length) - end (+ start (random (1+ (- length start)))))) - (3 (setf start (random length) - end (+ start (random (1+ (- length start)))) - from-end t)) - (4 (setf start (random length) - end (+ start (random (1+ (- length start)))) - from-end t - count (random (1+ (- end start)))))) - (let ((args (list :start start :end end :from-end from-end :count count - :remove-empty-subseqs remove-empty-subseqs))) - (multiple-value-bind (expected-splits expected-index) - (case (random 3) - (0 (apply #'split-sequence 0 vector args)) - (1 (apply #'split-sequence-if predicate vector args)) - (2 (apply #'split-sequence-if-not predicate-not vector args))) - (multiple-value-bind (actual-splits actual-index) - (case (random 3) - (0 (apply #'split-sequence 0 list args)) - (1 (apply #'split-sequence-if predicate list args)) - (2 (apply #'split-sequence-if-not predicate-not list args))) - (let* ((expected-splits (mapcar (lambda (x) (coerce x 'list)) expected-splits)) - (result (and (equal actual-splits expected-splits) - (= expected-index actual-index)))) - (unless result - (let ((string (fuzz-failure - vector start end from-end count remove-empty-subseqs - expected-splits expected-index actual-splits actual-index))) - (cond (fiveamp - (setf failure-string string) - (return)) - (t (assert result () string))))))))))) - (when fiveamp - (is (not failure-string) failure-string))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/vector.lisp b/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/vector.lisp deleted file mode 100644 index 247a337..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/vector.lisp +++ /dev/null @@ -1,94 +0,0 @@ -;;;; -*- Mode: Lisp; indent-tabs-mode: nil -*- - -(in-package :split-sequence) - -(declaim (inline - split-vector split-vector-if split-vector-if-not - split-vector-from-end split-vector-from-start)) - -(deftype array-index (&optional (length array-dimension-limit)) - `(integer 0 (,length))) - -(declaim (ftype (function (&rest t) (values list unsigned-byte)) - split-vector split-vector-if split-vector-if-not)) - -(declaim (ftype (function (function vector array-index - (or null array-index) (or null array-index) boolean) - (values list unsigned-byte)) - split-vector-from-start split-vector-from-end)) - -(defun split-vector - (delimiter vector start end from-end count remove-empty-subseqs test test-not key) - (cond - ((and (not from-end) (null test-not)) - (split-vector-from-start (lambda (vector start) - (position delimiter vector :start start :key key :test test)) - vector start end count remove-empty-subseqs)) - ((and (not from-end) test-not) - (split-vector-from-start (lambda (vector start) - (position delimiter vector :start start :key key :test-not test-not)) - vector start end count remove-empty-subseqs)) - ((and from-end (null test-not)) - (split-vector-from-end (lambda (vector end) - (position delimiter vector :end end :from-end t :key key :test test)) - vector start end count remove-empty-subseqs)) - (t - (split-vector-from-end (lambda (vector end) - (position delimiter vector :end end :from-end t :key key :test-not test-not)) - vector start end count remove-empty-subseqs)))) - -(defun split-vector-if - (predicate vector start end from-end count remove-empty-subseqs key) - (if from-end - (split-vector-from-end (lambda (vector end) - (position-if predicate vector :end end :from-end t :key key)) - vector start end count remove-empty-subseqs) - (split-vector-from-start (lambda (vector start) - (position-if predicate vector :start start :key key)) - vector start end count remove-empty-subseqs))) - -(defun split-vector-if-not - (predicate vector start end from-end count remove-empty-subseqs key) - (if from-end - (split-vector-from-end (lambda (vector end) - (position-if-not predicate vector :end end :from-end t :key key)) - vector start end count remove-empty-subseqs) - (split-vector-from-start (lambda (vector start) - (position-if-not predicate vector :start start :key key)) - vector start end count remove-empty-subseqs))) - -(defun split-vector-from-end (position-fn vector start end count remove-empty-subseqs) - (declare (optimize (speed 3) (debug 0)) - (type (function (vector fixnum) (or null fixnum)) position-fn)) - (loop - :with end = (or end (length vector)) - :for right := end :then left - :for left := (max (or (funcall position-fn vector right) -1) - (1- start)) - :unless (and (= right (1+ left)) remove-empty-subseqs) - :if (and count (>= nr-elts count)) - :return (values (nreverse subseqs) right) - :else - :collect (subseq vector (1+ left) right) into subseqs - :and :sum 1 :into nr-elts :of-type fixnum - :until (< left start) - :finally (return (values (nreverse subseqs) (1+ left))))) - -(defun split-vector-from-start (position-fn vector start end count remove-empty-subseqs) - (declare (optimize (speed 3) (debug 0)) - (type vector vector) - (type (function (vector fixnum) (or null fixnum)) position-fn)) - (let ((length (length vector))) - (loop - :with end = (or end (length vector)) - :for left := start :then (1+ right) - :for right := (min (or (funcall position-fn vector left) length) - end) - :unless (and (= right left) remove-empty-subseqs) - :if (and count (>= nr-elts count)) - :return (values subseqs left) - :else - :collect (subseq vector left right) :into subseqs - :and :sum 1 :into nr-elts :of-type fixnum - :until (>= right end) - :finally (return (values subseqs right))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/version.sexp b/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/version.sexp deleted file mode 100644 index 925cb56..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/split-sequence-v2.0.0/version.sexp +++ /dev/null @@ -1,2 +0,0 @@ -;; -*- lisp -*- -"2.0.0" diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/.travis.yml b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/.travis.yml deleted file mode 100644 index d9cdf8a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/.travis.yml +++ /dev/null @@ -1,30 +0,0 @@ -language: lisp - -env: - matrix: - # - LISP=abcl - # - LISP=allegro - - LISP=sbcl - - LISP=sbcl32 - - LISP=ccl - - LISP=ccl32 - - LISP=clisp - - LISP=clisp32 - # - LISP=cmucl - - LISP=ecl - -matrix: - allow_failures: - - env: LISP=ecl - -install: - - curl -L https://github.com/luismbo/cl-travis/raw/master/install.sh | sh - - if [ "${LISP:(-2)}" = "32" ]; then - sudo apt-get install libc6-dev-i386; - fi - -script: - - cl -e '(ql:quickload :cffi-grovel) - (ql:quickload :trivial-features-tests) - (unless (trivial-features-tests:run) - (uiop:quit 1))' diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/COPYRIGHT b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/COPYRIGHT deleted file mode 100644 index c79d81b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/COPYRIGHT +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (C) 2007, Luis Oliveira - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, copy, -modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/README.md b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/README.md deleted file mode 100644 index 4ef33d9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/README.md +++ /dev/null @@ -1,32 +0,0 @@ -[![Build Status](https://travis-ci.org/trivial-features/trivial-features.svg?branch=master)](https://travis-ci.org/trivial-features/trivial-features) - -trivial-features ensures consistent `*FEATURES*` across multiple -Common Lisp implementations. - -For example, on MacOS X platforms, while most Lisps push `:DARWIN` to -`*FEATURES*`, CLISP and Allegro push `:MACOS` and `:MACOSX` instead, -respectively. Some Lisps might not push any feature suggesting MacOS -X at all. trivial-features will make sure all Lisps will have -`:DARWIN` in the `*FEATURES*` list when running on MacOS X. This -way, you can write - - #+darwin foo #-darwin bar - -instead of - - #+(or darwin macos macosx) foo - #-(or darwin macos macosx) bar - -The included [SPEC.md][1] document describes the set of symbols that -should or should not be present in `CL:*FEATURES*` on certain -circumstances. This specification is implemented by the -TRIVIAL-FEATURES system which supports a handful of Lisps. - -The test suite is, in effect, an implementation using [CFFI][2] that -is checked against the various implementations in `src/tf-*.lisp`. - -trivial-features is MIT-licenced. - - -[1]: https://github.com/trivial-features/trivial-features/blob/master/SPEC.md -[2]: http://common-lisp.net/project/cffi diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/SPEC.md b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/SPEC.md deleted file mode 100644 index 3dde464..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/SPEC.md +++ /dev/null @@ -1,86 +0,0 @@ -TRIVIAL-FEATURES -================ - -This is a first *draft* of a description of what symbols should be -present in `CL:*FEATURES*` for various platforms. A possible future -direction of this documentation might be a CDR document, if it turns -out to be a good idea. (Making the language of this document much -more precise will be necessary then.) - -We will start by limiting ourselves to OS, CPU and endianness features -on Windows and POSIX platforms. - -There are various possible implementation strategies ranging from null -implementations (when the host Lisp already pushes the wanted feature) -to using FFI (e.g. calling uname() to grab system information. - - -Specification -------------- - -### ENDIANNESS - -Either `:LITTLE-ENDIAN` or `:BIG-ENDIAN` should present in -`\*FEATURES\*`. For the time being, we will not concern ourselves -with other orderings, switchable endianness, etc. - - -### OPERATING SYSTEM - -On Windows, `:WINDOWS` should be present in `*FEATURES*`. - -On POSIX systems, the "sysname" information from uname(3) should be -used to push the appropriate symbol to `*FEATURES*` by upcasing that -string (or downcasing for the "modern" lisps) and interning it in the -keyword package. - -Examples: - - - `:DARWIN` - - `:LINUX` - - `:NETBSD` - - `:OPENBSD` - - `:FREEBSD` - -For convenience, `:UNIX` should be pushed when running on -POSIX/UNIX-like operating system (that doesn't include Windows) and -`:BSD` should be present when running on BSD-based systems (that -includes Darwin) - -[add `:MACH` too?] - - -### CPU - -These features should be mutually exclusive: - - - `:X86` - - `:X86-64` - - `:PPC` - - `:PPC64` - - `:MIPS` - - `:ALPHA` - - `:SPARC` - - `:SPARC64` - - `:HPPA` - - `:HPPA64` - -[add more ...] - -[note: it's debatable whether `:X86` shouldn't also be exported on -x86-64, and `:PPC` on ppc64. SBCL doesn't. Other ways -to handle, for example, the x86/x86-64 case would be to export -something like `:PC386` in both cases or have an additional `:X86-32`. Or -finally, have just `:X86`, `:PPC`, etc, and add `:32-BIT-CPU` and -`:64-BIT-CPU` features.] - - -Unreferenced References ------------------------ - - * [CLHS: Variable \*FEATURES\*][1] - * [Maintaining Portable Lisp Programs][2], by Christophe Rhodes - - -[1]: http://www.lispworks.com/documentation/HyperSpec/Body/v_featur.htm -[2]: http://www-jcsu.jesus.cam.ac.uk/~csr21/papers/features.pdf diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/release.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/release.lisp deleted file mode 100644 index 8997438..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/release.lisp +++ /dev/null @@ -1,247 +0,0 @@ -#!/usr/bin/env clisp -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- - -(defpackage :release-script (:use #:cl #:regexp)) -(in-package :release-script) - -;;;; Configuration ------------------------------------------------------------ - -(defparameter *project-name* "trivial-features") -(defparameter *asdf-file* (format nil "~A.asd" *project-name*)) - -(defparameter *host* "common-lisp.net") -(defparameter *release-dir* - (format nil "public_html/tarballs/~A/" *project-name*)) - -(defparameter *version-file* nil) -(defparameter *version-file-dir* nil) - -;;;; -------------------------------------------------------------------------- - -;;;; Utilities - -(defun ensure-list (x) - (if (listp x) x (list x))) - -(defmacro string-case (expression &body clauses) - `(let ((it ,expression)) ; yes, anaphoric, deal with it. - (cond - ,@(loop for clause in clauses collect - `((or ,@(loop for alternative in (ensure-list (first clause)) - collect (or (eq t alternative) - `(string= it ,alternative)))) - ,@(rest clause)))))) - -(defparameter *development-mode* t) - -(defun die (format-control &rest format-args) - (format *error-output* "~?" format-control format-args) - (if *development-mode* - (cerror "continue" "die") - (ext:quit 1))) - -(defun numeric-split (string) - (if (digit-char-p (char string 0)) - (multiple-value-bind (number next-position) - (parse-integer string :junk-allowed t) - (cons number (when (< next-position (length string)) - (numeric-split (subseq string next-position))))) - (let ((next-digit-position (position-if #'digit-char-p string))) - (if next-digit-position - (cons (subseq string 0 next-digit-position) - (numeric-split (subseq string next-digit-position))) - (list string))))) - -(defun natural-string-< (s1 s2) - (labels ((aux< (l1 l2) - (cond ((null l1) (not (null l2))) - ((null l2) nil) - (t (destructuring-bind (x . xs) l1 - (destructuring-bind (y . ys) l2 - (cond ((and (numberp x) (stringp y)) - t) - ((and (numberp y) (stringp x)) - nil) - ((and (numberp x) (numberp y)) - (or (< x y) (and (= x y) (aux< xs ys)))) - (t - (or (string-lessp x y) - (and (string-equal x y) - (aux< xs ys))))))))))) - (aux< (numeric-split s1) - (numeric-split s2)))) - -;;;; Running commands - -(defparameter *dry-run* nil) - -(defun cmd? (format-control &rest format-args) - (let ((cmd (format nil "~?" format-control format-args))) - (with-open-stream (s1 (ext:run-shell-command cmd :output :stream)) - (loop for line = (read-line s1 nil nil) - while line - collect line)))) - -;; XXX: quote arguments. -(defun cmd (format-control &rest format-args) - (when *development-mode* - (format *debug-io* "CMD: ~?~%" format-control format-args)) - (let ((ret (ext:run-shell-command (format nil "~?" format-control format-args)))) - (or (null ret) - (zerop ret)))) - -(defun cmd! (format-control &rest format-args) - (or (apply #'cmd format-control format-args) - (die "cmd '~?' failed." format-control format-args))) - -(defun maybe-cmd! (format-control &rest format-args) - (if *dry-run* - (format t "SUPPRESSING: ~?~%" format-control format-args) - (apply #'cmd! format-control format-args))) - -;;;; - -(defun find-current-version () - (subseq (reduce (lambda (x y) (if (natural-string-< x y) y x)) - (cmd? "git tag -l v\\*")) - 1)) - -(defun parse-version (string) - (mapcar (lambda (x) - (parse-integer x :junk-allowed t)) - (loop repeat 3 ; XXX: parameterize - for el in (regexp-split "\\." (find-current-version)) - collect el))) - -(defun check-for-unrecorded-changes (&optional force) - (unless (cmd "git diff --exit-code") - (write-line "Unrecorded changes.") - (if force - (write-line "Continuing anyway.") - (die "Aborting.~@ - Use -f or --force if you want to make a release anyway.")))) - -(defun new-version-number-candidates (current-version) - (let ((current-version (parse-version current-version))) - (labels ((alternatives (before after) - (when after - (cons (append before (list (1+ (first after))) - (mapcar (constantly 0) (rest after))) - (alternatives (append before (list (first after))) - (rest after)))))) - (loop for alt in (alternatives nil current-version) - collect (reduce (lambda (acc next) - (format nil "~a.~a" acc next)) - alt))))) - -(defun ask-user-for-version (current-version next-versions) - (format *query-io* "Current version is ~A. Which will be the next one?~%" - current-version) - (loop for i from 1 and version in next-versions - do (format *query-io* "~T~A) ~A~%" i version)) - (format *query-io* "? ") - (finish-output *query-io*) - (nth (1- (parse-integer (read-line) :junk-allowed t)) - next-versions)) - -(defun git-tag-tree (version) - (write-line "Tagging the tree...") - (maybe-cmd! "git tag \"v~A\"" version)) - -(defun add-version-to-system-file (version path-in path-out) - (with-open-file (in path-in :direction :input) - (with-open-file (out path-out :direction :output) - (loop for line = (read-line in nil nil) while line - do (write-line line out) - when (string= #1="(defsystem " line - :end2 (min (length #1#) (length line))) - do (format out " :version ~s~%" version))))) - -(defun create-dist (version distname) - (write-line "Creating distribution...") - (cmd! "mkdir \"~a\"" distname) - (cmd! "git archive master | tar xC \"~A\"" distname) - (format t "Updating ~A with new version: ~A~%" *asdf-file* version) - (let* ((asdf-file-path (format nil "~A/~A" distname *asdf-file*)) - (tmp-asdf-file-path (format nil "~a.tmp" asdf-file-path))) - (add-version-to-system-file version asdf-file-path tmp-asdf-file-path) - (cmd! "mv \"~a\" \"~a\"" tmp-asdf-file-path asdf-file-path))) - -(defun tar-and-sign (distname tarball) - (write-line "Creating and signing tarball...") - (cmd! "tar czf \"~a\" \"~a\"" tarball distname) - (cmd! "gpg -b -a \"~a\"" tarball)) - -(defparameter *remote-directory* (format nil "~A:~A" *host* *release-dir*)) - -(defun upload-tarball (tarball signature remote-directory) - (write-line "Copying tarball to web server...") - (maybe-cmd! "scp \"~A\" \"~A\" \"~A\"" tarball signature remote-directory) - (format t "Uploaded ~A and ~A.~%" tarball signature)) - -(defun update-remote-links (tarball signature host release-dir project-name) - (format t "Updating ~A_latest links...~%" project-name) - (maybe-cmd! "ssh \"~A\" ln -sf \"~A\" \"~A/~A_latest.tar.gz\"" - host tarball release-dir project-name) - (maybe-cmd! "ssh \"~A\" ln -sf \"~A\" \"~A/~A_latest.tar.gz.asc\"" - host signature release-dir project-name)) - -(defun upload-version-file (version version-file host version-file-dir) - (format t "Uploading ~A...~%" version-file) - (maybe-cmd! "echo -n \"~A\" > \"~A\"" version version-file) - (maybe-cmd! "scp \"~A\" \"~A\":\"~A\"" version-file host version-file-dir) - (maybe-cmd! "rm \"~A\"" version-file)) - -(defun maybe-clean-things-up (tarball signature) - (when (y-or-n-p "Clean local tarball and signature?") - (cmd! "rm \"~A\" \"~A\"" tarball signature))) - -(defun run (force version) - (check-for-unrecorded-changes force) - ;; figure out what version we'll be preparing. - (unless version - (let* ((current-version (find-current-version)) - (next-versions (new-version-number-candidates current-version))) - (setf version (or (ask-user-for-version current-version next-versions) - (die "invalid selection."))))) - (git-tag-tree version) - (let* ((distname (format nil "~A_~A" *project-name* version)) - (tarball (format nil "~A.tar.gz" distname)) - (signature (format nil "~A.asc" tarball))) - ;; package things up. - (create-dist version distname) - (tar-and-sign distname tarball) - ;; upload. - (upload-tarball tarball signature *remote-directory*) - (update-remote-links tarball signature *host* *release-dir* *project-name*) - (when *version-file* - (upload-version-file version *version-file* *host* *version-file-dir*)) - ;; clean up. - (maybe-clean-things-up tarball signature) - ;; documentation. - ;; (write-line "Building and uploading documentation...") - ;; (maybe-cmd! "make -C doc upload-docs") - ;; push tags and any outstanding changes. - (write-line "Pushing tags and changes...") - (maybe-cmd! "git push --tags origin master"))) - - -;;;; Do it to it - -(let ((force nil) - (version nil) - (args ext:*args*)) - (loop while args - do (string-case (pop args) - (("-h" "--help") - (write-line "No help, sorry. Read the source.") - (ext:quit 0)) - (("-f" "--force") - (setf force t)) - (("-v" "--version") - (setf version (pop args))) - (("-n" "--dry-run") - (setf *dry-run* t)) - (t - (die "Unrecognized argument '~a'" it)))) - (run force version)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-abcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-abcl.lisp deleted file mode 100644 index b570756..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-abcl.lisp +++ /dev/null @@ -1,46 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tf-abcl.lisp --- ABCL trivial-features implementation. -;;; -;;; Copyright (C) 2009, Luis Oliveira -;;; -;;; 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. - -(in-package :cl-user) - -;;;; Endianness - -(pushnew (let ((order (jcall "toString" - (jstatic "nativeOrder" "java.nio.ByteOrder")))) - (cond ((string-equal order "LITTLE_ENDIAN") - :little-endian) - ((string-equal order "BIG_ENDIAN") - :big-endian) - (t (error "Byte order ~A unknown" order)))) - *features*) - -;;;; OS - -;;; ABCL already pushes :LINUX and :UNIX. - -;;;; CPU - -;;; ABCL already pushes :x86-64 \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-allegro.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-allegro.lisp deleted file mode 100644 index 40984d8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-allegro.lisp +++ /dev/null @@ -1,49 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tf-allegro.lisp --- Allegro implementation of trivial-features. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package :cl-user) - -;;;; Endianness - -;;; Allegro already pushes :LITTLE-ENDIAN and :BIG-ENDIAN. - -;;;; OS - -;;; Allegro already pushes :LINUX and :UNIX. - -#+mswindows (pushnew :windows *features*) -#+macosx (pushnew :darwin *features*) - -;;; Pushing :BSD. (Make sure this list is complete.) -#+(or macosx darwin freebsd netbsd openbsd) -(pushnew :bsd *features*) - -;;;; CPU - -;;; Allegro already pushes :X86 and :X86-64. - -;;; what about PPC64? -#+powerpc (pushnew :ppc *features*) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-clasp.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-clasp.lisp deleted file mode 100644 index d12bf70..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-clasp.lisp +++ /dev/null @@ -1,36 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tf-clasp.lisp --- CLASP implementation of trivial-features. -;;; -;;; 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. - -(in-package :cl-user) - -;;;; Endianness -;;; - Set by CLASP directly. Sets :LITTLE-ENDIAN or :BIG-ENDIAN - -;;;; OS -;;; - Set by CLASP directly. Already pushes :DARWIN, :LINUX, :UNIX, :BSD - -;;;; CPU -;;; - Set by CLASP directly. Already pushes :X86-64 (currently the only -;;; supported platform) - More will be added directly in CLASP as soon as -;;; porting is done. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-clisp.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-clisp.lisp deleted file mode 100644 index 1b4443d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-clisp.lisp +++ /dev/null @@ -1,72 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tf-clisp.lisp --- CLISP trivial-features implementation. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package :cl-user) - -;;;; Endianness - -(pushnew (intern (symbol-name (if sys::*big-endian* - '#:big-endian - '#:little-endian)) - '#:keyword) - *features*) - -;;;; OS - -;;; CLISP already exports :UNIX. - -#+win32 (pushnew :windows *features*) - -#-win32 -(eval-when (:compile-toplevel :load-toplevel :execute) - (pushnew (with-standard-io-syntax - (read-from-string - (format nil ":~(~A~)" (posix:uname-sysname (posix:uname))))) - *features*)) - -#+(or darwin freebsd netbsd openbsd) -(pushnew :bsd *features*) - -;;;; CPU - -;;; FIXME: not complete -(let ((cpu (cond - ((or (member :pc386 *features*) - (member (machine-type) '("x86" "x86_64") - :test #'string-equal)) - (if (member :word-size=64 *features*) - '#:x86-64 - '#:x86)) - ((string= (machine-type) "POWER MACINTOSH") - '#:ppc) - ((or (member (machine-type) '("SPARC" "SPARC64") - :test #'string-equal)) - (if (member :word-size=64 *features*) - '#:sparc64 - '#:sparc))))) - (when cpu - (pushnew (intern (symbol-name cpu) '#:keyword) - *features*))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-cmucl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-cmucl.lisp deleted file mode 100644 index ac3adc0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-cmucl.lisp +++ /dev/null @@ -1,44 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tf-cmucl.lisp --- CMUCL implementation of trivial-features. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package :cl-user) - -;;;; Endianness - -(pushnew (alien:with-alien ((ptr (array (alien:unsigned 8) 2))) - (setf (sys:sap-ref-16 (alien:alien-sap ptr) 0) #xfeff) - (ecase (sys:sap-ref-8 (alien:alien-sap ptr) 0) - (#xfe (intern "BIG-ENDIAN" :keyword)) - (#xff (intern "LITTLE-ENDIAN" :keyword)))) - *features*) - -;;;; OS - -;;; CMUCL already pushes :UNIX, :BSD, :LINUX and :DARWIN. - -;;;; CPU - -;;; CMUCL already pushes :PPC and :X86. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-corman.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-corman.lisp deleted file mode 100644 index f66a6fe..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-corman.lisp +++ /dev/null @@ -1,39 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tf-corman.lisp --- Corman Lisp implementation of trivial-features. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package :cl-user) - -;;;; Endianness - -(pushnew :little-endian *features*) - -;;;; OS - -(pushnew :windows *features*) - -;;;; CPU - -(pushnew :x86 *features*) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-ecl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-ecl.lisp deleted file mode 100644 index 8dc26e9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-ecl.lisp +++ /dev/null @@ -1,55 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tf-ecl.lisp --- ECL implementation of trivial-features. -;;; -;;; Copyright (C) 2007-2009, Luis Oliveira -;;; -;;; 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. - -(in-package :cl-user) - -;;;; Endianness - -(pushnew (let ((ptr (ffi:allocate-foreign-object :unsigned-short))) - (unwind-protect - (progn - (setf (ffi:deref-pointer ptr :unsigned-short) #xfeff) - (ecase (ffi:deref-pointer ptr :unsigned-byte) - (#xfe (intern "BIG-ENDIAN" "KEYWORD")) - (#xff (intern "LITTLE-ENDIAN" "KEYWORD")))) - (ffi:free-foreign-object ptr))) - *features*) - -;;;; OS - -;;; ECL already pushes :DARWIN, :LINUX, :UNIX (except on Darwin) and :BSD. - -#+darwin (pushnew :unix *features*) -#+win32 (pushnew :windows *features*) - -;;;; CPU - -;;; FIXME: add more -#+powerpc7450 (pushnew :ppc *features*) -#+x86_64 (pushnew :x86-64 *features*) -#+(or i386 i486 i586 i686) (pushnew :x86 *features*) -#+(or armv5l armv6l armv7l) (pushnew :arm *features*) -#+mipsel (pushnew :mips *features*) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-lispworks.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-lispworks.lisp deleted file mode 100644 index ce2fae2..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-lispworks.lisp +++ /dev/null @@ -1,58 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tf-lispworks.lisp --- Lispworks implementation of trivial-features. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package :cl-user) - -;;;; Endianness - -;;; Lispworks pushes :LITTLE-ENDIAN. - -#-little-endian (pushnew :big-endian *features*) - -#-(and) -(pushnew (fli:with-dynamic-foreign-objects () - (let ((ptr (fli:alloca :type :byte :nelems 2))) - (setf (fli:dereference ptr :type '(:unsigned :short)) #xfeff) - (ecase (fli:dereference ptr :type '(:unsigned :byte)) - (#xfe (intern "BIG-ENDIAN" :keyword)) - (#xff (intern "LITTLE-ENDIAN" :keyword))))) - *features*) - -;;;; OS - -;;; Lispworks already pushes :DARWIN, :LINUX and :UNIX. - -#+win32 (pushnew :windows *features*) - -;;; Pushing :BSD. (Make sure this list is complete.) -#+(or darwin freebsd netbsd openbsd) -(pushnew :bsd *features*) - -;;;; CPU - -;;; Lispworks already pushes :X86. - -#+powerpc (pushnew :ppc *features*) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mcl.lisp deleted file mode 100644 index 5f1a0cf..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mcl.lisp +++ /dev/null @@ -1,41 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tf-mcl.lisp --- Digitool MCL trivial-features implementation. -;;; -;;; Copyright (C) 2010, Chun Tian (binghe) -;;; -;;; 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. - -(in-package :cl-user) - -;;;; Endianness - -(pushnew :big-endian *features*) - -;;;; OS - -;;; MCL already pushes :UNIX and :DARWIN. - -(pushnew :bsd *features*) - -;;;; CPU - -#+ppc-target (pushnew :ppc *features*) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mezzano.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mezzano.lisp deleted file mode 100644 index 47385d6..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mezzano.lisp +++ /dev/null @@ -1,39 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tf-mezzano.lisp --- Mezzano trivial-features implementation. -;;; -;;; Copyright (C) 2009, Luis Oliveira -;;; -;;; 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. - -(in-package :cl-user) - -;;;; Endianness - -;;; Mezzano already pushes :LITTLE-ENDIAN. - -;;;; OS - -;;; Mezzano already pushes :MEZZANO. - -;;;; CPU - -;;; Mezzano already pushes :X86-64. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mkcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mkcl.lisp deleted file mode 100644 index 53aa635..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mkcl.lisp +++ /dev/null @@ -1,49 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tf-mkcl.lisp --- MKCL implementation of trivial-features. -;;; -;;; Copyright (C) 2007-2009, Luis Oliveira -;;; -;;; 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. - -(in-package :cl-user) - -;;;; Endianness - -#-(or :little-endian :big-endian) -(pushnew (let ((ptr (ffi:allocate-foreign-object :unsigned-short))) - (unwind-protect - (progn - (setf (ffi:deref-pointer ptr :unsigned-short) #xfeff) - (ecase (ffi:deref-pointer ptr :unsigned-byte) - (#xfe (intern "BIG-ENDIAN" "KEYWORD")) - (#xff (intern "LITTLE-ENDIAN" "KEYWORD")))) - (ffi:free-foreign-object ptr))) - *features*) - -;;;; OS - -;;; MKCL conforms to SPEC - -;;;; CPU - -;;; MKCL conforms to SPEC - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mocl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mocl.lisp deleted file mode 100644 index adf0cea..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mocl.lisp +++ /dev/null @@ -1,40 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tf-mocl.lisp --- MOCL trivial-features implementation. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package :cl-user) - -;;;; Endianness - -;;; MOCL already pushes :LITTLE-ENDIAN. - -;;;; OS - -;;; MOCL already pushes :IOS, :DARWIN, :BSD, and :UNIX for iOS, -;;; and :ANDROID, :LINUX, and :UNIX for Android. - -;;;; CPU - -;;; MOCL already pushes :ARM. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-openmcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-openmcl.lisp deleted file mode 100644 index f96096f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-openmcl.lisp +++ /dev/null @@ -1,47 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tf-openmcl.lisp --- OpenMCL trivial-features implementation. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package :cl-user) - -;;;; Endianness - -(pushnew #+big-endian-target :big-endian - #+little-endian-target :little-endian - *features*) - -;;;; OS - -;;; OpenMCL already pushes :UNIX and :DARWIN. - -#+linux-target (pushnew :linux *features*) - -#+darwin (pushnew :bsd *features*) - -;;;; CPU - -;;; what about ppc64? -#+ppc-target (pushnew :ppc *features*) -#+x8664-target (pushnew :x86-64 *features*) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-sbcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-sbcl.lisp deleted file mode 100644 index 483d22a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-sbcl.lisp +++ /dev/null @@ -1,51 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tf-sbcl.lisp --- SBCL trivial-features implementation. -;;; -;;; Copyright (C) 2007-2009, Luis Oliveira -;;; -;;; 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. - -(in-package :cl-user) - -;;;; Endianness - -(pushnew (sb-alien:with-alien ((ptr (array (sb-alien:unsigned 8) 2))) - (setf (sb-sys:sap-ref-16 (sb-alien:alien-sap ptr) 0) #xfeff) - (ecase (sb-sys:sap-ref-8 (sb-alien:alien-sap ptr) 0) - (#xfe (intern "BIG-ENDIAN" :keyword)) - (#xff (intern "LITTLE-ENDIAN" :keyword)))) - *features*) - -;;;; OS - -;;; SBCL already pushes :DARWIN, :LINUX, :BSD and :UNIX. - -#+win32 -(progn - ;; note: as of 2008 or so, SBCL doesn't push :UNIX and :WIN32 - ;; simultaneously anymore. - (setq *features* (remove :unix *features*)) - (pushnew :windows *features*)) - -;;;; CPU - -;;; SBCL already pushes: :X86, :X86-64, and :PPC diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-scl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-scl.lisp deleted file mode 100644 index 0455818..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-scl.lisp +++ /dev/null @@ -1,47 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tf-scl.lisp --- SCL implementation of trivial-features. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package :cl-user) - -;;;; Endianness - -(pushnew (alien:with-alien ((ptr (array (alien:unsigned 8) 2))) - (setf (sys:sap-ref-16 (alien:alien-sap ptr) 0) #xfeff) - (ecase (sys:sap-ref-8 (alien:alien-sap ptr) 0) - (#xfe (intern (symbol-name '#:big-endian) '#:keyword)) - (#xff (intern (symbol-name '#:little-endian) '#:keyword)))) - *features*) - -;;;; OS - -;;; SCL already pushes :unix, :bsd, :linux, :hpux, and :solaris - -;;;; CPU - -;;; SCL already pushes :amd64, :x86, :sparc, :sparc64, :hppa and :hppa64. -;;; For 64 bit CPUs the SCL pushes: :64bit - -#+amd64 (pushnew :x86-64 *features*) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-xcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-xcl.lisp deleted file mode 100644 index 42aeb35..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-xcl.lisp +++ /dev/null @@ -1,39 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tf-xcl.lisp --- XCL trivial-features implementation. -;;; -;;; Copyright (C) 2009, Luis Oliveira -;;; -;;; 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. - -(in-package :cl-user) - -;;;; Endianness - -;;; XCL already pushes :LITTLE-ENDIAN. - -;;;; OS - -;;; XCL already pushes :LINUX, :UNIX, :FREEBSD, :NETBSD, :BSD and :WINDOWS. - -;;;; CPU - -;;; XCL already pushes :X86 and :X86-64. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/package.lisp deleted file mode 100644 index 1ff95b9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/package.lisp +++ /dev/null @@ -1,34 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; package.lisp --- TRIVIAL-FEATURES-TESTS package definition. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package :cl-user) - -(defpackage :trivial-features-tests - (:use :common-lisp - :regression-test - :alexandria - :cffi) - (:export #:run)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/sysinfo.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/sysinfo.lisp deleted file mode 100644 index 989b397..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/sysinfo.lisp +++ /dev/null @@ -1,49 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; sysinfo.lisp --- FFI definitions for GetSystemInfo(). -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package :trivial-features-tests) - -(defctype word :unsigned-short) - -(defcenum (architecture word) - (:amd64 9) - (:ia64 6) - (:intel 0) - (:unknown #xffff)) - -(defcstruct (system-info :size 36) - (processor-architecture architecture)) - -(load-foreign-library "kernel32.dll") - -(defcfun ("GetSystemInfo" %get-system-info :cconv :stdcall) :void - (system-info :pointer)) - -;;; only getting at the CPU architecture for now. -(defun get-system-info () - (with-foreign-object (si 'system-info) - (%get-system-info si) - (foreign-slot-value si 'system-info 'processor-architecture))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/tests.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/tests.lisp deleted file mode 100644 index 4215aaf..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/tests.lisp +++ /dev/null @@ -1,130 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; tests.lisp --- trivial-features tests. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package :trivial-features-tests) - -(defun run () - (let ((*package* (find-package :trivial-features-tests))) - (do-tests) - (null (regression-test:pending-tests)))) - -;;;; Support Code - -#-windows -(progn - ;; Hmm, why not just use OSICAT-POSIX:UNAME? - (defcfun ("uname" %uname) :int - (buf :pointer)) - - ;; Get system identification. - (defun uname () - (with-foreign-object (buf '(:struct utsname)) - (when (= (%uname buf) -1) - (error "uname() returned -1")) - (macrolet ((utsname-slot (name) - `(foreign-string-to-lisp - (foreign-slot-pointer buf 'utsname ',name)))) - (values (utsname-slot sysname) - ;; (utsname-slot nodename) - ;; (utsname-slot release) - ;; (utsname-slot version) - (utsname-slot machine)))))) - -(defun mutually-exclusive-p (features) - (= 1 (loop for feature in features when (featurep feature) count 1))) - -;;;; Tests - -(deftest endianness.1 - (with-foreign-object (p :uint16) - (setf (mem-ref p :uint16) #xfeff) - (ecase (mem-ref p :uint8) - (#xfe (featurep :big-endian)) - (#xff (featurep :little-endian)))) - t) - -(defparameter *bsds* '(:darwin :netbsd :openbsd :freebsd)) -(defparameter *unices* (list* :linux *bsds*)) - -#+windows -(deftest os.1 - (featurep (list* :or :unix *unices*)) - nil) - -#-windows -(deftest os.1 - (featurep (make-keyword (string-upcase (uname)))) - t) - -(deftest os.2 - (if (featurep :bsd) - (mutually-exclusive-p *bsds*) - (featurep `(:not (:or ,@*bsds*)))) - t) - -(deftest os.3 - (if (featurep `(:or ,@*unices*)) - (featurep :unix) - t) - t) - -(deftest os.4 - (if (featurep :windows) - (not (featurep :unix)) - t) - t) - -(deftest cpu.1 - (mutually-exclusive-p '(:ppc :ppc64 :x86 :x86-64 :alpha :mips)) - t) - -#+windows -(deftest cpu.2 - (case (get-system-info) - (:intel (featurep :x86)) - (:amd64 (featurep :x86-64)) - (:ia64 nil) ; add this feature later! - (t t)) - t) - -#-windows -(deftest cpu.2 - (let ((machine (nth-value 1 (uname)))) - (cond ((member machine '("x86" "x86_64") :test #'string=) - (ecase (foreign-type-size :pointer) - (4 (featurep :x86)) - (8 (featurep :x86-64)))) - (t - (format *debug-io* - "~&; NOTE: unhandled machine type, ~a, in CPU.2 test.~%" - machine) - t))) - t) - -;; regression test: sometimes, silly logic leads to pushing nil to -;; *features*. -(deftest nil.1 (featurep nil) nil) -(deftest nil.2 (featurep :nil) nil) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/utsname.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/utsname.lisp deleted file mode 100644 index 9ffbf59..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/utsname.lisp +++ /dev/null @@ -1,36 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; utsname.lisp --- Grovel definitions for uname(3). -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(in-package :trivial-features-tests) - -(include "sys/utsname.h") - -(cstruct utsname "struct utsname" - (sysname "sysname" :type :char) - (nodename "nodename" :type :char) - (release "release" :type :char) - (version "version" :type :char) - (machine "machine" :type :char)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/trivial-features-tests.asd b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/trivial-features-tests.asd deleted file mode 100644 index fee88e3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/trivial-features-tests.asd +++ /dev/null @@ -1,52 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; trivial-features-tests.asd --- ASDF definition. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -(eval-when (:load-toplevel :execute) - ;; We need to load trivial-features this way before the the - ;; defsystem form is read for the corner case when someone loads - ;; trivial-features-tests before trivial-features since the system - ;; definition's got a #+windows reader conditional that is supplied - ;; by trivial-features. - (oos 'load-op 'trivial-features)) - -(defsystem trivial-features-tests - :description "Unit tests for TRIVIAL-FEATURES." - :author "Luis Oliveira " - :licence "MIT" - :defsystem-depends-on (cffi-grovel) - :depends-on (trivial-features rt cffi alexandria) - :components - ((:module tests - :serial t - :components - ((:file "package") - #-windows (:cffi-grovel-file "utsname") - #+windows (:file "sysinfo") - (:file "tests"))))) - -(defmethod perform ((o test-op) (c (eql (find-system 'trivial-features-tests)))) - (let ((*package* (find-package 'trivial-features-tests))) - (funcall (find-symbol (symbol-name '#:do-tests))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/trivial-features.asd b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/trivial-features.asd deleted file mode 100644 index 27a4c73..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/trivial-features.asd +++ /dev/null @@ -1,59 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; trivial-features.asd --- ASDF system definition. -;;; -;;; Copyright (C) 2007, Luis Oliveira -;;; -;;; 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. - -#-(or sbcl clisp allegro openmcl mcl mkcl lispworks ecl cmu scl cormanlisp abcl xcl mocl clasp mezzano) -(error "Sorry, your Lisp is not supported. Patches welcome.") - -(defsystem trivial-features - :description "Ensures consistent *FEATURES* across multiple CLs." - :author "Luis Oliveira " - :licence "MIT" - :components - ((:module src - :serial t - :components - (#+allegro (:file "tf-allegro") - #+clisp (:file "tf-clisp") - #+cmu (:file "tf-cmucl") - #+cormanlisp (:file "tf-cormanlisp") - #+ecl (:file "tf-ecl") - #+lispworks (:file "tf-lispworks") - #+openmcl (:file "tf-openmcl") - #+mcl (:file "tf-mcl") - #+mkcl (:file "tf-mkcl") - #+sbcl (:file "tf-sbcl") - #+scl (:file "tf-scl") - #+abcl (:file "tf-abcl") - #+xcl (:file "tf-xcl") - #+mocl (:file "tf-mocl") - #+clasp (:file "tf-clasp") - #+mezzano (:file "tf-mezzano") - )))) - -#-mezzano -(defmethod perform ((o test-op) (c (eql (find-system 'trivial-features)))) - (operate 'load-op 'trivial-features-tests) - (operate 'test-op 'trivial-features-tests)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/COPYING b/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/COPYING deleted file mode 100644 index fcb4fe7..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/COPYING +++ /dev/null @@ -1,22 +0,0 @@ - Copyright (c) 2005 David Lichteblau - Copyright (c) 2013 Anton Vodonosov - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation files - (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, - publish, distribute, sublicense, and/or sell copies of the Software, - and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/Makefile b/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/Makefile deleted file mode 100644 index f6d297c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -.PHONY: clean -clean: - rm -f *.fasl *.x86f *.fas *.ufsl *.lib *.pfsl diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/README b/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/README deleted file mode 100644 index 4e49ce1..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/README +++ /dev/null @@ -1,40 +0,0 @@ -trivial-gray-streams -==================== - -Gray streams is an interface proposed for inclusion with ANSI CL -by David N. Gray in Issue STREAM-DEFINITION-BY-USER -(http://www.nhplace.com/kent/CL/Issues/stream-definition-by-user.html). -The proposal did not make it into ANSI CL, but most popular -CL implementations implement this facility anyway. - -This system provides an extremely thin compatibility layer for gray -streams. - -How to use it -============= - -Use the package TRIVIAL-GRAY-STREAMS to refer Gray stream -classes to inherit from, generic functions to implement. - -Extensions -========== - -The Gray proposal was made before the ANCI CL standard was finalized, -and was based on the Common Lisp The Language book. - -The book does not have cl:file-position, cl:read-sequence, cl:write-sequence -functions. That's why (we think) the Gray proposal does not specify -their counterparts: stream-file-position, stream-read-sequence, stream-write-sequence. - -trivial-gray-streams supports these functions: - -Generic function STREAM-READ-SEQUENCE (stream sequence start end &key) -Generic function STREAM-WRITE-SEQUENCE (stream sequence start end &key) - - Notice that we use two required arguments and allow additional - keyword arguments. Your methods on these function should have - compliant lambda lists: - (stream sequence start end &key) - -Generic function STREAM-FILE-POSITION (stream) => file position -Generic function (SETF STREAM-FILE-POSITION) (position-spec stream) => successp diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/build.xcvb b/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/build.xcvb deleted file mode 100644 index abd5622..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/build.xcvb +++ /dev/null @@ -1,7 +0,0 @@ -#+xcvb -(module - (:fullname "trivial-gray-streams" - :depends-on - ("package" - "streams") - :supersedes-asdf ("trivial-gray-streams"))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/package.lisp deleted file mode 100644 index c5fac85..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/package.lisp +++ /dev/null @@ -1,77 +0,0 @@ -#+xcvb (module ()) - -(in-package :cl-user) - -#+:abcl -(eval-when (:compile-toplevel :load-toplevel :execute) - (require :gray-streams)) - -#+(or cmu genera) -(eval-when (:compile-toplevel :load-toplevel :execute) - (require :gray-streams)) - -#+allegro -(eval-when (:compile-toplevel :load-toplevel :execute) - (unless (fboundp 'excl:stream-write-string) - (require "streamc.fasl"))) - -#+(or ecl clasp) -(eval-when (:compile-toplevel :load-toplevel :execute) - (gray::redefine-cl-functions)) - -(macrolet - ((frob () - (let ((gray-class-symbols - '(#:fundamental-stream - #:fundamental-input-stream #:fundamental-output-stream - #:fundamental-character-stream #:fundamental-binary-stream - #:fundamental-character-input-stream #:fundamental-character-output-stream - #:fundamental-binary-input-stream #:fundamental-binary-output-stream)) - (gray-function-symbols - '(#:stream-read-char - #:stream-unread-char #:stream-read-char-no-hang - #:stream-peek-char #:stream-listen #:stream-read-line - #:stream-clear-input #:stream-write-char #:stream-line-column - #:stream-start-line-p #:stream-write-string #:stream-terpri - #:stream-fresh-line #:stream-finish-output #:stream-force-output - #:stream-clear-output #:stream-advance-to-column - #:stream-read-byte #:stream-write-byte))) - `(progn - - (defpackage impl-specific-gray - (:use :cl) - (:import-from - #+sbcl :sb-gray - #+allegro :excl - #+cmu :ext - #+(or clisp ecl mocl clasp) :gray - #+openmcl :ccl - #+lispworks :stream - #+(or abcl genera) :gray-streams - #-(or sbcl allegro cmu clisp openmcl lispworks ecl clasp abcl mocl genera) ... - ,@gray-class-symbols - ,@gray-function-symbols) - (:export - ,@gray-class-symbols - ,@gray-function-symbols)) - - (defpackage :trivial-gray-streams - (:use :cl) - (:import-from #:impl-specific-gray - ;; We import and re-export only - ;; function symbols; - ;; But we define our own classes - ;; mirroring the gray class hierarchy - ;; of the lisp implementation (this - ;; is necessary to define our methods - ;; for particular generic functions) - ,@gray-function-symbols) - (:export ,@gray-class-symbols - ,@gray-function-symbols - ;; extension functions - #:stream-read-sequence - #:stream-write-sequence - #:stream-file-position - ;; deprecated - #:trivial-gray-stream-mixin)))))) - (frob)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/streams.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/streams.lisp deleted file mode 100644 index c4101d0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/streams.lisp +++ /dev/null @@ -1,292 +0,0 @@ -#+xcvb (module (:depends-on ("package"))) - -(in-package :trivial-gray-streams) - -(defclass fundamental-stream (impl-specific-gray:fundamental-stream) ()) -(defclass fundamental-input-stream - (fundamental-stream impl-specific-gray:fundamental-input-stream) ()) -(defclass fundamental-output-stream - (fundamental-stream impl-specific-gray:fundamental-output-stream) ()) -(defclass fundamental-character-stream - (fundamental-stream impl-specific-gray:fundamental-character-stream) ()) -(defclass fundamental-binary-stream - (fundamental-stream impl-specific-gray:fundamental-binary-stream) ()) -(defclass fundamental-character-input-stream - (fundamental-input-stream fundamental-character-stream - impl-specific-gray:fundamental-character-input-stream) ()) -(defclass fundamental-character-output-stream - (fundamental-output-stream fundamental-character-stream - impl-specific-gray:fundamental-character-output-stream) ()) -(defclass fundamental-binary-input-stream - (fundamental-input-stream fundamental-binary-stream - impl-specific-gray:fundamental-binary-input-stream) ()) -(defclass fundamental-binary-output-stream - (fundamental-output-stream fundamental-binary-stream - impl-specific-gray:fundamental-binary-output-stream) ()) - -(defgeneric stream-read-sequence - (stream sequence start end &key &allow-other-keys)) -(defgeneric stream-write-sequence - (stream sequence start end &key &allow-other-keys)) - -(defgeneric stream-file-position (stream)) -(defgeneric (setf stream-file-position) (newval stream)) - -;;; Default methods for stream-read/write-sequence. -;;; -;;; It would be nice to implement default methods -;;; in trivial gray streams, maybe borrowing the code -;;; from some of CL implementations. But now, for -;;; simplicity we will fallback to default implementation -;;; of the implementation-specific analogue function which calls us. - -(defmethod stream-read-sequence ((stream fundamental-input-stream) seq start end &key) - (declare (ignore seq start end)) - 'fallback) - -(defmethod stream-write-sequence ((stream fundamental-output-stream) seq start end &key) - (declare (ignore seq start end)) - 'fallback) - -(defmacro or-fallback (&body body) - `(let ((result ,@body)) - (if (eq result (quote fallback)) - (call-next-method) - result))) - -;; Implementations should provide this default method, I believe, but -;; at least sbcl and allegro don't. -(defmethod stream-terpri ((stream fundamental-output-stream)) - (write-char #\newline stream)) - -;; stream-file-position could be specialized to -;; fundamental-stream, but to support backward -;; compatibility with flexi-streams, we specialize -;; it on T. The reason: flexi-streams calls stream-file-position -;; for non-gray stream: -;; https://github.com/edicl/flexi-streams/issues/4 -(defmethod stream-file-position ((stream t)) - nil) - -(defmethod (setf stream-file-position) (newval (stream t)) - (declare (ignore newval)) - nil) - -#+abcl -(progn - (defmethod gray-streams:stream-read-sequence - ((s fundamental-input-stream) seq &optional start end) - (or-fallback (stream-read-sequence s seq (or start 0) (or end (length seq))))) - - (defmethod gray-streams:stream-write-sequence - ((s fundamental-output-stream) seq &optional start end) - (or-fallback (stream-write-sequence s seq (or start 0) (or end (length seq))))) - - (defmethod gray-streams:stream-write-string - ((stream xp::xp-structure) string &optional (start 0) (end (length string))) - (xp::write-string+ string stream start end)) - - #+#.(cl:if (cl:and (cl:find-package :gray-streams) - (cl:find-symbol "STREAM-FILE-POSITION" :gray-streams)) - '(:and) - '(:or)) - (defmethod gray-streams:stream-file-position - ((s fundamental-stream) &optional position) - (if position - (setf (stream-file-position s) position) - (stream-file-position s)))) - -#+allegro -(progn - (defmethod excl:stream-read-sequence - ((s fundamental-input-stream) seq &optional start end) - (or-fallback (stream-read-sequence s seq (or start 0) (or end (length seq))))) - - (defmethod excl:stream-write-sequence - ((s fundamental-output-stream) seq &optional start end) - (or-fallback (stream-write-sequence s seq (or start 0) (or end (length seq))))) - - (defmethod excl::stream-file-position - ((stream fundamental-stream) &optional position) - (if position - (setf (stream-file-position stream) position) - (stream-file-position stream)))) - -;; Untill 2014-08-09 CMUCL did not have stream-file-position: -;; http://trac.common-lisp.net/cmucl/ticket/100 -#+cmu -(eval-when (:compile-toplevel :load-toplevel :execute) - (when (find-symbol (string '#:stream-file-position) '#:ext) - (pushnew :cmu-has-stream-file-position *features*))) - -#+cmu -(progn - (defmethod ext:stream-read-sequence - ((s fundamental-input-stream) seq &optional start end) - (or-fallback (stream-read-sequence s seq (or start 0) (or end (length seq))))) - (defmethod ext:stream-write-sequence - ((s fundamental-output-stream) seq &optional start end) - (or-fallback (stream-write-sequence s seq (or start 0) (or end (length seq))))) - - #+cmu-has-stream-file-position - (defmethod ext:stream-file-position ((stream fundamental-stream)) - (stream-file-position stream)) - - #+cmu-has-stream-file-position - (defmethod (setf ext:stream-file-position) (position (stream fundamental-stream)) - (setf (stream-file-position stream) position))) - -#+lispworks -(progn - (defmethod stream:stream-read-sequence - ((s fundamental-input-stream) seq start end) - (or-fallback (stream-read-sequence s seq start end))) - (defmethod stream:stream-write-sequence - ((s fundamental-output-stream) seq start end) - (or-fallback (stream-write-sequence s seq start end))) - - (defmethod stream:stream-file-position ((stream fundamental-stream)) - (stream-file-position stream)) - (defmethod (setf stream:stream-file-position) - (newval (stream fundamental-stream)) - (setf (stream-file-position stream) newval))) - -#+openmcl -(progn - (defmethod ccl:stream-read-vector - ((s fundamental-input-stream) seq start end) - (or-fallback (stream-read-sequence s seq start end))) - (defmethod ccl:stream-write-vector - ((s fundamental-output-stream) seq start end) - (or-fallback (stream-write-sequence s seq start end))) - - (defmethod ccl:stream-read-list ((s fundamental-input-stream) list count) - (or-fallback (stream-read-sequence s list 0 count))) - (defmethod ccl:stream-write-list ((s fundamental-output-stream) list count) - (or-fallback (stream-write-sequence s list 0 count))) - - (defmethod ccl::stream-position ((stream fundamental-stream) &optional new-position) - (if new-position - (setf (stream-file-position stream) new-position) - (stream-file-position stream)))) - -;; up to version 2.43 there were no -;; stream-read-sequence, stream-write-sequence -;; functions in CLISP -#+clisp -(eval-when (:compile-toplevel :load-toplevel :execute) - (when (find-symbol (string '#:stream-read-sequence) '#:gray) - (pushnew :clisp-has-stream-read/write-sequence *features*))) - -#+clisp -(progn - - #+clisp-has-stream-read/write-sequence - (defmethod gray:stream-read-sequence - (seq (s fundamental-input-stream) &key start end) - (or-fallback (stream-read-sequence s seq (or start 0) (or end (length seq))))) - - #+clisp-has-stream-read/write-sequence - (defmethod gray:stream-write-sequence - (seq (s fundamental-output-stream) &key start end) - (or-fallback (stream-write-sequence s seq (or start 0) (or end (length seq))))) - - ;;; for old CLISP - (defmethod gray:stream-read-byte-sequence - ((s fundamental-input-stream) - seq - &optional start end no-hang interactive) - (when no-hang - (error "this stream does not support the NO-HANG argument")) - (when interactive - (error "this stream does not support the INTERACTIVE argument")) - (or-fallback (stream-read-sequence s seq start end))) - - (defmethod gray:stream-write-byte-sequence - ((s fundamental-output-stream) - seq - &optional start end no-hang interactive) - (when no-hang - (error "this stream does not support the NO-HANG argument")) - (when interactive - (error "this stream does not support the INTERACTIVE argument")) - (or-fallback (stream-write-sequence s seq start end))) - - (defmethod gray:stream-read-char-sequence - ((s fundamental-input-stream) seq &optional start end) - (or-fallback (stream-read-sequence s seq start end))) - - (defmethod gray:stream-write-char-sequence - ((s fundamental-output-stream) seq &optional start end) - (or-fallback (stream-write-sequence s seq start end))) - - ;;; end of old CLISP read/write-sequence support - - (defmethod gray:stream-position ((stream fundamental-stream) position) - (if position - (setf (stream-file-position stream) position) - (stream-file-position stream)))) - -#+sbcl -(progn - (defmethod sb-gray:stream-read-sequence - ((s fundamental-input-stream) seq &optional start end) - (or-fallback (stream-read-sequence s seq (or start 0) (or end (length seq))))) - (defmethod sb-gray:stream-write-sequence - ((s fundamental-output-stream) seq &optional start end) - (or-fallback (stream-write-sequence s seq (or start 0) (or end (length seq))))) - (defmethod sb-gray:stream-file-position - ((stream fundamental-stream) &optional position) - (if position - (setf (stream-file-position stream) position) - (stream-file-position stream))) - ;; SBCL extension: - (defmethod sb-gray:stream-line-length ((stream fundamental-stream)) - 80)) - -#+(or ecl clasp) -(progn - (defmethod gray::stream-file-position - ((stream fundamental-stream) &optional position) - (if position - (setf (stream-file-position stream) position) - (stream-file-position stream))) - (defmethod gray:stream-read-sequence - ((s fundamental-input-stream) seq &optional start end) - (or-fallback (stream-read-sequence s seq (or start 0) (or end (length seq))))) - (defmethod gray:stream-write-sequence - ((s fundamental-output-stream) seq &optional start end) - (or-fallback (stream-write-sequence s seq (or start 0) (or end (length seq)))))) - -#+mocl -(progn - (defmethod gray:stream-read-sequence - ((s fundamental-input-stream) seq &optional start end) - (or-fallback (stream-read-sequence s seq (or start 0) (or end (length seq))))) - (defmethod gray:stream-write-sequence - ((s fundamental-output-stream) seq &optional start end) - (or-fallback (stream-write-sequence s seq (or start 0) (or end (length seq))))) - (defmethod gray:stream-file-position - ((stream fundamental-stream) &optional position) - (if position - (setf (stream-file-position stream) position) - (stream-file-position stream)))) - -#+genera -(progn - (defmethod gray-streams:stream-read-sequence - ((s fundamental-input-stream) seq &optional start end) - (or-fallback (stream-read-sequence s seq (or start 0) (or end (length seq))))) - (defmethod gray-streams:stream-write-sequence - ((s fundamental-output-stream) seq &optional start end) - (or-fallback (stream-write-sequence s seq (or start 0) (or end (length seq))))) - (defmethod gray-streams:stream-file-position - ((stream fundamental-stream)) - (stream-file-position stream)) - (defmethod (setf gray-streams:stream-file-position) - (position (stream fundamental-stream)) - (setf (stream-file-position stream) position))) - -;; deprecated -(defclass trivial-gray-stream-mixin () ()) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/test/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/test/package.lisp deleted file mode 100644 index e836637..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/test/package.lisp +++ /dev/null @@ -1,6 +0,0 @@ -(defpackage trivial-gray-streams-test - (:use :cl #:trivial-gray-streams) - (:shadow #:method) - (:export #:run-tests - #:failed-test-names)) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/test/run-on-many-lisps.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/test/run-on-many-lisps.lisp deleted file mode 100644 index 9a2a9a3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/test/run-on-many-lisps.lisp +++ /dev/null @@ -1,66 +0,0 @@ -(ql:quickload :trivial-gray-streams) -(ql:quickload :test-grid-agent) -(ql:quickload :cl-fad) -(in-package :cl-user) - -(defparameter *abcl* (make-instance 'lisp-exe:abcl - :java-exe-path "C:\\Program Files\\Java\\jdk1.6.0_26\\bin\\java" - :abcl-jar-path "C:\\Users\\anton\\unpacked\\abcl\\abcl-bin-1.1.0\\abcl.jar")) -(defparameter *clisp* (make-instance 'lisp-exe:clisp :exe-path "clisp")) -(defparameter *ccl-1.8-x86* (make-instance 'lisp-exe:ccl - :exe-path "C:\\Users\\anton\\unpacked\\ccl\\ccl-1.8-windows\\wx86cl.exe")) -(defparameter *ccl-1.8-x86-64* (make-instance 'lisp-exe:ccl - :exe-path "C:\\Users\\anton\\unpacked\\ccl\\ccl-1.8-windows\\wx86cl64.exe")) -(defparameter *sbcl-1.1.0.45* (make-instance 'lisp-exe:sbcl :exe-path "C:\\Program Files (x86)\\Steel Bank Common Lisp\\1.1.0.45\\run.bat")) -(defparameter *sbcl-win-branch-64* (make-instance 'lisp-exe:sbcl :exe-path "C:\\Program Files\\Steel Bank Common Lisp\\1.1.0.36.mswinmt.1201-284e340\\run.bat")) -(defparameter *sbcl-win-branch-32* (make-instance 'lisp-exe:sbcl :exe-path "C:\\Program Files (x86)\\Steel Bank Common Lisp\\1.1.0.36.mswinmt.1201-284e340\\run.bat")) -(defparameter *ecl-bytecode* (make-instance 'lisp-exe:ecl - :exe-path "C:\\Users\\anton\\projects\\ecl\\bin\\ecl.exe" - :compiler :bytecode)) -(defparameter *ecl-lisp-to-c* (make-instance 'lisp-exe:ecl - :exe-path "C:\\Users\\anton\\projects\\ecl\\bin\\ecl.exe" - :compiler :lisp-to-c)) -(defparameter *acl* (make-instance 'lisp-exe:acl :exe-path "C:\\Program Files (x86)\\acl90express\\alisp.exe")) - -(defun run-on-many-lisps (run-description test-run-dir quicklisp-dir lisps) - (ensure-directories-exist test-run-dir) - (let ((fasl-root (merge-pathnames "fasl/" test-run-dir))) - (labels ((log-name (lisp) - (substitute #\- #\. - ;; Substitute dots by hypens if our main process is CCL, it - ;; prepends the > symbol before dots; - ;; for example: 1.1.0.36.mswinmt.1201-284e340 => 1>.1>.0>.36>.mswinmt.1201-284e340 - ;; When we pass such a pathname to another lisps, they can't handle it. - (string-downcase (tg-agent::implementation-identifier lisp)))) - (fasl-dir (lisp) - (merge-pathnames (format nil "~A/" (log-name lisp)) - fasl-root)) - (run (lisp) - (let* ((lib-result (tg-agent::proc-run-libtest lisp - :trivial-gray-streams - run-description - (merge-pathnames (log-name lisp) test-run-dir) - quicklisp-dir - (fasl-dir lisp))) - (status (getf lib-result :status))) - (if (listp status) - (getf status :failed-tests) - status)))) - (let ((results (mapcar (lambda (lisp) - (list (tg-agent::implementation-identifier lisp) - (run lisp))) - lisps))) - (tg-utils::write-to-file results (merge-pathnames "resutls.lisp" test-run-dir)) - (cl-fad:delete-directory-and-files fasl-root) - results)))) - -(run-on-many-lisps '(:lib-world "quicklisp 2013-02-17 + trivial-gray-streams.head" - :contact-email "avodonosov@yandex.ru") - "C:\\Users\\anton\\projects\\trivial-gray-streams\\test\\" - (merge-pathnames "quicklisp/" (user-homedir-pathname)) - (list *sbcl-1.1.0.45* *sbcl-win-branch-64* *sbcl-win-branch-32* - *abcl* - *clisp* - *ccl-1.8-x86* *ccl-1.8-x86-64* - *ecl-bytecode* *ecl-lisp-to-c* - *acl*)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/test/test-framework.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/test/test-framework.lisp deleted file mode 100644 index 8f9717a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/test/test-framework.lisp +++ /dev/null @@ -1,60 +0,0 @@ -(in-package :trivial-gray-streams-test) - -;;; test framework - -#| - Used like this: - - (list (test (add) (assert (= 5 (+ 2 2)))) - (test (mul) (assert (= 4 (* 2 2)))) - (test (subst) (assert (= 3 (- 4 2))))) - - => ;; list of test results, 2 failed 1 passed - (# - # - #) - -|# - -(defclass test-result () - ((name :type symbol - :initarg :name - :initform (error ":name is requierd") - :accessor name) - (status :type (or (eql :ok) (eql :fail)) - :initform :ok - :initarg :status - :accessor status) - (cause :type (or null condition) - :initform nil - :initarg :cause - :accessor cause))) - -(defun failed-p (test-result) - (eq (status test-result) :fail)) - -(defmethod print-object ((r test-result) stream) - (print-unreadable-object (r stream :type t) - (format stream "~S ~S~@[ ~A~]" (name r) (status r) (cause r)))) - -(defparameter *allow-debugger* nil) - -(defun test-impl (name body-fn) - (flet ((make-result (status &optional cause) - (make-instance 'test-result :name name :status status :cause cause))) - (handler-bind ((serious-condition - (lambda (c) - (unless *allow-debugger* - (format t "FAIL: ~A~%" c) - (let ((result (make-result :fail c))) - (return-from test-impl result)))))) - (format t "Running test ~S... " name) - (funcall body-fn) - (format t "OK~%") - (make-result :ok)))) - -(defmacro test ((name) &body body) - "If the BODY signals a SERIOUS-CONDITION -this macro returns a failed TEST-RESULT; otherwise -returns a successfull TEST-RESULT." - `(test-impl (quote ,name) (lambda () ,@body))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/test/test.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/test/test.lisp deleted file mode 100644 index 0baed1b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/test/test.lisp +++ /dev/null @@ -1,213 +0,0 @@ -(in-package :trivial-gray-streams-test) - -;;; assert-invoked - a tool to check that specified method with parameters has -;;; been invoked during execution of a code body - -(define-condition invoked () - ((method :type (or symbol cons) ;; cons is for (setf method) - :accessor method - :initarg :method - :initform (error ":method is required")) - (args :type list - :accessor args - :initarg :args - :initform nil))) - -(defun assert-invoked-impl (method args body-fn) - (let ((expected-invocation (cons method args)) - (actual-invocations nil)) - (handler-bind ((invoked (lambda (i) - (let ((invocation (cons (method i) (args i)))) - (when (equalp invocation expected-invocation) - (return-from assert-invoked-impl nil)) - (push invocation actual-invocations))))) - (funcall body-fn)) - (let ((*package* (find-package :keyword))) ; ensures package prefixes are printed - (error "expected invocation: ~(~S~) actual: ~{~(~S~)~^, ~}" - expected-invocation (reverse actual-invocations))))) - -(defmacro assert-invoked ((method &rest args) &body body) - "If during execution of the BODY the specified METHOD with ARGS -hasn't been invoked, signals an ERROR." - `(assert-invoked-impl (quote ,method) (list ,@args) (lambda () ,@body))) - -(defun invoked (method &rest args) - (signal 'invoked :method method :args args)) - -;;; The tests. - -#| - We will define a gray stream class, specialise - the gray generic function methods on it and test that the methods - are invoked when we call functions from common-lisp package - on that stream. - - Some of the gray generic functions are only invoked by default - methods of other generic functions: - - cl:format ~t or cl:pprint -> stream-advance-to-column -> stream-line-column - stream-write-char - cl:fresh-line -> stream-fresh-line -> stream-start-line-p -> stream-line-column - stream-terpri - - - If we define our methods for stream-advance-to-column and stream-fresh-line, - then stream-start-line-p, stream-terpri, stram-line-column are not invoked. - - Therefore we define another gray stream class. The first class is used - for all lower level functions (stream-terpri). The second class - is used to test methods for higher level functions (stream-fresh-line). -|# - -(defclass test-stream (fundamental-binary-input-stream - fundamental-binary-output-stream - fundamental-character-input-stream - fundamental-character-output-stream) - ()) - -(defclass test-stream2 (test-stream) ()) - -(defmethod stream-read-char ((stream test-stream)) - (invoked 'stream-read-char stream)) - -(defmethod stream-unread-char ((stream test-stream) char) - (invoked 'stream-unread-char stream char)) - -(defmethod stream-read-char-no-hang ((stream test-stream)) - (invoked 'stream-read-char-no-hang stream)) - -(defmethod stream-peek-char ((stream test-stream)) - (invoked 'stream-peek-char stream)) - -(defmethod stream-listen ((stream test-stream)) - (invoked 'stream-listen stream)) - -(defmethod stream-read-line ((stream test-stream)) - (invoked 'stream-read-line stream)) - -(defmethod stream-clear-input ((stream test-stream)) - (invoked 'stream-clear-input stream)) - -(defmethod stream-write-char ((stream test-stream) char) - (invoked 'stream-write-char stream char)) - -(defmethod stream-line-column ((stream test-stream)) - (invoked 'stream-line-column stream)) - -(defmethod stream-start-line-p ((stream test-stream)) - (invoked 'stream-start-line-p stream)) - -(defmethod stream-write-string ((stream test-stream) string &optional start end) - (invoked 'stream-write-string stream string start end)) - -(defmethod stream-terpri ((stream test-stream)) - (invoked 'stream-terpri stream)) - -(defmethod stream-fresh-line ((stream test-stream2)) - (invoked 'stream-fresh-line stream)) - -(defmethod stream-finish-output ((stream test-stream)) - (invoked 'stream-finish-output stream)) - -(defmethod stream-force-output ((stream test-stream)) - (invoked 'stream-force-output stream)) - -(defmethod stream-clear-output ((stream test-stream)) - (invoked 'stream-clear-output stream)) - -(defmethod stream-advance-to-column ((stream test-stream2) column) - (invoked 'stream-advance-to-column stream column)) - -(defmethod stream-read-byte ((stream test-stream)) - (invoked 'stream-read-byte stream)) - -(defmethod stream-write-byte ((stream test-stream) byte) - (invoked 'stream-write-byte stream byte)) - -(defmethod stream-read-sequence ((s test-stream) seq start end &key) - (invoked 'stream-read-sequence s seq :start start :end end)) - -(defmethod stream-write-sequence ((s test-stream) seq start end &key) - (invoked 'stream-write-sequence s seq :start start :end end)) - -(defmethod stream-file-position ((s test-stream)) - (invoked 'stream-file-position s)) - -(defmethod (setf stream-file-position) (newval (s test-stream)) - (invoked '(setf stream-file-position) newval s)) - -;; Convinience macro, used when we want to name -;; the test case with the same name as of the gray streams method we test. -(defmacro test-invoked ((method &rest args) &body body) - `(test (,method) - (assert-invoked (,method ,@args) - ,@body))) - -(defun run-tests () - (let ((s (make-instance 'test-stream)) - (s2 (make-instance 'test-stream2))) - (list - (test-invoked (stream-read-char s) - (read-char s)) - (test-invoked (stream-unread-char s #\a) - (unread-char #\a s)) - (test-invoked (stream-read-char-no-hang s) - (read-char-no-hang s)) - (test-invoked (stream-peek-char s) - (peek-char nil s)) - (test-invoked (stream-listen s) - (listen s)) - (test-invoked (stream-read-line s) - (read-line s)) - (test-invoked (stream-clear-input s) - (clear-input s)) - (test-invoked (stream-write-char s #\b) - (write-char #\b s)) - (test-invoked (stream-line-column s) - (format s "~10,t")) - (test-invoked (stream-start-line-p s) - (fresh-line s)) - (test-invoked (stream-write-string s "hello" 1 4) - (write-string "hello" s :start 1 :end 4)) - (test-invoked (stream-terpri s) - (fresh-line s)) - (test-invoked (stream-fresh-line s2) - (fresh-line s2)) - (test-invoked (stream-finish-output s) - (finish-output s)) - (test-invoked (stream-force-output s) - (force-output s)) - (test-invoked (stream-clear-output s) - (clear-output s)) - (test-invoked (stream-advance-to-column s2 10) - (format s2 "~10,t")) - (test-invoked (stream-read-byte s) - (read-byte s)) - (test-invoked (stream-write-byte s 1) - (write-byte 1 s)) - ;;; extensions - (let ((seq (vector 1 2))) - (test-invoked (stream-read-sequence s seq :start 0 :end 1) - (read-sequence seq s :start 0 :end 1)) - (test-invoked (stream-write-sequence s seq :start 0 :end 1) - (write-sequence seq s :start 0 :end 1))) - (test-invoked (stream-file-position s) - (file-position s)) - (test (setf-stream-file-position) - (assert-invoked ((setf stream-file-position) 9 s) - (file-position s 9)))))) - -(defun failed-tests (results) - (remove-if-not #'failed-p results)) - -(defun failed-test-names (results) - (mapcar (lambda (result) - (string-downcase (name result))) - (failed-tests results))) - -#| -(failed-test-names (run-tests)) - -(setf *allow-debugger* nil)) - -|# diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/trivial-gray-streams-test.asd b/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/trivial-gray-streams-test.asd deleted file mode 100644 index 9eb6b74..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/trivial-gray-streams-test.asd +++ /dev/null @@ -1,10 +0,0 @@ -;;; -*- mode: lisp -*- - -(defsystem :trivial-gray-streams-test - :version "2.0" - :depends-on (:trivial-gray-streams) - :pathname #P"test/" - :serial t - :components ((:file "package") - (:file "test-framework") - (:file "test"))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/trivial-gray-streams.asd b/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/trivial-gray-streams.asd deleted file mode 100644 index d57afff..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/trivial-gray-streams-20181018-git/trivial-gray-streams.asd +++ /dev/null @@ -1,10 +0,0 @@ -;;; -*- mode: lisp -*- - -(defsystem :trivial-gray-streams - :description "Compatibility layer for Gray Streams (see http://www.cliki.net/Gray%20streams)." - :license "MIT" - :author "David Lichteblau" - :maintainer "Anton Vodonosov " - :version "2.0" - :serial t - :components ((:file "package") (:file "streams"))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/.gitignore b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/.gitignore deleted file mode 100644 index b25c15b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*~ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/CHANGES b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/CHANGES deleted file mode 100644 index 00eadb5..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/CHANGES +++ /dev/null @@ -1,211 +0,0 @@ -0.8.3: - - * New experimental backend: Mezzano (contributed by Bruno Cichon, #51) - * Bugfix: WAIT-FOR-INPUT fails to honor :ready-only t (#57, thanks to @Reepca for reporting this issue) - * Bugfix: [ECL] Fix read-select in backend/sbcl.lisp to loop if interrupted (#54, #55, thanks to @thijs) - * [CCL] Fix compiling with (readtable-case readtable-case) of :invert. (#56, patch from @genworks) - * [Genera] added file attibutes (to all USOCKET lisp files) for Genera. - -0.8.2: (June 11, 2019) - - * General: now the HOST-OR-IP slot of NS-CONDITION has been exported. (#46) - * Bugfix: NS-HOST-NOT-FOUND-ERROR condition has unbound HOST-OR-IP slot (#46) - * Bugfix: [SBCL/LW] WAIT-FOR-INPUT waits only in the first call (when W-F-I is called with a single usocket, introduced in 0.8.0) (#50, thanks to @Hamayama for reporting/hints/testing this issue) - -0.8.1: (Feb 27, 2019) - -* New backend: clasp (patch from Christian Schafmeister, #45) -* Bugfix: [SBCL] fixed loading usocket.asd in SBCL 1.5.0 - -0.8.0: (Feb 4, 2019) - -* New backend (experimental): IOlib. (Push :USOCKET-IOLIB to *FEATURES* to enable this feature) -* New feature: Optimized WAIT-FOR-INPUT for single-socket case (one-time consing) -* New feature: Exported host-to-hostname (#42) -* Bugfix: [SBCL] more robust/thread-safe WAIT-FOR-INPUT-INTERNAL - -0.7.1: (Aug 31, 2018) - -* New feature: GET-(RANDOM)-HOST-BY-NAME (now exported) prefer IPv4 on mixed IPv4/IPv6 (suggested by Mark H. David) -* New backend: Symbolics Open Genera (Lisp machine) (patch from @Symbolics, #33) -* Bugfix: [CLISP] fixed issues in server sockets and error handling. (patch from @vibs29, #28, #29) -* Bugfix: [SBCL, ECL] Fix wait-for-input on Windows SBCL and ECL. (patch from Stas Boukarev, #30) -* Bugfix: [LW] fixed non-existing system calls in LW 5.0 (comm::socket-set-tcp-nodelay) - -0.7.0: (Oct 25, 2016) - -* General: Separated USOCKET and USOCKET-SERVER systems (only the server part depends on Portable-threads) -* General: USOCKET now depends on SPLIT-SEQUENCE (the exactly same vendor code is removed from usocket code base) -* New feature: [LW] (SOCKET-OPTION :TCP-NODELAY) and its SETF version now works on LispWorks 4/5/6/7. -* New feature: [LW] SOCKET-CONNECT now supports setting "tcp_nodelay" in version 4.x and 5.0. -* Bugfix: [CCL] fixed issues in SOCKET-SHUTDOWN -* Bugfix: [CLISP] fixed issues in WAIT-FOR-INPUT (Thanks to a patch by @vibs29, #27) -* Bugfix: [LW] fixed loading in version <= 6.0 (actually 0.6.5 only fixed loading in LW 6.1) -* Bugfix: [ECL] all compilation warnings were checked and fixed. - -0.6.5: (Oct 19, 2016) - -* New feature: SOCKET-OPTION and (setf SOCKET-OPTION) for :SEND-TIMEOUT (thanks to John Pallister) -* Bugfix: Let (WAIT-FOR-INPUT NIL &TIMEOUT) return NIL with respect to TIMEOUT. -* Bugfix: [LW] fixed loading in LispWorks 5.x & 6.x. -* Bugfix: [LW] fixed SOCKET-SHUTDOWN in all versions. -* Bugfix: [ABCL] Fixed incorrect IPv6 addresses (#26), patch from Elias Mårtenson (lokedhs) - -0.6.4: (Mar 17, 2016) - -* New feature: [SBCL] IPv6 support (patch from Guillaume LE VAILLANT, #15) -* New feature: [API] SOCKET-SHUTDOWN added (patch from Thayne McCombs #9) -* New feature: [Corman] minimal initial support of this platform -* Bugfix: [SBCL/win32] wait-for-input nil-timeout bug (patch from Michal Herda, #13) -* Bugfix: [ECL] included unistd.h for gethostname() (patch from Daniel Kochmanski, #7) -* Bugfix: [LispWorks] SOCKET-RECEIVE now updates %READ-P (patch from Frank James) - -0.6.3: (May 23, 2015) - -* Bugfix: [CCL] Further fixed CCL-1.11 compatibility and a typo in SOCKET-CONNECT for CCL-1.10. -* Bugfix: [ECL] Fixed build in some versions. -* Bugfix: [LispWorks] SOCKET-SEND and SOCKET-RECEIVE now throw conditions if something goes wrong. - -0.6.2: (Apr 20, 2015) - -* Bugfix: [CCL] Fixed CCL-1.11 compatibility. -* Bugfix: [ECL] Fixed compatibility on recent versions. -* Bugfix: [LispWorks] Added support address-in-use-error condition on LW/Win32. (patch from Sergey Katrevich). - -0.6.1: (Jun 21, 2013) - -* New feature: [MOCL] Initial MOCL support (TCP only, no W-F-I, patch from github.com/Wukix/usocket). -* New feature: [MCL] Initial UDP support for Macintosh Common Lisp (MCL/RMCL). -* New feature: Added TCP-NO-DELAY (TCP_NODELAY) support in SOCKET-OPTION, for TCP client -* Bugfix: [CCL] Added (:external-format ccl:*default-external-format*) to SOCKET-CONNECT, to prevent it fallback to ISO-8859-1 on NIL. (Patch from Vsevolod Dyomkin) -* Bugfix: [CCL] Performance improved WAIT-FOR-INPUT and other fixes. (patch from Faré ) - -0.6.0: (Dec 26, 2012) - -* New feature: SOCKET-OPTION and (setf SOCKET-OPTION) for seting and geting various socket options. -* New feature: SOCKET-SEND now support an CCL-like OFFSET keyword for sending only parts of the whole buffer. -* New feature: [ECL] Added support for ECL DFFI mode on Windows. (no need for C compilers now) -* Bugfix: [ECL] ECL now list sb-bsd-sockets as a dependency but relies on REQUIRE. (patched by Juanjo) -* Bugfix: [ABCL] Make USOCKET compile warning-free on ABCL again: MAKE-IMMEDIATE-OBJECT was deprecated a while ago in favor of 2 predefined constants. -* Bugfix: [LispWorks] remove redundant call to hcl:flag-special-free-action. (reported by Kamil Shakirov) -* Bugfix: [CLISP] improved HANDLE-CONDITION for more CLISP environments. - -0.5.5: (Feb 27, 2012) - -* Enhancement: SOCKET-CONNECT argument :nodelay can now set to :if-supported (patch from Anton Vodonosov). -* Enhancement: [Server] adding *remote-host* *remote-port* to socket-server stream handler functions (suggested by Matthew Curry) -* Bugfix: [LispWorks] Fixed UDP support for LispWorks 6.1 (patch from Camille Troillard by Martin Simmons). -* Bugfix: [LispWorks] Stop using hcl:add-special-free-action for reclaiming unused UDP socket fds to improve multi-threading stablity (suggested by Camille Troillard). -* Bugfix: [LispWorks] Fixed SOCKET-CONNECT on Windows, now LOCAL-PORT never have *auto-port* (0) as default value. - -0.5.4: (Oct 1, 2011) - -* Bugfix: [ECL] Fixed for ECL's MAKE-BUILD by removing some unecessary code (reported by Juan Jose Garcia-Ripoll, the ECL maintainer) -* Bugfix: [ACL] Fixed for Allegro CL modern mode. -* Bugfix: [SBCL] SOCKET-CONNECT on TCP won't call bind() when keyword arguments LOCAL-HOST or LOCAL-PORT is not set. (reported by Robert Brown) - -0.5.3: (Aug 13, 2011) - -* Bugfix: [MCL] Fixed SOCKET-LISTEN on vector addresses like #(0 0 0 0) -* Bugfix: [MCL] Fixed WAIT-FOR-INPUT on passive sockets (stream-server-usocket) -* Bugfix: [LispWorks] Fixed using OPEN-UDP-SOCKET in delivered applications (thanks to Camille Troillard and Martin Simmons, this fix is from LispWorks-UDP project). -* Bugfix: [SBCL] Fixed for "SBCL data flush problem", reported by Robert Brown and confirmed by Nikodemus Siivola. - -0.5.2: (May 11, 2011) - -* General: [SBCL] SOCKET-CONNECT's TIMEOUT argument was limited on non-Windows platforms. -* Bugfix: [CLISP] WAIT-FOR-INPUT now functions right (with/without READY-ONLY), this made Hunchentoot working on CLISP. (Thanks to Anton Vodonosov ) -* Bugfix: [ABCL] Fix SOCKET-ACCEPT to follow the documented API so that when called without an :ELEMENT-TYPE argument. (Thanks to Mark Evenson, the ABCL developer) -* Bugfix: [LispWorks] Fixed SOCKET-ACCEPT (Windows only) on WAIT-FOR-INPUTed sockets. -* Bugfix: [SBCL, ECL] Fixed wrongly STATE set/unset for WAIT-FOR-INPUT on Windows (report by Elliott Slaughter) -* Enhancement: Additional NAME keyword argument for SOCKET-SERVER for setting the server thread name. -* Enhancement: [ABCL] GET-ADDRESS now works with underlying IPv6 addresses. -* Enhancement: [CLISP] missing GET-LOCAL-* methods for STREAM-SERVER-USOCKET was now added. - -0.5.1: (Apr 2, 2011) - -* New feature: [CLISP] UDP (Datagram) support based on FFI (Win/Mac/Linux), no RAWSOCK needed. -* Enhancement: SOCKET-SERVER return a second value (socket) when calling in new-thread mode. -* Enhancement: [CLISP] Full support of DNS helper functions (GET-HOST-BY-NAME, ...) added. -* Enhancement: [CLISP] Better network error type detection based on OS error code. -* Enhancement: [LispWorks] Better network error type detection based on OS error code. -* Bugfix: Fixed wrong macro expansions of {IP|PORT}-{FROM|TO}-OCTET-BUFFER functions (since 0.4.0) -* Bugfix: SOCKET-CONNECT didn't set CONNECTED-P for datagram usockets on most backends. -* Bugfix: [SBCL] Fixes for "SBCL/Win32: finalizer problem, etc", by Anton Kovalenko -* Bugfix: [SBCL] Fixed SOCKET-SERVER (UDP) on SBCL due to a issue in SOCKET-CONNECT when HOST is NIL. -* Bugfix: [SBCL] SOCKET-CONNECT's TIMEOUT argument now works as a "connection timeout". -* Bugfix: [CMUCL] Fixed SOCKET-SEND on unconnected usockets under Unicode version of CMUCL. -* Bugfix: [CLISP] Fixed and confirmed UDP (Datagram) support (RAWSOCK version). - -0.5.0: (Mar 12, 2011) - -* New supported platform: Macintosh Common Lisp (5.0 and up, plus RMCL) -* Support for UDP (datagram-usocket) was added (for all supported platform except MCL) -* Add WAIT-FOR-INPUT support for SBCL and ECL on win32. -* Simple TCP and UDP server API: SOCKET-SERVER -* Completely rewritten full-feature ABCL backends using latest Java interfaces -* Lots of bug fixed since 0.4.1 - -0.4.1: (Dec 27, 2008) - -* fixes for ECL, LispWorks, SBCL, SCL - -0.4.0: (Oct 28, 2008) - -* select()-like api: make a single thread wait for multiple sockets. -* various socket options for socket-creation with SOCKET-CONNECT. - -0.3.6: (Jun 21, 2008) - -* Code fixups based on advice from the ECL and OpenMCL maintainers. -* New exported symbols: WITH-MAPPED-CONDITIONS, NS-CONDITION, NS-ERROR, NS-UNKNOWN-ERROR and NS-UNKNOWN-CONDITION. - -0.3.4: (Jul 25, 2007) - -* Fix clisp get-host-name, multiple ECL fixes. - -0.3.3: (Jun 05, 2007) - -* Fix where host resolution routine was unable to resolve would return NIL instead of erroring. - -0.3.2: (Mar 04, 2007) - -* Fixes for many backends related to closing sockets. -* LispWorks fix for broken server sockets. -* API guarantee adjustments in preparation of porting Drakma. - -0.3.1: (Feb 28, 2007) - -* fixed with-server-socket; prevent creation of invalid sockets; 2 more convenience macros. - -0.3.0: (Jan 21, 2007) - -* Server sockets - -0.2.5: (Jan 19, 2007) - -* Allegro compilation fix. - -0.2.4: (Jan 17, 2007) - -* Various fixes for CMUCL, OpenMCL, Allegro and LispWorks. - -0.2.3: (Jan 04, 2007) - -* Add :element-type support to support stacking flexi-streams on socket streams for portable :external-format support. - -0.2.2: (Jan 03, 2007) - -* Add ECL support and a small SBCL bugfix. - -0.2.1: (Dec 21, 2006) - -* Remove 'open-stream' interface which is supposed to be provided by the 'trivial-usocket' package. - -0.2.0: (Dec 18, 2006) - -* Add support for Scieneer Common Lisp, fix issue #6 and API preparation for server side sockets (not in this release) - -0.1.0: (Feb 13, 2006) - -* Initial release diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/CONTRIBUTORS b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/CONTRIBUTORS deleted file mode 100644 index fd761cd..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/CONTRIBUTORS +++ /dev/null @@ -1,47 +0,0 @@ --*- Mode: outline -*- - -List of major USOCKET contributors: - -* Erik Enge -* Erik Huelsmann - - original authors - -* Chun Tian -* Hans Huebner - - current maintainers - -* Attila Lendvai - - better handling of unsupported Lisps - -* Vladimir Sekissov - - fixes for CMUCL implementation - -* Pierre Thierry - - added license information - -* Stelian Ionescu - - finished conversion from generic functions - - enabled running thread-safe code in unthreaded lisps - -* Douglas Crosher - - added Scieneer Common Lisp support - -* Frank James - - UDP fixes and test cases - -* Mark H. David - - UDP test cases - - Suggestions on fixing GET-HOST-BY-NAME and HOST-TO-HBO - -* Elliott Slaughter - - Advanced WAIT-FOR-INPUT test case - -* Anton Vodonosov - - CLISP fixes - -* Terje Norderhaug - - MCL vendor code - -* @Hamayama - - - Reporting/hints/testing of issue #50 (regression in 0.8.0, 0.8.1) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/LICENSE b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/LICENSE deleted file mode 100644 index 1b94618..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -(This is the MIT / X Consortium license as taken from - http://www.opensource.org/licenses/mit-license.html) - -Copyright (c) 2003 Erik Enge -Copyright (c) 2006-2007 Erik Huelsmann -Copyright (c) 2008-2019 Hans Hueber and Chun Tian - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/README.md b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/README.md deleted file mode 100644 index b121c4a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/README.md +++ /dev/null @@ -1,148 +0,0 @@ -## USOCKET - Universal socket library for Common Lisp - -https://common-lisp.net/project/usocket/ - -This is the usocket Common Lisp sockets library: a library to bring -sockets access to the broadest of common lisp implementations as possible. - -## The library currently supports: - -1. Allegro CL -2. ABCL (ArmedBear) -3. Clasp -4. Clozure CL -5. Corman Lisp -6. GNU CLISP -7. CMUCL -8. ECL -9. LispWorks (4.3 and up) -10. Digitool MCL and RMCL (5.0 and up) -11. Mezzano -12. MOCL -13. SBCL -14. Scieneer CL -15. Symbolics Lisp Machine (Genera) - -If your favorite common lisp misses in the list above, please contact -usocket-devel@common-lisp.net and submit a request. Please include -references to available sockets functions in your lisp implementation. - -The library has been ASDF (http://cliki.net/ASDF) enabled, meaning -that you can tar up a checkout and use that to ASDF-INSTALL:INSTALL -the package in your system package site. (Or use your usual ASDF -tricks to use the checkout directly.) - -## Remarks on licensing - -Even though the source code has an MIT style license attached to it, -when compiling this code with some of the supported lisp implementations -you may not end up with an MIT style binary version due to the licensing -of the implementations themselves. ECL is such an example and - when -it will become supported - GCL is like that too. - -## Non-support of :external-format - -Because of its definition in the hyperspec, there's no common -external-format between lisp implementations: every vendor has chosen -a different way to solve the problem of newline translation or -character set recoding. - -Because there's no way to avoid platform specific code in the application -when using external-format, the purpose of a portability layer gets -defeated. So, for now, usocket doesn't support external-format. - -The workaround to get reasonably portable external-format support is to -layer a flexi-stream (from flexi-streams) on top of a usocket stream. - -## API definition - - - usocket (class) - - stream-usocket (class; usocket derivative) - - stream-server-usocket (class; usocket derivative) - - socket-connect (function) [ to create an active/connected socket ] - socket-connect host port &key element-type - where `host' is a vectorized ip - or a string representation of a dotted ip address - or a hostname for lookup in the DNS system - - socket-listen (function) [ to create a passive/listening socket ] - socket-listen host port &key reuseaddress backlog element-type - where `host' has the same definition as above - - socket-accept (method) [ to create an active/connected socket ] - socket-accept socket &key element-type - returns (server side) a connected socket derived from a - listening/passive socket. - - socket-close (method) - socket-close socket - where socket a previously returned socket - - socket (usocket slot accessor), - the internal/implementation defined socket representation - - socket-stream (usocket slot accessor), - socket-stream socket - the return value of which satisfies the normal stream interface - - socket-shutdown - -### Errors: - - address-in-use-error - - address-not-available-error - - bad-file-descriptor-error - - connection-refused-error - - connection-aborted-error - - connection-reset-error - - invalid-argument-error - - no-buffers-error - - operation-not-supported-error - - operation-not-permitted-error - - protocol-not-supported-error - - socket-type-not-supported-error - - network-unreachable-error - - network-down-error - - network-reset-error - - host-down-error - - host-unreachable-error - - shutdown-error - - timeout-error - - unkown-error - -### Non-fatal conditions: - - interrupted-condition - - unkown-condition - -(for a description of the API methods and functions see - https://common-lisp.net/project/usocket/api-docs.shtml) - -## Test suite - -The test suite unfortunately isn't mature enough yet to run without -some manual configuration. Several elements are required which are -hard to programatically detect. Please adjust the test file before -running the tests, for these variables: - -- +non-existing-host+: The stringified IP address of a host on the - same subnet. No physical host may be present. -- +unused-local-port+: A port number of a port not in use on the - machine the tests run on. -- +common-lisp-net+: A vector with 4 integer elements which make up - an IP address. This must be the IP "common-lisp.net" resolves to. - -## Known problems - -- CMUCL error reporting wrt sockets raises only simple-errors - meaning there's no way to tell different error conditions apart. - All errors are mapped to unknown-error on CMUCL. - -- The ArmedBear backend doesn't do any error mapping (yet). Java - defines exceptions at the wrong level (IMO), since the exception - reported bares a relation to the function failing, not the actual - error that occurred: for example 'Address already in use' (when - creating a passive socket) is reported as a BindException with - an error text of 'Address already in use'. There's no way to sanely - map 'BindException' to a meaningfull error in usocket. [This does not - mean the backend should not at least map to 'unknown-error'!] - -- When using the library with ECL, you need the C compiler installed - to be able to compile and load the Foreign Function Interface. - Not all ECL targets support DFFI yet, so on some targets this would - be the case anyway. By depending on this technique, usocket can - reuse the FFI code on all platforms (including Windows). This benefit - currently outweighs the additional requirement. (hey, it's *Embeddable* - Common Lisp, so, you probably wanted to embed it all along, right?) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/TODO b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/TODO deleted file mode 100644 index e631798..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/TODO +++ /dev/null @@ -1,5 +0,0 @@ -- Fix condition systems (making all implementation generate same error) -- Add INET6 support. -- IOlib backend - -For more TODO items, see http://trac.common-lisp.net/usocket/report. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/.gitignore b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/.gitignore deleted file mode 100644 index b25c15b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*~ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/abcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/abcl.lisp deleted file mode 100644 index d73c552..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/abcl.lisp +++ /dev/null @@ -1,436 +0,0 @@ -;;;; New ABCL networking support (replacement to old armedbear.lisp) -;;;; Author: Chun Tian (binghe) - -;;;; See LICENSE for licensing information. - -(in-package :usocket) - -;;; Java Classes ($*...) -(defvar $*boolean (jclass "boolean")) -(defvar $*byte (jclass "byte")) -(defvar $*byte[] (jclass "[B")) -(defvar $*int (jclass "int")) -(defvar $*long (jclass "long")) -(defvar $*|Byte| (jclass "java.lang.Byte")) -(defvar $*DatagramChannel (jclass "java.nio.channels.DatagramChannel")) -(defvar $*DatagramPacket (jclass "java.net.DatagramPacket")) -(defvar $*DatagramSocket (jclass "java.net.DatagramSocket")) -(defvar $*Inet4Address (jclass "java.net.Inet4Address")) -(defvar $*InetAddress (jclass "java.net.InetAddress")) -(defvar $*InetSocketAddress (jclass "java.net.InetSocketAddress")) -(defvar $*Iterator (jclass "java.util.Iterator")) -(defvar $*SelectableChannel (jclass "java.nio.channels.SelectableChannel")) -(defvar $*SelectionKey (jclass "java.nio.channels.SelectionKey")) -(defvar $*Selector (jclass "java.nio.channels.Selector")) -(defvar $*ServerSocket (jclass "java.net.ServerSocket")) -(defvar $*ServerSocketChannel (jclass "java.nio.channels.ServerSocketChannel")) -(defvar $*Set (jclass "java.util.Set")) -(defvar $*Socket (jclass "java.net.Socket")) -(defvar $*SocketAddress (jclass "java.net.SocketAddress")) -(defvar $*SocketChannel (jclass "java.nio.channels.SocketChannel")) -(defvar $*String (jclass "java.lang.String")) - -;;; Java Constructor ($%.../n) -(defvar $%Byte/0 (jconstructor $*|Byte| $*byte)) -(defvar $%DatagramPacket/3 (jconstructor $*DatagramPacket $*byte[] $*int $*int)) -(defvar $%DatagramPacket/5 (jconstructor $*DatagramPacket $*byte[] $*int $*int $*InetAddress $*int)) -(defvar $%DatagramSocket/0 (jconstructor $*DatagramSocket)) -(defvar $%DatagramSocket/1 (jconstructor $*DatagramSocket $*int)) -(defvar $%DatagramSocket/2 (jconstructor $*DatagramSocket $*int $*InetAddress)) -(defvar $%InetSocketAddress/1 (jconstructor $*InetSocketAddress $*int)) -(defvar $%InetSocketAddress/2 (jconstructor $*InetSocketAddress $*InetAddress $*int)) -(defvar $%ServerSocket/0 (jconstructor $*ServerSocket)) -(defvar $%ServerSocket/1 (jconstructor $*ServerSocket $*int)) -(defvar $%ServerSocket/2 (jconstructor $*ServerSocket $*int $*int)) -(defvar $%ServerSocket/3 (jconstructor $*ServerSocket $*int $*int $*InetAddress)) -(defvar $%Socket/0 (jconstructor $*Socket)) -(defvar $%Socket/2 (jconstructor $*Socket $*InetAddress $*int)) -(defvar $%Socket/4 (jconstructor $*Socket $*InetAddress $*int $*InetAddress $*int)) - -;;; Java Methods ($@...[/Class]/n) -(defvar $@accept/0 (jmethod $*ServerSocket "accept")) -(defvar $@bind/DatagramSocket/1 (jmethod $*DatagramSocket "bind" $*SocketAddress)) -(defvar $@bind/ServerSocket/1 (jmethod $*ServerSocket "bind" $*SocketAddress)) -(defvar $@bind/ServerSocket/2 (jmethod $*ServerSocket "bind" $*SocketAddress $*int)) -(defvar $@bind/Socket/1 (jmethod $*Socket "bind" $*SocketAddress)) -(defvar $@byteValue/0 (jmethod $*|Byte| "byteValue")) -(defvar $@channel/0 (jmethod $*SelectionKey "channel")) -(defvar $@close/DatagramSocket/0 (jmethod $*DatagramSocket "close")) -(defvar $@close/Selector/0 (jmethod $*Selector "close")) -(defvar $@close/ServerSocket/0 (jmethod $*ServerSocket "close")) -(defvar $@close/Socket/0 (jmethod $*Socket "close")) -(defvar $@shutdownInput/Socket/0 (jmethod $*Socket "shutdownInput")) -(defvar $@shutdownOutput/Socket/0 (jmethod $*Socket "shutdownOutput")) -(defvar $@configureBlocking/1 (jmethod $*SelectableChannel "configureBlocking" $*boolean)) -(defvar $@connect/DatagramChannel/1 (jmethod $*DatagramChannel "connect" $*SocketAddress)) -(defvar $@connect/Socket/1 (jmethod $*Socket "connect" $*SocketAddress)) -(defvar $@connect/Socket/2 (jmethod $*Socket "connect" $*SocketAddress $*int)) -(defvar $@connect/SocketChannel/1 (jmethod $*SocketChannel "connect" $*SocketAddress)) -(defvar $@getAddress/0 (jmethod $*InetAddress "getAddress")) -(defvar $@getAllByName/1 (jmethod $*InetAddress "getAllByName" $*String)) -(defvar $@getByName/1 (jmethod $*InetAddress "getByName" $*String)) -(defvar $@getChannel/DatagramSocket/0 (jmethod $*DatagramSocket "getChannel")) -(defvar $@getChannel/ServerSocket/0 (jmethod $*ServerSocket "getChannel")) -(defvar $@getChannel/Socket/0 (jmethod $*Socket "getChannel")) -(defvar $@getAddress/DatagramPacket/0 (jmethod $*DatagramPacket "getAddress")) -(defvar $@getHostName/0 (jmethod $*InetAddress "getHostName")) -(defvar $@getInetAddress/DatagramSocket/0 (jmethod $*DatagramSocket "getInetAddress")) -(defvar $@getInetAddress/ServerSocket/0 (jmethod $*ServerSocket "getInetAddress")) -(defvar $@getInetAddress/Socket/0 (jmethod $*Socket "getInetAddress")) -(defvar $@getLength/DatagramPacket/0 (jmethod $*DatagramPacket "getLength")) -(defvar $@getLocalAddress/DatagramSocket/0 (jmethod $*DatagramSocket "getLocalAddress")) -(defvar $@getLocalAddress/Socket/0 (jmethod $*Socket "getLocalAddress")) -(defvar $@getLocalPort/DatagramSocket/0 (jmethod $*DatagramSocket "getLocalPort")) -(defvar $@getLocalPort/ServerSocket/0 (jmethod $*ServerSocket "getLocalPort")) -(defvar $@getLocalPort/Socket/0 (jmethod $*Socket "getLocalPort")) -(defvar $@getOffset/DatagramPacket/0 (jmethod $*DatagramPacket "getOffset")) -(defvar $@getPort/DatagramPacket/0 (jmethod $*DatagramPacket "getPort")) -(defvar $@getPort/DatagramSocket/0 (jmethod $*DatagramSocket "getPort")) -(defvar $@getPort/Socket/0 (jmethod $*Socket "getPort")) -(defvar $@hasNext/0 (jmethod $*Iterator "hasNext")) -(defvar $@iterator/0 (jmethod $*Set "iterator")) -(defvar $@next/0 (jmethod $*Iterator "next")) -(defvar $@open/DatagramChannel/0 (jmethod $*DatagramChannel "open")) -(defvar $@open/Selector/0 (jmethod $*Selector "open")) -(defvar $@open/ServerSocketChannel/0 (jmethod $*ServerSocketChannel "open")) -(defvar $@open/SocketChannel/0 (jmethod $*SocketChannel "open")) -(defvar $@receive/1 (jmethod $*DatagramSocket "receive" $*DatagramPacket)) -(defvar $@register/2 (jmethod $*SelectableChannel "register" $*Selector $*int)) -(defvar $@select/0 (jmethod $*Selector "select")) -(defvar $@select/1 (jmethod $*Selector "select" $*long)) -(defvar $@selectedKeys/0 (jmethod $*Selector "selectedKeys")) -(defvar $@send/1 (jmethod $*DatagramSocket "send" $*DatagramPacket)) -(defvar $@setReuseAddress/1 (jmethod $*ServerSocket "setReuseAddress" $*boolean)) -(defvar $@setSoTimeout/DatagramSocket/1 (jmethod $*DatagramSocket "setSoTimeout" $*int)) -(defvar $@setSoTimeout/Socket/1 (jmethod $*Socket "setSoTimeout" $*int)) -(defvar $@setTcpNoDelay/1 (jmethod $*Socket "setTcpNoDelay" $*boolean)) -(defvar $@socket/DatagramChannel/0 (jmethod $*DatagramChannel "socket")) -(defvar $@socket/ServerSocketChannel/0 (jmethod $*ServerSocketChannel "socket")) -(defvar $@socket/SocketChannel/0 (jmethod $*SocketChannel "socket")) -(defvar $@validOps/0 (jmethod $*SelectableChannel "validOps")) - -;;; Java Field Variables ($+...) -(defvar $+op-accept (jfield $*SelectionKey "OP_ACCEPT")) -(defvar $+op-connect (jfield $*SelectionKey "OP_CONNECT")) -(defvar $+op-read (jfield $*SelectionKey "OP_READ")) -(defvar $+op-write (jfield $*SelectionKey "OP_WRITE")) - - -;;; Wrapper functions (return-type: java-object) -(defun %get-address (address) - (jcall $@getAddress/0 address)) -(defun %get-all-by-name (string) ; return a simple vector - (jstatic $@getAllByName/1 $*InetAddress string)) -(defun %get-by-name (string) - (jstatic $@getByName/1 $*InetAddress string)) - -(defun host-to-inet4 (host) - "USOCKET host formats to Java Inet4Address, used internally." - (%get-by-name (host-to-hostname host))) - -;;; HANDLE-CONTITION - -(defparameter +abcl-error-map+ - `(("java.net.BindException" . operation-not-permitted-error) - ("java.net.ConnectException" . connection-refused-error) - ("java.net.NoRouteToHostException" . network-unreachable-error) ; untested - ("java.net.PortUnreachableException" . protocol-not-supported-error) ; untested - ("java.net.ProtocolException" . protocol-not-supported-error) ; untested - ("java.net.SocketException" . socket-type-not-supported-error) ; untested - ("java.net.SocketTimeoutException" . timeout-error))) - -(defparameter +abcl-nameserver-error-map+ - `(("java.net.UnknownHostException" . ns-host-not-found-error))) - -(defun handle-condition (condition &optional (socket nil) (host-or-ip nil)) - (typecase condition - (java-exception - (let ((java-cause (java-exception-cause condition))) - (let* ((usock-error (cdr (assoc (jclass-of java-cause) +abcl-error-map+ - :test #'string=))) - (usock-error (if (functionp usock-error) - (funcall usock-error condition) - usock-error)) - (nameserver-error (cdr (assoc (jclass-of java-cause) +abcl-nameserver-error-map+ - :test #'string=)))) - (if nameserver-error - (error nameserver-error :socket socket :host-or-ip host-or-ip) - (when usock-error - (error usock-error :socket socket)))))))) - -;;; GET-HOSTS-BY-NAME - -(defun get-address (address) - (when address - (let* ((array (%get-address address)) - (length (jarray-length array))) - (labels ((jbyte (n) - (let ((byte (jarray-ref array n))) - (if (minusp byte) (+ 256 byte) byte)))) - (cond - ((= 4 length) - (vector (jbyte 0) (jbyte 1) (jbyte 2) (jbyte 3))) - ((= 16 length) - (vector (jbyte 0) (jbyte 1) (jbyte 2) (jbyte 3) - (jbyte 4) (jbyte 5) (jbyte 6) (jbyte 7) - (jbyte 8) (jbyte 9) (jbyte 10) (jbyte 11) - (jbyte 12) (jbyte 13) (jbyte 14) (jbyte 15))) - (t nil)))))) ; neither a IPv4 nor IPv6 address?! - -(defun get-hosts-by-name (name) - (with-mapped-conditions (nil name) - (map 'list #'get-address (%get-all-by-name name)))) - -;;; GET-HOST-BY-ADDRESS - -(defun get-host-by-address (host) - (let ((inet4 (host-to-inet4 host))) - (with-mapped-conditions (nil host) - (jcall $@getHostName/0 inet4)))) - -;;; SOCKET-CONNECT - -(defun socket-connect (host port &key (protocol :stream) (element-type 'character) - timeout deadline (nodelay t nodelay-supplied-p) - local-host local-port) - (when deadline (unsupported 'deadline 'socket-connect)) - (let (socket stream usocket) - (ecase protocol - (:stream ; TCP - (let ((channel (jstatic $@open/SocketChannel/0 $*SocketChannel)) - (address (jnew $%InetSocketAddress/2 (host-to-inet4 host) port))) - (setq socket (jcall $@socket/SocketChannel/0 channel)) - ;; bind to local address if needed - (when (or local-host local-port) - (let ((local-address (jnew $%InetSocketAddress/2 (host-to-inet4 local-host) (or local-port 0)))) - (with-mapped-conditions (nil host) - (jcall $@bind/Socket/1 socket local-address)))) - ;; connect to dest address - (with-mapped-conditions (nil host) - (jcall $@connect/SocketChannel/1 channel address)) - (setq stream (ext:get-socket-stream socket :element-type element-type) - usocket (make-stream-socket :stream stream :socket socket)) - (when nodelay-supplied-p - (jcall $@setTcpNoDelay/1 socket (if nodelay ;; both t and :if-supported mean java:+true+ - java:+true+ java:+false+))) - (when timeout - (jcall $@setSoTimeout/Socket/1 socket (truncate (* 1000 timeout)))))) - (:datagram ; UDP - (let ((channel (jstatic $@open/DatagramChannel/0 $*DatagramChannel))) - (setq socket (jcall $@socket/DatagramChannel/0 channel)) - ;; bind to local address if needed - (when (or local-host local-port) - (let ((local-address (jnew $%InetSocketAddress/2 (host-to-inet4 local-host) (or local-port 0)))) - (with-mapped-conditions (nil local-host) - (jcall $@bind/DatagramSocket/1 socket local-address)))) - ;; connect to dest address if needed - (when (and host port) - (let ((address (jnew $%InetSocketAddress/2 (host-to-inet4 host) port))) - (with-mapped-conditions (nil host) - (jcall $@connect/DatagramChannel/1 channel address)))) - (setq usocket (make-datagram-socket socket :connected-p (if (and host port) t nil))) - (when timeout - (jcall $@setSoTimeout/DatagramSocket/1 socket (truncate (* 1000 timeout))))))) - usocket)) - -;;; SOCKET-LISTEN - -(defun socket-listen (host port &key reuseaddress - (reuse-address nil reuse-address-supplied-p) - (backlog 5 backlog-supplied-p) - (element-type 'character)) - (declare (type boolean reuse-address)) - (let* ((reuseaddress (if reuse-address-supplied-p reuse-address reuseaddress)) - (channel (jstatic $@open/ServerSocketChannel/0 $*ServerSocketChannel)) - (socket (jcall $@socket/ServerSocketChannel/0 channel)) - (endpoint (jnew $%InetSocketAddress/2 (host-to-inet4 host) (or port 0)))) - (jcall $@setReuseAddress/1 socket (if reuseaddress java:+true+ java:+false+)) - (with-mapped-conditions (socket host) - (if backlog-supplied-p - (jcall $@bind/ServerSocket/2 socket endpoint backlog) - (jcall $@bind/ServerSocket/1 socket endpoint))) - (make-stream-server-socket socket :element-type element-type))) - -;;; SOCKET-ACCEPT - -(defmethod socket-accept ((usocket stream-server-usocket) - &key (element-type 'character element-type-p)) - (with-mapped-conditions (usocket) - (let* ((client-socket (jcall $@accept/0 (socket usocket))) - (element-type (if element-type-p - element-type - (element-type usocket))) - (stream (ext:get-socket-stream client-socket :element-type element-type))) - (make-stream-socket :stream stream :socket client-socket)))) - -;;; SOCKET-CLOSE - -(defmethod socket-close ((usocket stream-server-usocket)) - (with-mapped-conditions (usocket) - (jcall $@close/ServerSocket/0 (socket usocket)))) - -(defmethod socket-close ((usocket stream-usocket)) - (with-mapped-conditions (usocket) - (close (socket-stream usocket)) - (jcall $@close/Socket/0 (socket usocket)))) - -(defmethod socket-close ((usocket datagram-usocket)) - (with-mapped-conditions (usocket) - (jcall $@close/DatagramSocket/0 (socket usocket)))) - -(defmethod socket-shutdown ((usocket stream-usocket) direction) - (with-mapped-conditions (usocket) - (ecase direction - (:input - (jcall $@shutdownInput/Socket/0 (socket usocket))) - (:output - (jcall $@shutdownOutput/Socket/0 (socket usocket)))))) - -;;; GET-LOCAL/PEER-NAME/ADDRESS/PORT - -(defmethod get-local-name ((usocket usocket)) - (values (get-local-address usocket) - (get-local-port usocket))) - -(defmethod get-peer-name ((usocket usocket)) - (values (get-peer-address usocket) - (get-peer-port usocket))) - -(defmethod get-local-address ((usocket stream-usocket)) - (get-address (jcall $@getLocalAddress/Socket/0 (socket usocket)))) - -(defmethod get-local-address ((usocket stream-server-usocket)) - (get-address (jcall $@getInetAddress/ServerSocket/0 (socket usocket)))) - -(defmethod get-local-address ((usocket datagram-usocket)) - (get-address (jcall $@getLocalAddress/DatagramSocket/0 (socket usocket)))) - -(defmethod get-peer-address ((usocket stream-usocket)) - (get-address (jcall $@getInetAddress/Socket/0 (socket usocket)))) - -(defmethod get-peer-address ((usocket datagram-usocket)) - (get-address (jcall $@getInetAddress/DatagramSocket/0 (socket usocket)))) - -(defmethod get-local-port ((usocket stream-usocket)) - (jcall $@getLocalPort/Socket/0 (socket usocket))) - -(defmethod get-local-port ((usocket stream-server-usocket)) - (jcall $@getLocalPort/ServerSocket/0 (socket usocket))) - -(defmethod get-local-port ((usocket datagram-usocket)) - (jcall $@getLocalPort/DatagramSocket/0 (socket usocket))) - -(defmethod get-peer-port ((usocket stream-usocket)) - (jcall $@getPort/Socket/0 (socket usocket))) - -(defmethod get-peer-port ((usocket datagram-usocket)) - (jcall $@getPort/DatagramSocket/0 (socket usocket))) - -;;; SOCKET-SEND & SOCKET-RECEIVE - -(defun *->byte (data) - (declare (type (unsigned-byte 8) data)) ; required by SOCKET-SEND - (jnew $%Byte/0 (if (> data 127) (- data 256) data))) - -(defun byte->* (byte &optional (element-type '(unsigned-byte 8))) - (let* ((ub8 (if (minusp byte) (+ 256 byte) byte))) - (if (eq element-type 'character) - (code-char ub8) - ub8))) - -(defmethod socket-send ((usocket datagram-usocket) buffer size &key host port (offset 0)) - (let* ((socket (socket usocket)) - (byte-array (jnew-array $*byte size)) - (packet (if (and host port) - (jnew $%DatagramPacket/5 byte-array 0 size (host-to-inet4 host) port) - (jnew $%DatagramPacket/3 byte-array 0 size)))) - ;; prepare sending data - (loop for i from offset below (+ size offset) - do (setf (jarray-ref byte-array i) (*->byte (aref buffer i)))) - (with-mapped-conditions (usocket host) - (jcall $@send/1 socket packet)))) - -;;; TODO: return-host and return-port cannot be get ... -(defmethod socket-receive ((usocket datagram-usocket) buffer length - &key (element-type '(unsigned-byte 8))) - (declare (values (simple-array (unsigned-byte 8) (*)) ; buffer - (integer 0) ; size - (unsigned-byte 32) ; host - (unsigned-byte 16))) ; port - (let* ((socket (socket usocket)) - (real-length (or length +max-datagram-packet-size+)) - (byte-array (jnew-array $*byte real-length)) - (packet (jnew $%DatagramPacket/3 byte-array 0 real-length))) - (with-mapped-conditions (usocket) - (jcall $@receive/1 socket packet)) - (let* ((receive-length (jcall $@getLength/DatagramPacket/0 packet)) - (return-buffer (or buffer (make-array receive-length :element-type element-type)))) - (loop for i from 0 below receive-length - do (setf (aref return-buffer i) - (byte->* (jarray-ref byte-array i) element-type))) - (let ((return-host (if (connected-p usocket) - (get-peer-address usocket) - (get-address (jcall $@getAddress/DatagramPacket/0 packet)))) - (return-port (if (connected-p usocket) - (get-peer-port usocket) - (jcall $@getPort/DatagramPacket/0 packet)))) - (values return-buffer - receive-length - return-host - return-port))))) - -;;; WAIT-FOR-INPUT - -(defun socket-channel-class (usocket) - (cond ((stream-usocket-p usocket) $*SocketChannel) - ((stream-server-usocket-p usocket) $*ServerSocketChannel) - ((datagram-usocket-p usocket) $*DatagramChannel))) - -(defun get-socket-channel (usocket) - (let ((method (cond ((stream-usocket-p usocket) $@getChannel/Socket/0) - ((stream-server-usocket-p usocket) $@getChannel/ServerSocket/0) - ((datagram-usocket-p usocket) $@getChannel/DatagramSocket/0)))) - (jcall method (socket usocket)))) - -(defun wait-for-input-internal (wait-list &key timeout) - (let* ((sockets (wait-list-waiters wait-list)) - (ops (logior $+op-read $+op-accept)) - (selector (jstatic $@open/Selector/0 $*Selector)) - (channels (mapcar #'get-socket-channel sockets))) - (unwind-protect - (with-mapped-conditions () - (dolist (channel channels) - (jcall $@configureBlocking/1 channel java:+false+) - (jcall $@register/2 channel selector (logand ops (jcall $@validOps/0 channel)))) - (let ((ready-count (if timeout - (jcall $@select/1 selector (truncate (* timeout 1000))) - (jcall $@select/0 selector)))) - (when (plusp ready-count) - (let* ((keys (jcall $@selectedKeys/0 selector)) - (iterator (jcall $@iterator/0 keys)) - (%wait (wait-list-%wait wait-list))) - (loop while (jcall $@hasNext/0 iterator) - do (let* ((key (jcall $@next/0 iterator)) - (channel (jcall $@channel/0 key))) - (setf (state (gethash channel %wait)) :read))))))) - (jcall $@close/Selector/0 selector) - (dolist (channel channels) - (jcall $@configureBlocking/1 channel java:+true+))))) - -;;; WAIT-LIST - -;;; NOTE from original worker (Erik): -;;; Note that even though Java has the concept of the Selector class, which -;;; remotely looks like a wait-list, it requires the sockets to be non-blocking. -;;; usocket however doesn't make any such guarantees and is therefore unable to -;;; use the concept outside of the waiting routine itself (blergh!). - -(defun %setup-wait-list (wl) - (setf (wait-list-%wait wl) - (make-hash-table :test #'equal :rehash-size 1.3d0))) - -(defun %add-waiter (wl w) - (setf (gethash (get-socket-channel w) (wait-list-%wait wl)) w)) - -(defun %remove-waiter (wl w) - (remhash (get-socket-channel w) (wait-list-%wait wl))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/allegro.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/allegro.lisp deleted file mode 100644 index 4af38af..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/allegro.lisp +++ /dev/null @@ -1,228 +0,0 @@ -;;;; See LICENSE for licensing information. - -(in-package :usocket) - -#+cormanlisp -(eval-when (:compile-toplevel :load-toplevel :execute) - (require :acl-socket)) - -#+allegro -(eval-when (:compile-toplevel :load-toplevel :execute) - (require :sock) - ;; for wait-for-input: - (require :process) - ;; note: the line below requires ACL 6.2+ - (require :osi)) - -(defun get-host-name () - ;; note: the line below requires ACL 7.0+ to actually *work* on windows - #+allegro (excl.osi:gethostname) - #+cormanlisp "") - -(defparameter +allegro-identifier-error-map+ - '((:address-in-use . address-in-use-error) - (:address-not-available . address-not-available-error) - (:network-down . network-down-error) - (:network-reset . network-reset-error) - (:network-unreachable . network-unreachable-error) - (:connection-aborted . connection-aborted-error) - (:connection-reset . connection-reset-error) - (:no-buffer-space . no-buffers-error) - (:shutdown . shutdown-error) - (:connection-timed-out . timeout-error) - (:connection-refused . connection-refused-error) - (:host-down . host-down-error) - (:host-unreachable . host-unreachable-error))) - -;; TODO: what's the error class of Corman Lisp? -(defun handle-condition (condition &optional (socket nil) (host-or-ip nil)) - "Dispatch correct usocket condition." - (typecase condition - #+allegro - (excl:socket-error - (let ((usock-error - (cdr (assoc (excl:stream-error-identifier condition) - +allegro-identifier-error-map+)))) - (declare (type symbol usock-error)) - (if usock-error - (cond ((subtypep usock-error 'ns-error) - (error usock-error :socket socket :host-or-ip host-or-ip)) - (t - (error usock-error :socket socket))) - (error 'unknown-error - :real-error condition - :socket socket)))))) - -(defun to-format (element-type) - (if (subtypep element-type 'character) - :text - :binary)) - -(defun socket-connect (host port &key (protocol :stream) (element-type 'character) - timeout deadline - (nodelay t) ;; nodelay == t is the ACL default - local-host local-port) - (when timeout (unsupported 'timeout 'socket-connect)) - (when deadline (unsupported 'deadline 'socket-connect)) - (when (eq nodelay :if-supported) - (setf nodelay t)) - - (let ((socket)) - (setf socket - (with-mapped-conditions (socket (or host local-host)) - (ecase protocol - (:stream - (labels ((make-socket () - (socket:make-socket :remote-host (host-to-hostname host) - :remote-port port - :local-host (when local-host - (host-to-hostname local-host)) - :local-port local-port - :format (to-format element-type) - :nodelay nodelay))) - #+allegro - (if timeout - (mp:with-timeout (timeout nil) - (make-socket)) - (make-socket)) - #+cormanlisp (make-socket))) - (:datagram - (apply #'socket:make-socket - (nconc (list :type protocol - :address-family :internet - :local-host (when local-host - (host-to-hostname local-host)) - :local-port local-port - :format (to-format element-type)) - (if (and host port) - (list :connect :active - :remote-host (host-to-hostname host) - :remote-port port) - (list :connect :passive)))))))) - (ecase protocol - (:stream - (make-stream-socket :socket socket :stream socket)) - (:datagram - (make-datagram-socket socket :connected-p (and host port t)))))) - -;; One socket close method is sufficient, -;; because socket-streams are also sockets. -(defmethod socket-close ((usocket usocket)) - "Close socket." - (with-mapped-conditions (usocket) - (close (socket usocket)))) - -(defmethod socket-shutdown ((usocket stream-usocket) direction) - (with-mapped-conditions (usocket) - (socket:shutdown (socket usocket) :direction direction))) - -(defun socket-listen (host port - &key reuseaddress - (reuse-address nil reuse-address-supplied-p) - (backlog 5) - (element-type 'character)) - ;; Allegro and OpenMCL socket interfaces bear very strong resemblence - ;; whatever you change here, change it also for OpenMCL - (let* ((reuseaddress (if reuse-address-supplied-p reuse-address reuseaddress)) - (sock (with-mapped-conditions (nil host) - (apply #'socket:make-socket - (append (list :connect :passive - :reuse-address reuseaddress - :local-port port - :backlog backlog - :format (to-format element-type) - ;; allegro now ignores :format - ) - (when (ip/= host *wildcard-host*) - (list :local-host host))))))) - (make-stream-server-socket sock :element-type element-type))) - -(defmethod socket-accept ((socket stream-server-usocket) &key element-type) - (declare (ignore element-type)) ;; allegro streams are multivalent - (let ((stream-sock - (with-mapped-conditions (socket) - (socket:accept-connection (socket socket))))) - (make-stream-socket :socket stream-sock :stream stream-sock))) - -(defmethod get-local-address ((usocket usocket)) - (hbo-to-vector-quad (socket:local-host (socket usocket)))) - -(defmethod get-peer-address ((usocket stream-usocket)) - (hbo-to-vector-quad (socket:remote-host (socket usocket)))) - -(defmethod get-local-port ((usocket usocket)) - (socket:local-port (socket usocket))) - -(defmethod get-peer-port ((usocket stream-usocket)) - #+allegro - (socket:remote-port (socket usocket))) - -(defmethod get-local-name ((usocket usocket)) - (values (get-local-address usocket) - (get-local-port usocket))) - -(defmethod get-peer-name ((usocket stream-usocket)) - (values (get-peer-address usocket) - (get-peer-port usocket))) - -#+allegro -(defmethod socket-send ((usocket datagram-usocket) buffer size &key host port (offset 0)) - (with-mapped-conditions (usocket host) - (let ((s (socket usocket))) - (socket:send-to s - (if (zerop offset) - buffer - (subseq buffer offset (+ offset size))) - size - :remote-host host - :remote-port port)))) - -#+allegro -(defmethod socket-receive ((usocket datagram-usocket) buffer length &key) - (declare (values (simple-array (unsigned-byte 8) (*)) ; buffer - (integer 0) ; size - (unsigned-byte 32) ; host - (unsigned-byte 16))) ; port - (with-mapped-conditions (usocket) - (let ((s (socket usocket))) - (socket:receive-from s length :buffer buffer :extract t)))) - -(defun get-host-by-address (address) - (with-mapped-conditions (nil address) - (socket:ipaddr-to-hostname (host-to-hbo address)))) - -(defun get-hosts-by-name (name) - ;;###FIXME: ACL has the acldns module which returns all A records - ;; only problem: it doesn't fall back to tcp (from udp) if the returned - ;; structure is too long. - (with-mapped-conditions (nil name) - (list (hbo-to-vector-quad (socket:lookup-hostname - (host-to-hostname name)))))) - -(defun %setup-wait-list (wait-list) - (declare (ignore wait-list))) - -(defun %add-waiter (wait-list waiter) - (push (socket waiter) (wait-list-%wait wait-list))) - -(defun %remove-waiter (wait-list waiter) - (setf (wait-list-%wait wait-list) - (remove (socket waiter) (wait-list-%wait wait-list)))) - -#+allegro -(defun wait-for-input-internal (wait-list &key timeout) - (with-mapped-conditions () - (let ((active-internal-sockets - (if timeout - (mp:wait-for-input-available (wait-list-%wait wait-list) - :timeout timeout) - (mp:wait-for-input-available (wait-list-%wait wait-list))))) - ;; this is quadratic, but hey, the active-internal-sockets - ;; list is very short and it's only quadratic in the length of that one. - ;; When I have more time I could recode it to something of linear - ;; complexity. - ;; [Same code is also used in openmcl.lisp] - (dolist (x active-internal-sockets) - (setf (state (gethash x (wait-list-map wait-list))) - :read)) - wait-list))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/clasp.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/clasp.lisp deleted file mode 100644 index 6a41eb0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/clasp.lisp +++ /dev/null @@ -1,158 +0,0 @@ -(in-package :usocket) - -#-clasp -(progn - #-:wsock - (ffi:clines - "#include " - "#include " - "#include ") - #+:wsock - (ffi:clines - "#ifndef FD_SETSIZE" - "#define FD_SETSIZE 1024" - "#endif" - "#include ") - (ffi:clines - #+:msvc "#include " - #-:msvc "#include " - "#include ")) -(progn - #-clasp - (defun cerrno () - (ffi:c-inline () () :int - "errno" :one-liner t)) - #+clasp - (defun cerrno () - (sockets-internal:errno)) - - #-clasp - (defun fd-setsize () - (ffi:c-inline () () :fixnum - "FD_SETSIZE" :one-liner t)) - #+clasp - (defun fd-setsize () (sockets-internal:fd-setsize)) - - #-clasp - (defun fdset-alloc () - (ffi:c-inline () () :pointer-void - "ecl_alloc_atomic(sizeof(fd_set))" :one-liner t)) - #+clasp (defun fdset-alloc () (sockets-internal::alloc-atomic-sizeof-fd-set)) - - #-clasp - (defun fdset-zero (fdset) - (ffi:c-inline (fdset) (:pointer-void) :void - "FD_ZERO((fd_set*)#0)" :one-liner t)) - #+clasp(defun fdset-zero (fdset) (sockets-internal:fdset-zero fdset)) - - #-clasp - (defun fdset-set (fdset fd) - (ffi:c-inline (fdset fd) (:pointer-void :fixnum) :void - "FD_SET(#1,(fd_set*)#0)" :one-liner t)) - #+clasp(defun fdset-set (fdset fd) (sockets-internal:fdset-set fd fdset)) - - #-clasp - (defun fdset-clr (fdset fd) - (ffi:c-inline (fdset fd) (:pointer-void :fixnum) :void - "FD_CLR(#1,(fd_set*)#0)" :one-liner t)) - #+clasp(defun fdset-clr (fdset fd) (sockets-internal:fdset-clr fd fdset)) - - #-clasp - (defun fdset-fd-isset (fdset fd) - (ffi:c-inline (fdset fd) (:pointer-void :fixnum) :bool - "FD_ISSET(#1,(fd_set*)#0)" :one-liner t)) - #+clasp(defun fdset-fd-isset (fdset fd) (sockets-internal:fdset-isset fd fdset)) - - (declaim (inline cerrno - fd-setsize - fdset-alloc - fdset-zero - fdset-set - fdset-clr - fdset-fd-isset)) - #-clasp - (defun get-host-name () - (ffi:c-inline - () () :object - "{ char *buf = (char *) ecl_alloc_atomic(257); - - if (gethostname(buf,256) == 0) - @(return) = make_simple_base_string(buf); - else - @(return) = Cnil; - }" :one-liner nil :side-effects nil)) - - #+clasp - (defun get-host-name () - (sockets-internal:get-host-name)) - - #-clasp - (defun read-select (wl to-secs &optional (to-musecs 0)) - (let* ((sockets (wait-list-waiters wl)) - (rfds (wait-list-%wait wl)) - (max-fd (reduce #'(lambda (x y) - (let ((sy (sb-bsd-sockets:socket-file-descriptor - (socket y)))) - (if (< x sy) sy x))) - (cdr sockets) - :initial-value (sb-bsd-sockets:socket-file-descriptor - (socket (car sockets)))))) - (fdset-zero rfds) - (dolist (sock sockets) - (fdset-set rfds (sb-bsd-sockets:socket-file-descriptor - (socket sock)))) - (let ((count - (ffi:c-inline (to-secs to-musecs rfds max-fd) - (t :unsigned-int :pointer-void :int) - :int - " - int count; - struct timeval tv; - - if (#0 != Cnil) { - tv.tv_sec = fixnnint(#0); - tv.tv_usec = #1; - } - @(return) = select(#3 + 1, (fd_set*)#2, NULL, NULL, - (#0 != Cnil) ? &tv : NULL); -" :one-liner nil))) - (cond - ((= 0 count) - (values nil nil)) - ((< count 0) - ;; check for EINTR and EAGAIN; these should not err - (values nil (cerrno))) - (t - (dolist (sock sockets) - (when (fdset-fd-isset rfds (sb-bsd-sockets:socket-file-descriptor - (socket sock))) - (setf (state sock) :READ)))))))) - - #+clasp - (defun read-select (wl to-secs &optional (to-musecs 0)) - (let* ((sockets (wait-list-waiters wl)) - (rfds (wait-list-%wait wl)) - (max-fd (reduce #'(lambda (x y) - (let ((sy (sb-bsd-sockets:socket-file-descriptor - (socket y)))) - (if (< x sy) sy x))) - (cdr sockets) - :initial-value (sb-bsd-sockets:socket-file-descriptor - (socket (car sockets)))))) - (fdset-zero rfds) - (dolist (sock sockets) - (fdset-set rfds (sb-bsd-sockets:socket-file-descriptor - (socket sock)))) - (let ((count (sockets-internal:do-select to-secs to-musecs rfds max-fd))) - (cond - ((= 0 count) - (values nil nil)) - ((< count 0) - ;; check for EINTR and EAGAIN; these should not err - (values nil (cerrno))) - (t - (dolist (sock sockets) - (when (fdset-fd-isset rfds (sb-bsd-sockets:socket-file-descriptor - (socket sock))) - (setf (state sock) :READ)))))))) - ) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/clisp.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/clisp.lisp deleted file mode 100644 index 62970c9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/clisp.lisp +++ /dev/null @@ -1,715 +0,0 @@ -;;;; See LICENSE for licensing information. - -(in-package :usocket) - -(eval-when (:compile-toplevel :load-toplevel :execute) - #-ffi - (warn "This image doesn't contain FFI package, GET-HOST-NAME won't work.") - #-(or ffi rawsock) - (warn "This image doesn't contain either FFI or RAWSOCK package, no UDP support.")) - -;; utility routine for looking up the current host name -#+ffi -(ffi:def-call-out get-host-name-internal - (:name "gethostname") - (:arguments (name (FFI:C-PTR (FFI:C-ARRAY-MAX ffi:character 256)) - :OUT :ALLOCA) - (len ffi:int)) - #+win32 (:library "WS2_32") - #-win32 (:library :default) - (:language #-win32 :stdc - #+win32 :stdc-stdcall) - (:return-type ffi:int)) - -(defun get-host-name () - #+ffi - (multiple-value-bind (retcode name) - (get-host-name-internal 256) - (when (= retcode 0) - name)) - #-ffi - "localhost") - -(defun get-host-by-address (address) - (with-mapped-conditions (nil address) - (let ((hostent (posix:resolve-host-ipaddr (host-to-hostname address)))) - (posix:hostent-name hostent)))) - -(defun get-hosts-by-name (name) - (with-mapped-conditions (nil name) - (let ((hostent (posix:resolve-host-ipaddr name))) - (mapcar #'host-to-vector-quad - (posix:hostent-addr-list hostent))))) - -;; Format: ((UNIX Windows) . CONDITION) -(defparameter +clisp-error-map+ - #-win32 - `((:EADDRINUSE . address-in-use-error) - (:EADDRNOTAVAIL . address-not-available-error) - (:EBADF . bad-file-descriptor-error) - (:ECONNREFUSED . connection-refused-error) - (:ECONNRESET . connection-reset-error) - (:ECONNABORTED . connection-aborted-error) - (:EINVAL . invalid-argument-error) - (:ENOBUFS . no-buffers-error) - (:ENOMEM . out-of-memory-error) - (:ENOTSUP . operation-not-supported-error) - (:EPERM . operation-not-permitted-error) - (:EPROTONOSUPPORT . protocol-not-supported-error) - (:ESOCKTNOSUPPORT . socket-type-not-supported-error) - (:ENETUNREACH . network-unreachable-error) - (:ENETDOWN . network-down-error) - (:ENETRESET . network-reset-error) - (:ESHUTDOWN . already-shutdown-error) - (:ETIMEDOUT . timeout-error) - (:EHOSTDOWN . host-down-error) - (:EHOSTUNREACH . host-unreachable-error) - ;; when blocked reading, and we close our socket due to a timeout. - ;; POSIX.1 says that EAGAIN and EWOULDBLOCK may have the same values. - (:EAGAIN . timeout-error) - (:EWOULDBLOCK . timeout-error)) ;linux - #+win32 - `((:WSAEADDRINUSE . address-in-use-error) - (:WSAEADDRNOTAVAIL . address-not-available-error) - (:WSAEBADF . bad-file-descriptor-error) - (:WSAECONNREFUSED . connection-refused-error) - (:WSAECONNRESET . connection-reset-error) - (:WSAECONNABORTED . connection-aborted-error) - (:WSAEINVAL . invalid-argument-error) - (:WSAENOBUFS . no-buffers-error) - (:WSAENOMEM . out-of-memory-error) - (:WSAENOTSUP . operation-not-supported-error) - (:WSAEPERM . operation-not-permitted-error) - (:WSAEPROTONOSUPPORT . protocol-not-supported-error) - (:WSAESOCKTNOSUPPORT . socket-type-not-supported-error) - (:WSAENETUNREACH . network-unreachable-error) - (:WSAENETDOWN . network-down-error) - (:WSAENETRESET . network-reset-error) - (:WSAESHUTDOWN . already-shutdown-error) - (:WSAETIMEDOUT . timeout-error) - (:WSAEHOSTDOWN . host-down-error) - (:WSAEHOSTUNREACH . host-unreachable-error))) - -(defun parse-errno (condition) - "Returns a number or keyword if it can parse what is within parens, else NIL" - (let ((s (princ-to-string condition))) - (let ((pos1 (position #\( s)) - (pos2 (position #\) s))) - ;mac: number, linux: keyword - (ignore-errors - (if (digit-char-p (char s (1+ pos1))) - (parse-integer s :start (1+ pos1) :end pos2) - (let ((*package* (find-package "KEYWORD"))) - (car (read-from-string s t nil :start pos1 :end (1+ pos2))))))))) - -(defun handle-condition (condition &optional (socket nil) (host-or-ip nil)) - "Dispatch a usocket condition instead of a CLISP specific one, if we can." - (let ((errno - (cond - ;clisp 2.49+ - ((typep condition (find-symbol "OS-STREAM-ERROR" "EXT")) - (parse-errno condition)) - ;clisp 2.49 - ((typep condition (find-symbol "SIMPLE-STREAM-ERROR" "SYSTEM")) - (car (simple-condition-format-arguments condition)))))) - (when errno - (let ((error-keyword (if (keywordp errno) errno #+ffi(os:errno errno)))) - (let ((usock-error (cdr (assoc error-keyword +clisp-error-map+)))) - (when usock-error - (if (subtypep usock-error 'error) - (cond ((subtypep usock-error 'ns-error) - (error usock-error :socket socket :host-or-ip host-or-ip)) - (t - (error usock-error :socket socket))) - (cond ((subtypep usock-error 'ns-condition) - (signal usock-error :socket socket :host-or-ip host-or-ip)) - (t - (signal usock-error :socket socket)))))))))) - -(defun socket-connect (host port &key (protocol :stream) (element-type 'character) - timeout deadline (nodelay t nodelay-specified) - local-host local-port) - (declare (ignorable timeout local-host local-port)) - (when deadline (unsupported 'deadline 'socket-connect)) - (when (and nodelay-specified - (not (eq nodelay :if-supported))) - (unsupported 'nodelay 'socket-connect)) - (case protocol - (:stream - (let ((socket) - (hostname (host-to-hostname host))) - (with-mapped-conditions (socket host) - (setf socket - (if timeout - (socket:socket-connect port hostname - :element-type element-type - :buffered t - :timeout timeout) - (socket:socket-connect port hostname - :element-type element-type - :buffered t)))) - (make-stream-socket :socket socket - :stream socket))) ;; the socket is a stream too - (:datagram - #+(or rawsock ffi) - (with-mapped-conditions (nil (or host local-host)) - (socket-create-datagram (or local-port *auto-port*) - :local-host (or local-host *wildcard-host*) - :remote-host (and host (host-to-vector-quad host)) - :remote-port port)) - #-(or rawsock ffi) - (unsupported '(protocol :datagram) 'socket-connect)))) - -(defun socket-listen (host port - &key reuseaddress - (reuse-address nil reuse-address-supplied-p) - (backlog 5) - (element-type 'character)) - ;; clisp 2.39 sets SO_REUSEADDRESS to 1 by default; no need to - ;; to explicitly turn it on; unfortunately, there's no way to turn it off... - (declare (ignore reuseaddress reuse-address reuse-address-supplied-p)) - (let ((sock (apply #'socket:socket-server - (append (list port - :backlog backlog) - (when (ip/= host *wildcard-host*) - (list :interface host)))))) - (with-mapped-conditions (nil host) - (make-stream-server-socket sock :element-type element-type)))) - -(defmethod socket-accept ((socket stream-server-usocket) &key element-type) - (let ((stream - (with-mapped-conditions (socket) - (socket:socket-accept (socket socket) - :element-type (or element-type - (element-type socket)))))) - (make-stream-socket :socket stream - :stream stream))) - -;; Only one close method required: -;; sockets and their associated streams -;; are the same object -(defmethod socket-close ((usocket usocket)) - "Close socket." - (with-mapped-conditions (usocket) - (close (socket usocket)))) - -(defmethod socket-close ((usocket stream-server-usocket)) - (socket:socket-server-close (socket usocket))) - -(defmethod socket-shutdown ((usocket stream-usocket) direction) - (with-mapped-conditions (usocket) - (socket:socket-stream-shutdown (socket usocket) direction))) - -(defmethod get-local-name ((usocket stream-usocket)) - (multiple-value-bind - (address port) - (socket:socket-stream-local (socket usocket) t) - (values (dotted-quad-to-vector-quad address) port))) - -(defmethod get-local-name ((usocket stream-server-usocket)) - (values (get-local-address usocket) - (get-local-port usocket))) - -(defmethod get-peer-name ((usocket stream-usocket)) - (multiple-value-bind - (address port) - (socket:socket-stream-peer (socket usocket) t) - (values (dotted-quad-to-vector-quad address) port))) - -(defmethod get-local-address ((usocket usocket)) - (nth-value 0 (get-local-name usocket))) - -(defmethod get-local-address ((usocket stream-server-usocket)) - (dotted-quad-to-vector-quad - (socket:socket-server-host (socket usocket)))) - -(defmethod get-peer-address ((usocket usocket)) - (nth-value 0 (get-peer-name usocket))) - -(defmethod get-local-port ((usocket usocket)) - (nth-value 1 (get-local-name usocket))) - -(defmethod get-local-port ((usocket stream-server-usocket)) - (socket:socket-server-port (socket usocket))) - -(defmethod get-peer-port ((usocket usocket)) - (nth-value 1 (get-peer-name usocket))) - -(defun %setup-wait-list (wait-list) - (declare (ignore wait-list))) - -(defun %add-waiter (wait-list waiter) - ;; clisp's #'socket-status takes a list whose elts look either like, - ;; (socket-stream direction . x) or like, - ;; (socket-server . x) - ;; and it replaces the x's. - (push (cons (socket waiter) - (cond ((stream-usocket-p waiter) (cons NIL NIL)) - (t NIL))) - (wait-list-%wait wait-list))) - -(defun %remove-waiter (wait-list waiter) - (setf (wait-list-%wait wait-list) - (remove (socket waiter) (wait-list-%wait wait-list) :key #'car))) - -(defmethod wait-for-input-internal (wait-list &key timeout) - (with-mapped-conditions () - (multiple-value-bind - (secs musecs) - (split-timeout (or timeout 1)) - (dolist (x (wait-list-%wait wait-list)) - (when (consp (cdr x)) ;it's a socket-stream not socket-server - (setf (cadr x) :INPUT))) - (let* ((request-list (wait-list-%wait wait-list)) - (status-list (if timeout - (socket:socket-status request-list secs musecs) - (socket:socket-status request-list))) - (sockets (wait-list-waiters wait-list))) - (do* ((x (pop sockets) (pop sockets)) - (y (cdr (last (pop status-list))) (cdr (last (pop status-list))))) - ((null x)) - (when (member y '(T :INPUT :EOF)) - (setf (state x) :READ))) - wait-list)))) - -;;; -;;; UDP/Datagram sockets (RAWSOCK version) -;;; - -#+rawsock -(progn - (defun make-sockaddr_in () - (make-array 16 :element-type '(unsigned-byte 8) :initial-element 0)) - - (declaim (inline fill-sockaddr_in)) - (defun fill-sockaddr_in (sockaddr_in ip port) - (port-to-octet-buffer port sockaddr_in) - (ip-to-octet-buffer ip sockaddr_in :start 2) - sockaddr_in) - - (defun socket-create-datagram (local-port - &key (local-host *wildcard-host*) - remote-host - remote-port) - (let ((sock (rawsock:socket :inet :dgram 0)) - (lsock_addr (fill-sockaddr_in (make-sockaddr_in) - local-host local-port)) - (rsock_addr (when remote-host - (fill-sockaddr_in (make-sockaddr_in) - remote-host (or remote-port - local-port))))) - (rawsock:bind sock (rawsock:make-sockaddr :inet lsock_addr)) - (when rsock_addr - (rawsock:connect sock (rawsock:make-sockaddr :inet rsock_addr))) - (make-datagram-socket sock :connected-p (if rsock_addr t nil)))) - - (defmethod socket-receive ((socket datagram-usocket) buffer length &key) - "Returns the buffer, the number of octets copied into the buffer (received) -and the address of the sender as values." - (let* ((sock (socket socket)) - (sockaddr (rawsock:make-sockaddr :inet)) - (real-length (or length +max-datagram-packet-size+)) - (real-buffer (or buffer - (make-array real-length - :element-type '(unsigned-byte 8))))) - (let ((rv (rawsock:recvfrom sock real-buffer sockaddr - :start 0 :end real-length)) - (host 0) (port 0)) - (unless (connected-p socket) - (let ((data (rawsock:sockaddr-data sockaddr))) - (setq host (ip-from-octet-buffer data :start 4) - port (port-from-octet-buffer data :start 2)))) - (values (if buffer real-buffer (subseq real-buffer 0 rv)) - rv - host - port)))) - - (defmethod socket-send ((socket datagram-usocket) buffer size &key host port (offset 0)) - "Returns the number of octets sent." - (let* ((sock (socket socket)) - (sockaddr (when (and host port) - (rawsock:make-sockaddr :inet - (fill-sockaddr_in - (make-sockaddr_in) - (host-byte-order host) - port)))) - (real-size (min size +max-datagram-packet-size+)) - (real-buffer (if (typep buffer '(simple-array (unsigned-byte 8) (*))) - buffer - (make-array real-size - :element-type '(unsigned-byte 8) - :initial-contents (subseq buffer 0 real-size)))) - (rv (if (and host port) - (rawsock:sendto sock real-buffer sockaddr - :start offset - :end (+ offset real-size)) - (rawsock:send sock real-buffer - :start offset - :end (+ offset real-size))))) - rv)) - - (defmethod socket-close ((usocket datagram-usocket)) - (rawsock:sock-close (socket usocket))) - - (declaim (inline get-socket-name)) - (defun get-socket-name (socket function) - (let ((sockaddr (rawsock:make-sockaddr :inet (make-sockaddr_in)))) - (funcall function socket sockaddr) - (let ((data (rawsock:sockaddr-data sockaddr))) - (values (hbo-to-vector-quad (ip-from-octet-buffer data :start 2)) - (port-from-octet-buffer data :start 0))))) - - (defmethod get-local-name ((usocket datagram-usocket)) - (get-socket-name (socket usocket) 'rawsock:getsockname)) - - (defmethod get-peer-name ((usocket datagram-usocket)) - (get-socket-name (socket usocket) 'rawsock:getpeername)) - -) ; progn - -;;; -;;; UDP/Datagram sockets (FFI version) -;;; - -#+(and ffi (not rawsock)) -(progn - ;; C primitive types - (ffi:def-c-type socklen_t ffi:uint32) - - ;; C structures - (ffi:def-c-struct sockaddr - #+macos (sa_len ffi:uint8) - (sa_family #-macos ffi:ushort - #+macos ffi:uint8) - (sa_data (ffi:c-array ffi:char 14))) - - (ffi:def-c-struct sockaddr_in - #+macos (sin_len ffi:uint8) - (sin_family #-macos ffi:short - #+macos ffi:uint8) - (sin_port #-macos ffi:ushort - #+macos ffi:uint16) - (sin_addr ffi:uint32) - (sin_zero (ffi:c-array ffi:char 8))) - - (ffi:def-c-struct timeval - (tv_sec ffi:long) - (tv_usec ffi:long)) - - ;; foreign functions - (ffi:def-call-out %sendto (:name "sendto") - (:arguments (socket ffi:int) - (buffer ffi:c-pointer) - (length ffi:int) - (flags ffi:int) - (address (ffi:c-ptr sockaddr)) - (address-len ffi:int)) - #+win32 (:library "WS2_32") - #-win32 (:library :default) - (:language #-win32 :stdc - #+win32 :stdc-stdcall) - (:return-type ffi:int)) - - (ffi:def-call-out %send (:name "send") - (:arguments (socket ffi:int) - (buffer ffi:c-pointer) - (length ffi:int) - (flags ffi:int)) - #+win32 (:library "WS2_32") - #-win32 (:library :default) - (:language #-win32 :stdc - #+win32 :stdc-stdcall) - (:return-type ffi:int)) - - (ffi:def-call-out %recvfrom (:name "recvfrom") - (:arguments (socket ffi:int) - (buffer ffi:c-pointer) - (length ffi:int) - (flags ffi:int) - (address (ffi:c-ptr sockaddr) :in-out) - (address-len (ffi:c-ptr ffi:int) :in-out)) - #+win32 (:library "WS2_32") - #-win32 (:library :default) - (:language #-win32 :stdc - #+win32 :stdc-stdcall) - (:return-type ffi:int)) - - (ffi:def-call-out %socket (:name "socket") - (:arguments (family ffi:int) - (type ffi:int) - (protocol ffi:int)) - #+win32 (:library "WS2_32") - #-win32 (:library :default) - (:language #-win32 :stdc - #+win32 :stdc-stdcall) - (:return-type ffi:int)) - - (ffi:def-call-out %connect (:name "connect") - (:arguments (socket ffi:int) - (address (ffi:c-ptr sockaddr) :in) - (address_len socklen_t)) - #+win32 (:library "WS2_32") - #-win32 (:library :default) - (:language #-win32 :stdc - #+win32 :stdc-stdcall) - (:return-type ffi:int)) - - (ffi:def-call-out %bind (:name "bind") - (:arguments (socket ffi:int) - (address (ffi:c-ptr sockaddr) :in) - (address_len socklen_t)) - #+win32 (:library "WS2_32") - #-win32 (:library :default) - (:language #-win32 :stdc - #+win32 :stdc-stdcall) - (:return-type ffi:int)) - - (ffi:def-call-out %close (:name #-win32 "close" #+win32 "closesocket") - (:arguments (socket ffi:int)) - #+win32 (:library "WS2_32") - #-win32 (:library :default) - (:language #-win32 :stdc - #+win32 :stdc-stdcall) - (:return-type ffi:int)) - - (ffi:def-call-out %getsockopt (:name "getsockopt") - (:arguments (sockfd ffi:int) - (level ffi:int) - (optname ffi:int) - (optval ffi:c-pointer) - (optlen (ffi:c-ptr socklen_t) :out)) - #+win32 (:library "WS2_32") - #-win32 (:library :default) - (:language #-win32 :stdc - #+win32 :stdc-stdcall) - (:return-type ffi:int)) - - (ffi:def-call-out %setsockopt (:name "setsockopt") - (:arguments (sockfd ffi:int) - (level ffi:int) - (optname ffi:int) - (optval ffi:c-pointer) - (optlen socklen_t)) - #+win32 (:library "WS2_32") - #-win32 (:library :default) - (:language #-win32 :stdc - #+win32 :stdc-stdcall) - (:return-type ffi:int)) - - (ffi:def-call-out %htonl (:name "htonl") - (:arguments (hostlong ffi:uint32)) - #+win32 (:library "WS2_32") - #-win32 (:library :default) - (:language #-win32 :stdc - #+win32 :stdc-stdcall) - (:return-type ffi:uint32)) - - (ffi:def-call-out %htons (:name "htons") - (:arguments (hostshort ffi:uint16)) - #+win32 (:library "WS2_32") - #-win32 (:library :default) - (:language #-win32 :stdc - #+win32 :stdc-stdcall) - (:return-type ffi:uint16)) - - (ffi:def-call-out %ntohl (:name "ntohl") - (:arguments (netlong ffi:uint32)) - #+win32 (:library "WS2_32") - #-win32 (:library :default) - (:language #-win32 :stdc - #+win32 :stdc-stdcall) - (:return-type ffi:uint32)) - - (ffi:def-call-out %ntohs (:name "ntohs") - (:arguments (netshort ffi:uint16)) - #+win32 (:library "WS2_32") - #-win32 (:library :default) - (:language #-win32 :stdc - #+win32 :stdc-stdcall) - (:return-type ffi:uint16)) - - (ffi:def-call-out %getsockname (:name "getsockname") - (:arguments (sockfd ffi:int) - (localaddr (ffi:c-ptr sockaddr) :in-out) - (addrlen (ffi:c-ptr socklen_t) :in-out)) - #+win32 (:library "WS2_32") - #-win32 (:library :default) - (:language #-win32 :stdc - #+win32 :stdc-stdcall) - (:return-type ffi:int)) - - (ffi:def-call-out %getpeername (:name "getpeername") - (:arguments (sockfd ffi:int) - (peeraddr (ffi:c-ptr sockaddr) :in-out) - (addrlen (ffi:c-ptr socklen_t) :in-out)) - #+win32 (:library "WS2_32") - #-win32 (:library :default) - (:language #-win32 :stdc - #+win32 :stdc-stdcall) - (:return-type ffi:int)) - - ;; socket constants - (defconstant +socket-af-inet+ 2) - (defconstant +socket-sock-dgram+ 2) - (defconstant +socket-ip-proto-udp+ 17) - - (defconstant +sockopt-so-rcvtimeo+ #-linux #x1006 #+linux 20 "Socket receive timeout") - - (defparameter *length-of-sockaddr_in* (ffi:sizeof 'sockaddr_in)) - - (declaim (inline fill-sockaddr_in)) - (defun fill-sockaddr_in (sockaddr host port) - (let ((hbo (host-to-hbo host))) - (ffi:with-c-place (place sockaddr) - #+macos - (setf (ffi:slot place 'sin_len) *length-of-sockaddr_in*) - (setf (ffi:slot place 'sin_family) +socket-af-inet+ - (ffi:slot place 'sin_port) (%htons port) - (ffi:slot place 'sin_addr) (%htonl hbo))) - sockaddr)) - - (defun socket-create-datagram (local-port - &key (local-host *wildcard-host*) - remote-host - remote-port) - (let ((sock (%socket +socket-af-inet+ +socket-sock-dgram+ +socket-ip-proto-udp+)) - (lsock_addr (fill-sockaddr_in (ffi:allocate-shallow 'sockaddr_in) - local-host local-port)) - (rsock_addr (when remote-host - (fill-sockaddr_in (ffi:allocate-shallow 'sockaddr_in) - remote-host (or remote-port local-port))))) - (unless (plusp sock) - (error "SOCKET-CREATE-DATAGRAM ERROR (socket): ~A" (os:errno))) - (unwind-protect - (let ((rv (%bind sock (ffi:cast (ffi:foreign-value lsock_addr) 'sockaddr) - *length-of-sockaddr_in*))) - (unless (zerop rv) - (error "SOCKET-CREATE-DATAGRAM ERROR (bind): ~A" (os:errno))) - (when rsock_addr - (let ((rv (%connect sock - (ffi:cast (ffi:foreign-value rsock_addr) 'sockaddr) - *length-of-sockaddr_in*))) - (unless (zerop rv) - (error "SOCKET-CREATE-DATAGRAM ERROR (connect): ~A" (os:errno)))))) - (ffi:foreign-free lsock_addr) - (when remote-host - (ffi:foreign-free rsock_addr))) - (make-datagram-socket sock :connected-p (if rsock_addr t nil)))) - - (defun finalize-datagram-usocket (object) - (when (datagram-usocket-p object) - (socket-close object))) - - (defmethod initialize-instance :after ((usocket datagram-usocket) &key) - (setf (slot-value usocket 'recv-buffer) - (ffi:allocate-shallow 'ffi:uint8 :count +max-datagram-packet-size+)) - ;; finalize the object - (ext:finalize usocket 'finalize-datagram-usocket)) - - (defmethod socket-close ((usocket datagram-usocket)) - (with-slots (recv-buffer socket) usocket - (ffi:foreign-free recv-buffer) - (zerop (%close socket)))) - - (defmethod socket-receive ((usocket datagram-usocket) buffer length &key) - (let ((remote-address (ffi:allocate-shallow 'sockaddr_in)) - (remote-address-length (ffi:allocate-shallow 'ffi:int)) - nbytes (host 0) (port 0)) - (setf (ffi:foreign-value remote-address-length) - *length-of-sockaddr_in*) - (unwind-protect - (multiple-value-bind (n address address-length) - (%recvfrom (socket usocket) - (ffi:foreign-address (slot-value usocket 'recv-buffer)) - +max-datagram-packet-size+ - 0 ; flags - (ffi:cast (ffi:foreign-value remote-address) 'sockaddr) - (ffi:foreign-value remote-address-length)) - (when (minusp n) - (error "SOCKET-RECEIVE ERROR: ~A" (os:errno))) - (setq nbytes n) - (when (= address-length *length-of-sockaddr_in*) - (let ((data (sockaddr-sa_data address))) - (setq host (ip-from-octet-buffer data :start 2) - port (port-from-octet-buffer data)))) - (cond ((plusp n) - (let ((return-buffer (ffi:foreign-value (slot-value usocket 'recv-buffer)))) - (if buffer ; replace exist buffer of create new return buffer - (let ((end-1 (min (or length (length buffer)) +max-datagram-packet-size+)) - (end-2 (min n +max-datagram-packet-size+))) - (replace buffer return-buffer :end1 end-1 :end2 end-2)) - (setq buffer (subseq return-buffer 0 (min n +max-datagram-packet-size+)))))) - ((zerop n)))) - (ffi:foreign-free remote-address) - (ffi:foreign-free remote-address-length)) - (values buffer nbytes host port))) - - ;; implementation note: different from socket-receive, we know how many bytes we want to send everytime, - ;; so, a send buffer will not needed, and if there is a buffer, it's hard to fill its content like those - ;; in LispWorks. So, we allocate new foreign buffer for holding data (unknown sequence subtype) every time. - ;; - ;; I don't know if anyone is watching my coding work, but I think this design is reasonable for CLISP. - (defmethod socket-send ((usocket datagram-usocket) buffer size &key host port (offset 0)) - (declare (type sequence buffer) - (type (integer 0 *) size offset)) - (let ((remote-address - (when (and host port) - (fill-sockaddr_in (ffi:allocate-shallow 'sockaddr_in) host port))) - (send-buffer - (ffi:allocate-deep 'ffi:uint8 - (if (zerop offset) - buffer - (subseq buffer offset (+ offset size))) - :count size :read-only t)) - (real-size (min size +max-datagram-packet-size+)) - (nbytes 0)) - (unwind-protect - (let ((n (if remote-address - (%sendto (socket usocket) - (ffi:foreign-address send-buffer) - real-size - 0 ; flags - (ffi:cast (ffi:foreign-value remote-address) 'sockaddr) - *length-of-sockaddr_in*) - (%send (socket usocket) - (ffi:foreign-address send-buffer) - real-size - 0)))) - (cond ((plusp n) - (setq nbytes n)) - ((zerop n) - (setq nbytes n)) - (t (error "SOCKET-SEND ERROR: ~A" (os:errno))))) - (ffi:foreign-free send-buffer) - (when remote-address - (ffi:foreign-free remote-address)) - nbytes))) - - (declaim (inline get-socket-name)) - (defun get-socket-name (socket function) - (let ((address (ffi:allocate-shallow 'sockaddr_in)) - (address-length (ffi:allocate-shallow 'ffi:int)) - (host 0) (port 0)) - (setf (ffi:foreign-value address-length) *length-of-sockaddr_in*) - (unwind-protect - (multiple-value-bind (rv return-address return-address-length) - (funcall function socket - (ffi:cast (ffi:foreign-value address) 'sockaddr) - (ffi:foreign-value address-length)) - (declare (ignore return-address-length)) - (if (zerop rv) - (let ((data (sockaddr-sa_data return-address))) - (setq host (ip-from-octet-buffer data :start 2) - port (port-from-octet-buffer data))) - (error "GET-SOCKET-NAME ERROR: ~A" (os:errno)))) - (ffi:foreign-free address) - (ffi:foreign-free address-length)) - (values (hbo-to-vector-quad host) port))) - - (defmethod get-local-name ((usocket datagram-usocket)) - (get-socket-name (socket usocket) '%getsockname)) - - (defmethod get-peer-name ((usocket datagram-usocket)) - (get-socket-name (socket usocket) '%getpeername)) - -) ; progn diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/clozure.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/clozure.lisp deleted file mode 100644 index 7a1d620..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/clozure.lisp +++ /dev/null @@ -1,73 +0,0 @@ -;;;; See LICENSE for licensing information. - -;;;; Functions for CCL 1.11 (IPv6) only, see openmcl.lisp for rest of functions. - -(in-package :usocket) - -#+ipv6 -(defun socket-connect (host port &key (protocol :stream) element-type - timeout deadline nodelay - local-host local-port) - (when (eq nodelay :if-supported) - (setf nodelay t)) - (with-mapped-conditions (nil host) - (let* ((remote (when (and host port) - (openmcl-socket:resolve-address :host (host-to-hostname host) - :port port - :socket-type protocol))) - (local (when (and local-host local-port) - (openmcl-socket:resolve-address :host (host-to-hostname local-host) - :port local-port - :socket-type protocol))) - (mcl-sock (apply #'openmcl-socket:make-socket - `(:type ,protocol - ,@(when (or remote local) - `(:address-family ,(openmcl-socket:socket-address-family (or remote local)))) - ,@(when remote - `(:remote-address ,remote)) - ,@(when local - `(:local-address ,local)) - :format ,(to-format element-type protocol) - :external-format ,ccl:*default-external-format* - :deadline ,deadline - :nodelay ,nodelay - :connect-timeout ,timeout - :input-timeout ,timeout)))) - (ecase protocol - (:stream - (make-stream-socket :stream mcl-sock :socket mcl-sock)) - (:datagram - (make-datagram-socket mcl-sock :connected-p (and remote t))))))) - -#+ipv6 -(defun socket-listen (host port - &key - (reuse-address nil reuse-address-supplied-p) - (reuseaddress (when reuse-address-supplied-p reuse-address)) - (backlog 5) - (element-type 'character)) - (let ((local-address (openmcl-socket:resolve-address :host (host-to-hostname host) - :port port :connect :passive))) - (with-mapped-conditions (nil host) - (make-stream-server-socket - (openmcl-socket:make-socket :connect :passive - :address-family (openmcl-socket:socket-address-family local-address) - :local-address local-address - :reuse-address reuseaddress - :backlog backlog - :format (to-format element-type :stream)) - :element-type element-type)))) - -#+ipv6 -(defmethod socket-send ((usocket datagram-usocket) buffer size &key host port (offset 0)) - (let* ((ccl-socket (socket usocket)) - (socket-keys (ccl::socket-keys ccl-socket))) - (with-mapped-conditions (usocket host) - (if (and host port) - (openmcl-socket:send-to ccl-socket buffer size - :remote-host (host-to-hostname host) - :remote-port port - :offset offset) - (openmcl-socket:send-to ccl-socket buffer size - :remote-address (getf socket-keys :remote-address) - :offset offset))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/cmucl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/cmucl.lisp deleted file mode 100644 index 89627de..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/cmucl.lisp +++ /dev/null @@ -1,298 +0,0 @@ -;;;; See LICENSE for licensing information. - -(in-package :usocket) - -#+win32 -(defun remap-for-win32 (z) - (mapcar #'(lambda (x) - (cons (mapcar #'(lambda (y) - (+ 10000 y)) - (car x)) - (cdr x))) - z)) - -(defparameter +cmucl-error-map+ - #+win32 - (append (remap-for-win32 +unix-errno-condition-map+) - (remap-for-win32 +unix-errno-error-map+)) - #-win32 - (append +unix-errno-condition-map+ - +unix-errno-error-map+)) - -(defun cmucl-map-socket-error (err &key condition socket host-or-ip) - (let ((usock-error - (cdr (assoc err +cmucl-error-map+ :test #'member)))) - (if usock-error - (if (subtypep usock-error 'error) - (cond ((subtypep usock-error 'ns-error) - (error usock-error :socket socket :host-or-ip host-or-ip)) - (t - (error usock-error :socket socket))) - (cond ((subtypep usock-error 'ns-condition) - (signal usock-error :socket socket :host-or-ip host-or-ip)) - (t - (signal usock-error :socket socket)))) - (error 'unknown-error - :socket socket - :real-error condition)))) - -;; CMUCL error handling is brain-dead: it doesn't preserve any -;; information other than the OS error string from which the -;; error can be determined. The OS error string isn't good enough -;; given that it may have been localized (l10n). -;; -;; The above applies to versions pre 19b; 19d and newer are expected to -;; contain even better error reporting. -;; -;; -;; Just catch the errors and encapsulate them in an unknown-error -(defun handle-condition (condition &optional (socket nil) (host-or-ip nil)) - "Dispatch correct usocket condition." - (typecase condition - (ext::socket-error (cmucl-map-socket-error (ext::socket-errno condition) - :socket socket - :condition condition - :host-or-ip host-or-ip)))) - -(defun socket-connect (host port &key (protocol :stream) (element-type 'character) - timeout deadline (nodelay t nodelay-specified) - (local-host nil local-host-p) - (local-port nil local-port-p) - &aux - (local-bind-p (fboundp 'ext::bind-inet-socket))) - (when timeout (unsupported 'timeout 'socket-connect)) - (when deadline (unsupported 'deadline 'socket-connect)) - (when (and nodelay-specified - (not (eq nodelay :if-supported))) - (unsupported 'nodelay 'socket-connect)) - (when (and local-host-p (not local-bind-p)) - (unsupported 'local-host 'socket-connect :minimum "Snapshot 2008-08 (19E)")) - (when (and local-port-p (not local-bind-p)) - (unsupported 'local-port 'socket-connect :minimum "Snapshot 2008-08 (19E)")) - - (let ((socket)) - (ecase protocol - (:stream - (setf socket - (let ((args (list (host-to-hbo host) port protocol))) - (when (and local-bind-p (or local-host-p local-port-p)) - (nconc args (list :local-host (when local-host - (host-to-hbo local-host)) - :local-port local-port))) - (with-mapped-conditions (socket host) - (apply #'ext:connect-to-inet-socket args)))) - (if socket - (let* ((stream (sys:make-fd-stream socket :input t :output t - :element-type element-type - :buffering :full)) - ;;###FIXME the above line probably needs an :external-format - (usocket (make-stream-socket :socket socket - :stream stream))) - usocket) - (let ((err (unix:unix-errno))) - (when err (cmucl-map-socket-error err))))) - (:datagram - (setf socket - (if (and host port) - (let ((args (list (host-to-hbo host) port protocol))) - (when (and local-bind-p (or local-host-p local-port-p)) - (nconc args (list :local-host (when local-host - (host-to-hbo local-host)) - :local-port local-port))) - (with-mapped-conditions (socket (or host local-host)) - (apply #'ext:connect-to-inet-socket args))) - (if (or local-host-p local-port-p) - (with-mapped-conditions (socket (or host local-host)) - (apply #'ext:create-inet-listener - (nconc (list (or local-port 0) protocol) - (when (and local-host-p - (ip/= local-host *wildcard-host*)) - (list :host (host-to-hbo local-host)))))) - (with-mapped-conditions (socket (or host local-host)) - (ext:create-inet-socket protocol))))) - (if socket - (let ((usocket (make-datagram-socket socket :connected-p (and host port t)))) - (ext:finalize usocket #'(lambda () (when (%open-p usocket) - (ext:close-socket socket)))) - usocket) - (let ((err (unix:unix-errno))) - (when err (cmucl-map-socket-error err)))))))) - -(defun socket-listen (host port - &key reuseaddress - (reuse-address nil reuse-address-supplied-p) - (backlog 5) - (element-type 'character)) - (let* ((reuseaddress (if reuse-address-supplied-p reuse-address reuseaddress)) - (server-sock - (with-mapped-conditions (nil host) - (apply #'ext:create-inet-listener - (nconc (list port :stream - :backlog backlog - :reuse-address reuseaddress) - (when (ip/= host *wildcard-host*) - (list :host - (host-to-hbo host)))))))) - (make-stream-server-socket server-sock :element-type element-type))) - -(defmethod socket-accept ((usocket stream-server-usocket) &key element-type) - (with-mapped-conditions (usocket) - (let* ((sock (ext:accept-tcp-connection (socket usocket))) - (stream (sys:make-fd-stream sock :input t :output t - :element-type (or element-type - (element-type usocket)) - :buffering :full))) - (make-stream-socket :socket sock :stream stream)))) - -;; Sockets and socket streams are represented -;; by different objects. Be sure to close the -;; socket stream when closing a stream socket. -(defmethod socket-close ((usocket stream-usocket)) - "Close socket." - (with-mapped-conditions (usocket) - (close (socket-stream usocket)))) - -(defmethod socket-close ((usocket usocket)) - "Close socket." - (with-mapped-conditions (usocket) - (ext:close-socket (socket usocket)))) - -(defmethod socket-close :after ((socket datagram-usocket)) - (setf (%open-p socket) nil)) - -#+unicode -(defun %unix-send (fd buffer length flags) - (alien:alien-funcall - (alien:extern-alien "send" - (function c-call:int - c-call:int - system:system-area-pointer - c-call:int - c-call:int)) - fd - (system:vector-sap buffer) - length - flags)) - -(defmethod socket-shutdown ((usocket usocket) direction) - (with-mapped-conditions (usocket) - (ext:inet-shutdown (socket usocket) (ecase direction - (:input ext:shut-rd) - (:output ext:shut-wr))))) - -(defmethod socket-send ((usocket datagram-usocket) buffer size &key host port (offset 0) - &aux (real-buffer (if (zerop offset) - buffer - (subseq buffer offset (+ offset size))))) - (with-mapped-conditions (usocket host) - (if (and host port) - (ext:inet-sendto (socket usocket) real-buffer size (host-to-hbo host) port) - #-unicode - (unix:unix-send (socket usocket) real-buffer size 0) - #+unicode - (%unix-send (socket usocket) real-buffer size 0)))) - -(defmethod socket-receive ((usocket datagram-usocket) buffer length &key) - (declare (values (simple-array (unsigned-byte 8) (*)) ; buffer - (integer 0) ; size - (unsigned-byte 32) ; host - (unsigned-byte 16))) ; port - (let ((real-buffer (or buffer - (make-array length :element-type '(unsigned-byte 8)))) - (real-length (or length - (length buffer)))) - (multiple-value-bind (nbytes remote-host remote-port) - (with-mapped-conditions (usocket) - (ext:inet-recvfrom (socket usocket) real-buffer real-length)) - (values real-buffer nbytes remote-host remote-port)))) - -(defmethod get-local-name ((usocket usocket)) - (multiple-value-bind - (address port) - (ext:get-socket-host-and-port (socket usocket)) - (values (hbo-to-vector-quad address) port))) - -(defmethod get-peer-name ((usocket stream-usocket)) - (multiple-value-bind - (address port) - (ext:get-peer-host-and-port (socket usocket)) - (values (hbo-to-vector-quad address) port))) - -(defmethod get-local-address ((usocket usocket)) - (nth-value 0 (get-local-name usocket))) - -(defmethod get-peer-address ((usocket stream-usocket)) - (nth-value 0 (get-peer-name usocket))) - -(defmethod get-local-port ((usocket usocket)) - (nth-value 1 (get-local-name usocket))) - -(defmethod get-peer-port ((usocket stream-usocket)) - (nth-value 1 (get-peer-name usocket))) - - -(defun lookup-host-entry (host) - (multiple-value-bind - (entry errno) - (ext:lookup-host-entry host) - (if entry - entry - ;;###The constants below work on *most* OSes, but are defined as the - ;; constants mentioned in C - (let ((exception - (second (assoc errno - '((1 ns-host-not-found-error) ;; HOST_NOT_FOUND - (2 ns-no-recovery-error) ;; NO_DATA - (3 ns-no-recovery-error) ;; NO_RECOVERY - (4 ns-try-again-condition)))))) ;; TRY_AGAIN - (when exception - (error exception)))))) - - -(defun get-host-by-address (address) - (handler-case (ext:host-entry-name - (lookup-host-entry (host-byte-order address))) - (condition (condition) (handle-condition condition address)))) - -(defun get-hosts-by-name (name) - (handler-case (mapcar #'hbo-to-vector-quad - (ext:host-entry-addr-list - (lookup-host-entry name))) - (condition (condition) (handle-condition condition name)))) - -(defun get-host-name () - (unix:unix-gethostname)) - -(defun %setup-wait-list (wait-list) - (declare (ignore wait-list))) - -(defun %add-waiter (wait-list waiter) - (push (socket waiter) (wait-list-%wait wait-list))) - -(defun %remove-waiter (wait-list waiter) - (setf (wait-list-%wait wait-list) - (remove (socket waiter) (wait-list-%wait wait-list)))) - -(defun wait-for-input-internal (wait-list &key timeout) - (with-mapped-conditions () - (alien:with-alien ((rfds (alien:struct unix:fd-set))) - (unix:fd-zero rfds) - (dolist (socket (wait-list-%wait wait-list)) - (unix:fd-set socket rfds)) - (multiple-value-bind - (secs musecs) - (split-timeout (or timeout 1)) - (multiple-value-bind (count err) - (unix:unix-fast-select (1+ (reduce #'max - (wait-list-%wait wait-list))) - (alien:addr rfds) nil nil - (when timeout secs) musecs) - (declare (ignore err)) - (if (<= 0 count) - ;; process the result... - (dolist (x (wait-list-waiters wait-list)) - (when (unix:fd-isset (socket x) rfds) - (setf (state x) :READ))) - (progn - ;;###FIXME generate an error, except for EINTR - ))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/ecl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/ecl.lisp deleted file mode 100644 index 28ddd5a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/ecl.lisp +++ /dev/null @@ -1,152 +0,0 @@ -;;;; -*- Mode: Lisp -*- - -;;;; Foreign functions defined by ECL's DFFI, used for #+ecl-bytecmp only. -;;;; See LICENSE for licensing information. - -(in-package :usocket) - -#+(and ecl-bytecmp windows) -(eval-when (:load-toplevel :execute) - (ffi:load-foreign-library "ws2_32.dll" :module "ws2_32")) - -#+(and ecl-bytecmp windows) -(progn - (ffi:def-function ("gethostname" c-gethostname) - ((name (* :unsigned-char)) - (len :int)) - :returning :int - :module "ws2_32") - - (defun get-host-name () - "Returns the hostname" - (ffi:with-foreign-object (name '(:array :unsigned-char 256)) - (when (zerop (c-gethostname (ffi:char-array-to-pointer name) 256)) - (ffi:convert-from-foreign-string name)))) - - (ffi:def-foreign-type ws-socket :unsigned-int) - (ffi:def-foreign-type ws-dword :unsigned-long) - (ffi:def-foreign-type ws-event :unsigned-int) - - (ffi:def-struct wsa-network-events - (network-events :long) - (error-code (:array :int 10))) - - (ffi:def-function ("WSACreateEvent" wsa-event-create) - () - :returning ws-event - :module "ws2_32") - - (ffi:def-function ("WSACloseEvent" c-wsa-event-close) - ((event-object ws-event)) - :returning :int - :module "ws2_32") - - (defun wsa-event-close (ws-event) - (not (zerop (c-wsa-event-close ws-event)))) - - (ffi:def-function ("WSAEnumNetworkEvents" wsa-enum-network-events) - ((socket ws-socket) - (event-object ws-event) - (network-events (* wsa-network-events))) - :returning :int - :module "ws2_32") - - (ffi:def-function ("WSAEventSelect" wsa-event-select) - ((socket ws-socket) - (event-object ws-event) - (network-events :long)) - :returning :int - :module "ws2_32") - - (ffi:def-function ("WSAWaitForMultipleEvents" c-wsa-wait-for-multiple-events) - ((number-of-events ws-dword) - (events (* ws-event)) - (wait-all-p :int) - (timeout ws-dword) - (alertable-p :int)) - :returning ws-dword - :module "ws2_32") - - (defun wsa-wait-for-multiple-events (number-of-events events wait-all-p timeout alertable-p) - (c-wsa-wait-for-multiple-events number-of-events - events - (if wait-all-p -1 0) - timeout - (if alertable-p -1 0))) - - (ffi:def-function ("ioctlsocket" wsa-ioctlsocket) - ((socket ws-socket) - (cmd :long) - (argp (* :unsigned-long))) - :returning :int - :module "ws2_32") - - (ffi:def-function ("WSAGetLastError" wsa-get-last-error) - () - :returning :int - :module "ws2_32") - - (defun maybe-wsa-error (rv &optional socket) - (unless (zerop rv) - (raise-usock-err (wsa-get-last-error) socket))) - - (defun bytes-available-for-read (socket) - (ffi:with-foreign-object (int-ptr :unsigned-long) - (maybe-wsa-error (wsa-ioctlsocket (socket-handle socket) fionread int-ptr) - socket) - (let ((int (ffi:deref-pointer int-ptr :unsigned-long))) - (prog1 int - (when (plusp int) - (setf (state socket) :read)))))) - - (defun map-network-events (func network-events) - (let ((event-map (ffi:get-slot-value network-events 'wsa-network-events 'network-events)) - (error-array (ffi:get-slot-pointer network-events 'wsa-network-events 'error-code))) - (unless (zerop event-map) - (dotimes (i fd-max-events) - (unless (zerop (ldb (byte 1 i) event-map)) - (funcall func (ffi:deref-array error-array '(:array :int 10) i))))))) - - (defun update-ready-and-state-slots (sockets) - (dolist (socket sockets) - (if (%ready-p socket) - (progn - (setf (state socket) :READ)) - (ffi:with-foreign-object (network-events 'wsa-network-events) - (let ((rv (wsa-enum-network-events (socket-handle socket) 0 network-events))) - (if (zerop rv) - (map-network-events - #'(lambda (err-code) - (if (zerop err-code) - (progn - (setf (state socket) :READ) - (when (stream-server-usocket-p socket) - (setf (%ready-p socket) t))) - (raise-usock-err err-code socket))) - network-events) - (maybe-wsa-error rv socket))))))) - - (defun os-wait-list-%wait (wait-list) - (ffi:deref-pointer (wait-list-%wait wait-list) 'ws-event)) - - (defun (setf os-wait-list-%wait) (value wait-list) - (setf (ffi:deref-pointer (wait-list-%wait wait-list) 'ws-event) value)) - - (defun free-wait-list (wl) - (when (wait-list-p wl) - (unless (null (wait-list-%wait wl)) - (wsa-event-close (os-wait-list-%wait wl)) - (ffi:free-foreign-object (wait-list-%wait wl)) - (setf (wait-list-%wait wl) nil)))) - - (defun %setup-wait-list (wait-list) - (setf (wait-list-%wait wait-list) - (ffi:allocate-foreign-object 'ws-event)) - (setf (os-wait-list-%wait wait-list) - (wsa-event-create)) - (ext:set-finalizer wait-list #'free-wait-list)) - - (defun os-socket-handle (usocket) - (socket-handle usocket)) - -) ; #+(and ecl-bytecmp windows) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/genera.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/genera.lisp deleted file mode 100644 index 0a12e8b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/genera.lisp +++ /dev/null @@ -1,264 +0,0 @@ -;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Package: USOCKET; Base: 10 -*- - - -;;;; See LICENSE for licensing information. - -(in-package :usocket) - -(defclass genera-socket () - ((foreign-address :initform 0 :initarg :foreign-address :accessor gs-foreign-address) - (foreign-port :initform 0 :initarg :foreign-port :accessor gs-foreign-port) - (local-address :initform 0 :initarg :local-address :accessor gs-local-address) - (local-port :initform 0 :initarg :local-port :accessor gs-local-port)) - ) - -(defclass genera-stream-socket (genera-socket) - ((stream :initform nil :initarg :stream :accessor gs-stream)) - ) - -(defclass genera-stream-server-socket (genera-socket) - ((backlog :initform nil :initarg :backlog :accessor gs-backlog) - (element-type :initform nil :initarg :element-type :accessor gs-element-type) - (pending-connections :initform nil :accessor gs-pending-connections)) - ) - -(defclass genera-datagram-socket (genera-socket) - ((connection :initform nil :initarg :connection :accessor gs-connection)) - ) - -(defun host-to-host-object (host) - (let ((host (host-to-hostname host))) - (cond ((string-equal host "localhost") - net:*local-host*) - ((ip-address-string-p host) - (let ((quad (dotted-quad-to-vector-quad host))) - ;;---*** NOTE: This test is temporary until we have a loopback interface - (if (= (aref quad 0) 127) - net:*local-host* - (net:parse-host (format nil "INTERNET|~A" host))))) - (t - (net:parse-host host))))) - -(defun element-type-to-format (element-type protocol) - (cond ((null element-type) - (ecase protocol - (:stream :text) - (:datagram :binary))) - ((subtypep element-type 'character) - :text) - (t :binary))) - -(defun handle-condition (condition &optional (socket nil) (host-or-ip nil)) - (typecase condition - ;;---*** TODO: Add additional conditions as appropriate - (sys:connection-refused - (error 'connection-refused-error :socket socket)) - ((or tcp::tcp-destination-unreachable-during-connection tcp::udp-destination-unreachable) - (error 'host-unreachable-error :socket socket)) - (sys:host-not-responding-during-connection - (error 'timeout-error :socket socket)) - (sys:unknown-host-name - (error 'ns-host-not-found-error :host-or-ip host-or-ip)) - (sys:network-error - (error 'unknown-error :socket socket :real-error condition :errno -1)))) - -(defun socket-connect (host port &key (protocol :stream) element-type - timeout deadline (nodelay nil nodelay-p) - local-host local-port) - (declare (ignore local-host)) - (when deadline - (unsupported 'deadline 'socket-connect)) - (when (and nodelay-p (not (eq nodelay :if-supported))) - (unsupported 'nodelay 'socket-connect)) - (with-mapped-conditions (nil host) - (ecase protocol - (:stream - (let* ((host-object (host-to-host-object host)) - (format (element-type-to-format element-type protocol)) - (characters (eq format :text)) - (timeout (if timeout - (* 60 timeout) - tcp:*tcp-connect-timeout*)) - (stream (tcp:open-tcp-stream host-object port local-port - :characters characters - :ascii-translation characters - :timeout timeout)) - (gs (make-instance 'genera-stream-socket - :stream stream))) - (setf (gs-foreign-address gs) (scl:send stream :foreign-address)) - (setf (gs-foreign-port gs) (scl:send stream :foreign-port)) - (setf (gs-local-address gs) (scl:send stream :local-address)) - (setf (gs-local-port gs) (scl:send stream :local-port)) - (make-stream-socket :socket gs :stream stream))) - (:datagram - ;;---*** TODO - (unsupported 'datagram 'socket-connect))))) - -(defmethod socket-close ((usocket usocket)) - (with-mapped-conditions (usocket) - (socket-close (socket usocket)))) - -(defmethod socket-close ((socket genera-stream-socket)) - (with-slots (stream) socket - (when stream - (scl:send (shiftf stream nil) :close nil)))) - -(defmethod socket-close ((socket genera-stream-server-socket)) - (with-slots (local-port pending-connections) socket - (when local-port - (tcp:remove-tcp-port-listener local-port)) - (dolist (tcb pending-connections) - (tcp::reject-tcb tcb)))) - -(defmethod socket-close ((socket genera-datagram-socket)) - (with-slots (connection) socket - (when connection - (scl:send (shiftf connection nil) :close nil)) - ;;---*** TODO: listening? - )) - -;;; Cribbed from TCP::MAKE-TCB -(defun gensym-tcp-port () - (loop as number = (incf tcp::*last-gensym-port-number*) then tcp::*last-gensym-port-number* - do (cond ((loop for existing-tcb in tcp::*tcb-list* - thereis (= number (tcp::tcb-local-port existing-tcb)))) - ((and (<= #.(expt 2 10) number) (< number #.(expt 2 16))) - (return number)) - (t - (setq tcp::*last-gensym-port-number* #.(expt 2 10)))))) - -(defun socket-listen (host port &key (reuse-address nil reuse-address-p) - (reuseaddress nil reuseaddress-p) - (backlog 5) (element-type 'character)) - (let ((host-object (host-to-host-object host)) - (port (if (zerop port) (gensym-tcp-port) port)) - (reuse-address (cond (reuse-address-p reuse-address) - (reuseaddress-p reuseaddress) - (t nil)))) - (when (<= port 1024) - ;; Don't allow listening on "privileged" ports to mimic Unix/Linux semantics - (error 'operation-not-permitted-error :socket nil)) - (when (tcp:tcp-port-protocol-name port) - ;; Can't replace a Genera server - (error 'address-in-use-error :socket nil)) - (when (tcp:tcp-port-listener port) - (unless reuse-address - (error 'address-in-use-error :socket nil))) - (let ((gs (make-instance 'genera-stream-server-socket - :backlog backlog - :element-type element-type))) - (setf (gs-local-address gs) - (loop for (network address) in (scl:send host-object :network-addresses) - when (typep network 'tcp:internet-network) - return address)) - (setf (gs-local-port gs) port) - (flet ((add-to-queue (tcb) - (cond ((and (not (zerop (gs-local-address gs))) - (not (= (gs-local-address gs) (tcp::tcb-local-address tcb)))) - ;; Reject if not destined for the proper address - (tcp::reject-tcb tcb)) - ((<= (length (gs-pending-connections gs)) (gs-backlog gs)) - (tcp::accept-tcb tcb) - (tcp::tcb-travel-through-states tcb "Accept" nil :listen :syn-received) - (setf (gs-pending-connections gs) - (append (gs-pending-connections gs) (list tcb)))) - (t - ;; Reject if backlog is full - (tcp::reject-tcb tcb))))) - (tcp:add-tcp-port-listener port #'add-to-queue)) - (make-stream-server-socket gs :element-type element-type)))) - -(defmethod socket-accept ((socket stream-server-usocket) &key element-type) - (with-slots (pending-connections) (socket socket) - (loop - (process:process-block "Wait for connection" #'(lambda () - (not (null pending-connections)))) - (let ((tcb (pop pending-connections))) - (when tcb - (let* ((format (element-type-to-format (or element-type (element-type socket)) - :stream)) - (characters (eq format :text)) - (stream (tcp::make-tcp-stream tcb - :characters characters - :ascii-translation characters)) - (gs (make-instance 'genera-stream-socket - :stream stream))) - (setf (gs-foreign-address gs) (scl:send stream :foreign-address)) - (setf (gs-foreign-port gs) (scl:send stream :foreign-port)) - (setf (gs-local-address gs) (scl:send stream :local-address)) - (setf (gs-local-port gs) (scl:send stream :local-port)) - (return (make-stream-socket :socket gs :stream stream)))))))) - -(defmethod get-local-address ((usocket usocket)) - (hbo-to-vector-quad (gs-local-address (socket usocket)))) - -(defmethod get-peer-address ((usocket stream-usocket)) - (hbo-to-vector-quad (gs-foreign-address (socket usocket)))) - -(defmethod get-local-port ((usocket usocket)) - (gs-local-port (socket usocket))) - -(defmethod get-peer-port ((usocket stream-usocket)) - (gs-foreign-port (socket usocket))) - -(defmethod get-local-name ((usocket usocket)) - (values (get-local-address usocket) - (get-local-port usocket))) - -(defmethod get-peer-name ((usocket stream-usocket)) - (values (get-peer-address usocket) - (get-peer-port usocket))) - -(defmethod socket-send ((usocket datagram-usocket) buffer size &key host port (offset 0)) - ;;---*** TODO - (unsupported 'datagram 'socket-send)) - -(defmethod socket-receive ((socket datagram-usocket) buffer length &key) - ;;---*** TODO - (unsupported 'datagram 'socket-receive)) - -(defun get-host-by-address (address) - ) ;; TODO - -(defun get-hosts-by-name (name) - (with-mapped-conditions (nil name) - (let ((host-object (host-to-host-object name))) - (loop for (network address) in (scl:send host-object :network-addresses) - when (typep network 'tcp:internet-network) - collect (hbo-to-vector-quad address))))) - -(defun %setup-wait-list (wait-list) - (declare (ignore wait-list))) - -(defun %add-waiter (wait-list waiter) - (declare (ignore wait-list waiter))) - -(defun %remove-waiter (wait-list waiter) - (declare (ignore wait-list waiter))) - -(defun wait-for-input-internal (wait-list &key timeout) - (with-mapped-conditions () - (process:process-block-with-timeout timeout "Wait for input" - #'(lambda (wait-list) - (let ((ready-sockets nil)) - (dolist (waiter (wait-list-waiters wait-list) ready-sockets) - (setf (state waiter) - (cond ((stream-usocket-p waiter) - (if (listen (socket-stream waiter)) - :read - nil)) - ((datagram-usocket-p waiter) - (let ((connection (gs-connection (socket waiter)))) - (if (and connection - (not (scl:send connection :connection-pending-p))) - :read - nil))) - ((stream-server-usocket-p waiter) - (if (gs-pending-connections (socket waiter)) - :read - nil)))) - (when (not (null (state waiter))) - (setf ready-sockets t))))) - wait-list) - wait-list)) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/iolib.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/iolib.lisp deleted file mode 100644 index 53e72c5..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/iolib.lisp +++ /dev/null @@ -1,290 +0,0 @@ -;;;; See LICENSE for licensing information. - -(in-package :usocket) - -(defparameter *backend* :iolib) - -(eval-when (:load-toplevel :execute) - (shadowing-import 'iolib/sockets:socket-option) - (export 'socket-option)) - -(defparameter +iolib-error-map+ - `((iolib/sockets:socket-address-in-use-error . address-in-use-error) - (iolib/sockets:socket-address-family-not-supported-error . socket-type-not-supported-error) - (iolib/sockets:socket-address-not-available-error . address-not-available-error) - (iolib/sockets:socket-network-down-error . network-down-error) - (iolib/sockets:socket-network-reset-error . network-reset-error) - (iolib/sockets:socket-network-unreachable-error . network-unreachable-error) - ;; (iolib/sockets:socket-no-network-error . ?) - (iolib/sockets:socket-connection-aborted-error . connection-aborted-error) - (iolib/sockets:socket-connection-reset-error . connection-reset-error) - (iolib/sockets:socket-connection-refused-error . connection-refused-error) - (iolib/sockets:socket-connection-timeout-error . timeout-error) - ;; (iolib/sockets:socket-connection-in-progress-error . ?) - (iolib/sockets:socket-endpoint-shutdown-error . network-down-error) - (iolib/sockets:socket-no-buffer-space-error . no-buffers-error) - (iolib/sockets:socket-host-down-error . host-down-error) - (iolib/sockets:socket-host-unreachable-error . host-unreachable-error) - ;; (iolib/sockets:socket-already-connected-error . ?) - (iolib/sockets:socket-not-connected-error . connection-refused-error) - (iolib/sockets:socket-option-not-supported-error . operation-not-permitted-error) - (iolib/syscalls:eacces . operation-not-permitted-error) - (iolib/sockets:socket-operation-not-supported-error . operation-not-supported-error) - (iolib/sockets:unknown-protocol . protocol-not-supported-error) - ;; (iolib/sockets:unknown-interface . ?) - (iolib/sockets:unknown-service . protocol-not-supported-error) - (iolib/sockets:socket-error . socket-error) - - ;; Nameservice errors (src/sockets/dns/conditions.lisp) - (iolib/sockets:resolver-error . ns-error) - (iolib/sockets:resolver-fail-error . ns-host-not-found-error) - (iolib/sockets:resolver-again-error . ns-try-again-condition) - (iolib/sockets:resolver-no-name-error . ns-no-recovery-error) - (iolib/sockets:resolver-unknown-error . ns-unknown-error) - )) - -;; IOlib uses (SIMPLE-ARRAY (UNSIGNED-BYTE 16) (8)) to represent IPv6 addresses, -;; while USOCKET shared code uses (SIMPLE-ARRAY (UNSIGNED-BYTE 8) (16)). Here we do the -;; conversion. -(defun iolib-vector-to-vector-quad (host) - (etypecase host - ((or (vector t 4) ; IPv4 - (array (unsigned-byte 8) (4))) - host) - ((or (vector t 8) ; IPv6 - (array (unsigned-byte 16) (8))) - (loop with vector = (make-array 16 :element-type '(unsigned-byte 8)) - for i below 16 by 2 - for word = (aref host (/ i 2)) - do (setf (aref vector i) (ldb (byte 8 8) word) - (aref vector (1+ i)) (ldb (byte 8 0) word)) - finally (return vector))))) - -(defun handle-condition (condition &optional (socket nil) (host-or-ip nil)) - "Dispatch correct usocket condition." - (let* ((usock-error (cdr (assoc (type-of condition) +iolib-error-map+))) - (usock-error (if (functionp usock-error) - (funcall usock-error condition) - usock-error))) - (if usock-error - (if (typep usock-error 'socket-error) - (cond ((subtypep usock-error 'ns-error) - (error usock-error :socket socket :host-or-ip host-or-ip)) - (t - (error usock-error :socket socket))) - (cond ((subtypep usock-error 'ns-condition) - (signal usock-error :socket socket :host-or-ip host-or-ip)) - (t - (signal usock-error :socket socket)))) - (error 'unknown-error - :real-error condition - :socket socket)))) - -(defun ipv6-address-p (host) - (iolib/sockets:ipv6-address-p (iolib/sockets:ensure-hostname host))) - -(defun socket-connect (host port &key (protocol :stream) (element-type 'character) - timeout deadline - (nodelay t) ;; nodelay == t is the ACL default - local-host local-port) - (declare (ignore element-type deadline nodelay)) - (with-mapped-conditions (nil host) - (let* ((remote (when (and host port) (iolib/sockets:ensure-hostname host))) - (local (when (and local-host local-port) - (iolib/sockets:ensure-hostname local-host))) - (ipv6-p (or (and remote (ipv6-address-p remote) - (and local (ipv6-address-p local))))) - (socket (apply #'iolib/sockets:make-socket - `(:type ,protocol - :address-family :internet - :ipv6 ,ipv6-p - :connect ,(cond ((eq protocol :stream) :active) - ((and host port) :active) - (t :passive)) - ,@(when local - `(:local-host ,local :local-port ,local-port)) - :nodelay nodelay)))) - (when remote - (apply #'iolib/sockets:connect - `(,socket ,remote :port ,port ,@(when timeout `(:wait ,timeout)))) - (unless (iolib/sockets:socket-connected-p socket) - (close socket) - (error 'iolib/sockets:socket-error))) - (ecase protocol - (:stream - (make-stream-socket :stream socket :socket socket)) - (:datagram - (make-datagram-socket socket :connected-p (and remote t))))))) - -(defmethod socket-close ((usocket usocket)) - (close (socket usocket))) - -(defmethod socket-shutdown ((usocket stream-usocket) direction) - (with-mapped-conditions () - (case direction - (:input - (iolib/sockets:shutdown (socket usocket) :read t)) - (:output - (iolib/sockets:shutdown (socket usocket) :write t)) - (t ; :io by default - (iolib/sockets:shutdown (socket usocket) :read t :write t))))) - -(defun socket-listen (host port - &key reuseaddress reuse-address - (backlog 5) - (element-type 'character)) - (declare (ignore element-type)) - (with-mapped-conditions (nil host) - (make-stream-server-socket - (iolib/sockets:make-socket :connect :passive - :address-family :internet - :local-host (iolib/sockets:ensure-hostname host) - :local-port port - :backlog backlog - :reuse-address (or reuse-address reuseaddress))))) - -(defmethod socket-accept ((usocket stream-server-usocket) &key element-type) - (declare (ignore element-type)) - (with-mapped-conditions (usocket) - (let ((socket (iolib/sockets:accept-connection (socket usocket)))) - (make-stream-socket :socket socket :stream socket)))) - -(defmethod get-local-address ((usocket usocket)) - (iolib-vector-to-vector-quad - (iolib/sockets:address-to-vector (iolib/sockets:local-host (socket usocket))))) - -(defmethod get-peer-address ((usocket stream-usocket)) - (iolib-vector-to-vector-quad - (iolib/sockets:address-to-vector (iolib/sockets:remote-host (socket usocket))))) - -(defmethod get-local-port ((usocket usocket)) - (iolib/sockets:local-port (socket usocket))) - -(defmethod get-peer-port ((usocket stream-usocket)) - (iolib/sockets:remote-port (socket usocket))) - -(defmethod get-local-name ((usocket usocket)) - (values (get-local-address usocket) - (get-local-port usocket))) - -(defmethod get-peer-name ((usocket stream-usocket)) - (values (get-peer-address usocket) - (get-peer-port usocket))) - -(defmethod socket-send ((usocket datagram-usocket) buffer size &key host port (offset 0)) - (apply #'iolib/sockets:send-to - `(,(socket usocket) ,buffer :start ,offset :end ,(+ offset size) - ,@(when (and host port) - `(:remote-host ,(iolib/sockets:ensure-hostname host) - :remote-port ,port))))) - -(defmethod socket-receive ((usocket datagram-usocket) buffer length &key start end) - (multiple-value-bind (buffer size host port) - (iolib/sockets:receive-from (socket usocket) - :buffer buffer :size length :start start :end end) - (values buffer size (iolib-vector-to-vector-quad host) port))) - -(defun get-hosts-by-name (name) - (with-mapped-conditions (nil name) - (multiple-value-bind (address more-addresses) - (iolib/sockets:lookup-hostname name :ipv6 iolib/sockets:*ipv6*) - (mapcar #'(lambda (x) (iolib-vector-to-vector-quad - (iolib/sockets:address-name x))) - (cons address more-addresses))))) - -(defun get-host-by-address (address) - (with-mapped-conditions (nil address) - nil)) ;; TODO - -(defvar *event-base* - (make-instance 'iolib/multiplex:event-base)) - -(defun %setup-wait-list (wait-list) - (setf (wait-list-%wait wait-list) - (or *event-base* - ;; iolib/multiplex:*default-multiplexer* is used here - (make-instance 'iolib/multiplex:event-base)))) - -(defun make-usocket-read-handler (usocket disconnector) - (lambda (fd event exception) - (declare (ignore fd event exception)) - (handler-case - (if (eq (state usocket) :write) - (setf (state usocket) :read-write) - (setf (state usocket) :read)) - (end-of-file () - (funcall disconnector :close))))) - -(defun make-usocket-write-handler (usocket disconnector) - (lambda (fd event exception) - (declare (ignore fd event exception)) - (handler-case - (if (eq (state usocket) :read) - (setf (state usocket) :read-write) - (setf (state usocket) :write)) - (end-of-file () - (funcall disconnector :close)) - (iolib/streams:hangup () - (funcall disconnector :close))))) - -(defun make-usocket-error-handler (usocket disconnector) - (lambda (fd event exception) - (declare (ignore fd event exception)) - (handler-case - (setf (state usocket) nil) - (end-of-file () - (funcall disconnector :close)) - (iolib/streams:hangup () - (funcall disconnector :close))))) - -(defun make-usocket-disconnector (event-base usocket) - (declare (ignore event-base)) - (lambda (&rest events) - (let ((socket (socket usocket))) - ;; if were asked to close the socket, we do so here - (when (member :close events) - (close socket :abort t))))) - -(defun %add-waiter (wait-list waiter) - (let ((event-base (wait-list-%wait wait-list)) - (fd (iolib/sockets:socket-os-fd (socket waiter)))) - ;; reset socket state - (setf (state waiter) nil) - ;; set read handler - (unless (iolib/multiplex::fd-monitored-p event-base fd :read) - (iolib/multiplex:set-io-handler - event-base fd :read - (make-usocket-read-handler waiter - (make-usocket-disconnector event-base waiter)))) - ;; set write handler - #+ignore - (unless (iolib/multiplex::fd-monitored-p event-base fd :write) - (iolib/multiplex:set-io-handler - event-base fd :write - (make-usocket-write-handler waiter - (make-usocket-disconnector event-base waiter)))) - ;; set error handler - (unless (iolib/multiplex::fd-has-error-handler-p event-base fd) - (iolib/multiplex:set-error-handler - event-base fd - (make-usocket-error-handler waiter - (make-usocket-disconnector event-base waiter)))))) - -(defun %remove-waiter (wait-list waiter) - (let ((event-base (wait-list-%wait wait-list))) - (iolib/multiplex:remove-fd-handlers event-base - (iolib/sockets:socket-os-fd (socket waiter)) - :read t - :write nil - :error t))) - -;; NOTE: `wait-list-waiters` returns all usockets -(defun wait-for-input-internal (wait-list &key timeout) - (let ((event-base (wait-list-%wait wait-list))) - (handler-case - (iolib/multiplex:event-dispatch event-base :timeout timeout) - (iolib/streams:hangup ()) - (end-of-file ())) - ;; close the event-base after use - (unless (eq event-base *event-base*) - (close event-base)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/lispworks.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/lispworks.lisp deleted file mode 100644 index 9dfc757..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/lispworks.lisp +++ /dev/null @@ -1,1001 +0,0 @@ -;;;; See LICENSE for licensing information. - -(in-package :usocket) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (require "comm") - - #+lispworks3 - (error "LispWorks 3 is not supported")) - -;;; --------------------------------------------------------------------------- -;;; Warn if multiprocessing is not running on Lispworks - -(defun check-for-multiprocessing-started (&optional errorp) - (unless mp:*current-process* - (funcall (if errorp 'error 'warn) - "You must start multiprocessing on Lispworks by calling~ - ~%~3t(~s)~ - ~%for ~s function properly." - 'mp:initialize-multiprocessing - 'wait-for-input))) - -(eval-when (:load-toplevel :execute) - (check-for-multiprocessing-started)) - -#+win32 -(eval-when (:load-toplevel :execute) - (fli:register-module "ws2_32")) - -(fli:define-foreign-function (get-host-name-internal "gethostname" :source) - ((return-string (:reference-return (:ef-mb-string :limit 257))) - (namelen :int)) - :lambda-list (&aux (namelen 256) return-string) - :result-type :int - #+win32 :module - #+win32 "ws2_32") - -(defun get-host-name () - (multiple-value-bind (return-code name) - (get-host-name-internal) - (when (zerop return-code) - name))) - -#+win32 -(defun remap-maybe-for-win32 (z) - (mapcar #'(lambda (x) - (cons (mapcar #'(lambda (y) (+ 10000 y)) (car x)) - (cdr x))) - z)) - -(defparameter +lispworks-error-map+ - #+win32 - (append (remap-maybe-for-win32 +unix-errno-condition-map+) - (remap-maybe-for-win32 +unix-errno-error-map+)) - #-win32 - (append +unix-errno-condition-map+ - +unix-errno-error-map+)) - -(defun raise-usock-err (errno socket &optional condition (host-or-ip nil)) - (let ((usock-error - (cdr (assoc errno +lispworks-error-map+ :test #'member)))) - (if usock-error - (if (subtypep usock-error 'error) - (cond ((subtypep usock-error 'ns-error) - (error usock-error :socket socket :host-or-ip host-or-ip)) - (t - (error usock-error :socket socket))) - (cond ((subtypep usock-error 'ns-condition) - (signal usock-error :socket socket :host-or-ip host-or-ip)) - (t - (signal usock-error :socket socket)))) - (error 'unknown-error - :socket socket - :real-error condition - :errno errno)))) - -(defun handle-condition (condition &optional (socket nil) (host-or-ip nil)) - "Dispatch correct usocket condition." - (typecase condition - (condition (let ((errno #-win32 (lw:errno-value) - #+win32 (wsa-get-last-error))) - (unless (zerop errno) - (raise-usock-err errno socket condition host-or-ip)))))) - -(defconstant *socket_sock_dgram* 2 - "Connectionless, unreliable datagrams of fixed maximum length.") - -(defconstant *socket_ip_proto_udp* 17) - -(defconstant *sockopt_so_rcvtimeo* - #-linux #x1006 - #+linux 20 - "Socket receive timeout") - -(defconstant *sockopt_so_sndtimeo* - #-linux #x1007 - #+linux 21 - "Socket send timeout") - -(fli:define-c-struct timeval - (tv-sec :long) - (tv-usec :long)) - -;;; ssize_t -;;; recvfrom(int socket, void *restrict buffer, size_t length, int flags, -;;; struct sockaddr *restrict address, socklen_t *restrict address_len); -(fli:define-foreign-function (%recvfrom "recvfrom" :source) - ((socket :int) - (buffer (:pointer (:unsigned :byte))) - (length :int) - (flags :int) - (address (:pointer (:struct comm::sockaddr))) - (address-len (:pointer :int))) - :result-type :int - #+win32 :module - #+win32 "ws2_32") - -;;; ssize_t -;;; sendto(int socket, const void *buffer, size_t length, int flags, -;;; const struct sockaddr *dest_addr, socklen_t dest_len); -(fli:define-foreign-function (%sendto "sendto" :source) - ((socket :int) - (buffer (:pointer (:unsigned :byte))) - (length :int) - (flags :int) - (address (:pointer (:struct comm::sockaddr))) - (address-len :int)) - :result-type :int - #+win32 :module - #+win32 "ws2_32") - -#-win32 -(defun set-socket-receive-timeout (socket-fd seconds) - "Set socket option: RCVTIMEO, argument seconds can be a float number" - (declare (type integer socket-fd) - (type number seconds)) - (multiple-value-bind (sec usec) (truncate seconds) - (fli:with-dynamic-foreign-objects ((timeout (:struct timeval))) - (fli:with-foreign-slots (tv-sec tv-usec) timeout - (setf tv-sec sec - tv-usec (truncate (* 1000000 usec))) - (if (zerop (comm::setsockopt socket-fd - comm::*sockopt_sol_socket* - *sockopt_so_rcvtimeo* - (fli:copy-pointer timeout - :type '(:pointer :void)) - (fli:size-of '(:struct timeval)))) - seconds))))) - -#-win32 -(defun set-socket-send-timeout (socket-fd seconds) - "Set socket option: SNDTIMEO, argument seconds can be a float number" - (declare (type integer socket-fd) - (type number seconds)) - (multiple-value-bind (sec usec) (truncate seconds) - (fli:with-dynamic-foreign-objects ((timeout (:struct timeval))) - (fli:with-foreign-slots (tv-sec tv-usec) timeout - (setf tv-sec sec - tv-usec (truncate (* 1000000 usec))) - (if (zerop (comm::setsockopt socket-fd - comm::*sockopt_sol_socket* - *sockopt_so_sndtimeo* - (fli:copy-pointer timeout - :type '(:pointer :void)) - (fli:size-of '(:struct timeval)))) - seconds))))) - -#+win32 -(defun set-socket-receive-timeout (socket-fd seconds) - "Set socket option: RCVTIMEO, argument seconds can be a float number. - On win32, you must bind the socket before use this function." - (declare (type integer socket-fd) - (type number seconds)) - (fli:with-dynamic-foreign-objects ((timeout :int)) - (setf (fli:dereference timeout) - (truncate (* 1000 seconds))) - (if (zerop (comm::setsockopt socket-fd - comm::*sockopt_sol_socket* - *sockopt_so_rcvtimeo* - (fli:copy-pointer timeout - :type '(:pointer :char)) - (fli:size-of :int))) - seconds))) - -#+win32 -(defun set-socket-send-timeout (socket-fd seconds) - "Set socket option: SNDTIMEO, argument seconds can be a float number. - On win32, you must bind the socket before use this function." - (declare (type integer socket-fd) - (type number seconds)) - (fli:with-dynamic-foreign-objects ((timeout :int)) - (setf (fli:dereference timeout) - (truncate (* 1000 seconds))) - (if (zerop (comm::setsockopt socket-fd - comm::*sockopt_sol_socket* - *sockopt_so_sndtimeo* - (fli:copy-pointer timeout - :type '(:pointer :char)) - (fli:size-of :int))) - seconds))) - -#-win32 -(defun get-socket-receive-timeout (socket-fd) - "Get socket option: RCVTIMEO, return value is a float number" - (declare (type integer socket-fd)) - (fli:with-dynamic-foreign-objects ((timeout (:struct timeval)) - (len :int)) - (comm::getsockopt socket-fd - comm::*sockopt_sol_socket* - *sockopt_so_rcvtimeo* - (fli:copy-pointer timeout - :type '(:pointer :void)) - len) - (fli:with-foreign-slots (tv-sec tv-usec) timeout - (float (+ tv-sec (/ tv-usec 1000000)))))) - -#-win32 -(defun get-socket-send-timeout (socket-fd) - "Get socket option: SNDTIMEO, return value is a float number" - (declare (type integer socket-fd)) - (fli:with-dynamic-foreign-objects ((timeout (:struct timeval)) - (len :int)) - (comm::getsockopt socket-fd - comm::*sockopt_sol_socket* - *sockopt_so_sndtimeo* - (fli:copy-pointer timeout - :type '(:pointer :void)) - len) - (fli:with-foreign-slots (tv-sec tv-usec) timeout - (float (+ tv-sec (/ tv-usec 1000000)))))) - -#+win32 -(defun get-socket-receive-timeout (socket-fd) - "Get socket option: RCVTIMEO, return value is a float number" - (declare (type integer socket-fd)) - (fli:with-dynamic-foreign-objects ((timeout :int) - (len :int)) - (comm::getsockopt socket-fd - comm::*sockopt_sol_socket* - *sockopt_so_rcvtimeo* - (fli:copy-pointer timeout - :type '(:pointer :void)) - len) - (float (/ (fli:dereference timeout) 1000)))) - -#+win32 -(defun get-socket-send-timeout (socket-fd) - "Get socket option: SNDTIMEO, return value is a float number" - (declare (type integer socket-fd)) - (fli:with-dynamic-foreign-objects ((timeout :int) - (len :int)) - (comm::getsockopt socket-fd - comm::*sockopt_sol_socket* - *sockopt_so_sndtimeo* - (fli:copy-pointer timeout - :type '(:pointer :void)) - len) - (float (/ (fli:dereference timeout) 1000)))) - -#+(or lispworks4 lispworks5.0) -(defun set-socket-tcp-nodelay (socket-fd new-value) - "Set socket option: TCP_NODELAY, argument is a fixnum (0 or 1)" - (declare (type integer socket-fd) - (type (integer 0 1) new-value)) - (fli:with-dynamic-foreign-objects ((zero-or-one :int)) - (setf (fli:dereference zero-or-one) new-value) - (when (zerop (comm::setsockopt socket-fd - comm::*sockopt_sol_socket* - comm::*sockopt_tcp_nodelay* - (fli:copy-pointer zero-or-one - :type '(:pointer #+win32 :char #-win32 :void)) - (fli:size-of :int))) - new-value))) - -(defun get-socket-tcp-nodelay (socket-fd) - "Get socket option: TCP_NODELAY, return value is a fixnum (0 or 1)" - (declare (type integer socket-fd)) - (fli:with-dynamic-foreign-objects ((zero-or-one :int) - (len :int)) - (if (zerop (comm::getsockopt socket-fd - comm::*sockopt_sol_socket* - comm::*sockopt_tcp_nodelay* - (fli:copy-pointer zero-or-one - :type '(:pointer #+win32 :char #-win32 :void)) - len)) - zero-or-one 0))) ; on error, return 0 - -(defun initialize-dynamic-sockaddr (hostname service protocol &aux (original-hostname hostname)) - (declare (ignorable original-hostname)) - #+(or lispworks4 lispworks5 lispworks6.0) - (let ((server-addr (fli:allocate-dynamic-foreign-object - :type '(:struct comm::sockaddr_in)))) - (values (comm::initialize-sockaddr_in - server-addr - comm::*socket_af_inet* - hostname - service protocol) - comm::*socket_af_inet* - server-addr - (fli:pointer-element-size server-addr))) - #-(or lispworks4 lispworks5 lispworks6.0) ; version>=6.1 - (progn - (when (stringp hostname) - (setq hostname (comm:string-ip-address hostname)) - (unless hostname - (let ((resolved-hostname (comm:get-host-entry original-hostname :fields '(:address)))) - (unless resolved-hostname - (return-from initialize-dynamic-sockaddr :unknown-host)) - (setq hostname resolved-hostname)))) - (if (or (null hostname) - (integerp hostname) - (comm:ipv6-address-p hostname)) - (let ((server-addr (fli:allocate-dynamic-foreign-object - :type '(:struct comm::lw-sockaddr)))) - (multiple-value-bind (error family) - (comm::initialize-sockaddr_in - server-addr - hostname - service protocol) - (values error family - server-addr - (if (eql family comm::*socket_af_inet*) - (fli:size-of '(:struct comm::sockaddr_in)) - (fli:size-of '(:struct comm::sockaddr_in6)))))) - :bad-host))) - -(defun open-udp-socket (&key local-address local-port read-timeout - (address-family comm::*socket_af_inet*)) - "Open a unconnected UDP socket. - For binding on address ANY(*), just not set LOCAL-ADDRESS (NIL), - for binding on random free unused port, set LOCAL-PORT to 0." - - ;; Note: move (ensure-sockets) here to make sure delivered applications - ;; correctly have networking support initialized. - ;; - ;; Following words was from Martin Simmons, forwarded by Camille Troillard: - - ;; Calling comm::ensure-sockets at load time looks like a bug in Lispworks-udp - ;; (it is too early and also unnecessary). - - ;; The LispWorks comm package calls comm::ensure-sockets when it is needed, so I - ;; think open-udp-socket should probably do it too. Calling it more than once is - ;; safe and it will be very fast after the first time. - #+win32 (comm::ensure-sockets) - - (let ((socket-fd (comm::socket address-family *socket_sock_dgram* *socket_ip_proto_udp*))) - (if socket-fd - (progn - (when read-timeout (set-socket-receive-timeout socket-fd read-timeout)) - (if local-port - (fli:with-dynamic-foreign-objects () - (multiple-value-bind (error local-address-family - client-addr client-addr-length) - (initialize-dynamic-sockaddr local-address local-port "udp") - (if (or error (not (eql address-family local-address-family))) - (progn - (comm::close-socket socket-fd) - (error "cannot resolve hostname ~S, service ~S: ~A" - local-address local-port (or error "address family mismatch"))) - (if (comm::bind socket-fd client-addr client-addr-length) - ;; success, return socket fd - socket-fd - (progn - (comm::close-socket socket-fd) - (error "cannot bind")))))) - socket-fd)) - (error "cannot create socket")))) - -(defun connect-to-udp-server (hostname service - &key local-address local-port read-timeout) - "Something like CONNECT-TO-TCP-SERVER" - (fli:with-dynamic-foreign-objects () - (multiple-value-bind (error address-family server-addr server-addr-length) - (initialize-dynamic-sockaddr hostname service "udp") - (when error - (error "cannot resolve hostname ~S, service ~S: ~A" - hostname service error)) - (let ((socket-fd (open-udp-socket :local-address local-address - :local-port local-port - :read-timeout read-timeout - :address-family address-family))) - (if socket-fd - (if (comm::connect socket-fd server-addr server-addr-length) - ;; success, return socket fd - socket-fd - ;; fail, close socket and return nil - (progn - (comm::close-socket socket-fd) - (error "cannot connect"))) - (error "cannot create socket")))))) - -(defun socket-connect (host port &key (protocol :stream) (element-type 'base-char) - timeout deadline (nodelay t) - local-host local-port) - ;; What's the meaning of this keyword? - (when deadline - (unimplemented 'deadline 'socket-connect)) - - #+(and lispworks4 (not lispworks4.4)) ; < 4.4.5 - (when timeout - (unsupported 'timeout 'socket-connect :minimum "LispWorks 4.4.5")) - - #+lispworks4 - (when local-host - (unsupported 'local-host 'socket-connect :minimum "LispWorks 5.0")) - #+lispworks4 - (when local-port - (unsupported 'local-port 'socket-connect :minimum "LispWorks 5.0")) - - (ecase protocol - (:stream - (let ((hostname (host-to-hostname host)) - (stream)) - (setq stream - (with-mapped-conditions (nil host) - (comm:open-tcp-stream hostname port - :element-type element-type - #-(and lispworks4 (not lispworks4.4)) ; >= 4.4.5 - #-(and lispworks4 (not lispworks4.4)) - :timeout timeout - #-lispworks4 #-lispworks4 - #-lispworks4 #-lispworks4 - :local-address (when local-host (host-to-hostname local-host)) - :local-port local-port - #-(or lispworks4 lispworks5.0) ; >= 5.1 - #-(or lispworks4 lispworks5.0) - :nodelay nodelay))) - - ;; Then handle `nodelay' separately for older versions <= 5.0 - #+(or lispworks4 lispworks5.0) - (when (and stream nodelay) - (set-socket-tcp-nodelay - (comm:socket-stream-socket stream) - (bool->int nodelay))) ; ":if-supported" maps to 1 too. - - (if stream - (make-stream-socket :socket (comm:socket-stream-socket stream) - :stream stream) - ;; if no other error catched by above with-mapped-conditions and still fails, then it's a timeout - (error 'timeout-error)))) - (:datagram - (let ((usocket (make-datagram-socket - (if (and host port) - (with-mapped-conditions (nil host) - (connect-to-udp-server (host-to-hostname host) port - :local-address (and local-host (host-to-hostname local-host)) - :local-port local-port - :read-timeout timeout)) - (with-mapped-conditions (nil local-host) - (open-udp-socket :local-address (and local-host (host-to-hostname local-host)) - :local-port local-port - :read-timeout timeout))) - :connected-p (and host port t)))) - usocket)))) - -(defun socket-listen (host port - &key reuseaddress - (reuse-address nil reuse-address-supplied-p) - (backlog 5) - (element-type 'base-char)) - #+lispworks4.1 - (unsupported 'host 'socket-listen :minimum "LispWorks 4.0 or newer than 4.1") - #+lispworks4.1 - (unsupported 'backlog 'socket-listen :minimum "LispWorks 4.0 or newer than 4.1") - - (let* ((reuseaddress (if reuse-address-supplied-p reuse-address reuseaddress)) - (comm::*use_so_reuseaddr* reuseaddress) - (hostname (host-to-hostname host)) - (socket-res-list (with-mapped-conditions (nil host) - (multiple-value-list - #-lispworks4.1 (comm::create-tcp-socket-for-service - port :address hostname :backlog backlog) - #+lispworks4.1 (comm::create-tcp-socket-for-service port)))) - (sock (if (not (or (second socket-res-list) (third socket-res-list))) - (first socket-res-list) - (when (eq (second socket-res-list) :bind) - (error 'address-in-use-error))))) - (make-stream-server-socket sock :element-type element-type))) - -;; Note: COMM::GET-FD-FROM-SOCKET contains addition socket wait operations, which -;; should NOT be applied on socket FDs who have already been called on W-F-I, -;; so we have to check the %READY-P slot to decide if this waiting is necessary, -;; or SOCKET-ACCEPT will just hang. -- Chun Tian (binghe), May 1, 2011 - -(defmethod socket-accept ((usocket stream-server-usocket) &key element-type) - (let* ((socket (with-mapped-conditions (usocket) - #+win32 - (if (%ready-p usocket) - (comm::accept-connection-to-socket (socket usocket)) - (comm::get-fd-from-socket (socket usocket))) - #-win32 - (comm::get-fd-from-socket (socket usocket)))) - (stream (make-instance 'comm:socket-stream - :socket socket - :direction :io - :element-type (or element-type - (element-type usocket))))) - #+win32 - (when socket - (setf (%ready-p usocket) nil)) - (make-stream-socket :socket socket :stream stream))) - -;; Sockets and their streams are different objects -;; close the stream in order to make sure buffers -;; are correctly flushed and the socket closed. -(defmethod socket-close ((usocket stream-usocket)) - "Close socket." - (close (socket-stream usocket))) - -(defmethod socket-close ((usocket usocket)) - (with-mapped-conditions (usocket) - (comm::close-socket (socket usocket)))) - -(defmethod socket-close :after ((socket datagram-usocket)) - "Additional socket-close method for datagram-usocket" - (setf (%open-p socket) nil)) - -(defconstant +shutdown-read+ 0) -(defconstant +shutdown-write+ 1) -(defconstant +shutdown-read-write+ 2) - -;;; int -;;; shutdown(int socket, int what); -(fli:define-foreign-function (%shutdown "shutdown" :source) - ((socket :int) - (what :int)) - :result-type :int - #+win32 :module - #+win32 "ws2_32") - -(defmethod socket-shutdown ((usocket datagram-usocket) direction) - (unless (member direction '(:input :output :io)) - (error 'invalid-argument-error)) - (let ((what (case direction - (:input +shutdown-read+) - (:output +shutdown-write+) - (:io +shutdown-read-write+)))) - (with-mapped-conditions (usocket) - #-(or lispworks4 lispworks5 lispworks6) ; lispworks 7.0+ - (comm::shutdown (socket usocket) what) - #+(or lispworks4 lispworks5 lispworks6) - (= 0 (%shutdown (socket usocket) what))))) - -(defmethod socket-shutdown ((usocket stream-usocket) direction) - (unless (member direction '(:input :output :io)) - (error 'invalid-argument-error)) - (with-mapped-conditions (usocket) - #-(or lispworks4 lispworks5 lispworks6) - (comm:socket-stream-shutdown (socket usocket) direction) - #+(or lispworks4 lispworks5 lispworks6) - (let ((what (case direction - (:input +shutdown-read+) - (:output +shutdown-write+) - (:io +shutdown-read-write+)))) - (= 0 (%shutdown (comm:socket-stream-socket (socket usocket)) what))))) - -(defmethod initialize-instance :after ((socket datagram-usocket) &key) - (setf (slot-value socket 'send-buffer) - (make-array +max-datagram-packet-size+ - :element-type '(unsigned-byte 8) - :allocation :static)) - (setf (slot-value socket 'recv-buffer) - (make-array +max-datagram-packet-size+ - :element-type '(unsigned-byte 8) - :allocation :static))) - -(defvar *length-of-sockaddr_in* - (fli:size-of '(:struct comm::sockaddr_in))) - -(defmethod socket-send ((usocket datagram-usocket) buffer size &key host port (offset 0) - &aux (socket-fd (socket usocket)) - (message (slot-value usocket 'send-buffer))) ; TODO: multiple threads send together? - "Send message to a socket, using sendto()/send()" - (declare (type integer socket-fd) - (type sequence buffer)) - (when host (setq host (host-to-hostname host))) - (fli:with-dynamic-lisp-array-pointer (ptr message :type '(:unsigned :byte)) - (replace message buffer :start2 offset :end2 (+ offset size)) - (let ((n (if (and host port) - (fli:with-dynamic-foreign-objects () - (multiple-value-bind (error family client-addr client-addr-length) - (initialize-dynamic-sockaddr host port "udp") - (declare (ignore family)) - (when error - (error "cannot resolve hostname ~S, port ~S: ~A" - host port error)) - (%sendto socket-fd ptr (min size +max-datagram-packet-size+) 0 - (fli:copy-pointer client-addr :type '(:struct comm::sockaddr)) - client-addr-length))) - (comm::%send socket-fd ptr (min size +max-datagram-packet-size+) 0)))) - (declare (type fixnum n)) - (if (plusp n) - n - (let ((errno #-win32 (lw:errno-value) - #+win32 (wsa-get-last-error))) - (if (zerop errno) - n - (raise-usock-err errno socket-fd host))))))) - -(defmethod socket-receive ((socket datagram-usocket) buffer length &key timeout (max-buffer-size +max-datagram-packet-size+)) - "Receive message from socket, read-timeout is a float number in seconds. - - This function will return 4 values: - 1. receive buffer - 2. number of receive bytes - 3. remote address - 4. remote port" - (declare (values (simple-array (unsigned-byte 8) (*)) ; buffer - (integer 0) ; size - (unsigned-byte 32) ; host - (unsigned-byte 16)) ; port - (type sequence buffer)) - (let ((socket-fd (socket socket)) - (message (slot-value socket 'recv-buffer)) ; TODO: how multiple threads do this in parallel? - (read-timeout timeout) - old-timeout) - (declare (type integer socket-fd)) - (fli:with-dynamic-foreign-objects ((client-addr (:struct comm::sockaddr_in)) - (len :int - #-(or lispworks4 lispworks5.0) ; <= 5.0 - :initial-element *length-of-sockaddr_in*)) - #+(or lispworks4 lispworks5.0) ; <= 5.0 - (setf (fli:dereference len) *length-of-sockaddr_in*) - (fli:with-dynamic-lisp-array-pointer (ptr message :type '(:unsigned :byte)) - ;; setup new read timeout - (when read-timeout - (setf old-timeout (get-socket-receive-timeout socket-fd)) - (set-socket-receive-timeout socket-fd read-timeout)) - (let ((n (%recvfrom socket-fd ptr max-buffer-size 0 - (fli:copy-pointer client-addr :type '(:struct comm::sockaddr)) - len))) - (declare (type fixnum n)) - ;; restore old read timeout - (when (and read-timeout (/= old-timeout read-timeout)) - (set-socket-receive-timeout socket-fd old-timeout)) - ;; Frank James' patch: reset the %read-p for WAIT-FOR-INPUT - #+win32 (setf (%ready-p socket) nil) - (if (plusp n) - (values (if buffer - (replace buffer message - :end1 (min length max-buffer-size) - :end2 (min n max-buffer-size)) - (subseq message 0 (min n max-buffer-size))) - (min n max-buffer-size) - (comm::ntohl (fli:foreign-slot-value - (fli:foreign-slot-value client-addr - 'comm::sin_addr - :object-type '(:struct comm::sockaddr_in) - :type '(:struct comm::in_addr) - :copy-foreign-object nil) - 'comm::s_addr - :object-type '(:struct comm::in_addr))) - (comm::ntohs (fli:foreign-slot-value client-addr - 'comm::sin_port - :object-type '(:struct comm::sockaddr_in) - :type '(:unsigned :short) - :copy-foreign-object nil))) - (let ((errno #-win32 (lw:errno-value) - #+win32 (wsa-get-last-error))) - (if (zerop errno) - (values nil n 0 0) - (raise-usock-err errno socket-fd))))))))) - -(defmethod get-local-name ((usocket usocket)) - (multiple-value-bind - (address port) - (comm:get-socket-address (socket usocket)) - (values (hbo-to-vector-quad address) port))) - -(defmethod get-peer-name ((usocket stream-usocket)) - (multiple-value-bind - (address port) - (comm:get-socket-peer-address (socket usocket)) - (values (hbo-to-vector-quad address) port))) - -(defmethod get-local-address ((usocket usocket)) - (nth-value 0 (get-local-name usocket))) - -(defmethod get-peer-address ((usocket stream-usocket)) - (nth-value 0 (get-peer-name usocket))) - -(defmethod get-local-port ((usocket usocket)) - (nth-value 1 (get-local-name usocket))) - -(defmethod get-peer-port ((usocket stream-usocket)) - (nth-value 1 (get-peer-name usocket))) - -#-(or lispworks4 lispworks5 lispworks6.0) ; version>= 6.1 -(defun ipv6-address-p (hostname) - (when (stringp hostname) - (setq hostname (comm:string-ip-address hostname)) - (unless hostname - (let ((resolved-hostname (comm:get-host-entry hostname :fields '(:address)))) - (unless resolved-hostname - (return-from ipv6-address-p nil)) - (setq hostname resolved-hostname)))) - (comm:ipv6-address-p hostname)) - -(defun lw-hbo-to-vector-quad (hbo) - #+(or lispworks4 lispworks5 lispworks6.0) - (hbo-to-vector-quad hbo) - #-(or lispworks4 lispworks5 lispworks6.0) ; version>= 6.1 - (if (comm:ipv6-address-p hbo) - (ipv6-host-to-vector (comm:ipv6-address-string hbo)) - (hbo-to-vector-quad hbo))) - -(defun get-hosts-by-name (name) - (with-mapped-conditions (nil name) - (mapcar #'lw-hbo-to-vector-quad - (comm:get-host-entry name :fields '(:addresses))))) - -(defun get-host-by-address (address) - (with-mapped-conditions (nil address) - nil)) ;; TODO - -(defun os-socket-handle (usocket) - (socket usocket)) - -(defun usocket-listen (usocket) - (if (stream-usocket-p usocket) - (when (listen (socket-stream usocket)) - usocket) - (when (comm::socket-listen (socket usocket)) - usocket))) - -;;; -;;; Non Windows implementation -;;; The Windows implementation needs to resort to the Windows API in order -;;; to achieve what we want (what we want is waiting without busy-looping) -;;; - -#-win32 -(progn - - (defun %setup-wait-list (wait-list) - (declare (ignore wait-list))) - - (defun %add-waiter (wait-list waiter) - (declare (ignore wait-list waiter))) - - (defun %remove-waiter (wait-list waiter) - (declare (ignore wait-list waiter))) - - (defun wait-for-input-internal (wait-list &key timeout) - (with-mapped-conditions () - ;; unfortunately, it's impossible to share code between - ;; non-win32 and win32 platforms... - ;; Can we have a sane -pref. complete [UDP!?]- API next time, please? - (dolist (x (wait-list-waiters wait-list)) - (mp:notice-fd (os-socket-handle x))) - (labels ((wait-function (socks) - (let (rv) - (dolist (x socks rv) - (when (usocket-listen x) - (setf (state x) :READ - rv t)))))) - (if timeout - (mp:process-wait-with-timeout "Waiting for a socket to become active" - (truncate timeout) - #'wait-function - (wait-list-waiters wait-list)) - (mp:process-wait "Waiting for a socket to become active" - #'wait-function - (wait-list-waiters wait-list)))) - (dolist (x (wait-list-waiters wait-list)) - (mp:unnotice-fd (os-socket-handle x))) - wait-list)) - -) ; end of block - - -;;; -;;; The Windows side of the story -;;; We want to wait without busy looping -;;; This code only works in threads which don't have (hidden) -;;; windows which need to receive messages. There are workarounds in the Windows API -;;; but are those available to 'us'. -;;; - - -#+win32 -(progn - - ;; LispWorks doesn't provide an interface to wait for a socket - ;; to become ready (under Win32, that is) meaning that we need - ;; to resort to system calls to achieve the same thing. - ;; Luckily, it provides us access to the raw socket handles (as we - ;; wrote the code above. - - (defconstant fd-read 1) - (defconstant fd-read-bit 0) - (defconstant fd-write 2) - (defconstant fd-write-bit 1) - (defconstant fd-oob 4) - (defconstant fd-oob-bit 2) - (defconstant fd-accept 8) - (defconstant fd-accept-bit 3) - (defconstant fd-connect 16) - (defconstant fd-connect-bit 4) - (defconstant fd-close 32) - (defconstant fd-close-bit 5) - (defconstant fd-qos 64) - (defconstant fd-qos-bit 6) - (defconstant fd-group-qos 128) - (defconstant fd-group-qos-bit 7) - (defconstant fd-routing-interface 256) - (defconstant fd-routing-interface-bit 8) - (defconstant fd-address-list-change 512) - (defconstant fd-address-list-change-bit 9) - - (defconstant fd-max-events 10) - - (defconstant fionread 1074030207) - - - ;; Note: - ;; - ;; If special finalization has to occur for a given - ;; system resource (handle), an associated object should - ;; be created. A special cleanup action should be added - ;; to the system and a special cleanup action should - ;; be flagged on all objects created for resources like it - ;; - ;; We have 2 functions to do so: - ;; * hcl:add-special-free-action (function-symbol) - ;; * hcl:flag-special-free-action (object) - ;; - ;; Note that the special free action will be called on all - ;; objects which have been flagged for special free, so be - ;; sure to check for the right argument type! - - (fli:define-foreign-type ws-socket () '(:unsigned :int)) - (fli:define-foreign-type win32-handle () '(:unsigned :int)) - (fli:define-c-struct wsa-network-events - (network-events :long) - (error-code (:c-array :int 10))) - - (fli:define-foreign-function (wsa-event-create "WSACreateEvent" :source) - () - :lambda-list nil - :result-type :int - :module "ws2_32") - - (fli:define-foreign-function (wsa-event-close "WSACloseEvent" :source) - ((event-object win32-handle)) - :result-type :int - :module "ws2_32") - - ;; not used - (fli:define-foreign-function (wsa-reset-event "WSAResetEvent" :source) - ((event-object win32-handle)) - :result-type :int - :module "ws2_32") - - (fli:define-foreign-function (wsa-enum-network-events "WSAEnumNetworkEvents" :source) - ((socket ws-socket) - (event-object win32-handle) - (network-events (:reference-return wsa-network-events))) - :result-type :int - :module "ws2_32") - - (fli:define-foreign-function (wsa-event-select "WSAEventSelect" :source) - ((socket ws-socket) - (event-object win32-handle) - (network-events :long)) - :result-type :int - :module "ws2_32") - - (fli:define-foreign-function (wsa-get-last-error "WSAGetLastError" :source) - () - :result-type :int - :module "ws2_32") - - (fli:define-foreign-function (wsa-ioctlsocket "ioctlsocket" :source) - ((socket :long) (cmd :long) (argp (:ptr :long))) - :result-type :int - :module "ws2_32") - - - ;; The Windows system - - - ;; Now that we have access to the system calls, this is the plan: - - ;; 1. Receive a wait-list with associated sockets to wait for - ;; 2. Add all those sockets to an event handle - ;; 3. Listen for an event on that handle (we have a LispWorks system:: internal for that) - ;; 4. After listening, detect if there are errors - ;; (this step is different from Unix, where we can have only one error) - ;; 5. If so, raise one of them - ;; 6. If not so, return the sockets which have input waiting for them - - - (defun maybe-wsa-error (rv &optional socket) - (unless (zerop rv) - (raise-usock-err (wsa-get-last-error) socket))) - - (defun bytes-available-for-read (socket) - (fli:with-dynamic-foreign-objects ((int-ptr :long)) - (let ((rv (wsa-ioctlsocket (os-socket-handle socket) fionread int-ptr))) - (if (= 0 rv) - (fli:dereference int-ptr) - 0)))) - - (defun socket-ready-p (socket) - (if (typep socket 'stream-usocket) - (< 0 (bytes-available-for-read socket)) - (%ready-p socket))) - - (defun waiting-required (sockets) - (notany #'socket-ready-p sockets)) - - (defun wait-for-input-internal (wait-list &key timeout) - (when (waiting-required (wait-list-waiters wait-list)) - (system:wait-for-single-object (wait-list-%wait wait-list) - "Waiting for socket activity" timeout)) - (update-ready-and-state-slots wait-list)) - - (defun map-network-events (func network-events) - (let ((event-map (fli:foreign-slot-value network-events 'network-events)) - (error-array (fli:foreign-slot-pointer network-events 'error-code))) - (unless (zerop event-map) - (dotimes (i fd-max-events) - (unless (zerop (ldb (byte 1 i) event-map)) ;;### could be faster with ash and logand? - (funcall func (fli:foreign-aref error-array i))))))) - - (defun update-ready-and-state-slots (wait-list) - (loop with sockets = (wait-list-waiters wait-list) - for socket in sockets do - (if (or (and (stream-usocket-p socket) - (listen (socket-stream socket))) - (%ready-p socket)) - (setf (state socket) :READ) - (multiple-value-bind - (rv network-events) - (wsa-enum-network-events (os-socket-handle socket) - (wait-list-%wait wait-list) - t) - (if (zerop rv) - (map-network-events #'(lambda (err-code) - (if (zerop err-code) - (setf (%ready-p socket) t - (state socket) :READ) - (raise-usock-err err-code socket))) - network-events) - (maybe-wsa-error rv socket)))))) - - ;; The wait-list part - - (defun free-wait-list (wl) - (when (wait-list-p wl) - (unless (null (wait-list-%wait wl)) - (wsa-event-close (wait-list-%wait wl)) - (setf (wait-list-%wait wl) nil)))) - - (eval-when (:load-toplevel :execute) - (hcl:add-special-free-action 'free-wait-list)) - - (defun %setup-wait-list (wait-list) - (hcl:flag-special-free-action wait-list) - (setf (wait-list-%wait wait-list) (wsa-event-create))) - - (defun %add-waiter (wait-list waiter) - (let ((events (etypecase waiter - (stream-server-usocket (logior fd-connect fd-accept fd-close)) - (stream-usocket (logior fd-connect fd-read fd-oob fd-close)) - (datagram-usocket (logior fd-read))))) - (maybe-wsa-error - (wsa-event-select (os-socket-handle waiter) (wait-list-%wait wait-list) events) - waiter))) - - (defun %remove-waiter (wait-list waiter) - (maybe-wsa-error - (wsa-event-select (os-socket-handle waiter) (wait-list-%wait wait-list) 0) - waiter)) - -) ; end of WIN32-block - -(defun set-socket-reuse-address (socket-fd reuse-address-p) - (declare (type integer socket-fd) - (type boolean reuse-address-p)) - (fli:with-dynamic-foreign-objects ((value :int)) - (setf (fli:dereference value) (if reuse-address-p 1 0)) - (if (zerop (comm::setsockopt socket-fd - comm::*sockopt_sol_socket* - comm::*sockopt_so_reuseaddr* - (fli:copy-pointer value - :type '(:pointer :void)) - (fli:size-of :int))) - reuse-address-p))) - -(defun get-socket-reuse-address (socket-fd) - (declare (type integer socket-fd)) - (fli:with-dynamic-foreign-objects ((value :int) (len :int)) - (if (zerop (comm::getsockopt socket-fd - comm::*sockopt_sol_socket* - comm::*sockopt_so_reuseaddr* - (fli:copy-pointer value - :type '(:pointer :void)) - len)) - (= 1 (fli:dereference value))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/mcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/mcl.lisp deleted file mode 100644 index e62103c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/mcl.lisp +++ /dev/null @@ -1,271 +0,0 @@ -;; MCL backend for USOCKET 0.4.1 -;; Terje Norderhaug , January 1, 2009 - -(in-package :usocket) - -(defun handle-condition (condition &optional socket (host-or-ip nil)) - ; incomplete, needs to handle additional conditions - (flet ((raise-error (&optional socket-condition host-or-ip) - (if socket-condition - (cond ((typep socket-condition ns-error) - (error socket-condition :socket socket :host-or-ip host-or-ip)) - (t - (error socket-condition :socket socket))) - (error 'unknown-error :socket socket :real-error condition)))) - (typecase condition - (ccl:host-stopped-responding - (raise-error 'host-down-error host-or-ip)) - (ccl:host-not-responding - (raise-error 'host-unreachable-error host-or-ip)) - (ccl:connection-reset - (raise-error 'connection-reset-error)) - (ccl:connection-timed-out - (raise-error 'timeout-error)) - (ccl:opentransport-protocol-error - (raise-error 'protocol-not-supported-error)) - (otherwise - (raise-error condition host-or-ip))))) - -(defun socket-connect (host port &key (element-type 'character) timeout deadline nodelay - local-host local-port (protocol :stream)) - (when (eq nodelay :if-supported) - (setf nodelay t)) - (ecase protocol - (:stream - (with-mapped-conditions (nil host) - (let* ((socket - (make-instance 'active-socket - :remote-host (when host (host-to-hostname host)) - :remote-port port - :local-host (when local-host (host-to-hostname local-host)) - :local-port local-port - :deadline deadline - :nodelay nodelay - :connect-timeout (and timeout (round (* timeout 60))) - :element-type element-type)) - (stream (socket-open-stream socket))) - (make-stream-socket :socket socket :stream stream)))) - (:datagram - (with-mapped-conditions (nil (or host local-host)) - (make-datagram-socket - (ccl::open-udp-socket :local-address (and local-host (host-to-hbo local-host)) - :local-port local-port)))))) - -(defun socket-listen (host port - &key reuseaddress - (reuse-address nil reuse-address-supplied-p) - (backlog 5) - (element-type 'character)) - (let* ((reuseaddress (if reuse-address-supplied-p reuse-address reuseaddress)) - (socket (with-mapped-conditions () - (make-instance 'passive-socket - :local-port port - :local-host (host-to-hbo host) - :reuse-address reuseaddress - :backlog backlog)))) - (make-stream-server-socket socket :element-type element-type))) - -(defmethod socket-accept ((usocket stream-server-usocket) &key element-type) - (let* ((socket (socket usocket)) - (stream (with-mapped-conditions (usocket) - (socket-accept socket :element-type element-type)))) - (make-stream-socket :socket socket :stream stream))) - -(defmethod socket-close ((usocket usocket)) - (with-mapped-conditions (usocket) - (socket-close (socket usocket)))) - -(defmethod socket-shutdown ((usocket usocket) direction) - (declare (ignore usocket direction)) - ;; As far as I can tell there isn't a way to shutdown a socket in mcl. - (unsupported "shutdown" 'socket-shutdown)) - -(defmethod ccl::stream-close ((usocket usocket)) - (socket-close usocket)) - -(defun get-hosts-by-name (name) - (with-mapped-conditions (nil name) - (list (hbo-to-vector-quad (ccl::get-host-address - (host-to-hostname name)))))) - -(defun get-host-by-address (address) - (with-mapped-conditions (nil address) - (ccl::inet-host-name (host-to-hbo address)))) - -(defmethod get-local-name ((usocket usocket)) - (values (get-local-address usocket) - (get-local-port usocket))) - -(defmethod get-peer-name ((usocket stream-usocket)) - (values (get-peer-address usocket) - (get-peer-port usocket))) - -(defmethod get-local-address ((usocket usocket)) - (hbo-to-vector-quad (ccl::get-host-address (or (local-host (socket usocket)) "")))) - -(defmethod get-local-port ((usocket usocket)) - (local-port (socket usocket))) - -(defmethod get-peer-address ((usocket stream-usocket)) - (hbo-to-vector-quad (ccl::get-host-address (remote-host (socket usocket))))) - -(defmethod get-peer-port ((usocket stream-usocket)) - (remote-port (socket usocket))) - -(defun %setup-wait-list (wait-list) - (declare (ignore wait-list))) - -(defun %add-waiter (wait-list waiter) - (declare (ignore wait-list waiter))) - -(defun %remove-waiter (wait-list waiter) - (declare (ignore wait-list waiter))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; BASIC MCL SOCKET IMPLEMENTATION - -(defclass socket () - ((local-port :reader local-port :initarg :local-port) - (local-host :reader local-host :initarg :local-host) - (element-type :reader element-type :initform 'ccl::base-character :initarg :element-type))) - -(defclass active-socket (socket) - ((remote-host :reader remote-host :initarg :remote-host) - (remote-port :reader remote-port :initarg :remote-port) - (deadline :initarg :deadline) - (nodelay :initarg :nodelay) - (connect-timeout :reader connect-timeout :initform NIL :initarg :connect-timeout - :type (or null fixnum) :documentation "ticks (60th of a second)"))) - -(defmethod socket-open-stream ((socket active-socket)) - (ccl::open-tcp-stream (or (remote-host socket)(ccl::local-interface-ip-address)) (remote-port socket) - :element-type (if (subtypep (element-type socket) 'character) 'ccl::base-character 'unsigned-byte) - :connect-timeout (connect-timeout socket))) - -(defmethod socket-close ((socket active-socket)) - NIL) - -(defclass passive-socket (socket) - ((streams :accessor socket-streams :type list :initform NIL - :documentation "Circular list of streams with first element the next to open") - (reuse-address :reader reuse-address :initarg :reuse-address) - (lock :reader socket-lock :initform (ccl:make-lock "Socket")))) - -(defmethod initialize-instance :after ((socket passive-socket) &key backlog) - (loop repeat backlog - collect (socket-open-listener socket) into streams - finally (setf (socket-streams socket) - (cdr (rplacd (last streams) streams)))) - (when (zerop (local-port socket)) - (setf (slot-value socket 'local-port) - (or (ccl::process-wait-with-timeout "binding port" (* 10 60) - #'ccl::stream-local-port (car (socket-streams socket))) - (error "timeout"))))) - -(defmethod socket-accept ((socket passive-socket) &key element-type &aux (lock (socket-lock socket))) - (flet ((connection-established-p (stream) - (ccl::with-io-buffer-locked ((ccl::stream-io-buffer stream nil)) - (let ((state (ccl::opentransport-stream-connection-state stream))) - (not (eq :unbnd state)))))) - (with-mapped-conditions () - (ccl:with-lock-grabbed (lock nil "Socket Lock") - (let ((connection (shiftf (car (socket-streams socket)) - (socket-open-listener socket element-type)))) - (pop (socket-streams socket)) - (ccl:process-wait "Accepting" #'connection-established-p connection) - connection))))) - -(defmethod socket-close ((socket passive-socket)) - (loop - with streams = (socket-streams socket) - for (stream tail) on streams - do (close stream :abort T) - until (eq tail streams) - finally (setf (socket-streams socket) NIL))) - -(defmethod socket-open-listener (socket &optional element-type) - ; see http://code.google.com/p/mcl/issues/detail?id=28 - (let* ((ccl::*passive-interface-address* (local-host socket)) - (new (ccl::open-tcp-stream NIL (or (local-port socket) #$kOTAnyInetAddress) - :reuse-local-port-p (reuse-address socket) - :element-type (if (subtypep (or element-type (element-type socket)) - 'character) - 'ccl::base-character - 'unsigned-byte)))) - (declare (special ccl::*passive-interface-address*)) - new)) - -(defmethod input-available-p ((stream ccl::opentransport-stream)) - (macrolet ((when-io-buffer-lock-grabbed ((lock &optional multiple-value-p) &body body) - "Evaluates the body if and only if the lock is successfully grabbed" - ;; like with-io-buffer-lock-grabbed but returns immediately instead of polling the lock - (let ((needs-unlocking-p (gensym)) - (lock-var (gensym))) - `(let* ((,lock-var ,lock) - (ccl::*grabbed-io-buffer-locks* (cons ,lock-var ccl::*grabbed-io-buffer-locks*)) - (,needs-unlocking-p (needs-unlocking-p ,lock-var))) - (declare (dynamic-extent ccl::*grabbed-io-buffer-locks*)) - (when ,needs-unlocking-p - (,(if multiple-value-p 'multiple-value-prog1 'prog1) - (progn ,@body) - (ccl::%release-io-buffer-lock ,lock-var))))))) - (labels ((needs-unlocking-p (lock) - (declare (type ccl::lock lock)) - ;; crucial - clears bogus lock.value as in grab-io-buffer-lock-out-of-line: - (ccl::%io-buffer-lock-really-grabbed-p lock) - (ccl:store-conditional lock nil ccl:*current-process*))) - "similar to stream-listen on buffered-input-stream-mixin but without waiting for lock" - (let ((io-buffer (ccl::stream-io-buffer stream))) - (or (not (eql 0 (ccl::io-buffer-incount io-buffer))) - (ccl::io-buffer-untyi-char io-buffer) - (locally (declare (optimize (speed 3) (safety 0))) - (when-io-buffer-lock-grabbed ((ccl::io-buffer-lock io-buffer)) - (funcall (ccl::io-buffer-listen-function io-buffer) stream io-buffer)))))))) - -(defmethod connection-established-p ((stream ccl::opentransport-stream)) - (ccl::with-io-buffer-locked ((ccl::stream-io-buffer stream nil)) - (let ((state (ccl::opentransport-stream-connection-state stream))) - (not (eq :unbnd state))))) - -(defun wait-for-input-internal (wait-list &key timeout &aux result) - (labels ((ready-sockets (sockets) - (dolist (sock sockets result) - (when (cond ((stream-usocket-p sock) - (input-available-p (socket-stream sock))) - ((stream-server-usocket-p sock) - (let ((ot-stream (first (socket-streams (socket sock))))) - (or (input-available-p ot-stream) - (connection-established-p ot-stream))))) - (push sock result))))) - (with-mapped-conditions () - (ccl:process-wait-with-timeout - "socket input" - (when timeout (truncate (* timeout 60))) - #'ready-sockets - (wait-list-waiters wait-list))) - (nreverse result))) - -;;; datagram socket methods - -(defmethod initialize-instance :after ((usocket datagram-usocket) &key) - (with-slots (socket send-buffer recv-buffer) usocket - (setq send-buffer - (ccl::make-TUnitData (ccl::ot-conn-endpoint socket))) - (setq recv-buffer - (ccl::make-TUnitData (ccl::ot-conn-endpoint socket))))) - -(defmethod socket-send ((usocket datagram-usocket) buffer size &key host port (offset 0)) - (with-mapped-conditions (usocket host) - (with-slots (socket send-buffer) usocket - (unless (and host port) - (unsupported 'host 'socket-send)) - (ccl::send-message socket send-buffer buffer size host port offset)))) - -(defmethod socket-receive ((usocket datagram-usocket) buffer length &key) - (with-mapped-conditions (usocket) - (with-slots (socket recv-buffer) usocket - (ccl::receive-message socket recv-buffer buffer length)))) - -(defmethod socket-close ((socket datagram-usocket)) - nil) ; TODO diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/mezzano.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/mezzano.lisp deleted file mode 100644 index 225c77d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/mezzano.lisp +++ /dev/null @@ -1,99 +0,0 @@ -;;;; -*- Mode: Common-Lisp -*- - -;;;; See LICENSE for licensing information. - -(in-package :usocket) - -(defun handle-condition (condition &optional (socket nil)) - (typecase condition - ;; TODO: Add additional conditions as appropriate - (mezzano.network.tcp:connection-timed-out - (error 'timeout-error :socket socket)))) - -(defun socket-connect (host port &key (protocol :stream) element-type - timeout deadline (nodelay nil nodelay-p) - local-host local-port) - (declare (ignore local-host local-port)) - (when deadline - (unsupported 'deadline 'socket-connect)) - (when (and nodelay-p (not (eq nodelay :if-supported))) - (unsupported 'nodelay 'socket-connect)) - (when timeout - (unsupported 'timeout 'socket-connect)) - (with-mapped-conditions () - (ecase protocol - (:stream - (let ((s (mezzano.network.tcp:tcp-stream-connect host port :element-type element-type))) - (make-stream-socket :socket s - :stream s))) - (:datagram - ;; TODO: - (unsupported 'datagram 'socket-connect))))) - -(defun socket-listen (host port &key reuseaddress - (reuse-address nil reuse-address-supplied-p) - (backlog 5) - (element-type 'character)) - (declare (ignore reuseaddress reuse-address reuse-address-supplied-p)) - (let ((ip (mezzano.network.ip:make-ipv4-address host))) - (make-stream-server-socket (mezzano.network.tcp:tcp-listen ip port :backlog backlog) - :element-type element-type))) - -(defun get-hosts-by-name (name) - (declare (ignore name))) - -(defun get-host-by-address (address) - (declare (ignore address))) - -(defun %setup-wait-list (wait-list) - (declare (ignore wait-list))) - -(defun %add-waiter (wait-list waiter) - (declare (ignore wait-list waiter))) - -(defun %remove-waiter (wait-list waiter) - (declare (ignore wait-list waiter))) - -(defun wait-for-input-internal (wait-list &key timeout) - (declare (ignore wait-list timeout))) - -(defmethod socket-close ((usocket stream-usocket)) - (with-mapped-conditions () - (close (socket-stream usocket)))) - -(defmethod socket-close ((usocket stream-server-usocket)) - (with-mapped-conditions () - (mezzano.network.tcp:close-tcp-listener (socket usocket)))) - -(defmethod socket-accept ((usocket stream-server-usocket) &key element-type) - (declare (ignore element-type)) - (with-mapped-conditions (usocket) - (let ((s (mezzano.network.tcp:tcp-accept (socket usocket)))) - (make-stream-socket :socket s - :stream s)))) - -(defmethod get-local-name ((usocket stream-usocket)) - (values (get-local-address usocket) - (get-local-port usocket))) - -(defmethod get-peer-name ((usocket stream-usocket)) - (values (get-peer-address usocket) - (get-peer-port usocket))) - -(defmethod get-local-address ((usocket stream-usocket)) - (mezzano.network.ip:ipv4-address-to-string - (mezzano.network.tcp:tcp-connection-local-ip - (mezzano.network.tcp:tcp-stream-connection (socket usocket))))) - -(defmethod get-local-port ((usocket stream-usocket)) - (mezzano.network.tcp:tcp-connection-local-port - (mezzano.network.tcp:tcp-stream-connection (socket usocket)))) - -(defmethod get-peer-address ((usocket stream-usocket)) - (mezzano.network.ip:ipv4-address-to-string - (mezzano.network.tcp:tcp-connection-remote-ip - (mezzano.network.tcp:tcp-stream-connection (socket usocket))))) - -(defmethod get-peer-port ((usocket stream-usocket)) - (mezzano.network.tcp:tcp-connection-remote-port - (mezzano.network.tcp:tcp-stream-connection (socket usocket)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/mocl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/mocl.lisp deleted file mode 100644 index 1157b0d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/mocl.lisp +++ /dev/null @@ -1,155 +0,0 @@ -;;;; See LICENSE for licensing information. - -(in-package :usocket) - -(defun handle-condition (condition &optional (socket nil) (host-or-ip nil)) - "Dispatch correct usocket condition." - (declare (ignore socket)) - (signal condition)) - -(defun socket-connect (host port &key (protocol :stream) (element-type 'character) - timeout deadline (nodelay t nodelay-specified) - (local-host nil local-host-p) - (local-port nil local-port-p)) - (when (and nodelay-specified - (not (eq nodelay :if-supported))) - (unsupported 'nodelay 'socket-connect)) - (when deadline (unsupported 'deadline 'socket-connect)) - (when timeout (unimplemented 'timeout 'socket-connect)) - (when local-host-p - (unimplemented 'local-host 'socket-connect)) - (when local-port-p - (unimplemented 'local-port 'socket-connect)) - - (let (socket) - (ecase protocol - (:stream - (setf socket (rt::socket-connect host port)) - (let ((stream (rt::make-socket-stream socket :binaryp (not (eq element-type 'character))))) - (make-stream-socket :socket socket :stream stream))) - (:datagram - (error 'unsupported - :feature '(protocol :datagram) - :context 'socket-connect))))) - -(defun socket-listen (host port - &key reuseaddress - (reuse-address nil reuse-address-supplied-p) - (backlog 5) - (element-type 'character)) - (unimplemented 'socket-listen 'mocl)) - -(defmethod socket-accept ((usocket stream-server-usocket) &key element-type) - (unimplemented 'socket-accept 'mocl)) - -;; Sockets and their associated streams are modelled as -;; different objects. Be sure to close the socket stream -;; when closing stream-sockets; it makes sure buffers -;; are flushed and the socket is closed correctly afterwards. -(defmethod socket-close ((usocket usocket)) - "Close socket." - (rt::socket-shutdown usocket) - (rt::c-fclose usocket)) - -(defmethod socket-close ((usocket stream-usocket)) - "Close socket." - (close (socket-stream usocket))) - -;; (defmethod socket-close :after ((socket datagram-usocket)) -;; (setf (%open-p socket) nil)) - -(defmethod socket-shutdown ((usocket stream-usocket) direction) - (declare (ignore usocket direction)) - ;; sure would be nice if there was some documentation for mocl... - (unimplemented "shutdown" 'socket-shutdown)) - -;; (defmethod socket-send ((usocket datagram-usocket) buffer size &key host port) -;; (let ((s (socket usocket)) -;; (host (if host (host-to-hbo host))) -;; (real-buffer (if (zerop offset) -;; buffer -;; (subseq buffer offset (+ offset size))))) -;; (multiple-value-bind (result errno) -;; (ext:inet-socket-send-to s real-buffer size -;; :remote-host host :remote-port port) -;; (or result -;; (mocl-map-socket-error errno :socket usocket))))) - -;; (defmethod socket-receive ((socket datagram-usocket) buffer length &key) -;; (declare (values (simple-array (unsigned-byte 8) (*)) ; buffer -;; (integer 0) ; size -;; (unsigned-byte 32) ; host -;; (unsigned-byte 16))) ; port -;; (let ((s (socket socket))) -;; (let ((real-buffer (or buffer -;; (make-array length :element-type '(unsigned-byte 8)))) -;; (real-length (or length -;; (length buffer)))) -;; (multiple-value-bind (result errno remote-host remote-port) -;; (ext:inet-socket-receive-from s real-buffer real-length) -;; (if result -;; (values real-buffer result remote-host remote-port) -;; (mocl-map-socket-error errno :socket socket)))))) - -;; (defmethod get-local-name ((usocket usocket)) -;; (multiple-value-bind (address port) -;; (with-mapped-conditions (usocket) -;; (ext:get-socket-host-and-port (socket usocket))) -;; (values (hbo-to-vector-quad address) port))) - -;; (defmethod get-peer-name ((usocket stream-usocket)) -;; (multiple-value-bind (address port) -;; (with-mapped-conditions (usocket) -;; (ext:get-peer-host-and-port (socket usocket))) -;; (values (hbo-to-vector-quad address) port))) - -;; (defmethod get-local-address ((usocket usocket)) -;; (nth-value 0 (get-local-name usocket))) - -;; (defmethod get-peer-address ((usocket stream-usocket)) -;; (nth-value 0 (get-peer-name usocket))) - -;; (defmethod get-local-port ((usocket usocket)) -;; (nth-value 1 (get-local-name usocket))) - -;; (defmethod get-peer-port ((usocket stream-usocket)) -;; (nth-value 1 (get-peer-name usocket))) - - -;; (defun get-host-by-address (address) -;; (multiple-value-bind (host errno) -;; (ext:lookup-host-entry (host-byte-order address)) -;; (cond (host -;; (ext:host-entry-name host)) -;; (t -;; (let ((condition (cdr (assoc errno +unix-ns-error-map+)))) -;; (cond (condition -;; (error condition :host-or-ip address)) -;; (t -;; (error 'ns-unknown-error :host-or-ip address -;; :real-error errno)))))))) - -(defun get-hosts-by-name (name) - (rt::lookup-host name)) - -;; (defun get-host-name () -;; (unix:unix-gethostname)) - - -;; -;; -;; WAIT-LIST part -;; - - -(defun %add-waiter (wl waiter) - (declare (ignore wl waiter))) - -(defun %remove-waiter (wl waiter) - (declare (ignore wl waiter))) - -(defun %setup-wait-list (wl) - (declare (ignore wl))) - -(defun wait-for-input-internal (wait-list &key timeout) - (unimplemented 'wait-for-input-internal 'mocl)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/openmcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/openmcl.lisp deleted file mode 100644 index 113692d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/openmcl.lisp +++ /dev/null @@ -1,268 +0,0 @@ -;;;; See LICENSE for licensing information. - -(in-package :usocket) - -(defun get-host-name () - (ccl::%stack-block ((resultbuf 256)) - (when (zerop (#_gethostname resultbuf 256)) - (ccl::%get-cstring resultbuf)))) - -(defparameter +openmcl-error-map+ - '((:address-in-use . address-in-use-error) - (:connection-aborted . connection-aborted-error) - (:no-buffer-space . no-buffers-error) - (:connection-timed-out . timeout-error) - (:connection-refused . connection-refused-error) - (:host-unreachable . host-unreachable-error) - (:host-down . host-down-error) - (:network-down . network-down-error) - (:address-not-available . address-not-available-error) - (:network-reset . network-reset-error) - (:connection-reset . connection-reset-error) - (:shutdown . shutdown-error) - (:access-denied . operation-not-permitted-error))) - -(defparameter +openmcl-nameserver-error-map+ - '((:no-recovery . ns-no-recovery-error) - (:try-again . ns-try-again-condition) - (:host-not-found . ns-host-not-found-error))) - -;; we need something which the openmcl implementors 'forgot' to do: -;; wait for more than one socket-or-fd - -(defun input-available-p (sockets &optional ticks-to-wait) - (ccl::rletz ((tv :timeval)) - (ccl::ticks-to-timeval ticks-to-wait tv) - ;;### The trickery below can be moved to the wait-list now... - (ccl::%stack-block ((infds ccl::*fd-set-size*)) - (ccl::fd-zero infds) - (let ((max-fd -1)) - (dolist (sock sockets) - (let ((fd (openmcl-socket:socket-os-fd (socket sock)))) - (when fd ;; may be NIL if closed - (setf max-fd (max max-fd fd)) - (ccl::fd-set fd infds)))) - (let ((res (#_select (1+ max-fd) - infds (ccl::%null-ptr) (ccl::%null-ptr) - (if ticks-to-wait tv (ccl::%null-ptr))))) - (when (> res 0) - (dolist (sock sockets) - (let ((fd (openmcl-socket:socket-os-fd (socket sock)))) - (when (and fd (ccl::fd-is-set fd infds)) - (setf (state sock) :READ))))) - sockets))))) - -(defun raise-error-from-id (condition-id socket real-condition) - (let ((usock-err (cdr (assoc condition-id +openmcl-error-map+)))) - (if usock-err - (error usock-err :socket socket) - (error 'unknown-error :socket socket :real-error real-condition)))) - -(defun handle-condition (condition &optional socket (host-or-ip nil)) - (typecase condition - (openmcl-socket:socket-error - (raise-error-from-id (openmcl-socket:socket-error-identifier condition) - socket condition)) - (ccl:input-timeout - (error 'timeout-error :socket socket)) - (ccl:communication-deadline-expired - (error 'deadline-timeout-error :socket socket)) - (ccl::socket-creation-error #| ugh! |# - (let* ((condition-id (ccl::socket-creation-error-identifier condition)) - (nameserver-error (cdr (assoc condition-id - +openmcl-nameserver-error-map+)))) - (if nameserver-error - (if (typep nameserver-error 'serious-condition) - (error nameserver-error :host-or-ip host-or-ip) - (signal nameserver-error :host-or-ip host-or-ip)) - (raise-error-from-id condition-id socket condition)))))) - -(defun to-format (element-type protocol) - (cond ((null element-type) - (ecase protocol ; default value of different protocol - (:stream :text) - (:datagram :binary))) - ((subtypep element-type 'character) - :text) - (t :binary))) - -#-ipv6 -(defun socket-connect (host port &key (protocol :stream) element-type - timeout deadline nodelay - local-host local-port) - (when (eq nodelay :if-supported) - (setf nodelay t)) - (with-mapped-conditions (nil host) - (ecase protocol - (:stream - (let ((mcl-sock - (openmcl-socket:make-socket :remote-host (host-to-hostname host) - :remote-port port - :local-host local-host - :local-port local-port - :format (to-format element-type protocol) - :external-format ccl:*default-external-format* - :deadline deadline - :nodelay nodelay - :connect-timeout timeout))) - (make-stream-socket :stream mcl-sock :socket mcl-sock))) - (:datagram - (let* ((mcl-sock - (openmcl-socket:make-socket :address-family :internet - :type :datagram - :local-host local-host - :local-port local-port - :input-timeout timeout - :format (to-format element-type protocol) - :external-format ccl:*default-external-format*)) - (usocket (make-datagram-socket mcl-sock))) - (when (and host port) - (ccl::inet-connect (ccl::socket-device mcl-sock) - (ccl::host-as-inet-host host) - (ccl::port-as-inet-port port "udp"))) - (setf (connected-p usocket) t) - usocket))))) - -#-ipv6 -(defun socket-listen (host port - &key reuseaddress - (reuse-address nil reuse-address-supplied-p) - (backlog 5) - (element-type 'character)) - (let* ((reuseaddress (if reuse-address-supplied-p reuse-address reuseaddress)) - (real-host (host-to-hostname host)) - (sock (with-mapped-conditions (nil host) - (apply #'openmcl-socket:make-socket - (append (list :connect :passive - :reuse-address reuseaddress - :local-port port - :backlog backlog - :format (to-format element-type :stream)) - (unless (eq host *wildcard-host*) - (list :local-host real-host))))))) - (make-stream-server-socket sock :element-type element-type))) - -(defmethod socket-accept ((usocket stream-server-usocket) &key element-type) - (declare (ignore element-type)) ;; openmcl streams are bi/multivalent - (let ((sock (with-mapped-conditions (usocket) - (openmcl-socket:accept-connection (socket usocket))))) - (make-stream-socket :socket sock :stream sock))) - -;; One close method is sufficient because sockets -;; and their associated objects are represented -;; by the same object. -(defmethod socket-close ((usocket usocket)) - (with-mapped-conditions (usocket) - (close (socket usocket)))) - -(defmethod socket-shutdown ((usocket usocket) direction) - (with-mapped-conditions (usocket) - (openmcl-socket:shutdown (socket usocket) :direction direction))) - -#-ipv6 -(defmethod socket-send ((usocket datagram-usocket) buffer size &key host port (offset 0)) - (with-mapped-conditions (usocket host) - (if (and host port) - (openmcl-socket:send-to (socket usocket) buffer size - :remote-host (host-to-hbo host) - :remote-port port - :offset offset) - ;; Clozure CL's socket function SEND-TO doesn't support operations on connected UDP sockets, - ;; so we have to define our own. - (let* ((socket (socket usocket)) - (fd (ccl::socket-device socket))) - (multiple-value-setq (buffer offset) - (ccl::verify-socket-buffer buffer offset size)) - (ccl::%stack-block ((bufptr size)) - (ccl::%copy-ivector-to-ptr buffer offset bufptr 0 size) - (ccl::socket-call socket "send" - (ccl::with-eagain fd :output - (ccl::ignoring-eintr - (ccl::check-socket-error (#_send fd bufptr size 0)))))))))) - -(defmethod socket-receive ((usocket datagram-usocket) buffer length &key) - (with-mapped-conditions (usocket) - (openmcl-socket:receive-from (socket usocket) length :buffer buffer))) - -(defun usocket-host-address (address) - (cond - ((integerp address) - (hbo-to-vector-quad address)) - ((and (arrayp address) - (= (length address) 16) - (every #'= address #(0 0 0 0 0 0 0 0 0 0 #xff #xff))) - (make-array 4 :displaced-to address :displaced-index-offset 12)) - (t - address))) - -(defmethod get-local-address ((usocket usocket)) - (usocket-host-address (openmcl-socket:local-host (socket usocket)))) - -(defmethod get-peer-address ((usocket stream-usocket)) - (usocket-host-address (openmcl-socket:remote-host (socket usocket)))) - -(defmethod get-local-port ((usocket usocket)) - (openmcl-socket:local-port (socket usocket))) - -(defmethod get-peer-port ((usocket stream-usocket)) - (openmcl-socket:remote-port (socket usocket))) - -(defmethod get-local-name ((usocket usocket)) - (values (get-local-address usocket) - (get-local-port usocket))) - -(defmethod get-peer-name ((usocket stream-usocket)) - (values (get-peer-address usocket) - (get-peer-port usocket))) - -(defun get-host-by-address (address) - (with-mapped-conditions (nil address) - (openmcl-socket:ipaddr-to-hostname (host-to-hbo address)))) - -(defun get-hosts-by-name (name) - (with-mapped-conditions (nil name) - (list (hbo-to-vector-quad (openmcl-socket:lookup-hostname - (host-to-hostname name)))))) - -(defun %setup-wait-list (wait-list) - (declare (ignore wait-list))) - -(defun %add-waiter (wait-list waiter) - (declare (ignore wait-list waiter))) - -(defun %remove-waiter (wait-list waiter) - (declare (ignore wait-list waiter))) - -(defun wait-for-input-internal (wait-list &key timeout) - (with-mapped-conditions () - (let* ((ticks-timeout (truncate (* (or timeout 1) - ccl::*ticks-per-second*)))) - (input-available-p (wait-list-waiters wait-list) - (when timeout ticks-timeout)) - wait-list))) - -;;; Helper functions for option.lisp - -(defun get-socket-option-reuseaddr (socket) - (ccl::int-getsockopt (ccl::socket-device socket) - #$SOL_SOCKET #$SO_REUSEADDR)) - -(defun set-socket-option-reuseaddr (socket value) - (ccl::int-setsockopt (ccl::socket-device socket) - #$SOL_SOCKET #$SO_REUSEADDR value)) - -(defun get-socket-option-broadcast (socket) - (ccl::int-getsockopt (ccl::socket-device socket) - #$SOL_SOCKET #$SO_BROADCAST)) - -(defun set-socket-option-broadcast (socket value) - (ccl::int-setsockopt (ccl::socket-device socket) - #$SOL_SOCKET #$SO_BROADCAST value)) - -(defun get-socket-option-tcp-nodelay (socket) - (ccl::int-getsockopt (ccl::socket-device socket) - #$IPPROTO_TCP #$TCP_NODELAY)) - -(defun set-socket-option-tcp-nodelay (socket value) - (ccl::int-setsockopt (ccl::socket-device socket) - #$IPPROTO_TCP #$TCP_NODELAY value)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/sbcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/sbcl.lisp deleted file mode 100644 index 5684430..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/sbcl.lisp +++ /dev/null @@ -1,935 +0,0 @@ -;;;; -*- Mode: Common-Lisp -*- - -;;;; See LICENSE for licensing information. - -(in-package :usocket) - -#+sbcl -(progn - #-win32 - (defun get-host-name () - (sb-unix:unix-gethostname)) - - ;; we assume winsock has already been loaded, after all, - ;; we already loaded sb-bsd-sockets and sb-alien - #+win32 - (defun get-host-name () - (sb-alien:with-alien ((buf (sb-alien:array sb-alien:char 256))) - (let ((result (sb-alien:alien-funcall - (sb-alien:extern-alien "gethostname" - (sb-alien:function sb-alien:int - (* sb-alien:char) - sb-alien:int)) - (sb-alien:cast buf (* sb-alien:char)) - 256))) - (when (= result 0) - (sb-alien:cast buf sb-alien:c-string)))))) - -#+(and ecl (not ecl-bytecmp)) -(progn - #-:wsock - (ffi:clines - "#include " - "#include " - "#include ") - #+:wsock - (ffi:clines - "#ifndef FD_SETSIZE" - "#define FD_SETSIZE 1024" - "#endif" - "#include ") - - (ffi:clines - #+:msvc "#include " - #-:msvc "#include " - "#include ") -#| - #+:prefixed-api - (ffi:clines - "#define CONS(x, y) ecl_cons((x), (y))" - "#define MAKE_INTEGER(x) ecl_make_integer((x))") - #-:prefixed-api - (ffi:clines - "#define CONS(x, y) make_cons((x), (y))" - "#define MAKE_INTEGER(x) make_integer((x))") -|# - - (defun cerrno () - (ffi:c-inline () () :int - "errno" :one-liner t)) - - (defun fd-setsize () - (ffi:c-inline () () :fixnum - "FD_SETSIZE" :one-liner t)) - - (defun fdset-alloc () - (ffi:c-inline () () :pointer-void - "ecl_alloc_atomic(sizeof(fd_set))" :one-liner t)) - - (defun fdset-zero (fdset) - (ffi:c-inline (fdset) (:pointer-void) :void - "FD_ZERO((fd_set*)#0)" :one-liner t)) - - (defun fdset-set (fdset fd) - (ffi:c-inline (fdset fd) (:pointer-void :fixnum) :void - "FD_SET(#1,(fd_set*)#0)" :one-liner t)) - - (defun fdset-clr (fdset fd) - (ffi:c-inline (fdset fd) (:pointer-void :fixnum) :void - "FD_CLR(#1,(fd_set*)#0)" :one-liner t)) - - (defun fdset-fd-isset (fdset fd) - (ffi:c-inline (fdset fd) (:pointer-void :fixnum) :bool - "FD_ISSET(#1,(fd_set*)#0)" :one-liner t)) - - (declaim (inline cerrno - fd-setsize - fdset-alloc - fdset-zero - fdset-set - fdset-clr - fdset-fd-isset)) - - (defun get-host-name () - (ffi:c-inline - () () :object - "{ char *buf = (char *) ecl_alloc_atomic(257); - - if (gethostname(buf,256) == 0) - @(return) = make_simple_base_string(buf); - else - @(return) = Cnil; - }" :one-liner nil :side-effects nil)) - - (defun read-select (wl to-secs &optional (to-musecs 0)) - (let* ((sockets (wait-list-waiters wl)) - (rfds (wait-list-%wait wl)) - (max-fd (reduce #'(lambda (x y) - (let ((sy (sb-bsd-sockets:socket-file-descriptor - (socket y)))) - (if (< x sy) sy x))) - (cdr sockets) - :initial-value (sb-bsd-sockets:socket-file-descriptor - (socket (car sockets)))))) - (fdset-zero rfds) - (dolist (sock sockets) - (fdset-set rfds (sb-bsd-sockets:socket-file-descriptor - (socket sock)))) - (let ((count - (ffi:c-inline (to-secs to-musecs rfds max-fd) - (t :unsigned-int :pointer-void :int) - :int - " - int count; - struct timeval tv; - struct timeval tvs; - struct timeval tve; - unsigned long elapsed; - unsigned long remaining; - int retval = -1; - - if (#0 != Cnil) { - tv.tv_sec = fixnnint(#0); - tv.tv_usec = #1; - } - remaining = ((tv.tv_sec*1000000) + tv.tv_usec); - - do { - (void)gettimeofday(&tvs, NULL); // start time - - retval = select(#3 + 1, (fd_set*)#2, NULL, NULL, - (#0 != Cnil) ? &tv : NULL); - - if ( (retval < 0) && (errno == EINTR) && (#0 != Cnil) ) { - (void)gettimeofday(&tve, NULL); // end time - elapsed = (tve.tv_sec - tvs.tv_sec)*1000000 + (tve.tv_usec - tvs.tv_usec); - remaining = remaining - elapsed; - if ( remaining < 0 ) { // already past timeout, just exit - retval = 0; - break; - } - - tv.tv_sec = remaining / 1000000; - tv.tv_usec = remaining - (tv.tv_sec * 1000000); - } - - } while ((retval < 0) && (errno == EINTR)); - - @(return) = retval; -" :one-liner nil))) - (cond - ((= 0 count) - (values nil nil)) - ((< count 0) - ;; check for EAGAIN; these should not err - (values nil (cerrno))) - (t - (dolist (sock sockets) - (when (fdset-fd-isset rfds (sb-bsd-sockets:socket-file-descriptor - (socket sock))) - (setf (state sock) :READ)))))))) -) ; progn - -(defun map-socket-error (sock-err) - (map-errno-error (sb-bsd-sockets::socket-error-errno sock-err))) - -(defparameter +sbcl-condition-map+ - '((interrupted-error . interrupted-condition))) - -(defparameter +sbcl-error-map+ - `((sb-bsd-sockets:address-in-use-error . address-in-use-error) - (sb-bsd-sockets::no-address-error . address-not-available-error) - (sb-bsd-sockets:bad-file-descriptor-error . bad-file-descriptor-error) - (sb-bsd-sockets:connection-refused-error . connection-refused-error) - (sb-bsd-sockets:invalid-argument-error . invalid-argument-error) - (sb-bsd-sockets:no-buffers-error . no-buffers-error) - (sb-bsd-sockets:operation-not-supported-error - . operation-not-supported-error) - (sb-bsd-sockets:operation-not-permitted-error - . operation-not-permitted-error) - (sb-bsd-sockets:protocol-not-supported-error - . protocol-not-supported-error) - #-(or ecl clasp) - (sb-bsd-sockets:unknown-protocol - . protocol-not-supported-error) - (sb-bsd-sockets:socket-type-not-supported-error - . socket-type-not-supported-error) - (sb-bsd-sockets:network-unreachable-error . network-unreachable-error) - (sb-bsd-sockets:operation-timeout-error . timeout-error) - #-(or ecl clasp) - (sb-sys:io-timeout . timeout-error) - #+sbcl - (sb-ext:timeout . timeout-error) - (sb-bsd-sockets:socket-error . ,#'map-socket-error) - - ;; Nameservice errors: mapped to unknown-error - #-(or ecl clasp) - (sb-bsd-sockets:no-recovery-error . ns-no-recovery-error) - #-(or ecl clasp) - (sb-bsd-sockets:try-again-error . ns-try-again-condition) - #-(or ecl clasp) - (sb-bsd-sockets:host-not-found-error . ns-host-not-found-error))) - -;; this function servers as a general template for other backends -(defun handle-condition (condition &optional (socket nil) (host-or-ip nil)) - "Dispatch correct usocket condition." - (typecase condition - (serious-condition - (let* ((usock-error (cdr (assoc (type-of condition) +sbcl-error-map+))) - (usock-error (if (functionp usock-error) - (funcall usock-error condition) - usock-error))) - (declare (type symbol usock-error)) - (if usock-error - (cond ((subtypep usock-error 'ns-error) - (error usock-error :socket socket :host-or-ip host-or-ip)) - (t - (error usock-error :socket socket))) - (error 'unknown-error - :real-error condition - :socket socket)))) - (condition - (let* ((usock-cond (cdr (assoc (type-of condition) +sbcl-condition-map+))) - (usock-cond (if (functionp usock-cond) - (funcall usock-cond condition) - usock-cond))) - (if usock-cond - (cond ((subtypep usock-cond 'ns-condition) - (signal usock-cond :socket socket :host-or-ip host-or-ip)) - (t - (signal usock-cond :socket socket))) - (signal 'unknown-condition - :real-condition condition - :socket socket)))))) - -;;; "The socket stream ends up with a bogus name as it is created before -;;; the socket is connected, making things harder to debug than they need -;;; to be." -- Nikodemus Siivola - -(defvar *dummy-stream* - (let ((stream (make-broadcast-stream))) - (close stream) - stream)) - -;;; Amusingly, neither SBCL's own, nor GBBopen's WITH-TIMEOUT is asynch -;;; unwind safe. The one I posted is -- that's what the WITHOUT-INTERRUPTS -;;; and WITH-LOCAL-INTERRUPTS were for. :) But yeah, it's miles saner than -;;; the SB-EXT:WITH-TIMEOUT. -- Nikodemus Siivola - -#+(and sbcl (not win32)) -(defmacro %with-timeout ((seconds timeout-form) &body body) - "Runs BODY as an implicit PROGN with timeout of SECONDS. If -timeout occurs before BODY has finished, BODY is unwound and -TIMEOUT-FORM is executed with its values returned instead. - -Note that BODY is unwound asynchronously when a timeout occurs, -so unless all code executed during it -- including anything -down the call chain -- is asynch unwind safe, bad things will -happen. Use with care." - (let ((exec (gensym)) (unwind (gensym)) (timer (gensym)) - (timeout (gensym)) (block (gensym))) - `(block ,block - (tagbody - (flet ((,unwind () - (go ,timeout)) - (,exec () - ,@body)) - (declare (dynamic-extent #',exec #',unwind)) - (let ((,timer (sb-ext:make-timer #',unwind))) - (declare (dynamic-extent ,timer)) - (sb-sys:without-interrupts - (unwind-protect - (progn - (sb-ext:schedule-timer ,timer ,seconds) - (return-from ,block - (sb-sys:with-local-interrupts - (,exec)))) - (sb-ext:unschedule-timer ,timer))))) - ,timeout - (return-from ,block ,timeout-form))))) - -(defun get-hosts-by-name (name) - (with-mapped-conditions (nil name) - (multiple-value-bind (host4 host6) - (sb-bsd-sockets:get-host-by-name name) - (let ((addr4 (when host4 - (sb-bsd-sockets::host-ent-addresses host4))) - (addr6 (when host6 - (sb-bsd-sockets::host-ent-addresses host6)))) - (append addr4 addr6))))) - -(defun socket-connect (host port &key (protocol :stream) (element-type 'character) - timeout deadline (nodelay t nodelay-specified) - local-host local-port - &aux - (sockopt-tcp-nodelay-p - (fboundp 'sb-bsd-sockets::sockopt-tcp-nodelay))) - (when deadline (unsupported 'deadline 'socket-connect)) - #+(or ecl clasp) - (when timeout (unsupported 'timeout 'socket-connect)) - (when (and nodelay-specified - ;; 20080802: ECL added this function to its sockets - ;; package today. There's no guarantee the functions - ;; we need are available, but we can make sure not to - ;; call them if they aren't - (not (eq nodelay :if-supported)) - (not sockopt-tcp-nodelay-p)) - (unsupported 'nodelay 'socket-connect)) - (when (eq nodelay :if-supported) - (setf nodelay t)) - - (let* ((remote (when host - (car (get-hosts-by-name (host-to-hostname host))))) - (local (when local-host - (car (get-hosts-by-name (host-to-hostname local-host))))) - (ipv6 (or (and remote (= 16 (length remote))) - (and local (= 16 (length local))))) - (socket (make-instance #+sbcl (if ipv6 - 'sb-bsd-sockets::inet6-socket - 'sb-bsd-sockets:inet-socket) - #+(or ecl clasp) 'sb-bsd-sockets:inet-socket - :type protocol - :protocol (case protocol - (:stream :tcp) - (:datagram :udp)))) - usocket - ok) - - (unwind-protect - (progn - (ecase protocol - (:stream - ;; If make a real socket stream before the socket is - ;; connected, it gets a misleading name so supply a - ;; dummy value to start with. - (setf usocket (make-stream-socket :socket socket :stream *dummy-stream*)) - ;; binghe: use SOCKOPT-TCP-NODELAY as internal symbol - ;; to pass compilation on ECL without it. - (when (and nodelay-specified sockopt-tcp-nodelay-p) - (setf (sb-bsd-sockets::sockopt-tcp-nodelay socket) nodelay)) - (when (or local-host local-port) - (sb-bsd-sockets:socket-bind socket - (if ipv6 - (or local (ipv6-host-to-vector "::0")) - (or local (host-to-vector-quad *wildcard-host*))) - (or local-port *auto-port*))) - - (with-mapped-conditions (usocket host) - #+(and sbcl (not win32)) - (labels ((connect () - (sb-bsd-sockets:socket-connect socket remote port))) - (if timeout - (%with-timeout (timeout (error 'sb-ext:timeout)) (connect)) - (connect))) - #+(or ecl clasp (and sbcl win32)) - (sb-bsd-sockets:socket-connect socket remote port) - ;; Now that we're connected make the stream. - (setf (socket-stream usocket) - (sb-bsd-sockets:socket-make-stream socket - :input t :output t :buffering :full - :element-type element-type - ;; Robert Brown said on Aug 4, 2011: - ;; ... This means that SBCL streams created by usocket have a true - ;; serve-events property. When writing large amounts of data to several - ;; streams, the kernel will eventually stop accepting data from SBCL. - ;; When this happens, SBCL either waits for I/O to be possible on - ;; the file descriptor it's writing to or queues the data to be flushed later. - ;; Because usocket streams specify serve-events as true, SBCL - ;; always queues. Instead, it should wait for I/O to be available and - ;; write the remaining data to the socket. That's what serve-events - ;; equal to NIL gets you. - ;; - ;; Nikodemus Siivola said on Aug 8, 2011: - ;; It's set to T for purely historical reasons, and will soon change to - ;; NIL in SBCL. (The docstring has warned of T being a temporary default - ;; for as long as the :SERVE-EVENTS keyword argument has existed.) - :serve-events nil)))) - (:datagram - (when (or local-host local-port) - (sb-bsd-sockets:socket-bind socket - (if ipv6 - (or local (ipv6-host-to-vector "::0")) - (or local (host-to-vector-quad *wildcard-host*))) - (or local-port *auto-port*))) - (setf usocket (make-datagram-socket socket)) - (when (and host port) - (with-mapped-conditions (usocket) - (sb-bsd-sockets:socket-connect socket remote port) - (setf (connected-p usocket) t))))) - (setf ok t)) - ;; Clean up in case of an error. - (unless ok - (sb-bsd-sockets:socket-close socket :abort t))) - usocket)) - -(defun socket-listen (host port - &key reuseaddress - (reuse-address nil reuse-address-supplied-p) - (backlog 5) - (element-type 'character)) - (let* (#+sbcl - (local (when host - (car (get-hosts-by-name (host-to-hostname host))))) - #+sbcl - (ipv6 (and local (= 16 (length local)))) - (reuseaddress (if reuse-address-supplied-p reuse-address reuseaddress)) - (ip #+sbcl (if (and local (not (eq host *wildcard-host*))) - local - (hbo-to-vector-quad sb-bsd-sockets-internal::inaddr-any)) - #+(or ecl clasp) (host-to-vector-quad host)) - (sock (make-instance #+sbcl (if ipv6 - 'sb-bsd-sockets::inet6-socket - 'sb-bsd-sockets:inet-socket) - #+(or ecl clasp) 'sb-bsd-sockets:inet-socket - :type :stream - :protocol :tcp))) - (handler-case - (with-mapped-conditions (nil host) - (setf (sb-bsd-sockets:sockopt-reuse-address sock) reuseaddress) - (sb-bsd-sockets:socket-bind sock ip port) - (sb-bsd-sockets:socket-listen sock backlog) - (make-stream-server-socket sock :element-type element-type)) - (t (c) - ;; Make sure we don't leak filedescriptors - (sb-bsd-sockets:socket-close sock) - (error c))))) - -;;; "2. SB-BSD-SOCKETS:SOCKET-ACCEPT method returns NIL for EAGAIN/EINTR, -;;; instead of raising a condition. It's always possible for -;;; SOCKET-ACCEPT on non-blocking socket to fail, even after the socket -;;; was detected to be ready: connection might be reset, for example. -;;; -;;; "I had to redefine SOCKET-ACCEPT method of STREAM-SERVER-USOCKET to -;;; handle this situation. Here is the redefinition:" -- Anton Kovalenko - -(defmethod socket-accept ((usocket stream-server-usocket) &key element-type) - (with-mapped-conditions (usocket) - (let ((socket (sb-bsd-sockets:socket-accept (socket usocket)))) - (when socket - (prog1 - (make-stream-socket - :socket socket - :stream (sb-bsd-sockets:socket-make-stream - socket - :input t :output t :buffering :full - :element-type (or element-type - (element-type usocket)))) - - ;; next time wait for event again if we had EAGAIN/EINTR - ;; or else we'd enter a tight loop of failed accepts - #+win32 - (setf (%ready-p usocket) nil)))))) - -;; Sockets and their associated streams are modelled as -;; different objects. Be sure to close the stream (which -;; closes the socket too) when closing a stream-socket. -(defmethod socket-close ((usocket usocket)) - (with-mapped-conditions (usocket) - (sb-bsd-sockets:socket-close (socket usocket)))) - -(defmethod socket-close ((usocket stream-usocket)) - (with-mapped-conditions (usocket) - (close (socket-stream usocket)))) - -#+sbcl -(defmethod socket-shutdown ((usocket stream-usocket) direction) - (with-mapped-conditions (usocket) - (sb-bsd-sockets::socket-shutdown (socket usocket) :direction direction))) - -#+ecl -(defmethod socket-shutdown ((usocket stream-usocket) direction) - (let ((sock-fd (sb-bsd-sockets:socket-file-descriptor (socket usocket))) - (direction-flag (ecase direction - (:input 0) - (:output 1)))) - (unless (zerop (ffi:c-inline (sock-fd direction-flag) (:int :int) :int - "shutdown(#0, #1)" :one-liner t)) - (error (map-errno-error (cerrno)))))) - -#+clasp -(defmethod socket-shutdown ((usocket stream-usocket) direction) - (let ((sock-fd (sb-bsd-sockets:socket-file-descriptor (socket usocket))) - (direction-flag (ecase direction - (:input 0) - (:output 1)))) - (unless (zerop (sockets-internal:shutdown sock-fd direction-flag)) - (error (map-errno-error (cerrno)))))) - -(defmethod socket-send ((usocket datagram-usocket) buffer size &key host port (offset 0)) - (let ((remote (when host - (car (get-hosts-by-name (host-to-hostname host)))))) - (with-mapped-conditions (usocket host) - (let* ((s (socket usocket)) - (dest (if (and host port) (list remote port) nil)) - (real-buffer (if (zerop offset) - buffer - (subseq buffer offset (+ offset size))))) - (sb-bsd-sockets:socket-send s real-buffer size :address dest))))) - -(defmethod socket-receive ((usocket datagram-usocket) buffer length - &key (element-type '(unsigned-byte 8))) - #+sbcl - (declare (values (simple-array (unsigned-byte 8) (*)) ; buffer - (integer 0) ; size - (simple-array (unsigned-byte 8) (*)) ; host - (unsigned-byte 16))) ; port - (with-mapped-conditions (usocket) - (let ((s (socket usocket))) - (sb-bsd-sockets:socket-receive s buffer length :element-type element-type)))) - -(defmethod get-local-name ((usocket usocket)) - (sb-bsd-sockets:socket-name (socket usocket))) - -(defmethod get-peer-name ((usocket stream-usocket)) - (sb-bsd-sockets:socket-peername (socket usocket))) - -(defmethod get-local-address ((usocket usocket)) - (nth-value 0 (get-local-name usocket))) - -(defmethod get-peer-address ((usocket stream-usocket)) - (nth-value 0 (get-peer-name usocket))) - -(defmethod get-local-port ((usocket usocket)) - (nth-value 1 (get-local-name usocket))) - -(defmethod get-peer-port ((usocket stream-usocket)) - (nth-value 1 (get-peer-name usocket))) - -(defun get-host-by-address (address) - (with-mapped-conditions (nil address) - (sb-bsd-sockets::host-ent-name - (sb-bsd-sockets:get-host-by-address address)))) - -#+(and sbcl (not win32)) -(progn - (defun %setup-wait-list (wait-list) - (declare (ignore wait-list))) - - (defun %add-waiter (wait-list waiter) - (push (socket waiter) (wait-list-%wait wait-list))) - - (defun %remove-waiter (wait-list waiter) - (setf (wait-list-%wait wait-list) - (remove (socket waiter) (wait-list-%wait wait-list)))) - - (defun wait-for-input-internal (sockets &key timeout) - (with-mapped-conditions () - (sb-alien:with-alien ((rfds (sb-alien:struct sb-unix:fd-set))) - (sb-unix:fd-zero rfds) - (dolist (socket (wait-list-%wait sockets)) - (sb-unix:fd-set - (sb-bsd-sockets:socket-file-descriptor socket) - rfds)) - (multiple-value-bind - (secs musecs) - (split-timeout (or timeout 1)) - (let* ((wait-list (wait-list-%wait sockets)) - count err) - (if (null wait-list) - (setq count 0) ;; no need to call - (multiple-value-setq (count err) - (sb-unix:unix-fast-select - ;; "invalid number of arguments: 0" if wait-list is null. - (1+ (reduce #'max wait-list - :key #'sb-bsd-sockets:socket-file-descriptor)) - (sb-alien:addr rfds) nil nil - (when timeout secs) (when timeout musecs)))) - (if (null count) ; something wrong in #'sb-unix:unix-fast-select - (unless (= err sb-unix:eintr) - (error (map-errno-error err))) - (when (< 0 count) ; do nothing if count = 0 - ;; process the result... - (dolist (x (wait-list-waiters sockets)) - (when (sb-unix:fd-isset - (sb-bsd-sockets:socket-file-descriptor - (socket x)) - rfds) - (setf (state x) :READ)))))))))) -) ; progn - -;;; WAIT-FOR-INPUT support for SBCL on Windows platform (Chun Tian (binghe)) -;;; Based on LispWorks version written by Erik Huelsmann. - -#+win32 ; shared by ECL and SBCL -(eval-when (:compile-toplevel :load-toplevel :execute) - (defconstant +wsa-wait-failed+ #xffffffff) - (defconstant +wsa-infinite+ #xffffffff) - (defconstant +wsa-wait-event-0+ 0) - (defconstant +wsa-wait-timeout+ 258)) - -#+win32 ; shared by ECL and SBCL -(progn - (defconstant fd-read 1) - (defconstant fd-read-bit 0) - (defconstant fd-write 2) - (defconstant fd-write-bit 1) - (defconstant fd-oob 4) - (defconstant fd-oob-bit 2) - (defconstant fd-accept 8) - (defconstant fd-accept-bit 3) - (defconstant fd-connect 16) - (defconstant fd-connect-bit 4) - (defconstant fd-close 32) - (defconstant fd-close-bit 5) - (defconstant fd-qos 64) - (defconstant fd-qos-bit 6) - (defconstant fd-group-qos 128) - (defconstant fd-group-qos-bit 7) - (defconstant fd-routing-interface 256) - (defconstant fd-routing-interface-bit 8) - (defconstant fd-address-list-change 512) - (defconstant fd-address-list-change-bit 9) - (defconstant fd-max-events 10) - (defconstant fionread 1074030207) - - ;; Note: for ECL, socket-handle will return raw Windows Handle, - ;; while SBCL returns OSF Handle instead. - (defun socket-handle (usocket) - (sb-bsd-sockets:socket-file-descriptor (socket usocket))) - - (defun socket-ready-p (socket) - (if (typep socket 'stream-usocket) - (plusp (bytes-available-for-read socket)) - (%ready-p socket))) - - (defun waiting-required (sockets) - (notany #'socket-ready-p sockets)) - - (defun raise-usock-err (errno &optional socket) - (error 'unknown-error - :socket socket - :real-error errno)) - - (defun wait-for-input-internal (wait-list &key timeout) - (when (waiting-required (wait-list-waiters wait-list)) - (let ((rv (wsa-wait-for-multiple-events 1 (wait-list-%wait wait-list) - nil - (if timeout - (truncate (* 1000 timeout)) - +wsa-infinite+) - nil))) - (ecase rv - ((#.+wsa-wait-event-0+) - (update-ready-and-state-slots wait-list)) - ((#.+wsa-wait-timeout+)) ; do nothing here - ((#.+wsa-wait-failed+) - (maybe-wsa-error rv)))))) - - (defun %add-waiter (wait-list waiter) - (let ((events (etypecase waiter - (stream-server-usocket (logior fd-connect fd-accept fd-close)) - (stream-usocket (logior fd-read)) - (datagram-usocket (logior fd-read))))) - (maybe-wsa-error - (wsa-event-select (os-socket-handle waiter) (os-wait-list-%wait wait-list) events) - waiter))) - - (defun %remove-waiter (wait-list waiter) - (maybe-wsa-error - (wsa-event-select (os-socket-handle waiter) (os-wait-list-%wait wait-list) 0) - waiter)) -) ; progn - -#+(and sbcl win32) -(progn - ;; "SOCKET is defined as intptr_t in Windows headers; however, WS-SOCKET - ;; is defined as unsigned-int, i.e. 32-bit even on 64-bit platform. It - ;; seems to be a good thing to redefine WS-SOCKET as SB-ALIEN:SIGNED, - ;; which is always machine word-sized (exactly as intptr_t; - ;; N.B. as of Windows/x64, long and signed-long are 32-bit, and thus not - ;; enough -- potentially)." - ;; -- Anton Kovalenko , Mar 22, 2011 - (sb-alien:define-alien-type ws-socket sb-alien:signed) - - (sb-alien:define-alien-type ws-dword sb-alien:unsigned-long) - (sb-alien:define-alien-type ws-event sb-alien::hinstance) - - (sb-alien:define-alien-type nil - (sb-alien:struct wsa-network-events - (network-events sb-alien:long) - (error-code (array sb-alien:int 10)))) ; 10 = fd-max-events - - (sb-alien:define-alien-routine ("WSACreateEvent" wsa-event-create) - ws-event) ; return type only - - (sb-alien:define-alien-routine ("WSACloseEvent" wsa-event-close) - (boolean #.sb-vm::n-machine-word-bits) - (event-object ws-event)) - - ;; not used - (sb-alien:define-alien-routine ("WSAResetEvent" wsa-reset-event) - (boolean #.sb-vm::n-machine-word-bits) - (event-object ws-event)) - - (sb-alien:define-alien-routine ("WSAEnumNetworkEvents" wsa-enum-network-events) - sb-alien:int - (socket ws-socket) - (event-object ws-event) - (network-events (* (sb-alien:struct wsa-network-events)))) - - (sb-alien:define-alien-routine ("WSAEventSelect" wsa-event-select) - sb-alien:int - (socket ws-socket) - (event-object ws-event) - (network-events sb-alien:long)) - - (sb-alien:define-alien-routine ("WSAWaitForMultipleEvents" wsa-wait-for-multiple-events) - ws-dword - (number-of-events ws-dword) - (events (* ws-event)) - (wait-all-p (boolean #.sb-vm::n-machine-word-bits)) - (timeout ws-dword) - (alertable-p (boolean #.sb-vm::n-machine-word-bits))) - - (sb-alien:define-alien-routine ("ioctlsocket" wsa-ioctlsocket) - sb-alien:int - (socket ws-socket) - (cmd sb-alien:long) - (argp (* sb-alien:unsigned-long))) - - (defun maybe-wsa-error (rv &optional socket) - (unless (zerop rv) - (raise-usock-err (sockint::wsa-get-last-error) socket))) - - (defun os-socket-handle (usocket) - (sb-bsd-sockets:socket-file-descriptor (socket usocket))) - - (defun bytes-available-for-read (socket) - (sb-alien:with-alien ((int-ptr sb-alien:unsigned-long)) - (maybe-wsa-error (wsa-ioctlsocket (os-socket-handle socket) fionread (sb-alien:addr int-ptr)) - socket) - (prog1 int-ptr - (when (plusp int-ptr) - (setf (state socket) :read))))) - - (defun map-network-events (func network-events) - (let ((event-map (sb-alien:slot network-events 'network-events)) - (error-array (sb-alien:slot network-events 'error-code))) - (unless (zerop event-map) - (dotimes (i fd-max-events) - (unless (zerop (ldb (byte 1 i) event-map)) ;;### could be faster with ash and logand? - (funcall func (sb-alien:deref error-array i))))))) - - (defun update-ready-and-state-slots (wait-list) - (loop with sockets = (wait-list-waiters wait-list) - for socket in sockets do - (if (%ready-p socket) - (progn - (setf (state socket) :READ)) - (sb-alien:with-alien ((network-events (sb-alien:struct wsa-network-events))) - (let ((rv (wsa-enum-network-events (os-socket-handle socket) - (os-wait-list-%wait wait-list) - (sb-alien:addr network-events)))) - (if (zerop rv) - (map-network-events - #'(lambda (err-code) - (if (zerop err-code) - (progn - (setf (state socket) :READ) - (when (stream-server-usocket-p socket) - (setf (%ready-p socket) t))) - (raise-usock-err err-code socket))) - network-events) - (maybe-wsa-error rv socket))))))) - - (defun os-wait-list-%wait (wait-list) - (sb-alien:deref (wait-list-%wait wait-list))) - - (defun (setf os-wait-list-%wait) (value wait-list) - (setf (sb-alien:deref (wait-list-%wait wait-list)) value)) - - ;; "Event handles are leaking in current SBCL backend implementation, - ;; because of SBCL-unfriendly usage of finalizers. - ;; - ;; "SBCL never calls a finalizer that closes over a finalized object: a - ;; reference from that closure prevents its collection forever. That's - ;; the case with USOCKET in %SETUP-WAIT-LIST. - ;; - ;; "I use the following redefinition of %SETUP-WAIT-LIST: - ;; - ;; "Of course it may be rewritten with more clarity, but you can see the - ;; core idea: I'm closing over those components of WAIT-LIST that I need - ;; for finalization, not the wait-list itself. With the original - ;; %SETUP-WAIT-LIST, hunchentoot stops working after ~100k accepted - ;; connections; it doesn't happen with redefined %SETUP-WAIT-LIST." - ;; - ;; -- Anton Kovalenko , Mar 22, 2011 - - (defun %setup-wait-list (wait-list) - (setf (wait-list-%wait wait-list) (sb-alien:make-alien ws-event)) - (setf (os-wait-list-%wait wait-list) (wsa-event-create)) - (sb-ext:finalize wait-list - (let ((event-handle (os-wait-list-%wait wait-list)) - (alien (wait-list-%wait wait-list))) - #'(lambda () - (wsa-event-close event-handle) - (unless (null alien) - (sb-alien:free-alien alien)))))) - -) ; progn - -#+(and (or ecl clasp) (not win32)) -(progn - (defun wait-for-input-internal (wl &key timeout) - (with-mapped-conditions () - (multiple-value-bind (secs usecs) - (split-timeout (or timeout 1)) - (multiple-value-bind (result-fds err) - (read-select wl (when timeout secs) usecs) - (declare (ignore result-fds)) - (unless (null err) - (error (map-errno-error err))))))) - - (defun %setup-wait-list (wl) - (setf (wait-list-%wait wl) - (fdset-alloc))) - - (defun %add-waiter (wl w) - (declare (ignore wl w))) - - (defun %remove-waiter (wl w) - (declare (ignore wl w))) -) ; progn - -#+(and (or ecl clasp) win32 (not ecl-bytecmp)) -(progn - (defun maybe-wsa-error (rv &optional syscall) - (unless (zerop rv) - (sb-bsd-sockets::socket-error syscall))) - - (defun %setup-wait-list (wl) - (setf (wait-list-%wait wl) - (ffi:c-inline () () :int - "WSAEVENT event; - event = WSACreateEvent(); - @(return) = event;"))) - - (defun %add-waiter (wait-list waiter) - (let ((events (etypecase waiter - (stream-server-usocket (logior fd-connect fd-accept fd-close)) - (stream-usocket (logior fd-read)) - (datagram-usocket (logior fd-read))))) - (maybe-wsa-error - (ffi:c-inline ((socket-handle waiter) (wait-list-%wait wait-list) events) - (:fixnum :fixnum :fixnum) :fixnum - "int result; - result = WSAEventSelect((SOCKET)#0, (WSAEVENT)#1, (long)#2); - @(return) = result;") - '%add-waiter))) - - (defun %remove-waiter (wait-list waiter) - (maybe-wsa-error - (ffi:c-inline ((socket-handle waiter) (wait-list-%wait wait-list)) - (:fixnum :fixnum) :fixnum - "int result; - result = WSAEventSelect((SOCKET)#0, (WSAEVENT)#1, 0L); - @(return) = result;") - '%remove-waiter)) - - ;; TODO: how to handle error (result) in this call? - (declaim (inline %bytes-available-for-read)) - (defun %bytes-available-for-read (socket) - (ffi:c-inline ((socket-handle socket)) (:fixnum) :fixnum - "u_long nbytes; - int result; - nbytes = 0L; - result = ioctlsocket((SOCKET)#0, FIONREAD, &nbytes); - @(return) = nbytes;")) - - (defun bytes-available-for-read (socket) - (let ((nbytes (%bytes-available-for-read socket))) - (when (plusp nbytes) - (setf (state socket) :read)) - nbytes)) - - (defun update-ready-and-state-slots (wait-list) - (loop with sockets = (wait-list-waiters wait-list) - for socket in sockets do - (if (%ready-p socket) - (setf (state socket) :READ) - (let ((events (etypecase socket - (stream-server-usocket (logior fd-connect fd-accept fd-close)) - (stream-usocket (logior fd-read)) - (datagram-usocket (logior fd-read))))) - ;; TODO: check the iErrorCode array - (multiple-value-bind (valid-p ready-p) - (ffi:c-inline ((socket-handle socket) events) (:fixnum :fixnum) - (values :bool :bool) - ;; TODO: replace 0 (2nd arg) with (wait-list-%wait wait-list) - "WSANETWORKEVENTS network_events; - int i, result; - result = WSAEnumNetworkEvents((SOCKET)#0, 0, &network_events); - if (!result) { - @(return 0) = Ct; - @(return 1) = (#1 & network_events.lNetworkEvents)? Ct : Cnil; - } else { - @(return 0) = Cnil; - @(return 1) = Cnil; - }") - (if valid-p - (when ready-p - (setf (state socket) :READ) - (when (stream-server-usocket-p socket) - (setf (%ready-p socket) t))) - (sb-bsd-sockets::socket-error 'update-ready-and-state-slots))))))) - - (defun wait-for-input-internal (wait-list &key timeout) - (when (waiting-required (wait-list-waiters wait-list)) - (let ((rv (ffi:c-inline ((wait-list-%wait wait-list) - (if timeout - (truncate (* 1000 timeout)) - +wsa-infinite+)) - (:fixnum :fixnum) :fixnum - "DWORD result; - WSAEVENT events[1]; - events[0] = (WSAEVENT)#0; - result = WSAWaitForMultipleEvents(1, events, NULL, #1, NULL); - @(return) = result;"))) - (ecase rv - ((#.+wsa-wait-event-0+) - (update-ready-and-state-slots (wait-list-waiters wait-list))) - ((#.+wsa-wait-timeout+)) ; do nothing here - ((#.+wsa-wait-failed+) - (sb-bsd-sockets::socket-error 'wait-for-input-internal)))))) - -) ; progn diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/scl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/scl.lisp deleted file mode 100644 index d26b7c9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/backend/scl.lisp +++ /dev/null @@ -1,266 +0,0 @@ -;;;; See LICENSE for licensing information. - -(in-package :usocket) - -(defparameter +scl-error-map+ - (append +unix-errno-condition-map+ - +unix-errno-error-map+)) - -(defun scl-map-socket-error (err &key condition socket) - (let ((usock-err (cdr (assoc err +scl-error-map+ :test #'member)))) - (cond (usock-err - (if (subtypep usock-err 'error) - (error usock-err :socket socket) - (signal usock-err :socket socket))) - (t - (error 'unknown-error - :socket socket - :real-error condition))))) - -(defun handle-condition (condition &optional (socket nil) (host-or-ip nil)) - "Dispatch correct usocket condition." - (typecase condition - (ext::socket-error - (scl-map-socket-error (ext::socket-errno condition) - :socket socket - :condition condition)))) - -(defun socket-connect (host port &key (protocol :stream) (element-type 'character) - timeout deadline (nodelay t nodelay-specified) - (local-host nil local-host-p) - (local-port nil local-port-p) - &aux - (patch-udp-p (fboundp 'ext::inet-socket-send-to))) - (when (and nodelay-specified - (not (eq nodelay :if-supported))) - (unsupported 'nodelay 'socket-connect)) - (when deadline (unsupported 'deadline 'socket-connect)) - (when timeout (unsupported 'timeout 'socket-connect)) - (when (and local-host-p (not patch-udp-p)) - (unsupported 'local-host 'socket-connect :minimum "1.3.9")) - (when (and local-port-p (not patch-udp-p)) - (unsupported 'local-port 'socket-connect :minimum "1.3.9")) - - (let ((socket)) - (ecase protocol - (:stream - (setf socket (let ((args (list (host-to-hbo host) port :kind protocol))) - (when (and patch-udp-p (or local-host-p local-port-p)) - (nconc args (list :local-host (when local-host - (host-to-hbo local-host)) - :local-port local-port))) - (with-mapped-conditions (socket) - (apply #'ext:connect-to-inet-socket args)))) - (let ((stream (sys:make-fd-stream socket :input t :output t - :element-type element-type - :buffering :full))) - (make-stream-socket :socket socket :stream stream))) - (:datagram - (when (not patch-udp-p) - (error 'unsupported - :feature '(protocol :datagram) - :context 'socket-connect - :minumum "1.3.9")) - (setf socket - (if (and host port) - (let ((args (list (host-to-hbo host) port :kind protocol))) - (when (and patch-udp-p (or local-host-p local-port-p)) - (nconc args (list :local-host (when local-host - (host-to-hbo local-host)) - :local-port local-port))) - (with-mapped-conditions (socket) - (apply #'ext:connect-to-inet-socket args))) - (if (or local-host-p local-port-p) - (with-mapped-conditions () - (ext:create-inet-listener (or local-port 0) - protocol - :host (when local-host - (if (ip= local-host *wildcard-host*) - 0 - (host-to-hbo local-host))))) - (with-mapped-conditions () - (ext:create-inet-socket protocol))))) - (let ((usocket (make-datagram-socket socket :connected-p (and host port t)))) - (ext:finalize usocket #'(lambda () - (when (%open-p usocket) - (ext:close-socket socket)))) - usocket))))) - -(defun socket-listen (host port - &key reuseaddress - (reuse-address nil reuse-address-supplied-p) - (backlog 5) - (element-type 'character)) - (let* ((reuseaddress (if reuse-address-supplied-p reuse-address reuseaddress)) - (host (if (ip= host *wildcard-host*) - 0 - (host-to-hbo host))) - (server-sock - (with-mapped-conditions () - (ext:create-inet-listener port :stream - :host host - :reuse-address reuseaddress - :backlog backlog)))) - (make-stream-server-socket server-sock :element-type element-type))) - -(defmethod socket-accept ((usocket stream-server-usocket) &key element-type) - (with-mapped-conditions (usocket) - (let* ((sock (ext:accept-tcp-connection (socket usocket))) - (stream (sys:make-fd-stream sock :input t :output t - :element-type (or element-type - (element-type usocket)) - :buffering :full))) - (make-stream-socket :socket sock :stream stream)))) - -;; Sockets and their associated streams are modelled as -;; different objects. Be sure to close the socket stream -;; when closing stream-sockets; it makes sure buffers -;; are flushed and the socket is closed correctly afterwards. -(defmethod socket-close ((usocket usocket)) - "Close socket." - (with-mapped-conditions (usocket) - (ext:close-socket (socket usocket)))) - -(defmethod socket-close ((usocket stream-usocket)) - "Close socket." - (with-mapped-conditions (usocket) - (close (socket-stream usocket)))) - -(defmethod socket-close :after ((socket datagram-usocket)) - (setf (%open-p socket) nil)) - -(defmethod socket-shutdown ((usocket usocket) direction) - (declare (ignore usocket direction)) - (unsupported "shutdown" 'socket-shutdown)) - -(defmethod socket-send ((usocket datagram-usocket) buffer size &key host port) - (let ((s (socket usocket)) - (host (if host (host-to-hbo host))) - (real-buffer (if (zerop offset) - buffer - (subseq buffer offset (+ offset size))))) - (multiple-value-bind (result errno) - (ext:inet-socket-send-to s real-buffer size - :remote-host host :remote-port port) - (or result - (scl-map-socket-error errno :socket usocket))))) - -(defmethod socket-receive ((socket datagram-usocket) buffer length &key) - (declare (values (simple-array (unsigned-byte 8) (*)) ; buffer - (integer 0) ; size - (unsigned-byte 32) ; host - (unsigned-byte 16))) ; port - (let ((s (socket socket))) - (let ((real-buffer (or buffer - (make-array length :element-type '(unsigned-byte 8)))) - (real-length (or length - (length buffer)))) - (multiple-value-bind (result errno remote-host remote-port) - (ext:inet-socket-receive-from s real-buffer real-length) - (if result - (values real-buffer result remote-host remote-port) - (scl-map-socket-error errno :socket socket)))))) - -(defmethod get-local-name ((usocket usocket)) - (multiple-value-bind (address port) - (with-mapped-conditions (usocket) - (ext:get-socket-host-and-port (socket usocket))) - (values (hbo-to-vector-quad address) port))) - -(defmethod get-peer-name ((usocket stream-usocket)) - (multiple-value-bind (address port) - (with-mapped-conditions (usocket) - (ext:get-peer-host-and-port (socket usocket))) - (values (hbo-to-vector-quad address) port))) - -(defmethod get-local-address ((usocket usocket)) - (nth-value 0 (get-local-name usocket))) - -(defmethod get-peer-address ((usocket stream-usocket)) - (nth-value 0 (get-peer-name usocket))) - -(defmethod get-local-port ((usocket usocket)) - (nth-value 1 (get-local-name usocket))) - -(defmethod get-peer-port ((usocket stream-usocket)) - (nth-value 1 (get-peer-name usocket))) - - -(defun get-host-by-address (address) - (multiple-value-bind (host errno) - (ext:lookup-host-entry (host-byte-order address)) - (cond (host - (ext:host-entry-name host)) - (t - (let ((condition (cdr (assoc errno +unix-ns-error-map+)))) - (cond (condition - (error condition :host-or-ip address)) - (t - (error 'ns-unknown-error :host-or-ip address - :real-error errno)))))))) - -(defun get-hosts-by-name (name) - (multiple-value-bind (host errno) - (ext:lookup-host-entry name) - (cond (host - (mapcar #'hbo-to-vector-quad - (ext:host-entry-addr-list host))) - (t - (let ((condition (cdr (assoc errno +unix-ns-error-map+)))) - (cond (condition - (error condition :host-or-ip name)) - (t - (error 'ns-unknown-error :host-or-ip name - :real-error errno)))))))) - -(defun get-host-name () - (unix:unix-gethostname)) - - -;; -;; -;; WAIT-LIST part -;; - - -(defun %add-waiter (wl waiter) - (declare (ignore wl waiter))) - -(defun %remove-waiter (wl waiter) - (declare (ignore wl waiter))) - -(defun %setup-wait-list (wl) - (declare (ignore wl))) - -(defun wait-for-input-internal (wait-list &key timeout) - (let* ((sockets (wait-list-waiters wait-list)) - (pollfd-size (alien:alien-size (alien:struct unix::pollfd) :bytes)) - (nfds (length sockets)) - (bytes (* nfds pollfd-size))) - (alien:with-bytes (fds-sap bytes) - (do ((sockets sockets (rest sockets)) - (base 0 (+ base 8))) - ((endp sockets)) - (let ((fd (socket (first sockets)))) - (setf (sys:sap-ref-32 fds-sap base) fd) - (setf (sys:sap-ref-16 fds-sap (+ base 4)) unix::pollin))) - (multiple-value-bind (result errno) - (let ((thread:*thread-whostate* "Poll wait") - (timeout (if timeout - (truncate (* timeout 1000)) - -1))) - (declare (inline unix:unix-poll)) - (unix:unix-poll (alien:sap-alien fds-sap - (* (alien:struct unix::pollfd))) - nfds timeout)) - (cond ((not result) - (error "~@" - (unix:get-unix-error-msg errno))) - (t - (do ((sockets sockets (rest sockets)) - (base 0 (+ base 8))) - ((endp sockets)) - (let ((flags (sys:sap-ref-16 fds-sap (+ base 6)))) - (unless (zerop (logand flags unix::pollin)) - (setf (state (first sockets)) :READ)))))))))) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/condition.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/condition.lisp deleted file mode 100644 index 1e1dc44..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/condition.lisp +++ /dev/null @@ -1,237 +0,0 @@ -;;;; -*- Mode: LISP; Base: 10; Syntax: ANSI-Common-lisp; Package: USOCKET -*- -;;;; See LICENSE for licensing information. - -(in-package :usocket) - -;; Condition signalled by operations with unsupported arguments -;; For trivial-sockets compatibility. - -(define-condition insufficient-implementation (error) - ((feature :initarg :feature :reader feature) - (context :initarg :context :reader context - :documentation "String designator of the public API function which -the feature belongs to.")) - (:documentation "The ancestor of all errors usocket may generate -because of insufficient support from the underlying implementation -with respect to the arguments given to `function'. - -One call may signal several errors, if the caller allows processing -to continue. -")) - -(define-condition unsupported (insufficient-implementation) - ((minimum :initarg :minimum :reader minimum - :documentation "Indicates the minimal version of the -implementation required to support the requested feature.")) - (:report (lambda (c stream) - (format stream "~A in ~A is unsupported." - (feature c) (context c)) - (when (minimum c) - (format stream " Minimum version (~A) is required." - (minimum c))))) - (:documentation "Signalled when the underlying implementation -doesn't allow supporting the requested feature. - -When you see this error, go bug your vendor/implementation developer!")) - -(define-condition unimplemented (insufficient-implementation) - () - (:report (lambda (c stream) - (format stream "~A in ~A is unimplemented." - (feature c) (context c)))) - (:documentation "Signalled if a certain feature might be implemented, -based on the features of the underlying implementation, but hasn't -been implemented yet.")) - -;; Conditions raised by sockets operations - -(define-condition socket-condition (condition) - ((socket :initarg :socket - :accessor usocket-socket)) - ;;###FIXME: no slots (yet); should at least be the affected usocket... - (:documentation "Parent condition for all socket related conditions.")) - -(define-condition socket-error (socket-condition error) - () ;; no slots (yet) - (:documentation "Parent error for all socket related errors")) - -(define-condition ns-condition (condition) - ((host-or-ip :initarg :host-or-ip - :accessor host-or-ip)) - (:documentation "Parent condition for all name resolution conditions.")) - -(define-condition ns-error (ns-condition error) - () - (:documentation "Parent error for all name resolution errors.")) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun define-usocket-condition-class (class &rest parents) - `(progn - (define-condition ,class ,parents ()) - (eval-when (:load-toplevel :execute) - (export ',class))))) - -(defmacro define-usocket-condition-classes (class-list parents) - `(progn ,@(mapcar #'(lambda (x) - (apply #'define-usocket-condition-class - x parents)) - class-list))) - -;; Mass define and export our conditions -(define-usocket-condition-classes - (interrupted-condition) - (socket-condition)) - -(define-condition unknown-condition (socket-condition) - ((real-condition :initarg :real-condition - :accessor usocket-real-condition)) - (:documentation "Condition raised when there's no other - more applicable - -condition available.")) - - -;; Mass define and export our errors -(define-usocket-condition-classes - (address-in-use-error - address-not-available-error - bad-file-descriptor-error - connection-refused-error - connection-aborted-error - connection-reset-error - invalid-argument-error - no-buffers-error - operation-not-supported-error - operation-not-permitted-error - protocol-not-supported-error - socket-type-not-supported-error - network-unreachable-error - network-down-error - network-reset-error - host-down-error - host-unreachable-error - shutdown-error - timeout-error - deadline-timeout-error - invalid-socket-error - invalid-socket-stream-error) - (socket-error)) - -(define-condition unknown-error (socket-error) - ((real-error :initarg :real-error - :accessor usocket-real-error - :initform nil) - (errno :initarg :errno - :reader usocket-errno - :initform 0)) - (:report (lambda (c stream) - (typecase c - (simple-condition - (format stream - (simple-condition-format-control (usocket-real-error c)) - (simple-condition-format-arguments (usocket-real-error c)))) - (otherwise - (format stream "The condition ~A occurred with errno: ~D." - (usocket-real-error c) - (usocket-errno c)))))) - (:documentation "Error raised when there's no other - more applicable - -error available.")) - -(define-usocket-condition-classes - (ns-try-again-condition) - (ns-condition)) - -(define-condition ns-unknown-condition (ns-condition) - ((real-condition :initarg :real-condition - :accessor ns-real-condition - :initform nil)) - (:documentation "Condition raised when there's no other - more applicable - -condition available.")) - -(define-usocket-condition-classes - ;; the no-data error code in the Unix 98 api - ;; isn't really an error: there's just no data to return. - ;; with lisp, we just return NIL (indicating no data) instead of - ;; raising an exception... - (ns-host-not-found-error - ns-no-recovery-error) - (ns-error)) - -(define-condition ns-unknown-error (ns-error) - ((real-error :initarg :real-error - :accessor ns-real-error - :initform nil)) - (:report (lambda (c stream) - (typecase c - (simple-condition - (format stream - (simple-condition-format-control (usocket-real-error c)) - (simple-condition-format-arguments (usocket-real-error c)))) - (otherwise - (format stream "The condition ~A occurred." (usocket-real-error c)))))) - (:documentation "Error raised when there's no other - more applicable - -error available.")) - -(defmacro with-mapped-conditions ((&optional socket host-or-ip) &body body) - `(handler-bind ((condition - #'(lambda (c) (handle-condition c ,socket ,host-or-ip)))) - ,@body)) - -(defparameter +unix-errno-condition-map+ - `(((11) . ns-try-again-condition) ;; EAGAIN - ((35) . ns-try-again-condition) ;; EDEADLCK - ((4) . interrupted-condition))) ;; EINTR - -(defparameter +unix-errno-error-map+ - ;;### the first column is for non-(linux or srv4) systems - ;; the second for linux - ;; the third for srv4 - ;;###FIXME: How do I determine on which Unix we're running - ;; (at least in clisp and sbcl; I know about cmucl...) - ;; The table below works under the assumption we'll *only* see - ;; socket associated errors... - `(((48 98) . address-in-use-error) - ((49 99) . address-not-available-error) - ((9) . bad-file-descriptor-error) - ((61 111) . connection-refused-error) - ((54 104) . connection-reset-error) - ((53 103) . connection-aborted-error) - ((22) . invalid-argument-error) - ((55 105) . no-buffers-error) - ((12) . out-of-memory-error) - ((45 95) . operation-not-supported-error) - ((1) . operation-not-permitted-error) - ((43 92) . protocol-not-supported-error) - ((44 93) . socket-type-not-supported-error) - ((51 101) . network-unreachable-error) - ((50 100) . network-down-error) - ((52 102) . network-reset-error) - ((58 108) . already-shutdown-error) - ((60 110) . timeout-error) - ((64 112) . host-down-error) - ((65 113) . host-unreachable-error))) - -(defun map-errno-condition (errno) - (cdr (assoc errno +unix-errno-error-map+ :test #'member))) - -(defun map-errno-error (errno) - (cdr (assoc errno +unix-errno-error-map+ :test #'member))) - -(defparameter +unix-ns-error-map+ - `((1 . ns-host-not-found-error) - (2 . ns-try-again-condition) - (3 . ns-no-recovery-error))) - -(defmacro unsupported (feature context &key minimum) - `(cerror "Ignore it and continue" 'unsupported - :feature ,feature - :context ,context - :minimum ,minimum)) - -(defmacro unimplemented (feature context) - `(signal 'unimplemented :feature ,feature :context ,context)) - -;;; People may want to ignore all unsupported warnings, here it is. -(defmacro ignore-unsupported-warnings (&body body) - `(handler-bind ((unsupported - #'(lambda (c) - (declare (ignore c)) (continue)))) - (progn ,@body))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/doc/intro.dita b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/doc/intro.dita deleted file mode 100644 index 174639a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/doc/intro.dita +++ /dev/null @@ -1,10 +0,0 @@ - - - - - -Introduction - -Chun Tian -

diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/doc/reference.dita b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/doc/reference.dita deleted file mode 100644 index d4e3f9f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/doc/reference.dita +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - -API References -Chun Tian -

diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/doc/usocket.ditamap b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/doc/usocket.ditamap deleted file mode 100644 index 2dfe2b9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/doc/usocket.ditamap +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - -USOCKET Manual - - -API References diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/abcl-socket.txt b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/abcl-socket.txt deleted file mode 100644 index 531ace9..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/abcl-socket.txt +++ /dev/null @@ -1,18 +0,0 @@ - -ABCL provides a callback interface to java objects, next to these calls: - - - ext:make-socket - - ext:socket-close - - ext:make-server-socket - - ext:socket-accept - - ext:get-socket-stream (returning an io-stream) - -abcl-swank (see SLIME) shows how to call directly into java. - - -See for the sockets implementation: - - - src/org/armedbear/lisp - * socket.lisp - * socket_stream.java - * SocketStream.java diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/active-sockets-apis.txt b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/active-sockets-apis.txt deleted file mode 100644 index b74ccfe..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/active-sockets-apis.txt +++ /dev/null @@ -1,75 +0,0 @@ - -*- text -*- - -A document to summarizing which API's of the different implementations -are associated with 'Step 1'. - -Interface to be implemented in step 1: - - - socket-connect - - socket-close - - get-host-by-address - - get-hosts-by-name - -(and something to do with errors; maybe move this to step 1a?) - -SBCL -==== - - sockets: - - socket-bind - - make-instance 'inet-socket - - socket-make-stream - - socket-connect (ip vector-quad) port - - socket-close - - DNS name resolution: - - get-host-by-name - - get-host-by-address - - ::host-ent-addresses - - host-ent-name - - -CMUCL -===== - - sockets: - - ext:connect-to-inet-socket (ip integer) port - - sys:make-fd-stream - - ext:close-socket - - DNS name resolution: - - ext:host-entry-name - - ext::lookup-host-entry - - ext:host-entry-addr-list - - ext:lookup-host-entry - - -ABCL -==== - - sockets - - ext:socket-connect (hostname string) port - - ext:get-socket-stream - - ext:socket-close - - -clisp -===== - - sockets - - socket-connect port (hostname string) - - close (socket) - - -Allegro -======= - - sockets - - make-socket - - socket-connect - - close - - DNS resolution - - lookup-hostname - - ipaddr-to-hostname - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/address-apis.txt b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/address-apis.txt deleted file mode 100644 index 2661ac2..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/address-apis.txt +++ /dev/null @@ -1,73 +0,0 @@ - - -*- text -*- - -Step 2 of the master plan: Implementing (get-local-address sock) and -(get-peer-address sock). - - -Step 2 is about implementing: - - (get-local-address sock) -> ip - (get-peer-address sock) -> ip - (get-local-port sock) -> port - (get-peer-port sock) -> port - (get-local-name sock) -> ip, port - (get-peer-name sock) -> ip, port - - -ABCL -==== - - FFI / J-calls to "getLocalAddress"+"getAddress", "getLocalPort" (local) - FFI / J-calls to "getInetAddress"+"getAddress", "getPort" (peer) - - (see SLIME / swank-abcl.lisp for an example on how to do that) - - -Allegro -======= - - (values (socket:remote-host sock) - (socket:remote-port)) -> 32bit ip, port - - (values (socket:local-host sock) - (socket:local-port sock)) -> 32bit ip, port - -CLISP -===== - - (socket:socket-stream-local sock nil) -> address (as dotted quad), port - (socket:socket-stream-peer sock nil) -> address (as dotted quad), port - - -CMUCL -===== - - (ext:get-peer-host-and-port sock-fd) -> 32-bit-addr, port (peer) - (ext:get-socket-host-and-port sock-fd) -> 32-bit-addr, port (local) - - -LispWorks -========= - - (comm:socket-stream-address sock-stream) -> 32-bit-addr, port - or: (comm:get-socket-address sock) -> 32-bit-addr, port - - (comm:socket-stream-peer-address sock-stream) -> 32-bit-addr, port - or: (comm:get-socket-peer-address sock) -> 32-bit-addr, port - - -OpenMCL -======= - - (values (ccl:local-host sock) (ccl:local-port sock)) -> 32-bit ip, port - (values (ccl:remote-host sock) (ccl:remote-port sock)) -> 32-bit ip, port - - -SBCL -==== - - (sb-bsd-sockets:socket-name sock) -> vector-quad, port - (sb-bsd-sockets:socket-peer-name sock) -> vector-quad, port - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/allegro-socket.txt b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/allegro-socket.txt deleted file mode 100644 index 8f90ca7..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/allegro-socket.txt +++ /dev/null @@ -1,46 +0,0 @@ - - -(require :sock) - -accept-connection (sock passive-socket) &key wait Generic function. -dotted-to-ipaddr dotted &key errorp Function. -ipaddr-to-dotted ipaddr &key values Function. -ipaddr-to-hostname ipaddr Function. -lookup-hostname hostname -lookup-port portname protocol Function. -make-socket &key type format address-family connect &allow-other-keys Function. -with-pending-connect &body body Macro. -receive-from (sock datagram-socket) size &key buffer extract Generic function. -send-to sock &key -shutdown sock &key direction -socket-control stream &key output-chunking output-chunking-eof input-chunking -socket-os-fd sock Generic function. - -remote-host socket Generic function. -local-host socket Generic function. -local-port socket - -remote-filename socket -local-filename socket -remote-port socket -socket-address-family socket -socket-connect socket -socket-format socket -socket-type socket - -errors - -:address-in-use Local socket address already in use -:address-not-available Local socket address not available -:network-down Network is down -:network-reset Network has been reset -:connection-aborted Connection aborted -:connection-reset Connection reset by peer -:no-buffer-space No buffer space -:shutdown Connection shut down -:connection-timed-out Connection timed out -:connection-refused Connection refused -:host-down Host is down -:host-unreachable Host is unreachable -:unknown Unknown error - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/backends.txt b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/backends.txt deleted file mode 100644 index c2c770f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/backends.txt +++ /dev/null @@ -1,60 +0,0 @@ - -*- text -*- - -$Id$ - -A document to describe which APIs a backend should implement. - - -Each backend should implement: - -Functions: - - - handle-condition - - socket-connect - - socket-listen - - get-hosts-by-name [ optional ] - - get-host-by-address [ optional ] - - - wait-for-input-internal (new in 0.4.x) - -Methods: - - - socket-close - - socket-accept - - get-local-name - - get-peer-name - - and - for ip sockets - these methods: - - - get-local-address - - get-local-port - - get-peer-address - - get-peer-port - - -An error-handling function, resolving implementation specific errors -to this list of errors: - - - address-in-use-error - - address-not-available-error - - bad-file-descriptor-error - - connection-refused-error - - invalid-argument-error - - no-buffers-error - - operation-not-supported-error - - operation-not-permitted-error - - protocol-not-supported-error - - socket-type-not-supported-error - - network-unreachable-error - - network-down-error - - network-reset-error - - host-down-error - - host-unreachable-error - - shutdown-error - - timeout-error - - unkown-error - -and these conditions: - - - interrupted-condition - - unkown-condition diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/clisp-sockets.txt b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/clisp-sockets.txt deleted file mode 100644 index e680fe8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/clisp-sockets.txt +++ /dev/null @@ -1,38 +0,0 @@ -http://clisp.cons.org/impnotes.html#socket - -(SOCKET:SOCKET-SERVER &OPTIONAL [port-or-socket]) -(SOCKET:SOCKET-SERVER-HOST socket-server) -(SOCKET:SOCKET-SERVER-PORT socket-server) -(SOCKET:SOCKET-WAIT socket-server &OPTIONAL [seconds [microseconds]]) -(SOCKET:SOCKET-ACCEPT socket-server &KEY :ELEMENT-TYPE :EXTERNAL-FORMAT :BUFFERED :TIMEOUT) -(SOCKET:SOCKET-CONNECT port &OPTIONAL [host] &KEY :ELEMENT-TYPE :EXTERNAL-FORMAT :BUFFERED :TIMEOUT) -(SOCKET:SOCKET-STATUS socket-stream-or-list &OPTIONAL [seconds [microseconds]]) -(SOCKET:SOCKET-STREAM-HOST socket-stream) -(SOCKET:SOCKET-STREAM-PORT socket-stream) -(SOCKET:SOCKET-SERVICE-PORT &OPTIONAL service-name (protocol "tcp")) -(SOCKET:SOCKET-STREAM-PEER socket-stream [do-not-resolve-p]) -(SOCKET:SOCKET-STREAM-LOCAL socket-stream [do-not-resolve-p]) -(SOCKET:SOCKET-STREAM-SHUTDOWN socket-stream direction) -(SOCKET:SOCKET-OPTIONS socket-server &REST {option}*) - - -(posix:resolve-host-ipaddr &optional host) - -with the host-ent structure: - - name - host name - aliases - LIST of aliases - addr-list - LIST of IPs as dotted quads (IPv4) or coloned octets (IPv6) - addrtype - INTEGER address type IPv4 or IPv6 - - -Errors are of type - -SYSTEM::SIMPLE-OS-ERROR - with a 1 element (integer) SYSTEM::$FORMAT-ARGUMENTS list - -This integer stores the OS error reported; meaning WSA* codes on Win32 -and E* codes on *nix, only: unix.lisp in CMUCL shows -BSD, Linux and SRV4 have different number assignments for the same -E* constant names :-( - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/cmucl-sockets.txt b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/cmucl-sockets.txt deleted file mode 100644 index 7b81ca3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/cmucl-sockets.txt +++ /dev/null @@ -1,69 +0,0 @@ -http://cvs2.cons.org/ftp-area/cmucl/doc/cmu-user/internet.html - -$Id$ - -extensions:lookup-host-entry host - -[structure] -host-entry - - name aliases addr-type addr-list - -[Function] -extensions:create-inet-listener port &optional kind &key :reuse-address :backlog :interface - => socket fd - -[Function] -extensions:accept-tcp-connection unconnected - => socket fd, address - -[Function] -extensions:connect-to-inet-socket host port &optional kind - => socket fd - -[Function] -extensions:close-socket socket - - - -[Private function] -extensions::get-peer-host-and-port socket-fd - -[Private function] -extentsions::get-socket-host-and-port socket-fd - - - -There's currently only 1 condition to be raised: - - SOCKET-ERROR (derived from SIMPLE-ERROR) - which has a SOCKET-ERRNO slot containing the unix error number. - - - - -[Function] -extensions:add-oob-handler fd char handler - -[Function] -extensions:remove-oob-handler fd char - -[Function] -extensions:remove-all-oob-handlers fd - -[Function] -extensions:send-character-out-of-band fd char - -[Function] -extensions:create-inet-socket &optional type - => socket fd - -[Function] -extensions:get-socket-option socket level optname - -[Function] -extensions:set-socket-option socket level optname optval - -[Function] -extensions:ip-string addr - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/design.txt b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/design.txt deleted file mode 100644 index 2f9c487..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/design.txt +++ /dev/null @@ -1,136 +0,0 @@ - - -*- text -*- - -$Id$ - - - usocket: Universal sockets library - ================================== - -Contents -======== - - * Motivation - * Design goal - * Functional requirements - * Class structure - - - -Motivation -========== - -There are 2 other portability sockets packages [that I know of] -out there: - - 1) trivial-sockets - 2) acl-compat (which is a *lot* broader, but contains sockets too) - -The first misses some functionality which is fundamental when -the requirements stop being 'trivial', such as finding out the -addresses of either side connected to the tcp/ip stream. - -The second, being a complete compatibility library for Allegro, -contains much more than only sockets. Next to that, as the docs -say, is it mainly directed at providing the functionality required -to port portable-allegroserve - meaning it may be (very) incomplete -on some platforms. - -So, that's why I decided to inherit Erik Enge's project to build -a library with the intention to provide portability code in only -1 area of programming, targeted at 'not so trivial' programming. - -Also, I need this library to extend cl-irc with full DCC functionality. - - - -Design goal -=========== - -To provide a portable TCP/IP socket interface for as many -implementations as possible, while keeping the portability layer -as thin as possible. - - - -Functional requirements -======================= - -The interface provided should allow: - - 'client'/active sockets - - 'server'/listening sockets - - provide the usual stream methods to operate on the connection stream - (not necessarily the socket itself; maybe a socket slot too) - -For now, as long as there are no possibilities to have UDP sockets -to write a DNS client library: (which in the end may work better, -because in this respect all implementations are different...) - - retrieve IP addresses/ports for both sides of the connection - -Several relevant support functionalities will have to be provided too: - - long <-> quad-vector operators - - quad-vector <-> string operators - - hostname <-> quad-vector operators (hostname resolution) - - -Minimally, I'd like to support: - - SBCL - - CMUCL - - ABCL (ArmedBear) - - clisp - - Allegro - - LispWorks - - OpenMCL - - -Comments on the design above -============================ - -I don't think it's a good idea to implement name lookup in the -very first of steps: we'll see if this is required to get the -package accepted; not all implementations support it. - -Name resolution errors ... -Since there is no name resolution library (yet), nor standardized -hooks into the standard C library to do it the same way on -all platforms, name resolution errors can manifest themselves -in a lot of different ways. How to marshall these to the -library users? - -Several solutions come to mind: - -1) Map them to 'unknown-error -2) Give them their own errors and map to those - ... which implies that they are actually supported atm. -3) ... - -Given that the library doesn't now, but may in the future, -include name resolution officially, I tend to think (1) is the -right answer: it leaves it all undecided. - -These errors can be raised by the nameresolution service -(netdb.h) as values for 'int h_errno': - -- HOST_NOT_FOUND (1) -- TRY_AGAIN (2) /* Server fail or non-authoritive Host not found */ -- NO_RECOVERY (3) /* Failed permanently */ -- NO_DATA (4) /* Valid address, no data for requested record */ - -int *__h_errno_location(void) points to thread local h_errno on -threaded glibc2 systems. - - -Class structure -=============== - - usocket - | - +- datagram-usocket - +- stream-usocket - \- stream-server-usocket - -The usocket class will have methods to query local properties, such -as: - - - get-local-name: to query to which interface the socket is bound - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/errors.txt b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/errors.txt deleted file mode 100644 index 148525c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/errors.txt +++ /dev/null @@ -1,20 +0,0 @@ -EADDRINUSE 48 address-in-use-error -EADDRNOTAVAIL 49 address-not-available-error -EAGAIN interrupted-error ;; not 1 error code: bsd == 11; non-bsd == 35 -EBADF 9 bad-file-descriptor-error -ECONNREFUSED 61 connection-refused-error -EINTR 4 interrupted-error -EINVAL 22 invalid-argument-error -ENOBUFS 55 no-buffers-error -ENOMEM 12 out-of-memory-error -EOPNOTSUPP 45 operation-not-supported-error -EPERM 1 operation-not-permitted-error -EPROTONOSUPPORT 43 protocol-not-supported-error -ESOCKTNOSUPPORT 44 socket-type-not-supported-error -ENETUNREACH 51 network-unreachable-error -ENETDOWN 50 network-down-error -ENETRESET 52 network-reset-error -ESHUTDOWN 58 already-shutdown-error -ETIMEDOUT 60 connection-timeout-error -EHOSTDOWN 64 host-down-error -EHOSTUNREACH 65 host-unreachable-error diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/lw-sockets.txt b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/lw-sockets.txt deleted file mode 100644 index 666ede8..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/lw-sockets.txt +++ /dev/null @@ -1,41 +0,0 @@ - -$Id$ - -http://www.lispworks.com/reference/lwu41/lwref/LWRM_37.HTM - -Package: COMM - -ip-address-string -socket-stream-address -socket-stream-peer-address -start-up-server -start-up-server-and-mp -string-ip-address -with-noticed-socket-stream - -Needed components for usocket: - -comm::get-fd-from-socket socket-fd - => socket-fd - -comm::accept-connection-to-socket socket-fd - => socket-fd - -comm::close-socket -comm::create-tcp-socket-for-service - => socket-fd - -open-tcp-stream peer-host peer-port &key direction element-type - => socket-stream - -get-host-entry (see http://www.lispworks.com/documentation/lw445/LWRM/html/lwref-30.htm#pgfId-897837) -get-socket-address - -get-socket-peer-address - => address, port - -socket-stream socket-fd - => stream - -socket socket-stream (guessed from http://www.lispworks.com/documentation/lw445/LWRM/html/lwref-43.htm) - => socket-fd diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/openmcl-sockets.txt b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/openmcl-sockets.txt deleted file mode 100644 index 1a7ee4d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/openmcl-sockets.txt +++ /dev/null @@ -1,27 +0,0 @@ -http://openmcl.clozure.com/Doc/sockets.html - - make-socket [Function] - accept-connection [Function] - dotted-to-ipaddr [Function] - ipaddr-to-dotted [Function] - ipaddr-to-hostname [Function] - lookup-hostname [Function] - lookup-port [Function] - receive-from [Function] - send-to [Function] - shutdown [Function] - socket-os-fd [Function] - remote-port [Function] - local-host [Function] - local-port [Function] - - socket-address-family [Function] - - socket-connect [Function] - socket-format [Function] - socket-type [Function] - socket-error [Class] - socket-error-code [Function] - socket-error-identifier [Function] - socket-error-situation [Function] - close [method] diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/sb-bsd-sockets.txt b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/sb-bsd-sockets.txt deleted file mode 100644 index e80b583..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/sb-bsd-sockets.txt +++ /dev/null @@ -1,114 +0,0 @@ -http://www.xach.com/sbcl/sb-bsd-sockets.html - -$Id$ - -package: sb-bsd-sockets - -class: socket - -slots: - - * file-descriptor : - * family : - * protocol : - * type : - * stream : - -operators: - - (socket-bind (s socket) &rest address) Generic Function - (socket-accept (socket socket)) Method - (socket-connect (s socket) &rest address) Generic Function - (socket-peername (socket socket)) Method - (socket-name (socket socket)) Method - (socket-receive (socket socket) buffer length &key oob peek waitall (element-type 'character)) Method - (socket-listen (socket socket) backlog) Method - (socket-close (socket socket)) Method - (socket-make-stream (socket socket) &rest args) Method - - (sockopt-reuse-address (socket socket) argument) Accessor - (sockopt-keep-alive (socket socket) argument) Accessor - (sockopt-oob-inline (socket socket) argument) Accessor - (sockopt-bsd-compatible (socket socket) argument) Accessor - (sockopt-pass-credentials (socket socket) argument) Accessor - (sockopt-debug (socket socket) argument) Accessor - (sockopt-dont-route (socket socket) argument) Accessor - (sockopt-broadcast (socket socket) argument) Accessor - (sockopt-tcp-nodelay (socket socket) argument) Accessor - -inet-domain sockets - -class: inet-socket - -slots: - - * family : - -operators: - - (make-inet-address dotted-quads) Function - (get-protocol-by-name name) Function - (make-inet-socket type protocol) Function - -file-domain sockets - -class: unix-socket - -slots: - - * family : - -class: host-ent - -Slots: - - * name : - * aliases : - * address-type : - * addresses : - - (host-ent-address (host-ent host-ent)) Method - (get-host-by-name host-name) Function - (get-host-by-address address) Function - (name-service-error where) Function - (non-blocking-mode (socket socket)) Method - -(define-socket-condition sockint::EADDRINUSE address-in-use-error) -(define-socket-condition sockint::EAGAIN interrupted-error) -(define-socket-condition sockint::EBADF bad-file-descriptor-error) -(define-socket-condition sockint::ECONNREFUSED connection-refused-error) -(define-socket-condition sockint::EINTR interrupted-error) -(define-socket-condition sockint::EINVAL invalid-argument-error) -(define-socket-condition sockint::ENOBUFS no-buffers-error) -(define-socket-condition sockint::ENOMEM out-of-memory-error) -(define-socket-condition sockint::EOPNOTSUPP operation-not-supported-error) -(define-socket-condition sockint::EPERM operation-not-permitted-error) -(define-socket-condition sockint::EPROTONOSUPPORT protocol-not-supported-error) -(define-socket-condition sockint::ESOCKTNOSUPPORT socket-type-not-supported-error) -(define-socket-condition sockint::ENETUNREACH network-unreachable-error) - -Exported errors: -* (apropos "ERROR" :sb-bsd-sockets) - -SB-BSD-SOCKETS:INTERRUPTED-ERROR -SB-BSD-SOCKETS:TRY-AGAIN-ERROR -* SB-BSD-SOCKETS:NO-RECOVERY-ERROR (EFAIL?) -SB-BSD-SOCKETS:CONNECTION-REFUSED-ERROR -SB-BSD-SOCKETS:INVALID-ARGUMENT-ERROR -* SB-BSD-SOCKETS:HOST-NOT-FOUND-ERROR -SB-BSD-SOCKETS:OPERATION-NOT-PERMITTED-ERROR -SB-BSD-SOCKETS:OPERATION-NOT-SUPPORTED-ERROR -SB-BSD-SOCKETS:PROTOCOL-NOT-SUPPORTED-ERROR -SB-BSD-SOCKETS:OPERATION-TIMEOUT-ERROR -SB-BSD-SOCKETS:SOCKET-TYPE-NOT-SUPPORTED-ERROR -SB-BSD-SOCKETS:NO-BUFFERS-ERROR -SB-BSD-SOCKETS:NETWORK-UNREACHABLE-ERROR -SB-BSD-SOCKETS:BAD-FILE-DESCRIPTOR-ERROR -SB-BSD-SOCKETS:ADDRESS-IN-USE-ERROR -SB-BSD-SOCKETS:OUT-OF-MEMORY-ERROR - -And 1 non-exported error: - -SB-BSD-SOCKETS::NO-ADDRESS-ERROR - -*-ed errors aren't yet addressed in the errorlist supported by usocket diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/usock-sockets.txt b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/usock-sockets.txt deleted file mode 100644 index 562dc58..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/notes/usock-sockets.txt +++ /dev/null @@ -1,28 +0,0 @@ -Package: - - clisp : socket - cmucl : extensions - sbcl : sb-bsd-sockets - lw : comm - openmcl: openmcl-socket - allegro: sock - -Connecting (TCP/inet only) - - clisp : socket-connect port &optional [host] &key :element-type :external-format :buffered :timeout = > socket-stream - cmucl : connect-to-inet-socket host port &optional kind => file descriptor - sbcl : sb-socket-connect socket &rest address => socket - lw : open-tcp-stream hostname service &key direction element-type buffered => stream-object - openmcl: socket-connect socket => :active, :passive or nil - allegro: make-socket (&rest args &key type format connect address-family eol) => socket - -Closing - - clisp : close socket - cmucl : close-socket socket - sbcl : socket-close socket - lw : close socket - openmcl: close socket - allegro: close socket - -Errors \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/option.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/option.lisp deleted file mode 100644 index 4bc3e1b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/option.lisp +++ /dev/null @@ -1,353 +0,0 @@ -;;;; -*- Mode: LISP; Base: 10; Syntax: ANSI-Common-lisp; Package: USOCKET -*- -;;;; SOCKET-OPTION, a high-level socket option get/set framework - -;;;; See LICENSE for licensing information. - -(in-package :usocket) - -;; put here because option.lisp is for native backend only -(defparameter *backend* :native) - -;;; Interface definition - -(defgeneric socket-option (socket option &key) - (:documentation - "Get a socket's internal options")) - -(defgeneric (setf socket-option) (new-value socket option &key) - (:documentation - "Set a socket's internal options")) - -;;; Handling of wrong type of arguments - -(defmethod socket-option ((socket usocket) (option t) &key) - (error 'type-error :datum option :expected-type 'keyword)) - -(defmethod (setf socket-option) (new-value (socket usocket) (option t) &key) - (declare (ignore new-value)) - (socket-option socket option)) - -(defmethod socket-option ((socket usocket) (option symbol) &key) - (if (keywordp option) - (error 'unimplemented :feature option :context 'socket-option) - (error 'type-error :datum option :expected-type 'keyword))) - -(defmethod (setf socket-option) (new-value (socket usocket) (option symbol) &key) - (declare (ignore new-value)) - (socket-option socket option)) - -;;; Socket option: RECEIVE-TIMEOUT (SO_RCVTIMEO) - -(defmethod socket-option ((usocket stream-usocket) - (option (eql :receive-timeout)) &key) - (declare (ignorable option)) - (let ((socket (socket usocket))) - (declare (ignorable socket)) - #+abcl - () ; TODO - #+allegro - () ; TODO - #+clisp - (socket:socket-options socket :so-rcvtimeo) - #+clozure - (ccl:stream-input-timeout socket) - #+cmu - (lisp::fd-stream-timeout (socket-stream usocket)) - #+(or ecl clasp) - (sb-bsd-sockets:sockopt-receive-timeout socket) - #+lispworks - (get-socket-receive-timeout socket) - #+mcl - () ; TODO - #+mocl - () ; unknown - #+sbcl - (sb-impl::fd-stream-timeout (socket-stream usocket)) - #+scl - ())) ; TODO - -(defmethod (setf socket-option) (new-value (usocket stream-usocket) - (option (eql :receive-timeout)) &key) - (declare (type number new-value) (ignorable new-value option)) - (let ((socket (socket usocket)) - (timeout new-value)) - (declare (ignorable socket timeout)) - #+abcl - () ; TODO - #+allegro - () ; TODO - #+clisp - (socket:socket-options socket :so-rcvtimeo timeout) - #+clozure - (setf (ccl:stream-input-timeout socket) timeout) - #+cmu - (setf (lisp::fd-stream-timeout (socket-stream usocket)) - (coerce timeout 'integer)) - #+(or ecl clasp) - (setf (sb-bsd-sockets:sockopt-receive-timeout socket) timeout) - #+lispworks - (set-socket-receive-timeout socket timeout) - #+mcl - () ; TODO - #+mocl - () ; unknown - #+sbcl - (setf (sb-impl::fd-stream-timeout (socket-stream usocket)) - (coerce timeout 'single-float)) - #+scl - () ; TODO - new-value)) - -;;; Socket option: SEND-TIMEOUT (SO_SNDTIMEO) - -(defmethod socket-option ((usocket stream-usocket) - (option (eql :send-timeout)) &key) - (declare (ignorable option)) - (let ((socket (socket usocket))) - (declare (ignorable socket)) - #+abcl - () ; TODO - #+allegro - () ; TODO - #+clisp - (socket:socket-options socket :so-sndtimeo) - #+clozure - (ccl:stream-output-timeout socket) - #+cmu - (lisp::fd-stream-timeout (socket-stream usocket)) - #+(or ecl clasp) - (sb-bsd-sockets:sockopt-send-timeout socket) - #+lispworks - (get-socket-send-timeout socket) - #+mcl - () ; TODO - #+mocl - () ; unknown - #+sbcl - (sb-impl::fd-stream-timeout (socket-stream usocket)) - #+scl - ())) ; TODO - -(defmethod (setf socket-option) (new-value (usocket stream-usocket) - (option (eql :send-timeout)) &key) - (declare (type number new-value) (ignorable new-value option)) - (let ((socket (socket usocket)) - (timeout new-value)) - (declare (ignorable socket timeout)) - #+abcl - () ; TODO - #+allegro - () ; TODO - #+clisp - (socket:socket-options socket :so-sndtimeo timeout) - #+clozure - (setf (ccl:stream-output-timeout socket) timeout) - #+cmu - (setf (lisp::fd-stream-timeout (socket-stream usocket)) - (coerce timeout 'integer)) - #+(or ecl clasp) - (setf (sb-bsd-sockets:sockopt-send-timeout socket) timeout) - #+lispworks - (set-socket-send-timeout socket timeout) - #+mcl - () ; TODO - #+mocl - () ; unknown - #+sbcl - (setf (sb-impl::fd-stream-timeout (socket-stream usocket)) - (coerce timeout 'single-float)) - #+scl - () ; TODO - new-value)) - -;;; Socket option: REUSE-ADDRESS (SO_REUSEADDR), for TCP server - -(defmethod socket-option ((usocket stream-server-usocket) - (option (eql :reuse-address)) &key) - (declare (ignorable option)) - (let ((socket (socket usocket))) - (declare (ignorable socket)) - #+abcl - () ; TODO - #+allegro - () ; TODO - #+clisp - (int->bool (socket:socket-options socket :so-reuseaddr)) - #+clozure - (int->bool (get-socket-option-reuseaddr socket)) - #+cmu - () ; TODO - #+lispworks - (get-socket-reuse-address socket) - #+mcl - () ; TODO - #+mocl - () ; unknown - #+(or ecl sbcl clasp) - (sb-bsd-sockets:sockopt-reuse-address socket) - #+scl - ())) ; TODO - -(defmethod (setf socket-option) (new-value (usocket stream-server-usocket) - (option (eql :reuse-address)) &key) - (declare (type boolean new-value) (ignorable new-value option)) - (let ((socket (socket usocket))) - (declare (ignorable socket)) - #+abcl - () ; TODO - #+allegro - (socket:set-socket-options socket option new-value) - #+clisp - (socket:socket-options socket :so-reuseaddr (bool->int new-value)) - #+clozure - (set-socket-option-reuseaddr socket (bool->int new-value)) - #+cmu - () ; TODO - #+lispworks - (set-socket-reuse-address socket new-value) - #+mcl - () ; TODO - #+mocl - () ; unknown - #+(or ecl sbcl clasp) - (setf (sb-bsd-sockets:sockopt-reuse-address socket) new-value) - #+scl - () ; TODO - new-value)) - -;;; Socket option: BROADCAST (SO_BROADCAST), for UDP client - -(defmethod socket-option ((usocket datagram-usocket) - (option (eql :broadcast)) &key) - (declare (ignorable option)) - (let ((socket (socket usocket))) - (declare (ignorable socket)) - #+abcl - () ; TODO - #+allegro - () ; TODO - #+clisp - (int->bool (socket:socket-options socket :so-broadcast)) - #+clozure - (int->bool (get-socket-option-broadcast socket)) - #+cmu - () ; TODO - #+(or ecl clasp) - () ; TODO - #+lispworks - () ; TODO - #+mcl - () ; TODO - #+mocl - () ; unknown - #+sbcl - (sb-bsd-sockets:sockopt-broadcast socket) - #+scl - ())) ; TODO - -(defmethod (setf socket-option) (new-value (usocket datagram-usocket) - (option (eql :broadcast)) &key) - (declare (type boolean new-value) - (ignorable new-value option)) - (let ((socket (socket usocket))) - (declare (ignorable socket)) - #+abcl - () ; TODO - #+allegro - (socket:set-socket-options socket option new-value) - #+clisp - (socket:socket-options socket :so-broadcast (bool->int new-value)) - #+clozure - (set-socket-option-broadcast socket (bool->int new-value)) - #+cmu - () ; TODO - #+(or ecl clasp) - () ; TODO - #+lispworks - () ; TODO - #+mcl - () ; TODO - #+mocl - () ; unknown - #+sbcl - (setf (sb-bsd-sockets:sockopt-broadcast socket) new-value) - #+scl - () ; TODO - new-value)) - -;;; Socket option: TCP-NODELAY (TCP_NODELAY), for TCP client - -(defmethod socket-option ((usocket stream-usocket) - (option (eql :tcp-no-delay)) &key) - (declare (ignorable option)) - (socket-option usocket :tcp-nodelay)) - -(defmethod socket-option ((usocket stream-usocket) - (option (eql :tcp-nodelay)) &key) - (declare (ignorable option)) - (let ((socket (socket usocket))) - (declare (ignorable socket)) - #+abcl - () ; TODO - #+allegro - () ; TODO - #+clisp - (int->bool (socket:socket-options socket :tcp-nodelay)) - #+clozure - (int->bool (get-socket-option-tcp-nodelay socket)) - #+cmu - () - #+(or ecl clasp) - (sb-bsd-sockets::sockopt-tcp-nodelay socket) - #+lispworks - (int->bool (get-socket-tcp-nodelay socket)) - #+mcl - () ; TODO - #+mocl - () ; unknown - #+sbcl - (sb-bsd-sockets::sockopt-tcp-nodelay socket) - #+scl - ())) ; TODO - -(defmethod (setf socket-option) (new-value (usocket stream-usocket) - (option (eql :tcp-no-delay)) &key) - (declare (ignorable option)) - (setf (socket-option usocket :tcp-nodelay) new-value)) - -(defmethod (setf socket-option) (new-value (usocket stream-usocket) - (option (eql :tcp-nodelay)) &key) - (declare (type boolean new-value) - (ignorable new-value option)) - (let ((socket (socket usocket))) - (declare (ignorable socket)) - #+abcl - () ; TODO - #+allegro - (socket:set-socket-options socket :no-delay new-value) - #+clisp - (socket:socket-options socket :tcp-nodelay (bool->int new-value)) - #+clozure - (set-socket-option-tcp-nodelay socket (bool->int new-value)) - #+cmu - () - #+(or ecl clasp) - (setf (sb-bsd-sockets::sockopt-tcp-nodelay socket) new-value) - #+lispworks - (progn - #-(or lispworks4 lispworks5.0) - (comm::set-socket-tcp-nodelay socket new-value) - #+(or lispworks4 lispworks5.0) - (set-socket-tcp-nodelay socket (bool->int new-value))) - #+mcl - () ; TODO - #+mocl - () ; unknown - #+sbcl - (setf (sb-bsd-sockets::sockopt-tcp-nodelay socket) new-value) - #+scl - () ; TODO - new-value)) - -(eval-when (:load-toplevel :execute) - (export 'socket-option)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/package.lisp deleted file mode 100644 index 4db895c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/package.lisp +++ /dev/null @@ -1,126 +0,0 @@ -;;;; -*- Mode: LISP; Base: 10; Syntax: ANSI-Common-lisp; Package: CL-USER -*- -;;;; See the LICENSE file for licensing information. - -(defpackage :usocket - (:use #-genera :common-lisp - #+genera :future-common-lisp - #+abcl :java - :split-sequence) - (:export #:*version* - #:*wildcard-host* - #:*auto-port* - - #:+max-datagram-packet-size+ - - #:socket-connect ; socket constructors and methods - #:socket-listen - #:socket-accept - #:socket-close - #:socket-shutdown - #:get-local-address - #:get-peer-address - #:get-local-port - #:get-peer-port - #:get-local-name - #:get-peer-name - - #:socket-send ; udp function (send) - #:socket-receive ; udp function (receive) - - #:wait-for-input ; waiting for input-ready state (select() like) - #:make-wait-list - #:add-waiter - #:remove-waiter - #:remove-all-waiters - - #:with-connected-socket ; convenience macros - #:with-server-socket - #:with-client-socket - #:with-socket-listener - - #:usocket ; socket object and accessors - #:stream-usocket - #:stream-server-usocket - #:socket - #:socket-stream - #:datagram-usocket - #:socket-state ; 0.6.4 - - ;; predicates (for version 0.6 or 1.0 ?) - #:usocket-p - #:stream-usocket-p - #:stream-server-usocket-p - #:datagram-usocket-p - - #:host-byte-order ; IPv4 utility functions - #:hbo-to-dotted-quad - #:hbo-to-vector-quad - #:vector-quad-to-dotted-quad - #:dotted-quad-to-vector-quad - - #:vector-to-ipv6-host ; IPv6 utility functions - #:ipv6-host-to-vector - - #:ip= ; IPv4+IPv6 utility function - #:ip/= - - #:integer-to-octet-buffer ; Network utility functions - #:octet-buffer-to-integer - #:port-to-octet-buffer - #:port-from-octet-buffer - #:ip-to-octet-buffer - #:ip-from-octet-buffer - - #:with-mapped-conditions - - #:socket-condition ; conditions - #:ns-condition - #:socket-error ; errors - #:ns-error - #:unknown-condition - #:ns-unknown-condition - #:unknown-error - #:ns-unknown-error - #:socket-warning ; warnings (udp) - - #:insufficient-implementation ; conditions regarding usocket support level - #:unsupported - #:unimplemented - - #:socket-server - #:*remote-host* - #:*remote-port* - - ;; added in 0.7.1 - #:get-host-by-name - #:get-hosts-by-name - #:get-random-host-by-name - #:ns-host-not-found-error - #:ns-no-recovery-error - #:ns-try-again-condition - #:default-udp-handler - #:default-tcp-handler - #:echo-tcp-handler ;; server handlers - - ;; added in 0.8.0 - #:*backend* - #:*default-event-base* - #:host-to-hostname - - ;; these're socket-related conditions from IOlib - #:ADDRESS-NOT-AVAILABLE-ERROR #:HOST-DOWN-ERROR - #:OPERATION-NOT-SUPPORTED-ERROR #:SOCKET-OPTION - #:NETWORK-DOWN-ERROR #:INVALID-SOCKET-ERROR - #:SOCKET-TYPE-NOT-SUPPORTED-ERROR #:DEADLINE-TIMEOUT-ERROR - #:SHUTDOWN-ERROR #:HOST-UNREACHABLE-ERROR - #:NETWORK-UNREACHABLE-ERROR #:CONNECTION-ABORTED-ERROR - #:BAD-FILE-DESCRIPTOR-ERROR #:PROTOCOL-NOT-SUPPORTED-ERROR - #:CONNECTION-RESET-ERROR #:TIMEOUT-ERROR - #:ADDRESS-IN-USE-ERROR #:NO-BUFFERS-ERROR - #:INVALID-SOCKET-STREAM-ERROR #:INTERRUPTED-CONDITION - #:INVALID-ARGUMENT-ERROR #:OPERATION-NOT-PERMITTED-ERROR - #:NETWORK-RESET-ERROR #:CONNECTION-REFUSED-ERROR - - ;; added in 0.8.2 - #:host-or-ip - )) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/server.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/server.lisp deleted file mode 100644 index 9bd2076..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/server.lisp +++ /dev/null @@ -1,112 +0,0 @@ -;;;; See LICENSE for licensing information. - -(in-package :usocket) - -(defvar *server*) - -(defun socket-server (host port function &optional arguments - &key in-new-thread (protocol :stream) - ;; for udp - (timeout 1) (max-buffer-size +max-datagram-packet-size+) - ;; for tcp - element-type (reuse-address t) multi-threading - name) - (let* ((real-host (or host *wildcard-host*)) - (socket (ecase protocol - (:stream - (apply #'socket-listen - `(,real-host ,port - ,@(when element-type `(:element-type ,element-type)) - ,@(when reuse-address `(:reuse-address ,reuse-address))))) - (:datagram - (socket-connect nil nil :protocol :datagram - :local-host real-host - :local-port port))))) - (labels ((real-call () - (ecase protocol - (:stream - (tcp-event-loop socket function arguments - :element-type element-type - :multi-threading multi-threading)) - (:datagram - (udp-event-loop socket function arguments - :timeout timeout - :max-buffer-size max-buffer-size))))) - (if in-new-thread - (values (bt:make-thread #'real-call :name (or name "USOCKET Server")) socket) - (progn - (setq *server* socket) - (real-call)))))) - -(defvar *remote-host*) -(defvar *remote-port*) - -(defun default-udp-handler (buffer) ; echo - (declare (type (simple-array (unsigned-byte 8) *) buffer)) - buffer) - -(defun udp-event-loop (socket function &optional arguments - &key timeout max-buffer-size) - (let ((buffer (make-array max-buffer-size :element-type '(unsigned-byte 8) :initial-element 0)) - (sockets (list socket))) - (unwind-protect - (loop do - (multiple-value-bind (return-sockets real-time) - (wait-for-input sockets :timeout timeout) - (declare (ignore return-sockets)) - (when real-time - (multiple-value-bind (recv n *remote-host* *remote-port*) - (socket-receive socket buffer max-buffer-size) - (declare (ignore recv)) - (if (plusp n) - (progn - (let ((reply - (apply function (subseq buffer 0 n) arguments))) - (when reply - (replace buffer reply) - (let ((n (socket-send socket buffer (length reply) - :host *remote-host* - :port *remote-port*))) - (when (minusp n) - (error "send error: ~A~%" n)))))) - (error "receive error: ~A" n)))) - #+scl (when thread:*quitting-lisp* (return)) - #+(and cmu mp) (mp:process-yield))) - (socket-close socket) - (values)))) - -(defun default-tcp-handler (stream) ; null - (declare (type stream stream)) - (format stream "Hello world!~%")) - -(defun echo-tcp-handler (stream) - (loop - (when (listen stream) - (let ((line (read-line stream nil))) - (write-line line stream) - (force-output stream))))) - -(defun tcp-event-loop (socket function &optional arguments - &key element-type multi-threading) - (let ((real-function #'(lambda (client-socket &rest arguments) - (unwind-protect - (multiple-value-bind (*remote-host* *remote-port*) (get-peer-name client-socket) - (apply function (socket-stream client-socket) arguments)) - (close (socket-stream client-socket)) - (socket-close client-socket) - nil)))) - (unwind-protect - (loop do - (let* ((client-socket (apply #'socket-accept - `(,socket ,@(when element-type `(:element-type ,element-type))))) - (client-stream (socket-stream client-socket))) - (if multi-threading - (bt:make-thread (lambda () (apply real-function client-socket arguments)) - :name "USOCKET Client") - (prog1 (apply real-function client-socket arguments) - (close client-stream) - (socket-close client-socket))) - #+scl (when thread:*quitting-lisp* (return)) - #+(and cmu mp) (mp:process-yield))) - (socket-close socket) - (values)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/package.lisp deleted file mode 100644 index bef2a37..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/package.lisp +++ /dev/null @@ -1,11 +0,0 @@ -;;;; -*- Mode: LISP; Base: 10; Syntax: ANSI-Common-lisp; Package: CL-USER -*- -;;;; See the LICENSE file for licensing information. - -(in-package :cl-user) - -(defpackage :usocket-test - (:use :common-lisp - :usocket - :regression-test) - (:export #:do-tests - #:run-usocket-tests)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/test-condition.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/test-condition.lisp deleted file mode 100644 index c82ca70..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/test-condition.lisp +++ /dev/null @@ -1,28 +0,0 @@ -;;;; -*- Mode: LISP; Base: 10; Syntax: ANSI-Common-lisp; Package: USOCKET-TEST -*- -;;;; See LICENSE for licensing information. - -(in-package :usocket-test) - -(deftest ns-host-not-found-error.1 - (with-caught-conditions (usocket:ns-host-not-found-error nil) - (usocket:socket-connect "xxx" 123) - t) - nil) - -(deftest timeout-error.1 - (with-caught-conditions (usocket:timeout-error nil) - (usocket:socket-connect "common-lisp.net" 81 :timeout 0) - t) - nil) - -(deftest connection-refused-error.1 - (with-caught-conditions (usocket:connection-refused-error nil) - (usocket:socket-connect "common-lisp.net" 81) - t) - nil) - -(deftest operation-not-permitted-error.1 - (with-caught-conditions (usocket:operation-not-permitted-error nil) - (usocket:socket-listen "0.0.0.0" 81) - t) - nil) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/test-datagram.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/test-datagram.lisp deleted file mode 100644 index 4fb6330..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/test-datagram.lisp +++ /dev/null @@ -1,124 +0,0 @@ -;;;; -*- Mode: LISP; Base: 10; Syntax: ANSI-Common-lisp; Package: USOCKET-TEST -*- -;;;; See LICENSE for licensing information. - -(in-package :usocket-test) - -(defvar *echo-server*) -(defvar *echo-server-port*) - -(defun start-server () - (multiple-value-bind (thread socket) - (socket-server "127.0.0.1" 0 #'identity nil - :in-new-thread t - :protocol :datagram) - (setq *echo-server* thread - *echo-server-port* (get-local-port socket)))) - -(defparameter *max-buffer-size* 32) - -(defvar *send-buffer* - (make-array *max-buffer-size* :element-type '(unsigned-byte 8) :initial-element 0)) - -(defvar *receive-buffer* - (make-array *max-buffer-size* :element-type '(unsigned-byte 8) :initial-element 0)) - -(defun clean-buffers () - (fill *send-buffer* 0) - (fill *receive-buffer* 0)) - -;;; UDP Send Test #1: connected socket -(deftest udp-send.1 - (progn - (unless (and *echo-server* *echo-server-port*) - (start-server)) - (let ((s (socket-connect "127.0.0.1" *echo-server-port* :protocol :datagram))) - (clean-buffers) - (replace *send-buffer* #(1 2 3 4 5)) - (socket-send s *send-buffer* 5) - (wait-for-input s :timeout 3) - (multiple-value-bind (buffer size host port) - (socket-receive s *receive-buffer* *max-buffer-size*) - (declare (ignore buffer size host port)) - (reduce #'+ *receive-buffer* :start 0 :end 5)))) - 15) - -;;; UDP Send Test #2: unconnected socket -(deftest udp-send.2 - (progn - (unless (and *echo-server* *echo-server-port*) - (start-server)) - (let ((s (socket-connect nil nil :protocol :datagram))) - (clean-buffers) - (replace *send-buffer* #(1 2 3 4 5)) - (socket-send s *send-buffer* 5 :host "127.0.0.1" :port *echo-server-port*) - (wait-for-input s :timeout 3) - (multiple-value-bind (buffer size host port) - (socket-receive s *receive-buffer* *max-buffer-size*) - (declare (ignore buffer size host port)) - (reduce #'+ *receive-buffer* :start 0 :end 5)))) - 15) - -(deftest mark-h-david ; Mark H. David's remarkable UDP test code - (let* ((host "localhost") - (port 1111) - (server-sock - (socket-connect nil nil :protocol ':datagram :local-host host :local-port port)) - (client-sock - (socket-connect host port :protocol ':datagram)) - (octet-vector - (make-array 2 :element-type '(unsigned-byte 8) :initial-contents `(,(char-code #\O) ,(char-code #\K)))) - (recv-octet-vector - (make-array 2 :element-type '(unsigned-byte 8)))) - (socket-send client-sock octet-vector 2) - (socket-receive server-sock recv-octet-vector 2) - (prog1 (and (equalp octet-vector recv-octet-vector) - recv-octet-vector) - (socket-close server-sock) - (socket-close client-sock))) - #(79 75)) - -(deftest frank-james ; Frank James' test code for LispWorks/UDP - (with-caught-conditions (#+win32 CONNECTION-RESET-ERROR - #-win32 CONNECTION-REFUSED-ERROR - nil) - (let ((sock (socket-connect "localhost" 1234 - :protocol ':datagram :element-type '(unsigned-byte 8)))) - (unwind-protect - (progn - (socket-send sock (make-array 16 :element-type '(unsigned-byte 8) :initial-element 0) 16) - (let ((buffer (make-array 16 :element-type '(unsigned-byte 8) :initial-element 0))) - (socket-receive sock buffer 16))) - (socket-close sock)))) - nil) - -(defun frank-wfi-test () - (let ((s (socket-connect nil nil :protocol :datagram - :element-type '(unsigned-byte 8) - :local-port 8001))) - (unwind-protect - (do ((i 0 (1+ i)) - (buffer (make-array 1024 :element-type '(unsigned-byte 8) - :initial-element 0)) - (now (get-universal-time)) - (done nil)) - ((or done (= i 4)) - nil) - (format t "~Ds ~D Waiting state ~S~%" (- (get-universal-time) now) i (usocket::state s)) - (when (wait-for-input s :ready-only t :timeout 5) - (format t "~D state ~S~%" i (usocket::state s)) - (handler-bind - ((error (lambda (c) - (format t "socket-receive error: ~A~%" c) - (break) - nil))) - (multiple-value-bind (buffer count remote-host remote-port) - (socket-receive s buffer 1024) - (handler-bind - ((error (lambda (c) - (format t "socket-send error: ~A~%" c) - (break)))) - (when buffer - (socket-send s (subseq buffer 0 count) count - :host remote-host - :port remote-port))))))) - (socket-close s)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/test-usocket.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/test-usocket.lisp deleted file mode 100644 index ff03f7f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/test-usocket.lisp +++ /dev/null @@ -1,179 +0,0 @@ -;;;; -*- Mode: LISP; Base: 10; Syntax: ANSI-Common-lisp; Package: USOCKET-TEST -*- -;;;; See LICENSE for licensing information. - -;;;; Usage: (usoct:run-usocket-tests) or (usoct:do-tests) - -(in-package :usocket-test) - -(defparameter +non-existing-host+ "1.2.3.4") -(defparameter +unused-local-port+ 15213) - -(defparameter *fake-usocket* - (usocket::make-stream-socket :socket :my-socket - :stream :my-stream)) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defvar *common-lisp-net* - (get-host-by-name "common-lisp.net"))) - -(defvar *local-ip*) - -(defmacro with-caught-conditions ((expect throw) &body body) - `(catch 'caught-error - (handler-case - (handler-bind ((unsupported - #'(lambda (c) - (declare (ignore c)) (continue)))) - (progn ,@body)) - (unknown-error (c) (if (typep c ',expect) - (throw 'caught-error ,throw) - (progn - (describe c) - (describe - (usocket::usocket-real-error c)) - c))) - (error (c) (if (typep c ',expect) - (throw 'caught-error ,throw) - (progn - (describe c) - c))) - (unknown-condition (c) (if (typep c ',expect) - (throw 'caught-error ,throw) - (progn - (describe c) - (describe - (usocket::usocket-real-condition c)) - c))) - (condition (c) (if (typep c ',expect) - (throw 'caught-error ,throw) - (progn - (describe c) - c)))))) - -(deftest make-socket.1 (socket *fake-usocket*) :my-socket) -(deftest make-socket.2 (socket-stream *fake-usocket*) :my-stream) - -(deftest socket-no-connect.1 - (with-caught-conditions (socket-error nil) - (socket-connect "127.0.0.1" +unused-local-port+ :timeout 1) - t) - nil) - -(deftest socket-no-connect.2 - (with-caught-conditions (socket-error nil) - (socket-connect #(127 0 0 1) +unused-local-port+ :timeout 1) - t) - nil) - -(deftest socket-no-connect.3 - (with-caught-conditions (socket-error nil) - (socket-connect 2130706433 +unused-local-port+ :timeout 1) ;; == #(127 0 0 1) - t) - nil) - -(deftest socket-failure.1 - (with-caught-conditions (timeout-error nil) - (socket-connect 2130706433 +unused-local-port+ :timeout 1) ;; == #(127 0 0 1) - :unreach) - nil) - -(deftest socket-failure.2 - (with-caught-conditions (timeout-error nil) - (socket-connect +non-existing-host+ 80 :timeout 1) ;; 80 = just a port - :unreach) - nil) - -;; let's hope c-l.net doesn't move soon, or that people start to -;; test usocket like crazy.. -(deftest socket-connect.1 - (with-caught-conditions (nil nil) - (let ((sock (socket-connect "common-lisp.net" 80))) - (unwind-protect - (when (typep sock 'usocket) t) - (socket-close sock)))) - t) - -(deftest socket-connect.2 - (with-caught-conditions (nil nil) - (let ((sock (socket-connect *common-lisp-net* 80))) - (unwind-protect - (when (typep sock 'usocket) t) - (socket-close sock)))) - t) - -(deftest socket-connect.3 - (with-caught-conditions (nil nil) - (let ((sock (socket-connect (usocket::host-byte-order *common-lisp-net*) 80))) - (unwind-protect - (when (typep sock 'usocket) t) - (socket-close sock)))) - t) - -;; let's hope c-l.net doesn't change its software any time soon -(deftest socket-stream.1 - (with-caught-conditions (nil nil) - (let ((sock (socket-connect "common-lisp.net" 80))) - (unwind-protect - (progn - (format (socket-stream sock) - "GET / HTTP/1.0~2%") - (force-output (socket-stream sock)) - (subseq (read-line (socket-stream sock)) 0 4)) - (socket-close sock)))) - "HTTP") - -(deftest socket-name.1 - (with-caught-conditions (nil nil) - (let ((sock (socket-connect *common-lisp-net* 80))) - (unwind-protect - (get-peer-address sock) - (socket-close sock)))) - #.*common-lisp-net*) - -(deftest socket-name.2 - (with-caught-conditions (nil nil) - (let ((sock (socket-connect *common-lisp-net* 80))) - (unwind-protect - (get-peer-port sock) - (socket-close sock)))) - 80) - -(deftest socket-name.3 - (with-caught-conditions (nil nil) - (let ((sock (socket-connect *common-lisp-net* 80))) - (unwind-protect - (get-peer-name sock) - (socket-close sock)))) - #.*common-lisp-net* 80) - -#+ignore -(deftest socket-name.4 - (with-caught-conditions (nil nil) - (let ((sock (socket-connect *common-lisp-net* 80))) - (unwind-protect - (equal (get-local-address sock) *local-ip*) - (socket-close sock)))) - t) - -(deftest socket-shutdown.1 - (with-caught-conditions (nil nil) - (let ((sock (socket-connect *common-lisp-net* 80))) - (unwind-protect - (usocket::ignore-unsupported-warnings - (socket-shutdown sock :input)) - (socket-close sock)) - t)) - t) - -(deftest socket-shutdown.2 - (with-caught-conditions (nil nil) - (let ((sock (socket-connect *common-lisp-net* 80))) - (unwind-protect - (usocket::ignore-unsupported-warnings - (socket-shutdown sock :output)) - (socket-close sock)) - t)) - t) - -(defun run-usocket-tests () - (do-tests)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/udp-one-shot.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/udp-one-shot.lisp deleted file mode 100644 index db09687..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/udp-one-shot.lisp +++ /dev/null @@ -1,86 +0,0 @@ -;;;; -*- Mode: LISP; Base: 10; Syntax: ANSI-Common-lisp; Package: USOCKET-TEST -*- - -(in-package :usocket-test) - -;; Test code from "INVALID-ARGUMENT-ERROR on socket-receive (#48)" - -;; Author: @4lph4-Ph4un -;; Environment: SBCL 1.4.16, WSL on Windows 10 - -(defun UDP-one-shot-V1 (&optional (port 1232)) - (let ((socket (usocket:socket-connect - nil - nil - :protocol :datagram - :element-type '(unsigned-byte 8) - :local-host "127.0.0.1" - :local-port port)) - (buffer (make-array 8 :element-type '(unsigned-byte 8)))) - (unwind-protect - (multiple-value-bind (received size remote-host remote-port) - ;; NOTE: An explicit buffer can be given. If the length - ;; is nil buffer's length will be used. - (usocket:socket-receive socket buffer 8) - (format t "~A~%" received) - (usocket:socket-send socket - (reverse received) - size - :host remote-host - :port remote-port)) - (usocket:socket-close socket)))) - -#| -Backtrace: - 0: (USOCKET::HANDLE-CONDITION # #) - Locals: - CONDITION = # - SOCKET = # - 1: (SB-KERNEL::%SIGNAL #) - Locals: - CONDITION = # - HANDLER-CLUSTERS = (((# . #)) ((# . #)) ..) - 2: (ERROR SB-BSD-SOCKETS:INVALID-ARGUMENT-ERROR :ERRNO 22 :SYSCALL "recvfrom") - Locals: - CONDITION = # - #:G8039 = SB-BSD-SOCKETS:INVALID-ARGUMENT-ERROR - SB-DEBUG::MORE = (:ERRNO 22 :SYSCALL "recvfrom") - 3: (SB-BSD-SOCKETS:SOCKET-ERROR "recvfrom" 22) - Locals: - ERRNO = 22 - WHERE = "recvfrom" - 4: ((FLET SB-BSD-SOCKETS::WITH-SOCKET-ADDR-THUNK :IN SB-BSD-SOCKETS:SOCKET-RECEIVE) # - SB-BSD-SOCKETS::SIZE = 16 - SB-BSD-SOCKETS::SOCKADDR = # - 5: (SB-BSD-SOCKETS::CALL-WITH-SOCKET-ADDR # NIL # - SOCKADDR-ARGS = NIL - SOCKET = # - THUNK = # - 6: ((:METHOD SB-BSD-SOCKETS:SOCKET-RECEIVE (SB-BSD-SOCKETS:SOCKET T T)) # #(0 0 0 0 0 0 ...) 8 :OOB NIL :PEEK NIL :WAITALL NIL :DONTWAIT NIL.. - Locals: - #:.DEFAULTING-TEMP. = (UNSIGNED-BYTE 8) - SB-BSD-SOCKETS::BUFFER = #(0 0 0 0 0 0 ...) - SB-BSD-SOCKETS::BUFFER#1 = #(0 0 0 0 0 0 ...) - SB-BSD-SOCKETS::DONTWAIT = NIL - SB-BSD-SOCKETS::ELEMENT-TYPE = (UNSIGNED-BYTE 8) - LENGTH = 8 - LENGTH#1 = 8 - SB-BSD-SOCKETS::OOB = NIL - SB-BSD-SOCKETS::PEEK = NIL - SB-BSD-SOCKETS:SOCKET = # - SB-BSD-SOCKETS::WAITALL = NIL - 7: ((:METHOD USOCKET:SOCKET-RECEIVE (USOCKET:DATAGRAM-USOCKET T T)) # #(0 0 0 0 0 0 ...) 8 :ELEMENT-TYPE (UNSIGNED-BYTE 8)) [fast-method] - Locals: - USOCKET::BUFFER = #(0 0 0 0 0 0 ...) - USOCKET::ELEMENT-TYPE = (UNSIGNED-BYTE 8) - LENGTH = 8 - USOCKET:SOCKET = # - 8: (MASTER-CLASS/SRC/SERVER-03:UDP-ONE-SHOT-V1 1232) - Locals: - PORT = 1232 - SOCKET = # -|# - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/wait-for-input.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/wait-for-input.lisp deleted file mode 100644 index dadd4ca..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/test/wait-for-input.lisp +++ /dev/null @@ -1,140 +0,0 @@ -;;;; -*- Mode: LISP; Base: 10; Syntax: ANSI-Common-lisp; Package: USOCKET-TEST -*- -;;;; See LICENSE for licensing information. - -(in-package :usocket-test) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defparameter *wait-for-input-timeout* 2)) - -(deftest wait-for-input.1 - (with-caught-conditions (nil nil) - (let ((sock (usocket:socket-connect *common-lisp-net* 80)) - (time (get-universal-time))) - (unwind-protect - (progn (usocket:wait-for-input sock :timeout *wait-for-input-timeout*) - (- (get-universal-time) time)) - (usocket:socket-close sock)))) - #.*wait-for-input-timeout*) - -(deftest wait-for-input.2 - (with-caught-conditions (nil nil) - (let ((sock (usocket:socket-connect *common-lisp-net* 80)) - (time (get-universal-time))) - (unwind-protect - (progn (usocket:wait-for-input sock :timeout *wait-for-input-timeout* :ready-only t) - (- (get-universal-time) time)) - (usocket:socket-close sock)))) - #.*wait-for-input-timeout*) - -(deftest wait-for-input.3 - (with-caught-conditions (nil nil) - (let ((sock (usocket:socket-connect *common-lisp-net* 80))) - (unwind-protect - (progn - (format (usocket:socket-stream sock) - "GET / HTTP/1.0~2%") - (force-output (usocket:socket-stream sock)) - (usocket:wait-for-input sock :timeout *wait-for-input-timeout*) - (subseq (read-line (usocket:socket-stream sock)) 0 4)) - (usocket:socket-close sock)))) - "HTTP") - -;;; Advanced W-F-I tests by Elliott Slaughter - -(defvar *socket-server-port* 0) -(defvar *socket-server-listen* nil) -(defvar *socket-server-connection*) -(defvar *socket-client-connection*) -(defvar *output-p* t) - -(defun stage-1 () - (unless *socket-server-listen* - (setf *socket-server-listen* - (socket-listen *wildcard-host* 0 :element-type '(unsigned-byte 8))) - (setf *socket-server-port* (get-local-port *socket-server-listen*))) - - (setf *socket-server-connection* - (when (wait-for-input *socket-server-listen* :timeout 0 :ready-only t) - (socket-accept *socket-server-listen*))) - - (when *output-p* ; should be NIL - (format t "First time (before client connects) is ~s.~%" - *socket-server-connection*)) - - *socket-server-connection*) - -;; TODO: original test code have addition (:TIMEOUT 0) when doing the SOCKET-CONNECT, -;; it seems cannot work on SBCL/Windows, need to investigate, but here we ignore it. - -(defun stage-2 () - (setf *socket-client-connection* - (socket-connect "localhost" *socket-server-port* :protocol :stream - :element-type '(unsigned-byte 8))) - (setf *socket-server-connection* - (when (wait-for-input *socket-server-listen* :timeout 0 :ready-only t) - #+(and win32 (or lispworks ecl sbcl)) - (when *output-p* - (format t "%READY-P: ~D~%" (usocket::%ready-p *socket-server-listen*))) - (socket-accept *socket-server-listen*))) - - (when *output-p* ; should be a usocket object - (format t "Second time (after client connects) is ~s.~%" - *socket-server-connection*)) - - *socket-server-connection*) - -(defun stage-3 () - (setf *socket-server-connection* - (when (wait-for-input *socket-server-listen* :timeout 0 :ready-only t) - #+(and win32 (or lispworks ecl sbcl)) - (when *output-p* - (format t "%READY-P: ~D~%" (usocket::%ready-p *socket-server-listen*))) - (socket-accept *socket-server-listen*))) - - (when *output-p* ; should be NIL again - (format t "Third time (before second client) is ~s.~%" - *socket-server-connection*)) - - *socket-server-connection*) - -(deftest elliott-slaughter.1 - (let ((*output-p* nil)) - (let* ((s-1 (stage-1)) (s-2 (stage-2)) (s-3 (stage-3))) - (prog1 (and (null s-1) (usocket::usocket-p s-2) (null s-3)) - (socket-close *socket-server-listen*) - (setf *socket-server-listen* nil)))) - t) - -#| - -Issue elliott-slaughter.2 (WAIT-FOR-INPUT/win32 on TCP socket) - -W-F-I correctly found the inputs, but :READY-ONLY didn't work. - -|# -(defun receive-each (connections) - (let ((ready (usocket:wait-for-input connections :timeout 0 :ready-only t))) - (loop for connection in ready - collect (read-line (usocket:socket-stream connection))))) - -(defun receive-all (connections) - (loop for messages = (receive-each connections) - then (receive-each connections) - while messages append messages)) - -(defun send (connection message) - (format (usocket:socket-stream connection) "~a~%" message) - (force-output (usocket:socket-stream connection))) - -(defun server () - (let* ((listen (usocket:socket-listen usocket:*wildcard-host* 12345)) - (connection (usocket:socket-accept listen))) - (loop for messages = (receive-all connection) then (receive-all connection) - do (format t "Got messages:~%~s~%" messages) - do (sleep 1/50)))) - -(defun client () - (let ((connection (usocket:socket-connect "localhost" 12345))) - (loop for i from 0 - do (send connection (format nil "This is message ~a." i)) - do (sleep 1/100)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/usocket-server.asd b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/usocket-server.asd deleted file mode 100644 index 61d1c9d..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/usocket-server.asd +++ /dev/null @@ -1,14 +0,0 @@ -;;;; -*- Mode: Lisp -*- -;;;; -;;;; See the LICENSE file for licensing information. - -(in-package :asdf) - -(defsystem usocket-server - :name "usocket (server)" - :author "Chun Tian (binghe)" - :version (:read-file-form "version.sexp") - :licence "MIT" - :description "Universal socket library for Common Lisp (server side)" - :depends-on (:usocket :bordeaux-threads) - :components ((:file "server"))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/usocket-test.asd b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/usocket-test.asd deleted file mode 100644 index 58f5626..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/usocket-test.asd +++ /dev/null @@ -1,23 +0,0 @@ -;;;; -*- Mode: Lisp -*- - -;;;; See the LICENSE file for licensing information. - -(defsystem usocket-test - :name "usocket test" - :author "Erik Enge" - :maintainer "Chun Tian (binghe)" - :version (:read-file-form "version.sexp") - :licence "MIT" - :description "Tests for usocket" - :depends-on (:usocket-server - :rt) - :components ((:module "test" - :serial t - :components ((:file "package") - (:file "test-usocket") - (:file "test-condition") - (:file "test-datagram") - (:file "wait-for-input"))))) - -(defmethod perform ((op test-op) (c (eql (find-system :usocket-test)))) - (funcall (intern "DO-TESTS" "USOCKET-TEST"))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/usocket.asd b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/usocket.asd deleted file mode 100644 index a4c184b..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/usocket.asd +++ /dev/null @@ -1,58 +0,0 @@ -;;;; -*- Mode: LISP; Base: 10; Syntax: ANSI-Common-lisp; -*- -;;;; -;;;; See the LICENSE file for licensing information. - -(in-package :asdf) - -;;; NOTE: the key "art" here is, no need to recompile any file when switching -;;; between a native backend and IOlib backend. -- Chun Tian (binghe) - -#+sample -(pushnew :usocket-iolib *features*) - -(defsystem usocket - :name "usocket (client, with server symbols)" - :author "Erik Enge & Erik Huelsmann" - :maintainer "Chun Tian (binghe) & Hans Huebner" - :version (:read-file-form "version.sexp") - :licence "MIT" - :description "Universal socket library for Common Lisp" - :depends-on (:split-sequence - #+(and (or sbcl ecl) - (not usocket-iolib)) :sb-bsd-sockets - #+usocket-iolib :iolib) - :components ((:file "package") - (:module "vendor" :depends-on ("package") - :components (#+mcl (:file "kqueue") - #+mcl (:file "OpenTransportUDP"))) - (:file "usocket" :depends-on ("vendor")) - (:file "condition" :depends-on ("usocket")) - #-usocket-iolib - (:module "backend" :depends-on ("condition") - :components (#+abcl (:file "abcl") - #+(or allegro cormanlisp) - (:file "allegro") - #+clisp (:file "clisp") - #+(or openmcl clozure) - (:file "openmcl") - #+clozure (:file "clozure" :depends-on ("openmcl")) - #+cmu (:file "cmucl") - #+(or sbcl ecl clasp) - (:file "sbcl") - #+ecl (:file "ecl" :depends-on ("sbcl")) - #+clasp (:file "clasp" :depends-on ("sbcl")) - #+lispworks (:file "lispworks") - #+mcl (:file "mcl") - #+mocl (:file "mocl") - #+scl (:file "scl") - #+genera (:file "genera") - #+mezzano (:file "mezzano"))) - #-usocket-iolib - (:file "option" :depends-on ("backend")) - #+usocket-iolib - (:module "backend" :depends-on ("condition") - :components ((:file "iolib"))))) - -(defmethod perform ((op test-op) (c (eql (find-system :usocket)))) - (oos 'load-op ':usocket-test) - (oos 'test-op ':usocket-test)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/usocket.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/usocket.lisp deleted file mode 100644 index 20025e0..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/usocket.lisp +++ /dev/null @@ -1,727 +0,0 @@ -;;;; -*- Mode: LISP; Base: 10; Syntax: ANSI-Common-lisp; Package: USOCKET -*- -;;;; See LICENSE for licensing information. - -(in-package :usocket) - -(defparameter *wildcard-host* #(0 0 0 0) - "Hostname to pass when all interfaces in the current system are to - be bound. If this variable is passed to socket-listen, IPv6 capable - systems will also listen for IPv6 connections.") - -(defparameter *auto-port* 0 - "Port number to pass when an auto-assigned port number is wanted.") - -(defparameter *version* #.(asdf:component-version (asdf:find-system :usocket)) - "usocket version string") - -(defconstant +max-datagram-packet-size+ 65507 - "The theoretical maximum amount of data in a UDP datagram. - -The IPv4 UDP packets have a 16-bit length constraint, and IP+UDP header has 28-byte. - -IP_MAXPACKET = 65535, /* netinet/ip.h */ -sizeof(struct ip) = 20, /* netinet/ip.h */ -sizeof(struct udphdr) = 8, /* netinet/udp.h */ - -65535 - 20 - 8 = 65507 - -(But for UDP broadcast, the maximum message size is limited by the MTU size of the underlying link)") - -(defclass usocket () - ((socket - :initarg :socket - :accessor socket - :documentation "Implementation specific socket object instance.'") - (wait-list - :initform nil - :accessor wait-list - :documentation "WAIT-LIST the object is associated with.") - (state - :initform nil - :accessor state - :documentation "Per-socket return value for the `wait-for-input' function. - -The value stored in this slot can be any of - NIL - not ready - :READ - ready to read - :READ-WRITE - ready to read and write - :WRITE - ready to write - -The last two remain unused in the current version. -") - #+(and win32 (or sbcl ecl lispworks)) - (%ready-p - :initform nil - :accessor %ready-p - :documentation "Indicates whether the socket has been signalled -as ready for reading a new connection. - -The value will be set to T by `wait-for-input-internal' (given the -right conditions) and reset to NIL by `socket-accept'. - -Don't modify this slot or depend on it as it is really intended -to be internal only. - -Note: Accessed, but not used for 'stream-usocket'. -" - )) - (:documentation -"The main socket class. - -Sockets should be closed using the `socket-close' method.")) - -(defgeneric socket-state (socket) - (:documentation "NIL - not ready -:READ - ready to read -:READ-WRITE - ready to read and write -:WRITE - ready to write")) - -(defmethod socket-state ((socket usocket)) - (state socket)) - -(defclass stream-usocket (usocket) - ((stream - :initarg :stream - :accessor socket-stream - :documentation "Stream instance associated with the socket." -;; -;;Iff an external-format was passed to `socket-connect' or `socket-listen' -;;the stream is a flexi-stream. Otherwise the stream is implementation -;;specific." -)) - (:documentation -"Stream socket class. -' -Contrary to other sockets, these sockets may be closed either -with the `socket-close' method or by closing the associated stream -(which can be retrieved with the `socket-stream' accessor).")) - -(defclass stream-server-usocket (usocket) - ((element-type - :initarg :element-type - :initform #-lispworks 'character - #+lispworks 'base-char - :reader element-type - :documentation "Default element type for streams created by -`socket-accept'.")) - (:documentation "Socket which listens for stream connections to -be initiated from remote sockets.")) - -(defclass datagram-usocket (usocket) - ((connected-p :type boolean - :accessor connected-p - :initarg :connected-p) - #+(or cmu scl lispworks mcl - (and clisp ffi (not rawsock))) - (%open-p :type boolean - :accessor %open-p - :initform t - :documentation "Flag to indicate if usocket is open, -for GC on implementions operate on raw socket fd.") - #+(or lispworks mcl - (and clisp ffi (not rawsock))) - (recv-buffer :documentation "Private RECV buffer.") - #+(or lispworks mcl) - (send-buffer :documentation "Private SEND buffer.")) - (:documentation "UDP (inet-datagram) socket")) - -(defun usocket-p (socket) - (typep socket 'usocket)) - -(defun stream-usocket-p (socket) - (typep socket 'stream-usocket)) - -(defun stream-server-usocket-p (socket) - (typep socket 'stream-server-usocket)) - -(defun datagram-usocket-p (socket) - (typep socket 'datagram-usocket)) - -(defun make-socket (&key socket) - "Create a usocket socket type from implementation specific socket." - (unless socket - (error 'invalid-socket-error)) - (make-stream-socket :socket socket)) - -(defun make-stream-socket (&key socket stream) - "Create a usocket socket type from implementation specific socket -and stream objects. - -Sockets returned should be closed using the `socket-close' method or -by closing the stream associated with the socket. -" - (unless socket - (error 'invalid-socket-error)) - (unless stream - (error 'invalid-socket-stream-error)) - (make-instance 'stream-usocket - :socket socket - :stream stream)) - -(defun make-stream-server-socket (socket &key (element-type - #-lispworks 'character - #+lispworks 'base-char)) - "Create a usocket-server socket type from an -implementation-specific socket object. - -The returned value is a subtype of `stream-server-usocket'. -" - (unless socket - (error 'invalid-socket-error)) - (make-instance 'stream-server-usocket - :socket socket - :element-type element-type)) - -(defun make-datagram-socket (socket &key connected-p) - (unless socket - (error 'invalid-socket-error)) - (make-instance 'datagram-usocket - :socket socket - :connected-p connected-p)) - -(defgeneric socket-accept (socket &key element-type) - (:documentation - "Accepts a connection from `socket', returning a `stream-socket'. - -The stream associated with the socket returned has `element-type' when -explicitly specified, or the element-type passed to `socket-listen' otherwise.")) - -(defgeneric socket-close (usocket) - (:documentation "Close a previously opened `usocket'.")) - -(defmethod socket-close :before ((usocket usocket)) - (when (wait-list usocket) - (remove-waiter (wait-list usocket) usocket))) - -;; also see http://stackoverflow.com/questions/4160347/close-vs-shutdown-socket -(defgeneric socket-shutdown (usocket direction) - (:documentation "Shutdown communication on the socket in DIRECTION. - -After a shutdown no input and/or output of the indicated DIRECTION -can be performed on the `usocket'. - -DIRECTION should be either :INPUT or :OUTPUT or :IO")) - -(defgeneric socket-send (usocket buffer length &key host port) - (:documentation "Send packets through a previously opend `usocket'.")) - -(defgeneric socket-receive (usocket buffer length &key) - (:documentation "Receive packets from a previously opend `usocket'. - -Returns 4 values: (values buffer size host port)")) - -(defgeneric get-local-address (socket) - (:documentation "Returns the IP address of the socket.")) - -(defgeneric get-peer-address (socket) - (:documentation - "Returns the IP address of the peer the socket is connected to.")) - -(defgeneric get-local-port (socket) - (:documentation "Returns the IP port of the socket. - -This function applies to both `stream-usocket' and `server-stream-usocket' -type objects.")) - -(defgeneric get-peer-port (socket) - (:documentation "Returns the IP port of the peer the socket to.")) - -(defgeneric get-local-name (socket) - (:documentation "Returns the IP address and port of the socket as values. - -This function applies to both `stream-usocket' and `server-stream-usocket' -type objects.")) - -(defgeneric get-peer-name (socket) - (:documentation - "Returns the IP address and port of the peer -the socket is connected to as values.")) - -(defmacro with-connected-socket ((var socket) &body body) - "Bind `socket' to `var', ensuring socket destruction on exit. - -`body' is only evaluated when `var' is bound to a non-null value. - -The `body' is an implied progn form." - `(let ((,var ,socket)) - (unwind-protect - (when ,var - (with-mapped-conditions (,var) - ,@body)) - (when ,var - (socket-close ,var))))) - -(defmacro with-client-socket ((socket-var stream-var &rest socket-connect-args) - &body body) - "Bind the socket resulting from a call to `socket-connect' with -the arguments `socket-connect-args' to `socket-var' and if `stream-var' is -non-nil, bind the associated socket stream to it." - `(with-connected-socket (,socket-var (socket-connect ,@socket-connect-args)) - ,(if (null stream-var) - `(progn ,@body) - `(let ((,stream-var (socket-stream ,socket-var))) - ,@body)))) - -(defmacro with-server-socket ((var server-socket) &body body) - "Bind `server-socket' to `var', ensuring socket destruction on exit. - -`body' is only evaluated when `var' is bound to a non-null value. - -The `body' is an implied progn form." - `(with-connected-socket (,var ,server-socket) - ,@body)) - -(defmacro with-socket-listener ((socket-var &rest socket-listen-args) - &body body) - "Bind the socket resulting from a call to `socket-listen' with arguments -`socket-listen-args' to `socket-var'." - `(with-server-socket (,socket-var (socket-listen ,@socket-listen-args)) - ,@body)) - -(defstruct (wait-list (:constructor %make-wait-list)) - %wait ;; implementation specific - waiters ;; the list of all usockets - map) ;; maps implementation sockets to usockets - -;; Implementation specific: -;; -;; %setup-wait-list -;; %add-waiter -;; %remove-waiter - -(defun make-wait-list (waiters) - (let ((wl (%make-wait-list))) - (setf (wait-list-map wl) (make-hash-table)) - (%setup-wait-list wl) - (dolist (x waiters wl) ; wl is returned - (add-waiter wl x)))) - -(defun add-waiter (wait-list input) - (setf (gethash (socket input) (wait-list-map wait-list)) input - (wait-list input) wait-list) - (pushnew input (wait-list-waiters wait-list)) - (%add-waiter wait-list input)) - -(defun remove-waiter (wait-list input) - (%remove-waiter wait-list input) - (setf (wait-list-waiters wait-list) - (remove input (wait-list-waiters wait-list)) - (wait-list input) nil) - (remhash (socket input) (wait-list-map wait-list))) - -(defun remove-all-waiters (wait-list) - (dolist (waiter (wait-list-waiters wait-list)) - (%remove-waiter wait-list waiter)) - (setf (wait-list-waiters wait-list) nil) - (clrhash (wait-list-map wait-list))) - -(defun wait-for-input (socket-or-sockets &key timeout ready-only - &aux (single-socket-p - (usocket-p socket-or-sockets))) - "Waits for one or more streams to become ready for reading from -the socket. When `timeout' (a non-negative real number) is -specified, wait `timeout' seconds, or wait indefinitely when -it isn't specified. A `timeout' value of 0 (zero) means polling. - -Returns two values: the first value is the list of streams which -are readable (or in case of server streams acceptable). NIL may -be returned for this value either when waiting timed out or when -it was interrupted (EINTR). The second value is a real number -indicating the time remaining within the timeout period or NIL if -none. - -Without the READY-ONLY arg, WAIT-FOR-INPUT will return all sockets in -the original list you passed it. This prevents a new list from being -consed up. Some users of USOCKET were reluctant to use it if it -wouldn't behave that way, expecting it to cost significant performance -to do the associated garbage collection. - -Without the READY-ONLY arg, you need to check the socket STATE slot for -the values documented in usocket.lisp in the usocket class." - - ;; for NULL sockets, return NIL with respect of TIMEOUT. - (when (null socket-or-sockets) - (when timeout - (sleep timeout)) - (return-from wait-for-input nil)) - - ;; create a new wait-list if it's not created by the caller. - (unless (wait-list-p socket-or-sockets) - ;; OPTIMIZATION: in case socket-or-sockets is an atom, create the wait-list - ;; only once and store it into the usocket itself. - (let ((wl (if (and single-socket-p - (wait-list socket-or-sockets)) - (wait-list socket-or-sockets) ; reuse the per-usocket wait-list - (make-wait-list (if (listp socket-or-sockets) - socket-or-sockets (list socket-or-sockets)))))) - (multiple-value-bind (sockets to-result) - (wait-for-input wl :timeout timeout :ready-only ready-only) - ;; in case of single socket, keep the wait-list - (unless single-socket-p - (remove-all-waiters wl)) - (return-from wait-for-input - (values (if ready-only sockets socket-or-sockets) to-result))))) - - (let* ((start (get-internal-real-time)) - (sockets-ready 0)) - (dolist (x (wait-list-waiters socket-or-sockets)) - (when (setf (state x) - #+(and win32 (or sbcl ecl)) nil ; they cannot rely on LISTEN - #-(and win32 (or sbcl ecl)) - (if (and (stream-usocket-p x) - (listen (socket-stream x))) - :read - nil)) - (incf sockets-ready))) - ;; the internal routine is responsibe for - ;; making sure the wait doesn't block on socket-streams of - ;; which theready- socket isn't ready, but there's space left in the - ;; buffer. socket-or-sockets is not destructed. - (wait-for-input-internal socket-or-sockets - :timeout (if (zerop sockets-ready) timeout 0)) - (let ((to-result (when timeout - (let ((elapsed (/ (- (get-internal-real-time) start) - internal-time-units-per-second))) - (when (< elapsed timeout) - (- timeout elapsed)))))) - ;; two return values: - ;; 1) the original wait-list, or available sockets (ready-only) - ;; 2) remaining timeout - (values (cond (ready-only - (cond (single-socket-p - (if (null (state (car (wait-list-waiters socket-or-sockets)))) - nil ; nothing left if the only socket is not waiting - (wait-list-waiters socket-or-sockets))) - (t (remove-if #'null (wait-list-waiters socket-or-sockets) :key #'state)))) - (t socket-or-sockets)) - to-result)))) - -;; -;; Data utility functions -;; - -(defun integer-to-octet-buffer (integer buffer octets &key (start 0)) - (do ((b start (1+ b)) - (i (ash (1- octets) 3) ;; * 8 - (- i 8))) - ((> 0 i) buffer) - (setf (aref buffer b) - (ldb (byte 8 i) integer)))) - -(defun octet-buffer-to-integer (buffer octets &key (start 0)) - (let ((integer 0)) - (do ((b start (1+ b)) - (i (ash (1- octets) 3) ;; * 8 - (- i 8))) - ((> 0 i) - integer) - (setf (ldb (byte 8 i) integer) - (aref buffer b))))) - -(defmacro port-to-octet-buffer (port buffer &key (start 0)) - `(integer-to-octet-buffer ,port ,buffer 2 :start ,start)) - -(defmacro ip-to-octet-buffer (ip buffer &key (start 0)) - `(integer-to-octet-buffer (host-byte-order ,ip) ,buffer 4 :start ,start)) - -(defmacro port-from-octet-buffer (buffer &key (start 0)) - `(octet-buffer-to-integer ,buffer 2 :start ,start)) - -(defmacro ip-from-octet-buffer (buffer &key (start 0)) - `(octet-buffer-to-integer ,buffer 4 :start ,start)) - -;; -;; IPv4 utility functions -;; - -(defun list-of-strings-to-integers (list) - "Take a list of strings and return a new list of integers (from -parse-integer) on each of the string elements." - (let ((new-list nil)) - (dolist (element (reverse list)) - (push (parse-integer element) new-list)) - new-list)) - -(defun ip-address-string-p (string) - "Return a true value if the given string could be an IP address." - (every (lambda (char) - (or (digit-char-p char) - (eql char #\.))) - string)) - -(defun hbo-to-dotted-quad (integer) ; exported - "Host-byte-order integer to dotted-quad string conversion utility." - (let ((first (ldb (byte 8 24) integer)) - (second (ldb (byte 8 16) integer)) - (third (ldb (byte 8 8) integer)) - (fourth (ldb (byte 8 0) integer))) - (format nil "~A.~A.~A.~A" first second third fourth))) - -(defun hbo-to-vector-quad (integer) ; exported - "Host-byte-order integer to dotted-quad string conversion utility." - (let ((first (ldb (byte 8 24) integer)) - (second (ldb (byte 8 16) integer)) - (third (ldb (byte 8 8) integer)) - (fourth (ldb (byte 8 0) integer))) - (vector first second third fourth))) - -(defun vector-quad-to-dotted-quad (vector) ; exported - (format nil "~A.~A.~A.~A" - (aref vector 0) - (aref vector 1) - (aref vector 2) - (aref vector 3))) - -(defun dotted-quad-to-vector-quad (string) ; exported - (let ((list (list-of-strings-to-integers (split-sequence #\. string)))) - (vector (first list) (second list) (third list) (fourth list)))) - -(defgeneric host-byte-order (address)) ; exported - -(defmethod host-byte-order ((string string)) - "Convert a string, such as 192.168.1.1, to host-byte-order, -such as 3232235777." - (let ((list (list-of-strings-to-integers (split-sequence #\. string)))) - (+ (* (first list) 256 256 256) (* (second list) 256 256) - (* (third list) 256) (fourth list)))) - -(defmethod host-byte-order ((vector vector)) ; IPv4 only - "Convert a vector, such as #(192 168 1 1), to host-byte-order, such as -3232235777." - (+ (* (aref vector 0) 256 256 256) (* (aref vector 1) 256 256) - (* (aref vector 2) 256) (aref vector 3))) - -(defmethod host-byte-order ((int integer)) - int) ; this assume input integer is already host-byte-order - -;; -;; IPv6 utility functions -;; - -(defun vector-to-ipv6-host (vector) ; exported - (with-output-to-string (*standard-output*) - (loop with zeros-collapsed-p - with collapsing-zeros-p - for i below 16 by 2 - for word = (+ (ash (aref vector i) 8) - (aref vector (1+ i))) - do (cond - ((and (zerop word) - (not collapsing-zeros-p) - (not zeros-collapsed-p)) - (setf collapsing-zeros-p t)) - ((or (not (zerop word)) - zeros-collapsed-p) - (when collapsing-zeros-p - (write-string ":") - (setf collapsing-zeros-p nil - zeros-collapsed-p t)) - (format t "~:[~;:~]~X" (plusp i) word))) - finally (when collapsing-zeros-p - (write-string "::"))))) - -(defun split-ipv6-address (string) - (let ((pos 0) - word - double-colon-seen-p - words-before-double-colon - words-after-double-colon) - (loop - (multiple-value-setq (word pos) (parse-integer string :radix 16 :junk-allowed t :start pos)) - (labels ((at-end-p () - (= pos (length string))) - (looking-at-colon-p () - (char= (char string pos) #\:)) - (ensure-colon () - (unless (looking-at-colon-p) - (error "unsyntactic IPv6 address string ~S, expected a colon at position ~D" - string pos)) - (incf pos))) - (cond - ((null word) - (when double-colon-seen-p - (error "unsyntactic IPv6 address string ~S, can only have one double-colon filler mark" - string)) - (setf double-colon-seen-p t)) - (double-colon-seen-p - (push word words-after-double-colon)) - (t - (push word words-before-double-colon))) - (if (at-end-p) - (return (list (nreverse words-before-double-colon) (nreverse words-after-double-colon))) - (ensure-colon)))))) - -(defun ipv6-host-to-vector (string) ; exported - (assert (> (length string) 2) () - "Unsyntactic IPv6 address literal ~S, expected at least three characters" string) - (destructuring-bind (words-before-double-colon words-after-double-colon) - (split-ipv6-address (concatenate 'string - (when (eql (char string 0) #\:) - "0") - string - (when (eql (char string (1- (length string))) #\:) - "0"))) - (let ((number-of-words-specified (+ (length words-before-double-colon) (length words-after-double-colon)))) - (assert (<= number-of-words-specified 8) () - "Unsyntactic IPv6 address literal ~S, too many colon separated address components" string) - (assert (or (= number-of-words-specified 8) words-after-double-colon) () - "Unsyntactic IPv6 address literal ~S, too few address components and no double-colon filler found" string) - (loop with vector = (make-array 16 :element-type '(unsigned-byte 8)) - for i below 16 by 2 - for word in (append words-before-double-colon - (make-list (- 8 number-of-words-specified) :initial-element 0) - words-after-double-colon) - do (setf (aref vector i) (ldb (byte 8 8) word) - (aref vector (1+ i)) (ldb (byte 8 0) word)) - finally (return vector))))) - -;; exported since 0.8.0 -(defun host-to-hostname (host) ; host -> string - "Translate a string, vector quad or 16 byte IPv6 address to a -stringified hostname." - (etypecase host - (string host) ; IPv4 or IPv6 - ((or (vector t 4) ; IPv4 - (array (unsigned-byte 8) (4))) - (vector-quad-to-dotted-quad host)) - ((or (vector t 16) ; IPv6 - (array (unsigned-byte 8) (16))) - (vector-to-ipv6-host host)) - (integer (hbo-to-dotted-quad host)) ; integer input is IPv4 only - (null "0.0.0.0"))) ; null is IPv4 - -(defun ip= (ip1 ip2) ; exported - (etypecase ip1 - (string (string= ip1 ; IPv4 or IPv6 - (host-to-hostname ip2))) - ((or (vector t 4) ; IPv4 - (array (unsigned-byte 8) (4)) ; IPv4 - (vector t 16) ; IPv6 - (array (unsigned-byte 8) (16))) ; IPv6 - (equalp ip1 ip2)) - (integer (= ip1 ; IPv4 only - (host-byte-order ip2))))) ; convert ip2 to integer (hbo) - -(defun ip/= (ip1 ip2) ; exported - (not (ip= ip1 ip2))) - -;; -;; DNS helper functions -;; - -(defun get-host-by-name (name) - "0.7.1+: if there're IPv4 addresses, return the first IPv4 address." - (let* ((hosts (get-hosts-by-name name)) - (pos (position-if #'(lambda (ip) (= 4 (length ip))) hosts))) - (if pos (elt hosts pos) - (car hosts)))) - -(defun get-random-host-by-name (name) - "0.7.1+: if there're IPv4 addresses, only return a random IPv4 address." - (let* ((hosts (get-hosts-by-name name)) - (ipv4-hosts (remove-if-not #'(lambda (ip) (= 4 (length ip))) hosts))) - (cond (ipv4-hosts - (elt ipv4-hosts (random (length ipv4-hosts)))) - (hosts - (elt hosts (random (length hosts))))))) - -(defun host-to-vector-quad (host) ; internal - "Translate a host specification (vector quad, dotted quad or domain name) -to a vector quad." - (etypecase host - (string (let* ((ip (when (ip-address-string-p host) - (dotted-quad-to-vector-quad host)))) - (if (and ip (= 4 (length ip))) - ;; valid IP dotted quad? not sure - ip - (get-random-host-by-name host)))) - ((or (vector t 4) - (array (unsigned-byte 8) (4))) - host) - (integer (hbo-to-vector-quad host)))) - -(defun host-to-hbo (host) ; internal - (etypecase host - (string (let ((ip (when (ip-address-string-p host) - (dotted-quad-to-vector-quad host)))) - (if (and ip (= 4 (length ip))) - (host-byte-order ip) - (host-to-hbo (get-host-by-name host))))) - ((or (vector t 4) - (array (unsigned-byte 8) (4))) - (host-byte-order host)) - (integer host))) - -;; -;; Other utility functions -;; - -(defun split-timeout (timeout &optional (fractional 1000000)) - "Split real value timeout into seconds and microseconds. -Optionally, a different fractional part can be specified." - (multiple-value-bind - (secs sec-frac) - (truncate timeout 1) - (values secs - (truncate (* fractional sec-frac) 1)))) - -;; -;; Setting of documentation for backend defined functions -;; - -;; Documentation for the function -;; -;; (defun SOCKET-CONNECT (host port &key element-type nodelay some-other-keys...) ..) -;; -(setf (documentation 'socket-connect 'function) - "Connect to `host' on `port'. `host' is assumed to be a string or -an IP address represented in vector notation, such as #(192 168 1 1). -`port' is assumed to be an integer. - -`element-type' specifies the element type to use when constructing the -stream associated with the socket. The default is 'character. - -`nodelay' Allows to disable/enable Nagle's algorithm (http://en.wikipedia.org/wiki/Nagle%27s_algorithm). -If this parameter is omitted, the behaviour is inherited from the -CL implementation (in most cases, Nagle's algorithm is -enabled by default, but for example in ACL it is disabled). -If the parameter is specified, one of these three values is possible: - T - Disable Nagle's algorithm; signals an UNSUPPORTED - condition if the implementation does not support explicit - manipulation with that option. - NIL - Leave Nagle's algorithm enabled on the socket; - signals an UNSUPPORTED condition if the implementation does - not support explicit manipulation with that option. - :IF-SUPPORTED - Disables Nagle's algorithm if the implementation - allows this, otherwises just ignore this option. - -Returns a usocket object.") - -;; Documentation for the function -;; -;; (defun SOCKET-LISTEN (host port &key reuseaddress backlog element-type) ..) -;;###FIXME: extend with default-element-type -(setf (documentation 'socket-listen 'function) - "Bind to interface `host' on `port'. `host' should be the -representation of an ready-interface address. The implementation is -not required to do an address lookup, making no guarantees that -hostnames will be correctly resolved. If `*wildcard-host*' or NIL is -passed for `host', the socket will be bound to all available -interfaces for the system. `port' can be selected by the IP stack by -passing `*auto-port*'. - -Returns an object of type `stream-server-usocket'. - -`reuse-address' and `backlog' are advisory parameters for setting socket -options at creation time. `element-type' is the element type of the -streams to be created by `socket-accept'. `reuseaddress' is supported for -backward compatibility (but deprecated); when both `reuseaddress' and -`reuse-address' have been specified, the latter takes precedence. -") - -;;; Small utility functions mapping true/false to 1/0, moved here from option.lisp - -(proclaim '(inline bool->int int->bool)) - -(defun bool->int (bool) (if bool 1 0)) -(defun int->bool (int) (= 1 int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/vendor/OpenTransportUDP.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/vendor/OpenTransportUDP.lisp deleted file mode 100644 index 5dc3cdc..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/vendor/OpenTransportUDP.lisp +++ /dev/null @@ -1,146 +0,0 @@ -;;;-*-Mode: LISP; Package: CCL -*- -;; -;;; OpenTransportUDP.lisp -;;; Copyright 2012 Chun Tian (binghe) - -;;; UDP extension to OpenTransport.lisp (with some TCP patches) - -(in-package "CCL") - -(eval-when (:compile-toplevel :load-toplevel :execute) - (require :opentransport)) - -;; MCL Issue 28: Passive TCP streams should be able to listen to the loopback interface -;; see http://code.google.com/p/mcl/issues/detail?id=28 for details - -(defparameter *passive-interface-address* NIL - "Address to use for passive connections - optionally bind to loopback address while opening a tcp stream") - -(advise local-interface-ip-address - (or *passive-interface-address* (:do-it)) - :when :around :name 'override-local-interface-ip-address) - -;; MCL Issue 29: Passive TCP connections on OS assigned ports -;; see http://code.google.com/p/mcl/issues/detail?id=29 for details -(advise ot-conn-tcp-passive-connect - (destructuring-bind (conn port &optional (allow-reuse t)) arglist - (declare (ignore allow-reuse)) - (if (eql port #$kOTAnyInetAddress) - ;; Avoids registering a proxy for port 0 but instead registers one for the true port: - (multiple-value-bind (proxy result) - (let* ((*opentransport-class-proxies* NIL) ; makes ot-find-proxy return NIL - (result (:do-it)) ;; pushes onto *opentransport-class-proxies* - (proxy (prog1 - (pop *opentransport-class-proxies*) - (assert (not *opentransport-class-proxies*)))) - (context (cdr proxy)) - (tmpconn (make-ot-conn :context context - :endpoint (pref context :ot-context.ref))) - (localaddress (ot-conn-tcp-get-addresses tmpconn))) - (declare (dynamic-extent tmpconn)) - ;; replace original set in body of function - (setf (ot-conn-local-address conn) localaddress) - (values - (cons localaddress context) - result)) - ;; need to be outside local binding of *opentransport-class-proxies* - (without-interrupts - (push proxy *opentransport-class-proxies*)) - result) - (:do-it))) - :when :around :name 'ot-conn-tcp-passive-connect-any-address) - -(defun open-udp-socket (&key local-address local-port) - (init-opentransport) - (let (endpoint ; TODO: opentransport-alloc-endpoint-from-freelist - (err #$kOTNoError) - (configptr (ot-cloned-configuration traps::$kUDPName))) - (rlet ((errP :osstatus)) - (setq endpoint #+carbon-compat (#_OTOpenEndpointInContext configptr 0 (%null-ptr) errP *null-ptr*) - #-carbon-compat (#_OTOpenEndpoint configptr 0 (%null-ptr) errP) - err (pref errP :osstatus)) - (if (eql err #$kOTNoError) - (let* ((context (ot-make-endpoint-context endpoint nil nil)) ; no notifier, not minimal - (conn (make-ot-conn :context context :endpoint endpoint))) - (macrolet ((check-ot-error-return (error-context) - `(unless (eql (setq err (pref errP :osstatus)) #$kOTNoError) - (values (ot-error err ,error-context))))) - (setf (ot-conn-bindreq conn) - #-carbon-compat (#_OTAlloc endpoint #$T_BIND #$T_ADDR errP) - #+carbon-compat (#_OTAllocInContext endpoint #$T_BIND #$T_ADDR errP *null-ptr*) - ) - (check-ot-error-return :alloc) - (setf (ot-conn-bindret conn) - #-carbon-compat (#_OTAlloc endpoint #$T_BIND #$T_ADDR errP) - #+carbon-compat (#_OTAllocInContext endpoint #$T_BIND #$T_ADDR errP *null-ptr*) - ) - (check-ot-error-return :alloc) - (setf (ot-conn-options conn) - #-carbon-compat (#_OTAlloc endpoint #$T_OPTMGMT #$T_OPT errP) - #+carbon-compat (#_OTAllocInContext endpoint #$T_OPTMGMT #$T_OPT errP *null-ptr*) - ) - (check-ot-error-return :alloc)) - ;; BIND to local address (for UDP server) - (when local-port ; local-address - (let* ((host (or local-address (local-interface-ip-address))) - (port (tcp-service-port-number local-port)) - (localaddress `(:tcp ,host ,port)) - (bindreq (ot-conn-bindreq conn)) - (bindret (ot-conn-bindret conn))) - (let* ((netbuf (pref bindreq :tbind.addr))) - (declare (dynamic-extent netbuf)) - (setf (pref netbuf :tnetbuf.len) (record-length :inetaddress) - (pref bindreq :tbind.qlen) 5) ; arbitrary qlen - (#_OTInitInetAddress (pref netbuf :tnetbuf.buf) port host) - (setf (pref context :ot-context.completed) nil) - (unless (= (setq err (#_OTBind endpoint bindreq bindret)) #$kOTNoError) - (ot-error err :bind))) - (setf (ot-conn-local-address conn) localaddress))) - conn) - (ot-error err :create))))) - -(defun make-TUnitData (endpoint) - "create the send/recv buffer for UDP sockets" - (let ((err #$kOTNoError)) - (rlet ((errP :osstatus)) - (macrolet ((check-ot-error-return (error-context) - `(unless (eql (setq err (pref errP :osstatus)) #$kOTNoError) - (values (ot-error err ,error-context))))) - (let ((udata #-carbon-compat (#_OTAlloc endpoint #$T_UNITDATA #$T_ALL errP) - #+carbon-compat (#_OTAllocInContext endpoint #$T_UNITDATA #$T_ALL errP *null-ptr*))) - (check-ot-error-return :alloc) - udata))))) - -(defun send-message (conn data buffer size host port &optional (offset 0)) - ;; prepare dest address - (let ((addr (pref data :tunitdata.addr))) - (declare (dynamic-extent addr)) - (setf (pref addr :tnetbuf.len) (record-length :inetaddress)) - (#_OTInitInetAddress (pref addr :tnetbuf.buf) port host)) - ;; prepare data buffer - (let* ((udata (pref data :tunitdata.udata)) - (outptr (pref udata :tnetbuf.buf))) - (declare (dynamic-extent udata)) - (%copy-ivector-to-ptr buffer offset outptr 0 size) - (setf (pref udata :tnetbuf.len) size)) - ;; send the packet - (let* ((endpoint (ot-conn-endpoint conn)) - (result (#_OTSndUData endpoint data))) - (the fixnum result))) - -(defun receive-message (conn data buffer length) - (let* ((endpoint (ot-conn-endpoint conn)) - (err (#_OTRcvUData endpoint data *null-ptr*))) - (if (eql err #$kOTNoError) - (let* (;(addr (pref data :tunitdata.addr)) - (udata (pref data :tunitdata.udata)) - (inptr (pref udata :tnetbuf.buf)) - (read-bytes (pref udata :tnetbuf.len)) - (buffer (or buffer (make-array read-bytes :element-type '(unsigned-byte 8)))) - (length (or length (length buffer))) - (actual-size (min read-bytes length))) - (%copy-ptr-to-ivector inptr 0 buffer 0 actual-size) - (values buffer - actual-size - 0 0)) ; TODO: retrieve address and port - (ot-error err :receive)))) ; TODO: use OTRcvUDErr instead diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/vendor/kqueue.lisp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/vendor/kqueue.lisp deleted file mode 100644 index 72d370f..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/vendor/kqueue.lisp +++ /dev/null @@ -1,506 +0,0 @@ -;;;-*-Mode: LISP; Package: CCL -*- -;; -;; KQUEUE.LISP -;; -;; KQUEUE - BSD kernel event notification mechanism support for Common LISP. -;; Copyright (C) 2007 Terje Norderhaug -;; Released under LGPL - see . -;; Alternative licensing available upon request. -;; -;; DISCLAIMER: The user of this module should understand that executing code is a potentially hazardous -;; activity, and that many dangers and obstacles, marked or unmarked, may exist within this code. -;; As a condition of your use of the module, you assume all risk of personal injury, death, or property -;; loss, and all other bad things that may happen, even if caused by negligence, ignorance or stupidity. -;; The author is is no way responsible, and besides, does not have "deep pockets" nor any spare change. -;; -;; Version: 0.20 alpha (July 26, 2009) - subject to major revisions, so consider yourself warned. -;; Tested with Macintosh Common LISP 5.1 and 5.2, but is intended to be platform and system independent in the future. -;; -;; Email feedback and improvements to . -;; Updated versions will be available from . -;; -;; RELATED IMPLEMENTATIONS -;; There is another kevent.lisp for other platforms by Risto Laakso (merge?). -;; Also a Scheme kevent.ss by Jose Antonio Ortega. -;; -;; SEE ALSO: -;; http://people.freebsd.org/~jlemon/papers/kqueue.pdf -;; http://developer.apple.com/samplecode/FileNotification/index.html -;; The Man page for kqueue() or kevent(). -;; PyKQueue - Python OO interface to KQueue. -;; LibEvent - an event notification library in C by Niels Provos. -;; Liboop - another abstract library in C on top of kevent or other kernel notification. - -#| HISTORY: - -2007-Oct-18 terje version 0.1 released on the Info-MCL mailing list. -2008-Aug-21 terje load-framework-bundle is not needed under MCL 5.2 -2008-Aug-21 terje rename get-addr to lookup-function-in-bundle (only for pre MCL 5.2) -2009-Jul-19 terje uses kevent-error condition and strerror. -2009-Jul-24 terje reports errors unless nil-if-not-found in lookup-function-in-bundle. -2009-Jul-24 terje kevent :variant for C's intptr_t type for 64bit (and osx 10.5) compatibility. -2009-Jul-25 terje 64bit support, dynamically determined for PPC. Kudos to Glen Foy for helping out. -2009-Jul-25 terje make-kevent function. -|# - -#| IMPLEMENTATION NOTES: - -kevents are copied into and from the kernel, so the records don't have to be kept in the app! -kevents does not work in OSX before 10.3. -*kevent-record* has to be explcitly set to :kevent64 to work on 64bit intel macs. -Consider using sysctlbyname() to test for 64bit, - combining hw.cpu64bit_capable, hw.optional.x86_64 and hw.optional.64bitops -|# - -(in-package :ccl) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -#-ccl-5.2 ; has been added to MCL 5.2 -(defmethod load-framework-bundle ((framework-name string) &key (load-executable t)) - ;; FRAMWORK CALL FUNCTIONALITY FROM BSD.LISP - ;; (C) 2003 Brendan Burns - ;; Released under LGPL. - (with-cfstrs ((framework framework-name)) - (let ((err 0) - (baseURL nil) - (bundleURL nil) - (result nil)) - (rlet ((folder :fsref)) - ;; Find the folder holding the bundle - (setf err (#_FSFindFolder #$kOnAppropriateDisk #$kFrameworksFolderType - t folder)) - - ;; if everything's cool, make a URL for it - (when (zerop err) - (setf baseURL (#_CFURLCreateFromFSRef (%null-ptr) folder)) - (if (%null-ptr-p baseURL) - (setf err #$coreFoundationUnknownErr))) - - ;; if everything's cool, make a URL for the bundle - (when (zerop err) - (setf bundleURL (#_CFURLCreateCopyAppendingPathComponent (%null-ptr) - baseURL framework nil)) - (if (%null-ptr-p bundleURL) - (setf err #$coreFoundationUnknownErr))) - - ;; if everything's cool, load it - (when (zerop err) - (setf result (#_CFBundleCreate (%null-ptr) bundleURL)) - (if (%null-ptr-p result) - (setf err #$coreFoundationUnknownErr))) - - ;; if everything's cool, and the user wants it loaded, load it - (when (and load-executable (zerop err)) - (if (not (#_CFBundleLoadExecutable result)) - (setf err #$coreFoundationUnknownErr))) - - ;; if there's an error, but we've got a pointer, free it and clear result - (when (and (not (zerop err)) (not (%null-ptr-p result))) - (#_CFRelease result) - (setf result nil)) - - ;; free the URLs if there non-null - (when (not (%null-ptr-p bundleURL)) - (#_CFRelease bundleURL)) - (when (not (%null-ptr-p baseURL)) - (#_CFRelease baseURL)) - - ;; return pointer + error value - (values result err))))) - -#+ignore -(defun get-addr (bundle name) - (let* ((addr (#_CFBundleGetFunctionPointerForName bundle name))) - (rlet ((buf :long)) - (setf (%get-ptr buf) addr) - (ash (%get-signed-long buf) -2)))) - -#-ccl-5.2 -(defun lookup-function-in-bundle (name bundle &optional nil-if-not-found) - (with-cfstrs ((str name)) - (let* ((addr (#_CFBundleGetFunctionPointerForName bundle str))) - (if (%null-ptr-p addr) - (unless nil-if-not-found - (error "Couldn't resolve address of foreign function ~s" name)) - (rlet ((buf :long)) ;; mcl 5.2 uses %fixnum-from-macptr here - (setf (%get-ptr buf) addr) - (ash (%get-signed-long buf) -2)))))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Convenient way to declare BSD system calls - -#+ignore -(defparameter *system-bundle* - #+ccl-5.2 (get-bundle-for-framework-name "System.framework") - #-ccl-5.2 - (let ((bundle (load-framework-bundle "System.framework"))) - (terminate-when-unreachable bundle (lambda (b)(#_CFRelease b))) - bundle)) - -(defmacro declare-bundle-ff (name name-string &rest arglist &aux (fn (gensym (format nil "ff_~A_" (string name))))) - ;; Is there an existing define-trap like macro for this? or could one be modified for use with bundles? - `(progn - (defloadvar ,fn - (let* ((bundle #+ccl-5.2 (get-bundle-for-framework-name "System.framework") - #-ccl-5.2 - (let ((bundle (load-framework-bundle "System.framework"))) - (terminate-when-unreachable bundle (lambda (b)(#_CFRelease b))) - bundle))) - (lookup-function-in-bundle ,name-string bundle))) - ,(let ((args (do ((arglist arglist (cddr arglist)) - (result)) - ((not (cdr arglist)) (nreverse result)) - (push (second arglist) result)))) - `(defun ,name ,args - (ppc-ff-call ,fn ,@arglist))))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(declare-bundle-ff %system-kqueue "kqueue" - :signed-fullword) ;; returns a file descriptor no! - -(defun system-kqueue () - (let ((kq (%system-kqueue))) - (if (= kq -1) - (ecase (%system-errno) - (12 (error "The kernel failed to allocate enough memory for the kernel queue")) ; ENOMEM - (24 (error "The per-process descriptor table is full")) ; EMFILE - (23 (error "The system file table is full"))) ; ENFILE - kq))) - -(declare-bundle-ff %system-kevent "kevent" - :unsigned-fullword kq - :address ke - :unsigned-fullword nke - :address ko - :unsigned-fullword nko - :address timeout - :signed-fullword) - -(declare-bundle-ff %system-open "open" - :address name - :unsigned-fullword mode - :unsigned-fullword arg - :signed-fullword) - -(declare-bundle-ff %system-close "close" - :unsigned-fullword fd - :signed-fullword) - -(declare-bundle-ff %system-errno* "__error" - :signed-fullword) - -(declare-bundle-ff %system-strerror "strerror" - :signed-fullword errno - :address) - -(defun %system-errno () - (%get-fixnum (%int-to-ptr (%system-errno*)))) - -; (%system-errno) - -(defconstant $O-EVTONLY #x8000) -; (defconstant $O-NONBLOCK #x800 "Non blocking mode") - -(defun system-open (posix-namestring) - "Low level open function, as in C, returns an fd number" - (with-cstrs ((name posix-namestring)) - (%system-open name $O-EVTONLY 0))) - -(defun system-close (fd) - (%system-close fd)) - -(defrecord timespec - (sec :unsigned-long) - (usec :unsigned-long)) - -(defVar *kevent-record* nil) - -(def-ccl-pointers determine-64bit-kevents () - (setf *kevent-record* - (if (ccl::gestalt #$gestaltPowerPCProcessorFeatures - #+ccl-5.2 #$gestaltPowerPCHas64BitSupport #-ccl-5.2 6) - :kevent32 - :kevent64))) - -(defrecord :kevent32 - (ident :unsigned-long) ; uintptr_t - (filter :short) - (flags :unsigned-short) - (fflags :unsigned-long) - (data :long) ; intptr_t - (udata :pointer)) - -(defrecord :kevent64 - (:variant ; uintptr_t - ((ident64 :uint64)) - ((ident :unsigned-long))) - (filter :short) - (flags :unsigned-short) - (fflags :unsigned-long) - (:variant ; intptr_t - ((data64 :sint64)) - ((data :long))) - (:variant ; RMCL :pointer is 32bit - ((udata64 :uint64)) - ((udata :pointer)))) - -(defun make-kevent (&key (ident 0) (filter 0) (flags 0) (fflags 0) (data 0) (udata *null-ptr*)) - (ecase *kevent-record* - (:kevent64 - (make-record kevent64 - :ident ident - :filter filter - :flags flags - :fflags fflags - :data data - :udata udata)) - (:kevent32 - (make-record kevent32 - :ident ident - :filter filter - :flags flags - :fflags fflags - :data data - :udata udata)))) - -(defun kevent-rref (ke field) - (ecase *kevent-record* - (:kevent32 - (ecase field - (:ident (rref ke :kevent32.ident)) - (:filter (rref ke :kevent32.filter)) - (:flags (rref ke :kevent32.flags)) - (:fflags (rref ke :kevent32.fflags)) - (:data (rref ke :kevent32.data)) - (:udata (rref ke :kevent32.udata)))) - (:kevent64 - (ecase field - (:ident (rref ke :kevent64.ident)) - (:filter (rref ke :kevent64.filter)) - (:flags (rref ke :kevent64.flags)) - (:fflags (rref ke :kevent64.fflags)) - (:data (rref ke :kevent64.data)) - (:udata (rref ke :kevent64.udata)))))) - -(defun kevent-filter (ke) - (kevent-rref ke :filter)) - -(defun kevent-flags (ke) - (kevent-rref ke :flags)) - -(defun kevent-data (ke) - (kevent-rref ke :data)) - - -;; FILTER TYPES: - -(eval-when (:compile-toplevel :load-toplevel :execute) ; added by binghe - -(defconstant $kevent-read-filter -1 "Data available to read") -(defconstant $kevent-write-filter -2 "Writing is possible") -(defconstant $kevent-aio-filter -3 "AIO system call has been made") -(defconstant $kevent-vnode-filter -4 "Event occured on a file descriptor") -(defconstant $kevent-proc-filter -5 "Process performed one or more of the requested events") -(defconstant $kevent-signal-filter -6 "Attempted to deliver a signal to a process") -(defconstant $kevent-timer-filter -7 "Establishes an arbitrary timer") -(defconstant $kevent-netdev-filter -8 "Event occured on a network device") -(defconstant $kevent-filesystem-filter -9) - -) ; eval-when - -; FLAGS: - -(defconstant $kevent-add #x01) -(defconstant $kevent-delete #x02) -(defconstant $kevent-enable #x04) -(defconstant $kevent-disable #x08) -(defconstant $kevent-oneshot #x10) -(defconstant $kevent-clear #x20) -(defconstant $kevent-error #x4000) -(defconstant $kevent-eof #x8000 "EV_EOF") - -;; FFLAGS: - -(defconstant $kevent-file-delete #x01 "The file was unlinked from the file system") -(defconstant $kevent-file-write #x02 "A write occurred on the file") -(defconstant $kevent-file-extend #x04 "The file was extended") -(defconstant $kevent-file-attrib #x08 "The file had its attributes changed") -(defconstant $kevent-file-link #x10 "The link count on the file changed") -(defconstant $kevent-file-rename #x20 "The file was renamed") -(defconstant $kevent-file-revoke #x40 "Access to the file was revoked or the file system was unmounted") -(defconstant $kevent-file-all (logior $kevent-file-delete $kevent-file-write $kevent-file-extend - $kevent-file-attrib $kevent-file-link $kevent-file-rename $kevent-file-revoke)) - - -(defconstant $kevent-net-linkup #x01 "Link is up") -(defconstant $kevent-net-linkdown #x02 "Link is down") -(defconstant $kevent-net-linkinvalid #x04 "Link state is invalid") -(defconstant $kevent-net-added #x08 "IP adress added") -(defconstant $kevent-net-deleted #x10 "IP adress deleted") - -(define-condition kevent-error (simple-error) - ((errno :initform NIL :initarg :errno) - (ko :initform nil :type (or null kevent) :initarg :ko) - (syserr :initform (%system-errno))) - (:report - (lambda (c s) - (with-slots (errno ko syserr) c - (format s "kevent system call error ~A [~A]" errno syserr) - (when errno - (format s "(~A)" (%get-cstring (%system-strerror errno)))) - (when ko - (format s " for ") - (let ((*standard-output* s)) - (print-record ko *kevent-record*))))))) - -(defun %kevent (kq &optional ke ko (timeout 0)) - (check-type kq integer) - (rlet ((&timeout :timespec :sec timeout :usec 1)) - (let ((num (with-timer ;; does not seem to make a difference... - (%system-kevent kq (or ke (%null-ptr))(if ke 1 0)(or ko (%null-ptr))(if ko 1 0) &timeout)))) - ; "If an error occurs while processing an element of the changelist and there - ; is enough room in the eventlist, then the event will be placed in the eventlist with - ; EV_ERROR set in flags and the system error in data." - (when (and ko (plusp (logand $kevent-error (kevent-flags ko)))) - (error 'kevent-error - :errno (kevent-data ko) - :ko ko)) - ; "Otherwise, -1 will be returned, and errno will be set to indicate the error condition." - (when (= num -1) - ;; hack - opentransport provides the constants for the errors documented for the call - (case (%system-errno) - (0 (error "kevent system call failed with an unspecified error")) ;; should not happen! - (13 (error "The process does not have permission to register a filter")) - (14 (error "There was an error reading or writing the kevent structure")) ; EFAULT - (9 (error "The specified descriptor is invalid")) ; EBADF - (4 (error "A signal was delivered before the timeout expired and before any events were placed on the kqueue for return.")) ; EINTR - (22 (error "The specified time limit or filter is invalid")) ; EINVAL - (2 (error "The event could not be found to be modified or deleted")) ; ENOENT - (12 (error "No memory was available to register the event")) ; ENOMEM - (78 (error "The specified process to attach to does not exist"))) ; ESRCH - ;; shouldn't get here... - (errchk (%system-errno)) - (error "error ~A" (%system-errno))) - (unless (zerop num) - (values ko num))))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; CLOS INTERFACE - -(defclass kqueue () - ((kq :initform (system-kqueue) - :documentation "file descriptor referencing the kqueue") - (fds :initform NIL)) ;; ## better if kept on top level, perhaps as a hash table... - (:documentation "A kernal event notification channel")) - -(defmethod initialize-instance :after ((q kqueue) &rest rest) - (declare (ignore rest)) - (terminate-when-unreachable q 'kqueue-close)) - -(defmethod kqueue-close ((q kqueue)) - (with-slots (kq fds) q - (when (or kq fds) ;; allow repeated close - (system-close kq) - (setf fds NIL) - (setf kq NIL)))) - -(defmethod kqueue-poll ((q kqueue)) - "Polls a kqueue for kevents" - ;; may not have to be cleared, but just in case: - (flet ((kqueue-poll2 (ko) - (let ((result (with-slots (kq) q - (without-interrupts - (%kevent kq NIL ko))))) - (when result - (let ((type (kevent-filter result))) - (ecase type - (0 (values)) - (#.$kevent-read-filter - (values - :read - (kevent-rref result :ident) - (kevent-rref result :flags) - (kevent-rref result :fflags) - (kevent-rref result :data) - (kevent-rref result :udata))) - (#.$kevent-write-filter :write) - (#.$kevent-aio-filter :aio) - (#.$kevent-vnode-filter - (values - :vnode - (cdr (assoc (kevent-rref result :ident) (slot-value q 'fds))) - (kevent-rref result :flags) - (kevent-rref result :fflags) - (kevent-rref result :data) - (kevent-rref result :udata))) - (#.$kevent-filesystem-filter :filesystem))))))) - (ecase *kevent-record* - (:kevent64 - (rlet ((ko :kevent64 :ident 0 :filter 0 :flags 0 :fflags 0 :data 0 :udata (%null-ptr))) - (kqueue-poll2 ko))) - (:kevent32 - (rlet ((ko :kevent32 :ident 0 :filter 0 :flags 0 :fflags 0 :data 0 :udata (%null-ptr))) - (kqueue-poll2 ko)))))) - -(defmethod kqueue-subscribe ((q kqueue) &key ident filter (flags 0) (fflags 0) (data 0) (udata (%null-ptr))) - (let ((ke (make-kevent :ident ident - :filter filter - :flags flags - :fflags fflags - :data data - :udata udata))) - (with-slots (kq) q - (without-interrupts - (%kevent kq ke))))) - -(defmethod kqueue-vnode-subscribe ((q kqueue) pathname) - "Makes the queue report an event when there is a change to a directory or file" - (let* ((namestring (posix-namestring (full-pathname pathname))) - (fd (system-open namestring))) - (with-slots (fds) q - (push (cons fd pathname) fds)) - (kqueue-subscribe q - :ident fd - :filter $kevent-vnode-filter - :flags (logior $kevent-add $kevent-clear) - :fflags $kevent-file-all) - namestring)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -#+test -(defun kevent-d (pathname &optional (*standard-output* (fred))) - "Report changes to a file or directory" - (loop - with kqueue = (make-instance 'kqueue) - with sub = (kqueue-vnode-subscribe kqueue pathname) - for i from 1 to 60 - for result = (multiple-value-list (kqueue-poll kqueue)) - unless (equal result '(NIL)) - do (progn - (format T "~A~%" result) - (force-output)) - ; do (process-allow-schedule) - do (sleep 1) - finally (write-line "Done") - )) - -#| - -; Report changes to this file in a fred window (save this document to see what happens): - -(process-run-function "kevent-d" #'kevent-d *loading-file-source-file* - (fred)) - -; Reports files added or removed from the directory of this file: - -(process-run-function "kevent-d" #'kevent-d - (make-pathname :directory (pathname-directory *loading-file-source-file*)) - (fred)) -|# - - - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/version.sexp b/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/version.sexp deleted file mode 100644 index b33445a..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/usocket-0.8.3/version.sexp +++ /dev/null @@ -1 +0,0 @@ -"0.8.3" diff --git a/sbcl/.quicklisp/dists/quicklisp/software/vom-20160825-git/LICENSE b/sbcl/.quicklisp/dists/quicklisp/software/vom-20160825-git/LICENSE deleted file mode 100644 index 3d15c9c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/vom-20160825-git/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2014 Lyon Bros. Enterprises, LLC - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/vom-20160825-git/README.md b/sbcl/.quicklisp/dists/quicklisp/software/vom-20160825-git/README.md deleted file mode 100644 index 71cc47c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/vom-20160825-git/README.md +++ /dev/null @@ -1,82 +0,0 @@ -Vom - A tiny logging library for Common Lisp -============================================ - -Vom is a logging library for lisp. It's goal is to be useful and small. It does -not provide a lot of features as other loggers do, but has a small codebase -that's easy to understand and use. - -## Documentation - -Logging is done by calling one of the logging macros: - -- emerg -- alert -- crit -- error -- warn -- notice -- info -- debug -- debug1 -- debug2 -- debug3 -- debug4 - -Each of these is a macro defined as such: - -```lisp -(defmacro notice (format-str &rest args) ...) -``` - -They are used almost exactly like `format` (but without specifying the stream): - -```lisp -(vom:error "there was a problem setting up your database: ~a" error) -``` - -### Configuration - -You can set a global logging level: - -```lisp -;; set the default loglevel such that only errors (or higher) get logged -(vom:config t :error) -``` - -or you can set per-package loglevels: - -```lisp -(vom:config :my-package :notice) -``` - -In the above examples, any unconfigured package will have the loglevel of -`:error`, but the package `my-package` will log anything that's a `:notice` or -above. - -### \*log-stream\* - -The stream that vom logs to by default. This defaults to `t` (aka -`*standard-output*`) - -### \*log-hook\* - -This is a function of 3 arguments that takes a log level, a package keyword -name, and that package's configured log level and returns one or more streams as -multiple values that the log entry will be logged to: - -```lisp -;; example: this hook logs the request to multiple streams if we're getting a -;; log entry from the "particle-accelerator" package -(setf vom:*log-hook* - (lambda (level package package-level) - (declare (ignore level package-level)) - (if (eq package :particle-accelerator) - (values t *my-file-log-stream* *another-stream*) - t))) -``` - -## License - -MIT. Do what you want with it. Just give me credit. Or I'll come to your house -for two weeks and eat your food and sleep on your couch and use your toothbrush. - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/vom-20160825-git/vom.asd b/sbcl/.quicklisp/dists/quicklisp/software/vom-20160825-git/vom.asd deleted file mode 100644 index 614b37e..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/vom-20160825-git/vom.asd +++ /dev/null @@ -1,6 +0,0 @@ -(asdf:defsystem vom - :author "Andrew Danger Lyon " - :license "MIT" - :version "0.1.4" - :description "A tiny logging utility." - :components ((:file "vom"))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/vom-20160825-git/vom.lisp b/sbcl/.quicklisp/dists/quicklisp/software/vom-20160825-git/vom.lisp deleted file mode 100644 index aafd501..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/vom-20160825-git/vom.lisp +++ /dev/null @@ -1,204 +0,0 @@ -(defpackage :vom - ;; DON'T use :cl, otherwise most of the implementations bitch about using - ;; error and warn functions - (:use) - ;; import everything from cl that we actually need. while obnoxious, it makes - ;; sure vom runs smoothly on most (all?) implementations. - (:import-from #:cl - #:t #:nil - #:defpackage #:in-package #:*package* #:package-name #:find-package - #:eval-when - #:eval - #:lambda #:defun #:multiple-value-list #:defmacro - #:return-from - #:defvar #:defparameter - #:declare #:optimize #:type #:ignore - #:keyword #:integer - #:assert - #:member - #:macro-function - #:documentation - #:let #:let* #:progn #:multiple-value-bind - #:&rest #:&key - #:if #:when #:unless #:cond - #:loop #:dolist - #:car #:cdr #:cddr - #:write-sequence #:format - #:get-universal-time - #:get-decoded-time - #:string #:string-downcase #:make-string #:concatenate - #:symbolp - #:intern - #:setf #:getf - #:max #:min - #:eq - #:+ #:- #:> #:< #:<= #:>= - #:apply #:funcall - #:append #:list #:length - #:make-synonym-stream) - (:shadow #:error - #:warn - #:debug) - (:export #:config - #:*log-stream* - #:*log-hook* - #:*config* - #:*time-formatter* - #:*log-formatter* - - #:emerg - #:alert - #:crit - #:error - #:warn - #:notice - #:info - #:debug - #:debug1 - #:debug2 - #:debug3 - #:debug4)) -(in-package :vom) - -;; define our *levels* and *max-level-name-length* before the define-level macro -;; is defined (so it can access them) -(eval-when (:load-toplevel :compile-toplevel) - (defparameter *levels* '(:off 0) - "Holds the log level mappings (keyword -> value).") - - (defparameter *max-level-name-length* 0 - "Holds the number of characters in the longest log-level name.")) - -(defvar *config* '(t :warn) - "Holds the logging config as a plist. Holds package -> level mappings, using - T as the default (used if logging from a package that hasn't been - configured).") - -(defvar *log-stream* (make-synonym-stream 'cl:*standard-output*) - "Holds the default stream we're logging to.") - -(defvar *log-hook* - (lambda (log-level package-keyword package-log-level) - (declare (ignore log-level package-keyword package-log-level)) - *log-stream*) - "Holds a function that, given a log-level, a package name, and the effective - log-level for that package, returns one or more (via (values ...)) streams - that this log will be sent to.") - -(defvar *package-level-cache* nil - "A cache that holds package alias -> package loglevel values for quick lookup.") - -(defparameter *time-formatter* - (lambda () - (multiple-value-bind (second minute hour) - (get-decoded-time) - (format nil "~2,'0D:~2,'0D:~2,'0D" hour minute second))) - "A function of 0 args that returns the current time in the desired format.") - -(defparameter *log-formatter* - (lambda (format-str level-str package-keyword args) - (let* ((format-str (concatenate 'string "~a<~a> [~a] ~a - " format-str "~%"))) - (apply 'format - (append (list - nil - format-str) - (list - (make-string (- *max-level-name-length* (length level-str)) - :initial-element #\space) - level-str - (funcall *time-formatter*) - (string-downcase (string package-keyword))) - args)))) - "A function that takes a format string (user-supplied), a level string (eg - 'notice' or 'error'), a keyword of the current package, and a list of args - the user supplied with the format string and returns a string of the log line - we want logged.") - -(defun config (package-keyword level-name) - "Configure the log level for a package (or use t for the package name to set - the default log level). The log level is given as a keyword." - (assert (member level-name *levels*)) - (clear-level-cache) - (cond ((eq package-keyword t) - (setf (getf *config* t) level-name)) - ((symbolp package-keyword) - (let* ((name (find-package package-keyword)) - (package-name (string (if name - (package-name name) - package-keyword)))) - (setf (getf *config* (intern package-name :keyword)) level-name))))) - -(defun find-package-level (package-keyword) - "Given package keyword (doesn't have to be an exact match, can be an alias), - find the configured loglevel of that package. - - This caches the package->level connection in *package-level-cache*." - (declare (optimize (cl:speed 3) (cl:safety 0) (cl:debug 0)) - (type keyword package-keyword)) - (let ((cached (getf *package-level-cache* package-keyword))) - (when cached (return-from find-package-level cached)) - (let* ((package (find-package package-keyword)) - (package-name (when package - (intern (package-name package) :keyword))) - (package-level (getf *config* package-name)) - (package-level (if package-level - package-level - (getf *config* t))) - (package-level-value (getf *levels* package-level 0))) - (setf (getf *package-level-cache* package-keyword) package-level-value) - package-level-value))) - -(defun clear-level-cache () - "Clears the package loglevel cache." - (setf *package-level-cache* nil)) - -(defun do-log (level-name log-level package-keyword format-str &rest args) - "The given data to the current *log-stream* stream." - (declare (optimize (cl:speed 3) (cl:safety 0) (cl:debug 0)) - (type keyword level-name package-keyword) - (type integer log-level) - (type string format-str) - (type list args)) - (let* ((package-level-value (find-package-level package-keyword))) - (when (<= log-level package-level-value) - (let* ((level-str (string level-name)) - (logline (funcall *log-formatter* format-str level-str package-keyword args)) - (log-streams (multiple-value-list - (funcall *log-hook* - log-level - package-keyword - package-level-value)))) - (dolist (stream log-streams) - (write-sequence logline (if (eq stream t) - cl:*standard-output* - stream)) - (cl:finish-output stream)))))) - -(defmacro define-level (name level-value) - "Define a log level." - (let ((macro-name (intern (format nil "LOG-~a" (string name)))) - (log-sym (intern (string name)))) - `(progn - (setf (getf *levels* ,name) ,level-value) - (defmacro ,macro-name (format-str &rest args) - ,(format nil "Log output to the ~s log level (~a)" name level-value) - (let ((pkg (intern (package-name *package*) :keyword))) - `(do-log ,,name ,,level-value ,pkg ,format-str ,@args))) - (setf (documentation ',log-sym 'cl:function) (documentation ',macro-name 'cl:function)) - (setf (macro-function ',log-sym) (macro-function ',macro-name)) - (setf *max-level-name-length* (max *max-level-name-length* - (length (string ,name))))))) - -(define-level :emerg 1) -(define-level :alert 2) -(define-level :crit 3) -(define-level :error 4) -(define-level :warn 5) -(define-level :notice 6) -(define-level :info 7) -(define-level :debug 8) -(define-level :debug1 9) -(define-level :debug2 10) -(define-level :debug3 11) -(define-level :debug4 12) - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/.gitignore b/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/.gitignore deleted file mode 100644 index df0e0a3..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.*f*sl diff --git a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/.pre-release.sh b/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/.pre-release.sh deleted file mode 100644 index 32d1ce7..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/.pre-release.sh +++ /dev/null @@ -1 +0,0 @@ -sh render-doc.sh diff --git a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/CHANGELOG b/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/CHANGELOG deleted file mode 100644 index 157d6cf..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/CHANGELOG +++ /dev/null @@ -1,28 +0,0 @@ -Version 0.7.6 -2016-01-26 -Revert Rick's changes for alist/plist behavior (Hans Huebner) - -Version 0.7.5 -2015-06-14 -Fixed release script (Hans Huebner) - -Version 0.7.4 -2015-06-14 -Remove post-release.sh that updated c-l.net (Hans Huebner) - -Version 0.7.3 -2015-06-14 -Fix #28 Add ENCODE-OBJECT-SLOTS (Thayne McCombs) -Update html documentation (Hans Huebner) -update documentation link (Hans Huebner) -Documentation work (Hans Huebner) - -Version 0.7.2 -2014-12-05 -Avoid using e notation because Lisp, JS and JSON numeral syntaxes are incompatible. (Grim Schjetne) -readd encode-object/encode-slots API with proper documentation (Philipp Matthias Schaefer) - -Version 0.7.1 -2014-11-04 -Remove unused ENCODE-SLOTS and ENCODE-OBJECT stubs - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/LICENSE b/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/LICENSE deleted file mode 100644 index 244beda..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -Copyright (c) 2008-2019 Hans Huebner and contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name BKNR nor the names of its contributors may be - used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/README.md b/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/README.md deleted file mode 100644 index 7d0a880..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/README.md +++ /dev/null @@ -1,13 +0,0 @@ -YASON -===== - -> YASON is a Common Lisp library for encoding and decoding data in the -> [JSON](https://raw.github.com/phmarek/clixdoc/master/clixdoc.xsl) -> interchange format. JSON is used as a lightweight alternative to -> XML. YASON has the sole purpose of encoding and decoding data and -> does not impose any object model on the Common Lisp application that -> uses it. - -Please proceed to the [Documentation](http://phmarek.github.io/yason) - -This project was maintained by https://github.com/hanshuebner/ until 2019. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/clixdoc.xsl b/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/clixdoc.xsl deleted file mode 100644 index 308a20c..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/clixdoc.xsl +++ /dev/null @@ -1,411 +0,0 @@ - - - - - - - - - - - - - - - <xsl:value-of select="clix:title"/> - - - - - - - - - - -

-
- - - -

- - [Generic function] - [Method] - [Macro] - [Function] - -
- - - - - - - - - => - - - -

- -
-

-
- - -

- - [Generic reader] - [Specialized reader] - [Reader] - -
- - - - - - - - - => - - - -

- -
-

-
- - -

- - [Generic writer] - [Specialized writer] - [Writer] - -
- - - - - (setf ( - - ) new-value) - - => - - - -

- -
-

-
- - -

- - [Generic accessor] - [Specialized accessor] - [Accessor] - -
- - - - - - - - => - -
- (setf ( - - ) new-value) -
-

- -
-

-
- - -

- [Special variable]
- - - - - - -

- -
-

-
- - -

- [Standard class]
- - - - - - -

- -
-

-
- - -

- [Condition type]
- - - - - - -

- -
-

-
- - -

- [Symbol]
- - - - - - -

- -
-

-
- - -

- [Constant]
- - - - - - -

- -
-

-
- - - - - - -
-
- - - -

- [Constants]
- -

- -
-

-
- - -

- [Logical Pathname Host]
- - - - - - -

- -
-

-
- - - - - - - - - & - - - - - - - - - - - - - - # - - - - - - - - - - - - - - - http://www.lispworks.com/documentation/HyperSpec/Body/ - - - - - -

- - - - -

- -
- - -

- - - - -

- -
- - -

Abstract

-
- -
-
- - -

Contents

-
    - -
  1. - - # - - - -
      - -
    1. - - # - - -
    2. -
      -
    -
    -
  2. -
    -
-
- - -
    - - -
  • - - - -
  • -
    -
-
- - - - - - - - -
diff --git a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/doc.xml b/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/doc.xml deleted file mode 100644 index b426bb4..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/doc.xml +++ /dev/null @@ -1,748 +0,0 @@ - - - - - - YASON - A JSON encoder/decoder for Common Lisp - - - YASON is a JSON encoding and decoding library for Common Lisp. It - provides for functions to read JSON strings into Lisp data - structures and for serializing Lisp data structures as JSON - strings. - - - - YASON is a Common Lisp library for encoding and decoding data in - the JSON interchange format. JSON - is used as a lightweight alternative to XML. YASON has the sole - purpose of encoding and decoding data and does not impose any - object model on the Common Lisp application that uses it. - - - - - -

- JSON is an established - alternative to XML as a data interchange format for web - applications. YASON implements reading and writing of JSON - formatted data in Common Lisp. It does not attempt to provide a - mapping between CLOS objects and YASON, but can be used to - implement such mappings. -

-

- CL-JSON is - another Common Lisp package that can be used to work with JSON - encoded data. It takes a more integrated approach, providing - for library internal mappings between JSON objects and CLOS - objects. YASON was created as a lightweight, documented - alternative with a minimalistic approach and extensibilty. -

-
- - -

- YASON has its permanent home at GitHub. - It can be obtained by downloading the release - tarball. The current release is . -

-

- You may also check out the current development version from its - git - repository. If you have suggestions regarding YASON, please - email me at hans.huebner@gmail.com. -

-

- YASON is written in ANSI Common Lisp. It depends on UNIT-TEST, - TRIVIAL-GRAY-STREAMS and ALEXANDRIA open source libraries. The - recommended way to install YASON and its dependencies is through - the excellent Quicklisp - library management system. -

-

- YASON lives in the :yason package and creates a package - nickname :json. Applications will not normally - :use this package, but rather use qualified names to - access YASON's symbols. For that reason, YASON's symbols do not - contain the string "JSON" themselves. See below for usage - samples. -

-
- - - Versions of YASON preceding the v0.6.0 release provided a package - nickname "JSON" for the "YASON" package. This made it impossible - to load both YASON and CL-JSON into the same image, because - CL-JSON uses the "JSON" package name as well. - -

- As CL-JSON's use of "JSON" as package name has a much longer - history and loading of both CL-JSON and YASON into the same - image has become more common, the "JSON" nickname was removed - from the YASON package with the v0.6.0 release. Users will need - to change their applications so that the "JSON" nickname is no - longer used to refer to the "YASON" package. It is understood - that this is a disruptive change, but as there is no - all-encompassing workaround, this step was felt to be the right - one to make -

-
- - - By default, YASON performs the following mappings between JSON and - CL datatypes: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
JSON
datatype
CL
datatype
Notes
objecthash-table
:test #'equal
- Keys are strings by default (see - *parse-object-key-fn*). Set - *parse-object-as* to :alist in - order to have YASON parse objects as alists or to - :plist to parse them as plists. When using plists, - you probably want to also set - *parse-object-key-fn* to a function - that interns the object's keys to symbols. -
arraylist - Can be changed to read to vectors (see - *parse-json-arrays-as-vectors*). -
stringstring - JSON escape characters are recognized upon reading. Upon - writing, known escape characters are used, but non-ASCII - Unicode characters are written as is. -
numbernumber - Parsed with READ, printed with PRINC. This is not a - faithful implementation of the specification. -
truet - Can be changed to read as TRUE (see - *parse-json-booleans-as-symbols*). -
falsenil - Can be changed to read as FALSE (see - *parse-json-booleans-as-symbols*). -
nullnil
-
- - -

- JSON data is always completely parsed into an equivalent - in-memory representation. Upon reading, some translations are - performed by default to make it easier for the Common Lisp - program to work with the data; see mapping - for details. If desired, the parser can be configured to - preserve the full semantics of the JSON data read. -

- - For example - -
CL-USER> (defvar *json-string* "[{\"foo\":1,\"bar\":[7,8,9]},2,3,4,[5,6,7],true,null]")
-*JSON-STRING*
-CL-USER> (let* ((result (yason:parse *json-string*)))
-           (print result)
-           (alexandria:hash-table-plist (first result)))
-
-(#<HASH-TABLE :TEST EQUAL :COUNT 2 {5A4420F1}> 2 3 4 (5 6 7) T NIL)
-("bar" (7 8 9) "foo" 1)
-CL-USER> (defun maybe-convert-to-keyword (js-name)
-           (or (find-symbol (string-upcase js-name) :keyword)
-               js-name))
-MAYBE-CONVERT-TO-KEYWORD
-CL-USER> :FOO ; intern the :FOO keyword
-:FOO
-CL-USER> (let* ((yason:*parse-json-arrays-as-vectors* t)
-                (yason:*parse-json-booleans-as-symbols* t)
-                (yason:*parse-object-key-fn* #'maybe-convert-to-keyword)
-                (result (yason:parse *json-string*)))
-           (print result)
-           (alexandria:hash-table-plist (aref result 0)))
-
-#(#<HASH-TABLE :TEST EQUAL :COUNT 2 {59B4EAD1}> 2 3 4 #(5 6 7) YASON:TRUE NIL)
-("bar" #(7 8 9) :FOO 1)
- -

- The second example modifies the parser's behaviour so that JSON - arrays are read as CL vectors, JSON booleans will be read as the - symbols TRUE and FALSE and JSON object keys will be looked up in - the :keyword package. Interning strings coming from an - external source is not recommended practice. -

- - - - input &key (object-key-fn - *parse-object-as-key-fn*) (object-as *parse-object-as*) - (json-arrays-as-vectors *parse-json-arrays-as-vectors*) - (json-booleans-as-symbols *parse-json-booleans-as-symbols*) - (json-nulls-as-keyword *parse-json-null-as-keyword*) - object - - Parse input, which must be a string or - a stream, as JSON. Returns the Lisp representation of the - JSON structure parsed. -

- The keyword arguments object-key-fn, - object-as, - json-arrays-as-vectors, - json-booleans-as-symbols, and - json-null-as-keyword may be used - to specify different values for the parsing parameters - from the current bindings of the respective special - variables. -

-
-
- - - - If set to a true value, JSON arrays will be parsed as - vectors, not as lists. NIL is the default. - - - - - - Can be set to :hash-table to parse objects as hash - tables, :alist to parse them as alists or - :plist to parse them as plists. :hash-table - is the default. - - - - - - If set to a true value, JSON booleans will be read as the - symbols TRUE and FALSE instead of T and NIL, respectively. - NIL is the default. - - - - - - If set to a true value, JSON null will be read as the - keyword :NULL, instead of NIL. - NIL is the default. - - - - - - Function to call to convert a key string in a JSON object to - a key in the CL hash produced. IDENTITY is the default. - - - -
-
- - - YASON provides two distinct modes to encode JSON data: - applications can either create an in-memory representation of the - data to be serialized, then have YASON convert it to JSON in one - go, or they can use a set of macros to serialze the JSON data - element-by-element, allowing fine-grained control over the layout - of the generated data. - -

- Optionally, the JSON that is produced can be indented. - Indentation requires the use of a - JSON-OUTPUT-STREAM as serialization target. - With the stream serializer, such a stream is automatically used. - If indentation is desired with the DOM serializer, such a stream - can be obtained by calling the - MAKE-JSON-OUTPUT-STREAM function with the - target output string as argument. Please be aware that indented - output not requires more space, but is also slower and should - not be enabled in performance critical applications. -

- - -

- In this mode, an in-memory structure is encoded in JSON - format. The structure must consist of objects that are - serializable using the ENCODE function. - YASON defines a number of encoders for standard data types - (see MAPPING), but the application can - define additional methods (e.g. for encoding CLOS objects). -

- For example: -
CL-USER> (yason:encode
-          (list (alexandria:plist-hash-table
-                 '("foo" 1 "bar" (7 8 9))
-                 :test #'equal)
-                2 3 4
-                '(5 6 7)
-                t nil)
-          *standard-output*)
-[{"foo":1,"bar":[7,8,9]},2,3,4,[5,6,7],true,null]
-(#<HASH-TABLE :TEST EQUAL :COUNT 2 {59942D21}> 2 3 4 (5 6 7) T NIL)
- - - - object &optional - stream - object - - Encode object in JSON format and - write to stream. May be specialized - by applications to perform specific rendering. Stream - defaults to *STANDARD-OUTPUT*. - - - - - object &optional (stream - *standard-output*) - object - - Encodes object, an alist, in JSON - format and write to stream. - - - - - object &optional (stream - *standard-output*) - object - - Encodes object, a plist, in JSON - format and write to stream. - - - - - stream &key (indent t) - stream - - Creates a json-output-stream instance - that wraps the supplied stream and - optionally performs indentation of the generated JSON - data. The indent argument is - described in WITH-OUTPUT. Note that - if the indent argument is NIL, the - original stream is returned in order to avoid the - performance penalty of the indentation algorithm. - - - - - - Function to call to translate a CL list into JSON data. - 'YASON:ENCODE-PLAIN-LIST-TO-ARRAY is the default; - 'YASON:ENCODE-PLIST and - 'YASON:ENCODE-ALIST are available to produce - JSON objects. -

- This is useful to translate a deeply recursive structure in a single - YASON:ENCODE call. -

-
-
- - - - - Defines the policy to encode symbols as keys (eg. in hash tables). - The default is to error out, to provide backwards-compatible behaviour. -

- A useful function that can be bound to this variable is - YASON:ENCODE-SYMBOL-AS-LOWERCASE. -

-
-
-
-
- - -

- In this mode, the JSON structure is generated in a stream. - The application makes explicit calls to the encoding library - in order to generate the JSON structure. It provides for more - control over the generated output, and can be used to generate - arbitary JSON without requiring that there exists a directly - matching Lisp data structure. The streaming API uses the - encode function, so it is possible to - intermix the two (see app-encoders for an - example). -

- For example: -
CL-USER> (yason:with-output (*standard-output*)
-           (yason:with-array ()
-             (dotimes (i 3)
-               (yason:encode-array-element i))))
-[0,1,2]
-NIL
-CL-USER> (yason:with-output (*standard-output*)
-           (yason:with-object ()
-             (yason:encode-object-element "hello" "hu hu")
-             (yason:with-object-element ("harr")
-               (yason:with-array ()
-                 (dotimes (i 3)
-                   (yason:encode-array-element i))))))
-{"hello":"hu hu","harr":[0,1,2]}
-NIL
- - - - (stream &key indent) &body body - result* - - Set up a JSON streaming encoder context on - stream, then evaluate - body. indent - can be set to T to enable indentation with a default - indentation width or to an integer specifying the desired - indentation width. By default, indentation is switched - off. - - - - - (&key indent stream-symbol) &body body - result* - - Set up a JSON streaming encoder context on - stream-symbol (by default - a gensym), then evaluate - body. Return a string with the - generated JSON output. See - WITH-OUTPUT for the description of - the indent keyword argument. - - - - - - This condition is signalled when one of the stream - encoding functions is used outside the dynamic context of - a WITH-OUTPUT or - WITH-OUTPUT-TO-STRING* body. - - - - - () &body body - result* - - Open a JSON array, then run body. - Inside the body, ENCODE-ARRAY-ELEMENT - must be called to encode elements to the opened array. - Must be called within an existing JSON encoder context - (see WITH-OUTPUT and - WITH-OUTPUT-TO-STRING*). - - - - - object - object - - Encode object as next array element to - the last JSON array opened - with WITH-ARRAY in the dynamic - context. object is encoded using the - ENCODE generic function, so it must be of - a type for which an ENCODE method is - defined. - - - - - &rest objects - result* - - Encode objects, a series of JSON - encodable objects, as the next array elements in a JSON - array opened with - WITH-ARRAY. ENCODE-ARRAY-ELEMENTS - uses ENCODE-ARRAY-ELEMENT, which must - be applicable to each object in the list - (i.e. ENCODE must be defined for each - object type). Additionally, this must be called within a - valid stream context. - - - - - () &body body - result* - - Open a JSON object, then run body. - Inside the body, - ENCODE-OBJECT-ELEMENT or - WITH-OBJECT-ELEMENT must be called to - encode elements to the object. Must be called within an - existing JSON encoder - WITH-OUTPUT and - WITH-OUTPUT-TO-STRING*. - - - - - (key) &body body - result* - - Open a new encoding context to encode a JSON object - element. key is the key of the - element. The value will be whatever - body serializes to the current JSON - output context using one of the stream encoding functions. - This can be used to stream out nested object structures. - - - - - key value - value - - Encode key and - value as object element to the last - JSON object opened with WITH-OBJECT - in the dynamic context. key and - value are encoded using the - ENCODE generic function, so they both - must be of a type for which an ENCODE - method is defined. - - - - - &rest elements - result* - - Encodes the parameters into JSON in the last object opened - with WITH-OBJECT using - ENCODE-OBJECT-ELEMENT. The parameters - should consist of alternating key/value pairs, and this - must be called within a valid stream context. - - - - - object slots - result* - - Encodes each slot in SLOTS for OBJECT in the last object - opened with WITH-OBJECT using - ENCODE-OBJECT-ELEMENT. The key is the - slot name, and the value is the slot value for the slot on - OBJECT. It is equivalent to -
(loop for slot in slots
-    do (encode-object-element (string slot)
-                              (slot-value object slot)))
-			
-
-
- - - object - result* - - Generic function to encode object slots. There is no default - implementation. - It should be called in an object encoding context. It uses - PROGN combinatation with MOST-SPECIFIC-LAST order, so that - base class slots are encoded before derived class slots. - - - - - object - result* - - Generic function to encode an object. The default implementation - opens a new object encoding context and calls - ENCODE-SLOTS on the argument. - - - - - - Instances of this class are used to wrap an output stream - that is used as a serialization target in the stream - encoder and optionally in the DOM encoder if indentation - is desired. The class name is not exported, use - make-json-output-stream to create a - wrapper stream if required. - - -
-
- - - - Suppose your application uses structs to represent its data and - you want to encode these structs using JSON in order to send - them to a client application. Suppose further that your structs - also include internal information that you do not want to send. - Here is some code that illustrates how one could implement a - serialization function: - -
CL-USER> (defstruct user name age password)
-USER
-CL-USER> (defmethod yason:encode ((user user) &optional (stream *standard-output*))
-           (yason:with-output (stream)
-             (yason:with-object ()
-               (yason:encode-object-element "name" (user-name user))
-               (yason:encode-object-element "age" (user-age user)))))
-#<STANDARD-METHOD YASON:ENCODE (USER) {5B40A591}>
-CL-USER> (yason:encode (list (make-user :name "horst" :age 27 :password "puppy")
-                            (make-user :name "uschi" :age 28 :password "kitten")))
-[{"name":"horst","age":27},{"name":"uschi","age":28}]
-(#S(USER :NAME "horst" :AGE 27 :PASSWORD "puppy")
- #S(USER :NAME "uschi" :AGE 28 :PASSWORD "kitten"))
- - As you can see, the streaming API and the DOM encoder can be - used together. ENCODE invokes itself - recursively, so any application defined method will be called - while encoding in-memory objects as appropriate. - -

For an example of the interplay between - ENCODE-OBJECT and - ENCODE-SLOTS, suppose you have the following - CLOS class heirarchy: - -

(defclass shape ()
-  ((color :reader color)))
-
-(defclass square (shape)
-  ((side-length :reader side-length)))
-
-(defclass circle (shape)
-  ((radius :reader radius)))
- - In order to implement encoding of circles and squares without - duplicating code you can specialize - ENCODE-SLOTS for all three classes - -
(defmethod yason:encode-slots progn ((shape shape))
-  (yason:encode-object-element "color" (color shape)))
-
-(defmethod yason:encode-slots progn ((square square))
-  (yason:encode-object-element "side-length" (side-length square)))
-
-(defmethod yason:encode-slots progn ((circle circle))
-  (yason:encode-object-element "radius" (radius circle)))
- - and then use ENCODE-OBJECT: - -
CL-USER> (yason:with-output-to-string* ()
-           (yason:encode-object (make-instance 'square :color "red" :side-length 3)))
-"{\"color\":\"red\",\"side-length\":3}"
-CL-USER> (yason:with-output-to-string* ()
-           (yason:encode-object (make-instance 'circle :color "blue" :side-length 5)))
-"{\"color\":\"blue\",\"radius\":5}"
-

-

Alternatively, you can use the shortcut ENCODE-OBJECT-SLOTS - if you want the keys to be the slot names. For example: -

(defclass person ()
-  ((name :reader name :initarg :name)
-   (address :reader address :initarg :address)
-   (phone-number :reader phone-number :initarg :phone)
-   (favorite-color :reader favorite-color :initarg :color)))
-
-(defmethod yason:encode-slots progn ((person person))
-  (yason:encode-object-slots person '(name address phone-number favorite-color)))
- and then: - -
CL-USER> (yason:with-output-to-string* ()
-       (yason:encode-object (make-instance 'person :name "John Doe"
-                                                   :address "123 Main St."
-                                                   :phone "(123)-456-7890"
-                                                   :color "blue")))
-"{\"NAME\":\"John Doe\",\"ADDRESS\":\"123 Main St.\",\"PHONE-NUMBER\":\"(123)-456-7890\",
-\"FAVORITE-COLOR\":\"blue\"}"
-

-
-
- - - - - - -
Copyright (c) 2008-2014 Hans Hübner and contributors
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-  - Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-
-  - Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in
-    the documentation and/or other materials provided with the
-    distribution.
-
-  - Neither the name BKNR nor the names of its contributors may be
-    used to endorse or promote products derived from this software
-    without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
- - - Thanks go to Edi Weitz for being a great inspiration. This - documentation as been generated with a hacked-up version of his DOCUMENTATION-TEMPLATE - software. Thanks to David Lichteblau for coining YASON's name. - - -
diff --git a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/encode.lisp b/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/encode.lisp deleted file mode 100644 index 6c7f902..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/encode.lisp +++ /dev/null @@ -1,388 +0,0 @@ -;; This file is part of yason, a Common Lisp JSON parser/encoder -;; -;; Copyright (c) 2008-2014 Hans Huebner and contributors -;; All rights reserved. -;; -;; Please see the file LICENSE in the distribution. - -(in-package :yason) - -(defvar *json-output*) - -(defparameter *default-indent* nil - "Set to T or an numeric indentation width in order to have YASON - indent its output by default.") - -(defparameter *default-indent-width* 2 - "Default indentation width for output if indentation is selected - with no indentation width specified.") - -(defparameter *list-encoder* 'encode-plain-list-to-array - "The actual function used to encode a LIST. - Can be changed to encode ALISTs or PLISTs as dictionaries by - setting it to ENCODE-ALIST or ENCODE-PLIST.") - -(defparameter *symbol-key-encoder* 'encode-symbol-key-error - "The actual function used to encode a SYMBOL when seen as a key. - You might want ENCODE-SYMBOL-AS-LOWERCASE here.") - - -(defgeneric encode (object &optional stream) - - (:documentation "Encode OBJECT to STREAM in JSON format. May be - specialized by applications to perform specific rendering. STREAM - defaults to *STANDARD-OUTPUT*.")) - -(defparameter *char-replacements* - (alexandria:plist-hash-table - '(#\\ "\\\\" - #\" "\\\"" - #\Backspace "\\b" - #\Page "\\f" - #\Newline "\\n" - #\Return "\\r" - #\Tab "\\t"))) - -(defun unicode-code (char) - (char-code char)) - -(defun unicode-char (code) - (code-char code)) - -(defun write-surrogate-pair-escape (code stream) - (let ((upper (+ (ldb (byte 10 10) (- code #x10000)) - #xD800)) - (lower (+ (ldb (byte 10 0) (- code #x10000)) - #xDC00))) - (format stream "\\u~4,'0X\\u~4,'0X" upper lower))) - -(defmethod encode ((string string) &optional (stream *standard-output*)) - (write-char #\" stream) - (dotimes (i (length string)) - (let* ((char (aref string i)) - (replacement (gethash char *char-replacements*))) - (cond - (replacement (write-string replacement stream)) - ;; Control characters (U+0000 - U+001F) must be escaped. - ((<= #x0000 (unicode-code char) #x001F) - (format stream "\\u~4,'0X" (unicode-code char))) - ;; Non-BMP characters must be escaped as a UTF-16 surrogate pair. - ((<= #x010000 (unicode-code char) #x10FFFF) - (write-surrogate-pair-escape (unicode-code char) stream)) - (t (write-char char stream))))) - (write-char #\" stream) - string) - -(defmethod encode ((object ratio) &optional (stream *standard-output*)) - (encode (coerce object 'double-float) stream) - object) - -(defmethod encode ((object float) &optional (stream *standard-output*)) - (let ((*read-default-float-format* 'double-float)) - (format stream "~F" (coerce object 'double-float))) - object) - -(defmethod encode ((object integer) &optional (stream *standard-output*)) - (princ object stream)) - -(defmacro with-aggregate/object ((stream opening-char closing-char) &body body) - "Set up serialization context for aggregate serialization with the - object encoder." - (alexandria:with-gensyms (printed) - `(progn - (write-delimiter ,opening-char ,stream) - (change-indentation ,stream #'+) - (prog1 - (let (,printed) - (macrolet ((with-element-output (() &body body) - `(progn - (cond - (,',printed - (write-delimiter #\, ,',stream)) - (t - (setf ,',printed t))) - (write-indentation ,',stream) - ,@body))) - ,@body)) - (change-indentation ,stream #'-) - (write-indentation ,stream) - (write-delimiter ,closing-char ,stream))))) - -(defun encode-key/value (key value stream) - (encode key stream) - (write-char #\: stream) - (encode value stream)) - -(defmethod encode ((object hash-table) &optional (stream *standard-output*)) - (with-aggregate/object (stream #\{ #\}) - (maphash (lambda (key value) - (with-element-output () - (encode-key/value key value stream))) - object) - object)) - -(defmethod encode ((object vector) &optional (stream *standard-output*)) - (with-aggregate/object (stream #\[ #\]) - (loop for value across object - do (with-element-output () - (encode value stream))) - object)) - -(defun encode-plain-list-to-array (object stream) - (with-aggregate/object (stream #\[ #\]) - (dolist (value object) - (with-element-output () - (encode value stream))) - object)) - -(defmethod encode ((object list) &optional (stream *standard-output*)) - (funcall *list-encoder* object stream)) - - -(defun encode-symbol-key-error (key) - (error "No policy for symbols as keys defined. ~ - Please check YASON:*SYMBOL-KEY-ENCODER*.")) - -(defun encode-symbol-as-lowercase (key) - "Encodes a symbol KEY as a lowercase string. - Ensure that there's no intentional lower-case character lost." - (let ((name (symbol-name key))) - (assert (notany #'lower-case-p name)) - (string-downcase name))) - -(defun encode-assoc-key/value (key value stream) - ;; Checking (EVERY #'UPPER-CASE-P name) breaks with non-alpha characters like #\- - (let ((string (if (symbolp key) - (funcall *symbol-key-encoder* key) - (string key)))) - (encode-key/value string value stream))) - -(defun encode-alist (object &optional (stream *standard-output*)) - ;; Failsafe in case this here is not an ALIST but a normal list - (if (consp (first object)) - (with-aggregate/object (stream #\{ #\}) - (loop for (key . value) in object - do (with-element-output () - (encode-assoc-key/value key value stream))) - object) - ;; We can't call *LIST-ENCODER* again, that would be an unlimited recursion - (encode-plain-list-to-array object stream))) - -(defun encode-plist (object &optional (stream *standard-output*)) - (with-aggregate/object (stream #\{ #\}) - (loop for (key value) on object by #'cddr - do (with-element-output () - (encode-assoc-key/value key value stream))) - object)) - -(defmethod encode ((object (eql 'true)) &optional (stream *standard-output*)) - (write-string "true" stream) - object) - -(defmethod encode ((object (eql 'false)) &optional (stream *standard-output*)) - (write-string "false" stream) - object) - -(defmethod encode ((object (eql :null)) &optional (stream *standard-output*)) - (write-string "null" stream) - object) - -(defmethod encode ((object (eql t)) &optional (stream *standard-output*)) - (write-string "true" stream) - object) - -(defmethod encode ((object (eql nil)) &optional (stream *standard-output*)) - (write-string "null" stream) - object) - -(defclass json-output-stream (trivial-gray-streams:fundamental-character-output-stream) - ((output-stream :reader output-stream - :initarg :output-stream) - (stack :accessor stack - :initform nil) - (indent :initarg :indent - :reader indent - :accessor indent%) - (indent-string :initform "" - :accessor indent-string)) - (:default-initargs :indent *default-indent*) - (:documentation "Objects of this class capture the state of a JSON stream encoder.")) - -(defmethod initialize-instance :after ((stream json-output-stream) &key indent) - (when (eq indent t) - (setf (indent% stream) *default-indent-width*))) - -(defgeneric make-json-output-stream (stream &key indent)) - -(defmethod make-json-output-stream (stream &key (indent t)) - "Create a JSON output stream with indentation enabled." - (if indent - (make-instance 'json-output-stream :output-stream stream :indent indent) - stream)) - -(defmethod trivial-gray-streams:stream-write-char ((stream json-output-stream) char) - (write-char char (output-stream stream))) - -(defgeneric write-indentation (stream) - (:method ((stream t)) - nil) - (:method ((stream json-output-stream)) - (when (indent stream) - (fresh-line (output-stream stream)) - (write-string (indent-string stream) (output-stream stream))))) - -(defgeneric write-delimiter (char stream) - (:method (char stream) - (write-char char stream)) - (:method (char (stream json-output-stream)) - (write-char char (output-stream stream)))) - -(defgeneric change-indentation (stream operator) - (:method ((stream t) (operator t)) - nil) - (:method ((stream json-output-stream) operator) - (when (indent stream) - (setf (indent-string stream) (make-string (funcall operator (length (indent-string stream)) - (indent stream)) - :initial-element #\Space))))) - -(defun next-aggregate-element () - (if (car (stack *json-output*)) - (write-char (car (stack *json-output*)) (output-stream *json-output*)) - (setf (car (stack *json-output*)) #\,))) - -(defmacro with-output ((stream &rest args &key indent) &body body) - (declare (ignore indent)) - "Set up a JSON streaming encoder context on STREAM, then evaluate BODY." - `(let ((*json-output* (make-instance 'json-output-stream :output-stream ,stream ,@args))) - ,@body)) - -(defmacro with-output-to-string* ((&rest args &key indent stream-symbol) &body body) - "Set up a JSON streaming encoder context, then evaluate BODY. - Return a string with the generated JSON output." - (declare (ignore indent)) - (let ((stream (or stream-symbol (gensym "STREAM")))) - (remf args :stream-symbol) - `(with-output-to-string (,stream) - (with-output (,stream ,@args) - ,@body)))) - -(define-condition no-json-output-context (error) - () - (:report "No JSON output context is active") - (:documentation "This condition is signalled when one of the stream - encoding function is used outside the dynamic context of a - WITH-OUTPUT or WITH-OUTPUT-TO-STRING* body.")) - -(defmacro with-aggregate/stream ((begin-char end-char) &body body) - "Set up context for aggregate serialization for the stream encoder." - `(progn - (unless (boundp '*json-output*) - (error 'no-json-output-context)) - (when (stack *json-output*) - (next-aggregate-element)) - (write-indentation *json-output*) - (write-delimiter ,begin-char *json-output*) - (change-indentation *json-output* #'+) - (push nil (stack *json-output*)) - (prog1 - (progn ,@body) - (pop (stack *json-output*)) - (change-indentation *json-output* #'-) - (write-indentation *json-output*) - (write-delimiter ,end-char *json-output*)))) - -(defmacro with-array (() &body body) - "Open a JSON array, then run BODY. Inside the body, -ENCODE-ARRAY-ELEMENT must be called to encode elements to the opened -array. Must be called within an existing JSON encoder context, see -WITH-OUTPUT and WITH-OUTPUT-TO-STRING*." - `(with-aggregate/stream (#\[ #\]) ,@body)) - -(defmacro with-object (() &body body) - "Open a JSON object, then run BODY. Inside the body, -ENCODE-OBJECT-ELEMENT or WITH-OBJECT-ELEMENT must be called to encode -elements to the object. Must be called within an existing JSON -encoder context, see WITH-OUTPUT and WITH-OUTPUT-TO-STRING*." - `(with-aggregate/stream (#\{ #\}) ,@body)) - -(defun encode-array-element (object) - "Encode OBJECT as next array element to the last JSON array opened -with WITH-ARRAY in the dynamic context. OBJECT is encoded using the -ENCODE generic function, so it must be of a type for which an ENCODE -method is defined." - (next-aggregate-element) - (write-indentation *json-output*) - (encode object (output-stream *json-output*))) - -(defun encode-array-elements (&rest objects) - "Encode OBJECTS, a list of JSON encodable objects, as array elements." - (dolist (object objects) - (encode-array-element object))) - -(defun encode-object-element (key value) - "Encode KEY and VALUE as object element to the last JSON object -opened with WITH-OBJECT in the dynamic context. KEY and VALUE are -encoded using the ENCODE generic function, so they both must be of a -type for which an ENCODE method is defined." - (next-aggregate-element) - (write-indentation *json-output*) - (encode-key/value key value (output-stream *json-output*)) - value) - -(defun encode-object-elements (&rest elements) - "Encode plist ELEMENTS as object elements." - (loop for (key value) on elements by #'cddr - do (encode-object-element key value))) - -(defun encode-object-slots (object slots) - "For each slot in SLOTS, encode that slot on OBJECT as an object element. -Equivalent to calling ENCODE-OBJECT-ELEMENT for each slot where the -key is the slot name, and the value is the (SLOT-VALUE OBJECT slot)" - (loop for slot in slots - do (encode-object-element (string slot) - (slot-value object slot)))) - -(define-compiler-macro encode-object-slots (&whole form &environment env object raw-slots) - "Compiler macro to allow open-coding with encode-object-slots when slots are literal list." - (let ((slots (macroexpand raw-slots env))) - (cond - ((null slots) nil) - ((eq (car slots) 'quote) - (setf slots (cadr slots)) ; Get the quoted list - `(with-slots ,slots ,object - ,@(loop for slot in slots - collect `(encode-object-element ,(string slot) ,slot)))) - (t form)))) - -(defmacro with-object-element ((key) &body body) - "Open a new encoding context to encode a JSON object element. KEY - is the key of the element. The value will be whatever BODY - serializes to the current JSON output context using one of the - stream encoding functions. This can be used to stream out nested - object structures." - `(progn - (next-aggregate-element) - (write-indentation *json-output*) - (encode ,key (output-stream *json-output*)) - (setf (car (stack *json-output*)) #\:) - (unwind-protect - (progn ,@body) - (setf (car (stack *json-output*)) #\,)))) - -(defgeneric encode-slots (object) - (:documentation - "Generic function to encode object slots. It should be called in an - object encoding context. It uses PROGN combinatation with - MOST-SPECIFIC-LAST order, so that base class slots are encoded - before derived class slots.") - (:method-combination progn :most-specific-last)) - -(defgeneric encode-object (object) - (:documentation - "Generic function to encode an object. The default implementation - opens a new object encoding context and calls ENCODE-SLOTS on - the argument.") - (:method (object) - (with-object () - (yason:encode-slots object)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/index.html b/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/index.html deleted file mode 100644 index 9f09709..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/index.html +++ /dev/null @@ -1,764 +0,0 @@ - -YASON - A JSON encoder/decoder for Common Lisp - -

YASON - A JSON encoder/decoder for Common Lisp

- - - -

Abstract

-
- YASON is a Common Lisp library for encoding and decoding data in - the JSON interchange format. JSON - is used as a lightweight alternative to XML. YASON has the sole - purpose of encoding and decoding data and does not impose any - object model on the Common Lisp application that uses it. -
- -

Contents

-
    -
  1. Introduction
  2. -
  3. Download and Installation
  4. -
  5. Using JSON as package name
  6. -
  7. Mapping between JSON and CL datatypes
  8. -
  9. -Parsing JSON data
    1. Parser dictionary
    -
  10. -
  11. -Encoding JSON data
      -
    1. Encoding a JSON DOM
    2. -
    3. Encoding JSON in streaming mode
    4. -
    5. Application specific encoders
    6. -
    -
  12. -
  13. Symbol index
  14. -
  15. License
  16. -
  17. Acknowledgements
  18. -
- -

Introduction

-

- JSON is an established - alternative to XML as a data interchange format for web - applications. YASON implements reading and writing of JSON - formatted data in Common Lisp. It does not attempt to provide a - mapping between CLOS objects and YASON, but can be used to - implement such mappings. -

-

- CL-JSON is - another Common Lisp package that can be used to work with JSON - encoded data. It takes a more integrated approach, providing - for library internal mappings between JSON objects and CLOS - objects. YASON was created as a lightweight, documented - alternative with a minimalistic approach and extensibilty. -

- - -

Download and Installation

-

- YASON has its permanent home at GitHub. - It can be obtained by downloading the release - tarball. The current release is 0.7.6. -

-

- You may also check out the current development version from its - git - repository. If you have suggestions regarding YASON, please - email me at hans.huebner@gmail.com. -

-

- YASON is written in ANSI Common Lisp. It depends on UNIT-TEST, - TRIVIAL-GRAY-STREAMS and ALEXANDRIA open source libraries. The - recommended way to install YASON and its dependencies is through - the excellent Quicklisp - library management system. -

-

- YASON lives in the :yason package and creates a package - nickname :json. Applications will not normally - :use this package, but rather use qualified names to - access YASON's symbols. For that reason, YASON's symbols do not - contain the string "JSON" themselves. See below for usage - samples. -

- - -

Using JSON as package name

- Versions of YASON preceding the v0.6.0 release provided a package - nickname "JSON" for the "YASON" package. This made it impossible - to load both YASON and CL-JSON into the same image, because - CL-JSON uses the "JSON" package name as well. - -

- As CL-JSON's use of "JSON" as package name has a much longer - history and loading of both CL-JSON and YASON into the same - image has become more common, the "JSON" nickname was removed - from the YASON package with the v0.6.0 release. Users will need - to change their applications so that the "JSON" nickname is no - longer used to refer to the "YASON" package. It is understood - that this is a disruptive change, but as there is no - all-encompassing workaround, this step was felt to be the right - one to make -

- - -

Mapping between JSON and CL datatypes

- By default, YASON performs the following mappings between JSON and - CL datatypes: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
JSON

datatype
CL

datatype
Notes
objecthash-table

:test #'equal
- Keys are strings by default (see - *parse-object-key-fn*). Set - *parse-object-as* to :alist in - order to have YASON parse objects as alists or to - :plist to parse them as plists. When using plists, - you probably want to also set - *parse-object-key-fn* to a function - that interns the object's keys to symbols. -
arraylist - Can be changed to read to vectors (see - *parse-json-arrays-as-vectors*). -
stringstring - JSON escape characters are recognized upon reading. Upon - writing, known escape characters are used, but non-ASCII - Unicode characters are written as is. -
numbernumber - Parsed with READ, printed with PRINC. This is not a - faithful implementation of the specification. -
truet - Can be changed to read as TRUE (see - *parse-json-booleans-as-symbols*). -
falsenil - Can be changed to read as FALSE (see - *parse-json-booleans-as-symbols*). -
nullnil
- - -

Parsing JSON data

-

- JSON data is always completely parsed into an equivalent - in-memory representation. Upon reading, some translations are - performed by default to make it easier for the Common Lisp - program to work with the data; see mapping - for details. If desired, the parser can be configured to - preserve the full semantics of the JSON data read. -

- - For example - -
CL-USER> (defvar *json-string* "[{\"foo\":1,\"bar\":[7,8,9]},2,3,4,[5,6,7],true,null]")
-*JSON-STRING*
-CL-USER> (let* ((result (yason:parse *json-string*)))
-           (print result)
-           (alexandria:hash-table-plist (first result)))
-
-(#<HASH-TABLE :TEST EQUAL :COUNT 2 {5A4420F1}> 2 3 4 (5 6 7) T NIL)
-("bar" (7 8 9) "foo" 1)
-CL-USER> (defun maybe-convert-to-keyword (js-name)
-           (or (find-symbol (string-upcase js-name) :keyword)
-               js-name))
-MAYBE-CONVERT-TO-KEYWORD
-CL-USER> :FOO ; intern the :FOO keyword
-:FOO
-CL-USER> (let* ((yason:*parse-json-arrays-as-vectors* t)
-                (yason:*parse-json-booleans-as-symbols* t)
-                (yason:*parse-object-key-fn* #'maybe-convert-to-keyword)
-                (result (yason:parse *json-string*)))
-           (print result)
-           (alexandria:hash-table-plist (aref result 0)))
-
-#(#<HASH-TABLE :TEST EQUAL :COUNT 2 {59B4EAD1}> 2 3 4 #(5 6 7) YASON:TRUE NIL)
-("bar" #(7 8 9) :FOO 1)
- -

- The second example modifies the parser's behaviour so that JSON - arrays are read as CL vectors, JSON booleans will be read as the - symbols TRUE and FALSE and JSON object keys will be looked up in - the :keyword package. Interning strings coming from an - external source is not recommended practice. -

- -

Parser dictionary

-

[Function]
parse input &key (object-key-fn - *parse-object-as-key-fn*) (object-as *parse-object-as*) - (json-arrays-as-vectors *parse-json-arrays-as-vectors*) - (json-booleans-as-symbols *parse-json-booleans-as-symbols*) - (json-nulls-as-keyword *parse-json-null-as-keyword*) - => - object

- Parse input, which must be a string or - a stream, as JSON. Returns the Lisp representation of the - JSON structure parsed. -

- The keyword arguments object-key-fn, - object-as, - json-arrays-as-vectors, - json-booleans-as-symbols, and - json-null-as-keyword may be used - to specify different values for the parsing parameters - from the current bindings of the respective special - variables. -

-

- -

- [Special variable]
*parse-json-arrays-as-vectors*

- If set to a true value, JSON arrays will be parsed as - vectors, not as lists. NIL is the default. -

- -

- [Special variable]
*parse-object-as*

- Can be set to :hash-table to parse objects as hash - tables, :alist to parse them as alists or - :plist to parse them as plists. :hash-table - is the default. -

- -

- [Special variable]
*parse-json-booleans-as-symbols*

- If set to a true value, JSON booleans will be read as the - symbols TRUE and FALSE instead of T and NIL, respectively. - NIL is the default. -

- -

- [Special variable]
*parse-json-null-as-keyword*

- If set to a true value, JSON null will be read as the - keyword :NULL, instead of NIL. - NIL is the default. -

- -

- [Special variable]
*parse-object-key-fn*

- Function to call to convert a key string in a JSON object to - a key in the CL hash produced. IDENTITY is the default. -

- - - - -

Encoding JSON data

- YASON provides two distinct modes to encode JSON data: - applications can either create an in-memory representation of the - data to be serialized, then have YASON convert it to JSON in one - go, or they can use a set of macros to serialze the JSON data - element-by-element, allowing fine-grained control over the layout - of the generated data. - -

- Optionally, the JSON that is produced can be indented. - Indentation requires the use of a - JSON-OUTPUT-STREAM as serialization target. - With the stream serializer, such a stream is automatically used. - If indentation is desired with the DOM serializer, such a stream - can be obtained by calling the - MAKE-JSON-OUTPUT-STREAM function with the - target output string as argument. Please be aware that indented - output not requires more space, but is also slower and should - not be enabled in performance critical applications. -

- -

Encoding a JSON DOM

-

- In this mode, an in-memory structure is encoded in JSON - format. The structure must consist of objects that are - serializable using the ENCODE function. - YASON defines a number of encoders for standard data types - (see MAPPING), but the application can - define additional methods (e.g. for encoding CLOS objects). -

- For example: -
CL-USER> (yason:encode
-          (list (alexandria:plist-hash-table
-                 '("foo" 1 "bar" (7 8 9))
-                 :test #'equal)
-                2 3 4
-                '(5 6 7)
-                t nil)
-          *standard-output*)
-[{"foo":1,"bar":[7,8,9]},2,3,4,[5,6,7],true,null]
-(#<HASH-TABLE :TEST EQUAL :COUNT 2 {59942D21}> 2 3 4 (5 6 7) T NIL)
- -

DOM encoder dictionary

-

[Generic function]
encode object &optional - stream - => - object

- Encode object in JSON format and - write to stream. May be specialized - by applications to perform specific rendering. Stream - defaults to *STANDARD-OUTPUT*. -

- -

[Function]
encode-alist object &optional (stream - *standard-output*) - => - object

- Encodes object, an alist, in JSON - format and write to stream. -

- -

[Function]
encode-plist object &optional (stream - *standard-output*) - => - object

- Encodes object, a plist, in JSON - format and write to stream. -

- -

[Function]
make-json-output-stream stream &key (indent t) - => - stream

- Creates a json-output-stream instance - that wraps the supplied stream and - optionally performs indentation of the generated JSON - data. The indent argument is - described in WITH-OUTPUT. Note that - if the indent argument is NIL, the - original stream is returned in order to avoid the - performance penalty of the indentation algorithm. -

- -

- [Special variable]
*list-encoder*

- Function to call to translate a CL list into JSON data. - 'YASON:ENCODE-PLAIN-LIST-TO-ARRAY is the default; - 'YASON:ENCODE-PLIST and - 'YASON:ENCODE-ALIST are available to produce - JSON objects. -

- This is useful to translate a deeply recursive structure in a single - YASON:ENCODE call. -

-

- - -

- [Special variable]
*symbol-key-encoder*

- Defines the policy to encode symbols as keys (eg. in hash tables). - The default is to error out, to provide backwards-compatible behaviour. -

- A useful function that can be bound to this variable is - YASON:ENCODE-SYMBOL-AS-LOWERCASE. -

-

- - - -

Encoding JSON in streaming mode

-

- In this mode, the JSON structure is generated in a stream. - The application makes explicit calls to the encoding library - in order to generate the JSON structure. It provides for more - control over the generated output, and can be used to generate - arbitary JSON without requiring that there exists a directly - matching Lisp data structure. The streaming API uses the - encode function, so it is possible to - intermix the two (see app-encoders for an - example). -

- For example: -
CL-USER> (yason:with-output (*standard-output*)
-           (yason:with-array ()
-             (dotimes (i 3)
-               (yason:encode-array-element i))))
-[0,1,2]
-NIL
-CL-USER> (yason:with-output (*standard-output*)
-           (yason:with-object ()
-             (yason:encode-object-element "hello" "hu hu")
-             (yason:with-object-element ("harr")
-               (yason:with-array ()
-                 (dotimes (i 3)
-                   (yason:encode-array-element i))))))
-{"hello":"hu hu","harr":[0,1,2]}
-NIL
- -

Streaming encoder dictionary

-

[Macro]
with-output (stream &key indent) &body body - => - result*

- Set up a JSON streaming encoder context on - stream, then evaluate - body. indent - can be set to T to enable indentation with a default - indentation width or to an integer specifying the desired - indentation width. By default, indentation is switched - off. -

- -

[Macro]
with-output-to-string* (&key indent stream-symbol) &body body - => - result*

- Set up a JSON streaming encoder context on - stream-symbol (by default - a gensym), then evaluate - body. Return a string with the - generated JSON output. See - WITH-OUTPUT for the description of - the indent keyword argument. -

- -

- [Condition type]
no-json-output-context

- This condition is signalled when one of the stream - encoding functions is used outside the dynamic context of - a WITH-OUTPUT or - WITH-OUTPUT-TO-STRING* body. -

- -

[Macro]
with-array () &body body - => - result*

- Open a JSON array, then run body. - Inside the body, ENCODE-ARRAY-ELEMENT - must be called to encode elements to the opened array. - Must be called within an existing JSON encoder context - (see WITH-OUTPUT and - WITH-OUTPUT-TO-STRING*). -

- -

[Function]
encode-array-element object - => - object

- Encode object as next array element to - the last JSON array opened - with WITH-ARRAY in the dynamic - context. object is encoded using the - ENCODE generic function, so it must be of - a type for which an ENCODE method is - defined. -

- -

[Function]
encode-array-elements &rest objects - => - result*

- Encode objects, a series of JSON - encodable objects, as the next array elements in a JSON - array opened with - WITH-ARRAY. ENCODE-ARRAY-ELEMENTS - uses ENCODE-ARRAY-ELEMENT, which must - be applicable to each object in the list - (i.e. ENCODE must be defined for each - object type). Additionally, this must be called within a - valid stream context. -

- -

[Macro]
with-object () &body body - => - result*

- Open a JSON object, then run body. - Inside the body, - ENCODE-OBJECT-ELEMENT or - WITH-OBJECT-ELEMENT must be called to - encode elements to the object. Must be called within an - existing JSON encoder - WITH-OUTPUT and - WITH-OUTPUT-TO-STRING*. -

- -

[Macro]
with-object-element (key) &body body - => - result*

- Open a new encoding context to encode a JSON object - element. key is the key of the - element. The value will be whatever - body serializes to the current JSON - output context using one of the stream encoding functions. - This can be used to stream out nested object structures. -

- -

[Function]
encode-object-element key value - => - value

- Encode key and - value as object element to the last - JSON object opened with WITH-OBJECT - in the dynamic context. key and - value are encoded using the - ENCODE generic function, so they both - must be of a type for which an ENCODE - method is defined. -

- -

[Function]
encode-object-elements &rest elements - => - result*

- Encodes the parameters into JSON in the last object opened - with WITH-OBJECT using - ENCODE-OBJECT-ELEMENT. The parameters - should consist of alternating key/value pairs, and this - must be called within a valid stream context. -

- -

[Function]
encode-object-slots object slots - => - result*

- Encodes each slot in SLOTS for OBJECT in the last object - opened with WITH-OBJECT using - ENCODE-OBJECT-ELEMENT. The key is the - slot name, and the value is the slot value for the slot on - OBJECT. It is equivalent to -
(loop for slot in slots
-    do (encode-object-element (string slot)
-                              (slot-value object slot)))
-			
-

- -

[Function]
encode-slots object - => - result*

- Generic function to encode object slots. There is no default - implementation. - It should be called in an object encoding context. It uses - PROGN combinatation with MOST-SPECIFIC-LAST order, so that - base class slots are encoded before derived class slots. -

- -

[Function]
encode-object object - => - result*

- Generic function to encode an object. The default implementation - opens a new object encoding context and calls - ENCODE-SLOTS on the argument. -

- -

- [Standard class]
json-output-stream

- Instances of this class are used to wrap an output stream - that is used as a serialization target in the stream - encoder and optionally in the DOM encoder if indentation - is desired. The class name is not exported, use - make-json-output-stream to create a - wrapper stream if required. -

- - - -

Application specific encoders

- - Suppose your application uses structs to represent its data and - you want to encode these structs using JSON in order to send - them to a client application. Suppose further that your structs - also include internal information that you do not want to send. - Here is some code that illustrates how one could implement a - serialization function: - -
CL-USER> (defstruct user name age password)
-USER
-CL-USER> (defmethod yason:encode ((user user) &optional (stream *standard-output*))
-           (yason:with-output (stream)
-             (yason:with-object ()
-               (yason:encode-object-element "name" (user-name user))
-               (yason:encode-object-element "age" (user-age user)))))
-#<STANDARD-METHOD YASON:ENCODE (USER) {5B40A591}>
-CL-USER> (yason:encode (list (make-user :name "horst" :age 27 :password "puppy")
-                            (make-user :name "uschi" :age 28 :password "kitten")))
-[{"name":"horst","age":27},{"name":"uschi","age":28}]
-(#S(USER :NAME "horst" :AGE 27 :PASSWORD "puppy")
- #S(USER :NAME "uschi" :AGE 28 :PASSWORD "kitten"))
- - As you can see, the streaming API and the DOM encoder can be - used together. ENCODE invokes itself - recursively, so any application defined method will be called - while encoding in-memory objects as appropriate. - -

For an example of the interplay between - ENCODE-OBJECT and - ENCODE-SLOTS, suppose you have the following - CLOS class heirarchy: - -

(defclass shape ()
-  ((color :reader color)))
-
-(defclass square (shape)
-  ((side-length :reader side-length)))
-
-(defclass circle (shape)
-  ((radius :reader radius)))
- - In order to implement encoding of circles and squares without - duplicating code you can specialize - ENCODE-SLOTS for all three classes - -
(defmethod yason:encode-slots progn ((shape shape))
-  (yason:encode-object-element "color" (color shape)))
-
-(defmethod yason:encode-slots progn ((square square))
-  (yason:encode-object-element "side-length" (side-length square)))
-
-(defmethod yason:encode-slots progn ((circle circle))
-  (yason:encode-object-element "radius" (radius circle)))
- - and then use ENCODE-OBJECT: - -
CL-USER> (yason:with-output-to-string* ()
-           (yason:encode-object (make-instance 'square :color "red" :side-length 3)))
-"{\"color\":\"red\",\"side-length\":3}"
-CL-USER> (yason:with-output-to-string* ()
-           (yason:encode-object (make-instance 'circle :color "blue" :side-length 5)))
-"{\"color\":\"blue\",\"radius\":5}"
-

-

Alternatively, you can use the shortcut ENCODE-OBJECT-SLOTS - if you want the keys to be the slot names. For example: -

(defclass person ()
-  ((name :reader name :initarg :name)
-   (address :reader address :initarg :address)
-   (phone-number :reader phone-number :initarg :phone)
-   (favorite-color :reader favorite-color :initarg :color)))
-
-(defmethod yason:encode-slots progn ((person person))
-  (yason:encode-object-slots person '(name address phone-number favorite-color)))
- and then: - -
CL-USER> (yason:with-output-to-string* ()
-       (yason:encode-object (make-instance 'person :name "John Doe"
-                                                   :address "123 Main St."
-                                                   :phone "(123)-456-7890"
-                                                   :color "blue")))
-"{\"NAME\":\"John Doe\",\"ADDRESS\":\"123 Main St.\",\"PHONE-NUMBER\":\"(123)-456-7890\",
-\"FAVORITE-COLOR\":\"blue\"}"
-

- - - -

Symbol index

- - - -

License

-
Copyright (c) 2008-2014 Hans Hübner and contributors
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-  - Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-
-  - Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in
-    the documentation and/or other materials provided with the
-    distribution.
-
-  - Neither the name BKNR nor the names of its contributors may be
-    used to endorse or promote products derived from this software
-    without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- - -

Acknowledgements

- Thanks go to Edi Weitz for being a great inspiration. This - documentation as been generated with a hacked-up version of his DOCUMENTATION-TEMPLATE - software. Thanks to David Lichteblau for coining YASON's name. - - - diff --git a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/package.lisp deleted file mode 100644 index 0140304..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/package.lisp +++ /dev/null @@ -1,50 +0,0 @@ -;; This file is part of yason, a Common Lisp JSON parser/encoder -;; -;; Copyright (c) 2008-2019 Hans Huebner and contributors -;; All rights reserved. -;; -;; Please see the file LICENSE in the distribution. - -(defpackage :yason - - (:use :cl) - - (:export - ;; Parser - #:parse - #:*parse-object-key-fn* - #:*parse-object-as* - #:*parse-object-as-alist* ; deprecated - #:*parse-json-arrays-as-vectors* - #:*parse-json-booleans-as-symbols* - #:*parse-json-null-as-keyword* - - #:true - #:false - #:null - - ;; Basic encoder interface - #:encode - #:encode-slots - #:encode-object - #:encode-plist - #:encode-alist - #:encode-plain-list-to-array - #:*list-encoder* - #:*symbol-key-encoder* - #:encode-symbol-as-lowercase - - #:make-json-output-stream - - ;; Streaming encoder interface - #:with-output - #:with-output-to-string* - #:no-json-output-context - #:with-array - #:encode-array-element - #:encode-array-elements - #:with-object - #:encode-object-element - #:encode-object-elements - #:encode-object-slots - #:with-object-element)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/parse.lisp b/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/parse.lisp deleted file mode 100644 index b7542bc..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/parse.lisp +++ /dev/null @@ -1,258 +0,0 @@ -;; This file is part of yason, a Common Lisp JSON parser/encoder -;; -;; Copyright (c) 2008-2014 Hans Huebner and contributors -;; All rights reserved. -;; -;; Please see the file LICENSE in the distribution. - -(in-package :yason) - -(defconstant +default-string-length+ 20 - "Default length of strings that are created while reading json input.") - -(defvar *parse-object-key-fn* #'identity - "Function to call to convert a key string in a JSON array to a key - in the CL hash produced.") - -(defvar *parse-json-arrays-as-vectors* nil - "If set to a true value, JSON arrays will be parsed as vectors, not - as lists.") - -(defvar *parse-json-booleans-as-symbols* nil - "If set to a true value, JSON booleans will be read as the symbols - TRUE and FALSE, not as T and NIL, respectively.") - -(defvar *parse-json-null-as-keyword* nil - "If set to a true value, JSON nulls will be read as the keyword :NULL, not as NIL.") - -(defvar *parse-object-as* :hash-table - "Set to either :hash-table, :plist or :alist to determine the data - structure that objects are parsed to.") - -(defvar *parse-object-as-alist* nil - "DEPRECATED, provided for backward compatibility") - -(defun make-adjustable-string () - "Return an adjustable empty string, usable as a buffer for parsing strings and numbers." - (make-array +default-string-length+ - :adjustable t :fill-pointer 0 :element-type 'character)) - -(defun parse-number (input) - ;; would be - ;; (cl-ppcre:scan-to-strings "^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+|)(?:[eE][-+]?[0-9]+|)" buffer) - ;; but we want to operate on streams - (let ((buffer (make-adjustable-string))) - (loop while (position (peek-char nil input nil) ".0123456789+-Ee") - do (vector-push-extend (read-char input) buffer)) - (values (read-from-string buffer)))) - -(defun parse-unicode-escape (input) - (let ((char-code (let ((buffer (make-string 4))) - (read-sequence buffer input) - (parse-integer buffer :radix 16)))) - (if (and (>= char-code #xd800) - (<= char-code #xdbff)) - (let ((buffer (make-string 6))) - (read-sequence buffer input) - (when (not (string= buffer "\\u" :end1 2)) - (error "Lead Surrogate without Tail Surrogate")) - (let ((tail-code (parse-integer buffer :radix 16 :start 2))) - (when (not (and (>= tail-code #xdc00) - (<= tail-code #xdfff))) - (error "Lead Surrogate without Tail Surrogate")) - (code-char (+ #x010000 - (ash (- char-code #xd800) 10) - (- tail-code #xdc00))))) - (code-char char-code)))) - -(defun parse-string (input) - (let ((output (make-adjustable-string))) - (labels ((outc (c) - (vector-push-extend c output)) - (next () - (read-char input)) - (peek () - (peek-char nil input))) - (let* ((starting-symbol (next)) - (string-quoted (equal starting-symbol #\"))) - (unless string-quoted - (outc starting-symbol)) - (loop - (cond - ((eql (peek) #\") - (next) - (return-from parse-string output)) - ((eql (peek) #\\) - (next) - (ecase (next) - (#\" (outc #\")) - (#\\ (outc #\\)) - (#\/ (outc #\/)) - (#\b (outc #\Backspace)) - (#\f (outc #\Page)) - (#\n (outc #\Newline)) - (#\r (outc #\Return)) - (#\t (outc #\Tab)) - (#\u (outc (parse-unicode-escape input))))) - ((and (or (whitespace-p (peek)) - (eql (peek) #\:)) - (not string-quoted)) - (return-from parse-string output)) - (t - (outc (next))))))))) - -(defun whitespace-p (char) - (member char '(#\Space #\Newline #\Tab #\Linefeed #\Return))) - -(defun skip-whitespace (input) - (loop for c = (peek-char nil input nil nil) - while (and c (whitespace-p c)) - do (read-char input))) - -(defun peek-char-skipping-whitespace (input &optional (eof-error-p t)) - (skip-whitespace input) - (peek-char nil input eof-error-p)) - -(defun parse-constant (input) - (destructuring-bind (expected-string return-value) - (find (peek-char nil input nil) - `(("true" ,(if *parse-json-booleans-as-symbols* 'true t)) - ("false" ,(if *parse-json-booleans-as-symbols* 'false nil)) - ("null" ,(if *parse-json-null-as-keyword* :null nil))) - :key (lambda (entry) (aref (car entry) 0)) - :test #'eql) - (loop for char across expected-string - unless (eql (read-char input nil) char) - do (error "invalid constant")) - return-value)) - -(define-condition cannot-convert-key (error) - ((key-string :initarg :key-string - :reader key-string)) - (:report (lambda (c stream) - (format stream "cannot convert key ~S used in JSON object to hash table key" - (key-string c))))) - -(defun create-container () - (ecase *parse-object-as* - ((:plist :alist) - nil) - (:hash-table - (make-hash-table :test #'equal)))) - -(defun add-attribute (to key value) - (ecase *parse-object-as* - (:plist - (append to (list key value))) - (:alist - (acons key value to)) - (:hash-table - (setf (gethash key to) value) - to))) - -(define-condition expected-colon (error) - ((key-string :initarg :key-string - :reader key-string)) - (:report (lambda (c stream) - (format stream "expected colon to follow key ~S used in JSON object" - (key-string c))))) - -(defun parse-object (input) - (let ((return-value (create-container))) - (read-char input) - (loop - (when (eql (peek-char-skipping-whitespace input) - #\}) - (return)) - (skip-whitespace input) - (setf return-value - (add-attribute return-value - (let ((key-string (parse-string input))) - (prog1 - (or (funcall *parse-object-key-fn* key-string) - (error 'cannot-convert-key :key-string key-string)) - (skip-whitespace input) - (unless (eql #\: (read-char input)) - (error 'expected-colon :key-string key-string)) - (skip-whitespace input))) - (parse input))) - (ecase (peek-char-skipping-whitespace input) - (#\, (read-char input)) - (#\} nil))) - (read-char input) - return-value)) - -(defconstant +initial-array-size+ 20 - "Initial size of JSON arrays read, they will grow as needed.") - -(defun %parse-array (input add-element-function) - "Parse JSON array from input, calling ADD-ELEMENT-FUNCTION for each array element parsed." - (read-char input) - (loop - (when (eql (peek-char-skipping-whitespace input) - #\]) - (return)) - (funcall add-element-function (parse input)) - (ecase (peek-char-skipping-whitespace input) - (#\, (read-char input)) - (#\] nil))) - (read-char input)) - -(defun parse-array (input) - (if *parse-json-arrays-as-vectors* - (let ((return-value (make-array +initial-array-size+ :adjustable t :fill-pointer 0))) - (%parse-array input - (lambda (element) - (vector-push-extend element return-value))) - return-value) - (let (return-value) - (%parse-array input - (lambda (element) - (push element return-value))) - (nreverse return-value)))) - -(defgeneric parse% (input) - (:method ((input stream)) - ;; backward compatibility code - (assert (or (not *parse-object-as-alist*) - (eq *parse-object-as* :hash-table)) - () "unexpected combination of *parse-object-as* and *parse-object-as-alist*, please use *parse-object-as* exclusively") - (let ((*parse-object-as* (if *parse-object-as-alist* - :alist - *parse-object-as*))) - ;; end of backward compatibility code - (check-type *parse-object-as* (member :hash-table :alist :plist)) - (ecase (peek-char-skipping-whitespace input) - (#\" - (parse-string input)) - ((#\- #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) - (parse-number input)) - (#\{ - (parse-object input)) - (#\[ - (parse-array input)) - ((#\t #\f #\n) - (parse-constant input))))) - (:method ((input pathname)) - (with-open-file (stream input) - (parse stream))) - (:method ((input string)) - (parse (make-string-input-stream input)))) - -(defun parse (input - &key - (object-key-fn *parse-object-key-fn*) - (object-as *parse-object-as*) - (json-arrays-as-vectors *parse-json-arrays-as-vectors*) - (json-booleans-as-symbols *parse-json-booleans-as-symbols*) - (json-nulls-as-keyword *parse-json-null-as-keyword*)) - "Parse INPUT, which needs to be a string or a stream, as JSON. - Returns the lisp representation of the JSON structure parsed. The - keyword arguments can be used to override the parser settings as - defined by the respective special variables." - (let ((*parse-object-key-fn* object-key-fn) - (*parse-object-as* object-as) - (*parse-json-arrays-as-vectors* json-arrays-as-vectors) - (*parse-json-booleans-as-symbols* json-booleans-as-symbols) - (*parse-json-null-as-keyword* json-nulls-as-keyword)) - (parse% input))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/render-doc.sh b/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/render-doc.sh deleted file mode 100644 index 07fb104..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/render-doc.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -xmllint --noout doc.xml -[ -f clixdoc.xsl ] || wget -q https://raw.github.com/hanshuebner/clixdoc/master/clixdoc.xsl -xsltproc --stringparam current-release `perl -ne 'if (/^ *:version +"(.*)"/) { print "$1\n" }' yason.asd` -o index.html clixdoc.xsl doc.xml diff --git a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/test.lisp b/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/test.lisp deleted file mode 100644 index 7001609..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/test.lisp +++ /dev/null @@ -1,116 +0,0 @@ -(defpackage :yason-test - (:use :cl :unit-test)) - -(in-package :yason-test) - -(defparameter *basic-test-json-string* "[{\"foo\":1,\"bar\":[7,8,9]},2,3,4,[5,6,7],true,null]") -(defparameter *basic-test-json-string-indented* " -[ - {\"foo\":1, - \"bar\":[7,8,9] - }, - 2, 3, 4, [5, 6, 7], true, null -]") -(defparameter *basic-test-json-dom* (list (alexandria:plist-hash-table - '("foo" 1 "bar" (7 8 9)) - :test #'equal) - 2 3 4 - '(5 6 7) - t nil)) - - -(deftest :yason "parser.basic" - (let ((result (yason:parse *basic-test-json-string*))) - (test-equal (first *basic-test-json-dom*) (first result) :test #'equalp) - (test-equal (rest *basic-test-json-dom*) (rest result)))) - -(deftest :yason "parser.basic-with-whitespace" - (let ((result (yason:parse *basic-test-json-string-indented*))) - (test-equal (first *basic-test-json-dom*) (first result) :test #'equalp) - (test-equal (rest *basic-test-json-dom*) (rest result)))) - -(deftest :yason "dom-encoder.basic" - (let ((result (yason:parse - (with-output-to-string (s) - (yason:encode *basic-test-json-dom* s))))) - (test-equal (first *basic-test-json-dom*) (first result) :test #'equalp) - (test-equal (rest *basic-test-json-dom*) (rest result)))) - -(defun whitespace-char-p (char) - (member char '(#\space #\tab #\return #\newline #\linefeed))) - -(deftest :yason "dom-encoder.indentation" - (test-equal "[ - 1, - 2, - 3 -]" - (with-output-to-string (s) - (yason:encode '(1 2 3) (yason:make-json-output-stream s :indent 10)))) - (dolist (indentation-arg '(nil t 2 20)) - (test-equal "[1,2,3]" (remove-if #'whitespace-char-p - (with-output-to-string (s) - (yason:encode '(1 2 3) - (yason:make-json-output-stream s :indent indentation-arg))))))) - -(deftest :yason "stream-encoder.basic-array" - (test-equal "[0,1,2]" - (with-output-to-string (s) - (yason:with-output (s) - (yason:with-array () - (dotimes (i 3) - (yason:encode-array-element i))))))) - -(deftest :yason "stream-encoder.basic-object" - (test-equal "{\"hello\":\"hu hu\",\"harr\":[0,1,2]}" - (with-output-to-string (s) - (yason:with-output (s) - (yason:with-object () - (yason:encode-object-element "hello" "hu hu") - (yason:with-object-element ("harr") - (yason:with-array () - (dotimes (i 3) - (yason:encode-array-element i))))))))) - -(deftest :yason "stream-encode.unicode-string" - (test-equal "\"ab\\u0002 cde \\uD834\\uDD1E\"" - (with-output-to-string (s) - (yason:encode (format nil "ab~C cde ~C" (code-char #x02) (code-char #x1d11e)) s)))) - -(defstruct user name age password) - -(defmethod yason:encode ((user user) &optional (stream *standard-output*)) - (yason:with-output (stream) - (yason:with-object () - (yason:encode-object-element "name" (user-name user)) - (yason:encode-object-element "age" (user-age user))))) - -(deftest :yason "stream-encoder.application-struct" - (test-equal "[{\"name\":\"horst\",\"age\":27},{\"name\":\"uschi\",\"age\":28}]" - (with-output-to-string (s) - (yason:encode (list (make-user :name "horst" :age 27 :password "puppy") - (make-user :name "uschi" :age 28 :password "kitten")) - s)))) - -(deftest :yason "recursive-alist-encode" - (test-equal "{\"a\":3,\"b\":[1,2,{\"c\":4,\"d\":[6]}]}" - (yason:with-output-to-string* (:stream-symbol s) - (let ((yason:*list-encoder* #'yason:encode-alist)) - (yason:encode - `(("a" . 3) ("b" . #(1 2 (("c" . 4) ("d" . #(6)))))) - s))))) - -(deftest :yason "symbols-as-keys" - (test-condition - (yason:with-output-to-string* (:stream-symbol s) - (let ((yason:*symbol-key-encoder* #'yason:encode-symbol-as-lowercase)) - (yason:encode-alist - `((:|abC| . 3)) - s))) - 'error) - (test-equal "{\"a\":3}" - (yason:with-output-to-string* (:stream-symbol s) - (let ((yason:*symbol-key-encoder* #'yason:encode-symbol-as-lowercase)) - (yason:encode-alist - `((:a . 3)) - s))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/yason.asd b/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/yason.asd deleted file mode 100644 index 5609413..0000000 --- a/sbcl/.quicklisp/dists/quicklisp/software/yason-v0.7.8/yason.asd +++ /dev/null @@ -1,33 +0,0 @@ -;;;; -*- Mode: Lisp -*- - -;; This file is part of yason, a Common Lisp JSON parser/encoder -;; -;; Copyright (c) 2008-2014 Hans Huebner and contributors -;; All rights reserved. -;; -;; Please see the file LICENSE in the distribution. - -(in-package :cl-user) - -(defpackage :yason.system - (:use :cl :asdf)) - -(in-package :yason.system) - -(defsystem :yason - :name "YASON" - :author "Hans Huebner " - :version "0.7.6" - :maintainer "Hans Huebner " - :licence "BSD" - :description "JSON parser/encoder" - :long-description "YASON is a Common Lisp library for encoding and - decoding data in the JSON interchange format. JSON is used as a - lightweight alternative to XML. YASON has the sole purpose of - encoding and decoding data and does not impose any object model on - the Common Lisp application that uses it." - - :depends-on (:alexandria :trivial-gray-streams) - :components ((:file "package") - (:file "encode" :depends-on ("package")) - (:file "parse" :depends-on ("package")))) diff --git a/sbcl/.quicklisp/dists/quicklisp/systems.cdb b/sbcl/.quicklisp/dists/quicklisp/systems.cdb deleted file mode 100644 index 49191e12004f50188ace9eb9f87e9706b38fba3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497817 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%0D=K7 zYe0l9Y#%UW`UsS7Kuv|J)S~>{!sHy?s@y^a2nR-iYEW=71v@hlHl_((91RKy&?*v$ zF7WC>P&&ad2qJ@d+7~26Ky3qgDFK`dOu(xrlXD=n0yYL@zz*a|=s|SQLD!u8bW=#O zM!9AZ+csLz@DXHg8DbAOnu;+jg9yVNfyRYK9w;me!EOh&|De-Bs1#EC!_zH%eFQW) zfc*{f6vpBbh)Q^Qj1~`|0tB?Q6JjISi4Z1qW(q8V#s-T)$_9v9&=3tI{1ZV3bV9B- zMUY7D2PG!V$jkw$1rfTrnJFnbspX&rKuL+o*(F7Z$*Brp8PI$oxQ+z1i6MKK6O*%b zGZOQ_otL!a^h}UrK(npr;$Y{aDn-t;U^jsa_u`V|^h~sBAH1U(y8IW^E}H<2D};GS ztzT>|K$1pt2(k>pFajH`Tb!SqomztCL}YVNr=>w*RgU4{l6=t3O`tG`7zztRkT{wX z!9qm14VtM?TA1jKB#>F4zVkE;2bJgNXM<+AFr5UEL30#T5W`uCNvYuK8+HI5C>_88 zEU~x*e5w)rusc+zf@2vq>=Yo@fQBC1;4Vf=pP)$`(1}T)WhDrQV^sikKXy6jp&PJN zh-mLXst-`V3A}y`k-6ck{y-iqGlUfTC7{V6$hJa|Fp^#1Rd(Q*#&ic*4wo>@NjQoW zu#viO`ys3OK;rN4 zg;+`w=pq43JtV^_gyQDtM^|bPonvs=<(ix&~7m7C!I{4oVP++yhE;xrs%^8HwPfYmj3eK}sMc z7;@Y|L|_&{Y6Ot!p#EJQyr=>V2_owP@u7OaOpp%Dsu)=ZtX@E_UtkMWP>WB{M73^G zeoCbRcwGpzx&-y%Sr{1@z-A%}3NRPy5`_Q3q6kHpIX|-~xilxS2()@XH8B@FQ2`H1 zX!Qfn49F!U)F!Z>ak(1aIs%m%NbL=zl||6F!FIw4qNNRQvcOtdxtY1Ch=YE>^Woq| z45&~7t=K5hh4>p5)QDybHW>x1g5ZdR7z6SoD5Ix?7W$wWjTDPu#TbSmDZnd-WFO4g z$XdaMgPVvTPl84-(OnH{2!K^#SOb#5E{Mfauwt+|VB0_?EvUDKZX2W;2dl#{8X|{F z7|Bjhz{)Z(FmxjYEK(T?D$9}E0x&mVRRXsTyDY+1Xv)Q|4D2DW$6@_f^aVtqQVcXU zfWbVBjT3+x@Gz_4WdK+!+-A5i77;`kK|%nm6RGfk zcInVV1k~w7G?7w^it>w!AzC49Xn`y*j{v1)mF6TOFQbPQ0PtQ6$k&j& zVnBsD#0uS%)ZBcW4gkxdI0+&Ga|(QG0K!0!C5W~T)DlqI#cc^l7S$542-FgYHxU-V z(i*h;jg;>}OVvPwGoTU_xt2z@8JP_!Ws%Z0@sbF)=|a4Sn2!Ouw4f-pBo#EXgT#UQ z5GsYnL+VH*=jbAzl@0Pf*h59Bg{7&*C7|)vW_S$?+M}GAteaR|oLZs_P65#Cs-cMr zMIPZ(sO>1SD7wi~fMh<{Fi>eV1-nxbN+Ds6;u3@;HfInmiyEeot_-4<%})j$Vw{gL6(wkE6=<8uUP2BBXL|}<57v+0gE*CdgBKRl_|1SMa&U%1FN;9Kx}Zfp$vKHB zAPh1HvOv_|KXo$g}HYRA?4s39Kd16r|f(0=XEQrhmXICtH%R$XU z$XUXP#l>J<;2_6p9#{s+PzWDvGLm}G;Ae71X-O(*Knik@Kw?Qoa!z7N21qZQL`|H? z8D1AUw66=9bpz%94`4X@?9)CYB|ZBo-y-KxmMk!2$>dWc(0XJ!a;E z4%~(r4I1r+4Bsb~Wr9|jfGM!nOz^^12p>7@GK%u^GLth)z!Qhi!~@Cdh&!u5buMHb z4_H5VJQw6ZBs0NcFpE$)3Xq#YL3sr-Pn=kuoRe4%QVS)JoC8S>(0O54JVKlUtBv8O z7=Q{IP$B`fkw7M9g9)&?;1R^~Y=xrK^wbKF8c@SBIVZ6Sl+vp}UQL9PAS*$RgJk5? z+~k~8&~8{50g?ud6+>o!Qge0TL-BBh2q6WK7!ntx87u~xmK1r1?}H~#*QI7^g$+qodB^AY86-n3me%yh#F{f0;PKf z3VP5aLvl`PaR!(G8C49*$*IK|;6f7fG&NX67lRHu1i23~ww+p>0k)_Z$sC9P#7rm~ z7JkJUh)H=+wt#fT!8_HGbHEfx8)%0b5)Ew{79{3?3O2|Qj9|68d8s9!Lpsp3!h~T) zAn|o`^1;*7ki-kq2Mu*lhJvg=gqRLZ5y-9qdk1bVNCAukS?>WM!K*$%DMbQY+olzl z=O*WXNCkAN0+hx<2{}0jv_LWg)cJ-IApMYAku#ICi$I6fWfv)+Q_!FR&5MHXJ%-$V ztXou&46pw|BM2a$LDsuv=IWMbrlhBq6es5(*dTM^5~v(#%t31~c(WX(|DKnb25Q3P zCWFjW$Sck-Dp4p%Ey^iMh3(!?Ni0d#1sya2igd_Kd1h{6GT0G`$sk{YxnQe7e6X$H zM4OzEn3<;lF&dO`A=BiU5CKr0%gjZP(BJ?~0)wW#K@-&wg`mn6vaK>RHyIp>Ag4k# zg85*pAyN<~BB6p}0uqy%xuDAhK_pmBK4`l=m{*XP1IiPSx&kBuHWOqATn$(RstuV9 zNiq-;o^Ue32`4izIU_j-M1u6?C4+J(mOts3E7F0Sx^9Kr+_Jt z6F^)zjpPpS+#aZHtqU2OhK~-y%L(|XCTN-{GatMJIXMUGSYK7KF(~{&BTXRp7Niz| zvk8<9vmPvlm7@S!;E)bF3KYFZ04g^?9r$F(0biLVsUQPjBq*RHz=Nrv?UCU10x$v+ z&N;a`dZ31Mawd3>1o##bg=COuQcfbM?8?p21Gkkk(=t=R>*v7&rNt$wpz~HBN>dU` zKx^uAbM#VDlQTg(6v21RKqSGtw;;@nEU1Y&iJ+wc5W&3EM9@Wby2Yu9Mc`5(H%Bio zKM&L@&jr<0pn?n}RGJHFFF^DZBtz{h2H)V9o1+KrjTV<=g3DVFAAGV%ZjK&k^EE^h zsE7ugTngGf3icr=kz|%sf+n9Jl@XS(04aoM#~w-;qKIJ4$O0b}2gwP!IeMS~MHmO- zK@0}75ZXXoJ;=E~6$k}-8Tq-0FaxV8N=?iG#XRVIH;}nt3t&1y0tnp*7EE3t4YaH= zCo>7t1gK3oO@PY7O#oH#kjx16q#np+IJJW$;d((uo-epi0w*g_aR^Rl2;Eo`A6ykA zgM-xSCFh_fNqAB#F3SZK*N}EC*bO4w^flombGB0LWeikO9cK9LYV%!VuF?%L9aeLAJoRD}w?Iv^fuCl3q$asO1DL zq`*9=N%_gp0v)vH2E5k@=z+@}s1g_#ViZ^g9x#v|Xl{-k z$W0*i7-b1^!GYS7293AW!;)_XXd@uZ;c&x145V5G5d@$-3~>)~X^38q!D1n;w4}5s z6;urrW$;idNKOPf2+}kG z)tsQk^e_Vu^=p1EQgVT7MoO-zIRjL%gQhCMwioB;!fXfeAr3$`8YT;oL71MOi`MW1 z73J`{8eut-sU?XenaJ$`1RoKe2#tE6+k8N!Eo5yY$op^&U^#3igC!tNMKcK;M4-@w z42gk^E6YVP0@f%2oqL9G4)*9(fM$7kF^Ll2#bxjyEyivEEKH$IE<~V~<$?-acmf7> z^bsb2co46FS#U=pdW;~=aPNUySIC;d=T^X4U2x5y)Cw^aHKP@yoQ48QGVszHsmw(( zKQlKKr3HtiN&(XF&o2O-77E${3XThit#H5RL9-*YrUp-{gK{(ImKcyVdeGt)#D-{v z3ZQZ@%X8=u0<@Nejg*#v+>#1e9tvH{3-78zd#0eo0-Ae=6^~$>VH|h?4E77Cbk}EK zU`Wd^%GQM>4v1<5Uja!DtOvZ97Q6-wbTt#Gvkw{*MAi(cS0Ezj%O^mNgUk=)l@{cH zmj6L$h2$Je259$fNn&Omq?Z8hqJwfru|jTYNn#RcBrqv6F9q&@@K_tDR|c8_OwP$q zN&@xDz!a!X2XWyvC?SD*G9ce4=j5k=Fh~;AJIja6e1QB28~B2E(4f%_iebpctNfH= zUC3R%AR}OGuu<4KNHGoT4}$k8Kw}nZq^K&h0OUl-_z!3#1w1$cBQVA@U_*|e6kG)E zCxE8jl5_I&z@0!41LQ0S4~+%NfwACLM}A&$W_n&CNHv%NR*23*@&jZbAL9&mc#8@$ zwvU=ELAHUe76c8>>!yHjt<5h6GeEXsWr41}$u9uSuR{7J`Ng_vnH8W0OflFL7zbhi zb{?qOh7>bMx?y31Fb~xTuslH_=o)HJYZ0=?2$o<#j)S-zYz8J1ln_DP9mteC1Q7gV=E6Fgak8LEZrA zgIW$AYJ@F-0%d7`NZKh)&Hx?loe!o#W@0jmp+NvG&`?YQ6>G4~DhkD*bu6i7CZIYB zbkuBe4#ZgaZdI57+#a|L9uZ_KK;s;cITi5kgW^KaqFn@83OyhWl8cH9b958)Q<9Ql zD^=kFkoBezNl*fSY~lw=gGS_#m4o=tM~Ff-q6rNXCGY3uI^>WDKZ9 zRgCNsumDs!5?i6D1fEPF11liiAZHB2P}-j z#;Bt}O_Qlbc=KHOLUX-Q;U*8 zZ3~11ibGLU;gNwCt;j(FUC;sAeF1hEFehibbK7E*$gg02fF1>Y5bM(P^r8pB4) zOLGf!p;PFfd)h&*3`lbqBmq;GoC7xjT`x?DLLzvk5B#0F2`hlb zk)45T8mQKSRF@#rKuH0t9I6S#$6$gw9H8EHat`QrBnSyol$QxQ-w-5*=mCIuMi3>S z-SuEDRIL%XF9Qlu$mM;dB~{5er6r(4HxVRKGZ&nelJZm1Q+3mG5>pgl%rxlo50Id4 zQcix7LV8YGIfMmkh~*|`=IKJtEd^N!X>ydOCMD;Tr-F7>BS?@fprRJisDqiDQvr4el029XI;BM+EiVGe z&BVC`tQ5tepnL(!N)@TONuaZ4D|8_&1yl+ex)q>e5L7gQ_UR|(Cl;lE?1gg_u(6VJ zDnLaDC_3TNV0RGI3RZ{U#Lmoj7Qr0kQyz2KyXKUj#a~idrkeO6cL_K&vl`Kvgh!b|OC~2dZB;tvIy=huL5`WXmuF6hOK`rb2Ql z!cE6veEoN@u~L}upaL9Td9OH2lp?W8CNm8mpU5B4Qy($B~6R6$XG z2`G4r72vZ&p!wNzqz3_b;WTI|FA2d$YB+%HAWsuGL`ZZVsI_|$dq_Y#e%e?}gi7fa zf_Fz$rOBj?}L9G$+KpdoH2s-{7&I0ShXrH2t3c~JXMrxKIhJzqWD`9m$ zxP=LtCYlOK__+|1LG^w~QDzdzM-UMtYhjWEgwkQtn{cN?4xum0tU}hAnU|bXnv#kv z1nHN97B7NV8G(xun8Qj^D?rYL)a9T_BTz$K7it%F=RzfsZNL;ls|-OaY`|j-n2yI` z3Fv%%G_QeOk17Uj*ycbQ&{%u|4G!#XN6HrMGUMqy~33~Wqw+vksvaOhM zInbsh!YoiO2alg3ECw~A5DJhD1j*pxBTFUc=Yf(YbOI98K?iq*k!`8KWeKQL2v0O6 z;65UZ3u+-kx{)vuP&JlYfG`TeM|KK$2oqBPe*FOGBE7_-?9u`xHAqbG<-{eR@qk2d zQYlsd8whIpfv4ILUIL4Q3n+rl0jol`1fds06dH!0mOOX_8e$=+i3qg@#DwX>U?Vpz z;YAL_h?M+fh+jaV3SQ+85eJz8b|4P(!E(qJVhBK;3>pCekErD6CW2=*paz16?;#?f zu`mo4sC30RdIOZ%w;{?uuo+pU1(hYB9t}7(APd2qM^Fqod_ebKLKY5SHcjEzxFeO< z@G(kgm8p<9A|pyDX?6)12>cS&Ih z=rn)C5g+(m1X|)(2)%*?oD#vo0ltz%0V)n29>+);3WX&gAAxq16qbM!Ba)B6e2{){ z>4hG)u$U_>0nJ6C1rsRCffj^-3@t6mFUm~JK`|IA1~weV2B+P^5>S=`uYAnUEhq)w z00>?t3JPizJ}8|M5CEA7YDR&NuF20!25sMm?bHBGpd@1vQy^XtWIR^o;Drv@WpWa8 zlTs3Ob25udK)q@3Ir3Os0XBhXmw;7cw-40tM4q4lCj-#>t_E;{fEgybDXGOJMWx9l zrJ%hV#5(~+8+Ny#D#0CkNMWSFz`y`L^b1=UA*mzYok*InyAoLeZa0F$6*SxqKERED zhg8`-p*oAsScA7w4B2C8vT$-1CWdEs`ee4n)O9~Q-X`t)T zKnl_z1jvV=nmH{o1yqNF7PWv>fL#S*KvaQPU?DIU)F8S6H7+x~v?vjDYP(*30f;IF zDa8;3Ya><^x!^8J&d4lD1!eA3z2elOvdrXE&>#ZnR)r#P(ExILMt**FG30Pw1<-Y6 z;Ngy({B)D#9EIHcqEt`^DJ2u^I<&^P0%-mle5s2b_{e|V%#zgHVhmAG*$bKx1)X_> z)qlF6Zf0(N0ai)uo`-26Ad4Ir;CdO+CcthPEC4`d=2Bdd1hX6*r`XNGDhktw-_c-G zky{j4&BAX6v|S00PtamL@U$L3#*>KS&igoM_-;u(_0k zKge0gV1fq@mY=@nb*17}P0;*nIJq3g#JFBnRZ;|PC|jZYTr4M<@Qsg|($6_2xW z^9vC95K{hwhBaT|&57uK0mmL4!wzg8a%utX7{*=aQS36bd=2XK+{YO}(6$h$D+D@S zIx{bo6#FrC2`gHK-8%>>=c2)bVvz5c`M7FgdkGcOZY z%)^aE_86Yr506vGst>))yi8EHW*rd@2ZtY4cM^6SR&7Y$1DlQP1*{qf+k+)eCKK{n zMQ#omwt=?%VATfm6-WVcE+itKRe-kA=0k3#Bq~-aa&y2Tht(nYLkr|QtlE&=4>p^^ zSOM9C7Av5x6!-vXY^4s^POJ{Y?jP);U{eUY9L-^%H4mU!)8zcT%+g#42{J#kG#5re zvKG7(0n!0p1qj-8RgnxPK}w4=K|}L-APOlBB2r@#RS6q^qSCW>W zlL9ge#s-^+or7dL*lDm)I`C*NXtcAq0Ce#IWVjBrW)U*ohp-1c5s%X{uq=x85D~Cl zD7qj)30lbkT6F-L)JUx;0c9-EcF-J<5oipE5%7>y$SH>&KMx8G&;VyjWnN-#X0mR1 zW*#UsAli`y6;L=}^WcVn=20NaZVD=OQ!PJSX{zh!C#=vs^txB~F(DQGAcyulM}G1#3bmV-s0?t!quEv_=q88hGj z10SXdIsh*@8|ffjs2PxC0-6v`gL@HlB^*>5LV*NeHh|VvgO&g)fCydmb%1cel+?7$ zJn$F=c&rt)h*}qRtS#6h3ZSExK&zENbKc4MWuUo`GSF#+Af^IX06ZW9@;<2V4;BFz zBgJ4QR0)_35r&F@(g(=ge2{+%bCPqCL4*P_iIhn(rb{3Jf_4uFdp<3mBLvxMFdHn2QW}EPLX#Vs)u1JDAn$-j4T}=0GV+V$ki_@KOPDA_{bxR&hxY=R+c z;#BBTP>?D(2doDd4>=E&X6B^i<%1Skpx!+U-75xaa=?-u%KBCCMQ5P#Xz-B&$nMYu zos6543f_2w$4$t}P+f~ElLKD;YzmqRF9ww{$X08pNdaDaOA65KLl*&G z8wWB6v}w zD2FS6-BJb(jO1b%O93krqyu~`a4CFe0i30fjFkzp2s(U?k~u)d7$~%pON(+U!Gr=5 z39<+@&;=F(w`#yFWF=rxr~ss#2CY6R0r{u2sHhU$Udb;`1|> zy)O!23N-HlUX=jqB7t%h_+~;d0d@vxf*-V=9yGp@p9dbgg_j!0v-zMx0=%@kA~y$g z?J3v<5CP&q(rpUjEE&kAc0y)?>S=Hd05UThwA#KHWFo{g2p@$_l7m50IiNXmkcr^J z9mIeb2hJHFE?6AgWB^xr#D)WS{XD4O2D+dYB~0}}VL)tx!K?Z|&Sb|&(D%YVj#9(l_4HH4n*I?r-K%3G)wI!$%1QG!i>hLH5aWG8+OCyAf zN)*7RfVvW(frOOA)ZF|$2&sTd!P-EuS{}5RA9U_hN@7t-v0hGQl3r?VVrGtRVoFL; zYH=}G7<5i_VrC9hNC7N{sT7wuXu)m{0|NsNZQy(bmLtv@uzFl};gy7*2@dixsPPWA z6YLGpIqsl2OR#RRaB>bz49O;#5Lg*bad4^x8-iqZW-5~U@+6RDP}hKJZ_uI4m^#2B zcpQRaCd6%-so(+%R6T%>>IItsb_K*rFdwUl5P3{Df;A@K2(U?B{JNQOfdgSXK@&p^pcO-B%`DCX#8` zxL~v3yAWah5qL6;Pe3JVKW%40!bn#Gpz*FtORWq z1#1Mi&JZk!Qm`O06V-X}0}8NqVL(|Kw3HrUs4n>Y0|Xz*WQY`|09Xg~`~}#_9H1R{ z;FYIH%3;eUK}il&og*v(`y9bV)`JiQD?*k64@!bJ@q>oaKg{=I%#FC7}JcaDkq{JlT9i`C0IM6bm z+(ZTN7znKH1&_Oddhnn|GSrpez=N`3E(VLCa=;FTDMLR88f*)wIRaW=2~w0>TAT`_ z!RCMj5DfHyfFAJ#z8VCSg+b$D;FIl>6LXT`43Pd*U62qG3*;_Pjsi6);VQwc6gUq_ zHCzm=0!aeW>r#N_dyt9HJX)Fy>VARuccvtkAn`!D@o+&71EoIDDsEJb;Lt@C!fzH> z1DX<0_6L`ANh!MdMTyBdsVQ)l0(K_IMbI<(K!Y%#gL^<;D@ZH>B{WdpLp2a=Emotz zGDx;S_+ayq)PqVXP|r>slrxe_i&K(Hixm(ASUHFQSI3}g9dT7R=;*fc%$%gsq7=}2 zvXV4C2u}f(0_ld0QGyn`&@0x}6wg1ICdsbEXXFUr+T1K*sj09{22;eiS#aH}*GboDN1V5uY}1&OVIn}b}a zK(|$Z24%oa4kQ!6X%(j_U|AGPFhwAnmmws03p1$r2X!`5QqxlNN^_wU$P^G4PJ==P zR7ir(#Q>=(DoO?UEfqwA6`?Xf$}z5s0j)X*b;rTe5UJq1pFoF7Cg!E27GV3n``KB$lM6q^5x=kdY`f$RLnX(ELD3YFch8 zsF?w#KuSSeIE|F*VYNK;bXQPT0!=bQ4FIQOC>yRD$_LBA1mP7yY8t3l1uB?93w2Xa zxggcZ(inUshk?8U8X3II@-IVCl%xFivjxAo> z0ov>UQdL=8k_xV^3ld8*lQMHMODb^)gH6Gr9H%(w9N7|(iJ7U8<0e7*Jr9z;A=MVN zDuvn$4p9;<2kXJ*0=$w6psE(sA^;76r=+HpB^G5S=9M5=AXA}&NK8;+1Rk|X&B-rH z1(hKXS|J50fM6i@!GZ>iK&$m&YQPSIaS$3{B4BBRFr=LYDr*wJftOQ~sGE|SRGOZW z3TJ{;!-P@TXbA-GNH+S&HK;1+LA6pJY$uq2xBKcSKNMhjmS=hBspk{v*IFaO6R3=rHr0S+uWfr8QBJ&i8l1;`_yxdl`s!C3}X2+1Uni@+*~5CfMBpn3q+QOhKr| z;tg1-sF0pol3!2)%4eYFCqhqVKG?a)0!U7W$`TL(djw=Oq=fLU=>7&fx`!633x;Z zo?hX*W)QA}3n7~dk3;HkJpvtsfkiRcy;#JtSq4^1k_6b7poRo^NG`P?C%-ZU zOe&yKp!No&ql=|s3NLYC6A_@w2vVAW3np%*P3d#teb&bg8fL(?x zfMN?+mVgL~G-wl7W@1ie6?o4Ws#IBGPG$;398!6JI=rBT0La#(8h|W=Y8Yhc2v&Pg zrIK^Ny&V+Yp!x;0gbdkuJ%sa+g;De&slh1@yYUs-5RiS4ZZFbSR&cjN7t|(2*@ub{ z23djF`AUR1D1Cw2m!NevILw4L3$QwaRQteY;nD@8WLK^6*JJ7A05LRYB z>X9t4{0z_F$SVWjg5Z7rurVW0P6e$$gZc)XOQ39+55Z!n98mN?XOEIWC%r*k47$4= z+z5l209q@c3%iCLbdw-xFbs6`I;d3$!jR@6m<69MfOq1M);@unh2SDDGc65tw?%RW z=seNn43JJ_KG;0`0&shvgZ`jVGjIr?84X^MLb~~2ZJ-Hp_~ZhH8IT?TC@4T9RVkT8 zB_OPTAd*uHz=@(bKQjm3r^zfX$S+Pz%1KRuvlOs0LFpBocQT8MQk;(bFphJAFnS>a%6*BMMfsp3o1sT>q~zz7 zmVoau2e%aSbxVtKAgA`FAh8v2bI|Po7i1uRYyhQ{{N$vf{PN<|q7*m_bh0T_5SfY9 z9BgBvkXj9CY!rSLA<7yvr9oP*U=f z!4r}o4?q|oM`N&%U5}FJ!EIew83mqB0yUs*Az=eC1{|Ysdl1Hh#nHKtLxl=hI$5|eg}9U4Xgot{3?oG zun5#R2pen|R1N5GR?re2&X{MHGk=LeBWbDQO@df}00L ziP^b{&}mv!3hbz4LhU+8YYw$U11*MtwZuSy0iJLLTLjMUDAs^QpbO$4Y_PphHIOz1 zs5J*pVh}SDi!1YzAqsTCY?yW|93*ci=Rj0LZ#e@sX22SBL2Xrtagg>WN=p>QXP_bx z+|DaX1no7-D+Vw3PC?;;9D^i@#s#%vKy#oe#re89sTEL40iA{?OOOPp%-~>PU;wQ( zhVfxESSLsUf&tSDYKehoXiL*7Q%ch+6%YhcsDMKorUg`)fbug)r9Nm<62w600}CMy zMS@0*!F5k*TBSbho=7w;FkvKZ5Cfs@RPZWr@H+9-BHiMY9K_kPpy>+m!~(?hlA=WL zO|}^3!z7Sw09EVqpsEX`HKRDEvg01{B($eFR|LpavO;0SO!s3(|W-iYid6sJING0Fp5f z&CSf>0<3`uZBc;N!GY3H1~^pmbMn(mQ&UPIv;rmr$yUT(os6RVyv*dxl1h*d67z~P zb-_(u$Z#7-tSB`x1#|!?XzNy4W@-^A?PupEf|`<`6A4qwQ&UU8gaR@NZistz+^=Rx&@5;Ay%zcMcov|$gtYY##oyA#wqO-8J<1r1;4l_XZ+xnVsg zwIUO?1Wy6J?hJCU98v=wd>RB=lO44B1{8nb@ukYVL~zjscN~}pb|HiX&SYR&BxBLn z+JMqKXd4zt9cb4g_>St-Vl*z;R3vE(KE{L=Xl5BaR}S3`2{jk&G6IH!)u7veRS-Oa z2l4@E?1%wCJh@Fd>HekIqP__jv zXi7~?Pc4F02gqy%+#K|Q4^S5g)S^Y!0q!d!3*a^ntQ1umlCwbt5~z`hY>W{K2St|= z8V?kNn0*ph8wWa%3~FV7CMiHgj~#Y$d2B*pD^WG3<`;w78K6QuHL*A|FC9WE zpi*e@1Zyxr6oEUt5GGU`SOkR)wHaiALUDF#Npc3786Xd!ngJ4lnE_@an*oUdP#pp) zwNev{D|Hh~Q!?`rERa^HATkqd2ugzi)K>sanjo~oZzx0vAsGRe#VQ6iAE6I4dITCI zMTmg2W-)?~YzoMm#h3zUWI+;cgBax* z`Jnm;dcrai6Z3pp$R;E3W<7Xi49RBDfk{2Esh|=El-0m)gPygF%!W7`DuK#DcPOmg z1hoaUc^Fg(f!blnCW1>AWC0XY!LnFHz~PUg3z8W??yrVLKtWMH=-xfBGAJ8j6jlzB z`$64wQ22s_1jH!H0Zrj5KyRUfUVjT+-wL51!3Pb?99?M11@bUxr7N-%z+OTYKyedT zmVgK}?SuTf49TxqsmUcUb3tslDVQ8^@S#@`AdjZzf^PYO4rRgD1%qUYkyi+3=9LuX z7Z;=^m*}SEm4R9$pyjFXgasZ(1Fe669La#xmVhJ%(C`X8l@%1_gB+-rSXz<~+Ov<- z3vd-E9z%$NJ%y|r6#DSw2D1iKydWz=H4G$+MFhiWXcT~k2|?}Z)MTU7WFrL_hIZ0G z;gSrxfeo@?$IL{bShpfK2h_X;wVzUxAzOoCv;rmr={7s$hB??dhygp$@C)bwY?yw~ zDTWv)!onoswqR97Ko%*FK-_@kd{DR%ppv)=ls=*U#A+e9^FR%^fek_qBq9xklpCOC z3~1FSOcU5N7zgenI0Gz=)iQ{2pmYIlxFzSOCg&@_Fh=l!$LXLOdQlthphN;%8I_t0 zS-b!>0$g!|%!4q%kpPl{SPSa3XM;jKCrLLaKRp#fDWKD!0fxN1{1Wi_n4sAKg83a@ z5`0Y4XQXFrw$K~mv`HSBN@P!$Dg2!WPPqnZwOE~*fk{a_VDh(QYubh|+b zrV{MqwA7q51sKMXV4!sp=;{olUMOhBrl=A;?tt1PB4OTAcCYPk9W#+*B1-jWizqAC@AOfwwf-jg&ElUI?`qVs35e1@zKvQd=TM^)j!DGm% zOK|bYA#A~-5w9eudk;z;sd;6UAgq8OK=}~V_ylb|1c`!E1Bd}u1Lh&IK&nAiDyXv2 z1syvJmQ#QvSx`y$W`_<_cZz^Zg}G7C#HQ;^vZ#ZU=U4w3_su^p}g^#-T}1Fg70HWeHt5cgp<8dEJO z9fQYZK~*QRG_*bdMIShOfV{6;keUurQ;?btbu=mq$?f34PtF0Q+BDE%HktW(5G}CQ zI4FPXfvT3W)Vvbi)ZEOHlGLJ9WR3zp9>{!n7$EBc2Lc|QV0l!dAwnP%QNJJMmK~uEYy*Oeq!uiLhYyViP!S56IRTrIR9Xz9Av!_( z$KWDhe?U&tDFHWIKp_n-h(N)VR9Xy9uW;oU46ro9T&PJ3P#SC^s6huBs08axOMy}l zJ!vU$8Yww|x~{tEptU|ZknSp|#tMZ*e^F9SesXqZUOIFvITdstB&ra|NOWab#lW72 z^yW}cl>*h0pvi*NviuwnRzMI)&cxRDgsx(Nl$@X$*`mC}98eoIy(lqPp&${|5(Hgv zS)mK+a_8q2gE9@c%qYtTm9xbqaI0XE4HbvD0kTvOp2{jROLW0U2&ckX3Rsz-5Cjhq zRTSjsrRJ4nCV~dF(m?CN(1a9-6aytR&>>N&6`*yQNvSYe0h56gZfS`{psn_~ z`LOkhV1dHY#Ny1t()^NCaM0u?Du9JS1{ahRLpY$hw_?b8HIR5xQcfypTn^l5hdMzY zyqqGn1k(jD5ts^4aRyafl9`tdcQeRSwV=dSQKFj!>VZIM1<+}BAOQpeQB}e&qlO%~ z0$=iwnVXoNs*s(dTb5dsnO2G1;V4QiE=ep_fKYmAnK`Mt1*J(jnZ+5P1LQz`Y~7-Q zWKb^xTsnXz_ft~ArwHW~gA!IAoCk6bK zga8=~W`Vaq<)l_XIMAJ85DqAAL6(D-s)2OEl){aI2|$!5=jRrH3_=(UGC%>O8e|Hn zy#_WVBR>~p4M-fK5h{SnL6`zk3`)}=4IqO+^WR0Du_*!5iU(ecr+Q~(qs(P1WFO0aW9ZM5C+E%gn)YiT!n%{45kn)09Os> zfwe$bAbp?$4CL#y%;F4CBtR5HISMdQNMj!)2kP{IR_?%LAmNlzT#{T=0+L5)!KMN( zi`$su0z$?V7Z71gWey=@Dsu=MQ;<_cz?g!ZBErTL6ZBLuVNaD86AEIm3PP?aFHR=l z8n6l?j3E%j<;BT_gSfnyP!NMv5OxirATBRP4q{LX2h@2)O{2xB1r;Xv;v1|0?iNs6 z6_gdA#SK^^l&t`xL0Js5Py%%?KnsANsvvnNH!(9W4VxiI(lB#z8UV>WP;+6b5e5{% zgm4-Fscmo?Pz*BwRIY;h&^d|lQUk(NfKmvb!)h0B5e`xfsuI8)aJdcgGN|POTCf4p zs}I!yl7ShADgy~ps4@r#!(fn^pg@M|gvw(v6DosZ45)Vw>O(>`gB*%QCrB7Y8-xQA z232>U`2eT^pph>~&_V>D-U7!=F_fcF1RjL}E%VCF%mcX!Y$cSf0HeVH3zC7wAyfiv zmTpF6Qc(&>7Ooys8YYF+fSg>={sB;v1F8|G8e%?J8YTqF0U+n*r=-H23uP<7Xt;Ah zlT%2F^}#6s)JO-r7N#6ZBV<7}ENHhAOd_W^KP3^X7O)J+PoM>6D9XVr6L9MROM{XN zXnO>TMo8%o6@qz5A8b((s0;zsoKRV)DA+9ARuzHevH2+#r>0bFeo6%!gj)|-8l(}F z1(2PX36{aB5h4xqD#(wZQ=E|v$cFdc4YvW5vO&cjR592fh+m*0Ff9-n7!TDBb0j;=p-RjVO;A)j z%poRW(*lu!831Y*gZA5}B_@}Ex4*#|3fNdkV-R59LA&orQ~RJnncPHBG69uO-~ou_ z;xZTw8H4~Gm<$sEb*4dmIxrt}q6lz={Fff4iAqH{KxDX8pX$(Hd z`w&5}sh|xepphjsV|2mOoW*FO5Pb;4p{j5RBdkKw0*QGHEudAl;1d8r4gyW4pjiza zt3ngSFb0R|P+@EiQh>;TMmRDtLl<$FG$EVe9>8!DLI$h-prtS1;ieR@|BFH0JJ42I zGz-DwGiYKMR)LB*?1I>=hD9H0It3MUps^mXU7*pwf)YqNfU+UxW95J?0ZsoyHj?M1 zL)3y3nnGq?T53^devvMCGYV*A6*T(@wgs#J!9v!BBnmPelnFr7&In;dxPVPT(hHWs z!&gA{H>ivQo$`_f+qVm6pl_f6Z>2ylb3vhj*whJKa0Q<=LYRWSARA^osM>%O z>BS|wnfYK1nfVY~kZ2@t7MCQJWG3r^k3cU%T*!^QZyA(!AjLG;P_V<%Oa_a=tbuTn zGg6bYb6{f7xfM|8K$2l`3FzXJ;{4?7)Do~^<*7*!9z+XHE|S~9p#|2QnGYXH1)sqR zYNmm%l>tk_jRHFiRS3;8unMeVD0ZQlfe{<9SrM>XK&czFtq8OyqM%eaF%5iqOJ!PW zE@+V)XdFEmNf?60NvWA z0M!Vp?K6|%yp&Av>7I#2m2jbg#G=HUoYWkJoV3KET;0T!+{`>EJ2@vaHLnE90o{n0 zTBHCv)43RY%?Zf2p!uql)Wn?3Ox+Ub1?W(V70`q+_+Z~c6@wBpXeB3<3#DLAgwtRx z@YMoPRfK(*n^*!4f0zcik5N`dg9^CJ3Qz+JG))3io0M3bnGEH?+<|5zSP7(whFtMy zmZc`NCBOe0#gh1JCqAI8Y+yz z$72tYYoMlq%0_U~0k!Txr|+SQL-}x9;7)}~zzu+e9=3Tx^b7-;Fofxc1U>v(A&}>h zBd;J6d_^==HNqJXVGKUl^PtPjQeaY`WeuS7XEO8BGAm%lfH{!V0(Lj31OhFm2OWV~ zoSa#ZpOaavmtK@ukWmcNf<+2^=p~wRuyHWEA<+yf3P20~)6x>t(h?P57*tAtGCiWQ zg05gdU8n`p4T_w!w34*65(O9rc@#9J4(b&aK;=NR0+;~Ff|V8|C+6gU2D?D#a;Ie` z7ANOJNCi|1y-b3YiO4kzXaod29RxN8bW=_mxCAanH44H*l7?CZ3S-d3HhB6E(hmV2 zFqf1AT8Ngaiz=jmMHyBxB$va&58`-Gq=Oq1py@_b!@-NTiL?N$7MsmDC7`t@Xbdh9 z)SLy`54k%CY$b#VF%b(J9ChHdfo0>fLK^7Yd0p82BfJ`g34oe(pg|q5Mc@fv1Pfv# zSP+Q`D&0UQg`{QXfR>r0=)z8qF2)oAX+u+lO$bqfg4%PCaq7Gj@V!rInNWrTHWt|H zrI2<7sOoeMSzSuv;}2h~uZ0q?ZTqSS(n0w|?`PQ#83Lb^l) zRHJ}aEkTuntt^IeVEQ3~Xgru%Ftw=7UE~cZpeznMGE96j(?fG;9uzI4~Dk9YP8s3d*IRxn!_HuuH)#h$Msr zi$a|P5doz^&@P0uoWx|%T?~n!)6!8m3ix>FAr3lWASbmF6gHrf$G}=aVyQ()Oo)jP zVH7sHX-SDmsW}QsnI*c#xryLa9pFZHW{U^fw%$20Yx;ZB8J>} z3XxMNECH={P$(=(FU?dagxpn8SOQf7T8EWioC=B(aM_8x-xsw(ijN1j7gATDF3AFw z$)JTWD4N0L3yKKZ!f_NiuxeBVpi~FWIUv_2XMm>b;4Fwrupkl>R0e}H4qP2*j~v(@ zbfq8(B%L5GNVh9E>hlvz;8hk{1%{ss4k0Y*0Aw_1(H~ehXnkBker8??Di2as!X?qT zpvDNei~`lCa7Exy!)pv!1)5pd#1Jc!L6b7UuwX#g1iFT{C=uL~D@L^uwCx6TSQF?9 zhhlWAkhS5H12qjnt7p=3^27ia^yQG z34@NF0_y|^JD8;aCc%7UCfGDcNe>YQHKjonV_I%WT5gE~3?m9N4h9AWa2Cle0hw#8Pf=_6|=LR&TIP4@&Ra#CNC^|c_T;Bk80w^@W z3>>!L4s2{Ppfn9`7-0_sLLmq$j6khw?7G2$jL)rL1vvZxmIF;7#^MYKuoC^WoHB~+ z02zSK4WKdxwCFP}KPNLEOekQGdWpplLA|8>ic}ao8FFq!W_}(_1l}0}<#fJWb}CF$Zejs6c8qjEY&4|>iJ3)kdC<-#&^{zg0W@8p zgJWUIz(}_QY(;Tu3Fvm8%vA8Ybx_KNdk?~Zxd_?2;BbKV<-j3_2n2L(XpTSx7ATh^ zOb10G=m0v1c93zPIVMOFghd5h6rl}VSwY*R84;yA2^s{=Jo(&1SS$yO{84%dVlfat== zu>_aH>2OeD0F`0j-YF!2L7{=_U62UO1TY(92dE?iEvSPi)dh(|90n0URu2)!A_6i8 zSr{DOAm@PA)=EdZMVjz3U-jX|Voc#({1G+Y>FFhT&?SX6hz)Iux+)pyVW8ZL^nhh$$1cAtoGn^6)4Ms1|pEk z4M=SUF&&|=C=*e`K~&()DUf6g4O$2X?m2Kif`&DyCk>v&hN%JBgWdNC8B|w6RHL{C z>Ohd^Km|Y}A_0LaXH>6&L|_Jj+28;~>fu6^BQ;APWdX#&pf&_dH!j~oR6^YZN@t+V zj#S!#Y=w9NVin9hgg6!vuqz?zAuSG&XF)YFcw_@&B{)Gq)WA(hEe357Ly|`hI8fsk z$d6VSa@Y5932x+$5($)LVIyBmSG-{0_>N*fzkwcgbZ;j9P$NmxY)QX0(H2-Q&agxxryM* zb3p?&&~pz#hG7VTokpxEQne4eE)vwAfK)<7xjCsN#UM*SG}v5J27Iy{a!N34Pd(c7 z1n5Q*m?7Y#2;;y_1dF2aaF`9(i)0CCLkC_#aTu8Inh zbyHG{5w?I>AQ6bgnML_|pfiq8)TbAtt4}X3R!B}QN=hvPl^{h0$)L$Ia8I(RAUQoX z4`e9V!1UBSIGvmWI(in&RRA3!4jQflj{q0zmM4}ZXQURT!C4B}nMgsBjCN!S=n% zv{53hG&xx}JvA@22y_+$h^GJ|5JFhFkeLxs@&HZ4gEc^eKum}Z2p^dZvJ$+^5#^d* zSlb+WX)k^*QYgVP0DRdQA`ie06i|R}`^+uPOHVBVt!)JD_eQk=avw9Qm;x#nq6E7j z)D^{rpnDjK3v+a#cQ>P&0BS0LJF+M~2WJ~pg=m(balsnU#1Q$-2o%|%L!Hwqa&tgf z0YRXL8zk3(Cp4g2?29q(&xCHlhF!Ht6~k^e~19B3nQ^kAlvw1G}WCG%pq1Az(4+YEe)zhP>Vw z)RYF_9*;FWfm-*VJi6s!a#&_F2@+!q7I222Y$JAu{0 z34IhfWHT{h2Rau58Y}~AN3l-<97&*b2%bg++gefpRtG2ai%SZSZ2(Jv^?_3RELi#l zSGu570G0<4V0Rn31>77Y ze?e;j-Qt4O)Raoy!qU{zRE6}^yv$Su@LD?PQ7NFK?$T3>KzSFmpaEudYH~3W6K-Q_ zaxn@U-9E_iD^N2*4S7)I1~VwFC^0uxH#ad4bRaWULAco{N^yvSJqTG!20AYd)jyzY z3Oa!wx)MRR0CWZ(3P%AC50o`Q-Dngg;3hkY2&xfad4fXVVHi-?3)GfQPtHwG&Q*Y6 zNK!;^YN4Hx4r($aB^IZqr{<;PD1cZH0u&q|b3tR{Nu|Y5>C$2a(6KupNrm)s@XCgQ zjLhU>Pzw^&LIt%FGfSX`K{=r17de?FsgSO0I%ugc$Y9WZ%ar_Fh{2%x3WUK1L;FIN zi76?dE-$Dr2v!9qKxr-|2TH<}gN;Xak3vy?Qhtd-Nn&wHr2@zxPzC}y5Nrl`JrI}$ zF$c^?W`fKGl~ACXK0P%*7qr$B>M1x^0l@+(hlCoa&y|t}@-cWVUTO*WL>7pLKz;!o zD+LY#sO_M@Pyh=+LI)CMkXS(PFQ6P#4_RjmIwTR)Bm$j6k)B_a4mCBuC|v=>g_wyF zE}$wIeheC@4+d)YgEKHRiXm)Bo`y~^AR7RRInZoEdU+1ivho~IN`P1etwA8wJ17)D zhay9~SD6Spo4+a%yi6TbB!QL+Ae#&~P8aNiOi2 zuArL1NenCibsUm&LFo+?wBTt`T~LP?q6xuQKw^Sz1StYVCMaWoEQV?TIRV6l+5tXmDnLsRiW=umIFpB&UP75P&p+H%n&b!h#l5 zDi$d~NU$ZKok+PQ1)%5$mG_`-TS-x3UNQK{J7{u35>P;9gAGV8&jEQDw9F2)I3DV@ zqEygnpsBF(0?B2dKn0a^<(WmPy5;#rIiRX6B}W0lM`psTfTt&rU7(x-Di0ubfmq<; z0TK$R$rm{cK{kVvJ**cA@*bo=Sqv&TurQJ8GSGgL{JauapABRfXwVbfCCyCMO$KG9 z)FLnoVi*Q9F&(s$9Jzjn->?DpCg>E|BG6rApiGxsT3nK!tDBKnoS_Te^9I@}Rh9}V z<)FKaK)2r<>UI1II zfXpi{hLE7<< zn*tF!LDvR?cpyS&L~Pu zPt^rojH-~ESdx*QS)u^#i9pXg0L`31(oA+{2|S4)84eeN*oekeC{D>SLe>fLI;g{* zo|B)Hn4?>kSX7L}1f?sOFftodhJXu3gf4Ix;m`_}L)MQW0Lnz*vMndS0F;(NiVGkF zsK1Za27u>K=(r##ok6l-egW8MxDj9;*c=E85^tb108I@bm7qETG+&>dQ=FpJNYA>e`@WKv3gaxqvZ=+YsG86Y7f7Dx+(3z?n-ud)RVC&0DA8Bk>f zsmVwzkbaQkLBkdhm6f?k`8nveLJfy%geU=LWsqLb&NQ%I(EcuPYAw#ug|Z$9Uvx0&X z+`7rnNlDFvY~M*oVk_Y0prs>l{R#3PxN(zTl#-v94kkh4l_~joPzqGcfEt+Kkw7p3 z8IXjM=!Sw^3{KymGN!n)xFj`KA-S}us1kgXaDH(r_?V&8B3*Ewpcr)zK1LH4)HnhU z{1zov=A>4DW`98k5Tnybj(|58U`wPxYN6fJV$k3}l5x7ZCa|IlqzcJoBpHxDL3Sex zC4(m3i&9halVP%;Y8E_bQj?7WO#{<Z0SY$ zr3Jc4l`vWXlYtZj&~7NmNuZ@UFty+m1><0v0G37wgX&t)-3cW|pqx|&YGQ#8&xafz zkOOi`S!xc92hxX!i{v;^`cMGnEHD8(kslsw<(VZJkfj-rdE3+?&`3#2CTNphVh(so z3g{g5^x~Wx5LQ4C*zABCpO%)Xo0FN8mX--xn3bBDo~H}m2McaufW3*95MikY);xok zF3{Qll#=p6fl`vKTauWbo|*znW9b+o3d9M4Lk45?12h%{a(#M9Ho^^{9lVesg8PvLH1b)L&FUCecF$nl_+DL8% zi3~`#fcX$>AxyAWU=3)H4p7MlZmU#f7C-|k9l=z<#YXG&B<56s2G)x*%RpBRfU+#q ztYT0`0WHkUNX$tq$S|O3-mcpzZG9ot>a!9h6z2T6Gh1iW8x1m~mh+R1Vl+aAtz41@$06!z)m( zE@+<``07)r09-p<0*eTGnnAVz4L1oShRT7sGY701CId#mW{4;{7i<`|))cySP$GnDMu}BWY(Q1(mM0>PkAM}IAm@R) zdI&Yei3OQZ9^A_9aWsGkYfpqE;a2)ehS7%qY^3@(RF2y8rD6Ud*SV|L&I z;G!PRLoxs~JcP~#n+0+uO0^I3KBh0>4g+=CK|8I% zfH4%Xu|Qft*%ET4PGSmrpRWQmMxB_Ol#&Q4=%z3*Fl40Wf^GuR1FZvqvK62-SPYee zlsYh~7?y$XdT3WX)Q zAm@Qx0?tHGV@gUY(ak9-se~JZ%m$eR%7dU5Mn-B;ZfZ#;XcaSu_ z2CYT}bz?wd1sNH-iRHx*QUR4hEZKlAqlc}~RwyVf%7olN3yO4bV1kW-pAUuc+ z%mR2*S)sHvGX)e3puvue4BevClq8VrkeDDnFkxgisNx3oGm(@+EI|@LR*%evC`1-P zG;2Wt15U;npo1kdz$8dzd1?}j!j@1$5n^V7$SKf^P@y4*v}9ia9*RiIwQ};)O+m*L z!TP=M0vvw25ICe1z{5?T)CU?{$jC9*g&d-YU@2f{LXWNj=>)AK0x1Fy1Qa1yV4V;_ zBqk^{Kr=)c`9*oDMG#T}l|stF;A93q!A=)6P6l5*3bGf}jnBw0DozDYn;=*q)1ZRL zOt4W%BLSeXEvQ4Fs=?Fu#e@uksDhnWgisCY1*`y-R{5pHsTm+b0hvVhR9<31Mt)Hu zq=kYl?jdEPE_iJkyv#yvi6c@xqz+UlhOFe#Ey>SL%|kC#G5S)__yffTXxb#BxF9tr z2SO^KQs5c`rXSk%0#!uduq%PKdUO-B5-T!LcnSo#rJ#Ep^GfpbOW@hHBsWJlH7_|o zB^6W$K$!|S*r0|SXebdXT>?G?7li}U36VnM!GaZ3v4N%pQFKDGGl~$Jb`&{?a(I$} zcmrZ9$d%v#1_{FM4+Cq4aUcd`=YgtL(AB%3BY<_2@>43|3BqK2ovH<`d*+_j{P>ffAQg=y70oWyAKZA?{^AOGf zi=%VF4nscd2JSr6M2#>HedP?i`~sg`3vvx4{go8xrl*!bhAY6j;XH^NaB{&;f)u8p z!UQy$3)T-Vun;VWDPTclCTbvq=Ka7m2PkmBYQdp^)fBJ{l2H&o#5~Z2x(H41ny^$a zr93lN59DIlp?V-T{6J|;4p;=V8WOYw2($qQS)U$CzXMqY#Y9wP_@uzLVKt|qD782> z4|I@oejX?%fKFJ3DNM>KO|3%V!0iA_q4AK)PjHC@B4Fc5FjGJd0p;g8po9tyHLzLw zX^DBsl`v&sAvEJrKefgM?}rDi5v^%_b-pDTLsw;gEJn!OTMO4MeLhs4{`KcXLxq z5|a}1(sh$E^HM;I3cw{0G&ms|P}2s?WQZJ^D^ZmaCyB+0aE-`G3KZAio(GEKz`j9s z6Icjt1jL<$#X!ygEynCcN=`_6QGG_Fg{YdaISGdfkYlhZhl?Qx3}|`Q22@uUl$NBX z=z>!ul2egH;Rb>3YCAhx zhRdQ`iQcLO`4DCmB&oxApio3&!!sL172E<$1K?69c4KP8=aiJxoXq5WBdvIsPO1v)JZ$wEl#LlQu-23+{#5y7wztO2zAvj`>cr=ezO9M+*KLbeu% z47&BG1uk-C2dzM?Lvs>n5lC@CVsa`j=fD-9I0Ye!F)jl$2;E(9{ovvf-g!{>yKJ$Dl0V0dtl62eGo;rg+=1KE?9O40p-2r^8yDDi=8ET~}tTIho0 zC?s>hlMI;fTj~b8}zZ-j#_|WRf63Ss2WL9gWJL2@&#@daybdA ztdJY}DA54cMvB|f8cRqy9c&cb1t=~>E3{Bt0M~(8ltC&o&>#uu@+^caLG>Og4{iuX zy$VtbX~_{REZ|8J&AE^^FsL`T03|!BML-nAL1;Mv=2f^6xMC8NXSX6b6EYwIb035UHv~JE=$06+Yzt~wAsTit zyHUy>xK`xE3QBxPyInv%opcPZXlLfJ>=)2(+7F8V)a`MldWs2>KOO8{Af8eK?e$1P+RN zl&D3nEJ3~68MxdJ(nY+pL8`I47DWc9BjI{+B`>%FP;7w440{t!CUk7;Y(UM2 zULKfd)w-sC& z;jY$G9Eh!8RiF_xcJ6-6OlITYukaKPrm!wX>u(jo;=&7FhcN{ILI zBs^#UA&dma3`85z84p}gK}`ZxN1z*qQS5}ufrAr80;|1XWq4#zf(C^H2`8xQQ7i(R z2|9rUyc7sJO9fGmNC+r8&>VnJgm8n@IsgfIxVyvBkmCLV8;{ZIIvQ< zMPO_7&yk^uz638EIw08ki#rtp?x#3x7wpQAwXSPUcN3?eI6a9id_)2yBTz0Gu+Ye-Z(}h3nd+ZnpGGo(3(q_jZU~5 zKwg7$%2Shc!H3rs=_M8vd z&>pp7$O(Z&2M#@5DrV^r$BsDl43O5B}s5%1!!%Q4m3Z54b2@~cb;@ytW z3%40rGZs7G>InM*VK}IDyAR19NKI~-n~{XzRuB?{bmPDzd}S}pJQU|)_O=LgsfZm5 z09{6tg56_!$;HJm#}M!cNGUc?qllw;2+2Uu?A|0CPC#iy66+WgO<0|UT?L8*ky8;? zGeFfAsC|#zfI;$=UKY`Tmxbu;q8b1yCLmpUnAcI9h@=?qLevr;yZ{Ik#mFm)k+kU* zq`>D)k%ZxQoQIND zk;N-=bKu1YvN%$-K?*y#Dp0Kr?w*47^Ax8-kHi8W9RZ3AT=@-YFagOPxMz^WK;sSs z#c_EaG&T%6mL5xZgUrp2Ss=SXN5!ngkwkDu11XNhqE-(n zBGJMa9;3+ONXl{g1xXFE){0#4(Nf!yya;aF!(0XCz(Wcf4{Rg2!hkCS3&BjlIeH9N zj^28tU@Q%N^abo-PII2#KX)4i=*jBsKPA)b_-}b7If@U8)*|M%xth4 z7zb<-`dABC5NXH*>}eDoI9&i%N;|$@ z6~q9rrwLmQR)*CD5E-yDV8)<52NlnW{bjLw? z58TlPtyu$~2>>0lh7>|@hk!SYB~c019F!JB8qGYWO4)M1Bg7_KnNF8Iq?e6-3PG_kA8G1aCCthc*u+5 zpzZ?8;deS%305=Vf+$Xem<(C*1RBHzou`Lt1Gwfx6@nWD)r~3()&N(6#WoDzA$76g zMj?s8&B9u2U=>8M6;cqPujfM6hguL2?FLkBSe=PO35xr$7cocy0B#zCx^&3v^-PSlUAxCUMRvUqvnu$f}@S$O3 zPr?l)D2UxmxPDZBA-M&v0^)4YKwt(gXP4$>f{%596{y&ZA?#47DR7H%It|o1MBbBF zT9gTkZ_q(gxY%IxAayjTM+`pl9;Oy72jhS%U+`QoXl*+3`3R*&nc(yXS6P$^cP>m0 zQvk(q6b`|JgyNr)%pB0EA;_r*$9dxV_U z;VO`$6x5tTUd0cxAF@mgW;{p)t`)?ANaGViaVkg)WC9vg&7ubaYT1I*PE=(mcH@vj zaRc_!3EW~p4k1WI2Wl~2MOwQF@&Ib;L5>!+nrIVH zP{5;b(9$JhVi(I&2uKqHb{5ZKqyiFTtbSr?Nk)EAW)*n#1kOZ>VmqoHxDweGZOPsax(MaM<;-!;QqkiplO0DM6s4|SqCx~H2DlV8yn_wkQkcrkerXK z0B#{jH3|o-R=5f>+y`m7f?SEbYz1Vmep+T;W=Se&PjCt77TM&C%shC<9i#wmEd~dx zR=9F>SL%^d41nwewYQNMe}KgFLC1$77EObM;1*+Wpo$UG;J7Ce(MmP4-3%(=k^2ZB zH|b{@TEGut014o6F-R%My*Y*kh=Zk2LKI{GC?|k!G)7KT`k<3d6G2D(7Zebm6HqlN zVALQm8!(&zY6c;XFoB$#+fdW!x1k;6K4QS}#J$eyZP?VoinhZLf z9;T0gZ3qn{l{|!t0Q52yyb2gg^@QO*@+uTi>bi*@8pZjE#D+RZDfE_h)RqIHfk0yQ zPgX`j3pHGIHz?3RWdKI`TAW{6ggE8_qzq3=gD8e8KuKYE+Ap}<1>pJ}G#$1aBPL1` z^HLIvQgjQ7@{>~$tDgwD5KS9Sw~`gu_#0Fpr-Ax$$dj-jF@4bSl=(%8MU~*I#NZuH zkR0577#wt6aFr;b4$=lq|KJ`KXuJb-tpjpq)-TB@N=-~5+FpoiBFiuAyF)?F0yTE} z(WA9IzbHGk2z1hSDX|$1Sqt%wBCP=jaxZAy@;H)vAx$<|Ktg!%NWjiT8n?uDh#INWgnh>Ubi0FmQG7<=t>| z5Q?w~ft?7hMj%xRo^B|3&Mil~xEL`Q0oDz(80Xm#Bv8WQ#pa-oHLEbHdh$+PmZfOaOVCg?PHM1uz#NOmZyb^^{uQ;gzn6b{%e z1PlW$@?T8Qdnm(Ah_E4GHdq%?YEYbw!a-O@C}P1yAp--$WbD2{S%5}d1fgib<_}Z_ zDDFn#V6PGoX&mHqP^aY_cBg}+iE}YXB{qkG#lcR(H%f!EjNz!D?)9s&qQ0YwUphZOH%w_uEpBxjW7r6+>i2)e%kG&Ge7Zv{aO z23>c6xUU0tRv_X|4wwk|lzUKn60!^d$%)|e;)|ii5q331xk6fIVsUals)rC+0Bk(y z`cIg-U^YxO77kKSz{d)pPD1e^XdZ3?xHN!SQG%=t7aMoTf*Xy9+@74H3kqtu8&JbM zH^mgzT!JSDL{LL-zyPf!ibQpyZc1tyE~g=hgOn+N#t?OjOA3$zs|1-14u421O`)P7 zu_OaDQs#|jAE*#VG8kDuG8Zjl3M{vz@W=dOHzyBISF>p9OxXfFi`xUSp!b3gsnnX0oDe;N(IeKg`E6! zljIywu>!uZ10WOkds-WTbx>0nwpoK3TlYtF)%QoXa+aoQAAJ;2g_pM%{yfkKab`+hA_yxW2-JuIrE5^PEi*MWRTq4tb}9idS-GW=)&}p4Dj3?79j;9#Xu3=`Cvi;nFKYOK_xh- zQ<9mRTMEwnpynfJY7338fUW>j04ey8n#z#$4r*|N4yDS>OHKpb_XeR9pj7- zScfJAwvQMwM0kS6+rb5EURr8VW`2=waYkxRP9_RZ0Y4Whp1|RqmROXk3z`lEGr)t3 z;IqMWQ!7e}5{nhU!k`h|V(97KAWwqR42rGbD8O$ssw`LoyaxyE(4i^;+2jh!1bJzh z6}l<;IXQ_%(3|8TH}s(hf&7iG469gjjxMCj3L3=(O*~;S44iGTh+{Jltd=ARg`yHr zp>G2B8|bP*h;1Mi)GTx+D7thD5|gtN(^GYeD~n4~b3xTVBx8Y^B%tyw56V!;#KKC> z(XC9(%>kt%&}C+DC14-Gc?hjwada-M;DVVC%G|+VpJbPV6C;>X$jn2f(bFBaY85)7 zgw($VccVe^)D5-)v|J!XH$62kwJ0-LH?1@eJPV(hhh1EObP04|9ZU>F8Uo}hjCnR)ponQ4_!N&%e)cR)Y{Xr8q!H3u>|0?MVJD`qqE z3QIGKGfVP|5G)1kOr$`8&u4<-22|C0fx`f1lrFdy$7%{h3dshj0LUP;n-mfHLH#0d zYZvZVh%RvGAe3R43YNzq3bqiT7h)i!g$*IW?QBp-9Fnf!eglm#AoL-d4wAv(gYAJd zk-?z?YKNpI<`yFvLZ(}Beep~0BZybAy}YV&S2ltmiUE}2ZTwU0W?-=&MW#ATLia@LY z1t6rjD@iR%OH57$n+0M(w4$+)oDWW}={fmHi8;DuiABYr5+5{@jJ?vtE()>(YYmIF z;svci1Z`}?ZWcI_uuI{v2CM_G9K7L!tsMaBY=JgkgI5%R2}lhBCBfkXDc>++8dU2* zd+4Bp-NDzcLbO3Hn+Kbwmzc21!BANdYSW2NbBpNPvebJimdQ40R7o44n%O z4vdHgn+#P7Rsj}3k95$i31|U4L=qDBU^Y}IL`gYLtL$ z63_q<=$L!3h2UmrF_;N80aTY4qp-pL09yykE+AW>O2Cp}{pg;ADuDV0(w5HAg^l>a z+ZQ0S^ufdG1v#k|V3Qy^AtXWyJVy!<#OGtM33@ne1r_8Gu;|v$NA@_xWc~bNYS@G7 zJJ6I3WYi1fS%^gtQXeiw4O>BN1kk)WI0*D1^Lkjk2$g^=vBF$R2##sU=px9uM29t= zvJ2!ea5ENUpnh>l5vUyqb|oYjAS6tJ8bJZd*Wm66#Ky|v82%(E$n^(CS#QoAj%2#s^FWR~i9@Ez!vX=3Q6;07?_apwKFSOa*`% zBE^}=90hzlaJd6Ys-R{mxNU~46Hzlzo6@{aKOBHSju;UTkC(vjBXq5=`xF0A5@6f^c zAYGsU1COnhq!uNXq(YnyQ-DT8Bw@yYbb<%(Av$%z(|}MN5DrWwRvuV6Oa(Io0|V%~ zOhbl8auNXQWSPW{xgSK;LmK4W>D`%(%2nVDc$^shzk}OCp zN=(iuElCAc^`OPXS*dy1nR&%}i3OQZrUH}(38Ao&ni?2fdGKV5+*yPU>p??6 z0W`5vkW*T$02;7Cj6xNIC*RS#vlY2HdZ6e7jZ=ZL0_Y;pto*#hl8nSW7>($J!bQN| zgS5AkbD(2Vu$cvr8zBS02o_XHT4HgDZe~8HH>#+xoYeHp{5+5~WvLJn+;s%a+kpnXv+|2mL0ADnfb@e36Eg+|hO7e6k({YT zi8%9RG0W5=LID~JQn2UU<4cKUec91)*z~<-Z7M7-# zrWR)vz*q{{nHZ%ONEv9>0o1Po6`YvHj9N+mhEC7HRY&~?mN;M|}F za!4^GGK;cc3Kb0s6kl+G|2*^LEY^# zGFXV5d%#2Bpn?|E+lLtdu^7gKn*tF==Yqot+8l>z0T~FITLJTnQi}`n^NLf8QF#z^ z;F9QEu(9BH$p`Hfgs&0-rC@h(sORT_#(f}0gPlf-`CtvO5p7hBpe_+4Ui0%{BZXiU z#gNt_#HH9cpauYFTnbq=*dmD6v1x%wqZkPlN(LqB%;fCkjMU_8v|(9f3t*KFNUW$J z8A^doEGkHb)1dGKC3n!+33$W@On{`z^PnV138sMhpxLU=zSrfmsj}!F&uRq+o@R;NlhJAW-0Dr{-1V zg9!y>66A7_HK6r0U~#aqU=~Cjn2*c^>41eSSRJVP1+AyZ&e1JPEy_%*gfkSdu|U)D zsZ0zE44`r%J2yL50gOQI1PzFQ7Y>05$QmLD35pR=;s;BBom32FLS!KVm~4fj5;g_~ z2GC-%99_`NB7{^xr9d76xdn9YJ!qB`G{*>|6)+hf<*xau= z5doVB(*dduLF-I%5)%tRSOGy`)EA)EJ*YYdjcFJgfmq}oXhsht3tr~~DkH%mfg%r*2AhDc1z`fnR8UBRP9Fg&*UimLNy$kq z2Tiqu)({pK=j5k@Bp~Kslf@$gG94lfsvwc}?|>FAf(9%=CZkwcT9ToglvtdZ43dFp zMYaR1uTv!Jnbkom|q!xz7TBrr^e%i@s%TMIhO0<=pL)bs+Gglt7} zaZwsb48shN1a?8NnIJv7MW6+1#U&7BpwI+$%R%GTU|FOv%FQp$D**{Yl%mVv5Jgx7 zPaB}U8K5gYL1rO)qd2t~v_1(WjA0m54yQQS8hE)0G6L0Ouo@g<0LYu5QV=wf308~b znc|Yf5*(=nA_Xx5LkC7<5UDW+>&rvd#e<>}RDJs}Fff2^heiR24KW-lfXab*F|#PS z6to5eR!zhGoKaFzpqrGRQmIf_T9gUuf0-i8hqP^wEr5u?Y=H8>Rv@_>WD+QxK*OIP z&AQNNfGkJWO-afGi9!s)kisPlwgi!jQj#(uDv?7Jk`feh6N`#75)l)M;1&9y?s5&x zYpAvsrKV&S<8l&M5@Hn=U66rpgtL-!bdfX=>o!p3XAg55sPl<%42TD@9n6A-LUMk7 zc4jJC%L%Lt6!;+XKouQG09+n}7!XrHX&8wGHV-!H0Lo#YC0`)bU~RhPMWC)Hw4n$R zMrcKq!zm870Mea=C1>OnoS>Q&w2rn!7i2mJD?peq3alSe`hrQ_GDC3fkq9YzAZ-)~ z32v!?77K(jFfc$&0V@U9O-M!~1fiB734pBwsYMb4bHSmHK1KzaNh?5Dh7{eXbrsYx z*yLeOz$yoK4J3H6x&f`V2O6RQZN9@|CA_i%c?g@ma0U1!k(!@i2O?5G*kBNWTt0(# zD?sW{JiY*hBxp_&)7kK<4rDGChr#9X%Ava%Y#4|DxB4LI2SS2V5vcTP!Wyxlx)G!g zi)|n&T*9z`f;6qb27n0UZ~|)w3!;?cSR);jQ$ZW-F@pjv|XSYUI&vgpAMY6^l@|3TL9>!yMGVJI90d_0iBAS1vX+r-?Yltk$IW2h$3 z88N9vFe9+?Ky$e%U|rw^_QjwPC`cy_$v9n$q|6dLW`gBWt$_%E90)G+bW`(^^HVbO z(u*-RDuBi`5FP;C>kF|7#DbcM&cx_mmzP4Ws|MwF(6C`nVqSVFXdN=>kkw*To&tU@ z*vVK{|AG=AsJWMvnFl)dCnvGE7=#s&_$X|!IUp6F1P1XRR0l{<0Zf3^AZm74+buIM z1=P`palt(kP^Sd6G6bX#yv#8vzXF*JHV`I($pH<2Kst`a#V}RiWQx-auq=u}5E1A= zEwVmP`w~ zC13(8l?1`lF^CMCe#8q{q`pvg4kT}p)b zNTCkzJ);*I zAzNRZk_MWy1@+)^Qp<8u%M@T3G(-uS3IJ^b%}Fgw%}GguQXnNDE}VvRH9;D{YfWHl z(qRQwdSX#hVmf%n7Bt!nG9|A#qa-ym4~Ypj3@VJw24w)yNP13MVo|PcVoGji9+;^B zCLsb?*pS6{uuaLJ(h}?sup!AgnW=dtVEs^?5D~1L{M_99JcS(4ymL-YY7VlAphFqJ zrhxjbx%nvWg4&NPjXdgvQDcFc6(yh@0jMh%pqr{eZ42;#CD{Gx#l>KAq3#9kdIs}# zK`hW^y~V{)DX1&p5dkW$prcWsv<5nQ6QVOG5xgnA2+V_OhKZqbQ!7eRi$Hs)3ySj7 zixP98^5Cd}vLP2AgF+p&X$Wj6^fF{H8$}g14%FR9z6UqSz`ido&OtGxI0t4zagIVV z|6JrGQR@auF!agA-R~azx=eos*00C6Hh z0Onu3B4AfxWNkb#0(TWOr7M)B7A55ur-IxCIu``VU9ivrrwEWMAOgtl!YM+&yPyt$ zm<&oeXbuHMDQM&is;;~kmdzpI2j|0_iAR8VM?(A7kkyAUli@)Lbqd1C&@hEJ$1>AO zax&9O6c7Z+YEVZ9Tv%nMmFS{G8C)HzFjzmD5Xc~~IHVoqjGq5^^dsR2oYR@3BU=B9$M0)jxQ&%wvcfeus!=V5sJ7rYt>UL0rUrotvQ z;fBBjz{bKk7-<=#9^^OBL^+5J_6>*u(FZ9_LFR*5NDjlOG+_OP%v|vK3%1~LAulzt z2;_QDwUP_knUjewq5#@EiK+;j5GcezMKWk%2c{0FtBEihtP+a_5OI(#pkf_7>zkRE znvz)pvMePNl(@iLuvQQsDJVd?!0jXj=m{bvsYSV&d1?8eTo3N8X6B`qXBMaGf=-nM z^+!O4q6mPEB_x7&_z$Rk`WYO``FWs1BqtL>D_}Cv9gC3+;B9e~i~=4|DTZZ8P#FcS zI}1yaK~0;&lJwF{g+j=ANf1i6G!wMdq9ijf9V!750q=bT9j*deb%sy~+MSu7SB#{v zD77F*p|GU5EFGTI6N}PIK|5WG6-tvb3rjOg@=J?h#VRNdf!aMenZ=19tNYU7y%+z89r0wcPdIq4f6Wl08SOiX1 zI4lOsA=?fS06PIm3n+I&QhjlOE+n3z42WKk5E2Wl9b5c@Mu$M@4%XlWxfZkv4{R04 z5PeAG!ud#s!o{F!uq?6$P1z-aE+I%owg6HJK;5ekE5f0CtQJ7jU|ImJr$CKA&?rrE zb`hkjUkq_uQD#YIvI0UBnF$IKPYz70D=2(+WJr2r?zLA~hLu zY6Vy~f(!8%9zI%j1eI&xt~IKuutJ-F=`dyJw!+21en2w>w9Ww1AT2J?MYt540wE!a z5X3MTR26_q1uR;j116{*ff!JlmstV|KhQG5w%op_vHw2p(g>^5|w`6+}BC0@SyLv?_AI#)HRp+2uVI58bijlS$Ah`{zFxaU% znK_{7fp`wAtSmnnd`k<|4j2~_otb$!`5@y!<7A*IX*9k1i8-)v!>JvM7IZ5?Wj<(y zJ6I`b_^7xbF*y~L2hjtUMCT&%AjqkpYdlf4gEyO@3ZWSRR)JLv-V`b>&_y@^wDbg2 zn1i+mgAE4d2si^`5J(8Y0u^@PHC&*m2T2*hl^Y>cp)e8Nf@DSHrH!Cf2#F=B3dNPV zN%=XtxutpOsYReT2Q6?$m<-Ma2rhPuz>1KhK=}d`-&MJVV69cTg$gi?SsQ^5#7;}g zL?2j!?Y9B7Y(eo`m0Jia#vr8<)JV7>$PNSt!=kF(LQswaHM2oRfeJ2U*Fii1lfkTW zpz&ChTL`K?K(kZH`N{c-8L2s-1Lrb}3zAARb5c@^6p(~b*r1%C02%-QhZIz`ZgENu z=(wK5qRiA{P!kbkFvwXj`JB{>)FLDS6wP2sEFxg5kTmHQrKYD=fMOTCY7OC7-MrKi zBy}i8<)wlex^RDiltPmcD8`UU&oC>lXG2_wmYl;TJL zphTQlT%1}0X$im_3K9m@%kbtqbgUQ@nXtAovRa4{NLHddM;D?3moUhWpfm_-10b0K zayV$Y47g5!+J|8T*qzuk;qfvkVS*-kz=O9)nF{Q0(9B_GD!8P=X(v<-rek0dFdu;@ zY0+!|*^cC33`0Qj*abnR;xCCnO9MbB2q2jc4#i~9T5{0&8+iSNP=#qf+yH2}=IACS z>gHw^LpB*EmShy`f^MnCZG=KqK@vy_sO1D+4v8Kta2w!t0g^B9I0&wsC^g_PL^2pH zctFVlR$D`(AFKjaNFeFNunwjMw*)rJK`j^18XP2(!8WF+RUiprmTLK)w*pz@g3EG~GWIQa$;OPfR4yz3~;}_(1xFpyKNJhb|0rl2E>-x~8!236l z1Tm}zE5IQNwhWtpv8xBiH|TN;Kj^3mauNsI1CK0%E`qDXVHGUtfMXq0EInhDbJHcpq6Eeo2tqK=lfGKLC^qK&F7AnUGB&HCSx{OMq-3E{%ZfgZT~= z0@#{5AT_XPCFCxcI;?JkOOoV1P>BLM*$v5Ra5R^JPH00C#IO>q0EZ~p1xT7fCSoW> zY8`^j0%f5TEL9O$lBjwaRV9XnXwujmsS8#E$}O;QZdj#Qo|%`DUyifI43$Q)6D9_> z2$XU_1N7j9GDyvx%EaVkq>w@}03?Sg05T4=G7S`7Af1Kak%ht{uu234QU*S?88qeu zUb2)~T#^sU?x4W}C<~+q3o|(fG&ZGB0bV@^8gBt@?#%(|FUSN<%ar67WP)Zti_sV$ zJ3%9P&^8@dRyQd%FF6CI8De2UW+FrwoeMGmE(Te-1tG!fx8Pk+u#vfmMcJUGw9pX+ zh-J_LAutDS5M)#c<^%{2zfB->AybCX6E{*)bMrxKT0sYQfTqI=6yQ9N6dDg|I8-kv zl0XJRA^}MdZUjgL!U!xpkb$5PE6~R2oXoP+;?jbG{Gt*hrUEWDNGoV84|KA4PEKMD zXxbWzk%t!H3nsy*S%SI@$vL1yA)qscpv6x)naQc31!~~6bD(igP?46ClL!vbVkCnh z0t(Pnl#`PPn$^<>Wo^)^n%tBm1<>*u2!Z4V*g6~7`Va8_G>|>u#d5hRNnmr~TERT9 zArKaHY!4(4@-Ha3a&mKWa&r`*7-SSU)8suc3PM+j5+w>6k^v2yfaZSli%ZgrQj4`AhJp^UK(N3|M==%P5(cFpWI3plKxTr% z0K5?z>>rQ_k}cSoFw@c!Q$Rymph01TLh$?uf{SDm5)-TliLU@T>l;)?fp$V*_q}dP zX%S@Z1MXC~5VGfx0*rWhn4e%5B_lZwZV0GS0i6ww@Eu$Vix4&wu!NUbTD067R;2hP6$ics7|uXi7K{)>avrv14{lJvRueh0gZvA+ega_t$Y*dKl0hJGoLo?T2DePWn<$`LDNreJs|{Lj zgA$%Xa!zrvLRx-NE^I#lce1k@-3wTD5Ci^{x`#0uS<;)APiCnN*JJ8F{ii!Tt*awB%l}~pa44h7H&dGc1}sQ0t|yp0QnF! z@Q_oIt(#j8mC?;D2PpzkAT=O1s3rs#a3$HgMX9;@C8;pA5FSVkR02E*2I7Mjrh%>@ z$SF-uEy_!UQVQraQgQ{`hJ5~5ZfS8zVsZwkct}jnR)B1JOf4z`ZMcDO5F5i&vPwY> zKY0BID$q=la};tb%M&Z%$rZj35u7<8E(71ShUP4=7|g8@4$O50iJ;}}5UrqU51d{h zTwT!hBKf-I`9(P?=msK5!OcY$0~-(31S*(72gF0U;PeS)!}UV)5!7BV2W$fL@HkjH zhRDM;AzKJFP`9+CJT5DVlEfn2#DYwu`WdDYMuS5V zlx)F^3d%t%o@a$pPvEG$qG1+R>&EXqtS&HO}6 zYC(3Kf+|PQ#9yvaat;V9AP8_S2bl#rkqSgZ%tT#oSDctrm1qQ-=Lh9~P$~l%0B=ix zIA9~;B4|7ew}W(mLJZVR0I|V|0mOi41jjsx3l@i+t^^VQaWD(r@A!-#;^NUf` zfHD&3n3vqd^vvWO2&sTdp#?o;7!WkJ16q-lmX-->HiN1(h%R^%hH#-~!9_9n;9>%z z7L+!T3`$SUgNVcQq=RpX0=W}(dkv&Y0l5S0BB*0P0Subwg6M>J8p4K|0?HepFaVna z;eg!$y=)a#F?@g#BCK0dl$ckXoC@ChnwSILQwZwcf>t47RRIx%TaBt4B8hG$q2PuZ z28y_;3=9mpiJ2*&fC7;U5Dtt2dkdrJKw1-=lA4-=eSZpa%L%g48P<-1jZ{FJcag8?>H=97PB*4N?z*D&h=yZ0jcFfUe{&f~tT} zFhQ7Gp=zMn1a?;oR4rtcG_e5+vb`E%J7}GCPJTMXD42CnL3A$ITNr5&qLsvGRR9e& zmx7L*M3@BOg2NKti-+2dlnvqPNpcXV1<{O@3X4E@ghLF68weId<6#u2Xn6rC z6GBWQF;S4q8K|iUsg1$qGic2zs(U~pFt>o&V0YlohJ*qK)Pw-d zI6`dE%`8fWuwZs%79}Gy!M4F$@X(e!(x3shEQ`wtd8sAk`9;~8dFh~p+JH!?kTWDu z-2oAUIR(mtxF)|SB{i|MLboIXwAlq)RRJ*ympkBv4pbTF;_t-tRFI=Urxij)A^Q;_ z9Jn*U+au91f>*Xh9CM1I7hA4Wds0cDWHWo)LRZK{rGsmlhSJ z=9Pfzc0p-Q zaVnfwo>&Gm9$r_$dX=!fGoXqCsq0vhQIua&g5H0FiNZ{S^O1rCR~-en8R}_hXo3O< zv`7^y3Yy)8FyVH9u10_eL9R(awu|IwhnWhi7(rzaQa2A0DiGUXN+DusJoK6YqJ>1i zgVG>q7Y|f(NqJ@oXb(8Jl!e;|5k%*L10gvhv#0Pj1iEiKAHsua zfeNB?A!ftc?9ikK(Me7n2cHK5oh|}3rYye%Ew6z@U=9JZQC$JmhvrF`23Xnxc^awE zDNju-$w2QxK?Px2VO+3vpi}|9j00*R#R&{%4>Y-hW@A88ySa&(IZ62yPzt07#D&x7 z{ddsFGiamDcGnSR5L;kL;`~kowk7M2hA#jHkRZj z=4Ga(7MH+i1xyA~#y}eP%FWNqPOZ$zOac#pW4$t`BtO3dWDjT_40J1NQf6KXjD}xT z4`+bF5wtQ0q@p;r1WJLWLD#v$_@Gz?B?{0aeQsh=azOEQf3xL;!3J zJRKsO1+oD&5(`@A2C@OvrzpxU1r>wH6j(d@Jc>eb3HaDQ$aD-yIe0w)#2By>N(;au zC~UA%NG>TY03}nFzYs%Stb3Bc5VeTl9SEC|;P=11nHll7oHFu;02H1 zNy6le#7xk=#EB)Di8;C@MX9O9@IiH0a|kW~9d!qJ8nnU*>>AJ*AhKgXe267r7T76Z zgp^D@W_H{25r^{l@6dn9Bg<&N*YuO z#)W7sNJ)daR2Res%Yu^&R6f7Bq&T@Kv!FybEkCaW^;Bt)^FdpE!I}zE(!dj|xU2z7 zLJdtxgU?KZ(;ujz0IJv^2EnaFF$yjUH3Pwih6X$fqL~7AIB0Dv=#*7#a@ef_YeTmS zB8YAw!~k8;DfFp%DWFvhx%qh@8$mr=G#kOe0MUSMI65D!6kQNC;6QN_X_(8_QG6Bw=JHfR!LsJjlu*AqJ{XKRXjvIzKTI2HHpd|f4^vPU z%R(|3T#um{2o{4I1mVFAfCdqku!5MPi{x{#kD$UuptTA`pcWT+J`o&~&>+-L&Z&T? zLbDVih@=W^Iha7y4oI;DRgc#Nps`KR;x(vRNJXv>%9Rii{7wL!(}qYq@EQu!4VYdB z^|wH$H9@S=g{Bt>4{j-HB7&-clp`Q(p^ZAwnQ6&6pqvYy(}IL0Mj#>u1Bi(whm_`J zf=+x_07*j}f|k-??gG`d;5&ywbrw`*a!!SAS`vf&&}k?e;g6Hs9S z9{qxQO~0h5G!?Ww5@HaN6-Z3DBIMQ_XvHS}k^ma25R<{_7kWYhXs{Nv!WJq64h0As zW+_+*l>_!JBCk@no`Q%$ zT@Q0PS&l&pT2RLUW-zE!gs|ZjgM?5y@Sp`n40wbPl0Lx2D5`F-5KK3O1J{ij->^&u z$yA_Rs)-1hoW#of(vo6Sv!Q}8(_vhY`JmDT)PjL%(1l9rmn5QP6sQE65g>Ko(hbzq z01t;j{0AybASS{zfJ9K(Aj`p8L0KmW;Q{2X391puGBBf1#NbAvg;!#7HlkSx*9k7( zL3@93SPpK9kmdrg7SskN%sNPnLX1P{eu3(@WF+r{odr<`(+eqL(0Eu%M*{5!XsAHb zGicBaybcr+W1!x%Zh2-&hHi3EesQsGYD#)4S}MY-1m-I2lHeGDcm`CFcEbIspIT9p zng_aa5Y-Z>aY)kOGy*2D)}UD1!4Mmv)iBgZSp5a#Vm50)c@(_(030Ivph<1)jswe( zR+d0K0BO5HU58YMpw>d*tOAWCP`(0fX@ckhr!NQ->J2CbmOxE-pyoH|{&AtA{bbl2DDHp(s!S292V?EXv8uRRHlJjSq+@Y^z3YifL|&sR9gx zoB#@0@Th5ON@k)isG=^;MKBd`v9V-3$joMOYEfcAYH2Pgor4>~2*bd^ON{9dh46Sp zm;ee~h@m;4T%4Ml3ZWG+86dyGj?D*;lEKDGVEbr51CO91M{BILQ=%Rl`Wc7(FQQf?Ff0C5Z*#XasA4s0QIr?i6M~Q zl1vC2tO`2^oGL(sZgC~(;%d;sfxJ}k&_Xe&Uk{3t#LT?ZqGGTisL2&(Bsg~~Ae}J{ zDo#LqDv=!l_5rd0*g&`ukU1nI4}jG}ibe3T^~hR5$q(IpeQ-Mfq!d{tiX|uS2%42T-g$Se{IDHFo1gmf6dx12-m zMwGP*pgUeuGK-5-lS_~{{(>5exrqwJ6@@tppq*l%^pXzBbeSdj2xlQ&0e30HDF`kW z_rQYy%^8r>K|p3gf&gN9W_|(4_n1mYpFz+MK+qF;>)N1=+q@`toN;pVlfGq^CB}Fp>ET#YzgmA!)0XqvS3@W@p$Lm13 zy150$P$pa>XkjW;3?vQl5L7@Rw;G1 zb{0%2L`hm^PAbS)P@^6cxCo12>JTDGt^m6ZELeN%hbOD82B1Awr15~twm*b(Uhm_Am7z0s=X(3b`WC^AuD4BvcMCT?J zu7!|bH-lmr zT$JUfq~+$Pq=A$}35=M?fv;(RUJwC_RhVY5jc^mdJg`|17T6_FU0`9PZ+wCEgu-%K&YC*YfbLDh63s1bzZ zB!of*1QVMcLegM2BMe6NCBk6PY#_Kp3ipC8LK2}FNf5g^I7Gp2AU?3*!3WvM59*YG zXSwq;ixP7|gaR^&l>acQbLjnXu%TqQ!LafcE&yH32pZJ`)gR#7k22E}A*-{C^+00; zMU}cKi6u}W(1L9wLCDQV*frplLpUCkRWF0upZUlO!XXX-*#yZo$4CpRF3o?YG&?GS2 zN1{Ba`~$VvG3^Jfz(%$f#K&SAUSZfa6?D^aM>srSK*hltl(Yz02@c+)fbK4^AW~E# zDa9d*Nc33z1Ud@{?hq{USpAI9fN&is!+=5eK z1{&^1HyN$~;VHNfhGoRaAeCvTJAXh$5NM_pbW&Yjs%~Z;c&A`~9=I)6oC}&)tSZe- z1Rp?$DUVAST;G8vlt3X}k_s{b)XM;me!z@Gn2n7EHUTo^0vi~H=3r0-4O%A-*QE<; zhgE=v4UpW6O%~x8BrTA6GN>JJU7*n_NY5k>;(YY*fU86@6qFaitqO=1cf)0B`;W4JGD) zXO6(0z+nnl4%sM(05lTeZU6-gr2k!%3YzhREMhOt%}3!X5aJ`HM{rCdoDGUz@PS3B zCW2?n2$_l|57q;lM#@Po0Uu3{?ljPF8hB2nz!-kyaxM~E0VfAEKm@uS2U!6)(2xaC zw1Z^{h(LPv5E9(C2d!xVC5GIBKr-b-^zGC}nM>Q(Hy*o75H6$g0^>(~~^%2Lou7tqX9u>y1sAH0z`738*h zP(1^3L_tofZdqbZDTpk}Ow21O2D<@M7~(b(#8dM!67!N%Q*_Y`1nr;&?}!C63i69# z8$}>}R8V37uVezdE+4eB3t|A633UY~8yph&4!ZzlZP0!17&IOtPDa(H#f1kBtIoT50~jMc@!()f?#`)wSqPwrxt<6-N0ROB#Vkm zN>eiPk<}uxbs@4SmOzCttjNnRD#_4INv%js$uClXsDhpw0J0a5=Qk&U`LI!D@R~f3$3UC#P;CJhoTx%* z7K2q_6+_)g4e}k_wH&bN&vM<=!qUvLTqv!8!2lI)piPsxmBl5Q$q-Tjl}dzNl93F$ zYZrR(GPpc}9Djk@?gCXF;6Ycgfx4j9i*9aaMP?p~p-AFT+b~5yAqMKMK{V<@RyScc z3$!5_B7-muLkuC6lL}D`Y9oU4FT}0snI)O&d7$bUi-XZ5VTNHBhRGs)4=Q;lfJ$D7 zRXLeSpi8!OOHy+SauQ2YA%28uLzg8W4wFU>A($9;_vwOG7UV)h0j9L1D6uTF7!opQ zVUMgF)v3rbFoUp&!K4rY0xIl5Gv*NEz^NREYII^G6 zj7Rb<%rIotP%$WllsZAfq7a9dCsslZ5l1GG3I<5w18v=dN(V%T1~ktEIu@d^v?voa zvJY(0B;s5NKU+r?wbF0BLm%R0$Rlum=!YOA?cE zQj0-35wv{)Ar3VF>}d>9Ok=_7a0!F0geD(Mvp`#LSic5VuON0At^s4Jr%5_SQmPMlR|nE<*6x<-a!-o|mNNq~?`?W?fRzxC#XLprQiQHHV(_rkj|OQj}U; zoLY<_05SW+;X!VBcVfVwwb2hf5e94&cK(5e@>y7HAwRFST4Z zzW_oipi-c41obdM%j)tnlRzaIlu|&aK}tb0@Sx?~P&sg3D~58=H9#ccqD3VjdqBsJ zW2+RCK`S+jjX(jIRgjtvqCs~L!BV3xV)HH%6LfW;5k_$eS}j|g3c67) zDYXcEXA!892CWVO_jq5K#{sH1Y&m ztOPay>J2a(roAXJJ2w%P12GC&0%Q`%U7)rWSU2p5DliAC8+wQg8V_t(a!zIeEU9Fa z<|SvO=7BoX5T&4405!?;it~#~z=Q%a2~Ja>P86ti1(~LsS6q@;Tml|b1+n1_m?F^X zJl*0{up$^6G@xAo5(LE|D0p-8ic56Cr(%N4Lhuxjm@wNEKuSRBi&JybK*=65jtUwy z11%ndx(BKVbQlNhK#%;Qblu{_+=86cB2cRaG@t@9CO0v!6m+;yYH>+1R2S$xakv=B zK2!k$E&K#oKh4HtnJjNlS578K>6;bE|`uyJI#gJA*?L*YEcC@V+; zG-?6bpaU`jHS}QSpo)U@=wb>Xhh8yw!3em3f_o8J3}OV5B6tD;$$&7L1)y{T8j}LK z5fpGRmx0(|j#Uoi>;XVt{UQL(Yy!Z0Hiz6jM+E0=iEl zuQWR+HL(cXQbcAe;O2lrjEp8HxN%#W3&~@7Fops)7IF;&8ySHdkD3oUX$rKSs2Cia z@JmA#ic@n^lfkF6gChuLJfw=pW(Qmhq69Y74;O}-2r9*0BglE+4KPR!1@j@Ug)qU< z2Wyalbbwlvpz{XuN^=V;A-!3Zz#DqZKe2V5foh&4F`pG1hzu z8*+dpKTrn{)IQ2j)lJOY7q$Qf{*o9K$F4XgT0Ix90fIbLB%{Me)3XtK)WXMp)@G*;9^4( z6*#Yf+La2ZL#&`S0I0Oj&(F@!&sKn8kkz1xEYNBD`CvJ)B#b~#%dm1QIY&1$FAe0^ z{37HwL~>4XVU9vpeqLfpMq(anBepm-H!-gSv`Gnm7bpC7OHj=l07`KMsd>7fPym&N z;4M=57$OS92_ZWhRER+fB2X%{huKtCQ~)-ttf&BDDhdP11Zc?uQw$nCQ~=+74ytiL zjTvMa7#nURSUF4-%t105I?)cb0clD1RDz#Mqz{Ek*KT!%HN<9 zr9g&ers!s;Rw7tn6Cr}gOt9IA;RRUR9lrSk9_66OgC0B#8l!}k={dSZY00{VhDOGq zoB}Sd3R3eR)_`*qRtJD(kX!-b8z$yLiy62Pp#B?Z)d*-}KRE|NDxgwGArA8ktdCZb zo(NS8=?fL)rRU@)rYIDpmK5cKDyovqv^0g{?976KO86D=koYOd1Z}v=Pe!o|G;a$t z5Oi5A7ORoALW3qp5+SF;LN$S+AGCNJVko#KhcKb?Pzo#otKlIEKsrHfU4#7UW=xpxFpggiQ#XPEmD(0tU3b7bFVpt06JLhCqc; z*wC^M6uY4DzWk!h^vpa6seno$#R=H@^!%KZ)I3P@7Gyc-uug~$a2!CGP&2?HC~UA1 zP&FvqTtI^@piQl%MWwp=MY%{!kp3#DFbW&lWw2@pY(BIAg~bcf&`N%>ZdztVNoi3k z===frE|26KP~B(*-e?F78RWSP_$EJiby=L8U!1G}!yrpRAqi?-LYia{QUR4hb}y*@ z0j&p701?pLRPd4!)_?)!A<#%F#29c{R}5i8O@;`eazKuOia^JSK?7y^#kmDZX%JEY zl>%!>&d4mN0*x~0rRV3T=cMX^+FFovEkRqmQWJBF;RA>TMfoN9Nu_C^iW9V!CBH1S zC?~%t1x71iGC+2Kl!FdpgIzHNqv3Z>As8U#a2{+u0jN6<&biPls=%cdh9O{4gkI3l z4{`woHW}Q~!#Z#Y9{U3|h(Kcb8IR;eQftqm$E#Q$V z7#GQGus8-E>;cGl9zqUeFsQu-+G$;on4As53J3xz;URTcK;8tc-vg-wE%GT!1zn?> zmyXT{8-%O?QvhKBXp}34fq? z86fotgFwUWpb^5P)S}$dl*EF>90e#7P8THRz{-|_#2ksAmS(1zisU=Oavp z%3unB?SX3mP5OZjkbn#5!uwlrAtW>4l32x1jRqALpxy-B9MH9CWvOs3k`d6}bz%`D zR3Hi=B@wJ9M5qSMgMsD(Kn6k1U#Ut(jJseL1?$FCj7u2o5%?Z7P*VX^mw}TWc=V+h zi3u_zH4h?;$p$6Uf)daG3ux#&u_&`71ELo+vZw&&LrI7*XlY0>)EKZ5urS0FP)`R` zPlJWP}t6-6=>ViLT%E(TqB4l)PfJE zGYARMW(K1W_f>iW?Z^u!99GL)Sg9;b8*K%{f!HZ@NSPW(;gahpeLluHN2wFn| z=0aSC#DwUC2&1s!OV7aGg=Yx#@&+_W2% zK?Me=bA%+Mo1BwaT%4JVMF`n+m@;f)pbP@a*Wf)*U;?D7I2B5QTm+JamQ^T6P|cT8np~n=T%K8yoS{I}8gft&L5rs1)SQz1y!29tQ=n{!Bd~Jd z^*N~I1}*add#VsZLi82FC{S>MvI(TAT2!1`2o6YWYQYjveV_sZbmTf%U6CHNj4dk7 zNrglKst`mI5n_m(2dPIOMKxrfL}@YFSTSf{&H`{N6tpK7#SMCp`KtUPVqJsKfX%H) zvdAt3T~Jk$nhff_>m`+D=A@(+fub66i7Y5!p;Zms{a8W^)aYMG$P?g@$D)~lTe0Xs z_ylYwa!(YRt?@Y)zkQ&ci22yP0=5i`bFdkRO$@A`M8|>}K#d6JWaec;9gvxq39|!@ zNm1mYZDfL3ft)o!jb~_6p*XcjFEcL_>@h;_0xKfI_nCQ_pf(X`SQ2DpPHH8T0=p$A zwGvK)6DMTUAqlimMFBG0k_NeB7u3gr6t5-88K9MH1&L4w=n77V5E2VwSY{rmj|(30 z1a$==1Js~6fHcucGC+;L;#AQ7O9%^O0#p#0i8^KpKK%(4Y@j1-5PHEC5rT`PA1s5x zho)_W4p5N?X?K)lfX0(DLBkAiCPaU63Fz!d6gI4qMJtKGt^{@CKueUtmO%7^9fQP2 zHVZ6=R{%0G2_eCYpg}{$putg)iJ*2OWXuzl2R0EQiOvPZ6{ze6ja#8=1iJ@S2u(9s z1y(VTsi3q4>FA*;0aZefaiEf-{Jerh5D8LJlnVSb!Ri;C5SbVopv0h)_T# z(Un6abqh;VOH)A+3)cz}LedHmKvs`&Ar{C0(0SKjU0^R4gP9Ob5E3E`Z%2b12#S4h zi!QY&8MML_Ji!Y}RcL(Bk=!T>Fa_W}18@cf4Pb%hqzljt0=ofS5YsSp6<}>}m!p{p zN?@Sd8w*m4GV@b1lXbyk9;iH!6-bh3Tu}J~nizuUDTY!|Md15~GV@blYe@2w6Cv|( zAbY_D4%pseUC>p?spy)aqA;^yTu9o3XjFh`1f@98n%aWYqMV{s2no`bQgXdz2}u5My-a%yogXym4(7_{gfG$n~R+Fcj4Y!$q}0Gk-Hjc|on1wqY2 zXjs9V2-g7aIZ|dk*a)l^gE|Y4v{sS`@_RulgjT?0fFlbgte02-K28tZXoBhiiNWOI z`ay!I9OUX9G~WT!q6ZqTMkviJg54;C5X(yhEiT3sFG@{IEdnia!IT1xu7G!NLsJdt zARy4@S-7o9Ii;xuMVWb^^U87yGILUkU{VNsG1cIeBie@uQ{c`7O=m0vwU=Ol3JMiW z7lA|(y1~4}^t^n~7CYUX%&Nqq6y%l)IO;IUYtUFtVopwK4#FVtimJ>!XlNqD;m$*^ zav_Ur6iSox^NK-P5j=tlb2@bGY%!+uVKN9C;38nR!gPR)tV0eB@P!FwnN=_a2m@d; zSVYj{13VR90#^uUV5C5V3?cwPn|VOB6X^6~m@D)$u_T(zB82wLB8=#O>jg(1oCmiE z)II<$QH0ANG6YNr*?i2Dk5Esn-I+z8VT)tP;fq&g96bhzNsIV09cq{% zhjejrMrulFPAXF1!-EuB1b_xdP+||G_`vihh7yEVF{MzFFgQ_x#x=m>hp?;xcP6G) za4Ccp2q8?P5vnqaKxqbaA|A|8aJjErT$)*u3KK#o2M_jw<*A~hVkizC_*<8 zDhli3qdA9xfdRDn7GWLu;GxtM-GZXb{G!Z~N=TQGkUWy5*bN}40CZjrXiX6zn;_mH zq>7+*5Mzi{h7ow!J;}ttzyNBu7o-=YD}WJ*7thGRPyk+!m|6s*6)+izNqK1)g&xrW8i&a*E=h+hn}ROPL(0maLAS)b6kX7&WJKYt zkdkDq09~pA8CgczYpRf0k%qj=3Xvl~TT_tkf++^AAO_ve2|5|LC{LlF611oxEi)Z7 z+?HCTP?%epm!be(TMFI9l9E^g+E9SJDqf+uFekGl6*DV?2a{kM)FB6-gI588jz0%Y z3V;?N7a$c?$ZQ4N9P|nWDYPJU3uwJ`N@`vSXe0x4QvtG3`bmlD$b8)PfK(#IGN{4= z&Hff-R2FA~y8DHtpcU37nW@ECgcOJs12+-CprUJP8%#=jWuRfHpTLf>z6cy7r(;X|Y)j_8K+`;++aM0zQ(2#n+%=7|?P&P}jD! z075FDQiwzeO4;D)uFRa&QpkN!#i(i_JZQOwzW55P3p8v9>bDhS7Niz~2?Zn)<{Q%PuYelOR2L*~KslJXVSswn(KMd?P?nX>xXPVsbV--$26^lzc#Q z0u`W9@PeGwip+w7(qdgOR{@y>`3zK1K?V$yD5cKof}tIi)G7$=Og!0i6bG0 z%}K3DEdq-}6@vv(*a)ql0s^$$5v(3m-WH?k1=j{eP|Z*ds&3G-V~Fmg(!7+MRAe?( zA4CF`12zPbypU28bgB%hG$lV56ye|{4dCzqU6=?lAH;&HLT7?a2CD)ECU|BCthpq$ z0xYUql3D@Pipm0O1hs(*l0ie-AWfhlbnxO?5C^0YTu@>$1}u&+6~YA@2x|nwOaQg* zz*8xC>EJ_^3ZS$CCIcEg;5FOO_3EHB2_CYB%ml)Atf15A*&P&fpqa{I&@FVyy5P-5 zMa7`V2UqeC!@#2pXeNQhKu!Z~jDc{_%|_bz1KNlInWhAL4W2tFN&$ii(gYJmVS`KrB}Q;1l%JDXoRL}t(g&i!3Q-v#7e?+p@*RvEDARY!UOlo!P5j#t)N;6)bay2vx*?30ty9cIzs}g2-0jT0e82HL3dYy z=4y1Id&RI`S%>xx7paKZWMKb~_ z3R8^kIFP@b85kJKQ@*>3bFiSwW6G`k&y8T1?nnOg$*J zLTd>mgF%4;8k9t~7c|66j9p-LSj-2-9_VrtgmV!rP|%jZy59N4FeZBWhcSqT^rP(gQ&vdH)QuiErgt|0U9L$ z6~{&l3=CiiBy+)hsQb`;isUg+2@7h&f|WyDfZY&?95Jo~83~%wM~ZP|BN0wlKvDrt zoS@zosQf|_*9U0@4cq9ZgJwVBL5iXmr+O6UBB_F1p zB2dKvUiu4nV`fPu!o19qN~CziLu6(cG7_gTF}<|f&$%={M;NU zrGQQ&`3Y1#fnx*Q0)-5wrKjel7G);ug3bs^EJ{oQUB_IBJfH?@+rbZvLd|5L&<5R4 z3bhhiRzaKta|c8ajYq&u(9()Dr$HTo)(r>cOwet{1>o)>h)@7Cp(KVwK!Fa*ncxtD z?vh0HG`s@}+g}MD`U52r&`Ek=!@+(Avmn-h`N&KRYjbo#yJqGkLhm0cC<4`xpwT%{lNeP_p#Y5!j(LzE_@GSi5;X8C2T%hI-1bS%0q^O; zFcef@gG~c7a2W&Y34y9@kPVqB#$`qr=72@P20>VGladfV0!xFU2(%Ke7&Hh8US0$m zLQX`v4FG+%)YLKg$s2nxzpP^|zmv%pw4sVKi3)FVX?%3OpT#4IE}$Q;Ze3y{yj zK?Gtzya-}}3<6yi1sd4{n*_SuwOiR;cGU`oop9x-n!yzY$b=SXpu)X}VFFwR zYyyG@cQ3Zk!{Trh&w~7k>NMmKMNUD8IszPSn9hUOh+uh$Bhkb_P6cHcaCr{8_qiZ3 z7t^4E#9WAO5CfzIQQ~4c7u1qMT&)F~(gm+HhMlAhzjO=38dQy73(c&XM>D_M<1GXpw9UNQ0hR+W2jakNhqMmfUN+Tjb28; z?ZThNK}iLg!@=$c@nN|NEP$GH5NQ%*Ct895t1kvcDM%76s6j%=fdkq^4N80kMM=dV ztbiauegc)2;6-#rNyVUjwg@#~9#}Pm1yT)4KIy5TJ-T2CP=yAbiUpnSPyiwnkV&u( z%(evLD$3;iyv)*E`0-hwq853lEU1J8&leY^mXuV&3#S59F33t`X>>lQHUzI81}~HY zMHghr9EhcWoe6R{XgCaXJ`_YnPG)jyUU6zMDi5k1CW+2PuUVnvTA*eacoYESpfa$D zWe}|}3S>7VQcz}?QRbULI*_KH(YPQ_g9j~&@{=J$ods|fs5*xVA~Vrl3vLR6q5xb9 zz;%P$4_FNY%OIHu;e)~wNf5*=ONEf&76mvYztDR`g>rw8FGP(6td2KfogOgYTUkkCi6vp6LO7a1^`R_3032D)QmC2B+<>jZ}sLN!`u$54sO0bpYwi3d5T@q{t5(a5Ia4MR}#5Oj1W zl7kCMi!;&_OH#`dE0IJ|Dp5ToHON*W3xm@NG-V*nK~|0IV95$Nq;A&;&6z)*yo zo-ibl;txX(}PVH@z; zYN)B8o-w#P3l0)A^YtOJI84S9NTB7);LUX?w&=rd6G}m|2j(BBeF$}=+YHK~&>kVk zM=%pXlg@Sc1qn+1G|;9sTvmZ4k?a5s5P)~aKsAGo z*h|hRElI^?09*l*A;{|}z@7lFrUMU2flqyc9teS!(?FvIkb!4#>7Wm?F+VvU)RO|G z6j)M#(QtVj7URinpppVS69)Ap$as)#SPDJxLI6?g?a$+&g za0R&utN@4i(98!-8$rj0!H3?0>;WBq3l1$*2BcwW8i)0IdoEE&72d1rHXZnF1Dr8UV8!B^Q9XX=7_Z6JdnH(`NTkY(JUb=06S zA5gOqYy`Ob4`xBE0`rlWAjRN=8$nisJ&3FriC#i^w! z`FWMO#RYJd0(K@w)_1t=FrgH#oP3hd&_n{Ezz9>Qt3iGO`y3PrsYL}4N&$_A&$5*kWrCJ2Dj*1u>7W=<1O-fK5h(o> zmlPx9K`gMNiV=pE7G;7=1g};vEy^hKQ0pFi&=GiT zEPO*5`u;M4e5BbDPzC`n`KUBW&M5#93dkhLd!Rf3o^rvwcLpsTf!C*iaz5NdaPd}* zY$BKq5yo8G06Etj>H;*wLH$N>%c!y>BR>yx2?zN6C2)Muy4^b3n;2U zBOwJ3r}F$e<%>K?xbO zL98$-KR+8xC?J!GMR}>knV_T$Db8U*SDBcclbZvIGf+#ZFh@5zBQ-fYzqAC2sep?O z@+c^IfSS&QIr$|Ztbiau(jaH$FfcHH_k4m0*!EBGCQy(P1@K%f^oX_O9PQ%b9JGV% z;aihHceU&0r=gG5A+Obg?fwE4O5o51*#j7|(pg(Ve`hyzuIg`m5iQj>BrOR8YD zA_*xVv%y})X+e4^xNHWseF}?{GvS66Cub^v1PHhHrp&7(-_}ASytHz(f=fl7vG-p|AvcL9Iez325OoILbhY035vFI7L_i zjbSha34wfQqC$%-kO82TgpkyLFaVl1z!ca3G<^#2R8*0h11fmI`LYCld~jJRl3B1b zh09VE3XzqN>g(j9%z_eR??dlT17E)eTK-a4l3t2PW+09NSO}j*pb!A{Aqq<}QgaFr zt_JZGAcFX`LoGmy9Z)p^307#NAKL_MnkP1l9!D|Jiamp0X4Na9; zuZIDRPwS>-rlf#wr%udGMP7fW04pBhZ8OL)Exd*So$--Z0_Wy}wrE2(sDY|D(69-_ zow})Ii8-Z^Dh}*YbYZAR5bDtUf*jURwQyUJn>L_U8fdv1)co|s+*Ak?s!10lg2D!e zFj7!qvk6ulfd*zkE6X89>Vob_$S=+-I7eu?VqStK*V5HKzR@=GBS$_uo(}^Q5j4O3=o5KK@}j#R$Xwj4wD5o z46are)Rcr-SDLAtoSFmj15}$Xc;H4iBeS?9zo-&f8R%+r-Ga>IY|s%b5buC=gN2K8 zGE-8EV0ld!E?!cUnFzY*9mSm7g2ZA}rFkWZp!+S6RHdXQm4X-dA)K9(nV6Fgsxn|M z1zqHpnGf1#fvmA8Fl#c7!psVTaJpy4Ud$|@usX*v1jx;crJ`K6$S z224GuEr9AHa1$BqZzRpxsg=nY`9&$ZAVc$ukYq4S1a&?@hhZRml$T$UnUtx=z`CR$N=5URsCjrzQ1BV01C7{FvHyO!DkT^P*m~#)XC3jH&5K`B|Vh6Oh z8*Ca@t1C-V!IH@K!^N;<29U2n+tT5Nf%62Mhhz+TUIAqtECwR!z)VMwgaH~gD@6%O zl#GYfa&T6|l`~=D_??3{v4e()wqtP$MxE;`92$E8f zvjRjtmU0E7cz}jHD4>xlTX@j~H5zUshV!8caEjyi7u0r8v!w(}kitBG+j^J^4Ex~{ zU@SPbfR!MISTfD8iHNuZhza9F%iGlXeJY@Ow|;LMWDD)&y`3kX8>|8+Hppi`0?YIHj4ou$ly}5y?K7 z95x}a_h7^7aLr&_LG3rt$v_BENaBO@k1q$f2BDgiW zh=uxaF(fMxve*T|mST(z!%YH54QQ)1YK)@=7F;=!9cW7M$bg*yHv()U=x_?q9e@Z? zq@o)xh-@a-W(<-h0{I7?&oGMzXuxB$6)J_~4wwiQKOw1t6c3=N1g-vso2-jyWWmLd zbRlH13qtG!s{)T@BB=tkM=)a%t@(z{PBbM*Mxx6=Y)5Gsfl3PSh(BBu;&E&iL1d83 zhYDaZ78FG(DCGjQaf#L3%;FN%b|+LZp#%YH+`tXgg{KctD*?5LMQ+E!H6VEeSss@# z4qt9W@g=lnjLi48z);fJ-A; zgH<6xdHhaCD<(mWanQb9xb?cA&J3J~Vi`&&2c(QZl7@x}W(qDS$_JgAQLLMkScKIo zBza^PAPZyhCCD$JVkS=a2}FLAaQgq*gygm6V`zqP;x`9tsuz|o5c_rB&(qU zV9Vhe(32Z9AVIg9O+-o8*n5(2bCB&J+~>sFDaG$Fw8VsDAI!;M7lN9Jpar9Fhv~vH z2V4Y6D@+cX5Ps*t3r!@gP=|n=02!}^6-UKo>ELPts}rDdNanzl<4E(xW$BFSSLP19uVd?{~7RDl+oP)(guwtCzSeBQgEcnHu5tQda=W-R6CKhKF zmgbkF>Kf@8pz=W4kR;K$(8+aB>j-qd52{{pBow2Hp&NiI3(*0e{zq{aXvP6_q%2N-Hf+)dekx&`krcdV(xL0L`X@2Kvwrp@s$?ykG>K z9}GUj9W+M(3R3VrRv`D3rWS)7fuKP30%*-9M1>yw2=ipH0GNR3K$nCXgdvRKEgYtR zg+Xn8&`J|92ec0nd4oGd5W^m@FkVrRpFua4f>jplL61wo<|h;>n3<@81pEV447Li? z_XkfLg6<82+Y6Qg6Y!u!)`Vs&SRqsll%gP|S!Qx}VnIP+DTG$QV1VKgJQEL60ZPug z#W|U|sh~NDg480gatu+3DMSk+R3u#pfZ#1JfOB&Q*+I?FFgNlh%RfS-^Ep9o9I z*DWo|0bi$<3Ol?VbqNdTCRp&ZGDnd{`qSd4imWWE(^VQvhr()Zd`P zh!TskQ}WC6KxHPhjLgw31|NX{5`wUF6Z7)&OB9lG5|guabHQ_)<%vb9y2-^wY2fwd zrA4XmB&d**l&O$gnp2WlmYAbk0P5c;=d*P zijk3l0qQ)E!eqD(sGve(QZcA1ErHxho>~lPjzP%0l%h=dr7yaPIq9iMMTwco;N$Xj zK|3cvrll9<<$~yp)WiZ1U65LoTM9agI3JW~LED0LbMp&O&Wy}WOwUZt0bhKYn+UoE z6Lc$fPJSXNH>Z}SqF0l!wSC3lR9cds2X`yD6|Y+ix>O}E8F4WLbkh?!5Wq)^L((m% z)&$KBL%pt>l$w{Ek(*eQotc-85;!O_AU}a*Q3b&f0W}DoN8kp6+TNWE@Q{Z@9>@@Q z_(O!?W`mZy;0b!vFohn60J9w$_s~FvP`V{WiFw7zsd=F5DH3xO3d?d4p#gH8GQxHG zAcvKJ2)OHD?t)0cc%Xa_TCxMR7$OPr2p-)K1u!#UG(;5Cp#YtK1~ajwJT)~XCpD!s z7rTK7dGPXLm|>to15_Yk8UwM0kYNy2C`Q7JhDd>$)Zke(P)PtW4Vgr)o zRWsCuaMR%_1~i%nI@PSQ7&IY{qa6$_NFY(HP*jkNzOEUb5@AarVUb>(p9fkh0xEjI z4u^OP%mfvHImr+K6gEL$K@%Rt6j12~zIp|;`WMn{D#`?3=z<_HOiWBl1>YkIFTt^_ z(}pxgpxX%GW`W%czAy&D0_R689oHi8;#2T+U1@2BF48{ZLNvYtVF3*Hqc_2jj919X z%t5*#3N&(=n+R%LfetDGTUC;on+j(@YzGM;SfB-3pz9?I%W^^a7lyHy*vMry_#Dl& zv`nO9NkEZ=QU+(Hrl#tqfePJXBxgdCR&I%*rKPbs`Wfu7<_-Of3tav}%0-~o z0eF!t#EZIl=`d3h3kr1e(qSG2G12{sl=+MC=5vsdu%Lyz36#M=%?D6HR|vNqocfDF z8qmd%Tmn%98B~I0TDS>d&w;80&~kQ|A>jH5*;KFq+(-xyoaa!@0~-b!E&*NZ4KfT~ zz`@;!5CI#9#08rN3nY-`urPqDfz;!mjv07lt1K73K?I~6WFLHI2nq*gGOVovPFgT6 zi3J6qd;jJ!17>10ht6TQGlKRnUb0Y>RY1jkN_oAP>d!f=juYPM~09J2mur( zsNPCO+xQ640oq~(TB?K42o58NB$63mQ9OJ|`a|8!2nq{L1_lO*VGt5}n=_08`xMP( zpt=k+sshmfwiv>MY66R(u)(IF+6|QlwQ4}#gBXBvhcp%;s3sI;Sj9lCaL`Cv2`FoU zCO@Et6({Bv2fQWYQw>~^p_ zLFRyFBSF_`>LwSL!Dt0c21pYqcYwB;!DPW>_b?8o9JCeR7)ISQbw=X8rxOW@;a7~!8+ znwy*hZ=-`c(8VAxfELn&+?@(q_*q;6VM6VNmSkWDLD-;BgKU$ADgi|WXm<%jALL@R z)<~fQhbCdFObaPAd(o>6IqZVkk zf&&&!48vwLd9WS@cydQq4hmmT&kb1@=y28&3;`6KU?o^Y5Z(rbBe-BsP00ks4D=EO z(3W>3t^y%GIOW3|Q%KupK~V{EJT!LFQ!5m}Ob7`okwACi7^Ucfmk<}FrkCa<7J&z_ zbW_tpP@E8Wg5vVBzcMGT|LC^^xMF>N|JiI=JTL(%|pnWwdnZ*T( zCCM4MY=X&yj+p=}#PASo=oaJwP!53U0EY@8W5J5xW;xBrI~dea0kx08#S*wq z#AP-@1*8lEE5>j(G%3Pd3#uJK#~mXy!{d>#J#eK+79zy(M+iK=VW}O-47le(B_n8{ z7|C^@xF*77AZ1753N>3wG|O=5I2DW55fX@8e}OX_#k4i zNCPw!HElSM=tvkvp zhBFkfvA}wv^TwqG3Tc^nDY^yuMTkAC<;9?GHt3jjxOT9ua2~=~usAvwYyn2e0zDc9 zVF;|52HI??3%v&fWHIQL2hhSu@Gt{-(iWAcfR_vEpn+!gL5ebyAtYEwW-^QdyAS>3 zDo|$vw5CV_{T!g;jGWX8h2oMTh0?st3f=sI5^#?U(w!>E$%M>{pjZS86}T*ncyHoQvq(5=NDD#7L+DIt_xKtF38Bts{k#}f%F4G9?*p} z;87GpOu{Auw-k%%cyxglcB8CVKpG2yXalXP0uO_LLsbuS*bTzr5G81WP^S4~}ddD*Fz#d^q>7GWJ8S3sT^0!_|=?^7*G1mTY8fVWA5Nai|U` z52gV-7t}2T9miCZmTYWnY^e(xsx2-7oq&rj05S(v2^Nvc#N=d9zYlcbAcm3Ptb-wn zX$n{!E@5!%qBJkF1XBU1r3dm)QBHDEPO<_FXXh3r=YZPKpee(m{KPyERzMKwISLer z#mSlAL%E>+S8qkD4$U6O${A3V~up16m>poPuqqv8x&YKX0WAp!sQ@P|5Ch2;aN7;Zo6w>aUPQudfQPLSSTiWhz=dvp za&}REa<&43fG>aqr9yZC16m^oy2czXkXiv=)&%E+JBuLKf)1_&nFfw(5Cd#Bn1{rI zHE8mavq9kqo;S!(&eknYO+x4?Pfdbo0Wpk|a#IvQgl=j@i7sdXwQf>QesXp(LNFyY zEi*3@G%%|RT6PCs_zYTqR9c{r13EteWHQK!pd|uD`MIE0OKK6Ep@4-23MWtx7j&Q| z2rD26Q1F0SA7G~!B%37X6oE<5x)Br5+yR6KJ!uVg0#-8UU>ax&1CQs!u8_jaJh1ct z%D4HYC7_XPaJva?E;u|qL0`Lsfu023jZ!TI2%4AmKs?fs~p+e#AVd z57hikEiO(>PX&z+gGN!H)9t8>V39Kp`1nWg3=8-SLU^iyuQZ3`D)910P-_c3npu!s z2=+)Z+<_1-*qKl!*oC+q1X;ER)(@KB2Nffr(=3Y$a*GOb6<`>iTR@#~aLc(^Au}&6 z6?8wEE@WY5PGW9SN+R^+N6-Wf2dE8DQdFVH&%_}K}GZe6~(3_y3 zS`pm9glUJ*hhfnTmqQqh5JEQ@p$6n&aF#Dg2TyMnL1_g{26_rWDUqPzlb%xyS||$| zNG}F8GQd;3P$Ts~N9bZ03l@dj2H}CD57{WVJm{F-tbCB8K`rE>(&X&o#N=!kt$@J* zxdF7)4JH9jA21GFIam}250sg~(;wjZ643B*PO$Zv~RFD)yxD& zD_}4{&Xxn;JD!qXVg$NOvcyOMl>!FDS$3LM&T&n<3VnF0Uex+ z?2O{d;*`_^&=u_96algWbQ(X@AjoQF6b{S|h!h%+fa%ahxS+xhbnJAoE-W4pECuXL zQ1=y7{(x$=VqK`C;SA6P?QnlUB|)hR)J`sj5I6UGRn&1WN%2vmht41isW6WHV@F5v&%}PJlBY+Cf4{EU?W;^&PD0 zhR*$i!U{An12+WRl7sV*41$Y+RUjllX%Ey41j(0Ff-c}p%q>RYfYrjK(0EAM8|+l% zmItVL1Deo4F%4`z@fJXoLmEdY=791rsK*Ss>j^?aQ#zCabtyo#eQ{!5N@5P^;4wXD zT?=l)VHH)tt{9gv$jhJr1PzQ9C+20ARDu?`mlmg@a6q~dQfNH%00a$y6@l*82DN@5 zZF!_}7%3${LK@QY0WYovjfKII2e{1)s{28s6ex~?1Sqmw(Hw-S8W#FU{sX0AaH#;> zwt(2bfQ1E$E6~c4;w0VV^h5}$fJz~P0hGhQV32K|t_u zL=N}}HjI6kpnzBeD%z40a|&{b!K4Bzh1y9<&PdDyud@c7j$md2N)zDI%TrR5GjkJj ziea0?5Qi$~gRZs*HS85Y_vhrNfQ}Oabxun%^Yg%kGI;0~W$Om&NCId~H8U?Ad`kmp zq5;(Ff;dqxDYGOkGcUCQ!bNpBToNh_ibl{@1&CU`l%z}u3n~qzK;qzSO%O?tCU7Kz zLq;#NC>bISRSl&;;-HYoEJ}uofT9p|LnB1BUUpGpc4{7k162W~pi)pCsMUewz1#vE zUIR%e6crakwV{PdL4HntUM3E$FiEIZ4h9AWa85`rN=?j7Eh>i6pm_wa0D=KZ)S%)W z)Ut*t1Gj&QVLZ56h%h=AWB~fw99X9vW&|iff|`|}BWRNnAtcD0%%nsZ1=`V&p9dO= z)`g5xq!t$?7ASz(y2Ys#1)xv_*FnienMsKdw}6>Y6Tl)UY-kr9VjU<*K!Y7%UQ$jf zjE3k)%1K2qz@4bv)ZF~cD)5R&1+W0p{%TO=3BHg8A_Hz*f$~8jD1m@$U68|)a#A6s zAe4i!0A@E>8hVsD+R{^)5>QJAG+GPd7nI~cDX>umB{^^!y>!6nMZtTBDXD3oPH$p* zDkz+b6*BX4GLsbYi$O;cV(HbwN_yloMd8Z8Hy(nPoP!2Lp-zJ@xQ6m!PK1kN3V>4( zOgU_tB{M&-7*yCo=iM?3N^-#E3QQf828+Rs1jPirc!bnyP<5czBItOG;*=aC@R_IJ zvu%n%*NGPCrX=AIRv=Xz;+2#fBT&47E5(!?qwLHQkU80zC1CTAX{2~V9O{N1MIggi<--hyi(?8PS%q#vdJf1^oruj1pxh2xn_irnT$Ea(Tb7tpnhLs+1;J53kwWExbb}Ul7K4@-rb3tC zqi{g#LDO821=VOg$fXCMp#{*fe#QA|CEy*ssb%>&rQk|9Co>6j(L-@+jsk93d{W>b z01@C-l%N8mxU#q;H5b$`xdBQTIPC;oI98CK2O37wFHS8=EXV}4lE`%kR?|>Mra=u^ zU2x(7kC;L-K4{S<=+2j1(Cw?xaW9x6v;rNzAQyDrL{eg2I%qy31*2I7+mDLckO8Ft z(1{(m16jYQG*36BG`Bz(biQsX*)f7<4(Ki%aK{68Jb)|)O&IDzI`ov;jARffXYw#I zFyQesXk4Fs`#`#hh~gYbh(b2DgEz86XH)S-K6LOJJq;iaHpAL4#H9yl`#31Hpe)5fC0k20nua zRt@TVDT67ZK%5YyvkSl7B0sNK*HF&@)OG-mn?bjcBis+J zQHV1dQx#Y<7Kedas@kB;1u8jHOLM^`XliLLd^-<AU`;M7(OVWX;p z$UwzFtrE~Ofnvy-ciobFP!|`OqktlX#sgj1T%4Gg3>ta`5BH^3kE6zv+(;yY73{c#Fj_L%d z$S;SGU{(3$FbXLIKxTu+89*!H(sLBRlS!a18feFVI_S7}$bd?*LVi(ZdS)K_p6jy2 zqO5#ScLP*R6=$TT7UZNtDFrkd6uF@03RD;p@lX!BT8N}VYJM?H1~eE4I=B@)pI87o zzz%e;1Bd}qk&}bQ!svn~fkvlu!DopwEa0)UX zjbS=;-2l?aC0bzwD>sTW)AJH@z{Ley&DR2x!+zpwiNzMTuu4rbWkdj)Fn37+l02*%8&CCZMSO6VZMr%oc z91EIaMVe$oVuEZeh0eX9u)%i2GZ|9wKwB-4nK_W*paav3GfLCaazIOx@{pJcxY%IB zb2BRvL01nzY2CD(#AF2+C%3>D&MwO@O3EyTjx~VNBIuM{@WQZE-9*q>YB352wi^*5 zg~kKhjGhQUW`f5HGC^BtK|TDm%yg)k$@zI{ndvZ7u=2oWf`+$26LO%|1?Z4G6z$*y zfg*xxAXpxo5ZGw&R3fS@Xp9eZSSZX)&_=Vop1}$R)M+Te^ zGXakPXhINPG(e}IK+`Os9r!TgK__3sR^cNoK^28tMVv5}GC8-jBm?9zq&R}DtAHg| zI3H#k9szJNKu@(;Zy^FDK~QoAt?Gw*IVT@`U;J0%*T*KBzc{Br8=K1YcyfA z6g2b?p7w!A7NsXa{acit1Tz_p2{IED72rWms5bDbYM4$i2d)_#4`c+WiieC$AoVms zO9DabuOLQ27HjLKq~_*B1au)HSj~n=ffa*{Mp>4ZoTFQwk&m(v9K}G8wTSEwH3`(` zMp1>&T99H?c~El`+)IK45pr4rvtg>SaKO7R!6UiQOBXS-2;{0`P%{TS`wq6F1mfBf zsL2Q#6x<-^faiE1O2NxO(A0y)V45Kum`?C?4MZoTGYw(G6vJq+9E<}hC%|nNkXodr z&R|=S_z?AY1< zxdoupDnRle8f+*kBdY*1pbu(sL((GXh(YLKm8mJZ$;mm8^W0E`6o?c9IRxCa%Pi0Z z?Yl3A(h8Uiw4*~5ptrGuvOH+19ZUl_h+rJJFbx!l9F?D(^KzA|T9?k~A;_ zJXL|R<^`>11ZrD>4!D6>51$!GR+y~JC@)Nkjot;@wP+1Hn6;LRUh2WG7 zmeVZ)9j;fDS_Dx8=R)=1=7XXRst8oxfoGAj!FR|NLnx3W=t?;_jpSCaX86j*;*z4$ z1DU_!s73U{sr z*Mg9N=tH#yvPB2g>-u0ph-%ajC@ukCd{~Tb2TUBI2h^ej4-0`^2AY9JR}T_{s09t7 zfVQ6$=O!j+XC)?Q!x;+LSm^m0yygdbTNZex3%p1NsW}N6jRmbp0bQUB@(Xyq5zH=d zQxS_bU~z=~5H2V^fN~XRR1SPkBiKGrqY}}LK1QH+O(KuQa6c7&|zg=R`5gF$0| z;H5perRl}FrRfR?0u&TzQ=p)_0CcfXah_goVjhH4K&3#sK+3=)W_gL(sl~-$QUR61 z5yhaO2PGTGDk`L@a%kTMGJ}!|vH)D3=Ou#bBrplGprD`Dlq1~Z}B!6GPZ#366!i+-T(Ca7vqX#;M5=Oq?p7lR0pL{T;}sS9eBf=}rN7a5>b z1UlLotXelQJvA>S5zL0@fr?<|lvZTsWF~@krzR$6C#HkOz(H2(rhukwpgKT1NTAGO z$Ych%-vJuU2M-#7H6&t~gyI4WS*U@S+CT*lI7@(y1-k>;B(MNfGcp^~AgCgc>p?{g zc+3o9WEd2t^6R9#9h*v~2?H z3SHP3E=VCn9wvm9hu2}Cdg>@B?}H3OOD163phlu5Abf(5Wpfm%zngnbtXjfSQm<6=}qym$PX&@*ygBRk0oeSDWhmuOb0x)y(6H|&oO=0k8 z9aud)NRX|D3qtjw^D!L(RfyzfA7u*vf+JbY#mAk$_-<;ukdIN_n7l zEU87H4azV(pvz0Z_93%jdZA*V7=n~Gxsc;g;O>J}Gf;7`L0|%^6Vwla)VH|>x}}*2 zeWjTYWl$PaAA;LF;H4O_1sPzD0+ffP!i9{=Ayu-F+5u_JJ9O7Fe9{PX-T}lsaBB&| zgxLV$fhCZauz(tG#o$&Hbf^y8c*8PMht$AAFm+Q(L1#kd=Rs`&r6=%G5U}UK;a3c? z7^(nDL1f^^|ASS7;sLbR543tGr6@Bm8_obP2LlTsvB2pM)O%FO0bl3?vKqXYH$Nvc zMK?7sJu@%07>TWbn}ZhkplAipTIQGLrKDCALns9_8q|^imtgs&B^kva0;B?TyeXIs zb{?#c1MUAQz|(kXX=VzjngXZ0g2a-{#2j7FwOGZV!>`~R1w1@ZGZZ{*gREOGFAtvy zAZb)H!6HcBhc@64OUjU(2I?Gw`^D%sf>#XSaVp3Xuo_IeA;L%wKy653bqA&?pyCp| z)(ypFps`?lt^&!UnFSVtIsrv1sNx5m#sxa*0kSp&yqFQPaIPRV8C^^Pn?me@NS+6$ z861PE*bIaNpKwmWQlV*s1uqEYBOPT8z{hwiFX)SId)e; zq`)Bvk3h_L0mWk@vSW~s8G$(vNep2ZK|zer03Bvrk_tJd478!OxF8XJ*9UwW5xTsn zvLIEr2vn7TN6fJ}1e{Ue0Y%6$VAWXN4w1ncOh|@;$~I7T2VYPKCP0RP+VP;962W6Z zpyC$PM*+*~g9g-dQo(Fwl~8ebV-KV|IU_YW8>|w{f+)veB84Wb5Czo_pz|o;i~8UU z1#B!N6Tseu8H2LQtRS%nHZTENX#_r&8Xh;un+rgL*5E!4Y(=3yXmdRDk|S)^!^Myl zg8I*(gA+ifJ|G+o3QBOz1vk5(7_J?m48hVbC`KMqK}dkwx8Sw6aFf8<0>5EkB`7X~ zWgzHEKZN<9ju~j9GU}{7Di3Xa2s#%O7oc1SDX)?DhJpw3i%BsIq65C56lK&Ml!U=f zElDgYE-om_%q!6ao%mV|8jdf5ks#NAybf;kKv&>`mWF|v0N@$D5?zo~F@#b;r$O35 zjl1cfBBdk|w8RNag6t>&?cIU!K+2%|Y2c|aIVZC~0dcTKG1lq!oW#8JQqYJZ=vWR= zoR?&PN)qUtWHH!u$dMi3wqX&}Uih$3QEGC2QA%cBI;e)c19v2{7KkA*jUanKyI_k! zT}VvhG4fP?9%zq2D)eSAa1%x$8H=E9N-AW~zqAO{1;wfaX?rTcfPsuN=NCaom-CB2 zt7|_$+WQ3RAb|}7m9F4jTVNh$oTAzR8)1e=Im|Ll36QNI!@=vWA%=q% z(Szn>N{doK2PIULpc;-L4Ko~50%SNiEth2GfOAm#6+i`gW=SO|Sr#!cFeDa$PDlmUGEj{O z0R<#Ua4!fmy`$`x%}J~RtsMbfv#yW_JMtm92z0(VbUG4dyFz(pUP^vBXa^f;q!7s- z*jxwb%HW)Q-SYgRoD>X)VN--4;+a9IdVi_p{nG7mJ53O)(6 zsuE%zlmluagOe9H_%TXzs6n9GqL+bz0lbdC1k{dAFUm~O1@(tYQlWu@T@JGJA43ar zqJnrOGZ)lBf!e2l5j~JR2C+~#IU_MMPXTNwXfhqVZx#jQ66nx0l(2zVgd(JX$^%;qIn)*8Mo@_4CYHc6A%v{}r9g^7 z2?SKmL31C(1}Fz!;D8i@`nW}@sTH8P70_@4s8oNjtfTDdVqC$b1ECc)AuITDl$ zA@e>UIRy{_o&kbIB&a$BZ8L(J2G6M|cECkp_8f&{dn z2vn@2ssd|=mCQKpgekygH(UKzBW+<>!@Pvl~?fT6+gg5*&e` zU7|&)si1S~jKFiA$vLn@1ZqlvdRQpI0I?KB2sPzH(gk`46x785-Jk)^=8$v=F$qZk zIniPU8fsu6N@mm$g1H@H7ARSQ_BKI!I1mdVY-lqV;#f#^4{45o$_4P|)$+u=Y*;rK zi49qq43$9TfWs4`WJX_Z2p*e(tpfo~rDuSO2_zdJ-Bct26kEWuSVXW}j=u2%WGaeg z(EJ#9=RQbAH@PUa9PB{f{Sbd zLKLhBK4=No3mV}AC+~{FoZ^bY90de{UR#2;&{pP^Bv$Aq=H=xh?&t*d5^@vKC)Z%k z1{Ea5pz#z??-67;IJ!U#uvK6l5)15Q@L)8`P;o_J4hI7R19&NAWpW~Db9ph8R={Ln zad}#4RTZdR2U*Dk>KMUq76xx&LcT5%|6$l%s%;2QmWNEDET61~nT>5DkV0Km4^6`mN)Mb!Km|W&C?8@9I8ursY^eDV zAyf|7F7U=)P+|iuV}ob`HUB`1SxXXgl5@a>0y2q|j=&})m1gFo1*}iExF8ig`&JB^ zeaivexC?SPL?yB$hFS2OWdunp|3PDie1+fLxtOK(ksvsmdSP7a7N`Ro@_mac{ za7G5}Lg6Uj;enz9)E_NLEJ{xV6AH*AC=Ng_ZDL?xC`nBPg+*$r5rUC9sqLI{BrjC^a2)R3~EI4QbT}tjI*%m;e)j?(hc{{h-ncVLim#a3>-;3@n4e zhc2f;7yv4nLA6;)YEE8i2`CG}7z%J9Bo=JI9aLO^h8Igxa|?13OHyI90wx0~R6yYh zS}l^8n_7}ulv#ze%m_K@<8PRXtM~^(4tCR z(7I|=9?USPBsv!<7%>V^P)8vVysr>aK!NHius1EGH>| zmUiW&f~T)Q13)k>;Gl$Y;QGO$Xgnl$CFkg7q!y*7;Gr@={CmQZiFA z!7JhO67@>ba!b;36|e|n6$6Jc7R7qtSwn0R#i=Ew1)$Ll(1&E7LJ%|h_3_!tI2uf2Ksk+Je#U;A=X}Wp&B^jA{=_Qy# z3dD*br5cbepedwc@Jv;K0=P8?p6oy*9!RbM4bp)2vVzur6% z%!C!YAj6^JDf!8uAqa4xn*rKZqzgKn3$o1v%v8X|PAtkxEzZQ4Z3Q(aKQcr^reDI7L|b>NjlIpqtx*`O90 zsEYtP0$&$=1zTBS4hlyB9}kj-V0UUEk|ZeBz|Hc^+|(l7@{H6}u%S>U*hp+_uyN=C z2wLL=x>*$D4yY#hWhO{s$cDn@u?u3g23aX6M@$6e=FGgr#1aspfJ~yS-~wIrQj(er zT2GhOz6WE#X?gqo{Bml4`gZ zSOsjH6)p-2U(gA8Z~^Fq0XiRHB2)pU0CLg=t$#=?F3wMe_EunP1i{x3fwLdTV$fbp zutnf4CMCM%MTrIIe26_r3NQt5oRo}_ydi^V@Kg@Jw-^-b;NCST*pX}kCrHxW1J;JT z8U$9dq8Se=(ZFrcqSVxsB+$;rlq3aI3Umc>aef{sBZA9zuu8p@{A3hmAOWaGFcVY^ zrRIVAT3`(@IZ*2pd@%=T0UN{waFQ*Cuu+tua^MLU-VI(Md zg4#l${dQm_;PAjy2oVO`Qw$0U&;>D&(jP)X;|WHAjD@oGk`i-r67y1w3=GUb0~CqIRo8HP|}5zNf0|z^O7?_jRc4)xbZMy zOaT-tP*NpaEy9POwjgMW1H^Q_B$%F1z9 zd8AkZk36AT2o{1F0pUQx6V{c0D2Ih9XxtGz>;ef>#Hs5LWiW#f;#fq$=A)O6pgtvd z1O=u6Vqgv^Ie}+0(2wc?NXSLZ~?fH z_(VWPg33Tn5zY*2u7fFQx93wIBwivaEn!6iUP(N!XB1apxL z#?A-X016h+oF`l_tmwfIKo|#8f<*+aAOMXlfwuU-4FlbdSpvEb4Yb*z47B$@2_b|q zkAN7+;c&&E(M?@Yt(2Hs3>qdY1-H*3=?2Mga99&-D?~Be3JhaVatvw*2#Z%ig&0a0 zgXZ4g>OdTXO;~u~39rn&vixN5I(@j>)C%xiFlcWnieX^Kqlmz@fam4F^4Nr+B>;+6 zP!$O}J_{xYnt9Ai&4C9bj1M;tw*W?`2WBQ{ASA!E1e6p(yN+SPpiQGm`H4j-7y<~( zaxx3RO0bB46A7p%4$7v8Is{bALp6Z|f(XOG>M(792!pLb3pu#UK`{?$qe0Rmcmq7b zM&!#jz*0z-faE}CgCYPl+6>o~pIcCrT8xMQC?BB}rvP&1EK1JEEK3C+rlL@uk(r#K zP?cE#YCmJM3+z*L2VhtTR)s?pJ%FHY1T~33M-(B<&MV2xD+Q->Y+^{JBNSp61ce=J zBNogk$V#`&RB$-~I%*##0UGdv*$eJoVUxga4>pxxBM?0_Xx!%`oD2$R(A69;%_*r# zrRktixZ-@!!T%5qD1vayi4g@=*B~pv%NC$@1j;B1+}`};QusDggcU@HBHC7^G>U{bft5OiZ}L1GDdQh`|qDiIOw=p4xXWuVz2xD!AZnt=om zw&4~5wHlDCA;_*lctHZ?!cD@(2WKo$QyO^=50sG+y|)})sAjOAVUC50p<4h}gIy48 z6eLE)jxB^8;G2k1uIWOugH%aSpn;+qyp|W5A;4EoC6^%C2--G=YzbCA zmI?zpClB721=^36nO}gYKR~Gfbif*#J>XD76GOKftOmOvM(Bb@8cRSihv;wQz>o2P z*#le52sabA04T&jjReRj7Nit|sRp|Xo=0G!7=}WW;Sxp;N6>&8sC-rc5xVI``DLj& z3PqriQdEmUc^|no1X@|43%ZO8?!ipZy>7_2bHSA$+yPeu@*}vm2dzLsuH)gFz?Bxl zr*NG_*ay*yUW&m@2Bk*i?h16R5zJsH7w%|We2^DF1v7Gk7pfNG01^#^XhIHqsA-^N z44$EY<{so82HXy$wGIfE6BGpb0n|wWubRPPJUAT@Z3kF2R@)&mAltA?gQj!Sk?J?l z>HOfK1khQ3;N!jE1t}IOxRIpFf!%|8<_&1L1-XTsQBqO>^FN4&7nxat~XsIi zCl;lEjyNhxOwK4RK{QVgZUAKrD}q4`arGBG(BRQrP0@1DS5lzt2 z1C)ER;l`jT$0ZKRy`WQq5VmCIK`&XsB7|fLTp3m|aD1W1KlGju$kkGCZLqcss4hSZ z7w3Sk7|+O00rgChGV{Paad=M1O)Wu}f*VJw9N49ZUL^WRNp5B?_^cD~7$KO0un8oE z#sirKO6JJLL~br3nS!&?e^M4^czEFxM0 zyZD^qgO9$|B5Ht~ol4j712RCS7y3idNm(GwxHc7*)TUE3BipeBnFOaj68}~Bf>0zM?NSqBKIhfYyn3UOaqcQu`UAZM~`SE zb3o-Vcqu+C9Fj{?LFWsijN|7c3nFYLEQ;RR2CcNwO)APSFHS9jd#WHc4l zm4TXv$RiUVpGOF&&Wt(1bCphAPJ?judY&Ps1uexE@eE!BQD$00+73 zN3$PkRy7BHSRny7fc3yF!)73Q9z;_E3aVwuL6x7MlbWKNl30=mTAK&+7igI=k}$$X zROL9uL9v3d_!zVnE+r`wy^g}#a7QXS;FiG4G0GZMYU1YTYXGY`yx8-|Ssie*s83Und`iY{;|gCc@z z4p<(W5XeN-32U&uplCs!L4@4>47UJs6EuD<*kp_vGa0;25^?q-D9VtBnILy2zzZ=b z7vXa7wPT>gPLSROOdezzs8s{nZUJ{zaRw3-VMK8T3LB&qSwJ@@GpV>Z!wA%n0PpmJ z#(r^e222Wvu`p?Dra>m3A@?bvhXE*?f>!6E4H>{}K_1D1jU#}PCi1iZ$Z??lFHBD{ zswdH+zc>RT0QNexYC_TpDzd;^OJF{SoMi~wA_iF>2@QKxVT7-V6i4J+Pyj$ys37_l zpx$0GUb-&KJz&4Uoll(QU_H2843R`~9=LZ4a!^?+YWEY(C7|35 z-p&gPIMA^LaF>BN2rIGhz|nz`V_-e_vecra{NhwlDhFK@3NyAO8D3hJBNgBohcqZB0>rMXFYiJ9;oH(UUr3#J5%2si{l z4M6l_0lL}%?%d4W)cjJ!_&Zb@VIou>WF9C|z#9pnkpfZ+uM)r<6m3OlJdhDsD%Om| zyd3m;73Mm4wFxS!k*iIxZQzDGOet6d%|;YCuxj)s23QxUh(@g1%mHuADgq@)aPJ$e z1W`_6<$^*6yqN+PGL?`sM&MOog)O=xN=wpo zE#RhrI0!>9d7wfXdH4XV8=QLKApsV`X9h$$stQoLMy&sX+_ww9QV!uV^qn&BSVuAm zrUt1j0r?rrpeks70ld)}8W&}WMVa8G@kyC^pyScu-ocQ7TStlv*cGteD~6vy+hvgF z)i6v3r%ISM3|Vqq1U3;ponx2`8YKX4M1qD=c_yNc2eIKcV{kBamcUyFpp8jLI!h4k z1CR`8`8Q;-Kcw0#het&@B7dPW!J!N7>p@y5p!9@1^jcmFUC0j$L=*#{atJrUR6|-3 zpcA~ocebM6!wM=jk!Og?i@|9dyB(nB0|DfRq5rJug@WAregrETlK3N(?KWOA657C&(Owt1{YcI{q zOoOcjMG-?X9H9`qAd<&%oNfSd31lHX_%auy@dOlG!Ty4%&OwpDYBN|h9vRdoCW?8W zeQuy3(vtGDN)T2+5YX)x(3`11n-swF3ZRQ z9O_w6^9o$6fvo|148<<62-IE(8*CNKhhSYGr-HZpgLp+??L`nRa0=b25Zh5KF9I8n zq8ls%H3`DTu)GLlIp|>5(!>f~LlX$8fJ%Wip)4(f>=Oc652{Qds=-AEgbCFT7C~Wy zO@j4p!AE#NX2u}eKwDL`7#J8pJWDVE)@%tS!J4r+161IG7KVX!fb9gcAiBVOWG2`Y z98RzV83o!ySDKVrSejXqUs{Y{DPU)U%ma;`f;IpnRDhQGC6^WzrRJ3&1d&WYlE)zm zG8eNQi7*TlSfE`TrJ&vJy-!{}>kiX$#AP#7EAZSnlq!zTgAO)%r5;$;CP;fwcu;6{P zAb%QLSm=T#A_pgFyTCoZ$kRS>wsX*;O zkXN90(1Uu7;N}sOkHH2nq=JWIW_|%!2Z8{Z1A$4;rLF|mmg480&@T)?0Zc%a$D1Cxf zNJ4ajgSr^Ph8hSFLgj!BFDiiwf)WI1Q6EH`Zhlc3f(2Cq5=3SqI}CJBL3&YYabb=w zr2VRZ;Yg5wLEX>Nyv*dBN(iZdO2O}v#BAPy#v(vt3A$nzC>PL_bIf!2+dv&^qhVyiCw_tcf|G@;fav9i0!-fuaCY037b{ zViq#A4!!^t6pNrVTAG(xp$poem7fRlC7ca13Ofhn7toGmm`=F1Vz?e;7RUvlmOp6Z z8?FVCMBrS6Mu-FkA7ltZ5af2y@GtW86Ea%?HwSDGJUmdh*`QZipk5K^GB{+@z=b)o z0E%5;Su7%8TcM3GWX+(00yJ7yT9l((lv)lt!x@RGfP)P>&jz%UtrW6J9ZD&n)1VCq zsTCzTDCbK-T5_NfgEU}GUhAsG%y0k}X0 zE!>2vgjx)$C_oD<;ln3-kV+H0ZXT;3^z7cu)M8|%I7HEli=5OF&=qFI3VE5J!T?gT(cLM{%>1YO01RS?Ok zNJ?>tq6HTybU@3Duo?{Z7giY@hGSI=HU&2DgH;8n#|%2{9bFQ%y&anvhV3AQ*aeZi z3u*{}2H`+!b+DNVb|*Fo>?UJV2{r;tLI7Ef)f7>(%SU0-_Yz!&`@Uu3Ly-TN!}9rvScHB_%((7{UTwatmdFkMk{7K(E+9UE$(X zU2r=9-0oB;ODqNrKY^|R%LOgdP6i(Z0a~a8cAj2lE@;3F%!W7;DuT)Zdl`L8Ie4E4 z)M=nIi$GVufZ7|mi3&v}>7YxJGW0+rsp#bk*fLNB32L^2Ip7#51~Z}df=cmX6gI>O zkSo(rjR)%k%^iX_52qHF=wW&qQv`e>Ar_T5#W9Tljog8%BTN}g5iAjbMF^CBKrL1(}dg0A=&C)S|q^LP)fk!7hxC8-q<5~Q>wwE{+g&I8QP10P_BV1gPbxdjRZ zIiPKUC8-slJPPV+K}-O*wjfNXDPR#4HnfESQ3Y}aXhg6qy&xyQ1VSpHQlJO`4Pih= zbaWvj8961{Ae%wS6QUYy4}^)TA1nbmt^?HVf=Ys_0+0b^`MG8Jxe8DW%37e#O?hHT zY7v-FKqkR10iOa?oLrPyPy(tn3>X<0%2SiTx0}Ie1xyCYA$ibC1~HN{=HbhrJrE$j zLp+_Fqg$Slk32z_rdyhql3G*@-mwWf7#qIuKmj_%13C^3oW8(yFX;3~VvID{N59;NDR*=EMMHig-U_3;)fQ8YyD5(sTU_mG5!}RJ_mS)1( zNE%BsQ8_4PfC@ZN^--LeTac3qx^*rcW(0h!7q+z{DJMT2g$+{)8tDbi5yJSo;ITPf zQ09aSrB)<@Y(Ppg2t^3@A&H^H2+SBXl?X1RECD4z&A`oI+>mll`g=fb%dZUIXpIR?UqWe(^RHe4Rg(9KQF%`d7%@F50+ ztOvEy;r2n4!MPAs2wf0q3_iTygf)_(^%1Cb4q6lkH#|2#uOzjqG&d10f?*v@1(J<$ zA-HygBt$uE7NsV`c@RYiO<-AcF6_D>G)ahFP__iMq2We?hRGq<`ND-D zDv^wZ-}sAF3}FIX8qR=*AIR1oYpxPNDb%X7JHx{rv1F0Z| zC`WDsVh;#VMg|Q|p_F8x!6x1E%#`%h5}0dsk;D)#Cn$*2#etawof-wDbkLpxm@v3q zfbbv4T}a-+%0)69+Temt=D}87fR6IcOsNE)dXkX}n^6T1Rl%%9_ytmWA^6Y`gegQ0 z08mp7v_=Vi?Gid4WEgbxIHd?QOM@u@t9VhA!PZWpn};;qJQI?eP_=PK z3Wq4zHP~8OAU$R#3aMqFY4FtCOwhS*@T)1nw>QG=Re-mjP)G7X{d>?grf`MONlvI| z(Sts;N!`_1oWgC2pd|+6eN~pK-TtyM@K=H!!?0j2~iCu!F-4z5GHhR11t#&M2NHV z(=tA9d$np4~0u?+c0n-B>s>fymTnwxNG&%vAW>3q{*DcS? zNdaNF(V2N^sYOMpDbVx!6<~@G43J9{@aX{!{)1Z_nK>!A%*Cf4ui^M5L2d&LX4Zp} zC?4y<;XoTVfQ^RD1>my+G`IupV9&#lPI-&?X-vB>UNde3S%{Ua~XXcfFmN8q~N!5(GEYvvrY0K!zxk=jVe4;^%>42ci|E z9fZ+K4~+H;XbuBhUcyd1gSZ5_MFlQj!EM;ge1)9UG6ir;usAods6;oZG%YQ)2>m*D z#MQI#5&+U*EX&UYRi~ikcjftzRfix~!q^~>KnfJFw;)ad_4X7%r?G)#LGv7)5N~E@ zrk3aDXJ@8@#E~crFDE9Y<|rhAj(1GTEJ{IKpQ4)x-e3XSX`x$O3|h0Ni#&L&kdm)k zS_JBcgD&I*hXG1xfJ34zKNnQlfUAi7qLjSU5>VSJFSSGgod){~wbc)*9YAxl<@rU~ z`JloFbhi--2V@FD3XKOg5fq2IpjqMMjKs`5P;V8q#{tC3fSQ<~CAsCL z<*AuqLIIfsdpi-_K>$tbfTwq$r#`@YSGgsiMVg>iAGie$G6+68i)kw3i<=f?tfxR=~*tMFQvo17rod&}m9!F%%PE3a|@8b)!fsROo?L7!{W! z7QtczA%b8bDMMm{@)Bq{Nkw8&QDP;8R6wQRQw+(V#cr^jZZMaCMoi$-t)M}1&@>{% z0B|mbFrh|*MNrt_nG=W_P;`Te!iv=7l6)|sfJB141}Y@MSJo!xCZ!}ISPIyg-~#;);r#;tB->0d^Sbiph%HoMO-+&!G4KrJD-y4qOPSfI@-NBd84w5d>RX3}K_H zgUCR|KoJAlvQ?3rqYE9GKw>K3VuKwD3PIQuAgGK3b>Ki6a`OwI6j*<5egT|D8ayx7 zt;hv0bZ%f^V5rE=(F3g`0JZCo*&vN@2~-YxNseSRD3)}KOA6r2|3TTHAg8og0dzk& zq6JxuKGj+Q>Xw3K~nnQgMo@cOo##y z3n~aIR3UTam`N4XbOi0J04oPo&L9So2_PXb7gY3uHY|YT^+9U}z{wKC151MmggC6% z1d@m6gaVLZpnFP-OB7HjP+|lPFjW+nCKaa^LMa6_8kAo^i!-3Y5c?rIU`oMas2q%~ z4p8l&Lc|M{l1qy+Q*&|>E13b6^y702dUAurv>fOiF)%PxB_`*9umXZ0 z!X#~I3l22;Xl8;)!^yBK+fWlTQpN;bj#pTkTAEs{2c6Uf^Pnx=f*jDb7paA%p!pbh zixzXS25g27Jb(@z0R;I76x3CT<;5VZfFKZqu+XLps`FqC8BnqV6<8pRpaK;{gG~W( z5DZWP14RmGw^vnCX>w+1E|gM0rwIln%sq)kso=@Q%qsA4g9_=Xd60uLixqMbi%ZgS zk!Y-E4rB^G4l7bQZM1cBQ0d3pKZ3j(3#SYmOBZf3p$C`an1=7Aao3b~0D1<4AK zg$tl53s9>W$u4lwfW$|32UreM05t|71qqS~piUa7<5-nhP?cE#s`J4ZdSXltxa$F3 zA%rc@fwY4T)UC>_s>-ZVfMMid0F4kKuULX5B6zBWpZyGvjhxJ+s+`Ou1vmjpaG+K? zXxU?GMP?d|2Cstz3BVbk^ad)0K`Kg0zzQMjBw_0%!8FJw&^QZd`6LK~*HJ(c9KEDVg2d3X0rU}0d~_x-rE8v_I5 z&n&K64-xKRR4gm(JOc72)V$^O{nuYX*w{$M=lKb#P6+)lHH=)>qTd{a@enklW>22( z9|i_S*SJH$-7E}@+-tM$hp;g)wkUX>-iz=DOb6p?zmVU?Nd9ru(GHeI*vGi~zItCJ z69c1tI@{b|nEGMnz-Xq{ROLk*SQ(gJE$Yn7Vqsu9n)%}Bd{zdgb?xcWzKje^txIp# z-(X~5x;m|>@i`(K;QF=mYqF{l_QS+sG*h>MZ0>ai2BzokwaZ`Ojz=b~ZtmUdu$cdT zwYAJ{CI%)(*87>45dManf8CVZJOPV72KRse?qaHk>4VWstzFej1`G^LPS>J^^qCl# z8js|kEM#I}aw?kiV+u0^(~J_+qUFpC%zye<{>9^dn0YXodD*WsMe?i+%;!IUs83^L zVD{j79%0DLzR+ZlLGijjdibn(hSn!4-X2{ALU?4PO88N|%M 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 - :key #'preference)) - ;; FIXME: find-asdf-system-file does another find-system - ;; behind the scenes. Bogus. Should be a better way to go - ;; from system object to system file. - (let* ((system-file (find-asdf-system-file (name system))) - (enough (and system-file (enough-namestring system-file - output-file))) - (native (and enough (native-namestring enough)))) - (when (and native (not (gethash native already-seen))) - (setf (gethash native already-seen) native) - (format stream "~A~%" native))))))) - (probe-file output-file)) - -(defun where-is-system (name) - "Return the pathname to the source directory of ASDF system with the -given NAME, or NIL if no system by that name can be found known." - (let ((system (asdf:find-system name nil))) - (when system - (asdf:system-source-directory system)))) diff --git a/sbcl/.quicklisp/quicklisp/config.lisp b/sbcl/.quicklisp/quicklisp/config.lisp deleted file mode 100644 index fd94790..0000000 --- a/sbcl/.quicklisp/quicklisp/config.lisp +++ /dev/null @@ -1,40 +0,0 @@ -;;;; config.lisp - -(in-package #:ql-config) - -(defun config-value-file-pathname (path) - (let ((bad-position (position #\Space path))) - (when bad-position - (error "Space not allowed at position ~D in ~S" - bad-position - path))) - (let* ((space-path (substitute #\Space #\/ path)) - (split (split-spaces space-path)) - (directory-parts (butlast split)) - (name (first (last split))) - (base (qmerge "config/"))) - (merge-pathnames - (make-pathname :name name - :type "txt" - :directory (list* :relative directory-parts)) - base))) - -(defun config-value (path) - (let ((file (config-value-file-pathname path))) - (with-open-file (stream file :if-does-not-exist nil) - (when stream - (values (read-line stream nil)))))) - -(defun (setf config-value) (new-value path) - (let ((file (config-value-file-pathname path))) - (typecase new-value - (null - (delete-file-if-exists file)) - (string - (ensure-directories-exist file) - (with-open-file (stream file :direction :output - :if-does-not-exist :create - :if-exists :rename-and-delete) - (write-line new-value stream))) - (t - (error "Bad config value ~S; must be a string or NIL" new-value))))) diff --git a/sbcl/.quicklisp/quicklisp/deflate.lisp b/sbcl/.quicklisp/quicklisp/deflate.lisp deleted file mode 100644 index 39129cf..0000000 --- a/sbcl/.quicklisp/quicklisp/deflate.lisp +++ /dev/null @@ -1,785 +0,0 @@ -;;;; Deflate --- RFC 1951 Deflate Decompression -;;;; -;;;; Copyright (C) 2000-2009 PMSF IT Consulting Pierre R. Mai. -;;;; -;;;; 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 AUTHOR 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. -;;;; -;;;; Except as contained in this notice, the name of the author shall -;;;; not be used in advertising or otherwise to promote the sale, use or -;;;; other dealings in this Software without prior written authorization -;;;; from the author. -;;;; -;;;; $Id: 377d3a33e9db5a3b54c850619183ee555a41b894 $ - -(cl:in-package #:ql-gunzipper) - -;;;; %File Description: -;;;; -;;;; This file contains routines implementing the RFC 1951 Deflate -;;;; Compression and/or Decompression method, as used by e.g. gzip and -;;;; other compression and archiving tools and protocols. It also -;;;; implements handling routines for zlib-style (RFC 1950) and -;;;; gzip-style (RFC 1952) wrappers around raw Deflate streams. -;;;; -;;;; The main entry points are the functions inflate-stream, and its -;;;; cousins inflate-zlib-stream and inflate-gzip-stream, which take -;;;; an input-stream and an output-stream as their arguments, and -;;;; inflate the RFC 1951, RFC 1950 or RFC 1952-style deflate formats -;;;; from the input-stream to the output-stream. -;;;; - -;;; -;;; Conditions -;;; - -(define-condition decompression-error (simple-error) - ()) - -(define-condition deflate-decompression-error (decompression-error) - () - (:report - (lambda (c s) - (with-standard-io-syntax - (let ((*print-readably* nil)) - (format s - "Error detected during deflate decompression: ~?" - (simple-condition-format-control c) - (simple-condition-format-arguments c))))))) - -(define-condition zlib-decompression-error (decompression-error) - () - (:report - (lambda (c s) - (with-standard-io-syntax - (let ((*print-readably* nil)) - (format s - "Error detected during zlib decompression: ~?" - (simple-condition-format-control c) - (simple-condition-format-arguments c))))))) - -(define-condition gzip-decompression-error (decompression-error) - () - (:report - (lambda (c s) - (with-standard-io-syntax - (let ((*print-readably* nil)) - (format s - "Error detected during zlib decompression: ~?" - (simple-condition-format-control c) - (simple-condition-format-arguments c))))))) - -;;; -;;; Adler-32 Checksums -;;; - -(defconstant +adler-32-start-value+ 1 - "Start value for Adler-32 checksums as per RFC 1950.") - -(defconstant +adler-32-base+ 65521 - "Base value for Adler-32 checksums as per RFC 1950.") - -(declaim (ftype - (function ((unsigned-byte 32) (simple-array (unsigned-byte 8) (*)) fixnum) - (unsigned-byte 32)) - update-adler32-checksum)) -(defun update-adler32-checksum (crc buffer end) - (declare (type (unsigned-byte 32) crc) - (type (simple-array (unsigned-byte 8) (*)) buffer) - (type fixnum end) - (optimize (speed 3) (debug 0) (space 0) (safety 0)) - #+sbcl (sb-ext:muffle-conditions sb-ext:compiler-note)) - (let ((s1 (ldb (byte 16 0) crc)) - (s2 (ldb (byte 16 16) crc))) - (declare (type (unsigned-byte 32) s1 s2)) - (dotimes (i end) - (declare (type fixnum i)) - (setq s1 (mod (+ s1 (aref buffer i)) +adler-32-base+) - s2 (mod (+ s2 s1) +adler-32-base+))) - (dpb s2 (byte 16 16) s1))) - -;;; -;;; CRC-32 Checksums -;;; - -(defconstant +crc-32-start-value+ 0 - "Start value for CRC-32 checksums as per RFC 1952.") - -(defconstant +crc-32-polynomial+ #xedb88320 - "CRC-32 Polynomial as per RFC 1952.") - -(declaim (ftype #-lispworks (function () (simple-array (unsigned-byte 32) (256))) - #+lispworks (function () (sys:simple-int32-vector 256)) - generate-crc32-table)) -(defun generate-crc32-table () - (let ((result #-lispworks (make-array 256 :element-type '(unsigned-byte 32)) - #+lispworks (sys:make-simple-int32-vector 256))) - (dotimes (i #-lispworks (length result) #+lispworks 256 result) - (let ((cur i)) - (dotimes (k 8) - (setq cur (if (= 1 (logand cur 1)) - (logxor (ash cur -1) +crc-32-polynomial+) - (ash cur -1)))) - #-lispworks (setf (aref result i) cur) - #+lispworks (setf (sys:int32-aref result i) - (sys:integer-to-int32 - (dpb (ldb (byte 32 0) cur) (byte 32 0) - (if (logbitp 31 cur) -1 0)))))))) - -(declaim (ftype - (function ((unsigned-byte 32) (simple-array (unsigned-byte 8) (*)) fixnum) - (unsigned-byte 32)) - update-crc32-checksum)) -#-lispworks -(defun update-crc32-checksum (crc buffer end) - (declare (type (unsigned-byte 32) crc) - (type (simple-array (unsigned-byte 8) (*)) buffer) - (type fixnum end) - (optimize (speed 3) (debug 0) (space 0) (safety 0)) - #+sbcl (sb-ext:muffle-conditions sb-ext:compiler-note)) - (let ((table (load-time-value (generate-crc32-table))) - (cur (logxor crc #xffffffff))) - (declare (type (simple-array (unsigned-byte 32) (256)) table) - (type (unsigned-byte 32) cur)) - (dotimes (i end) - (declare (type fixnum i)) - (let ((index (logand #xff (logxor cur (aref buffer i))))) - (declare (type (unsigned-byte 8) index)) - (setq cur (logxor (aref table index) (ash cur -8))))) - (logxor cur #xffffffff))) - -#+lispworks -(defun update-crc32-checksum (crc buffer end) - (declare (type (unsigned-byte 32) crc) - (type (simple-array (unsigned-byte 8) (*)) buffer) - (type fixnum end) - (optimize (speed 3) (debug 0) (space 0) (safety 0) (float 0))) - (let ((table (load-time-value (generate-crc32-table))) - (cur (sys:int32-lognot (sys:integer-to-int32 - (dpb (ldb (byte 32 0) crc) (byte 32 0) - (if (logbitp 31 crc) -1 0)))))) - (declare (type (sys:simple-int32-vector 256) table) - (type sys:int32 cur)) - (dotimes (i end) - (declare (type fixnum i)) - (let ((index (sys:int32-to-integer - (sys:int32-logand #xff (sys:int32-logxor cur (aref buffer i)))))) - (declare (type fixnum index)) - (setq cur (sys:int32-logxor (sys:int32-aref table index) - (sys:int32-logand #x00ffffff - (sys:int32>> cur 8)))))) - (ldb (byte 32 0) (sys:int32-to-integer (sys:int32-lognot cur))))) - -;;; -;;; Helper Data Structures: Sliding Window Stream -;;; - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defconstant +sliding-window-size+ 32768 - "Size of sliding window for RFC 1951 Deflate compression scheme.")) - -(defstruct sliding-window-stream - (stream nil :type stream :read-only t) - (buffer (make-array +sliding-window-size+ :element-type '(unsigned-byte 8)) - :type (simple-array (unsigned-byte 8) (#.+sliding-window-size+)) :read-only t) - (buffer-end 0 :type fixnum) - (checksum nil :type symbol :read-only t) - (checksum-value 0 :type (unsigned-byte 32))) - -(declaim (inline sliding-window-stream-write-byte)) -(defun sliding-window-stream-write-byte (stream byte) - (declare (type sliding-window-stream stream) (type (unsigned-byte 8) byte) - #+sbcl (sb-ext:muffle-conditions sb-ext:compiler-note)) - "Write a single byte to the sliding-window-stream." - (let ((end (sliding-window-stream-buffer-end stream))) - (declare (type fixnum end)) - (unless (< end +sliding-window-size+) - (write-sequence (sliding-window-stream-buffer stream) - (sliding-window-stream-stream stream)) - (case (sliding-window-stream-checksum stream) - (:adler-32 (setf (sliding-window-stream-checksum-value stream) - (update-adler32-checksum - (sliding-window-stream-checksum-value stream) - (sliding-window-stream-buffer stream) - +sliding-window-size+))) - (:crc-32 (setf (sliding-window-stream-checksum-value stream) - (update-crc32-checksum - (sliding-window-stream-checksum-value stream) - (sliding-window-stream-buffer stream) - +sliding-window-size+)))) - (setq end 0)) - (setf (aref (sliding-window-stream-buffer stream) end) byte - (sliding-window-stream-buffer-end stream) (1+ end)))) - -(defun sliding-window-stream-flush (stream) - (declare (type sliding-window-stream stream)) - "Flush any remaining buffered bytes from the stream." - (let ((end (sliding-window-stream-buffer-end stream))) - (declare (type fixnum end)) - (unless (zerop end) - (case (sliding-window-stream-checksum stream) - (:adler-32 (setf (sliding-window-stream-checksum-value stream) - (update-adler32-checksum - (sliding-window-stream-checksum-value stream) - (sliding-window-stream-buffer stream) - end))) - (:crc-32 (setf (sliding-window-stream-checksum-value stream) - (update-crc32-checksum - (sliding-window-stream-checksum-value stream) - (sliding-window-stream-buffer stream) - end)))) - (write-sequence (sliding-window-stream-buffer stream) - (sliding-window-stream-stream stream) - :end end)))) - -(defun sliding-window-stream-copy-bytes (stream distance length) - (declare (type sliding-window-stream stream) (type fixnum distance length)) - "Copy a number of bytes from the current sliding window." - (let* ((end (sliding-window-stream-buffer-end stream)) - (start (mod (- end distance) +sliding-window-size+)) - (buffer (sliding-window-stream-buffer stream))) - (declare (type fixnum end start) - (type (simple-array (unsigned-byte 8) (#.+sliding-window-size+)) buffer)) - (dotimes (i length) - (sliding-window-stream-write-byte - stream - (aref buffer (mod (+ start i) +sliding-window-size+)))))) - -;;; -;;; Helper Data Structures: Bit-wise Input Stream -;;; - -(defstruct bit-stream - (stream nil :type stream :read-only t) - (next-byte 0 :type fixnum) - (bits 0 :type (unsigned-byte 29)) - (bit-count 0 :type (unsigned-byte 8))) - -(declaim (inline bit-stream-get-byte)) -(defun bit-stream-get-byte (stream) - (declare (type bit-stream stream)) - "Read another byte from the underlying stream." - (the (unsigned-byte 8) (read-byte (bit-stream-stream stream)))) - -(declaim (inline bit-stream-read-bits)) -(defun bit-stream-read-bits (stream bits) - (declare (type bit-stream stream) - ;; [quicklisp-added] - ;; FIXME: This might be fixed soon in ECL. - ;; http://article.gmane.org/gmane.lisp.ecl.general/7659 - #-ecl - (type (unsigned-byte 8) bits)) - "Read single or multiple bits from the given bit-stream." - (loop while (< (bit-stream-bit-count stream) bits) - do - ;; Fill bits - (setf (bit-stream-bits stream) - (logior (bit-stream-bits stream) - (the (unsigned-byte 29) - (ash (bit-stream-get-byte stream) - (bit-stream-bit-count stream)))) - (bit-stream-bit-count stream) (+ (bit-stream-bit-count stream) 8))) - ;; Return properly masked bits - (if (= (bit-stream-bit-count stream) bits) - (prog1 (bit-stream-bits stream) - (setf (bit-stream-bits stream) 0 - (bit-stream-bit-count stream) 0)) - (prog1 (ldb (byte bits 0) (bit-stream-bits stream)) - (setf (bit-stream-bits stream) (ash (bit-stream-bits stream) (- bits)) - (bit-stream-bit-count stream) (- (bit-stream-bit-count stream) bits))))) - -(declaim (inline bit-stream-copy-block)) -(defun bit-stream-copy-block (stream out-stream) - (declare (type bit-stream stream) (type sliding-window-stream out-stream) - (optimize (speed 3) (safety 0) (space 0) (debug 0))) - "Copy a given block of bytes directly from the underlying stream." - ;; Skip any remaining unprocessed bits - (setf (bit-stream-bits stream) 0 - (bit-stream-bit-count stream) 0) - ;; Get LEN/NLEN and copy bytes - (let* ((len (logior (bit-stream-get-byte stream) - (ash (bit-stream-get-byte stream) 8))) - (nlen (ldb (byte 16 0) - (lognot (logior (bit-stream-get-byte stream) - (ash (bit-stream-get-byte stream) 8)))))) - (unless (= len nlen) - (error 'deflate-decompression-error - :format-control - "Block length mismatch for stored block: LEN(~D) vs. NLEN(~D)!" - :format-arguments (list len nlen))) - (dotimes (i len) - (sliding-window-stream-write-byte out-stream (bit-stream-get-byte stream))))) - -;;; -;;; Huffman Coding -;;; - -;;; A decode-tree struct contains all information necessary to decode -;;; the given canonical huffman code. Note that length-count contains -;;; the number of codes with a given length for each length, whereas -;;; the code-symbols array contains the symbols corresponding to the -;;; codes in canoical order of the codes. -;;; -;;; Decoding then uses this information and the principles underlying -;;; canonical huffman codes to determine whether the currently -;;; collected word falls between the first code and the last code for -;;; the current length, and if so, uses the offset to determine the -;;; code's symbol. Otherwise more bits are needed. - -(defstruct decode-tree - (length-count (make-array 16 :element-type 'fixnum :initial-element 0) - :type (simple-array fixnum (*)) :read-only t) - (code-symbols (make-array 16 :element-type 'fixnum :initial-element 0) - :type (simple-array fixnum (*)))) - -(defun make-huffman-decode-tree (code-lengths) - "Construct a huffman decode-tree for the canonical huffman code with -the code lengths of each symbol given in the input array." - (let* ((max-length (reduce #'max code-lengths :initial-value 0)) - (next-code (make-array (1+ max-length) :element-type 'fixnum - :initial-element 0)) - (code-symbols (make-array (length code-lengths) :element-type 'fixnum - :initial-element 0)) - (length-count (make-array (1+ max-length) :element-type 'fixnum - :initial-element 0))) - ;; Count length occurences and calculate offsets of smallest codes - (loop for index from 1 to max-length - for code = 0 then (+ code (aref length-count (1- index))) - do - (setf (aref next-code index) code) - initially - ;; Count length occurences - (loop for length across code-lengths - do - (incf (aref length-count length)) - finally - (setf (aref length-count 0) 0))) - ;; Construct code symbols mapping - (loop for length across code-lengths - for index upfrom 0 - unless (zerop length) - do - (setf (aref code-symbols (aref next-code length)) index) - (incf (aref next-code length))) - ;; Return result - (make-decode-tree :length-count length-count :code-symbols code-symbols))) - -(declaim (inline read-huffman-code)) -(defun read-huffman-code (bit-stream decode-tree) - (declare (type bit-stream bit-stream) (type decode-tree decode-tree) - (optimize (speed 3) (safety 0) (space 0) (debug 0))) - "Read the next huffman code word from the given bit-stream and -return its decoded symbol, for the huffman code given by decode-tree." - (loop with length-count of-type (simple-array fixnum (*)) - = (decode-tree-length-count decode-tree) - with code-symbols of-type (simple-array fixnum (*)) - = (decode-tree-code-symbols decode-tree) - for code of-type fixnum = (bit-stream-read-bits bit-stream 1) - then (+ (* code 2) (bit-stream-read-bits bit-stream 1)) - for index of-type fixnum = 0 then (+ index count) - for first of-type fixnum = 0 then (* (+ first count) 2) - for length of-type fixnum upfrom 1 below (length length-count) - for count = (aref length-count length) - thereis (when (< code (the fixnum (+ first count))) - (aref code-symbols (+ index (- code first)))) - finally - (error 'deflate-decompression-error - :format-control - "Corrupted Data detected during decompression: ~ - Incorrect huffman code (~X) in huffman decode!" - :format-arguments (list code)))) - -;;; -;;; Standard Huffman Tables -;;; - -(defparameter *std-lit-decode-tree* - (make-huffman-decode-tree - (concatenate 'vector - (make-sequence 'vector 144 :initial-element 8) - (make-sequence 'vector 112 :initial-element 9) - (make-sequence 'vector 24 :initial-element 7) - (make-sequence 'vector 8 :initial-element 8)))) - -(defparameter *std-dist-decode-tree* - (make-huffman-decode-tree - (make-sequence 'vector 32 :initial-element 5))) - -;;; -;;; Dynamic Huffman Table Handling -;;; - -(defparameter *code-length-entry-order* - #(16 17 18 0 8 7 9 6 10 5 11 4 12 3 13 2 14 1 15) - "Order of Code Length Tree Code Lengths.") - -(defun decode-code-length-entries (bit-stream count decode-tree) - "Decode the given number of code length entries from the bit-stream -using the given decode-tree, and return a corresponding array of code -lengths for further processing." - (do ((result (make-array count :element-type 'fixnum :initial-element 0)) - (index 0)) - ((>= index count) result) - (let ((code (read-huffman-code bit-stream decode-tree))) - (ecase code - ((0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15) - (setf (aref result index) code) - (incf index)) - (16 - (let ((length (+ 3 (bit-stream-read-bits bit-stream 2)))) - (dotimes (i length) - (setf (aref result (+ index i)) (aref result (1- index)))) - (incf index length))) - (17 - (let ((length (+ 3 (bit-stream-read-bits bit-stream 3)))) - (dotimes (i length) - (setf (aref result (+ index i)) 0)) - (incf index length))) - (18 - (let ((length (+ 11 (bit-stream-read-bits bit-stream 7)))) - (dotimes (i length) - (setf (aref result (+ index i)) 0)) - (incf index length))))))) - -(defun decode-huffman-tables (bit-stream) - "Decode the stored huffman tables from the given bit-stream, returning -the corresponding decode-trees for literals/length and distance codes." - (let* ((hlit (bit-stream-read-bits bit-stream 5)) - (hdist (bit-stream-read-bits bit-stream 5)) - (hclen (bit-stream-read-bits bit-stream 4))) - ;; Construct Code Length Decode Tree - (let ((cl-decode-tree - (loop with code-lengths = (make-array 19 :element-type '(unsigned-byte 8) - :initial-element 0) - for index from 0 below (+ hclen 4) - for code-length = (bit-stream-read-bits bit-stream 3) - for code-index = (aref *code-length-entry-order* index) - do - (setf (aref code-lengths code-index) code-length) - finally - (return (make-huffman-decode-tree code-lengths))))) - ;; Decode Code Length Table and generate separate huffman trees - (let ((entries (decode-code-length-entries bit-stream - (+ hlit 257 hdist 1) - cl-decode-tree))) - (values - (make-huffman-decode-tree (subseq entries 0 (+ hlit 257))) - (make-huffman-decode-tree (subseq entries (+ hlit 257)))))))) - -;;; -;;; Compressed Block Handling -;;; - -(declaim (inline decode-length-entry)) -(defun decode-length-entry (symbol bit-stream) - "Decode the given length symbol into a proper length specification." - (cond - ((<= symbol 264) (- symbol 254)) - ((<= symbol 268) (+ 11 (* (- symbol 265) 2) (bit-stream-read-bits bit-stream 1))) - ((<= symbol 272) (+ 19 (* (- symbol 269) 4) (bit-stream-read-bits bit-stream 2))) - ((<= symbol 276) (+ 35 (* (- symbol 273) 8) (bit-stream-read-bits bit-stream 3))) - ((<= symbol 280) (+ 67 (* (- symbol 277) 16) (bit-stream-read-bits bit-stream 4))) - ((<= symbol 284) - (+ 131 (* (- symbol 281) 32) (bit-stream-read-bits bit-stream 5))) - ((= symbol 285) 258) - (t - (error 'deflate-decompression-error - :format-control "Strange Length Code in bitstream: ~D" - :format-arguments (list symbol))))) - -(declaim (inline decode-distance-entry)) -(defun decode-distance-entry (symbol bit-stream) - "Decode the given distance symbol into a proper distance specification." - (cond - ((<= symbol 3) (1+ symbol)) - (t - (multiple-value-bind (order offset) (truncate symbol 2) - (let* ((extra-bits (1- order)) - (factor (ash 1 extra-bits))) - (+ (1+ (ash 1 order)) - (* offset factor) - (bit-stream-read-bits bit-stream extra-bits))))))) - -(defun decode-huffman-block (bit-stream window-stream - lit-decode-tree dist-decode-tree) - "Decode the huffman code block using the huffman codes given by -lit-decode-tree and dist-decode-tree." - (do ((symbol (read-huffman-code bit-stream lit-decode-tree) - (read-huffman-code bit-stream lit-decode-tree))) - ((= symbol 256)) - (cond - ((<= symbol 255) - (sliding-window-stream-write-byte window-stream symbol)) - (t - (let ((length (decode-length-entry symbol bit-stream)) - (distance (decode-distance-entry - (read-huffman-code bit-stream dist-decode-tree) bit-stream))) - (sliding-window-stream-copy-bytes window-stream distance length)))))) - -;;; -;;; Block Handling Code -;;; - -(defun decode-block (bit-stream window-stream) - "Decompress a block read from bit-stream into window-stream." - (let* ((finalp (not (zerop (bit-stream-read-bits bit-stream 1)))) - (type (bit-stream-read-bits bit-stream 2))) - (ecase type - (#b00 (bit-stream-copy-block bit-stream window-stream)) - (#b01 - (decode-huffman-block bit-stream window-stream - *std-lit-decode-tree* - *std-dist-decode-tree*)) - (#b10 - (multiple-value-bind (lit-decode-tree dist-decode-tree) - (decode-huffman-tables bit-stream) - (decode-huffman-block bit-stream window-stream - lit-decode-tree dist-decode-tree))) - (#b11 - (error 'deflate-decompression-error - :format-control "Encountered Reserved Block Type ~D!" - :format-arguments (list type)))) - (not finalp))) - -;;; -;;; ZLIB - RFC 1950 handling -;;; - -(defun parse-zlib-header (input-stream) - "Parse a ZLIB-style header as per RFC 1950 from the input-stream and -return the compression-method, compression-level dictionary-id and flags -fields of the header as return values. Checks the header for corruption -and signals a zlib-decompression-error in case of corruption." - (let ((compression-method (read-byte input-stream)) - (flags (read-byte input-stream))) - (unless (zerop (mod (+ (* compression-method 256) flags) 31)) - (error 'zlib-decompression-error - :format-control "Corrupted Header ~2,'0X,~2,'0X!" - :format-arguments (list compression-method flags))) - (let ((dict (unless (zerop (ldb (byte 1 5) flags)) - (parse-zlib-checksum input-stream)))) - (values (ldb (byte 4 0) compression-method) - (ldb (byte 4 4) compression-method) - dict - (ldb (byte 2 6) flags))))) - -(defun parse-zlib-checksum (input-stream) - (+ (* (read-byte input-stream) 256 256 256) - (* (read-byte input-stream) 256 256) - (* (read-byte input-stream) 256) - (read-byte input-stream))) - -(defun parse-zlib-footer (input-stream) - "Parse the ZLIB-style footer as per RFC 1950 from the input-stream and -return the Adler-32 checksum contained in the footer as its return value." - (parse-zlib-checksum input-stream)) - -;;; -;;; GZIP - RFC 1952 handling -;;; - -(defconstant +gzip-header-id1+ 31 - "GZIP Header Magic Value ID1 as per RFC 1952.") - -(defconstant +gzip-header-id2+ 139 - "GZIP Header Magic Value ID2 as per RFC 1952.") - -(defun parse-gzip-header (input-stream) - "Parse a GZIP-style header as per RFC 1952 from the input-stream and -return the compression-method, text-flag, modification time, XFLAGS, -OS, FEXTRA flags, filename, comment and CRC16 fields of the header as -return values (or nil if any given field is not present). Checks the -header for magic values and correct flags settings and signals a -gzip-decompression-error in case of incorrect or unsupported magic -values or flags." - (let ((id1 (read-byte input-stream)) - (id2 (read-byte input-stream)) - (compression-method (read-byte input-stream)) - (flags (read-byte input-stream))) - (unless (and (= id1 +gzip-header-id1+) (= id2 +gzip-header-id2+)) - (error 'gzip-decompression-error - :format-control - "Header missing magic values ~2,'0X,~2,'0X (got ~2,'0X,~2,'0X instead)!" - :format-arguments (list +gzip-header-id1+ +gzip-header-id2+ id1 id2))) - (unless (= compression-method 8) - (error 'gzip-decompression-error - :format-control "Unknown compression-method in Header ~2,'0X!" - :format-arguments (list compression-method))) - (unless (zerop (ldb (byte 3 5) flags)) - (error 'gzip-decompression-error - :format-control "Unknown flags in Header ~2,'0X!" - :format-arguments (list flags))) - (values compression-method - ;; FTEXT - (= 1 (ldb (byte 1 0) flags)) - ;; MTIME - (parse-gzip-mtime input-stream) - ;; XFLAGS - (read-byte input-stream) - ;; OS - (read-byte input-stream) - ;; FEXTRA - (unless (zerop (ldb (byte 1 2) flags)) - (parse-gzip-extra input-stream)) - ;; FNAME - (unless (zerop (ldb (byte 1 3) flags)) - (parse-gzip-string input-stream)) - ;; FCOMMENT - (unless (zerop (ldb (byte 1 4) flags)) - (parse-gzip-string input-stream)) - ;; CRC16 - (unless (zerop (ldb (byte 1 1) flags)) - (+ (read-byte input-stream) - (* (read-byte input-stream 256))))))) - -(defun parse-gzip-mtime (input-stream) - (let ((time (+ (read-byte input-stream) - (* (read-byte input-stream) 256) - (* (read-byte input-stream) 256 256) - (* (read-byte input-stream) 256 256 256)))) - (if (zerop time) - nil - (+ time 2208988800)))) - -(defun parse-gzip-extra (input-stream) - (let* ((length (+ (read-byte input-stream) (* (read-byte input-stream) 256))) - (result (make-array length :element-type '(unsigned-byte 8)))) - (read-sequence result input-stream) - result)) - -(defun parse-gzip-string (input-stream) - (with-output-to-string (string) - (loop for value = (read-byte input-stream) - until (zerop value) - do (write-char (code-char value) string)))) - -(defun parse-gzip-checksum (input-stream) - (+ (read-byte input-stream) - (* (read-byte input-stream) 256) - (* (read-byte input-stream) 256 256) - (* (read-byte input-stream) 256 256 256))) - -(defun parse-gzip-footer (input-stream) - "Parse the GZIP-style footer as per RFC 1952 from the input-stream and -return the CRC-32 checksum and ISIZE fields contained in the footer as -its return values." - (values (parse-gzip-checksum input-stream) - ;; ISIZE - (+ (read-byte input-stream) - (* (read-byte input-stream) 256) - (* (read-byte input-stream) 256 256) - (* (read-byte input-stream) 256 256 256)))) - -;;; -;;; Main Entry Points -;;; - -(defun inflate-stream (input-stream output-stream &key checksum) - "Inflate the RFC 1951 data from the given input stream into the -given output stream, which are required to have an element-type -of (unsigned-byte 8). If checksum is given, it indicates the -checksumming algorithm to employ in calculating a checksum of -the expanded content, which is then returned from this function. -Valid values are :adler-32 for Adler-32 checksum (see RFC 1950), -or :crc-32 for CRC-32 as per ISO 3309 (see RFC 1952, ZIP)." - (loop with window-stream = (make-sliding-window-stream :stream output-stream - :checksum checksum - :checksum-value - (ecase checksum - ((nil) 0) - (:crc-32 +crc-32-start-value+) - (:adler-32 +adler-32-start-value+))) - with bit-stream = (make-bit-stream :stream input-stream) - while (decode-block bit-stream window-stream) - finally (sliding-window-stream-flush window-stream) - (when checksum - (return (sliding-window-stream-checksum-value window-stream))))) - -(defun inflate-zlib-stream (input-stream output-stream &key check-checksum) - "Inflate the RFC 1950 zlib data from the given input stream into -the given output stream, which are required to have an element-type -of (unsigned-byte 8). This returns the Adler-32 checksum of the -file as its first return value, with the compression level as its -second return value. Note that it is the responsibility of the -caller to check whether the expanded data matches the Adler-32 -checksum, unless the check-checksum keyword argument is set to -true, in which case the checksum is checked internally and a -zlib-decompression-error is signalled if they don't match." - (multiple-value-bind (cm cinfo dictid flevel) (parse-zlib-header input-stream) - (unless (= cm 8) - (error 'zlib-decompression-error - :format-control "Unknown compression method ~D!" - :format-arguments (list cm))) - (unless (<= cinfo 7) - (error 'zlib-decompression-error - :format-control "Unsupported sliding window size 2^~D = ~D!" - :format-arguments (list (+ 8 cinfo) (expt 2 (+ 8 cinfo))))) - (unless (null dictid) - (error 'zlib-decompression-error - :format-control "Unknown preset dictionary id ~8,'0X!" - :format-arguments (list dictid))) - (let ((checksum-new (inflate-stream input-stream output-stream - :checksum (when check-checksum :adler-32))) - (checksum-old (parse-zlib-footer input-stream))) - (when (and check-checksum (not (= checksum-old checksum-new))) - (error 'zlib-decompression-error - :format-control - "Checksum mismatch for decompressed stream: ~8,'0X != ~8,'0X!" - :format-arguments (list checksum-old checksum-new))) - (values checksum-old flevel)))) - -(defun inflate-gzip-stream (input-stream output-stream &key check-checksum) - "Inflate the RFC 1952 gzip data from the given input stream into -the given output stream, which are required to have an element-type -of (unsigned-byte 8). This returns the CRC-32 checksum of the -file as its first return value, with any filename, modification time, -and comment fields as further return values or nil if not present. -Note that it is the responsibility of the caller to check whether the -expanded data matches the CRC-32 checksum, unless the check-checksum -keyword argument is set to true, in which case the checksum is checked -internally and a gzip-decompression-error is signalled if they don't -match." - (multiple-value-bind (cm ftext mtime xfl os fextra fname fcomment) - (parse-gzip-header input-stream) - (declare (ignore ftext xfl os fextra)) - (unless (= cm 8) - (error 'gzip-decompression-error - :format-control "Unknown compression method ~D!" - :format-arguments (list cm))) - (let ((checksum-new (inflate-stream input-stream output-stream - :checksum (when check-checksum :crc-32))) - (checksum-old (parse-gzip-footer input-stream))) - ;; Handle Checksums - (when (and check-checksum (not (= checksum-old checksum-new))) - (error 'gzip-decompression-error - :format-control - "Checksum mismatch for decompressed stream: ~8,'0X != ~8,'0X!" - :format-arguments (list checksum-old checksum-new))) - (values checksum-old fname mtime fcomment)))) - - -(defun gunzip (input-file output-file) - (with-open-file (input input-file - :element-type '(unsigned-byte 8)) - (with-open-file (output output-file - :direction :output - :if-exists :supersede - :element-type '(unsigned-byte 8)) - (inflate-gzip-stream input output))) - (probe-file output-file)) diff --git a/sbcl/.quicklisp/quicklisp/dist-update.lisp b/sbcl/.quicklisp/quicklisp/dist-update.lisp deleted file mode 100644 index 0974eb4..0000000 --- a/sbcl/.quicklisp/quicklisp/dist-update.lisp +++ /dev/null @@ -1,164 +0,0 @@ -;;;; dist-update.lisp - -(in-package #:ql-dist) - -(defgeneric available-update (dist) - (:documentation "If an update is available for DIST, return the - update as an uninstalled dist object. Otherwise, return NIL.")) - -(defgeneric update-release-differences (old-dist new-dist) - (:documentation "Compare OLD-DIST to NEW-DIST and return three lists - as multiple values: new releases \(present in NEW-DIST but not - OLD-DIST), changed releases \(present in both dists but different in - some way), and removed releases \(present in OLD-DIST but not - NEW-DIST). The list of changed releases is a list of two-element - lists, with each two-element list having first the old release - object and then the new release object.")) - -(defgeneric show-update-report (old-dist new-dist) - (:documentation "Display a description of the update from OLD-DIST - to NEW-DIST.")) - -(defgeneric update-in-place (old-dist new-dist) - (:documentation "Update OLD-DIST to NEW-DIST in place.")) - -(defmethod available-update ((dist dist)) - (let ((url (distinfo-subscription-url dist)) - (target (qmerge "tmp/distinfo-update/distinfo.txt")) - (update-directory (qmerge "tmp/distinfo-update/"))) - (when (probe-directory update-directory) - (delete-directory-tree (qmerge "tmp/distinfo-update/"))) - (when url - (ensure-directories-exist target) - (fetch url target :quietly t) - (let ((new (make-dist-from-file target))) - (setf (base-directory new) - (make-pathname :name nil - :type nil - :version nil - :defaults target)) - (when (and (string= (name dist) (name new)) - (string/= (version dist) (version new))) - new))))) - -(defmethod update-release-differences ((old-dist dist) - (new-dist dist)) - (let ((old-releases (provided-releases old-dist)) - (new-releases (provided-releases new-dist)) - (new '()) - (updated '()) - (removed '()) - (old-by-name (make-hash-table :test 'equalp))) - (dolist (release old-releases) - (setf (gethash (name release) old-by-name) - release)) - (dolist (new-release new-releases) - (let* ((name (name new-release)) - (old-release (gethash name old-by-name))) - (remhash name old-by-name) - (cond ((not old-release) - (push new-release new)) - ((not (equal (archive-content-sha1 new-release) - (archive-content-sha1 old-release))) - (push (list old-release new-release) updated))))) - (maphash (lambda (name old-release) - (declare (ignore name)) - (push old-release removed)) - old-by-name) - (values (nreverse new) - (nreverse updated) - (sort removed #'string< :key #'prefix)))) - -(defmethod show-update-report ((old-dist dist) (new-dist dist)) - (multiple-value-bind (new updated removed) - (update-release-differences old-dist new-dist) - (format t "Changes from ~A ~A to ~A ~A:~%" - (name old-dist) - (version old-dist) - (name new-dist) - (version new-dist)) - (when new - (format t "~& New projects:~%") - (format t "~{ ~A~%~}" (mapcar #'prefix new))) - (when updated - (format t "~% Updated projects:~%") - (loop for (old-release new-release) in updated - do (format t " ~A -> ~A~%" - (prefix old-release) - (prefix new-release)))) - (when removed - (format t "~% Removed projects:~%") - (format t "~{ ~A~%~}" (mapcar #'prefix removed))))) - -(defun clear-dist-systems (dist) - (dolist (system (provided-systems dist)) - (asdf:clear-system (name system)))) - -(defmethod update-in-place :before ((old-dist dist) (new-dist dist)) - ;; Make sure ASDF will reload any systems at their new locations - (clear-dist-systems old-dist)) - -(defmethod update-in-place :after ((old-dist dist) (new-dist dist)) - (clean new-dist)) - -(defmethod update-in-place ((old-dist dist) (new-dist dist)) - (flet ((remove-installed (type) - (let ((wild (merge-pathnames (make-pathname :directory - (list :relative - "installed" - type) - :name :wild - :type "txt") - (base-directory old-dist)))) - (dolist (file (directory wild)) - (delete-file file))))) - (let ((reinstall-releases (installed-releases old-dist))) - (remove-installed "systems") - (remove-installed "releases") - (delete-file-if-exists (relative-to old-dist "releases.txt")) - (delete-file-if-exists (relative-to old-dist "systems.txt")) - (delete-file-if-exists (relative-to old-dist "releases.cdb")) - (delete-file-if-exists (relative-to old-dist "systems.cdb")) - (replace-file (local-distinfo-file new-dist) - (local-distinfo-file old-dist)) - (setf new-dist (find-dist (name new-dist))) - (dolist (old-release reinstall-releases) - (let* ((name (name old-release)) - (new-release (find-release-in-dist name new-dist))) - (if new-release - (ensure-installed new-release) - (warn "~S is not available in ~A" name new-dist))))))) - -(defun install-dist (url &key (prompt t) replace) - (block nil - (setf url (url url)) - (let ((temp-file (qmerge "tmp/install-dist-distinfo.txt"))) - (ensure-directories-exist temp-file) - (delete-file-if-exists temp-file) - (fetch url temp-file) - (let* ((new-dist (make-dist-from-file temp-file)) - (old-dist (find-dist (name new-dist)))) - (when old-dist - (if replace - (uninstall old-dist) - (restart-case - (error "A dist named ~S is already installed." - (name new-dist)) - (replace () - :report "Replace installed dist with new dist" - (uninstall old-dist))))) - (format t "Installing dist ~S version ~S.~%" - (name new-dist) - (version new-dist)) - (when (or (not prompt) - (press-enter-to-continue)) - (ensure-directories-exist (base-directory new-dist)) - (copy-file temp-file (relative-to new-dist "distinfo.txt")) - (ensure-release-index-file new-dist) - (ensure-system-index-file new-dist) - (enable new-dist) - (setf (preference new-dist) (get-universal-time)) - (when old-dist - (clear-dist-systems old-dist)) - (clear-dist-systems new-dist) - new-dist))))) diff --git a/sbcl/.quicklisp/quicklisp/dist.lisp b/sbcl/.quicklisp/quicklisp/dist.lisp deleted file mode 100644 index 960e2c9..0000000 --- a/sbcl/.quicklisp/quicklisp/dist.lisp +++ /dev/null @@ -1,1168 +0,0 @@ -;;;; dist.lisp - -(in-package #:ql-dist) - - -;;; Generic functions - -(defgeneric dist (object) - (:documentation - "Return the dist of OBJECT.")) - -(defgeneric available-versions (object) - (:documentation - "Return a list of version information for OBJECT.")) - -(defgeneric system-index-url (object) - (:documentation - "Return the URL for the system index of OBJECT.")) - -(defgeneric release-index-url (object) - (:documentation - "Return the URL for the release index of OBJECT.")) - -(defgeneric available-versions-url (object) - (:documentation - "Return the URL for the available versions data file of OBJECT.")) - -(defgeneric release (object) - (:documentation - "Return the release of OBJECT.")) - -(defgeneric system (object) - (:documentation - "Return the system of OBJECT.")) - -(defgeneric name (object) - (:documentation - "Return the name of OBJECT.")) - -(defgeneric find-system (name) - (:documentation - "Return a system with the given NAME, or NIL if no system is - found. If multiple systems have the same name, the one with the - highest preference is returned.")) - -(defgeneric find-release (name) - (:documentation - "Return a release with the given NAME, or NIL if no system is - found. If multiple releases have the same name, the one with the - highest preference is returned.")) - -(defgeneric find-systems-named (name) - (:documentation - "Return a list of all systems in all enabled dists with the given - NAME, sorted by preference.")) - -(defgeneric find-releases-named (name) - (:documentation - "Return a list of all releases in all enabled dists with the given - NAME, sorted by preference.")) - - -(defgeneric base-directory (object) - (:documentation - "Return the base directory pathname of OBJECT.") - (:method ((object pathname)) - (merge-pathnames object))) - -(defgeneric relative-to (object pathname) - (:documentation - "Merge PATHNAME with the base-directory of OBJECT.") - (:method (object pathname) - (merge-pathnames pathname (base-directory object)))) - - -(defgeneric enabledp (object) - (:documentation - "Return true if OBJECT is enabled.")) - -(defgeneric enable (object) - (:documentation - "Enable OBJECT.")) - -(defgeneric disable (object) - (:documentation - "Disable OBJECT.")) - -(defgeneric installedp (object) - (:documentation - "Return true if OBJECT is installed.")) - -(defgeneric install (object) - (:documentation - "Install OBJECT.")) - -(defgeneric ensure-installed (object) - (:documentation - "Ensure that OBJECT is installed.") - (:method (object) - (unless (installedp object) - (install object)) - object)) - -(defgeneric uninstall (object) - (:documentation - "Uninstall OBJECT.")) - -(defgeneric metadata-name (object) - (:documentation - "The metadata-name of an object is used to form the pathname for a - few different object metadata files.")) - -(defgeneric install-metadata-file (object) - (:documentation - "The pathname to a file describing the installation status of - OBJECT.")) - -(defgeneric subscription-inhibition-file (object) - (:documentation "The file whose presence indicates the inhibited - subscription status of OBJECT.") - (:method (object) - (relative-to object "subscription-inhibited.txt"))) - -(defgeneric inhibit-subscription (object) - (:documentation "Inhibit subscription for OBJECT.") - (:method (object) - (ensure-file-exists (subscription-inhibition-file object)))) - -(defgeneric uninhibit-subscription (object) - (:documentation "Remove inhibition of subscription for OBJECT.") - (:method (object) - (delete-file-if-exists (subscription-inhibition-file object)))) - -(defgeneric subscription-inhibited-p (object) - (:documentation "Return T if subscription to OBJECT is inhibited.") - (:method (object) - (not (not (probe-file (subscription-inhibition-file object)))))) - -(define-condition subscription-unavailable (error) - ((object - :initarg :object - :reader subscription-unavailable-object))) - -(defgeneric subscribedp (object) - (:documentation "Return true if OBJECT is subscribed to updates.")) - -(defgeneric subscribe (object) - (:documentation "Subscribe to updates of OBJECT, if possible. If no - updates are available, a condition of type SUBSCRIPTION-UNAVAILABLE - is raised.") - (:method (object) - (uninhibit-subscription object) - (unless (subscribedp object) - (error 'subscription-unavailable - :object object)) - t)) - -(defgeneric unsubscribe (object) - (:documentation "Unsubscribe from updates to OBJECT.") - (:method (object) - (inhibit-subscription object))) - - -(defgeneric preference-parent (object) - (:documentation - "Return a value suitable for checking if OBJECT has no specific - preference set.") - (:method (object) - (declare (ignore object)) - nil)) - -(defgeneric preference-file (object) - (:documentation - "Return the file from which preference information is loaded for - OBJECT.") - (:method (object) - (relative-to object "preference.txt"))) - -(defgeneric preference (object) - (:documentation - "Returns a value used when comparing multiple systems or releases - with the same name. Objects with higher preference are returned by - FIND-SYSTEM and FIND-RELEASE.") - (:method ((object null)) - 0) - (:method (object) - (with-open-file (stream (preference-file object) - :if-does-not-exist nil) - (if stream - (values (parse-integer (read-line stream))) - (preference (preference-parent object)))))) - -(defgeneric (setf preference) (preference object) - (:documentation - "Set the preference for OBJECT. Objects with higher preference are - returned by FIND-SYSTEM and FIND-RELEASE.") - (:method (preference object) - (check-type preference integer) - (let ((preference-file (preference-file object))) - (ensure-directories-exist preference-file) - (with-open-file (stream (preference-file object) - :direction :output - :if-exists :supersede) - (format stream "~D" preference))) - preference)) - -(defgeneric forget-preference (object) - (:documentation - "Remove specific preference information for OBJECT.") - (:method (object) - (delete-file-if-exists (preference-file object)))) - -(defgeneric short-description (object) - (:documentation "Return a short string describing OBJECT.")) - - -(defgeneric provided-releases (object) - (:documentation "Return a list of releases provided by OBJECT.")) - -(defgeneric provided-systems (object) - (:documentation "Return a list of systems provided by OBJECT.")) - -(defgeneric installed-releases (dist) - (:documentation - "Return a list of all releases installed for DIST.") - (:method (dist) - (remove-if-not #'installedp (provided-releases dist)))) - -(defgeneric installed-systems (dist) - (:documentation - "Return a list of all systems installed for DIST.") - (:method (dist) - (remove-if-not #'installedp (provided-systems dist)))) - -(defgeneric new-version-available-p (dist) - (:documentation - "Return true if a new version of DIST is available.")) - -(defgeneric find-system-in-dist (system-name dist) - (:documentation - "Return a system with the given NAME in DIST, or NIL if no system - is found.")) - -(defgeneric find-release-in-dist (release-name dist) - (:documentation - "Return a release with the given NAME in DIST, or NIL if no release - is found.")) - - -(defgeneric ensure-system-index-file (dist) - (:documentation - "Return the pathname for the system index file of DIST, fetching it - from a remote source first if necessary.")) - -(defgeneric ensure-system-cdb-file (dist) - (:documentation - "Return the pathname for the system cdb file of DIST, creating it - if necessary.")) - -(defgeneric ensure-release-index-file (dist) - (:documentation - "Return the pathname for the release index file of DIST, fetching - it from a remote source first if necessary.")) - -(defgeneric ensure-release-cdb-file (dist) - (:documentation - "Return the pathname for the release cdb file of DIST, creating it - if necessary.")) - - -(defgeneric initialize-release-index (dist) - (:documentation - "Initialize the release index of DIST.")) - -(defgeneric initialize-system-index (dist) - (:documentation - "Initialize the system index of DIST.")) - - -(defgeneric local-archive-file (release) - (:documentation - "Return the pathname to where the archive file of RELEASE should be - stored.")) - -(defgeneric ensure-local-archive-file (release) - (:documentation - "If the archive file for RELEASE is not available locally, fetch it - and return the pathname to it.")) - -(defgeneric check-local-archive-file (release) - (:documentation - "Check the local archive file of RELEASE for validity, including - size and signature checks. Signals errors in the case of invalid files.")) - - -(defgeneric archive-url (release) - (:documentation - "Return the full URL for fetching the archive file of RELEASE.")) - -(defgeneric installed-asdf-system-file (object) - (:documentation - "Return the path to the installed ASDF system file for OBJECT, or - NIL if there is no installed system file.")) - - - - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defmacro destructure-line (lambda-list line &body body) - `(destructuring-bind ,lambda-list - (split-spaces ,line) - ,@body)) - - (defun call-for-each-line (fun file) - (with-open-file (stream file) - (loop for line = (read-line stream nil) - while line do (funcall fun line)))) - - (defmacro for-each-line ((line file) &body body) - `(call-for-each-line (lambda (,line) ,@body) ,file))) - -(defun make-line-instance (line class &rest initargs) - "Create an instance from words in an index file line. The last initarg collects all the trailing arguments, if any." - (let* ((words (split-spaces line)) - (args (mapcan #'list - (butlast initargs) - words)) - (trailing (subseq words (1- (length initargs))))) - (apply #'make-instance class (first (last initargs)) trailing args))) - -(defun ignorable-line (line) - (labels ((blank-char-p (char) - (member char '(#\Space #\Tab))) - (blankp (line) - (every #'blank-char-p line)) - (ignorable (line) - (or (zerop (length line)) - (blankp line) - (eql (char line 0) #\#)))) - (ignorable line))) - -(defvar *initarg-case-converter* - (cond ((string= :string "string") - #'string-downcase) - ((string= :string "STRING") - #'string-upcase))) - -(defun config-file-initargs (file) - (flet ((initarg-keyword (string) - ;; A concession to mlisp - (intern (funcall *initarg-case-converter* string) - 'keyword))) - (let ((initargs '())) - (for-each-line (line file) - (unless (ignorable-line line) - (destructure-line (initarg value) - line - (let ((keyword (initarg-keyword (string-right-trim ":" initarg)))) - (push value initargs) - (push keyword initargs))))) - initargs))) - -;;; -;;; A few generic things -;;; - -(defmethod dist ((name symbol)) - (dist (string name))) - -(defmethod dist ((name string)) - (find-dist (string-downcase name))) - -(defmethod release ((name symbol)) - (release (string name))) - -(defmethod release ((name string)) - (find-release (string-downcase name))) - -(defmethod system ((name symbol)) - (system (string name))) - -(defmethod system ((name string)) - (find-system (string-downcase name))) - -;;; -;;; Dists -;;; -;;; A dist is a set of releases. -;;; - -(defclass dist () - ((base-directory - :initarg :base-directory - :accessor base-directory) - (name - :initarg :name - :accessor name) - (version - :initarg :version - :accessor version) - (system-index-url - :initarg :system-index-url - :accessor system-index-url) - (release-index-url - :initarg :release-index-url - :accessor release-index-url) - (available-versions-url - :initarg :available-versions-url - :accessor available-versions-url) - (archive-base-url - :initarg :archive-base-url - :accessor archive-base-url) - (canonical-distinfo-url - :initarg :canonical-distinfo-url - :accessor canonical-distinfo-url) - (distinfo-subscription-url - :initarg :distinfo-subscription-url - :accessor distinfo-subscription-url) - (system-index - :initarg :system-index - :accessor system-index) - (release-index - :initarg :release-index - :accessor release-index) - (provided-systems - :initarg :provided-systems - :accessor provided-systems) - (provided-releases - :initarg :provided-releases - :accessor provided-releases) - (local-distinfo-file - :initarg :local-distinfo-file - :accessor local-distinfo-file)) - (:default-initargs - :name "unnamed" - :version "unknown" - :distinfo-subscription-url nil)) - -(defmethod short-description ((dist dist)) - (format nil "~A ~A" (name dist) (version dist))) - -(defmethod print-object ((dist dist) stream) - (print-unreadable-object (dist stream :type t) - (write-string (short-description dist) stream))) - -(defun cdb-lookup (dist key cdb) - (ql-cdb:lookup key - (relative-to dist cdb))) - -(defmethod slot-unbound (class (dist dist) (slot (eql 'available-versions-url))) - (declare (ignore class)) - (setf (available-versions-url dist) - (make-versions-url (distinfo-subscription-url dist)))) - - -(defmethod ensure-system-index-file ((dist dist)) - (let ((pathname (relative-to dist "systems.txt"))) - (or (probe-file pathname) - (nth-value 1 (fetch (system-index-url dist) pathname))))) - -(defmethod ensure-system-cdb-file ((dist dist)) - (let* ((system-file (ensure-system-index-file dist)) - (cdb-file (make-pathname :type "cdb" :defaults system-file))) - (or (probe-file cdb-file) - (ql-cdb:convert-index-file system-file - :cdb-file cdb-file - :index 2)))) - -(defmethod ensure-release-index-file ((dist dist)) - (let ((pathname (relative-to dist "releases.txt"))) - (or (probe-file pathname) - (nth-value 1 (fetch (release-index-url dist) pathname))))) - -(defmethod ensure-release-cdb-file ((dist dist)) - (let* ((release-file (ensure-release-index-file dist)) - (cdb-file (make-pathname :type "cdb" :defaults release-file))) - (or (probe-file cdb-file) - (ql-cdb:convert-index-file release-file - :cdb-file cdb-file - :index 0)))) - -(defmethod slot-unbound (class (dist dist) (slot (eql 'provided-systems))) - (declare (ignore class)) - (initialize-system-index dist) - (setf (slot-value dist 'provided-systems) - (loop for system being each hash-value of (system-index dist) - collect system))) - -(defmethod slot-unbound (class (dist dist) (slot (eql 'provided-releases))) - (declare (ignore class)) - (initialize-release-index dist) - (setf (slot-value dist 'provided-releases) - (loop for system being each hash-value of (release-index dist) - collect system))) - - -(defun dist-name-pathname (name) - "Return the pathname that would be used for an installed dist with -the given NAME." - (qmerge (make-pathname :directory (list :relative "dists" name)))) - -(defmethod slot-unbound (class (dist dist) (slot (eql 'base-directory))) - (declare (ignore class)) - (setf (base-directory dist) (dist-name-pathname (name dist)))) - -(defun make-dist-from-file (file &key (class 'dist)) - "Load dist info from FILE and use it to create a dist instance." - (let ((initargs (config-file-initargs file))) - (apply #'make-instance class - :local-distinfo-file file - :allow-other-keys t - initargs))) - -(defmethod install-metadata-file ((dist dist)) - (relative-to dist "distinfo.txt")) - -(defun find-dist (name) - (find name (all-dists) - :key #'name - :test #'string=)) - -(defmethod enabledp ((dist dist)) - (not (not (probe-file (relative-to dist "enabled.txt"))))) - -(defmethod enable ((dist dist)) - (ensure-file-exists (relative-to dist "enabled.txt")) - t) - -(defmethod disable ((dist dist)) - (delete-file-if-exists (relative-to dist "enabled.txt")) - t) - -(defmethod installedp ((dist dist)) - (let ((installed (find-dist (name dist)))) - (equalp (version installed) (version dist)))) - -(defmethod uninstall ((dist dist)) - (when (installedp dist) - (dolist (system (provided-systems dist)) - (asdf:clear-system (name system))) - (ql-impl-util:delete-directory-tree (base-directory dist)) - t)) - - -(defun make-release-from-line (line dist) - (let ((release - (make-line-instance line 'release - :project-name - :archive-url - :archive-size - :archive-md5 - :archive-content-sha1 - :prefix - :system-files))) - (setf (dist release) dist) - (setf (archive-size release) - (parse-integer (archive-size release))) - release)) - -(defmethod find-release-in-dist (release-name (dist dist)) - (let* ((index (release-index dist)) - (release (gethash release-name index))) - (or release - (let ((line (cdb-lookup dist release-name - (ensure-release-cdb-file dist)))) - (when line - (setf (gethash release-name index) - (make-release-from-line line dist))))))) - - -(defparameter *dist-enumeration-functions* - '(standard-dist-enumeration-function) - "ALL-DISTS calls each function in this list with no arguments, and - appends the results into a list of dist objects, removing - duplicates. Functions might be called just once for a batch of - related operations; see WITH-CONSISTENT-DISTS.") - -(defun standard-dist-enumeration-function () - "The default function used for producing a list of dist objects." - (loop for file in (directory (qmerge "dists/*/distinfo.txt")) - collect (make-dist-from-file file))) - -(defun all-dists () - "Return a list of all known dists." - (remove-duplicates - (apply 'append (mapcar 'funcall *dist-enumeration-functions*)))) - -(defun enabled-dists () - "Return a list of all known dists for which ENABLEDP returns true." - (remove-if-not #'enabledp (all-dists))) - - -(defmethod install-metadata-file (object) - (relative-to (dist object) - (make-pathname :directory - (list :relative "installed" - (metadata-name object)) - :name (name object) - :type "txt"))) - - -(defclass preference-mixin () () - (:documentation - "Instances of this class have a special location for their - preference files.")) - -(defgeneric filesystem-name (object) - (:method (object) - ;; This is to work around system names like "foo/bar". - (let* ((name (name object)) - (slash (position #\/ name))) - (if slash - (subseq name 0 slash) - name)))) - -(defmethod preference-file ((object preference-mixin)) - (relative-to - (dist object) - (make-pathname :directory (list :relative - "preferences" - (metadata-name object)) - :name (filesystem-name object) - :type "txt"))) - -(defmethod distinfo-subscription-url :around ((dist dist)) - (unless (subscription-inhibited-p dist) - (call-next-method))) - -(defmethod subscribedp ((dist dist)) - (distinfo-subscription-url dist)) - -;;; -;;; Releases -;;; - -(defclass release (preference-mixin) - ((project-name - :initarg :project-name - :accessor name - :accessor project-name) - (dist - :initarg :dist - :accessor dist - :reader preference-parent) - (provided-systems - :initarg :provided-systems - :accessor provided-systems) - (archive-url - :initarg :archive-url - :accessor archive-url) - (archive-size - :initarg :archive-size - :accessor archive-size) - (archive-md5 - :initarg :archive-md5 - :accessor archive-md5) - (archive-content-sha1 - :initarg :archive-content-sha1 - :accessor archive-content-sha1) - (prefix - :initarg :prefix - :accessor prefix - :reader short-description) - (system-files - :initarg :system-files - :accessor system-files) - (metadata-name - :initarg :metadata-name - :accessor metadata-name)) - (:default-initargs - :metadata-name "releases") - (:documentation - "Instances of this class represent a snapshot of a project at some - point in time, which might be from version control, or from an - official release, or from some other source.")) - -(defmethod print-object ((release release) stream) - (print-unreadable-object (release stream :type t) - (format stream "~A / ~A" - (short-description release) - (short-description (dist release))))) - -(define-condition invalid-local-archive (error) - ((release - :initarg :release - :reader invalid-local-archive-release) - (file - :initarg :file - :reader invalid-local-archive-file)) - (:report - (lambda (condition stream) - (format stream "The archive file ~S for release ~S is invalid" - (file-namestring (invalid-local-archive-file condition)) - (name (invalid-local-archive-release condition)))))) - -(define-condition missing-local-archive (invalid-local-archive) - () - (:report - (lambda (condition stream) - (format stream "The archive file ~S for release ~S is missing" - (file-namestring (invalid-local-archive-file condition)) - (name (invalid-local-archive-release condition)))))) - -(define-condition badly-sized-local-archive (invalid-local-archive) - ((expected-size - :initarg :expected-size - :reader badly-sized-local-archive-expected-size) - (actual-size - :initarg :actual-size - :reader badly-sized-local-archive-actual-size)) - (:report - (lambda (condition stream) - (format stream "The archive file ~S for ~S is the wrong size: ~ - expected ~:D, got ~:D" - (file-namestring (invalid-local-archive-file condition)) - (name (invalid-local-archive-release condition)) - (badly-sized-local-archive-expected-size condition) - (badly-sized-local-archive-actual-size condition))))) - -(defmethod check-local-archive-file ((release release)) - (let ((file (local-archive-file release))) - (unless (probe-file file) - (error 'missing-local-archive - :file file - :release release)) - (let ((actual-size (file-size file)) - (expected-size (archive-size release))) - (unless (= actual-size expected-size) - (error 'badly-sized-local-archive - :file file - :release release - :actual-size actual-size - :expected-size expected-size))))) - -(defmethod local-archive-file ((release release)) - (relative-to (dist release) - (make-pathname :directory '(:relative "archives") - :defaults (file-namestring - (path (url (archive-url release))))))) - -(defmethod ensure-local-archive-file ((release release)) - (let ((pathname (local-archive-file release))) - (tagbody - :retry - (or (probe-file pathname) - (progn - (ensure-directories-exist pathname) - (fetch (archive-url release) pathname))) - (restart-case - (check-local-archive-file release) - (delete-and-retry (&optional v) - :report "Delete the archive file and fetch it again" - (declare (ignore v)) - (delete-file pathname) - (go :retry)))) - pathname)) - - -(defmethod base-directory ((release release)) - (relative-to - (dist release) - (make-pathname :directory (list :relative "software" (prefix release))))) - -(defmethod installedp ((release release)) - (and (probe-file (install-metadata-file release)) - (every #'installedp (provided-systems release)))) - -(defmethod install ((release release)) - (let ((archive (ensure-local-archive-file release)) - (tar (qmerge "tmp/release-install.tar")) - (output (relative-to (dist release) - (make-pathname :directory - (list :relative "software")))) - (tracking (install-metadata-file release))) - (ensure-directories-exist tar) - (ensure-directories-exist output) - (ensure-directories-exist tracking) - (gunzip archive tar) - (unpack-tarball tar :directory output) - (ensure-directories-exist tracking) - (with-open-file (stream tracking - :direction :output - :if-exists :supersede) - (write-line (qenough (base-directory release)) stream)) - (let ((provided (provided-systems release)) - (dist (dist release))) - (dolist (file (system-files release)) - (let ((system (find-system-in-dist (pathname-name file) dist))) - (unless (member system provided) - (error "FIND-SYSTEM-IN-DIST returned ~A but I expected one of ~A" - system provided)) - (let ((system-tracking (install-metadata-file system)) - (system-file (merge-pathnames file - (base-directory release)))) - (ensure-directories-exist system-tracking) - (unless (probe-file system-file) - (error "Release claims to have ~A, but I can't find it" - system-file)) - (with-open-file (stream system-tracking - :direction :output - :if-exists :supersede) - (write-line (qenough system-file) - stream)))))) - release)) - -(defmethod uninstall ((release release)) - (when (installedp release) - (dolist (system (installed-systems release)) - (asdf:clear-system (name system)) - (delete-file (install-metadata-file system))) - (delete-file (install-metadata-file release)) - (delete-file (local-archive-file release)) - (ql-impl-util:delete-directory-tree (base-directory release)) - t)) - - -(defun call-for-each-index-entry (file fun) - (labels ((blank-char-p (char) - (member char '(#\Space #\Tab))) - (blankp (line) - (every #'blank-char-p line)) - (ignorable (line) - (or (zerop (length line)) - (blankp line) - (eql (char line 0) #\#)))) - (with-open-file (stream file) - (loop for line = (read-line stream nil) - while line do - (unless (ignorable line) - (funcall fun line)))))) - -(defmethod slot-unbound (class (dist dist) (slot (eql 'release-index))) - (declare (ignore class)) - (setf (slot-value dist 'release-index) - (make-hash-table :test 'equal))) - - -;;; -;;; Systems -;;; -;;; A "system" in the defsystem sense. -;;; - -(defclass system (preference-mixin) - ((name - :initarg :name - :accessor name - :reader short-description) - (system-file-name - :initarg :system-file-name - :accessor system-file-name) - (release - :initarg :release - :accessor release - :reader preference-parent) - (dist - :initarg :dist - :accessor dist) - (required-systems - :initarg :required-systems - :accessor required-systems) - (metadata-name - :initarg :metadata-name - :accessor metadata-name)) - (:default-initargs - :metadata-name "systems")) - -(defmethod print-object ((system system) stream) - (print-unreadable-object (system stream :type t) - (format stream "~A / ~A / ~A" - (short-description system) - (short-description (release system)) - (short-description (dist system))))) - -(defmethod provided-systems ((system system)) - (list system)) - -(defmethod initialize-release-index ((dist dist)) - (let ((releases (ensure-release-index-file dist)) - (index (release-index dist))) - (call-for-each-index-entry - releases - (lambda (line) - (let ((instance (make-line-instance line 'release - :project-name - :archive-url - :archive-size - :archive-md5 - :archive-content-sha1 - :prefix - :system-files))) - ;; Don't clobber anything previously loaded via CDB - (unless (gethash (project-name instance) index) - (setf (dist instance) dist) - (setf (archive-size instance) - (parse-integer (archive-size instance))) - (setf (gethash (project-name instance) index) instance))))) - (setf (release-index dist) index))) - -(defmethod initialize-system-index ((dist dist)) - (initialize-release-index dist) - (let ((systems (ensure-system-index-file dist)) - (index (system-index dist))) - (call-for-each-index-entry - systems - (lambda (line) - (let ((instance (make-line-instance line 'system - :release - :system-file-name - :name - :required-systems))) - ;; Don't clobber anything previously loaded via CDB - (unless (gethash (name instance) index) - (let ((release (find-release-in-dist (release instance) dist))) - (setf (release instance) release) - (if (slot-boundp release 'provided-systems) - (pushnew instance (provided-systems release)) - (setf (provided-systems release) (list instance)))) - (setf (dist instance) dist) - (setf (gethash (name instance) index) instance))))) - (setf (system-index dist) index))) - -(defmethod slot-unbound (class (release release) (slot (eql 'provided-systems))) - (declare (ignore class)) - ;; FIXME: This isn't right, since the system index has systems that - ;; don't match the defining system file name. - (setf (slot-value release 'provided-systems) - (mapcar (lambda (system-file) - (find-system-in-dist (pathname-name system-file) - (dist release))) - (system-files release)))) - -(defmethod slot-unbound (class (dist dist) (slot (eql 'system-index))) - (declare (ignore class)) - (setf (slot-value dist 'system-index) - (make-hash-table :test 'equal))) - -(defun make-system-from-line (line dist) - (let ((system (make-line-instance line 'system - :release - :system-file-name - :name - :required-systems))) - (setf (dist system) dist) - (setf (release system) - (find-release-in-dist (release system) dist)) - system)) - -(defmethod find-system-in-dist (system-name (dist dist)) - (let* ((index (system-index dist)) - (system (gethash system-name index))) - (or system - (let ((line (cdb-lookup dist system-name - (ensure-system-cdb-file dist)))) - (when line - (setf (gethash system-name index) - (make-system-from-line line dist))))))) - -(defmethod preference ((system system)) - (if (probe-file (preference-file system)) - (call-next-method) - (preference (release system)))) - -(defun thing-name-designator (designator) - "Convert DESIGNATOR to a string naming a thing. Strings are used - as-is, symbols are converted to their downcased symbol-name." - (typecase designator - (string designator) - (symbol (string-downcase designator)) - (t - (error "~S is not a valid designator for a system or release" - designator)))) - -(defun find-thing-named (find-fun name) - (setf name (thing-name-designator name)) - (let ((result '())) - (dolist (dist (enabled-dists) (sort result #'> :key #'preference)) - (let ((thing (funcall find-fun name dist))) - (when thing - (push thing result)))))) - -(defmethod find-systems-named (name) - (find-thing-named #'find-system-in-dist name)) - -(defmethod find-releases-named (name) - (find-thing-named #'find-release-in-dist name)) - -(defmethod find-system (name) - (first (find-systems-named name))) - -(defmethod find-release (name) - (first (find-releases-named name))) - -(defmethod install ((system system)) - (ensure-installed (release system))) - - -(defmethod install-metadata-file ((system system)) - (relative-to (dist system) - (make-pathname :name (system-file-name system) - :type "txt" - :directory '(:relative "installed" "systems")))) - -(defmethod installed-asdf-system-file ((system system)) - (let ((metadata-file (install-metadata-file system))) - (when (probe-file metadata-file) - (with-open-file (stream metadata-file) - (let* ((relative (read-line stream)) - (full (qmerge relative))) - (when (probe-file full) - full)))))) - -(defmethod installedp ((system system)) - (installed-asdf-system-file system)) - -(defmethod uninstall ((system system)) - (uninstall (release system))) - -(defun find-asdf-system-file (name) - "Return the ASDF system file in which the system named NAME is defined." - (let ((system (find-system name))) - (when system - (installed-asdf-system-file system)))) - -(defun system-definition-searcher (name) - "Like FIND-ASDF-SYSTEM-FILE, but this function can be used in -ASDF:*SYSTEM-DEFINITION-SEARCH-FUNCTIONS*; it will only return system -file names if they match NAME." - (let ((system-file (find-asdf-system-file name))) - (when (and system-file - (string= (pathname-name system-file) name)) - system-file))) - -(defun call-with-consistent-dists (fun) - "Take a snapshot of the available dists and return the same list -consistently each time ALL-DISTS is called in the dynamic scope of -FUN." - (let* ((all-dists (all-dists)) - (*dist-enumeration-functions* (list (constantly all-dists)))) - (funcall fun))) - -(defmacro with-consistent-dists (&body body) - "See CALL-WITH-CONSISTENT-DISTS." - `(call-with-consistent-dists (lambda () ,@body))) - - -(defgeneric dependency-tree (system) - (:method ((symbol symbol)) - (dependency-tree (string-downcase symbol))) - (:method ((string string)) - (let ((system (find-system string))) - (when system - (dependency-tree system)))) - (:method ((system system)) - (with-consistent-dists - (list* system - (remove nil - (mapcar 'dependency-tree (required-systems system))))))) - -(defmethod provided-systems ((object (eql t))) - (let ((systems (loop for dist in (enabled-dists) - appending (provided-systems dist)))) - (sort systems #'string< :key #'name))) - -(defmethod provided-releases ((object (eql t))) - (let ((releases (loop for dist in (enabled-dists) - appending (provided-releases dist)))) - (sort releases #'string< :key #'name))) - - -(defgeneric system-apropos-list (term) - (:method ((term symbol)) - (system-apropos-list (symbol-name term))) - (:method ((term string)) - (setf term (string-downcase term)) - (let ((result '())) - (dolist (system (provided-systems t) (nreverse result)) - (when (or (search term (name system)) - (search term (name (release system)))) - (push system result)))))) - -(defgeneric system-apropos (term) - (:method (term) - (map nil (lambda (system) - (format t "~A~%" system)) - (system-apropos-list term)) - (values))) - - -;;; -;;; Clean up things -;;; - -(defgeneric clean (object) - (:documentation "Remove any unneeded files or directories related to - OBJECT.")) - -(defmethod clean ((dist dist)) - (let* ((releases (provided-releases dist)) - (known-archives (mapcar 'local-archive-file releases)) - (known-directories (mapcar 'base-directory releases)) - (present-archives (mapcar 'truename - (directory-entries - (relative-to dist "archives/")))) - (present-directories (mapcar 'truename - (directory-entries - (relative-to dist "software/")))) - (garbage-archives - (set-difference present-archives known-archives - :test 'equalp)) - (garbage-directories - ;; Use the namestring here on the theory that pathnames with - ;; equalp namestrings are sufficiently the same. On - ;; LispWorks, for example, identical namestrings can still - ;; differ in :name, :type, and more. - (set-difference present-directories known-directories - :test 'equalp - :key 'namestring))) - (map nil 'delete-file garbage-archives) - (map nil 'delete-directory-tree garbage-directories))) - - -;;; -;;; Available versions -;;; - -(defmethod available-versions ((dist dist)) - (let ((temp (qmerge "tmp/dist-versions.txt")) - (versions '()) - (url (available-versions-url dist))) - (when url - (ensure-directories-exist temp) - (delete-file-if-exists temp) - (handler-case - (fetch url temp) - (unexpected-http-status () - (return-from available-versions nil))) - (with-open-file (stream temp) - (loop for line = (read-line stream nil) - while line do - (destructuring-bind (version url) - (split-spaces line) - (setf versions (acons version url versions))))) - versions))) - - -;;; -;;; User interface bits to re-export from QL -;;; - -(define-condition unknown-dist (error) - ((name - :initarg :name - :reader unknown-dist-name)) - (:report (lambda (condition stream) - (format stream "No dist known by that name -- ~S" - (unknown-dist-name condition))))) - -(defun find-dist-or-lose (name) - (let ((dist (find-dist name))) - (or dist - (error 'unknown-dist :name name)))) - -(defun dist-url (name) - (canonical-distinfo-url (find-dist-or-lose name))) - -(defun dist-version (name) - (version (find-dist-or-lose name))) diff --git a/sbcl/.quicklisp/quicklisp/fetch-gzipped.lisp b/sbcl/.quicklisp/quicklisp/fetch-gzipped.lisp deleted file mode 100644 index b453803..0000000 --- a/sbcl/.quicklisp/quicklisp/fetch-gzipped.lisp +++ /dev/null @@ -1,29 +0,0 @@ -;;;; fetch-gzipped.lisp - -(in-package #:quicklisp-client) - -(defun gzipped-url (url) - (check-type url string) - (concatenate 'string url ".gz")) - -(defun fetch-gzipped-version (url file &key quietly) - (let ((gzipped (gzipped-url url)) - (gzipped-temp (merge-pathnames "gzipped.tmp" file))) - (fetch gzipped gzipped-temp :quietly quietly) - (gunzip gzipped-temp file) - (delete-file-if-exists gzipped-temp) - (probe-file file))) - -(defun url-not-suitable-error-p (condition) - (<= 400 (unexpected-http-status-code condition) 499)) - -(defun maybe-fetch-gzipped (url file &key quietly) - (handler-case - (fetch-gzipped-version url file :quietly quietly) - (unexpected-http-status (condition) - (cond ((url-not-suitable-error-p condition) - (fetch url file :quietly quietly) - (probe-file file)) - (t - (error condition)))))) - diff --git a/sbcl/.quicklisp/quicklisp/http.lisp b/sbcl/.quicklisp/quicklisp/http.lisp deleted file mode 100644 index d942fb8..0000000 --- a/sbcl/.quicklisp/quicklisp/http.lisp +++ /dev/null @@ -1,859 +0,0 @@ -;;; -;;; A simple HTTP client -;;; - -(in-package #:ql-http) - -;;; Octet data - -(deftype octet () - '(unsigned-byte 8)) - -(defun make-octet-vector (size) - (make-array size :element-type 'octet - :initial-element 0)) - -(defun octet-vector (&rest octets) - (make-array (length octets) :element-type 'octet - :initial-contents octets)) - -;;; ASCII characters as integers - -(defun acode (char) - (cond ((eql char :cr) - 13) - ((eql char :lf) - 10) - (t - (let ((code (char-code char))) - (if (<= 0 code 127) - code - (error "Character ~S is not in the ASCII character set" - char)))))) - -(defvar *whitespace* - (list (acode #\Space) (acode #\Tab) (acode :cr) (acode :lf))) - -(defun whitep (code) - (member code *whitespace*)) - -(defun ascii-vector (string) - (let ((vector (make-octet-vector (length string)))) - (loop for char across string - for code = (char-code char) - for i from 0 - if (< 127 code) do - (error "Invalid character for ASCII -- ~A" char) - else - do (setf (aref vector i) code)) - vector)) - -(defun ascii-subseq (vector start end) - "Return a subseq of octet-specialized VECTOR as a string." - (let ((string (make-string (- end start)))) - (loop for i from 0 - for j from start below end - do (setf (char string i) (code-char (aref vector j)))) - string)) - -(defun ascii-downcase (code) - (if (<= 65 code 90) - (+ code 32) - code)) - -(defun ascii-equal (a b) - (eql (ascii-downcase a) (ascii-downcase b))) - -(defmacro acase (value &body cases) - (flet ((convert-case-keys (keys) - (mapcar (lambda (key) - (etypecase key - (integer key) - (character (char-code key)) - (symbol - (ecase key - (:cr 13) - (:lf 10) - ((t) t))))) - (if (consp keys) keys (list keys))))) - `(case ,value - ,@(mapcar (lambda (case) - (destructuring-bind (keys &rest body) - case - `(,(if (eql keys t) - t - (convert-case-keys keys)) - ,@body))) - cases)))) - -;;; Pattern matching (for finding headers) - -(defclass matcher () - ((pattern - :initarg :pattern - :reader pattern) - (pos - :initform 0 - :accessor match-pos) - (matchedp - :initform nil - :accessor matchedp))) - -(defun reset-match (matcher) - (setf (match-pos matcher) 0 - (matchedp matcher) nil)) - -(define-condition match-failure (error) ()) - -(defun match (matcher input &key (start 0) end error) - (let ((i start) - (end (or end (length input))) - (match-end (length (pattern matcher)))) - (with-slots (pattern pos) - matcher - (loop - (cond ((= pos match-end) - (let ((match-start (- i pos))) - (setf pos 0) - (setf (matchedp matcher) t) - (return (values match-start (+ match-start match-end))))) - ((= i end) - (return nil)) - ((= (aref pattern pos) - (aref input i)) - (incf i) - (incf pos)) - (t - (if error - (error 'match-failure) - (if (zerop pos) - (incf i) - (setf pos 0))))))))) - -(defun ascii-matcher (string) - (make-instance 'matcher - :pattern (ascii-vector string))) - -(defun octet-matcher (&rest octets) - (make-instance 'matcher - :pattern (apply 'octet-vector octets))) - -(defun acode-matcher (&rest codes) - (make-instance 'matcher - :pattern (make-array (length codes) - :element-type 'octet - :initial-contents - (mapcar 'acode codes)))) - - -;;; "Connection Buffers" are a kind of callback-driven, -;;; pattern-matching chunky stream. Callbacks can be called for a -;;; certain number of octets or until one or more patterns are seen in -;;; the input. cbufs automatically refill themselves from a -;;; connection as needed. - -(defvar *cbuf-buffer-size* 8192) - -(define-condition end-of-data (error) ()) - -(defclass cbuf () - ((data - :initarg :data - :accessor data) - (connection - :initarg :connection - :accessor connection) - (start - :initarg :start - :accessor start) - (end - :initarg :end - :accessor end) - (eofp - :initarg :eofp - :accessor eofp)) - (:default-initargs - :data (make-octet-vector *cbuf-buffer-size*) - :connection nil - :start 0 - :end 0 - :eofp nil) - (:documentation "A CBUF is a connection buffer that keeps track of - incoming data from a connection. Several functions make it easy to - treat a CBUF as a kind of chunky, callback-driven stream.")) - -(define-condition cbuf-progress () - ((size - :initarg :size - :accessor cbuf-progress-size - :initform 0))) - -(defun call-processor (fun cbuf start end) - (signal 'cbuf-progress :size (- end start)) - (funcall fun (data cbuf) start end)) - -(defun make-cbuf (connection) - (make-instance 'cbuf :connection connection)) - -(defun make-stream-writer (stream) - "Create a callback for writing data to STREAM." - (lambda (data start end) - (write-sequence data stream :start start :end end))) - -(defgeneric size (cbuf) - (:method ((cbuf cbuf)) - (- (end cbuf) (start cbuf)))) - -(defgeneric emptyp (cbuf) - (:method ((cbuf cbuf)) - (zerop (size cbuf)))) - -(defgeneric refill (cbuf) - (:method ((cbuf cbuf)) - (when (eofp cbuf) - (error 'end-of-data)) - (setf (start cbuf) 0) - (setf (end cbuf) - (read-octets (data cbuf) - (connection cbuf))) - (cond ((emptyp cbuf) - (setf (eofp cbuf) t) - (error 'end-of-data)) - (t (size cbuf))))) - -(defun process-all (fun cbuf) - (unless (emptyp cbuf) - (call-processor fun cbuf (start cbuf) (end cbuf)))) - -(defun multi-cmatch (matchers cbuf) - (let (start end) - (dolist (matcher matchers (values start end)) - (multiple-value-bind (s e) - (match matcher (data cbuf) - :start (start cbuf) - :end (end cbuf)) - (when (and s (or (null start) (< s start))) - (setf start s - end e)))))) - -(defun cmatch (matcher cbuf) - (if (consp matcher) - (multi-cmatch matcher cbuf) - (match matcher (data cbuf) :start (start cbuf) :end (end cbuf)))) - -(defun call-until-end (fun cbuf) - (handler-case - (loop - (process-all fun cbuf) - (refill cbuf)) - (end-of-data () - (return-from call-until-end)))) - -(defun show-cbuf (context cbuf) - (format t "cbuf: ~A ~D - ~D~%" context (start cbuf) (end cbuf))) - -(defun call-for-n-octets (n fun cbuf) - (let ((remaining n)) - (loop - (when (<= remaining (size cbuf)) - (let ((end (+ (start cbuf) remaining))) - (call-processor fun cbuf (start cbuf) end) - (setf (start cbuf) end) - (return))) - (process-all fun cbuf) - (decf remaining (size cbuf)) - (refill cbuf)))) - -(defun call-until-matching (matcher fun cbuf) - (loop - (multiple-value-bind (start end) - (cmatch matcher cbuf) - (when start - (call-processor fun cbuf (start cbuf) end) - (setf (start cbuf) end) - (return))) - (process-all fun cbuf) - (refill cbuf))) - -(defun ignore-data (data start end) - (declare (ignore data start end))) - -(defun skip-until-matching (matcher cbuf) - (call-until-matching matcher 'ignore-data cbuf)) - - -;;; Creating HTTP requests as octet buffers - -(defclass octet-sink () - ((storage - :initarg :storage - :accessor storage)) - (:default-initargs - :storage (make-array 1024 :element-type 'octet - :fill-pointer 0 - :adjustable t)) - (:documentation "A simple stream-like target for collecting - octets.")) - -(defun add-octet (octet sink) - (vector-push-extend octet (storage sink))) - -(defun add-octets (octets sink &key (start 0) end) - (setf end (or end (length octets))) - (loop for i from start below end - do (add-octet (aref octets i) sink))) - -(defun add-string (string sink) - (loop for char across string - for code = (char-code char) - do (add-octet code sink))) - -(defun add-strings (sink &rest strings) - (mapc (lambda (string) (add-string string sink)) strings)) - -(defun add-newline (sink) - (add-octet 13 sink) - (add-octet 10 sink)) - -(defun sink-buffer (sink) - (subseq (storage sink) 0)) - -(defvar *proxy-url* (config-value "proxy-url")) - -(defun full-proxy-path (host port path) - (format nil "~:[http~;https~]://~A~:[:~D~;~*~]~A" - (eql port 443) - host - (or (null port) - (eql port 80) - (eql port 443)) - port - path)) - -(defun user-agent-string () - "Return a string suitable for using as the User-Agent value in HTTP -requests. Includes Quicklisp version and CL implementation and version -information." - (labels ((requires-encoding (char) - (not (or (alphanumericp char) - (member char '(#\. #\- #\_))))) - (encode (string) - (substitute-if #\_ #'requires-encoding string)) - (version-string (string) - (if (string-equal string nil) - "unknown" - (let* ((length (length string)) - (start (or (position-if #'digit-char-p string) - 0)) - (space (or (position #\Space string :start start) - length)) - (limit (min space length (+ start 24)))) - (encode (subseq string start limit)))))) - ;; FIXME: Be more configurable, and take/set the version from - ;; somewhere else. - (format nil "quicklisp-client/~A ~A/~A" - ql-info:*version* - (encode (lisp-implementation-type)) - (version-string (lisp-implementation-version))))) - -(defun make-request-buffer (host port path &key (method "GET")) - "Return an octet vector suitable for sending as an HTTP 1.1 request." - (setf method (string method)) - (when *proxy-url* - (setf path (full-proxy-path host port path))) - (let ((sink (make-instance 'octet-sink))) - (flet ((add-line (&rest strings) - (apply #'add-strings sink strings) - (add-newline sink))) - (add-line method " " path " HTTP/1.1") - (add-line "Host: " host (if (integerp port) - (format nil ":~D" port) - "")) - (add-line "Connection: close") - (add-line "User-Agent: " (user-agent-string)) - (add-newline sink) - (sink-buffer sink)))) - -(defun sink-until-matching (matcher cbuf) - (let ((sink (make-instance 'octet-sink))) - (call-until-matching - matcher - (lambda (buffer start end) - (add-octets buffer sink :start start :end end)) - cbuf) - (sink-buffer sink))) - - -;;; HTTP headers - -(defclass header () - ((data - :initarg :data - :accessor data) - (status - :initarg :status - :accessor status) - (name-starts - :initarg :name-starts - :accessor name-starts) - (name-ends - :initarg :name-ends - :accessor name-ends) - (value-starts - :initarg :value-starts - :accessor value-starts) - (value-ends - :initarg :value-ends - :accessor value-ends))) - -(defmethod print-object ((header header) stream) - (print-unreadable-object (header stream :type t) - (prin1 (status header) stream))) - -(defun matches-at (pattern target pos) - (= (mismatch pattern target :start2 pos) (length pattern))) - -(defun header-value-indexes (field-name header) - (loop with data = (data header) - with pattern = (ascii-vector (string-downcase field-name)) - for start across (name-starts header) - for i from 0 - when (matches-at pattern data start) - return (values (aref (value-starts header) i) - (aref (value-ends header) i)))) - -(defun ascii-header-value (field-name header) - (multiple-value-bind (start end) - (header-value-indexes field-name header) - (when start - (ascii-subseq (data header) start end)))) - -(defun all-field-names (header) - (map 'list - (lambda (start end) - (ascii-subseq (data header) start end)) - (name-starts header) - (name-ends header))) - -(defun headers-alist (header) - (mapcar (lambda (name) - (cons name (ascii-header-value name header))) - (all-field-names header))) - -(defmethod describe-object :after ((header header) stream) - (format stream "~&Decoded headers:~% ~S~%" (headers-alist header))) - -(defun content-length (header) - (let ((field-value (ascii-header-value "content-length" header))) - (when field-value - (let ((value (ignore-errors (parse-integer field-value)))) - (or value - (error "Content-Length header field value is not a number -- ~A" - field-value)))))) - -(defun chunkedp (header) - (string= (ascii-header-value "transfer-encoding" header) "chunked")) - -(defun location (header) - (ascii-header-value "location" header)) - -(defun status-code (vector) - (let* ((space (position (acode #\Space) vector)) - (c1 (- (aref vector (incf space)) 48)) - (c2 (- (aref vector (incf space)) 48)) - (c3 (- (aref vector (incf space)) 48))) - (+ (* c1 100) - (* c2 10) - (* c3 1)))) - -(defun force-downcase-field-names (header) - (loop with data = (data header) - for start across (name-starts header) - for end across (name-ends header) - do (loop for i from start below end - for code = (aref data i) - do (setf (aref data i) (ascii-downcase code))))) - -(defun skip-white-forward (pos vector) - (position-if-not 'whitep vector :start pos)) - -(defun skip-white-backward (pos vector) - (let ((nonwhite (position-if-not 'whitep vector :end pos :from-end t))) - (if nonwhite - (1+ nonwhite) - pos))) - -(defun contract-field-value-indexes (header) - "Header field values exclude leading and trailing whitespace; adjust -the indexes in the header accordingly." - (loop with starts = (value-starts header) - with ends = (value-ends header) - with data = (data header) - for i from 0 - for start across starts - for end across ends - do - (setf (aref starts i) (skip-white-forward start data)) - (setf (aref ends i) (skip-white-backward end data)))) - -(defun next-line-pos (vector) - (let ((pos 0)) - (labels ((finish (&optional (i pos)) - (return-from next-line-pos i)) - (after-cr (code) - (acase code - (:lf (finish pos)) - (t (finish (1- pos))))) - (pending (code) - (acase code - (:cr #'after-cr) - (:lf (finish pos)) - (t #'pending)))) - (let ((state #'pending)) - (loop - (setf state (funcall state (aref vector pos))) - (incf pos)))))) - -(defun make-hvector () - (make-array 16 :fill-pointer 0 :adjustable t)) - -(defun process-header (vector) - "Create a HEADER instance from the octet data in VECTOR." - (let* ((name-starts (make-hvector)) - (name-ends (make-hvector)) - (value-starts (make-hvector)) - (value-ends (make-hvector)) - (header (make-instance 'header - :data vector - :status 999 - :name-starts name-starts - :name-ends name-ends - :value-starts value-starts - :value-ends value-ends)) - (mark nil) - (pos (next-line-pos vector))) - (unless pos - (error "Unable to process HTTP header")) - (setf (status header) (status-code vector)) - (labels ((save (value vector) - (vector-push-extend value vector)) - (mark () - (setf mark pos)) - (clear-mark () - (setf mark nil)) - (finish () - (if mark - (save mark value-ends) - (save pos value-ends)) - (force-downcase-field-names header) - (contract-field-value-indexes header) - (return-from process-header header)) - (in-new-line (code) - (acase code - ((#\Tab #\Space) (setf mark nil) #'in-value) - (t - (when mark - (save mark value-ends)) - (clear-mark) - (save pos name-starts) - (in-name code)))) - (after-cr (code) - (acase code - (:lf #'in-new-line) - (t (in-new-line code)))) - (in-name (code) - (acase code - (#\: - (save pos name-ends) - (save (1+ pos) value-starts) - #'in-value) - ((:cr :lf) - (finish)) - ((#\Tab #\Space) - (error "Unexpected whitespace in header field name")) - (t - (unless (<= 0 code 127) - (error "Unexpected non-ASCII header field name")) - #'in-name))) - (in-value (code) - (acase code - (:lf (mark) #'in-new-line) - (:cr (mark) #'after-cr) - (t #'in-value)))) - (let ((state #'in-new-line)) - (loop - (incf pos) - (when (<= (length vector) pos) - (error "No header found in response")) - (setf state (funcall state (aref vector pos)))))))) - - -;;; HTTP URL parsing - -(defclass url () - ((scheme - :initarg :scheme - :accessor scheme - :initform nil) - (hostname - :initarg :hostname - :accessor hostname - :initform nil) - (port - :initarg :port - :accessor port - :initform nil) - (path - :initarg :path - :accessor path - :initform "/"))) - -(defun parse-urlstring (urlstring) - (setf urlstring (string-trim " " urlstring)) - (let* ((pos (position #\: urlstring)) - (scheme (or (and pos (subseq urlstring 0 pos)) "http")) - (pos (mismatch urlstring "://" :test 'char-equal :start1 pos)) - (mark pos) - (url (make-instance 'url))) - (setf (scheme url) scheme) - (labels ((save () - (subseq urlstring mark pos)) - (mark () - (setf mark pos)) - (finish () - (return-from parse-urlstring url)) - (hostname-char-p (char) - (position char "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_." - :test 'char-equal)) - (at-start (char) - (case char - (#\/ - (setf (port url) nil) - (mark) - #'in-path) - (t - #'in-host))) - (in-host (char) - (case char - ((#\/ :end) - (setf (hostname url) (save)) - (mark) - #'in-path) - (#\: - (setf (hostname url) (save)) - (mark) - #'in-port) - (t - (unless (hostname-char-p char) - (error "~S is not a valid URL" urlstring)) - #'in-host))) - (in-port (char) - (case char - ((#\/ :end) - (setf (port url) - (parse-integer urlstring - :start (1+ mark) - :end pos)) - (mark) - #'in-path) - (t - (unless (digit-char-p char) - (error "Bad port in URL ~S" urlstring)) - #'in-port))) - (in-path (char) - (case char - ((#\# :end) - (setf (path url) (save)) - (finish))) - #'in-path)) - (let ((state #'at-start)) - (loop - (when (<= (length urlstring) pos) - (funcall state :end) - (finish)) - (setf state (funcall state (aref urlstring pos))) - (incf pos)))))) - -(defun url (thing) - (if (stringp thing) - (parse-urlstring thing) - thing)) - -(defgeneric request-buffer (method url) - (:method (method url) - (setf url (url url)) - (make-request-buffer (hostname url) (or (port url) 80) (path url) - :method method))) - -(defun urlstring (url) - (format nil "~@[~A://~]~@[~A~]~@[:~D~]~A" - (and (hostname url) (scheme url)) - (hostname url) - (port url) - (path url))) - -(defmethod print-object ((url url) stream) - (print-unreadable-object (url stream :type t) - (prin1 (urlstring url) stream))) - -(defun merge-urls (url1 url2) - (setf url1 (url url1)) - (setf url2 (url url2)) - (make-instance 'url - :scheme (or (scheme url1) - (scheme url2)) - :hostname (or (hostname url1) - (hostname url2)) - :port (or (port url1) - (port url2)) - :path (or (path url1) - (path url2)))) - - -;;; Requesting an URL and saving it to a file - -(defparameter *maximum-redirects* 10) -(defvar *default-url-defaults* (url "http://src.quicklisp.org/")) - -(defun read-http-header (cbuf) - (let ((header-data (sink-until-matching (list (acode-matcher :lf :lf) - (acode-matcher :cr :cr) - (acode-matcher :cr :lf :cr :lf)) - cbuf))) - (process-header header-data))) - -(defun read-chunk-header (cbuf) - (let* ((header-data (sink-until-matching (acode-matcher :cr :lf) cbuf)) - (end (or (position (acode :cr) header-data) - (position (acode #\;) header-data)))) - (values (parse-integer (ascii-subseq header-data 0 end) :radix 16)))) - -(defun save-chunk-response (stream cbuf) - "For a chunked response, read all chunks and write them to STREAM." - (let ((fun (make-stream-writer stream)) - (matcher (acode-matcher :cr :lf))) - (loop - (let ((chunk-size (read-chunk-header cbuf))) - (when (zerop chunk-size) - (return)) - (call-for-n-octets chunk-size fun cbuf) - (skip-until-matching matcher cbuf))))) - -(defun save-response (file header cbuf &key (if-exists :rename-and-delete)) - (with-open-file (stream file - :direction :output - :if-exists if-exists - :element-type 'octet) - (let ((content-length (content-length header))) - (cond ((chunkedp header) - (save-chunk-response stream cbuf)) - (content-length - (call-for-n-octets content-length - (make-stream-writer stream) - cbuf)) - (t - (call-until-end (make-stream-writer stream) cbuf)))))) - -(defun call-with-progress-bar (size fun) - (let ((progress-bar (make-progress-bar size))) - (start-display progress-bar) - (flet ((update (condition) - (update-progress progress-bar - (cbuf-progress-size condition)))) - (handler-bind ((cbuf-progress #'update)) - (funcall fun))) - (finish-display progress-bar))) - -(define-condition fetch-error (error) ()) - -(define-condition unexpected-http-status (fetch-error) - ((status-code - :initarg :status-code - :reader unexpected-http-status-code) - (url - :initarg :url - :reader unexpected-http-status-url)) - (:report - (lambda (condition stream) - (format stream "Unexpected HTTP status for ~A: ~A" - (unexpected-http-status-url condition) - (unexpected-http-status-code condition))))) - -(define-condition too-many-redirects (fetch-error) - ((url - :initarg :url - :reader too-many-redirects-url) - (redirect-count - :initarg :redirect-count - :reader too-many-redirects-count)) - (:report - (lambda (condition stream) - (format stream "Too many redirects (~:D) for ~A" - (too-many-redirects-count condition) - (too-many-redirects-url condition))))) - -(defvar *fetch-scheme-functions* - '(("http" . http-fetch)) - "assoc list to decide which scheme-function are called by FETCH function.") - -(defun fetch (url file &rest rest) - "Request URL and write the body of the response to FILE." - (let* ((url (merge-urls url *default-url-defaults*)) - (call (cdr (assoc (scheme url) *fetch-scheme-functions* :test 'equal)))) - (if call - (apply call (urlstring url) file rest) - (error "Unknown scheme ~S" url)))) - -(defun http-fetch (url file &key (follow-redirects t) quietly - (if-exists :rename-and-delete) - (maximum-redirects *maximum-redirects*)) - "default scheme-function for http protocol." - (setf url (merge-urls url *default-url-defaults*)) - (setf file (merge-pathnames file)) - (let ((redirect-count 0) - (original-url url) - (connect-url (or (url *proxy-url*) url)) - (stream (if quietly - (make-broadcast-stream) - *trace-output*))) - (loop - (when (<= maximum-redirects redirect-count) - (error 'too-many-redirects - :url original-url - :redirect-count redirect-count)) - (with-connection (connection (hostname connect-url) (or (port connect-url) 80)) - (let ((cbuf (make-instance 'cbuf :connection connection)) - (request (request-buffer "GET" url))) - (write-octets request connection) - (let ((header (read-http-header cbuf))) - (loop while (= (status header) 100) - do (setf header (read-http-header cbuf))) - (cond ((= (status header) 200) - (let ((size (content-length header))) - (format stream "~&; Fetching ~A~%" url) - (if (and (numberp size) - (plusp size)) - (format stream "; ~$KB~%" (/ size 1024)) - (format stream "; Unknown size~%")) - (if quietly - (save-response file header cbuf - :if-exists if-exists) - (call-with-progress-bar - (content-length header) - (lambda () - (save-response file header cbuf - :if-exists if-exists)))))) - ((not (<= 300 (status header) 399)) - (error 'unexpected-http-status - :url url - :status-code (status header)))) - (if (and follow-redirects (<= 300 (status header) 399)) - (let ((new-urlstring (ascii-header-value "location" header))) - (when (not new-urlstring) - (error "Redirect code ~D received, but no Location: header" - (status header))) - (incf redirect-count) - (setf url (merge-urls new-urlstring - url)) - (format stream "~&; Redirecting to ~A~%" url)) - (return (values header (and file (probe-file file))))))))))) diff --git a/sbcl/.quicklisp/quicklisp/impl-util.lisp b/sbcl/.quicklisp/quicklisp/impl-util.lisp deleted file mode 100644 index 654c217..0000000 --- a/sbcl/.quicklisp/quicklisp/impl-util.lisp +++ /dev/null @@ -1,340 +0,0 @@ -;;;; impl-util.lisp - -(in-package #:ql-impl-util) - -(definterface call-with-quiet-compilation (fun) - (:documentation - "Call FUN with warnings, style-warnings, and other verbose messages - suppressed.") - (:implementation t - (let ((*load-verbose* nil) - (*compile-verbose* nil) - (*load-print* nil) - (*compile-print* nil)) - (handler-bind ((warning #'muffle-warning)) - (funcall fun))))) - -(defimplementation (call-with-quiet-compilation :for sbcl :qualifier :around) - (fun) - (declare (ignore fun)) - (handler-bind ((ql-sbcl:compiler-note #'muffle-warning)) - (call-next-method))) - -(defimplementation (call-with-quiet-compilation :for cmucl :qualifier :around) - (fun) - (declare (ignore fun)) - (let ((ql-cmucl:*gc-verbose* nil)) - (call-next-method))) - -(definterface rename-directory (from to) - (:implementation t - (rename-file from to) - (truename to)) - (:implementation cmucl - (rename-file from (string-right-trim "/" (namestring to))) - (truename to)) - (:implementation clisp - (ql-clisp:rename-directory from to) - (truename to))) - -(definterface probe-directory (pathname) - (:documentation "Return the truename of PATHNAME, if it exists and - is a directory, or NIL otherwise.") - (:implementation t - (let ((directory (probe-file pathname))) - (when directory - ;; probe-file is specified to return the truename of the path, - ;; but Allegro does not return the truename; truenamize it. - (truename directory)))) - (:implementation clisp - (let ((directory (ql-clisp:probe-pathname pathname))) - (when (and directory (ql-clisp:probe-directory directory)) - directory)))) - -(definterface init-file-name () - (:documentation "Return the init file name for the current implementation.") - (:implementation allegro - ".clinit.cl") - (:implementation abcl - ".abclrc") - (:implementation ccl - #+windows - "ccl-init.lisp" - #-windows - ".ccl-init.lisp") - (:implementation clasp - ".clasprc") - (:implementation clisp - ".clisprc.lisp") - (:implementation ecl - ".eclrc") - (:implementation mkcl - ".mkclrc") - (:implementation lispworks - ".lispworks") - (:implementation sbcl - ".sbclrc") - (:implementation cmucl - ".cmucl-init.lisp") - (:implementation scl - ".scl-init.lisp") - ) - -(defun init-file-name-for (&optional implementation-designator) - (let* ((class-name (find-symbol (string-upcase implementation-designator) - 'ql-impl)) - (class (find-class class-name nil))) - (when class - (let ((*implementation* (make-instance class))) - (init-file-name))))) - -(defun quicklisp-init-file-form () - "Return a form suitable for describing the location of the quicklisp - init file. If the file is available relative to the home directory, - returns a form that merges with the home directory instead of - specifying an absolute file." - (let* ((init-file (ql-setup:qmerge "setup.lisp")) - (enough (enough-namestring init-file (user-homedir-pathname)))) - (cond ((equal (pathname enough) (pathname init-file)) - ;; The init-file is somewhere outside of the home directory - (pathname enough)) - (t - `(merge-pathnames ,enough (user-homedir-pathname)))))) - -(defun write-init-forms (stream &key (indentation 0)) - (format stream "~%~v@T;;; The following lines added by ql:add-to-init-file:~%" - indentation) - (format stream "~v@T#-quicklisp~%" indentation) - (let ((*print-case* :downcase)) - (format stream "~v@T(let ((quicklisp-init ~S))~%" - indentation - (quicklisp-init-file-form))) - (format stream "~v@T (when (probe-file quicklisp-init)~%" indentation) - (format stream "~v@T (load quicklisp-init)))~%~%" indentation)) - -(defun suitable-lisp-init-file (implementation) - "Return the name of IMPLEMENTATION's init file. If IMPLEMENTAION is -a string or pathname, return its merged pathname instead." - (typecase implementation - ((or string pathname) - (merge-pathnames implementation)) - ((or null (eql t)) - (init-file-name)) - (t - (init-file-name-for implementation)))) - -(defun add-to-init-file (&optional implementation-or-file) - "Add forms to the Lisp implementation's init file that will load -quicklisp at CL startup." - (let ((init-file (suitable-lisp-init-file implementation-or-file))) - (unless init-file - (error "Don't know how to add to init file for your implementation.")) - (setf init-file (merge-pathnames init-file (user-homedir-pathname))) - (format *query-io* "~&I will append the following lines to ~S:~%" - init-file) - (write-init-forms *query-io* :indentation 2) - (when (ql-util:press-enter-to-continue) - (with-open-file (stream init-file - :direction :output - :if-does-not-exist :create - :if-exists :append) - (write-init-forms stream))) - init-file)) - - - -;;; -;;; Native namestrings. -;;; - -(definterface native-namestring (pathname) - (:documentation "In Clozure CL, #\\.s in pathname-names are escaped - in namestrings with #\\> on Windows and #\\\\ elsewhere. This can - cause a problem when using CL:NAMESTRING to store pathname data that - might be used by other implementations. NATIVE-NAMESTRING is - intended to provide a namestring that can be parsed as a same-enough - object on multiple implementations.") - (:implementation t - (namestring pathname)) - (:implementation ccl - (ql-ccl:native-translated-namestring pathname)) - (:implementation sbcl - (ql-sbcl:native-namestring pathname))) - - -;;; -;;; Directory write date -;;; - -(definterface directory-write-date (pathname) - (:documentation "Return the write-date of the directory designated - by PATHNAME as a universal time, like file-write-date.") - (:implementation t - (file-write-date pathname)) - (:implementation clisp - (nth-value 2 (ql-clisp:probe-pathname pathname)))) - - -;;; -;;; Deleting a directory tree -;;; - -(defvar *wild-entry* - (make-pathname :name :wild :type :wild :version :wild)) - -(defvar *wild-relative* - (make-pathname :directory '(:relative :wild))) - -(definterface directoryp (entry) - (:documentation "Return true if ENTRY refers to a directory.") - (:implementation t - (not (or (pathname-name entry) - (pathname-type entry)))) - (:implementation allegro - (ql-allegro:file-directory-p entry)) - (:implementation lispworks - (ql-lispworks:file-directory-p entry))) - -(definterface directory-entries (directory) - (:documentation "Return all directory entries of DIRECTORY as a - list, or NIL if there are no directory entries. Excludes the \".\" - and \"..\" entries.") - (:implementation allegro - (directory directory - #+allegro :directories-are-files - #+allegro nil - #+allegro :follow-symbolic-links - #+allegro nil)) - (:implementation abcl - (directory (merge-pathnames *wild-entry* directory) - #+abcl :resolve-symlinks #+abcl nil)) - (:implementation ccl - (directory (merge-pathnames *wild-entry* directory) - #+ccl :directories #+ccl t - #+ccl :follow-links #+ccl nil)) - (:implementation clasp - (nconc - (directory (merge-pathnames *wild-entry* directory) - #+clasp :resolve-symlinks #+clasp nil) - (directory (merge-pathnames *wild-relative* directory) - #+clasp :resolve-symlinks #+clasp nil))) - (:implementation clisp - ;; :full gives pathnames as well as truenames, BUT: it returns a - ;; singleton pathname, not a list, on dead symlinks. - (remove nil - (mapcar (lambda (entry) (and (listp entry) (first entry))) - (nconc (directory (merge-pathnames *wild-entry* directory) - #+clisp :full #+clisp t - #+clisp :if-does-not-exist #+clisp :keep) - (directory (merge-pathnames *wild-relative* directory) - #+clisp :full #+clisp t - #+clisp :if-does-not-exist #+clisp :keep))))) - (:implementation cmucl - (directory (merge-pathnames *wild-entry* directory) - #+cmucl :truenamep #+cmucl nil)) - (:implementation scl - (directory (merge-pathnames *wild-entry* directory) - #+scl :truenamep #+scl nil)) - (:implementation lispworks - (directory (merge-pathnames *wild-entry* directory) - #+lispworks :directories #+lispworks t - #+lispworks :link-transparency #+lispworks nil)) - (:implementation ecl - (nconc - (directory (merge-pathnames *wild-entry* directory) - #+ecl :resolve-symlinks #+ecl nil) - (directory (merge-pathnames *wild-relative* directory) - #+ecl :resolve-symlinks #+ecl nil))) - (:implementation mkcl - (setf directory (truename directory)) - (nconc - (directory (merge-pathnames *wild-entry* directory)) - (directory (merge-pathnames *wild-relative* directory)))) - (:implementation sbcl - (directory (merge-pathnames *wild-entry* directory) - #+sbcl :resolve-symlinks #+sbcl nil))) - -(defimplementation (directory-entries :qualifier :around) (directory) - ;; Don't return any entries when called with a non-directory - ;; argument - (if (directoryp directory) - (call-next-method) - (warn "directory-entries - not a directory -- ~S" directory))) - -(definterface delete-directory (entry) - (:documentation "Delete the directory ENTRY. Might signal an error - if it is not an empty directory.") - (:implementation t - (delete-file entry)) - (:implementation allegro - (ql-allegro:delete-directory entry)) - (:implementation ccl - (ql-ccl:delete-directory entry)) - (:implementation clasp - (ql-clasp:rmdir entry)) - (:implementation clisp - (ql-clisp:delete-directory entry)) - (:implementation cmucl - (ql-cmucl:unix-rmdir (namestring entry))) - (:implementation scl - (ql-scl:unix-rmdir (ql-scl:unix-namestring entry))) - (:implementation ecl - (ql-ecl:rmdir entry)) - (:implementation mkcl - (ql-mkcl:rmdir entry)) - (:implementation lispworks - (ql-lispworks:delete-directory entry)) - (:implementation sbcl - (ql-sbcl:rmdir entry))) - -(defimplementation (delete-directory :qualifier :around) (directory) - ;; Don't delete non-directories with delete-directory - (if (directoryp directory) - (call-next-method) - (error "delete-directory - not a directory -- ~A" directory))) - -(definterface delete-directory-tree (pathname) - (:documentation "Delete the directory tree rooted at PATHNAME.") - (:implementation t - (let ((directories-to-process (list (truename pathname))) - (directories-to-delete '())) - (loop - (unless directories-to-process - (return)) - (let* ((current (pop directories-to-process)) - (entries (directory-entries current))) - (push current directories-to-delete) - (dolist (entry entries) - (if (directoryp entry) - (push entry directories-to-process) - (delete-file entry))))) - (map nil 'delete-directory directories-to-delete))) - (:implementation allegro - (ql-allegro:delete-directory-and-files pathname)) - (:implementation ccl - (ql-ccl:delete-directory pathname))) - -(defimplementation (delete-directory-tree :qualifier :around) (pathname) - (if (directoryp pathname) - (call-next-method) - (progn - (warn "delete-directory-tree - not a directory, ~ - deleting anyway -- ~s" pathname) - (delete-file pathname)))) - -(defun map-directory-tree (directory fun) - "Call FUN for every file in directory and all its subdirectories, -recursively. Uses the truename of directory as a starting point. Does -not follow symlinks, but, on some implementations, DOES include -potentially dead symlinks." - (let ((directories-to-process (list (truename directory)))) - (loop - (unless directories-to-process - (return)) - (let* ((current (pop directories-to-process)) - (entries (directory-entries current))) - (dolist (entry entries) - (if (directoryp entry) - (push entry directories-to-process) - (funcall fun entry))))))) - diff --git a/sbcl/.quicklisp/quicklisp/impl.lisp b/sbcl/.quicklisp/quicklisp/impl.lisp deleted file mode 100644 index 8411375..0000000 --- a/sbcl/.quicklisp/quicklisp/impl.lisp +++ /dev/null @@ -1,301 +0,0 @@ -(in-package #:ql-impl) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun error-unimplemented (&rest args) - (declare (ignore args)) - (error "Not implemented"))) - -(defvar *interfaces* (make-hash-table) - "A table of defined interfaces and their documentation.") - -(defun show-interfaces () - "Display information about what interfaces are defined." - (maphash (lambda (interface info) - (destructuring-bind (arguments docstring) - info - (let ((*package* (find-package :keyword))) - (format t "(~S ~:[()~;~:*~A~]~@[~% ~S~])~%" - interface arguments docstring)))) - *interfaces*)) - -(defmacro neuter-package (name) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (let ((definition (fdefinition 'error-unimplemented))) - (do-external-symbols (symbol ,(string name)) - (unless (fboundp symbol) - (setf (fdefinition symbol) definition)))))) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun feature-expression-passes-p (expression) - (cond ((keywordp expression) - (member expression *features*)) - ((consp expression) - (case (first expression) - (or - (some 'feature-expression-passes-p (rest expression))) - (and - (every 'feature-expression-passes-p (rest expression))))) - (t (error "Unrecognized feature expression -- ~S" expression))))) - - -(defmacro define-implementation-package (feature package-name &rest options) - (let* ((output-options '((:use) - (:export #:lisp))) - (prep (cdr (assoc :prep options))) - (class-option (cdr (assoc :class options))) - (class (first class-option)) - (superclasses (rest class-option)) - (import-options '()) - (effectivep (feature-expression-passes-p feature))) - (dolist (option options) - (ecase (first option) - ((:prep :class)) - ((:import-from - :import) - (push option import-options)) - ((:export - :shadow - :intern - :documentation) - (push option output-options)) - ((:reexport-from) - (push (cons :export (cddr option)) output-options) - (push (cons :import-from (cdr option)) import-options)))) - `(progn - ,@(when effectivep - `((eval-when (:compile-toplevel :load-toplevel :execute) - ,@prep))) - (defclass ,class ,superclasses ()) - (defpackage ,package-name ,@output-options - ,@(when effectivep - import-options)) - ,@(when effectivep - `((setf *implementation* (make-instance ',class)))) - ,@(unless effectivep - `((neuter-package ,package-name)))))) - -(defmacro definterface (name lambda-list &body options) - (let* ((doc-option (find :documentation options :key #'first)) - (doc (second doc-option))) - (setf (gethash name *interfaces*) (list lambda-list doc))) - (let* ((forbidden (intersection lambda-list lambda-list-keywords)) - (gf-options (remove :implementation options :key #'first)) - (implementations (set-difference options gf-options)) - (implementation-arg (copy-symbol '%implementation))) - (when forbidden - (error "~S not allowed in definterface lambda list" forbidden)) - (flet ((method-option (class body) - `(:method ((,implementation-arg ,class) ,@lambda-list) - ,@body))) - (let ((generic-name (intern (format nil "%~A" name)))) - `(progn - (defgeneric ,generic-name (lisp ,@lambda-list) - ,@gf-options - ,@(mapcan (lambda (implementation) - (destructuring-bind (class &rest body) - (rest implementation) - (mapcar (lambda (class) - (method-option class body)) - (if (consp class) - class - (list class))))) - implementations)) - (defun ,name ,lambda-list - (,generic-name *implementation* ,@lambda-list))))))) - -(defmacro defimplementation (name-and-options - lambda-list &body body) - (destructuring-bind (name &key (for t) qualifier) - (if (consp name-and-options) - name-and-options - (list name-and-options)) - (unless for - (error "You must specify an implementation name.")) - (let ((generic-name (find-symbol (format nil "%~A" name))) - (implementation-arg (copy-symbol '%implementation))) - (unless generic-name - (error "~S does not name an implementation function" name)) - `(defmethod ,generic-name - ,@(when qualifier (list qualifier)) - ,(list* `(,implementation-arg ,for) lambda-list) ,@body)))) - - -;;; Bootstrap implementations - -(defvar *implementation* nil) -(defclass lisp () ()) - - -;;; Allegro Common Lisp - -(define-implementation-package :allegro #:ql-allegro - (:documentation - "Allegro Common Lisp - http://www.franz.com/products/allegrocl/") - (:class allegro) - (:reexport-from #:socket - #:make-socket) - (:reexport-from #:excl - #:file-directory-p - #:delete-directory - #:delete-directory-and-files - #:read-vector)) - - -;;; Armed Bear Common Lisp - -(define-implementation-package :abcl #:ql-abcl - (:documentation - "Armed Bear Common Lisp - http://common-lisp.net/project/armedbear/") - (:class abcl) - (:reexport-from #:ext - #:make-socket - #:get-socket-stream)) - -;;; Clozure CL - -(define-implementation-package :ccl #:ql-ccl - (:documentation - "Clozure Common Lisp - http://www.clozure.com/clozurecl.html") - (:class ccl) - (:reexport-from #:ccl - #:delete-directory - #:make-socket - #:native-translated-namestring)) - -;;; CLASP - -(define-implementation-package :clasp #:ql-clasp - (:documentation "CLASP - http://github.com/drmeister/clasp") - (:class clasp) - (:prep - (require 'sockets)) - (:intern #:host-network-address) - (:reexport-from #:si - #:rmdir - #:file-kind) - (:reexport-from #:sb-bsd-sockets - #:get-host-by-name - #:host-ent-address - #:inet-socket - #:socket-connect - #:socket-make-stream)) - - -;;; GNU CLISP - -(define-implementation-package :clisp #:ql-clisp - (:documentation "GNU CLISP - http://clisp.cons.org/") - (:class clisp) - (:reexport-from #:socket - #:socket-connect) - (:reexport-from #:ext - #:delete-directory - #:rename-directory - #:probe-directory - #:probe-pathname - #:read-byte-sequence)) - - -;;; CMUCL - -(define-implementation-package :cmu #:ql-cmucl - (:documentation "CMU Common Lisp - http://www.cons.org/cmucl/") - (:class cmucl) - (:reexport-from #:system - #:make-fd-stream) - (:reexport-from #:unix - #:unix-rmdir) - (:reexport-from #:extensions - #:connect-to-inet-socket - #:*gc-verbose*)) - -(defvar ql-cmucl:*gc-verbose*) - - -;;; Scieneer CL - -(define-implementation-package :scl #:ql-scl - (:documentation "Scieneer Common Lisp - http://www.scieneer.com/scl/") - (:class scl) - (:reexport-from #:system - #:make-fd-stream) - (:reexport-from #:unix - #:unix-rmdir) - (:reexport-from #:extensions - #:connect-to-inet-socket - #:unix-namestring)) - - -;;; LispWorks - -(define-implementation-package :lispworks #:ql-lispworks - (:documentation "LispWorks - http://www.lispworks.com/") - (:class lispworks) - (:prep - (require "comm")) - (:reexport-from #:lw - #:file-directory-p - #:delete-directory) - (:reexport-from #:comm - #:open-tcp-stream - #:get-host-entry)) - - -;;; ECL - -(define-implementation-package :ecl #:ql-ecl - (:documentation "ECL - http://ecls.sourceforge.net/") - (:class ecl) - (:prep - (require 'sockets)) - (:intern #:host-network-address) - (:reexport-from #:si - #:rmdir - #:file-kind) - (:reexport-from #:sb-bsd-sockets - #:get-host-by-name - #:host-ent-address - #:inet-socket - #:socket-connect - #:socket-make-stream)) - -;;; MKCL - -(define-implementation-package :mkcl #:ql-mkcl - (:documentation "ManKai Common Lisp - http://common-lisp.net/project/mkcl/") - (:class mkcl) - (:prep - (require 'sockets)) - (:intern #:host-network-address) - (:reexport-from #:si - #:rmdir - #:file-kind) - (:reexport-from #:sb-bsd-sockets - #:get-host-by-name - #:host-ent-address - #:inet-socket - #:socket-connect - #:socket-make-stream)) - - -;;; SBCL - -(define-implementation-package :sbcl #:ql-sbcl - (:class sbcl) - (:documentation - "Steel Bank Common Lisp - http://www.sbcl.org/") - (:prep - (require 'sb-posix) - (require 'sb-bsd-sockets)) - (:intern #:host-network-address) - (:reexport-from #:sb-posix - #:rmdir) - (:reexport-from #:sb-ext - #:compiler-note - #:native-namestring) - (:reexport-from #:sb-bsd-sockets - #:get-host-by-name - #:inet-socket - #:host-ent-address - #:socket-connect - #:socket-make-stream)) diff --git a/sbcl/.quicklisp/quicklisp/local-projects.lisp b/sbcl/.quicklisp/quicklisp/local-projects.lisp deleted file mode 100644 index a068c2e..0000000 --- a/sbcl/.quicklisp/quicklisp/local-projects.lisp +++ /dev/null @@ -1,138 +0,0 @@ -;;;; local-projects.lisp - -;;; -;;; Local project support. -;;; -;;; Local projects can be placed in /local-projects/. New -;;; entries in that directory are automatically scanned for system -;;; files for use with QL:QUICKLOAD. -;;; -;;; This works by keeping a cache of system file pathnames in -;;; /local-projects/system-index.txt. Whenever the -;;; timestamp on the local projects directory is newer than the -;;; timestamp on the system index file, the entire tree is re-scanned -;;; and cached. -;;; -;;; This will pick up system files that are created as a result of -;;; creating new project directory in /local-projects/, -;;; e.g. unpacking a tarball or zip file, checking out a project from -;;; version control, etc. It will NOT pick up a system file that is -;;; added sometime later in a subdirectory; for that, the -;;; REGISTER-LOCAL-PROJECTS function is needed to rebuild the system -;;; file index. -;;; -;;; In the event there are multiple systems of the same name in the -;;; directory tree, the one with the shortest pathname namestring is -;;; used. This is intended to ignore stuff like _darcs pristine -;;; directories. -;;; -;;; Work in progress! -;;; - -(in-package #:quicklisp-client) - -(defparameter *local-project-directories* - (list (qmerge "local-projects/")) - "The default local projects directory.") - -(defun system-index-file (pathname) - "Return the system index file for the directory PATHNAME." - (merge-pathnames "system-index.txt" pathname)) - -(defun matching-directory-files (directory fun) - (let ((result '())) - (map-directory-tree directory - (lambda (file) - (when (funcall fun file) - (push file result)))) - result)) - -(defun local-project-system-files (pathname) - "Return a list of system files under PATHNAME." - (let* ((files (matching-directory-files pathname - (lambda (file) - (equalp (pathname-type file) - "asd"))))) - (setf files (sort files - #'string< - :key #'namestring)) - (stable-sort files - #'< - :key (lambda (file) - (length (namestring file)))))) - -(defun make-system-index (pathname) - "Create a system index file for all system files under -PATHNAME. Current format is one native namestring per line." - (setf pathname (truename pathname)) - (with-open-file (stream (system-index-file pathname) - :direction :output - :if-exists :rename-and-delete) - (dolist (system-file (local-project-system-files pathname)) - (let ((system-path (enough-namestring system-file pathname))) - (write-line (native-namestring system-path) stream))) - (probe-file stream))) - -(defun find-valid-system-index (pathname) - "Find a valid system index file for PATHNAME; one that both exists -and has a newer timestamp than PATHNAME." - (let* ((file (system-index-file pathname)) - (probed (probe-file file))) - (when (and probed - (<= (directory-write-date pathname) - (file-write-date probed))) - probed))) - -(defun ensure-system-index (pathname) - "Find or create a system index file for PATHNAME." - (or (find-valid-system-index pathname) - (make-system-index pathname))) - -(defun find-system-in-index (system index-file) - "If any system pathname in INDEX-FILE has a pathname-name matching -SYSTEM, return its full pathname." - (with-open-file (stream index-file) - (loop for namestring = (read-line stream nil) - while namestring - when (string= system (pathname-name namestring)) - return (or (probe-file (merge-pathnames namestring index-file)) - ;; If the indexed .asd file doesn't exist anymore - ;; then regenerate the index and restart the search. - (find-system-in-index system (make-system-index (directory-namestring index-file))))))) - -(defun local-projects-searcher (system-name) - "This function is added to ASDF:*SYSTEM-DEFINITION-SEARCH-FUNCTIONS* -to use the local project directory and cache to find systems." - (dolist (directory *local-project-directories*) - (when (probe-directory directory) - (let ((system-index (ensure-system-index directory))) - (when system-index - (let ((system (find-system-in-index system-name system-index))) - (when system - (return system)))))))) - -(defun list-local-projects () - "Return a list of pathnames to local project system files." - (let ((result (make-array 16 :fill-pointer 0 :adjustable t)) - (seen (make-hash-table :test 'equal))) - (dolist (directory *local-project-directories* - (coerce result 'list)) - (let ((index (ensure-system-index directory))) - (when index - (with-open-file (stream index) - (loop for line = (read-line stream nil) - while line do - (let ((pathname (merge-pathnames line index))) - (unless (gethash (pathname-name pathname) seen) - (setf (gethash (pathname-name pathname) seen) t) - (vector-push-extend (merge-pathnames line index) - result)))))))))) - -(defun register-local-projects () - "Force a scan of the local projects directory to create the system -file index." - (map nil 'make-system-index *local-project-directories*)) - -(defun list-local-systems () - "Return a list of local project system names." - (mapcar #'pathname-name (list-local-projects))) diff --git a/sbcl/.quicklisp/quicklisp/minitar.lisp b/sbcl/.quicklisp/quicklisp/minitar.lisp deleted file mode 100644 index 49cde86..0000000 --- a/sbcl/.quicklisp/quicklisp/minitar.lisp +++ /dev/null @@ -1,192 +0,0 @@ -(in-package #:ql-minitar) - -(defconstant +block-size+ 512) -(defconstant +space-code+ 32) -(defconstant +newline-code+ 10) -(defconstant +equals-code+ 61) - -(defun make-block-buffer () - (make-array +block-size+ :element-type '(unsigned-byte 8) :initial-element 0)) - -(defun skip-n-blocks (n stream) - (let ((block (make-block-buffer))) - (dotimes (i n) - (read-sequence block stream)))) - -(defun read-octet-vector (length stream) - (let ((block (make-block-buffer)) - (vector (make-array length :element-type '(unsigned-byte 8))) - (offset 0) - (block-count (ceiling length +block-size+))) - (dotimes (i block-count) - (read-sequence block stream) - (replace vector block :start1 offset) - (incf offset +block-size+)) - vector)) - - -(defun decode-pax-header-record (vector offset) - "Decode VECTOR as pax extended header data. Returns the keyword and -value it specifies as multiple values." - ;; Vector format is: "%d %s=%s\n", , , - ;; See http://pubs.opengroup.org/onlinepubs/009695399/utilities/pax.html - (let* ((length-start offset) - (length-end (position +space-code+ vector :start length-start)) - (length-string (ascii-subseq vector length-start length-end)) - (length (parse-integer length-string)) - (keyword-start (1+ length-end)) - (keyword-end (position +equals-code+ vector :start keyword-start)) - (keyword (ascii-subseq vector keyword-start keyword-end)) - (value-start (1+ keyword-end)) - (value-end (1- (+ offset length))) - (value (ascii-subseq vector value-start value-end))) - (values keyword value (+ offset length)))) - -(defun decode-pax-header (vector) - "Decode VECTOR as a pax header and return it as an alist." - (let ((header nil) - (offset 0) - (length (length vector))) - (loop - (when (<= length offset) - (return header)) - (multiple-value-bind (keyword value new-offset) - (decode-pax-header-record vector offset) - (setf header (acons keyword value header)) - (setf offset new-offset))))) - -(defun pax-header-path (vector) - "Decode VECTOR as a pax header and return its 'path' value, if - any." - (let ((header-alist (decode-pax-header vector))) - (cdr (assoc "path" header-alist :test 'equal)))) - -(defun ascii-subseq (vector start end) - (let ((string (make-string (- end start)))) - (loop for i from 0 - for j from start below end - do (setf (char string i) (code-char (aref vector j)))) - string)) - -(defun block-asciiz-string (block start length) - (let* ((end (+ start length)) - (eos (or (position 0 block :start start :end end) - end))) - (ascii-subseq block start eos))) - -(defun prefix (header) - (when (plusp (aref header 345)) - (block-asciiz-string header 345 155))) - -(defun name (header) - (block-asciiz-string header 0 100)) - -(defun payload-size (header) - (values (parse-integer (block-asciiz-string header 124 12) :radix 8))) - -(defun nth-block (n file) - (with-open-file (stream file :element-type '(unsigned-byte 8)) - (let ((block (make-block-buffer))) - (skip-n-blocks (1- n) stream) - (read-sequence block stream) - block))) - -(defun payload-type (code) - (case code - (0 :file) - (48 :file) - (50 :symlink) - (76 :long-name) - (53 :directory) - (103 :global-header) - (120 :pax-extended-header) - (t :unsupported))) - -(defun full-path (header) - (let ((prefix (prefix header)) - (name (name header))) - (if prefix - (format nil "~A/~A" prefix name) - name))) - -(defun save-file (file size stream) - (multiple-value-bind (full-blocks partial) - (truncate size +block-size+) - (ensure-directories-exist file) - (with-open-file (outstream file - :direction :output - :if-exists :supersede - :element-type '(unsigned-byte 8)) - (let ((block (make-block-buffer))) - (dotimes (i full-blocks) - (read-sequence block stream) - (write-sequence block outstream)) - (when (plusp partial) - (read-sequence block stream) - (write-sequence block outstream :end partial)))))) - -(defun gnu-long-name (size stream) - ;; GNU long names are simply the filename (null terminated) packed into the - ;; payload. - (let ((payload (read-octet-vector size stream))) - (ascii-subseq payload 0 (1- size)))) - -(defun unpack-tarball (tarfile &key (directory *default-pathname-defaults*)) - (let ((block (make-block-buffer)) - (extended-path nil)) - (with-open-file (stream tarfile :element-type '(unsigned-byte 8)) - (loop - (let ((size (read-sequence block stream))) - (when (zerop size) - (return)) - (unless (= size +block-size+) - (error "Bad size on tarfile")) - (when (every #'zerop block) - (return)) - (let* ((payload-code (aref block 156)) - (payload-type (payload-type payload-code)) - (tar-path (or (shiftf extended-path nil) - (full-path block))) - (full-path (merge-pathnames tar-path directory)) - (payload-size (payload-size block)) - (block-count (ceiling (payload-size block) +block-size+))) - (case payload-type - (:file - (save-file full-path payload-size stream)) - (:directory - (ensure-directories-exist full-path)) - ((:symlink :global-header) - ;; These block types aren't required for Quicklisp archives - (skip-n-blocks block-count stream)) - (:long-name - (setf extended-path (gnu-long-name payload-size stream))) - (:pax-extended-header - (let* ((pax-header-data (read-octet-vector payload-size stream)) - (path (pax-header-path pax-header-data))) - (when path - (setf extended-path path)))) - (t - (warn "Unknown tar block payload code -- ~D" payload-code) - (skip-n-blocks block-count stream))))))))) - -(defun contents (tarfile) - (let ((block (make-block-buffer)) - (result '())) - (with-open-file (stream tarfile :element-type '(unsigned-byte 8)) - (loop - (let ((size (read-sequence block stream))) - (when (zerop size) - (return (nreverse result))) - (unless (= size +block-size+) - (error "Bad size on tarfile")) - (when (every #'zerop block) - (return (nreverse result))) - (let* ((payload-type (payload-type (aref block 156))) - (tar-path (full-path block)) - (payload-size (payload-size block))) - (skip-n-blocks (ceiling payload-size +block-size+) stream) - (case payload-type - (:file - (push tar-path result)) - (:directory - (push tar-path result))))))))) diff --git a/sbcl/.quicklisp/quicklisp/misc.lisp b/sbcl/.quicklisp/quicklisp/misc.lisp deleted file mode 100644 index 2cfabce..0000000 --- a/sbcl/.quicklisp/quicklisp/misc.lisp +++ /dev/null @@ -1,19 +0,0 @@ -;;;; misc.lisp - -(in-package #:quicklisp-client) - -;;; -;;; This stuff will probably end up somewhere else. -;;; - -(defun use-only-quicklisp-systems () - (asdf:initialize-source-registry - '(:source-registry :ignore-inherited-configuration)) - (asdf:map-systems 'asdf:clear-system) - t) - -(defun who-depends-on (system-name) - "Return a list of names of systems that depend on SYSTEM-NAME." - (loop for system in (provided-systems t) - when (member system-name (required-systems system) :test 'string=) - collect (name system))) diff --git a/sbcl/.quicklisp/quicklisp/network.lisp b/sbcl/.quicklisp/quicklisp/network.lisp deleted file mode 100644 index d600fcc..0000000 --- a/sbcl/.quicklisp/quicklisp/network.lisp +++ /dev/null @@ -1,137 +0,0 @@ -;;; -;;; Low-level networking implementations -;;; - -(in-package #:ql-network) - -(definterface host-address (host) - (:implementation t - host) - (:implementation sbcl - (ql-sbcl:host-ent-address (ql-sbcl:get-host-by-name host)))) - -(definterface open-connection (host port) - (:documentation "Open and return a network connection to HOST on the - given PORT.") - (:implementation t - (declare (ignore host port)) - (error "Sorry, quicklisp in implementation ~S is not supported yet." - (lisp-implementation-type))) - (:implementation allegro - (ql-allegro:make-socket :remote-host host - :remote-port port)) - (:implementation abcl - (let ((socket (ql-abcl:make-socket host port))) - (ql-abcl:get-socket-stream socket :element-type '(unsigned-byte 8)))) - (:implementation ccl - (ql-ccl:make-socket :remote-host host - :remote-port port)) - (:implementation clasp - (let* ((endpoint (ql-clasp:host-ent-address - (ql-clasp:get-host-by-name host))) - (socket (make-instance 'ql-clasp:inet-socket - :protocol :tcp - :type :stream))) - (ql-clasp:socket-connect socket endpoint port) - (ql-clasp:socket-make-stream socket - :element-type '(unsigned-byte 8) - :input t - :output t - :buffering :full))) - (:implementation clisp - (ql-clisp:socket-connect port host :element-type '(unsigned-byte 8))) - (:implementation cmucl - (let ((fd (ql-cmucl:connect-to-inet-socket host port))) - (ql-cmucl:make-fd-stream fd - :element-type '(unsigned-byte 8) - :binary-stream-p t - :input t - :output t))) - (:implementation scl - (let ((fd (ql-scl:connect-to-inet-socket host port))) - (ql-scl:make-fd-stream fd - :element-type '(unsigned-byte 8) - :input t - :output t))) - (:implementation ecl - (let* ((endpoint (ql-ecl:host-ent-address - (ql-ecl:get-host-by-name host))) - (socket (make-instance 'ql-ecl:inet-socket - :protocol :tcp - :type :stream))) - (ql-ecl:socket-connect socket endpoint port) - (ql-ecl:socket-make-stream socket - :element-type '(unsigned-byte 8) - :input t - :output t - :buffering :full))) - (:implementation mkcl - (let* ((endpoint (ql-mkcl:host-ent-address - (ql-mkcl:get-host-by-name host))) - (socket (make-instance 'ql-mkcl:inet-socket - :protocol :tcp - :type :stream))) - (ql-mkcl:socket-connect socket endpoint port) - (ql-mkcl:socket-make-stream socket - :element-type '(unsigned-byte 8) - :input t - :output t - :buffering :full))) - (:implementation lispworks - (ql-lispworks:open-tcp-stream host port - :direction :io - :errorp t - :read-timeout nil - :element-type '(unsigned-byte 8) - :timeout 5)) - (:implementation sbcl - (let* ((endpoint (ql-sbcl:host-ent-address - (ql-sbcl:get-host-by-name host))) - (socket (make-instance 'ql-sbcl:inet-socket - :protocol :tcp - :type :stream))) - (ql-sbcl:socket-connect socket endpoint port) - (ql-sbcl:socket-make-stream socket - :element-type '(unsigned-byte 8) - :input t - :output t - :buffering :full)))) - -(definterface read-octets (buffer connection) - (:documentation "Read from CONNECTION into BUFFER. Returns the - number of octets read.") - (:implementation t - (read-sequence buffer connection)) - (:implementation allegro - (ql-allegro:read-vector buffer connection)) - (:implementation clisp - (ql-clisp:read-byte-sequence buffer connection - :no-hang nil - :interactive t))) - -(definterface write-octets (buffer connection) - (:documentation "Write the contents of BUFFER to CONNECTION.") - (:implementation t - (write-sequence buffer connection) - (finish-output connection))) - -(definterface close-connection (connection) - (:implementation t - (ignore-errors (close connection)))) - -(definterface call-with-connection (host port fun) - (:documentation "Establish a network connection to HOST on PORT and - call FUN with that connection as the only argument. Unconditionally - closes the connection afterwareds via CLOSE-CONNECTION in an - unwind-protect. See also WITH-CONNECTION.") - (:implementation t - (let (connection) - (unwind-protect - (progn - (setf connection (open-connection host port)) - (funcall fun connection)) - (when connection - (close-connection connection)))))) - -(defmacro with-connection ((connection host port) &body body) - `(call-with-connection ,host ,port (lambda (,connection) ,@body))) diff --git a/sbcl/.quicklisp/quicklisp/package.lisp b/sbcl/.quicklisp/quicklisp/package.lisp deleted file mode 100644 index da68cd2..0000000 --- a/sbcl/.quicklisp/quicklisp/package.lisp +++ /dev/null @@ -1,340 +0,0 @@ -;;;; package.lisp - -(defpackage #:ql-util - (:documentation - "Utility functions used in various places.") - (:use #:cl) - (:export #:write-line-to-file - #:without-prompting - #:press-enter-to-continue - #:replace-file - #:copy-file - #:delete-file-if-exists - #:ensure-file-exists - #:split-spaces - #:first-line - #:file-size - #:safely-read - #:safely-read-file - #:make-versions-url)) - -(defpackage #:ql-setup - (:documentation - "Functions and variables initialized early in the Quicklisp client - configuration.") - (:use #:cl) - (:export #:qmerge - #:qenough - #:*quicklisp-home*)) - -(defpackage #:ql-config - (:documentation - "Getting and setting persistent configuration values.") - (:use #:cl #:ql-util #:ql-setup) - (:export #:config-value)) - -(defpackage #:ql-impl - (:documentation - "Configuration of implementation-specific packages and interfaces.") - (:use #:cl) - (:export #:*implementation*) - (:export #:definterface - #:defimplementation - #:show-interfaces) - (:export #:lisp - #:abcl - #:allegro - #:ccl - #:clasp - #:clisp - #:cmucl - #:cormanlisp - #:ecl - #:gcl - #:lispworks - #:mkcl - #:scl - #:sbcl)) - -(defpackage #:ql-impl-util - (:documentation - "Utility functions that require implementation-specific - functionality.") - (:use #:cl #:ql-impl) - (:export #:call-with-quiet-compilation - #:add-to-init-file - #:rename-directory - #:delete-directory - #:probe-directory - #:directory-entries - #:delete-directory-tree - #:map-directory-tree - #:native-namestring - #:directory-write-date)) - -(defpackage #:ql-network - (:documentation - "Simple, low-level network access.") - (:use #:cl #:ql-impl) - (:export #:open-connection - #:write-octets - #:read-octets - #:close-connection - #:with-connection)) - -(defpackage #:ql-progress - (:documentation - "Displaying a progress bar.") - (:use #:cl) - (:export #:make-progress-bar - #:start-display - #:update-progress - #:finish-display)) - -(defpackage #:ql-http - (:documentation - "A simple HTTP client.") - (:use #:cl #:ql-network #:ql-progress #:ql-config) - (:export #:*proxy-url* - #:fetch - #:http-fetch - #:*fetch-scheme-functions* - #:scheme - #:hostname - #:port - #:path - #:url - #:*maximum-redirects* - #:*default-url-defaults*) - (:export #:fetch-error - #:unexpected-http-status - #:unexpected-http-status-code - #:unexpected-http-status-url - #:too-many-redirects - #:too-many-redirects-url - #:too-many-redirects-count)) - -(defpackage #:ql-minitar - (:documentation - "A simple implementation of unpacking the 'tar' file format.") - (:use #:cl) - (:export #:unpack-tarball)) - -(defpackage #:ql-gunzipper - (:documentation - "An implementation of gunzip.") - (:use #:cl) - (:export #:gunzip)) - -(defpackage #:ql-cdb - (:documentation - "Read and write CDB files; code adapted from ZCDB.") - (:use #:cl) - (:export #:lookup - #:map-cdb - #:convert-index-file)) - -(defpackage #:ql-dist - (:documentation - "Generic functions, variables, and classes for interacting with the - dist system. Documented, exported symbols are intended for public - use.") - (:use #:cl - #:ql-util - #:ql-http - #:ql-setup - #:ql-gunzipper - #:ql-minitar) - (:intern #:dist-version - #:dist-url) - (:import-from #:ql-impl-util - #:delete-directory-tree - #:directory-entries - #:probe-directory) - ;; Install/enable protocol - (:export #:installedp - #:install - #:uninstall - #:ensure-installed - #:enabledp - #:enable - #:disable) - ;; Preference protocol - (:export #:preference - #:preference-file - #:preference-parent - #:forget-preference) - ;; Generic - (:export #:all-dists - #:canonical-distinfo-url - #:enabled-dists - #:find-dist - #:find-dist-or-lose - #:find-system - #:find-release - #:dist - #:system - #:release - #:base-directory - #:relative-to - #:metadata-name - #:install-metadata-file - #:short-description - #:provided-releases - #:provided-systems - #:installed-releases - #:installed-systems - #:name) - ;; Dists - (:export #:dist - #:dist-merge - #:find-system-in-dist - #:find-release-in-dist - #:system-index-url - #:release-index-url - #:available-versions-url - #:available-versions - #:version - #:subscription-url - #:new-version-available-p - #:dist-difference - #:fetch-dist - #:initialize-release-index - #:initialize-system-index - #:with-consistent-dists) - ;; Dist updates - (:export #:available-update - #:update-release-differences - #:show-update-report - #:update-in-place - #:install-dist - #:subscription-inhibition-file - #:inhibit-subscription - #:uninhibit-subscription - #:subscription-inhibited-p - #:subscription-unavailable - #:subscribedp - #:subscribe - #:unsubscribe) - ;; Releases - (:export #:release - #:project-name - #:system-files - #:archive-url - #:archive-size - #:ensure-archive-file - #:archive-content-sha1 - #:archive-md5 - #:prefix - #:local-archive-file - #:ensure-local-archive-file - #:check-local-archive-file - #:invalid-local-archive - #:invalid-local-archive-file - #:invalid-local-archive-release - #:missing-local-archive - #:badly-sized-local-archive - #:delete-and-retry) - ;; Systems - (:export #:dist - #:release - #:preference - #:system-file-name - #:required-systems) - ;; Misc - (:export #:standard-dist-enumeration-function - #:*dist-enumeration-functions* - #:find-asdf-system-file - #:system-definition-searcher - #:system-apropos - #:system-apropos-list - #:dependency-tree - #:clean - #:unknown-dist)) - -(defpackage #:ql-dist-user - (:documentation - "A package that uses QL-DIST; useful for playing around in without - clobbering any QL-DIST internals.") - (:use #:cl - #:ql-dist)) - -(defpackage #:ql-bundle - (:documentation - "A package for supporting the QL:BUNDLE-SYSTEMS function.") - (:use #:cl #:ql-dist #:ql-impl-util) - (:shadow #:find-system - #:find-release) - (:export #:bundle - #:requested-systems - #:ensure-system - #:ensure-release - #:write-bundle - #:add-systems-recursively - #:object-not-found - #:system-not-found - #:system-not-found-system - #:release-not-found - #:bundle-directory-exists - #:bundle-directory-exists-directory)) - -(defpackage #:quicklisp-client - (:documentation - "The Quicklisp client package, intended for end-user Quicklisp - commands and configuration parameters.") - (:nicknames #:quicklisp #:ql) - (:use #:cl - #:ql-util - #:ql-impl-util - #:ql-dist - #:ql-http - #:ql-setup - #:ql-config - #:ql-minitar - #:ql-gunzipper) - (:shadow #:uninstall) - (:shadowing-import-from #:ql-dist - #:dist-version - #:dist-url) - (:export #:dist-version - #:dist-url) - (:export #:quickload - #:*quickload-prompt* - #:*quickload-verbose* - #:*quickload-explain* - #:system-not-found - #:system-not-found-name - #:uninstall - #:uninstall-dist - #:qmerge - #:*quicklisp-home* - #:*initial-dist-url* - #:*proxy-url* - #:config-value - #:setup - #:provided-systems - #:system-apropos - #:system-apropos-list - #:system-list - #:client-version - #:client-url - #:available-client-versions - #:install-client - #:update-client - #:update-dist - #:update-all-dists - #:available-dist-versions - #:add-to-init-file - #:use-only-quicklisp-systems - #:write-asdf-manifest-file - #:where-is-system - #:help - #:register-local-projects - #:local-projects-searcher - #:*local-project-directories* - #:list-local-projects - #:list-local-systems - #:who-depends-on - #:bundle-systems)) - -(in-package #:quicklisp-client) diff --git a/sbcl/.quicklisp/quicklisp/progress.lisp b/sbcl/.quicklisp/quicklisp/progress.lisp deleted file mode 100644 index b4d57e2..0000000 --- a/sbcl/.quicklisp/quicklisp/progress.lisp +++ /dev/null @@ -1,156 +0,0 @@ -;;; -;;; A text progress bar -;;; - -(in-package #:ql-progress) - -(defclass progress-bar () - ((start-time - :initarg :start-time - :accessor start-time) - (end-time - :initarg :end-time - :accessor end-time) - (progress-character - :initarg :progress-character - :accessor progress-character) - (character-count - :initarg :character-count - :accessor character-count - :documentation "How many characters wide is the progress bar?") - (characters-so-far - :initarg :characters-so-far - :accessor characters-so-far) - (update-interval - :initarg :update-interval - :accessor update-interval - :documentation "Update the progress bar display after this many - internal-time units.") - (last-update-time - :initarg :last-update-time - :accessor last-update-time - :documentation "The display was last updated at this time.") - (total - :initarg :total - :accessor total - :documentation "The total number of units tracked by this progress bar.") - (progress - :initarg :progress - :accessor progress - :documentation "How far in the progress are we?") - (pending - :initarg :pending - :accessor pending - :documentation "How many raw units should be tracked in the next - display update?")) - (:default-initargs - :progress-character #\= - :character-count 50 - :characters-so-far 0 - :update-interval (floor internal-time-units-per-second 4) - :last-update-time 0 - :total 0 - :progress 0 - :pending 0)) - -(defgeneric start-display (progress-bar)) -(defgeneric update-progress (progress-bar unit-count)) -(defgeneric update-display (progress-bar)) -(defgeneric finish-display (progress-bar)) -(defgeneric elapsed-time (progress-bar)) -(defgeneric units-per-second (progress-bar)) - -(defmethod start-display (progress-bar) - (setf (last-update-time progress-bar) (get-internal-real-time)) - (setf (start-time progress-bar) (get-internal-real-time)) - (fresh-line) - (finish-output)) - -(defmethod update-display (progress-bar) - (incf (progress progress-bar) (pending progress-bar)) - (setf (pending progress-bar) 0) - (setf (last-update-time progress-bar) (get-internal-real-time)) - (let* ((showable (floor (character-count progress-bar) - (/ (total progress-bar) (progress progress-bar)))) - (needed (- showable (characters-so-far progress-bar)))) - (setf (characters-so-far progress-bar) showable) - (dotimes (i needed) - (write-char (progress-character progress-bar))) - (finish-output))) - -(defmethod update-progress (progress-bar unit-count) - (incf (pending progress-bar) unit-count) - (let ((now (get-internal-real-time))) - (when (< (update-interval progress-bar) - (- now (last-update-time progress-bar))) - (update-display progress-bar)))) - -(defmethod finish-display (progress-bar) - (update-display progress-bar) - (setf (end-time progress-bar) (get-internal-real-time)) - (terpri) - (format t "~:D bytes in ~$ seconds (~$KB/sec)~%" - (total progress-bar) - (elapsed-time progress-bar) - (/ (units-per-second progress-bar) 1024)) - (finish-output)) - -(defmethod elapsed-time (progress-bar) - (/ (- (end-time progress-bar) (start-time progress-bar)) - internal-time-units-per-second)) - -(defmethod units-per-second (progress-bar) - (if (plusp (elapsed-time progress-bar)) - (/ (total progress-bar) (elapsed-time progress-bar)) - 0)) - -(defun kb/sec (progress-bar) - (/ (units-per-second progress-bar) 1024)) - - - -(defparameter *uncertain-progress-chars* "?") - -(defclass uncertain-size-progress-bar (progress-bar) - ((progress-char-index - :initarg :progress-char-index - :accessor progress-char-index) - (units-per-char - :initarg :units-per-char - :accessor units-per-char)) - (:default-initargs - :total 0 - :progress-char-index 0 - :units-per-char (floor (expt 1024 2) 50))) - -(defmethod update-progress :after ((progress-bar uncertain-size-progress-bar) - unit-count) - (incf (total progress-bar) unit-count)) - -(defmethod progress-character ((progress-bar uncertain-size-progress-bar)) - (let ((index (progress-char-index progress-bar))) - (prog1 - (char *uncertain-progress-chars* index) - (setf (progress-char-index progress-bar) - (mod (1+ index) (length *uncertain-progress-chars*)))))) - -(defmethod update-display ((progress-bar uncertain-size-progress-bar)) - (setf (last-update-time progress-bar) (get-internal-real-time)) - (multiple-value-bind (chars pend) - (floor (pending progress-bar) (units-per-char progress-bar)) - (setf (pending progress-bar) pend) - (dotimes (i chars) - (write-char (progress-character progress-bar)) - (incf (characters-so-far progress-bar)) - (when (<= (character-count progress-bar) - (characters-so-far progress-bar)) - (terpri) - (setf (characters-so-far progress-bar) 0) - (finish-output))) - (finish-output))) - -(defun make-progress-bar (total) - (if (or (not total) (zerop total)) - (make-instance 'uncertain-size-progress-bar) - (make-instance 'progress-bar :total total))) - diff --git a/sbcl/.quicklisp/quicklisp/quicklisp.asd b/sbcl/.quicklisp/quicklisp/quicklisp.asd deleted file mode 100644 index 158a1b4..0000000 --- a/sbcl/.quicklisp/quicklisp/quicklisp.asd +++ /dev/null @@ -1,36 +0,0 @@ -;;;; quicklisp.asd - -(defpackage #:ql-info - (:export #:*version*)) - -(defvar ql-info:*version* - (with-open-file (stream (merge-pathnames "version.txt" *load-truename*)) - (read-line stream))) - -(asdf:defsystem #:quicklisp - :description "The Quicklisp client application." - :author "Zach Beane " - :license "BSD-style" - :serial t - :version #.(remove-if-not #'digit-char-p ql-info:*version*) - :components ((:file "package") - (:file "utils") - (:file "config") - (:file "impl") - (:file "impl-util") - (:file "network") - (:file "progress") - (:file "http") - (:file "deflate") - (:file "minitar") - (:file "cdb") - (:file "dist") - (:file "setup") - (:file "client") - (:file "fetch-gzipped") - (:file "client-info") - (:file "client-update") - (:file "dist-update") - (:file "misc") - (:file "local-projects") - (:file "bundle"))) diff --git a/sbcl/.quicklisp/quicklisp/setup.lisp b/sbcl/.quicklisp/quicklisp/setup.lisp deleted file mode 100644 index edbd4c6..0000000 --- a/sbcl/.quicklisp/quicklisp/setup.lisp +++ /dev/null @@ -1,249 +0,0 @@ -(in-package #:quicklisp) - -(defun show-wrapped-list (words &key (indent 4) (margin 60)) - (let ((*print-right-margin* margin) - (*print-pretty* t) - (*print-escape* nil) - (prefix (make-string indent :initial-element #\Space))) - (pprint-logical-block (nil words :per-line-prefix prefix) - (pprint-fill *standard-output* (sort (copy-seq words) #'string<) nil)) - (fresh-line) - (finish-output))) - -(defun recursively-install (name) - (labels ((recurse (name) - (let ((system (find-system name))) - (unless system - (error "Unknown system ~S" name)) - (ensure-installed system) - (mapcar #'recurse (required-systems system)) - name))) - (with-consistent-dists - (recurse name)))) - -(defclass load-strategy () - ((name - :initarg :name - :accessor name) - (asdf-systems - :initarg :asdf-systems - :accessor asdf-systems) - (quicklisp-systems - :initarg :quicklisp-systems - :accessor quicklisp-systems))) - -(defmethod print-object ((strategy load-strategy) stream) - (print-unreadable-object (strategy stream :type t) - (format stream "~S (~D asdf, ~D quicklisp)" - (name strategy) - (length (asdf-systems strategy)) - (length (quicklisp-systems strategy))))) - -(defgeneric quicklisp-releases (strategy) - (:method (strategy) - (remove-duplicates (mapcar 'release (quicklisp-systems strategy))))) - -(defgeneric quicklisp-release-table (strategy) - (:method ((strategy load-strategy)) - (let ((table (make-hash-table))) - (dolist (system (quicklisp-systems strategy)) - (push system (gethash (release system) table nil))) - table))) - -(define-condition system-not-found (error) - ((name - :initarg :name - :reader system-not-found-name)) - (:report (lambda (condition stream) - (format stream "System ~S not found" - (system-not-found-name condition)))) - (:documentation "This condition is signaled by QUICKLOAD when a - system given to load is not available via ASDF or a Quicklisp - dist.")) - -(defun compute-load-strategy (name) - (setf name (string-downcase name)) - (let ((asdf-systems '()) - (quicklisp-systems '())) - (labels ((recurse (name) - (let ((asdf-system (asdf:find-system name nil)) - (quicklisp-system (find-system name))) - (cond (asdf-system - (push asdf-system asdf-systems)) - (quicklisp-system - (push quicklisp-system quicklisp-systems) - (dolist (subname (required-systems quicklisp-system)) - (recurse subname))) - (t - (cerror "Try again" - 'system-not-found - :name name) - (recurse name)))))) - (with-consistent-dists - (recurse name))) - (make-instance 'load-strategy - :name name - :asdf-systems (remove-duplicates asdf-systems) - :quicklisp-systems (remove-duplicates quicklisp-systems)))) - -(defun show-load-strategy (strategy) - (format t "To load ~S:~%" (name strategy)) - (let ((asdf-systems (asdf-systems strategy)) - (releases (quicklisp-releases strategy))) - (when asdf-systems - (format t " Load ~D ASDF system~:P:~%" (length asdf-systems)) - (show-wrapped-list (mapcar 'asdf:component-name asdf-systems))) - (when releases - (format t " Install ~D Quicklisp release~:P:~%" (length releases)) - (show-wrapped-list (mapcar 'name releases))))) - -(defvar *macroexpand-progress-in-progress* nil) - -(defun macroexpand-progress-fun (old-hook &key (char #\.) - (chars-per-line 50) - (forms-per-char 250)) - (let ((output-so-far 0) - (seen-so-far 0)) - (labels ((finish-line () - (when (plusp output-so-far) - (dotimes (i (- chars-per-line output-so-far)) - (write-char char)) - (terpri) - (setf output-so-far 0))) - (show-string (string) - (let* ((length (length string)) - (new-output (+ length output-so-far))) - (cond ((< chars-per-line new-output) - (finish-line) - (write-string string) - (setf output-so-far length)) - (t - (write-string string) - (setf output-so-far new-output)))) - (finish-output)) - (show-package (name) - ;; Only show package markers when compiling. Showing - ;; them when loading shows a bunch of ASDF system - ;; package noise. - (when *compile-file-pathname* - (finish-line) - (show-string (format nil "[package ~(~A~)]" name))))) - (lambda (fun form env) - (when (and (consp form) - (eq (first form) 'cl:defpackage) - (ignore-errors (string (second form)))) - (show-package (second form))) - (incf seen-so-far) - (when (<= forms-per-char seen-so-far) - (setf seen-so-far 0) - (write-char char) - (finish-output) - (incf output-so-far) - (when (<= chars-per-line output-so-far) - (setf output-so-far 0) - (terpri) - (finish-output))) - (funcall old-hook fun form env))))) - -(defun call-with-macroexpand-progress (fun) - (let ((*macroexpand-hook* (if *macroexpand-progress-in-progress* - *macroexpand-hook* - (macroexpand-progress-fun *macroexpand-hook*))) - (*macroexpand-progress-in-progress* t)) - (funcall fun) - (terpri))) - -(defun apply-load-strategy (strategy) - (map nil 'ensure-installed (quicklisp-releases strategy)) - (call-with-macroexpand-progress - (lambda () - (format t "~&; Loading ~S~%" (name strategy)) - (asdf:load-system (name strategy) :verbose nil)))) - -(defun autoload-system-and-dependencies (name &key prompt) - "Try to load the system named by NAME, automatically loading any -Quicklisp-provided systems first, and catching ASDF missing -dependencies too if possible." - (setf name (string-downcase name)) - (with-simple-restart (abort "Give up on ~S" name) - (let ((tried-so-far (make-hash-table :test 'equalp))) - (tagbody - retry - (handler-case - (let ((strategy (compute-load-strategy name))) - (show-load-strategy strategy) - (when (or (not prompt) - (press-enter-to-continue)) - (apply-load-strategy strategy))) - (asdf:missing-dependency-of-version (c) - ;; Nothing Quicklisp can do to recover from this, so just - ;; resignal - (error c)) - (asdf:missing-dependency (c) - (let ((parent (asdf::missing-required-by c)) - (missing (asdf::missing-requires c))) - (typecase parent - ((or null asdf:system) - ;; NIL parent comes from :defsystem-depends-on failures - (if (gethash missing tried-so-far) - (error "Dependency looping -- already tried to load ~ - ~A" missing) - (setf (gethash missing tried-so-far) missing)) - (autoload-system-and-dependencies missing - :prompt prompt) - (go retry)) - (t - ;; Error isn't from a system dependency, so there's - ;; nothing to autoload - (error c)))))))) - name)) - -(defvar *initial-dist-url* - "http://beta.quicklisp.org/dist/quicklisp.txt") - -(defun dists-initialized-p () - (not (not (ignore-errors (truename (qmerge "dists/")))))) - -(defun quickstart-parameter (name &optional default) - (let* ((package (find-package '#:quicklisp-quickstart)) - (symbol (and package (find-symbol (string '#:*quickstart-parameters*) - package))) - (plist (and symbol (symbol-value symbol))) - (parameter (and plist (getf plist name)))) - (or parameter default))) - -(defun maybe-initial-setup () - "Run the steps needed when Quicklisp setup is run for the first time -after the quickstart installation." - (let ((quickstart-proxy-url (quickstart-parameter :proxy-url)) - (quickstart-initial-dist-url (quickstart-parameter :initial-dist-url))) - (when (and quickstart-proxy-url (not *proxy-url*)) - (setf *proxy-url* quickstart-proxy-url) - (setf (config-value "proxy-url") quickstart-proxy-url)) - (unless (dists-initialized-p) - (let ((target (qmerge "dists/quicklisp/distinfo.txt")) - (url (or quickstart-initial-dist-url - *initial-dist-url*))) - (ensure-directories-exist target) - (install-dist url :prompt nil))))) - -(defun setup () - (unless (member 'system-definition-searcher - asdf:*system-definition-search-functions*) - (setf asdf:*system-definition-search-functions* - (append asdf:*system-definition-search-functions* - (list 'local-projects-searcher - 'system-definition-searcher)))) - (let ((files (nconc (directory (qmerge "local-init/*.lisp")) - (directory (qmerge "local-init/*.cl"))))) - (with-simple-restart (abort "Stop loading local setup files") - (dolist (file (sort files #'string< :key #'pathname-name)) - (with-simple-restart (skip "Skip local setup file ~S" file) - ;; Don't try to load Emacs lock files, other hidden files - (unless (char= (char (pathname-name file) 0) - #\.) - (load file)))))) - (maybe-initial-setup) - (ensure-directories-exist (qmerge "local-projects/")) - (pushnew :quicklisp *features*) - t) diff --git a/sbcl/.quicklisp/quicklisp/utils.lisp b/sbcl/.quicklisp/quicklisp/utils.lisp deleted file mode 100644 index 71a89ef..0000000 --- a/sbcl/.quicklisp/quicklisp/utils.lisp +++ /dev/null @@ -1,124 +0,0 @@ -;;;; utils.lisp - -(in-package #:ql-util) - -(defun write-line-to-file (string file) - (with-open-file (stream file - :direction :output - :if-exists :supersede) - (write-line string stream))) - -(defvar *do-not-prompt* nil - "When *DO-NOT-PROMPT* is true, PRESS-ENTER-TO-CONTINUE returns true - without user interaction.") - -(defmacro without-prompting (&body body) - "Evaluate BODY in an environment where PRESS-ENTER-TO-CONTINUE - always returns true without prompting for the user to press enter." - `(let ((*do-not-prompt* t)) - ,@body)) - -(defun press-enter-to-continue () - (when *do-not-prompt* - (return-from press-enter-to-continue t)) - (format *query-io* "~&Press Enter to continue.~%") - (let ((result (read-line *query-io*))) - (zerop (length result)))) - -(defun replace-file (from to) - "Like RENAME-FILE, but deletes TO if it exists, first." - (when (probe-file to) - (delete-file to)) - (rename-file from to)) - -(defun copy-file (from to &key (if-exists :rename-and-delete)) - "Copy the file FROM to TO." - (let* ((buffer-size 8192) - (buffer (make-array buffer-size :element-type '(unsigned-byte 8)))) - (with-open-file (from-stream from :element-type '(unsigned-byte 8)) - (with-open-file (to-stream to :element-type '(unsigned-byte 8) - :direction :output - :if-exists if-exists) - (let ((length (file-length from-stream))) - (multiple-value-bind (full leftover) - (floor length buffer-size) - (dotimes (i full) - (read-sequence buffer from-stream) - (write-sequence buffer to-stream)) - (read-sequence buffer from-stream) - (write-sequence buffer to-stream :end leftover))))) - (probe-file to))) - -(defun ensure-file-exists (pathname) - (open pathname :direction :probe :if-does-not-exist :create)) - -(defun delete-file-if-exists (pathname) - (when (probe-file pathname) - (delete-file pathname))) - -(defun split-spaces (line) - (let ((words '()) - (mark 0) - (pos 0)) - (labels ((finish () - (setf pos (length line)) - (save) - (return-from split-spaces (nreverse words))) - (save () - (when (< mark pos) - (push (subseq line mark pos) words))) - (mark () - (setf mark pos)) - (in-word (char) - (case char - (#\Space - (save) - #'in-space) - (t - #'in-word))) - (in-space (char) - (case char - (#\Space - #'in-space) - (t - (mark) - #'in-word)))) - (let ((state #'in-word)) - (dotimes (i (length line) (finish)) - (setf pos i) - (setf state (funcall state (char line i)))))))) - -(defun first-line (file) - (with-open-file (stream file) - (values (read-line stream)))) - -(defun (setf first-line) (line file) - (with-open-file (stream file :direction :output - :if-exists :rename-and-delete) - (write-line line stream))) - -(defun file-size (file) - (with-open-file (stream file :element-type '(unsigned-byte 8)) - (file-length stream))) - -(defun safely-read (stream) - "Read one form from STREAM with *READ-EVAL* bound to NIL." - (let ((*read-eval* nil)) - (read stream))) - -(defun safely-read-file (file) - "Read the first form from FILE with SAFELY-READ." - (with-open-file (stream file) - (safely-read stream))) - -(defun make-versions-url (url) - "Given an URL that looks like http://foo/bar.ext, return -http://foo/bar-versions.txt." - (let ((suffix-pos (position #\. url :from-end t))) - (unless suffix-pos - (error "Can't make a versions URL from ~A" url)) - (let ((extension (subseq url suffix-pos))) - (concatenate 'string - (subseq url 0 suffix-pos) - "-versions" - extension)))) diff --git a/sbcl/.quicklisp/quicklisp/version.txt b/sbcl/.quicklisp/quicklisp/version.txt deleted file mode 100644 index 69bd127..0000000 --- a/sbcl/.quicklisp/quicklisp/version.txt +++ /dev/null @@ -1 +0,0 @@ -2020-01-04 diff --git a/sbcl/.quicklisp/setup.lisp b/sbcl/.quicklisp/setup.lisp deleted file mode 100644 index 0b2847d..0000000 --- a/sbcl/.quicklisp/setup.lisp +++ /dev/null @@ -1,135 +0,0 @@ -(defpackage #:ql-setup - (:use #:cl) - (:export #:*quicklisp-home* - #:qmerge - #:qenough)) - -(in-package #:ql-setup) - -(unless *load-truename* - (error "This file must be LOADed to set up quicklisp.")) - -(defvar *quicklisp-home* - (make-pathname :name nil :type nil - :defaults *load-truename*)) - -(defun qmerge (pathname) - "Return PATHNAME merged with the base Quicklisp directory." - (merge-pathnames pathname *quicklisp-home*)) - -(defun qenough (pathname) - (enough-namestring pathname *quicklisp-home*)) - -;;; ASDF is a hard requirement of quicklisp. Make sure it's either -;;; already loaded or load it from quicklisp's bundled version. - -(defvar *required-asdf-version* "2.26") - -;;; Put ASDF's fasls in a separate directory - -(defun implementation-signature () - "Return a string suitable for discriminating different -implementations, or similar implementations with possibly-incompatible -FASLs." - ;; XXX Will this have problems with stuff like threads vs - ;; non-threads fasls? - (let ((*print-pretty* nil)) - (format nil "lisp-implementation-type: ~A~%~ - lisp-implementation-version: ~A~%~ - machine-type: ~A~%~ - machine-version: ~A~%" - (lisp-implementation-type) - (lisp-implementation-version) - (machine-type) - (machine-version)))) - -(defun dumb-string-hash (string) - "Produce a six-character hash of STRING." - (let ((hash #xD13CCD13)) - (loop for char across string - for value = (char-code char) - do - (setf hash (logand #xFFFFFFFF - (logxor (ash hash 5) - (ash hash -27) - value)))) - (subseq (format nil "~(~36,6,'0R~)" (mod hash 88888901)) - 0 6))) - -(defun asdf-fasl-pathname () - "Return a pathname suitable for storing the ASDF FASL, separated -from ASDF FASLs from incompatible implementations. Also, save a file -in the directory with the implementation signature, if it doesn't -already exist." - (let* ((implementation-signature (implementation-signature)) - (original-fasl (compile-file-pathname (qmerge "asdf.lisp"))) - (fasl - (qmerge (make-pathname - :defaults original-fasl - :directory - (list :relative - "cache" - "asdf-fasls" - (dumb-string-hash implementation-signature))))) - (signature-file (merge-pathnames "signature.txt" fasl))) - (ensure-directories-exist fasl) - (unless (probe-file signature-file) - (with-open-file (stream signature-file :direction :output) - (write-string implementation-signature stream))) - fasl)) - -(defun ensure-asdf-loaded () - "Try several methods to make sure that a sufficiently-new ASDF is -loaded: first try (require 'asdf), then loading the ASDF FASL, then -compiling asdf.lisp to a FASL and then loading it." - (let ((source (qmerge "asdf.lisp"))) - (labels ((asdf-symbol (name) - (let ((asdf-package (find-package '#:asdf))) - (when asdf-package - (find-symbol (string name) asdf-package)))) - (version-satisfies (version) - (let ((vs-fun (asdf-symbol '#:version-satisfies)) - (vfun (asdf-symbol '#:asdf-version))) - (when (and vs-fun vfun - (fboundp vs-fun) - (fboundp vfun)) - (funcall vs-fun (funcall vfun) version))))) - (block nil - (macrolet ((try (&body asdf-loading-forms) - `(progn - (handler-bind ((warning #'muffle-warning)) - (ignore-errors - ,@asdf-loading-forms)) - (when (version-satisfies *required-asdf-version*) - (return t))))) - (try) - (try (require 'asdf)) - (let ((fasl (asdf-fasl-pathname))) - (try (load fasl :verbose nil)) - (try (load (compile-file source :verbose nil :output-file fasl)))) - (error "Could not load ASDF ~S or newer" *required-asdf-version*)))))) - -(ensure-asdf-loaded) - -;;; -;;; Quicklisp sometimes must upgrade ASDF. Ugrading ASDF will blow -;;; away existing ASDF methods, so e.g. FASL recompilation :around -;;; methods would be lost. This config file will make it possible to -;;; ensure ASDF can be configured before loading Quicklisp itself via -;;; ASDF. Thanks to Nikodemus Siivola for pointing out this issue. -;;; - -(let ((asdf-init (probe-file (qmerge "asdf-config/init.lisp")))) - (when asdf-init - (with-simple-restart (skip "Skip loading ~S" asdf-init) - (load asdf-init :verbose nil :print nil)))) - -(push (qmerge "quicklisp/") asdf:*central-registry*) - -(let ((*compile-print* nil) - (*compile-verbose* nil) - (*load-verbose* nil) - (*load-print* nil)) - (asdf:oos 'asdf:load-op "quicklisp" :verbose nil)) - -(quicklisp:setup) diff --git a/sbcl/.quicklisp/tmp/install-dist-distinfo.txt b/sbcl/.quicklisp/tmp/install-dist-distinfo.txt deleted file mode 100644 index 86798cc..0000000 --- a/sbcl/.quicklisp/tmp/install-dist-distinfo.txt +++ /dev/null @@ -1,7 +0,0 @@ -name: quicklisp -version: 2019-12-27 -system-index-url: http://beta.quicklisp.org/dist/quicklisp/2019-12-27/systems.txt -release-index-url: http://beta.quicklisp.org/dist/quicklisp/2019-12-27/releases.txt -archive-base-url: http://beta.quicklisp.org/ -canonical-distinfo-url: http://beta.quicklisp.org/dist/quicklisp/2019-12-27/distinfo.txt -distinfo-subscription-url: http://beta.quicklisp.org/dist/quicklisp.txt diff --git a/sbcl/.quicklisp/tmp/quicklisp.tar b/sbcl/.quicklisp/tmp/quicklisp.tar deleted file mode 100644 index 77e7ed7b9194bef4bd8911b08f199965ec4b52c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256000 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�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 I0z)bU0RODTQvd(} diff --git a/sbcl/.quicklisp/tmp/release-install.tar b/sbcl/.quicklisp/tmp/release-install.tar deleted file mode 100644 index 5df1ee0b433439e7258132f6996e351b1f3ae401..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 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 -;;;; - -(cl:in-package #:cl-user) -(cl:defpackage #:qlqs-user - (:use #:cl)) -(cl:in-package #:qlqs-user) - -(defpackage #:qlqs-info - (:export #:*version*)) - -(defvar qlqs-info:*version* "2015-01-28") - -(defpackage #:qlqs-impl - (:use #:cl) - (:export #:*implementation*) - (:export #:definterface - #:defimplementation) - (:export #:lisp - #:abcl - #:allegro - #:ccl - #:clasp - #:clisp - #:cmucl - #:cormanlisp - #:ecl - #:gcl - #:lispworks - #:mkcl - #:scl - #:sbcl)) - -(defpackage #:qlqs-impl-util - (:use #:cl #:qlqs-impl) - (:export #:call-with-quiet-compilation)) - -(defpackage #:qlqs-network - (:use #:cl #:qlqs-impl) - (:export #:open-connection - #:write-octets - #:read-octets - #:close-connection - #:with-connection)) - -(defpackage #:qlqs-progress - (:use #:cl) - (:export #:make-progress-bar - #:start-display - #:update-progress - #:finish-display)) - -(defpackage #:qlqs-http - (:use #:cl #:qlqs-network #:qlqs-progress) - (:export #:fetch - #:*proxy-url* - #:*maximum-redirects* - #:*default-url-defaults*)) - -(defpackage #:qlqs-minitar - (:use #:cl) - (:export #:unpack-tarball)) - -(defpackage #:quicklisp-quickstart - (:use #:cl #:qlqs-impl #:qlqs-impl-util #:qlqs-http #:qlqs-minitar) - (:export #:install - #:help - #:*proxy-url* - #:*asdf-url* - #:*quicklisp-tar-url* - #:*setup-url* - #:*help-message* - #:*after-load-message* - #:*after-initial-setup-message*)) - - -;;; -;;; Defining implementation-specific packages and functionality -;;; - -(in-package #:qlqs-impl) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun error-unimplemented (&rest args) - (declare (ignore args)) - (error "Not implemented"))) - -(defmacro neuter-package (name) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (let ((definition (fdefinition 'error-unimplemented))) - (do-external-symbols (symbol ,(string name)) - (unless (fboundp symbol) - (setf (fdefinition symbol) definition)))))) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun feature-expression-passes-p (expression) - (cond ((keywordp expression) - (member expression *features*)) - ((consp expression) - (case (first expression) - (or - (some 'feature-expression-passes-p (rest expression))) - (and - (every 'feature-expression-passes-p (rest expression))))) - (t (error "Unrecognized feature expression -- ~S" expression))))) - - -(defmacro define-implementation-package (feature package-name &rest options) - (let* ((output-options '((:use) - (:export #:lisp))) - (prep (cdr (assoc :prep options))) - (class-option (cdr (assoc :class options))) - (class (first class-option)) - (superclasses (rest class-option)) - (import-options '()) - (effectivep (feature-expression-passes-p feature))) - (dolist (option options) - (ecase (first option) - ((:prep :class)) - ((:import-from - :import) - (push option import-options)) - ((:export - :shadow - :intern - :documentation) - (push option output-options)) - ((:reexport-from) - (push (cons :export (cddr option)) output-options) - (push (cons :import-from (cdr option)) import-options)))) - `(eval-when (:compile-toplevel :load-toplevel :execute) - ,@(when effectivep - prep) - (defclass ,class ,superclasses ()) - (defpackage ,package-name ,@output-options - ,@(when effectivep - import-options)) - ,@(when effectivep - `((setf *implementation* (make-instance ',class)))) - ,@(unless effectivep - `((neuter-package ,package-name)))))) - -(defmacro definterface (name lambda-list &body options) - (let* ((forbidden (intersection lambda-list lambda-list-keywords)) - (gf-options (remove :implementation options :key #'first)) - (implementations (set-difference options gf-options))) - (when forbidden - (error "~S not allowed in definterface lambda list" forbidden)) - (flet ((method-option (class body) - `(:method ((*implementation* ,class) ,@lambda-list) - ,@body))) - (let ((generic-name (intern (format nil "%~A" name)))) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (defgeneric ,generic-name (lisp ,@lambda-list) - ,@gf-options - ,@(mapcar (lambda (implementation) - (destructuring-bind (class &rest body) - (rest implementation) - (method-option class body))) - implementations)) - (defun ,name ,lambda-list - (,generic-name *implementation* ,@lambda-list))))))) - -(defmacro defimplementation (name-and-options - lambda-list &body body) - (destructuring-bind (name &key (for t) qualifier) - (if (consp name-and-options) - name-and-options - (list name-and-options)) - (unless for - (error "You must specify an implementation name.")) - (let ((generic-name (find-symbol (format nil "%~A" name)))) - (unless (and generic-name - (fboundp generic-name)) - (error "~S does not name an implementation function" name)) - `(defmethod ,generic-name - ,@(when qualifier (list qualifier)) - ,(list* `(*implementation* ,for) lambda-list) ,@body)))) - - -;;; Bootstrap implementations - -(defvar *implementation* nil) -(defclass lisp () ()) - - -;;; Allegro Common Lisp - -(define-implementation-package :allegro #:qlqs-allegro - (:documentation - "Allegro Common Lisp - http://www.franz.com/products/allegrocl/") - (:class allegro) - (:reexport-from #:socket - #:make-socket) - (:reexport-from #:excl - #:read-vector)) - - -;;; Armed Bear Common Lisp - -(define-implementation-package :abcl #:qlqs-abcl - (:documentation - "Armed Bear Common Lisp - http://common-lisp.net/project/armedbear/") - (:class abcl) - (:reexport-from #:system - #:make-socket - #:get-socket-stream)) - -;;; Clozure CL - -(define-implementation-package :ccl #:qlqs-ccl - (:documentation - "Clozure Common Lisp - http://www.clozure.com/clozurecl.html") - (:class ccl) - (:reexport-from #:ccl - #:make-socket)) - - -;;; CLASP - -(define-implementation-package :clasp #:qlqs-clasp - (:documentation "CLASP - http://github.com/drmeister/clasp") - (:class clasp) - (:prep - (require 'sockets)) - (:intern #:host-network-address) - (:reexport-from #:sb-bsd-sockets - #:get-host-by-name - #:host-ent-address - #:socket-connect - #:socket-make-stream - #:inet-socket)) - - -;;; GNU CLISP - -(define-implementation-package :clisp #:qlqs-clisp - (:documentation "GNU CLISP - http://clisp.cons.org/") - (:class clisp) - (:reexport-from #:socket - #:socket-connect) - (:reexport-from #:ext - #:read-byte-sequence)) - - -;;; CMUCL - -(define-implementation-package :cmu #:qlqs-cmucl - (:documentation "CMU Common Lisp - http://www.cons.org/cmucl/") - (:class cmucl) - (:reexport-from #:ext - #:*gc-verbose*) - (:reexport-from #:system - #:make-fd-stream) - (:reexport-from #:extensions - #:connect-to-inet-socket)) - -(defvar qlqs-cmucl:*gc-verbose* nil) - - -;;; Scieneer CL - -(define-implementation-package :scl #:qlqs-scl - (:documentation "Scieneer Common Lisp - http://www.scieneer.com/scl/") - (:class scl) - (:reexport-from #:system - #:make-fd-stream) - (:reexport-from #:extensions - #:connect-to-inet-socket)) - -;;; ECL - -(define-implementation-package :ecl #:qlqs-ecl - (:documentation "ECL - http://ecls.sourceforge.net/") - (:class ecl) - (:prep - (require 'sockets)) - (:intern #:host-network-address) - (:reexport-from #:sb-bsd-sockets - #:get-host-by-name - #:host-ent-address - #:socket-connect - #:socket-make-stream - #:inet-socket)) - - -;;; LispWorks - -(define-implementation-package :lispworks #:qlqs-lispworks - (:documentation "LispWorks - http://www.lispworks.com/") - (:class lispworks) - (:prep - (require "comm")) - (:reexport-from #:comm - #:open-tcp-stream - #:get-host-entry)) - - -;;; SBCL - -(define-implementation-package :sbcl #:qlqs-sbcl - (:class sbcl) - (:documentation - "Steel Bank Common Lisp - http://www.sbcl.org/") - (:prep - (require 'sb-bsd-sockets)) - (:intern #:host-network-address) - (:reexport-from #:sb-ext - #:compiler-note) - (:reexport-from #:sb-bsd-sockets - #:get-host-by-name - #:inet-socket - #:host-ent-address - #:socket-connect - #:socket-make-stream)) - -;;; MKCL - -(define-implementation-package :mkcl #:qlqs-mkcl - (:class mkcl) - (:documentation - "ManKai Common Lisp - http://common-lisp.net/project/mkcl/") - (:prep - (require 'sockets)) - (:intern #:host-network-address) - (:reexport-from #:sb-bsd-sockets - #:get-host-by-name - #:inet-socket - #:host-ent-address - #:socket-connect - #:socket-make-stream)) - -;;; -;;; Utility function -;;; - -(in-package #:qlqs-impl-util) - -(definterface call-with-quiet-compilation (fun) - (:implementation t - (let ((*load-verbose* nil) - (*compile-verbose* nil) - (*load-print* nil) - (*compile-print* nil)) - (handler-bind ((warning #'muffle-warning)) - (funcall fun))))) - -(defimplementation (call-with-quiet-compilation :for sbcl :qualifier :around) - (fun) - (declare (ignorable fun)) - (handler-bind ((qlqs-sbcl:compiler-note #'muffle-warning)) - (call-next-method))) - -(defimplementation (call-with-quiet-compilation :for cmucl :qualifier :around) - (fun) - (declare (ignorable fun)) - (let ((qlqs-cmucl:*gc-verbose* nil)) - (call-next-method))) - - -;;; -;;; Low-level networking implementations -;;; - -(in-package #:qlqs-network) - -(definterface host-address (host) - (:implementation t - host) - (:implementation mkcl - (qlqs-mkcl:host-ent-address (qlqs-mkcl:get-host-by-name host))) - (:implementation sbcl - (qlqs-sbcl:host-ent-address (qlqs-sbcl:get-host-by-name host)))) - -(definterface open-connection (host port) - (:implementation t - (declare (ignorable host port)) - (error "Sorry, quicklisp in implementation ~S is not supported yet." - (lisp-implementation-type))) - (:implementation allegro - (qlqs-allegro:make-socket :remote-host host - :remote-port port)) - (:implementation abcl - (let ((socket (qlqs-abcl:make-socket host port))) - (qlqs-abcl:get-socket-stream socket :element-type '(unsigned-byte 8)))) - (:implementation ccl - (qlqs-ccl:make-socket :remote-host host - :remote-port port)) - (:implementation clasp - (let* ((endpoint (qlqs-clasp:host-ent-address - (qlqs-clasp:get-host-by-name host))) - (socket (make-instance 'qlqs-clasp:inet-socket - :protocol :tcp - :type :stream))) - (qlqs-clasp:socket-connect socket endpoint port) - (qlqs-clasp:socket-make-stream socket - :element-type '(unsigned-byte 8) - :input t - :output t - :buffering :full))) - (:implementation clisp - (qlqs-clisp:socket-connect port host :element-type '(unsigned-byte 8))) - (:implementation cmucl - (let ((fd (qlqs-cmucl:connect-to-inet-socket host port))) - (qlqs-cmucl:make-fd-stream fd - :element-type '(unsigned-byte 8) - :binary-stream-p t - :input t - :output t))) - (:implementation scl - (let ((fd (qlqs-scl:connect-to-inet-socket host port))) - (qlqs-scl:make-fd-stream fd - :element-type '(unsigned-byte 8) - :input t - :output t))) - (:implementation ecl - (let* ((endpoint (qlqs-ecl:host-ent-address - (qlqs-ecl:get-host-by-name host))) - (socket (make-instance 'qlqs-ecl:inet-socket - :protocol :tcp - :type :stream))) - (qlqs-ecl:socket-connect socket endpoint port) - (qlqs-ecl:socket-make-stream socket - :element-type '(unsigned-byte 8) - :input t - :output t - :buffering :full))) - (:implementation lispworks - (qlqs-lispworks:open-tcp-stream host port - :direction :io - :errorp t - :read-timeout nil - :element-type '(unsigned-byte 8) - :timeout 5)) - (:implementation mkcl - (let* ((endpoint (qlqs-mkcl:host-ent-address - (qlqs-mkcl:get-host-by-name host))) - (socket (make-instance 'qlqs-mkcl:inet-socket - :protocol :tcp - :type :stream))) - (qlqs-mkcl:socket-connect socket endpoint port) - (qlqs-mkcl:socket-make-stream socket - :element-type '(unsigned-byte 8) - :input t - :output t - :buffering :full))) - (:implementation sbcl - (let* ((endpoint (qlqs-sbcl:host-ent-address - (qlqs-sbcl:get-host-by-name host))) - (socket (make-instance 'qlqs-sbcl:inet-socket - :protocol :tcp - :type :stream))) - (qlqs-sbcl:socket-connect socket endpoint port) - (qlqs-sbcl:socket-make-stream socket - :element-type '(unsigned-byte 8) - :input t - :output t - :buffering :full)))) - -(definterface read-octets (buffer connection) - (:implementation t - (read-sequence buffer connection)) - (:implementation allegro - (qlqs-allegro:read-vector buffer connection)) - (:implementation clisp - (qlqs-clisp:read-byte-sequence buffer connection - :no-hang nil - :interactive t))) - -(definterface write-octets (buffer connection) - (:implementation t - (write-sequence buffer connection) - (finish-output connection))) - -(definterface close-connection (connection) - (:implementation t - (ignore-errors (close connection)))) - -(definterface call-with-connection (host port fun) - (:implementation t - (let (connection) - (unwind-protect - (progn - (setf connection (open-connection host port)) - (funcall fun connection)) - (when connection - (close connection)))))) - -(defmacro with-connection ((connection host port) &body body) - `(call-with-connection ,host ,port (lambda (,connection) ,@body))) - - -;;; -;;; A text progress bar -;;; - -(in-package #:qlqs-progress) - -(defclass progress-bar () - ((start-time - :initarg :start-time - :accessor start-time) - (end-time - :initarg :end-time - :accessor end-time) - (progress-character - :initarg :progress-character - :accessor progress-character) - (character-count - :initarg :character-count - :accessor character-count - :documentation "How many characters wide is the progress bar?") - (characters-so-far - :initarg :characters-so-far - :accessor characters-so-far) - (update-interval - :initarg :update-interval - :accessor update-interval - :documentation "Update the progress bar display after this many - internal-time units.") - (last-update-time - :initarg :last-update-time - :accessor last-update-time - :documentation "The display was last updated at this time.") - (total - :initarg :total - :accessor total - :documentation "The total number of units tracked by this progress bar.") - (progress - :initarg :progress - :accessor progress - :documentation "How far in the progress are we?") - (pending - :initarg :pending - :accessor pending - :documentation "How many raw units should be tracked in the next - display update?")) - (:default-initargs - :progress-character #\= - :character-count 50 - :characters-so-far 0 - :update-interval (floor internal-time-units-per-second 4) - :last-update-time 0 - :total 0 - :progress 0 - :pending 0)) - -(defgeneric start-display (progress-bar)) -(defgeneric update-progress (progress-bar unit-count)) -(defgeneric update-display (progress-bar)) -(defgeneric finish-display (progress-bar)) -(defgeneric elapsed-time (progress-bar)) -(defgeneric units-per-second (progress-bar)) - -(defmethod start-display (progress-bar) - (setf (last-update-time progress-bar) (get-internal-real-time)) - (setf (start-time progress-bar) (get-internal-real-time)) - (fresh-line) - (finish-output)) - -(defmethod update-display (progress-bar) - (incf (progress progress-bar) (pending progress-bar)) - (setf (pending progress-bar) 0) - (setf (last-update-time progress-bar) (get-internal-real-time)) - (let* ((showable (floor (character-count progress-bar) - (/ (total progress-bar) (progress progress-bar)))) - (needed (- showable (characters-so-far progress-bar)))) - (setf (characters-so-far progress-bar) showable) - (dotimes (i needed) - (write-char (progress-character progress-bar))) - (finish-output))) - -(defmethod update-progress (progress-bar unit-count) - (incf (pending progress-bar) unit-count) - (let ((now (get-internal-real-time))) - (when (< (update-interval progress-bar) - (- now (last-update-time progress-bar))) - (update-display progress-bar)))) - -(defmethod finish-display (progress-bar) - (update-display progress-bar) - (setf (end-time progress-bar) (get-internal-real-time)) - (terpri) - (format t "~:D bytes in ~$ seconds (~$KB/sec)" - (total progress-bar) - (elapsed-time progress-bar) - (/ (units-per-second progress-bar) 1024)) - (finish-output)) - -(defmethod elapsed-time (progress-bar) - (/ (- (end-time progress-bar) (start-time progress-bar)) - internal-time-units-per-second)) - -(defmethod units-per-second (progress-bar) - (if (plusp (elapsed-time progress-bar)) - (/ (total progress-bar) (elapsed-time progress-bar)) - 0)) - -(defun kb/sec (progress-bar) - (/ (units-per-second progress-bar) 1024)) - - - -(defparameter *uncertain-progress-chars* "?") - -(defclass uncertain-size-progress-bar (progress-bar) - ((progress-char-index - :initarg :progress-char-index - :accessor progress-char-index) - (units-per-char - :initarg :units-per-char - :accessor units-per-char)) - (:default-initargs - :total 0 - :progress-char-index 0 - :units-per-char (floor (expt 1024 2) 50))) - -(defmethod update-progress :after ((progress-bar uncertain-size-progress-bar) - unit-count) - (incf (total progress-bar) unit-count)) - -(defmethod progress-character ((progress-bar uncertain-size-progress-bar)) - (let ((index (progress-char-index progress-bar))) - (prog1 - (char *uncertain-progress-chars* index) - (setf (progress-char-index progress-bar) - (mod (1+ index) (length *uncertain-progress-chars*)))))) - -(defmethod update-display ((progress-bar uncertain-size-progress-bar)) - (setf (last-update-time progress-bar) (get-internal-real-time)) - (multiple-value-bind (chars pend) - (floor (pending progress-bar) (units-per-char progress-bar)) - (setf (pending progress-bar) pend) - (dotimes (i chars) - (write-char (progress-character progress-bar)) - (incf (characters-so-far progress-bar)) - (when (<= (character-count progress-bar) - (characters-so-far progress-bar)) - (terpri) - (setf (characters-so-far progress-bar) 0) - (finish-output))) - (finish-output))) - -(defun make-progress-bar (total) - (if (or (not total) (zerop total)) - (make-instance 'uncertain-size-progress-bar) - (make-instance 'progress-bar :total total))) - -;;; -;;; A simple HTTP client -;;; - -(in-package #:qlqs-http) - -;;; Octet data - -(deftype octet () - '(unsigned-byte 8)) - -(defun make-octet-vector (size) - (make-array size :element-type 'octet - :initial-element 0)) - -(defun octet-vector (&rest octets) - (make-array (length octets) :element-type 'octet - :initial-contents octets)) - -;;; ASCII characters as integers - -(defun acode (char) - (cond ((eql char :cr) - 13) - ((eql char :lf) - 10) - (t - (let ((code (char-code char))) - (if (<= 0 code 127) - code - (error "Character ~S is not in the ASCII character set" - char)))))) - -(defvar *whitespace* - (list (acode #\Space) (acode #\Tab) (acode :cr) (acode :lf))) - -(defun whitep (code) - (member code *whitespace*)) - -(defun ascii-vector (string) - (let ((vector (make-octet-vector (length string)))) - (loop for char across string - for code = (char-code char) - for i from 0 - if (< 127 code) do - (error "Invalid character for ASCII -- ~A" char) - else - do (setf (aref vector i) code)) - vector)) - -(defun ascii-subseq (vector start end) - "Return a subseq of octet-specialized VECTOR as a string." - (let ((string (make-string (- end start)))) - (loop for i from 0 - for j from start below end - do (setf (char string i) (code-char (aref vector j)))) - string)) - -(defun ascii-downcase (code) - (if (<= 65 code 90) - (+ code 32) - code)) - -(defun ascii-equal (a b) - (eql (ascii-downcase a) (ascii-downcase b))) - -(defmacro acase (value &body cases) - (flet ((convert-case-keys (keys) - (mapcar (lambda (key) - (etypecase key - (integer key) - (character (char-code key)) - (symbol - (ecase key - (:cr 13) - (:lf 10) - ((t) t))))) - (if (consp keys) keys (list keys))))) - `(case ,value - ,@(mapcar (lambda (case) - (destructuring-bind (keys &rest body) - case - `(,(if (eql keys t) - t - (convert-case-keys keys)) - ,@body))) - cases)))) - -;;; Pattern matching (for finding headers) - -(defclass matcher () - ((pattern - :initarg :pattern - :reader pattern) - (pos - :initform 0 - :accessor match-pos) - (matchedp - :initform nil - :accessor matchedp))) - -(defun reset-match (matcher) - (setf (match-pos matcher) 0 - (matchedp matcher) nil)) - -(define-condition match-failure (error) ()) - -(defun match (matcher input &key (start 0) end error) - (let ((i start) - (end (or end (length input))) - (match-end (length (pattern matcher)))) - (with-slots (pattern pos) - matcher - (loop - (cond ((= pos match-end) - (let ((match-start (- i pos))) - (setf pos 0) - (setf (matchedp matcher) t) - (return (values match-start (+ match-start match-end))))) - ((= i end) - (return nil)) - ((= (aref pattern pos) - (aref input i)) - (incf i) - (incf pos)) - (t - (if error - (error 'match-failure) - (if (zerop pos) - (incf i) - (setf pos 0))))))))) - -(defun ascii-matcher (string) - (make-instance 'matcher - :pattern (ascii-vector string))) - -(defun octet-matcher (&rest octets) - (make-instance 'matcher - :pattern (apply 'octet-vector octets))) - -(defun acode-matcher (&rest codes) - (make-instance 'matcher - :pattern (make-array (length codes) - :element-type 'octet - :initial-contents - (mapcar 'acode codes)))) - - -;;; "Connection Buffers" are a kind of callback-driven, -;;; pattern-matching chunky stream. Callbacks can be called for a -;;; certain number of octets or until one or more patterns are seen in -;;; the input. cbufs automatically refill themselves from a -;;; connection as needed. - -(defvar *cbuf-buffer-size* 8192) - -(define-condition end-of-data (error) ()) - -(defclass cbuf () - ((data - :initarg :data - :accessor data) - (connection - :initarg :connection - :accessor connection) - (start - :initarg :start - :accessor start) - (end - :initarg :end - :accessor end) - (eofp - :initarg :eofp - :accessor eofp)) - (:default-initargs - :data (make-octet-vector *cbuf-buffer-size*) - :connection nil - :start 0 - :end 0 - :eofp nil) - (:documentation "A CBUF is a connection buffer that keeps track of - incoming data from a connection. Several functions make it easy to - treat a CBUF as a kind of chunky, callback-driven stream.")) - -(define-condition cbuf-progress () - ((size - :initarg :size - :accessor cbuf-progress-size - :initform 0))) - -(defun call-processor (fun cbuf start end) - (signal 'cbuf-progress :size (- end start)) - (funcall fun (data cbuf) start end)) - -(defun make-cbuf (connection) - (make-instance 'cbuf :connection connection)) - -(defun make-stream-writer (stream) - "Create a callback for writing data to STREAM." - (lambda (data start end) - (write-sequence data stream :start start :end end))) - -(defgeneric size (cbuf) - (:method ((cbuf cbuf)) - (- (end cbuf) (start cbuf)))) - -(defgeneric emptyp (cbuf) - (:method ((cbuf cbuf)) - (zerop (size cbuf)))) - -(defgeneric refill (cbuf) - (:method ((cbuf cbuf)) - (when (eofp cbuf) - (error 'end-of-data)) - (setf (start cbuf) 0) - (setf (end cbuf) - (read-octets (data cbuf) - (connection cbuf))) - (cond ((emptyp cbuf) - (setf (eofp cbuf) t) - (error 'end-of-data)) - (t (size cbuf))))) - -(defun process-all (fun cbuf) - (unless (emptyp cbuf) - (call-processor fun cbuf (start cbuf) (end cbuf)))) - -(defun multi-cmatch (matchers cbuf) - (let (start end) - (dolist (matcher matchers (values start end)) - (multiple-value-bind (s e) - (match matcher (data cbuf) - :start (start cbuf) - :end (end cbuf)) - (when (and s (or (null start) (< s start))) - (setf start s - end e)))))) - -(defun cmatch (matcher cbuf) - (if (consp matcher) - (multi-cmatch matcher cbuf) - (match matcher (data cbuf) :start (start cbuf) :end (end cbuf)))) - -(defun call-until-end (fun cbuf) - (handler-case - (loop - (process-all fun cbuf) - (refill cbuf)) - (end-of-data () - (return-from call-until-end)))) - -(defun show-cbuf (context cbuf) - (format t "cbuf: ~A ~D - ~D~%" context (start cbuf) (end cbuf))) - -(defun call-for-n-octets (n fun cbuf) - (let ((remaining n)) - (loop - (when (<= remaining (size cbuf)) - (let ((end (+ (start cbuf) remaining))) - (call-processor fun cbuf (start cbuf) end) - (setf (start cbuf) end) - (return))) - (process-all fun cbuf) - (decf remaining (size cbuf)) - (refill cbuf)))) - -(defun call-until-matching (matcher fun cbuf) - (loop - (multiple-value-bind (start end) - (cmatch matcher cbuf) - (when start - (call-processor fun cbuf (start cbuf) end) - (setf (start cbuf) end) - (return))) - (process-all fun cbuf) - (refill cbuf))) - -(defun ignore-data (data start end) - (declare (ignore data start end))) - -(defun skip-until-matching (matcher cbuf) - (call-until-matching matcher 'ignore-data cbuf)) - - -;;; Creating HTTP requests as octet buffers - -(defclass octet-sink () - ((storage - :initarg :storage - :accessor storage)) - (:default-initargs - :storage (make-array 1024 :element-type 'octet - :fill-pointer 0 - :adjustable t)) - (:documentation "A simple stream-like target for collecting - octets.")) - -(defun add-octet (octet sink) - (vector-push-extend octet (storage sink))) - -(defun add-octets (octets sink &key (start 0) end) - (setf end (or end (length octets))) - (loop for i from start below end - do (add-octet (aref octets i) sink))) - -(defun add-string (string sink) - (loop for char across string - for code = (char-code char) - do (add-octet code sink))) - -(defun add-strings (sink &rest strings) - (mapc (lambda (string) (add-string string sink)) strings)) - -(defun add-newline (sink) - (add-octet 13 sink) - (add-octet 10 sink)) - -(defun sink-buffer (sink) - (subseq (storage sink) 0)) - -(defvar *proxy-url* nil) - -(defun full-proxy-path (host port path) - (format nil "~:[http~;https~]://~A~:[:~D~;~*~]~A" - (= port 443) - host - (or (= port 80) - (= port 443)) - port - path)) - -(defun make-request-buffer (host port path &key (method "GET")) - (setf method (string method)) - (when *proxy-url* - (setf path (full-proxy-path host port path))) - (let ((sink (make-instance 'octet-sink))) - (flet ((add-line (&rest strings) - (apply #'add-strings sink strings) - (add-newline sink))) - (add-line method " " path " HTTP/1.1") - (add-line "Host: " host (if (= port 80) "" - (format nil ":~D" port))) - (add-line "Connection: close") - ;; FIXME: get this version string from somewhere else. - (add-line "User-Agent: quicklisp-bootstrap/" - qlqs-info:*version*) - (add-newline sink) - (sink-buffer sink)))) - -(defun sink-until-matching (matcher cbuf) - (let ((sink (make-instance 'octet-sink))) - (call-until-matching - matcher - (lambda (buffer start end) - (add-octets buffer sink :start start :end end)) - cbuf) - (sink-buffer sink))) - - -;;; HTTP headers - -(defclass header () - ((data - :initarg :data - :accessor data) - (status - :initarg :status - :accessor status) - (name-starts - :initarg :name-starts - :accessor name-starts) - (name-ends - :initarg :name-ends - :accessor name-ends) - (value-starts - :initarg :value-starts - :accessor value-starts) - (value-ends - :initarg :value-ends - :accessor value-ends))) - -(defmethod print-object ((header header) stream) - (print-unreadable-object (header stream :type t) - (prin1 (status header) stream))) - -(defun matches-at (pattern target pos) - (= (mismatch pattern target :start2 pos) (length pattern))) - -(defun header-value-indexes (field-name header) - (loop with data = (data header) - with pattern = (ascii-vector (string-downcase field-name)) - for start across (name-starts header) - for i from 0 - when (matches-at pattern data start) - return (values (aref (value-starts header) i) - (aref (value-ends header) i)))) - -(defun ascii-header-value (field-name header) - (multiple-value-bind (start end) - (header-value-indexes field-name header) - (when start - (ascii-subseq (data header) start end)))) - -(defun all-field-names (header) - (map 'list - (lambda (start end) - (ascii-subseq (data header) start end)) - (name-starts header) - (name-ends header))) - -(defun headers-alist (header) - (mapcar (lambda (name) - (cons name (ascii-header-value name header))) - (all-field-names header))) - -(defmethod describe-object :after ((header header) stream) - (format stream "~&Decoded headers:~% ~S~%" (headers-alist header))) - -(defun content-length (header) - (let ((field-value (ascii-header-value "content-length" header))) - (when field-value - (let ((value (ignore-errors (parse-integer field-value)))) - (or value - (error "Content-Length header field value is not a number -- ~A" - field-value)))))) - -(defun chunkedp (header) - (string= (ascii-header-value "transfer-encoding" header) "chunked")) - -(defun location (header) - (ascii-header-value "location" header)) - -(defun status-code (vector) - (let* ((space (position (acode #\Space) vector)) - (c1 (- (aref vector (incf space)) 48)) - (c2 (- (aref vector (incf space)) 48)) - (c3 (- (aref vector (incf space)) 48))) - (+ (* c1 100) - (* c2 10) - (* c3 1)))) - -(defun force-downcase-field-names (header) - (loop with data = (data header) - for start across (name-starts header) - for end across (name-ends header) - do (loop for i from start below end - for code = (aref data i) - do (setf (aref data i) (ascii-downcase code))))) - -(defun skip-white-forward (pos vector) - (position-if-not 'whitep vector :start pos)) - -(defun skip-white-backward (pos vector) - (let ((nonwhite (position-if-not 'whitep vector :end pos :from-end t))) - (if nonwhite - (1+ nonwhite) - pos))) - -(defun contract-field-value-indexes (header) - "Header field values exclude leading and trailing whitespace; adjust -the indexes in the header accordingly." - (loop with starts = (value-starts header) - with ends = (value-ends header) - with data = (data header) - for i from 0 - for start across starts - for end across ends - do - (setf (aref starts i) (skip-white-forward start data)) - (setf (aref ends i) (skip-white-backward end data)))) - -(defun next-line-pos (vector) - (let ((pos 0)) - (labels ((finish (&optional (i pos)) - (return-from next-line-pos i)) - (after-cr (code) - (acase code - (:lf (finish pos)) - (t (finish (1- pos))))) - (pending (code) - (acase code - (:cr #'after-cr) - (:lf (finish pos)) - (t #'pending)))) - (let ((state #'pending)) - (loop - (setf state (funcall state (aref vector pos))) - (incf pos)))))) - -(defun make-hvector () - (make-array 16 :fill-pointer 0 :adjustable t)) - -(defun process-header (vector) - "Create a HEADER instance from the octet data in VECTOR." - (let* ((name-starts (make-hvector)) - (name-ends (make-hvector)) - (value-starts (make-hvector)) - (value-ends (make-hvector)) - (header (make-instance 'header - :data vector - :status 999 - :name-starts name-starts - :name-ends name-ends - :value-starts value-starts - :value-ends value-ends)) - (mark nil) - (pos (next-line-pos vector))) - (unless pos - (error "Unable to process HTTP header")) - (setf (status header) (status-code vector)) - (labels ((save (value vector) - (vector-push-extend value vector)) - (mark () - (setf mark pos)) - (clear-mark () - (setf mark nil)) - (finish () - (if mark - (save mark value-ends) - (save pos value-ends)) - (force-downcase-field-names header) - (contract-field-value-indexes header) - (return-from process-header header)) - (in-new-line (code) - (acase code - ((#\Tab #\Space) (setf mark nil) #'in-value) - (t - (when mark - (save mark value-ends)) - (clear-mark) - (save pos name-starts) - (in-name code)))) - (after-cr (code) - (acase code - (:lf #'in-new-line) - (t (in-new-line code)))) - (pending-value (code) - (acase code - ((#\Tab #\Space) #'pending-value) - (:cr #'after-cr) - (:lf #'in-new-line) - (t (save pos value-starts) #'in-value))) - (in-name (code) - (acase code - (#\: - (save pos name-ends) - (save (1+ pos) value-starts) - #'in-value) - ((:cr :lf) - (finish)) - ((#\Tab #\Space) - (error "Unexpected whitespace in header field name")) - (t - (unless (<= 0 code 127) - (error "Unexpected non-ASCII header field name")) - #'in-name))) - (in-value (code) - (acase code - (:lf (mark) #'in-new-line) - (:cr (mark) #'after-cr) - (t #'in-value)))) - (let ((state #'in-new-line)) - (loop - (incf pos) - (when (<= (length vector) pos) - (error "No header found in response")) - (setf state (funcall state (aref vector pos)))))))) - - -;;; HTTP URL parsing - -(defclass url () - ((hostname - :initarg :hostname - :accessor hostname - :initform nil) - (port - :initarg :port - :accessor port - :initform 80) - (path - :initarg :path - :accessor path - :initform "/"))) - -(defun parse-urlstring (urlstring) - (setf urlstring (string-trim " " urlstring)) - (let* ((pos (mismatch urlstring "http://" :test 'char-equal)) - (mark pos) - (url (make-instance 'url))) - (labels ((save () - (subseq urlstring mark pos)) - (mark () - (setf mark pos)) - (finish () - (return-from parse-urlstring url)) - (hostname-char-p (char) - (position char "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_." - :test 'char-equal)) - (at-start (char) - (case char - (#\/ - (setf (port url) nil) - (mark) - #'in-path) - (t - #'in-host))) - (in-host (char) - (case char - ((#\/ :end) - (setf (hostname url) (save)) - (mark) - #'in-path) - (#\: - (setf (hostname url) (save)) - (mark) - #'in-port) - (t - (unless (hostname-char-p char) - (error "~S is not a valid URL" urlstring)) - #'in-host))) - (in-port (char) - (case char - ((#\/ :end) - (setf (port url) - (parse-integer urlstring - :start (1+ mark) - :end pos)) - (mark) - #'in-path) - (t - (unless (digit-char-p char) - (error "Bad port in URL ~S" urlstring)) - #'in-port))) - (in-path (char) - (case char - ((#\# :end) - (setf (path url) (save)) - (finish))) - #'in-path)) - (let ((state #'at-start)) - (loop - (when (<= (length urlstring) pos) - (funcall state :end) - (finish)) - (setf state (funcall state (aref urlstring pos))) - (incf pos)))))) - -(defun url (thing) - (if (stringp thing) - (parse-urlstring thing) - thing)) - -(defgeneric request-buffer (method url) - (:method (method url) - (setf url (url url)) - (make-request-buffer (hostname url) (port url) (path url) - :method method))) - -(defun urlstring (url) - (format nil "~@[http://~A~]~@[:~D~]~A" - (hostname url) - (and (/= 80 (port url)) (port url)) - (path url))) - -(defmethod print-object ((url url) stream) - (print-unreadable-object (url stream :type t) - (prin1 (urlstring url) stream))) - -(defun merge-urls (url1 url2) - (setf url1 (url url1)) - (setf url2 (url url2)) - (make-instance 'url - :hostname (or (hostname url1) - (hostname url2)) - :port (or (port url1) - (port url2)) - :path (or (path url1) - (path url2)))) - - -;;; Requesting an URL and saving it to a file - -(defparameter *maximum-redirects* 10) -(defvar *default-url-defaults* (url "http://src.quicklisp.org/")) - -(defun read-http-header (cbuf) - (let ((header-data (sink-until-matching (list (acode-matcher :lf :lf) - (acode-matcher :cr :cr) - (acode-matcher :cr :lf :cr :lf)) - cbuf))) - (process-header header-data))) - -(defun read-chunk-header (cbuf) - (let* ((header-data (sink-until-matching (acode-matcher :cr :lf) cbuf)) - (end (or (position (acode :cr) header-data) - (position (acode #\;) header-data)))) - (values (parse-integer (ascii-subseq header-data 0 end) :radix 16)))) - -(defun save-chunk-response (stream cbuf) - "For a chunked response, read all chunks and write them to STREAM." - (let ((fun (make-stream-writer stream)) - (matcher (acode-matcher :cr :lf))) - (loop - (let ((chunk-size (read-chunk-header cbuf))) - (when (zerop chunk-size) - (return)) - (call-for-n-octets chunk-size fun cbuf) - (skip-until-matching matcher cbuf))))) - -(defun save-response (file header cbuf) - (with-open-file (stream file - :direction :output - :if-exists :supersede - :element-type 'octet) - (let ((content-length (content-length header))) - (cond ((chunkedp header) - (save-chunk-response stream cbuf)) - (content-length - (call-for-n-octets content-length - (make-stream-writer stream) - cbuf)) - (t - (call-until-end (make-stream-writer stream) cbuf)))))) - -(defun call-with-progress-bar (size fun) - (let ((progress-bar (make-progress-bar size))) - (start-display progress-bar) - (flet ((update (condition) - (update-progress progress-bar - (cbuf-progress-size condition)))) - (handler-bind ((cbuf-progress #'update)) - (funcall fun))) - (finish-display progress-bar))) - -(defun fetch (url file &key (follow-redirects t) quietly - (maximum-redirects *maximum-redirects*)) - "Request URL and write the body of the response to FILE." - (setf url (merge-urls url *default-url-defaults*)) - (setf file (merge-pathnames file)) - (let ((redirect-count 0) - (original-url url) - (connect-url (or (url *proxy-url*) url)) - (stream (if quietly - (make-broadcast-stream) - *trace-output*))) - (loop - (when (<= maximum-redirects redirect-count) - (error "Too many redirects for ~A" original-url)) - (with-connection (connection (hostname connect-url) (port connect-url)) - (let ((cbuf (make-instance 'cbuf :connection connection)) - (request (request-buffer "GET" url))) - (write-octets request connection) - (let ((header (read-http-header cbuf))) - (loop while (= (status header) 100) - do (setf header (read-http-header cbuf))) - (cond ((= (status header) 200) - (let ((size (content-length header))) - (format stream "~&; Fetching ~A~%" url) - (if (and (numberp size) - (plusp size)) - (format stream "; ~$KB~%" (/ size 1024)) - (format stream "; Unknown size~%")) - (if quietly - (save-response file header cbuf) - (call-with-progress-bar (content-length header) - (lambda () - (save-response file header cbuf)))))) - ((not (<= 300 (status header) 399)) - (error "Unexpected status for ~A: ~A" - url (status header)))) - (if (and follow-redirects (<= 300 (status header) 399)) - (let ((new-urlstring (ascii-header-value "location" header))) - (when (not new-urlstring) - (error "Redirect code ~D received, but no Location: header" - (status header))) - (incf redirect-count) - (setf url (merge-urls new-urlstring - url)) - (format stream "~&; Redirecting to ~A~%" url)) - (return (values header (and file (probe-file file))))))))))) - - -;;; A primitive tar unpacker - -(in-package #:qlqs-minitar) - -(defun make-block-buffer () - (make-array 512 :element-type '(unsigned-byte 8) :initial-element 0)) - -(defun skip-n-blocks (n stream) - (let ((block (make-block-buffer))) - (dotimes (i n) - (read-sequence block stream)))) - -(defun ascii-subseq (vector start end) - (let ((string (make-string (- end start)))) - (loop for i from 0 - for j from start below end - do (setf (char string i) (code-char (aref vector j)))) - string)) - -(defun block-asciiz-string (block start length) - (let* ((end (+ start length)) - (eos (or (position 0 block :start start :end end) - end))) - (ascii-subseq block start eos))) - -(defun prefix (header) - (when (plusp (aref header 345)) - (block-asciiz-string header 345 155))) - -(defun name (header) - (block-asciiz-string header 0 100)) - -(defun payload-size (header) - (values (parse-integer (block-asciiz-string header 124 12) :radix 8))) - -(defun nth-block (n file) - (with-open-file (stream file :element-type '(unsigned-byte 8)) - (let ((block (make-block-buffer))) - (skip-n-blocks (1- n) stream) - (read-sequence block stream) - block))) - -(defun payload-type (code) - (case code - (0 :file) - (48 :file) - (53 :directory) - (t :unsupported))) - -(defun full-path (header) - (let ((prefix (prefix header)) - (name (name header))) - (if prefix - (format nil "~A/~A" prefix name) - name))) - -(defun save-file (file size stream) - (multiple-value-bind (full-blocks partial) - (truncate size 512) - (ensure-directories-exist file) - (with-open-file (outstream file - :direction :output - :if-exists :supersede - :element-type '(unsigned-byte 8)) - (let ((block (make-block-buffer))) - (dotimes (i full-blocks) - (read-sequence block stream) - (write-sequence block outstream)) - (when (plusp partial) - (read-sequence block stream) - (write-sequence block outstream :end partial)))))) - -(defun unpack-tarball (tarfile &key (directory *default-pathname-defaults*)) - (let ((block (make-block-buffer))) - (with-open-file (stream tarfile :element-type '(unsigned-byte 8)) - (loop - (let ((size (read-sequence block stream))) - (when (zerop size) - (return)) - (unless (= size 512) - (error "Bad size on tarfile")) - (when (every #'zerop block) - (return)) - (let* ((payload-code (aref block 156)) - (payload-type (payload-type payload-code)) - (tar-path (full-path block)) - (full-path (merge-pathnames tar-path directory)) - (payload-size (payload-size block))) - (case payload-type - (:file - (save-file full-path payload-size stream)) - (:directory - (ensure-directories-exist full-path)) - (t - (warn "Unknown tar block payload code -- ~D" payload-code) - (skip-n-blocks (ceiling (payload-size block) 512) stream))))))))) - -(defun contents (tarfile) - (let ((block (make-block-buffer)) - (result '())) - (with-open-file (stream tarfile :element-type '(unsigned-byte 8)) - (loop - (let ((size (read-sequence block stream))) - (when (zerop size) - (return (nreverse result))) - (unless (= size 512) - (error "Bad size on tarfile")) - (when (every #'zerop block) - (return (nreverse result))) - (let* ((payload-type (payload-type (aref block 156))) - (tar-path (full-path block)) - (payload-size (payload-size block))) - (skip-n-blocks (ceiling payload-size 512) stream) - (case payload-type - (:file - (push tar-path result)) - (:directory - (push tar-path result))))))))) - - -;;; -;;; The actual bootstrapping work -;;; - -(in-package #:quicklisp-quickstart) - -(defvar *home* - (merge-pathnames (make-pathname :directory '(:relative "quicklisp")) - (user-homedir-pathname))) - -(defun qmerge (pathname) - (merge-pathnames pathname *home*)) - -(defun renaming-fetch (url file) - (let ((tmpfile (qmerge "tmp/fetch.dat"))) - (fetch url tmpfile) - (rename-file tmpfile file))) - -(defvar *quickstart-parameters* nil - "This plist is populated with parameters that may carry over to the - initial configuration of the client, e.g. :proxy-url - or :initial-dist-url") - -(defvar *quicklisp-hostname* "beta.quicklisp.org") - -(defvar *client-info-url* - (format nil "http://~A/client/quicklisp.sexp" - *quicklisp-hostname*)) - -(defclass client-info () - ((setup-url - :reader setup-url - :initarg :setup-url) - (asdf-url - :reader asdf-url - :initarg :asdf-url) - (client-tar-url - :reader client-tar-url - :initarg :client-tar-url) - (version - :reader version - :initarg :version) - (plist - :reader plist - :initarg :plist) - (source-file - :reader source-file - :initarg :source-file))) - -(defmethod print-object ((client-info client-info) stream) - (print-unreadable-object (client-info stream :type t) - (prin1 (version client-info) stream))) - -(defun safely-read (stream) - (let ((*read-eval* nil)) - (read stream))) - -(defun fetch-client-info-plist (url) - "Fetch and return the client info data at URL." - (let ((local-client-info-file (qmerge "tmp/client-info.sexp"))) - (ensure-directories-exist local-client-info-file) - (renaming-fetch url local-client-info-file) - (with-open-file (stream local-client-info-file) - (list* :source-file local-client-info-file - (safely-read stream))))) - -(defun fetch-client-info (url) - (let ((plist (fetch-client-info-plist url))) - (destructuring-bind (&key setup asdf client-tar version - source-file - &allow-other-keys) - plist - (unless (and setup asdf client-tar version) - (error "Invalid data from client info URL -- ~A" url)) - (make-instance 'client-info - :setup-url (getf setup :url) - :asdf-url (getf asdf :url) - :client-tar-url (getf client-tar :url) - :version version - :plist plist - :source-file source-file)))) - -(defun client-info-url-from-version (version) - (format nil "http://~A/client/~A/client-info.sexp" - *quicklisp-hostname* - version)) - -(defun distinfo-url-from-version (version) - (format nil "http://~A/dist/~A/distinfo.txt" - *quicklisp-hostname* - version)) - -(defvar *help-message* - (format nil "~&~% ==== quicklisp quickstart install help ====~%~% ~ - quicklisp-quickstart:install can take the following ~ - optional arguments:~%~% ~ - :path \"/path/to/installation/\"~%~% ~ - :proxy \"http://your.proxy:port/\"~%~% ~ - :client-url ~%~% ~ - :client-version ~%~% ~ - :dist-url ~%~% ~ - :dist-version ~%~%")) - -(defvar *after-load-message* - (format nil "~&~% ==== quicklisp quickstart ~A loaded ====~%~% ~ - To continue with installation, evaluate: (quicklisp-quickstart:install)~%~% ~ - For installation options, evaluate: (quicklisp-quickstart:help)~%~%" - qlqs-info:*version*)) - -(defvar *after-initial-setup-message* - (with-output-to-string (*standard-output*) - (format t "~&~% ==== quicklisp installed ====~%~%") - (format t " To load a system, use: (ql:quickload \"system-name\")~%~%") - (format t " To find systems, use: (ql:system-apropos \"term\")~%~%") - (format t " To load Quicklisp every time you start Lisp, use: (ql:add-to-init-file)~%~%") - (format t " For more information, see http://www.quicklisp.org/beta/~%~%"))) - -(defun initial-install (&key (client-url *client-info-url*) dist-url) - (setf *quickstart-parameters* - (list :proxy-url *proxy-url* - :initial-dist-url dist-url)) - (ensure-directories-exist (qmerge "tmp/")) - (let ((client-info (fetch-client-info client-url)) - (tmptar (qmerge "tmp/quicklisp.tar")) - (setup (qmerge "setup.lisp")) - (asdf (qmerge "asdf.lisp"))) - (renaming-fetch (client-tar-url client-info) tmptar) - (unpack-tarball tmptar :directory (qmerge "./")) - (renaming-fetch (setup-url client-info) setup) - (renaming-fetch (asdf-url client-info) asdf) - (rename-file (source-file client-info) (qmerge "client-info.sexp")) - (load setup :verbose nil :print nil) - (write-string *after-initial-setup-message*) - (finish-output))) - -(defun help () - (write-string *help-message*) - t) - -(defun non-empty-file-namestring (pathname) - (let ((string (file-namestring pathname))) - (unless (or (null string) - (equal string "")) - string))) - -(defun install (&key ((:path *home*) *home*) - ((:proxy *proxy-url*) *proxy-url*) - client-url - client-version - dist-url - dist-version) - (setf *home* (merge-pathnames *home* (truename *default-pathname-defaults*))) - (let ((name (non-empty-file-namestring *home*))) - (when name - (warn "Making ~A part of the install pathname directory" - name) - ;; This corrects a pathname like "/foo/bar" to "/foo/bar/" and - ;; "foo" to "foo/" - (setf *home* - (make-pathname :defaults *home* - :directory (append (pathname-directory *home*) - (list name)))))) - (let ((setup-file (qmerge "setup.lisp"))) - (when (probe-file setup-file) - (multiple-value-bind (result proceed) - (with-simple-restart (load-setup "Load ~S" setup-file) - (error "Quicklisp has already been installed. Load ~S instead." - setup-file)) - (declare (ignore result)) - (when proceed - (return-from install (load setup-file)))))) - (if (find-package '#:ql) - (progn - (write-line "!!! Quicklisp has already been set up. !!!") - (write-string *after-initial-setup-message*) - t) - (call-with-quiet-compilation - (lambda () - (let ((client-url (or client-url - (and client-version - (client-info-url-from-version client-version)) - *client-info-url*)) - ;; It's ok for dist-url to be nil; there's a default in - ;; the client - (dist-url (or dist-url - (and dist-version - (distinfo-url-from-version dist-version))))) - (initial-install :client-url client-url - :dist-url dist-url)))))) - -(write-string *after-load-message*) - -;;; End of quicklisp.lisp
-

Quickproject - create a Common Lisp project skeleton

- -

Quickproject is a library for creating a Common Lisp project - skeleton. It is available under a BSD-style license; - see LICENSE.txt for details. - -The latest version is 1.4.1, released on December 26th, 2019. - - -

Download - shortcut: http://www.xach.com/lisp/quickproject.tgz - -

Contents

- - - -

Overview

- -

Quickproject provides a quick way to make a Common Lisp - project. After creating a project, it extends the ASDF registry so - the project may be immediately loaded. - -

Examples

- -
-* (quickproject:make-project #p"~/src/myproject/" :depends-on '(drakma cxml))
-"myproject"
-
-* (asdf:load-system "myproject")
-load output
-
- -
-* (quickproject:make-project #p"~/src/websnarf/" :name "cl-websnarf")
-"cl-websnarf"
-
-* (directory #p"~/src/websnarf/*.*")
-(#p"~/src/websnarf/README.txt"
- #p"~/src/websnarf/package.lisp"
- #p"~/src/websnarf/cl-websnarf.asd"
- #p"~/src/websnarf/cl-websnarf.lisp")
-
- -

Dictionary

- -

The following symbols are exported from the quickproject - package. - -

- -
- make-project - - pathname &key - depends-on - author - include-copyright - license - name - template-directory - template-parameters - - => project-name -
- -
-

Create the skeleton of a Common Lisp project - in directory. If given, name is used as the - name of the project. Otherwise, the name is taken from the last - component in - the pathname-directory - of the pathname. For example, the last directory component - of #p"src/lisp/myproject/" is "myproject". -

The project skeleton consists of the following files: - -

    -
  • README.txt -
  • package.lisp — defines a package named after the project -
  • name.asd — defines an ASDF system named after - the project, with a :depends-on list as given in the - function call -
  • name.lisp -
- -

If provided, author and license are used - to initialize certain parts of the default files with extra - information. The default values are taken - from *AUTHOR* - and *LICENSE*, respectively. - -

If provided, the boolean argument to include-copyright - will determine whether copyright notices will be printed in the - header of each file. - -

If provided, each file in template-directory is - rewritten - with HTML-TEMPLATE - into the new directory. The options are as follows: - -

    -
  • The template markers are (#| and |#) -
  • No escaping is done in template values -
  • Template parameters are created by - appending template-parameters with the lists returned by - calling each entry - in *TEMPLATE-PARAMETER-FUNCTIONS* -
- -

After rewriting templates, each element - in *AFTER-MAKE-PROJECT-HOOKS* - is called. - -

After the project has been created, its pathname is added - to ASDF:*CENTRAL-REGISTRY*, so the project is immediately - loadable via ASDF:LOAD-SYSTEM. -

-
- - -
- -
- *author* -
- -
-

This string is used to initialize the :author argument - in the project system definition. The default initial value - is "Your Name <your.name@example.com>". -

-
- -
- -
- *include-copyright* -
- -
-

This variable is used to control whether a copyright notice (with - the author's name and the current year) should appear in the header - of each file.. -

-
- -
- -
- *license* -
- -
-

This string is used to initialize the :description - argument in the project system definition. The default initial - value is "Specify license here". -

-
- -
- -
- *template-directory* -
- -
-

If non-NIL, this variable should be bound to a pathname used as - the default value of template-directory - in MAKE-PROJECT. -

-
- -
- -
- default-template-parameters - - - => parameters -
- -
-

Return a plist with values for :name, :license, - and :author for the current project being created - via MAKE-PROJECT. This - function is in the default value - of *TEMPLATE-PARAMETER-FUNCTIONS*. - -

-
- - -
- -
- *template-parameter-functions* -
- -
-

A list of functions that are called to produce template - parameters when rewriting templates - in MAKE-PROJECT. Each - function is called with no arguments and should produce a list - of keyword/value pairs. The resulting lists are appended - together for use as template parameters - in HTML-TEMPLATE:FILL-AND-PRINT-TEMPLATE. - -

The default value is (default-template-parameters). -

-
- - -
- -
- *after-make-project-hooks* -
- -
-

A list of designators for functions to be called after a - project has been created. Each function should accept one required - argument, the pathname given - to MAKE-PROJECT, and two - keyword arguments, :name and :depends-on, which - correspond to the name of the project (whether explicitly supplied - to MAKE-PROJECT or derived from the pathname) and the - :depends-on argument, - respectively. *default-pathname-defaults* is bound to the - newly created project pathname when hooks are called. -

-
- - -

Feedback

- -

For questions or comments about Quickproject, please email me, Zach - Beane <xach@xach.com>. - -

h-U0 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 z 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 diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/let-plus-20191130-git.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/let-plus-20191130-git.tgz deleted file mode 100644 index a4518548e3af8f2e028760bd678f6e5e52118bd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11247 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�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 L7^e=y2?hoLVDvVS diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/local-time-20190710-git.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/local-time-20190710-git.tgz deleted file mode 100644 index 7c52f0191a42d74e4c3297a28d44938c6f868f47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282522 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